Daniel Keir Haywood created ISIS-2568:
-----------------------------------------

             Summary: Make sidebar resizable
                 Key: ISIS-2568
                 URL: https://issues.apache.org/jira/browse/ISIS-2568
             Project: Isis
          Issue Type: Improvement
          Components: Isis Viewer Wicket
            Reporter: Daniel Keir Haywood


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.3.4#803005)

Reply via email to