@universal-ember/table 3.0.0 → 3.0.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 (168) hide show
  1. package/dist/-private/-type-tests/plugin-properties.test.js +27 -0
  2. package/dist/-private/-type-tests/plugin-properties.test.js.map +1 -0
  3. package/dist/-private/-type-tests/plugin-with.test.js +20 -0
  4. package/dist/-private/-type-tests/plugin-with.test.js.map +1 -0
  5. package/dist/-private/-type-tests/plugins-accessors.test.js +36 -0
  6. package/dist/-private/-type-tests/plugins-accessors.test.js.map +1 -0
  7. package/dist/-private/-type-tests/plugins-signature-from.test.js +15 -0
  8. package/dist/-private/-type-tests/plugins-signature-from.test.js.map +1 -0
  9. package/dist/-private/-type-tests/plugins-signature-utils.test.js +36 -0
  10. package/dist/-private/-type-tests/plugins-signature-utils.test.js.map +1 -0
  11. package/dist/-private/-type-tests/table-api.test.js +17 -0
  12. package/dist/-private/-type-tests/table-api.test.js.map +1 -0
  13. package/dist/-private/-type-tests/table-config.test.js +55 -0
  14. package/dist/-private/-type-tests/table-config.test.js.map +1 -0
  15. package/dist/-private/column.js +62 -0
  16. package/dist/-private/column.js.map +1 -0
  17. package/dist/-private/ember-compat.js +17 -0
  18. package/dist/-private/ember-compat.js.map +1 -0
  19. package/dist/-private/interfaces/column.js +2 -0
  20. package/dist/-private/interfaces/column.js.map +1 -0
  21. package/dist/-private/interfaces/index.js +2 -0
  22. package/dist/-private/interfaces/index.js.map +1 -0
  23. package/dist/-private/interfaces/modifier.js +2 -0
  24. package/dist/-private/interfaces/modifier.js.map +1 -0
  25. package/dist/-private/interfaces/pagination.js +2 -0
  26. package/dist/-private/interfaces/pagination.js.map +1 -0
  27. package/dist/-private/interfaces/plugins.js +2 -0
  28. package/dist/-private/interfaces/plugins.js.map +1 -0
  29. package/dist/-private/interfaces/preferences.js +2 -0
  30. package/dist/-private/interfaces/preferences.js.map +1 -0
  31. package/dist/-private/interfaces/selection.js +2 -0
  32. package/dist/-private/interfaces/selection.js.map +1 -0
  33. package/dist/-private/interfaces/table.js +2 -0
  34. package/dist/-private/interfaces/table.js.map +1 -0
  35. package/dist/-private/js-helper.js +55 -0
  36. package/dist/-private/js-helper.js.map +1 -0
  37. package/dist/-private/preferences.js +143 -0
  38. package/dist/-private/preferences.js.map +1 -0
  39. package/dist/-private/private-types.js +2 -0
  40. package/dist/-private/private-types.js.map +1 -0
  41. package/dist/-private/row.js +51 -0
  42. package/dist/-private/row.js.map +1 -0
  43. package/dist/-private/table.js +273 -0
  44. package/dist/-private/table.js.map +1 -0
  45. package/dist/-private/utils.js +15 -0
  46. package/dist/-private/utils.js.map +1 -0
  47. package/dist/_rollupPluginBabelHelpers-BpiaYhlf.js +63 -0
  48. package/dist/_rollupPluginBabelHelpers-BpiaYhlf.js.map +1 -0
  49. package/dist/index.js +4 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/plugins/-private/base.js +524 -0
  52. package/dist/plugins/-private/base.js.map +1 -0
  53. package/dist/plugins/-private/utils.js +103 -0
  54. package/dist/plugins/-private/utils.js.map +1 -0
  55. package/dist/plugins/column-reordering/helpers.js +44 -0
  56. package/dist/plugins/column-reordering/helpers.js.map +1 -0
  57. package/dist/plugins/column-reordering/index.js +3 -0
  58. package/dist/plugins/column-reordering/index.js.map +1 -0
  59. package/dist/plugins/column-reordering/plugin.js +359 -0
  60. package/dist/plugins/column-reordering/plugin.js.map +1 -0
  61. package/dist/plugins/column-reordering/utils.js +34 -0
  62. package/dist/plugins/column-reordering/utils.js.map +1 -0
  63. package/dist/plugins/column-resizing/handle.js +241 -0
  64. package/dist/plugins/column-resizing/handle.js.map +1 -0
  65. package/dist/plugins/column-resizing/helpers.js +71 -0
  66. package/dist/plugins/column-resizing/helpers.js.map +1 -0
  67. package/dist/plugins/column-resizing/index.js +4 -0
  68. package/dist/plugins/column-resizing/index.js.map +1 -0
  69. package/dist/plugins/column-resizing/plugin.js +328 -0
  70. package/dist/plugins/column-resizing/plugin.js.map +1 -0
  71. package/dist/plugins/column-resizing/resize-observer.js +44 -0
  72. package/dist/plugins/column-resizing/resize-observer.js.map +1 -0
  73. package/dist/plugins/column-resizing/utils.js +44 -0
  74. package/dist/plugins/column-resizing/utils.js.map +1 -0
  75. package/dist/plugins/column-visibility/helpers.js +25 -0
  76. package/dist/plugins/column-visibility/helpers.js.map +1 -0
  77. package/dist/plugins/column-visibility/index.js +3 -0
  78. package/dist/plugins/column-visibility/index.js.map +1 -0
  79. package/dist/plugins/column-visibility/plugin.js +92 -0
  80. package/dist/plugins/column-visibility/plugin.js.map +1 -0
  81. package/dist/plugins/data-sorting/helpers.js +49 -0
  82. package/dist/plugins/data-sorting/helpers.js.map +1 -0
  83. package/dist/plugins/data-sorting/index.js +4 -0
  84. package/dist/plugins/data-sorting/index.js.map +1 -0
  85. package/dist/plugins/data-sorting/plugin.js +132 -0
  86. package/dist/plugins/data-sorting/plugin.js.map +1 -0
  87. package/dist/plugins/data-sorting/types.js +14 -0
  88. package/dist/plugins/data-sorting/types.js.map +1 -0
  89. package/dist/plugins/index.js +3 -0
  90. package/dist/plugins/index.js.map +1 -0
  91. package/dist/plugins/metadata/helpers.js +12 -0
  92. package/dist/plugins/metadata/helpers.js.map +1 -0
  93. package/dist/plugins/metadata/index.js +3 -0
  94. package/dist/plugins/metadata/index.js.map +1 -0
  95. package/dist/plugins/metadata/plugin.js +25 -0
  96. package/dist/plugins/metadata/plugin.js.map +1 -0
  97. package/dist/plugins/row-selection/helpers.js +10 -0
  98. package/dist/plugins/row-selection/helpers.js.map +1 -0
  99. package/dist/plugins/row-selection/index.js +3 -0
  100. package/dist/plugins/row-selection/index.js.map +1 -0
  101. package/dist/plugins/row-selection/plugin.js +118 -0
  102. package/dist/plugins/row-selection/plugin.js.map +1 -0
  103. package/dist/plugins/sticky-columns/helpers.js +49 -0
  104. package/dist/plugins/sticky-columns/helpers.js.map +1 -0
  105. package/dist/plugins/sticky-columns/index.js +3 -0
  106. package/dist/plugins/sticky-columns/index.js.map +1 -0
  107. package/dist/plugins/sticky-columns/plugin.js +139 -0
  108. package/dist/plugins/sticky-columns/plugin.js.map +1 -0
  109. package/dist/test-support/index.js +62 -0
  110. package/dist/test-support/index.js.map +1 -0
  111. package/dist/utils.js +77 -0
  112. package/dist/utils.js.map +1 -0
  113. package/package.json +3 -2
  114. package/src/-private/-type-tests/plugin-properties.test.ts +38 -0
  115. package/src/-private/-type-tests/plugin-with.test.ts +23 -0
  116. package/src/-private/-type-tests/plugins-accessors.test.ts +86 -0
  117. package/src/-private/-type-tests/plugins-signature-from.test.ts +66 -0
  118. package/src/-private/-type-tests/plugins-signature-utils.test.ts +154 -0
  119. package/src/-private/-type-tests/table-api.test.ts +20 -0
  120. package/src/-private/-type-tests/table-config.test.ts +70 -0
  121. package/src/-private/column.ts +67 -0
  122. package/src/-private/ember-compat.ts +26 -0
  123. package/src/-private/interfaces/column.ts +73 -0
  124. package/src/-private/interfaces/index.ts +7 -0
  125. package/src/-private/interfaces/modifier.ts +7 -0
  126. package/src/-private/interfaces/pagination.ts +13 -0
  127. package/src/-private/interfaces/plugins.ts +349 -0
  128. package/src/-private/interfaces/preferences.ts +82 -0
  129. package/src/-private/interfaces/selection.ts +38 -0
  130. package/src/-private/interfaces/table.ts +121 -0
  131. package/src/-private/js-helper.ts +65 -0
  132. package/src/-private/preferences.ts +176 -0
  133. package/src/-private/private-types.ts +8 -0
  134. package/src/-private/row.ts +66 -0
  135. package/src/-private/table.ts +310 -0
  136. package/src/-private/utils.ts +21 -0
  137. package/src/index.ts +25 -0
  138. package/src/plugins/-private/base.ts +836 -0
  139. package/src/plugins/-private/utils.ts +166 -0
  140. package/src/plugins/column-reordering/helpers.ts +50 -0
  141. package/src/plugins/column-reordering/index.ts +6 -0
  142. package/src/plugins/column-reordering/plugin.ts +489 -0
  143. package/src/plugins/column-reordering/utils.ts +48 -0
  144. package/src/plugins/column-resizing/handle.ts +280 -0
  145. package/src/plugins/column-resizing/helpers.ts +79 -0
  146. package/src/plugins/column-resizing/index.ts +7 -0
  147. package/src/plugins/column-resizing/plugin.ts +490 -0
  148. package/src/plugins/column-resizing/resize-observer.ts +48 -0
  149. package/src/plugins/column-resizing/utils.ts +54 -0
  150. package/src/plugins/column-visibility/helpers.ts +28 -0
  151. package/src/plugins/column-visibility/index.ts +6 -0
  152. package/src/plugins/column-visibility/plugin.ts +155 -0
  153. package/src/plugins/data-sorting/helpers.ts +56 -0
  154. package/src/plugins/data-sorting/index.ts +8 -0
  155. package/src/plugins/data-sorting/plugin.ts +222 -0
  156. package/src/plugins/data-sorting/types.ts +26 -0
  157. package/src/plugins/index.ts +20 -0
  158. package/src/plugins/metadata/helpers.ts +12 -0
  159. package/src/plugins/metadata/index.ts +7 -0
  160. package/src/plugins/metadata/plugin.ts +26 -0
  161. package/src/plugins/row-selection/helpers.ts +13 -0
  162. package/src/plugins/row-selection/index.ts +7 -0
  163. package/src/plugins/row-selection/plugin.ts +218 -0
  164. package/src/plugins/sticky-columns/helpers.ts +59 -0
  165. package/src/plugins/sticky-columns/index.ts +7 -0
  166. package/src/plugins/sticky-columns/plugin.ts +201 -0
  167. package/src/test-support/index.ts +76 -0
  168. package/src/utils.ts +85 -0
@@ -0,0 +1,48 @@
1
+ import { meta } from '../-private/base.ts';
2
+ import { ColumnReordering } from './plugin.ts';
3
+
4
+ import type { Column } from '../../index.ts';
5
+
6
+ type ColumnOrder = { key: string; position: number | undefined }[];
7
+
8
+ export function reorderColumns(
9
+ columns: Column[],
10
+ orderedColumns: ColumnOrder | undefined,
11
+ ) {
12
+ if (orderedColumns === undefined) {
13
+ return columns;
14
+ }
15
+
16
+ let repositionedColumns: Column[] = Array.from({
17
+ length: columns.length,
18
+ });
19
+
20
+ for (const column of columns) {
21
+ const orderedColumn = orderedColumns.find(
22
+ (orderedColumn) => column.key === orderedColumn.key,
23
+ );
24
+ const currentMeta = meta.forColumn(column, ColumnReordering);
25
+
26
+ if (orderedColumn === undefined) {
27
+ if (currentMeta.position !== undefined && currentMeta.position >= 0) {
28
+ repositionedColumns[currentMeta.position] = column;
29
+ }
30
+
31
+ continue;
32
+ }
33
+
34
+ const { position } = orderedColumn;
35
+
36
+ if (position !== undefined && !repositionedColumns[position]) {
37
+ repositionedColumns[position] = column;
38
+ } else {
39
+ repositionedColumns.push(column);
40
+ }
41
+ }
42
+
43
+ repositionedColumns = repositionedColumns.filter(
44
+ (column) => column !== undefined,
45
+ );
46
+
47
+ return repositionedColumns;
48
+ }
@@ -0,0 +1,280 @@
1
+ import { registerDestructor } from '@ember/destroyable';
2
+ import { buildWaiter } from '@ember/test-waiters';
3
+
4
+ import Modifier from 'ember-modifier';
5
+
6
+ import { meta } from '../-private/base.ts';
7
+ import { ColumnResizing } from './plugin.ts';
8
+
9
+ import type { ColumnMeta } from './plugin.ts';
10
+ import type { Column } from '../../-private/column.ts';
11
+
12
+ const waiter = buildWaiter('ColumnResizing#ResizeHandle');
13
+
14
+ /**
15
+ * - why are mouse events used instead of drag events?
16
+ * - why not use the "draggable" attribute?
17
+ *
18
+ * It seems drag events are more for files and/or moving images around on a page
19
+ * dragging an image, for example, has a ghost of that image until it is dropped.
20
+ * The same thing happens with text.
21
+ * This prevents us from having total control of the styling of how dragging works.
22
+ *
23
+ *
24
+ *
25
+ */
26
+
27
+ class ResizeHandle extends Modifier<{ Args: { Positional: [Column] } }> {
28
+ declare dragHandle: HTMLElement;
29
+ declare column: Column;
30
+ declare meta: ColumnMeta;
31
+
32
+ // Pointer
33
+ pointerStartX = 0;
34
+ pointerStartY = 0;
35
+ pointerX = 0;
36
+ pointerY = 0;
37
+ declare dragFrame: number;
38
+
39
+ // Keyboard
40
+ keyDistance = 0;
41
+ declare keyFrame: number; // ha
42
+ declare lastKey: number;
43
+
44
+ // waiter
45
+ token?: unknown;
46
+
47
+ isSetup = false;
48
+ modify(element: Element, [column]: [Column]) {
49
+ this.column = column;
50
+ this.meta = meta.forColumn(column, ColumnResizing);
51
+ this.dragHandle = element as HTMLElement;
52
+
53
+ if (!this.isSetup) {
54
+ this.isSetup = true;
55
+ this.setup();
56
+ }
57
+ }
58
+
59
+ setup = () => {
60
+ this.dragHandle.addEventListener('touchstart', this.dragStartHandler);
61
+ this.dragHandle.addEventListener('mousedown', this.dragStartHandler);
62
+ this.dragHandle.addEventListener('keydown', this.keyHandler);
63
+
64
+ registerDestructor(this, () => {
65
+ this.meta.isResizing = false;
66
+
67
+ if (this.token) {
68
+ waiter.endAsync(this.token);
69
+ this.token = undefined;
70
+ }
71
+
72
+ this.dragHandle.removeEventListener('touchstart', this.dragStartHandler);
73
+ this.dragHandle.removeEventListener('mousedown', this.dragStartHandler);
74
+ window.removeEventListener('touchmove', this.dragMove);
75
+ window.removeEventListener('touchend', this.dragEndHandler);
76
+ window.removeEventListener('mousemove', this.dragMove);
77
+ window.removeEventListener('mouseup', this.dragEndHandler);
78
+ this.dragHandle.removeEventListener('keydown', this.keyHandler);
79
+ });
80
+ };
81
+
82
+ setPosition = (event: Event) => {
83
+ if (!(event instanceof PointerEvent || event instanceof MouseEvent)) return;
84
+
85
+ if ('TouchEvent' in window && event instanceof TouchEvent) {
86
+ const firstTouch = event.touches[0];
87
+
88
+ if (!firstTouch) return;
89
+
90
+ this.pointerX = firstTouch.clientX;
91
+ this.pointerY = firstTouch.clientY;
92
+ } else {
93
+ this.pointerX = event.clientX;
94
+ this.pointerY = event.clientY;
95
+ }
96
+ };
97
+
98
+ setStartPosition = (event: Event) => {
99
+ if (!(event instanceof PointerEvent || event instanceof MouseEvent)) return;
100
+
101
+ if ('TouchEvent' in window && event instanceof TouchEvent) {
102
+ const firstTouch = event.touches[0];
103
+
104
+ if (!firstTouch) return;
105
+
106
+ this.pointerStartX = firstTouch.clientX;
107
+ this.pointerStartY = firstTouch.clientY;
108
+ } else {
109
+ this.pointerStartX = event.clientX;
110
+ this.pointerStartY = event.clientY;
111
+ }
112
+ };
113
+
114
+ /**
115
+ * queueUpdate takes an optional function argument that is called
116
+ * in the requestAnimationFrame callback _after_ the resize function.
117
+ *
118
+ * We can use this to ensure that preferences are only ever saved after
119
+ * we have completed column resizing.
120
+ *
121
+ * Because the requestAnimationFrame 'hides' these function calls from the
122
+ * the ember test waiter, we also ensure that we track them by also cancelling
123
+ * the waiter in the requestAnimationFrame callback.
124
+ */
125
+ queueUpdate = (callback?: () => void) => {
126
+ if (this.dragFrame) {
127
+ cancelAnimationFrame(this.dragFrame);
128
+ }
129
+
130
+ this.dragFrame = requestAnimationFrame(() => {
131
+ this.meta.resize(this.pointerX - this.pointerStartX);
132
+ this.pointerStartX = this.pointerX;
133
+
134
+ if (callback) {
135
+ callback();
136
+ }
137
+
138
+ if (this.token) {
139
+ waiter.endAsync(this.token);
140
+ this.token = undefined;
141
+ }
142
+ });
143
+ };
144
+
145
+ dragEndHandler = () => {
146
+ this.meta.isResizing = false;
147
+
148
+ this.queueUpdate(this.meta.save);
149
+
150
+ /**
151
+ * No need to listen if we aren't dragging
152
+ */
153
+ window.removeEventListener('touchmove', this.dragMove);
154
+ window.removeEventListener('touchend', this.dragEndHandler);
155
+ window.removeEventListener('mousemove', this.dragMove);
156
+ window.removeEventListener('mouseup', this.dragEndHandler);
157
+ };
158
+
159
+ dragMove = (event: Event) => {
160
+ if (!this.meta.isResizing) return;
161
+ this.setPosition(event);
162
+ this.queueUpdate();
163
+ };
164
+
165
+ dragStartHandler = (event: Event) => {
166
+ if (!(event instanceof PointerEvent || event instanceof MouseEvent)) return;
167
+
168
+ this.meta.isResizing = true;
169
+ if (event.target !== this.dragHandle) return;
170
+
171
+ if (this.token) {
172
+ waiter.endAsync(this.token);
173
+ }
174
+
175
+ this.token = waiter.beginAsync();
176
+
177
+ this.setPosition(event);
178
+ this.setStartPosition(event);
179
+
180
+ window.addEventListener('touchend', this.dragEndHandler);
181
+ window.addEventListener('touchmove', this.dragMove);
182
+ window.addEventListener('mousemove', this.dragMove);
183
+ window.addEventListener('mouseup', this.dragEndHandler);
184
+ };
185
+
186
+ keyHandler = (event: KeyboardEvent) => {
187
+ const deltaT = new Date().getTime() - this.lastKey;
188
+ const isRapid = deltaT < 50;
189
+
190
+ if (event.code === 'ArrowDown' || event.code === 'ArrowRight') {
191
+ this.keyDistance += isRapid ? 8 : 1;
192
+ this.lastKey = new Date().getTime();
193
+ }
194
+
195
+ if (event.code === 'ArrowUp' || event.code === 'ArrowLeft') {
196
+ this.keyDistance -= isRapid ? 8 : 1;
197
+ this.lastKey = new Date().getTime();
198
+ }
199
+
200
+ cancelAnimationFrame(this.keyFrame);
201
+ this.keyFrame = requestAnimationFrame(() => {
202
+ this.meta.resize(this.keyDistance);
203
+
204
+ this.keyDistance = 0;
205
+ });
206
+ };
207
+ }
208
+
209
+ /**
210
+ * Modifier to attach to the column resize handles.
211
+ * This provides both keyboard and mouse support for resizing columns.
212
+ * (provided the resize handle element is focusable -- so consider using
213
+ * a button for the resize element)
214
+ *
215
+ * @example
216
+ * ```js
217
+ * import Component from '@glimmer/component';
218
+ * import { meta } from '@universal-ember/table/plugins';
219
+ * import { resizeHandle, ColumnResizing } from '@universal-ember/table/plugins/column-resizing';
220
+ *
221
+ * export default class TableHead extends Component {
222
+ * /* ✂️ *\/
223
+ *
224
+ * <template>
225
+ * <thead>
226
+ * <tr>
227
+ * {{#each this.columns as |column|}}
228
+ * <th>
229
+ * <span>{{column.name}}</span>
230
+ * <button {{resizeHandle column}}></button>
231
+ * </th>
232
+ * {{/each}}
233
+ * </tr>
234
+ * </thead>
235
+ * </template>
236
+ * }
237
+ * ```
238
+ *
239
+ * Width and isResizing state is maintained on the "meta"
240
+ * class so that the users may choose per-column stylings for
241
+ * isResizing and dragging behaviors.
242
+ *
243
+ * For example, while dragging, the user may add a class based on the
244
+ * isDragging property.
245
+ *
246
+ * @example
247
+ * ```js
248
+ * import Component from '@glimmer/component';
249
+ * import { meta } from '@universal-ember/table/plugins';
250
+ * import { resizeHandle, ColumnResizing } from '@universal-ember/table/plugins/column-resizing';
251
+ *
252
+ * export default class TableHead extends Component {
253
+ * /* ✂️ *\/
254
+ *
255
+ * isDragging = (column) => {
256
+ * return meta.forColumn(column, ColumnResizing).isDragging;
257
+ * }
258
+ *
259
+ * <template>
260
+ * <thead>
261
+ * <tr>
262
+ * {{#each this.columns as |column|}}
263
+ * <th class="header {{if (this.isDragging column) 'blue'}}">
264
+ * <span>{{column.name}}</span>
265
+ * <button {{resizeHandle column}}></button>
266
+ * </th>
267
+ * {{/each}}
268
+ * </tr>
269
+ * </thead>
270
+ * </template>
271
+ * }
272
+ * ```
273
+ *
274
+ *
275
+ * @note
276
+ * The logic here is copied from the drag slider in
277
+ * https://limber.glimdown.com/
278
+ * See: "resize-handle" on Limber's GitHub
279
+ */
280
+ export const resizeHandle = ResizeHandle;
@@ -0,0 +1,79 @@
1
+ import { htmlSafe } from '@ember/template';
2
+
3
+ import { meta } from '../-private/base.ts';
4
+ import { ColumnResizing } from './plugin.ts';
5
+
6
+ import type { Column } from '../../index.ts';
7
+
8
+ /**
9
+ * The column actively being resized by the user.
10
+ *
11
+ * Note that during resizing, multiple columns are resized at once,
12
+ * dependending on the boundaries of the resize events.
13
+ *
14
+ * The other columns being resized as a consequence of "this" column will not
15
+ * be marked as isResizing, because this is a user-scoped question:
16
+ * "Is the user directly resizing this column?"
17
+ */
18
+ export const isResizing = (column: Column) =>
19
+ meta.forColumn(column, ColumnResizing).isResizing;
20
+
21
+ /**
22
+ * Does the column have room to shrink?
23
+ */
24
+ export const canShrink = (column: Column) =>
25
+ meta.forColumn(column, ColumnResizing).canShrink;
26
+
27
+ /**
28
+ * Does the column have a resize handle?
29
+ * The return value of this function can be determined by
30
+ * - if resizing is enabled for the column
31
+ * - if resizing is enabled for the whole table
32
+ * - or if we're asking about the first column (resize handles may only be "between" columns)
33
+ */
34
+ export const hasResizeHandle = (column: Column) =>
35
+ meta.forColumn(column, ColumnResizing).hasResizeHandle;
36
+
37
+ /**
38
+ * In this plugin (by default), styles are only applied to the headers automatically.
39
+ * in <Table> UIs, the header cells control the widths of all cells in that column.
40
+ * There are other kinds of tabular-like markup that may want to grab the widths of columns,
41
+ * because The Platform does not manage that automatically (like if divs and roles were used manually)
42
+ *
43
+ * This utility is meant to be applied to the `style` attribute of a particular td-like element.
44
+ */
45
+ export const styleStringFor = <DataType = unknown>(
46
+ column: Column<DataType>,
47
+ ): ReturnType<typeof htmlSafe> => {
48
+ const columnMeta = meta.forColumn(column, ColumnResizing);
49
+
50
+ let result = '';
51
+
52
+ /**
53
+ * Styles are applied regardless of the "table" being resizable or not
54
+ * because in non-<table> UIs, we need to ensure that all cells in a column
55
+ * have the same width
56
+ */
57
+ for (const [key, value] of Object.entries(columnMeta.style)) {
58
+ result += `${toStyle(key)}:${value};`;
59
+ }
60
+
61
+ result = ';' + result;
62
+
63
+ return htmlSafe(result);
64
+ };
65
+
66
+ /**
67
+ * the JS API for styles is camel case,
68
+ * but CSS is kebab-case. To save on complexity and
69
+ * amount of code, we have a super small conversion function
70
+ * for only the properties relevant to the sticky plugin.
71
+ */
72
+ const toStyle = (key: string): string => {
73
+ switch (key) {
74
+ case 'minWidth':
75
+ return 'min-width';
76
+ default:
77
+ return key;
78
+ }
79
+ };
@@ -0,0 +1,7 @@
1
+ export { resizeHandle } from './handle.ts';
2
+ export * from './helpers.ts';
3
+ export { ColumnResizing } from './plugin.ts';
4
+ export { ColumnResizing as Plugin } from './plugin.ts';
5
+
6
+ // Types
7
+ export type { ColumnOptions, TableOptions } from './plugin.ts';