SidePanelButton.php.script.js 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. var DBG = 0;
  2. var DBG1 = 1;
  3. function p5UI__openSideBar(event, targetNode) {
  4. event.stopPropagation()
  5. event.preventDefault()
  6. if (!targetNode) targetNode = event.target;
  7. var name = targetNode.getAttribute('data-name');
  8. if (!name) throw "Missing 'name' in sidebar panel button";
  9. var idHtmlNode = 'p5__js-p5-side_panel-' + name;
  10. var panelNode = document.getElementById(idHtmlNode)
  11. if (!panelNode) throw "Missing content node";
  12. // if (panelNode.parentNode !== document.body)
  13. DBG1 && console.log("DBG:p5UI__openSideBar", {
  14. targetNode,
  15. name,
  16. parent: panelNode.parentNode,
  17. parentDiffBody: (panelNode.parentNode !== document.body),
  18. });
  19. if (panelNode.parentNode !== document.body) { // mv at the end of body if not
  20. document.body.appendChild(panelNode)
  21. }
  22. if (!panelNode._p5_onClick) panelNode._p5_onClick = function (event) {
  23. // DBG1 && console.log("DBG:_p5_onClick", { self: this })
  24. if (hasClass(event.target, 'p5-side_panel--js-close') || hasId(event.target, idHtmlNode)) {
  25. event.preventDefault();
  26. // removeClass(panelNode, 'p5-side_panel--is-visible');
  27. _closeSidePanel(panelNode); // TODO: check use this, not panelNode
  28. }
  29. }
  30. if (!panelNode._p5_onEsc) panelNode._p5_onEsc = function (event) {
  31. // DBG1 && console.log("DBG:_p5_onEsc", { self: this })
  32. if (event.keyCode == 27) {
  33. _closeSidePanel(panelNode); // TODO: check use this, not panelNode
  34. }
  35. }
  36. // p5-side_panel p5-side_panel--from-right js-p5-side_panel-main p5-side_panel--is-visible
  37. addClass(panelNode, 'p5-side_panel--from-right'); // TODO: from props: left | right
  38. if (hasClass(panelNode, 'p5-side_panel--is-visible')) {
  39. // removeClass(panelNode, 'p5-side_panel--is-visible');
  40. _closeSidePanel(panelNode);
  41. } else {
  42. setTimeout(function () {
  43. // addClass(panelNode, 'p5-side_panel--is-visible')
  44. _openSidePanel(panelNode)
  45. }, 10)
  46. }
  47. }
  48. function _openSidePanel(panelNode) {
  49. addClass(panelNode, 'p5-side_panel--is-visible');
  50. document.addEventListener('keyup', panelNode._p5_onEsc);
  51. panelNode.addEventListener('click', panelNode._p5_onClick);
  52. // fix content scrollTop
  53. var contentNode = panelNode.getElementsByClassName('p5-side_panel__content')
  54. if (contentNode && contentNode[0]) {
  55. contentNode[0].scrollTop = 0;
  56. }
  57. }
  58. function _closeSidePanel(panelNode) {
  59. removeClass(panelNode, 'p5-side_panel--is-visible');
  60. document.removeEventListener('keyup', panelNode._p5_onEsc)
  61. panelNode.removeEventListener('click', panelNode._p5_onClick);
  62. }
  63. function hasId(el, id) {
  64. return (id === el.getAttribute('id'));
  65. }
  66. //class manipulations - needed if classList is not supported
  67. //https://jaketrent.com/post/addremove-classes-raw-javascript/
  68. function hasClass(el, className) {
  69. if (el.classList) return el.classList.contains(className);
  70. else return !!el.className.match(new RegExp('(\\s|^)' + className + '(\\s|$)'));
  71. }
  72. function addClass(el, className) {
  73. if (el.classList) el.classList.add(className);
  74. else if (!hasClass(el, className)) el.className += " " + className;
  75. }
  76. function removeClass(el, className) {
  77. if (el.classList) el.classList.remove(className);
  78. else if (hasClass(el, className)) {
  79. var reg = new RegExp('(\\s|^)' + className + '(\\s|$)');
  80. el.className = el.className.replace(reg, ' ');
  81. }
  82. }
  83. module.exports['p5UI__openSideBar'] = p5UI__openSideBar;