@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.
Files changed (226) hide show
  1. package/CHANGELOG.md +31 -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-56eb29c1.js} +172 -88
  31. package/dist/cjs/nano-table-56eb29c1.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-b1c53001.js} +3 -3
  34. package/dist/cjs/table.worker-b1c53001.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 +236 -93
  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 +196 -103
  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 +285 -120
  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-38f3c797.js} +172 -88
  137. package/dist/esm/nano-table-38f3c797.js.map +1 -0
  138. package/dist/esm/nano-table.entry.js +1 -1
  139. package/dist/{nano-components/p-e9fb087e.js → esm/table.worker-e2f9ccfa.js} +1 -1
  140. package/dist/esm/{table.worker-769f1441.js → table.worker-e57fffd8.js} +3 -3
  141. package/dist/esm/table.worker-e57fffd8.js.map +1 -0
  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-0b29b22c.js +5 -0
  145. package/dist/nano-components/{p-26905bca.js.map → p-0b29b22c.js.map} +0 -0
  146. package/dist/nano-components/p-135fed16.entry.js +5 -0
  147. package/dist/nano-components/p-135fed16.entry.js.map +1 -0
  148. package/dist/nano-components/{p-2cb4615b.entry.js → p-2a97ef51.entry.js} +2 -2
  149. package/dist/nano-components/{p-2cb4615b.entry.js.map → p-2a97ef51.entry.js.map} +0 -0
  150. package/dist/nano-components/{p-751927d1.entry.js → p-3f25fc76.entry.js} +2 -2
  151. package/dist/nano-components/p-3f25fc76.entry.js.map +1 -0
  152. package/dist/nano-components/p-5d149792.entry.js +5 -0
  153. package/dist/nano-components/p-5d149792.entry.js.map +1 -0
  154. package/dist/nano-components/p-69e5a37d.entry.js.map +1 -1
  155. package/dist/nano-components/p-6ad194e4.entry.js +5 -0
  156. package/dist/nano-components/p-6ad194e4.entry.js.map +1 -0
  157. package/dist/nano-components/{p-46b348b7.entry.js → p-6cb77d5c.entry.js} +2 -2
  158. package/dist/nano-components/{p-46b348b7.entry.js.map → p-6cb77d5c.entry.js.map} +0 -0
  159. package/dist/nano-components/{p-85cfb0af.entry.js → p-9a4297e1.entry.js} +2 -2
  160. package/dist/nano-components/p-9a4297e1.entry.js.map +1 -0
  161. package/dist/nano-components/{p-d1c8eca4.entry.js → p-b55ffa92.entry.js} +2 -2
  162. package/dist/nano-components/p-b55ffa92.entry.js.map +1 -0
  163. package/dist/nano-components/{p-fb12a45d.entry.js → p-ba9cd047.entry.js} +2 -2
  164. package/dist/nano-components/{p-fb12a45d.entry.js.map → p-ba9cd047.entry.js.map} +0 -0
  165. package/dist/nano-components/p-cc5e7acb.entry.js +5 -0
  166. package/dist/nano-components/p-cc5e7acb.entry.js.map +1 -0
  167. package/dist/nano-components/p-cecb9af1.js +5 -0
  168. package/dist/nano-components/p-cecb9af1.js.map +1 -0
  169. package/dist/nano-components/p-d26b97d1.js +5 -0
  170. package/dist/nano-components/p-d26b97d1.js.map +1 -0
  171. package/dist/nano-components/{p-601e18d5.entry.js → p-d5303933.entry.js} +2 -2
  172. package/dist/nano-components/p-d5303933.entry.js.map +1 -0
  173. package/dist/nano-components/{p-4f0e14b5.entry.js → p-d565991d.entry.js} +2 -2
  174. package/dist/nano-components/p-d565991d.entry.js.map +1 -0
  175. package/dist/nano-components/{p-244223f0.entry.js → p-dc50b93c.entry.js} +2 -2
  176. package/dist/nano-components/p-dc50b93c.entry.js.map +1 -0
  177. package/dist/{cjs/table.worker-e9fb087e.js → nano-components/p-e2f9ccfa.js} +1 -1
  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 +49 -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
@@ -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-a4d75c46.js'); }).then(m => m.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(Object.values(row).join());
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 row = rows[rowIndex];
292
+ const rowModel = rows[rowIndex];
293
293
  return {
294
- row,
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?.colTemplate;
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 content = nestedContent || cellRender(rowIndex, colIndex);
742
- if (!content)
743
- return index.h(index.Fragment, null);
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
- index.h("div", { class: `${CSSNAMESPACE}__cell-content` }, content)));
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, row, onColumnPinned }, children, utils) => {
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: CSSNAMESPACE + '__cell-content' }, children);
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 (!row) {
781
+ if (!rowModel) {
770
782
  const model = rowDataModel(rowIndex);
771
- row = model.row;
783
+ rowModel = model.rowModel;
772
784
  }
773
785
  if (rowRenderer?.rowProperties) {
774
- extraProps = rowRenderer.rowProperties({ row, rowIndex }) || 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: row.__uuid }, children)),
786
- row,
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 = `${row.__uuid}_${i}`;
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: row.__uuid }, children));
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: CSSNAMESPACE + '__cell-content' }, children);
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, 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)}";
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.debounceSetLoading = (l) => {
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.store.config.state.columns = arrMove(fromIndex, toIndex, cols);
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.loading = true;
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
- this.sortComplete(order, column);
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.loading = false;
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 (this.ignoreIO)
1000
+ if (ioEntry.intersectionRatio === 0)
965
1001
  return;
966
- if (ioEntry.isIntersecting) {
967
- // This is a bit gross
968
- // The Intersection Observer (IO) fires in an incorrect order when the scrolling is very fast
969
- // i.e. we go past blocks 3, 2, 1 and land on 0, but 3 can fire as 'intersecting' after 0.
970
- // To fix that, we check - for realzies - if the block IS visible.
971
- // BUT that test is not as sensitive to a block being visible via the IO,
972
- // so doesn't always fire if scrolling slowly
973
- // *sigh*
974
- index.readTask(() => {
975
- if (this.scrollSpeed < 100 || isInViewport(el, 0.01)) {
976
- this.activeBlocks = [
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.nanoTblBlockRendered.emit({
982
- block: blockIndex,
983
- totalBlocks: this.blockElements.length,
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._loading = false;
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
- /** Will show a loading state when true.
1030
- * Will be shown automatically if `rows` is a promise waiting to resolve
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 loading(l) {
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.loading = true;
1083
+ this._loading = true;
1041
1084
  return;
1042
1085
  }
1043
- this.loading = true;
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.loading = false;
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
- this.measureHeight = el.getBoundingClientRect().height;
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.loading = true;
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.loading = false;
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.loading = true;
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
- this.filterComplete();
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.loading = false;
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
- this.activeBlocks = [0, 1, 2];
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.store.data.state.rows.length;
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
- if (rows.length)
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
- index.readTask(() => {
1346
- this.activeBlocks.forEach((blockIndex) => {
1347
- const el = this.blockElements[blockIndex];
1348
- if (!el)
1349
- return;
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, row: row, rowIndex: rowIndex }, this.store.config.state.columns.map((_colModel, colIndex) => (index.h(TableCell, { rowIndex: rowIndex, colIndex: colIndex })))));
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-067e0c12.js.map
1527
+ //# sourceMappingURL=nano-table-56eb29c1.js.map