dataTable/dist/datatable.min.js

2 lines
18 KiB
JavaScript
Raw Normal View History

import{Component as t,NewState as e,RefreshState as n,Util as o}from"@web/state";import{VirtualScroll as i,State as r}from"@web/base";t.register("DataTable",t=>{t.state||(t.state=e({}));const o=t.state;Object.assign(o,{list:[],fields:[],_renderedList:[],prevHeight:0,postHeight:0,_listStartIndex:0,selectedRowCount:0,_originalList:[],sortConfig:{fieldId:null,direction:null},filterConfig:{},activeFieldId:null,_internalUpdate:!1,_appliedHash:"",_fieldsDirty:!1,_masterCellNodes:null});const l=(()=>{let t=!!window.__DT_PERF_MODE__;const e={refreshTime:0,refreshCount:0,scrollCount:0,totalNodes:0};return t&&!window.__statePerformanceTelemetry&&(window.__statePerformanceTelemetry={scanCount:0,reuseCount:0,moveCount:0}),{get stats(){return e},enable:()=>{t=!0},disable:()=>{t=!1},onScroll:()=>{t&&e.scrollCount++},startFrame:()=>{var e,n,o;return t?{start:performance.now(),scan:(null==(e=window.__statePerformanceTelemetry)?void 0:e.scanCount)||0,move:(null==(n=window.__statePerformanceTelemetry)?void 0:n.moveCount)||0,reuse:(null==(o=window.__statePerformanceTelemetry)?void 0:o.reuseCount)||0}:null},endFrame:(n,o)=>{if(!t||!n)return;e.refreshCount++,e.totalNodes+=o;const i=performance.now()-n.start;e.refreshTime+=i;const r=window.__statePerformanceTelemetry;if(r){const t=r.scanCount-n.scan,e=r.moveCount-n.move,l=r.reuseCount-n.reuse;(t>0||i>2)&&console.log(`[DataTable Frame] Time: ${i.toFixed(2)}ms, Scans: ${t}, Moves: ${e}, Reuses: ${l}, Rows: ${o}`)}}}})();o.perf=l.stats;const s=((t,e)=>{let n=null,o=null,i=[];const r=(t,e)=>!!(n&&t>=n.minRow&&t<=n.maxRow&&e>=n.minCol&&e<=n.maxCol)||i.some(n=>t>=n.minRow&&t<=n.maxRow&&e>=n.minCol&&e<=n.maxCol);let l=!1;const s=()=>{var o;if(window.__DT_FEATURES__&&!window.__DT_FEATURES__.selection)return;let s=1/0,a=-1/0;n&&(s=Math.min(s,n.minRow),a=Math.max(a,n.maxRow)),i.forEach(t=>{s=Math.min(s,t.minRow),a=Math.max(a,t.maxRow)});const d=s!==1/0;if(!d&&!l)return;l=d;const c=t.querySelector(".dt-body");if(!c)return;const m=c.children;for(let t=0;t<m.length;t++){const n=m[t];if(!n.classList.contains("dt-body-row"))continue;const i=((null==(o=n._ref)?void 0:o.rIdx)??-1)+e._listStartIndex;if(!d||i<s||i>a){const t=n.children;for(let e=0;e<t.length;e++)t[e].classList.remove("dt-cell-selected");continue}const l=n.children;for(let t=0;t<l.length;t++){const e=r(i,t),n=l[t];e?n.classList.add("dt-cell-selected"):n.classList.remove("dt-cell-selected")}}},a=()=>{let t=0;n&&(t+=n.maxRow-n.minRow+1),i.forEach(e=>t+=e.maxRow-e.minRow+1),e.selectedRowCount=t},d=(t=!1)=>{t||(n=null,o=null,i=[],s(),a())},c=()=>{if(!n)return null;let t=n.minRow,e=n.maxRow,o=n.minCol,r=n.maxCol;return i.forEach(n=>{t=Math.min(t,n.minRow),e=Math.max(e,n.maxRow),o=Math.min(o,n.minCol),r=Math.max(r,n.maxCol)}),{minRow:t,maxRow:e,minCol:o,maxCol:r}};return{applySelectionUI:s,clearAllActive:d,startSelect:(l,c,m)=>{const u=r(l,c),f=n&&(n.minRow!==n.maxRow||n.minCol!==n.maxCol)||i.length>0;m.shiftKey&&o?n={minRow:Math.min(o.row,l),maxRow:Math.max(o.row,l),minCol:Math.min(o.col,c),maxCol:Math.max(o.col,c)}:(!u||m.ctrlKey||m.metaKey?(m.ctrlKey||m.metaKey?n&&!u&&i.push(n):d(),o={row:l,col:c},n={minRow:l,maxRow:l,minCol:c,maxCol:c}):f||(t._potentialCancel={row:l,col:c}),e.isSelecting=!0),s(),a(),t.focus()},updateSelect:(i,r)=>{e.isSelecting&&o&&(n={minRow:Math.min(o.row,i),maxRow:Math.max(o.row,i),minCol:Math.min(o.col,r),maxCol:Math.max(o.col,r)},t._potentialCancel=null,s(),a())},endSelect:()=>{if(t._potentialCancel){const{row:e,col:n}=t._potentialCancel;r(e,n)&&d(),t._potentialCancel=null}e.isSelecting=!1},deleteSelected:()=>{const t=c();if(!t)return;const n=t.minRow,o=t.maxRow,i=e.list.filter((t,e)=>!(e>=n&&e<=o));e.list=i,d()},getSelectionBounds:c,copy:async()=>{const t=c();if(!t)return;const n=e.list.slice(t.minRow,t.maxRow+1).map(n=>e.fields.slice(t.minCol,t.maxCol+1).map(t=>{let e=String(n[t.id]??"");return(e.includes("\t")||e.includes("\n")||e.includes('"'))&&(e='"'+e.replace(/"/g,'""')+'"'),e}).join("\t")).join("\n");await navigator.clipboard.writeText(n)},paste:async()=>{try{const n=await navigator.clipboard.readText();if(!n)return;