@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
@@ -5,6 +5,7 @@
|
|
5
5
|
|
6
6
|
const index = require('./index-41582c2a.js');
|
7
7
|
const math = require('./math-a8123703.js');
|
8
|
+
const throttle = require('./throttle-f55496c8.js');
|
8
9
|
const index$1 = require('./index-bb2a6ab8.js');
|
9
10
|
|
10
11
|
const CSSNAMESPACE = 'nano-tbl';
|
@@ -111,7 +112,7 @@ const createWorkerProxy = (worker, workerMsgId, exportedMethod) => (
|
|
111
112
|
})
|
112
113
|
);
|
113
114
|
|
114
|
-
const workerPromise = Promise.resolve().then(function () { return require('./table.worker-
|
115
|
+
const workerPromise = Promise.resolve().then(function () { return require('./table.worker-daf39ca9.js'); }).then(m => m.worker);
|
115
116
|
const createWorkerStore = /*@__PURE__*/createWorkerProxy(workerPromise, 'stencil.table.worker', 'createWorkerStore');
|
116
117
|
const syncConfigToWorker = /*@__PURE__*/createWorkerProxy(workerPromise, 'stencil.table.worker', 'syncConfigToWorker');
|
117
118
|
const syncDataToWorker = /*@__PURE__*/createWorkerProxy(workerPromise, 'stencil.table.worker', 'syncDataToWorker');
|
@@ -130,17 +131,11 @@ function colsToWorker(columns) {
|
|
130
131
|
return safeColumns;
|
131
132
|
}
|
132
133
|
const stores = new WeakMap();
|
133
|
-
async function generateStore(host,
|
134
|
-
// augment data with some internal props
|
135
|
-
rows = rows.map((row, i) => ({
|
136
|
-
...row,
|
137
|
-
__index: i,
|
138
|
-
__uuid: math.cyrb53(Object.values(row).join()),
|
139
|
-
}));
|
134
|
+
async function generateStore(host, columns, scrollParent) {
|
140
135
|
const store = {
|
141
|
-
data: index$1.createStore({ rows }),
|
136
|
+
data: index$1.createStore({ rows: [] }),
|
142
137
|
config: index$1.createStore({ columns }),
|
143
|
-
general: index$1.createStore({ workerId: null }),
|
138
|
+
general: index$1.createStore({ workerId: null, scrollParent, host }),
|
144
139
|
};
|
145
140
|
const id = await createWorkerStore(store.data.state.rows, colsToWorker(store.config.state.columns));
|
146
141
|
store.general.state.workerId = id;
|
@@ -175,9 +170,15 @@ function storeSetData(host, rows) {
|
|
175
170
|
const store = stores.get(host);
|
176
171
|
if (!store)
|
177
172
|
return;
|
178
|
-
|
179
|
-
|
173
|
+
// augment data with some internal props
|
174
|
+
rows = rows.map((row, i) => ({
|
175
|
+
...row,
|
176
|
+
__index: i,
|
177
|
+
__uuid: math.cyrb53(Object.values(row).join()),
|
178
|
+
}));
|
180
179
|
store.data.state.rows = rows;
|
180
|
+
if (store.general.state.workerId)
|
181
|
+
return syncDataToWorker(store.general.state.workerId, rows);
|
181
182
|
}
|
182
183
|
function storeSetConfig(host, columns) {
|
183
184
|
const store = stores.get(host);
|
@@ -332,7 +333,7 @@ function cellRender(rowIndex, colIndex) {
|
|
332
333
|
* @param col - the current column config object
|
333
334
|
* @returns - a JSX node
|
334
335
|
*/
|
335
|
-
function
|
336
|
+
function colheadFootRender(col) {
|
336
337
|
const tpl = col?.colTemplate;
|
337
338
|
return tpl ? (tpl(index.h, col)) : (index.h(index.Fragment, null, col.title));
|
338
339
|
}
|
@@ -359,33 +360,56 @@ const stickyVIOs = new WeakMap();
|
|
359
360
|
function addHObserver(el, pos, cb) {
|
360
361
|
if (stickyHIOs.get(el))
|
361
362
|
return;
|
363
|
+
const store = fetchStores();
|
364
|
+
const root = store.general.state.scrollParent;
|
365
|
+
const host = store.general.state.host;
|
362
366
|
const observer = new IntersectionObserver(([e]) => {
|
363
367
|
const positions = {};
|
364
|
-
if (pos === 'start')
|
365
|
-
positions.start =
|
366
|
-
|
368
|
+
if (pos === 'start') {
|
369
|
+
positions.start =
|
370
|
+
e.boundingClientRect.x -
|
371
|
+
(host.getBoundingClientRect().x + root.scrollLeft) <
|
372
|
+
0 && !e.isIntersecting;
|
373
|
+
}
|
374
|
+
if (pos === 'end') {
|
375
|
+
// TODO - sort these out for RtL
|
367
376
|
positions.end =
|
368
|
-
e.boundingClientRect.
|
377
|
+
e.boundingClientRect.right > e.boundingClientRect.width &&
|
369
378
|
!e.isIntersecting;
|
379
|
+
}
|
370
380
|
cb(positions);
|
371
|
-
}, {
|
381
|
+
}, {
|
382
|
+
threshold: [1],
|
383
|
+
rootMargin: '1px 0px 1px 0px',
|
384
|
+
root: root === document.scrollingElement ? null : root,
|
385
|
+
});
|
372
386
|
stickyHIOs.set(el, observer);
|
373
387
|
requestAnimationFrame(() => observer.observe(el));
|
374
388
|
}
|
375
389
|
function addVObserver(el, pos, cb) {
|
376
390
|
if (stickyVIOs.get(el))
|
377
391
|
return;
|
392
|
+
const store = fetchStores();
|
393
|
+
const root = store.general.state.scrollParent;
|
394
|
+
const host = store.general.state.host;
|
378
395
|
const observer = new IntersectionObserver(([e]) => {
|
379
|
-
console.log(e);
|
380
396
|
const positions = {};
|
381
|
-
if (pos === 'top')
|
382
|
-
positions.top =
|
397
|
+
if (pos === 'top') {
|
398
|
+
positions.top =
|
399
|
+
e.boundingClientRect.y -
|
400
|
+
(host.getBoundingClientRect().y + root.scrollTop) <
|
401
|
+
0 && !e.isIntersecting;
|
402
|
+
}
|
383
403
|
if (pos === 'bottom')
|
384
404
|
positions.bottom =
|
385
405
|
e.boundingClientRect.height > e.intersectionRect.height &&
|
386
406
|
!e.isIntersecting;
|
387
407
|
cb(positions);
|
388
|
-
}, {
|
408
|
+
}, {
|
409
|
+
threshold: [0.99],
|
410
|
+
rootMargin: '0px 100px 0px 100px',
|
411
|
+
root: root === document.scrollingElement ? null : root,
|
412
|
+
});
|
389
413
|
stickyVIOs.set(el, observer);
|
390
414
|
requestAnimationFrame(() => observer.observe(el));
|
391
415
|
}
|
@@ -458,7 +482,7 @@ const TableColHead = ({ column, headRenderer, onColumnOrderClick, onColumnPinned
|
|
458
482
|
default:
|
459
483
|
order = 'asc';
|
460
484
|
}
|
461
|
-
onColumnOrderClick(order, column.prop, e.target.
|
485
|
+
onColumnOrderClick(order, column.prop, e.target.closest('th'));
|
462
486
|
}
|
463
487
|
let extraProps = {};
|
464
488
|
if (column.columnProperties) {
|
@@ -474,7 +498,7 @@ const TableColHead = ({ column, headRenderer, onColumnOrderClick, onColumnPinned
|
|
474
498
|
},
|
475
499
|
};
|
476
500
|
let props = extraProps ? mergeProperties(baseProps, extraProps) : baseProps;
|
477
|
-
const content =
|
501
|
+
const content = colheadFootRender(column);
|
478
502
|
if (!content)
|
479
503
|
return index.h(index.Fragment, null);
|
480
504
|
props =
|
@@ -492,8 +516,11 @@ const TableColHead = ({ column, headRenderer, onColumnOrderClick, onColumnPinned
|
|
492
516
|
if (['top', 'bottom'].includes(headRenderer.pinned))
|
493
517
|
addVObserver(th, headRenderer.pinned, onColumnPinned);
|
494
518
|
} },
|
495
|
-
index.h("button", { class:
|
496
|
-
|
519
|
+
index.h("button", { class: {
|
520
|
+
[`${CSSNAMESPACE}__order-btn`]: true,
|
521
|
+
[`${CSSNAMESPACE}__cell-content`]: true,
|
522
|
+
}, onClick: handleColumnOrderClick },
|
523
|
+
colheadFootRender(column),
|
497
524
|
!!column.filter && index.h("nano-icon", { name: "light/filter" }),
|
498
525
|
!!column.order &&
|
499
526
|
(column.order === 'desc' ? (index.h("nano-icon", { name: "solid/long-arrow-down" })) : (index.h("nano-icon", { name: "solid/long-arrow-up" }))),
|
@@ -506,11 +533,12 @@ const TableColHead = ({ column, headRenderer, onColumnOrderClick, onColumnPinned
|
|
506
533
|
if (['top', 'bottom'].includes(headRenderer.pinned))
|
507
534
|
addVObserver(th, headRenderer.pinned, onColumnPinned);
|
508
535
|
} },
|
509
|
-
|
510
|
-
|
536
|
+
index.h("div", { class: `${CSSNAMESPACE}__cell-content` },
|
537
|
+
colheadFootRender(column),
|
538
|
+
!!column.filter && index.h("nano-icon", { name: "light/bars-filter" }))));
|
511
539
|
};
|
512
|
-
const TableCell = ({ rowIndex, colIndex, }) => {
|
513
|
-
const content = cellRender(rowIndex, colIndex);
|
540
|
+
const TableCell = ({ rowIndex, colIndex, nestedContent, }) => {
|
541
|
+
const content = nestedContent || cellRender(rowIndex, colIndex);
|
514
542
|
if (!content)
|
515
543
|
return index.h(index.Fragment, null);
|
516
544
|
const store = fetchStores();
|
@@ -534,7 +562,8 @@ const TableCell = ({ rowIndex, colIndex, }) => {
|
|
534
562
|
}
|
535
563
|
return (index.h(CellType
|
536
564
|
// role="gridcell"
|
537
|
-
, { ...props },
|
565
|
+
, { ...props },
|
566
|
+
index.h("div", { class: `${CSSNAMESPACE}__cell-content` }, content)));
|
538
567
|
};
|
539
568
|
|
540
569
|
const detectScrollSpeed = (() => {
|
@@ -592,7 +621,7 @@ function isInViewport(el, percentVisible = 100) {
|
|
592
621
|
percentVisible);
|
593
622
|
}
|
594
623
|
|
595
|
-
const tableCss = ":host{box-sizing:border-box}*,*::before,*::after{box-sizing:border-box}[hidden]{display:none !important}nano-table{display:
|
624
|
+
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)}";
|
596
625
|
|
597
626
|
let id = 0;
|
598
627
|
const Table = class {
|
@@ -606,6 +635,9 @@ const Table = class {
|
|
606
635
|
this.nanoTblAfterFilter = index.createEvent(this, "nanoTblAfterFilter", 7);
|
607
636
|
this.nanoTblBeforeSearch = index.createEvent(this, "nanoTblBeforeSearch", 7);
|
608
637
|
this.nanoTblAfterSearch = index.createEvent(this, "nanoTblAfterSearch", 7);
|
638
|
+
this.debounceSetLoading = (l) => {
|
639
|
+
this._loading = l;
|
640
|
+
};
|
609
641
|
this.renderId = 'tbl-' + id++;
|
610
642
|
this.filters = [];
|
611
643
|
this.currentFilters = '';
|
@@ -623,8 +655,10 @@ const Table = class {
|
|
623
655
|
* @returns A promise
|
624
656
|
*/
|
625
657
|
this.sortStart = async (order, column, element) => {
|
658
|
+
// did order change?
|
626
659
|
if (this.currentSort === order + ':' + column)
|
627
660
|
return;
|
661
|
+
this.loading = true;
|
628
662
|
const sortEvent = this.nanoTblBeforeSort.emit({ column: column, order });
|
629
663
|
if (sortEvent.defaultPrevented)
|
630
664
|
return;
|
@@ -649,10 +683,13 @@ const Table = class {
|
|
649
683
|
console.warn('sort failed', e);
|
650
684
|
this.currentSort = '';
|
651
685
|
}
|
686
|
+
finally {
|
687
|
+
this.loading = false;
|
688
|
+
}
|
652
689
|
};
|
653
690
|
/**
|
654
|
-
* Attaches an intersection observer to each rendered tbody
|
655
|
-
* shows / hides intersecting blocks' and sets heights for when
|
691
|
+
* Attaches an intersection observer to each rendered tbody element
|
692
|
+
* shows / hides intersecting blocks' and sets heights for when they're hidden
|
656
693
|
* @param el - the tbody element to observe
|
657
694
|
* @param blockIndex - the rendering tbody we're attaching the IO to
|
658
695
|
*/
|
@@ -667,8 +704,8 @@ const Table = class {
|
|
667
704
|
// The Intersection Observer (IO) fires in an incorrect order when the scrolling is very fast
|
668
705
|
// i.e. we go past blocks 3, 2, 1 and land on 0, but 3 can fire as 'intersecting' after 0.
|
669
706
|
// To fix that, we check - for realsies - if the block IS visible.
|
670
|
-
// BUT that test is not as sensitive to a block being visible
|
671
|
-
// so doesn't always fire if scrolling
|
707
|
+
// BUT that test is not as sensitive to a block being visible via the IO,
|
708
|
+
// so doesn't always fire if scrolling slowly
|
672
709
|
// *sigh*
|
673
710
|
index.readTask(() => {
|
674
711
|
if (this.scrollSpeed < 100 || isInViewport(el, 0.01)) {
|
@@ -685,7 +722,12 @@ const Table = class {
|
|
685
722
|
}
|
686
723
|
});
|
687
724
|
}
|
688
|
-
}, {
|
725
|
+
}, {
|
726
|
+
threshold: [0],
|
727
|
+
root: this.scrollParent === document.scrollingElement
|
728
|
+
? null
|
729
|
+
: this.scrollParent,
|
730
|
+
});
|
689
731
|
blockIo.observe(el);
|
690
732
|
this.blockIos.set(el, blockIo);
|
691
733
|
};
|
@@ -697,7 +739,9 @@ const Table = class {
|
|
697
739
|
this.type = 'table';
|
698
740
|
this.caption = undefined;
|
699
741
|
this.showCaption = false;
|
700
|
-
this.
|
742
|
+
this._loading = true;
|
743
|
+
this.placeholderSize = 5;
|
744
|
+
this.rows = undefined;
|
701
745
|
this.columns = [];
|
702
746
|
this.headRender = { pinned: 'top' };
|
703
747
|
this.rowRender = undefined;
|
@@ -710,9 +754,29 @@ const Table = class {
|
|
710
754
|
this.blocks = [];
|
711
755
|
this.activeBlocks = [0, 1, 2];
|
712
756
|
this.measureHeight = 0;
|
757
|
+
this.debounceSetLoading = throttle.debounce(this.debounceSetLoading.bind(this), 50);
|
758
|
+
}
|
759
|
+
/** Will show a loading state when true.
|
760
|
+
* Will be shown automatically if `rows` is a promise waiting to resolve
|
761
|
+
* or when performing custom filtering or sorting */
|
762
|
+
get loading() {
|
763
|
+
return this._loading;
|
764
|
+
}
|
765
|
+
set loading(l) {
|
766
|
+
this.debounceSetLoading(l);
|
713
767
|
}
|
714
768
|
handleRowsChange() {
|
715
|
-
|
769
|
+
if (!this.rows)
|
770
|
+
return;
|
771
|
+
this.loading = true;
|
772
|
+
Promise.resolve(this.rows).then(async (rows) => {
|
773
|
+
await storeSetData(this.host, rows);
|
774
|
+
if (!this.isReady) {
|
775
|
+
await this.columnInit();
|
776
|
+
this.setInitialBlockDimension();
|
777
|
+
}
|
778
|
+
this.loading = false;
|
779
|
+
});
|
716
780
|
}
|
717
781
|
handleColsChange() {
|
718
782
|
storeSetConfig(this.host, this.columns);
|
@@ -760,6 +824,8 @@ const Table = class {
|
|
760
824
|
}
|
761
825
|
// uses the first 'tr' of an active block as our yard stick
|
762
826
|
set measureEle(el) {
|
827
|
+
if (!el)
|
828
|
+
return;
|
763
829
|
this.measureHeight = el.getBoundingClientRect().height;
|
764
830
|
this.unitHeight =
|
765
831
|
el.querySelector('tr')?.getBoundingClientRect().height || this.unitHeight;
|
@@ -806,6 +872,7 @@ const Table = class {
|
|
806
872
|
this.nanoTblAfterSort.emit({ column: column, order });
|
807
873
|
}
|
808
874
|
async searchStart() {
|
875
|
+
this.loading = true;
|
809
876
|
const sortEvent = this.nanoTblBeforeSearch.emit({ term: this.searchTerm });
|
810
877
|
if (sortEvent.defaultPrevented)
|
811
878
|
return;
|
@@ -815,7 +882,12 @@ const Table = class {
|
|
815
882
|
await storeSearch(this.host, this.searchTerm);
|
816
883
|
this.nanoTblAfterSearch.emit({ term: this.searchTerm });
|
817
884
|
}
|
818
|
-
catch (e) {
|
885
|
+
catch (e) {
|
886
|
+
console.warn('search failed', e);
|
887
|
+
}
|
888
|
+
finally {
|
889
|
+
this.loading = false;
|
890
|
+
}
|
819
891
|
}
|
820
892
|
async filterStart(filters, additive = true) {
|
821
893
|
if (filters) {
|
@@ -831,6 +903,7 @@ const Table = class {
|
|
831
903
|
}
|
832
904
|
if (this.currentFilters === JSON.stringify(this.filters))
|
833
905
|
return;
|
906
|
+
this.loading = true;
|
834
907
|
const sortEvent = this.nanoTblBeforeFilter.emit({ filters: this.filters });
|
835
908
|
if (sortEvent.defaultPrevented)
|
836
909
|
return;
|
@@ -852,7 +925,12 @@ const Table = class {
|
|
852
925
|
await storeFilter(this.host, this.filters);
|
853
926
|
this.filterComplete();
|
854
927
|
}
|
855
|
-
catch (e) {
|
928
|
+
catch (e) {
|
929
|
+
console.warn('filter failed', e);
|
930
|
+
}
|
931
|
+
finally {
|
932
|
+
this.loading = false;
|
933
|
+
}
|
856
934
|
}
|
857
935
|
filterComplete() {
|
858
936
|
this.columns = this.columns.map((c) => {
|
@@ -866,16 +944,20 @@ const Table = class {
|
|
866
944
|
/** Scrolls to the top immediately - used whilst sorting / filtering */
|
867
945
|
scrollToTop(element) {
|
868
946
|
const scrollBehaviour = this.scrollParent.style?.scrollBehavior;
|
947
|
+
const scrollX = this.scrollParent.scrollLeft;
|
869
948
|
this.scrollParent.style.scrollBehavior = 'auto';
|
870
|
-
this.
|
949
|
+
if (this.topAnchorEle && !isInViewport(this.topAnchorEle, 0.1))
|
950
|
+
this.topAnchorEle.scrollIntoView();
|
871
951
|
if (element)
|
872
|
-
element.scrollIntoView();
|
952
|
+
element.scrollIntoView({ block: 'start' });
|
953
|
+
if (scrollX)
|
954
|
+
this.scrollParent.scrollLeft = scrollX;
|
873
955
|
if (scrollBehaviour)
|
874
956
|
this.scrollParent.style.scrollBehavior = scrollBehaviour;
|
875
957
|
}
|
876
958
|
setMeasureElement() {
|
877
959
|
index.readTask(() => {
|
878
|
-
this.measureEle = this.blockElements.find((b) => !b
|
960
|
+
this.measureEle = this.blockElements.find((b) => !b?.classList?.contains(`${CSSNAMESPACE}__inactive`));
|
879
961
|
});
|
880
962
|
}
|
881
963
|
/**
|
@@ -900,11 +982,6 @@ const Table = class {
|
|
900
982
|
}
|
901
983
|
if (i === this.blockElements.length - 1)
|
902
984
|
resolve();
|
903
|
-
// const heightGuess = this.getBlockHeight(this.blockElements.indexOf(el));
|
904
|
-
// writeTask(() => {
|
905
|
-
// el.style.height = heightGuess;
|
906
|
-
// if (i === this.blockElements.length - 1) resolve();
|
907
|
-
// });
|
908
985
|
});
|
909
986
|
});
|
910
987
|
});
|
@@ -988,8 +1065,8 @@ const Table = class {
|
|
988
1065
|
if (!el)
|
989
1066
|
return;
|
990
1067
|
const height = el.getBoundingClientRect().height;
|
991
|
-
// cache height to our block heights
|
992
|
-
//
|
1068
|
+
// cache height to our block heights array
|
1069
|
+
// for subsequent renders
|
993
1070
|
const fBhI = this.blockHeights.findIndex((bh) => bh.blockIndex === blockIndex);
|
994
1071
|
if (fBhI > 0) {
|
995
1072
|
this.blockHeights[fBhI] = { height, blockIndex };
|
@@ -1008,8 +1085,8 @@ const Table = class {
|
|
1008
1085
|
}
|
1009
1086
|
// Component lifecycle
|
1010
1087
|
async componentWillLoad() {
|
1011
|
-
this.store = await generateStore(this.host, this.
|
1012
|
-
await this.
|
1088
|
+
this.store = await generateStore(this.host, this.columns, this.scrollParent);
|
1089
|
+
await this.handleRowsChange();
|
1013
1090
|
this.processSlots();
|
1014
1091
|
this.setBlocks();
|
1015
1092
|
this.store.data.onChange('rows', () => this.setBlocks());
|
@@ -1035,9 +1112,17 @@ const Table = class {
|
|
1035
1112
|
}
|
1036
1113
|
render() {
|
1037
1114
|
this.blockElements = [];
|
1038
|
-
return (index.h(index.Host, null, index.h("div", {
|
1115
|
+
return (index.h(index.Host, null, index.h("div", { class: `${CSSNAMESPACE}__top-anchor`, ref: (a) => (this.topAnchorEle = a) }, "\u00A0"), index.h("div", { "aria-labelledby": 'table-caption-' + this.renderId, tabindex: this.type === 'grid' ? '0' : undefined }, index.h("nano-progress-bar", { indeterminate: true, class: {
|
1116
|
+
[`${CSSNAMESPACE}__progress-bar`]: true,
|
1117
|
+
[`${CSSNAMESPACE}__progress-bar--show`]: this.loading,
|
1118
|
+
} }), index.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) }, index.h("caption", { class: {
|
1119
|
+
[`${CSSNAMESPACE}__caption`]: true,
|
1120
|
+
[`${CSSNAMESPACE}__caption--hide`]: !this.showCaption,
|
1121
|
+
}, id: 'table-caption-' + this.renderId }, index.h("slot", { name: "caption" }, this.caption)), index.h("thead", null, index.h(TableHeadFootRow, { rowRenderer: this.headRender, onColumnPinned: this.handleColumnPinned }, this.store.config.state.columns.map((colModel) => [
|
1039
1122
|
index.h(TableColHead, { column: colModel, headRenderer: this.headRender, onColumnOrderClick: this.sortStart, onColumnPinned: this.handleColumnPinned }),
|
1040
|
-
]))), this.
|
1123
|
+
]))), this.loading &&
|
1124
|
+
!this.blocks.length &&
|
1125
|
+
[...Array(10).keys()].map((rowIndex) => (index.h("tr", null, this.store.config.state.columns.map((_colModel, colIndex) => (index.h(TableCell, { rowIndex: rowIndex, colIndex: colIndex, nestedContent: index.h("nano-skeleton", null) })))))), this.blocks.map((block, blockIndex) => (index.h("tbody", { key: block.__uuid, id: `tbody-${this.renderId}-${blockIndex}`, ref: (tb) => {
|
1041
1126
|
this.blockElements.push(tb);
|
1042
1127
|
this.setupBlockIO(tb, blockIndex);
|
1043
1128
|
}, class: {
|
@@ -1048,9 +1133,12 @@ const Table = class {
|
|
1048
1133
|
return (index.h(TableRow, { rowRenderer: this.rowRender, row: row }, this.store.config.state.columns.map((_colModel, colIndex) => (index.h(TableCell, { rowIndex: rowIndex, colIndex: colIndex })))));
|
1049
1134
|
})) : (index.h("td", { colSpan: this.store.config.state.columns.length, style: {
|
1050
1135
|
height: this.getBlockHeight(blockIndex),
|
1051
|
-
} }))))),
|
1136
|
+
} }))))), this.showFooter && (index.h("tfoot", null, index.h(TableHeadFootRow, { rowRenderer: this.footRender, onColumnPinned: this.handleColumnPinned }, this.store.config.state.columns.map((colModel) => [
|
1052
1137
|
index.h(TableColHead, { column: colModel, headRenderer: this.footRender, onColumnPinned: this.handleColumnPinned }),
|
1053
|
-
])))))
|
1138
|
+
]))))), !!this.blocks.length && (index.h("nano-spinner", { type: "circle", class: {
|
1139
|
+
[`${CSSNAMESPACE}__spinner`]: true,
|
1140
|
+
[`${CSSNAMESPACE}__spinner--show`]: this.loading,
|
1141
|
+
} })))));
|
1054
1142
|
}
|
1055
1143
|
get host() { return index.getElement(this); }
|
1056
1144
|
static get watchers() { return {
|
@@ -1064,4 +1152,4 @@ Table.style = tableCss;
|
|
1064
1152
|
exports.Table = Table;
|
1065
1153
|
exports.createWorker = createWorker;
|
1066
1154
|
|
1067
|
-
//# sourceMappingURL=nano-table-
|
1155
|
+
//# sourceMappingURL=nano-table-7e02106c.js.map
|