@vuu-ui/vuu-utils 0.10.2 → 0.10.4-alpha-001

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.
@@ -113,21 +113,6 @@ function buildColumnMap(columns) {
113
113
  return EMPTY_COLUMN_MAP;
114
114
  }
115
115
  }
116
- function buildReverseColumnMap(columns) {
117
- const start = metadataKeys.count;
118
- if (columns) {
119
- return columns.reduce((map, column, i) => {
120
- if (typeof column === "string") {
121
- map[start + i] = column;
122
- } else {
123
- map[start + i] = column.name;
124
- }
125
- return map;
126
- }, {});
127
- } else {
128
- return EMPTY_COLUMN_MAP;
129
- }
130
- }
131
116
  function projectUpdates(updates) {
132
117
  const results = [];
133
118
  const metadataOffset = metadataKeys.count - 2;
@@ -826,7 +811,6 @@ exports.applyRuntimeColumnWidthsToConfig = applyRuntimeColumnWidthsToConfig;
826
811
  exports.applySortToColumns = applySortToColumns;
827
812
  exports.applyWidthToColumns = applyWidthToColumns;
828
813
  exports.buildColumnMap = buildColumnMap;
829
- exports.buildReverseColumnMap = buildReverseColumnMap;
830
814
  exports.checkConfirmationPending = checkConfirmationPending;
831
815
  exports.dataAndColumnUnchanged = dataAndColumnUnchanged;
832
816
  exports.dataColumnAndKeyUnchanged = dataColumnAndKeyUnchanged;
@@ -1 +1 @@
1
- {"version":3,"file":"column-utils.js","sources":["../src/column-utils.ts"],"sourcesContent":["import type {\n DataSourceRow,\n DataValueType,\n DataValueTypeSimple,\n DateTimeDataValueDescriptor,\n SchemaColumn,\n TableSchema,\n} from \"@vuu-ui/vuu-data-types\";\nimport type {\n VuuAggType,\n VuuAggregation,\n VuuColumnDataType,\n VuuDataRow,\n VuuGroupBy,\n VuuRowRecord,\n VuuSort,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport type {\n ColumnAlignment,\n ColumnDescriptor,\n ColumnLayout,\n DataValueTypeDescriptor,\n ColumnTypeFormatting,\n ColumnTypeRendering,\n ColumnTypeWithValidationRules,\n DefaultColumnConfiguration,\n GroupColumnDescriptor,\n LookupRenderer,\n MappedValueTypeRenderer,\n PinLocation,\n RuntimeColumnDescriptor,\n TableCellRendererProps,\n TableConfig,\n TableHeading,\n TableHeadings,\n ValueListRenderer,\n} from \"@vuu-ui/vuu-table-types\";\nimport { type CSSProperties } from \"react\";\nimport { moveItem } from \"./array-utils\";\nimport { TableModel } from \"@vuu-ui/vuu-table\";\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}\nexport interface ReverseColumnMap {\n [columnIndex: number]: string;\n}\n\nconst SORT_ASC = \"asc\";\nconst NO_HEADINGS: TableHeadings = [];\nconst DEFAULT_COL_WIDTH = 100;\nconst DEFAULT_MAX_WIDTH = 250;\nconst DEFAULT_MIN_WIDTH = 50;\n// const DEFAULT_FLEX = 0;\n\nexport type SortCriteriaItem = string | [string, \"asc\"]; // TODO where is 'desc'?\n\nexport const AggregationType: { [key: string]: VuuAggType } = {\n Average: 2,\n Count: 3,\n Distinct: 6,\n Sum: 1,\n High: 4,\n Low: 5,\n};\n\nexport function mapSortCriteria(\n sortCriteria: SortCriteriaItem[],\n columnMap: ColumnMap,\n metadataOffset = 0,\n): [number, \"asc\"][] {\n return sortCriteria.map((s) => {\n if (typeof s === \"string\") {\n return [columnMap[s] + metadataOffset, \"asc\"];\n } else if (Array.isArray(s)) {\n const [columnName, sortDir] = s;\n return [columnMap[columnName] + metadataOffset, sortDir || SORT_ASC];\n } else {\n throw Error(\"columnUtils.mapSortCriteria invalid input\");\n }\n });\n}\n\nconst numericTypes = [\"int\", \"long\", \"double\"];\nexport const getDefaultAlignment = (\n serverDataType?: VuuColumnDataType,\n): ColumnAlignment =>\n serverDataType === undefined\n ? \"left\"\n : numericTypes.includes(serverDataType)\n ? \"right\"\n : \"left\";\n\nexport const getRuntimeColumnWidth = (\n col: ColumnDescriptor,\n runtimeColumns: RuntimeColumnDescriptor[],\n) => {\n const runtimeColumn = runtimeColumns.find(({ name }) => name === col.name);\n if (runtimeColumn) {\n return runtimeColumn.width;\n } else {\n return DEFAULT_COL_WIDTH;\n }\n};\n\n// Save the current runtime column widths into the table column config. We do this\n// when user has manually resized a column under a fit layout. From this point,\n// layout becomes manual - there will be no further automatic column sizing.\nexport const applyRuntimeColumnWidthsToConfig = (\n tableConfig: TableConfig,\n columns: RuntimeColumnDescriptor[],\n): TableConfig => {\n return {\n ...tableConfig,\n columns: columns.map((column) => ({\n ...column,\n width: column.width ?? getRuntimeColumnWidth(column, columns),\n })),\n columnLayout: \"manual\",\n };\n};\n\nexport const isValidColumnAlignment = (v: string): v is ColumnAlignment =>\n v === \"left\" || v === \"right\";\n\nexport const isValidPinLocation = (v: string): v is PinLocation =>\n isValidColumnAlignment(v) || v === \"floating\" || v === \"\";\n\nexport type CalculatedColumn = {\n name: string;\n expression: string;\n serverDataType: VuuColumnDataType;\n};\n\nconst VUU_COLUMN_DATA_TYPES: (string | undefined | null)[] = [\n \"long\",\n \"double\",\n \"int\",\n \"string\",\n \"char\",\n \"boolean\",\n];\n\nexport const isVuuColumnDataType = (\n value: string | undefined | null,\n): value is VuuColumnDataType => VUU_COLUMN_DATA_TYPES.includes(value);\n\nexport const fromServerDataType = (\n serverDataType: VuuColumnDataType,\n): DataValueTypeSimple => {\n switch (serverDataType) {\n case \"double\":\n case \"int\":\n case \"long\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n default:\n return \"string\";\n }\n};\n\nexport const 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 isDateTimeDataValue = (\n column: ColumnDescriptor,\n): column is DateTimeDataValueDescriptor =>\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?: DataValueType,\n): type is DataValueTypeDescriptor =>\n typeof type !== \"undefined\" && typeof type !== \"string\";\n\nconst EMPTY_COLUMN_MAP = {} as const;\n\nexport const isColumnTypeRenderer = (\n renderer?: unknown,\n): renderer is ColumnTypeRendering =>\n typeof (renderer as ColumnTypeRendering)?.name !== \"undefined\";\n\nexport const hasCustomRenderer = (\n type?: DataValueType,\n): type is DataValueTypeDescriptor =>\n isTypeDescriptor(type) && isColumnTypeRenderer(type.renderer);\n\nexport const isLookupRenderer = (\n renderer?: unknown,\n): renderer is LookupRenderer =>\n typeof (renderer as LookupRenderer)?.name !== \"undefined\" &&\n \"lookup\" in (renderer as LookupRenderer);\n\nexport const isValueListRenderer = (\n renderer?: unknown,\n): renderer is ValueListRenderer =>\n typeof (renderer as ValueListRenderer)?.name !== \"undefined\" &&\n Array.isArray((renderer as ValueListRenderer).values);\n\nexport const hasValidationRules = (\n type?: DataValueType,\n): type is ColumnTypeWithValidationRules =>\n isTypeDescriptor(type) && Array.isArray(type.rules) && type.rules.length > 0;\n\nexport const isMappedValueTypeRenderer = (\n renderer?: unknown,\n): renderer is MappedValueTypeRenderer =>\n renderer !== undefined &&\n typeof (renderer as MappedValueTypeRenderer)?.map !== \"undefined\";\n\nexport function buildColumnMap(\n columns?: (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 buildReverseColumnMap(\n columns?: (RuntimeColumnDescriptor | SchemaColumn | string)[],\n): ReverseColumnMap {\n const start = metadataKeys.count;\n if (columns) {\n return columns.reduce((map, column, i) => {\n if (typeof column === \"string\") {\n map[start + i] = column;\n } else {\n map[start + i] = column.name;\n }\n return map;\n }, {} as ReverseColumnMap);\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 availableWidth,\n columns,\n groupBy,\n confirmed = true,\n}: ColumnGroupProps): [\n GroupColumnDescriptor | null,\n RuntimeColumnDescriptor[],\n] {\n if (groupBy && groupBy.length > 0) {\n const flattenedColumns = flattenColumnGroup(columns);\n // Note: groupedColumns will be in column order, not groupBy order\n const [groupedColumns, rest] = flattenedColumns.reduce<\n [RuntimeColumnDescriptor[], RuntimeColumnDescriptor[]]\n >(\n (result, column, i) => {\n const [g, r] = result;\n if (groupBy.includes(column.name)) {\n g.push({\n ...column,\n originalIdx: i,\n });\n } else {\n r.push(column);\n }\n\n return result;\n },\n [[], []],\n );\n if (groupedColumns.length !== groupBy.length) {\n throw Error(\n `extractGroupColumn: no column definition found for all groupBy cols ${JSON.stringify(\n groupBy,\n )} `,\n );\n }\n\n const groupOnly = rest.length === 0;\n\n const groupCount = groupBy.length;\n const groupCols: RuntimeColumnDescriptor[] = groupBy.map((name, idx) => {\n // Keep the cols in same order defined on groupBy\n const column = groupedColumns.find(\n (col) => col.name === name,\n ) as RuntimeColumnDescriptor;\n return {\n ...column,\n groupLevel: groupCount - idx,\n };\n });\n\n const width = groupOnly\n ? availableWidth\n : Math.min(\n availableWidth,\n groupCols.map((c) => c.width).reduce((a, b) => a + b) + 100,\n );\n\n const groupCol = {\n ariaColIndex: 1,\n columns: groupCols,\n heading: [\"group-col\"],\n isGroup: true,\n groupConfirmed: confirmed,\n name: \"group-col\",\n width,\n } as GroupColumnDescriptor;\n\n const withAdjustedAriaIndex: RuntimeColumnDescriptor[] = [];\n let colIndex = 2;\n for (const column of rest) {\n withAdjustedAriaIndex.push({\n ...column,\n ariaColIndex: column.hidden ? -1 : colIndex,\n });\n if (!column.hidden) {\n colIndex += 1;\n }\n }\n\n return [groupCol, withAdjustedAriaIndex];\n }\n return [null, flattenColumnGroup(columns)];\n}\n\nexport const isGroupColumn = (\n column: RuntimeColumnDescriptor,\n): column is GroupColumnDescriptor => column.isGroup === true;\n\n/**\n * groupConfirmed is currently the only 'pending' attribute we use. A\n * value of true is only reset by a follow-up value of false. Intermediary\n * values of undefined are discounted.\n */\nexport const checkConfirmationPending = (previousConfig?: TableModel) => {\n if (previousConfig) {\n const [column] = previousConfig.columns;\n if (isGroupColumn(column)) {\n return column.groupConfirmed;\n }\n }\n};\n\nexport const isJsonAttribute = (value: unknown) =>\n typeof value === \"string\" && (value.endsWith(\"{\") || value.endsWith(\"[\"));\n\nexport const isJsonGroup = (\n column: RuntimeColumnDescriptor,\n row: VuuDataRow,\n columnMap: ColumnMap,\n) =>\n (column.type as DataValueTypeDescriptor)?.name === \"json\" &&\n isJsonAttribute(row[columnMap[column.name]]);\n\nexport const isJsonColumn = (column: RuntimeColumnDescriptor) =>\n (column.type as DataValueTypeDescriptor)?.name === \"json\";\n\nexport const sortPinnedColumns = (\n columns: RuntimeColumnDescriptor[],\n): 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 type ColumnGroupProps = {\n columns: RuntimeColumnDescriptor[];\n groupBy: VuuGroupBy;\n confirmed?: boolean;\n availableWidth: number;\n};\n\nexport const applyGroupByToColumns = (props: ColumnGroupProps) => {\n if (props.groupBy.length) {\n const [groupColumn, nonGroupedColumns] = extractGroupColumn(props);\n if (groupColumn) {\n return [groupColumn as RuntimeColumnDescriptor].concat(nonGroupedColumns);\n }\n } else if (props.columns[0]?.isGroup) {\n return flattenColumnGroup(props.columns);\n }\n return props.columns;\n};\n\nexport const applySortToColumns = (\n columns: RuntimeColumnDescriptor[],\n sort: VuuSort,\n) =>\n columns.map((column) => {\n const sorted = getSortType(column, sort);\n if (sorted !== undefined) {\n return {\n ...column,\n sorted,\n };\n } else if (column.sorted) {\n return {\n ...column,\n sorted: undefined,\n };\n } else {\n return column;\n }\n });\n\nexport const removeSort = (columns: RuntimeColumnDescriptor[]) =>\n columns.map((col) => (col.sorted ? { ...col, sorted: undefined } : col));\n\nexport const existingSort = (columns: RuntimeColumnDescriptor[]) =>\n columns.some((col) => col.sorted);\n\nconst getSortType = (column: ColumnDescriptor, { sortDefs }: VuuSort) => {\n const sortDef = sortDefs.find((sortCol) => sortCol.column === column.name);\n if (sortDef) {\n return sortDefs.length > 1\n ? (sortDefs.indexOf(sortDef) + 1) * (sortDef.sortType === \"A\" ? 1 : -1)\n : sortDef.sortType;\n }\n};\n\n// Calculated columns have the formal 'name:datatype:expression'\nexport const getColumnName = (name: string) => {\n const pos = name.indexOf(\":\");\n if (pos === -1) {\n return name;\n } else {\n return name.slice(0, pos);\n }\n};\n\nexport const getColumnLabel = (column: ColumnDescriptor) => {\n if (column.label) {\n return column.label;\n } else if (isCalculatedColumn(column.name)) {\n const { name } = getCalculatedColumnDetails(column);\n // calculated column name follows pattern: `name:serverDataType:expression`\n return name ?? column.name;\n } else {\n return column.name;\n }\n};\n\nexport const findColumn = (\n columns: RuntimeColumnDescriptor[],\n columnName: string,\n): RuntimeColumnDescriptor | undefined => {\n const column = columns.find((col) => col.name === columnName);\n if (column) {\n return column;\n } else {\n const groupColumn = columns.find(\n (col) => col.isGroup,\n ) as GroupColumnDescriptor;\n if (groupColumn) {\n return findColumn(groupColumn.columns, columnName);\n }\n }\n};\n\nexport function updateColumn<T extends ColumnDescriptor>(\n columns: T[],\n column: T,\n): T[];\nexport function updateColumn(\n columns: RuntimeColumnDescriptor[],\n column: string,\n options: Partial<ColumnDescriptor>,\n): RuntimeColumnDescriptor[];\nexport function updateColumn(\n columns: RuntimeColumnDescriptor[],\n column: string | RuntimeColumnDescriptor,\n options?: Partial<ColumnDescriptor>,\n) {\n const targetColumn =\n typeof column === \"string\"\n ? columns.find((col) => col.name === column)\n : column;\n if (targetColumn) {\n const replacementColumn = options\n ? { ...targetColumn, ...options }\n : targetColumn;\n return columns.map((col) =>\n col.name === replacementColumn.name ? replacementColumn : col,\n );\n } else {\n throw Error(\"column-utils.replaceColun, column not found\");\n }\n}\n\nexport const toDataSourceColumns = (column: ColumnDescriptor) => column.name;\n\nexport const 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\nexport const getGroupIcon = (\n columns: RuntimeColumnDescriptor[],\n row: DataSourceRow,\n): string | undefined => {\n const { [DEPTH]: depth, [IS_LEAF]: isLeaf } = row;\n // Depth can be greater tha group columns when we have just removed a column from groupby\n // but new data has not yet been received.\n if (isLeaf || depth > columns.length) {\n return undefined;\n } else if (depth === 0) {\n return undefined;\n } else {\n const { getIcon } = columns[depth - 1];\n return getIcon?.(row);\n }\n};\n\nexport const getGroupValue = (\n columns: RuntimeColumnDescriptor[],\n row: DataSourceRow,\n columnMap: ColumnMap,\n): string | null => {\n const { [DEPTH]: depth, [IS_LEAF]: isLeaf } = row;\n // Depth can be greater tha group columns when we have just removed a column from groupby\n // but new data has not yet been received.\n if (isLeaf || depth > columns.length) {\n return null;\n } else if (depth === 0) {\n return \"$root\";\n } else {\n // offset allows for $root\n const { name, valueFormatter } = columns[depth - 1];\n\n const value = valueFormatter(row[columnMap[name]]);\n return value;\n }\n};\n\nexport const getDefaultColumnType = (\n serverDataType?: VuuColumnDataType,\n): DataValueTypeSimple => {\n switch (serverDataType) {\n case \"int\":\n case \"long\":\n case \"double\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n default:\n return \"string\";\n }\n};\n\nexport const updateColumnFormatting = <\n T extends ColumnDescriptor = ColumnDescriptor,\n>(\n column: T,\n formatting: ColumnTypeFormatting,\n): T => {\n const { serverDataType, type = getDefaultColumnType(serverDataType) } =\n column;\n\n if (isTypeDescriptor(type)) {\n return { ...column, type: { ...type, formatting } };\n } else {\n return { ...column, type: { name: type, formatting } };\n }\n};\n\nexport function updateColumnType<T extends ColumnDescriptor = ColumnDescriptor>(\n column: T,\n type: DataValueTypeSimple,\n): T {\n return isTypeDescriptor(column.type)\n ? { ...column, type: { ...column.type, name: type } }\n : { ...column, type };\n}\n\nexport const updateColumnRenderProps = <\n T extends ColumnDescriptor = ColumnDescriptor,\n>(\n column: T,\n renderer: ColumnTypeRendering,\n): T => {\n const { serverDataType, type = getDefaultColumnType(serverDataType) } =\n column;\n\n if (isTypeDescriptor(type)) {\n return {\n ...column,\n type: {\n ...type,\n // TODO do we need to preserve any existing attributes from renderer ?\n renderer,\n },\n };\n } else {\n return { ...column, type: { name: type, renderer } };\n }\n};\n\nconst NO_TYPE_SETTINGS = {};\nexport const getTypeFormattingFromColumn = (\n column: ColumnDescriptor,\n): ColumnTypeFormatting => {\n if (isTypeDescriptor(column.type)) {\n return column.type.formatting ?? NO_TYPE_SETTINGS;\n } else {\n return NO_TYPE_SETTINGS;\n }\n};\n\n/**\n * Return a filter predicate that will reject columns, names of which\n * are not in provided list. Exception made for columns explicitly\n * configured as client columns.\n */\nexport const subscribedOnly =\n (columnNames?: string[]) => (column: ColumnDescriptor) =>\n column.source === \"client\" || columnNames?.includes(column.name);\n\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 type columnOptions = {\n availableWidth?: number;\n columnLayout?: ColumnLayout;\n defaultWidth?: number;\n defaultMinWidth?: number;\n defaultMaxWidth?: number;\n defaultFlex?: number;\n};\n\ntype ColumnLayoutOptions = Pick<\n columnOptions,\n \"defaultMinWidth\" | \"defaultMaxWidth\" | \"defaultWidth\"\n>;\n\ninterface StaticColumnLayoutOptions extends ColumnLayoutOptions {\n columnLayout: \"manual\" | \"static\";\n}\ninterface FitColumnLayoutOptions extends ColumnLayoutOptions {\n availableWidth?: number;\n columnLayout: \"fit\";\n}\n\ntype ColumnStats = {\n flexCount: number;\n totalMinWidth: number;\n totalMaxWidth: number;\n totalWidth: number;\n};\n\nconst measureColumns = (\n columns: RuntimeColumnDescriptor[],\n defaultMaxWidth: number,\n defaultMinWidth: number,\n) =>\n columns.reduce<ColumnStats>(\n (aggregated, column) => {\n if (column.hidden !== true) {\n aggregated.totalMinWidth += column.minWidth ?? defaultMinWidth;\n aggregated.totalMaxWidth += column.maxWidth ?? defaultMaxWidth;\n aggregated.totalWidth += column.width;\n aggregated.flexCount += column.flex ?? 0;\n }\n return aggregated;\n },\n { totalMinWidth: 0, totalMaxWidth: 0, totalWidth: 0, flexCount: 0 },\n );\n\nexport function applyWidthToColumns(\n columns: RuntimeColumnDescriptor[],\n options: StaticColumnLayoutOptions | FitColumnLayoutOptions,\n): RuntimeColumnDescriptor[];\n\nexport function applyWidthToColumns(\n columns: RuntimeColumnDescriptor[],\n {\n availableWidth = 0,\n columnLayout = \"static\",\n defaultWidth = DEFAULT_COL_WIDTH,\n defaultMinWidth = DEFAULT_MIN_WIDTH,\n defaultMaxWidth = DEFAULT_MAX_WIDTH,\n }: // defaultFlex = DEFAULT_FLEX,\n columnOptions,\n): RuntimeColumnDescriptor[] {\n if (columnLayout === \"fit\") {\n const { totalMinWidth, totalMaxWidth, totalWidth, flexCount } =\n measureColumns(columns, defaultMaxWidth, defaultMinWidth);\n\n if (totalMaxWidth < availableWidth) {\n return assignMaxWidthToAll(columns, defaultMaxWidth);\n } else if (totalMinWidth > availableWidth) {\n return columns;\n } else if (totalWidth > availableWidth) {\n return shrinkColumnsToFitAvailableSpace(\n columns,\n availableWidth,\n totalWidth,\n defaultMinWidth,\n defaultWidth,\n flexCount,\n );\n } else if (totalWidth < availableWidth) {\n return stretchColumnsToFillAvailableSpace(\n columns,\n availableWidth,\n totalWidth,\n defaultMaxWidth,\n defaultWidth,\n );\n }\n }\n return columns;\n}\n\nconst assignMaxWidthToAll = (\n columns: RuntimeColumnDescriptor[],\n defaultMaxWidth: number,\n) => {\n return columns.map((column) => {\n const { maxWidth = defaultMaxWidth } = column;\n if (column.width === maxWidth) {\n return column;\n } else {\n return {\n ...column,\n width: maxWidth,\n };\n }\n });\n};\n\nconst shrinkColumnsToFitAvailableSpace = (\n columns: RuntimeColumnDescriptor[],\n availableWidth: number,\n totalWidth: number,\n defaultMinWidth: number,\n defaultWidth: number,\n flexCount: number,\n) => {\n const excessWidth = totalWidth - availableWidth;\n const inFlexMode = flexCount > 0;\n let excessWidthPerColumn = excessWidth / (flexCount || columns.length);\n let columnsNotYetAtMinWidth = columns.length;\n let unassignedExcess = 0;\n let newColumns = columns.map<RuntimeColumnDescriptor>((column) => {\n const {\n minWidth = defaultMinWidth,\n width = defaultWidth,\n flex = 0,\n } = column;\n if (inFlexMode && flex === 0) {\n return column;\n }\n const adjustedWidth = width - excessWidthPerColumn;\n if (adjustedWidth < minWidth) {\n columnsNotYetAtMinWidth -= 1;\n unassignedExcess += minWidth - adjustedWidth;\n return { ...column, width: minWidth };\n } else {\n return { ...column, width: adjustedWidth };\n }\n });\n if (unassignedExcess === 0) {\n return newColumns;\n } else {\n excessWidthPerColumn = unassignedExcess / columnsNotYetAtMinWidth;\n newColumns = newColumns.map((column) => {\n const adjustedWidth = column.width - excessWidthPerColumn;\n if (column.width !== column.minWidth) {\n return { ...column, width: adjustedWidth };\n } else {\n return column;\n }\n });\n return newColumns;\n }\n};\n\nconst hasFlex = ({ flex }: ColumnDescriptor) => typeof flex === \"number\";\n\nconst stretchColumnsToFillAvailableSpace = (\n columns: RuntimeColumnDescriptor[],\n availableWidth: number,\n totalWidth: number,\n defaultMaxWidth: number,\n defaultWidth: number,\n) => {\n let freeSpaceToBeFilled = availableWidth - totalWidth;\n let adjustedColumns = columns;\n\n const canGrow = ({\n width = defaultWidth,\n maxWidth = defaultMaxWidth,\n }: ColumnDescriptor) => width < maxWidth;\n\n while (freeSpaceToBeFilled > 0) {\n const flexCols = adjustedColumns.filter(\n (col) => hasFlex(col) && canGrow(col),\n );\n const columnsNotYetAtMaxWidth =\n flexCols.length || adjustedColumns.filter(canGrow).length;\n\n // THis deos not take flex correctly into account\n const additionalWidthPerColumn = Math.ceil(\n freeSpaceToBeFilled / columnsNotYetAtMaxWidth,\n );\n adjustedColumns = columns.map((column) => {\n const {\n maxWidth = defaultMaxWidth,\n width = defaultWidth,\n flex = 0,\n } = column;\n if (flexCols.length > 0 && flex === 0) {\n return column;\n }\n\n // we rounded the additionalWidthPerColumn up, so make sure\n // we don't over-assign\n const adjustmentAmount = Math.min(\n additionalWidthPerColumn,\n freeSpaceToBeFilled,\n );\n const adjustedWidth = width + adjustmentAmount;\n if (adjustedWidth > maxWidth) {\n freeSpaceToBeFilled -= adjustedWidth - maxWidth;\n return { ...column, width: maxWidth };\n } else {\n freeSpaceToBeFilled -= adjustmentAmount;\n return { ...column, width: adjustedWidth };\n }\n });\n }\n return adjustedColumns;\n};\n\n/**\n * A memo compare function for cell renderers. Can be used to suppress\n * render where column and data are both unchanged. Avoids render\n * when row changes, where changes in row are unrelated to this cell.\n * Suitabnle only for readonly cell renderers. See below for editable\n * cell renderers.\n */\nexport const dataAndColumnUnchanged = (\n p: TableCellRendererProps,\n p1: TableCellRendererProps,\n) =>\n p.column === p1.column &&\n p.column.valueFormatter(p.row[p.columnMap[p.column.name]]) ===\n p1.column.valueFormatter(p1.row[p1.columnMap[p1.column.name]]);\n\n/**\n * A memo compare function for cell renderers. Can be used to suppress\n * render where column, row key and data are all unchanged. Avoids render\n * when row changes, where changes in row are unrelated to this cell.\n * Suitable for editable cells. Including key in compare is not strictly\n * necessary for rendering, but it is important in the event that user\n * edits data - ensures we never have a stale key.\n */\nexport const dataColumnAndKeyUnchanged = (\n p: TableCellRendererProps,\n p1: TableCellRendererProps,\n) =>\n p.column === p1.column &&\n p.row[KEY] === p1.row[KEY] &&\n p.column.valueFormatter(p.row[p.columnMap[p.column.name]]) ===\n p1.column.valueFormatter(p1.row[p1.columnMap[p1.column.name]]);\n\nexport const toColumnName = (column: ColumnDescriptor) => column.name;\nexport const isStringColumn = (column: ColumnDescriptor) =>\n column.serverDataType === \"string\";\n"],"names":["groupColumn","heading","moveItem"],"mappings":"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"}
1
+ {"version":3,"file":"column-utils.js","sources":["../src/column-utils.ts"],"sourcesContent":["import type {\n DataSourceRow,\n DataValueType,\n DataValueTypeSimple,\n DateTimeDataValueDescriptor,\n SchemaColumn,\n TableSchema,\n} from \"@vuu-ui/vuu-data-types\";\nimport type {\n VuuAggType,\n VuuAggregation,\n VuuColumnDataType,\n VuuDataRow,\n VuuGroupBy,\n VuuRowRecord,\n VuuSort,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport type {\n ColumnAlignment,\n ColumnDescriptor,\n ColumnLayout,\n DataValueTypeDescriptor,\n ColumnTypeFormatting,\n ColumnTypeRendering,\n ColumnTypeWithValidationRules,\n DefaultColumnConfiguration,\n GroupColumnDescriptor,\n LookupRenderer,\n MappedValueTypeRenderer,\n PinLocation,\n RuntimeColumnDescriptor,\n TableCellRendererProps,\n TableConfig,\n TableHeading,\n TableHeadings,\n ValueListRenderer,\n} from \"@vuu-ui/vuu-table-types\";\nimport { type CSSProperties } from \"react\";\nimport { moveItem } from \"./array-utils\";\nimport { TableModel } from \"@vuu-ui/vuu-table\";\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 getRuntimeColumnWidth = (\n col: ColumnDescriptor,\n runtimeColumns: RuntimeColumnDescriptor[],\n) => {\n const runtimeColumn = runtimeColumns.find(({ name }) => name === col.name);\n if (runtimeColumn) {\n return runtimeColumn.width;\n } else {\n return DEFAULT_COL_WIDTH;\n }\n};\n\n// Save the current runtime column widths into the table column config. We do this\n// when user has manually resized a column under a fit layout. From this point,\n// layout becomes manual - there will be no further automatic column sizing.\nexport const applyRuntimeColumnWidthsToConfig = (\n tableConfig: TableConfig,\n columns: RuntimeColumnDescriptor[],\n): TableConfig => {\n return {\n ...tableConfig,\n columns: columns.map((column) => ({\n ...column,\n width: column.width ?? getRuntimeColumnWidth(column, columns),\n })),\n columnLayout: \"manual\",\n };\n};\n\nexport const isValidColumnAlignment = (v: string): v is ColumnAlignment =>\n v === \"left\" || v === \"right\";\n\nexport const isValidPinLocation = (v: string): v is PinLocation =>\n isValidColumnAlignment(v) || v === \"floating\" || v === \"\";\n\nexport type CalculatedColumn = {\n name: string;\n expression: string;\n serverDataType: VuuColumnDataType;\n};\n\nconst VUU_COLUMN_DATA_TYPES: (string | undefined | null)[] = [\n \"long\",\n \"double\",\n \"int\",\n \"string\",\n \"char\",\n \"boolean\",\n];\n\nexport const isVuuColumnDataType = (\n value: string | undefined | null,\n): value is VuuColumnDataType => VUU_COLUMN_DATA_TYPES.includes(value);\n\nexport const fromServerDataType = (\n serverDataType: VuuColumnDataType,\n): DataValueTypeSimple => {\n switch (serverDataType) {\n case \"double\":\n case \"int\":\n case \"long\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n default:\n return \"string\";\n }\n};\n\nexport const 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 isDateTimeDataValue = (\n column: ColumnDescriptor,\n): column is DateTimeDataValueDescriptor =>\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?: DataValueType,\n): type is DataValueTypeDescriptor =>\n typeof type !== \"undefined\" && typeof type !== \"string\";\n\nconst EMPTY_COLUMN_MAP = {} as const;\n\nexport const isColumnTypeRenderer = (\n renderer?: unknown,\n): renderer is ColumnTypeRendering =>\n typeof (renderer as ColumnTypeRendering)?.name !== \"undefined\";\n\nexport const hasCustomRenderer = (\n type?: DataValueType,\n): type is DataValueTypeDescriptor =>\n isTypeDescriptor(type) && isColumnTypeRenderer(type.renderer);\n\nexport const isLookupRenderer = (\n renderer?: unknown,\n): renderer is LookupRenderer =>\n typeof (renderer as LookupRenderer)?.name !== \"undefined\" &&\n \"lookup\" in (renderer as LookupRenderer);\n\nexport const isValueListRenderer = (\n renderer?: unknown,\n): renderer is ValueListRenderer =>\n typeof (renderer as ValueListRenderer)?.name !== \"undefined\" &&\n Array.isArray((renderer as ValueListRenderer).values);\n\nexport const hasValidationRules = (\n type?: DataValueType,\n): type is ColumnTypeWithValidationRules =>\n isTypeDescriptor(type) && Array.isArray(type.rules) && type.rules.length > 0;\n\nexport const isMappedValueTypeRenderer = (\n renderer?: unknown,\n): renderer is MappedValueTypeRenderer =>\n renderer !== undefined &&\n typeof (renderer as MappedValueTypeRenderer)?.map !== \"undefined\";\n\nexport function buildColumnMap(\n columns?: (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 availableWidth,\n columns,\n groupBy,\n confirmed = true,\n}: ColumnGroupProps): [\n GroupColumnDescriptor | null,\n RuntimeColumnDescriptor[],\n] {\n if (groupBy && groupBy.length > 0) {\n const flattenedColumns = flattenColumnGroup(columns);\n // Note: groupedColumns will be in column order, not groupBy order\n const [groupedColumns, rest] = flattenedColumns.reduce<\n [RuntimeColumnDescriptor[], RuntimeColumnDescriptor[]]\n >(\n (result, column, i) => {\n const [g, r] = result;\n if (groupBy.includes(column.name)) {\n g.push({\n ...column,\n originalIdx: i,\n });\n } else {\n r.push(column);\n }\n\n return result;\n },\n [[], []],\n );\n if (groupedColumns.length !== groupBy.length) {\n throw Error(\n `extractGroupColumn: no column definition found for all groupBy cols ${JSON.stringify(\n groupBy,\n )} `,\n );\n }\n\n const groupOnly = rest.length === 0;\n\n const groupCount = groupBy.length;\n const groupCols: RuntimeColumnDescriptor[] = groupBy.map((name, idx) => {\n // Keep the cols in same order defined on groupBy\n const column = groupedColumns.find(\n (col) => col.name === name,\n ) as RuntimeColumnDescriptor;\n return {\n ...column,\n groupLevel: groupCount - idx,\n };\n });\n\n const width = groupOnly\n ? availableWidth\n : Math.min(\n availableWidth,\n groupCols.map((c) => c.width).reduce((a, b) => a + b) + 100,\n );\n\n const groupCol = {\n ariaColIndex: 1,\n columns: groupCols,\n heading: [\"group-col\"],\n isGroup: true,\n groupConfirmed: confirmed,\n name: \"group-col\",\n width,\n } as GroupColumnDescriptor;\n\n const withAdjustedAriaIndex: RuntimeColumnDescriptor[] = [];\n let colIndex = 2;\n for (const column of rest) {\n withAdjustedAriaIndex.push({\n ...column,\n ariaColIndex: column.hidden ? -1 : colIndex,\n });\n if (!column.hidden) {\n colIndex += 1;\n }\n }\n\n return [groupCol, withAdjustedAriaIndex];\n }\n return [null, flattenColumnGroup(columns)];\n}\n\nexport const isGroupColumn = (\n column: RuntimeColumnDescriptor,\n): column is GroupColumnDescriptor => column.isGroup === true;\n\n/**\n * groupConfirmed is currently the only 'pending' attribute we use. A\n * value of true is only reset by a follow-up value of false. Intermediary\n * values of undefined are discounted.\n */\nexport const checkConfirmationPending = (previousConfig?: TableModel) => {\n if (previousConfig) {\n const [column] = previousConfig.columns;\n if (isGroupColumn(column)) {\n return column.groupConfirmed;\n }\n }\n};\n\nexport const isJsonAttribute = (value: unknown) =>\n typeof value === \"string\" && (value.endsWith(\"{\") || value.endsWith(\"[\"));\n\nexport const isJsonGroup = (\n column: RuntimeColumnDescriptor,\n row: VuuDataRow,\n columnMap: ColumnMap,\n) =>\n (column.type as DataValueTypeDescriptor)?.name === \"json\" &&\n isJsonAttribute(row[columnMap[column.name]]);\n\nexport const isJsonColumn = (column: RuntimeColumnDescriptor) =>\n (column.type as DataValueTypeDescriptor)?.name === \"json\";\n\nexport const sortPinnedColumns = (\n columns: RuntimeColumnDescriptor[],\n): 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 type ColumnGroupProps = {\n columns: RuntimeColumnDescriptor[];\n groupBy: VuuGroupBy;\n confirmed?: boolean;\n availableWidth: number;\n};\n\nexport const applyGroupByToColumns = (props: ColumnGroupProps) => {\n if (props.groupBy.length) {\n const [groupColumn, nonGroupedColumns] = extractGroupColumn(props);\n if (groupColumn) {\n return [groupColumn as RuntimeColumnDescriptor].concat(nonGroupedColumns);\n }\n } else if (props.columns[0]?.isGroup) {\n return flattenColumnGroup(props.columns);\n }\n return props.columns;\n};\n\nexport const applySortToColumns = (\n columns: RuntimeColumnDescriptor[],\n sort: VuuSort,\n) =>\n columns.map((column) => {\n const sorted = getSortType(column, sort);\n if (sorted !== undefined) {\n return {\n ...column,\n sorted,\n };\n } else if (column.sorted) {\n return {\n ...column,\n sorted: undefined,\n };\n } else {\n return column;\n }\n });\n\nexport const removeSort = (columns: RuntimeColumnDescriptor[]) =>\n columns.map((col) => (col.sorted ? { ...col, sorted: undefined } : col));\n\nexport const existingSort = (columns: RuntimeColumnDescriptor[]) =>\n columns.some((col) => col.sorted);\n\nconst getSortType = (column: ColumnDescriptor, { sortDefs }: VuuSort) => {\n const sortDef = sortDefs.find((sortCol) => sortCol.column === column.name);\n if (sortDef) {\n return sortDefs.length > 1\n ? (sortDefs.indexOf(sortDef) + 1) * (sortDef.sortType === \"A\" ? 1 : -1)\n : sortDef.sortType;\n }\n};\n\n// Calculated columns have the formal 'name:datatype:expression'\nexport const getColumnName = (name: string) => {\n const pos = name.indexOf(\":\");\n if (pos === -1) {\n return name;\n } else {\n return name.slice(0, pos);\n }\n};\n\nexport const getColumnLabel = (column: ColumnDescriptor) => {\n if (column.label) {\n return column.label;\n } else if (isCalculatedColumn(column.name)) {\n const { name } = getCalculatedColumnDetails(column);\n // calculated column name follows pattern: `name:serverDataType:expression`\n return name ?? column.name;\n } else {\n return column.name;\n }\n};\n\nexport const findColumn = (\n columns: RuntimeColumnDescriptor[],\n columnName: string,\n): RuntimeColumnDescriptor | undefined => {\n const column = columns.find((col) => col.name === columnName);\n if (column) {\n return column;\n } else {\n const groupColumn = columns.find(\n (col) => col.isGroup,\n ) as GroupColumnDescriptor;\n if (groupColumn) {\n return findColumn(groupColumn.columns, columnName);\n }\n }\n};\n\nexport function updateColumn<T extends ColumnDescriptor>(\n columns: T[],\n column: T,\n): T[];\nexport function updateColumn(\n columns: RuntimeColumnDescriptor[],\n column: string,\n options: Partial<ColumnDescriptor>,\n): RuntimeColumnDescriptor[];\nexport function updateColumn(\n columns: RuntimeColumnDescriptor[],\n column: string | RuntimeColumnDescriptor,\n options?: Partial<ColumnDescriptor>,\n) {\n const targetColumn =\n typeof column === \"string\"\n ? columns.find((col) => col.name === column)\n : column;\n if (targetColumn) {\n const replacementColumn = options\n ? { ...targetColumn, ...options }\n : targetColumn;\n return columns.map((col) =>\n col.name === replacementColumn.name ? replacementColumn : col,\n );\n } else {\n throw Error(\"column-utils.replaceColun, column not found\");\n }\n}\n\nexport const toDataSourceColumns = (column: ColumnDescriptor) => column.name;\n\nexport const 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\nexport const getGroupIcon = (\n columns: RuntimeColumnDescriptor[],\n row: DataSourceRow,\n): string | undefined => {\n const { [DEPTH]: depth, [IS_LEAF]: isLeaf } = row;\n // Depth can be greater tha group columns when we have just removed a column from groupby\n // but new data has not yet been received.\n if (isLeaf || depth > columns.length) {\n return undefined;\n } else if (depth === 0) {\n return undefined;\n } else {\n const { getIcon } = columns[depth - 1];\n return getIcon?.(row);\n }\n};\n\nexport const getGroupValue = (\n columns: RuntimeColumnDescriptor[],\n row: DataSourceRow,\n columnMap: ColumnMap,\n): string | null => {\n const { [DEPTH]: depth, [IS_LEAF]: isLeaf } = row;\n // Depth can be greater tha group columns when we have just removed a column from groupby\n // but new data has not yet been received.\n if (isLeaf || depth > columns.length) {\n return null;\n } else if (depth === 0) {\n return \"$root\";\n } else {\n // offset allows for $root\n const { name, valueFormatter } = columns[depth - 1];\n\n const value = valueFormatter(row[columnMap[name]]);\n return value;\n }\n};\n\nexport const getDefaultColumnType = (\n serverDataType?: VuuColumnDataType,\n): DataValueTypeSimple => {\n switch (serverDataType) {\n case \"int\":\n case \"long\":\n case \"double\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n default:\n return \"string\";\n }\n};\n\nexport const updateColumnFormatting = <\n T extends ColumnDescriptor = ColumnDescriptor,\n>(\n column: T,\n formatting: ColumnTypeFormatting,\n): T => {\n const { serverDataType, type = getDefaultColumnType(serverDataType) } =\n column;\n\n if (isTypeDescriptor(type)) {\n return { ...column, type: { ...type, formatting } };\n } else {\n return { ...column, type: { name: type, formatting } };\n }\n};\n\nexport function updateColumnType<T extends ColumnDescriptor = ColumnDescriptor>(\n column: T,\n type: DataValueTypeSimple,\n): T {\n return isTypeDescriptor(column.type)\n ? { ...column, type: { ...column.type, name: type } }\n : { ...column, type };\n}\n\nexport const updateColumnRenderProps = <\n T extends ColumnDescriptor = ColumnDescriptor,\n>(\n column: T,\n renderer: ColumnTypeRendering,\n): T => {\n const { serverDataType, type = getDefaultColumnType(serverDataType) } =\n column;\n\n if (isTypeDescriptor(type)) {\n return {\n ...column,\n type: {\n ...type,\n // TODO do we need to preserve any existing attributes from renderer ?\n renderer,\n },\n };\n } else {\n return { ...column, type: { name: type, renderer } };\n }\n};\n\nconst NO_TYPE_SETTINGS = {};\nexport const getTypeFormattingFromColumn = (\n column: ColumnDescriptor,\n): ColumnTypeFormatting => {\n if (isTypeDescriptor(column.type)) {\n return column.type.formatting ?? NO_TYPE_SETTINGS;\n } else {\n return NO_TYPE_SETTINGS;\n }\n};\n\n/**\n * Return a filter predicate that will reject columns, names of which\n * are not in provided list. Exception made for columns explicitly\n * configured as client columns.\n */\nexport const subscribedOnly =\n (columnNames?: string[]) => (column: ColumnDescriptor) =>\n column.source === \"client\" || columnNames?.includes(column.name);\n\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 type columnOptions = {\n availableWidth?: number;\n columnLayout?: ColumnLayout;\n defaultWidth?: number;\n defaultMinWidth?: number;\n defaultMaxWidth?: number;\n defaultFlex?: number;\n};\n\ntype ColumnLayoutOptions = Pick<\n columnOptions,\n \"defaultMinWidth\" | \"defaultMaxWidth\" | \"defaultWidth\"\n>;\n\ninterface StaticColumnLayoutOptions extends ColumnLayoutOptions {\n columnLayout: \"manual\" | \"static\";\n}\ninterface FitColumnLayoutOptions extends ColumnLayoutOptions {\n availableWidth?: number;\n columnLayout: \"fit\";\n}\n\ntype ColumnStats = {\n flexCount: number;\n totalMinWidth: number;\n totalMaxWidth: number;\n totalWidth: number;\n};\n\nconst measureColumns = (\n columns: RuntimeColumnDescriptor[],\n defaultMaxWidth: number,\n defaultMinWidth: number,\n) =>\n columns.reduce<ColumnStats>(\n (aggregated, column) => {\n if (column.hidden !== true) {\n aggregated.totalMinWidth += column.minWidth ?? defaultMinWidth;\n aggregated.totalMaxWidth += column.maxWidth ?? defaultMaxWidth;\n aggregated.totalWidth += column.width;\n aggregated.flexCount += column.flex ?? 0;\n }\n return aggregated;\n },\n { totalMinWidth: 0, totalMaxWidth: 0, totalWidth: 0, flexCount: 0 },\n );\n\nexport function applyWidthToColumns(\n columns: RuntimeColumnDescriptor[],\n options: StaticColumnLayoutOptions | FitColumnLayoutOptions,\n): RuntimeColumnDescriptor[];\n\nexport function applyWidthToColumns(\n columns: RuntimeColumnDescriptor[],\n {\n availableWidth = 0,\n columnLayout = \"static\",\n defaultWidth = DEFAULT_COL_WIDTH,\n defaultMinWidth = DEFAULT_MIN_WIDTH,\n defaultMaxWidth = DEFAULT_MAX_WIDTH,\n }: // defaultFlex = DEFAULT_FLEX,\n columnOptions,\n): RuntimeColumnDescriptor[] {\n if (columnLayout === \"fit\") {\n const { totalMinWidth, totalMaxWidth, totalWidth, flexCount } =\n measureColumns(columns, defaultMaxWidth, defaultMinWidth);\n\n if (totalMaxWidth < availableWidth) {\n return assignMaxWidthToAll(columns, defaultMaxWidth);\n } else if (totalMinWidth > availableWidth) {\n return columns;\n } else if (totalWidth > availableWidth) {\n return shrinkColumnsToFitAvailableSpace(\n columns,\n availableWidth,\n totalWidth,\n defaultMinWidth,\n defaultWidth,\n flexCount,\n );\n } else if (totalWidth < availableWidth) {\n return stretchColumnsToFillAvailableSpace(\n columns,\n availableWidth,\n totalWidth,\n defaultMaxWidth,\n defaultWidth,\n );\n }\n }\n return columns;\n}\n\nconst assignMaxWidthToAll = (\n columns: RuntimeColumnDescriptor[],\n defaultMaxWidth: number,\n) => {\n return columns.map((column) => {\n const { maxWidth = defaultMaxWidth } = column;\n if (column.width === maxWidth) {\n return column;\n } else {\n return {\n ...column,\n width: maxWidth,\n };\n }\n });\n};\n\nconst shrinkColumnsToFitAvailableSpace = (\n columns: RuntimeColumnDescriptor[],\n availableWidth: number,\n totalWidth: number,\n defaultMinWidth: number,\n defaultWidth: number,\n flexCount: number,\n) => {\n const excessWidth = totalWidth - availableWidth;\n const inFlexMode = flexCount > 0;\n let excessWidthPerColumn = excessWidth / (flexCount || columns.length);\n let columnsNotYetAtMinWidth = columns.length;\n let unassignedExcess = 0;\n let newColumns = columns.map<RuntimeColumnDescriptor>((column) => {\n const {\n minWidth = defaultMinWidth,\n width = defaultWidth,\n flex = 0,\n } = column;\n if (inFlexMode && flex === 0) {\n return column;\n }\n const adjustedWidth = width - excessWidthPerColumn;\n if (adjustedWidth < minWidth) {\n columnsNotYetAtMinWidth -= 1;\n unassignedExcess += minWidth - adjustedWidth;\n return { ...column, width: minWidth };\n } else {\n return { ...column, width: adjustedWidth };\n }\n });\n if (unassignedExcess === 0) {\n return newColumns;\n } else {\n excessWidthPerColumn = unassignedExcess / columnsNotYetAtMinWidth;\n newColumns = newColumns.map((column) => {\n const adjustedWidth = column.width - excessWidthPerColumn;\n if (column.width !== column.minWidth) {\n return { ...column, width: adjustedWidth };\n } else {\n return column;\n }\n });\n return newColumns;\n }\n};\n\nconst hasFlex = ({ flex }: ColumnDescriptor) => typeof flex === \"number\";\n\nconst stretchColumnsToFillAvailableSpace = (\n columns: RuntimeColumnDescriptor[],\n availableWidth: number,\n totalWidth: number,\n defaultMaxWidth: number,\n defaultWidth: number,\n) => {\n let freeSpaceToBeFilled = availableWidth - totalWidth;\n let adjustedColumns = columns;\n\n const canGrow = ({\n width = defaultWidth,\n maxWidth = defaultMaxWidth,\n }: ColumnDescriptor) => width < maxWidth;\n\n while (freeSpaceToBeFilled > 0) {\n const flexCols = adjustedColumns.filter(\n (col) => hasFlex(col) && canGrow(col),\n );\n const columnsNotYetAtMaxWidth =\n flexCols.length || adjustedColumns.filter(canGrow).length;\n\n // THis deos not take flex correctly into account\n const additionalWidthPerColumn = Math.ceil(\n freeSpaceToBeFilled / columnsNotYetAtMaxWidth,\n );\n adjustedColumns = columns.map((column) => {\n const {\n maxWidth = defaultMaxWidth,\n width = defaultWidth,\n flex = 0,\n } = column;\n if (flexCols.length > 0 && flex === 0) {\n return column;\n }\n\n // we rounded the additionalWidthPerColumn up, so make sure\n // we don't over-assign\n const adjustmentAmount = Math.min(\n additionalWidthPerColumn,\n freeSpaceToBeFilled,\n );\n const adjustedWidth = width + adjustmentAmount;\n if (adjustedWidth > maxWidth) {\n freeSpaceToBeFilled -= adjustedWidth - maxWidth;\n return { ...column, width: maxWidth };\n } else {\n freeSpaceToBeFilled -= adjustmentAmount;\n return { ...column, width: adjustedWidth };\n }\n });\n }\n return adjustedColumns;\n};\n\n/**\n * A memo compare function for cell renderers. Can be used to suppress\n * render where column and data are both unchanged. Avoids render\n * when row changes, where changes in row are unrelated to this cell.\n * Suitabnle only for readonly cell renderers. See below for editable\n * cell renderers.\n */\nexport const dataAndColumnUnchanged = (\n p: TableCellRendererProps,\n p1: TableCellRendererProps,\n) =>\n p.column === p1.column &&\n p.column.valueFormatter(p.row[p.columnMap[p.column.name]]) ===\n p1.column.valueFormatter(p1.row[p1.columnMap[p1.column.name]]);\n\n/**\n * A memo compare function for cell renderers. Can be used to suppress\n * render where column, row key and data are all unchanged. Avoids render\n * when row changes, where changes in row are unrelated to this cell.\n * Suitable for editable cells. Including key in compare is not strictly\n * necessary for rendering, but it is important in the event that user\n * edits data - ensures we never have a stale key.\n */\nexport const dataColumnAndKeyUnchanged = (\n p: TableCellRendererProps,\n p1: TableCellRendererProps,\n) =>\n p.column === p1.column &&\n p.row[KEY] === p1.row[KEY] &&\n p.column.valueFormatter(p.row[p.columnMap[p.column.name]]) ===\n p1.column.valueFormatter(p1.row[p1.columnMap[p1.column.name]]);\n\nexport const toColumnName = (column: ColumnDescriptor) => column.name;\nexport const isStringColumn = (column: ColumnDescriptor) =>\n column.serverDataType === \"string\";\n"],"names":["groupColumn","heading","moveItem"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"DataSourceContext.js","sources":["../../src/context-definitions/DataSourceContext.tsx"],"sourcesContent":["import type {\n DataSource,\n DataSourceConstructorProps,\n ServerAPI,\n TableSchema,\n} from \"@vuu-ui/vuu-data-types\";\nimport { createContext } from \"react\";\n\nexport type DataSourceConstructor = {\n new (props: DataSourceConstructorProps): DataSource;\n};\n\nexport interface DataSourceContextProps {\n VuuDataSource: DataSourceConstructor;\n dataSourceExtensions?: unknown;\n isLocalData: boolean;\n getServerAPI: () => Promise<\n Pick<ServerAPI, \"getTableList\" | \"getTableSchema\" | \"rpcCall\">\n >;\n /**\n * A tableSchema would normally be requested via the serverAPI.\n * schemas can be injected, in which case these 'local' schemas\n * will be returned from the getTableSchema API call.\n * The key is formed from concatenation of module and tableName\n * from VuuTable e.g 'SIMUL:instruments'\n */\n tableSchemas?: Record<string, TableSchema>;\n vuuModuleNames?: string[];\n}\n\nconst getServerAPI = () => {\n throw Error(\"no DataSourceProvider has been installed\");\n};\n\nclass NullDataSource {\n constructor(_: DataSourceConstructorProps) {\n throw Error(\"no DataSourceProvider has been installed\");\n }\n}\n\nexport const DataSourceContext = createContext<DataSourceContextProps>({\n isLocalData: false,\n getServerAPI,\n VuuDataSource: NullDataSource as DataSourceConstructor,\n});\n"],"names":["createContext"],"mappings":";;;;AA8BA,MAAM,eAAe,MAAM;AACzB,EAAA,MAAM,MAAM,0CAA0C,CAAA;AACxD,CAAA;AAEA,MAAM,cAAe,CAAA;AAAA,EACnB,YAAY,CAA+B,EAAA;AACzC,IAAA,MAAM,MAAM,0CAA0C,CAAA;AAAA;AAE1D;AAEO,MAAM,oBAAoBA,mBAAsC,CAAA;AAAA,EACrE,WAAa,EAAA,KAAA;AAAA,EACb,YAAA;AAAA,EACA,aAAe,EAAA;AACjB,CAAC;;;;"}
1
+ {"version":3,"file":"DataSourceContext.js","sources":["../../src/context-definitions/DataSourceContext.tsx"],"sourcesContent":["import type {\n DataSource,\n DataSourceConstructorProps,\n ServerAPI,\n TableSchema,\n} from \"@vuu-ui/vuu-data-types\";\nimport { createContext } from \"react\";\n\nexport type DataSourceConstructor = {\n new (props: DataSourceConstructorProps): DataSource;\n};\n\nexport interface DataSourceContextProps {\n VuuDataSource: DataSourceConstructor;\n dataSourceExtensions?: unknown;\n isLocalData: boolean;\n getServerAPI: () => Promise<\n Pick<ServerAPI, \"getTableList\" | \"getTableSchema\" | \"rpcCall\">\n >;\n /**\n * A tableSchema would normally be requested via the serverAPI.\n * schemas can be injected, in which case these 'local' schemas\n * will be returned from the getTableSchema API call.\n * The key is formed from concatenation of module and tableName\n * from VuuTable e.g 'SIMUL:instruments'\n */\n tableSchemas?: Record<string, TableSchema>;\n}\n\nconst getServerAPI = () => {\n throw Error(\"no DataSourceProvider has been installed\");\n};\n\nclass NullDataSource {\n constructor(_: DataSourceConstructorProps) {\n throw Error(\"no DataSourceProvider has been installed\");\n }\n}\n\nexport const DataSourceContext = createContext<DataSourceContextProps>({\n isLocalData: false,\n getServerAPI,\n VuuDataSource: NullDataSource as DataSourceConstructor,\n});\n"],"names":["createContext"],"mappings":";;;;AA6BA,MAAM,eAAe,MAAM;AACzB,EAAA,MAAM,MAAM,0CAA0C,CAAA;AACxD,CAAA;AAEA,MAAM,cAAe,CAAA;AAAA,EACnB,YAAY,CAA+B,EAAA;AACzC,IAAA,MAAM,MAAM,0CAA0C,CAAA;AAAA;AAE1D;AAEO,MAAM,oBAAoBA,mBAAsC,CAAA;AAAA,EACrE,WAAa,EAAA,KAAA;AAAA,EACb,YAAA;AAAA,EACA,aAAe,EAAA;AACjB,CAAC;;;;"}
@@ -8,13 +8,12 @@ const DataSourceProvider = ({
8
8
  children,
9
9
  getServerAPI,
10
10
  isLocalData = true,
11
- VuuDataSource,
12
- vuuModuleNames
11
+ VuuDataSource
13
12
  }) => {
14
13
  return /* @__PURE__ */ jsxRuntime.jsx(
15
14
  DataSourceContext.DataSourceContext.Provider,
16
15
  {
17
- value: { isLocalData, vuuModuleNames, VuuDataSource, getServerAPI },
16
+ value: { isLocalData, VuuDataSource, getServerAPI },
18
17
  children
19
18
  }
20
19
  );
@@ -1 +1 @@
1
- {"version":3,"file":"DataSourceProvider.js","sources":["../../src/context-definitions/DataSourceProvider.tsx"],"sourcesContent":["import { ReactNode, useContext } from \"react\";\nimport { DataSourceContext, DataSourceContextProps } from \"./DataSourceContext\";\n\nexport const DataSourceProvider = ({\n children,\n getServerAPI,\n isLocalData = true,\n VuuDataSource,\n vuuModuleNames,\n}: Omit<DataSourceContextProps, \"isLocalData\"> & {\n children: ReactNode;\n isLocalData?: boolean;\n}) => {\n return (\n <DataSourceContext.Provider\n value={{ isLocalData, vuuModuleNames, VuuDataSource, getServerAPI }}\n >\n {children}\n </DataSourceContext.Provider>\n );\n};\n\nexport const useDataSource = () => useContext(DataSourceContext);\nexport const useDataSourceExtensions = () => {\n const { dataSourceExtensions } = useContext(DataSourceContext);\n return dataSourceExtensions;\n};\n"],"names":["jsx","DataSourceContext","useContext"],"mappings":";;;;;;AAGO,MAAM,qBAAqB,CAAC;AAAA,EACjC,QAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAc,GAAA,IAAA;AAAA,EACd,aAAA;AAAA,EACA;AACF,CAGM,KAAA;AACJ,EACE,uBAAAA,cAAA;AAAA,IAACC,mCAAkB,CAAA,QAAA;AAAA,IAAlB;AAAA,MACC,KAAO,EAAA,EAAE,WAAa,EAAA,cAAA,EAAgB,eAAe,YAAa,EAAA;AAAA,MAEjE;AAAA;AAAA,GACH;AAEJ;AAEa,MAAA,aAAA,GAAgB,MAAMC,gBAAA,CAAWD,mCAAiB;AACxD,MAAM,0BAA0B,MAAM;AAC3C,EAAA,MAAM,EAAE,oBAAA,EAAyB,GAAAC,gBAAA,CAAWD,mCAAiB,CAAA;AAC7D,EAAO,OAAA,oBAAA;AACT;;;;;;"}
1
+ {"version":3,"file":"DataSourceProvider.js","sources":["../../src/context-definitions/DataSourceProvider.tsx"],"sourcesContent":["import { ReactNode, useContext } from \"react\";\nimport { DataSourceContext, DataSourceContextProps } from \"./DataSourceContext\";\n\nexport const DataSourceProvider = ({\n children,\n getServerAPI,\n isLocalData = true,\n VuuDataSource,\n}: Omit<DataSourceContextProps, \"isLocalData\"> & {\n children: ReactNode;\n isLocalData?: boolean;\n}) => {\n return (\n <DataSourceContext.Provider\n value={{ isLocalData, VuuDataSource, getServerAPI }}\n >\n {children}\n </DataSourceContext.Provider>\n );\n};\n\nexport const useDataSource = () => useContext(DataSourceContext);\nexport const useDataSourceExtensions = () => {\n const { dataSourceExtensions } = useContext(DataSourceContext);\n return dataSourceExtensions;\n};\n"],"names":["jsx","DataSourceContext","useContext"],"mappings":";;;;;;AAGO,MAAM,qBAAqB,CAAC;AAAA,EACjC,QAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAc,GAAA,IAAA;AAAA,EACd;AACF,CAGM,KAAA;AACJ,EACE,uBAAAA,cAAA;AAAA,IAACC,mCAAkB,CAAA,QAAA;AAAA,IAAlB;AAAA,MACC,KAAO,EAAA,EAAE,WAAa,EAAA,aAAA,EAAe,YAAa,EAAA;AAAA,MAEjD;AAAA;AAAA,GACH;AAEJ;AAEa,MAAA,aAAA,GAAgB,MAAMC,gBAAA,CAAWD,mCAAiB;AACxD,MAAM,0BAA0B,MAAM;AAC3C,EAAA,MAAM,EAAE,oBAAA,EAAyB,GAAAC,gBAAA,CAAWD,mCAAiB,CAAA;AAC7D,EAAO,OAAA,oBAAA;AACT;;;;;;"}
@@ -6,8 +6,16 @@ var index = require('../nanoid/index.js');
6
6
  var datasourceUtils = require('./datasource-utils.js');
7
7
 
8
8
  var __defProp = Object.defineProperty;
9
+ var __typeError = (msg) => {
10
+ throw TypeError(msg);
11
+ };
9
12
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
10
13
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
14
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
15
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
16
+ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
17
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
18
+ var _pageCount;
11
19
  class BaseDataSource extends eventEmitter.EventEmitter {
12
20
  constructor({
13
21
  aggregations,
@@ -28,6 +36,7 @@ class BaseDataSource extends eventEmitter.EventEmitter {
28
36
  __publicField(this, "_range", { from: 0, to: 0 });
29
37
  __publicField(this, "_size", 0);
30
38
  __publicField(this, "_title");
39
+ __privateAdd(this, _pageCount, 0);
31
40
  __publicField(this, "awaitingConfirmationOfConfigChanges", false);
32
41
  this._config = {
33
42
  ...this._config,
@@ -116,7 +125,7 @@ class BaseDataSource extends eventEmitter.EventEmitter {
116
125
  this.emit("config", this._config, this.range, true);
117
126
  } else {
118
127
  throw Error(
119
- `BaseDataSOurce, unexpected call to confirmConfigChange, no changes pending`
128
+ `[BaseDataSource], unexpected call to confirmConfigChange, no changes pending`
120
129
  );
121
130
  }
122
131
  }
@@ -138,11 +147,23 @@ class BaseDataSource extends eventEmitter.EventEmitter {
138
147
  this.emit("config", this.config, this.range, false, configChanges);
139
148
  }
140
149
  }
150
+ get pageCount() {
151
+ return __privateGet(this, _pageCount);
152
+ }
153
+ set pageCount(pageCount) {
154
+ if (pageCount !== __privateGet(this, _pageCount)) {
155
+ __privateSet(this, _pageCount, pageCount);
156
+ this.emit("page-count", pageCount);
157
+ }
158
+ }
141
159
  get range() {
142
160
  return this._range;
143
161
  }
144
162
  set range(range) {
145
163
  if (range.from !== this._range.from || range.to !== this._range.to) {
164
+ console.log(
165
+ `[BaseDataSource] <set>range from (${this._range.from}:${this._range.to}) to (${range.from}:${range.to})`
166
+ );
146
167
  this._range = range;
147
168
  this.rangeRequest(range);
148
169
  }
@@ -150,6 +171,13 @@ class BaseDataSource extends eventEmitter.EventEmitter {
150
171
  get size() {
151
172
  return this._size;
152
173
  }
174
+ set size(size) {
175
+ this._size = size;
176
+ if (this.range.to !== 0) {
177
+ const pageCount = Math.ceil(size / (this.range.to - this.range.from));
178
+ this.pageCount = pageCount;
179
+ }
180
+ }
153
181
  get sort() {
154
182
  return this._config.sort;
155
183
  }
@@ -208,6 +236,7 @@ class BaseDataSource extends eventEmitter.EventEmitter {
208
236
  }
209
237
  }
210
238
  }
239
+ _pageCount = new WeakMap();
211
240
 
212
241
  exports.BaseDataSource = BaseDataSource;
213
242
  //# sourceMappingURL=BaseDataSource.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BaseDataSource.js","sources":["../../src/datasource/BaseDataSource.ts"],"sourcesContent":["import type {\n DataSource,\n DataSourceConfig,\n DataSourceConstructorProps,\n DataSourceEvents,\n DataSourceFilter,\n SubscribeCallback,\n SubscribeProps,\n WithBaseFilter,\n WithFullConfig,\n} from \"@vuu-ui/vuu-data-types\";\nimport { parseFilter } from \"@vuu-ui/vuu-filter-parser\";\nimport {\n LinkDescriptorWithLabel,\n VuuAggregation,\n VuuRange,\n VuuSort,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { EventEmitter } from \"../event-emitter\";\nimport { uuid } from \"../nanoid\";\nimport {\n DataSourceConfigChanges,\n isConfigChanged,\n vanillaConfig,\n withConfigDefaults,\n} from \"./datasource-utils\";\n\nexport type RuntimeConfig = WithBaseFilter<WithFullConfig> & {\n visualLink?: LinkDescriptorWithLabel;\n};\n\nexport abstract class BaseDataSource\n extends EventEmitter<DataSourceEvents>\n implements Pick<DataSource, \"config\">\n{\n // This should simply be id\n public viewport: string;\n\n protected _clientCallback: SubscribeCallback | undefined;\n protected _config: RuntimeConfig = vanillaConfig;\n protected _impendingConfig: RuntimeConfig | undefined = undefined;\n protected _range: VuuRange = { from: 0, to: 0 };\n protected _size = 0;\n protected _title: string | undefined;\n\n private awaitingConfirmationOfConfigChanges = false;\n\n constructor({\n aggregations,\n baseFilterSpec,\n columns,\n filterSpec,\n groupBy,\n sort,\n title,\n viewport,\n }: Omit<DataSourceConstructorProps, \"table\">) {\n super();\n this._config = {\n ...this._config,\n aggregations: aggregations || this._config.aggregations,\n baseFilterSpec: baseFilterSpec || this._config.baseFilterSpec,\n columns: columns || this._config.columns,\n filterSpec: filterSpec || this._config.filterSpec,\n groupBy: groupBy || this._config.groupBy,\n sort: sort || this._config.sort,\n };\n\n this._title = title;\n this.viewport = viewport ?? \"\";\n }\n\n subscribe(\n {\n baseFilterSpec,\n columns,\n aggregations,\n range,\n sort,\n groupBy,\n filterSpec,\n viewport = this.viewport || (this.viewport = uuid()),\n }: SubscribeProps,\n callback: SubscribeCallback,\n ) {\n this._clientCallback = callback;\n this.viewport = viewport;\n\n if (\n aggregations ||\n baseFilterSpec ||\n columns ||\n filterSpec ||\n groupBy ||\n sort\n ) {\n this._config = {\n ...this._config,\n aggregations: aggregations || this._config.aggregations,\n baseFilterSpec: baseFilterSpec || this._config.baseFilterSpec,\n columns: columns || this._config.columns,\n filterSpec: filterSpec || this._config.filterSpec,\n groupBy: groupBy || this._config.groupBy,\n sort: sort || this._config.sort,\n };\n }\n\n // store the range before we await the server. It's is possible the\n // range will be updated from the client before we have been able to\n // subscribe. This ensures we will subscribe with latest value.\n if (range) {\n this._range = range;\n }\n }\n\n get aggregations() {\n return this._config.aggregations;\n }\n\n set aggregations(aggregations: VuuAggregation[]) {\n this.config = {\n ...this._config,\n aggregations,\n };\n this.emit(\"config\", this._config, this.range);\n }\n\n get baseFilter() {\n return this._config.baseFilterSpec;\n }\n\n set baseFilter(baseFilter: DataSourceFilter | undefined) {\n this.config = {\n ...this._config,\n baseFilterSpec: baseFilter,\n };\n }\n\n get columns() {\n return this._config.columns;\n }\n\n set columns(columns: string[]) {\n this.config = {\n ...this._config,\n columns,\n };\n this.emit(\"config\", this._config, this.range);\n }\n\n get filter() {\n return this._config.filterSpec;\n }\n\n set filter(filter: DataSourceFilter) {\n this.config = {\n ...this._config,\n filterSpec: filter,\n };\n }\n\n get isAwaitingConfirmationOfConfigChange() {\n return this._impendingConfig !== undefined;\n }\n\n protected confirmConfigChange() {\n if (this._impendingConfig) {\n this._config = this._impendingConfig;\n this._impendingConfig = undefined;\n this.emit(\"config\", this._config, this.range, true);\n } else {\n throw Error(\n `BaseDataSOurce, unexpected call to confirmConfigChange, no changes pending`,\n );\n }\n }\n\n get config() {\n return this._impendingConfig ?? this._config;\n }\n\n set config(config: WithBaseFilter<WithFullConfig>) {\n const confirmed = this.awaitingConfirmationOfConfigChanges\n ? true\n : undefined;\n // TODO what happens if config is set and we still have an unconfirmed change ?\n this.awaitingConfirmationOfConfigChanges = false;\n const configChanges = this.applyConfig(config);\n if (configChanges) {\n this.emit(\"config\", this.config, this.range, confirmed, configChanges);\n }\n }\n\n set impendingConfig(config: WithBaseFilter<WithFullConfig>) {\n this.awaitingConfirmationOfConfigChanges = true;\n const configChanges = this.applyConfig(config);\n if (configChanges) {\n this.emit(\"config\", this.config, this.range, false, configChanges);\n }\n }\n\n get range() {\n return this._range;\n }\n\n set range(range: VuuRange) {\n if (range.from !== this._range.from || range.to !== this._range.to) {\n this._range = range;\n this.rangeRequest(range);\n }\n }\n\n get size() {\n return this._size;\n }\n\n get sort() {\n return this._config.sort;\n }\n\n set sort(sort: VuuSort) {\n this.config = {\n ...this._config,\n sort,\n };\n this.emit(\"config\", this._config, this.range);\n }\n\n get title() {\n return this._title ?? \"\";\n }\n\n set title(title: string) {\n this._title = title;\n this.emit(\"title-changed\", this.viewport ?? \"\", title);\n }\n\n // Public while we use this from useSessionDataSource\n public applyConfig(\n config: WithBaseFilter<DataSourceConfig>,\n preserveExistingConfigAttributes = false,\n ): DataSourceConfigChanges | undefined {\n const { noChanges, ...otherChanges } = isConfigChanged(\n this._config,\n config,\n );\n if (noChanges !== true) {\n if (config) {\n const newConfig: DataSourceConfig =\n config?.filterSpec?.filter &&\n config?.filterSpec.filterStruct === undefined\n ? {\n ...config,\n filterSpec: {\n filter: config.filterSpec.filter,\n filterStruct: parseFilter(config.filterSpec.filter),\n },\n }\n : config;\n if (preserveExistingConfigAttributes) {\n if (this.awaitingConfirmationOfConfigChanges) {\n this._impendingConfig = {\n ...this._config,\n ...config,\n };\n } else {\n this._impendingConfig = undefined;\n this._config = {\n ...this._config,\n ...config,\n };\n }\n } else {\n if (this.awaitingConfirmationOfConfigChanges) {\n this._impendingConfig = withConfigDefaults(newConfig);\n } else {\n this._impendingConfig = undefined;\n this._config = withConfigDefaults(newConfig);\n }\n }\n return otherChanges;\n }\n }\n }\n\n abstract rangeRequest(range: VuuRange): void;\n}\n"],"names":["EventEmitter","vanillaConfig","uuid","isConfigChanged","parseFilter","withConfigDefaults"],"mappings":"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"}
1
+ {"version":3,"file":"BaseDataSource.js","sources":["../../src/datasource/BaseDataSource.ts"],"sourcesContent":["import type {\n DataSource,\n DataSourceConfig,\n DataSourceConstructorProps,\n DataSourceEvents,\n DataSourceFilter,\n SubscribeCallback,\n SubscribeProps,\n WithBaseFilter,\n WithFullConfig,\n} from \"@vuu-ui/vuu-data-types\";\nimport { parseFilter } from \"@vuu-ui/vuu-filter-parser\";\nimport {\n LinkDescriptorWithLabel,\n VuuAggregation,\n VuuRange,\n VuuSort,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { EventEmitter } from \"../event-emitter\";\nimport { uuid } from \"../nanoid\";\nimport {\n DataSourceConfigChanges,\n isConfigChanged,\n vanillaConfig,\n withConfigDefaults,\n} from \"./datasource-utils\";\n\nexport type RuntimeConfig = WithBaseFilter<WithFullConfig> & {\n visualLink?: LinkDescriptorWithLabel;\n};\n\nexport abstract class BaseDataSource\n extends EventEmitter<DataSourceEvents>\n implements Pick<DataSource, \"config\">\n{\n // This should simply be id\n public viewport: string;\n\n protected _clientCallback: SubscribeCallback | undefined;\n protected _config: RuntimeConfig = vanillaConfig;\n protected _impendingConfig: RuntimeConfig | undefined = undefined;\n protected _range: VuuRange = { from: 0, to: 0 };\n protected _size = 0;\n protected _title: string | undefined;\n\n #pageCount = 0;\n\n private awaitingConfirmationOfConfigChanges = false;\n\n constructor({\n aggregations,\n baseFilterSpec,\n columns,\n filterSpec,\n groupBy,\n sort,\n title,\n viewport,\n }: Omit<DataSourceConstructorProps, \"table\">) {\n super();\n this._config = {\n ...this._config,\n aggregations: aggregations || this._config.aggregations,\n baseFilterSpec: baseFilterSpec || this._config.baseFilterSpec,\n columns: columns || this._config.columns,\n filterSpec: filterSpec || this._config.filterSpec,\n groupBy: groupBy || this._config.groupBy,\n sort: sort || this._config.sort,\n };\n\n this._title = title;\n this.viewport = viewport ?? \"\";\n }\n\n subscribe(\n {\n baseFilterSpec,\n columns,\n aggregations,\n range,\n sort,\n groupBy,\n filterSpec,\n viewport = this.viewport || (this.viewport = uuid()),\n }: SubscribeProps,\n callback: SubscribeCallback,\n ) {\n this._clientCallback = callback;\n this.viewport = viewport;\n\n if (\n aggregations ||\n baseFilterSpec ||\n columns ||\n filterSpec ||\n groupBy ||\n sort\n ) {\n this._config = {\n ...this._config,\n aggregations: aggregations || this._config.aggregations,\n baseFilterSpec: baseFilterSpec || this._config.baseFilterSpec,\n columns: columns || this._config.columns,\n filterSpec: filterSpec || this._config.filterSpec,\n groupBy: groupBy || this._config.groupBy,\n sort: sort || this._config.sort,\n };\n }\n\n // store the range before we await the server. It's is possible the\n // range will be updated from the client before we have been able to\n // subscribe. This ensures we will subscribe with latest value.\n if (range) {\n this._range = range;\n }\n }\n\n get aggregations() {\n return this._config.aggregations;\n }\n\n set aggregations(aggregations: VuuAggregation[]) {\n this.config = {\n ...this._config,\n aggregations,\n };\n this.emit(\"config\", this._config, this.range);\n }\n\n get baseFilter() {\n return this._config.baseFilterSpec;\n }\n\n set baseFilter(baseFilter: DataSourceFilter | undefined) {\n this.config = {\n ...this._config,\n baseFilterSpec: baseFilter,\n };\n }\n\n get columns() {\n return this._config.columns;\n }\n\n set columns(columns: string[]) {\n this.config = {\n ...this._config,\n columns,\n };\n this.emit(\"config\", this._config, this.range);\n }\n\n get filter() {\n return this._config.filterSpec;\n }\n\n set filter(filter: DataSourceFilter) {\n this.config = {\n ...this._config,\n filterSpec: filter,\n };\n }\n\n get isAwaitingConfirmationOfConfigChange() {\n return this._impendingConfig !== undefined;\n }\n\n protected confirmConfigChange() {\n if (this._impendingConfig) {\n this._config = this._impendingConfig;\n this._impendingConfig = undefined;\n this.emit(\"config\", this._config, this.range, true);\n } else {\n throw Error(\n `[BaseDataSource], unexpected call to confirmConfigChange, no changes pending`,\n );\n }\n }\n\n get config() {\n return this._impendingConfig ?? this._config;\n }\n\n set config(config: WithBaseFilter<WithFullConfig>) {\n const confirmed = this.awaitingConfirmationOfConfigChanges\n ? true\n : undefined;\n // TODO what happens if config is set and we still have an unconfirmed change ?\n this.awaitingConfirmationOfConfigChanges = false;\n const configChanges = this.applyConfig(config);\n if (configChanges) {\n this.emit(\"config\", this.config, this.range, confirmed, configChanges);\n }\n }\n\n set impendingConfig(config: WithBaseFilter<WithFullConfig>) {\n this.awaitingConfirmationOfConfigChanges = true;\n const configChanges = this.applyConfig(config);\n if (configChanges) {\n this.emit(\"config\", this.config, this.range, false, configChanges);\n }\n }\n\n get pageCount() {\n return this.#pageCount;\n }\n\n set pageCount(pageCount: number) {\n if (pageCount !== this.#pageCount) {\n this.#pageCount = pageCount;\n this.emit(\"page-count\", pageCount);\n }\n }\n\n get range() {\n return this._range;\n }\n\n set range(range: VuuRange) {\n if (range.from !== this._range.from || range.to !== this._range.to) {\n console.log(\n `[BaseDataSource] <set>range from (${this._range.from}:${this._range.to}) to (${range.from}:${range.to})`,\n );\n this._range = range;\n this.rangeRequest(range);\n }\n }\n\n get size() {\n return this._size;\n }\n\n set size(size: number) {\n this._size = size;\n if (this.range.to !== 0) {\n const pageCount = Math.ceil(size / (this.range.to - this.range.from));\n this.pageCount = pageCount;\n }\n }\n\n get sort() {\n return this._config.sort;\n }\n\n set sort(sort: VuuSort) {\n this.config = {\n ...this._config,\n sort,\n };\n this.emit(\"config\", this._config, this.range);\n }\n\n get title() {\n return this._title ?? \"\";\n }\n\n set title(title: string) {\n this._title = title;\n this.emit(\"title-changed\", this.viewport ?? \"\", title);\n }\n\n // Public while we use this from useSessionDataSource\n public applyConfig(\n config: WithBaseFilter<DataSourceConfig>,\n preserveExistingConfigAttributes = false,\n ): DataSourceConfigChanges | undefined {\n const { noChanges, ...otherChanges } = isConfigChanged(\n this._config,\n config,\n );\n if (noChanges !== true) {\n if (config) {\n const newConfig: DataSourceConfig =\n config?.filterSpec?.filter &&\n config?.filterSpec.filterStruct === undefined\n ? {\n ...config,\n filterSpec: {\n filter: config.filterSpec.filter,\n filterStruct: parseFilter(config.filterSpec.filter),\n },\n }\n : config;\n if (preserveExistingConfigAttributes) {\n if (this.awaitingConfirmationOfConfigChanges) {\n this._impendingConfig = {\n ...this._config,\n ...config,\n };\n } else {\n this._impendingConfig = undefined;\n this._config = {\n ...this._config,\n ...config,\n };\n }\n } else {\n if (this.awaitingConfirmationOfConfigChanges) {\n this._impendingConfig = withConfigDefaults(newConfig);\n } else {\n this._impendingConfig = undefined;\n this._config = withConfigDefaults(newConfig);\n }\n }\n return otherChanges;\n }\n }\n }\n\n abstract rangeRequest(range: VuuRange): void;\n}\n"],"names":["EventEmitter","vanillaConfig","uuid","isConfigChanged","parseFilter","withConfigDefaults"],"mappings":"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"}
package/cjs/index.js CHANGED
@@ -38,6 +38,7 @@ var localStorageUtils = require('./local-storage-utils.js');
38
38
  var loggingUtils = require('./logging-utils.js');
39
39
  var menuUtils = require('./menu-utils.js');
40
40
  var moduleUtils = require('./module-utils.js');
41
+ var movingWindow = require('./moving-window.js');
41
42
  var index = require('./nanoid/index.js');
42
43
  var reactUtils = require('./react-utils.js');
43
44
  var roundDecimal = require('./round-decimal.js');
@@ -86,7 +87,6 @@ exports.applyRuntimeColumnWidthsToConfig = columnUtils.applyRuntimeColumnWidthsT
86
87
  exports.applySortToColumns = columnUtils.applySortToColumns;
87
88
  exports.applyWidthToColumns = columnUtils.applyWidthToColumns;
88
89
  exports.buildColumnMap = columnUtils.buildColumnMap;
89
- exports.buildReverseColumnMap = columnUtils.buildReverseColumnMap;
90
90
  exports.checkConfirmationPending = columnUtils.checkConfirmationPending;
91
91
  exports.dataAndColumnUnchanged = columnUtils.dataAndColumnUnchanged;
92
92
  exports.dataColumnAndKeyUnchanged = columnUtils.dataColumnAndKeyUnchanged;
@@ -318,6 +318,7 @@ exports.isRowMenu = menuUtils.isRowMenu;
318
318
  exports.isSelectionMenu = menuUtils.isSelectionMenu;
319
319
  exports.isTableLocation = menuUtils.isTableLocation;
320
320
  exports.isModule = moduleUtils.isModule;
321
+ exports.MovingWindow = movingWindow.MovingWindow;
321
322
  exports.uuid = index.uuid;
322
323
  exports.asReactElements = reactUtils.asReactElements;
323
324
  exports.isSimpleStateValue = reactUtils.isSimpleStateValue;
package/cjs/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}