@nanoporetech-digital/components 3.5.0 → 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 +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-83e46f68.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-525ec230.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-e2405350.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-739c193f.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-a71989f3.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-e4a28360.entry.js → p-f5ee07b3.entry.js} +2 -2
  177. package/dist/nano-components/{p-e4a28360.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 +3 -3
  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-83e46f68.js.map +0 -1
  198. package/dist/cjs/nano-tooltip.cjs.entry.js.map +0 -1
  199. package/dist/cjs/table.worker-525ec230.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-e2405350.js.map +0 -1
  204. package/dist/esm/nano-tooltip.entry.js.map +0 -1
  205. package/dist/esm/table.worker-739c193f.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-28fdfa6b.js +0 -5
  210. package/dist/nano-components/p-28fdfa6b.js.map +0 -1
  211. package/dist/nano-components/p-4f0e14b5.entry.js.map +0 -1
  212. package/dist/nano-components/p-601e18d5.entry.js.map +0 -1
  213. package/dist/nano-components/p-751927d1.entry.js.map +0 -1
  214. package/dist/nano-components/p-85cfb0af.entry.js.map +0 -1
  215. package/dist/nano-components/p-9e8c9bac.entry.js +0 -5
  216. package/dist/nano-components/p-9e8c9bac.entry.js.map +0 -1
  217. package/dist/nano-components/p-a2e38472.entry.js +0 -5
  218. package/dist/nano-components/p-a2e38472.entry.js.map +0 -1
  219. package/dist/nano-components/p-a71989f3.js +0 -5
  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-525ec230.js'); }).then(m => m.worker);
115
+ const workerPromise = Promise.resolve().then(function () { return require('./table.worker-dadd1eb0.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,33 @@ 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);
901
+ this.nanoTblBeforeEdit = index.createEvent(this, "nanoTblBeforeEdit", 7);
885
902
  this.debounceSetLoading = (l) => {
886
- this._loading = l;
903
+ this.internalLoading = l;
887
904
  };
888
905
  this.renderId = 'tbl-' + id++;
889
906
  this.filters = [];
890
907
  this.currentFilters = '[]';
891
908
  this.currentSort = '';
909
+ this.measureHeight = 0;
892
910
  this.blockIos = new WeakMap();
893
911
  this.blockHeights = [];
894
912
  this.unitHeight = 0;
895
913
  // Scroll / IO used for hiding / showing blocks
896
914
  this.ignoreIO = true;
897
915
  this._isReady = false;
916
+ /**
917
+ * Fired when a column is dragged
918
+ * @param column
919
+ */
898
920
  this.colDrag = (column) => {
899
921
  this.nanoTblColDrag.emit({ column });
900
922
  };
923
+ /**
924
+ * Fired when a column is dropped after being dragged
925
+ * @param fromCol
926
+ * @param toCol
927
+ */
901
928
  this.colDrop = (fromCol, toCol) => {
902
929
  const cols = this.store.config.state.columns;
903
930
  const toIndex = cols.findIndex((col) => col.prop === toCol);
@@ -910,7 +937,7 @@ const Table = class {
910
937
  });
911
938
  if (dropEvent.defaultPrevented)
912
939
  return;
913
- this.store.config.state.columns = arrMove(fromIndex, toIndex, cols);
940
+ this.columns = arrMove(fromIndex, toIndex, cols);
914
941
  };
915
942
  /**
916
943
  * Start a sort - can be cancelled by `preventDefault`
@@ -922,7 +949,7 @@ const Table = class {
922
949
  // did order change?
923
950
  if (this.currentSort === order + ':' + column)
924
951
  return;
925
- this.loading = true;
952
+ this._loading = true;
926
953
  const sortEvent = this.nanoTblBeforeSort.emit({ column: column, order });
927
954
  if (sortEvent.defaultPrevented)
928
955
  return;
@@ -931,13 +958,24 @@ const Table = class {
931
958
  this.scrollToTop(element);
932
959
  if (this.customSortFn) {
933
960
  try {
934
- await this.customSortFn(column, order);
935
- this.sortComplete(order, column);
961
+ const res = await this.customSortFn(column, order);
962
+ // if the response is 'true', the custom sort did it's thing
963
+ // handover to finish and stop loading state.
964
+ // if response is falsey, carry on to do a FE sort
965
+ if (res === true) {
966
+ this.sortComplete(order, column);
967
+ this._loading = false;
968
+ return;
969
+ }
936
970
  }
937
971
  catch (e) {
972
+ // if response errored, stop loading state
973
+ // clear current sort cache
938
974
  console.warn('custom sort failed', e);
975
+ this.currentSort = '';
976
+ this._loading = false;
977
+ return;
939
978
  }
940
- return;
941
979
  }
942
980
  try {
943
981
  await storeSort(this.host, column, order);
@@ -948,7 +986,8 @@ const Table = class {
948
986
  this.currentSort = '';
949
987
  }
950
988
  finally {
951
- this.loading = false;
989
+ if (this.blocks.length)
990
+ this._loading = false;
952
991
  }
953
992
  };
954
993
  /**
@@ -961,31 +1000,35 @@ const Table = class {
961
1000
  if (!el || this.blockIos.has(el))
962
1001
  return;
963
1002
  const blockIo = new IntersectionObserver(([ioEntry]) => {
964
- if (this.ignoreIO)
1003
+ if (ioEntry.intersectionRatio === 0)
965
1004
  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 = [
1005
+ // This is a bit gross
1006
+ // The Intersection Observer (IO) fires in an incorrect order when the scrolling is very fast
1007
+ // i.e. we go past blocks 3, 2, 1 and land on 0, but 3 can fire as 'intersecting' after 0.
1008
+ // To fix that, we check - for realzies - if the block IS visible.
1009
+ // BUT that test is not as sensitive to a block being visible via the IO,
1010
+ // so doesn't always fire if scrolling slowly
1011
+ // *sigh*
1012
+ index.readTask(() => {
1013
+ if (this.scrollSpeed < 100 || isInViewport(el, 0.01)) {
1014
+ if (!this.ignoreIO) {
1015
+ const potentialBlocks = [
977
1016
  blockIndex,
978
1017
  blockIndex + 1,
979
1018
  Math.max(0, blockIndex - 1),
980
1019
  ];
981
- this.nanoTblBlockRendered.emit({
982
- block: blockIndex,
983
- totalBlocks: this.blockElements.length,
984
- });
985
- requestAnimationFrame(() => this.setBlockHeight());
1020
+ if (potentialBlocks.toString() !== this.activeBlocks.toString()) {
1021
+ this.activeBlocks = potentialBlocks;
1022
+ this.setBlockHeight();
1023
+ }
986
1024
  }
987
- });
988
- }
1025
+ // fire the event regardless
1026
+ this.nanoTblBlockRendered.emit({
1027
+ block: blockIndex,
1028
+ totalBlocks: this.blockElements.length,
1029
+ });
1030
+ }
1031
+ });
989
1032
  }, {
990
1033
  threshold: [0],
991
1034
  root: this.scrollParent === document.scrollingElement
@@ -1007,7 +1050,8 @@ const Table = class {
1007
1050
  this.type = 'table';
1008
1051
  this.caption = undefined;
1009
1052
  this.showCaption = false;
1010
- this._loading = false;
1053
+ this.loading = undefined;
1054
+ this.internalLoading = false;
1011
1055
  this.placeholderSize = 5;
1012
1056
  this.rows = undefined;
1013
1057
  this.columns = [];
@@ -1021,26 +1065,25 @@ const Table = class {
1021
1065
  this.customSortFn = undefined;
1022
1066
  this.defaultSort = true;
1023
1067
  this.defaultColDraggable = false;
1068
+ this.virtualTotalItems = 0;
1024
1069
  this.blocks = [];
1025
1070
  this.activeBlocks = [0, 1, 2];
1026
- this.measureHeight = 0;
1027
1071
  this.debounceSetLoading = throttle.debounce(this.debounceSetLoading.bind(this), 50);
1028
1072
  }
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;
1073
+ get _loading() {
1074
+ return this.loading !== undefined ? this.loading : this.internalLoading;
1034
1075
  }
1035
- set loading(l) {
1076
+ set _loading(l) {
1077
+ if (this.loading !== undefined)
1078
+ return;
1036
1079
  this.debounceSetLoading(l);
1037
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
@@ -1407,15 +1486,15 @@ const Table = class {
1407
1486
  sortable: this.defaultSort,
1408
1487
  draggable: this.defaultColDraggable,
1409
1488
  } }),
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) => {
1489
+ ]))), 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
1490
  this.blockElements.push(tb);
1412
- this.setupBlockIO(tb, blockIndex);
1491
+ requestAnimationFrame(() => this.setupBlockIO(tb, blockIndex));
1413
1492
  }, class: {
1414
1493
  [`${CSSNAMESPACE}__inactive`]: !this.activeBlocks.includes(blockIndex),
1415
1494
  [`${CSSNAMESPACE}__active`]: this.activeBlocks.includes(blockIndex),
1416
1495
  } }, this.activeBlocks.includes(blockIndex) ? (block.rows.map((row, i) => {
1417
1496
  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 })))));
1497
+ 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 })))));
1419
1498
  })) : (index.h("td", { colSpan: this.store.config.state.columns.length, style: {
1420
1499
  height: this.getBlockHeight(blockIndex),
1421
1500
  } }))))), this.showFooter && (index.h("tfoot", null, index.h(TableHeadFootRow, { rowRenderer: this.footRender, onColumnPinned: this.handleColumnPinned }, this.store.config.state.columns.map((colModel) => [
@@ -1432,7 +1511,8 @@ const Table = class {
1432
1511
  static get watchers() { return {
1433
1512
  "rows": ["handleRowsChange"],
1434
1513
  "columns": ["handleColsChange"],
1435
- "searchTerm": ["handleSearchTermChange"]
1514
+ "searchTerm": ["handleSearchTermChange"],
1515
+ "virtualTotalItems": ["virtualTotalItemsChangeHandler"]
1436
1516
  }; }
1437
1517
  };
1438
1518
  Table.style = tableCss;
@@ -1440,4 +1520,4 @@ Table.style = tableCss;
1440
1520
  exports.Table = Table;
1441
1521
  exports.createWorker = createWorker;
1442
1522
 
1443
- //# sourceMappingURL=nano-table-83e46f68.js.map
1523
+ //# sourceMappingURL=nano-table-b031ec24.js.map