ember-headless-table 0.0.0 → 1.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 (169) hide show
  1. package/addon-main.js +5 -0
  2. package/dist/-private/-type-tests/plugin-properties.test.d.ts +2 -0
  3. package/dist/-private/-type-tests/plugin-properties.test.d.ts.map +1 -0
  4. package/dist/-private/-type-tests/plugin-properties.test.js +31 -0
  5. package/dist/-private/-type-tests/plugin-properties.test.js.map +1 -0
  6. package/dist/-private/-type-tests/plugin-with.test.d.ts +1 -0
  7. package/dist/-private/-type-tests/plugin-with.test.js +21 -0
  8. package/dist/-private/-type-tests/plugin-with.test.js.map +1 -0
  9. package/dist/-private/-type-tests/plugins-accessors.test.d.ts +1 -0
  10. package/dist/-private/-type-tests/plugins-accessors.test.js +36 -0
  11. package/dist/-private/-type-tests/plugins-accessors.test.js.map +1 -0
  12. package/dist/-private/-type-tests/plugins-signature-from.test.d.ts +1 -0
  13. package/dist/-private/-type-tests/plugins-signature-from.test.js +14 -0
  14. package/dist/-private/-type-tests/plugins-signature-from.test.js.map +1 -0
  15. package/dist/-private/-type-tests/plugins-signature-utils.test.d.ts +1 -0
  16. package/dist/-private/-type-tests/plugins-signature-utils.test.js +36 -0
  17. package/dist/-private/-type-tests/plugins-signature-utils.test.js.map +1 -0
  18. package/dist/-private/-type-tests/table-api.test.d.ts +1 -0
  19. package/dist/-private/-type-tests/table-api.test.js +16 -0
  20. package/dist/-private/-type-tests/table-api.test.js.map +1 -0
  21. package/dist/-private/-type-tests/table-config.test.d.ts +1 -0
  22. package/dist/-private/-type-tests/table-config.test.js +58 -0
  23. package/dist/-private/-type-tests/table-config.test.js.map +1 -0
  24. package/dist/-private/column.d.ts +18 -0
  25. package/dist/-private/column.js +70 -0
  26. package/dist/-private/column.js.map +1 -0
  27. package/dist/-private/interfaces/column.d.ts +57 -0
  28. package/dist/-private/interfaces/column.js +2 -0
  29. package/dist/-private/interfaces/column.js.map +1 -0
  30. package/dist/-private/interfaces/index.d.ts +7 -0
  31. package/dist/-private/interfaces/index.js +2 -0
  32. package/dist/-private/interfaces/index.js.map +1 -0
  33. package/dist/-private/interfaces/modifier.d.ts +7 -0
  34. package/dist/-private/interfaces/modifier.js +2 -0
  35. package/dist/-private/interfaces/modifier.js.map +1 -0
  36. package/dist/-private/interfaces/pagination.d.ts +17 -0
  37. package/dist/-private/interfaces/pagination.js +2 -0
  38. package/dist/-private/interfaces/pagination.js.map +1 -0
  39. package/dist/-private/interfaces/plugins.d.ts +314 -0
  40. package/dist/-private/interfaces/plugins.js +2 -0
  41. package/dist/-private/interfaces/plugins.js.map +1 -0
  42. package/dist/-private/interfaces/preferences.d.ts +74 -0
  43. package/dist/-private/interfaces/preferences.js +2 -0
  44. package/dist/-private/interfaces/preferences.js.map +1 -0
  45. package/dist/-private/interfaces/selection.d.ts +35 -0
  46. package/dist/-private/interfaces/selection.js +2 -0
  47. package/dist/-private/interfaces/selection.js.map +1 -0
  48. package/dist/-private/interfaces/table.d.ts +109 -0
  49. package/dist/-private/interfaces/table.js +2 -0
  50. package/dist/-private/interfaces/table.js.map +1 -0
  51. package/dist/-private/js-helper.d.ts +39 -0
  52. package/dist/-private/js-helper.js +20 -0
  53. package/dist/-private/js-helper.js.map +1 -0
  54. package/dist/-private/preferences.d.ts +56 -0
  55. package/dist/-private/preferences.js +175 -0
  56. package/dist/-private/preferences.js.map +1 -0
  57. package/dist/-private/private-types.d.ts +6 -0
  58. package/dist/-private/private-types.js +2 -0
  59. package/dist/-private/private-types.js.map +1 -0
  60. package/dist/-private/row.d.ts +12 -0
  61. package/dist/-private/row.js +63 -0
  62. package/dist/-private/row.js.map +1 -0
  63. package/dist/-private/table.d.ts +0 -0
  64. package/dist/-private/table.js +18 -0
  65. package/dist/-private/table.js.map +1 -0
  66. package/dist/-private/utils.d.ts +3 -0
  67. package/dist/-private/utils.js +17 -0
  68. package/dist/-private/utils.js.map +1 -0
  69. package/dist/applyDecoratedDescriptor-e0489e2f.js +31 -0
  70. package/dist/applyDecoratedDescriptor-e0489e2f.js.map +1 -0
  71. package/dist/classPrivateFieldGet-af59a8ea.js +23 -0
  72. package/dist/classPrivateFieldGet-af59a8ea.js.map +1 -0
  73. package/dist/defineProperty-a0196711.js +17 -0
  74. package/dist/defineProperty-a0196711.js.map +1 -0
  75. package/dist/index.d.ts +13 -0
  76. package/dist/index.js +4 -0
  77. package/dist/index.js.map +1 -0
  78. package/dist/plugins/-private/base.d.ts +267 -0
  79. package/dist/plugins/-private/base.js +486 -0
  80. package/dist/plugins/-private/base.js.map +1 -0
  81. package/dist/plugins/-private/utils.d.ts +21 -0
  82. package/dist/plugins/-private/utils.js +118 -0
  83. package/dist/plugins/-private/utils.js.map +1 -0
  84. package/dist/plugins/column-reordering/helpers.d.ts +28 -0
  85. package/dist/plugins/column-reordering/helpers.js +37 -0
  86. package/dist/plugins/column-reordering/helpers.js.map +1 -0
  87. package/dist/plugins/column-reordering/index.d.ts +3 -0
  88. package/dist/plugins/column-reordering/index.js +3 -0
  89. package/dist/plugins/column-reordering/index.js.map +1 -0
  90. package/dist/plugins/column-reordering/plugin.d.ts +133 -0
  91. package/dist/plugins/column-reordering/plugin.js +392 -0
  92. package/dist/plugins/column-reordering/plugin.js.map +1 -0
  93. package/dist/plugins/column-reordering/utils.d.ts +7 -0
  94. package/dist/plugins/column-reordering/utils.js +41 -0
  95. package/dist/plugins/column-reordering/utils.js.map +1 -0
  96. package/dist/plugins/column-resizing/handle.d.ts +116 -0
  97. package/dist/plugins/column-resizing/handle.js +251 -0
  98. package/dist/plugins/column-resizing/handle.js.map +1 -0
  99. package/dist/plugins/column-resizing/helpers.d.ts +17 -0
  100. package/dist/plugins/column-resizing/helpers.js +22 -0
  101. package/dist/plugins/column-resizing/helpers.js.map +1 -0
  102. package/dist/plugins/column-resizing/index.d.ts +4 -0
  103. package/dist/plugins/column-resizing/index.js +4 -0
  104. package/dist/plugins/column-resizing/index.js.map +1 -0
  105. package/dist/plugins/column-resizing/plugin.d.ts +144 -0
  106. package/dist/plugins/column-resizing/plugin.js +352 -0
  107. package/dist/plugins/column-resizing/plugin.js.map +1 -0
  108. package/dist/plugins/column-resizing/resize-observer.d.ts +14 -0
  109. package/dist/plugins/column-resizing/resize-observer.js +46 -0
  110. package/dist/plugins/column-resizing/resize-observer.js.map +1 -0
  111. package/dist/plugins/column-resizing/utils.d.ts +22 -0
  112. package/dist/plugins/column-resizing/utils.js +46 -0
  113. package/dist/plugins/column-resizing/utils.js.map +1 -0
  114. package/dist/plugins/column-visibility/helpers.d.ts +18 -0
  115. package/dist/plugins/column-visibility/helpers.js +25 -0
  116. package/dist/plugins/column-visibility/helpers.js.map +1 -0
  117. package/dist/plugins/column-visibility/index.d.ts +3 -0
  118. package/dist/plugins/column-visibility/index.js +3 -0
  119. package/dist/plugins/column-visibility/index.js.map +1 -0
  120. package/dist/plugins/column-visibility/plugin.d.ts +62 -0
  121. package/dist/plugins/column-visibility/plugin.js +124 -0
  122. package/dist/plugins/column-visibility/plugin.js.map +1 -0
  123. package/dist/plugins/data-sorting/helpers.d.ts +38 -0
  124. package/dist/plugins/data-sorting/helpers.js +49 -0
  125. package/dist/plugins/data-sorting/helpers.js.map +1 -0
  126. package/dist/plugins/data-sorting/index.d.ts +5 -0
  127. package/dist/plugins/data-sorting/index.js +4 -0
  128. package/dist/plugins/data-sorting/index.js.map +1 -0
  129. package/dist/plugins/data-sorting/plugin.d.ts +99 -0
  130. package/dist/plugins/data-sorting/plugin.js +165 -0
  131. package/dist/plugins/data-sorting/plugin.js.map +1 -0
  132. package/dist/plugins/data-sorting/types.d.ts +23 -0
  133. package/dist/plugins/data-sorting/types.js +17 -0
  134. package/dist/plugins/data-sorting/types.js.map +1 -0
  135. package/dist/plugins/index.d.ts +5 -0
  136. package/dist/plugins/index.js +3 -0
  137. package/dist/plugins/index.js.map +1 -0
  138. package/dist/plugins/row-selection/helpers.d.ts +6 -0
  139. package/dist/plugins/row-selection/helpers.js +10 -0
  140. package/dist/plugins/row-selection/helpers.js.map +1 -0
  141. package/dist/plugins/row-selection/index.d.ts +3 -0
  142. package/dist/plugins/row-selection/index.js +3 -0
  143. package/dist/plugins/row-selection/index.js.map +1 -0
  144. package/dist/plugins/row-selection/plugin.d.ts +79 -0
  145. package/dist/plugins/row-selection/plugin.js +187 -0
  146. package/dist/plugins/row-selection/plugin.js.map +1 -0
  147. package/dist/plugins/sticky-columns/helpers.d.ts +4 -0
  148. package/dist/plugins/sticky-columns/helpers.js +8 -0
  149. package/dist/plugins/sticky-columns/helpers.js.map +1 -0
  150. package/dist/plugins/sticky-columns/index.d.ts +3 -0
  151. package/dist/plugins/sticky-columns/index.js +3 -0
  152. package/dist/plugins/sticky-columns/index.js.map +1 -0
  153. package/dist/plugins/sticky-columns/plugin.d.ts +53 -0
  154. package/dist/plugins/sticky-columns/plugin.js +132 -0
  155. package/dist/plugins/sticky-columns/plugin.js.map +1 -0
  156. package/dist/table-8e46554b.d.ts +127 -0
  157. package/dist/table-8e46554b.js +249 -0
  158. package/dist/table-8e46554b.js.map +1 -0
  159. package/dist/test-support/index.d.ts +14 -0
  160. package/dist/test-support/index.js +72 -0
  161. package/dist/test-support/index.js.map +1 -0
  162. package/dist/utils.d.ts +26 -0
  163. package/dist/utils.js +77 -0
  164. package/dist/utils.js.map +1 -0
  165. package/package.json +147 -51
  166. package/LICENSE.md +0 -9
  167. package/README.md +0 -38
  168. package/config/environment.js +0 -5
  169. package/index.js +0 -5
@@ -0,0 +1,392 @@
1
+ import { _ as _initializerDefineProperty } from '../../table-8e46554b.js';
2
+ import { _ as _applyDecoratedDescriptor } from '../../applyDecoratedDescriptor-e0489e2f.js';
3
+ import { a as _classPrivateFieldGet } from '../../classPrivateFieldGet-af59a8ea.js';
4
+ import { _ as _defineProperty } from '../../defineProperty-a0196711.js';
5
+ import { macroCondition, dependencySatisfies, importSync } from '@embroider/macros';
6
+ import { tracked } from '@glimmer/tracking';
7
+ import { assert } from '@ember/debug';
8
+ import { action } from '@ember/object';
9
+ import { TrackedMap } from 'tracked-built-ins';
10
+ import { BasePlugin, meta, preferences, columns } from '../-private/base.js';
11
+
12
+ var _class, _descriptor, _class3;
13
+
14
+ function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }
15
+
16
+ function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
17
+ let cached = macroCondition(dependencySatisfies('ember-source', '>= 4.1.0-alpha.0')) ? importSync('@glimmer/tracking').cached : importSync('ember-cached-decorator-polyfill').cached;
18
+ class ColumnReordering extends BasePlugin {
19
+ constructor(...args) {
20
+ super(...args);
21
+
22
+ _defineProperty(this, "name", 'column-reordering');
23
+
24
+ _defineProperty(this, "meta", {
25
+ column: ColumnMeta,
26
+ table: TableMeta
27
+ });
28
+ }
29
+
30
+ reset() {
31
+ let tableMeta = meta.forTable(this.table, ColumnReordering);
32
+ tableMeta.reset();
33
+ }
34
+
35
+ get columns() {
36
+ return meta.forTable(this.table, ColumnReordering).columns;
37
+ }
38
+
39
+ }
40
+
41
+ _defineProperty(ColumnReordering, "features", ['columnOrder']);
42
+
43
+ var _tableMeta = /*#__PURE__*/new WeakMap();
44
+
45
+ class ColumnMeta {
46
+ constructor(column) {
47
+ _classPrivateFieldInitSpec(this, _tableMeta, {
48
+ get: _get_tableMeta,
49
+ set: void 0
50
+ });
51
+
52
+ _defineProperty(this, "moveLeft", () => this.position--);
53
+
54
+ _defineProperty(this, "moveRight", () => this.position++);
55
+
56
+ this.column = column;
57
+ }
58
+
59
+ get position() {
60
+ return _classPrivateFieldGet(this, _tableMeta).getPosition(this.column);
61
+ }
62
+
63
+ set position(value) {
64
+ _classPrivateFieldGet(this, _tableMeta).setPosition(this.column, value);
65
+ }
66
+
67
+ get canMoveLeft() {
68
+ return _classPrivateFieldGet(this, _tableMeta).getPosition(this.column) !== 0;
69
+ }
70
+
71
+ get canMoveRight() {
72
+ return _classPrivateFieldGet(this, _tableMeta).getPosition(this.column) !== _classPrivateFieldGet(this, _tableMeta).columns.length - 1;
73
+ }
74
+
75
+ get cannotMoveLeft() {
76
+ return !this.canMoveLeft;
77
+ }
78
+
79
+ get cannotMoveRight() {
80
+ return !this.canMoveRight;
81
+ }
82
+ /**
83
+ * Move the column one spot to the left
84
+ */
85
+
86
+
87
+ }
88
+
89
+ function _get_tableMeta() {
90
+ return meta.forTable(this.column.table, ColumnReordering);
91
+ }
92
+
93
+ let TableMeta = (_class = class TableMeta {
94
+ constructor(table) {
95
+ _initializerDefineProperty(this, "columnOrder", _descriptor, this);
96
+
97
+ this.table = table;
98
+ }
99
+ /**
100
+ * @private
101
+ *
102
+ * We want to maintain the instance of this ColumnOrder class because
103
+ * we allow the consumer of the table to swap out columns at any time.
104
+ * When they do this, we want to maintain the order of the table, best we can.
105
+ * This is also why the order of the columns is maintained via column key
106
+ */
107
+
108
+
109
+ getPosition(column) {
110
+ return this.columnOrder.get(column.key);
111
+ }
112
+
113
+ setPosition(column, newPosition) {
114
+ return this.columnOrder.set(column.key, newPosition);
115
+ }
116
+ /**
117
+ * Revert to default config, delete preferences,
118
+ * and clear the columnOrder
119
+ */
120
+
121
+
122
+ reset() {
123
+ preferences.forTable(this.table, ColumnReordering).delete('order');
124
+ this.columnOrder = new ColumnOrder({
125
+ columns: () => this.availableColumns,
126
+ save: this.save
127
+ });
128
+ }
129
+ /**
130
+ * @private
131
+ */
132
+
133
+
134
+ save(map) {
135
+ let order = {};
136
+
137
+ for (let [key, position] of map.entries()) {
138
+ order[key] = position;
139
+ }
140
+
141
+ preferences.forTable(this.table, ColumnReordering).set('order', order);
142
+ }
143
+ /**
144
+ * @private
145
+ */
146
+
147
+
148
+ read() {
149
+ let order = preferences.forTable(this.table, ColumnReordering).get('order');
150
+ if (!order) return;
151
+ return new Map(Object.entries(order));
152
+ }
153
+
154
+ get columns() {
155
+ return this.columnOrder.orderedColumns;
156
+ }
157
+ /**
158
+ * @private
159
+ * This isn't our data to expose, but it is useful to alias
160
+ */
161
+
162
+
163
+ get availableColumns() {
164
+ return columns.for(this.table, ColumnReordering);
165
+ }
166
+
167
+ }, (_descriptor = _applyDecoratedDescriptor(_class.prototype, "columnOrder", [tracked], {
168
+ configurable: true,
169
+ enumerable: true,
170
+ writable: true,
171
+ initializer: function () {
172
+ return new ColumnOrder({
173
+ columns: () => this.availableColumns,
174
+ save: this.save,
175
+ existingOrder: this.read()
176
+ });
177
+ }
178
+ }), _applyDecoratedDescriptor(_class.prototype, "getPosition", [action], Object.getOwnPropertyDescriptor(_class.prototype, "getPosition"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, "setPosition", [action], Object.getOwnPropertyDescriptor(_class.prototype, "setPosition"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, "reset", [action], Object.getOwnPropertyDescriptor(_class.prototype, "reset"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, "save", [action], Object.getOwnPropertyDescriptor(_class.prototype, "save"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, "read", [action], Object.getOwnPropertyDescriptor(_class.prototype, "read"), _class.prototype)), _class);
179
+ /**
180
+ * @private
181
+ * Used for keeping track of and updating column order
182
+ */
183
+
184
+ let ColumnOrder = (_class3 = class ColumnOrder {
185
+ /**
186
+ * This map will be empty until we re-order something.
187
+ */
188
+ constructor(args) {
189
+ _defineProperty(this, "map", new TrackedMap());
190
+
191
+ this.args = args;
192
+
193
+ if (args.existingOrder) {
194
+ this.map = new TrackedMap(args.existingOrder);
195
+ }
196
+ }
197
+
198
+ set(key, position) {
199
+ /**
200
+ * Cannot set a position lower than the min value (before the beginning?)
201
+ */
202
+ if (position < 0) {
203
+ return false;
204
+ }
205
+ /**
206
+ * position is 0-indexed and length includes 0 in its count of items
207
+ */
208
+
209
+
210
+ let maxPosition = this.args.columns().length - 1;
211
+ /**
212
+ * Cannot set a position higher than the max value (after the end?)
213
+ */
214
+
215
+ if (position > maxPosition) {
216
+ return false;
217
+ }
218
+ /**
219
+ * Where did this column `key` come from? we can find out
220
+ * by reading orderedMap
221
+ */
222
+
223
+
224
+ let currentPosition = this.orderedMap.get(key);
225
+ assert(`Pre-existing position for ${key} could not be found. Does the column exist? ` + `The current positions are: ` + [...this.orderedMap.entries()].map(entry => entry.join(' => ')).join(', ') + ` and the availableColumns are: ` + this.args.columns().map(column => column.key) + ` and current "map" (${this.map.size}) is: ` + [...this.map.entries()].map(entry => entry.join(' => ')).join(', '), undefined !== currentPosition);
226
+ /**
227
+ * No need to change anything if the position is the same
228
+ * This helps reduce @tracked invalidations, which in turn reduces DOM thrashing.
229
+ */
230
+
231
+ if (currentPosition === position) {
232
+ return false;
233
+ }
234
+ /**
235
+ * For the columns between the gap we took `key` from and the `position`
236
+ * we want to place that column, which direction do we move those middle columns?
237
+ */
238
+
239
+
240
+ let direction = currentPosition < position ?
241
+ /**
242
+ * moved ------------------> to the right
243
+ * currentPosition position
244
+ * gap ^
245
+ * columns left of position now need to shift left to fill that gap
246
+ */
247
+ 'left' :
248
+ /**
249
+ * moved <------------------ to the left
250
+ * position currentPosition
251
+ * gap ^
252
+ * columns right of position now need to shift right to fill that gap
253
+ */
254
+ 'right';
255
+ let keyByPosition = new Map([...this.orderedMap.entries()].map(entry => entry.reverse()));
256
+
257
+ for (let [existingPosition, key] of keyByPosition.entries()) {
258
+ if (direction === 'left') {
259
+ if (existingPosition > currentPosition && existingPosition <= position) {
260
+ this.map.set(key, existingPosition - 1);
261
+ }
262
+ }
263
+
264
+ if (direction === 'right') {
265
+ if (existingPosition >= position && existingPosition <= currentPosition) {
266
+ this.map.set(key, existingPosition + 1);
267
+ }
268
+ }
269
+ }
270
+ /**
271
+ * Finally, set the position for the requested column
272
+ */
273
+
274
+
275
+ this.map.set(key, position);
276
+ /**
277
+ * Now that we've set the value for one column,
278
+ * we need to make sure that all columns have a recorded position.
279
+ */
280
+
281
+ for (let [key, position] of this.orderedMap.entries()) {
282
+ if (this.map.has(key)) continue;
283
+ this.map.set(key, position);
284
+ }
285
+
286
+ this.args.save(this.map);
287
+ }
288
+
289
+ get(key) {
290
+ let result = this.orderedMap.get(key);
291
+ assert(`No position found for ${key}. Is the column used within this table?`,
292
+ /* 0 is falsey, but it's a valid value for position */
293
+ undefined !== result);
294
+ return result;
295
+ }
296
+ /**
297
+ * The same as this.map, but with all the columns' information
298
+ */
299
+
300
+
301
+ get orderedMap() {
302
+ return orderOf(this.args.columns(), this.map);
303
+ }
304
+ /**
305
+ * When columns are removed or hidden, our positions don't change
306
+ * but when doing the math, we want to adjust things based on 0-indexed counting
307
+ *
308
+ * TODO: figure out if we need this??
309
+ */
310
+
311
+
312
+ get adjustedColumns() {
313
+ return [];
314
+ }
315
+
316
+ get orderedColumns() {
317
+ let availableColumns = this.args.columns();
318
+ let availableByKey = availableColumns.reduce((keyMap, column) => {
319
+ keyMap[column.key] = column;
320
+ return keyMap;
321
+ }, {});
322
+ let mergedOrder = orderOf(availableColumns, this.map);
323
+ let result = Array.from({
324
+ length: availableColumns.length
325
+ });
326
+
327
+ for (let [key, position] of mergedOrder.entries()) {
328
+ let column = availableByKey[key];
329
+ assert(`Could not find column for pair: ${key} @ @{position}`, column);
330
+ result[position] = column;
331
+ }
332
+
333
+ assert(`Generated orderedColumns' length (${result.filter(Boolean).length}) ` + `does not match the length of available columns (${availableColumns.length}). ` + `orderedColumns: ${result.filter(Boolean).map(c => c.key).join(', ')} -- ` + `available columns: ${availableColumns.map(c => c.key).join(', ')}`, result.filter(Boolean).length === availableColumns.length);
334
+ return result.filter(Boolean);
335
+ }
336
+
337
+ }, (_applyDecoratedDescriptor(_class3.prototype, "set", [action], Object.getOwnPropertyDescriptor(_class3.prototype, "set"), _class3.prototype), _applyDecoratedDescriptor(_class3.prototype, "get", [action], Object.getOwnPropertyDescriptor(_class3.prototype, "get"), _class3.prototype), _applyDecoratedDescriptor(_class3.prototype, "orderedMap", [cached], Object.getOwnPropertyDescriptor(_class3.prototype, "orderedMap"), _class3.prototype), _applyDecoratedDescriptor(_class3.prototype, "adjustedColumns", [cached], Object.getOwnPropertyDescriptor(_class3.prototype, "adjustedColumns"), _class3.prototype), _applyDecoratedDescriptor(_class3.prototype, "orderedColumns", [cached], Object.getOwnPropertyDescriptor(_class3.prototype, "orderedColumns"), _class3.prototype)), _class3);
338
+ /**
339
+ * @private
340
+ *
341
+ * Utility for helping determine the percieved order of a set of columns
342
+ * given the original (default) ordering, and then user-configurations
343
+ */
344
+
345
+ function orderOf(columns, currentOrder) {
346
+ let result = new Map();
347
+ let availableColumns = columns.map(column => column.key);
348
+ let availableSet = new Set(availableColumns);
349
+ let current = new Map([...currentOrder.entries()].map(([key, position]) => [position, key]));
350
+ /**
351
+ * O(n * log(n)) ?
352
+ */
353
+
354
+ for (let i = 0; i < Math.max(columns.length, current.size); i++) {
355
+ let orderedKey = current.get(i);
356
+
357
+ if (orderedKey) {
358
+ /**
359
+ * If the currentOrder specifies columns not presently available,
360
+ * ignore them
361
+ */
362
+ if (availableSet.has(orderedKey)) {
363
+ result.set(orderedKey, i);
364
+ continue;
365
+ }
366
+ }
367
+
368
+ let availableKey;
369
+
370
+ while (availableKey = availableColumns.shift()) {
371
+ if (result.has(availableKey) || currentOrder.has(availableKey)) {
372
+ continue;
373
+ }
374
+
375
+ break;
376
+ }
377
+
378
+ if (!availableKey) {
379
+ /**
380
+ * The rest of our columns likely have their order set
381
+ */
382
+ continue;
383
+ }
384
+
385
+ result.set(availableKey, i);
386
+ }
387
+
388
+ return result;
389
+ }
390
+
391
+ export { ColumnMeta, ColumnOrder, ColumnReordering, TableMeta, orderOf };
392
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sources":["../../../src/plugins/column-reordering/plugin.ts"],"sourcesContent":["import { cached, tracked } from '@glimmer/tracking';\nimport { assert } from '@ember/debug';\nimport { action } from '@ember/object';\n\nimport { TrackedMap } from 'tracked-built-ins';\n\nimport { preferences } from '[public-plugin-types]';\n\nimport { BasePlugin, columns, meta } from '../-private/base';\n\nimport type { PluginPreferences } from '[public-plugin-types]';\nimport type { Column, Table } from '[public-types]';\n\ninterface ColumnReorderingPreferences extends PluginPreferences {\n table: {\n order?: Record<string, number>;\n };\n}\n\ndeclare module 'ember-headless-table/plugins' {\n interface Registry {\n ColumnReordering?: ColumnReorderingPreferences;\n }\n}\n\nexport interface Signature {\n Meta: {\n Column: ColumnMeta;\n Table: TableMeta;\n };\n}\n\nexport class ColumnReordering extends BasePlugin<Signature> {\n name = 'column-reordering';\n static features = ['columnOrder'];\n\n meta = {\n column: ColumnMeta,\n table: TableMeta,\n } as const;\n\n reset() {\n let tableMeta = meta.forTable(this.table, ColumnReordering);\n\n tableMeta.reset();\n }\n\n get columns() {\n return meta.forTable(this.table, ColumnReordering).columns;\n }\n}\n\nexport class ColumnMeta {\n constructor(private column: Column) {}\n\n get #tableMeta() {\n return meta.forTable(this.column.table, ColumnReordering);\n }\n\n get position() {\n return this.#tableMeta.getPosition(this.column);\n }\n\n set position(value: number) {\n this.#tableMeta.setPosition(this.column, value);\n }\n\n get canMoveLeft() {\n return this.#tableMeta.getPosition(this.column) !== 0;\n }\n\n get canMoveRight() {\n return this.#tableMeta.getPosition(this.column) !== this.#tableMeta.columns.length - 1;\n }\n\n get cannotMoveLeft() {\n return !this.canMoveLeft;\n }\n\n get cannotMoveRight() {\n return !this.canMoveRight;\n }\n\n /**\n * Move the column one spot to the left\n */\n moveLeft = () => this.position--;\n\n /**\n * Move the column one spot to the right\n */\n moveRight = () => this.position++;\n}\n\nexport class TableMeta {\n constructor(private table: Table) {}\n\n /**\n * @private\n *\n * We want to maintain the instance of this ColumnOrder class because\n * we allow the consumer of the table to swap out columns at any time.\n * When they do this, we want to maintain the order of the table, best we can.\n * This is also why the order of the columns is maintained via column key\n */\n @tracked\n columnOrder = new ColumnOrder({\n columns: () => this.availableColumns,\n save: this.save,\n existingOrder: this.read(),\n });\n\n @action\n getPosition(column: Column) {\n return this.columnOrder.get(column.key);\n }\n\n @action\n setPosition(column: Column, newPosition: number) {\n return this.columnOrder.set(column.key, newPosition);\n }\n\n /**\n * Revert to default config, delete preferences,\n * and clear the columnOrder\n */\n @action\n reset() {\n preferences.forTable(this.table, ColumnReordering).delete('order');\n this.columnOrder = new ColumnOrder({\n columns: () => this.availableColumns,\n save: this.save,\n });\n }\n\n /**\n * @private\n */\n @action\n save(map: Map<string, number>) {\n let order: Record<string, number> = {};\n\n for (let [key, position] of map.entries()) {\n order[key] = position;\n }\n\n preferences.forTable(this.table, ColumnReordering).set('order', order);\n }\n\n /**\n * @private\n */\n @action\n private read() {\n let order = preferences.forTable(this.table, ColumnReordering).get('order');\n\n if (!order) return;\n\n return new Map<string, number>(Object.entries(order));\n }\n\n get columns() {\n return this.columnOrder.orderedColumns;\n }\n\n /**\n * @private\n * This isn't our data to expose, but it is useful to alias\n */\n private get availableColumns() {\n return columns.for(this.table, ColumnReordering);\n }\n}\n\n/**\n * @private\n * Used for keeping track of and updating column order\n */\nexport class ColumnOrder {\n /**\n * This map will be empty until we re-order something.\n */\n map = new TrackedMap<string, number>();\n\n constructor(\n private args: {\n columns: () => Column[];\n save: (order: Map<string, number>) => void;\n existingOrder?: Map<string, number>;\n }\n ) {\n if (args.existingOrder) {\n this.map = new TrackedMap(args.existingOrder);\n }\n }\n\n @action\n set(key: string, position: number) {\n /**\n * Cannot set a position lower than the min value (before the beginning?)\n */\n if (position < 0) {\n return false;\n }\n\n /**\n * position is 0-indexed and length includes 0 in its count of items\n */\n let maxPosition = this.args.columns().length - 1;\n\n /**\n * Cannot set a position higher than the max value (after the end?)\n */\n if (position > maxPosition) {\n return false;\n }\n\n /**\n * Where did this column `key` come from? we can find out\n * by reading orderedMap\n */\n let currentPosition = this.orderedMap.get(key);\n\n assert(\n `Pre-existing position for ${key} could not be found. Does the column exist? ` +\n `The current positions are: ` +\n [...this.orderedMap.entries()].map((entry) => entry.join(' => ')).join(', ') +\n ` and the availableColumns are: ` +\n this.args.columns().map((column) => column.key) +\n ` and current \"map\" (${this.map.size}) is: ` +\n [...this.map.entries()].map((entry) => entry.join(' => ')).join(', '),\n undefined !== currentPosition\n );\n\n /**\n * No need to change anything if the position is the same\n * This helps reduce @tracked invalidations, which in turn reduces DOM thrashing.\n */\n if (currentPosition === position) {\n return false;\n }\n\n /**\n * For the columns between the gap we took `key` from and the `position`\n * we want to place that column, which direction do we move those middle columns?\n */\n let direction =\n currentPosition < position\n ? /**\n * moved ------------------> to the right\n * currentPosition position\n * gap ^\n * columns left of position now need to shift left to fill that gap\n */\n 'left'\n : /**\n * moved <------------------ to the left\n * position currentPosition\n * gap ^\n * columns right of position now need to shift right to fill that gap\n */\n 'right';\n\n let keyByPosition = new Map<number, string>(\n [...this.orderedMap.entries()].map((entry) => entry.reverse() as [number, string])\n );\n\n for (let [existingPosition, key] of keyByPosition.entries()) {\n if (direction === 'left') {\n if (existingPosition > currentPosition && existingPosition <= position) {\n this.map.set(key, existingPosition - 1);\n }\n }\n\n if (direction === 'right') {\n if (existingPosition >= position && existingPosition <= currentPosition) {\n this.map.set(key, existingPosition + 1);\n }\n }\n }\n\n /**\n * Finally, set the position for the requested column\n */\n this.map.set(key, position);\n\n /**\n * Now that we've set the value for one column,\n * we need to make sure that all columns have a recorded position.\n */\n for (let [key, position] of this.orderedMap.entries()) {\n if (this.map.has(key)) continue;\n\n this.map.set(key, position);\n }\n\n this.args.save(this.map);\n }\n\n @action\n get(key: string) {\n let result = this.orderedMap.get(key);\n\n assert(\n `No position found for ${key}. Is the column used within this table?`,\n /* 0 is falsey, but it's a valid value for position */\n undefined !== result\n );\n\n return result;\n }\n\n /**\n * The same as this.map, but with all the columns' information\n */\n @cached\n get orderedMap(): ReadonlyMap<string, number> {\n return orderOf(this.args.columns(), this.map);\n }\n\n /**\n * When columns are removed or hidden, our positions don't change\n * but when doing the math, we want to adjust things based on 0-indexed counting\n *\n * TODO: figure out if we need this??\n */\n @cached\n get adjustedColumns(): Column[] {\n return [];\n }\n\n @cached\n get orderedColumns(): Column[] {\n let availableColumns = this.args.columns();\n let availableByKey = availableColumns.reduce((keyMap, column) => {\n keyMap[column.key] = column;\n\n return keyMap;\n }, {} as Record<string, Column>);\n let mergedOrder = orderOf(availableColumns, this.map);\n\n let result: Column[] = Array.from({ length: availableColumns.length });\n\n for (let [key, position] of mergedOrder.entries()) {\n let column = availableByKey[key];\n\n assert(`Could not find column for pair: ${key} @ @{position}`, column);\n result[position] = column;\n }\n\n assert(\n `Generated orderedColumns' length (${result.filter(Boolean).length}) ` +\n `does not match the length of available columns (${availableColumns.length}). ` +\n `orderedColumns: ${result\n .filter(Boolean)\n .map((c) => c.key)\n .join(', ')} -- ` +\n `available columns: ${availableColumns.map((c) => c.key).join(', ')}`,\n result.filter(Boolean).length === availableColumns.length\n );\n\n return result.filter(Boolean);\n }\n}\n\n/**\n * @private\n *\n * Utility for helping determine the percieved order of a set of columns\n * given the original (default) ordering, and then user-configurations\n */\nexport function orderOf(\n columns: { key: string }[],\n currentOrder: Map<string, number>\n): Map<string, number> {\n let result = new Map<string, number>();\n let availableColumns = columns.map((column) => column.key);\n let availableSet = new Set(availableColumns);\n let current = new Map<number, string>(\n [...currentOrder.entries()].map(([key, position]) => [position, key])\n );\n\n /**\n * O(n * log(n)) ?\n */\n for (let i = 0; i < Math.max(columns.length, current.size); i++) {\n let orderedKey = current.get(i);\n\n if (orderedKey) {\n /**\n * If the currentOrder specifies columns not presently available,\n * ignore them\n */\n if (availableSet.has(orderedKey)) {\n result.set(orderedKey, i);\n continue;\n }\n }\n\n let availableKey: string | undefined;\n\n while ((availableKey = availableColumns.shift())) {\n if (result.has(availableKey) || currentOrder.has(availableKey)) {\n continue;\n }\n\n break;\n }\n\n if (!availableKey) {\n /**\n * The rest of our columns likely have their order set\n */\n continue;\n }\n\n result.set(availableKey, i);\n }\n\n return result;\n}\n"],"names":["ColumnReordering","BasePlugin","column","ColumnMeta","table","TableMeta","reset","tableMeta","meta","forTable","columns","constructor","position","getPosition","value","setPosition","canMoveLeft","canMoveRight","length","cannotMoveLeft","cannotMoveRight","columnOrder","get","key","newPosition","set","preferences","delete","ColumnOrder","availableColumns","save","map","order","entries","read","Map","Object","orderedColumns","for","tracked","existingOrder","action","args","TrackedMap","maxPosition","currentPosition","orderedMap","assert","entry","join","size","undefined","direction","keyByPosition","reverse","existingPosition","has","result","orderOf","adjustedColumns","availableByKey","reduce","keyMap","mergedOrder","Array","from","filter","Boolean","c","cached","currentOrder","availableSet","Set","current","i","Math","max","orderedKey","availableKey","shift"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Column } from "../../index";
2
+ type ColumnOrder = {
3
+ key: string;
4
+ position: number | undefined;
5
+ }[];
6
+ declare function reorderColumns(columns: Column[], orderedColumns: ColumnOrder | undefined): Column<unknown>[];
7
+ export { reorderColumns };
@@ -0,0 +1,41 @@
1
+ import { meta } from '../-private/base.js';
2
+ import { ColumnReordering } from './plugin.js';
3
+
4
+ function reorderColumns(columns, orderedColumns) {
5
+ if (orderedColumns === undefined) {
6
+ return columns;
7
+ }
8
+
9
+ let repositionedColumns = Array.from({
10
+ length: columns.length
11
+ });
12
+
13
+ for (const column of columns) {
14
+ const orderedColumn = orderedColumns.find(orderedColumn => column.key === orderedColumn.key);
15
+ const currentMeta = meta.forColumn(column, ColumnReordering);
16
+
17
+ if (orderedColumn === undefined) {
18
+ if (currentMeta.position !== undefined && currentMeta.position >= 0) {
19
+ repositionedColumns[currentMeta.position] = column;
20
+ }
21
+
22
+ continue;
23
+ }
24
+
25
+ const {
26
+ position
27
+ } = orderedColumn;
28
+
29
+ if (position !== undefined && !repositionedColumns[position]) {
30
+ repositionedColumns[position] = column;
31
+ } else {
32
+ repositionedColumns.push(column);
33
+ }
34
+ }
35
+
36
+ repositionedColumns = repositionedColumns.filter(column => column !== undefined);
37
+ return repositionedColumns;
38
+ }
39
+
40
+ export { reorderColumns };
41
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sources":["../../../src/plugins/column-reordering/utils.ts"],"sourcesContent":["import { meta } from '../-private/base';\nimport { ColumnReordering } from './plugin';\n\nimport type { Column } from '[public-types]';\n\ntype ColumnOrder = { key: string; position: number | undefined }[];\n\nexport function reorderColumns(columns: Column[], orderedColumns: ColumnOrder | undefined) {\n if (orderedColumns === undefined) {\n return columns;\n }\n\n let repositionedColumns: Column[] = Array.from({\n length: columns.length,\n });\n\n for (const column of columns) {\n const orderedColumn = orderedColumns.find((orderedColumn) => column.key === orderedColumn.key);\n const currentMeta = meta.forColumn(column, ColumnReordering);\n\n if (orderedColumn === undefined) {\n if (currentMeta.position !== undefined && currentMeta.position >= 0) {\n repositionedColumns[currentMeta.position] = column;\n }\n\n continue;\n }\n\n const { position } = orderedColumn;\n\n if (position !== undefined && !repositionedColumns[position]) {\n repositionedColumns[position] = column;\n } else {\n repositionedColumns.push(column);\n }\n }\n\n repositionedColumns = repositionedColumns.filter((column) => column !== undefined);\n\n return repositionedColumns;\n}\n"],"names":["reorderColumns","columns","orderedColumns","undefined","repositionedColumns","Array","from","length","column","orderedColumn","find","key","currentMeta","meta","forColumn","ColumnReordering","position","push","filter"],"mappings":";;;AAOO,SAASA,cAAT,CAAwBC,OAAxB,EAA2CC,cAA3C,EAAoF;EACzF,IAAIA,cAAc,KAAKC,SAAvB,EAAkC;AAChC,IAAA,OAAOF,OAAP,CAAA;AACD,GAAA;;AAED,EAAA,IAAIG,mBAA6B,GAAGC,KAAK,CAACC,IAAN,CAAW;IAC7CC,MAAM,EAAEN,OAAO,CAACM,MAAAA;AAD6B,GAAX,CAApC,CAAA;;AAIA,EAAA,KAAK,MAAMC,MAAX,IAAqBP,OAArB,EAA8B;AAC5B,IAAA,MAAMQ,aAAa,GAAGP,cAAc,CAACQ,IAAf,CAAqBD,aAAD,IAAmBD,MAAM,CAACG,GAAP,KAAeF,aAAa,CAACE,GAApE,CAAtB,CAAA;IACA,MAAMC,WAAW,GAAGC,IAAI,CAACC,SAAL,CAAeN,MAAf,EAAuBO,gBAAvB,CAApB,CAAA;;IAEA,IAAIN,aAAa,KAAKN,SAAtB,EAAiC;MAC/B,IAAIS,WAAW,CAACI,QAAZ,KAAyBb,SAAzB,IAAsCS,WAAW,CAACI,QAAZ,IAAwB,CAAlE,EAAqE;AACnEZ,QAAAA,mBAAmB,CAACQ,WAAW,CAACI,QAAb,CAAnB,GAA4CR,MAA5C,CAAA;AACD,OAAA;;AAED,MAAA,SAAA;AACD,KAAA;;IAED,MAAM;AAAEQ,MAAAA,QAAAA;AAAF,KAAA,GAAeP,aAArB,CAAA;;IAEA,IAAIO,QAAQ,KAAKb,SAAb,IAA0B,CAACC,mBAAmB,CAACY,QAAD,CAAlD,EAA8D;AAC5DZ,MAAAA,mBAAmB,CAACY,QAAD,CAAnB,GAAgCR,MAAhC,CAAA;AACD,KAFD,MAEO;MACLJ,mBAAmB,CAACa,IAApB,CAAyBT,MAAzB,CAAA,CAAA;AACD,KAAA;AACF,GAAA;;EAEDJ,mBAAmB,GAAGA,mBAAmB,CAACc,MAApB,CAA4BV,MAAD,IAAYA,MAAM,KAAKL,SAAlD,CAAtB,CAAA;AAEA,EAAA,OAAOC,mBAAP,CAAA;AACD;;;;"}
@@ -0,0 +1,116 @@
1
+ import Modifier from 'ember-modifier';
2
+ import { ColumnMeta } from "./plugin";
3
+ import { Column } from "../../-private/column";
4
+ /**
5
+ * - why are mouse events used instead of drag events?
6
+ * - why not use the "draggable" attribute?
7
+ *
8
+ * It seems drag events are more for files and/or moving images around on a page
9
+ * dragging an image, for example, has a ghost of that image until it is dropped.
10
+ * The same thing happens with text.
11
+ * This prevents us from having total control of the styling of how dragging works.
12
+ *
13
+ *
14
+ *
15
+ */
16
+ declare class ResizeHandle extends Modifier<{
17
+ Args: {
18
+ Positional: [Column];
19
+ };
20
+ }> {
21
+ dragHandle: HTMLElement;
22
+ column: Column;
23
+ meta: ColumnMeta;
24
+ pointerStartX: number;
25
+ pointerStartY: number;
26
+ pointerX: number;
27
+ pointerY: number;
28
+ dragFrame: number;
29
+ keyDistance: number;
30
+ keyFrame: number;
31
+ lastKey: number;
32
+ token?: unknown;
33
+ isSetup: boolean;
34
+ modify(element: Element, [column]: [Column]): void;
35
+ setup: () => void;
36
+ setPosition: (event: Event) => void;
37
+ setStartPosition: (event: Event) => void;
38
+ queueUpdate: () => void;
39
+ dragEndHandler: () => void;
40
+ dragMove: (event: Event) => void;
41
+ dragStartHandler: (event: Event) => void;
42
+ keyHandler: (event: KeyboardEvent) => void;
43
+ }
44
+ /**
45
+ * Modifier to attach to the column resize handles.
46
+ * This provides both keyboard and mouse support for resizing columns.
47
+ * (provided the resize handle element is focusable -- so consider using
48
+ * a button for the resize element)
49
+ *
50
+ * @example
51
+ * ```js
52
+ * import Component from '@glimmer/component';
53
+ * import { meta } from 'ember-headless-table/plugins';
54
+ * import { resizeHandle, ColumnResizing } from 'ember-headless-table/plugins/column-resizing';
55
+ *
56
+ * export default class TableHead extends Component {
57
+ * /* ✂️ *\/
58
+ *
59
+ * <template>
60
+ * <thead>
61
+ * <tr>
62
+ * {{#each this.columns as |column|}}
63
+ * <th>
64
+ * <span>{{column.name}}</span>
65
+ * <button {{resizeHandle column}}></button>
66
+ * </th>
67
+ * {{/each}}
68
+ * </tr>
69
+ * </thead>
70
+ * </template>
71
+ * }
72
+ * ```
73
+ *
74
+ * Width and isResizing state is maintained on the "meta"
75
+ * class so that the users may choose per-column stylings for
76
+ * isResizing and dragging behaviors.
77
+ *
78
+ * For example, while dragging, the user may add a class based on the
79
+ * isDragging property.
80
+ *
81
+ * @example
82
+ * ```js
83
+ * import Component from '@glimmer/component';
84
+ * import { meta } from 'ember-headless-table/plugins';
85
+ * import { resizeHandle, ColumnResizing } from 'ember-headless-table/plugins/column-resizing';
86
+ *
87
+ * export default class TableHead extends Component {
88
+ * /* ✂️ *\/
89
+ *
90
+ * isDragging = (column) => {
91
+ * return meta.forColumn(column, ColumnResizing).isDragging;
92
+ * }
93
+ *
94
+ * <template>
95
+ * <thead>
96
+ * <tr>
97
+ * {{#each this.columns as |column|}}
98
+ * <th class="header {{if (this.isDragging column) 'blue'}}">
99
+ * <span>{{column.name}}</span>
100
+ * <button {{resizeHandle column}}></button>
101
+ * </th>
102
+ * {{/each}}
103
+ * </tr>
104
+ * </thead>
105
+ * </template>
106
+ * }
107
+ * ```
108
+ *
109
+ *
110
+ * @note
111
+ * The logic here is copied from the drag slider in
112
+ * https://limber.glimdown.com/
113
+ * See: "resize-handle" on Limber's GitHub
114
+ */
115
+ declare const resizeHandle: typeof ResizeHandle;
116
+ export { resizeHandle };