@nanoporetech-digital/components 3.0.0 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -0
- package/dist/cjs/index-41582c2a.js +8 -4
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/nano-checkbox-group.cjs.entry.js +12 -3
- package/dist/cjs/nano-checkbox-group.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-components.cjs.js +1 -1
- package/dist/cjs/nano-details.cjs.entry.js +1 -1
- package/dist/cjs/nano-field-validator.cjs.entry.js +2 -0
- package/dist/cjs/nano-field-validator.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-global-nav-user-profile_3.cjs.entry.js +2 -2
- package/dist/cjs/nano-global-nav-user-profile_3.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-global-nav.cjs.entry.js +18 -20
- package/dist/cjs/nano-global-nav.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-progress-bar.cjs.entry.js +33 -0
- package/dist/cjs/nano-progress-bar.cjs.entry.js.map +1 -0
- package/dist/cjs/nano-resize-observe_2.cjs.entry.js +2 -2
- package/dist/cjs/nano-resize-observe_2.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-spinner.cjs.entry.js +1 -1
- package/dist/cjs/nano-spinner.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-tab-group.cjs.entry.js +1 -1
- package/dist/cjs/{nano-table-8a898621.js → nano-table-7e02106c.js} +146 -58
- package/dist/cjs/nano-table-7e02106c.js.map +1 -0
- package/dist/cjs/nano-table.cjs.entry.js +2 -1
- package/dist/cjs/nano-table.cjs.entry.js.map +1 -1
- package/dist/cjs/{table.worker-b0b0044a.js → table.worker-daf39ca9.js} +3 -2
- package/dist/cjs/table.worker-daf39ca9.js.map +1 -0
- package/dist/cjs/{transitions-d295a09e.js → transitions-5cd8f697.js} +10 -8
- package/dist/cjs/transitions-5cd8f697.js.map +1 -0
- package/dist/collection/collection-manifest.json +1 -0
- package/dist/collection/components/checkbox/checkbox-group.js +12 -3
- package/dist/collection/components/checkbox/checkbox-group.js.map +1 -1
- package/dist/collection/components/field-validator/field-validator.js +2 -0
- package/dist/collection/components/field-validator/field-validator.js.map +1 -1
- package/dist/collection/components/global-nav/assets/ont-logo.svg +89 -47
- package/dist/collection/components/global-nav/global-nav-interface.js.map +1 -1
- package/dist/collection/components/global-nav/global-nav.js +19 -21
- package/dist/collection/components/global-nav/global-nav.js.map +1 -1
- package/dist/collection/components/global-nav/{global-nav.css → style/global-nav.css} +462 -404
- package/dist/collection/components/nav-item/nav-item.css +4 -6
- package/dist/collection/components/progress-bar/progress-bar.css +84 -0
- package/dist/collection/components/progress-bar/progress-bar.js +106 -0
- package/dist/collection/components/progress-bar/progress-bar.js.map +1 -0
- package/dist/collection/components/skeleton/skeleton.css +8 -5
- package/dist/collection/components/skeleton/skeleton.js +1 -1
- package/dist/collection/components/skeleton/skeleton.js.map +1 -1
- package/dist/collection/components/spinner/spinner.css +5 -9
- package/dist/collection/components/table/table.children.js +43 -17
- package/dist/collection/components/table/table.children.js.map +1 -1
- package/dist/collection/components/table/table.css +97 -27
- package/dist/collection/components/table/table.js +143 -33
- package/dist/collection/components/table/table.js.map +1 -1
- package/dist/collection/components/table/table.service.js +1 -10
- package/dist/collection/components/table/table.service.js.map +1 -1
- package/dist/collection/components/table/table.store.js +11 -11
- package/dist/collection/components/table/table.store.js.map +1 -1
- package/dist/collection/utils/transitions.js +9 -7
- package/dist/collection/utils/transitions.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-checkbox-group.js +12 -3
- package/dist/components/nano-checkbox-group.js.map +1 -1
- package/dist/components/nano-field-validator.js +2 -0
- package/dist/components/nano-field-validator.js.map +1 -1
- package/dist/components/nano-global-nav.js +17 -19
- package/dist/components/nano-global-nav.js.map +1 -1
- package/dist/components/nano-progress-bar.d.ts +11 -0
- package/dist/components/nano-progress-bar.js +11 -0
- package/dist/components/nano-progress-bar.js.map +1 -0
- package/dist/components/nano-table.js +167 -58
- package/dist/components/nano-table.js.map +1 -1
- package/dist/components/nav-item.js +1 -1
- package/dist/components/nav-item.js.map +1 -1
- package/dist/components/progress-bar.js +48 -0
- package/dist/components/progress-bar.js.map +1 -0
- package/dist/components/skeleton.js +2 -2
- package/dist/components/skeleton.js.map +1 -1
- package/dist/components/spinner.js +1 -1
- package/dist/components/spinner.js.map +1 -1
- package/dist/components/transitions.js +9 -7
- package/dist/components/transitions.js.map +1 -1
- package/dist/custom-elements/index.d.ts +6 -0
- package/dist/custom-elements/index.js +214 -91
- package/dist/custom-elements/index.js.map +1 -1
- package/dist/esm/index-3c280603.js +8 -4
- package/dist/esm/loader.js +1 -1
- package/dist/esm/nano-checkbox-group.entry.js +12 -3
- package/dist/esm/nano-checkbox-group.entry.js.map +1 -1
- package/dist/esm/nano-components.js +1 -1
- package/dist/esm/nano-details.entry.js +1 -1
- package/dist/esm/nano-field-validator.entry.js +2 -0
- package/dist/esm/nano-field-validator.entry.js.map +1 -1
- package/dist/esm/nano-global-nav-user-profile_3.entry.js +2 -2
- package/dist/esm/nano-global-nav-user-profile_3.entry.js.map +1 -1
- package/dist/esm/nano-global-nav.entry.js +18 -20
- package/dist/esm/nano-global-nav.entry.js.map +1 -1
- package/dist/esm/nano-progress-bar.entry.js +29 -0
- package/dist/esm/nano-progress-bar.entry.js.map +1 -0
- package/dist/esm/nano-resize-observe_2.entry.js +2 -2
- package/dist/esm/nano-resize-observe_2.entry.js.map +1 -1
- package/dist/esm/nano-spinner.entry.js +1 -1
- package/dist/esm/nano-spinner.entry.js.map +1 -1
- package/dist/esm/nano-tab-group.entry.js +1 -1
- package/dist/esm/{nano-table-efdf3dba.js → nano-table-930d9245.js} +146 -58
- package/dist/esm/nano-table-930d9245.js.map +1 -0
- package/dist/esm/nano-table.entry.js +2 -1
- package/dist/esm/nano-table.entry.js.map +1 -1
- package/dist/esm/{table.worker-10ba1126.js → table.worker-7666db6d.js} +3 -2
- package/dist/esm/table.worker-7666db6d.js.map +1 -0
- package/dist/esm/{transitions-d75d242e.js → transitions-71cca3ed.js} +10 -8
- package/dist/esm/transitions-71cca3ed.js.map +1 -0
- package/dist/nano-components/assets/ont-logo.svg +89 -47
- 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-167b9165.js +5 -0
- package/dist/nano-components/p-167b9165.js.map +1 -0
- package/dist/nano-components/p-28344d24.entry.js +5 -0
- package/dist/nano-components/p-28344d24.entry.js.map +1 -0
- package/dist/nano-components/p-40b47b05.entry.js +5 -0
- package/dist/nano-components/{p-8a6834ff.entry.js.map → p-40b47b05.entry.js.map} +0 -0
- package/dist/nano-components/p-49458cd9.js +5 -0
- package/dist/nano-components/p-49458cd9.js.map +1 -0
- package/dist/nano-components/p-65f84bbd.entry.js +5 -0
- package/dist/nano-components/p-65f84bbd.entry.js.map +1 -0
- package/dist/nano-components/{p-8ef2363b.entry.js → p-6cd59e58.entry.js} +2 -2
- package/dist/nano-components/{p-8ef2363b.entry.js.map → p-6cd59e58.entry.js.map} +0 -0
- package/dist/nano-components/{p-687350a5.entry.js → p-701e8ebf.entry.js} +2 -2
- package/dist/nano-components/p-701e8ebf.entry.js.map +1 -0
- package/dist/nano-components/p-a2d0d7b9.entry.js.map +1 -1
- package/dist/nano-components/p-b717f6d7.js +5 -0
- package/dist/nano-components/{p-b7b06e04.js.map → p-b717f6d7.js.map} +0 -0
- package/dist/nano-components/p-b7901427.entry.js +5 -0
- package/dist/nano-components/p-b7901427.entry.js.map +1 -0
- package/dist/nano-components/{p-9f8b091a.entry.js → p-b7c3aecb.entry.js} +2 -2
- package/dist/nano-components/{p-9f8b091a.entry.js.map → p-b7c3aecb.entry.js.map} +0 -0
- package/dist/nano-components/p-d8e8d7e3.entry.js +5 -0
- package/dist/nano-components/p-d8e8d7e3.entry.js.map +1 -0
- package/dist/nano-components/p-f95a263c.entry.js +5 -0
- package/dist/nano-components/p-f95a263c.entry.js.map +1 -0
- package/dist/types/components/global-nav/global-nav-interface.d.ts +43 -0
- package/dist/types/components/global-nav/global-nav.d.ts +1 -1
- package/dist/types/components/progress-bar/progress-bar.d.ts +19 -0
- package/dist/types/components/table/table.children.d.ts +2 -1
- package/dist/types/components/table/table.d.ts +25 -7
- package/dist/types/components/table/table.service.d.ts +1 -7
- package/dist/types/components/table/table.store.d.ts +4 -2
- package/dist/types/components.d.ts +60 -5
- package/docs-json.json +273 -49
- package/docs-vscode.json +31 -2
- package/package.json +3 -3
- package/dist/cjs/nano-table-8a898621.js.map +0 -1
- package/dist/cjs/table.worker-b0b0044a.js.map +0 -1
- package/dist/cjs/transitions-d295a09e.js.map +0 -1
- package/dist/esm/nano-table-efdf3dba.js.map +0 -1
- package/dist/esm/table.worker-10ba1126.js.map +0 -1
- package/dist/esm/transitions-d75d242e.js.map +0 -1
- package/dist/nano-components/p-03402e69.entry.js +0 -5
- package/dist/nano-components/p-03402e69.entry.js.map +0 -1
- package/dist/nano-components/p-2382d5e9.entry.js +0 -5
- package/dist/nano-components/p-2382d5e9.entry.js.map +0 -1
- package/dist/nano-components/p-4c6ef60b.js +0 -5
- package/dist/nano-components/p-4c6ef60b.js.map +0 -1
- package/dist/nano-components/p-61bfb8b9.entry.js +0 -5
- package/dist/nano-components/p-61bfb8b9.entry.js.map +0 -1
- package/dist/nano-components/p-687350a5.entry.js.map +0 -1
- package/dist/nano-components/p-82295d91.js +0 -5
- package/dist/nano-components/p-82295d91.js.map +0 -1
- package/dist/nano-components/p-8a6834ff.entry.js +0 -5
- package/dist/nano-components/p-9f2524d4.entry.js +0 -5
- package/dist/nano-components/p-9f2524d4.entry.js.map +0 -1
- package/dist/nano-components/p-b7b06e04.js +0 -5
@@ -3,6 +3,7 @@
|
|
3
3
|
*/
|
4
4
|
import { j as consoleError, h, F as Fragment, g as getElement, e as getRenderingRef, r as registerInstance, c as createEvent, d as readTask, a as Host } from './index-3c280603.js';
|
5
5
|
import { a as cyrb53 } from './math-c02ddfda.js';
|
6
|
+
import { d as debounce } from './throttle-7836544e.js';
|
6
7
|
import { c as createStore } from './index-c752dae1.js';
|
7
8
|
|
8
9
|
const CSSNAMESPACE = 'nano-tbl';
|
@@ -109,7 +110,7 @@ const createWorkerProxy = (worker, workerMsgId, exportedMethod) => (
|
|
109
110
|
})
|
110
111
|
);
|
111
112
|
|
112
|
-
const workerPromise = import('./table.worker-
|
113
|
+
const workerPromise = import('./table.worker-7666db6d.js').then(m => m.worker);
|
113
114
|
const createWorkerStore = /*@__PURE__*/createWorkerProxy(workerPromise, 'stencil.table.worker', 'createWorkerStore');
|
114
115
|
const syncConfigToWorker = /*@__PURE__*/createWorkerProxy(workerPromise, 'stencil.table.worker', 'syncConfigToWorker');
|
115
116
|
const syncDataToWorker = /*@__PURE__*/createWorkerProxy(workerPromise, 'stencil.table.worker', 'syncDataToWorker');
|
@@ -128,17 +129,11 @@ function colsToWorker(columns) {
|
|
128
129
|
return safeColumns;
|
129
130
|
}
|
130
131
|
const stores = new WeakMap();
|
131
|
-
async function generateStore(host,
|
132
|
-
// augment data with some internal props
|
133
|
-
rows = rows.map((row, i) => ({
|
134
|
-
...row,
|
135
|
-
__index: i,
|
136
|
-
__uuid: cyrb53(Object.values(row).join()),
|
137
|
-
}));
|
132
|
+
async function generateStore(host, columns, scrollParent) {
|
138
133
|
const store = {
|
139
|
-
data: createStore({ rows }),
|
134
|
+
data: createStore({ rows: [] }),
|
140
135
|
config: createStore({ columns }),
|
141
|
-
general: createStore({ workerId: null }),
|
136
|
+
general: createStore({ workerId: null, scrollParent, host }),
|
142
137
|
};
|
143
138
|
const id = await createWorkerStore(store.data.state.rows, colsToWorker(store.config.state.columns));
|
144
139
|
store.general.state.workerId = id;
|
@@ -173,9 +168,15 @@ function storeSetData(host, rows) {
|
|
173
168
|
const store = stores.get(host);
|
174
169
|
if (!store)
|
175
170
|
return;
|
176
|
-
|
177
|
-
|
171
|
+
// augment data with some internal props
|
172
|
+
rows = rows.map((row, i) => ({
|
173
|
+
...row,
|
174
|
+
__index: i,
|
175
|
+
__uuid: cyrb53(Object.values(row).join()),
|
176
|
+
}));
|
178
177
|
store.data.state.rows = rows;
|
178
|
+
if (store.general.state.workerId)
|
179
|
+
return syncDataToWorker(store.general.state.workerId, rows);
|
179
180
|
}
|
180
181
|
function storeSetConfig(host, columns) {
|
181
182
|
const store = stores.get(host);
|
@@ -330,7 +331,7 @@ function cellRender(rowIndex, colIndex) {
|
|
330
331
|
* @param col - the current column config object
|
331
332
|
* @returns - a JSX node
|
332
333
|
*/
|
333
|
-
function
|
334
|
+
function colheadFootRender(col) {
|
334
335
|
const tpl = col?.colTemplate;
|
335
336
|
return tpl ? (tpl(h, col)) : (h(Fragment, null, col.title));
|
336
337
|
}
|
@@ -357,33 +358,56 @@ const stickyVIOs = new WeakMap();
|
|
357
358
|
function addHObserver(el, pos, cb) {
|
358
359
|
if (stickyHIOs.get(el))
|
359
360
|
return;
|
361
|
+
const store = fetchStores();
|
362
|
+
const root = store.general.state.scrollParent;
|
363
|
+
const host = store.general.state.host;
|
360
364
|
const observer = new IntersectionObserver(([e]) => {
|
361
365
|
const positions = {};
|
362
|
-
if (pos === 'start')
|
363
|
-
positions.start =
|
364
|
-
|
366
|
+
if (pos === 'start') {
|
367
|
+
positions.start =
|
368
|
+
e.boundingClientRect.x -
|
369
|
+
(host.getBoundingClientRect().x + root.scrollLeft) <
|
370
|
+
0 && !e.isIntersecting;
|
371
|
+
}
|
372
|
+
if (pos === 'end') {
|
373
|
+
// TODO - sort these out for RtL
|
365
374
|
positions.end =
|
366
|
-
e.boundingClientRect.
|
375
|
+
e.boundingClientRect.right > e.boundingClientRect.width &&
|
367
376
|
!e.isIntersecting;
|
377
|
+
}
|
368
378
|
cb(positions);
|
369
|
-
}, {
|
379
|
+
}, {
|
380
|
+
threshold: [1],
|
381
|
+
rootMargin: '1px 0px 1px 0px',
|
382
|
+
root: root === document.scrollingElement ? null : root,
|
383
|
+
});
|
370
384
|
stickyHIOs.set(el, observer);
|
371
385
|
requestAnimationFrame(() => observer.observe(el));
|
372
386
|
}
|
373
387
|
function addVObserver(el, pos, cb) {
|
374
388
|
if (stickyVIOs.get(el))
|
375
389
|
return;
|
390
|
+
const store = fetchStores();
|
391
|
+
const root = store.general.state.scrollParent;
|
392
|
+
const host = store.general.state.host;
|
376
393
|
const observer = new IntersectionObserver(([e]) => {
|
377
|
-
console.log(e);
|
378
394
|
const positions = {};
|
379
|
-
if (pos === 'top')
|
380
|
-
positions.top =
|
395
|
+
if (pos === 'top') {
|
396
|
+
positions.top =
|
397
|
+
e.boundingClientRect.y -
|
398
|
+
(host.getBoundingClientRect().y + root.scrollTop) <
|
399
|
+
0 && !e.isIntersecting;
|
400
|
+
}
|
381
401
|
if (pos === 'bottom')
|
382
402
|
positions.bottom =
|
383
403
|
e.boundingClientRect.height > e.intersectionRect.height &&
|
384
404
|
!e.isIntersecting;
|
385
405
|
cb(positions);
|
386
|
-
}, {
|
406
|
+
}, {
|
407
|
+
threshold: [0.99],
|
408
|
+
rootMargin: '0px 100px 0px 100px',
|
409
|
+
root: root === document.scrollingElement ? null : root,
|
410
|
+
});
|
387
411
|
stickyVIOs.set(el, observer);
|
388
412
|
requestAnimationFrame(() => observer.observe(el));
|
389
413
|
}
|
@@ -456,7 +480,7 @@ const TableColHead = ({ column, headRenderer, onColumnOrderClick, onColumnPinned
|
|
456
480
|
default:
|
457
481
|
order = 'asc';
|
458
482
|
}
|
459
|
-
onColumnOrderClick(order, column.prop, e.target.
|
483
|
+
onColumnOrderClick(order, column.prop, e.target.closest('th'));
|
460
484
|
}
|
461
485
|
let extraProps = {};
|
462
486
|
if (column.columnProperties) {
|
@@ -472,7 +496,7 @@ const TableColHead = ({ column, headRenderer, onColumnOrderClick, onColumnPinned
|
|
472
496
|
},
|
473
497
|
};
|
474
498
|
let props = extraProps ? mergeProperties(baseProps, extraProps) : baseProps;
|
475
|
-
const content =
|
499
|
+
const content = colheadFootRender(column);
|
476
500
|
if (!content)
|
477
501
|
return h(Fragment, null);
|
478
502
|
props =
|
@@ -490,8 +514,11 @@ const TableColHead = ({ column, headRenderer, onColumnOrderClick, onColumnPinned
|
|
490
514
|
if (['top', 'bottom'].includes(headRenderer.pinned))
|
491
515
|
addVObserver(th, headRenderer.pinned, onColumnPinned);
|
492
516
|
} },
|
493
|
-
h("button", { class:
|
494
|
-
|
517
|
+
h("button", { class: {
|
518
|
+
[`${CSSNAMESPACE}__order-btn`]: true,
|
519
|
+
[`${CSSNAMESPACE}__cell-content`]: true,
|
520
|
+
}, onClick: handleColumnOrderClick },
|
521
|
+
colheadFootRender(column),
|
495
522
|
!!column.filter && h("nano-icon", { name: "light/filter" }),
|
496
523
|
!!column.order &&
|
497
524
|
(column.order === 'desc' ? (h("nano-icon", { name: "solid/long-arrow-down" })) : (h("nano-icon", { name: "solid/long-arrow-up" }))),
|
@@ -504,11 +531,12 @@ const TableColHead = ({ column, headRenderer, onColumnOrderClick, onColumnPinned
|
|
504
531
|
if (['top', 'bottom'].includes(headRenderer.pinned))
|
505
532
|
addVObserver(th, headRenderer.pinned, onColumnPinned);
|
506
533
|
} },
|
507
|
-
|
508
|
-
|
534
|
+
h("div", { class: `${CSSNAMESPACE}__cell-content` },
|
535
|
+
colheadFootRender(column),
|
536
|
+
!!column.filter && h("nano-icon", { name: "light/bars-filter" }))));
|
509
537
|
};
|
510
|
-
const TableCell = ({ rowIndex, colIndex, }) => {
|
511
|
-
const content = cellRender(rowIndex, colIndex);
|
538
|
+
const TableCell = ({ rowIndex, colIndex, nestedContent, }) => {
|
539
|
+
const content = nestedContent || cellRender(rowIndex, colIndex);
|
512
540
|
if (!content)
|
513
541
|
return h(Fragment, null);
|
514
542
|
const store = fetchStores();
|
@@ -532,7 +560,8 @@ const TableCell = ({ rowIndex, colIndex, }) => {
|
|
532
560
|
}
|
533
561
|
return (h(CellType
|
534
562
|
// role="gridcell"
|
535
|
-
, { ...props },
|
563
|
+
, { ...props },
|
564
|
+
h("div", { class: `${CSSNAMESPACE}__cell-content` }, content)));
|
536
565
|
};
|
537
566
|
|
538
567
|
const detectScrollSpeed = (() => {
|
@@ -590,7 +619,7 @@ function isInViewport(el, percentVisible = 100) {
|
|
590
619
|
percentVisible);
|
591
620
|
}
|
592
621
|
|
593
|
-
const tableCss = ":host{box-sizing:border-box}*,*::before,*::after{box-sizing:border-box}[hidden]{display:none !important}nano-table{display:
|
622
|
+
const tableCss = ":host{box-sizing:border-box}*,*::before,*::after{box-sizing:border-box}[hidden]{display:none !important}@charset \"UTF-8\";nano-table{display:table;width:100%;--max-col-width:200px;--color:var(--nano-color-mediumgrey, #68767e);--font-size:0.87rem;--cell-line-height:1.5;--border-color:var(--nano-color-palegrey, #b5aea7);--border-style:1px solid var(--border-color);--border-tint-color:var(--nano-color-blue, #90c6e7);--border-tint-style:2px solid var(--border-tint-color);--cell-bg-rgb:var(--nano-color-white-rgb, 255 255 255);--head-bg-rgb:var(--cell-bg-rgb);--foot-bg-rgb:var(--cell-bg-rgb);--th-row-bg-rgb:var(--cell-bg-rgb);--ordered-bg-rgb:var(--nano-color-offwhite-rgb, 249 249 251);--td-padding:0.5rem 0.625rem 0.4125rem;--th-padding:0.875rem 0.625rem 0.6875rem;--head-th-padding:var(--th-padding);--foot-th-padding:var(--td-padding);--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));-webkit-border-end:1px solid transparent;border-inline-end:1px solid transparent}.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}.nano-tbl__ordered{background-color:var(--ordered-bg);-webkit-border-start:var(--border-style);border-inline-start:var(--border-style);-webkit-border-end:var(--border-style);border-inline-end:var(--border-style)}.nano-tbl__order-btn{padding:0;border:none;outline:none;font:inherit;background:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;color:inherit;display:-webkit-box;display:-ms-flexbox;display:flex;gap:10px;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:100%}.nano-tbl__status-icons{margin-inline:auto 10px;display:-webkit-box;display:-ms-flexbox;display:flex;gap:10px}.nano-tbl__progress-bar{font-size:0.2rem;position:sticky;inset-block-start:0;inset-inline:0;z-index:10;-webkit-transition:scale 0.25s;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;-webkit-border-after:var(--border-style);border-block-end:var(--border-style);max-width:var(--max-col-width);background-color:rgb(var(--cell-bg-rgb))}@media (min-width: 768px){.nano-tbl__td:first-child .nano-tbl__cell-content,.nano-tbl__th:first-child .nano-tbl__cell-content{-webkit-padding-start:var(--bookend-col-padding) !important;padding-inline-start:var(--bookend-col-padding) !important}.nano-tbl__td:last-child .nano-tbl__cell-content,.nano-tbl__th:last-child .nano-tbl__cell-content{-webkit-padding-end:var(--bookend-col-padding) !important;padding-inline-end:var(--bookend-col-padding) !important}}thead .nano-tbl__td,thead .nano-tbl__th{font-weight:800;background:rgba(var(--head-bg-rgb), 90%)}thead .nano-tbl__td .nano-tbl__cell-content,thead .nano-tbl__th .nano-tbl__cell-content{padding:var(--head-th-padding)}tfoot .nano-tbl__td,tfoot .nano-tbl__th{font-weight:800;-webkit-border-after:none;border-block-end:none;background:rgba(var(--foot-bg-rgb), 90%)}tfoot .nano-tbl__td .nano-tbl__cell-content,tfoot .nano-tbl__th .nano-tbl__cell-content{padding:var(--foot-th-padding)}.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:var(--td-padding)}.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;max-width:65vw;margin:0}.nano-tbl__pin{position:sticky;z-index:1}.nano-tbl__pin--start{inset-inline:-1px auto;-webkit-transition:max-width 0.25s;transition:max-width 0.25s}.nano-tbl__pin--start::after{content:\"\";position:absolute;inset:0;-webkit-box-shadow:5px 0 4px 0 rgba(0, 0, 0, 0.2);box-shadow:5px 0 4px 0 rgba(0, 0, 0, 0.2);opacity:0;z-index:-1}.nano-tbl__pinned--start .nano-tbl__pin--start{z-index:2}@media (max-width: 576px){.nano-tbl__pinned--start .nano-tbl__pin--start{max-width:25vw !important}}.nano-tbl__pinned--start .nano-tbl__pin--start::after{opacity:1}.nano-tbl__pin--end{inset-inline:auto -1px;max-width:min(50vw, 200px);}.nano-tbl__pin--end::after{content:\"\";position:absolute;inset:0;-webkit-box-shadow:-5px 0 4px 0 rgba(0, 0, 0, 0.2);box-shadow:-5px 0 4px 0 rgba(0, 0, 0, 0.2);opacity:0;z-index:-1}.nano-tbl__pinned--end .nano-tbl__pin--end{z-index:3}.nano-tbl__pinned--end .nano-tbl__pin--end::after{opacity:1}@media (max-width: 576px){.nano-tbl__pin--start~.nano-tbl__pin--end{inset-inline:auto auto}.nano-tbl__pin--start~.nano-tbl__pin--end::after{display:none}}.nano-tbl__pin--top{inset-block:-1px auto}.nano-tbl__pinned--top .nano-tbl__pin--top{z-index:4}.nano-tbl__pin--bottom{inset-block:auto -1px}.nano-tbl__pinned--bottom .nano-tbl__pin--bottom{z-index:5;-webkit-border-before:var(--border-tint-style);border-block-start:var(--border-tint-style)}.nano-tbl__pinned--top.nano-tbl__pinned--start .nano-tbl__pin--top.nano-tbl__pin--start{z-index:6}.nano-tbl__pinned--top.nano-tbl__pinned--end .nano-tbl__pin--top.nano-tbl__pin--end{z-index:6}.nano-tbl__pinned--bottom.nano-tbl__pinned--start .nano-tbl__pin--bottom.nano-tbl__pin--start{z-index:6}.nano-tbl__pinned--bottom.nano-tbl__pinned--end .nano-tbl__pin--bottom.nano-tbl__pin--end{z-index:6}.nano-tbl thead tr:last-of-type td,.nano-tbl thead tr:last-of-type th,.nano-tbl tfoot tr:last-of-type td,.nano-tbl tfoot tr:last-of-type th{-webkit-border-after:var(--border-tint-style);border-block-end:var(--border-tint-style)}.nano-tbl .unlimited-width{max-width:none}.nano-tbl__spinner{font-size:1.5rem;-webkit-transition:scale 0.25s;transition:scale 0.25s;scale:0;padding:0.5rem;position:absolute;inset-block-end:0;inset-inline-start:calc(50% - 0.75rem);z-index:-1}.nano-tbl__spinner--show{scale:1;position:sticky}.nano-tbl nano-skeleton{line-height:var(--cell-line-height)}";
|
594
623
|
|
595
624
|
let id = 0;
|
596
625
|
const Table = class {
|
@@ -604,6 +633,9 @@ const Table = class {
|
|
604
633
|
this.nanoTblAfterFilter = createEvent(this, "nanoTblAfterFilter", 7);
|
605
634
|
this.nanoTblBeforeSearch = createEvent(this, "nanoTblBeforeSearch", 7);
|
606
635
|
this.nanoTblAfterSearch = createEvent(this, "nanoTblAfterSearch", 7);
|
636
|
+
this.debounceSetLoading = (l) => {
|
637
|
+
this._loading = l;
|
638
|
+
};
|
607
639
|
this.renderId = 'tbl-' + id++;
|
608
640
|
this.filters = [];
|
609
641
|
this.currentFilters = '';
|
@@ -621,8 +653,10 @@ const Table = class {
|
|
621
653
|
* @returns A promise
|
622
654
|
*/
|
623
655
|
this.sortStart = async (order, column, element) => {
|
656
|
+
// did order change?
|
624
657
|
if (this.currentSort === order + ':' + column)
|
625
658
|
return;
|
659
|
+
this.loading = true;
|
626
660
|
const sortEvent = this.nanoTblBeforeSort.emit({ column: column, order });
|
627
661
|
if (sortEvent.defaultPrevented)
|
628
662
|
return;
|
@@ -647,10 +681,13 @@ const Table = class {
|
|
647
681
|
console.warn('sort failed', e);
|
648
682
|
this.currentSort = '';
|
649
683
|
}
|
684
|
+
finally {
|
685
|
+
this.loading = false;
|
686
|
+
}
|
650
687
|
};
|
651
688
|
/**
|
652
|
-
* Attaches an intersection observer to each rendered tbody
|
653
|
-
* shows / hides intersecting blocks' and sets heights for when
|
689
|
+
* Attaches an intersection observer to each rendered tbody element
|
690
|
+
* shows / hides intersecting blocks' and sets heights for when they're hidden
|
654
691
|
* @param el - the tbody element to observe
|
655
692
|
* @param blockIndex - the rendering tbody we're attaching the IO to
|
656
693
|
*/
|
@@ -665,8 +702,8 @@ const Table = class {
|
|
665
702
|
// The Intersection Observer (IO) fires in an incorrect order when the scrolling is very fast
|
666
703
|
// i.e. we go past blocks 3, 2, 1 and land on 0, but 3 can fire as 'intersecting' after 0.
|
667
704
|
// To fix that, we check - for realsies - if the block IS visible.
|
668
|
-
// BUT that test is not as sensitive to a block being visible
|
669
|
-
// so doesn't always fire if scrolling
|
705
|
+
// BUT that test is not as sensitive to a block being visible via the IO,
|
706
|
+
// so doesn't always fire if scrolling slowly
|
670
707
|
// *sigh*
|
671
708
|
readTask(() => {
|
672
709
|
if (this.scrollSpeed < 100 || isInViewport(el, 0.01)) {
|
@@ -683,7 +720,12 @@ const Table = class {
|
|
683
720
|
}
|
684
721
|
});
|
685
722
|
}
|
686
|
-
}, {
|
723
|
+
}, {
|
724
|
+
threshold: [0],
|
725
|
+
root: this.scrollParent === document.scrollingElement
|
726
|
+
? null
|
727
|
+
: this.scrollParent,
|
728
|
+
});
|
687
729
|
blockIo.observe(el);
|
688
730
|
this.blockIos.set(el, blockIo);
|
689
731
|
};
|
@@ -695,7 +737,9 @@ const Table = class {
|
|
695
737
|
this.type = 'table';
|
696
738
|
this.caption = undefined;
|
697
739
|
this.showCaption = false;
|
698
|
-
this.
|
740
|
+
this._loading = true;
|
741
|
+
this.placeholderSize = 5;
|
742
|
+
this.rows = undefined;
|
699
743
|
this.columns = [];
|
700
744
|
this.headRender = { pinned: 'top' };
|
701
745
|
this.rowRender = undefined;
|
@@ -708,9 +752,29 @@ const Table = class {
|
|
708
752
|
this.blocks = [];
|
709
753
|
this.activeBlocks = [0, 1, 2];
|
710
754
|
this.measureHeight = 0;
|
755
|
+
this.debounceSetLoading = debounce(this.debounceSetLoading.bind(this), 50);
|
756
|
+
}
|
757
|
+
/** Will show a loading state when true.
|
758
|
+
* Will be shown automatically if `rows` is a promise waiting to resolve
|
759
|
+
* or when performing custom filtering or sorting */
|
760
|
+
get loading() {
|
761
|
+
return this._loading;
|
762
|
+
}
|
763
|
+
set loading(l) {
|
764
|
+
this.debounceSetLoading(l);
|
711
765
|
}
|
712
766
|
handleRowsChange() {
|
713
|
-
|
767
|
+
if (!this.rows)
|
768
|
+
return;
|
769
|
+
this.loading = true;
|
770
|
+
Promise.resolve(this.rows).then(async (rows) => {
|
771
|
+
await storeSetData(this.host, rows);
|
772
|
+
if (!this.isReady) {
|
773
|
+
await this.columnInit();
|
774
|
+
this.setInitialBlockDimension();
|
775
|
+
}
|
776
|
+
this.loading = false;
|
777
|
+
});
|
714
778
|
}
|
715
779
|
handleColsChange() {
|
716
780
|
storeSetConfig(this.host, this.columns);
|
@@ -758,6 +822,8 @@ const Table = class {
|
|
758
822
|
}
|
759
823
|
// uses the first 'tr' of an active block as our yard stick
|
760
824
|
set measureEle(el) {
|
825
|
+
if (!el)
|
826
|
+
return;
|
761
827
|
this.measureHeight = el.getBoundingClientRect().height;
|
762
828
|
this.unitHeight =
|
763
829
|
el.querySelector('tr')?.getBoundingClientRect().height || this.unitHeight;
|
@@ -804,6 +870,7 @@ const Table = class {
|
|
804
870
|
this.nanoTblAfterSort.emit({ column: column, order });
|
805
871
|
}
|
806
872
|
async searchStart() {
|
873
|
+
this.loading = true;
|
807
874
|
const sortEvent = this.nanoTblBeforeSearch.emit({ term: this.searchTerm });
|
808
875
|
if (sortEvent.defaultPrevented)
|
809
876
|
return;
|
@@ -813,7 +880,12 @@ const Table = class {
|
|
813
880
|
await storeSearch(this.host, this.searchTerm);
|
814
881
|
this.nanoTblAfterSearch.emit({ term: this.searchTerm });
|
815
882
|
}
|
816
|
-
catch (e) {
|
883
|
+
catch (e) {
|
884
|
+
console.warn('search failed', e);
|
885
|
+
}
|
886
|
+
finally {
|
887
|
+
this.loading = false;
|
888
|
+
}
|
817
889
|
}
|
818
890
|
async filterStart(filters, additive = true) {
|
819
891
|
if (filters) {
|
@@ -829,6 +901,7 @@ const Table = class {
|
|
829
901
|
}
|
830
902
|
if (this.currentFilters === JSON.stringify(this.filters))
|
831
903
|
return;
|
904
|
+
this.loading = true;
|
832
905
|
const sortEvent = this.nanoTblBeforeFilter.emit({ filters: this.filters });
|
833
906
|
if (sortEvent.defaultPrevented)
|
834
907
|
return;
|
@@ -850,7 +923,12 @@ const Table = class {
|
|
850
923
|
await storeFilter(this.host, this.filters);
|
851
924
|
this.filterComplete();
|
852
925
|
}
|
853
|
-
catch (e) {
|
926
|
+
catch (e) {
|
927
|
+
console.warn('filter failed', e);
|
928
|
+
}
|
929
|
+
finally {
|
930
|
+
this.loading = false;
|
931
|
+
}
|
854
932
|
}
|
855
933
|
filterComplete() {
|
856
934
|
this.columns = this.columns.map((c) => {
|
@@ -864,16 +942,20 @@ const Table = class {
|
|
864
942
|
/** Scrolls to the top immediately - used whilst sorting / filtering */
|
865
943
|
scrollToTop(element) {
|
866
944
|
const scrollBehaviour = this.scrollParent.style?.scrollBehavior;
|
945
|
+
const scrollX = this.scrollParent.scrollLeft;
|
867
946
|
this.scrollParent.style.scrollBehavior = 'auto';
|
868
|
-
this.
|
947
|
+
if (this.topAnchorEle && !isInViewport(this.topAnchorEle, 0.1))
|
948
|
+
this.topAnchorEle.scrollIntoView();
|
869
949
|
if (element)
|
870
|
-
element.scrollIntoView();
|
950
|
+
element.scrollIntoView({ block: 'start' });
|
951
|
+
if (scrollX)
|
952
|
+
this.scrollParent.scrollLeft = scrollX;
|
871
953
|
if (scrollBehaviour)
|
872
954
|
this.scrollParent.style.scrollBehavior = scrollBehaviour;
|
873
955
|
}
|
874
956
|
setMeasureElement() {
|
875
957
|
readTask(() => {
|
876
|
-
this.measureEle = this.blockElements.find((b) => !b
|
958
|
+
this.measureEle = this.blockElements.find((b) => !b?.classList?.contains(`${CSSNAMESPACE}__inactive`));
|
877
959
|
});
|
878
960
|
}
|
879
961
|
/**
|
@@ -898,11 +980,6 @@ const Table = class {
|
|
898
980
|
}
|
899
981
|
if (i === this.blockElements.length - 1)
|
900
982
|
resolve();
|
901
|
-
// const heightGuess = this.getBlockHeight(this.blockElements.indexOf(el));
|
902
|
-
// writeTask(() => {
|
903
|
-
// el.style.height = heightGuess;
|
904
|
-
// if (i === this.blockElements.length - 1) resolve();
|
905
|
-
// });
|
906
983
|
});
|
907
984
|
});
|
908
985
|
});
|
@@ -986,8 +1063,8 @@ const Table = class {
|
|
986
1063
|
if (!el)
|
987
1064
|
return;
|
988
1065
|
const height = el.getBoundingClientRect().height;
|
989
|
-
// cache height to our block heights
|
990
|
-
//
|
1066
|
+
// cache height to our block heights array
|
1067
|
+
// for subsequent renders
|
991
1068
|
const fBhI = this.blockHeights.findIndex((bh) => bh.blockIndex === blockIndex);
|
992
1069
|
if (fBhI > 0) {
|
993
1070
|
this.blockHeights[fBhI] = { height, blockIndex };
|
@@ -1006,8 +1083,8 @@ const Table = class {
|
|
1006
1083
|
}
|
1007
1084
|
// Component lifecycle
|
1008
1085
|
async componentWillLoad() {
|
1009
|
-
this.store = await generateStore(this.host, this.
|
1010
|
-
await this.
|
1086
|
+
this.store = await generateStore(this.host, this.columns, this.scrollParent);
|
1087
|
+
await this.handleRowsChange();
|
1011
1088
|
this.processSlots();
|
1012
1089
|
this.setBlocks();
|
1013
1090
|
this.store.data.onChange('rows', () => this.setBlocks());
|
@@ -1033,9 +1110,17 @@ const Table = class {
|
|
1033
1110
|
}
|
1034
1111
|
render() {
|
1035
1112
|
this.blockElements = [];
|
1036
|
-
return (h(Host, null, h("div", {
|
1113
|
+
return (h(Host, null, h("div", { class: `${CSSNAMESPACE}__top-anchor`, ref: (a) => (this.topAnchorEle = a) }, "\u00A0"), h("div", { "aria-labelledby": 'table-caption-' + this.renderId, tabindex: this.type === 'grid' ? '0' : undefined }, h("nano-progress-bar", { indeterminate: true, class: {
|
1114
|
+
[`${CSSNAMESPACE}__progress-bar`]: true,
|
1115
|
+
[`${CSSNAMESPACE}__progress-bar--show`]: this.loading,
|
1116
|
+
} }), h("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: `${CSSNAMESPACE}`, ref: (tbl) => (this.tableEle = tbl) }, h("caption", { class: {
|
1117
|
+
[`${CSSNAMESPACE}__caption`]: true,
|
1118
|
+
[`${CSSNAMESPACE}__caption--hide`]: !this.showCaption,
|
1119
|
+
}, id: 'table-caption-' + this.renderId }, h("slot", { name: "caption" }, this.caption)), h("thead", null, h(TableHeadFootRow, { rowRenderer: this.headRender, onColumnPinned: this.handleColumnPinned }, this.store.config.state.columns.map((colModel) => [
|
1037
1120
|
h(TableColHead, { column: colModel, headRenderer: this.headRender, onColumnOrderClick: this.sortStart, onColumnPinned: this.handleColumnPinned }),
|
1038
|
-
]))), this.
|
1121
|
+
]))), this.loading &&
|
1122
|
+
!this.blocks.length &&
|
1123
|
+
[...Array(10).keys()].map((rowIndex) => (h("tr", null, this.store.config.state.columns.map((_colModel, colIndex) => (h(TableCell, { rowIndex: rowIndex, colIndex: colIndex, nestedContent: h("nano-skeleton", null) })))))), this.blocks.map((block, blockIndex) => (h("tbody", { key: block.__uuid, id: `tbody-${this.renderId}-${blockIndex}`, ref: (tb) => {
|
1039
1124
|
this.blockElements.push(tb);
|
1040
1125
|
this.setupBlockIO(tb, blockIndex);
|
1041
1126
|
}, class: {
|
@@ -1046,9 +1131,12 @@ const Table = class {
|
|
1046
1131
|
return (h(TableRow, { rowRenderer: this.rowRender, row: row }, this.store.config.state.columns.map((_colModel, colIndex) => (h(TableCell, { rowIndex: rowIndex, colIndex: colIndex })))));
|
1047
1132
|
})) : (h("td", { colSpan: this.store.config.state.columns.length, style: {
|
1048
1133
|
height: this.getBlockHeight(blockIndex),
|
1049
|
-
} }))))),
|
1134
|
+
} }))))), this.showFooter && (h("tfoot", null, h(TableHeadFootRow, { rowRenderer: this.footRender, onColumnPinned: this.handleColumnPinned }, this.store.config.state.columns.map((colModel) => [
|
1050
1135
|
h(TableColHead, { column: colModel, headRenderer: this.footRender, onColumnPinned: this.handleColumnPinned }),
|
1051
|
-
])))))
|
1136
|
+
]))))), !!this.blocks.length && (h("nano-spinner", { type: "circle", class: {
|
1137
|
+
[`${CSSNAMESPACE}__spinner`]: true,
|
1138
|
+
[`${CSSNAMESPACE}__spinner--show`]: this.loading,
|
1139
|
+
} })))));
|
1052
1140
|
}
|
1053
1141
|
get host() { return getElement(this); }
|
1054
1142
|
static get watchers() { return {
|
@@ -1061,4 +1149,4 @@ Table.style = tableCss;
|
|
1061
1149
|
|
1062
1150
|
export { Table as T, createWorker as c };
|
1063
1151
|
|
1064
|
-
//# sourceMappingURL=nano-table-
|
1152
|
+
//# sourceMappingURL=nano-table-930d9245.js.map
|