diff --git a/Build/Sources/TypeScript/backend/svg-tree.ts b/Build/Sources/TypeScript/backend/svg-tree.ts index 51cd8745b54669cd17dcd575d3408bfeff9cc7db..3c9ecf8d80bc8dad8cfed8ad301dff888ce731d7 100644 --- a/Build/Sources/TypeScript/backend/svg-tree.ts +++ b/Build/Sources/TypeScript/backend/svg-tree.ts @@ -1057,7 +1057,14 @@ export class SvgTree extends LitElement { * @param {number} nodeHeight */ protected getNodeActionTransform(node: TreeNode, indentWidth: number, nodeHeight: number): string { - return 'translate(' + (indentWidth / 2 * -1) + ', ' + ((node.y || 0) - (nodeHeight / 2)) + ')'; + const positionX = (indentWidth / 2 * -1); + let positionY = (node.y || 0) - (nodeHeight / 2); + // Adjust startingpoint to match getNodeBackgroundTransform + positionY = positionY + 0.5; + // Center action icon + positionY = positionY + ((nodeHeight - this.settings.icon.containerSize) / 2); + + return 'translate(' + positionX + ', ' + positionY + ')'; } diff --git a/typo3/sysext/backend/Resources/Public/JavaScript/svg-tree.js b/typo3/sysext/backend/Resources/Public/JavaScript/svg-tree.js index fbdc8d7846cb21526db34531f3a5e8d4120db686..a4b9c9935c75b6b208ac9a7ce79b164bc9e10d17 100644 --- a/typo3/sysext/backend/Resources/Public/JavaScript/svg-tree.js +++ b/typo3/sysext/backend/Resources/Public/JavaScript/svg-tree.js @@ -27,7 +27,7 @@ var __decorate=function(e,t,s,i){var n,o=arguments.length,r=o<3?t:null===i?i=Obj </g> <defs></defs> </svg> - `}firstUpdated(){this.svg=d3selection.select(this.querySelector("svg")),this.container=d3selection.select(this.querySelector(".nodes-wrapper")).attr("transform","translate("+this.settings.indentWidth/2+","+this.settings.nodeHeight/2+")"),this.nodesBgContainer=d3selection.select(this.querySelector(".nodes-bg")),this.nodesActionsContainer=d3selection.select(this.querySelector(".nodes-actions")),this.linksContainer=d3selection.select(this.querySelector(".links")),this.nodesContainer=d3selection.select(this.querySelector(".nodes")),this.doSetup(this.setup||{}),this.updateView()}updateViewRequested(){this.updateView()}updateView(){this.updateScrollPosition(),this.updateVisibleNodes(),this.settings.actions&&this.settings.actions.length&&this.nodesActionsContainer.attr("transform","translate("+(this.querySelector("svg").clientWidth-16-16*this.settings.actions.length)+",0)")}disableSelectedNodes(){this.getSelectedNodes().forEach((e=>{!0===e.checked&&(e.checked=!1)}))}updateNodeActions(e){return this.settings.actions&&this.settings.actions.length?(this.nodesActionsContainer.selectAll(".node-action").selectChildren().remove(),e.enter().append("g").merge(e).attr("class","node-action").on("mouseover",((e,t)=>this.onMouseOverNode(t))).on("mouseout",((e,t)=>this.onMouseOutOfNode(t))).attr("data-state-id",this.getNodeStateIdentifier).attr("transform",(e=>this.getNodeActionTransform(e,this.settings.indentWidth,this.settings.nodeHeight)))):e.enter()}createIconAreaForAction(e,t){const s=e.append("svg").attr("class","node-icon-container").attr("height",this.settings.icon.containerSize).attr("width",this.settings.icon.containerSize).attr("x","0").attr("y","0");s.append("rect").attr("height",this.settings.icon.containerSize).attr("width",this.settings.icon.containerSize).attr("y","0").attr("x","0").attr("class","node-icon-click");s.append("svg").attr("height",this.settings.icon.size).attr("width",this.settings.icon.size).attr("y",(this.settings.icon.containerSize-this.settings.icon.size)/2).attr("x",(this.settings.icon.containerSize-this.settings.icon.size)/2).attr("class","node-icon-inner").append("use").attr("class","node-icon").attr("xlink:href","#icon-"+t)}isNodeSelectable(e){return!0}appendTextElement(e){return e.append("text").attr("dx",this.textPosition).attr("dy",5).attr("class","node-name").on("click",((e,t)=>{this.selectNode(t,!0),this.focusNode(t),this.updateVisibleNodes()}))}nodesUpdate(e){return(e=e.enter().append("g").attr("class","node").attr("id",(e=>"identifier-"+e.stateIdentifier)).attr("role","treeitem").attr("aria-owns",(e=>e.hasChildren?"group-identifier-"+e.stateIdentifier:null)).attr("aria-level",this.getNodeDepth).attr("aria-setsize",this.getNodeSetsize).attr("aria-posinset",this.getNodePositionInSet).attr("aria-expanded",(e=>e.hasChildren?e.expanded:null)).attr("transform",this.getNodeTransform).attr("data-state-id",this.getNodeStateIdentifier).attr("title",this.getNodeTitle).on("mouseover",((e,t)=>this.onMouseOverNode(t))).on("mouseout",((e,t)=>this.onMouseOutOfNode(t))).on("contextmenu",((e,t)=>{e.preventDefault(),this.dispatchEvent(new CustomEvent("typo3:svg-tree:node-context",{detail:{node:t}}))}))).append("text").text((e=>e.readableRootline)).attr("class","node-rootline").attr("dx",0).attr("dy",this.settings.nodeHeight/2*-1).attr("visibility",(e=>e.readableRootline?"visible":"hidden")),e}getNodeIdentifier(e){return e.identifier}getNodeDepth(e){return e.depth}getNodeSetsize(e){return e.siblingsCount}getNodePositionInSet(e){return e.siblingsPosition}getNodeStateIdentifier(e){return e.stateIdentifier}getNodeLabel(e){let t=(e.prefix||"")+e.name+(e.suffix||"");const s=document.createElement("div");if(s.textContent=t,t=s.innerHTML,this.searchTerm){const e=new RegExp(this.searchTerm,"gi");t=t.replace(e,'<tspan class="node-highlight-text">$&</tspan>')}return t}getNodeByIdentifier(e){return this.nodes.find((t=>t.stateIdentifier===e))}getNodeBgClass(e,t,s){let i="node-bg",n=null,o=null;return"object"==typeof s&&(n=s.data()[t-1],o=s.data()[t+1]),e.checked&&(i+=" node-selected"),e.focused&&(i+=" node-focused"),(n&&e.depth>n.depth||!n)&&(e.firstChild=!0,i+=" node-first-child"),(o&&e.depth>o.depth||!o)&&(e.lastChild=!0,i+=" node-last-child"),e.class&&(i+=" "+e.class),i}getNodeTitle(e){return e.tip?e.tip:"uid="+e.identifier}getToggleVisibility(e){return e.hasChildren?"visible":"hidden"}getToggleClass(e){return"node-toggle node-toggle--"+(e.expanded?"expanded":"collapsed")+" chevron "+(e.expanded?"expanded":"collapsed")}getLinkPath(e){const t=e.target.x,s=e.target.y,i=[];return i.push("M"+e.source.x+" "+e.source.y),i.push("V"+s),e.target.hasChildren?i.push("H"+(t-2)):i.push("H"+(t+this.settings.indentWidth/4-2)),i.join(" ")}getNodeTransform(e){return"translate("+(e.x||0)+","+(e.y||0)+")"}getNodeBackgroundTransform(e,t,s){const i=t/2*-1;let n=(e.y||0)-s/2;return n+=.5,"translate("+i+", "+n+")"}getNodeActionTransform(e,t,s){return"translate("+t/2*-1+", "+((e.y||0)-s/2)+")"}clickOnIcon(e){this.dispatchEvent(new CustomEvent("typo3:svg-tree:node-context",{detail:{node:e}}))}handleNodeToggle(e){e.expanded?this.hideChildren(e):this.showChildren(e),this.prepareDataForVisibleNodes(),this.updateVisibleNodes()}enterSvgElements(e){if(this.settings.showIcons){const e=Object.values(this.icons).filter((e=>""!==e.icon&&null!==e.icon)),t=this.iconsContainer.selectAll(".icon-def").data(e,(e=>e.identifier));t.exit().remove(),t.enter().append("g").attr("class","icon-def").attr("id",(e=>"icon-"+e.identifier)).append((e=>{if(e.icon instanceof SVGElement)return e.icon;const t="<svg>"+e.icon+"</svg>";return(new DOMParser).parseFromString(t,"image/svg+xml").documentElement.firstChild}))}const t=this.nodesUpdate(e),s=t.append("svg").attr("class","node-toggle").attr("y",this.settings.icon.size/2*-1).attr("x",this.settings.icon.size/2*-1).attr("visibility",this.getToggleVisibility).attr("height",this.settings.icon.size).attr("width",this.settings.icon.size).on("click",((e,t)=>this.handleNodeToggle(t)));if(s.append("use").attr("class","node-toggle-icon").attr("href","#icon-actions-chevron-right"),s.append("rect").attr("class","node-toggle-spacer").attr("height",this.settings.icon.size).attr("width",this.settings.icon.size).attr("fill","transparent"),this.settings.showIcons){const e=t.append("svg").attr("class","node-icon-container").attr("height","20").attr("width","20").attr("x","6").attr("y","-10").on("click",((e,t)=>{e.preventDefault(),this.clickOnIcon(t)}));e.append("rect").style("opacity",0).attr("width","20").attr("height","20").attr("y","0").attr("x","0").attr("class","node-icon-click");const s=e.append("svg").attr("height","16").attr("width","16").attr("y","2").attr("x","2").attr("class","node-icon-inner");s.append("use").attr("class","node-icon").attr("data-uid",this.getNodeIdentifier);s.append("svg").attr("height","11").attr("width","11").attr("y","5").attr("x","5").append("use").attr("class","node-icon-overlay");s.append("svg").attr("height","11").attr("width","11").attr("y","5").attr("x","5").append("use").attr("class","node-icon-locked")}return t.append("title").text(this.getNodeTitle),this.appendTextElement(t),e.merge(t)}onMouseOverNode(e){e.isOver=!0,this.hoveredNode=e;const t=this.svg.select('.nodes-bg .node-bg[data-state-id="'+e.stateIdentifier+'"]');t.size()&&t.classed("node-over",!0);const s=this.nodesActionsContainer.select('.node-action[data-state-id="'+e.stateIdentifier+'"]');s.size()&&(s.classed("node-action-over",!0),s.attr("fill",t.style("fill")))}onMouseOutOfNode(e){e.isOver=!1,this.hoveredNode=null;const t=this.svg.select('.nodes-bg .node-bg[data-state-id="'+e.stateIdentifier+'"]');t.size()&&t.classed("node-over node-alert",!1);const s=this.nodesActionsContainer.select('.node-action[data-state-id="'+e.stateIdentifier+'"]');s.size()&&s.classed("node-action-over",!1)}updateScrollPosition(){this.viewportHeight=this.getBoundingClientRect().height,this.scrollBottom=this.scrollTop+this.viewportHeight+this.viewportHeight/2}handleKeyboardInteraction(e){const t=e.target,s=d3selection.select(t).datum();if(-1===[KeyTypes.ENTER,KeyTypes.SPACE,KeyTypes.END,KeyTypes.HOME,KeyTypes.LEFT,KeyTypes.UP,KeyTypes.RIGHT,KeyTypes.DOWN].indexOf(e.keyCode))return;e.preventDefault();const i=t.parentNode;switch(e.keyCode){case KeyTypes.END:this.scrollTop=this.lastElementChild.getBoundingClientRect().height+this.settings.nodeHeight-this.viewportHeight,i.scrollIntoView({behavior:"smooth",block:"end"}),this.focusNode(this.getNodeFromElement(i.lastElementChild)),this.updateVisibleNodes();break;case KeyTypes.HOME:this.scrollTo({top:this.nodes[0].y,behavior:"smooth"}),this.prepareDataForVisibleNodes(),this.focusNode(this.getNodeFromElement(i.firstElementChild)),this.updateVisibleNodes();break;case KeyTypes.LEFT:if(s.expanded)s.hasChildren&&(this.hideChildren(s),this.prepareDataForVisibleNodes(),this.updateVisibleNodes());else if(s.parents.length>0){const e=this.nodes[s.parents[0]];this.scrollNodeIntoVisibleArea(e,"up"),this.focusNode(e),this.updateVisibleNodes()}break;case KeyTypes.UP:this.scrollNodeIntoVisibleArea(s,"up"),t.previousSibling&&(this.focusNode(this.getNodeFromElement(t.previousSibling)),this.updateVisibleNodes());break;case KeyTypes.RIGHT:s.expanded?(this.scrollNodeIntoVisibleArea(s,"down"),this.focusNode(this.getNodeFromElement(t.nextSibling)),this.updateVisibleNodes()):s.hasChildren&&(this.showChildren(s),this.prepareDataForVisibleNodes(),this.focusNode(this.getNodeFromElement(t)),this.updateVisibleNodes());break;case KeyTypes.DOWN:this.scrollNodeIntoVisibleArea(s,"down"),t.nextSibling&&(this.focusNode(this.getNodeFromElement(t.nextSibling)),this.updateVisibleNodes());break;case KeyTypes.ENTER:case KeyTypes.SPACE:this.selectNode(s,!0),this.focusNode(s)}}scrollNodeIntoVisibleArea(e,t="up"){let s=this.scrollTop;if("up"===t&&s>e.y-this.settings.nodeHeight)s=e.y-this.settings.nodeHeight;else{if(!("down"===t&&s+this.viewportHeight<=e.y+3*this.settings.nodeHeight))return;s+=this.settings.nodeHeight}this.scrollTo({top:s,behavior:"smooth"}),this.updateVisibleNodes()}updateLinks(){const e=this.data.links.filter((e=>e.source.y<=this.scrollBottom&&e.target.y>=this.scrollTop-this.settings.nodeHeight)).map((e=>(e.source.owns=e.source.owns||[],e.source.owns.push("identifier-"+e.target.stateIdentifier),e))),t=this.linksContainer.selectAll(".link").data(e);t.exit().remove(),t.enter().append("path").attr("class","link").attr("id",this.getGroupIdentifier).attr("role",(e=>1===e.target.siblingsPosition&&e.source.owns.length>0?"group":null)).attr("aria-owns",(e=>1===e.target.siblingsPosition&&e.source.owns.length>0?e.source.owns.join(" "):null)).merge(t).attr("d",(e=>this.getLinkPath(e)))}getGroupIdentifier(e){return 1===e.target.siblingsPosition?"group-identifier-"+e.source.stateIdentifier:null}}__decorate([property({type:Object})],SvgTree.prototype,"setup",void 0),__decorate([state()],SvgTree.prototype,"settings",void 0);let Toolbar=class extends LitElement{constructor(){super(...arguments),this.tree=null,this.settings={searchInput:".search-input",filterTimeout:450}}createRenderRoot(){return this}firstUpdated(){const e=this.querySelector(this.settings.searchInput);e&&new DebounceEvent("input",(e=>{const t=e.target;this.tree.filter(t.value.trim())}),this.settings.filterTimeout).bindTo(e)}render(){return html` + `}firstUpdated(){this.svg=d3selection.select(this.querySelector("svg")),this.container=d3selection.select(this.querySelector(".nodes-wrapper")).attr("transform","translate("+this.settings.indentWidth/2+","+this.settings.nodeHeight/2+")"),this.nodesBgContainer=d3selection.select(this.querySelector(".nodes-bg")),this.nodesActionsContainer=d3selection.select(this.querySelector(".nodes-actions")),this.linksContainer=d3selection.select(this.querySelector(".links")),this.nodesContainer=d3selection.select(this.querySelector(".nodes")),this.doSetup(this.setup||{}),this.updateView()}updateViewRequested(){this.updateView()}updateView(){this.updateScrollPosition(),this.updateVisibleNodes(),this.settings.actions&&this.settings.actions.length&&this.nodesActionsContainer.attr("transform","translate("+(this.querySelector("svg").clientWidth-16-16*this.settings.actions.length)+",0)")}disableSelectedNodes(){this.getSelectedNodes().forEach((e=>{!0===e.checked&&(e.checked=!1)}))}updateNodeActions(e){return this.settings.actions&&this.settings.actions.length?(this.nodesActionsContainer.selectAll(".node-action").selectChildren().remove(),e.enter().append("g").merge(e).attr("class","node-action").on("mouseover",((e,t)=>this.onMouseOverNode(t))).on("mouseout",((e,t)=>this.onMouseOutOfNode(t))).attr("data-state-id",this.getNodeStateIdentifier).attr("transform",(e=>this.getNodeActionTransform(e,this.settings.indentWidth,this.settings.nodeHeight)))):e.enter()}createIconAreaForAction(e,t){const s=e.append("svg").attr("class","node-icon-container").attr("height",this.settings.icon.containerSize).attr("width",this.settings.icon.containerSize).attr("x","0").attr("y","0");s.append("rect").attr("height",this.settings.icon.containerSize).attr("width",this.settings.icon.containerSize).attr("y","0").attr("x","0").attr("class","node-icon-click");s.append("svg").attr("height",this.settings.icon.size).attr("width",this.settings.icon.size).attr("y",(this.settings.icon.containerSize-this.settings.icon.size)/2).attr("x",(this.settings.icon.containerSize-this.settings.icon.size)/2).attr("class","node-icon-inner").append("use").attr("class","node-icon").attr("xlink:href","#icon-"+t)}isNodeSelectable(e){return!0}appendTextElement(e){return e.append("text").attr("dx",this.textPosition).attr("dy",5).attr("class","node-name").on("click",((e,t)=>{this.selectNode(t,!0),this.focusNode(t),this.updateVisibleNodes()}))}nodesUpdate(e){return(e=e.enter().append("g").attr("class","node").attr("id",(e=>"identifier-"+e.stateIdentifier)).attr("role","treeitem").attr("aria-owns",(e=>e.hasChildren?"group-identifier-"+e.stateIdentifier:null)).attr("aria-level",this.getNodeDepth).attr("aria-setsize",this.getNodeSetsize).attr("aria-posinset",this.getNodePositionInSet).attr("aria-expanded",(e=>e.hasChildren?e.expanded:null)).attr("transform",this.getNodeTransform).attr("data-state-id",this.getNodeStateIdentifier).attr("title",this.getNodeTitle).on("mouseover",((e,t)=>this.onMouseOverNode(t))).on("mouseout",((e,t)=>this.onMouseOutOfNode(t))).on("contextmenu",((e,t)=>{e.preventDefault(),this.dispatchEvent(new CustomEvent("typo3:svg-tree:node-context",{detail:{node:t}}))}))).append("text").text((e=>e.readableRootline)).attr("class","node-rootline").attr("dx",0).attr("dy",this.settings.nodeHeight/2*-1).attr("visibility",(e=>e.readableRootline?"visible":"hidden")),e}getNodeIdentifier(e){return e.identifier}getNodeDepth(e){return e.depth}getNodeSetsize(e){return e.siblingsCount}getNodePositionInSet(e){return e.siblingsPosition}getNodeStateIdentifier(e){return e.stateIdentifier}getNodeLabel(e){let t=(e.prefix||"")+e.name+(e.suffix||"");const s=document.createElement("div");if(s.textContent=t,t=s.innerHTML,this.searchTerm){const e=new RegExp(this.searchTerm,"gi");t=t.replace(e,'<tspan class="node-highlight-text">$&</tspan>')}return t}getNodeByIdentifier(e){return this.nodes.find((t=>t.stateIdentifier===e))}getNodeBgClass(e,t,s){let i="node-bg",n=null,o=null;return"object"==typeof s&&(n=s.data()[t-1],o=s.data()[t+1]),e.checked&&(i+=" node-selected"),e.focused&&(i+=" node-focused"),(n&&e.depth>n.depth||!n)&&(e.firstChild=!0,i+=" node-first-child"),(o&&e.depth>o.depth||!o)&&(e.lastChild=!0,i+=" node-last-child"),e.class&&(i+=" "+e.class),i}getNodeTitle(e){return e.tip?e.tip:"uid="+e.identifier}getToggleVisibility(e){return e.hasChildren?"visible":"hidden"}getToggleClass(e){return"node-toggle node-toggle--"+(e.expanded?"expanded":"collapsed")+" chevron "+(e.expanded?"expanded":"collapsed")}getLinkPath(e){const t=e.target.x,s=e.target.y,i=[];return i.push("M"+e.source.x+" "+e.source.y),i.push("V"+s),e.target.hasChildren?i.push("H"+(t-2)):i.push("H"+(t+this.settings.indentWidth/4-2)),i.join(" ")}getNodeTransform(e){return"translate("+(e.x||0)+","+(e.y||0)+")"}getNodeBackgroundTransform(e,t,s){const i=t/2*-1;let n=(e.y||0)-s/2;return n+=.5,"translate("+i+", "+n+")"}getNodeActionTransform(e,t,s){const i=t/2*-1;let n=(e.y||0)-s/2;return n+=.5,n+=(s-this.settings.icon.containerSize)/2,"translate("+i+", "+n+")"}clickOnIcon(e){this.dispatchEvent(new CustomEvent("typo3:svg-tree:node-context",{detail:{node:e}}))}handleNodeToggle(e){e.expanded?this.hideChildren(e):this.showChildren(e),this.prepareDataForVisibleNodes(),this.updateVisibleNodes()}enterSvgElements(e){if(this.settings.showIcons){const e=Object.values(this.icons).filter((e=>""!==e.icon&&null!==e.icon)),t=this.iconsContainer.selectAll(".icon-def").data(e,(e=>e.identifier));t.exit().remove(),t.enter().append("g").attr("class","icon-def").attr("id",(e=>"icon-"+e.identifier)).append((e=>{if(e.icon instanceof SVGElement)return e.icon;const t="<svg>"+e.icon+"</svg>";return(new DOMParser).parseFromString(t,"image/svg+xml").documentElement.firstChild}))}const t=this.nodesUpdate(e),s=t.append("svg").attr("class","node-toggle").attr("y",this.settings.icon.size/2*-1).attr("x",this.settings.icon.size/2*-1).attr("visibility",this.getToggleVisibility).attr("height",this.settings.icon.size).attr("width",this.settings.icon.size).on("click",((e,t)=>this.handleNodeToggle(t)));if(s.append("use").attr("class","node-toggle-icon").attr("href","#icon-actions-chevron-right"),s.append("rect").attr("class","node-toggle-spacer").attr("height",this.settings.icon.size).attr("width",this.settings.icon.size).attr("fill","transparent"),this.settings.showIcons){const e=t.append("svg").attr("class","node-icon-container").attr("height","20").attr("width","20").attr("x","6").attr("y","-10").on("click",((e,t)=>{e.preventDefault(),this.clickOnIcon(t)}));e.append("rect").style("opacity",0).attr("width","20").attr("height","20").attr("y","0").attr("x","0").attr("class","node-icon-click");const s=e.append("svg").attr("height","16").attr("width","16").attr("y","2").attr("x","2").attr("class","node-icon-inner");s.append("use").attr("class","node-icon").attr("data-uid",this.getNodeIdentifier);s.append("svg").attr("height","11").attr("width","11").attr("y","5").attr("x","5").append("use").attr("class","node-icon-overlay");s.append("svg").attr("height","11").attr("width","11").attr("y","5").attr("x","5").append("use").attr("class","node-icon-locked")}return t.append("title").text(this.getNodeTitle),this.appendTextElement(t),e.merge(t)}onMouseOverNode(e){e.isOver=!0,this.hoveredNode=e;const t=this.svg.select('.nodes-bg .node-bg[data-state-id="'+e.stateIdentifier+'"]');t.size()&&t.classed("node-over",!0);const s=this.nodesActionsContainer.select('.node-action[data-state-id="'+e.stateIdentifier+'"]');s.size()&&(s.classed("node-action-over",!0),s.attr("fill",t.style("fill")))}onMouseOutOfNode(e){e.isOver=!1,this.hoveredNode=null;const t=this.svg.select('.nodes-bg .node-bg[data-state-id="'+e.stateIdentifier+'"]');t.size()&&t.classed("node-over node-alert",!1);const s=this.nodesActionsContainer.select('.node-action[data-state-id="'+e.stateIdentifier+'"]');s.size()&&s.classed("node-action-over",!1)}updateScrollPosition(){this.viewportHeight=this.getBoundingClientRect().height,this.scrollBottom=this.scrollTop+this.viewportHeight+this.viewportHeight/2}handleKeyboardInteraction(e){const t=e.target,s=d3selection.select(t).datum();if(-1===[KeyTypes.ENTER,KeyTypes.SPACE,KeyTypes.END,KeyTypes.HOME,KeyTypes.LEFT,KeyTypes.UP,KeyTypes.RIGHT,KeyTypes.DOWN].indexOf(e.keyCode))return;e.preventDefault();const i=t.parentNode;switch(e.keyCode){case KeyTypes.END:this.scrollTop=this.lastElementChild.getBoundingClientRect().height+this.settings.nodeHeight-this.viewportHeight,i.scrollIntoView({behavior:"smooth",block:"end"}),this.focusNode(this.getNodeFromElement(i.lastElementChild)),this.updateVisibleNodes();break;case KeyTypes.HOME:this.scrollTo({top:this.nodes[0].y,behavior:"smooth"}),this.prepareDataForVisibleNodes(),this.focusNode(this.getNodeFromElement(i.firstElementChild)),this.updateVisibleNodes();break;case KeyTypes.LEFT:if(s.expanded)s.hasChildren&&(this.hideChildren(s),this.prepareDataForVisibleNodes(),this.updateVisibleNodes());else if(s.parents.length>0){const e=this.nodes[s.parents[0]];this.scrollNodeIntoVisibleArea(e,"up"),this.focusNode(e),this.updateVisibleNodes()}break;case KeyTypes.UP:this.scrollNodeIntoVisibleArea(s,"up"),t.previousSibling&&(this.focusNode(this.getNodeFromElement(t.previousSibling)),this.updateVisibleNodes());break;case KeyTypes.RIGHT:s.expanded?(this.scrollNodeIntoVisibleArea(s,"down"),this.focusNode(this.getNodeFromElement(t.nextSibling)),this.updateVisibleNodes()):s.hasChildren&&(this.showChildren(s),this.prepareDataForVisibleNodes(),this.focusNode(this.getNodeFromElement(t)),this.updateVisibleNodes());break;case KeyTypes.DOWN:this.scrollNodeIntoVisibleArea(s,"down"),t.nextSibling&&(this.focusNode(this.getNodeFromElement(t.nextSibling)),this.updateVisibleNodes());break;case KeyTypes.ENTER:case KeyTypes.SPACE:this.selectNode(s,!0),this.focusNode(s)}}scrollNodeIntoVisibleArea(e,t="up"){let s=this.scrollTop;if("up"===t&&s>e.y-this.settings.nodeHeight)s=e.y-this.settings.nodeHeight;else{if(!("down"===t&&s+this.viewportHeight<=e.y+3*this.settings.nodeHeight))return;s+=this.settings.nodeHeight}this.scrollTo({top:s,behavior:"smooth"}),this.updateVisibleNodes()}updateLinks(){const e=this.data.links.filter((e=>e.source.y<=this.scrollBottom&&e.target.y>=this.scrollTop-this.settings.nodeHeight)).map((e=>(e.source.owns=e.source.owns||[],e.source.owns.push("identifier-"+e.target.stateIdentifier),e))),t=this.linksContainer.selectAll(".link").data(e);t.exit().remove(),t.enter().append("path").attr("class","link").attr("id",this.getGroupIdentifier).attr("role",(e=>1===e.target.siblingsPosition&&e.source.owns.length>0?"group":null)).attr("aria-owns",(e=>1===e.target.siblingsPosition&&e.source.owns.length>0?e.source.owns.join(" "):null)).merge(t).attr("d",(e=>this.getLinkPath(e)))}getGroupIdentifier(e){return 1===e.target.siblingsPosition?"group-identifier-"+e.source.stateIdentifier:null}}__decorate([property({type:Object})],SvgTree.prototype,"setup",void 0),__decorate([state()],SvgTree.prototype,"settings",void 0);let Toolbar=class extends LitElement{constructor(){super(...arguments),this.tree=null,this.settings={searchInput:".search-input",filterTimeout:450}}createRenderRoot(){return this}firstUpdated(){const e=this.querySelector(this.settings.searchInput);e&&new DebounceEvent("input",(e=>{const t=e.target;this.tree.filter(t.value.trim())}),this.settings.filterTimeout).bindTo(e)}render(){return html` <div class="tree-toolbar"> <div class="svg-toolbar__menu"> <div class="svg-toolbar__search">