@vuu-ui/vuu-utils 0.8.99 → 0.9.0
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/filters/filter-utils.js +28 -3
- package/cjs/filters/filter-utils.js.map +1 -1
- package/cjs/form-utils.js +28 -0
- package/cjs/form-utils.js.map +1 -1
- package/cjs/index.js +1 -1
- package/cjs/row-utils.js +0 -17
- package/cjs/row-utils.js.map +1 -1
- package/esm/filters/filter-utils.js +28 -3
- package/esm/filters/filter-utils.js.map +1 -1
- package/esm/form-utils.js +28 -1
- package/esm/form-utils.js.map +1 -1
- package/esm/index.js +2 -2
- package/esm/row-utils.js +1 -17
- package/esm/row-utils.js.map +1 -1
- package/package.json +6 -6
- package/types/filters/filter-utils.d.ts +4 -2
- package/types/form-utils.d.ts +12 -1
- package/types/row-utils.d.ts +0 -1
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var eventEmitter = require('../event-emitter.js');
|
|
4
|
+
var formUtils = require('../form-utils.js');
|
|
4
5
|
|
|
5
6
|
var __typeError = (msg) => {
|
|
6
7
|
throw TypeError(msg);
|
|
@@ -8,7 +9,7 @@ var __typeError = (msg) => {
|
|
|
8
9
|
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
|
|
9
10
|
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
10
11
|
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
11
|
-
var _filters;
|
|
12
|
+
var _columns, _filters;
|
|
12
13
|
const singleValueFilterOps = /* @__PURE__ */ new Set([
|
|
13
14
|
"=",
|
|
14
15
|
"!=",
|
|
@@ -81,16 +82,40 @@ const collectFiltersForColumn = (filter, columnName) => {
|
|
|
81
82
|
filters: results
|
|
82
83
|
};
|
|
83
84
|
};
|
|
85
|
+
const createFilterClause = (column, value) => typeof value === "string" ? `${column} contains "${value}"` : `${column} = ${value}`;
|
|
84
86
|
class FilterAggregator extends eventEmitter.EventEmitter {
|
|
85
87
|
constructor() {
|
|
86
88
|
super(...arguments);
|
|
89
|
+
__privateAdd(this, _columns, /* @__PURE__ */ new Map());
|
|
87
90
|
__privateAdd(this, _filters, /* @__PURE__ */ new Map());
|
|
88
91
|
}
|
|
89
92
|
addFilter(column, value) {
|
|
90
|
-
|
|
91
|
-
|
|
93
|
+
__privateGet(this, _columns).set(column.name, column);
|
|
94
|
+
const { serverDataType = "string" } = column;
|
|
95
|
+
const typedValue = formUtils.getTypedValue(value.toString(), serverDataType, true);
|
|
96
|
+
__privateGet(this, _filters).set(column.name, typedValue);
|
|
97
|
+
}
|
|
98
|
+
removeFilter(column) {
|
|
99
|
+
if (__privateGet(this, _columns).has(column.name)) {
|
|
100
|
+
__privateGet(this, _columns).delete(column.name);
|
|
101
|
+
__privateGet(this, _filters).delete(column.name);
|
|
102
|
+
return true;
|
|
103
|
+
} else {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
get filter() {
|
|
108
|
+
const { size } = __privateGet(this, _filters);
|
|
109
|
+
if (size === 0) {
|
|
110
|
+
return { filter: "" };
|
|
111
|
+
} else {
|
|
112
|
+
return {
|
|
113
|
+
filter: Array.from(__privateGet(this, _filters).entries()).map((args) => createFilterClause(...args)).join(" and ")
|
|
114
|
+
};
|
|
115
|
+
}
|
|
92
116
|
}
|
|
93
117
|
}
|
|
118
|
+
_columns = new WeakMap();
|
|
94
119
|
_filters = new WeakMap();
|
|
95
120
|
|
|
96
121
|
exports.FilterAggregator = FilterAggregator;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter-utils.js","sources":["../../src/filters/filter-utils.ts"],"sourcesContent":["import type { DataSourceFilter } from \"@vuu-ui/vuu-data-types\";\nimport {\n AndFilter,\n Filter,\n FilterClauseOp,\n FilterWithPartialClause,\n MultiClauseFilter,\n MultiValueFilterClause,\n OrFilter,\n SingleValueFilterClause,\n SingleValueFilterClauseOp,\n} from \"@vuu-ui/vuu-filter-types\";\nimport {
|
|
1
|
+
{"version":3,"file":"filter-utils.js","sources":["../../src/filters/filter-utils.ts"],"sourcesContent":["import type { DataSourceFilter } from \"@vuu-ui/vuu-data-types\";\nimport {\n AndFilter,\n Filter,\n FilterClauseOp,\n FilterWithPartialClause,\n MultiClauseFilter,\n MultiValueFilterClause,\n OrFilter,\n SingleValueFilterClause,\n SingleValueFilterClauseOp,\n} from \"@vuu-ui/vuu-filter-types\";\nimport {\n ColumnDescriptor,\n RuntimeColumnDescriptor,\n} from \"@vuu-ui/vuu-table-types\";\nimport { EventEmitter } from \"../event-emitter\";\nimport { VuuFilter, VuuRowDataItemType } from \"@vuu-ui/vuu-protocol-types\";\nimport { getTypedValue } from \"../form-utils\";\n\nconst singleValueFilterOps = new Set<SingleValueFilterClauseOp>([\n \"=\",\n \"!=\",\n \">\",\n \">=\",\n \"<\",\n \"<=\",\n \"contains\",\n \"starts\",\n \"ends\",\n]);\n\nexport const isValidFilterClauseOp = (op?: string): op is FilterClauseOp =>\n op === \"in\" || singleValueFilterOps.has(op as SingleValueFilterClauseOp);\n\nexport const isNamedFilter = (f?: Filter) =>\n f !== undefined && f.name !== undefined;\n\n// ... with type constraints\nexport const isSingleValueFilter = (\n f?: Partial<Filter>,\n): f is SingleValueFilterClause =>\n f !== undefined &&\n singleValueFilterOps.has(f.op as SingleValueFilterClauseOp);\n\nexport const isFilterClause = (\n f?: Partial<Filter>,\n): f is SingleValueFilterClause | MultiValueFilterClause =>\n f !== undefined && (isSingleValueFilter(f) || isMultiValueFilter(f));\n\nexport const isMultiValueFilter = (\n f?: Partial<Filter>,\n): f is MultiValueFilterClause => f !== undefined && f.op === \"in\";\n\nexport const isInFilter = (f: Partial<Filter>): f is MultiValueFilterClause =>\n f.op === \"in\";\nexport const isAndFilter = (f: Partial<Filter>): f is AndFilter =>\n f.op === \"and\";\nexport const isOrFilter = (f: Partial<Filter>): f is OrFilter => f.op === \"or\";\n\nexport const isCompleteFilter = (filter: Partial<Filter>): filter is Filter =>\n isSingleValueFilter(filter) &&\n filter.column !== undefined &&\n filter.op !== undefined &&\n filter.value !== undefined;\n\nexport function isMultiClauseFilter(\n f?: Partial<Filter> | FilterWithPartialClause,\n): f is MultiClauseFilter {\n return f !== undefined && (f.op === \"and\" || f.op === \"or\");\n}\n\nexport const applyFilterToColumns = (\n columns: RuntimeColumnDescriptor[],\n { filterStruct }: DataSourceFilter,\n) =>\n columns.map((column) => {\n // TODO this gives us a dependency on vuu-filters\n const filter = extractFilterForColumn(filterStruct, column.name);\n if (filter !== undefined) {\n return {\n ...column,\n filter,\n };\n } else if (column.filter) {\n return {\n ...column,\n filter: undefined,\n };\n } else {\n return column;\n }\n });\n\nexport const isFilteredColumn = (column: RuntimeColumnDescriptor) =>\n column.filter !== undefined;\n\nexport const stripFilterFromColumns = (columns: RuntimeColumnDescriptor[]) =>\n columns.map((col) => {\n const { filter, ...rest } = col;\n return filter ? rest : col;\n });\n\nexport const extractFilterForColumn = (\n filter: Filter | undefined,\n columnName: string,\n) => {\n if (isMultiClauseFilter(filter)) {\n return collectFiltersForColumn(filter, columnName);\n }\n if (isFilterClause(filter)) {\n return filter.column === columnName ? filter : undefined;\n }\n return undefined;\n};\n\nconst collectFiltersForColumn = (\n filter: MultiClauseFilter,\n columnName: string,\n) => {\n const { filters, op } = filter;\n const results: Filter[] = [];\n filters.forEach((filter) => {\n const ffc = extractFilterForColumn(filter, columnName);\n if (ffc) {\n results.push(ffc);\n }\n });\n if (results.length === 0) {\n return undefined;\n } else if (results.length === 1) {\n return results[0];\n }\n return {\n op,\n filters: results,\n };\n};\n\nexport type FilterEvents = {\n filter: (vuuFilter: VuuFilter) => void;\n};\n\nconst createFilterClause = (column: string, value: VuuRowDataItemType) =>\n typeof value === \"string\"\n ? `${column} contains \"${value}\"`\n : `${column} = ${value}`;\n\nexport class FilterAggregator extends EventEmitter<FilterEvents> {\n #columns = new Map<string, ColumnDescriptor>();\n #filters = new Map<string, VuuRowDataItemType>();\n\n addFilter(column: ColumnDescriptor, value: string | number) {\n this.#columns.set(column.name, column);\n const { serverDataType = \"string\" } = column;\n const typedValue = getTypedValue(value.toString(), serverDataType, true);\n\n this.#filters.set(column.name, typedValue);\n // this.emit(\"filter\", this.filter);\n }\n\n removeFilter(column: ColumnDescriptor) {\n if (this.#columns.has(column.name)) {\n this.#columns.delete(column.name);\n this.#filters.delete(column.name);\n return true;\n } else {\n return false;\n }\n }\n\n get filter(): VuuFilter {\n const { size } = this.#filters;\n if (size === 0) {\n return { filter: \"\" };\n } else {\n return {\n filter: Array.from(this.#filters.entries())\n .map((args) => createFilterClause(...args))\n .join(\" and \"),\n };\n }\n }\n}\n"],"names":["filter","EventEmitter","getTypedValue"],"mappings":"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"}
|
package/cjs/form-utils.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var htmlUtils = require('./html-utils.js');
|
|
4
|
+
var dataUtils = require('./data-utils.js');
|
|
4
5
|
|
|
5
6
|
const getFieldName = (target) => {
|
|
6
7
|
const saltFormField = htmlUtils.queryClosest(target, "[data-field]");
|
|
@@ -11,6 +12,33 @@ const getFieldName = (target) => {
|
|
|
11
12
|
throw Error("named form field not found");
|
|
12
13
|
}
|
|
13
14
|
};
|
|
15
|
+
function getTypedValue(value, type, throwIfUndefined = false) {
|
|
16
|
+
switch (type) {
|
|
17
|
+
case "int":
|
|
18
|
+
case "long": {
|
|
19
|
+
const typedValue = parseInt(value, 10);
|
|
20
|
+
if (dataUtils.isValidNumber(typedValue)) {
|
|
21
|
+
return typedValue;
|
|
22
|
+
} else if (throwIfUndefined) {
|
|
23
|
+
throw Error("SessionEditingForm getTypedValue");
|
|
24
|
+
} else {
|
|
25
|
+
return void 0;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
case "double": {
|
|
29
|
+
const typedValue = parseFloat(value);
|
|
30
|
+
if (dataUtils.isValidNumber(typedValue)) {
|
|
31
|
+
return typedValue;
|
|
32
|
+
}
|
|
33
|
+
return void 0;
|
|
34
|
+
}
|
|
35
|
+
case "boolean":
|
|
36
|
+
return value === "true" ? true : false;
|
|
37
|
+
default:
|
|
38
|
+
return value;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
14
41
|
|
|
15
42
|
exports.getFieldName = getFieldName;
|
|
43
|
+
exports.getTypedValue = getTypedValue;
|
|
16
44
|
//# sourceMappingURL=form-utils.js.map
|
package/cjs/form-utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form-utils.js","sources":["../src/form-utils.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"form-utils.js","sources":["../src/form-utils.ts"],"sourcesContent":["import {\n VuuColumnDataType,\n VuuRowDataItemType,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { KeyboardEvent, SyntheticEvent } from \"react\";\nimport { queryClosest } from \"./html-utils\";\nimport { isValidNumber } from \"./data-utils\";\n\n/**\n * Use with the following convention:\n *\n * <FormField data-field=\"my-field-name\">\n */\nexport const getFieldName = (target: EventTarget | HTMLElement): string => {\n const saltFormField = queryClosest(target, \"[data-field]\") as HTMLElement;\n const fieldName = saltFormField?.dataset.field;\n if (fieldName) {\n return fieldName;\n } else {\n throw Error(\"named form field not found\");\n }\n};\n\nexport type InputSource = \"typeahead-suggestion\" | \"text-input\";\n\nexport type CommitHandler<\n E extends HTMLElement = HTMLInputElement,\n T extends VuuRowDataItemType | undefined = string,\n> = (\n evt: SyntheticEvent<E> | KeyboardEvent<E>,\n value: T,\n source?: InputSource,\n) => void;\n\n/**\n * Convert a string value to the type appropriate for the associated\n * column or form field. Can be used when processing a string value\n * from an input used for user editing.\n *\n * @param value\n * @param type\n * @param throwIfUndefined\n */\nexport function getTypedValue(\n value: string,\n type: VuuColumnDataType,\n throwIfUndefined?: false,\n): VuuRowDataItemType | undefined;\nexport function getTypedValue(\n value: string,\n type: VuuColumnDataType,\n throwIfUndefined: true,\n): VuuRowDataItemType;\nexport function getTypedValue(\n value: string,\n type: VuuColumnDataType,\n throwIfUndefined = false,\n): VuuRowDataItemType | undefined {\n switch (type) {\n case \"int\":\n case \"long\": {\n const typedValue = parseInt(value, 10);\n if (isValidNumber(typedValue)) {\n return typedValue;\n } else if (throwIfUndefined) {\n throw Error(\"SessionEditingForm getTypedValue\");\n } else {\n return undefined;\n }\n }\n\n case \"double\": {\n const typedValue = parseFloat(value);\n if (isValidNumber(typedValue)) {\n return typedValue;\n }\n return undefined;\n }\n\n case \"boolean\":\n return value === \"true\" ? true : false;\n default:\n return value;\n }\n}\n"],"names":["queryClosest","isValidNumber"],"mappings":";;;;;AAaa,MAAA,YAAA,GAAe,CAAC,MAA8C,KAAA;AACzE,EAAM,MAAA,aAAA,GAAgBA,sBAAa,CAAA,MAAA,EAAQ,cAAc,CAAA,CAAA;AACzD,EAAM,MAAA,SAAA,GAAY,eAAe,OAAQ,CAAA,KAAA,CAAA;AACzC,EAAA,IAAI,SAAW,EAAA;AACb,IAAO,OAAA,SAAA,CAAA;AAAA,GACF,MAAA;AACL,IAAA,MAAM,MAAM,4BAA4B,CAAA,CAAA;AAAA,GAC1C;AACF,EAAA;AAgCO,SAAS,aACd,CAAA,KAAA,EACA,IACA,EAAA,gBAAA,GAAmB,KACa,EAAA;AAChC,EAAA,QAAQ,IAAM;AAAA,IACZ,KAAK,KAAA,CAAA;AAAA,IACL,KAAK,MAAQ,EAAA;AACX,MAAM,MAAA,UAAA,GAAa,QAAS,CAAA,KAAA,EAAO,EAAE,CAAA,CAAA;AACrC,MAAI,IAAAC,uBAAA,CAAc,UAAU,CAAG,EAAA;AAC7B,QAAO,OAAA,UAAA,CAAA;AAAA,iBACE,gBAAkB,EAAA;AAC3B,QAAA,MAAM,MAAM,kCAAkC,CAAA,CAAA;AAAA,OACzC,MAAA;AACL,QAAO,OAAA,KAAA,CAAA,CAAA;AAAA,OACT;AAAA,KACF;AAAA,IAEA,KAAK,QAAU,EAAA;AACb,MAAM,MAAA,UAAA,GAAa,WAAW,KAAK,CAAA,CAAA;AACnC,MAAI,IAAAA,uBAAA,CAAc,UAAU,CAAG,EAAA;AAC7B,QAAO,OAAA,UAAA,CAAA;AAAA,OACT;AACA,MAAO,OAAA,KAAA,CAAA,CAAA;AAAA,KACT;AAAA,IAEA,KAAK,SAAA;AACH,MAAO,OAAA,KAAA,KAAU,SAAS,IAAO,GAAA,KAAA,CAAA;AAAA,IACnC;AACE,MAAO,OAAA,KAAA,CAAA;AAAA,GACX;AACF;;;;;"}
|
package/cjs/index.js
CHANGED
|
@@ -259,6 +259,7 @@ exports.isStaticFeatures = featureUtils.isStaticFeatures;
|
|
|
259
259
|
exports.isTableSchema = featureUtils.isTableSchema;
|
|
260
260
|
exports.isWildcardSchema = featureUtils.isWildcardSchema;
|
|
261
261
|
exports.getFieldName = formUtils.getFieldName;
|
|
262
|
+
exports.getTypedValue = formUtils.getTypedValue;
|
|
262
263
|
exports.defaultValueFormatter = formattingUtils.defaultValueFormatter;
|
|
263
264
|
exports.getValueFormatter = formattingUtils.getValueFormatter;
|
|
264
265
|
exports.numericFormatter = formattingUtils.numericFormatter;
|
|
@@ -329,7 +330,6 @@ exports.resetRange = rangeUtils.resetRange;
|
|
|
329
330
|
exports.withinRange = rangeUtils.withinRange;
|
|
330
331
|
exports.actualRowPositioning = rowUtils.actualRowPositioning;
|
|
331
332
|
exports.asDataSourceRowObject = rowUtils.asDataSourceRowObject;
|
|
332
|
-
exports.getRowElementAtIndex = rowUtils.getRowElementAtIndex;
|
|
333
333
|
exports.virtualRowPositioning = rowUtils.virtualRowPositioning;
|
|
334
334
|
exports.RowSelected = selectionUtils.RowSelected;
|
|
335
335
|
exports.deselectItem = selectionUtils.deselectItem;
|
package/cjs/row-utils.js
CHANGED
|
@@ -23,22 +23,6 @@ const virtualRowPositioning = (rowHeight, virtualisedExtent, pctScrollTop) => [
|
|
|
23
23
|
},
|
|
24
24
|
true
|
|
25
25
|
];
|
|
26
|
-
const getRowElementAtIndex = (container, rowIndex) => {
|
|
27
|
-
if (rowIndex === -1) {
|
|
28
|
-
return null;
|
|
29
|
-
} else {
|
|
30
|
-
const activeRow = container.querySelector(
|
|
31
|
-
`[aria-rowindex="${rowIndex + 1}"]`
|
|
32
|
-
);
|
|
33
|
-
if (activeRow) {
|
|
34
|
-
return activeRow;
|
|
35
|
-
} else {
|
|
36
|
-
throw Error(
|
|
37
|
-
`getRowElementAtIndex no row found for index index ${rowIndex}`
|
|
38
|
-
);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
};
|
|
42
26
|
const asDataSourceRowObject = (row, columnMap) => {
|
|
43
27
|
const { [IS_LEAF]: isLeaf, [KEY]: key, [IDX]: index } = row;
|
|
44
28
|
const rowObject = {
|
|
@@ -56,6 +40,5 @@ const asDataSourceRowObject = (row, columnMap) => {
|
|
|
56
40
|
|
|
57
41
|
exports.actualRowPositioning = actualRowPositioning;
|
|
58
42
|
exports.asDataSourceRowObject = asDataSourceRowObject;
|
|
59
|
-
exports.getRowElementAtIndex = getRowElementAtIndex;
|
|
60
43
|
exports.virtualRowPositioning = virtualRowPositioning;
|
|
61
44
|
//# sourceMappingURL=row-utils.js.map
|
package/cjs/row-utils.js.map
CHANGED
|
@@ -1 +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\";\nimport { isRowSelected } from \"./selection-utils\";\n\nconst { IS_LEAF, KEY, IDX } = 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
|
|
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\";\nimport { isRowSelected } from \"./selection-utils\";\n\nconst { IS_LEAF, KEY, IDX } = 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 asDataSourceRowObject = (\n row: DataSourceRow,\n columnMap: ColumnMap,\n): DataSourceRowObject => {\n const { [IS_LEAF]: isLeaf, [KEY]: key, [IDX]: index } = row;\n\n const rowObject: DataSourceRowObject = {\n key,\n index,\n isGroupRow: !isLeaf,\n isSelected: isRowSelected(row),\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","isRowSelected"],"mappings":";;;;;AASA,MAAM,EAAE,OAAA,EAAS,GAAK,EAAA,GAAA,EAAQ,GAAAA,wBAAA,CAAA;AAajB,MAAA,oBAAA,GAAuB,CAAC,SAAsC,KAAA;AAAA,EACzE,CAAC,GAAA,KAAQ,GAAI,CAAA,GAAG,CAAI,GAAA,SAAA;AAAA,EACpB,CAAC,QAAA,KAAa,IAAK,CAAA,KAAA,CAAM,WAAW,SAAS,CAAA;AAAA,EAC7C,KAAA;AACF,EAAA;AAaO,MAAM,qBAAwB,GAAA,CACnC,SACA,EAAA,iBAAA,EACA,YACmB,KAAA;AAAA,EACnB,CAAC,GAAK,EAAA,MAAA,GAAS,CAAM,KAAA;AACnB,IAAM,MAAA,SAAA,GAAY,aAAa,OAAU,GAAA,iBAAA,CAAA;AACzC,IAAA,OAAA,CAAQ,GAAI,CAAA,GAAG,CAAI,GAAA,MAAA,IAAU,SAAY,GAAA,SAAA,CAAA;AAAA,GAC3C;AAAA;AAAA;AAAA;AAAA,EAIA,CAAC,QAAa,KAAA;AACZ,IAAM,MAAA,SAAA,GAAY,aAAa,OAAU,GAAA,iBAAA,CAAA;AACzC,IAAA,OAAO,IAAK,CAAA,KAAA,CAAA,CAAO,QAAW,GAAA,SAAA,IAAa,SAAS,CAAA,CAAA;AAAA,GACtD;AAAA,EACA,IAAA;AACF,EAAA;AAEa,MAAA,qBAAA,GAAwB,CACnC,GAAA,EACA,SACwB,KAAA;AACxB,EAAA,MAAM,EAAE,CAAC,OAAO,GAAG,MAAQ,EAAA,CAAC,GAAG,GAAG,GAAK,EAAA,CAAC,GAAG,GAAG,OAAU,GAAA,GAAA,CAAA;AAExD,EAAA,MAAM,SAAiC,GAAA;AAAA,IACrC,GAAA;AAAA,IACA,KAAA;AAAA,IACA,YAAY,CAAC,MAAA;AAAA,IACb,UAAA,EAAYC,6BAAc,GAAG,CAAA;AAAA,IAC7B,MAAM,EAAC;AAAA,GACT,CAAA;AAEA,EAAA,KAAA,MAAW,CAAC,OAAS,EAAA,MAAM,KAAK,MAAO,CAAA,OAAA,CAAQ,SAAS,CAAG,EAAA;AACzD,IAAA,SAAA,CAAU,IAAK,CAAA,OAAO,CAAI,GAAA,GAAA,CAAI,MAAM,CAAA,CAAA;AAAA,GACtC;AAEA,EAAO,OAAA,SAAA,CAAA;AACT;;;;;;"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { EventEmitter } from '../event-emitter.js';
|
|
2
|
+
import { getTypedValue } from '../form-utils.js';
|
|
2
3
|
|
|
3
4
|
var __typeError = (msg) => {
|
|
4
5
|
throw TypeError(msg);
|
|
@@ -6,7 +7,7 @@ var __typeError = (msg) => {
|
|
|
6
7
|
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
|
|
7
8
|
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
8
9
|
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
9
|
-
var _filters;
|
|
10
|
+
var _columns, _filters;
|
|
10
11
|
const singleValueFilterOps = /* @__PURE__ */ new Set([
|
|
11
12
|
"=",
|
|
12
13
|
"!=",
|
|
@@ -79,16 +80,40 @@ const collectFiltersForColumn = (filter, columnName) => {
|
|
|
79
80
|
filters: results
|
|
80
81
|
};
|
|
81
82
|
};
|
|
83
|
+
const createFilterClause = (column, value) => typeof value === "string" ? `${column} contains "${value}"` : `${column} = ${value}`;
|
|
82
84
|
class FilterAggregator extends EventEmitter {
|
|
83
85
|
constructor() {
|
|
84
86
|
super(...arguments);
|
|
87
|
+
__privateAdd(this, _columns, /* @__PURE__ */ new Map());
|
|
85
88
|
__privateAdd(this, _filters, /* @__PURE__ */ new Map());
|
|
86
89
|
}
|
|
87
90
|
addFilter(column, value) {
|
|
88
|
-
|
|
89
|
-
|
|
91
|
+
__privateGet(this, _columns).set(column.name, column);
|
|
92
|
+
const { serverDataType = "string" } = column;
|
|
93
|
+
const typedValue = getTypedValue(value.toString(), serverDataType, true);
|
|
94
|
+
__privateGet(this, _filters).set(column.name, typedValue);
|
|
95
|
+
}
|
|
96
|
+
removeFilter(column) {
|
|
97
|
+
if (__privateGet(this, _columns).has(column.name)) {
|
|
98
|
+
__privateGet(this, _columns).delete(column.name);
|
|
99
|
+
__privateGet(this, _filters).delete(column.name);
|
|
100
|
+
return true;
|
|
101
|
+
} else {
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
get filter() {
|
|
106
|
+
const { size } = __privateGet(this, _filters);
|
|
107
|
+
if (size === 0) {
|
|
108
|
+
return { filter: "" };
|
|
109
|
+
} else {
|
|
110
|
+
return {
|
|
111
|
+
filter: Array.from(__privateGet(this, _filters).entries()).map((args) => createFilterClause(...args)).join(" and ")
|
|
112
|
+
};
|
|
113
|
+
}
|
|
90
114
|
}
|
|
91
115
|
}
|
|
116
|
+
_columns = new WeakMap();
|
|
92
117
|
_filters = new WeakMap();
|
|
93
118
|
|
|
94
119
|
export { FilterAggregator, applyFilterToColumns, extractFilterForColumn, isAndFilter, isCompleteFilter, isFilterClause, isFilteredColumn, isInFilter, isMultiClauseFilter, isMultiValueFilter, isNamedFilter, isOrFilter, isSingleValueFilter, isValidFilterClauseOp, stripFilterFromColumns };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter-utils.js","sources":["../../src/filters/filter-utils.ts"],"sourcesContent":["import type { DataSourceFilter } from \"@vuu-ui/vuu-data-types\";\nimport {\n AndFilter,\n Filter,\n FilterClauseOp,\n FilterWithPartialClause,\n MultiClauseFilter,\n MultiValueFilterClause,\n OrFilter,\n SingleValueFilterClause,\n SingleValueFilterClauseOp,\n} from \"@vuu-ui/vuu-filter-types\";\nimport {
|
|
1
|
+
{"version":3,"file":"filter-utils.js","sources":["../../src/filters/filter-utils.ts"],"sourcesContent":["import type { DataSourceFilter } from \"@vuu-ui/vuu-data-types\";\nimport {\n AndFilter,\n Filter,\n FilterClauseOp,\n FilterWithPartialClause,\n MultiClauseFilter,\n MultiValueFilterClause,\n OrFilter,\n SingleValueFilterClause,\n SingleValueFilterClauseOp,\n} from \"@vuu-ui/vuu-filter-types\";\nimport {\n ColumnDescriptor,\n RuntimeColumnDescriptor,\n} from \"@vuu-ui/vuu-table-types\";\nimport { EventEmitter } from \"../event-emitter\";\nimport { VuuFilter, VuuRowDataItemType } from \"@vuu-ui/vuu-protocol-types\";\nimport { getTypedValue } from \"../form-utils\";\n\nconst singleValueFilterOps = new Set<SingleValueFilterClauseOp>([\n \"=\",\n \"!=\",\n \">\",\n \">=\",\n \"<\",\n \"<=\",\n \"contains\",\n \"starts\",\n \"ends\",\n]);\n\nexport const isValidFilterClauseOp = (op?: string): op is FilterClauseOp =>\n op === \"in\" || singleValueFilterOps.has(op as SingleValueFilterClauseOp);\n\nexport const isNamedFilter = (f?: Filter) =>\n f !== undefined && f.name !== undefined;\n\n// ... with type constraints\nexport const isSingleValueFilter = (\n f?: Partial<Filter>,\n): f is SingleValueFilterClause =>\n f !== undefined &&\n singleValueFilterOps.has(f.op as SingleValueFilterClauseOp);\n\nexport const isFilterClause = (\n f?: Partial<Filter>,\n): f is SingleValueFilterClause | MultiValueFilterClause =>\n f !== undefined && (isSingleValueFilter(f) || isMultiValueFilter(f));\n\nexport const isMultiValueFilter = (\n f?: Partial<Filter>,\n): f is MultiValueFilterClause => f !== undefined && f.op === \"in\";\n\nexport const isInFilter = (f: Partial<Filter>): f is MultiValueFilterClause =>\n f.op === \"in\";\nexport const isAndFilter = (f: Partial<Filter>): f is AndFilter =>\n f.op === \"and\";\nexport const isOrFilter = (f: Partial<Filter>): f is OrFilter => f.op === \"or\";\n\nexport const isCompleteFilter = (filter: Partial<Filter>): filter is Filter =>\n isSingleValueFilter(filter) &&\n filter.column !== undefined &&\n filter.op !== undefined &&\n filter.value !== undefined;\n\nexport function isMultiClauseFilter(\n f?: Partial<Filter> | FilterWithPartialClause,\n): f is MultiClauseFilter {\n return f !== undefined && (f.op === \"and\" || f.op === \"or\");\n}\n\nexport const applyFilterToColumns = (\n columns: RuntimeColumnDescriptor[],\n { filterStruct }: DataSourceFilter,\n) =>\n columns.map((column) => {\n // TODO this gives us a dependency on vuu-filters\n const filter = extractFilterForColumn(filterStruct, column.name);\n if (filter !== undefined) {\n return {\n ...column,\n filter,\n };\n } else if (column.filter) {\n return {\n ...column,\n filter: undefined,\n };\n } else {\n return column;\n }\n });\n\nexport const isFilteredColumn = (column: RuntimeColumnDescriptor) =>\n column.filter !== undefined;\n\nexport const stripFilterFromColumns = (columns: RuntimeColumnDescriptor[]) =>\n columns.map((col) => {\n const { filter, ...rest } = col;\n return filter ? rest : col;\n });\n\nexport const extractFilterForColumn = (\n filter: Filter | undefined,\n columnName: string,\n) => {\n if (isMultiClauseFilter(filter)) {\n return collectFiltersForColumn(filter, columnName);\n }\n if (isFilterClause(filter)) {\n return filter.column === columnName ? filter : undefined;\n }\n return undefined;\n};\n\nconst collectFiltersForColumn = (\n filter: MultiClauseFilter,\n columnName: string,\n) => {\n const { filters, op } = filter;\n const results: Filter[] = [];\n filters.forEach((filter) => {\n const ffc = extractFilterForColumn(filter, columnName);\n if (ffc) {\n results.push(ffc);\n }\n });\n if (results.length === 0) {\n return undefined;\n } else if (results.length === 1) {\n return results[0];\n }\n return {\n op,\n filters: results,\n };\n};\n\nexport type FilterEvents = {\n filter: (vuuFilter: VuuFilter) => void;\n};\n\nconst createFilterClause = (column: string, value: VuuRowDataItemType) =>\n typeof value === \"string\"\n ? `${column} contains \"${value}\"`\n : `${column} = ${value}`;\n\nexport class FilterAggregator extends EventEmitter<FilterEvents> {\n #columns = new Map<string, ColumnDescriptor>();\n #filters = new Map<string, VuuRowDataItemType>();\n\n addFilter(column: ColumnDescriptor, value: string | number) {\n this.#columns.set(column.name, column);\n const { serverDataType = \"string\" } = column;\n const typedValue = getTypedValue(value.toString(), serverDataType, true);\n\n this.#filters.set(column.name, typedValue);\n // this.emit(\"filter\", this.filter);\n }\n\n removeFilter(column: ColumnDescriptor) {\n if (this.#columns.has(column.name)) {\n this.#columns.delete(column.name);\n this.#filters.delete(column.name);\n return true;\n } else {\n return false;\n }\n }\n\n get filter(): VuuFilter {\n const { size } = this.#filters;\n if (size === 0) {\n return { filter: \"\" };\n } else {\n return {\n filter: Array.from(this.#filters.entries())\n .map((args) => createFilterClause(...args))\n .join(\" and \"),\n };\n }\n }\n}\n"],"names":["filter"],"mappings":"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"}
|
package/esm/form-utils.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { queryClosest } from './html-utils.js';
|
|
2
|
+
import { isValidNumber } from './data-utils.js';
|
|
2
3
|
|
|
3
4
|
const getFieldName = (target) => {
|
|
4
5
|
const saltFormField = queryClosest(target, "[data-field]");
|
|
@@ -9,6 +10,32 @@ const getFieldName = (target) => {
|
|
|
9
10
|
throw Error("named form field not found");
|
|
10
11
|
}
|
|
11
12
|
};
|
|
13
|
+
function getTypedValue(value, type, throwIfUndefined = false) {
|
|
14
|
+
switch (type) {
|
|
15
|
+
case "int":
|
|
16
|
+
case "long": {
|
|
17
|
+
const typedValue = parseInt(value, 10);
|
|
18
|
+
if (isValidNumber(typedValue)) {
|
|
19
|
+
return typedValue;
|
|
20
|
+
} else if (throwIfUndefined) {
|
|
21
|
+
throw Error("SessionEditingForm getTypedValue");
|
|
22
|
+
} else {
|
|
23
|
+
return void 0;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
case "double": {
|
|
27
|
+
const typedValue = parseFloat(value);
|
|
28
|
+
if (isValidNumber(typedValue)) {
|
|
29
|
+
return typedValue;
|
|
30
|
+
}
|
|
31
|
+
return void 0;
|
|
32
|
+
}
|
|
33
|
+
case "boolean":
|
|
34
|
+
return value === "true" ? true : false;
|
|
35
|
+
default:
|
|
36
|
+
return value;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
12
39
|
|
|
13
|
-
export { getFieldName };
|
|
40
|
+
export { getFieldName, getTypedValue };
|
|
14
41
|
//# sourceMappingURL=form-utils.js.map
|
package/esm/form-utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form-utils.js","sources":["../src/form-utils.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"form-utils.js","sources":["../src/form-utils.ts"],"sourcesContent":["import {\n VuuColumnDataType,\n VuuRowDataItemType,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { KeyboardEvent, SyntheticEvent } from \"react\";\nimport { queryClosest } from \"./html-utils\";\nimport { isValidNumber } from \"./data-utils\";\n\n/**\n * Use with the following convention:\n *\n * <FormField data-field=\"my-field-name\">\n */\nexport const getFieldName = (target: EventTarget | HTMLElement): string => {\n const saltFormField = queryClosest(target, \"[data-field]\") as HTMLElement;\n const fieldName = saltFormField?.dataset.field;\n if (fieldName) {\n return fieldName;\n } else {\n throw Error(\"named form field not found\");\n }\n};\n\nexport type InputSource = \"typeahead-suggestion\" | \"text-input\";\n\nexport type CommitHandler<\n E extends HTMLElement = HTMLInputElement,\n T extends VuuRowDataItemType | undefined = string,\n> = (\n evt: SyntheticEvent<E> | KeyboardEvent<E>,\n value: T,\n source?: InputSource,\n) => void;\n\n/**\n * Convert a string value to the type appropriate for the associated\n * column or form field. Can be used when processing a string value\n * from an input used for user editing.\n *\n * @param value\n * @param type\n * @param throwIfUndefined\n */\nexport function getTypedValue(\n value: string,\n type: VuuColumnDataType,\n throwIfUndefined?: false,\n): VuuRowDataItemType | undefined;\nexport function getTypedValue(\n value: string,\n type: VuuColumnDataType,\n throwIfUndefined: true,\n): VuuRowDataItemType;\nexport function getTypedValue(\n value: string,\n type: VuuColumnDataType,\n throwIfUndefined = false,\n): VuuRowDataItemType | undefined {\n switch (type) {\n case \"int\":\n case \"long\": {\n const typedValue = parseInt(value, 10);\n if (isValidNumber(typedValue)) {\n return typedValue;\n } else if (throwIfUndefined) {\n throw Error(\"SessionEditingForm getTypedValue\");\n } else {\n return undefined;\n }\n }\n\n case \"double\": {\n const typedValue = parseFloat(value);\n if (isValidNumber(typedValue)) {\n return typedValue;\n }\n return undefined;\n }\n\n case \"boolean\":\n return value === \"true\" ? true : false;\n default:\n return value;\n }\n}\n"],"names":[],"mappings":";;;AAaa,MAAA,YAAA,GAAe,CAAC,MAA8C,KAAA;AACzE,EAAM,MAAA,aAAA,GAAgB,YAAa,CAAA,MAAA,EAAQ,cAAc,CAAA,CAAA;AACzD,EAAM,MAAA,SAAA,GAAY,eAAe,OAAQ,CAAA,KAAA,CAAA;AACzC,EAAA,IAAI,SAAW,EAAA;AACb,IAAO,OAAA,SAAA,CAAA;AAAA,GACF,MAAA;AACL,IAAA,MAAM,MAAM,4BAA4B,CAAA,CAAA;AAAA,GAC1C;AACF,EAAA;AAgCO,SAAS,aACd,CAAA,KAAA,EACA,IACA,EAAA,gBAAA,GAAmB,KACa,EAAA;AAChC,EAAA,QAAQ,IAAM;AAAA,IACZ,KAAK,KAAA,CAAA;AAAA,IACL,KAAK,MAAQ,EAAA;AACX,MAAM,MAAA,UAAA,GAAa,QAAS,CAAA,KAAA,EAAO,EAAE,CAAA,CAAA;AACrC,MAAI,IAAA,aAAA,CAAc,UAAU,CAAG,EAAA;AAC7B,QAAO,OAAA,UAAA,CAAA;AAAA,iBACE,gBAAkB,EAAA;AAC3B,QAAA,MAAM,MAAM,kCAAkC,CAAA,CAAA;AAAA,OACzC,MAAA;AACL,QAAO,OAAA,KAAA,CAAA,CAAA;AAAA,OACT;AAAA,KACF;AAAA,IAEA,KAAK,QAAU,EAAA;AACb,MAAM,MAAA,UAAA,GAAa,WAAW,KAAK,CAAA,CAAA;AACnC,MAAI,IAAA,aAAA,CAAc,UAAU,CAAG,EAAA;AAC7B,QAAO,OAAA,UAAA,CAAA;AAAA,OACT;AACA,MAAO,OAAA,KAAA,CAAA,CAAA;AAAA,KACT;AAAA,IAEA,KAAK,SAAA;AACH,MAAO,OAAA,KAAA,KAAU,SAAS,IAAO,GAAA,KAAA,CAAA;AAAA,IACnC;AACE,MAAO,OAAA,KAAA,CAAA;AAAA,GACX;AACF;;;;"}
|
package/esm/index.js
CHANGED
|
@@ -21,7 +21,7 @@ export { dateFilterAsQuery, filterAsQuery, removeColumnFromFilter } from './filt
|
|
|
21
21
|
export { createEl, dispatchCustomEvent, dispatchKeyboardEvent, dispatchMouseEvent, focusFirstFocusableElement, getClosest, getClosestIndexItem, getElementByDataIndex, getElementDataIndex, getFocusableElement, getScrollbarSize, hasOpenOptionList, isDateInput, isInputElement, isSelectableElement, queryClosest } from './html-utils.js';
|
|
22
22
|
export { EventEmitter } from './event-emitter.js';
|
|
23
23
|
export { assertComponentRegistered, assertComponentsRegistered, byModule, env, featureFromJson, getCustomAndTableFeatures, getFilterTableFeatures, hasFilterTableFeatureProps, isCustomFeature, isStaticFeatures, isTableSchema, isWildcardSchema } from './feature-utils.js';
|
|
24
|
-
export { getFieldName } from './form-utils.js';
|
|
24
|
+
export { getFieldName, getTypedValue } from './form-utils.js';
|
|
25
25
|
export { defaultValueFormatter, getValueFormatter, numericFormatter } from './formatting-utils.js';
|
|
26
26
|
export { getUniqueId } from './getUniqueId.js';
|
|
27
27
|
export { addGroupColumn } from './group-utils.js';
|
|
@@ -43,7 +43,7 @@ export { debounce, throttle } from './perf-utils.js';
|
|
|
43
43
|
export { DeferredPromise } from './promise-utils.js';
|
|
44
44
|
export { isActionMessage, isEditCellRequest, isOpenDialogAction, isOpenSessionTableDialogMessage, isRequestResponse, isSessionTable, isSessionTableActionMessage, isViewportRpcRequest, isVuuMenuRpcRequest, viewportRpcRequest, vuuAddRowRequest, vuuDeleteRowRequest, vuuEditCellRequest } from './protocol-message-utils.js';
|
|
45
45
|
export { NULL_RANGE, WindowRange, getFullRange, rangeNewItems, rangesAreSame, resetRange, withinRange } from './range-utils.js';
|
|
46
|
-
export { actualRowPositioning, asDataSourceRowObject,
|
|
46
|
+
export { actualRowPositioning, asDataSourceRowObject, virtualRowPositioning } from './row-utils.js';
|
|
47
47
|
export { RowSelected, deselectItem, expandSelection, getSelectionStatus, isRowSelected, isRowSelectedLast, isSelected, selectItem, selectionCount } from './selection-utils.js';
|
|
48
48
|
export { VuuShellLocation } from './shell-layout-types.js';
|
|
49
49
|
export { addSortColumn, setSortColumn, toggleOrApplySort } from './sort-utils.js';
|
package/esm/row-utils.js
CHANGED
|
@@ -21,22 +21,6 @@ const virtualRowPositioning = (rowHeight, virtualisedExtent, pctScrollTop) => [
|
|
|
21
21
|
},
|
|
22
22
|
true
|
|
23
23
|
];
|
|
24
|
-
const getRowElementAtIndex = (container, rowIndex) => {
|
|
25
|
-
if (rowIndex === -1) {
|
|
26
|
-
return null;
|
|
27
|
-
} else {
|
|
28
|
-
const activeRow = container.querySelector(
|
|
29
|
-
`[aria-rowindex="${rowIndex + 1}"]`
|
|
30
|
-
);
|
|
31
|
-
if (activeRow) {
|
|
32
|
-
return activeRow;
|
|
33
|
-
} else {
|
|
34
|
-
throw Error(
|
|
35
|
-
`getRowElementAtIndex no row found for index index ${rowIndex}`
|
|
36
|
-
);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
};
|
|
40
24
|
const asDataSourceRowObject = (row, columnMap) => {
|
|
41
25
|
const { [IS_LEAF]: isLeaf, [KEY]: key, [IDX]: index } = row;
|
|
42
26
|
const rowObject = {
|
|
@@ -52,5 +36,5 @@ const asDataSourceRowObject = (row, columnMap) => {
|
|
|
52
36
|
return rowObject;
|
|
53
37
|
};
|
|
54
38
|
|
|
55
|
-
export { actualRowPositioning, asDataSourceRowObject,
|
|
39
|
+
export { actualRowPositioning, asDataSourceRowObject, virtualRowPositioning };
|
|
56
40
|
//# sourceMappingURL=row-utils.js.map
|
package/esm/row-utils.js.map
CHANGED
|
@@ -1 +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\";\nimport { isRowSelected } from \"./selection-utils\";\n\nconst { IS_LEAF, KEY, IDX } = 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
|
|
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\";\nimport { isRowSelected } from \"./selection-utils\";\n\nconst { IS_LEAF, KEY, IDX } = 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 asDataSourceRowObject = (\n row: DataSourceRow,\n columnMap: ColumnMap,\n): DataSourceRowObject => {\n const { [IS_LEAF]: isLeaf, [KEY]: key, [IDX]: index } = row;\n\n const rowObject: DataSourceRowObject = {\n key,\n index,\n isGroupRow: !isLeaf,\n isSelected: isRowSelected(row),\n data: {},\n };\n\n for (const [colName, colIdx] of Object.entries(columnMap)) {\n rowObject.data[colName] = row[colIdx];\n }\n\n return rowObject;\n};\n"],"names":[],"mappings":";;;AASA,MAAM,EAAE,OAAA,EAAS,GAAK,EAAA,GAAA,EAAQ,GAAA,YAAA,CAAA;AAajB,MAAA,oBAAA,GAAuB,CAAC,SAAsC,KAAA;AAAA,EACzE,CAAC,GAAA,KAAQ,GAAI,CAAA,GAAG,CAAI,GAAA,SAAA;AAAA,EACpB,CAAC,QAAA,KAAa,IAAK,CAAA,KAAA,CAAM,WAAW,SAAS,CAAA;AAAA,EAC7C,KAAA;AACF,EAAA;AAaO,MAAM,qBAAwB,GAAA,CACnC,SACA,EAAA,iBAAA,EACA,YACmB,KAAA;AAAA,EACnB,CAAC,GAAK,EAAA,MAAA,GAAS,CAAM,KAAA;AACnB,IAAM,MAAA,SAAA,GAAY,aAAa,OAAU,GAAA,iBAAA,CAAA;AACzC,IAAA,OAAA,CAAQ,GAAI,CAAA,GAAG,CAAI,GAAA,MAAA,IAAU,SAAY,GAAA,SAAA,CAAA;AAAA,GAC3C;AAAA;AAAA;AAAA;AAAA,EAIA,CAAC,QAAa,KAAA;AACZ,IAAM,MAAA,SAAA,GAAY,aAAa,OAAU,GAAA,iBAAA,CAAA;AACzC,IAAA,OAAO,IAAK,CAAA,KAAA,CAAA,CAAO,QAAW,GAAA,SAAA,IAAa,SAAS,CAAA,CAAA;AAAA,GACtD;AAAA,EACA,IAAA;AACF,EAAA;AAEa,MAAA,qBAAA,GAAwB,CACnC,GAAA,EACA,SACwB,KAAA;AACxB,EAAA,MAAM,EAAE,CAAC,OAAO,GAAG,MAAQ,EAAA,CAAC,GAAG,GAAG,GAAK,EAAA,CAAC,GAAG,GAAG,OAAU,GAAA,GAAA,CAAA;AAExD,EAAA,MAAM,SAAiC,GAAA;AAAA,IACrC,GAAA;AAAA,IACA,KAAA;AAAA,IACA,YAAY,CAAC,MAAA;AAAA,IACb,UAAA,EAAY,cAAc,GAAG,CAAA;AAAA,IAC7B,MAAM,EAAC;AAAA,GACT,CAAA;AAEA,EAAA,KAAA,MAAW,CAAC,OAAS,EAAA,MAAM,KAAK,MAAO,CAAA,OAAA,CAAQ,SAAS,CAAG,EAAA;AACzD,IAAA,SAAA,CAAU,IAAK,CAAA,OAAO,CAAI,GAAA,GAAA,CAAI,MAAM,CAAA,CAAA;AAAA,GACtC;AAEA,EAAO,OAAA,SAAA,CAAA;AACT;;;;"}
|
package/package.json
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.
|
|
2
|
+
"version": "0.9.0",
|
|
3
3
|
"author": "heswell",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"types": "types/index.d.ts",
|
|
6
6
|
"devDependencies": {
|
|
7
|
-
"@vuu-ui/vuu-data-types": "0.
|
|
8
|
-
"@vuu-ui/vuu-table-types": "0.
|
|
9
|
-
"@vuu-ui/vuu-filter-types": "0.
|
|
10
|
-
"@vuu-ui/vuu-protocol-types": "0.
|
|
7
|
+
"@vuu-ui/vuu-data-types": "0.9.0",
|
|
8
|
+
"@vuu-ui/vuu-table-types": "0.9.0",
|
|
9
|
+
"@vuu-ui/vuu-filter-types": "0.9.0",
|
|
10
|
+
"@vuu-ui/vuu-protocol-types": "0.9.0"
|
|
11
11
|
},
|
|
12
12
|
"peerDependencies": {
|
|
13
13
|
"@internationalized/date": "^3.0.0",
|
|
14
|
-
"@vuu-ui/vuu-filter-parser": "0.
|
|
14
|
+
"@vuu-ui/vuu-filter-parser": "0.9.0",
|
|
15
15
|
"clsx": "^2.0.0",
|
|
16
16
|
"react": ">=17.0.2",
|
|
17
17
|
"react-dom": ">=17.0.2"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
2
|
import type { DataSourceFilter } from "@vuu-ui/vuu-data-types";
|
|
3
3
|
import { AndFilter, Filter, FilterClauseOp, FilterWithPartialClause, MultiClauseFilter, MultiValueFilterClause, OrFilter, SingleValueFilterClause } from "@vuu-ui/vuu-filter-types";
|
|
4
|
-
import { RuntimeColumnDescriptor } from "@vuu-ui/vuu-table-types";
|
|
4
|
+
import { ColumnDescriptor, RuntimeColumnDescriptor } from "@vuu-ui/vuu-table-types";
|
|
5
5
|
import { EventEmitter } from "../event-emitter";
|
|
6
6
|
import { VuuFilter } from "@vuu-ui/vuu-protocol-types";
|
|
7
7
|
export declare const isValidFilterClauseOp: (op?: string) => op is FilterClauseOp;
|
|
@@ -61,5 +61,7 @@ export type FilterEvents = {
|
|
|
61
61
|
};
|
|
62
62
|
export declare class FilterAggregator extends EventEmitter<FilterEvents> {
|
|
63
63
|
#private;
|
|
64
|
-
addFilter(column:
|
|
64
|
+
addFilter(column: ColumnDescriptor, value: string | number): void;
|
|
65
|
+
removeFilter(column: ColumnDescriptor): boolean;
|
|
66
|
+
get filter(): VuuFilter;
|
|
65
67
|
}
|
package/types/form-utils.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { VuuRowDataItemType } from "@vuu-ui/vuu-protocol-types";
|
|
1
|
+
import { VuuColumnDataType, VuuRowDataItemType } from "@vuu-ui/vuu-protocol-types";
|
|
2
2
|
import { KeyboardEvent, SyntheticEvent } from "react";
|
|
3
3
|
/**
|
|
4
4
|
* Use with the following convention:
|
|
@@ -8,3 +8,14 @@ import { KeyboardEvent, SyntheticEvent } from "react";
|
|
|
8
8
|
export declare const getFieldName: (target: EventTarget | HTMLElement) => string;
|
|
9
9
|
export type InputSource = "typeahead-suggestion" | "text-input";
|
|
10
10
|
export type CommitHandler<E extends HTMLElement = HTMLInputElement, T extends VuuRowDataItemType | undefined = string> = (evt: SyntheticEvent<E> | KeyboardEvent<E>, value: T, source?: InputSource) => void;
|
|
11
|
+
/**
|
|
12
|
+
* Convert a string value to the type appropriate for the associated
|
|
13
|
+
* column or form field. Can be used when processing a string value
|
|
14
|
+
* from an input used for user editing.
|
|
15
|
+
*
|
|
16
|
+
* @param value
|
|
17
|
+
* @param type
|
|
18
|
+
* @param throwIfUndefined
|
|
19
|
+
*/
|
|
20
|
+
export declare function getTypedValue(value: string, type: VuuColumnDataType, throwIfUndefined?: false): VuuRowDataItemType | undefined;
|
|
21
|
+
export declare function getTypedValue(value: string, type: VuuColumnDataType, throwIfUndefined: true): VuuRowDataItemType;
|
package/types/row-utils.d.ts
CHANGED
|
@@ -20,5 +20,4 @@ export declare const actualRowPositioning: (rowHeight: number) => RowPositioning
|
|
|
20
20
|
* @returns
|
|
21
21
|
*/
|
|
22
22
|
export declare const virtualRowPositioning: (rowHeight: number, virtualisedExtent: number, pctScrollTop: MutableRefObject<number>) => RowPositioning;
|
|
23
|
-
export declare const getRowElementAtIndex: (container: HTMLDivElement | EventTarget, rowIndex: number) => HTMLElement | null;
|
|
24
23
|
export declare const asDataSourceRowObject: (row: DataSourceRow, columnMap: ColumnMap) => DataSourceRowObject;
|