@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
|
@@ -251,7 +251,7 @@ const checkConfirmationPending = (previousConfig) => {
|
|
|
251
251
|
}
|
|
252
252
|
};
|
|
253
253
|
const isJsonAttribute = (value) => typeof value === "string" && (value.endsWith("{") || value.endsWith("["));
|
|
254
|
-
const isJsonGroup = (column,
|
|
254
|
+
const isJsonGroup = (column, dataRow) => column.type?.name === "json" && isJsonAttribute(dataRow[column.name]);
|
|
255
255
|
const isJsonColumn = (column) => column.type?.name === "json";
|
|
256
256
|
const sortPinnedColumns = (columns, selectionBookendWidth = 0) => {
|
|
257
257
|
const leftPinnedColumns = [];
|
|
@@ -598,27 +598,26 @@ const visibleColumnAtIndex = (columns, index) => {
|
|
|
598
598
|
return columns.filter(isNotHidden).at(index);
|
|
599
599
|
}
|
|
600
600
|
};
|
|
601
|
-
const
|
|
602
|
-
const
|
|
603
|
-
const { [DEPTH]: depth, [IS_LEAF]: isLeaf } = row;
|
|
601
|
+
const getGroupIcon = (columns, dataRow) => {
|
|
602
|
+
const { depth, isLeaf } = dataRow;
|
|
604
603
|
if (isLeaf || depth > columns.length) {
|
|
605
604
|
return void 0;
|
|
606
605
|
} else if (depth === 0) {
|
|
607
606
|
return void 0;
|
|
608
607
|
} else {
|
|
609
608
|
const { getIcon } = columns[depth - 1];
|
|
610
|
-
return getIcon?.(
|
|
609
|
+
return getIcon?.(dataRow);
|
|
611
610
|
}
|
|
612
611
|
};
|
|
613
|
-
const getGroupValue = (columns,
|
|
614
|
-
const {
|
|
612
|
+
const getGroupValue = (columns, dataRow) => {
|
|
613
|
+
const { depth, isLeaf } = dataRow;
|
|
615
614
|
if (isLeaf || depth > columns.length) {
|
|
616
615
|
return null;
|
|
617
616
|
} else if (depth === 0) {
|
|
618
617
|
return "$root";
|
|
619
618
|
} else {
|
|
620
619
|
const { name, valueFormatter } = columns[depth - 1];
|
|
621
|
-
const value = valueFormatter(
|
|
620
|
+
const value = valueFormatter(dataRow[name]);
|
|
622
621
|
return value;
|
|
623
622
|
}
|
|
624
623
|
};
|
|
@@ -628,6 +627,11 @@ const getDefaultColumnType = (serverDataType) => {
|
|
|
628
627
|
case "long":
|
|
629
628
|
case "double":
|
|
630
629
|
return "number";
|
|
630
|
+
case "scaleddecimal2":
|
|
631
|
+
case "scaleddecimal4":
|
|
632
|
+
case "scaleddecimal6":
|
|
633
|
+
case "scaleddecimal8":
|
|
634
|
+
return "scaleddecimal";
|
|
631
635
|
case "boolean":
|
|
632
636
|
return "boolean";
|
|
633
637
|
case "epochtimestamp":
|
|
@@ -907,8 +911,8 @@ const stretchColumnsToFillAvailableSpace = (columns, availableWidth, totalWidth,
|
|
|
907
911
|
}
|
|
908
912
|
return adjustedColumns;
|
|
909
913
|
};
|
|
910
|
-
const dataAndColumnUnchanged = (p, p1) => p.column === p1.column && p.column.valueFormatter(p.
|
|
911
|
-
const dataColumnAndKeyUnchanged = (p, p1) => p.column === p1.column && p.
|
|
914
|
+
const dataAndColumnUnchanged = (p, p1) => p.column === p1.column && p.column.valueFormatter(p.dataRow[p.column.name]) === p1.column.valueFormatter(p1.dataRow[p1.column.name]);
|
|
915
|
+
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]);
|
|
912
916
|
const toColumnName = (column) => column.name;
|
|
913
917
|
const isStringColumn = (column) => column.serverDataType === "string";
|
|
914
918
|
const reorderColumnItems = (columnItems, orderedNames) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"column-utils.js","sources":["../../../../../../packages/vuu-utils/src/column-utils.ts"],"sourcesContent":["import type {\n DataSourceRow,\n DataValueType,\n DataValueTypeSimple,\n DateTimeDataValueDescriptor,\n SchemaColumn,\n TableSchema,\n TimeDataValueDescriptor,\n} from \"@vuu-ui/vuu-data-types\";\nimport type {\n VuuAggType,\n VuuAggregation,\n VuuColumnDataType,\n VuuDataRow,\n VuuDataRowDto,\n VuuGroupBy,\n VuuSort,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport type {\n ColumnAlignment,\n ColumnDescriptor,\n ColumnLayout,\n DataValueTypeDescriptor,\n ColumnTypeFormatting,\n ColumnTypeRendering,\n ColumnTypeWithValidationRules,\n DefaultColumnConfiguration,\n GroupColumnDescriptor,\n LookupRenderer,\n MappedValueTypeRenderer,\n PinLocation,\n RuntimeColumnDescriptor,\n TableCellRendererProps,\n TableConfig,\n TableHeading,\n TableHeadings,\n ValueListRenderer,\n} from \"@vuu-ui/vuu-table-types\";\nimport { type CSSProperties } from \"react\";\nimport { moveItem } from \"./array-utils\";\nimport { TableModel } from \"@vuu-ui/vuu-table\";\nimport { queryClosest } from \"./html-utils\";\n\n/**\n * ColumnMap provides a lookup of the index position of a data item within a row\n * by column name.\n */\nexport interface ColumnMap {\n [columnName: string]: number;\n}\n\nexport interface ReverseColumnMap {\n [columnIndex: number]: string;\n}\n\nconst SORT_ASC = \"asc\";\nconst NO_HEADINGS: TableHeadings = [];\nconst DEFAULT_COL_WIDTH = 100;\nconst DEFAULT_MAX_WIDTH = 250;\nconst DEFAULT_MIN_WIDTH = 50;\n// const DEFAULT_FLEX = 0;\n\nexport type SortCriteriaItem = string | [string, \"asc\"]; // TODO where is 'desc'?\n\nexport const AggregationType: { [key: string]: VuuAggType } = {\n Average: 2,\n Count: 3,\n Distinct: 6,\n Sum: 1,\n High: 4,\n Low: 5,\n};\n\nexport function mapSortCriteria(\n sortCriteria: SortCriteriaItem[],\n columnMap: ColumnMap,\n metadataOffset = 0,\n): [number, \"asc\"][] {\n return sortCriteria.map((s) => {\n if (typeof s === \"string\") {\n return [columnMap[s] + metadataOffset, \"asc\"];\n } else if (Array.isArray(s)) {\n const [columnName, sortDir] = s;\n return [columnMap[columnName] + metadataOffset, sortDir || SORT_ASC];\n } else {\n throw Error(\"columnUtils.mapSortCriteria invalid input\");\n }\n });\n}\n\nconst numericTypes = [\"int\", \"long\", \"double\"];\nexport const getDefaultAlignment = (\n serverDataType?: VuuColumnDataType,\n): ColumnAlignment =>\n serverDataType === undefined\n ? \"left\"\n : numericTypes.includes(serverDataType)\n ? \"right\"\n : \"left\";\n\nexport const getRuntimeColumnWidth = (\n col: ColumnDescriptor,\n runtimeColumns: RuntimeColumnDescriptor[],\n) => {\n const runtimeColumn = runtimeColumns.find(({ name }) => name === col.name);\n if (runtimeColumn) {\n return runtimeColumn.width;\n } else {\n return DEFAULT_COL_WIDTH;\n }\n};\n\n// Save the current runtime column widths into the table column config. We do this\n// when user has manually resized a column under a fit layout. From this point,\n// layout becomes manual - there will be no further automatic column sizing.\nexport const applyRuntimeColumnWidthsToConfig = (\n tableConfig: TableConfig,\n columns: RuntimeColumnDescriptor[],\n): TableConfig => {\n return {\n ...tableConfig,\n columns: columns.map((column) => ({\n ...column,\n width: column.width ?? getRuntimeColumnWidth(column, columns),\n })),\n columnLayout: \"manual\",\n };\n};\n\nexport const isValidColumnAlignment = (v: string): v is ColumnAlignment =>\n v === \"left\" || v === \"right\";\n\nexport const isValidPinLocation = (v: string): v is PinLocation =>\n isValidColumnAlignment(v) || v === \"floating\" || v === \"\";\n\nexport type CalculatedColumn = {\n name: string;\n expression: string;\n serverDataType: VuuColumnDataType;\n};\n\nconst VUU_COLUMN_DATA_TYPES: (string | undefined | null)[] = [\n \"long\",\n \"double\",\n \"int\",\n \"string\",\n \"char\",\n \"boolean\",\n];\n\nexport const isVuuColumnDataType = (\n value: string | undefined | null,\n): value is VuuColumnDataType => VUU_COLUMN_DATA_TYPES.includes(value);\n\nexport const fromServerDataType = (\n serverDataType: VuuColumnDataType,\n): DataValueTypeSimple => {\n switch (serverDataType) {\n case \"double\":\n case \"int\":\n case \"long\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n default:\n return \"string\";\n }\n};\n\nexport const isTimestampColumn = ({ serverDataType }: ColumnDescriptor) =>\n serverDataType === \"epochtimestamp\";\n\nexport const isNumericColumn = ({ serverDataType, type }: ColumnDescriptor) => {\n if (\n serverDataType === \"int\" ||\n serverDataType === \"long\" ||\n serverDataType === \"double\"\n ) {\n return true;\n }\n if (typeof type === \"string\") {\n return type === \"number\";\n }\n if (typeof type?.name === \"string\") {\n return type?.name === \"number\";\n }\n\n return false;\n};\n\nexport const isDateTimeDataType = (\n column: ColumnDescriptor,\n): column is DateTimeDataValueDescriptor =>\n (isTypeDescriptor(column.type) ? column.type.name : column.type) ===\n \"date/time\";\n\nexport const isDateTimeDataValue = (column: ColumnDescriptor) =>\n isTimestampColumn(column) || isDateTimeDataType(column);\n\nexport const isTimeDataValue = (\n column?: ColumnDescriptor,\n): column is TimeDataValueDescriptor =>\n (isTypeDescriptor(column?.type) ? column.type.name : column?.type) === \"time\";\n\nexport const isPinned = (column: ColumnDescriptor) =>\n typeof column.pin === \"string\";\n\nexport const hasHeadings = (column: ColumnDescriptor) =>\n Array.isArray(column.heading) && column.heading.length > 0;\n\nexport const isResizing = (column: RuntimeColumnDescriptor) => column.resizing;\n\nexport const isTextColumn = ({ serverDataType }: ColumnDescriptor) =>\n serverDataType === undefined\n ? false\n : serverDataType === \"char\" || serverDataType === \"string\";\n\nexport const toColumnDescriptor = (\n name: string,\n serverDataType?: ColumnDescriptor[\"serverDataType\"],\n): ColumnDescriptor => ({\n name,\n serverDataType,\n});\n\n/**\n *\n */\nexport const isTypeDescriptor = (\n type?: DataValueType,\n): type is DataValueTypeDescriptor =>\n typeof type !== \"undefined\" && typeof type !== \"string\";\n\nconst EMPTY_COLUMN_MAP = {} as const;\n\nexport const isColumnTypeRenderer = (\n renderer?: unknown,\n): renderer is ColumnTypeRendering =>\n typeof (renderer as ColumnTypeRendering)?.name !== \"undefined\";\n\nexport const hasCustomRenderer = (\n type?: DataValueType,\n): type is DataValueTypeDescriptor =>\n isTypeDescriptor(type) && isColumnTypeRenderer(type.renderer);\n\nexport const isLookupRenderer = (\n renderer?: unknown,\n): renderer is LookupRenderer =>\n typeof (renderer as LookupRenderer)?.name !== \"undefined\" &&\n \"lookup\" in (renderer as LookupRenderer);\n\nexport const isValueListRenderer = (\n renderer?: unknown,\n): renderer is ValueListRenderer =>\n typeof (renderer as ValueListRenderer)?.name !== \"undefined\" &&\n Array.isArray((renderer as ValueListRenderer).values);\n\nexport const hasValidationRules = (\n type?: DataValueType,\n): type is ColumnTypeWithValidationRules =>\n isTypeDescriptor(type) && Array.isArray(type.rules) && type.rules.length > 0;\n\nexport const isMappedValueTypeRenderer = (\n renderer?: unknown,\n): renderer is MappedValueTypeRenderer =>\n renderer !== undefined &&\n typeof (renderer as MappedValueTypeRenderer)?.map !== \"undefined\";\n\nexport function buildColumnMap(\n columns?: (ColumnDescriptor | SchemaColumn | string)[],\n): ColumnMap {\n const start = metadataKeys.count;\n if (columns) {\n return columns.reduce((map, column, i) => {\n if (typeof column === \"string\") {\n map[column] = start + i;\n } else {\n map[column.name] = start + i;\n }\n return map;\n }, {} as ColumnMap);\n } else {\n return EMPTY_COLUMN_MAP;\n }\n}\n\nexport function projectUpdates(updates: number[]): number[] {\n const results: number[] = [];\n const metadataOffset = metadataKeys.count - 2;\n for (let i = 0; i < updates.length; i += 3) {\n results[i] = updates[i] + metadataOffset;\n results[i + 1] = updates[i + 1];\n results[i + 2] = updates[i + 2];\n }\n return results;\n}\n\nconst KEY = 6;\n\nexport const metadataKeys = {\n IDX: 0,\n RENDER_IDX: 1,\n IS_LEAF: 2,\n IS_EXPANDED: 3,\n DEPTH: 4,\n COUNT: 5,\n KEY,\n SELECTED: 7,\n TIMESTAMP: 8,\n IS_NEW: 9,\n count: 10,\n // TODO following only used in datamodel\n PARENT_IDX: \"parent_idx\",\n IDX_POINTER: \"idx_pointer\",\n FILTER_COUNT: \"filter_count\",\n NEXT_FILTER_IDX: \"next_filter_idx\",\n} as const;\n\n// This method mutates the passed columns array\nconst insertColumn = (\n columns: RuntimeColumnDescriptor[],\n column: RuntimeColumnDescriptor,\n) => {\n const { originalIdx } = column;\n if (typeof originalIdx === \"number\") {\n for (let i = 0; i < columns.length; i++) {\n const { originalIdx: colIdx = -1 } = columns[i];\n if (colIdx > originalIdx) {\n columns.splice(i, 0, column);\n return columns;\n }\n }\n }\n columns.push(column);\n return columns;\n};\n\nexport const flattenColumnGroup = (\n columns: RuntimeColumnDescriptor[],\n): RuntimeColumnDescriptor[] => {\n if (columns[0]?.isGroup) {\n const [groupColumn, ...nonGroupedColumns] = columns as [\n GroupColumnDescriptor,\n ...RuntimeColumnDescriptor[],\n ];\n groupColumn.columns.forEach((groupColumn) => {\n insertColumn(nonGroupedColumns, groupColumn);\n });\n return nonGroupedColumns;\n } else {\n return columns;\n }\n};\n\nexport function extractGroupColumn({\n availableWidth,\n columns,\n groupBy,\n confirmed = true,\n}: ColumnGroupProps): [\n GroupColumnDescriptor | null,\n RuntimeColumnDescriptor[],\n] {\n if (groupBy && groupBy.length > 0) {\n const flattenedColumns = flattenColumnGroup(columns);\n // Note: groupedColumns will be in column order, not groupBy order\n const [groupedColumns, rest] = flattenedColumns.reduce<\n [RuntimeColumnDescriptor[], RuntimeColumnDescriptor[]]\n >(\n (result, column, i) => {\n const [g, r] = result;\n if (groupBy.includes(column.name)) {\n g.push({\n ...column,\n originalIdx: i,\n });\n } else {\n r.push(column);\n }\n\n return result;\n },\n [[], []],\n );\n if (groupedColumns.length !== groupBy.length) {\n throw Error(\n `extractGroupColumn: no column definition found for all groupBy cols ${JSON.stringify(\n groupBy,\n )} `,\n );\n }\n\n const groupOnly = rest.length === 0;\n\n const groupCount = groupBy.length;\n const groupCols: RuntimeColumnDescriptor[] = groupBy.map((name, idx) => {\n // Keep the cols in same order defined on groupBy\n const column = groupedColumns.find(\n (col) => col.name === name,\n ) as RuntimeColumnDescriptor;\n return {\n ...column,\n groupLevel: groupCount - idx,\n };\n });\n\n const width = groupOnly\n ? availableWidth\n : Math.min(\n availableWidth,\n groupCols.map((c) => c.width).reduce((a, b) => a + b) + 100,\n );\n\n const groupCol = {\n ariaColIndex: 1,\n columns: groupCols,\n heading: [\"group-col\"],\n isGroup: true,\n groupConfirmed: confirmed,\n name: \"group-col\",\n width,\n } as GroupColumnDescriptor;\n\n const withAdjustedAriaIndex: RuntimeColumnDescriptor[] = [];\n let colIndex = 2;\n for (const column of rest) {\n withAdjustedAriaIndex.push({\n ...column,\n ariaColIndex: column.hidden ? -1 : colIndex,\n });\n if (!column.hidden) {\n colIndex += 1;\n }\n }\n\n return [groupCol, withAdjustedAriaIndex];\n }\n return [null, flattenColumnGroup(columns)];\n}\n\nexport const isGroupColumn = (\n column: RuntimeColumnDescriptor,\n): column is GroupColumnDescriptor => column.isGroup === true;\n\n/**\n * groupConfirmed is currently the only 'pending' attribute we use. A\n * value of true is only reset by a follow-up value of false. Intermediary\n * values of undefined are discounted.\n */\nexport const checkConfirmationPending = (previousConfig?: TableModel) => {\n if (previousConfig) {\n const [column] = previousConfig.columns;\n if (column !== undefined && isGroupColumn(column)) {\n return column.groupConfirmed;\n }\n }\n};\n\nexport const isJsonAttribute = (value: unknown) =>\n typeof value === \"string\" && (value.endsWith(\"{\") || value.endsWith(\"[\"));\n\nexport const isJsonGroup = (\n column: RuntimeColumnDescriptor,\n row: VuuDataRow,\n columnMap: ColumnMap,\n) =>\n (column.type as DataValueTypeDescriptor)?.name === \"json\" &&\n isJsonAttribute(row[columnMap[column.name]]);\n\nexport const isJsonColumn = (column: RuntimeColumnDescriptor) =>\n (column.type as DataValueTypeDescriptor)?.name === \"json\";\n\nexport const sortPinnedColumns = (\n columns: RuntimeColumnDescriptor[],\n selectionBookendWidth = 0,\n): RuntimeColumnDescriptor[] => {\n const leftPinnedColumns: RuntimeColumnDescriptor[] = [];\n const rightPinnedColumns: RuntimeColumnDescriptor[] = [];\n const restColumns: RuntimeColumnDescriptor[] = [];\n let pinnedWidthLeft = selectionBookendWidth;\n for (const column of columns) {\n // prettier-ignore\n switch(column.pin){\n case \"left\": {\n leftPinnedColumns.push({\n ...column,\n pinnedWidth: 0,\n pinnedOffset: pinnedWidthLeft\n });\n pinnedWidthLeft += column.width;\n }\n break;\n // store right pinned columns initially in reverse order\n case \"right\": rightPinnedColumns.unshift(column); break;\n default: restColumns.push(column)\n }\n }\n\n if (leftPinnedColumns.length) {\n leftPinnedColumns.push({\n ...(leftPinnedColumns.pop() as RuntimeColumnDescriptor),\n pinnedWidth: pinnedWidthLeft,\n });\n }\n\n let allColumns = leftPinnedColumns.length\n ? leftPinnedColumns.concat(restColumns)\n : restColumns;\n\n if (rightPinnedColumns.length) {\n const measuredRightPinnedColumns: RuntimeColumnDescriptor[] = [];\n let pinnedWidthRight = selectionBookendWidth;\n for (const column of rightPinnedColumns) {\n measuredRightPinnedColumns.unshift({\n ...column,\n pinnedOffset: pinnedWidthRight,\n });\n pinnedWidthRight += column.width;\n }\n measuredRightPinnedColumns[rightPinnedColumns.length - 1].pinnedWidth =\n pinnedWidthRight;\n allColumns = allColumns.concat(measuredRightPinnedColumns);\n }\n\n // reassign ariaColIndex\n if (leftPinnedColumns.length || rightPinnedColumns.length) {\n for (let i = 0; i < allColumns.length; i++) {\n if (allColumns[i].ariaColIndex !== i + 1) {\n allColumns[i] = {\n ...allColumns[i],\n ariaColIndex: i + 1,\n };\n }\n }\n }\n\n return allColumns;\n};\n\nexport const measurePinnedColumns = (\n columns: RuntimeColumnDescriptor[],\n selectionEndSize: number,\n) => {\n let pinnedWidthLeft = 0;\n let pinnedWidthRight = 0;\n let unpinnedWidth = 0;\n for (const column of columns) {\n const { hidden, pin, width } = column;\n const visibleWidth = hidden ? 0 : width;\n if (pin === \"left\") {\n pinnedWidthLeft += visibleWidth;\n } else if (pin === \"right\") {\n pinnedWidthRight += visibleWidth;\n } else {\n unpinnedWidth += visibleWidth;\n }\n }\n return {\n pinnedWidthLeft: pinnedWidthLeft + selectionEndSize,\n pinnedWidthRight: pinnedWidthRight + selectionEndSize,\n unpinnedWidth,\n };\n};\n\nexport const getTableHeadings = (\n columns: RuntimeColumnDescriptor[],\n): TableHeadings => {\n if (columns.some(hasHeadings)) {\n const maxHeadingDepth = columns.reduce<number>(\n (max, { heading }) => Math.max(max, heading?.length ?? 0),\n 0,\n );\n\n let heading: TableHeading | undefined = undefined;\n const tableHeadings: TableHeadings = [];\n let tableHeadingsRow: TableHeading[];\n for (let level = 0; level < maxHeadingDepth; level++) {\n tableHeadingsRow = [];\n columns.forEach(({ heading: columnHeading = NO_HEADINGS, width }) => {\n const label = columnHeading[level] ?? \"\";\n if (heading && heading.label === label) {\n heading.width += width;\n } else {\n heading = { label, width } as TableHeading;\n tableHeadingsRow.push(heading);\n }\n });\n tableHeadings.push(tableHeadingsRow);\n }\n\n return tableHeadings;\n }\n return NO_HEADINGS;\n};\n\nexport const getColumnStyle = ({\n pin,\n pinnedOffset = 0,\n pinnedWidth = 0,\n width,\n}: RuntimeColumnDescriptor) => {\n if (pinnedWidth && pin === \"left\") {\n return {\n left: pinnedOffset,\n width,\n \"--pin-width\": `${pinnedWidth - 3}px`,\n } as CSSProperties;\n } else if (pin === \"left\") {\n return {\n left: pinnedOffset,\n width,\n } as CSSProperties;\n } else if (pinnedWidth && pin === \"right\") {\n return {\n right: pinnedOffset,\n width,\n \"--pin-width\": `${pinnedWidth - 5}px`,\n } as CSSProperties;\n } else if (pin === \"right\") {\n return {\n right: pinnedOffset,\n width,\n } as CSSProperties;\n } else {\n return { width };\n }\n};\n\nconst getPinnedWidthFromElement = (cell: HTMLElement) => {\n const cellStyle = getComputedStyle(cell);\n return parseInt(cellStyle.getPropertyValue(\"--pin-width\"));\n};\n\nexport const getAllCellsInColumn = (\n container: HTMLElement | null,\n colIndex: number,\n): HTMLDivElement[] => {\n const byColIndex = `[aria-colindex='${colIndex}']`;\n return Array.from(\n container?.querySelectorAll(\n `.vuuTableCell${byColIndex},.vuuTableHeaderCell${byColIndex},.vuuTableGroupHeaderCell${byColIndex}`,\n ) ?? [],\n );\n};\n\nexport type PinState = {\n /**\n * The pinned 'endPin' cell\n */\n cell: HTMLElement;\n /**\n * With multiple columns pinned, left pinned columns that follow\n * // the resized column. These will need pinOffset adjustments.\n */\n pinnedCells?: HTMLElement[];\n pinnedWidth: number;\n};\n\nexport const getAriaRowIndex = (rowElement: HTMLElement | null) => {\n const rowIndex = rowElement?.ariaRowIndex;\n if (rowIndex != null) {\n const index = parseInt(rowIndex);\n if (!isNaN(index)) {\n return index;\n }\n }\n return -1;\n};\n\nexport const getAriaColIndex = (cellElement: HTMLElement | null) => {\n const colIndex = cellElement?.ariaColIndex;\n if (colIndex != null) {\n const index = parseInt(colIndex);\n if (!isNaN(index)) {\n return index;\n }\n }\n return -1;\n};\n\nconst getPinDetails = (\n cell: HTMLElement,\n className: \"vuuPinLeft\" | \"vuuPinRight\",\n): PinState => {\n if (cell.classList.contains(\"vuuEndPin\")) {\n return {\n cell,\n pinnedWidth: getPinnedWidthFromElement(cell),\n };\n } else {\n // column is pinned, but it is not the only pinned column and it is not\n // the column that renders the pin outline - the endPin.\n const endPin = cell.parentElement?.querySelector(\n `.${className}.vuuEndPin`,\n ) as HTMLElement;\n if (endPin) {\n let pinnedCells: HTMLElement[] | undefined = undefined;\n\n if (className === \"vuuPinLeft\") {\n // collect all the pinned cells in columns following the resized column\n\n //TODO we need to store each set of columns cells separately, together with original 'left' value\n const container = queryClosest<HTMLElement>(\n cell,\n \".vuuTable-table\",\n true,\n );\n const startIndex = getAriaColIndex(cell);\n const endIndex = getAriaColIndex(endPin);\n pinnedCells = [];\n\n for (let colIndex = startIndex + 1; colIndex <= endIndex; colIndex++) {\n pinnedCells = pinnedCells?.concat(\n getAllCellsInColumn(container, colIndex),\n );\n }\n }\n\n console.log({ pinnedCells });\n\n return {\n cell: endPin,\n pinnedCells,\n pinnedWidth: getPinnedWidthFromElement(endPin),\n };\n } else {\n throw Error(\n \"[column-utils] getPinDetailsFromElement, no endPin on multi column pin\",\n );\n }\n }\n};\n\nexport const getPinStateFromElement = (\n cell: HTMLElement,\n): PinState | undefined => {\n if (cell.classList.contains(\"vuuPinLeft\")) {\n return getPinDetails(cell, \"vuuPinLeft\");\n } else if (cell.classList.contains(\"vuuPinRight\")) {\n return getPinDetails(cell, \"vuuPinRight\");\n }\n};\n\nexport const setAggregations = (\n aggregations: VuuAggregation[],\n column: ColumnDescriptor,\n aggType: VuuAggType,\n) => {\n return aggregations\n .filter((agg) => agg.column !== column.name)\n .concat({ column: column.name, aggType });\n};\n\nexport type ColumnGroupProps = {\n columns: RuntimeColumnDescriptor[];\n groupBy: VuuGroupBy;\n confirmed?: boolean;\n availableWidth: number;\n};\n\nexport const applyGroupByToColumns = (props: ColumnGroupProps) => {\n if (props.groupBy.length) {\n const [groupColumn, nonGroupedColumns] = extractGroupColumn(props);\n if (groupColumn) {\n return [groupColumn as RuntimeColumnDescriptor].concat(nonGroupedColumns);\n }\n } else if (props.columns[0]?.isGroup) {\n return flattenColumnGroup(props.columns);\n }\n return props.columns;\n};\n\nexport const applySortToColumns = (\n columns: RuntimeColumnDescriptor[],\n sort: VuuSort,\n) =>\n columns.map((column) => {\n const sorted = getSortType(column, sort);\n if (sorted !== undefined) {\n return {\n ...column,\n sorted,\n };\n } else if (column.sorted) {\n return {\n ...column,\n sorted: undefined,\n };\n } else {\n return column;\n }\n });\n\nexport const removeSort = (columns: RuntimeColumnDescriptor[]) =>\n columns.map((col) => (col.sorted ? { ...col, sorted: undefined } : col));\n\nexport const existingSort = (columns: RuntimeColumnDescriptor[]) =>\n columns.some((col) => col.sorted);\n\nconst getSortType = (column: ColumnDescriptor, { sortDefs }: VuuSort) => {\n const sortDef = sortDefs.find((sortCol) => sortCol.column === column.name);\n if (sortDef) {\n return sortDefs.length > 1\n ? (sortDefs.indexOf(sortDef) + 1) * (sortDef.sortType === \"A\" ? 1 : -1)\n : sortDef.sortType;\n }\n};\n\n// Calculated columns have the formal 'name:datatype:expression'\nexport const getColumnName = (name: string) => {\n const pos = name.indexOf(\":\");\n if (pos === -1) {\n return name;\n } else {\n return name.slice(0, pos);\n }\n};\n\nexport const getColumnLabel = (column: ColumnDescriptor) => {\n if (column.label) {\n return column.label;\n } else if (isCalculatedColumn(column.name)) {\n const { name } = getCalculatedColumnDetails(column);\n // calculated column name follows pattern: `name:serverDataType:expression`\n return name ?? column.name;\n } else {\n return column.name;\n }\n};\n\nexport const findColumn = (\n columns: RuntimeColumnDescriptor[],\n columnName: string,\n): RuntimeColumnDescriptor | undefined => {\n const column = columns.find((col) => col.name === columnName);\n if (column) {\n return column;\n } else {\n const groupColumn = columns.find(\n (col) => col.isGroup,\n ) as GroupColumnDescriptor;\n if (groupColumn) {\n return findColumn(groupColumn.columns, columnName);\n }\n }\n};\n\nexport function updateColumn<T extends ColumnDescriptor>(\n columns: T[],\n column: T,\n): T[];\nexport function updateColumn(\n columns: RuntimeColumnDescriptor[],\n column: string,\n options: Partial<ColumnDescriptor>,\n): RuntimeColumnDescriptor[];\nexport function updateColumn(\n columns: RuntimeColumnDescriptor[],\n column: string | RuntimeColumnDescriptor,\n options?: Partial<ColumnDescriptor>,\n) {\n const targetColumn =\n typeof column === \"string\"\n ? columns.find((col) => col.name === column)\n : column;\n if (targetColumn) {\n const replacementColumn = options\n ? { ...targetColumn, ...options }\n : targetColumn;\n return columns.map((col) =>\n col.name === replacementColumn.name ? replacementColumn : col,\n );\n } else {\n throw Error(\"column-utils.replaceColun, column not found\");\n }\n}\n\nexport const toDataSourceColumns = (column: ColumnDescriptor) => column.name;\n\nexport const dataSourceRowToDataRowDto = (\n row: DataSourceRow,\n columnMap: ColumnMap,\n): VuuDataRowDto => {\n return Object.entries(columnMap).reduce<VuuDataRowDto>(\n (map, [colName, key]) => {\n map[colName] = row[key];\n return map;\n },\n {},\n );\n};\n\nexport const isDataLoading = (columns: RuntimeColumnDescriptor[]) => {\n return isGroupColumn(columns[0]) && columns[0].groupConfirmed === false;\n};\n\nexport const getColumnsInViewport = (\n columns: RuntimeColumnDescriptor[],\n vpStart: number,\n vpEnd: number,\n): [RuntimeColumnDescriptor[], number] => {\n const visibleColumns: RuntimeColumnDescriptor[] = [];\n let preSpan = 0;\n let rightPinnedOnly = false;\n\n for (let columnOffset = 0, i = 0; i < columns.length; i++) {\n const column = columns[i];\n // TODO if we were to measure the pinned columns first,\n // might be able to save rendering some columns ?\n if (column.hidden) {\n continue;\n } else if (column.pin === \"right\") {\n visibleColumns.push(column);\n } else if (rightPinnedOnly) {\n continue;\n } else if (columnOffset + column.width < vpStart) {\n if (column.pin === \"left\") {\n visibleColumns.push(column);\n } else if (\n columnOffset + column.width + columns[i + 1]?.width >\n vpStart\n ) {\n visibleColumns.push(column);\n } else {\n preSpan += column.width;\n }\n } else if (columnOffset > vpEnd) {\n rightPinnedOnly = true;\n } else {\n visibleColumns.push(column);\n }\n columnOffset += column.width;\n }\n\n return [visibleColumns, preSpan];\n};\n\nexport const isNotHidden = (column: RuntimeColumnDescriptor) =>\n column.hidden !== true;\n\nexport const visibleColumnAtIndex = (\n columns: RuntimeColumnDescriptor[],\n index: number,\n) => {\n if (columns.every(isNotHidden)) {\n return columns[index];\n } else {\n return columns.filter(isNotHidden).at(index);\n }\n};\n\nconst { DEPTH, IS_LEAF } = metadataKeys;\n\nexport const getGroupIcon = (\n columns: RuntimeColumnDescriptor[],\n row: DataSourceRow,\n): string | undefined => {\n const { [DEPTH]: depth, [IS_LEAF]: isLeaf } = row;\n // Depth can be greater tha group columns when we have just removed a column from groupby\n // but new data has not yet been received.\n if (isLeaf || depth > columns.length) {\n return undefined;\n } else if (depth === 0) {\n return undefined;\n } else {\n const { getIcon } = columns[depth - 1];\n return getIcon?.(row);\n }\n};\n\nexport const getGroupValue = (\n columns: RuntimeColumnDescriptor[],\n row: DataSourceRow,\n columnMap: ColumnMap,\n): string | null => {\n const { [DEPTH]: depth, [IS_LEAF]: isLeaf } = row;\n // Depth can be greater tha group columns when we have just removed a column from groupby\n // but new data has not yet been received.\n if (isLeaf || depth > columns.length) {\n return null;\n } else if (depth === 0) {\n return \"$root\";\n } else {\n // offset allows for $root\n const { name, valueFormatter } = columns[depth - 1];\n\n const value = valueFormatter(row[columnMap[name]]);\n return value;\n }\n};\n\nexport const getDefaultColumnType = (\n serverDataType?: VuuColumnDataType,\n): DataValueTypeSimple => {\n switch (serverDataType) {\n case \"int\":\n case \"long\":\n case \"double\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"epochtimestamp\":\n return \"date/time\";\n default:\n return \"string\";\n }\n};\n\nexport const updateColumnFormatting = <\n T extends ColumnDescriptor = ColumnDescriptor,\n>(\n column: T,\n formatting: ColumnTypeFormatting,\n): T => {\n const { serverDataType, type = getDefaultColumnType(serverDataType) } =\n column;\n\n if (isTypeDescriptor(type)) {\n return { ...column, type: { ...type, formatting } };\n } else {\n return { ...column, type: { name: type, formatting } };\n }\n};\n\nexport function updateColumnType<T extends ColumnDescriptor = ColumnDescriptor>(\n column: T,\n type: DataValueTypeSimple,\n): T {\n return isTypeDescriptor(column.type)\n ? { ...column, type: { ...column.type, name: type } }\n : { ...column, type };\n}\n\nexport const updateColumnRenderProps = <\n T extends ColumnDescriptor = ColumnDescriptor,\n>(\n column: T,\n renderer: ColumnTypeRendering,\n): T => {\n const { serverDataType, type = getDefaultColumnType(serverDataType) } =\n column;\n\n if (isTypeDescriptor(type)) {\n return {\n ...column,\n type: {\n ...type,\n // TODO do we need to preserve any existing attributes from renderer ?\n renderer,\n },\n };\n } else {\n return { ...column, type: { name: type, renderer } };\n }\n};\n\nconst NO_TYPE_SETTINGS = {};\nexport const getTypeFormattingFromColumn = (\n column: ColumnDescriptor,\n): ColumnTypeFormatting => {\n if (isTypeDescriptor(column.type)) {\n return column.type.formatting ?? NO_TYPE_SETTINGS;\n } else {\n return NO_TYPE_SETTINGS;\n }\n};\n\n/**\n * Check that columnDescriptors are included in provided list of subscribec column names (unless they\n * atr 'client side' columns).\n */\nexport const assertAllColumnsAreIncludedInSubscription = (\n columns: ColumnDescriptor[],\n columnNames: string[],\n) => {\n const unsubscribedColumns: string[] = [];\n for (const column of columns) {\n if (column.source !== \"client\" && !columnNames?.includes(column.name)) {\n unsubscribedColumns.push(column.name);\n }\n }\n if (unsubscribedColumns.length > 0) {\n throw Error(\n `[column-utils] assertAllColumnsAreIncludedInSubscription columns not included in subscription: ${unsubscribedColumns.join(\", \")}`,\n );\n }\n};\n/**\n * Return a filter predicate that will reject columns, names of which\n * are not in provided list. Exception made for columns explicitly\n * configured as client columns.\n */\nexport const subscribedOnly =\n (columnNames?: string[]) => (column: ColumnDescriptor) =>\n column.source === \"client\" || columnNames?.includes(column.name);\n\n/**\n * Called from TableSettings.ColumnList when a column is added to subscription.\n *\n * @param subscribedColumns\n * @param availableColumns\n * @param columnName\n * @returns\n */\nexport const addColumnToSubscribedColumns = (\n subscribedColumns: ColumnDescriptor[],\n availableColumns: SchemaColumn[],\n columnName: string,\n) => {\n const byColName =\n (n = columnName) =>\n (column: { name: string }) =>\n column.name === n;\n if (subscribedColumns.findIndex(byColName()) !== -1) {\n throw Error(\n `[column-utils], addColumnToSubscribedColumns column ${columnName} is already subscribed`,\n );\n }\n const indexOfAvailableColumn = availableColumns.findIndex(byColName());\n if (indexOfAvailableColumn === -1) {\n throw Error(\n `[column-utils] addColumnToSubscribedColumns column ${columnName} is not available`,\n );\n }\n\n const newColumn = {\n ...availableColumns[indexOfAvailableColumn],\n } as ColumnDescriptor;\n\n return subscribedColumns.concat(newColumn);\n};\n\nconst CalculatedColumnPattern = /.*:.*:.*/;\n\nexport const isCalculatedColumn = (columnName?: string) =>\n columnName !== undefined && CalculatedColumnPattern.test(columnName);\n\nexport const getCalculatedColumnDetails = (\n column: ColumnDescriptor,\n): Partial<CalculatedColumn> => {\n if (isCalculatedColumn(column.name)) {\n const [name, serverDataType, expression] = column.name.split(/:=?/);\n if (serverDataType && !isVuuColumnDataType(serverDataType)) {\n throw Error(\n `column-utils, getCalculatedColumnDetails ${serverDataType} is not valid type for column ${column.name}`,\n );\n }\n return {\n name: name ?? \"\",\n expression: expression ?? \"\",\n serverDataType: isVuuColumnDataType(serverDataType)\n ? serverDataType\n : undefined,\n };\n } else {\n throw Error(`column.name is nor a calculated column`);\n }\n};\n\nexport const setCalculatedColumnName = (\n column: ColumnDescriptor,\n name: string,\n): ColumnDescriptor => {\n const [, type, expression] = column.name.split(\":\");\n return {\n ...column,\n name: `${name}:${type}:${expression}`,\n };\n};\n\nexport const setCalculatedColumnType = (\n column: ColumnDescriptor,\n type: string,\n): ColumnDescriptor => {\n const [name, , expression] = column.name.split(\":\");\n return {\n ...column,\n name: `${name}:${type}:${expression}`,\n };\n};\n\n// TODO should we validate the expression here ?\nexport const setCalculatedColumnExpression = (\n column: ColumnDescriptor,\n expression: string,\n): ColumnDescriptor => {\n const [name, type] = column.name.split(\":\");\n return {\n ...column,\n name: `${name}:${type}:=${expression}`,\n };\n};\n\nexport const moveColumnTo = (\n columns: ColumnDescriptor[],\n column: ColumnDescriptor,\n newIndex: number,\n) => {\n const index = columns.findIndex((col) => col.name === column.name);\n return moveItem(columns, index, newIndex);\n};\n\nexport function replaceColumn<\n C extends ColumnDescriptor = RuntimeColumnDescriptor,\n>(columns: C[], column: C) {\n return columns.map((col) => (col.name === column.name ? column : col));\n}\n\nconst vuuTimestampColumns = [\"vuuCreatedTimestamp\", \"vuuUpdatedTimestamp\"];\n\nconst notVuuTimestamps = (column: { name: string }) =>\n !vuuTimestampColumns.includes(column.name);\n\nexport const applyDefaultColumnConfig = (\n { columns, table }: TableSchema,\n getDefaultColumnConfig?: DefaultColumnConfiguration,\n) => {\n if (typeof getDefaultColumnConfig === \"function\") {\n return columns.filter(notVuuTimestamps).map((column) => {\n const config = getDefaultColumnConfig(table.table, column.name);\n if (config) {\n return {\n ...column,\n ...config,\n };\n } else {\n return column;\n }\n });\n } else {\n return columns;\n }\n};\n\nexport type columnOptions = {\n availableWidth?: number;\n columnLayout?: ColumnLayout;\n defaultWidth?: number;\n defaultMinWidth?: number;\n defaultMaxWidth?: number;\n defaultFlex?: number;\n};\n\ntype ColumnLayoutOptions = Pick<\n columnOptions,\n \"defaultMinWidth\" | \"defaultMaxWidth\" | \"defaultWidth\"\n>;\n\ninterface StaticColumnLayoutOptions extends ColumnLayoutOptions {\n columnLayout: \"manual\" | \"static\";\n}\ninterface FitColumnLayoutOptions extends ColumnLayoutOptions {\n availableWidth?: number;\n columnLayout: \"fit\";\n}\n\ntype ColumnStats = {\n flexCount: number;\n totalMinWidth: number;\n totalMaxWidth: number;\n totalWidth: number;\n};\n\nconst measureColumns = (\n columns: RuntimeColumnDescriptor[],\n defaultMaxWidth: number,\n defaultMinWidth: number,\n) =>\n columns.reduce<ColumnStats>(\n (aggregated, column) => {\n if (column.hidden !== true) {\n aggregated.totalMinWidth += column.minWidth ?? defaultMinWidth;\n aggregated.totalMaxWidth += column.maxWidth ?? defaultMaxWidth;\n aggregated.totalWidth += column.width;\n aggregated.flexCount += column.flex ?? 0;\n }\n return aggregated;\n },\n { totalMinWidth: 0, totalMaxWidth: 0, totalWidth: 0, flexCount: 0 },\n );\n\nexport function applyWidthToColumns(\n columns: RuntimeColumnDescriptor[],\n options: StaticColumnLayoutOptions | FitColumnLayoutOptions,\n): RuntimeColumnDescriptor[];\n\nexport function applyWidthToColumns(\n columns: RuntimeColumnDescriptor[],\n {\n availableWidth = 0,\n columnLayout = \"static\",\n defaultWidth = DEFAULT_COL_WIDTH,\n defaultMinWidth = DEFAULT_MIN_WIDTH,\n defaultMaxWidth = DEFAULT_MAX_WIDTH,\n }: // defaultFlex = DEFAULT_FLEX,\n columnOptions,\n): RuntimeColumnDescriptor[] {\n if (columnLayout === \"fit\") {\n const { totalMinWidth, totalMaxWidth, totalWidth, flexCount } =\n measureColumns(columns, defaultMaxWidth, defaultMinWidth);\n\n if (totalMaxWidth < availableWidth) {\n return assignMaxWidthToAll(columns, defaultMaxWidth);\n } else if (totalMinWidth > availableWidth) {\n return columns;\n } else if (totalWidth > availableWidth) {\n return shrinkColumnsToFitAvailableSpace(\n columns,\n availableWidth,\n totalWidth,\n defaultMinWidth,\n defaultWidth,\n flexCount,\n );\n } else if (totalWidth < availableWidth) {\n return stretchColumnsToFillAvailableSpace(\n columns,\n availableWidth,\n totalWidth,\n defaultMaxWidth,\n defaultWidth,\n );\n }\n }\n return columns;\n}\n\nconst assignMaxWidthToAll = (\n columns: RuntimeColumnDescriptor[],\n defaultMaxWidth: number,\n) => {\n return columns.map((column) => {\n const { maxWidth = defaultMaxWidth } = column;\n if (column.width === maxWidth) {\n return column;\n } else {\n return {\n ...column,\n width: maxWidth,\n };\n }\n });\n};\n\nconst shrinkColumnsToFitAvailableSpace = (\n columns: RuntimeColumnDescriptor[],\n availableWidth: number,\n totalWidth: number,\n defaultMinWidth: number,\n defaultWidth: number,\n flexCount: number,\n) => {\n const excessWidth = totalWidth - availableWidth;\n const inFlexMode = flexCount > 0;\n let excessWidthPerColumn = excessWidth / (flexCount || columns.length);\n let columnsNotYetAtMinWidth = columns.length;\n let unassignedExcess = 0;\n let newColumns = columns.map<RuntimeColumnDescriptor>((column) => {\n const {\n minWidth = defaultMinWidth,\n width = defaultWidth,\n flex = 0,\n } = column;\n if (inFlexMode && flex === 0) {\n return column;\n }\n const adjustedWidth = width - excessWidthPerColumn;\n if (adjustedWidth < minWidth) {\n columnsNotYetAtMinWidth -= 1;\n unassignedExcess += minWidth - adjustedWidth;\n return { ...column, width: minWidth };\n } else {\n return { ...column, width: adjustedWidth };\n }\n });\n if (unassignedExcess === 0) {\n return newColumns;\n } else {\n excessWidthPerColumn = unassignedExcess / columnsNotYetAtMinWidth;\n newColumns = newColumns.map((column) => {\n const adjustedWidth = column.width - excessWidthPerColumn;\n if (column.width !== column.minWidth) {\n return { ...column, width: adjustedWidth };\n } else {\n return column;\n }\n });\n return newColumns;\n }\n};\n\nconst hasFlex = ({ flex }: ColumnDescriptor) => typeof flex === \"number\";\n\nconst stretchColumnsToFillAvailableSpace = (\n columns: RuntimeColumnDescriptor[],\n availableWidth: number,\n totalWidth: number,\n defaultMaxWidth: number,\n defaultWidth: number,\n) => {\n let freeSpaceToBeFilled = availableWidth - totalWidth;\n let adjustedColumns = columns;\n\n const canGrow = ({\n width = defaultWidth,\n maxWidth = defaultMaxWidth,\n }: ColumnDescriptor) => width < maxWidth;\n\n while (freeSpaceToBeFilled > 0) {\n const flexCols = adjustedColumns.filter(\n (col) => hasFlex(col) && canGrow(col),\n );\n const columnsNotYetAtMaxWidth =\n flexCols.length || adjustedColumns.filter(canGrow).length;\n\n // THis deos not take flex correctly into account\n const additionalWidthPerColumn = Math.ceil(\n freeSpaceToBeFilled / columnsNotYetAtMaxWidth,\n );\n adjustedColumns = columns.map((column) => {\n const {\n maxWidth = defaultMaxWidth,\n width = defaultWidth,\n flex = 0,\n } = column;\n if (flexCols.length > 0 && flex === 0) {\n return column;\n }\n\n // we rounded the additionalWidthPerColumn up, so make sure\n // we don't over-assign\n const adjustmentAmount = Math.min(\n additionalWidthPerColumn,\n freeSpaceToBeFilled,\n );\n const adjustedWidth = width + adjustmentAmount;\n if (adjustedWidth > maxWidth) {\n freeSpaceToBeFilled -= adjustedWidth - maxWidth;\n return { ...column, width: maxWidth };\n } else {\n freeSpaceToBeFilled -= adjustmentAmount;\n return { ...column, width: adjustedWidth };\n }\n });\n }\n return adjustedColumns;\n};\n\n/**\n * A memo compare function for cell renderers. Can be used to suppress\n * render where column and data are both unchanged. Avoids render\n * when row changes, where changes in row are unrelated to this cell.\n * Suitabnle only for readonly cell renderers. See below for editable\n * cell renderers.\n */\nexport const dataAndColumnUnchanged = (\n p: TableCellRendererProps,\n p1: TableCellRendererProps,\n) =>\n p.column === p1.column &&\n p.column.valueFormatter(p.row[p.columnMap[p.column.name]]) ===\n p1.column.valueFormatter(p1.row[p1.columnMap[p1.column.name]]);\n\n/**\n * A memo compare function for cell renderers. Can be used to suppress\n * render where column, row key and data are all unchanged. Avoids render\n * when row changes, where changes in row are unrelated to this cell.\n * Suitable for editable cells. Including key in compare is not strictly\n * necessary for rendering, but it is important in the event that user\n * edits data - ensures we never have a stale key.\n */\nexport const dataColumnAndKeyUnchanged = (\n p: TableCellRendererProps,\n p1: TableCellRendererProps,\n) =>\n p.column === p1.column &&\n p.row[KEY] === p1.row[KEY] &&\n p.column.valueFormatter(p.row[p.columnMap[p.column.name]]) ===\n p1.column.valueFormatter(p1.row[p1.columnMap[p1.column.name]]);\n\nexport const toColumnName = (column: ColumnDescriptor) => column.name;\nexport const isStringColumn = (column: ColumnDescriptor) =>\n column.serverDataType === \"string\";\n\n/**\n * Given an ordered list of column names, return column items in same order\n */\nexport const reorderColumnItems = <\n T extends { name: string } = { name: string },\n>(\n columnItems: Array<T>,\n orderedNames: string[],\n): T[] => {\n const columns: T[] = [];\n let previousName = \"\";\n for (const name of orderedNames) {\n // Because of the way ordered names are captured, it can happen that a duplicate entry\n // is captured for the dropped item. Ignore it. Only observed on slow clients.\n if (previousName !== name) {\n const columnItem = columnItems.find((c) => c.name === name);\n if (columnItem) {\n columns.push(columnItem);\n }\n previousName = name;\n }\n }\n return columns;\n};\n\nexport const columnByAriaIndex = (\n columns: RuntimeColumnDescriptor[],\n ariaColIndex: number,\n) => {\n const column = columns[ariaColIndex - 1];\n if (column && column.ariaColIndex === ariaColIndex) {\n return column;\n } else if (column && column.ariaColIndex < ariaColIndex) {\n if (columns[ariaColIndex]?.ariaColIndex === ariaColIndex) {\n return columns[ariaColIndex];\n }\n }\n throw Error(`no column with aria-colIndex ${ariaColIndex}`);\n};\n"],"names":["groupColumn","heading","queryClosest","moveItem"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"column-utils.js","sources":["../../../../../../packages/vuu-utils/src/column-utils.ts"],"sourcesContent":["import type {\n DataSourceRow,\n DataValueType,\n DataValueTypeSimple,\n DateTimeDataValueDescriptor,\n SchemaColumn,\n TableSchema,\n TimeDataValueDescriptor,\n} from \"@vuu-ui/vuu-data-types\";\nimport type {\n VuuAggType,\n VuuAggregation,\n VuuColumnDataType,\n VuuDataRowDto,\n VuuGroupBy,\n VuuSort,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport type {\n ColumnAlignment,\n ColumnDescriptor,\n ColumnLayout,\n DataValueTypeDescriptor,\n ColumnTypeFormatting,\n ColumnTypeRendering,\n ColumnTypeWithValidationRules,\n DefaultColumnConfiguration,\n GroupColumnDescriptor,\n LookupRenderer,\n MappedValueTypeRenderer,\n PinLocation,\n RuntimeColumnDescriptor,\n TableCellRendererProps,\n TableConfig,\n TableHeading,\n TableHeadings,\n ValueListRenderer,\n DataRow,\n} from \"@vuu-ui/vuu-table-types\";\nimport { type CSSProperties } from \"react\";\nimport { moveItem } from \"./array-utils\";\nimport { TableModel } from \"@vuu-ui/vuu-table\";\nimport { queryClosest } from \"./html-utils\";\n\n/**\n * ColumnMap provides a lookup of the index position of a data item within a row\n * by column name.\n */\nexport interface ColumnMap {\n [columnName: string]: number;\n}\n\nexport interface ReverseColumnMap {\n [columnIndex: number]: string;\n}\n\nconst SORT_ASC = \"asc\";\nconst NO_HEADINGS: TableHeadings = [];\nconst DEFAULT_COL_WIDTH = 100;\nconst DEFAULT_MAX_WIDTH = 250;\nconst DEFAULT_MIN_WIDTH = 50;\n// const DEFAULT_FLEX = 0;\n\nexport type SortCriteriaItem = string | [string, \"asc\"]; // TODO where is 'desc'?\n\nexport const AggregationType: { [key: string]: VuuAggType } = {\n Average: 2,\n Count: 3,\n Distinct: 6,\n Sum: 1,\n High: 4,\n Low: 5,\n};\n\nexport function mapSortCriteria(\n sortCriteria: SortCriteriaItem[],\n columnMap: ColumnMap,\n metadataOffset = 0,\n): [number, \"asc\"][] {\n return sortCriteria.map((s) => {\n if (typeof s === \"string\") {\n return [columnMap[s] + metadataOffset, \"asc\"];\n } else if (Array.isArray(s)) {\n const [columnName, sortDir] = s;\n return [columnMap[columnName] + metadataOffset, sortDir || SORT_ASC];\n } else {\n throw Error(\"columnUtils.mapSortCriteria invalid input\");\n }\n });\n}\n\nconst numericTypes = [\"int\", \"long\", \"double\"];\nexport const getDefaultAlignment = (\n serverDataType?: VuuColumnDataType,\n): ColumnAlignment =>\n serverDataType === undefined\n ? \"left\"\n : numericTypes.includes(serverDataType)\n ? \"right\"\n : \"left\";\n\nexport const getRuntimeColumnWidth = (\n col: ColumnDescriptor,\n runtimeColumns: RuntimeColumnDescriptor[],\n) => {\n const runtimeColumn = runtimeColumns.find(({ name }) => name === col.name);\n if (runtimeColumn) {\n return runtimeColumn.width;\n } else {\n return DEFAULT_COL_WIDTH;\n }\n};\n\n// Save the current runtime column widths into the table column config. We do this\n// when user has manually resized a column under a fit layout. From this point,\n// layout becomes manual - there will be no further automatic column sizing.\nexport const applyRuntimeColumnWidthsToConfig = (\n tableConfig: TableConfig,\n columns: RuntimeColumnDescriptor[],\n): TableConfig => {\n return {\n ...tableConfig,\n columns: columns.map((column) => ({\n ...column,\n width: column.width ?? getRuntimeColumnWidth(column, columns),\n })),\n columnLayout: \"manual\",\n };\n};\n\nexport const isValidColumnAlignment = (v: string): v is ColumnAlignment =>\n v === \"left\" || v === \"right\";\n\nexport const isValidPinLocation = (v: string): v is PinLocation =>\n isValidColumnAlignment(v) || v === \"floating\" || v === \"\";\n\nexport type CalculatedColumn = {\n name: string;\n expression: string;\n serverDataType: VuuColumnDataType;\n};\n\nconst VUU_COLUMN_DATA_TYPES: (string | undefined | null)[] = [\n \"long\",\n \"double\",\n \"int\",\n \"string\",\n \"char\",\n \"boolean\",\n];\n\nexport const isVuuColumnDataType = (\n value: string | undefined | null,\n): value is VuuColumnDataType => VUU_COLUMN_DATA_TYPES.includes(value);\n\nexport const fromServerDataType = (\n serverDataType: VuuColumnDataType,\n): DataValueTypeSimple => {\n switch (serverDataType) {\n case \"double\":\n case \"int\":\n case \"long\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n default:\n return \"string\";\n }\n};\n\nexport const isTimestampColumn = ({ serverDataType }: ColumnDescriptor) =>\n serverDataType === \"epochtimestamp\";\n\nexport const isNumericColumn = ({ serverDataType, type }: ColumnDescriptor) => {\n if (\n serverDataType === \"int\" ||\n serverDataType === \"long\" ||\n serverDataType === \"double\"\n ) {\n return true;\n }\n if (typeof type === \"string\") {\n return type === \"number\";\n }\n if (typeof type?.name === \"string\") {\n return type?.name === \"number\";\n }\n\n return false;\n};\n\nexport const isDateTimeDataType = (\n column: ColumnDescriptor,\n): column is DateTimeDataValueDescriptor =>\n (isTypeDescriptor(column.type) ? column.type.name : column.type) ===\n \"date/time\";\n\nexport const isDateTimeDataValue = (column: ColumnDescriptor) =>\n isTimestampColumn(column) || isDateTimeDataType(column);\n\nexport const isTimeDataValue = (\n column?: ColumnDescriptor,\n): column is TimeDataValueDescriptor =>\n (isTypeDescriptor(column?.type) ? column.type.name : column?.type) === \"time\";\n\nexport const isPinned = (column: ColumnDescriptor) =>\n typeof column.pin === \"string\";\n\nexport const hasHeadings = (column: ColumnDescriptor) =>\n Array.isArray(column.heading) && column.heading.length > 0;\n\nexport const isResizing = (column: RuntimeColumnDescriptor) => column.resizing;\n\nexport const isTextColumn = ({ serverDataType }: ColumnDescriptor) =>\n serverDataType === undefined\n ? false\n : serverDataType === \"char\" || serverDataType === \"string\";\n\nexport const toColumnDescriptor = (\n name: string,\n serverDataType?: ColumnDescriptor[\"serverDataType\"],\n): ColumnDescriptor => ({\n name,\n serverDataType,\n});\n\n/**\n *\n */\nexport const isTypeDescriptor = (\n type?: DataValueType,\n): type is DataValueTypeDescriptor =>\n typeof type !== \"undefined\" && typeof type !== \"string\";\n\nconst EMPTY_COLUMN_MAP = {} as const;\n\nexport const isColumnTypeRenderer = (\n renderer?: unknown,\n): renderer is ColumnTypeRendering =>\n typeof (renderer as ColumnTypeRendering)?.name !== \"undefined\";\n\nexport const hasCustomRenderer = (\n type?: DataValueType,\n): type is DataValueTypeDescriptor =>\n isTypeDescriptor(type) && isColumnTypeRenderer(type.renderer);\n\nexport const isLookupRenderer = (\n renderer?: unknown,\n): renderer is LookupRenderer =>\n typeof (renderer as LookupRenderer)?.name !== \"undefined\" &&\n \"lookup\" in (renderer as LookupRenderer);\n\nexport const isValueListRenderer = (\n renderer?: unknown,\n): renderer is ValueListRenderer =>\n typeof (renderer as ValueListRenderer)?.name !== \"undefined\" &&\n Array.isArray((renderer as ValueListRenderer).values);\n\nexport const hasValidationRules = (\n type?: DataValueType,\n): type is ColumnTypeWithValidationRules =>\n isTypeDescriptor(type) && Array.isArray(type.rules) && type.rules.length > 0;\n\nexport const isMappedValueTypeRenderer = (\n renderer?: unknown,\n): renderer is MappedValueTypeRenderer =>\n renderer !== undefined &&\n typeof (renderer as MappedValueTypeRenderer)?.map !== \"undefined\";\n\nexport function buildColumnMap(\n columns?: readonly (ColumnDescriptor | SchemaColumn | string)[],\n): ColumnMap {\n const start = metadataKeys.count;\n if (columns) {\n return columns.reduce((map, column, i) => {\n if (typeof column === \"string\") {\n map[column] = start + i;\n } else {\n map[column.name] = start + i;\n }\n return map;\n }, {} as ColumnMap);\n } else {\n return EMPTY_COLUMN_MAP;\n }\n}\n\nexport function projectUpdates(updates: number[]): number[] {\n const results: number[] = [];\n const metadataOffset = metadataKeys.count - 2;\n for (let i = 0; i < updates.length; i += 3) {\n results[i] = updates[i] + metadataOffset;\n results[i + 1] = updates[i + 1];\n results[i + 2] = updates[i + 2];\n }\n return results;\n}\n\nconst KEY = 6;\n\nexport const metadataKeys = {\n IDX: 0,\n RENDER_IDX: 1,\n IS_LEAF: 2,\n IS_EXPANDED: 3,\n DEPTH: 4,\n COUNT: 5,\n KEY,\n SELECTED: 7,\n TIMESTAMP: 8,\n IS_NEW: 9,\n count: 10,\n // TODO following only used in datamodel\n PARENT_IDX: \"parent_idx\",\n IDX_POINTER: \"idx_pointer\",\n FILTER_COUNT: \"filter_count\",\n NEXT_FILTER_IDX: \"next_filter_idx\",\n} as const;\n\n// This method mutates the passed columns array\nconst insertColumn = (\n columns: RuntimeColumnDescriptor[],\n column: RuntimeColumnDescriptor,\n) => {\n const { originalIdx } = column;\n if (typeof originalIdx === \"number\") {\n for (let i = 0; i < columns.length; i++) {\n const { originalIdx: colIdx = -1 } = columns[i];\n if (colIdx > originalIdx) {\n columns.splice(i, 0, column);\n return columns;\n }\n }\n }\n columns.push(column);\n return columns;\n};\n\nexport const flattenColumnGroup = (\n columns: RuntimeColumnDescriptor[],\n): RuntimeColumnDescriptor[] => {\n if (columns[0]?.isGroup) {\n const [groupColumn, ...nonGroupedColumns] = columns as [\n GroupColumnDescriptor,\n ...RuntimeColumnDescriptor[],\n ];\n groupColumn.columns.forEach((groupColumn) => {\n insertColumn(nonGroupedColumns, groupColumn);\n });\n return nonGroupedColumns;\n } else {\n return columns;\n }\n};\n\nexport function extractGroupColumn({\n availableWidth,\n columns,\n groupBy,\n confirmed = true,\n}: ColumnGroupProps): [\n GroupColumnDescriptor | null,\n RuntimeColumnDescriptor[],\n] {\n if (groupBy && groupBy.length > 0) {\n const flattenedColumns = flattenColumnGroup(columns);\n // Note: groupedColumns will be in column order, not groupBy order\n const [groupedColumns, rest] = flattenedColumns.reduce<\n [RuntimeColumnDescriptor[], RuntimeColumnDescriptor[]]\n >(\n (result, column, i) => {\n const [g, r] = result;\n if (groupBy.includes(column.name)) {\n g.push({\n ...column,\n originalIdx: i,\n });\n } else {\n r.push(column);\n }\n\n return result;\n },\n [[], []],\n );\n if (groupedColumns.length !== groupBy.length) {\n throw Error(\n `extractGroupColumn: no column definition found for all groupBy cols ${JSON.stringify(\n groupBy,\n )} `,\n );\n }\n\n const groupOnly = rest.length === 0;\n\n const groupCount = groupBy.length;\n const groupCols: RuntimeColumnDescriptor[] = groupBy.map((name, idx) => {\n // Keep the cols in same order defined on groupBy\n const column = groupedColumns.find(\n (col) => col.name === name,\n ) as RuntimeColumnDescriptor;\n return {\n ...column,\n groupLevel: groupCount - idx,\n };\n });\n\n const width = groupOnly\n ? availableWidth\n : Math.min(\n availableWidth,\n groupCols.map((c) => c.width).reduce((a, b) => a + b) + 100,\n );\n\n const groupCol = {\n ariaColIndex: 1,\n columns: groupCols,\n heading: [\"group-col\"],\n isGroup: true,\n groupConfirmed: confirmed,\n name: \"group-col\",\n width,\n } as GroupColumnDescriptor;\n\n const withAdjustedAriaIndex: RuntimeColumnDescriptor[] = [];\n let colIndex = 2;\n for (const column of rest) {\n withAdjustedAriaIndex.push({\n ...column,\n ariaColIndex: column.hidden ? -1 : colIndex,\n });\n if (!column.hidden) {\n colIndex += 1;\n }\n }\n\n return [groupCol, withAdjustedAriaIndex];\n }\n return [null, flattenColumnGroup(columns)];\n}\n\nexport const isGroupColumn = (\n column: RuntimeColumnDescriptor,\n): column is GroupColumnDescriptor => column.isGroup === true;\n\n/**\n * groupConfirmed is currently the only 'pending' attribute we use. A\n * value of true is only reset by a follow-up value of false. Intermediary\n * values of undefined are discounted.\n */\nexport const checkConfirmationPending = (previousConfig?: TableModel) => {\n if (previousConfig) {\n const [column] = previousConfig.columns;\n if (column !== undefined && isGroupColumn(column)) {\n return column.groupConfirmed;\n }\n }\n};\n\nexport const isJsonAttribute = (value: unknown) =>\n typeof value === \"string\" && (value.endsWith(\"{\") || value.endsWith(\"[\"));\n\nexport const isJsonGroup = (\n column: RuntimeColumnDescriptor,\n dataRow: DataRow,\n) =>\n (column.type as DataValueTypeDescriptor)?.name === \"json\" &&\n isJsonAttribute(dataRow[column.name]);\n\nexport const isJsonColumn = (column: RuntimeColumnDescriptor) =>\n (column.type as DataValueTypeDescriptor)?.name === \"json\";\n\nexport const sortPinnedColumns = (\n columns: RuntimeColumnDescriptor[],\n selectionBookendWidth = 0,\n): RuntimeColumnDescriptor[] => {\n const leftPinnedColumns: RuntimeColumnDescriptor[] = [];\n const rightPinnedColumns: RuntimeColumnDescriptor[] = [];\n const restColumns: RuntimeColumnDescriptor[] = [];\n let pinnedWidthLeft = selectionBookendWidth;\n for (const column of columns) {\n // prettier-ignore\n switch(column.pin){\n case \"left\": {\n leftPinnedColumns.push({\n ...column,\n pinnedWidth: 0,\n pinnedOffset: pinnedWidthLeft\n });\n pinnedWidthLeft += column.width;\n }\n break;\n // store right pinned columns initially in reverse order\n case \"right\": rightPinnedColumns.unshift(column); break;\n default: restColumns.push(column)\n }\n }\n\n if (leftPinnedColumns.length) {\n leftPinnedColumns.push({\n ...(leftPinnedColumns.pop() as RuntimeColumnDescriptor),\n pinnedWidth: pinnedWidthLeft,\n });\n }\n\n let allColumns = leftPinnedColumns.length\n ? leftPinnedColumns.concat(restColumns)\n : restColumns;\n\n if (rightPinnedColumns.length) {\n const measuredRightPinnedColumns: RuntimeColumnDescriptor[] = [];\n let pinnedWidthRight = selectionBookendWidth;\n for (const column of rightPinnedColumns) {\n measuredRightPinnedColumns.unshift({\n ...column,\n pinnedOffset: pinnedWidthRight,\n });\n pinnedWidthRight += column.width;\n }\n measuredRightPinnedColumns[rightPinnedColumns.length - 1].pinnedWidth =\n pinnedWidthRight;\n allColumns = allColumns.concat(measuredRightPinnedColumns);\n }\n\n // reassign ariaColIndex\n if (leftPinnedColumns.length || rightPinnedColumns.length) {\n for (let i = 0; i < allColumns.length; i++) {\n if (allColumns[i].ariaColIndex !== i + 1) {\n allColumns[i] = {\n ...allColumns[i],\n ariaColIndex: i + 1,\n };\n }\n }\n }\n\n return allColumns;\n};\n\nexport const measurePinnedColumns = (\n columns: RuntimeColumnDescriptor[],\n selectionEndSize: number,\n) => {\n let pinnedWidthLeft = 0;\n let pinnedWidthRight = 0;\n let unpinnedWidth = 0;\n for (const column of columns) {\n const { hidden, pin, width } = column;\n const visibleWidth = hidden ? 0 : width;\n if (pin === \"left\") {\n pinnedWidthLeft += visibleWidth;\n } else if (pin === \"right\") {\n pinnedWidthRight += visibleWidth;\n } else {\n unpinnedWidth += visibleWidth;\n }\n }\n return {\n pinnedWidthLeft: pinnedWidthLeft + selectionEndSize,\n pinnedWidthRight: pinnedWidthRight + selectionEndSize,\n unpinnedWidth,\n };\n};\n\nexport const getTableHeadings = (\n columns: RuntimeColumnDescriptor[],\n): TableHeadings => {\n if (columns.some(hasHeadings)) {\n const maxHeadingDepth = columns.reduce<number>(\n (max, { heading }) => Math.max(max, heading?.length ?? 0),\n 0,\n );\n\n let heading: TableHeading | undefined = undefined;\n const tableHeadings: TableHeadings = [];\n let tableHeadingsRow: TableHeading[];\n for (let level = 0; level < maxHeadingDepth; level++) {\n tableHeadingsRow = [];\n columns.forEach(({ heading: columnHeading = NO_HEADINGS, width }) => {\n const label = columnHeading[level] ?? \"\";\n if (heading && heading.label === label) {\n heading.width += width;\n } else {\n heading = { label, width } as TableHeading;\n tableHeadingsRow.push(heading);\n }\n });\n tableHeadings.push(tableHeadingsRow);\n }\n\n return tableHeadings;\n }\n return NO_HEADINGS;\n};\n\nexport const getColumnStyle = ({\n pin,\n pinnedOffset = 0,\n pinnedWidth = 0,\n width,\n}: RuntimeColumnDescriptor) => {\n if (pinnedWidth && pin === \"left\") {\n return {\n left: pinnedOffset,\n width,\n \"--pin-width\": `${pinnedWidth - 3}px`,\n } as CSSProperties;\n } else if (pin === \"left\") {\n return {\n left: pinnedOffset,\n width,\n } as CSSProperties;\n } else if (pinnedWidth && pin === \"right\") {\n return {\n right: pinnedOffset,\n width,\n \"--pin-width\": `${pinnedWidth - 5}px`,\n } as CSSProperties;\n } else if (pin === \"right\") {\n return {\n right: pinnedOffset,\n width,\n } as CSSProperties;\n } else {\n return { width };\n }\n};\n\nconst getPinnedWidthFromElement = (cell: HTMLElement) => {\n const cellStyle = getComputedStyle(cell);\n return parseInt(cellStyle.getPropertyValue(\"--pin-width\"));\n};\n\nexport const getAllCellsInColumn = (\n container: HTMLElement | null,\n colIndex: number,\n): HTMLDivElement[] => {\n const byColIndex = `[aria-colindex='${colIndex}']`;\n return Array.from(\n container?.querySelectorAll(\n `.vuuTableCell${byColIndex},.vuuTableHeaderCell${byColIndex},.vuuTableGroupHeaderCell${byColIndex}`,\n ) ?? [],\n );\n};\n\nexport type PinState = {\n /**\n * The pinned 'endPin' cell\n */\n cell: HTMLElement;\n /**\n * With multiple columns pinned, left pinned columns that follow\n * // the resized column. These will need pinOffset adjustments.\n */\n pinnedCells?: HTMLElement[];\n pinnedWidth: number;\n};\n\nexport const getAriaRowIndex = (rowElement: HTMLElement | null) => {\n const rowIndex = rowElement?.ariaRowIndex;\n if (rowIndex != null) {\n const index = parseInt(rowIndex);\n if (!isNaN(index)) {\n return index;\n }\n }\n return -1;\n};\n\nexport const getAriaColIndex = (cellElement: HTMLElement | null) => {\n const colIndex = cellElement?.ariaColIndex;\n if (colIndex != null) {\n const index = parseInt(colIndex);\n if (!isNaN(index)) {\n return index;\n }\n }\n return -1;\n};\n\nconst getPinDetails = (\n cell: HTMLElement,\n className: \"vuuPinLeft\" | \"vuuPinRight\",\n): PinState => {\n if (cell.classList.contains(\"vuuEndPin\")) {\n return {\n cell,\n pinnedWidth: getPinnedWidthFromElement(cell),\n };\n } else {\n // column is pinned, but it is not the only pinned column and it is not\n // the column that renders the pin outline - the endPin.\n const endPin = cell.parentElement?.querySelector(\n `.${className}.vuuEndPin`,\n ) as HTMLElement;\n if (endPin) {\n let pinnedCells: HTMLElement[] | undefined = undefined;\n\n if (className === \"vuuPinLeft\") {\n // collect all the pinned cells in columns following the resized column\n\n //TODO we need to store each set of columns cells separately, together with original 'left' value\n const container = queryClosest<HTMLElement>(\n cell,\n \".vuuTable-table\",\n true,\n );\n const startIndex = getAriaColIndex(cell);\n const endIndex = getAriaColIndex(endPin);\n pinnedCells = [];\n\n for (let colIndex = startIndex + 1; colIndex <= endIndex; colIndex++) {\n pinnedCells = pinnedCells?.concat(\n getAllCellsInColumn(container, colIndex),\n );\n }\n }\n\n console.log({ pinnedCells });\n\n return {\n cell: endPin,\n pinnedCells,\n pinnedWidth: getPinnedWidthFromElement(endPin),\n };\n } else {\n throw Error(\n \"[column-utils] getPinDetailsFromElement, no endPin on multi column pin\",\n );\n }\n }\n};\n\nexport const getPinStateFromElement = (\n cell: HTMLElement,\n): PinState | undefined => {\n if (cell.classList.contains(\"vuuPinLeft\")) {\n return getPinDetails(cell, \"vuuPinLeft\");\n } else if (cell.classList.contains(\"vuuPinRight\")) {\n return getPinDetails(cell, \"vuuPinRight\");\n }\n};\n\nexport const setAggregations = (\n aggregations: VuuAggregation[],\n column: ColumnDescriptor,\n aggType: VuuAggType,\n) => {\n return aggregations\n .filter((agg) => agg.column !== column.name)\n .concat({ column: column.name, aggType });\n};\n\nexport type ColumnGroupProps = {\n columns: RuntimeColumnDescriptor[];\n groupBy: VuuGroupBy;\n confirmed?: boolean;\n availableWidth: number;\n};\n\nexport const applyGroupByToColumns = (props: ColumnGroupProps) => {\n if (props.groupBy.length) {\n const [groupColumn, nonGroupedColumns] = extractGroupColumn(props);\n if (groupColumn) {\n return [groupColumn as RuntimeColumnDescriptor].concat(nonGroupedColumns);\n }\n } else if (props.columns[0]?.isGroup) {\n return flattenColumnGroup(props.columns);\n }\n return props.columns;\n};\n\nexport const applySortToColumns = (\n columns: RuntimeColumnDescriptor[],\n sort: VuuSort,\n) =>\n columns.map((column) => {\n const sorted = getSortType(column, sort);\n if (sorted !== undefined) {\n return {\n ...column,\n sorted,\n };\n } else if (column.sorted) {\n return {\n ...column,\n sorted: undefined,\n };\n } else {\n return column;\n }\n });\n\nexport const removeSort = (columns: RuntimeColumnDescriptor[]) =>\n columns.map((col) => (col.sorted ? { ...col, sorted: undefined } : col));\n\nexport const existingSort = (columns: RuntimeColumnDescriptor[]) =>\n columns.some((col) => col.sorted);\n\nconst getSortType = (column: ColumnDescriptor, { sortDefs }: VuuSort) => {\n const sortDef = sortDefs.find((sortCol) => sortCol.column === column.name);\n if (sortDef) {\n return sortDefs.length > 1\n ? (sortDefs.indexOf(sortDef) + 1) * (sortDef.sortType === \"A\" ? 1 : -1)\n : sortDef.sortType;\n }\n};\n\n// Calculated columns have the formal 'name:datatype:expression'\nexport const getColumnName = (name: string) => {\n const pos = name.indexOf(\":\");\n if (pos === -1) {\n return name;\n } else {\n return name.slice(0, pos);\n }\n};\n\nexport const getColumnLabel = (column: ColumnDescriptor) => {\n if (column.label) {\n return column.label;\n } else if (isCalculatedColumn(column.name)) {\n const { name } = getCalculatedColumnDetails(column);\n // calculated column name follows pattern: `name:serverDataType:expression`\n return name ?? column.name;\n } else {\n return column.name;\n }\n};\n\nexport const findColumn = (\n columns: RuntimeColumnDescriptor[],\n columnName: string,\n): RuntimeColumnDescriptor | undefined => {\n const column = columns.find((col) => col.name === columnName);\n if (column) {\n return column;\n } else {\n const groupColumn = columns.find(\n (col) => col.isGroup,\n ) as GroupColumnDescriptor;\n if (groupColumn) {\n return findColumn(groupColumn.columns, columnName);\n }\n }\n};\n\nexport function updateColumn<T extends ColumnDescriptor>(\n columns: readonly T[],\n column: T,\n): T[];\nexport function updateColumn(\n columns: readonly RuntimeColumnDescriptor[],\n column: string,\n options: Partial<ColumnDescriptor>,\n): RuntimeColumnDescriptor[];\nexport function updateColumn(\n columns: readonly RuntimeColumnDescriptor[],\n column: string | RuntimeColumnDescriptor,\n options?: Partial<ColumnDescriptor>,\n) {\n const targetColumn =\n typeof column === \"string\"\n ? columns.find((col) => col.name === column)\n : column;\n if (targetColumn) {\n const replacementColumn = options\n ? { ...targetColumn, ...options }\n : targetColumn;\n return columns.map((col) =>\n col.name === replacementColumn.name ? replacementColumn : col,\n );\n } else {\n throw Error(\"column-utils.replaceColun, column not found\");\n }\n}\n\nexport const toDataSourceColumns = (column: ColumnDescriptor) => column.name;\n\nexport const dataSourceRowToDataRowDto = (\n row: DataSourceRow,\n columnMap: ColumnMap,\n): VuuDataRowDto => {\n return Object.entries(columnMap).reduce<VuuDataRowDto>(\n (map, [colName, key]) => {\n map[colName] = row[key];\n return map;\n },\n {},\n );\n};\n\nexport const isDataLoading = (columns: RuntimeColumnDescriptor[]) => {\n return isGroupColumn(columns[0]) && columns[0].groupConfirmed === false;\n};\n\nexport const getColumnsInViewport = (\n columns: RuntimeColumnDescriptor[],\n vpStart: number,\n vpEnd: number,\n): [RuntimeColumnDescriptor[], number] => {\n const visibleColumns: RuntimeColumnDescriptor[] = [];\n let preSpan = 0;\n let rightPinnedOnly = false;\n\n for (let columnOffset = 0, i = 0; i < columns.length; i++) {\n const column = columns[i];\n // TODO if we were to measure the pinned columns first,\n // might be able to save rendering some columns ?\n if (column.hidden) {\n continue;\n } else if (column.pin === \"right\") {\n visibleColumns.push(column);\n } else if (rightPinnedOnly) {\n continue;\n } else if (columnOffset + column.width < vpStart) {\n if (column.pin === \"left\") {\n visibleColumns.push(column);\n } else if (\n columnOffset + column.width + columns[i + 1]?.width >\n vpStart\n ) {\n visibleColumns.push(column);\n } else {\n preSpan += column.width;\n }\n } else if (columnOffset > vpEnd) {\n rightPinnedOnly = true;\n } else {\n visibleColumns.push(column);\n }\n columnOffset += column.width;\n }\n\n return [visibleColumns, preSpan];\n};\n\nexport const isNotHidden = (column: RuntimeColumnDescriptor) =>\n column.hidden !== true;\n\nexport const visibleColumnAtIndex = (\n columns: RuntimeColumnDescriptor[],\n index: number,\n) => {\n if (columns.every(isNotHidden)) {\n return columns[index];\n } else {\n return columns.filter(isNotHidden).at(index);\n }\n};\n\nexport const getGroupIcon = (\n columns: RuntimeColumnDescriptor[],\n dataRow: DataRow,\n): string | undefined => {\n const { depth, isLeaf } = dataRow;\n // Depth can be greater tha group columns when we have just removed a column from groupby\n // but new data has not yet been received.\n if (isLeaf || depth > columns.length) {\n return undefined;\n } else if (depth === 0) {\n return undefined;\n } else {\n const { getIcon } = columns[depth - 1];\n return getIcon?.(dataRow);\n }\n};\n\nexport const getGroupValue = (\n columns: RuntimeColumnDescriptor[],\n dataRow: DataRow,\n): string | null => {\n const { depth, isLeaf } = dataRow;\n // Depth can be greater tha group columns when we have just removed a column from groupby\n // but new data has not yet been received.\n if (isLeaf || depth > columns.length) {\n return null;\n } else if (depth === 0) {\n return \"$root\";\n } else {\n // offset allows for $root\n const { name, valueFormatter } = columns[depth - 1];\n\n const value = valueFormatter(dataRow[name]);\n return value;\n }\n};\n\nexport const getDefaultColumnType = (\n serverDataType?: VuuColumnDataType,\n): DataValueTypeSimple => {\n switch (serverDataType) {\n case \"int\":\n case \"long\":\n case \"double\":\n return \"number\";\n case \"scaleddecimal2\":\n case \"scaleddecimal4\":\n case \"scaleddecimal6\":\n case \"scaleddecimal8\":\n return \"scaleddecimal\";\n case \"boolean\":\n return \"boolean\";\n case \"epochtimestamp\":\n return \"date/time\";\n default:\n return \"string\";\n }\n};\n\nexport const updateColumnFormatting = <\n T extends ColumnDescriptor = ColumnDescriptor,\n>(\n column: T,\n formatting: ColumnTypeFormatting,\n): T => {\n const { serverDataType, type = getDefaultColumnType(serverDataType) } =\n column;\n\n if (isTypeDescriptor(type)) {\n return { ...column, type: { ...type, formatting } };\n } else {\n return { ...column, type: { name: type, formatting } };\n }\n};\n\nexport function updateColumnType<T extends ColumnDescriptor = ColumnDescriptor>(\n column: T,\n type: DataValueTypeSimple,\n): T {\n return isTypeDescriptor(column.type)\n ? { ...column, type: { ...column.type, name: type } }\n : { ...column, type };\n}\n\nexport const updateColumnRenderProps = <\n T extends ColumnDescriptor = ColumnDescriptor,\n>(\n column: T,\n renderer: ColumnTypeRendering,\n): T => {\n const { serverDataType, type = getDefaultColumnType(serverDataType) } =\n column;\n\n if (isTypeDescriptor(type)) {\n return {\n ...column,\n type: {\n ...type,\n // TODO do we need to preserve any existing attributes from renderer ?\n renderer,\n },\n };\n } else {\n return { ...column, type: { name: type, renderer } };\n }\n};\n\nconst NO_TYPE_SETTINGS = {};\nexport const getTypeFormattingFromColumn = (\n column: ColumnDescriptor,\n): ColumnTypeFormatting => {\n if (isTypeDescriptor(column.type)) {\n return column.type.formatting ?? NO_TYPE_SETTINGS;\n } else {\n return NO_TYPE_SETTINGS;\n }\n};\n\n/**\n * Check that columnDescriptors are included in provided list of subscribec column names (unless they\n * atr 'client side' columns).\n */\nexport const assertAllColumnsAreIncludedInSubscription = (\n columns: readonly ColumnDescriptor[],\n columnNames: string[],\n) => {\n const unsubscribedColumns: string[] = [];\n for (const column of columns) {\n if (column.source !== \"client\" && !columnNames?.includes(column.name)) {\n unsubscribedColumns.push(column.name);\n }\n }\n if (unsubscribedColumns.length > 0) {\n throw Error(\n `[column-utils] assertAllColumnsAreIncludedInSubscription columns not included in subscription: ${unsubscribedColumns.join(\", \")}`,\n );\n }\n};\n/**\n * Return a filter predicate that will reject columns, names of which\n * are not in provided list. Exception made for columns explicitly\n * configured as client columns.\n */\nexport const subscribedOnly =\n (columnNames?: string[]) => (column: ColumnDescriptor) =>\n column.source === \"client\" || columnNames?.includes(column.name);\n\n/**\n * Called from TableSettings.ColumnList when a column is added to subscription.\n *\n * @param subscribedColumns\n * @param availableColumns\n * @param columnName\n * @returns\n */\nexport const addColumnToSubscribedColumns = (\n subscribedColumns: readonly ColumnDescriptor[],\n availableColumns: readonly SchemaColumn[],\n columnName: string,\n) => {\n const byColName =\n (n = columnName) =>\n (column: { name: string }) =>\n column.name === n;\n if (subscribedColumns.findIndex(byColName()) !== -1) {\n throw Error(\n `[column-utils], addColumnToSubscribedColumns column ${columnName} is already subscribed`,\n );\n }\n const indexOfAvailableColumn = availableColumns.findIndex(byColName());\n if (indexOfAvailableColumn === -1) {\n throw Error(\n `[column-utils] addColumnToSubscribedColumns column ${columnName} is not available`,\n );\n }\n\n const newColumn = {\n ...availableColumns[indexOfAvailableColumn],\n } as ColumnDescriptor;\n\n return subscribedColumns.concat(newColumn);\n};\n\nconst CalculatedColumnPattern = /.*:.*:.*/;\n\nexport const isCalculatedColumn = (columnName?: string) =>\n columnName !== undefined && CalculatedColumnPattern.test(columnName);\n\nexport const getCalculatedColumnDetails = (\n column: ColumnDescriptor,\n): Partial<CalculatedColumn> => {\n if (isCalculatedColumn(column.name)) {\n const [name, serverDataType, expression] = column.name.split(/:=?/);\n if (serverDataType && !isVuuColumnDataType(serverDataType)) {\n throw Error(\n `column-utils, getCalculatedColumnDetails ${serverDataType} is not valid type for column ${column.name}`,\n );\n }\n return {\n name: name ?? \"\",\n expression: expression ?? \"\",\n serverDataType: isVuuColumnDataType(serverDataType)\n ? serverDataType\n : undefined,\n };\n } else {\n throw Error(`column.name is nor a calculated column`);\n }\n};\n\nexport const setCalculatedColumnName = (\n column: ColumnDescriptor,\n name: string,\n): ColumnDescriptor => {\n const [, type, expression] = column.name.split(\":\");\n return {\n ...column,\n name: `${name}:${type}:${expression}`,\n };\n};\n\nexport const setCalculatedColumnType = (\n column: ColumnDescriptor,\n type: string,\n): ColumnDescriptor => {\n const [name, , expression] = column.name.split(\":\");\n return {\n ...column,\n name: `${name}:${type}:${expression}`,\n };\n};\n\n// TODO should we validate the expression here ?\nexport const setCalculatedColumnExpression = (\n column: ColumnDescriptor,\n expression: string,\n): ColumnDescriptor => {\n const [name, type] = column.name.split(\":\");\n return {\n ...column,\n name: `${name}:${type}:=${expression}`,\n };\n};\n\nexport const moveColumnTo = (\n columns: ColumnDescriptor[],\n column: ColumnDescriptor,\n newIndex: number,\n) => {\n const index = columns.findIndex((col) => col.name === column.name);\n return moveItem(columns, index, newIndex);\n};\n\nexport function replaceColumn<\n C extends ColumnDescriptor = RuntimeColumnDescriptor,\n>(columns: readonly C[], column: C) {\n return columns.map((col) => (col.name === column.name ? column : col));\n}\n\nconst vuuTimestampColumns = [\"vuuCreatedTimestamp\", \"vuuUpdatedTimestamp\"];\n\nconst notVuuTimestamps = (column: { name: string }) =>\n !vuuTimestampColumns.includes(column.name);\n\nexport const applyDefaultColumnConfig = (\n { columns, table }: TableSchema,\n getDefaultColumnConfig?: DefaultColumnConfiguration,\n) => {\n if (typeof getDefaultColumnConfig === \"function\") {\n return columns.filter(notVuuTimestamps).map((column) => {\n const config = getDefaultColumnConfig(table.table, column.name);\n if (config) {\n return {\n ...column,\n ...config,\n };\n } else {\n return column;\n }\n });\n } else {\n return columns;\n }\n};\n\nexport type columnOptions = {\n availableWidth?: number;\n columnLayout?: ColumnLayout;\n defaultWidth?: number;\n defaultMinWidth?: number;\n defaultMaxWidth?: number;\n defaultFlex?: number;\n};\n\ntype ColumnLayoutOptions = Pick<\n columnOptions,\n \"defaultMinWidth\" | \"defaultMaxWidth\" | \"defaultWidth\"\n>;\n\ninterface StaticColumnLayoutOptions extends ColumnLayoutOptions {\n columnLayout: \"manual\" | \"static\";\n}\ninterface FitColumnLayoutOptions extends ColumnLayoutOptions {\n availableWidth?: number;\n columnLayout: \"fit\";\n}\n\ntype ColumnStats = {\n flexCount: number;\n totalMinWidth: number;\n totalMaxWidth: number;\n totalWidth: number;\n};\n\nconst measureColumns = (\n columns: RuntimeColumnDescriptor[],\n defaultMaxWidth: number,\n defaultMinWidth: number,\n) =>\n columns.reduce<ColumnStats>(\n (aggregated, column) => {\n if (column.hidden !== true) {\n aggregated.totalMinWidth += column.minWidth ?? defaultMinWidth;\n aggregated.totalMaxWidth += column.maxWidth ?? defaultMaxWidth;\n aggregated.totalWidth += column.width;\n aggregated.flexCount += column.flex ?? 0;\n }\n return aggregated;\n },\n { totalMinWidth: 0, totalMaxWidth: 0, totalWidth: 0, flexCount: 0 },\n );\n\nexport function applyWidthToColumns(\n columns: RuntimeColumnDescriptor[],\n options: StaticColumnLayoutOptions | FitColumnLayoutOptions,\n): RuntimeColumnDescriptor[];\n\nexport function applyWidthToColumns(\n columns: RuntimeColumnDescriptor[],\n {\n availableWidth = 0,\n columnLayout = \"static\",\n defaultWidth = DEFAULT_COL_WIDTH,\n defaultMinWidth = DEFAULT_MIN_WIDTH,\n defaultMaxWidth = DEFAULT_MAX_WIDTH,\n }: // defaultFlex = DEFAULT_FLEX,\n columnOptions,\n): RuntimeColumnDescriptor[] {\n if (columnLayout === \"fit\") {\n const { totalMinWidth, totalMaxWidth, totalWidth, flexCount } =\n measureColumns(columns, defaultMaxWidth, defaultMinWidth);\n\n if (totalMaxWidth < availableWidth) {\n return assignMaxWidthToAll(columns, defaultMaxWidth);\n } else if (totalMinWidth > availableWidth) {\n return columns;\n } else if (totalWidth > availableWidth) {\n return shrinkColumnsToFitAvailableSpace(\n columns,\n availableWidth,\n totalWidth,\n defaultMinWidth,\n defaultWidth,\n flexCount,\n );\n } else if (totalWidth < availableWidth) {\n return stretchColumnsToFillAvailableSpace(\n columns,\n availableWidth,\n totalWidth,\n defaultMaxWidth,\n defaultWidth,\n );\n }\n }\n return columns;\n}\n\nconst assignMaxWidthToAll = (\n columns: RuntimeColumnDescriptor[],\n defaultMaxWidth: number,\n) => {\n return columns.map((column) => {\n const { maxWidth = defaultMaxWidth } = column;\n if (column.width === maxWidth) {\n return column;\n } else {\n return {\n ...column,\n width: maxWidth,\n };\n }\n });\n};\n\nconst shrinkColumnsToFitAvailableSpace = (\n columns: RuntimeColumnDescriptor[],\n availableWidth: number,\n totalWidth: number,\n defaultMinWidth: number,\n defaultWidth: number,\n flexCount: number,\n) => {\n const excessWidth = totalWidth - availableWidth;\n const inFlexMode = flexCount > 0;\n let excessWidthPerColumn = excessWidth / (flexCount || columns.length);\n let columnsNotYetAtMinWidth = columns.length;\n let unassignedExcess = 0;\n let newColumns = columns.map<RuntimeColumnDescriptor>((column) => {\n const {\n minWidth = defaultMinWidth,\n width = defaultWidth,\n flex = 0,\n } = column;\n if (inFlexMode && flex === 0) {\n return column;\n }\n const adjustedWidth = width - excessWidthPerColumn;\n if (adjustedWidth < minWidth) {\n columnsNotYetAtMinWidth -= 1;\n unassignedExcess += minWidth - adjustedWidth;\n return { ...column, width: minWidth };\n } else {\n return { ...column, width: adjustedWidth };\n }\n });\n if (unassignedExcess === 0) {\n return newColumns;\n } else {\n excessWidthPerColumn = unassignedExcess / columnsNotYetAtMinWidth;\n newColumns = newColumns.map((column) => {\n const adjustedWidth = column.width - excessWidthPerColumn;\n if (column.width !== column.minWidth) {\n return { ...column, width: adjustedWidth };\n } else {\n return column;\n }\n });\n return newColumns;\n }\n};\n\nconst hasFlex = ({ flex }: ColumnDescriptor) => typeof flex === \"number\";\n\nconst stretchColumnsToFillAvailableSpace = (\n columns: RuntimeColumnDescriptor[],\n availableWidth: number,\n totalWidth: number,\n defaultMaxWidth: number,\n defaultWidth: number,\n) => {\n let freeSpaceToBeFilled = availableWidth - totalWidth;\n let adjustedColumns = columns;\n\n const canGrow = ({\n width = defaultWidth,\n maxWidth = defaultMaxWidth,\n }: ColumnDescriptor) => width < maxWidth;\n\n while (freeSpaceToBeFilled > 0) {\n const flexCols = adjustedColumns.filter(\n (col) => hasFlex(col) && canGrow(col),\n );\n const columnsNotYetAtMaxWidth =\n flexCols.length || adjustedColumns.filter(canGrow).length;\n\n // THis deos not take flex correctly into account\n const additionalWidthPerColumn = Math.ceil(\n freeSpaceToBeFilled / columnsNotYetAtMaxWidth,\n );\n adjustedColumns = columns.map((column) => {\n const {\n maxWidth = defaultMaxWidth,\n width = defaultWidth,\n flex = 0,\n } = column;\n if (flexCols.length > 0 && flex === 0) {\n return column;\n }\n\n // we rounded the additionalWidthPerColumn up, so make sure\n // we don't over-assign\n const adjustmentAmount = Math.min(\n additionalWidthPerColumn,\n freeSpaceToBeFilled,\n );\n const adjustedWidth = width + adjustmentAmount;\n if (adjustedWidth > maxWidth) {\n freeSpaceToBeFilled -= adjustedWidth - maxWidth;\n return { ...column, width: maxWidth };\n } else {\n freeSpaceToBeFilled -= adjustmentAmount;\n return { ...column, width: adjustedWidth };\n }\n });\n }\n return adjustedColumns;\n};\n\n/**\n * A memo compare function for cell renderers. Can be used to suppress\n * render where column and data are both unchanged. Avoids render\n * when row changes, where changes in row are unrelated to this cell.\n * Suitabnle only for readonly cell renderers. See below for editable\n * cell renderers.\n */\nexport const dataAndColumnUnchanged = (\n p: TableCellRendererProps,\n p1: TableCellRendererProps,\n) =>\n p.column === p1.column &&\n p.column.valueFormatter(p.dataRow[p.column.name]) ===\n p1.column.valueFormatter(p1.dataRow[p1.column.name]);\n\n/**\n * A memo compare function for cell renderers. Can be used to suppress\n * render where column, row key and data are all unchanged. Avoids render\n * when row changes, where changes in row are unrelated to this cell.\n * Suitable for editable cells. Including key in compare is not strictly\n * necessary for rendering, but it is important in the event that user\n * edits data - ensures we never have a stale key.\n */\nexport const dataColumnAndKeyUnchanged = (\n p: TableCellRendererProps,\n p1: TableCellRendererProps,\n) =>\n p.column === p1.column &&\n p.dataRow.key === p1.dataRow.key &&\n p.column.valueFormatter(p.dataRow[p.column.name]) ===\n p1.column.valueFormatter(p1.dataRow[p1.column.name]);\n\nexport const toColumnName = (column: ColumnDescriptor) => column.name;\nexport const isStringColumn = (column: ColumnDescriptor) =>\n column.serverDataType === \"string\";\n\n/**\n * Given an ordered list of column names, return column items in same order\n */\nexport const reorderColumnItems = <\n T extends { name: string } = { name: string },\n>(\n columnItems: readonly T[],\n orderedNames: string[],\n): T[] => {\n const columns: T[] = [];\n let previousName = \"\";\n for (const name of orderedNames) {\n // Because of the way ordered names are captured, it can happen that a duplicate entry\n // is captured for the dropped item. Ignore it. Only observed on slow clients.\n if (previousName !== name) {\n const columnItem = columnItems.find((c) => c.name === name);\n if (columnItem) {\n columns.push(columnItem);\n }\n previousName = name;\n }\n }\n return columns;\n};\n\nexport const columnByAriaIndex = (\n columns: RuntimeColumnDescriptor[],\n ariaColIndex: number,\n) => {\n const column = columns[ariaColIndex - 1];\n if (column && column.ariaColIndex === ariaColIndex) {\n return column;\n } else if (column && column.ariaColIndex < ariaColIndex) {\n if (columns[ariaColIndex]?.ariaColIndex === ariaColIndex) {\n return columns[ariaColIndex];\n }\n }\n throw Error(`no column with aria-colIndex ${ariaColIndex}`);\n};\n"],"names":["groupColumn","heading","queryClosest","moveItem"],"mappings":";;;;;AAuDA,MAAM,QAAW,GAAA,KAAA;AACjB,MAAM,cAA6B,EAAC;AACpC,MAAM,iBAAoB,GAAA,GAAA;AAC1B,MAAM,iBAAoB,GAAA,GAAA;AAC1B,MAAM,iBAAoB,GAAA,EAAA;AAKnB,MAAM,eAAiD,GAAA;AAAA,EAC5D,OAAS,EAAA,CAAA;AAAA,EACT,KAAO,EAAA,CAAA;AAAA,EACP,QAAU,EAAA,CAAA;AAAA,EACV,GAAK,EAAA,CAAA;AAAA,EACL,IAAM,EAAA,CAAA;AAAA,EACN,GAAK,EAAA;AACP;AAEO,SAAS,eACd,CAAA,YAAA,EACA,SACA,EAAA,cAAA,GAAiB,CACE,EAAA;AACnB,EAAO,OAAA,YAAA,CAAa,GAAI,CAAA,CAAC,CAAM,KAAA;AAC7B,IAAI,IAAA,OAAO,MAAM,QAAU,EAAA;AACzB,MAAA,OAAO,CAAC,SAAA,CAAU,CAAC,CAAA,GAAI,gBAAgB,KAAK,CAAA;AAAA,KACnC,MAAA,IAAA,KAAA,CAAM,OAAQ,CAAA,CAAC,CAAG,EAAA;AAC3B,MAAM,MAAA,CAAC,UAAY,EAAA,OAAO,CAAI,GAAA,CAAA;AAC9B,MAAA,OAAO,CAAC,SAAU,CAAA,UAAU,CAAI,GAAA,cAAA,EAAgB,WAAW,QAAQ,CAAA;AAAA,KAC9D,MAAA;AACL,MAAA,MAAM,MAAM,2CAA2C,CAAA;AAAA;AACzD,GACD,CAAA;AACH;AAEA,MAAM,YAAe,GAAA,CAAC,KAAO,EAAA,MAAA,EAAQ,QAAQ,CAAA;AAChC,MAAA,mBAAA,GAAsB,CACjC,cAAA,KAEA,cAAmB,KAAA,KAAA,CAAA,GACf,SACA,YAAa,CAAA,QAAA,CAAS,cAAc,CAAA,GAClC,OACA,GAAA;AAEK,MAAA,qBAAA,GAAwB,CACnC,GAAA,EACA,cACG,KAAA;AACH,EAAM,MAAA,aAAA,GAAgB,eAAe,IAAK,CAAA,CAAC,EAAE,IAAK,EAAA,KAAM,IAAS,KAAA,GAAA,CAAI,IAAI,CAAA;AACzE,EAAA,IAAI,aAAe,EAAA;AACjB,IAAA,OAAO,aAAc,CAAA,KAAA;AAAA,GAChB,MAAA;AACL,IAAO,OAAA,iBAAA;AAAA;AAEX;AAKa,MAAA,gCAAA,GAAmC,CAC9C,WAAA,EACA,OACgB,KAAA;AAChB,EAAO,OAAA;AAAA,IACL,GAAG,WAAA;AAAA,IACH,OAAS,EAAA,OAAA,CAAQ,GAAI,CAAA,CAAC,MAAY,MAAA;AAAA,MAChC,GAAG,MAAA;AAAA,MACH,KAAO,EAAA,MAAA,CAAO,KAAS,IAAA,qBAAA,CAAsB,QAAQ,OAAO;AAAA,KAC5D,CAAA,CAAA;AAAA,IACF,YAAc,EAAA;AAAA,GAChB;AACF;AAEO,MAAM,sBAAyB,GAAA,CAAC,CACrC,KAAA,CAAA,KAAM,UAAU,CAAM,KAAA;AAEX,MAAA,kBAAA,GAAqB,CAAC,CACjC,KAAA,sBAAA,CAAuB,CAAC,CAAK,IAAA,CAAA,KAAM,cAAc,CAAM,KAAA;AAQzD,MAAM,qBAAuD,GAAA;AAAA,EAC3D,MAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA;AAEO,MAAM,mBAAsB,GAAA,CACjC,KAC+B,KAAA,qBAAA,CAAsB,SAAS,KAAK;AAExD,MAAA,kBAAA,GAAqB,CAChC,cACwB,KAAA;AACxB,EAAA,QAAQ,cAAgB;AAAA,IACtB,KAAK,QAAA;AAAA,IACL,KAAK,KAAA;AAAA,IACL,KAAK,MAAA;AACH,MAAO,OAAA,QAAA;AAAA,IACT,KAAK,SAAA;AACH,MAAO,OAAA,SAAA;AAAA,IACT;AACE,MAAO,OAAA,QAAA;AAAA;AAEb;AAEO,MAAM,iBAAoB,GAAA,CAAC,EAAE,cAAA,OAClC,cAAmB,KAAA;AAEd,MAAM,eAAkB,GAAA,CAAC,EAAE,cAAA,EAAgB,MAA6B,KAAA;AAC7E,EAAA,IACE,cAAmB,KAAA,KAAA,IACnB,cAAmB,KAAA,MAAA,IACnB,mBAAmB,QACnB,EAAA;AACA,IAAO,OAAA,IAAA;AAAA;AAET,EAAI,IAAA,OAAO,SAAS,QAAU,EAAA;AAC5B,IAAA,OAAO,IAAS,KAAA,QAAA;AAAA;AAElB,EAAI,IAAA,OAAO,IAAM,EAAA,IAAA,KAAS,QAAU,EAAA;AAClC,IAAA,OAAO,MAAM,IAAS,KAAA,QAAA;AAAA;AAGxB,EAAO,OAAA,KAAA;AACT;AAEa,MAAA,kBAAA,GAAqB,CAChC,MAAA,KAAA,CAEC,gBAAiB,CAAA,MAAA,CAAO,IAAI,CAAA,GAAI,MAAO,CAAA,IAAA,CAAK,IAAO,GAAA,MAAA,CAAO,IAC3D,MAAA;AAEK,MAAM,sBAAsB,CAAC,MAAA,KAClC,kBAAkB,MAAM,CAAA,IAAK,mBAAmB,MAAM;AAE3C,MAAA,eAAA,GAAkB,CAC7B,MAAA,KAAA,CAEC,gBAAiB,CAAA,MAAA,EAAQ,IAAI,CAAA,GAAI,MAAO,CAAA,IAAA,CAAK,IAAO,GAAA,MAAA,EAAQ,IAAU,MAAA;AAElE,MAAM,QAAW,GAAA,CAAC,MACvB,KAAA,OAAO,OAAO,GAAQ,KAAA;AAEX,MAAA,WAAA,GAAc,CAAC,MAAA,KAC1B,KAAM,CAAA,OAAA,CAAQ,OAAO,OAAO,CAAA,IAAK,MAAO,CAAA,OAAA,CAAQ,MAAS,GAAA;AAE9C,MAAA,UAAA,GAAa,CAAC,MAAA,KAAoC,MAAO,CAAA;AAEzD,MAAA,YAAA,GAAe,CAAC,EAAE,cAAe,EAAA,KAC5C,mBAAmB,KACf,CAAA,GAAA,KAAA,GACA,cAAmB,KAAA,MAAA,IAAU,cAAmB,KAAA;AAEzC,MAAA,kBAAA,GAAqB,CAChC,IAAA,EACA,cACsB,MAAA;AAAA,EACtB,IAAA;AAAA,EACA;AACF,CAAA;AAKO,MAAM,mBAAmB,CAC9B,IAAA,KAEA,OAAO,IAAS,KAAA,WAAA,IAAe,OAAO,IAAS,KAAA;AAEjD,MAAM,mBAAmB,EAAC;AAEnB,MAAM,oBAAuB,GAAA,CAClC,QAEA,KAAA,OAAQ,UAAkC,IAAS,KAAA;AAExC,MAAA,iBAAA,GAAoB,CAC/B,IAEA,KAAA,gBAAA,CAAiB,IAAI,CAAK,IAAA,oBAAA,CAAqB,KAAK,QAAQ;AAEvD,MAAM,mBAAmB,CAC9B,QAAA,KAEA,OAAQ,QAA6B,EAAA,IAAA,KAAS,eAC9C,QAAa,IAAA;AAEF,MAAA,mBAAA,GAAsB,CACjC,QAAA,KAEA,OAAQ,QAAA,EAAgC,SAAS,WACjD,IAAA,KAAA,CAAM,OAAS,CAAA,QAAA,CAA+B,MAAM;AAE/C,MAAM,kBAAqB,GAAA,CAChC,IAEA,KAAA,gBAAA,CAAiB,IAAI,CAAA,IAAK,KAAM,CAAA,OAAA,CAAQ,IAAK,CAAA,KAAK,CAAK,IAAA,IAAA,CAAK,MAAM,MAAS,GAAA;AAEtE,MAAM,4BAA4B,CACvC,QAAA,KAEA,aAAa,KACb,CAAA,IAAA,OAAQ,UAAsC,GAAQ,KAAA;AAEjD,SAAS,eACd,OACW,EAAA;AACX,EAAA,MAAM,QAAQ,YAAa,CAAA,KAAA;AAC3B,EAAA,IAAI,OAAS,EAAA;AACX,IAAA,OAAO,OAAQ,CAAA,MAAA,CAAO,CAAC,GAAA,EAAK,QAAQ,CAAM,KAAA;AACxC,MAAI,IAAA,OAAO,WAAW,QAAU,EAAA;AAC9B,QAAI,GAAA,CAAA,MAAM,IAAI,KAAQ,GAAA,CAAA;AAAA,OACjB,MAAA;AACL,QAAI,GAAA,CAAA,MAAA,CAAO,IAAI,CAAA,GAAI,KAAQ,GAAA,CAAA;AAAA;AAE7B,MAAO,OAAA,GAAA;AAAA,KACT,EAAG,EAAe,CAAA;AAAA,GACb,MAAA;AACL,IAAO,OAAA,gBAAA;AAAA;AAEX;AAEO,SAAS,eAAe,OAA6B,EAAA;AAC1D,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAM,MAAA,cAAA,GAAiB,aAAa,KAAQ,GAAA,CAAA;AAC5C,EAAA,KAAA,IAAS,IAAI,CAAG,EAAA,CAAA,GAAI,OAAQ,CAAA,MAAA,EAAQ,KAAK,CAAG,EAAA;AAC1C,IAAA,OAAA,CAAQ,CAAC,CAAA,GAAI,OAAQ,CAAA,CAAC,CAAI,GAAA,cAAA;AAC1B,IAAA,OAAA,CAAQ,CAAI,GAAA,CAAC,CAAI,GAAA,OAAA,CAAQ,IAAI,CAAC,CAAA;AAC9B,IAAA,OAAA,CAAQ,CAAI,GAAA,CAAC,CAAI,GAAA,OAAA,CAAQ,IAAI,CAAC,CAAA;AAAA;AAEhC,EAAO,OAAA,OAAA;AACT;AAEA,MAAM,GAAM,GAAA,CAAA;AAEL,MAAM,YAAe,GAAA;AAAA,EAC1B,GAAK,EAAA,CAAA;AAAA,EACL,UAAY,EAAA,CAAA;AAAA,EACZ,OAAS,EAAA,CAAA;AAAA,EACT,WAAa,EAAA,CAAA;AAAA,EACb,KAAO,EAAA,CAAA;AAAA,EACP,KAAO,EAAA,CAAA;AAAA,EACP,GAAA;AAAA,EACA,QAAU,EAAA,CAAA;AAAA,EACV,SAAW,EAAA,CAAA;AAAA,EACX,MAAQ,EAAA,CAAA;AAAA,EACR,KAAO,EAAA,EAAA;AAAA;AAAA,EAEP,UAAY,EAAA,YAAA;AAAA,EACZ,WAAa,EAAA,aAAA;AAAA,EACb,YAAc,EAAA,cAAA;AAAA,EACd,eAAiB,EAAA;AACnB;AAGA,MAAM,YAAA,GAAe,CACnB,OAAA,EACA,MACG,KAAA;AACH,EAAM,MAAA,EAAE,aAAgB,GAAA,MAAA;AACxB,EAAI,IAAA,OAAO,gBAAgB,QAAU,EAAA;AACnC,IAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,OAAA,CAAQ,QAAQ,CAAK,EAAA,EAAA;AACvC,MAAA,MAAM,EAAE,WAAa,EAAA,MAAA,GAAS,CAAG,CAAA,EAAA,GAAI,QAAQ,CAAC,CAAA;AAC9C,MAAA,IAAI,SAAS,WAAa,EAAA;AACxB,QAAQ,OAAA,CAAA,MAAA,CAAO,CAAG,EAAA,CAAA,EAAG,MAAM,CAAA;AAC3B,QAAO,OAAA,OAAA;AAAA;AACT;AACF;AAEF,EAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AACnB,EAAO,OAAA,OAAA;AACT,CAAA;AAEa,MAAA,kBAAA,GAAqB,CAChC,OAC8B,KAAA;AAC9B,EAAI,IAAA,OAAA,CAAQ,CAAC,CAAA,EAAG,OAAS,EAAA;AACvB,IAAA,MAAM,CAAC,WAAA,EAAa,GAAG,iBAAiB,CAAI,GAAA,OAAA;AAI5C,IAAY,WAAA,CAAA,OAAA,CAAQ,OAAQ,CAAA,CAACA,YAAgB,KAAA;AAC3C,MAAA,YAAA,CAAa,mBAAmBA,YAAW,CAAA;AAAA,KAC5C,CAAA;AACD,IAAO,OAAA,iBAAA;AAAA,GACF,MAAA;AACL,IAAO,OAAA,OAAA;AAAA;AAEX;AAEO,SAAS,kBAAmB,CAAA;AAAA,EACjC,cAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAY,GAAA;AACd,CAGE,EAAA;AACA,EAAI,IAAA,OAAA,IAAW,OAAQ,CAAA,MAAA,GAAS,CAAG,EAAA;AACjC,IAAM,MAAA,gBAAA,GAAmB,mBAAmB,OAAO,CAAA;AAEnD,IAAA,MAAM,CAAC,cAAA,EAAgB,IAAI,CAAA,GAAI,gBAAiB,CAAA,MAAA;AAAA,MAG9C,CAAC,MAAQ,EAAA,MAAA,EAAQ,CAAM,KAAA;AACrB,QAAM,MAAA,CAAC,CAAG,EAAA,CAAC,CAAI,GAAA,MAAA;AACf,QAAA,IAAI,OAAQ,CAAA,QAAA,CAAS,MAAO,CAAA,IAAI,CAAG,EAAA;AACjC,UAAA,CAAA,CAAE,IAAK,CAAA;AAAA,YACL,GAAG,MAAA;AAAA,YACH,WAAa,EAAA;AAAA,WACd,CAAA;AAAA,SACI,MAAA;AACL,UAAA,CAAA,CAAE,KAAK,MAAM,CAAA;AAAA;AAGf,QAAO,OAAA,MAAA;AAAA,OACT;AAAA,MACA,CAAC,EAAI,EAAA,EAAE;AAAA,KACT;AACA,IAAI,IAAA,cAAA,CAAe,MAAW,KAAA,OAAA,CAAQ,MAAQ,EAAA;AAC5C,MAAM,MAAA,KAAA;AAAA,QACJ,uEAAuE,IAAK,CAAA,SAAA;AAAA,UAC1E;AAAA,SACD,CAAA,CAAA;AAAA,OACH;AAAA;AAGF,IAAM,MAAA,SAAA,GAAY,KAAK,MAAW,KAAA,CAAA;AAElC,IAAA,MAAM,aAAa,OAAQ,CAAA,MAAA;AAC3B,IAAA,MAAM,SAAuC,GAAA,OAAA,CAAQ,GAAI,CAAA,CAAC,MAAM,GAAQ,KAAA;AAEtE,MAAA,MAAM,SAAS,cAAe,CAAA,IAAA;AAAA,QAC5B,CAAC,GAAQ,KAAA,GAAA,CAAI,IAAS,KAAA;AAAA,OACxB;AACA,MAAO,OAAA;AAAA,QACL,GAAG,MAAA;AAAA,QACH,YAAY,UAAa,GAAA;AAAA,OAC3B;AAAA,KACD,CAAA;AAED,IAAM,MAAA,KAAA,GAAQ,SACV,GAAA,cAAA,GACA,IAAK,CAAA,GAAA;AAAA,MACH,cAAA;AAAA,MACA,SAAU,CAAA,GAAA,CAAI,CAAC,CAAA,KAAM,CAAE,CAAA,KAAK,CAAE,CAAA,MAAA,CAAO,CAAC,CAAA,EAAG,CAAM,KAAA,CAAA,GAAI,CAAC,CAAI,GAAA;AAAA,KAC1D;AAEJ,IAAA,MAAM,QAAW,GAAA;AAAA,MACf,YAAc,EAAA,CAAA;AAAA,MACd,OAAS,EAAA,SAAA;AAAA,MACT,OAAA,EAAS,CAAC,WAAW,CAAA;AAAA,MACrB,OAAS,EAAA,IAAA;AAAA,MACT,cAAgB,EAAA,SAAA;AAAA,MAChB,IAAM,EAAA,WAAA;AAAA,MACN;AAAA,KACF;AAEA,IAAA,MAAM,wBAAmD,EAAC;AAC1D,IAAA,IAAI,QAAW,GAAA,CAAA;AACf,IAAA,KAAA,MAAW,UAAU,IAAM,EAAA;AACzB,MAAA,qBAAA,CAAsB,IAAK,CAAA;AAAA,QACzB,GAAG,MAAA;AAAA,QACH,YAAA,EAAc,MAAO,CAAA,MAAA,GAAS,CAAK,CAAA,GAAA;AAAA,OACpC,CAAA;AACD,MAAI,IAAA,CAAC,OAAO,MAAQ,EAAA;AAClB,QAAY,QAAA,IAAA,CAAA;AAAA;AACd;AAGF,IAAO,OAAA,CAAC,UAAU,qBAAqB,CAAA;AAAA;AAEzC,EAAA,OAAO,CAAC,IAAA,EAAM,kBAAmB,CAAA,OAAO,CAAC,CAAA;AAC3C;AAEO,MAAM,aAAgB,GAAA,CAC3B,MACoC,KAAA,MAAA,CAAO,OAAY,KAAA;AAO5C,MAAA,wBAAA,GAA2B,CAAC,cAAgC,KAAA;AACvE,EAAA,IAAI,cAAgB,EAAA;AAClB,IAAM,MAAA,CAAC,MAAM,CAAA,GAAI,cAAe,CAAA,OAAA;AAChC,IAAA,IAAI,MAAW,KAAA,KAAA,CAAA,IAAa,aAAc,CAAA,MAAM,CAAG,EAAA;AACjD,MAAA,OAAO,MAAO,CAAA,cAAA;AAAA;AAChB;AAEJ;AAEO,MAAM,eAAkB,GAAA,CAAC,KAC9B,KAAA,OAAO,KAAU,KAAA,QAAA,KAAa,KAAM,CAAA,QAAA,CAAS,GAAG,CAAA,IAAK,KAAM,CAAA,QAAA,CAAS,GAAG,CAAA;AAElE,MAAM,WAAc,GAAA,CACzB,MACA,EAAA,OAAA,KAEC,MAAO,CAAA,IAAA,EAAkC,IAAS,KAAA,MAAA,IACnD,eAAgB,CAAA,OAAA,CAAQ,MAAO,CAAA,IAAI,CAAC;AAE/B,MAAM,YAAe,GAAA,CAAC,MAC1B,KAAA,MAAA,CAAO,MAAkC,IAAS,KAAA;AAE9C,MAAM,iBAAoB,GAAA,CAC/B,OACA,EAAA,qBAAA,GAAwB,CACM,KAAA;AAC9B,EAAA,MAAM,oBAA+C,EAAC;AACtD,EAAA,MAAM,qBAAgD,EAAC;AACvD,EAAA,MAAM,cAAyC,EAAC;AAChD,EAAA,IAAI,eAAkB,GAAA,qBAAA;AACtB,EAAA,KAAA,MAAW,UAAU,OAAS,EAAA;AAE5B,IAAA,QAAO,OAAO,GAAI;AAAA,MAChB,KAAK,MAAA;AAAQ,QAAA;AACX,UAAA,iBAAA,CAAkB,IAAK,CAAA;AAAA,YACrB,GAAG,MAAA;AAAA,YACH,WAAa,EAAA,CAAA;AAAA,YACb,YAAc,EAAA;AAAA,WACf,CAAA;AACD,UAAA,eAAA,IAAmB,MAAO,CAAA,KAAA;AAAA;AAE5B,QAAA;AAAA;AAAA,MAEA,KAAK,OAAA;AAAS,QAAA,kBAAA,CAAmB,QAAQ,MAAM,CAAA;AAAG,QAAA;AAAA,MAClD;AAAS,QAAA,WAAA,CAAY,KAAK,MAAM,CAAA;AAAA;AAClC;AAGF,EAAA,IAAI,kBAAkB,MAAQ,EAAA;AAC5B,IAAA,iBAAA,CAAkB,IAAK,CAAA;AAAA,MACrB,GAAI,kBAAkB,GAAI,EAAA;AAAA,MAC1B,WAAa,EAAA;AAAA,KACd,CAAA;AAAA;AAGH,EAAA,IAAI,aAAa,iBAAkB,CAAA,MAAA,GAC/B,iBAAkB,CAAA,MAAA,CAAO,WAAW,CACpC,GAAA,WAAA;AAEJ,EAAA,IAAI,mBAAmB,MAAQ,EAAA;AAC7B,IAAA,MAAM,6BAAwD,EAAC;AAC/D,IAAA,IAAI,gBAAmB,GAAA,qBAAA;AACvB,IAAA,KAAA,MAAW,UAAU,kBAAoB,EAAA;AACvC,MAAA,0BAAA,CAA2B,OAAQ,CAAA;AAAA,QACjC,GAAG,MAAA;AAAA,QACH,YAAc,EAAA;AAAA,OACf,CAAA;AACD,MAAA,gBAAA,IAAoB,MAAO,CAAA,KAAA;AAAA;AAE7B,IAAA,0BAAA,CAA2B,kBAAmB,CAAA,MAAA,GAAS,CAAC,CAAA,CAAE,WACxD,GAAA,gBAAA;AACF,IAAa,UAAA,GAAA,UAAA,CAAW,OAAO,0BAA0B,CAAA;AAAA;AAI3D,EAAI,IAAA,iBAAA,CAAkB,MAAU,IAAA,kBAAA,CAAmB,MAAQ,EAAA;AACzD,IAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,UAAA,CAAW,QAAQ,CAAK,EAAA,EAAA;AAC1C,MAAA,IAAI,UAAW,CAAA,CAAC,CAAE,CAAA,YAAA,KAAiB,IAAI,CAAG,EAAA;AACxC,QAAA,UAAA,CAAW,CAAC,CAAI,GAAA;AAAA,UACd,GAAG,WAAW,CAAC,CAAA;AAAA,UACf,cAAc,CAAI,GAAA;AAAA,SACpB;AAAA;AACF;AACF;AAGF,EAAO,OAAA,UAAA;AACT;AAEa,MAAA,oBAAA,GAAuB,CAClC,OAAA,EACA,gBACG,KAAA;AACH,EAAA,IAAI,eAAkB,GAAA,CAAA;AACtB,EAAA,IAAI,gBAAmB,GAAA,CAAA;AACvB,EAAA,IAAI,aAAgB,GAAA,CAAA;AACpB,EAAA,KAAA,MAAW,UAAU,OAAS,EAAA;AAC5B,IAAA,MAAM,EAAE,MAAA,EAAQ,GAAK,EAAA,KAAA,EAAU,GAAA,MAAA;AAC/B,IAAM,MAAA,YAAA,GAAe,SAAS,CAAI,GAAA,KAAA;AAClC,IAAA,IAAI,QAAQ,MAAQ,EAAA;AAClB,MAAmB,eAAA,IAAA,YAAA;AAAA,KACrB,MAAA,IAAW,QAAQ,OAAS,EAAA;AAC1B,MAAoB,gBAAA,IAAA,YAAA;AAAA,KACf,MAAA;AACL,MAAiB,aAAA,IAAA,YAAA;AAAA;AACnB;AAEF,EAAO,OAAA;AAAA,IACL,iBAAiB,eAAkB,GAAA,gBAAA;AAAA,IACnC,kBAAkB,gBAAmB,GAAA,gBAAA;AAAA,IACrC;AAAA,GACF;AACF;AAEa,MAAA,gBAAA,GAAmB,CAC9B,OACkB,KAAA;AAClB,EAAI,IAAA,OAAA,CAAQ,IAAK,CAAA,WAAW,CAAG,EAAA;AAC7B,IAAA,MAAM,kBAAkB,OAAQ,CAAA,MAAA;AAAA,MAC9B,CAAC,GAAK,EAAA,EAAE,OAAAC,EAAAA,QAAAA,EAAc,KAAA,IAAA,CAAK,GAAI,CAAA,GAAA,EAAKA,QAAS,EAAA,MAAA,IAAU,CAAC,CAAA;AAAA,MACxD;AAAA,KACF;AAEA,IAAA,IAAI,OAAoC,GAAA,KAAA,CAAA;AACxC,IAAA,MAAM,gBAA+B,EAAC;AACtC,IAAI,IAAA,gBAAA;AACJ,IAAA,KAAA,IAAS,KAAQ,GAAA,CAAA,EAAG,KAAQ,GAAA,eAAA,EAAiB,KAAS,EAAA,EAAA;AACpD,MAAA,gBAAA,GAAmB,EAAC;AACpB,MAAA,OAAA,CAAQ,QAAQ,CAAC,EAAE,SAAS,aAAgB,GAAA,WAAA,EAAa,OAAY,KAAA;AACnE,QAAM,MAAA,KAAA,GAAQ,aAAc,CAAA,KAAK,CAAK,IAAA,EAAA;AACtC,QAAI,IAAA,OAAA,IAAW,OAAQ,CAAA,KAAA,KAAU,KAAO,EAAA;AACtC,UAAA,OAAA,CAAQ,KAAS,IAAA,KAAA;AAAA,SACZ,MAAA;AACL,UAAU,OAAA,GAAA,EAAE,OAAO,KAAM,EAAA;AACzB,UAAA,gBAAA,CAAiB,KAAK,OAAO,CAAA;AAAA;AAC/B,OACD,CAAA;AACD,MAAA,aAAA,CAAc,KAAK,gBAAgB,CAAA;AAAA;AAGrC,IAAO,OAAA,aAAA;AAAA;AAET,EAAO,OAAA,WAAA;AACT;AAEO,MAAM,iBAAiB,CAAC;AAAA,EAC7B,GAAA;AAAA,EACA,YAAe,GAAA,CAAA;AAAA,EACf,WAAc,GAAA,CAAA;AAAA,EACd;AACF,CAA+B,KAAA;AAC7B,EAAI,IAAA,WAAA,IAAe,QAAQ,MAAQ,EAAA;AACjC,IAAO,OAAA;AAAA,MACL,IAAM,EAAA,YAAA;AAAA,MACN,KAAA;AAAA,MACA,aAAA,EAAe,CAAG,EAAA,WAAA,GAAc,CAAC,CAAA,EAAA;AAAA,KACnC;AAAA,GACF,MAAA,IAAW,QAAQ,MAAQ,EAAA;AACzB,IAAO,OAAA;AAAA,MACL,IAAM,EAAA,YAAA;AAAA,MACN;AAAA,KACF;AAAA,GACF,MAAA,IAAW,WAAe,IAAA,GAAA,KAAQ,OAAS,EAAA;AACzC,IAAO,OAAA;AAAA,MACL,KAAO,EAAA,YAAA;AAAA,MACP,KAAA;AAAA,MACA,aAAA,EAAe,CAAG,EAAA,WAAA,GAAc,CAAC,CAAA,EAAA;AAAA,KACnC;AAAA,GACF,MAAA,IAAW,QAAQ,OAAS,EAAA;AAC1B,IAAO,OAAA;AAAA,MACL,KAAO,EAAA,YAAA;AAAA,MACP;AAAA,KACF;AAAA,GACK,MAAA;AACL,IAAA,OAAO,EAAE,KAAM,EAAA;AAAA;AAEnB;AAEA,MAAM,yBAAA,GAA4B,CAAC,IAAsB,KAAA;AACvD,EAAM,MAAA,SAAA,GAAY,iBAAiB,IAAI,CAAA;AACvC,EAAA,OAAO,QAAS,CAAA,SAAA,CAAU,gBAAiB,CAAA,aAAa,CAAC,CAAA;AAC3D,CAAA;AAEa,MAAA,mBAAA,GAAsB,CACjC,SAAA,EACA,QACqB,KAAA;AACrB,EAAM,MAAA,UAAA,GAAa,mBAAmB,QAAQ,CAAA,EAAA,CAAA;AAC9C,EAAA,OAAO,KAAM,CAAA,IAAA;AAAA,IACX,SAAW,EAAA,gBAAA;AAAA,MACT,CAAgB,aAAA,EAAA,UAAU,CAAuB,oBAAA,EAAA,UAAU,4BAA4B,UAAU,CAAA;AAAA,SAC9F;AAAC,GACR;AACF;AAea,MAAA,eAAA,GAAkB,CAAC,UAAmC,KAAA;AACjE,EAAA,MAAM,WAAW,UAAY,EAAA,YAAA;AAC7B,EAAA,IAAI,YAAY,IAAM,EAAA;AACpB,IAAM,MAAA,KAAA,GAAQ,SAAS,QAAQ,CAAA;AAC/B,IAAI,IAAA,CAAC,KAAM,CAAA,KAAK,CAAG,EAAA;AACjB,MAAO,OAAA,KAAA;AAAA;AACT;AAEF,EAAO,OAAA,CAAA,CAAA;AACT;AAEa,MAAA,eAAA,GAAkB,CAAC,WAAoC,KAAA;AAClE,EAAA,MAAM,WAAW,WAAa,EAAA,YAAA;AAC9B,EAAA,IAAI,YAAY,IAAM,EAAA;AACpB,IAAM,MAAA,KAAA,GAAQ,SAAS,QAAQ,CAAA;AAC/B,IAAI,IAAA,CAAC,KAAM,CAAA,KAAK,CAAG,EAAA;AACjB,MAAO,OAAA,KAAA;AAAA;AACT;AAEF,EAAO,OAAA,CAAA,CAAA;AACT;AAEA,MAAM,aAAA,GAAgB,CACpB,IAAA,EACA,SACa,KAAA;AACb,EAAA,IAAI,IAAK,CAAA,SAAA,CAAU,QAAS,CAAA,WAAW,CAAG,EAAA;AACxC,IAAO,OAAA;AAAA,MACL,IAAA;AAAA,MACA,WAAA,EAAa,0BAA0B,IAAI;AAAA,KAC7C;AAAA,GACK,MAAA;AAGL,IAAM,MAAA,MAAA,GAAS,KAAK,aAAe,EAAA,aAAA;AAAA,MACjC,IAAI,SAAS,CAAA,UAAA;AAAA,KACf;AACA,IAAA,IAAI,MAAQ,EAAA;AACV,MAAA,IAAI,WAAyC,GAAA,KAAA,CAAA;AAE7C,MAAA,IAAI,cAAc,YAAc,EAAA;AAI9B,QAAA,MAAM,SAAY,GAAAC,sBAAA;AAAA,UAChB,IAAA;AAAA,UACA,iBAAA;AAAA,UACA;AAAA,SACF;AACA,QAAM,MAAA,UAAA,GAAa,gBAAgB,IAAI,CAAA;AACvC,QAAM,MAAA,QAAA,GAAW,gBAAgB,MAAM,CAAA;AACvC,QAAA,WAAA,GAAc,EAAC;AAEf,QAAA,KAAA,IAAS,QAAW,GAAA,UAAA,GAAa,CAAG,EAAA,QAAA,IAAY,UAAU,QAAY,EAAA,EAAA;AACpE,UAAA,WAAA,GAAc,WAAa,EAAA,MAAA;AAAA,YACzB,mBAAA,CAAoB,WAAW,QAAQ;AAAA,WACzC;AAAA;AACF;AAGF,MAAQ,OAAA,CAAA,GAAA,CAAI,EAAE,WAAA,EAAa,CAAA;AAE3B,MAAO,OAAA;AAAA,QACL,IAAM,EAAA,MAAA;AAAA,QACN,WAAA;AAAA,QACA,WAAA,EAAa,0BAA0B,MAAM;AAAA,OAC/C;AAAA,KACK,MAAA;AACL,MAAM,MAAA,KAAA;AAAA,QACJ;AAAA,OACF;AAAA;AACF;AAEJ,CAAA;AAEa,MAAA,sBAAA,GAAyB,CACpC,IACyB,KAAA;AACzB,EAAA,IAAI,IAAK,CAAA,SAAA,CAAU,QAAS,CAAA,YAAY,CAAG,EAAA;AACzC,IAAO,OAAA,aAAA,CAAc,MAAM,YAAY,CAAA;AAAA,GAC9B,MAAA,IAAA,IAAA,CAAK,SAAU,CAAA,QAAA,CAAS,aAAa,CAAG,EAAA;AACjD,IAAO,OAAA,aAAA,CAAc,MAAM,aAAa,CAAA;AAAA;AAE5C;AAEO,MAAM,eAAkB,GAAA,CAC7B,YACA,EAAA,MAAA,EACA,OACG,KAAA;AACH,EAAA,OAAO,YACJ,CAAA,MAAA,CAAO,CAAC,GAAA,KAAQ,IAAI,MAAW,KAAA,MAAA,CAAO,IAAI,CAAA,CAC1C,OAAO,EAAE,MAAA,EAAQ,MAAO,CAAA,IAAA,EAAM,SAAS,CAAA;AAC5C;AASa,MAAA,qBAAA,GAAwB,CAAC,KAA4B,KAAA;AAChE,EAAI,IAAA,KAAA,CAAM,QAAQ,MAAQ,EAAA;AACxB,IAAA,MAAM,CAAC,WAAA,EAAa,iBAAiB,CAAA,GAAI,mBAAmB,KAAK,CAAA;AACjE,IAAA,IAAI,WAAa,EAAA;AACf,MAAA,OAAO,CAAC,WAAsC,CAAE,CAAA,MAAA,CAAO,iBAAiB,CAAA;AAAA;AAC1E,GACS,MAAA,IAAA,KAAA,CAAM,OAAQ,CAAA,CAAC,GAAG,OAAS,EAAA;AACpC,IAAO,OAAA,kBAAA,CAAmB,MAAM,OAAO,CAAA;AAAA;AAEzC,EAAA,OAAO,KAAM,CAAA,OAAA;AACf;AAEO,MAAM,qBAAqB,CAChC,OAAA,EACA,SAEA,OAAQ,CAAA,GAAA,CAAI,CAAC,MAAW,KAAA;AACtB,EAAM,MAAA,MAAA,GAAS,WAAY,CAAA,MAAA,EAAQ,IAAI,CAAA;AACvC,EAAA,IAAI,WAAW,KAAW,CAAA,EAAA;AACxB,IAAO,OAAA;AAAA,MACL,GAAG,MAAA;AAAA,MACH;AAAA,KACF;AAAA,GACF,MAAA,IAAW,OAAO,MAAQ,EAAA;AACxB,IAAO,OAAA;AAAA,MACL,GAAG,MAAA;AAAA,MACH,MAAQ,EAAA,KAAA;AAAA,KACV;AAAA,GACK,MAAA;AACL,IAAO,OAAA,MAAA;AAAA;AAEX,CAAC;AAEI,MAAM,UAAa,GAAA,CAAC,OACzB,KAAA,OAAA,CAAQ,IAAI,CAAC,GAAA,KAAS,GAAI,CAAA,MAAA,GAAS,EAAE,GAAG,GAAA,EAAK,MAAQ,EAAA,KAAA,CAAA,KAAc,GAAI;AAE5D,MAAA,YAAA,GAAe,CAAC,OAC3B,KAAA,OAAA,CAAQ,KAAK,CAAC,GAAA,KAAQ,IAAI,MAAM;AAElC,MAAM,WAAc,GAAA,CAAC,MAA0B,EAAA,EAAE,UAAwB,KAAA;AACvE,EAAM,MAAA,OAAA,GAAU,SAAS,IAAK,CAAA,CAAC,YAAY,OAAQ,CAAA,MAAA,KAAW,OAAO,IAAI,CAAA;AACzE,EAAA,IAAI,OAAS,EAAA;AACX,IAAA,OAAO,QAAS,CAAA,MAAA,GAAS,CACpB,GAAA,CAAA,QAAA,CAAS,OAAQ,CAAA,OAAO,CAAI,GAAA,CAAA,KAAM,OAAQ,CAAA,QAAA,KAAa,GAAM,GAAA,CAAA,GAAI,MAClE,OAAQ,CAAA,QAAA;AAAA;AAEhB,CAAA;AAGa,MAAA,aAAA,GAAgB,CAAC,IAAiB,KAAA;AAC7C,EAAM,MAAA,GAAA,GAAM,IAAK,CAAA,OAAA,CAAQ,GAAG,CAAA;AAC5B,EAAA,IAAI,QAAQ,CAAI,CAAA,EAAA;AACd,IAAO,OAAA,IAAA;AAAA,GACF,MAAA;AACL,IAAO,OAAA,IAAA,CAAK,KAAM,CAAA,CAAA,EAAG,GAAG,CAAA;AAAA;AAE5B;AAEa,MAAA,cAAA,GAAiB,CAAC,MAA6B,KAAA;AAC1D,EAAA,IAAI,OAAO,KAAO,EAAA;AAChB,IAAA,OAAO,MAAO,CAAA,KAAA;AAAA,GACL,MAAA,IAAA,kBAAA,CAAmB,MAAO,CAAA,IAAI,CAAG,EAAA;AAC1C,IAAA,MAAM,EAAE,IAAA,EAAS,GAAA,0BAAA,CAA2B,MAAM,CAAA;AAElD,IAAA,OAAO,QAAQ,MAAO,CAAA,IAAA;AAAA,GACjB,MAAA;AACL,IAAA,OAAO,MAAO,CAAA,IAAA;AAAA;AAElB;AAEa,MAAA,UAAA,GAAa,CACxB,OAAA,EACA,UACwC,KAAA;AACxC,EAAA,MAAM,SAAS,OAAQ,CAAA,IAAA,CAAK,CAAC,GAAQ,KAAA,GAAA,CAAI,SAAS,UAAU,CAAA;AAC5D,EAAA,IAAI,MAAQ,EAAA;AACV,IAAO,OAAA,MAAA;AAAA,GACF,MAAA;AACL,IAAA,MAAM,cAAc,OAAQ,CAAA,IAAA;AAAA,MAC1B,CAAC,QAAQ,GAAI,CAAA;AAAA,KACf;AACA,IAAA,IAAI,WAAa,EAAA;AACf,MAAO,OAAA,UAAA,CAAW,WAAY,CAAA,OAAA,EAAS,UAAU,CAAA;AAAA;AACnD;AAEJ;AAWgB,SAAA,YAAA,CACd,OACA,EAAA,MAAA,EACA,OACA,EAAA;AACA,EAAM,MAAA,YAAA,GACJ,OAAO,MAAA,KAAW,QACd,GAAA,OAAA,CAAQ,IAAK,CAAA,CAAC,GAAQ,KAAA,GAAA,CAAI,IAAS,KAAA,MAAM,CACzC,GAAA,MAAA;AACN,EAAA,IAAI,YAAc,EAAA;AAChB,IAAA,MAAM,oBAAoB,OACtB,GAAA,EAAE,GAAG,YAAc,EAAA,GAAG,SACtB,GAAA,YAAA;AACJ,IAAA,OAAO,OAAQ,CAAA,GAAA;AAAA,MAAI,CAAC,GAClB,KAAA,GAAA,CAAI,IAAS,KAAA,iBAAA,CAAkB,OAAO,iBAAoB,GAAA;AAAA,KAC5D;AAAA,GACK,MAAA;AACL,IAAA,MAAM,MAAM,6CAA6C,CAAA;AAAA;AAE7D;AAEa,MAAA,mBAAA,GAAsB,CAAC,MAAA,KAA6B,MAAO,CAAA;AAE3D,MAAA,yBAAA,GAA4B,CACvC,GAAA,EACA,SACkB,KAAA;AAClB,EAAO,OAAA,MAAA,CAAO,OAAQ,CAAA,SAAS,CAAE,CAAA,MAAA;AAAA,IAC/B,CAAC,GAAA,EAAK,CAAC,OAAA,EAAS,GAAG,CAAM,KAAA;AACvB,MAAI,GAAA,CAAA,OAAO,CAAI,GAAA,GAAA,CAAI,GAAG,CAAA;AACtB,MAAO,OAAA,GAAA;AAAA,KACT;AAAA,IACA;AAAC,GACH;AACF;AAEa,MAAA,aAAA,GAAgB,CAAC,OAAuC,KAAA;AACnE,EAAO,OAAA,aAAA,CAAc,QAAQ,CAAC,CAAC,KAAK,OAAQ,CAAA,CAAC,EAAE,cAAmB,KAAA,KAAA;AACpE;AAEO,MAAM,oBAAuB,GAAA,CAClC,OACA,EAAA,OAAA,EACA,KACwC,KAAA;AACxC,EAAA,MAAM,iBAA4C,EAAC;AACnD,EAAA,IAAI,OAAU,GAAA,CAAA;AACd,EAAA,IAAI,eAAkB,GAAA,KAAA;AAEtB,EAAA,KAAA,IAAS,eAAe,CAAG,EAAA,CAAA,GAAI,GAAG,CAAI,GAAA,OAAA,CAAQ,QAAQ,CAAK,EAAA,EAAA;AACzD,IAAM,MAAA,MAAA,GAAS,QAAQ,CAAC,CAAA;AAGxB,IAAA,IAAI,OAAO,MAAQ,EAAA;AACjB,MAAA;AAAA,KACF,MAAA,IAAW,MAAO,CAAA,GAAA,KAAQ,OAAS,EAAA;AACjC,MAAA,cAAA,CAAe,KAAK,MAAM,CAAA;AAAA,eACjB,eAAiB,EAAA;AAC1B,MAAA;AAAA,KACS,MAAA,IAAA,YAAA,GAAe,MAAO,CAAA,KAAA,GAAQ,OAAS,EAAA;AAChD,MAAI,IAAA,MAAA,CAAO,QAAQ,MAAQ,EAAA;AACzB,QAAA,cAAA,CAAe,KAAK,MAAM,CAAA;AAAA,OAC5B,MAAA,IACE,eAAe,MAAO,CAAA,KAAA,GAAQ,QAAQ,CAAI,GAAA,CAAC,CAAG,EAAA,KAAA,GAC9C,OACA,EAAA;AACA,QAAA,cAAA,CAAe,KAAK,MAAM,CAAA;AAAA,OACrB,MAAA;AACL,QAAA,OAAA,IAAW,MAAO,CAAA,KAAA;AAAA;AACpB,KACF,MAAA,IAAW,eAAe,KAAO,EAAA;AAC/B,MAAkB,eAAA,GAAA,IAAA;AAAA,KACb,MAAA;AACL,MAAA,cAAA,CAAe,KAAK,MAAM,CAAA;AAAA;AAE5B,IAAA,YAAA,IAAgB,MAAO,CAAA,KAAA;AAAA;AAGzB,EAAO,OAAA,CAAC,gBAAgB,OAAO,CAAA;AACjC;AAEO,MAAM,WAAc,GAAA,CAAC,MAC1B,KAAA,MAAA,CAAO,MAAW,KAAA;AAEP,MAAA,oBAAA,GAAuB,CAClC,OAAA,EACA,KACG,KAAA;AACH,EAAI,IAAA,OAAA,CAAQ,KAAM,CAAA,WAAW,CAAG,EAAA;AAC9B,IAAA,OAAO,QAAQ,KAAK,CAAA;AAAA,GACf,MAAA;AACL,IAAA,OAAO,OAAQ,CAAA,MAAA,CAAO,WAAW,CAAA,CAAE,GAAG,KAAK,CAAA;AAAA;AAE/C;AAEa,MAAA,YAAA,GAAe,CAC1B,OAAA,EACA,OACuB,KAAA;AACvB,EAAM,MAAA,EAAE,KAAO,EAAA,MAAA,EAAW,GAAA,OAAA;AAG1B,EAAI,IAAA,MAAA,IAAU,KAAQ,GAAA,OAAA,CAAQ,MAAQ,EAAA;AACpC,IAAO,OAAA,KAAA,CAAA;AAAA,GACT,MAAA,IAAW,UAAU,CAAG,EAAA;AACtB,IAAO,OAAA,KAAA,CAAA;AAAA,GACF,MAAA;AACL,IAAA,MAAM,EAAE,OAAA,EAAY,GAAA,OAAA,CAAQ,QAAQ,CAAC,CAAA;AACrC,IAAA,OAAO,UAAU,OAAO,CAAA;AAAA;AAE5B;AAEa,MAAA,aAAA,GAAgB,CAC3B,OAAA,EACA,OACkB,KAAA;AAClB,EAAM,MAAA,EAAE,KAAO,EAAA,MAAA,EAAW,GAAA,OAAA;AAG1B,EAAI,IAAA,MAAA,IAAU,KAAQ,GAAA,OAAA,CAAQ,MAAQ,EAAA;AACpC,IAAO,OAAA,IAAA;AAAA,GACT,MAAA,IAAW,UAAU,CAAG,EAAA;AACtB,IAAO,OAAA,OAAA;AAAA,GACF,MAAA;AAEL,IAAA,MAAM,EAAE,IAAM,EAAA,cAAA,EAAmB,GAAA,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAElD,IAAA,MAAM,KAAQ,GAAA,cAAA,CAAe,OAAQ,CAAA,IAAI,CAAC,CAAA;AAC1C,IAAO,OAAA,KAAA;AAAA;AAEX;AAEa,MAAA,oBAAA,GAAuB,CAClC,cACwB,KAAA;AACxB,EAAA,QAAQ,cAAgB;AAAA,IACtB,KAAK,KAAA;AAAA,IACL,KAAK,MAAA;AAAA,IACL,KAAK,QAAA;AACH,MAAO,OAAA,QAAA;AAAA,IACT,KAAK,gBAAA;AAAA,IACL,KAAK,gBAAA;AAAA,IACL,KAAK,gBAAA;AAAA,IACL,KAAK,gBAAA;AACH,MAAO,OAAA,eAAA;AAAA,IACT,KAAK,SAAA;AACH,MAAO,OAAA,SAAA;AAAA,IACT,KAAK,gBAAA;AACH,MAAO,OAAA,WAAA;AAAA,IACT;AACE,MAAO,OAAA,QAAA;AAAA;AAEb;AAEa,MAAA,sBAAA,GAAyB,CAGpC,MAAA,EACA,UACM,KAAA;AACN,EAAA,MAAM,EAAE,cAAgB,EAAA,IAAA,GAAO,oBAAqB,CAAA,cAAc,GAChE,GAAA,MAAA;AAEF,EAAI,IAAA,gBAAA,CAAiB,IAAI,CAAG,EAAA;AAC1B,IAAO,OAAA,EAAE,GAAG,MAAQ,EAAA,IAAA,EAAM,EAAE,GAAG,IAAA,EAAM,YAAa,EAAA;AAAA,GAC7C,MAAA;AACL,IAAO,OAAA,EAAE,GAAG,MAAQ,EAAA,IAAA,EAAM,EAAE,IAAM,EAAA,IAAA,EAAM,YAAa,EAAA;AAAA;AAEzD;AAEgB,SAAA,gBAAA,CACd,QACA,IACG,EAAA;AACH,EAAA,OAAO,iBAAiB,MAAO,CAAA,IAAI,IAC/B,EAAE,GAAG,QAAQ,IAAM,EAAA,EAAE,GAAG,MAAO,CAAA,IAAA,EAAM,MAAM,IAAK,EAAA,KAChD,EAAE,GAAG,QAAQ,IAAK,EAAA;AACxB;AAEa,MAAA,uBAAA,GAA0B,CAGrC,MAAA,EACA,QACM,KAAA;AACN,EAAA,MAAM,EAAE,cAAgB,EAAA,IAAA,GAAO,oBAAqB,CAAA,cAAc,GAChE,GAAA,MAAA;AAEF,EAAI,IAAA,gBAAA,CAAiB,IAAI,CAAG,EAAA;AAC1B,IAAO,OAAA;AAAA,MACL,GAAG,MAAA;AAAA,MACH,IAAM,EAAA;AAAA,QACJ,GAAG,IAAA;AAAA;AAAA,QAEH;AAAA;AACF,KACF;AAAA,GACK,MAAA;AACL,IAAO,OAAA,EAAE,GAAG,MAAQ,EAAA,IAAA,EAAM,EAAE,IAAM,EAAA,IAAA,EAAM,UAAW,EAAA;AAAA;AAEvD;AAEA,MAAM,mBAAmB,EAAC;AACb,MAAA,2BAAA,GAA8B,CACzC,MACyB,KAAA;AACzB,EAAI,IAAA,gBAAA,CAAiB,MAAO,CAAA,IAAI,CAAG,EAAA;AACjC,IAAO,OAAA,MAAA,CAAO,KAAK,UAAc,IAAA,gBAAA;AAAA,GAC5B,MAAA;AACL,IAAO,OAAA,gBAAA;AAAA;AAEX;AAMa,MAAA,yCAAA,GAA4C,CACvD,OAAA,EACA,WACG,KAAA;AACH,EAAA,MAAM,sBAAgC,EAAC;AACvC,EAAA,KAAA,MAAW,UAAU,OAAS,EAAA;AAC5B,IAAI,IAAA,MAAA,CAAO,WAAW,QAAY,IAAA,CAAC,aAAa,QAAS,CAAA,MAAA,CAAO,IAAI,CAAG,EAAA;AACrE,MAAoB,mBAAA,CAAA,IAAA,CAAK,OAAO,IAAI,CAAA;AAAA;AACtC;AAEF,EAAI,IAAA,mBAAA,CAAoB,SAAS,CAAG,EAAA;AAClC,IAAM,MAAA,KAAA;AAAA,MACJ,CAAkG,+FAAA,EAAA,mBAAA,CAAoB,IAAK,CAAA,IAAI,CAAC,CAAA;AAAA,KAClI;AAAA;AAEJ;AAMa,MAAA,cAAA,GACX,CAAC,WAAA,KAA2B,CAAC,MAAA,KAC3B,MAAO,CAAA,MAAA,KAAW,QAAY,IAAA,WAAA,EAAa,QAAS,CAAA,MAAA,CAAO,IAAI;AAU5D,MAAM,4BAA+B,GAAA,CAC1C,iBACA,EAAA,gBAAA,EACA,UACG,KAAA;AACH,EAAA,MAAM,YACJ,CAAC,CAAA,GAAI,eACL,CAAC,MAAA,KACC,OAAO,IAAS,KAAA,CAAA;AACpB,EAAA,IAAI,iBAAkB,CAAA,SAAA,CAAU,SAAU,EAAC,MAAM,CAAI,CAAA,EAAA;AACnD,IAAM,MAAA,KAAA;AAAA,MACJ,uDAAuD,UAAU,CAAA,sBAAA;AAAA,KACnE;AAAA;AAEF,EAAA,MAAM,sBAAyB,GAAA,gBAAA,CAAiB,SAAU,CAAA,SAAA,EAAW,CAAA;AACrE,EAAA,IAAI,2BAA2B,CAAI,CAAA,EAAA;AACjC,IAAM,MAAA,KAAA;AAAA,MACJ,sDAAsD,UAAU,CAAA,iBAAA;AAAA,KAClE;AAAA;AAGF,EAAA,MAAM,SAAY,GAAA;AAAA,IAChB,GAAG,iBAAiB,sBAAsB;AAAA,GAC5C;AAEA,EAAO,OAAA,iBAAA,CAAkB,OAAO,SAAS,CAAA;AAC3C;AAEA,MAAM,uBAA0B,GAAA,UAAA;AAEzB,MAAM,qBAAqB,CAAC,UAAA,KACjC,eAAe,KAAa,CAAA,IAAA,uBAAA,CAAwB,KAAK,UAAU;AAExD,MAAA,0BAAA,GAA6B,CACxC,MAC8B,KAAA;AAC9B,EAAI,IAAA,kBAAA,CAAmB,MAAO,CAAA,IAAI,CAAG,EAAA;AACnC,IAAM,MAAA,CAAC,MAAM,cAAgB,EAAA,UAAU,IAAI,MAAO,CAAA,IAAA,CAAK,MAAM,KAAK,CAAA;AAClE,IAAA,IAAI,cAAkB,IAAA,CAAC,mBAAoB,CAAA,cAAc,CAAG,EAAA;AAC1D,MAAM,MAAA,KAAA;AAAA,QACJ,CAA4C,yCAAA,EAAA,cAAc,CAAiC,8BAAA,EAAA,MAAA,CAAO,IAAI,CAAA;AAAA,OACxG;AAAA;AAEF,IAAO,OAAA;AAAA,MACL,MAAM,IAAQ,IAAA,EAAA;AAAA,MACd,YAAY,UAAc,IAAA,EAAA;AAAA,MAC1B,cAAgB,EAAA,mBAAA,CAAoB,cAAc,CAAA,GAC9C,cACA,GAAA,KAAA;AAAA,KACN;AAAA,GACK,MAAA;AACL,IAAA,MAAM,MAAM,CAAwC,sCAAA,CAAA,CAAA;AAAA;AAExD;AAEa,MAAA,uBAAA,GAA0B,CACrC,MAAA,EACA,IACqB,KAAA;AACrB,EAAM,MAAA,GAAG,IAAM,EAAA,UAAU,IAAI,MAAO,CAAA,IAAA,CAAK,MAAM,GAAG,CAAA;AAClD,EAAO,OAAA;AAAA,IACL,GAAG,MAAA;AAAA,IACH,MAAM,CAAG,EAAA,IAAI,CAAI,CAAA,EAAA,IAAI,IAAI,UAAU,CAAA;AAAA,GACrC;AACF;AAEa,MAAA,uBAAA,GAA0B,CACrC,MAAA,EACA,IACqB,KAAA;AACrB,EAAM,MAAA,CAAC,QAAQ,UAAU,IAAI,MAAO,CAAA,IAAA,CAAK,MAAM,GAAG,CAAA;AAClD,EAAO,OAAA;AAAA,IACL,GAAG,MAAA;AAAA,IACH,MAAM,CAAG,EAAA,IAAI,CAAI,CAAA,EAAA,IAAI,IAAI,UAAU,CAAA;AAAA,GACrC;AACF;AAGa,MAAA,6BAAA,GAAgC,CAC3C,MAAA,EACA,UACqB,KAAA;AACrB,EAAA,MAAM,CAAC,IAAM,EAAA,IAAI,IAAI,MAAO,CAAA,IAAA,CAAK,MAAM,GAAG,CAAA;AAC1C,EAAO,OAAA;AAAA,IACL,GAAG,MAAA;AAAA,IACH,MAAM,CAAG,EAAA,IAAI,CAAI,CAAA,EAAA,IAAI,KAAK,UAAU,CAAA;AAAA,GACtC;AACF;AAEO,MAAM,YAAe,GAAA,CAC1B,OACA,EAAA,MAAA,EACA,QACG,KAAA;AACH,EAAM,MAAA,KAAA,GAAQ,QAAQ,SAAU,CAAA,CAAC,QAAQ,GAAI,CAAA,IAAA,KAAS,OAAO,IAAI,CAAA;AACjE,EAAO,OAAAC,mBAAA,CAAS,OAAS,EAAA,KAAA,EAAO,QAAQ,CAAA;AAC1C;AAEgB,SAAA,aAAA,CAEd,SAAuB,MAAW,EAAA;AAClC,EAAO,OAAA,OAAA,CAAQ,IAAI,CAAC,GAAA,KAAS,IAAI,IAAS,KAAA,MAAA,CAAO,IAAO,GAAA,MAAA,GAAS,GAAI,CAAA;AACvE;AAEA,MAAM,mBAAA,GAAsB,CAAC,qBAAA,EAAuB,qBAAqB,CAAA;AAEzE,MAAM,mBAAmB,CAAC,MAAA,KACxB,CAAC,mBAAoB,CAAA,QAAA,CAAS,OAAO,IAAI,CAAA;AAEpC,MAAM,2BAA2B,CACtC,EAAE,OAAS,EAAA,KAAA,IACX,sBACG,KAAA;AACH,EAAI,IAAA,OAAO,2BAA2B,UAAY,EAAA;AAChD,IAAA,OAAO,QAAQ,MAAO,CAAA,gBAAgB,CAAE,CAAA,GAAA,CAAI,CAAC,MAAW,KAAA;AACtD,MAAA,MAAM,MAAS,GAAA,sBAAA,CAAuB,KAAM,CAAA,KAAA,EAAO,OAAO,IAAI,CAAA;AAC9D,MAAA,IAAI,MAAQ,EAAA;AACV,QAAO,OAAA;AAAA,UACL,GAAG,MAAA;AAAA,UACH,GAAG;AAAA,SACL;AAAA,OACK,MAAA;AACL,QAAO,OAAA,MAAA;AAAA;AACT,KACD,CAAA;AAAA,GACI,MAAA;AACL,IAAO,OAAA,OAAA;AAAA;AAEX;AA+BA,MAAM,cAAiB,GAAA,CACrB,OACA,EAAA,eAAA,EACA,oBAEA,OAAQ,CAAA,MAAA;AAAA,EACN,CAAC,YAAY,MAAW,KAAA;AACtB,IAAI,IAAA,MAAA,CAAO,WAAW,IAAM,EAAA;AAC1B,MAAW,UAAA,CAAA,aAAA,IAAiB,OAAO,QAAY,IAAA,eAAA;AAC/C,MAAW,UAAA,CAAA,aAAA,IAAiB,OAAO,QAAY,IAAA,eAAA;AAC/C,MAAA,UAAA,CAAW,cAAc,MAAO,CAAA,KAAA;AAChC,MAAW,UAAA,CAAA,SAAA,IAAa,OAAO,IAAQ,IAAA,CAAA;AAAA;AAEzC,IAAO,OAAA,UAAA;AAAA,GACT;AAAA,EACA,EAAE,eAAe,CAAG,EAAA,aAAA,EAAe,GAAG,UAAY,EAAA,CAAA,EAAG,WAAW,CAAE;AACpE,CAAA;AAOK,SAAS,oBACd,OACA,EAAA;AAAA,EACE,cAAiB,GAAA,CAAA;AAAA,EACjB,YAAe,GAAA,QAAA;AAAA,EACf,YAAe,GAAA,iBAAA;AAAA,EACf,eAAkB,GAAA,iBAAA;AAAA,EAClB,eAAkB,GAAA;AACpB,CAE2B,EAAA;AAC3B,EAAA,IAAI,iBAAiB,KAAO,EAAA;AAC1B,IAAM,MAAA,EAAE,eAAe,aAAe,EAAA,UAAA,EAAY,WAChD,GAAA,cAAA,CAAe,OAAS,EAAA,eAAA,EAAiB,eAAe,CAAA;AAE1D,IAAA,IAAI,gBAAgB,cAAgB,EAAA;AAClC,MAAO,OAAA,mBAAA,CAAoB,SAAS,eAAe,CAAA;AAAA,KACrD,MAAA,IAAW,gBAAgB,cAAgB,EAAA;AACzC,MAAO,OAAA,OAAA;AAAA,KACT,MAAA,IAAW,aAAa,cAAgB,EAAA;AACtC,MAAO,OAAA,gCAAA;AAAA,QACL,OAAA;AAAA,QACA,cAAA;AAAA,QACA,UAAA;AAAA,QACA,eAAA;AAAA,QACA,YAAA;AAAA,QACA;AAAA,OACF;AAAA,KACF,MAAA,IAAW,aAAa,cAAgB,EAAA;AACtC,MAAO,OAAA,kCAAA;AAAA,QACL,OAAA;AAAA,QACA,cAAA;AAAA,QACA,UAAA;AAAA,QACA,eAAA;AAAA,QACA;AAAA,OACF;AAAA;AACF;AAEF,EAAO,OAAA,OAAA;AACT;AAEA,MAAM,mBAAA,GAAsB,CAC1B,OAAA,EACA,eACG,KAAA;AACH,EAAO,OAAA,OAAA,CAAQ,GAAI,CAAA,CAAC,MAAW,KAAA;AAC7B,IAAM,MAAA,EAAE,QAAW,GAAA,eAAA,EAAoB,GAAA,MAAA;AACvC,IAAI,IAAA,MAAA,CAAO,UAAU,QAAU,EAAA;AAC7B,MAAO,OAAA,MAAA;AAAA,KACF,MAAA;AACL,MAAO,OAAA;AAAA,QACL,GAAG,MAAA;AAAA,QACH,KAAO,EAAA;AAAA,OACT;AAAA;AACF,GACD,CAAA;AACH,CAAA;AAEA,MAAM,mCAAmC,CACvC,OAAA,EACA,gBACA,UACA,EAAA,eAAA,EACA,cACA,SACG,KAAA;AACH,EAAA,MAAM,cAAc,UAAa,GAAA,cAAA;AACjC,EAAA,MAAM,aAAa,SAAY,GAAA,CAAA;AAC/B,EAAI,IAAA,oBAAA,GAAuB,WAAe,IAAA,SAAA,IAAa,OAAQ,CAAA,MAAA,CAAA;AAC/D,EAAA,IAAI,0BAA0B,OAAQ,CAAA,MAAA;AACtC,EAAA,IAAI,gBAAmB,GAAA,CAAA;AACvB,EAAA,IAAI,UAAa,GAAA,OAAA,CAAQ,GAA6B,CAAA,CAAC,MAAW,KAAA;AAChE,IAAM,MAAA;AAAA,MACJ,QAAW,GAAA,eAAA;AAAA,MACX,KAAQ,GAAA,YAAA;AAAA,MACR,IAAO,GAAA;AAAA,KACL,GAAA,MAAA;AACJ,IAAI,IAAA,UAAA,IAAc,SAAS,CAAG,EAAA;AAC5B,MAAO,OAAA,MAAA;AAAA;AAET,IAAA,MAAM,gBAAgB,KAAQ,GAAA,oBAAA;AAC9B,IAAA,IAAI,gBAAgB,QAAU,EAAA;AAC5B,MAA2B,uBAAA,IAAA,CAAA;AAC3B,MAAA,gBAAA,IAAoB,QAAW,GAAA,aAAA;AAC/B,MAAA,OAAO,EAAE,GAAG,MAAQ,EAAA,KAAA,EAAO,QAAS,EAAA;AAAA,KAC/B,MAAA;AACL,MAAA,OAAO,EAAE,GAAG,MAAQ,EAAA,KAAA,EAAO,aAAc,EAAA;AAAA;AAC3C,GACD,CAAA;AACD,EAAA,IAAI,qBAAqB,CAAG,EAAA;AAC1B,IAAO,OAAA,UAAA;AAAA,GACF,MAAA;AACL,IAAA,oBAAA,GAAuB,gBAAmB,GAAA,uBAAA;AAC1C,IAAa,UAAA,GAAA,UAAA,CAAW,GAAI,CAAA,CAAC,MAAW,KAAA;AACtC,MAAM,MAAA,aAAA,GAAgB,OAAO,KAAQ,GAAA,oBAAA;AACrC,MAAI,IAAA,MAAA,CAAO,KAAU,KAAA,MAAA,CAAO,QAAU,EAAA;AACpC,QAAA,OAAO,EAAE,GAAG,MAAQ,EAAA,KAAA,EAAO,aAAc,EAAA;AAAA,OACpC,MAAA;AACL,QAAO,OAAA,MAAA;AAAA;AACT,KACD,CAAA;AACD,IAAO,OAAA,UAAA;AAAA;AAEX,CAAA;AAEA,MAAM,UAAU,CAAC,EAAE,IAAK,EAAA,KAAwB,OAAO,IAAS,KAAA,QAAA;AAEhE,MAAM,qCAAqC,CACzC,OAAA,EACA,cACA,EAAA,UAAA,EACA,iBACA,YACG,KAAA;AACH,EAAA,IAAI,sBAAsB,cAAiB,GAAA,UAAA;AAC3C,EAAA,IAAI,eAAkB,GAAA,OAAA;AAEtB,EAAA,MAAM,UAAU,CAAC;AAAA,IACf,KAAQ,GAAA,YAAA;AAAA,IACR,QAAW,GAAA;AAAA,QACW,KAAQ,GAAA,QAAA;AAEhC,EAAA,OAAO,sBAAsB,CAAG,EAAA;AAC9B,IAAA,MAAM,WAAW,eAAgB,CAAA,MAAA;AAAA,MAC/B,CAAC,GAAQ,KAAA,OAAA,CAAQ,GAAG,CAAA,IAAK,QAAQ,GAAG;AAAA,KACtC;AACA,IAAA,MAAM,0BACJ,QAAS,CAAA,MAAA,IAAU,eAAgB,CAAA,MAAA,CAAO,OAAO,CAAE,CAAA,MAAA;AAGrD,IAAA,MAAM,2BAA2B,IAAK,CAAA,IAAA;AAAA,MACpC,mBAAsB,GAAA;AAAA,KACxB;AACA,IAAkB,eAAA,GAAA,OAAA,CAAQ,GAAI,CAAA,CAAC,MAAW,KAAA;AACxC,MAAM,MAAA;AAAA,QACJ,QAAW,GAAA,eAAA;AAAA,QACX,KAAQ,GAAA,YAAA;AAAA,QACR,IAAO,GAAA;AAAA,OACL,GAAA,MAAA;AACJ,MAAA,IAAI,QAAS,CAAA,MAAA,GAAS,CAAK,IAAA,IAAA,KAAS,CAAG,EAAA;AACrC,QAAO,OAAA,MAAA;AAAA;AAKT,MAAA,MAAM,mBAAmB,IAAK,CAAA,GAAA;AAAA,QAC5B,wBAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,MAAM,gBAAgB,KAAQ,GAAA,gBAAA;AAC9B,MAAA,IAAI,gBAAgB,QAAU,EAAA;AAC5B,QAAA,mBAAA,IAAuB,aAAgB,GAAA,QAAA;AACvC,QAAA,OAAO,EAAE,GAAG,MAAQ,EAAA,KAAA,EAAO,QAAS,EAAA;AAAA,OAC/B,MAAA;AACL,QAAuB,mBAAA,IAAA,gBAAA;AACvB,QAAA,OAAO,EAAE,GAAG,MAAQ,EAAA,KAAA,EAAO,aAAc,EAAA;AAAA;AAC3C,KACD,CAAA;AAAA;AAEH,EAAO,OAAA,eAAA;AACT,CAAA;AASa,MAAA,sBAAA,GAAyB,CACpC,CAAA,EACA,EAEA,KAAA,CAAA,CAAE,MAAW,KAAA,EAAA,CAAG,MAChB,IAAA,CAAA,CAAE,MAAO,CAAA,cAAA,CAAe,CAAE,CAAA,OAAA,CAAQ,EAAE,MAAO,CAAA,IAAI,CAAC,CAAA,KAC9C,EAAG,CAAA,MAAA,CAAO,cAAe,CAAA,EAAA,CAAG,OAAQ,CAAA,EAAA,CAAG,MAAO,CAAA,IAAI,CAAC;AAUhD,MAAM,yBAA4B,GAAA,CACvC,CACA,EAAA,EAAA,KAEA,EAAE,MAAW,KAAA,EAAA,CAAG,MAChB,IAAA,CAAA,CAAE,OAAQ,CAAA,GAAA,KAAQ,EAAG,CAAA,OAAA,CAAQ,OAC7B,CAAE,CAAA,MAAA,CAAO,cAAe,CAAA,CAAA,CAAE,OAAQ,CAAA,CAAA,CAAE,MAAO,CAAA,IAAI,CAAC,CAC9C,KAAA,EAAA,CAAG,MAAO,CAAA,cAAA,CAAe,EAAG,CAAA,OAAA,CAAQ,EAAG,CAAA,MAAA,CAAO,IAAI,CAAC;AAE1C,MAAA,YAAA,GAAe,CAAC,MAAA,KAA6B,MAAO,CAAA;AAC1D,MAAM,cAAiB,GAAA,CAAC,MAC7B,KAAA,MAAA,CAAO,cAAmB,KAAA;AAKf,MAAA,kBAAA,GAAqB,CAGhC,WAAA,EACA,YACQ,KAAA;AACR,EAAA,MAAM,UAAe,EAAC;AACtB,EAAA,IAAI,YAAe,GAAA,EAAA;AACnB,EAAA,KAAA,MAAW,QAAQ,YAAc,EAAA;AAG/B,IAAA,IAAI,iBAAiB,IAAM,EAAA;AACzB,MAAA,MAAM,aAAa,WAAY,CAAA,IAAA,CAAK,CAAC,CAAM,KAAA,CAAA,CAAE,SAAS,IAAI,CAAA;AAC1D,MAAA,IAAI,UAAY,EAAA;AACd,QAAA,OAAA,CAAQ,KAAK,UAAU,CAAA;AAAA;AAEzB,MAAe,YAAA,GAAA,IAAA;AAAA;AACjB;AAEF,EAAO,OAAA,OAAA;AACT;AAEa,MAAA,iBAAA,GAAoB,CAC/B,OAAA,EACA,YACG,KAAA;AACH,EAAM,MAAA,MAAA,GAAS,OAAQ,CAAA,YAAA,GAAe,CAAC,CAAA;AACvC,EAAI,IAAA,MAAA,IAAU,MAAO,CAAA,YAAA,KAAiB,YAAc,EAAA;AAClD,IAAO,OAAA,MAAA;AAAA,GACE,MAAA,IAAA,MAAA,IAAU,MAAO,CAAA,YAAA,GAAe,YAAc,EAAA;AACvD,IAAA,IAAI,OAAQ,CAAA,YAAY,CAAG,EAAA,YAAA,KAAiB,YAAc,EAAA;AACxD,MAAA,OAAO,QAAQ,YAAY,CAAA;AAAA;AAC7B;AAEF,EAAM,MAAA,KAAA,CAAM,CAAgC,6BAAA,EAAA,YAAY,CAAE,CAAA,CAAA;AAC5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -16,7 +16,11 @@ const isTypeCompatible = (rendererType, serverDataType) => {
|
|
|
16
16
|
if (rendererType === void 0 || rendererType === "private") {
|
|
17
17
|
return true;
|
|
18
18
|
} else if (Array.isArray(rendererType)) {
|
|
19
|
-
|
|
19
|
+
if (serverDataType === "json") {
|
|
20
|
+
return false;
|
|
21
|
+
} else {
|
|
22
|
+
return rendererType.includes(serverDataType);
|
|
23
|
+
}
|
|
20
24
|
} else {
|
|
21
25
|
return rendererType === serverDataType;
|
|
22
26
|
}
|
|
@@ -62,15 +66,15 @@ function registerComponent(componentName, component, componentType, options) {
|
|
|
62
66
|
const registerConfigurationEditor = (componentName, configurationEditor) => {
|
|
63
67
|
configEditorsMap.set(componentName, configurationEditor);
|
|
64
68
|
};
|
|
65
|
-
const getRegisteredCellRenderers = (
|
|
69
|
+
const getRegisteredCellRenderers = (cellRendererDataType) => {
|
|
66
70
|
const rendererNames = Array.from(cellRenderersMap.keys());
|
|
67
71
|
const allRenderers = rendererNames.map((name) => ({
|
|
68
72
|
name,
|
|
69
73
|
...optionsMap.get(name)
|
|
70
74
|
})).filter(({ userCanAssign }) => userCanAssign !== false);
|
|
71
|
-
if (
|
|
75
|
+
if (cellRendererDataType) {
|
|
72
76
|
return allRenderers.filter(
|
|
73
|
-
(renderer) => isTypeCompatible(renderer.serverDataType,
|
|
77
|
+
(renderer) => isTypeCompatible(renderer.serverDataType, cellRendererDataType)
|
|
74
78
|
);
|
|
75
79
|
} else {
|
|
76
80
|
return allRenderers;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component-registry.js","sources":["../../../../../../packages/vuu-utils/src/component-registry.ts"],"sourcesContent":["import { DataSourceRow, EditRuleValidator } from \"@vuu-ui/vuu-data-types\";\nimport { VuuColumnDataType } from \"@vuu-ui/vuu-protocol-types\";\nimport {\n ColumnDescriptor,\n ColumnDescriptorCustomRenderer,\n ColumnTypeRendering,\n HeaderCellProps,\n TableCellRendererProps,\n} from \"@vuu-ui/vuu-table-types\";\nimport { FunctionComponent as FC, HTMLAttributes } from \"react\";\nimport {\n ColumnMap,\n hasCustomRenderer,\n isColumnTypeRenderer,\n isTypeDescriptor,\n} from \"./column-utils\";\n\nexport interface CellConfigPanelProps extends HTMLAttributes<HTMLDivElement> {\n onConfigChange: () => void;\n}\n\nexport type PropertyChangeHandler = (\n propertyName: string,\n propertyValue: string | number | boolean,\n) => void;\n\nexport type ColumnRenderPropsChangeHandler = (\n renderProps: ColumnTypeRendering,\n) => void;\n\nexport interface ConfigurationEditorProps {\n column: ColumnDescriptorCustomRenderer;\n onChangeRendering: ColumnRenderPropsChangeHandler;\n}\n\nexport type RowClassNameGenerator = (\n row: DataSourceRow,\n columnMap: ColumnMap,\n) => string | undefined;\n\nexport type RowClassGenerator = {\n id: string;\n fn: RowClassNameGenerator;\n};\n\nexport type ConfigEditorComponent = FC<CellConfigPanelProps>;\n\nconst containersSet = new Set<string>();\nconst viewsSet = new Set<string>();\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst layoutComponentsMap = new Map<string, FC<any>>();\nconst cellRenderersMap = new Map<string, FC<TableCellRendererProps>>();\nconst columnHeaderRenderersMap = new Map<\n string,\n FC<Omit<HeaderCellProps, \"id\" | \"index\">>\n>();\nconst configEditorsMap = new Map<string, FC<ConfigurationEditorProps>>();\nconst cellConfigPanelsMap = new Map<string, ConfigEditorComponent>();\nconst editRuleValidatorsMap = new Map<string, EditRuleValidator>();\nconst optionsMap = new Map<string, CellRendererOptions>();\nconst rowClassGeneratorsMap = new Map<string, RowClassGenerator>();\n\nexport type layoutComponentType = \"container\" | \"view\";\n\nexport type ComponentType =\n | layoutComponentType\n | \"cell-renderer\"\n | \"cell-config-panel\"\n | \"column-header-content-renderer\"\n | \"column-header-label-renderer\"\n | \"component\"\n | \"data-edit-validator\"\n | \"row-class-generator\";\n\n/**\n * The CellRenderer Options provide configuration for the Column Settings panel\n */\ntype CellRendererOptions = {\n configEditor?: string;\n description?: string;\n label?: string;\n serverDataType?: VuuColumnDataType | VuuColumnDataType[] | \"json\" | \"private\";\n userCanAssign?: boolean;\n};\nexport interface CellRendererDescriptor extends CellRendererOptions {\n name: string;\n}\n\nconst isTypeCompatible = (\n rendererType:\n | VuuColumnDataType\n | (VuuColumnDataType | \"json\")[]\n | \"json\"\n | \"private\"\n | undefined,\n serverDataType: VuuColumnDataType | \"json\",\n) => {\n if (rendererType === undefined || rendererType === \"private\") {\n return true;\n } else if (Array.isArray(rendererType)) {\n return rendererType.includes(serverDataType);\n } else {\n return rendererType === serverDataType;\n }\n};\n\n/**\n * This check is performed during construction of UI from JSON. If component\n * is not registered, it will log a warning.\n */\nexport const isContainer = (componentType: string) => {\n return containersSet.has(componentType);\n};\n\n/**\n * This check is performed during construction of UI from JSON. If component\n * is not registered, it will log a warning.\n */\nexport const isView = (componentType: string) => {\n return viewsSet.has(componentType);\n};\n\n/**\n * This check is performed during construction of UI from JSON. If component\n * is not registered, it will log a warning.\n */\nexport const isLayoutComponent = (\n componentType: string,\n): componentType is layoutComponentType =>\n isContainer(componentType) || isView(componentType);\n\nconst isCellRenderer = (\n type: ComponentType,\n component: unknown,\n): component is FC<TableCellRendererProps> =>\n component !== undefined && type === \"cell-renderer\";\n\nconst isColumnHeaderContentRenderer = (\n type: ComponentType,\n component: unknown,\n): component is FC<Omit<HeaderCellProps, \"id\" | \"index\">> =>\n type === \"column-header-content-renderer\";\nconst isColumnHeaderLabelRenderer = (\n type: ComponentType,\n component: unknown,\n): component is FC<Omit<HeaderCellProps, \"id\" | \"index\">> =>\n type === \"column-header-label-renderer\";\n\nconst isCellConfigPanel = (\n type: ComponentType,\n component: unknown,\n): component is FC<CellConfigPanelProps> => type === \"cell-config-panel\";\n\nconst isEditRuleValidator = (\n type: ComponentType,\n component: unknown,\n): component is EditRuleValidator => type === \"data-edit-validator\";\n\nconst isRowClassGenerator = (\n type: ComponentType,\n component: unknown,\n): component is RowClassGenerator => type === \"row-class-generator\";\n\nexport function registerComponent(\n componentName: string,\n component: RowClassGenerator,\n componentType: \"row-class-generator\",\n options?: CellRendererOptions,\n): void;\nexport function registerComponent(\n componentName: string,\n component: EditRuleValidator,\n componentType: \"data-edit-validator\",\n options?: CellRendererOptions,\n): void;\nexport function registerComponent(\n componentName: string,\n // unknown won't work for us here, we'll get the default children\n // definition for FC which conflicts with some components props.\n // VoidFunctionComponent doesn't help either\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n component: FC<any>,\n componentType: Omit<\n ComponentType,\n \"data-edit-validator\" | \"row-class-generator\"\n >,\n options?: CellRendererOptions,\n): void;\nexport function registerComponent(\n componentName: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n component: any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n componentType: any,\n options?: CellRendererOptions,\n): void {\n if (\n componentType === \"container\" ||\n componentType === \"view\" ||\n componentType === \"component\"\n ) {\n layoutComponentsMap.set(componentName, component);\n if (componentType === \"container\") {\n containersSet.add(componentName);\n } else if (componentType === \"view\") {\n viewsSet.add(componentName);\n }\n } else if (isCellRenderer(componentType, component)) {\n cellRenderersMap.set(componentName, component);\n } else if (isColumnHeaderContentRenderer(componentType, component)) {\n columnHeaderRenderersMap.set(componentName, component);\n } else if (isColumnHeaderLabelRenderer(componentType, component)) {\n columnHeaderRenderersMap.set(componentName, component);\n } else if (isCellConfigPanel(componentType, component)) {\n cellConfigPanelsMap.set(componentName, component);\n } else if (isEditRuleValidator(componentType, component)) {\n editRuleValidatorsMap.set(componentName, component);\n } else if (isRowClassGenerator(componentType, component)) {\n rowClassGeneratorsMap.set(componentName, component);\n }\n if (options) {\n optionsMap.set(componentName, options);\n }\n}\n\nexport const registerConfigurationEditor = (\n componentName: string,\n configurationEditor: FC<ConfigurationEditorProps>,\n) => {\n configEditorsMap.set(componentName, configurationEditor);\n};\n\n// This is invoked by settings panel to allow users to assign\n// non-default, cell renderers. Ignore renderers registered\n// with the attribute userCanAssign = false\nexport const getRegisteredCellRenderers = (\n serverDataType?: VuuColumnDataType | \"json\",\n): CellRendererDescriptor[] => {\n const rendererNames = Array.from(cellRenderersMap.keys());\n const allRenderers = rendererNames\n .map<CellRendererDescriptor>((name) => ({\n name,\n ...(optionsMap.get(name) as CellRendererOptions),\n }))\n .filter(({ userCanAssign }) => userCanAssign !== false);\n if (serverDataType) {\n return allRenderers.filter((renderer) =>\n isTypeCompatible(renderer.serverDataType, serverDataType),\n );\n } else {\n return allRenderers;\n }\n};\n\nexport const getLayoutComponent = (componentName: string) => {\n const layoutComponent = layoutComponentsMap.get(componentName);\n if (layoutComponent) {\n return layoutComponent;\n } else {\n throw Error(\n `layout component ${componentName} not found in ComponentRegistry`,\n );\n }\n};\n\nexport const getCellRendererOptions = (renderName: string) =>\n optionsMap.get(renderName);\n\nexport function getCellRenderer(column: ColumnDescriptor) {\n return dataCellRenderer(column);\n}\nexport function getColumnHeaderContentRenderer(column: ColumnDescriptor) {\n if (column.colHeaderContentRenderer) {\n return columnHeaderRenderersMap.get(column.colHeaderContentRenderer);\n }\n}\nexport function getColumnHeaderLabelRenderer(column: ColumnDescriptor) {\n if (column.colHeaderLabelRenderer) {\n return columnHeaderRenderersMap.get(column.colHeaderLabelRenderer);\n }\n}\nexport const getRowClassNameGenerator = (generatorId: string) =>\n rowClassGeneratorsMap.get(generatorId);\n\nexport function getConfigurationEditor(configEditor = \"\") {\n return configEditorsMap.get(configEditor);\n}\n\nexport function getCellConfigPanelRenderer(name: string) {\n return cellConfigPanelsMap.get(name);\n}\n\nexport function getEditRuleValidator(name: string) {\n return editRuleValidatorsMap.get(name);\n}\n\nfunction dataCellRenderer(column: ColumnDescriptor) {\n if (column.serverDataType === \"boolean\" && !hasCustomRenderer(column.type)) {\n return cellRenderersMap.get(\"checkbox-cell\");\n } else if (column.editable && !hasCustomRenderer(column.type)) {\n // we can only offer a text input edit as a generic editor.\n // If a more specialised editor is required, user must configure\n // it in column config.\n return cellRenderersMap.get(\"input-cell\");\n } else if (\n isTypeDescriptor(column.type) &&\n isColumnTypeRenderer(column.type.renderer)\n ) {\n return cellRenderersMap.get(column.type.renderer?.name);\n } else if (column.serverDataType === \"boolean\") {\n return cellRenderersMap.get(\"checkbox-cell\");\n }\n}\n"],"names":["hasCustomRenderer","isTypeDescriptor","isColumnTypeRenderer"],"mappings":";;;;AA+CA,MAAM,aAAA,uBAAoB,GAAY,EAAA;AACtC,MAAM,QAAA,uBAAe,GAAY,EAAA;AAGjC,MAAM,mBAAA,uBAA0B,GAAqB,EAAA;AACrD,MAAM,gBAAA,uBAAuB,GAAwC,EAAA;AACrE,MAAM,wBAAA,uBAA+B,GAGnC,EAAA;AACF,MAAM,gBAAA,uBAAuB,GAA0C,EAAA;AACvE,MAAM,mBAAA,uBAA0B,GAAmC,EAAA;AACnE,MAAM,qBAAA,uBAA4B,GAA+B,EAAA;AACjE,MAAM,UAAA,uBAAiB,GAAiC,EAAA;AACxD,MAAM,qBAAA,uBAA4B,GAA+B,EAAA;AA4BjE,MAAM,gBAAA,GAAmB,CACvB,YAAA,EAMA,cACG,KAAA;AACH,EAAI,IAAA,YAAA,KAAiB,KAAa,CAAA,IAAA,YAAA,KAAiB,SAAW,EAAA;AAC5D,IAAO,OAAA,IAAA;AAAA,GACE,MAAA,IAAA,KAAA,CAAM,OAAQ,CAAA,YAAY,CAAG,EAAA;AACtC,IAAO,OAAA,YAAA,CAAa,SAAS,cAAc,CAAA;AAAA,GACtC,MAAA;AACL,IAAA,OAAO,YAAiB,KAAA,cAAA;AAAA;AAE5B,CAAA;AAMa,MAAA,WAAA,GAAc,CAAC,aAA0B,KAAA;AACpD,EAAO,OAAA,aAAA,CAAc,IAAI,aAAa,CAAA;AACxC;AAMa,MAAA,MAAA,GAAS,CAAC,aAA0B,KAAA;AAC/C,EAAO,OAAA,QAAA,CAAS,IAAI,aAAa,CAAA;AACnC;AAMO,MAAM,oBAAoB,CAC/B,aAAA,KAEA,YAAY,aAAa,CAAA,IAAK,OAAO,aAAa;AAEpD,MAAM,iBAAiB,CACrB,IAAA,EACA,SAEA,KAAA,SAAA,KAAc,UAAa,IAAS,KAAA,eAAA;AAEtC,MAAM,6BAAgC,GAAA,CACpC,IACA,EAAA,SAAA,KAEA,IAAS,KAAA,gCAAA;AACX,MAAM,2BAA8B,GAAA,CAClC,IACA,EAAA,SAAA,KAEA,IAAS,KAAA,8BAAA;AAEX,MAAM,iBAAoB,GAAA,CACxB,IACA,EAAA,SAAA,KAC0C,IAAS,KAAA,mBAAA;AAErD,MAAM,mBAAsB,GAAA,CAC1B,IACA,EAAA,SAAA,KACmC,IAAS,KAAA,qBAAA;AAE9C,MAAM,mBAAsB,GAAA,CAC1B,IACA,EAAA,SAAA,KACmC,IAAS,KAAA,qBAAA;AA2BvC,SAAS,iBACd,CAAA,aAAA,EAEA,SAEA,EAAA,aAAA,EACA,OACM,EAAA;AACN,EAAA,IACE,aAAkB,KAAA,WAAA,IAClB,aAAkB,KAAA,MAAA,IAClB,kBAAkB,WAClB,EAAA;AACA,IAAoB,mBAAA,CAAA,GAAA,CAAI,eAAe,SAAS,CAAA;AAChD,IAAA,IAAI,kBAAkB,WAAa,EAAA;AACjC,MAAA,aAAA,CAAc,IAAI,aAAa,CAAA;AAAA,KACjC,MAAA,IAAW,kBAAkB,MAAQ,EAAA;AACnC,MAAA,QAAA,CAAS,IAAI,aAAa,CAAA;AAAA;AAC5B,GACS,MAAA,IAAA,cAAA,CAAe,aAAe,EAAA,SAAS,CAAG,EAAA;AACnD,IAAiB,gBAAA,CAAA,GAAA,CAAI,eAAe,SAAS,CAAA;AAAA,GACpC,MAAA,IAAA,6BAAA,CAA8B,aAAwB,CAAG,EAAA;AAClE,IAAyB,wBAAA,CAAA,GAAA,CAAI,eAAe,SAAS,CAAA;AAAA,GAC5C,MAAA,IAAA,2BAAA,CAA4B,aAAwB,CAAG,EAAA;AAChE,IAAyB,wBAAA,CAAA,GAAA,CAAI,eAAe,SAAS,CAAA;AAAA,GAC5C,MAAA,IAAA,iBAAA,CAAkB,aAAwB,CAAG,EAAA;AACtD,IAAoB,mBAAA,CAAA,GAAA,CAAI,eAAe,SAAS,CAAA;AAAA,GACvC,MAAA,IAAA,mBAAA,CAAoB,aAAwB,CAAG,EAAA;AACxD,IAAsB,qBAAA,CAAA,GAAA,CAAI,eAAe,SAAS,CAAA;AAAA,GACzC,MAAA,IAAA,mBAAA,CAAoB,aAAwB,CAAG,EAAA;AACxD,IAAsB,qBAAA,CAAA,GAAA,CAAI,eAAe,SAAS,CAAA;AAAA;AAEpD,EAAA,IAAI,OAAS,EAAA;AACX,IAAW,UAAA,CAAA,GAAA,CAAI,eAAe,OAAO,CAAA;AAAA;AAEzC;AAEa,MAAA,2BAAA,GAA8B,CACzC,aAAA,EACA,mBACG,KAAA;AACH,EAAiB,gBAAA,CAAA,GAAA,CAAI,eAAe,mBAAmB,CAAA;AACzD;AAKa,MAAA,0BAAA,GAA6B,CACxC,cAC6B,KAAA;AAC7B,EAAA,MAAM,aAAgB,GAAA,KAAA,CAAM,IAAK,CAAA,gBAAA,CAAiB,MAAM,CAAA;AACxD,EAAA,MAAM,YAAe,GAAA,aAAA,CAClB,GAA4B,CAAA,CAAC,IAAU,MAAA;AAAA,IACtC,IAAA;AAAA,IACA,GAAI,UAAW,CAAA,GAAA,CAAI,IAAI;AAAA,GACzB,CAAE,EACD,MAAO,CAAA,CAAC,EAAE,aAAc,EAAA,KAAM,kBAAkB,KAAK,CAAA;AACxD,EAAA,IAAI,cAAgB,EAAA;AAClB,IAAA,OAAO,YAAa,CAAA,MAAA;AAAA,MAAO,CAAC,QAAA,KAC1B,gBAAiB,CAAA,QAAA,CAAS,gBAAgB,cAAc;AAAA,KAC1D;AAAA,GACK,MAAA;AACL,IAAO,OAAA,YAAA;AAAA;AAEX;AAEa,MAAA,kBAAA,GAAqB,CAAC,aAA0B,KAAA;AAC3D,EAAM,MAAA,eAAA,GAAkB,mBAAoB,CAAA,GAAA,CAAI,aAAa,CAAA;AAC7D,EAAA,IAAI,eAAiB,EAAA;AACnB,IAAO,OAAA,eAAA;AAAA,GACF,MAAA;AACL,IAAM,MAAA,KAAA;AAAA,MACJ,oBAAoB,aAAa,CAAA,+BAAA;AAAA,KACnC;AAAA;AAEJ;AAEO,MAAM,sBAAyB,GAAA,CAAC,UACrC,KAAA,UAAA,CAAW,IAAI,UAAU;AAEpB,SAAS,gBAAgB,MAA0B,EAAA;AACxD,EAAA,OAAO,iBAAiB,MAAM,CAAA;AAChC;AACO,SAAS,+BAA+B,MAA0B,EAAA;AACvE,EAAA,IAAI,OAAO,wBAA0B,EAAA;AACnC,IAAO,OAAA,wBAAA,CAAyB,GAAI,CAAA,MAAA,CAAO,wBAAwB,CAAA;AAAA;AAEvE;AACO,SAAS,6BAA6B,MAA0B,EAAA;AACrE,EAAA,IAAI,OAAO,sBAAwB,EAAA;AACjC,IAAO,OAAA,wBAAA,CAAyB,GAAI,CAAA,MAAA,CAAO,sBAAsB,CAAA;AAAA;AAErE;AACO,MAAM,wBAA2B,GAAA,CAAC,WACvC,KAAA,qBAAA,CAAsB,IAAI,WAAW;AAEvB,SAAA,sBAAA,CAAuB,eAAe,EAAI,EAAA;AACxD,EAAO,OAAA,gBAAA,CAAiB,IAAI,YAAY,CAAA;AAC1C;AAEO,SAAS,2BAA2B,IAAc,EAAA;AACvD,EAAO,OAAA,mBAAA,CAAoB,IAAI,IAAI,CAAA;AACrC;AAEO,SAAS,qBAAqB,IAAc,EAAA;AACjD,EAAO,OAAA,qBAAA,CAAsB,IAAI,IAAI,CAAA;AACvC;AAEA,SAAS,iBAAiB,MAA0B,EAAA;AAClD,EAAA,IAAI,OAAO,cAAmB,KAAA,SAAA,IAAa,CAACA,6BAAkB,CAAA,MAAA,CAAO,IAAI,CAAG,EAAA;AAC1E,IAAO,OAAA,gBAAA,CAAiB,IAAI,eAAe,CAAA;AAAA,aAClC,MAAO,CAAA,QAAA,IAAY,CAACA,6BAAkB,CAAA,MAAA,CAAO,IAAI,CAAG,EAAA;AAI7D,IAAO,OAAA,gBAAA,CAAiB,IAAI,YAAY,CAAA;AAAA,GAC1C,MAAA,IACEC,6BAAiB,MAAO,CAAA,IAAI,KAC5BC,gCAAqB,CAAA,MAAA,CAAO,IAAK,CAAA,QAAQ,CACzC,EAAA;AACA,IAAA,OAAO,gBAAiB,CAAA,GAAA,CAAI,MAAO,CAAA,IAAA,CAAK,UAAU,IAAI,CAAA;AAAA,GACxD,MAAA,IAAW,MAAO,CAAA,cAAA,KAAmB,SAAW,EAAA;AAC9C,IAAO,OAAA,gBAAA,CAAiB,IAAI,eAAe,CAAA;AAAA;AAE/C;;;;;;;;;;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"component-registry.js","sources":["../../../../../../packages/vuu-utils/src/component-registry.ts"],"sourcesContent":["import { EditRuleValidator } from \"@vuu-ui/vuu-data-types\";\nimport { VuuColumnDataType } from \"@vuu-ui/vuu-protocol-types\";\nimport {\n ColumnDescriptor,\n ColumnDescriptorCustomRenderer,\n ColumnTypeRendering,\n DataRow,\n HeaderCellProps,\n TableCellRendererProps,\n} from \"@vuu-ui/vuu-table-types\";\nimport { FunctionComponent as FC, HTMLAttributes } from \"react\";\nimport {\n hasCustomRenderer,\n isColumnTypeRenderer,\n isTypeDescriptor,\n} from \"./column-utils\";\n\nexport interface CellConfigPanelProps extends HTMLAttributes<HTMLDivElement> {\n onConfigChange: () => void;\n}\n\nexport type PropertyChangeHandler = (\n propertyName: string,\n propertyValue: string | number | boolean,\n) => void;\n\nexport type ColumnRenderPropsChangeHandler = (\n renderProps: ColumnTypeRendering,\n) => void;\n\nexport interface ConfigurationEditorProps {\n column: ColumnDescriptorCustomRenderer;\n onChangeRendering: ColumnRenderPropsChangeHandler;\n}\n\nexport type RowClassNameGenerator = (dataRow: DataRow) => string | undefined;\n\nexport type RowClassGenerator = {\n id: string;\n fn: RowClassNameGenerator;\n};\n\nexport type ConfigEditorComponent = FC<CellConfigPanelProps>;\n\nconst containersSet = new Set<string>();\nconst viewsSet = new Set<string>();\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst layoutComponentsMap = new Map<string, FC<any>>();\nconst cellRenderersMap = new Map<string, FC<TableCellRendererProps>>();\nconst columnHeaderRenderersMap = new Map<\n string,\n FC<Omit<HeaderCellProps, \"id\" | \"index\">>\n>();\nconst configEditorsMap = new Map<string, FC<ConfigurationEditorProps>>();\nconst cellConfigPanelsMap = new Map<string, ConfigEditorComponent>();\nconst editRuleValidatorsMap = new Map<string, EditRuleValidator>();\nconst optionsMap = new Map<string, CellRendererOptions>();\nconst rowClassGeneratorsMap = new Map<string, RowClassGenerator>();\n\nexport type layoutComponentType = \"container\" | \"view\";\n\nexport type ComponentType =\n | layoutComponentType\n | \"cell-renderer\"\n | \"cell-config-panel\"\n | \"column-header-content-renderer\"\n | \"column-header-label-renderer\"\n | \"component\"\n | \"data-edit-validator\"\n | \"row-class-generator\";\n\n/**\n * The CellRenderer Options provide configuration for the Column Settings panel\n */\ntype CellRendererOptions = {\n configEditor?: string;\n description?: string;\n label?: string;\n serverDataType?: VuuColumnDataType | VuuColumnDataType[] | \"json\" | \"private\";\n userCanAssign?: boolean;\n};\nexport interface CellRendererDescriptor extends CellRendererOptions {\n name: string;\n}\n\nconst isTypeCompatible = (\n rendererType: CellRendererOptions[\"serverDataType\"] | undefined,\n serverDataType: CellRendererDataType | \"json\",\n) => {\n if (rendererType === undefined || rendererType === \"private\") {\n return true;\n } else if (Array.isArray(rendererType)) {\n if (serverDataType === \"json\") {\n return false;\n } else {\n return rendererType.includes(serverDataType);\n }\n } else {\n return rendererType === serverDataType;\n }\n};\n\n/**\n * This check is performed during construction of UI from JSON. If component\n * is not registered, it will log a warning.\n */\nexport const isContainer = (componentType: string) => {\n return containersSet.has(componentType);\n};\n\n/**\n * This check is performed during construction of UI from JSON. If component\n * is not registered, it will log a warning.\n */\nexport const isView = (componentType: string) => {\n return viewsSet.has(componentType);\n};\n\n/**\n * This check is performed during construction of UI from JSON. If component\n * is not registered, it will log a warning.\n */\nexport const isLayoutComponent = (\n componentType: string,\n): componentType is layoutComponentType =>\n isContainer(componentType) || isView(componentType);\n\nconst isCellRenderer = (\n type: ComponentType,\n component: unknown,\n): component is FC<TableCellRendererProps> =>\n component !== undefined && type === \"cell-renderer\";\n\nconst isColumnHeaderContentRenderer = (\n type: ComponentType,\n component: unknown,\n): component is FC<Omit<HeaderCellProps, \"id\" | \"index\">> =>\n type === \"column-header-content-renderer\";\nconst isColumnHeaderLabelRenderer = (\n type: ComponentType,\n component: unknown,\n): component is FC<Omit<HeaderCellProps, \"id\" | \"index\">> =>\n type === \"column-header-label-renderer\";\n\nconst isCellConfigPanel = (\n type: ComponentType,\n component: unknown,\n): component is FC<CellConfigPanelProps> => type === \"cell-config-panel\";\n\nconst isEditRuleValidator = (\n type: ComponentType,\n component: unknown,\n): component is EditRuleValidator => type === \"data-edit-validator\";\n\nconst isRowClassGenerator = (\n type: ComponentType,\n component: unknown,\n): component is RowClassGenerator => type === \"row-class-generator\";\n\nexport function registerComponent(\n componentName: string,\n component: RowClassGenerator,\n componentType: \"row-class-generator\",\n options?: CellRendererOptions,\n): void;\nexport function registerComponent(\n componentName: string,\n component: EditRuleValidator,\n componentType: \"data-edit-validator\",\n options?: CellRendererOptions,\n): void;\nexport function registerComponent(\n componentName: string,\n // unknown won't work for us here, we'll get the default children\n // definition for FC which conflicts with some components props.\n // VoidFunctionComponent doesn't help either\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n component: FC<any>,\n componentType: Omit<\n ComponentType,\n \"data-edit-validator\" | \"row-class-generator\"\n >,\n options?: CellRendererOptions,\n): void;\nexport function registerComponent(\n componentName: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n component: any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n componentType: any,\n options?: CellRendererOptions,\n): void {\n if (\n componentType === \"container\" ||\n componentType === \"view\" ||\n componentType === \"component\"\n ) {\n layoutComponentsMap.set(componentName, component);\n if (componentType === \"container\") {\n containersSet.add(componentName);\n } else if (componentType === \"view\") {\n viewsSet.add(componentName);\n }\n } else if (isCellRenderer(componentType, component)) {\n cellRenderersMap.set(componentName, component);\n } else if (isColumnHeaderContentRenderer(componentType, component)) {\n columnHeaderRenderersMap.set(componentName, component);\n } else if (isColumnHeaderLabelRenderer(componentType, component)) {\n columnHeaderRenderersMap.set(componentName, component);\n } else if (isCellConfigPanel(componentType, component)) {\n cellConfigPanelsMap.set(componentName, component);\n } else if (isEditRuleValidator(componentType, component)) {\n editRuleValidatorsMap.set(componentName, component);\n } else if (isRowClassGenerator(componentType, component)) {\n rowClassGeneratorsMap.set(componentName, component);\n }\n if (options) {\n optionsMap.set(componentName, options);\n }\n}\n\nexport const registerConfigurationEditor = (\n componentName: string,\n configurationEditor: FC<ConfigurationEditorProps>,\n) => {\n configEditorsMap.set(componentName, configurationEditor);\n};\n\ntype CellRendererDataType = VuuColumnDataType | \"json\";\n\n// This is invoked by settings panel to allow users to assign\n// non-default, cell renderers. Ignore renderers registered\n// with the attribute userCanAssign = false\nexport const getRegisteredCellRenderers = (\n cellRendererDataType?: CellRendererDataType,\n): CellRendererDescriptor[] => {\n const rendererNames = Array.from(cellRenderersMap.keys());\n const allRenderers = rendererNames\n .map<CellRendererDescriptor>((name) => ({\n name,\n ...(optionsMap.get(name) as CellRendererOptions),\n }))\n .filter(({ userCanAssign }) => userCanAssign !== false);\n if (cellRendererDataType) {\n return allRenderers.filter((renderer) =>\n isTypeCompatible(renderer.serverDataType, cellRendererDataType),\n );\n } else {\n return allRenderers;\n }\n};\n\nexport const getLayoutComponent = (componentName: string) => {\n const layoutComponent = layoutComponentsMap.get(componentName);\n if (layoutComponent) {\n return layoutComponent;\n } else {\n throw Error(\n `layout component ${componentName} not found in ComponentRegistry`,\n );\n }\n};\n\nexport const getCellRendererOptions = (renderName: string) =>\n optionsMap.get(renderName);\n\nexport function getCellRenderer(column: ColumnDescriptor) {\n return dataCellRenderer(column);\n}\nexport function getColumnHeaderContentRenderer(column: ColumnDescriptor) {\n if (column.colHeaderContentRenderer) {\n return columnHeaderRenderersMap.get(column.colHeaderContentRenderer);\n }\n}\nexport function getColumnHeaderLabelRenderer(column: ColumnDescriptor) {\n if (column.colHeaderLabelRenderer) {\n return columnHeaderRenderersMap.get(column.colHeaderLabelRenderer);\n }\n}\nexport const getRowClassNameGenerator = (generatorId: string) =>\n rowClassGeneratorsMap.get(generatorId);\n\nexport function getConfigurationEditor(configEditor = \"\") {\n return configEditorsMap.get(configEditor);\n}\n\nexport function getCellConfigPanelRenderer(name: string) {\n return cellConfigPanelsMap.get(name);\n}\n\nexport function getEditRuleValidator(name: string) {\n return editRuleValidatorsMap.get(name);\n}\n\nfunction dataCellRenderer(column: ColumnDescriptor) {\n if (column.serverDataType === \"boolean\" && !hasCustomRenderer(column.type)) {\n return cellRenderersMap.get(\"checkbox-cell\");\n } else if (column.editable && !hasCustomRenderer(column.type)) {\n // we can only offer a text input edit as a generic editor.\n // If a more specialised editor is required, user must configure\n // it in column config.\n return cellRenderersMap.get(\"input-cell\");\n } else if (\n isTypeDescriptor(column.type) &&\n isColumnTypeRenderer(column.type.renderer)\n ) {\n return cellRenderersMap.get(column.type.renderer?.name);\n } else if (column.serverDataType === \"boolean\") {\n return cellRenderersMap.get(\"checkbox-cell\");\n }\n}\n"],"names":["hasCustomRenderer","isTypeDescriptor","isColumnTypeRenderer"],"mappings":"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"}
|
|
@@ -16,6 +16,7 @@ const isValidFilterClauseOp = (op) => op === "in" || singleValueFilterOps.has(op
|
|
|
16
16
|
const isNamedFilter = (f) => f !== void 0 && f.name !== void 0;
|
|
17
17
|
const isSingleValueFilter = (f) => f !== void 0 && singleValueFilterOps.has(f.op);
|
|
18
18
|
const isSerializableFilter = (f) => isSingleValueFilter(f) && "asQuery" in f && typeof f["asQuery"] === "function";
|
|
19
|
+
const isFilter = (f) => typeof f === "object" && f !== null && (isFilterClause(f) || isMultiClauseFilter(f));
|
|
19
20
|
const isFilterClause = (f) => f !== void 0 && (isSingleValueFilter(f) || isMultiValueFilter(f));
|
|
20
21
|
const isMultiValueFilter = (f) => f !== void 0 && f.op === "in";
|
|
21
22
|
const isInFilter = (f) => f.op === "in";
|
|
@@ -164,6 +165,7 @@ exports.isBetweenFilter = isBetweenFilter;
|
|
|
164
165
|
exports.isBetweenOperator = isBetweenOperator;
|
|
165
166
|
exports.isCompleteFilter = isCompleteFilter;
|
|
166
167
|
exports.isExtendedFilter = isExtendedFilter;
|
|
168
|
+
exports.isFilter = isFilter;
|
|
167
169
|
exports.isFilterClause = isFilterClause;
|
|
168
170
|
exports.isFilteredColumn = isFilteredColumn;
|
|
169
171
|
exports.isInFilter = isInFilter;
|