@vuu-ui/vuu-utils 0.13.114 → 0.13.115-alpha.2
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/packages/vuu-utils/src/column-utils.js +14 -10
- package/cjs/packages/vuu-utils/src/column-utils.js.map +1 -1
- package/cjs/packages/vuu-utils/src/component-registry.js +8 -4
- package/cjs/packages/vuu-utils/src/component-registry.js.map +1 -1
- package/cjs/packages/vuu-utils/src/filters/filter-utils.js +2 -0
- package/cjs/packages/vuu-utils/src/filters/filter-utils.js.map +1 -1
- package/cjs/packages/vuu-utils/src/formatting-utils.js +20 -1
- package/cjs/packages/vuu-utils/src/formatting-utils.js.map +1 -1
- package/cjs/packages/vuu-utils/src/index.js +3 -2
- package/cjs/packages/vuu-utils/src/index.js.map +1 -1
- package/cjs/packages/vuu-utils/src/round-decimal.js +40 -2
- package/cjs/packages/vuu-utils/src/round-decimal.js.map +1 -1
- package/cjs/packages/vuu-utils/src/row-utils.js +3 -3
- package/cjs/packages/vuu-utils/src/row-utils.js.map +1 -1
- package/cjs/packages/vuu-utils/src/tree-utils.js.map +1 -1
- package/esm/packages/vuu-utils/src/column-utils.js +14 -10
- package/esm/packages/vuu-utils/src/column-utils.js.map +1 -1
- package/esm/packages/vuu-utils/src/component-registry.js +8 -4
- package/esm/packages/vuu-utils/src/component-registry.js.map +1 -1
- package/esm/packages/vuu-utils/src/filters/filter-utils.js +2 -1
- package/esm/packages/vuu-utils/src/filters/filter-utils.js.map +1 -1
- package/esm/packages/vuu-utils/src/formatting-utils.js +21 -2
- package/esm/packages/vuu-utils/src/formatting-utils.js.map +1 -1
- package/esm/packages/vuu-utils/src/index.js +2 -3
- package/esm/packages/vuu-utils/src/index.js.map +1 -1
- package/esm/packages/vuu-utils/src/round-decimal.js +39 -3
- package/esm/packages/vuu-utils/src/round-decimal.js.map +1 -1
- package/esm/packages/vuu-utils/src/row-utils.js +3 -3
- package/esm/packages/vuu-utils/src/row-utils.js.map +1 -1
- package/esm/packages/vuu-utils/src/tree-utils.js.map +1 -1
- package/package.json +6 -6
- package/types/column-utils.d.ts +13 -13
- package/types/component-registry.d.ts +7 -7
- package/types/data-utils.d.ts +1 -1
- package/types/filters/filter-utils.d.ts +2 -1
- package/types/formatting-utils.d.ts +1 -1
- package/types/index.d.ts +0 -1
- package/types/round-decimal.d.ts +2 -0
- package/types/row-utils.d.ts +2 -1
- package/cjs/packages/vuu-utils/src/DataWindow.js +0 -76
- package/cjs/packages/vuu-utils/src/DataWindow.js.map +0 -1
- package/esm/packages/vuu-utils/src/DataWindow.js +0 -74
- package/esm/packages/vuu-utils/src/DataWindow.js.map +0 -1
- package/types/DataWindow.d.ts +0 -39
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter-utils.js","sources":["../../../../../../../packages/vuu-utils/src/filters/filter-utils.ts"],"sourcesContent":["import type { DataSourceFilter } from \"@vuu-ui/vuu-data-types\";\nimport {\n ColumnFilterOp,\n ColumnFilterValue,\n ExtendedFilter,\n Filter,\n FilterClauseOp,\n FilterClauseOpBetween,\n FilterContainerFilter,\n FilterWithPartialClause,\n MultiClauseFilter,\n MultiValueFilterClause,\n SingleValueFilterClause,\n SingleValueFilterClauseOp,\n} from \"@vuu-ui/vuu-filter-types\";\nimport { SerializableFilter } from \"@vuu-ui/vuu-filters/src/filter-container/ExtendedSingleValueFilterClause\";\nimport {\n ColumnDescriptor,\n RuntimeColumnDescriptor,\n} from \"@vuu-ui/vuu-table-types\";\n\nconst singleValueFilterOps = new Set<SingleValueFilterClauseOp>([\n \"=\",\n \"!=\",\n \">\",\n \">=\",\n \"<\",\n \"<=\",\n \"contains\",\n \"starts\",\n \"ends\",\n]);\n\nexport const isBetweenOperator = (\n op: ColumnFilterOp,\n): op is FilterClauseOpBetween =>\n op === \"between\" || op === \"between-inclusive\";\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 isSerializableFilter = (f: object): f is SerializableFilter =>\n isSingleValueFilter(f) &&\n \"asQuery\" in f &&\n typeof f[\"asQuery\"] === \"function\";\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 = (\n f?: Partial<Filter>,\n): f is MultiClauseFilter<\"and\"> => f?.op === \"and\";\n\nexport const isBetweenFilter = (\n f?: Filter,\n): f is MultiClauseFilter<\"and\", SingleValueFilterClause> =>\n isAndFilter(f) &&\n f.filters.length === 2 &&\n f.filters[0].column === f.filters[1].column &&\n ((f.filters[0].op === \">\" && f.filters[1].op === \"<\") ||\n (f.filters[0].op === \">=\" && f.filters[1].op === \"<=\"));\n\nexport const isOrFilter = (f?: Partial<Filter>): f is MultiClauseFilter<\"or\"> =>\n 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 isExtendedFilter = (f: Filter): f is ExtendedFilter =>\n typeof (f as ExtendedFilter).extendedOptions === \"object\";\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\n// Just until we fully support bool values in filters\nconst stringifyBoolean = (value: string | number | boolean) =>\n typeof value === \"boolean\" ? \"${filter.value}\" : value;\n\nexport const getColumnValueFromFilter = (\n column: ColumnDescriptor,\n operator: ColumnFilterOp,\n filter?: FilterContainerFilter,\n): ColumnFilterValue => {\n if (isSingleValueFilter(filter)) {\n if (filter.column === column.name) {\n if (operator.startsWith(\"between\")) {\n if (filter.op === \"=\") {\n return [`${filter.value}`, \"\"];\n } else if (filter.op === \"<\") {\n return [\"\", `${filter.value}`];\n }\n } else {\n return stringifyBoolean(filter.value);\n }\n }\n } else if (isBetweenFilter(filter)) {\n if (filter.filters[0].column === column.name) {\n const [{ value: v1 }, { value: v2 }] = filter.filters;\n return [`${v1}`, `${v2}`];\n } else {\n return [\"\", \"\"];\n }\n } else if (isAndFilter(filter)) {\n const filterForColumn = filter.filters.find((f) =>\n isBetweenFilter(f)\n ? f.filters[0].column === column.name\n : f.column === column.name,\n );\n if (isSingleValueFilter(filterForColumn)) {\n return stringifyBoolean(filterForColumn.value);\n } else if (\n operator.startsWith(\"between\") &&\n isBetweenFilter(filterForColumn)\n ) {\n const [{ value: v1 }, { value: v2 }] = filterForColumn.filters;\n return [`${v1}`, `${v2}`];\n }\n }\n if (operator.startsWith(\"between\")) {\n if (column.type === \"time\") {\n return [\"00:00:00\", \"23:59:59\"];\n } else {\n return [\"\", \"\"];\n }\n } else {\n return \"\";\n }\n};\n\ntype BetweenFilter = MultiClauseFilter<\"and\", SingleValueFilterClause>;\ntype ChildFilterClause = SingleValueFilterClause | BetweenFilter;\n\nconst betweenFiltersAreEqual = (f1: BetweenFilter, f2: BetweenFilter) => {\n const [from1, to1] = f1.filters;\n const [from2, to2] = f2.filters;\n return filtersAreEqual(from1, from2) && filtersAreEqual(to1, to2);\n};\n\nconst singleValueFilterClausesAreEqual = (\n f1: SingleValueFilterClause,\n f2: SingleValueFilterClause,\n) => f1.column === f2.column && f1.op === f2.op && f1.value === f2.value;\n\nconst findEqualFilter =\n (filters: ChildFilterClause[]) => (filter: ChildFilterClause) => {\n if (isBetweenFilter(filter)) {\n const target = filters.find(\n (f) => isBetweenFilter(f) && betweenFiltersAreEqual(f, filter),\n );\n return target !== undefined;\n } else {\n // A FilterContainerFilter only has one filter clause per column\n const target = filters.find((f) => f.column === filter.column);\n if (target) {\n return target.op === filter.op && target.value === filter.value;\n }\n }\n return false;\n };\n\nexport const filtersAreEqual = (\n f1: FilterContainerFilter | null | undefined,\n f2: FilterContainerFilter | null | undefined,\n): boolean => {\n if (f1 == null && f2 == null) {\n return true;\n } else if (f1 == null || f2 == null) {\n return false;\n } else if (isSingleValueFilter(f1) && isSingleValueFilter(f2)) {\n return singleValueFilterClausesAreEqual(f1, f2);\n } else if (isBetweenFilter(f1) && isBetweenFilter(f2)) {\n return betweenFiltersAreEqual(f1, f2);\n } else if (isAndFilter(f1) && isAndFilter(f2)) {\n if (f1.filters.length === f2.filters.length) {\n return f1.filters.every(findEqualFilter(f2.filters));\n }\n }\n\n return false;\n};\n"],"names":["filter"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"filter-utils.js","sources":["../../../../../../../packages/vuu-utils/src/filters/filter-utils.ts"],"sourcesContent":["import type { DataSourceFilter } from \"@vuu-ui/vuu-data-types\";\nimport {\n ColumnFilterOp,\n ColumnFilterValue,\n ExtendedFilter,\n Filter,\n FilterClauseOp,\n FilterClauseOpBetween,\n FilterContainerFilter,\n FilterWithPartialClause,\n MultiClauseFilter,\n MultiValueFilterClause,\n SingleValueFilterClause,\n SingleValueFilterClauseOp,\n} from \"@vuu-ui/vuu-filter-types\";\nimport { SerializableFilter } from \"@vuu-ui/vuu-filters/src/filter-container/ExtendedSingleValueFilterClause\";\nimport {\n ColumnDescriptor,\n RuntimeColumnDescriptor,\n} from \"@vuu-ui/vuu-table-types\";\n\nconst singleValueFilterOps = new Set<SingleValueFilterClauseOp>([\n \"=\",\n \"!=\",\n \">\",\n \">=\",\n \"<\",\n \"<=\",\n \"contains\",\n \"starts\",\n \"ends\",\n]);\n\nexport const isBetweenOperator = (\n op: ColumnFilterOp,\n): op is FilterClauseOpBetween =>\n op === \"between\" || op === \"between-inclusive\";\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 isSerializableFilter = (f: object): f is SerializableFilter =>\n isSingleValueFilter(f) &&\n \"asQuery\" in f &&\n typeof f[\"asQuery\"] === \"function\";\n\nexport const isFilter = (f: unknown): f is Filter =>\n typeof f === \"object\" &&\n f !== null &&\n (isFilterClause(f) || isMultiClauseFilter(f));\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 = (\n f?: Partial<Filter>,\n): f is MultiClauseFilter<\"and\"> => f?.op === \"and\";\n\nexport const isBetweenFilter = (\n f?: Filter,\n): f is MultiClauseFilter<\"and\", SingleValueFilterClause> =>\n isAndFilter(f) &&\n f.filters.length === 2 &&\n f.filters[0].column === f.filters[1].column &&\n ((f.filters[0].op === \">\" && f.filters[1].op === \"<\") ||\n (f.filters[0].op === \">=\" && f.filters[1].op === \"<=\"));\n\nexport const isOrFilter = (f?: Partial<Filter>): f is MultiClauseFilter<\"or\"> =>\n 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 isExtendedFilter = (f: Filter): f is ExtendedFilter =>\n typeof (f as ExtendedFilter).extendedOptions === \"object\";\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\n// Just until we fully support bool values in filters\nconst stringifyBoolean = (value: string | number | boolean) =>\n typeof value === \"boolean\" ? \"${filter.value}\" : value;\n\nexport const getColumnValueFromFilter = (\n column: ColumnDescriptor,\n operator: ColumnFilterOp,\n filter?: FilterContainerFilter,\n): ColumnFilterValue => {\n if (isSingleValueFilter(filter)) {\n if (filter.column === column.name) {\n if (operator.startsWith(\"between\")) {\n if (filter.op === \"=\") {\n return [`${filter.value}`, \"\"];\n } else if (filter.op === \"<\") {\n return [\"\", `${filter.value}`];\n }\n } else {\n return stringifyBoolean(filter.value);\n }\n }\n } else if (isBetweenFilter(filter)) {\n if (filter.filters[0].column === column.name) {\n const [{ value: v1 }, { value: v2 }] = filter.filters;\n return [`${v1}`, `${v2}`];\n } else {\n return [\"\", \"\"];\n }\n } else if (isAndFilter(filter)) {\n const filterForColumn = filter.filters.find((f) =>\n isBetweenFilter(f)\n ? f.filters[0].column === column.name\n : f.column === column.name,\n );\n if (isSingleValueFilter(filterForColumn)) {\n return stringifyBoolean(filterForColumn.value);\n } else if (\n operator.startsWith(\"between\") &&\n isBetweenFilter(filterForColumn)\n ) {\n const [{ value: v1 }, { value: v2 }] = filterForColumn.filters;\n return [`${v1}`, `${v2}`];\n }\n }\n if (operator.startsWith(\"between\")) {\n if (column.type === \"time\") {\n return [\"00:00:00\", \"23:59:59\"];\n } else {\n return [\"\", \"\"];\n }\n } else {\n return \"\";\n }\n};\n\ntype BetweenFilter = MultiClauseFilter<\"and\", SingleValueFilterClause>;\ntype ChildFilterClause = SingleValueFilterClause | BetweenFilter;\n\nconst betweenFiltersAreEqual = (f1: BetweenFilter, f2: BetweenFilter) => {\n const [from1, to1] = f1.filters;\n const [from2, to2] = f2.filters;\n return filtersAreEqual(from1, from2) && filtersAreEqual(to1, to2);\n};\n\nconst singleValueFilterClausesAreEqual = (\n f1: SingleValueFilterClause,\n f2: SingleValueFilterClause,\n) => f1.column === f2.column && f1.op === f2.op && f1.value === f2.value;\n\nconst findEqualFilter =\n (filters: ChildFilterClause[]) => (filter: ChildFilterClause) => {\n if (isBetweenFilter(filter)) {\n const target = filters.find(\n (f) => isBetweenFilter(f) && betweenFiltersAreEqual(f, filter),\n );\n return target !== undefined;\n } else {\n // A FilterContainerFilter only has one filter clause per column\n const target = filters.find((f) => f.column === filter.column);\n if (target) {\n return target.op === filter.op && target.value === filter.value;\n }\n }\n return false;\n };\n\nexport const filtersAreEqual = (\n f1: FilterContainerFilter | null | undefined,\n f2: FilterContainerFilter | null | undefined,\n): boolean => {\n if (f1 == null && f2 == null) {\n return true;\n } else if (f1 == null || f2 == null) {\n return false;\n } else if (isSingleValueFilter(f1) && isSingleValueFilter(f2)) {\n return singleValueFilterClausesAreEqual(f1, f2);\n } else if (isBetweenFilter(f1) && isBetweenFilter(f2)) {\n return betweenFiltersAreEqual(f1, f2);\n } else if (isAndFilter(f1) && isAndFilter(f2)) {\n if (f1.filters.length === f2.filters.length) {\n return f1.filters.every(findEqualFilter(f2.filters));\n }\n }\n\n return false;\n};\n"],"names":["filter"],"mappings":"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"}
|
|
@@ -21,6 +21,7 @@ const dateFormatter = (column) => {
|
|
|
21
21
|
};
|
|
22
22
|
const numericFormatter = ({
|
|
23
23
|
align = "right",
|
|
24
|
+
serverDataType,
|
|
24
25
|
type
|
|
25
26
|
}) => {
|
|
26
27
|
if (type === void 0 || typeof type === "string") {
|
|
@@ -34,6 +35,23 @@ const numericFormatter = ({
|
|
|
34
35
|
zeroPad = false
|
|
35
36
|
} = type.formatting ?? DEFAULT_NUMERIC_FORMAT;
|
|
36
37
|
return (value) => {
|
|
38
|
+
if (serverDataType?.startsWith("scaleddecimal")) {
|
|
39
|
+
if (typeof value === "string") {
|
|
40
|
+
return roundDecimal.roundScaledDecimal(
|
|
41
|
+
value,
|
|
42
|
+
align,
|
|
43
|
+
decimals,
|
|
44
|
+
zeroPad,
|
|
45
|
+
alignOnDecimals,
|
|
46
|
+
useLocaleString,
|
|
47
|
+
roundingRule
|
|
48
|
+
);
|
|
49
|
+
} else {
|
|
50
|
+
throw Error(
|
|
51
|
+
`[formatting-utils] numericFormatter, invalid data for ${serverDataType}: '${value}'`
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
37
55
|
if (typeof value === "string" && (value.startsWith("\u03A3") || value.startsWith("["))) {
|
|
38
56
|
return value;
|
|
39
57
|
}
|
|
@@ -55,6 +73,7 @@ const mapFormatter = (map) => {
|
|
|
55
73
|
return map[value] ?? "";
|
|
56
74
|
};
|
|
57
75
|
};
|
|
76
|
+
const NumericTypes = ["decimal", "number"];
|
|
58
77
|
const getValueFormatter = (column, serverDataType = column.serverDataType) => {
|
|
59
78
|
if (columnUtils.isDateTimeDataValue(column)) {
|
|
60
79
|
return dateFormatter(column);
|
|
@@ -62,7 +81,7 @@ const getValueFormatter = (column, serverDataType = column.serverDataType) => {
|
|
|
62
81
|
const { type } = column;
|
|
63
82
|
if (columnUtils.isTypeDescriptor(type) && columnUtils.isMappedValueTypeRenderer(type?.renderer)) {
|
|
64
83
|
return mapFormatter(type.renderer.map);
|
|
65
|
-
} else if (serverDataType === "double" || columnUtils.isTypeDescriptor(type) && type.name
|
|
84
|
+
} else if (serverDataType === "double" || columnUtils.isTypeDescriptor(type) && NumericTypes.includes(type.name)) {
|
|
66
85
|
return numericFormatter(column);
|
|
67
86
|
} else if (serverDataType === "string" || serverDataType === "char") {
|
|
68
87
|
return (value) => value;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatting-utils.js","sources":["../../../../../../packages/vuu-utils/src/formatting-utils.ts"],"sourcesContent":["import { DataValueDescriptor } from \"@vuu-ui/vuu-data-types\";\nimport {\n ColumnDescriptor,\n ColumnTypeFormatting,\n ColumnTypeValueMap,\n ValueFormatter,\n} from \"@vuu-ui/vuu-table-types\";\nimport {\n isDateTimeDataValue,\n isMappedValueTypeRenderer,\n isTypeDescriptor,\n} from \"./column-utils\";\nimport { dateTimePattern, formatDate } from \"./date\";\nimport { roundDecimal } from \"./round-decimal\";\n\nexport type ValueFormatters = {\n [key: string]: ValueFormatter;\n};\n\nconst DEFAULT_NUMERIC_FORMAT: ColumnTypeFormatting = {};\n\nexport const defaultValueFormatter = (value: unknown) =>\n value == null ? \"\" : typeof value === \"string\" ? value : value.toString();\n\nconst dateFormatter = (column: DataValueDescriptor) => {\n const pattern = dateTimePattern(column.type);\n const formatter = formatDate(pattern);\n\n return (value: unknown) => {\n if (typeof value === \"number\" && value !== 0) {\n return formatter(new Date(value));\n } else {\n return \"\";\n }\n };\n};\n\nexport const numericFormatter = ({\n align = \"right\",\n type,\n}: Partial<ColumnDescriptor>) => {\n if (type === undefined || typeof type === \"string\") {\n return defaultValueFormatter;\n } else {\n const {\n alignOnDecimals = false,\n decimals,\n roundingRule,\n useLocaleString,\n zeroPad = false,\n } = type.formatting ?? DEFAULT_NUMERIC_FORMAT;\n return (value: unknown) => {\n if (\n typeof value === \"string\" &&\n (value.startsWith(\"Σ\") || value.startsWith(\"[\"))\n ) {\n return value;\n }\n const number =\n typeof value === \"number\"\n ? value\n : typeof value === \"string\"\n ? parseFloat(value)\n : undefined;\n return roundDecimal(\n number,\n align,\n decimals,\n zeroPad,\n alignOnDecimals,\n useLocaleString,\n roundingRule,\n );\n };\n }\n};\n\nconst mapFormatter = (map: ColumnTypeValueMap) => {\n return (value: unknown) => {\n return map[value as string] ?? \"\";\n };\n};\n\nexport const getValueFormatter = (\n column: ColumnDescriptor,\n serverDataType = column.serverDataType,\n): ValueFormatter => {\n if (isDateTimeDataValue(column)) {\n return dateFormatter(column);\n }\n\n const { type } = column;\n if (isTypeDescriptor(type) && isMappedValueTypeRenderer(type?.renderer)) {\n return mapFormatter(type.renderer.map);\n } else if (\n serverDataType === \"double\" ||\n (isTypeDescriptor(type) && type.name
|
|
1
|
+
{"version":3,"file":"formatting-utils.js","sources":["../../../../../../packages/vuu-utils/src/formatting-utils.ts"],"sourcesContent":["import { DataValueDescriptor } from \"@vuu-ui/vuu-data-types\";\nimport {\n ColumnDescriptor,\n ColumnTypeFormatting,\n ColumnTypeValueMap,\n ValueFormatter,\n} from \"@vuu-ui/vuu-table-types\";\nimport {\n isDateTimeDataValue,\n isMappedValueTypeRenderer,\n isTypeDescriptor,\n} from \"./column-utils\";\nimport { dateTimePattern, formatDate } from \"./date\";\nimport { roundDecimal, roundScaledDecimal } from \"./round-decimal\";\n\nexport type ValueFormatters = {\n [key: string]: ValueFormatter;\n};\n\nconst DEFAULT_NUMERIC_FORMAT: ColumnTypeFormatting = {};\n\nexport const defaultValueFormatter = (value: unknown) =>\n value == null ? \"\" : typeof value === \"string\" ? value : value.toString();\n\nconst dateFormatter = (column: DataValueDescriptor) => {\n const pattern = dateTimePattern(column.type);\n const formatter = formatDate(pattern);\n\n return (value: unknown) => {\n if (typeof value === \"number\" && value !== 0) {\n return formatter(new Date(value));\n } else {\n return \"\";\n }\n };\n};\n\nexport const numericFormatter = ({\n align = \"right\",\n serverDataType,\n type,\n}: Partial<ColumnDescriptor>) => {\n if (type === undefined || typeof type === \"string\") {\n return defaultValueFormatter;\n } else {\n const {\n alignOnDecimals = false,\n decimals,\n roundingRule,\n useLocaleString,\n zeroPad = false,\n } = type.formatting ?? DEFAULT_NUMERIC_FORMAT;\n return (value: unknown) => {\n if (serverDataType?.startsWith(\"scaleddecimal\")) {\n if (typeof value === \"string\") {\n return roundScaledDecimal(\n value,\n align,\n decimals,\n zeroPad,\n alignOnDecimals,\n useLocaleString,\n roundingRule,\n );\n } else {\n throw Error(\n `[formatting-utils] numericFormatter, invalid data for ${serverDataType}: '${value}'`,\n );\n }\n }\n if (\n typeof value === \"string\" &&\n (value.startsWith(\"Σ\") || value.startsWith(\"[\"))\n ) {\n return value;\n }\n const number =\n typeof value === \"number\"\n ? value\n : typeof value === \"string\"\n ? parseFloat(value)\n : undefined;\n return roundDecimal(\n number,\n align,\n decimals,\n zeroPad,\n alignOnDecimals,\n useLocaleString,\n roundingRule,\n );\n };\n }\n};\n\nconst mapFormatter = (map: ColumnTypeValueMap) => {\n return (value: unknown) => {\n return map[value as string] ?? \"\";\n };\n};\n\nconst NumericTypes = [\"decimal\", \"number\"];\n\nexport const getValueFormatter = (\n column: ColumnDescriptor,\n serverDataType = column.serverDataType,\n): ValueFormatter => {\n if (isDateTimeDataValue(column)) {\n return dateFormatter(column);\n }\n\n const { type } = column;\n if (isTypeDescriptor(type) && isMappedValueTypeRenderer(type?.renderer)) {\n return mapFormatter(type.renderer.map);\n } else if (\n serverDataType === \"double\" ||\n (isTypeDescriptor(type) && NumericTypes.includes(type.name))\n ) {\n return numericFormatter(column);\n } else if (serverDataType === \"string\" || serverDataType === \"char\") {\n return (value: unknown) => value as string;\n }\n return defaultValueFormatter;\n};\n\n/**\n * Lowercases a string and returns as Lowercase typescript type\n *\n * @param str the input string\n * @returns str converted to Lowercase\n */\nexport const lowerCase = (str: string) =>\n str.toLowerCase() as Lowercase<string>;\n"],"names":["dateTimePattern","formatter","formatDate","roundScaledDecimal","roundDecimal","isDateTimeDataValue","isTypeDescriptor","isMappedValueTypeRenderer"],"mappings":"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"}
|
|
@@ -9,7 +9,6 @@ var boxUtils = require('./box-utils.js');
|
|
|
9
9
|
var columnUtils = require('./column-utils.js');
|
|
10
10
|
var cookieUtils = require('./cookie-utils.js');
|
|
11
11
|
var componentRegistry = require('./component-registry.js');
|
|
12
|
-
var DataWindow = require('./DataWindow.js');
|
|
13
12
|
var Clock = require('./Clock.js');
|
|
14
13
|
var commonTypes = require('./common-types.js');
|
|
15
14
|
var cssUtils = require('./css-utils.js');
|
|
@@ -192,7 +191,6 @@ exports.isLayoutComponent = componentRegistry.isLayoutComponent;
|
|
|
192
191
|
exports.isView = componentRegistry.isView;
|
|
193
192
|
exports.registerComponent = componentRegistry.registerComponent;
|
|
194
193
|
exports.registerConfigurationEditor = componentRegistry.registerConfigurationEditor;
|
|
195
|
-
exports.DataWindow = DataWindow.DataWindow;
|
|
196
194
|
exports.Clock = Clock.Clock;
|
|
197
195
|
exports.MEASURES = commonTypes.MEASURES;
|
|
198
196
|
exports.importCSS = cssUtils.importCSS;
|
|
@@ -267,6 +265,7 @@ exports.isBetweenFilter = filterUtils.isBetweenFilter;
|
|
|
267
265
|
exports.isBetweenOperator = filterUtils.isBetweenOperator;
|
|
268
266
|
exports.isCompleteFilter = filterUtils.isCompleteFilter;
|
|
269
267
|
exports.isExtendedFilter = filterUtils.isExtendedFilter;
|
|
268
|
+
exports.isFilter = filterUtils.isFilter;
|
|
270
269
|
exports.isFilterClause = filterUtils.isFilterClause;
|
|
271
270
|
exports.isFilteredColumn = filterUtils.isFilteredColumn;
|
|
272
271
|
exports.isInFilter = filterUtils.isInFilter;
|
|
@@ -358,7 +357,9 @@ exports.createSyntheticEvent = reactUtils.createSyntheticEvent;
|
|
|
358
357
|
exports.isSimpleStateValue = reactUtils.isSimpleStateValue;
|
|
359
358
|
exports.useIsMounted = reactUtils.useIsMounted;
|
|
360
359
|
exports.useStableReference = reactUtils.useStableReference;
|
|
360
|
+
exports.exceedsMaxSafeInteger = roundDecimal.exceedsMaxSafeInteger;
|
|
361
361
|
exports.roundDecimal = roundDecimal.roundDecimal;
|
|
362
|
+
exports.roundScaledDecimal = roundDecimal.roundScaledDecimal;
|
|
362
363
|
exports.debounce = perfUtils.debounce;
|
|
363
364
|
exports.throttle = perfUtils.throttle;
|
|
364
365
|
exports.DeferredPromise = promiseUtils.DeferredPromise;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -3,6 +3,9 @@
|
|
|
3
3
|
const PUNCTUATION_STR = String.fromCharCode(8200);
|
|
4
4
|
const DIGIT_STR = String.fromCharCode(8199);
|
|
5
5
|
const DECIMALS_AUTO = -1;
|
|
6
|
+
const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER.toString();
|
|
7
|
+
const MAX_INTEGER_DIGITS = MAX_SAFE_INTEGER.length;
|
|
8
|
+
const exceedsMaxSafeInteger = (value) => value.length > MAX_INTEGER_DIGITS || value.length === MAX_INTEGER_DIGITS && value > MAX_SAFE_INTEGER;
|
|
6
9
|
const Space = {
|
|
7
10
|
DIGIT: DIGIT_STR,
|
|
8
11
|
TWO_DIGITS: DIGIT_STR + DIGIT_STR,
|
|
@@ -57,7 +60,9 @@ function roundDecimal(value, align = Align.Right, decimals = 4, zeroPad, alignOn
|
|
|
57
60
|
if (value === void 0 || typeof value !== "number" || isNaN(value)) {
|
|
58
61
|
return "";
|
|
59
62
|
}
|
|
60
|
-
let integral
|
|
63
|
+
let integral;
|
|
64
|
+
let fraction;
|
|
65
|
+
let Pad;
|
|
61
66
|
const [part1, part2 = ""] = value.toString().split(".");
|
|
62
67
|
const actualDecimals = part2.length;
|
|
63
68
|
integral = part1 === "-0" ? "-0" : useLocaleString ? parseFloat(part1).toLocaleString() : parseFloat(part1).toString();
|
|
@@ -75,7 +80,38 @@ function roundDecimal(value, align = Align.Right, decimals = 4, zeroPad, alignOn
|
|
|
75
80
|
} else {
|
|
76
81
|
if (Pad = zeroPad ? Zero : alignOnDecimals && align !== Align.Left ? Space : null) {
|
|
77
82
|
if (actualDecimals === 0) {
|
|
78
|
-
fraction = Pad.FULL_PADDING[decimals];
|
|
83
|
+
fraction = Pad.FULL_PADDING[decimals] ?? "";
|
|
84
|
+
} else {
|
|
85
|
+
fraction = pad(part2, decimals, Pad);
|
|
86
|
+
}
|
|
87
|
+
} else {
|
|
88
|
+
fraction = part2;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return integral + (fraction ? "." + fraction : "");
|
|
92
|
+
}
|
|
93
|
+
function roundScaledDecimal(value, align = Align.Right, decimals = 4, zeroPad, alignOnDecimals, useLocaleString = true, roundingRule = "round") {
|
|
94
|
+
let integral;
|
|
95
|
+
let fraction;
|
|
96
|
+
let Pad;
|
|
97
|
+
const [part1, part2 = ""] = value.split(".");
|
|
98
|
+
const actualDecimals = part2.length;
|
|
99
|
+
integral = part1 === "" ? "0" : part1 === "-0" ? "-0" : useLocaleString ? exceedsMaxSafeInteger(value) ? BigInt(part1).toLocaleString() : parseFloat(part1).toLocaleString() : part1;
|
|
100
|
+
if (align === Align.Left && alignOnDecimals) {
|
|
101
|
+
integral = padLeft(integral);
|
|
102
|
+
}
|
|
103
|
+
if (decimals === DECIMALS_AUTO || actualDecimals === decimals) {
|
|
104
|
+
fraction = part2;
|
|
105
|
+
} else if (actualDecimals > decimals) {
|
|
106
|
+
if (roundingRule === "round") {
|
|
107
|
+
fraction = parseFloat("0." + part2).toFixed(decimals).slice(2);
|
|
108
|
+
} else {
|
|
109
|
+
fraction = part2.slice(0, decimals);
|
|
110
|
+
}
|
|
111
|
+
} else {
|
|
112
|
+
if (Pad = zeroPad ? Zero : alignOnDecimals && align !== Align.Left ? Space : null) {
|
|
113
|
+
if (actualDecimals === 0) {
|
|
114
|
+
fraction = Pad.FULL_PADDING[decimals] ?? "";
|
|
79
115
|
} else {
|
|
80
116
|
fraction = pad(part2, decimals, Pad);
|
|
81
117
|
}
|
|
@@ -86,5 +122,7 @@ function roundDecimal(value, align = Align.Right, decimals = 4, zeroPad, alignOn
|
|
|
86
122
|
return integral + (fraction ? "." + fraction : "");
|
|
87
123
|
}
|
|
88
124
|
|
|
125
|
+
exports.exceedsMaxSafeInteger = exceedsMaxSafeInteger;
|
|
89
126
|
exports.roundDecimal = roundDecimal;
|
|
127
|
+
exports.roundScaledDecimal = roundScaledDecimal;
|
|
90
128
|
//# sourceMappingURL=round-decimal.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"round-decimal.js","sources":["../../../../../../packages/vuu-utils/src/round-decimal.ts"],"sourcesContent":["import { RoundingRule } from \"@vuu-ui/vuu-table-types\";\n\nconst 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 useLocaleString = true,\n roundingRule: RoundingRule = \"round\",\n) {\n if (value === undefined || typeof value !== \"number\" || isNaN(value)) {\n return \"\";\n }\n let integral
|
|
1
|
+
{"version":3,"file":"round-decimal.js","sources":["../../../../../../packages/vuu-utils/src/round-decimal.ts"],"sourcesContent":["import { RoundingRule } from \"@vuu-ui/vuu-table-types\";\n\nconst PUNCTUATION_STR = String.fromCharCode(8200);\nconst DIGIT_STR = String.fromCharCode(8199);\nconst DECIMALS_AUTO = -1;\nconst MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER.toString();\nconst MAX_INTEGER_DIGITS = MAX_SAFE_INTEGER.length;\n\nexport const exceedsMaxSafeInteger = (value: string) =>\n value.length > MAX_INTEGER_DIGITS ||\n (value.length === MAX_INTEGER_DIGITS && value > MAX_SAFE_INTEGER);\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 useLocaleString = true,\n roundingRule: RoundingRule = \"round\",\n) {\n if (value === undefined || typeof value !== \"number\" || isNaN(value)) {\n return \"\";\n }\n let integral: string;\n let fraction: string;\n let Pad: PadMap | null;\n\n const [part1, part2 = \"\"] = value.toString().split(\".\");\n const actualDecimals = part2.length;\n\n integral =\n part1 === \"-0\"\n ? \"-0\"\n : useLocaleString\n ? parseFloat(part1).toLocaleString()\n : parseFloat(part1).toString();\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 if (roundingRule === \"round\") {\n fraction = parseFloat(\"0.\" + part2)\n .toFixed(decimals)\n .slice(2);\n } else {\n fraction = part2.slice(0, decimals);\n }\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\nexport function roundScaledDecimal(\n value: string,\n align = Align.Right,\n decimals = 4,\n zeroPad?: boolean,\n alignOnDecimals?: boolean,\n useLocaleString = true,\n roundingRule: RoundingRule = \"round\",\n) {\n let integral: string;\n let fraction: string;\n let Pad: PadMap | null;\n\n const [part1, part2 = \"\"] = value.split(\".\");\n const actualDecimals = part2.length;\n\n integral =\n part1 === \"\"\n ? \"0\"\n : part1 === \"-0\"\n ? \"-0\"\n : useLocaleString\n ? exceedsMaxSafeInteger(value)\n ? BigInt(part1).toLocaleString()\n : parseFloat(part1).toLocaleString()\n : part1;\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 if (roundingRule === \"round\") {\n fraction = parseFloat(\"0.\" + part2)\n .toFixed(decimals)\n .slice(2);\n } else {\n fraction = part2.slice(0, decimals);\n }\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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"}
|
|
@@ -4,14 +4,14 @@ var columnUtils = require('./column-utils.js');
|
|
|
4
4
|
|
|
5
5
|
const { IS_LEAF, KEY, IDX, SELECTED } = columnUtils.metadataKeys;
|
|
6
6
|
const actualRowPositioning = (rowHeight) => [
|
|
7
|
-
(
|
|
7
|
+
(dataRow) => dataRow.index * rowHeight,
|
|
8
8
|
(position) => Math.floor(position / rowHeight),
|
|
9
9
|
false
|
|
10
10
|
];
|
|
11
11
|
const virtualRowPositioning = (rowHeight, virtualisedExtent, pctScrollTop) => [
|
|
12
|
-
(
|
|
12
|
+
(dataRow, offset = 0) => {
|
|
13
13
|
const rowOffset = pctScrollTop.current * virtualisedExtent;
|
|
14
|
-
return (
|
|
14
|
+
return (dataRow.index - offset) * rowHeight - rowOffset;
|
|
15
15
|
},
|
|
16
16
|
/*
|
|
17
17
|
Return index position of closest row
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"row-utils.js","sources":["../../../../../../packages/vuu-utils/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 { ColumnMap, metadataKeys } from \"./column-utils\";\nimport { IKeySet } from \"./keyset\";\nimport { VuuRow } from \"@vuu-ui/vuu-protocol-types\";\nimport { RefObject } from \"react\";\n\nconst { IS_LEAF, KEY, IDX, SELECTED } = metadataKeys;\n\nexport type RowOffsetFunc = (
|
|
1
|
+
{"version":3,"file":"row-utils.js","sources":["../../../../../../packages/vuu-utils/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 { ColumnMap, metadataKeys } from \"./column-utils\";\nimport { IKeySet } from \"./keyset\";\nimport { VuuRow } from \"@vuu-ui/vuu-protocol-types\";\nimport { RefObject } from \"react\";\nimport { DataRow } from \"@vuu-ui/vuu-table-types\";\n\nconst { IS_LEAF, KEY, IDX, SELECTED } = metadataKeys;\n\nexport type RowOffsetFunc = (dataRow: DataRow, pctScrollTop?: number) => 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 (dataRow) => dataRow.index * 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: RefObject<number>,\n): RowPositioning => [\n (dataRow, offset = 0) => {\n const rowOffset = pctScrollTop.current * virtualisedExtent;\n return (dataRow.index - 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\n// deprecated\nexport type RowToObjectMapper = (\n row: DataSourceRow,\n columnMap: ColumnMap,\n) => DataSourceRowObject;\n\n// deprecated\nexport const asDataSourceRowObject: RowToObjectMapper = (\n row,\n 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: row[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\n// deprecated\nexport const vuuRowToDataSourceRow = (\n { rowIndex, rowKey, sel: isSelected = 0, ts, data }: VuuRow,\n keys: IKeySet,\n) => {\n return [\n rowIndex,\n keys.keyFor(rowIndex),\n true,\n false,\n 0,\n 0,\n rowKey,\n isSelected,\n ts,\n false, // IsNew\n ].concat(data) as DataSourceRow;\n};\n"],"names":["metadataKeys"],"mappings":";;;;AAWA,MAAM,EAAE,OAAA,EAAS,GAAK,EAAA,GAAA,EAAK,UAAa,GAAAA,wBAAA;AAU3B,MAAA,oBAAA,GAAuB,CAAC,SAAsC,KAAA;AAAA,EACzE,CAAC,OAAY,KAAA,OAAA,CAAQ,KAAQ,GAAA,SAAA;AAAA,EAC7B,CAAC,QAAA,KAAa,IAAK,CAAA,KAAA,CAAM,WAAW,SAAS,CAAA;AAAA,EAC7C;AACF;AAaO,MAAM,qBAAwB,GAAA,CACnC,SACA,EAAA,iBAAA,EACA,YACmB,KAAA;AAAA,EACnB,CAAC,OAAS,EAAA,MAAA,GAAS,CAAM,KAAA;AACvB,IAAM,MAAA,SAAA,GAAY,aAAa,OAAU,GAAA,iBAAA;AACzC,IAAQ,OAAA,CAAA,OAAA,CAAQ,KAAQ,GAAA,MAAA,IAAU,SAAY,GAAA,SAAA;AAAA,GAChD;AAAA;AAAA;AAAA;AAAA,EAIA,CAAC,QAAa,KAAA;AACZ,IAAM,MAAA,SAAA,GAAY,aAAa,OAAU,GAAA,iBAAA;AACzC,IAAA,OAAO,IAAK,CAAA,KAAA,CAAA,CAAO,QAAW,GAAA,SAAA,IAAa,SAAS,CAAA;AAAA,GACtD;AAAA,EACA;AACF;AASa,MAAA,qBAAA,GAA2C,CACtD,GAAA,EACA,SACwB,KAAA;AACxB,EAAA,MAAM,EAAE,CAAC,OAAO,GAAG,MAAQ,EAAA,CAAC,GAAG,GAAG,GAAK,EAAA,CAAC,GAAG,GAAG,OAAU,GAAA,GAAA;AAExD,EAAA,MAAM,SAAiC,GAAA;AAAA,IACrC,GAAA;AAAA,IACA,KAAA;AAAA,IACA,YAAY,CAAC,MAAA;AAAA,IACb,UAAA,EAAY,GAAI,CAAA,QAAQ,CAAM,KAAA,CAAA;AAAA,IAC9B,MAAM;AAAC,GACT;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;AAAA;AAGtC,EAAO,OAAA,SAAA;AACT;AAGa,MAAA,qBAAA,GAAwB,CACnC,EAAE,QAAU,EAAA,MAAA,EAAQ,GAAK,EAAA,UAAA,GAAa,CAAG,EAAA,EAAA,EAAI,IAAK,EAAA,EAClD,IACG,KAAA;AACH,EAAO,OAAA;AAAA,IACL,QAAA;AAAA,IACA,IAAA,CAAK,OAAO,QAAQ,CAAA;AAAA,IACpB,IAAA;AAAA,IACA,KAAA;AAAA,IACA,CAAA;AAAA,IACA,CAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAA;AAAA,IACA,EAAA;AAAA,IACA;AAAA;AAAA,GACF,CAAE,OAAO,IAAI,CAAA;AACf;;;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree-utils.js","sources":["../../../../../../packages/vuu-utils/src/tree-utils.ts"],"sourcesContent":["import { TreeSourceNode } from \"./tree-types\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport { metadataKeys } from \"./column-utils\";\nimport { IconProvider } from \"@vuu-ui/vuu-data-local/src/tree-data-source/IconProvider\";\n\nconst { COUNT, DEPTH, IDX, KEY } = metadataKeys;\n\ntype Index = { value: number };\n\nconst timestamp = 0;\nconst isNew = false;\n\nexport const treeToDataSourceRows = (\n treeSourceNodes: TreeSourceNode[],\n iconProvider?: IconProvider,\n): [ColumnDescriptor[], DataSourceRow[]] => {\n const columns: ColumnDescriptor[] = [];\n\n columns.push(\n {\n hidden: true,\n name: \"nodeData\",\n type: \"json\",\n },\n {\n getIcon: iconProvider?.getIcon,\n name: \"Level 1\",\n type: \"string\",\n },\n {\n getIcon: iconProvider?.getIcon,\n name: \"Level 2\",\n type: \"string\",\n },\n );\n\n const rows: DataSourceRow[] = [];\n\n addChildValues(rows, treeSourceNodes, columns, iconProvider);\n return [columns, rows];\n};\n\nconst addChildValues = (\n rows: DataSourceRow[],\n treeSourceNodes: TreeSourceNode[],\n cols: ColumnDescriptor[],\n iconProvider: IconProvider | undefined,\n index: Index = { value: 0 },\n keyBase = \"$root\",\n depth = 1,\n): [number, number] => {\n let leafCount = 0;\n let rowCount = 0;\n if (depth === cols.length - 1) {\n cols.push({\n getIcon: iconProvider?.getIcon,\n name: `Level ${cols.length}`,\n type: \"string\",\n });\n }\n for (let i = 0; i < treeSourceNodes.length; i++, index.value += 1) {\n const { childNodes, icon, label, nodeData /*, tags */ } =\n treeSourceNodes[i];\n const blanks = Array(depth - 1).fill(\"\");\n const fullKey = `${keyBase}|${label}`;\n // prettier-ignore\n const row = [index.value, index.value, false,false,depth,0,fullKey,0, timestamp, isNew, nodeData, ...blanks, label ] as DataSourceRow;\n if (icon) {\n iconProvider?.setIcon(fullKey, icon);\n }\n rows.push(row);\n rowCount += 1;\n\n if (childNodes && childNodes.length > 0) {\n const [nestedLeafCount, nestedRowCount] = addChildValues(\n rows,\n childNodes,\n cols,\n iconProvider,\n { value: index.value + 1 },\n fullKey,\n depth + 1,\n );\n row[COUNT] = nestedLeafCount;\n leafCount += nestedLeafCount;\n rowCount += nestedRowCount;\n index.value += nestedRowCount;\n } else {\n leafCount += 1;\n }\n }\n\n return [leafCount, rowCount];\n};\n\nexport const lastPathSegment = (path: string, separator = \"/\") => {\n const root = path.endsWith(separator) ? path.slice(0, -1) : path;\n return root.slice(root.lastIndexOf(separator) + 1);\n};\n\nexport const dropLastPathSegment = (path: string, separator = \"/\") => {\n return path.slice(0, path.lastIndexOf(separator));\n};\n\nexport const getParentRow = (rows: DataSourceRow[], row: DataSourceRow) => {\n const { [IDX]: idx, [DEPTH]: depth } = row;\n for (let i = idx - 1; i >= 0; i--) {\n const nextRow = rows[i];\n if (nextRow[DEPTH] === depth - 1) {\n return nextRow;\n }\n }\n};\n\nconst rowsAreSiblings = (key1: string, key2: string) =>\n dropLastPathSegment(key1, \"|\") === dropLastPathSegment(key2, \"|\");\n\nexport const missingAncestor = (\n row: DataSourceRow,\n previousRow?: DataSourceRow,\n) => {\n if (previousRow) {\n const prevKey = previousRow[KEY];\n const key = row[KEY];\n\n if (key.startsWith(prevKey)) {\n return false;\n } else if (!rowsAreSiblings(prevKey, key)) {\n return true;\n }\n } else if (row[DEPTH] > 1) {\n return true;\n }\n\n return false;\n};\n"],"names":["metadataKeys"],"mappings":";;;;AAMA,MAAM,EAAE,KAAA,EAAO,KAAO,EAAA,GAAA,EAAK,KAAQ,GAAAA,wBAAA;AAInC,MAAM,SAAY,GAAA,CAAA;AAClB,MAAM,KAAQ,GAAA,KAAA;AAED,MAAA,oBAAA,GAAuB,CAClC,eAAA,EACA,YAC0C,KAAA;AAC1C,EAAA,MAAM,UAA8B,EAAC;AAErC,EAAQ,OAAA,CAAA,IAAA;AAAA,IACN;AAAA,MACE,MAAQ,EAAA,IAAA;AAAA,MACR,IAAM,EAAA,UAAA;AAAA,MACN,IAAM,EAAA;AAAA,KACR;AAAA,IACA;AAAA,MACE,SAAS,YAAc,EAAA,OAAA;AAAA,MACvB,IAAM,EAAA,SAAA;AAAA,MACN,IAAM,EAAA;AAAA,KACR;AAAA,IACA;AAAA,MACE,SAAS,YAAc,EAAA,OAAA;AAAA,MACvB,IAAM,EAAA,SAAA;AAAA,MACN,IAAM,EAAA;AAAA;AACR,GACF;AAEA,EAAA,MAAM,OAAwB,EAAC;AAE/B,EAAe,cAAA,CAAA,IAAA,EAAM,eAAiB,EAAA,OAAA,EAAS,YAAY,CAAA;AAC3D,EAAO,OAAA,CAAC,SAAS,IAAI,CAAA;AACvB;AAEA,MAAM,cAAiB,GAAA,CACrB,IACA,EAAA,eAAA,EACA,MACA,YACA,EAAA,KAAA,GAAe,EAAE,KAAA,EAAO,CAAE,EAAA,EAC1B,OAAU,GAAA,OAAA,EACV,QAAQ,CACa,KAAA;AACrB,EAAA,IAAI,SAAY,GAAA,CAAA;AAChB,EAAA,IAAI,QAAW,GAAA,CAAA;AACf,EAAI,IAAA,KAAA,KAAU,IAAK,CAAA,MAAA,GAAS,CAAG,EAAA;AAC7B,IAAA,IAAA,CAAK,IAAK,CAAA;AAAA,MACR,SAAS,YAAc,EAAA,OAAA;AAAA,MACvB,IAAA,EAAM,CAAS,MAAA,EAAA,IAAA,CAAK,MAAM,CAAA,CAAA;AAAA,MAC1B,IAAM,EAAA;AAAA,KACP,CAAA;AAAA;AAEH,EAAS,KAAA,IAAA,CAAA,GAAI,GAAG,CAAI,GAAA,eAAA,CAAgB,QAAQ,CAAK,EAAA,EAAA,KAAA,CAAM,SAAS,CAAG,EAAA;AACjE,IAAM,MAAA;AAAA,MAAE,UAAA;AAAA,MAAY,IAAA;AAAA,MAAM,KAAA;AAAA,MAAO;AAAA;AAAA,KAAqB,GACpD,gBAAgB,CAAC,CAAA;AACnB,IAAA,MAAM,SAAS,KAAM,CAAA,KAAA,GAAQ,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA;AACvC,IAAA,MAAM,OAAU,GAAA,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA;
|
|
1
|
+
{"version":3,"file":"tree-utils.js","sources":["../../../../../../packages/vuu-utils/src/tree-utils.ts"],"sourcesContent":["import { TreeSourceNode } from \"./tree-types\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport { metadataKeys } from \"./column-utils\";\nimport { IconProvider } from \"@vuu-ui/vuu-data-local/src/tree-data-source/IconProvider\";\n\nconst { COUNT, DEPTH, IDX, KEY } = metadataKeys;\n\ntype Index = { value: number };\n\nconst timestamp = 0;\nconst isNew = false;\n\nexport const treeToDataSourceRows = (\n treeSourceNodes: TreeSourceNode[],\n iconProvider?: IconProvider,\n): [ColumnDescriptor[], DataSourceRow[]] => {\n const columns: ColumnDescriptor[] = [];\n\n columns.push(\n {\n hidden: true,\n name: \"nodeData\",\n type: \"json\",\n },\n {\n getIcon: iconProvider?.getIcon,\n name: \"Level 1\",\n type: \"string\",\n },\n {\n getIcon: iconProvider?.getIcon,\n name: \"Level 2\",\n type: \"string\",\n },\n );\n\n const rows: DataSourceRow[] = [];\n\n addChildValues(rows, treeSourceNodes, columns, iconProvider);\n return [columns, rows];\n};\n\nconst addChildValues = (\n rows: DataSourceRow[],\n treeSourceNodes: TreeSourceNode[],\n cols: ColumnDescriptor[],\n iconProvider: IconProvider | undefined,\n index: Index = { value: 0 },\n keyBase = \"$root\",\n depth = 1,\n): [number, number] => {\n let leafCount = 0;\n let rowCount = 0;\n if (depth === cols.length - 1) {\n cols.push({\n getIcon: iconProvider?.getIcon,\n name: `Level ${cols.length}`,\n type: \"string\",\n });\n }\n for (let i = 0; i < treeSourceNodes.length; i++, index.value += 1) {\n const { childNodes, icon, label, nodeData /*, tags */ } =\n treeSourceNodes[i];\n const blanks = Array(depth - 1).fill(\"\");\n const fullKey = `${keyBase}|${label}`;\n\n // we create all nodes as non-leaf in a TreeTable, even those with no childNodes\n // prettier-ignore\n const row = [index.value, index.value, false, false, depth, 0, fullKey, 0, timestamp, isNew, nodeData, ...blanks, label ] as DataSourceRow;\n if (icon) {\n iconProvider?.setIcon(fullKey, icon);\n }\n rows.push(row);\n rowCount += 1;\n\n if (childNodes && childNodes.length > 0) {\n const [nestedLeafCount, nestedRowCount] = addChildValues(\n rows,\n childNodes,\n cols,\n iconProvider,\n { value: index.value + 1 },\n fullKey,\n depth + 1,\n );\n row[COUNT] = nestedLeafCount;\n leafCount += nestedLeafCount;\n rowCount += nestedRowCount;\n index.value += nestedRowCount;\n } else {\n leafCount += 1;\n }\n }\n\n return [leafCount, rowCount];\n};\n\nexport const lastPathSegment = (path: string, separator = \"/\") => {\n const root = path.endsWith(separator) ? path.slice(0, -1) : path;\n return root.slice(root.lastIndexOf(separator) + 1);\n};\n\nexport const dropLastPathSegment = (path: string, separator = \"/\") => {\n return path.slice(0, path.lastIndexOf(separator));\n};\n\nexport const getParentRow = (rows: DataSourceRow[], row: DataSourceRow) => {\n const { [IDX]: idx, [DEPTH]: depth } = row;\n for (let i = idx - 1; i >= 0; i--) {\n const nextRow = rows[i];\n if (nextRow[DEPTH] === depth - 1) {\n return nextRow;\n }\n }\n};\n\nconst rowsAreSiblings = (key1: string, key2: string) =>\n dropLastPathSegment(key1, \"|\") === dropLastPathSegment(key2, \"|\");\n\nexport const missingAncestor = (\n row: DataSourceRow,\n previousRow?: DataSourceRow,\n) => {\n if (previousRow) {\n const prevKey = previousRow[KEY];\n const key = row[KEY];\n\n if (key.startsWith(prevKey)) {\n return false;\n } else if (!rowsAreSiblings(prevKey, key)) {\n return true;\n }\n } else if (row[DEPTH] > 1) {\n return true;\n }\n\n return false;\n};\n"],"names":["metadataKeys"],"mappings":"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"}
|
|
@@ -249,7 +249,7 @@ const checkConfirmationPending = (previousConfig) => {
|
|
|
249
249
|
}
|
|
250
250
|
};
|
|
251
251
|
const isJsonAttribute = (value) => typeof value === "string" && (value.endsWith("{") || value.endsWith("["));
|
|
252
|
-
const isJsonGroup = (column,
|
|
252
|
+
const isJsonGroup = (column, dataRow) => column.type?.name === "json" && isJsonAttribute(dataRow[column.name]);
|
|
253
253
|
const isJsonColumn = (column) => column.type?.name === "json";
|
|
254
254
|
const sortPinnedColumns = (columns, selectionBookendWidth = 0) => {
|
|
255
255
|
const leftPinnedColumns = [];
|
|
@@ -596,27 +596,26 @@ const visibleColumnAtIndex = (columns, index) => {
|
|
|
596
596
|
return columns.filter(isNotHidden).at(index);
|
|
597
597
|
}
|
|
598
598
|
};
|
|
599
|
-
const
|
|
600
|
-
const
|
|
601
|
-
const { [DEPTH]: depth, [IS_LEAF]: isLeaf } = row;
|
|
599
|
+
const getGroupIcon = (columns, dataRow) => {
|
|
600
|
+
const { depth, isLeaf } = dataRow;
|
|
602
601
|
if (isLeaf || depth > columns.length) {
|
|
603
602
|
return void 0;
|
|
604
603
|
} else if (depth === 0) {
|
|
605
604
|
return void 0;
|
|
606
605
|
} else {
|
|
607
606
|
const { getIcon } = columns[depth - 1];
|
|
608
|
-
return getIcon?.(
|
|
607
|
+
return getIcon?.(dataRow);
|
|
609
608
|
}
|
|
610
609
|
};
|
|
611
|
-
const getGroupValue = (columns,
|
|
612
|
-
const {
|
|
610
|
+
const getGroupValue = (columns, dataRow) => {
|
|
611
|
+
const { depth, isLeaf } = dataRow;
|
|
613
612
|
if (isLeaf || depth > columns.length) {
|
|
614
613
|
return null;
|
|
615
614
|
} else if (depth === 0) {
|
|
616
615
|
return "$root";
|
|
617
616
|
} else {
|
|
618
617
|
const { name, valueFormatter } = columns[depth - 1];
|
|
619
|
-
const value = valueFormatter(
|
|
618
|
+
const value = valueFormatter(dataRow[name]);
|
|
620
619
|
return value;
|
|
621
620
|
}
|
|
622
621
|
};
|
|
@@ -626,6 +625,11 @@ const getDefaultColumnType = (serverDataType) => {
|
|
|
626
625
|
case "long":
|
|
627
626
|
case "double":
|
|
628
627
|
return "number";
|
|
628
|
+
case "scaleddecimal2":
|
|
629
|
+
case "scaleddecimal4":
|
|
630
|
+
case "scaleddecimal6":
|
|
631
|
+
case "scaleddecimal8":
|
|
632
|
+
return "scaleddecimal";
|
|
629
633
|
case "boolean":
|
|
630
634
|
return "boolean";
|
|
631
635
|
case "epochtimestamp":
|
|
@@ -905,8 +909,8 @@ const stretchColumnsToFillAvailableSpace = (columns, availableWidth, totalWidth,
|
|
|
905
909
|
}
|
|
906
910
|
return adjustedColumns;
|
|
907
911
|
};
|
|
908
|
-
const dataAndColumnUnchanged = (p, p1) => p.column === p1.column && p.column.valueFormatter(p.
|
|
909
|
-
const dataColumnAndKeyUnchanged = (p, p1) => p.column === p1.column && p.
|
|
912
|
+
const dataAndColumnUnchanged = (p, p1) => p.column === p1.column && p.column.valueFormatter(p.dataRow[p.column.name]) === p1.column.valueFormatter(p1.dataRow[p1.column.name]);
|
|
913
|
+
const dataColumnAndKeyUnchanged = (p, p1) => p.column === p1.column && p.dataRow.key === p1.dataRow.key && p.column.valueFormatter(p.dataRow[p.column.name]) === p1.column.valueFormatter(p1.dataRow[p1.column.name]);
|
|
910
914
|
const toColumnName = (column) => column.name;
|
|
911
915
|
const isStringColumn = (column) => column.serverDataType === "string";
|
|
912
916
|
const reorderColumnItems = (columnItems, orderedNames) => {
|