@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.
- package/cjs/DataWindow.js +71 -0
- package/cjs/DataWindow.js.map +1 -0
- package/cjs/ThemeProvider.js +85 -0
- package/cjs/ThemeProvider.js.map +1 -0
- package/cjs/array-utils.js +87 -0
- package/cjs/array-utils.js.map +1 -0
- package/cjs/box-utils.js +10 -0
- package/cjs/box-utils.js.map +1 -0
- package/cjs/column-utils.js +810 -0
- package/cjs/column-utils.js.map +1 -0
- package/cjs/common-types.js +15 -0
- package/cjs/common-types.js.map +1 -0
- package/cjs/component-registry.js +111 -0
- package/cjs/component-registry.js.map +1 -0
- package/cjs/cookie-utils.js +10 -0
- package/cjs/cookie-utils.js.map +1 -0
- package/cjs/data-utils.js +58 -0
- package/cjs/data-utils.js.map +1 -0
- package/cjs/datasource-action-utils.js +14 -0
- package/cjs/datasource-action-utils.js.map +1 -0
- package/cjs/datasource-utils.js +178 -0
- package/cjs/datasource-utils.js.map +1 -0
- package/cjs/date/dateTimePattern.js +25 -0
- package/cjs/date/dateTimePattern.js.map +1 -0
- package/cjs/date/formatter.js +66 -0
- package/cjs/date/formatter.js.map +1 -0
- package/cjs/date/types.js +23 -0
- package/cjs/date/types.js.map +1 -0
- package/cjs/date/utils.js +10 -0
- package/cjs/date/utils.js.map +1 -0
- package/cjs/debug-utils.js +31 -0
- package/cjs/debug-utils.js.map +1 -0
- package/cjs/event-emitter.js +119 -0
- package/cjs/event-emitter.js.map +1 -0
- package/cjs/filters/filterAsQuery.js +76 -0
- package/cjs/filters/filterAsQuery.js.map +1 -0
- package/cjs/filters/utils.js +89 -0
- package/cjs/filters/utils.js.map +1 -0
- package/cjs/formatting-utils.js +66 -0
- package/cjs/formatting-utils.js.map +1 -0
- package/cjs/getUniqueId.js +6 -0
- package/cjs/getUniqueId.js.map +1 -0
- package/cjs/group-utils.js +12 -0
- package/cjs/group-utils.js.map +1 -0
- package/cjs/html-utils.js +124 -0
- package/cjs/html-utils.js.map +1 -0
- package/cjs/index.js +282 -8
- package/cjs/index.js.map +1 -7
- package/cjs/input-utils.js +10 -0
- package/cjs/input-utils.js.map +1 -0
- package/cjs/invariant.js +13 -0
- package/cjs/invariant.js.map +1 -0
- package/cjs/itemToString.js +23 -0
- package/cjs/itemToString.js.map +1 -0
- package/cjs/json-utils.js +92 -0
- package/cjs/json-utils.js.map +1 -0
- package/cjs/keyboard-utils.js +28 -0
- package/cjs/keyboard-utils.js.map +1 -0
- package/cjs/keyset.js +68 -0
- package/cjs/keyset.js.map +1 -0
- package/cjs/logging-utils.js +61 -0
- package/cjs/logging-utils.js.map +1 -0
- package/cjs/menu-utils.js +6 -0
- package/cjs/menu-utils.js.map +1 -0
- package/cjs/module-utils.js +12 -0
- package/cjs/module-utils.js.map +1 -0
- package/cjs/nanoid/index.js +22 -0
- package/cjs/nanoid/index.js.map +1 -0
- package/cjs/perf-utils.js +35 -0
- package/cjs/perf-utils.js.map +1 -0
- package/cjs/range-utils.js +74 -0
- package/cjs/range-utils.js.map +1 -0
- package/cjs/react-utils.js +21 -0
- package/cjs/react-utils.js.map +1 -0
- package/cjs/round-decimal.js +86 -0
- package/cjs/round-decimal.js.map +1 -0
- package/cjs/row-utils.js +84 -0
- package/cjs/row-utils.js.map +1 -0
- package/cjs/selection-utils.js +236 -0
- package/cjs/selection-utils.js.map +1 -0
- package/cjs/sort-utils.js +61 -0
- package/cjs/sort-utils.js.map +1 -0
- package/cjs/text-utils.js +21 -0
- package/cjs/text-utils.js.map +1 -0
- package/cjs/ts-utils.js +8 -0
- package/cjs/ts-utils.js.map +1 -0
- package/cjs/url-utils.js +21 -0
- package/cjs/url-utils.js.map +1 -0
- package/cjs/useId.js +9 -0
- package/cjs/useId.js.map +1 -0
- package/cjs/useLayoutEffectSkipFirst.js +17 -0
- package/cjs/useLayoutEffectSkipFirst.js.map +1 -0
- package/esm/DataWindow.js +69 -0
- package/esm/DataWindow.js.map +1 -0
- package/esm/ThemeProvider.js +78 -0
- package/esm/ThemeProvider.js.map +1 -0
- package/esm/array-utils.js +79 -0
- package/esm/array-utils.js.map +1 -0
- package/esm/box-utils.js +8 -0
- package/esm/box-utils.js.map +1 -0
- package/esm/column-utils.js +738 -0
- package/esm/column-utils.js.map +1 -0
- package/esm/common-types.js +13 -0
- package/esm/common-types.js.map +1 -0
- package/esm/component-registry.js +99 -0
- package/esm/component-registry.js.map +1 -0
- package/esm/cookie-utils.js +8 -0
- package/esm/cookie-utils.js.map +1 -0
- package/esm/data-utils.js +50 -0
- package/esm/data-utils.js.map +1 -0
- package/esm/datasource-action-utils.js +8 -0
- package/esm/datasource-action-utils.js.map +1 -0
- package/esm/datasource-utils.js +158 -0
- package/esm/datasource-utils.js.map +1 -0
- package/esm/date/dateTimePattern.js +21 -0
- package/esm/date/dateTimePattern.js.map +1 -0
- package/esm/date/formatter.js +63 -0
- package/esm/date/formatter.js.map +1 -0
- package/esm/date/types.js +20 -0
- package/esm/date/types.js.map +1 -0
- package/esm/date/utils.js +8 -0
- package/esm/date/utils.js.map +1 -0
- package/esm/debug-utils.js +29 -0
- package/esm/debug-utils.js.map +1 -0
- package/esm/event-emitter.js +117 -0
- package/esm/event-emitter.js.map +1 -0
- package/esm/filters/filterAsQuery.js +72 -0
- package/esm/filters/filterAsQuery.js.map +1 -0
- package/esm/filters/utils.js +74 -0
- package/esm/filters/utils.js.map +1 -0
- package/esm/formatting-utils.js +62 -0
- package/esm/formatting-utils.js.map +1 -0
- package/esm/getUniqueId.js +4 -0
- package/esm/getUniqueId.js.map +1 -0
- package/esm/group-utils.js +10 -0
- package/esm/group-utils.js.map +1 -0
- package/esm/html-utils.js +111 -0
- package/esm/html-utils.js.map +1 -0
- package/esm/index.js +45 -8
- package/esm/index.js.map +1 -7
- package/esm/input-utils.js +7 -0
- package/esm/input-utils.js.map +1 -0
- package/esm/invariant.js +11 -0
- package/esm/invariant.js.map +1 -0
- package/esm/itemToString.js +21 -0
- package/esm/itemToString.js.map +1 -0
- package/esm/json-utils.js +90 -0
- package/esm/json-utils.js.map +1 -0
- package/esm/keyboard-utils.js +15 -0
- package/esm/keyboard-utils.js.map +1 -0
- package/esm/keyset.js +66 -0
- package/esm/keyset.js.map +1 -0
- package/esm/logging-utils.js +58 -0
- package/esm/logging-utils.js.map +1 -0
- package/esm/menu-utils.js +4 -0
- package/esm/menu-utils.js.map +1 -0
- package/esm/module-utils.js +9 -0
- package/esm/module-utils.js.map +1 -0
- package/esm/nanoid/index.js +20 -0
- package/esm/nanoid/index.js.map +1 -0
- package/esm/perf-utils.js +32 -0
- package/esm/perf-utils.js.map +1 -0
- package/esm/range-utils.js +66 -0
- package/esm/range-utils.js.map +1 -0
- package/esm/react-utils.js +19 -0
- package/esm/react-utils.js.map +1 -0
- package/esm/round-decimal.js +84 -0
- package/esm/round-decimal.js.map +1 -0
- package/esm/row-utils.js +78 -0
- package/esm/row-utils.js.map +1 -0
- package/esm/selection-utils.js +227 -0
- package/esm/selection-utils.js.map +1 -0
- package/esm/sort-utils.js +57 -0
- package/esm/sort-utils.js.map +1 -0
- package/esm/text-utils.js +18 -0
- package/esm/text-utils.js.map +1 -0
- package/esm/ts-utils.js +6 -0
- package/esm/ts-utils.js.map +1 -0
- package/esm/url-utils.js +18 -0
- package/esm/url-utils.js.map +1 -0
- package/esm/useId.js +7 -0
- package/esm/useId.js.map +1 -0
- package/esm/useLayoutEffectSkipFirst.js +15 -0
- package/esm/useLayoutEffectSkipFirst.js.map +1 -0
- package/package.json +12 -9
- package/types/column-utils.d.ts +1 -43
- package/types/filters/filterAsQuery.d.ts +2 -0
- package/types/filters/index.d.ts +1 -1
- package/types/filters/utils.d.ts +44 -2
- package/types/index.d.ts +0 -1
- package/LICENSE +0 -201
- package/types/local-config.d.ts +0 -3
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const PUNCTUATION_STR = String.fromCharCode(8200);
|
|
4
|
+
const DIGIT_STR = String.fromCharCode(8199);
|
|
5
|
+
const DECIMALS_AUTO = -1;
|
|
6
|
+
const Space = {
|
|
7
|
+
DIGIT: DIGIT_STR,
|
|
8
|
+
TWO_DIGITS: DIGIT_STR + DIGIT_STR,
|
|
9
|
+
THREE_DIGITS: DIGIT_STR + DIGIT_STR + DIGIT_STR,
|
|
10
|
+
FULL_PADDING: [
|
|
11
|
+
null,
|
|
12
|
+
PUNCTUATION_STR + DIGIT_STR,
|
|
13
|
+
PUNCTUATION_STR + DIGIT_STR + DIGIT_STR,
|
|
14
|
+
PUNCTUATION_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR,
|
|
15
|
+
PUNCTUATION_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR
|
|
16
|
+
]
|
|
17
|
+
};
|
|
18
|
+
const Zero = {
|
|
19
|
+
DIGIT: "0",
|
|
20
|
+
TWO_DIGITS: "00",
|
|
21
|
+
THREE_DIGITS: "000",
|
|
22
|
+
FULL_PADDING: [null, "0", "00", "000", "0000"]
|
|
23
|
+
};
|
|
24
|
+
function padLeft(value, maxLength = 6) {
|
|
25
|
+
return (LEADING_FILL + value).slice(-maxLength);
|
|
26
|
+
}
|
|
27
|
+
const LEADING_FILL = DIGIT_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR;
|
|
28
|
+
const Align = {
|
|
29
|
+
Right: "right",
|
|
30
|
+
Center: "center",
|
|
31
|
+
Left: "left"
|
|
32
|
+
};
|
|
33
|
+
function pad(n, dp, Pad) {
|
|
34
|
+
let len = n.length;
|
|
35
|
+
const diff = dp - len;
|
|
36
|
+
if (diff > 0) {
|
|
37
|
+
if (diff === 1) {
|
|
38
|
+
n = n + Pad.DIGIT;
|
|
39
|
+
} else if (diff === 2) {
|
|
40
|
+
n = n + Pad.TWO_DIGITS;
|
|
41
|
+
} else if (diff === 3) {
|
|
42
|
+
n = n + Pad.THREE_DIGITS;
|
|
43
|
+
}
|
|
44
|
+
} else {
|
|
45
|
+
if (diff < 0) {
|
|
46
|
+
n = n.slice(0, dp);
|
|
47
|
+
len = dp;
|
|
48
|
+
}
|
|
49
|
+
if (Pad === Space && n.charAt(len - 1) === "0") {
|
|
50
|
+
n = n.replace(/0+$/, "");
|
|
51
|
+
return pad(n, dp, Pad);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return n;
|
|
55
|
+
}
|
|
56
|
+
function roundDecimal(value, align = Align.Right, decimals = 4, zeroPad, alignOnDecimals) {
|
|
57
|
+
if (value === void 0 || typeof value !== "number" || isNaN(value)) {
|
|
58
|
+
return "";
|
|
59
|
+
}
|
|
60
|
+
let integral, fraction, Pad;
|
|
61
|
+
const [part1, part2 = ""] = value.toString().split(".");
|
|
62
|
+
const actualDecimals = part2.length;
|
|
63
|
+
integral = parseFloat(part1).toLocaleString();
|
|
64
|
+
if (align === Align.Left && alignOnDecimals) {
|
|
65
|
+
integral = padLeft(integral);
|
|
66
|
+
}
|
|
67
|
+
if (decimals === DECIMALS_AUTO || actualDecimals === decimals) {
|
|
68
|
+
fraction = part2;
|
|
69
|
+
} else if (actualDecimals > decimals) {
|
|
70
|
+
fraction = parseFloat("0." + part2).toFixed(decimals).slice(2);
|
|
71
|
+
} else {
|
|
72
|
+
if (Pad = zeroPad ? Zero : alignOnDecimals && align !== Align.Left ? Space : null) {
|
|
73
|
+
if (actualDecimals === 0) {
|
|
74
|
+
fraction = Pad.FULL_PADDING[decimals];
|
|
75
|
+
} else {
|
|
76
|
+
fraction = pad(part2, decimals, Pad);
|
|
77
|
+
}
|
|
78
|
+
} else {
|
|
79
|
+
fraction = part2;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return integral + (fraction ? "." + fraction : "");
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
exports.roundDecimal = roundDecimal;
|
|
86
|
+
//# sourceMappingURL=round-decimal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"round-decimal.js","sources":["../src/round-decimal.ts"],"sourcesContent":["const PUNCTUATION_STR = String.fromCharCode(8200);\nconst DIGIT_STR = String.fromCharCode(8199);\nconst DECIMALS_AUTO = -1;\n\ntype PadMap = {\n DIGIT: string;\n TWO_DIGITS: string;\n THREE_DIGITS: string;\n FULL_PADDING: [null, string, string, string, string];\n};\n\nconst Space: PadMap = {\n DIGIT: DIGIT_STR,\n TWO_DIGITS: DIGIT_STR + DIGIT_STR,\n THREE_DIGITS: DIGIT_STR + DIGIT_STR + DIGIT_STR,\n FULL_PADDING: [\n null,\n PUNCTUATION_STR + DIGIT_STR,\n PUNCTUATION_STR + DIGIT_STR + DIGIT_STR,\n PUNCTUATION_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR,\n PUNCTUATION_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR,\n ],\n};\n\nconst Zero: PadMap = {\n DIGIT: \"0\",\n TWO_DIGITS: \"00\",\n THREE_DIGITS: \"000\",\n FULL_PADDING: [null, \"0\", \"00\", \"000\", \"0000\"],\n};\n\nfunction padLeft(value: string, maxLength = 6) {\n return (LEADING_FILL + value).slice(-maxLength);\n}\n\nconst LEADING_FILL =\n DIGIT_STR +\n DIGIT_STR +\n DIGIT_STR +\n DIGIT_STR +\n DIGIT_STR +\n DIGIT_STR +\n DIGIT_STR +\n DIGIT_STR +\n DIGIT_STR;\n\nconst Align = {\n Right: \"right\",\n Center: \"center\",\n Left: \"left\",\n};\n\nfunction pad(n: string, dp: number, Pad: PadMap): string {\n let len = n.length;\n const diff = dp - len;\n\n if (diff > 0) {\n if (diff === 1) {\n n = n + Pad.DIGIT;\n } else if (diff === 2) {\n n = n + Pad.TWO_DIGITS;\n } else if (diff === 3) {\n n = n + Pad.THREE_DIGITS;\n }\n } else {\n if (diff < 0) {\n n = n.slice(0, dp);\n len = dp;\n }\n\n if (Pad === Space && n.charAt(len - 1) === \"0\") {\n n = n.replace(/0+$/, \"\");\n return pad(n, dp, Pad);\n }\n }\n return n;\n}\n\nexport function roundDecimal(\n value?: number,\n align = Align.Right,\n decimals = 4,\n zeroPad?: boolean,\n alignOnDecimals?: boolean\n) {\n if (value === undefined || typeof value !== \"number\" || isNaN(value)) {\n return \"\";\n }\n let integral, fraction, Pad;\n\n const [part1, part2 = \"\"] = value.toString().split(\".\");\n const actualDecimals = part2.length;\n\n integral = parseFloat(part1).toLocaleString();\n\n if (align === Align.Left && alignOnDecimals) {\n integral = padLeft(integral);\n }\n\n if (decimals === DECIMALS_AUTO || actualDecimals === decimals) {\n fraction = part2;\n } else if (actualDecimals > decimals) {\n fraction = parseFloat(\"0.\" + part2)\n .toFixed(decimals)\n .slice(2);\n } else {\n /* eslint-disable no-cond-assign */\n if (\n (Pad = zeroPad\n ? Zero\n : alignOnDecimals && align !== Align.Left\n ? Space\n : null)\n ) {\n if (actualDecimals === 0) {\n fraction = Pad.FULL_PADDING[decimals];\n } else {\n fraction = pad(part2, decimals, Pad);\n }\n } else {\n fraction = part2;\n }\n }\n\n return integral + (fraction ? \".\" + fraction : \"\");\n}\n"],"names":[],"mappings":"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"}
|
package/cjs/row-utils.js
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var columnUtils = require('./column-utils.js');
|
|
4
|
+
|
|
5
|
+
const { IS_LEAF, KEY, IDX, SELECTED } = columnUtils.metadataKeys;
|
|
6
|
+
const actualRowPositioning = (rowHeight) => [
|
|
7
|
+
(row) => row[IDX] * rowHeight,
|
|
8
|
+
(position) => Math.floor(position / rowHeight),
|
|
9
|
+
false
|
|
10
|
+
];
|
|
11
|
+
const virtualRowPositioning = (rowHeight, virtualisedExtent, pctScrollTop) => [
|
|
12
|
+
(row, offset = 0) => {
|
|
13
|
+
const rowOffset = pctScrollTop.current * virtualisedExtent;
|
|
14
|
+
return (row[IDX] - offset) * rowHeight - rowOffset;
|
|
15
|
+
},
|
|
16
|
+
/*
|
|
17
|
+
Return index position of closest row
|
|
18
|
+
*/
|
|
19
|
+
(position) => {
|
|
20
|
+
const rowOffset = pctScrollTop.current * virtualisedExtent;
|
|
21
|
+
return Math.round((position + rowOffset) / rowHeight);
|
|
22
|
+
},
|
|
23
|
+
true
|
|
24
|
+
];
|
|
25
|
+
const getRowElementAtIndex = (container, rowIndex) => {
|
|
26
|
+
if (rowIndex === -1) {
|
|
27
|
+
return null;
|
|
28
|
+
} else {
|
|
29
|
+
const activeRow = container.querySelector(
|
|
30
|
+
`[aria-rowindex="${rowIndex + 1}"]`
|
|
31
|
+
);
|
|
32
|
+
if (activeRow) {
|
|
33
|
+
return activeRow;
|
|
34
|
+
} else {
|
|
35
|
+
throw Error(
|
|
36
|
+
`getRowElementAtIndex no row found for index index ${rowIndex}`
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
const getIndexFromRowElement = (rowElement) => {
|
|
42
|
+
const rowIndex = rowElement.ariaRowIndex;
|
|
43
|
+
if (rowIndex != null) {
|
|
44
|
+
const index = parseInt(rowIndex) - 1;
|
|
45
|
+
if (!isNaN(index)) {
|
|
46
|
+
return index;
|
|
47
|
+
} else {
|
|
48
|
+
throw Error(
|
|
49
|
+
`getIndexFromRowElement row element aria rowindex invalid ${rowIndex}`
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
} else {
|
|
53
|
+
throw Error(
|
|
54
|
+
"getIndexFromRowElement row element does not have aria rowindex"
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
const asDataSourceRowObject = (row, columnMap) => {
|
|
59
|
+
console.log({ columnMap });
|
|
60
|
+
const {
|
|
61
|
+
[IS_LEAF]: isLeaf,
|
|
62
|
+
[KEY]: key,
|
|
63
|
+
[IDX]: index,
|
|
64
|
+
[SELECTED]: selected
|
|
65
|
+
} = row;
|
|
66
|
+
const rowObject = {
|
|
67
|
+
key,
|
|
68
|
+
index,
|
|
69
|
+
isGroupRow: !isLeaf,
|
|
70
|
+
isSelected: selected > 0,
|
|
71
|
+
data: {}
|
|
72
|
+
};
|
|
73
|
+
for (const [colName, colIdx] of Object.entries(columnMap)) {
|
|
74
|
+
rowObject.data[colName] = row[colIdx];
|
|
75
|
+
}
|
|
76
|
+
return rowObject;
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
exports.actualRowPositioning = actualRowPositioning;
|
|
80
|
+
exports.asDataSourceRowObject = asDataSourceRowObject;
|
|
81
|
+
exports.getIndexFromRowElement = getIndexFromRowElement;
|
|
82
|
+
exports.getRowElementAtIndex = getRowElementAtIndex;
|
|
83
|
+
exports.virtualRowPositioning = virtualRowPositioning;
|
|
84
|
+
//# 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":["metadataKeys"],"mappings":"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"}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var columnUtils = require('./column-utils.js');
|
|
4
|
+
|
|
5
|
+
const NO_SELECTION = [];
|
|
6
|
+
const { SELECTED } = columnUtils.metadataKeys;
|
|
7
|
+
const RowSelected = {
|
|
8
|
+
False: 0,
|
|
9
|
+
True: 1,
|
|
10
|
+
First: 2,
|
|
11
|
+
Last: 4
|
|
12
|
+
};
|
|
13
|
+
const isRowSelected = (row) => (row[SELECTED] & RowSelected.True) === RowSelected.True;
|
|
14
|
+
const isRowSelectedLast = (row) => row !== void 0 && (row[SELECTED] & RowSelected.Last) === RowSelected.Last;
|
|
15
|
+
const inAscendingOrder = (item1, item2) => {
|
|
16
|
+
const n1 = typeof item1 === "number" ? item1 : item1[0];
|
|
17
|
+
const n2 = typeof item2 === "number" ? item2 : item2[0];
|
|
18
|
+
return n1 - n2;
|
|
19
|
+
};
|
|
20
|
+
const deselectItem = (selectionModel, selected, itemIndex, rangeSelect, keepExistingSelection = false) => {
|
|
21
|
+
const singleSelect = selectionModel === "single";
|
|
22
|
+
const multiSelect = selectionModel === "extended" || selectionModel === "checkbox";
|
|
23
|
+
const actsLikeSingleSelect = singleSelect || multiSelect && !keepExistingSelection && !rangeSelect;
|
|
24
|
+
if (actsLikeSingleSelect || !rangeSelect && !keepExistingSelection) {
|
|
25
|
+
return NO_SELECTION;
|
|
26
|
+
} else if (!rangeSelect && keepExistingSelection) {
|
|
27
|
+
return removeSelectedItem(selected, itemIndex);
|
|
28
|
+
}
|
|
29
|
+
return NO_SELECTION;
|
|
30
|
+
};
|
|
31
|
+
const newSelectedFillsGapOrExtends = (selection, itemIndex) => {
|
|
32
|
+
for (let i = 0; i < selection.length; i++) {
|
|
33
|
+
const item = selection[i];
|
|
34
|
+
if (typeof item === "number") {
|
|
35
|
+
if (item === itemIndex - 1) {
|
|
36
|
+
return true;
|
|
37
|
+
} else if (item > itemIndex) {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
} else if (item[0] === itemIndex + 1 || item[1] === itemIndex - 1) {
|
|
41
|
+
return true;
|
|
42
|
+
} else if (item[0] > itemIndex) {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return false;
|
|
47
|
+
};
|
|
48
|
+
const fillGapOrExtendSelection = (selection, itemIndex) => {
|
|
49
|
+
for (let i = 0; i < selection.length; i++) {
|
|
50
|
+
const item = selection[i];
|
|
51
|
+
if (typeof item === "number") {
|
|
52
|
+
if (item === itemIndex - 1) {
|
|
53
|
+
const nextSelectionItem = selection[i + 1];
|
|
54
|
+
if (nextSelectionItem === itemIndex + 1) {
|
|
55
|
+
const newRange = [item, nextSelectionItem];
|
|
56
|
+
return selection.slice(0, i).concat([newRange]).concat(selection.slice(i + 2));
|
|
57
|
+
} else {
|
|
58
|
+
const newRange = [item, itemIndex];
|
|
59
|
+
return selection.slice(0, i).concat([newRange]).concat(selection.slice(i + 1));
|
|
60
|
+
}
|
|
61
|
+
} else if (item > itemIndex) {
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
} else if (item[0] === itemIndex + 1) {
|
|
65
|
+
const newRange = [itemIndex, item[1]];
|
|
66
|
+
return selection.slice(0, i).concat([newRange]).concat(selection.slice(i + 1));
|
|
67
|
+
} else if (item[1] === itemIndex - 1) {
|
|
68
|
+
const nextItem = selection[i + 1];
|
|
69
|
+
if (Array.isArray(nextItem) && nextItem[0] === itemIndex + 1) {
|
|
70
|
+
const newRange = [item[0], nextItem[1]];
|
|
71
|
+
return selection.slice(0, i).concat([newRange]).concat(selection.slice(i + 2));
|
|
72
|
+
} else if (typeof nextItem === "number" && nextItem === itemIndex + 1) {
|
|
73
|
+
const newRange = [item[0], nextItem];
|
|
74
|
+
return selection.slice(0, i).concat([newRange]).concat(selection.slice(i + 2));
|
|
75
|
+
} else {
|
|
76
|
+
const newRange = [item[0], itemIndex];
|
|
77
|
+
return selection.slice(0, i).concat([newRange]).concat(selection.slice(i + 1));
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return selection;
|
|
82
|
+
};
|
|
83
|
+
const selectItem = (selectionModel, selected, itemIndex, rangeSelect, keepExistingSelection = false, activeItemIndex = -1) => {
|
|
84
|
+
const singleSelect = selectionModel === "single";
|
|
85
|
+
const multiSelect = selectionModel === "extended" || selectionModel === "checkbox";
|
|
86
|
+
const actsLikeSingleSelect = singleSelect || multiSelect && !keepExistingSelection && !rangeSelect;
|
|
87
|
+
if (selectionModel === "none") {
|
|
88
|
+
return NO_SELECTION;
|
|
89
|
+
} else if (actsLikeSingleSelect) {
|
|
90
|
+
return [itemIndex];
|
|
91
|
+
} else if (rangeSelect) {
|
|
92
|
+
if (selected.length === 0) {
|
|
93
|
+
return [itemIndex];
|
|
94
|
+
} else {
|
|
95
|
+
const range = itemIndex > activeItemIndex ? [activeItemIndex, itemIndex] : [itemIndex, activeItemIndex];
|
|
96
|
+
return insertRange(selected, range);
|
|
97
|
+
}
|
|
98
|
+
} else if (!rangeSelect) {
|
|
99
|
+
if (newSelectedFillsGapOrExtends(selected, itemIndex)) {
|
|
100
|
+
return fillGapOrExtendSelection(selected, itemIndex);
|
|
101
|
+
} else {
|
|
102
|
+
return selected?.concat(itemIndex).sort(inAscendingOrder);
|
|
103
|
+
}
|
|
104
|
+
} else ;
|
|
105
|
+
return NO_SELECTION;
|
|
106
|
+
};
|
|
107
|
+
function removeSelectedItem(selected, itemIndex) {
|
|
108
|
+
if (selected.includes(itemIndex)) {
|
|
109
|
+
return selected.filter((selectedItem) => selectedItem !== itemIndex);
|
|
110
|
+
} else {
|
|
111
|
+
const newSelected = [];
|
|
112
|
+
for (const selectedItem of selected) {
|
|
113
|
+
if (Array.isArray(selectedItem)) {
|
|
114
|
+
if (rangeIncludes(selectedItem, itemIndex)) {
|
|
115
|
+
newSelected.push(...splitRange(selectedItem, itemIndex));
|
|
116
|
+
} else {
|
|
117
|
+
newSelected.push(selectedItem);
|
|
118
|
+
}
|
|
119
|
+
} else {
|
|
120
|
+
newSelected.push(selectedItem);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return newSelected;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
function insertRange(selected, range) {
|
|
127
|
+
const [from, to] = range;
|
|
128
|
+
return selected.reduce((newSelected, selectedItem) => {
|
|
129
|
+
if (typeof selectedItem === "number") {
|
|
130
|
+
if (selectedItem < from || selectedItem > to) {
|
|
131
|
+
newSelected.push(selectedItem);
|
|
132
|
+
} else if (!includedInRange(newSelected.at(-1), selectedItem)) {
|
|
133
|
+
newSelected.push(range);
|
|
134
|
+
}
|
|
135
|
+
} else if (overlappingRange(selectedItem, range)) {
|
|
136
|
+
newSelected.push(mergeRanges(selectedItem, range));
|
|
137
|
+
} else {
|
|
138
|
+
if (range[1] < selectedItem[0]) {
|
|
139
|
+
newSelected.push(range);
|
|
140
|
+
}
|
|
141
|
+
newSelected.push(selectedItem);
|
|
142
|
+
}
|
|
143
|
+
return newSelected;
|
|
144
|
+
}, []);
|
|
145
|
+
}
|
|
146
|
+
const overlappingRange = (r1, r2) => r1[1] >= r2[0] && r1[1] <= r2[1] || r1[0] >= r2[0] && r1[0] <= r2[1];
|
|
147
|
+
const mergeRanges = (r1, r2) => [
|
|
148
|
+
Math.min(r1[0], r2[0]),
|
|
149
|
+
Math.max(r1[1], r2[1])
|
|
150
|
+
];
|
|
151
|
+
const includedInRange = (selectedItem, index) => {
|
|
152
|
+
if (typeof selectedItem === "undefined" || typeof selectedItem === "number") {
|
|
153
|
+
return false;
|
|
154
|
+
} else
|
|
155
|
+
return rangeIncludes(selectedItem, index);
|
|
156
|
+
};
|
|
157
|
+
const rangeIncludes = (range, index) => index >= range[0] && index <= range[1];
|
|
158
|
+
const SINGLE_SELECTED_ROW = RowSelected.True + RowSelected.First + RowSelected.Last;
|
|
159
|
+
const FIRST_SELECTED_ROW_OF_BLOCK = RowSelected.True + RowSelected.First;
|
|
160
|
+
const LAST_SELECTED_ROW_OF_BLOCK = RowSelected.True + RowSelected.Last;
|
|
161
|
+
const getSelectionStatus = (selected, itemIndex) => {
|
|
162
|
+
for (const item of selected) {
|
|
163
|
+
if (typeof item === "number") {
|
|
164
|
+
if (item === itemIndex) {
|
|
165
|
+
return SINGLE_SELECTED_ROW;
|
|
166
|
+
}
|
|
167
|
+
} else if (rangeIncludes(item, itemIndex)) {
|
|
168
|
+
if (itemIndex === item[0]) {
|
|
169
|
+
return FIRST_SELECTED_ROW_OF_BLOCK;
|
|
170
|
+
} else if (itemIndex === item[1]) {
|
|
171
|
+
return LAST_SELECTED_ROW_OF_BLOCK;
|
|
172
|
+
} else {
|
|
173
|
+
return RowSelected.True;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return RowSelected.False;
|
|
178
|
+
};
|
|
179
|
+
const isSelected = (selected, itemIndex) => {
|
|
180
|
+
for (const item of selected) {
|
|
181
|
+
if (typeof item === "number") {
|
|
182
|
+
if (item === itemIndex) {
|
|
183
|
+
return true;
|
|
184
|
+
} else if (item > itemIndex) {
|
|
185
|
+
return false;
|
|
186
|
+
}
|
|
187
|
+
} else if (rangeIncludes(item, itemIndex)) {
|
|
188
|
+
return true;
|
|
189
|
+
} else if (item[0] > itemIndex) {
|
|
190
|
+
return false;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
return false;
|
|
194
|
+
};
|
|
195
|
+
const expandSelection = (selected) => {
|
|
196
|
+
if (selected.every((selectedItem) => typeof selectedItem === "number")) {
|
|
197
|
+
return selected;
|
|
198
|
+
}
|
|
199
|
+
const expandedSelected = [];
|
|
200
|
+
for (const selectedItem of selected) {
|
|
201
|
+
if (typeof selectedItem === "number") {
|
|
202
|
+
expandedSelected.push(selectedItem);
|
|
203
|
+
} else {
|
|
204
|
+
for (let i = selectedItem[0]; i <= selectedItem[1]; i++) {
|
|
205
|
+
expandedSelected.push(i);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return expandedSelected;
|
|
210
|
+
};
|
|
211
|
+
function splitRange([from, to], itemIndex) {
|
|
212
|
+
if (itemIndex === from) {
|
|
213
|
+
return [[from + 1, to]];
|
|
214
|
+
} else if (itemIndex === to) {
|
|
215
|
+
return [[from, to - 1]];
|
|
216
|
+
} else if (to - from === 2) {
|
|
217
|
+
return [from, to];
|
|
218
|
+
} else if (itemIndex === to - 1) {
|
|
219
|
+
return [[from, to - 2], to];
|
|
220
|
+
} else {
|
|
221
|
+
return [
|
|
222
|
+
[from, itemIndex - 1],
|
|
223
|
+
[itemIndex + 1, to]
|
|
224
|
+
];
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
exports.RowSelected = RowSelected;
|
|
229
|
+
exports.deselectItem = deselectItem;
|
|
230
|
+
exports.expandSelection = expandSelection;
|
|
231
|
+
exports.getSelectionStatus = getSelectionStatus;
|
|
232
|
+
exports.isRowSelected = isRowSelected;
|
|
233
|
+
exports.isRowSelectedLast = isRowSelectedLast;
|
|
234
|
+
exports.isSelected = isSelected;
|
|
235
|
+
exports.selectItem = selectItem;
|
|
236
|
+
//# 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":["metadataKeys"],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const cycleSortType = (sortType) => sortType === "A" ? "D" : sortType === "D" ? void 0 : "A";
|
|
4
|
+
const NO_SORT = { sortDefs: [] };
|
|
5
|
+
const toggleOrApplySort = ({ sortDefs }, { name: column }, extendSort = false, sortType) => {
|
|
6
|
+
if (extendSort) {
|
|
7
|
+
const existingDef = sortDefs.find((sortDef) => sortDef.column === column);
|
|
8
|
+
if (existingDef) {
|
|
9
|
+
return {
|
|
10
|
+
sortDefs: sortDefs.map(
|
|
11
|
+
(sortDef) => sortDef.column === column ? {
|
|
12
|
+
column,
|
|
13
|
+
sortType: sortDef.sortType === "A" ? "D" : "A"
|
|
14
|
+
} : sortDef
|
|
15
|
+
)
|
|
16
|
+
};
|
|
17
|
+
} else {
|
|
18
|
+
return {
|
|
19
|
+
sortDefs: sortDefs.concat({
|
|
20
|
+
column,
|
|
21
|
+
sortType: sortType ?? "A"
|
|
22
|
+
})
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
const newSortType = typeof sortType === "string" ? sortType : sortDefs.length === 1 && sortDefs[0].column === column ? cycleSortType(sortDefs[0].sortType) : "A";
|
|
27
|
+
return newSortType ? {
|
|
28
|
+
sortDefs: [{ column, sortType: newSortType }]
|
|
29
|
+
} : NO_SORT;
|
|
30
|
+
};
|
|
31
|
+
const setSortColumn = ({ sortDefs }, column, sortType) => {
|
|
32
|
+
if (sortType === void 0) {
|
|
33
|
+
const columnSort = sortDefs.find((item) => item.column === column.name);
|
|
34
|
+
if (columnSort) {
|
|
35
|
+
return {
|
|
36
|
+
sortDefs: [
|
|
37
|
+
{
|
|
38
|
+
column: column.name,
|
|
39
|
+
sortType: columnSort.sortType === "A" ? "D" : "A"
|
|
40
|
+
}
|
|
41
|
+
]
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return { sortDefs: [{ column: column.name, sortType: sortType ?? "A" }] };
|
|
46
|
+
};
|
|
47
|
+
const addSortColumn = ({ sortDefs }, column, sortType = "A") => {
|
|
48
|
+
const sortEntry = { column: column.name, sortType };
|
|
49
|
+
if (sortDefs.length > 0) {
|
|
50
|
+
return {
|
|
51
|
+
sortDefs: sortDefs.concat(sortEntry)
|
|
52
|
+
};
|
|
53
|
+
} else {
|
|
54
|
+
return { sortDefs: [sortEntry] };
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
exports.addSortColumn = addSortColumn;
|
|
59
|
+
exports.setSortColumn = setSortColumn;
|
|
60
|
+
exports.toggleOrApplySort = toggleOrApplySort;
|
|
61
|
+
//# 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,21 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const lastWord = (text) => {
|
|
4
|
+
const trimmedText = text.trim();
|
|
5
|
+
const pos = trimmedText.lastIndexOf(" ");
|
|
6
|
+
if (pos === -1) {
|
|
7
|
+
return trimmedText;
|
|
8
|
+
} else {
|
|
9
|
+
return trimmedText.slice(pos + 1);
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
const capitalize = (text) => text.length === 0 ? "" : text[0].toUpperCase() + text.slice(1);
|
|
13
|
+
const regexp_worfify = /(?<!(^|[A-Z]))(?=[A-Z])|(?<!^)(?=[A-Z][a-z])/;
|
|
14
|
+
const wordify = (text) => {
|
|
15
|
+
const [firstWord, ...rest] = text.split(regexp_worfify);
|
|
16
|
+
return `${capitalize(firstWord)} ${rest.join(" ")}`;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
exports.lastWord = lastWord;
|
|
20
|
+
exports.wordify = wordify;
|
|
21
|
+
//# 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;;;;;"}
|
package/cjs/ts-utils.js
ADDED
|
@@ -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;;;;"}
|
package/cjs/url-utils.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const getUrlParameter = (paramName, defaultValue) => {
|
|
4
|
+
const url = new URL(document.location.href);
|
|
5
|
+
const parameter = url.searchParams.get(paramName);
|
|
6
|
+
if (parameter) {
|
|
7
|
+
return parameter;
|
|
8
|
+
}
|
|
9
|
+
const hashParams = url.hash;
|
|
10
|
+
const regex = new RegExp(`${paramName}=([a-zA-Z]*)`);
|
|
11
|
+
const result = regex.exec(hashParams);
|
|
12
|
+
if (result) {
|
|
13
|
+
return result[1];
|
|
14
|
+
}
|
|
15
|
+
return defaultValue;
|
|
16
|
+
};
|
|
17
|
+
const hasUrlParameter = (paramName) => new URL(document.location.href).searchParams.has(paramName);
|
|
18
|
+
|
|
19
|
+
exports.getUrlParameter = getUrlParameter;
|
|
20
|
+
exports.hasUrlParameter = hasUrlParameter;
|
|
21
|
+
//# 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/cjs/useId.js
ADDED
package/cjs/useId.js.map
ADDED
|
@@ -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":["useMemo"],"mappings":";;;;AAEA,IAAI,mBAAsB,GAAA,CAAA,CAAA;AAEnB,MAAM,KAAQ,GAAA,CAAC,EACpB,KAAAA,aAAA,CAAQ,MAAM,EAAA,IAAM,CAAO,IAAA,EAAA,EAAE,mBAAmB,CAAA,CAAA,EAAI,CAAC,EAAE,CAAC;;;;"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react = require('react');
|
|
4
|
+
|
|
5
|
+
const useLayoutEffectSkipFirst = (func, deps) => {
|
|
6
|
+
const goodToGo = react.useRef(false);
|
|
7
|
+
react.useLayoutEffect(() => {
|
|
8
|
+
if (goodToGo.current) {
|
|
9
|
+
func();
|
|
10
|
+
} else {
|
|
11
|
+
goodToGo.current = true;
|
|
12
|
+
}
|
|
13
|
+
}, deps);
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
exports.useLayoutEffectSkipFirst = useLayoutEffectSkipFirst;
|
|
17
|
+
//# 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":["useRef","useLayoutEffect"],"mappings":";;;;AAEa,MAAA,wBAAA,GAA2B,CACtC,IAAA,EACA,IACG,KAAA;AACH,EAAM,MAAA,QAAA,GAAWA,aAAO,KAAK,CAAA,CAAA;AAC7B,EAAAC,qBAAA,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;;;;"}
|