@toolbox-web/grid 3.10.0 → 3.10.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/all.js +2 -1
  2. package/all.js.map +1 -1
  3. package/index.js +1 -1
  4. package/index.js.map +1 -1
  5. package/lib/features/registry.js +1 -1
  6. package/lib/plugins/editing/editing-plugin.d.ts +11 -5
  7. package/lib/plugins/editing/index.js +2 -1
  8. package/lib/plugins/editing/index.js.map +1 -1
  9. package/lib/plugins/editing/internal/editor-injection.d.ts +9 -2
  10. package/lib/plugins/editing/internal/helpers.d.ts +23 -0
  11. package/lib/plugins/editing/types.d.ts +11 -0
  12. package/lib/plugins/grouping-rows/index.js +1 -1
  13. package/lib/plugins/grouping-rows/index.js.map +1 -1
  14. package/lib/plugins/hierarchy/hierarchy.d.ts +5 -1
  15. package/lib/plugins/hierarchy/index.js +1 -1
  16. package/lib/plugins/hierarchy/index.js.map +1 -1
  17. package/lib/plugins/master-detail/index.js +1 -1
  18. package/lib/plugins/master-detail/index.js.map +1 -1
  19. package/lib/plugins/master-detail/master-detail-plugin.d.ts +6 -1
  20. package/lib/plugins/shared/structural-toggle.d.ts +14 -0
  21. package/lib/plugins/tree/index.js +1 -1
  22. package/lib/plugins/tree/index.js.map +1 -1
  23. package/lib/plugins/undo-redo/index.d.ts +1 -1
  24. package/lib/plugins/undo-redo/index.js +1 -1
  25. package/lib/plugins/undo-redo/index.js.map +1 -1
  26. package/lib/plugins/undo-redo/types.d.ts +20 -2
  27. package/lib/plugins/undo-redo/undo-redo-plugin.d.ts +8 -0
  28. package/package.json +1 -1
  29. package/umd/grid.all.umd.js +1 -1
  30. package/umd/grid.all.umd.js.map +1 -1
  31. package/umd/grid.umd.js +1 -1
  32. package/umd/grid.umd.js.map +1 -1
  33. package/umd/plugins/editing.umd.js +1 -1
  34. package/umd/plugins/editing.umd.js.map +1 -1
  35. package/umd/plugins/grouping-rows.umd.js +1 -1
  36. package/umd/plugins/grouping-rows.umd.js.map +1 -1
  37. package/umd/plugins/hierarchy.umd.js +1 -1
  38. package/umd/plugins/hierarchy.umd.js.map +1 -1
  39. package/umd/plugins/master-detail.umd.js +1 -1
  40. package/umd/plugins/master-detail.umd.js.map +1 -1
  41. package/umd/plugins/tree.umd.js +1 -1
  42. package/umd/plugins/tree.umd.js.map +1 -1
  43. package/umd/plugins/undo-redo.umd.js +1 -1
  44. package/umd/plugins/undo-redo.umd.js.map +1 -1
@@ -1,2 +1,2 @@
1
- import{BaseGridPlugin as e,builtInSort as t}from"@toolbox-web/grid";import{HierarchyPlugin as r,buildHierarchy as n}from"@toolbox-web/grid/plugins/hierarchy";var i="expanded",s="tree-toggle",o="__otorp__|__retteGenifed__|__retteSenifed__|rotcurtsnoc|wodniw|sihTlabolg|labolg|ssecorp|noitcnuF|tropmi|lave|tcelfeR|yxorP|rorrE|stnemugra|tnemucod|noitacol|eikooc|egarotSlacol|egarotSnoisses|BDdexedni|hctef|tseuqeRpttHLMX|tekcoSbeW|rekroW|rekroWderahS|rekroWecivreS|renepo|tnerap|pot|semarf|fles".split("|").map(e=>e.split("").reverse().join("")),a=(new RegExp(`__(proto|defineGetter|defineSetter)|${o.slice(3).join("|")}|this\\b`),new Set("script|iframe|object|embed|form|input|button|textarea|select|link|meta|base|style|template|slot|portal|frame|frameset|applet|noscript|noembed|plaintext|xmp|listing|math".split("|"))),d=/^on\w+$/i,l=new Set("href|src|action|formaction|data|srcdoc|xlink:href|poster|srcset".split("|")),h=/^\s*(javascript|vbscript|data|blob):/i;function c(e){const t=document.createElement("template");return e&&"string"==typeof e&&(t.innerHTML=e,function(e){const t=[],r=e.querySelectorAll("*");for(const n of r){const e=n.tagName.toLowerCase();if(a.has(e)){t.push(n);continue}if(("svg"===e||"http://www.w3.org/2000/svg"===n.namespaceURI)&&Array.from(n.attributes).some(e=>d.test(e.name)||"href"===e.name||"xlink:href"===e.name)){t.push(n);continue}const r=[];for(const t of n.attributes){const e=t.name.toLowerCase();d.test(e)?r.push(t.name):"is"!==e?(l.has(e)&&h.test(t.value)||"style"===e&&/expression\s*\(|javascript:|behavior\s*:/i.test(t.value))&&r.push(t.name):r.push(t.name)}r.forEach(e=>n.removeAttribute(e))}t.forEach(e=>e.remove())}(t.content)),t.content}function u(e,t,r){return void 0!==e.id?String(e.id):r?`${r}-${t}`:String(t)}function p(e,t){const r=new Set(e);return r.has(t)?r.delete(t):r.add(t),r}function g(e,t,r=null,n=0){const i=t.childrenField??"children",s=/* @__PURE__ */new Set;for(let o=0;o<e.length;o++){const a=e[o],d=u(a,o,r),l=a[i];if(Array.isArray(l)&&l.length>0){s.add(d);const e=g(l,t,d,n+1);for(const t of e)s.add(t)}}return s}function w(e,t,r,n=null,i=0){const s=r.childrenField??"children";for(let o=0;o<e.length;o++){const a=e[o],d=u(a,o,n);if(d===t)return[d];const l=a[s];if(Array.isArray(l)&&l.length>0){const e=w(l,t,r,d,i+1);if(e)return[d,...e]}}return null}function f(e,t,r,n){const i=w(e,t,r);if(!i)return n;const s=new Set(n);for(let o=0;o<i.length-1;o++)s.add(i[o]);return s}function y(e,t="children",r){if(!Array.isArray(e)||0===e.length)return!1;for(const n of e){if(!n||!0===n.__loading)continue;const e=n[t];if(Array.isArray(e)&&e.length>0)return!0;if(null!=e&&!Array.isArray(e)&&e)return!0;if(r?.(n))return!0}return!1}var m=class extends e{static manifest={modifiesRowStructure:!0,hookPriority:{processRows:10},incompatibleWith:[{name:"pivot",reason:"PivotPlugin replaces the entire row and column structure with aggregated pivot data. Tree hierarchy cannot coexist with pivot aggregation."}],events:[{type:"tree-expand",description:"Emitted when tree expansion state changes (toggle, expand all, collapse all). Broadcast to both DOM consumers and plugin bus."},{type:"tree-load-start",description:"Emitted when lazy child loading starts for a node whose children are not yet loaded."},{type:"tree-load-end",description:"Emitted when lazy child loading completes and children have been merged into the parent row."},{type:"tree-load-error",description:"Emitted when lazy child loading fails. The node leaves its loading state and can be retried."}],queries:[{type:"canMoveRow",description:"Returns false for rows with children (parent nodes cannot be reordered)"},{type:"datasource:viewport-mapping",description:"Translates flat viewport row indices to top-level node indices for ServerSide pagination."}]};static dependencies=[{name:"hierarchy",required:!0,reason:"Builds the hierarchical row model",provide:()=>new r},{name:"multiSort",required:!1,reason:"Queries sort model for coordinated tree sorting"},{name:"serverSide",required:!1,reason:"Consumes datasource events for lazy-loaded tree data"}];name="tree";hierarchyStage="structure";styles='@layer tbw-plugins{tbw-grid .cell[data-field=__tbw_expander]{justify-content:flex-start;align-items:center;padding:0;display:flex;border-inline-end:none!important}tbw-grid .header-row .cell[data-field=__tbw_expander]{display:none}tbw-grid .header-row .cell[data-field=__tbw_expander]+.cell{grid-column:1/3}tbw-grid .tree-cell-wrapper{vertical-align:middle;align-items:center;padding-inline-start:calc(var(--tbw-tree-depth,0) * var(--tbw-tree-indent-width,var(--tbw-tree-toggle-size,1.25em)));display:inline-flex;overflow:visible}tbw-grid .tree-expander{box-sizing:border-box;justify-content:flex-start;align-items:center;width:100%;height:100%;display:flex}tbw-grid .tree-toggle{cursor:pointer;-webkit-user-select:none;user-select:none;width:var(--tbw-tree-toggle-size,1.25em);height:var(--tbw-tree-toggle-size,1.25em);flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}tbw-grid .tree-toggle:hover{color:var(--tbw-tree-accent,var(--tbw-color-accent))}tbw-grid .tree-toggle{position:relative}tbw-grid .tree-toggle:after{content:"";inline-size:var(--tbw-touch-target-min,24px);block-size:var(--tbw-touch-target-min,24px);position:absolute;inset-block-start:50%;inset-inline-start:50%;translate:-50% -50%}tbw-grid .tree-spacer{width:var(--tbw-tree-toggle-size,1.25em);height:var(--tbw-tree-toggle-size,1.25em);flex-shrink:0;display:inline-block}@media (pointer:coarse){tbw-grid .tree-toggle,tbw-grid .tree-spacer{min-width:var(--tbw-touch-target-min,24px);min-height:var(--tbw-touch-target-min,24px)}}tbw-grid .tree-loading{--tbw-spinner-size:var(--tbw-tree-toggle-size,1.25em);flex-shrink:0}tbw-grid .data-grid-row.tbw-tree-slide-in{animation:tbw-tree-slide-in var(--tbw-animation-duration,.2s) var(--tbw-animation-easing,ease-out) forwards}tbw-grid .data-grid-row.tbw-tree-fade-in{animation:tbw-tree-fade-in var(--tbw-animation-duration,.2s) var(--tbw-animation-easing,ease-out) forwards}@keyframes tbw-tree-slide-in{0%{opacity:0;transform:translate(-8px)}to{opacity:1;transform:translate(0)}}@keyframes tbw-tree-fade-in{0%{opacity:0}to{opacity:1}}}';get defaultConfig(){return{childrenField:"children",autoDetect:!0,defaultExpanded:!1,indentWidth:20,showExpandIcons:!0,animation:"slide"}}expandedKeys=/* @__PURE__ */new Set;initialExpansionDone=!1;flattenedRows=[];rowKeyMap=/* @__PURE__ */new Map;previousVisibleKeys=/* @__PURE__ */new Set;keysToAnimate=/* @__PURE__ */new Set;#e=[];#t=0;sortState=null;#r=null;#n=/* @__PURE__ */new Map;#i=/* @__PURE__ */new WeakSet;#s=/* @__PURE__ */new WeakSet;#o=/* @__PURE__ */new WeakSet;#a=[];#d=/* @__PURE__ */new WeakMap;#l=/* @__PURE__ */new WeakMap;originalTreeColumnRenderer;originalTreeColumnRendererProperty="viewRenderer";wrappedTreeColumnField;#h=!1;#c=!1;detach(){this.expandedKeys.clear(),this.initialExpansionDone=!1,this.flattenedRows=[],this.#e=[],this.#t=0,this.rowKeyMap.clear(),this.previousVisibleKeys.clear(),this.keysToAnimate.clear(),this.sortState=null,this.#r=null,this.#i=/* @__PURE__ */new WeakSet,this.#s=/* @__PURE__ */new WeakSet,this.#o=/* @__PURE__ */new WeakSet,this.#a=[];for(const e of this.#n.values())e.controller.abort();this.#n.clear(),this.originalTreeColumnRenderer=void 0,this.originalTreeColumnRendererProperty="viewRenderer",this.wrappedTreeColumnField=void 0,this.#h=!1}handleQuery(e){if("canMoveRow"===e.type){const t=e.context,r=this.config.childrenField??"children",n=t?.[r];if(Array.isArray(n)&&n.length>0)return!1}if("datasource:viewport-mapping"===e.type){const{viewportStart:t,viewportEnd:r}=e.context;if(0===this.flattenedRows.length)return;return function(e,t,r,n){const i=e.length-1,s=t=>Math.max(0,e[Math.max(0,Math.min(t,i))]??0);return{startNode:s(r),endNode:s(n)+1,totalLoadedNodes:t}}(this.#e,this.#t,t,r)}}attach(e){super.attach(e),this.on("datasource:data",e=>{const t=e;t.claimed||(t.claimed=!0)}),this.on("datasource:children",e=>{const t=e;if("tree"!==t.context?.source)return;t.claimed=!0;const r=t.context.parentNode;if(r){const e=this.#u(r),n=this.#p(e,r);if(!n&&(this.#s.has(r)||this.#o.has(r)))return;this.#g(r,t.rows??[]),this.broadcast("tree-load-end",{key:e,row:r,depth:n?.depth??this.rowKeyMap.get(e)?.depth??0,childCount:t.rows?.length??0}),this.requestRender()}}),this.on("datasource:error",e=>{const t=e;if("tree"!==t.context?.source)return;const r=t.context.parentNode;if(!r)return;const n=this.#u(r),i=this.#p(n,r);i&&(this.broadcast("tree-load-error",{key:n,row:r,depth:i.depth,error:t.error}),this.requestRender())})}get animationStyle(){return!!this.isAnimationEnabled&&(this.config.animation??"slide")}detect(e){if(!this.config.autoDetect)return!1;const t=e,r=this.config.childrenField??function(e){if(!Array.isArray(e)||0===e.length)return null;const t=["children","items","nodes","subRows","nested"];for(const r of e)if(r&&"object"==typeof r)for(const e of t){const t=r[e];if(Array.isArray(t)&&t.length>0)return e}return null}(t)??"children";return y(t,r)}processRows(e){const t=this.grid?.getPluginByName?.("hierarchy");return t?t.process(e,this):n(e,[this])}beginHierarchy(e){const t=e;if(0===t.length||!y(t,this.config.childrenField??"children",this.config.hasChildren))return this.flattenedRows=[],this.#e=[],this.#t=0,this.rowKeyMap.clear(),this.previousVisibleKeys.clear(),this.#w(t),this.#f(),!1;const r="server"===this.grid?.query?.("datasource:sort-mode",null)?.[0];return this.#r=r?null:this.resolveEffectiveSortState(),this.config.defaultExpanded&&!this.initialExpansionDone&&(this.expandedKeys=g(t,this.config),this.initialExpansionDone=!0),this.#l=/* @__PURE__ */new WeakMap,!0}processSiblings(e,t){const{parentKey:r,depth:n}=t,i=this.config.childrenField??"children",s=this.config.hasChildren;for(let d=0;d<e.length;d++)this.#y(e[d].row,d,r);const o=this.#r,a=o?this.#m(e,o.field,o.direction):e;for(let d=0;d<a.length;d++){const e=a[d],t=e.row,o=this.#y(t,d,r),l=t[i],h=Array.isArray(l)&&l.length>0,c=h||!0!==t.__loading&&(s?s(t):null!=l&&!Array.isArray(l)&&!!l),u=this.expandedKeys.has(o);this.#l.set(t,{key:o,data:t,depth:n,hasChildren:c,isExpanded:u,parentKey:r,posInSet:d+1,setSize:a.length}),e.key=o,h&&u&&(e.expanded=!0,e.children=l.map(e=>({row:e})))}return a}endHierarchy(e,t){const r=this.#l;this.#l=/* @__PURE__ */new WeakMap,this.flattenedRows=[],this.rowKeyMap.clear(),this.keysToAnimate.clear();const n=/* @__PURE__ */new Set,i=new Array(e.length);let s=-1;for(let o=0;o<e.length;o++){const a=e[o],d=r.get(a);if(null===d?.parentKey&&s++,i[o]=s,!d)continue;const l=t(a)?.level;void 0!==l&&(d.depth=l-1),this.flattenedRows.push(d),this.rowKeyMap.set(d.key,d),this.#l.set(a,d),n.add(d.key),!this.previousVisibleKeys.has(d.key)&&d.depth>0&&this.keysToAnimate.add(d.key),this.#b(d)&&this.#x(d)}return this.previousVisibleKeys=n,this.#e=i,this.#t=s+1,this.#f(),!0}#f(){this.#c||(this.#c=!0,queueMicrotask(()=>{this.#c=!1,this.grid&&this.#h!==this.flattenedRows.length>0&&this.requestColumnsRender()}))}#y(e,t,r){if(void 0!==e.id){const t=String(e.id);return this.#d.set(e,t),t}const n=this.#d.get(e);if(void 0!==n)return n;const i=r?`${r}-${t}`:String(t);return this.#d.set(e,i),i}#m(e,t,r){const n=/* @__PURE__ */new Map;for(const i of e)n.set(i.row,i);return this.#v(e.map(e=>e.row),t,r).map(e=>n.get(e)??{row:e})}#v(e,r,n){const i=this.grid,s=i?._columns??[],o={field:r,direction:n},a=[...e],d=(i?.effectiveConfig?.sortHandler??t)(a,o,s);return d&&"function"==typeof d.then?(d.catch(()=>{}),t(a,o,s)):d}#u(e){return this.#d.get(e)??String(e.id??"?")}#g(e,t){e[this.config.childrenField??"children"]=t,this.#i.add(e)}#R(e){if(this.#i.has(e))return!1;const t=e[this.config.childrenField??"children"];if(Array.isArray(t)&&t.length>0)return!1;const r=this.config.hasChildren;return r?r(e):null!=t&&!Array.isArray(t)&&!!t}#b(e){if(!0===e.data.__loading)return!1;const t=this.#n.get(e.key);return t?t.row!==e.data:e.isExpanded&&e.hasChildren&&!this.#s.has(e.data)&&this.#R(e.data)}#w(e){if(0===this.#n.size)return;const t=/* @__PURE__ */new Map;for(let r=0;r<e.length;r++){const n=e[r];if(!0===n.__loading)continue;const i=void 0!==n.id?String(n.id):this.#d.get(n)??String(r);this.#n.has(i)&&t.set(i,n)}for(const[r,n]of t)this.#n.get(r)?.row!==n&&this.#x({key:r,data:n,depth:0,hasChildren:!1,isExpanded:!1,parentKey:null,posInSet:0,setSize:0},!0)}#x(e,t=!1){this.#a.push({meta:e,flat:t})>1||queueMicrotask(()=>{const e=this.#a;if(this.#a=[],!this.grid)return;let t=!1;for(const{meta:r,flat:n}of e){if(!n&&this.rowKeyMap.get(r.key)?.data!==r.data)continue;const e=this.#n.get(r.key);e&&e.row!==r.data&&this.#C(r.key),n||!this.expandedKeys.has(r.key)||this.#s.has(r.data)||(this.#s.add(r.data),t=this.requestLazyChildren(r)||t)}t&&this.requestRender()})}requestLazyChildren(e){const{key:t,depth:r,data:n}=e,i=this.#n.get(t);if(i?.row===n)return!1;if(!this.#R(n))return!1;const s=this.queryBoolean("datasource:is-active"),{loadChildren:o}=this.config;if(!s&&!o)return!1;i&&this.#C(t);const a=new AbortController;return this.#n.set(t,{row:n,depth:r,controller:a}),this.#s.add(n),this.#o.delete(n),this.broadcast("tree-load-start",{key:t,row:n,depth:r}),s?(this.grid.query("datasource:fetch-children",{context:{source:"tree",parentNode:n,nodePath:[t]},signal:a.signal}),!0):(this.#k(t,n,r,a),!0)}#S(e){return this.#n.get(e.key)?.row===e.data}#p(e,t){const r=this.#n.get(e);if(r?.row===t)return this.#n.delete(e),r}#C(e){const t=this.#n.get(e);t&&(this.#n.delete(e),this.#s.delete(t.row),this.#o.add(t.row),t.controller.abort(),this.broadcast("tree-load-end",{key:e,row:t.row,depth:t.depth,childCount:0,cancelled:!0}))}#k(e,t,r,n){const i=this.config.loadChildren,s=()=>!n.signal.aborted&&(this.#n.delete(e),!0),o=n=>{if(!s())return;const i=n??[];this.#g(t,i),this.broadcast("tree-load-end",{key:e,row:t,depth:r,childCount:i.length}),this.requestRender()},a=n=>{s()&&(this.broadcast("tree-load-error",{key:e,row:t,depth:r,error:n}),this.requestRender())};let d;try{d=i({row:t,key:e,depth:r,signal:n.signal})}catch(l){return void a(l)}if(d&&"function"==typeof d.subscribe){let e=!1,t=null;const r=()=>{e=!0,t?.unsubscribe(),t=null},i=d.subscribe({next:e=>{o(e),r()},error:e=>{a(e),r()}});return e?void i.unsubscribe():(t=i,void n.signal.addEventListener("abort",r,{once:!0}))}Promise.resolve(d).then(o,a)}resolveEffectiveSortState(){const e=this.grid?.query?.("sort:get-model",null);if(Array.isArray(e)&&e.length>0){const t=e[0];if(Array.isArray(t)&&t.length>0)return{field:t[0].field,direction:"desc"===t[0].direction?-1:1}}return this.sortState}processColumns(e){if(0===this.flattenedRows.length){const t=[...e];if(this.#h){const e=t.findIndex(e=>e.field===this.wrappedTreeColumnField);e>=0&&(t[e]={...t[e],renderer:"renderer"===this.originalTreeColumnRendererProperty?this.originalTreeColumnRenderer:void 0})}return this.#h=!1,this.originalTreeColumnRenderer=void 0,this.originalTreeColumnRendererProperty="viewRenderer",this.wrappedTreeColumnField=void 0,t}const t=[...e];if(0===t.length)return t;const{treeColumn:r}=this.config;let n=0;if(r){const e=t.findIndex(e=>e.field===r);e>=0&&(n=e)}const o=t[n],a=o.field;this.wrappedTreeColumnField!==a&&(this.originalTreeColumnRenderer=o.renderer||o.viewRenderer,this.originalTreeColumnRendererProperty=o.renderer?"renderer":"viewRenderer",this.wrappedTreeColumnField=a);const d=this.originalTreeColumnRenderer,l=()=>this.config,h=this.setIcon.bind(this);return t[n]={...o,renderer:e=>{const{row:t,value:r}=e,{showExpandIcons:n=!0,indentWidth:o}=l(),a=this.#l.get(t),u=a?.depth??0,p=document.createElement("span");if(p.className="tree-cell-wrapper",p.style.setProperty("--tbw-tree-depth",String(u)),void 0!==o&&p.style.setProperty("--tbw-tree-indent-width",`${o}px`),n)if(a&&this.#S(a)){const e=function(e){const t=document.createElement("div");return t.className=`tbw-spinner tbw-spinner--${e}`,t.setAttribute("role","progressbar"),t.setAttribute("aria-label","Loading"),t}("small");e.classList.add("tree-loading"),p.appendChild(e)}else if(a&&a.hasChildren){const e=document.createElement("span");e.className=`${s}${a.isExpanded?` ${i}`:""}`,h(e,a.isExpanded?"collapse":"expand"),e.setAttribute("data-tree-key",a.key),p.appendChild(e)}else{const e=document.createElement("span");e.className="tree-spacer",p.appendChild(e)}const g=document.createElement("span");if(g.className="tree-content",d){const t=d(e);t instanceof Node?g.appendChild(t):"string"==typeof t&&(w=g,(f=t)&&"string"==typeof f?-1!==f.indexOf("<")||-1!==f.indexOf("&")?w.replaceChildren(c(f)):w.textContent=f:w.replaceChildren())}else g.textContent=null!=r?String(r):"";var w,f;return p.appendChild(g),p}},this.#h=!0,t}onCellClick(e){const t=e.originalEvent?.target;if(!t?.classList.contains(s))return!1;const r=t.getAttribute("data-tree-key");if(!r)return!1;const n=this.rowKeyMap.get(r);return!!n&&(this.expandedKeys=p(this.expandedKeys,r),this.expandedKeys.has(r)&&this.requestLazyChildren(n),this.broadcast("tree-expand",{key:r,row:n.data,expanded:this.expandedKeys.has(r),depth:n.depth,expandedKeys:[...this.expandedKeys]}),this.requestRender(),!0)}onKeyDown(e){if(" "!==e.key)return;if(function(e){const t=e.composedPath?.()??[],r=t.length?t[0]:e.target;if(!(r instanceof HTMLElement))return!1;const n=r.tagName;return"INPUT"===n||"SELECT"===n||"TEXTAREA"===n||r.isContentEditable}(e))return;const t=this.grid._focusRow,r=this.#l.get(this.rows[t]);return r?.hasChildren?(e.preventDefault(),this.expandedKeys=p(this.expandedKeys,r.key),this.expandedKeys.has(r.key)&&this.requestLazyChildren(r),this.broadcast("tree-expand",{key:r.key,row:r.data,expanded:this.expandedKeys.has(r.key),depth:r.depth,expandedKeys:[...this.expandedKeys]}),this.requestRenderWithFocus(),!0):void 0}onHeaderClick(e){if(0===this.flattenedRows.length||!e.column.sortable)return!1;const t=this.grid?.query?.("sort:get-model",null);if(Array.isArray(t)&&t.length>0)return!1;const{field:r}=e.column;this.sortState&&this.sortState.field===r?1===this.sortState.direction?this.sortState={field:r,direction:-1}:this.sortState=null:this.sortState={field:r,direction:1};const n=this.grid;return void 0!==n._sortState&&(n._sortState=this.sortState?{...this.sortState}:null),this.broadcast("sort-change",{field:r,direction:this.sortState?.direction??0}),this.requestRender(),!0}afterRender(){const e=this.gridElement?.querySelector(".rows");if(!e)return;const t=this.animationStyle,r=!1!==t&&this.keysToAnimate.size>0,n="fade"===t?"tbw-tree-fade-in":"tbw-tree-slide-in";for(const i of e.querySelectorAll(".data-grid-row")){const e=this.#l.get(i.__rowDataRef);e&&(e.hasChildren?i.setAttribute("aria-expanded",String(e.isExpanded)):i.hasAttribute("aria-expanded")&&i.removeAttribute("aria-expanded"),i.classList.toggle("tbw-row-expanded",e.hasChildren&&e.isExpanded),this.#S(e)?i.setAttribute("aria-busy","true"):i.hasAttribute("aria-busy")&&!i.classList.contains("tbw-row-loading")&&i.removeAttribute("aria-busy"),r&&e.key&&this.keysToAnimate.has(e.key)&&(i.classList.add(n),i.addEventListener("animationend",()=>i.classList.remove(n),{once:!0})))}this.keysToAnimate.clear()}expand(e){this.expandedKeys.add(e);const t=this.rowKeyMap.get(e);t&&this.requestLazyChildren(t),this.requestRender()}collapse(e){this.expandedKeys.delete(e),this.requestRender()}toggle(e){this.expandedKeys=p(this.expandedKeys,e);const t=this.rowKeyMap.get(e);t?(this.expandedKeys.has(e)&&this.requestLazyChildren(t),this.broadcast("tree-expand",{key:e,row:t.data,expanded:this.expandedKeys.has(e),depth:t.depth,expandedKeys:[...this.expandedKeys]})):this.emitPluginEvent("tree-expand",{expandedKeys:[...this.expandedKeys]}),this.requestRender()}expandAll(){this.expandedKeys=g(this.rows,this.config),this.emitPluginEvent("tree-expand",{expandedKeys:[...this.expandedKeys]}),this.requestRender()}collapseAll(){this.expandedKeys=/* @__PURE__ */new Set,this.emitPluginEvent("tree-expand",{expandedKeys:[...this.expandedKeys]}),this.requestRender()}isExpanded(e){return this.expandedKeys.has(e)}getExpandedKeys(){return[...this.expandedKeys]}getFlattenedRows(){return[...this.flattenedRows]}getRowMeta(e){return this.#l.get(e)}getRowByKey(e){return this.rowKeyMap.get(e)?.data}expandToKey(e){this.expandedKeys=f(this.rows,e,this.config,this.expandedKeys),this.requestRender()}};export{m as TreePlugin};
1
+ import{BaseGridPlugin as e,builtInSort as t}from"@toolbox-web/grid";import{HierarchyPlugin as r,buildHierarchy as n}from"@toolbox-web/grid/plugins/hierarchy";var i="expanded",s="tree-toggle",o="__otorp__|__retteGenifed__|__retteSenifed__|rotcurtsnoc|wodniw|sihTlabolg|labolg|ssecorp|noitcnuF|tropmi|lave|tcelfeR|yxorP|rorrE|stnemugra|tnemucod|noitacol|eikooc|egarotSlacol|egarotSnoisses|BDdexedni|hctef|tseuqeRpttHLMX|tekcoSbeW|rekroW|rekroWderahS|rekroWecivreS|renepo|tnerap|pot|semarf|fles".split("|").map(e=>e.split("").reverse().join("")),a=(new RegExp(`__(proto|defineGetter|defineSetter)|${o.slice(3).join("|")}|this\\b`),new Set("script|iframe|object|embed|form|input|button|textarea|select|link|meta|base|style|template|slot|portal|frame|frameset|applet|noscript|noembed|plaintext|xmp|listing|math".split("|"))),d=/^on\w+$/i,l=new Set("href|src|action|formaction|data|srcdoc|xlink:href|poster|srcset".split("|")),h=/^\s*(javascript|vbscript|data|blob):/i;function c(e){const t=document.createElement("template");return e&&"string"==typeof e&&(t.innerHTML=e,function(e){const t=[],r=e.querySelectorAll("*");for(const n of r){const e=n.tagName.toLowerCase();if(a.has(e)){t.push(n);continue}if(("svg"===e||"http://www.w3.org/2000/svg"===n.namespaceURI)&&Array.from(n.attributes).some(e=>d.test(e.name)||"href"===e.name||"xlink:href"===e.name)){t.push(n);continue}const r=[];for(const t of n.attributes){const e=t.name.toLowerCase();d.test(e)?r.push(t.name):"is"!==e?(l.has(e)&&h.test(t.value)||"style"===e&&/expression\s*\(|javascript:|behavior\s*:/i.test(t.value))&&r.push(t.name):r.push(t.name)}r.forEach(e=>n.removeAttribute(e))}t.forEach(e=>e.remove())}(t.content)),t.content}function u(e,t,r){return void 0!==e.id?String(e.id):r?`${r}-${t}`:String(t)}function p(e,t){const r=new Set(e);return r.has(t)?r.delete(t):r.add(t),r}function g(e,t,r=null,n=0){const i=t.childrenField??"children",s=/* @__PURE__ */new Set;for(let o=0;o<e.length;o++){const a=e[o],d=u(a,o,r),l=a[i];if(Array.isArray(l)&&l.length>0){s.add(d);const e=g(l,t,d,n+1);for(const t of e)s.add(t)}}return s}function w(e,t,r,n=null,i=0){const s=r.childrenField??"children";for(let o=0;o<e.length;o++){const a=e[o],d=u(a,o,n);if(d===t)return[d];const l=a[s];if(Array.isArray(l)&&l.length>0){const e=w(l,t,r,d,i+1);if(e)return[d,...e]}}return null}function f(e,t,r,n){const i=w(e,t,r);if(!i)return n;const s=new Set(n);for(let o=0;o<i.length-1;o++)s.add(i[o]);return s}function y(e,t="children",r){if(!Array.isArray(e)||0===e.length)return!1;for(const n of e){if(!n||!0===n.__loading)continue;const e=n[t];if(Array.isArray(e)&&e.length>0)return!0;if(null!=e&&!Array.isArray(e)&&e)return!0;if(r?.(n))return!0}return!1}var m=class extends e{static manifest={modifiesRowStructure:!0,hookPriority:{processRows:10,onCellClick:-10},incompatibleWith:[{name:"pivot",reason:"PivotPlugin replaces the entire row and column structure with aggregated pivot data. Tree hierarchy cannot coexist with pivot aggregation."}],events:[{type:"tree-expand",description:"Emitted when tree expansion state changes (toggle, expand all, collapse all). Broadcast to both DOM consumers and plugin bus."},{type:"tree-load-start",description:"Emitted when lazy child loading starts for a node whose children are not yet loaded."},{type:"tree-load-end",description:"Emitted when lazy child loading completes and children have been merged into the parent row."},{type:"tree-load-error",description:"Emitted when lazy child loading fails. The node leaves its loading state and can be retried."}],queries:[{type:"canMoveRow",description:"Returns false for rows with children (parent nodes cannot be reordered)"},{type:"datasource:viewport-mapping",description:"Translates flat viewport row indices to top-level node indices for ServerSide pagination."}]};static dependencies=[{name:"hierarchy",required:!0,reason:"Builds the hierarchical row model",provide:()=>new r},{name:"multiSort",required:!1,reason:"Queries sort model for coordinated tree sorting"},{name:"serverSide",required:!1,reason:"Consumes datasource events for lazy-loaded tree data"}];name="tree";hierarchyStage="structure";styles='@layer tbw-plugins{tbw-grid .cell[data-field=__tbw_expander]{justify-content:flex-start;align-items:center;padding:0;display:flex;border-inline-end:none!important}tbw-grid .header-row .cell[data-field=__tbw_expander]{display:none}tbw-grid .header-row .cell[data-field=__tbw_expander]+.cell{grid-column:1/3}tbw-grid .tree-cell-wrapper{vertical-align:middle;align-items:center;padding-inline-start:calc(var(--tbw-tree-depth,0) * var(--tbw-tree-indent-width,var(--tbw-tree-toggle-size,1.25em)));display:inline-flex;overflow:visible}tbw-grid .tree-expander{box-sizing:border-box;justify-content:flex-start;align-items:center;width:100%;height:100%;display:flex}tbw-grid .tree-toggle{cursor:pointer;-webkit-user-select:none;user-select:none;width:var(--tbw-tree-toggle-size,1.25em);height:var(--tbw-tree-toggle-size,1.25em);flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}tbw-grid .tree-toggle:hover{color:var(--tbw-tree-accent,var(--tbw-color-accent))}tbw-grid .tree-toggle{position:relative}tbw-grid .tree-toggle:after{content:"";inline-size:var(--tbw-touch-target-min,24px);block-size:var(--tbw-touch-target-min,24px);position:absolute;inset-block-start:50%;inset-inline-start:50%;translate:-50% -50%}tbw-grid .tree-spacer{width:var(--tbw-tree-toggle-size,1.25em);height:var(--tbw-tree-toggle-size,1.25em);flex-shrink:0;display:inline-block}@media (pointer:coarse){tbw-grid .tree-toggle,tbw-grid .tree-spacer{min-width:var(--tbw-touch-target-min,24px);min-height:var(--tbw-touch-target-min,24px)}}tbw-grid .tree-loading{--tbw-spinner-size:var(--tbw-tree-toggle-size,1.25em);flex-shrink:0}tbw-grid .data-grid-row.tbw-tree-slide-in{animation:tbw-tree-slide-in var(--tbw-animation-duration,.2s) var(--tbw-animation-easing,ease-out) forwards}tbw-grid .data-grid-row.tbw-tree-fade-in{animation:tbw-tree-fade-in var(--tbw-animation-duration,.2s) var(--tbw-animation-easing,ease-out) forwards}@keyframes tbw-tree-slide-in{0%{opacity:0;transform:translate(-8px)}to{opacity:1;transform:translate(0)}}@keyframes tbw-tree-fade-in{0%{opacity:0}to{opacity:1}}}';get defaultConfig(){return{childrenField:"children",autoDetect:!0,defaultExpanded:!1,indentWidth:20,showExpandIcons:!0,animation:"slide"}}expandedKeys=/* @__PURE__ */new Set;initialExpansionDone=!1;flattenedRows=[];rowKeyMap=/* @__PURE__ */new Map;previousVisibleKeys=/* @__PURE__ */new Set;keysToAnimate=/* @__PURE__ */new Set;#e=[];#t=0;sortState=null;#r=null;#n=/* @__PURE__ */new Map;#i=/* @__PURE__ */new WeakSet;#s=/* @__PURE__ */new WeakSet;#o=/* @__PURE__ */new WeakSet;#a=[];#d=/* @__PURE__ */new WeakMap;#l=/* @__PURE__ */new WeakMap;originalTreeColumnRenderer;originalTreeColumnRendererProperty="viewRenderer";wrappedTreeColumnField;#h=!1;#c=!1;detach(){this.expandedKeys.clear(),this.initialExpansionDone=!1,this.flattenedRows=[],this.#e=[],this.#t=0,this.rowKeyMap.clear(),this.previousVisibleKeys.clear(),this.keysToAnimate.clear(),this.sortState=null,this.#r=null,this.#i=/* @__PURE__ */new WeakSet,this.#s=/* @__PURE__ */new WeakSet,this.#o=/* @__PURE__ */new WeakSet,this.#a=[];for(const e of this.#n.values())e.controller.abort();this.#n.clear(),this.originalTreeColumnRenderer=void 0,this.originalTreeColumnRendererProperty="viewRenderer",this.wrappedTreeColumnField=void 0,this.#h=!1}handleQuery(e){if("canMoveRow"===e.type){const t=e.context,r=this.config.childrenField??"children",n=t?.[r];if(Array.isArray(n)&&n.length>0)return!1}if("datasource:viewport-mapping"===e.type){const{viewportStart:t,viewportEnd:r}=e.context;if(0===this.flattenedRows.length)return;return function(e,t,r,n){const i=e.length-1,s=t=>Math.max(0,e[Math.max(0,Math.min(t,i))]??0);return{startNode:s(r),endNode:s(n)+1,totalLoadedNodes:t}}(this.#e,this.#t,t,r)}}attach(e){super.attach(e),this.on("datasource:data",e=>{const t=e;t.claimed||(t.claimed=!0)}),this.on("datasource:children",e=>{const t=e;if("tree"!==t.context?.source)return;t.claimed=!0;const r=t.context.parentNode;if(r){const e=this.#u(r),n=this.#p(e,r);if(!n&&(this.#s.has(r)||this.#o.has(r)))return;this.#g(r,t.rows??[]),this.broadcast("tree-load-end",{key:e,row:r,depth:n?.depth??this.rowKeyMap.get(e)?.depth??0,childCount:t.rows?.length??0}),this.requestRender()}}),this.on("datasource:error",e=>{const t=e;if("tree"!==t.context?.source)return;const r=t.context.parentNode;if(!r)return;const n=this.#u(r),i=this.#p(n,r);i&&(this.broadcast("tree-load-error",{key:n,row:r,depth:i.depth,error:t.error}),this.requestRender())})}get animationStyle(){return!!this.isAnimationEnabled&&(this.config.animation??"slide")}detect(e){if(!this.config.autoDetect)return!1;const t=e,r=this.config.childrenField??function(e){if(!Array.isArray(e)||0===e.length)return null;const t=["children","items","nodes","subRows","nested"];for(const r of e)if(r&&"object"==typeof r)for(const e of t){const t=r[e];if(Array.isArray(t)&&t.length>0)return e}return null}(t)??"children";return y(t,r)}processRows(e){const t=this.grid?.getPluginByName?.("hierarchy");return t?t.process(e,this):n(e,[this])}beginHierarchy(e){const t=e;if(0===t.length||!y(t,this.config.childrenField??"children",this.config.hasChildren))return this.flattenedRows=[],this.#e=[],this.#t=0,this.rowKeyMap.clear(),this.previousVisibleKeys.clear(),this.#w(t),this.#f(),!1;const r="server"===this.grid?.query?.("datasource:sort-mode",null)?.[0];return this.#r=r?null:this.resolveEffectiveSortState(),this.config.defaultExpanded&&!this.initialExpansionDone&&(this.expandedKeys=g(t,this.config),this.initialExpansionDone=!0),this.#l=/* @__PURE__ */new WeakMap,!0}processSiblings(e,t){const{parentKey:r,depth:n}=t,i=this.config.childrenField??"children",s=this.config.hasChildren;for(let d=0;d<e.length;d++)this.#y(e[d].row,d,r);const o=this.#r,a=o?this.#m(e,o.field,o.direction):e;for(let d=0;d<a.length;d++){const e=a[d],t=e.row,o=this.#y(t,d,r),l=t[i],h=Array.isArray(l)&&l.length>0,c=h||!0!==t.__loading&&(s?s(t):null!=l&&!Array.isArray(l)&&!!l),u=this.expandedKeys.has(o);this.#l.set(t,{key:o,data:t,depth:n,hasChildren:c,isExpanded:u,parentKey:r,posInSet:d+1,setSize:a.length}),e.key=o,h&&u&&(e.expanded=!0,e.children=l.map(e=>({row:e})))}return a}endHierarchy(e,t){const r=this.#l;this.#l=/* @__PURE__ */new WeakMap,this.flattenedRows=[],this.rowKeyMap.clear(),this.keysToAnimate.clear();const n=/* @__PURE__ */new Set,i=new Array(e.length);let s=-1;for(let o=0;o<e.length;o++){const a=e[o],d=r.get(a);if(null===d?.parentKey&&s++,i[o]=s,!d)continue;const l=t(a)?.level;void 0!==l&&(d.depth=l-1),this.flattenedRows.push(d),this.rowKeyMap.set(d.key,d),this.#l.set(a,d),n.add(d.key),!this.previousVisibleKeys.has(d.key)&&d.depth>0&&this.keysToAnimate.add(d.key),this.#b(d)&&this.#x(d)}return this.previousVisibleKeys=n,this.#e=i,this.#t=s+1,this.#f(),!0}#f(){this.#c||(this.#c=!0,queueMicrotask(()=>{this.#c=!1,this.grid&&this.#h!==this.flattenedRows.length>0&&this.requestColumnsRender()}))}#y(e,t,r){if(void 0!==e.id){const t=String(e.id);return this.#d.set(e,t),t}const n=this.#d.get(e);if(void 0!==n)return n;const i=r?`${r}-${t}`:String(t);return this.#d.set(e,i),i}#m(e,t,r){const n=/* @__PURE__ */new Map;for(const i of e)n.set(i.row,i);return this.#v(e.map(e=>e.row),t,r).map(e=>n.get(e)??{row:e})}#v(e,r,n){const i=this.grid,s=i?._columns??[],o={field:r,direction:n},a=[...e],d=(i?.effectiveConfig?.sortHandler??t)(a,o,s);return d&&"function"==typeof d.then?(d.catch(()=>{}),t(a,o,s)):d}#u(e){return this.#d.get(e)??String(e.id??"?")}#g(e,t){e[this.config.childrenField??"children"]=t,this.#i.add(e)}#C(e){if(this.#i.has(e))return!1;const t=e[this.config.childrenField??"children"];if(Array.isArray(t)&&t.length>0)return!1;const r=this.config.hasChildren;return r?r(e):null!=t&&!Array.isArray(t)&&!!t}#b(e){if(!0===e.data.__loading)return!1;const t=this.#n.get(e.key);return t?t.row!==e.data:e.isExpanded&&e.hasChildren&&!this.#s.has(e.data)&&this.#C(e.data)}#w(e){if(0===this.#n.size)return;const t=/* @__PURE__ */new Map;for(let r=0;r<e.length;r++){const n=e[r];if(!0===n.__loading)continue;const i=void 0!==n.id?String(n.id):this.#d.get(n)??String(r);this.#n.has(i)&&t.set(i,n)}for(const[r,n]of t)this.#n.get(r)?.row!==n&&this.#x({key:r,data:n,depth:0,hasChildren:!1,isExpanded:!1,parentKey:null,posInSet:0,setSize:0},!0)}#x(e,t=!1){this.#a.push({meta:e,flat:t})>1||queueMicrotask(()=>{const e=this.#a;if(this.#a=[],!this.grid)return;let t=!1;for(const{meta:r,flat:n}of e){if(!n&&this.rowKeyMap.get(r.key)?.data!==r.data)continue;const e=this.#n.get(r.key);e&&e.row!==r.data&&this.#R(r.key),n||!this.expandedKeys.has(r.key)||this.#s.has(r.data)||(this.#s.add(r.data),t=this.requestLazyChildren(r)||t)}t&&this.requestRender()})}requestLazyChildren(e){const{key:t,depth:r,data:n}=e,i=this.#n.get(t);if(i?.row===n)return!1;if(!this.#C(n))return!1;const s=this.queryBoolean("datasource:is-active"),{loadChildren:o}=this.config;if(!s&&!o)return!1;i&&this.#R(t);const a=new AbortController;return this.#n.set(t,{row:n,depth:r,controller:a}),this.#s.add(n),this.#o.delete(n),this.broadcast("tree-load-start",{key:t,row:n,depth:r}),s?(this.grid.query("datasource:fetch-children",{context:{source:"tree",parentNode:n,nodePath:[t]},signal:a.signal}),!0):(this.#k(t,n,r,a),!0)}#S(e){return this.#n.get(e.key)?.row===e.data}#p(e,t){const r=this.#n.get(e);if(r?.row===t)return this.#n.delete(e),r}#R(e){const t=this.#n.get(e);t&&(this.#n.delete(e),this.#s.delete(t.row),this.#o.add(t.row),t.controller.abort(),this.broadcast("tree-load-end",{key:e,row:t.row,depth:t.depth,childCount:0,cancelled:!0}))}#k(e,t,r,n){const i=this.config.loadChildren,s=()=>!n.signal.aborted&&(this.#n.delete(e),!0),o=n=>{if(!s())return;const i=n??[];this.#g(t,i),this.broadcast("tree-load-end",{key:e,row:t,depth:r,childCount:i.length}),this.requestRender()},a=n=>{s()&&(this.broadcast("tree-load-error",{key:e,row:t,depth:r,error:n}),this.requestRender())};let d;try{d=i({row:t,key:e,depth:r,signal:n.signal})}catch(l){return void a(l)}if(d&&"function"==typeof d.subscribe){let e=!1,t=null;const r=()=>{e=!0,t?.unsubscribe(),t=null},i=d.subscribe({next:e=>{o(e),r()},error:e=>{a(e),r()}});return e?void i.unsubscribe():(t=i,void n.signal.addEventListener("abort",r,{once:!0}))}Promise.resolve(d).then(o,a)}resolveEffectiveSortState(){const e=this.grid?.query?.("sort:get-model",null);if(Array.isArray(e)&&e.length>0){const t=e[0];if(Array.isArray(t)&&t.length>0)return{field:t[0].field,direction:"desc"===t[0].direction?-1:1}}return this.sortState}processColumns(e){if(0===this.flattenedRows.length){const t=[...e];if(this.#h){const e=t.findIndex(e=>e.field===this.wrappedTreeColumnField);e>=0&&(t[e]={...t[e],renderer:"renderer"===this.originalTreeColumnRendererProperty?this.originalTreeColumnRenderer:void 0})}return this.#h=!1,this.originalTreeColumnRenderer=void 0,this.originalTreeColumnRendererProperty="viewRenderer",this.wrappedTreeColumnField=void 0,t}const t=[...e];if(0===t.length)return t;const{treeColumn:r}=this.config;let n=0;if(r){const e=t.findIndex(e=>e.field===r);e>=0&&(n=e)}const o=t[n],a=o.field;this.wrappedTreeColumnField!==a&&(this.originalTreeColumnRenderer=o.renderer||o.viewRenderer,this.originalTreeColumnRendererProperty=o.renderer?"renderer":"viewRenderer",this.wrappedTreeColumnField=a);const d=this.originalTreeColumnRenderer,l=()=>this.config,h=this.setIcon.bind(this);return t[n]={...o,renderer:e=>{const{row:t,value:r}=e,{showExpandIcons:n=!0,indentWidth:o}=l(),a=this.#l.get(t),u=a?.depth??0,p=document.createElement("span");if(p.className="tree-cell-wrapper",p.style.setProperty("--tbw-tree-depth",String(u)),void 0!==o&&p.style.setProperty("--tbw-tree-indent-width",`${o}px`),n)if(a&&this.#S(a)){const e=function(e){const t=document.createElement("div");return t.className=`tbw-spinner tbw-spinner--${e}`,t.setAttribute("role","progressbar"),t.setAttribute("aria-label","Loading"),t}("small");e.classList.add("tree-loading"),p.appendChild(e)}else if(a&&a.hasChildren){const e=document.createElement("span");e.className=`${s}${a.isExpanded?` ${i}`:""}`,h(e,a.isExpanded?"collapse":"expand"),e.setAttribute("data-tree-key",a.key),p.appendChild(e)}else{const e=document.createElement("span");e.className="tree-spacer",p.appendChild(e)}const g=document.createElement("span");if(g.className="tree-content",d){const t=d(e);t instanceof Node?g.appendChild(t):"string"==typeof t&&(w=g,(f=t)&&"string"==typeof f?-1!==f.indexOf("<")||-1!==f.indexOf("&")?w.replaceChildren(c(f)):w.textContent=f:w.replaceChildren())}else g.textContent=null!=r?String(r):"";var w,f;return p.appendChild(g),p}},this.#h=!0,t}onCellClick(e){const t=(e.originalEvent?.target)?.closest?.(`.${s}`);if(!t)return!1;if("dblclick"===e.originalEvent.type)return!0;const r=t.getAttribute("data-tree-key");if(!r)return!1;const n=this.rowKeyMap.get(r);return!!n&&(this.expandedKeys=p(this.expandedKeys,r),this.expandedKeys.has(r)&&this.requestLazyChildren(n),this.broadcast("tree-expand",{key:r,row:n.data,expanded:this.expandedKeys.has(r),depth:n.depth,expandedKeys:[...this.expandedKeys]}),this.requestRender(),!0)}onKeyDown(e){if(" "!==e.key)return;if(function(e){const t=e.composedPath?.()??[],r=t.length?t[0]:e.target;if(!(r instanceof HTMLElement))return!1;const n=r.tagName;return"INPUT"===n||"SELECT"===n||"TEXTAREA"===n||r.isContentEditable}(e))return;const t=this.grid._focusRow,r=this.#l.get(this.rows[t]);return r?.hasChildren?(e.preventDefault(),this.expandedKeys=p(this.expandedKeys,r.key),this.expandedKeys.has(r.key)&&this.requestLazyChildren(r),this.broadcast("tree-expand",{key:r.key,row:r.data,expanded:this.expandedKeys.has(r.key),depth:r.depth,expandedKeys:[...this.expandedKeys]}),this.requestRenderWithFocus(),!0):void 0}onHeaderClick(e){if(0===this.flattenedRows.length||!e.column.sortable)return!1;const t=this.grid?.query?.("sort:get-model",null);if(Array.isArray(t)&&t.length>0)return!1;const{field:r}=e.column;this.sortState&&this.sortState.field===r?1===this.sortState.direction?this.sortState={field:r,direction:-1}:this.sortState=null:this.sortState={field:r,direction:1};const n=this.grid;return void 0!==n._sortState&&(n._sortState=this.sortState?{...this.sortState}:null),this.broadcast("sort-change",{field:r,direction:this.sortState?.direction??0}),this.requestRender(),!0}afterRender(){const e=this.gridElement?.querySelector(".rows");if(!e)return;const t=this.animationStyle,r=!1!==t&&this.keysToAnimate.size>0,n="fade"===t?"tbw-tree-fade-in":"tbw-tree-slide-in";for(const i of e.querySelectorAll(".data-grid-row")){const e=this.#l.get(i.__rowDataRef);e&&(e.hasChildren?i.setAttribute("aria-expanded",String(e.isExpanded)):i.hasAttribute("aria-expanded")&&i.removeAttribute("aria-expanded"),i.classList.toggle("tbw-row-expanded",e.hasChildren&&e.isExpanded),this.#S(e)?i.setAttribute("aria-busy","true"):i.hasAttribute("aria-busy")&&!i.classList.contains("tbw-row-loading")&&i.removeAttribute("aria-busy"),r&&e.key&&this.keysToAnimate.has(e.key)&&(i.classList.add(n),i.addEventListener("animationend",()=>i.classList.remove(n),{once:!0})))}this.keysToAnimate.clear()}expand(e){this.expandedKeys.add(e);const t=this.rowKeyMap.get(e);t&&this.requestLazyChildren(t),this.requestRender()}collapse(e){this.expandedKeys.delete(e),this.requestRender()}toggle(e){this.expandedKeys=p(this.expandedKeys,e);const t=this.rowKeyMap.get(e);t?(this.expandedKeys.has(e)&&this.requestLazyChildren(t),this.broadcast("tree-expand",{key:e,row:t.data,expanded:this.expandedKeys.has(e),depth:t.depth,expandedKeys:[...this.expandedKeys]})):this.emitPluginEvent("tree-expand",{expandedKeys:[...this.expandedKeys]}),this.requestRender()}expandAll(){this.expandedKeys=g(this.rows,this.config),this.emitPluginEvent("tree-expand",{expandedKeys:[...this.expandedKeys]}),this.requestRender()}collapseAll(){this.expandedKeys=/* @__PURE__ */new Set,this.emitPluginEvent("tree-expand",{expandedKeys:[...this.expandedKeys]}),this.requestRender()}isExpanded(e){return this.expandedKeys.has(e)}getExpandedKeys(){return[...this.expandedKeys]}getFlattenedRows(){return[...this.flattenedRows]}getRowMeta(e){return this.#l.get(e)}getRowByKey(e){return this.rowKeyMap.get(e)?.data}expandToKey(e){this.expandedKeys=f(this.rows,e,this.config,this.expandedKeys),this.requestRender()}};export{m as TreePlugin};
2
2
  //# sourceMappingURL=index.js.map