@nanoporetech-digital/components 3.4.0 → 3.5.1
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/CHANGELOG.md +23 -0
- package/dist/cjs/index-41582c2a.js +16 -12
- package/dist/cjs/index.cjs.js.map +1 -1
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/nano-components.cjs.js +1 -1
- package/dist/cjs/nano-demo.cjs.entry.js +291 -0
- package/dist/cjs/nano-demo.cjs.entry.js.map +1 -0
- package/dist/cjs/{nano-table-b9cdafab.js → nano-table-067e0c12.js} +486 -202
- package/dist/cjs/nano-table-067e0c12.js.map +1 -0
- package/dist/cjs/nano-table.cjs.entry.js +1 -1
- package/dist/cjs/{table.worker-291904c9.js → table.worker-a4d75c46.js} +3 -3
- package/dist/cjs/table.worker-a4d75c46.js.map +1 -0
- package/dist/cjs/table.worker-e9fb087e.js +4 -0
- package/dist/collection/collection-manifest.json +1 -0
- package/dist/collection/components/alert/alert.helpers.js.map +1 -1
- package/dist/collection/components/demo/demo.js +284 -0
- package/dist/collection/components/demo/demo.js.map +1 -0
- package/dist/collection/components/dialog/dialog.helpers.js.map +1 -1
- package/dist/collection/components/table/table-interface.js.map +1 -1
- package/dist/collection/components/table/table.cell.js +65 -0
- package/dist/collection/components/table/table.cell.js.map +1 -0
- package/dist/collection/components/table/table.css +98 -20
- package/dist/collection/components/table/table.header.js +156 -0
- package/dist/collection/components/table/table.header.js.map +1 -0
- package/dist/collection/components/table/table.js +170 -18
- package/dist/collection/components/table/table.js.map +1 -1
- package/dist/collection/components/table/table.row.js +113 -0
- package/dist/collection/components/table/table.row.js.map +1 -0
- package/dist/collection/components/table/table.store.js +46 -9
- package/dist/collection/components/table/table.store.js.map +1 -1
- package/dist/collection/components/table/table.utils.js +230 -0
- package/dist/collection/components/table/table.utils.js.map +1 -1
- package/dist/collection/components/table/table.worker.js +1 -0
- package/dist/collection/components/table/table.worker.js.map +1 -1
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.js +1 -0
- package/dist/components/index.js.map +1 -1
- package/dist/components/nano-demo.d.ts +11 -0
- package/dist/components/nano-demo.js +341 -0
- package/dist/components/nano-demo.js.map +1 -0
- package/dist/components/nano-table.js +2 -1247
- package/dist/components/nano-table.js.map +1 -1
- package/dist/components/table.js +1539 -0
- package/dist/components/table.js.map +1 -0
- package/dist/components/table.worker.js +2 -2
- package/dist/custom-elements/index.d.ts +6 -0
- package/dist/custom-elements/index.js +772 -204
- package/dist/custom-elements/index.js.map +1 -1
- package/dist/esm/index-3c280603.js +16 -12
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/loader.js +1 -1
- package/dist/esm/nano-components.js +1 -1
- package/dist/esm/nano-demo.entry.js +287 -0
- package/dist/esm/nano-demo.entry.js.map +1 -0
- package/dist/esm/{nano-table-c8ef2276.js → nano-table-95921f46.js} +487 -203
- package/dist/esm/nano-table-95921f46.js.map +1 -0
- package/dist/esm/nano-table.entry.js +1 -1
- package/dist/esm/{table.worker-65438fa0.js → table.worker-769f1441.js} +3 -3
- package/dist/esm/table.worker-769f1441.js.map +1 -0
- package/dist/esm/table.worker-e9fb087e.js +4 -0
- package/dist/nano-components/index.esm.js.map +1 -1
- package/dist/nano-components/nano-components.esm.js +1 -1
- package/dist/nano-components/nano-components.esm.js.map +1 -1
- package/dist/nano-components/p-26905bca.js +5 -0
- package/dist/nano-components/{p-14218d23.entry.js.map → p-26905bca.js.map} +0 -0
- package/dist/nano-components/p-85cfb0af.entry.js +5 -0
- package/dist/nano-components/p-85cfb0af.entry.js.map +1 -0
- package/dist/nano-components/p-8fc2a38d.js +5 -0
- package/dist/nano-components/p-8fc2a38d.js.map +1 -0
- package/dist/nano-components/p-e9fb087e.js +4 -0
- package/dist/nano-components/{p-14218d23.entry.js → p-fb12a45d.entry.js} +2 -2
- package/dist/nano-components/{p-fe1f8360.js.map → p-fb12a45d.entry.js.map} +0 -0
- package/dist/types/components/alert/alert.helpers.d.ts +1 -1
- package/dist/types/components/demo/demo.d.ts +6 -0
- package/dist/types/components/dialog/dialog.helpers.d.ts +1 -1
- package/dist/types/components/table/table-interface.d.ts +38 -23
- package/dist/types/components/table/table.cell.d.ts +18 -0
- package/dist/types/components/table/table.d.ts +36 -1
- package/dist/types/components/table/table.header.d.ts +16 -0
- package/dist/types/components/table/table.row.d.ts +15 -0
- package/dist/types/components/table/table.utils.d.ts +99 -0
- package/dist/types/components.d.ts +50 -0
- package/docs-json.json +124 -3
- package/docs-vscode.json +17 -1
- package/package.json +3 -3
- package/dist/cjs/nano-table-b9cdafab.js.map +0 -1
- package/dist/cjs/table.worker-1fd13775.js +0 -4
- package/dist/cjs/table.worker-291904c9.js.map +0 -1
- package/dist/collection/components/table/table.children.js +0 -224
- package/dist/collection/components/table/table.children.js.map +0 -1
- package/dist/collection/components/table/table.service.js +0 -121
- package/dist/collection/components/table/table.service.js.map +0 -1
- package/dist/esm/nano-table-c8ef2276.js.map +0 -1
- package/dist/esm/table.worker-1fd13775.js +0 -4
- package/dist/esm/table.worker-65438fa0.js.map +0 -1
- package/dist/nano-components/p-1fd13775.js +0 -4
- package/dist/nano-components/p-f9349146.js +0 -5
- package/dist/nano-components/p-f9349146.js.map +0 -1
- package/dist/nano-components/p-fe1f8360.js +0 -5
- package/dist/types/components/table/table.children.d.ts +0 -30
- package/dist/types/components/table/table.service.d.ts +0 -42
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["node_modules/@stencil/core/internal/client/patch-browser.js","@lazy-browser-entrypoint?app-data=conditional"],"names":["patchBrowser","patchCloneNodeFix","H","prototype","importMeta","import","meta","url","opts","resourcesUrl","URL","href","promiseResolve","HTMLElementPrototype","nativeCloneNodeFn","cloneNode","deep","this","nodeName","call","clonedNode","srcChildNodes","childNodes","i","length","nodeType","appendChild","then","options","bootstrapLazy","JSON","parse"],"mappings":";;;0EAMA,MAAMA,EAAe,KASO,CAEpBC,EAAkBC,EAAEC,WAkBxB,MAAMC,EAAaC,OAAOC,KAAKC,IAC/B,MAAMC,EAA6D,GAenE,GAAuBJ,IAAe,GAAI,CACtCI,EAAKC,aAAe,IAAIC,IAAI,IAAKN,GAAYO,KAajD,OAAOC,EAAeJ,IAuC1B,MAAMP,EAAqBY,IACvB,MAAMC,EAAoBD,EAAqBE,UAC/CF,EAAqBE,UAAY,SAAUC,GACvC,GAAIC,KAAKC,WAAa,WAAY,CAC9B,OAAOJ,EAAkBK,KAAKF,KAAMD,GAExC,MAAMI,EAAaN,EAAkBK,KAAKF,KAAM,OAChD,MAAMI,EAAgBJ,KAAKK,WAC3B,GAAIN,EAAM,CACN,IAAK,IAAIO,EAAI,EAAGA,EAAIF,EAAcG,OAAQD,IAAK,CAE3C,GAAIF,EAAcE,GAAGE,WAAa,EAAG,CACjCL,EAAWM,YAAYL,EAAcE,GAAGR,UAAU,SAI9D,OAAOK,ICrHfpB,IAAe2B,MAAKC,GAEXC,EAAcC,KAAAC,MAAA,
|
1
|
+
{"version":3,"sources":["node_modules/@stencil/core/internal/client/patch-browser.js","@lazy-browser-entrypoint?app-data=conditional"],"names":["patchBrowser","patchCloneNodeFix","H","prototype","importMeta","import","meta","url","opts","resourcesUrl","URL","href","promiseResolve","HTMLElementPrototype","nativeCloneNodeFn","cloneNode","deep","this","nodeName","call","clonedNode","srcChildNodes","childNodes","i","length","nodeType","appendChild","then","options","bootstrapLazy","JSON","parse"],"mappings":";;;0EAMA,MAAMA,EAAe,KASO,CAEpBC,EAAkBC,EAAEC,WAkBxB,MAAMC,EAAaC,OAAOC,KAAKC,IAC/B,MAAMC,EAA6D,GAenE,GAAuBJ,IAAe,GAAI,CACtCI,EAAKC,aAAe,IAAIC,IAAI,IAAKN,GAAYO,KAajD,OAAOC,EAAeJ,IAuC1B,MAAMP,EAAqBY,IACvB,MAAMC,EAAoBD,EAAqBE,UAC/CF,EAAqBE,UAAY,SAAUC,GACvC,GAAIC,KAAKC,WAAa,WAAY,CAC9B,OAAOJ,EAAkBK,KAAKF,KAAMD,GAExC,MAAMI,EAAaN,EAAkBK,KAAKF,KAAM,OAChD,MAAMI,EAAgBJ,KAAKK,WAC3B,GAAIN,EAAM,CACN,IAAK,IAAIO,EAAI,EAAGA,EAAIF,EAAcG,OAAQD,IAAK,CAE3C,GAAIF,EAAcE,GAAGE,WAAa,EAAG,CACjCL,EAAWM,YAAYL,EAAcE,GAAGR,UAAU,SAI9D,OAAOK,ICrHfpB,IAAe2B,MAAKC,GAEXC,EAAcC,KAAAC,MAAA,m6hBAAuCH","sourcesContent":["/*\n Stencil Client Patch Browser v2.19.4 | MIT Licensed | https://stenciljs.com\n */\nimport { BUILD, NAMESPACE } from '@stencil/core/internal/app-data';\nimport { consoleDevInfo, plt, win, doc, promiseResolve, H } from '@stencil/core';\nconst getDynamicImportFunction = (namespace) => `__sc_import_${namespace.replace(/\\s|-/g, '_')}`;\nconst patchBrowser = () => {\n // NOTE!! This fn cannot use async/await!\n if (BUILD.isDev && !BUILD.isTesting) {\n consoleDevInfo('Running in development mode.');\n }\n if (BUILD.cssVarShim) {\n // shim css vars\n plt.$cssShim$ = win.__cssshim;\n }\n if (BUILD.cloneNodeFix) {\n // opted-in to polyfill cloneNode() for slot polyfilled components\n patchCloneNodeFix(H.prototype);\n }\n if (BUILD.profile && !performance.mark) {\n // not all browsers support performance.mark/measure (Safari 10)\n // because the mark/measure APIs are designed to write entries to a buffer in the browser that does not exist,\n // simply stub the implementations out.\n // TODO(STENCIL-323): Remove this patch when support for older browsers is removed (breaking)\n // @ts-ignore\n performance.mark = performance.measure = () => {\n /*noop*/\n };\n performance.getEntriesByName = () => [];\n }\n // @ts-ignore\n const scriptElm = BUILD.scriptDataOpts || BUILD.safari10 || BUILD.dynamicImportShim\n ? Array.from(doc.querySelectorAll('script')).find((s) => new RegExp(`\\/${NAMESPACE}(\\\\.esm)?\\\\.js($|\\\\?|#)`).test(s.src) ||\n s.getAttribute('data-stencil-namespace') === NAMESPACE)\n : null;\n const importMeta = import.meta.url;\n const opts = BUILD.scriptDataOpts ? scriptElm['data-opts'] || {} : {};\n if (BUILD.safari10 && 'onbeforeload' in scriptElm && !history.scrollRestoration /* IS_ESM_BUILD */) {\n // Safari < v11 support: This IF is true if it's Safari below v11.\n // This fn cannot use async/await since Safari didn't support it until v11,\n // however, Safari 10 did support modules. Safari 10 also didn't support \"nomodule\",\n // so both the ESM file and nomodule file would get downloaded. Only Safari\n // has 'onbeforeload' in the script, and \"history.scrollRestoration\" was added\n // to Safari in v11. Return a noop then() so the async/await ESM code doesn't continue.\n // IS_ESM_BUILD is replaced at build time so this check doesn't happen in systemjs builds.\n return {\n then() {\n /* promise noop */\n },\n };\n }\n if (!BUILD.safari10 && importMeta !== '') {\n opts.resourcesUrl = new URL('.', importMeta).href;\n }\n else if (BUILD.dynamicImportShim || BUILD.safari10) {\n opts.resourcesUrl = new URL('.', new URL(scriptElm.getAttribute('data-resources-url') || scriptElm.src, win.location.href)).href;\n if (BUILD.dynamicImportShim) {\n patchDynamicImport(opts.resourcesUrl, scriptElm);\n }\n if (BUILD.dynamicImportShim && !win.customElements) {\n // module support, but no custom elements support (Old Edge)\n // @ts-ignore\n return import(/* webpackChunkName: \"polyfills-dom\" */ './dom.js').then(() => opts);\n }\n }\n return promiseResolve(opts);\n};\nconst patchDynamicImport = (base, orgScriptElm) => {\n const importFunctionName = getDynamicImportFunction(NAMESPACE);\n try {\n // test if this browser supports dynamic imports\n // There is a caching issue in V8, that breaks using import() in Function\n // By generating a random string, we can workaround it\n // Check https://bugs.chromium.org/p/chromium/issues/detail?id=990810 for more info\n win[importFunctionName] = new Function('w', `return import(w);//${Math.random()}`);\n }\n catch (e) {\n // this shim is specifically for browsers that do support \"esm\" imports\n // however, they do NOT support \"dynamic\" imports\n // basically this code is for old Edge, v18 and below\n const moduleMap = new Map();\n win[importFunctionName] = (src) => {\n const url = new URL(src, base).href;\n let mod = moduleMap.get(url);\n if (!mod) {\n const script = doc.createElement('script');\n script.type = 'module';\n script.crossOrigin = orgScriptElm.crossOrigin;\n script.src = URL.createObjectURL(new Blob([`import * as m from '${url}'; window.${importFunctionName}.m = m;`], {\n type: 'application/javascript',\n }));\n mod = new Promise((resolve) => {\n script.onload = () => {\n resolve(win[importFunctionName].m);\n script.remove();\n };\n });\n moduleMap.set(url, mod);\n doc.head.appendChild(script);\n }\n return mod;\n };\n }\n};\nconst patchCloneNodeFix = (HTMLElementPrototype) => {\n const nativeCloneNodeFn = HTMLElementPrototype.cloneNode;\n HTMLElementPrototype.cloneNode = function (deep) {\n if (this.nodeName === 'TEMPLATE') {\n return nativeCloneNodeFn.call(this, deep);\n }\n const clonedNode = nativeCloneNodeFn.call(this, false);\n const srcChildNodes = this.childNodes;\n if (deep) {\n for (let i = 0; i < srcChildNodes.length; i++) {\n // Node.ATTRIBUTE_NODE === 2, and checking because IE11\n if (srcChildNodes[i].nodeType !== 2) {\n clonedNode.appendChild(srcChildNodes[i].cloneNode(true));\n }\n }\n }\n return clonedNode;\n };\n};\nexport { patchBrowser };\n","import { bootstrapLazy } from '@stencil/core';\nimport { patchBrowser } from '@stencil/core/internal/client/patch-browser';\nimport { globalScripts } from '@stencil/core/internal/app-globals';\npatchBrowser().then(options => {\n globalScripts();\n return bootstrapLazy([/*!__STENCIL_LAZY_DATA__*/], options);\n});\n"]}
|
@@ -0,0 +1,5 @@
|
|
1
|
+
/*!
|
2
|
+
* Web Components for Nanopore digital Web Apps
|
3
|
+
*/
|
4
|
+
import{c as t}from"./p-8fc2a38d.js";import"./p-1fe12320.js";import"./p-ee045579.js";import"./p-9746b0a5.js";import"./p-651b3264.js";const o="table.worker";const p="stencil.table.worker";const s=new URL("p-e9fb087e.js",import.meta.url).href;const e=new Blob(['importScripts("'+s+'")'],{type:"text/javascript"});const r=URL.createObjectURL(e);const c=t(r,o,p);URL.revokeObjectURL(r);export{c as worker,p as workerMsgId,o as workerName,s as workerPath};
|
5
|
+
//# sourceMappingURL=p-26905bca.js.map
|
File without changes
|
@@ -0,0 +1,5 @@
|
|
1
|
+
/*!
|
2
|
+
* Web Components for Nanopore digital Web Apps
|
3
|
+
*/
|
4
|
+
import{r as e,h as t,F as n,a as l}from"./p-1fe12320.js";function a(e){if(!e)return"";return e.charAt(0).toUpperCase()+e.slice(1)}function r(e){if(!e)return undefined;return new Date(e).toLocaleDateString(undefined,{year:"numeric",month:"short",day:"numeric"})}function s(e=0,t="USD"){t=t?.toLocaleUpperCase()||"USD";return new Intl.NumberFormat("en-US",{style:"currency",currency:t}).format(e)}const o=class{constructor(t){e(this,t);this.order={checks:[{name:"Compliance",external_id:"CO",status:"complete",account_info:{name:"Jeongmin Song",email:"js2957@cornell.edu",address_line_1:"930 Campus Road",address_line_2:"Veterinary Medical Center C4 109",address_postcode:"14853",address_city:"Ithaca",address_region:"New York",address_country:"US"},individual_name_compliance_information:{table:{names:[],addresses:[],match:false,false_positive:null}},organization_compliance_information:{table:{names:[],addresses:[],match:false,false_positive:null}},checks:[{label:"Compliance check",external_id:"compliance_check",item_type:"pass/fail/escalate",answer:"pass"}],further_information:[],attachments:[],notes:[]}],orderId:"00886434",createdAt:"2022-12-09T15:57:50",updatedAt:"2022-12-09T16:02:29",status:"Processing",subStatus:null,currency:"USD",customerPaymentMethod:"CC-USD",paymentPlatform:"Shop",dataAreaId:"OXUS",defaultShippingWarehouse:null,deliveryContact:"Jeongmin Song",deliveryMode:null,deliveryName:"Cornell University",deliveryTerms:null,invoiceAccountNumber:"C038330",orderAccountNumber:"C038330",orderAccountName:"Cornell University",originalLeadTime:null,salesDate:"2022-12-09T15:57:50",salesName:"Cornell University",salesOrigin:"Shop",salesOriginName:"Main USD Store View",customerReference:"",purchaseOrder:null,additionalDocuments:[],total:860,shippingAmount:50,taxAmount:0,projectId:null,deliveryPhoneNumber:"+16072533722",invoicePhoneNumber:"+16072533722",quoteNumber:null,customerType:"N/A",invoiceAccountEmail:"js2957@cornell.edu",partnerReference:null,sentToD365:false,sentToD365Status:"unsent",orderAccountEmail:"js2957@cornell.edu",controllingAccountNumber:"C038330",controllingAccountEmail:"js2957@cornell.edu",deliveryAddress:{street:["930 Campus Road, Veterinary Medical Center C4 109"],city:"Ithaca",postcode:"14853",region:"New York",regionCode:"NY",countryCode:"US"},invoiceAddress:{street:["930 Campus Road, Veterinary Medical Center C4 109"],city:"Ithaca",postcode:"14853",region:"New York",regionCode:"NY",countryCode:"US"},shopOrderLines:[{name:"Flongle Flow Cell (R9.4.1)",sku:"FLO-FLG001",quantity:1,price:810,total:810,createdAt:"2022-12-09T15:57:50",updatedAt:"2022-12-09T15:57:50",maskSku:"FLO-FLG001",productType:"bundle",salesTag:"FLGExpSP",requestedShippingDate:null,discount:0,discountPercentage:0,get finalSku(){return this.maskSku||this.sku},includedItems:[{name:"Flongle Flow Cell (R9.4.1)",sku:"FLO-FLG001D",quantity:12,price:66,total:792,createdAt:"2022-12-09T15:57:50",updatedAt:"2022-12-09T15:57:50",maskSku:"FLO-FLG001",productType:"simple",salesTag:"FLGExpSP",requestedShippingDate:"2022-12-27T00:00:00",discount:0,discountPercentage:0},{name:"Flongle Flow Cell Priming Kit",sku:"EXP-FSE001",quantity:1,price:18,total:18,createdAt:"2022-12-09T15:57:50",updatedAt:"2022-12-09T15:57:50",maskSku:"",productType:"simple",salesTag:"FLGExpSP",requestedShippingDate:"2022-12-27T00:00:00",discount:0,discountPercentage:0}]},{name:"Carriage - Device shipment",sku:"FREIGHT",quantity:1,price:50,total:50,createdAt:"2022-12-09T15:57:50",updatedAt:"2022-12-09T15:57:50",maskSku:"",productType:"virtual",salesTag:null,requestedShippingDate:"2022-12-27T00:00:00",discount:0,discountPercentage:0,get finalSku(){return this.maskSku||this.sku}}],orderLines:[],pickedItems:[],packedItems:[],trackingNumbers:[],trackingUpdates:[],ecoOrder:false,revenueOrder:false}}lineItemTotal(e){if(!e||!e.shopOrderLines?.length)return;let t=0;e.shopOrderLines.forEach((e=>{if(e.status!=="cancelled")t+=e.total}));return t}render(){return t(l,null,t("nano-table",{rowRender:{template:(e,l,s)=>[l.renderedRow,l.row.includedItems?.length?l.row.includedItems?.map((e=>t("tr",{class:"child-row"},t(s,{header:true},e.name),t(s,null,a(l.row.status||this.order.status)),t(s,null,a(e.sku)),t(s,null,a(e.salesTag)),t(s,null,r(e.requestedShippingDate))))):t(n,null)].flat(1)},columns:[{title:"Name",prop:"name",pinned:"start",rowHeader:true},{title:"Status",prop:"status",cellTemplate:(e,t)=>a(t.cellModel||this.order.status)},{title:"SKU",prop:"finalSku"},{title:"Sales tag",prop:"salesTag",cellTemplate:(e,t)=>t.cellModel||"None"},{title:"Requested ship date",prop:"requestedShippingDate",cellTemplate:(e,t)=>r(t.cellModel)||"N/A"},{title:"Quantity",prop:"quantity"},{title:"Unit price",prop:"price",cellTemplate:(e,t)=>s(t.cellModel,this.order.currency)},{title:"Discount %",prop:"discountPercentage",cellTemplate:(e,t)=>t.cellModel||0},{title:"Line value",prop:"total",cellTemplate:(e,t)=>s(t.cellModel,this.order.currency)}],rows:this.order.shopOrderLines,caption:`List of order line items found within order ${this.order.orderId}`,showFooter:true,footRender:{pinned:"bottom",template:()=>[t("tr",null,t("td",{colSpan:6}," "),t("th",{scope:"row",class:"tbl__pin nano-tbl__pin--end",colSpan:3},t("div",{class:"nano-tbl__cell-content order-lines__total"},t("span",{class:"order-lines__total--label"},"Sub total:"),t("span",{class:"order-lines__total--num"},s(this.lineItemTotal(this.order),this.order.currency))))),t("tr",null,t("td",{colSpan:6}," "),t("th",{scope:"row",class:"tbl__pin nano-tbl__pin--end",colSpan:3},t("div",{class:"nano-tbl__cell-content order-lines__total"},t("span",{class:"order-lines__total--label"},"Total order tax:"),t("span",{class:"order-lines__total--num"},s(this.order.taxAmount,this.order.currency))))),t("tr",null,t("td",{colSpan:6}," "),t("th",{scope:"row",class:"tbl__pin nano-tbl__pin--end",colSpan:3},t("div",{class:"nano-tbl__cell-content order-lines__total"},t("span",{class:"order-lines__total--label"},"Total on order placement:"),t("span",{class:"order-lines__total--num"},s(this.order.total,this.order.currency)))))]}}))}};o.style=":host {display: block}\n .child-row {\n opacity: .8;\n font-style: italic;\n }";export{o as nano_demo};
|
5
|
+
//# sourceMappingURL=p-85cfb0af.entry.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":["src/components/demo/demo.tsx"],"names":["capitalise","value","charAt","toUpperCase","slice","mediumDate","date","undefined","Date","toLocaleDateString","year","month","day","currency","amount","currencyCode","toLocaleUpperCase","Intl","NumberFormat","style","format","Demo","[object Object]","hostRef","this","order","checks","name","external_id","status","account_info","email","address_line_1","address_line_2","address_postcode","address_city","address_region","address_country","individual_name_compliance_information","table","names","addresses","match","false_positive","organization_compliance_information","label","item_type","answer","further_information","attachments","notes","orderId","createdAt","updatedAt","subStatus","customerPaymentMethod","paymentPlatform","dataAreaId","defaultShippingWarehouse","deliveryContact","deliveryMode","deliveryName","deliveryTerms","invoiceAccountNumber","orderAccountNumber","orderAccountName","originalLeadTime","salesDate","salesName","salesOrigin","salesOriginName","customerReference","purchaseOrder","additionalDocuments","total","shippingAmount","taxAmount","projectId","deliveryPhoneNumber","invoicePhoneNumber","quoteNumber","customerType","invoiceAccountEmail","partnerReference","sentToD365","sentToD365Status","orderAccountEmail","controllingAccountNumber","controllingAccountEmail","deliveryAddress","street","city","postcode","region","regionCode","countryCode","invoiceAddress","shopOrderLines","sku","quantity","price","maskSku","productType","salesTag","requestedShippingDate","discount","discountPercentage","finalSku","includedItems","orderLines","pickedItems","packedItems","trackingNumbers","trackingUpdates","ecoOrder","revenueOrder","length","forEach","itm","h","Host","rowRender","template","_","c","TableCell","renderedRow","row","map","item","class","header","Fragment","flat","columns","title","prop","pinned","rowHeader","cellTemplate","cellModel","rows","caption","showFooter","footRender","colSpan","scope","lineItemTotal"],"mappings":"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","sourcesContent":["import {\n Component,\n ComponentInterface,\n Fragment,\n h,\n Host,\n} from '@stencil/core';\n\nfunction capitalise(value: string) {\n if (!value) return '';\n return value.charAt(0).toUpperCase() + value.slice(1);\n}\n\nfunction mediumDate(date: Date) {\n if (!date) return undefined;\n return new Date(date).toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n });\n}\n\nfunction currency(amount: number = 0, currencyCode: string = 'USD') {\n currencyCode = currencyCode?.toLocaleUpperCase() || 'USD';\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: currencyCode,\n }).format(amount);\n}\n\n@Component({\n tag: 'nano-demo',\n shadow: true,\n styles: /* css */ `\n :host {display: block}\n .child-row {\n opacity: .8;\n font-style: italic;\n }\n `,\n})\nexport class Demo implements ComponentInterface {\n private order = {\n checks: [\n {\n name: 'Compliance',\n external_id: 'CO',\n status: 'complete',\n account_info: {\n name: 'Jeongmin Song',\n email: 'js2957@cornell.edu',\n address_line_1: '930 Campus Road',\n address_line_2: 'Veterinary Medical Center C4 109',\n address_postcode: '14853',\n address_city: 'Ithaca',\n address_region: 'New York',\n address_country: 'US',\n },\n individual_name_compliance_information: {\n table: {\n names: [],\n addresses: [],\n match: false,\n false_positive: null,\n },\n },\n organization_compliance_information: {\n table: {\n names: [],\n addresses: [],\n match: false,\n false_positive: null,\n },\n },\n checks: [\n {\n label: 'Compliance check',\n external_id: 'compliance_check',\n item_type: 'pass/fail/escalate',\n answer: 'pass',\n },\n ],\n further_information: [],\n attachments: [],\n notes: [],\n },\n ],\n orderId: '00886434',\n createdAt: '2022-12-09T15:57:50',\n updatedAt: '2022-12-09T16:02:29',\n status: 'Processing',\n subStatus: null,\n currency: 'USD',\n customerPaymentMethod: 'CC-USD',\n paymentPlatform: 'Shop',\n dataAreaId: 'OXUS',\n defaultShippingWarehouse: null,\n deliveryContact: 'Jeongmin Song',\n deliveryMode: null,\n deliveryName: 'Cornell University',\n deliveryTerms: null,\n invoiceAccountNumber: 'C038330',\n orderAccountNumber: 'C038330',\n orderAccountName: 'Cornell University',\n originalLeadTime: null,\n salesDate: '2022-12-09T15:57:50',\n salesName: 'Cornell University',\n salesOrigin: 'Shop',\n salesOriginName: 'Main USD Store View',\n customerReference: '',\n purchaseOrder: null,\n additionalDocuments: [],\n total: 860,\n shippingAmount: 50,\n taxAmount: 0,\n projectId: null,\n deliveryPhoneNumber: '+16072533722',\n invoicePhoneNumber: '+16072533722',\n quoteNumber: null,\n customerType: 'N/A',\n invoiceAccountEmail: 'js2957@cornell.edu',\n partnerReference: null,\n sentToD365: false,\n sentToD365Status: 'unsent',\n orderAccountEmail: 'js2957@cornell.edu',\n controllingAccountNumber: 'C038330',\n controllingAccountEmail: 'js2957@cornell.edu',\n deliveryAddress: {\n street: ['930 Campus Road, Veterinary Medical Center C4 109'],\n city: 'Ithaca',\n postcode: '14853',\n region: 'New York',\n regionCode: 'NY',\n countryCode: 'US',\n },\n invoiceAddress: {\n street: ['930 Campus Road, Veterinary Medical Center C4 109'],\n city: 'Ithaca',\n postcode: '14853',\n region: 'New York',\n regionCode: 'NY',\n countryCode: 'US',\n },\n shopOrderLines: [\n {\n name: 'Flongle Flow Cell (R9.4.1)',\n sku: 'FLO-FLG001',\n quantity: 1,\n price: 810,\n total: 810,\n createdAt: '2022-12-09T15:57:50',\n updatedAt: '2022-12-09T15:57:50',\n maskSku: 'FLO-FLG001',\n productType: 'bundle',\n salesTag: 'FLGExpSP',\n requestedShippingDate: null,\n discount: 0,\n discountPercentage: 0,\n get finalSku() {\n return this.maskSku || this.sku;\n },\n includedItems: [\n {\n name: 'Flongle Flow Cell (R9.4.1)',\n sku: 'FLO-FLG001D',\n quantity: 12,\n price: 66,\n total: 792,\n createdAt: '2022-12-09T15:57:50',\n updatedAt: '2022-12-09T15:57:50',\n maskSku: 'FLO-FLG001',\n productType: 'simple',\n salesTag: 'FLGExpSP',\n requestedShippingDate: '2022-12-27T00:00:00',\n discount: 0,\n discountPercentage: 0,\n },\n {\n name: 'Flongle Flow Cell Priming Kit',\n sku: 'EXP-FSE001',\n quantity: 1,\n price: 18,\n total: 18,\n createdAt: '2022-12-09T15:57:50',\n updatedAt: '2022-12-09T15:57:50',\n maskSku: '',\n productType: 'simple',\n salesTag: 'FLGExpSP',\n requestedShippingDate: '2022-12-27T00:00:00',\n discount: 0,\n discountPercentage: 0,\n },\n ],\n },\n {\n name: 'Carriage - Device shipment',\n sku: 'FREIGHT',\n quantity: 1,\n price: 50,\n total: 50,\n createdAt: '2022-12-09T15:57:50',\n updatedAt: '2022-12-09T15:57:50',\n maskSku: '',\n productType: 'virtual',\n salesTag: null,\n requestedShippingDate: '2022-12-27T00:00:00',\n discount: 0,\n discountPercentage: 0,\n get finalSku() {\n return this.maskSku || this.sku;\n },\n },\n ],\n orderLines: [],\n pickedItems: [],\n packedItems: [],\n trackingNumbers: [],\n trackingUpdates: [],\n ecoOrder: false,\n revenueOrder: false,\n };\n\n private lineItemTotal(order) {\n if (!order || !order.shopOrderLines?.length) return;\n let total = 0;\n order.shopOrderLines.forEach((itm) => {\n if (itm.status !== 'cancelled') total += itm.total;\n });\n return total;\n }\n\n render() {\n return (\n <Host>\n <nano-table\n rowRender={{\n template: (_, c, TableCell) =>\n [\n c.renderedRow,\n c.row.includedItems?.length ? (\n c.row.includedItems?.map((item) => {\n return (\n <tr class=\"child-row\">\n <TableCell header={true}>{item.name}</TableCell>\n <TableCell>\n {capitalise(c.row.status || this.order.status)}\n </TableCell>\n <TableCell>{capitalise(item.sku)}</TableCell>\n <TableCell>{capitalise(item.salesTag)}</TableCell>\n <TableCell>\n {mediumDate(item.requestedShippingDate)}\n </TableCell>\n </tr>\n );\n })\n ) : (\n <Fragment />\n ),\n ].flat(1),\n }}\n columns={[\n {\n title: 'Name',\n prop: 'name',\n pinned: 'start',\n rowHeader: true,\n },\n {\n title: 'Status',\n prop: 'status',\n cellTemplate: (_, c) =>\n capitalise(c.cellModel || this.order.status),\n },\n {\n title: 'SKU',\n prop: 'finalSku',\n },\n {\n title: 'Sales tag',\n prop: 'salesTag',\n cellTemplate: (_, c) => c.cellModel || 'None',\n },\n {\n title: 'Requested ship date',\n prop: 'requestedShippingDate',\n cellTemplate: (_, c) => mediumDate(c.cellModel) || 'N/A',\n },\n {\n title: 'Quantity',\n prop: 'quantity',\n },\n {\n title: 'Unit price',\n prop: 'price',\n cellTemplate: (_, c) =>\n currency(c.cellModel, this.order.currency),\n },\n {\n title: 'Discount %',\n prop: 'discountPercentage',\n cellTemplate: (_, c) => c.cellModel || 0,\n },\n {\n title: 'Line value',\n prop: 'total',\n cellTemplate: (_, c) =>\n currency(c.cellModel, this.order.currency),\n },\n ]}\n rows={this.order.shopOrderLines}\n caption={`List of order line items found within order ${this.order.orderId}`}\n showFooter={true}\n footRender={{\n pinned: 'bottom',\n template: () => [\n <tr>\n <td colSpan={6}> </td>\n <th scope=\"row\" class=\"tbl__pin nano-tbl__pin--end\" colSpan={3}>\n <div class=\"nano-tbl__cell-content order-lines__total\">\n <span class=\"order-lines__total--label\">Sub total:</span>\n <span class=\"order-lines__total--num\">\n {currency(\n this.lineItemTotal(this.order),\n this.order.currency\n )}\n </span>\n </div>\n </th>\n </tr>,\n <tr>\n <td colSpan={6}> </td>\n <th scope=\"row\" class=\"tbl__pin nano-tbl__pin--end\" colSpan={3}>\n <div class=\"nano-tbl__cell-content order-lines__total\">\n <span class=\"order-lines__total--label\">\n Total order tax:\n </span>\n <span class=\"order-lines__total--num\">\n {currency(this.order.taxAmount, this.order.currency)}\n </span>\n </div>\n </th>\n </tr>,\n <tr>\n <td colSpan={6}> </td>\n <th scope=\"row\" class=\"tbl__pin nano-tbl__pin--end\" colSpan={3}>\n <div class=\"nano-tbl__cell-content order-lines__total\">\n <span class=\"order-lines__total--label\">\n Total on order placement:\n </span>\n <span class=\"order-lines__total--num\">\n {currency(this.order.total, this.order.currency)}\n </span>\n </div>\n </th>\n </tr>,\n ],\n }}\n />\n </Host>\n );\n }\n}\n"]}
|
@@ -0,0 +1,5 @@
|
|
1
|
+
/*!
|
2
|
+
* Web Components for Nanopore digital Web Apps
|
3
|
+
*/
|
4
|
+
import{j as t,g as n,e as o,h as e,F as i,r,c as s,d as a,a as l}from"./p-1fe12320.js";import{a as d}from"./p-ee045579.js";import{d as c}from"./p-9746b0a5.js";import{c as h}from"./p-651b3264.js";const b="nano-tbl";const p=(t,n)=>{const o=globalThis[n];return o!=null&&t instanceof o};const _=t=>{if(t!=null){if(p(t,"ArrayBuffer")||p(t,"MessagePort")||p(t,"ImageBitmap")||p(t,"OffscreenCanvas")){return[t]}if(typeof t==="object"){if(t.constructor===Object){t=Object.values(t)}if(Array.isArray(t)){return t.flatMap(_)}return _(t.buffer)}}return[]};let f=0;let u=0;const g=new Map;const m=new Map;const w=(n,o,e)=>{const i=new Worker(n,{name:o});i.addEventListener("message",(({data:n})=>{if(n){const o=n[0];const i=n[1];const r=n[2];if(o===e){const o=n[3];const[e,s,a]=g.get(i);g.delete(i);if(o){const n=o.isError?Object.assign(new Error(o.value.message),o.value):o.value;t(n);s(n)}else{if(a){a.forEach((t=>m.delete(t)))}e(r)}}else if(o===e+".cb"){try{m.get(i)(...r)}catch(n){t(n)}}}}));return i};const x=(t,n,o)=>(...e)=>new Promise(((i,r)=>{let s=f++;let a=0;let l=e.length;let d=[i,r];g.set(s,d);for(;a<l;a++){if(typeof e[a]==="function"){const t=u++;m.set(t,e[a]);e[a]=[n+".cb",t];(d[2]=d[2]||[]).push(t)}}const c=t=>t.postMessage([n,s,o,e],_(e));if(t.then){t.then(c)}else{c(t)}}));const y=import("./p-26905bca.js").then((t=>t.worker));const v=x(y,"stencil.table.worker","createWorkerStore");const k=x(y,"stencil.table.worker","syncConfigToWorker");const $=x(y,"stencil.table.worker","syncDataToWorker");const z=x(y,"stencil.table.worker","workerFilter");const C=x(y,"stencil.table.worker","workerSearch");const S=x(y,"stencil.table.worker","workerSort");function D(t){const n=JSON.parse(JSON.stringify(t));t.forEach((t=>{if(!!t.sortCompareFn){const o=n.find((n=>n.prop===t.prop));o.sortCompareFn=t.sortCompareFn.toString()}}));return n}const I=new WeakMap;async function T(t,n,o){const e={data:h({rows:[]}),config:h({columns:n}),general:h({workerId:null,scrollParent:o,host:t})};const i=await v(e.data.state.rows,D(e.config.state.columns));e.general.state.workerId=i;I.set(t,e);e.data.use({reset:()=>{if(e.general.state.workerId)$(e.general.state.workerId,null)},dispose:()=>{if(e.general.state.workerId)$(e.general.state.workerId,null)}});e.config.use({reset:()=>{if(e.general.state.workerId)k(e.general.state.workerId,null)},dispose:()=>{if(e.general.state.workerId)k(e.general.state.workerId,null)}});return e}function R(t){return I.get(t)}function O(t){if(t instanceof Date){return"date"}if(["number","string"].includes(typeof t)){return typeof t}return"unknown"}function j(t,n){const o=I.get(t);if(!o)return;const e=o.config.state.columns;const i=e.filter((t=>t.type==="date")).reduce(((t,n)=>[...t,n.prop]),[]);const r=e.filter((t=>!t.type));n=n.map(((t,n)=>{if(r.length&&n===0){o.config.state.columns=e.map((n=>{if(r.includes(n)&&t[n.prop]&&!n.type){n.type=O(t[n.prop]);if(n.type==="date")i.push(n.prop)}return n}))}i.forEach((n=>{const o=new Date(t[n])??null;if(!!o&&Number(o))t[n]=Number(o)}));t["__index"]=n;t["__uuid"]=d(Object.values(t).join());return t}));o.data.state.rows=n;if(o.general.state.workerId)return $(o.general.state.workerId,n)}function M(t,n){const o=I.get(t);if(!o)return;o.config.state.columns=n;if(o.general.state.workerId)return k(o.general.state.workerId,D(n))}async function A(t,n){const o=I.get(t);if(!o||!o.general.state.workerId)return;try{o.data.state.rows=await C(o.general.state.workerId,n)}catch(t){console.warn(t)}}async function F(t,n){const o=I.get(t);if(!o||!o.general.state.workerId)return;try{o.data.state.rows=await z(o.general.state.workerId,n)}catch(t){console.warn(t)}}async function N(t,n,o){const e=I.get(t);if(!e||!e.general.state.workerId)return;try{e.data.state.rows=await S(e.general.state.workerId,n,o)}catch(t){console.warn(t)}}function P(t,n){const o=E();const e=o.config.state.columns;const i=o.data.state.rows;const r=e[n];const s=r?.prop;const a=i[t];const l=a[e[n].prop];return{prop:s,cellModel:l,column:r,rowIndex:t,rowModel:a}}function B(t){const n=E();const o=n.data.state.rows;const e=o[t];return{row:e,rowIndex:t}}function W(t,n){if(!n)return t;const o={...n,...t};if(n.class){if(typeof n.class==="object"&&typeof o.class==="object"){o.class={...n.class,...o.class}}else if(typeof n.class==="string"&&typeof o.class==="object"){o.class[n.class]=true}else if(typeof o.class==="string"){o.class+=" "+n.class}}if(n.style){o.style={...n.style,...o.style}}return o}function E(){return R(n(o()))}function q(t,n,o){const e={...o};const i=E().config.state.columns[n]?.cellProperties;if(!i)return e;const r=P(t,n);const s=i(r);if(!s)return e;return W(e,s)}function J(t){const n=t?.colTemplate;return n?n(e,t):e(i,null,t.title)}const L=new WeakMap;const H=new WeakMap;function U(t,n,o){if(L.get(t))return;const e=E();const i=e.general.state.scrollParent;const r=new IntersectionObserver((([t])=>{const e=t.rootBounds||document.scrollingElement.getBoundingClientRect();const r={};if(n==="start"){r.start=t.boundingClientRect.x-(e.x+i.scrollLeft)<0&&!t.isIntersecting}if(n==="end"){r.end=t.boundingClientRect.right>t.boundingClientRect.width&&!t.isIntersecting}if(!!o)o(r)}),{threshold:[1],rootMargin:"1px 0px 100px 0px",root:i===document.scrollingElement?null:i});L.set(t,r);setTimeout((()=>r.observe(t)),300)}function G(t,n,o){if(H.get(t))return;const e=E();const i=e.general.state.scrollParent;const r=new IntersectionObserver((([t])=>{const e=t.rootBounds||document.scrollingElement.getBoundingClientRect();const r={};if(n==="top"){r.top=t.boundingClientRect.y-(e.y+i.scrollTop)<0&&!t.isIntersecting}if(n==="bottom"){const n=t.target.getBoundingClientRect();r.bottom=n.height+n.y>e.height&&!t.isIntersecting}if(!!o)o(r)}),{threshold:[1],rootMargin:"0px 100px 0px 100px",root:i===document.scrollingElement?null:i});H.set(t,r);requestAnimationFrame((()=>r.observe(t)))}function K(t,n,o=false){const e={[`${b}__${t}`]:true,[`${b}__pin`]:!!n,[`${b}__pin--top`]:n==="top",[`${b}__pin--bottom`]:n==="bottom"};if(o)return Q(e);return e}function Q(t){let n="";Object.entries(t).forEach((([t,o])=>{if(o)n+=t+" "}));return n}const V=(()=>{let t;let n;let o;let e;const i=60;const r=()=>{t=null;e=0};r();return()=>{n=window.scrollY;if(t!=null)e=n-t;t=n;window.clearTimeout(o);o=window.setTimeout(r,i);return e}})();function X(t){let n=getComputedStyle(t);const o=n.position==="absolute";const e=/(auto|scroll)/;if(n.position==="fixed")return document.documentElement;for(let i=t;i=i.parentElement;){n=getComputedStyle(i);if(o&&n.position==="static"){continue}if(e.test(n.overflow+n.overflowY+n.overflowX))return i}return document.documentElement}function Y(t,n=100){const o=t.getBoundingClientRect();const e=window.innerHeight||document.documentElement.clientHeight;if(!o.bottom&&!o.top&&!o.left&&!o.right&&!o.height&&!o.width&&!o.x&&!o.y)return false;return!(Math.floor(100-(o.top>=0?0:o.top)/+-o.height*100)<n||Math.floor(100-(o.bottom-e)/o.height*100)<n)}function Z(t,n,o){const e=[...o];const i=e.splice(t,1)[0];e.splice(n,0,i);return e}let tt;let nt;let ot;let et;const it=({column:t,headRenderer:n,onColumnSortClick:o,onColumnPinned:r,onColumnDrag:s,onColumnDrop:a,defaults:l})=>{const d=E();function c(t,n){tt=n;nt=ot=t.target;et=nt.closest("."+`${b}__tr`);et.classList.add(`${b}__dragging`);nt.classList.add(`${b}__drag--start`);t.dataTransfer.effectAllowed="move";t.dataTransfer.setData("text/html",nt.innerHTML);s(n.prop,nt)}function h(){et.classList.remove(`${b}__dragging`);nt.classList.remove(`${b}__drag--start`);et.querySelectorAll(`.${b}__drag-mask--active`).forEach((t=>{t.classList.remove(`${b}__drag-mask--active`)}));nt=null;tt=null;et=null;ot=null}function p(t){if(ot===t.target)return;t.preventDefault();t.stopImmediatePropagation();t.dataTransfer.dropEffect="move";et.querySelectorAll(`.${b}__drag-mask--active`).forEach((t=>{t.classList.remove(`${b}__drag-mask--active`)}));ot=t.target;if(!ot.classList.contains(`${b}__drag-mask`)){t.dataTransfer.dropEffect="none";return}ot.classList.add(`${b}__drag-mask--active`)}function _(t){t.stopPropagation();const{colName:n}=this.dataset;if(n===tt.prop)return;const o=d.config.state.columns;let e=o.findIndex((t=>t.prop===n));const i=o.findIndex((t=>t===tt));if(e<i&&this.classList.contains(`${b}__drag-mask--end`))e++;if(e>i&&this.classList.contains(`${b}__drag-mask--start`))e--;if(e===i)return;a(tt.prop,d.config.state.columns[e].prop,nt)}function f(n){let e;switch(t.order){case"asc":e="desc";break;case"desc":e=null;break;default:e="asc"}o(e,t.prop,n.target.closest("th"))}function u(){return!!l.sortable&&t.sortable!==false||!l.sortable&&t.sortable===true}function g(){return!!l.draggable&&t.draggable!==false||!l.draggable&&t.draggable===true}let m={};if(t.columnProperties){m=t.columnProperties(t)||m}const w={class:{...K("th",n?.pinned),[`${b}__pin--start`]:t.pinned==="start",[`${b}__pin--end`]:t.pinned==="end",[`${b}__ordered`]:!!t.order,[`${b}__filtered`]:!!t.filter}};let x=m?W(w,m):w;const y=J(t);if(!y)return e(i,null);x=Number(x.colSpan)>1?{...x,scope:"colgroup"}:{...x,scope:"col"};if(u()){const n=t.order?t.order==="asc"?"ascending":"descending":"none";x={...x,"aria-sort":n}}if(g()){x={...x,draggable:true,onDragStart:n=>c(n,t),onDragOver:t=>t.preventDefault(),onDragEnd:()=>h()}}return e("th",{...x,ref:o=>{if(["end","start"].includes(t.pinned))U(o,t.pinned,r);if(["top","bottom"].includes(n.pinned))G(o,n.pinned,r)},key:t.prop},g()&&[e("div",{class:{[`${b}__drag-mask`]:true,[`${b}__drag-mask--start`]:true},"data-col-name":t.prop,onDragEnter:p,onDrop:_,onDragOver:t=>t.preventDefault()}),e("div",{class:{[`${b}__drag-mask`]:true,[`${b}__drag-mask--end`]:true},"data-col-name":t.prop,onDragEnter:p,onDrop:_,onDragOver:t=>t.preventDefault()})],u()?e("button",{class:{[`${b}__order-btn`]:true,[`${b}__cell-content`]:true},onClick:f},J(t),!!t.filter&&e("nano-icon",{name:"light/filter"}),!!t.order&&(t.order==="desc"?e("nano-icon",{name:"solid/long-arrow-down"}):e("nano-icon",{name:"solid/long-arrow-up"})),e("div",{class:`${b}__status-icons`},e("nano-icon",{name:"light/chevron-down"}))):e("div",{class:`${b}__cell-content`},J(t),!!t.filter&&e("nano-icon",{name:"light/bars-filter"})))};function rt(t,n){const o=E();const r=o.config.state.columns;const s=r[n]?.cellTemplate;const a=P(t,n);if(!!a.cellModel&&r[n].type==="date"){const t=new Date(a.cellModel);if(t instanceof Date&&!isNaN(t)){a.cellModel=!s?`${new Date(a.cellModel).toLocaleDateString()} ${new Date(a.cellModel).toLocaleTimeString()}`:t}}return s?s(e,a):e(i,null,a.cellModel?.toString())}const st=(t,n=false)=>{const o=E();const e=o.config.state.columns[t];const i={[`${b}__td`]:true,[`${b}__ordered`]:!!e.order,[`${b}__pin`]:!!e.pinned,[`${b}__pin--start`]:e.pinned==="start",[`${b}__pin--end`]:e.pinned==="end"};if(n)return Q(i);return i};const at=({rowIndex:t,colIndex:n,nestedContent:o})=>{const r=o||rt(t,n);if(!r)return e(i,null);let s="td";const a=E();const l=a.config.state.columns[n];let d=q(t,n,{class:st(n)});if(l.rowHeader){d=Number(d.rowSpan)>1?{...d,scope:"rowgroup"}:{...d,scope:"row"};s="th"}return e(s,{...d},e("div",{class:`${b}__cell-content`},r))};const lt=({rowRenderer:t,rowIndex:n,row:o,onColumnPinned:i},r,s)=>{let a={};const l=({header:t},n)=>{const o=e("div",{class:b+"__cell-content"},n);return t?e("th",{scope:"row"},o):e("td",null,o)};if(!o){const t=B(n);o=t.row}if(t?.rowProperties){a=t.rowProperties({row:o,rowIndex:n})||a}let d;if(t?.pinned&&typeof t.pinned==="function"){d=t.pinned()}const c={class:K("tr",d)};const h=a?W(c,a):c;const p=t?.template;if(p){let t=p(e,{renderedRow:e("tr",{...h,key:o.__uuid},r),row:o,rowIndex:n},l);if(Array.isArray(t)){t=s.map(t,((t,n)=>{if(t.vtag==="tr"){if(!t.vkey)t.vkey=`${o.__uuid}_${n}`;t.vattrs=W({class:K("tr",d,true)},t.vattrs);if(!!t.vchildren){t.vchildren=s.map(t.vchildren,((t,n)=>{if(["td","th"].includes(t.vtag.toString())){t.vattrs=W({class:K(t.vtag.toString(),d,true)+st(n,true),ref:t=>{if(!!t&&d==="top"||d==="bottom")G(t,d,i);if(!!t&&t.classList.contains("nano-tbl__pin--end"))U(t,"end",i);if(!!t&&t.classList.contains("nano-tbl__pin--start"))U(t,"start",i)}},t.vattrs)}return t}))}}return t}))}return t}return e("tr",{...h,key:o.__uuid},r)};const dt=({rowRenderer:t,onColumnPinned:n},o,i)=>{let r={};if(t.rowProperties){r=t.rowProperties()||{}}const s=({header:t},n)=>{const o=e("div",{class:b+"__cell-content"},n);return t!==false?e("th",{scope:"col"},o):e("td",null,o)};const a=t.pinned||null;const l={class:K("tr",null)};const d=r?W(l,r):l;const c=t?.template;if(c){let t=c(e,{renderedRow:e("tr",{...d},o)},s);if(Array.isArray(t)){t=i.map(t,(t=>{if(t.vtag==="tr"){t.vattrs=W({class:K("tr",a,true)},t.vattrs);if(!!t.vchildren){t.vchildren=i.map(t.vchildren,(t=>{if(["td","th"].includes(t.vtag.toString())){t.vattrs=W({class:K(t.vtag.toString(),a,true),ref:t=>{if(!!t&&a==="top"||a==="bottom")G(t,a,n);if(!!t&&t.classList.contains("nano-tbl__pin--end"))U(t,"end",n);if(!!t&&t.classList.contains("nano-tbl__pin--start"))U(t,"start",n)}},t.vattrs)}return t}))}}return t}))}return t}return e("tr",{...d},o)};const ct=':host{box-sizing:border-box}*,*::before,*::after{box-sizing:border-box}[hidden]{display:none !important}nano-table{display:block;width:100%;--max-col-width:clamp(200px, 30%, 20vw);--color:var(--nano-color-mediumgrey, #68767e);--font-size:0.87rem;--cell-line-height:1.5;--thead-font-size:0.95rem;--thead-color:#455560;--tfoot-color:#455560;--border-color:#dddbda;--border-style:thin solid var(--border-color);--border-tint-color:#0084a9;--border-tint-style:3px solid var(--border-tint-color);--cell-bg-rgb:var(--nano-color-white-rgb, 255 255 255);--head-bg-rgb:250, 250, 249;--foot-bg-rgb:var(--head-bg-rgb);--th-row-bg-rgb:var(--cell-bg-rgb);--ordered-bg-rgb:var(--nano-color-offwhite-rgb, 249 249 251);--td-padding-start:0.625rem;--td-padding-end:0.625rem;--td-padding-top:0.5rem;--td-padding-bottom:0.4125rem;--th-padding-start:0.625rem;--th-padding-end:0.625rem;--th-padding-top:0.875rem;--th-padding-bottom:0.6875rem;--td-padding-v:var(--td-padding-top) var(--td-padding-bottom);--td-padding-h:var(--td-padding-start) var(--td-padding-end);--th-padding-v:var(--th-padding-top) var(--th-padding-bottom);--th-padding-h:var(--th-padding-start) var(--th-padding-end);--foot-th-padding-v:var(--td-padding-top) var(--td-padding-bottom);--foot-th-padding-h:var(--td-padding-start) var(--td-padding-end);--head-th-padding-v:var(--th-padding-top) var(--th-padding-bottom);--head-th-padding-h:var(--th-padding-start) var(--th-padding-end);--bookend-col-padding:2rem}.nano-tbl{color:var(--color);text-align:start;width:100%;font-size:var(--font-size);border-spacing:0 0;border-collapse:separate;background:rgb(var(--cell-bg-rgb));border-inline-end:1px solid transparent;border-block-start:1px solid transparent;position:relative;z-index:1}.nano-tbl__wrap{display:table;min-width:100%}.nano-tbl__top-anchor{clip:rect(1px, 1px, 1px, 1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);block-size:1px;inline-size:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;position:relative}.nano-tbl__ordered{background-color:var(--ordered-bg);border-inline-start:var(--border-style);border-inline-end:var(--border-style)}.nano-tbl__drag-mask{display:none;position:absolute;inset-block:-2px -2px;z-index:10;opacity:0;transition:0.2s ease opacity}.nano-tbl__drag-mask--start{width:calc(50% + 2px);inset-inline-start:-2px;border-inline-start:2px dashed var(--border-tint-color)}.nano-tbl__drag-mask--end{width:50%;inset-inline-end:0;border-inline-end:2px dashed var(--border-tint-color)}.nano-tbl__drag-mask--active{opacity:1}.nano-tbl__dragging .nano-tbl__drag-mask{display:block}.nano-tbl__drag--start{opacity:0.4}.nano-tbl__dragging .nano-tbl__td,.nano-tbl__dragging .nano-tbl__th{cursor:no-drop}.nano-tbl__dragging .nano-tbl__td .nano-tbl__cell-content,.nano-tbl__dragging .nano-tbl__th .nano-tbl__cell-content{pointer-events:none}.nano-tbl__order-btn{padding:0;border:none;outline:none;font:inherit;background:none;-webkit-appearance:none;appearance:none;color:inherit;display:flex;gap:10px;align-items:center;width:100%}.nano-tbl__status-icons{margin-inline:auto 10px;display:flex;gap:10px}.nano-tbl__progress-bar{font-size:0.2rem;position:sticky;inset-block-start:0;inset-inline:0;z-index:10;transition:scale 0.25s;scale:0;width:100%;height:0}.nano-tbl__progress-bar--show{scale:1;height:auto}.nano-tbl__caption--hide{clip:rect(1px, 1px, 1px, 1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);block-size:1px;inline-size:1px;margin:-1px;overflow:hidden;padding:0;position:absolute}.nano-tbl__td,.nano-tbl__th{line-height:var(--cell-line-height);text-align:start;border-block-start:var(--border-style);max-width:var(--max-col-width);background-color:rgb(var(--cell-bg-rgb))}tbody:first-of-type tr:first-child .nano-tbl__td,tbody:first-of-type tr:first-child .nano-tbl__th{border-block-start:none}tbody:last-of-type tr:last-child .nano-tbl__td,tbody:last-of-type tr:last-child .nano-tbl__th{border-block-end:var(--border-style)}.md .nano-tbl__td:first-child .nano-tbl__cell-content,.md .nano-tbl__th:first-child .nano-tbl__cell-content{padding-inline-start:var(--bookend-col-padding)}.md .nano-tbl__td:last-child .nano-tbl__cell-content,.md .nano-tbl__th:last-child .nano-tbl__cell-content{padding-inline-end:var(--bookend-col-padding)}@media (max-width: 768px){.nano-tbl__td:first-child .nano-tbl__cell-content,.nano-tbl__th:first-child .nano-tbl__cell-content{padding-inline-start:var(--td-padding-start) !important}.nano-tbl__td:last-child .nano-tbl__cell-content,.nano-tbl__th:last-child .nano-tbl__cell-content{padding-inline-end:var(--td-padding-end) !important}}thead .nano-tbl__td,thead .nano-tbl__th{color:var(--thead-color);font-weight:800;background:rgba(var(--head-bg-rgb), 90%);font-size:var(--thead-font-size);border-block-start:none !important;transition:all 0.2s ease}thead .nano-tbl__td .nano-tbl__cell-content,thead .nano-tbl__th .nano-tbl__cell-content{padding-block:var(--head-th-padding-v);padding-inline:var(--head-th-padding-h)}tfoot .nano-tbl__td,tfoot .nano-tbl__th{color:var(--tfoot-color);font-weight:800;border-block-start:none;background:rgba(var(--foot-bg-rgb), 90%);font-size:var(--thead-font-size)}tfoot .nano-tbl__td .nano-tbl__cell-content,tfoot .nano-tbl__th .nano-tbl__cell-content{padding-block:var(--foot-th-padding-v);padding-inline:var(--foot-th-padding-h)}.nano-tbl__td.nano-tbl__ordered,.nano-tbl__th.nano-tbl__ordered{background-color:rgba(var(--ordered-bg-rgb), 0.8) !important}.nano-tbl__cell-content{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding-block:var(--td-padding-v);padding-inline:var(--td-padding-h)}.nano-tbl__cell-content--no-result{padding-block:2rem}.nano-tbl tbody{will-change:scroll-position;visibility:visible}.nano-tbl tbody.nano-tbl__inactive{visibility:hidden}.nano-tbl th[scope=row]{font-weight:800;margin:0}.nano-tbl__pin{position:sticky;z-index:1}.nano-tbl__pin--start{inset-inline:-1px auto;transition:max-width 0.25s ease;z-index:2}.nano-tbl__pin--start::after{content:"";position:absolute;inset:0;box-shadow:5px 1px 4px 0 rgba(0, 0, 0, 0.2);opacity:0;z-index:-1}.nano-tbl__pinned--start .nano-tbl__pin--start{z-index:2;max-width:125px !important}.sm .nano-tbl__pinned--start .nano-tbl__pin--start{max-width:var(--max-col-width) !important}.nano-tbl__pinned--start .nano-tbl__pin--start::after{opacity:1}.nano-tbl__pin--end{z-index:2;}.nano-tbl__pin--start+.nano-tbl__pin--end{inset-inline:auto auto}.nano-tbl__pin--start+.nano-tbl__pin--end::after{display:none}.sm .nano-tbl__pin--end{inset-inline:auto -1px !important;max-width:min(50vw, 200px)}.sm .nano-tbl__pin--end::after{display:block !important;content:"";position:absolute;inset:0;box-shadow:-5px 1px 4px 0 rgba(0, 0, 0, 0.2);opacity:0;z-index:-1}.sm .nano-tbl__pinned--end .nano-tbl__pin--end{z-index:3}.sm .nano-tbl__pinned--end .nano-tbl__pin--end::after{opacity:1}.nano-tbl__pin--top{inset-block:-1px auto;z-index:3}.nano-tbl__pinned--top .nano-tbl__pin--top{z-index:4 !important}.nano-tbl__pin--bottom{inset-block:auto -1px;z-index:3}.nano-tbl__pinned--bottom .nano-tbl__pin--bottom{z-index:5 !important}.nano-tbl__pin--top.nano-tbl__pin--start{z-index:4}.nano-tbl__pinned--start .nano-tbl__pin--top.nano-tbl__pin--start{z-index:5 !important}.nano-tbl__pinned--top.nano-tbl__pinned--start .nano-tbl__pin--top.nano-tbl__pin--start{z-index:6 !important}.nano-tbl__pin--top.nano-tbl__pin--end{z-index:4}.nano-tbl__pinned--end .nano-tbl__pin--top.nano-tbl__pin--end{z-index:5 !important}.nano-tbl__pinned--top.nano-tbl__pinned--end .nano-tbl__pin--top.nano-tbl__pin--end{z-index:6 !important}.nano-tbl__pin--bottom.nano-tbl__pin--start{z-index:4}.nano-tbl__pinned--start .nano-tbl__pin--bottom.nano-tbl__pin--start{z-index:5 !important}.nano-tbl__pinned--bottom.nano-tbl__pinned--start .nano-tbl__pin--bottom.nano-tbl__pin--start{z-index:6 !important}.nano-tbl__pin--bottom.nano-tbl__pin--end{z-index:4}.nano-tbl__pinned--end .nano-tbl__pin--bottom.nano-tbl__pin--end{z-index:5 !important}.nano-tbl__pinned--bottom.nano-tbl__pinned--end .nano-tbl__pin--bottom.nano-tbl__pin--end{z-index:6 !important}.nano-tbl thead tr:last-of-type td,.nano-tbl thead tr:last-of-type th{border-block-end:var(--border-tint-style)}.nano-tbl tfoot tr:first-of-type td,.nano-tbl tfoot tr:first-of-type th{border-block-start:none}.nano-tbl tfoot tr:last-of-type td,.nano-tbl tfoot tr:last-of-type th{border-block-end:var(--border-tint-style)}.nano-tbl__pinned--bottom .nano-tbl tfoot tr.nano-tbl__pin--bottom:first-of-type td,.nano-tbl__pinned--bottom .nano-tbl tfoot tr.nano-tbl__pin--bottom:first-of-type th{border-block-start:var(--border-tint-style) !important}.nano-tbl__pinned--bottom .nano-tbl tfoot tr.nano-tbl__pin--bottom:last-of-type td,.nano-tbl__pinned--bottom .nano-tbl tfoot tr.nano-tbl__pin--bottom:last-of-type th{border-block-end:none !important}.nano-tbl .unlimited-width{max-width:none}.nano-tbl__spinner{font-size:1.5rem;transition:scale 0.25s;scale:0;padding:0.5rem;position:absolute;inset-block-end:0;inset-inline-start:calc(50% - 0.75rem);z-index:0}.nano-tbl__spinner--show{scale:1;position:sticky}.nano-tbl nano-skeleton{line-height:var(--cell-line-height)}';let ht=0;const bt=class{constructor(t){r(this,t);this.nanoTblBlockRendered=s(this,"nanoTblBlockRendered",7);this.nanoTblReady=s(this,"nanoTblReady",7);this.nanoTblBeforeSort=s(this,"nanoTblBeforeSort",7);this.nanoTblAfterSort=s(this,"nanoTblAfterSort",7);this.nanoTblColDrag=s(this,"nanoTblColDrag",7);this.nanoTblColDrop=s(this,"nanoTblColDrop",7);this.nanoTblBeforeFilter=s(this,"nanoTblBeforeFilter",7);this.nanoTblAfterFilter=s(this,"nanoTblAfterFilter",7);this.nanoTblBeforeSearch=s(this,"nanoTblBeforeSearch",7);this.nanoTblAfterSearch=s(this,"nanoTblAfterSearch",7);this.debounceSetLoading=t=>{this._loading=t};this.renderId="tbl-"+ht++;this.filters=[];this.currentFilters="[]";this.currentSort="";this.blockIos=new WeakMap;this.blockHeights=[];this.unitHeight=0;this.ignoreIO=true;this._isReady=false;this.colDrag=t=>{this.nanoTblColDrag.emit({column:t})};this.colDrop=(t,n)=>{const o=this.store.config.state.columns;const e=o.findIndex((t=>t.prop===n));const i=o.findIndex((n=>n.prop===t));const r=this.nanoTblColDrop.emit({fromCol:t,toCol:n,fromIndex:i,toIndex:e});if(r.defaultPrevented)return;this.store.config.state.columns=Z(i,e,o)};this.sortStart=async(t,n,o)=>{if(this.currentSort===t+":"+n)return;this.loading=true;const e=this.nanoTblBeforeSort.emit({column:n,order:t});if(e.defaultPrevented)return;this.currentSort=t+":"+n;this.scrollToTop(o);if(this.customSortFn){try{await this.customSortFn(n,t);this.sortComplete(t,n)}catch(t){console.warn("custom sort failed",t)}return}try{await N(this.host,n,t);this.sortComplete(t,n)}catch(t){console.warn("sort failed",t);this.currentSort=""}finally{this.loading=false}};this.setupBlockIO=(t,n)=>{if(!t||this.blockIos.has(t))return;const o=new IntersectionObserver((([o])=>{if(this.ignoreIO)return;if(o.isIntersecting){a((()=>{if(this.scrollSpeed<100||Y(t,.01)){this.activeBlocks=[n,n+1,Math.max(0,n-1)];this.nanoTblBlockRendered.emit({block:n,totalBlocks:this.blockElements.length});requestAnimationFrame((()=>this.setBlockHeight()))}}))}}),{threshold:[0],root:this.scrollParent===document.scrollingElement?null:this.scrollParent});o.observe(t);this.blockIos.set(t,o)};this.handleColumnPinned=t=>{Object.entries(t).forEach((([t,n])=>{this.tableEle.classList.toggle(`${b}__pinned--${t}`,n)}))};this.handleResizeChange=t=>{this.tableWrapperEle.className="";this.tableWrapperEle.classList.add(...(t.target.className+" "+`${b}__wrap`).split(" "))};this.type="table";this.caption=undefined;this.showCaption=false;this._loading=false;this.placeholderSize=5;this.rows=undefined;this.columns=[];this.headRender={pinned:"top"};this.rowRender=undefined;this.footRender={pinned:"bottom"};this.showFooter=false;this.perBlock=60;this.searchTerm=undefined;this.customFilterFn=undefined;this.customSortFn=undefined;this.defaultSort=true;this.defaultColDraggable=false;this.blocks=[];this.activeBlocks=[0,1,2];this.measureHeight=0;this.debounceSetLoading=c(this.debounceSetLoading.bind(this),50)}get loading(){return this._loading}set loading(t){this.debounceSetLoading(t)}handleRowsChange(){if(!this.rows){this.loading=true;return}this.loading=true;Promise.resolve(this.rows).then((async t=>{await j(this.host,t);this.currentFilters="";this.currentSort="";await this.columnInit();if(!this.isReady)this.setInitialBlockDimension();this.loading=false}))}async handleColsChange(){await M(this.host,this.columns);if(this.isReady)this.columnInit()}get blocksLength(){return this.blocks.length}handleSearchTermChange(){this.searchStart()}async resetSorting(){const t=this.columns.find((t=>!!t.order));if(!t)return;return this.sortStart(null,t.prop)}async addSort(t,n){const o=this.columns.find((n=>n.prop===t));if(!o)throw"Cannot find column with "+t;return this.sortStart(n,o.prop)}async resetFilters(){this.filters=[];return this.filterStart()}async addFilters(t,n=true){if(!n)this.filters=[];return this.filterStart(t,n)}async removeFilters(t){this.filters=this.filters.filter((n=>!t.includes(n.prop)));return this.filterStart()}set measureEle(t){if(!t)return;this.measureHeight=t.getBoundingClientRect().height;this.unitHeight=t.querySelector("tr")?.getBoundingClientRect().height||this.unitHeight}get isReady(){return this._isReady}set isReady(t){if(t===this._isReady)return;this._isReady=t;if(this.isReady)requestAnimationFrame((()=>this.handleReady()))}scrollListener(){const t=V();this.scrollSpeed=t<0?t*-1:t}handleReady(){const t=window.location.hash;if(t.length>1){const n=document.querySelector(t);if(n){n.scrollIntoView()}}this.nanoTblReady.emit()}sortComplete(t,n){this.columns=this.columns.map((o=>{if(o.prop===n)return{...o,order:t};return{...o,order:null}}));this.nanoTblAfterSort.emit({column:n,order:t})}async searchStart(){this.loading=true;const t=this.nanoTblBeforeSearch.emit({term:this.searchTerm});if(t.defaultPrevented)return;this.scrollToTop();try{await A(this.host,this.searchTerm);this.nanoTblAfterSearch.emit({term:this.searchTerm})}catch(t){console.warn("search failed",t)}finally{this.loading=false}}async filterStart(t,n=true){if(t){if(n){this.filters=[...this.filters.filter((n=>!t.find((t=>t.prop===n.prop)))),...t]}else{this.filters=t}}if(this.currentFilters===JSON.stringify(this.filters))return;this.loading=true;const o=this.nanoTblBeforeFilter.emit({filters:this.filters});if(o.defaultPrevented)return;this.currentFilters=JSON.stringify(this.filters);this.scrollToTop();if(this.customFilterFn){try{await this.customFilterFn(this.filters);this.filterComplete()}catch(t){console.warn("custom filter failed",t);this.currentFilters=""}return}try{await F(this.host,this.filters);this.filterComplete()}catch(t){console.warn("filter failed",t)}finally{this.loading=false}}filterComplete(){this.columns=this.columns.map((t=>{const n=this.filters.find((n=>n.prop===t.prop));if(n)t.filter=n.filter;return t}));this.nanoTblAfterFilter.emit({filters:this.filters})}scrollToTop(t){const n=this.scrollParent.style?.scrollBehavior;const o=this.scrollParent.scrollLeft;this.scrollParent.style.scrollBehavior="auto";if(this.topAnchorEle&&!Y(this.topAnchorEle,.1)){this.host.scrollIntoView()}if(t&&!Y(t,1))setTimeout((()=>t.scrollIntoView({block:"start"})),500);if(o)this.scrollParent.scrollLeft=o;if(n)this.scrollParent.style.scrollBehavior=n}setMeasureElement(){a((()=>{this.measureEle=this.blockElements.find((t=>!t?.classList?.contains(`${b}__inactive`)))}))}setInitialBlockDimension(){if(!this.blockElements?.length)return;const t=new Promise((t=>{a((()=>{this.setMeasureElement();if(!this.measureEle&&!this.unitHeight)t();this.blockElements.forEach(((n,o)=>{if(!n||!n.classList?.contains(`${b}__inactive`)){if(o===this.blockElements.length-1)t();return}if(o===this.blockElements.length-1)t()}))}))}));t.then((()=>{requestAnimationFrame((()=>{this.isReady=true}))}))}async columnInit(){this.filters=this.columns.filter((t=>!!t.filter)).map((t=>{const{filter:n,prop:o}=t;return{filter:n,prop:o}}));if(this.searchTerm){await this.searchStart()}if(this.filters.length){await this.filterStart()}const t=this.columns.find((t=>!!t.order));if(!!t){await this.sortStart(t.order,t.prop)}}setBlocks(){this.activeBlocks=[0,1,2];this.ignoreIO=true;let t=1;const n=this.store.data.state.rows.length;let o=[];const e=[];this.blockHeights=[];for(t;t<=n;t++){o.push(this.store.data.state.rows[t-1]);if(t%this.perBlock===0){e.push({rows:o,__uuid:d(o.map((t=>t.__uuid)).join())});o=[]}}if(o.length)e.push({rows:o,__uuid:d(o.map((t=>t.__uuid)).join())});this.blocks=e}getBlockHeight(t){if(this.activeBlocks.includes(t))return undefined;if(this.blockHeights.length){const n=this.blockHeights.find((n=>n.blockIndex===t));if(n)return n.height+"px"}const n=this.blocks[t].rows.length;if(n===this.perBlock&&this.measureHeight){return this.measureHeight+"px"}return this.unitHeight?this.unitHeight*n+"px":undefined}setBlockHeight(){a((()=>{this.activeBlocks.forEach((t=>{const n=this.blockElements[t];if(!n)return;const o=n.getBoundingClientRect().height;const e=this.blockHeights.findIndex((n=>n.blockIndex===t));if(e>0){this.blockHeights[e]={height:o,blockIndex:t}}else this.blockHeights.push({height:o,blockIndex:t})}))}))}processSlots(){if(!this.caption&&!this.host.querySelector('[slot="caption"]')){console.error("For accessibility you must set a `caption` prop or use the `caption` slot")}}async componentWillLoad(){this.scrollParent=X(this.host);this.store=await T(this.host,this.columns,this.scrollParent);await this.handleRowsChange();this.processSlots();this.store.data.onChange("rows",(()=>this.setBlocks()));this.setBlocks()}connectedCallback(){this.scrollParent=X(this.host)}componentDidLoad(){this.setInitialBlockDimension()}componentShouldUpdate(t,n,o){if(["rows","columns"].includes(o))return false}componentWillRender(){}componentDidRender(){requestAnimationFrame((()=>this.ignoreIO=false));this.setMeasureElement()}render(){this.blockElements=[];return e(l,null,e("div",{class:`${b}__top-anchor`,ref:t=>this.topAnchorEle=t}," "),e("nano-resize-observe",{"aria-labelledby":"table-caption-"+this.renderId,tabindex:this.type==="grid"?"0":undefined,states:"576w sm, 768w md",class:"sm md",onNanoResizeStateChange:this.handleResizeChange}),e("div",{class:`${b}__wrap sm md`,ref:t=>this.tableWrapperEle=t},e("nano-progress-bar",{indeterminate:true,class:{[`${b}__progress-bar`]:true,[`${b}__progress-bar--show`]:this._loading}}),e("table",{role:this.type==="grid"?"grid":undefined,"aria-readonly":this.type==="table"?"true":undefined,"aria-rowcount":this.store.data.state.rows.length,"aria-colcount":this.store.config.state.columns.length,class:`${b}`,ref:t=>this.tableEle=t},e("caption",{class:{[`${b}__caption`]:true,[`${b}__caption--hide`]:!this.showCaption},id:"table-caption-"+this.renderId},e("slot",{name:"caption"},this.caption)),e("thead",null,e(dt,{rowRenderer:this.headRender,onColumnPinned:this.handleColumnPinned},this.store.config.state.columns.map((t=>[e(it,{column:t,headRenderer:this.headRender,onColumnSortClick:this.sortStart,onColumnPinned:this.handleColumnPinned,onColumnDrag:this.colDrag,onColumnDrop:this.colDrop,defaults:{sortable:this.defaultSort,draggable:this.defaultColDraggable}})])))),this._loading&&!this.blocks.length&&e("tbody",{class:`${b}__active`},[...Array(10).keys()].map((t=>e("tr",null,this.store.config.state.columns.map(((n,o)=>e(at,{rowIndex:t,colIndex:o,nestedContent:e("nano-skeleton",null)}))))))),!this._loading&&!this.blocks.length&&e("tr",null,e("th",{class:`${b}__th`,colSpan:this.store.config.state.columns.length},e("div",{class:"nano-tbl__cell-content nano-tbl__cell-content--no-result"},e("slot",{name:"no-results"},"No results found")))),this.blocks.map(((t,n)=>e("tbody",{key:t.__uuid,id:`tbody-${this.renderId}-${n}`,ref:t=>{this.blockElements.push(t);this.setupBlockIO(t,n)},class:{[`${b}__inactive`]:!this.activeBlocks.includes(n),[`${b}__active`]:this.activeBlocks.includes(n)}},this.activeBlocks.includes(n)?t.rows.map(((t,o)=>{const i=n>0?n*this.perBlock+o:o;return e(lt,{rowRenderer:this.rowRender,row:t,rowIndex:i},this.store.config.state.columns.map(((t,n)=>e(at,{rowIndex:i,colIndex:n}))))})):e("td",{colSpan:this.store.config.state.columns.length,style:{height:this.getBlockHeight(n)}})))),this.showFooter&&e("tfoot",null,e(dt,{rowRenderer:this.footRender,onColumnPinned:this.handleColumnPinned},this.store.config.state.columns.map((t=>[e(it,{column:t,headRenderer:this.footRender,onColumnPinned:this.handleColumnPinned,onColumnSortClick:this.sortStart,defaults:{sortable:this.defaultSort,draggable:this.defaultColDraggable}})]))))),!!this.blocks.length&&e("nano-spinner",{type:"circle",class:{[`${b}__spinner`]:true,[`${b}__spinner--show`]:this._loading}})))}get host(){return n(this)}static get watchers(){return{rows:["handleRowsChange"],columns:["handleColsChange"],searchTerm:["handleSearchTermChange"]}}};bt.style=ct;export{bt as T,w as c};
|
5
|
+
//# sourceMappingURL=p-8fc2a38d.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":["src/components/table/table.constants.ts","@worker-helper","src/components/table/table.store.ts","src/components/table/table.utils.tsx","src/components/table/table.header.tsx","src/components/table/table.cell.tsx","src/components/table/table.row.tsx","src/components/table/table.scss?tag=nano-table","src/components/table/table.tsx"],"names":["CSSNAMESPACE","isInstanceOf","value","className","C","globalThis","getTransferables","constructor","Object","values","Array","isArray","flatMap","buffer","pendingIds","callbackIds","pending","Map","callbacks","createWorker","workerPath","workerName","workerMsgId","worker","Worker","name","addEventListener","data","workerMsg","id","err","resolve","reject","get","delete","errObj","assign","Error","message","consoleError","forEach","e","createWorkerProxy","exportedMethod","args","Promise","pendingId","i","argLen","length","mainData","set","callbackId","push","postMessage","w","then","colsToWorker","columns","safeColumns","JSON","parse","stringify","c","sortCompareFn","safeCol","find","sc","prop","toString","stores","WeakMap","async","generateStore","host","scrollParent","store","createStore","rows","config","general","workerId","createWorkerStore","state","use","reset","syncDataToWorker","dispose","syncConfigToWorker","getStore","getDataType","Date","includes","storeSetData","cols","dateCols","filter","col","type","reduce","prev","curr","unknownCols","map","row","colName","coerceDate","Number","cyrb53","join","storeSetConfig","storeSearch","term","workerSearch","console","warn","storeFilter","filters","workerFilter","storeSort","order","workerSort","colDataModel","rowIndex","colIndex","fetchStores","column","rowModel","cellModel","rowDataModel","mergeProperties","current","extra","props","class","style","getElement","getRenderingRef","mergeCellProperties","defaultProps","extraPropsFunc","cellProperties","colheadFootRender","tpl","colTemplate","h","Fragment","title","stickyHIOs","stickyVIOs","addHObserver","el","pos","cb","root","observer","IntersectionObserver","rootBounds","document","scrollingElement","getBoundingClientRect","positions","start","boundingClientRect","x","scrollLeft","isIntersecting","end","right","width","threshold","rootMargin","setTimeout","observe","addVObserver","top","y","scrollTop","target","bottom","height","requestAnimationFrame","headerPinClasses","vPinned","classes","[object Object]","classListToStr","classString","entries","on","detectScrollSpeed","lastPos","newPos","timer","delta","delay","clear","window","scrollY","clearTimeout","findScrollParent","element","getComputedStyle","excludeStaticParent","position","overflowRegex","documentElement","parent","parentElement","test","overflow","overflowY","overflowX","isInViewport","percentVisible","r","windowHeight","innerHeight","clientHeight","left","Math","floor","arrMove","from","to","arr","newArr","item","splice","draggingCol","draggingColEle","dragEnterEle","draggingParent","TableColHead","headRenderer","onColumnSortClick","onColumnPinned","onColumnDrag","onColumnDrop","defaults","handleDragStart","closest","classList","add","dataTransfer","effectAllowed","setData","innerHTML","handleDragEnd","remove","querySelectorAll","handleDragEnter","preventDefault","stopImmediatePropagation","dropEffect","contains","handleDrop","stopPropagation","this","dataset","toIndex","findIndex","fromIndex","handleColumnSortClick","isSortable","sortable","isDraggable","draggable","extraProps","columnProperties","baseProps","pinned","content","colSpan","scope","sort","aria-sort","onDragStart","onDragOver","onDragEnd","ref","th","key","data-col-name","onDragEnter","onDrop","onClick","cellRender","cellTemplate","model","d","isNaN","toLocaleDateString","toLocaleTimeString","baseCellClasses","TableCell","nestedContent","CellType","rowHeader","rowSpan","TableRow","rowRenderer","children","utils","header","cell","rowProperties","template","toRender","renderedRow","__uuid","node","vtag","vkey","vattrs","vchildren","cNode","TableHeadFootRow","tableCss","Table","hostRef","debounceSetLoading","l","_loading","renderId","currentFilters","currentSort","blockIos","blockHeights","unitHeight","ignoreIO","_isReady","colDrag","nanoTblColDrag","emit","colDrop","fromCol","toCol","dropEvent","nanoTblColDrop","defaultPrevented","sortStart","loading","sortEvent","nanoTblBeforeSort","scrollToTop","customSortFn","sortComplete","setupBlockIO","blockIndex","has","blockIo","ioEntry","readTask","scrollSpeed","activeBlocks","max","nanoTblBlockRendered","block","totalBlocks","blockElements","setBlockHeight","handleColumnPinned","applied","tableEle","toggle","handleResizeChange","tableWrapperEle","split","debounce","bind","columnInit","isReady","setInitialBlockDimension","blocksLength","blocks","searchStart","filterStart","additive","columnNames","f","measureEle","measureHeight","querySelector","ready","handleReady","speed","hash","location","idRow","scrollIntoView","nanoTblReady","nanoTblAfterSort","nanoTblBeforeSearch","searchTerm","nanoTblAfterSearch","ff","nanoTblBeforeFilter","customFilterFn","filterComplete","cFilter","nanoTblAfterFilter","scrollBehaviour","scrollBehavior","scrollX","topAnchorEle","b","finishResizing","setMeasureElement","perBlock","undefined","cachedBlockHeight","bh","blockLength","fBhI","caption","error","handleRowsChange","processSlots","onChange","setBlocks","_newVal","_oldVal","stateName","Host","a","aria-labelledby","tabindex","states","onNanoResizeStateChange","div","indeterminate","role","aria-readonly","aria-rowcount","aria-colcount","tbl","showCaption","headRender","colModel","defaultSort","defaultColDraggable","keys","_colModel","tb","rowRender","getBlockHeight","showFooter","footRender"],"mappings":"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","sourcesContent":["export const CSSNAMESPACE = 'nano-tbl';\n","\nimport { consoleError } from '@stencil/core/internal';\n\n\nconst isInstanceOf = (value, className) => {\n const C = globalThis[className];\n return C != null && value instanceof C;\n}\nconst getTransferables = (value) => {\n if (value != null) {\n if (\n isInstanceOf(value, \"ArrayBuffer\") ||\n isInstanceOf(value, \"MessagePort\") ||\n isInstanceOf(value, \"ImageBitmap\") ||\n isInstanceOf(value, \"OffscreenCanvas\")\n ) {\n return [value];\n }\n if (typeof value === \"object\") {\n if (value.constructor === Object) {\n value = Object.values(value);\n }\n if (Array.isArray(value)) {\n return value.flatMap(getTransferables);\n }\n return getTransferables(value.buffer);\n }\n }\n return [];\n};\n\nlet pendingIds = 0;\nlet callbackIds = 0;\nconst pending = new Map();\nconst callbacks = new Map();\n\nexport const createWorker = (workerPath, workerName, workerMsgId) => {\n const worker = new Worker(workerPath, {name:workerName});\n\n worker.addEventListener('message', ({data}) => {\n if (data) {\n const workerMsg = data[0];\n const id = data[1];\n const value = data[2];\n\n if (workerMsg === workerMsgId) {\n const err = data[3];\n const [resolve, reject, callbackIds] = pending.get(id);\n pending.delete(id);\n\n if (err) {\n const errObj = (err.isError)\n ? Object.assign(new Error(err.value.message), err.value)\n : err.value;\n\n consoleError(errObj);\n reject(errObj);\n } else {\n if (callbackIds) {\n callbackIds.forEach(id => callbacks.delete(id));\n }\n resolve(value);\n }\n } else if (workerMsg === workerMsgId + '.cb') {\n try {\n callbacks.get(id)(...value);\n } catch (e) {\n consoleError(e);\n }\n }\n }\n });\n\n return worker;\n};\n\nexport const createWorkerProxy = (worker, workerMsgId, exportedMethod) => (\n (...args) => new Promise((resolve, reject) => {\n let pendingId = pendingIds++;\n let i = 0;\n let argLen = args.length;\n let mainData = [resolve, reject];\n pending.set(pendingId, mainData);\n\n for (; i < argLen; i++) {\n if (typeof args[i] === 'function') {\n const callbackId = callbackIds++;\n callbacks.set(callbackId, args[i]);\n args[i] = [workerMsgId + '.cb', callbackId];\n (mainData[2] = mainData[2] || []).push(callbackId);\n }\n }\n const postMessage = (w) => (\n w.postMessage(\n [workerMsgId, pendingId, exportedMethod, args],\n getTransferables(args)\n )\n );\n if (worker.then) {\n worker.then(postMessage);\n } else {\n postMessage(worker);\n }\n })\n);\n","import { createStore, ObservableMap } from '@stencil/store';\nimport { cyrb53 } from '../../utils/math';\nimport {\n createWorkerStore,\n syncConfigToWorker,\n syncDataToWorker,\n workerFilter,\n workerSearch,\n workerSort,\n} from './table.worker';\nimport type { TableTypes } from '../../interface';\n\nexport interface TableStores {\n data: ObservableMap<{ rows: TableTypes.NanoTable['rows'] }>;\n config: ObservableMap<{ columns: TableTypes.NanoTable['columns'] }>;\n general: ObservableMap<{\n workerId: string;\n scrollParent: HTMLElement;\n host: HTMLNanoTableElement;\n }>;\n}\n\nfunction colsToWorker(columns: TableTypes.NanoTable['columns']) {\n const safeColumns: Partial<TableTypes.ColumnConfig>[] = JSON.parse(\n JSON.stringify(columns)\n );\n columns.forEach((c) => {\n if (!!c.sortCompareFn) {\n const safeCol = safeColumns.find((sc) => sc.prop === c.prop);\n safeCol.sortCompareFn = c.sortCompareFn.toString();\n }\n });\n return safeColumns;\n}\n\nconst stores: WeakMap<HTMLElement, TableStores> = new WeakMap();\n\nexport async function generateStore(\n host: HTMLNanoTableElement,\n columns: TableTypes.NanoTable['columns'],\n scrollParent: HTMLElement\n) {\n const store: TableStores = {\n data: createStore({ rows: [] }),\n config: createStore({ columns }),\n general: createStore({ workerId: null, scrollParent, host }),\n };\n\n const id = await createWorkerStore(\n store.data.state.rows,\n colsToWorker(store.config.state.columns)\n );\n store.general.state.workerId = id;\n stores.set(host, store);\n\n // sync data from our store to our worker\n\n store.data.use({\n reset: () => {\n if (store.general.state.workerId)\n syncDataToWorker(store.general.state.workerId, null);\n },\n dispose: () => {\n if (store.general.state.workerId)\n syncDataToWorker(store.general.state.workerId, null);\n },\n });\n store.config.use({\n reset: () => {\n if (store.general.state.workerId)\n syncConfigToWorker(store.general.state.workerId, null);\n },\n dispose: () => {\n if (store.general.state.workerId)\n syncConfigToWorker(store.general.state.workerId, null);\n },\n });\n return store;\n}\n\nexport function getStore(host: HTMLElement) {\n return stores.get(host);\n}\n\nfunction getDataType(value: any): TableTypes.ColumnType {\n if (value instanceof Date) {\n return 'date';\n }\n if (['number', 'string'].includes(typeof value)) {\n return typeof value as 'string' | 'number';\n }\n return 'unknown';\n}\n\nexport function storeSetData(host: HTMLElement, rows: TableTypes.RowData[]) {\n const store = stores.get(host);\n if (!store) return;\n\n const cols = store.config.state.columns;\n const dateCols: (keyof TableTypes.RowData)[] = cols\n .filter((col) => col.type === 'date')\n .reduce((prev, curr) => {\n return [...prev, curr.prop];\n }, []);\n const unknownCols: TableTypes.RowData[] = cols.filter((col) => !col.type);\n\n // augments data with some internal.\n // discern unknown column types\n // convert dates to numbers for worker\n rows = rows.map((row, i) => {\n // try our best to discern the column type (from first row) if unset\n if (unknownCols.length && i === 0) {\n store.config.state.columns = cols.map((col) => {\n if (unknownCols.includes(col) && row[col.prop] && !col.type) {\n col.type = getDataType(row[col.prop]);\n if (col.type === 'date') dateCols.push(col.prop);\n }\n return col;\n });\n }\n\n // convert date columns into numbers to send to our worker\n dateCols.forEach((colName) => {\n // coerce any date type;\n // Date(), timestamp, valid date string\n const coerceDate = new Date(row[colName]) ?? null;\n if (!!coerceDate && Number(coerceDate)) row[colName] = Number(coerceDate);\n });\n\n row['__index'] = i;\n row['__uuid'] = cyrb53(Object.values(row).join());\n\n return row;\n });\n store.data.state.rows = rows;\n\n if (store.general.state.workerId)\n return syncDataToWorker(store.general.state.workerId, rows);\n}\n\nexport function storeSetConfig(\n host: HTMLElement,\n columns: TableTypes.ColumnConfig[]\n) {\n const store = stores.get(host);\n if (!store) return;\n\n store.config.state.columns = columns;\n\n if (store.general.state.workerId)\n return syncConfigToWorker(\n store.general.state.workerId,\n colsToWorker(columns)\n );\n}\n\nexport async function storeSearch(host: HTMLElement, term: string) {\n const store = stores.get(host);\n if (!store || !store.general.state.workerId) return;\n\n try {\n store.data.state.rows = await workerSearch(\n store.general.state.workerId,\n term\n );\n } catch (e) {\n console.warn(e);\n }\n}\n\nexport async function storeFilter(\n host: HTMLElement,\n filters: TableTypes.Filter[]\n) {\n const store = stores.get(host);\n if (!store || !store.general.state.workerId) return;\n\n try {\n store.data.state.rows = await workerFilter(\n store.general.state.workerId,\n filters\n );\n } catch (e) {\n console.warn(e);\n }\n}\n\nexport async function storeSort(\n host: HTMLElement,\n prop: TableTypes.Prop,\n order: TableTypes.Order\n) {\n const store = stores.get(host);\n if (!store || !store.general.state.workerId) return;\n\n try {\n store.data.state.rows = await workerSort(\n store.general.state.workerId,\n prop,\n order\n );\n } catch (e) {\n console.warn(e);\n }\n}\n","import { getRenderingRef, getElement, VNode, h, Fragment } from '@stencil/core';\nimport { getStore } from './table.store';\nimport { CSSNAMESPACE } from './table.constants';\nimport type { TableTypes } from '../../interface';\n\ntype ValidRenderTypes = 'tr' | 'th' | 'td';\n\n/**\n * Get a model object for custom cell / property renderers.\n * @param rowIndex - the current row index being rendered\n * @param colIndex - the current column index being rendered\n * @returns a model object which will be passed to custom renderers\n */\nexport function colDataModel(\n rowIndex: number,\n colIndex: number\n): TableTypes.ColumnDataSchemaModel {\n const store = fetchStores();\n const columns = store.config.state.columns;\n const rows = store.data.state.rows;\n\n const column = columns[colIndex];\n const prop: TableTypes.ColumnProp | undefined = column?.prop;\n const rowModel = rows[rowIndex];\n const cellModel = rowModel[columns[colIndex].prop];\n\n return {\n prop,\n cellModel,\n column,\n rowIndex,\n rowModel,\n };\n}\n\n/**\n * Get a model object for custom row renderers.\n * @param rowIndex\n * @returns a model object passed to custom row renderers\n */\nexport function rowDataModel(rowIndex: number): TableTypes.RowDataSchemaModel {\n const store = fetchStores();\n const rows = store.data.state.rows;\n const row = rows[rowIndex];\n\n return {\n row,\n rowIndex,\n };\n}\n\n/**\n * Merges 2 objects of properties together\n * @param current - property object\n * @param extra - additional object property\n * @returns - merged properties that can be applied to a node\n */\nexport function mergeProperties<\n T extends TableTypes.CellProps | TableTypes.CellProps\n>(current: T, extra: T) {\n if (!extra) return current;\n\n // top level merge\n const props: T = { ...extra, ...current };\n\n // deeper merge\n // merge classes maps or strings\n if (extra.class) {\n if (typeof extra.class === 'object' && typeof props.class === 'object') {\n props.class = { ...extra.class, ...props.class };\n } else if (\n typeof extra.class === 'string' &&\n typeof props.class === 'object'\n ) {\n props.class[extra.class] = true;\n } else if (typeof props.class === 'string') {\n props.class += ' ' + extra.class;\n }\n }\n // merge style\n if (extra.style) {\n props.style = { ...extra.style, ...props.style };\n }\n return props;\n}\n\n/**\n * Returns the current nano-table's stores.\n * @returns the current nano-table stores\n */\nexport function fetchStores() {\n return getStore(getElement(getRenderingRef()));\n}\n\n/**\n * Merges any defined cell properties with properties\n * required by `nano-table` functionality\n * @param rowIndex - the current row index being rendered\n * @param colIndex = the current column index being rendered\n * @param defaultProps - default properties required by `nano-table`\n * @returns - the merged properties that will be applied to a node\n */\nexport function mergeCellProperties(\n rowIndex: number,\n colIndex: number,\n defaultProps: TableTypes.CellProps\n): TableTypes.CellProps {\n const props: TableTypes.CellProps = { ...defaultProps };\n const extraPropsFunc =\n fetchStores().config.state.columns[colIndex]?.cellProperties;\n if (!extraPropsFunc) return props;\n\n const data = colDataModel(rowIndex, colIndex);\n const extra = extraPropsFunc(data);\n if (!extra) return props;\n\n return mergeProperties(props, extra);\n}\n\n/**\n * Renders a table header (within a thead) using a custom template if set.\n * @param col - the current column config object\n * @returns - a JSX node\n */\nexport function colheadFootRender(col: TableTypes.ColumnConfig): VNode {\n const tpl = col?.colTemplate;\n return tpl ? (\n tpl(h as unknown as TableTypes.HFunc<VNode>, col)\n ) : (\n <Fragment>{col.title}</Fragment>\n );\n}\n\nconst stickyHIOs: WeakMap<HTMLTableCellElement, IntersectionObserver> =\n new WeakMap();\nconst stickyVIOs: WeakMap<HTMLTableCellElement, IntersectionObserver> =\n new WeakMap();\n\n/**\n * Adds element to Intersection Observer. Fires when element changes on the x axis\n * @param el - an element to observe\n * @param pos - the edge to watch (start or end)\n * @param cb - callback when an intersection state changes.\n */\nexport function addHObserver(\n el: HTMLTableCellElement,\n pos: TableTypes.Position,\n cb: TableTypes.PinnedCb\n) {\n if (stickyHIOs.get(el)) return;\n\n const store = fetchStores();\n const root = store.general.state.scrollParent;\n\n const observer = new IntersectionObserver(\n ([e]) => {\n const rootBounds =\n e.rootBounds || document.scrollingElement.getBoundingClientRect();\n const positions: { [key in TableTypes.Position]?: boolean } = {};\n if (pos === 'start') {\n positions.start =\n e.boundingClientRect.x - (rootBounds.x + root.scrollLeft) < 0 &&\n !e.isIntersecting;\n }\n if (pos === 'end') {\n // TODO - sort these out for RtL\n positions.end =\n e.boundingClientRect.right > e.boundingClientRect.width &&\n !e.isIntersecting;\n }\n if (!!cb) cb(positions);\n },\n {\n threshold: [1],\n rootMargin: '1px 0px 100px 0px',\n root: root === document.scrollingElement ? null : root,\n }\n );\n stickyHIOs.set(el, observer);\n // dirty fix - wait a tick 'cos nano-size-observer isn't always ready in-time\n setTimeout(() => observer.observe(el), 300);\n}\n\n/**\n * Adds element to Intersection Observer. Fires when element changes on the y axis\n * @param el - an element to observe\n * @param pos - the edge to watch (start or end)\n * @param cb - callback when an intersection state changes.\n */\nexport function addVObserver(\n el: HTMLTableCellElement,\n pos: TableTypes.Position,\n cb: TableTypes.PinnedCb\n) {\n if (stickyVIOs.get(el)) return;\n\n const store = fetchStores();\n const root = store.general.state.scrollParent;\n\n const observer = new IntersectionObserver(\n ([e]) => {\n const rootBounds =\n e.rootBounds || document.scrollingElement.getBoundingClientRect();\n const positions: { [key in TableTypes.Position]?: boolean } = {};\n if (pos === 'top') {\n positions.top =\n e.boundingClientRect.y - (rootBounds.y + root.scrollTop) < 0 &&\n !e.isIntersecting;\n }\n if (pos === 'bottom') {\n const boundingClientRect = e.target.getBoundingClientRect();\n positions.bottom =\n boundingClientRect.height + boundingClientRect.y >\n rootBounds.height && !e.isIntersecting;\n }\n if (!!cb) cb(positions);\n },\n {\n threshold: [1],\n rootMargin: '0px 100px 0px 100px',\n root: root === document.scrollingElement ? null : root,\n }\n );\n stickyVIOs.set(el, observer);\n requestAnimationFrame(() => observer.observe(el));\n}\n\n/**\n * Renders a class string or map for pinned classes on the v axis.\n * @param type - element tagName\n * @param vPinned - whether element is currently pinned vertically to top or bottom\n * @param toString - render as a string (defaults to class map)\n */\nexport function headerPinClasses(\n type: ValidRenderTypes,\n vPinned?: TableTypes.Position,\n toString?: false\n): { [key: string]: boolean };\nexport function headerPinClasses(\n type: ValidRenderTypes,\n vPinned?: TableTypes.Position,\n toString?: true\n): string;\nexport function headerPinClasses(\n type: ValidRenderTypes,\n vPinned?: TableTypes.Position,\n toString = false\n): { [key: string]: boolean } | string {\n const classes = {\n [`${CSSNAMESPACE}__${type}`]: true,\n [`${CSSNAMESPACE}__pin`]: !!vPinned,\n [`${CSSNAMESPACE}__pin--top`]: vPinned === 'top',\n [`${CSSNAMESPACE}__pin--bottom`]: vPinned === 'bottom',\n };\n\n if (toString) return classListToStr(classes);\n return classes;\n}\n\n/**\n * Turns a class map {'string': boolean} to class string\n * @param classes - the class map to convert\n * @returns a class string\n */\nexport function classListToStr(classes: { [key: string]: boolean }): string {\n let classString = '';\n Object.entries(classes).forEach(([className, on]) => {\n if (on) classString += className + ' ';\n });\n return classString;\n}\n\n/**\n * Detects the current scroll speed as a number.\n * Use within a scroll listener\n */\nexport const detectScrollSpeed = (() => {\n let lastPos: number;\n let newPos: number;\n let timer: number;\n let delta: number;\n const delay = 60; // in \"ms\" (higher means lower fidelity )\n\n const clear = () => {\n lastPos = null;\n delta = 0;\n };\n clear();\n\n return () => {\n newPos = window.scrollY;\n if (lastPos != null) delta = newPos - lastPos;\n lastPos = newPos;\n window.clearTimeout(timer);\n timer = window.setTimeout(clear, delay);\n return delta;\n };\n})();\n\n/**\n * Attempts to find the closes scrolling parental element\n * @param element - the element from which to traverse up the DOM\n * @returns - the closest scrolling parental element\n */\nexport function findScrollParent(element: HTMLElement) {\n let style = getComputedStyle(element);\n const excludeStaticParent = style.position === 'absolute';\n const overflowRegex = /(auto|scroll)/;\n\n if (style.position === 'fixed') return document.documentElement;\n for (let parent = element; (parent = parent.parentElement); ) {\n style = getComputedStyle(parent);\n if (excludeStaticParent && style.position === 'static') {\n continue;\n }\n if (overflowRegex.test(style.overflow + style.overflowY + style.overflowX))\n return parent;\n }\n return document.documentElement;\n}\n\n/**\n * Checks whether an element is currently viewable within the viewport\n * @param el - element to check\n * @param percentVisible - the percentage of the element that should be within the viewport\n * @returns true if the element's area percentage is visible\n */\nexport function isInViewport(el: Element, percentVisible = 100) {\n const r = el.getBoundingClientRect();\n const windowHeight =\n window.innerHeight || document.documentElement.clientHeight;\n\n if (\n !r.bottom &&\n !r.top &&\n !r.left &&\n !r.right &&\n !r.height &&\n !r.width &&\n !r.x &&\n !r.y\n )\n return false;\n\n return !(\n Math.floor(100 - ((r.top >= 0 ? 0 : r.top) / +-r.height) * 100) <\n percentVisible ||\n Math.floor(100 - ((r.bottom - windowHeight) / r.height) * 100) <\n percentVisible\n );\n}\n\n/**\n * Immutable array re-order\n * @param from - the index to move from\n * @param to - the index to move to\n * @param arr - the array to re-order\n * @returns - a new, re-orderd array\n */\nexport function arrMove(from: number, to: number, arr: any[]) {\n const newArr = [...arr];\n const item = newArr.splice(from, 1)[0];\n newArr.splice(to, 0, item);\n return newArr;\n}\n","import { Fragment, FunctionalComponent, h } from '@stencil/core';\nimport { CSSNAMESPACE } from './table.constants';\nimport {\n addHObserver,\n addVObserver,\n colheadFootRender,\n fetchStores,\n headerPinClasses,\n mergeProperties,\n} from './table.utils';\nimport type { TableTypes } from '../../interface';\n\n// TABLE HEADERS\n// (thead > tr > th, tfoot > tr > th)\n\nlet draggingCol: TableTypes.ColumnConfig;\nlet draggingColEle: HTMLTableCellElement;\nlet dragEnterEle: HTMLElement;\nlet draggingParent: HTMLTableRowElement;\n\ntype TableColHeadProps = {\n column: TableTypes.ColumnConfig;\n headRenderer: TableTypes.HeadFootRenderer;\n onColumnSortClick?: (\n order: TableTypes.Order,\n column: TableTypes.Prop,\n el: HTMLTableCellElement\n ) => void;\n onColumnPinned?: TableTypes.PinnedCb;\n onColumnDrag?: (column: TableTypes.Prop, el: HTMLTableCellElement) => void;\n onColumnDrop?: (\n fromColumn: TableTypes.Prop,\n toColumn: TableTypes.Prop,\n el: HTMLTableCellElement\n ) => void;\n defaults: { draggable?: boolean; sortable?: boolean };\n};\n\nexport const TableColHead: FunctionalComponent<TableColHeadProps> = ({\n column,\n headRenderer,\n onColumnSortClick,\n onColumnPinned,\n onColumnDrag,\n onColumnDrop,\n defaults,\n}) => {\n const store = fetchStores();\n\n // Drag to re-order columns handling\n\n function handleDragStart(e: DragEvent, column: TableTypes.ColumnConfig) {\n draggingCol = column;\n draggingColEle = dragEnterEle = e.target as HTMLTableCellElement;\n draggingParent = draggingColEle.closest('.' + `${CSSNAMESPACE}__tr`);\n\n draggingParent.classList.add(`${CSSNAMESPACE}__dragging`);\n draggingColEle.classList.add(`${CSSNAMESPACE}__drag--start`);\n\n e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setData('text/html', draggingColEle.innerHTML);\n\n onColumnDrag(column.prop, draggingColEle);\n }\n\n function handleDragEnd() {\n draggingParent.classList.remove(`${CSSNAMESPACE}__dragging`);\n draggingColEle.classList.remove(`${CSSNAMESPACE}__drag--start`);\n\n draggingParent\n .querySelectorAll(`.${CSSNAMESPACE}__drag-mask--active`)\n .forEach((el) => {\n el.classList.remove(`${CSSNAMESPACE}__drag-mask--active`);\n });\n\n draggingColEle = null;\n draggingCol = null;\n draggingParent = null;\n dragEnterEle = null;\n }\n\n function handleDragEnter(e: DragEvent) {\n if (dragEnterEle === e.target) return;\n\n e.preventDefault();\n e.stopImmediatePropagation();\n e.dataTransfer.dropEffect = 'move';\n\n draggingParent\n .querySelectorAll(`.${CSSNAMESPACE}__drag-mask--active`)\n .forEach((el) => {\n el.classList.remove(`${CSSNAMESPACE}__drag-mask--active`);\n });\n dragEnterEle = e.target as HTMLElement;\n\n if (!dragEnterEle.classList.contains(`${CSSNAMESPACE}__drag-mask`)) {\n e.dataTransfer.dropEffect = 'none';\n return;\n }\n dragEnterEle.classList.add(`${CSSNAMESPACE}__drag-mask--active`);\n }\n\n function handleDrop(this: HTMLElement, e: DragEvent) {\n e.stopPropagation();\n\n const { colName } = this.dataset as { colName: keyof TableTypes.RowData };\n if (colName === draggingCol.prop) return;\n\n const cols = store.config.state.columns;\n let toIndex = cols.findIndex((col) => col.prop === colName);\n const fromIndex = cols.findIndex((col) => col === draggingCol);\n\n if (\n toIndex < fromIndex &&\n this.classList.contains(`${CSSNAMESPACE}__drag-mask--end`)\n )\n toIndex++;\n if (\n toIndex > fromIndex &&\n this.classList.contains(`${CSSNAMESPACE}__drag-mask--start`)\n )\n toIndex--;\n if (toIndex === fromIndex) return;\n\n onColumnDrop(\n draggingCol.prop,\n store.config.state.columns[toIndex].prop,\n draggingColEle\n );\n }\n\n // Sort handling\n\n function handleColumnSortClick(e: MouseEvent & { target: HTMLElement }) {\n let order;\n switch (column.order) {\n case 'asc':\n order = 'desc';\n break;\n case 'desc':\n order = null;\n break;\n default:\n order = 'asc';\n }\n onColumnSortClick(order, column.prop, e.target.closest('th'));\n }\n\n function isSortable() {\n return (\n (!!defaults.sortable && column.sortable !== false) ||\n (!defaults.sortable && column.sortable === true)\n );\n }\n\n function isDraggable() {\n return (\n (!!defaults.draggable && column.draggable !== false) ||\n (!defaults.draggable && column.draggable === true)\n );\n }\n\n let extraProps = {};\n if (column.columnProperties) {\n extraProps = column.columnProperties(column) || extraProps;\n }\n\n const baseProps = {\n class: {\n ...headerPinClasses('th', headRenderer?.pinned),\n [`${CSSNAMESPACE}__pin--start`]: column.pinned === 'start',\n [`${CSSNAMESPACE}__pin--end`]: column.pinned === 'end',\n [`${CSSNAMESPACE}__ordered`]: !!column.order,\n [`${CSSNAMESPACE}__filtered`]: !!column.filter,\n },\n };\n let props = extraProps ? mergeProperties(baseProps, extraProps) : baseProps;\n const content = colheadFootRender(column);\n\n if (!content) return <Fragment></Fragment>;\n\n props =\n Number((props as TableTypes.CellProps).colSpan) > 1\n ? { ...props, scope: 'colgroup' }\n : { ...props, scope: 'col' };\n\n if (isSortable()) {\n const sort = column.order\n ? column.order === 'asc'\n ? 'ascending'\n : 'descending'\n : 'none';\n\n props = { ...props, 'aria-sort': sort };\n }\n\n if (isDraggable()) {\n props = {\n ...props,\n draggable: true,\n onDragStart: (e) => handleDragStart(e, column),\n onDragOver: (e) => e.preventDefault(),\n onDragEnd: () => handleDragEnd(),\n };\n }\n\n return (\n <th\n {...props}\n ref={(th) => {\n if (['end', 'start'].includes(column.pinned))\n addHObserver(th, column.pinned, onColumnPinned);\n if (['top', 'bottom'].includes(headRenderer.pinned))\n addVObserver(th, headRenderer.pinned, onColumnPinned);\n }}\n key={column.prop}\n >\n {isDraggable() && [\n <div\n class={{\n [`${CSSNAMESPACE}__drag-mask`]: true,\n [`${CSSNAMESPACE}__drag-mask--start`]: true,\n }}\n data-col-name={column.prop}\n onDragEnter={handleDragEnter}\n onDrop={handleDrop}\n onDragOver={(e) => e.preventDefault()}\n ></div>,\n <div\n class={{\n [`${CSSNAMESPACE}__drag-mask`]: true,\n [`${CSSNAMESPACE}__drag-mask--end`]: true,\n }}\n data-col-name={column.prop}\n onDragEnter={handleDragEnter}\n onDrop={handleDrop}\n onDragOver={(e) => e.preventDefault()}\n ></div>,\n ]}\n {isSortable() ? (\n <button\n class={{\n [`${CSSNAMESPACE}__order-btn`]: true,\n [`${CSSNAMESPACE}__cell-content`]: true,\n }}\n onClick={handleColumnSortClick}\n >\n {colheadFootRender(column)}\n {!!column.filter && <nano-icon name=\"light/filter\" />}\n {!!column.order &&\n (column.order === 'desc' ? (\n <nano-icon name=\"solid/long-arrow-down\" />\n ) : (\n <nano-icon name=\"solid/long-arrow-up\" />\n ))}\n <div class={`${CSSNAMESPACE}__status-icons`}>\n <nano-icon name=\"light/chevron-down\" />\n </div>\n </button>\n ) : (\n <div class={`${CSSNAMESPACE}__cell-content`}>\n {colheadFootRender(column)}\n {!!column.filter && <nano-icon name=\"light/bars-filter\" />}\n </div>\n )}\n </th>\n );\n};\n","import { Fragment, FunctionalComponent, h, VNode } from '@stencil/core';\nimport { CSSNAMESPACE } from './table.constants';\nimport {\n classListToStr,\n colDataModel,\n fetchStores,\n mergeCellProperties,\n} from './table.utils';\nimport type { TableTypes } from '../../interface';\n\n// TABLE CELL\n// (tbody > tr > td, tbody > tr > th)\n\n/**\n * Renders a cell using a custom renderer if set.\n * @param rowIndex - the current row index being rendered\n * @param colIndex - the current column index being rendered\n * @returns - a JSX node\n */\nexport function cellRender(rowIndex: number, colIndex: number): VNode {\n const store = fetchStores();\n const columns = store.config.state.columns;\n const tpl = columns[colIndex]?.cellTemplate;\n const model = colDataModel(rowIndex, colIndex);\n\n if (!!model.cellModel && columns[colIndex].type === 'date') {\n const d = new Date(model.cellModel);\n if (d instanceof Date && !isNaN(d as any)) {\n model.cellModel = !tpl\n ? `${new Date(model.cellModel).toLocaleDateString()} ${new Date(\n model.cellModel\n ).toLocaleTimeString()}`\n : d;\n }\n }\n\n return tpl ? (\n tpl(h as unknown as TableTypes.HFunc<VNode>, model)\n ) : (\n <Fragment>{model.cellModel?.toString()}</Fragment>\n );\n}\n\nexport const baseCellClasses = (\n colIndex: number,\n toString: boolean = false\n) => {\n const store = fetchStores();\n const column = store.config.state.columns[colIndex];\n\n const classes = {\n [`${CSSNAMESPACE}__td`]: true,\n [`${CSSNAMESPACE}__ordered`]: !!column.order,\n [`${CSSNAMESPACE}__pin`]: !!column.pinned,\n [`${CSSNAMESPACE}__pin--start`]: column.pinned === 'start',\n [`${CSSNAMESPACE}__pin--end`]: column.pinned === 'end',\n };\n\n if (toString) return classListToStr(classes);\n return classes;\n};\n\ntype TableCellProps = {\n rowIndex: number;\n colIndex: number;\n nestedContent?: VNode;\n};\n\nexport const TableCell: FunctionalComponent<TableCellProps> = ({\n rowIndex,\n colIndex,\n nestedContent,\n}) => {\n const content = nestedContent || cellRender(rowIndex, colIndex);\n if (!content) return <Fragment></Fragment>;\n\n let CellType = 'td';\n const store = fetchStores();\n const column = store.config.state.columns[colIndex];\n let props = mergeCellProperties(rowIndex, colIndex, {\n class: baseCellClasses(colIndex),\n });\n\n if (column.rowHeader) {\n props =\n Number((props as TableTypes.CellProps).rowSpan) > 1\n ? { ...props, scope: 'rowgroup' }\n : { ...props, scope: 'row' };\n CellType = 'th';\n }\n\n return (\n <CellType\n // role=\"gridcell\"\n {...props}\n >\n <div class={`${CSSNAMESPACE}__cell-content`}>{content}</div>\n </CellType>\n );\n};\n","import { FunctionalComponent, h, VNode } from '@stencil/core';\nimport {\n addHObserver,\n addVObserver,\n headerPinClasses,\n mergeProperties,\n rowDataModel,\n} from './table.utils';\nimport { baseCellClasses } from './table.cell';\nimport { CSSNAMESPACE } from './table.constants';\nimport type { TableTypes } from '../../interface';\n\n// TABLE ROWS\n// (thead > tr, tfoot > tr, tr)\n\ntype TableRowProps = {\n rowRenderer: TableTypes.RowRenderer;\n rowIndex: number;\n row: TableTypes.RowData;\n onColumnPinned?: TableTypes.PinnedCb;\n};\n\nexport const TableRow: FunctionalComponent<TableRowProps> = (\n { rowRenderer, rowIndex, row, onColumnPinned },\n children,\n utils\n) => {\n let extraProps = {};\n\n const TableCell: FunctionalComponent<{ header: boolean }> = (\n { header },\n children\n ): VNode => {\n const cell = <div class={CSSNAMESPACE + '__cell-content'}>{children}</div>;\n return header ? <th scope=\"row\">{cell}</th> : <td>{cell}</td>;\n };\n\n if (!row) {\n const model = rowDataModel(rowIndex);\n row = model.row;\n }\n\n if (rowRenderer?.rowProperties) {\n extraProps = rowRenderer.rowProperties({ row, rowIndex }) || extraProps;\n }\n\n let pinned: TableTypes.Position;\n if (rowRenderer?.pinned && typeof rowRenderer.pinned === 'function') {\n pinned = rowRenderer.pinned();\n }\n\n const baseProps = { class: headerPinClasses('tr', pinned) };\n const props = extraProps ? mergeProperties(baseProps, extraProps) : baseProps;\n const tpl = rowRenderer?.template;\n\n if (tpl) {\n let toRender = tpl(\n h as TableTypes.HFunc<VNode>,\n {\n renderedRow: (\n <tr {...props} key={row.__uuid}>\n {children}\n </tr>\n ),\n row,\n rowIndex,\n },\n TableCell\n );\n\n if (Array.isArray(toRender)) {\n toRender = utils.map(toRender, (node, i) => {\n if (node.vtag === 'tr') {\n if (!node.vkey) node.vkey = `${row.__uuid}_${i}`;\n\n node.vattrs = mergeProperties(\n { class: headerPinClasses('tr', pinned, true) },\n node.vattrs\n );\n\n if (!!node.vchildren) {\n node.vchildren = utils.map(node.vchildren, (cNode, i) => {\n if (['td', 'th'].includes(cNode.vtag.toString())) {\n cNode.vattrs = mergeProperties(\n {\n class:\n headerPinClasses(\n cNode.vtag.toString() as 'th' | 'td',\n pinned,\n true\n ) + baseCellClasses(i, true),\n ref: (th: HTMLTableCellElement) => {\n if ((!!th && pinned === 'top') || pinned === 'bottom')\n addVObserver(th, pinned, onColumnPinned);\n if (!!th && th.classList.contains('nano-tbl__pin--end'))\n addHObserver(th, 'end', onColumnPinned);\n if (!!th && th.classList.contains('nano-tbl__pin--start'))\n addHObserver(th, 'start', onColumnPinned);\n },\n },\n cNode.vattrs\n );\n }\n return cNode;\n });\n }\n }\n return node;\n });\n }\n return toRender;\n }\n\n return (\n <tr {...props} key={row.__uuid}>\n {children}\n </tr>\n );\n};\n\ntype TableHeadFootProps = {\n rowRenderer: TableTypes.HeadFootRenderer;\n onColumnPinned?: TableTypes.PinnedCb;\n};\n\nexport const TableHeadFootRow: FunctionalComponent<TableHeadFootProps> = (\n { rowRenderer, onColumnPinned },\n children,\n utils\n) => {\n let extraProps = {};\n if (rowRenderer.rowProperties) {\n extraProps = rowRenderer.rowProperties() || {};\n }\n\n const TableCell: FunctionalComponent<{ header: boolean }> = (\n { header },\n children\n ): VNode => {\n const cell = <div class={CSSNAMESPACE + '__cell-content'}>{children}</div>;\n return header !== false ? <th scope=\"col\">{cell}</th> : <td>{cell}</td>;\n };\n\n const pinned = rowRenderer.pinned || null;\n const baseProps = { class: headerPinClasses('tr', null) };\n const props = extraProps ? mergeProperties(baseProps, extraProps) : baseProps;\n const tpl = rowRenderer?.template;\n\n if (tpl) {\n let toRender = tpl(\n h as TableTypes.HFunc<VNode>,\n {\n renderedRow: <tr {...props}>{children}</tr>,\n },\n TableCell\n );\n\n if (Array.isArray(toRender)) {\n toRender = utils.map(toRender, (node) => {\n if (node.vtag === 'tr') {\n node.vattrs = mergeProperties(\n { class: headerPinClasses('tr', pinned, true) },\n node.vattrs\n );\n\n if (!!node.vchildren) {\n node.vchildren = utils.map(node.vchildren, (cNode) => {\n if (['td', 'th'].includes(cNode.vtag.toString())) {\n cNode.vattrs = mergeProperties(\n {\n class: headerPinClasses(\n cNode.vtag.toString() as 'th' | 'td',\n pinned,\n true\n ),\n ref: (th) => {\n if ((!!th && pinned === 'top') || pinned === 'bottom')\n addVObserver(th, pinned, onColumnPinned);\n if (!!th && th.classList.contains('nano-tbl__pin--end'))\n addHObserver(th, 'end', onColumnPinned);\n if (!!th && th.classList.contains('nano-tbl__pin--start'))\n addHObserver(th, 'start', onColumnPinned);\n },\n },\n cNode.vattrs\n );\n }\n return cNode;\n });\n }\n }\n return node;\n });\n }\n return toRender;\n }\n\n return <tr {...props}>{children}</tr>;\n};\n","@use '../../global/style/utilities/globals' as t;\n\nnano-table {\n /**\n * @prop --max-col-width: Default 200px;\n\n * @prop --color: Deafults to var(--nano-color-mediumgrey, #68767e);\n * @prop --font-size: Deafults to 0.87rem;\n * @prop --cell-line-height: Deafults to 1.5;\n\n * @prop --border-color: Deafults to var(--nano-color-palegrey, #b5aea7);\n * @prop --border-style: Deafults to thin solid var(--border-color);\n * @prop --border-tint-color: Deafults to var(--nano-color-blue, #90c6e7);\n * @prop --border-tint-style: Deafults to 2px solid var(--border-tint-color);\n\n * @prop --cell-bg-rgb: Deafults to var(--nano-color-white-rgb, 255 255 255);\n * @prop --head-bg-rgb: Deafults to var(--cell-bg-rgb);\n * @prop --foot-bg-rgb: Deafults to var(--cell-bg-rgb);\n * @prop --th-row-bg-rgb: Deafults to var(--cell-bg-rgb);\n * @prop --ordered-bg-rgb: Deafults to var(--nano-color-offwhite-rgb, 249 249 251);\n\n * @prop --td-padding-start: Deafults to 0.625rem;\n * @prop --td-padding-end: Deafults to 0.625rem;\n * @prop --td-padding-top: Deafults to 0.5rem;\n * @prop --td-padding-bottom: Deafults to 0.4125rem;\n\n * @prop --th-padding-start: Deafults to 0.625rem;\n * @prop --th-padding-end: Deafults to 0.625rem;\n * @prop --th-padding-top: Deafults to 0.875rem;\n * @prop --th-padding-bottom: Deafults to 0.6875rem;\n\n * @prop --td-padding-v: Deafults to var(--td-padding-top) var(--td-padding-bottom);\n * @prop --td-padding-h: Deafults to var(--td-padding-start) var(--td-padding-end);\n\n * @prop --th-padding-v: Deafults to var(--th-padding-top) var(--th-padding-bottom);\n * @prop --th-padding-h: Deafults to var(--th-padding-start) var(--th-padding-end);\n\n * @prop --foot-th-padding-v: Deafults to var(--td-padding-top) var(--td-padding-bottom);\n * @prop --foot-th-padding-h: Deafults to var(--td-padding-start) var(--td-padding-end);\n\n * @prop --head-th-padding-v: Deafults to var(--th-padding-top) var(--th-padding-bottom);\n * @prop --head-th-padding-h: Deafults to var(--th-padding-start) var(--th-padding-end);\n\n * @prop --bookend-col-padding: Deafults to 2rem;\n */\n\n display: block;\n width: 100%;\n\n // general\n --max-col-width: clamp(200px, 30%, 20vw);\n\n // text\n --color: var(--nano-color-mediumgrey, #68767e);\n --font-size: 0.87rem;\n --cell-line-height: 1.5;\n --thead-font-size: 0.95rem;\n --thead-color: #455560;\n --tfoot-color: #455560;\n\n // borders\n --border-color: #dddbda;\n --border-style: thin solid var(--border-color);\n --border-tint-color: #0084a9;\n --border-tint-style: 3px solid var(--border-tint-color);\n\n // backgrounds\n --cell-bg-rgb: var(--nano-color-white-rgb, 255 255 255);\n --head-bg-rgb: 250, 250, 249;\n --foot-bg-rgb: var(--head-bg-rgb);\n --th-row-bg-rgb: var(--cell-bg-rgb);\n --ordered-bg-rgb: var(--nano-color-offwhite-rgb, 249 249 251);\n\n // spacing\n --td-padding-start: 0.625rem;\n --td-padding-end: 0.625rem;\n --td-padding-top: 0.5rem;\n --td-padding-bottom: 0.4125rem;\n --th-padding-start: 0.625rem;\n --th-padding-end: 0.625rem;\n --th-padding-top: 0.875rem;\n --th-padding-bottom: 0.6875rem;\n --td-padding-v: var(--td-padding-top) var(--td-padding-bottom);\n --td-padding-h: var(--td-padding-start) var(--td-padding-end);\n --th-padding-v: var(--th-padding-top) var(--th-padding-bottom);\n --th-padding-h: var(--th-padding-start) var(--th-padding-end);\n --foot-th-padding-v: var(--td-padding-top) var(--td-padding-bottom);\n --foot-th-padding-h: var(--td-padding-start) var(--td-padding-end);\n --head-th-padding-v: var(--th-padding-top) var(--th-padding-bottom);\n --head-th-padding-h: var(--th-padding-start) var(--th-padding-end);\n --bookend-col-padding: 2rem;\n}\n\n.nano-tbl {\n $base: &;\n\n color: var(--color);\n text-align: start;\n width: 100%;\n font-size: var(--font-size);\n border-spacing: 0 0;\n border-collapse: separate;\n background: rgb(var(--cell-bg-rgb));\n border-inline-end: 1px solid transparent;\n border-block-start: 1px solid transparent;\n position: relative;\n z-index: 1;\n\n &__wrap {\n display: table;\n min-width: 100%;\n }\n\n &__top-anchor {\n @include t.visually-hide;\n\n position: relative;\n }\n\n &__ordered {\n background-color: var(--ordered-bg);\n border-inline-start: var(--border-style);\n border-inline-end: var(--border-style);\n }\n\n // drag to re-order\n\n &__drag-mask {\n display: none;\n position: absolute;\n inset-block: -2px -2px;\n z-index: 10;\n opacity: 0;\n transition: 0.2s ease opacity;\n\n &--start {\n width: calc(50% + 2px);\n inset-inline-start: -2px;\n border-inline-start: 2px dashed var(--border-tint-color);\n }\n\n &--end {\n width: 50%;\n inset-inline-end: 0;\n border-inline-end: 2px dashed var(--border-tint-color);\n }\n\n &--active {\n opacity: 1;\n }\n\n #{$base}__dragging & {\n display: block;\n }\n }\n\n &__drag--start {\n opacity: 0.4;\n }\n\n &__dragging {\n #{$base}__td,\n #{$base}__th {\n cursor: no-drop;\n\n #{$base}__cell-content {\n pointer-events: none;\n }\n }\n }\n\n &__order-btn {\n padding: 0;\n border: none;\n outline: none;\n font: inherit;\n background: none;\n appearance: none;\n color: inherit;\n display: flex;\n gap: 10px;\n align-items: center;\n width: 100%;\n }\n\n &__status-icons {\n margin-inline: auto 10px;\n display: flex;\n gap: 10px;\n }\n\n &__progress-bar {\n font-size: 0.2rem;\n position: sticky;\n inset-block-start: 0;\n inset-inline: 0;\n z-index: 10;\n transition: scale 0.25s;\n scale: 0;\n width: 100%;\n height: 0;\n\n &--show {\n scale: 1;\n height: auto;\n }\n }\n\n &__caption {\n &--hide {\n @include t.visually-hide;\n }\n }\n\n // Shared styles in th, td across thead / tbody / tfoot\n\n &__td,\n &__th {\n line-height: var(--cell-line-height);\n text-align: start;\n border-block-start: var(--border-style);\n max-width: var(--max-col-width);\n background-color: rgb(var(--cell-bg-rgb));\n\n tbody:first-of-type tr:first-child & {\n border-block-start: none;\n }\n\n tbody:last-of-type tr:last-child & {\n border-block-end: var(--border-style);\n }\n\n // 'bookend' (larger) padding on larger screens\n .md & {\n &:first-child #{$base}__cell-content {\n padding-inline-start: var(--bookend-col-padding);\n }\n\n &:last-child #{$base}__cell-content {\n padding-inline-end: var(--bookend-col-padding);\n }\n }\n\n // force override of bookend on small screens css media\n // queries are faster than the breakpoints from `nano-resize-observer`\n @include t.media-breakpoint-down('md') {\n &:first-child #{$base}__cell-content {\n padding-inline-start: var(--td-padding-start) !important;\n }\n\n &:last-child #{$base}__cell-content {\n padding-inline-end: var(--td-padding-end) !important;\n }\n }\n\n thead & {\n color: var(--thead-color);\n font-weight: 800;\n background: rgba(var(--head-bg-rgb), 90%);\n font-size: var(--thead-font-size);\n border-block-start: none !important;\n transition: all 0.2s ease;\n\n #{$base}__cell-content {\n padding-block: var(--head-th-padding-v);\n padding-inline: var(--head-th-padding-h);\n }\n }\n\n tfoot & {\n color: var(--tfoot-color);\n font-weight: 800;\n border-block-start: none;\n background: rgba(var(--foot-bg-rgb), 90%);\n font-size: var(--thead-font-size);\n\n #{$base}__cell-content {\n padding-block: var(--foot-th-padding-v);\n padding-inline: var(--foot-th-padding-h);\n }\n }\n\n &.nano-tbl__ordered {\n background-color: rgba(var(--ordered-bg-rgb), 0.8) !important;\n }\n }\n\n &__cell-content {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n padding-block: var(--td-padding-v);\n padding-inline: var(--td-padding-h);\n\n &--no-result {\n padding-block: 2rem;\n }\n }\n\n tbody {\n will-change: scroll-position;\n visibility: visible;\n\n &.nano-tbl__inactive {\n visibility: hidden;\n }\n }\n\n // tbody th\n\n th[scope='row'] {\n font-weight: 800;\n margin: 0;\n }\n\n // .sm & th[scope='row'] {\n // max-width: 65vw !important;\n // }\n\n // pinned styles\n\n &__pin {\n position: sticky;\n z-index: 1;\n\n &--start {\n inset-inline: -1px auto;\n transition: max-width 0.25s ease;\n z-index: 2;\n\n &::after {\n content: '';\n position: absolute;\n inset: 0;\n box-shadow: 5px 1px 4px 0 rgb(0 0 0 / 20%);\n opacity: 0;\n z-index: -1;\n }\n\n #{$base}__pinned--start & {\n z-index: 2;\n max-width: 125px !important;\n\n .sm & {\n max-width: var(--max-col-width) !important;\n }\n\n &::after {\n opacity: 1;\n }\n }\n }\n\n &--end {\n z-index: 2;\n\n /*\n I cannot think of a nice way to make stuck-end columns play nice on small screens :(\n Changing the width when stuck (as we do for stuck-start columns) causes the whole positioning to change.\n This fires the IO, thus un-sticks the column, thus causes the IO to fire which sticks the column ad-infinitum\n */\n #{$base}__pin--start + & {\n inset-inline: auto auto;\n\n &::after {\n display: none;\n }\n }\n\n .sm & {\n inset-inline: auto -1px !important;\n max-width: min(50vw, 200px);\n\n &::after {\n display: block !important;\n content: '';\n position: absolute;\n inset: 0;\n box-shadow: -5px 1px 4px 0 rgb(0 0 0 / 20%);\n opacity: 0;\n z-index: -1;\n }\n }\n\n #{$base}__pinned--end & {\n .sm & {\n z-index: 3;\n\n &::after {\n opacity: 1;\n }\n }\n }\n }\n\n &--top {\n inset-block: -1px auto;\n z-index: 3;\n\n #{$base}__pinned--top & {\n z-index: 4 !important;\n }\n }\n\n &--bottom {\n inset-block: auto -1px;\n z-index: 3;\n\n #{$base}__pinned--bottom & {\n z-index: 5 !important;\n }\n }\n\n &--top#{&}--start {\n z-index: 4;\n\n #{$base}__pinned--start & {\n z-index: 5 !important;\n }\n\n #{$base}__pinned--top#{$base}__pinned--start & {\n z-index: 6 !important;\n }\n }\n\n &--top#{&}--end {\n z-index: 4;\n\n #{$base}__pinned--end & {\n z-index: 5 !important;\n }\n\n #{$base}__pinned--top#{$base}__pinned--end & {\n z-index: 6 !important;\n }\n }\n\n &--bottom#{&}--start {\n z-index: 4;\n\n #{$base}__pinned--start & {\n z-index: 5 !important;\n }\n\n #{$base}__pinned--bottom#{$base}__pinned--start & {\n z-index: 6 !important;\n }\n }\n\n &--bottom#{&}--end {\n z-index: 4;\n\n #{$base}__pinned--end & {\n z-index: 5 !important;\n }\n\n #{$base}__pinned--bottom#{$base}__pinned--end & {\n z-index: 6 !important;\n }\n }\n }\n\n thead tr:last-of-type {\n td,\n th {\n border-block-end: var(--border-tint-style);\n }\n }\n\n tfoot tr:first-of-type {\n td,\n th {\n border-block-start: none;\n }\n }\n\n tfoot tr:last-of-type {\n td,\n th {\n border-block-end: var(--border-tint-style);\n }\n }\n\n tfoot tr.nano-tbl__pin--bottom {\n &:first-of-type {\n .nano-tbl__pinned--bottom & {\n td,\n th {\n border-block-start: var(--border-tint-style) !important;\n }\n }\n }\n\n &:last-of-type {\n .nano-tbl__pinned--bottom & {\n td,\n th {\n border-block-end: none !important;\n }\n }\n }\n }\n\n .unlimited-width {\n max-width: none;\n }\n\n &__spinner {\n font-size: 1.5rem;\n transition: scale 0.25s;\n scale: 0;\n padding: 0.5rem;\n position: absolute;\n inset-block-end: 0;\n inset-inline-start: calc(50% - 0.75rem);\n z-index: 0;\n\n &--show {\n scale: 1;\n position: sticky;\n }\n }\n\n nano-skeleton {\n line-height: var(--cell-line-height);\n }\n}\n","import {\n Component,\n Prop,\n h,\n ComponentInterface,\n Element,\n Host,\n Watch,\n State,\n readTask,\n Event,\n EventEmitter,\n Method,\n Build,\n Listen,\n} from '@stencil/core';\nimport { cyrb53 } from '../../utils/math';\nimport { debounce } from '../../utils/throttle';\nimport { TableColHead } from './table.header';\nimport { TableRow, TableHeadFootRow } from './table.row';\nimport { TableCell } from './table.cell';\nimport { CSSNAMESPACE } from './table.constants';\nimport {\n generateStore,\n storeSearch,\n storeSetConfig,\n storeSetData,\n storeSort,\n storeFilter,\n TableStores,\n} from './table.store';\nimport {\n arrMove,\n detectScrollSpeed,\n findScrollParent,\n isInViewport,\n} from './table.utils';\nimport type {\n NanoResizeObserveCustomEvent,\n ResizeStateChangeEventDetail,\n TableTypes,\n} from '../../interface';\n\nfunction perMark(name: string, end: boolean = false) {\n if (!Build.isDev) return;\n if (end) {\n performance?.mark('end' + name);\n performance?.measure(name, 'start' + name, 'end' + name);\n const entries = performance?.getEntriesByName(name);\n console.log(entries[entries.length ? entries.length - 1 : 0]);\n } else {\n performance?.mark('start' + name);\n }\n}\n\nlet id = 0;\n/**\n * A performant, accessible and semantic (uses real html `<table />`, `<tr />` etc) table and data-grid solution.\n *\n *- Built-in search\n *- Built-in column filter\n *- Built-in column sort\n *- Easily swap in API / async based search / filter & sort\n *- Pin headers, footers, rows, columns\n *- Drag-&-Drop columns to re-order\n *- Add custom rendering at every level\n *- Add custom properties at every level\n *\n * @slot caption - The table's caption. You must either use this or the `caption` attribute.\n * @slot no-results - text to display when search or filtering yields no results\n */\n@Component({\n tag: 'nano-table',\n styleUrl: 'table.scss',\n})\nexport class Table implements ComponentInterface {\n constructor() {\n this.debounceSetLoading = debounce(this.debounceSetLoading.bind(this), 50);\n }\n // Public API\n\n // Props\n\n /** The type of table. Grid type will make cells navigable by keyboard */\n @Prop() type: 'grid' | 'table' = 'table';\n\n /** A descriptive title of the table.\n * You must use this or the `slot=\"caption\"` for accessibility */\n @Prop() caption: string;\n\n /** Show the caption on-screen */\n @Prop() showCaption: boolean = false;\n\n /** Will show a loading state when true.\n * Will be shown automatically if `rows` is a promise waiting to resolve\n * or when performing custom filtering or sorting */\n @Prop()\n get loading() {\n return this._loading;\n }\n set loading(l: boolean) {\n this.debounceSetLoading(l);\n }\n @State() _loading: boolean = false;\n private debounceSetLoading = (l: boolean) => {\n this._loading = l;\n };\n\n /** When loading rows asynchronously, this will render this number of placeholder rows */\n @Prop() placeholderSize = 5;\n\n /** The data to place in the table */\n @Prop() rows:\n | TableTypes.NanoTable['rows']\n | Promise<TableTypes.NanoTable['rows']>;\n\n @Watch('rows')\n handleRowsChange() {\n if (!this.rows) {\n this.loading = true;\n return;\n }\n\n this.loading = true;\n Promise.resolve(this.rows).then(async (rows) => {\n await storeSetData(this.host, rows);\n\n // reset everything\n this.currentFilters = '';\n this.currentSort = '';\n await this.columnInit();\n\n if (!this.isReady) this.setInitialBlockDimension();\n this.loading = false;\n });\n }\n\n /** The column config used to generate present the rows of data */\n @Prop({ mutable: true }) columns: TableTypes.NanoTable['columns'] = [];\n\n @Watch('columns')\n async handleColsChange() {\n await storeSetConfig(this.host, this.columns);\n if (this.isReady) this.columnInit();\n }\n\n /** Used for custom thead row rendering */\n @Prop() headRender: TableTypes.HeadFootRenderer = { pinned: 'top' };\n\n /** Used for custom row rendering */\n @Prop() rowRender: TableTypes.RowRenderer;\n\n /** Used for custom tfoot row rendering */\n @Prop() footRender: TableTypes.HeadFootRenderer = { pinned: 'bottom' };\n\n /** Whether to show a `<tfoot>` component */\n @Prop() showFooter = false;\n\n /** To improve performance, data is split into blocks\n * which are shown / hidden and rendered as they become visible.\n * Use this to control the number of hits within a block -\n * A block should fill a scrolling viewport.\n * The less perBlock the better for performance */\n @Prop() perBlock = 60;\n\n /** The number of total blocks currently rendered in the table. @readonly */\n @Prop()\n get blocksLength() {\n return this.blocks.length;\n }\n\n /** Term to search for in the data */\n @Prop() searchTerm: string;\n\n /** A custom filtering function. Should return a promise.\n * On successful completion the column UI will be updated.\n * A good use-case would be performing the filter on a server / via fetch.\n * Then on success, updating the table's data via the `rows` property */\n @Prop() customFilterFn?: (filters: TableTypes.Filter[]) => Promise<void>;\n\n /** A custom sorting function. Should return a promise.\n * On successful completion the column UI will be updated.\n * A good use-case would be performing the sort on a server / via fetch.\n * Then on success, updating the table's data via the `rows` property */\n @Prop() customSortFn?: (\n property: TableTypes.Prop,\n order: TableTypes.Order\n ) => Promise<void>;\n\n /**\n * The default sortable option for all columns.\n * `true` will enable column sorting unless you set `sortable: false` on a column\n * `false` will disable column sorting unless you set `sortable: true` on a column\n */\n @Prop() defaultSort = true;\n\n /**\n * The default draggable option for all columns.\n * `true` will enable column drag-to-reorder unless you set `draggable: false` on a column\n * `false` will disable column drag-to-reorder unless you set `draggable: true` on a column\n */\n @Prop() defaultColDraggable = false;\n\n @Watch('searchTerm')\n handleSearchTermChange() {\n this.searchStart();\n }\n\n /** Fired whenever a block is activated by scrolling into view / becoming visible\n * This could be leveraged for infinite scrolling / to fetch more data.\n */\n @Event() nanoTblBlockRendered: EventEmitter<{\n block: number;\n totalBlocks: number;\n }>;\n\n /** Fired when the table has done it's first complete render */\n @Event() nanoTblReady: EventEmitter;\n\n /** Fired before a column is sorted.\n * `event.preventDefault()` to stop sorting. */\n @Event() nanoTblBeforeSort: EventEmitter<{\n column: TableTypes.Prop;\n order: TableTypes.Order;\n }>;\n\n /** Fired after a column is sorted */\n @Event() nanoTblAfterSort: EventEmitter<{\n column: TableTypes.Prop;\n order: TableTypes.Order;\n }>;\n\n /** Fired when a column has started dragging */\n @Event() nanoTblColDrag: EventEmitter<{\n column: TableTypes.Prop;\n }>;\n\n /** Fired when a column has been dropped (after dragging)\n * `event.preventDefault()` to stop column re-order. */\n @Event() nanoTblColDrop: EventEmitter<{\n fromCol: TableTypes.Prop;\n toCol: TableTypes.Prop;\n fromIndex: number;\n toIndex: number;\n }>;\n\n /** Fired before a column is filtered.\n * `event.preventDefault()` to stop filtering. */\n @Event() nanoTblBeforeFilter: EventEmitter<{ filters: TableTypes.Filter[] }>;\n\n /** Fired after a column is sorted */\n @Event() nanoTblAfterFilter: EventEmitter<{ filters: TableTypes.Filter[] }>;\n\n /** Fired before a general search.\n * `event.preventDefault()` to stop searching. */\n @Event() nanoTblBeforeSearch: EventEmitter<{ term: string }>;\n\n /** Fired after a general / cross column search */\n @Event() nanoTblAfterSearch: EventEmitter<{ term: string }>;\n\n /** Remove any column sorts currently applied\n * @returns a promise which resolves when complete */\n @Method()\n async resetSorting() {\n const col = this.columns.find((c) => !!c.order);\n if (!col) return;\n return this.sortStart(null, col.prop);\n }\n\n /** Apply a sort on a column\n * @returns a promise which resolves when complete */\n @Method()\n async addSort(column: TableTypes.Prop, order: TableTypes.Order) {\n const col = this.columns.find((c) => c.prop === column);\n if (!col) throw 'Cannot find column with ' + column;\n return this.sortStart(order, col.prop);\n }\n\n /** Remove any column filters currently applied\n * @returns a promise which resolves when complete */\n @Method()\n async resetFilters() {\n this.filters = [];\n return this.filterStart();\n }\n\n /** Apply a filter on a column\n * @param filters - the filters to apply\n * @param additive - if true, will add the filters to any currently applied\n * @returns a promise which resolves when complete\n */\n @Method()\n async addFilters(filters: TableTypes.Filter[], additive: boolean = true) {\n if (!additive) this.filters = [];\n return this.filterStart(filters, additive);\n }\n\n /** Remove filters from a column\n * @param columnNames - the filters to apply\n * @returns a promise which resolves when complete\n */\n @Method()\n async removeFilters(columnNames: TableTypes.Prop[]) {\n this.filters = this.filters.filter((f) => !columnNames.includes(f.prop));\n return this.filterStart();\n }\n\n // Private State\n\n @Element() host: HTMLNanoTableElement;\n private renderId = 'tbl-' + id++;\n private store: TableStores;\n private filters: TableTypes.Filter[] = [];\n private currentFilters = '[]';\n private currentSort = '';\n private tableEle: HTMLTableElement;\n private topAnchorEle: HTMLElement;\n private tableWrapperEle: HTMLElement;\n\n // Blocks\n\n /** `tr` elements split into units - defined by `perPage`\n These are show / hidden for perf */\n @State() blocks: TableTypes.TBody[] = [];\n @State() activeBlocks: number[] = [0, 1, 2];\n @State() measureHeight = 0;\n\n private blockElements: HTMLTableSectionElement[];\n private blockIos: WeakMap<HTMLTableSectionElement, IntersectionObserver> =\n new WeakMap();\n private blockHeights: { blockIndex: number; height: number }[] = [];\n // uses the first 'tr' of an active block as our yard stick\n private set measureEle(el: HTMLTableSectionElement) {\n if (!el) return;\n this.measureHeight = el.getBoundingClientRect().height;\n this.unitHeight =\n el.querySelector('tr')?.getBoundingClientRect().height || this.unitHeight;\n }\n private unitHeight = 0;\n\n // Scroll / IO used for hiding / showing blocks\n\n private ignoreIO = true;\n private scrollParent: HTMLElement;\n private scrollSpeed: number;\n\n // Misc.\n\n private get isReady() {\n return this._isReady;\n }\n private set isReady(ready: boolean) {\n if (ready === this._isReady) return;\n this._isReady = ready;\n if (this.isReady) requestAnimationFrame(() => this.handleReady());\n }\n private _isReady = false;\n\n // Private Logic\n\n // Listeners\n\n @Listen('scroll', { target: 'window' })\n scrollListener() {\n // see explanation in `setupBlockIO`\n const speed = detectScrollSpeed();\n this.scrollSpeed = speed < 0 ? speed * -1 : speed;\n }\n\n private handleReady() {\n const hash = window.location.hash;\n if (hash.length > 1) {\n const idRow = document.querySelector(hash);\n if (idRow) {\n idRow.scrollIntoView();\n }\n }\n this.nanoTblReady.emit();\n }\n\n private colDrag = (column: TableTypes.Prop) => {\n this.nanoTblColDrag.emit({ column });\n };\n\n private colDrop = (fromCol: TableTypes.Prop, toCol: TableTypes.Prop) => {\n const cols = this.store.config.state.columns;\n const toIndex = cols.findIndex((col) => col.prop === toCol);\n const fromIndex = cols.findIndex((col) => col.prop === fromCol);\n\n const dropEvent = this.nanoTblColDrop.emit({\n fromCol,\n toCol,\n fromIndex,\n toIndex,\n });\n if (dropEvent.defaultPrevented) return;\n\n this.store.config.state.columns = arrMove(fromIndex, toIndex, cols);\n };\n\n /**\n * Start a sort - can be cancelled by `preventDefault`\n * @param order - column order\n * @param column - column config object\n * @returns A promise\n */\n private sortStart = async (\n order: TableTypes.Order,\n column: TableTypes.Prop,\n element?: HTMLElement\n ) => {\n // did order change?\n if (this.currentSort === order + ':' + column) return;\n\n this.loading = true;\n const sortEvent = this.nanoTblBeforeSort.emit({ column: column, order });\n if (sortEvent.defaultPrevented) return;\n perMark('sort');\n this.currentSort = order + ':' + column;\n\n // doesn't make sense to leave user in place for a sort\n this.scrollToTop(element);\n\n if (this.customSortFn) {\n try {\n await this.customSortFn(column, order);\n this.sortComplete(order, column);\n } catch (e) {\n console.warn('custom sort failed', e);\n }\n return;\n }\n\n try {\n await storeSort(this.host, column, order);\n this.sortComplete(order, column);\n } catch (e) {\n console.warn('sort failed', e);\n this.currentSort = '';\n } finally {\n this.loading = false;\n }\n };\n\n /**\n * Complete a sort. Reflects the order to ui.\n * @param order - column order\n * @param column - column config object\n */\n private sortComplete(order: TableTypes.Order, column: TableTypes.Prop) {\n this.columns = this.columns.map((c) => {\n if (c.prop === column) return { ...c, order };\n return { ...c, order: null };\n });\n this.nanoTblAfterSort.emit({ column: column, order });\n perMark('sort', true);\n }\n\n private async searchStart() {\n this.loading = true;\n const sortEvent = this.nanoTblBeforeSearch.emit({ term: this.searchTerm });\n if (sortEvent.defaultPrevented) return;\n perMark('search');\n\n // doesn't make sense to leave user in place for a search\n this.scrollToTop();\n\n try {\n await storeSearch(this.host, this.searchTerm);\n this.nanoTblAfterSearch.emit({ term: this.searchTerm });\n perMark('search', true);\n } catch (e) {\n console.warn('search failed', e);\n } finally {\n this.loading = false;\n }\n }\n\n private async filterStart(\n filters?: TableTypes.Filter[],\n additive: boolean = true\n ) {\n if (filters) {\n if (additive) {\n this.filters = [\n ...this.filters.filter(\n (f) => !filters.find((ff) => ff.prop === f.prop)\n ),\n ...filters,\n ];\n } else {\n this.filters = filters;\n }\n }\n\n if (this.currentFilters === JSON.stringify(this.filters)) return;\n\n this.loading = true;\n const sortEvent = this.nanoTblBeforeFilter.emit({ filters: this.filters });\n if (sortEvent.defaultPrevented) return;\n perMark('filter');\n this.currentFilters = JSON.stringify(this.filters);\n\n // doesn't make sense to leave user in place for a search\n this.scrollToTop();\n\n if (this.customFilterFn) {\n try {\n await this.customFilterFn(this.filters);\n this.filterComplete();\n } catch (e) {\n console.warn('custom filter failed', e);\n this.currentFilters = '';\n }\n return;\n }\n\n try {\n await storeFilter(this.host, this.filters);\n this.filterComplete();\n } catch (e) {\n console.warn('filter failed', e);\n } finally {\n this.loading = false;\n }\n }\n\n private filterComplete() {\n this.columns = this.columns.map((c) => {\n const cFilter = this.filters.find((f) => f.prop === c.prop);\n if (cFilter) c.filter = cFilter.filter;\n return c;\n });\n this.nanoTblAfterFilter.emit({ filters: this.filters });\n perMark('filter', true);\n }\n\n /** Scrolls to the top immediately - used whilst sorting / filtering */\n private scrollToTop(element?: HTMLElement) {\n const scrollBehaviour = this.scrollParent.style?.scrollBehavior;\n const scrollX = this.scrollParent.scrollLeft;\n this.scrollParent.style.scrollBehavior = 'auto';\n\n if (this.topAnchorEle && !isInViewport(this.topAnchorEle, 0.1)) {\n this.host.scrollIntoView();\n }\n if (element && !isInViewport(element, 1))\n setTimeout(() => element.scrollIntoView({ block: 'start' }), 500);\n\n if (scrollX) this.scrollParent.scrollLeft = scrollX;\n\n if (scrollBehaviour)\n this.scrollParent.style.scrollBehavior = scrollBehaviour;\n }\n\n private setMeasureElement() {\n readTask(() => {\n this.measureEle = this.blockElements.find(\n (b) => !b?.classList?.contains(`${CSSNAMESPACE}__inactive`)\n );\n });\n }\n\n /**\n * Sets the initial height on tbody elements that are not active\n * These elements have no natural height - on account of all their rows being hidden\n * So we just estimate for now\n */\n private setInitialBlockDimension() {\n if (!this.blockElements?.length) return;\n perMark('blockDims');\n\n const finishResizing: Promise<void> = new Promise((resolve) => {\n readTask(() => {\n this.setMeasureElement();\n\n // find the first active block\n if (!this.measureEle && !this.unitHeight) resolve();\n\n this.blockElements.forEach((el, i) => {\n if (!el || !el.classList?.contains(`${CSSNAMESPACE}__inactive`)) {\n if (i === this.blockElements.length - 1) resolve();\n return;\n }\n if (i === this.blockElements.length - 1) resolve();\n });\n });\n });\n\n // we're all finished.\n finishResizing.then(() => {\n perMark('blockDims', true);\n perMark('init', true);\n\n requestAnimationFrame(() => {\n this.isReady = true;\n });\n });\n }\n\n /** Apply initial columns settings */\n private async columnInit() {\n this.filters = this.columns\n .filter((c) => !!c.filter)\n .map((c) => {\n const { filter, prop } = c;\n return { filter, prop };\n });\n\n if (this.searchTerm) {\n await this.searchStart();\n }\n\n if (this.filters.length) {\n await this.filterStart();\n }\n // apply sort\n const col = this.columns.find((c) => !!c.order);\n if (!!col) {\n await this.sortStart(col.order, col.prop);\n }\n }\n\n /** Split up all incoming rows into 'blocks' split amongst tbody elements.\n * These can then be hidden / shown to improve performance.\n */\n private setBlocks() {\n perMark('setBlocks');\n this.activeBlocks = [0, 1, 2];\n this.ignoreIO = true;\n let i = 1;\n const l = this.store.data.state.rows.length;\n let rows: TableTypes.RowData[] = [];\n const blocks: TableTypes.TBody[] = [];\n this.blockHeights = [];\n\n // old skool loop for perf\n for (i; i <= l; i++) {\n rows.push(this.store.data.state.rows[i - 1]);\n\n if (i % this.perBlock === 0) {\n blocks.push({ rows, __uuid: cyrb53(rows.map((b) => b.__uuid).join()) });\n rows = [];\n }\n }\n if (rows.length)\n blocks.push({ rows, __uuid: cyrb53(rows.map((b) => b.__uuid).join()) });\n this.blocks = blocks;\n perMark('setBlocks', true);\n }\n\n /**\n * Returns a block render height.\n * If it's currently active - let auto do it's thing\n * If we've rendered it before - return that\n * If all else fails, let's guess it\n * @param blockIndex\n * @returns a height string (incl px)\n */\n private getBlockHeight(blockIndex: number): string {\n if (this.activeBlocks.includes(blockIndex)) return undefined;\n\n if (this.blockHeights.length) {\n const cachedBlockHeight = this.blockHeights.find(\n (bh) => bh.blockIndex === blockIndex\n );\n if (cachedBlockHeight) return cachedBlockHeight.height + 'px';\n }\n const blockLength = this.blocks[blockIndex].rows.length;\n if (blockLength === this.perBlock && this.measureHeight) {\n return this.measureHeight + 'px';\n }\n return this.unitHeight ? this.unitHeight * blockLength + 'px' : undefined;\n }\n\n /** cache the height for all active blocks for later renders */\n private setBlockHeight() {\n readTask(() => {\n this.activeBlocks.forEach((blockIndex) => {\n const el = this.blockElements[blockIndex];\n if (!el) return;\n\n const height = el.getBoundingClientRect().height;\n // cache height to our block heights array\n // for subsequent renders\n const fBhI = this.blockHeights.findIndex(\n (bh) => bh.blockIndex === blockIndex\n );\n if (fBhI > 0) {\n this.blockHeights[fBhI] = { height, blockIndex };\n } else this.blockHeights.push({ height, blockIndex });\n });\n });\n }\n\n /**\n * Attaches an intersection observer to each rendered tbody element\n * shows / hides intersecting blocks' and sets heights for when they're hidden\n * @param el - the tbody element to observe\n * @param blockIndex - the rendering tbody we're attaching the IO to\n */\n private setupBlockIO = (el: HTMLTableSectionElement, blockIndex: number) => {\n if (!el || this.blockIos.has(el)) return;\n\n const blockIo = new IntersectionObserver(\n ([ioEntry]) => {\n if (this.ignoreIO) return;\n\n if (ioEntry.isIntersecting) {\n // This is a bit gross\n // The Intersection Observer (IO) fires in an incorrect order when the scrolling is very fast\n // i.e. we go past blocks 3, 2, 1 and land on 0, but 3 can fire as 'intersecting' after 0.\n // To fix that, we check - for realzies - if the block IS visible.\n // BUT that test is not as sensitive to a block being visible via the IO,\n // so doesn't always fire if scrolling slowly\n // *sigh*\n readTask(() => {\n if (this.scrollSpeed < 100 || isInViewport(el, 0.01)) {\n this.activeBlocks = [\n blockIndex,\n blockIndex + 1,\n Math.max(0, blockIndex - 1),\n ];\n this.nanoTblBlockRendered.emit({\n block: blockIndex,\n totalBlocks: this.blockElements.length,\n });\n requestAnimationFrame(() => this.setBlockHeight());\n }\n });\n }\n },\n {\n threshold: [0],\n root:\n this.scrollParent === document.scrollingElement\n ? null\n : this.scrollParent,\n }\n );\n\n blockIo.observe(el);\n this.blockIos.set(el, blockIo);\n };\n\n /** Process slotted content */\n private processSlots() {\n // see if we have slot content\n if (!this.caption && !this.host.querySelector('[slot=\"caption\"]')) {\n console.error(\n 'For accessibility you must set a `caption` prop or use the `caption` slot'\n );\n }\n }\n\n private handleColumnPinned = (positions: {\n [key in TableTypes.Position]: boolean;\n }) => {\n Object.entries(positions).forEach(([key, applied]) => {\n this.tableEle.classList.toggle(\n `${CSSNAMESPACE}__pinned--${key}`,\n applied\n );\n });\n };\n\n private handleResizeChange = (\n e: NanoResizeObserveCustomEvent<ResizeStateChangeEventDetail>\n ) => {\n this.tableWrapperEle.className = '';\n this.tableWrapperEle.classList.add(\n ...(e.target.className + ' ' + `${CSSNAMESPACE}__wrap`).split(' ')\n );\n };\n\n // Component lifecycle\n\n async componentWillLoad() {\n perMark('init');\n this.scrollParent = findScrollParent(this.host);\n this.store = await generateStore(\n this.host,\n this.columns,\n this.scrollParent\n );\n await this.handleRowsChange();\n this.processSlots();\n this.store.data.onChange('rows', () => this.setBlocks());\n this.setBlocks();\n }\n\n connectedCallback(): void {\n this.scrollParent = findScrollParent(this.host);\n }\n\n componentDidLoad(): void {\n this.setInitialBlockDimension();\n }\n\n componentShouldUpdate(_newVal, _oldVal, stateName: keyof Table) {\n // stop double rendering - we use the store for rendering internally\n // the public facing props are kept in-sync with the store\n // but we don't want it to cause renders\n if (['rows', 'columns'].includes(stateName)) return false;\n }\n\n componentWillRender(): void | Promise<void> {\n perMark('render');\n }\n\n componentDidRender(): void {\n requestAnimationFrame(() => (this.ignoreIO = false));\n this.setMeasureElement();\n perMark('render', true);\n }\n\n render() {\n this.blockElements = [];\n\n return (\n <Host>\n <div\n class={`${CSSNAMESPACE}__top-anchor`}\n ref={(a) => (this.topAnchorEle = a)}\n >\n \n </div>\n\n <nano-resize-observe\n aria-labelledby={'table-caption-' + this.renderId}\n tabindex={this.type === 'grid' ? '0' : undefined}\n states=\"576w sm, 768w md\"\n class=\"sm md\"\n onNanoResizeStateChange={this.handleResizeChange}\n ></nano-resize-observe>\n\n <div\n class={`${CSSNAMESPACE}__wrap sm md`}\n ref={(div) => (this.tableWrapperEle = div)}\n >\n <nano-progress-bar\n indeterminate\n class={{\n [`${CSSNAMESPACE}__progress-bar`]: true,\n [`${CSSNAMESPACE}__progress-bar--show`]: this._loading,\n }}\n />\n <table\n role={this.type === 'grid' ? 'grid' : undefined}\n aria-readonly={this.type === 'table' ? 'true' : undefined}\n aria-rowcount={this.store.data.state.rows.length}\n aria-colcount={this.store.config.state.columns.length}\n class={`${CSSNAMESPACE}`}\n ref={(tbl) => (this.tableEle = tbl)}\n >\n <caption\n class={{\n [`${CSSNAMESPACE}__caption`]: true,\n [`${CSSNAMESPACE}__caption--hide`]: !this.showCaption,\n }}\n id={'table-caption-' + this.renderId}\n >\n <slot name=\"caption\">{this.caption}</slot>\n </caption>\n\n {/* Header */}\n <thead>\n <TableHeadFootRow\n rowRenderer={this.headRender}\n onColumnPinned={this.handleColumnPinned}\n >\n {this.store.config.state.columns.map((colModel) => [\n <TableColHead\n column={colModel}\n headRenderer={this.headRender}\n onColumnSortClick={this.sortStart}\n onColumnPinned={this.handleColumnPinned}\n onColumnDrag={this.colDrag}\n onColumnDrop={this.colDrop}\n defaults={{\n sortable: this.defaultSort,\n draggable: this.defaultColDraggable,\n }}\n />,\n ])}\n </TableHeadFootRow>\n </thead>\n\n {this._loading && !this.blocks.length && (\n <tbody class={`${CSSNAMESPACE}__active`}>\n {[...Array(10).keys()].map((rowIndex) => (\n <tr>\n {this.store.config.state.columns.map(\n (_colModel, colIndex) => (\n <TableCell\n rowIndex={rowIndex}\n colIndex={colIndex}\n nestedContent={<nano-skeleton />}\n />\n )\n )}\n </tr>\n ))}\n </tbody>\n )}\n\n {!this._loading && !this.blocks.length && (\n <tr>\n <th\n class={`${CSSNAMESPACE}__th`}\n colSpan={this.store.config.state.columns.length}\n >\n <div class=\"nano-tbl__cell-content nano-tbl__cell-content--no-result\">\n <slot name=\"no-results\">No results found</slot>\n </div>\n </th>\n </tr>\n )}\n\n {/* Body */}\n {this.blocks.map((block, blockIndex) => (\n <tbody\n key={block.__uuid}\n id={`tbody-${this.renderId}-${blockIndex}`}\n ref={(tb) => {\n this.blockElements.push(tb);\n this.setupBlockIO(tb, blockIndex);\n }}\n class={{\n [`${CSSNAMESPACE}__inactive`]:\n !this.activeBlocks.includes(blockIndex),\n [`${CSSNAMESPACE}__active`]:\n this.activeBlocks.includes(blockIndex),\n }}\n >\n {this.activeBlocks.includes(blockIndex) ? (\n block.rows.map((row, i) => {\n const rowIndex =\n blockIndex > 0 ? blockIndex * this.perBlock + i : i;\n return (\n <TableRow\n rowRenderer={this.rowRender}\n row={row}\n rowIndex={rowIndex}\n >\n {this.store.config.state.columns.map(\n (_colModel, colIndex) => (\n <TableCell\n rowIndex={rowIndex}\n colIndex={colIndex}\n />\n )\n )}\n </TableRow>\n );\n })\n ) : (\n <td\n colSpan={this.store.config.state.columns.length}\n style={{\n height: this.getBlockHeight(blockIndex),\n }}\n />\n )}\n </tbody>\n ))}\n\n {/* Footer */}\n {this.showFooter && (\n <tfoot>\n <TableHeadFootRow\n rowRenderer={this.footRender}\n onColumnPinned={this.handleColumnPinned}\n >\n {this.store.config.state.columns.map((colModel) => [\n <TableColHead\n column={colModel}\n headRenderer={this.footRender}\n onColumnPinned={this.handleColumnPinned}\n onColumnSortClick={this.sortStart}\n defaults={{\n sortable: this.defaultSort,\n draggable: this.defaultColDraggable,\n }}\n />,\n ])}\n </TableHeadFootRow>\n </tfoot>\n )}\n </table>\n\n {!!this.blocks.length && (\n <nano-spinner\n type=\"circle\"\n class={{\n [`${CSSNAMESPACE}__spinner`]: true,\n [`${CSSNAMESPACE}__spinner--show`]: this._loading,\n }}\n />\n )}\n </div>\n </Host>\n );\n }\n}\n"]}
|
@@ -0,0 +1,4 @@
|
|
1
|
+
/*!
|
2
|
+
* Web Components for Nanopore digital Web Apps
|
3
|
+
*/
|
4
|
+
(()=>{"use strict";const t=(t,n)=>{const e=globalThis[n];return e!=null&&t instanceof e};const n=e=>{if(e!=null){if(t(e,"ArrayBuffer")||t(e,"MessagePort")||t(e,"ImageBitmap")||t(e,"OffscreenCanvas")){return[e]}if(typeof e==="object"){if(e.constructor===Object){e=Object.values(e)}if(Array.isArray(e)){return e.flatMap(n)}return n(e.buffer)}}return[]};const e={};const r="stencil.table.worker";const o=r+".cb";addEventListener("message",(async({data:t})=>{if(t&&t[0]===r){let f=t[1];let i=t[2];let s=t[3];let u=0;let c=s.length;let a;let l;try{for(;u<c;u++){if(Array.isArray(s[u])&&s[u][0]===o){const t=s[u][1];s[u]=(...n)=>{postMessage([o,t,n])}}}a=await e[i](...s)}catch(t){a=null;if(t instanceof Error){l={isError:true,value:{message:t.message,name:t.name,stack:t.stack}}}else{l={isError:false,value:t}}a=undefined}const p=n(a);postMessage([r,f,a,l],p)}}));var f=typeof globalThis!=="undefined"?globalThis:typeof window!=="undefined"?window:typeof global!=="undefined"?global:typeof self!=="undefined"?self:{};var i=1/0;var s="[object Symbol]";var u=/[\\^$.*+?()[\]{}|]/g,c=RegExp(u.source);var a=typeof f=="object"&&f&&f.Object===Object&&f;var l=typeof self=="object"&&self&&self.Object===Object&&self;var p=a||l||Function("return this")();var d=Object.prototype;var w=d.toString;var h=p.Symbol;var y=h?h.prototype:undefined,b=y?y.toString:undefined;function g(t){if(typeof t=="string"){return t}if($(t)){return b?b.call(t):""}var n=t+"";return n=="0"&&1/t==-i?"-0":n}function v(t){return!!t&&typeof t=="object"}function $(t){return typeof t=="symbol"||v(t)&&w.call(t)==s}function E(t){return t==null?"":g(t)}function m(t){t=E(t);return t&&c.test(t)?t.replace(u,"\\$&"):t}var x=m;function j(t,n){if(typeof t==="string"){return n.checkString(t)}else if(typeof t==="number"){return n.checkNumber(t)}else{return false}}function k(t,n,e,r){if(typeof t==="object"){if(Array.isArray(t)){for(const o of t){if(k(o,n,e,r)){return true}}}else{for(const o in t){e.push(o);const f=k(t[o],n,e,r);e.pop();if(f)return true}}}else if(n.is){if(n.is.test(e.join("."))){return!!t}else{return false}}else{const o=e.join(".");for(const t of r.ignorePaths){if(t.test(o))return false}if(r.includePaths){let t=false;for(const n of r.includePaths){if(n.test(o)){t=true;break}}if(!t)return false}if(n.key){if(!n.key.test(o))return false}return j(t,n)}return false}function A(t,n,e,r){if(n.length){let o=false;for(const f of n){if(k(t,f,[],r)?!f.negate:f.negate){if(e==="OR"){return true}o=true}else if(e==="AND"){return false}}return o}return true}function O(t,n){const e=[];let r=false;let o=0;let f="";for(let i=0;i<t.length;i++){const s=t[i];if(r){if(s===f){r=false;f=""}}else if(s==='"'||s==="'"){r=true;f=s}else if(s.match(n)&&!r){e.push(t.slice(o,i).trim());o=i+1}if(i===t.length-1){e.push(t.slice(o).trim())}}return e.map((t=>{if(t.startsWith('"')&&t.endsWith('"')){return t.slice(1,-1)}if(t.startsWith("'")&&t.endsWith("'")){return t.slice(1,-1)}return t})).filter((t=>t))}const P={"<":function t(n){const e=Number(n[0]);return t=>t<e},"<=":function t(n){const e=Number(n[0]);return t=>t<=e},"=":function t(n){const e=n[0].split(",").filter((t=>t)).map(Number);return t=>{for(let n=0;n<e.length;n++){if(t===e[n]){return true}}return false}},">=":function t(n){const e=Number(n[0]);return t=>t>=e},">":function t(n){const e=Number(n[0]);return t=>t>e},"..":function t(n){const e=Number(n[0]);const r=Number(n[1]);return t=>t>=e&&t<=r}};function R(t){const{values:n,operator:e}=D(t);const r=P[e];if(!r){throw new Error(`unknown operator ${e}`)}return r(n)}function D(t){const n=/^\s*\(?\s*(?<startOperator><=|>=|<|=|>|\.\.)?(?<firstValue>-?\d*\.?\d+)(?:(?<afterDots>\.\.)(?<secondValue>-?\d*\.?\d*))?\s*\)?\s*$/.exec(t);if(!n){return{operator:"=",values:[t]}}if(!n.groups){throw new Error("unreachable")}const{startOperator:e,firstValue:r,afterDots:o,secondValue:f}=n.groups;let i=e;let s=r?[r]:[];if(e===".."){i="<="}else if(!e&&o&&!f){i=">="}else if(o){i=".."}if(f){s.push(f)}return{values:s,operator:i||"="}}const N={"<":function t(n){return t=>t<n[0]},"<=":function t(n){return t=>t<=n[0]},"=":function t(n,e){const r=O(n[0],",").filter((t=>t)).map((t=>new RegExp(`^${x(t)}$`,e)));return t=>{for(const n of r){if(n.test(t)){return true}}return false}},"~":function t(n,e){const r=O(n[0],",").filter((t=>t)).map((t=>new RegExp(x(t),e)));return t=>{for(const n of r){if(n.test(t)){return true}}return false}},">=":function t(n){return t=>t>=n[0]},">":function t(n){return t=>t>n[0]},"..":function t(n){return t=>t>=n[0]&&t<=n[1]}};function _(t,n){const{values:e,operator:r}=I(t);const o=N[r];if(!o){throw new Error(`unreachable unknown operator ${r}`)}return o(e,n)}function I(t){const n=t.split("..");const e=/^\s*\(?(?<operator><=|<|=|>=|>)?\s*(?<value>\S*)\s*\)?$/.exec(n[0]);if(!e){return{operator:"~",values:[t]}}if(!e.groups){throw new Error("unreachable")}let{operator:r,value:o}=e.groups;let f=n[1];let i=[o];if(n.length>1){r="..";if(!f){r=">="}else if(!o){i=[f];r="<="}else{i.push(f)}}return{operator:r||"~",values:i}}function M(t,n){const{insensitive:e,pathAlias:r}=n;return t.map((t=>{const n={};if(t.startsWith("-")){n.negate=true;t=t.substring(1)}const o=t.indexOf(":");if(o>-1){const f=t.substring(o+1);if(o>0){const i=t.substring(0,o);if(i==="is"){n.is=new RegExp(`(^|\\.)${x(f)}(\\.|$)`,e)}if(r[i]){n.key=r[i]}else{n.key=new RegExp(`(^|\\.)${x(i)}(\\.|$)`,e)}}V(n,f,e)}else{V(n,t,e)}return n}))}function V(t,n,e){t.checkString=_(n,e);t.checkNumber=R(n)}function T(t,n){const{insensitive:e}=n;const r={};for(const[n,o]of Object.entries(t)){if(o instanceof RegExp){r[n]=o}else{r[n]=new RegExp(`(^|\\.)${x(o)}(\\.|$)`,e)}}return r}function B(t,n={}){let{index:e=false,predicate:r="AND",ignorePaths:o=[],includePaths:f,pathAlias:i={}}=n;const s=n.limit?n.limit:Infinity;const u=n.caseSensitive?"":"i";let c=n.keywords||[];const a=T(i,{insensitive:u});const l=o.map((t=>typeof t==="string"?new RegExp(`(^|\\.)${x(t)}(\\.|$)`,u):t));const p=f?f.map((t=>typeof t==="string"?new RegExp(`(^|\\.)${x(t)}(\\.|$)`,u):t)):undefined;if(typeof c==="string"){c=O(c,/[ \t\r\n]/)}const d=M(c,{insensitive:u,pathAlias:a});let w=0;if(e){const n=[];for(let e=0;e<t.length&&w<s;e++){if(A(t[e],d,r,{ignorePaths:l,includePaths:p,pathAlias:a})){w=n.push(e)}}return n}else{const n=[];for(let e=0;e<t.length&&w<s;e++){if(A(t[e],d,r,{ignorePaths:l,includePaths:p,pathAlias:a})){w=n.push(t[e])}}return n}}function F(t){return t.map((t=>{if(!!t.sortCompareFn){t.sortCompareFn=new Function("return "+t.sortCompareFn)()}return t}))}const S=new Map;function C(){return Date.now().toString(36)+Math.random().toString(36).substring(2)}async function L(t,n){const e=C();S.set(e,{rows:t,columns:F(n)});return e}async function q(t,n){const e=S.get(t);if(!e)throw"cannot find worker with ID "+t;e.rows=n;if(!e.rows&&!e.columns)X(t);return true}async function z(t,n){const e=S.get(t);if(!e)throw"cannot find worker with ID "+t;e.columns=F(n);if(!e.rows&&!e.columns)X(t);return true}function G(t){const n=t.columns.find((t=>!!t.order));if(n){const{prop:t,order:e}=n;return{prop:t,order:e}}return null}function H(t,n,e,r){if(!e&&!r){const n=G(t);if(n){({prop:e,order:r}=n)}}if(!e||!r||!n.length)return n;const o=t.columns.find((t=>t.prop===e));if(!!o.sortCompareFn&&typeof o.sortCompareFn==="function"){const t=n.slice().sort(o.sortCompareFn(e,r));return t}if(o.type==="text"&&typeof n[0][e]==="string"){const t=n.slice().sort(((t,n)=>r==="asc"?t[e].localeCompare(n[e]):n[e].localeCompare(t[e])));return t}const f=n.slice().sort(((t,n)=>{if(t[e]<n[e])return r==="asc"?-1:1;if(t[e]>n[e])return r==="asc"?1:-1;return 0}));return f}async function J(t,n,e){const r=S.get(t);if(!r)throw"cannot find worker with ID "+t;const o=r.filterRows||r.rows;return H(r,o,n,e)}function K(t,n=[]){if(!n)return t;n.forEach((n=>{t=B(t,{keywords:n.filter,includePaths:[n.prop],ignorePaths:["__uuid","__index"]})}));return t}function Q(t,n){n=K(n);return H(t,n)}async function U(t,n){const e=S.get(t);if(!e)throw"cannot find worker with ID "+t;const r=!n||!n.length?await W(t,e.searchTerm):e.filterRows||e.rows;e.filterRows=K(r,n);return H(e,e.filterRows)}async function W(t,n){const e=S.get(t);if(!e)throw"cannot find worker with ID "+t;e.searchTerm=n;if(!n||!n.length){e.filterRows=e.rows;return Q(e,e.rows)}const r=e.columns.filter((t=>t.searchable!==false));e.filterRows=B(e.rows,{keywords:n,predicate:"OR",includePaths:[...r.map((t=>t.prop))],ignorePaths:["__uuid","__index"]});return Q(e,e.filterRows)}async function X(t){S.delete(t)}e.createWorkerStore=L;e.destroyWorkerStore=X;e.syncConfigToWorker=z;e.syncDataToWorker=q;e.workerFilter=U;e.workerSearch=W;e.workerSort=J})();
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/*!
|
2
2
|
* Web Components for Nanopore digital Web Apps
|
3
3
|
*/
|
4
|
-
export{T as nano_table}from"./p-
|
5
|
-
//# sourceMappingURL=p-
|
4
|
+
export{T as nano_table}from"./p-8fc2a38d.js";import"./p-1fe12320.js";import"./p-ee045579.js";import"./p-9746b0a5.js";import"./p-651b3264.js";
|
5
|
+
//# sourceMappingURL=p-fb12a45d.entry.js.map
|
File without changes
|
@@ -14,6 +14,6 @@ interface ImperativeDialogOptions {
|
|
14
14
|
export declare function nanoCreateDialog(body: string, buttons?: {
|
15
15
|
classes: string;
|
16
16
|
content: string;
|
17
|
-
handler: () =>
|
17
|
+
handler: () => void;
|
18
18
|
}[], dialogOptions?: ImperativeDialogOptions): HTMLNanoDialogElement;
|
19
19
|
export {};
|