@lavalogic/scoria 0.24.0 → 0.25.1

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 (31) hide show
  1. package/dist/Components/Base/ContextWrapper.svelte +1 -0
  2. package/dist/Components/Base/Pagination.svelte +28 -7
  3. package/dist/Components/Base/Pagination.svelte.d.ts +8 -0
  4. package/dist/Components/Base/PaginationProps.d.ts +4 -2
  5. package/dist/Components/Base/Snippets.svelte +3 -0
  6. package/dist/Components/Base/Snippets.svelte.d.ts +1 -0
  7. package/dist/Components/Contexts/ContextMenu.svelte +87 -8
  8. package/dist/Components/Contexts/ContextMenuOption.svelte +35 -9
  9. package/dist/Components/Contexts/ContextMenuOptionProps.d.ts +1 -0
  10. package/dist/Components/Contexts/MaybeFocusable.d.ts +3 -0
  11. package/dist/Components/Contexts/MaybeFocusable.js +1 -0
  12. package/dist/Components/Contexts/Toast.svelte +18 -10
  13. package/dist/Components/HorizontalTabGroup.svelte +0 -23
  14. package/dist/Components/NumberInput.svelte +13 -8
  15. package/dist/Components/Table/Body/Rows/Columns/TableDatePicker.svelte +28 -20
  16. package/dist/Components/Table/Body/Rows/Columns/TableQuerySelect.svelte +22 -53
  17. package/dist/Components/Table/Body/Rows/Columns/TableSelect.svelte +32 -23
  18. package/dist/Components/Table/Body/Rows/TableRow.svelte +86 -60
  19. package/dist/Components/Table/Body/Rows/TableRow.svelte.d.ts +22 -13
  20. package/dist/Components/Table/Body/TableBody.svelte +23 -28
  21. package/dist/Components/Table/Body/TableBody.svelte.d.ts +10 -2
  22. package/dist/Components/Table/Body/TableBodyProps.d.ts +2 -0
  23. package/dist/Components/Table/ColumnDefinitions/ExampleItemColumnDefRepository.svelte.js +8 -8
  24. package/dist/Components/Table/Table.svelte +54 -56
  25. package/dist/Components/Table/Types/Columns/Definitions/ColumnDef.svelte.d.ts +2 -2
  26. package/dist/Components/Table/Types/Context/TableContext.svelte.d.ts +1 -1
  27. package/dist/Components/Table/Types/Context/TableContext.svelte.js +4 -1
  28. package/dist/Components/Touch/NumberKeyboard.svelte +58 -19
  29. package/dist/Components/VerticalTabGroup.svelte +1 -29
  30. package/dist/Types/Internal/TabOption.d.ts +0 -1
  31. package/package.json +1 -1
@@ -51,33 +51,42 @@
51
51
  );
52
52
 
53
53
  let isBeingEdited = $derived(false);
54
+
55
+ function handleIsEditable(isEditable: boolean): Promise<void> {
56
+ if (isEditable) {
57
+ return tick().then(() => {
58
+ isBeingEdited = true;
59
+ });
60
+ } else {
61
+ if (isBeingEdited) {
62
+ return tick()
63
+ .then(() => {
64
+ if (!tableContext.singleClickEditing) {
65
+ tableContext.focusStartIsBeingEdited = false;
66
+ }
67
+
68
+ isBeingEdited = false;
69
+ })
70
+ .catch(devCatch);
71
+ }
72
+ }
73
+
74
+ return Promise.resolve();
75
+ }
76
+
54
77
  $effect(() => {
55
78
  void editable;
56
79
  if (wantsToBeEdited) {
57
- editable
58
- .then((isEditable) => {
59
- if (isEditable) {
60
- return tick().then(() => {
61
- isBeingEdited = true;
62
- });
63
- } else {
64
- if (isBeingEdited) {
65
- return tick()
66
- .then(() => {
67
- if (!tableContext.singleClickEditing) {
68
- tableContext.focusStartIsBeingEdited = false;
69
- }
70
-
71
- isBeingEdited = false;
72
- })
73
- .catch(devCatch);
74
- }
75
- }
76
-
77
- return;
78
- })
80
+ if (editable instanceof Promise) {
81
+ editable
82
+ .then((isEditable) => {
83
+ return handleIsEditable(isEditable);
84
+ })
79
85
 
80
- .catch(devCatch);
86
+ .catch(devCatch);
87
+ } else {
88
+ handleIsEditable(editable).catch(devCatch);
89
+ }
81
90
  } else {
82
91
  tick()
83
92
  .then(() => {
@@ -2,7 +2,7 @@
2
2
 
3
3
  <script
4
4
  lang="ts"
5
- generics="T extends object"
5
+ generics="T extends object, RowIdType extends Primitive"
6
6
  >
7
7
  import { dev } from '$app/environment';
8
8
  import { devCatch, generateShortUUID } from '../../../../Helpers/Helpers.svelte.js';
@@ -12,10 +12,12 @@
12
12
  import type { DefsWrapper } from '../../Types/Columns/DefsWrapper.js';
13
13
  import type { TableCell } from '../../Types/Columns/TableCell.js';
14
14
  import { TableContext } from '../../Types/Context/TableContext.svelte.js';
15
+ import { type Primitive } from '../../Types/Context/TableInitOptions.js';
15
16
  import ColumnHighlight from './ColumnHighlight.svelte';
16
17
  import TableColumn from './Columns/TableColumn.svelte';
17
18
  import type { TableRowProps } from './TableRowProps.js';
18
- const tableContext = getContext<TableContext<T, never>>(TableContext.identifier);
19
+
20
+ const tableContext = getContext<TableContext<T, RowIdType>>(TableContext.identifier);
19
21
 
20
22
  const { row, side, odd = false, customHeight, includeHighlight }: TableRowProps<T> = $props();
21
23
 
@@ -50,10 +52,28 @@
50
52
  let prevExpandedColumnDef: ExpandDef<T, object> | undefined = $state();
51
53
 
52
54
  const rowIndex = $derived(cells.at(0) && cells[0].row.visibleIndex);
53
- const highlighted = $derived(
54
- rowIndex != undefined &&
55
- tableContext.highlightedItems.has(tableContext.selectionExtractor(row.original))
56
- );
55
+ let id = $state<RowIdType | undefined>();
56
+ const highlighted = $derived(id != undefined && tableContext.highlightedItems.has(id));
57
+
58
+ $effect(() => {
59
+ void row.original;
60
+ void tableContext.selectionExtractor;
61
+
62
+ if (rowIndex != undefined) {
63
+ const maybePromise = tableContext.selectionExtractor(row.original);
64
+ if (maybePromise instanceof Promise) {
65
+ maybePromise
66
+ .then((it) => {
67
+ id = it;
68
+ })
69
+ .catch(devCatch);
70
+ } else {
71
+ id = maybePromise;
72
+ }
73
+ } else {
74
+ id = undefined;
75
+ }
76
+ });
57
77
 
58
78
  const showHighlightButton = $derived(rowIndex != null && includeHighlight);
59
79
 
@@ -94,66 +114,70 @@
94
114
  }
95
115
  }
96
116
 
97
- //FIXME the below threw errors before. Please investigate
98
- // let trRef: HTMLTableRowElement | undefined = $state();
99
- // let _trHeight = $state(0);
100
- // export const trHeight = {
101
- // get value() {
102
- // return _trHeight;
103
- // },
104
- // };
105
-
106
- // $effect(() => {
107
- // void trRef;
108
- // return untrack(() => {
109
- // if (trRef) {
110
- // const observer = new ResizeObserver((entries) => {
111
- // if (customHeight) {
112
- // _trHeight = 0;
113
- // } else {
114
- // _trHeight = entries[0].borderBoxSize[0].blockSize;
115
- // }
116
- // });
117
- // observer.observe(trRef);
118
-
119
- // const currentTrRef = trRef;
120
- // return () => {
121
- // observer.unobserve(currentTrRef);
122
- // };
123
- // }
124
- // return () => {};
125
- // });
126
- // });
127
-
128
- // let innerTrRef: HTMLTableRowElement | undefined = $state();
129
- // let _innerTrHeight = $state(0);
130
- // export const innerTrHeight = {
131
- // get value() {
132
- // return _innerTrHeight;
133
- // }
134
- // };
135
- // $effect(() => {
136
- // if (innerTrRef) {
137
- // const observer = new ResizeObserver((entries) => {
138
- // _innerTrHeight = entries[0].borderBoxSize[0].blockSize;
139
- // });
140
- // observer.observe(innerTrRef);
141
-
142
- // const currentinnerTrRef = innerTrRef;
143
- // return () => observer.unobserve(currentTrRef);
144
- // }
145
- // });
117
+ let trRef: HTMLTableRowElement | undefined = $state();
118
+ let _trHeight = $state(0);
119
+
120
+ let innerTrRef: HTMLTableRowElement | undefined = $state();
121
+ let _innerTrHeight = $state(0);
122
+
123
+ $effect(() => {
124
+ void trRef;
125
+ void customHeight;
126
+
127
+ return untrack(() => {
128
+ if (trRef && customHeight == null) {
129
+ const observer = new ResizeObserver((entries) => {
130
+ _trHeight = entries[0].borderBoxSize[0].blockSize;
131
+ });
132
+ observer.observe(trRef);
133
+
134
+ const currenttrRef = trRef;
135
+ return () => {
136
+ observer.unobserve(currenttrRef);
137
+ _trHeight = 0;
138
+ };
139
+ } else {
140
+ _trHeight = 0;
141
+ }
142
+ return () => {};
143
+ });
144
+ });
145
+
146
+ $effect(() => {
147
+ void innerTrRef;
148
+ return untrack(() => {
149
+ if (innerTrRef) {
150
+ const observer = new ResizeObserver((entries) => {
151
+ _innerTrHeight = entries[0].borderBoxSize[0].blockSize;
152
+ });
153
+ observer.observe(innerTrRef);
154
+
155
+ const currentinnerTrRef = innerTrRef;
156
+ return () => {
157
+ observer.unobserve(currentinnerTrRef);
158
+ };
159
+ } else {
160
+ _innerTrHeight = 0;
161
+ }
162
+ return () => {};
163
+ });
164
+ });
165
+
166
+ const _totalTrHeight = $derived(_trHeight + _innerTrHeight);
167
+ export const totalTrHeight = {
168
+ get value() {
169
+ return _totalTrHeight;
170
+ },
171
+ };
146
172
  </script>
147
173
 
148
- <!-- onMouseEnter={onMouseEnter}
149
- onMouseLeave={onMouseLeave} -->
150
174
  <tr
151
175
  class:hoverable
152
176
  class:alt={tableContext.alternateRowColours && odd}
153
177
  class:highlighted
154
178
  style={customHeight ? `height: ${customHeight}px !important;` : null}
179
+ bind:this={trRef}
155
180
  >
156
- <!-- bind:this={trRef} -->
157
181
  {#if showHighlightButton}
158
182
  <ColumnHighlight
159
183
  rowIndex={rowIndex ??
@@ -181,8 +205,10 @@ onMouseLeave={onMouseLeave} -->
181
205
  {#if expandedColumnDef}
182
206
  <!-- TODO re-test and re-implement these -->
183
207
  <!-- transition:slide={{ duration: 150, axis: 'y', delay: 0 }} -->
184
- <!-- bind:this={innerTrRef} -->
185
- <tr class="inner-table">
208
+ <tr
209
+ class="inner-table"
210
+ bind:this={innerTrRef}
211
+ >
186
212
  {#await innerDataPromise}
187
213
  <td {colspan}>loading&hellip;</td>
188
214
  {:then data}
@@ -1,25 +1,34 @@
1
+ import { type Primitive } from '../../Types/Context/TableInitOptions.js';
1
2
  import type { TableRowProps } from './TableRowProps.js';
2
- declare function $$render<T extends object>(): {
3
+ declare function $$render<T extends object, RowIdType extends Primitive>(): {
3
4
  props: TableRowProps<T>;
4
- exports: {};
5
+ exports: {
6
+ totalTrHeight: {
7
+ readonly value: number;
8
+ };
9
+ };
5
10
  bindings: "";
6
11
  slots: {};
7
12
  events: {};
8
13
  };
9
- declare class __sveltets_Render<T extends object> {
10
- props(): ReturnType<typeof $$render<T>>['props'];
11
- events(): ReturnType<typeof $$render<T>>['events'];
12
- slots(): ReturnType<typeof $$render<T>>['slots'];
14
+ declare class __sveltets_Render<T extends object, RowIdType extends Primitive> {
15
+ props(): ReturnType<typeof $$render<T, RowIdType>>['props'];
16
+ events(): ReturnType<typeof $$render<T, RowIdType>>['events'];
17
+ slots(): ReturnType<typeof $$render<T, RowIdType>>['slots'];
13
18
  bindings(): "";
14
- exports(): {};
19
+ exports(): {
20
+ totalTrHeight: {
21
+ readonly value: number;
22
+ };
23
+ };
15
24
  }
16
25
  interface $$IsomorphicComponent {
17
- new <T extends object>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T>['props']>, ReturnType<__sveltets_Render<T>['events']>, ReturnType<__sveltets_Render<T>['slots']>> & {
18
- $$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
19
- } & ReturnType<__sveltets_Render<T>['exports']>;
20
- <T extends object>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
21
- z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
26
+ new <T extends object, RowIdType extends Primitive>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T, RowIdType>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T, RowIdType>['props']>, ReturnType<__sveltets_Render<T, RowIdType>['events']>, ReturnType<__sveltets_Render<T, RowIdType>['slots']>> & {
27
+ $$bindings?: ReturnType<__sveltets_Render<T, RowIdType>['bindings']>;
28
+ } & ReturnType<__sveltets_Render<T, RowIdType>['exports']>;
29
+ <T extends object, RowIdType extends Primitive>(internal: unknown, props: ReturnType<__sveltets_Render<T, RowIdType>['props']> & {}): ReturnType<__sveltets_Render<T, RowIdType>['exports']>;
30
+ z_$$bindings?: ReturnType<__sveltets_Render<any, any>['bindings']>;
22
31
  }
23
32
  declare const TableRow: $$IsomorphicComponent;
24
- type TableRow<T extends object> = InstanceType<typeof TableRow<T>>;
33
+ type TableRow<T extends object, RowIdType extends Primitive> = InstanceType<typeof TableRow<T, RowIdType>>;
25
34
  export default TableRow;
@@ -4,38 +4,34 @@
4
4
  lang="ts"
5
5
  generics="T extends object"
6
6
  >
7
+ import type { RefWrapper } from '../../../Types/Internal/RefWrapper.js';
7
8
  import { getContext } from 'svelte';
8
9
  import { TableContext } from '../Types/Context/TableContext.svelte.js';
9
10
  import QuickSearchCell from './QuickSearchCell.svelte';
10
11
  import TableRow from './Rows/TableRow.svelte';
11
12
  import type { TableBodyProps } from './TableBodyProps.js';
12
13
 
13
- let {
14
- side,
15
- // heights,
16
- columns,
17
- includeHighlight,
18
- }: TableBodyProps<T> = $props();
14
+ let { side, heights, columns, includeHighlight }: TableBodyProps<T> = $props();
19
15
 
20
16
  const tableContext = getContext<TableContext<T, never>>(TableContext.identifier);
21
17
 
22
- // type HasHeight = {
23
- // trHeight: RefWrapper<number>;
24
- // };
25
- // const rows: Array<TableRow<T>> = $state([]);
26
- // const _rowHeights = $derived(
27
- // // HACK terrible type casting due to svelte type gen not being liked by eslint
28
- // rows.map((it) => (it as HasHeight | undefined)?.trHeight.value ?? 0)
29
- // );
30
- // export const rowHeights = {
31
- // get value() {
32
- // return _rowHeights;
33
- // }
34
- // };
18
+ type HasHeight = {
19
+ totalTrHeight?: RefWrapper<number>;
20
+ };
21
+ const rows: Array<TableRow<T, never>> = $state([]);
35
22
 
36
- // $inspect(tableContext.paginationRowModel).with((...v) => {
37
- // console.trace(...v);
38
- // });
23
+ const _rowHeights = $derived(
24
+ // HACK terrible type casting due to svelte type gen not being liked by eslint
25
+ rows.map((it) => {
26
+ return (it as HasHeight | undefined)?.totalTrHeight?.value ?? 0;
27
+ })
28
+ );
29
+
30
+ export const rowHeights = {
31
+ get value() {
32
+ return _rowHeights;
33
+ },
34
+ };
39
35
  </script>
40
36
 
41
37
  <tbody>
@@ -54,18 +50,17 @@
54
50
  {/if}
55
51
 
56
52
  {#each tableContext.paginationRowModel.rows as row, index (row.visibleIndex)}
57
- <!-- {@const customHeight = heights[index]?.applyTo.includes(side)
58
- ? heights[index].maxHeight
59
- : undefined} -->
60
- <!-- {customHeight} -->
53
+ {@const customHeight = heights[index]?.applyTo.includes(side)
54
+ ? heights[index].maxHeight
55
+ : undefined}
61
56
  <TableRow
62
- customHeight={undefined}
57
+ {customHeight}
63
58
  {includeHighlight}
64
59
  {row}
65
60
  {side}
66
61
  odd={index % 2 == 1}
62
+ bind:this={rows[index]}
67
63
  />
68
- <!-- bind:this={rows[index]} -->
69
64
  {/each}
70
65
  </tbody>
71
66
 
@@ -1,7 +1,11 @@
1
1
  import type { TableBodyProps } from './TableBodyProps.js';
2
2
  declare function $$render<T extends object>(): {
3
3
  props: TableBodyProps<T>;
4
- exports: {};
4
+ exports: {
5
+ rowHeights: {
6
+ readonly value: number[];
7
+ };
8
+ };
5
9
  bindings: "";
6
10
  slots: {};
7
11
  events: {};
@@ -11,7 +15,11 @@ declare class __sveltets_Render<T extends object> {
11
15
  events(): ReturnType<typeof $$render<T>>['events'];
12
16
  slots(): ReturnType<typeof $$render<T>>['slots'];
13
17
  bindings(): "";
14
- exports(): {};
18
+ exports(): {
19
+ rowHeights: {
20
+ readonly value: number[];
21
+ };
22
+ };
15
23
  }
16
24
  interface $$IsomorphicComponent {
17
25
  new <T extends object>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T>['props']>, ReturnType<__sveltets_Render<T>['events']>, ReturnType<__sveltets_Render<T>['slots']>> & {
@@ -1,6 +1,8 @@
1
1
  import type { Column } from '../Types/Columns/Column.js';
2
+ import type { HeightData } from './HeightData.js';
2
3
  export interface TableBodyProps<T extends object> {
3
4
  side: 'left' | 'centre' | 'right';
5
+ heights: Array<HeightData<T>>;
4
6
  columns: Array<Column<T>>;
5
7
  includeHighlight: boolean;
6
8
  }
@@ -60,7 +60,7 @@ export function generateExampleItemColumnDefs(modal) {
60
60
  new ValidityDef({
61
61
  header: 'Valid',
62
62
  id: 'valid',
63
- debug: true,
63
+ // debug: true,
64
64
  isValid,
65
65
  modal,
66
66
  }),
@@ -82,7 +82,7 @@ export function generateExampleItemColumnDefs(modal) {
82
82
  getDisplayValue: (item) => {
83
83
  return item.simulatedQuery?.value ?? null;
84
84
  },
85
- isEditable: () => Promise.resolve(true),
85
+ isEditable: () => true,
86
86
  id: 'simulatedQuery',
87
87
  query: async (_v, item) => {
88
88
  void item.someDate;
@@ -101,13 +101,13 @@ export function generateExampleItemColumnDefs(modal) {
101
101
  new TextInputDef({
102
102
  header: 'Name',
103
103
  id: 'name',
104
- isEditable: () => Promise.resolve(true),
104
+ isEditable: () => true,
105
105
  isValid,
106
106
  }),
107
107
  new NumberInputDef({
108
108
  header: 'Some Number',
109
109
  id: 'someNumber',
110
- isEditable: () => Promise.resolve(true),
110
+ isEditable: () => true,
111
111
  min: 0,
112
112
  max: 12345,
113
113
  isValid,
@@ -150,20 +150,20 @@ export function generateExampleItemColumnDefs(modal) {
150
150
  new DateInputDef({
151
151
  header: 'Some Date With Time',
152
152
  id: 'someDateWithTime',
153
- isEditable: () => Promise.resolve(true),
153
+ isEditable: () => true,
154
154
  showTime: true,
155
155
  isValid,
156
156
  }),
157
157
  new DateInputDef({
158
158
  header: 'Flo Date',
159
159
  id: 'floDate',
160
- isEditable: () => Promise.resolve(true),
160
+ isEditable: () => true,
161
161
  defaultHidden: true,
162
162
  }),
163
163
  new DateInputDef({
164
164
  header: 'Flo Date With Time',
165
165
  id: 'floDateWithTime',
166
- isEditable: () => Promise.resolve(true),
166
+ isEditable: () => true,
167
167
  defaultHidden: true,
168
168
  showTime: true,
169
169
  isValid,
@@ -194,7 +194,7 @@ export function generateExampleItemColumnDefs(modal) {
194
194
  ];
195
195
  },
196
196
  getDisplayValue: (item) => item.someSelect,
197
- isEditable: () => Promise.resolve(true),
197
+ isEditable: () => true,
198
198
  isValid,
199
199
  }),
200
200
  new BubbleDef({
@@ -12,6 +12,7 @@
12
12
  import type { RefWrapper } from '../../Types/Internal/RefWrapper.js';
13
13
  import { getContext, onMount, setContext, tick, untrack } from 'svelte';
14
14
  import LoadingOverlay from '../LoadingOverlay.svelte';
15
+ import type { HeightData } from './Body/HeightData.js';
15
16
  import { shownPopup } from './Body/Rows/Columns/ActionsCell.svelte';
16
17
  import TableBody from './Body/TableBody.svelte';
17
18
  import TableHead from './Headers/TableHead.svelte';
@@ -48,6 +49,7 @@
48
49
  const { nested = false, tableContext }: TableProps<T, IdType> = $props();
49
50
 
50
51
  // NOTE: known limitation. This is passed as a wrapper, and they should never require reassignment. It is deeply reactive
52
+ // svelte-ignore state_referenced_locally
51
53
  setContext(TableContext.identifier, tableContext);
52
54
 
53
55
  const { openContextMenu: _openContextMenu } = getContext<ContextMenuContext>(
@@ -181,16 +183,7 @@
181
183
  const minNestedHeight = $derived(20 * remPxRatio);
182
184
 
183
185
  // HACK please figure this one out
184
- // let nestedHeight = $state(minNestedHeight);
185
-
186
- //intentionally not using derived here as we sometimes need to manually change it
187
- // while also allowing it to auto-pickup min height mutations
188
- // eslint-disable-next-line svelte/prefer-writable-derived
189
- let nestedHeight = $state(0);
190
-
191
- $effect(() => {
192
- nestedHeight = minNestedHeight;
193
- });
186
+ let nestedHeight = $derived(minNestedHeight);
194
187
 
195
188
  let tableRef: HTMLDivElement | undefined = undefined;
196
189
  let mousedDownEmptySpace = $state(false);
@@ -275,46 +268,51 @@
275
268
  }
276
269
  });
277
270
 
278
- // type SvelteTableElement = {
279
- // rowHeights: RefWrapper<Array<number>>;
280
- // };
281
-
282
- // let leftTable: SvelteTableElement | undefined = $state();
283
- // let centreTable: SvelteTableElement | undefined = $state();
284
- // let rightTable: SvelteTableElement | undefined = $state();
285
-
286
- // const totalRowSizes: Array<HeightData<T>> = $derived.by(() => {
287
- // if (!leftTable || !centreTable || !rightTable) {
288
- // return [];
289
- // }
290
- // const centre = centreTable.rowHeights.value;
291
- // const right = rightTable.rowHeights.value;
292
-
293
- // return leftTable.rowHeights.value.map((_leftHeight, index) => {
294
- // const leftHeight = _leftHeight || 0;
295
- // const centreHeight = centre[index] || 0;
296
- // const rightHeight = right[index] || 0;
297
-
298
- // const maxHeight = Math.max(leftHeight, centreHeight, rightHeight);
299
- // const applyTo: HeightData<T>['applyTo'] = [];
300
-
301
- // if (leftHeight < maxHeight) {
302
- // applyTo.push('left');
303
- // }
304
- // if (centreHeight < maxHeight) {
305
- // applyTo.push('centre');
306
- // }
307
- // if (rightHeight < maxHeight) {
308
- // applyTo.push('right');
309
- // }
310
-
311
- // return {
312
- // index,
313
- // applyTo,
314
- // maxHeight
315
- // };
316
- // });
317
- // });
271
+ type SvelteTableElement = {
272
+ rowHeights: RefWrapper<Array<number>>;
273
+ };
274
+
275
+ let leftTable: SvelteTableElement | undefined = $state();
276
+ let centreTable: SvelteTableElement | undefined = $state();
277
+ let rightTable: SvelteTableElement | undefined = $state();
278
+
279
+ const totalRowSizes: Array<HeightData<T>> = $derived.by(() => {
280
+ if (!leftTable || !centreTable || !rightTable) {
281
+ return [];
282
+ }
283
+
284
+ // console.debug(`got refs for all tables`);
285
+ const centre = centreTable.rowHeights.value;
286
+ const right = rightTable.rowHeights.value;
287
+
288
+ return leftTable.rowHeights.value.map((_leftHeight, index) => {
289
+ const leftHeight = _leftHeight || 0;
290
+ const centreHeight = centre[index] || 0;
291
+ const rightHeight = right[index] || 0;
292
+
293
+ const maxHeight = Math.max(leftHeight, centreHeight, rightHeight);
294
+ const applyTo: HeightData<T>['applyTo'] = [];
295
+
296
+ if (leftHeight < maxHeight) {
297
+ // console.debug(`left (${leftHeight}) was lower than max (${maxHeight})`);
298
+ applyTo.push('left');
299
+ }
300
+ if (centreHeight < maxHeight) {
301
+ // console.debug(`centre (${centreHeight}) was lower than max (${maxHeight})`);
302
+ applyTo.push('centre');
303
+ }
304
+ if (rightHeight < maxHeight) {
305
+ // console.debug(`right (${rightHeight}) was lower than max (${maxHeight})`);
306
+ applyTo.push('right');
307
+ }
308
+
309
+ return {
310
+ index,
311
+ applyTo,
312
+ maxHeight,
313
+ };
314
+ });
315
+ });
318
316
  </script>
319
317
 
320
318
  <svelte:window
@@ -427,9 +425,9 @@
427
425
  includeHighlight={appropriateSide == 'left'}
428
426
  columns={leftColumns}
429
427
  side="left"
428
+ heights={totalRowSizes}
429
+ bind:this={leftTable}
430
430
  />
431
- <!-- heights={totalRowSizes} -->
432
- <!-- bind:this={leftTable} -->
433
431
  </table>
434
432
  <!-- {/if} -->
435
433
 
@@ -447,9 +445,9 @@
447
445
  includeHighlight={appropriateSide == 'centre'}
448
446
  columns={centreColumns}
449
447
  side="centre"
448
+ heights={totalRowSizes}
449
+ bind:this={centreTable}
450
450
  />
451
- <!-- heights={totalRowSizes}
452
- bind:this={centreTable} -->
453
451
  </table>
454
452
  <!-- {/if} -->
455
453
 
@@ -466,9 +464,9 @@
466
464
  includeHighlight={appropriateSide == 'right'}
467
465
  columns={rightColumns}
468
466
  side="right"
467
+ heights={totalRowSizes}
468
+ bind:this={rightTable}
469
469
  />
470
- <!-- heights={totalRowSizes}
471
- bind:this={rightTable} -->
472
470
  </table>
473
471
  <!-- {/if} -->
474
472
  </div>
@@ -17,7 +17,7 @@ export interface ColumnDefProps<T extends object, in FilterFnType, out OptionsTy
17
17
  defaultHidden?: boolean;
18
18
  minSize?: Pixels;
19
19
  width?: Pixels;
20
- isEditable?: (item: T, index: number) => Promise<boolean>;
20
+ isEditable?: (item: T, index: number) => boolean | Promise<boolean>;
21
21
  resizable?: boolean;
22
22
  isValid?: ValidationFn<T>;
23
23
  filterFn?: FilterFn<T, FilterFnType>;
@@ -57,7 +57,7 @@ export declare abstract class ColumnDef<T extends object, in FilterFnType = neve
57
57
  set filterValueType(v: FilterValueType | undefined);
58
58
  readonly getDisplayValue: ((item: T, index: number) => string | null | Promise<string | null>) | undefined;
59
59
  toJSON(): ColumnJSONRepresentation;
60
- readonly isEditable: (item: T, index: number) => Promise<boolean>;
60
+ readonly isEditable: (item: T, index: number) => boolean | Promise<boolean>;
61
61
  readonly resizable: boolean;
62
62
  readonly header: string | Snippet;
63
63
  readonly getOptions?: () => Array<SelectOption<OptionsType>> | Promise<Array<SelectOption<OptionsType>>>;