@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.
Files changed (44) hide show
  1. package/cjs/packages/vuu-utils/src/column-utils.js +14 -10
  2. package/cjs/packages/vuu-utils/src/column-utils.js.map +1 -1
  3. package/cjs/packages/vuu-utils/src/component-registry.js +8 -4
  4. package/cjs/packages/vuu-utils/src/component-registry.js.map +1 -1
  5. package/cjs/packages/vuu-utils/src/filters/filter-utils.js +2 -0
  6. package/cjs/packages/vuu-utils/src/filters/filter-utils.js.map +1 -1
  7. package/cjs/packages/vuu-utils/src/formatting-utils.js +20 -1
  8. package/cjs/packages/vuu-utils/src/formatting-utils.js.map +1 -1
  9. package/cjs/packages/vuu-utils/src/index.js +3 -2
  10. package/cjs/packages/vuu-utils/src/index.js.map +1 -1
  11. package/cjs/packages/vuu-utils/src/round-decimal.js +40 -2
  12. package/cjs/packages/vuu-utils/src/round-decimal.js.map +1 -1
  13. package/cjs/packages/vuu-utils/src/row-utils.js +3 -3
  14. package/cjs/packages/vuu-utils/src/row-utils.js.map +1 -1
  15. package/cjs/packages/vuu-utils/src/tree-utils.js.map +1 -1
  16. package/esm/packages/vuu-utils/src/column-utils.js +14 -10
  17. package/esm/packages/vuu-utils/src/column-utils.js.map +1 -1
  18. package/esm/packages/vuu-utils/src/component-registry.js +8 -4
  19. package/esm/packages/vuu-utils/src/component-registry.js.map +1 -1
  20. package/esm/packages/vuu-utils/src/filters/filter-utils.js +2 -1
  21. package/esm/packages/vuu-utils/src/filters/filter-utils.js.map +1 -1
  22. package/esm/packages/vuu-utils/src/formatting-utils.js +21 -2
  23. package/esm/packages/vuu-utils/src/formatting-utils.js.map +1 -1
  24. package/esm/packages/vuu-utils/src/index.js +2 -3
  25. package/esm/packages/vuu-utils/src/index.js.map +1 -1
  26. package/esm/packages/vuu-utils/src/round-decimal.js +39 -3
  27. package/esm/packages/vuu-utils/src/round-decimal.js.map +1 -1
  28. package/esm/packages/vuu-utils/src/row-utils.js +3 -3
  29. package/esm/packages/vuu-utils/src/row-utils.js.map +1 -1
  30. package/esm/packages/vuu-utils/src/tree-utils.js.map +1 -1
  31. package/package.json +6 -6
  32. package/types/column-utils.d.ts +13 -13
  33. package/types/component-registry.d.ts +7 -7
  34. package/types/data-utils.d.ts +1 -1
  35. package/types/filters/filter-utils.d.ts +2 -1
  36. package/types/formatting-utils.d.ts +1 -1
  37. package/types/index.d.ts +0 -1
  38. package/types/round-decimal.d.ts +2 -0
  39. package/types/row-utils.d.ts +2 -1
  40. package/cjs/packages/vuu-utils/src/DataWindow.js +0 -76
  41. package/cjs/packages/vuu-utils/src/DataWindow.js.map +0 -1
  42. package/esm/packages/vuu-utils/src/DataWindow.js +0 -74
  43. package/esm/packages/vuu-utils/src/DataWindow.js.map +0 -1
  44. 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 === "number") {
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 === \"number\")\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","roundDecimal","isDateTimeDataValue","isTypeDescriptor","isMappedValueTypeRenderer"],"mappings":"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"}
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, fraction, Pad;
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, fraction, Pad;\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"],"names":[],"mappings":"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"}
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
- (row) => row[IDX] * rowHeight,
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
- (row, offset = 0) => {
12
+ (dataRow, offset = 0) => {
13
13
  const rowOffset = pctScrollTop.current * virtualisedExtent;
14
- return (row[IDX] - offset) * rowHeight - rowOffset;
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 = (\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: RefObject<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 type RowToObjectMapper = (\n row: DataSourceRow,\n columnMap: ColumnMap,\n) => DataSourceRowObject;\n\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\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":";;;;AAUA,MAAM,EAAE,OAAA,EAAS,GAAK,EAAA,GAAA,EAAK,UAAa,GAAAA,wBAAA;AAa3B,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;AACF;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;AACzC,IAAA,OAAA,CAAQ,GAAI,CAAA,GAAG,CAAI,GAAA,MAAA,IAAU,SAAY,GAAA,SAAA;AAAA,GAC3C;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;AAOa,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;AAEa,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
+ {"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":"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"}
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, row, columnMap) => column.type?.name === "json" && isJsonAttribute(row[columnMap[column.name]]);
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 { DEPTH, IS_LEAF } = metadataKeys;
600
- const getGroupIcon = (columns, row) => {
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?.(row);
607
+ return getIcon?.(dataRow);
609
608
  }
610
609
  };
611
- const getGroupValue = (columns, row, columnMap) => {
612
- const { [DEPTH]: depth, [IS_LEAF]: isLeaf } = row;
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(row[columnMap[name]]);
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.row[p.columnMap[p.column.name]]) === p1.column.valueFormatter(p1.row[p1.columnMap[p1.column.name]]);
909
- const dataColumnAndKeyUnchanged = (p, p1) => p.column === p1.column && p.row[KEY] === p1.row[KEY] && p.column.valueFormatter(p.row[p.columnMap[p.column.name]]) === p1.column.valueFormatter(p1.row[p1.columnMap[p1.column.name]]);
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) => {