@nanoporetech-digital/components 3.5.1 → 3.6.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.
Files changed (226) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/cjs/{date-utils-c581f187.js → date-utils-42fbcb42.js} +5 -3
  3. package/dist/cjs/date-utils-42fbcb42.js.map +1 -0
  4. package/dist/cjs/index-41582c2a.js +2 -6
  5. package/dist/cjs/loader.cjs.js +1 -1
  6. package/dist/cjs/nano-components.cjs.js +1 -1
  7. package/dist/cjs/nano-datalist_3.cjs.entry.js +10 -5
  8. package/dist/cjs/nano-datalist_3.cjs.entry.js.map +1 -1
  9. package/dist/cjs/nano-date-input.cjs.entry.js +1 -1
  10. package/dist/cjs/nano-date-picker.cjs.entry.js +1 -1
  11. package/dist/cjs/nano-demo.cjs.entry.js +3 -2
  12. package/dist/cjs/nano-demo.cjs.entry.js.map +1 -1
  13. package/dist/cjs/nano-dropdown.cjs.entry.js +5 -2
  14. package/dist/cjs/nano-dropdown.cjs.entry.js.map +1 -1
  15. package/dist/cjs/nano-file-upload.cjs.entry.js +4 -0
  16. package/dist/cjs/nano-file-upload.cjs.entry.js.map +1 -1
  17. package/dist/cjs/nano-global-nav-user-profile_3.cjs.entry.js +1 -2
  18. package/dist/cjs/nano-global-nav-user-profile_3.cjs.entry.js.map +1 -1
  19. package/dist/cjs/nano-icon-button.cjs.entry.js +1 -1
  20. package/dist/cjs/nano-icon-button.cjs.entry.js.map +1 -1
  21. package/dist/cjs/nano-icon.cjs.entry.js.map +1 -1
  22. package/dist/cjs/{nano-tooltip.cjs.entry.js → nano-progress-bar_2.cjs.entry.js} +28 -4
  23. package/dist/cjs/nano-progress-bar_2.cjs.entry.js.map +1 -0
  24. package/dist/cjs/nano-resize-observe_2.cjs.entry.js +74 -12
  25. package/dist/cjs/nano-resize-observe_2.cjs.entry.js.map +1 -1
  26. package/dist/cjs/nano-sticker.cjs.entry.js +2 -0
  27. package/dist/cjs/nano-sticker.cjs.entry.js.map +1 -1
  28. package/dist/cjs/nano-tab-group.cjs.entry.js +1 -1
  29. package/dist/cjs/nano-tab-group.cjs.entry.js.map +1 -1
  30. package/dist/cjs/{nano-table-067e0c12.js → nano-table-b031ec24.js} +164 -84
  31. package/dist/cjs/nano-table-b031ec24.js.map +1 -0
  32. package/dist/cjs/nano-table.cjs.entry.js +1 -1
  33. package/dist/cjs/{table.worker-a4d75c46.js → table.worker-dadd1eb0.js} +3 -3
  34. package/dist/cjs/table.worker-dadd1eb0.js.map +1 -0
  35. package/dist/{esm/table.worker-e9fb087e.js → cjs/table.worker-e2f9ccfa.js} +1 -1
  36. package/dist/collection/components/datalist/datalist.js +3 -3
  37. package/dist/collection/components/datalist/datalist.js.map +1 -1
  38. package/dist/collection/components/demo/demo.js +3 -2
  39. package/dist/collection/components/demo/demo.js.map +1 -1
  40. package/dist/collection/components/dropdown/dropdown.js +5 -2
  41. package/dist/collection/components/dropdown/dropdown.js.map +1 -1
  42. package/dist/collection/components/file-upload/file-upload.js +4 -0
  43. package/dist/collection/components/file-upload/file-upload.js.map +1 -1
  44. package/dist/collection/components/icon/icon.js +1 -1
  45. package/dist/collection/components/icon/icon.js.map +1 -1
  46. package/dist/collection/components/icon-button/icon-button.js +1 -1
  47. package/dist/collection/components/icon-button/icon-button.js.map +1 -1
  48. package/dist/collection/components/menu/menu.js +8 -3
  49. package/dist/collection/components/menu/menu.js.map +1 -1
  50. package/dist/collection/components/nav-item/nav-item.js +1 -2
  51. package/dist/collection/components/nav-item/nav-item.js.map +1 -1
  52. package/dist/collection/components/resize-observe/resize-observe.js +118 -14
  53. package/dist/collection/components/resize-observe/resize-observe.js.map +1 -1
  54. package/dist/collection/components/sticker/sticker.js +2 -0
  55. package/dist/collection/components/sticker/sticker.js.map +1 -1
  56. package/dist/collection/components/table/table-interface.js.map +1 -1
  57. package/dist/collection/components/table/table.cell.js +10 -5
  58. package/dist/collection/components/table/table.cell.js.map +1 -1
  59. package/dist/collection/components/table/table.css +9 -23
  60. package/dist/collection/components/table/table.js +227 -88
  61. package/dist/collection/components/table/table.js.map +1 -1
  62. package/dist/collection/components/table/table.row.js +19 -12
  63. package/dist/collection/components/table/table.row.js.map +1 -1
  64. package/dist/collection/components/table/table.store.js +1 -1
  65. package/dist/collection/components/table/table.store.js.map +1 -1
  66. package/dist/collection/components/table/table.utils.js +4 -4
  67. package/dist/collection/components/table/table.utils.js.map +1 -1
  68. package/dist/collection/components/table/table.worker.js +8 -0
  69. package/dist/collection/components/table/table.worker.js.map +1 -1
  70. package/dist/collection/components/tabs/tab-group.js +1 -1
  71. package/dist/collection/components/tabs/tab-group.js.map +1 -1
  72. package/dist/collection/components/tooltip/tooltip.js +25 -3
  73. package/dist/collection/components/tooltip/tooltip.js.map +1 -1
  74. package/dist/collection/utils/date-utils.js +4 -2
  75. package/dist/collection/utils/date-utils.js.map +1 -1
  76. package/dist/collection/utils/testing/index.js +15 -8
  77. package/dist/collection/utils/testing/index.js.map +1 -1
  78. package/dist/components/datalist.js +3 -3
  79. package/dist/components/datalist.js.map +1 -1
  80. package/dist/components/date-picker.js +4 -2
  81. package/dist/components/date-picker.js.map +1 -1
  82. package/dist/components/dropdown.js +5 -2
  83. package/dist/components/dropdown.js.map +1 -1
  84. package/dist/components/icon-button.js +1 -1
  85. package/dist/components/icon-button.js.map +1 -1
  86. package/dist/components/icon.js.map +1 -1
  87. package/dist/components/menu.js +8 -3
  88. package/dist/components/menu.js.map +1 -1
  89. package/dist/components/nano-demo.js +21 -14
  90. package/dist/components/nano-demo.js.map +1 -1
  91. package/dist/components/nano-file-upload.js +4 -0
  92. package/dist/components/nano-file-upload.js.map +1 -1
  93. package/dist/components/nano-tab-group.js +1 -1
  94. package/dist/components/nano-tab-group.js.map +1 -1
  95. package/dist/components/nav-item.js +1 -2
  96. package/dist/components/nav-item.js.map +1 -1
  97. package/dist/components/resize-observe.js +80 -14
  98. package/dist/components/resize-observe.js.map +1 -1
  99. package/dist/components/sticker.js +2 -0
  100. package/dist/components/sticker.js.map +1 -1
  101. package/dist/components/table.js +187 -98
  102. package/dist/components/table.js.map +1 -1
  103. package/dist/components/table.worker.js +1 -1
  104. package/dist/components/tooltip.js +6 -3
  105. package/dist/components/tooltip.js.map +1 -1
  106. package/dist/custom-elements/index.js +277 -116
  107. package/dist/custom-elements/index.js.map +1 -1
  108. package/dist/esm/{date-utils-bb82b123.js → date-utils-6b7a6e1f.js} +5 -3
  109. package/dist/esm/date-utils-6b7a6e1f.js.map +1 -0
  110. package/dist/esm/index-3c280603.js +2 -6
  111. package/dist/esm/loader.js +1 -1
  112. package/dist/esm/nano-components.js +1 -1
  113. package/dist/esm/nano-datalist_3.entry.js +10 -5
  114. package/dist/esm/nano-datalist_3.entry.js.map +1 -1
  115. package/dist/esm/nano-date-input.entry.js +1 -1
  116. package/dist/esm/nano-date-picker.entry.js +1 -1
  117. package/dist/esm/nano-demo.entry.js +3 -2
  118. package/dist/esm/nano-demo.entry.js.map +1 -1
  119. package/dist/esm/nano-dropdown.entry.js +5 -2
  120. package/dist/esm/nano-dropdown.entry.js.map +1 -1
  121. package/dist/esm/nano-file-upload.entry.js +4 -0
  122. package/dist/esm/nano-file-upload.entry.js.map +1 -1
  123. package/dist/esm/nano-global-nav-user-profile_3.entry.js +1 -2
  124. package/dist/esm/nano-global-nav-user-profile_3.entry.js.map +1 -1
  125. package/dist/esm/nano-icon-button.entry.js +1 -1
  126. package/dist/esm/nano-icon-button.entry.js.map +1 -1
  127. package/dist/esm/nano-icon.entry.js.map +1 -1
  128. package/dist/esm/{nano-tooltip.entry.js → nano-progress-bar_2.entry.js} +29 -6
  129. package/dist/esm/nano-progress-bar_2.entry.js.map +1 -0
  130. package/dist/esm/nano-resize-observe_2.entry.js +74 -12
  131. package/dist/esm/nano-resize-observe_2.entry.js.map +1 -1
  132. package/dist/esm/nano-sticker.entry.js +2 -0
  133. package/dist/esm/nano-sticker.entry.js.map +1 -1
  134. package/dist/esm/nano-tab-group.entry.js +1 -1
  135. package/dist/esm/nano-tab-group.entry.js.map +1 -1
  136. package/dist/esm/{nano-table-95921f46.js → nano-table-74d627a5.js} +164 -84
  137. package/dist/esm/nano-table-74d627a5.js.map +1 -0
  138. package/dist/esm/nano-table.entry.js +1 -1
  139. package/dist/esm/{table.worker-769f1441.js → table.worker-2908df63.js} +3 -3
  140. package/dist/esm/table.worker-2908df63.js.map +1 -0
  141. package/dist/{nano-components/p-e9fb087e.js → esm/table.worker-e2f9ccfa.js} +1 -1
  142. package/dist/nano-components/nano-components.esm.js +1 -1
  143. package/dist/nano-components/nano-components.esm.js.map +1 -1
  144. package/dist/nano-components/p-135fed16.entry.js +5 -0
  145. package/dist/nano-components/p-135fed16.entry.js.map +1 -0
  146. package/dist/nano-components/{p-2cb4615b.entry.js → p-2a97ef51.entry.js} +2 -2
  147. package/dist/nano-components/{p-2cb4615b.entry.js.map → p-2a97ef51.entry.js.map} +0 -0
  148. package/dist/nano-components/{p-751927d1.entry.js → p-3f25fc76.entry.js} +2 -2
  149. package/dist/nano-components/p-3f25fc76.entry.js.map +1 -0
  150. package/dist/nano-components/p-5d149792.entry.js +5 -0
  151. package/dist/nano-components/p-5d149792.entry.js.map +1 -0
  152. package/dist/nano-components/p-69e5a37d.entry.js.map +1 -1
  153. package/dist/nano-components/p-6ad194e4.entry.js +5 -0
  154. package/dist/nano-components/p-6ad194e4.entry.js.map +1 -0
  155. package/dist/nano-components/{p-46b348b7.entry.js → p-6cb77d5c.entry.js} +2 -2
  156. package/dist/nano-components/{p-46b348b7.entry.js.map → p-6cb77d5c.entry.js.map} +0 -0
  157. package/dist/nano-components/{p-85cfb0af.entry.js → p-9a4297e1.entry.js} +2 -2
  158. package/dist/nano-components/p-9a4297e1.entry.js.map +1 -0
  159. package/dist/nano-components/{p-d1c8eca4.entry.js → p-b55ffa92.entry.js} +2 -2
  160. package/dist/nano-components/p-b55ffa92.entry.js.map +1 -0
  161. package/dist/nano-components/p-cc5e7acb.entry.js +5 -0
  162. package/dist/nano-components/p-cc5e7acb.entry.js.map +1 -0
  163. package/dist/nano-components/p-cecb9af1.js +5 -0
  164. package/dist/nano-components/p-cecb9af1.js.map +1 -0
  165. package/dist/nano-components/{p-601e18d5.entry.js → p-d5303933.entry.js} +2 -2
  166. package/dist/nano-components/p-d5303933.entry.js.map +1 -0
  167. package/dist/nano-components/{p-4f0e14b5.entry.js → p-d565991d.entry.js} +2 -2
  168. package/dist/nano-components/p-d565991d.entry.js.map +1 -0
  169. package/dist/nano-components/p-d7ed2d6e.js +5 -0
  170. package/dist/nano-components/p-d7ed2d6e.js.map +1 -0
  171. package/dist/nano-components/p-d81d40d9.js +5 -0
  172. package/dist/nano-components/{p-26905bca.js.map → p-d81d40d9.js.map} +0 -0
  173. package/dist/nano-components/{p-244223f0.entry.js → p-dc50b93c.entry.js} +2 -2
  174. package/dist/nano-components/p-dc50b93c.entry.js.map +1 -0
  175. package/dist/{cjs/table.worker-e9fb087e.js → nano-components/p-e2f9ccfa.js} +1 -1
  176. package/dist/nano-components/{p-fb12a45d.entry.js → p-f5ee07b3.entry.js} +2 -2
  177. package/dist/nano-components/{p-fb12a45d.entry.js.map → p-f5ee07b3.entry.js.map} +0 -0
  178. package/dist/types/components/icon/icon.d.ts +1 -1
  179. package/dist/types/components/menu/menu.d.ts +1 -0
  180. package/dist/types/components/resize-observe/resize-observe.d.ts +20 -1
  181. package/dist/types/components/table/table-interface.d.ts +35 -24
  182. package/dist/types/components/table/table.cell.d.ts +1 -1
  183. package/dist/types/components/table/table.d.ts +48 -15
  184. package/dist/types/components/table/table.row.d.ts +1 -1
  185. package/dist/types/components/table/table.store.d.ts +1 -1
  186. package/dist/types/components/table/table.utils.d.ts +1 -1
  187. package/dist/types/components/table/table.worker.d.ts +3 -3
  188. package/dist/types/components/tooltip/tooltip.d.ts +5 -0
  189. package/dist/types/components.d.ts +59 -14
  190. package/dist/types/utils/date-utils.d.ts +1 -1
  191. package/docs-json.json +179 -31
  192. package/docs-vscode.json +26 -3
  193. package/package.json +2 -2
  194. package/dist/cjs/date-utils-c581f187.js.map +0 -1
  195. package/dist/cjs/nano-progress-bar.cjs.entry.js +0 -33
  196. package/dist/cjs/nano-progress-bar.cjs.entry.js.map +0 -1
  197. package/dist/cjs/nano-table-067e0c12.js.map +0 -1
  198. package/dist/cjs/nano-tooltip.cjs.entry.js.map +0 -1
  199. package/dist/cjs/table.worker-a4d75c46.js.map +0 -1
  200. package/dist/esm/date-utils-bb82b123.js.map +0 -1
  201. package/dist/esm/nano-progress-bar.entry.js +0 -29
  202. package/dist/esm/nano-progress-bar.entry.js.map +0 -1
  203. package/dist/esm/nano-table-95921f46.js.map +0 -1
  204. package/dist/esm/nano-tooltip.entry.js.map +0 -1
  205. package/dist/esm/table.worker-769f1441.js.map +0 -1
  206. package/dist/nano-components/p-15a60f7e.js +0 -5
  207. package/dist/nano-components/p-15a60f7e.js.map +0 -1
  208. package/dist/nano-components/p-244223f0.entry.js.map +0 -1
  209. package/dist/nano-components/p-26905bca.js +0 -5
  210. package/dist/nano-components/p-4f0e14b5.entry.js.map +0 -1
  211. package/dist/nano-components/p-601e18d5.entry.js.map +0 -1
  212. package/dist/nano-components/p-751927d1.entry.js.map +0 -1
  213. package/dist/nano-components/p-85cfb0af.entry.js.map +0 -1
  214. package/dist/nano-components/p-8fc2a38d.js +0 -5
  215. package/dist/nano-components/p-8fc2a38d.js.map +0 -1
  216. package/dist/nano-components/p-9e8c9bac.entry.js +0 -5
  217. package/dist/nano-components/p-9e8c9bac.entry.js.map +0 -1
  218. package/dist/nano-components/p-a2e38472.entry.js +0 -5
  219. package/dist/nano-components/p-a2e38472.entry.js.map +0 -1
  220. package/dist/nano-components/p-b9c8b99f.entry.js +0 -5
  221. package/dist/nano-components/p-b9c8b99f.entry.js.map +0 -1
  222. package/dist/nano-components/p-d1c8eca4.entry.js.map +0 -1
  223. package/dist/nano-components/p-f43d1d8e.entry.js +0 -5
  224. package/dist/nano-components/p-f43d1d8e.entry.js.map +0 -1
  225. package/dist/nano-components/p-feb9f164.entry.js +0 -5
  226. package/dist/nano-components/p-feb9f164.entry.js.map +0 -1
@@ -110,7 +110,7 @@ const createWorkerProxy = (worker, workerMsgId, exportedMethod) => (
110
110
  })
111
111
  );
112
112
 
113
- const workerPromise = import('./table.worker-769f1441.js').then(m => m.worker);
113
+ const workerPromise = import('./table.worker-2908df63.js').then(m => m.worker);
114
114
  const createWorkerStore = /*@__PURE__*/createWorkerProxy(workerPromise, 'stencil.table.worker', 'createWorkerStore');
115
115
  const syncConfigToWorker = /*@__PURE__*/createWorkerProxy(workerPromise, 'stencil.table.worker', 'syncConfigToWorker');
116
116
  const syncDataToWorker = /*@__PURE__*/createWorkerProxy(workerPromise, 'stencil.table.worker', 'syncDataToWorker');
@@ -208,7 +208,7 @@ function storeSetData(host, rows) {
208
208
  row[colName] = Number(coerceDate);
209
209
  });
210
210
  row['__index'] = i;
211
- row['__uuid'] = cyrb53(Object.values(row).join());
211
+ row['__uuid'] = cyrb53(cols.map((c) => row[c.prop]).join());
212
212
  return row;
213
213
  });
214
214
  store.data.state.rows = rows;
@@ -270,7 +270,7 @@ function colDataModel(rowIndex, colIndex) {
270
270
  const column = columns[colIndex];
271
271
  const prop = column?.prop;
272
272
  const rowModel = rows[rowIndex];
273
- const cellModel = rowModel[columns[colIndex].prop];
273
+ const cellModel = rowModel ? rowModel[columns[colIndex].prop] : '';
274
274
  return {
275
275
  prop,
276
276
  cellModel,
@@ -287,9 +287,9 @@ function colDataModel(rowIndex, colIndex) {
287
287
  function rowDataModel(rowIndex) {
288
288
  const store = fetchStores();
289
289
  const rows = store.data.state.rows;
290
- const row = rows[rowIndex];
290
+ const rowModel = rows[rowIndex];
291
291
  return {
292
- row,
292
+ rowModel,
293
293
  rowIndex,
294
294
  };
295
295
  }
@@ -356,7 +356,7 @@ function mergeCellProperties(rowIndex, colIndex, defaultProps) {
356
356
  * @returns - a JSX node
357
357
  */
358
358
  function colheadFootRender(col) {
359
- const tpl = col?.colTemplate;
359
+ const tpl = col?.columnTemplate;
360
360
  return tpl ? (tpl(h, col)) : (h(Fragment, null, col.title));
361
361
  }
362
362
  const stickyHIOs = new WeakMap();
@@ -719,7 +719,7 @@ function cellRender(rowIndex, colIndex) {
719
719
  : d;
720
720
  }
721
721
  }
722
- return tpl ? (tpl(h, model)) : (h(Fragment, null, model.cellModel?.toString()));
722
+ return tpl ? (tpl(h, model)) : model.cellModel ? (h(Fragment, null, model.cellModel?.toString())) : ('');
723
723
  }
724
724
  const baseCellClasses = (colIndex, toString = false) => {
725
725
  const store = fetchStores();
@@ -736,9 +736,9 @@ const baseCellClasses = (colIndex, toString = false) => {
736
736
  return classes;
737
737
  };
738
738
  const TableCell = ({ rowIndex, colIndex, nestedContent, }) => {
739
- const content = nestedContent || cellRender(rowIndex, colIndex);
740
- if (!content)
741
- return h(Fragment, null);
739
+ const Content = () => nestedContent
740
+ ? nestedContent()
741
+ : cellRender(rowIndex, colIndex) || (h("span", { class: "placeholder" }, "\u00A0"));
742
742
  let CellType = 'td';
743
743
  const store = fetchStores();
744
744
  const column = store.config.state.columns[colIndex];
@@ -752,24 +752,37 @@ const TableCell = ({ rowIndex, colIndex, nestedContent, }) => {
752
752
  : { ...props, scope: 'row' };
753
753
  CellType = 'th';
754
754
  }
755
+ const ContentWrap = (props) => (h("div", { ...props, class: {
756
+ [`${CSSNAMESPACE}__cell-content`]: true,
757
+ [`${CSSNAMESPACE}__cell-content--wrap`]: !!column.wrap,
758
+ } },
759
+ h(Content, null)));
755
760
  return (h(CellType
756
761
  // role="gridcell"
757
- , { ...props },
758
- h("div", { class: `${CSSNAMESPACE}__cell-content` }, content)));
762
+ , { ...props }, column.autoTooltip && !column.wrap ? (h("nano-resize-observe", { notifyContentFit: "x", onNanoResizeContentFitChange: (e) => (e.target.firstElementChild.disabled =
763
+ e.detail.x) },
764
+ h("nano-tooltip", { disabled: true, hoist: true },
765
+ h(ContentWrap, null),
766
+ h("span", { slot: "content" },
767
+ h(Content, null))))) : (h(ContentWrap, null))));
759
768
  };
760
769
 
761
- const TableRow = ({ rowRenderer, rowIndex, row, onColumnPinned }, children, utils) => {
770
+ const TableRow = ({ rowRenderer, rowIndex, rowModel, onColumnPinned }, children, utils) => {
762
771
  let extraProps = {};
763
- const TableCell = ({ header }, children) => {
764
- const cell = h("div", { class: CSSNAMESPACE + '__cell-content' }, children);
772
+ const TableCell = ({ header, wrap }, children) => {
773
+ const cell = (h("div", { class: {
774
+ [`${CSSNAMESPACE}__cell-content`]: true,
775
+ [`${CSSNAMESPACE}__cell-content--wrap`]: wrap,
776
+ } }, children));
765
777
  return header ? h("th", { scope: "row" }, cell) : h("td", null, cell);
766
778
  };
767
- if (!row) {
779
+ if (!rowModel) {
768
780
  const model = rowDataModel(rowIndex);
769
- row = model.row;
781
+ rowModel = model.rowModel;
770
782
  }
771
783
  if (rowRenderer?.rowProperties) {
772
- extraProps = rowRenderer.rowProperties({ row, rowIndex }) || extraProps;
784
+ extraProps =
785
+ rowRenderer.rowProperties({ rowModel, rowIndex }) || extraProps;
773
786
  }
774
787
  let pinned;
775
788
  if (rowRenderer?.pinned && typeof rowRenderer.pinned === 'function') {
@@ -780,15 +793,15 @@ const TableRow = ({ rowRenderer, rowIndex, row, onColumnPinned }, children, util
780
793
  const tpl = rowRenderer?.template;
781
794
  if (tpl) {
782
795
  let toRender = tpl(h, {
783
- renderedRow: (h("tr", { ...props, key: row.__uuid }, children)),
784
- row,
796
+ renderedRow: (h("tr", { ...props, key: rowModel.__uuid }, children)),
797
+ rowModel,
785
798
  rowIndex,
786
799
  }, TableCell);
787
800
  if (Array.isArray(toRender)) {
788
801
  toRender = utils.map(toRender, (node, i) => {
789
802
  if (node.vtag === 'tr') {
790
803
  if (!node.vkey)
791
- node.vkey = `${row.__uuid}_${i}`;
804
+ node.vkey = `${rowModel.__uuid}_${i}`;
792
805
  node.vattrs = mergeProperties({ class: headerPinClasses('tr', pinned, true) }, node.vattrs);
793
806
  if (!!node.vchildren) {
794
807
  node.vchildren = utils.map(node.vchildren, (cNode, i) => {
@@ -814,15 +827,18 @@ const TableRow = ({ rowRenderer, rowIndex, row, onColumnPinned }, children, util
814
827
  }
815
828
  return toRender;
816
829
  }
817
- return (h("tr", { ...props, key: row.__uuid }, children));
830
+ return (h("tr", { ...props, key: rowModel.__uuid }, children));
818
831
  };
819
832
  const TableHeadFootRow = ({ rowRenderer, onColumnPinned }, children, utils) => {
820
833
  let extraProps = {};
821
834
  if (rowRenderer.rowProperties) {
822
835
  extraProps = rowRenderer.rowProperties() || {};
823
836
  }
824
- const TableCell = ({ header }, children) => {
825
- const cell = h("div", { class: CSSNAMESPACE + '__cell-content' }, children);
837
+ const TableCell = ({ header, wrap }, children) => {
838
+ const cell = (h("div", { class: {
839
+ [`${CSSNAMESPACE}__cell-content`]: true,
840
+ [`${CSSNAMESPACE}__cell-content--wrap`]: wrap,
841
+ } }, children));
826
842
  return header !== false ? h("th", { scope: "col" }, cell) : h("td", null, cell);
827
843
  };
828
844
  const pinned = rowRenderer.pinned || null;
@@ -864,14 +880,14 @@ const TableHeadFootRow = ({ rowRenderer, onColumnPinned }, children, utils) => {
864
880
  return h("tr", { ...props }, children);
865
881
  };
866
882
 
867
- 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, 30%, 20vw);--color:var(--nano-color-mediumgrey, #68767e);--font-size:0.87rem;--cell-line-height:1.5;--thead-font-size:0.95rem;--thead-color:#455560;--tfoot-color:#455560;--border-color:#dddbda;--border-style:thin solid var(--border-color);--border-tint-color:#0084a9;--border-tint-style:3px solid var(--border-tint-color);--cell-bg-rgb:var(--nano-color-white-rgb, 255 255 255);--head-bg-rgb:250, 250, 249;--foot-bg-rgb:var(--head-bg-rgb);--th-row-bg-rgb:var(--cell-bg-rgb);--ordered-bg-rgb:var(--nano-color-offwhite-rgb, 249 249 251);--td-padding-start:0.625rem;--td-padding-end:0.625rem;--td-padding-top:0.5rem;--td-padding-bottom:0.4125rem;--th-padding-start:0.625rem;--th-padding-end:0.625rem;--th-padding-top:0.875rem;--th-padding-bottom:0.6875rem;--td-padding-v:var(--td-padding-top) var(--td-padding-bottom);--td-padding-h:var(--td-padding-start) var(--td-padding-end);--th-padding-v:var(--th-padding-top) var(--th-padding-bottom);--th-padding-h:var(--th-padding-start) var(--th-padding-end);--foot-th-padding-v:var(--td-padding-top) var(--td-padding-bottom);--foot-th-padding-h:var(--td-padding-start) var(--td-padding-end);--head-th-padding-v:var(--th-padding-top) var(--th-padding-bottom);--head-th-padding-h:var(--th-padding-start) var(--th-padding-end);--bookend-col-padding:2rem}.nano-tbl{color:var(--color);text-align:start;width:100%;font-size:var(--font-size);border-spacing:0 0;border-collapse:separate;background:rgb(var(--cell-bg-rgb));border-inline-end:1px solid transparent;border-block-start:1px solid transparent;position:relative;z-index:1}.nano-tbl__wrap{display:table;min-width:100%}.nano-tbl__top-anchor{clip:rect(1px, 1px, 1px, 1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);block-size:1px;inline-size:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;position:relative}.nano-tbl__ordered{background-color:var(--ordered-bg);border-inline-start:var(--border-style);border-inline-end:var(--border-style)}.nano-tbl__drag-mask{display:none;position:absolute;inset-block:-2px -2px;z-index:10;opacity:0;transition:0.2s ease opacity}.nano-tbl__drag-mask--start{width:calc(50% + 2px);inset-inline-start:-2px;border-inline-start:2px dashed var(--border-tint-color)}.nano-tbl__drag-mask--end{width:50%;inset-inline-end:0;border-inline-end:2px dashed var(--border-tint-color)}.nano-tbl__drag-mask--active{opacity:1}.nano-tbl__dragging .nano-tbl__drag-mask{display:block}.nano-tbl__drag--start{opacity:0.4}.nano-tbl__dragging .nano-tbl__td,.nano-tbl__dragging .nano-tbl__th{cursor:no-drop}.nano-tbl__dragging .nano-tbl__td .nano-tbl__cell-content,.nano-tbl__dragging .nano-tbl__th .nano-tbl__cell-content{pointer-events:none}.nano-tbl__order-btn{padding:0;border:none;outline:none;font:inherit;background:none;-webkit-appearance:none;appearance:none;color:inherit;display:flex;gap:10px;align-items:center;width:100%}.nano-tbl__status-icons{margin-inline:auto 10px;display:flex;gap:10px}.nano-tbl__progress-bar{font-size:0.2rem;position:sticky;inset-block-start:0;inset-inline:0;z-index:10;transition:scale 0.25s;scale:0;width:100%;height:0}.nano-tbl__progress-bar--show{scale:1;height:auto}.nano-tbl__caption--hide{clip:rect(1px, 1px, 1px, 1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);block-size:1px;inline-size:1px;margin:-1px;overflow:hidden;padding:0;position:absolute}.nano-tbl__td,.nano-tbl__th{line-height:var(--cell-line-height);text-align:start;border-block-start:var(--border-style);max-width:var(--max-col-width);background-color:rgb(var(--cell-bg-rgb))}tbody:first-of-type tr:first-child .nano-tbl__td,tbody:first-of-type tr:first-child .nano-tbl__th{border-block-start:none}tbody:last-of-type tr:last-child .nano-tbl__td,tbody:last-of-type tr:last-child .nano-tbl__th{border-block-end:var(--border-style)}.md .nano-tbl__td:first-child .nano-tbl__cell-content,.md .nano-tbl__th:first-child .nano-tbl__cell-content{padding-inline-start:var(--bookend-col-padding)}.md .nano-tbl__td:last-child .nano-tbl__cell-content,.md .nano-tbl__th:last-child .nano-tbl__cell-content{padding-inline-end:var(--bookend-col-padding)}@media (max-width: 768px){.nano-tbl__td:first-child .nano-tbl__cell-content,.nano-tbl__th:first-child .nano-tbl__cell-content{padding-inline-start:var(--td-padding-start) !important}.nano-tbl__td:last-child .nano-tbl__cell-content,.nano-tbl__th:last-child .nano-tbl__cell-content{padding-inline-end:var(--td-padding-end) !important}}thead .nano-tbl__td,thead .nano-tbl__th{color:var(--thead-color);font-weight:800;background:rgba(var(--head-bg-rgb), 90%);font-size:var(--thead-font-size);border-block-start:none !important;transition:all 0.2s ease}thead .nano-tbl__td .nano-tbl__cell-content,thead .nano-tbl__th .nano-tbl__cell-content{padding-block:var(--head-th-padding-v);padding-inline:var(--head-th-padding-h)}tfoot .nano-tbl__td,tfoot .nano-tbl__th{color:var(--tfoot-color);font-weight:800;border-block-start:none;background:rgba(var(--foot-bg-rgb), 90%);font-size:var(--thead-font-size)}tfoot .nano-tbl__td .nano-tbl__cell-content,tfoot .nano-tbl__th .nano-tbl__cell-content{padding-block:var(--foot-th-padding-v);padding-inline:var(--foot-th-padding-h)}.nano-tbl__td.nano-tbl__ordered,.nano-tbl__th.nano-tbl__ordered{background-color:rgba(var(--ordered-bg-rgb), 0.8) !important}.nano-tbl__cell-content{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding-block:var(--td-padding-v);padding-inline:var(--td-padding-h)}.nano-tbl__cell-content--no-result{padding-block:2rem}.nano-tbl tbody{will-change:scroll-position;visibility:visible}.nano-tbl tbody.nano-tbl__inactive{visibility:hidden}.nano-tbl th[scope=row]{font-weight:800;margin:0}.nano-tbl__pin{position:sticky;z-index:1}.nano-tbl__pin--start{inset-inline:-1px auto;transition:max-width 0.25s ease;z-index:2}.nano-tbl__pin--start::after{content:\"\";position:absolute;inset:0;box-shadow:5px 1px 4px 0 rgba(0, 0, 0, 0.2);opacity:0;z-index:-1}.nano-tbl__pinned--start .nano-tbl__pin--start{z-index:2;max-width:125px !important}.sm .nano-tbl__pinned--start .nano-tbl__pin--start{max-width:var(--max-col-width) !important}.nano-tbl__pinned--start .nano-tbl__pin--start::after{opacity:1}.nano-tbl__pin--end{z-index:2;}.nano-tbl__pin--start+.nano-tbl__pin--end{inset-inline:auto auto}.nano-tbl__pin--start+.nano-tbl__pin--end::after{display:none}.sm .nano-tbl__pin--end{inset-inline:auto -1px !important;max-width:min(50vw, 200px)}.sm .nano-tbl__pin--end::after{display:block !important;content:\"\";position:absolute;inset:0;box-shadow:-5px 1px 4px 0 rgba(0, 0, 0, 0.2);opacity:0;z-index:-1}.sm .nano-tbl__pinned--end .nano-tbl__pin--end{z-index:3}.sm .nano-tbl__pinned--end .nano-tbl__pin--end::after{opacity:1}.nano-tbl__pin--top{inset-block:-1px auto;z-index:3}.nano-tbl__pinned--top .nano-tbl__pin--top{z-index:4 !important}.nano-tbl__pin--bottom{inset-block:auto -1px;z-index:3}.nano-tbl__pinned--bottom .nano-tbl__pin--bottom{z-index:5 !important}.nano-tbl__pin--top.nano-tbl__pin--start{z-index:4}.nano-tbl__pinned--start .nano-tbl__pin--top.nano-tbl__pin--start{z-index:5 !important}.nano-tbl__pinned--top.nano-tbl__pinned--start .nano-tbl__pin--top.nano-tbl__pin--start{z-index:6 !important}.nano-tbl__pin--top.nano-tbl__pin--end{z-index:4}.nano-tbl__pinned--end .nano-tbl__pin--top.nano-tbl__pin--end{z-index:5 !important}.nano-tbl__pinned--top.nano-tbl__pinned--end .nano-tbl__pin--top.nano-tbl__pin--end{z-index:6 !important}.nano-tbl__pin--bottom.nano-tbl__pin--start{z-index:4}.nano-tbl__pinned--start .nano-tbl__pin--bottom.nano-tbl__pin--start{z-index:5 !important}.nano-tbl__pinned--bottom.nano-tbl__pinned--start .nano-tbl__pin--bottom.nano-tbl__pin--start{z-index:6 !important}.nano-tbl__pin--bottom.nano-tbl__pin--end{z-index:4}.nano-tbl__pinned--end .nano-tbl__pin--bottom.nano-tbl__pin--end{z-index:5 !important}.nano-tbl__pinned--bottom.nano-tbl__pinned--end .nano-tbl__pin--bottom.nano-tbl__pin--end{z-index:6 !important}.nano-tbl thead tr:last-of-type td,.nano-tbl thead tr:last-of-type th{border-block-end:var(--border-tint-style)}.nano-tbl tfoot tr:first-of-type td,.nano-tbl tfoot tr:first-of-type th{border-block-start:none}.nano-tbl tfoot tr:last-of-type td,.nano-tbl tfoot tr:last-of-type th{border-block-end:var(--border-tint-style)}.nano-tbl__pinned--bottom .nano-tbl tfoot tr.nano-tbl__pin--bottom:first-of-type td,.nano-tbl__pinned--bottom .nano-tbl tfoot tr.nano-tbl__pin--bottom:first-of-type th{border-block-start:var(--border-tint-style) !important}.nano-tbl__pinned--bottom .nano-tbl tfoot tr.nano-tbl__pin--bottom:last-of-type td,.nano-tbl__pinned--bottom .nano-tbl tfoot tr.nano-tbl__pin--bottom:last-of-type th{border-block-end:none !important}.nano-tbl .unlimited-width{max-width:none}.nano-tbl__spinner{font-size:1.5rem;transition:scale 0.25s;scale:0;padding:0.5rem;position:absolute;inset-block-end:0;inset-inline-start:calc(50% - 0.75rem);z-index:0}.nano-tbl__spinner--show{scale:1;position:sticky}.nano-tbl nano-skeleton{line-height:var(--cell-line-height)}";
883
+ 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)}";
868
884
 
869
885
  let id = 0;
870
886
  const Table = class {
871
887
  constructor(hostRef) {
872
888
  registerInstance(this, hostRef);
873
- this.nanoTblBlockRendered = createEvent(this, "nanoTblBlockRendered", 7);
874
889
  this.nanoTblReady = createEvent(this, "nanoTblReady", 7);
890
+ this.nanoTblBlockRendered = createEvent(this, "nanoTblBlockRendered", 7);
875
891
  this.nanoTblBeforeSort = createEvent(this, "nanoTblBeforeSort", 7);
876
892
  this.nanoTblAfterSort = createEvent(this, "nanoTblAfterSort", 7);
877
893
  this.nanoTblColDrag = createEvent(this, "nanoTblColDrag", 7);
@@ -880,22 +896,33 @@ const Table = class {
880
896
  this.nanoTblAfterFilter = createEvent(this, "nanoTblAfterFilter", 7);
881
897
  this.nanoTblBeforeSearch = createEvent(this, "nanoTblBeforeSearch", 7);
882
898
  this.nanoTblAfterSearch = createEvent(this, "nanoTblAfterSearch", 7);
899
+ this.nanoTblBeforeEdit = createEvent(this, "nanoTblBeforeEdit", 7);
883
900
  this.debounceSetLoading = (l) => {
884
- this._loading = l;
901
+ this.internalLoading = l;
885
902
  };
886
903
  this.renderId = 'tbl-' + id++;
887
904
  this.filters = [];
888
905
  this.currentFilters = '[]';
889
906
  this.currentSort = '';
907
+ this.measureHeight = 0;
890
908
  this.blockIos = new WeakMap();
891
909
  this.blockHeights = [];
892
910
  this.unitHeight = 0;
893
911
  // Scroll / IO used for hiding / showing blocks
894
912
  this.ignoreIO = true;
895
913
  this._isReady = false;
914
+ /**
915
+ * Fired when a column is dragged
916
+ * @param column
917
+ */
896
918
  this.colDrag = (column) => {
897
919
  this.nanoTblColDrag.emit({ column });
898
920
  };
921
+ /**
922
+ * Fired when a column is dropped after being dragged
923
+ * @param fromCol
924
+ * @param toCol
925
+ */
899
926
  this.colDrop = (fromCol, toCol) => {
900
927
  const cols = this.store.config.state.columns;
901
928
  const toIndex = cols.findIndex((col) => col.prop === toCol);
@@ -908,7 +935,7 @@ const Table = class {
908
935
  });
909
936
  if (dropEvent.defaultPrevented)
910
937
  return;
911
- this.store.config.state.columns = arrMove(fromIndex, toIndex, cols);
938
+ this.columns = arrMove(fromIndex, toIndex, cols);
912
939
  };
913
940
  /**
914
941
  * Start a sort - can be cancelled by `preventDefault`
@@ -920,7 +947,7 @@ const Table = class {
920
947
  // did order change?
921
948
  if (this.currentSort === order + ':' + column)
922
949
  return;
923
- this.loading = true;
950
+ this._loading = true;
924
951
  const sortEvent = this.nanoTblBeforeSort.emit({ column: column, order });
925
952
  if (sortEvent.defaultPrevented)
926
953
  return;
@@ -929,13 +956,24 @@ const Table = class {
929
956
  this.scrollToTop(element);
930
957
  if (this.customSortFn) {
931
958
  try {
932
- await this.customSortFn(column, order);
933
- this.sortComplete(order, column);
959
+ const res = await this.customSortFn(column, order);
960
+ // if the response is 'true', the custom sort did it's thing
961
+ // handover to finish and stop loading state.
962
+ // if response is falsey, carry on to do a FE sort
963
+ if (res === true) {
964
+ this.sortComplete(order, column);
965
+ this._loading = false;
966
+ return;
967
+ }
934
968
  }
935
969
  catch (e) {
970
+ // if response errored, stop loading state
971
+ // clear current sort cache
936
972
  console.warn('custom sort failed', e);
973
+ this.currentSort = '';
974
+ this._loading = false;
975
+ return;
937
976
  }
938
- return;
939
977
  }
940
978
  try {
941
979
  await storeSort(this.host, column, order);
@@ -946,7 +984,8 @@ const Table = class {
946
984
  this.currentSort = '';
947
985
  }
948
986
  finally {
949
- this.loading = false;
987
+ if (this.blocks.length)
988
+ this._loading = false;
950
989
  }
951
990
  };
952
991
  /**
@@ -959,31 +998,35 @@ const Table = class {
959
998
  if (!el || this.blockIos.has(el))
960
999
  return;
961
1000
  const blockIo = new IntersectionObserver(([ioEntry]) => {
962
- if (this.ignoreIO)
1001
+ if (ioEntry.intersectionRatio === 0)
963
1002
  return;
964
- if (ioEntry.isIntersecting) {
965
- // This is a bit gross
966
- // The Intersection Observer (IO) fires in an incorrect order when the scrolling is very fast
967
- // i.e. we go past blocks 3, 2, 1 and land on 0, but 3 can fire as 'intersecting' after 0.
968
- // To fix that, we check - for realzies - if the block IS visible.
969
- // BUT that test is not as sensitive to a block being visible via the IO,
970
- // so doesn't always fire if scrolling slowly
971
- // *sigh*
972
- readTask(() => {
973
- if (this.scrollSpeed < 100 || isInViewport(el, 0.01)) {
974
- this.activeBlocks = [
1003
+ // This is a bit gross
1004
+ // The Intersection Observer (IO) fires in an incorrect order when the scrolling is very fast
1005
+ // i.e. we go past blocks 3, 2, 1 and land on 0, but 3 can fire as 'intersecting' after 0.
1006
+ // To fix that, we check - for realzies - if the block IS visible.
1007
+ // BUT that test is not as sensitive to a block being visible via the IO,
1008
+ // so doesn't always fire if scrolling slowly
1009
+ // *sigh*
1010
+ readTask(() => {
1011
+ if (this.scrollSpeed < 100 || isInViewport(el, 0.01)) {
1012
+ if (!this.ignoreIO) {
1013
+ const potentialBlocks = [
975
1014
  blockIndex,
976
1015
  blockIndex + 1,
977
1016
  Math.max(0, blockIndex - 1),
978
1017
  ];
979
- this.nanoTblBlockRendered.emit({
980
- block: blockIndex,
981
- totalBlocks: this.blockElements.length,
982
- });
983
- requestAnimationFrame(() => this.setBlockHeight());
1018
+ if (potentialBlocks.toString() !== this.activeBlocks.toString()) {
1019
+ this.activeBlocks = potentialBlocks;
1020
+ this.setBlockHeight();
1021
+ }
984
1022
  }
985
- });
986
- }
1023
+ // fire the event regardless
1024
+ this.nanoTblBlockRendered.emit({
1025
+ block: blockIndex,
1026
+ totalBlocks: this.blockElements.length,
1027
+ });
1028
+ }
1029
+ });
987
1030
  }, {
988
1031
  threshold: [0],
989
1032
  root: this.scrollParent === document.scrollingElement
@@ -1005,7 +1048,8 @@ const Table = class {
1005
1048
  this.type = 'table';
1006
1049
  this.caption = undefined;
1007
1050
  this.showCaption = false;
1008
- this._loading = false;
1051
+ this.loading = undefined;
1052
+ this.internalLoading = false;
1009
1053
  this.placeholderSize = 5;
1010
1054
  this.rows = undefined;
1011
1055
  this.columns = [];
@@ -1019,26 +1063,25 @@ const Table = class {
1019
1063
  this.customSortFn = undefined;
1020
1064
  this.defaultSort = true;
1021
1065
  this.defaultColDraggable = false;
1066
+ this.virtualTotalItems = 0;
1022
1067
  this.blocks = [];
1023
1068
  this.activeBlocks = [0, 1, 2];
1024
- this.measureHeight = 0;
1025
1069
  this.debounceSetLoading = debounce(this.debounceSetLoading.bind(this), 50);
1026
1070
  }
1027
- /** Will show a loading state when true.
1028
- * Will be shown automatically if `rows` is a promise waiting to resolve
1029
- * or when performing custom filtering or sorting */
1030
- get loading() {
1031
- return this._loading;
1071
+ get _loading() {
1072
+ return this.loading !== undefined ? this.loading : this.internalLoading;
1032
1073
  }
1033
- set loading(l) {
1074
+ set _loading(l) {
1075
+ if (this.loading !== undefined)
1076
+ return;
1034
1077
  this.debounceSetLoading(l);
1035
1078
  }
1036
1079
  handleRowsChange() {
1037
1080
  if (!this.rows) {
1038
- this.loading = true;
1081
+ this._loading = true;
1039
1082
  return;
1040
1083
  }
1041
- this.loading = true;
1084
+ this._loading = true;
1042
1085
  Promise.resolve(this.rows).then(async (rows) => {
1043
1086
  await storeSetData(this.host, rows);
1044
1087
  // reset everything
@@ -1047,7 +1090,7 @@ const Table = class {
1047
1090
  await this.columnInit();
1048
1091
  if (!this.isReady)
1049
1092
  this.setInitialBlockDimension();
1050
- this.loading = false;
1093
+ this._loading = false;
1051
1094
  });
1052
1095
  }
1053
1096
  async handleColsChange() {
@@ -1062,6 +1105,9 @@ const Table = class {
1062
1105
  handleSearchTermChange() {
1063
1106
  this.searchStart();
1064
1107
  }
1108
+ virtualTotalItemsChangeHandler() {
1109
+ this.setBlocks();
1110
+ }
1065
1111
  /** Remove any column sorts currently applied
1066
1112
  * @returns a promise which resolves when complete */
1067
1113
  async resetSorting() {
@@ -1102,11 +1148,25 @@ const Table = class {
1102
1148
  this.filters = this.filters.filter((f) => !columnNames.includes(f.prop));
1103
1149
  return this.filterStart();
1104
1150
  }
1151
+ /** Updates a row model at a given index
1152
+ * @param row - the row to update.
1153
+ * *Note* - this should come from the `col.cellTemplate` or `row.rowRender.template` `rowModel` property
1154
+ * - rows are augmented with certain properties to aid with efficient rendering
1155
+ * @param rowIndex - the row index to insert this row
1156
+ */
1157
+ async updateRow(row, rowIndex) {
1158
+ this.rows.splice(rowIndex, 1, row);
1159
+ this.handleRowsChange();
1160
+ }
1105
1161
  // uses the first 'tr' of an active block as our yard stick
1106
1162
  set measureEle(el) {
1107
1163
  if (!el)
1108
1164
  return;
1109
- this.measureHeight = el.getBoundingClientRect().height;
1165
+ const potentialHeight = el.getBoundingClientRect().height;
1166
+ this.measureHeight =
1167
+ Math.abs(this.measureHeight - potentialHeight) < 5
1168
+ ? this.measureHeight
1169
+ : potentialHeight;
1110
1170
  this.unitHeight =
1111
1171
  el.querySelector('tr')?.getBoundingClientRect().height || this.unitHeight;
1112
1172
  }
@@ -1152,7 +1212,7 @@ const Table = class {
1152
1212
  this.nanoTblAfterSort.emit({ column: column, order });
1153
1213
  }
1154
1214
  async searchStart() {
1155
- this.loading = true;
1215
+ this._loading = true;
1156
1216
  const sortEvent = this.nanoTblBeforeSearch.emit({ term: this.searchTerm });
1157
1217
  if (sortEvent.defaultPrevented)
1158
1218
  return;
@@ -1166,7 +1226,7 @@ const Table = class {
1166
1226
  console.warn('search failed', e);
1167
1227
  }
1168
1228
  finally {
1169
- this.loading = false;
1229
+ this._loading = false;
1170
1230
  }
1171
1231
  }
1172
1232
  async filterStart(filters, additive = true) {
@@ -1183,7 +1243,7 @@ const Table = class {
1183
1243
  }
1184
1244
  if (this.currentFilters === JSON.stringify(this.filters))
1185
1245
  return;
1186
- this.loading = true;
1246
+ this._loading = true;
1187
1247
  const sortEvent = this.nanoTblBeforeFilter.emit({ filters: this.filters });
1188
1248
  if (sortEvent.defaultPrevented)
1189
1249
  return;
@@ -1192,12 +1252,21 @@ const Table = class {
1192
1252
  this.scrollToTop();
1193
1253
  if (this.customFilterFn) {
1194
1254
  try {
1195
- await this.customFilterFn(this.filters);
1196
- this.filterComplete();
1255
+ const res = await this.customFilterFn(this.filters);
1256
+ // if the response is 'true', the custom filter did it's thing
1257
+ // handover to finish and stop loading state.
1258
+ // if response is falsey, carry on to do a FE filter
1259
+ if (res === true) {
1260
+ this.filterComplete();
1261
+ this._loading = false;
1262
+ }
1197
1263
  }
1198
1264
  catch (e) {
1265
+ // if response errored, stop loading state
1266
+ // clear current sort cache
1199
1267
  console.warn('custom filter failed', e);
1200
1268
  this.currentFilters = '';
1269
+ this._loading = false;
1201
1270
  }
1202
1271
  return;
1203
1272
  }
@@ -1209,7 +1278,7 @@ const Table = class {
1209
1278
  console.warn('filter failed', e);
1210
1279
  }
1211
1280
  finally {
1212
- this.loading = false;
1281
+ this._loading = false;
1213
1282
  }
1214
1283
  }
1215
1284
  filterComplete() {
@@ -1297,23 +1366,33 @@ const Table = class {
1297
1366
  * These can then be hidden / shown to improve performance.
1298
1367
  */
1299
1368
  setBlocks() {
1300
- this.activeBlocks = [0, 1, 2];
1369
+ const dRows = this.store.data.state.rows;
1370
+ if (!dRows.length) {
1371
+ this.blocks = [];
1372
+ return;
1373
+ }
1301
1374
  this.ignoreIO = true;
1302
1375
  let i = 1;
1303
- const l = this.store.data.state.rows.length;
1376
+ const l = this.virtualTotalItems > dRows.length
1377
+ ? this.virtualTotalItems
1378
+ : dRows.length;
1304
1379
  let rows = [];
1305
1380
  const blocks = [];
1306
1381
  this.blockHeights = [];
1307
1382
  // old skool loop for perf
1308
1383
  for (i; i <= l; i++) {
1309
- rows.push(this.store.data.state.rows[i - 1]);
1384
+ rows.push(this.store.data.state.rows[i - 1] || { __uuid: '' });
1310
1385
  if (i % this.perBlock === 0) {
1386
+ // assign a UUID for the whole block
1387
+ // for block diffing
1311
1388
  blocks.push({ rows, __uuid: cyrb53(rows.map((b) => b.__uuid).join()) });
1312
1389
  rows = [];
1313
1390
  }
1314
1391
  }
1315
- if (rows.length)
1392
+ // any leftover rows
1393
+ if (rows.length) {
1316
1394
  blocks.push({ rows, __uuid: cyrb53(rows.map((b) => b.__uuid).join()) });
1395
+ }
1317
1396
  this.blocks = blocks;
1318
1397
  }
1319
1398
  /**
@@ -1340,11 +1419,11 @@ const Table = class {
1340
1419
  }
1341
1420
  /** cache the height for all active blocks for later renders */
1342
1421
  setBlockHeight() {
1343
- readTask(() => {
1344
- this.activeBlocks.forEach((blockIndex) => {
1345
- const el = this.blockElements[blockIndex];
1346
- if (!el)
1347
- return;
1422
+ this.activeBlocks.forEach((blockIndex) => {
1423
+ const el = this.blockElements[blockIndex];
1424
+ if (!el)
1425
+ return;
1426
+ readTask(() => {
1348
1427
  const height = el.getBoundingClientRect().height;
1349
1428
  // cache height to our block heights array
1350
1429
  // for subsequent renders
@@ -1405,15 +1484,15 @@ const Table = class {
1405
1484
  sortable: this.defaultSort,
1406
1485
  draggable: this.defaultColDraggable,
1407
1486
  } }),
1408
- ]))), this._loading && !this.blocks.length && (h("tbody", { class: `${CSSNAMESPACE}__active` }, [...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._loading && !this.blocks.length && (h("tr", null, h("th", { class: `${CSSNAMESPACE}__th`, colSpan: this.store.config.state.columns.length }, h("div", { class: "nano-tbl__cell-content nano-tbl__cell-content--no-result" }, h("slot", { name: "no-results" }, "No results found"))))), this.blocks.map((block, blockIndex) => (h("tbody", { key: block.__uuid, id: `tbody-${this.renderId}-${blockIndex}`, ref: (tb) => {
1487
+ ]))), this._loading && !this.blocks.length && (h("tbody", { class: `${CSSNAMESPACE}__active` }, [...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._loading && !this.blocks.length && (h("tr", null, h("th", { class: `${CSSNAMESPACE}__th`, colSpan: this.store.config.state.columns.length }, h("div", { class: "nano-tbl__cell-content nano-tbl__cell-content--no-result" }, h("slot", { name: "no-results" }, "No results found"))))), this.blocks.map((block, blockIndex) => (h("tbody", { key: block.__uuid, id: `tbody-${this.renderId}-${blockIndex}`, ref: (tb) => {
1409
1488
  this.blockElements.push(tb);
1410
- this.setupBlockIO(tb, blockIndex);
1489
+ requestAnimationFrame(() => this.setupBlockIO(tb, blockIndex));
1411
1490
  }, class: {
1412
1491
  [`${CSSNAMESPACE}__inactive`]: !this.activeBlocks.includes(blockIndex),
1413
1492
  [`${CSSNAMESPACE}__active`]: this.activeBlocks.includes(blockIndex),
1414
1493
  } }, this.activeBlocks.includes(blockIndex) ? (block.rows.map((row, i) => {
1415
1494
  const rowIndex = blockIndex > 0 ? blockIndex * this.perBlock + i : i;
1416
- return (h(TableRow, { rowRenderer: this.rowRender, row: row, rowIndex: rowIndex }, this.store.config.state.columns.map((_colModel, colIndex) => (h(TableCell, { rowIndex: rowIndex, colIndex: colIndex })))));
1495
+ return (h(TableRow, { rowRenderer: this.rowRender, rowModel: row, rowIndex: rowIndex }, this.store.config.state.columns.map((_colModel, colIndex) => (h(TableCell, { rowIndex: rowIndex, colIndex: colIndex })))));
1417
1496
  })) : (h("td", { colSpan: this.store.config.state.columns.length, style: {
1418
1497
  height: this.getBlockHeight(blockIndex),
1419
1498
  } }))))), this.showFooter && (h("tfoot", null, h(TableHeadFootRow, { rowRenderer: this.footRender, onColumnPinned: this.handleColumnPinned }, this.store.config.state.columns.map((colModel) => [
@@ -1430,11 +1509,12 @@ const Table = class {
1430
1509
  static get watchers() { return {
1431
1510
  "rows": ["handleRowsChange"],
1432
1511
  "columns": ["handleColsChange"],
1433
- "searchTerm": ["handleSearchTermChange"]
1512
+ "searchTerm": ["handleSearchTermChange"],
1513
+ "virtualTotalItems": ["virtualTotalItemsChangeHandler"]
1434
1514
  }; }
1435
1515
  };
1436
1516
  Table.style = tableCss;
1437
1517
 
1438
1518
  export { Table as T, createWorker as c };
1439
1519
 
1440
- //# sourceMappingURL=nano-table-95921f46.js.map
1520
+ //# sourceMappingURL=nano-table-74d627a5.js.map