@vuu-ui/vuu-utils 0.8.32 → 0.8.34

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 (192) hide show
  1. package/cjs/DataWindow.js +71 -0
  2. package/cjs/DataWindow.js.map +1 -0
  3. package/cjs/ThemeProvider.js +85 -0
  4. package/cjs/ThemeProvider.js.map +1 -0
  5. package/cjs/array-utils.js +87 -0
  6. package/cjs/array-utils.js.map +1 -0
  7. package/cjs/box-utils.js +10 -0
  8. package/cjs/box-utils.js.map +1 -0
  9. package/cjs/column-utils.js +810 -0
  10. package/cjs/column-utils.js.map +1 -0
  11. package/cjs/common-types.js +15 -0
  12. package/cjs/common-types.js.map +1 -0
  13. package/cjs/component-registry.js +111 -0
  14. package/cjs/component-registry.js.map +1 -0
  15. package/cjs/cookie-utils.js +10 -0
  16. package/cjs/cookie-utils.js.map +1 -0
  17. package/cjs/data-utils.js +58 -0
  18. package/cjs/data-utils.js.map +1 -0
  19. package/cjs/datasource-action-utils.js +14 -0
  20. package/cjs/datasource-action-utils.js.map +1 -0
  21. package/cjs/datasource-utils.js +178 -0
  22. package/cjs/datasource-utils.js.map +1 -0
  23. package/cjs/date/dateTimePattern.js +25 -0
  24. package/cjs/date/dateTimePattern.js.map +1 -0
  25. package/cjs/date/formatter.js +66 -0
  26. package/cjs/date/formatter.js.map +1 -0
  27. package/cjs/date/types.js +23 -0
  28. package/cjs/date/types.js.map +1 -0
  29. package/cjs/date/utils.js +10 -0
  30. package/cjs/date/utils.js.map +1 -0
  31. package/cjs/debug-utils.js +31 -0
  32. package/cjs/debug-utils.js.map +1 -0
  33. package/cjs/event-emitter.js +119 -0
  34. package/cjs/event-emitter.js.map +1 -0
  35. package/cjs/filters/filterAsQuery.js +76 -0
  36. package/cjs/filters/filterAsQuery.js.map +1 -0
  37. package/cjs/filters/utils.js +89 -0
  38. package/cjs/filters/utils.js.map +1 -0
  39. package/cjs/formatting-utils.js +66 -0
  40. package/cjs/formatting-utils.js.map +1 -0
  41. package/cjs/getUniqueId.js +6 -0
  42. package/cjs/getUniqueId.js.map +1 -0
  43. package/cjs/group-utils.js +12 -0
  44. package/cjs/group-utils.js.map +1 -0
  45. package/cjs/html-utils.js +124 -0
  46. package/cjs/html-utils.js.map +1 -0
  47. package/cjs/index.js +282 -8
  48. package/cjs/index.js.map +1 -7
  49. package/cjs/input-utils.js +10 -0
  50. package/cjs/input-utils.js.map +1 -0
  51. package/cjs/invariant.js +13 -0
  52. package/cjs/invariant.js.map +1 -0
  53. package/cjs/itemToString.js +23 -0
  54. package/cjs/itemToString.js.map +1 -0
  55. package/cjs/json-utils.js +92 -0
  56. package/cjs/json-utils.js.map +1 -0
  57. package/cjs/keyboard-utils.js +28 -0
  58. package/cjs/keyboard-utils.js.map +1 -0
  59. package/cjs/keyset.js +68 -0
  60. package/cjs/keyset.js.map +1 -0
  61. package/cjs/logging-utils.js +61 -0
  62. package/cjs/logging-utils.js.map +1 -0
  63. package/cjs/menu-utils.js +6 -0
  64. package/cjs/menu-utils.js.map +1 -0
  65. package/cjs/module-utils.js +12 -0
  66. package/cjs/module-utils.js.map +1 -0
  67. package/cjs/nanoid/index.js +22 -0
  68. package/cjs/nanoid/index.js.map +1 -0
  69. package/cjs/perf-utils.js +35 -0
  70. package/cjs/perf-utils.js.map +1 -0
  71. package/cjs/range-utils.js +74 -0
  72. package/cjs/range-utils.js.map +1 -0
  73. package/cjs/react-utils.js +21 -0
  74. package/cjs/react-utils.js.map +1 -0
  75. package/cjs/round-decimal.js +86 -0
  76. package/cjs/round-decimal.js.map +1 -0
  77. package/cjs/row-utils.js +84 -0
  78. package/cjs/row-utils.js.map +1 -0
  79. package/cjs/selection-utils.js +236 -0
  80. package/cjs/selection-utils.js.map +1 -0
  81. package/cjs/sort-utils.js +61 -0
  82. package/cjs/sort-utils.js.map +1 -0
  83. package/cjs/text-utils.js +21 -0
  84. package/cjs/text-utils.js.map +1 -0
  85. package/cjs/ts-utils.js +8 -0
  86. package/cjs/ts-utils.js.map +1 -0
  87. package/cjs/url-utils.js +21 -0
  88. package/cjs/url-utils.js.map +1 -0
  89. package/cjs/useId.js +9 -0
  90. package/cjs/useId.js.map +1 -0
  91. package/cjs/useLayoutEffectSkipFirst.js +17 -0
  92. package/cjs/useLayoutEffectSkipFirst.js.map +1 -0
  93. package/esm/DataWindow.js +69 -0
  94. package/esm/DataWindow.js.map +1 -0
  95. package/esm/ThemeProvider.js +78 -0
  96. package/esm/ThemeProvider.js.map +1 -0
  97. package/esm/array-utils.js +79 -0
  98. package/esm/array-utils.js.map +1 -0
  99. package/esm/box-utils.js +8 -0
  100. package/esm/box-utils.js.map +1 -0
  101. package/esm/column-utils.js +738 -0
  102. package/esm/column-utils.js.map +1 -0
  103. package/esm/common-types.js +13 -0
  104. package/esm/common-types.js.map +1 -0
  105. package/esm/component-registry.js +99 -0
  106. package/esm/component-registry.js.map +1 -0
  107. package/esm/cookie-utils.js +8 -0
  108. package/esm/cookie-utils.js.map +1 -0
  109. package/esm/data-utils.js +50 -0
  110. package/esm/data-utils.js.map +1 -0
  111. package/esm/datasource-action-utils.js +8 -0
  112. package/esm/datasource-action-utils.js.map +1 -0
  113. package/esm/datasource-utils.js +158 -0
  114. package/esm/datasource-utils.js.map +1 -0
  115. package/esm/date/dateTimePattern.js +21 -0
  116. package/esm/date/dateTimePattern.js.map +1 -0
  117. package/esm/date/formatter.js +63 -0
  118. package/esm/date/formatter.js.map +1 -0
  119. package/esm/date/types.js +20 -0
  120. package/esm/date/types.js.map +1 -0
  121. package/esm/date/utils.js +8 -0
  122. package/esm/date/utils.js.map +1 -0
  123. package/esm/debug-utils.js +29 -0
  124. package/esm/debug-utils.js.map +1 -0
  125. package/esm/event-emitter.js +117 -0
  126. package/esm/event-emitter.js.map +1 -0
  127. package/esm/filters/filterAsQuery.js +72 -0
  128. package/esm/filters/filterAsQuery.js.map +1 -0
  129. package/esm/filters/utils.js +74 -0
  130. package/esm/filters/utils.js.map +1 -0
  131. package/esm/formatting-utils.js +62 -0
  132. package/esm/formatting-utils.js.map +1 -0
  133. package/esm/getUniqueId.js +4 -0
  134. package/esm/getUniqueId.js.map +1 -0
  135. package/esm/group-utils.js +10 -0
  136. package/esm/group-utils.js.map +1 -0
  137. package/esm/html-utils.js +111 -0
  138. package/esm/html-utils.js.map +1 -0
  139. package/esm/index.js +45 -8
  140. package/esm/index.js.map +1 -7
  141. package/esm/input-utils.js +7 -0
  142. package/esm/input-utils.js.map +1 -0
  143. package/esm/invariant.js +11 -0
  144. package/esm/invariant.js.map +1 -0
  145. package/esm/itemToString.js +21 -0
  146. package/esm/itemToString.js.map +1 -0
  147. package/esm/json-utils.js +90 -0
  148. package/esm/json-utils.js.map +1 -0
  149. package/esm/keyboard-utils.js +15 -0
  150. package/esm/keyboard-utils.js.map +1 -0
  151. package/esm/keyset.js +66 -0
  152. package/esm/keyset.js.map +1 -0
  153. package/esm/logging-utils.js +58 -0
  154. package/esm/logging-utils.js.map +1 -0
  155. package/esm/menu-utils.js +4 -0
  156. package/esm/menu-utils.js.map +1 -0
  157. package/esm/module-utils.js +9 -0
  158. package/esm/module-utils.js.map +1 -0
  159. package/esm/nanoid/index.js +20 -0
  160. package/esm/nanoid/index.js.map +1 -0
  161. package/esm/perf-utils.js +32 -0
  162. package/esm/perf-utils.js.map +1 -0
  163. package/esm/range-utils.js +66 -0
  164. package/esm/range-utils.js.map +1 -0
  165. package/esm/react-utils.js +19 -0
  166. package/esm/react-utils.js.map +1 -0
  167. package/esm/round-decimal.js +84 -0
  168. package/esm/round-decimal.js.map +1 -0
  169. package/esm/row-utils.js +78 -0
  170. package/esm/row-utils.js.map +1 -0
  171. package/esm/selection-utils.js +227 -0
  172. package/esm/selection-utils.js.map +1 -0
  173. package/esm/sort-utils.js +57 -0
  174. package/esm/sort-utils.js.map +1 -0
  175. package/esm/text-utils.js +18 -0
  176. package/esm/text-utils.js.map +1 -0
  177. package/esm/ts-utils.js +6 -0
  178. package/esm/ts-utils.js.map +1 -0
  179. package/esm/url-utils.js +18 -0
  180. package/esm/url-utils.js.map +1 -0
  181. package/esm/useId.js +7 -0
  182. package/esm/useId.js.map +1 -0
  183. package/esm/useLayoutEffectSkipFirst.js +15 -0
  184. package/esm/useLayoutEffectSkipFirst.js.map +1 -0
  185. package/package.json +12 -9
  186. package/types/column-utils.d.ts +1 -43
  187. package/types/filters/filterAsQuery.d.ts +2 -0
  188. package/types/filters/index.d.ts +1 -1
  189. package/types/filters/utils.d.ts +44 -2
  190. package/types/index.d.ts +0 -1
  191. package/LICENSE +0 -201
  192. package/types/local-config.d.ts +0 -3
@@ -0,0 +1,78 @@
1
+ import { metadataKeys } from './column-utils.js';
2
+
3
+ const { IS_LEAF, KEY, IDX, SELECTED } = metadataKeys;
4
+ const actualRowPositioning = (rowHeight) => [
5
+ (row) => row[IDX] * rowHeight,
6
+ (position) => Math.floor(position / rowHeight),
7
+ false
8
+ ];
9
+ const virtualRowPositioning = (rowHeight, virtualisedExtent, pctScrollTop) => [
10
+ (row, offset = 0) => {
11
+ const rowOffset = pctScrollTop.current * virtualisedExtent;
12
+ return (row[IDX] - offset) * rowHeight - rowOffset;
13
+ },
14
+ /*
15
+ Return index position of closest row
16
+ */
17
+ (position) => {
18
+ const rowOffset = pctScrollTop.current * virtualisedExtent;
19
+ return Math.round((position + rowOffset) / rowHeight);
20
+ },
21
+ true
22
+ ];
23
+ const getRowElementAtIndex = (container, rowIndex) => {
24
+ if (rowIndex === -1) {
25
+ return null;
26
+ } else {
27
+ const activeRow = container.querySelector(
28
+ `[aria-rowindex="${rowIndex + 1}"]`
29
+ );
30
+ if (activeRow) {
31
+ return activeRow;
32
+ } else {
33
+ throw Error(
34
+ `getRowElementAtIndex no row found for index index ${rowIndex}`
35
+ );
36
+ }
37
+ }
38
+ };
39
+ const getIndexFromRowElement = (rowElement) => {
40
+ const rowIndex = rowElement.ariaRowIndex;
41
+ if (rowIndex != null) {
42
+ const index = parseInt(rowIndex) - 1;
43
+ if (!isNaN(index)) {
44
+ return index;
45
+ } else {
46
+ throw Error(
47
+ `getIndexFromRowElement row element aria rowindex invalid ${rowIndex}`
48
+ );
49
+ }
50
+ } else {
51
+ throw Error(
52
+ "getIndexFromRowElement row element does not have aria rowindex"
53
+ );
54
+ }
55
+ };
56
+ const asDataSourceRowObject = (row, columnMap) => {
57
+ console.log({ columnMap });
58
+ const {
59
+ [IS_LEAF]: isLeaf,
60
+ [KEY]: key,
61
+ [IDX]: index,
62
+ [SELECTED]: selected
63
+ } = row;
64
+ const rowObject = {
65
+ key,
66
+ index,
67
+ isGroupRow: !isLeaf,
68
+ isSelected: selected > 0,
69
+ data: {}
70
+ };
71
+ for (const [colName, colIdx] of Object.entries(columnMap)) {
72
+ rowObject.data[colName] = row[colIdx];
73
+ }
74
+ return rowObject;
75
+ };
76
+
77
+ export { actualRowPositioning, asDataSourceRowObject, getIndexFromRowElement, getRowElementAtIndex, virtualRowPositioning };
78
+ //# sourceMappingURL=row-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"row-utils.js","sources":["../src/row-utils.ts"],"sourcesContent":["//TODO this all probably belongs in vuu-table\nimport type {\n DataSourceRow,\n DataSourceRowObject,\n} from \"@vuu-ui/vuu-data-types\";\nimport type { MutableRefObject } from \"react\";\nimport { ColumnMap, metadataKeys } from \"./column-utils\";\n\nconst { IS_LEAF, KEY, IDX, SELECTED } = metadataKeys;\n\nexport type RowOffsetFunc = (\n row: DataSourceRow,\n pctScrollTop?: number\n) => number;\nexport type RowAtPositionFunc = (position: number) => number;\n\n/**\n * RowOffset function, RowAtPosition function, isVirtualScroll\n */\nexport type RowPositioning = [RowOffsetFunc, RowAtPositionFunc, boolean];\n\nexport const actualRowPositioning = (rowHeight: number): RowPositioning => [\n (row) => row[IDX] * rowHeight,\n (position) => Math.floor(position / rowHeight),\n false,\n];\n\n/**\n * return functions for determining a) the pixel offset to apply to a row, given the\n * row index and b) the index of the row at a given scroll offset. This implementation\n * is used when we are forced to 'virtualise' scrolling - because the number of rows\n * is high enough that we cannot create a large enough HTML content container.\n *\n * @param rowHeight\n * @param virtualisedExtent\n * @param pctScrollTop\n * @returns\n */\nexport const virtualRowPositioning = (\n rowHeight: number,\n virtualisedExtent: number,\n pctScrollTop: MutableRefObject<number>\n): RowPositioning => [\n (row, offset = 0) => {\n const rowOffset = pctScrollTop.current * virtualisedExtent;\n return (row[IDX] - offset) * rowHeight - rowOffset;\n },\n /*\n Return index position of closest row \n */\n (position) => {\n const rowOffset = pctScrollTop.current * virtualisedExtent;\n return Math.round((position + rowOffset) / rowHeight);\n },\n true,\n];\n\nexport const getRowElementAtIndex = (\n container: HTMLDivElement | EventTarget,\n rowIndex: number\n) => {\n if (rowIndex === -1) {\n return null;\n } else {\n const activeRow = (container as HTMLElement).querySelector(\n `[aria-rowindex=\"${rowIndex + 1}\"]`\n ) as HTMLElement;\n\n if (activeRow) {\n return activeRow;\n } else {\n throw Error(\n `getRowElementAtIndex no row found for index index ${rowIndex}`\n );\n }\n }\n};\n\nexport const getIndexFromRowElement = (rowElement: HTMLElement) => {\n const rowIndex = rowElement.ariaRowIndex;\n if (rowIndex != null) {\n const index = parseInt(rowIndex) - 1;\n if (!isNaN(index)) {\n return index;\n } else {\n throw Error(\n `getIndexFromRowElement row element aria rowindex invalid ${rowIndex}`\n );\n }\n } else {\n throw Error(\n \"getIndexFromRowElement row element does not have aria rowindex\"\n );\n }\n};\n\nexport const asDataSourceRowObject = (\n row: DataSourceRow,\n columnMap: ColumnMap\n): DataSourceRowObject => {\n console.log({ columnMap });\n const {\n [IS_LEAF]: isLeaf,\n [KEY]: key,\n [IDX]: index,\n [SELECTED]: selected,\n } = row;\n\n const rowObject: DataSourceRowObject = {\n key,\n index,\n isGroupRow: !isLeaf,\n isSelected: selected > 0,\n data: {},\n };\n\n for (const [colName, colIdx] of Object.entries(columnMap)) {\n rowObject.data[colName] = row[colIdx];\n }\n\n return rowObject;\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,227 @@
1
+ import { metadataKeys } from './column-utils.js';
2
+
3
+ const NO_SELECTION = [];
4
+ const { SELECTED } = metadataKeys;
5
+ const RowSelected = {
6
+ False: 0,
7
+ True: 1,
8
+ First: 2,
9
+ Last: 4
10
+ };
11
+ const isRowSelected = (row) => (row[SELECTED] & RowSelected.True) === RowSelected.True;
12
+ const isRowSelectedLast = (row) => row !== void 0 && (row[SELECTED] & RowSelected.Last) === RowSelected.Last;
13
+ const inAscendingOrder = (item1, item2) => {
14
+ const n1 = typeof item1 === "number" ? item1 : item1[0];
15
+ const n2 = typeof item2 === "number" ? item2 : item2[0];
16
+ return n1 - n2;
17
+ };
18
+ const deselectItem = (selectionModel, selected, itemIndex, rangeSelect, keepExistingSelection = false) => {
19
+ const singleSelect = selectionModel === "single";
20
+ const multiSelect = selectionModel === "extended" || selectionModel === "checkbox";
21
+ const actsLikeSingleSelect = singleSelect || multiSelect && !keepExistingSelection && !rangeSelect;
22
+ if (actsLikeSingleSelect || !rangeSelect && !keepExistingSelection) {
23
+ return NO_SELECTION;
24
+ } else if (!rangeSelect && keepExistingSelection) {
25
+ return removeSelectedItem(selected, itemIndex);
26
+ }
27
+ return NO_SELECTION;
28
+ };
29
+ const newSelectedFillsGapOrExtends = (selection, itemIndex) => {
30
+ for (let i = 0; i < selection.length; i++) {
31
+ const item = selection[i];
32
+ if (typeof item === "number") {
33
+ if (item === itemIndex - 1) {
34
+ return true;
35
+ } else if (item > itemIndex) {
36
+ return false;
37
+ }
38
+ } else if (item[0] === itemIndex + 1 || item[1] === itemIndex - 1) {
39
+ return true;
40
+ } else if (item[0] > itemIndex) {
41
+ return false;
42
+ }
43
+ }
44
+ return false;
45
+ };
46
+ const fillGapOrExtendSelection = (selection, itemIndex) => {
47
+ for (let i = 0; i < selection.length; i++) {
48
+ const item = selection[i];
49
+ if (typeof item === "number") {
50
+ if (item === itemIndex - 1) {
51
+ const nextSelectionItem = selection[i + 1];
52
+ if (nextSelectionItem === itemIndex + 1) {
53
+ const newRange = [item, nextSelectionItem];
54
+ return selection.slice(0, i).concat([newRange]).concat(selection.slice(i + 2));
55
+ } else {
56
+ const newRange = [item, itemIndex];
57
+ return selection.slice(0, i).concat([newRange]).concat(selection.slice(i + 1));
58
+ }
59
+ } else if (item > itemIndex) {
60
+ break;
61
+ }
62
+ } else if (item[0] === itemIndex + 1) {
63
+ const newRange = [itemIndex, item[1]];
64
+ return selection.slice(0, i).concat([newRange]).concat(selection.slice(i + 1));
65
+ } else if (item[1] === itemIndex - 1) {
66
+ const nextItem = selection[i + 1];
67
+ if (Array.isArray(nextItem) && nextItem[0] === itemIndex + 1) {
68
+ const newRange = [item[0], nextItem[1]];
69
+ return selection.slice(0, i).concat([newRange]).concat(selection.slice(i + 2));
70
+ } else if (typeof nextItem === "number" && nextItem === itemIndex + 1) {
71
+ const newRange = [item[0], nextItem];
72
+ return selection.slice(0, i).concat([newRange]).concat(selection.slice(i + 2));
73
+ } else {
74
+ const newRange = [item[0], itemIndex];
75
+ return selection.slice(0, i).concat([newRange]).concat(selection.slice(i + 1));
76
+ }
77
+ }
78
+ }
79
+ return selection;
80
+ };
81
+ const selectItem = (selectionModel, selected, itemIndex, rangeSelect, keepExistingSelection = false, activeItemIndex = -1) => {
82
+ const singleSelect = selectionModel === "single";
83
+ const multiSelect = selectionModel === "extended" || selectionModel === "checkbox";
84
+ const actsLikeSingleSelect = singleSelect || multiSelect && !keepExistingSelection && !rangeSelect;
85
+ if (selectionModel === "none") {
86
+ return NO_SELECTION;
87
+ } else if (actsLikeSingleSelect) {
88
+ return [itemIndex];
89
+ } else if (rangeSelect) {
90
+ if (selected.length === 0) {
91
+ return [itemIndex];
92
+ } else {
93
+ const range = itemIndex > activeItemIndex ? [activeItemIndex, itemIndex] : [itemIndex, activeItemIndex];
94
+ return insertRange(selected, range);
95
+ }
96
+ } else if (!rangeSelect) {
97
+ if (newSelectedFillsGapOrExtends(selected, itemIndex)) {
98
+ return fillGapOrExtendSelection(selected, itemIndex);
99
+ } else {
100
+ return selected?.concat(itemIndex).sort(inAscendingOrder);
101
+ }
102
+ } else ;
103
+ return NO_SELECTION;
104
+ };
105
+ function removeSelectedItem(selected, itemIndex) {
106
+ if (selected.includes(itemIndex)) {
107
+ return selected.filter((selectedItem) => selectedItem !== itemIndex);
108
+ } else {
109
+ const newSelected = [];
110
+ for (const selectedItem of selected) {
111
+ if (Array.isArray(selectedItem)) {
112
+ if (rangeIncludes(selectedItem, itemIndex)) {
113
+ newSelected.push(...splitRange(selectedItem, itemIndex));
114
+ } else {
115
+ newSelected.push(selectedItem);
116
+ }
117
+ } else {
118
+ newSelected.push(selectedItem);
119
+ }
120
+ }
121
+ return newSelected;
122
+ }
123
+ }
124
+ function insertRange(selected, range) {
125
+ const [from, to] = range;
126
+ return selected.reduce((newSelected, selectedItem) => {
127
+ if (typeof selectedItem === "number") {
128
+ if (selectedItem < from || selectedItem > to) {
129
+ newSelected.push(selectedItem);
130
+ } else if (!includedInRange(newSelected.at(-1), selectedItem)) {
131
+ newSelected.push(range);
132
+ }
133
+ } else if (overlappingRange(selectedItem, range)) {
134
+ newSelected.push(mergeRanges(selectedItem, range));
135
+ } else {
136
+ if (range[1] < selectedItem[0]) {
137
+ newSelected.push(range);
138
+ }
139
+ newSelected.push(selectedItem);
140
+ }
141
+ return newSelected;
142
+ }, []);
143
+ }
144
+ const overlappingRange = (r1, r2) => r1[1] >= r2[0] && r1[1] <= r2[1] || r1[0] >= r2[0] && r1[0] <= r2[1];
145
+ const mergeRanges = (r1, r2) => [
146
+ Math.min(r1[0], r2[0]),
147
+ Math.max(r1[1], r2[1])
148
+ ];
149
+ const includedInRange = (selectedItem, index) => {
150
+ if (typeof selectedItem === "undefined" || typeof selectedItem === "number") {
151
+ return false;
152
+ } else
153
+ return rangeIncludes(selectedItem, index);
154
+ };
155
+ const rangeIncludes = (range, index) => index >= range[0] && index <= range[1];
156
+ const SINGLE_SELECTED_ROW = RowSelected.True + RowSelected.First + RowSelected.Last;
157
+ const FIRST_SELECTED_ROW_OF_BLOCK = RowSelected.True + RowSelected.First;
158
+ const LAST_SELECTED_ROW_OF_BLOCK = RowSelected.True + RowSelected.Last;
159
+ const getSelectionStatus = (selected, itemIndex) => {
160
+ for (const item of selected) {
161
+ if (typeof item === "number") {
162
+ if (item === itemIndex) {
163
+ return SINGLE_SELECTED_ROW;
164
+ }
165
+ } else if (rangeIncludes(item, itemIndex)) {
166
+ if (itemIndex === item[0]) {
167
+ return FIRST_SELECTED_ROW_OF_BLOCK;
168
+ } else if (itemIndex === item[1]) {
169
+ return LAST_SELECTED_ROW_OF_BLOCK;
170
+ } else {
171
+ return RowSelected.True;
172
+ }
173
+ }
174
+ }
175
+ return RowSelected.False;
176
+ };
177
+ const isSelected = (selected, itemIndex) => {
178
+ for (const item of selected) {
179
+ if (typeof item === "number") {
180
+ if (item === itemIndex) {
181
+ return true;
182
+ } else if (item > itemIndex) {
183
+ return false;
184
+ }
185
+ } else if (rangeIncludes(item, itemIndex)) {
186
+ return true;
187
+ } else if (item[0] > itemIndex) {
188
+ return false;
189
+ }
190
+ }
191
+ return false;
192
+ };
193
+ const expandSelection = (selected) => {
194
+ if (selected.every((selectedItem) => typeof selectedItem === "number")) {
195
+ return selected;
196
+ }
197
+ const expandedSelected = [];
198
+ for (const selectedItem of selected) {
199
+ if (typeof selectedItem === "number") {
200
+ expandedSelected.push(selectedItem);
201
+ } else {
202
+ for (let i = selectedItem[0]; i <= selectedItem[1]; i++) {
203
+ expandedSelected.push(i);
204
+ }
205
+ }
206
+ }
207
+ return expandedSelected;
208
+ };
209
+ function splitRange([from, to], itemIndex) {
210
+ if (itemIndex === from) {
211
+ return [[from + 1, to]];
212
+ } else if (itemIndex === to) {
213
+ return [[from, to - 1]];
214
+ } else if (to - from === 2) {
215
+ return [from, to];
216
+ } else if (itemIndex === to - 1) {
217
+ return [[from, to - 2], to];
218
+ } else {
219
+ return [
220
+ [from, itemIndex - 1],
221
+ [itemIndex + 1, to]
222
+ ];
223
+ }
224
+ }
225
+
226
+ export { RowSelected, deselectItem, expandSelection, getSelectionStatus, isRowSelected, isRowSelectedLast, isSelected, selectItem };
227
+ //# sourceMappingURL=selection-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selection-utils.js","sources":["../src/selection-utils.ts"],"sourcesContent":["import {\n DataSourceRow,\n RangeTuple,\n Selection,\n SelectionItem,\n} from \"@vuu-ui/vuu-data-types\";\nimport { TableSelectionModel } from \"@vuu-ui/vuu-table-types\";\nimport { metadataKeys } from \"./column-utils\";\n\nconst NO_SELECTION: number[] = [];\n\nconst { SELECTED } = metadataKeys;\n\nexport const RowSelected = {\n False: 0,\n True: 1,\n First: 2,\n Last: 4,\n};\n\nexport const isRowSelected = (row: DataSourceRow): boolean =>\n (row[SELECTED] & RowSelected.True) === RowSelected.True;\nexport const isRowSelectedLast = (row?: DataSourceRow): boolean =>\n row !== undefined && (row[SELECTED] & RowSelected.Last) === RowSelected.Last;\n\nconst inAscendingOrder = (item1: SelectionItem, item2: SelectionItem) => {\n const n1: number = typeof item1 === \"number\" ? item1 : item1[0];\n const n2: number = typeof item2 === \"number\" ? item2 : item2[0];\n return n1 - n2;\n};\n\nexport const deselectItem = (\n selectionModel: TableSelectionModel,\n selected: Selection,\n itemIndex: number,\n rangeSelect: boolean,\n keepExistingSelection = false\n): Selection => {\n const singleSelect = selectionModel === \"single\";\n const multiSelect =\n selectionModel === \"extended\" || selectionModel === \"checkbox\";\n const actsLikeSingleSelect =\n singleSelect || (multiSelect && !keepExistingSelection && !rangeSelect);\n\n if (actsLikeSingleSelect || (!rangeSelect && !keepExistingSelection)) {\n return NO_SELECTION;\n } else if (!rangeSelect && keepExistingSelection) {\n return removeSelectedItem(selected, itemIndex);\n }\n return NO_SELECTION;\n};\n\nconst newSelectedFillsGapOrExtends = (\n selection: Selection,\n itemIndex: number\n): boolean => {\n for (let i = 0; i < selection.length; i++) {\n const item = selection[i];\n if (typeof item === \"number\") {\n if (item === itemIndex - 1) {\n return true;\n } else if (item > itemIndex) {\n return false;\n }\n } else if (item[0] === itemIndex + 1 || item[1] === itemIndex - 1) {\n return true;\n } else if (item[0] > itemIndex) {\n return false;\n }\n }\n return false;\n};\n\nconst fillGapOrExtendSelection = (\n selection: Selection,\n itemIndex: number\n): Selection => {\n for (let i = 0; i < selection.length; i++) {\n const item = selection[i];\n if (typeof item === \"number\") {\n if (item === itemIndex - 1) {\n const nextSelectionItem = selection[i + 1];\n if (nextSelectionItem === itemIndex + 1) {\n const newRange: SelectionItem = [item, nextSelectionItem];\n return selection\n .slice(0, i)\n .concat([newRange])\n .concat(selection.slice(i + 2));\n } else {\n const newRange: SelectionItem = [item, itemIndex];\n return selection\n .slice(0, i)\n .concat([newRange])\n .concat(selection.slice(i + 1));\n }\n } else if (item > itemIndex) {\n break;\n }\n } else if (item[0] === itemIndex + 1) {\n const newRange: SelectionItem = [itemIndex, item[1]];\n return selection\n .slice(0, i)\n .concat([newRange])\n .concat(selection.slice(i + 1));\n } else if (item[1] === itemIndex - 1) {\n // check to see whether another contiguous range follows\n const nextItem = selection[i + 1];\n if (Array.isArray(nextItem) && nextItem[0] === itemIndex + 1) {\n const newRange: SelectionItem = [item[0], nextItem[1]];\n return selection\n .slice(0, i)\n .concat([newRange])\n .concat(selection.slice(i + 2));\n } else if (typeof nextItem === \"number\" && nextItem === itemIndex + 1) {\n const newRange: SelectionItem = [item[0], nextItem];\n return selection\n .slice(0, i)\n .concat([newRange])\n .concat(selection.slice(i + 2));\n } else {\n const newRange: SelectionItem = [item[0], itemIndex];\n return selection\n .slice(0, i)\n .concat([newRange])\n .concat(selection.slice(i + 1));\n }\n }\n }\n\n return selection;\n};\n\nexport const selectItem = (\n selectionModel: TableSelectionModel,\n selected: Selection,\n itemIndex: number,\n rangeSelect: boolean,\n keepExistingSelection = false,\n activeItemIndex = -1\n): Selection => {\n const singleSelect = selectionModel === \"single\";\n const multiSelect =\n selectionModel === \"extended\" || selectionModel === \"checkbox\";\n const actsLikeSingleSelect =\n singleSelect || (multiSelect && !keepExistingSelection && !rangeSelect);\n\n if (selectionModel === \"none\") {\n return NO_SELECTION;\n } else if (actsLikeSingleSelect) {\n return [itemIndex];\n } else if (rangeSelect) {\n if (selected.length === 0) {\n return [itemIndex];\n } else {\n const range: RangeTuple =\n itemIndex > activeItemIndex\n ? [activeItemIndex, itemIndex]\n : [itemIndex, activeItemIndex];\n return insertRange(selected, range);\n }\n } else if (!rangeSelect) {\n // what if we now have a range because we just filled agap between 2\n if (newSelectedFillsGapOrExtends(selected, itemIndex)) {\n return fillGapOrExtendSelection(selected, itemIndex);\n } else {\n return selected?.concat(itemIndex).sort(inAscendingOrder);\n }\n } else if (multiSelect) {\n // const [from, to] = idx > active ? [active, idx] : [idx, active];\n // newSelected = selected?.slice();\n // for (let i = from; i <= to; i++) {\n // if (!selected?.includes(i)) {\n // newSelected.push(i);\n // }\n // }\n }\n return NO_SELECTION;\n};\n\nfunction removeSelectedItem(selected: Selection, itemIndex: number) {\n if (selected.includes(itemIndex)) {\n return selected.filter((selectedItem) => selectedItem !== itemIndex);\n } else {\n const newSelected: Selection = [];\n for (const selectedItem of selected) {\n if (Array.isArray(selectedItem)) {\n if (rangeIncludes(selectedItem, itemIndex)) {\n newSelected.push(...splitRange(selectedItem, itemIndex));\n } else {\n newSelected.push(selectedItem);\n }\n } else {\n newSelected.push(selectedItem);\n }\n }\n return newSelected;\n }\n}\n\nfunction insertRange(selected: Selection, range: RangeTuple): Selection {\n const [from, to] = range;\n return selected.reduce<Selection>((newSelected, selectedItem) => {\n if (typeof selectedItem === \"number\") {\n if (selectedItem < from || selectedItem > to) {\n newSelected.push(selectedItem);\n } else if (!includedInRange(newSelected.at(-1), selectedItem)) {\n newSelected.push(range);\n }\n } else if (overlappingRange(selectedItem, range)) {\n newSelected.push(mergeRanges(selectedItem, range));\n } else {\n if (range[1] < selectedItem[0]) {\n newSelected.push(range);\n }\n newSelected.push(selectedItem);\n }\n\n return newSelected;\n }, []);\n}\n\nconst overlappingRange = (r1: RangeTuple, r2: RangeTuple) =>\n (r1[1] >= r2[0] && r1[1] <= r2[1]) || (r1[0] >= r2[0] && r1[0] <= r2[1]);\nconst mergeRanges = (r1: RangeTuple, r2: RangeTuple): RangeTuple => [\n Math.min(r1[0], r2[0]),\n Math.max(r1[1], r2[1]),\n];\n\nconst includedInRange = (\n selectedItem: SelectionItem | undefined,\n index: number\n) => {\n if (typeof selectedItem === \"undefined\" || typeof selectedItem === \"number\") {\n return false;\n } else return rangeIncludes(selectedItem, index);\n};\n\nconst rangeIncludes = (range: RangeTuple, index: number) =>\n index >= range[0] && index <= range[1];\n\nconst SINGLE_SELECTED_ROW =\n RowSelected.True + RowSelected.First + RowSelected.Last;\nconst FIRST_SELECTED_ROW_OF_BLOCK = RowSelected.True + RowSelected.First;\nconst LAST_SELECTED_ROW_OF_BLOCK = RowSelected.True + RowSelected.Last;\n\n/**\n * Determine the value for selected. We use a bitmap to represent a number of selection states\n * a row might exhibit. selected/not-selected is the fundamental value. We also identify first\n * row of a selected block, last row of a selected block;\n */\nexport const getSelectionStatus = (\n selected: Selection,\n itemIndex: number\n): number => {\n for (const item of selected) {\n if (typeof item === \"number\") {\n if (item === itemIndex) {\n return SINGLE_SELECTED_ROW;\n }\n } else if (rangeIncludes(item, itemIndex)) {\n if (itemIndex === item[0]) {\n return FIRST_SELECTED_ROW_OF_BLOCK;\n } else if (itemIndex === item[1]) {\n return LAST_SELECTED_ROW_OF_BLOCK;\n } else {\n return RowSelected.True;\n }\n }\n }\n return RowSelected.False;\n};\n\nexport const isSelected = (selected: Selection, itemIndex: number) => {\n for (const item of selected) {\n if (typeof item === \"number\") {\n if (item === itemIndex) {\n return true;\n } else if (item > itemIndex) {\n return false;\n }\n } else if (rangeIncludes(item, itemIndex)) {\n return true;\n } else if (item[0] > itemIndex) {\n return false;\n }\n }\n\n return false;\n};\n/**\n * Vuu server expects a full list if indexes of selected rows. Client represents selection in a more\n * efficient structure. This converts client structure to full server format.\n */\nexport const expandSelection = (selected: Selection): number[] => {\n if (selected.every((selectedItem) => typeof selectedItem === \"number\")) {\n return selected as number[];\n }\n const expandedSelected = [];\n for (const selectedItem of selected) {\n if (typeof selectedItem === \"number\") {\n expandedSelected.push(selectedItem);\n } else {\n for (let i = selectedItem[0]; i <= selectedItem[1]; i++) {\n expandedSelected.push(i);\n }\n }\n }\n return expandedSelected;\n};\n\nfunction splitRange([from, to]: RangeTuple, itemIndex: number): Selection {\n if (itemIndex === from) {\n return [[from + 1, to]];\n } else if (itemIndex === to) {\n return [[from, to - 1]];\n } else if (to - from === 2) {\n return [from, to];\n } else if (itemIndex === to - 1) {\n return [[from, to - 2], to];\n } else {\n return [\n [from, itemIndex - 1],\n [itemIndex + 1, to],\n ];\n }\n}\n\nexport type SelectionDiff = {\n added: SelectionItem[];\n removed: SelectionItem[];\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ const cycleSortType = (sortType) => sortType === "A" ? "D" : sortType === "D" ? void 0 : "A";
2
+ const NO_SORT = { sortDefs: [] };
3
+ const toggleOrApplySort = ({ sortDefs }, { name: column }, extendSort = false, sortType) => {
4
+ if (extendSort) {
5
+ const existingDef = sortDefs.find((sortDef) => sortDef.column === column);
6
+ if (existingDef) {
7
+ return {
8
+ sortDefs: sortDefs.map(
9
+ (sortDef) => sortDef.column === column ? {
10
+ column,
11
+ sortType: sortDef.sortType === "A" ? "D" : "A"
12
+ } : sortDef
13
+ )
14
+ };
15
+ } else {
16
+ return {
17
+ sortDefs: sortDefs.concat({
18
+ column,
19
+ sortType: sortType ?? "A"
20
+ })
21
+ };
22
+ }
23
+ }
24
+ const newSortType = typeof sortType === "string" ? sortType : sortDefs.length === 1 && sortDefs[0].column === column ? cycleSortType(sortDefs[0].sortType) : "A";
25
+ return newSortType ? {
26
+ sortDefs: [{ column, sortType: newSortType }]
27
+ } : NO_SORT;
28
+ };
29
+ const setSortColumn = ({ sortDefs }, column, sortType) => {
30
+ if (sortType === void 0) {
31
+ const columnSort = sortDefs.find((item) => item.column === column.name);
32
+ if (columnSort) {
33
+ return {
34
+ sortDefs: [
35
+ {
36
+ column: column.name,
37
+ sortType: columnSort.sortType === "A" ? "D" : "A"
38
+ }
39
+ ]
40
+ };
41
+ }
42
+ }
43
+ return { sortDefs: [{ column: column.name, sortType: sortType ?? "A" }] };
44
+ };
45
+ const addSortColumn = ({ sortDefs }, column, sortType = "A") => {
46
+ const sortEntry = { column: column.name, sortType };
47
+ if (sortDefs.length > 0) {
48
+ return {
49
+ sortDefs: sortDefs.concat(sortEntry)
50
+ };
51
+ } else {
52
+ return { sortDefs: [sortEntry] };
53
+ }
54
+ };
55
+
56
+ export { addSortColumn, setSortColumn, toggleOrApplySort };
57
+ //# sourceMappingURL=sort-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sort-utils.js","sources":["../src/sort-utils.ts"],"sourcesContent":["import {\n ColumnDescriptor,\n RuntimeColumnDescriptor,\n} from \"@vuu-ui/vuu-table-types\";\nimport { VuuSort, VuuSortCol, VuuSortType } from \"@vuu-ui/vuu-protocol-types\";\n\nconst cycleSortType = (sortType: VuuSortType) =>\n sortType === \"A\" ? \"D\" : sortType === \"D\" ? undefined : \"A\";\n\nconst NO_SORT: VuuSort = { sortDefs: [] };\n\n// Given an existing sort spec and a column we wish to sort by,\n// construct and return a new sort spec.\nexport const toggleOrApplySort = (\n { sortDefs }: VuuSort,\n { name: column }: ColumnDescriptor,\n extendSort = false,\n sortType?: VuuSortType\n): VuuSort => {\n if (extendSort) {\n const existingDef = sortDefs.find((sortDef) => sortDef.column === column);\n if (existingDef) {\n return {\n sortDefs: sortDefs.map((sortDef) =>\n sortDef.column === column\n ? {\n column,\n sortType: sortDef.sortType === \"A\" ? \"D\" : \"A\",\n }\n : sortDef\n ),\n };\n } else {\n return {\n sortDefs: sortDefs.concat({\n column,\n sortType: sortType ?? \"A\",\n }),\n };\n }\n }\n\n const newSortType =\n typeof sortType === \"string\"\n ? sortType\n : sortDefs.length === 1 && sortDefs[0].column === column\n ? cycleSortType(sortDefs[0].sortType)\n : \"A\";\n\n return newSortType\n ? {\n sortDefs: [{ column, sortType: newSortType }],\n }\n : NO_SORT;\n};\n\nexport const setSortColumn = (\n { sortDefs }: VuuSort,\n column: RuntimeColumnDescriptor,\n sortType?: \"A\" | \"D\"\n): VuuSort => {\n if (sortType === undefined) {\n const columnSort = sortDefs.find((item) => item.column === column.name);\n if (columnSort) {\n return {\n sortDefs: [\n {\n column: column.name,\n sortType: columnSort.sortType === \"A\" ? \"D\" : \"A\",\n },\n ],\n };\n }\n }\n return { sortDefs: [{ column: column.name, sortType: sortType ?? \"A\" }] };\n};\n\nexport const addSortColumn = (\n { sortDefs }: VuuSort,\n column: RuntimeColumnDescriptor,\n sortType: \"A\" | \"D\" = \"A\"\n): VuuSort => {\n const sortEntry: VuuSortCol = { column: column.name, sortType };\n if (sortDefs.length > 0) {\n return {\n sortDefs: sortDefs.concat(sortEntry),\n };\n } else {\n return { sortDefs: [sortEntry] };\n }\n};\n"],"names":[],"mappings":"AAMA,MAAM,aAAA,GAAgB,CAAC,QACrB,KAAA,QAAA,KAAa,MAAM,GAAM,GAAA,QAAA,KAAa,MAAM,KAAY,CAAA,GAAA,GAAA,CAAA;AAE1D,MAAM,OAAmB,GAAA,EAAE,QAAU,EAAA,EAAG,EAAA,CAAA;AAI3B,MAAA,iBAAA,GAAoB,CAC/B,EAAE,QAAS,EAAA,EACX,EAAE,IAAA,EAAM,MAAO,EAAA,EACf,UAAa,GAAA,KAAA,EACb,QACY,KAAA;AACZ,EAAA,IAAI,UAAY,EAAA;AACd,IAAA,MAAM,cAAc,QAAS,CAAA,IAAA,CAAK,CAAC,OAAY,KAAA,OAAA,CAAQ,WAAW,MAAM,CAAA,CAAA;AACxE,IAAA,IAAI,WAAa,EAAA;AACf,MAAO,OAAA;AAAA,QACL,UAAU,QAAS,CAAA,GAAA;AAAA,UAAI,CAAC,OAAA,KACtB,OAAQ,CAAA,MAAA,KAAW,MACf,GAAA;AAAA,YACE,MAAA;AAAA,YACA,QAAU,EAAA,OAAA,CAAQ,QAAa,KAAA,GAAA,GAAM,GAAM,GAAA,GAAA;AAAA,WAE7C,GAAA,OAAA;AAAA,SACN;AAAA,OACF,CAAA;AAAA,KACK,MAAA;AACL,MAAO,OAAA;AAAA,QACL,QAAA,EAAU,SAAS,MAAO,CAAA;AAAA,UACxB,MAAA;AAAA,UACA,UAAU,QAAY,IAAA,GAAA;AAAA,SACvB,CAAA;AAAA,OACH,CAAA;AAAA,KACF;AAAA,GACF;AAEA,EAAA,MAAM,cACJ,OAAO,QAAA,KAAa,WAChB,QACA,GAAA,QAAA,CAAS,WAAW,CAAK,IAAA,QAAA,CAAS,CAAC,CAAA,CAAE,WAAW,MAChD,GAAA,aAAA,CAAc,SAAS,CAAC,CAAA,CAAE,QAAQ,CAClC,GAAA,GAAA,CAAA;AAEN,EAAA,OAAO,WACH,GAAA;AAAA,IACE,UAAU,CAAC,EAAE,MAAQ,EAAA,QAAA,EAAU,aAAa,CAAA;AAAA,GAE9C,GAAA,OAAA,CAAA;AACN,EAAA;AAEO,MAAM,gBAAgB,CAC3B,EAAE,QAAS,EAAA,EACX,QACA,QACY,KAAA;AACZ,EAAA,IAAI,aAAa,KAAW,CAAA,EAAA;AAC1B,IAAM,MAAA,UAAA,GAAa,SAAS,IAAK,CAAA,CAAC,SAAS,IAAK,CAAA,MAAA,KAAW,OAAO,IAAI,CAAA,CAAA;AACtE,IAAA,IAAI,UAAY,EAAA;AACd,MAAO,OAAA;AAAA,QACL,QAAU,EAAA;AAAA,UACR;AAAA,YACE,QAAQ,MAAO,CAAA,IAAA;AAAA,YACf,QAAU,EAAA,UAAA,CAAW,QAAa,KAAA,GAAA,GAAM,GAAM,GAAA,GAAA;AAAA,WAChD;AAAA,SACF;AAAA,OACF,CAAA;AAAA,KACF;AAAA,GACF;AACA,EAAO,OAAA,EAAE,QAAU,EAAA,CAAC,EAAE,MAAA,EAAQ,MAAO,CAAA,IAAA,EAAM,QAAU,EAAA,QAAA,IAAY,GAAI,EAAC,CAAE,EAAA,CAAA;AAC1E,EAAA;AAEO,MAAM,gBAAgB,CAC3B,EAAE,UACF,EAAA,MAAA,EACA,WAAsB,GACV,KAAA;AACZ,EAAA,MAAM,SAAwB,GAAA,EAAE,MAAQ,EAAA,MAAA,CAAO,MAAM,QAAS,EAAA,CAAA;AAC9D,EAAI,IAAA,QAAA,CAAS,SAAS,CAAG,EAAA;AACvB,IAAO,OAAA;AAAA,MACL,QAAA,EAAU,QAAS,CAAA,MAAA,CAAO,SAAS,CAAA;AAAA,KACrC,CAAA;AAAA,GACK,MAAA;AACL,IAAA,OAAO,EAAE,QAAA,EAAU,CAAC,SAAS,CAAE,EAAA,CAAA;AAAA,GACjC;AACF;;;;"}
@@ -0,0 +1,18 @@
1
+ const lastWord = (text) => {
2
+ const trimmedText = text.trim();
3
+ const pos = trimmedText.lastIndexOf(" ");
4
+ if (pos === -1) {
5
+ return trimmedText;
6
+ } else {
7
+ return trimmedText.slice(pos + 1);
8
+ }
9
+ };
10
+ const capitalize = (text) => text.length === 0 ? "" : text[0].toUpperCase() + text.slice(1);
11
+ const regexp_worfify = /(?<!(^|[A-Z]))(?=[A-Z])|(?<!^)(?=[A-Z][a-z])/;
12
+ const wordify = (text) => {
13
+ const [firstWord, ...rest] = text.split(regexp_worfify);
14
+ return `${capitalize(firstWord)} ${rest.join(" ")}`;
15
+ };
16
+
17
+ export { lastWord, wordify };
18
+ //# sourceMappingURL=text-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-utils.js","sources":["../src/text-utils.ts"],"sourcesContent":["export const lastWord = (text: string): string => {\n const trimmedText = text.trim();\n const pos = trimmedText.lastIndexOf(\" \");\n if (pos === -1) {\n return trimmedText;\n } else {\n return trimmedText.slice(pos + 1);\n }\n};\n\nconst capitalize = (text: string) =>\n text.length === 0 ? \"\" : text[0].toUpperCase() + text.slice(1);\n\nconst regexp_worfify = /(?<!(^|[A-Z]))(?=[A-Z])|(?<!^)(?=[A-Z][a-z])/;\nexport const wordify = (text: string) => {\n const [firstWord, ...rest] = text.split(regexp_worfify);\n return `${capitalize(firstWord)} ${rest.join(\" \")}`;\n};\n"],"names":[],"mappings":"AAAa,MAAA,QAAA,GAAW,CAAC,IAAyB,KAAA;AAChD,EAAM,MAAA,WAAA,GAAc,KAAK,IAAK,EAAA,CAAA;AAC9B,EAAM,MAAA,GAAA,GAAM,WAAY,CAAA,WAAA,CAAY,GAAG,CAAA,CAAA;AACvC,EAAA,IAAI,QAAQ,CAAI,CAAA,EAAA;AACd,IAAO,OAAA,WAAA,CAAA;AAAA,GACF,MAAA;AACL,IAAO,OAAA,WAAA,CAAY,KAAM,CAAA,GAAA,GAAM,CAAC,CAAA,CAAA;AAAA,GAClC;AACF,EAAA;AAEA,MAAM,UAAa,GAAA,CAAC,IAClB,KAAA,IAAA,CAAK,WAAW,CAAI,GAAA,EAAA,GAAK,IAAK,CAAA,CAAC,CAAE,CAAA,WAAA,EAAgB,GAAA,IAAA,CAAK,MAAM,CAAC,CAAA,CAAA;AAE/D,MAAM,cAAiB,GAAA,8CAAA,CAAA;AACV,MAAA,OAAA,GAAU,CAAC,IAAiB,KAAA;AACvC,EAAA,MAAM,CAAC,SAAW,EAAA,GAAG,IAAI,CAAI,GAAA,IAAA,CAAK,MAAM,cAAc,CAAA,CAAA;AACtD,EAAO,OAAA,CAAA,EAAG,WAAW,SAAS,CAAC,IAAI,IAAK,CAAA,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AACnD;;;;"}
@@ -0,0 +1,6 @@
1
+ function isNotNullOrUndefined(value) {
2
+ return value !== void 0 && value !== null;
3
+ }
4
+
5
+ export { isNotNullOrUndefined };
6
+ //# sourceMappingURL=ts-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ts-utils.js","sources":["../src/ts-utils.ts"],"sourcesContent":["export function isNotNullOrUndefined<T>(\n value: T | undefined | null\n): value is NonNullable<T> {\n return value !== undefined && value !== null;\n}\n"],"names":[],"mappings":"AAAO,SAAS,qBACd,KACyB,EAAA;AACzB,EAAO,OAAA,KAAA,KAAU,UAAa,KAAU,KAAA,IAAA,CAAA;AAC1C;;;;"}
@@ -0,0 +1,18 @@
1
+ const getUrlParameter = (paramName, defaultValue) => {
2
+ const url = new URL(document.location.href);
3
+ const parameter = url.searchParams.get(paramName);
4
+ if (parameter) {
5
+ return parameter;
6
+ }
7
+ const hashParams = url.hash;
8
+ const regex = new RegExp(`${paramName}=([a-zA-Z]*)`);
9
+ const result = regex.exec(hashParams);
10
+ if (result) {
11
+ return result[1];
12
+ }
13
+ return defaultValue;
14
+ };
15
+ const hasUrlParameter = (paramName) => new URL(document.location.href).searchParams.has(paramName);
16
+
17
+ export { getUrlParameter, hasUrlParameter };
18
+ //# sourceMappingURL=url-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-utils.js","sources":["../src/url-utils.ts"],"sourcesContent":["export const getUrlParameter = (paramName: string, defaultValue?: string) => {\n const url = new URL(document.location.href);\n const parameter = url.searchParams.get(paramName);\n if (parameter) {\n return parameter;\n }\n const hashParams = url.hash;\n const regex = new RegExp(`${paramName}=([a-zA-Z]*)`);\n const result = regex.exec(hashParams);\n if (result) {\n return result[1];\n }\n return defaultValue;\n};\n\nexport const hasUrlParameter = (paramName: string) =>\n new URL(document.location.href).searchParams.has(paramName);\n"],"names":[],"mappings":"AAAa,MAAA,eAAA,GAAkB,CAAC,SAAA,EAAmB,YAA0B,KAAA;AAC3E,EAAA,MAAM,GAAM,GAAA,IAAI,GAAI,CAAA,QAAA,CAAS,SAAS,IAAI,CAAA,CAAA;AAC1C,EAAA,MAAM,SAAY,GAAA,GAAA,CAAI,YAAa,CAAA,GAAA,CAAI,SAAS,CAAA,CAAA;AAChD,EAAA,IAAI,SAAW,EAAA;AACb,IAAO,OAAA,SAAA,CAAA;AAAA,GACT;AACA,EAAA,MAAM,aAAa,GAAI,CAAA,IAAA,CAAA;AACvB,EAAA,MAAM,KAAQ,GAAA,IAAI,MAAO,CAAA,CAAA,EAAG,SAAS,CAAc,YAAA,CAAA,CAAA,CAAA;AACnD,EAAM,MAAA,MAAA,GAAS,KAAM,CAAA,IAAA,CAAK,UAAU,CAAA,CAAA;AACpC,EAAA,IAAI,MAAQ,EAAA;AACV,IAAA,OAAO,OAAO,CAAC,CAAA,CAAA;AAAA,GACjB;AACA,EAAO,OAAA,YAAA,CAAA;AACT,EAAA;AAEa,MAAA,eAAA,GAAkB,CAAC,SAAA,KAC9B,IAAI,GAAA,CAAI,QAAS,CAAA,QAAA,CAAS,IAAI,CAAA,CAAE,YAAa,CAAA,GAAA,CAAI,SAAS;;;;"}
package/esm/useId.js ADDED
@@ -0,0 +1,7 @@
1
+ import { useMemo } from 'react';
2
+
3
+ let vuuComponentIdCount = 0;
4
+ const useId = (id) => useMemo(() => id ?? `vuu-${++vuuComponentIdCount}`, [id]);
5
+
6
+ export { useId };
7
+ //# sourceMappingURL=useId.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useId.js","sources":["../src/useId.ts"],"sourcesContent":["import { useMemo } from \"react\";\n\nlet vuuComponentIdCount = 0;\n\nexport const useId = (id?: string) =>\n useMemo(() => id ?? `vuu-${++vuuComponentIdCount}`, [id]);\n"],"names":[],"mappings":";;AAEA,IAAI,mBAAsB,GAAA,CAAA,CAAA;AAEnB,MAAM,KAAQ,GAAA,CAAC,EACpB,KAAA,OAAA,CAAQ,MAAM,EAAA,IAAM,CAAO,IAAA,EAAA,EAAE,mBAAmB,CAAA,CAAA,EAAI,CAAC,EAAE,CAAC;;;;"}
@@ -0,0 +1,15 @@
1
+ import { useRef, useLayoutEffect } from 'react';
2
+
3
+ const useLayoutEffectSkipFirst = (func, deps) => {
4
+ const goodToGo = useRef(false);
5
+ useLayoutEffect(() => {
6
+ if (goodToGo.current) {
7
+ func();
8
+ } else {
9
+ goodToGo.current = true;
10
+ }
11
+ }, deps);
12
+ };
13
+
14
+ export { useLayoutEffectSkipFirst };
15
+ //# sourceMappingURL=useLayoutEffectSkipFirst.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLayoutEffectSkipFirst.js","sources":["../src/useLayoutEffectSkipFirst.ts"],"sourcesContent":["import { DependencyList, EffectCallback, useLayoutEffect, useRef } from \"react\";\n\nexport const useLayoutEffectSkipFirst = (\n func: EffectCallback,\n deps: DependencyList\n) => {\n const goodToGo = useRef(false);\n useLayoutEffect(() => {\n if (goodToGo.current) {\n func();\n } else {\n goodToGo.current = true;\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, deps);\n};\n"],"names":[],"mappings":";;AAEa,MAAA,wBAAA,GAA2B,CACtC,IAAA,EACA,IACG,KAAA;AACH,EAAM,MAAA,QAAA,GAAW,OAAO,KAAK,CAAA,CAAA;AAC7B,EAAA,eAAA,CAAgB,MAAM;AACpB,IAAA,IAAI,SAAS,OAAS,EAAA;AACpB,MAAK,IAAA,EAAA,CAAA;AAAA,KACA,MAAA;AACL,MAAA,QAAA,CAAS,OAAU,GAAA,IAAA,CAAA;AAAA,KACrB;AAAA,KAEC,IAAI,CAAA,CAAA;AACT;;;;"}
package/package.json CHANGED
@@ -1,25 +1,28 @@
1
1
  {
2
- "name": "@vuu-ui/vuu-utils",
3
- "version": "0.8.32",
2
+ "version": "0.8.34",
4
3
  "author": "heswell",
5
4
  "license": "Apache-2.0",
5
+ "types": "types/index.d.ts",
6
6
  "devDependencies": {
7
- "@vuu-ui/vuu-data-types": "0.8.32",
8
- "@vuu-ui/vuu-table-types": "0.8.32",
9
- "@vuu-ui/vuu-filter-types": "0.8.32",
10
- "@vuu-ui/vuu-protocol-types": "0.8.32"
7
+ "@vuu-ui/vuu-data-types": "0.8.34",
8
+ "@vuu-ui/vuu-table-types": "0.8.34",
9
+ "@vuu-ui/vuu-filter-types": "0.8.34",
10
+ "@vuu-ui/vuu-protocol-types": "0.8.34"
11
11
  },
12
12
  "peerDependencies": {
13
+ "@internationalized/date": "^3.0.0",
14
+ "clsx": "^2.0.0",
13
15
  "react": ">=17.0.2",
14
16
  "react-dom": ">=17.0.2"
15
17
  },
16
18
  "sideEffects": false,
17
19
  "files": [
18
- "cjs",
19
20
  "esm",
21
+ "cjs",
22
+ "README.md",
20
23
  "/types"
21
24
  ],
22
- "module": "esm/index.js",
23
25
  "main": "cjs/index.js",
24
- "types": "types/index.d.ts"
26
+ "module": "esm/index.js",
27
+ "name": "@vuu-ui/vuu-utils"
25
28
  }
@@ -1,5 +1,4 @@
1
- import type { DataSourceFilter, DataSourceRow, SchemaColumn, TableSchema } from "@vuu-ui/vuu-data-types";
2
- import type { Filter } from "@vuu-ui/vuu-filter-types";
1
+ import type { DataSourceRow, SchemaColumn, TableSchema } from "@vuu-ui/vuu-data-types";
3
2
  import type { VuuAggregation, VuuAggType, VuuColumnDataType, VuuDataRow, VuuGroupBy, VuuRowRecord, VuuSort } from "@vuu-ui/vuu-protocol-types";
4
3
  import type { ColumnAlignment, ColumnDescriptor, ColumnType, ColumnTypeDescriptor, ColumnTypeFormatting, ColumnTypeRendering, ColumnTypeSimple, ColumnTypeWithValidationRules, DefaultColumnConfiguration, GroupColumnDescriptor, LookupRenderer, MappedValueTypeRenderer, PinLocation, RuntimeColumnDescriptor, TableHeadings, ValueListRenderer, DateTimeColumnDescriptor, TableCellRendererProps } from "@vuu-ui/vuu-table-types";
5
4
  import type { CSSProperties } from "react";
@@ -68,51 +67,10 @@ export declare const measurePinnedColumns: (columns: RuntimeColumnDescriptor[],
68
67
  export declare const getTableHeadings: (columns: RuntimeColumnDescriptor[]) => TableHeadings;
69
68
  export declare const getColumnStyle: ({ pin, pinnedOffset, width, }: RuntimeColumnDescriptor) => CSSProperties;
70
69
  export declare const setAggregations: (aggregations: VuuAggregation[], column: RuntimeColumnDescriptor, aggType: VuuAggType) => VuuAggregation[];
71
- export declare const extractFilterForColumn: (filter: Filter | undefined, columnName: string) => Filter | undefined;
72
70
  export declare const applyGroupByToColumns: (columns: RuntimeColumnDescriptor[], groupBy: VuuGroupBy, confirmed?: boolean) => RuntimeColumnDescriptor[];
73
71
  export declare const applySortToColumns: (columns: RuntimeColumnDescriptor[], sort: VuuSort) => RuntimeColumnDescriptor[];
74
72
  export declare const removeSort: (columns: RuntimeColumnDescriptor[]) => RuntimeColumnDescriptor[];
75
73
  export declare const existingSort: (columns: RuntimeColumnDescriptor[]) => boolean;
76
- export declare const applyFilterToColumns: (columns: RuntimeColumnDescriptor[], { filterStruct }: DataSourceFilter) => RuntimeColumnDescriptor[];
77
- export declare const isFilteredColumn: (column: RuntimeColumnDescriptor) => boolean;
78
- export declare const stripFilterFromColumns: (columns: RuntimeColumnDescriptor[]) => {
79
- align?: "left" | "right" | undefined;
80
- CellRenderer?: import("react").FunctionComponent<TableCellRendererProps> | undefined;
81
- HeaderCellLabelRenderer?: import("react").FunctionComponent<import("@vuu-ui/vuu-table-types").HeaderCellProps> | undefined;
82
- HeaderCellContentRenderer?: import("react").FunctionComponent<import("@vuu-ui/vuu-table-types").HeaderCellProps> | undefined;
83
- canStretch?: boolean | undefined;
84
- className?: string | undefined;
85
- clientSideEditValidationCheck?: any;
86
- endPin?: true | undefined;
87
- flex?: number | undefined;
88
- heading?: string[] | undefined;
89
- index?: number | undefined;
90
- isGroup?: boolean | undefined;
91
- isSystemColumn?: boolean | undefined;
92
- label: string;
93
- locked?: boolean | undefined;
94
- marginLeft?: number | undefined;
95
- moving?: boolean | undefined;
96
- originalIdx?: number | undefined;
97
- pinnedOffset?: number | undefined;
98
- resizeable?: boolean | undefined;
99
- resizing?: boolean | undefined;
100
- sortable?: boolean | undefined;
101
- sorted?: import("@vuu-ui/vuu-table-types").ColumnSort | undefined;
102
- valueFormatter: import("@vuu-ui/vuu-table-types").ValueFormatter;
103
- width: number;
104
- aggregate?: VuuAggType | undefined;
105
- colHeaderContentRenderer?: string | undefined;
106
- colHeaderLabelRenderer?: string | undefined;
107
- editable?: boolean | undefined;
108
- hidden?: boolean | undefined;
109
- maxWidth?: number | undefined;
110
- minWidth?: number | undefined;
111
- name: string;
112
- pin?: PinLocation | undefined;
113
- serverDataType?: VuuColumnDataType | undefined;
114
- type?: ColumnType | undefined;
115
- }[];
116
74
  export declare const getColumnName: (name: string) => string;
117
75
  export declare const getColumnLabel: (column: ColumnDescriptor) => string;
118
76
  export declare const findColumn: (columns: RuntimeColumnDescriptor[], columnName: string) => RuntimeColumnDescriptor | undefined;
@@ -1,5 +1,7 @@
1
1
  import { ColumnDescriptorsByName, Filter, SingleValueFilterClause } from "@vuu-ui/vuu-filter-types";
2
+ import { RuntimeColumnDescriptor } from "packages/vuu-table-types";
2
3
  export declare const filterAsQuery: (f: Filter, opts?: {
3
4
  columnsByName?: ColumnDescriptorsByName;
4
5
  }) => string;
5
6
  export declare function dateFilterAsQuery(f: SingleValueFilterClause<number>): string;
7
+ export declare const removeColumnFromFilter: (column: RuntimeColumnDescriptor, filter: Filter) => [Filter | undefined, string];
@@ -1,2 +1,2 @@
1
1
  export * from "./utils";
2
- export { filterAsQuery } from "./filterAsQuery";
2
+ export * from "./filterAsQuery";