@nanoporetech-digital/components 3.5.1 → 3.7.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 +31 -0
- package/dist/cjs/{date-utils-c581f187.js → date-utils-42fbcb42.js} +5 -3
- package/dist/cjs/date-utils-42fbcb42.js.map +1 -0
- package/dist/cjs/index-41582c2a.js +2 -6
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/nano-components.cjs.js +1 -1
- package/dist/cjs/nano-datalist_3.cjs.entry.js +10 -5
- package/dist/cjs/nano-datalist_3.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-date-input.cjs.entry.js +1 -1
- package/dist/cjs/nano-date-picker.cjs.entry.js +1 -1
- package/dist/cjs/nano-demo.cjs.entry.js +3 -2
- package/dist/cjs/nano-demo.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-dropdown.cjs.entry.js +5 -2
- package/dist/cjs/nano-dropdown.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-file-upload.cjs.entry.js +4 -0
- package/dist/cjs/nano-file-upload.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-global-nav-user-profile_3.cjs.entry.js +1 -2
- package/dist/cjs/nano-global-nav-user-profile_3.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-icon-button.cjs.entry.js +1 -1
- package/dist/cjs/nano-icon-button.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-icon.cjs.entry.js.map +1 -1
- package/dist/cjs/{nano-tooltip.cjs.entry.js → nano-progress-bar_2.cjs.entry.js} +28 -4
- package/dist/cjs/nano-progress-bar_2.cjs.entry.js.map +1 -0
- package/dist/cjs/nano-resize-observe_2.cjs.entry.js +74 -12
- package/dist/cjs/nano-resize-observe_2.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-sticker.cjs.entry.js +2 -0
- package/dist/cjs/nano-sticker.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-tab-group.cjs.entry.js +1 -1
- package/dist/cjs/nano-tab-group.cjs.entry.js.map +1 -1
- package/dist/cjs/{nano-table-067e0c12.js → nano-table-56eb29c1.js} +172 -88
- package/dist/cjs/nano-table-56eb29c1.js.map +1 -0
- package/dist/cjs/nano-table.cjs.entry.js +1 -1
- package/dist/cjs/{table.worker-a4d75c46.js → table.worker-b1c53001.js} +3 -3
- package/dist/cjs/table.worker-b1c53001.js.map +1 -0
- package/dist/{esm/table.worker-e9fb087e.js → cjs/table.worker-e2f9ccfa.js} +1 -1
- package/dist/collection/components/datalist/datalist.js +3 -3
- package/dist/collection/components/datalist/datalist.js.map +1 -1
- package/dist/collection/components/demo/demo.js +3 -2
- package/dist/collection/components/demo/demo.js.map +1 -1
- package/dist/collection/components/dropdown/dropdown.js +5 -2
- package/dist/collection/components/dropdown/dropdown.js.map +1 -1
- package/dist/collection/components/file-upload/file-upload.js +4 -0
- package/dist/collection/components/file-upload/file-upload.js.map +1 -1
- package/dist/collection/components/icon/icon.js +1 -1
- package/dist/collection/components/icon/icon.js.map +1 -1
- package/dist/collection/components/icon-button/icon-button.js +1 -1
- package/dist/collection/components/icon-button/icon-button.js.map +1 -1
- package/dist/collection/components/menu/menu.js +8 -3
- package/dist/collection/components/menu/menu.js.map +1 -1
- package/dist/collection/components/nav-item/nav-item.js +1 -2
- package/dist/collection/components/nav-item/nav-item.js.map +1 -1
- package/dist/collection/components/resize-observe/resize-observe.js +118 -14
- package/dist/collection/components/resize-observe/resize-observe.js.map +1 -1
- package/dist/collection/components/sticker/sticker.js +2 -0
- package/dist/collection/components/sticker/sticker.js.map +1 -1
- package/dist/collection/components/table/table-interface.js.map +1 -1
- package/dist/collection/components/table/table.cell.js +10 -5
- package/dist/collection/components/table/table.cell.js.map +1 -1
- package/dist/collection/components/table/table.css +9 -23
- package/dist/collection/components/table/table.js +236 -93
- package/dist/collection/components/table/table.js.map +1 -1
- package/dist/collection/components/table/table.row.js +19 -12
- package/dist/collection/components/table/table.row.js.map +1 -1
- package/dist/collection/components/table/table.store.js +1 -1
- package/dist/collection/components/table/table.store.js.map +1 -1
- package/dist/collection/components/table/table.utils.js +4 -4
- package/dist/collection/components/table/table.utils.js.map +1 -1
- package/dist/collection/components/table/table.worker.js +8 -0
- package/dist/collection/components/table/table.worker.js.map +1 -1
- package/dist/collection/components/tabs/tab-group.js +1 -1
- package/dist/collection/components/tabs/tab-group.js.map +1 -1
- package/dist/collection/components/tooltip/tooltip.js +25 -3
- package/dist/collection/components/tooltip/tooltip.js.map +1 -1
- package/dist/collection/utils/date-utils.js +4 -2
- package/dist/collection/utils/date-utils.js.map +1 -1
- package/dist/collection/utils/testing/index.js +15 -8
- package/dist/collection/utils/testing/index.js.map +1 -1
- package/dist/components/datalist.js +3 -3
- package/dist/components/datalist.js.map +1 -1
- package/dist/components/date-picker.js +4 -2
- package/dist/components/date-picker.js.map +1 -1
- package/dist/components/dropdown.js +5 -2
- package/dist/components/dropdown.js.map +1 -1
- package/dist/components/icon-button.js +1 -1
- package/dist/components/icon-button.js.map +1 -1
- package/dist/components/icon.js.map +1 -1
- package/dist/components/menu.js +8 -3
- package/dist/components/menu.js.map +1 -1
- package/dist/components/nano-demo.js +21 -14
- package/dist/components/nano-demo.js.map +1 -1
- package/dist/components/nano-file-upload.js +4 -0
- package/dist/components/nano-file-upload.js.map +1 -1
- package/dist/components/nano-tab-group.js +1 -1
- package/dist/components/nano-tab-group.js.map +1 -1
- package/dist/components/nav-item.js +1 -2
- package/dist/components/nav-item.js.map +1 -1
- package/dist/components/resize-observe.js +80 -14
- package/dist/components/resize-observe.js.map +1 -1
- package/dist/components/sticker.js +2 -0
- package/dist/components/sticker.js.map +1 -1
- package/dist/components/table.js +196 -103
- package/dist/components/table.js.map +1 -1
- package/dist/components/table.worker.js +1 -1
- package/dist/components/tooltip.js +6 -3
- package/dist/components/tooltip.js.map +1 -1
- package/dist/custom-elements/index.js +285 -120
- package/dist/custom-elements/index.js.map +1 -1
- package/dist/esm/{date-utils-bb82b123.js → date-utils-6b7a6e1f.js} +5 -3
- package/dist/esm/date-utils-6b7a6e1f.js.map +1 -0
- package/dist/esm/index-3c280603.js +2 -6
- package/dist/esm/loader.js +1 -1
- package/dist/esm/nano-components.js +1 -1
- package/dist/esm/nano-datalist_3.entry.js +10 -5
- package/dist/esm/nano-datalist_3.entry.js.map +1 -1
- package/dist/esm/nano-date-input.entry.js +1 -1
- package/dist/esm/nano-date-picker.entry.js +1 -1
- package/dist/esm/nano-demo.entry.js +3 -2
- package/dist/esm/nano-demo.entry.js.map +1 -1
- package/dist/esm/nano-dropdown.entry.js +5 -2
- package/dist/esm/nano-dropdown.entry.js.map +1 -1
- package/dist/esm/nano-file-upload.entry.js +4 -0
- package/dist/esm/nano-file-upload.entry.js.map +1 -1
- package/dist/esm/nano-global-nav-user-profile_3.entry.js +1 -2
- package/dist/esm/nano-global-nav-user-profile_3.entry.js.map +1 -1
- package/dist/esm/nano-icon-button.entry.js +1 -1
- package/dist/esm/nano-icon-button.entry.js.map +1 -1
- package/dist/esm/nano-icon.entry.js.map +1 -1
- package/dist/esm/{nano-tooltip.entry.js → nano-progress-bar_2.entry.js} +29 -6
- package/dist/esm/nano-progress-bar_2.entry.js.map +1 -0
- package/dist/esm/nano-resize-observe_2.entry.js +74 -12
- package/dist/esm/nano-resize-observe_2.entry.js.map +1 -1
- package/dist/esm/nano-sticker.entry.js +2 -0
- package/dist/esm/nano-sticker.entry.js.map +1 -1
- package/dist/esm/nano-tab-group.entry.js +1 -1
- package/dist/esm/nano-tab-group.entry.js.map +1 -1
- package/dist/esm/{nano-table-95921f46.js → nano-table-38f3c797.js} +172 -88
- package/dist/esm/nano-table-38f3c797.js.map +1 -0
- package/dist/esm/nano-table.entry.js +1 -1
- package/dist/{nano-components/p-e9fb087e.js → esm/table.worker-e2f9ccfa.js} +1 -1
- package/dist/esm/{table.worker-769f1441.js → table.worker-e57fffd8.js} +3 -3
- package/dist/esm/table.worker-e57fffd8.js.map +1 -0
- 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-0b29b22c.js +5 -0
- package/dist/nano-components/{p-26905bca.js.map → p-0b29b22c.js.map} +0 -0
- package/dist/nano-components/p-135fed16.entry.js +5 -0
- package/dist/nano-components/p-135fed16.entry.js.map +1 -0
- package/dist/nano-components/{p-2cb4615b.entry.js → p-2a97ef51.entry.js} +2 -2
- package/dist/nano-components/{p-2cb4615b.entry.js.map → p-2a97ef51.entry.js.map} +0 -0
- package/dist/nano-components/{p-751927d1.entry.js → p-3f25fc76.entry.js} +2 -2
- package/dist/nano-components/p-3f25fc76.entry.js.map +1 -0
- package/dist/nano-components/p-5d149792.entry.js +5 -0
- package/dist/nano-components/p-5d149792.entry.js.map +1 -0
- package/dist/nano-components/p-69e5a37d.entry.js.map +1 -1
- package/dist/nano-components/p-6ad194e4.entry.js +5 -0
- package/dist/nano-components/p-6ad194e4.entry.js.map +1 -0
- package/dist/nano-components/{p-46b348b7.entry.js → p-6cb77d5c.entry.js} +2 -2
- package/dist/nano-components/{p-46b348b7.entry.js.map → p-6cb77d5c.entry.js.map} +0 -0
- package/dist/nano-components/{p-85cfb0af.entry.js → p-9a4297e1.entry.js} +2 -2
- package/dist/nano-components/p-9a4297e1.entry.js.map +1 -0
- package/dist/nano-components/{p-d1c8eca4.entry.js → p-b55ffa92.entry.js} +2 -2
- package/dist/nano-components/p-b55ffa92.entry.js.map +1 -0
- package/dist/nano-components/{p-fb12a45d.entry.js → p-ba9cd047.entry.js} +2 -2
- package/dist/nano-components/{p-fb12a45d.entry.js.map → p-ba9cd047.entry.js.map} +0 -0
- package/dist/nano-components/p-cc5e7acb.entry.js +5 -0
- package/dist/nano-components/p-cc5e7acb.entry.js.map +1 -0
- package/dist/nano-components/p-cecb9af1.js +5 -0
- package/dist/nano-components/p-cecb9af1.js.map +1 -0
- package/dist/nano-components/p-d26b97d1.js +5 -0
- package/dist/nano-components/p-d26b97d1.js.map +1 -0
- package/dist/nano-components/{p-601e18d5.entry.js → p-d5303933.entry.js} +2 -2
- package/dist/nano-components/p-d5303933.entry.js.map +1 -0
- package/dist/nano-components/{p-4f0e14b5.entry.js → p-d565991d.entry.js} +2 -2
- package/dist/nano-components/p-d565991d.entry.js.map +1 -0
- package/dist/nano-components/{p-244223f0.entry.js → p-dc50b93c.entry.js} +2 -2
- package/dist/nano-components/p-dc50b93c.entry.js.map +1 -0
- package/dist/{cjs/table.worker-e9fb087e.js → nano-components/p-e2f9ccfa.js} +1 -1
- package/dist/types/components/icon/icon.d.ts +1 -1
- package/dist/types/components/menu/menu.d.ts +1 -0
- package/dist/types/components/resize-observe/resize-observe.d.ts +20 -1
- package/dist/types/components/table/table-interface.d.ts +35 -24
- package/dist/types/components/table/table.cell.d.ts +1 -1
- package/dist/types/components/table/table.d.ts +49 -15
- package/dist/types/components/table/table.row.d.ts +1 -1
- package/dist/types/components/table/table.store.d.ts +1 -1
- package/dist/types/components/table/table.utils.d.ts +1 -1
- package/dist/types/components/table/table.worker.d.ts +3 -3
- package/dist/types/components/tooltip/tooltip.d.ts +5 -0
- package/dist/types/components.d.ts +59 -14
- package/dist/types/utils/date-utils.d.ts +1 -1
- package/docs-json.json +179 -31
- package/docs-vscode.json +26 -3
- package/package.json +2 -2
- package/dist/cjs/date-utils-c581f187.js.map +0 -1
- package/dist/cjs/nano-progress-bar.cjs.entry.js +0 -33
- package/dist/cjs/nano-progress-bar.cjs.entry.js.map +0 -1
- package/dist/cjs/nano-table-067e0c12.js.map +0 -1
- package/dist/cjs/nano-tooltip.cjs.entry.js.map +0 -1
- package/dist/cjs/table.worker-a4d75c46.js.map +0 -1
- package/dist/esm/date-utils-bb82b123.js.map +0 -1
- package/dist/esm/nano-progress-bar.entry.js +0 -29
- package/dist/esm/nano-progress-bar.entry.js.map +0 -1
- package/dist/esm/nano-table-95921f46.js.map +0 -1
- package/dist/esm/nano-tooltip.entry.js.map +0 -1
- package/dist/esm/table.worker-769f1441.js.map +0 -1
- package/dist/nano-components/p-15a60f7e.js +0 -5
- package/dist/nano-components/p-15a60f7e.js.map +0 -1
- package/dist/nano-components/p-244223f0.entry.js.map +0 -1
- package/dist/nano-components/p-26905bca.js +0 -5
- package/dist/nano-components/p-4f0e14b5.entry.js.map +0 -1
- package/dist/nano-components/p-601e18d5.entry.js.map +0 -1
- package/dist/nano-components/p-751927d1.entry.js.map +0 -1
- package/dist/nano-components/p-85cfb0af.entry.js.map +0 -1
- package/dist/nano-components/p-8fc2a38d.js +0 -5
- package/dist/nano-components/p-8fc2a38d.js.map +0 -1
- package/dist/nano-components/p-9e8c9bac.entry.js +0 -5
- package/dist/nano-components/p-9e8c9bac.entry.js.map +0 -1
- package/dist/nano-components/p-a2e38472.entry.js +0 -5
- package/dist/nano-components/p-a2e38472.entry.js.map +0 -1
- package/dist/nano-components/p-b9c8b99f.entry.js +0 -5
- package/dist/nano-components/p-b9c8b99f.entry.js.map +0 -1
- package/dist/nano-components/p-d1c8eca4.entry.js.map +0 -1
- package/dist/nano-components/p-f43d1d8e.entry.js +0 -5
- package/dist/nano-components/p-f43d1d8e.entry.js.map +0 -1
- package/dist/nano-components/p-feb9f164.entry.js +0 -5
- package/dist/nano-components/p-feb9f164.entry.js.map +0 -1
@@ -112,7 +112,7 @@ const createWorkerProxy = (worker, workerMsgId, exportedMethod) => (
|
|
112
112
|
})
|
113
113
|
);
|
114
114
|
|
115
|
-
const workerPromise = Promise.resolve().then(function () { return require('./table.worker-
|
115
|
+
const workerPromise = Promise.resolve().then(function () { return require('./table.worker-b1c53001.js'); }).then(m => m.worker);
|
116
116
|
const createWorkerStore = /*@__PURE__*/createWorkerProxy(workerPromise, 'stencil.table.worker', 'createWorkerStore');
|
117
117
|
const syncConfigToWorker = /*@__PURE__*/createWorkerProxy(workerPromise, 'stencil.table.worker', 'syncConfigToWorker');
|
118
118
|
const syncDataToWorker = /*@__PURE__*/createWorkerProxy(workerPromise, 'stencil.table.worker', 'syncDataToWorker');
|
@@ -210,7 +210,7 @@ function storeSetData(host, rows) {
|
|
210
210
|
row[colName] = Number(coerceDate);
|
211
211
|
});
|
212
212
|
row['__index'] = i;
|
213
|
-
row['__uuid'] = math.cyrb53(
|
213
|
+
row['__uuid'] = math.cyrb53(cols.map((c) => row[c.prop]).join());
|
214
214
|
return row;
|
215
215
|
});
|
216
216
|
store.data.state.rows = rows;
|
@@ -272,7 +272,7 @@ function colDataModel(rowIndex, colIndex) {
|
|
272
272
|
const column = columns[colIndex];
|
273
273
|
const prop = column?.prop;
|
274
274
|
const rowModel = rows[rowIndex];
|
275
|
-
const cellModel = rowModel[columns[colIndex].prop];
|
275
|
+
const cellModel = rowModel ? rowModel[columns[colIndex].prop] : '';
|
276
276
|
return {
|
277
277
|
prop,
|
278
278
|
cellModel,
|
@@ -289,9 +289,9 @@ function colDataModel(rowIndex, colIndex) {
|
|
289
289
|
function rowDataModel(rowIndex) {
|
290
290
|
const store = fetchStores();
|
291
291
|
const rows = store.data.state.rows;
|
292
|
-
const
|
292
|
+
const rowModel = rows[rowIndex];
|
293
293
|
return {
|
294
|
-
|
294
|
+
rowModel,
|
295
295
|
rowIndex,
|
296
296
|
};
|
297
297
|
}
|
@@ -358,7 +358,7 @@ function mergeCellProperties(rowIndex, colIndex, defaultProps) {
|
|
358
358
|
* @returns - a JSX node
|
359
359
|
*/
|
360
360
|
function colheadFootRender(col) {
|
361
|
-
const tpl = col?.
|
361
|
+
const tpl = col?.columnTemplate;
|
362
362
|
return tpl ? (tpl(index.h, col)) : (index.h(index.Fragment, null, col.title));
|
363
363
|
}
|
364
364
|
const stickyHIOs = new WeakMap();
|
@@ -721,7 +721,7 @@ function cellRender(rowIndex, colIndex) {
|
|
721
721
|
: d;
|
722
722
|
}
|
723
723
|
}
|
724
|
-
return tpl ? (tpl(index.h, model)) : (index.h(index.Fragment, null, model.cellModel?.toString()));
|
724
|
+
return tpl ? (tpl(index.h, model)) : model.cellModel ? (index.h(index.Fragment, null, model.cellModel?.toString())) : ('');
|
725
725
|
}
|
726
726
|
const baseCellClasses = (colIndex, toString = false) => {
|
727
727
|
const store = fetchStores();
|
@@ -738,9 +738,9 @@ const baseCellClasses = (colIndex, toString = false) => {
|
|
738
738
|
return classes;
|
739
739
|
};
|
740
740
|
const TableCell = ({ rowIndex, colIndex, nestedContent, }) => {
|
741
|
-
const
|
742
|
-
|
743
|
-
|
741
|
+
const Content = () => nestedContent
|
742
|
+
? nestedContent()
|
743
|
+
: cellRender(rowIndex, colIndex) || (index.h("span", { class: "placeholder" }, "\u00A0"));
|
744
744
|
let CellType = 'td';
|
745
745
|
const store = fetchStores();
|
746
746
|
const column = store.config.state.columns[colIndex];
|
@@ -754,24 +754,37 @@ const TableCell = ({ rowIndex, colIndex, nestedContent, }) => {
|
|
754
754
|
: { ...props, scope: 'row' };
|
755
755
|
CellType = 'th';
|
756
756
|
}
|
757
|
+
const ContentWrap = (props) => (index.h("div", { ...props, class: {
|
758
|
+
[`${CSSNAMESPACE}__cell-content`]: true,
|
759
|
+
[`${CSSNAMESPACE}__cell-content--wrap`]: !!column.wrap,
|
760
|
+
} },
|
761
|
+
index.h(Content, null)));
|
757
762
|
return (index.h(CellType
|
758
763
|
// role="gridcell"
|
759
|
-
, { ...props },
|
760
|
-
|
764
|
+
, { ...props }, column.autoTooltip && !column.wrap ? (index.h("nano-resize-observe", { notifyContentFit: "x", onNanoResizeContentFitChange: (e) => (e.target.firstElementChild.disabled =
|
765
|
+
e.detail.x) },
|
766
|
+
index.h("nano-tooltip", { disabled: true, hoist: true },
|
767
|
+
index.h(ContentWrap, null),
|
768
|
+
index.h("span", { slot: "content" },
|
769
|
+
index.h(Content, null))))) : (index.h(ContentWrap, null))));
|
761
770
|
};
|
762
771
|
|
763
|
-
const TableRow = ({ rowRenderer, rowIndex,
|
772
|
+
const TableRow = ({ rowRenderer, rowIndex, rowModel, onColumnPinned }, children, utils) => {
|
764
773
|
let extraProps = {};
|
765
|
-
const TableCell = ({ header }, children) => {
|
766
|
-
const cell = index.h("div", { class:
|
774
|
+
const TableCell = ({ header, wrap }, children) => {
|
775
|
+
const cell = (index.h("div", { class: {
|
776
|
+
[`${CSSNAMESPACE}__cell-content`]: true,
|
777
|
+
[`${CSSNAMESPACE}__cell-content--wrap`]: wrap,
|
778
|
+
} }, children));
|
767
779
|
return header ? index.h("th", { scope: "row" }, cell) : index.h("td", null, cell);
|
768
780
|
};
|
769
|
-
if (!
|
781
|
+
if (!rowModel) {
|
770
782
|
const model = rowDataModel(rowIndex);
|
771
|
-
|
783
|
+
rowModel = model.rowModel;
|
772
784
|
}
|
773
785
|
if (rowRenderer?.rowProperties) {
|
774
|
-
extraProps =
|
786
|
+
extraProps =
|
787
|
+
rowRenderer.rowProperties({ rowModel, rowIndex }) || extraProps;
|
775
788
|
}
|
776
789
|
let pinned;
|
777
790
|
if (rowRenderer?.pinned && typeof rowRenderer.pinned === 'function') {
|
@@ -782,15 +795,15 @@ const TableRow = ({ rowRenderer, rowIndex, row, onColumnPinned }, children, util
|
|
782
795
|
const tpl = rowRenderer?.template;
|
783
796
|
if (tpl) {
|
784
797
|
let toRender = tpl(index.h, {
|
785
|
-
renderedRow: (index.h("tr", { ...props, key:
|
786
|
-
|
798
|
+
renderedRow: (index.h("tr", { ...props, key: rowModel.__uuid }, children)),
|
799
|
+
rowModel,
|
787
800
|
rowIndex,
|
788
801
|
}, TableCell);
|
789
802
|
if (Array.isArray(toRender)) {
|
790
803
|
toRender = utils.map(toRender, (node, i) => {
|
791
804
|
if (node.vtag === 'tr') {
|
792
805
|
if (!node.vkey)
|
793
|
-
node.vkey = `${
|
806
|
+
node.vkey = `${rowModel.__uuid}_${i}`;
|
794
807
|
node.vattrs = mergeProperties({ class: headerPinClasses('tr', pinned, true) }, node.vattrs);
|
795
808
|
if (!!node.vchildren) {
|
796
809
|
node.vchildren = utils.map(node.vchildren, (cNode, i) => {
|
@@ -816,15 +829,18 @@ const TableRow = ({ rowRenderer, rowIndex, row, onColumnPinned }, children, util
|
|
816
829
|
}
|
817
830
|
return toRender;
|
818
831
|
}
|
819
|
-
return (index.h("tr", { ...props, key:
|
832
|
+
return (index.h("tr", { ...props, key: rowModel.__uuid }, children));
|
820
833
|
};
|
821
834
|
const TableHeadFootRow = ({ rowRenderer, onColumnPinned }, children, utils) => {
|
822
835
|
let extraProps = {};
|
823
836
|
if (rowRenderer.rowProperties) {
|
824
837
|
extraProps = rowRenderer.rowProperties() || {};
|
825
838
|
}
|
826
|
-
const TableCell = ({ header }, children) => {
|
827
|
-
const cell = index.h("div", { class:
|
839
|
+
const TableCell = ({ header, wrap }, children) => {
|
840
|
+
const cell = (index.h("div", { class: {
|
841
|
+
[`${CSSNAMESPACE}__cell-content`]: true,
|
842
|
+
[`${CSSNAMESPACE}__cell-content--wrap`]: wrap,
|
843
|
+
} }, children));
|
828
844
|
return header !== false ? index.h("th", { scope: "col" }, cell) : index.h("td", null, cell);
|
829
845
|
};
|
830
846
|
const pinned = rowRenderer.pinned || null;
|
@@ -866,14 +882,14 @@ const TableHeadFootRow = ({ rowRenderer, onColumnPinned }, children, utils) => {
|
|
866
882
|
return index.h("tr", { ...props }, children);
|
867
883
|
};
|
868
884
|
|
869
|
-
const tableCss = ":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,
|
885
|
+
const tableCss = ":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, 500px, 50vw);--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__cell-content--wrap{white-space:normal;overflow:visible}.nano-tbl tbody{will-change:scroll-position;opacity:1;transition:0.1s ease opacity;transform:translateZ(0)}.nano-tbl tbody.nano-tbl__inactive{opacity:0}.nano-tbl th[scope=row]{font-weight:800;margin:0}.nano-tbl__pin{position:sticky}.nano-tbl__pin--start{inset-inline:-1px auto;transition:max-width 0.25s ease}.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{}.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::after{opacity:1}.nano-tbl__pin--top{inset-block:-1px auto}.nano-tbl__pinned--top .nano-tbl__pin--top{z-index:4 !important}.nano-tbl__pin--bottom{inset-block:auto -1px}.nano-tbl__pinned--bottom .nano-tbl__pin--bottom{z-index:5 !important}.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__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__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__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)}";
|
870
886
|
|
871
887
|
let id = 0;
|
872
888
|
const Table = class {
|
873
889
|
constructor(hostRef) {
|
874
890
|
index.registerInstance(this, hostRef);
|
875
|
-
this.nanoTblBlockRendered = index.createEvent(this, "nanoTblBlockRendered", 7);
|
876
891
|
this.nanoTblReady = index.createEvent(this, "nanoTblReady", 7);
|
892
|
+
this.nanoTblBlockRendered = index.createEvent(this, "nanoTblBlockRendered", 7);
|
877
893
|
this.nanoTblBeforeSort = index.createEvent(this, "nanoTblBeforeSort", 7);
|
878
894
|
this.nanoTblAfterSort = index.createEvent(this, "nanoTblAfterSort", 7);
|
879
895
|
this.nanoTblColDrag = index.createEvent(this, "nanoTblColDrag", 7);
|
@@ -882,22 +898,30 @@ const Table = class {
|
|
882
898
|
this.nanoTblAfterFilter = index.createEvent(this, "nanoTblAfterFilter", 7);
|
883
899
|
this.nanoTblBeforeSearch = index.createEvent(this, "nanoTblBeforeSearch", 7);
|
884
900
|
this.nanoTblAfterSearch = index.createEvent(this, "nanoTblAfterSearch", 7);
|
885
|
-
this.
|
886
|
-
this._loading = l;
|
887
|
-
};
|
901
|
+
this.nanoTblBeforeEdit = index.createEvent(this, "nanoTblBeforeEdit", 7);
|
888
902
|
this.renderId = 'tbl-' + id++;
|
889
903
|
this.filters = [];
|
890
904
|
this.currentFilters = '[]';
|
891
905
|
this.currentSort = '';
|
906
|
+
this.measureHeight = 0;
|
892
907
|
this.blockIos = new WeakMap();
|
893
908
|
this.blockHeights = [];
|
894
909
|
this.unitHeight = 0;
|
895
910
|
// Scroll / IO used for hiding / showing blocks
|
896
911
|
this.ignoreIO = true;
|
897
912
|
this._isReady = false;
|
913
|
+
/**
|
914
|
+
* Fired when a column is dragged
|
915
|
+
* @param column
|
916
|
+
*/
|
898
917
|
this.colDrag = (column) => {
|
899
918
|
this.nanoTblColDrag.emit({ column });
|
900
919
|
};
|
920
|
+
/**
|
921
|
+
* Fired when a column is dropped after being dragged
|
922
|
+
* @param fromCol
|
923
|
+
* @param toCol
|
924
|
+
*/
|
901
925
|
this.colDrop = (fromCol, toCol) => {
|
902
926
|
const cols = this.store.config.state.columns;
|
903
927
|
const toIndex = cols.findIndex((col) => col.prop === toCol);
|
@@ -910,7 +934,7 @@ const Table = class {
|
|
910
934
|
});
|
911
935
|
if (dropEvent.defaultPrevented)
|
912
936
|
return;
|
913
|
-
this.
|
937
|
+
this.columns = arrMove(fromIndex, toIndex, cols);
|
914
938
|
};
|
915
939
|
/**
|
916
940
|
* Start a sort - can be cancelled by `preventDefault`
|
@@ -922,7 +946,7 @@ const Table = class {
|
|
922
946
|
// did order change?
|
923
947
|
if (this.currentSort === order + ':' + column)
|
924
948
|
return;
|
925
|
-
this.
|
949
|
+
this._loading = true;
|
926
950
|
const sortEvent = this.nanoTblBeforeSort.emit({ column: column, order });
|
927
951
|
if (sortEvent.defaultPrevented)
|
928
952
|
return;
|
@@ -931,13 +955,24 @@ const Table = class {
|
|
931
955
|
this.scrollToTop(element);
|
932
956
|
if (this.customSortFn) {
|
933
957
|
try {
|
934
|
-
await this.customSortFn(column, order);
|
935
|
-
|
958
|
+
const res = await this.customSortFn(column, order);
|
959
|
+
// if the response is 'true', the custom sort did it's thing
|
960
|
+
// handover to finish and stop loading state.
|
961
|
+
// if response is falsey, carry on to do a FE sort
|
962
|
+
if (res === true) {
|
963
|
+
this.sortComplete(order, column);
|
964
|
+
this._loading = false;
|
965
|
+
return;
|
966
|
+
}
|
936
967
|
}
|
937
968
|
catch (e) {
|
969
|
+
// if response errored, stop loading state
|
970
|
+
// clear current sort cache
|
938
971
|
console.warn('custom sort failed', e);
|
972
|
+
this.currentSort = '';
|
973
|
+
this._loading = false;
|
974
|
+
return;
|
939
975
|
}
|
940
|
-
return;
|
941
976
|
}
|
942
977
|
try {
|
943
978
|
await storeSort(this.host, column, order);
|
@@ -948,7 +983,8 @@ const Table = class {
|
|
948
983
|
this.currentSort = '';
|
949
984
|
}
|
950
985
|
finally {
|
951
|
-
this.
|
986
|
+
if (this.blocks.length)
|
987
|
+
this._loading = false;
|
952
988
|
}
|
953
989
|
};
|
954
990
|
/**
|
@@ -961,31 +997,34 @@ const Table = class {
|
|
961
997
|
if (!el || this.blockIos.has(el))
|
962
998
|
return;
|
963
999
|
const blockIo = new IntersectionObserver(([ioEntry]) => {
|
964
|
-
if (
|
1000
|
+
if (ioEntry.intersectionRatio === 0)
|
965
1001
|
return;
|
966
|
-
|
967
|
-
|
968
|
-
|
969
|
-
|
970
|
-
|
971
|
-
|
972
|
-
|
973
|
-
|
974
|
-
|
975
|
-
if (this.
|
976
|
-
|
1002
|
+
// This is a bit gross
|
1003
|
+
// The Intersection Observer (IO) fires in an incorrect order when the scrolling is very fast
|
1004
|
+
// i.e. we go past blocks 3, 2, 1 and land on 0, but 3 can fire as 'intersecting' after 0.
|
1005
|
+
// To fix that, we check - for realzies - if the block IS visible.
|
1006
|
+
// BUT that test is not as sensitive to a block being visible via the IO,
|
1007
|
+
// so doesn't always fire if scrolling slowly
|
1008
|
+
// *sigh*
|
1009
|
+
index.readTask(() => {
|
1010
|
+
if (this.scrollSpeed < 100 || isInViewport(el, 0.01)) {
|
1011
|
+
if (!this.ignoreIO) {
|
1012
|
+
const potentialBlocks = [
|
977
1013
|
blockIndex,
|
978
1014
|
blockIndex + 1,
|
979
1015
|
Math.max(0, blockIndex - 1),
|
980
1016
|
];
|
981
|
-
this.
|
982
|
-
|
983
|
-
|
984
|
-
});
|
985
|
-
requestAnimationFrame(() => this.setBlockHeight());
|
1017
|
+
if (potentialBlocks.toString() !== this.activeBlocks.toString()) {
|
1018
|
+
this.debouncedBlockChange(potentialBlocks);
|
1019
|
+
}
|
986
1020
|
}
|
987
|
-
|
988
|
-
|
1021
|
+
// fire the event regardless
|
1022
|
+
this.nanoTblBlockRendered.emit({
|
1023
|
+
block: blockIndex,
|
1024
|
+
totalBlocks: this.blockElements.length,
|
1025
|
+
});
|
1026
|
+
}
|
1027
|
+
});
|
989
1028
|
}, {
|
990
1029
|
threshold: [0],
|
991
1030
|
root: this.scrollParent === document.scrollingElement
|
@@ -1007,7 +1046,8 @@ const Table = class {
|
|
1007
1046
|
this.type = 'table';
|
1008
1047
|
this.caption = undefined;
|
1009
1048
|
this.showCaption = false;
|
1010
|
-
this.
|
1049
|
+
this.loading = undefined;
|
1050
|
+
this.internalLoading = false;
|
1011
1051
|
this.placeholderSize = 5;
|
1012
1052
|
this.rows = undefined;
|
1013
1053
|
this.columns = [];
|
@@ -1021,26 +1061,29 @@ const Table = class {
|
|
1021
1061
|
this.customSortFn = undefined;
|
1022
1062
|
this.defaultSort = true;
|
1023
1063
|
this.defaultColDraggable = false;
|
1064
|
+
this.virtualTotalItems = 0;
|
1024
1065
|
this.blocks = [];
|
1025
1066
|
this.activeBlocks = [0, 1, 2];
|
1026
|
-
this.measureHeight = 0;
|
1027
1067
|
this.debounceSetLoading = throttle.debounce(this.debounceSetLoading.bind(this), 50);
|
1068
|
+
this.debouncedBlockChange = throttle.debounce(this.debouncedBlockChange.bind(this), 100);
|
1028
1069
|
}
|
1029
|
-
|
1030
|
-
|
1031
|
-
* or when performing custom filtering or sorting */
|
1032
|
-
get loading() {
|
1033
|
-
return this._loading;
|
1070
|
+
get _loading() {
|
1071
|
+
return this.loading !== undefined ? this.loading : this.internalLoading;
|
1034
1072
|
}
|
1035
|
-
set
|
1073
|
+
set _loading(l) {
|
1074
|
+
if (this.loading !== undefined)
|
1075
|
+
return;
|
1036
1076
|
this.debounceSetLoading(l);
|
1037
1077
|
}
|
1078
|
+
debounceSetLoading(l) {
|
1079
|
+
this.internalLoading = l;
|
1080
|
+
}
|
1038
1081
|
handleRowsChange() {
|
1039
1082
|
if (!this.rows) {
|
1040
|
-
this.
|
1083
|
+
this._loading = true;
|
1041
1084
|
return;
|
1042
1085
|
}
|
1043
|
-
this.
|
1086
|
+
this._loading = true;
|
1044
1087
|
Promise.resolve(this.rows).then(async (rows) => {
|
1045
1088
|
await storeSetData(this.host, rows);
|
1046
1089
|
// reset everything
|
@@ -1049,7 +1092,7 @@ const Table = class {
|
|
1049
1092
|
await this.columnInit();
|
1050
1093
|
if (!this.isReady)
|
1051
1094
|
this.setInitialBlockDimension();
|
1052
|
-
this.
|
1095
|
+
this._loading = false;
|
1053
1096
|
});
|
1054
1097
|
}
|
1055
1098
|
async handleColsChange() {
|
@@ -1064,6 +1107,9 @@ const Table = class {
|
|
1064
1107
|
handleSearchTermChange() {
|
1065
1108
|
this.searchStart();
|
1066
1109
|
}
|
1110
|
+
virtualTotalItemsChangeHandler() {
|
1111
|
+
this.setBlocks();
|
1112
|
+
}
|
1067
1113
|
/** Remove any column sorts currently applied
|
1068
1114
|
* @returns a promise which resolves when complete */
|
1069
1115
|
async resetSorting() {
|
@@ -1104,11 +1150,25 @@ const Table = class {
|
|
1104
1150
|
this.filters = this.filters.filter((f) => !columnNames.includes(f.prop));
|
1105
1151
|
return this.filterStart();
|
1106
1152
|
}
|
1153
|
+
/** Updates a row model at a given index
|
1154
|
+
* @param row - the row to update.
|
1155
|
+
* *Note* - this should come from the `col.cellTemplate` or `row.rowRender.template` `rowModel` property
|
1156
|
+
* - rows are augmented with certain properties to aid with efficient rendering
|
1157
|
+
* @param rowIndex - the row index to insert this row
|
1158
|
+
*/
|
1159
|
+
async updateRow(row, rowIndex) {
|
1160
|
+
this.rows.splice(rowIndex, 1, row);
|
1161
|
+
this.handleRowsChange();
|
1162
|
+
}
|
1107
1163
|
// uses the first 'tr' of an active block as our yard stick
|
1108
1164
|
set measureEle(el) {
|
1109
1165
|
if (!el)
|
1110
1166
|
return;
|
1111
|
-
|
1167
|
+
const potentialHeight = el.getBoundingClientRect().height;
|
1168
|
+
this.measureHeight =
|
1169
|
+
Math.abs(this.measureHeight - potentialHeight) < 5
|
1170
|
+
? this.measureHeight
|
1171
|
+
: potentialHeight;
|
1112
1172
|
this.unitHeight =
|
1113
1173
|
el.querySelector('tr')?.getBoundingClientRect().height || this.unitHeight;
|
1114
1174
|
}
|
@@ -1154,7 +1214,7 @@ const Table = class {
|
|
1154
1214
|
this.nanoTblAfterSort.emit({ column: column, order });
|
1155
1215
|
}
|
1156
1216
|
async searchStart() {
|
1157
|
-
this.
|
1217
|
+
this._loading = true;
|
1158
1218
|
const sortEvent = this.nanoTblBeforeSearch.emit({ term: this.searchTerm });
|
1159
1219
|
if (sortEvent.defaultPrevented)
|
1160
1220
|
return;
|
@@ -1168,7 +1228,7 @@ const Table = class {
|
|
1168
1228
|
console.warn('search failed', e);
|
1169
1229
|
}
|
1170
1230
|
finally {
|
1171
|
-
this.
|
1231
|
+
this._loading = false;
|
1172
1232
|
}
|
1173
1233
|
}
|
1174
1234
|
async filterStart(filters, additive = true) {
|
@@ -1185,7 +1245,7 @@ const Table = class {
|
|
1185
1245
|
}
|
1186
1246
|
if (this.currentFilters === JSON.stringify(this.filters))
|
1187
1247
|
return;
|
1188
|
-
this.
|
1248
|
+
this._loading = true;
|
1189
1249
|
const sortEvent = this.nanoTblBeforeFilter.emit({ filters: this.filters });
|
1190
1250
|
if (sortEvent.defaultPrevented)
|
1191
1251
|
return;
|
@@ -1194,12 +1254,21 @@ const Table = class {
|
|
1194
1254
|
this.scrollToTop();
|
1195
1255
|
if (this.customFilterFn) {
|
1196
1256
|
try {
|
1197
|
-
await this.customFilterFn(this.filters);
|
1198
|
-
|
1257
|
+
const res = await this.customFilterFn(this.filters);
|
1258
|
+
// if the response is 'true', the custom filter did it's thing
|
1259
|
+
// handover to finish and stop loading state.
|
1260
|
+
// if response is falsey, carry on to do a FE filter
|
1261
|
+
if (res === true) {
|
1262
|
+
this.filterComplete();
|
1263
|
+
this._loading = false;
|
1264
|
+
}
|
1199
1265
|
}
|
1200
1266
|
catch (e) {
|
1267
|
+
// if response errored, stop loading state
|
1268
|
+
// clear current sort cache
|
1201
1269
|
console.warn('custom filter failed', e);
|
1202
1270
|
this.currentFilters = '';
|
1271
|
+
this._loading = false;
|
1203
1272
|
}
|
1204
1273
|
return;
|
1205
1274
|
}
|
@@ -1211,7 +1280,7 @@ const Table = class {
|
|
1211
1280
|
console.warn('filter failed', e);
|
1212
1281
|
}
|
1213
1282
|
finally {
|
1214
|
-
this.
|
1283
|
+
this._loading = false;
|
1215
1284
|
}
|
1216
1285
|
}
|
1217
1286
|
filterComplete() {
|
@@ -1299,23 +1368,33 @@ const Table = class {
|
|
1299
1368
|
* These can then be hidden / shown to improve performance.
|
1300
1369
|
*/
|
1301
1370
|
setBlocks() {
|
1302
|
-
|
1371
|
+
const dRows = this.store.data.state.rows;
|
1372
|
+
if (!dRows.length) {
|
1373
|
+
this.blocks = [];
|
1374
|
+
return;
|
1375
|
+
}
|
1303
1376
|
this.ignoreIO = true;
|
1304
1377
|
let i = 1;
|
1305
|
-
const l = this.
|
1378
|
+
const l = this.virtualTotalItems > dRows.length
|
1379
|
+
? this.virtualTotalItems
|
1380
|
+
: dRows.length;
|
1306
1381
|
let rows = [];
|
1307
1382
|
const blocks = [];
|
1308
1383
|
this.blockHeights = [];
|
1309
1384
|
// old skool loop for perf
|
1310
1385
|
for (i; i <= l; i++) {
|
1311
|
-
rows.push(this.store.data.state.rows[i - 1]);
|
1386
|
+
rows.push(this.store.data.state.rows[i - 1] || { __uuid: '' });
|
1312
1387
|
if (i % this.perBlock === 0) {
|
1388
|
+
// assign a UUID for the whole block
|
1389
|
+
// for block diffing
|
1313
1390
|
blocks.push({ rows, __uuid: math.cyrb53(rows.map((b) => b.__uuid).join()) });
|
1314
1391
|
rows = [];
|
1315
1392
|
}
|
1316
1393
|
}
|
1317
|
-
|
1394
|
+
// any leftover rows
|
1395
|
+
if (rows.length) {
|
1318
1396
|
blocks.push({ rows, __uuid: math.cyrb53(rows.map((b) => b.__uuid).join()) });
|
1397
|
+
}
|
1319
1398
|
this.blocks = blocks;
|
1320
1399
|
}
|
1321
1400
|
/**
|
@@ -1342,11 +1421,11 @@ const Table = class {
|
|
1342
1421
|
}
|
1343
1422
|
/** cache the height for all active blocks for later renders */
|
1344
1423
|
setBlockHeight() {
|
1345
|
-
|
1346
|
-
this.
|
1347
|
-
|
1348
|
-
|
1349
|
-
|
1424
|
+
this.activeBlocks.forEach((blockIndex) => {
|
1425
|
+
const el = this.blockElements[blockIndex];
|
1426
|
+
if (!el)
|
1427
|
+
return;
|
1428
|
+
index.readTask(() => {
|
1350
1429
|
const height = el.getBoundingClientRect().height;
|
1351
1430
|
// cache height to our block heights array
|
1352
1431
|
// for subsequent renders
|
@@ -1359,6 +1438,10 @@ const Table = class {
|
|
1359
1438
|
});
|
1360
1439
|
});
|
1361
1440
|
}
|
1441
|
+
debouncedBlockChange(newBlocks) {
|
1442
|
+
this.activeBlocks = newBlocks;
|
1443
|
+
this.setBlockHeight();
|
1444
|
+
}
|
1362
1445
|
/** Process slotted content */
|
1363
1446
|
processSlots() {
|
1364
1447
|
// see if we have slot content
|
@@ -1407,18 +1490,18 @@ const Table = class {
|
|
1407
1490
|
sortable: this.defaultSort,
|
1408
1491
|
draggable: this.defaultColDraggable,
|
1409
1492
|
} }),
|
1410
|
-
]))), this._loading && !this.blocks.length && (index.h("tbody", { class: `${CSSNAMESPACE}__active` }, [...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._loading && !this.blocks.length && (index.h("tr", null, index.h("th", { class: `${CSSNAMESPACE}__th`, colSpan: this.store.config.state.columns.length }, index.h("div", { class: "nano-tbl__cell-content nano-tbl__cell-content--no-result" }, index.h("slot", { name: "no-results" }, "No results found"))))), this.blocks.map((block, blockIndex) => (index.h("tbody", { key: block.__uuid, id: `tbody-${this.renderId}-${blockIndex}`, ref: (tb) => {
|
1493
|
+
]))), this._loading && !this.blocks.length && (index.h("tbody", { class: `${CSSNAMESPACE}__active` }, [...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._loading && !this.blocks.length && (index.h("tr", null, index.h("th", { class: `${CSSNAMESPACE}__th`, colSpan: this.store.config.state.columns.length }, index.h("div", { class: "nano-tbl__cell-content nano-tbl__cell-content--no-result" }, index.h("slot", { name: "no-results" }, "No results found"))))), this.blocks.map((block, blockIndex) => (index.h("tbody", { key: block.__uuid, id: `tbody-${this.renderId}-${blockIndex}`, ref: (tb) => {
|
1411
1494
|
this.blockElements.push(tb);
|
1412
|
-
this.setupBlockIO(tb, blockIndex);
|
1495
|
+
requestAnimationFrame(() => this.setupBlockIO(tb, blockIndex));
|
1413
1496
|
}, class: {
|
1414
1497
|
[`${CSSNAMESPACE}__inactive`]: !this.activeBlocks.includes(blockIndex),
|
1415
1498
|
[`${CSSNAMESPACE}__active`]: this.activeBlocks.includes(blockIndex),
|
1416
1499
|
} }, this.activeBlocks.includes(blockIndex) ? (block.rows.map((row, i) => {
|
1417
1500
|
const rowIndex = blockIndex > 0 ? blockIndex * this.perBlock + i : i;
|
1418
|
-
return (index.h(TableRow, { rowRenderer: this.rowRender,
|
1419
|
-
})) : (index.h("td", { colSpan: this.store.config.state.columns.length, style: {
|
1501
|
+
return (index.h(TableRow, { rowRenderer: this.rowRender, rowModel: row, rowIndex: rowIndex }, this.store.config.state.columns.map((_colModel, colIndex) => (index.h(TableCell, { rowIndex: rowIndex, colIndex: colIndex })))));
|
1502
|
+
})) : (index.h("tr", null, index.h("td", { colSpan: this.store.config.state.columns.length, style: {
|
1420
1503
|
height: this.getBlockHeight(blockIndex),
|
1421
|
-
} }))))), this.showFooter && (index.h("tfoot", null, index.h(TableHeadFootRow, { rowRenderer: this.footRender, onColumnPinned: this.handleColumnPinned }, this.store.config.state.columns.map((colModel) => [
|
1504
|
+
} })))))), this.showFooter && (index.h("tfoot", null, index.h(TableHeadFootRow, { rowRenderer: this.footRender, onColumnPinned: this.handleColumnPinned }, this.store.config.state.columns.map((colModel) => [
|
1422
1505
|
index.h(TableColHead, { column: colModel, headRenderer: this.footRender, onColumnPinned: this.handleColumnPinned, onColumnSortClick: this.sortStart, defaults: {
|
1423
1506
|
sortable: this.defaultSort,
|
1424
1507
|
draggable: this.defaultColDraggable,
|
@@ -1432,7 +1515,8 @@ const Table = class {
|
|
1432
1515
|
static get watchers() { return {
|
1433
1516
|
"rows": ["handleRowsChange"],
|
1434
1517
|
"columns": ["handleColsChange"],
|
1435
|
-
"searchTerm": ["handleSearchTermChange"]
|
1518
|
+
"searchTerm": ["handleSearchTermChange"],
|
1519
|
+
"virtualTotalItems": ["virtualTotalItemsChangeHandler"]
|
1436
1520
|
}; }
|
1437
1521
|
};
|
1438
1522
|
Table.style = tableCss;
|
@@ -1440,4 +1524,4 @@ Table.style = tableCss;
|
|
1440
1524
|
exports.Table = Table;
|
1441
1525
|
exports.createWorker = createWorker;
|
1442
1526
|
|
1443
|
-
//# sourceMappingURL=nano-table-
|
1527
|
+
//# sourceMappingURL=nano-table-56eb29c1.js.map
|