@toolbox-web/grid 1.28.1 → 1.29.0
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.
- package/all.js +2 -2
- package/all.js.map +1 -1
- package/custom-elements.json +43 -1
- package/index.js +1 -1
- package/index.js.map +1 -1
- package/lib/core/constants.d.ts +1 -7
- package/lib/core/grid.d.ts +40 -3
- package/lib/core/internal/render-scheduler.d.ts +3 -1
- package/lib/core/plugin/base-plugin.d.ts +1 -1
- package/lib/core/plugin/plugin-manager.d.ts +2 -0
- package/lib/core/types.d.ts +59 -0
- package/lib/features/clipboard.d.ts +2 -0
- package/lib/features/clipboard.js.map +1 -1
- package/lib/features/column-virtualization.d.ts +2 -0
- package/lib/features/column-virtualization.js.map +1 -1
- package/lib/features/context-menu.d.ts +2 -0
- package/lib/features/context-menu.js.map +1 -1
- package/lib/features/editing.d.ts +2 -0
- package/lib/features/editing.js.map +1 -1
- package/lib/features/export.d.ts +2 -0
- package/lib/features/export.js.map +1 -1
- package/lib/features/filtering.d.ts +2 -0
- package/lib/features/filtering.js.map +1 -1
- package/lib/features/grouping-columns.d.ts +2 -0
- package/lib/features/grouping-columns.js.map +1 -1
- package/lib/features/grouping-rows.d.ts +2 -0
- package/lib/features/grouping-rows.js.map +1 -1
- package/lib/features/master-detail.d.ts +2 -0
- package/lib/features/master-detail.js.map +1 -1
- package/lib/features/multi-sort.d.ts +2 -0
- package/lib/features/multi-sort.js.map +1 -1
- package/lib/features/pinned-columns.d.ts +2 -1
- package/lib/features/pinned-columns.js.map +1 -1
- package/lib/features/pinned-rows.d.ts +2 -0
- package/lib/features/pinned-rows.js.map +1 -1
- package/lib/features/pivot.d.ts +2 -0
- package/lib/features/pivot.js.map +1 -1
- package/lib/features/print.d.ts +2 -0
- package/lib/features/print.js.map +1 -1
- package/lib/features/reorder-columns.d.ts +2 -0
- package/lib/features/reorder-columns.js.map +1 -1
- package/lib/features/reorder-rows.d.ts +2 -0
- package/lib/features/reorder-rows.js.map +1 -1
- package/lib/features/responsive.d.ts +2 -0
- package/lib/features/responsive.js.map +1 -1
- package/lib/features/selection.d.ts +2 -0
- package/lib/features/selection.js.map +1 -1
- package/lib/features/server-side.d.ts +2 -0
- package/lib/features/server-side.js.map +1 -1
- package/lib/features/tooltip.d.ts +2 -0
- package/lib/features/tooltip.js.map +1 -1
- package/lib/features/tree.d.ts +2 -0
- package/lib/features/tree.js.map +1 -1
- package/lib/features/undo-redo.d.ts +2 -0
- package/lib/features/undo-redo.js.map +1 -1
- package/lib/features/visibility.d.ts +2 -0
- package/lib/features/visibility.js.map +1 -1
- package/lib/plugins/clipboard/ClipboardPlugin.d.ts +0 -21
- package/lib/plugins/clipboard/index.js.map +1 -1
- package/lib/plugins/column-virtualization/ColumnVirtualizationPlugin.d.ts +0 -16
- package/lib/plugins/column-virtualization/index.js.map +1 -1
- package/lib/plugins/context-menu/index.js.map +1 -1
- package/lib/plugins/editing/index.js +1 -1
- package/lib/plugins/editing/index.js.map +1 -1
- package/lib/plugins/export/ExportPlugin.d.ts +0 -18
- package/lib/plugins/export/index.js.map +1 -1
- package/lib/plugins/filtering/FilteringPlugin.d.ts +0 -21
- package/lib/plugins/filtering/filter-model.d.ts +8 -1
- package/lib/plugins/filtering/index.js +1 -1
- package/lib/plugins/filtering/index.js.map +1 -1
- package/lib/plugins/grouping-columns/GroupingColumnsPlugin.d.ts +0 -16
- package/lib/plugins/grouping-columns/grouping-columns.d.ts +23 -3
- package/lib/plugins/grouping-columns/index.js +1 -1
- package/lib/plugins/grouping-columns/index.js.map +1 -1
- package/lib/plugins/grouping-rows/GroupingRowsPlugin.d.ts +0 -23
- package/lib/plugins/grouping-rows/index.js +2 -2
- package/lib/plugins/grouping-rows/index.js.map +1 -1
- package/lib/plugins/master-detail/MasterDetailPlugin.d.ts +0 -22
- package/lib/plugins/master-detail/index.js.map +1 -1
- package/lib/plugins/multi-sort/MultiSortPlugin.d.ts +0 -18
- package/lib/plugins/multi-sort/index.js +1 -1
- package/lib/plugins/multi-sort/index.js.map +1 -1
- package/lib/plugins/multi-sort/multi-sort.d.ts +7 -0
- package/lib/plugins/pinned-columns/index.js +1 -1
- package/lib/plugins/pinned-columns/index.js.map +1 -1
- package/lib/plugins/pinned-rows/PinnedRowsPlugin.d.ts +0 -11
- package/lib/plugins/pinned-rows/index.js.map +1 -1
- package/lib/plugins/pivot/PivotPlugin.d.ts +0 -24
- package/lib/plugins/pivot/index.js +1 -1
- package/lib/plugins/pivot/index.js.map +1 -1
- package/lib/plugins/print/PrintPlugin.d.ts +2 -21
- package/lib/plugins/print/index.js.map +1 -1
- package/lib/plugins/reorder-columns/ReorderPlugin.d.ts +0 -7
- package/lib/plugins/reorder-columns/index.js +1 -1
- package/lib/plugins/reorder-columns/index.js.map +1 -1
- package/lib/plugins/reorder-rows/RowReorderPlugin.d.ts +1 -13
- package/lib/plugins/reorder-rows/index.js +1 -1
- package/lib/plugins/reorder-rows/index.js.map +1 -1
- package/lib/plugins/responsive/index.js +1 -1
- package/lib/plugins/responsive/index.js.map +1 -1
- package/lib/plugins/selection/index.js +1 -1
- package/lib/plugins/selection/index.js.map +1 -1
- package/lib/plugins/server-side/ServerSidePlugin.d.ts +0 -16
- package/lib/plugins/server-side/index.js.map +1 -1
- package/lib/plugins/tooltip/index.js.map +1 -1
- package/lib/plugins/tree/TreePlugin.d.ts +0 -22
- package/lib/plugins/tree/index.js +1 -1
- package/lib/plugins/tree/index.js.map +1 -1
- package/lib/plugins/undo-redo/UndoRedoPlugin.d.ts +0 -19
- package/lib/plugins/undo-redo/index.js +1 -1
- package/lib/plugins/undo-redo/index.js.map +1 -1
- package/lib/plugins/visibility/VisibilityPlugin.d.ts +0 -16
- package/lib/plugins/visibility/index.js +1 -1
- package/lib/plugins/visibility/index.js.map +1 -1
- package/package.json +1 -1
- package/themes/dg-theme-material.css +5 -0
- package/umd/grid.all.umd.js +1 -1
- package/umd/grid.all.umd.js.map +1 -1
- package/umd/grid.umd.js +1 -1
- package/umd/grid.umd.js.map +1 -1
- package/umd/plugins/clipboard.umd.js.map +1 -1
- package/umd/plugins/column-virtualization.umd.js.map +1 -1
- package/umd/plugins/export.umd.js.map +1 -1
- package/umd/plugins/filtering.umd.js +1 -1
- package/umd/plugins/filtering.umd.js.map +1 -1
- package/umd/plugins/grouping-columns.umd.js +1 -1
- package/umd/plugins/grouping-columns.umd.js.map +1 -1
- package/umd/plugins/grouping-rows.umd.js +1 -1
- package/umd/plugins/grouping-rows.umd.js.map +1 -1
- package/umd/plugins/master-detail.umd.js.map +1 -1
- package/umd/plugins/multi-sort.umd.js +1 -1
- package/umd/plugins/multi-sort.umd.js.map +1 -1
- package/umd/plugins/pinned-columns.umd.js +1 -1
- package/umd/plugins/pinned-columns.umd.js.map +1 -1
- package/umd/plugins/pinned-rows.umd.js.map +1 -1
- package/umd/plugins/pivot.umd.js +1 -1
- package/umd/plugins/pivot.umd.js.map +1 -1
- package/umd/plugins/print.umd.js.map +1 -1
- package/umd/plugins/reorder-columns.umd.js +1 -1
- package/umd/plugins/reorder-columns.umd.js.map +1 -1
- package/umd/plugins/reorder-rows.umd.js +1 -1
- package/umd/plugins/reorder-rows.umd.js.map +1 -1
- package/umd/plugins/selection.umd.js +1 -1
- package/umd/plugins/selection.umd.js.map +1 -1
- package/umd/plugins/server-side.umd.js.map +1 -1
- package/umd/plugins/tree.umd.js +1 -1
- package/umd/plugins/tree.umd.js.map +1 -1
- package/umd/plugins/undo-redo.umd.js +1 -1
- package/umd/plugins/undo-redo.umd.js.map +1 -1
- package/umd/plugins/visibility.umd.js +1 -1
- package/umd/plugins/visibility.umd.js.map +1 -1
|
@@ -10,6 +10,13 @@ import { SortModel } from './types';
|
|
|
10
10
|
* @returns New sorted array (does not mutate original)
|
|
11
11
|
*/
|
|
12
12
|
export declare function applySorts<TRow = unknown>(rows: TRow[], sorts: SortModel[], columns: ColumnConfig<TRow>[]): TRow[];
|
|
13
|
+
/**
|
|
14
|
+
* Sort an array in-place using multiple sort columns.
|
|
15
|
+
* Pre-resolves column comparators to avoid O(n·log·n·m) column lookups
|
|
16
|
+
* inside the comparator.
|
|
17
|
+
* @internal
|
|
18
|
+
*/
|
|
19
|
+
export declare function sortRowsInPlace<TRow = unknown>(rows: TRow[], sorts: SortModel[], columns: ColumnConfig<TRow>[]): void;
|
|
13
20
|
/**
|
|
14
21
|
* Default comparator for sorting values.
|
|
15
22
|
* Handles nulls, numbers, dates, and strings.
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
function t(t){try{if("rtl"===getComputedStyle(t).direction)return"rtl"}catch{}try{const e=t.closest?.("[dir]")?.getAttribute("dir");if("rtl"===e)return"rtl"}catch{}return"ltr"}function e(t,e){return`[tbw-grid${t?`#${t}`:""}${e?`:${e}`:""}]`}function i(t,i,n,r){return`${e(n,r)} ${t}: ${i}\n\n → More info: ${function(t){return`https://toolboxjs.com/grid/errors#${t.toLowerCase()}`}(t)}`}const n=/* @__PURE__ */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"]),r=/^on\w+$/i,s=/* @__PURE__ */new Set(["href","src","action","formaction","data","srcdoc","xlink:href","poster","srcset"]),o=/^\s*(javascript|vbscript|data|blob):/i;function l(t){if(!t||"string"!=typeof t)return"";if(-1===t.indexOf("<"))return t;const e=document.createElement("template");return e.innerHTML=t,function(t){const e=[],i=t.querySelectorAll("*");for(const l of i){const t=l.tagName.toLowerCase();if(n.has(t)){e.push(l);continue}if("svg"===t||"http://www.w3.org/2000/svg"===l.namespaceURI){if(Array.from(l.attributes).some(t=>r.test(t.name)||"href"===t.name||"xlink:href"===t.name)){e.push(l);continue}}const i=[];for(const e of l.attributes){const t=e.name.toLowerCase();r.test(t)?i.push(e.name):(s.has(t)&&o.test(e.value)||"style"===t&&/expression\s*\(|javascript:|behavior\s*:/i.test(e.value))&&i.push(e.name)}i.forEach(t=>l.removeAttribute(t))}e.forEach(t=>t.remove())}(e.content),e.innerHTML}const c='<svg viewBox="0 0 16 16" width="12" height="12"><path fill="currentColor" d="M6 10.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 0 1h-3a.5.5 0 0 1-.5-.5zm-2-3a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7a.5.5 0 0 1-.5-.5zm-2-3a.5.5 0 0 1 .5-.5h11a.5.5 0 0 1 0 1h-11a.5.5 0 0 1-.5-.5z"/></svg>',d={expand:"▶",collapse:"▼",sortAsc:"▲",sortDesc:"▼",sortNone:"⇅",submenuArrow:"▶",dragHandle:"⋮⋮",toolPanel:"☰",filter:c,filterActive:c,print:"🖨️"};class a{static dependencies;static manifest;aliases;version="undefined"!=typeof __GRID_VERSION__?__GRID_VERSION__:"dev";styles;cellRenderers;headerRenderers;cellEditors;grid;config;userConfig;#t;get defaultConfig(){return{}}constructor(t={}){this.userConfig=t}attach(t){this.#t?.abort(),this.#t=new AbortController,this.grid=t,this.config={...this.defaultConfig,...this.userConfig}}detach(){this.#t?.abort(),this.#t=void 0}getPlugin(t){return this.grid?.getPlugin(t)}emit(t,e){this.grid?.dispatchEvent?.(new CustomEvent(t,{detail:e,bubbles:!0}))}emitCancelable(t,e){const i=new CustomEvent(t,{detail:e,bubbles:!0,cancelable:!0});return this.grid?.dispatchEvent?.(i),i.defaultPrevented}on(t,e){this.grid?._pluginManager?.subscribe(this,t,e)}off(t){this.grid?._pluginManager?.unsubscribe(this,t)}emitPluginEvent(t,e){this.grid?._pluginManager?.emitPluginEvent(t,e)}requestRender(){this.grid?.requestRender?.()}requestColumnsRender(){this.grid?.requestColumnsRender?.()}requestRenderWithFocus(){this.grid?.requestRenderWithFocus?.()}requestAfterRender(){this.grid?.requestAfterRender?.()}requestVirtualRefresh(){this.grid?.requestVirtualRefresh?.()}get rows(){return this.grid?.rows??[]}get sourceRows(){return this.grid?.sourceRows??[]}get columns(){return this.grid?.columns??[]}get visibleColumns(){return this.grid?._visibleColumns??[]}get gridElement(){return this.grid?._hostElement}get disconnectSignal(){return this.#t?.signal??this.grid?.disconnectSignal}get gridIcons(){const t=this.grid?.gridConfig?.icons??{};return{...d,...t}}get isAnimationEnabled(){const t=this.grid?.effectiveConfig?.animation?.mode??"reduced-motion";if(!1===t||"off"===t)return!1;if(!0===t||"on"===t)return!0;const e=this.gridElement;if(e){return"0"!==getComputedStyle(e).getPropertyValue("--tbw-animation-enabled").trim()}return!0}get animationDuration(){const t=this.gridElement;if(t){const e=getComputedStyle(t).getPropertyValue("--tbw-animation-duration").trim(),i=parseInt(e,10);if(!isNaN(i))return i}return 200}resolveIcon(t,e){return void 0!==e?e:this.gridIcons[t]}setIcon(t,e){"string"==typeof e?t.innerHTML=l(e):e instanceof HTMLElement&&(t.innerHTML="",t.appendChild(e.cloneNode(!0)))}warn(t,n){void 0!==n?console.warn(i(t,n,this.gridElement.id,this.name)):console.warn(`${e(this.gridElement.id,this.name)} ${t}`)}throwDiagnostic(t,e){throw new Error(i(t,e,this.gridElement.id,this.name))}}function u(t){return t.pinned??t.sticky??t.meta?.pinned??t.meta?.sticky}function f(t,e){return function(t,e){return"left"===t||"right"===t?t:"rtl"===e?"start"===t?"right":"left":"start"===t?"left":"right"}(t,e)}function h(t,e){const i=u(t);return!!i&&"left"===f(i,e)}function g(t,e){const i=u(t);return!!i&&"right"===f(i,e)}function p(t){return t.some(t=>null!=u(t))}function m(e,i){const n={addGroupEnd:/* @__PURE__ */new Set,removeGroupEnd:/* @__PURE__ */new Set},r=Array.from(e.querySelectorAll(".header-row .cell"));if(!r.length)return n;const s=t(e);let o=0;for(const t of i)if(h(t,s)){const i=r.find(e=>e.getAttribute("data-field")===t.field);i&&(i.classList.add("sticky-left"),i.style.position="sticky",i.style.left=o+"px",e.querySelectorAll(`.data-grid-row .cell[data-field="${t.field}"]`).forEach(t=>{t.classList.add("sticky-left"),t.style.position="sticky",t.style.left=o+"px"}),o+=i.offsetWidth)}let l=0;for(const t of[...i].reverse())if(g(t,s)){const i=r.find(e=>e.getAttribute("data-field")===t.field);i&&(i.classList.add("sticky-right"),i.style.position="sticky",i.style.right=l+"px",e.querySelectorAll(`.data-grid-row .cell[data-field="${t.field}"]`).forEach(t=>{t.classList.add("sticky-right"),t.style.position="sticky",t.style.right=l+"px"}),l+=i.offsetWidth)}const c=function(t,e,i,n){const r={addGroupEnd:/* @__PURE__ */new Set,removeGroupEnd:/* @__PURE__ */new Set},s=Array.from(t.querySelectorAll(".header-group-row .header-group-cell"));if(!s.length)return r;for(const o of s){const t=o.style.gridColumn;if(!t)continue;const s=t.match(/^(\d+)\s*\/\s*span\s+(\d+)$/);if(!s)continue;const l=parseInt(s[1],10)-1,c=l+parseInt(s[2],10)-1,d=e.slice(l,c+1);if(!d.length)continue;const a=d.every(t=>h(t,n)),u=d.every(t=>g(t,n));if(a){const t=d[0].field,e=i.find(e=>e.getAttribute("data-field")===t);e&&(o.classList.add("sticky-left"),o.style.position="sticky",o.style.left=e.style.left)}else if(u){const t=d[d.length-1].field,e=i.find(e=>e.getAttribute("data-field")===t);e&&(o.classList.add("sticky-right"),o.style.position="sticky",o.style.right=e.style.right)}else o.classList.contains("implicit-group")&&b(o,d,l,i,n,r)}return r}(e,i,r,s);if(c.addGroupEnd.size>0||c.removeGroupEnd.size>0){for(const t of c.addGroupEnd){const i=r.find(e=>e.getAttribute("data-field")===t);i&&i.classList.add("group-end"),e.querySelectorAll(`.data-grid-row .cell[data-field="${t}"]`).forEach(t=>{t.classList.add("group-end")})}for(const t of c.removeGroupEnd){const i=r.find(e=>e.getAttribute("data-field")===t);i&&i.classList.remove("group-end"),e.querySelectorAll(`.data-grid-row .cell[data-field="${t}"]`).forEach(t=>{t.classList.remove("group-end")})}}return c}function y(t,e){return h(t,e)?"left":g(t,e)?"right":"none"}function b(t,e,i,n,r,s){const o=[];for(let d=0;d<e.length;d++){const t=y(e[d],r),n=o[o.length-1];n&&n.state===t?n.cols.push(e[d]):o.push({state:t,cols:[e[d]],colStart:i+d})}if(o.length<=1)return;const l=t.parentElement;if(!l)return;const c=t.nextSibling;l.removeChild(t);for(const d of o){const e=document.createElement("div");if(e.className=t.className,e.setAttribute("data-group",t.getAttribute("data-group")||""),e.style.gridColumn=`${d.colStart+1} / span ${d.cols.length}`,"left"===d.state){const t=d.cols[0].field,i=n.find(e=>e.getAttribute("data-field")===t);i&&(e.classList.add("sticky-left"),e.style.position="sticky",e.style.left=i.style.left)}else if("right"===d.state){const t=d.cols[d.cols.length-1].field,i=n.find(e=>e.getAttribute("data-field")===t);i&&(e.classList.add("sticky-right"),e.style.position="sticky",e.style.right=i.style.right)}else if("none"===d.state){d.cols.every(t=>String(t.field||"").startsWith("__tbw_"))&&(e.style.borderRightStyle="none")}c?l.insertBefore(e,c):l.appendChild(e)}for(let d=0;d<o.length;d++){const t=o[d],e=o[d+1];if("none"!==t.state&&e&&"none"===e.state){const e=t.cols[t.cols.length-1].field;e&&s.addGroupEnd.add(e)}if("none"===t.state){if(t.cols.every(t=>String(t.field||"").startsWith("__tbw_"))){const e=t.cols[t.cols.length-1].field;e&&s.removeGroupEnd.add(e)}}}}function E(t){t.querySelectorAll(".sticky-left, .sticky-right").forEach(t=>{t.classList.remove("sticky-left","sticky-right"),t.style.position="",t.style.left="",t.style.right=""})}const v="canMoveColumn";class C extends a{static manifest={ownedProperties:[{property:"pinned",level:"column",description:'the "pinned" column property',isUsed:t=>"left"===t||"right"===t||"start"===t||"end"===t},{property:"sticky",level:"column",description:'the "sticky" column property (deprecated, use "pinned")',isUsed:t=>"left"===t||"right"===t||"start"===t||"end"===t}],queries:[{type:v,description:"Prevents pinned (sticky) columns from being moved/reordered"},{type:"getStickyOffsets",description:"Returns the sticky offsets for left/right pinned columns"},{type:"getContextMenuItems",description:"Contributes pin/unpin items to the header context menu"}]};name="pinnedColumns";get defaultConfig(){return{}}isApplied=!1;leftOffsets=/* @__PURE__ */new Map;rightOffsets=/* @__PURE__ */new Map;#e={addGroupEnd:/* @__PURE__ */new Set,removeGroupEnd:/* @__PURE__ */new Set};#i=[];detach(){this.leftOffsets.clear(),this.rightOffsets.clear(),this.isApplied=!1,this.#e={addGroupEnd:/* @__PURE__ */new Set,removeGroupEnd:/* @__PURE__ */new Set},this.#i=[]}static detect(t,e){const i=e?.columns;return!!Array.isArray(i)&&p(i)}processColumns(e){const i=[...e];if(this.isApplied=p(i),!this.isApplied)return i;const n=this.gridElement;return function(t,e="ltr"){const i=[],n=[],r=[];for(const s of t){const t=u(s);t?"left"===f(t,e)?i.push(s):r.push(s):n.push(s)}return[...i,...n,...r]}(i,n?t(n):"ltr")}afterRender(){if(!this.isApplied)return;const t=this.gridElement,e=[...this.columns];if(!p(e))return E(t),void(this.isApplied=!1);queueMicrotask(()=>{this.#e=m(t,e)})}afterCellRender(t){if(!this.isApplied)return;const e=t.column.field;this.#e.addGroupEnd.has(e)?t.cellElement.classList.add("group-end"):this.#e.removeGroupEnd.has(e)&&t.cellElement.classList.remove("group-end")}handleQuery(t){switch(t.type){case v:return null==u(t.context)&&void 0;case"getStickyOffsets":return{left:Object.fromEntries(this.leftOffsets),right:Object.fromEntries(this.rightOffsets)};case"getContextMenuItems":{const e=t.context;if(!e.isHeader)return;const i=e.column;if(!i?.field)return;if(i.meta?.lockPinning)return;const n=[];return null!=u(i)?n.push({id:"pinned/unpin",label:"Unpin Column",icon:"📌",order:40,action:()=>this.setPinPosition(i.field,void 0)}):(n.push({id:"pinned/pin-left",label:"Pin Left",icon:"⬅",order:40,action:()=>this.setPinPosition(i.field,"left")}),n.push({id:"pinned/pin-right",label:"Pin Right",icon:"➡",order:41,action:()=>this.setPinPosition(i.field,"right")})),n}default:return}}setPinPosition(t,e){const i=this.columns;if(!i?.length)return;const n=i.findIndex(e=>e.field===t);if(-1===n)return;const r=this.gridElement;if(e){0===this.#i.length&&(this.#i=i.map(t=>t.field));const n=i.map(i=>{if(i.field!==t)return i;const n={...i};return n.pinned=e,delete n.sticky,n});r.columns=n}else{const e={...i[n]};delete e.pinned,delete e.sticky;const s=[...i];s.splice(n,1);const o=this.#i.indexOf(t);if(o>=0){let t=s.length;for(let e=0;e<s.length;e++){if(u(s[e]))continue;if(this.#i.indexOf(s[e].field)>o){t=e;break}}s.splice(t,0,e)}else s.splice(Math.min(n,s.length),0,e);s.some(t=>null!=u(t))||(this.#i=[]),r.columns=s}}refreshStickyOffsets(){const t=[...this.columns];m(this.gridElement,t)}getLeftPinnedColumns(){return function(t,e="ltr"){return t.filter(t=>h(t,e))}([...this.columns],t(this.gridElement))}getRightPinnedColumns(){return function(t,e="ltr"){return t.filter(t=>g(t,e))}([...this.columns],t(this.gridElement))}clearStickyPositions(){E(this.gridElement)}getHorizontalScrollOffsets(t,e){if(!this.isApplied)return;let i=0,n=0;if(t){const e=t.querySelectorAll(".sticky-left"),r=t.querySelectorAll(".sticky-right");e.forEach(t=>{i+=t.offsetWidth}),r.forEach(t=>{n+=t.offsetWidth})}else{this.gridElement.querySelectorAll(".header-row .cell").forEach(t=>{t.classList.contains("sticky-left")?i+=t.offsetWidth:t.classList.contains("sticky-right")&&(n+=t.offsetWidth)})}const r=e?.classList.contains("sticky-left")||e?.classList.contains("sticky-right");return{left:i,right:n,skipScroll:r}}}export{C as PinnedColumnsPlugin};
|
|
1
|
+
const t="sticky-left",e="sticky-right";function n(t){try{if("rtl"===getComputedStyle(t).direction)return"rtl"}catch{}try{const e=t.closest?.("[dir]")?.getAttribute("dir");if("rtl"===e)return"rtl"}catch{}return"ltr"}function i(t,e){return`[tbw-grid${t?`#${t}`:""}${e?`:${e}`:""}]`}function r(t,e,n,r){return`${i(n,r)} ${t}: ${e}\n\n → More info: ${function(t){return`https://toolboxjs.com/grid/errors#${t.toLowerCase()}`}(t)}`}const s=/* @__PURE__ */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"]),o=/^on\w+$/i,l=/* @__PURE__ */new Set(["href","src","action","formaction","data","srcdoc","xlink:href","poster","srcset"]),d=/^\s*(javascript|vbscript|data|blob):/i;function c(t){if(!t||"string"!=typeof t)return"";if(-1===t.indexOf("<"))return t;const e=document.createElement("template");return e.innerHTML=t,function(t){const e=[],n=t.querySelectorAll("*");for(const i of n){const t=i.tagName.toLowerCase();if(s.has(t)){e.push(i);continue}if("svg"===t||"http://www.w3.org/2000/svg"===i.namespaceURI){if(Array.from(i.attributes).some(t=>o.test(t.name)||"href"===t.name||"xlink:href"===t.name)){e.push(i);continue}}const n=[];for(const e of i.attributes){const t=e.name.toLowerCase();o.test(t)?n.push(e.name):(l.has(t)&&d.test(e.value)||"style"===t&&/expression\s*\(|javascript:|behavior\s*:/i.test(e.value))&&n.push(e.name)}n.forEach(t=>i.removeAttribute(t))}e.forEach(t=>t.remove())}(e.content),e.innerHTML}const a='<svg viewBox="0 0 16 16" width="12" height="12"><path fill="currentColor" d="M6 10.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 0 1h-3a.5.5 0 0 1-.5-.5zm-2-3a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7a.5.5 0 0 1-.5-.5zm-2-3a.5.5 0 0 1 .5-.5h11a.5.5 0 0 1 0 1h-11a.5.5 0 0 1-.5-.5z"/></svg>',u={expand:"▶",collapse:"▼",sortAsc:"▲",sortDesc:"▼",sortNone:"⇅",submenuArrow:"▶",dragHandle:"⋮⋮",toolPanel:"☰",filter:a,filterActive:a,print:"🖨️"};class f{static dependencies;static manifest;aliases;version="undefined"!=typeof __GRID_VERSION__?__GRID_VERSION__:"dev";styles;cellRenderers;headerRenderers;cellEditors;grid;config;userConfig;#t;get defaultConfig(){return{}}constructor(t={}){this.userConfig=t}attach(t){this.#t?.abort(),this.#t=new AbortController,this.grid=t,this.config={...this.defaultConfig,...this.userConfig}}detach(){this.#t?.abort(),this.#t=void 0}getPlugin(t){return this.grid?.getPlugin(t)}emit(t,e){this.grid?.dispatchEvent?.(new CustomEvent(t,{detail:e,bubbles:!0}))}emitCancelable(t,e){const n=new CustomEvent(t,{detail:e,bubbles:!0,cancelable:!0});return this.grid?.dispatchEvent?.(n),n.defaultPrevented}on(t,e){this.grid?._pluginManager?.subscribe(this,t,e)}off(t){this.grid?._pluginManager?.unsubscribe(this,t)}emitPluginEvent(t,e){this.grid?._pluginManager?.emitPluginEvent(t,e)}requestRender(){this.grid?.requestRender?.()}requestColumnsRender(){this.grid?.requestColumnsRender?.()}requestRenderWithFocus(){this.grid?.requestRenderWithFocus?.()}requestAfterRender(){this.grid?.requestAfterRender?.()}requestVirtualRefresh(){this.grid?.requestVirtualRefresh?.()}get rows(){return this.grid?.rows??[]}get sourceRows(){return this.grid?.sourceRows??[]}get columns(){return this.grid?.columns??[]}get visibleColumns(){return this.grid?._visibleColumns??[]}get gridElement(){return this.grid?._hostElement}get disconnectSignal(){return this.#t?.signal??this.grid?.disconnectSignal}get gridIcons(){const t=this.grid?.gridConfig?.icons??{};return{...u,...t}}get isAnimationEnabled(){const t=this.grid?.effectiveConfig?.animation?.mode??"reduced-motion";if(!1===t||"off"===t)return!1;if(!0===t||"on"===t)return!0;const e=this.gridElement;if(e){return"0"!==getComputedStyle(e).getPropertyValue("--tbw-animation-enabled").trim()}return!0}get animationDuration(){const t=this.gridElement;if(t){const e=getComputedStyle(t).getPropertyValue("--tbw-animation-duration").trim(),n=parseInt(e,10);if(!isNaN(n))return n}return 200}resolveIcon(t,e){return void 0!==e?e:this.gridIcons[t]}setIcon(t,e){"string"==typeof e?t.innerHTML=c(e):e instanceof HTMLElement&&(t.innerHTML="",t.appendChild(e.cloneNode(!0)))}warn(t,e){void 0!==e?console.warn(r(t,e,this.gridElement.id,this.name)):console.warn(`${i(this.gridElement.id,this.name)} ${t}`)}throwDiagnostic(t,e){throw new Error(r(t,e,this.gridElement.id,this.name))}}function h(t){return t.pinned??t.sticky??t.meta?.pinned??t.meta?.sticky}function g(t,e){return function(t,e){return"left"===t||"right"===t?t:"rtl"===e?"start"===t?"right":"left":"start"===t?"left":"right"}(t,e)}function p(t,e){const n=h(t);return!!n&&"left"===g(n,e)}function m(t,e){const n=h(t);return!!n&&"right"===g(n,e)}function y(t){return t.some(t=>null!=h(t))}function b(i,r){const s={addGroupEnd:/* @__PURE__ */new Set,removeGroupEnd:/* @__PURE__ */new Set},o=Array.from(i.querySelectorAll(".header-row .cell"));if(!o.length)return s;const l=n(i);let d=0;for(const e of r)if(p(e,l)){const n=o.find(t=>t.getAttribute("data-field")===e.field);n&&(n.classList.add(t),n.style.position="sticky",n.style.left=d+"px",i.querySelectorAll(`.data-grid-row .cell[data-field="${e.field}"]`).forEach(e=>{e.classList.add(t),e.style.position="sticky",e.style.left=d+"px"}),d+=n.offsetWidth)}let c=0;for(const t of[...r].reverse())if(m(t,l)){const n=o.find(e=>e.getAttribute("data-field")===t.field);n&&(n.classList.add(e),n.style.position="sticky",n.style.right=c+"px",i.querySelectorAll(`.data-grid-row .cell[data-field="${t.field}"]`).forEach(t=>{t.classList.add(e),t.style.position="sticky",t.style.right=c+"px"}),c+=n.offsetWidth)}const a=function(n,i,r,s){const o={addGroupEnd:/* @__PURE__ */new Set,removeGroupEnd:/* @__PURE__ */new Set},l=Array.from(n.querySelectorAll(".header-group-row .header-group-cell"));if(!l.length)return o;for(const d of l){const n=d.style.gridColumn;if(!n)continue;const l=n.match(/^(\d+)\s*\/\s*span\s+(\d+)$/);if(!l)continue;const c=parseInt(l[1],10)-1,a=c+parseInt(l[2],10)-1,u=i.slice(c,a+1);if(!u.length)continue;const f=u.every(t=>p(t,s)),h=u.every(t=>m(t,s));if(f){const e=u[0].field,n=r.find(t=>t.getAttribute("data-field")===e);n&&(d.classList.add(t),d.style.position="sticky",d.style.left=n.style.left)}else if(h){const t=u[u.length-1].field,n=r.find(e=>e.getAttribute("data-field")===t);n&&(d.classList.add(e),d.style.position="sticky",d.style.right=n.style.right)}else d.classList.contains("implicit-group")&&v(d,u,c,r,s,o)}return o}(i,r,o,l);if(a.addGroupEnd.size>0||a.removeGroupEnd.size>0){for(const t of a.addGroupEnd){const e=o.find(e=>e.getAttribute("data-field")===t);e&&e.classList.add("group-end"),i.querySelectorAll(`.data-grid-row .cell[data-field="${t}"]`).forEach(t=>{t.classList.add("group-end")})}for(const t of a.removeGroupEnd){const e=o.find(e=>e.getAttribute("data-field")===t);e&&e.classList.remove("group-end"),i.querySelectorAll(`.data-grid-row .cell[data-field="${t}"]`).forEach(t=>{t.classList.remove("group-end")})}}return a}function E(t,e){return p(t,e)?"left":m(t,e)?"right":"none"}function v(n,i,r,s,o,l){const d=[];for(let t=0;t<i.length;t++){const e=E(i[t],o),n=d[d.length-1];n&&n.state===e?n.cols.push(i[t]):d.push({state:e,cols:[i[t]],colStart:r+t})}if(d.length<=1)return;const c=n.parentElement;if(!c)return;const a=n.nextSibling;c.removeChild(n);for(const u of d){const i=document.createElement("div");if(i.className=n.className,i.setAttribute("data-group",n.getAttribute("data-group")||""),i.style.gridColumn=`${u.colStart+1} / span ${u.cols.length}`,"left"===u.state){const e=u.cols[0].field,n=s.find(t=>t.getAttribute("data-field")===e);n&&(i.classList.add(t),i.style.position="sticky",i.style.left=n.style.left)}else if("right"===u.state){const t=u.cols[u.cols.length-1].field,n=s.find(e=>e.getAttribute("data-field")===t);n&&(i.classList.add(e),i.style.position="sticky",i.style.right=n.style.right)}else if("none"===u.state){u.cols.every(t=>String(t.field||"").startsWith("__tbw_"))&&(i.style.borderRightStyle="none")}a?c.insertBefore(i,a):c.appendChild(i)}for(let t=0;t<d.length;t++){const e=d[t],n=d[t+1];if("none"!==e.state&&n&&"none"===n.state){const t=e.cols[e.cols.length-1].field;t&&l.addGroupEnd.add(t)}if("none"===e.state){if(e.cols.every(t=>String(t.field||"").startsWith("__tbw_"))){const t=e.cols[e.cols.length-1].field;t&&l.removeGroupEnd.add(t)}}}}function C(n){n.querySelectorAll(`.${t}, .${e}`).forEach(n=>{n.classList.remove(t,e),n.style.position="",n.style.left="",n.style.right=""})}const w="canMoveColumn";class A extends f{static manifest={ownedProperties:[{property:"pinned",level:"column",description:'the "pinned" column property',isUsed:t=>"left"===t||"right"===t||"start"===t||"end"===t},{property:"sticky",level:"column",description:'the "sticky" column property (deprecated, use "pinned")',isUsed:t=>"left"===t||"right"===t||"start"===t||"end"===t}],queries:[{type:w,description:"Prevents pinned (sticky) columns from being moved/reordered"},{type:"getStickyOffsets",description:"Returns the sticky offsets for left/right pinned columns"},{type:"getContextMenuItems",description:"Contributes pin/unpin items to the header context menu"}]};name="pinnedColumns";get defaultConfig(){return{}}isApplied=!1;leftOffsets=/* @__PURE__ */new Map;rightOffsets=/* @__PURE__ */new Map;#e={addGroupEnd:/* @__PURE__ */new Set,removeGroupEnd:/* @__PURE__ */new Set};#n=[];detach(){this.leftOffsets.clear(),this.rightOffsets.clear(),this.isApplied=!1,this.#e={addGroupEnd:/* @__PURE__ */new Set,removeGroupEnd:/* @__PURE__ */new Set},this.#n=[]}static detect(t,e){const n=e?.columns;return!!Array.isArray(n)&&y(n)}processColumns(t){const e=[...t];if(this.isApplied=y(e),!this.isApplied)return e;const i=this.gridElement;return function(t,e="ltr"){const n=[],i=[],r=[];for(const s of t){const t=h(s);t?"left"===g(t,e)?n.push(s):r.push(s):i.push(s)}return[...n,...i,...r]}(e,i?n(i):"ltr")}afterRender(){if(!this.isApplied)return;const t=this.gridElement,e=[...this.columns];if(!y(e))return C(t),void(this.isApplied=!1);queueMicrotask(()=>{this.#e=b(t,e)})}afterCellRender(t){if(!this.isApplied)return;const e=t.column.field;this.#e.addGroupEnd.has(e)?t.cellElement.classList.add("group-end"):this.#e.removeGroupEnd.has(e)&&t.cellElement.classList.remove("group-end")}handleQuery(t){switch(t.type){case w:return null==h(t.context)&&void 0;case"getStickyOffsets":return{left:Object.fromEntries(this.leftOffsets),right:Object.fromEntries(this.rightOffsets)};case"getContextMenuItems":{const e=t.context;if(!e.isHeader)return;const n=e.column;if(!n?.field)return;if(n.meta?.lockPinning)return;const i=[];return null!=h(n)?i.push({id:"pinned/unpin",label:"Unpin Column",icon:"📌",order:40,action:()=>this.setPinPosition(n.field,void 0)}):(i.push({id:"pinned/pin-left",label:"Pin Left",icon:"⬅",order:40,action:()=>this.setPinPosition(n.field,"left")}),i.push({id:"pinned/pin-right",label:"Pin Right",icon:"➡",order:41,action:()=>this.setPinPosition(n.field,"right")})),i}default:return}}setPinPosition(t,e){const n=this.columns;if(!n?.length)return;const i=n.findIndex(e=>e.field===t);if(-1===i)return;const r=this.gridElement;if(e){0===this.#n.length&&(this.#n=n.map(t=>t.field));const i=n.map(n=>{if(n.field!==t)return n;const i={...n};return i.pinned=e,delete i.sticky,i});r.columns=i}else{const e={...n[i]};delete e.pinned,delete e.sticky;const s=[...n];s.splice(i,1);const o=this.#n.indexOf(t);if(o>=0){let t=s.length;for(let e=0;e<s.length;e++){if(h(s[e]))continue;if(this.#n.indexOf(s[e].field)>o){t=e;break}}s.splice(t,0,e)}else s.splice(Math.min(i,s.length),0,e);s.some(t=>null!=h(t))||(this.#n=[]),r.columns=s}}refreshStickyOffsets(){const t=[...this.columns];b(this.gridElement,t)}getLeftPinnedColumns(){return function(t,e="ltr"){return t.filter(t=>p(t,e))}([...this.columns],n(this.gridElement))}getRightPinnedColumns(){return function(t,e="ltr"){return t.filter(t=>m(t,e))}([...this.columns],n(this.gridElement))}clearStickyPositions(){C(this.gridElement)}getHorizontalScrollOffsets(n,i){if(!this.isApplied)return;let r=0,s=0;if(n){const i=n.querySelectorAll(`.${t}`),o=n.querySelectorAll(`.${e}`);i.forEach(t=>{r+=t.offsetWidth}),o.forEach(t=>{s+=t.offsetWidth})}else{this.gridElement.querySelectorAll(".header-row .cell").forEach(n=>{n.classList.contains(t)?r+=n.offsetWidth:n.classList.contains(e)&&(s+=n.offsetWidth)})}const o=i?.classList.contains(t)||i?.classList.contains(e);return{left:r,right:s,skipScroll:o}}}export{A as PinnedColumnsPlugin};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|