You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@isis.apache.org by "Andi Huber (Jira)" <ji...@apache.org> on 2022/04/29 07:02:00 UTC

[jira] [Updated] (ISIS-2568) [Wish] Make sidebar resizable

     [ https://issues.apache.org/jira/browse/ISIS-2568?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Andi Huber updated ISIS-2568:
-----------------------------
    Summary: [Wish] Make sidebar resizable  (was: Make sidebar resizable)

> [Wish] Make sidebar resizable
> -----------------------------
>
>                 Key: ISIS-2568
>                 URL: https://issues.apache.org/jira/browse/ISIS-2568
>             Project: Isis
>          Issue Type: Wish
>          Components: Isis Viewer Wicket
>            Reporter: Daniel Keir Haywood
>            Priority: Minor
>
> possible implementation:
> [https://codepen.io/Zodiase/pen/qmjyKL]
> HTML:
> {code:java}
> <div class="container">
>   <aside>
>     Aside
>     <hr />
>   </aside>
>   <div class="resize-handle--x" data-target="aside"></div>
>   <main>
>     Main
>     <hr />
>   </main>
> </div> {code}
> CSS:
> {code:java}
>  html {
>   height: 100%;
> }
> body {
>   box-sizing: border-box;
>   height: 100%;
>   margin: 0;
>   padding: 30px;
>   background-color: black;
> }.container {
>   height: 100%;
>   overflow: hidden;
>   background-color: white;
> }// Flexbox setup.
> .container {
>   display: -ms-flexbox;
>   display: -webkit-flex;
>   display: flex;
>   -webkit-flex-direction: row;
>   -ms-flex-direction: row;
>   flex-direction: row;
>   -webkit-flex-wrap: nowrap;
>   -ms-flex-wrap: nowrap;
>   flex-wrap: nowrap;
>   -webkit-justify-content: flex-start;
>   -ms-flex-pack: start;
>   justify-content: flex-start;
>   -webkit-align-content: stretch;
>   -ms-flex-line-pack: stretch;
>   align-content: stretch;
>   -webkit-align-items: stretch;
>   -ms-flex-align: stretch;
>   align-items: stretch;
>   
>   & > aside {
>     -webkit-order: 0;
>     -ms-flex-order: 0;
>     order: 0;
>     -webkit-flex: 0 0 auto;
>     -ms-flex: 0 0 auto;
>     flex: 0 0 auto;
>     -webkit-align-self: auto;
>     -ms-flex-item-align: auto;
>     align-self: auto;
>   }
>   
>   & > main {
>     -webkit-order: 0;
>     -ms-flex-order: 0;
>     order: 0;
>     -webkit-flex: 1 1 auto;
>     -ms-flex: 1 1 auto;
>     flex: 1 1 auto;
>     -webkit-align-self: auto;
>     -ms-flex-item-align: auto;
>     align-self: auto;
>   }
> }.container > aside,
> .container > main {
>   padding: 10px;
>   overflow: auto;
> }.resize-handle--x {
>   -webkit-flex: 0 0 auto;
>   -ms-flex: 0 0 auto;
>   flex: 0 0 auto;
>   
>   position: relative;
>   box-sizing: border-box;
>   width: 3px;
>   height: 100%;
>   border-left-width: 1px;
>   border-left-style: solid;
>   border-left-color: black;
>   border-right-width: 1px;
>   border-right-style: solid;
>   border-right-color: black;
>   cursor: ew-resize;
>   
>   -webkit-touch-callout: none;
>   -webkit-user-select: none;
>   -khtml-user-select: none;
>   -moz-user-select: none;
>   -ms-user-select: none;
>   user-select: none;
>   
>   @handleSize: 18px;
>   @handleThickness: 1px;
>   @handleDistance: 2px;
>   
>   &:before {
>     content: "";
>     position: absolute;
>     z-index: 1;
>     top: 50%;
>     right: 100%;
>     height: @handleSize;
>     width: @handleDistance;
>     margin-top: -@handleSize/2;
>     border-left-color: black;
>     border-left-width: @handleThickness;
>     border-left-style: solid;
>   }
>   &:after {
>     content: "";
>     position: absolute;
>     z-index: 1;
>     top: 50%;
>     left: 100%;
>     height: @handleSize;
>     width: @handleDistance;
>     margin-top: -@handleSize/2;
>     border-right-color: black;
>     border-right-width: @handleThickness;
>     border-right-style: solid;
>   }
> }
> {code}
> JS:
> {code:java}
>  const selectTarget = (fromElement, selector) => {
>   if (!(fromElement instanceof HTMLElement)) {
>     return null;
>   }  return fromElement.querySelector(selector);
> };const resizeData = {
>   tracking: false,
>   startWidth: null,
>   startCursorScreenX: null,
>   handleWidth: 10,
>   resizeTarget: null,
>   parentElement: null,
>   maxWidth: null,
> };$(document.body).on('mousedown', '.resize-handle--x', null, (event) => {
>   if (event.button !== 0) {
>     return;
>   }  event.preventDefault();
>   event.stopPropagation();  const handleElement = event.currentTarget;
>   
>   if (!handleElement.parentElement) {
>     console.error(new Error("Parent element not found."));
>     return;
>   }
>   
>   // Use the target selector on the handle to get the resize target.
>   const targetSelector = handleElement.getAttribute('data-target');
>   const targetElement = selectTarget(handleElement.parentElement, targetSelector);  if (!targetElement) {
>     console.error(new Error("Resize target element not found."));
>     return;
>   }
>   
>   resizeData.startWidth = $(targetElement).outerWidth();
>   resizeData.startCursorScreenX = event.screenX;
>   resizeData.resizeTarget = targetElement;
>   resizeData.parentElement = handleElement.parentElement;
>   resizeData.maxWidth = $(handleElement.parentElement).innerWidth() - resizeData.handleWidth;
>   resizeData.tracking = true;  console.log('tracking started');
> });$(window).on('mousemove', null, null, _.debounce((event) => {
>   if (resizeData.tracking) {
>     const cursorScreenXDelta = event.screenX - resizeData.startCursorScreenX;
>     const newWidth = Math.min(resizeData.startWidth + cursorScreenXDelta, resizeData.maxWidth);
>     
>     $(resizeData.resizeTarget).outerWidth(newWidth);
>   }
> }, 1));$(window).on('mouseup', null, null, (event) => {
>   if (resizeData.tracking) {
>     resizeData.tracking = false;    console.log('tracking stopped');
>   }
> });{code}
>  



--
This message was sent by Atlassian Jira
(v8.20.7#820007)