@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,328 @@
1
+ import { _ as _defineProperty, a as _applyDecoratedDescriptor, c as _classPrivateMethodInitSpec, b as _initializerDefineProperty, d as _classPrivateGetter } from '../../_rollupPluginBabelHelpers-BpiaYhlf.js';
2
+ import { tracked, cached } from '@glimmer/tracking';
3
+ import { assert } from '@ember/debug';
4
+ import { isDestroyed, isDestroying } from '@ember/destroyable';
5
+ import { action } from '@ember/object';
6
+ import { BasePlugin, meta, preferences, options, columns } from '../-private/base.js';
7
+ import { applyStyles } from '../-private/utils.js';
8
+ import { getAccurateClientWidth, getAccurateClientHeight, totalGapOf } from './utils.js';
9
+
10
+ var _class, _descriptor, _descriptor2, _class2, _descriptor3, _descriptor4, _TableMeta_brand;
11
+ /**
12
+ * One instance of a plugin exists per table
13
+ * but a plugin can have a "Meta" for each column
14
+ */
15
+ class ColumnResizing extends BasePlugin {
16
+ constructor(...args) {
17
+ super(...args);
18
+ _defineProperty(this, "name", 'column-resizing');
19
+ _defineProperty(this, "meta", {
20
+ column: ColumnMeta,
21
+ table: TableMeta
22
+ });
23
+ _defineProperty(this, "headerCellModifier", (element, {
24
+ column
25
+ }) => {
26
+ const columnMeta = meta.forColumn(column, ColumnResizing);
27
+ element.setAttribute('data-test-is-resizable', `${columnMeta.isResizable}`);
28
+ applyStyles(element, columnMeta.style);
29
+ });
30
+ /**
31
+ * This is what ends up calling resize when the browser changes
32
+ * (assuming that the containing element's styles stretch to fill the space)
33
+ *
34
+ * Later, when container queries are more broadly supported, we'll want to watch
35
+ * the container instead of the window to prevent unneeded updates (as a window can change
36
+ * size without the container changing size)
37
+ */
38
+ _defineProperty(this, "containerModifier", resizeObserver);
39
+ }
40
+ reset() {
41
+ preferences.forAllColumns(this.table, ColumnResizing).delete('width');
42
+ }
43
+ }
44
+ _defineProperty(ColumnResizing, "features", ['columnWidth']);
45
+ const DEFAULT_COLUMN_OPTIONS = {
46
+ minWidth: 128
47
+ };
48
+ const ALLOWED_COLUMN_OPTIONS = ['minWidth', 'width', 'isResizable'];
49
+
50
+ /**
51
+ * @private
52
+ *
53
+ * Contains resizable information for a particular column
54
+ */
55
+ let ColumnMeta = (_class = class ColumnMeta {
56
+ constructor(column) {
57
+ _initializerDefineProperty(this, "_width", _descriptor, this);
58
+ _initializerDefineProperty(this, "isResizing", _descriptor2, this);
59
+ this.column = column;
60
+ }
61
+ get tableMeta() {
62
+ return meta.forTable(this.column.table, ColumnResizing);
63
+ }
64
+ get options() {
65
+ const columnOptions = options.forColumn(this.column, ColumnResizing);
66
+ const filteredOptions = Object.entries(columnOptions || {}).reduce((result, [k, v]) => {
67
+ if (ALLOWED_COLUMN_OPTIONS.includes(k)) {
68
+ result[k] = v;
69
+ }
70
+ return result;
71
+ }, {});
72
+ return {
73
+ ...DEFAULT_COLUMN_OPTIONS,
74
+ ...filteredOptions
75
+ };
76
+ }
77
+ get key() {
78
+ return this.column.key;
79
+ }
80
+ get minWidth() {
81
+ return this.options.minWidth;
82
+ }
83
+ get initialWidth() {
84
+ const savedWidth = preferences.forColumn(this.column, ColumnResizing).get('width');
85
+ if (!savedWidth) {
86
+ return this.options.width;
87
+ }
88
+ if (typeof savedWidth !== 'string') {
89
+ assert('saved width must be a number or string', typeof savedWidth === 'number');
90
+ return savedWidth;
91
+ }
92
+ return parseInt(savedWidth, 10);
93
+ }
94
+ get canShrink() {
95
+ return this.width && this.width > this.minWidth;
96
+ }
97
+ get roomToShrink() {
98
+ return this.width ? this.width - this.minWidth : 0;
99
+ }
100
+ get isResizable() {
101
+ return this.options.isResizable ?? this.tableMeta.isResizable;
102
+ }
103
+ get hasResizeHandle() {
104
+ const previous = columns.previous(this.column);
105
+ if (!previous) return false;
106
+ return this.isResizable && meta.forColumn(previous, ColumnResizing).isResizable;
107
+ }
108
+ get width() {
109
+ let width = this._width ?? this.initialWidth;
110
+ if (!width) {
111
+ const {
112
+ defaultColumnWidth
113
+ } = this.tableMeta;
114
+ width = defaultColumnWidth ? Math.max(defaultColumnWidth, this.minWidth) : this.minWidth;
115
+ }
116
+ return width;
117
+ }
118
+ set width(value) {
119
+ this._width = value;
120
+ }
121
+ get style() {
122
+ const styles = {};
123
+ if (this.width) styles.width = `${this.width}px`;
124
+ if (this.minWidth) styles.minWidth = `${this.minWidth}px`;
125
+ return styles;
126
+ }
127
+ resize(delta) {
128
+ this.tableMeta.resizeColumn(this.column, delta);
129
+ }
130
+ save() {
131
+ this.tableMeta.saveColWidths(this.tableMeta.visibleColumnMetas);
132
+ }
133
+ }, _descriptor = _applyDecoratedDescriptor(_class.prototype, "_width", [tracked], {
134
+ configurable: true,
135
+ enumerable: true,
136
+ writable: true,
137
+ initializer: null
138
+ }), _descriptor2 = _applyDecoratedDescriptor(_class.prototype, "isResizing", [tracked], {
139
+ configurable: true,
140
+ enumerable: true,
141
+ writable: true,
142
+ initializer: function () {
143
+ return false;
144
+ }
145
+ }), _applyDecoratedDescriptor(_class.prototype, "options", [cached], Object.getOwnPropertyDescriptor(_class.prototype, "options"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, "resize", [action], Object.getOwnPropertyDescriptor(_class.prototype, "resize"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, "save", [action], Object.getOwnPropertyDescriptor(_class.prototype, "save"), _class.prototype), _class);
146
+
147
+ /**
148
+ * @private
149
+ *
150
+ * individual column width must exclude:
151
+ * - padding
152
+ * - margin
153
+ * - gap (partial)
154
+ * - any other positioning offsets
155
+ *
156
+ * Otherwise the table will infinitely resize itself
157
+ */
158
+ function distributeDelta(delta, visibleColumns) {
159
+ if (delta === 0) return;
160
+ const metas = visibleColumns.map(column => meta.forColumn(column, ColumnResizing));
161
+ const resizableMetas = metas.filter(meta => meta.isResizable && (delta < 0 ? meta.canShrink : true));
162
+ const columnDelta = delta / resizableMetas.length;
163
+ for (const meta of resizableMetas) {
164
+ assert('cannot resize a column that does not have a width', meta.width);
165
+ meta.width = Math.max(meta.width + columnDelta, meta.minWidth);
166
+ }
167
+ }
168
+
169
+ /**
170
+ * @private
171
+ *
172
+ * Contains resizable and width information regarding the table as a whole
173
+ */
174
+ let TableMeta = (_class2 = (_TableMeta_brand = /*#__PURE__*/new WeakSet(), class TableMeta {
175
+ constructor(table) {
176
+ _classPrivateMethodInitSpec(this, _TableMeta_brand);
177
+ _initializerDefineProperty(this, "scrollContainerHeight", _descriptor3, this);
178
+ _initializerDefineProperty(this, "scrollContainerWidth", _descriptor4, this);
179
+ this.table = table;
180
+ }
181
+ get options() {
182
+ return options.forTable(this.table, ColumnResizing);
183
+ }
184
+ get isResizable() {
185
+ return this.options?.enabled ?? true;
186
+ }
187
+ get defaultColumnWidth() {
188
+ if (!this.scrollContainerWidth) return;
189
+ return (this.scrollContainerWidth - this.totalInitialColumnWidths) / this.columnsWithoutInitialWidth.length;
190
+ }
191
+ get visibleColumnMetas() {
192
+ return _classPrivateGetter(_TableMeta_brand, this, _get_availableColumns).map(column => meta.forColumn(column, ColumnResizing));
193
+ }
194
+ get totalInitialColumnWidths() {
195
+ return this.visibleColumnMetas.reduce((acc, meta) => acc += meta.initialWidth ?? 0, 0);
196
+ }
197
+ get columnsWithoutInitialWidth() {
198
+ return this.visibleColumnMetas.filter(meta => !meta.initialWidth);
199
+ }
200
+ get totalVisibleColumnsWidth() {
201
+ return this.visibleColumnMetas.reduce((acc, column) => acc += column.width ?? 0, 0);
202
+ }
203
+ saveColWidths(visibleColumnMetas) {
204
+ const tablePrefs = this.table.preferences;
205
+ for (const column of visibleColumnMetas) {
206
+ const existing = tablePrefs.storage.forPlugin('ColumnResizing');
207
+ const columnPrefs = existing.forColumn(column.key);
208
+ columnPrefs.set('width', column.width.toString());
209
+ }
210
+ tablePrefs.persist();
211
+ }
212
+ reset() {
213
+ if (!this.scrollContainerWidth) return;
214
+ for (const column of this.visibleColumnMetas) {
215
+ column._width = undefined;
216
+ }
217
+ }
218
+ onTableResize(entry) {
219
+ assert('scroll container element must be an HTMLElement', entry.target instanceof HTMLElement);
220
+ this.scrollContainerWidth = getAccurateClientWidth(entry.target);
221
+ this.scrollContainerHeight = getAccurateClientHeight(entry.target);
222
+
223
+ // TODO: extract this to card-list and remove it from the plugin
224
+ // card-list will provide its own column-resizing plugin
225
+ // by sub-classing this one, and defining its own way of calculating the "diff"
226
+ const totalGap = totalGapOf(entry.target.querySelector('[role="row"]'));
227
+ const diff = this.scrollContainerWidth - this.totalVisibleColumnsWidth - totalGap;
228
+ distributeDelta(diff, _classPrivateGetter(_TableMeta_brand, this, _get_availableColumns));
229
+ }
230
+ resizeColumn(column, delta) {
231
+ if (delta === 0) return;
232
+
233
+ /**
234
+ * When the delta is negative, we are dragging to the next
235
+ * when positive, we are dragging to the right
236
+ * when dragging to the right, we want to grow the column
237
+ * when dragging to the left, we grow the "next" column,
238
+ * which shrinks the column we're dragging
239
+ *
240
+ * This assumes the resize handle for any column is on the right-hand
241
+ * side of the column header
242
+ *
243
+ * If the resize handle were on the left-hand side of the column header
244
+ * we'd want the column.next to be column.previous
245
+ *
246
+ * This is CSS dependent, and can be configured in plugin
247
+ * options
248
+ */
249
+ const isDraggingRight = delta > 0;
250
+ const position = this.options?.handlePosition ?? 'left';
251
+ let growingColumn;
252
+ if (position === 'right') {
253
+ growingColumn = isDraggingRight ? columns.next(column) : column;
254
+ } else {
255
+ growingColumn = isDraggingRight ? columns.previous(column) : column;
256
+ }
257
+ if (!growingColumn) return;
258
+ const growingColumnMeta = meta.forColumn(growingColumn, ColumnResizing);
259
+ assert('cannot resize a column that does not have a width', growingColumnMeta.width);
260
+ const shrinkableColumns = delta > 0 ? columns.after(growingColumn) : columns.before(growingColumn).reverse();
261
+ const shrinkableColumnsMetas = shrinkableColumns.map(column => meta.forColumn(column, ColumnResizing)).filter(meta => meta.canShrink);
262
+ let remainder = Math.abs(delta);
263
+ while (shrinkableColumnsMetas.length > 0) {
264
+ const shrinkingColumnMeta = shrinkableColumnsMetas.shift();
265
+ assert('cannot resize a column that does not have a width', shrinkingColumnMeta?.width);
266
+ const actualDelta = Math.min(remainder, shrinkingColumnMeta.roomToShrink);
267
+ growingColumnMeta.width += actualDelta;
268
+ shrinkingColumnMeta.width -= actualDelta;
269
+ remainder -= actualDelta;
270
+ }
271
+ }
272
+ }), _descriptor3 = _applyDecoratedDescriptor(_class2.prototype, "scrollContainerHeight", [tracked], {
273
+ configurable: true,
274
+ enumerable: true,
275
+ writable: true,
276
+ initializer: null
277
+ }), _descriptor4 = _applyDecoratedDescriptor(_class2.prototype, "scrollContainerWidth", [tracked], {
278
+ configurable: true,
279
+ enumerable: true,
280
+ writable: true,
281
+ initializer: null
282
+ }), _applyDecoratedDescriptor(_class2.prototype, "saveColWidths", [action], Object.getOwnPropertyDescriptor(_class2.prototype, "saveColWidths"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "reset", [action], Object.getOwnPropertyDescriptor(_class2.prototype, "reset"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onTableResize", [action], Object.getOwnPropertyDescriptor(_class2.prototype, "onTableResize"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "resizeColumn", [action], Object.getOwnPropertyDescriptor(_class2.prototype, "resizeColumn"), _class2.prototype), _class2);
283
+
284
+ /**
285
+ * @private
286
+ * included in the same file as the plugin due to circular dependency
287
+ *
288
+ * This goes on the containing element
289
+ *
290
+ * @example
291
+ * ```hbs
292
+ * <div {{resizeObserver @table}}>
293
+ * <table>
294
+ * ```
295
+ */
296
+ function _get_availableColumns(_this) {
297
+ return columns.for(_this.table, ColumnResizing);
298
+ }
299
+ function resizeObserver(element, table) {
300
+ const observer = getObserver(element, table);
301
+ observer.observe(element);
302
+ return () => {
303
+ observer.unobserve(element);
304
+ };
305
+ }
306
+ const CACHE = new WeakMap();
307
+
308
+ /**
309
+ * This is technically "inefficient" as you don't want too many resize
310
+ * observers on a page, but tables are so big, that I don't see too many use cases
311
+ * where you'd have 10+ tables on a page
312
+ */
313
+ function getObserver(element, table) {
314
+ let existing = CACHE.get(element);
315
+ if (existing) return existing;
316
+ existing = new ResizeObserver(entries => {
317
+ if (isDestroyed(table) || isDestroying(table)) {
318
+ return;
319
+ }
320
+ for (const entry of entries) {
321
+ meta.forTable(table, ColumnResizing).onTableResize(entry);
322
+ }
323
+ });
324
+ return existing;
325
+ }
326
+
327
+ export { ColumnMeta, ColumnResizing, TableMeta };
328
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sources":["../../../src/plugins/column-resizing/plugin.ts"],"sourcesContent":["import { cached, tracked } from '@glimmer/tracking';\nimport { assert } from '@ember/debug';\nimport { isDestroyed, isDestroying } from '@ember/destroyable';\nimport { action } from '@ember/object';\n\nimport { preferences } from '../../plugins/index.ts';\n\nimport { BasePlugin, columns, meta, options } from '../-private/base.ts';\nimport { applyStyles } from '../-private/utils.ts';\nimport {\n getAccurateClientHeight,\n getAccurateClientWidth,\n totalGapOf,\n} from './utils.ts';\n\nimport type { ColumnApi, PluginPreferences } from '../../plugins/index.ts';\nimport type { Column, Table } from '../../index.ts';\n\ninterface ColumnResizePreferences extends PluginPreferences {\n columns: {\n [columnKey: string]: {\n width?: number;\n };\n };\n}\n\ndeclare module '@universal-ember/table/plugins' {\n interface Registry {\n ColumnResizing?: ColumnResizePreferences;\n }\n}\n\nexport interface ColumnOptions {\n /**\n * Force a starting width\n * This may not be less than the minWidth\n */\n width?: number;\n /**\n * Default: 128px\n */\n minWidth?: number;\n /**\n * Flip if the column is resizable or not.\n * The default is whatever the table's plugin option is set to\n * (and then yet again true, if not set at all)\n */\n isResizable?: boolean;\n}\n\nexport interface TableOptions {\n /**\n * Toggle whether the table is able to be resized at all\n *\n * default :true\n */\n enabled?: boolean;\n\n /**\n * By default, each column's \"handle\" position is on the\n * left-hand side of the column.\n *\n * If, for style-reasons, you want to move it to the right,\n * this option should reflect that so that the calculations can be\n * updated to match the expected behavior of which column(s) grow/shrink\n *\n * Valid values are 'left' or 'right'\n */\n handlePosition?: string;\n}\n\ninterface Signature {\n Meta: {\n Column: ColumnMeta;\n Table: TableMeta;\n };\n Options: {\n Plugin: TableOptions;\n Column: ColumnOptions;\n };\n}\n\n/**\n * One instance of a plugin exists per table\n * but a plugin can have a \"Meta\" for each column\n */\nexport class ColumnResizing extends BasePlugin<Signature> {\n name = 'column-resizing';\n static features = ['columnWidth'];\n\n meta = {\n column: ColumnMeta,\n table: TableMeta,\n };\n\n headerCellModifier = (element: HTMLElement, { column }: ColumnApi) => {\n const columnMeta = meta.forColumn(column, ColumnResizing);\n\n element.setAttribute('data-test-is-resizable', `${columnMeta.isResizable}`);\n\n applyStyles(element, columnMeta.style);\n };\n\n /**\n * This is what ends up calling resize when the browser changes\n * (assuming that the containing element's styles stretch to fill the space)\n *\n * Later, when container queries are more broadly supported, we'll want to watch\n * the container instead of the window to prevent unneeded updates (as a window can change\n * size without the container changing size)\n */\n containerModifier = resizeObserver;\n\n reset() {\n preferences.forAllColumns(this.table, ColumnResizing).delete('width');\n }\n}\n\nconst DEFAULT_COLUMN_OPTIONS = {\n minWidth: 128,\n};\n\nconst ALLOWED_COLUMN_OPTIONS = ['minWidth', 'width', 'isResizable'];\n\n/**\n * @private\n *\n * Contains resizable information for a particular column\n */\nexport class ColumnMeta {\n constructor(private column: Column) {}\n\n @tracked _width?: number;\n @tracked isResizing = false;\n\n get tableMeta() {\n return meta.forTable(this.column.table, ColumnResizing);\n }\n\n @cached\n get options() {\n const columnOptions = options.forColumn(this.column, ColumnResizing);\n const filteredOptions = Object.entries(columnOptions || {}).reduce(\n (result, [k, v]) => {\n if (ALLOWED_COLUMN_OPTIONS.includes(k)) {\n result[k] = v;\n }\n\n return result;\n },\n {} as Record<string, unknown>,\n ) as ColumnOptions;\n\n return {\n ...DEFAULT_COLUMN_OPTIONS,\n ...filteredOptions,\n };\n }\n\n get key() {\n return this.column.key;\n }\n\n get minWidth() {\n return this.options.minWidth;\n }\n\n get initialWidth() {\n const savedWidth = preferences\n .forColumn(this.column, ColumnResizing)\n .get('width');\n\n if (!savedWidth) {\n return this.options.width;\n }\n\n if (typeof savedWidth !== 'string') {\n assert(\n 'saved width must be a number or string',\n typeof savedWidth === 'number',\n );\n return savedWidth;\n }\n\n return parseInt(savedWidth, 10);\n }\n\n get canShrink() {\n return this.width && this.width > this.minWidth;\n }\n\n get roomToShrink() {\n return this.width ? this.width - this.minWidth : 0;\n }\n\n get isResizable() {\n return this.options.isResizable ?? this.tableMeta.isResizable;\n }\n\n get hasResizeHandle() {\n const previous = columns.previous(this.column);\n\n if (!previous) return false;\n\n return (\n this.isResizable && meta.forColumn(previous, ColumnResizing).isResizable\n );\n }\n\n get width() {\n let width = this._width ?? this.initialWidth;\n\n if (!width) {\n const { defaultColumnWidth } = this.tableMeta;\n\n width = defaultColumnWidth\n ? Math.max(defaultColumnWidth, this.minWidth)\n : this.minWidth;\n }\n\n return width;\n }\n\n set width(value) {\n this._width = value;\n }\n\n get style() {\n const styles: Partial<Pick<CSSStyleDeclaration, 'width' | 'minWidth'>> = {};\n\n if (this.width) styles.width = `${this.width}px`;\n if (this.minWidth) styles.minWidth = `${this.minWidth}px`;\n\n return styles;\n }\n\n @action\n resize(delta: number) {\n this.tableMeta.resizeColumn(this.column, delta);\n }\n\n @action\n save() {\n this.tableMeta.saveColWidths(this.tableMeta.visibleColumnMetas);\n }\n}\n\n/**\n * @private\n *\n * individual column width must exclude:\n * - padding\n * - margin\n * - gap (partial)\n * - any other positioning offsets\n *\n * Otherwise the table will infinitely resize itself\n */\nfunction distributeDelta(delta: number, visibleColumns: Column[]) {\n if (delta === 0) return;\n\n const metas = visibleColumns.map((column) =>\n meta.forColumn(column, ColumnResizing),\n );\n\n const resizableMetas = metas.filter(\n (meta) => meta.isResizable && (delta < 0 ? meta.canShrink : true),\n );\n\n const columnDelta = delta / resizableMetas.length;\n\n for (const meta of resizableMetas) {\n assert('cannot resize a column that does not have a width', meta.width);\n meta.width = Math.max(meta.width + columnDelta, meta.minWidth);\n }\n}\n\n/**\n * @private\n *\n * Contains resizable and width information regarding the table as a whole\n */\nexport class TableMeta {\n constructor(private table: Table) {}\n\n @tracked scrollContainerHeight?: number;\n @tracked scrollContainerWidth?: number;\n\n get options() {\n return options.forTable(this.table, ColumnResizing);\n }\n\n get isResizable() {\n return this.options?.enabled ?? true;\n }\n\n get defaultColumnWidth() {\n if (!this.scrollContainerWidth) return;\n\n return (\n (this.scrollContainerWidth - this.totalInitialColumnWidths) /\n this.columnsWithoutInitialWidth.length\n );\n }\n\n get #availableColumns() {\n return columns.for(this.table, ColumnResizing);\n }\n\n get visibleColumnMetas() {\n return this.#availableColumns.map((column) =>\n meta.forColumn(column, ColumnResizing),\n );\n }\n\n get totalInitialColumnWidths() {\n return this.visibleColumnMetas.reduce(\n (acc, meta) => (acc += meta.initialWidth ?? 0),\n 0,\n );\n }\n\n get columnsWithoutInitialWidth() {\n return this.visibleColumnMetas.filter((meta) => !meta.initialWidth);\n }\n\n get totalVisibleColumnsWidth() {\n return this.visibleColumnMetas.reduce(\n (acc, column) => (acc += column.width ?? 0),\n 0,\n );\n }\n\n @action\n saveColWidths(visibleColumnMetas: ColumnMeta[]) {\n const tablePrefs = this.table.preferences;\n\n for (const column of visibleColumnMetas) {\n const existing = tablePrefs.storage.forPlugin('ColumnResizing');\n const columnPrefs = existing.forColumn(column.key);\n\n columnPrefs.set('width', column.width.toString());\n }\n\n tablePrefs.persist();\n }\n\n @action\n reset() {\n if (!this.scrollContainerWidth) return;\n\n for (const column of this.visibleColumnMetas) {\n column._width = undefined;\n }\n }\n\n @action\n onTableResize(entry: ResizeObserverEntry) {\n assert(\n 'scroll container element must be an HTMLElement',\n entry.target instanceof HTMLElement,\n );\n\n this.scrollContainerWidth = getAccurateClientWidth(entry.target);\n this.scrollContainerHeight = getAccurateClientHeight(entry.target);\n\n // TODO: extract this to card-list and remove it from the plugin\n // card-list will provide its own column-resizing plugin\n // by sub-classing this one, and defining its own way of calculating the \"diff\"\n const totalGap = totalGapOf(entry.target.querySelector('[role=\"row\"]'));\n const diff =\n this.scrollContainerWidth - this.totalVisibleColumnsWidth - totalGap;\n\n distributeDelta(diff, this.#availableColumns);\n }\n\n @action\n resizeColumn(column: Column, delta: number) {\n if (delta === 0) return;\n\n /**\n * When the delta is negative, we are dragging to the next\n * when positive, we are dragging to the right\n * when dragging to the right, we want to grow the column\n * when dragging to the left, we grow the \"next\" column,\n * which shrinks the column we're dragging\n *\n * This assumes the resize handle for any column is on the right-hand\n * side of the column header\n *\n * If the resize handle were on the left-hand side of the column header\n * we'd want the column.next to be column.previous\n *\n * This is CSS dependent, and can be configured in plugin\n * options\n */\n const isDraggingRight = delta > 0;\n const position = this.options?.handlePosition ?? 'left';\n\n let growingColumn: Column | null | undefined;\n\n if (position === 'right') {\n growingColumn = isDraggingRight ? columns.next(column) : column;\n } else {\n growingColumn = isDraggingRight ? columns.previous(column) : column;\n }\n\n if (!growingColumn) return;\n\n const growingColumnMeta = meta.forColumn(growingColumn, ColumnResizing);\n\n assert(\n 'cannot resize a column that does not have a width',\n growingColumnMeta.width,\n );\n\n const shrinkableColumns =\n delta > 0\n ? columns.after(growingColumn)\n : columns.before(growingColumn).reverse();\n\n const shrinkableColumnsMetas = shrinkableColumns\n .map((column) => meta.forColumn(column, ColumnResizing))\n .filter((meta) => meta.canShrink);\n\n let remainder = Math.abs(delta);\n\n while (shrinkableColumnsMetas.length > 0) {\n const shrinkingColumnMeta = shrinkableColumnsMetas.shift();\n\n assert(\n 'cannot resize a column that does not have a width',\n shrinkingColumnMeta?.width,\n );\n\n const actualDelta = Math.min(remainder, shrinkingColumnMeta.roomToShrink);\n\n growingColumnMeta.width += actualDelta;\n shrinkingColumnMeta.width -= actualDelta;\n remainder -= actualDelta;\n }\n }\n}\n\n/**\n * @private\n * included in the same file as the plugin due to circular dependency\n *\n * This goes on the containing element\n *\n * @example\n * ```hbs\n * <div {{resizeObserver @table}}>\n * <table>\n * ```\n */\nfunction resizeObserver(element: HTMLElement, table: Table) {\n const observer = getObserver(element, table);\n\n observer.observe(element);\n\n return () => {\n observer.unobserve(element);\n };\n}\n\nconst CACHE = new WeakMap<HTMLElement, ResizeObserver>();\n\n/**\n * This is technically \"inefficient\" as you don't want too many resize\n * observers on a page, but tables are so big, that I don't see too many use cases\n * where you'd have 10+ tables on a page\n */\nfunction getObserver(element: HTMLElement, table: Table): ResizeObserver {\n let existing = CACHE.get(element);\n\n if (existing) return existing;\n\n existing = new ResizeObserver((entries: ResizeObserverEntry[]) => {\n if (isDestroyed(table) || isDestroying(table)) {\n return;\n }\n\n for (const entry of entries) {\n meta.forTable(table, ColumnResizing).onTableResize(entry);\n }\n });\n\n return existing;\n}\n"],"names":["ColumnResizing","BasePlugin","constructor","args","_defineProperty","column","ColumnMeta","table","TableMeta","element","columnMeta","meta","forColumn","setAttribute","isResizable","applyStyles","style","resizeObserver","reset","preferences","forAllColumns","delete","DEFAULT_COLUMN_OPTIONS","minWidth","ALLOWED_COLUMN_OPTIONS","_class","_initializerDefineProperty","_descriptor","_descriptor2","tableMeta","forTable","options","columnOptions","filteredOptions","Object","entries","reduce","result","k","v","includes","key","initialWidth","savedWidth","get","width","assert","parseInt","canShrink","roomToShrink","hasResizeHandle","previous","columns","_width","defaultColumnWidth","Math","max","value","styles","resize","delta","resizeColumn","save","saveColWidths","visibleColumnMetas","_applyDecoratedDescriptor","prototype","tracked","configurable","enumerable","writable","initializer","cached","getOwnPropertyDescriptor","action","distributeDelta","visibleColumns","metas","map","resizableMetas","filter","columnDelta","length","_class2","_TableMeta_brand","WeakSet","_classPrivateMethodInitSpec","_descriptor3","_descriptor4","enabled","scrollContainerWidth","totalInitialColumnWidths","columnsWithoutInitialWidth","_classPrivateGetter","_get_availableColumns","acc","totalVisibleColumnsWidth","tablePrefs","existing","storage","forPlugin","columnPrefs","set","toString","persist","undefined","onTableResize","entry","target","HTMLElement","getAccurateClientWidth","scrollContainerHeight","getAccurateClientHeight","totalGap","totalGapOf","querySelector","diff","isDraggingRight","position","handlePosition","growingColumn","next","growingColumnMeta","shrinkableColumns","after","before","reverse","shrinkableColumnsMetas","remainder","abs","shrinkingColumnMeta","shift","actualDelta","min","_this","for","observer","getObserver","observe","unobserve","CACHE","WeakMap","ResizeObserver","isDestroyed","isDestroying"],"mappings":";;;;;;;;;;AAkFA;AACA;AACA;AACA;AACO,MAAMA,cAAc,SAASC,UAAU,CAAY;AAAAC,EAAAA,WAAAA,CAAA,GAAAC,IAAA,EAAA;AAAA,IAAA,KAAA,CAAA,GAAAA,IAAA,CAAA;AAAAC,IAAAA,eAAA,eACjD,iBAAiB,CAAA;AAAAA,IAAAA,eAAA,CAGjB,IAAA,EAAA,MAAA,EAAA;AACLC,MAAAA,MAAM,EAAEC,UAAU;AAClBC,MAAAA,KAAK,EAAEC;KACR,CAAA;IAAAJ,eAAA,CAAA,IAAA,EAAA,oBAAA,EAEoB,CAACK,OAAoB,EAAE;AAAEJ,MAAAA;AAAkB,KAAC,KAAK;MACpE,MAAMK,UAAU,GAAGC,IAAI,CAACC,SAAS,CAACP,MAAM,EAAEL,cAAc,CAAC;MAEzDS,OAAO,CAACI,YAAY,CAAC,wBAAwB,EAAE,GAAGH,UAAU,CAACI,WAAW,CAAA,CAAE,CAAC;AAE3EC,MAAAA,WAAW,CAACN,OAAO,EAAEC,UAAU,CAACM,KAAK,CAAC;KACvC,CAAA;AAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AAPEZ,IAAAA,eAAA,4BAQoBa,cAAc,CAAA;AAAA;AAElCC,EAAAA,KAAKA,GAAG;AACNC,IAAAA,WAAW,CAACC,aAAa,CAAC,IAAI,CAACb,KAAK,EAAEP,cAAc,CAAC,CAACqB,MAAM,CAAC,OAAO,CAAC;AACvE;AACF;AAACjB,eAAA,CA9BYJ,cAAc,EAEP,UAAA,EAAA,CAAC,aAAa,CAAC,CAAA;AA8BnC,MAAMsB,sBAAsB,GAAG;AAC7BC,EAAAA,QAAQ,EAAE;AACZ,CAAC;AAED,MAAMC,sBAAsB,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,aAAa,CAAC;;AAEnE;AACA;AACA;AACA;AACA;AACA,IAAalB,UAAU,IAAAmB,MAAA,GAAhB,MAAMnB,UAAU,CAAC;EACtBJ,WAAWA,CAASG,MAAc,EAAE;AAAAqB,IAAAA,0BAAA,iBAAAC,WAAA,EAAA,IAAA,CAAA;AAAAD,IAAAA,0BAAA,qBAAAE,YAAA,EAAA,IAAA,CAAA;IAAA,IAAhBvB,CAAAA,MAAc,GAAdA,MAAc;AAAG;EAKrC,IAAIwB,SAASA,GAAG;IACd,OAAOlB,IAAI,CAACmB,QAAQ,CAAC,IAAI,CAACzB,MAAM,CAACE,KAAK,EAAEP,cAAc,CAAC;AACzD;EAEA,IACI+B,OAAOA,GAAG;IACZ,MAAMC,aAAa,GAAGD,OAAO,CAACnB,SAAS,CAAC,IAAI,CAACP,MAAM,EAAEL,cAAc,CAAC;IACpE,MAAMiC,eAAe,GAAGC,MAAM,CAACC,OAAO,CAACH,aAAa,IAAI,EAAE,CAAC,CAACI,MAAM,CAChE,CAACC,MAAM,EAAE,CAACC,CAAC,EAAEC,CAAC,CAAC,KAAK;AAClB,MAAA,IAAIf,sBAAsB,CAACgB,QAAQ,CAACF,CAAC,CAAC,EAAE;AACtCD,QAAAA,MAAM,CAACC,CAAC,CAAC,GAAGC,CAAC;AACf;AAEA,MAAA,OAAOF,MAAM;KACd,EACD,EACF,CAAkB;IAElB,OAAO;AACL,MAAA,GAAGf,sBAAsB;MACzB,GAAGW;KACJ;AACH;EAEA,IAAIQ,GAAGA,GAAG;AACR,IAAA,OAAO,IAAI,CAACpC,MAAM,CAACoC,GAAG;AACxB;EAEA,IAAIlB,QAAQA,GAAG;AACb,IAAA,OAAO,IAAI,CAACQ,OAAO,CAACR,QAAQ;AAC9B;EAEA,IAAImB,YAAYA,GAAG;AACjB,IAAA,MAAMC,UAAU,GAAGxB,WAAW,CAC3BP,SAAS,CAAC,IAAI,CAACP,MAAM,EAAEL,cAAc,CAAC,CACtC4C,GAAG,CAAC,OAAO,CAAC;IAEf,IAAI,CAACD,UAAU,EAAE;AACf,MAAA,OAAO,IAAI,CAACZ,OAAO,CAACc,KAAK;AAC3B;AAEA,IAAA,IAAI,OAAOF,UAAU,KAAK,QAAQ,EAAE;AAClCG,MAAAA,MAAM,CACJ,wCAAwC,EACxC,OAAOH,UAAU,KAAK,QACxB,CAAC;AACD,MAAA,OAAOA,UAAU;AACnB;AAEA,IAAA,OAAOI,QAAQ,CAACJ,UAAU,EAAE,EAAE,CAAC;AACjC;EAEA,IAAIK,SAASA,GAAG;IACd,OAAO,IAAI,CAACH,KAAK,IAAI,IAAI,CAACA,KAAK,GAAG,IAAI,CAACtB,QAAQ;AACjD;EAEA,IAAI0B,YAAYA,GAAG;AACjB,IAAA,OAAO,IAAI,CAACJ,KAAK,GAAG,IAAI,CAACA,KAAK,GAAG,IAAI,CAACtB,QAAQ,GAAG,CAAC;AACpD;EAEA,IAAIT,WAAWA,GAAG;IAChB,OAAO,IAAI,CAACiB,OAAO,CAACjB,WAAW,IAAI,IAAI,CAACe,SAAS,CAACf,WAAW;AAC/D;EAEA,IAAIoC,eAAeA,GAAG;IACpB,MAAMC,QAAQ,GAAGC,OAAO,CAACD,QAAQ,CAAC,IAAI,CAAC9C,MAAM,CAAC;AAE9C,IAAA,IAAI,CAAC8C,QAAQ,EAAE,OAAO,KAAK;AAE3B,IAAA,OACE,IAAI,CAACrC,WAAW,IAAIH,IAAI,CAACC,SAAS,CAACuC,QAAQ,EAAEnD,cAAc,CAAC,CAACc,WAAW;AAE5E;EAEA,IAAI+B,KAAKA,GAAG;IACV,IAAIA,KAAK,GAAG,IAAI,CAACQ,MAAM,IAAI,IAAI,CAACX,YAAY;IAE5C,IAAI,CAACG,KAAK,EAAE;MACV,MAAM;AAAES,QAAAA;OAAoB,GAAG,IAAI,CAACzB,SAAS;AAE7CgB,MAAAA,KAAK,GAAGS,kBAAkB,GACtBC,IAAI,CAACC,GAAG,CAACF,kBAAkB,EAAE,IAAI,CAAC/B,QAAQ,CAAC,GAC3C,IAAI,CAACA,QAAQ;AACnB;AAEA,IAAA,OAAOsB,KAAK;AACd;EAEA,IAAIA,KAAKA,CAACY,KAAK,EAAE;IACf,IAAI,CAACJ,MAAM,GAAGI,KAAK;AACrB;EAEA,IAAIzC,KAAKA,GAAG;IACV,MAAM0C,MAAgE,GAAG,EAAE;AAE3E,IAAA,IAAI,IAAI,CAACb,KAAK,EAAEa,MAAM,CAACb,KAAK,GAAG,CAAG,EAAA,IAAI,CAACA,KAAK,CAAI,EAAA,CAAA;AAChD,IAAA,IAAI,IAAI,CAACtB,QAAQ,EAAEmC,MAAM,CAACnC,QAAQ,GAAG,CAAG,EAAA,IAAI,CAACA,QAAQ,CAAI,EAAA,CAAA;AAEzD,IAAA,OAAOmC,MAAM;AACf;EAGAC,MAAMA,CAACC,KAAa,EAAE;IACpB,IAAI,CAAC/B,SAAS,CAACgC,YAAY,CAAC,IAAI,CAACxD,MAAM,EAAEuD,KAAK,CAAC;AACjD;AAGAE,EAAAA,IAAIA,GAAG;IACL,IAAI,CAACjC,SAAS,CAACkC,aAAa,CAAC,IAAI,CAAClC,SAAS,CAACmC,kBAAkB,CAAC;AACjE;AACF,CAAC,EAAArC,WAAA,GAAAsC,yBAAA,CAAAxC,MAAA,CAAAyC,SAAA,EAAA,QAAA,EAAA,CAjHEC,OAAO,CAAA,EAAA;EAAAC,YAAA,EAAA,IAAA;EAAAC,UAAA,EAAA,IAAA;EAAAC,QAAA,EAAA,IAAA;EAAAC,WAAA,EAAA;AAAA,CAAA3C,CAAAA,EAAAA,YAAA,GAAAqC,yBAAA,CAAAxC,MAAA,CAAAyC,SAAA,iBACPC,OAAO,CAAA,EAAA;EAAAC,YAAA,EAAA,IAAA;EAAAC,UAAA,EAAA,IAAA;EAAAC,QAAA,EAAA,IAAA;AAAAC,EAAAA,WAAA,cAAA;AAAA,IAAA,OAAc,KAAK;AAAA;AAAA,CAAA,CAAA,EAAAN,yBAAA,CAAAxC,MAAA,CAAAyC,SAAA,EAAA,SAAA,EAAA,CAM1BM,MAAM,CAAA,EAAAtC,MAAA,CAAAuC,wBAAA,CAAAhD,MAAA,CAAAyC,SAAA,EAAA,SAAA,CAAA,EAAAzC,MAAA,CAAAyC,SAAA,CAAA,EAAAD,yBAAA,CAAAxC,MAAA,CAAAyC,SAAA,EAAA,QAAA,EAAA,CAiGNQ,MAAM,CAAA,EAAAxC,MAAA,CAAAuC,wBAAA,CAAAhD,MAAA,CAAAyC,SAAA,EAAA,QAAA,CAAA,EAAAzC,MAAA,CAAAyC,SAAA,CAAA,EAAAD,yBAAA,CAAAxC,MAAA,CAAAyC,SAAA,EAAA,MAAA,EAAA,CAKNQ,MAAM,CAAA,EAAAxC,MAAA,CAAAuC,wBAAA,CAAAhD,MAAA,CAAAyC,SAAA,EAAA,MAAA,CAAA,EAAAzC,MAAA,CAAAyC,SAAA,CAAA,EAAAzC,MAAA;;AAMT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASkD,eAAeA,CAACf,KAAa,EAAEgB,cAAwB,EAAE;EAChE,IAAIhB,KAAK,KAAK,CAAC,EAAE;AAEjB,EAAA,MAAMiB,KAAK,GAAGD,cAAc,CAACE,GAAG,CAAEzE,MAAM,IACtCM,IAAI,CAACC,SAAS,CAACP,MAAM,EAAEL,cAAc,CACvC,CAAC;EAED,MAAM+E,cAAc,GAAGF,KAAK,CAACG,MAAM,CAChCrE,IAAI,IAAKA,IAAI,CAACG,WAAW,KAAK8C,KAAK,GAAG,CAAC,GAAGjD,IAAI,CAACqC,SAAS,GAAG,IAAI,CAClE,CAAC;AAED,EAAA,MAAMiC,WAAW,GAAGrB,KAAK,GAAGmB,cAAc,CAACG,MAAM;AAEjD,EAAA,KAAK,MAAMvE,IAAI,IAAIoE,cAAc,EAAE;AACjCjC,IAAAA,MAAM,CAAC,mDAAmD,EAAEnC,IAAI,CAACkC,KAAK,CAAC;AACvElC,IAAAA,IAAI,CAACkC,KAAK,GAAGU,IAAI,CAACC,GAAG,CAAC7C,IAAI,CAACkC,KAAK,GAAGoC,WAAW,EAAEtE,IAAI,CAACY,QAAQ,CAAC;AAChE;AACF;;AAEA;AACA;AACA;AACA;AACA;AACaf,IAAAA,SAAS,IAAA2E,OAAA,IAAAC,gBAAA,oBAAAC,OAAA,EAAA,EAAf,MAAM7E,SAAS,CAAC;EACrBN,WAAWA,CAASK,KAAY,EAAE;AAAA+E,IAAAA,2BAAA,OAAAF,gBAAA,CAAA;AAAA1D,IAAAA,0BAAA,gCAAA6D,YAAA,EAAA,IAAA,CAAA;AAAA7D,IAAAA,0BAAA,+BAAA8D,YAAA,EAAA,IAAA,CAAA;IAAA,IAAdjF,CAAAA,KAAY,GAAZA,KAAY;AAAG;EAKnC,IAAIwB,OAAOA,GAAG;IACZ,OAAOA,OAAO,CAACD,QAAQ,CAAC,IAAI,CAACvB,KAAK,EAAEP,cAAc,CAAC;AACrD;EAEA,IAAIc,WAAWA,GAAG;AAChB,IAAA,OAAO,IAAI,CAACiB,OAAO,EAAE0D,OAAO,IAAI,IAAI;AACtC;EAEA,IAAInC,kBAAkBA,GAAG;AACvB,IAAA,IAAI,CAAC,IAAI,CAACoC,oBAAoB,EAAE;AAEhC,IAAA,OACE,CAAC,IAAI,CAACA,oBAAoB,GAAG,IAAI,CAACC,wBAAwB,IAC1D,IAAI,CAACC,0BAA0B,CAACV,MAAM;AAE1C;EAMA,IAAIlB,kBAAkBA,GAAG;IACvB,OAAO6B,mBAAA,CAAAT,gBAAA,EAAA,IAAI,EAACU,qBAAgB,CAAC,CAAChB,GAAG,CAAEzE,MAAM,IACvCM,IAAI,CAACC,SAAS,CAACP,MAAM,EAAEL,cAAc,CACvC,CAAC;AACH;EAEA,IAAI2F,wBAAwBA,GAAG;IAC7B,OAAO,IAAI,CAAC3B,kBAAkB,CAAC5B,MAAM,CACnC,CAAC2D,GAAG,EAAEpF,IAAI,KAAMoF,GAAG,IAAIpF,IAAI,CAAC+B,YAAY,IAAI,CAAE,EAC9C,CACF,CAAC;AACH;EAEA,IAAIkD,0BAA0BA,GAAG;AAC/B,IAAA,OAAO,IAAI,CAAC5B,kBAAkB,CAACgB,MAAM,CAAErE,IAAI,IAAK,CAACA,IAAI,CAAC+B,YAAY,CAAC;AACrE;EAEA,IAAIsD,wBAAwBA,GAAG;IAC7B,OAAO,IAAI,CAAChC,kBAAkB,CAAC5B,MAAM,CACnC,CAAC2D,GAAG,EAAE1F,MAAM,KAAM0F,GAAG,IAAI1F,MAAM,CAACwC,KAAK,IAAI,CAAE,EAC3C,CACF,CAAC;AACH;EAGAkB,aAAaA,CAACC,kBAAgC,EAAE;AAC9C,IAAA,MAAMiC,UAAU,GAAG,IAAI,CAAC1F,KAAK,CAACY,WAAW;AAEzC,IAAA,KAAK,MAAMd,MAAM,IAAI2D,kBAAkB,EAAE;MACvC,MAAMkC,QAAQ,GAAGD,UAAU,CAACE,OAAO,CAACC,SAAS,CAAC,gBAAgB,CAAC;MAC/D,MAAMC,WAAW,GAAGH,QAAQ,CAACtF,SAAS,CAACP,MAAM,CAACoC,GAAG,CAAC;AAElD4D,MAAAA,WAAW,CAACC,GAAG,CAAC,OAAO,EAAEjG,MAAM,CAACwC,KAAK,CAAC0D,QAAQ,EAAE,CAAC;AACnD;IAEAN,UAAU,CAACO,OAAO,EAAE;AACtB;AAGAtF,EAAAA,KAAKA,GAAG;AACN,IAAA,IAAI,CAAC,IAAI,CAACwE,oBAAoB,EAAE;AAEhC,IAAA,KAAK,MAAMrF,MAAM,IAAI,IAAI,CAAC2D,kBAAkB,EAAE;MAC5C3D,MAAM,CAACgD,MAAM,GAAGoD,SAAS;AAC3B;AACF;EAGAC,aAAaA,CAACC,KAA0B,EAAE;IACxC7D,MAAM,CACJ,iDAAiD,EACjD6D,KAAK,CAACC,MAAM,YAAYC,WAC1B,CAAC;IAED,IAAI,CAACnB,oBAAoB,GAAGoB,sBAAsB,CAACH,KAAK,CAACC,MAAM,CAAC;IAChE,IAAI,CAACG,qBAAqB,GAAGC,uBAAuB,CAACL,KAAK,CAACC,MAAM,CAAC;;AAElE;AACA;AACA;AACA,IAAA,MAAMK,QAAQ,GAAGC,UAAU,CAACP,KAAK,CAACC,MAAM,CAACO,aAAa,CAAC,cAAc,CAAC,CAAC;IACvE,MAAMC,IAAI,GACR,IAAI,CAAC1B,oBAAoB,GAAG,IAAI,CAACM,wBAAwB,GAAGiB,QAAQ;IAEtEtC,eAAe,CAACyC,IAAI,EAAEvB,mBAAA,CAAAT,gBAAA,EAAI,IAAA,EAACU,qBAAgB,CAAC,CAAC;AAC/C;AAGAjC,EAAAA,YAAYA,CAACxD,MAAc,EAAEuD,KAAa,EAAE;IAC1C,IAAIA,KAAK,KAAK,CAAC,EAAE;;AAEjB;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACI,IAAA,MAAMyD,eAAe,GAAGzD,KAAK,GAAG,CAAC;IACjC,MAAM0D,QAAQ,GAAG,IAAI,CAACvF,OAAO,EAAEwF,cAAc,IAAI,MAAM;AAEvD,IAAA,IAAIC,aAAwC;IAE5C,IAAIF,QAAQ,KAAK,OAAO,EAAE;MACxBE,aAAa,GAAGH,eAAe,GAAGjE,OAAO,CAACqE,IAAI,CAACpH,MAAM,CAAC,GAAGA,MAAM;AACjE,KAAC,MAAM;MACLmH,aAAa,GAAGH,eAAe,GAAGjE,OAAO,CAACD,QAAQ,CAAC9C,MAAM,CAAC,GAAGA,MAAM;AACrE;IAEA,IAAI,CAACmH,aAAa,EAAE;IAEpB,MAAME,iBAAiB,GAAG/G,IAAI,CAACC,SAAS,CAAC4G,aAAa,EAAExH,cAAc,CAAC;AAEvE8C,IAAAA,MAAM,CACJ,mDAAmD,EACnD4E,iBAAiB,CAAC7E,KACpB,CAAC;IAED,MAAM8E,iBAAiB,GACrB/D,KAAK,GAAG,CAAC,GACLR,OAAO,CAACwE,KAAK,CAACJ,aAAa,CAAC,GAC5BpE,OAAO,CAACyE,MAAM,CAACL,aAAa,CAAC,CAACM,OAAO,EAAE;IAE7C,MAAMC,sBAAsB,GAAGJ,iBAAiB,CAC7C7C,GAAG,CAAEzE,MAAM,IAAKM,IAAI,CAACC,SAAS,CAACP,MAAM,EAAEL,cAAc,CAAC,CAAC,CACvDgF,MAAM,CAAErE,IAAI,IAAKA,IAAI,CAACqC,SAAS,CAAC;AAEnC,IAAA,IAAIgF,SAAS,GAAGzE,IAAI,CAAC0E,GAAG,CAACrE,KAAK,CAAC;AAE/B,IAAA,OAAOmE,sBAAsB,CAAC7C,MAAM,GAAG,CAAC,EAAE;AACxC,MAAA,MAAMgD,mBAAmB,GAAGH,sBAAsB,CAACI,KAAK,EAAE;AAE1DrF,MAAAA,MAAM,CACJ,mDAAmD,EACnDoF,mBAAmB,EAAErF,KACvB,CAAC;MAED,MAAMuF,WAAW,GAAG7E,IAAI,CAAC8E,GAAG,CAACL,SAAS,EAAEE,mBAAmB,CAACjF,YAAY,CAAC;MAEzEyE,iBAAiB,CAAC7E,KAAK,IAAIuF,WAAW;MACtCF,mBAAmB,CAACrF,KAAK,IAAIuF,WAAW;AACxCJ,MAAAA,SAAS,IAAII,WAAW;AAC1B;AACF;AACF,CAAC,CAAA,EAAA7C,YAAA,GAAAtB,yBAAA,CAAAkB,OAAA,CAAAjB,SAAA,EAAA,uBAAA,EAAA,CA7JEC,OAAO,CAAA,EAAA;EAAAC,YAAA,EAAA,IAAA;EAAAC,UAAA,EAAA,IAAA;EAAAC,QAAA,EAAA,IAAA;EAAAC,WAAA,EAAA;AAAA,CAAAiB,CAAAA,EAAAA,YAAA,GAAAvB,yBAAA,CAAAkB,OAAA,CAAAjB,SAAA,2BACPC,OAAO,CAAA,EAAA;EAAAC,YAAA,EAAA,IAAA;EAAAC,UAAA,EAAA,IAAA;EAAAC,QAAA,EAAA,IAAA;EAAAC,WAAA,EAAA;AAAA,CAAA,CAAA,EAAAN,yBAAA,CAAAkB,OAAA,CAAAjB,SAAA,oBA+CPQ,MAAM,CAAA,EAAAxC,MAAA,CAAAuC,wBAAA,CAAAU,OAAA,CAAAjB,SAAA,EAAA,eAAA,CAAA,EAAAiB,OAAA,CAAAjB,SAAA,CAAAD,EAAAA,yBAAA,CAAAkB,OAAA,CAAAjB,SAAA,EAAA,OAAA,EAAA,CAcNQ,MAAM,CAAAxC,EAAAA,MAAA,CAAAuC,wBAAA,CAAAU,OAAA,CAAAjB,SAAA,EAAAiB,OAAAA,CAAAA,EAAAA,OAAA,CAAAjB,SAAA,CAAA,EAAAD,yBAAA,CAAAkB,OAAA,CAAAjB,SAAA,EASNQ,eAAAA,EAAAA,CAAAA,MAAM,GAAAxC,MAAA,CAAAuC,wBAAA,CAAAU,OAAA,CAAAjB,SAAA,oBAAAiB,OAAA,CAAAjB,SAAA,CAAAD,EAAAA,yBAAA,CAAAkB,OAAA,CAAAjB,SAAA,EAAA,cAAA,EAAA,CAoBNQ,MAAM,CAAA,EAAAxC,MAAA,CAAAuC,wBAAA,CAAAU,OAAA,CAAAjB,SAAA,EAAA,cAAA,CAAA,EAAAiB,OAAA,CAAAjB,SAAA,GAAAiB,OAAA;;AAoET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAXA,SAAAW,qBAAAA,CAAAwC,KAAA,EA3I0B;EACtB,OAAOlF,OAAO,CAACmF,GAAG,CAACD,KAAA,CAAK/H,KAAK,EAAEP,cAAc,CAAC;AAChD;AAqJF,SAASiB,cAAcA,CAACR,OAAoB,EAAEF,KAAY,EAAE;AAC1D,EAAA,MAAMiI,QAAQ,GAAGC,WAAW,CAAChI,OAAO,EAAEF,KAAK,CAAC;AAE5CiI,EAAAA,QAAQ,CAACE,OAAO,CAACjI,OAAO,CAAC;AAEzB,EAAA,OAAO,MAAM;AACX+H,IAAAA,QAAQ,CAACG,SAAS,CAAClI,OAAO,CAAC;GAC5B;AACH;AAEA,MAAMmI,KAAK,GAAG,IAAIC,OAAO,EAA+B;;AAExD;AACA;AACA;AACA;AACA;AACA,SAASJ,WAAWA,CAAChI,OAAoB,EAAEF,KAAY,EAAkB;AACvE,EAAA,IAAI2F,QAAQ,GAAG0C,KAAK,CAAChG,GAAG,CAACnC,OAAO,CAAC;EAEjC,IAAIyF,QAAQ,EAAE,OAAOA,QAAQ;AAE7BA,EAAAA,QAAQ,GAAG,IAAI4C,cAAc,CAAE3G,OAA8B,IAAK;IAChE,IAAI4G,WAAW,CAACxI,KAAK,CAAC,IAAIyI,YAAY,CAACzI,KAAK,CAAC,EAAE;AAC7C,MAAA;AACF;AAEA,IAAA,KAAK,MAAMoG,KAAK,IAAIxE,OAAO,EAAE;MAC3BxB,IAAI,CAACmB,QAAQ,CAACvB,KAAK,EAAEP,cAAc,CAAC,CAAC0G,aAAa,CAACC,KAAK,CAAC;AAC3D;AACF,GAAC,CAAC;AAEF,EAAA,OAAOT,QAAQ;AACjB;;;;"}
@@ -0,0 +1,44 @@
1
+ import { isDestroyed, isDestroying } from '@ember/destroyable';
2
+
3
+ /**
4
+ * @private
5
+ * included in the same file as the plugin due to circular dependency
6
+ *
7
+ * This goes on the containing element
8
+ *
9
+ * @example
10
+ * ```hbs
11
+ * <div {{resizeObserver @table}}>
12
+ * <table>
13
+ * ```
14
+ */
15
+ function resizeObserver(element, table) {
16
+ const observer = getObserver(element, table);
17
+ observer.observe(element);
18
+ return () => {
19
+ observer.unobserve(element);
20
+ };
21
+ }
22
+ const CACHE = new WeakMap();
23
+
24
+ /**
25
+ * This is technically "inefficient" as you don't want too many resize
26
+ * observers on a page, but tables are so big, that I don't see too many use cases
27
+ * where you'd have 10+ tables on a page
28
+ */
29
+ function getObserver(element, table) {
30
+ let existing = CACHE.get(element);
31
+ if (existing) return existing;
32
+ existing = new ResizeObserver(entries => {
33
+ if (isDestroyed(table) || isDestroying(table)) {
34
+ return;
35
+ }
36
+ for (const entry of entries) {
37
+ table.handleScrollContainerResize(entry);
38
+ }
39
+ });
40
+ return existing;
41
+ }
42
+
43
+ export { resizeObserver };
44
+ //# sourceMappingURL=resize-observer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resize-observer.js","sources":["../../../src/plugins/column-resizing/resize-observer.ts"],"sourcesContent":["import { isDestroyed, isDestroying } from '@ember/destroyable';\n\n/**\n * @private\n * included in the same file as the plugin due to circular dependency\n *\n * This goes on the containing element\n *\n * @example\n * ```hbs\n * <div {{resizeObserver @table}}>\n * <table>\n * ```\n */\nexport function resizeObserver(element: HTMLElement, table: any) {\n const observer = getObserver(element, table);\n\n observer.observe(element);\n\n return () => {\n observer.unobserve(element);\n };\n}\n\nconst CACHE = new WeakMap<HTMLElement, ResizeObserver>();\n\n/**\n * This is technically \"inefficient\" as you don't want too many resize\n * observers on a page, but tables are so big, that I don't see too many use cases\n * where you'd have 10+ tables on a page\n */\nfunction getObserver(element: HTMLElement, table: any): ResizeObserver {\n let existing = CACHE.get(element);\n\n if (existing) return existing;\n\n existing = new ResizeObserver((entries: ResizeObserverEntry[]) => {\n if (isDestroyed(table) || isDestroying(table)) {\n return;\n }\n\n for (const entry of entries) {\n table.handleScrollContainerResize(entry);\n }\n });\n\n return existing;\n}\n"],"names":["resizeObserver","element","table","observer","getObserver","observe","unobserve","CACHE","WeakMap","existing","get","ResizeObserver","entries","isDestroyed","isDestroying","entry","handleScrollContainerResize"],"mappings":";;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASA,cAAcA,CAACC,OAAoB,EAAEC,KAAU,EAAE;AAC/D,EAAA,MAAMC,QAAQ,GAAGC,WAAW,CAACH,OAAO,EAAEC,KAAK,CAAC;AAE5CC,EAAAA,QAAQ,CAACE,OAAO,CAACJ,OAAO,CAAC;AAEzB,EAAA,OAAO,MAAM;AACXE,IAAAA,QAAQ,CAACG,SAAS,CAACL,OAAO,CAAC;GAC5B;AACH;AAEA,MAAMM,KAAK,GAAG,IAAIC,OAAO,EAA+B;;AAExD;AACA;AACA;AACA;AACA;AACA,SAASJ,WAAWA,CAACH,OAAoB,EAAEC,KAAU,EAAkB;AACrE,EAAA,IAAIO,QAAQ,GAAGF,KAAK,CAACG,GAAG,CAACT,OAAO,CAAC;EAEjC,IAAIQ,QAAQ,EAAE,OAAOA,QAAQ;AAE7BA,EAAAA,QAAQ,GAAG,IAAIE,cAAc,CAAEC,OAA8B,IAAK;IAChE,IAAIC,WAAW,CAACX,KAAK,CAAC,IAAIY,YAAY,CAACZ,KAAK,CAAC,EAAE;AAC7C,MAAA;AACF;AAEA,IAAA,KAAK,MAAMa,KAAK,IAAIH,OAAO,EAAE;AAC3BV,MAAAA,KAAK,CAACc,2BAA2B,CAACD,KAAK,CAAC;AAC1C;AACF,GAAC,CAAC;AAEF,EAAA,OAAON,QAAQ;AACjB;;;;"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ We want to make sure we get the clientWidth rather than the
3
+ offsetWidth so that the width of the scrollbar is not included when we're
4
+ resizing the columns in the table so that they fit within the scroll
5
+ container
6
+
7
+ Ideally we would just use `entry.contentRect.width`, which we can access
8
+ without triggering any reflows. Unfortunately there are differences in the
9
+ way that this works in Chrome vs Firefox. In Chrome, the
10
+ `entry.contentRect.width` works the same as `entry.target.clientWidth`,
11
+ which does not include the width that is taken up by the vertical scrollbar
12
+ if the element overflows. In Firefox the `entry.contentRect.width` is the
13
+ same as `entry.target.offsetWidth`, which does include the width taken up by
14
+ the scrollbar.
15
+
16
+ We use `getBoundingClientRect()` because it does not round the value to an
17
+ integer, which can sometimes cause subpixel gaps.
18
+ **/
19
+ const getAccurateClientWidth = element => {
20
+ const style = getComputedStyle(element);
21
+ const padding = parseFloat(style.paddingLeft) + parseFloat(style.paddingRight);
22
+ const scrollbarWidth = element.offsetWidth - element.clientWidth;
23
+ return element.getBoundingClientRect().width - padding - scrollbarWidth;
24
+ };
25
+ const totalGapOf = element => {
26
+ if (!element) return 0;
27
+ const style = getComputedStyle(element);
28
+ const gapSize = parseFloat(style.columnGap);
29
+ const cells = element.querySelectorAll('[role="cell"], [role="columnheader"]');
30
+ let totalCellPadding = 0;
31
+ for (const cell of cells) {
32
+ const style = getComputedStyle(cell);
33
+ const padding = parseFloat(style.paddingLeft) + parseFloat(style.paddingRight);
34
+ totalCellPadding += padding;
35
+ }
36
+ return gapSize * (element.children.length - 1) + totalCellPadding;
37
+ };
38
+ const getAccurateClientHeight = element => {
39
+ const scrollbarHeight = element.offsetHeight - element.clientHeight;
40
+ return element.getBoundingClientRect().height - scrollbarHeight;
41
+ };
42
+
43
+ export { getAccurateClientHeight, getAccurateClientWidth, totalGapOf };
44
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sources":["../../../src/plugins/column-resizing/utils.ts"],"sourcesContent":["/**\n We want to make sure we get the clientWidth rather than the\n offsetWidth so that the width of the scrollbar is not included when we're\n resizing the columns in the table so that they fit within the scroll\n container\n\n Ideally we would just use `entry.contentRect.width`, which we can access\n without triggering any reflows. Unfortunately there are differences in the\n way that this works in Chrome vs Firefox. In Chrome, the\n `entry.contentRect.width` works the same as `entry.target.clientWidth`,\n which does not include the width that is taken up by the vertical scrollbar\n if the element overflows. In Firefox the `entry.contentRect.width` is the\n same as `entry.target.offsetWidth`, which does include the width taken up by\n the scrollbar.\n\n We use `getBoundingClientRect()` because it does not round the value to an\n integer, which can sometimes cause subpixel gaps.\n**/\nexport const getAccurateClientWidth = (element: HTMLElement) => {\n const style = getComputedStyle(element);\n const padding =\n parseFloat(style.paddingLeft) + parseFloat(style.paddingRight);\n const scrollbarWidth = element.offsetWidth - element.clientWidth;\n\n return element.getBoundingClientRect().width - padding - scrollbarWidth;\n};\n\nexport const totalGapOf = (element?: Element | null) => {\n if (!element) return 0;\n\n const style = getComputedStyle(element);\n const gapSize = parseFloat(style.columnGap);\n const cells = element.querySelectorAll(\n '[role=\"cell\"], [role=\"columnheader\"]',\n );\n\n let totalCellPadding = 0;\n\n for (const cell of cells) {\n const style = getComputedStyle(cell);\n const padding =\n parseFloat(style.paddingLeft) + parseFloat(style.paddingRight);\n\n totalCellPadding += padding;\n }\n\n return gapSize * (element.children.length - 1) + totalCellPadding;\n};\n\nexport const getAccurateClientHeight = (element: HTMLElement) => {\n const scrollbarHeight = element.offsetHeight - element.clientHeight;\n\n return element.getBoundingClientRect().height - scrollbarHeight;\n};\n"],"names":["getAccurateClientWidth","element","style","getComputedStyle","padding","parseFloat","paddingLeft","paddingRight","scrollbarWidth","offsetWidth","clientWidth","getBoundingClientRect","width","totalGapOf","gapSize","columnGap","cells","querySelectorAll","totalCellPadding","cell","children","length","getAccurateClientHeight","scrollbarHeight","offsetHeight","clientHeight","height"],"mappings":"AAAA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACaA,MAAAA,sBAAsB,GAAIC,OAAoB,IAAK;AAC9D,EAAA,MAAMC,KAAK,GAAGC,gBAAgB,CAACF,OAAO,CAAC;AACvC,EAAA,MAAMG,OAAO,GACXC,UAAU,CAACH,KAAK,CAACI,WAAW,CAAC,GAAGD,UAAU,CAACH,KAAK,CAACK,YAAY,CAAC;EAChE,MAAMC,cAAc,GAAGP,OAAO,CAACQ,WAAW,GAAGR,OAAO,CAACS,WAAW;EAEhE,OAAOT,OAAO,CAACU,qBAAqB,EAAE,CAACC,KAAK,GAAGR,OAAO,GAAGI,cAAc;AACzE;AAEaK,MAAAA,UAAU,GAAIZ,OAAwB,IAAK;AACtD,EAAA,IAAI,CAACA,OAAO,EAAE,OAAO,CAAC;AAEtB,EAAA,MAAMC,KAAK,GAAGC,gBAAgB,CAACF,OAAO,CAAC;AACvC,EAAA,MAAMa,OAAO,GAAGT,UAAU,CAACH,KAAK,CAACa,SAAS,CAAC;AAC3C,EAAA,MAAMC,KAAK,GAAGf,OAAO,CAACgB,gBAAgB,CACpC,sCACF,CAAC;EAED,IAAIC,gBAAgB,GAAG,CAAC;AAExB,EAAA,KAAK,MAAMC,IAAI,IAAIH,KAAK,EAAE;AACxB,IAAA,MAAMd,KAAK,GAAGC,gBAAgB,CAACgB,IAAI,CAAC;AACpC,IAAA,MAAMf,OAAO,GACXC,UAAU,CAACH,KAAK,CAACI,WAAW,CAAC,GAAGD,UAAU,CAACH,KAAK,CAACK,YAAY,CAAC;AAEhEW,IAAAA,gBAAgB,IAAId,OAAO;AAC7B;EAEA,OAAOU,OAAO,IAAIb,OAAO,CAACmB,QAAQ,CAACC,MAAM,GAAG,CAAC,CAAC,GAAGH,gBAAgB;AACnE;AAEaI,MAAAA,uBAAuB,GAAIrB,OAAoB,IAAK;EAC/D,MAAMsB,eAAe,GAAGtB,OAAO,CAACuB,YAAY,GAAGvB,OAAO,CAACwB,YAAY;EAEnE,OAAOxB,OAAO,CAACU,qBAAqB,EAAE,CAACe,MAAM,GAAGH,eAAe;AACjE;;;;"}
@@ -0,0 +1,25 @@
1
+ import { meta } from '../-private/base.js';
2
+ import { ColumnVisibility } from './plugin.js';
3
+
4
+ /**
5
+ * Hide a column
6
+ */
7
+ const hide = column => meta.forColumn(column, ColumnVisibility).hide();
8
+
9
+ /**
10
+ * Show a column
11
+ */
12
+ const show = column => meta.forColumn(column, ColumnVisibility).show();
13
+
14
+ /**
15
+ * Ask if a column is presently supposed to be visible
16
+ */
17
+ const isVisible = column => meta.forColumn(column, ColumnVisibility).isVisible;
18
+
19
+ /**
20
+ * Ask if a column is presently supposed to be hidden
21
+ */
22
+ const isHidden = column => meta.forColumn(column, ColumnVisibility).isHidden;
23
+
24
+ export { hide, isHidden, isVisible, show };
25
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sources":["../../../src/plugins/column-visibility/helpers.ts"],"sourcesContent":["import { meta } from '../-private/base.ts';\nimport { ColumnVisibility } from './plugin.ts';\n\nimport type { Column } from '../../index.ts';\n\n/**\n * Hide a column\n */\nexport const hide = (column: Column) =>\n meta.forColumn(column, ColumnVisibility).hide();\n\n/**\n * Show a column\n */\nexport const show = (column: Column) =>\n meta.forColumn(column, ColumnVisibility).show();\n\n/**\n * Ask if a column is presently supposed to be visible\n */\nexport const isVisible = (column: Column) =>\n meta.forColumn(column, ColumnVisibility).isVisible;\n\n/**\n * Ask if a column is presently supposed to be hidden\n */\nexport const isHidden = (column: Column) =>\n meta.forColumn(column, ColumnVisibility).isHidden;\n"],"names":["hide","column","meta","forColumn","ColumnVisibility","show","isVisible","isHidden"],"mappings":";;;AAKA;AACA;AACA;MACaA,IAAI,GAAIC,MAAc,IACjCC,IAAI,CAACC,SAAS,CAACF,MAAM,EAAEG,gBAAgB,CAAC,CAACJ,IAAI;;AAE/C;AACA;AACA;MACaK,IAAI,GAAIJ,MAAc,IACjCC,IAAI,CAACC,SAAS,CAACF,MAAM,EAAEG,gBAAgB,CAAC,CAACC,IAAI;;AAE/C;AACA;AACA;AACaC,MAAAA,SAAS,GAAIL,MAAc,IACtCC,IAAI,CAACC,SAAS,CAACF,MAAM,EAAEG,gBAAgB,CAAC,CAACE;;AAE3C;AACA;AACA;AACaC,MAAAA,QAAQ,GAAIN,MAAc,IACrCC,IAAI,CAACC,SAAS,CAACF,MAAM,EAAEG,gBAAgB,CAAC,CAACG;;;;"}
@@ -0,0 +1,3 @@
1
+ export { hide, isHidden, isVisible, show } from './helpers.js';
2
+ export { ColumnVisibility, ColumnVisibility as Plugin } from './plugin.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -0,0 +1,92 @@
1
+ import { _ as _defineProperty, a as _applyDecoratedDescriptor } from '../../_rollupPluginBabelHelpers-BpiaYhlf.js';
2
+ import { cached } from '@glimmer/tracking';
3
+ import { action } from '@ember/object';
4
+ import { BasePlugin, preferences, meta, options } from '../-private/base.js';
5
+
6
+ var _class;
7
+ class ColumnVisibility extends BasePlugin {
8
+ constructor(...args) {
9
+ super(...args);
10
+ _defineProperty(this, "name", 'column-visibility');
11
+ _defineProperty(this, "meta", {
12
+ column: ColumnMeta,
13
+ table: TableMeta
14
+ });
15
+ }
16
+ reset() {
17
+ preferences.forAllColumns(this.table, ColumnVisibility).delete('isVisible');
18
+ }
19
+ get columns() {
20
+ return meta.forTable(this.table, ColumnVisibility).visibleColumns;
21
+ }
22
+ }
23
+ _defineProperty(ColumnVisibility, "features", ['columnVisibility']);
24
+ class ColumnMeta {
25
+ constructor(column) {
26
+ _defineProperty(this, "hide", () => {
27
+ if (!this.isVisible) return;
28
+ const myPreferences = preferences.forColumn(this.column, ColumnVisibility);
29
+ const myOptions = options.forColumn(this.column, ColumnVisibility);
30
+ const currentSaved = myPreferences.get('isVisible');
31
+ const willBeDefault = Boolean(currentSaved) === !myOptions?.isVisible;
32
+ if (willBeDefault) {
33
+ myPreferences.set('isVisible', false);
34
+ // TODO: open an issue about tracked-built-ins' delete not being reactive
35
+ // myPreferences.delete('isVisible');
36
+
37
+ return;
38
+ }
39
+ myPreferences.set('isVisible', false);
40
+ });
41
+ _defineProperty(this, "show", () => {
42
+ if (this.isVisible) return;
43
+ const myPreferences = preferences.forColumn(this.column, ColumnVisibility);
44
+ const myOptions = options.forColumn(this.column, ColumnVisibility);
45
+ const currentSaved = myPreferences.get('isVisible');
46
+ const willBeDefault = currentSaved === !myOptions?.isVisible;
47
+ if (willBeDefault) {
48
+ myPreferences.set('isVisible', true);
49
+ // TODO: open an issue about tracked-built-ins' delete not being reactive
50
+ // myPreferences.delete('isVisible');
51
+
52
+ return;
53
+ }
54
+ myPreferences.set('isVisible', true);
55
+ });
56
+ _defineProperty(this, "toggle", () => {
57
+ if (this.isVisible) {
58
+ this.hide();
59
+ return;
60
+ }
61
+ this.show();
62
+ });
63
+ this.column = column;
64
+ }
65
+ get isVisible() {
66
+ const columnPreferences = preferences.forColumn(this.column, ColumnVisibility);
67
+ const columnOptions = options.forColumn(this.column, ColumnVisibility);
68
+ return Boolean(columnPreferences.get('isVisible') ?? columnOptions?.isVisible ?? true);
69
+ }
70
+ get isHidden() {
71
+ return !this.isVisible;
72
+ }
73
+ }
74
+ let TableMeta = (_class = class TableMeta {
75
+ constructor(table) {
76
+ this.table = table;
77
+ }
78
+ get visibleColumns() {
79
+ const allColumns = this.table.columns.values();
80
+ return allColumns.filter(column => {
81
+ const columnMeta = meta.forColumn(column, ColumnVisibility);
82
+ return columnMeta.isVisible;
83
+ });
84
+ }
85
+ toggleColumnVisibility(column) {
86
+ const columnMeta = meta.forColumn(column, ColumnVisibility);
87
+ columnMeta.toggle();
88
+ }
89
+ }, _applyDecoratedDescriptor(_class.prototype, "visibleColumns", [cached], Object.getOwnPropertyDescriptor(_class.prototype, "visibleColumns"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, "toggleColumnVisibility", [action], Object.getOwnPropertyDescriptor(_class.prototype, "toggleColumnVisibility"), _class.prototype), _class);
90
+
91
+ export { ColumnMeta, ColumnVisibility, TableMeta };
92
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sources":["../../../src/plugins/column-visibility/plugin.ts"],"sourcesContent":["import { cached } from '@glimmer/tracking';\nimport { action } from '@ember/object';\n\nimport { BasePlugin, meta, options, preferences } from '../-private/base.ts';\n\nimport type { Plugin, PluginPreferences } from '../../plugins/index.ts';\nimport type { Column, Table } from '../../index.ts';\n\ninterface ColumnVisibilityPreferences extends PluginPreferences {\n columns: {\n [columnKey: string]: {\n isVisible?: boolean;\n };\n };\n}\n\ndeclare module '@universal-ember/table/plugins' {\n interface Registry {\n ColumnVisibility?: ColumnVisibilityPreferences;\n 'column-visibility'?: ColumnVisibilityPreferences;\n }\n}\n\nexport interface Signature {\n Meta: {\n Table: TableMeta;\n Column: ColumnMeta;\n };\n Options: {\n Plugin: {\n enabled?: boolean;\n };\n Column: {\n /**\n * The default visibilty of the column, when rendered.\n * The column can still be toggled on and off.\n *\n * When interacting with preferences, the value stored in preferenced\n * will be the inverse of this value (to save space in storage).\n */\n isVisible?: boolean;\n };\n };\n}\n\nexport class ColumnVisibility\n extends BasePlugin<Signature>\n implements Plugin<Signature>\n{\n name = 'column-visibility';\n static features = ['columnVisibility'];\n\n meta = {\n column: ColumnMeta,\n table: TableMeta,\n };\n\n reset() {\n preferences.forAllColumns(this.table, ColumnVisibility).delete('isVisible');\n }\n\n get columns() {\n return meta.forTable(this.table, ColumnVisibility).visibleColumns;\n }\n}\n\nexport class ColumnMeta<Data = unknown> {\n constructor(private column: Column<Data>) {}\n\n get isVisible(): boolean {\n const columnPreferences = preferences.forColumn(\n this.column,\n ColumnVisibility,\n );\n const columnOptions = options.forColumn(this.column, ColumnVisibility);\n\n return Boolean(\n columnPreferences.get('isVisible') ?? columnOptions?.isVisible ?? true,\n );\n }\n\n get isHidden(): boolean {\n return !this.isVisible;\n }\n\n hide = () => {\n if (!this.isVisible) return;\n\n const myPreferences = preferences.forColumn(this.column, ColumnVisibility);\n const myOptions = options.forColumn(this.column, ColumnVisibility);\n const currentSaved = myPreferences.get('isVisible');\n const willBeDefault = Boolean(currentSaved) === !myOptions?.isVisible;\n\n if (willBeDefault) {\n myPreferences.set('isVisible', false);\n // TODO: open an issue about tracked-built-ins' delete not being reactive\n // myPreferences.delete('isVisible');\n\n return;\n }\n\n myPreferences.set('isVisible', false);\n };\n\n show = () => {\n if (this.isVisible) return;\n\n const myPreferences = preferences.forColumn(this.column, ColumnVisibility);\n const myOptions = options.forColumn(this.column, ColumnVisibility);\n const currentSaved = myPreferences.get('isVisible');\n const willBeDefault = currentSaved === !myOptions?.isVisible;\n\n if (willBeDefault) {\n myPreferences.set('isVisible', true);\n // TODO: open an issue about tracked-built-ins' delete not being reactive\n // myPreferences.delete('isVisible');\n\n return;\n }\n\n myPreferences.set('isVisible', true);\n };\n\n toggle = () => {\n if (this.isVisible) {\n this.hide();\n\n return;\n }\n\n this.show();\n };\n}\n\nexport class TableMeta<Data = unknown> {\n constructor(private table: Table<Data>) {}\n\n @cached\n get visibleColumns(): Column<Data>[] {\n const allColumns = this.table.columns.values();\n\n return allColumns.filter((column) => {\n const columnMeta = meta.forColumn(column, ColumnVisibility);\n\n return columnMeta.isVisible;\n });\n }\n\n @action\n toggleColumnVisibility(column: Column<Data>) {\n const columnMeta = meta.forColumn(column, ColumnVisibility);\n\n columnMeta.toggle();\n }\n}\n"],"names":["ColumnVisibility","BasePlugin","constructor","args","_defineProperty","column","ColumnMeta","table","TableMeta","reset","preferences","forAllColumns","delete","columns","meta","forTable","visibleColumns","isVisible","myPreferences","forColumn","myOptions","options","currentSaved","get","willBeDefault","Boolean","set","hide","show","columnPreferences","columnOptions","isHidden","_class","allColumns","values","filter","columnMeta","toggleColumnVisibility","toggle","_applyDecoratedDescriptor","prototype","cached","Object","getOwnPropertyDescriptor","action"],"mappings":"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"}