@vuu-ui/vuu-utils 0.8.56 → 0.8.58
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/column-utils.js +14 -11
- package/cjs/column-utils.js.map +1 -1
- package/cjs/component-registry.js +43 -17
- package/cjs/component-registry.js.map +1 -1
- package/cjs/date/{utils.js → date-utils.js} +1 -1
- package/cjs/date/date-utils.js.map +1 -0
- package/cjs/date/types.js +4 -0
- package/cjs/date/types.js.map +1 -1
- package/cjs/form-utils.js +16 -0
- package/cjs/form-utils.js.map +1 -0
- package/cjs/html-utils.js +16 -0
- package/cjs/html-utils.js.map +1 -1
- package/cjs/index.js +30 -20
- package/cjs/index.js.map +1 -1
- package/cjs/list-utils.js +11 -0
- package/cjs/list-utils.js.map +1 -0
- package/esm/column-utils.js +15 -9
- package/esm/column-utils.js.map +1 -1
- package/esm/component-registry.js +40 -18
- package/esm/component-registry.js.map +1 -1
- package/esm/date/{utils.js → date-utils.js} +1 -1
- package/esm/date/date-utils.js.map +1 -0
- package/esm/date/types.js +2 -1
- package/esm/date/types.js.map +1 -1
- package/esm/form-utils.js +14 -0
- package/esm/form-utils.js.map +1 -0
- package/esm/html-utils.js +15 -1
- package/esm/html-utils.js.map +1 -1
- package/esm/index.js +7 -5
- package/esm/index.js.map +1 -1
- package/esm/list-utils.js +9 -0
- package/esm/list-utils.js.map +1 -0
- package/package.json +6 -6
- package/types/array-utils.d.ts +1 -1
- package/types/column-utils.d.ts +6 -4
- package/types/component-registry.d.ts +9 -2
- package/types/date/index.d.ts +2 -2
- package/types/date/types.d.ts +6 -0
- package/types/form-utils.d.ts +6 -0
- package/types/html-utils.d.ts +3 -0
- package/types/index.d.ts +3 -0
- package/types/list-utils.d.ts +2 -0
- package/types/user-types.d.ts +4 -0
- package/cjs/date/utils.js.map +0 -1
- package/esm/date/utils.js.map +0 -1
- /package/types/date/{utils.d.ts → date-utils.d.ts} +0 -0
package/cjs/column-utils.js
CHANGED
|
@@ -360,7 +360,8 @@ const getColumnLabel = (column) => {
|
|
|
360
360
|
if (column.label) {
|
|
361
361
|
return column.label;
|
|
362
362
|
} else if (isCalculatedColumn(column.name)) {
|
|
363
|
-
|
|
363
|
+
const { name } = getCalculatedColumnDetails(column);
|
|
364
|
+
return name ?? column.name;
|
|
364
365
|
} else {
|
|
365
366
|
return column.name;
|
|
366
367
|
}
|
|
@@ -541,16 +542,21 @@ const CalculatedColumnPattern = /.*:.*:.*/;
|
|
|
541
542
|
const isCalculatedColumn = (columnName) => columnName !== void 0 && CalculatedColumnPattern.test(columnName);
|
|
542
543
|
const getCalculatedColumnDetails = (column) => {
|
|
543
544
|
if (isCalculatedColumn(column.name)) {
|
|
544
|
-
|
|
545
|
+
const [name, serverDataType, expression] = column.name.split(/:=?/);
|
|
546
|
+
if (serverDataType && !isVuuColumnDataType(serverDataType)) {
|
|
547
|
+
throw Error(
|
|
548
|
+
`column-utils, getCalculatedColumnDetails ${serverDataType} is not valid type for column ${column.name}`
|
|
549
|
+
);
|
|
550
|
+
}
|
|
551
|
+
return {
|
|
552
|
+
name: name ?? "",
|
|
553
|
+
expression: expression ?? "",
|
|
554
|
+
serverDataType: isVuuColumnDataType(serverDataType) ? serverDataType : void 0
|
|
555
|
+
};
|
|
545
556
|
} else {
|
|
546
|
-
throw Error(
|
|
547
|
-
`column-utils, getCalculatedColumnDetails column name ${column.name} is not valid calculated column`
|
|
548
|
-
);
|
|
557
|
+
throw Error(`column.name is nor a calculated column`);
|
|
549
558
|
}
|
|
550
559
|
};
|
|
551
|
-
const getCalculatedColumnName = (column) => getCalculatedColumnDetails(column)[0];
|
|
552
|
-
const getCalculatedColumnType = (column) => getCalculatedColumnDetails(column)[1];
|
|
553
|
-
const getCalculatedColumnExpression = (column) => getCalculatedColumnDetails(column)[2];
|
|
554
560
|
const setCalculatedColumnName = (column, name) => {
|
|
555
561
|
const [, type, expression] = column.name.split(":");
|
|
556
562
|
return {
|
|
@@ -751,9 +757,6 @@ exports.findColumn = findColumn;
|
|
|
751
757
|
exports.flattenColumnGroup = flattenColumnGroup;
|
|
752
758
|
exports.fromServerDataType = fromServerDataType;
|
|
753
759
|
exports.getCalculatedColumnDetails = getCalculatedColumnDetails;
|
|
754
|
-
exports.getCalculatedColumnExpression = getCalculatedColumnExpression;
|
|
755
|
-
exports.getCalculatedColumnName = getCalculatedColumnName;
|
|
756
|
-
exports.getCalculatedColumnType = getCalculatedColumnType;
|
|
757
760
|
exports.getColumnByName = getColumnByName;
|
|
758
761
|
exports.getColumnLabel = getColumnLabel;
|
|
759
762
|
exports.getColumnName = getColumnName;
|
package/cjs/column-utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"column-utils.js","sources":["../src/column-utils.ts"],"sourcesContent":["import type {\n DataSourceRow,\n SchemaColumn,\n TableSchema,\n} from \"@vuu-ui/vuu-data-types\";\nimport type {\n VuuAggregation,\n VuuAggType,\n VuuColumnDataType,\n VuuDataRow,\n VuuGroupBy,\n VuuRowRecord,\n VuuSort,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport type {\n ColumnAlignment,\n ColumnDescriptor,\n ColumnType,\n ColumnTypeDescriptor,\n ColumnTypeFormatting,\n ColumnTypeRendering,\n ColumnTypeSimple,\n ColumnTypeWithValidationRules,\n DefaultColumnConfiguration,\n GroupColumnDescriptor,\n LookupRenderer,\n MappedValueTypeRenderer,\n PinLocation,\n RuntimeColumnDescriptor,\n TableHeading,\n TableHeadings,\n ValueListRenderer,\n DateTimeColumnDescriptor,\n TableCellRendererProps,\n} from \"@vuu-ui/vuu-table-types\";\nimport type { CSSProperties } from \"react\";\nimport { moveItem } from \"./array-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\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 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\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): ColumnTypeSimple => {\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 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 isDateTimeColumn = (\n column: ColumnDescriptor\n): column is DateTimeColumnDescriptor =>\n (isTypeDescriptor(column.type) ? column.type.name : column.type) ===\n \"date/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 = (name: string): ColumnDescriptor => ({\n name,\n});\n\n/**\n *\n */\nexport const isTypeDescriptor = (\n type?: ColumnType\n): type is ColumnTypeDescriptor =>\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 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?: ColumnType\n): type is ColumnTypeWithValidationRules =>\n isTypeDescriptor(type) &&\n isColumnTypeRenderer(type.renderer) &&\n Array.isArray(type.renderer.rules) &&\n type.renderer.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?: (RuntimeColumnDescriptor | 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 count: 8,\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 columns: RuntimeColumnDescriptor[],\n groupBy?: VuuGroupBy,\n confirmed = true\n): [GroupColumnDescriptor | null, RuntimeColumnDescriptor[]] {\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 (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 [[], []] as [RuntimeColumnDescriptor[], RuntimeColumnDescriptor[]]\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 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 groupCol = {\n name: \"group-col\",\n heading: [\"group-col\"],\n isGroup: true,\n columns: groupCols,\n groupConfirmed: confirmed,\n width: groupCols.map((c) => c.width).reduce((a, b) => a + b) + 100,\n } as GroupColumnDescriptor;\n\n return [groupCol, rest];\n }\n return [null, flattenColumnGroup(columns)];\n}\n\nexport const isGroupColumn = (\n column: RuntimeColumnDescriptor\n): column is GroupColumnDescriptor => column.isGroup === true;\n\nexport const isJsonAttribute = (value: unknown) =>\n typeof value === \"string\" && value.endsWith(\"+\");\n\nexport const isJsonGroup = (\n column: RuntimeColumnDescriptor,\n row: VuuDataRow,\n columnMap: ColumnMap\n) =>\n (column.type as ColumnTypeDescriptor)?.name === \"json\" &&\n isJsonAttribute(row[columnMap[column.name]]);\n\nexport const isJsonColumn = (column: RuntimeColumnDescriptor) =>\n (column.type as ColumnTypeDescriptor)?.name === \"json\";\n\nexport const sortPinnedColumns = (\n columns: RuntimeColumnDescriptor[]\n): RuntimeColumnDescriptor[] => {\n const leftPinnedColumns: RuntimeColumnDescriptor[] = [];\n const rightPinnedColumns: RuntimeColumnDescriptor[] = [];\n const restColumns: RuntimeColumnDescriptor[] = [];\n // 4 is the selectionEndSize, need to consider how we make this available\n let pinnedWidthLeft = 4;\n for (const column of columns) {\n // prettier-ignore\n switch(column.pin){\n case \"left\": {\n leftPinnedColumns.push({\n ...column,\n endPin: undefined,\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 endPin: true,\n });\n }\n\n const allColumns = leftPinnedColumns.length\n ? leftPinnedColumns.concat(restColumns)\n : restColumns;\n\n if (rightPinnedColumns.length) {\n const measuredRightPinnedColumns: RuntimeColumnDescriptor[] = [];\n let pinnedWidthRight = 0;\n for (const column of rightPinnedColumns) {\n measuredRightPinnedColumns.unshift({\n ...column,\n pinnedOffset: pinnedWidthRight,\n });\n pinnedWidthRight += column.width;\n }\n measuredRightPinnedColumns[0].endPin = true;\n return allColumns.concat(measuredRightPinnedColumns);\n } else {\n return allColumns;\n }\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 // the 4 is `selectionEndSize`, unfortunate if we need to be passed it from cell\n // need to think about how to make this available\n pinnedOffset = pin === \"left\" ? 0 : 4,\n width,\n}: RuntimeColumnDescriptor) =>\n pin === \"left\"\n ? ({\n left: pinnedOffset,\n width,\n \"--pin-width\": `${pinnedOffset + width - 3}px`,\n } as CSSProperties)\n : pin === \"right\"\n ? ({\n right: pinnedOffset,\n width,\n \"--pin-width\": `${pinnedOffset + width}px`,\n } as CSSProperties)\n : { width };\n\nexport const setAggregations = (\n aggregations: VuuAggregation[],\n column: RuntimeColumnDescriptor,\n aggType: VuuAggType\n) => {\n return aggregations\n .filter((agg) => agg.column !== column.name)\n .concat({ column: column.name, aggType });\n};\n\nexport const applyGroupByToColumns = (\n columns: RuntimeColumnDescriptor[],\n groupBy: VuuGroupBy,\n confirmed = true\n) => {\n if (groupBy.length) {\n const [groupColumn, nonGroupedColumns] = extractGroupColumn(\n columns,\n groupBy,\n confirmed\n );\n if (groupColumn) {\n return [groupColumn as RuntimeColumnDescriptor].concat(nonGroupedColumns);\n }\n } else if (columns[0]?.isGroup) {\n return flattenColumnGroup(columns);\n }\n return 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 return getCalculatedColumnName(column);\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 getRowRecord = (\n row: DataSourceRow,\n columnMap: ColumnMap\n): VuuRowRecord => {\n return Object.entries(columnMap).reduce<VuuRowRecord>(\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 (rightPinnedOnly) {\n if (column.pin === \"right\") {\n visibleColumns.push(column);\n }\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// Get the value for a specific columns within a grouped column\nexport const getGroupValueAndOffset = (\n columns: RuntimeColumnDescriptor[],\n row: DataSourceRow,\n columnMap: ColumnMap\n): [unknown, number] => {\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, depth === null ? 0 : Math.max(0, depth - 1)];\n } else if (depth === 0) {\n return [\"$root\", 0];\n } else {\n // offset 1 for now to allow for $root\n const { name, valueFormatter } = columns[depth - 1];\n const value = valueFormatter(row[columnMap[name]]);\n return [value, depth - 1];\n }\n};\n\nexport const getDefaultColumnType = (\n serverDataType?: VuuColumnDataType\n): ColumnTypeSimple => {\n switch (serverDataType) {\n case \"int\":\n case \"long\":\n case \"double\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\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: ColumnTypeSimple\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 *\n * return a filter predicate that will reject columns, names of which\n * are not in provided list.\n */\nexport const subscribedOnly =\n (columnNames?: string[]) => (column: ColumnDescriptor) =>\n columnNames?.includes(column.name);\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 // find the nearest preceding available column which is subscribed\n let index = -1;\n for (let i = indexOfAvailableColumn - 1; i >= 0; i--) {\n const { name } = availableColumns[i];\n index = subscribedColumns.findIndex(byColName(name));\n if (index !== -1) {\n break;\n }\n }\n\n if (index === -1) {\n return [newColumn].concat(subscribedColumns);\n } else {\n const results: ColumnDescriptor[] = [];\n for (let i = 0; i < subscribedColumns.length; i++) {\n results.push(subscribedColumns[i]);\n if (i === index) {\n results.push(newColumn);\n index = Number.MAX_SAFE_INTEGER;\n }\n }\n return results;\n }\n};\n\nconst CalculatedColumnPattern = /.*:.*:.*/;\n\nexport const isCalculatedColumn = (columnName?: string) =>\n columnName !== undefined && CalculatedColumnPattern.test(columnName);\n\nexport const getCalculatedColumnDetails = (column: ColumnDescriptor) => {\n if (isCalculatedColumn(column.name)) {\n return column.name.split(/:=?/);\n } else {\n throw Error(\n `column-utils, getCalculatedColumnDetails column name ${column.name} is not valid calculated column`\n );\n }\n};\n\nexport const getCalculatedColumnName = (column: ColumnDescriptor) =>\n getCalculatedColumnDetails(column)[0];\nexport const getCalculatedColumnType = (column: ColumnDescriptor) =>\n getCalculatedColumnDetails(column)[1] as VuuColumnDataType;\nexport const getCalculatedColumnExpression = (column: ColumnDescriptor) =>\n getCalculatedColumnDetails(column)[2];\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\nexport const applyDefaultColumnConfig = (\n { columns, table }: TableSchema,\n getDefaultColumnConfig?: DefaultColumnConfiguration\n) => {\n if (typeof getDefaultColumnConfig === \"function\") {\n return columns.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 const getColumnByName = (\n schema: TableSchema,\n name?: string\n): SchemaColumn | undefined => {\n if (name === undefined) {\n return undefined;\n } else {\n const column = schema.columns.find((col) => col.name === name);\n if (column) {\n return column;\n } else {\n throw Error(\n `getColumnByName no column '${name}' in schema for ${schema.table.table}`\n );\n }\n }\n};\n\n//New added column functionality issue #639\n\nexport type ColumnLayout = \"Static\" | \"Fit\";\n\nexport type columnOptions = {\n availableWidth?: number;\n columnLayout?: ColumnLayout;\n defaultWidth?: number;\n defaultMinWidth?: number;\n defaultMaxWidth?: number;\n defaultFlex?: number;\n};\n\nexport function applyWidthToColumns(\n columns: RuntimeColumnDescriptor[],\n options:\n | {\n columnLayout: \"Static\";\n defaultMinWidth?: number;\n defaultMaxWidth?: number;\n defaultWidth?: number;\n }\n | {\n columnLayout: \"Fit\";\n availableWidth?: number;\n defaultMinWidth?: number;\n defaultMaxWidth?: number;\n defaultWidth?: number;\n }\n): RuntimeColumnDescriptor[];\n\nexport function applyWidthToColumns(\n columns: RuntimeColumnDescriptor[],\n options: columnOptions & { defaultMinWidth?: number }\n): RuntimeColumnDescriptor[] {\n const {\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 } = options;\n\n if (columnLayout === \"Static\") {\n return columns.map((column) => {\n if (typeof column.width === \"number\") {\n return column;\n } else {\n return {\n ...column,\n width: defaultWidth,\n };\n }\n });\n } else if (columnLayout === \"Fit\") {\n const { totalMinWidth, totalMaxWidth, totalWidth, flexCount } =\n columns.reduce(\n (aggregated, column) => {\n const { totalMinWidth, totalMaxWidth, totalWidth, flexCount } =\n aggregated;\n const {\n minWidth = defaultMinWidth,\n maxWidth = defaultMaxWidth,\n width = defaultWidth,\n flex = 0,\n } = column;\n return {\n totalMinWidth: totalMinWidth + minWidth,\n totalMaxWidth: totalMaxWidth + maxWidth,\n totalWidth: totalWidth + width,\n flexCount: flexCount + flex,\n };\n },\n { totalMinWidth: 0, totalMaxWidth: 0, totalWidth: 0, flexCount: 0 }\n );\n\n if (totalMinWidth > availableWidth || totalMaxWidth < availableWidth) {\n return columns;\n } else if (totalWidth > availableWidth) {\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 } else if (totalWidth < availableWidth) {\n {\n const additionalWidth = availableWidth - totalWidth;\n const inFlexMode = flexCount > 0;\n let additionalWidthPerColumn =\n additionalWidth / (flexCount || columns.length);\n // let columnsNotYetReachedMaxWidth = columns.length;\n // let unassignedAdditionalWidth = 0;\n let newColumns = columns.map((column) => {\n const {\n maxWidth = defaultMaxWidth,\n width = defaultWidth,\n flex = 0,\n } = column;\n if (inFlexMode && flex === 0) {\n return column;\n }\n const adjustedWidth = width + additionalWidthPerColumn;\n if (adjustedWidth > maxWidth) {\n // columnsNotYetReachedMaxWidth -= 1;\n // unassignedAdditionalWidth += adjustedWidth - maxWidth;\n return { ...column, width: maxWidth };\n } else {\n return { ...column, width: adjustedWidth, canStretch: true };\n }\n });\n const unassignedAdditionalColumnWidth =\n additionalWidth - newColumns.reduce((sum, col) => sum + col.width, 0);\n const columnsNotYetAtMaxWidth = newColumns.filter(\n (col) => col.canStretch\n ).length;\n if (unassignedAdditionalColumnWidth > columnsNotYetAtMaxWidth) {\n additionalWidthPerColumn =\n unassignedAdditionalColumnWidth / columnsNotYetAtMaxWidth;\n newColumns = newColumns.map<RuntimeColumnDescriptor>((column) => {\n if (column.canStretch) {\n const adjustedWidth = Math.min(\n column.width + additionalWidthPerColumn\n );\n return { ...column, width: adjustedWidth };\n } else {\n return column;\n }\n });\n }\n return newColumns.map(({ canStretch, ...column }) => column);\n }\n }\n }\n return columns;\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"],"names":["groupColumn","heading","moveItem","totalMinWidth","totalMaxWidth","totalWidth","flexCount"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"column-utils.js","sources":["../src/column-utils.ts"],"sourcesContent":["import type {\n DataSourceRow,\n SchemaColumn,\n TableSchema,\n} from \"@vuu-ui/vuu-data-types\";\nimport type {\n VuuAggregation,\n VuuAggType,\n VuuColumnDataType,\n VuuDataRow,\n VuuGroupBy,\n VuuRowRecord,\n VuuSort,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport type {\n ColumnAlignment,\n ColumnDescriptor,\n ColumnType,\n ColumnTypeDescriptor,\n ColumnTypeFormatting,\n ColumnTypeRendering,\n ColumnTypeSimple,\n ColumnTypeWithValidationRules,\n DefaultColumnConfiguration,\n GroupColumnDescriptor,\n LookupRenderer,\n MappedValueTypeRenderer,\n PinLocation,\n RuntimeColumnDescriptor,\n TableHeading,\n TableHeadings,\n ValueListRenderer,\n DateTimeColumnDescriptor,\n TableCellRendererProps,\n} from \"@vuu-ui/vuu-table-types\";\nimport type { CSSProperties } from \"react\";\nimport { moveItem } from \"./array-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\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 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): ColumnTypeSimple => {\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 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 isDateTimeColumn = (\n column: ColumnDescriptor\n): column is DateTimeColumnDescriptor =>\n (isTypeDescriptor(column.type) ? column.type.name : column.type) ===\n \"date/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 = (name: string): ColumnDescriptor => ({\n name,\n});\n\n/**\n *\n */\nexport const isTypeDescriptor = (\n type?: ColumnType\n): type is ColumnTypeDescriptor =>\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 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?: ColumnType\n): type is ColumnTypeWithValidationRules =>\n isTypeDescriptor(type) &&\n isColumnTypeRenderer(type.renderer) &&\n Array.isArray(type.renderer.rules) &&\n type.renderer.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?: (RuntimeColumnDescriptor | 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 count: 8,\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 columns: RuntimeColumnDescriptor[],\n groupBy?: VuuGroupBy,\n confirmed = true\n): [GroupColumnDescriptor | null, RuntimeColumnDescriptor[]] {\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 (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 [[], []] as [RuntimeColumnDescriptor[], RuntimeColumnDescriptor[]]\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 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 groupCol = {\n name: \"group-col\",\n heading: [\"group-col\"],\n isGroup: true,\n columns: groupCols,\n groupConfirmed: confirmed,\n width: groupCols.map((c) => c.width).reduce((a, b) => a + b) + 100,\n } as GroupColumnDescriptor;\n\n return [groupCol, rest];\n }\n return [null, flattenColumnGroup(columns)];\n}\n\nexport const isGroupColumn = (\n column: RuntimeColumnDescriptor\n): column is GroupColumnDescriptor => column.isGroup === true;\n\nexport const isJsonAttribute = (value: unknown) =>\n typeof value === \"string\" && value.endsWith(\"+\");\n\nexport const isJsonGroup = (\n column: RuntimeColumnDescriptor,\n row: VuuDataRow,\n columnMap: ColumnMap\n) =>\n (column.type as ColumnTypeDescriptor)?.name === \"json\" &&\n isJsonAttribute(row[columnMap[column.name]]);\n\nexport const isJsonColumn = (column: RuntimeColumnDescriptor) =>\n (column.type as ColumnTypeDescriptor)?.name === \"json\";\n\nexport const sortPinnedColumns = (\n columns: RuntimeColumnDescriptor[]\n): RuntimeColumnDescriptor[] => {\n const leftPinnedColumns: RuntimeColumnDescriptor[] = [];\n const rightPinnedColumns: RuntimeColumnDescriptor[] = [];\n const restColumns: RuntimeColumnDescriptor[] = [];\n // 4 is the selectionEndSize, need to consider how we make this available\n let pinnedWidthLeft = 4;\n for (const column of columns) {\n // prettier-ignore\n switch(column.pin){\n case \"left\": {\n leftPinnedColumns.push({\n ...column,\n endPin: undefined,\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 endPin: true,\n });\n }\n\n const allColumns = leftPinnedColumns.length\n ? leftPinnedColumns.concat(restColumns)\n : restColumns;\n\n if (rightPinnedColumns.length) {\n const measuredRightPinnedColumns: RuntimeColumnDescriptor[] = [];\n let pinnedWidthRight = 0;\n for (const column of rightPinnedColumns) {\n measuredRightPinnedColumns.unshift({\n ...column,\n pinnedOffset: pinnedWidthRight,\n });\n pinnedWidthRight += column.width;\n }\n measuredRightPinnedColumns[0].endPin = true;\n return allColumns.concat(measuredRightPinnedColumns);\n } else {\n return allColumns;\n }\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 // the 4 is `selectionEndSize`, unfortunate if we need to be passed it from cell\n // need to think about how to make this available\n pinnedOffset = pin === \"left\" ? 0 : 4,\n width,\n}: RuntimeColumnDescriptor) =>\n pin === \"left\"\n ? ({\n left: pinnedOffset,\n width,\n \"--pin-width\": `${pinnedOffset + width - 3}px`,\n } as CSSProperties)\n : pin === \"right\"\n ? ({\n right: pinnedOffset,\n width,\n \"--pin-width\": `${pinnedOffset + width}px`,\n } as CSSProperties)\n : { width };\n\nexport const setAggregations = (\n aggregations: VuuAggregation[],\n column: RuntimeColumnDescriptor,\n aggType: VuuAggType\n) => {\n return aggregations\n .filter((agg) => agg.column !== column.name)\n .concat({ column: column.name, aggType });\n};\n\nexport const applyGroupByToColumns = (\n columns: RuntimeColumnDescriptor[],\n groupBy: VuuGroupBy,\n confirmed = true\n) => {\n if (groupBy.length) {\n const [groupColumn, nonGroupedColumns] = extractGroupColumn(\n columns,\n groupBy,\n confirmed\n );\n if (groupColumn) {\n return [groupColumn as RuntimeColumnDescriptor].concat(nonGroupedColumns);\n }\n } else if (columns[0]?.isGroup) {\n return flattenColumnGroup(columns);\n }\n return 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 getRowRecord = (\n row: DataSourceRow,\n columnMap: ColumnMap\n): VuuRowRecord => {\n return Object.entries(columnMap).reduce<VuuRowRecord>(\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 (rightPinnedOnly) {\n if (column.pin === \"right\") {\n visibleColumns.push(column);\n }\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// Get the value for a specific columns within a grouped column\nexport const getGroupValueAndOffset = (\n columns: RuntimeColumnDescriptor[],\n row: DataSourceRow,\n columnMap: ColumnMap\n): [unknown, number] => {\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, depth === null ? 0 : Math.max(0, depth - 1)];\n } else if (depth === 0) {\n return [\"$root\", 0];\n } else {\n // offset 1 for now to allow for $root\n const { name, valueFormatter } = columns[depth - 1];\n const value = valueFormatter(row[columnMap[name]]);\n return [value, depth - 1];\n }\n};\n\nexport const getDefaultColumnType = (\n serverDataType?: VuuColumnDataType\n): ColumnTypeSimple => {\n switch (serverDataType) {\n case \"int\":\n case \"long\":\n case \"double\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\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: ColumnTypeSimple\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 *\n * return a filter predicate that will reject columns, names of which\n * are not in provided list.\n */\nexport const subscribedOnly =\n (columnNames?: string[]) => (column: ColumnDescriptor) =>\n columnNames?.includes(column.name);\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 // find the nearest preceding available column which is subscribed\n let index = -1;\n for (let i = indexOfAvailableColumn - 1; i >= 0; i--) {\n const { name } = availableColumns[i];\n index = subscribedColumns.findIndex(byColName(name));\n if (index !== -1) {\n break;\n }\n }\n\n if (index === -1) {\n return [newColumn].concat(subscribedColumns);\n } else {\n const results: ColumnDescriptor[] = [];\n for (let i = 0; i < subscribedColumns.length; i++) {\n results.push(subscribedColumns[i]);\n if (i === index) {\n results.push(newColumn);\n index = Number.MAX_SAFE_INTEGER;\n }\n }\n return results;\n }\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\nexport const applyDefaultColumnConfig = (\n { columns, table }: TableSchema,\n getDefaultColumnConfig?: DefaultColumnConfiguration\n) => {\n if (typeof getDefaultColumnConfig === \"function\") {\n return columns.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 const getColumnByName = (\n schema: TableSchema,\n name?: string\n): SchemaColumn | undefined => {\n if (name === undefined) {\n return undefined;\n } else {\n const column = schema.columns.find((col) => col.name === name);\n if (column) {\n return column;\n } else {\n throw Error(\n `getColumnByName no column '${name}' in schema for ${schema.table.table}`\n );\n }\n }\n};\n\n//New added column functionality issue #639\n\nexport type ColumnLayout = \"Static\" | \"Fit\";\n\nexport type columnOptions = {\n availableWidth?: number;\n columnLayout?: ColumnLayout;\n defaultWidth?: number;\n defaultMinWidth?: number;\n defaultMaxWidth?: number;\n defaultFlex?: number;\n};\n\nexport function applyWidthToColumns(\n columns: RuntimeColumnDescriptor[],\n options:\n | {\n columnLayout: \"Static\";\n defaultMinWidth?: number;\n defaultMaxWidth?: number;\n defaultWidth?: number;\n }\n | {\n columnLayout: \"Fit\";\n availableWidth?: number;\n defaultMinWidth?: number;\n defaultMaxWidth?: number;\n defaultWidth?: number;\n }\n): RuntimeColumnDescriptor[];\n\nexport function applyWidthToColumns(\n columns: RuntimeColumnDescriptor[],\n options: columnOptions & { defaultMinWidth?: number }\n): RuntimeColumnDescriptor[] {\n const {\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 } = options;\n\n if (columnLayout === \"Static\") {\n return columns.map((column) => {\n if (typeof column.width === \"number\") {\n return column;\n } else {\n return {\n ...column,\n width: defaultWidth,\n };\n }\n });\n } else if (columnLayout === \"Fit\") {\n const { totalMinWidth, totalMaxWidth, totalWidth, flexCount } =\n columns.reduce(\n (aggregated, column) => {\n const { totalMinWidth, totalMaxWidth, totalWidth, flexCount } =\n aggregated;\n const {\n minWidth = defaultMinWidth,\n maxWidth = defaultMaxWidth,\n width = defaultWidth,\n flex = 0,\n } = column;\n return {\n totalMinWidth: totalMinWidth + minWidth,\n totalMaxWidth: totalMaxWidth + maxWidth,\n totalWidth: totalWidth + width,\n flexCount: flexCount + flex,\n };\n },\n { totalMinWidth: 0, totalMaxWidth: 0, totalWidth: 0, flexCount: 0 }\n );\n\n if (totalMinWidth > availableWidth || totalMaxWidth < availableWidth) {\n return columns;\n } else if (totalWidth > availableWidth) {\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 } else if (totalWidth < availableWidth) {\n {\n const additionalWidth = availableWidth - totalWidth;\n const inFlexMode = flexCount > 0;\n let additionalWidthPerColumn =\n additionalWidth / (flexCount || columns.length);\n // let columnsNotYetReachedMaxWidth = columns.length;\n // let unassignedAdditionalWidth = 0;\n let newColumns = columns.map((column) => {\n const {\n maxWidth = defaultMaxWidth,\n width = defaultWidth,\n flex = 0,\n } = column;\n if (inFlexMode && flex === 0) {\n return column;\n }\n const adjustedWidth = width + additionalWidthPerColumn;\n if (adjustedWidth > maxWidth) {\n // columnsNotYetReachedMaxWidth -= 1;\n // unassignedAdditionalWidth += adjustedWidth - maxWidth;\n return { ...column, width: maxWidth };\n } else {\n return { ...column, width: adjustedWidth, canStretch: true };\n }\n });\n const unassignedAdditionalColumnWidth =\n additionalWidth - newColumns.reduce((sum, col) => sum + col.width, 0);\n const columnsNotYetAtMaxWidth = newColumns.filter(\n (col) => col.canStretch\n ).length;\n if (unassignedAdditionalColumnWidth > columnsNotYetAtMaxWidth) {\n additionalWidthPerColumn =\n unassignedAdditionalColumnWidth / columnsNotYetAtMaxWidth;\n newColumns = newColumns.map<RuntimeColumnDescriptor>((column) => {\n if (column.canStretch) {\n const adjustedWidth = Math.min(\n column.width + additionalWidthPerColumn\n );\n return { ...column, width: adjustedWidth };\n } else {\n return column;\n }\n });\n }\n return newColumns.map(({ canStretch, ...column }) => column);\n }\n }\n }\n return columns;\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"],"names":["groupColumn","heading","moveItem","totalMinWidth","totalMaxWidth","totalWidth","flexCount"],"mappings":"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"}
|
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
var columnUtils = require('./column-utils.js');
|
|
4
4
|
|
|
5
|
+
const containersSet = /* @__PURE__ */ new Set();
|
|
6
|
+
const viewsSet = /* @__PURE__ */ new Set();
|
|
7
|
+
const layoutComponentsMap = /* @__PURE__ */ new Map();
|
|
5
8
|
const cellRenderersMap = /* @__PURE__ */ new Map();
|
|
6
9
|
const columnHeaderRenderersMap = /* @__PURE__ */ new Map();
|
|
7
10
|
const configEditorsMap = /* @__PURE__ */ new Map();
|
|
@@ -18,25 +21,34 @@ const isTypeCompatible = (rendererType, serverDataType) => {
|
|
|
18
21
|
return rendererType === serverDataType;
|
|
19
22
|
}
|
|
20
23
|
};
|
|
24
|
+
const isContainer = (componentType) => containersSet.has(componentType);
|
|
25
|
+
const isView = (componentType) => viewsSet.has(componentType);
|
|
26
|
+
const isLayoutComponent = (componentType) => isContainer(componentType) || isView(componentType);
|
|
21
27
|
const isCellRenderer = (type, component) => component !== void 0 && type === "cell-renderer";
|
|
22
28
|
const isColumnHeaderContentRenderer = (type, component) => type === "column-header-content-renderer";
|
|
23
29
|
const isColumnHeaderLabelRenderer = (type, component) => type === "column-header-label-renderer";
|
|
24
30
|
const isCellConfigPanel = (type, component) => type === "cell-config-panel";
|
|
25
31
|
const isEditRuleValidator = (type, component) => type === "data-edit-validator";
|
|
26
32
|
const isRowClassGenerator = (type, component) => type === "row-class-generator";
|
|
27
|
-
function registerComponent(componentName, component,
|
|
28
|
-
if (
|
|
33
|
+
function registerComponent(componentName, component, componentType, options) {
|
|
34
|
+
if (componentType === "container" || componentType === "view" || componentType === "component") {
|
|
35
|
+
layoutComponentsMap.set(componentName, component);
|
|
36
|
+
if (componentType === "container") {
|
|
37
|
+
containersSet.add(componentName);
|
|
38
|
+
} else if (componentType === "view") {
|
|
39
|
+
viewsSet.add(componentName);
|
|
40
|
+
}
|
|
41
|
+
} else if (isCellRenderer(componentType, component)) {
|
|
29
42
|
cellRenderersMap.set(componentName, component);
|
|
30
|
-
} else if (isColumnHeaderContentRenderer(
|
|
43
|
+
} else if (isColumnHeaderContentRenderer(componentType)) {
|
|
31
44
|
columnHeaderRenderersMap.set(componentName, component);
|
|
32
|
-
} else if (isColumnHeaderLabelRenderer(
|
|
45
|
+
} else if (isColumnHeaderLabelRenderer(componentType)) {
|
|
33
46
|
columnHeaderRenderersMap.set(componentName, component);
|
|
34
|
-
} else if (isCellConfigPanel(
|
|
47
|
+
} else if (isCellConfigPanel(componentType)) {
|
|
35
48
|
cellConfigPanelsMap.set(componentName, component);
|
|
36
|
-
} else if (isEditRuleValidator(
|
|
49
|
+
} else if (isEditRuleValidator(componentType)) {
|
|
37
50
|
editRuleValidatorsMap.set(componentName, component);
|
|
38
|
-
} else if (isRowClassGenerator(
|
|
39
|
-
console.log(`register ${componentName}`);
|
|
51
|
+
} else if (isRowClassGenerator(componentType)) {
|
|
40
52
|
rowClassGeneratorsMap.set(componentName, component);
|
|
41
53
|
}
|
|
42
54
|
if (options) {
|
|
@@ -60,6 +72,16 @@ const getRegisteredCellRenderers = (serverDataType) => {
|
|
|
60
72
|
return allRenderers;
|
|
61
73
|
}
|
|
62
74
|
};
|
|
75
|
+
const getLayoutComponent = (componentName) => {
|
|
76
|
+
const layoutComponent = layoutComponentsMap.get(componentName);
|
|
77
|
+
if (layoutComponent) {
|
|
78
|
+
return layoutComponent;
|
|
79
|
+
} else {
|
|
80
|
+
throw Error(
|
|
81
|
+
`layout component ${componentName} not found in ComponentRegistry`
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
};
|
|
63
85
|
const getCellRendererOptions = (renderName) => optionsMap.get(renderName);
|
|
64
86
|
function getCellRenderer(column) {
|
|
65
87
|
return dataCellRenderer(column);
|
|
@@ -75,6 +97,15 @@ function getColumnHeaderLabelRenderer(column) {
|
|
|
75
97
|
}
|
|
76
98
|
}
|
|
77
99
|
const getRowClassNameGenerator = (generatorId) => rowClassGeneratorsMap.get(generatorId);
|
|
100
|
+
function getConfigurationEditor(configEditor = "") {
|
|
101
|
+
return configEditorsMap.get(configEditor);
|
|
102
|
+
}
|
|
103
|
+
function getCellConfigPanelRenderer(name) {
|
|
104
|
+
return cellConfigPanelsMap.get(name);
|
|
105
|
+
}
|
|
106
|
+
function getEditRuleValidator(name) {
|
|
107
|
+
return editRuleValidatorsMap.get(name);
|
|
108
|
+
}
|
|
78
109
|
function dataCellRenderer(column) {
|
|
79
110
|
if (columnUtils.isTypeDescriptor(column.type)) {
|
|
80
111
|
const { renderer } = column.type;
|
|
@@ -87,15 +118,6 @@ function dataCellRenderer(column) {
|
|
|
87
118
|
return cellRenderersMap.get("input-cell");
|
|
88
119
|
}
|
|
89
120
|
}
|
|
90
|
-
function getConfigurationEditor(configEditor = "") {
|
|
91
|
-
return configEditorsMap.get(configEditor);
|
|
92
|
-
}
|
|
93
|
-
function getCellConfigPanelRenderer(name) {
|
|
94
|
-
return cellConfigPanelsMap.get(name);
|
|
95
|
-
}
|
|
96
|
-
function getEditRuleValidator(name) {
|
|
97
|
-
return editRuleValidatorsMap.get(name);
|
|
98
|
-
}
|
|
99
121
|
|
|
100
122
|
exports.getCellConfigPanelRenderer = getCellConfigPanelRenderer;
|
|
101
123
|
exports.getCellRenderer = getCellRenderer;
|
|
@@ -104,8 +126,12 @@ exports.getColumnHeaderContentRenderer = getColumnHeaderContentRenderer;
|
|
|
104
126
|
exports.getColumnHeaderLabelRenderer = getColumnHeaderLabelRenderer;
|
|
105
127
|
exports.getConfigurationEditor = getConfigurationEditor;
|
|
106
128
|
exports.getEditRuleValidator = getEditRuleValidator;
|
|
129
|
+
exports.getLayoutComponent = getLayoutComponent;
|
|
107
130
|
exports.getRegisteredCellRenderers = getRegisteredCellRenderers;
|
|
108
131
|
exports.getRowClassNameGenerator = getRowClassNameGenerator;
|
|
132
|
+
exports.isContainer = isContainer;
|
|
133
|
+
exports.isLayoutComponent = isLayoutComponent;
|
|
134
|
+
exports.isView = isView;
|
|
109
135
|
exports.registerComponent = registerComponent;
|
|
110
136
|
exports.registerConfigurationEditor = registerConfigurationEditor;
|
|
111
137
|
//# sourceMappingURL=component-registry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component-registry.js","sources":["../src/component-registry.ts"],"sourcesContent":["import { DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport {\n VuuColumnDataType,\n VuuRowDataItemType,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport {\n ColumnDescriptor,\n ColumnDescriptorCustomRenderer,\n ColumnTypeRendering,\n EditValidationRule,\n HeaderCellProps,\n TableCellRendererProps,\n} from \"@vuu-ui/vuu-table-types\";\nimport { FunctionComponent as FC, HTMLAttributes } from \"react\";\nimport {\n ColumnMap,\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 cellRenderersMap = new Map<string, FC<TableCellRendererProps>>();\nconst columnHeaderRenderersMap = new Map<string, FC<HeaderCellProps>>();\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 EditRuleValidator = (\n editRule: EditValidationRule,\n value?: VuuRowDataItemType\n) => boolean | string;\n\nexport type ComponentType =\n | \"cell-renderer\"\n | \"cell-config-panel\"\n | \"column-header-content-renderer\"\n | \"column-header-label-renderer\"\n | \"data-edit-validator\"\n | \"row-class-generator\";\n\ntype CellRendererOptions = {\n // [key: string]: unknown;\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\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<HeaderCellProps> =>\n type === \"column-header-content-renderer\";\nconst isColumnHeaderLabelRenderer = (\n type: ComponentType,\n component: unknown\n): component is FC<HeaderCellProps> => 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 T extends\n | CellConfigPanelProps\n | EditRuleValidator\n | HeaderCellProps\n | RowClassGenerator\n | TableCellRendererProps = TableCellRendererProps\n>(\n componentName: string,\n component: T extends EditRuleValidator | RowClassGenerator ? T : FC<T>,\n type: ComponentType = \"cell-renderer\",\n options: CellRendererOptions\n): void {\n if (isCellRenderer(type, component)) {\n cellRenderersMap.set(componentName, component);\n } else if (isColumnHeaderContentRenderer(type, component)) {\n columnHeaderRenderersMap.set(componentName, component);\n } else if (isColumnHeaderLabelRenderer(type, component)) {\n columnHeaderRenderersMap.set(componentName, component);\n } else if (isCellConfigPanel(type, component)) {\n cellConfigPanelsMap.set(componentName, component);\n } else if (isEditRuleValidator(type, component)) {\n editRuleValidatorsMap.set(componentName, component);\n } else if (isRowClassGenerator(type, component)) {\n console.log(`register ${componentName}`);\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 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\nfunction dataCellRenderer(column: ColumnDescriptor) {\n if (isTypeDescriptor(column.type)) {\n const { renderer } = column.type;\n if (isColumnTypeRenderer(renderer)) {\n return cellRenderersMap.get(renderer.name);\n }\n } else if (column.serverDataType === \"boolean\") {\n return cellRenderersMap.get(\"checkbox-cell\");\n } else if (column.editable) {\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 }\n}\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"],"names":["isTypeDescriptor","isColumnTypeRenderer"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"component-registry.js","sources":["../src/component-registry.ts"],"sourcesContent":["import { DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport {\n VuuColumnDataType,\n VuuRowDataItemType,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport {\n ColumnDescriptor,\n ColumnDescriptorCustomRenderer,\n ColumnTypeRendering,\n EditValidationRule,\n HeaderCellProps,\n TableCellRendererProps,\n} from \"@vuu-ui/vuu-table-types\";\nimport { FunctionComponent as FC, HTMLAttributes } from \"react\";\nimport {\n ColumnMap,\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<string, FC<HeaderCellProps>>();\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 EditRuleValidator = (\n editRule: EditValidationRule,\n value?: VuuRowDataItemType\n) => boolean | string;\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\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\nexport const isContainer = (componentType: string) =>\n containersSet.has(componentType);\nexport const isView = (componentType: string) => viewsSet.has(componentType);\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<HeaderCellProps> =>\n type === \"column-header-content-renderer\";\nconst isColumnHeaderLabelRenderer = (\n type: ComponentType,\n component: unknown\n): component is FC<HeaderCellProps> => 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 (isTypeDescriptor(column.type)) {\n const { renderer } = column.type;\n if (isColumnTypeRenderer(renderer)) {\n return cellRenderersMap.get(renderer.name);\n }\n } else if (column.serverDataType === \"boolean\") {\n return cellRenderersMap.get(\"checkbox-cell\");\n } else if (column.editable) {\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 }\n}\n"],"names":["isTypeDescriptor","isColumnTypeRenderer"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date-utils.js","sources":["../../src/date/date-utils.ts"],"sourcesContent":["import { CalendarDate } from \"@internationalized/date\";\n\nexport function toCalendarDate(d: Date) {\n return new CalendarDate(d.getFullYear(), d.getMonth() + 1, d.getDate());\n}\n"],"names":["CalendarDate"],"mappings":";;;;AAEO,SAAS,eAAe,CAAS,EAAA;AACtC,EAAO,OAAA,IAAIA,iBAAa,CAAA,CAAA,CAAE,WAAY,EAAA,EAAG,CAAE,CAAA,QAAA,EAAa,GAAA,CAAA,EAAG,CAAE,CAAA,OAAA,EAAS,CAAA,CAAA;AACxE;;;;"}
|
package/cjs/date/types.js
CHANGED
|
@@ -14,10 +14,14 @@ const supportedDateTimePatterns = {
|
|
|
14
14
|
date: supportedDatePatterns,
|
|
15
15
|
time: supportedTimePatterns
|
|
16
16
|
};
|
|
17
|
+
const dateTimeLabelByType = { date: "Date", time: "Time" };
|
|
17
18
|
const isDatePattern = (pattern) => supportedDatePatterns.includes(pattern);
|
|
18
19
|
const isTimePattern = (pattern) => supportedTimePatterns.includes(pattern);
|
|
19
20
|
const isDateTimePattern = (pattern) => isDatePattern(pattern?.date) || isTimePattern(pattern?.time);
|
|
20
21
|
|
|
22
|
+
exports.dateTimeLabelByType = dateTimeLabelByType;
|
|
23
|
+
exports.isDatePattern = isDatePattern;
|
|
21
24
|
exports.isDateTimePattern = isDateTimePattern;
|
|
25
|
+
exports.isTimePattern = isTimePattern;
|
|
22
26
|
exports.supportedDateTimePatterns = supportedDateTimePatterns;
|
|
23
27
|
//# sourceMappingURL=types.js.map
|
package/cjs/date/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sources":["../../src/date/types.ts"],"sourcesContent":["import { ColumnTypeFormatting } from \"@vuu-ui/vuu-table-types\";\n\nconst supportedDatePatterns = [\n \"dd.mm.yyyy\",\n \"dd/mm/yyyy\",\n \"dd MMM yyyy\",\n \"dd MMMM yyyy\",\n \"mm/dd/yyyy\",\n \"MMM dd, yyyy\",\n \"MMMM dd, yyyy\",\n] as const;\n\nconst supportedTimePatterns = [\"hh:mm:ss\", \"hh:mm:ss a\"] as const;\n\nexport const supportedDateTimePatterns = {\n date: supportedDatePatterns,\n time: supportedTimePatterns,\n};\n\nexport type DatePattern = (typeof supportedDatePatterns)[number];\nexport type TimePattern = (typeof supportedTimePatterns)[number];\n\nexport type DateTimePattern =\n | { date?: DatePattern; time: TimePattern }\n | { date: DatePattern; time?: TimePattern };\n\
|
|
1
|
+
{"version":3,"file":"types.js","sources":["../../src/date/types.ts"],"sourcesContent":["import { ColumnTypeFormatting } from \"@vuu-ui/vuu-table-types\";\n\nconst supportedDatePatterns = [\n \"dd.mm.yyyy\",\n \"dd/mm/yyyy\",\n \"dd MMM yyyy\",\n \"dd MMMM yyyy\",\n \"mm/dd/yyyy\",\n \"MMM dd, yyyy\",\n \"MMMM dd, yyyy\",\n] as const;\n\nconst supportedTimePatterns = [\"hh:mm:ss\", \"hh:mm:ss a\"] as const;\n\nexport const supportedDateTimePatterns = {\n date: supportedDatePatterns,\n time: supportedTimePatterns,\n};\nexport const dateTimeLabelByType = { date: \"Date\", time: \"Time\" } as const;\n\nexport type DatePattern = (typeof supportedDatePatterns)[number];\nexport type TimePattern = (typeof supportedTimePatterns)[number];\n\nexport type DateTimePattern =\n | { date?: DatePattern; time: TimePattern }\n | { date: DatePattern; time?: TimePattern };\n\nexport const isDatePattern = (pattern?: string): pattern is DatePattern =>\n supportedDatePatterns.includes(pattern as DatePattern);\n\nexport const isTimePattern = (pattern?: string): pattern is TimePattern =>\n supportedTimePatterns.includes(pattern as TimePattern);\n\nexport const isDateTimePattern = (\n pattern?: ColumnTypeFormatting[\"pattern\"]\n): pattern is DateTimePattern =>\n isDatePattern(pattern?.date) || isTimePattern(pattern?.time);\n"],"names":[],"mappings":";;AAEA,MAAM,qBAAwB,GAAA;AAAA,EAC5B,YAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,YAAA;AAAA,EACA,cAAA;AAAA,EACA,eAAA;AACF,CAAA,CAAA;AAEA,MAAM,qBAAA,GAAwB,CAAC,UAAA,EAAY,YAAY,CAAA,CAAA;AAEhD,MAAM,yBAA4B,GAAA;AAAA,EACvC,IAAM,EAAA,qBAAA;AAAA,EACN,IAAM,EAAA,qBAAA;AACR,EAAA;AACO,MAAM,mBAAsB,GAAA,EAAE,IAAM,EAAA,MAAA,EAAQ,MAAM,MAAO,GAAA;AASzD,MAAM,aAAgB,GAAA,CAAC,OAC5B,KAAA,qBAAA,CAAsB,SAAS,OAAsB,EAAA;AAEhD,MAAM,aAAgB,GAAA,CAAC,OAC5B,KAAA,qBAAA,CAAsB,SAAS,OAAsB,EAAA;AAE1C,MAAA,iBAAA,GAAoB,CAC/B,OAEA,KAAA,aAAA,CAAc,SAAS,IAAI,CAAA,IAAK,aAAc,CAAA,OAAA,EAAS,IAAI;;;;;;;;"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const getFieldName = (input) => {
|
|
4
|
+
const saltFormField = input.closest(".saltFormField");
|
|
5
|
+
if (saltFormField && saltFormField.dataset.field) {
|
|
6
|
+
const {
|
|
7
|
+
dataset: { field }
|
|
8
|
+
} = saltFormField;
|
|
9
|
+
return field;
|
|
10
|
+
} else {
|
|
11
|
+
throw Error("named form field not found");
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
exports.getFieldName = getFieldName;
|
|
16
|
+
//# sourceMappingURL=form-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form-utils.js","sources":["../src/form-utils.ts"],"sourcesContent":["/**\n * Use with the following convention:\n *\n * <FormField data-field=\"my-field-name\">\n */\nexport const getFieldName = (\n input: HTMLInputElement | HTMLButtonElement\n): string => {\n const saltFormField = input.closest(\".saltFormField\") as HTMLElement;\n if (saltFormField && saltFormField.dataset.field) {\n const {\n dataset: { field },\n } = saltFormField;\n return field;\n } else {\n throw Error(\"named form field not found\");\n }\n};\n"],"names":[],"mappings":";;AAKa,MAAA,YAAA,GAAe,CAC1B,KACW,KAAA;AACX,EAAM,MAAA,aAAA,GAAgB,KAAM,CAAA,OAAA,CAAQ,gBAAgB,CAAA,CAAA;AACpD,EAAI,IAAA,aAAA,IAAiB,aAAc,CAAA,OAAA,CAAQ,KAAO,EAAA;AAChD,IAAM,MAAA;AAAA,MACJ,OAAA,EAAS,EAAE,KAAM,EAAA;AAAA,KACf,GAAA,aAAA,CAAA;AACJ,IAAO,OAAA,KAAA,CAAA;AAAA,GACF,MAAA;AACL,IAAA,MAAM,MAAM,4BAA4B,CAAA,CAAA;AAAA,GAC1C;AACF;;;;"}
|