@vuu-ui/vuu-table 0.7.2-debug → 0.7.3-debug
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/index.js +48 -23
- package/cjs/index.js.map +2 -2
- package/esm/index.js +48 -23
- package/esm/index.js.map +2 -2
- package/package.json +5 -5
- package/types/useTableModel.d.ts +8 -8
package/cjs/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../packages/vuu-table/src/index.ts", "../../../packages/vuu-table/src/context-menu/buildContextMenuDescriptors.ts", "../../../packages/vuu-table/src/context-menu/useTableContextMenu.ts", "../../../packages/vuu-table/src/Table.tsx", "../../../packages/vuu-table/src/RowBasedTable.tsx", "../../../packages/vuu-table/src/TableRow.tsx", "../../../packages/vuu-table/src/TableCell.tsx", "../../../packages/vuu-table/src/TableGroupCell.tsx", "../../../packages/vuu-table/src/TableGroupHeaderCell.tsx", "../../../packages/vuu-table/src/ColumnResizer.tsx", "../../../packages/vuu-table/src/useTableColumnResize.tsx", "../../../packages/vuu-table/src/TableHeaderCell.tsx", "../../../packages/vuu-table/src/SortIndicator.tsx", "../../../packages/vuu-table/src/filter-indicator.tsx", "../../../packages/vuu-table/src/useTable.ts", "../../../packages/vuu-table/src/useDataSource.ts", "../../../packages/vuu-table/src/useDraggableColumn.ts", "../../../packages/vuu-table/src/useKeyboardNavigation.ts", "../../../packages/vuu-table/src/keyUtils.ts", "../../../packages/vuu-table/src/useMeasuredContainer.ts", "../../../packages/vuu-table/src/useResizeObserver.ts", "../../../packages/vuu-table/src/useSelection.ts", "../../../packages/vuu-table/src/useTableModel.ts", "../../../packages/vuu-table/src/useTableScroll.ts", "../../../packages/vuu-table/src/useTableViewport.ts", "../../../packages/vuu-table/src/useVirtualViewport.ts", "../../../packages/vuu-table/src/cell-renderers/json-cell/JsonCell.tsx"],
|
|
4
|
-
"sourcesContent": ["export * from \"./context-menu\";\nexport * from \"./dataTableTypes\";\nexport * from \"./Table\";\nexport * from \"./useMeasuredContainer\";\nexport * from \"./useTableModel\";\nexport * from \"./useTableViewport\";\nexport * from \"./cell-renderers\";\n", "import { DataSource } from \"@vuu-ui/vuu-data\";\nimport { KeyedColumnDescriptor, PinLocation } from \"@vuu-ui/vuu-datagrid-types\";\nimport { Filter } from \"@vuu-ui/vuu-filter-types\";\nimport { ContextMenuItemDescriptor, MenuBuilder } from \"@vuu-ui/vuu-popups\";\nimport { isNumericColumn } from \"@vuu-ui/vuu-utils\";\n\nexport type ContextMenuLocation = \"header\" | \"filter\" | \"grid\";\n\ntype MaybeColumn = { column?: KeyedColumnDescriptor };\ntype MaybeFilter = { filter?: Filter };\n\nexport const buildContextMenuDescriptors =\n (dataSource?: DataSource): MenuBuilder =>\n (location, options) => {\n const descriptors: ContextMenuItemDescriptor[] = [];\n if (dataSource === undefined) {\n return descriptors;\n }\n if (location === \"header\") {\n descriptors.push(\n ...buildSortMenuItems(options as MaybeColumn, dataSource)\n );\n descriptors.push(\n ...buildGroupMenuItems(options as MaybeColumn, dataSource)\n );\n descriptors.push(\n ...buildAggregationMenuItems(options as MaybeColumn, dataSource)\n );\n descriptors.push(...buildColumnDisplayMenuItems(options as MaybeColumn));\n } else if (location === \"filter\") {\n const { column, filter } = options as MaybeFilter & MaybeColumn;\n const colIsOnlyFilter = filter?.column === column?.name;\n descriptors.push({\n label: \"Edit filter\",\n action: \"filter-edit\",\n options,\n });\n\n descriptors.push({\n label: \"Remove filter\",\n action: \"filter-remove-column\",\n options,\n });\n\n if (column && !colIsOnlyFilter) {\n // TODO col might still be the only column in the filter if it is\n // involved in all clauses\n descriptors.push({\n label: `Remove all filters`,\n action: \"remove-filters\",\n options,\n });\n }\n }\n\n // if (options?.selectedRowCount){\n // // TODO pass the table name\n // const rpcActions = getRpcActions();\n // for (let {label, method} of rpcActions){\n // descriptors.push({action: Action.RpcCall, label, options: {method}})\n // }\n // }\n\n return descriptors;\n };\n\nfunction buildSortMenuItems(\n options: MaybeColumn,\n { sort: { sortDefs } }: DataSource\n): ContextMenuItemDescriptor[] {\n const { column } = options;\n const menuItems: ContextMenuItemDescriptor[] = [];\n if (column === undefined) {\n return menuItems;\n }\n\n const hasSort = sortDefs.length > 0;\n\n if (column.sorted === \"A\") {\n menuItems.push({\n label: \"Reverse Sort (DSC)\",\n action: \"sort-dsc\",\n options,\n });\n } else if (column.sorted === \"D\") {\n menuItems.push({\n label: \"Reverse Sort (ASC)\",\n action: \"sort-asc\",\n options,\n });\n } else if (typeof column.sorted === \"number\") {\n if (column.sorted > 0) {\n menuItems.push({\n label: \"Reverse Sort (DSC)\",\n action: \"sort-add-dsc\",\n options,\n });\n } else {\n menuItems.push({\n label: \"Reverse Sort (ASC)\",\n action: \"sort-add-asc\",\n options,\n });\n }\n\n // removing the last column from a sort would be a no-op, so pointless\n if (hasSort && Math.abs(column.sorted) < sortDefs.length) {\n menuItems.push({\n label: \"Remove from sort\",\n action: \"sort-remove\",\n options,\n });\n }\n\n menuItems.push({\n label: \"New Sort\",\n children: [\n { label: \"Ascending\", action: \"sort-asc\", options },\n { label: \"Descending\", action: \"sort-dsc\", options },\n ],\n });\n } else if (hasSort) {\n menuItems.push({\n label: \"Add to sort\",\n children: [\n { label: \"Ascending\", action: \"sort-add-asc\", options },\n { label: \"Descending\", action: \"sort-add-dsc\", options },\n ],\n });\n menuItems.push({\n label: \"New Sort\",\n children: [\n { label: \"Ascending\", action: \"sort-asc\", options },\n { label: \"Descending\", action: \"sort-dsc\", options },\n ],\n });\n } else {\n menuItems.push({\n label: \"Sort\",\n children: [\n { label: \"Ascending\", action: \"sort-asc\", options },\n { label: \"Descending\", action: \"sort-dsc\", options },\n ],\n });\n }\n return menuItems;\n}\n\nfunction buildAggregationMenuItems(\n options: MaybeColumn,\n dataSource: DataSource\n): ContextMenuItemDescriptor[] {\n const { column } = options;\n if (column === undefined || dataSource.groupBy.length === 0) {\n return [];\n }\n const { name, label = name } = column;\n\n return [\n {\n label: `Aggregate ${label}`,\n children: [{ label: \"Count\", action: \"agg-count\", options }].concat(\n isNumericColumn(column)\n ? [\n { label: \"Sum\", action: \"agg-sum\", options },\n { label: \"Avg\", action: \"agg-avg\", options },\n { label: \"High\", action: \"agg-high\", options },\n { label: \"Low\", action: \"agg-low\", options },\n ]\n : []\n ),\n },\n ];\n}\n\nconst pinColumn = (options: unknown, pinLocation: PinLocation) =>\n ({\n label: `Pin ${pinLocation}`,\n action: `column-pin-${pinLocation}`,\n options,\n } as ContextMenuItemDescriptor);\n\nconst pinLeft = (options: unknown) => pinColumn(options, \"left\");\nconst pinFloating = (options: unknown) => pinColumn(options, \"floating\");\nconst pinRight = (options: unknown) => pinColumn(options, \"right\");\n\nfunction buildColumnDisplayMenuItems(\n options: MaybeColumn\n): ContextMenuItemDescriptor[] {\n const { column } = options;\n if (column === undefined) {\n return [];\n }\n const { pin } = column;\n\n const menuItems: ContextMenuItemDescriptor[] = [\n {\n label: `Hide column`,\n action: \"column-hide\",\n options,\n },\n {\n label: `Remove column`,\n action: \"column-remove\",\n options,\n },\n ];\n\n if (pin === undefined) {\n menuItems.push({\n label: `Pin column`,\n children: [pinLeft(options), pinFloating(options), pinRight(options)],\n });\n } else if (pin === \"left\") {\n menuItems.push(\n { label: \"Unpin column\", action: \"column-unpin\", options },\n {\n label: `Pin column`,\n children: [pinFloating(options), pinRight(options)],\n }\n );\n } else if (pin === \"right\") {\n menuItems.push(\n { label: \"Unpin column\", action: \"column-unpin\", options },\n {\n label: `Pin column`,\n children: [pinLeft(options), pinFloating(options)],\n }\n );\n } else if (pin === \"floating\") {\n menuItems.push(\n { label: \"Unpin column\", action: \"column-unpin\", options },\n {\n label: `Pin column`,\n children: [pinLeft(options), pinRight(options)],\n }\n );\n }\n\n return menuItems;\n}\n\nfunction buildGroupMenuItems(\n options: MaybeColumn,\n { groupBy }: DataSource\n): ContextMenuItemDescriptor[] {\n const { column } = options;\n const menuItems: ContextMenuItemDescriptor[] = [];\n if (column === undefined) {\n return menuItems;\n }\n\n const { name, label = name } = column;\n\n if (groupBy.length === 0) {\n menuItems.push({\n label: `Group by ${label}`,\n action: \"group\",\n options,\n });\n } else {\n menuItems.push({\n label: `Add ${label} to group by`,\n action: \"group-add\",\n options,\n });\n }\n\n return menuItems;\n}\n", "/* eslint-disable no-sequences */\nimport { DataSource } from \"@vuu-ui/vuu-data\";\nimport { KeyedColumnDescriptor } from \"@vuu-ui/vuu-datagrid-types\";\nimport { Filter } from \"@vuu-ui/vuu-filter-types\";\nimport { removeColumnFromFilter } from \"@vuu-ui/vuu-filters\";\nimport { MenuActionHandler } from \"@vuu-ui/vuu-popups\";\nimport { VuuFilter } from \"@vuu-ui/vuu-protocol-types\";\nimport { DataSourceFilter } from \"@vuu-ui/vuu-data-types\";\nimport { PersistentColumnAction } from \"../useTableModel\";\nimport {\n addGroupColumn,\n addSortColumn,\n AggregationType,\n setAggregations,\n setSortColumn,\n} from \"@vuu-ui/vuu-utils\";\n\nexport interface ContextMenuOptions {\n column?: KeyedColumnDescriptor;\n filter?: Filter;\n sort?: VuuFilter;\n}\nexport interface ContextMenuHookProps {\n dataSource?: DataSource;\n onPersistentColumnOperation: (action: PersistentColumnAction) => void;\n}\n\nconst removeFilterColumn = (\n dataSourceFilter: DataSourceFilter,\n column: KeyedColumnDescriptor\n) => {\n if (dataSourceFilter.filterStruct && column) {\n const [filterStruct, filter] = removeColumnFromFilter(\n column,\n dataSourceFilter.filterStruct\n );\n return {\n filter,\n filterStruct,\n };\n } else {\n return dataSourceFilter;\n }\n};\n\nconst { Average, Count, High, Low, Sum } = AggregationType;\n\nexport const useTableContextMenu = ({\n dataSource,\n onPersistentColumnOperation,\n}: ContextMenuHookProps) => {\n /** return {boolean} used by caller to determine whether to forward to additional installed context menu handlers */\n const handleContextMenuAction: MenuActionHandler = (\n type,\n options\n ): boolean => {\n const gridOptions = options as ContextMenuOptions;\n if (gridOptions.column && dataSource) {\n const { column } = gridOptions;\n // prettier-ignore\n switch(type){\n case \"sort-asc\": return (dataSource.sort = setSortColumn(dataSource.sort, column, \"A\")), true;\n case \"sort-dsc\": return (dataSource.sort = setSortColumn(dataSource.sort, column, \"D\")), true;\n case \"sort-add-asc\": return (dataSource.sort = addSortColumn(dataSource.sort, column, \"A\")), true;\n case \"sort-add-dsc\": return (dataSource.sort = addSortColumn(dataSource.sort, column, \"D\")), true;\n case \"group\": return (dataSource.groupBy = addGroupColumn(dataSource.groupBy, column)), true;\n case \"group-add\": return (dataSource.groupBy = addGroupColumn(dataSource.groupBy, column)), true;\n case \"column-hide\": return onPersistentColumnOperation({type: \"hideColumns\", columns: [column]}), true;\n case \"column-remove\": return (dataSource.columns = dataSource.columns.filter(name => name !== column.name)), true\n case \"filter-remove-column\": return (dataSource.filter = removeFilterColumn(dataSource.filter, column)), true;\n case \"remove-filters\": return (dataSource.filter = {filter:\"\"}), true;\n case \"agg-avg\": return dataSource.aggregations = (setAggregations(dataSource.aggregations, column, Average)), true;\n case \"agg-high\": return dataSource.aggregations = (setAggregations(dataSource.aggregations, column, High)), true;\n case \"agg-low\": return dataSource.aggregations = (setAggregations(dataSource.aggregations, column, Low)), true;\n case \"agg-count\": return dataSource.aggregations = (setAggregations(dataSource.aggregations, column, Count)), true;\n case \"agg-sum\": return dataSource.aggregations = (setAggregations(dataSource.aggregations, column, Sum)), true;\n case \"column-pin-floating\": return onPersistentColumnOperation({type: \"pinColumn\", column, pin: \"floating\"}), true;\n case \"column-pin-left\": return onPersistentColumnOperation({type: \"pinColumn\", column, pin: \"left\"}), true;\n case \"column-pin-right\": return onPersistentColumnOperation({type: \"pinColumn\", column, pin: \"right\"}), true;\n case \"column-unpin\": return onPersistentColumnOperation({type: \"pinColumn\", column, pin: undefined}), true\n default:\n }\n }\n return false;\n };\n\n return handleContextMenuAction;\n};\n", "import { ContextMenuProvider } from \"@vuu-ui/vuu-popups\";\nimport { Button, useIdMemo } from \"@salt-ds/core\";\nimport { CSSProperties } from \"react\";\nimport { buildContextMenuDescriptors } from \"./context-menu\";\nimport { TableProps } from \"./dataTableTypes\";\n// import { RowBasedTable } from \"./RowBasedTable\";\nimport { RowBasedTable } from \"./RowBasedTable\";\nimport { useTable } from \"./useTable\";\nimport cx from \"classnames\";\n\nimport \"./Table.css\";\nimport \"./Table-loading.css\";\n\nimport { isDataLoading } from \"@vuu-ui/vuu-utils\";\n\nconst classBase = \"vuuTable\";\n\nexport const Table = ({\n allowConfigEditing: showSettings = false,\n className: classNameProp,\n config,\n dataSource,\n headerHeight = 25,\n height,\n id: idProp,\n onConfigChange,\n onFeatureEnabled,\n onFeatureInvocation,\n onSelectionChange,\n onShowConfigEditor: onShowSettings,\n renderBufferSize = 0,\n rowHeight = 20,\n selectionModel = \"extended\",\n style: styleProp,\n width,\n zebraStripes = false,\n ...htmlAttributes\n}: TableProps) => {\n const id = useIdMemo(idProp);\n const {\n containerMeasurements: { containerRef, innerSize, outerSize },\n containerProps,\n dispatchColumnAction,\n draggable,\n draggedItemIndex,\n handleContextMenuAction,\n scrollProps,\n viewportMeasurements,\n ...tableProps\n } = useTable({\n config,\n dataSource,\n renderBufferSize,\n headerHeight,\n height,\n onConfigChange,\n onFeatureEnabled,\n onFeatureInvocation,\n onSelectionChange,\n rowHeight,\n selectionModel,\n width,\n });\n\n const style = {\n ...outerSize,\n \"--content-height\": `${viewportMeasurements.contentHeight}px`,\n \"--horizontal-scrollbar-height\": `${viewportMeasurements.horizontalScrollbarHeight}px`,\n \"--content-width\": `${viewportMeasurements.contentWidth}px`,\n \"--pinned-width-left\": `${viewportMeasurements.pinnedWidthLeft}px`,\n \"--pinned-width-right\": `${viewportMeasurements.pinnedWidthRight}px`,\n \"--header-height\": `${headerHeight}px`,\n \"--row-height\": `${rowHeight}px`,\n \"--table-height\": `${innerSize?.height}px`,\n \"--table-width\": `${innerSize?.width}px`,\n \"--total-header-height\": `${viewportMeasurements.totalHeaderHeight}px`,\n \"--vertical-scrollbar-width\": `${viewportMeasurements.verticalScrollbarWidth}px`,\n \"--viewport-body-height\": `${viewportMeasurements.viewportBodyHeight}px`,\n } as CSSProperties;\n\n const className = cx(classBase, classNameProp, {\n [`${classBase}-zebra`]: zebraStripes,\n [`${classBase}-loading`]: isDataLoading(tableProps.columns),\n });\n\n return (\n <ContextMenuProvider\n menuActionHandler={handleContextMenuAction}\n menuBuilder={buildContextMenuDescriptors(dataSource)}\n >\n <div\n {...htmlAttributes}\n {...containerProps}\n className={className}\n id={id}\n ref={containerRef}\n style={style}\n tabIndex={-1}\n >\n {innerSize ? (\n <div\n className={`${classBase}-scrollbarContainer`}\n ref={scrollProps.scrollbarContainerRef}\n >\n <div className={`${classBase}-scrollbarContent`} />\n </div>\n ) : null}\n {innerSize ? (\n <div\n className={`${classBase}-contentContainer`}\n ref={scrollProps.contentContainerRef}\n >\n <RowBasedTable\n {...tableProps}\n headerHeight={headerHeight}\n tableId={id}\n />\n {draggable}\n </div>\n ) : null}\n {showSettings && innerSize ? (\n <Button\n className={`${classBase}-settings`}\n data-icon=\"settings\"\n onClick={onShowSettings}\n variant=\"secondary\"\n />\n ) : null}\n </div>\n </ContextMenuProvider>\n );\n};\n", "import {\n buildColumnMap,\n getColumnStyle,\n isGroupColumn,\n metadataKeys,\n notHidden,\n visibleColumnAtIndex,\n} from \"@vuu-ui/vuu-utils\";\nimport { MouseEvent, useCallback, useMemo } from \"react\";\nimport { TableImplementationProps } from \"./dataTableTypes\";\nimport { TableRow } from \"./TableRow\";\nimport { TableGroupHeaderCell } from \"./TableGroupHeaderCell\";\nimport { TableHeaderCell } from \"./TableHeaderCell\";\n\nimport \"./RowBasedTable.css\";\n\nconst classBase = \"vuuTable\";\nconst { RENDER_IDX } = metadataKeys;\n\nexport const RowBasedTable = ({\n columns,\n columnsWithinViewport,\n data,\n getRowOffset,\n headings,\n onColumnResize,\n onHeaderCellDragStart,\n onContextMenu,\n onRemoveColumnFromGroupBy,\n onRowClick,\n onSort,\n onToggleGroup,\n tableId,\n virtualColSpan = 0,\n rowCount,\n}: TableImplementationProps) => {\n const handleDragStart = useCallback(\n (evt: MouseEvent) => {\n onHeaderCellDragStart?.(evt);\n },\n [onHeaderCellDragStart]\n );\n\n const visibleColumns = useMemo(() => {\n return columns.filter(notHidden);\n }, [columns]);\n\n const columnMap = useMemo(() => buildColumnMap(columns), [columns]);\n\n const handleHeaderClick = useCallback(\n (evt: MouseEvent) => {\n const targetElement = evt.target as HTMLElement;\n const headerCell = targetElement.closest(\n \".vuuTable-headerCell\"\n ) as HTMLElement;\n const colIdx = parseInt(headerCell?.dataset.idx ?? \"-1\");\n const column = visibleColumnAtIndex(columns, colIdx);\n const isAdditive = evt.shiftKey;\n column && onSort(column, isAdditive);\n },\n [columns, onSort]\n );\n\n return (\n <div aria-rowcount={rowCount} className={`${classBase}-table`} role=\"table\">\n <div className={`${classBase}-headers`} role=\"rowGroup\">\n {headings.map((colHeaders, i) => (\n <div className=\"vuuTable-heading\" key={i}>\n {colHeaders.map(({ label, width }, j) => (\n <div key={j} className=\"vuuTable-headingCell\" style={{ width }}>\n {label}\n </div>\n ))}\n </div>\n ))}\n <div role=\"row\">\n {visibleColumns.map((column, i) => {\n const style = getColumnStyle(column);\n return isGroupColumn(column) ? (\n <TableGroupHeaderCell\n column={column}\n data-idx={i}\n key={i}\n onRemoveColumn={onRemoveColumnFromGroupBy}\n onResize={onColumnResize}\n role=\"columnHeader\"\n style={style}\n />\n ) : (\n <TableHeaderCell\n column={column}\n data-idx={i}\n id={`${tableId}-${i}`}\n key={i}\n onClick={handleHeaderClick}\n onDragStart={handleDragStart}\n onResize={onColumnResize}\n role=\"columnHeader\"\n style={style}\n />\n );\n })}\n </div>\n </div>\n <div\n className={`${classBase}-body`}\n onContextMenu={onContextMenu}\n role=\"rowGroup\"\n >\n {data?.map((row) => (\n <TableRow\n columnMap={columnMap}\n columns={columnsWithinViewport}\n offset={getRowOffset(row)}\n key={row[RENDER_IDX]}\n onClick={onRowClick}\n virtualColSpan={virtualColSpan}\n onToggleGroup={onToggleGroup}\n row={row}\n />\n ))}\n </div>\n </div>\n );\n};\n", "import { DataSourceRow } from \"@vuu-ui/vuu-data\";\nimport { KeyedColumnDescriptor } from \"@vuu-ui/vuu-datagrid-types\";\nimport {\n ColumnMap,\n isGroupColumn,\n isJsonColumn,\n isJsonGroup,\n metadataKeys,\n notHidden,\n} from \"@vuu-ui/vuu-utils\";\nimport cx from \"classnames\";\nimport { HTMLAttributes, memo, MouseEvent, useCallback } from \"react\";\nimport { RowClickHandler } from \"./dataTableTypes\";\nimport { TableCell } from \"./TableCell\";\nimport { TableGroupCell } from \"./TableGroupCell\";\n\nimport \"./TableRow.css\";\n\nconst { IDX, IS_EXPANDED, SELECTED } = metadataKeys;\nconst classBase = \"vuuTableRow\";\n\nexport interface RowProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"children\" | \"onClick\"> {\n columnMap: ColumnMap;\n columns: KeyedColumnDescriptor[];\n offset: number;\n onClick?: RowClickHandler;\n onToggleGroup?: (row: DataSourceRow, column: KeyedColumnDescriptor) => void;\n row: DataSourceRow;\n virtualColSpan?: number;\n}\n\nexport const TableRow = memo(function Row({\n columnMap,\n columns,\n offset,\n onClick,\n onToggleGroup,\n virtualColSpan = 0,\n row,\n}: RowProps) {\n const {\n [IDX]: rowIndex,\n [IS_EXPANDED]: isExpanded,\n [SELECTED]: isSelected,\n } = row;\n\n const className = cx(classBase, {\n [`${classBase}-even`]: rowIndex % 2 === 0,\n [`${classBase}-expanded`]: isExpanded,\n [`${classBase}-preSelected`]: isSelected === 2,\n });\n\n const handleRowClick = useCallback(\n (evt: MouseEvent) => {\n const rangeSelect = evt.shiftKey;\n const keepExistingSelection = evt.ctrlKey || evt.metaKey; /* mac only */\n onClick?.(row, rangeSelect, keepExistingSelection);\n },\n [onClick, row]\n );\n\n const handleGroupCellClick = useCallback(\n (evt: MouseEvent, column: KeyedColumnDescriptor) => {\n if (isGroupColumn(column) || isJsonGroup(column, row)) {\n evt.stopPropagation();\n onToggleGroup?.(row, column);\n }\n },\n [onToggleGroup, row]\n );\n\n return (\n <div\n aria-selected={isSelected === 1 ? true : undefined}\n aria-rowindex={rowIndex}\n className={className}\n onClick={handleRowClick}\n role=\"row\"\n style={{\n transform: `translate3d(0px, ${offset}px, 0px)`,\n }}\n >\n {virtualColSpan > 0 ? (\n <div role=\"cell\" style={{ width: virtualColSpan }} />\n ) : null}\n {columns.filter(notHidden).map((column) => {\n const isGroup = isGroupColumn(column);\n const isJsonCell = isJsonColumn(column);\n const Cell = isGroup ? TableGroupCell : TableCell;\n return (\n <Cell\n column={column}\n columnMap={columnMap}\n key={column.name}\n onClick={isGroup || isJsonCell ? handleGroupCellClick : undefined}\n row={row}\n />\n );\n })}\n </div>\n );\n});\n", "import { TableCellProps } from \"@vuu-ui/vuu-datagrid-types\";\nimport { getColumnStyle, metadataKeys } from \"@vuu-ui/vuu-utils\";\nimport { EditableLabel } from \"@heswell/salt-lab\";\nimport cx from \"classnames\";\nimport {\n KeyboardEvent,\n memo,\n MouseEvent,\n useCallback,\n useRef,\n useState,\n} from \"react\";\n\nimport \"./TableCell.css\";\n\nconst { KEY } = metadataKeys;\n\nexport const TableCell = memo(\n ({\n className: classNameProp,\n column,\n columnMap,\n onClick,\n row,\n }: TableCellProps) => {\n const labelFieldRef = useRef<HTMLDivElement>(null);\n const {\n align,\n CellRenderer,\n key,\n pin,\n editable,\n resizing,\n valueFormatter,\n } = column;\n const [editing, setEditing] = useState<boolean>(false);\n const value = valueFormatter(row[key]);\n const [editableValue, setEditableValue] = useState<string>(value);\n const handleTitleMouseDown = () => {\n labelFieldRef.current?.focus();\n };\n const handleTitleKeyDown = (evt: KeyboardEvent<HTMLTableCellElement>) => {\n if (evt.key === \"Enter\") {\n setEditing(true);\n }\n };\n\n const handleClick = useCallback(\n (evt: MouseEvent) => {\n onClick?.(evt, column);\n },\n [column, onClick]\n );\n\n const handleEnterEditMode = () => {\n setEditing(true);\n };\n\n const handleExitEditMode = (\n originalValue = \"\",\n finalValue = \"\",\n allowDeactivation = true,\n editCancelled = false\n ) => {\n setEditing(false);\n if (editCancelled) {\n setEditableValue(originalValue);\n } else if (finalValue !== originalValue) {\n setEditableValue(finalValue);\n }\n if (allowDeactivation === false) {\n labelFieldRef.current?.focus();\n }\n };\n\n // might want to useMemo here, this won't change often\n const className =\n cx(classNameProp, {\n vuuAlignRight: align === \"right\",\n vuuPinFloating: pin === \"floating\",\n vuuPinLeft: pin === \"left\",\n vuuPinRight: pin === \"right\",\n \"vuuTableCell-resizing\": resizing,\n }) || undefined;\n const style = getColumnStyle(column);\n return editable ? (\n <div\n className={className}\n data-editable\n role=\"cell\"\n style={style}\n onKeyDown={handleTitleKeyDown}\n >\n <EditableLabel\n editing={editing}\n key=\"title\"\n value={editableValue}\n onChange={setEditableValue}\n onMouseDownCapture={handleTitleMouseDown}\n onEnterEditMode={handleEnterEditMode}\n onExitEditMode={handleExitEditMode}\n onKeyDown={handleTitleKeyDown}\n ref={labelFieldRef}\n tabIndex={0}\n />\n </div>\n ) : (\n <div\n className={className}\n role=\"cell\"\n style={style}\n onClick={handleClick}\n >\n {CellRenderer ? (\n <CellRenderer column={column} columnMap={columnMap} row={row} />\n ) : (\n value\n )}\n </div>\n );\n },\n cellValuesAreEqual\n);\nTableCell.displayName = \"TableCell\";\n\nfunction cellValuesAreEqual(prev: TableCellProps, next: TableCellProps) {\n return (\n prev.column === next.column &&\n prev.onClick === next.onClick &&\n prev.row[KEY] === next.row[KEY] &&\n prev.row[prev.column.key] === next.row[next.column.key]\n );\n}\n", "import { DataSourceRow } from \"@vuu-ui/vuu-data\";\nimport {\n GroupColumnDescriptor,\n KeyedColumnDescriptor,\n TableCellProps,\n} from \"@vuu-ui/vuu-datagrid-types\";\nimport { getColumnStyle, metadataKeys } from \"@vuu-ui/vuu-utils\";\nimport { MouseEvent, useCallback } from \"react\";\n\nimport \"./TableGroupCell.css\";\n\nconst { DEPTH, IS_LEAF } = metadataKeys;\n\nexport const getGroupValueAndOffset = (\n columns: KeyedColumnDescriptor[],\n row: DataSourceRow\n): [unknown, number] => {\n const { [DEPTH]: depth, [IS_LEAF]: isLeaf } = row;\n // Depth can be greater tha group columns when we have just removed a column from groupby\n // but new data has not yet been received.\n if (isLeaf || depth > columns.length) {\n return [null, depth === null ? 0 : depth - 1];\n } else if (depth === 0) {\n return [\"$root\", 0];\n } else {\n // offset 1 for now to allow for $root\n const { key, valueFormatter } = columns[depth - 1];\n const value = valueFormatter(row[key]);\n return [value, depth - 1];\n }\n};\n\nexport const TableGroupCell = ({ column, onClick, row }: TableCellProps) => {\n const { columns } = column as GroupColumnDescriptor;\n const [value, offset] = getGroupValueAndOffset(columns, row);\n\n const handleClick = useCallback(\n (evt: MouseEvent) => {\n onClick?.(evt, column);\n },\n [column, onClick]\n );\n\n // const style = {\n // left: column.pin == \"left\" ? column.pinnedOffset : undefined,\n // };\n const style = getColumnStyle(column);\n const isLeaf = row[IS_LEAF];\n const spacers = Array(offset)\n .fill(0)\n .map((n, i) => <span className=\"vuuTableGroupCell-spacer\" key={i} />);\n return (\n <div\n className={\"vuuTableGroupCell vuuPinLeft\"}\n onClick={isLeaf ? undefined : handleClick}\n role=\"cell\"\n style={style}\n >\n {spacers}\n {isLeaf ? null : (\n <span className=\"vuuTableGroupCell-toggle\" data-icon=\"triangle-right\" />\n )}\n <span>{value}</span>\n </div>\n );\n};\n", "import cx from \"classnames\";\nimport { HTMLAttributes, useRef } from \"react\";\nimport { ColumnResizer } from \"./ColumnResizer\";\nimport { TableHeaderCellProps } from \"./TableHeaderCell\";\n\nimport \"./TableGroupHeaderCell.css\";\nimport {\n GroupColumnDescriptor,\n KeyedColumnDescriptor,\n} from \"@vuu-ui/vuu-datagrid-types\";\nimport { useTableColumnResize } from \"./useTableColumnResize\";\n\nconst classBase = \"vuuTable-groupHeaderCell\";\n\ninterface RemoveButtonProps\n extends Omit<HTMLAttributes<HTMLSpanElement>, \"onClick\"> {\n column?: KeyedColumnDescriptor;\n onClick?: (column?: KeyedColumnDescriptor) => void;\n}\nconst RemoveButton = ({\n column,\n onClick,\n ...htmlAttributes\n}: RemoveButtonProps) => {\n return (\n <span\n {...htmlAttributes}\n className={`${classBase}-close`}\n data-icon=\"close-circle\"\n onClick={() => onClick?.(column)}\n />\n );\n};\n\nexport interface ColHeaderProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onClick\"> {\n column: KeyedColumnDescriptor;\n onRemove?: (column?: KeyedColumnDescriptor) => void;\n}\n\nconst ColHeader = (props: ColHeaderProps) => {\n const { children, column, className } = props;\n return (\n <div className={cx(`${classBase}-col`, className)} role=\"columnheader\">\n <span className={`${classBase}-label`}>{column.name}</span>\n {children}\n </div>\n );\n};\n\nexport interface TableGroupHeaderCellProps\n extends Omit<TableHeaderCellProps, \"onDragStart\" | \"onDrag\" | \"onDragEnd\"> {\n column: GroupColumnDescriptor;\n onRemoveColumn?: (column?: KeyedColumnDescriptor) => void;\n}\n\nexport const TableGroupHeaderCell = ({\n column: groupColumn,\n className: classNameProp,\n onRemoveColumn,\n onResize,\n ...props\n}: TableGroupHeaderCellProps) => {\n const rootRef = useRef<HTMLTableCellElement>(null);\n const { isResizing, ...resizeProps } = useTableColumnResize({\n column: groupColumn,\n onResize,\n rootRef,\n });\n const className = cx(classBase, classNameProp, {\n vuuPinLeft: groupColumn.pin === \"left\",\n [`${classBase}-right`]: groupColumn.align === \"right\",\n [`${classBase}-resizing`]: groupColumn.resizing,\n [`${classBase}-pending`]: groupColumn.groupConfirmed === false,\n });\n const { columns } = groupColumn;\n\n return (\n <div className={className} ref={rootRef} {...props}>\n <div className={`${classBase}-inner`}>\n {columns.map((column) => (\n <ColHeader key={column.key} column={column}>\n {columns.length > 1 ? (\n <RemoveButton column={column} onClick={onRemoveColumn} />\n ) : null}\n </ColHeader>\n ))}\n <RemoveButton data-align=\"end\" onClick={onRemoveColumn} />\n {groupColumn.resizeable !== false ? (\n <ColumnResizer {...resizeProps} />\n ) : null}\n </div>\n </div>\n );\n};\n", "// export interface ColumnResizerProps {}\nimport { useCallback, useRef } from \"react\";\nimport \"./ColumnResizer.css\";\n\nconst NOOP = () => undefined;\n\nconst baseClass = \"vuuColumnResizer\";\nexport interface TableColumnResizerProps {\n onDrag: (evt: MouseEvent, moveBy: number) => void;\n onDragEnd: (evt: MouseEvent) => void;\n onDragStart: (evt: React.MouseEvent) => void;\n}\n\nexport const ColumnResizer = ({\n onDrag,\n onDragEnd = NOOP,\n onDragStart = NOOP,\n}: TableColumnResizerProps) => {\n const position = useRef(0);\n\n const onMouseMove = useCallback(\n (e: MouseEvent) => {\n if (e.stopPropagation) {\n e.stopPropagation();\n }\n\n if (e.preventDefault) {\n e.preventDefault();\n }\n\n const x = Math.round(e.clientX);\n const moveBy = x - position.current;\n position.current = x;\n\n if (moveBy !== 0) {\n onDrag(e, moveBy);\n }\n },\n [onDrag]\n );\n\n const onMouseUp = useCallback(\n (e: MouseEvent) => {\n window.removeEventListener(\"mouseup\", onMouseUp);\n window.removeEventListener(\"mousemove\", onMouseMove);\n onDragEnd(e);\n },\n [onDragEnd, onMouseMove]\n );\n\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n onDragStart(e);\n\n position.current = Math.round(e.clientX);\n\n window.addEventListener(\"mouseup\", onMouseUp);\n window.addEventListener(\"mousemove\", onMouseMove);\n\n if (e.stopPropagation) {\n e.stopPropagation();\n }\n\n if (e.preventDefault) {\n e.preventDefault();\n }\n },\n [onDragStart, onMouseMove, onMouseUp]\n );\n\n return (\n <div className={baseClass} data-align=\"end\" onMouseDown={handleMouseDown} />\n );\n};\n", "import { Heading, KeyedColumnDescriptor } from \"@vuu-ui/vuu-datagrid-types\";\nimport { RefObject, useCallback, useRef } from \"react\";\n\nexport type ResizeHandler = (evt: MouseEvent, moveBy: number) => void;\nexport interface CellResizeHookProps {\n column: KeyedColumnDescriptor | Heading;\n onResize?: (phase: resizePhase, columnName: string, width?: number) => void;\n rootRef: RefObject<HTMLDivElement>;\n}\n\ntype resizePhase = \"begin\" | \"resize\" | \"end\";\n\nexport interface CellResizeHookResult {\n isResizing: boolean;\n onDrag: (evt: MouseEvent, moveBy: number) => void;\n onDragStart: (evt: React.MouseEvent) => void;\n onDragEnd: (evt: MouseEvent) => void;\n}\n\nexport const useTableColumnResize = ({\n column,\n onResize,\n rootRef,\n}: CellResizeHookProps): CellResizeHookResult => {\n const widthRef = useRef(0);\n const isResizing = useRef(false);\n const { name } = column;\n\n const handleResizeStart = useCallback(() => {\n if (onResize && rootRef.current) {\n const { width } = rootRef.current.getBoundingClientRect();\n widthRef.current = Math.round(width);\n isResizing.current = true;\n onResize?.(\"begin\", name);\n }\n }, [name, onResize, rootRef]);\n\n const handleResize = useCallback(\n (_evt: MouseEvent, moveBy: number) => {\n if (rootRef.current) {\n if (onResize) {\n const { width } = rootRef.current.getBoundingClientRect();\n const newWidth = Math.round(width) + moveBy;\n if (newWidth !== widthRef.current && newWidth > 0) {\n onResize(\"resize\", name, newWidth);\n widthRef.current = newWidth;\n }\n }\n }\n },\n [name, onResize, rootRef]\n );\n\n const handleResizeEnd = useCallback(() => {\n if (onResize) {\n onResize(\"end\", name, widthRef.current);\n setTimeout(() => {\n // set in a timeout to prevent the click event from firing and triggering a sort\n isResizing.current = false;\n }, 100);\n }\n }, [name, onResize]);\n\n return {\n isResizing: isResizing.current,\n onDrag: handleResize,\n onDragStart: handleResizeStart,\n onDragEnd: handleResizeEnd,\n };\n};\n", "import { KeyedColumnDescriptor } from \"@vuu-ui/vuu-datagrid-types\";\nimport cx from \"classnames\";\nimport { HTMLAttributes, MouseEvent, useCallback, useRef } from \"react\";\nimport { ColumnResizer } from \"./ColumnResizer\";\nimport { SortIndicator } from \"./SortIndicator\";\nimport { useTableColumnResize } from \"./useTableColumnResize\";\nimport { TableColumnResizeHandler } from \"./dataTableTypes\";\n\nimport \"./TableHeaderCell.css\";\nimport { useContextMenu } from \"@vuu-ui/vuu-popups\";\nimport { FilterIndicator } from \"./filter-indicator\";\n\nconst classBase = \"vuuTable-headerCell\";\n\nexport interface TableHeaderCellProps\n extends HTMLAttributes<HTMLTableCellElement> {\n column: KeyedColumnDescriptor;\n debugString?: string;\n onDragStart?: (evt: MouseEvent) => void;\n onResize?: TableColumnResizeHandler;\n}\n\nexport const TableHeaderCell = ({\n column,\n className: classNameProp,\n onClick,\n onDragStart,\n onResize,\n ...props\n}: TableHeaderCellProps) => {\n const rootRef = useRef<HTMLTableCellElement>(null);\n const { isResizing, ...resizeProps } = useTableColumnResize({\n column,\n onResize,\n rootRef,\n });\n\n const showContextMenu = useContextMenu();\n const dragTimerRef = useRef<number | null>(null);\n\n const handleContextMenu = (e: MouseEvent<HTMLElement>) => {\n showContextMenu(e, \"header\", { column });\n };\n\n const handleClick = useCallback(\n (evt: MouseEvent<HTMLTableCellElement>) => !isResizing && onClick?.(evt),\n [isResizing, onClick]\n );\n\n const handleMouseDown = useCallback(\n (evt: MouseEvent) => {\n dragTimerRef.current = window.setTimeout(() => {\n onDragStart?.(evt);\n dragTimerRef.current = null;\n }, 500);\n },\n [onDragStart]\n );\n const handleMouseUp = useCallback(() => {\n if (dragTimerRef.current !== null) {\n window.clearTimeout(dragTimerRef.current);\n dragTimerRef.current = null;\n }\n }, []);\n\n const className = cx(classBase, classNameProp, {\n vuuPinFloating: column.pin === \"floating\",\n vuuPinLeft: column.pin === \"left\",\n vuuPinRight: column.pin === \"right\",\n vuuEndPin: column.endPin,\n [`${classBase}-resizing`]: column.resizing,\n [`${classBase}-right`]: column.align === \"right\",\n });\n return (\n <div\n className={className}\n {...props}\n onClick={handleClick}\n onContextMenu={handleContextMenu}\n onMouseDown={handleMouseDown}\n onMouseUp={handleMouseUp}\n ref={rootRef}\n >\n <div className={`${classBase}-inner`}>\n <FilterIndicator column={column} />\n <div className={`${classBase}-label`}>{column.label}</div>\n <SortIndicator sorted={column.sorted} />\n {column.resizeable !== false ? (\n <ColumnResizer {...resizeProps} />\n ) : null}\n </div>\n </div>\n );\n};\n", "import { ColumnSort } from \"@vuu-ui/vuu-datagrid-types\";\nimport cx from \"classnames\";\n\nimport \"./SortIndicator.css\";\n\nexport interface SortIndicatorProps {\n sorted?: ColumnSort;\n}\n\nconst classBase = \"vuuSortIndicator\";\n\nexport const SortIndicator = ({ sorted }: SortIndicatorProps) => {\n if (!sorted) {\n return null;\n }\n\n const direction =\n typeof sorted === \"number\"\n ? sorted < 0\n ? \"dsc\"\n : \"asc\"\n : sorted === \"A\"\n ? \"asc\"\n : \"dsc\";\n\n return typeof sorted === \"number\" ? (\n <div className={cx(classBase, \"multi-col\", direction)}>\n <span data-icon={`sorted-${direction}`} />\n <span className={\"vuuSortPosition\"}>{Math.abs(sorted)}</span>\n </div>\n ) : (\n <div className={cx(classBase, \"single-col\")}>\n <span data-icon={`sorted-${direction}`} />\n </div>\n );\n};\n", "import { KeyedColumnDescriptor } from \"@vuu-ui/vuu-datagrid-types\";\nimport { Filter } from \"@vuu-ui/vuu-filter-types\";\nimport { useContextMenu } from \"@vuu-ui/vuu-popups\";\nimport cx from \"classnames\";\nimport { HTMLAttributes, useCallback } from \"react\";\n\nimport \"./filter-indicator.css\";\n\nexport const Direction = {\n ASC: \"asc\",\n DSC: \"dsc\",\n};\n\nexport interface FilterIndicatorProps extends HTMLAttributes<HTMLDivElement> {\n column: KeyedColumnDescriptor;\n filter?: Filter;\n}\n\nexport const FilterIndicator = ({ column, filter }: FilterIndicatorProps) => {\n //TODO handle this at header level\n const showContextMenu = useContextMenu();\n\n const handleClick = useCallback(\n (evt) => {\n // if we do this through keyboard, need to get co-ords\n evt.stopPropagation();\n showContextMenu(evt, \"filter\", { column, filter });\n },\n [column, filter, showContextMenu]\n );\n\n if (!column.filter) {\n return null;\n }\n\n return (\n <div\n className={cx(\"vuuFilterIndicator\")}\n data-icon=\"filter\"\n onClick={handleClick}\n />\n );\n};\n", "import {\n DataSource,\n DataSourceRow,\n DataSourceSubscribedMessage,\n JsonDataSource,\n VuuFeatureInvocationMessage,\n VuuFeatureMessage,\n} from \"@vuu-ui/vuu-data\";\nimport {\n GridConfig,\n KeyedColumnDescriptor,\n SelectionChangeHandler,\n TableSelectionModel,\n} from \"@vuu-ui/vuu-datagrid-types\";\nimport { useContextMenu as usePopupContextMenu } from \"@vuu-ui/vuu-popups\";\nimport { VuuSortType } from \"@vuu-ui/vuu-protocol-types\";\nimport {\n applySort,\n buildColumnMap,\n isJsonGroup,\n metadataKeys,\n moveItem,\n} from \"@vuu-ui/vuu-utils\";\nimport {\n MouseEvent,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { useTableContextMenu } from \"./context-menu\";\nimport { TableColumnResizeHandler } from \"./dataTableTypes\";\nimport { useDataSource } from \"./useDataSource\";\nimport { useDraggableColumn } from \"./useDraggableColumn\";\nimport { useKeyboardNavigation } from \"./useKeyboardNavigation\";\nimport { MeasuredProps, useMeasuredContainer } from \"./useMeasuredContainer\";\nimport { useSelection } from \"./useSelection\";\nimport { PersistentColumnAction, useTableModel } from \"./useTableModel\";\nimport { useTableScroll } from \"./useTableScroll\";\nimport { useTableViewport } from \"./useTableViewport\";\nimport { useVirtualViewport } from \"./useVirtualViewport\";\n\nconst NO_ROWS = [] as const;\n\nexport interface TableHookProps extends MeasuredProps {\n config: Omit<GridConfig, \"headings\">;\n dataSource: DataSource;\n headerHeight: number;\n onConfigChange?: (config: Omit<GridConfig, \"headings\">) => void;\n onFeatureEnabled?: (message: VuuFeatureMessage) => void;\n onFeatureInvocation?: (message: VuuFeatureInvocationMessage) => void;\n renderBufferSize?: number;\n rowHeight: number;\n onSelectionChange?: SelectionChangeHandler;\n selectionModel: TableSelectionModel;\n}\n\nconst { KEY, IS_EXPANDED, IS_LEAF } = metadataKeys;\n\nexport const useTable = ({\n config,\n dataSource,\n headerHeight,\n onConfigChange,\n onFeatureEnabled,\n onFeatureInvocation,\n onSelectionChange,\n renderBufferSize = 0,\n rowHeight,\n selectionModel,\n ...measuredProps\n}: TableHookProps) => {\n const [rowCount, setRowCount] = useState<number>(dataSource.size);\n const expectConfigChangeRef = useRef(false);\n\n // When we detect and respond to changes to config below, we need\n // to include current dataSource config when we refresh the model.\n const dataSourceRef = useRef<DataSource>();\n dataSourceRef.current = dataSource;\n\n if (dataSource === undefined) {\n throw Error(\"no data source provided to Vuu Table\");\n }\n\n const containerMeasurements = useMeasuredContainer(measuredProps);\n\n const onDataRowcountChange = useCallback((size: number) => {\n setRowCount(size);\n }, []);\n\n const { columns, dispatchColumnAction, headings } = useTableModel(\n config,\n dataSource.config\n );\n\n const {\n getRowAtPosition,\n getRowOffset,\n setPctScrollTop,\n ...viewportMeasurements\n } = useTableViewport({\n columns,\n headerHeight,\n headings,\n rowCount,\n rowHeight,\n size: containerMeasurements.innerSize,\n });\n\n const onSubscribed = useCallback(\n (subscription: DataSourceSubscribedMessage) => {\n if (subscription.tableMeta) {\n const { columns: columnNames, dataTypes: serverDataTypes } =\n subscription.tableMeta;\n expectConfigChangeRef.current = true;\n dispatchColumnAction({\n type: \"setTypes\",\n columnNames,\n serverDataTypes,\n });\n }\n },\n [dispatchColumnAction]\n );\n\n const handleSelectionChange: SelectionChangeHandler = useCallback(\n (selected) => {\n dataSource.select(selected);\n onSelectionChange?.(selected);\n },\n [dataSource, onSelectionChange]\n );\n\n const handleRowClick = useSelection({\n onSelectionChange: handleSelectionChange,\n selectionModel,\n });\n\n const { data, getSelectedRows, range, setRange } = useDataSource({\n dataSource,\n onFeatureEnabled,\n onFeatureInvocation,\n onSubscribed,\n onSizeChange: onDataRowcountChange,\n renderBufferSize,\n viewportRowCount: viewportMeasurements.rowCount,\n });\n\n // Keep a ref to current data. We use it to provide row for context menu actions.\n // We don't want to introduce data as a dependency on the context menu handler, just\n // needs to be correct at runtime when the row is right clicked.\n const dataRef = useRef<DataSourceRow[]>();\n dataRef.current = data;\n\n const onPersistentColumnOperation = useCallback(\n (action: PersistentColumnAction) => {\n expectConfigChangeRef.current = true;\n dispatchColumnAction(action);\n },\n [dispatchColumnAction]\n );\n\n const handleContextMenuAction = useTableContextMenu({\n dataSource,\n onPersistentColumnOperation,\n });\n\n const handleSort = useCallback(\n (\n column: KeyedColumnDescriptor,\n extendSort = false,\n sortType?: VuuSortType\n ) => {\n if (dataSource) {\n dataSource.sort = applySort(\n dataSource.sort,\n column,\n extendSort,\n sortType\n );\n }\n },\n [dataSource]\n );\n\n const handleColumnResize: TableColumnResizeHandler = useCallback(\n (phase, columnName, width) => {\n const column = columns.find((column) => column.name === columnName);\n if (column) {\n if (phase === \"end\") {\n expectConfigChangeRef.current = true;\n }\n dispatchColumnAction({\n type: \"resizeColumn\",\n phase,\n column,\n width,\n });\n } else {\n throw Error(\n `useDataTable.handleColumnResize, column ${columnName} not found`\n );\n }\n },\n [columns, dispatchColumnAction]\n );\n\n const handleToggleGroup = useCallback(\n (row: DataSourceRow, column: KeyedColumnDescriptor) => {\n const isJson = isJsonGroup(column, row);\n const key = row[KEY];\n\n if (row[IS_EXPANDED]) {\n (dataSource as JsonDataSource).closeTreeNode(key, true);\n if (isJson) {\n const idx = columns.indexOf(column);\n const rows = (dataSource as JsonDataSource).getRowsAtDepth(idx + 1);\n if (!rows.some((row) => row[IS_EXPANDED] || row[IS_LEAF])) {\n dispatchColumnAction({\n type: \"hideColumns\",\n columns: columns.slice(idx + 2),\n });\n }\n }\n } else {\n dataSource.openTreeNode(key);\n if (isJson) {\n const childRows = (dataSource as JsonDataSource).getChildRows(key);\n const idx = columns.indexOf(column) + 1;\n const columnsToShow = [columns[idx]];\n if (childRows.some((row) => row[IS_LEAF])) {\n columnsToShow.push(columns[idx + 1]);\n }\n if (columnsToShow.some((col) => col.hidden)) {\n dispatchColumnAction({\n type: \"showColumns\",\n columns: columnsToShow,\n });\n }\n }\n }\n },\n [columns, dataSource, dispatchColumnAction]\n );\n\n const {\n onVerticalScroll,\n onHorizontalScroll,\n columnsWithinViewport,\n virtualColSpan,\n } = useVirtualViewport({\n columns,\n getRowAtPosition,\n setRange,\n viewportMeasurements,\n });\n\n const handleVerticalScroll = useCallback(\n (scrollTop: number, pctScrollTop: number) => {\n setPctScrollTop(pctScrollTop);\n onVerticalScroll(scrollTop);\n },\n [onVerticalScroll, setPctScrollTop]\n );\n\n const { requestScroll, ...scrollProps } = useTableScroll({\n onHorizontalScroll,\n onVerticalScroll: handleVerticalScroll,\n viewport: viewportMeasurements,\n viewportHeight:\n (containerMeasurements.innerSize?.height ?? 0) - headerHeight,\n });\n\n const containerProps = useKeyboardNavigation({\n columnCount: columns.length,\n containerRef: containerMeasurements.containerRef,\n data,\n requestScroll,\n rowCount: dataSource?.size,\n viewportRange: range,\n });\n\n const handleRemoveColumnFromGroupBy = useCallback(\n (column?: KeyedColumnDescriptor) => {\n if (column) {\n if (dataSource && dataSource.groupBy.includes(column.name)) {\n dataSource.groupBy = dataSource.groupBy.filter(\n (columnName) => columnName !== column.name\n );\n }\n } else {\n dataSource.groupBy = [];\n }\n },\n [dataSource]\n );\n\n const handleDropColumn = useCallback(\n (fromIndex: number, toIndex: number) => {\n const column = dataSource.columns[fromIndex];\n const columns = moveItem(dataSource.columns, column, toIndex);\n if (columns !== dataSource.columns) {\n dataSource.columns = columns;\n dispatchColumnAction({ type: \"tableConfig\", columns });\n }\n },\n [dataSource, dispatchColumnAction]\n );\n\n const draggableHook = useDraggableColumn({\n onDrop: handleDropColumn,\n });\n\n useEffect(() => {\n // External config has changed\n if (dataSourceRef.current) {\n expectConfigChangeRef.current = true;\n dispatchColumnAction({\n type: \"init\",\n tableConfig: config,\n dataSourceConfig: dataSourceRef.current.config,\n });\n }\n }, [config, dispatchColumnAction]);\n\n useEffect(() => {\n dataSource.on(\"config\", (config, confirmed) => {\n expectConfigChangeRef.current = true;\n dispatchColumnAction({\n type: \"tableConfig\",\n ...config,\n confirmed,\n });\n });\n }, [dataSource, dispatchColumnAction]);\n\n useMemo(() => {\n if (expectConfigChangeRef.current) {\n onConfigChange?.({\n ...config,\n columns,\n });\n expectConfigChangeRef.current = false;\n }\n }, [columns, config, onConfigChange]);\n\n const showContextMenu = usePopupContextMenu();\n\n const onContextMenu = useCallback(\n (evt: MouseEvent<HTMLElement>) => {\n const { current: currentData } = dataRef;\n const { current: currentDataSource } = dataSourceRef;\n const target = evt.target as HTMLElement;\n const cellEl = target?.closest(\"div[role='cell']\");\n const rowEl = target?.closest(\".vuuTableRow\");\n\n if (cellEl && rowEl && currentData && currentDataSource) {\n const { columns, selectedRowsCount } = currentDataSource;\n const columnMap = buildColumnMap(columns);\n const rowIndex = parseInt(rowEl.ariaRowIndex ?? \"-1\");\n const cellIndex = Array.from(rowEl.childNodes).indexOf(cellEl);\n const row = currentData.find(([idx]) => idx === rowIndex);\n const columnName = columns[cellIndex];\n\n showContextMenu(evt, \"grid\", {\n columnMap,\n columnName,\n row,\n selectedRows: selectedRowsCount === 0 ? NO_ROWS : getSelectedRows(),\n viewport: dataSource?.viewport,\n });\n }\n },\n [dataSource?.viewport, getSelectedRows, showContextMenu]\n );\n\n return {\n columns,\n columnsWithinViewport,\n containerMeasurements,\n containerProps,\n data,\n dispatchColumnAction,\n getRowOffset,\n handleContextMenuAction,\n headings,\n onColumnResize: handleColumnResize,\n onContextMenu,\n onRemoveColumnFromGroupBy: handleRemoveColumnFromGroupBy,\n onRowClick: handleRowClick,\n onSort: handleSort,\n onToggleGroup: handleToggleGroup,\n virtualColSpan,\n scrollProps,\n rowCount,\n viewportMeasurements,\n ...draggableHook,\n };\n};\n", "import {\n DataSource,\n DataSourceConfigMessage,\n DataSourceRow,\n DataSourceSubscribedMessage,\n SubscribeCallback,\n VuuFeatureMessage,\n isVuuFeatureAction,\n VuuFeatureInvocationMessage,\n isVuuFeatureInvocation,\n} from \"@vuu-ui/vuu-data\";\nimport { VuuRange, VuuSortCol } from \"@vuu-ui/vuu-protocol-types\";\nimport { getFullRange, metadataKeys, WindowRange } from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nconst { SELECTED } = metadataKeys;\n\n// const byKey = (row1: VuuDataRow, row2: VuuDataRow) =>\n// ((row1[RENDER_IDX] as number) - row2[RENDER_IDX]) as number;\n\nexport type SubscriptionDetails = {\n columnNames?: string[];\n range: { from: number; to: number };\n sort?: VuuSortCol[];\n};\n\nexport interface DataSourceHookProps {\n dataSource: DataSource;\n onConfigChange?: (message: DataSourceConfigMessage) => void;\n onFeatureEnabled?: (message: VuuFeatureMessage) => void;\n onFeatureInvocation?: (message: VuuFeatureInvocationMessage) => void;\n onSizeChange: (size: number) => void;\n onSubscribed: (subscription: DataSourceSubscribedMessage) => void;\n range?: VuuRange;\n renderBufferSize?: number;\n viewportRowCount: number;\n}\n\n//TODO allow subscription details to be set before subscribe call\nexport function useDataSource({\n dataSource,\n onConfigChange,\n onFeatureEnabled,\n onFeatureInvocation,\n onSizeChange,\n onSubscribed,\n range = { from: 0, to: 0 },\n renderBufferSize = 0,\n viewportRowCount,\n}: DataSourceHookProps) {\n const [, forceUpdate] = useState<unknown>(null);\n const isMounted = useRef(true);\n const hasUpdated = useRef(false);\n const rangeRef = useRef<VuuRange>({ from: 0, to: 0 });\n const rafHandle = useRef<number | null>(null);\n const data = useRef<DataSourceRow[]>([]);\n\n const dataWindow = useMemo(\n () => new MovingWindow(getFullRange(range)),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n const setData = useCallback(\n (updates: DataSourceRow[]) => {\n for (const row of updates) {\n dataWindow.add(row);\n }\n data.current = dataWindow.data;\n hasUpdated.current = true;\n },\n [dataWindow]\n );\n\n const datasourceMessageHandler: SubscribeCallback = useCallback(\n (message) => {\n if (message.type === \"subscribed\") {\n onSubscribed?.(message);\n } else if (message.type === \"viewport-update\") {\n if (typeof message.size === \"number\") {\n onSizeChange?.(message.size);\n dataWindow.setRowCount(message.size);\n }\n if (message.rows) {\n setData(message.rows);\n } else if (typeof message.size === \"number\") {\n // TODO is this right ??????\n data.current = dataWindow.data;\n // data.current = dataWindow.data.slice().sort(byKey);\n hasUpdated.current = true;\n }\n } else if (isVuuFeatureAction(message)) {\n onFeatureEnabled?.(message);\n } else if (isVuuFeatureInvocation(message)) {\n onFeatureInvocation?.(message);\n } else {\n console.log(`useDataSource unexpected message ${message.type}`);\n }\n },\n [\n dataWindow,\n onFeatureEnabled,\n onFeatureInvocation,\n onSizeChange,\n onSubscribed,\n setData,\n ]\n );\n\n useEffect(\n () => () => {\n if (rafHandle.current) {\n cancelAnimationFrame(rafHandle.current);\n rafHandle.current = null;\n }\n isMounted.current = false;\n },\n []\n );\n\n const refreshIfUpdated = useCallback(() => {\n if (isMounted.current) {\n if (hasUpdated.current) {\n forceUpdate({});\n hasUpdated.current = false;\n }\n rafHandle.current = requestAnimationFrame(refreshIfUpdated);\n }\n }, [forceUpdate]);\n\n useEffect(() => {\n rafHandle.current = requestAnimationFrame(refreshIfUpdated);\n }, [refreshIfUpdated]);\n\n const adjustRange = useCallback(\n (rowCount: number) => {\n const { from } = dataSource.range;\n const rowRange = { from, to: from + rowCount };\n const fullRange = getFullRange(rowRange, renderBufferSize);\n dataWindow.setRange(fullRange);\n dataSource.range = rangeRef.current = fullRange;\n // seems a bit naughty to emit from outside, but the datasource doesn't\n // know about the buffer size we add to the base range\n dataSource.emit(\"range\", rowRange);\n },\n [dataSource, dataWindow, renderBufferSize]\n );\n\n const setRange = useCallback(\n (range: VuuRange) => {\n const fullRange = getFullRange(range, renderBufferSize);\n dataWindow.setRange(fullRange);\n dataSource.range = rangeRef.current = fullRange;\n dataSource.emit(\"range\", range);\n },\n [dataSource, dataWindow, renderBufferSize]\n );\n\n const getSelectedRows = useCallback(() => {\n return dataWindow.getSelectedRows();\n }, [dataWindow]);\n\n // Note: we do not call unsubscribe in a cleanup function here.\n // Thats because we do not want to unsubscribe in the event that\n // our view is unmounts due to a layout drag drop operation. In\n // that scenario, we disable the viewport. THis is handles at the\n // View level. Might need to revisit this - what if Table is not\n // nested within a View ?\n useEffect(() => {\n dataSource?.subscribe(\n {\n range: rangeRef.current,\n },\n datasourceMessageHandler\n );\n }, [dataSource, datasourceMessageHandler, onConfigChange]);\n\n useEffect(() => {\n adjustRange(viewportRowCount);\n }, [adjustRange, viewportRowCount]);\n\n return {\n data: data.current,\n getSelectedRows,\n range: rangeRef.current,\n setRange,\n dataSource,\n };\n}\n\nexport class MovingWindow {\n public data: DataSourceRow[];\n public rowCount = 0;\n private range: WindowRange;\n\n constructor({ from, to }: VuuRange) {\n this.range = new WindowRange(from, to);\n //internal data is always 0 based, we add range.from to determine an offset\n this.data = new Array(to - from);\n this.rowCount = 0;\n }\n\n setRowCount = (rowCount: number) => {\n if (rowCount < this.data.length) {\n this.data.length = rowCount;\n }\n\n this.rowCount = rowCount;\n };\n\n add(data: DataSourceRow) {\n const [index] = data;\n if (this.isWithinRange(index)) {\n const internalIndex = index - this.range.from;\n this.data[internalIndex] = data;\n\n // assign 'pre-selected' selection state. This allows us to assign a className\n // to a non selected row that immediately precedes a selected row. Useful for\n // styling. This cannot be achieved any other way as document order of row\n // elements does not necessarily reflect data order.\n const isSelected = data[SELECTED];\n const preSelected = this.data[internalIndex - 1]?.[SELECTED];\n if (preSelected === 0 && isSelected) {\n this.data[internalIndex - 1][SELECTED] = 2;\n } else if (preSelected === 2 && !isSelected) {\n this.data[internalIndex - 1][SELECTED] = 0;\n }\n }\n }\n\n getAtIndex(index: number) {\n return this.range.isWithin(index) &&\n this.data[index - this.range.from] != null\n ? this.data[index - this.range.from]\n : undefined;\n }\n\n isWithinRange(index: number) {\n return this.range.isWithin(index);\n }\n\n setRange({ from, to }: VuuRange) {\n if (from !== this.range.from || to !== this.range.to) {\n const [overlapFrom, overlapTo] = this.range.overlap(from, to);\n const newData = new Array(Math.max(0, to - from));\n for (let i = overlapFrom; i < overlapTo; i++) {\n const data = this.getAtIndex(i);\n if (data) {\n const index = i - from;\n newData[index] = data;\n }\n }\n this.data = newData;\n this.range.from = from;\n this.range.to = to;\n }\n }\n\n getSelectedRows() {\n return this.data.filter((row) => row[SELECTED] === 1);\n }\n}\n", "import { useDragDrop } from \"@heswell/salt-lab\";\nimport { MouseEvent, useCallback, useRef } from \"react\";\n\ntype MousePos = {\n clientX: number;\n clientY: number;\n idx: string;\n};\n\nexport interface DraggableColumnHookProps {\n onDrop: (fromIndex: number, toIndex: number) => void;\n}\n\nexport const useDraggableColumn = ({ onDrop }: DraggableColumnHookProps) => {\n const mousePosRef = useRef<MousePos>();\n const containerRef = useRef<HTMLElement | null>(null);\n\n const handleDropSettle = useCallback(() => {\n console.log(`handleDropSettle`);\n mousePosRef.current = undefined;\n containerRef.current = null;\n }, []);\n\n const { draggable, draggedItemIndex, onMouseDown } = useDragDrop({\n // allowDragDrop: \"drop-indicator\",\n allowDragDrop: true,\n draggableClassName: \"vuuTable-headerCell\",\n orientation: \"horizontal\",\n containerRef,\n itemQuery: \".vuuTable-headerCell\",\n onDrop,\n onDropSettle: handleDropSettle,\n });\n\n const onHeaderCellDragStart = useCallback(\n (evt: MouseEvent) => {\n const { clientX, clientY } = evt;\n console.log(\n `useDraggableColumn handleHeaderCellDragStart means mouseDown fired on a column in RowBasedTable`\n );\n const sourceElement = evt.target as HTMLElement;\n const columnHeaderCell = sourceElement.closest(\".vuuTable-headerCell\");\n containerRef.current = columnHeaderCell?.closest(\n \"[role='row']\"\n ) as HTMLDivElement;\n const {\n dataset: { idx = \"-1\" },\n } = columnHeaderCell as HTMLElement;\n mousePosRef.current = {\n clientX,\n clientY,\n idx,\n };\n onMouseDown?.(evt);\n },\n [onMouseDown]\n );\n\n // useLayoutEffect(() => {\n // if (tableLayout === \"column\" && mousePosRef.current && !draggable) {\n // const { clientX, clientY, idx } = mousePosRef.current;\n // const target = tableContainerRef.current?.querySelector(\n // `.vuuTable-table[data-idx=\"${idx}\"]`\n // ) as HTMLElement;\n // if (target) {\n // const evt = {\n // persist: () => undefined,\n // nativeEvent: {\n // clientX,\n // clientY,\n // target,\n // },\n // };\n // onMouseDown?.(evt as unknown as MouseEvent);\n // }\n // }\n // }, [draggable, onMouseDown, tableContainerRef, tableLayout]);\n\n return {\n draggable,\n draggedItemIndex,\n onHeaderCellDragStart,\n };\n};\n", "import { DataSourceRow } from \"@vuu-ui/vuu-data\";\nimport { VuuRange } from \"@vuu-ui/vuu-protocol-types\";\nimport { withinRange } from \"@vuu-ui/vuu-utils\";\nimport {\n KeyboardEvent,\n MouseEvent,\n RefObject,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport {\n ArrowDown,\n ArrowKey,\n ArrowLeft,\n ArrowRight,\n ArrowUp,\n End,\n Home,\n isNavigationKey,\n isPagingKey,\n NavigationKey,\n PageDown,\n PageUp,\n} from \"./keyUtils\";\nimport { ScrollRequestHandler } from \"./useTableScroll\";\n\nexport type CellPos = [number, number];\n\nconst headerCellQuery = (colIdx: number) =>\n `.vuuTable-headers .vuuTable-headerCell:nth-child(${colIdx + 1})`;\nconst dataCellQuery = (rowIdx: number, colIdx: number) =>\n `.vuuTable-body > [aria-rowindex='${rowIdx}'] > [role='cell']:nth-child(${\n colIdx + 1\n })`;\n\nconst NULL_CELL_POS: CellPos = [-1, -1];\n\nfunction nextCellPos(\n key: ArrowKey,\n [rowIdx, colIdx]: CellPos,\n columnCount: number,\n rowCount: number\n): CellPos {\n if (key === ArrowUp) {\n if (rowIdx > -1) {\n return [rowIdx - 1, colIdx];\n } else {\n return [rowIdx, colIdx];\n }\n } else if (key === ArrowDown) {\n if (rowIdx === -1) {\n return [0, colIdx];\n } else if (rowIdx === rowCount - 1) {\n return [rowIdx, colIdx];\n } else {\n return [rowIdx + 1, colIdx];\n }\n } else if (key === ArrowRight) {\n if (colIdx < columnCount - 1) {\n return [rowIdx, colIdx + 1];\n } else {\n return [rowIdx, colIdx];\n }\n } else if (key === ArrowLeft) {\n if (colIdx > 0) {\n return [rowIdx, colIdx - 1];\n } else {\n return [rowIdx, colIdx];\n }\n }\n return [rowIdx, colIdx];\n}\n\nexport interface NavigationHookProps {\n containerRef: RefObject<HTMLElement>;\n columnCount?: number;\n data: DataSourceRow[];\n disableHighlightOnFocus?: boolean;\n label?: string;\n viewportRange: VuuRange;\n requestScroll?: ScrollRequestHandler;\n restoreLastFocus?: boolean;\n rowCount?: number;\n selected?: unknown;\n}\n\nexport const useKeyboardNavigation = ({\n columnCount = 0,\n containerRef,\n disableHighlightOnFocus,\n data,\n requestScroll,\n rowCount = 0,\n viewportRange,\n}: NavigationHookProps) => {\n const { from: viewportFirstRow, to: viewportLastRow } = viewportRange;\n const focusedCellPos = useRef<CellPos>([-1, -1]);\n const focusableCell = useRef<HTMLTableCellElement>();\n const activeCellPos = useRef<CellPos>([-1, 0]);\n\n const getTableCell = useCallback(\n ([rowIdx, colIdx]: CellPos) => {\n const cssQuery =\n rowIdx === -1 ? headerCellQuery(colIdx) : dataCellQuery(rowIdx, colIdx);\n return containerRef.current?.querySelector(\n cssQuery\n ) as HTMLTableCellElement;\n },\n [containerRef]\n );\n\n const getFocusedCell = (element: HTMLElement | Element | null) =>\n element?.closest(\n \"[role='columnHeader'],[role='cell']\"\n ) as HTMLTableCellElement | null;\n\n const getTableCellPos = (tableCell: HTMLTableCellElement): CellPos => {\n if (tableCell.role === \"columnHeader\") {\n const colIdx = parseInt(tableCell.dataset.idx ?? \"-1\", 10);\n return [-1, colIdx];\n } else {\n const focusedRow = tableCell.closest(\"[role='row']\");\n if (focusedRow) {\n const rowIdx = parseInt(focusedRow.ariaRowIndex ?? \"-1\", 10);\n // TODO will get trickier when we introduce horizontal virtualisation\n const colIdx = Array.from(focusedRow.childNodes).indexOf(tableCell);\n return [rowIdx, colIdx];\n }\n }\n return NULL_CELL_POS;\n };\n\n const focusCell = useCallback(\n (cellPos: CellPos) => {\n if (containerRef.current) {\n const activeCell = getTableCell(cellPos);\n if (activeCell) {\n if (activeCell !== focusableCell.current) {\n focusableCell.current?.setAttribute(\"tabindex\", \"\");\n focusableCell.current = activeCell;\n activeCell.setAttribute(\"tabindex\", \"0\");\n }\n activeCell.focus();\n } else if (!withinRange(cellPos[0], viewportRange)) {\n focusableCell.current = undefined;\n requestScroll?.({ type: \"scroll-page\", direction: \"up\" });\n }\n }\n },\n // TODO we recreate this function whenever viewportRange changes, which will\n // be often whilst scrolling - store range in a a ref ?\n [containerRef, getTableCell, requestScroll, viewportRange]\n );\n\n const setActiveCell = useCallback(\n (rowIdx: number, colIdx: number, fromKeyboard = false) => {\n const pos: CellPos = [rowIdx, colIdx];\n activeCellPos.current = pos;\n focusCell(pos);\n if (fromKeyboard) {\n focusedCellPos.current = pos;\n }\n },\n [focusCell]\n );\n\n const virtualizeActiveCell = useCallback(() => {\n focusableCell.current?.setAttribute(\"tabindex\", \"\");\n focusableCell.current = undefined;\n }, []);\n\n const nextPageItemIdx = useCallback(\n async (\n key: \"PageDown\" | \"PageUp\" | \"Home\" | \"End\",\n cellPos: CellPos\n ): Promise<CellPos> => {\n switch (key) {\n case PageDown:\n requestScroll?.({ type: \"scroll-page\", direction: \"down\" });\n break;\n case PageUp:\n requestScroll?.({ type: \"scroll-page\", direction: \"up\" });\n break;\n case Home:\n requestScroll?.({ type: \"scroll-end\", direction: \"home\" });\n break;\n case End:\n requestScroll?.({ type: \"scroll-end\", direction: \"end\" });\n break;\n }\n // TODO set up a scroll listener here, reset focused cell once scroll completes\n return cellPos;\n },\n [requestScroll]\n );\n\n const handleFocus = useCallback(() => {\n if (disableHighlightOnFocus !== true) {\n if (containerRef.current?.contains(document.activeElement)) {\n // IF focus arrives via keyboard, a cell will have received focus,\n // we handle that here. If focus arrives via click on a cell with\n // no tabindex (i.e all cells except one) we leave that to the\n // click handler.\n const focusedCell = getFocusedCell(document.activeElement);\n if (focusedCell) {\n focusedCellPos.current = getTableCellPos(focusedCell);\n }\n }\n }\n }, [disableHighlightOnFocus, containerRef]);\n\n const navigateChildItems = useCallback(\n async (key: NavigationKey) => {\n const [nextRowIdx, nextColIdx] = isPagingKey(key)\n ? await nextPageItemIdx(key, activeCellPos.current)\n : nextCellPos(key, activeCellPos.current, columnCount, rowCount);\n\n const [rowIdx, colIdx] = activeCellPos.current;\n if (nextRowIdx !== rowIdx || nextColIdx !== colIdx) {\n setActiveCell(nextRowIdx, nextColIdx, true);\n }\n },\n [columnCount, nextPageItemIdx, rowCount, setActiveCell]\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (data.length > 0 && isNavigationKey(e.key)) {\n e.preventDefault();\n e.stopPropagation();\n void navigateChildItems(e.key);\n }\n },\n [data, navigateChildItems]\n );\n\n const handleClick = useCallback(\n // Might not be a cell e.g the Settings button\n (evt: MouseEvent) => {\n const target = evt.target as HTMLElement;\n const focusedCell = getFocusedCell(target);\n if (focusedCell) {\n const [rowIdx, colIdx] = getTableCellPos(focusedCell);\n setActiveCell(rowIdx, colIdx);\n }\n },\n [setActiveCell]\n );\n\n const containerProps = useMemo(() => {\n return {\n onClick: handleClick,\n onFocus: handleFocus,\n onKeyDown: handleKeyDown,\n };\n }, [handleClick, handleFocus, handleKeyDown]);\n\n useLayoutEffect(() => {\n const { current: cellPos } = activeCellPos;\n const withinViewport =\n cellPos[0] >= viewportFirstRow && cellPos[0] <= viewportLastRow;\n\n if (focusableCell.current && !withinViewport) {\n virtualizeActiveCell();\n } else if (!focusableCell.current && withinViewport) {\n focusCell(cellPos);\n }\n }, [focusCell, viewportFirstRow, viewportLastRow, virtualizeActiveCell]);\n\n // First render will only render the outer container when explicit\n // sizing has not been provided. Outer container is measured and\n // only then, on second render, is content rendered.\n const fullyRendered = containerRef.current?.firstChild != null;\n useEffect(() => {\n if (fullyRendered && focusableCell.current === undefined) {\n const headerCell = containerRef.current?.querySelector(\n headerCellQuery(0)\n ) as HTMLTableCellElement;\n if (headerCell) {\n headerCell.setAttribute(\"tabindex\", \"0\");\n focusableCell.current = headerCell;\n }\n }\n }, [containerRef, fullyRendered]);\n\n return containerProps;\n};\n", "import React from \"react\";\n\nfunction union<T>(set1: Set<T>, ...sets: Set<T>[]) {\n const result = new Set(set1);\n for (let set of sets) {\n for (let element of set) {\n result.add(element);\n }\n }\n return result;\n}\n\nexport const ArrowUp = \"ArrowUp\";\nexport const ArrowDown = \"ArrowDown\";\nexport const ArrowLeft = \"ArrowLeft\";\nexport const ArrowRight = \"ArrowRight\";\nexport const Enter = \"Enter\";\nexport const Escape = \"Escape\";\nexport const Home = \"Home\";\nexport const End = \"End\";\nexport const PageUp = \"PageUp\";\nexport const PageDown = \"PageDown\";\nexport const Space = \" \";\nexport const Tab = \"Tab\";\n\nconst actionKeys = new Set([\"Enter\", \"Delete\", \" \"]);\nconst focusKeys = new Set([\"Tab\"]);\nconst arrowLeftRightKeys = new Set([\"ArrowRight\", \"ArrowLeft\"]);\nconst navigationKeys = new Set<NavigationKey>([\n Home,\n End,\n PageUp,\n PageDown,\n ArrowDown,\n ArrowLeft,\n ArrowRight,\n ArrowUp,\n]);\nconst functionKeys = new Set([\n \"F1\",\n \"F2\",\n \"F3\",\n \"F4\",\n \"F5\",\n \"F6\",\n \"F7\",\n \"F8\",\n \"F9\",\n \"F10\",\n \"F11\",\n \"F12\",\n]);\nconst specialKeys = union(\n actionKeys,\n navigationKeys,\n arrowLeftRightKeys,\n functionKeys,\n focusKeys\n);\nexport const isCharacterKey = (evt: React.KeyboardEvent): boolean => {\n if (specialKeys.has(evt.key)) {\n return false;\n }\n return evt.key.length === 1 && !evt.ctrlKey && !evt.metaKey && !evt.altKey;\n};\n\nexport type ArrowKey = \"ArrowUp\" | \"ArrowDown\" | \"ArrowLeft\" | \"ArrowRight\";\nexport type PageKey = \"Home\" | \"End\" | \"PageUp\" | \"PageDown\";\nexport type NavigationKey = PageKey | ArrowKey;\nconst PageKeys = [\"Home\", \"End\", \"PageUp\", \"PageDown\"];\nexport const isPagingKey = (key: string): key is PageKey =>\n PageKeys.includes(key);\n\nexport const isNavigationKey = (key: string): key is NavigationKey => {\n return navigationKeys.has(key as NavigationKey);\n};\n", "import { isValidNumber } from \"@vuu-ui/vuu-utils\";\nimport { RefObject, useCallback, useMemo, useRef, useState } from \"react\";\nimport { useResizeObserver, ResizeHandler } from \"./useResizeObserver\";\n\nconst ClientWidthHeight = [\"clientHeight\", \"clientWidth\"];\n\nexport interface ClientSize {\n clientHeight: number;\n clientWidth: number;\n}\n\nexport interface MeasuredProps {\n defaultHeight?: number;\n defaultWidth?: number;\n height?: number;\n width?: number;\n}\n\nexport interface Size {\n height: number | \"100%\";\n width: number | \"100%\";\n}\n\nexport interface MeasuredSize {\n height: number;\n width: number;\n}\n\ninterface MeasuredState {\n css: CssSize;\n outer: Size;\n inner?: MeasuredSize;\n}\n\nconst isNumber = (val: unknown): val is number => Number.isFinite(val);\n\nexport type CssSize = {\n height: string;\n width: string;\n};\nconst FULL_SIZE: CssSize = { height: \"100%\", width: \"100%\" };\n\nexport interface MeasuredContainerHookResult {\n containerRef: RefObject<HTMLDivElement>;\n cssSize: CssSize;\n outerSize: Size;\n innerSize?: MeasuredSize;\n}\n\n// If (outer) height and width are known at initialisation (i.e. they\n// were passed as props), use as initial values for inner size. If there\n// is no border on Table, these values will not change. If there is a border,\n// inner values will be updated once measured.\nconst getInitialCssSize = (height: unknown, width: unknown): CssSize => {\n if (isValidNumber(height) && isValidNumber(width)) {\n return {\n height: `${height}px`,\n width: `${width}px`,\n };\n } else {\n return FULL_SIZE;\n }\n};\n\nconst getInitialInnerSize = (\n height: unknown,\n width: unknown\n): MeasuredSize | undefined => {\n if (isValidNumber(height) && isValidNumber(width)) {\n return {\n height,\n width,\n };\n }\n};\n\nexport const useMeasuredContainer = ({\n defaultHeight = 0,\n defaultWidth = 0,\n height,\n width,\n}: MeasuredProps): MeasuredContainerHookResult => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [size, setSize] = useState<MeasuredState>({\n css: getInitialCssSize(height, width),\n inner: getInitialInnerSize(height, width),\n outer: {\n height: height ?? \"100%\",\n width: width ?? \"100%\",\n },\n });\n\n useMemo(() => {\n setSize((currentSize) => {\n const { inner, outer } = currentSize;\n if (isValidNumber(height) && isValidNumber(width) && inner && outer) {\n const { height: innerHeight, width: innerWidth } = inner;\n const { height: outerHeight, width: outerWidth } = outer;\n\n if (outerHeight !== height || outerWidth !== width) {\n const heightDiff = isValidNumber(outerHeight)\n ? outerHeight - innerHeight\n : 0;\n const widthDiff = isValidNumber(outerWidth)\n ? outerWidth - innerWidth\n : 0;\n return {\n ...currentSize,\n outer: { height, width },\n inner: { height: height - heightDiff, width: width - widthDiff },\n };\n }\n }\n return currentSize;\n });\n }, [height, width]);\n\n const onResize: ResizeHandler = useCallback(\n ({ clientWidth, clientHeight }: Partial<ClientSize>) => {\n setSize((currentSize) => {\n const { css, inner, outer } = currentSize;\n return isNumber(clientHeight) &&\n isNumber(clientWidth) &&\n (clientWidth !== inner?.width || clientHeight !== inner?.height)\n ? {\n css,\n outer,\n inner: {\n width: Math.floor(clientWidth) || defaultWidth,\n height: Math.floor(clientHeight) || defaultHeight,\n },\n }\n : currentSize;\n });\n },\n [defaultHeight, defaultWidth]\n );\n\n useResizeObserver(containerRef, ClientWidthHeight, onResize, true);\n\n return {\n containerRef,\n cssSize: size.css,\n outerSize: size.outer,\n innerSize: size.inner,\n };\n};\n", "import { RefObject, useCallback, useEffect, useRef } from \"react\";\n\nexport const WidthHeight = [\"height\", \"width\"];\nexport const WidthOnly = [\"width\"];\n\nexport type measurements<T = string | number> = {\n height?: T;\n clientHeight?: number;\n clientWidth?: number;\n contentHeight?: number;\n contentWidth?: number;\n scrollHeight?: number;\n scrollWidth?: number;\n width?: T;\n};\ntype measuredDimension = keyof measurements<number>;\n\nexport type ResizeHandler = (measurements: measurements<number>) => void;\n\ntype observedDetails = {\n onResize?: ResizeHandler;\n measurements: measurements<number>;\n};\nconst observedMap = new Map<HTMLElement, observedDetails>();\n\nconst getTargetSize = (\n element: HTMLElement,\n size: {\n height: number;\n width: number;\n contentHeight: number;\n contentWidth: number;\n },\n dimension: measuredDimension\n): number => {\n switch (dimension) {\n case \"height\":\n return size.height;\n case \"clientHeight\":\n return element.clientHeight;\n case \"clientWidth\":\n return element.clientWidth;\n case \"contentHeight\":\n return size.contentHeight;\n case \"contentWidth\":\n return size.contentWidth;\n case \"scrollHeight\":\n return Math.ceil(element.scrollHeight);\n case \"scrollWidth\":\n return Math.ceil(element.scrollWidth);\n case \"width\":\n return size.width;\n default:\n return 0;\n }\n};\n\n// TODO should we make this create-on-demand\nconst resizeObserver = new ResizeObserver((entries: ResizeObserverEntry[]) => {\n for (const entry of entries) {\n const { target, borderBoxSize, contentBoxSize } = entry;\n const observedTarget = observedMap.get(target as HTMLElement);\n if (observedTarget) {\n const [{ blockSize: height, inlineSize: width }] = borderBoxSize;\n const [{ blockSize: contentHeight, inlineSize: contentWidth }] =\n contentBoxSize;\n const { onResize, measurements } = observedTarget;\n let sizeChanged = false;\n for (const [dimension, size] of Object.entries(measurements)) {\n const newSize = getTargetSize(\n target as HTMLElement,\n { height, width, contentHeight, contentWidth },\n dimension as measuredDimension\n );\n\n if (newSize !== size) {\n sizeChanged = true;\n measurements[dimension as measuredDimension] = newSize;\n }\n }\n if (sizeChanged) {\n // TODO only return measured sizes\n onResize && onResize(measurements);\n }\n }\n }\n});\n\n// TODO use an optional lag (default to false) to ask to fire onResize\n// with initial size\nexport function useResizeObserver(\n ref: RefObject<Element | HTMLElement | null>,\n dimensions: string[],\n onResize: ResizeHandler,\n reportInitialSize = false\n) {\n const dimensionsRef = useRef(dimensions);\n\n const measure = useCallback((target: HTMLElement): measurements<number> => {\n const { width, height } = target.getBoundingClientRect();\n const { clientWidth: contentWidth, clientHeight: contentHeight } = target;\n return dimensionsRef.current.reduce(\n (map: { [key: string]: number }, dim) => {\n map[dim] = getTargetSize(\n target,\n { width, height, contentHeight, contentWidth },\n dim as measuredDimension\n );\n return map;\n },\n {}\n );\n }, []);\n\n // TODO use ref to store resizeHandler here\n // resize handler registered with REsizeObserver will never change\n // use ref to store user onResize callback here\n // resizeHandler will call user callback.current\n\n // Keep this effect separate in case user inadvertently passes different\n // dimensions or callback instance each time - we only ever want to\n // initiate new observation when ref changes.\n useEffect(() => {\n const target = ref.current as HTMLElement;\n async function registerObserver() {\n // Create the map entry immediately. useEffect may fire below\n // before fonts are ready and attempt to update entry\n observedMap.set(target, { measurements: {} as measurements<number> });\n await document.fonts.ready;\n const observedTarget = observedMap.get(target);\n if (observedTarget) {\n const measurements = measure(target);\n observedTarget.measurements = measurements;\n resizeObserver.observe(target);\n if (reportInitialSize) {\n onResize(measurements);\n }\n } else {\n console.log(\n `%cuseResizeObserver an target expected to be under observation wa snot found. This warrants investigation`,\n \"font-weight:bold; color:red;\"\n );\n }\n }\n\n if (target) {\n // TODO might we want multiple callers to attach a listener to the same element ?\n if (observedMap.has(target)) {\n throw Error(\n \"useResizeObserver attemping to observe same element twice\"\n );\n }\n // TODO set a pending entry on map\n registerObserver();\n }\n return () => {\n if (target && observedMap.has(target)) {\n resizeObserver.unobserve(target);\n observedMap.delete(target);\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [measure, ref]);\n\n useEffect(() => {\n const target = ref.current as HTMLElement;\n const record = observedMap.get(target);\n if (record) {\n if (dimensionsRef.current !== dimensions) {\n dimensionsRef.current = dimensions;\n const measurements = measure(target);\n record.measurements = measurements;\n }\n // Might not have changed, but no harm ...\n record.onResize = onResize;\n }\n }, [dimensions, measure, ref, onResize]);\n}\n", "import {\n Selection,\n SelectionChangeHandler,\n TableSelectionModel,\n} from \"@vuu-ui/vuu-datagrid-types\";\nimport { deselectItem, metadataKeys, selectItem } from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useRef } from \"react\";\nimport { RowClickHandler } from \"./dataTableTypes\";\n\nconst { IDX, SELECTED } = metadataKeys;\n\nconst NO_SELECTION: Selection = [];\n\nexport interface SelectionHookProps {\n selectionModel: TableSelectionModel;\n onSelectionChange: SelectionChangeHandler;\n}\n\nexport const useSelection = ({\n selectionModel,\n onSelectionChange,\n}: SelectionHookProps) => {\n selectionModel === \"extended\" || selectionModel === \"checkbox\";\n const lastActiveRef = useRef(-1);\n const selectedRef = useRef<Selection>(NO_SELECTION);\n\n const handleSelectionChange: RowClickHandler = useCallback(\n (row, rangeSelect, keepExistingSelection) => {\n const { [IDX]: idx, [SELECTED]: isSelected } = row;\n const { current: active } = lastActiveRef;\n const { current: selected } = selectedRef;\n\n const selectOperation = isSelected ? deselectItem : selectItem;\n\n const newSelected = selectOperation(\n selectionModel,\n selected,\n idx,\n rangeSelect,\n keepExistingSelection,\n active\n );\n\n selectedRef.current = newSelected;\n lastActiveRef.current = idx;\n\n if (onSelectionChange) {\n onSelectionChange(newSelected);\n }\n },\n [onSelectionChange, selectionModel]\n );\n\n return handleSelectionChange;\n};\n", "import {\n ColumnDescriptor,\n GridConfig,\n KeyedColumnDescriptor,\n PinLocation,\n} from \"@vuu-ui/vuu-datagrid-types\";\nimport { moveItem } from \"@heswell/salt-lab\";\nimport {\n applyFilterToColumns,\n applyGroupByToColumns,\n applySortToColumns,\n findColumn,\n getCellRenderer,\n getColumnName,\n getTableHeadings,\n getValueFormatter,\n isFilteredColumn,\n isGroupColumn,\n isPinned,\n isTypeDescriptor,\n logger,\n metadataKeys,\n sortPinnedColumns,\n stripFilterFromColumns,\n} from \"@vuu-ui/vuu-utils\";\n\nimport { Reducer, useReducer } from \"react\";\nimport { VuuColumnDataType } from \"@vuu-ui/vuu-protocol-types\";\nimport { DataSourceConfig } from \"@vuu-ui/vuu-data\";\n\nconst { info } = logger(\"useTableModel\");\n\nconst DEFAULT_COLUMN_WIDTH = 100;\nconst KEY_OFFSET = metadataKeys.count;\n\nconst columnWithoutDataType = ({ serverDataType }: ColumnDescriptor) =>\n serverDataType === undefined;\n\nconst getCellRendererForColumn = (column: ColumnDescriptor) => {\n if (isTypeDescriptor(column.type)) {\n return getCellRenderer(column.type?.renderer);\n }\n};\n\nconst getDataType = (\n column: ColumnDescriptor,\n columnNames: string[],\n dataTypes: VuuColumnDataType[]\n): VuuColumnDataType => {\n const index = columnNames.indexOf(column.name);\n if (index !== -1 && dataTypes[index]) {\n return dataTypes[index];\n } else {\n return column.serverDataType ?? \"string\";\n }\n};\n\nexport interface GridModel extends Omit<GridConfig, \"columns\"> {\n columns: KeyedColumnDescriptor[];\n}\n\nconst numericTypes = [\"int\", \"long\", \"double\"];\nconst getDefaultAlignment = (serverDataType?: VuuColumnDataType) =>\n serverDataType === undefined\n ? undefined\n : numericTypes.includes(serverDataType)\n ? \"right\"\n : \"left\";\n\nexport interface ColumnActionInit {\n type: \"init\";\n tableConfig: Omit<GridConfig, \"headings\">;\n dataSourceConfig?: DataSourceConfig;\n}\n\nexport interface ColumnActionHide {\n type: \"hideColumns\";\n columns: KeyedColumnDescriptor[];\n}\n\nexport interface ColumnActionShow {\n type: \"showColumns\";\n columns: KeyedColumnDescriptor[];\n}\nexport interface ColumnActionMove {\n type: \"moveColumn\";\n column: KeyedColumnDescriptor;\n moveBy?: 1 | -1;\n moveTo?: number;\n}\n\nexport interface ColumnActionPin {\n type: \"pinColumn\";\n column: ColumnDescriptor;\n pin?: PinLocation;\n}\nexport interface ColumnActionResize {\n type: \"resizeColumn\";\n column: KeyedColumnDescriptor;\n phase: \"begin\" | \"resize\" | \"end\";\n width?: number;\n}\n\nexport interface ColumnActionSetTypes {\n type: \"setTypes\";\n columnNames: string[];\n serverDataTypes: VuuColumnDataType[];\n}\n\nexport interface ColumnActionUpdate {\n type: \"updateColumn\";\n column: ColumnDescriptor;\n}\n\nexport interface ColumnActionUpdateProp {\n align?: ColumnDescriptor[\"align\"];\n column: KeyedColumnDescriptor;\n hidden?: ColumnDescriptor[\"hidden\"];\n label?: ColumnDescriptor[\"label\"];\n resizing?: KeyedColumnDescriptor[\"resizing\"];\n type: \"updateColumnProp\";\n width?: ColumnDescriptor[\"width\"];\n}\n\nexport interface ColumnActionTableConfig extends DataSourceConfig {\n confirmed?: boolean;\n type: \"tableConfig\";\n}\n\n/**\n * PersistentColumnActions are those actions that require us to persist user changes across sessions\n */\nexport type PersistentColumnAction = ColumnActionPin | ColumnActionHide;\n\nexport type GridModelAction =\n | ColumnActionHide\n | ColumnActionInit\n | ColumnActionMove\n | ColumnActionPin\n | ColumnActionResize\n | ColumnActionSetTypes\n | ColumnActionShow\n | ColumnActionUpdate\n | ColumnActionUpdateProp\n | ColumnActionTableConfig;\n\nexport type GridModelReducer = Reducer<GridModel, GridModelAction>;\n\nexport type ColumnActionDispatch = (action: GridModelAction) => void;\n\nconst columnReducer: GridModelReducer = (state, action) => {\n info?.(`GridModelReducer ${action.type}`);\n switch (action.type) {\n case \"init\":\n return init(action);\n case \"moveColumn\":\n return moveColumn(state, action);\n case \"resizeColumn\":\n return resizeColumn(state, action);\n case \"setTypes\":\n return setTypes(state, action);\n case \"hideColumns\":\n return hideColumns(state, action);\n case \"showColumns\":\n return showColumns(state, action);\n case \"pinColumn\":\n return pinColumn(state, action);\n case \"updateColumnProp\":\n return updateColumnProp(state, action);\n case \"tableConfig\":\n return updateTableConfig(state, action);\n default:\n console.log(`unhandled action ${action.type}`);\n return state;\n }\n};\n\nexport const useTableModel = (\n tableConfig: Omit<GridConfig, \"headings\">,\n dataSourceConfig?: DataSourceConfig\n) => {\n const [state, dispatchColumnAction] = useReducer<\n GridModelReducer,\n InitialConfig\n >(columnReducer, { tableConfig, dataSourceConfig }, init);\n\n return {\n columns: state.columns,\n dispatchColumnAction,\n headings: state.headings,\n };\n};\n\ntype InitialConfig = {\n dataSourceConfig?: DataSourceConfig;\n tableConfig: Omit<GridConfig, \"headings\">;\n};\n\nfunction init({ dataSourceConfig, tableConfig }: InitialConfig): GridModel {\n const columns = tableConfig.columns.map(\n toKeyedColumWithDefaults(tableConfig)\n );\n const maybePinnedColumns = columns.some(isPinned)\n ? sortPinnedColumns(columns)\n : columns;\n const state = {\n columns: maybePinnedColumns,\n headings: getTableHeadings(maybePinnedColumns),\n };\n if (dataSourceConfig) {\n const { columns, ...rest } = dataSourceConfig;\n return updateTableConfig(state, {\n type: \"tableConfig\",\n ...rest,\n });\n } else {\n return state;\n }\n}\n\nconst getLabel = (\n label: string,\n columnFormatHeader?: \"uppercase\" | \"capitalize\"\n): string => {\n if (columnFormatHeader === \"uppercase\") {\n return label.toUpperCase();\n } else if (columnFormatHeader === \"capitalize\") {\n return label[0].toUpperCase() + label.slice(1).toLowerCase();\n }\n return label;\n};\n\nconst toKeyedColumWithDefaults =\n (options: Omit<GridConfig, \"headings\">) =>\n (\n column: ColumnDescriptor & { key?: number },\n index: number\n ): KeyedColumnDescriptor => {\n const { columnDefaultWidth = DEFAULT_COLUMN_WIDTH, columnFormatHeader } =\n options;\n const {\n align = getDefaultAlignment(column.serverDataType),\n key,\n name,\n label = name,\n width = columnDefaultWidth,\n ...rest\n } = column;\n\n const keyedColumnWithDefaults = {\n ...rest,\n align,\n CellRenderer: getCellRendererForColumn(column),\n label: getLabel(label, columnFormatHeader),\n key: key ?? index + KEY_OFFSET,\n name,\n originalIdx: index,\n valueFormatter: getValueFormatter(column),\n width: width,\n };\n\n if (isGroupColumn(keyedColumnWithDefaults)) {\n keyedColumnWithDefaults.columns = keyedColumnWithDefaults.columns.map(\n (col) => toKeyedColumWithDefaults(options)(col, col.key)\n );\n }\n\n return keyedColumnWithDefaults;\n };\n\nfunction moveColumn(\n state: GridModel,\n { column, moveBy, moveTo }: ColumnActionMove\n) {\n const { columns } = state;\n if (typeof moveBy === \"number\") {\n const idx = columns.indexOf(column);\n const newColumns = columns.slice();\n const [movedColumns] = newColumns.splice(idx, 1);\n newColumns.splice(idx + moveBy, 0, movedColumns);\n return {\n ...state,\n columns: newColumns,\n };\n } else if (typeof moveTo === \"number\") {\n const index = columns.indexOf(column);\n return {\n ...state,\n columns: moveItem(columns, index, moveTo),\n };\n }\n return state;\n}\n\nfunction hideColumns(state: GridModel, { columns }: ColumnActionHide) {\n if (columns.some((col) => col.hidden !== true)) {\n return columns.reduce<GridModel>((s, c) => {\n if (c.hidden !== true) {\n return updateColumnProp(s, {\n type: \"updateColumnProp\",\n column: c,\n hidden: true,\n });\n } else {\n return s;\n }\n }, state);\n } else {\n return state;\n }\n}\nfunction showColumns(state: GridModel, { columns }: ColumnActionShow) {\n if (columns.some((col) => col.hidden)) {\n return columns.reduce<GridModel>((s, c) => {\n if (c.hidden) {\n return updateColumnProp(s, {\n type: \"updateColumnProp\",\n column: c,\n hidden: false,\n });\n } else {\n return s;\n }\n }, state);\n } else {\n return state;\n }\n}\n\nfunction resizeColumn(\n state: GridModel,\n { column, phase, width }: ColumnActionResize\n) {\n const type = \"updateColumnProp\";\n const resizing = phase !== \"end\";\n\n switch (phase) {\n case \"begin\":\n case \"end\":\n return updateColumnProp(state, { type, column, resizing });\n case \"resize\":\n return updateColumnProp(state, { type, column, width });\n default:\n throw Error(`useTableModel.resizeColumn, invalid resizePhase ${phase}`);\n }\n}\n\nfunction setTypes(\n state: GridModel,\n { columnNames, serverDataTypes }: ColumnActionSetTypes\n) {\n const { columns } = state;\n if (columns.some(columnWithoutDataType)) {\n const cols = columns.map((column) => {\n const serverDataType = getDataType(column, columnNames, serverDataTypes);\n return {\n ...column,\n align: column.align ?? getDefaultAlignment(serverDataType),\n serverDataType,\n };\n });\n\n return {\n ...state,\n columns: cols,\n };\n } else {\n return state;\n }\n}\n\nfunction pinColumn(state: GridModel, action: ColumnActionPin) {\n let { columns } = state;\n const { column, pin } = action;\n const targetColumn = columns.find((col) => col.name === column.name);\n if (targetColumn) {\n columns = replaceColumn(columns, { ...targetColumn, pin });\n columns = sortPinnedColumns(columns);\n return {\n ...state,\n columns,\n };\n } else {\n return state;\n }\n}\nfunction updateColumnProp(state: GridModel, action: ColumnActionUpdateProp) {\n let { columns } = state;\n const { align, column, hidden, label, resizing, width } = action;\n const targetColumn = columns.find((col) => col.name === column.name);\n if (targetColumn) {\n if (align === \"left\" || align === \"right\") {\n columns = replaceColumn(columns, { ...targetColumn, align });\n }\n if (typeof label === \"string\") {\n columns = replaceColumn(columns, { ...targetColumn, label });\n }\n if (typeof resizing === \"boolean\") {\n columns = replaceColumn(columns, { ...targetColumn, resizing });\n }\n if (typeof hidden === \"boolean\") {\n columns = replaceColumn(columns, { ...targetColumn, hidden });\n }\n if (typeof width === \"number\") {\n columns = replaceColumn(columns, { ...targetColumn, width });\n }\n }\n return {\n ...state,\n columns,\n };\n}\n\nfunction updateTableConfig(\n state: GridModel,\n { columns, confirmed, filter, groupBy, sort }: ColumnActionTableConfig\n) {\n const hasColumns = columns && columns.length > 0;\n const hasGroupBy = groupBy !== undefined;\n const hasFilter = typeof filter?.filter === \"string\";\n const hasSort = sort && sort.sortDefs.length > 0;\n\n //TODO check if just confirmed has changed\n\n let result = state;\n\n if (hasColumns) {\n result = {\n ...state,\n columns: columns.map((colName, index) => {\n const columnName = getColumnName(colName);\n const key = index + KEY_OFFSET;\n const col = findColumn(result.columns, columnName);\n if (col) {\n if (col.key === key) {\n return col;\n } else {\n return {\n ...col,\n key,\n };\n }\n }\n throw Error(`useTableModel column ${colName} not found`);\n }),\n };\n }\n\n if (hasGroupBy) {\n result = {\n ...state,\n columns: applyGroupByToColumns(result.columns, groupBy, confirmed),\n };\n }\n\n if (hasSort) {\n result = {\n ...state,\n columns: applySortToColumns(result.columns, sort),\n };\n }\n\n if (hasFilter) {\n result = {\n ...state,\n columns: applyFilterToColumns(result.columns, filter),\n };\n } else if (result.columns.some(isFilteredColumn)) {\n result = {\n ...state,\n columns: stripFilterFromColumns(result.columns),\n };\n }\n\n return result;\n}\n\nfunction replaceColumn(\n state: KeyedColumnDescriptor[],\n column: KeyedColumnDescriptor\n) {\n return state.map((col) => (col.name === column.name ? column : col));\n}\n", "import { useCallback, useRef } from \"react\";\nimport { Viewport } from \"./dataTableTypes\";\n\nexport interface ScrollRequestEnd {\n type: \"scroll-end\";\n direction: \"home\" | \"end\";\n}\n\nexport interface ScrollRequestPage {\n type: \"scroll-page\";\n direction: \"up\" | \"down\";\n}\n\nexport interface ScrollRequestDistance {\n type: \"scroll-distance\";\n distance: number;\n}\n\nexport type ScrollRequest =\n | ScrollRequestPage\n | ScrollRequestDistance\n | ScrollRequestEnd;\n\nexport type ScrollRequestHandler = (request: ScrollRequest) => void;\n\nconst getPctScroll = (container: HTMLElement) => {\n const { scrollLeft, scrollTop } = container;\n const { clientHeight, clientWidth, scrollHeight, scrollWidth } = container;\n const pctScrollLeft = scrollLeft / (scrollWidth - clientWidth);\n const pctScrollTop = scrollTop / (scrollHeight - clientHeight);\n return [pctScrollLeft, pctScrollTop];\n};\n\nconst getMaxScroll = (container: HTMLElement) => {\n const { clientHeight, clientWidth, scrollHeight, scrollWidth } = container;\n return [scrollWidth - clientWidth, scrollHeight - clientHeight];\n};\n\ninterface CallbackRefHookProps<T = HTMLElement> {\n onAttach?: (el: T) => void;\n onDetach: (el: T) => void;\n label?: string;\n}\n\nconst useCallbackRef = <T = HTMLElement>({\n onAttach,\n onDetach,\n}: CallbackRefHookProps<T>) => {\n const ref = useRef<T | null>(null);\n const callbackRef = useCallback(\n (el: T | null) => {\n if (el) {\n ref.current = el;\n onAttach?.(el);\n } else if (ref.current) {\n const { current: originalRef } = ref;\n ref.current = el;\n onDetach?.(originalRef);\n }\n },\n [onAttach, onDetach]\n );\n return callbackRef;\n};\n\nexport interface TableScrollHookProps {\n onHorizontalScroll?: (scrollLeft: number) => void;\n onVerticalScroll?: (scrollTop: number, pctScrollTop: number) => void;\n viewportHeight: number;\n viewport: Viewport;\n}\n\nexport const useTableScroll = ({\n onHorizontalScroll,\n onVerticalScroll,\n viewport,\n}: TableScrollHookProps) => {\n const contentContainerScrolledRef = useRef(false);\n\n const scrollPosRef = useRef({ scrollTop: 0, scrollLeft: 0 });\n const scrollbarContainerRef = useRef<HTMLDivElement | null>(null);\n const contentContainerRef = useRef<HTMLDivElement | null>(null);\n const {\n maxScrollContainerScrollHorizontal: maxScrollLeft,\n maxScrollContainerScrollVertical: maxScrollTop,\n } = viewport;\n\n const handleScrollbarContainerScroll = useCallback(() => {\n const { current: contentContainer } = contentContainerRef;\n const { current: scrollbarContainer } = scrollbarContainerRef;\n const { current: contentContainerScrolled } = contentContainerScrolledRef;\n if (contentContainerScrolled) {\n contentContainerScrolledRef.current = false;\n } else if (contentContainer && scrollbarContainer) {\n const [pctScrollLeft, pctScrollTop] = getPctScroll(scrollbarContainer);\n const [maxScrollLeft, maxScrollTop] = getMaxScroll(contentContainer);\n const rootScrollLeft = Math.round(pctScrollLeft * maxScrollLeft);\n const rootScrollTop = Math.round(pctScrollTop * maxScrollTop);\n contentContainer.scrollTo({\n left: rootScrollLeft,\n top: rootScrollTop,\n behavior: \"auto\",\n });\n }\n }, []);\n\n const handleContentContainerScroll = useCallback(() => {\n const { current: contentContainer } = contentContainerRef;\n const { current: scrollbarContainer } = scrollbarContainerRef;\n const { current: scrollPos } = scrollPosRef;\n\n if (contentContainer && scrollbarContainer) {\n const { scrollLeft, scrollTop } = contentContainer;\n const [pctScrollLeft, pctScrollTop] = getPctScroll(contentContainer);\n contentContainerScrolledRef.current = true;\n\n scrollbarContainer.scrollLeft = Math.round(pctScrollLeft * maxScrollLeft);\n scrollbarContainer.scrollTop = Math.round(pctScrollTop * maxScrollTop);\n\n if (scrollPos.scrollTop !== scrollTop) {\n scrollPos.scrollTop = scrollTop;\n onVerticalScroll?.(scrollTop, pctScrollTop);\n }\n if (scrollPos.scrollLeft !== scrollLeft) {\n scrollPos.scrollLeft = scrollLeft;\n onHorizontalScroll?.(scrollLeft);\n }\n }\n }, [maxScrollLeft, maxScrollTop, onHorizontalScroll, onVerticalScroll]);\n\n const handleAttachScrollbarContainer = useCallback(\n (el: HTMLDivElement) => {\n scrollbarContainerRef.current = el;\n el.addEventListener(\"scroll\", handleScrollbarContainerScroll, {\n passive: true,\n });\n },\n [handleScrollbarContainerScroll]\n );\n\n const handleDetachScrollbarContainer = useCallback(\n (el: HTMLDivElement) => {\n scrollbarContainerRef.current = null;\n el.removeEventListener(\"scroll\", handleScrollbarContainerScroll);\n },\n [handleScrollbarContainerScroll]\n );\n\n const handleAttachContentContainer = useCallback(\n (el: HTMLDivElement) => {\n contentContainerRef.current = el;\n el.addEventListener(\"scroll\", handleContentContainerScroll, {\n passive: true,\n });\n },\n [handleContentContainerScroll]\n );\n\n const handleDetachContentContainer = useCallback(\n (el: HTMLDivElement) => {\n contentContainerRef.current = null;\n el.removeEventListener(\"scroll\", handleContentContainerScroll);\n },\n [handleContentContainerScroll]\n );\n\n const contentContainerCallbackRef = useCallbackRef({\n onAttach: handleAttachContentContainer,\n onDetach: handleDetachContentContainer,\n });\n\n const scrollbarContainerCallbackRef = useCallbackRef({\n onAttach: handleAttachScrollbarContainer,\n onDetach: handleDetachScrollbarContainer,\n });\n\n const requestScroll: ScrollRequestHandler = useCallback(\n (scrollRequest) => {\n const { current: scrollbarContainer } = contentContainerRef;\n if (scrollbarContainer) {\n contentContainerScrolledRef.current = false;\n if (scrollRequest.type === \"scroll-page\") {\n const { clientHeight, scrollLeft, scrollTop } = scrollbarContainer;\n const { direction } = scrollRequest;\n const scrollBy = direction === \"down\" ? clientHeight : -clientHeight;\n const newScrollTop = Math.min(\n Math.max(0, scrollTop + scrollBy),\n maxScrollTop\n );\n scrollbarContainer.scrollTo({\n top: newScrollTop,\n left: scrollLeft,\n behavior: \"auto\",\n });\n } else if (scrollRequest.type === \"scroll-end\") {\n const { direction } = scrollRequest;\n const scrollTo = direction === \"end\" ? maxScrollTop : 0;\n scrollbarContainer.scrollTo({\n top: scrollTo,\n left: scrollbarContainer.scrollLeft,\n behavior: \"auto\",\n });\n }\n }\n },\n [maxScrollTop]\n );\n\n return {\n /** Ref to be assigned to ScrollbarContainer */\n scrollbarContainerRef: scrollbarContainerCallbackRef,\n /** Ref to be assigned to ContentContainer */\n contentContainerRef: contentContainerCallbackRef,\n /** Scroll the table */\n requestScroll,\n };\n};\n", "/**\n * This hook measures and calculates the values needed to manage layout\n * and virtualisation of the table. This includes measurements required\n * to support pinned columns.\n */\nimport {\n KeyedColumnDescriptor,\n TableHeadings,\n} from \"@vuu-ui/vuu-datagrid-types\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { MeasuredSize } from \"./useMeasuredContainer\";\nimport {\n actualRowPositioning,\n RowAtPositionFunc,\n RowOffsetFunc,\n RowPositioning,\n virtualRowPositioning,\n} from \"@vuu-ui/vuu-utils\";\n\nexport interface TableViewportHookProps {\n columns: KeyedColumnDescriptor[];\n headerHeight: number;\n headings: TableHeadings;\n rowCount: number;\n rowHeight: number;\n size?: MeasuredSize;\n}\n\nexport interface ViewportMeasurements {\n contentHeight: number;\n horizontalScrollbarHeight: number;\n maxScrollContainerScrollHorizontal: number;\n maxScrollContainerScrollVertical: number;\n pinnedWidthLeft: number;\n pinnedWidthRight: number;\n rowCount: number;\n contentWidth: number;\n totalHeaderHeight: number;\n verticalScrollbarWidth: number;\n viewportBodyHeight: number;\n}\n\nexport interface TableViewportHookResult extends ViewportMeasurements {\n getRowAtPosition: RowAtPositionFunc;\n getRowOffset: RowOffsetFunc;\n setPctScrollTop: (scrollPct: number) => void;\n}\n\n// Too simplistic, it depends on rowHeight\nconst MAX_RAW_ROWS = 1_500_000;\n\nconst UNMEASURED_VIEWPORT: TableViewportHookResult = {\n contentHeight: 0,\n contentWidth: 0,\n getRowAtPosition: () => -1,\n getRowOffset: () => -1,\n horizontalScrollbarHeight: 0,\n maxScrollContainerScrollHorizontal: 0,\n maxScrollContainerScrollVertical: 0,\n pinnedWidthLeft: 0,\n pinnedWidthRight: 0,\n rowCount: 0,\n setPctScrollTop: () => undefined,\n totalHeaderHeight: 0,\n verticalScrollbarWidth: 0,\n viewportBodyHeight: 0,\n};\n\nconst measurePinnedColumns = (columns: KeyedColumnDescriptor[]) => {\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 { pinnedWidthLeft, pinnedWidthRight, unpinnedWidth };\n};\n\nexport const useTableViewport = ({\n columns,\n headerHeight,\n headings,\n rowCount,\n rowHeight,\n size,\n}: TableViewportHookProps): TableViewportHookResult => {\n const pctScrollTopRef = useRef(0);\n const appliedRowCount = Math.min(rowCount, MAX_RAW_ROWS);\n const appliedContentHeight = appliedRowCount * rowHeight;\n const virtualContentHeight = rowCount * rowHeight;\n const virtualisedExtent = virtualContentHeight - appliedContentHeight;\n\n const { pinnedWidthLeft, pinnedWidthRight, unpinnedWidth } = useMemo(\n () => measurePinnedColumns(columns),\n [columns]\n );\n\n const [actualRowOffset, actualRowAtPosition] = useMemo<RowPositioning>(\n () => actualRowPositioning(rowHeight),\n [rowHeight]\n );\n\n const [getRowOffset, getRowAtPosition] = useMemo<RowPositioning>(() => {\n if (virtualisedExtent) {\n return virtualRowPositioning(\n rowHeight,\n virtualisedExtent,\n pctScrollTopRef\n );\n } else {\n return [actualRowOffset, actualRowAtPosition];\n }\n }, [actualRowAtPosition, actualRowOffset, virtualisedExtent, rowHeight]);\n\n const setPctScrollTop = useCallback((scrollPct: number) => {\n pctScrollTopRef.current = scrollPct;\n }, []);\n\n return useMemo(() => {\n if (size) {\n const headingsDepth = headings.length;\n const scrollbarSize = 15;\n const contentWidth = pinnedWidthLeft + unpinnedWidth + pinnedWidthRight;\n const horizontalScrollbarHeight =\n contentWidth > size.width ? scrollbarSize : 0;\n const totalHeaderHeight = headerHeight * (1 + headingsDepth);\n const maxScrollContainerScrollVertical =\n appliedContentHeight -\n ((size?.height ?? 0) - horizontalScrollbarHeight) +\n totalHeaderHeight;\n const maxScrollContainerScrollHorizontal =\n contentWidth - size.width + pinnedWidthLeft;\n const visibleRows = (size.height - headerHeight) / rowHeight;\n const count = Number.isInteger(visibleRows)\n ? visibleRows + 1\n : Math.ceil(visibleRows);\n const viewportBodyHeight = size.height - totalHeaderHeight;\n const verticalScrollbarWidth =\n appliedContentHeight > viewportBodyHeight ? scrollbarSize : 0;\n\n return {\n contentHeight: appliedContentHeight,\n getRowAtPosition,\n getRowOffset,\n horizontalScrollbarHeight,\n maxScrollContainerScrollHorizontal,\n maxScrollContainerScrollVertical,\n pinnedWidthLeft,\n pinnedWidthRight,\n rowCount: count,\n contentWidth,\n setPctScrollTop,\n totalHeaderHeight,\n verticalScrollbarWidth,\n viewportBodyHeight,\n };\n } else {\n return UNMEASURED_VIEWPORT;\n }\n }, [\n size,\n headings.length,\n pinnedWidthLeft,\n unpinnedWidth,\n pinnedWidthRight,\n appliedContentHeight,\n headerHeight,\n rowHeight,\n getRowAtPosition,\n getRowOffset,\n setPctScrollTop,\n ]);\n};\n", "import { KeyedColumnDescriptor } from \"@vuu-ui/vuu-datagrid-types\";\nimport {\n getColumnsInViewport,\n itemsChanged,\n RowAtPositionFunc,\n} from \"@vuu-ui/vuu-utils\";\nimport { VuuRange } from \"@vuu-ui/vuu-protocol-types\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { ViewportMeasurements } from \"./useTableViewport\";\n\nexport interface VirtualViewportHookProps {\n columns: KeyedColumnDescriptor[];\n getRowAtPosition: RowAtPositionFunc;\n setRange: (range: VuuRange) => void;\n viewportMeasurements: ViewportMeasurements;\n}\nexport interface VirtualViewportHookResult {\n onHorizontalScroll: (scrollLeft: number) => void;\n onVerticalScroll: (scrollTop: number) => void;\n columnsWithinViewport: KeyedColumnDescriptor[];\n virtualColSpan: number;\n}\n\nexport const useVirtualViewport = ({\n columns,\n getRowAtPosition,\n setRange,\n viewportMeasurements,\n}: VirtualViewportHookProps): VirtualViewportHookResult => {\n const firstRowRef = useRef<number>(-1);\n const {\n rowCount: viewportRowCount,\n contentWidth,\n maxScrollContainerScrollHorizontal,\n } = viewportMeasurements;\n // double check this ...\n const availableWidth = contentWidth - maxScrollContainerScrollHorizontal;\n const scrollLeftRef = useRef(0);\n\n const [visibleColumns, preSpan] = useMemo(\n () =>\n getColumnsInViewport(\n columns,\n scrollLeftRef.current,\n scrollLeftRef.current + availableWidth\n ),\n [availableWidth, columns]\n );\n\n const preSpanRef = useRef(preSpan);\n\n useEffect(() => {\n setColumnsWithinViewport(visibleColumns);\n }, [visibleColumns]);\n\n const [columnsWithinViewport, setColumnsWithinViewport] =\n useState<KeyedColumnDescriptor[]>(visibleColumns);\n\n const handleHorizontalScroll = useCallback(\n (scrollLeft: number) => {\n scrollLeftRef.current = scrollLeft;\n const [visibleColumns, pre] = getColumnsInViewport(\n columns,\n scrollLeft,\n scrollLeft + availableWidth\n );\n if (itemsChanged(columnsWithinViewport, visibleColumns)) {\n preSpanRef.current = pre;\n\n setColumnsWithinViewport(visibleColumns);\n }\n },\n [availableWidth, columns, columnsWithinViewport]\n );\n\n const handleVerticalScroll = useCallback(\n (scrollTop: number) => {\n const firstRow = getRowAtPosition(scrollTop);\n if (firstRow !== firstRowRef.current) {\n firstRowRef.current = firstRow;\n setRange({ from: firstRow, to: firstRow + viewportRowCount });\n }\n },\n [getRowAtPosition, setRange, viewportRowCount]\n );\n\n return {\n columnsWithinViewport,\n onHorizontalScroll: handleHorizontalScroll,\n onVerticalScroll: handleVerticalScroll,\n /** number of leading columns not rendered because of virtualization */\n virtualColSpan: preSpanRef.current,\n };\n};\n", "import { TableCellProps } from \"@vuu-ui/vuu-datagrid-types\";\nimport cx from \"classnames\";\nimport {\n isJsonAttribute,\n metadataKeys,\n registerComponent,\n} from \"@vuu-ui/vuu-utils\";\n\nimport \"./JsonCell.css\";\n\nconst classBase = \"vuuJsonCell\";\n\nconst { IS_EXPANDED, KEY } = metadataKeys;\n\nconst localKey = (key: string) => {\n const pos = key.lastIndexOf(\"|\");\n if (pos === -1) {\n return \"\";\n } else {\n return key.slice(pos + 1);\n }\n};\n\nconst JsonCell = ({ column, row }: TableCellProps) => {\n const { key: columnKey /*, type, valueFormatter */ } = column;\n let value = row[columnKey];\n let isToggle = false;\n if (isJsonAttribute(value)) {\n value = value.slice(0, -1);\n isToggle = true;\n }\n const rowKey = localKey(row[KEY]);\n const className = cx({\n [`${classBase}-name`]: rowKey === value,\n [`${classBase}-value`]: rowKey !== value,\n [`${classBase}-group`]: isToggle,\n });\n\n if (isToggle) {\n const toggleIcon = row[IS_EXPANDED] ? \"minus-box\" : \"plus-box\";\n return (\n <span className={className}>\n <span className={`${classBase}-value`}>{value}</span>\n <span className={`${classBase}-toggle`} data-icon={toggleIcon} />\n </span>\n );\n } else if (value) {\n return <span className={className}>{value}</span>;\n } else {\n return null;\n }\n};\n\nregisterComponent(\"json\", JsonCell, \"cell-renderer\", {});\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["export * from \"./context-menu\";\nexport * from \"./dataTableTypes\";\nexport * from \"./Table\";\nexport * from \"./useMeasuredContainer\";\nexport * from \"./useTableModel\";\nexport * from \"./useTableViewport\";\nexport * from \"./cell-renderers\";\n", "import { DataSource } from \"@vuu-ui/vuu-data\";\nimport { KeyedColumnDescriptor, PinLocation } from \"@vuu-ui/vuu-datagrid-types\";\nimport { Filter } from \"@vuu-ui/vuu-filter-types\";\nimport { ContextMenuItemDescriptor, MenuBuilder } from \"@vuu-ui/vuu-popups\";\nimport { isNumericColumn } from \"@vuu-ui/vuu-utils\";\n\nexport type ContextMenuLocation = \"header\" | \"filter\" | \"grid\";\n\ntype MaybeColumn = { column?: KeyedColumnDescriptor };\ntype MaybeFilter = { filter?: Filter };\n\nexport const buildContextMenuDescriptors =\n (dataSource?: DataSource): MenuBuilder =>\n (location, options) => {\n const descriptors: ContextMenuItemDescriptor[] = [];\n if (dataSource === undefined) {\n return descriptors;\n }\n if (location === \"header\") {\n descriptors.push(\n ...buildSortMenuItems(options as MaybeColumn, dataSource)\n );\n descriptors.push(\n ...buildGroupMenuItems(options as MaybeColumn, dataSource)\n );\n descriptors.push(\n ...buildAggregationMenuItems(options as MaybeColumn, dataSource)\n );\n descriptors.push(...buildColumnDisplayMenuItems(options as MaybeColumn));\n } else if (location === \"filter\") {\n const { column, filter } = options as MaybeFilter & MaybeColumn;\n const colIsOnlyFilter = filter?.column === column?.name;\n descriptors.push({\n label: \"Edit filter\",\n action: \"filter-edit\",\n options,\n });\n\n descriptors.push({\n label: \"Remove filter\",\n action: \"filter-remove-column\",\n options,\n });\n\n if (column && !colIsOnlyFilter) {\n // TODO col might still be the only column in the filter if it is\n // involved in all clauses\n descriptors.push({\n label: `Remove all filters`,\n action: \"remove-filters\",\n options,\n });\n }\n }\n\n // if (options?.selectedRowCount){\n // // TODO pass the table name\n // const rpcActions = getRpcActions();\n // for (let {label, method} of rpcActions){\n // descriptors.push({action: Action.RpcCall, label, options: {method}})\n // }\n // }\n\n return descriptors;\n };\n\nfunction buildSortMenuItems(\n options: MaybeColumn,\n { sort: { sortDefs } }: DataSource\n): ContextMenuItemDescriptor[] {\n const { column } = options;\n const menuItems: ContextMenuItemDescriptor[] = [];\n if (column === undefined) {\n return menuItems;\n }\n\n const hasSort = sortDefs.length > 0;\n\n if (column.sorted === \"A\") {\n menuItems.push({\n label: \"Reverse Sort (DSC)\",\n action: \"sort-dsc\",\n options,\n });\n } else if (column.sorted === \"D\") {\n menuItems.push({\n label: \"Reverse Sort (ASC)\",\n action: \"sort-asc\",\n options,\n });\n } else if (typeof column.sorted === \"number\") {\n if (column.sorted > 0) {\n menuItems.push({\n label: \"Reverse Sort (DSC)\",\n action: \"sort-add-dsc\",\n options,\n });\n } else {\n menuItems.push({\n label: \"Reverse Sort (ASC)\",\n action: \"sort-add-asc\",\n options,\n });\n }\n\n // removing the last column from a sort would be a no-op, so pointless\n if (hasSort && Math.abs(column.sorted) < sortDefs.length) {\n menuItems.push({\n label: \"Remove from sort\",\n action: \"sort-remove\",\n options,\n });\n }\n\n menuItems.push({\n label: \"New Sort\",\n children: [\n { label: \"Ascending\", action: \"sort-asc\", options },\n { label: \"Descending\", action: \"sort-dsc\", options },\n ],\n });\n } else if (hasSort) {\n menuItems.push({\n label: \"Add to sort\",\n children: [\n { label: \"Ascending\", action: \"sort-add-asc\", options },\n { label: \"Descending\", action: \"sort-add-dsc\", options },\n ],\n });\n menuItems.push({\n label: \"New Sort\",\n children: [\n { label: \"Ascending\", action: \"sort-asc\", options },\n { label: \"Descending\", action: \"sort-dsc\", options },\n ],\n });\n } else {\n menuItems.push({\n label: \"Sort\",\n children: [\n { label: \"Ascending\", action: \"sort-asc\", options },\n { label: \"Descending\", action: \"sort-dsc\", options },\n ],\n });\n }\n return menuItems;\n}\n\nfunction buildAggregationMenuItems(\n options: MaybeColumn,\n dataSource: DataSource\n): ContextMenuItemDescriptor[] {\n const { column } = options;\n if (column === undefined || dataSource.groupBy.length === 0) {\n return [];\n }\n const { name, label = name } = column;\n\n return [\n {\n label: `Aggregate ${label}`,\n children: [\n { label: \"Count\", action: \"agg-count\", options },\n { label: \"Distinct\", action: \"agg-distinct\", options },\n ].concat(\n isNumericColumn(column)\n ? [\n { label: \"Sum\", action: \"agg-sum\", options },\n { label: \"Avg\", action: \"agg-avg\", options },\n { label: \"High\", action: \"agg-high\", options },\n { label: \"Low\", action: \"agg-low\", options },\n ]\n : []\n ),\n },\n ];\n}\n\nconst pinColumn = (options: unknown, pinLocation: PinLocation) =>\n ({\n label: `Pin ${pinLocation}`,\n action: `column-pin-${pinLocation}`,\n options,\n } as ContextMenuItemDescriptor);\n\nconst pinLeft = (options: unknown) => pinColumn(options, \"left\");\nconst pinFloating = (options: unknown) => pinColumn(options, \"floating\");\nconst pinRight = (options: unknown) => pinColumn(options, \"right\");\n\nfunction buildColumnDisplayMenuItems(\n options: MaybeColumn\n): ContextMenuItemDescriptor[] {\n const { column } = options;\n if (column === undefined) {\n return [];\n }\n const { pin } = column;\n\n const menuItems: ContextMenuItemDescriptor[] = [\n {\n label: `Hide column`,\n action: \"column-hide\",\n options,\n },\n {\n label: `Remove column`,\n action: \"column-remove\",\n options,\n },\n ];\n\n if (pin === undefined) {\n menuItems.push({\n label: `Pin column`,\n children: [pinLeft(options), pinFloating(options), pinRight(options)],\n });\n } else if (pin === \"left\") {\n menuItems.push(\n { label: \"Unpin column\", action: \"column-unpin\", options },\n {\n label: `Pin column`,\n children: [pinFloating(options), pinRight(options)],\n }\n );\n } else if (pin === \"right\") {\n menuItems.push(\n { label: \"Unpin column\", action: \"column-unpin\", options },\n {\n label: `Pin column`,\n children: [pinLeft(options), pinFloating(options)],\n }\n );\n } else if (pin === \"floating\") {\n menuItems.push(\n { label: \"Unpin column\", action: \"column-unpin\", options },\n {\n label: `Pin column`,\n children: [pinLeft(options), pinRight(options)],\n }\n );\n }\n\n return menuItems;\n}\n\nfunction buildGroupMenuItems(\n options: MaybeColumn,\n { groupBy }: DataSource\n): ContextMenuItemDescriptor[] {\n const { column } = options;\n const menuItems: ContextMenuItemDescriptor[] = [];\n if (column === undefined) {\n return menuItems;\n }\n\n const { name, label = name } = column;\n\n if (groupBy.length === 0) {\n menuItems.push({\n label: `Group by ${label}`,\n action: \"group\",\n options,\n });\n } else {\n menuItems.push({\n label: `Add ${label} to group by`,\n action: \"group-add\",\n options,\n });\n }\n\n return menuItems;\n}\n", "/* eslint-disable no-sequences */\nimport { DataSource } from \"@vuu-ui/vuu-data\";\nimport { KeyedColumnDescriptor } from \"@vuu-ui/vuu-datagrid-types\";\nimport { Filter } from \"@vuu-ui/vuu-filter-types\";\nimport { removeColumnFromFilter } from \"@vuu-ui/vuu-filters\";\nimport { MenuActionHandler } from \"@vuu-ui/vuu-popups\";\nimport { VuuFilter } from \"@vuu-ui/vuu-protocol-types\";\nimport { DataSourceFilter } from \"@vuu-ui/vuu-data-types\";\nimport { PersistentColumnAction } from \"../useTableModel\";\nimport {\n addGroupColumn,\n addSortColumn,\n AggregationType,\n setAggregations,\n setSortColumn,\n} from \"@vuu-ui/vuu-utils\";\n\nexport interface ContextMenuOptions {\n column?: KeyedColumnDescriptor;\n filter?: Filter;\n sort?: VuuFilter;\n}\nexport interface ContextMenuHookProps {\n dataSource?: DataSource;\n onPersistentColumnOperation: (action: PersistentColumnAction) => void;\n}\n\nconst removeFilterColumn = (\n dataSourceFilter: DataSourceFilter,\n column: KeyedColumnDescriptor\n) => {\n if (dataSourceFilter.filterStruct && column) {\n const [filterStruct, filter] = removeColumnFromFilter(\n column,\n dataSourceFilter.filterStruct\n );\n return {\n filter,\n filterStruct,\n };\n } else {\n return dataSourceFilter;\n }\n};\n\nconst { Average, Count, Distinct, High, Low, Sum } = AggregationType;\n\nexport const useTableContextMenu = ({\n dataSource,\n onPersistentColumnOperation,\n}: ContextMenuHookProps) => {\n /** return {boolean} used by caller to determine whether to forward to additional installed context menu handlers */\n const handleContextMenuAction: MenuActionHandler = (\n type,\n options\n ): boolean => {\n const gridOptions = options as ContextMenuOptions;\n if (gridOptions.column && dataSource) {\n const { column } = gridOptions;\n // prettier-ignore\n switch(type){\n case \"sort-asc\": return (dataSource.sort = setSortColumn(dataSource.sort, column, \"A\")), true;\n case \"sort-dsc\": return (dataSource.sort = setSortColumn(dataSource.sort, column, \"D\")), true;\n case \"sort-add-asc\": return (dataSource.sort = addSortColumn(dataSource.sort, column, \"A\")), true;\n case \"sort-add-dsc\": return (dataSource.sort = addSortColumn(dataSource.sort, column, \"D\")), true;\n case \"group\": return (dataSource.groupBy = addGroupColumn(dataSource.groupBy, column)), true;\n case \"group-add\": return (dataSource.groupBy = addGroupColumn(dataSource.groupBy, column)), true;\n case \"column-hide\": return onPersistentColumnOperation({type: \"hideColumns\", columns: [column]}), true;\n case \"column-remove\": return (dataSource.columns = dataSource.columns.filter(name => name !== column.name)), true\n case \"filter-remove-column\": return (dataSource.filter = removeFilterColumn(dataSource.filter, column)), true;\n case \"remove-filters\": return (dataSource.filter = {filter:\"\"}), true;\n case \"agg-avg\": return dataSource.aggregations = (setAggregations(dataSource.aggregations, column, Average)), true;\n case \"agg-high\": return dataSource.aggregations = (setAggregations(dataSource.aggregations, column, High)), true;\n case \"agg-low\": return dataSource.aggregations = (setAggregations(dataSource.aggregations, column, Low)), true;\n case \"agg-count\": return dataSource.aggregations = (setAggregations(dataSource.aggregations, column, Count)), true;\n case \"agg-distinct\": return dataSource.aggregations = (setAggregations(dataSource.aggregations, column, Distinct)), true;\n case \"agg-sum\": return dataSource.aggregations = (setAggregations(dataSource.aggregations, column, Sum)), true;\n case \"column-pin-floating\": return onPersistentColumnOperation({type: \"pinColumn\", column, pin: \"floating\"}), true;\n case \"column-pin-left\": return onPersistentColumnOperation({type: \"pinColumn\", column, pin: \"left\"}), true;\n case \"column-pin-right\": return onPersistentColumnOperation({type: \"pinColumn\", column, pin: \"right\"}), true;\n case \"column-unpin\": return onPersistentColumnOperation({type: \"pinColumn\", column, pin: undefined}), true\n default:\n }\n }\n return false;\n };\n\n return handleContextMenuAction;\n};\n", "import { ContextMenuProvider } from \"@vuu-ui/vuu-popups\";\nimport { Button, useIdMemo } from \"@salt-ds/core\";\nimport { CSSProperties } from \"react\";\nimport { buildContextMenuDescriptors } from \"./context-menu\";\nimport { TableProps } from \"./dataTableTypes\";\n// import { RowBasedTable } from \"./RowBasedTable\";\nimport { RowBasedTable } from \"./RowBasedTable\";\nimport { useTable } from \"./useTable\";\nimport cx from \"classnames\";\n\nimport \"./Table.css\";\nimport \"./Table-loading.css\";\n\nimport { isDataLoading } from \"@vuu-ui/vuu-utils\";\n\nconst classBase = \"vuuTable\";\n\nexport const Table = ({\n allowConfigEditing: showSettings = false,\n className: classNameProp,\n config,\n dataSource,\n headerHeight = 25,\n height,\n id: idProp,\n onConfigChange,\n onFeatureEnabled,\n onFeatureInvocation,\n onSelectionChange,\n onShowConfigEditor: onShowSettings,\n renderBufferSize = 0,\n rowHeight = 20,\n selectionModel = \"extended\",\n style: styleProp,\n width,\n zebraStripes = false,\n ...htmlAttributes\n}: TableProps) => {\n const id = useIdMemo(idProp);\n const {\n containerMeasurements: { containerRef, innerSize, outerSize },\n containerProps,\n dispatchColumnAction,\n draggable,\n draggedItemIndex,\n handleContextMenuAction,\n scrollProps,\n viewportMeasurements,\n ...tableProps\n } = useTable({\n config,\n dataSource,\n renderBufferSize,\n headerHeight,\n height,\n onConfigChange,\n onFeatureEnabled,\n onFeatureInvocation,\n onSelectionChange,\n rowHeight,\n selectionModel,\n width,\n });\n\n const style = {\n ...outerSize,\n \"--content-height\": `${viewportMeasurements.contentHeight}px`,\n \"--horizontal-scrollbar-height\": `${viewportMeasurements.horizontalScrollbarHeight}px`,\n \"--content-width\": `${viewportMeasurements.contentWidth}px`,\n \"--pinned-width-left\": `${viewportMeasurements.pinnedWidthLeft}px`,\n \"--pinned-width-right\": `${viewportMeasurements.pinnedWidthRight}px`,\n \"--header-height\": `${headerHeight}px`,\n \"--row-height\": `${rowHeight}px`,\n \"--table-height\": `${innerSize?.height}px`,\n \"--table-width\": `${innerSize?.width}px`,\n \"--total-header-height\": `${viewportMeasurements.totalHeaderHeight}px`,\n \"--vertical-scrollbar-width\": `${viewportMeasurements.verticalScrollbarWidth}px`,\n \"--viewport-body-height\": `${viewportMeasurements.viewportBodyHeight}px`,\n } as CSSProperties;\n\n const className = cx(classBase, classNameProp, {\n [`${classBase}-zebra`]: zebraStripes,\n [`${classBase}-loading`]: isDataLoading(tableProps.columns),\n });\n\n return (\n <ContextMenuProvider\n menuActionHandler={handleContextMenuAction}\n menuBuilder={buildContextMenuDescriptors(dataSource)}\n >\n <div\n {...htmlAttributes}\n {...containerProps}\n className={className}\n id={id}\n ref={containerRef}\n style={style}\n tabIndex={-1}\n >\n {innerSize ? (\n <div\n className={`${classBase}-scrollbarContainer`}\n ref={scrollProps.scrollbarContainerRef}\n >\n <div className={`${classBase}-scrollbarContent`} />\n </div>\n ) : null}\n {innerSize ? (\n <div\n className={`${classBase}-contentContainer`}\n ref={scrollProps.contentContainerRef}\n >\n <RowBasedTable\n {...tableProps}\n headerHeight={headerHeight}\n tableId={id}\n />\n {draggable}\n </div>\n ) : null}\n {showSettings && innerSize ? (\n <Button\n className={`${classBase}-settings`}\n data-icon=\"settings\"\n onClick={onShowSettings}\n variant=\"secondary\"\n />\n ) : null}\n </div>\n </ContextMenuProvider>\n );\n};\n", "import {\n buildColumnMap,\n getColumnStyle,\n isGroupColumn,\n metadataKeys,\n notHidden,\n visibleColumnAtIndex,\n} from \"@vuu-ui/vuu-utils\";\nimport { MouseEvent, useCallback, useMemo } from \"react\";\nimport { TableImplementationProps } from \"./dataTableTypes\";\nimport { TableRow } from \"./TableRow\";\nimport { TableGroupHeaderCell } from \"./TableGroupHeaderCell\";\nimport { TableHeaderCell } from \"./TableHeaderCell\";\n\nimport \"./RowBasedTable.css\";\n\nconst classBase = \"vuuTable\";\nconst { RENDER_IDX } = metadataKeys;\n\nexport const RowBasedTable = ({\n columns,\n columnsWithinViewport,\n data,\n getRowOffset,\n headings,\n onColumnResize,\n onHeaderCellDragStart,\n onContextMenu,\n onRemoveColumnFromGroupBy,\n onRowClick,\n onSort,\n onToggleGroup,\n tableId,\n virtualColSpan = 0,\n rowCount,\n}: TableImplementationProps) => {\n const handleDragStart = useCallback(\n (evt: MouseEvent) => {\n onHeaderCellDragStart?.(evt);\n },\n [onHeaderCellDragStart]\n );\n\n const visibleColumns = useMemo(() => {\n return columns.filter(notHidden);\n }, [columns]);\n\n const columnMap = useMemo(() => buildColumnMap(columns), [columns]);\n\n const handleHeaderClick = useCallback(\n (evt: MouseEvent) => {\n const targetElement = evt.target as HTMLElement;\n const headerCell = targetElement.closest(\n \".vuuTable-headerCell\"\n ) as HTMLElement;\n const colIdx = parseInt(headerCell?.dataset.idx ?? \"-1\");\n const column = visibleColumnAtIndex(columns, colIdx);\n const isAdditive = evt.shiftKey;\n column && onSort(column, isAdditive);\n },\n [columns, onSort]\n );\n\n return (\n <div aria-rowcount={rowCount} className={`${classBase}-table`} role=\"table\">\n <div className={`${classBase}-headers`} role=\"rowGroup\">\n {headings.map((colHeaders, i) => (\n <div className=\"vuuTable-heading\" key={i}>\n {colHeaders.map(({ label, width }, j) => (\n <div key={j} className=\"vuuTable-headingCell\" style={{ width }}>\n {label}\n </div>\n ))}\n </div>\n ))}\n <div role=\"row\">\n {visibleColumns.map((column, i) => {\n const style = getColumnStyle(column);\n return isGroupColumn(column) ? (\n <TableGroupHeaderCell\n column={column}\n data-idx={i}\n key={i}\n onRemoveColumn={onRemoveColumnFromGroupBy}\n onResize={onColumnResize}\n role=\"columnHeader\"\n style={style}\n />\n ) : (\n <TableHeaderCell\n column={column}\n data-idx={i}\n id={`${tableId}-${i}`}\n key={i}\n onClick={handleHeaderClick}\n onDragStart={handleDragStart}\n onResize={onColumnResize}\n role=\"columnHeader\"\n style={style}\n />\n );\n })}\n </div>\n </div>\n <div\n className={`${classBase}-body`}\n onContextMenu={onContextMenu}\n role=\"rowGroup\"\n >\n {data?.map((row) => (\n <TableRow\n columnMap={columnMap}\n columns={columnsWithinViewport}\n offset={getRowOffset(row)}\n key={row[RENDER_IDX]}\n onClick={onRowClick}\n virtualColSpan={virtualColSpan}\n onToggleGroup={onToggleGroup}\n row={row}\n />\n ))}\n </div>\n </div>\n );\n};\n", "import { DataSourceRow } from \"@vuu-ui/vuu-data\";\nimport { KeyedColumnDescriptor } from \"@vuu-ui/vuu-datagrid-types\";\nimport {\n ColumnMap,\n isGroupColumn,\n isJsonColumn,\n isJsonGroup,\n metadataKeys,\n notHidden,\n} from \"@vuu-ui/vuu-utils\";\nimport cx from \"classnames\";\nimport { HTMLAttributes, memo, MouseEvent, useCallback } from \"react\";\nimport { RowClickHandler } from \"./dataTableTypes\";\nimport { TableCell } from \"./TableCell\";\nimport { TableGroupCell } from \"./TableGroupCell\";\n\nimport \"./TableRow.css\";\n\nconst { IDX, IS_EXPANDED, SELECTED } = metadataKeys;\nconst classBase = \"vuuTableRow\";\n\nexport interface RowProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"children\" | \"onClick\"> {\n columnMap: ColumnMap;\n columns: KeyedColumnDescriptor[];\n offset: number;\n onClick?: RowClickHandler;\n onToggleGroup?: (row: DataSourceRow, column: KeyedColumnDescriptor) => void;\n row: DataSourceRow;\n virtualColSpan?: number;\n}\n\nexport const TableRow = memo(function Row({\n columnMap,\n columns,\n offset,\n onClick,\n onToggleGroup,\n virtualColSpan = 0,\n row,\n}: RowProps) {\n const {\n [IDX]: rowIndex,\n [IS_EXPANDED]: isExpanded,\n [SELECTED]: isSelected,\n } = row;\n\n const className = cx(classBase, {\n [`${classBase}-even`]: rowIndex % 2 === 0,\n [`${classBase}-expanded`]: isExpanded,\n [`${classBase}-preSelected`]: isSelected === 2,\n });\n\n const handleRowClick = useCallback(\n (evt: MouseEvent) => {\n const rangeSelect = evt.shiftKey;\n const keepExistingSelection = evt.ctrlKey || evt.metaKey; /* mac only */\n onClick?.(row, rangeSelect, keepExistingSelection);\n },\n [onClick, row]\n );\n\n const handleGroupCellClick = useCallback(\n (evt: MouseEvent, column: KeyedColumnDescriptor) => {\n if (isGroupColumn(column) || isJsonGroup(column, row)) {\n evt.stopPropagation();\n onToggleGroup?.(row, column);\n }\n },\n [onToggleGroup, row]\n );\n\n return (\n <div\n aria-selected={isSelected === 1 ? true : undefined}\n aria-rowindex={rowIndex}\n className={className}\n onClick={handleRowClick}\n role=\"row\"\n style={{\n transform: `translate3d(0px, ${offset}px, 0px)`,\n }}\n >\n {virtualColSpan > 0 ? (\n <div role=\"cell\" style={{ width: virtualColSpan }} />\n ) : null}\n {columns.filter(notHidden).map((column) => {\n const isGroup = isGroupColumn(column);\n const isJsonCell = isJsonColumn(column);\n const Cell = isGroup ? TableGroupCell : TableCell;\n return (\n <Cell\n column={column}\n columnMap={columnMap}\n key={column.name}\n onClick={isGroup || isJsonCell ? handleGroupCellClick : undefined}\n row={row}\n />\n );\n })}\n </div>\n );\n});\n", "import { TableCellProps } from \"@vuu-ui/vuu-datagrid-types\";\nimport { getColumnStyle, metadataKeys } from \"@vuu-ui/vuu-utils\";\nimport { EditableLabel } from \"@heswell/salt-lab\";\nimport cx from \"classnames\";\nimport {\n KeyboardEvent,\n memo,\n MouseEvent,\n useCallback,\n useRef,\n useState,\n} from \"react\";\n\nimport \"./TableCell.css\";\n\nconst { KEY } = metadataKeys;\n\nexport const TableCell = memo(\n ({\n className: classNameProp,\n column,\n columnMap,\n onClick,\n row,\n }: TableCellProps) => {\n const labelFieldRef = useRef<HTMLDivElement>(null);\n const {\n align,\n CellRenderer,\n key,\n pin,\n editable,\n resizing,\n valueFormatter,\n } = column;\n const [editing, setEditing] = useState<boolean>(false);\n const value = valueFormatter(row[key]);\n const [editableValue, setEditableValue] = useState<string>(value);\n const handleTitleMouseDown = () => {\n labelFieldRef.current?.focus();\n };\n const handleTitleKeyDown = (evt: KeyboardEvent<HTMLTableCellElement>) => {\n if (evt.key === \"Enter\") {\n setEditing(true);\n }\n };\n\n const handleClick = useCallback(\n (evt: MouseEvent) => {\n onClick?.(evt, column);\n },\n [column, onClick]\n );\n\n const handleEnterEditMode = () => {\n setEditing(true);\n };\n\n const handleExitEditMode = (\n originalValue = \"\",\n finalValue = \"\",\n allowDeactivation = true,\n editCancelled = false\n ) => {\n setEditing(false);\n if (editCancelled) {\n setEditableValue(originalValue);\n } else if (finalValue !== originalValue) {\n setEditableValue(finalValue);\n }\n if (allowDeactivation === false) {\n labelFieldRef.current?.focus();\n }\n };\n\n // might want to useMemo here, this won't change often\n const className =\n cx(classNameProp, {\n vuuAlignRight: align === \"right\",\n vuuPinFloating: pin === \"floating\",\n vuuPinLeft: pin === \"left\",\n vuuPinRight: pin === \"right\",\n \"vuuTableCell-resizing\": resizing,\n }) || undefined;\n const style = getColumnStyle(column);\n return editable ? (\n <div\n className={className}\n data-editable\n role=\"cell\"\n style={style}\n onKeyDown={handleTitleKeyDown}\n >\n <EditableLabel\n editing={editing}\n key=\"title\"\n value={editableValue}\n onChange={setEditableValue}\n onMouseDownCapture={handleTitleMouseDown}\n onEnterEditMode={handleEnterEditMode}\n onExitEditMode={handleExitEditMode}\n onKeyDown={handleTitleKeyDown}\n ref={labelFieldRef}\n tabIndex={0}\n />\n </div>\n ) : (\n <div\n className={className}\n role=\"cell\"\n style={style}\n onClick={handleClick}\n >\n {CellRenderer ? (\n <CellRenderer column={column} columnMap={columnMap} row={row} />\n ) : (\n value\n )}\n </div>\n );\n },\n cellValuesAreEqual\n);\nTableCell.displayName = \"TableCell\";\n\nfunction cellValuesAreEqual(prev: TableCellProps, next: TableCellProps) {\n return (\n prev.column === next.column &&\n prev.onClick === next.onClick &&\n prev.row[KEY] === next.row[KEY] &&\n prev.row[prev.column.key] === next.row[next.column.key]\n );\n}\n", "import { DataSourceRow } from \"@vuu-ui/vuu-data\";\nimport {\n GroupColumnDescriptor,\n KeyedColumnDescriptor,\n TableCellProps,\n} from \"@vuu-ui/vuu-datagrid-types\";\nimport { getColumnStyle, metadataKeys } from \"@vuu-ui/vuu-utils\";\nimport { MouseEvent, useCallback } from \"react\";\n\nimport \"./TableGroupCell.css\";\n\nconst { DEPTH, IS_LEAF } = metadataKeys;\n\nexport const getGroupValueAndOffset = (\n columns: KeyedColumnDescriptor[],\n row: DataSourceRow\n): [unknown, number] => {\n const { [DEPTH]: depth, [IS_LEAF]: isLeaf } = row;\n // Depth can be greater tha group columns when we have just removed a column from groupby\n // but new data has not yet been received.\n if (isLeaf || depth > columns.length) {\n return [null, depth === null ? 0 : Math.max(0, depth - 1)];\n } else if (depth === 0) {\n return [\"$root\", 0];\n } else {\n // offset 1 for now to allow for $root\n const { key, valueFormatter } = columns[depth - 1];\n const value = valueFormatter(row[key]);\n return [value, depth - 1];\n }\n};\n\nexport const TableGroupCell = ({ column, onClick, row }: TableCellProps) => {\n const { columns } = column as GroupColumnDescriptor;\n const [value, offset] = getGroupValueAndOffset(columns, row);\n\n const handleClick = useCallback(\n (evt: MouseEvent) => {\n onClick?.(evt, column);\n },\n [column, onClick]\n );\n\n // const style = {\n // left: column.pin == \"left\" ? column.pinnedOffset : undefined,\n // };\n const style = getColumnStyle(column);\n const isLeaf = row[IS_LEAF];\n const spacers = Array(offset)\n .fill(0)\n .map((n, i) => <span className=\"vuuTableGroupCell-spacer\" key={i} />);\n return (\n <div\n className={\"vuuTableGroupCell vuuPinLeft\"}\n onClick={isLeaf ? undefined : handleClick}\n role=\"cell\"\n style={style}\n >\n {spacers}\n {isLeaf ? null : (\n <span className=\"vuuTableGroupCell-toggle\" data-icon=\"triangle-right\" />\n )}\n <span>{value}</span>\n </div>\n );\n};\n", "import cx from \"classnames\";\nimport { HTMLAttributes, useRef } from \"react\";\nimport { ColumnResizer } from \"./ColumnResizer\";\nimport { TableHeaderCellProps } from \"./TableHeaderCell\";\n\nimport \"./TableGroupHeaderCell.css\";\nimport {\n GroupColumnDescriptor,\n KeyedColumnDescriptor,\n} from \"@vuu-ui/vuu-datagrid-types\";\nimport { useTableColumnResize } from \"./useTableColumnResize\";\n\nconst classBase = \"vuuTable-groupHeaderCell\";\n\ninterface RemoveButtonProps\n extends Omit<HTMLAttributes<HTMLSpanElement>, \"onClick\"> {\n column?: KeyedColumnDescriptor;\n onClick?: (column?: KeyedColumnDescriptor) => void;\n}\nconst RemoveButton = ({\n column,\n onClick,\n ...htmlAttributes\n}: RemoveButtonProps) => {\n return (\n <span\n {...htmlAttributes}\n className={`${classBase}-close`}\n data-icon=\"close-circle\"\n onClick={() => onClick?.(column)}\n />\n );\n};\n\nexport interface ColHeaderProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onClick\"> {\n column: KeyedColumnDescriptor;\n onRemove?: (column?: KeyedColumnDescriptor) => void;\n}\n\nconst ColHeader = (props: ColHeaderProps) => {\n const { children, column, className } = props;\n return (\n <div className={cx(`${classBase}-col`, className)} role=\"columnheader\">\n <span className={`${classBase}-label`}>{column.name}</span>\n {children}\n </div>\n );\n};\n\nexport interface TableGroupHeaderCellProps\n extends Omit<TableHeaderCellProps, \"onDragStart\" | \"onDrag\" | \"onDragEnd\"> {\n column: GroupColumnDescriptor;\n onRemoveColumn?: (column?: KeyedColumnDescriptor) => void;\n}\n\nexport const TableGroupHeaderCell = ({\n column: groupColumn,\n className: classNameProp,\n onRemoveColumn,\n onResize,\n ...props\n}: TableGroupHeaderCellProps) => {\n const rootRef = useRef<HTMLTableCellElement>(null);\n const { isResizing, ...resizeProps } = useTableColumnResize({\n column: groupColumn,\n onResize,\n rootRef,\n });\n const className = cx(classBase, classNameProp, {\n vuuPinLeft: groupColumn.pin === \"left\",\n [`${classBase}-right`]: groupColumn.align === \"right\",\n [`${classBase}-resizing`]: groupColumn.resizing,\n [`${classBase}-pending`]: groupColumn.groupConfirmed === false,\n });\n const { columns } = groupColumn;\n\n return (\n <div className={className} ref={rootRef} {...props}>\n <div className={`${classBase}-inner`}>\n {columns.map((column) => (\n <ColHeader key={column.key} column={column}>\n {columns.length > 1 ? (\n <RemoveButton column={column} onClick={onRemoveColumn} />\n ) : null}\n </ColHeader>\n ))}\n <RemoveButton data-align=\"end\" onClick={onRemoveColumn} />\n {groupColumn.resizeable !== false ? (\n <ColumnResizer {...resizeProps} />\n ) : null}\n </div>\n </div>\n );\n};\n", "// export interface ColumnResizerProps {}\nimport { useCallback, useRef } from \"react\";\nimport \"./ColumnResizer.css\";\n\nconst NOOP = () => undefined;\n\nconst baseClass = \"vuuColumnResizer\";\nexport interface TableColumnResizerProps {\n onDrag: (evt: MouseEvent, moveBy: number) => void;\n onDragEnd: (evt: MouseEvent) => void;\n onDragStart: (evt: React.MouseEvent) => void;\n}\n\nexport const ColumnResizer = ({\n onDrag,\n onDragEnd = NOOP,\n onDragStart = NOOP,\n}: TableColumnResizerProps) => {\n const position = useRef(0);\n\n const onMouseMove = useCallback(\n (e: MouseEvent) => {\n if (e.stopPropagation) {\n e.stopPropagation();\n }\n\n if (e.preventDefault) {\n e.preventDefault();\n }\n\n const x = Math.round(e.clientX);\n const moveBy = x - position.current;\n position.current = x;\n\n if (moveBy !== 0) {\n onDrag(e, moveBy);\n }\n },\n [onDrag]\n );\n\n const onMouseUp = useCallback(\n (e: MouseEvent) => {\n window.removeEventListener(\"mouseup\", onMouseUp);\n window.removeEventListener(\"mousemove\", onMouseMove);\n onDragEnd(e);\n },\n [onDragEnd, onMouseMove]\n );\n\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n onDragStart(e);\n\n position.current = Math.round(e.clientX);\n\n window.addEventListener(\"mouseup\", onMouseUp);\n window.addEventListener(\"mousemove\", onMouseMove);\n\n if (e.stopPropagation) {\n e.stopPropagation();\n }\n\n if (e.preventDefault) {\n e.preventDefault();\n }\n },\n [onDragStart, onMouseMove, onMouseUp]\n );\n\n return (\n <div className={baseClass} data-align=\"end\" onMouseDown={handleMouseDown} />\n );\n};\n", "import { Heading, KeyedColumnDescriptor } from \"@vuu-ui/vuu-datagrid-types\";\nimport { RefObject, useCallback, useRef } from \"react\";\n\nexport type ResizeHandler = (evt: MouseEvent, moveBy: number) => void;\nexport interface CellResizeHookProps {\n column: KeyedColumnDescriptor | Heading;\n onResize?: (phase: resizePhase, columnName: string, width?: number) => void;\n rootRef: RefObject<HTMLDivElement>;\n}\n\ntype resizePhase = \"begin\" | \"resize\" | \"end\";\n\nexport interface CellResizeHookResult {\n isResizing: boolean;\n onDrag: (evt: MouseEvent, moveBy: number) => void;\n onDragStart: (evt: React.MouseEvent) => void;\n onDragEnd: (evt: MouseEvent) => void;\n}\n\nexport const useTableColumnResize = ({\n column,\n onResize,\n rootRef,\n}: CellResizeHookProps): CellResizeHookResult => {\n const widthRef = useRef(0);\n const isResizing = useRef(false);\n const { name } = column;\n\n const handleResizeStart = useCallback(() => {\n if (onResize && rootRef.current) {\n const { width } = rootRef.current.getBoundingClientRect();\n widthRef.current = Math.round(width);\n isResizing.current = true;\n onResize?.(\"begin\", name);\n }\n }, [name, onResize, rootRef]);\n\n const handleResize = useCallback(\n (_evt: MouseEvent, moveBy: number) => {\n if (rootRef.current) {\n if (onResize) {\n const { width } = rootRef.current.getBoundingClientRect();\n const newWidth = Math.round(width) + moveBy;\n if (newWidth !== widthRef.current && newWidth > 0) {\n onResize(\"resize\", name, newWidth);\n widthRef.current = newWidth;\n }\n }\n }\n },\n [name, onResize, rootRef]\n );\n\n const handleResizeEnd = useCallback(() => {\n if (onResize) {\n onResize(\"end\", name, widthRef.current);\n setTimeout(() => {\n // set in a timeout to prevent the click event from firing and triggering a sort\n isResizing.current = false;\n }, 100);\n }\n }, [name, onResize]);\n\n return {\n isResizing: isResizing.current,\n onDrag: handleResize,\n onDragStart: handleResizeStart,\n onDragEnd: handleResizeEnd,\n };\n};\n", "import { KeyedColumnDescriptor } from \"@vuu-ui/vuu-datagrid-types\";\nimport cx from \"classnames\";\nimport { HTMLAttributes, MouseEvent, useCallback, useRef } from \"react\";\nimport { ColumnResizer } from \"./ColumnResizer\";\nimport { SortIndicator } from \"./SortIndicator\";\nimport { useTableColumnResize } from \"./useTableColumnResize\";\nimport { TableColumnResizeHandler } from \"./dataTableTypes\";\n\nimport \"./TableHeaderCell.css\";\nimport { useContextMenu } from \"@vuu-ui/vuu-popups\";\nimport { FilterIndicator } from \"./filter-indicator\";\n\nconst classBase = \"vuuTable-headerCell\";\n\nexport interface TableHeaderCellProps\n extends HTMLAttributes<HTMLTableCellElement> {\n column: KeyedColumnDescriptor;\n debugString?: string;\n onDragStart?: (evt: MouseEvent) => void;\n onResize?: TableColumnResizeHandler;\n}\n\nexport const TableHeaderCell = ({\n column,\n className: classNameProp,\n onClick,\n onDragStart,\n onResize,\n ...props\n}: TableHeaderCellProps) => {\n const rootRef = useRef<HTMLTableCellElement>(null);\n const { isResizing, ...resizeProps } = useTableColumnResize({\n column,\n onResize,\n rootRef,\n });\n\n const showContextMenu = useContextMenu();\n const dragTimerRef = useRef<number | null>(null);\n\n const handleContextMenu = (e: MouseEvent<HTMLElement>) => {\n showContextMenu(e, \"header\", { column });\n };\n\n const handleClick = useCallback(\n (evt: MouseEvent<HTMLTableCellElement>) => !isResizing && onClick?.(evt),\n [isResizing, onClick]\n );\n\n const handleMouseDown = useCallback(\n (evt: MouseEvent) => {\n dragTimerRef.current = window.setTimeout(() => {\n onDragStart?.(evt);\n dragTimerRef.current = null;\n }, 500);\n },\n [onDragStart]\n );\n const handleMouseUp = useCallback(() => {\n if (dragTimerRef.current !== null) {\n window.clearTimeout(dragTimerRef.current);\n dragTimerRef.current = null;\n }\n }, []);\n\n const className = cx(classBase, classNameProp, {\n vuuPinFloating: column.pin === \"floating\",\n vuuPinLeft: column.pin === \"left\",\n vuuPinRight: column.pin === \"right\",\n vuuEndPin: column.endPin,\n [`${classBase}-resizing`]: column.resizing,\n [`${classBase}-right`]: column.align === \"right\",\n });\n return (\n <div\n className={className}\n {...props}\n onClick={handleClick}\n onContextMenu={handleContextMenu}\n onMouseDown={handleMouseDown}\n onMouseUp={handleMouseUp}\n ref={rootRef}\n >\n <div className={`${classBase}-inner`}>\n <FilterIndicator column={column} />\n <div className={`${classBase}-label`}>{column.label}</div>\n <SortIndicator sorted={column.sorted} />\n {column.resizeable !== false ? (\n <ColumnResizer {...resizeProps} />\n ) : null}\n </div>\n </div>\n );\n};\n", "import { ColumnSort } from \"@vuu-ui/vuu-datagrid-types\";\nimport cx from \"classnames\";\n\nimport \"./SortIndicator.css\";\n\nexport interface SortIndicatorProps {\n sorted?: ColumnSort;\n}\n\nconst classBase = \"vuuSortIndicator\";\n\nexport const SortIndicator = ({ sorted }: SortIndicatorProps) => {\n if (!sorted) {\n return null;\n }\n\n const direction =\n typeof sorted === \"number\"\n ? sorted < 0\n ? \"dsc\"\n : \"asc\"\n : sorted === \"A\"\n ? \"asc\"\n : \"dsc\";\n\n return typeof sorted === \"number\" ? (\n <div className={cx(classBase, \"multi-col\", direction)}>\n <span data-icon={`sorted-${direction}`} />\n <span className={\"vuuSortPosition\"}>{Math.abs(sorted)}</span>\n </div>\n ) : (\n <div className={cx(classBase, \"single-col\")}>\n <span data-icon={`sorted-${direction}`} />\n </div>\n );\n};\n", "import { KeyedColumnDescriptor } from \"@vuu-ui/vuu-datagrid-types\";\nimport { Filter } from \"@vuu-ui/vuu-filter-types\";\nimport { useContextMenu } from \"@vuu-ui/vuu-popups\";\nimport cx from \"classnames\";\nimport { HTMLAttributes, useCallback } from \"react\";\n\nimport \"./filter-indicator.css\";\n\nexport const Direction = {\n ASC: \"asc\",\n DSC: \"dsc\",\n};\n\nexport interface FilterIndicatorProps extends HTMLAttributes<HTMLDivElement> {\n column: KeyedColumnDescriptor;\n filter?: Filter;\n}\n\nexport const FilterIndicator = ({ column, filter }: FilterIndicatorProps) => {\n //TODO handle this at header level\n const showContextMenu = useContextMenu();\n\n const handleClick = useCallback(\n (evt) => {\n // if we do this through keyboard, need to get co-ords\n evt.stopPropagation();\n showContextMenu(evt, \"filter\", { column, filter });\n },\n [column, filter, showContextMenu]\n );\n\n if (!column.filter) {\n return null;\n }\n\n return (\n <div\n className={cx(\"vuuFilterIndicator\")}\n data-icon=\"filter\"\n onClick={handleClick}\n />\n );\n};\n", "import {\n DataSource,\n DataSourceRow,\n DataSourceSubscribedMessage,\n JsonDataSource,\n VuuFeatureInvocationMessage,\n VuuFeatureMessage,\n} from \"@vuu-ui/vuu-data\";\nimport {\n GridConfig,\n KeyedColumnDescriptor,\n SelectionChangeHandler,\n TableSelectionModel,\n} from \"@vuu-ui/vuu-datagrid-types\";\nimport { useContextMenu as usePopupContextMenu } from \"@vuu-ui/vuu-popups\";\nimport { VuuSortType } from \"@vuu-ui/vuu-protocol-types\";\nimport {\n applySort,\n buildColumnMap,\n isJsonGroup,\n metadataKeys,\n moveItem,\n} from \"@vuu-ui/vuu-utils\";\nimport {\n MouseEvent,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { useTableContextMenu } from \"./context-menu\";\nimport { TableColumnResizeHandler } from \"./dataTableTypes\";\nimport { useDataSource } from \"./useDataSource\";\nimport { useDraggableColumn } from \"./useDraggableColumn\";\nimport { useKeyboardNavigation } from \"./useKeyboardNavigation\";\nimport { MeasuredProps, useMeasuredContainer } from \"./useMeasuredContainer\";\nimport { useSelection } from \"./useSelection\";\nimport { PersistentColumnAction, useTableModel } from \"./useTableModel\";\nimport { useTableScroll } from \"./useTableScroll\";\nimport { useTableViewport } from \"./useTableViewport\";\nimport { useVirtualViewport } from \"./useVirtualViewport\";\n\nconst NO_ROWS = [] as const;\n\nexport interface TableHookProps extends MeasuredProps {\n config: Omit<GridConfig, \"headings\">;\n dataSource: DataSource;\n headerHeight: number;\n onConfigChange?: (config: Omit<GridConfig, \"headings\">) => void;\n onFeatureEnabled?: (message: VuuFeatureMessage) => void;\n onFeatureInvocation?: (message: VuuFeatureInvocationMessage) => void;\n renderBufferSize?: number;\n rowHeight: number;\n onSelectionChange?: SelectionChangeHandler;\n selectionModel: TableSelectionModel;\n}\n\nconst { KEY, IS_EXPANDED, IS_LEAF } = metadataKeys;\n\nexport const useTable = ({\n config,\n dataSource,\n headerHeight,\n onConfigChange,\n onFeatureEnabled,\n onFeatureInvocation,\n onSelectionChange,\n renderBufferSize = 0,\n rowHeight,\n selectionModel,\n ...measuredProps\n}: TableHookProps) => {\n const [rowCount, setRowCount] = useState<number>(dataSource.size);\n const expectConfigChangeRef = useRef(false);\n\n // When we detect and respond to changes to config below, we need\n // to include current dataSource config when we refresh the model.\n const dataSourceRef = useRef<DataSource>();\n dataSourceRef.current = dataSource;\n\n if (dataSource === undefined) {\n throw Error(\"no data source provided to Vuu Table\");\n }\n\n const containerMeasurements = useMeasuredContainer(measuredProps);\n\n const onDataRowcountChange = useCallback((size: number) => {\n setRowCount(size);\n }, []);\n\n const { columns, dispatchColumnAction, headings } = useTableModel(\n config,\n dataSource.config\n );\n\n const {\n getRowAtPosition,\n getRowOffset,\n setPctScrollTop,\n ...viewportMeasurements\n } = useTableViewport({\n columns,\n headerHeight,\n headings,\n rowCount,\n rowHeight,\n size: containerMeasurements.innerSize,\n });\n\n const onSubscribed = useCallback(\n ({ tableSchema }: DataSourceSubscribedMessage) => {\n if (tableSchema) {\n expectConfigChangeRef.current = true;\n dispatchColumnAction({\n type: \"setTableSchema\",\n tableSchema,\n });\n } else {\n console.log(\"usbscription message with no schema\");\n }\n },\n [dispatchColumnAction]\n );\n\n const handleSelectionChange: SelectionChangeHandler = useCallback(\n (selected) => {\n dataSource.select(selected);\n onSelectionChange?.(selected);\n },\n [dataSource, onSelectionChange]\n );\n\n const handleRowClick = useSelection({\n onSelectionChange: handleSelectionChange,\n selectionModel,\n });\n\n const { data, getSelectedRows, range, setRange } = useDataSource({\n dataSource,\n onFeatureEnabled,\n onFeatureInvocation,\n onSubscribed,\n onSizeChange: onDataRowcountChange,\n renderBufferSize,\n viewportRowCount: viewportMeasurements.rowCount,\n });\n\n // Keep a ref to current data. We use it to provide row for context menu actions.\n // We don't want to introduce data as a dependency on the context menu handler, just\n // needs to be correct at runtime when the row is right clicked.\n const dataRef = useRef<DataSourceRow[]>();\n dataRef.current = data;\n\n const onPersistentColumnOperation = useCallback(\n (action: PersistentColumnAction) => {\n expectConfigChangeRef.current = true;\n dispatchColumnAction(action);\n },\n [dispatchColumnAction]\n );\n\n const handleContextMenuAction = useTableContextMenu({\n dataSource,\n onPersistentColumnOperation,\n });\n\n const handleSort = useCallback(\n (\n column: KeyedColumnDescriptor,\n extendSort = false,\n sortType?: VuuSortType\n ) => {\n if (dataSource) {\n dataSource.sort = applySort(\n dataSource.sort,\n column,\n extendSort,\n sortType\n );\n }\n },\n [dataSource]\n );\n\n const handleColumnResize: TableColumnResizeHandler = useCallback(\n (phase, columnName, width) => {\n const column = columns.find((column) => column.name === columnName);\n if (column) {\n if (phase === \"end\") {\n expectConfigChangeRef.current = true;\n }\n dispatchColumnAction({\n type: \"resizeColumn\",\n phase,\n column,\n width,\n });\n } else {\n throw Error(\n `useDataTable.handleColumnResize, column ${columnName} not found`\n );\n }\n },\n [columns, dispatchColumnAction]\n );\n\n const handleToggleGroup = useCallback(\n (row: DataSourceRow, column: KeyedColumnDescriptor) => {\n const isJson = isJsonGroup(column, row);\n const key = row[KEY];\n\n if (row[IS_EXPANDED]) {\n (dataSource as JsonDataSource).closeTreeNode(key, true);\n if (isJson) {\n const idx = columns.indexOf(column);\n const rows = (dataSource as JsonDataSource).getRowsAtDepth(idx + 1);\n if (!rows.some((row) => row[IS_EXPANDED] || row[IS_LEAF])) {\n dispatchColumnAction({\n type: \"hideColumns\",\n columns: columns.slice(idx + 2),\n });\n }\n }\n } else {\n dataSource.openTreeNode(key);\n if (isJson) {\n const childRows = (dataSource as JsonDataSource).getChildRows(key);\n const idx = columns.indexOf(column) + 1;\n const columnsToShow = [columns[idx]];\n if (childRows.some((row) => row[IS_LEAF])) {\n columnsToShow.push(columns[idx + 1]);\n }\n if (columnsToShow.some((col) => col.hidden)) {\n dispatchColumnAction({\n type: \"showColumns\",\n columns: columnsToShow,\n });\n }\n }\n }\n },\n [columns, dataSource, dispatchColumnAction]\n );\n\n const {\n onVerticalScroll,\n onHorizontalScroll,\n columnsWithinViewport,\n virtualColSpan,\n } = useVirtualViewport({\n columns,\n getRowAtPosition,\n setRange,\n viewportMeasurements,\n });\n\n const handleVerticalScroll = useCallback(\n (scrollTop: number, pctScrollTop: number) => {\n setPctScrollTop(pctScrollTop);\n onVerticalScroll(scrollTop);\n },\n [onVerticalScroll, setPctScrollTop]\n );\n\n const { requestScroll, ...scrollProps } = useTableScroll({\n onHorizontalScroll,\n onVerticalScroll: handleVerticalScroll,\n viewport: viewportMeasurements,\n viewportHeight:\n (containerMeasurements.innerSize?.height ?? 0) - headerHeight,\n });\n\n const containerProps = useKeyboardNavigation({\n columnCount: columns.length,\n containerRef: containerMeasurements.containerRef,\n data,\n requestScroll,\n rowCount: dataSource?.size,\n viewportRange: range,\n });\n\n const handleRemoveColumnFromGroupBy = useCallback(\n (column?: KeyedColumnDescriptor) => {\n if (column) {\n if (dataSource && dataSource.groupBy.includes(column.name)) {\n dataSource.groupBy = dataSource.groupBy.filter(\n (columnName) => columnName !== column.name\n );\n }\n } else {\n dataSource.groupBy = [];\n }\n },\n [dataSource]\n );\n\n const handleDropColumn = useCallback(\n (fromIndex: number, toIndex: number) => {\n const column = dataSource.columns[fromIndex];\n const columns = moveItem(dataSource.columns, column, toIndex);\n if (columns !== dataSource.columns) {\n dataSource.columns = columns;\n dispatchColumnAction({ type: \"tableConfig\", columns });\n }\n },\n [dataSource, dispatchColumnAction]\n );\n\n const draggableHook = useDraggableColumn({\n onDrop: handleDropColumn,\n });\n\n useEffect(() => {\n // External config has changed\n if (dataSourceRef.current) {\n expectConfigChangeRef.current = true;\n dispatchColumnAction({\n type: \"init\",\n tableConfig: config,\n dataSourceConfig: dataSourceRef.current.config,\n });\n }\n }, [config, dispatchColumnAction]);\n\n useEffect(() => {\n dataSource.on(\"config\", (config, confirmed) => {\n expectConfigChangeRef.current = true;\n dispatchColumnAction({\n type: \"tableConfig\",\n ...config,\n confirmed,\n });\n });\n }, [dataSource, dispatchColumnAction]);\n\n useMemo(() => {\n if (expectConfigChangeRef.current) {\n onConfigChange?.({\n ...config,\n columns,\n });\n expectConfigChangeRef.current = false;\n }\n }, [columns, config, onConfigChange]);\n\n const showContextMenu = usePopupContextMenu();\n\n const onContextMenu = useCallback(\n (evt: MouseEvent<HTMLElement>) => {\n const { current: currentData } = dataRef;\n const { current: currentDataSource } = dataSourceRef;\n const target = evt.target as HTMLElement;\n const cellEl = target?.closest(\"div[role='cell']\");\n const rowEl = target?.closest(\".vuuTableRow\");\n\n if (cellEl && rowEl && currentData && currentDataSource) {\n const { columns, selectedRowsCount } = currentDataSource;\n const columnMap = buildColumnMap(columns);\n const rowIndex = parseInt(rowEl.ariaRowIndex ?? \"-1\");\n const cellIndex = Array.from(rowEl.childNodes).indexOf(cellEl);\n const row = currentData.find(([idx]) => idx === rowIndex);\n const columnName = columns[cellIndex];\n\n showContextMenu(evt, \"grid\", {\n columnMap,\n columnName,\n row,\n selectedRows: selectedRowsCount === 0 ? NO_ROWS : getSelectedRows(),\n viewport: dataSource?.viewport,\n });\n }\n },\n [dataSource?.viewport, getSelectedRows, showContextMenu]\n );\n\n return {\n columns,\n columnsWithinViewport,\n containerMeasurements,\n containerProps,\n data,\n dispatchColumnAction,\n getRowOffset,\n handleContextMenuAction,\n headings,\n onColumnResize: handleColumnResize,\n onContextMenu,\n onRemoveColumnFromGroupBy: handleRemoveColumnFromGroupBy,\n onRowClick: handleRowClick,\n onSort: handleSort,\n onToggleGroup: handleToggleGroup,\n virtualColSpan,\n scrollProps,\n rowCount,\n viewportMeasurements,\n ...draggableHook,\n };\n};\n", "import {\n DataSource,\n DataSourceConfigMessage,\n DataSourceRow,\n DataSourceSubscribedMessage,\n SubscribeCallback,\n VuuFeatureMessage,\n isVuuFeatureAction,\n VuuFeatureInvocationMessage,\n isVuuFeatureInvocation,\n} from \"@vuu-ui/vuu-data\";\nimport { VuuRange, VuuSortCol } from \"@vuu-ui/vuu-protocol-types\";\nimport { getFullRange, metadataKeys, WindowRange } from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nconst { SELECTED } = metadataKeys;\n\n// const byKey = (row1: VuuDataRow, row2: VuuDataRow) =>\n// ((row1[RENDER_IDX] as number) - row2[RENDER_IDX]) as number;\n\nexport type SubscriptionDetails = {\n columnNames?: string[];\n range: { from: number; to: number };\n sort?: VuuSortCol[];\n};\n\nexport interface DataSourceHookProps {\n dataSource: DataSource;\n onConfigChange?: (message: DataSourceConfigMessage) => void;\n onFeatureEnabled?: (message: VuuFeatureMessage) => void;\n onFeatureInvocation?: (message: VuuFeatureInvocationMessage) => void;\n onSizeChange: (size: number) => void;\n onSubscribed: (subscription: DataSourceSubscribedMessage) => void;\n range?: VuuRange;\n renderBufferSize?: number;\n viewportRowCount: number;\n}\n\n//TODO allow subscription details to be set before subscribe call\nexport function useDataSource({\n dataSource,\n onConfigChange,\n onFeatureEnabled,\n onFeatureInvocation,\n onSizeChange,\n onSubscribed,\n range = { from: 0, to: 0 },\n renderBufferSize = 0,\n viewportRowCount,\n}: DataSourceHookProps) {\n const [, forceUpdate] = useState<unknown>(null);\n const isMounted = useRef(true);\n const hasUpdated = useRef(false);\n const rangeRef = useRef<VuuRange>({ from: 0, to: 0 });\n const rafHandle = useRef<number | null>(null);\n const data = useRef<DataSourceRow[]>([]);\n\n const dataWindow = useMemo(\n () => new MovingWindow(getFullRange(range)),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n const setData = useCallback(\n (updates: DataSourceRow[]) => {\n for (const row of updates) {\n dataWindow.add(row);\n }\n data.current = dataWindow.data;\n hasUpdated.current = true;\n },\n [dataWindow]\n );\n\n const datasourceMessageHandler: SubscribeCallback = useCallback(\n (message) => {\n if (message.type === \"subscribed\") {\n onSubscribed?.(message);\n } else if (message.type === \"viewport-update\") {\n if (typeof message.size === \"number\") {\n onSizeChange?.(message.size);\n dataWindow.setRowCount(message.size);\n }\n if (message.rows) {\n setData(message.rows);\n } else if (typeof message.size === \"number\") {\n // TODO is this right ??????\n data.current = dataWindow.data;\n // data.current = dataWindow.data.slice().sort(byKey);\n hasUpdated.current = true;\n }\n } else if (isVuuFeatureAction(message)) {\n onFeatureEnabled?.(message);\n } else if (isVuuFeatureInvocation(message)) {\n onFeatureInvocation?.(message);\n } else {\n console.log(`useDataSource unexpected message ${message.type}`);\n }\n },\n [\n dataWindow,\n onFeatureEnabled,\n onFeatureInvocation,\n onSizeChange,\n onSubscribed,\n setData,\n ]\n );\n\n useEffect(\n () => () => {\n if (rafHandle.current) {\n cancelAnimationFrame(rafHandle.current);\n rafHandle.current = null;\n }\n isMounted.current = false;\n },\n []\n );\n\n const refreshIfUpdated = useCallback(() => {\n if (isMounted.current) {\n if (hasUpdated.current) {\n forceUpdate({});\n hasUpdated.current = false;\n }\n rafHandle.current = requestAnimationFrame(refreshIfUpdated);\n }\n }, [forceUpdate]);\n\n useEffect(() => {\n rafHandle.current = requestAnimationFrame(refreshIfUpdated);\n }, [refreshIfUpdated]);\n\n const adjustRange = useCallback(\n (rowCount: number) => {\n const { from } = dataSource.range;\n const rowRange = { from, to: from + rowCount };\n const fullRange = getFullRange(rowRange, renderBufferSize);\n dataWindow.setRange(fullRange);\n dataSource.range = rangeRef.current = fullRange;\n // seems a bit naughty to emit from outside, but the datasource doesn't\n // know about the buffer size we add to the base range\n dataSource.emit(\"range\", rowRange);\n },\n [dataSource, dataWindow, renderBufferSize]\n );\n\n const setRange = useCallback(\n (range: VuuRange) => {\n const fullRange = getFullRange(range, renderBufferSize);\n dataWindow.setRange(fullRange);\n dataSource.range = rangeRef.current = fullRange;\n dataSource.emit(\"range\", range);\n },\n [dataSource, dataWindow, renderBufferSize]\n );\n\n const getSelectedRows = useCallback(() => {\n return dataWindow.getSelectedRows();\n }, [dataWindow]);\n\n // Note: we do not call unsubscribe in a cleanup function here.\n // Thats because we do not want to unsubscribe in the event that\n // our view is unmounts due to a layout drag drop operation. In\n // that scenario, we disable the viewport. THis is handles at the\n // View level. Might need to revisit this - what if Table is not\n // nested within a View ?\n useEffect(() => {\n dataSource?.subscribe(\n {\n range: rangeRef.current,\n },\n datasourceMessageHandler\n );\n }, [dataSource, datasourceMessageHandler, onConfigChange]);\n\n useEffect(() => {\n adjustRange(viewportRowCount);\n }, [adjustRange, viewportRowCount]);\n\n return {\n data: data.current,\n getSelectedRows,\n range: rangeRef.current,\n setRange,\n dataSource,\n };\n}\n\nexport class MovingWindow {\n public data: DataSourceRow[];\n public rowCount = 0;\n private range: WindowRange;\n\n constructor({ from, to }: VuuRange) {\n this.range = new WindowRange(from, to);\n //internal data is always 0 based, we add range.from to determine an offset\n this.data = new Array(to - from);\n this.rowCount = 0;\n }\n\n setRowCount = (rowCount: number) => {\n if (rowCount < this.data.length) {\n this.data.length = rowCount;\n }\n\n this.rowCount = rowCount;\n };\n\n add(data: DataSourceRow) {\n const [index] = data;\n if (this.isWithinRange(index)) {\n const internalIndex = index - this.range.from;\n this.data[internalIndex] = data;\n\n // assign 'pre-selected' selection state. This allows us to assign a className\n // to a non selected row that immediately precedes a selected row. Useful for\n // styling. This cannot be achieved any other way as document order of row\n // elements does not necessarily reflect data order.\n const isSelected = data[SELECTED];\n const preSelected = this.data[internalIndex - 1]?.[SELECTED];\n if (preSelected === 0 && isSelected) {\n this.data[internalIndex - 1][SELECTED] = 2;\n } else if (preSelected === 2 && !isSelected) {\n this.data[internalIndex - 1][SELECTED] = 0;\n }\n }\n }\n\n getAtIndex(index: number) {\n return this.range.isWithin(index) &&\n this.data[index - this.range.from] != null\n ? this.data[index - this.range.from]\n : undefined;\n }\n\n isWithinRange(index: number) {\n return this.range.isWithin(index);\n }\n\n setRange({ from, to }: VuuRange) {\n if (from !== this.range.from || to !== this.range.to) {\n const [overlapFrom, overlapTo] = this.range.overlap(from, to);\n const newData = new Array(Math.max(0, to - from));\n for (let i = overlapFrom; i < overlapTo; i++) {\n const data = this.getAtIndex(i);\n if (data) {\n const index = i - from;\n newData[index] = data;\n }\n }\n this.data = newData;\n this.range.from = from;\n this.range.to = to;\n }\n }\n\n getSelectedRows() {\n return this.data.filter((row) => row[SELECTED] === 1);\n }\n}\n", "import { useDragDrop } from \"@heswell/salt-lab\";\nimport { MouseEvent, useCallback, useRef } from \"react\";\n\ntype MousePos = {\n clientX: number;\n clientY: number;\n idx: string;\n};\n\nexport interface DraggableColumnHookProps {\n onDrop: (fromIndex: number, toIndex: number) => void;\n}\n\nexport const useDraggableColumn = ({ onDrop }: DraggableColumnHookProps) => {\n const mousePosRef = useRef<MousePos>();\n const containerRef = useRef<HTMLElement | null>(null);\n\n const handleDropSettle = useCallback(() => {\n console.log(`handleDropSettle`);\n mousePosRef.current = undefined;\n containerRef.current = null;\n }, []);\n\n const { draggable, draggedItemIndex, onMouseDown } = useDragDrop({\n // allowDragDrop: \"drop-indicator\",\n allowDragDrop: true,\n draggableClassName: \"vuuTable-headerCell\",\n orientation: \"horizontal\",\n containerRef,\n itemQuery: \".vuuTable-headerCell\",\n onDrop,\n onDropSettle: handleDropSettle,\n });\n\n const onHeaderCellDragStart = useCallback(\n (evt: MouseEvent) => {\n const { clientX, clientY } = evt;\n console.log(\n `useDraggableColumn handleHeaderCellDragStart means mouseDown fired on a column in RowBasedTable`\n );\n const sourceElement = evt.target as HTMLElement;\n const columnHeaderCell = sourceElement.closest(\".vuuTable-headerCell\");\n containerRef.current = columnHeaderCell?.closest(\n \"[role='row']\"\n ) as HTMLDivElement;\n const {\n dataset: { idx = \"-1\" },\n } = columnHeaderCell as HTMLElement;\n mousePosRef.current = {\n clientX,\n clientY,\n idx,\n };\n onMouseDown?.(evt);\n },\n [onMouseDown]\n );\n\n // useLayoutEffect(() => {\n // if (tableLayout === \"column\" && mousePosRef.current && !draggable) {\n // const { clientX, clientY, idx } = mousePosRef.current;\n // const target = tableContainerRef.current?.querySelector(\n // `.vuuTable-table[data-idx=\"${idx}\"]`\n // ) as HTMLElement;\n // if (target) {\n // const evt = {\n // persist: () => undefined,\n // nativeEvent: {\n // clientX,\n // clientY,\n // target,\n // },\n // };\n // onMouseDown?.(evt as unknown as MouseEvent);\n // }\n // }\n // }, [draggable, onMouseDown, tableContainerRef, tableLayout]);\n\n return {\n draggable,\n draggedItemIndex,\n onHeaderCellDragStart,\n };\n};\n", "import { DataSourceRow } from \"@vuu-ui/vuu-data\";\nimport { VuuRange } from \"@vuu-ui/vuu-protocol-types\";\nimport { withinRange } from \"@vuu-ui/vuu-utils\";\nimport {\n KeyboardEvent,\n MouseEvent,\n RefObject,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport {\n ArrowDown,\n ArrowKey,\n ArrowLeft,\n ArrowRight,\n ArrowUp,\n End,\n Home,\n isNavigationKey,\n isPagingKey,\n NavigationKey,\n PageDown,\n PageUp,\n} from \"./keyUtils\";\nimport { ScrollRequestHandler } from \"./useTableScroll\";\n\nexport type CellPos = [number, number];\n\nconst headerCellQuery = (colIdx: number) =>\n `.vuuTable-headers .vuuTable-headerCell:nth-child(${colIdx + 1})`;\nconst dataCellQuery = (rowIdx: number, colIdx: number) =>\n `.vuuTable-body > [aria-rowindex='${rowIdx}'] > [role='cell']:nth-child(${\n colIdx + 1\n })`;\n\nconst NULL_CELL_POS: CellPos = [-1, -1];\n\nfunction nextCellPos(\n key: ArrowKey,\n [rowIdx, colIdx]: CellPos,\n columnCount: number,\n rowCount: number\n): CellPos {\n if (key === ArrowUp) {\n if (rowIdx > -1) {\n return [rowIdx - 1, colIdx];\n } else {\n return [rowIdx, colIdx];\n }\n } else if (key === ArrowDown) {\n if (rowIdx === -1) {\n return [0, colIdx];\n } else if (rowIdx === rowCount - 1) {\n return [rowIdx, colIdx];\n } else {\n return [rowIdx + 1, colIdx];\n }\n } else if (key === ArrowRight) {\n if (colIdx < columnCount - 1) {\n return [rowIdx, colIdx + 1];\n } else {\n return [rowIdx, colIdx];\n }\n } else if (key === ArrowLeft) {\n if (colIdx > 0) {\n return [rowIdx, colIdx - 1];\n } else {\n return [rowIdx, colIdx];\n }\n }\n return [rowIdx, colIdx];\n}\n\nexport interface NavigationHookProps {\n containerRef: RefObject<HTMLElement>;\n columnCount?: number;\n data: DataSourceRow[];\n disableHighlightOnFocus?: boolean;\n label?: string;\n viewportRange: VuuRange;\n requestScroll?: ScrollRequestHandler;\n restoreLastFocus?: boolean;\n rowCount?: number;\n selected?: unknown;\n}\n\nexport const useKeyboardNavigation = ({\n columnCount = 0,\n containerRef,\n disableHighlightOnFocus,\n data,\n requestScroll,\n rowCount = 0,\n viewportRange,\n}: NavigationHookProps) => {\n const { from: viewportFirstRow, to: viewportLastRow } = viewportRange;\n const focusedCellPos = useRef<CellPos>([-1, -1]);\n const focusableCell = useRef<HTMLTableCellElement>();\n const activeCellPos = useRef<CellPos>([-1, 0]);\n\n const getTableCell = useCallback(\n ([rowIdx, colIdx]: CellPos) => {\n const cssQuery =\n rowIdx === -1 ? headerCellQuery(colIdx) : dataCellQuery(rowIdx, colIdx);\n return containerRef.current?.querySelector(\n cssQuery\n ) as HTMLTableCellElement;\n },\n [containerRef]\n );\n\n const getFocusedCell = (element: HTMLElement | Element | null) =>\n element?.closest(\n \"[role='columnHeader'],[role='cell']\"\n ) as HTMLTableCellElement | null;\n\n const getTableCellPos = (tableCell: HTMLTableCellElement): CellPos => {\n if (tableCell.role === \"columnHeader\") {\n const colIdx = parseInt(tableCell.dataset.idx ?? \"-1\", 10);\n return [-1, colIdx];\n } else {\n const focusedRow = tableCell.closest(\"[role='row']\");\n if (focusedRow) {\n const rowIdx = parseInt(focusedRow.ariaRowIndex ?? \"-1\", 10);\n // TODO will get trickier when we introduce horizontal virtualisation\n const colIdx = Array.from(focusedRow.childNodes).indexOf(tableCell);\n return [rowIdx, colIdx];\n }\n }\n return NULL_CELL_POS;\n };\n\n const focusCell = useCallback(\n (cellPos: CellPos) => {\n if (containerRef.current) {\n const activeCell = getTableCell(cellPos);\n if (activeCell) {\n if (activeCell !== focusableCell.current) {\n focusableCell.current?.setAttribute(\"tabindex\", \"\");\n focusableCell.current = activeCell;\n activeCell.setAttribute(\"tabindex\", \"0\");\n }\n activeCell.focus();\n } else if (!withinRange(cellPos[0], viewportRange)) {\n focusableCell.current = undefined;\n requestScroll?.({ type: \"scroll-page\", direction: \"up\" });\n }\n }\n },\n // TODO we recreate this function whenever viewportRange changes, which will\n // be often whilst scrolling - store range in a a ref ?\n [containerRef, getTableCell, requestScroll, viewportRange]\n );\n\n const setActiveCell = useCallback(\n (rowIdx: number, colIdx: number, fromKeyboard = false) => {\n const pos: CellPos = [rowIdx, colIdx];\n activeCellPos.current = pos;\n focusCell(pos);\n if (fromKeyboard) {\n focusedCellPos.current = pos;\n }\n },\n [focusCell]\n );\n\n const virtualizeActiveCell = useCallback(() => {\n focusableCell.current?.setAttribute(\"tabindex\", \"\");\n focusableCell.current = undefined;\n }, []);\n\n const nextPageItemIdx = useCallback(\n async (\n key: \"PageDown\" | \"PageUp\" | \"Home\" | \"End\",\n cellPos: CellPos\n ): Promise<CellPos> => {\n switch (key) {\n case PageDown:\n requestScroll?.({ type: \"scroll-page\", direction: \"down\" });\n break;\n case PageUp:\n requestScroll?.({ type: \"scroll-page\", direction: \"up\" });\n break;\n case Home:\n requestScroll?.({ type: \"scroll-end\", direction: \"home\" });\n break;\n case End:\n requestScroll?.({ type: \"scroll-end\", direction: \"end\" });\n break;\n }\n // TODO set up a scroll listener here, reset focused cell once scroll completes\n return cellPos;\n },\n [requestScroll]\n );\n\n const handleFocus = useCallback(() => {\n if (disableHighlightOnFocus !== true) {\n if (containerRef.current?.contains(document.activeElement)) {\n // IF focus arrives via keyboard, a cell will have received focus,\n // we handle that here. If focus arrives via click on a cell with\n // no tabindex (i.e all cells except one) we leave that to the\n // click handler.\n const focusedCell = getFocusedCell(document.activeElement);\n if (focusedCell) {\n focusedCellPos.current = getTableCellPos(focusedCell);\n }\n }\n }\n }, [disableHighlightOnFocus, containerRef]);\n\n const navigateChildItems = useCallback(\n async (key: NavigationKey) => {\n const [nextRowIdx, nextColIdx] = isPagingKey(key)\n ? await nextPageItemIdx(key, activeCellPos.current)\n : nextCellPos(key, activeCellPos.current, columnCount, rowCount);\n\n const [rowIdx, colIdx] = activeCellPos.current;\n if (nextRowIdx !== rowIdx || nextColIdx !== colIdx) {\n setActiveCell(nextRowIdx, nextColIdx, true);\n }\n },\n [columnCount, nextPageItemIdx, rowCount, setActiveCell]\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (data.length > 0 && isNavigationKey(e.key)) {\n e.preventDefault();\n e.stopPropagation();\n void navigateChildItems(e.key);\n }\n },\n [data, navigateChildItems]\n );\n\n const handleClick = useCallback(\n // Might not be a cell e.g the Settings button\n (evt: MouseEvent) => {\n const target = evt.target as HTMLElement;\n const focusedCell = getFocusedCell(target);\n if (focusedCell) {\n const [rowIdx, colIdx] = getTableCellPos(focusedCell);\n setActiveCell(rowIdx, colIdx);\n }\n },\n [setActiveCell]\n );\n\n const containerProps = useMemo(() => {\n return {\n onClick: handleClick,\n onFocus: handleFocus,\n onKeyDown: handleKeyDown,\n };\n }, [handleClick, handleFocus, handleKeyDown]);\n\n useLayoutEffect(() => {\n const { current: cellPos } = activeCellPos;\n const withinViewport =\n cellPos[0] >= viewportFirstRow && cellPos[0] <= viewportLastRow;\n\n if (focusableCell.current && !withinViewport) {\n virtualizeActiveCell();\n } else if (!focusableCell.current && withinViewport) {\n focusCell(cellPos);\n }\n }, [focusCell, viewportFirstRow, viewportLastRow, virtualizeActiveCell]);\n\n // First render will only render the outer container when explicit\n // sizing has not been provided. Outer container is measured and\n // only then, on second render, is content rendered.\n const fullyRendered = containerRef.current?.firstChild != null;\n useEffect(() => {\n if (fullyRendered && focusableCell.current === undefined) {\n const headerCell = containerRef.current?.querySelector(\n headerCellQuery(0)\n ) as HTMLTableCellElement;\n if (headerCell) {\n headerCell.setAttribute(\"tabindex\", \"0\");\n focusableCell.current = headerCell;\n }\n }\n }, [containerRef, fullyRendered]);\n\n return containerProps;\n};\n", "import React from \"react\";\n\nfunction union<T>(set1: Set<T>, ...sets: Set<T>[]) {\n const result = new Set(set1);\n for (let set of sets) {\n for (let element of set) {\n result.add(element);\n }\n }\n return result;\n}\n\nexport const ArrowUp = \"ArrowUp\";\nexport const ArrowDown = \"ArrowDown\";\nexport const ArrowLeft = \"ArrowLeft\";\nexport const ArrowRight = \"ArrowRight\";\nexport const Enter = \"Enter\";\nexport const Escape = \"Escape\";\nexport const Home = \"Home\";\nexport const End = \"End\";\nexport const PageUp = \"PageUp\";\nexport const PageDown = \"PageDown\";\nexport const Space = \" \";\nexport const Tab = \"Tab\";\n\nconst actionKeys = new Set([\"Enter\", \"Delete\", \" \"]);\nconst focusKeys = new Set([\"Tab\"]);\nconst arrowLeftRightKeys = new Set([\"ArrowRight\", \"ArrowLeft\"]);\nconst navigationKeys = new Set<NavigationKey>([\n Home,\n End,\n PageUp,\n PageDown,\n ArrowDown,\n ArrowLeft,\n ArrowRight,\n ArrowUp,\n]);\nconst functionKeys = new Set([\n \"F1\",\n \"F2\",\n \"F3\",\n \"F4\",\n \"F5\",\n \"F6\",\n \"F7\",\n \"F8\",\n \"F9\",\n \"F10\",\n \"F11\",\n \"F12\",\n]);\nconst specialKeys = union(\n actionKeys,\n navigationKeys,\n arrowLeftRightKeys,\n functionKeys,\n focusKeys\n);\nexport const isCharacterKey = (evt: React.KeyboardEvent): boolean => {\n if (specialKeys.has(evt.key)) {\n return false;\n }\n return evt.key.length === 1 && !evt.ctrlKey && !evt.metaKey && !evt.altKey;\n};\n\nexport type ArrowKey = \"ArrowUp\" | \"ArrowDown\" | \"ArrowLeft\" | \"ArrowRight\";\nexport type PageKey = \"Home\" | \"End\" | \"PageUp\" | \"PageDown\";\nexport type NavigationKey = PageKey | ArrowKey;\nconst PageKeys = [\"Home\", \"End\", \"PageUp\", \"PageDown\"];\nexport const isPagingKey = (key: string): key is PageKey =>\n PageKeys.includes(key);\n\nexport const isNavigationKey = (key: string): key is NavigationKey => {\n return navigationKeys.has(key as NavigationKey);\n};\n", "import { isValidNumber } from \"@vuu-ui/vuu-utils\";\nimport { RefObject, useCallback, useMemo, useRef, useState } from \"react\";\nimport { useResizeObserver, ResizeHandler } from \"./useResizeObserver\";\n\nconst ClientWidthHeight = [\"clientHeight\", \"clientWidth\"];\n\nexport interface ClientSize {\n clientHeight: number;\n clientWidth: number;\n}\n\nexport interface MeasuredProps {\n defaultHeight?: number;\n defaultWidth?: number;\n height?: number;\n width?: number;\n}\n\nexport interface Size {\n height: number | \"100%\";\n width: number | \"100%\";\n}\n\nexport interface MeasuredSize {\n height: number;\n width: number;\n}\n\ninterface MeasuredState {\n css: CssSize;\n outer: Size;\n inner?: MeasuredSize;\n}\n\nconst isNumber = (val: unknown): val is number => Number.isFinite(val);\n\nexport type CssSize = {\n height: string;\n width: string;\n};\nconst FULL_SIZE: CssSize = { height: \"100%\", width: \"100%\" };\n\nexport interface MeasuredContainerHookResult {\n containerRef: RefObject<HTMLDivElement>;\n cssSize: CssSize;\n outerSize: Size;\n innerSize?: MeasuredSize;\n}\n\n// If (outer) height and width are known at initialisation (i.e. they\n// were passed as props), use as initial values for inner size. If there\n// is no border on Table, these values will not change. If there is a border,\n// inner values will be updated once measured.\nconst getInitialCssSize = (height: unknown, width: unknown): CssSize => {\n if (isValidNumber(height) && isValidNumber(width)) {\n return {\n height: `${height}px`,\n width: `${width}px`,\n };\n } else {\n return FULL_SIZE;\n }\n};\n\nconst getInitialInnerSize = (\n height: unknown,\n width: unknown\n): MeasuredSize | undefined => {\n if (isValidNumber(height) && isValidNumber(width)) {\n return {\n height,\n width,\n };\n }\n};\n\nexport const useMeasuredContainer = ({\n defaultHeight = 0,\n defaultWidth = 0,\n height,\n width,\n}: MeasuredProps): MeasuredContainerHookResult => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [size, setSize] = useState<MeasuredState>({\n css: getInitialCssSize(height, width),\n inner: getInitialInnerSize(height, width),\n outer: {\n height: height ?? \"100%\",\n width: width ?? \"100%\",\n },\n });\n\n useMemo(() => {\n setSize((currentSize) => {\n const { inner, outer } = currentSize;\n if (isValidNumber(height) && isValidNumber(width) && inner && outer) {\n const { height: innerHeight, width: innerWidth } = inner;\n const { height: outerHeight, width: outerWidth } = outer;\n\n if (outerHeight !== height || outerWidth !== width) {\n const heightDiff = isValidNumber(outerHeight)\n ? outerHeight - innerHeight\n : 0;\n const widthDiff = isValidNumber(outerWidth)\n ? outerWidth - innerWidth\n : 0;\n return {\n ...currentSize,\n outer: { height, width },\n inner: { height: height - heightDiff, width: width - widthDiff },\n };\n }\n }\n return currentSize;\n });\n }, [height, width]);\n\n const onResize: ResizeHandler = useCallback(\n ({ clientWidth, clientHeight }: Partial<ClientSize>) => {\n setSize((currentSize) => {\n const { css, inner, outer } = currentSize;\n return isNumber(clientHeight) &&\n isNumber(clientWidth) &&\n (clientWidth !== inner?.width || clientHeight !== inner?.height)\n ? {\n css,\n outer,\n inner: {\n width: Math.floor(clientWidth) || defaultWidth,\n height: Math.floor(clientHeight) || defaultHeight,\n },\n }\n : currentSize;\n });\n },\n [defaultHeight, defaultWidth]\n );\n\n useResizeObserver(containerRef, ClientWidthHeight, onResize, true);\n\n return {\n containerRef,\n cssSize: size.css,\n outerSize: size.outer,\n innerSize: size.inner,\n };\n};\n", "import { RefObject, useCallback, useEffect, useRef } from \"react\";\n\nexport const WidthHeight = [\"height\", \"width\"];\nexport const WidthOnly = [\"width\"];\n\nexport type measurements<T = string | number> = {\n height?: T;\n clientHeight?: number;\n clientWidth?: number;\n contentHeight?: number;\n contentWidth?: number;\n scrollHeight?: number;\n scrollWidth?: number;\n width?: T;\n};\ntype measuredDimension = keyof measurements<number>;\n\nexport type ResizeHandler = (measurements: measurements<number>) => void;\n\ntype observedDetails = {\n onResize?: ResizeHandler;\n measurements: measurements<number>;\n};\nconst observedMap = new Map<HTMLElement, observedDetails>();\n\nconst getTargetSize = (\n element: HTMLElement,\n size: {\n height: number;\n width: number;\n contentHeight: number;\n contentWidth: number;\n },\n dimension: measuredDimension\n): number => {\n switch (dimension) {\n case \"height\":\n return size.height;\n case \"clientHeight\":\n return element.clientHeight;\n case \"clientWidth\":\n return element.clientWidth;\n case \"contentHeight\":\n return size.contentHeight;\n case \"contentWidth\":\n return size.contentWidth;\n case \"scrollHeight\":\n return Math.ceil(element.scrollHeight);\n case \"scrollWidth\":\n return Math.ceil(element.scrollWidth);\n case \"width\":\n return size.width;\n default:\n return 0;\n }\n};\n\n// TODO should we make this create-on-demand\nconst resizeObserver = new ResizeObserver((entries: ResizeObserverEntry[]) => {\n for (const entry of entries) {\n const { target, borderBoxSize, contentBoxSize } = entry;\n const observedTarget = observedMap.get(target as HTMLElement);\n if (observedTarget) {\n const [{ blockSize: height, inlineSize: width }] = borderBoxSize;\n const [{ blockSize: contentHeight, inlineSize: contentWidth }] =\n contentBoxSize;\n const { onResize, measurements } = observedTarget;\n let sizeChanged = false;\n for (const [dimension, size] of Object.entries(measurements)) {\n const newSize = getTargetSize(\n target as HTMLElement,\n { height, width, contentHeight, contentWidth },\n dimension as measuredDimension\n );\n\n if (newSize !== size) {\n sizeChanged = true;\n measurements[dimension as measuredDimension] = newSize;\n }\n }\n if (sizeChanged) {\n // TODO only return measured sizes\n onResize && onResize(measurements);\n }\n }\n }\n});\n\n// TODO use an optional lag (default to false) to ask to fire onResize\n// with initial size\nexport function useResizeObserver(\n ref: RefObject<Element | HTMLElement | null>,\n dimensions: string[],\n onResize: ResizeHandler,\n reportInitialSize = false\n) {\n const dimensionsRef = useRef(dimensions);\n\n const measure = useCallback((target: HTMLElement): measurements<number> => {\n const { width, height } = target.getBoundingClientRect();\n const { clientWidth: contentWidth, clientHeight: contentHeight } = target;\n return dimensionsRef.current.reduce(\n (map: { [key: string]: number }, dim) => {\n map[dim] = getTargetSize(\n target,\n { width, height, contentHeight, contentWidth },\n dim as measuredDimension\n );\n return map;\n },\n {}\n );\n }, []);\n\n // TODO use ref to store resizeHandler here\n // resize handler registered with REsizeObserver will never change\n // use ref to store user onResize callback here\n // resizeHandler will call user callback.current\n\n // Keep this effect separate in case user inadvertently passes different\n // dimensions or callback instance each time - we only ever want to\n // initiate new observation when ref changes.\n useEffect(() => {\n const target = ref.current as HTMLElement;\n async function registerObserver() {\n // Create the map entry immediately. useEffect may fire below\n // before fonts are ready and attempt to update entry\n observedMap.set(target, { measurements: {} as measurements<number> });\n await document.fonts.ready;\n const observedTarget = observedMap.get(target);\n if (observedTarget) {\n const measurements = measure(target);\n observedTarget.measurements = measurements;\n resizeObserver.observe(target);\n if (reportInitialSize) {\n onResize(measurements);\n }\n } else {\n console.log(\n `%cuseResizeObserver an target expected to be under observation wa snot found. This warrants investigation`,\n \"font-weight:bold; color:red;\"\n );\n }\n }\n\n if (target) {\n // TODO might we want multiple callers to attach a listener to the same element ?\n if (observedMap.has(target)) {\n throw Error(\n \"useResizeObserver attemping to observe same element twice\"\n );\n }\n // TODO set a pending entry on map\n registerObserver();\n }\n return () => {\n if (target && observedMap.has(target)) {\n resizeObserver.unobserve(target);\n observedMap.delete(target);\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [measure, ref]);\n\n useEffect(() => {\n const target = ref.current as HTMLElement;\n const record = observedMap.get(target);\n if (record) {\n if (dimensionsRef.current !== dimensions) {\n dimensionsRef.current = dimensions;\n const measurements = measure(target);\n record.measurements = measurements;\n }\n // Might not have changed, but no harm ...\n record.onResize = onResize;\n }\n }, [dimensions, measure, ref, onResize]);\n}\n", "import {\n Selection,\n SelectionChangeHandler,\n TableSelectionModel,\n} from \"@vuu-ui/vuu-datagrid-types\";\nimport { deselectItem, metadataKeys, selectItem } from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useRef } from \"react\";\nimport { RowClickHandler } from \"./dataTableTypes\";\n\nconst { IDX, SELECTED } = metadataKeys;\n\nconst NO_SELECTION: Selection = [];\n\nexport interface SelectionHookProps {\n selectionModel: TableSelectionModel;\n onSelectionChange: SelectionChangeHandler;\n}\n\nexport const useSelection = ({\n selectionModel,\n onSelectionChange,\n}: SelectionHookProps) => {\n selectionModel === \"extended\" || selectionModel === \"checkbox\";\n const lastActiveRef = useRef(-1);\n const selectedRef = useRef<Selection>(NO_SELECTION);\n\n const handleSelectionChange: RowClickHandler = useCallback(\n (row, rangeSelect, keepExistingSelection) => {\n const { [IDX]: idx, [SELECTED]: isSelected } = row;\n const { current: active } = lastActiveRef;\n const { current: selected } = selectedRef;\n\n const selectOperation = isSelected ? deselectItem : selectItem;\n\n const newSelected = selectOperation(\n selectionModel,\n selected,\n idx,\n rangeSelect,\n keepExistingSelection,\n active\n );\n\n selectedRef.current = newSelected;\n lastActiveRef.current = idx;\n\n if (onSelectionChange) {\n onSelectionChange(newSelected);\n }\n },\n [onSelectionChange, selectionModel]\n );\n\n return handleSelectionChange;\n};\n", "import {\n ColumnDescriptor,\n GridConfig,\n KeyedColumnDescriptor,\n PinLocation,\n} from \"@vuu-ui/vuu-datagrid-types\";\nimport { moveItem } from \"@heswell/salt-lab\";\nimport {\n applyFilterToColumns,\n applyGroupByToColumns,\n applySortToColumns,\n findColumn,\n getCellRenderer,\n getColumnName,\n getTableHeadings,\n getValueFormatter,\n isFilteredColumn,\n isGroupColumn,\n isPinned,\n isTypeDescriptor,\n logger,\n metadataKeys,\n sortPinnedColumns,\n stripFilterFromColumns,\n} from \"@vuu-ui/vuu-utils\";\n\nimport { Reducer, useReducer } from \"react\";\nimport { VuuColumnDataType } from \"@vuu-ui/vuu-protocol-types\";\nimport { DataSourceConfig } from \"@vuu-ui/vuu-data\";\nimport { TableSchema } from \"@vuu-ui/vuu-data/src/message-utils\";\n\nconst { info } = logger(\"useTableModel\");\n\nconst DEFAULT_COLUMN_WIDTH = 100;\nconst KEY_OFFSET = metadataKeys.count;\n\nconst columnWithoutDataType = ({ serverDataType }: ColumnDescriptor) =>\n serverDataType === undefined;\n\nconst getCellRendererForColumn = (column: ColumnDescriptor) => {\n if (isTypeDescriptor(column.type)) {\n return getCellRenderer(column.type?.renderer);\n }\n};\n\nconst getServerDataTypeForColumn = (\n column: ColumnDescriptor,\n tableSchema?: TableSchema\n): VuuColumnDataType => {\n if (column.serverDataType) {\n return column.serverDataType;\n } else if (tableSchema) {\n const schemaColumn = tableSchema.columns.find(\n (col) => col.name === column.name\n );\n if (schemaColumn) {\n return schemaColumn.serverDataType;\n }\n }\n return \"string\";\n};\n\nexport interface TableModel extends Omit<GridConfig, \"columns\"> {\n columns: KeyedColumnDescriptor[];\n tableSchema?: Readonly<TableSchema>;\n}\n\nconst numericTypes = [\"int\", \"long\", \"double\"];\nconst getDefaultAlignment = (serverDataType?: VuuColumnDataType) =>\n serverDataType === undefined\n ? undefined\n : numericTypes.includes(serverDataType)\n ? \"right\"\n : \"left\";\n\nexport interface ColumnActionInit {\n type: \"init\";\n tableConfig: Omit<GridConfig, \"headings\">;\n dataSourceConfig?: DataSourceConfig;\n}\n\nexport interface ColumnActionHide {\n type: \"hideColumns\";\n columns: KeyedColumnDescriptor[];\n}\n\nexport interface ColumnActionShow {\n type: \"showColumns\";\n columns: KeyedColumnDescriptor[];\n}\nexport interface ColumnActionMove {\n type: \"moveColumn\";\n column: KeyedColumnDescriptor;\n moveBy?: 1 | -1;\n moveTo?: number;\n}\n\nexport interface ColumnActionPin {\n type: \"pinColumn\";\n column: ColumnDescriptor;\n pin?: PinLocation;\n}\nexport interface ColumnActionResize {\n type: \"resizeColumn\";\n column: KeyedColumnDescriptor;\n phase: \"begin\" | \"resize\" | \"end\";\n width?: number;\n}\n\nexport interface ColumnActionSetTableSchema {\n type: \"setTableSchema\";\n tableSchema: TableSchema;\n}\n\nexport interface ColumnActionUpdate {\n type: \"updateColumn\";\n column: ColumnDescriptor;\n}\n\nexport interface ColumnActionUpdateProp {\n align?: ColumnDescriptor[\"align\"];\n column: KeyedColumnDescriptor;\n hidden?: ColumnDescriptor[\"hidden\"];\n label?: ColumnDescriptor[\"label\"];\n resizing?: KeyedColumnDescriptor[\"resizing\"];\n type: \"updateColumnProp\";\n width?: ColumnDescriptor[\"width\"];\n}\n\nexport interface ColumnActionTableConfig extends DataSourceConfig {\n confirmed?: boolean;\n type: \"tableConfig\";\n}\n\n/**\n * PersistentColumnActions are those actions that require us to persist user changes across sessions\n */\nexport type PersistentColumnAction = ColumnActionPin | ColumnActionHide;\n\nexport type GridModelAction =\n | ColumnActionHide\n | ColumnActionInit\n | ColumnActionMove\n | ColumnActionPin\n | ColumnActionResize\n | ColumnActionSetTableSchema\n | ColumnActionShow\n | ColumnActionUpdate\n | ColumnActionUpdateProp\n | ColumnActionTableConfig;\n\nexport type GridModelReducer = Reducer<TableModel, GridModelAction>;\n\nexport type ColumnActionDispatch = (action: GridModelAction) => void;\n\nconst columnReducer: GridModelReducer = (state, action) => {\n info?.(`GridModelReducer ${action.type}`);\n switch (action.type) {\n case \"init\":\n return init(action);\n case \"moveColumn\":\n return moveColumn(state, action);\n case \"resizeColumn\":\n return resizeColumn(state, action);\n case \"setTableSchema\":\n return setTableSchema(state, action);\n case \"hideColumns\":\n return hideColumns(state, action);\n case \"showColumns\":\n return showColumns(state, action);\n case \"pinColumn\":\n return pinColumn(state, action);\n case \"updateColumnProp\":\n return updateColumnProp(state, action);\n case \"tableConfig\":\n return updateTableConfig(state, action);\n default:\n console.log(`unhandled action ${action.type}`);\n return state;\n }\n};\n\nexport const useTableModel = (\n tableConfig: Omit<GridConfig, \"headings\">,\n dataSourceConfig?: DataSourceConfig\n) => {\n const [state, dispatchColumnAction] = useReducer<\n GridModelReducer,\n InitialConfig\n >(columnReducer, { tableConfig, dataSourceConfig }, init);\n\n return {\n columns: state.columns,\n dispatchColumnAction,\n headings: state.headings,\n };\n};\n\ntype InitialConfig = {\n dataSourceConfig?: DataSourceConfig;\n tableConfig: Omit<GridConfig, \"headings\">;\n};\n\nfunction init({ dataSourceConfig, tableConfig }: InitialConfig): TableModel {\n const columns = tableConfig.columns.map(\n toKeyedColumWithDefaults(tableConfig)\n );\n const maybePinnedColumns = columns.some(isPinned)\n ? sortPinnedColumns(columns)\n : columns;\n const state = {\n columns: maybePinnedColumns,\n headings: getTableHeadings(maybePinnedColumns),\n };\n if (dataSourceConfig) {\n const { columns, ...rest } = dataSourceConfig;\n return updateTableConfig(state, {\n type: \"tableConfig\",\n ...rest,\n });\n } else {\n return state;\n }\n}\n\nconst getLabel = (\n label: string,\n columnFormatHeader?: \"uppercase\" | \"capitalize\"\n): string => {\n if (columnFormatHeader === \"uppercase\") {\n return label.toUpperCase();\n } else if (columnFormatHeader === \"capitalize\") {\n return label[0].toUpperCase() + label.slice(1).toLowerCase();\n }\n return label;\n};\n\nconst toKeyedColumWithDefaults =\n (options: Partial<TableModel> | Partial<GridConfig>) =>\n (\n column: ColumnDescriptor & { key?: number },\n index: number\n ): KeyedColumnDescriptor => {\n const serverDataType = getServerDataTypeForColumn(\n column,\n (options as Partial<TableModel>).tableSchema\n );\n const { columnDefaultWidth = DEFAULT_COLUMN_WIDTH, columnFormatHeader } =\n options;\n const {\n align = getDefaultAlignment(serverDataType),\n key,\n name,\n label = name,\n width = columnDefaultWidth,\n ...rest\n } = column;\n\n const keyedColumnWithDefaults = {\n ...rest,\n align,\n CellRenderer: getCellRendererForColumn(column),\n label: getLabel(label, columnFormatHeader),\n key: key ?? index + KEY_OFFSET,\n name,\n originalIdx: index,\n serverDataType,\n valueFormatter: getValueFormatter(column),\n width: width,\n };\n\n if (isGroupColumn(keyedColumnWithDefaults)) {\n keyedColumnWithDefaults.columns = keyedColumnWithDefaults.columns.map(\n (col) => toKeyedColumWithDefaults(options)(col, col.key)\n );\n }\n\n return keyedColumnWithDefaults;\n };\n\nfunction moveColumn(\n state: TableModel,\n { column, moveBy, moveTo }: ColumnActionMove\n) {\n const { columns } = state;\n if (typeof moveBy === \"number\") {\n const idx = columns.indexOf(column);\n const newColumns = columns.slice();\n const [movedColumns] = newColumns.splice(idx, 1);\n newColumns.splice(idx + moveBy, 0, movedColumns);\n return {\n ...state,\n columns: newColumns,\n };\n } else if (typeof moveTo === \"number\") {\n const index = columns.indexOf(column);\n return {\n ...state,\n columns: moveItem(columns, index, moveTo),\n };\n }\n return state;\n}\n\nfunction hideColumns(state: TableModel, { columns }: ColumnActionHide) {\n if (columns.some((col) => col.hidden !== true)) {\n return columns.reduce<TableModel>((s, c) => {\n if (c.hidden !== true) {\n return updateColumnProp(s, {\n type: \"updateColumnProp\",\n column: c,\n hidden: true,\n });\n } else {\n return s;\n }\n }, state);\n } else {\n return state;\n }\n}\nfunction showColumns(state: TableModel, { columns }: ColumnActionShow) {\n if (columns.some((col) => col.hidden)) {\n return columns.reduce<TableModel>((s, c) => {\n if (c.hidden) {\n return updateColumnProp(s, {\n type: \"updateColumnProp\",\n column: c,\n hidden: false,\n });\n } else {\n return s;\n }\n }, state);\n } else {\n return state;\n }\n}\n\nfunction resizeColumn(\n state: TableModel,\n { column, phase, width }: ColumnActionResize\n) {\n const type = \"updateColumnProp\";\n const resizing = phase !== \"end\";\n\n switch (phase) {\n case \"begin\":\n case \"end\":\n return updateColumnProp(state, { type, column, resizing });\n case \"resize\":\n return updateColumnProp(state, { type, column, width });\n default:\n throw Error(`useTableModel.resizeColumn, invalid resizePhase ${phase}`);\n }\n}\n\nfunction setTableSchema(\n state: TableModel,\n { tableSchema }: ColumnActionSetTableSchema\n) {\n const { columns } = state;\n if (columns.some(columnWithoutDataType)) {\n const cols = columns.map((column) => {\n const serverDataType = getServerDataTypeForColumn(column, tableSchema);\n return {\n ...column,\n align: column.align ?? getDefaultAlignment(serverDataType),\n serverDataType,\n };\n });\n\n return {\n ...state,\n columns: cols,\n tableSchema,\n };\n } else {\n return {\n ...state,\n tableSchema,\n };\n }\n}\n\nfunction pinColumn(state: TableModel, action: ColumnActionPin) {\n let { columns } = state;\n const { column, pin } = action;\n const targetColumn = columns.find((col) => col.name === column.name);\n if (targetColumn) {\n columns = replaceColumn(columns, { ...targetColumn, pin });\n columns = sortPinnedColumns(columns);\n return {\n ...state,\n columns,\n };\n } else {\n return state;\n }\n}\nfunction updateColumnProp(state: TableModel, action: ColumnActionUpdateProp) {\n let { columns } = state;\n const { align, column, hidden, label, resizing, width } = action;\n const targetColumn = columns.find((col) => col.name === column.name);\n if (targetColumn) {\n if (align === \"left\" || align === \"right\") {\n columns = replaceColumn(columns, { ...targetColumn, align });\n }\n if (typeof label === \"string\") {\n columns = replaceColumn(columns, { ...targetColumn, label });\n }\n if (typeof resizing === \"boolean\") {\n columns = replaceColumn(columns, { ...targetColumn, resizing });\n }\n if (typeof hidden === \"boolean\") {\n columns = replaceColumn(columns, { ...targetColumn, hidden });\n }\n if (typeof width === \"number\") {\n columns = replaceColumn(columns, { ...targetColumn, width });\n }\n }\n return {\n ...state,\n columns,\n };\n}\n\nfunction updateTableConfig(\n state: TableModel,\n { columns, confirmed, filter, groupBy, sort }: ColumnActionTableConfig\n) {\n const hasColumns = columns && columns.length > 0;\n const hasGroupBy = groupBy !== undefined;\n const hasFilter = typeof filter?.filter === \"string\";\n const hasSort = sort && sort.sortDefs.length > 0;\n\n //TODO check if just confirmed has changed\n\n let result = state;\n\n if (hasColumns) {\n result = {\n ...state,\n columns: columns.map((colName, index) => {\n const columnName = getColumnName(colName);\n const key: number = index + KEY_OFFSET;\n const col = findColumn(result.columns, columnName);\n if (col) {\n if (col.key === key) {\n return col;\n } else {\n return {\n ...col,\n key,\n };\n }\n } else {\n // we have a column which was not previously included.\n // TODO How do we get the serverDataType\n // TODO it needs to be available in availableCOlumns or allColumns in state\n return toKeyedColumWithDefaults(state)(\n {\n name: colName,\n },\n index\n );\n }\n throw Error(`useTableModel column ${colName} not found`);\n }),\n };\n }\n\n if (hasGroupBy) {\n result = {\n ...state,\n columns: applyGroupByToColumns(result.columns, groupBy, confirmed),\n };\n }\n\n if (hasSort) {\n result = {\n ...state,\n columns: applySortToColumns(result.columns, sort),\n };\n }\n\n if (hasFilter) {\n result = {\n ...state,\n columns: applyFilterToColumns(result.columns, filter),\n };\n } else if (result.columns.some(isFilteredColumn)) {\n result = {\n ...state,\n columns: stripFilterFromColumns(result.columns),\n };\n }\n\n return result;\n}\n\nfunction replaceColumn(\n state: KeyedColumnDescriptor[],\n column: KeyedColumnDescriptor\n) {\n return state.map((col) => (col.name === column.name ? column : col));\n}\n", "import { useCallback, useRef } from \"react\";\nimport { Viewport } from \"./dataTableTypes\";\n\nexport interface ScrollRequestEnd {\n type: \"scroll-end\";\n direction: \"home\" | \"end\";\n}\n\nexport interface ScrollRequestPage {\n type: \"scroll-page\";\n direction: \"up\" | \"down\";\n}\n\nexport interface ScrollRequestDistance {\n type: \"scroll-distance\";\n distance: number;\n}\n\nexport type ScrollRequest =\n | ScrollRequestPage\n | ScrollRequestDistance\n | ScrollRequestEnd;\n\nexport type ScrollRequestHandler = (request: ScrollRequest) => void;\n\nconst getPctScroll = (container: HTMLElement) => {\n const { scrollLeft, scrollTop } = container;\n const { clientHeight, clientWidth, scrollHeight, scrollWidth } = container;\n const pctScrollLeft = scrollLeft / (scrollWidth - clientWidth);\n const pctScrollTop = scrollTop / (scrollHeight - clientHeight);\n return [pctScrollLeft, pctScrollTop];\n};\n\nconst getMaxScroll = (container: HTMLElement) => {\n const { clientHeight, clientWidth, scrollHeight, scrollWidth } = container;\n return [scrollWidth - clientWidth, scrollHeight - clientHeight];\n};\n\ninterface CallbackRefHookProps<T = HTMLElement> {\n onAttach?: (el: T) => void;\n onDetach: (el: T) => void;\n label?: string;\n}\n\nconst useCallbackRef = <T = HTMLElement>({\n onAttach,\n onDetach,\n}: CallbackRefHookProps<T>) => {\n const ref = useRef<T | null>(null);\n const callbackRef = useCallback(\n (el: T | null) => {\n if (el) {\n ref.current = el;\n onAttach?.(el);\n } else if (ref.current) {\n const { current: originalRef } = ref;\n ref.current = el;\n onDetach?.(originalRef);\n }\n },\n [onAttach, onDetach]\n );\n return callbackRef;\n};\n\nexport interface TableScrollHookProps {\n onHorizontalScroll?: (scrollLeft: number) => void;\n onVerticalScroll?: (scrollTop: number, pctScrollTop: number) => void;\n viewportHeight: number;\n viewport: Viewport;\n}\n\nexport const useTableScroll = ({\n onHorizontalScroll,\n onVerticalScroll,\n viewport,\n}: TableScrollHookProps) => {\n const contentContainerScrolledRef = useRef(false);\n\n const scrollPosRef = useRef({ scrollTop: 0, scrollLeft: 0 });\n const scrollbarContainerRef = useRef<HTMLDivElement | null>(null);\n const contentContainerRef = useRef<HTMLDivElement | null>(null);\n const {\n maxScrollContainerScrollHorizontal: maxScrollLeft,\n maxScrollContainerScrollVertical: maxScrollTop,\n } = viewport;\n\n const handleScrollbarContainerScroll = useCallback(() => {\n const { current: contentContainer } = contentContainerRef;\n const { current: scrollbarContainer } = scrollbarContainerRef;\n const { current: contentContainerScrolled } = contentContainerScrolledRef;\n if (contentContainerScrolled) {\n contentContainerScrolledRef.current = false;\n } else if (contentContainer && scrollbarContainer) {\n const [pctScrollLeft, pctScrollTop] = getPctScroll(scrollbarContainer);\n const [maxScrollLeft, maxScrollTop] = getMaxScroll(contentContainer);\n const rootScrollLeft = Math.round(pctScrollLeft * maxScrollLeft);\n const rootScrollTop = Math.round(pctScrollTop * maxScrollTop);\n contentContainer.scrollTo({\n left: rootScrollLeft,\n top: rootScrollTop,\n behavior: \"auto\",\n });\n }\n }, []);\n\n const handleContentContainerScroll = useCallback(() => {\n const { current: contentContainer } = contentContainerRef;\n const { current: scrollbarContainer } = scrollbarContainerRef;\n const { current: scrollPos } = scrollPosRef;\n\n if (contentContainer && scrollbarContainer) {\n const { scrollLeft, scrollTop } = contentContainer;\n const [pctScrollLeft, pctScrollTop] = getPctScroll(contentContainer);\n contentContainerScrolledRef.current = true;\n\n scrollbarContainer.scrollLeft = Math.round(pctScrollLeft * maxScrollLeft);\n scrollbarContainer.scrollTop = Math.round(pctScrollTop * maxScrollTop);\n\n if (scrollPos.scrollTop !== scrollTop) {\n scrollPos.scrollTop = scrollTop;\n onVerticalScroll?.(scrollTop, pctScrollTop);\n }\n if (scrollPos.scrollLeft !== scrollLeft) {\n scrollPos.scrollLeft = scrollLeft;\n onHorizontalScroll?.(scrollLeft);\n }\n }\n }, [maxScrollLeft, maxScrollTop, onHorizontalScroll, onVerticalScroll]);\n\n const handleAttachScrollbarContainer = useCallback(\n (el: HTMLDivElement) => {\n scrollbarContainerRef.current = el;\n el.addEventListener(\"scroll\", handleScrollbarContainerScroll, {\n passive: true,\n });\n },\n [handleScrollbarContainerScroll]\n );\n\n const handleDetachScrollbarContainer = useCallback(\n (el: HTMLDivElement) => {\n scrollbarContainerRef.current = null;\n el.removeEventListener(\"scroll\", handleScrollbarContainerScroll);\n },\n [handleScrollbarContainerScroll]\n );\n\n const handleAttachContentContainer = useCallback(\n (el: HTMLDivElement) => {\n contentContainerRef.current = el;\n el.addEventListener(\"scroll\", handleContentContainerScroll, {\n passive: true,\n });\n },\n [handleContentContainerScroll]\n );\n\n const handleDetachContentContainer = useCallback(\n (el: HTMLDivElement) => {\n contentContainerRef.current = null;\n el.removeEventListener(\"scroll\", handleContentContainerScroll);\n },\n [handleContentContainerScroll]\n );\n\n const contentContainerCallbackRef = useCallbackRef({\n onAttach: handleAttachContentContainer,\n onDetach: handleDetachContentContainer,\n });\n\n const scrollbarContainerCallbackRef = useCallbackRef({\n onAttach: handleAttachScrollbarContainer,\n onDetach: handleDetachScrollbarContainer,\n });\n\n const requestScroll: ScrollRequestHandler = useCallback(\n (scrollRequest) => {\n const { current: scrollbarContainer } = contentContainerRef;\n if (scrollbarContainer) {\n contentContainerScrolledRef.current = false;\n if (scrollRequest.type === \"scroll-page\") {\n const { clientHeight, scrollLeft, scrollTop } = scrollbarContainer;\n const { direction } = scrollRequest;\n const scrollBy = direction === \"down\" ? clientHeight : -clientHeight;\n const newScrollTop = Math.min(\n Math.max(0, scrollTop + scrollBy),\n maxScrollTop\n );\n scrollbarContainer.scrollTo({\n top: newScrollTop,\n left: scrollLeft,\n behavior: \"auto\",\n });\n } else if (scrollRequest.type === \"scroll-end\") {\n const { direction } = scrollRequest;\n const scrollTo = direction === \"end\" ? maxScrollTop : 0;\n scrollbarContainer.scrollTo({\n top: scrollTo,\n left: scrollbarContainer.scrollLeft,\n behavior: \"auto\",\n });\n }\n }\n },\n [maxScrollTop]\n );\n\n return {\n /** Ref to be assigned to ScrollbarContainer */\n scrollbarContainerRef: scrollbarContainerCallbackRef,\n /** Ref to be assigned to ContentContainer */\n contentContainerRef: contentContainerCallbackRef,\n /** Scroll the table */\n requestScroll,\n };\n};\n", "/**\n * This hook measures and calculates the values needed to manage layout\n * and virtualisation of the table. This includes measurements required\n * to support pinned columns.\n */\nimport {\n KeyedColumnDescriptor,\n TableHeadings,\n} from \"@vuu-ui/vuu-datagrid-types\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { MeasuredSize } from \"./useMeasuredContainer\";\nimport {\n actualRowPositioning,\n RowAtPositionFunc,\n RowOffsetFunc,\n RowPositioning,\n virtualRowPositioning,\n} from \"@vuu-ui/vuu-utils\";\n\nexport interface TableViewportHookProps {\n columns: KeyedColumnDescriptor[];\n headerHeight: number;\n headings: TableHeadings;\n rowCount: number;\n rowHeight: number;\n size?: MeasuredSize;\n}\n\nexport interface ViewportMeasurements {\n contentHeight: number;\n horizontalScrollbarHeight: number;\n maxScrollContainerScrollHorizontal: number;\n maxScrollContainerScrollVertical: number;\n pinnedWidthLeft: number;\n pinnedWidthRight: number;\n rowCount: number;\n contentWidth: number;\n totalHeaderHeight: number;\n verticalScrollbarWidth: number;\n viewportBodyHeight: number;\n}\n\nexport interface TableViewportHookResult extends ViewportMeasurements {\n getRowAtPosition: RowAtPositionFunc;\n getRowOffset: RowOffsetFunc;\n setPctScrollTop: (scrollPct: number) => void;\n}\n\n// Too simplistic, it depends on rowHeight\nconst MAX_RAW_ROWS = 1_500_000;\n\nconst UNMEASURED_VIEWPORT: TableViewportHookResult = {\n contentHeight: 0,\n contentWidth: 0,\n getRowAtPosition: () => -1,\n getRowOffset: () => -1,\n horizontalScrollbarHeight: 0,\n maxScrollContainerScrollHorizontal: 0,\n maxScrollContainerScrollVertical: 0,\n pinnedWidthLeft: 0,\n pinnedWidthRight: 0,\n rowCount: 0,\n setPctScrollTop: () => undefined,\n totalHeaderHeight: 0,\n verticalScrollbarWidth: 0,\n viewportBodyHeight: 0,\n};\n\nconst measurePinnedColumns = (columns: KeyedColumnDescriptor[]) => {\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 { pinnedWidthLeft, pinnedWidthRight, unpinnedWidth };\n};\n\nexport const useTableViewport = ({\n columns,\n headerHeight,\n headings,\n rowCount,\n rowHeight,\n size,\n}: TableViewportHookProps): TableViewportHookResult => {\n const pctScrollTopRef = useRef(0);\n const appliedRowCount = Math.min(rowCount, MAX_RAW_ROWS);\n const appliedContentHeight = appliedRowCount * rowHeight;\n const virtualContentHeight = rowCount * rowHeight;\n const virtualisedExtent = virtualContentHeight - appliedContentHeight;\n\n const { pinnedWidthLeft, pinnedWidthRight, unpinnedWidth } = useMemo(\n () => measurePinnedColumns(columns),\n [columns]\n );\n\n const [actualRowOffset, actualRowAtPosition] = useMemo<RowPositioning>(\n () => actualRowPositioning(rowHeight),\n [rowHeight]\n );\n\n const [getRowOffset, getRowAtPosition] = useMemo<RowPositioning>(() => {\n if (virtualisedExtent) {\n return virtualRowPositioning(\n rowHeight,\n virtualisedExtent,\n pctScrollTopRef\n );\n } else {\n return [actualRowOffset, actualRowAtPosition];\n }\n }, [actualRowAtPosition, actualRowOffset, virtualisedExtent, rowHeight]);\n\n const setPctScrollTop = useCallback((scrollPct: number) => {\n pctScrollTopRef.current = scrollPct;\n }, []);\n\n return useMemo(() => {\n if (size) {\n const headingsDepth = headings.length;\n const scrollbarSize = 15;\n const contentWidth = pinnedWidthLeft + unpinnedWidth + pinnedWidthRight;\n const horizontalScrollbarHeight =\n contentWidth > size.width ? scrollbarSize : 0;\n const totalHeaderHeight = headerHeight * (1 + headingsDepth);\n const maxScrollContainerScrollVertical =\n appliedContentHeight -\n ((size?.height ?? 0) - horizontalScrollbarHeight) +\n totalHeaderHeight;\n const maxScrollContainerScrollHorizontal =\n contentWidth - size.width + pinnedWidthLeft;\n const visibleRows = (size.height - headerHeight) / rowHeight;\n const count = Number.isInteger(visibleRows)\n ? visibleRows + 1\n : Math.ceil(visibleRows);\n const viewportBodyHeight = size.height - totalHeaderHeight;\n const verticalScrollbarWidth =\n appliedContentHeight > viewportBodyHeight ? scrollbarSize : 0;\n\n return {\n contentHeight: appliedContentHeight,\n getRowAtPosition,\n getRowOffset,\n horizontalScrollbarHeight,\n maxScrollContainerScrollHorizontal,\n maxScrollContainerScrollVertical,\n pinnedWidthLeft,\n pinnedWidthRight,\n rowCount: count,\n contentWidth,\n setPctScrollTop,\n totalHeaderHeight,\n verticalScrollbarWidth,\n viewportBodyHeight,\n };\n } else {\n return UNMEASURED_VIEWPORT;\n }\n }, [\n size,\n headings.length,\n pinnedWidthLeft,\n unpinnedWidth,\n pinnedWidthRight,\n appliedContentHeight,\n headerHeight,\n rowHeight,\n getRowAtPosition,\n getRowOffset,\n setPctScrollTop,\n ]);\n};\n", "import { KeyedColumnDescriptor } from \"@vuu-ui/vuu-datagrid-types\";\nimport {\n getColumnsInViewport,\n itemsChanged,\n RowAtPositionFunc,\n} from \"@vuu-ui/vuu-utils\";\nimport { VuuRange } from \"@vuu-ui/vuu-protocol-types\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { ViewportMeasurements } from \"./useTableViewport\";\n\nexport interface VirtualViewportHookProps {\n columns: KeyedColumnDescriptor[];\n getRowAtPosition: RowAtPositionFunc;\n setRange: (range: VuuRange) => void;\n viewportMeasurements: ViewportMeasurements;\n}\nexport interface VirtualViewportHookResult {\n onHorizontalScroll: (scrollLeft: number) => void;\n onVerticalScroll: (scrollTop: number) => void;\n columnsWithinViewport: KeyedColumnDescriptor[];\n virtualColSpan: number;\n}\n\nexport const useVirtualViewport = ({\n columns,\n getRowAtPosition,\n setRange,\n viewportMeasurements,\n}: VirtualViewportHookProps): VirtualViewportHookResult => {\n const firstRowRef = useRef<number>(-1);\n const {\n rowCount: viewportRowCount,\n contentWidth,\n maxScrollContainerScrollHorizontal,\n } = viewportMeasurements;\n // double check this ...\n const availableWidth = contentWidth - maxScrollContainerScrollHorizontal;\n const scrollLeftRef = useRef(0);\n\n const [visibleColumns, preSpan] = useMemo(\n () =>\n getColumnsInViewport(\n columns,\n scrollLeftRef.current,\n scrollLeftRef.current + availableWidth\n ),\n [availableWidth, columns]\n );\n\n const preSpanRef = useRef(preSpan);\n\n useEffect(() => {\n setColumnsWithinViewport(visibleColumns);\n }, [visibleColumns]);\n\n const [columnsWithinViewport, setColumnsWithinViewport] =\n useState<KeyedColumnDescriptor[]>(visibleColumns);\n\n const handleHorizontalScroll = useCallback(\n (scrollLeft: number) => {\n scrollLeftRef.current = scrollLeft;\n const [visibleColumns, pre] = getColumnsInViewport(\n columns,\n scrollLeft,\n scrollLeft + availableWidth\n );\n if (itemsChanged(columnsWithinViewport, visibleColumns)) {\n preSpanRef.current = pre;\n\n setColumnsWithinViewport(visibleColumns);\n }\n },\n [availableWidth, columns, columnsWithinViewport]\n );\n\n const handleVerticalScroll = useCallback(\n (scrollTop: number) => {\n const firstRow = getRowAtPosition(scrollTop);\n if (firstRow !== firstRowRef.current) {\n firstRowRef.current = firstRow;\n setRange({ from: firstRow, to: firstRow + viewportRowCount });\n }\n },\n [getRowAtPosition, setRange, viewportRowCount]\n );\n\n return {\n columnsWithinViewport,\n onHorizontalScroll: handleHorizontalScroll,\n onVerticalScroll: handleVerticalScroll,\n /** number of leading columns not rendered because of virtualization */\n virtualColSpan: preSpanRef.current,\n };\n};\n", "import { TableCellProps } from \"@vuu-ui/vuu-datagrid-types\";\nimport cx from \"classnames\";\nimport {\n isJsonAttribute,\n metadataKeys,\n registerComponent,\n} from \"@vuu-ui/vuu-utils\";\n\nimport \"./JsonCell.css\";\n\nconst classBase = \"vuuJsonCell\";\n\nconst { IS_EXPANDED, KEY } = metadataKeys;\n\nconst localKey = (key: string) => {\n const pos = key.lastIndexOf(\"|\");\n if (pos === -1) {\n return \"\";\n } else {\n return key.slice(pos + 1);\n }\n};\n\nconst JsonCell = ({ column, row }: TableCellProps) => {\n const { key: columnKey /*, type, valueFormatter */ } = column;\n let value = row[columnKey];\n let isToggle = false;\n if (isJsonAttribute(value)) {\n value = value.slice(0, -1);\n isToggle = true;\n }\n const rowKey = localKey(row[KEY]);\n const className = cx({\n [`${classBase}-name`]: rowKey === value,\n [`${classBase}-value`]: rowKey !== value,\n [`${classBase}-group`]: isToggle,\n });\n\n if (isToggle) {\n const toggleIcon = row[IS_EXPANDED] ? \"minus-box\" : \"plus-box\";\n return (\n <span className={className}>\n <span className={`${classBase}-value`}>{value}</span>\n <span className={`${classBase}-toggle`} data-icon={toggleIcon} />\n </span>\n );\n } else if (value) {\n return <span className={className}>{value}</span>;\n } else {\n return null;\n }\n};\n\nregisterComponent(\"json\", JsonCell, \"cell-renderer\", {});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["import_vuu_utils", "import_vuu_popups", "import_vuu_utils", "import_react", "import_vuu_utils", "import_classnames", "import_react", "import_vuu_utils", "cx", "import_vuu_utils", "import_react", "import_jsx_runtime", "import_jsx_runtime", "cx", "import_classnames", "import_react", "import_react", "import_jsx_runtime", "import_react", "import_jsx_runtime", "classBase", "cx", "import_classnames", "import_react", "import_classnames", "import_jsx_runtime", "classBase", "cx", "import_vuu_popups", "import_classnames", "import_react", "import_jsx_runtime", "cx", "import_jsx_runtime", "classBase", "cx", "import_jsx_runtime", "classBase", "import_vuu_popups", "import_vuu_utils", "import_react", "import_vuu_utils", "import_react", "SELECTED", "range", "import_salt_lab", "import_react", "import_vuu_utils", "import_react", "_a", "import_vuu_utils", "import_react", "import_react", "import_vuu_utils", "import_react", "IDX", "SELECTED", "import_salt_lab", "import_vuu_utils", "import_react", "pinColumn", "columns", "import_react", "maxScrollLeft", "maxScrollTop", "import_react", "import_vuu_utils", "import_vuu_utils", "import_react", "visibleColumns", "KEY", "IS_EXPANDED", "IS_LEAF", "column", "row", "columns", "config", "usePopupContextMenu", "_a", "import_classnames", "import_vuu_utils", "import_jsx_runtime", "classBase", "cx", "import_classnames", "import_vuu_utils", "import_jsx_runtime", "classBase", "IS_EXPANDED", "KEY", "cx"]
|
|
7
7
|
}
|