@vuu-ui/vuu-utils 0.8.56 → 0.8.58
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.
- package/cjs/column-utils.js +14 -11
- package/cjs/column-utils.js.map +1 -1
- package/cjs/component-registry.js +43 -17
- package/cjs/component-registry.js.map +1 -1
- package/cjs/date/{utils.js → date-utils.js} +1 -1
- package/cjs/date/date-utils.js.map +1 -0
- package/cjs/date/types.js +4 -0
- package/cjs/date/types.js.map +1 -1
- package/cjs/form-utils.js +16 -0
- package/cjs/form-utils.js.map +1 -0
- package/cjs/html-utils.js +16 -0
- package/cjs/html-utils.js.map +1 -1
- package/cjs/index.js +30 -20
- package/cjs/index.js.map +1 -1
- package/cjs/list-utils.js +11 -0
- package/cjs/list-utils.js.map +1 -0
- package/esm/column-utils.js +15 -9
- package/esm/column-utils.js.map +1 -1
- package/esm/component-registry.js +40 -18
- package/esm/component-registry.js.map +1 -1
- package/esm/date/{utils.js → date-utils.js} +1 -1
- package/esm/date/date-utils.js.map +1 -0
- package/esm/date/types.js +2 -1
- package/esm/date/types.js.map +1 -1
- package/esm/form-utils.js +14 -0
- package/esm/form-utils.js.map +1 -0
- package/esm/html-utils.js +15 -1
- package/esm/html-utils.js.map +1 -1
- package/esm/index.js +7 -5
- package/esm/index.js.map +1 -1
- package/esm/list-utils.js +9 -0
- package/esm/list-utils.js.map +1 -0
- package/package.json +6 -6
- package/types/array-utils.d.ts +1 -1
- package/types/column-utils.d.ts +6 -4
- package/types/component-registry.d.ts +9 -2
- package/types/date/index.d.ts +2 -2
- package/types/date/types.d.ts +6 -0
- package/types/form-utils.d.ts +6 -0
- package/types/html-utils.d.ts +3 -0
- package/types/index.d.ts +3 -0
- package/types/list-utils.d.ts +2 -0
- package/types/user-types.d.ts +4 -0
- package/cjs/date/utils.js.map +0 -1
- package/esm/date/utils.js.map +0 -1
- /package/types/date/{utils.d.ts → date-utils.d.ts} +0 -0
package/cjs/html-utils.js
CHANGED
|
@@ -69,6 +69,11 @@ const isSelectableElement = (el) => {
|
|
|
69
69
|
return true;
|
|
70
70
|
}
|
|
71
71
|
};
|
|
72
|
+
const hasOpenOptionList = (el) => {
|
|
73
|
+
if (el !== null) {
|
|
74
|
+
return el.ariaExpanded === "true";
|
|
75
|
+
}
|
|
76
|
+
};
|
|
72
77
|
let size;
|
|
73
78
|
function getScrollbarSize() {
|
|
74
79
|
if (size === void 0) {
|
|
@@ -101,6 +106,15 @@ const dispatchMouseEvent = (el, type) => {
|
|
|
101
106
|
});
|
|
102
107
|
el.dispatchEvent(evt);
|
|
103
108
|
};
|
|
109
|
+
const dispatchKeyboardEvent = (el, type, key) => {
|
|
110
|
+
const evt = new KeyboardEvent(type, {
|
|
111
|
+
key,
|
|
112
|
+
view: window,
|
|
113
|
+
bubbles: true,
|
|
114
|
+
cancelable: true
|
|
115
|
+
});
|
|
116
|
+
el.dispatchEvent(evt);
|
|
117
|
+
};
|
|
104
118
|
const dispatchCustomEvent = (el, type) => {
|
|
105
119
|
const evt = new Event(type, {
|
|
106
120
|
bubbles: true,
|
|
@@ -111,6 +125,7 @@ const dispatchCustomEvent = (el, type) => {
|
|
|
111
125
|
|
|
112
126
|
exports.createEl = createEl;
|
|
113
127
|
exports.dispatchCustomEvent = dispatchCustomEvent;
|
|
128
|
+
exports.dispatchKeyboardEvent = dispatchKeyboardEvent;
|
|
114
129
|
exports.dispatchMouseEvent = dispatchMouseEvent;
|
|
115
130
|
exports.focusFirstFocusableElement = focusFirstFocusableElement;
|
|
116
131
|
exports.getClosest = getClosest;
|
|
@@ -119,6 +134,7 @@ exports.getElementByDataIndex = getElementByDataIndex;
|
|
|
119
134
|
exports.getElementDataIndex = getElementDataIndex;
|
|
120
135
|
exports.getFocusableElement = getFocusableElement;
|
|
121
136
|
exports.getScrollbarSize = getScrollbarSize;
|
|
137
|
+
exports.hasOpenOptionList = hasOpenOptionList;
|
|
122
138
|
exports.isSelectableElement = isSelectableElement;
|
|
123
139
|
exports.queryClosest = queryClosest;
|
|
124
140
|
//# sourceMappingURL=html-utils.js.map
|
package/cjs/html-utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html-utils.js","sources":["../src/html-utils.ts"],"sourcesContent":["export const createEl = (\n elementType: \"div\" | \"p\" | \"span\",\n className?: string,\n textContent?: string\n): HTMLElement => {\n const el = document.createElement(elementType);\n if (className) {\n el.className = className;\n }\n if (textContent) {\n el.textContent = textContent;\n }\n return el;\n};\n\nexport const getFocusableElement = (\n el: HTMLElement | null,\n tabIndex?: number\n) => {\n if (el) {\n if (el.hasAttribute(\"tabindex\")) {\n const rootTabIndex = parseInt(el.getAttribute(\"tabindex\") as string);\n if (\n !isNaN(rootTabIndex) &&\n (tabIndex === undefined || rootTabIndex === tabIndex)\n ) {\n return el;\n }\n }\n const focusableEl =\n typeof tabIndex === \"number\"\n ? (el.querySelector(`[tabindex=\"${tabIndex}\"]`) as HTMLElement)\n : (el.querySelector(\"[tabindex]\") as HTMLElement);\n if (focusableEl) {\n return focusableEl as HTMLElement;\n }\n }\n};\n\nexport const getElementDataIndex = (el: HTMLElement | null) => {\n if (el) {\n const index = parseInt(el.dataset.index || \"\");\n if (!isNaN(index)) {\n return index;\n }\n }\n return -1;\n};\n\nexport const queryClosest = <T extends HTMLElement = HTMLElement>(\n el: HTMLElement | EventTarget | null,\n cssQueryString: string\n) => (el === null ? null : ((el as HTMLElement).closest(cssQueryString) as T));\n\nexport const getClosest = (el: HTMLElement, dataProperty: string) =>\n queryClosest(el, `[data-${dataProperty}]`);\n\nexport const getClosestIndexItem = (el: HTMLElement) => getClosest(el, \"index\");\n\nexport function getElementByDataIndex(\n c: HTMLElement | null,\n i: number | string,\n throwIfNotFound: true\n): HTMLElement;\nexport function getElementByDataIndex(\n c: HTMLElement | null,\n i: number | string,\n throwIfNotFound?: false\n): HTMLElement | undefined;\nexport function getElementByDataIndex(\n container: HTMLElement | null,\n index: number | string,\n throwIfNotFound = false\n) {\n if (container === null && throwIfNotFound) {\n throw Error(\"html-utils getElementByDataIndex, container is null\");\n }\n const element = container?.querySelector(\n `[data-index=\"${index}\"]`\n ) as HTMLElement;\n if (element) {\n return element;\n } else if (throwIfNotFound) {\n throw Error(\n \"html-utils getElementByDataIndex, Item not found with data-index='${index}'\"\n );\n } else {\n return undefined;\n }\n}\n\nexport const focusFirstFocusableElement = (\n el: HTMLElement | null,\n tabIndex?: number\n) => {\n // TODO test el for focusable\n requestAnimationFrame(() => {\n const focusableElement = getFocusableElement(el, tabIndex);\n if (focusableElement) {\n focusableElement.focus();\n }\n });\n};\n\nexport const isSelectableElement = (el?: HTMLElement | null) => {\n const item = el?.closest(\"[data-index]\") as HTMLElement;\n if (\n !item ||\n item.ariaDisabled ||\n item.dataset.selectable === \"false\" ||\n item.querySelector('[data-selectable=\"false\"],[aria-disabled=\"true\"]')\n ) {\n return false;\n } else {\n return true;\n }\n};\n\nlet size: number;\n\nexport function getScrollbarSize() {\n if (size === undefined) {\n let outer: HTMLElement | null = document.createElement(\"div\");\n outer.className = \"scrollable-content\";\n outer.style.width = \"50px\";\n outer.style.height = \"50px\";\n outer.style.overflowY = \"scroll\";\n outer.style.position = \"absolute\";\n outer.style.top = \"-200px\";\n outer.style.left = \"-200px\";\n const inner = document.createElement(\"div\");\n inner.style.height = \"100px\";\n inner.style.width = \"100%\";\n outer.appendChild(inner);\n document.body.appendChild(outer);\n const outerWidth = outer.offsetWidth;\n const innerWidth = inner.offsetWidth;\n document.body.removeChild(outer);\n size = outerWidth - innerWidth;\n outer = null;\n }\n\n return size;\n}\n\nexport type MouseEventTypes = \"dblclick\" | \"click\";\n\nexport const dispatchMouseEvent = (el: HTMLElement, type: MouseEventTypes) => {\n const evt = new MouseEvent(type, {\n view: window,\n bubbles: true,\n cancelable: true,\n });\n el.dispatchEvent(evt);\n};\n\nexport type VuuDomEventType = \"vuu-commit\" | \"vuu-dropped\";\n\nexport const dispatchCustomEvent = (el: HTMLElement, type: VuuDomEventType) => {\n const evt = new Event(type, {\n bubbles: true,\n cancelable: true,\n });\n el.dispatchEvent(evt);\n};\n"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"html-utils.js","sources":["../src/html-utils.ts"],"sourcesContent":["export const createEl = (\n elementType: \"div\" | \"p\" | \"span\",\n className?: string,\n textContent?: string\n): HTMLElement => {\n const el = document.createElement(elementType);\n if (className) {\n el.className = className;\n }\n if (textContent) {\n el.textContent = textContent;\n }\n return el;\n};\n\nexport const getFocusableElement = (\n el: HTMLElement | null,\n tabIndex?: number\n) => {\n if (el) {\n if (el.hasAttribute(\"tabindex\")) {\n const rootTabIndex = parseInt(el.getAttribute(\"tabindex\") as string);\n if (\n !isNaN(rootTabIndex) &&\n (tabIndex === undefined || rootTabIndex === tabIndex)\n ) {\n return el;\n }\n }\n const focusableEl =\n typeof tabIndex === \"number\"\n ? (el.querySelector(`[tabindex=\"${tabIndex}\"]`) as HTMLElement)\n : (el.querySelector(\"[tabindex]\") as HTMLElement);\n if (focusableEl) {\n return focusableEl as HTMLElement;\n }\n }\n};\n\nexport const getElementDataIndex = (el: HTMLElement | null) => {\n if (el) {\n const index = parseInt(el.dataset.index || \"\");\n if (!isNaN(index)) {\n return index;\n }\n }\n return -1;\n};\n\nexport const queryClosest = <T extends HTMLElement = HTMLElement>(\n el: HTMLElement | EventTarget | null,\n cssQueryString: string\n) => (el === null ? null : ((el as HTMLElement).closest(cssQueryString) as T));\n\nexport const getClosest = (el: HTMLElement, dataProperty: string) =>\n queryClosest(el, `[data-${dataProperty}]`);\n\nexport const getClosestIndexItem = (el: HTMLElement) => getClosest(el, \"index\");\n\nexport function getElementByDataIndex(\n c: HTMLElement | null,\n i: number | string,\n throwIfNotFound: true\n): HTMLElement;\nexport function getElementByDataIndex(\n c: HTMLElement | null,\n i: number | string,\n throwIfNotFound?: false\n): HTMLElement | undefined;\nexport function getElementByDataIndex(\n container: HTMLElement | null,\n index: number | string,\n throwIfNotFound = false\n) {\n if (container === null && throwIfNotFound) {\n throw Error(\"html-utils getElementByDataIndex, container is null\");\n }\n const element = container?.querySelector(\n `[data-index=\"${index}\"]`\n ) as HTMLElement;\n if (element) {\n return element;\n } else if (throwIfNotFound) {\n throw Error(\n \"html-utils getElementByDataIndex, Item not found with data-index='${index}'\"\n );\n } else {\n return undefined;\n }\n}\n\nexport const focusFirstFocusableElement = (\n el: HTMLElement | null,\n tabIndex?: number\n) => {\n // TODO test el for focusable\n requestAnimationFrame(() => {\n const focusableElement = getFocusableElement(el, tabIndex);\n if (focusableElement) {\n focusableElement.focus();\n }\n });\n};\n\nexport const isSelectableElement = (el?: HTMLElement | null) => {\n const item = el?.closest(\"[data-index]\") as HTMLElement;\n if (\n !item ||\n item.ariaDisabled ||\n item.dataset.selectable === \"false\" ||\n item.querySelector('[data-selectable=\"false\"],[aria-disabled=\"true\"]')\n ) {\n return false;\n } else {\n return true;\n }\n};\n\nexport const hasOpenOptionList = (el: HTMLElement | EventTarget | null) => {\n if (el !== null) {\n return (el as HTMLElement).ariaExpanded === \"true\";\n }\n};\n\nlet size: number;\n\nexport function getScrollbarSize() {\n if (size === undefined) {\n let outer: HTMLElement | null = document.createElement(\"div\");\n outer.className = \"scrollable-content\";\n outer.style.width = \"50px\";\n outer.style.height = \"50px\";\n outer.style.overflowY = \"scroll\";\n outer.style.position = \"absolute\";\n outer.style.top = \"-200px\";\n outer.style.left = \"-200px\";\n const inner = document.createElement(\"div\");\n inner.style.height = \"100px\";\n inner.style.width = \"100%\";\n outer.appendChild(inner);\n document.body.appendChild(outer);\n const outerWidth = outer.offsetWidth;\n const innerWidth = inner.offsetWidth;\n document.body.removeChild(outer);\n size = outerWidth - innerWidth;\n outer = null;\n }\n\n return size;\n}\n\nexport type MouseEventTypes = \"dblclick\" | \"click\";\nexport type KeyboardEventTypes = \"keydown\" | \"keypress\" | \"keyup\";\n\nexport const dispatchMouseEvent = (el: HTMLElement, type: MouseEventTypes) => {\n const evt = new MouseEvent(type, {\n view: window,\n bubbles: true,\n cancelable: true,\n });\n el.dispatchEvent(evt);\n};\nexport const dispatchKeyboardEvent = (\n el: HTMLElement,\n type: KeyboardEventTypes,\n key: string\n) => {\n const evt = new KeyboardEvent(type, {\n key,\n view: window,\n bubbles: true,\n cancelable: true,\n });\n el.dispatchEvent(evt);\n};\n\nexport type VuuDomEventType = \"vuu-commit\" | \"vuu-dropped\";\n\nexport const dispatchCustomEvent = (el: HTMLElement, type: VuuDomEventType) => {\n const evt = new Event(type, {\n bubbles: true,\n cancelable: true,\n });\n el.dispatchEvent(evt);\n};\n"],"names":[],"mappings":"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"}
|
package/cjs/index.js
CHANGED
|
@@ -13,13 +13,14 @@ var datasourceActionUtils = require('./datasource-action-utils.js');
|
|
|
13
13
|
var datasourceUtils = require('./datasource-utils.js');
|
|
14
14
|
var formatter = require('./date/formatter.js');
|
|
15
15
|
var types = require('./date/types.js');
|
|
16
|
-
var
|
|
16
|
+
var dateUtils = require('./date/date-utils.js');
|
|
17
17
|
var dateTimePattern = require('./date/dateTimePattern.js');
|
|
18
18
|
var debugUtils = require('./debug-utils.js');
|
|
19
|
-
var utils
|
|
19
|
+
var utils = require('./filters/utils.js');
|
|
20
20
|
var filterAsQuery = require('./filters/filterAsQuery.js');
|
|
21
21
|
var htmlUtils = require('./html-utils.js');
|
|
22
22
|
var eventEmitter = require('./event-emitter.js');
|
|
23
|
+
var formUtils = require('./form-utils.js');
|
|
23
24
|
var formattingUtils = require('./formatting-utils.js');
|
|
24
25
|
var getUniqueId = require('./getUniqueId.js');
|
|
25
26
|
var groupUtils = require('./group-utils.js');
|
|
@@ -29,6 +30,7 @@ var itemToString = require('./itemToString.js');
|
|
|
29
30
|
var jsonUtils = require('./json-utils.js');
|
|
30
31
|
var keyboardUtils = require('./keyboard-utils.js');
|
|
31
32
|
var keyset = require('./keyset.js');
|
|
33
|
+
var listUtils = require('./list-utils.js');
|
|
32
34
|
var localStorageUtils = require('./local-storage-utils.js');
|
|
33
35
|
var loggingUtils = require('./logging-utils.js');
|
|
34
36
|
var menuUtils = require('./menu-utils.js');
|
|
@@ -74,9 +76,6 @@ exports.findColumn = columnUtils.findColumn;
|
|
|
74
76
|
exports.flattenColumnGroup = columnUtils.flattenColumnGroup;
|
|
75
77
|
exports.fromServerDataType = columnUtils.fromServerDataType;
|
|
76
78
|
exports.getCalculatedColumnDetails = columnUtils.getCalculatedColumnDetails;
|
|
77
|
-
exports.getCalculatedColumnExpression = columnUtils.getCalculatedColumnExpression;
|
|
78
|
-
exports.getCalculatedColumnName = columnUtils.getCalculatedColumnName;
|
|
79
|
-
exports.getCalculatedColumnType = columnUtils.getCalculatedColumnType;
|
|
80
79
|
exports.getColumnByName = columnUtils.getColumnByName;
|
|
81
80
|
exports.getColumnLabel = columnUtils.getColumnLabel;
|
|
82
81
|
exports.getColumnName = columnUtils.getColumnName;
|
|
@@ -138,8 +137,12 @@ exports.getColumnHeaderContentRenderer = componentRegistry.getColumnHeaderConten
|
|
|
138
137
|
exports.getColumnHeaderLabelRenderer = componentRegistry.getColumnHeaderLabelRenderer;
|
|
139
138
|
exports.getConfigurationEditor = componentRegistry.getConfigurationEditor;
|
|
140
139
|
exports.getEditRuleValidator = componentRegistry.getEditRuleValidator;
|
|
140
|
+
exports.getLayoutComponent = componentRegistry.getLayoutComponent;
|
|
141
141
|
exports.getRegisteredCellRenderers = componentRegistry.getRegisteredCellRenderers;
|
|
142
142
|
exports.getRowClassNameGenerator = componentRegistry.getRowClassNameGenerator;
|
|
143
|
+
exports.isContainer = componentRegistry.isContainer;
|
|
144
|
+
exports.isLayoutComponent = componentRegistry.isLayoutComponent;
|
|
145
|
+
exports.isView = componentRegistry.isView;
|
|
143
146
|
exports.registerComponent = componentRegistry.registerComponent;
|
|
144
147
|
exports.registerConfigurationEditor = componentRegistry.registerConfigurationEditor;
|
|
145
148
|
exports.DataWindow = DataWindow.DataWindow;
|
|
@@ -178,32 +181,36 @@ exports.vanillaConfig = datasourceUtils.vanillaConfig;
|
|
|
178
181
|
exports.withConfigDefaults = datasourceUtils.withConfigDefaults;
|
|
179
182
|
exports.formatDate = formatter.formatDate;
|
|
180
183
|
exports.getDateFormatter = formatter.getDateFormatter;
|
|
184
|
+
exports.dateTimeLabelByType = types.dateTimeLabelByType;
|
|
185
|
+
exports.isDatePattern = types.isDatePattern;
|
|
181
186
|
exports.isDateTimePattern = types.isDateTimePattern;
|
|
187
|
+
exports.isTimePattern = types.isTimePattern;
|
|
182
188
|
exports.supportedDateTimePatterns = types.supportedDateTimePatterns;
|
|
183
|
-
exports.toCalendarDate =
|
|
189
|
+
exports.toCalendarDate = dateUtils.toCalendarDate;
|
|
184
190
|
exports.dateTimePattern = dateTimePattern.dateTimePattern;
|
|
185
191
|
exports.defaultPatternsByType = dateTimePattern.defaultPatternsByType;
|
|
186
192
|
exports.fallbackDateTimePattern = dateTimePattern.fallbackDateTimePattern;
|
|
187
193
|
exports.RangeMonitor = debugUtils.RangeMonitor;
|
|
188
|
-
exports.applyFilterToColumns = utils
|
|
189
|
-
exports.extractFilterForColumn = utils
|
|
190
|
-
exports.isAndFilter = utils
|
|
191
|
-
exports.isCompleteFilter = utils
|
|
192
|
-
exports.isFilterClause = utils
|
|
193
|
-
exports.isFilteredColumn = utils
|
|
194
|
-
exports.isInFilter = utils
|
|
195
|
-
exports.isMultiClauseFilter = utils
|
|
196
|
-
exports.isMultiValueFilter = utils
|
|
197
|
-
exports.isNamedFilter = utils
|
|
198
|
-
exports.isOrFilter = utils
|
|
199
|
-
exports.isSingleValueFilter = utils
|
|
200
|
-
exports.isValidFilterClauseOp = utils
|
|
201
|
-
exports.stripFilterFromColumns = utils
|
|
194
|
+
exports.applyFilterToColumns = utils.applyFilterToColumns;
|
|
195
|
+
exports.extractFilterForColumn = utils.extractFilterForColumn;
|
|
196
|
+
exports.isAndFilter = utils.isAndFilter;
|
|
197
|
+
exports.isCompleteFilter = utils.isCompleteFilter;
|
|
198
|
+
exports.isFilterClause = utils.isFilterClause;
|
|
199
|
+
exports.isFilteredColumn = utils.isFilteredColumn;
|
|
200
|
+
exports.isInFilter = utils.isInFilter;
|
|
201
|
+
exports.isMultiClauseFilter = utils.isMultiClauseFilter;
|
|
202
|
+
exports.isMultiValueFilter = utils.isMultiValueFilter;
|
|
203
|
+
exports.isNamedFilter = utils.isNamedFilter;
|
|
204
|
+
exports.isOrFilter = utils.isOrFilter;
|
|
205
|
+
exports.isSingleValueFilter = utils.isSingleValueFilter;
|
|
206
|
+
exports.isValidFilterClauseOp = utils.isValidFilterClauseOp;
|
|
207
|
+
exports.stripFilterFromColumns = utils.stripFilterFromColumns;
|
|
202
208
|
exports.dateFilterAsQuery = filterAsQuery.dateFilterAsQuery;
|
|
203
209
|
exports.filterAsQuery = filterAsQuery.filterAsQuery;
|
|
204
210
|
exports.removeColumnFromFilter = filterAsQuery.removeColumnFromFilter;
|
|
205
211
|
exports.createEl = htmlUtils.createEl;
|
|
206
212
|
exports.dispatchCustomEvent = htmlUtils.dispatchCustomEvent;
|
|
213
|
+
exports.dispatchKeyboardEvent = htmlUtils.dispatchKeyboardEvent;
|
|
207
214
|
exports.dispatchMouseEvent = htmlUtils.dispatchMouseEvent;
|
|
208
215
|
exports.focusFirstFocusableElement = htmlUtils.focusFirstFocusableElement;
|
|
209
216
|
exports.getClosest = htmlUtils.getClosest;
|
|
@@ -212,9 +219,11 @@ exports.getElementByDataIndex = htmlUtils.getElementByDataIndex;
|
|
|
212
219
|
exports.getElementDataIndex = htmlUtils.getElementDataIndex;
|
|
213
220
|
exports.getFocusableElement = htmlUtils.getFocusableElement;
|
|
214
221
|
exports.getScrollbarSize = htmlUtils.getScrollbarSize;
|
|
222
|
+
exports.hasOpenOptionList = htmlUtils.hasOpenOptionList;
|
|
215
223
|
exports.isSelectableElement = htmlUtils.isSelectableElement;
|
|
216
224
|
exports.queryClosest = htmlUtils.queryClosest;
|
|
217
225
|
exports.EventEmitter = eventEmitter.EventEmitter;
|
|
226
|
+
exports.getFieldName = formUtils.getFieldName;
|
|
218
227
|
exports.defaultValueFormatter = formattingUtils.defaultValueFormatter;
|
|
219
228
|
exports.getValueFormatter = formattingUtils.getValueFormatter;
|
|
220
229
|
exports.numericFormatter = formattingUtils.numericFormatter;
|
|
@@ -238,6 +247,7 @@ exports.PageUp = keyboardUtils.PageUp;
|
|
|
238
247
|
exports.Space = keyboardUtils.Space;
|
|
239
248
|
exports.Tab = keyboardUtils.Tab;
|
|
240
249
|
exports.KeySet = keyset.KeySet;
|
|
250
|
+
exports.getSelectedOption = listUtils.getSelectedOption;
|
|
241
251
|
exports.getAllLocalEntity = localStorageUtils.getAllLocalEntity;
|
|
242
252
|
exports.getLocalEntity = localStorageUtils.getLocalEntity;
|
|
243
253
|
exports.saveLocalEntity = localStorageUtils.saveLocalEntity;
|
package/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const getSelectedOption = (values, selectedValue) => {
|
|
4
|
+
if (selectedValue === void 0) {
|
|
5
|
+
return void 0;
|
|
6
|
+
}
|
|
7
|
+
return values.find((option) => option.value === selectedValue);
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
exports.getSelectedOption = getSelectedOption;
|
|
11
|
+
//# sourceMappingURL=list-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-utils.js","sources":["../src/list-utils.ts"],"sourcesContent":["import type { ListOption } from \"@vuu-ui/vuu-table-types\";\n\nexport const getSelectedOption = (\n values: ListOption[],\n selectedValue: string | number | undefined\n) => {\n if (selectedValue === undefined) {\n return undefined;\n }\n return values.find((option) => option.value === selectedValue);\n};\n"],"names":[],"mappings":";;AAEa,MAAA,iBAAA,GAAoB,CAC/B,MAAA,EACA,aACG,KAAA;AACH,EAAA,IAAI,kBAAkB,KAAW,CAAA,EAAA;AAC/B,IAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GACT;AACA,EAAA,OAAO,OAAO,IAAK,CAAA,CAAC,MAAW,KAAA,MAAA,CAAO,UAAU,aAAa,CAAA,CAAA;AAC/D;;;;"}
|
package/esm/column-utils.js
CHANGED
|
@@ -358,7 +358,8 @@ const getColumnLabel = (column) => {
|
|
|
358
358
|
if (column.label) {
|
|
359
359
|
return column.label;
|
|
360
360
|
} else if (isCalculatedColumn(column.name)) {
|
|
361
|
-
|
|
361
|
+
const { name } = getCalculatedColumnDetails(column);
|
|
362
|
+
return name ?? column.name;
|
|
362
363
|
} else {
|
|
363
364
|
return column.name;
|
|
364
365
|
}
|
|
@@ -539,16 +540,21 @@ const CalculatedColumnPattern = /.*:.*:.*/;
|
|
|
539
540
|
const isCalculatedColumn = (columnName) => columnName !== void 0 && CalculatedColumnPattern.test(columnName);
|
|
540
541
|
const getCalculatedColumnDetails = (column) => {
|
|
541
542
|
if (isCalculatedColumn(column.name)) {
|
|
542
|
-
|
|
543
|
+
const [name, serverDataType, expression] = column.name.split(/:=?/);
|
|
544
|
+
if (serverDataType && !isVuuColumnDataType(serverDataType)) {
|
|
545
|
+
throw Error(
|
|
546
|
+
`column-utils, getCalculatedColumnDetails ${serverDataType} is not valid type for column ${column.name}`
|
|
547
|
+
);
|
|
548
|
+
}
|
|
549
|
+
return {
|
|
550
|
+
name: name ?? "",
|
|
551
|
+
expression: expression ?? "",
|
|
552
|
+
serverDataType: isVuuColumnDataType(serverDataType) ? serverDataType : void 0
|
|
553
|
+
};
|
|
543
554
|
} else {
|
|
544
|
-
throw Error(
|
|
545
|
-
`column-utils, getCalculatedColumnDetails column name ${column.name} is not valid calculated column`
|
|
546
|
-
);
|
|
555
|
+
throw Error(`column.name is nor a calculated column`);
|
|
547
556
|
}
|
|
548
557
|
};
|
|
549
|
-
const getCalculatedColumnName = (column) => getCalculatedColumnDetails(column)[0];
|
|
550
|
-
const getCalculatedColumnType = (column) => getCalculatedColumnDetails(column)[1];
|
|
551
|
-
const getCalculatedColumnExpression = (column) => getCalculatedColumnDetails(column)[2];
|
|
552
558
|
const setCalculatedColumnName = (column, name) => {
|
|
553
559
|
const [, type, expression] = column.name.split(":");
|
|
554
560
|
return {
|
|
@@ -734,5 +740,5 @@ function applyWidthToColumns(columns, options) {
|
|
|
734
740
|
const dataAndColumnUnchanged = (p, p1) => p.column === p1.column && p.column.valueFormatter(p.row[p.columnMap[p.column.name]]) === p1.column.valueFormatter(p1.row[p1.columnMap[p1.column.name]]);
|
|
735
741
|
const dataColumnAndKeyUnchanged = (p, p1) => p.column === p1.column && p.row[KEY] === p1.row[KEY] && p.column.valueFormatter(p.row[p.columnMap[p.column.name]]) === p1.column.valueFormatter(p1.row[p1.columnMap[p1.column.name]]);
|
|
736
742
|
|
|
737
|
-
export { AggregationType, addColumnToSubscribedColumns, applyDefaultColumnConfig, applyGroupByToColumns, applySortToColumns, applyWidthToColumns, buildColumnMap, dataAndColumnUnchanged, dataColumnAndKeyUnchanged, existingSort, extractGroupColumn, findColumn, flattenColumnGroup, fromServerDataType, getCalculatedColumnDetails,
|
|
743
|
+
export { AggregationType, addColumnToSubscribedColumns, applyDefaultColumnConfig, applyGroupByToColumns, applySortToColumns, applyWidthToColumns, buildColumnMap, dataAndColumnUnchanged, dataColumnAndKeyUnchanged, existingSort, extractGroupColumn, findColumn, flattenColumnGroup, fromServerDataType, getCalculatedColumnDetails, getColumnByName, getColumnLabel, getColumnName, getColumnStyle, getColumnsInViewport, getDefaultAlignment, getDefaultColumnType, getGroupValueAndOffset, getRowRecord, getTableHeadings, getTypeFormattingFromColumn, hasHeadings, hasValidationRules, isCalculatedColumn, isColumnTypeRenderer, isDataLoading, isDateTimeColumn, isGroupColumn, isJsonAttribute, isJsonColumn, isJsonGroup, isLookupRenderer, isMappedValueTypeRenderer, isNotHidden, isNumericColumn, isPinned, isResizing, isTextColumn, isTypeDescriptor, isValidColumnAlignment, isValidPinLocation, isValueListRenderer, isVuuColumnDataType, mapSortCriteria, measurePinnedColumns, metadataKeys, moveColumnTo, projectUpdates, removeSort, replaceColumn, setAggregations, setCalculatedColumnExpression, setCalculatedColumnName, setCalculatedColumnType, sortPinnedColumns, subscribedOnly, toColumnDescriptor, toDataSourceColumns, updateColumn, updateColumnFormatting, updateColumnRenderProps, updateColumnType, visibleColumnAtIndex };
|
|
738
744
|
//# sourceMappingURL=column-utils.js.map
|
package/esm/column-utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"column-utils.js","sources":["../src/column-utils.ts"],"sourcesContent":["import type {\n DataSourceRow,\n SchemaColumn,\n TableSchema,\n} from \"@vuu-ui/vuu-data-types\";\nimport type {\n VuuAggregation,\n VuuAggType,\n VuuColumnDataType,\n VuuDataRow,\n VuuGroupBy,\n VuuRowRecord,\n VuuSort,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport type {\n ColumnAlignment,\n ColumnDescriptor,\n ColumnType,\n ColumnTypeDescriptor,\n ColumnTypeFormatting,\n ColumnTypeRendering,\n ColumnTypeSimple,\n ColumnTypeWithValidationRules,\n DefaultColumnConfiguration,\n GroupColumnDescriptor,\n LookupRenderer,\n MappedValueTypeRenderer,\n PinLocation,\n RuntimeColumnDescriptor,\n TableHeading,\n TableHeadings,\n ValueListRenderer,\n DateTimeColumnDescriptor,\n TableCellRendererProps,\n} from \"@vuu-ui/vuu-table-types\";\nimport type { CSSProperties } from \"react\";\nimport { moveItem } from \"./array-utils\";\n\n/**\n * ColumnMap provides a lookup of the index position of a data item within a row\n * by column name.\n */\nexport interface ColumnMap {\n [columnName: string]: number;\n}\n\nconst SORT_ASC = \"asc\";\nconst NO_HEADINGS: TableHeadings = [];\nconst DEFAULT_COL_WIDTH = 100;\nconst DEFAULT_MAX_WIDTH = 250;\nconst DEFAULT_MIN_WIDTH = 50;\n// const DEFAULT_FLEX = 0;\n\nexport type SortCriteriaItem = string | [string, \"asc\"]; // TODO where is 'desc'?\n\nexport const AggregationType: { [key: string]: VuuAggType } = {\n Average: 2,\n Count: 3,\n Distinct: 6,\n Sum: 1,\n High: 4,\n Low: 5,\n};\n\nexport function mapSortCriteria(\n sortCriteria: SortCriteriaItem[],\n columnMap: ColumnMap,\n metadataOffset = 0\n): [number, \"asc\"][] {\n return sortCriteria.map((s) => {\n if (typeof s === \"string\") {\n return [columnMap[s] + metadataOffset, \"asc\"];\n } else if (Array.isArray(s)) {\n const [columnName, sortDir] = s;\n return [columnMap[columnName] + metadataOffset, sortDir || SORT_ASC];\n } else {\n throw Error(\"columnUtils.mapSortCriteria invalid input\");\n }\n });\n}\n\nconst numericTypes = [\"int\", \"long\", \"double\"];\nexport const getDefaultAlignment = (\n serverDataType?: VuuColumnDataType\n): ColumnAlignment =>\n serverDataType === undefined\n ? \"left\"\n : numericTypes.includes(serverDataType)\n ? \"right\"\n : \"left\";\n\nexport const isValidColumnAlignment = (v: string): v is ColumnAlignment =>\n v === \"left\" || v === \"right\";\n\nexport const isValidPinLocation = (v: string): v is PinLocation =>\n isValidColumnAlignment(v) || v === \"floating\" || v === \"\";\n\nconst VUU_COLUMN_DATA_TYPES: (string | undefined | null)[] = [\n \"long\",\n \"double\",\n \"int\",\n \"string\",\n \"char\",\n \"boolean\",\n];\n\nexport const isVuuColumnDataType = (\n value: string | undefined | null\n): value is VuuColumnDataType => VUU_COLUMN_DATA_TYPES.includes(value);\n\nexport const fromServerDataType = (\n serverDataType: VuuColumnDataType\n): ColumnTypeSimple => {\n switch (serverDataType) {\n case \"double\":\n case \"int\":\n case \"long\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n default:\n return \"string\";\n }\n};\n\nexport const isNumericColumn = ({ serverDataType, type }: ColumnDescriptor) => {\n if (\n serverDataType === \"int\" ||\n serverDataType === \"long\" ||\n serverDataType === \"double\"\n ) {\n return true;\n }\n if (typeof type === \"string\") {\n return type === \"number\";\n }\n if (typeof type?.name === \"string\") {\n return type?.name === \"number\";\n }\n\n return false;\n};\n\nexport const isDateTimeColumn = (\n column: ColumnDescriptor\n): column is DateTimeColumnDescriptor =>\n (isTypeDescriptor(column.type) ? column.type.name : column.type) ===\n \"date/time\";\n\nexport const isPinned = (column: ColumnDescriptor) =>\n typeof column.pin === \"string\";\n\nexport const hasHeadings = (column: ColumnDescriptor) =>\n Array.isArray(column.heading) && column.heading.length > 0;\n\nexport const isResizing = (column: RuntimeColumnDescriptor) => column.resizing;\n\nexport const isTextColumn = ({ serverDataType }: ColumnDescriptor) =>\n serverDataType === undefined\n ? false\n : serverDataType === \"char\" || serverDataType === \"string\";\n\nexport const toColumnDescriptor = (name: string): ColumnDescriptor => ({\n name,\n});\n\n/**\n *\n */\nexport const isTypeDescriptor = (\n type?: ColumnType\n): type is ColumnTypeDescriptor =>\n typeof type !== \"undefined\" && typeof type !== \"string\";\n\nconst EMPTY_COLUMN_MAP = {} as const;\n\nexport const isColumnTypeRenderer = (\n renderer?: unknown\n): renderer is ColumnTypeRendering =>\n typeof (renderer as ColumnTypeRendering)?.name !== \"undefined\";\n\nexport const isLookupRenderer = (\n renderer?: unknown\n): renderer is LookupRenderer =>\n typeof (renderer as LookupRenderer)?.name !== \"undefined\" &&\n \"lookup\" in (renderer as LookupRenderer);\n\nexport const isValueListRenderer = (\n renderer?: unknown\n): renderer is ValueListRenderer =>\n typeof (renderer as ValueListRenderer)?.name !== \"undefined\" &&\n Array.isArray((renderer as ValueListRenderer).values);\n\nexport const hasValidationRules = (\n type?: ColumnType\n): type is ColumnTypeWithValidationRules =>\n isTypeDescriptor(type) &&\n isColumnTypeRenderer(type.renderer) &&\n Array.isArray(type.renderer.rules) &&\n type.renderer.rules.length > 0;\n\nexport const isMappedValueTypeRenderer = (\n renderer?: unknown\n): renderer is MappedValueTypeRenderer =>\n renderer !== undefined &&\n typeof (renderer as MappedValueTypeRenderer)?.map !== \"undefined\";\n\nexport function buildColumnMap(\n columns?: (RuntimeColumnDescriptor | SchemaColumn | string)[]\n): ColumnMap {\n const start = metadataKeys.count;\n if (columns) {\n return columns.reduce((map, column, i) => {\n if (typeof column === \"string\") {\n map[column] = start + i;\n } else {\n map[column.name] = start + i;\n }\n return map;\n }, {} as ColumnMap);\n } else {\n return EMPTY_COLUMN_MAP;\n }\n}\n\nexport function projectUpdates(updates: number[]): number[] {\n const results: number[] = [];\n const metadataOffset = metadataKeys.count - 2;\n for (let i = 0; i < updates.length; i += 3) {\n results[i] = updates[i] + metadataOffset;\n results[i + 1] = updates[i + 1];\n results[i + 2] = updates[i + 2];\n }\n return results;\n}\n\nconst KEY = 6;\n\nexport const metadataKeys = {\n IDX: 0,\n RENDER_IDX: 1,\n IS_LEAF: 2,\n IS_EXPANDED: 3,\n DEPTH: 4,\n COUNT: 5,\n KEY,\n SELECTED: 7,\n count: 8,\n // TODO following only used in datamodel\n PARENT_IDX: \"parent_idx\",\n IDX_POINTER: \"idx_pointer\",\n FILTER_COUNT: \"filter_count\",\n NEXT_FILTER_IDX: \"next_filter_idx\",\n} as const;\n\n// This method mutates the passed columns array\nconst insertColumn = (\n columns: RuntimeColumnDescriptor[],\n column: RuntimeColumnDescriptor\n) => {\n const { originalIdx } = column;\n if (typeof originalIdx === \"number\") {\n for (let i = 0; i < columns.length; i++) {\n const { originalIdx: colIdx = -1 } = columns[i];\n if (colIdx > originalIdx) {\n columns.splice(i, 0, column);\n return columns;\n }\n }\n }\n columns.push(column);\n return columns;\n};\n\nexport const flattenColumnGroup = (\n columns: RuntimeColumnDescriptor[]\n): RuntimeColumnDescriptor[] => {\n if (columns[0]?.isGroup) {\n const [groupColumn, ...nonGroupedColumns] = columns as [\n GroupColumnDescriptor,\n ...RuntimeColumnDescriptor[]\n ];\n groupColumn.columns.forEach((groupColumn) => {\n insertColumn(nonGroupedColumns, groupColumn);\n });\n return nonGroupedColumns;\n } else {\n return columns;\n }\n};\n\nexport function extractGroupColumn(\n columns: RuntimeColumnDescriptor[],\n groupBy?: VuuGroupBy,\n confirmed = true\n): [GroupColumnDescriptor | null, RuntimeColumnDescriptor[]] {\n if (groupBy && groupBy.length > 0) {\n const flattenedColumns = flattenColumnGroup(columns);\n // Note: groupedColumns will be in column order, not groupBy order\n const [groupedColumns, rest] = flattenedColumns.reduce(\n (result, column, i) => {\n const [g, r] = result;\n if (groupBy.includes(column.name)) {\n g.push({\n ...column,\n originalIdx: i,\n });\n } else {\n r.push(column);\n }\n\n return result;\n },\n [[], []] as [RuntimeColumnDescriptor[], RuntimeColumnDescriptor[]]\n );\n if (groupedColumns.length !== groupBy.length) {\n throw Error(\n `extractGroupColumn: no column definition found for all groupBy cols ${JSON.stringify(\n groupBy\n )} `\n );\n }\n const groupCount = groupBy.length;\n const groupCols: RuntimeColumnDescriptor[] = groupBy.map((name, idx) => {\n // Keep the cols in same order defined on groupBy\n const column = groupedColumns.find(\n (col) => col.name === name\n ) as RuntimeColumnDescriptor;\n return {\n ...column,\n groupLevel: groupCount - idx,\n };\n });\n\n const groupCol = {\n name: \"group-col\",\n heading: [\"group-col\"],\n isGroup: true,\n columns: groupCols,\n groupConfirmed: confirmed,\n width: groupCols.map((c) => c.width).reduce((a, b) => a + b) + 100,\n } as GroupColumnDescriptor;\n\n return [groupCol, rest];\n }\n return [null, flattenColumnGroup(columns)];\n}\n\nexport const isGroupColumn = (\n column: RuntimeColumnDescriptor\n): column is GroupColumnDescriptor => column.isGroup === true;\n\nexport const isJsonAttribute = (value: unknown) =>\n typeof value === \"string\" && value.endsWith(\"+\");\n\nexport const isJsonGroup = (\n column: RuntimeColumnDescriptor,\n row: VuuDataRow,\n columnMap: ColumnMap\n) =>\n (column.type as ColumnTypeDescriptor)?.name === \"json\" &&\n isJsonAttribute(row[columnMap[column.name]]);\n\nexport const isJsonColumn = (column: RuntimeColumnDescriptor) =>\n (column.type as ColumnTypeDescriptor)?.name === \"json\";\n\nexport const sortPinnedColumns = (\n columns: RuntimeColumnDescriptor[]\n): RuntimeColumnDescriptor[] => {\n const leftPinnedColumns: RuntimeColumnDescriptor[] = [];\n const rightPinnedColumns: RuntimeColumnDescriptor[] = [];\n const restColumns: RuntimeColumnDescriptor[] = [];\n // 4 is the selectionEndSize, need to consider how we make this available\n let pinnedWidthLeft = 4;\n for (const column of columns) {\n // prettier-ignore\n switch(column.pin){\n case \"left\": {\n leftPinnedColumns.push({\n ...column,\n endPin: undefined,\n pinnedOffset: pinnedWidthLeft\n });\n pinnedWidthLeft += column.width;\n }\n break;\n // store right pinned columns initially in reverse order\n case \"right\": rightPinnedColumns.unshift(column); break;\n default: restColumns.push(column)\n }\n }\n\n if (leftPinnedColumns.length) {\n leftPinnedColumns.push({\n ...(leftPinnedColumns.pop() as RuntimeColumnDescriptor),\n endPin: true,\n });\n }\n\n const allColumns = leftPinnedColumns.length\n ? leftPinnedColumns.concat(restColumns)\n : restColumns;\n\n if (rightPinnedColumns.length) {\n const measuredRightPinnedColumns: RuntimeColumnDescriptor[] = [];\n let pinnedWidthRight = 0;\n for (const column of rightPinnedColumns) {\n measuredRightPinnedColumns.unshift({\n ...column,\n pinnedOffset: pinnedWidthRight,\n });\n pinnedWidthRight += column.width;\n }\n measuredRightPinnedColumns[0].endPin = true;\n return allColumns.concat(measuredRightPinnedColumns);\n } else {\n return allColumns;\n }\n};\n\nexport const measurePinnedColumns = (\n columns: RuntimeColumnDescriptor[],\n selectionEndSize: number\n) => {\n let pinnedWidthLeft = 0;\n let pinnedWidthRight = 0;\n let unpinnedWidth = 0;\n for (const column of columns) {\n const { hidden, pin, width } = column;\n const visibleWidth = hidden ? 0 : width;\n if (pin === \"left\") {\n pinnedWidthLeft += visibleWidth;\n } else if (pin === \"right\") {\n pinnedWidthRight += visibleWidth;\n } else {\n unpinnedWidth += visibleWidth;\n }\n }\n return {\n pinnedWidthLeft: pinnedWidthLeft + selectionEndSize,\n pinnedWidthRight: pinnedWidthRight + selectionEndSize,\n unpinnedWidth,\n };\n};\n\nexport const getTableHeadings = (\n columns: RuntimeColumnDescriptor[]\n): TableHeadings => {\n if (columns.some(hasHeadings)) {\n const maxHeadingDepth = columns.reduce<number>(\n (max, { heading }) => Math.max(max, heading?.length ?? 0),\n 0\n );\n\n let heading: TableHeading | undefined = undefined;\n const tableHeadings: TableHeadings = [];\n let tableHeadingsRow: TableHeading[];\n for (let level = 0; level < maxHeadingDepth; level++) {\n tableHeadingsRow = [];\n columns.forEach(({ heading: columnHeading = NO_HEADINGS, width }) => {\n const label = columnHeading[level] ?? \"\";\n if (heading && heading.label === label) {\n heading.width += width;\n } else {\n heading = { label, width } as TableHeading;\n tableHeadingsRow.push(heading);\n }\n });\n tableHeadings.push(tableHeadingsRow);\n }\n\n return tableHeadings;\n }\n return NO_HEADINGS;\n};\n\nexport const getColumnStyle = ({\n pin,\n // the 4 is `selectionEndSize`, unfortunate if we need to be passed it from cell\n // need to think about how to make this available\n pinnedOffset = pin === \"left\" ? 0 : 4,\n width,\n}: RuntimeColumnDescriptor) =>\n pin === \"left\"\n ? ({\n left: pinnedOffset,\n width,\n \"--pin-width\": `${pinnedOffset + width - 3}px`,\n } as CSSProperties)\n : pin === \"right\"\n ? ({\n right: pinnedOffset,\n width,\n \"--pin-width\": `${pinnedOffset + width}px`,\n } as CSSProperties)\n : { width };\n\nexport const setAggregations = (\n aggregations: VuuAggregation[],\n column: RuntimeColumnDescriptor,\n aggType: VuuAggType\n) => {\n return aggregations\n .filter((agg) => agg.column !== column.name)\n .concat({ column: column.name, aggType });\n};\n\nexport const applyGroupByToColumns = (\n columns: RuntimeColumnDescriptor[],\n groupBy: VuuGroupBy,\n confirmed = true\n) => {\n if (groupBy.length) {\n const [groupColumn, nonGroupedColumns] = extractGroupColumn(\n columns,\n groupBy,\n confirmed\n );\n if (groupColumn) {\n return [groupColumn as RuntimeColumnDescriptor].concat(nonGroupedColumns);\n }\n } else if (columns[0]?.isGroup) {\n return flattenColumnGroup(columns);\n }\n return columns;\n};\n\nexport const applySortToColumns = (\n columns: RuntimeColumnDescriptor[],\n sort: VuuSort\n) =>\n columns.map((column) => {\n const sorted = getSortType(column, sort);\n if (sorted !== undefined) {\n return {\n ...column,\n sorted,\n };\n } else if (column.sorted) {\n return {\n ...column,\n sorted: undefined,\n };\n } else {\n return column;\n }\n });\n\nexport const removeSort = (columns: RuntimeColumnDescriptor[]) =>\n columns.map((col) => (col.sorted ? { ...col, sorted: undefined } : col));\n\nexport const existingSort = (columns: RuntimeColumnDescriptor[]) =>\n columns.some((col) => col.sorted);\n\nconst getSortType = (column: ColumnDescriptor, { sortDefs }: VuuSort) => {\n const sortDef = sortDefs.find((sortCol) => sortCol.column === column.name);\n if (sortDef) {\n return sortDefs.length > 1\n ? (sortDefs.indexOf(sortDef) + 1) * (sortDef.sortType === \"A\" ? 1 : -1)\n : sortDef.sortType;\n }\n};\n\n// Calculated columns have the formal 'name:datatype:expression'\nexport const getColumnName = (name: string) => {\n const pos = name.indexOf(\":\");\n if (pos === -1) {\n return name;\n } else {\n return name.slice(0, pos);\n }\n};\n\nexport const getColumnLabel = (column: ColumnDescriptor) => {\n if (column.label) {\n return column.label;\n } else if (isCalculatedColumn(column.name)) {\n return getCalculatedColumnName(column);\n } else {\n return column.name;\n }\n};\n\nexport const findColumn = (\n columns: RuntimeColumnDescriptor[],\n columnName: string\n): RuntimeColumnDescriptor | undefined => {\n const column = columns.find((col) => col.name === columnName);\n if (column) {\n return column;\n } else {\n const groupColumn = columns.find(\n (col) => col.isGroup\n ) as GroupColumnDescriptor;\n if (groupColumn) {\n return findColumn(groupColumn.columns, columnName);\n }\n }\n};\n\nexport function updateColumn<T extends ColumnDescriptor>(\n columns: T[],\n column: T\n): T[];\nexport function updateColumn(\n columns: RuntimeColumnDescriptor[],\n column: string,\n options: Partial<ColumnDescriptor>\n): RuntimeColumnDescriptor[];\nexport function updateColumn(\n columns: RuntimeColumnDescriptor[],\n column: string | RuntimeColumnDescriptor,\n options?: Partial<ColumnDescriptor>\n) {\n const targetColumn =\n typeof column === \"string\"\n ? columns.find((col) => col.name === column)\n : column;\n if (targetColumn) {\n const replacementColumn = options\n ? { ...targetColumn, ...options }\n : targetColumn;\n return columns.map((col) =>\n col.name === replacementColumn.name ? replacementColumn : col\n );\n } else {\n throw Error(\"column-utils.replaceColun, column not found\");\n }\n}\n\nexport const toDataSourceColumns = (column: ColumnDescriptor) => column.name;\n\nexport const getRowRecord = (\n row: DataSourceRow,\n columnMap: ColumnMap\n): VuuRowRecord => {\n return Object.entries(columnMap).reduce<VuuRowRecord>(\n (map, [colName, key]) => {\n map[colName] = row[key];\n return map;\n },\n {}\n );\n};\n\nexport const isDataLoading = (columns: RuntimeColumnDescriptor[]) => {\n return isGroupColumn(columns[0]) && columns[0].groupConfirmed === false;\n};\n\nexport const getColumnsInViewport = (\n columns: RuntimeColumnDescriptor[],\n vpStart: number,\n vpEnd: number\n): [RuntimeColumnDescriptor[], number] => {\n const visibleColumns: RuntimeColumnDescriptor[] = [];\n let preSpan = 0;\n let rightPinnedOnly = false;\n\n for (let columnOffset = 0, i = 0; i < columns.length; i++) {\n const column = columns[i];\n // TODO if we were to measure the pinned columns first,\n // might be able to save rendering some columns ?\n if (column.hidden) {\n continue;\n } else if (rightPinnedOnly) {\n if (column.pin === \"right\") {\n visibleColumns.push(column);\n }\n } else if (columnOffset + column.width < vpStart) {\n if (column.pin === \"left\") {\n visibleColumns.push(column);\n } else if (\n columnOffset + column.width + columns[i + 1]?.width >\n vpStart\n ) {\n visibleColumns.push(column);\n } else {\n preSpan += column.width;\n }\n } else if (columnOffset > vpEnd) {\n rightPinnedOnly = true;\n } else {\n visibleColumns.push(column);\n }\n columnOffset += column.width;\n }\n\n return [visibleColumns, preSpan];\n};\n\nexport const isNotHidden = (column: RuntimeColumnDescriptor) =>\n column.hidden !== true;\n\nexport const visibleColumnAtIndex = (\n columns: RuntimeColumnDescriptor[],\n index: number\n) => {\n if (columns.every(isNotHidden)) {\n return columns[index];\n } else {\n return columns.filter(isNotHidden).at(index);\n }\n};\n\nconst { DEPTH, IS_LEAF } = metadataKeys;\n// Get the value for a specific columns within a grouped column\nexport const getGroupValueAndOffset = (\n columns: RuntimeColumnDescriptor[],\n row: DataSourceRow,\n columnMap: ColumnMap\n): [unknown, number] => {\n const { [DEPTH]: depth, [IS_LEAF]: isLeaf } = row;\n // Depth can be greater tha group columns when we have just removed a column from groupby\n // but new data has not yet been received.\n if (isLeaf || depth > columns.length) {\n return [null, depth === null ? 0 : Math.max(0, depth - 1)];\n } else if (depth === 0) {\n return [\"$root\", 0];\n } else {\n // offset 1 for now to allow for $root\n const { name, valueFormatter } = columns[depth - 1];\n const value = valueFormatter(row[columnMap[name]]);\n return [value, depth - 1];\n }\n};\n\nexport const getDefaultColumnType = (\n serverDataType?: VuuColumnDataType\n): ColumnTypeSimple => {\n switch (serverDataType) {\n case \"int\":\n case \"long\":\n case \"double\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n default:\n return \"string\";\n }\n};\n\nexport const updateColumnFormatting = <\n T extends ColumnDescriptor = ColumnDescriptor\n>(\n column: T,\n formatting: ColumnTypeFormatting\n): T => {\n const { serverDataType, type = getDefaultColumnType(serverDataType) } =\n column;\n\n if (isTypeDescriptor(type)) {\n return { ...column, type: { ...type, formatting } };\n } else {\n return { ...column, type: { name: type, formatting } };\n }\n};\n\nexport function updateColumnType<T extends ColumnDescriptor = ColumnDescriptor>(\n column: T,\n type: ColumnTypeSimple\n): T {\n return isTypeDescriptor(column.type)\n ? { ...column, type: { ...column.type, name: type } }\n : { ...column, type };\n}\n\nexport const updateColumnRenderProps = <\n T extends ColumnDescriptor = ColumnDescriptor\n>(\n column: T,\n renderer: ColumnTypeRendering\n): T => {\n const { serverDataType, type = getDefaultColumnType(serverDataType) } =\n column;\n\n if (isTypeDescriptor(type)) {\n return {\n ...column,\n type: {\n ...type,\n // TODO do we need to preserve any existing attributes from renderer ?\n renderer,\n },\n };\n } else {\n return { ...column, type: { name: type, renderer } };\n }\n};\n\nconst NO_TYPE_SETTINGS = {};\nexport const getTypeFormattingFromColumn = (\n column: ColumnDescriptor\n): ColumnTypeFormatting => {\n if (isTypeDescriptor(column.type)) {\n return column.type.formatting ?? NO_TYPE_SETTINGS;\n } else {\n return NO_TYPE_SETTINGS;\n }\n};\n\n/**\n *\n * return a filter predicate that will reject columns, names of which\n * are not in provided list.\n */\nexport const subscribedOnly =\n (columnNames?: string[]) => (column: ColumnDescriptor) =>\n columnNames?.includes(column.name);\n\nexport const addColumnToSubscribedColumns = (\n subscribedColumns: ColumnDescriptor[],\n availableColumns: SchemaColumn[],\n columnName: string\n) => {\n const byColName =\n (n = columnName) =>\n (column: { name: string }) =>\n column.name === n;\n if (subscribedColumns.findIndex(byColName()) !== -1) {\n throw Error(\n `column-utils, addColumnToSubscribedColumns column ${columnName} is already subscribed`\n );\n }\n const indexOfAvailableColumn = availableColumns.findIndex(byColName());\n if (indexOfAvailableColumn === -1) {\n throw Error(\n `column-utils, addColumnToSubscribedColumns column ${columnName} is not available`\n );\n }\n\n const newColumn = {\n ...availableColumns[indexOfAvailableColumn],\n } as ColumnDescriptor;\n\n // find the nearest preceding available column which is subscribed\n let index = -1;\n for (let i = indexOfAvailableColumn - 1; i >= 0; i--) {\n const { name } = availableColumns[i];\n index = subscribedColumns.findIndex(byColName(name));\n if (index !== -1) {\n break;\n }\n }\n\n if (index === -1) {\n return [newColumn].concat(subscribedColumns);\n } else {\n const results: ColumnDescriptor[] = [];\n for (let i = 0; i < subscribedColumns.length; i++) {\n results.push(subscribedColumns[i]);\n if (i === index) {\n results.push(newColumn);\n index = Number.MAX_SAFE_INTEGER;\n }\n }\n return results;\n }\n};\n\nconst CalculatedColumnPattern = /.*:.*:.*/;\n\nexport const isCalculatedColumn = (columnName?: string) =>\n columnName !== undefined && CalculatedColumnPattern.test(columnName);\n\nexport const getCalculatedColumnDetails = (column: ColumnDescriptor) => {\n if (isCalculatedColumn(column.name)) {\n return column.name.split(/:=?/);\n } else {\n throw Error(\n `column-utils, getCalculatedColumnDetails column name ${column.name} is not valid calculated column`\n );\n }\n};\n\nexport const getCalculatedColumnName = (column: ColumnDescriptor) =>\n getCalculatedColumnDetails(column)[0];\nexport const getCalculatedColumnType = (column: ColumnDescriptor) =>\n getCalculatedColumnDetails(column)[1] as VuuColumnDataType;\nexport const getCalculatedColumnExpression = (column: ColumnDescriptor) =>\n getCalculatedColumnDetails(column)[2];\n\nexport const setCalculatedColumnName = (\n column: ColumnDescriptor,\n name: string\n): ColumnDescriptor => {\n const [, type, expression] = column.name.split(\":\");\n return {\n ...column,\n name: `${name}:${type}:${expression}`,\n };\n};\n\nexport const setCalculatedColumnType = (\n column: ColumnDescriptor,\n type: string\n): ColumnDescriptor => {\n const [name, , expression] = column.name.split(\":\");\n return {\n ...column,\n name: `${name}:${type}:${expression}`,\n };\n};\n\n// TODO should we validate the expression here ?\nexport const setCalculatedColumnExpression = (\n column: ColumnDescriptor,\n expression: string\n): ColumnDescriptor => {\n const [name, type] = column.name.split(\":\");\n return {\n ...column,\n name: `${name}:${type}:=${expression}`,\n };\n};\n\nexport const moveColumnTo = (\n columns: ColumnDescriptor[],\n column: ColumnDescriptor,\n newIndex: number\n) => {\n const index = columns.findIndex((col) => col.name === column.name);\n return moveItem(columns, index, newIndex);\n};\n\nexport function replaceColumn<\n C extends ColumnDescriptor = RuntimeColumnDescriptor\n>(columns: C[], column: C) {\n return columns.map((col) => (col.name === column.name ? column : col));\n}\n\nexport const applyDefaultColumnConfig = (\n { columns, table }: TableSchema,\n getDefaultColumnConfig?: DefaultColumnConfiguration\n) => {\n if (typeof getDefaultColumnConfig === \"function\") {\n return columns.map((column) => {\n const config = getDefaultColumnConfig(table.table, column.name);\n if (config) {\n return {\n ...column,\n ...config,\n };\n } else {\n return column;\n }\n });\n } else {\n return columns;\n }\n};\n\nexport const getColumnByName = (\n schema: TableSchema,\n name?: string\n): SchemaColumn | undefined => {\n if (name === undefined) {\n return undefined;\n } else {\n const column = schema.columns.find((col) => col.name === name);\n if (column) {\n return column;\n } else {\n throw Error(\n `getColumnByName no column '${name}' in schema for ${schema.table.table}`\n );\n }\n }\n};\n\n//New added column functionality issue #639\n\nexport type ColumnLayout = \"Static\" | \"Fit\";\n\nexport type columnOptions = {\n availableWidth?: number;\n columnLayout?: ColumnLayout;\n defaultWidth?: number;\n defaultMinWidth?: number;\n defaultMaxWidth?: number;\n defaultFlex?: number;\n};\n\nexport function applyWidthToColumns(\n columns: RuntimeColumnDescriptor[],\n options:\n | {\n columnLayout: \"Static\";\n defaultMinWidth?: number;\n defaultMaxWidth?: number;\n defaultWidth?: number;\n }\n | {\n columnLayout: \"Fit\";\n availableWidth?: number;\n defaultMinWidth?: number;\n defaultMaxWidth?: number;\n defaultWidth?: number;\n }\n): RuntimeColumnDescriptor[];\n\nexport function applyWidthToColumns(\n columns: RuntimeColumnDescriptor[],\n options: columnOptions & { defaultMinWidth?: number }\n): RuntimeColumnDescriptor[] {\n const {\n availableWidth = 0,\n columnLayout = \"Static\",\n defaultWidth = DEFAULT_COL_WIDTH,\n defaultMinWidth = DEFAULT_MIN_WIDTH,\n defaultMaxWidth = DEFAULT_MAX_WIDTH,\n // defaultFlex = DEFAULT_FLEX,\n } = options;\n\n if (columnLayout === \"Static\") {\n return columns.map((column) => {\n if (typeof column.width === \"number\") {\n return column;\n } else {\n return {\n ...column,\n width: defaultWidth,\n };\n }\n });\n } else if (columnLayout === \"Fit\") {\n const { totalMinWidth, totalMaxWidth, totalWidth, flexCount } =\n columns.reduce(\n (aggregated, column) => {\n const { totalMinWidth, totalMaxWidth, totalWidth, flexCount } =\n aggregated;\n const {\n minWidth = defaultMinWidth,\n maxWidth = defaultMaxWidth,\n width = defaultWidth,\n flex = 0,\n } = column;\n return {\n totalMinWidth: totalMinWidth + minWidth,\n totalMaxWidth: totalMaxWidth + maxWidth,\n totalWidth: totalWidth + width,\n flexCount: flexCount + flex,\n };\n },\n { totalMinWidth: 0, totalMaxWidth: 0, totalWidth: 0, flexCount: 0 }\n );\n\n if (totalMinWidth > availableWidth || totalMaxWidth < availableWidth) {\n return columns;\n } else if (totalWidth > availableWidth) {\n const excessWidth = totalWidth - availableWidth;\n const inFlexMode = flexCount > 0;\n let excessWidthPerColumn = excessWidth / (flexCount || columns.length);\n let columnsNotYetAtMinWidth = columns.length;\n let unassignedExcess = 0;\n let newColumns = columns.map<RuntimeColumnDescriptor>((column) => {\n const {\n minWidth = defaultMinWidth,\n width = defaultWidth,\n flex = 0,\n } = column;\n if (inFlexMode && flex === 0) {\n return column;\n }\n const adjustedWidth = width - excessWidthPerColumn;\n if (adjustedWidth < minWidth) {\n columnsNotYetAtMinWidth -= 1;\n unassignedExcess += minWidth - adjustedWidth;\n return { ...column, width: minWidth };\n } else {\n return { ...column, width: adjustedWidth };\n }\n });\n if (unassignedExcess === 0) {\n return newColumns;\n } else {\n excessWidthPerColumn = unassignedExcess / columnsNotYetAtMinWidth;\n newColumns = newColumns.map((column) => {\n const adjustedWidth = column.width - excessWidthPerColumn;\n if (column.width !== column.minWidth) {\n return { ...column, width: adjustedWidth };\n } else {\n return column;\n }\n });\n return newColumns;\n }\n } else if (totalWidth < availableWidth) {\n {\n const additionalWidth = availableWidth - totalWidth;\n const inFlexMode = flexCount > 0;\n let additionalWidthPerColumn =\n additionalWidth / (flexCount || columns.length);\n // let columnsNotYetReachedMaxWidth = columns.length;\n // let unassignedAdditionalWidth = 0;\n let newColumns = columns.map((column) => {\n const {\n maxWidth = defaultMaxWidth,\n width = defaultWidth,\n flex = 0,\n } = column;\n if (inFlexMode && flex === 0) {\n return column;\n }\n const adjustedWidth = width + additionalWidthPerColumn;\n if (adjustedWidth > maxWidth) {\n // columnsNotYetReachedMaxWidth -= 1;\n // unassignedAdditionalWidth += adjustedWidth - maxWidth;\n return { ...column, width: maxWidth };\n } else {\n return { ...column, width: adjustedWidth, canStretch: true };\n }\n });\n const unassignedAdditionalColumnWidth =\n additionalWidth - newColumns.reduce((sum, col) => sum + col.width, 0);\n const columnsNotYetAtMaxWidth = newColumns.filter(\n (col) => col.canStretch\n ).length;\n if (unassignedAdditionalColumnWidth > columnsNotYetAtMaxWidth) {\n additionalWidthPerColumn =\n unassignedAdditionalColumnWidth / columnsNotYetAtMaxWidth;\n newColumns = newColumns.map<RuntimeColumnDescriptor>((column) => {\n if (column.canStretch) {\n const adjustedWidth = Math.min(\n column.width + additionalWidthPerColumn\n );\n return { ...column, width: adjustedWidth };\n } else {\n return column;\n }\n });\n }\n return newColumns.map(({ canStretch, ...column }) => column);\n }\n }\n }\n return columns;\n}\n\n/**\n * A memo compare function for cell renderers. Can be used to suppress\n * render where column and data are both unchanged. Avoids render\n * when row changes, where changes in row are unrelated to this cell.\n * Suitabnle only for readonly cell renderers. See below for editable\n * cell renderers.\n */\nexport const dataAndColumnUnchanged = (\n p: TableCellRendererProps,\n p1: TableCellRendererProps\n) =>\n p.column === p1.column &&\n p.column.valueFormatter(p.row[p.columnMap[p.column.name]]) ===\n p1.column.valueFormatter(p1.row[p1.columnMap[p1.column.name]]);\n\n/**\n * A memo compare function for cell renderers. Can be used to suppress\n * render where column, row key and data are all unchanged. Avoids render\n * when row changes, where changes in row are unrelated to this cell.\n * Suitable for editable cells. Including key in compare is not strictly\n * necessary for rendering, but it is important in the event that user\n * edits data - ensures we never have a stale key.\n */\nexport const dataColumnAndKeyUnchanged = (\n p: TableCellRendererProps,\n p1: TableCellRendererProps\n) =>\n p.column === p1.column &&\n p.row[KEY] === p1.row[KEY] &&\n p.column.valueFormatter(p.row[p.columnMap[p.column.name]]) ===\n p1.column.valueFormatter(p1.row[p1.columnMap[p1.column.name]]);\n"],"names":["groupColumn","heading","totalMinWidth","totalMaxWidth","totalWidth","flexCount"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"column-utils.js","sources":["../src/column-utils.ts"],"sourcesContent":["import type {\n DataSourceRow,\n SchemaColumn,\n TableSchema,\n} from \"@vuu-ui/vuu-data-types\";\nimport type {\n VuuAggregation,\n VuuAggType,\n VuuColumnDataType,\n VuuDataRow,\n VuuGroupBy,\n VuuRowRecord,\n VuuSort,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport type {\n ColumnAlignment,\n ColumnDescriptor,\n ColumnType,\n ColumnTypeDescriptor,\n ColumnTypeFormatting,\n ColumnTypeRendering,\n ColumnTypeSimple,\n ColumnTypeWithValidationRules,\n DefaultColumnConfiguration,\n GroupColumnDescriptor,\n LookupRenderer,\n MappedValueTypeRenderer,\n PinLocation,\n RuntimeColumnDescriptor,\n TableHeading,\n TableHeadings,\n ValueListRenderer,\n DateTimeColumnDescriptor,\n TableCellRendererProps,\n} from \"@vuu-ui/vuu-table-types\";\nimport type { CSSProperties } from \"react\";\nimport { moveItem } from \"./array-utils\";\n\n/**\n * ColumnMap provides a lookup of the index position of a data item within a row\n * by column name.\n */\nexport interface ColumnMap {\n [columnName: string]: number;\n}\n\nconst SORT_ASC = \"asc\";\nconst NO_HEADINGS: TableHeadings = [];\nconst DEFAULT_COL_WIDTH = 100;\nconst DEFAULT_MAX_WIDTH = 250;\nconst DEFAULT_MIN_WIDTH = 50;\n// const DEFAULT_FLEX = 0;\n\nexport type SortCriteriaItem = string | [string, \"asc\"]; // TODO where is 'desc'?\n\nexport const AggregationType: { [key: string]: VuuAggType } = {\n Average: 2,\n Count: 3,\n Distinct: 6,\n Sum: 1,\n High: 4,\n Low: 5,\n};\n\nexport function mapSortCriteria(\n sortCriteria: SortCriteriaItem[],\n columnMap: ColumnMap,\n metadataOffset = 0\n): [number, \"asc\"][] {\n return sortCriteria.map((s) => {\n if (typeof s === \"string\") {\n return [columnMap[s] + metadataOffset, \"asc\"];\n } else if (Array.isArray(s)) {\n const [columnName, sortDir] = s;\n return [columnMap[columnName] + metadataOffset, sortDir || SORT_ASC];\n } else {\n throw Error(\"columnUtils.mapSortCriteria invalid input\");\n }\n });\n}\n\nconst numericTypes = [\"int\", \"long\", \"double\"];\nexport const getDefaultAlignment = (\n serverDataType?: VuuColumnDataType\n): ColumnAlignment =>\n serverDataType === undefined\n ? \"left\"\n : numericTypes.includes(serverDataType)\n ? \"right\"\n : \"left\";\n\nexport const isValidColumnAlignment = (v: string): v is ColumnAlignment =>\n v === \"left\" || v === \"right\";\n\nexport const isValidPinLocation = (v: string): v is PinLocation =>\n isValidColumnAlignment(v) || v === \"floating\" || v === \"\";\n\nexport type CalculatedColumn = {\n name: string;\n expression: string;\n serverDataType: VuuColumnDataType;\n};\n\nconst VUU_COLUMN_DATA_TYPES: (string | undefined | null)[] = [\n \"long\",\n \"double\",\n \"int\",\n \"string\",\n \"char\",\n \"boolean\",\n];\n\nexport const isVuuColumnDataType = (\n value: string | undefined | null\n): value is VuuColumnDataType => VUU_COLUMN_DATA_TYPES.includes(value);\n\nexport const fromServerDataType = (\n serverDataType: VuuColumnDataType\n): ColumnTypeSimple => {\n switch (serverDataType) {\n case \"double\":\n case \"int\":\n case \"long\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n default:\n return \"string\";\n }\n};\n\nexport const isNumericColumn = ({ serverDataType, type }: ColumnDescriptor) => {\n if (\n serverDataType === \"int\" ||\n serverDataType === \"long\" ||\n serverDataType === \"double\"\n ) {\n return true;\n }\n if (typeof type === \"string\") {\n return type === \"number\";\n }\n if (typeof type?.name === \"string\") {\n return type?.name === \"number\";\n }\n\n return false;\n};\n\nexport const isDateTimeColumn = (\n column: ColumnDescriptor\n): column is DateTimeColumnDescriptor =>\n (isTypeDescriptor(column.type) ? column.type.name : column.type) ===\n \"date/time\";\n\nexport const isPinned = (column: ColumnDescriptor) =>\n typeof column.pin === \"string\";\n\nexport const hasHeadings = (column: ColumnDescriptor) =>\n Array.isArray(column.heading) && column.heading.length > 0;\n\nexport const isResizing = (column: RuntimeColumnDescriptor) => column.resizing;\n\nexport const isTextColumn = ({ serverDataType }: ColumnDescriptor) =>\n serverDataType === undefined\n ? false\n : serverDataType === \"char\" || serverDataType === \"string\";\n\nexport const toColumnDescriptor = (name: string): ColumnDescriptor => ({\n name,\n});\n\n/**\n *\n */\nexport const isTypeDescriptor = (\n type?: ColumnType\n): type is ColumnTypeDescriptor =>\n typeof type !== \"undefined\" && typeof type !== \"string\";\n\nconst EMPTY_COLUMN_MAP = {} as const;\n\nexport const isColumnTypeRenderer = (\n renderer?: unknown\n): renderer is ColumnTypeRendering =>\n typeof (renderer as ColumnTypeRendering)?.name !== \"undefined\";\n\nexport const isLookupRenderer = (\n renderer?: unknown\n): renderer is LookupRenderer =>\n typeof (renderer as LookupRenderer)?.name !== \"undefined\" &&\n \"lookup\" in (renderer as LookupRenderer);\n\nexport const isValueListRenderer = (\n renderer?: unknown\n): renderer is ValueListRenderer =>\n typeof (renderer as ValueListRenderer)?.name !== \"undefined\" &&\n Array.isArray((renderer as ValueListRenderer).values);\n\nexport const hasValidationRules = (\n type?: ColumnType\n): type is ColumnTypeWithValidationRules =>\n isTypeDescriptor(type) &&\n isColumnTypeRenderer(type.renderer) &&\n Array.isArray(type.renderer.rules) &&\n type.renderer.rules.length > 0;\n\nexport const isMappedValueTypeRenderer = (\n renderer?: unknown\n): renderer is MappedValueTypeRenderer =>\n renderer !== undefined &&\n typeof (renderer as MappedValueTypeRenderer)?.map !== \"undefined\";\n\nexport function buildColumnMap(\n columns?: (RuntimeColumnDescriptor | SchemaColumn | string)[]\n): ColumnMap {\n const start = metadataKeys.count;\n if (columns) {\n return columns.reduce((map, column, i) => {\n if (typeof column === \"string\") {\n map[column] = start + i;\n } else {\n map[column.name] = start + i;\n }\n return map;\n }, {} as ColumnMap);\n } else {\n return EMPTY_COLUMN_MAP;\n }\n}\n\nexport function projectUpdates(updates: number[]): number[] {\n const results: number[] = [];\n const metadataOffset = metadataKeys.count - 2;\n for (let i = 0; i < updates.length; i += 3) {\n results[i] = updates[i] + metadataOffset;\n results[i + 1] = updates[i + 1];\n results[i + 2] = updates[i + 2];\n }\n return results;\n}\n\nconst KEY = 6;\n\nexport const metadataKeys = {\n IDX: 0,\n RENDER_IDX: 1,\n IS_LEAF: 2,\n IS_EXPANDED: 3,\n DEPTH: 4,\n COUNT: 5,\n KEY,\n SELECTED: 7,\n count: 8,\n // TODO following only used in datamodel\n PARENT_IDX: \"parent_idx\",\n IDX_POINTER: \"idx_pointer\",\n FILTER_COUNT: \"filter_count\",\n NEXT_FILTER_IDX: \"next_filter_idx\",\n} as const;\n\n// This method mutates the passed columns array\nconst insertColumn = (\n columns: RuntimeColumnDescriptor[],\n column: RuntimeColumnDescriptor\n) => {\n const { originalIdx } = column;\n if (typeof originalIdx === \"number\") {\n for (let i = 0; i < columns.length; i++) {\n const { originalIdx: colIdx = -1 } = columns[i];\n if (colIdx > originalIdx) {\n columns.splice(i, 0, column);\n return columns;\n }\n }\n }\n columns.push(column);\n return columns;\n};\n\nexport const flattenColumnGroup = (\n columns: RuntimeColumnDescriptor[]\n): RuntimeColumnDescriptor[] => {\n if (columns[0]?.isGroup) {\n const [groupColumn, ...nonGroupedColumns] = columns as [\n GroupColumnDescriptor,\n ...RuntimeColumnDescriptor[]\n ];\n groupColumn.columns.forEach((groupColumn) => {\n insertColumn(nonGroupedColumns, groupColumn);\n });\n return nonGroupedColumns;\n } else {\n return columns;\n }\n};\n\nexport function extractGroupColumn(\n columns: RuntimeColumnDescriptor[],\n groupBy?: VuuGroupBy,\n confirmed = true\n): [GroupColumnDescriptor | null, RuntimeColumnDescriptor[]] {\n if (groupBy && groupBy.length > 0) {\n const flattenedColumns = flattenColumnGroup(columns);\n // Note: groupedColumns will be in column order, not groupBy order\n const [groupedColumns, rest] = flattenedColumns.reduce(\n (result, column, i) => {\n const [g, r] = result;\n if (groupBy.includes(column.name)) {\n g.push({\n ...column,\n originalIdx: i,\n });\n } else {\n r.push(column);\n }\n\n return result;\n },\n [[], []] as [RuntimeColumnDescriptor[], RuntimeColumnDescriptor[]]\n );\n if (groupedColumns.length !== groupBy.length) {\n throw Error(\n `extractGroupColumn: no column definition found for all groupBy cols ${JSON.stringify(\n groupBy\n )} `\n );\n }\n const groupCount = groupBy.length;\n const groupCols: RuntimeColumnDescriptor[] = groupBy.map((name, idx) => {\n // Keep the cols in same order defined on groupBy\n const column = groupedColumns.find(\n (col) => col.name === name\n ) as RuntimeColumnDescriptor;\n return {\n ...column,\n groupLevel: groupCount - idx,\n };\n });\n\n const groupCol = {\n name: \"group-col\",\n heading: [\"group-col\"],\n isGroup: true,\n columns: groupCols,\n groupConfirmed: confirmed,\n width: groupCols.map((c) => c.width).reduce((a, b) => a + b) + 100,\n } as GroupColumnDescriptor;\n\n return [groupCol, rest];\n }\n return [null, flattenColumnGroup(columns)];\n}\n\nexport const isGroupColumn = (\n column: RuntimeColumnDescriptor\n): column is GroupColumnDescriptor => column.isGroup === true;\n\nexport const isJsonAttribute = (value: unknown) =>\n typeof value === \"string\" && value.endsWith(\"+\");\n\nexport const isJsonGroup = (\n column: RuntimeColumnDescriptor,\n row: VuuDataRow,\n columnMap: ColumnMap\n) =>\n (column.type as ColumnTypeDescriptor)?.name === \"json\" &&\n isJsonAttribute(row[columnMap[column.name]]);\n\nexport const isJsonColumn = (column: RuntimeColumnDescriptor) =>\n (column.type as ColumnTypeDescriptor)?.name === \"json\";\n\nexport const sortPinnedColumns = (\n columns: RuntimeColumnDescriptor[]\n): RuntimeColumnDescriptor[] => {\n const leftPinnedColumns: RuntimeColumnDescriptor[] = [];\n const rightPinnedColumns: RuntimeColumnDescriptor[] = [];\n const restColumns: RuntimeColumnDescriptor[] = [];\n // 4 is the selectionEndSize, need to consider how we make this available\n let pinnedWidthLeft = 4;\n for (const column of columns) {\n // prettier-ignore\n switch(column.pin){\n case \"left\": {\n leftPinnedColumns.push({\n ...column,\n endPin: undefined,\n pinnedOffset: pinnedWidthLeft\n });\n pinnedWidthLeft += column.width;\n }\n break;\n // store right pinned columns initially in reverse order\n case \"right\": rightPinnedColumns.unshift(column); break;\n default: restColumns.push(column)\n }\n }\n\n if (leftPinnedColumns.length) {\n leftPinnedColumns.push({\n ...(leftPinnedColumns.pop() as RuntimeColumnDescriptor),\n endPin: true,\n });\n }\n\n const allColumns = leftPinnedColumns.length\n ? leftPinnedColumns.concat(restColumns)\n : restColumns;\n\n if (rightPinnedColumns.length) {\n const measuredRightPinnedColumns: RuntimeColumnDescriptor[] = [];\n let pinnedWidthRight = 0;\n for (const column of rightPinnedColumns) {\n measuredRightPinnedColumns.unshift({\n ...column,\n pinnedOffset: pinnedWidthRight,\n });\n pinnedWidthRight += column.width;\n }\n measuredRightPinnedColumns[0].endPin = true;\n return allColumns.concat(measuredRightPinnedColumns);\n } else {\n return allColumns;\n }\n};\n\nexport const measurePinnedColumns = (\n columns: RuntimeColumnDescriptor[],\n selectionEndSize: number\n) => {\n let pinnedWidthLeft = 0;\n let pinnedWidthRight = 0;\n let unpinnedWidth = 0;\n for (const column of columns) {\n const { hidden, pin, width } = column;\n const visibleWidth = hidden ? 0 : width;\n if (pin === \"left\") {\n pinnedWidthLeft += visibleWidth;\n } else if (pin === \"right\") {\n pinnedWidthRight += visibleWidth;\n } else {\n unpinnedWidth += visibleWidth;\n }\n }\n return {\n pinnedWidthLeft: pinnedWidthLeft + selectionEndSize,\n pinnedWidthRight: pinnedWidthRight + selectionEndSize,\n unpinnedWidth,\n };\n};\n\nexport const getTableHeadings = (\n columns: RuntimeColumnDescriptor[]\n): TableHeadings => {\n if (columns.some(hasHeadings)) {\n const maxHeadingDepth = columns.reduce<number>(\n (max, { heading }) => Math.max(max, heading?.length ?? 0),\n 0\n );\n\n let heading: TableHeading | undefined = undefined;\n const tableHeadings: TableHeadings = [];\n let tableHeadingsRow: TableHeading[];\n for (let level = 0; level < maxHeadingDepth; level++) {\n tableHeadingsRow = [];\n columns.forEach(({ heading: columnHeading = NO_HEADINGS, width }) => {\n const label = columnHeading[level] ?? \"\";\n if (heading && heading.label === label) {\n heading.width += width;\n } else {\n heading = { label, width } as TableHeading;\n tableHeadingsRow.push(heading);\n }\n });\n tableHeadings.push(tableHeadingsRow);\n }\n\n return tableHeadings;\n }\n return NO_HEADINGS;\n};\n\nexport const getColumnStyle = ({\n pin,\n // the 4 is `selectionEndSize`, unfortunate if we need to be passed it from cell\n // need to think about how to make this available\n pinnedOffset = pin === \"left\" ? 0 : 4,\n width,\n}: RuntimeColumnDescriptor) =>\n pin === \"left\"\n ? ({\n left: pinnedOffset,\n width,\n \"--pin-width\": `${pinnedOffset + width - 3}px`,\n } as CSSProperties)\n : pin === \"right\"\n ? ({\n right: pinnedOffset,\n width,\n \"--pin-width\": `${pinnedOffset + width}px`,\n } as CSSProperties)\n : { width };\n\nexport const setAggregations = (\n aggregations: VuuAggregation[],\n column: RuntimeColumnDescriptor,\n aggType: VuuAggType\n) => {\n return aggregations\n .filter((agg) => agg.column !== column.name)\n .concat({ column: column.name, aggType });\n};\n\nexport const applyGroupByToColumns = (\n columns: RuntimeColumnDescriptor[],\n groupBy: VuuGroupBy,\n confirmed = true\n) => {\n if (groupBy.length) {\n const [groupColumn, nonGroupedColumns] = extractGroupColumn(\n columns,\n groupBy,\n confirmed\n );\n if (groupColumn) {\n return [groupColumn as RuntimeColumnDescriptor].concat(nonGroupedColumns);\n }\n } else if (columns[0]?.isGroup) {\n return flattenColumnGroup(columns);\n }\n return columns;\n};\n\nexport const applySortToColumns = (\n columns: RuntimeColumnDescriptor[],\n sort: VuuSort\n) =>\n columns.map((column) => {\n const sorted = getSortType(column, sort);\n if (sorted !== undefined) {\n return {\n ...column,\n sorted,\n };\n } else if (column.sorted) {\n return {\n ...column,\n sorted: undefined,\n };\n } else {\n return column;\n }\n });\n\nexport const removeSort = (columns: RuntimeColumnDescriptor[]) =>\n columns.map((col) => (col.sorted ? { ...col, sorted: undefined } : col));\n\nexport const existingSort = (columns: RuntimeColumnDescriptor[]) =>\n columns.some((col) => col.sorted);\n\nconst getSortType = (column: ColumnDescriptor, { sortDefs }: VuuSort) => {\n const sortDef = sortDefs.find((sortCol) => sortCol.column === column.name);\n if (sortDef) {\n return sortDefs.length > 1\n ? (sortDefs.indexOf(sortDef) + 1) * (sortDef.sortType === \"A\" ? 1 : -1)\n : sortDef.sortType;\n }\n};\n\n// Calculated columns have the formal 'name:datatype:expression'\nexport const getColumnName = (name: string) => {\n const pos = name.indexOf(\":\");\n if (pos === -1) {\n return name;\n } else {\n return name.slice(0, pos);\n }\n};\n\nexport const getColumnLabel = (column: ColumnDescriptor) => {\n if (column.label) {\n return column.label;\n } else if (isCalculatedColumn(column.name)) {\n const { name } = getCalculatedColumnDetails(column);\n // calculated column name follows pattern: `name:serverDataType:expression`\n return name ?? column.name;\n } else {\n return column.name;\n }\n};\n\nexport const findColumn = (\n columns: RuntimeColumnDescriptor[],\n columnName: string\n): RuntimeColumnDescriptor | undefined => {\n const column = columns.find((col) => col.name === columnName);\n if (column) {\n return column;\n } else {\n const groupColumn = columns.find(\n (col) => col.isGroup\n ) as GroupColumnDescriptor;\n if (groupColumn) {\n return findColumn(groupColumn.columns, columnName);\n }\n }\n};\n\nexport function updateColumn<T extends ColumnDescriptor>(\n columns: T[],\n column: T\n): T[];\nexport function updateColumn(\n columns: RuntimeColumnDescriptor[],\n column: string,\n options: Partial<ColumnDescriptor>\n): RuntimeColumnDescriptor[];\nexport function updateColumn(\n columns: RuntimeColumnDescriptor[],\n column: string | RuntimeColumnDescriptor,\n options?: Partial<ColumnDescriptor>\n) {\n const targetColumn =\n typeof column === \"string\"\n ? columns.find((col) => col.name === column)\n : column;\n if (targetColumn) {\n const replacementColumn = options\n ? { ...targetColumn, ...options }\n : targetColumn;\n return columns.map((col) =>\n col.name === replacementColumn.name ? replacementColumn : col\n );\n } else {\n throw Error(\"column-utils.replaceColun, column not found\");\n }\n}\n\nexport const toDataSourceColumns = (column: ColumnDescriptor) => column.name;\n\nexport const getRowRecord = (\n row: DataSourceRow,\n columnMap: ColumnMap\n): VuuRowRecord => {\n return Object.entries(columnMap).reduce<VuuRowRecord>(\n (map, [colName, key]) => {\n map[colName] = row[key];\n return map;\n },\n {}\n );\n};\n\nexport const isDataLoading = (columns: RuntimeColumnDescriptor[]) => {\n return isGroupColumn(columns[0]) && columns[0].groupConfirmed === false;\n};\n\nexport const getColumnsInViewport = (\n columns: RuntimeColumnDescriptor[],\n vpStart: number,\n vpEnd: number\n): [RuntimeColumnDescriptor[], number] => {\n const visibleColumns: RuntimeColumnDescriptor[] = [];\n let preSpan = 0;\n let rightPinnedOnly = false;\n\n for (let columnOffset = 0, i = 0; i < columns.length; i++) {\n const column = columns[i];\n // TODO if we were to measure the pinned columns first,\n // might be able to save rendering some columns ?\n if (column.hidden) {\n continue;\n } else if (rightPinnedOnly) {\n if (column.pin === \"right\") {\n visibleColumns.push(column);\n }\n } else if (columnOffset + column.width < vpStart) {\n if (column.pin === \"left\") {\n visibleColumns.push(column);\n } else if (\n columnOffset + column.width + columns[i + 1]?.width >\n vpStart\n ) {\n visibleColumns.push(column);\n } else {\n preSpan += column.width;\n }\n } else if (columnOffset > vpEnd) {\n rightPinnedOnly = true;\n } else {\n visibleColumns.push(column);\n }\n columnOffset += column.width;\n }\n\n return [visibleColumns, preSpan];\n};\n\nexport const isNotHidden = (column: RuntimeColumnDescriptor) =>\n column.hidden !== true;\n\nexport const visibleColumnAtIndex = (\n columns: RuntimeColumnDescriptor[],\n index: number\n) => {\n if (columns.every(isNotHidden)) {\n return columns[index];\n } else {\n return columns.filter(isNotHidden).at(index);\n }\n};\n\nconst { DEPTH, IS_LEAF } = metadataKeys;\n// Get the value for a specific columns within a grouped column\nexport const getGroupValueAndOffset = (\n columns: RuntimeColumnDescriptor[],\n row: DataSourceRow,\n columnMap: ColumnMap\n): [unknown, number] => {\n const { [DEPTH]: depth, [IS_LEAF]: isLeaf } = row;\n // Depth can be greater tha group columns when we have just removed a column from groupby\n // but new data has not yet been received.\n if (isLeaf || depth > columns.length) {\n return [null, depth === null ? 0 : Math.max(0, depth - 1)];\n } else if (depth === 0) {\n return [\"$root\", 0];\n } else {\n // offset 1 for now to allow for $root\n const { name, valueFormatter } = columns[depth - 1];\n const value = valueFormatter(row[columnMap[name]]);\n return [value, depth - 1];\n }\n};\n\nexport const getDefaultColumnType = (\n serverDataType?: VuuColumnDataType\n): ColumnTypeSimple => {\n switch (serverDataType) {\n case \"int\":\n case \"long\":\n case \"double\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n default:\n return \"string\";\n }\n};\n\nexport const updateColumnFormatting = <\n T extends ColumnDescriptor = ColumnDescriptor\n>(\n column: T,\n formatting: ColumnTypeFormatting\n): T => {\n const { serverDataType, type = getDefaultColumnType(serverDataType) } =\n column;\n\n if (isTypeDescriptor(type)) {\n return { ...column, type: { ...type, formatting } };\n } else {\n return { ...column, type: { name: type, formatting } };\n }\n};\n\nexport function updateColumnType<T extends ColumnDescriptor = ColumnDescriptor>(\n column: T,\n type: ColumnTypeSimple\n): T {\n return isTypeDescriptor(column.type)\n ? { ...column, type: { ...column.type, name: type } }\n : { ...column, type };\n}\n\nexport const updateColumnRenderProps = <\n T extends ColumnDescriptor = ColumnDescriptor\n>(\n column: T,\n renderer: ColumnTypeRendering\n): T => {\n const { serverDataType, type = getDefaultColumnType(serverDataType) } =\n column;\n\n if (isTypeDescriptor(type)) {\n return {\n ...column,\n type: {\n ...type,\n // TODO do we need to preserve any existing attributes from renderer ?\n renderer,\n },\n };\n } else {\n return { ...column, type: { name: type, renderer } };\n }\n};\n\nconst NO_TYPE_SETTINGS = {};\nexport const getTypeFormattingFromColumn = (\n column: ColumnDescriptor\n): ColumnTypeFormatting => {\n if (isTypeDescriptor(column.type)) {\n return column.type.formatting ?? NO_TYPE_SETTINGS;\n } else {\n return NO_TYPE_SETTINGS;\n }\n};\n\n/**\n *\n * return a filter predicate that will reject columns, names of which\n * are not in provided list.\n */\nexport const subscribedOnly =\n (columnNames?: string[]) => (column: ColumnDescriptor) =>\n columnNames?.includes(column.name);\n\nexport const addColumnToSubscribedColumns = (\n subscribedColumns: ColumnDescriptor[],\n availableColumns: SchemaColumn[],\n columnName: string\n) => {\n const byColName =\n (n = columnName) =>\n (column: { name: string }) =>\n column.name === n;\n if (subscribedColumns.findIndex(byColName()) !== -1) {\n throw Error(\n `column-utils, addColumnToSubscribedColumns column ${columnName} is already subscribed`\n );\n }\n const indexOfAvailableColumn = availableColumns.findIndex(byColName());\n if (indexOfAvailableColumn === -1) {\n throw Error(\n `column-utils, addColumnToSubscribedColumns column ${columnName} is not available`\n );\n }\n\n const newColumn = {\n ...availableColumns[indexOfAvailableColumn],\n } as ColumnDescriptor;\n\n // find the nearest preceding available column which is subscribed\n let index = -1;\n for (let i = indexOfAvailableColumn - 1; i >= 0; i--) {\n const { name } = availableColumns[i];\n index = subscribedColumns.findIndex(byColName(name));\n if (index !== -1) {\n break;\n }\n }\n\n if (index === -1) {\n return [newColumn].concat(subscribedColumns);\n } else {\n const results: ColumnDescriptor[] = [];\n for (let i = 0; i < subscribedColumns.length; i++) {\n results.push(subscribedColumns[i]);\n if (i === index) {\n results.push(newColumn);\n index = Number.MAX_SAFE_INTEGER;\n }\n }\n return results;\n }\n};\n\nconst CalculatedColumnPattern = /.*:.*:.*/;\n\nexport const isCalculatedColumn = (columnName?: string) =>\n columnName !== undefined && CalculatedColumnPattern.test(columnName);\n\nexport const getCalculatedColumnDetails = (\n column: ColumnDescriptor\n): Partial<CalculatedColumn> => {\n if (isCalculatedColumn(column.name)) {\n const [name, serverDataType, expression] = column.name.split(/:=?/);\n if (serverDataType && !isVuuColumnDataType(serverDataType)) {\n throw Error(\n `column-utils, getCalculatedColumnDetails ${serverDataType} is not valid type for column ${column.name}`\n );\n }\n return {\n name: name ?? \"\",\n expression: expression ?? \"\",\n serverDataType: isVuuColumnDataType(serverDataType)\n ? serverDataType\n : undefined,\n };\n } else {\n throw Error(`column.name is nor a calculated column`);\n }\n};\n\nexport const setCalculatedColumnName = (\n column: ColumnDescriptor,\n name: string\n): ColumnDescriptor => {\n const [, type, expression] = column.name.split(\":\");\n return {\n ...column,\n name: `${name}:${type}:${expression}`,\n };\n};\n\nexport const setCalculatedColumnType = (\n column: ColumnDescriptor,\n type: string\n): ColumnDescriptor => {\n const [name, , expression] = column.name.split(\":\");\n return {\n ...column,\n name: `${name}:${type}:${expression}`,\n };\n};\n\n// TODO should we validate the expression here ?\nexport const setCalculatedColumnExpression = (\n column: ColumnDescriptor,\n expression: string\n): ColumnDescriptor => {\n const [name, type] = column.name.split(\":\");\n return {\n ...column,\n name: `${name}:${type}:=${expression}`,\n };\n};\n\nexport const moveColumnTo = (\n columns: ColumnDescriptor[],\n column: ColumnDescriptor,\n newIndex: number\n) => {\n const index = columns.findIndex((col) => col.name === column.name);\n return moveItem(columns, index, newIndex);\n};\n\nexport function replaceColumn<\n C extends ColumnDescriptor = RuntimeColumnDescriptor\n>(columns: C[], column: C) {\n return columns.map((col) => (col.name === column.name ? column : col));\n}\n\nexport const applyDefaultColumnConfig = (\n { columns, table }: TableSchema,\n getDefaultColumnConfig?: DefaultColumnConfiguration\n) => {\n if (typeof getDefaultColumnConfig === \"function\") {\n return columns.map((column) => {\n const config = getDefaultColumnConfig(table.table, column.name);\n if (config) {\n return {\n ...column,\n ...config,\n };\n } else {\n return column;\n }\n });\n } else {\n return columns;\n }\n};\n\nexport const getColumnByName = (\n schema: TableSchema,\n name?: string\n): SchemaColumn | undefined => {\n if (name === undefined) {\n return undefined;\n } else {\n const column = schema.columns.find((col) => col.name === name);\n if (column) {\n return column;\n } else {\n throw Error(\n `getColumnByName no column '${name}' in schema for ${schema.table.table}`\n );\n }\n }\n};\n\n//New added column functionality issue #639\n\nexport type ColumnLayout = \"Static\" | \"Fit\";\n\nexport type columnOptions = {\n availableWidth?: number;\n columnLayout?: ColumnLayout;\n defaultWidth?: number;\n defaultMinWidth?: number;\n defaultMaxWidth?: number;\n defaultFlex?: number;\n};\n\nexport function applyWidthToColumns(\n columns: RuntimeColumnDescriptor[],\n options:\n | {\n columnLayout: \"Static\";\n defaultMinWidth?: number;\n defaultMaxWidth?: number;\n defaultWidth?: number;\n }\n | {\n columnLayout: \"Fit\";\n availableWidth?: number;\n defaultMinWidth?: number;\n defaultMaxWidth?: number;\n defaultWidth?: number;\n }\n): RuntimeColumnDescriptor[];\n\nexport function applyWidthToColumns(\n columns: RuntimeColumnDescriptor[],\n options: columnOptions & { defaultMinWidth?: number }\n): RuntimeColumnDescriptor[] {\n const {\n availableWidth = 0,\n columnLayout = \"Static\",\n defaultWidth = DEFAULT_COL_WIDTH,\n defaultMinWidth = DEFAULT_MIN_WIDTH,\n defaultMaxWidth = DEFAULT_MAX_WIDTH,\n // defaultFlex = DEFAULT_FLEX,\n } = options;\n\n if (columnLayout === \"Static\") {\n return columns.map((column) => {\n if (typeof column.width === \"number\") {\n return column;\n } else {\n return {\n ...column,\n width: defaultWidth,\n };\n }\n });\n } else if (columnLayout === \"Fit\") {\n const { totalMinWidth, totalMaxWidth, totalWidth, flexCount } =\n columns.reduce(\n (aggregated, column) => {\n const { totalMinWidth, totalMaxWidth, totalWidth, flexCount } =\n aggregated;\n const {\n minWidth = defaultMinWidth,\n maxWidth = defaultMaxWidth,\n width = defaultWidth,\n flex = 0,\n } = column;\n return {\n totalMinWidth: totalMinWidth + minWidth,\n totalMaxWidth: totalMaxWidth + maxWidth,\n totalWidth: totalWidth + width,\n flexCount: flexCount + flex,\n };\n },\n { totalMinWidth: 0, totalMaxWidth: 0, totalWidth: 0, flexCount: 0 }\n );\n\n if (totalMinWidth > availableWidth || totalMaxWidth < availableWidth) {\n return columns;\n } else if (totalWidth > availableWidth) {\n const excessWidth = totalWidth - availableWidth;\n const inFlexMode = flexCount > 0;\n let excessWidthPerColumn = excessWidth / (flexCount || columns.length);\n let columnsNotYetAtMinWidth = columns.length;\n let unassignedExcess = 0;\n let newColumns = columns.map<RuntimeColumnDescriptor>((column) => {\n const {\n minWidth = defaultMinWidth,\n width = defaultWidth,\n flex = 0,\n } = column;\n if (inFlexMode && flex === 0) {\n return column;\n }\n const adjustedWidth = width - excessWidthPerColumn;\n if (adjustedWidth < minWidth) {\n columnsNotYetAtMinWidth -= 1;\n unassignedExcess += minWidth - adjustedWidth;\n return { ...column, width: minWidth };\n } else {\n return { ...column, width: adjustedWidth };\n }\n });\n if (unassignedExcess === 0) {\n return newColumns;\n } else {\n excessWidthPerColumn = unassignedExcess / columnsNotYetAtMinWidth;\n newColumns = newColumns.map((column) => {\n const adjustedWidth = column.width - excessWidthPerColumn;\n if (column.width !== column.minWidth) {\n return { ...column, width: adjustedWidth };\n } else {\n return column;\n }\n });\n return newColumns;\n }\n } else if (totalWidth < availableWidth) {\n {\n const additionalWidth = availableWidth - totalWidth;\n const inFlexMode = flexCount > 0;\n let additionalWidthPerColumn =\n additionalWidth / (flexCount || columns.length);\n // let columnsNotYetReachedMaxWidth = columns.length;\n // let unassignedAdditionalWidth = 0;\n let newColumns = columns.map((column) => {\n const {\n maxWidth = defaultMaxWidth,\n width = defaultWidth,\n flex = 0,\n } = column;\n if (inFlexMode && flex === 0) {\n return column;\n }\n const adjustedWidth = width + additionalWidthPerColumn;\n if (adjustedWidth > maxWidth) {\n // columnsNotYetReachedMaxWidth -= 1;\n // unassignedAdditionalWidth += adjustedWidth - maxWidth;\n return { ...column, width: maxWidth };\n } else {\n return { ...column, width: adjustedWidth, canStretch: true };\n }\n });\n const unassignedAdditionalColumnWidth =\n additionalWidth - newColumns.reduce((sum, col) => sum + col.width, 0);\n const columnsNotYetAtMaxWidth = newColumns.filter(\n (col) => col.canStretch\n ).length;\n if (unassignedAdditionalColumnWidth > columnsNotYetAtMaxWidth) {\n additionalWidthPerColumn =\n unassignedAdditionalColumnWidth / columnsNotYetAtMaxWidth;\n newColumns = newColumns.map<RuntimeColumnDescriptor>((column) => {\n if (column.canStretch) {\n const adjustedWidth = Math.min(\n column.width + additionalWidthPerColumn\n );\n return { ...column, width: adjustedWidth };\n } else {\n return column;\n }\n });\n }\n return newColumns.map(({ canStretch, ...column }) => column);\n }\n }\n }\n return columns;\n}\n\n/**\n * A memo compare function for cell renderers. Can be used to suppress\n * render where column and data are both unchanged. Avoids render\n * when row changes, where changes in row are unrelated to this cell.\n * Suitabnle only for readonly cell renderers. See below for editable\n * cell renderers.\n */\nexport const dataAndColumnUnchanged = (\n p: TableCellRendererProps,\n p1: TableCellRendererProps\n) =>\n p.column === p1.column &&\n p.column.valueFormatter(p.row[p.columnMap[p.column.name]]) ===\n p1.column.valueFormatter(p1.row[p1.columnMap[p1.column.name]]);\n\n/**\n * A memo compare function for cell renderers. Can be used to suppress\n * render where column, row key and data are all unchanged. Avoids render\n * when row changes, where changes in row are unrelated to this cell.\n * Suitable for editable cells. Including key in compare is not strictly\n * necessary for rendering, but it is important in the event that user\n * edits data - ensures we never have a stale key.\n */\nexport const dataColumnAndKeyUnchanged = (\n p: TableCellRendererProps,\n p1: TableCellRendererProps\n) =>\n p.column === p1.column &&\n p.row[KEY] === p1.row[KEY] &&\n p.column.valueFormatter(p.row[p.columnMap[p.column.name]]) ===\n p1.column.valueFormatter(p1.row[p1.columnMap[p1.column.name]]);\n"],"names":["groupColumn","heading","totalMinWidth","totalMaxWidth","totalWidth","flexCount"],"mappings":"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"}
|