@vuu-ui/vuu-table-extras 0.8.22-debug → 0.8.23-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.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../packages/vuu-table-extras/src/index.ts", "../../../packages/vuu-table-extras/src/cell-edit-validators/CaseValidator.ts", "../../../packages/vuu-table-extras/src/cell-edit-validators/PatternValidator.ts", "../../../packages/vuu-table/src/header-cell/GroupHeaderCellNext.tsx", "../../../packages/vuu-table/src/column-header-pill/ColumnHeaderPill.tsx", "../../../packages/vuu-table/src/column-header-pill/GroupColumnPill.tsx", "../../../packages/vuu-table/src/column-header-pill/SortIndicator.tsx", "../../../packages/vuu-table/src/column-resizing/ColumnResizer.tsx", "../../../packages/vuu-table/src/column-resizing/useTableColumnResize.tsx", "../../../packages/vuu-table/src/useCell.ts", "../../../packages/vuu-table/src/header-cell/HeaderCell.tsx", "../../../packages/vuu-table/src/column-menu/ColumnMenu.tsx", "../../../packages/vuu-table/src/Table.tsx", "../../../packages/vuu-table/src/Row.tsx", "../../../packages/vuu-table/src/table-cell/TableCell.tsx", "../../../packages/vuu-table/src/table-cell/TableGroupCell.tsx", "../../../packages/vuu-table/src/useTable.ts", "../../../packages/vuu-table/src/context-menu/buildContextMenuDescriptors.ts", "../../../packages/vuu-table/src/context-menu/useHandleTableContextMenu.ts", "../../../packages/vuu-table/src/table-config.ts", "../../../packages/vuu-table/src/useCellEditing.ts", "../../../packages/vuu-table/src/table-dom-utils.ts", "../../../packages/vuu-table/src/useDataSource.ts", "../../../packages/vuu-table/src/moving-window.ts", "../../../packages/vuu-table/src/useInitialValue.ts", "../../../packages/vuu-table/src/useKeyboardNavigation.ts", "../../../packages/vuu-table/src/useSelection.ts", "../../../packages/vuu-table/src/useTableContextMenu.ts", "../../../packages/vuu-table/src/useTableModel.ts", "../../../packages/vuu-table/src/useTableScroll.ts", "../../../packages/vuu-table/src/useTableViewport.ts", "../../../packages/vuu-table/src/useTableAndColumnSettings.ts", "../../../packages/vuu-table/src/table-header/TableHeader.tsx", "../../../packages/vuu-table/src/table-header/useTableHeader.ts", "../../../packages/vuu-table/src/cell-renderers/checkbox-cell/CheckboxCell.tsx", "../../../packages/vuu-table/src/cell-renderers/cell-utils.ts", "../../../packages/vuu-table/src/cell-renderers/input-cell/InputCell.tsx", "../../../packages/vuu-table/src/cell-renderers/toggle-cell/ToggleCell.tsx", "../../../packages/vuu-table/src/useControlledTableNavigation.ts", "../../../packages/vuu-table-extras/src/cell-renderers/background-cell/BackgroundCell.tsx", "../../../packages/vuu-table-extras/src/cell-renderers/background-cell/useDirection.ts", "../../../packages/vuu-table-extras/src/cell-renderers/background-cell/BackgroundCellConfigurationEditor.tsx", "../../../packages/vuu-table-extras/src/cell-renderers/dropdown-cell/DropdownCell.tsx", "../../../packages/vuu-table-extras/src/cell-renderers/lookup-cell/LookupCell.tsx", "../../../packages/vuu-table-extras/src/cell-renderers/progress-cell/ProgressCell.tsx", "../../../packages/vuu-table-extras/src/column-list/ColumnList.tsx", "../../../packages/vuu-table-extras/src/column-settings/ColumnSettingsPanel.tsx", "../../../packages/vuu-table-extras/src/column-expression-panel/ColumnExpressionPanel.tsx", "../../../packages/vuu-table-extras/src/column-expression-input/ColumnExpressionInput.tsx", "../../../packages/vuu-table-extras/src/column-expression-input/useColumnExpressionEditor.ts", "../../../packages/vuu-table-extras/src/column-expression-input/column-language-parser/ColumnExpressionLanguage.ts", "../../../packages/vuu-table-extras/src/column-expression-input/column-language-parser/generated/column-parser.js", "../../../packages/vuu-table-extras/src/column-expression-input/column-language-parser/ColumnExpressionTreeWalker.ts", "../../../packages/vuu-table-extras/src/column-expression-input/column-language-parser/column-expression-parse-utils.ts", "../../../packages/vuu-table-extras/src/column-expression-input/highlighting.ts", "../../../packages/vuu-table-extras/src/column-expression-input/theme.ts", "../../../packages/vuu-table-extras/src/column-expression-input/useColumnAutoComplete.ts", "../../../packages/vuu-table-extras/src/column-expression-input/useColumnExpressionSuggestionProvider.ts", "../../../packages/vuu-table-extras/src/column-expression-input/column-function-descriptors.ts", "../../../packages/vuu-table-extras/src/column-expression-input/functionDocInfo.ts", "../../../packages/vuu-table-extras/src/column-expression-panel/useColumnExpression.ts", "../../../packages/vuu-table-extras/src/column-formatting-settings/ColumnFormattingPanel.tsx", "../../../packages/vuu-table-extras/src/column-formatting-settings/BaseNumericFormattingSettings.tsx", "../../../packages/vuu-table-extras/src/column-formatting-settings/LongTypeFormattingSettings.tsx", "../../../packages/vuu-table-extras/src/column-formatting-settings/DateTimeFormattingSettings.tsx", "../../../packages/vuu-table-extras/src/column-settings/ColumnNameLabel.tsx", "../../../packages/vuu-table-extras/src/column-settings/useColumnSettings.ts", "../../../packages/vuu-table-extras/src/datasource-stats/DatasourceStats.tsx", "../../../packages/vuu-table-extras/src/table-settings/TableSettingsPanel.tsx", "../../../packages/vuu-table-extras/src/table-settings/useTableSettings.ts"],
4
- "sourcesContent": ["export * from \"./cell-edit-validators\";\nexport * from \"./cell-renderers\";\nexport * from \"./column-list\";\nexport * from \"./column-settings\";\nexport * from \"./column-expression-input\";\nexport * from \"./column-expression-panel\";\nexport * from \"./column-formatting-settings\";\nexport * from \"./datasource-stats\";\nexport * from \"./table-settings\";\n", "import { EditRuleValidator, registerComponent } from \"@vuu-ui/vuu-utils\";\nimport { VuuRowDataItemType } from \"@vuu-ui/vuu-protocol-types\";\n\nconst isString = (value?: VuuRowDataItemType): value is string =>\n typeof value === \"string\";\n\nexport const CaseValidator: EditRuleValidator = (rule, value) => {\n if (isString(value)) {\n if (value === \"\") {\n return true;\n } else if (rule.value === \"lower\" && value.toLowerCase() !== value) {\n return \"value must be all lowercase\";\n } else if (rule.value === \"upper\" && value.toUpperCase() !== value) {\n return \"value must be all uppercase\";\n } else {\n return true;\n }\n } else {\n return \"value must be a string\";\n }\n};\n\nregisterComponent(\"vuu-case\", CaseValidator, \"data-edit-validator\", {});\n", "import { EditRuleValidator, registerComponent } from \"@vuu-ui/vuu-utils\";\nimport { VuuRowDataItemType } from \"@vuu-ui/vuu-protocol-types\";\n\nconst isString = (value?: VuuRowDataItemType): value is string =>\n typeof value === \"string\";\n\nconst defaultMessage = \"value does not match expected pattern\";\n\nexport const PatternValidator: EditRuleValidator = (rule, value) => {\n if (typeof rule.value !== \"string\") {\n throw Error(\"Pattern validation rule must provide pattern\");\n }\n if (isString(value)) {\n if (value === \"\") {\n return true;\n } else {\n const { message = defaultMessage } = rule;\n const pattern = new RegExp(rule.value);\n return pattern.test(value) || message;\n }\n } else {\n return \"value must be a string\";\n }\n};\n\nregisterComponent(\"vuu-pattern\", PatternValidator, \"data-edit-validator\", {});\n", "import { OverflowContainer } from \"@vuu-ui/vuu-layout\";\nimport {\n ColumnDescriptor,\n GroupColumnDescriptor,\n HeaderCellProps,\n RuntimeColumnDescriptor,\n} from \"@vuu-ui/vuu-table-types\";\nimport { useLayoutEffectSkipFirst } from \"@vuu-ui/vuu-utils\";\nimport cx from \"clsx\";\nimport { useCallback, useRef, useState } from \"react\";\nimport { ColumnHeaderPill, GroupColumnPill } from \"../column-header-pill\";\nimport { ColumnResizer, useTableColumnResize } from \"../column-resizing\";\nimport { useCell } from \"../useCell\";\n\nimport \"./GroupHeaderCell.css\";\n\nconst classBase = \"vuuTableGroupHeaderCell\";\n\nconst switchIfChanged = (\n columns: RuntimeColumnDescriptor[],\n newColumns: RuntimeColumnDescriptor[]\n) => {\n if (columns === newColumns) {\n return columns;\n } else {\n return newColumns;\n }\n};\n\nexport interface GroupHeaderCellNextProps\n extends Omit<HeaderCellProps, \"onDragStart\" | \"onDrag\" | \"onDragEnd\"> {\n column: GroupColumnDescriptor;\n onMoveColumn?: (columns: ColumnDescriptor[]) => void;\n onRemoveColumn: (column: RuntimeColumnDescriptor) => void;\n}\n\nexport const GroupHeaderCellNext = ({\n column: groupColumn,\n className: classNameProp,\n onMoveColumn,\n onRemoveColumn,\n onResize,\n ...htmlAttributes\n}: GroupHeaderCellNextProps) => {\n const rootRef = useRef<HTMLTableCellElement>(null);\n const { isResizing, ...resizeProps } = useTableColumnResize({\n column: groupColumn,\n onResize,\n rootRef,\n });\n\n const [columns, setColumns] = useState(groupColumn.columns);\n const { className, style } = useCell(groupColumn, classBase, true);\n const columnPillProps =\n columns.length > 1\n ? {\n removable: true,\n onRemove: onRemoveColumn,\n }\n : undefined;\n\n const handleMoveItem = useCallback(\n (fromIndex, toIndex) => {\n setColumns((cols) => {\n const newCols = cols.slice();\n const [tab] = newCols.splice(fromIndex, 1);\n if (toIndex === -1) {\n const result = newCols.concat(tab);\n onMoveColumn?.(result);\n return result;\n } else {\n newCols.splice(toIndex, 0, tab);\n onMoveColumn?.(newCols);\n return newCols;\n }\n });\n },\n [onMoveColumn]\n );\n\n useLayoutEffectSkipFirst(() => {\n setColumns((cols) => switchIfChanged(cols, groupColumn.columns));\n }, [groupColumn.columns]);\n\n return (\n <div\n {...htmlAttributes}\n className={cx(className, classNameProp, {\n [`${classBase}-pending`]: groupColumn.groupConfirmed === false,\n })}\n ref={rootRef}\n role=\"columnheader\"\n style={style}\n >\n <OverflowContainer\n allowDragDrop\n className={`${classBase}-inner`}\n height={24}\n onMoveItem={handleMoveItem}\n overflowPosition=\"start\"\n >\n {columns.map((column) => {\n return (\n <GroupColumnPill\n {...columnPillProps}\n column={column}\n key={column.key}\n />\n );\n })}\n </OverflowContainer>\n <ColumnHeaderPill\n column={groupColumn}\n removable\n onRemove={onRemoveColumn}\n />\n\n {groupColumn.resizeable !== false ? (\n <ColumnResizer {...resizeProps} />\n ) : null}\n </div>\n );\n};\n", "import cx from \"clsx\";\nimport { RuntimeColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { HTMLAttributes, MouseEvent, useCallback } from \"react\";\n\nimport \"./ColumnHeaderPill.css\";\n\nexport interface ColumnHeaderPillProps extends HTMLAttributes<HTMLDivElement> {\n column: RuntimeColumnDescriptor;\n removable?: boolean;\n onRemove?: (column: RuntimeColumnDescriptor) => void;\n}\n\nconst classBase = \"vuuColumnHeaderPill\";\n\nexport const ColumnHeaderPill = ({\n children,\n className,\n column,\n onRemove,\n removable,\n ...htmlAttributes\n}: ColumnHeaderPillProps) => {\n if (removable && typeof onRemove !== \"function\") {\n throw Error(\n \"ColumnHeaderPill onRemove prop must be provided if Pill is removable\"\n );\n }\n\n const handleClickRemove = useCallback(\n (evt: MouseEvent<HTMLSpanElement>) => {\n evt.preventDefault();\n evt.stopPropagation();\n onRemove?.(column);\n },\n [column, onRemove]\n );\n\n return (\n <div {...htmlAttributes} className={cx(classBase, className)}>\n {children}\n {removable ? (\n <span\n className={`${classBase}-removeButton`}\n role=\"button\"\n data-icon=\"cross\"\n onClick={handleClickRemove}\n />\n ) : null}\n </div>\n );\n};\n", "import { RuntimeColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { ColumnHeaderPill, ColumnHeaderPillProps } from \"./ColumnHeaderPill\";\n\nimport \"./GroupColumnPill.css\";\n\nexport interface GroupColumnPillProps extends ColumnHeaderPillProps {\n column: RuntimeColumnDescriptor;\n}\n\nexport const GroupColumnPill = ({\n column,\n ...columnHeaderProps\n}: GroupColumnPillProps) => {\n const { name, sorted } = column;\n const icon =\n typeof sorted === \"number\"\n ? sorted < 0\n ? \"arrow-down\"\n : \"arrow-up\"\n : sorted === \"A\"\n ? \"arrow-up\"\n : sorted === \"D\"\n ? \"arrow-down\"\n : undefined;\n\n return (\n <ColumnHeaderPill {...columnHeaderProps} column={column}>\n <span className=\"vuuGroupColumnPill-label\">{name}</span>\n {icon !== undefined ? <span data-icon={icon} /> : null}\n {typeof sorted === \"number\" ? (\n <span className={\"vuuSortPosition\"}>{Math.abs(sorted)}</span>\n ) : null}\n </ColumnHeaderPill>\n );\n};\n", "import { RuntimeColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { ColumnHeaderPill } from \"./ColumnHeaderPill\";\n\nimport \"./SortIndicator.css\";\n\nexport interface SortIndicatorProps {\n column: RuntimeColumnDescriptor;\n}\n\nexport const SortIndicator = ({ column }: SortIndicatorProps) => {\n if (!column.sorted) {\n return null;\n }\n\n const icon =\n typeof column.sorted === \"number\"\n ? column.sorted < 0\n ? \"arrow-down\"\n : \"arrow-up\"\n : column.sorted === \"A\"\n ? \"arrow-up\"\n : \"arrow-down\";\n\n return (\n <ColumnHeaderPill column={column}>\n <span data-icon={icon} />\n {typeof column.sorted === \"number\" ? (\n <span className={\"vuuSortPosition\"}>{Math.abs(column.sorted)}</span>\n ) : null}\n </ColumnHeaderPill>\n );\n};\n", "import { useCallback, useRef } from \"react\";\n\nimport \"./ColumnResizer.css\";\n\nconst NOOP = () => undefined;\n\nconst baseClass = \"vuuColumnResizerNext\";\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 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 <div className={baseClass} onMouseDown={handleMouseDown} />;\n};\n", "import {\n Heading,\n ResizePhase,\n RuntimeColumnDescriptor,\n} from \"@vuu-ui/vuu-table-types\";\nimport { RefObject, useCallback, useRef, useState } from \"react\";\n\nexport type ResizeHandler = (evt: MouseEvent, moveBy: number) => void;\nexport interface CellResizeHookProps {\n column: RuntimeColumnDescriptor | Heading;\n onResize?: (phase: ResizePhase, columnName: string, width?: number) => void;\n rootRef: RefObject<HTMLDivElement>;\n}\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, setResizing] = useState(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 setResizing(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 // clickHandler in HeaderCell checks isResizing before firing. Because onMouseUp\n // fires before click, we need to delay setting isResizing back to false, just\n // long enough that the click ghandler will have fired.\n setResizing(false);\n }, 80);\n }\n }, [name, onResize]);\n\n return {\n isResizing,\n onDrag: handleResize,\n onDragStart: handleResizeStart,\n onDragEnd: handleResizeEnd,\n };\n};\n", "import { RuntimeColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { getColumnStyle } from \"@vuu-ui/vuu-utils\";\nimport cx from \"clsx\";\nimport { useMemo } from \"react\";\n\nexport const useCell = (\n column: RuntimeColumnDescriptor,\n classBase: string,\n isHeader?: boolean\n) =>\n // TODO measure perf without the memo, might not be worth the cost\n useMemo(() => {\n const className = cx(classBase, {\n vuuPinFloating: column.pin === \"floating\",\n vuuPinLeft: column.pin === \"left\",\n vuuPinRight: column.pin === \"right\",\n vuuEndPin: isHeader && column.endPin,\n // [`${classBase}-resizing`]: column.resizing,\n [`${classBase}-editable`]: column.editable,\n [`${classBase}-right`]: column.align === \"right\",\n });\n\n const style = getColumnStyle(column);\n return {\n className,\n style,\n };\n }, [column, classBase, isHeader]);\n", "import { HeaderCellProps } from \"@vuu-ui/vuu-table-types\";\nimport cx from \"clsx\";\nimport { MouseEventHandler, useCallback, useRef } from \"react\";\nimport { SortIndicator } from \"../column-header-pill\";\nimport { ColumnMenu } from \"../column-menu\";\nimport { ColumnResizer, useTableColumnResize } from \"../column-resizing\";\nimport { useCell } from \"../useCell\";\n\nimport \"./HeaderCell.css\";\n\nconst classBase = \"vuuTableHeaderCell\";\n\nexport const HeaderCell = ({\n className: classNameProp,\n column,\n onClick,\n onResize,\n ...htmlAttributes\n}: HeaderCellProps) => {\n const { HeaderCellContentRenderer, HeaderCellLabelRenderer } = column;\n const rootRef = useRef<HTMLDivElement>(null);\n const { isResizing, ...resizeProps } = useTableColumnResize({\n column,\n onResize,\n rootRef,\n });\n\n const handleClick = useCallback<MouseEventHandler<HTMLDivElement>>(\n (evt) => {\n !isResizing && onClick?.(evt);\n },\n [isResizing, onClick]\n );\n\n const { className, style } = useCell(column, classBase, true);\n\n const columnMenu = <ColumnMenu column={column} />;\n const columnLabel = HeaderCellLabelRenderer ? (\n <HeaderCellLabelRenderer className={`${classBase}-label`} column={column} />\n ) : (\n <div className={`${classBase}-label`}>{column.label ?? column.name}</div>\n );\n\n const columnContent = HeaderCellContentRenderer\n ? [<HeaderCellContentRenderer column={column} key=\"content\" />]\n : [];\n\n const sortIndicator = <SortIndicator column={column} />;\n const headerItems =\n column.align === \"right\"\n ? [sortIndicator, columnLabel].concat(columnContent).concat(columnMenu)\n : [columnMenu, columnLabel, sortIndicator].concat(columnContent);\n\n return (\n <div\n {...htmlAttributes}\n className={cx(className, classNameProp, {\n [`${classBase}-resizing`]: isResizing,\n })}\n onClick={handleClick}\n ref={rootRef}\n role=\"columnheader\"\n style={style}\n >\n {...headerItems}\n {column.resizeable !== false ? <ColumnResizer {...resizeProps} /> : null}\n </div>\n );\n};\n", "import { RuntimeColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { useContextMenu } from \"@vuu-ui/vuu-popups\";\nimport cx from \"clsx\";\nimport {\n HTMLAttributes,\n MouseEvent,\n useCallback,\n useRef,\n useState,\n} from \"react\";\n\nimport \"./ColumnMenu.css\";\n\nexport interface ColumnMenuProps extends HTMLAttributes<HTMLSpanElement> {\n column: RuntimeColumnDescriptor;\n}\n\nconst getPosition = (element: HTMLElement | null) => {\n if (element) {\n const { bottom, left } = element.getBoundingClientRect();\n return { x: left, y: bottom + 6 };\n }\n};\n\nexport const ColumnMenu = ({\n className,\n column,\n ...props\n}: ColumnMenuProps) => {\n const rootRef = useRef<HTMLSpanElement>(null);\n const [menuOpen, setMenuOpen] = useState(false);\n const [showContextMenu] = useContextMenu();\n\n const handleMenuClose = useCallback(() => {\n setMenuOpen(false);\n }, []);\n\n const showColumnMenu = useCallback(\n (e: MouseEvent<HTMLElement>) => {\n setMenuOpen(true);\n showContextMenu(e, \"column-menu\", {\n column,\n ContextMenuProps: {\n onClose: handleMenuClose,\n position: getPosition(rootRef.current),\n },\n });\n },\n [column, handleMenuClose, showContextMenu]\n );\n\n return (\n <span\n {...props}\n className={cx(\"vuuTable-columnMenu\", className, {\n \"vuuTable-columnMenu-open\": menuOpen,\n })}\n data-icon=\"more-vert\"\n onClick={showColumnMenu}\n ref={rootRef}\n />\n );\n};\n", "import {\n TableConfig,\n TableConfigChangeHandler,\n TableRowClickHandler,\n TableSelectionModel,\n} from \"@vuu-ui/vuu-table-types\";\nimport {\n DataSource,\n DataSourceRow,\n SchemaColumn,\n SelectionChangeHandler,\n VuuFeatureInvocationMessage,\n} from \"@vuu-ui/vuu-data-types\";\nimport {\n MeasuredContainer,\n MeasuredContainerProps,\n MeasuredSize,\n} from \"@vuu-ui/vuu-layout\";\nimport { ContextMenuProvider } from \"@vuu-ui/vuu-popups\";\nimport { DragStartHandler, dragStrategy } from \"@vuu-ui/vuu-ui-controls\";\nimport { metadataKeys, useId } from \"@vuu-ui/vuu-utils\";\nimport { useForkRef } from \"@salt-ds/core\";\nimport cx from \"clsx\";\nimport {\n CSSProperties,\n FC,\n ForwardedRef,\n forwardRef,\n RefObject,\n useRef,\n useState,\n} from \"react\";\nimport { Row as DefaultRow, RowProps } from \"./Row\";\nimport { useTable } from \"./useTable\";\nimport { TableHeader } from \"./table-header/TableHeader\";\n\nimport \"./Table.css\";\nimport type { DragDropState } from \"@vuu-ui/vuu-ui-controls\";\nimport { ScrollingAPI } from \"./useTableScroll\";\n\nconst classBase = \"vuuTable\";\n\nconst { IDX, RENDER_IDX } = metadataKeys;\n\n// TODO implement a Model object to represent a row data for better API\nexport type TableRowSelectHandler = (row: DataSourceRow) => void;\nexport type TableNavigationStyle = \"none\" | \"cell\" | \"row\";\n\nexport interface TableProps\n extends Omit<MeasuredContainerProps, \"onDragStart\" | \"onDrop\" | \"onSelect\"> {\n Row?: FC<RowProps>;\n allowConfigEditing?: boolean;\n allowDragDrop?: boolean | dragStrategy;\n /**\n * required if a fully featured column picker is to be available\n */\n availableColumns?: SchemaColumn[];\n /**\n * Provide configuration settings for Table. At minimun, column\n * descriptors must be provided.\n */\n config: TableConfig;\n dataSource: DataSource;\n disableFocus?: boolean;\n headerHeight?: number;\n /**\n * Defined how focus navigation within data cells will be handled by table.\n * Default is cell.\n */\n highlightedIndex?: number;\n navigationStyle?: TableNavigationStyle;\n /**\n * required if a fully featured column picker is to be available.\n * Available columns can be changed by the addition or removal of\n * one or more calculated columns.\n */\n onAvailableColumnsChange?: (columns: SchemaColumn[]) => void;\n /**\n * This callback will be invoked any time a config attribute of TableConfig\n * is changed. By persisting this value and providing it to the Table as a\n * prop, table state can be persisted across sessions.\n */\n onConfigChange?: TableConfigChangeHandler;\n onDragStart?: DragStartHandler;\n onDrop?: (dragDropState: DragDropState) => void;\n /**\n * When a Vuu feature e.g. context menu action, has been invoked, the Vuu server\n * response must be handled. This callback provides that response.\n */\n onFeatureInvocation?: (message: VuuFeatureInvocationMessage) => void;\n\n onHighlight?: (idx: number) => void;\n /**\n * callback invoked when user 'clicks' a table row. CLick triggered either\n * via mouse click or keyboard (default ENTER);\n */\n onRowClick?: TableRowClickHandler;\n onSelect?: TableRowSelectHandler;\n onSelectionChange?: SelectionChangeHandler;\n renderBufferSize?: number;\n rowHeight?: number;\n /**\n * imperative API for scrolling table\n */\n scrollingApiRef?: ForwardedRef<ScrollingAPI>;\n\n /**\n * Selection Bookends style the left and right edge of a selection block.\n * They are optional, value defaults to zero.\n * TODO this should just live in CSS\n */\n selectionBookendWidth?: number;\n selectionModel?: TableSelectionModel;\n /**\n * if false, table rendered without headers. Useful when table is being included in a\n * composite component.\n */\n showColumnHeaders?: boolean;\n}\n\nconst TableCore = ({\n Row = DefaultRow,\n allowDragDrop,\n availableColumns,\n config,\n containerRef,\n dataSource,\n disableFocus = false,\n highlightedIndex: highlightedIndexProp,\n id: idProp,\n navigationStyle = \"cell\",\n onAvailableColumnsChange,\n onConfigChange,\n onDragStart,\n onDrop,\n onFeatureInvocation,\n onHighlight,\n onRowClick: onRowClickProp,\n onSelect,\n onSelectionChange,\n renderBufferSize = 5,\n rowHeight = 20,\n scrollingApiRef,\n selectionModel = \"extended\",\n showColumnHeaders = true,\n headerHeight = showColumnHeaders ? 25 : 0,\n size,\n}: TableProps & {\n containerRef: RefObject<HTMLDivElement>;\n size: MeasuredSize;\n}) => {\n const id = useId(idProp);\n const {\n columnMap,\n columns,\n data,\n draggableRow,\n getRowOffset,\n handleContextMenuAction,\n headings,\n highlightedIndex,\n onDataEdited,\n onMoveColumn,\n onMoveGroupColumn,\n onRemoveGroupColumn,\n onResizeColumn,\n onRowClick,\n onSortColumn,\n onToggleGroup,\n menuBuilder,\n scrollProps,\n tableAttributes,\n tableConfig,\n viewportMeasurements,\n ...tableProps\n } = useTable({\n allowDragDrop,\n availableColumns,\n config,\n containerRef,\n dataSource,\n disableFocus,\n headerHeight,\n highlightedIndex: highlightedIndexProp,\n id,\n navigationStyle,\n onAvailableColumnsChange,\n onConfigChange,\n onDragStart,\n onDrop,\n onFeatureInvocation,\n onHighlight,\n onRowClick: onRowClickProp,\n onSelect,\n onSelectionChange,\n renderBufferSize,\n rowHeight,\n scrollingApiRef,\n selectionModel,\n size,\n });\n\n const contentContainerClassName = cx(`${classBase}-contentContainer`, {\n [`${classBase}-colLines`]: tableAttributes.columnSeparators,\n [`${classBase}-rowLines`]: tableAttributes.rowSeparators,\n // [`${classBase}-highlight`]: tableAttributes.showHighlightedRow,\n [`${classBase}-zebra`]: tableAttributes.zebraStripes,\n // [`${classBase}-loading`]: isDataLoading(tableProps.columns),\n });\n\n const cssVariables = {\n \"--content-height\": `${viewportMeasurements.contentHeight}px`,\n \"--content-width\": `${viewportMeasurements.contentWidth}px`,\n \"--horizontal-scrollbar-height\": `${viewportMeasurements.horizontalScrollbarHeight}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 \"--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 return (\n <ContextMenuProvider\n menuActionHandler={handleContextMenuAction}\n menuBuilder={menuBuilder}\n >\n <div\n className={`${classBase}-scrollbarContainer`}\n ref={scrollProps.scrollbarContainerRef}\n style={cssVariables}\n >\n <div className={`${classBase}-scrollbarContent`} />\n </div>\n <div\n className={contentContainerClassName}\n ref={scrollProps.contentContainerRef}\n style={cssVariables}\n >\n <div\n {...tableProps}\n className={`${classBase}-table`}\n role=\"table\"\n tabIndex={disableFocus ? undefined : -1}\n >\n {showColumnHeaders ? (\n <TableHeader\n columns={columns}\n headings={headings}\n onMoveColumn={onMoveColumn}\n onMoveGroupColumn={onMoveGroupColumn}\n onRemoveGroupColumn={onRemoveGroupColumn}\n onResizeColumn={onResizeColumn}\n onSortColumn={onSortColumn}\n tableConfig={tableConfig}\n tableId={id}\n />\n ) : null}\n <div className={`${classBase}-body`}>\n {data.map((data) => (\n <Row\n aria-rowindex={data[0] + 1}\n columnMap={columnMap}\n columns={columns}\n highlighted={highlightedIndex === data[IDX]}\n key={data[RENDER_IDX]}\n onClick={onRowClick}\n onDataEdited={onDataEdited}\n row={data}\n offset={getRowOffset(data)}\n onToggleGroup={onToggleGroup}\n zebraStripes={tableAttributes.zebraStripes}\n />\n ))}\n </div>\n </div>\n </div>\n {draggableRow}\n </ContextMenuProvider>\n );\n};\n\nexport const Table = forwardRef(function TableNext(\n {\n Row,\n allowDragDrop,\n availableColumns,\n className: classNameProp,\n config,\n dataSource,\n disableFocus,\n highlightedIndex,\n id,\n navigationStyle,\n onAvailableColumnsChange,\n onConfigChange,\n onDragStart,\n onDrop,\n onFeatureInvocation,\n onHighlight,\n onRowClick,\n onSelect,\n onSelectionChange,\n renderBufferSize,\n rowHeight,\n scrollingApiRef,\n selectionModel,\n showColumnHeaders,\n headerHeight,\n style: styleProp,\n ...htmlAttributes\n }: TableProps,\n forwardedRef: ForwardedRef<HTMLDivElement>\n) {\n const containerRef = useRef<HTMLDivElement>(null);\n\n const [size, setSize] = useState<MeasuredSize>();\n\n if (config === undefined) {\n throw Error(\n \"vuu Table requires config prop. Minimum config is list of Column Descriptors\"\n );\n }\n if (dataSource === undefined) {\n throw Error(\"vuu Table requires dataSource prop\");\n }\n\n return (\n <MeasuredContainer\n {...htmlAttributes}\n className={cx(classBase, classNameProp)}\n id={id}\n onResize={setSize}\n ref={useForkRef(containerRef, forwardedRef)}\n >\n {size ? (\n <TableCore\n Row={Row}\n allowDragDrop={allowDragDrop}\n availableColumns={availableColumns}\n config={config}\n containerRef={containerRef}\n dataSource={dataSource}\n disableFocus={disableFocus}\n headerHeight={headerHeight}\n highlightedIndex={highlightedIndex}\n id={id}\n navigationStyle={navigationStyle}\n onAvailableColumnsChange={onAvailableColumnsChange}\n onConfigChange={onConfigChange}\n onDragStart={onDragStart}\n onDrop={onDrop}\n onFeatureInvocation={onFeatureInvocation}\n onHighlight={onHighlight}\n onRowClick={onRowClick}\n onSelect={onSelect}\n onSelectionChange={onSelectionChange}\n renderBufferSize={renderBufferSize}\n rowHeight={rowHeight}\n scrollingApiRef={scrollingApiRef}\n selectionModel={selectionModel}\n showColumnHeaders={showColumnHeaders}\n size={size}\n />\n ) : null}\n </MeasuredContainer>\n );\n});\n", "import { DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport {\n DataCellEditHandler,\n RuntimeColumnDescriptor,\n RowClickHandler,\n} from \"@vuu-ui/vuu-table-types\";\nimport {\n ColumnMap,\n isGroupColumn,\n isJsonColumn,\n isJsonGroup,\n metadataKeys,\n isNotHidden,\n RowSelected,\n} from \"@vuu-ui/vuu-utils\";\nimport cx from \"clsx\";\nimport { CSSProperties, memo, MouseEvent, useCallback } from \"react\";\nimport { TableCell, TableGroupCell } from \"./table-cell\";\n\nimport \"./Row.css\";\n\nexport interface RowProps {\n className?: string;\n columnMap: ColumnMap;\n columns: RuntimeColumnDescriptor[];\n highlighted?: boolean;\n row: DataSourceRow;\n offset: number;\n onClick?: RowClickHandler;\n onDataEdited?: DataCellEditHandler;\n onToggleGroup?: (row: DataSourceRow, column: RuntimeColumnDescriptor) => void;\n style?: CSSProperties;\n zebraStripes?: boolean;\n}\n\nconst { IDX, IS_EXPANDED, SELECTED } = metadataKeys;\nconst classBase = \"vuuTableRow\";\n\n// export const Row = memo(\nexport const Row = memo(\n ({\n className: classNameProp,\n columnMap,\n columns,\n highlighted,\n row,\n offset,\n onClick,\n onDataEdited,\n onToggleGroup,\n zebraStripes = false,\n ...htmlAttributes\n }: RowProps) => {\n const {\n [IDX]: rowIndex,\n [IS_EXPANDED]: isExpanded,\n [SELECTED]: selectionStatus,\n } = row;\n\n const handleRowClick = useCallback(\n (evt: MouseEvent<HTMLDivElement>) => {\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 { True, First, Last } = RowSelected;\n\n const className = cx(classBase, classNameProp, {\n [`${classBase}-even`]: zebraStripes && rowIndex % 2 === 0,\n [`${classBase}-expanded`]: isExpanded,\n [`${classBase}-highlighted`]: highlighted,\n [`${classBase}-selected`]: selectionStatus & True,\n [`${classBase}-selectedStart`]: selectionStatus & First,\n [`${classBase}-selectedEnd`]: selectionStatus & Last,\n });\n\n const style = { transform: `translate3d(0px, ${offset}px, 0px)` };\n\n const handleGroupCellClick = useCallback(\n (evt: MouseEvent, column: RuntimeColumnDescriptor) => {\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 {...htmlAttributes}\n key={`row-${row[0]}`}\n role=\"row\"\n className={className}\n onClick={handleRowClick}\n style={style}\n >\n <span className={`${classBase}-selectionDecorator vuuStickyLeft`} />\n {columns.filter(isNotHidden).map((column) => {\n const isGroup = isGroupColumn(column);\n const isJsonCell = isJsonColumn(column);\n const Cell = isGroup ? TableGroupCell : TableCell;\n\n return (\n <Cell\n column={column}\n columnMap={columnMap}\n key={column.key}\n onClick={isGroup || isJsonCell ? handleGroupCellClick : undefined}\n onDataEdited={onDataEdited}\n row={row}\n />\n );\n })}\n <span className={`${classBase}-selectionDecorator vuuStickyRight`} />\n </div>\n );\n }\n);\nRow.displayName = \"Row\";\n", "import { DataItemCommitHandler, TableCellProps } from \"@vuu-ui/vuu-table-types\";\nimport { isNumericColumn } from \"@vuu-ui/vuu-utils\";\nimport { MouseEventHandler, useCallback } from \"react\";\nimport { useCell } from \"../useCell\";\n\nimport \"./TableCell.css\";\n\nconst classBase = \"vuuTableCell\";\n\nexport const TableCell = ({\n column,\n columnMap,\n onClick,\n onDataEdited,\n row,\n}: TableCellProps) => {\n const { className, style } = useCell(column, classBase);\n const { CellRenderer, name, valueFormatter } = column;\n const dataIdx = columnMap[name];\n\n const handleDataItemEdited = useCallback<DataItemCommitHandler>(\n (value) => {\n if (onDataEdited) {\n let typedValue = value;\n if (isNumericColumn(column) && typeof value === \"string\") {\n typedValue =\n column.serverDataType === \"double\"\n ? parseFloat(value)\n : parseInt(value);\n }\n return onDataEdited?.(row, name, typedValue);\n } else {\n throw Error(\n \"TableCell onDataEdited prop not supplied for an editable cell\"\n );\n }\n },\n [column, name, onDataEdited, row]\n );\n\n const handleClick = useCallback<MouseEventHandler>(\n (evt) => {\n onClick?.(evt, column);\n },\n [column, onClick]\n );\n\n return (\n <div\n className={className}\n onClick={onClick ? handleClick : undefined}\n role=\"cell\"\n style={style}\n >\n {CellRenderer ? (\n <CellRenderer\n column={column}\n columnMap={columnMap}\n onCommit={handleDataItemEdited}\n row={row}\n />\n ) : (\n valueFormatter(row[dataIdx])\n )}\n </div>\n );\n};\n", "import { GroupColumnDescriptor, TableCellProps } from \"@vuu-ui/vuu-table-types\";\nimport { getGroupValueAndOffset, metadataKeys } from \"@vuu-ui/vuu-utils\";\nimport { MouseEvent, useCallback } from \"react\";\nimport { useCell } from \"../useCell\";\nimport cx from \"clsx\";\n\nimport \"./TableGroupCell.css\";\n\nconst { IS_LEAF } = metadataKeys;\n\nconst classBase = \"vuuTableGroupCell\";\n\nexport const TableGroupCell = ({ column, onClick, row }: TableCellProps) => {\n const { columns } = column as GroupColumnDescriptor;\n const [value, offset] = getGroupValueAndOffset(columns, row);\n const { className, style } = useCell(column, classBase);\n\n const handleClick = useCallback(\n (evt: MouseEvent<HTMLDivElement>) => {\n onClick?.(evt, column);\n },\n [column, onClick]\n );\n\n const isLeaf = row[IS_LEAF];\n const spacers = Array(offset)\n .fill(0)\n .map((n, i) => <span className={`${classBase}-spacer`} key={i} />);\n\n return (\n <div\n className={cx(className, \"vuuTableCell\")}\n role=\"cell\"\n style={style}\n onClick={isLeaf ? undefined : handleClick}\n >\n {spacers}\n {isLeaf ? null : (\n <span className={`${classBase}-toggle`} data-icon=\"triangle-right\" />\n )}\n <span>{value}</span>\n </div>\n );\n};\n", "import {\n DataSourceConfig,\n DataSourceRow,\n DataSourceSubscribedMessage,\n SelectionChangeHandler,\n} from \"@vuu-ui/vuu-data-types\";\nimport {\n ColumnDescriptor,\n DataCellEditHandler,\n RowClickHandler,\n RuntimeColumnDescriptor,\n TableColumnResizeHandler,\n TableConfig,\n TableSelectionModel,\n} from \"@vuu-ui/vuu-table-types\";\nimport { MeasuredProps, MeasuredSize } from \"@vuu-ui/vuu-layout\";\nimport { VuuRange, VuuSortType } from \"@vuu-ui/vuu-protocol-types\";\nimport {\n DragStartHandler,\n useDragDrop as useDragDrop,\n} from \"@vuu-ui/vuu-ui-controls\";\nimport {\n applySort,\n buildColumnMap,\n getIndexFromRowElement,\n isGroupColumn,\n isJsonGroup,\n isValidNumber,\n metadataKeys,\n updateColumn,\n useLayoutEffectSkipFirst,\n} from \"@vuu-ui/vuu-utils\";\nimport {\n FocusEvent,\n KeyboardEvent,\n RefObject,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport {\n buildContextMenuDescriptors,\n useHandleTableContextMenu,\n} from \"./context-menu\";\nimport { TableProps } from \"./Table\";\nimport { updateTableConfig } from \"./table-config\";\nimport { useCellEditing } from \"./useCellEditing\";\nimport { useDataSource } from \"./useDataSource\";\nimport { useInitialValue } from \"./useInitialValue\";\nimport { useKeyboardNavigation } from \"./useKeyboardNavigation\";\nimport { useSelection } from \"./useSelection\";\nimport { useTableContextMenu } from \"./useTableContextMenu\";\nimport {\n ColumnActionHide,\n ColumnActionPin,\n isShowColumnSettings,\n isShowTableSettings,\n PersistentColumnAction,\n useTableModel,\n} from \"./useTableModel\";\nimport { useTableScroll } from \"./useTableScroll\";\nimport { useTableViewport } from \"./useTableViewport\";\nimport { useTableAndColumnSettings } from \"./useTableAndColumnSettings\";\n\nconst stripInternalProperties = (tableConfig: TableConfig): TableConfig => {\n return tableConfig;\n};\n\nexport interface TableHookProps\n extends MeasuredProps,\n Pick<\n TableProps,\n | \"allowDragDrop\"\n | \"availableColumns\"\n | \"config\"\n | \"dataSource\"\n | \"disableFocus\"\n | \"highlightedIndex\"\n | \"id\"\n | \"navigationStyle\"\n | \"onAvailableColumnsChange\"\n | \"onConfigChange\"\n | \"onDragStart\"\n | \"onDrop\"\n | \"onFeatureInvocation\"\n | \"onHighlight\"\n | \"onSelect\"\n | \"onSelectionChange\"\n | \"onRowClick\"\n | \"renderBufferSize\"\n | \"scrollingApiRef\"\n > {\n containerRef: RefObject<HTMLDivElement>;\n headerHeight: number;\n rowHeight: number;\n selectionModel: TableSelectionModel;\n size: MeasuredSize;\n}\n\nconst { KEY, IS_EXPANDED, IS_LEAF } = metadataKeys;\n\nconst NULL_DRAG_DROP = {\n draggable: undefined,\n onMouseDown: undefined,\n};\nconst useNullDragDrop = () => NULL_DRAG_DROP;\n\nconst addColumn = (\n tableConfig: TableConfig,\n column: ColumnDescriptor\n): TableConfig => ({\n ...tableConfig,\n columns: tableConfig.columns.concat(column),\n});\n\nexport const useTable = ({\n allowDragDrop = false,\n availableColumns,\n config,\n containerRef,\n dataSource,\n disableFocus,\n headerHeight = 25,\n highlightedIndex: highlightedIndexProp,\n id,\n navigationStyle = \"cell\",\n onAvailableColumnsChange,\n onConfigChange,\n onDragStart,\n onDrop,\n onFeatureInvocation,\n onHighlight,\n onRowClick: onRowClickProp,\n onSelect,\n onSelectionChange,\n renderBufferSize = 0,\n rowHeight = 20,\n scrollingApiRef,\n selectionModel,\n size,\n}: TableHookProps) => {\n const [rowCount, setRowCount] = useState<number>(dataSource.size);\n if (dataSource === undefined) {\n throw Error(\"no data source provided to Vuu Table\");\n }\n\n const useRowDragDrop = allowDragDrop ? useDragDrop : useNullDragDrop;\n\n const menuBuilder = useMemo(\n () => buildContextMenuDescriptors(dataSource),\n [dataSource]\n );\n\n const onDataRowcountChange = useCallback((size: number) => {\n setRowCount(size);\n }, []);\n\n const {\n columns: runtimeColumns,\n dispatchColumnAction,\n headings,\n tableAttributes,\n tableConfig,\n } = useTableModel(config, dataSource);\n\n useLayoutEffectSkipFirst(() => {\n dispatchColumnAction({\n type: \"init\",\n dataSource,\n tableConfig,\n });\n }, [tableConfig, dataSource, dispatchColumnAction]);\n\n const applyTableConfigChange = useCallback(\n (config: TableConfig) => {\n dispatchColumnAction({\n type: \"init\",\n tableConfig: config,\n dataSource,\n });\n onConfigChange?.(stripInternalProperties(config));\n },\n [dataSource, dispatchColumnAction, onConfigChange]\n );\n\n /**\n stateColumns are required only for the duration of a column resize operation.\n We want to minimize the scope of rendering whilst a resize operation is in progress\n and we do not need to persist transient size values. When the resize is complete, we\n trigger a config change, clear the stateColumns and revert to using the runtimeColumns\n managed by the table model, to which the ersize change will have been applied.\n */\n const [stateColumns, setStateColumns] = useState<RuntimeColumnDescriptor[]>();\n const [columns, setColumnSize] = useMemo(() => {\n const setSize = (columnName: string, width: number) => {\n const cols = updateColumn(runtimeColumns, columnName, { width });\n setStateColumns(cols);\n };\n return [stateColumns ?? runtimeColumns, setSize];\n }, [runtimeColumns, stateColumns]);\n\n const columnMap = useMemo(\n () => buildColumnMap(dataSource.columns),\n [dataSource.columns]\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: size,\n });\n\n const initialRange = useInitialValue<VuuRange>({\n from: 0,\n to:\n viewportMeasurements.rowCount === 0\n ? 0\n : viewportMeasurements.rowCount + 1,\n });\n\n const onSubscribed = useCallback(\n ({ tableSchema }: DataSourceSubscribedMessage) => {\n if (tableSchema) {\n dispatchColumnAction({\n type: \"setTableSchema\",\n tableSchema,\n });\n } else {\n console.log(\"subscription message with no schema\");\n }\n },\n [dispatchColumnAction]\n );\n\n const { data, dataRef, getSelectedRows, range, setRange } = useDataSource({\n dataSource,\n // We need to factor this out of Table\n onFeatureInvocation,\n renderBufferSize,\n onSizeChange: onDataRowcountChange,\n onSubscribed,\n range: initialRange,\n });\n\n const handleConfigEditedInSettingsPanel = useCallback(\n (tableConfig: TableConfig) => {\n dispatchColumnAction({\n type: \"init\",\n tableConfig,\n dataSource,\n });\n onConfigChange?.(stripInternalProperties(tableConfig));\n },\n [dataSource, dispatchColumnAction, onConfigChange]\n );\n\n const handleDataSourceConfigChanged = useCallback(\n (dataSourceConfig: DataSourceConfig) => {\n dataSource.config = {\n ...dataSource.config,\n ...dataSourceConfig,\n };\n },\n [dataSource]\n );\n\n useEffect(() => {\n dataSource.on(\"config\", (config, confirmed) => {\n dispatchColumnAction({\n type: \"tableConfig\",\n ...config,\n confirmed,\n });\n });\n }, [dataSource, dispatchColumnAction]);\n\n const handleCreateCalculatedColumn = useCallback(\n (column: ColumnDescriptor) => {\n dataSource.columns = dataSource.columns.concat(column.name);\n applyTableConfigChange(addColumn(tableConfig, column));\n },\n [dataSource, tableConfig, applyTableConfigChange]\n );\n\n const hideColumns = useCallback(\n (action: ColumnActionHide) => {\n const { columns } = action;\n const hiddenColumns = columns.map((c) => c.name);\n const newTableConfig = {\n ...tableConfig,\n columns: tableConfig.columns.map((col) =>\n hiddenColumns.includes(col.name) ? { ...col, hidden: true } : col\n ),\n };\n applyTableConfigChange(newTableConfig);\n },\n [tableConfig, applyTableConfigChange]\n );\n\n const pinColumn = useCallback(\n (action: ColumnActionPin) => {\n applyTableConfigChange({\n ...tableConfig,\n columns: updateColumn(tableConfig.columns, {\n ...action.column,\n pin: action.pin,\n }),\n });\n },\n [tableConfig, applyTableConfigChange]\n );\n\n const { showColumnSettingsPanel, showTableSettingsPanel } =\n useTableAndColumnSettings({\n availableColumns:\n availableColumns ??\n tableConfig.columns.map(({ name, serverDataType = \"string\" }) => ({\n name,\n serverDataType,\n })),\n onAvailableColumnsChange,\n onConfigChange: handleConfigEditedInSettingsPanel,\n onCreateCalculatedColumn: handleCreateCalculatedColumn,\n onDataSourceConfigChange: handleDataSourceConfigChanged,\n tableConfig,\n });\n\n const onPersistentColumnOperation = useCallback(\n (action: PersistentColumnAction) => {\n if (isShowColumnSettings(action)) {\n showColumnSettingsPanel(action);\n } else if (isShowTableSettings(action)) {\n showTableSettingsPanel();\n } else {\n switch (action.type) {\n case \"hideColumns\":\n return hideColumns(action);\n case \"pinColumn\":\n return pinColumn(action);\n default:\n dispatchColumnAction(action);\n }\n }\n },\n [\n dispatchColumnAction,\n hideColumns,\n pinColumn,\n showColumnSettingsPanel,\n showTableSettingsPanel,\n ]\n );\n\n const handleContextMenuAction = useHandleTableContextMenu({\n dataSource,\n onPersistentColumnOperation,\n });\n\n const handleSort = useCallback(\n (column: ColumnDescriptor, extendSort = false, sortType?: VuuSortType) => {\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 onResizeColumn: TableColumnResizeHandler = useCallback(\n (phase, columnName, width) => {\n const column = columns.find((column) => column.name === columnName);\n if (column) {\n if (phase === \"resize\") {\n if (isValidNumber(width)) {\n setColumnSize(columnName, width);\n }\n } else if (phase === \"end\") {\n if (isValidNumber(width)) {\n dispatchColumnAction({\n type: \"resizeColumn\",\n phase,\n column,\n width,\n });\n setStateColumns(undefined);\n onConfigChange?.(\n stripInternalProperties(\n updateTableConfig(tableConfig, {\n type: \"col-size\",\n column,\n width,\n })\n )\n );\n }\n } else {\n setStateColumns(undefined);\n dispatchColumnAction({\n type: \"resizeColumn\",\n phase,\n column,\n width,\n });\n }\n } else {\n throw Error(\n `useDataTable.handleColumnResize, column ${columnName} not found`\n );\n }\n },\n [columns, tableConfig, dispatchColumnAction, onConfigChange, setColumnSize]\n );\n\n const onToggleGroup = useCallback(\n (row: DataSourceRow, column: RuntimeColumnDescriptor) => {\n const isJson = isJsonGroup(column, row);\n const key = row[KEY];\n\n if (row[IS_EXPANDED]) {\n dataSource.closeTreeNode(key, true);\n if (isJson) {\n const idx = columns.indexOf(column);\n const rows = dataSource.getRowsAtDepth?.(idx + 1);\n if (rows && !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.getChildRows?.(key);\n const idx = columns.indexOf(column) + 1;\n const columnsToShow = [columns[idx]];\n if (childRows && 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 handleVerticalScroll = useCallback(\n (_: number, pctScrollTop: number) => {\n setPctScrollTop(pctScrollTop);\n },\n [setPctScrollTop]\n );\n\n const { requestScroll, ...scrollProps } = useTableScroll({\n getRowAtPosition,\n rowHeight,\n scrollingApiRef,\n setRange,\n onVerticalScroll: handleVerticalScroll,\n viewportMeasurements,\n });\n\n const {\n highlightedIndexRef,\n navigate,\n onFocus: navigationFocus,\n onKeyDown: navigationKeyDown,\n ...containerProps\n } = useKeyboardNavigation({\n columnCount: columns.filter((c) => c.hidden !== true).length,\n containerRef,\n disableFocus,\n highlightedIndex: highlightedIndexProp,\n navigationStyle,\n requestScroll,\n rowCount: dataSource?.size,\n onHighlight,\n viewportRange: range,\n viewportRowCount: viewportMeasurements.rowCount,\n });\n\n const {\n onBlur: editingBlur,\n onDoubleClick: editingDoubleClick,\n onKeyDown: editingKeyDown,\n onFocus: editingFocus,\n } = useCellEditing({\n navigate,\n });\n\n const handleFocus = useCallback(\n (e: FocusEvent<HTMLElement>) => {\n navigationFocus();\n if (!e.defaultPrevented) {\n editingFocus(e);\n }\n },\n [editingFocus, navigationFocus]\n );\n\n const onContextMenu = useTableContextMenu({\n columns,\n data,\n dataSource,\n getSelectedRows,\n });\n\n const onMoveGroupColumn = useCallback(\n (columns: ColumnDescriptor[]) => {\n dataSource.groupBy = columns.map((col) => col.name);\n },\n [dataSource]\n );\n\n const onRemoveGroupColumn = useCallback(\n (column: RuntimeColumnDescriptor) => {\n if (isGroupColumn(column)) {\n dataSource.groupBy = [];\n } else {\n if (dataSource && dataSource.groupBy.includes(column.name)) {\n dataSource.groupBy = dataSource.groupBy.filter(\n (columnName) => columnName !== column.name\n );\n }\n }\n },\n [dataSource]\n );\n\n const handleSelectionChange: SelectionChangeHandler = useCallback(\n (selected) => {\n dataSource.select(selected);\n onSelectionChange?.(selected);\n },\n [dataSource, onSelectionChange]\n );\n\n const {\n onKeyDown: selectionHookKeyDown,\n onRowClick: selectionHookOnRowClick,\n } = useSelection({\n highlightedIndexRef,\n onSelect,\n onSelectionChange: handleSelectionChange,\n selectionModel,\n });\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLElement>) => {\n navigationKeyDown(e);\n if (!e.defaultPrevented) {\n editingKeyDown(e);\n }\n if (!e.defaultPrevented) {\n selectionHookKeyDown(e);\n }\n },\n [navigationKeyDown, editingKeyDown, selectionHookKeyDown]\n );\n\n const handleRowClick = useCallback<RowClickHandler>(\n (row, rangeSelect, keepExistingSelection) => {\n selectionHookOnRowClick(row, rangeSelect, keepExistingSelection);\n onRowClickProp?.(row);\n },\n [onRowClickProp, selectionHookOnRowClick]\n );\n\n useLayoutEffectSkipFirst(() => {\n dispatchColumnAction({\n type: \"init\",\n tableConfig: config,\n dataSource,\n });\n }, [config, dataSource, dispatchColumnAction]);\n\n const onMoveColumn = useCallback(\n (columns: ColumnDescriptor[]) => {\n console.log(`useTable onMoveColumn`, {\n columns,\n });\n const newTableConfig = {\n ...tableConfig,\n columns,\n };\n\n dispatchColumnAction({\n type: \"init\",\n tableConfig: newTableConfig,\n dataSource,\n });\n onConfigChange?.(stripInternalProperties(newTableConfig));\n },\n [dataSource, dispatchColumnAction, onConfigChange, tableConfig]\n );\n\n const handleDropRow = useCallback(\n (dragDropState) => {\n onDrop?.(dragDropState);\n },\n [onDrop]\n );\n\n const handleDataEdited = useCallback<DataCellEditHandler>(\n async (row, columnName, value) =>\n dataSource.applyEdit(row, columnName, value),\n [dataSource]\n );\n\n const handleDragStartRow = useCallback<DragStartHandler>(\n (dragDropState) => {\n const { initialDragElement } = dragDropState;\n const rowIndex = getIndexFromRowElement(initialDragElement);\n const row = dataRef.current.find((row) => row[0] === rowIndex);\n if (row) {\n dragDropState.setPayload(row);\n } else {\n // should we abort the operation ?\n }\n onDragStart?.(dragDropState);\n },\n [dataRef, onDragStart]\n );\n\n // Drag Drop rows\n const { onMouseDown: rowDragMouseDown, draggable: draggableRow } =\n useRowDragDrop({\n allowDragDrop,\n containerRef,\n draggableClassName: `vuuTable`,\n id,\n onDragStart: handleDragStartRow,\n onDrop: handleDropRow,\n orientation: \"vertical\",\n itemQuery: \".vuuTableRow\",\n });\n\n return {\n ...containerProps,\n \"aria-rowcount\": dataSource.size,\n draggableRow,\n onBlur: editingBlur,\n onDoubleClick: editingDoubleClick,\n onFocus: handleFocus,\n onKeyDown: handleKeyDown,\n onMouseDown: rowDragMouseDown,\n columnMap,\n columns,\n data,\n getRowOffset,\n handleContextMenuAction,\n headings,\n highlightedIndex: highlightedIndexRef.current,\n menuBuilder,\n onContextMenu,\n onDataEdited: handleDataEdited,\n onMoveColumn,\n onMoveGroupColumn,\n onRemoveGroupColumn,\n onRowClick: handleRowClick,\n onSortColumn: handleSort,\n onResizeColumn,\n onToggleGroup,\n scrollProps,\n // TODO don't think we need these ...\n tableAttributes,\n tableConfig,\n viewportMeasurements,\n };\n};\n", "import {\n ContextMenuItemDescriptor,\n DataSource,\n MenuBuilder,\n} from \"@vuu-ui/vuu-data-types\";\nimport { RuntimeColumnDescriptor, PinLocation } from \"@vuu-ui/vuu-table-types\";\nimport { isNumericColumn } from \"@vuu-ui/vuu-utils\";\n\nexport type ContextMenuLocation = \"header\" | \"filter\" | \"grid\";\n\ntype MaybeColumn = { column?: RuntimeColumnDescriptor };\n\nexport const buildContextMenuDescriptors =\n (dataSource?: DataSource): MenuBuilder =>\n (location, options) => {\n const descriptors: ContextMenuItemDescriptor[] = [];\n if (dataSource === undefined) {\n return descriptors;\n }\n //TODO which should it be ?\n if (location === \"header\" || location === \"column-menu\") {\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 descriptors.push({\n action: \"column-settings\",\n icon: \"cog\",\n label: `Column Settings`,\n options,\n });\n descriptors.push({\n action: \"table-settings\",\n icon: \"cog\",\n label: `DataGrid Settings`,\n options,\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 { RuntimeColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { Filter } from \"@vuu-ui/vuu-filter-types\";\nimport { removeColumnFromFilter } from \"@vuu-ui/vuu-utils\";\nimport { VuuFilter } from \"@vuu-ui/vuu-protocol-types\";\nimport {\n DataSource,\n DataSourceFilter,\n MenuActionHandler,\n} 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?: RuntimeColumnDescriptor;\n filter?: Filter;\n sort?: VuuFilter;\n}\nexport interface ContextMenuHookProps {\n dataSource?: DataSource;\n /**\n * A persistent Column Operation is any manipulation of a table column that should be\n * persisted across user sessions. e.g. if user pins a column, column should still be\n * pinned next time user opens app.\n */\n onPersistentColumnOperation: (action: PersistentColumnAction) => void;\n}\n\nconst removeFilterColumn = (\n dataSourceFilter: DataSourceFilter,\n column: RuntimeColumnDescriptor\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 useHandleTableContextMenu = ({\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 = (action): boolean => {\n const gridOptions = action.options as ContextMenuOptions;\n if (gridOptions.column && dataSource) {\n const { column } = gridOptions;\n // prettier-ignore\n switch(action.menuId){\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 case \"column-settings\": return onPersistentColumnOperation({type: \"columnSettings\", column}), true\n case \"table-settings\": return onPersistentColumnOperation({type: \"tableSettings\"}), true\n default:\n }\n }\n return false;\n };\n\n return handleContextMenuAction;\n};\n", "import { ColumnDescriptor, TableConfig } from \"@vuu-ui/vuu-table-types\";\n\nexport type MoveColumnTableConfigAction = {\n type: \"col-move\";\n column: ColumnDescriptor;\n fromIndex: number;\n toIndex: number;\n};\n\nexport type ResizeColumnTableConfigAction = {\n type: \"col-size\";\n column: ColumnDescriptor;\n width: number;\n};\n\nexport type SubscribeColumnTableConfigAction = {\n type: \"subscribed\";\n column: ColumnDescriptor;\n value: boolean;\n};\n\nexport type UpdateColumnPropertyTableConfigAction = {\n type: \"column-prop\";\n column: ColumnDescriptor;\n property: keyof ColumnDescriptor;\n value: boolean | number | string;\n};\n\nexport type TableConfigAction =\n | MoveColumnTableConfigAction\n | ResizeColumnTableConfigAction\n | UpdateColumnPropertyTableConfigAction;\n\nexport const updateTableConfig = (\n config: TableConfig,\n action: TableConfigAction\n): TableConfig => {\n switch (action.type) {\n case \"col-size\":\n return {\n ...config,\n columns: config.columns.map((col) =>\n col.name === action.column.name\n ? { ...col, width: action.width }\n : col\n ),\n };\n case \"column-prop\":\n return {\n ...config,\n columns: config.columns.map((col) =>\n col.name === action.column.name\n ? { ...col, [action.property]: action.value }\n : col\n ),\n };\n\n default:\n return config;\n }\n};\n", "import { isCharacterKey } from \"@vuu-ui/vuu-utils\";\nimport {\n FocusEventHandler,\n KeyboardEvent as ReactKeyboardEvent,\n MouseEvent,\n useCallback,\n} from \"react\";\nimport { cellIsTextInput } from \"./table-dom-utils\";\n\nexport interface CellEditingHookProps {\n navigate: () => void;\n}\n\nexport const useCellEditing = ({ navigate }: CellEditingHookProps) => {\n const commitHandler = useCallback(() => {\n navigate();\n }, [navigate]);\n\n const editInput = useCallback(\n (evt: MouseEvent<HTMLElement> | ReactKeyboardEvent<HTMLElement>) => {\n const cellEl = evt.target as HTMLDivElement;\n const input = cellEl.matches(\"input\")\n ? (cellEl as HTMLInputElement)\n : cellEl.querySelector(\"input\");\n\n if (input) {\n input.focus();\n input.select();\n }\n },\n []\n );\n\n const focusInput = useCallback(\n (evt: MouseEvent<HTMLElement> | ReactKeyboardEvent<HTMLElement>) => {\n const cellEl = evt.target as HTMLDivElement;\n const input = cellEl.querySelector(\"input\");\n if (input) {\n input.focus();\n input.select();\n }\n },\n []\n );\n\n const handleKeyDown = useCallback(\n (e: ReactKeyboardEvent<HTMLElement>) => {\n const el = e.target as HTMLElement;\n if (cellIsTextInput(el)) {\n if (isCharacterKey(e.key)) {\n editInput(e);\n } else if (e.key === \"Enter\") {\n focusInput(e);\n }\n }\n },\n [editInput, focusInput]\n );\n\n const handleDoubleClick = useCallback(\n (e: MouseEvent<HTMLElement>) => {\n const el = e.target as HTMLElement;\n if (el.matches(\"input\") || el.querySelector(\"input\")) {\n editInput(e);\n e.stopPropagation();\n }\n },\n [editInput]\n );\n\n const handleBlur = useCallback<FocusEventHandler>(\n (e) => {\n const el = e.target as HTMLElement;\n el.removeEventListener(\"vuu-commit\", commitHandler, true);\n },\n [commitHandler]\n );\n\n const handleFocus = useCallback<FocusEventHandler>(\n (e) => {\n const el = e.target as HTMLElement;\n el.addEventListener(\"vuu-commit\", commitHandler, true);\n },\n [commitHandler]\n );\n\n return {\n onBlur: handleBlur,\n onDoubleClick: handleDoubleClick,\n onFocus: handleFocus,\n onKeyDown: handleKeyDown,\n };\n};\n", "import { RefObject } from \"react\";\n\n/**\n * [rowIndex, colIndex\n */\nexport type CellPos = [number, number];\n\nexport const headerCellQuery = (colIdx: number) =>\n `.vuuTable-col-headers .vuuTableHeaderCell:nth-child(${colIdx})`;\n\nexport const dataCellQuery = (rowIdx: number, colIdx: number) =>\n `.vuuTable-body > [aria-rowindex='${rowIdx + 1}'] > [role='cell']:nth-child(${\n colIdx + 1\n })`;\n\nexport const getTableCell = (\n containerRef: RefObject<HTMLElement>,\n\n [rowIdx, colIdx]: CellPos\n) => {\n const cssQuery =\n rowIdx === -1 ? headerCellQuery(colIdx) : dataCellQuery(rowIdx, colIdx);\n const cell = containerRef.current?.querySelector(\n cssQuery\n ) as HTMLTableCellElement;\n\n if (cellIsEditable(cell)) {\n // Dropdown gets focus, Input does not\n const focusableContent = cell.querySelector(\"button\") as HTMLElement;\n return focusableContent || cell;\n } else {\n return cell;\n }\n};\n\nexport const cellIsEditable = (cell: HTMLDivElement) =>\n cell.classList.contains(\"vuuTableCell-editable\");\n\nexport const cellIsTextInput = (cell: HTMLElement) =>\n cell.querySelector(\".vuuTableInputCell\") !== null;\n\nexport function getRowIndex(rowEl?: HTMLElement) {\n if (rowEl) {\n const idx: string | null = rowEl.ariaRowIndex;\n if (idx !== null) {\n return parseInt(idx, 10) - 1;\n }\n }\n return -1;\n}\n\nconst closestRow = (el: HTMLElement) =>\n el.closest('[role=\"row\"]') as HTMLElement;\n\nexport const closestRowIndex = (el: HTMLElement) => getRowIndex(closestRow(el));\n", "import {\n DataSource,\n DataSourceRow,\n DataSourceSubscribedMessage,\n SubscribeCallback,\n VuuFeatureInvocationMessage,\n} from \"@vuu-ui/vuu-data-types\";\nimport { VuuRange } from \"@vuu-ui/vuu-protocol-types\";\nimport { getFullRange, NULL_RANGE } from \"@vuu-ui/vuu-utils\";\nimport { GridAction } from \"@vuu-ui/vuu-table-types\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { MovingWindow } from \"./moving-window\";\n\nexport interface DataSourceHookProps {\n dataSource: DataSource;\n onFeatureInvocation?: (message: VuuFeatureInvocationMessage) => void;\n onSizeChange: (size: number) => void;\n onSubscribed: (subscription: DataSourceSubscribedMessage) => void;\n range?: VuuRange;\n renderBufferSize?: number;\n}\n\nexport const isVuuFeatureInvocation = (\n action: GridAction\n): action is VuuFeatureInvocationMessage =>\n action.type === \"vuu-link-created\" || action.type === \"vuu-link-removed\";\n\nexport const useDataSource = ({\n dataSource,\n onFeatureInvocation,\n onSizeChange,\n onSubscribed,\n range = NULL_RANGE,\n renderBufferSize = 0,\n}: DataSourceHookProps) => {\n const [, forceUpdate] = useState<unknown>(null);\n const data = useRef<DataSourceRow[]>([]);\n const isMounted = useRef(true);\n const hasUpdated = useRef(false);\n const rangeRef = useRef<VuuRange>(NULL_RANGE);\n\n const dataWindow = useMemo(\n () => new MovingWindow(getFullRange(range, renderBufferSize)),\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 if (isMounted.current) {\n // TODO do we ever need to worry about missing updates here ?\n forceUpdate({});\n } else {\n console.log(`ignore update as we're not mounted`);\n }\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 data.current = dataWindow.data;\n hasUpdated.current = true;\n }\n } else if (isVuuFeatureInvocation(message)) {\n onFeatureInvocation?.(message);\n } else {\n console.log(`useDataSource unexpected message ${message.type}`);\n }\n },\n [dataWindow, onFeatureInvocation, onSizeChange, onSubscribed, setData]\n );\n\n const getSelectedRows = useCallback(() => {\n return dataWindow.getSelectedRows();\n }, [dataWindow]);\n\n useEffect(() => {\n isMounted.current = true;\n dataSource.resume?.();\n return () => {\n isMounted.current = false;\n dataSource.suspend?.();\n };\n }, [dataSource]);\n\n useEffect(() => {\n if (dataSource.status === \"disabled\") {\n dataSource.enable?.(datasourceMessageHandler);\n } else {\n //TODO could we improve this by using a ref for range ?\n dataSource?.subscribe(\n { range: getFullRange(range, renderBufferSize) },\n datasourceMessageHandler\n );\n }\n }, [dataSource, datasourceMessageHandler, range, renderBufferSize]);\n\n const setRange = useCallback(\n (range: VuuRange) => {\n // TODO can we directly call setData here when we do an\n // in-situ row scroll ?\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 return {\n data: data.current,\n dataRef: data,\n getSelectedRows,\n range: rangeRef.current,\n setRange,\n };\n};\n", "import { DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport {\n isRowSelectedLast,\n metadataKeys,\n WindowRange,\n} from \"@vuu-ui/vuu-utils\";\nimport { VuuRange } from \"@vuu-ui/vuu-protocol-types\";\n\nconst { SELECTED } = metadataKeys;\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(Math.max(0, 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 // Hack until we can deal with this more elegantly. When we have a block\n // select operation, first row is selected (and updated via server), then\n // remaining rows are selected when we select the block-end row. We get an\n // update for all rows except first. Because we're extending the select status\n // on the client, we have to adjust the first row selected (its still selected\n // but is no longer the 'last selected row in block')\n // Maybe answer is to apply ALL the selection status code here, not in Viewport\n if (data[SELECTED]) {\n const previousRow = this.data[internalIndex - 1];\n if (isRowSelectedLast(previousRow)) {\n this.data[internalIndex - 1] = previousRow.slice() as DataSourceRow;\n this.data[internalIndex - 1][SELECTED] -= 4;\n }\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] !== 0);\n }\n}\n", "import { useMemo, useRef } from \"react\";\n\nexport const useInitialValue = <T = unknown>(value: T): T => {\n const ref = useRef<T>(value);\n return useMemo(() => ref.current, []);\n};\n", "import { VuuRange } from \"@vuu-ui/vuu-protocol-types\";\nimport { getIndexFromRowElement } from \"@vuu-ui/vuu-utils\";\nimport { useControlled } from \"@salt-ds/core\";\nimport {\n KeyboardEvent,\n MouseEvent,\n RefObject,\n useCallback,\n useEffect,\n useRef,\n} from \"react\";\nimport { TableNavigationStyle } from \"./Table\";\nimport {\n CellPos,\n closestRowIndex,\n dataCellQuery,\n getTableCell,\n headerCellQuery,\n} from \"./table-dom-utils\";\nimport { ScrollDirection, ScrollRequestHandler } from \"./useTableScroll\";\n\nconst rowNavigationKeys = new Set<NavigationKey>([\n \"Home\",\n \"End\",\n \"PageUp\",\n \"PageDown\",\n \"ArrowDown\",\n \"ArrowUp\",\n]);\n\nconst cellNavigationKeys = new Set(rowNavigationKeys);\ncellNavigationKeys.add(\"ArrowLeft\");\ncellNavigationKeys.add(\"ArrowRight\");\n\nexport const isNavigationKey = (\n key: string,\n navigationStyle: TableNavigationStyle\n): key is NavigationKey => {\n switch (navigationStyle) {\n case \"cell\":\n return cellNavigationKeys.has(key as NavigationKey);\n case \"row\":\n return rowNavigationKeys.has(key as NavigationKey);\n default:\n return false;\n }\n};\n\ntype ArrowKey = \"ArrowUp\" | \"ArrowDown\" | \"ArrowLeft\" | \"ArrowRight\";\ntype PageKey = \"Home\" | \"End\" | \"PageUp\" | \"PageDown\";\ntype NavigationKey = PageKey | ArrowKey;\n\nconst PageKeys = [\"Home\", \"End\", \"PageUp\", \"PageDown\"];\nexport const isPagingKey = (key: string): key is PageKey =>\n PageKeys.includes(key);\n\nconst NULL_CELL_POS: CellPos = [-1, -1];\n\nconst NO_SCROLL_NECESSARY = [undefined, undefined] as const;\n\nconst howFarIsRowOutsideViewport = (\n rowEl: HTMLElement,\n contentContainer = rowEl.closest(\".vuuTable-contentContainer\")\n): readonly [ScrollDirection | undefined, number | undefined] => {\n //TODO lots of scope for optimisation here\n if (contentContainer) {\n const viewport = contentContainer?.getBoundingClientRect();\n const row = rowEl.getBoundingClientRect();\n if (row) {\n if (row.bottom > viewport.bottom) {\n return [\"down\", row.bottom - viewport.bottom];\n } else if (row.top < viewport.top) {\n return [\"up\", row.top - viewport.top];\n } else {\n return NO_SCROLL_NECESSARY;\n }\n } else {\n throw Error(\"Whats going on, row not found\");\n }\n } else {\n throw Error(\"Whats going on, scrollbar container not found\");\n }\n};\n\nconst howFarIsCellOutsideViewport = (\n cellEl: HTMLElement\n): readonly [ScrollDirection | undefined, number | undefined] => {\n //TODO lots of scope for optimisation here\n const contentContainer = cellEl.closest(\".vuuTable-contentContainer\");\n if (contentContainer) {\n const rowEl = cellEl.closest(\".vuuTableRow\") as HTMLElement;\n if (rowEl) {\n const result = howFarIsRowOutsideViewport(rowEl, contentContainer);\n if (result !== NO_SCROLL_NECESSARY) {\n return result;\n }\n const viewport = contentContainer?.getBoundingClientRect();\n const cell = cellEl.closest(\".vuuTableCell\")?.getBoundingClientRect();\n if (cell) {\n if (cell.right > viewport.right) {\n return [\"right\", cell.right + 6 - viewport.right];\n } else if (cell.left < viewport.left) {\n return [\"left\", cell.left - viewport.left];\n }\n } else {\n throw Error(\"Whats going on, cell not found\");\n }\n }\n }\n return NO_SCROLL_NECESSARY;\n};\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 // The colIdx is 1 based, because of the selection decorator\n if (colIdx < columnCount) {\n return [rowIdx, colIdx + 1];\n } else {\n return [rowIdx, colIdx];\n }\n } else if (key === \"ArrowLeft\") {\n if (colIdx > 1) {\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 defaultHighlightedIndex?: number;\n disableFocus?: boolean;\n disableHighlightOnFocus?: boolean;\n highlightedIndex?: number;\n label?: string;\n navigationStyle: TableNavigationStyle;\n viewportRange: VuuRange;\n onHighlight?: (idx: number) => void;\n requestScroll?: ScrollRequestHandler;\n restoreLastFocus?: boolean;\n rowCount?: number;\n selected?: unknown;\n viewportRowCount: number;\n}\n\nexport const useKeyboardNavigation = ({\n columnCount = 0,\n containerRef,\n disableFocus = false,\n defaultHighlightedIndex,\n disableHighlightOnFocus,\n highlightedIndex: highlightedIndexProp,\n navigationStyle,\n requestScroll,\n onHighlight,\n rowCount = 0,\n viewportRowCount,\n}: // viewportRange,\nNavigationHookProps) => {\n // const { from: viewportFirstRow, to: viewportLastRow } = viewportRange;\n const focusedCellPos = useRef<CellPos>([-1, -1]);\n const focusableCell = useRef<HTMLElement>();\n const activeCellPos = useRef<CellPos>([-1, 0]);\n // Keep this in sync with state value. This can be used by functions that need\n // to reference highlightedIndex at call time but do not need to be regenerated\n // every time it changes (i.e keep highlightedIndex out of their dependency\n // arrays, as it can update frequently)\n const highlightedIndexRef = useRef<number | undefined>();\n\n const [highlightedIndex, setHighlightedIdx] = useControlled({\n controlled: highlightedIndexProp,\n default: defaultHighlightedIndex,\n name: \"UseKeyboardNavigation\",\n });\n highlightedIndexRef.current = highlightedIndex;\n const setHighlightedIndex = useCallback(\n (idx: number, fromKeyboard = false) => {\n onHighlight?.(idx);\n setHighlightedIdx(idx);\n if (fromKeyboard) {\n // lastFocus.current = idx;\n }\n },\n [onHighlight, setHighlightedIdx]\n );\n\n const getFocusedCell = (element: HTMLElement | Element | null) =>\n element?.closest(\n \"[role='columnHeader'],[role='cell']\"\n ) as HTMLDivElement | null;\n\n const getTableCellPos = (tableCell: HTMLDivElement): 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']\") as HTMLElement;\n if (focusedRow) {\n const rowIdx = getIndexFromRowElement(focusedRow);\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(containerRef, cellPos);\n if (activeCell) {\n if (activeCell !== focusableCell.current) {\n focusableCell.current?.removeAttribute(\"tabindex\");\n focusableCell.current = activeCell;\n activeCell.setAttribute(\"tabindex\", \"0\");\n }\n // TODO needs to be scroll cell\n console.log(`scroll row ${cellPos[0]}`);\n requestScroll?.({ type: \"scroll-row\", rowIndex: cellPos[0] });\n activeCell.focus({ preventScroll: true });\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, requestScroll]\n );\n\n const setActiveCell = useCallback(\n (rowIdx: number, colIdx: number, fromKeyboard = false) => {\n const pos: CellPos = [rowIdx, colIdx];\n activeCellPos.current = pos;\n if (navigationStyle === \"row\") {\n setHighlightedIdx(rowIdx);\n } else {\n focusCell(pos);\n }\n if (fromKeyboard) {\n focusedCellPos.current = pos;\n }\n },\n [focusCell, navigationStyle, setHighlightedIdx]\n );\n\n const nextPageItemIdx = useCallback(\n (\n key: \"PageDown\" | \"PageUp\" | \"Home\" | \"End\",\n [rowIdx, colIdx]: CellPos\n ): Promise<CellPos> =>\n new Promise((resolve) => {\n let newRowIdx = rowIdx;\n switch (key) {\n case \"PageDown\":\n newRowIdx = Math.min(rowCount - 1, rowIdx + viewportRowCount);\n requestScroll?.({ type: \"scroll-page\", direction: \"down\" });\n break;\n case \"PageUp\":\n newRowIdx = Math.max(0, rowIdx - viewportRowCount);\n requestScroll?.({ type: \"scroll-page\", direction: \"up\" });\n break;\n case \"Home\":\n newRowIdx = 0;\n requestScroll?.({ type: \"scroll-end\", direction: \"home\" });\n break;\n case \"End\":\n newRowIdx = rowCount - 1;\n requestScroll?.({ type: \"scroll-end\", direction: \"end\" });\n break;\n }\n setTimeout(() => {\n resolve([newRowIdx, colIdx]);\n }, 90);\n }),\n [requestScroll, rowCount, viewportRowCount]\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 if (navigationStyle === \"row\") {\n setHighlightedIdx(focusedCellPos.current[0]);\n }\n }\n }\n }\n }, [\n disableHighlightOnFocus,\n containerRef,\n navigationStyle,\n setHighlightedIdx,\n ]);\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 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 scrollRowIntoViewIfNecessary = useCallback(\n (rowIndex: number) => {\n requestScroll?.({ type: \"scroll-row\", rowIndex });\n },\n [requestScroll]\n );\n\n const moveHighlightedRow = useCallback(\n async (key: NavigationKey) => {\n const { current: highlighted } = highlightedIndexRef;\n const [nextRowIdx] = isPagingKey(key)\n ? await nextPageItemIdx(key, [highlighted ?? -1, 0])\n : nextCellPos(key, [highlighted ?? -1, 0], columnCount, rowCount);\n if (nextRowIdx !== highlighted) {\n setHighlightedIndex(nextRowIdx);\n // TO(DO make this a scroll request)\n scrollRowIntoViewIfNecessary(nextRowIdx);\n }\n },\n [\n columnCount,\n nextPageItemIdx,\n rowCount,\n scrollRowIntoViewIfNecessary,\n setHighlightedIndex,\n ]\n );\n\n useEffect(() => {\n if (highlightedIndexProp !== undefined && highlightedIndexProp !== -1) {\n scrollRowIntoViewIfNecessary(highlightedIndexProp);\n }\n }, [highlightedIndexProp, scrollRowIntoViewIfNecessary]);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (rowCount > 0 && isNavigationKey(e.key, navigationStyle)) {\n e.preventDefault();\n e.stopPropagation();\n if (navigationStyle === \"row\") {\n moveHighlightedRow(e.key);\n } else {\n void navigateChildItems(e.key);\n }\n }\n },\n [rowCount, navigationStyle, moveHighlightedRow, 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 handleMouseLeave = useCallback(() => {\n setHighlightedIndex(-1);\n }, [setHighlightedIndex]);\n\n const handleMouseMove = useCallback(\n (evt: MouseEvent) => {\n const idx = closestRowIndex(evt.target as HTMLElement);\n if (idx !== -1 && idx !== highlightedIndexRef.current) {\n setHighlightedIndex(idx);\n }\n },\n [setHighlightedIndex]\n );\n\n const navigate = useCallback(() => {\n navigateChildItems(\"ArrowDown\");\n }, [navigateChildItems]);\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 && !disableFocus) {\n const { current: container } = containerRef;\n const cell = (container?.querySelector(headerCellQuery(0)) ||\n container?.querySelector(dataCellQuery(0, 0))) as HTMLElement;\n if (cell) {\n cell.setAttribute(\"tabindex\", \"0\");\n focusableCell.current = cell;\n }\n }\n }, [containerRef, disableFocus, fullyRendered]);\n\n return {\n highlightedIndexRef,\n navigate,\n onClick: handleClick,\n onFocus: handleFocus,\n onKeyDown: handleKeyDown,\n onMouseLeave: navigationStyle === \"row\" ? handleMouseLeave : undefined,\n onMouseMove: navigationStyle === \"row\" ? handleMouseMove : undefined,\n };\n};\n", "import { RowClickHandler, TableSelectionModel } from \"@vuu-ui/vuu-table-types\";\nimport {\n deselectItem,\n dispatchMouseEvent,\n isRowSelected,\n metadataKeys,\n selectItem,\n} from \"@vuu-ui/vuu-utils\";\nimport {\n DataSourceRow,\n Selection,\n SelectionChangeHandler,\n} from \"@vuu-ui/vuu-data-types\";\nimport {\n KeyboardEvent,\n KeyboardEventHandler,\n MutableRefObject,\n useCallback,\n useRef,\n} from \"react\";\n\nconst { IDX } = metadataKeys;\n\nconst NO_SELECTION: Selection = [];\n\nconst defaultSelectionKeys = [\"Enter\", \" \"];\n\nexport interface SelectionHookProps {\n highlightedIndexRef: MutableRefObject<number | undefined>;\n selectionKeys?: string[];\n selectionModel: TableSelectionModel;\n onSelect?: (row: DataSourceRow) => void;\n onSelectionChange: SelectionChangeHandler;\n}\n\nexport const useSelection = ({\n highlightedIndexRef,\n selectionKeys = defaultSelectionKeys,\n selectionModel,\n onSelect,\n onSelectionChange,\n}: SelectionHookProps) => {\n selectionModel === \"extended\" || selectionModel === \"checkbox\";\n const lastActiveRef = useRef(-1);\n const selectedRef = useRef<Selection>(NO_SELECTION);\n\n const isSelectionEvent = useCallback(\n (evt: KeyboardEvent<HTMLElement>) => selectionKeys.includes(evt.key),\n [selectionKeys]\n );\n\n const handleRowClick = useCallback<RowClickHandler>(\n (row, rangeSelect, keepExistingSelection) => {\n const { [IDX]: idx } = row;\n const { current: active } = lastActiveRef;\n const { current: selected } = selectedRef;\n\n const selectOperation = isRowSelected(row) ? 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 onSelect?.(row);\n onSelectionChange?.(newSelected);\n },\n [onSelect, onSelectionChange, selectionModel]\n );\n\n const handleKeyDown = useCallback<KeyboardEventHandler<HTMLElement>>(\n (e) => {\n if (isSelectionEvent(e)) {\n const { current: rowIndex } = highlightedIndexRef;\n if (rowIndex !== undefined && rowIndex !== -1) {\n const rowEl = (e.target as HTMLElement).querySelector(\n `[aria-rowindex=\"${rowIndex}\"]`\n ) as HTMLElement;\n if (rowEl) {\n dispatchMouseEvent(rowEl, \"click\");\n }\n }\n }\n },\n [highlightedIndexRef, isSelectionEvent]\n );\n\n return {\n onKeyDown: handleKeyDown,\n onRowClick: handleRowClick,\n };\n};\n", "import { DataSource, DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport { RuntimeColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { useContextMenu as usePopupContextMenu } from \"@vuu-ui/vuu-popups\";\nimport { buildColumnMap, getIndexFromRowElement } from \"@vuu-ui/vuu-utils\";\nimport { MouseEvent, useCallback } from \"react\";\n\nexport interface TableContextMenuHookProps {\n columns: RuntimeColumnDescriptor[];\n data: DataSourceRow[];\n dataSource: DataSource;\n getSelectedRows: () => DataSourceRow[];\n}\n\nconst NO_ROWS = [] as const;\n\nexport const useTableContextMenu = ({\n columns,\n data,\n dataSource,\n getSelectedRows,\n}: TableContextMenuHookProps) => {\n const [showContextMenu] = usePopupContextMenu();\n\n const onContextMenu = useCallback(\n (evt: MouseEvent<HTMLElement>) => {\n const target = evt.target as HTMLElement;\n const cellEl = target?.closest(\"div[role='cell']\");\n const rowEl = target?.closest(\"div[role='row']\") as HTMLElement;\n if (cellEl && rowEl) {\n const { selectedRowsCount } = dataSource;\n const columnMap = buildColumnMap(columns);\n const rowIndex = getIndexFromRowElement(rowEl);\n const cellIndex = Array.from(rowEl.childNodes).indexOf(cellEl);\n const row = data.find(([idx]) => idx === rowIndex);\n const columnName = columns[cellIndex];\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 [columns, data, dataSource, getSelectedRows, showContextMenu]\n );\n\n return onContextMenu;\n};\n", "import {\n ColumnDescriptor,\n PinLocation,\n ResizePhase,\n RuntimeColumnDescriptor,\n TableAttributes,\n TableConfig,\n TableHeadings,\n} from \"@vuu-ui/vuu-table-types\";\nimport {\n applyFilterToColumns,\n applyGroupByToColumns,\n applySortToColumns,\n getCellRenderer,\n getColumnHeaderContentRenderer,\n getColumnHeaderLabelRenderer,\n getColumnLabel,\n getTableHeadings,\n getValueFormatter,\n hasValidationRules,\n isFilteredColumn,\n isGroupColumn,\n isPinned,\n logger,\n metadataKeys,\n replaceColumn,\n sortPinnedColumns,\n stripFilterFromColumns,\n subscribedOnly,\n} from \"@vuu-ui/vuu-utils\";\n\nimport {\n DataSource,\n DataSourceConfig,\n TableSchema,\n} from \"@vuu-ui/vuu-data-types\";\nimport { VuuColumnDataType, VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport { buildValidationChecker } from \"@vuu-ui/vuu-ui-controls\";\nimport { Reducer, useReducer } from \"react\";\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 getDataType = (\n column: ColumnDescriptor,\n tableSchema?: TableSchema\n): VuuColumnDataType | undefined => {\n const schemaColumn = tableSchema?.columns.find(\n ({ name }) => name === column.name\n );\n if (schemaColumn) {\n return schemaColumn.serverDataType;\n } else {\n return column.serverDataType;\n }\n};\n\n/**\n * TableModel represents state used internally to manage Table. It is\n * derived initially from the TableConfig provided by user, along with the\n * data-related config from DataSource.\n */\nexport interface TableModel extends TableAttributes {\n columns: RuntimeColumnDescriptor[];\n headings: TableHeadings;\n}\n\n/**\n * InternalTableModel describes the state managed within the TableModel\n * reducer. It is the same as TableModel but with the addition of a\n * readonly copy of the original TableConfig.\n */\ninterface InternalTableModel extends TableModel {\n tableConfig: Readonly<TableConfig>;\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: TableConfig;\n dataSource: DataSource;\n}\n\nexport interface ColumnActionHide {\n type: \"hideColumns\";\n columns: RuntimeColumnDescriptor[];\n}\n\nexport interface ColumnActionShow {\n type: \"showColumns\";\n columns: RuntimeColumnDescriptor[];\n}\nexport interface ColumnActionMove {\n type: \"moveColumn\";\n column: RuntimeColumnDescriptor;\n moveBy?: 1 | -1;\n}\n\nexport interface ColumnActionPin {\n type: \"pinColumn\";\n column: ColumnDescriptor;\n pin?: PinLocation;\n}\n\nexport interface ColumnActionResize {\n type: \"resizeColumn\";\n column: RuntimeColumnDescriptor;\n phase: ResizePhase;\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: RuntimeColumnDescriptor;\n hidden?: ColumnDescriptor[\"hidden\"];\n label?: ColumnDescriptor[\"label\"];\n resizing?: RuntimeColumnDescriptor[\"resizing\"];\n type: \"updateColumnProp\";\n width?: ColumnDescriptor[\"width\"];\n}\n\nexport interface ColumnActionTableConfig extends DataSourceConfig {\n confirmed?: boolean;\n type: \"tableConfig\";\n}\n\nexport interface ColumnActionColumnSettings extends DataSourceConfig {\n type: \"columnSettings\";\n column: ColumnDescriptor;\n /** required only for calculated coplumns */\n vuuTable?: VuuTable;\n}\n\nexport interface ColumnActionTableSettings extends DataSourceConfig {\n type: \"tableSettings\";\n}\n\nexport const isShowColumnSettings = (\n action: PersistentColumnAction\n): action is ColumnActionColumnSettings => action.type === \"columnSettings\";\n\nexport const isShowTableSettings = (\n action: PersistentColumnAction\n): action is ColumnActionTableSettings => action.type === \"tableSettings\";\n\n/**\n * PersistentColumnActions are those actions that require us to persist user changes across sessions\n */\nexport type PersistentColumnAction =\n | ColumnActionPin\n | ColumnActionHide\n | ColumnActionColumnSettings\n | ColumnActionTableSettings;\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<InternalTableModel, GridModelAction>;\n\nexport type ColumnActionDispatch = (action: GridModelAction) => void;\n\nconst columnReducer: GridModelReducer = (state, action) => {\n info?.(`TableModelReducer ${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 tableConfigProp: TableConfig,\n dataSource: DataSource\n) => {\n const [state, dispatchColumnAction] = useReducer<\n GridModelReducer,\n InitialConfig\n >(columnReducer, { tableConfig: tableConfigProp, dataSource }, init);\n\n const { columns, headings, tableConfig, ...tableAttributes } = state;\n\n return {\n columns,\n dispatchColumnAction,\n headings,\n tableAttributes,\n tableConfig,\n };\n};\n\ntype InitialConfig = {\n dataSource: DataSource;\n tableConfig: TableConfig;\n};\n\nfunction init({ dataSource, tableConfig }: InitialConfig): InternalTableModel {\n const { columns, ...tableAttributes } = tableConfig;\n const { config: dataSourceConfig, tableSchema } = dataSource;\n const runtimeColumns = columns\n .filter(subscribedOnly(dataSourceConfig?.columns))\n .map(\n columnDescriptorToRuntimeColumDescriptor(tableAttributes, tableSchema)\n );\n\n const maybePinnedColumns = runtimeColumns.some(isPinned)\n ? sortPinnedColumns(runtimeColumns)\n : runtimeColumns;\n let state: InternalTableModel = {\n columns: maybePinnedColumns,\n headings: getTableHeadings(maybePinnedColumns),\n tableConfig,\n ...tableAttributes,\n };\n if (dataSourceConfig) {\n const { columns: _, ...rest } = dataSourceConfig;\n state = updateTableConfig(state, {\n type: \"tableConfig\",\n ...rest,\n });\n }\n return state;\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 columnDescriptorToRuntimeColumDescriptor =\n (tableAttributes: TableAttributes, tableSchema?: TableSchema) =>\n (\n column: ColumnDescriptor & { key?: number },\n index: number\n ): RuntimeColumnDescriptor => {\n const { columnDefaultWidth = DEFAULT_COLUMN_WIDTH, columnFormatHeader } =\n tableAttributes;\n const serverDataType = getDataType(column, tableSchema);\n const {\n align = getDefaultAlignment(serverDataType),\n key,\n name,\n label = getColumnLabel(column),\n width = columnDefaultWidth,\n ...rest\n } = column;\n\n const runtimeColumnWithDefaults: RuntimeColumnDescriptor = {\n ...rest,\n align,\n CellRenderer: getCellRenderer(column),\n HeaderCellContentRenderer: getColumnHeaderContentRenderer(column),\n HeaderCellLabelRenderer: getColumnHeaderLabelRenderer(column),\n clientSideEditValidationCheck: hasValidationRules(column.type)\n ? buildValidationChecker(column.type.renderer.rules)\n : undefined,\n label: getLabel(label, columnFormatHeader),\n key: key ?? index + KEY_OFFSET,\n name,\n originalIdx: index,\n serverDataType,\n valueFormatter: getValueFormatter(column, serverDataType),\n width: width,\n };\n\n if (isGroupColumn(runtimeColumnWithDefaults)) {\n runtimeColumnWithDefaults.columns = runtimeColumnWithDefaults.columns.map(\n (col) =>\n columnDescriptorToRuntimeColumDescriptor(tableAttributes)(\n col,\n col.key\n )\n );\n }\n\n return runtimeColumnWithDefaults;\n };\n\nfunction moveColumn(\n state: InternalTableModel,\n // TODO do we ever use this ?\n { column, moveBy }: 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 }\n return state;\n}\n\nfunction hideColumns(state: InternalTableModel, { columns }: ColumnActionHide) {\n if (columns.some((col) => col.hidden !== true)) {\n return columns.reduce<InternalTableModel>((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: InternalTableModel, { columns }: ColumnActionShow) {\n if (columns.some((col) => col.hidden)) {\n return columns.reduce<InternalTableModel>((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: InternalTableModel,\n { column, phase, width }: ColumnActionResize\n) {\n const type = \"updateColumnProp\";\n const resizing = phase !== \"end\";\n switch (phase) {\n case \"begin\":\n return updateColumnProp(state, { type, column, resizing });\n case \"end\":\n return updateColumnProp(state, { type, column, resizing, width });\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: InternalTableModel,\n { tableSchema }: ColumnActionSetTableSchema\n) {\n const { columns } = state;\n if (columns.some(columnWithoutDataType)) {\n const cols = columns.map((column) => {\n const serverDataType = getDataType(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 };\n } else {\n return state;\n }\n}\n\nfunction pinColumn(state: InternalTableModel, 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(\n state: InternalTableModel,\n action: ColumnActionUpdateProp\n) {\n let { columns, tableConfig } = 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 const targetConfigColumn = tableConfig.columns.find(\n (col) => col.name === column.name\n );\n if (targetConfigColumn) {\n tableConfig = {\n ...tableConfig,\n columns: replaceColumn<ColumnDescriptor>(tableConfig.columns, {\n ...targetConfigColumn,\n width,\n }),\n };\n }\n }\n }\n return {\n ...state,\n columns,\n tableConfig,\n } as InternalTableModel;\n}\n\nfunction updateTableConfig(\n state: InternalTableModel,\n { confirmed, filter, groupBy, sort }: ColumnActionTableConfig\n) {\n const hasGroupBy = groupBy !== undefined;\n const hasFilter = typeof filter?.filter === \"string\";\n const hasSort = sort && sort.sortDefs.length > 0;\n\n let result = state;\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", "import { getRowElementAtIndex, RowAtPositionFunc } from \"@vuu-ui/vuu-utils\";\nimport { VuuRange } from \"@vuu-ui/vuu-protocol-types\";\nimport {\n ForwardedRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n} from \"react\";\nimport { ViewportMeasurements } from \"./useTableViewport\";\n\nexport type ScrollDirectionVertical = \"up\" | \"down\";\nexport type ScrollDirectionHorizontal = \"left\" | \"right\";\nexport type ScrollDirection =\n | ScrollDirectionVertical\n | ScrollDirectionHorizontal;\n\n/**\n * scroll into view the row at given index posiiton.\n */\nexport interface ScrollRequestRow {\n rowIndex: number;\n type: \"scroll-row\";\n}\nexport interface ScrollRequestEnd {\n type: \"scroll-end\";\n direction: \"home\" | \"end\";\n}\n\nexport interface ScrollRequestPage {\n type: \"scroll-page\";\n direction: ScrollDirectionVertical;\n}\n\nexport type ScrollRequest =\n | ScrollRequestPage\n | ScrollRequestEnd\n | ScrollRequestRow;\n\nexport type ScrollRequestHandler = (request: ScrollRequest) => void;\n\nexport interface ScrollingAPI {\n scrollToIndex: (itemIndex: number) => void;\n scrollToKey: (rowKey: string) => void;\n}\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\nexport const noScrolling: ScrollingAPI = {\n scrollToIndex: () => undefined,\n scrollToKey: () => undefined,\n};\n\ninterface CallbackRefHookProps<T = HTMLElement> {\n onAttach?: (el: T) => void;\n onDetach: (el: T) => void;\n label?: string;\n}\n\nconst NO_SCROLL_NECESSARY = [undefined, undefined] as const;\n\nexport const howFarIsRowOutsideViewport = (\n rowEl: HTMLElement,\n totalHeaderHeight: number,\n contentContainer = rowEl.closest(\".vuuTable-contentContainer\")\n): readonly [ScrollDirection | undefined, number | undefined] => {\n //TODO lots of scope for optimisation here\n if (contentContainer) {\n // TODO take totalHeaderHeight into consideration\n const viewport = contentContainer?.getBoundingClientRect();\n const upperBoundary = viewport.top + totalHeaderHeight;\n const row = rowEl.getBoundingClientRect();\n if (row) {\n if (row.bottom > viewport.bottom) {\n return [\"down\", row.bottom - viewport.bottom];\n } else if (row.top < upperBoundary) {\n return [\"up\", row.top - upperBoundary];\n } else {\n return NO_SCROLL_NECESSARY;\n }\n } else {\n throw Error(\"Whats going on, row not found\");\n }\n } else {\n throw Error(\"Whats going on, scrollbar container not found\");\n }\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 getRowAtPosition: RowAtPositionFunc;\n onHorizontalScroll?: (scrollLeft: number) => void;\n onVerticalScroll?: (scrollTop: number, pctScrollTop: number) => void;\n rowHeight: number;\n scrollingApiRef?: ForwardedRef<ScrollingAPI>;\n setRange: (range: VuuRange) => void;\n viewportMeasurements: ViewportMeasurements;\n}\n\nexport const useTableScroll = ({\n getRowAtPosition,\n onHorizontalScroll,\n onVerticalScroll,\n scrollingApiRef,\n setRange,\n viewportMeasurements,\n}: TableScrollHookProps) => {\n const firstRowRef = useRef<number>(0);\n const contentContainerScrolledRef = useRef(false);\n const scrollPosRef = useRef({ scrollTop: 0, scrollLeft: 0 });\n const scrollbarContainerRef = useRef<HTMLDivElement | null>(null);\n const contentContainerRef = useRef<HTMLDivElement | null>(null);\n\n const {\n appliedPageSize,\n isVirtualScroll,\n maxScrollContainerScrollHorizontal: maxScrollLeft,\n maxScrollContainerScrollVertical: maxScrollTop,\n rowCount: viewportRowCount,\n totalHeaderHeight,\n } = viewportMeasurements;\n\n const handleVerticalScroll = useCallback(\n (scrollTop: number, pctScrollTop: number) => {\n onVerticalScroll?.(scrollTop, pctScrollTop);\n const firstRow = getRowAtPosition(scrollTop);\n if (firstRow !== firstRowRef.current) {\n firstRowRef.current = firstRow;\n setRange({ from: firstRow, to: firstRow + viewportRowCount + 1 });\n }\n },\n [getRowAtPosition, onVerticalScroll, setRange, viewportRowCount]\n );\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 rootScrollLeft = Math.round(pctScrollLeft * maxScrollLeft);\n const rootScrollTop = pctScrollTop * maxScrollTop;\n contentContainer.scrollTo({\n left: rootScrollLeft,\n top: rootScrollTop,\n behavior: \"auto\",\n });\n }\n }, [maxScrollLeft, maxScrollTop]);\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 scrollbarContainer.scrollLeft = Math.round(pctScrollLeft * maxScrollLeft);\n scrollbarContainer.scrollTop = pctScrollTop * maxScrollTop;\n\n if (scrollPos.scrollTop !== scrollTop) {\n scrollPos.scrollTop = scrollTop;\n handleVerticalScroll(scrollTop, pctScrollTop);\n }\n if (scrollPos.scrollLeft !== scrollLeft) {\n scrollPos.scrollLeft = scrollLeft;\n onHorizontalScroll?.(scrollLeft);\n }\n }\n }, [handleVerticalScroll, maxScrollLeft, maxScrollTop, onHorizontalScroll]);\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 const { scrollLeft, scrollTop } = scrollbarContainer;\n contentContainerScrolledRef.current = false;\n if (scrollRequest.type === \"scroll-row\") {\n const activeRow = getRowElementAtIndex(\n scrollbarContainer,\n scrollRequest.rowIndex\n );\n if (activeRow !== null) {\n const [direction, distance] = howFarIsRowOutsideViewport(\n activeRow,\n totalHeaderHeight\n );\n if (direction && distance) {\n if (isVirtualScroll) {\n console.log(\n `virtual scroll row required ${direction} ${distance} \n first Row ${firstRowRef.current}`\n );\n // const from = firstRowRef.current + 1;\n // console.log(`setRange from ${from}`);\n // setRange({ from, to: from + viewportRowCount + 1 });\n } else {\n let newScrollLeft = scrollLeft;\n let newScrollTop = scrollTop;\n if (direction === \"up\" || direction === \"down\") {\n newScrollTop = Math.min(\n Math.max(0, scrollTop + distance),\n maxScrollTop\n );\n } else {\n newScrollLeft = Math.min(\n Math.max(0, scrollLeft + distance),\n maxScrollLeft\n );\n }\n scrollbarContainer.scrollTo({\n top: newScrollTop,\n left: newScrollLeft,\n behavior: \"smooth\",\n });\n }\n }\n }\n } else if (scrollRequest.type === \"scroll-page\") {\n const { direction } = scrollRequest;\n if (isVirtualScroll) {\n console.log(`need a virtual page scroll`);\n } else {\n const scrollBy =\n direction === \"down\" ? appliedPageSize : -appliedPageSize;\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 }\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 [\n appliedPageSize,\n isVirtualScroll,\n maxScrollLeft,\n maxScrollTop,\n setRange,\n totalHeaderHeight,\n viewportRowCount,\n ]\n );\n\n const scrollHandles: ScrollingAPI = useMemo(\n () => ({\n scrollToIndex: (rowIndex: number) => {\n if (scrollbarContainerRef.current) {\n const scrollPos = (rowIndex - 30) * 20;\n scrollbarContainerRef.current.scrollTop = scrollPos;\n }\n },\n scrollToKey: (rowKey: string) => {\n console.log(`scrollToKey ${rowKey}`);\n },\n }),\n []\n );\n\n useImperativeHandle(\n scrollingApiRef,\n () => {\n if (scrollbarContainerRef.current) {\n return scrollHandles;\n } else {\n return noScrolling;\n }\n },\n [scrollHandles]\n );\n\n useEffect(() => {\n const { current: from } = firstRowRef;\n const rowRange = { from, to: from + viewportRowCount + 1 };\n setRange(rowRange);\n }, [setRange, viewportRowCount]);\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 RuntimeColumnDescriptor,\n TableHeadings,\n} from \"@vuu-ui/vuu-table-types\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { MeasuredSize } from \"@vuu-ui/vuu-layout\";\nimport {\n actualRowPositioning,\n RowAtPositionFunc,\n RowOffsetFunc,\n RowPositioning,\n virtualRowPositioning,\n} from \"@vuu-ui/vuu-utils\";\n\nexport interface TableViewportHookProps {\n columns: RuntimeColumnDescriptor[];\n headerHeight: number;\n headings: TableHeadings;\n rowCount: number;\n rowHeight: number;\n size: MeasuredSize | undefined;\n}\n\nexport interface ViewportMeasurements {\n appliedPageSize: number;\n contentHeight: number;\n horizontalScrollbarHeight: number;\n isVirtualScroll: boolean;\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\n// const MAX_RAW_ROWS = 1_000_000;\nconst MAX_RAW_ROWS = 100_000;\n\nconst UNMEASURED_VIEWPORT: TableViewportHookResult = {\n appliedPageSize: 0,\n contentHeight: 0,\n contentWidth: 0,\n getRowAtPosition: () => -1,\n getRowOffset: () => -1,\n horizontalScrollbarHeight: 0,\n isVirtualScroll: false,\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: RuntimeColumnDescriptor[]) => {\n let pinnedWidthLeft = 0;\n let pinnedWidthRight = 0;\n let unpinnedWidth = 0;\n for (const column of columns) {\n const { hidden, pin, width } = column;\n const visibleWidth = hidden ? 0 : width;\n if (pin === \"left\") {\n pinnedWidthLeft += visibleWidth;\n } else if (pin === \"right\") {\n pinnedWidthRight += visibleWidth;\n } else {\n unpinnedWidth += visibleWidth;\n }\n }\n return {\n pinnedWidthLeft: pinnedWidthLeft + 4,\n pinnedWidthRight: pinnedWidthRight + 4,\n unpinnedWidth,\n };\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 // TODO we are limited by pixels not an arbitraty number of rows\n const pixelContentHeight = rowHeight * Math.min(rowCount, MAX_RAW_ROWS);\n const virtualContentHeight = rowCount * rowHeight;\n const virtualisedExtent = virtualContentHeight - pixelContentHeight;\n\n const { pinnedWidthLeft, pinnedWidthRight, unpinnedWidth } = useMemo(\n () => measurePinnedColumns(columns),\n [columns]\n );\n\n const totalHeaderHeightRef = useRef(headerHeight);\n useMemo(() => {\n totalHeaderHeightRef.current = headerHeight * (1 + headings.length);\n }, [headerHeight, headings.length]);\n\n const [getRowOffset, getRowAtPosition, isVirtualScroll] =\n useMemo<RowPositioning>(() => {\n if (virtualisedExtent) {\n return virtualRowPositioning(\n rowHeight,\n virtualisedExtent,\n pctScrollTopRef\n );\n } else {\n return actualRowPositioning(rowHeight);\n }\n }, [virtualisedExtent, rowHeight]);\n\n const setPctScrollTop = useCallback((scrollPct: number) => {\n pctScrollTopRef.current = scrollPct;\n }, []);\n\n return useMemo(() => {\n if (size) {\n const { current: totalHeaderHeight } = totalHeaderHeightRef;\n // TODO determine this at runtime\n const scrollbarSize = 15;\n const contentWidth = pinnedWidthLeft + unpinnedWidth + pinnedWidthRight;\n const horizontalScrollbarHeight =\n contentWidth > size.width ? scrollbarSize : 0;\n const maxScrollContainerScrollVertical =\n pixelContentHeight -\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\n : Math.ceil(visibleRows);\n const viewportBodyHeight = size.height - totalHeaderHeight;\n const verticalScrollbarWidth =\n pixelContentHeight > viewportBodyHeight ? scrollbarSize : 0;\n\n const appliedPageSize =\n count * rowHeight * (pixelContentHeight / virtualContentHeight);\n\n return {\n appliedPageSize,\n contentHeight: pixelContentHeight,\n contentWidth,\n getRowAtPosition,\n getRowOffset,\n isVirtualScroll,\n horizontalScrollbarHeight,\n maxScrollContainerScrollHorizontal,\n maxScrollContainerScrollVertical,\n pinnedWidthLeft,\n pinnedWidthRight,\n rowCount: count,\n setPctScrollTop,\n totalHeaderHeight,\n verticalScrollbarWidth,\n viewportBodyHeight,\n };\n } else {\n return UNMEASURED_VIEWPORT;\n }\n }, [\n getRowAtPosition,\n getRowOffset,\n headerHeight,\n isVirtualScroll,\n pinnedWidthLeft,\n unpinnedWidth,\n pinnedWidthRight,\n pixelContentHeight,\n rowHeight,\n setPctScrollTop,\n size,\n virtualContentHeight,\n ]);\n};\n", "import { DataSourceConfig, SchemaColumn } from \"@vuu-ui/vuu-data-types\";\nimport { useLayoutProviderDispatch } from \"@vuu-ui/vuu-layout\";\nimport {\n ColumnDescriptor,\n ColumnSettingsProps,\n TableConfig,\n TableSettingsProps,\n} from \"@vuu-ui/vuu-table-types\";\nimport { getCalculatedColumnType } from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useRef, useState } from \"react\";\nimport { ColumnActionColumnSettings } from \"./useTableModel\";\n\nexport interface TableAndColumnSettingsHookProps {\n availableColumns: SchemaColumn[];\n onAvailableColumnsChange?: (columns: SchemaColumn[]) => void;\n onConfigChange: (config: TableConfig) => void;\n onCreateCalculatedColumn: (column: ColumnDescriptor) => void;\n onDataSourceConfigChange: (dataSourceConfig: DataSourceConfig) => void;\n tableConfig: TableConfig;\n}\nexport const useTableAndColumnSettings = ({\n availableColumns: availableColumnsProps,\n onAvailableColumnsChange,\n onConfigChange,\n onCreateCalculatedColumn,\n onDataSourceConfigChange,\n tableConfig,\n}: TableAndColumnSettingsHookProps) => {\n const dispatchLayoutAction = useLayoutProviderDispatch();\n const showTableSettingsRef = useRef<() => void>();\n\n const [availableColumns, setAvailableColumns] = useState<SchemaColumn[]>(\n availableColumnsProps\n );\n\n const showContextPanel = useCallback(\n (\n componentType: string,\n title: string,\n props: TableSettingsProps | ColumnSettingsProps\n ) => {\n dispatchLayoutAction({\n type: \"set-props\",\n path: \"#context-panel\",\n props: {\n expanded: true,\n content: {\n type: componentType,\n props,\n },\n title,\n },\n });\n },\n [dispatchLayoutAction]\n );\n\n const handleCancelCreateColumn = useCallback(() => {\n requestAnimationFrame(() => {\n showTableSettingsRef.current?.();\n });\n }, []);\n\n const handleCreateCalculatedColumn = useCallback(\n (column: ColumnDescriptor) => {\n const newAvailableColumns = availableColumns.concat({\n name: column.name,\n serverDataType: getCalculatedColumnType(column),\n });\n setAvailableColumns(newAvailableColumns);\n onAvailableColumnsChange?.(newAvailableColumns);\n requestAnimationFrame(() => {\n showTableSettingsRef.current?.();\n });\n onCreateCalculatedColumn(column);\n },\n [availableColumns, onAvailableColumnsChange, onCreateCalculatedColumn]\n );\n\n const showColumnSettingsPanel = useCallback(\n (action: ColumnActionColumnSettings) => {\n showContextPanel(\"ColumnSettings\", \"Column Settings\", {\n column: action.column,\n onCancelCreateColumn: handleCancelCreateColumn,\n onConfigChange,\n onCreateCalculatedColumn: handleCreateCalculatedColumn,\n tableConfig,\n vuuTable: action.vuuTable,\n } as ColumnSettingsProps);\n },\n [\n handleCancelCreateColumn,\n handleCreateCalculatedColumn,\n onConfigChange,\n showContextPanel,\n tableConfig,\n ]\n );\n\n const handleAddCalculatedColumn = useCallback(() => {\n showColumnSettingsPanel({\n column: {\n name: \"::\",\n serverDataType: \"string\",\n },\n type: \"columnSettings\",\n vuuTable: { module: \"SIMUL\", table: \"instruments\" },\n });\n }, [showColumnSettingsPanel]);\n\n const handleNavigateToColumn = useCallback(\n (columnName: string) => {\n const column = tableConfig.columns.find((c) => c.name === columnName);\n if (column) {\n showColumnSettingsPanel({\n type: \"columnSettings\",\n column,\n //TODO where do we get this from\n vuuTable: { module: \"SIMUL\", table: \"instruments\" },\n });\n }\n },\n [showColumnSettingsPanel, tableConfig.columns]\n );\n\n showTableSettingsRef.current = useCallback(() => {\n showContextPanel(\"TableSettings\", \"DataGrid Settings\", {\n availableColumns:\n availableColumns ??\n tableConfig.columns.map(({ name, serverDataType }) => ({\n name,\n serverDataType,\n })),\n onAddCalculatedColumn: handleAddCalculatedColumn,\n onConfigChange,\n onDataSourceConfigChange,\n onNavigateToColumn: handleNavigateToColumn,\n tableConfig,\n } as TableSettingsProps);\n }, [\n availableColumns,\n handleAddCalculatedColumn,\n handleNavigateToColumn,\n onConfigChange,\n onDataSourceConfigChange,\n showContextPanel,\n tableConfig,\n ]);\n\n return {\n showColumnSettingsPanel,\n showTableSettingsPanel: showTableSettingsRef.current,\n };\n};\n", "import { VuuSortType } from \"@vuu-ui/vuu-protocol-types\";\nimport {\n ColumnDescriptor,\n RuntimeColumnDescriptor,\n TableColumnResizeHandler,\n TableConfig,\n TableHeadings,\n} from \"@vuu-ui/vuu-table-types\";\nimport { isGroupColumn, isNotHidden } from \"@vuu-ui/vuu-utils\";\nimport cx from \"clsx\";\nimport { GroupHeaderCellNext, HeaderCell } from \"../header-cell\";\nimport { useTableHeader } from \"./useTableHeader\";\n\nexport type ColumnSortHandler = (\n column: ColumnDescriptor,\n addToExistingSort: boolean,\n sortType?: VuuSortType\n) => void;\n\nexport interface TableHeaderProps {\n classBase?: string;\n columns: RuntimeColumnDescriptor[];\n headings: TableHeadings;\n onResizeColumn: TableColumnResizeHandler;\n onMoveColumn: (columns: ColumnDescriptor[]) => void;\n onMoveGroupColumn: (columns: ColumnDescriptor[]) => void;\n onRemoveGroupColumn: (column: RuntimeColumnDescriptor) => void;\n onSortColumn: ColumnSortHandler;\n tableConfig: TableConfig;\n tableId: string;\n}\n\nexport const TableHeader = ({\n classBase = \"vuuTable\",\n columns,\n headings,\n onMoveColumn,\n onMoveGroupColumn,\n onRemoveGroupColumn,\n onResizeColumn,\n onSortColumn,\n tableConfig,\n tableId,\n}: TableHeaderProps) => {\n const {\n containerRef,\n draggableColumn,\n draggedColumnIndex,\n onClick,\n onMouseDown,\n } = useTableHeader({\n columns,\n onMoveColumn,\n onSortColumn,\n tableConfig,\n });\n\n return (\n <div className={`${classBase}-col-headings`} ref={containerRef}>\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 className={`${classBase}-col-headers`} role=\"row\">\n {columns.filter(isNotHidden).map((col, i) =>\n isGroupColumn(col) ? (\n <GroupHeaderCellNext\n column={col}\n data-index={i}\n key={col.name}\n onMoveColumn={onMoveGroupColumn}\n onRemoveColumn={onRemoveGroupColumn}\n onResize={onResizeColumn}\n />\n ) : (\n <HeaderCell\n className={cx({\n \"vuuDraggable-dragAway\": i === draggedColumnIndex,\n })}\n column={col}\n data-index={i}\n id={`${tableId}-col-${i}`}\n key={col.name}\n onClick={onClick}\n onMouseDown={onMouseDown}\n onResize={onResizeColumn}\n />\n )\n )}\n {draggableColumn}\n </div>\n </div>\n );\n};\n", "import { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { useDragDrop as useDragDrop } from \"@vuu-ui/vuu-ui-controls\";\nimport { moveColumnTo, visibleColumnAtIndex } from \"@vuu-ui/vuu-utils\";\nimport { MouseEventHandler, useCallback, useRef } from \"react\";\nimport { TableHeaderProps } from \"./TableHeader\";\n\nexport interface TableHeaderHookProps\n extends Pick<\n TableHeaderProps,\n \"columns\" | \"onMoveColumn\" | \"onSortColumn\" | \"tableConfig\"\n > {\n label?: string;\n onMoveColumn: (columns: ColumnDescriptor[]) => void;\n onSortColumn: (column: ColumnDescriptor, addToExistingSort: boolean) => void;\n}\n\nexport const useTableHeader = ({\n columns,\n onMoveColumn,\n onSortColumn,\n tableConfig,\n}: TableHeaderHookProps) => {\n const containerRef = useRef<HTMLDivElement>(null);\n\n const handleDropColumnHeader = useCallback(\n (moveFrom: number, moveTo: number) => {\n const column = columns[moveFrom];\n // columns are what get rendered, so these are the columns that\n // the drop operation relates to. We must translate these into\n // columns within the table config. Grouping complicates this\n // as the group columns are not present in columns but ARE in\n // config.columns\n const orderedColumns = moveColumnTo(columns, column, moveTo);\n\n const ofColumn =\n ({ name }: ColumnDescriptor) =>\n (col: ColumnDescriptor) =>\n col.name === name;\n\n const targetIndex = orderedColumns.findIndex(ofColumn(column));\n const nextColumn = orderedColumns[targetIndex + 1];\n const insertPos = nextColumn\n ? tableConfig.columns.findIndex(ofColumn(nextColumn))\n : -1;\n\n if (moveTo > moveFrom && insertPos !== -1) {\n onMoveColumn(moveColumnTo(tableConfig.columns, column, insertPos - 1));\n } else {\n onMoveColumn(moveColumnTo(tableConfig.columns, column, insertPos));\n }\n },\n [columns, onMoveColumn, tableConfig.columns]\n );\n\n const handleColumnHeaderClick = useCallback<\n MouseEventHandler<HTMLDivElement>\n >(\n (evt) => {\n const targetElement = evt.target as HTMLElement;\n const headerCell = targetElement.closest(\n \".vuuTableHeaderCell\"\n ) as HTMLElement;\n const colIdx = parseInt(headerCell?.dataset.index ?? \"-1\");\n const column = visibleColumnAtIndex(columns, colIdx);\n const isAdditive = evt.shiftKey;\n column && onSortColumn(column, isAdditive);\n },\n [columns, onSortColumn]\n );\n\n // Drag Drop column headers\n const {\n onMouseDown: columnHeaderDragMouseDown,\n draggable: draggableColumn,\n ...dragDropHook\n } = useDragDrop({\n allowDragDrop: true,\n containerRef,\n draggableClassName: `vuuTable`,\n onDrop: handleDropColumnHeader,\n orientation: \"horizontal\",\n itemQuery: \".vuuTableHeaderCell\",\n });\n\n return {\n containerRef,\n draggableColumn,\n draggedColumnIndex: dragDropHook.draggedItemIndex,\n onClick: handleColumnHeaderClick,\n onMouseDown: columnHeaderDragMouseDown,\n };\n};\n", "import React, { memo, useCallback } from \"react\";\nimport { TableCellRendererProps } from \"@vuu-ui/vuu-table-types\";\nimport { CheckboxIcon, WarnCommit } from \"@vuu-ui/vuu-ui-controls\";\nimport { Checkbox } from \"@salt-ds/core\";\nimport { dataAndColumnUnchanged } from \"../cell-utils\";\nimport { dispatchCustomEvent, registerComponent } from \"@vuu-ui/vuu-utils\";\n\nexport const CheckboxCell: React.FC<TableCellRendererProps> = memo(\n ({ column, columnMap, onCommit = WarnCommit, row }) => {\n const dataIdx = columnMap[column.name];\n const isChecked = row[dataIdx];\n\n const handleCommit = useCallback(\n (value) => async (evt: React.MouseEvent) => {\n const res = await onCommit(value);\n if (res === true) {\n dispatchCustomEvent(evt.target as HTMLElement, \"vuu-commit\");\n }\n return res;\n },\n [onCommit]\n );\n\n return column.editable ? (\n <Checkbox checked={isChecked} onClick={handleCommit(!isChecked)} />\n ) : (\n <CheckboxIcon checked={isChecked} disabled={true} />\n );\n },\n dataAndColumnUnchanged\n);\nCheckboxCell.displayName = \"CheckboxCell\";\n\nregisterComponent(\"checkbox-cell\", CheckboxCell, \"cell-renderer\", {\n serverDataType: \"boolean\",\n});\n", "import { TableCellRendererProps } from \"@vuu-ui/vuu-table-types\";\n/**\n * A memo compare function for cell renderers. Can be used to suppress\n * render where column and data are both unchanged. Avoids render\n * when row changes, where changes in row are unrelated to this cell.\n */\nexport const dataAndColumnUnchanged = (\n p: TableCellRendererProps,\n p1: TableCellRendererProps\n) =>\n p.column === p1.column &&\n p.column.valueFormatter(p.row[p.columnMap[p.column.name]]) ===\n p1.column.valueFormatter(p1.row[p1.columnMap[p1.column.name]]);\n", "import { TableCellRendererProps } from \"@vuu-ui/vuu-table-types\";\nimport { registerComponent } from \"@vuu-ui/vuu-utils\";\nimport { Input } from \"@salt-ds/core\";\nimport { useEditableText } from \"@vuu-ui/vuu-ui-controls\";\nimport cx from \"clsx\";\n\nimport \"./InputCell.css\";\n\nconst classBase = \"vuuTableInputCell\";\n\nconst WarnCommit = (): Promise<true> => {\n console.warn(\n \"onCommit handler has not been provided to InputCell cell renderer\"\n );\n return Promise.resolve(true);\n};\nexport const InputCell = ({\n column,\n columnMap,\n onCommit = WarnCommit,\n row,\n}: TableCellRendererProps) => {\n const dataIdx = columnMap[column.name];\n const { align = \"left\", clientSideEditValidationCheck } = column;\n\n const { warningMessage, ...editProps } = useEditableText({\n initialValue: row[dataIdx],\n onCommit,\n clientSideEditValidationCheck,\n });\n\n const endAdornment =\n warningMessage && align === \"left\" ? (\n <span className={`${classBase}-icon`} data-icon=\"error\" />\n ) : undefined;\n\n const startAdornment =\n warningMessage && align === \"right\" ? (\n <span className={`${classBase}-icon`} data-icon=\"error\" />\n ) : undefined;\n\n return (\n <Input\n {...editProps}\n className={cx(classBase, {\n [`${classBase}-error`]: warningMessage !== undefined,\n })}\n endAdornment={endAdornment}\n startAdornment={startAdornment}\n />\n );\n};\n\nregisterComponent(\"input-cell\", InputCell, \"cell-renderer\", {});\n", "import {\n ColumnDescriptor,\n TableCellRendererProps,\n} from \"@vuu-ui/vuu-table-types\";\nimport { CycleStateButtonProps, WarnCommit } from \"@vuu-ui/vuu-ui-controls\";\nimport {\n dispatchCustomEvent,\n isTypeDescriptor,\n isValueListRenderer,\n registerComponent,\n} from \"@vuu-ui/vuu-utils\";\nimport cx from \"clsx\";\n\nimport { memo, useCallback } from \"react\";\nimport { dataAndColumnUnchanged } from \"../cell-utils\";\nimport { CycleStateButton } from \"@vuu-ui/vuu-ui-controls\";\n\nimport \"./ToggleCell.css\";\n\nconst classBase = \"vuuTableToggleCell\";\n\nconst getValueList = ({ name, type }: ColumnDescriptor) => {\n if (isTypeDescriptor(type) && isValueListRenderer(type.renderer)) {\n return type.renderer.values;\n } else {\n throw Error(\n `useLookupValues column ${name} has not been configured with a values list`\n );\n }\n};\n\nexport const ToggleCell = memo(function ToggleCell({\n column,\n columnMap,\n onCommit = WarnCommit,\n row,\n}: TableCellRendererProps) {\n const values = getValueList(column);\n const dataIdx = columnMap[column.name];\n const value = row[dataIdx];\n\n const handleCommit = useCallback<CycleStateButtonProps[\"onCommit\"]>(\n (evt, value) => {\n return onCommit(value).then((response) => {\n if (response === true) {\n dispatchCustomEvent(evt.target as HTMLElement, \"vuu-commit\");\n }\n return response;\n });\n },\n [onCommit]\n );\n\n return (\n <CycleStateButton\n className={cx(classBase, `${classBase}-${column.name}`)}\n onCommit={handleCommit}\n value={value}\n values={values}\n variant=\"cta\"\n >\n {value}\n </CycleStateButton>\n );\n},\ndataAndColumnUnchanged);\n\nregisterComponent(\"toggle-cell\", ToggleCell, \"cell-renderer\", {});\n", "import { useStateRef } from \"@vuu-ui/vuu-ui-controls\";\nimport { dispatchMouseEvent } from \"@vuu-ui/vuu-utils\";\nimport { KeyboardEventHandler, useCallback, useRef } from \"react\";\n\nexport const useControlledTableNavigation = (\n initialValue: number,\n rowCount: number\n) => {\n const tableRef = useRef<HTMLDivElement>(null);\n\n const [highlightedIndexRef, setHighlightedIndex] = useStateRef<\n number | undefined\n >(initialValue);\n\n const handleKeyDown = useCallback<KeyboardEventHandler>(\n (e) => {\n if (e.key === \"ArrowDown\") {\n setHighlightedIndex((index = -1) => Math.min(rowCount - 1, index + 1));\n } else if (e.key === \"ArrowUp\") {\n setHighlightedIndex((index = -1) => Math.max(0, index - 1));\n } else if (e.key === \"Enter\" || e.key === \" \") {\n const { current: rowIdx } = highlightedIndexRef;\n // induce an onSelect event by 'clicking' the row\n const rowEl = tableRef.current?.querySelector(\n `[aria-rowindex=\"${rowIdx}\"]`\n ) as HTMLElement;\n if (rowEl) {\n dispatchMouseEvent(rowEl, \"click\");\n }\n }\n },\n [highlightedIndexRef, rowCount, setHighlightedIndex]\n );\n\n const handleHighlight = useCallback(\n (idx: number) => {\n setHighlightedIndex(idx);\n },\n [setHighlightedIndex]\n );\n\n return {\n highlightedIndexRef,\n onHighlight: handleHighlight,\n onKeyDown: handleKeyDown,\n tableRef,\n };\n};\n", "import { dataAndColumnUnchanged } from \"@vuu-ui/vuu-table\";\nimport { ColumnType, TableCellProps } from \"@vuu-ui/vuu-table-types\";\nimport {\n DOWN1,\n DOWN2,\n isTypeDescriptor,\n metadataKeys,\n registerComponent,\n UP1,\n UP2,\n} from \"@vuu-ui/vuu-utils\";\nimport cx from \"clsx\";\nimport { memo } from \"react\";\nimport { useDirection } from \"./useDirection\";\n\nimport \"./BackgroundCell.css\";\nimport \"./BackgroundKeyframes.css\";\n\nconst CHAR_ARROW_UP = String.fromCharCode(11014);\nconst CHAR_ARROW_DOWN = String.fromCharCode(11015);\n\nconst { KEY } = metadataKeys;\n\nconst classBase = \"vuuBackgroundCell\";\n\n// TODO these sre repeated from PriceFormatter - where shoud they live ?\nconst FlashStyle = {\n ArrowOnly: \"arrow\",\n BackgroundOnly: \"bg-only\",\n ArrowBackground: \"arrow-bg\",\n};\n\nconst getFlashStyle = (colType?: ColumnType) => {\n if (isTypeDescriptor(colType) && colType.renderer) {\n if (\"flashStyle\" in colType.renderer) {\n return colType.renderer[\"flashStyle\"];\n }\n }\n return FlashStyle.BackgroundOnly;\n};\n\nexport const BackgroundCell = memo(function BackgroundCell({\n column,\n columnMap,\n row,\n}: TableCellProps) {\n //TODO what about click handling\n\n const { name, type, valueFormatter } = column;\n const dataIdx = columnMap[name];\n const value = row[dataIdx];\n const flashStyle = getFlashStyle(type);\n const direction = useDirection(row[KEY], value, column);\n const arrow =\n flashStyle === FlashStyle.ArrowOnly ||\n flashStyle === FlashStyle.ArrowBackground\n ? direction === UP1 || direction === UP2\n ? CHAR_ARROW_UP\n : direction === DOWN1 || direction === DOWN2\n ? CHAR_ARROW_DOWN\n : null\n : null;\n\n const dirClass = direction ? ` ` + direction : \"\";\n\n const className = cx(classBase, dirClass, {\n [`${classBase}-backgroundOnly`]: flashStyle === FlashStyle.BackgroundOnly,\n [`${classBase}-arrowOnly`]: flashStyle === FlashStyle.ArrowOnly,\n [`${classBase}-arrowBackground`]: flashStyle === FlashStyle.ArrowBackground,\n });\n\n return (\n <div className={className} tabIndex={-1}>\n <div className={`${classBase}-arrow`}>{arrow}</div>\n {valueFormatter(row[dataIdx])}\n </div>\n );\n},\ndataAndColumnUnchanged);\n\nregisterComponent(\n \"vuu.price-move-background\",\n BackgroundCell,\n \"cell-renderer\",\n {\n description: \"Change background color of cell when value changes\",\n configEditor: \"BackgroundCellConfigurationEditor\",\n label: \"Background Flash\",\n serverDataType: [\"long\", \"int\", \"double\"],\n }\n);\n", "import { RuntimeColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport {\n getMovingValueDirection,\n isTypeDescriptor,\n isValidNumber,\n valueChangeDirection,\n} from \"@vuu-ui/vuu-utils\";\nimport { useEffect, useRef } from \"react\";\n\nconst INITIAL_VALUE = [undefined, undefined, undefined, undefined];\n\ntype State = [string, unknown, RuntimeColumnDescriptor, valueChangeDirection];\n\nexport function useDirection(\n key: string,\n value: unknown,\n column: RuntimeColumnDescriptor\n) {\n const ref = useRef<State>();\n const [prevKey, prevValue, prevColumn, prevDirection] =\n ref.current || INITIAL_VALUE;\n\n const { type: dataType } = column;\n const decimals = isTypeDescriptor(dataType)\n ? dataType.formatting?.decimals\n : undefined;\n\n const direction =\n key === prevKey &&\n isValidNumber(value) &&\n isValidNumber(prevValue) &&\n column === prevColumn\n ? getMovingValueDirection(value, prevDirection, prevValue, decimals)\n : \"\";\n\n useEffect(() => {\n ref.current = [key, value, column, direction];\n });\n\n return direction;\n}\n", "import {\n ConfigurationEditorProps,\n registerConfigurationEditor,\n} from \"@vuu-ui/vuu-utils\";\nimport { FormField, FormFieldLabel } from \"@salt-ds/core\";\nimport { Dropdown, SingleSelectionHandler } from \"@vuu-ui/vuu-ui-controls\";\n\nimport \"./BackgroundCellConfigurationEditor.css\";\nimport { useCallback, useState } from \"react\";\nimport type { ColumnDescriptorCustomRenderer } from \"@vuu-ui/vuu-table-types\";\n\nconst classBase = \"vuuBackgroundCellConfiguration\";\n\ntype FlashOption = {\n label: string;\n value: \"arrow\" | \"bg-only\" | \"arrow-bg\";\n};\n\nconst flashOptions: FlashOption[] = [\n { label: \"Background Only\", value: \"bg-only\" },\n { label: \"Background and Arrow\", value: \"arrow-bg\" },\n { label: \"Arrow Only\", value: \"arrow\" },\n];\n\nconst [defaultFlashOption] = flashOptions;\n\nconst valueFromColumn = (column: ColumnDescriptorCustomRenderer) => {\n const { flashStyle } = column.type.renderer;\n return flashOptions.find((o) => o.value === flashStyle) || defaultFlashOption;\n};\n\nexport const BackgroundCellConfigurationEditor = ({\n column,\n onChangeRendering,\n}: ConfigurationEditorProps) => {\n const [flashStyle, setFlashStyle] = useState<FlashOption | null>(\n valueFromColumn(column)\n );\n const handleSelectionChange = useCallback<\n SingleSelectionHandler<FlashOption>\n >(\n (_, flashOption) => {\n setFlashStyle(flashOption);\n const renderProps = column.type.renderer;\n onChangeRendering({\n ...renderProps,\n flashStyle: flashOption?.value ?? defaultFlashOption.value,\n });\n },\n [column.type, onChangeRendering]\n );\n\n return (\n <FormField>\n <FormFieldLabel>Flash Style</FormFieldLabel>\n <Dropdown<FlashOption>\n className={`${classBase}-flashStyle`}\n onSelectionChange={handleSelectionChange}\n selected={flashStyle}\n source={flashOptions}\n width=\"100%\"\n />\n </FormField>\n );\n};\n\nregisterConfigurationEditor(\n \"BackgroundCellConfigurationEditor\",\n BackgroundCellConfigurationEditor\n);\n", "import { useLookupValues } from \"@vuu-ui/vuu-data-react\";\nimport { ListOption, TableCellRendererProps } from \"@vuu-ui/vuu-table-types\";\nimport {\n Dropdown,\n DropdownOpenKey,\n SingleSelectionHandler,\n WarnCommit,\n} from \"@vuu-ui/vuu-ui-controls\";\nimport { dispatchCustomEvent, registerComponent } from \"@vuu-ui/vuu-utils\";\nimport { VuuColumnDataType } from \"@vuu-ui/vuu-protocol-types\";\nimport { memo, useCallback, useState } from \"react\";\nimport { dataAndColumnUnchanged } from \"@vuu-ui/vuu-table\";\n\nimport \"./DropdownCell.css\";\n\nconst classBase = \"vuuTableDropdownCell\";\n\nconst openKeys: DropdownOpenKey[] = [\"Enter\", \" \"];\n\nexport const DropdownCell = memo(function DropdownCell({\n column,\n columnMap,\n onCommit = WarnCommit,\n row,\n}: TableCellRendererProps) {\n const dataIdx = columnMap[column.name];\n\n const { initialValue, values } = useLookupValues(column, row[dataIdx]);\n\n const [value, setValue] = useState<ListOption | null>(null);\n\n const handleSelectionChange = useCallback<SingleSelectionHandler<ListOption>>(\n (evt, selectedOption) => {\n if (selectedOption) {\n setValue(selectedOption);\n onCommit(selectedOption.value as VuuColumnDataType).then((response) => {\n if (response === true && evt) {\n dispatchCustomEvent(evt.target as HTMLElement, \"vuu-commit\");\n }\n });\n }\n },\n [onCommit]\n );\n\n return (\n <Dropdown<ListOption>\n className={classBase}\n onSelectionChange={handleSelectionChange}\n openKeys={openKeys}\n selected={value ?? initialValue}\n source={values}\n width={column.width - 17} // temp hack\n />\n );\n},\ndataAndColumnUnchanged);\n\nregisterComponent(\"dropdown-cell\", DropdownCell, \"cell-renderer\", {});\n", "import { useLookupValues } from \"@vuu-ui/vuu-data-react\";\nimport { TableCellRendererProps } from \"@vuu-ui/vuu-table-types\";\nimport { registerComponent } from \"@vuu-ui/vuu-utils\";\nimport { memo } from \"react\";\nimport { dataAndColumnUnchanged } from \"@vuu-ui/vuu-table/src/cell-renderers/cell-utils\";\n\n// const classBase = \"vuuTableLookupCell\";\n\nexport const LookupCell = memo(function LookupCell({\n column,\n columnMap,\n row,\n}: TableCellRendererProps) {\n const dataIdx = columnMap[column.name];\n const { initialValue: value } = useLookupValues(column, row[dataIdx]);\n return <span>{value?.label}</span>;\n},\ndataAndColumnUnchanged);\n\nregisterComponent(\"lookup-cell\", LookupCell, \"cell-renderer\", {});\n", "import { TableCellProps } from \"@vuu-ui/vuu-table-types\";\nimport {\n isColumnTypeRenderer,\n isTypeDescriptor,\n isValidNumber,\n registerComponent,\n} from \"@vuu-ui/vuu-utils\";\nimport cx from \"clsx\";\nimport { CSSProperties } from \"react\";\n\nimport \"./ProgressCell.css\";\n\nconst classBase = \"vuuProgressCell\";\n\nconst ProgressCell = ({ column, columnMap, row }: TableCellProps) => {\n //TODO what about click handling\n\n const { type } = column;\n const value = row[column.key];\n let showProgress = false;\n let percentage = 0;\n\n if (isTypeDescriptor(type) && isColumnTypeRenderer(type.renderer)) {\n const { associatedField } = type.renderer;\n if (associatedField) {\n const associatedValue = row[columnMap[associatedField]];\n if (typeof isValidNumber(value) && isValidNumber(associatedValue)) {\n percentage = Math.min(Math.round((value / associatedValue) * 100), 100);\n percentage = Math.min(Math.round((value / associatedValue) * 100), 100);\n showProgress = isFinite(percentage);\n } else {\n // Temp workaround for bug on server that sends aggregated values as strings\n const floatValue = parseFloat(value as string);\n if (Number.isFinite(floatValue)) {\n const floatOtherValue = parseFloat(associatedValue as string);\n if (Number.isFinite(floatOtherValue)) {\n percentage = Math.min(\n Math.round((floatValue / floatOtherValue) * 100),\n 100\n );\n showProgress = isFinite(percentage);\n }\n }\n }\n } else {\n throw Error(\"ProgressCell associatedField is required to render\");\n }\n }\n\n const className = cx(classBase, {});\n\n return (\n <div className={className} tabIndex={-1}>\n {showProgress ? (\n <span className={`${classBase}-track`}>\n <span className={`${classBase}-bg`} />\n <span\n className={`${classBase}-bar`}\n style={\n { \"--progress-bar-pct\": `-${100 - percentage}%` } as CSSProperties\n }\n />\n </span>\n ) : null}\n <span className={`${classBase}-text`}>{`${percentage} %`}</span>\n </div>\n );\n};\n\nregisterComponent(\"vuu.progress\", ProgressCell, \"cell-renderer\", {\n description: \"Progress formatter\",\n label: \"Progress formatter\",\n serverDataType: [\"long\", \"int\", \"double\"],\n});\n", "import { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport {\n List,\n ListItem,\n ListItemProps,\n ListProps,\n} from \"@vuu-ui/vuu-ui-controls\";\nimport { Checkbox, Switch } from \"@salt-ds/core\";\nimport cx from \"clsx\";\nimport {\n HTMLAttributes,\n MouseEventHandler,\n SyntheticEvent,\n useCallback,\n} from \"react\";\nimport { ColumnItem } from \"../table-settings\";\nimport { getColumnLabel } from \"@vuu-ui/vuu-utils\";\n\nimport \"./ColumnList.css\";\n\nconst classBase = \"vuuColumnList\";\nconst classBaseListItem = \"vuuColumnListItem\";\n\nexport type ColumnChangeHandler = (\n columnName: string,\n propertyName: keyof ColumnDescriptor | \"subscribed\",\n value: string | number | boolean\n) => void;\n\nexport interface ColumnListProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n columnItems: ColumnItem[];\n onChange: ColumnChangeHandler;\n onMoveListItem: ListProps[\"onMoveListItem\"];\n onNavigateToColumn?: (columnName: string) => void;\n}\n\nconst ColumnListItem = ({\n className: classNameProp,\n item,\n ...listItemProps\n}: ListItemProps<ColumnItem>) => {\n return (\n <ListItem\n {...listItemProps}\n className={cx(classNameProp, classBaseListItem)}\n data-name={item?.name}\n >\n <span className={`${classBase}-icon`} data-icon=\"draggable\" />\n {item?.isCalculated ? (\n <span className={`${classBase}-icon`} data-icon=\"function\" />\n ) : (\n <Switch className={`${classBase}-switch`} checked={item?.subscribed} />\n )}\n <span className={`${classBase}-text`}>\n {getColumnLabel(item as ColumnDescriptor)}\n </span>\n <Checkbox\n className={`${classBase}-checkBox`}\n checked={item?.hidden !== true}\n disabled={item?.subscribed !== true}\n />\n </ListItem>\n );\n};\n\nexport const ColumnList = ({\n columnItems,\n onChange,\n onMoveListItem,\n onNavigateToColumn,\n ...htmlAttributes\n}: ColumnListProps) => {\n const handleChange = useCallback(\n (evt: SyntheticEvent) => {\n const input = evt.target as HTMLInputElement;\n const listItem = input.closest(`.${classBaseListItem}`) as HTMLElement;\n const {\n dataset: { name },\n } = listItem;\n if (name) {\n const saltSwitch = input.closest(`.${classBase}-switch`) as HTMLElement;\n const saltCheckbox = input.closest(\n `.${classBase}-checkBox`\n ) as HTMLElement;\n\n if (saltSwitch) {\n onChange(name, \"subscribed\", input.checked);\n } else if (saltCheckbox) {\n onChange(name, \"hidden\", input.checked === false);\n }\n }\n },\n [onChange]\n );\n\n const handleClick = useCallback<MouseEventHandler>((evt) => {\n const targetEl = evt.target as HTMLElement;\n if (targetEl.classList.contains(\"vuuColumnList-text\")) {\n const listItemEl = targetEl.closest(\".vuuListItem\") as HTMLElement;\n if (listItemEl?.dataset.name) {\n onNavigateToColumn?.(listItemEl.dataset.name);\n }\n }\n }, []);\n\n return (\n <div {...htmlAttributes} className={classBase}>\n <div className={`${classBase}-header`}>\n <span>Column Selection</span>\n </div>\n <div className={`${classBase}-colHeadings`}>\n <span>Column subscription</span>\n <span>Visibility</span>\n </div>\n <List<ColumnItem, \"none\">\n ListItem={ColumnListItem}\n allowDragDrop\n height=\"auto\"\n onChange={handleChange}\n onClick={handleClick}\n onMoveListItem={onMoveListItem}\n selectionStrategy=\"none\"\n source={columnItems}\n itemHeight={33}\n />\n </div>\n );\n};\n", "import { ColumnDescriptor, ColumnSettingsProps } from \"@vuu-ui/vuu-table-types\";\nimport { VuuInput } from \"@vuu-ui/vuu-ui-controls\";\nimport {\n getCalculatedColumnName,\n getDefaultAlignment,\n isCalculatedColumn,\n} from \"@vuu-ui/vuu-utils\";\nimport {\n Button,\n FormField,\n FormFieldLabel,\n ToggleButton,\n ToggleButtonGroup,\n} from \"@salt-ds/core\";\nimport cx from \"clsx\";\nimport { ColumnExpressionPanel } from \"../column-expression-panel\";\nimport { ColumnFormattingPanel } from \"../column-formatting-settings\";\nimport { ColumnNameLabel } from \"./ColumnNameLabel\";\nimport { useColumnSettings } from \"./useColumnSettings\";\n\nimport \"./ColumnSettingsPanel.css\";\n\nconst classBase = \"vuuColumnSettingsPanel\";\n\nconst getColumnLabel = (column: ColumnDescriptor) => {\n const { name, label } = column;\n if (isCalculatedColumn(name)) {\n return label ?? getCalculatedColumnName(column);\n } else {\n return label ?? name;\n }\n};\n\nexport const ColumnSettingsPanel = ({\n column: columnProp,\n onCancelCreateColumn,\n onConfigChange,\n onCreateCalculatedColumn,\n tableConfig,\n vuuTable,\n}: ColumnSettingsProps) => {\n const isNewCalculatedColumn = columnProp.name === \"::\";\n const {\n availableRenderers,\n editCalculatedColumn,\n column,\n navigateNextColumn,\n navigatePrevColumn,\n onCancel,\n onChange,\n onChangeCalculatedColumnName,\n onChangeFormatting,\n onChangeRendering,\n onChangeType,\n onEditCalculatedColumn,\n onInputCommit,\n onSave,\n } = useColumnSettings({\n column: columnProp,\n onCancelCreateColumn,\n onConfigChange,\n onCreateCalculatedColumn,\n tableConfig,\n });\n\n const {\n serverDataType,\n align = getDefaultAlignment(serverDataType),\n pin,\n width,\n } = column;\n\n return (\n <div\n className={cx(classBase, {\n [`${classBase}-editing`]: editCalculatedColumn,\n })}\n >\n <div className={`${classBase}-header`}>\n <ColumnNameLabel column={column} onClick={onEditCalculatedColumn} />\n </div>\n\n {editCalculatedColumn ? (\n <ColumnExpressionPanel\n column={column}\n onChangeName={onChangeCalculatedColumnName}\n tableConfig={tableConfig}\n vuuTable={vuuTable}\n />\n ) : null}\n\n <FormField data-field=\"column-label\">\n <FormFieldLabel>Column Label</FormFieldLabel>\n <VuuInput\n className=\"vuuInput\"\n onChange={onChange}\n onCommit={onInputCommit}\n value={getColumnLabel(column)}\n />\n </FormField>\n\n <FormField data-field=\"column-width\">\n <FormFieldLabel>Column Width</FormFieldLabel>\n <VuuInput\n className=\"vuuInput\"\n onChange={onChange}\n value={width}\n onCommit={onInputCommit}\n />\n </FormField>\n <FormField data-field=\"column-alignment\">\n <FormFieldLabel>Alignment</FormFieldLabel>\n <ToggleButtonGroup\n className=\"vuuToggleButtonGroup\"\n onChange={onChange}\n value={align}\n >\n <ToggleButton\n data-icon=\"align-left\"\n className=\"vuuIconToggleButton\"\n value=\"left\"\n />\n <ToggleButton\n data-icon=\"align-right\"\n className=\"vuuIconToggleButton\"\n value=\"right\"\n />\n </ToggleButtonGroup>\n </FormField>\n <FormField data-field=\"column-pin\">\n <FormFieldLabel>Pin Column</FormFieldLabel>\n <ToggleButtonGroup\n className=\"vuuToggleButtonGroup\"\n onChange={onChange}\n value={pin ?? \"\"}\n >\n <ToggleButton\n className=\"vuuIconToggleButton\"\n data-icon=\"cross-circle\"\n value=\"\"\n />\n <ToggleButton\n className=\"vuuIconToggleButton\"\n data-icon=\"pin-left\"\n value=\"left\"\n />\n <ToggleButton\n className=\"vuuIconToggleButton\"\n data-icon=\"pin-float\"\n value=\"floating\"\n />\n <ToggleButton\n className=\"vuuIconToggleButton\"\n data-icon=\"pin-right\"\n value=\"right\"\n />\n </ToggleButtonGroup>\n </FormField>\n <ColumnFormattingPanel\n availableRenderers={availableRenderers}\n column={column}\n onChangeFormatting={onChangeFormatting}\n onChangeRendering={onChangeRendering}\n onChangeType={onChangeType}\n />\n\n {editCalculatedColumn ? (\n <div className=\"vuuColumnSettingsPanel-buttonBar\" data-align=\"right\">\n <Button\n className={`${classBase}-buttonCancel`}\n onClick={onCancel}\n tabIndex={-1}\n >\n cancel\n </Button>\n <Button\n className={`${classBase}-buttonSave`}\n onClick={onSave}\n variant=\"cta\"\n >\n save\n </Button>\n </div>\n ) : (\n <div\n className={`${classBase}-buttonBar`}\n data-align={isNewCalculatedColumn ? \"right\" : undefined}\n >\n <Button\n className={`${classBase}-buttonNavPrev`}\n variant=\"secondary\"\n data-icon=\"arrow-left\"\n onClick={navigatePrevColumn}\n >\n PREVIOUS\n </Button>\n <Button\n className={`${classBase}-buttonNavNext`}\n variant=\"secondary\"\n data-icon=\"arrow-right\"\n onClick={navigateNextColumn}\n >\n NEXT\n </Button>\n </div>\n )}\n </div>\n );\n};\n", "import { ColumnDescriptor, ColumnSettingsProps } from \"@vuu-ui/vuu-table-types\";\nimport { Dropdown } from \"@vuu-ui/vuu-ui-controls\";\nimport {\n getCalculatedColumnExpression,\n getCalculatedColumnName,\n getCalculatedColumnType,\n} from \"@vuu-ui/vuu-utils\";\nimport { FormField, FormFieldLabel, Input } from \"@salt-ds/core\";\nimport { HTMLAttributes, useCallback, useRef } from \"react\";\nimport {\n ColumnExpressionInput,\n ColumnExpressionSubmitHandler,\n useColumnExpressionSuggestionProvider,\n} from \"../column-expression-input\";\nimport { useColumnExpression } from \"./useColumnExpression\";\n\nconst classBase = \"vuuColumnExpressionPanel\";\n\nexport interface ColumnExpressionPanelProps\n extends HTMLAttributes<HTMLDivElement>,\n Pick<ColumnSettingsProps, \"tableConfig\" | \"vuuTable\"> {\n column: ColumnDescriptor;\n /**\n * Callback prop, invoked on every change to calculated column definition\n * @param calculatedColumnName the full calculated column name\n */\n onChangeName?: (name: string) => void;\n}\n\nexport const ColumnExpressionPanel = ({\n column: columnProp,\n onChangeName: onChangeNameProp,\n tableConfig,\n vuuTable,\n}: ColumnExpressionPanelProps) => {\n const typeRef = useRef<HTMLDivElement>(null);\n const { column, onChangeExpression, onChangeName, onChangeType } =\n useColumnExpression({\n column: columnProp,\n onChangeName: onChangeNameProp,\n });\n // The initial value to pass into the Expression Input. That is a\n // CodeMirror editor and will manage its own state once initialised.\n const initialExpressionRef = useRef<string>(\n getCalculatedColumnExpression(column)\n );\n\n const suggestionProvider = useColumnExpressionSuggestionProvider({\n columns: tableConfig.columns,\n table: vuuTable,\n });\n\n const handleSubmitExpression =\n useCallback<ColumnExpressionSubmitHandler>(() => {\n if (typeRef.current) {\n (\n typeRef.current?.querySelector(\"button\") as HTMLButtonElement\n )?.focus();\n }\n }, []);\n\n return (\n <div className={classBase}>\n <div className=\"vuuColumnSettingsPanel-header\">\n <span>Calculation</span>\n </div>\n\n <FormField data-field=\"column-name\">\n <FormFieldLabel>Column Name</FormFieldLabel>\n <Input\n className=\"vuuInput\"\n onChange={onChangeName}\n value={getCalculatedColumnName(column)}\n />\n </FormField>\n\n <FormField data-field=\"column-expression\">\n <FormFieldLabel>Expression</FormFieldLabel>\n <ColumnExpressionInput\n onChange={onChangeExpression}\n onSubmitExpression={handleSubmitExpression}\n source={initialExpressionRef.current}\n suggestionProvider={suggestionProvider}\n />\n </FormField>\n <FormField data-field=\"type\">\n <FormFieldLabel>Column type</FormFieldLabel>\n <Dropdown\n className={`${classBase}-type`}\n onSelectionChange={onChangeType}\n ref={typeRef}\n selected={getCalculatedColumnType(column) || null}\n source={[\"double\", \"long\", \"string\"]}\n width=\"100%\"\n />\n </FormField>\n </div>\n );\n};\n", "import { HTMLAttributes, memo } from \"react\";\nimport { ColumnDefinitionExpression } from \"./column-language-parser\";\nimport {\n ExpressionSuggestionConsumer,\n useColumnExpressionEditor,\n} from \"./useColumnExpressionEditor\";\n\nimport \"./ColumnExpressionInput.css\";\n\nconst classBase = \"vuuColumnExpressionInput\";\n\nexport type ColumnExpressionSubmitHandler = (\n source: string,\n expression: ColumnDefinitionExpression | undefined\n) => void;\n\nexport interface ColumnExpressionInputProps\n extends ExpressionSuggestionConsumer,\n Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n onChange?: (source: string) => void;\n onSubmitExpression?: ColumnExpressionSubmitHandler;\n source?: string;\n}\n\nexport const ColumnExpressionInput = memo(\n ({\n onChange,\n onSubmitExpression,\n source = \"\",\n suggestionProvider,\n }: ColumnExpressionInputProps) => {\n const { editorRef, onBlur } = useColumnExpressionEditor({\n onChange,\n onSubmitExpression,\n source,\n suggestionProvider,\n });\n\n return <div className={`${classBase}`} onBlur={onBlur} ref={editorRef} />;\n },\n (prevProps, newProps) => {\n return prevProps.source === newProps.source;\n }\n);\nColumnExpressionInput.displayName = \"ColumnExpressionInput\";\n", "import {\n autocompletion,\n Completion,\n defaultKeymap,\n EditorState,\n EditorView,\n ensureSyntaxTree,\n keymap,\n minimalSetup,\n startCompletion,\n} from \"@vuu-ui/vuu-codemirror\";\nimport { createEl } from \"@vuu-ui/vuu-utils\";\nimport {\n FocusEventHandler,\n MutableRefObject,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { columnExpressionLanguageSupport } from \"./column-language-parser\";\nimport {\n ColumnDefinitionExpression,\n walkTree,\n} from \"./column-language-parser/ColumnExpressionTreeWalker\";\nimport { ColumnExpressionInputProps } from \"./ColumnExpressionInput\";\nimport { vuuHighlighting } from \"./highlighting\";\nimport { vuuTheme } from \"./theme\";\nimport {\n ApplyCompletion,\n useColumnAutoComplete,\n} from \"./useColumnAutoComplete\";\n\nexport type ColumnExpressionOperator = \"Times\" | \"Divide\" | \"Minus\" | \"Plus\";\n\nexport type ColumnExpressionSuggestionType =\n | \"column\"\n | \"columnValue\"\n | \"expression\"\n | \"condition-operator\"\n | \"operator\"\n | \"relational-operator\";\n\nexport type ColumnExpressionSuggestionOptions = {\n columnName?: string;\n functionName?: string;\n operator?: ColumnExpressionOperator;\n prefix?: string;\n startsWith?: string;\n selection?: string[];\n};\n\n// TODO move this somewhere neutral\nexport interface IExpressionSuggestionProvider {\n getSuggestions: (\n valueType: ColumnExpressionSuggestionType,\n options?: ColumnExpressionSuggestionOptions\n ) => Promise<Completion[]>;\n isPartialMatch: (\n valueType: ColumnExpressionSuggestionType,\n columnName?: string,\n text?: string | undefined\n ) => Promise<boolean>;\n}\n\nexport interface ExpressionSuggestionConsumer {\n suggestionProvider: IExpressionSuggestionProvider;\n}\n\nconst getView = (ref: MutableRefObject<EditorView | undefined>): EditorView => {\n if (ref.current == undefined) {\n throw Error(\"EditorView not defined\");\n }\n return ref.current;\n};\n\nconst getOptionClass = (/*completion: Completion*/) => {\n return \"vuuSuggestion\";\n};\n\nconst noop = () => console.log(\"noooop\");\n\nconst hasExpressionType = (\n completion: Completion\n): completion is Completion & { expressionType: string } =>\n \"expressionType\" in completion;\n\nconst injectOptionContent = (\n completion: Completion /*, state: EditorState*/\n) => {\n if (hasExpressionType(completion)) {\n const div = createEl(\"div\", \"expression-type-container\");\n const span = createEl(\"span\", \"expression-type\", completion.expressionType);\n div.appendChild(span);\n return div;\n } else {\n return null;\n }\n};\n\nexport const useColumnExpressionEditor = ({\n onChange,\n onSubmitExpression,\n source,\n suggestionProvider,\n}: ColumnExpressionInputProps) => {\n const editorRef = useRef<HTMLDivElement>(null);\n const onSubmitRef = useRef<ApplyCompletion>(noop);\n const viewRef = useRef<EditorView>();\n const completionFn = useColumnAutoComplete(suggestionProvider, onSubmitRef);\n\n const [createState, clearInput, submit] = useMemo(() => {\n const parseExpression = ():\n | [string, ColumnDefinitionExpression]\n | [\"\", undefined] => {\n const view = getView(viewRef);\n const source = view.state.doc.toString();\n const tree = ensureSyntaxTree(view.state, view.state.doc.length, 5000);\n if (tree) {\n const expression = walkTree(tree, source);\n return [source, expression];\n } else {\n return [\"\", undefined];\n }\n };\n\n const clearInput = () => {\n getView(viewRef).setState(createState());\n };\n\n const submitExpression = () => {\n const [source, expression] = parseExpression();\n onSubmitExpression?.(source, expression);\n };\n\n const showSuggestions = (key: string) => {\n return keymap.of([\n {\n key,\n run() {\n startCompletion(getView(viewRef));\n return true;\n },\n },\n ]);\n };\n\n const createState = (): EditorState =>\n EditorState.create({\n doc: source,\n extensions: [\n minimalSetup,\n autocompletion({\n addToOptions: [\n {\n render: injectOptionContent,\n position: 70,\n },\n ],\n override: [completionFn],\n optionClass: getOptionClass,\n }),\n columnExpressionLanguageSupport(),\n keymap.of(defaultKeymap),\n showSuggestions(\"ArrowDown\"),\n EditorView.updateListener.of((v) => {\n const view = getView(viewRef);\n if (v.docChanged) {\n startCompletion(view);\n const source = view.state.doc.toString();\n onChange?.(source);\n }\n }),\n // Enforces single line view\n EditorState.transactionFilter.of((tr) =>\n tr.newDoc.lines > 1 ? [] : tr\n ),\n vuuTheme,\n vuuHighlighting,\n ],\n });\n\n onSubmitRef.current = () => {\n submitExpression();\n };\n\n return [createState, clearInput, submitExpression];\n }, [completionFn, onChange, onSubmitExpression, source]);\n\n useEffect(() => {\n if (!editorRef.current) {\n throw Error(\"editor not in dom\");\n }\n\n viewRef.current = new EditorView({\n state: createState(),\n parent: editorRef.current,\n });\n\n return () => {\n viewRef.current?.destroy();\n };\n }, [completionFn, createState]);\n\n const handleBlur = useCallback<FocusEventHandler>(() => {\n submit();\n }, [submit]);\n\n return { editorRef, clearInput, onBlur: handleBlur };\n};\n", "import {\n LanguageSupport,\n LRLanguage,\n styleTags,\n tags as tag,\n} from \"@vuu-ui/vuu-codemirror\";\nimport { parser } from \"./generated/column-parser\";\n\nconst columnExpressionLanguage = LRLanguage.define({\n name: \"VuuColumnExpression\",\n parser: parser.configure({\n props: [\n styleTags({\n Column: tag.attributeValue,\n Function: tag.variableName,\n String: tag.string,\n Or: tag.emphasis,\n Operator: tag.operator,\n }),\n ],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n }) as any,\n});\n\nexport const columnExpressionLanguageSupport = () => {\n return new LanguageSupport(\n columnExpressionLanguage /*, [exampleCompletion]*/\n );\n};\n", "// This file was generated by lezer-generator. You probably shouldn't edit it.\nimport {LRParser} from \"@lezer/lr\"\nexport const parser = LRParser.deserialize({\n version: 14,\n states: \"&xOVQPOOO!fQPO'#C^OVQPO'#CcQ!pQPOOO#bQPO'#CkO#gQPO'#CrOOQO'#Cy'#CyO#lQPO,58}OVQPO,59QOVQPO,59QOOQO'#Cn'#CnOVQPO,59XOVQPO,59VOVQPO'#CtOOQO,59^,59^OOQO1G.i1G.iOOQO1G.l1G.lO$bQPO1G.lO%ZQPO1G.sO!pQPO'#CmO%qQQO1G.qO%|QQO'#C{OOQO'#C{'#C{O&wQPO,59`OVQPO,59ZOVQPO,59[OVQPO7+$]OVQPO'#CuO'RQPO1G.zOOQO1G.z1G.zO'ZQQO'#C^O'eQQO1G.sO'{QQO1G.uOOQO1G.v1G.vO(WQPO<<GwO(_QPO,59aOOQO-E6s-E6sOOQO7+$f7+$fOVQPOAN=cO(iQQO1G.lO(yQPOG22}OOQOLD(iLD(iO)QQPO,59QO)QQPO,59QO)QQPO,59X\",\n stateData: \")n~OlOS~ORUOSUOTUOUUOWQO`SOnPO~OWgXZQX[QX]QX^QXpQXqQXrQXsQXtQXuQXeQX~OjQXXQX~PnOZWO[WO]XO^XOpYOqYOrYOsYOtYOuYO~OW[O~OW]O~OX_O~P!pO]Yi^YipYiqYirYisYitYiuYieYi~OZWO[WOjYiXYi~P#sOpaiqairaisaitaiuaieai~OZWO[WO]XO^XOjaiXai~P$rOejOvhOwiO~OZmX[mX]mX^mXeoXpmXqmXrmXsmXtmXumXvoXwoX~OXmOekO~P!pOXuOekO~OvQXwQX~PnOZzO[zO]{O^{Ovaiwai~P$rOwiOecivci~OevO~P!pOXiaeia~P!pOZzO[zOvYiwYi~P#sOXyO~P!pORUOSUOTUOUUOWQO`SOnnO~O`UTn~\",\n goto: \"$epPPqPPPPqPPqPPPPqP!S!g!r!rPq!w#Y#]PPP#cP$[oUOQWXZ[]hijkvz{|hUOQWXZ]jkvz{|Ve[hi[ZRVgrsxR|cVf[hioTOQWXZ[]hijkvz{|R^TQlgRtlQROQVQS`WzQaXQbZUc[hiQg]Qo|QrjQskQw{RxvQd[QphRqi\",\n nodeNames: \"\u26A0 ColumnDefinitionExpression Column Number String True False ParenthesizedExpression OpenBrace CloseBrace ArithmeticExpression Divide Times Plus Minus ConditionalExpression If RelationalExpression RelationalOperator AndCondition OrCondition Comma CallExpression Function ArgList\",\n maxTerm: 39,\n skippedNodes: [0],\n repeatNodeCount: 1,\n tokenData: \".^~RnXY#PYZ#P]^#Ppq#Pqr#brs#mxy$eyz$jz{$o{|$t|}$y}!O%O!O!P%T!P!Q%c!Q![%h!^!_%s!_!`&Q!`!a&V!c!}&d#R#S&d#T#U&u#U#Y&d#Y#Z(Y#Z#]&d#]#^*j#^#c&d#c#d+f#d#h&d#h#i,b#i#o&d~#USl~XY#PYZ#P]^#Ppq#P~#eP!_!`#h~#mOu~~#pWOX#mZ]#m^r#mrs$Ys#O#m#P;'S#m;'S;=`$_<%lO#m~$_OS~~$bP;=`<%l#m~$jOW~~$oOX~~$tO[~~$yO]~~%OOe~~%TO^~~%WP!Q![%Z~%`PR~!Q![%Z~%hOZ~~%mQR~!O!P%Z!Q![%h~%xPr~!_!`%{~&QOt~~&VOp~~&[Pq~!_!`&_~&dOs~P&iSnP!Q![&d!c!}&d#R#S&d#T#o&dR&zUnP!Q![&d!c!}&d#R#S&d#T#b&d#b#c'^#c#o&dR'cUnP!Q![&d!c!}&d#R#S&d#T#W&d#W#X'u#X#o&dR'|SvQnP!Q![&d!c!}&d#R#S&d#T#o&d~(_TnP!Q![&d!c!}&d#R#S&d#T#U(n#U#o&d~(sUnP!Q![&d!c!}&d#R#S&d#T#`&d#`#a)V#a#o&d~)[UnP!Q![&d!c!}&d#R#S&d#T#g&d#g#h)n#h#o&d~)sUnP!Q![&d!c!}&d#R#S&d#T#X&d#X#Y*V#Y#o&d~*^SU~nP!Q![&d!c!}&d#R#S&d#T#o&d~*oUnP!Q![&d!c!}&d#R#S&d#T#Y&d#Y#Z+R#Z#o&d~+YS`~nP!Q![&d!c!}&d#R#S&d#T#o&dR+kUnP!Q![&d!c!}&d#R#S&d#T#f&d#f#g+}#g#o&dR,USwQnP!Q![&d!c!}&d#R#S&d#T#o&d~,gUnP!Q![&d!c!}&d#R#S&d#T#f&d#f#g,y#g#o&d~-OUnP!Q![&d!c!}&d#R#S&d#T#i&d#i#j-b#j#o&d~-gUnP!Q![&d!c!}&d#R#S&d#T#X&d#X#Y-y#Y#o&d~.QST~nP!Q![&d!c!}&d#R#S&d#T#o&d\",\n tokenizers: [0, 1],\n topRules: {\"ColumnDefinitionExpression\":[0,1]},\n tokenPrec: 393\n})\n", "import { Tree } from \"@vuu-ui/vuu-codemirror\";\nimport { RelationalExpression } from \"./generated/column-parser.terms\";\ntype expressionType =\n | \"arithmeticExpression\"\n | \"booleanCondition\"\n | \"booleanLiteralExpression\"\n | \"callExpression\"\n | \"colExpression\"\n | \"conditionalExpression\"\n | \"numericLiteralExpression\"\n | \"relationalExpression\"\n | \"stringLiteralExpression\"\n | \"unknown\";\n\ntype arithmeticOp = \"*\" | \"/\" | \"+\" | \"-\" | \"unknown\";\ntype booleanOp = \"and\" | \"or\";\ntype relationalOp = \"=\" | \"!=\" | \">\" | \">=\" | \"<\" | \"<=\" | \"unknown\";\n\nexport interface Expression {\n type: expressionType;\n expressions?: Expression[];\n toJSON?: () => unknown;\n value?: string | number | boolean;\n}\n\ninterface UnknownExpression extends Expression {\n type: \"unknown\";\n}\n\ninterface BooleanLiteralExpression {\n type: \"booleanLiteralExpression\";\n value: boolean;\n}\n\ninterface NumericLiteralExpression {\n type: \"numericLiteralExpression\";\n value: number;\n}\ninterface StringLiteralExpression {\n type: \"stringLiteralExpression\";\n value: string;\n}\n\ninterface ArithmeticExpression extends Expression {\n expressions: [Expression, Expression];\n op: arithmeticOp;\n type: \"arithmeticExpression\";\n}\n\ninterface BooleanCondition extends Expression {\n expressions: Expression[];\n op: booleanOp;\n type: \"booleanCondition\";\n}\ninterface RelationalExpression extends Expression {\n expressions: Expression[];\n op: relationalOp;\n type: \"relationalExpression\";\n}\n\ninterface ColExpression extends Expression {\n column?: string;\n type: \"colExpression\";\n}\n\ninterface CallExpression extends Expression {\n arguments: Expression[];\n functionName?: string;\n type: \"callExpression\";\n}\n\ntype ConditionExpression = RelationalExpression | BooleanCondition;\n\ninterface ConditionalExpression extends Expression {\n type: \"conditionalExpression\";\n condition: ConditionExpression;\n truthyExpression: Expression;\n falsyExpression: Expression;\n}\n\nexport type ColumnDefinitionExpression =\n | ArithmeticExpression\n | BooleanLiteralExpression\n | CallExpression\n | ColExpression\n | ConditionalExpression\n | NumericLiteralExpression\n | StringLiteralExpression;\n\nclass LiteralExpressionImpl implements Expression {\n type:\n | \"booleanLiteralExpression\"\n | \"numericLiteralExpression\"\n | \"stringLiteralExpression\";\n value: boolean | number | string;\n constructor(value: boolean | number | string) {\n this.value = value;\n switch (typeof value) {\n case \"boolean\":\n this.type = \"booleanLiteralExpression\";\n break;\n case \"number\":\n this.type = \"numericLiteralExpression\";\n break;\n default:\n this.type = \"stringLiteralExpression\";\n }\n }\n toJSON() {\n return {\n type: this.type,\n value: this.value,\n } as\n | StringLiteralExpression\n | BooleanLiteralExpression\n | NumericLiteralExpression;\n }\n}\nclass ColumnExpressionImpl implements ColExpression {\n type = \"colExpression\" as const;\n column: string;\n constructor(columnName: string) {\n this.column = columnName;\n }\n toJSON() {\n return {\n type: this.type,\n column: this.column,\n } as ColExpression;\n }\n}\nclass ArithmeticExpressionImpl implements ArithmeticExpression {\n #expressions: [Expression, Expression] = [\n { type: \"unknown\" },\n { type: \"unknown\" },\n ];\n #op: arithmeticOp | \"unknown\";\n type = \"arithmeticExpression\" as const;\n constructor(op: arithmeticOp | \"unknown\" = \"unknown\") {\n this.#op = op;\n }\n get op() {\n return this.#op;\n }\n set op(op: arithmeticOp) {\n this.#op = op;\n }\n get expressions() {\n return this.#expressions;\n }\n\n toJSON() {\n return {\n type: this.type,\n op: this.#op,\n expressions: this.#expressions,\n };\n }\n}\n\nclass CallExpressionImpl implements CallExpression {\n #expressions: Expression[] = [];\n functionName: string;\n type = \"callExpression\" as const;\n constructor(functionName: string) {\n this.functionName = functionName;\n }\n\n get expressions() {\n return this.#expressions;\n }\n get arguments() {\n return this.#expressions;\n }\n\n toJSON() {\n return {\n type: this.type,\n functionName: this.functionName,\n arguments: this.#expressions.map((e) => e.toJSON?.()),\n } as CallExpression;\n }\n}\n\nclass RelationalExpressionImpl implements RelationalExpression {\n #expressions: [Expression, Expression] = [\n { type: \"unknown\" },\n { type: \"unknown\" },\n ];\n #op: relationalOp = \"unknown\";\n type = \"relationalExpression\" as const;\n\n get op() {\n return this.#op;\n }\n set op(op: relationalOp) {\n this.#op = op;\n }\n get expressions() {\n return this.#expressions;\n }\n\n toJSON() {\n return {\n type: this.type,\n op: this.#op,\n expressions: this.#expressions,\n } as RelationalExpression;\n }\n}\n\nclass BooleanConditionImp implements BooleanCondition {\n #expressions: [Expression, Expression] = [\n { type: \"unknown\" },\n { type: \"unknown\" },\n ];\n #op: \"and\" | \"or\";\n type = \"booleanCondition\" as const;\n constructor(booleanOperator: \"and\" | \"or\") {\n this.#op = booleanOperator;\n }\n get op() {\n return this.#op;\n }\n get expressions() {\n return this.#expressions;\n }\n toJSON() {\n return {\n type: this.type,\n op: this.#op,\n expressions: this.#expressions.map((e) => e.toJSON?.()),\n };\n }\n}\n\nclass ConditionalExpressionImpl implements ConditionalExpression {\n #expressions: [ConditionExpression, Expression, Expression];\n type = \"conditionalExpression\" as const;\n\n constructor(booleanOperator?: \"and\" | \"or\") {\n this.#expressions = [\n booleanOperator\n ? new BooleanConditionImp(booleanOperator)\n : new RelationalExpressionImpl(),\n { type: \"unknown\" },\n { type: \"unknown\" },\n ];\n }\n\n get expressions() {\n return this.#expressions;\n }\n\n get condition(): ConditionExpression {\n return this.#expressions[0];\n }\n get truthyExpression(): Expression {\n return this.#expressions[1];\n }\n set truthyExpression(expression: Expression) {\n this.#expressions[1] = expression;\n }\n get falsyExpression(): Expression {\n return this.#expressions[2];\n }\n set falsyExpression(expression: Expression) {\n this.#expressions[2] = expression;\n }\n\n toJSON() {\n return {\n type: this.type,\n condition: this.condition.toJSON?.(),\n truthyExpression: this.truthyExpression,\n falsyExpression: this.falsyExpression?.toJSON?.() ?? this.falsyExpression,\n };\n }\n}\n\ntype PartialExpression =\n | ArithmeticExpression\n | RelationalExpression\n | ColExpression\n | CallExpression\n | BooleanCondition\n | Partial<ConditionalExpression>;\n\nconst isUnknown = (e: Expression): e is UnknownExpression =>\n e.type === \"unknown\";\n\nconst isArithmeticExpression = (\n expression: PotentiallyUnresolvedExpression\n): expression is ArithmeticExpression =>\n expression.type === \"arithmeticExpression\";\n\nconst isCallExpression = (\n expression: PotentiallyUnresolvedExpression\n): expression is CallExpression => expression.type === \"callExpression\";\n\nconst isConditionalExpression = (\n expression: PotentiallyUnresolvedExpression\n): expression is ConditionalExpression =>\n expression.type === \"conditionalExpression\";\n\nconst isCondition = (\n expression: Expression | PartialExpression\n): expression is ConditionExpression =>\n expression.type === \"relationalExpression\" ||\n expression.type === \"booleanCondition\";\n\nconst booleanConditionIsIncomplete = (\n condition: ConditionExpression\n): boolean =>\n condition.expressions.length < 2 ||\n condition.expressions.some((e) => conditionIsIncomplete(e));\n\nconst isBooleanCondition = (\n expression: Expression\n): expression is BooleanCondition => expression.type === \"booleanCondition\";\n\nconst isRelationalExpression = (\n expression?: Expression\n): expression is RelationalExpression =>\n expression?.type === \"relationalExpression\";\n\nconst conditionIsIncomplete = (\n condition: Expression\n): condition is ConditionExpression =>\n (isBooleanCondition(condition) && booleanConditionIsIncomplete(condition)) ||\n (isRelationalExpression(condition) && condition.expressions.length < 2);\n\nconst firstIncompleteExpression = (\n expression: Expression\n): Expression | undefined => {\n if (isUnknown(expression)) {\n return expression;\n } else if (isRelationalExpression(expression)) {\n const [operand1, operand2] = expression.expressions;\n if (expressionIsIncomplete(operand1)) {\n return firstIncompleteExpression(operand1);\n } else if (expression.op === \"unknown\") {\n return expression;\n } else if (expressionIsIncomplete(operand2)) {\n return firstIncompleteExpression(operand2);\n }\n } else if (isCondition(expression)) {\n const { expressions = [] } = expression;\n for (const e of expressions) {\n if (expressionIsIncomplete(e)) {\n return firstIncompleteExpression(e);\n }\n }\n } else if (isConditionalExpression(expression)) {\n const { condition, truthyExpression, falsyExpression } = expression;\n if (expressionIsIncomplete(condition)) {\n return firstIncompleteExpression(condition);\n } else if (expressionIsIncomplete(truthyExpression)) {\n return firstIncompleteExpression(truthyExpression);\n } else if (expressionIsIncomplete(falsyExpression)) {\n return firstIncompleteExpression(falsyExpression);\n }\n } else if (isArithmeticExpression(expression)) {\n const { expressions = [] } = expression;\n for (const e of expressions) {\n if (expressionIsIncomplete(e)) {\n return firstIncompleteExpression(e);\n }\n }\n }\n};\nconst replaceUnknownExpression = (\n incompleteExpression: Expression,\n unknownExpression: UnknownExpression,\n expression: Expression\n): boolean => {\n const { expressions = [] } = incompleteExpression;\n if (expressions.includes(unknownExpression)) {\n const pos = expressions.indexOf(unknownExpression);\n expressions.splice(pos, 1, expression);\n return true;\n } else {\n for (const e of expressions) {\n if (replaceUnknownExpression(e, unknownExpression, expression)) {\n return true;\n }\n }\n }\n return false;\n};\n\nconst expressionIsIncomplete = (expression: Expression): boolean => {\n if (isUnknown(expression)) {\n return true;\n } else if (isConditionalExpression(expression)) {\n return (\n expressionIsIncomplete(expression.condition) ||\n expressionIsIncomplete(expression.truthyExpression) ||\n expressionIsIncomplete(expression.falsyExpression)\n );\n } else if (\n isRelationalExpression(expression) ||\n isBooleanCondition(expression)\n ) {\n return (\n expression.op === undefined ||\n expression.expressions.some((e) => expressionIsIncomplete(e))\n );\n }\n // TODO missing cases\n return false;\n};\n\ntype ExpressionImpl =\n | ArithmeticExpressionImpl\n | CallExpressionImpl\n | ColumnExpressionImpl\n | ConditionalExpressionImpl\n | LiteralExpressionImpl;\n\ntype PotentiallyUnresolvedExpression = Expression | PartialExpression;\n\nconst addExpression = (\n expression: Expression,\n subExpression: PartialExpression | Expression\n) => {\n const targetExpression = firstIncompleteExpression(expression);\n if (targetExpression) {\n if (targetExpression.expressions) {\n targetExpression.expressions.push(subExpression as Expression);\n } else {\n console.warn(\"don't know how to treat targetExpression\");\n }\n } else {\n console.error(\"no target expression found\");\n }\n};\n\nclass ColumnExpression {\n #expression: ExpressionImpl | undefined;\n\n #callStack: CallExpression[] = [];\n\n setCondition(booleanOperator?: \"and\" | \"or\") {\n if (this.#expression === undefined) {\n this.addExpression(new ConditionalExpressionImpl(booleanOperator));\n } else if (isConditionalExpression(this.#expression)) {\n if (expressionIsIncomplete(this.#expression.condition)) {\n const condition = booleanOperator\n ? new BooleanConditionImp(booleanOperator)\n : new RelationalExpressionImpl();\n this.addExpression(condition);\n } else if (isUnknown(this.#expression.truthyExpression)) {\n this.#expression.truthyExpression = new ConditionalExpressionImpl(\n booleanOperator\n );\n } else if (expressionIsIncomplete(this.#expression.truthyExpression)) {\n const condition = booleanOperator\n ? new BooleanConditionImp(booleanOperator)\n : new RelationalExpressionImpl();\n this.addExpression(condition);\n } else if (isUnknown(this.#expression.falsyExpression)) {\n this.#expression.falsyExpression = new ConditionalExpressionImpl(\n booleanOperator\n );\n } else if (expressionIsIncomplete(this.#expression.falsyExpression)) {\n const condition = booleanOperator\n ? new BooleanConditionImp(booleanOperator)\n : new RelationalExpressionImpl();\n this.addExpression(condition);\n }\n } /*else if (isCallExpression(this.#expression)) {\n this.addExpression(new RelationalExpressionImpl());\n } */ else {\n console.error(\"setCondition called unexpectedly\");\n }\n }\n\n addExpression(expression: ExpressionImpl | Expression) {\n if (this.#callStack.length > 0) {\n const currentCallExpression = this.#callStack.at(-1);\n currentCallExpression?.arguments.push(expression as Expression);\n } else if (this.#expression === undefined) {\n this.#expression = expression as ExpressionImpl;\n } else if (isArithmeticExpression(this.#expression)) {\n const targetExpression = firstIncompleteExpression(this.#expression);\n if (targetExpression && isUnknown(targetExpression)) {\n replaceUnknownExpression(\n this.#expression,\n targetExpression,\n expression\n );\n }\n } else if (isConditionalExpression(this.#expression)) {\n if (expressionIsIncomplete(this.#expression)) {\n const targetExpression = firstIncompleteExpression(this.#expression);\n if (targetExpression && isUnknown(targetExpression)) {\n replaceUnknownExpression(\n this.#expression,\n targetExpression,\n expression\n );\n } else if (targetExpression) {\n addExpression(targetExpression, expression);\n }\n }\n }\n }\n\n setFunction(functionName: string) {\n const callExpression = new CallExpressionImpl(functionName);\n this.addExpression(callExpression);\n this.#callStack.push(callExpression);\n }\n\n setColumn(columnName: string) {\n this.addExpression(new ColumnExpressionImpl(columnName));\n }\n\n setArithmeticOp(value: string) {\n const op = value as arithmeticOp;\n const expression = this.#expression as Expression;\n if (isArithmeticExpression(expression)) {\n expression.op = op;\n }\n // else {\n // const targetExpression = firstIncompleteExpression(this.#expression);\n // if (targetExpression) {\n // targetExpression.op = op;\n // }\n // }\n }\n\n setRelationalOperator(value: string) {\n const op = value as relationalOp;\n if (this.#expression && isConditionalExpression(this.#expression)) {\n const targetExpression = firstIncompleteExpression(this.#expression);\n if (isRelationalExpression(targetExpression)) {\n targetExpression.op = op;\n } else {\n console.error(`no target expression found (op = ${value})`);\n }\n }\n }\n\n setValue(value: string | number | boolean) {\n const literalExpression = new LiteralExpressionImpl(value);\n if (this.#expression === undefined) {\n this.#expression = literalExpression;\n } else if (isArithmeticExpression(this.#expression)) {\n this.addExpression(literalExpression);\n } else if (isCallExpression(this.#expression)) {\n // TODO this might not be correct if call arguments include nested expression(s)\n this.#expression.arguments.push(literalExpression);\n } else if (isConditionalExpression(this.#expression)) {\n if (expressionIsIncomplete(this.#expression)) {\n const targetExpression = firstIncompleteExpression(this.#expression);\n if (targetExpression && isUnknown(targetExpression)) {\n replaceUnknownExpression(\n this.#expression,\n targetExpression,\n literalExpression\n );\n } else if (targetExpression) {\n addExpression(targetExpression, literalExpression);\n }\n } else {\n console.log(\"what do we do with value, in a complete expression\");\n }\n }\n }\n\n closeBrace() {\n this.#callStack.pop();\n }\n\n get expression() {\n return this.#expression;\n }\n\n toJSON() {\n return this.#expression?.toJSON() as ColumnDefinitionExpression;\n }\n}\n\nexport const walkTree = (tree: Tree, source: string) => {\n const columnExpression = new ColumnExpression();\n const cursor = tree.cursor();\n do {\n const { name, from, to } = cursor;\n switch (name) {\n case \"AndCondition\":\n columnExpression.setCondition(\"and\");\n break;\n\n case \"OrCondition\":\n columnExpression.setCondition(\"or\");\n break;\n\n case \"RelationalExpression\":\n // TODO this breaks when the relationalexpression is an argument to a CallExpression\n columnExpression.setCondition();\n break;\n\n case \"ArithmeticExpression\":\n columnExpression.addExpression(new ArithmeticExpressionImpl());\n break;\n\n case \"Column\":\n {\n const columnName = source.substring(from, to);\n columnExpression.setColumn(columnName);\n }\n break;\n\n case \"Function\":\n {\n const functionName = source.substring(from, to);\n columnExpression.setFunction(functionName);\n }\n break;\n\n case \"Times\":\n case \"Divide\":\n case \"Plus\":\n case \"Minus\":\n {\n const op = source.substring(from, to);\n columnExpression.setArithmeticOp(op);\n }\n break;\n\n case \"RelationalOperator\":\n {\n const op = source.substring(from, to);\n columnExpression.setRelationalOperator(op);\n }\n break;\n\n case \"False\":\n case \"True\":\n {\n const value = source.substring(from, to);\n columnExpression.setValue(value === \"true\" ? true : false);\n }\n break;\n\n case \"String\":\n columnExpression.setValue(source.substring(from + 1, to - 1));\n break;\n\n case \"Number\":\n columnExpression.setValue(parseFloat(source.substring(from, to)));\n break;\n\n case \"CloseBrace\":\n columnExpression.closeBrace();\n break;\n\n default:\n }\n } while (cursor.next());\n\n return columnExpression.toJSON();\n};\n", "import type { SyntaxNode } from \"@vuu-ui/vuu-codemirror\";\nimport { parser } from \"./generated/column-parser\";\n\nconst strictParser = parser.configure({ strict: true });\n\nconst RelationalOperands = [\"Number\", \"String\"];\n\nexport const ColumnNamedTerms: readonly string[] = [\n ...RelationalOperands,\n \"AndCondition\",\n \"ArithmeticExpression\",\n \"BooleanOperator\",\n \"RelationalOperatorOperator\",\n \"CallExpression\",\n \"CloseBrace\",\n \"Column\",\n \"Comma\",\n \"ConditionalExpression\",\n \"Divide\",\n \"Equal\",\n \"If\",\n \"Minus\",\n \"OpenBrace\",\n \"OrCondition\",\n \"ParenthesizedExpression\",\n \"Plus\",\n \"RelationalExpression\",\n \"RelationalOperator\",\n \"Times\",\n];\n\nexport const isCompleteExpression = (src: string) => {\n try {\n strictParser.parse(src);\n return true;\n } catch (err) {\n return false;\n }\n};\n\nexport const lastNamedChild = (node: SyntaxNode): SyntaxNode | null => {\n let { lastChild } = node;\n while (lastChild && !ColumnNamedTerms.includes(lastChild.name)) {\n lastChild = lastChild.prevSibling;\n console.log(lastChild?.name);\n }\n return lastChild;\n};\n\nexport const isCompleteRelationalExpression = (node?: SyntaxNode) => {\n if (node?.name === \"RelationalExpression\") {\n const { firstChild } = node;\n const lastChild = lastNamedChild(node);\n if (\n firstChild?.name === \"Column\" &&\n typeof lastChild?.name === \"string\" &&\n RelationalOperands.includes(lastChild.name)\n ) {\n return true;\n }\n }\n\n return false;\n};\n", "import {\n HighlightStyle,\n syntaxHighlighting,\n tags,\n} from \"@vuu-ui/vuu-codemirror\";\n\nconst myHighlightStyle = HighlightStyle.define([\n {\n tag: tags.attributeValue,\n color: \"var(--vuuFilterEditor-variableColor);font-weight: bold\",\n },\n { tag: tags.variableName, color: \"var(--vuuFilterEditor-variableColor)\" },\n { tag: tags.comment, color: \"green\", fontStyle: \"italic\" },\n]);\n\nexport const vuuHighlighting = syntaxHighlighting(myHighlightStyle);\n", "import { EditorView } from \"@vuu-ui/vuu-codemirror\";\n\nexport const vuuTheme = EditorView.theme(\n {\n \"&\": {\n border: \"solid 1px var(--salt-container-primary-borderColor)\",\n color: \"var(--vuuFilterEditor-color)\",\n backgroundColor: \"var(--vuuFilterEditor-background)\",\n },\n \".cm-content\": {\n caretColor: \"var(--vuuFilterEditor-cursorColor)\",\n },\n \"&.cm-focused .cm-cursor\": {\n borderLeftColor: \"var(--vuuFilterEditor-cursorColor)\",\n },\n \"&.cm-focused .cm-selectionBackground, ::selection\": {\n backgroundColor: \"var(--vuuFilterEditor-selectionBackground)\",\n },\n \".cm-selectionBackground, ::selection\": {\n backgroundColor: \"var(--vuuFilterEditor-selectionBackground)\",\n },\n \".cm-scroller\": {\n fontFamily: \"var(--vuuFilterEditor-fontFamily)\",\n },\n \".cm-completionLabel\": {\n color: \"var(--vuu-color-gray-50)\",\n },\n \".cm-completionMatchedText\": {\n color: \"var(--vuu-color-gray-80)\",\n fontWeight: 700,\n textDecoration: \"none\",\n },\n \".cm-tooltip\": {\n background: \"var(--vuuFilterEditor-tooltipBackground)\",\n border: \"var(--vuuFilterEditor-tooltipBorder)\",\n borderRadius: \"4px\",\n boxShadow: \"var(--vuuFilterEditor-tooltipElevation)\",\n \"&.cm-tooltip-autocomplete > ul\": {\n fontFamily: \"var(--vuuFilterEditor-fontFamily)\",\n fontSize: \"var(--vuuFilterEditor-fontSize)\",\n maxHeight: \"240px\",\n },\n \"&.cm-tooltip-autocomplete > ul > li\": {\n height: \"var(--vuuFilterEditor-suggestion-height)\",\n padding: \"0 3px\",\n lineHeight: \"var(--vuuFilterEditor-suggestion-height)\",\n },\n \"&.cm-tooltip-autocomplete li[aria-selected]\": {\n background: \"var(--vuuFilterEditor-suggestion-selectedBackground)\",\n color: \"var(--vuuFilterEditor-suggestion-selectedColor)\",\n },\n \"&.cm-tooltip-autocomplete li .cm-completionDetail\": {\n color: \"var(--vuuFilterEditor-suggestion-detailColor)\",\n },\n },\n },\n { dark: false }\n);\n", "import {\n booleanJoinSuggestions,\n Completion,\n CompletionContext,\n CompletionSource,\n EditorState,\n getNamedParentNode,\n getPreviousNode,\n getValue,\n SyntaxNode,\n syntaxTree,\n} from \"@vuu-ui/vuu-codemirror\";\nimport { MutableRefObject, useCallback } from \"react\";\nimport {\n ColumnNamedTerms,\n isCompleteExpression,\n isCompleteRelationalExpression,\n} from \"./column-language-parser\";\nimport {\n ColumnExpressionOperator,\n ColumnExpressionSuggestionOptions,\n ColumnExpressionSuggestionType,\n IExpressionSuggestionProvider,\n} from \"./useColumnExpressionEditor\";\nimport { lastNamedChild } from \"./column-language-parser\";\n\nexport type ApplyCompletion = (mode?: \"add\" | \"replace\") => void;\n\nexport type Operator = \"\";\n\nconst applyPrefix = (completions: Completion[], prefix?: string) =>\n prefix\n ? completions.map((completion) => ({\n ...completion,\n apply:\n typeof completion.apply === \"function\"\n ? completion.apply\n : `${prefix}${completion.apply ?? completion.label}`,\n }))\n : completions;\n\nconst isOperator = (node?: SyntaxNode): node is SyntaxNode =>\n node === undefined\n ? false\n : [\"Times\", \"Divide\", \"Plus\", \"Minus\"].includes(node.name);\n\nconst completionDone = (onSubmit?: () => void): Completion => ({\n apply: () => {\n onSubmit?.();\n },\n label: \"Done\",\n boost: 10,\n});\n\nconst getLastChild = (node: SyntaxNode, context: CompletionContext) => {\n let { lastChild: childNode } = node;\n const { pos } = context;\n while (childNode) {\n const isBeforeCursor = childNode.from < pos;\n if (isBeforeCursor && ColumnNamedTerms.includes(childNode.name)) {\n if (childNode.name === \"ParenthesizedExpression\") {\n // extract the parenthesized expression\n const expression = childNode.firstChild?.nextSibling;\n if (expression) {\n childNode = expression;\n }\n }\n return childNode;\n } else {\n childNode = childNode.prevSibling;\n }\n }\n};\nconst getFunctionName = (node: SyntaxNode, state: EditorState) => {\n if (node.name === \"ArgList\") {\n const functionNode = node.prevSibling;\n if (functionNode) {\n return getValue(functionNode, state);\n }\n } else if (node.name === \"OpenBrace\") {\n const maybeFunction = node.parent?.prevSibling;\n if (maybeFunction?.name === \"Function\") {\n return getValue(maybeFunction, state);\n }\n }\n};\n\nconst getRelationalOperator = (node: SyntaxNode, state: EditorState) => {\n if (node.name === \"RelationalExpression\") {\n const lastNode = lastNamedChild(node);\n if (lastNode?.name === \"RelationalOperator\") {\n return getValue(lastNode, state);\n }\n } else {\n const prevNode = node.prevSibling;\n if (prevNode?.name === \"RelationalOperator\") {\n return getValue(prevNode, state) as ColumnExpressionOperator;\n }\n }\n};\n\nconst getColumnName = (\n node: SyntaxNode,\n state: EditorState\n): string | undefined => {\n if (node.name === \"RelationalExpression\") {\n if (node.firstChild?.name === \"Column\") {\n return getValue(node.firstChild, state);\n }\n } else {\n const prevNode = node.prevSibling;\n if (prevNode?.name === \"Column\") {\n return getValue(prevNode, state);\n } else if (prevNode?.name === \"RelationalOperator\") {\n return getColumnName(prevNode, state);\n }\n }\n};\n\nconst makeSuggestions = async (\n context: CompletionContext,\n suggestionProvider: IExpressionSuggestionProvider,\n suggestionType: ColumnExpressionSuggestionType,\n optionalArgs: ColumnExpressionSuggestionOptions = {}\n) => {\n const options = await suggestionProvider.getSuggestions(\n suggestionType,\n optionalArgs\n );\n const { startsWith = \"\" } = optionalArgs;\n return { from: context.pos - startsWith.length, options };\n};\n\nconst handleConditionalExpression = (\n node: SyntaxNode,\n context: CompletionContext,\n suggestionProvider: IExpressionSuggestionProvider,\n maybeComplete?: boolean,\n onSubmit?: () => void\n) => {\n const lastChild = getLastChild(node, context);\n switch (lastChild?.name) {\n case \"If\":\n return makeSuggestions(context, suggestionProvider, \"expression\", {\n prefix: \"( \",\n });\n case \"OpenBrace\":\n return makeSuggestions(context, suggestionProvider, \"expression\");\n case \"Condition\":\n return makeSuggestions(context, suggestionProvider, \"expression\", {\n prefix: \", \",\n });\n case \"CloseBrace\":\n if (maybeComplete) {\n const options: Completion[] = [completionDone(onSubmit)];\n return { from: context.pos, options };\n }\n }\n};\n\nconst promptToSave = (context: CompletionContext, onSubmit: () => void) => {\n const options: Completion[] = [completionDone(onSubmit)];\n return { from: context.pos, options };\n};\n\nexport const useColumnAutoComplete = (\n suggestionProvider: IExpressionSuggestionProvider,\n onSubmit: MutableRefObject<ApplyCompletion>\n) => {\n const makeSuggestions = useCallback(\n async (\n context: CompletionContext,\n suggestionType: ColumnExpressionSuggestionType,\n optionalArgs: ColumnExpressionSuggestionOptions = {}\n ) => {\n const options = await suggestionProvider.getSuggestions(\n suggestionType,\n optionalArgs\n );\n const { startsWith = \"\" } = optionalArgs;\n return { from: context.pos - startsWith.length, options };\n },\n [suggestionProvider]\n );\n\n return useCallback(\n async (context: CompletionContext) => {\n const { state, pos } = context;\n const word = context.matchBefore(/\\w*/) ?? {\n from: 0,\n to: 0,\n text: undefined,\n };\n\n const tree = syntaxTree(state);\n const nodeBefore = tree.resolveInner(pos, -1);\n const text = state.doc.toString();\n const maybeComplete = isCompleteExpression(text);\n\n switch (nodeBefore.name) {\n case \"If\": {\n return makeSuggestions(context, \"expression\", { prefix: \"( \" });\n }\n case \"Condition\":\n {\n const lastChild = getLastChild(nodeBefore, context);\n if (lastChild?.name === \"Column\") {\n // is this the first term ?\n const prevChild = getPreviousNode(lastChild);\n if (prevChild?.name !== \"RelationalOperator\") {\n return makeSuggestions(context, \"condition-operator\", {\n columnName: getValue(lastChild, state),\n });\n }\n } else if (lastChild?.name === \"RelationalOperator\") {\n // we need the type of the expression on the other side of the operator\n return makeSuggestions(context, \"expression\");\n }\n }\n break;\n case \"ConditionalExpression\":\n return handleConditionalExpression(\n nodeBefore,\n context,\n suggestionProvider\n );\n case \"RelationalExpression\":\n {\n if (isCompleteRelationalExpression(nodeBefore)) {\n return {\n from: context.pos,\n options: booleanJoinSuggestions.concat({\n label: \", <truthy expression>, <falsy expression>\",\n apply: \", \",\n }),\n };\n } else {\n const operator = getRelationalOperator(nodeBefore, state);\n const columnName = getColumnName(nodeBefore, state);\n if (!operator) {\n const options = await suggestionProvider.getSuggestions(\n \"condition-operator\",\n {\n columnName,\n }\n );\n return { from: context.pos, options };\n } else {\n return makeSuggestions(context, \"expression\");\n }\n }\n }\n break;\n\n case \"RelationalOperator\":\n // we need the type of the expression on the other side of the operator\n return makeSuggestions(context, \"expression\");\n\n case \"String\":\n {\n // we only encounter a string as the right hand operand of a conditional expression\n const operator = getRelationalOperator(\n nodeBefore,\n state\n ) as ColumnExpressionOperator;\n const columnName = getColumnName(nodeBefore, state);\n // are we inside the string or immediately after it\n const { from, to } = nodeBefore;\n if (to - from === 2 && context.pos === from + 1) {\n // We are in an empty string, i.e between two quotes\n if (columnName && operator) {\n return makeSuggestions(context, \"columnValue\", {\n columnName,\n operator,\n startsWith: word.text,\n });\n }\n } else if (to - from > 2 && context.pos === to) {\n // NOte we couls also offer AND/OR to extend the condition\n return makeSuggestions(context, \"expression\", {\n prefix: \", \",\n });\n }\n }\n break;\n\n case \"ArithmeticExpression\":\n {\n const lastChild = getLastChild(nodeBefore, context);\n if (lastChild?.name === \"Column\") {\n return makeSuggestions(context, \"expression\");\n } else if (isOperator(lastChild)) {\n const operator = lastChild.name as ColumnExpressionOperator;\n return makeSuggestions(context, \"column\", { operator });\n }\n }\n\n break;\n case \"OpenBrace\":\n {\n // Might be a function expression, might be parenthesized\n const functionName = getFunctionName(nodeBefore, state);\n // If not function, what came before - if it's an operator\n // we restrict to numerics\n return makeSuggestions(context, \"expression\", { functionName });\n }\n break;\n case \"ArgList\": {\n const functionName = getFunctionName(nodeBefore, state);\n const lastArgument = getLastChild(nodeBefore, context);\n\n const prefix =\n lastArgument?.name === \"OpenBrace\" || lastArgument?.name === \"Comma\"\n ? undefined\n : \",\";\n let options = await suggestionProvider.getSuggestions(\"expression\", {\n functionName,\n });\n options = prefix ? applyPrefix(options, \", \") : options;\n\n // TODO per function check for number of arguments expected\n if (\n lastArgument?.name !== \"OpenBrace\" &&\n lastArgument?.name !== \"Comma\"\n ) {\n options = [\n {\n apply: \") \",\n boost: 10,\n label: \"Done - no more arguments\",\n } as Completion,\n ].concat(options);\n }\n return { from: context.pos, options };\n }\n case \"Equal\":\n if (text.trim() === \"=\") {\n return makeSuggestions(context, \"expression\");\n }\n break;\n case \"ParenthesizedExpression\":\n case \"ColumnDefinitionExpression\":\n if (context.pos === 0) {\n return makeSuggestions(context, \"expression\");\n } else {\n const lastChild = getLastChild(nodeBefore, context);\n if (lastChild?.name === \"Column\") {\n if (maybeComplete) {\n // We come in here is the columns IS complete, too (ie has space after)\n const options: Completion[] = [\n completionDone(onSubmit.current),\n ];\n const columnName = getValue(lastChild, state);\n const columnOptions: Completion[] =\n await suggestionProvider.getSuggestions(\"operator\", {\n columnName,\n });\n\n return {\n from: context.pos,\n options: options.concat(columnOptions),\n };\n }\n } else if (lastChild?.name === \"CallExpression\") {\n if (maybeComplete) {\n return {\n from: context.pos,\n options: [completionDone(onSubmit.current)],\n };\n }\n } else if (lastChild?.name === \"ArithmeticExpression\") {\n if (maybeComplete) {\n let options: Completion[] = [completionDone(onSubmit.current)];\n\n const lastExpressionChild = getLastChild(lastChild, context);\n if (lastExpressionChild?.name === \"Column\") {\n const columnName = getValue(lastExpressionChild, state);\n // TODO need to exclude columns already included in expression\n\n const suggestions = await suggestionProvider.getSuggestions(\n \"operator\",\n { columnName }\n );\n options = options.concat(suggestions);\n }\n\n return {\n from: context.pos,\n options,\n };\n }\n } else if (lastChild?.name === \"ConditionalExpression\") {\n return handleConditionalExpression(\n lastChild,\n context,\n suggestionProvider,\n maybeComplete,\n onSubmit.current\n );\n }\n break;\n }\n case \"Column\":\n {\n const isPartialMatch = await suggestionProvider.isPartialMatch(\n \"expression\",\n undefined,\n word.text\n );\n\n if (isPartialMatch) {\n return makeSuggestions(context, \"expression\", {\n startsWith: word.text,\n });\n }\n }\n break;\n case \"Comma\":\n {\n const parentNode = getNamedParentNode(nodeBefore);\n if (parentNode?.name === \"ConditionalExpression\") {\n return makeSuggestions(context, \"expression\");\n }\n }\n break;\n\n case \"CloseBrace\":\n {\n const parentNode = getNamedParentNode(nodeBefore);\n if (parentNode?.name === \"ConditionalExpression\") {\n return handleConditionalExpression(\n parentNode,\n context,\n suggestionProvider,\n maybeComplete,\n onSubmit.current\n );\n } else if (parentNode?.name === \"ArgList\") {\n if (maybeComplete) {\n return promptToSave(context, onSubmit.current);\n }\n }\n }\n break;\n\n default: {\n if (nodeBefore?.prevSibling?.name === \"FilterClause\") {\n console.log(\"looks like we ight be a or|and operator\");\n }\n }\n }\n },\n [makeSuggestions, onSubmit, suggestionProvider]\n ) as CompletionSource;\n};\n", "import {\n AnnotationType,\n Completion,\n EditorView,\n getRelationalOperators,\n numericOperators,\n stringOperators,\n toSuggestions,\n} from \"@vuu-ui/vuu-codemirror\";\nimport {\n getTypeaheadParams,\n useTypeaheadSuggestions,\n} from \"@vuu-ui/vuu-data-react\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport { isNumericColumn, isTextColumn } from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useRef } from \"react\";\nimport {\n ColumnFunctionDescriptor,\n columnFunctionDescriptors,\n} from \"./column-function-descriptors\";\nimport { functionDocInfo } from \"./functionDocInfo\";\nimport {\n ColumnExpressionOperator,\n ColumnExpressionSuggestionType,\n IExpressionSuggestionProvider,\n} from \"./useColumnExpressionEditor\";\n\nconst NO_OPERATORS = [] as Completion[];\n\nconst withApplySpace = (suggestions: Completion[]): Completion[] =>\n suggestions.map((suggestion) => ({\n ...suggestion,\n apply: (suggestion.apply ?? suggestion.label) + \" \",\n }));\n\ntype ColumnOptions = {\n functionName?: string;\n operator?: ColumnExpressionOperator;\n prefix?: string;\n};\n\nconst getValidColumns = (\n columns: ColumnDescriptor[],\n { functionName, operator }: ColumnOptions\n) => {\n if (operator) {\n return columns.filter(isNumericColumn);\n } else if (functionName) {\n const fn = columnFunctionDescriptors.find((f) => f.name === functionName);\n if (fn) {\n switch (fn.accepts) {\n case \"string\":\n return columns.filter(isTextColumn);\n case \"number\":\n return columns.filter(isNumericColumn);\n default:\n return columns;\n }\n }\n }\n return columns;\n};\n\nconst getColumns = (columns: ColumnDescriptor[], options: ColumnOptions) => {\n const validColumns = getValidColumns(columns, options);\n return validColumns.map((column) => {\n const label = column.label ?? column.name;\n return {\n apply: options.prefix ? `${options.prefix}${column.name}` : column.name,\n label,\n boost: 5,\n type: \"column\",\n expressionType: column.serverDataType,\n };\n });\n};\n\n// prettier-ignore\nconst arithmeticOperators = [\n { apply: \"* \", boost: 2, label: \"*\", type: \"operator\" },\n { apply: \"/ \", boost: 2, label: \"/\", type: \"operator\" },\n { apply: \"+ \", boost: 2, label: \"+\", type: \"operator\" },\n { apply: \"- \", boost: 2, label: \"-\", type: \"operator\" },\n];\n\nconst getOperators = (column?: ColumnDescriptor) => {\n if (column === undefined || isNumericColumn(column)) {\n return arithmeticOperators;\n } else {\n return NO_OPERATORS;\n }\n};\n\nconst getConditionOperators = (column: ColumnDescriptor) => {\n switch (column.serverDataType) {\n case \"string\":\n case \"char\":\n return withApplySpace(stringOperators /*, startsWith*/);\n case \"int\":\n case \"long\":\n case \"double\":\n return withApplySpace(numericOperators);\n }\n};\n\nconst toFunctionCompletion = (\n functionDescriptor: ColumnFunctionDescriptor\n) => ({\n apply: `${functionDescriptor.name}( `,\n boost: 2,\n expressionType: functionDescriptor.type,\n info: () => functionDocInfo(functionDescriptor),\n label: functionDescriptor.name,\n type: \"function\",\n});\n\nconst getAcceptedTypes = (fn?: ColumnFunctionDescriptor) => {\n if (fn) {\n if (typeof fn.accepts === \"string\") {\n return fn.accepts;\n } else if (Array.isArray(fn.accepts)) {\n if (fn.accepts.every((s) => s === \"string\")) {\n return \"string\";\n } else {\n return \"any\";\n }\n }\n }\n return \"any\";\n};\n\nconst functions: Completion[] =\n columnFunctionDescriptors.map(toFunctionCompletion);\n\nconst getFunctions = ({ functionName }: ColumnOptions) => {\n if (functionName) {\n const fn = columnFunctionDescriptors.find((f) => f.name === functionName);\n const acceptedTypes = getAcceptedTypes(fn);\n if (fn) {\n switch (acceptedTypes) {\n case \"string\":\n return columnFunctionDescriptors\n .filter((f) => f.type === \"string\" || f.type === \"variable\")\n .map(toFunctionCompletion);\n case \"number\":\n return columnFunctionDescriptors\n .filter((f) => f.type === \"number\" || f.type === \"variable\")\n .map(toFunctionCompletion);\n default:\n }\n }\n }\n return functions;\n};\n\nexport interface SuggestionProviderHookProps {\n columns: ColumnDescriptor[];\n table: VuuTable;\n}\n\nconst NONE = {};\n\nexport const useColumnExpressionSuggestionProvider = ({\n columns,\n table,\n}: SuggestionProviderHookProps): IExpressionSuggestionProvider => {\n const findColumn = useCallback(\n (name?: string) =>\n name ? columns.find((col) => col.name === name) : undefined,\n [columns]\n );\n\n const latestSuggestionsRef = useRef<Completion[]>();\n const getTypeaheadSuggestions = useTypeaheadSuggestions();\n\n const getSuggestions: IExpressionSuggestionProvider[\"getSuggestions\"] =\n useCallback(\n async (suggestionType, options = NONE): Promise<Completion[]> => {\n const { columnName, functionName, operator, prefix } = options;\n\n switch (suggestionType) {\n case \"expression\": {\n const suggestions = await withApplySpace(\n getColumns(columns, { functionName, prefix })\n ).concat(getFunctions(options));\n return (latestSuggestionsRef.current = suggestions);\n }\n case \"column\": {\n const suggestions = await getColumns(columns, options);\n return (latestSuggestionsRef.current = withApplySpace(suggestions));\n }\n case \"operator\": {\n const suggestions = await getOperators(findColumn(columnName));\n return (latestSuggestionsRef.current = withApplySpace(suggestions));\n }\n case \"relational-operator\": {\n const suggestions = await getRelationalOperators(\n findColumn(columnName)\n );\n return (latestSuggestionsRef.current = withApplySpace(suggestions));\n }\n case \"condition-operator\":\n {\n const column = findColumn(columnName);\n if (column) {\n const suggestions = await getConditionOperators(column);\n if (suggestions) {\n return (latestSuggestionsRef.current =\n withApplySpace(suggestions));\n }\n }\n }\n break;\n case \"columnValue\":\n if (columnName && operator) {\n // const column = findColumn(columnName);\n const params = getTypeaheadParams(\n table,\n columnName /*, startsWith*/\n );\n const suggestions = await getTypeaheadSuggestions(params);\n latestSuggestionsRef.current = toSuggestions(suggestions, {\n suffix: \"\",\n });\n\n latestSuggestionsRef.current.forEach((suggestion) => {\n suggestion.apply = (\n view: EditorView,\n completion: Completion,\n from: number\n ) => {\n const annotation = new AnnotationType<Completion>();\n const cursorPos = from + completion.label.length + 1;\n view.dispatch({\n changes: { from, insert: completion.label },\n selection: { anchor: cursorPos, head: cursorPos },\n annotations: annotation.of(completion),\n });\n };\n });\n return latestSuggestionsRef.current;\n }\n break;\n }\n\n return [];\n },\n [columns, findColumn, getTypeaheadSuggestions, table]\n );\n\n const isPartialMatch = useCallback(\n async (\n valueType: ColumnExpressionSuggestionType,\n columnName?: string,\n pattern?: string\n ) => {\n const { current: latestSuggestions } = latestSuggestionsRef;\n let maybe = false;\n const suggestions =\n latestSuggestions || (await getSuggestions(valueType, { columnName }));\n if (pattern && suggestions) {\n for (const option of suggestions) {\n if (option.label === pattern) {\n return false;\n } else if (option.label.startsWith(pattern)) {\n maybe = true;\n }\n }\n }\n return maybe;\n },\n [getSuggestions]\n );\n\n return {\n getSuggestions,\n isPartialMatch,\n };\n};\n", "export type ColumnFunctionDescriptor = {\n accepts:\n | \"string\"\n | \"number\"\n | \"boolean\"\n | \"any\"\n | Array<\"string\" | \"number\" | \"boolean\">;\n description: string;\n example: {\n expression: string;\n result: string;\n };\n name: string;\n params: {\n count?: number;\n description: string;\n };\n type: \"string\" | \"number\" | \"boolean\" | \"variable\";\n};\n\nexport const columnFunctionDescriptors: ColumnFunctionDescriptor[] = [\n /**\n * and\n */\n {\n accepts: [\"boolean\"],\n description:\n \"Applies boolean and operator across supplied parameters to returns a single boolean result\",\n example: {\n expression: 'and(ccy=\"EUR\",quantity=0)',\n result: \"true | false\",\n },\n name: \"and\",\n params: {\n description: \"( boolean, [ boolean* ] )\",\n },\n type: \"boolean\",\n },\n\n /**\n * concatenate()\n */\n {\n accepts: \"string\",\n description:\n \"Returns multiple string values as a single joined string. Arguments may be string literal values, string columns or other string expressions. Non string arguments may also be included, these will be converted to strings.\",\n example: {\n expression: 'concatenate(\"example\", \"-test\")',\n result: '\"example-test\"',\n },\n name: \"concatenate\",\n params: {\n description: \"( string, string, [ string* ] )\",\n },\n type: \"string\",\n },\n /**\n * contains()\n */\n {\n accepts: [\"string\", \"string\"],\n description:\n \"Tests a string value to determine whether it contains a given substring. Accepts two arguments: source text and target substring. Returns true if <source text> contains one or more occurrences of <target subscring>\",\n example: {\n expression: 'contains(\"Royal Bank of Scotland\", \"bank\")',\n result: \"true\",\n },\n name: \"contains\",\n params: {\n description: \"( string )\",\n },\n type: \"boolean\",\n },\n\n /**\n * left()\n */\n {\n accepts: [\"string\", \"number\"],\n description:\n \"Returns the leftmost <number> characters from <string>. First argument may be a string literal, string column or other string expression.\",\n example: {\n expression: 'left(\"USD Benchmark Report\", 3)',\n result: '\"USD\"',\n },\n name: \"left\",\n params: {\n count: 2,\n description: \"( string, number )\",\n },\n type: \"string\",\n },\n /**\n * len()\n */\n {\n accepts: \"string\",\n description:\n \"Returns the number of characters in <string>. Argument may be a string literal, string column or other string expression.\",\n example: {\n expression: 'len(\"example\")',\n result: \"7\",\n },\n name: \"len\",\n params: {\n description: \"(string)\",\n },\n type: \"number\",\n },\n /**\n * lower()\n */\n {\n accepts: \"string\",\n description:\n \"Convert a string value to lowercase. Argument may be a string column or other string expression.\",\n example: {\n expression: 'lower(\"examPLE\")',\n result: '\"example\"',\n },\n name: \"lower\",\n params: {\n description: \"( string )\",\n },\n type: \"string\",\n },\n /**\n * or\n */\n {\n accepts: [\"boolean\"],\n description:\n \"Applies boolean or operator across supplied parameters to returns a single boolean result\",\n example: {\n expression: 'or(status=\"cancelled\",quantity=0)',\n result: \"true | false\",\n },\n name: \"or\",\n params: {\n description: \"( boolean, [ boolean* ] )\",\n },\n type: \"boolean\",\n },\n\n /**\n * upper()\n */\n {\n accepts: \"string\",\n description:\n \"Convert a string value to uppercase. Argument may be a string column or other string expression.\",\n example: {\n expression: 'upper(\"example\")',\n result: '\"EXAMPLE\"',\n },\n name: \"upper\",\n params: {\n description: \"( string )\",\n },\n type: \"string\",\n },\n /**\n * right()\n */\n {\n accepts: [\"string\", \"number\"],\n description:\n \"Returns the rightmost <number> characters from <string>. First argument may be a string literal, string column or other string expression.\",\n example: {\n expression: \"blah\",\n result: \"blah\",\n },\n name: \"right\",\n params: {\n description: \"( string )\",\n },\n type: \"string\",\n },\n /**\n * replace()\n */\n {\n accepts: [\"string\", \"string\", \"string\"],\n description:\n \"Replace characters within a string. Accepts three arguments: source text, text to replace and replacement text. Returns a copy of <source text> with any occurrences of <text to replace> replaced by <replacement text>\",\n example: {\n expression: \"blah\",\n result: \"blah\",\n },\n name: \"replace\",\n params: {\n description: \"( string )\",\n },\n type: \"string\",\n },\n /**\n * text()\n */\n {\n accepts: \"number\",\n description: \"Converts a number to a string.\",\n example: {\n expression: \"blah\",\n result: \"blah\",\n },\n name: \"text\",\n params: {\n description: \"( string )\",\n },\n type: \"string\",\n },\n /**\n * starts()\n */\n {\n accepts: \"string\",\n description:\n \"Tests a string value to determine whether it starts with a given substring. Accepts two arguments: source text and target substring. Returns true if <source text> starts with <target subscring>.\",\n example: {\n expression: \"blah\",\n result: \"blah\",\n },\n name: \"starts\",\n params: {\n description: \"( string )\",\n },\n type: \"boolean\",\n },\n /**\n * starts()\n */\n {\n accepts: \"string\",\n description:\n \"Tests a string value to determine whether it ends with a given substring. Accepts two arguments: source text and target substring. Returns true if <source text> ends with <target subscring>.\",\n example: {\n expression: \"blah\",\n result: \"blah\",\n },\n name: \"ends\",\n params: {\n description: \"( string )\",\n },\n type: \"boolean\",\n },\n {\n accepts: \"number\",\n description: \"blah\",\n example: {\n expression: \"blah\",\n result: \"blah\",\n },\n name: \"min\",\n params: {\n description: \"( string )\",\n },\n type: \"number\",\n },\n {\n accepts: \"number\",\n description: \"blah\",\n example: {\n expression: \"blah\",\n result: \"blah\",\n },\n name: \"max\",\n params: {\n description: \"( string )\",\n },\n type: \"number\",\n },\n {\n accepts: \"number\",\n description: \"blah\",\n example: {\n expression: \"blah\",\n result: \"blah\",\n },\n name: \"sum\",\n params: {\n description: \"( string )\",\n },\n type: \"number\",\n },\n {\n accepts: \"number\",\n description: \"blah\",\n example: {\n expression: \"blah\",\n result: \"blah\",\n },\n name: \"round\",\n params: {\n description: \"( string )\",\n },\n type: \"number\",\n },\n {\n accepts: \"any\",\n description: \"blah\",\n example: {\n expression: \"blah\",\n result: \"blah\",\n },\n name: \"or\",\n params: {\n description: \"( string )\",\n },\n type: \"boolean\",\n },\n {\n accepts: \"any\",\n description: \"blah\",\n example: {\n expression: \"blah\",\n result: \"blah\",\n },\n name: \"and\",\n params: {\n description: \"( string )\",\n },\n type: \"boolean\",\n },\n {\n accepts: \"any\",\n description:\n \"Return one of two possible result values, depending on the evaluation of a filter expression. If <filterExpression> resolves to true, result is <expression1>, otherwise <expression2>. \",\n example: {\n expression: \"blah\",\n result: \"blah\",\n },\n name: \"if\",\n params: {\n description: \"( filterExpression, expression1, expression 2)\",\n },\n type: \"variable\",\n },\n];\n", "import { createEl } from \"@vuu-ui/vuu-utils\";\nimport { ColumnFunctionDescriptor } from \"./column-function-descriptors\";\n\nexport const functionDocInfo = ({\n name,\n description,\n example,\n params,\n type,\n}: ColumnFunctionDescriptor) => {\n const rootElement = createEl(\"div\", \"vuuFunctionDoc\");\n const headingElement = createEl(\"div\", \"function-heading\");\n\n const nameElement = createEl(\"span\", \"function-name\", name);\n const paramElement = createEl(\"span\", \"param-list\", params.description);\n const typeElement = createEl(\"span\", \"function-type\", type);\n\n headingElement.appendChild(nameElement);\n headingElement.appendChild(paramElement);\n headingElement.appendChild(typeElement);\n\n const child2 = createEl(\"p\", undefined, description);\n\n rootElement.appendChild(headingElement);\n rootElement.appendChild(child2);\n\n if (example) {\n const exampleElement = createEl(\"div\", \"example-container\");\n const expressionElement = createEl(\n \"div\",\n \"example-expression\",\n example.expression\n );\n const resultElement = createEl(\"div\", \"example-result\", example.result);\n\n exampleElement.appendChild(expressionElement);\n\n rootElement.appendChild(exampleElement);\n rootElement.appendChild(resultElement);\n }\n\n return rootElement;\n};\n", "import { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport {\n getCalculatedColumnDetails,\n setCalculatedColumnExpression,\n setCalculatedColumnName,\n setCalculatedColumnType,\n} from \"@vuu-ui/vuu-utils\";\nimport { FormEventHandler, useCallback, useRef, useState } from \"react\";\nimport { ColumnExpressionPanelProps } from \"./ColumnExpressionPanel\";\n\nexport type ColumnExpressionHookProps = Pick<\n ColumnExpressionPanelProps,\n \"column\" | \"onChangeName\"\n>;\n\nconst applyDefaults = (column: ColumnDescriptor) => {\n const [name, expression, type] = getCalculatedColumnDetails(column);\n if (type === \"\") {\n return {\n ...column,\n name: `${name}:string:${expression}`,\n };\n } else {\n return column;\n }\n};\n\nexport const useColumnExpression = ({\n column: columnProp,\n onChangeName: onChangeNameProp,\n}: ColumnExpressionHookProps) => {\n const [column, _setColumn] = useState<ColumnDescriptor>(\n applyDefaults(columnProp)\n );\n const columnRef = useRef<ColumnDescriptor>(columnProp);\n const setColumn = useCallback((column: ColumnDescriptor) => {\n columnRef.current = column;\n _setColumn(column);\n }, []);\n\n // We need to track column name in a ref because ColunExpressionInput\n // is not a pure React component, it hosts a CodeMirror editor. We\n // do not want to cause it to render mid-edit. Therefore it uses memo\n // and only renders on initial load. onChangeExpression must be stable.\n // const columnNameRef = useRef<string>(column.name);\n // const expressionRef = useRef(getCalculatedColumnDetails(column)[1]);\n\n const onChangeName = useCallback<FormEventHandler>(\n (evt) => {\n const { value } = evt.target as HTMLInputElement;\n const newColumn = setCalculatedColumnName(column, value);\n // columnNameRef.current = newColumn.name;\n setColumn(newColumn);\n onChangeNameProp?.(newColumn.name);\n },\n [column, onChangeNameProp, setColumn]\n );\n\n const onChangeExpression = useCallback(\n (value: string) => {\n // we do not set state when this changes as the codemirror editor\n // manages state of the expression for us until complete\n const expression = value.trim();\n // expressionRef.current = expression;\n // const [name, , type] = column.name.split(\":\");\n // columnNameRef.current = `${name}:${expression}:${type}`;\n\n const { current: column } = columnRef;\n const newColumn = setCalculatedColumnExpression(column, expression);\n setColumn(newColumn);\n\n onChangeNameProp?.(newColumn.name);\n\n // console.log(`calculatedColumnName ${columnNameRef.current}`);\n },\n [onChangeNameProp, setColumn]\n );\n\n const onChangeType = useCallback(\n (evt, value: string | null) => {\n if (typeof value === \"string\") {\n const newColumn = setCalculatedColumnType(column, value);\n setColumn(newColumn);\n onChangeNameProp?.(newColumn.name);\n }\n },\n [column, onChangeNameProp, setColumn]\n );\n\n return {\n column,\n onChangeExpression,\n onChangeName,\n onChangeType,\n };\n};\n", "import {\n ColumnDescriptor,\n ColumnDescriptorCustomRenderer,\n ColumnTypeRendering,\n} from \"@vuu-ui/vuu-table-types\";\nimport { Dropdown, SingleSelectionHandler } from \"@vuu-ui/vuu-ui-controls\";\nimport {\n CellRendererDescriptor,\n ConfigurationEditorProps,\n getCellRendererOptions,\n getConfigurationEditor,\n isColumnTypeRenderer,\n isTypeDescriptor,\n} from \"@vuu-ui/vuu-utils\";\nimport { FormField, FormFieldLabel } from \"@salt-ds/core\";\nimport cx from \"clsx\";\nimport { HTMLAttributes, useCallback, useMemo } from \"react\";\nimport { BaseNumericFormattingSettings } from \"./BaseNumericFormattingSettings\";\nimport { LongTypeFormattingSettings } from \"./LongTypeFormattingSettings\";\nimport { FormattingSettingsProps } from \"./types\";\n\nconst classBase = \"vuuColumnFormattingPanel\";\n\nexport interface ColumnFormattingPanelProps\n extends HTMLAttributes<HTMLDivElement>,\n FormattingSettingsProps {\n availableRenderers: CellRendererDescriptor[];\n column: ColumnDescriptor;\n onChangeRendering: (renderProps: ColumnTypeRendering) => void;\n}\n\nconst itemToString = (item: CellRendererDescriptor) => item.label ?? item.name;\n\nexport const ColumnFormattingPanel = ({\n availableRenderers,\n className,\n column,\n onChangeFormatting,\n onChangeType,\n onChangeRendering,\n ...htmlAttributes\n}: ColumnFormattingPanelProps) => {\n const formattingSettingsForType = useMemo(\n () =>\n formattingSettingsByColType({ column, onChangeFormatting, onChangeType }),\n [column, onChangeFormatting, onChangeType]\n );\n\n const ConfigEditor = useMemo<\n React.FC<ConfigurationEditorProps> | undefined\n >(() => {\n const { type } = column;\n if (isTypeDescriptor(type) && isColumnTypeRenderer(type.renderer)) {\n const cellRendererOptions = getCellRendererOptions(type.renderer.name);\n return getConfigurationEditor(cellRendererOptions?.configEditor);\n }\n return undefined;\n }, [column]);\n\n const selectedCellRenderer = useMemo(() => {\n const { type } = column;\n const [defaultRenderer] = availableRenderers;\n const rendererName =\n isTypeDescriptor(type) && isColumnTypeRenderer(type.renderer)\n ? type.renderer.name\n : undefined;\n const configuredRenderer = availableRenderers.find(\n (renderer) => renderer.name === rendererName\n );\n return configuredRenderer ?? defaultRenderer;\n }, [availableRenderers, column]);\n\n const handleChangeRenderer = useCallback<\n SingleSelectionHandler<CellRendererDescriptor>\n >(\n (_, cellRendererDescriptor) => {\n const renderProps: ColumnTypeRendering = {\n name: cellRendererDescriptor.name,\n };\n onChangeRendering?.(renderProps);\n },\n [onChangeRendering]\n );\n\n const { serverDataType = \"string\" } = column;\n\n return (\n <div {...htmlAttributes} className={`vuuColumnSettingsPanel-header`}>\n <div>Formatting</div>\n\n <FormField>\n <FormFieldLabel>\n {`Renderer (data type ${column.serverDataType})`}\n </FormFieldLabel>\n <Dropdown<CellRendererDescriptor>\n className={cx(`${classBase}-renderer`)}\n itemToString={itemToString}\n onSelectionChange={handleChangeRenderer}\n selected={selectedCellRenderer}\n source={availableRenderers}\n width=\"100%\"\n />\n </FormField>\n <div\n className={cx(classBase, className, `${classBase}-${serverDataType}`)}\n >\n {formattingSettingsForType}\n {ConfigEditor ? (\n <ConfigEditor\n column={column as ColumnDescriptorCustomRenderer}\n onChangeRendering={onChangeRendering}\n />\n ) : null}\n </div>\n </div>\n );\n};\n\nfunction formattingSettingsByColType(props: FormattingSettingsProps) {\n const { column } = props;\n\n switch (column.serverDataType) {\n case \"double\":\n case \"int\":\n return <BaseNumericFormattingSettings {...props} />;\n case \"long\":\n return <LongTypeFormattingSettings {...props} />;\n default:\n return null;\n }\n}\n", "import { FormField, FormFieldLabel, Input, Switch } from \"@salt-ds/core\";\nimport { ColumnTypeFormatting } from \"@vuu-ui/vuu-table-types\";\nimport { getTypeFormattingFromColumn } from \"@vuu-ui/vuu-utils\";\nimport {\n ChangeEvent,\n KeyboardEvent,\n SyntheticEvent,\n useCallback,\n useState,\n} from \"react\";\nimport { FormattingSettingsProps } from \"./types\";\n\nconst classBase = \"vuuFormattingSettings\";\n\nexport const BaseNumericFormattingSettings = ({\n column,\n onChangeFormatting: onChange,\n}: FormattingSettingsProps) => {\n const [formattingSettings, setFormattingSettings] =\n useState<ColumnTypeFormatting>(getTypeFormattingFromColumn(column));\n\n const handleInputKeyDown = useCallback(\n (evt: KeyboardEvent<HTMLInputElement>) => {\n if (evt.key === \"Enter\" || evt.key === \"Tab\") {\n onChange(formattingSettings);\n }\n },\n [formattingSettings, onChange]\n );\n\n const handleChangeDecimals = useCallback(\n (evt: SyntheticEvent) => {\n const { value } = evt.target as HTMLFormElement;\n const numericValue: number | undefined =\n value === \"\"\n ? undefined\n : isNaN(parseInt(value))\n ? undefined\n : parseInt(value);\n\n const newFormattingSettings = {\n ...formattingSettings,\n decimals: numericValue,\n };\n setFormattingSettings(newFormattingSettings);\n },\n [formattingSettings]\n );\n\n const handleChangeAlignDecimals = useCallback(\n (evt: ChangeEvent<HTMLInputElement>) => {\n const { checked } = evt.target as HTMLInputElement;\n const newFormattingSettings = {\n ...formattingSettings,\n alignOnDecimals: checked,\n };\n setFormattingSettings(newFormattingSettings);\n onChange(newFormattingSettings);\n },\n [formattingSettings, onChange]\n );\n\n const handleChangeZeroPad = useCallback(\n (evt: ChangeEvent<HTMLInputElement>) => {\n const { checked } = evt.target as HTMLInputElement;\n const newFormattingSettings = {\n ...formattingSettings,\n zeroPad: checked,\n };\n setFormattingSettings(newFormattingSettings);\n onChange(newFormattingSettings);\n },\n [formattingSettings, onChange]\n );\n\n return (\n <div className={classBase}>\n <FormField data-field=\"decimals\">\n <FormFieldLabel>Number of decimals</FormFieldLabel>\n <Input\n className=\"vuuInput\"\n onChange={handleChangeDecimals}\n onKeyDown={handleInputKeyDown}\n value={formattingSettings.decimals ?? \"\"}\n />\n </FormField>\n\n <FormField labelPlacement=\"left\">\n <FormFieldLabel>Align on decimals</FormFieldLabel>\n <Switch\n checked={formattingSettings.alignOnDecimals ?? false}\n onChange={handleChangeAlignDecimals}\n value=\"align-decimals\"\n />\n </FormField>\n <FormField labelPlacement=\"left\">\n <FormFieldLabel>Zero pad decimals</FormFieldLabel>\n <Switch\n checked={formattingSettings.zeroPad ?? false}\n onChange={handleChangeZeroPad}\n value=\"zero-pad\"\n />\n </FormField>\n </div>\n );\n};\n", "import React, { useCallback } from \"react\";\nimport {\n FormField,\n FormFieldLabel,\n ToggleButton,\n ToggleButtonGroup,\n} from \"@salt-ds/core\";\nimport { isDateTimeColumn, isTypeDescriptor } from \"@vuu-ui/vuu-utils\";\nimport { DateTimeFormattingSettings } from \"./DateTimeFormattingSettings\";\nimport { BaseNumericFormattingSettings } from \"./BaseNumericFormattingSettings\";\nimport { FormattingSettingsProps } from \"./types\";\n\nimport \"./LongTypeFormattingSettings.css\";\n\nconst classBase = \"vuuLongColumnFormattingSettings\";\n\nexport const LongTypeFormattingSettings: React.FC<FormattingSettingsProps> = (\n props\n) => {\n const { column, onChangeType } = props;\n const type = isTypeDescriptor(column.type) ? column.type.name : column.type;\n\n const handleToggleChange = useCallback(\n (event: React.SyntheticEvent<HTMLButtonElement, Event>) => {\n const value = event.currentTarget.value as ToggleValue;\n onChangeType(value);\n },\n [onChangeType]\n );\n\n return (\n <div className={classBase}>\n <FormField>\n <FormFieldLabel>{\"Type inferred as\"}</FormFieldLabel>\n <ToggleButtonGroup\n className=\"vuuToggleButtonGroup\"\n onChange={handleToggleChange}\n value={type ?? \"number\"}\n >\n {toggleValues.map((v) => (\n <ToggleButton key={v} value={v}>\n {v.toUpperCase()}\n </ToggleButton>\n ))}\n </ToggleButtonGroup>\n </FormField>\n\n {isDateTimeColumn(column) ? (\n <DateTimeFormattingSettings {...props} column={column} />\n ) : (\n <BaseNumericFormattingSettings {...props} />\n )}\n </div>\n );\n};\n\nconst toggleValues = [\"number\", \"date/time\"] as const;\ntype ToggleValue = (typeof toggleValues)[number];\n", "import React, { SyntheticEvent, useCallback, useMemo, useState } from \"react\";\nimport { Dropdown, SingleSelectionHandler } from \"@vuu-ui/vuu-ui-controls\";\nimport {\n DateTimePattern,\n defaultPatternsByType,\n fallbackDateTimePattern,\n getTypeFormattingFromColumn,\n supportedDateTimePatterns,\n} from \"@vuu-ui/vuu-utils\";\nimport {\n FormField,\n FormFieldLabel,\n ToggleButton,\n ToggleButtonGroup,\n} from \"@salt-ds/core\";\nimport { DateTimeColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { FormattingSettingsProps } from \"./types\";\n\nexport const DateTimeFormattingSettings: React.FC<\n FormattingSettingsProps<DateTimeColumnDescriptor>\n> = ({ column, onChangeFormatting: onChange }) => {\n const formatting = getTypeFormattingFromColumn(column);\n const { pattern = fallbackDateTimePattern } = formatting;\n const toggleValue = useMemo(() => getToggleValue(pattern), [pattern]);\n\n const [fallbackState, setFallbackState] = useState<Required<DateTimePattern>>(\n {\n time: pattern.time ?? defaultPatternsByType.time,\n date: pattern.date ?? defaultPatternsByType.date,\n }\n );\n\n const onPatternChange = useCallback(\n (pattern: DateTimePattern) => onChange({ ...formatting, pattern }),\n [onChange, formatting]\n );\n\n const onDropdownChange = useCallback<\n <T extends keyof DateTimePattern>(\n key: T\n ) => SingleSelectionHandler<Required<DateTimePattern>[T]>\n >(\n (key) => (_, p) => {\n const updatedPattern = { ...(pattern ?? {}), [key]: p };\n setFallbackState((s) => ({\n time: updatedPattern.time ?? s.time,\n date: updatedPattern.date ?? s.date,\n }));\n onPatternChange(updatedPattern);\n },\n [onPatternChange, pattern]\n );\n\n const onToggleChange = useCallback(\n (evnt: SyntheticEvent<HTMLButtonElement, Event>) => {\n const value = evnt.currentTarget.value as ToggleValue;\n switch (value) {\n case \"time\":\n return onPatternChange({\n [value]: pattern[value] ?? fallbackState[value],\n });\n case \"date\":\n return onPatternChange({\n [value]: pattern[value] ?? fallbackState[value],\n });\n case \"both\":\n return onPatternChange({\n time: pattern.time ?? fallbackState.time,\n date: pattern.date ?? fallbackState.date,\n });\n }\n },\n [onPatternChange, pattern, fallbackState]\n );\n\n return (\n <>\n <FormField labelPlacement=\"left\">\n <FormFieldLabel>{\"Display\"}</FormFieldLabel>\n <ToggleButtonGroup\n className=\"vuuToggleButtonGroup\"\n onChange={onToggleChange}\n value={toggleValue}\n >\n {toggleValues.map((v) => (\n <ToggleButton key={v} value={v}>\n {v.toUpperCase()}\n </ToggleButton>\n ))}\n </ToggleButtonGroup>\n </FormField>\n\n {([\"date\", \"time\"] as const)\n .filter((v) => !!pattern[v])\n .map((v) => (\n <FormField labelPlacement=\"left\" key={v}>\n <FormFieldLabel>{`${labelByType[v]} pattern`}</FormFieldLabel>\n <Dropdown<Required<DateTimePattern>[typeof v]>\n onSelectionChange={onDropdownChange(v)}\n selected={pattern[v]}\n source={supportedDateTimePatterns[v]}\n width=\"100%\"\n />\n </FormField>\n ))}\n </>\n );\n};\n\nconst labelByType = { date: \"Date\", time: \"Time\" } as const;\n\nconst toggleValues = [\"date\", \"time\", \"both\"] as const;\n\ntype ToggleValue = (typeof toggleValues)[number];\n\nfunction getToggleValue(pattern: DateTimePattern): ToggleValue {\n return !pattern.time ? \"date\" : !pattern.date ? \"time\" : \"both\";\n}\n", "import { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport cx from \"clsx\";\n\nimport {\n getCalculatedColumnDetails,\n isCalculatedColumn,\n} from \"@vuu-ui/vuu-utils\";\n\nimport \"./ColumnNameLabel.css\";\nimport { MouseEventHandler } from \"react\";\n\nconst classBase = \"vuuColumnNameLabel\";\n\nexport interface ColumnNameLabelProps {\n column: ColumnDescriptor;\n onClick: MouseEventHandler;\n}\n\nexport const ColumnNameLabel = ({ column, onClick }: ColumnNameLabelProps) => {\n if (isCalculatedColumn(column.name)) {\n const [name, type, expression] = getCalculatedColumnDetails(column);\n const displayName = name || \"name\";\n const displayExpression = \"=expression\";\n\n const nameClass =\n displayName === \"name\" ? `${classBase}-placeholder` : undefined;\n const expressionClass =\n expression === \"\" ? `${classBase}-placeholder` : undefined;\n return (\n <div\n className={cx(classBase, `${classBase}-calculated`)}\n onClick={onClick}\n >\n <span className={nameClass}>{displayName}</span>\n <span>:</span>\n <span>{type || \"string\"}</span>\n <span>:</span>\n <span className={expressionClass}>{displayExpression}</span>\n <span className={`${classBase}-edit`} data-icon=\"edit\" />\n </div>\n );\n } else {\n return <div className={classBase}>{column.name}</div>;\n }\n};\n", "import {\n ColumnDescriptor,\n TableConfig,\n ColumnTypeFormatting,\n ColumnSettingsProps,\n ColumnTypeSimple,\n} from \"@vuu-ui/vuu-table-types\";\n\nimport {\n CellRendererDescriptor,\n ColumnRenderPropsChangeHandler,\n getRegisteredCellRenderers,\n isValidColumnAlignment,\n isValidPinLocation,\n setCalculatedColumnName,\n updateColumnRenderProps,\n updateColumnFormatting,\n updateColumnType,\n} from \"@vuu-ui/vuu-utils\";\nimport {\n FormEventHandler,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nconst integerCellRenderers: CellRendererDescriptor[] = [\n {\n description: \"Default formatter for columns with data type integer\",\n label: \"Default Renderer (int, long)\",\n name: \"default-int\",\n },\n ...getRegisteredCellRenderers(\"int\"),\n];\nconst doubleCellRenderers: CellRendererDescriptor[] = [\n {\n description: \"Default formatter for columns with data type double\",\n label: \"Default Renderer (double)\",\n name: \"default-double\",\n },\n ...getRegisteredCellRenderers(\"double\"),\n];\n\nconst stringCellRenderers: CellRendererDescriptor[] = [\n {\n description: \"Default formatter for columns with data type string\",\n label: \"Default Renderer (string)\",\n name: \"default-string\",\n },\n ...getRegisteredCellRenderers(\"string\"),\n];\n\nconst booleanCellRenderers: CellRendererDescriptor[] = [\n ...getRegisteredCellRenderers(\"boolean\"),\n];\n\nconst getAvailableCellRenderers = (\n column: ColumnDescriptor\n): CellRendererDescriptor[] => {\n switch (column.serverDataType) {\n case \"char\":\n case \"string\":\n return stringCellRenderers;\n case \"int\":\n case \"long\":\n return integerCellRenderers;\n case \"double\":\n return doubleCellRenderers;\n case \"boolean\":\n return booleanCellRenderers;\n default:\n return stringCellRenderers;\n }\n};\n\nconst getFieldName = (input: HTMLInputElement): string => {\n const saltFormField = input.closest(\".saltFormField\") as HTMLElement;\n if (saltFormField && saltFormField.dataset.field) {\n const {\n dataset: { field },\n } = saltFormField;\n return field;\n } else {\n throw Error(\"named form field not found\");\n }\n};\n\nconst getColumn = (columns: ColumnDescriptor[], column: ColumnDescriptor) => {\n if (column.name === \"::\") {\n // this is a new calculated column\n return column;\n } else {\n const col = columns.find((col) => col.name === column.name);\n if (col) {\n return col;\n }\n throw Error(`columns does not contain column ${name}`);\n }\n};\n\nconst replaceColumn = (\n tableConfig: TableConfig,\n column: ColumnDescriptor\n): TableConfig => ({\n ...tableConfig,\n columns: tableConfig.columns.map((col) =>\n col.name === column.name ? column : col\n ),\n});\n\nexport const useColumnSettings = ({\n column: columnProp,\n onCancelCreateColumn,\n onConfigChange,\n onCreateCalculatedColumn,\n tableConfig,\n}: Omit<ColumnSettingsProps, \"vuuTable\">) => {\n const [column, setColumn] = useState<ColumnDescriptor>(\n getColumn(tableConfig.columns, columnProp)\n );\n const columnRef = useRef<ColumnDescriptor>(column);\n const [inEditMode, setEditMode] = useState(column.name === \"::\");\n\n const handleEditCalculatedcolumn = useCallback(() => {\n columnRef.current = column;\n setEditMode(true);\n }, [column]);\n\n useEffect(() => {\n setColumn(columnProp);\n setEditMode(columnProp.name === \"::\");\n }, [columnProp]);\n\n const availableRenderers = useMemo(() => {\n return getAvailableCellRenderers(column);\n }, [column]);\n\n const handleInputCommit = useCallback(() => {\n onConfigChange(replaceColumn(tableConfig, column));\n }, [column, onConfigChange, tableConfig]);\n\n const handleChange = useCallback<FormEventHandler>(\n (evt) => {\n const input = evt.target as HTMLInputElement;\n const fieldName = getFieldName(input);\n const { value } = input;\n switch (fieldName) {\n case \"column-label\":\n setColumn((state) => ({ ...state, label: value }));\n break;\n case \"column-name\":\n setColumn((state) => setCalculatedColumnName(state, value));\n break;\n case \"column-width\":\n setColumn((state) => ({ ...state, width: parseInt(value) }));\n break;\n case \"column-alignment\":\n if (isValidColumnAlignment(value)) {\n const newColumn: ColumnDescriptor = {\n ...column,\n align: value || undefined,\n };\n setColumn(newColumn);\n onConfigChange(replaceColumn(tableConfig, newColumn));\n }\n break;\n case \"column-pin\":\n if (isValidPinLocation(value)) {\n const newColumn: ColumnDescriptor = {\n ...column,\n pin: value || undefined,\n };\n setColumn(newColumn);\n onConfigChange(replaceColumn(tableConfig, newColumn));\n\n break;\n }\n }\n },\n [column, onConfigChange, tableConfig]\n );\n\n const handleChangeCalculatedColumnName = useCallback((name: string) => {\n setColumn((state) => ({ ...state, name }));\n }, []);\n\n const handleChangeFormatting = useCallback(\n (formatting: ColumnTypeFormatting) => {\n const newColumn = updateColumnFormatting(column, formatting);\n setColumn(newColumn);\n onConfigChange(replaceColumn(tableConfig, newColumn));\n },\n [column, onConfigChange, tableConfig]\n );\n\n const handleChangeType = useCallback(\n (type: ColumnTypeSimple) => {\n const updatedColumn = updateColumnType(column, type);\n setColumn(updatedColumn);\n onConfigChange(replaceColumn(tableConfig, updatedColumn));\n },\n [column, onConfigChange, tableConfig]\n );\n\n const handleChangeRendering = useCallback<ColumnRenderPropsChangeHandler>(\n (renderProps) => {\n if (renderProps) {\n const newColumn: ColumnDescriptor = updateColumnRenderProps(\n column,\n renderProps\n );\n setColumn(newColumn);\n onConfigChange(replaceColumn(tableConfig, newColumn));\n }\n },\n [column, onConfigChange, tableConfig]\n );\n\n const navigateColumn = useCallback(\n ({ moveBy }: { moveBy: number }) => {\n const { columns } = tableConfig;\n const index = columns.indexOf(column) + moveBy;\n const newColumn = columns[index];\n if (newColumn) {\n setColumn(newColumn);\n }\n },\n [column, tableConfig]\n );\n const navigateNextColumn = useCallback(() => {\n navigateColumn({ moveBy: 1 });\n }, [navigateColumn]);\n\n const navigatePrevColumn = useCallback(() => {\n navigateColumn({ moveBy: -1 });\n }, [navigateColumn]);\n\n const handleSaveCalculatedColumn = useCallback(() => {\n // TODO validate expression, unique name\n onCreateCalculatedColumn(column);\n }, [column, onCreateCalculatedColumn]);\n\n const handleCancelEdit = useCallback(() => {\n if (columnProp.name === \"::\") {\n onCancelCreateColumn();\n } else {\n if (columnRef.current !== undefined && columnRef.current !== column) {\n setColumn(columnRef.current);\n }\n setEditMode(false);\n }\n }, [column, columnProp.name, onCancelCreateColumn]);\n\n return {\n availableRenderers,\n editCalculatedColumn: inEditMode,\n column,\n navigateNextColumn,\n navigatePrevColumn,\n onCancel: handleCancelEdit,\n onChange: handleChange,\n onChangeCalculatedColumnName: handleChangeCalculatedColumnName,\n onChangeFormatting: handleChangeFormatting,\n onChangeRendering: handleChangeRendering,\n onChangeType: handleChangeType,\n onEditCalculatedColumn: handleEditCalculatedcolumn,\n onInputCommit: handleInputCommit,\n onSave: handleSaveCalculatedColumn,\n };\n};\n", "import { DataSource } from \"@vuu-ui/vuu-data-types\";\nimport { VuuRange } from \"@vuu-ui/vuu-protocol-types\";\nimport cx from \"clsx\";\nimport { HTMLAttributes, useEffect, useState } from \"react\";\n\nimport \"./DatasourceStats.css\";\n\ninterface DataSourceStatsProps extends HTMLAttributes<HTMLSpanElement> {\n dataSource: DataSource;\n}\n\nconst classBase = \"vuuDatasourceStats\";\n\nconst numberFormatter = new Intl.NumberFormat();\n\nexport const DataSourceStats = ({\n className: classNameProp,\n dataSource,\n}: DataSourceStatsProps) => {\n const [range, setRange] = useState<VuuRange>(dataSource.range);\n const [size, setSize] = useState(dataSource.size);\n useEffect(() => {\n setSize(dataSource.size);\n\n dataSource.on(\"resize\", setSize);\n dataSource.on(\"range\", setRange);\n }, [dataSource]);\n\n const className = cx(classBase, classNameProp);\n const from = numberFormatter.format(range.from + 1);\n const to = numberFormatter.format(Math.min(range.to, size));\n const value = numberFormatter.format(size);\n return (\n <div className={className}>\n <span className={`${classBase}-label`}>Row count</span>\n <span className={`${classBase}-range`}>{from}</span>\n <span>-</span>\n <span className={`${classBase}-range`}>{to}</span>\n <span>of</span>\n <span className={`${classBase}-size`}>{value}</span>\n </div>\n );\n};\n", "import {\n Button,\n FormField,\n FormFieldLabel,\n Input,\n ToggleButton,\n ToggleButtonGroup,\n} from \"@salt-ds/core\";\nimport { TableSettingsProps } from \"@vuu-ui/vuu-table-types\";\nimport { ColumnList } from \"../column-list\";\nimport { useTableSettings } from \"./useTableSettings\";\n\nimport \"./TableSettingsPanel.css\";\n\nconst classBase = \"vuuTableSettingsPanel\";\n\n/**\n The TableSettingsPanel assumes 'ownership' of the tableSettings.\n It updates the settings in state locally and notifies caller of\n every change via onChange callback\n */\nexport const TableSettingsPanel = ({\n availableColumns,\n onAddCalculatedColumn,\n onConfigChange,\n onDataSourceConfigChange,\n onNavigateToColumn,\n tableConfig: tableConfigProp,\n}: TableSettingsProps) => {\n const {\n columnItems,\n columnLabelsValue,\n onChangeColumnLabels,\n onChangeTableAttribute,\n onColumnChange,\n onMoveListItem,\n tableConfig,\n } = useTableSettings({\n availableColumns,\n onConfigChange,\n onDataSourceConfigChange,\n tableConfig: tableConfigProp,\n });\n\n return (\n <div className={classBase}>\n <FormField>\n <FormFieldLabel>Column Labels</FormFieldLabel>\n <ToggleButtonGroup\n className=\"vuuToggleButtonGroup\"\n onChange={onChangeColumnLabels}\n value={columnLabelsValue}\n >\n <ToggleButton\n className=\"vuuIconToggleButton\"\n data-icon=\"text-strikethrough\"\n value={0}\n />\n <ToggleButton\n className=\"vuuIconToggleButton\"\n data-icon=\"text-Tt\"\n value={1}\n />\n <ToggleButton\n className=\"vuuIconToggleButton\"\n data-icon=\"text-T\"\n value={2}\n />\n </ToggleButtonGroup>\n </FormField>\n\n <FormField>\n <FormFieldLabel>Grid separators</FormFieldLabel>\n <div className=\"saltToggleButtonGroup vuuToggleButtonGroup saltToggleButtonGroup-horizontal vuuGridSeparators\">\n <ToggleButton\n className=\"vuuIconToggleButton\"\n data-icon=\"row-striping\"\n selected={tableConfig.zebraStripes ?? false}\n onChange={onChangeTableAttribute}\n value=\"zebraStripes\"\n />\n <ToggleButton\n className=\"vuuIconToggleButton\"\n data-icon=\"row-lines\"\n selected={tableConfig.rowSeparators ?? false}\n onChange={onChangeTableAttribute}\n value=\"rowSeparators\"\n />\n <ToggleButton\n className=\"vuuIconToggleButton\"\n data-icon=\"col-lines\"\n selected={tableConfig.columnSeparators ?? false}\n onChange={onChangeTableAttribute}\n value=\"columnSeparators\"\n />\n </div>\n </FormField>\n\n <FormField>\n <FormFieldLabel>Default Column Width</FormFieldLabel>\n <Input className=\"vuuInput\" />\n </FormField>\n\n <ColumnList\n columnItems={columnItems}\n onChange={onColumnChange}\n onMoveListItem={onMoveListItem}\n onNavigateToColumn={onNavigateToColumn}\n />\n\n <div className={`${classBase}-calculatedButtonbar`}>\n <Button data-icon=\"plus\" onClick={onAddCalculatedColumn} />\n <span className={`${classBase}-calculatedLabel`}>\n Add calculated column\n </span>\n </div>\n </div>\n );\n};\n", "import { SchemaColumn } from \"@vuu-ui/vuu-data-types\";\nimport { updateTableConfig } from \"@vuu-ui/vuu-table\";\nimport {\n ColumnDescriptor,\n TableConfig,\n TableSettingsProps,\n} from \"@vuu-ui/vuu-table-types\";\nimport {\n addColumnToSubscribedColumns,\n isCalculatedColumn,\n moveItem,\n subscribedOnly,\n useLayoutEffectSkipFirst,\n} from \"@vuu-ui/vuu-utils\";\nimport {\n MouseEvent,\n SyntheticEvent,\n useCallback,\n useMemo,\n useState,\n} from \"react\";\nimport { ColumnChangeHandler } from \"../column-list\";\n\nconst sortOrderFromAvailableColumns = (\n availableColumns: SchemaColumn[],\n columns: ColumnDescriptor[]\n) => {\n const sortedColumns: ColumnDescriptor[] = [];\n for (const { name } of availableColumns) {\n const column = columns.find((col) => col.name === name);\n if (column) {\n sortedColumns.push(column);\n }\n }\n return sortedColumns;\n};\n\nexport type ColumnItem = Pick<\n ColumnDescriptor,\n \"hidden\" | \"label\" | \"name\" | \"serverDataType\"\n> & {\n isCalculated: boolean;\n subscribed: boolean;\n};\n\nconst buildColumnItems = (\n availableColumns: SchemaColumn[],\n configuredColumns: ColumnDescriptor[]\n): ColumnItem[] => {\n return availableColumns.map<ColumnItem>(({ name, serverDataType }) => {\n const configuredColumn = configuredColumns.find((col) => col.name === name);\n return {\n hidden: configuredColumn?.hidden,\n isCalculated: isCalculatedColumn(name),\n label: configuredColumn?.label,\n name,\n serverDataType,\n subscribed: configuredColumn !== undefined,\n };\n });\n};\n\ntype ColumnState = {\n availableColumns: SchemaColumn[];\n tableConfig: TableConfig;\n};\n\nexport const useTableSettings = ({\n availableColumns: availableColumnsProp,\n onConfigChange,\n onDataSourceConfigChange,\n tableConfig: tableConfigProp,\n}: Omit<TableSettingsProps, \"onAddCalculatedColumn\">) => {\n const [{ availableColumns, tableConfig }, setColumnState] =\n useState<ColumnState>({\n availableColumns: availableColumnsProp,\n tableConfig: tableConfigProp,\n });\n\n const columnItems = useMemo(\n () => buildColumnItems(availableColumns, tableConfig.columns),\n [availableColumns, tableConfig.columns]\n );\n\n const handleMoveListItem = useCallback(\n (fromIndex: number, toIndex: number) => {\n setColumnState((state) => {\n const newAvailableColumns = moveItem(\n state.availableColumns,\n fromIndex,\n toIndex\n );\n const newColumns = sortOrderFromAvailableColumns(\n newAvailableColumns,\n tableConfig.columns\n );\n\n return {\n availableColumns: newAvailableColumns,\n tableConfig: {\n ...state.tableConfig,\n columns: newColumns,\n },\n };\n });\n },\n [tableConfig.columns]\n );\n\n const handleColumnChange = useCallback<ColumnChangeHandler>(\n (name, property, value) => {\n // to be applied immediately\n const columnItem = columnItems.find((col) => col.name === name);\n if (property === \"subscribed\") {\n if (columnItem?.subscribed) {\n const subscribedColumns = tableConfig.columns\n .filter((col) => col.name !== name)\n .map((col) => col.name);\n setColumnState((state) => ({\n ...state,\n tableConfig: {\n ...tableConfig,\n columns: tableConfig.columns.filter(\n subscribedOnly(subscribedColumns)\n ),\n },\n }));\n onDataSourceConfigChange({\n columns: subscribedColumns,\n });\n } else {\n const newConfig = {\n ...tableConfig,\n columns: addColumnToSubscribedColumns(\n tableConfig.columns,\n availableColumns,\n name\n ),\n };\n setColumnState((state) => ({\n ...state,\n tableConfig: newConfig,\n }));\n\n const subscribedColumns = newConfig.columns.map((col) => col.name);\n\n onDataSourceConfigChange({\n columns: subscribedColumns,\n });\n }\n } else if (columnItem?.subscribed) {\n const column = tableConfig.columns.find((col) => col.name === name);\n if (column) {\n const newConfig = updateTableConfig(tableConfig, {\n type: \"column-prop\",\n property,\n column,\n value,\n });\n setColumnState((state) => ({\n ...state,\n tableConfig: newConfig,\n }));\n }\n }\n },\n [availableColumns, columnItems, onDataSourceConfigChange, tableConfig]\n );\n\n const handleChangeColumnLabels = useCallback((evt: SyntheticEvent) => {\n const { value } = evt.target as HTMLFormElement;\n const columnFormatHeader =\n value === \"0\" ? undefined : value === \"1\" ? \"capitalize\" : \"uppercase\";\n setColumnState((state) => ({\n ...state,\n tableConfig: {\n ...state.tableConfig,\n columnFormatHeader,\n },\n }));\n }, []);\n\n const handleChangeTableAttribute = useCallback(\n (evt: MouseEvent<HTMLButtonElement>) => {\n const { ariaChecked, value } = evt.target as HTMLInputElement;\n setColumnState((state) => ({\n ...state,\n tableConfig: {\n ...state.tableConfig,\n [value]: ariaChecked !== \"true\",\n },\n }));\n },\n []\n );\n\n useLayoutEffectSkipFirst(() => {\n onConfigChange?.(tableConfig);\n }, [onConfigChange, tableConfig]);\n\n const columnLabelsValue =\n tableConfig.columnFormatHeader === undefined\n ? 0\n : tableConfig.columnFormatHeader === \"capitalize\"\n ? 1\n : 2;\n\n return {\n columnItems,\n columnLabelsValue,\n onChangeColumnLabels: handleChangeColumnLabels,\n onChangeTableAttribute: handleChangeTableAttribute,\n onColumnChange: handleColumnChange,\n onMoveListItem: handleMoveListItem,\n tableConfig,\n };\n};\n"],
5
- "mappings": "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",
6
- "names": ["import_vuu_utils", "isString", "import_vuu_utils", "import_clsx", "import_react", "cx", "import_jsx_runtime", "name", "import_jsx_runtime", "import_react", "import_jsx_runtime", "import_react", "name", "import_vuu_utils", "import_clsx", "import_react", "classBase", "cx", "import_jsx_runtime", "import_react", "classBase", "cx", "import_clsx", "import_react", "import_clsx", "import_react", "import_jsx_runtime", "cx", "import_jsx_runtime", "classBase", "cx", "import_vuu_layout", "import_vuu_popups", "import_vuu_utils", "import_core", "import_clsx", "import_react", "import_vuu_utils", "import_clsx", "import_react", "import_vuu_utils", "import_react", "import_jsx_runtime", "classBase", "name", "import_vuu_utils", "import_react", "import_clsx", "import_jsx_runtime", "classBase", "cx", "import_jsx_runtime", "import_react", "classBase", "cx", "import_vuu_ui_controls", "import_vuu_utils", "import_react", "import_vuu_utils", "name", "import_vuu_utils", "name", "import_vuu_utils", "import_react", "import_vuu_utils", "import_react", "import_vuu_utils", "SELECTED", "_a", "range", "import_react", "import_vuu_utils", "import_react", "_a", "import_vuu_utils", "import_react", "IDX", "import_vuu_popups", "import_vuu_utils", "import_react", "usePopupContextMenu", "import_vuu_utils", "import_react", "name", "pinColumn", "updateTableConfig", "import_vuu_utils", "import_react", "import_react", "import_vuu_utils", "import_vuu_layout", "import_vuu_utils", "import_react", "name", "IS_EXPANDED", "IS_LEAF", "size", "config", "tableConfig", "hideColumns", "columns", "pinColumn", "name", "column", "row", "import_vuu_utils", "import_clsx", "import_vuu_ui_controls", "import_vuu_utils", "import_react", "name", "import_jsx_runtime", "classBase", "cx", "import_jsx_runtime", "classBase", "IDX", "Row", "cx", "data", "import_react", "import_vuu_ui_controls", "import_core", "import_vuu_utils", "import_jsx_runtime", "import_vuu_utils", "import_core", "import_vuu_ui_controls", "import_clsx", "import_jsx_runtime", "classBase", "WarnCommit", "cx", "import_vuu_ui_controls", "import_vuu_utils", "import_clsx", "import_react", "import_vuu_ui_controls", "import_jsx_runtime", "classBase", "name", "ToggleCell", "value", "cx", "import_vuu_ui_controls", "import_vuu_utils", "import_react", "import_vuu_utils", "import_clsx", "import_react", "import_vuu_utils", "import_react", "import_jsx_runtime", "KEY", "classBase", "BackgroundCell", "name", "cx", "import_vuu_utils", "import_core", "import_vuu_ui_controls", "import_react", "import_jsx_runtime", "classBase", "import_vuu_ui_controls", "import_vuu_utils", "import_react", "import_jsx_runtime", "classBase", "DropdownCell", "import_vuu_data_react", "import_vuu_utils", "import_react", "import_jsx_runtime", "LookupCell", "import_vuu_utils", "import_clsx", "import_jsx_runtime", "classBase", "cx", "import_vuu_ui_controls", "import_core", "import_clsx", "import_react", "import_vuu_utils", "import_jsx_runtime", "classBase", "cx", "name", "import_vuu_ui_controls", "import_vuu_utils", "import_core", "import_clsx", "import_vuu_ui_controls", "import_vuu_utils", "import_core", "import_react", "import_react", "import_vuu_codemirror", "import_vuu_utils", "import_react", "tag", "_expressions", "_op", "name", "import_vuu_codemirror", "import_vuu_codemirror", "import_vuu_codemirror", "import_react", "makeSuggestions", "source", "clearInput", "createState", "import_jsx_runtime", "classBase", "import_vuu_codemirror", "import_vuu_data_react", "import_vuu_utils", "import_react", "import_vuu_utils", "name", "name", "import_vuu_utils", "import_react", "name", "column", "import_jsx_runtime", "classBase", "import_vuu_ui_controls", "import_vuu_utils", "import_core", "import_clsx", "import_react", "import_core", "import_vuu_utils", "import_react", "import_jsx_runtime", "classBase", "import_react", "import_core", "import_vuu_utils", "import_react", "import_vuu_ui_controls", "import_vuu_utils", "import_core", "import_jsx_runtime", "pattern", "_a", "_b", "import_jsx_runtime", "classBase", "toggleValues", "import_jsx_runtime", "classBase", "cx", "import_clsx", "import_vuu_utils", "import_jsx_runtime", "classBase", "name", "cx", "import_vuu_utils", "import_react", "col", "replaceColumn", "name", "import_jsx_runtime", "classBase", "getColumnLabel", "name", "cx", "import_clsx", "import_react", "import_jsx_runtime", "classBase", "cx", "import_core", "import_vuu_utils", "import_react", "name", "import_jsx_runtime", "classBase"]
3
+ "sources": ["../../../packages/vuu-table-extras/src/index.ts", "../../../packages/vuu-table-extras/src/cell-edit-validators/CaseValidator.ts", "../../../packages/vuu-table-extras/src/cell-edit-validators/PatternValidator.ts", "../../../packages/vuu-table-extras/src/cell-renderers/background-cell/BackgroundCell.tsx", "../../../packages/vuu-table-extras/src/cell-renderers/background-cell/useDirection.ts", "../../../packages/vuu-table-extras/src/cell-renderers/background-cell/BackgroundCellConfigurationEditor.tsx", "../../../packages/vuu-table-extras/src/cell-renderers/dropdown-cell/DropdownCell.tsx", "../../../packages/vuu-table-extras/src/cell-renderers/lookup-cell/LookupCell.tsx", "../../../packages/vuu-table-extras/src/cell-renderers/progress-cell/ProgressCell.tsx", "../../../packages/vuu-table-extras/src/column-list/ColumnList.tsx", "../../../packages/vuu-table-extras/src/column-settings/ColumnSettingsPanel.tsx", "../../../packages/vuu-table-extras/src/column-expression-panel/ColumnExpressionPanel.tsx", "../../../packages/vuu-table-extras/src/column-expression-input/ColumnExpressionInput.tsx", "../../../packages/vuu-table-extras/src/column-expression-input/useColumnExpressionEditor.ts", "../../../packages/vuu-table-extras/src/column-expression-input/column-language-parser/ColumnExpressionLanguage.ts", "../../../packages/vuu-table-extras/src/column-expression-input/column-language-parser/generated/column-parser.js", "../../../packages/vuu-table-extras/src/column-expression-input/column-language-parser/ColumnExpressionTreeWalker.ts", "../../../packages/vuu-table-extras/src/column-expression-input/column-language-parser/column-expression-parse-utils.ts", "../../../packages/vuu-table-extras/src/column-expression-input/highlighting.ts", "../../../packages/vuu-table-extras/src/column-expression-input/theme.ts", "../../../packages/vuu-table-extras/src/column-expression-input/useColumnAutoComplete.ts", "../../../packages/vuu-table-extras/src/column-expression-input/useColumnExpressionSuggestionProvider.ts", "../../../packages/vuu-table-extras/src/column-expression-input/column-function-descriptors.ts", "../../../packages/vuu-table-extras/src/column-expression-input/functionDocInfo.ts", "../../../packages/vuu-table-extras/src/column-expression-panel/useColumnExpression.ts", "../../../packages/vuu-table-extras/src/column-formatting-settings/ColumnFormattingPanel.tsx", "../../../packages/vuu-table-extras/src/column-formatting-settings/BaseNumericFormattingSettings.tsx", "../../../packages/vuu-table-extras/src/column-formatting-settings/LongTypeFormattingSettings.tsx", "../../../packages/vuu-table-extras/src/column-formatting-settings/DateTimeFormattingSettings.tsx", "../../../packages/vuu-table-extras/src/column-settings/ColumnNameLabel.tsx", "../../../packages/vuu-table-extras/src/column-settings/useColumnSettings.ts", "../../../packages/vuu-table-extras/src/datasource-stats/DatasourceStats.tsx", "../../../packages/vuu-table-extras/src/table-settings/TableSettingsPanel.tsx", "../../../packages/vuu-table-extras/src/table-settings/useTableSettings.ts"],
4
+ "sourcesContent": ["export * from \"./cell-edit-validators\";\nexport * from \"./cell-renderers\";\nexport * from \"./column-list\";\nexport * from \"./column-settings\";\nexport * from \"./column-expression-input\";\nexport * from \"./column-expression-panel\";\nexport * from \"./column-formatting-settings\";\nexport * from \"./datasource-stats\";\nexport * from \"./table-settings\";\n", "import { EditRuleValidator, registerComponent } from \"@vuu-ui/vuu-utils\";\nimport { VuuRowDataItemType } from \"@vuu-ui/vuu-protocol-types\";\n\nconst isString = (value?: VuuRowDataItemType): value is string =>\n typeof value === \"string\";\n\nexport const CaseValidator: EditRuleValidator = (rule, value) => {\n if (isString(value)) {\n if (value === \"\") {\n return true;\n } else if (rule.value === \"lower\" && value.toLowerCase() !== value) {\n return \"value must be all lowercase\";\n } else if (rule.value === \"upper\" && value.toUpperCase() !== value) {\n return \"value must be all uppercase\";\n } else {\n return true;\n }\n } else {\n return \"value must be a string\";\n }\n};\n\nregisterComponent(\"vuu-case\", CaseValidator, \"data-edit-validator\", {});\n", "import { EditRuleValidator, registerComponent } from \"@vuu-ui/vuu-utils\";\nimport { VuuRowDataItemType } from \"@vuu-ui/vuu-protocol-types\";\n\nconst isString = (value?: VuuRowDataItemType): value is string =>\n typeof value === \"string\";\n\nconst defaultMessage = \"value does not match expected pattern\";\n\nexport const PatternValidator: EditRuleValidator = (rule, value) => {\n if (typeof rule.value !== \"string\") {\n throw Error(\"Pattern validation rule must provide pattern\");\n }\n if (isString(value)) {\n if (value === \"\") {\n return true;\n } else {\n const { message = defaultMessage } = rule;\n const pattern = new RegExp(rule.value);\n return pattern.test(value) || message;\n }\n } else {\n return \"value must be a string\";\n }\n};\n\nregisterComponent(\"vuu-pattern\", PatternValidator, \"data-edit-validator\", {});\n", "import { ColumnType, TableCellProps } from \"@vuu-ui/vuu-table-types\";\nimport {\n dataAndColumnUnchanged,\n DOWN1,\n DOWN2,\n isTypeDescriptor,\n metadataKeys,\n registerComponent,\n UP1,\n UP2,\n} from \"@vuu-ui/vuu-utils\";\nimport cx from \"clsx\";\nimport { memo } from \"react\";\nimport { useDirection } from \"./useDirection\";\n\nimport \"./BackgroundCell.css\";\nimport \"./BackgroundKeyframes.css\";\n\nconst CHAR_ARROW_UP = String.fromCharCode(11014);\nconst CHAR_ARROW_DOWN = String.fromCharCode(11015);\n\nconst { KEY } = metadataKeys;\n\nconst classBase = \"vuuBackgroundCell\";\n\n// TODO these sre repeated from PriceFormatter - where shoud they live ?\nconst FlashStyle = {\n ArrowOnly: \"arrow\",\n BackgroundOnly: \"bg-only\",\n ArrowBackground: \"arrow-bg\",\n};\n\nconst getFlashStyle = (colType?: ColumnType) => {\n if (isTypeDescriptor(colType) && colType.renderer) {\n if (\"flashStyle\" in colType.renderer) {\n return colType.renderer[\"flashStyle\"];\n }\n }\n return FlashStyle.BackgroundOnly;\n};\n\nexport const BackgroundCell = memo(function BackgroundCell({\n column,\n columnMap,\n row,\n}: TableCellProps) {\n //TODO what about click handling\n\n const { name, type, valueFormatter } = column;\n const dataIdx = columnMap[name];\n const value = row[dataIdx];\n const flashStyle = getFlashStyle(type);\n const direction = useDirection(row[KEY], value, column);\n const arrow =\n flashStyle === FlashStyle.ArrowOnly ||\n flashStyle === FlashStyle.ArrowBackground\n ? direction === UP1 || direction === UP2\n ? CHAR_ARROW_UP\n : direction === DOWN1 || direction === DOWN2\n ? CHAR_ARROW_DOWN\n : null\n : null;\n\n const dirClass = direction ? ` ` + direction : \"\";\n\n const className = cx(classBase, dirClass, {\n [`${classBase}-backgroundOnly`]: flashStyle === FlashStyle.BackgroundOnly,\n [`${classBase}-arrowOnly`]: flashStyle === FlashStyle.ArrowOnly,\n [`${classBase}-arrowBackground`]: flashStyle === FlashStyle.ArrowBackground,\n });\n\n return (\n <div className={className} tabIndex={-1}>\n <div className={`${classBase}-arrow`}>{arrow}</div>\n {valueFormatter(row[dataIdx])}\n </div>\n );\n},\ndataAndColumnUnchanged);\n\nregisterComponent(\n \"vuu.price-move-background\",\n BackgroundCell,\n \"cell-renderer\",\n {\n description: \"Change background color of cell when value changes\",\n configEditor: \"BackgroundCellConfigurationEditor\",\n label: \"Background Flash\",\n serverDataType: [\"long\", \"int\", \"double\"],\n }\n);\n", "import { RuntimeColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport {\n getMovingValueDirection,\n isTypeDescriptor,\n isValidNumber,\n valueChangeDirection,\n} from \"@vuu-ui/vuu-utils\";\nimport { useEffect, useRef } from \"react\";\n\nconst INITIAL_VALUE = [undefined, undefined, undefined, undefined];\n\ntype State = [string, unknown, RuntimeColumnDescriptor, valueChangeDirection];\n\nexport function useDirection(\n key: string,\n value: unknown,\n column: RuntimeColumnDescriptor\n) {\n const ref = useRef<State>();\n const [prevKey, prevValue, prevColumn, prevDirection] =\n ref.current || INITIAL_VALUE;\n\n const { type: dataType } = column;\n const decimals = isTypeDescriptor(dataType)\n ? dataType.formatting?.decimals\n : undefined;\n\n const direction =\n key === prevKey &&\n isValidNumber(value) &&\n isValidNumber(prevValue) &&\n column === prevColumn\n ? getMovingValueDirection(value, prevDirection, prevValue, decimals)\n : \"\";\n\n useEffect(() => {\n ref.current = [key, value, column, direction];\n });\n\n return direction;\n}\n", "import type { ColumnDescriptorCustomRenderer } from \"@vuu-ui/vuu-table-types\";\nimport { Dropdown, SingleSelectionHandler } from \"@vuu-ui/vuu-ui-controls\";\nimport {\n ConfigurationEditorProps,\n registerConfigurationEditor,\n} from \"@vuu-ui/vuu-utils\";\nimport { FormField, FormFieldLabel } from \"@salt-ds/core\";\nimport { useCallback, useState } from \"react\";\n\nimport \"./BackgroundCellConfigurationEditor.css\";\n\nconst classBase = \"vuuBackgroundCellConfiguration\";\n\ntype FlashOption = {\n label: string;\n value: \"arrow\" | \"bg-only\" | \"arrow-bg\";\n};\n\nconst flashOptions: FlashOption[] = [\n { label: \"Background Only\", value: \"bg-only\" },\n { label: \"Background and Arrow\", value: \"arrow-bg\" },\n { label: \"Arrow Only\", value: \"arrow\" },\n];\n\nconst [defaultFlashOption] = flashOptions;\n\nconst valueFromColumn = (column: ColumnDescriptorCustomRenderer) => {\n const { flashStyle } = column.type.renderer;\n return flashOptions.find((o) => o.value === flashStyle) || defaultFlashOption;\n};\n\nexport const BackgroundCellConfigurationEditor = ({\n column,\n onChangeRendering,\n}: ConfigurationEditorProps) => {\n const [flashStyle, setFlashStyle] = useState<FlashOption | null>(\n valueFromColumn(column)\n );\n const handleSelectionChange = useCallback<\n SingleSelectionHandler<FlashOption>\n >(\n (_, flashOption) => {\n setFlashStyle(flashOption);\n const renderProps = column.type.renderer;\n onChangeRendering({\n ...renderProps,\n flashStyle: flashOption?.value ?? defaultFlashOption.value,\n });\n },\n [column.type, onChangeRendering]\n );\n\n return (\n <FormField>\n <FormFieldLabel>Flash Style</FormFieldLabel>\n <Dropdown<FlashOption>\n className={`${classBase}-flashStyle`}\n onSelectionChange={handleSelectionChange}\n selected={flashStyle}\n source={flashOptions}\n width=\"100%\"\n />\n </FormField>\n );\n};\n\nregisterConfigurationEditor(\n \"BackgroundCellConfigurationEditor\",\n BackgroundCellConfigurationEditor\n);\n", "import { useLookupValues } from \"@vuu-ui/vuu-data-react\";\nimport { ListOption, TableCellRendererProps } from \"@vuu-ui/vuu-table-types\";\nimport {\n Dropdown,\n DropdownOpenKey,\n SingleSelectionHandler,\n WarnCommit,\n} from \"@vuu-ui/vuu-ui-controls\";\nimport {\n dataAndColumnUnchanged,\n dispatchCustomEvent,\n registerComponent,\n} from \"@vuu-ui/vuu-utils\";\nimport { VuuColumnDataType } from \"@vuu-ui/vuu-protocol-types\";\nimport { memo, useCallback, useState } from \"react\";\n\nimport \"./DropdownCell.css\";\n\nconst classBase = \"vuuTableDropdownCell\";\n\nconst openKeys: DropdownOpenKey[] = [\"Enter\", \" \"];\n\nexport const DropdownCell = memo(function DropdownCell({\n column,\n columnMap,\n onCommit = WarnCommit,\n row,\n}: TableCellRendererProps) {\n const dataIdx = columnMap[column.name];\n\n const { initialValue, values } = useLookupValues(column, row[dataIdx]);\n\n const [value, setValue] = useState<ListOption | null>(null);\n\n const handleSelectionChange = useCallback<SingleSelectionHandler<ListOption>>(\n (evt, selectedOption) => {\n if (selectedOption) {\n setValue(selectedOption);\n onCommit(selectedOption.value as VuuColumnDataType).then((response) => {\n if (response === true && evt) {\n dispatchCustomEvent(evt.target as HTMLElement, \"vuu-commit\");\n }\n });\n }\n },\n [onCommit]\n );\n\n return (\n <Dropdown<ListOption>\n className={classBase}\n onSelectionChange={handleSelectionChange}\n openKeys={openKeys}\n selected={value ?? initialValue}\n source={values}\n width={column.width - 17} // temp hack\n />\n );\n},\ndataAndColumnUnchanged);\n\nregisterComponent(\"dropdown-cell\", DropdownCell, \"cell-renderer\", {});\n", "import { useLookupValues } from \"@vuu-ui/vuu-data-react\";\nimport { TableCellRendererProps } from \"@vuu-ui/vuu-table-types\";\nimport { dataAndColumnUnchanged, registerComponent } from \"@vuu-ui/vuu-utils\";\nimport { memo } from \"react\";\n\n// const classBase = \"vuuTableLookupCell\";\n\nexport const LookupCell = memo(function LookupCell({\n column,\n columnMap,\n row,\n}: TableCellRendererProps) {\n const dataIdx = columnMap[column.name];\n const { initialValue: value } = useLookupValues(column, row[dataIdx]);\n return <span>{value?.label}</span>;\n},\ndataAndColumnUnchanged);\n\nregisterComponent(\"lookup-cell\", LookupCell, \"cell-renderer\", {});\n", "import { TableCellProps } from \"@vuu-ui/vuu-table-types\";\nimport {\n isColumnTypeRenderer,\n isTypeDescriptor,\n isValidNumber,\n registerComponent,\n} from \"@vuu-ui/vuu-utils\";\nimport cx from \"clsx\";\nimport { CSSProperties } from \"react\";\n\nimport \"./ProgressCell.css\";\n\nconst classBase = \"vuuProgressCell\";\n\nconst ProgressCell = ({ column, columnMap, row }: TableCellProps) => {\n //TODO what about click handling\n\n const { name, type } = column;\n const value = row[columnMap[name]];\n let showProgress = false;\n let percentage = 0;\n\n if (isTypeDescriptor(type) && isColumnTypeRenderer(type.renderer)) {\n const { associatedField } = type.renderer;\n if (associatedField) {\n const associatedValue = row[columnMap[associatedField]];\n if (typeof isValidNumber(value) && isValidNumber(associatedValue)) {\n percentage = Math.min(Math.round((value / associatedValue) * 100), 100);\n percentage = Math.min(Math.round((value / associatedValue) * 100), 100);\n showProgress = isFinite(percentage);\n } else {\n // Temp workaround for bug on server that sends aggregated values as strings\n const floatValue = parseFloat(value as string);\n if (Number.isFinite(floatValue)) {\n const floatOtherValue = parseFloat(associatedValue as string);\n if (Number.isFinite(floatOtherValue)) {\n percentage = Math.min(\n Math.round((floatValue / floatOtherValue) * 100),\n 100\n );\n showProgress = isFinite(percentage);\n }\n }\n }\n } else {\n throw Error(\"ProgressCell associatedField is required to render\");\n }\n }\n\n const className = cx(classBase, {});\n\n return (\n <div className={className} tabIndex={-1}>\n {showProgress ? (\n <span className={`${classBase}-track`}>\n <span className={`${classBase}-bg`} />\n <span\n className={`${classBase}-bar`}\n style={\n { \"--progress-bar-pct\": `-${100 - percentage}%` } as CSSProperties\n }\n />\n </span>\n ) : null}\n <span className={`${classBase}-text`}>{`${percentage} %`}</span>\n </div>\n );\n};\n\nregisterComponent(\"vuu.progress\", ProgressCell, \"cell-renderer\", {\n description: \"Progress formatter\",\n label: \"Progress formatter\",\n serverDataType: [\"long\", \"int\", \"double\"],\n});\n", "import { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport {\n List,\n ListItem,\n ListItemProps,\n ListProps,\n} from \"@vuu-ui/vuu-ui-controls\";\nimport { Checkbox, Switch } from \"@salt-ds/core\";\nimport cx from \"clsx\";\nimport {\n HTMLAttributes,\n MouseEventHandler,\n SyntheticEvent,\n useCallback,\n} from \"react\";\nimport { ColumnItem } from \"../table-settings\";\nimport { getColumnLabel } from \"@vuu-ui/vuu-utils\";\n\nimport \"./ColumnList.css\";\n\nconst classBase = \"vuuColumnList\";\nconst classBaseListItem = \"vuuColumnListItem\";\n\nexport type ColumnChangeHandler = (\n columnName: string,\n propertyName: keyof ColumnDescriptor | \"subscribed\",\n value: string | number | boolean\n) => void;\n\nexport interface ColumnListProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n columnItems: ColumnItem[];\n onChange: ColumnChangeHandler;\n onMoveListItem: ListProps[\"onMoveListItem\"];\n onNavigateToColumn?: (columnName: string) => void;\n}\n\nconst ColumnListItem = ({\n className: classNameProp,\n item,\n ...listItemProps\n}: ListItemProps<ColumnItem>) => {\n return (\n <ListItem\n {...listItemProps}\n className={cx(classNameProp, classBaseListItem)}\n data-name={item?.name}\n >\n <span className={`${classBase}-icon`} data-icon=\"draggable\" />\n {item?.isCalculated ? (\n <span className={`${classBase}-icon`} data-icon=\"function\" />\n ) : (\n <Switch className={`${classBase}-switch`} checked={item?.subscribed} />\n )}\n <span className={`${classBase}-text`}>\n {getColumnLabel(item as ColumnDescriptor)}\n </span>\n <Checkbox\n className={`${classBase}-checkBox`}\n checked={item?.hidden !== true}\n disabled={item?.subscribed !== true}\n />\n </ListItem>\n );\n};\n\nexport const ColumnList = ({\n columnItems,\n onChange,\n onMoveListItem,\n onNavigateToColumn,\n ...htmlAttributes\n}: ColumnListProps) => {\n const handleChange = useCallback(\n (evt: SyntheticEvent) => {\n const input = evt.target as HTMLInputElement;\n const listItem = input.closest(`.${classBaseListItem}`) as HTMLElement;\n const {\n dataset: { name },\n } = listItem;\n if (name) {\n const saltSwitch = input.closest(`.${classBase}-switch`) as HTMLElement;\n const saltCheckbox = input.closest(\n `.${classBase}-checkBox`\n ) as HTMLElement;\n\n if (saltSwitch) {\n onChange(name, \"subscribed\", input.checked);\n } else if (saltCheckbox) {\n onChange(name, \"hidden\", input.checked === false);\n }\n }\n },\n [onChange]\n );\n\n const handleClick = useCallback<MouseEventHandler>((evt) => {\n const targetEl = evt.target as HTMLElement;\n if (targetEl.classList.contains(\"vuuColumnList-text\")) {\n const listItemEl = targetEl.closest(\".vuuListItem\") as HTMLElement;\n if (listItemEl?.dataset.name) {\n onNavigateToColumn?.(listItemEl.dataset.name);\n }\n }\n }, []);\n\n return (\n <div {...htmlAttributes} className={classBase}>\n <div className={`${classBase}-header`}>\n <span>Column Selection</span>\n </div>\n <div className={`${classBase}-colHeadings`}>\n <span>Column subscription</span>\n <span>Visibility</span>\n </div>\n <List<ColumnItem, \"none\">\n ListItem={ColumnListItem}\n allowDragDrop\n height=\"auto\"\n onChange={handleChange}\n onClick={handleClick}\n onMoveListItem={onMoveListItem}\n selectionStrategy=\"none\"\n source={columnItems}\n itemHeight={33}\n />\n </div>\n );\n};\n", "import { ColumnDescriptor, ColumnSettingsProps } from \"@vuu-ui/vuu-table-types\";\nimport { VuuInput } from \"@vuu-ui/vuu-ui-controls\";\nimport {\n getCalculatedColumnName,\n getDefaultAlignment,\n isCalculatedColumn,\n} from \"@vuu-ui/vuu-utils\";\nimport {\n Button,\n FormField,\n FormFieldLabel,\n ToggleButton,\n ToggleButtonGroup,\n} from \"@salt-ds/core\";\nimport cx from \"clsx\";\nimport { ColumnExpressionPanel } from \"../column-expression-panel\";\nimport { ColumnFormattingPanel } from \"../column-formatting-settings\";\nimport { ColumnNameLabel } from \"./ColumnNameLabel\";\nimport { useColumnSettings } from \"./useColumnSettings\";\n\nimport \"./ColumnSettingsPanel.css\";\n\nconst classBase = \"vuuColumnSettingsPanel\";\n\nconst getColumnLabel = (column: ColumnDescriptor) => {\n const { name, label } = column;\n if (isCalculatedColumn(name)) {\n return label ?? getCalculatedColumnName(column);\n } else {\n return label ?? name;\n }\n};\n\nexport const ColumnSettingsPanel = ({\n column: columnProp,\n onCancelCreateColumn,\n onConfigChange,\n onCreateCalculatedColumn,\n tableConfig,\n vuuTable,\n}: ColumnSettingsProps) => {\n const isNewCalculatedColumn = columnProp.name === \"::\";\n const {\n availableRenderers,\n editCalculatedColumn,\n column,\n navigateNextColumn,\n navigatePrevColumn,\n onCancel,\n onChange,\n onChangeCalculatedColumnName,\n onChangeFormatting,\n onChangeRendering,\n onChangeType,\n onEditCalculatedColumn,\n onInputCommit,\n onSave,\n } = useColumnSettings({\n column: columnProp,\n onCancelCreateColumn,\n onConfigChange,\n onCreateCalculatedColumn,\n tableConfig,\n });\n\n const {\n serverDataType,\n align = getDefaultAlignment(serverDataType),\n pin,\n width,\n } = column;\n\n return (\n <div\n className={cx(classBase, {\n [`${classBase}-editing`]: editCalculatedColumn,\n })}\n >\n <div className={`${classBase}-header`}>\n <ColumnNameLabel column={column} onClick={onEditCalculatedColumn} />\n </div>\n\n {editCalculatedColumn ? (\n <ColumnExpressionPanel\n column={column}\n onChangeName={onChangeCalculatedColumnName}\n tableConfig={tableConfig}\n vuuTable={vuuTable}\n />\n ) : null}\n\n <FormField data-field=\"column-label\">\n <FormFieldLabel>Column Label</FormFieldLabel>\n <VuuInput\n className=\"vuuInput\"\n onChange={onChange}\n onCommit={onInputCommit}\n value={getColumnLabel(column)}\n />\n </FormField>\n\n <FormField data-field=\"column-width\">\n <FormFieldLabel>Column Width</FormFieldLabel>\n <VuuInput\n className=\"vuuInput\"\n onChange={onChange}\n value={width}\n onCommit={onInputCommit}\n />\n </FormField>\n <FormField data-field=\"column-alignment\">\n <FormFieldLabel>Alignment</FormFieldLabel>\n <ToggleButtonGroup\n className=\"vuuToggleButtonGroup\"\n onChange={onChange}\n value={align}\n >\n <ToggleButton\n data-icon=\"align-left\"\n className=\"vuuIconToggleButton\"\n value=\"left\"\n />\n <ToggleButton\n data-icon=\"align-right\"\n className=\"vuuIconToggleButton\"\n value=\"right\"\n />\n </ToggleButtonGroup>\n </FormField>\n <FormField data-field=\"column-pin\">\n <FormFieldLabel>Pin Column</FormFieldLabel>\n <ToggleButtonGroup\n className=\"vuuToggleButtonGroup\"\n onChange={onChange}\n value={pin ?? \"\"}\n >\n <ToggleButton\n className=\"vuuIconToggleButton\"\n data-icon=\"cross-circle\"\n value=\"\"\n />\n <ToggleButton\n className=\"vuuIconToggleButton\"\n data-icon=\"pin-left\"\n value=\"left\"\n />\n <ToggleButton\n className=\"vuuIconToggleButton\"\n data-icon=\"pin-float\"\n value=\"floating\"\n />\n <ToggleButton\n className=\"vuuIconToggleButton\"\n data-icon=\"pin-right\"\n value=\"right\"\n />\n </ToggleButtonGroup>\n </FormField>\n <ColumnFormattingPanel\n availableRenderers={availableRenderers}\n column={column}\n onChangeFormatting={onChangeFormatting}\n onChangeRendering={onChangeRendering}\n onChangeType={onChangeType}\n />\n\n {editCalculatedColumn ? (\n <div className=\"vuuColumnSettingsPanel-buttonBar\" data-align=\"right\">\n <Button\n className={`${classBase}-buttonCancel`}\n onClick={onCancel}\n tabIndex={-1}\n >\n cancel\n </Button>\n <Button\n className={`${classBase}-buttonSave`}\n onClick={onSave}\n variant=\"cta\"\n >\n save\n </Button>\n </div>\n ) : (\n <div\n className={`${classBase}-buttonBar`}\n data-align={isNewCalculatedColumn ? \"right\" : undefined}\n >\n <Button\n className={`${classBase}-buttonNavPrev`}\n variant=\"secondary\"\n data-icon=\"arrow-left\"\n onClick={navigatePrevColumn}\n >\n PREVIOUS\n </Button>\n <Button\n className={`${classBase}-buttonNavNext`}\n variant=\"secondary\"\n data-icon=\"arrow-right\"\n onClick={navigateNextColumn}\n >\n NEXT\n </Button>\n </div>\n )}\n </div>\n );\n};\n", "import { ColumnDescriptor, ColumnSettingsProps } from \"@vuu-ui/vuu-table-types\";\nimport { Dropdown } from \"@vuu-ui/vuu-ui-controls\";\nimport {\n getCalculatedColumnExpression,\n getCalculatedColumnName,\n getCalculatedColumnType,\n} from \"@vuu-ui/vuu-utils\";\nimport { FormField, FormFieldLabel, Input } from \"@salt-ds/core\";\nimport { HTMLAttributes, useCallback, useRef } from \"react\";\nimport {\n ColumnExpressionInput,\n ColumnExpressionSubmitHandler,\n useColumnExpressionSuggestionProvider,\n} from \"../column-expression-input\";\nimport { useColumnExpression } from \"./useColumnExpression\";\n\nconst classBase = \"vuuColumnExpressionPanel\";\n\nexport interface ColumnExpressionPanelProps\n extends HTMLAttributes<HTMLDivElement>,\n Pick<ColumnSettingsProps, \"tableConfig\" | \"vuuTable\"> {\n column: ColumnDescriptor;\n /**\n * Callback prop, invoked on every change to calculated column definition\n * @param calculatedColumnName the full calculated column name\n */\n onChangeName?: (name: string) => void;\n}\n\nexport const ColumnExpressionPanel = ({\n column: columnProp,\n onChangeName: onChangeNameProp,\n tableConfig,\n vuuTable,\n}: ColumnExpressionPanelProps) => {\n const typeRef = useRef<HTMLDivElement>(null);\n const { column, onChangeExpression, onChangeName, onChangeType } =\n useColumnExpression({\n column: columnProp,\n onChangeName: onChangeNameProp,\n });\n // The initial value to pass into the Expression Input. That is a\n // CodeMirror editor and will manage its own state once initialised.\n const initialExpressionRef = useRef<string>(\n getCalculatedColumnExpression(column)\n );\n\n const suggestionProvider = useColumnExpressionSuggestionProvider({\n columns: tableConfig.columns,\n table: vuuTable,\n });\n\n const handleSubmitExpression =\n useCallback<ColumnExpressionSubmitHandler>(() => {\n if (typeRef.current) {\n (\n typeRef.current?.querySelector(\"button\") as HTMLButtonElement\n )?.focus();\n }\n }, []);\n\n return (\n <div className={classBase}>\n <div className=\"vuuColumnSettingsPanel-header\">\n <span>Calculation</span>\n </div>\n\n <FormField data-field=\"column-name\">\n <FormFieldLabel>Column Name</FormFieldLabel>\n <Input\n className=\"vuuInput\"\n onChange={onChangeName}\n value={getCalculatedColumnName(column)}\n />\n </FormField>\n\n <FormField data-field=\"column-expression\">\n <FormFieldLabel>Expression</FormFieldLabel>\n <ColumnExpressionInput\n onChange={onChangeExpression}\n onSubmitExpression={handleSubmitExpression}\n source={initialExpressionRef.current}\n suggestionProvider={suggestionProvider}\n />\n </FormField>\n <FormField data-field=\"type\">\n <FormFieldLabel>Column type</FormFieldLabel>\n <Dropdown\n className={`${classBase}-type`}\n onSelectionChange={onChangeType}\n ref={typeRef}\n selected={getCalculatedColumnType(column) || null}\n source={[\"double\", \"long\", \"string\"]}\n width=\"100%\"\n />\n </FormField>\n </div>\n );\n};\n", "import { HTMLAttributes, memo } from \"react\";\nimport { ColumnDefinitionExpression } from \"./column-language-parser\";\nimport {\n ExpressionSuggestionConsumer,\n useColumnExpressionEditor,\n} from \"./useColumnExpressionEditor\";\n\nimport \"./ColumnExpressionInput.css\";\n\nconst classBase = \"vuuColumnExpressionInput\";\n\nexport type ColumnExpressionSubmitHandler = (\n source: string,\n expression: ColumnDefinitionExpression | undefined\n) => void;\n\nexport interface ColumnExpressionInputProps\n extends ExpressionSuggestionConsumer,\n Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n onChange?: (source: string) => void;\n onSubmitExpression?: ColumnExpressionSubmitHandler;\n source?: string;\n}\n\nexport const ColumnExpressionInput = memo(\n ({\n onChange,\n onSubmitExpression,\n source = \"\",\n suggestionProvider,\n }: ColumnExpressionInputProps) => {\n const { editorRef, onBlur } = useColumnExpressionEditor({\n onChange,\n onSubmitExpression,\n source,\n suggestionProvider,\n });\n\n return <div className={`${classBase}`} onBlur={onBlur} ref={editorRef} />;\n },\n (prevProps, newProps) => {\n return prevProps.source === newProps.source;\n }\n);\nColumnExpressionInput.displayName = \"ColumnExpressionInput\";\n", "import {\n autocompletion,\n Completion,\n defaultKeymap,\n EditorState,\n EditorView,\n ensureSyntaxTree,\n keymap,\n minimalSetup,\n startCompletion,\n} from \"@vuu-ui/vuu-codemirror\";\nimport { createEl } from \"@vuu-ui/vuu-utils\";\nimport {\n FocusEventHandler,\n MutableRefObject,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { columnExpressionLanguageSupport } from \"./column-language-parser\";\nimport {\n ColumnDefinitionExpression,\n walkTree,\n} from \"./column-language-parser/ColumnExpressionTreeWalker\";\nimport { ColumnExpressionInputProps } from \"./ColumnExpressionInput\";\nimport { vuuHighlighting } from \"./highlighting\";\nimport { vuuTheme } from \"./theme\";\nimport {\n ApplyCompletion,\n useColumnAutoComplete,\n} from \"./useColumnAutoComplete\";\n\nexport type ColumnExpressionOperator = \"Times\" | \"Divide\" | \"Minus\" | \"Plus\";\n\nexport type ColumnExpressionSuggestionType =\n | \"column\"\n | \"columnValue\"\n | \"expression\"\n | \"condition-operator\"\n | \"operator\"\n | \"relational-operator\";\n\nexport type ColumnExpressionSuggestionOptions = {\n columnName?: string;\n functionName?: string;\n operator?: ColumnExpressionOperator;\n prefix?: string;\n startsWith?: string;\n selection?: string[];\n};\n\n// TODO move this somewhere neutral\nexport interface IExpressionSuggestionProvider {\n getSuggestions: (\n valueType: ColumnExpressionSuggestionType,\n options?: ColumnExpressionSuggestionOptions\n ) => Promise<Completion[]>;\n isPartialMatch: (\n valueType: ColumnExpressionSuggestionType,\n columnName?: string,\n text?: string | undefined\n ) => Promise<boolean>;\n}\n\nexport interface ExpressionSuggestionConsumer {\n suggestionProvider: IExpressionSuggestionProvider;\n}\n\nconst getView = (ref: MutableRefObject<EditorView | undefined>): EditorView => {\n if (ref.current == undefined) {\n throw Error(\"EditorView not defined\");\n }\n return ref.current;\n};\n\nconst getOptionClass = (/*completion: Completion*/) => {\n return \"vuuSuggestion\";\n};\n\nconst noop = () => console.log(\"noooop\");\n\nconst hasExpressionType = (\n completion: Completion\n): completion is Completion & { expressionType: string } =>\n \"expressionType\" in completion;\n\nconst injectOptionContent = (\n completion: Completion /*, state: EditorState*/\n) => {\n if (hasExpressionType(completion)) {\n const div = createEl(\"div\", \"expression-type-container\");\n const span = createEl(\"span\", \"expression-type\", completion.expressionType);\n div.appendChild(span);\n return div;\n } else {\n return null;\n }\n};\n\nexport const useColumnExpressionEditor = ({\n onChange,\n onSubmitExpression,\n source,\n suggestionProvider,\n}: ColumnExpressionInputProps) => {\n const editorRef = useRef<HTMLDivElement>(null);\n const onSubmitRef = useRef<ApplyCompletion>(noop);\n const viewRef = useRef<EditorView>();\n const completionFn = useColumnAutoComplete(suggestionProvider, onSubmitRef);\n\n const [createState, clearInput, submit] = useMemo(() => {\n const parseExpression = ():\n | [string, ColumnDefinitionExpression]\n | [\"\", undefined] => {\n const view = getView(viewRef);\n const source = view.state.doc.toString();\n const tree = ensureSyntaxTree(view.state, view.state.doc.length, 5000);\n if (tree) {\n const expression = walkTree(tree, source);\n return [source, expression];\n } else {\n return [\"\", undefined];\n }\n };\n\n const clearInput = () => {\n getView(viewRef).setState(createState());\n };\n\n const submitExpression = () => {\n const [source, expression] = parseExpression();\n onSubmitExpression?.(source, expression);\n };\n\n const showSuggestions = (key: string) => {\n return keymap.of([\n {\n key,\n run() {\n startCompletion(getView(viewRef));\n return true;\n },\n },\n ]);\n };\n\n const createState = (): EditorState =>\n EditorState.create({\n doc: source,\n extensions: [\n minimalSetup,\n autocompletion({\n addToOptions: [\n {\n render: injectOptionContent,\n position: 70,\n },\n ],\n override: [completionFn],\n optionClass: getOptionClass,\n }),\n columnExpressionLanguageSupport(),\n keymap.of(defaultKeymap),\n showSuggestions(\"ArrowDown\"),\n EditorView.updateListener.of((v) => {\n const view = getView(viewRef);\n if (v.docChanged) {\n startCompletion(view);\n const source = view.state.doc.toString();\n onChange?.(source);\n }\n }),\n // Enforces single line view\n EditorState.transactionFilter.of((tr) =>\n tr.newDoc.lines > 1 ? [] : tr\n ),\n vuuTheme,\n vuuHighlighting,\n ],\n });\n\n onSubmitRef.current = () => {\n submitExpression();\n };\n\n return [createState, clearInput, submitExpression];\n }, [completionFn, onChange, onSubmitExpression, source]);\n\n useEffect(() => {\n if (!editorRef.current) {\n throw Error(\"editor not in dom\");\n }\n\n viewRef.current = new EditorView({\n state: createState(),\n parent: editorRef.current,\n });\n\n return () => {\n viewRef.current?.destroy();\n };\n }, [completionFn, createState]);\n\n const handleBlur = useCallback<FocusEventHandler>(() => {\n submit();\n }, [submit]);\n\n return { editorRef, clearInput, onBlur: handleBlur };\n};\n", "import {\n LanguageSupport,\n LRLanguage,\n styleTags,\n tags as tag,\n} from \"@vuu-ui/vuu-codemirror\";\nimport { parser } from \"./generated/column-parser\";\n\nconst columnExpressionLanguage = LRLanguage.define({\n name: \"VuuColumnExpression\",\n parser: parser.configure({\n props: [\n styleTags({\n Column: tag.attributeValue,\n Function: tag.variableName,\n String: tag.string,\n Or: tag.emphasis,\n Operator: tag.operator,\n }),\n ],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n }) as any,\n});\n\nexport const columnExpressionLanguageSupport = () => {\n return new LanguageSupport(\n columnExpressionLanguage /*, [exampleCompletion]*/\n );\n};\n", "// This file was generated by lezer-generator. You probably shouldn't edit it.\nimport {LRParser} from \"@lezer/lr\"\nexport const parser = LRParser.deserialize({\n version: 14,\n states: \"&xOVQPOOO!fQPO'#C^OVQPO'#CcQ!pQPOOO#bQPO'#CkO#gQPO'#CrOOQO'#Cy'#CyO#lQPO,58}OVQPO,59QOVQPO,59QOOQO'#Cn'#CnOVQPO,59XOVQPO,59VOVQPO'#CtOOQO,59^,59^OOQO1G.i1G.iOOQO1G.l1G.lO$bQPO1G.lO%ZQPO1G.sO!pQPO'#CmO%qQQO1G.qO%|QQO'#C{OOQO'#C{'#C{O&wQPO,59`OVQPO,59ZOVQPO,59[OVQPO7+$]OVQPO'#CuO'RQPO1G.zOOQO1G.z1G.zO'ZQQO'#C^O'eQQO1G.sO'{QQO1G.uOOQO1G.v1G.vO(WQPO<<GwO(_QPO,59aOOQO-E6s-E6sOOQO7+$f7+$fOVQPOAN=cO(iQQO1G.lO(yQPOG22}OOQOLD(iLD(iO)QQPO,59QO)QQPO,59QO)QQPO,59X\",\n stateData: \")n~OlOS~ORUOSUOTUOUUOWQO`SOnPO~OWgXZQX[QX]QX^QXpQXqQXrQXsQXtQXuQXeQX~OjQXXQX~PnOZWO[WO]XO^XOpYOqYOrYOsYOtYOuYO~OW[O~OW]O~OX_O~P!pO]Yi^YipYiqYirYisYitYiuYieYi~OZWO[WOjYiXYi~P#sOpaiqairaisaitaiuaieai~OZWO[WO]XO^XOjaiXai~P$rOejOvhOwiO~OZmX[mX]mX^mXeoXpmXqmXrmXsmXtmXumXvoXwoX~OXmOekO~P!pOXuOekO~OvQXwQX~PnOZzO[zO]{O^{Ovaiwai~P$rOwiOecivci~OevO~P!pOXiaeia~P!pOZzO[zOvYiwYi~P#sOXyO~P!pORUOSUOTUOUUOWQO`SOnnO~O`UTn~\",\n goto: \"$epPPqPPPPqPPqPPPPqP!S!g!r!rPq!w#Y#]PPP#cP$[oUOQWXZ[]hijkvz{|hUOQWXZ]jkvz{|Ve[hi[ZRVgrsxR|cVf[hioTOQWXZ[]hijkvz{|R^TQlgRtlQROQVQS`WzQaXQbZUc[hiQg]Qo|QrjQskQw{RxvQd[QphRqi\",\n nodeNames: \"\u26A0 ColumnDefinitionExpression Column Number String True False ParenthesizedExpression OpenBrace CloseBrace ArithmeticExpression Divide Times Plus Minus ConditionalExpression If RelationalExpression RelationalOperator AndCondition OrCondition Comma CallExpression Function ArgList\",\n maxTerm: 39,\n skippedNodes: [0],\n repeatNodeCount: 1,\n tokenData: \".^~RnXY#PYZ#P]^#Ppq#Pqr#brs#mxy$eyz$jz{$o{|$t|}$y}!O%O!O!P%T!P!Q%c!Q![%h!^!_%s!_!`&Q!`!a&V!c!}&d#R#S&d#T#U&u#U#Y&d#Y#Z(Y#Z#]&d#]#^*j#^#c&d#c#d+f#d#h&d#h#i,b#i#o&d~#USl~XY#PYZ#P]^#Ppq#P~#eP!_!`#h~#mOu~~#pWOX#mZ]#m^r#mrs$Ys#O#m#P;'S#m;'S;=`$_<%lO#m~$_OS~~$bP;=`<%l#m~$jOW~~$oOX~~$tO[~~$yO]~~%OOe~~%TO^~~%WP!Q![%Z~%`PR~!Q![%Z~%hOZ~~%mQR~!O!P%Z!Q![%h~%xPr~!_!`%{~&QOt~~&VOp~~&[Pq~!_!`&_~&dOs~P&iSnP!Q![&d!c!}&d#R#S&d#T#o&dR&zUnP!Q![&d!c!}&d#R#S&d#T#b&d#b#c'^#c#o&dR'cUnP!Q![&d!c!}&d#R#S&d#T#W&d#W#X'u#X#o&dR'|SvQnP!Q![&d!c!}&d#R#S&d#T#o&d~(_TnP!Q![&d!c!}&d#R#S&d#T#U(n#U#o&d~(sUnP!Q![&d!c!}&d#R#S&d#T#`&d#`#a)V#a#o&d~)[UnP!Q![&d!c!}&d#R#S&d#T#g&d#g#h)n#h#o&d~)sUnP!Q![&d!c!}&d#R#S&d#T#X&d#X#Y*V#Y#o&d~*^SU~nP!Q![&d!c!}&d#R#S&d#T#o&d~*oUnP!Q![&d!c!}&d#R#S&d#T#Y&d#Y#Z+R#Z#o&d~+YS`~nP!Q![&d!c!}&d#R#S&d#T#o&dR+kUnP!Q![&d!c!}&d#R#S&d#T#f&d#f#g+}#g#o&dR,USwQnP!Q![&d!c!}&d#R#S&d#T#o&d~,gUnP!Q![&d!c!}&d#R#S&d#T#f&d#f#g,y#g#o&d~-OUnP!Q![&d!c!}&d#R#S&d#T#i&d#i#j-b#j#o&d~-gUnP!Q![&d!c!}&d#R#S&d#T#X&d#X#Y-y#Y#o&d~.QST~nP!Q![&d!c!}&d#R#S&d#T#o&d\",\n tokenizers: [0, 1],\n topRules: {\"ColumnDefinitionExpression\":[0,1]},\n tokenPrec: 393\n})\n", "import { Tree } from \"@vuu-ui/vuu-codemirror\";\nimport { RelationalExpression } from \"./generated/column-parser.terms\";\ntype expressionType =\n | \"arithmeticExpression\"\n | \"booleanCondition\"\n | \"booleanLiteralExpression\"\n | \"callExpression\"\n | \"colExpression\"\n | \"conditionalExpression\"\n | \"numericLiteralExpression\"\n | \"relationalExpression\"\n | \"stringLiteralExpression\"\n | \"unknown\";\n\ntype arithmeticOp = \"*\" | \"/\" | \"+\" | \"-\" | \"unknown\";\ntype booleanOp = \"and\" | \"or\";\ntype relationalOp = \"=\" | \"!=\" | \">\" | \">=\" | \"<\" | \"<=\" | \"unknown\";\n\nexport interface Expression {\n type: expressionType;\n expressions?: Expression[];\n toJSON?: () => unknown;\n value?: string | number | boolean;\n}\n\ninterface UnknownExpression extends Expression {\n type: \"unknown\";\n}\n\ninterface BooleanLiteralExpression {\n type: \"booleanLiteralExpression\";\n value: boolean;\n}\n\ninterface NumericLiteralExpression {\n type: \"numericLiteralExpression\";\n value: number;\n}\ninterface StringLiteralExpression {\n type: \"stringLiteralExpression\";\n value: string;\n}\n\ninterface ArithmeticExpression extends Expression {\n expressions: [Expression, Expression];\n op: arithmeticOp;\n type: \"arithmeticExpression\";\n}\n\ninterface BooleanCondition extends Expression {\n expressions: Expression[];\n op: booleanOp;\n type: \"booleanCondition\";\n}\ninterface RelationalExpression extends Expression {\n expressions: Expression[];\n op: relationalOp;\n type: \"relationalExpression\";\n}\n\ninterface ColExpression extends Expression {\n column?: string;\n type: \"colExpression\";\n}\n\ninterface CallExpression extends Expression {\n arguments: Expression[];\n functionName?: string;\n type: \"callExpression\";\n}\n\ntype ConditionExpression = RelationalExpression | BooleanCondition;\n\ninterface ConditionalExpression extends Expression {\n type: \"conditionalExpression\";\n condition: ConditionExpression;\n truthyExpression: Expression;\n falsyExpression: Expression;\n}\n\nexport type ColumnDefinitionExpression =\n | ArithmeticExpression\n | BooleanLiteralExpression\n | CallExpression\n | ColExpression\n | ConditionalExpression\n | NumericLiteralExpression\n | StringLiteralExpression;\n\nclass LiteralExpressionImpl implements Expression {\n type:\n | \"booleanLiteralExpression\"\n | \"numericLiteralExpression\"\n | \"stringLiteralExpression\";\n value: boolean | number | string;\n constructor(value: boolean | number | string) {\n this.value = value;\n switch (typeof value) {\n case \"boolean\":\n this.type = \"booleanLiteralExpression\";\n break;\n case \"number\":\n this.type = \"numericLiteralExpression\";\n break;\n default:\n this.type = \"stringLiteralExpression\";\n }\n }\n toJSON() {\n return {\n type: this.type,\n value: this.value,\n } as\n | StringLiteralExpression\n | BooleanLiteralExpression\n | NumericLiteralExpression;\n }\n}\nclass ColumnExpressionImpl implements ColExpression {\n type = \"colExpression\" as const;\n column: string;\n constructor(columnName: string) {\n this.column = columnName;\n }\n toJSON() {\n return {\n type: this.type,\n column: this.column,\n } as ColExpression;\n }\n}\nclass ArithmeticExpressionImpl implements ArithmeticExpression {\n #expressions: [Expression, Expression] = [\n { type: \"unknown\" },\n { type: \"unknown\" },\n ];\n #op: arithmeticOp | \"unknown\";\n type = \"arithmeticExpression\" as const;\n constructor(op: arithmeticOp | \"unknown\" = \"unknown\") {\n this.#op = op;\n }\n get op() {\n return this.#op;\n }\n set op(op: arithmeticOp) {\n this.#op = op;\n }\n get expressions() {\n return this.#expressions;\n }\n\n toJSON() {\n return {\n type: this.type,\n op: this.#op,\n expressions: this.#expressions,\n };\n }\n}\n\nclass CallExpressionImpl implements CallExpression {\n #expressions: Expression[] = [];\n functionName: string;\n type = \"callExpression\" as const;\n constructor(functionName: string) {\n this.functionName = functionName;\n }\n\n get expressions() {\n return this.#expressions;\n }\n get arguments() {\n return this.#expressions;\n }\n\n toJSON() {\n return {\n type: this.type,\n functionName: this.functionName,\n arguments: this.#expressions.map((e) => e.toJSON?.()),\n } as CallExpression;\n }\n}\n\nclass RelationalExpressionImpl implements RelationalExpression {\n #expressions: [Expression, Expression] = [\n { type: \"unknown\" },\n { type: \"unknown\" },\n ];\n #op: relationalOp = \"unknown\";\n type = \"relationalExpression\" as const;\n\n get op() {\n return this.#op;\n }\n set op(op: relationalOp) {\n this.#op = op;\n }\n get expressions() {\n return this.#expressions;\n }\n\n toJSON() {\n return {\n type: this.type,\n op: this.#op,\n expressions: this.#expressions,\n } as RelationalExpression;\n }\n}\n\nclass BooleanConditionImp implements BooleanCondition {\n #expressions: [Expression, Expression] = [\n { type: \"unknown\" },\n { type: \"unknown\" },\n ];\n #op: \"and\" | \"or\";\n type = \"booleanCondition\" as const;\n constructor(booleanOperator: \"and\" | \"or\") {\n this.#op = booleanOperator;\n }\n get op() {\n return this.#op;\n }\n get expressions() {\n return this.#expressions;\n }\n toJSON() {\n return {\n type: this.type,\n op: this.#op,\n expressions: this.#expressions.map((e) => e.toJSON?.()),\n };\n }\n}\n\nclass ConditionalExpressionImpl implements ConditionalExpression {\n #expressions: [ConditionExpression, Expression, Expression];\n type = \"conditionalExpression\" as const;\n\n constructor(booleanOperator?: \"and\" | \"or\") {\n this.#expressions = [\n booleanOperator\n ? new BooleanConditionImp(booleanOperator)\n : new RelationalExpressionImpl(),\n { type: \"unknown\" },\n { type: \"unknown\" },\n ];\n }\n\n get expressions() {\n return this.#expressions;\n }\n\n get condition(): ConditionExpression {\n return this.#expressions[0];\n }\n get truthyExpression(): Expression {\n return this.#expressions[1];\n }\n set truthyExpression(expression: Expression) {\n this.#expressions[1] = expression;\n }\n get falsyExpression(): Expression {\n return this.#expressions[2];\n }\n set falsyExpression(expression: Expression) {\n this.#expressions[2] = expression;\n }\n\n toJSON() {\n return {\n type: this.type,\n condition: this.condition.toJSON?.(),\n truthyExpression: this.truthyExpression,\n falsyExpression: this.falsyExpression?.toJSON?.() ?? this.falsyExpression,\n };\n }\n}\n\ntype PartialExpression =\n | ArithmeticExpression\n | RelationalExpression\n | ColExpression\n | CallExpression\n | BooleanCondition\n | Partial<ConditionalExpression>;\n\nconst isUnknown = (e: Expression): e is UnknownExpression =>\n e.type === \"unknown\";\n\nconst isArithmeticExpression = (\n expression: PotentiallyUnresolvedExpression\n): expression is ArithmeticExpression =>\n expression.type === \"arithmeticExpression\";\n\nconst isCallExpression = (\n expression: PotentiallyUnresolvedExpression\n): expression is CallExpression => expression.type === \"callExpression\";\n\nconst isConditionalExpression = (\n expression: PotentiallyUnresolvedExpression\n): expression is ConditionalExpression =>\n expression.type === \"conditionalExpression\";\n\nconst isCondition = (\n expression: Expression | PartialExpression\n): expression is ConditionExpression =>\n expression.type === \"relationalExpression\" ||\n expression.type === \"booleanCondition\";\n\nconst booleanConditionIsIncomplete = (\n condition: ConditionExpression\n): boolean =>\n condition.expressions.length < 2 ||\n condition.expressions.some((e) => conditionIsIncomplete(e));\n\nconst isBooleanCondition = (\n expression: Expression\n): expression is BooleanCondition => expression.type === \"booleanCondition\";\n\nconst isRelationalExpression = (\n expression?: Expression\n): expression is RelationalExpression =>\n expression?.type === \"relationalExpression\";\n\nconst conditionIsIncomplete = (\n condition: Expression\n): condition is ConditionExpression =>\n (isBooleanCondition(condition) && booleanConditionIsIncomplete(condition)) ||\n (isRelationalExpression(condition) && condition.expressions.length < 2);\n\nconst firstIncompleteExpression = (\n expression: Expression\n): Expression | undefined => {\n if (isUnknown(expression)) {\n return expression;\n } else if (isRelationalExpression(expression)) {\n const [operand1, operand2] = expression.expressions;\n if (expressionIsIncomplete(operand1)) {\n return firstIncompleteExpression(operand1);\n } else if (expression.op === \"unknown\") {\n return expression;\n } else if (expressionIsIncomplete(operand2)) {\n return firstIncompleteExpression(operand2);\n }\n } else if (isCondition(expression)) {\n const { expressions = [] } = expression;\n for (const e of expressions) {\n if (expressionIsIncomplete(e)) {\n return firstIncompleteExpression(e);\n }\n }\n } else if (isConditionalExpression(expression)) {\n const { condition, truthyExpression, falsyExpression } = expression;\n if (expressionIsIncomplete(condition)) {\n return firstIncompleteExpression(condition);\n } else if (expressionIsIncomplete(truthyExpression)) {\n return firstIncompleteExpression(truthyExpression);\n } else if (expressionIsIncomplete(falsyExpression)) {\n return firstIncompleteExpression(falsyExpression);\n }\n } else if (isArithmeticExpression(expression)) {\n const { expressions = [] } = expression;\n for (const e of expressions) {\n if (expressionIsIncomplete(e)) {\n return firstIncompleteExpression(e);\n }\n }\n }\n};\nconst replaceUnknownExpression = (\n incompleteExpression: Expression,\n unknownExpression: UnknownExpression,\n expression: Expression\n): boolean => {\n const { expressions = [] } = incompleteExpression;\n if (expressions.includes(unknownExpression)) {\n const pos = expressions.indexOf(unknownExpression);\n expressions.splice(pos, 1, expression);\n return true;\n } else {\n for (const e of expressions) {\n if (replaceUnknownExpression(e, unknownExpression, expression)) {\n return true;\n }\n }\n }\n return false;\n};\n\nconst expressionIsIncomplete = (expression: Expression): boolean => {\n if (isUnknown(expression)) {\n return true;\n } else if (isConditionalExpression(expression)) {\n return (\n expressionIsIncomplete(expression.condition) ||\n expressionIsIncomplete(expression.truthyExpression) ||\n expressionIsIncomplete(expression.falsyExpression)\n );\n } else if (\n isRelationalExpression(expression) ||\n isBooleanCondition(expression)\n ) {\n return (\n expression.op === undefined ||\n expression.expressions.some((e) => expressionIsIncomplete(e))\n );\n }\n // TODO missing cases\n return false;\n};\n\ntype ExpressionImpl =\n | ArithmeticExpressionImpl\n | CallExpressionImpl\n | ColumnExpressionImpl\n | ConditionalExpressionImpl\n | LiteralExpressionImpl;\n\ntype PotentiallyUnresolvedExpression = Expression | PartialExpression;\n\nconst addExpression = (\n expression: Expression,\n subExpression: PartialExpression | Expression\n) => {\n const targetExpression = firstIncompleteExpression(expression);\n if (targetExpression) {\n if (targetExpression.expressions) {\n targetExpression.expressions.push(subExpression as Expression);\n } else {\n console.warn(\"don't know how to treat targetExpression\");\n }\n } else {\n console.error(\"no target expression found\");\n }\n};\n\nclass ColumnExpression {\n #expression: ExpressionImpl | undefined;\n\n #callStack: CallExpression[] = [];\n\n setCondition(booleanOperator?: \"and\" | \"or\") {\n if (this.#expression === undefined) {\n this.addExpression(new ConditionalExpressionImpl(booleanOperator));\n } else if (isConditionalExpression(this.#expression)) {\n if (expressionIsIncomplete(this.#expression.condition)) {\n const condition = booleanOperator\n ? new BooleanConditionImp(booleanOperator)\n : new RelationalExpressionImpl();\n this.addExpression(condition);\n } else if (isUnknown(this.#expression.truthyExpression)) {\n this.#expression.truthyExpression = new ConditionalExpressionImpl(\n booleanOperator\n );\n } else if (expressionIsIncomplete(this.#expression.truthyExpression)) {\n const condition = booleanOperator\n ? new BooleanConditionImp(booleanOperator)\n : new RelationalExpressionImpl();\n this.addExpression(condition);\n } else if (isUnknown(this.#expression.falsyExpression)) {\n this.#expression.falsyExpression = new ConditionalExpressionImpl(\n booleanOperator\n );\n } else if (expressionIsIncomplete(this.#expression.falsyExpression)) {\n const condition = booleanOperator\n ? new BooleanConditionImp(booleanOperator)\n : new RelationalExpressionImpl();\n this.addExpression(condition);\n }\n } /*else if (isCallExpression(this.#expression)) {\n this.addExpression(new RelationalExpressionImpl());\n } */ else {\n console.error(\"setCondition called unexpectedly\");\n }\n }\n\n addExpression(expression: ExpressionImpl | Expression) {\n if (this.#callStack.length > 0) {\n const currentCallExpression = this.#callStack.at(-1);\n currentCallExpression?.arguments.push(expression as Expression);\n } else if (this.#expression === undefined) {\n this.#expression = expression as ExpressionImpl;\n } else if (isArithmeticExpression(this.#expression)) {\n const targetExpression = firstIncompleteExpression(this.#expression);\n if (targetExpression && isUnknown(targetExpression)) {\n replaceUnknownExpression(\n this.#expression,\n targetExpression,\n expression\n );\n }\n } else if (isConditionalExpression(this.#expression)) {\n if (expressionIsIncomplete(this.#expression)) {\n const targetExpression = firstIncompleteExpression(this.#expression);\n if (targetExpression && isUnknown(targetExpression)) {\n replaceUnknownExpression(\n this.#expression,\n targetExpression,\n expression\n );\n } else if (targetExpression) {\n addExpression(targetExpression, expression);\n }\n }\n }\n }\n\n setFunction(functionName: string) {\n const callExpression = new CallExpressionImpl(functionName);\n this.addExpression(callExpression);\n this.#callStack.push(callExpression);\n }\n\n setColumn(columnName: string) {\n this.addExpression(new ColumnExpressionImpl(columnName));\n }\n\n setArithmeticOp(value: string) {\n const op = value as arithmeticOp;\n const expression = this.#expression as Expression;\n if (isArithmeticExpression(expression)) {\n expression.op = op;\n }\n // else {\n // const targetExpression = firstIncompleteExpression(this.#expression);\n // if (targetExpression) {\n // targetExpression.op = op;\n // }\n // }\n }\n\n setRelationalOperator(value: string) {\n const op = value as relationalOp;\n if (this.#expression && isConditionalExpression(this.#expression)) {\n const targetExpression = firstIncompleteExpression(this.#expression);\n if (isRelationalExpression(targetExpression)) {\n targetExpression.op = op;\n } else {\n console.error(`no target expression found (op = ${value})`);\n }\n }\n }\n\n setValue(value: string | number | boolean) {\n const literalExpression = new LiteralExpressionImpl(value);\n if (this.#expression === undefined) {\n this.#expression = literalExpression;\n } else if (isArithmeticExpression(this.#expression)) {\n this.addExpression(literalExpression);\n } else if (isCallExpression(this.#expression)) {\n // TODO this might not be correct if call arguments include nested expression(s)\n this.#expression.arguments.push(literalExpression);\n } else if (isConditionalExpression(this.#expression)) {\n if (expressionIsIncomplete(this.#expression)) {\n const targetExpression = firstIncompleteExpression(this.#expression);\n if (targetExpression && isUnknown(targetExpression)) {\n replaceUnknownExpression(\n this.#expression,\n targetExpression,\n literalExpression\n );\n } else if (targetExpression) {\n addExpression(targetExpression, literalExpression);\n }\n } else {\n console.log(\"what do we do with value, in a complete expression\");\n }\n }\n }\n\n closeBrace() {\n this.#callStack.pop();\n }\n\n get expression() {\n return this.#expression;\n }\n\n toJSON() {\n return this.#expression?.toJSON() as ColumnDefinitionExpression;\n }\n}\n\nexport const walkTree = (tree: Tree, source: string) => {\n const columnExpression = new ColumnExpression();\n const cursor = tree.cursor();\n do {\n const { name, from, to } = cursor;\n switch (name) {\n case \"AndCondition\":\n columnExpression.setCondition(\"and\");\n break;\n\n case \"OrCondition\":\n columnExpression.setCondition(\"or\");\n break;\n\n case \"RelationalExpression\":\n // TODO this breaks when the relationalexpression is an argument to a CallExpression\n columnExpression.setCondition();\n break;\n\n case \"ArithmeticExpression\":\n columnExpression.addExpression(new ArithmeticExpressionImpl());\n break;\n\n case \"Column\":\n {\n const columnName = source.substring(from, to);\n columnExpression.setColumn(columnName);\n }\n break;\n\n case \"Function\":\n {\n const functionName = source.substring(from, to);\n columnExpression.setFunction(functionName);\n }\n break;\n\n case \"Times\":\n case \"Divide\":\n case \"Plus\":\n case \"Minus\":\n {\n const op = source.substring(from, to);\n columnExpression.setArithmeticOp(op);\n }\n break;\n\n case \"RelationalOperator\":\n {\n const op = source.substring(from, to);\n columnExpression.setRelationalOperator(op);\n }\n break;\n\n case \"False\":\n case \"True\":\n {\n const value = source.substring(from, to);\n columnExpression.setValue(value === \"true\" ? true : false);\n }\n break;\n\n case \"String\":\n columnExpression.setValue(source.substring(from + 1, to - 1));\n break;\n\n case \"Number\":\n columnExpression.setValue(parseFloat(source.substring(from, to)));\n break;\n\n case \"CloseBrace\":\n columnExpression.closeBrace();\n break;\n\n default:\n }\n } while (cursor.next());\n\n return columnExpression.toJSON();\n};\n", "import type { SyntaxNode } from \"@vuu-ui/vuu-codemirror\";\nimport { parser } from \"./generated/column-parser\";\n\nconst strictParser = parser.configure({ strict: true });\n\nconst RelationalOperands = [\"Number\", \"String\"];\n\nexport const ColumnNamedTerms: readonly string[] = [\n ...RelationalOperands,\n \"AndCondition\",\n \"ArithmeticExpression\",\n \"BooleanOperator\",\n \"RelationalOperatorOperator\",\n \"CallExpression\",\n \"CloseBrace\",\n \"Column\",\n \"Comma\",\n \"ConditionalExpression\",\n \"Divide\",\n \"Equal\",\n \"If\",\n \"Minus\",\n \"OpenBrace\",\n \"OrCondition\",\n \"ParenthesizedExpression\",\n \"Plus\",\n \"RelationalExpression\",\n \"RelationalOperator\",\n \"Times\",\n];\n\nexport const isCompleteExpression = (src: string) => {\n try {\n strictParser.parse(src);\n return true;\n } catch (err) {\n return false;\n }\n};\n\nexport const lastNamedChild = (node: SyntaxNode): SyntaxNode | null => {\n let { lastChild } = node;\n while (lastChild && !ColumnNamedTerms.includes(lastChild.name)) {\n lastChild = lastChild.prevSibling;\n console.log(lastChild?.name);\n }\n return lastChild;\n};\n\nexport const isCompleteRelationalExpression = (node?: SyntaxNode) => {\n if (node?.name === \"RelationalExpression\") {\n const { firstChild } = node;\n const lastChild = lastNamedChild(node);\n if (\n firstChild?.name === \"Column\" &&\n typeof lastChild?.name === \"string\" &&\n RelationalOperands.includes(lastChild.name)\n ) {\n return true;\n }\n }\n\n return false;\n};\n", "import {\n HighlightStyle,\n syntaxHighlighting,\n tags,\n} from \"@vuu-ui/vuu-codemirror\";\n\nconst myHighlightStyle = HighlightStyle.define([\n {\n tag: tags.attributeValue,\n color: \"var(--vuuFilterEditor-variableColor);font-weight: bold\",\n },\n { tag: tags.variableName, color: \"var(--vuuFilterEditor-variableColor)\" },\n { tag: tags.comment, color: \"green\", fontStyle: \"italic\" },\n]);\n\nexport const vuuHighlighting = syntaxHighlighting(myHighlightStyle);\n", "import { EditorView } from \"@vuu-ui/vuu-codemirror\";\n\nexport const vuuTheme = EditorView.theme(\n {\n \"&\": {\n border: \"solid 1px var(--salt-container-primary-borderColor)\",\n color: \"var(--vuuFilterEditor-color)\",\n backgroundColor: \"var(--vuuFilterEditor-background)\",\n },\n \".cm-content\": {\n caretColor: \"var(--vuuFilterEditor-cursorColor)\",\n },\n \"&.cm-focused .cm-cursor\": {\n borderLeftColor: \"var(--vuuFilterEditor-cursorColor)\",\n },\n \"&.cm-focused .cm-selectionBackground, ::selection\": {\n backgroundColor: \"var(--vuuFilterEditor-selectionBackground)\",\n },\n \".cm-selectionBackground, ::selection\": {\n backgroundColor: \"var(--vuuFilterEditor-selectionBackground)\",\n },\n \".cm-scroller\": {\n fontFamily: \"var(--vuuFilterEditor-fontFamily)\",\n },\n \".cm-completionLabel\": {\n color: \"var(--vuu-color-gray-50)\",\n },\n \".cm-completionMatchedText\": {\n color: \"var(--vuu-color-gray-80)\",\n fontWeight: 700,\n textDecoration: \"none\",\n },\n \".cm-tooltip\": {\n background: \"var(--vuuFilterEditor-tooltipBackground)\",\n border: \"var(--vuuFilterEditor-tooltipBorder)\",\n borderRadius: \"4px\",\n boxShadow: \"var(--vuuFilterEditor-tooltipElevation)\",\n \"&.cm-tooltip-autocomplete > ul\": {\n fontFamily: \"var(--vuuFilterEditor-fontFamily)\",\n fontSize: \"var(--vuuFilterEditor-fontSize)\",\n maxHeight: \"240px\",\n },\n \"&.cm-tooltip-autocomplete > ul > li\": {\n height: \"var(--vuuFilterEditor-suggestion-height)\",\n padding: \"0 3px\",\n lineHeight: \"var(--vuuFilterEditor-suggestion-height)\",\n },\n \"&.cm-tooltip-autocomplete li[aria-selected]\": {\n background: \"var(--vuuFilterEditor-suggestion-selectedBackground)\",\n color: \"var(--vuuFilterEditor-suggestion-selectedColor)\",\n },\n \"&.cm-tooltip-autocomplete li .cm-completionDetail\": {\n color: \"var(--vuuFilterEditor-suggestion-detailColor)\",\n },\n },\n },\n { dark: false }\n);\n", "import {\n booleanJoinSuggestions,\n Completion,\n CompletionContext,\n CompletionSource,\n EditorState,\n getNamedParentNode,\n getPreviousNode,\n getValue,\n SyntaxNode,\n syntaxTree,\n} from \"@vuu-ui/vuu-codemirror\";\nimport { MutableRefObject, useCallback } from \"react\";\nimport {\n ColumnNamedTerms,\n isCompleteExpression,\n isCompleteRelationalExpression,\n} from \"./column-language-parser\";\nimport {\n ColumnExpressionOperator,\n ColumnExpressionSuggestionOptions,\n ColumnExpressionSuggestionType,\n IExpressionSuggestionProvider,\n} from \"./useColumnExpressionEditor\";\nimport { lastNamedChild } from \"./column-language-parser\";\n\nexport type ApplyCompletion = (mode?: \"add\" | \"replace\") => void;\n\nexport type Operator = \"\";\n\nconst applyPrefix = (completions: Completion[], prefix?: string) =>\n prefix\n ? completions.map((completion) => ({\n ...completion,\n apply:\n typeof completion.apply === \"function\"\n ? completion.apply\n : `${prefix}${completion.apply ?? completion.label}`,\n }))\n : completions;\n\nconst isOperator = (node?: SyntaxNode): node is SyntaxNode =>\n node === undefined\n ? false\n : [\"Times\", \"Divide\", \"Plus\", \"Minus\"].includes(node.name);\n\nconst completionDone = (onSubmit?: () => void): Completion => ({\n apply: () => {\n onSubmit?.();\n },\n label: \"Done\",\n boost: 10,\n});\n\nconst getLastChild = (node: SyntaxNode, context: CompletionContext) => {\n let { lastChild: childNode } = node;\n const { pos } = context;\n while (childNode) {\n const isBeforeCursor = childNode.from < pos;\n if (isBeforeCursor && ColumnNamedTerms.includes(childNode.name)) {\n if (childNode.name === \"ParenthesizedExpression\") {\n // extract the parenthesized expression\n const expression = childNode.firstChild?.nextSibling;\n if (expression) {\n childNode = expression;\n }\n }\n return childNode;\n } else {\n childNode = childNode.prevSibling;\n }\n }\n};\nconst getFunctionName = (node: SyntaxNode, state: EditorState) => {\n if (node.name === \"ArgList\") {\n const functionNode = node.prevSibling;\n if (functionNode) {\n return getValue(functionNode, state);\n }\n } else if (node.name === \"OpenBrace\") {\n const maybeFunction = node.parent?.prevSibling;\n if (maybeFunction?.name === \"Function\") {\n return getValue(maybeFunction, state);\n }\n }\n};\n\nconst getRelationalOperator = (node: SyntaxNode, state: EditorState) => {\n if (node.name === \"RelationalExpression\") {\n const lastNode = lastNamedChild(node);\n if (lastNode?.name === \"RelationalOperator\") {\n return getValue(lastNode, state);\n }\n } else {\n const prevNode = node.prevSibling;\n if (prevNode?.name === \"RelationalOperator\") {\n return getValue(prevNode, state) as ColumnExpressionOperator;\n }\n }\n};\n\nconst getColumnName = (\n node: SyntaxNode,\n state: EditorState\n): string | undefined => {\n if (node.name === \"RelationalExpression\") {\n if (node.firstChild?.name === \"Column\") {\n return getValue(node.firstChild, state);\n }\n } else {\n const prevNode = node.prevSibling;\n if (prevNode?.name === \"Column\") {\n return getValue(prevNode, state);\n } else if (prevNode?.name === \"RelationalOperator\") {\n return getColumnName(prevNode, state);\n }\n }\n};\n\nconst makeSuggestions = async (\n context: CompletionContext,\n suggestionProvider: IExpressionSuggestionProvider,\n suggestionType: ColumnExpressionSuggestionType,\n optionalArgs: ColumnExpressionSuggestionOptions = {}\n) => {\n const options = await suggestionProvider.getSuggestions(\n suggestionType,\n optionalArgs\n );\n const { startsWith = \"\" } = optionalArgs;\n return { from: context.pos - startsWith.length, options };\n};\n\nconst handleConditionalExpression = (\n node: SyntaxNode,\n context: CompletionContext,\n suggestionProvider: IExpressionSuggestionProvider,\n maybeComplete?: boolean,\n onSubmit?: () => void\n) => {\n const lastChild = getLastChild(node, context);\n switch (lastChild?.name) {\n case \"If\":\n return makeSuggestions(context, suggestionProvider, \"expression\", {\n prefix: \"( \",\n });\n case \"OpenBrace\":\n return makeSuggestions(context, suggestionProvider, \"expression\");\n case \"Condition\":\n return makeSuggestions(context, suggestionProvider, \"expression\", {\n prefix: \", \",\n });\n case \"CloseBrace\":\n if (maybeComplete) {\n const options: Completion[] = [completionDone(onSubmit)];\n return { from: context.pos, options };\n }\n }\n};\n\nconst promptToSave = (context: CompletionContext, onSubmit: () => void) => {\n const options: Completion[] = [completionDone(onSubmit)];\n return { from: context.pos, options };\n};\n\nexport const useColumnAutoComplete = (\n suggestionProvider: IExpressionSuggestionProvider,\n onSubmit: MutableRefObject<ApplyCompletion>\n) => {\n const makeSuggestions = useCallback(\n async (\n context: CompletionContext,\n suggestionType: ColumnExpressionSuggestionType,\n optionalArgs: ColumnExpressionSuggestionOptions = {}\n ) => {\n const options = await suggestionProvider.getSuggestions(\n suggestionType,\n optionalArgs\n );\n const { startsWith = \"\" } = optionalArgs;\n return { from: context.pos - startsWith.length, options };\n },\n [suggestionProvider]\n );\n\n return useCallback(\n async (context: CompletionContext) => {\n const { state, pos } = context;\n const word = context.matchBefore(/\\w*/) ?? {\n from: 0,\n to: 0,\n text: undefined,\n };\n\n const tree = syntaxTree(state);\n const nodeBefore = tree.resolveInner(pos, -1);\n const text = state.doc.toString();\n const maybeComplete = isCompleteExpression(text);\n\n switch (nodeBefore.name) {\n case \"If\": {\n return makeSuggestions(context, \"expression\", { prefix: \"( \" });\n }\n case \"Condition\":\n {\n const lastChild = getLastChild(nodeBefore, context);\n if (lastChild?.name === \"Column\") {\n // is this the first term ?\n const prevChild = getPreviousNode(lastChild);\n if (prevChild?.name !== \"RelationalOperator\") {\n return makeSuggestions(context, \"condition-operator\", {\n columnName: getValue(lastChild, state),\n });\n }\n } else if (lastChild?.name === \"RelationalOperator\") {\n // we need the type of the expression on the other side of the operator\n return makeSuggestions(context, \"expression\");\n }\n }\n break;\n case \"ConditionalExpression\":\n return handleConditionalExpression(\n nodeBefore,\n context,\n suggestionProvider\n );\n case \"RelationalExpression\":\n {\n if (isCompleteRelationalExpression(nodeBefore)) {\n return {\n from: context.pos,\n options: booleanJoinSuggestions.concat({\n label: \", <truthy expression>, <falsy expression>\",\n apply: \", \",\n }),\n };\n } else {\n const operator = getRelationalOperator(nodeBefore, state);\n const columnName = getColumnName(nodeBefore, state);\n if (!operator) {\n const options = await suggestionProvider.getSuggestions(\n \"condition-operator\",\n {\n columnName,\n }\n );\n return { from: context.pos, options };\n } else {\n return makeSuggestions(context, \"expression\");\n }\n }\n }\n break;\n\n case \"RelationalOperator\":\n // we need the type of the expression on the other side of the operator\n return makeSuggestions(context, \"expression\");\n\n case \"String\":\n {\n // we only encounter a string as the right hand operand of a conditional expression\n const operator = getRelationalOperator(\n nodeBefore,\n state\n ) as ColumnExpressionOperator;\n const columnName = getColumnName(nodeBefore, state);\n // are we inside the string or immediately after it\n const { from, to } = nodeBefore;\n if (to - from === 2 && context.pos === from + 1) {\n // We are in an empty string, i.e between two quotes\n if (columnName && operator) {\n return makeSuggestions(context, \"columnValue\", {\n columnName,\n operator,\n startsWith: word.text,\n });\n }\n } else if (to - from > 2 && context.pos === to) {\n // NOte we couls also offer AND/OR to extend the condition\n return makeSuggestions(context, \"expression\", {\n prefix: \", \",\n });\n }\n }\n break;\n\n case \"ArithmeticExpression\":\n {\n const lastChild = getLastChild(nodeBefore, context);\n if (lastChild?.name === \"Column\") {\n return makeSuggestions(context, \"expression\");\n } else if (isOperator(lastChild)) {\n const operator = lastChild.name as ColumnExpressionOperator;\n return makeSuggestions(context, \"column\", { operator });\n }\n }\n\n break;\n case \"OpenBrace\":\n {\n // Might be a function expression, might be parenthesized\n const functionName = getFunctionName(nodeBefore, state);\n // If not function, what came before - if it's an operator\n // we restrict to numerics\n return makeSuggestions(context, \"expression\", { functionName });\n }\n break;\n case \"ArgList\": {\n const functionName = getFunctionName(nodeBefore, state);\n const lastArgument = getLastChild(nodeBefore, context);\n\n const prefix =\n lastArgument?.name === \"OpenBrace\" || lastArgument?.name === \"Comma\"\n ? undefined\n : \",\";\n let options = await suggestionProvider.getSuggestions(\"expression\", {\n functionName,\n });\n options = prefix ? applyPrefix(options, \", \") : options;\n\n // TODO per function check for number of arguments expected\n if (\n lastArgument?.name !== \"OpenBrace\" &&\n lastArgument?.name !== \"Comma\"\n ) {\n options = [\n {\n apply: \") \",\n boost: 10,\n label: \"Done - no more arguments\",\n } as Completion,\n ].concat(options);\n }\n return { from: context.pos, options };\n }\n case \"Equal\":\n if (text.trim() === \"=\") {\n return makeSuggestions(context, \"expression\");\n }\n break;\n case \"ParenthesizedExpression\":\n case \"ColumnDefinitionExpression\":\n if (context.pos === 0) {\n return makeSuggestions(context, \"expression\");\n } else {\n const lastChild = getLastChild(nodeBefore, context);\n if (lastChild?.name === \"Column\") {\n if (maybeComplete) {\n // We come in here is the columns IS complete, too (ie has space after)\n const options: Completion[] = [\n completionDone(onSubmit.current),\n ];\n const columnName = getValue(lastChild, state);\n const columnOptions: Completion[] =\n await suggestionProvider.getSuggestions(\"operator\", {\n columnName,\n });\n\n return {\n from: context.pos,\n options: options.concat(columnOptions),\n };\n }\n } else if (lastChild?.name === \"CallExpression\") {\n if (maybeComplete) {\n return {\n from: context.pos,\n options: [completionDone(onSubmit.current)],\n };\n }\n } else if (lastChild?.name === \"ArithmeticExpression\") {\n if (maybeComplete) {\n let options: Completion[] = [completionDone(onSubmit.current)];\n\n const lastExpressionChild = getLastChild(lastChild, context);\n if (lastExpressionChild?.name === \"Column\") {\n const columnName = getValue(lastExpressionChild, state);\n // TODO need to exclude columns already included in expression\n\n const suggestions = await suggestionProvider.getSuggestions(\n \"operator\",\n { columnName }\n );\n options = options.concat(suggestions);\n }\n\n return {\n from: context.pos,\n options,\n };\n }\n } else if (lastChild?.name === \"ConditionalExpression\") {\n return handleConditionalExpression(\n lastChild,\n context,\n suggestionProvider,\n maybeComplete,\n onSubmit.current\n );\n }\n break;\n }\n case \"Column\":\n {\n const isPartialMatch = await suggestionProvider.isPartialMatch(\n \"expression\",\n undefined,\n word.text\n );\n\n if (isPartialMatch) {\n return makeSuggestions(context, \"expression\", {\n startsWith: word.text,\n });\n }\n }\n break;\n case \"Comma\":\n {\n const parentNode = getNamedParentNode(nodeBefore);\n if (parentNode?.name === \"ConditionalExpression\") {\n return makeSuggestions(context, \"expression\");\n }\n }\n break;\n\n case \"CloseBrace\":\n {\n const parentNode = getNamedParentNode(nodeBefore);\n if (parentNode?.name === \"ConditionalExpression\") {\n return handleConditionalExpression(\n parentNode,\n context,\n suggestionProvider,\n maybeComplete,\n onSubmit.current\n );\n } else if (parentNode?.name === \"ArgList\") {\n if (maybeComplete) {\n return promptToSave(context, onSubmit.current);\n }\n }\n }\n break;\n\n default: {\n if (nodeBefore?.prevSibling?.name === \"FilterClause\") {\n console.log(\"looks like we ight be a or|and operator\");\n }\n }\n }\n },\n [makeSuggestions, onSubmit, suggestionProvider]\n ) as CompletionSource;\n};\n", "import {\n AnnotationType,\n Completion,\n EditorView,\n getRelationalOperators,\n numericOperators,\n stringOperators,\n toSuggestions,\n} from \"@vuu-ui/vuu-codemirror\";\nimport {\n getTypeaheadParams,\n useTypeaheadSuggestions,\n} from \"@vuu-ui/vuu-data-react\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport { isNumericColumn, isTextColumn } from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useRef } from \"react\";\nimport {\n ColumnFunctionDescriptor,\n columnFunctionDescriptors,\n} from \"./column-function-descriptors\";\nimport { functionDocInfo } from \"./functionDocInfo\";\nimport {\n ColumnExpressionOperator,\n ColumnExpressionSuggestionType,\n IExpressionSuggestionProvider,\n} from \"./useColumnExpressionEditor\";\n\nconst NO_OPERATORS = [] as Completion[];\n\nconst withApplySpace = (suggestions: Completion[]): Completion[] =>\n suggestions.map((suggestion) => ({\n ...suggestion,\n apply: (suggestion.apply ?? suggestion.label) + \" \",\n }));\n\ntype ColumnOptions = {\n functionName?: string;\n operator?: ColumnExpressionOperator;\n prefix?: string;\n};\n\nconst getValidColumns = (\n columns: ColumnDescriptor[],\n { functionName, operator }: ColumnOptions\n) => {\n if (operator) {\n return columns.filter(isNumericColumn);\n } else if (functionName) {\n const fn = columnFunctionDescriptors.find((f) => f.name === functionName);\n if (fn) {\n switch (fn.accepts) {\n case \"string\":\n return columns.filter(isTextColumn);\n case \"number\":\n return columns.filter(isNumericColumn);\n default:\n return columns;\n }\n }\n }\n return columns;\n};\n\nconst getColumns = (columns: ColumnDescriptor[], options: ColumnOptions) => {\n const validColumns = getValidColumns(columns, options);\n return validColumns.map((column) => {\n const label = column.label ?? column.name;\n return {\n apply: options.prefix ? `${options.prefix}${column.name}` : column.name,\n label,\n boost: 5,\n type: \"column\",\n expressionType: column.serverDataType,\n };\n });\n};\n\n// prettier-ignore\nconst arithmeticOperators = [\n { apply: \"* \", boost: 2, label: \"*\", type: \"operator\" },\n { apply: \"/ \", boost: 2, label: \"/\", type: \"operator\" },\n { apply: \"+ \", boost: 2, label: \"+\", type: \"operator\" },\n { apply: \"- \", boost: 2, label: \"-\", type: \"operator\" },\n];\n\nconst getOperators = (column?: ColumnDescriptor) => {\n if (column === undefined || isNumericColumn(column)) {\n return arithmeticOperators;\n } else {\n return NO_OPERATORS;\n }\n};\n\nconst getConditionOperators = (column: ColumnDescriptor) => {\n switch (column.serverDataType) {\n case \"string\":\n case \"char\":\n return withApplySpace(stringOperators /*, startsWith*/);\n case \"int\":\n case \"long\":\n case \"double\":\n return withApplySpace(numericOperators);\n }\n};\n\nconst toFunctionCompletion = (\n functionDescriptor: ColumnFunctionDescriptor\n) => ({\n apply: `${functionDescriptor.name}( `,\n boost: 2,\n expressionType: functionDescriptor.type,\n info: () => functionDocInfo(functionDescriptor),\n label: functionDescriptor.name,\n type: \"function\",\n});\n\nconst getAcceptedTypes = (fn?: ColumnFunctionDescriptor) => {\n if (fn) {\n if (typeof fn.accepts === \"string\") {\n return fn.accepts;\n } else if (Array.isArray(fn.accepts)) {\n if (fn.accepts.every((s) => s === \"string\")) {\n return \"string\";\n } else {\n return \"any\";\n }\n }\n }\n return \"any\";\n};\n\nconst functions: Completion[] =\n columnFunctionDescriptors.map(toFunctionCompletion);\n\nconst getFunctions = ({ functionName }: ColumnOptions) => {\n if (functionName) {\n const fn = columnFunctionDescriptors.find((f) => f.name === functionName);\n const acceptedTypes = getAcceptedTypes(fn);\n if (fn) {\n switch (acceptedTypes) {\n case \"string\":\n return columnFunctionDescriptors\n .filter((f) => f.type === \"string\" || f.type === \"variable\")\n .map(toFunctionCompletion);\n case \"number\":\n return columnFunctionDescriptors\n .filter((f) => f.type === \"number\" || f.type === \"variable\")\n .map(toFunctionCompletion);\n default:\n }\n }\n }\n return functions;\n};\n\nexport interface SuggestionProviderHookProps {\n columns: ColumnDescriptor[];\n table: VuuTable;\n}\n\nconst NONE = {};\n\nexport const useColumnExpressionSuggestionProvider = ({\n columns,\n table,\n}: SuggestionProviderHookProps): IExpressionSuggestionProvider => {\n const findColumn = useCallback(\n (name?: string) =>\n name ? columns.find((col) => col.name === name) : undefined,\n [columns]\n );\n\n const latestSuggestionsRef = useRef<Completion[]>();\n const getTypeaheadSuggestions = useTypeaheadSuggestions();\n\n const getSuggestions: IExpressionSuggestionProvider[\"getSuggestions\"] =\n useCallback(\n async (suggestionType, options = NONE): Promise<Completion[]> => {\n const { columnName, functionName, operator, prefix } = options;\n\n switch (suggestionType) {\n case \"expression\": {\n const suggestions = await withApplySpace(\n getColumns(columns, { functionName, prefix })\n ).concat(getFunctions(options));\n return (latestSuggestionsRef.current = suggestions);\n }\n case \"column\": {\n const suggestions = await getColumns(columns, options);\n return (latestSuggestionsRef.current = withApplySpace(suggestions));\n }\n case \"operator\": {\n const suggestions = await getOperators(findColumn(columnName));\n return (latestSuggestionsRef.current = withApplySpace(suggestions));\n }\n case \"relational-operator\": {\n const suggestions = await getRelationalOperators(\n findColumn(columnName)\n );\n return (latestSuggestionsRef.current = withApplySpace(suggestions));\n }\n case \"condition-operator\":\n {\n const column = findColumn(columnName);\n if (column) {\n const suggestions = await getConditionOperators(column);\n if (suggestions) {\n return (latestSuggestionsRef.current =\n withApplySpace(suggestions));\n }\n }\n }\n break;\n case \"columnValue\":\n if (columnName && operator) {\n // const column = findColumn(columnName);\n const params = getTypeaheadParams(\n table,\n columnName /*, startsWith*/\n );\n const suggestions = await getTypeaheadSuggestions(params);\n latestSuggestionsRef.current = toSuggestions(suggestions, {\n suffix: \"\",\n });\n\n latestSuggestionsRef.current.forEach((suggestion) => {\n suggestion.apply = (\n view: EditorView,\n completion: Completion,\n from: number\n ) => {\n const annotation = new AnnotationType<Completion>();\n const cursorPos = from + completion.label.length + 1;\n view.dispatch({\n changes: { from, insert: completion.label },\n selection: { anchor: cursorPos, head: cursorPos },\n annotations: annotation.of(completion),\n });\n };\n });\n return latestSuggestionsRef.current;\n }\n break;\n }\n\n return [];\n },\n [columns, findColumn, getTypeaheadSuggestions, table]\n );\n\n const isPartialMatch = useCallback(\n async (\n valueType: ColumnExpressionSuggestionType,\n columnName?: string,\n pattern?: string\n ) => {\n const { current: latestSuggestions } = latestSuggestionsRef;\n let maybe = false;\n const suggestions =\n latestSuggestions || (await getSuggestions(valueType, { columnName }));\n if (pattern && suggestions) {\n for (const option of suggestions) {\n if (option.label === pattern) {\n return false;\n } else if (option.label.startsWith(pattern)) {\n maybe = true;\n }\n }\n }\n return maybe;\n },\n [getSuggestions]\n );\n\n return {\n getSuggestions,\n isPartialMatch,\n };\n};\n", "export type ColumnFunctionDescriptor = {\n accepts:\n | \"string\"\n | \"number\"\n | \"boolean\"\n | \"any\"\n | Array<\"string\" | \"number\" | \"boolean\">;\n description: string;\n example: {\n expression: string;\n result: string;\n };\n name: string;\n params: {\n count?: number;\n description: string;\n };\n type: \"string\" | \"number\" | \"boolean\" | \"variable\";\n};\n\nexport const columnFunctionDescriptors: ColumnFunctionDescriptor[] = [\n /**\n * and\n */\n {\n accepts: [\"boolean\"],\n description:\n \"Applies boolean and operator across supplied parameters to returns a single boolean result\",\n example: {\n expression: 'and(ccy=\"EUR\",quantity=0)',\n result: \"true | false\",\n },\n name: \"and\",\n params: {\n description: \"( boolean, [ boolean* ] )\",\n },\n type: \"boolean\",\n },\n\n /**\n * concatenate()\n */\n {\n accepts: \"string\",\n description:\n \"Returns multiple string values as a single joined string. Arguments may be string literal values, string columns or other string expressions. Non string arguments may also be included, these will be converted to strings.\",\n example: {\n expression: 'concatenate(\"example\", \"-test\")',\n result: '\"example-test\"',\n },\n name: \"concatenate\",\n params: {\n description: \"( string, string, [ string* ] )\",\n },\n type: \"string\",\n },\n /**\n * contains()\n */\n {\n accepts: [\"string\", \"string\"],\n description:\n \"Tests a string value to determine whether it contains a given substring. Accepts two arguments: source text and target substring. Returns true if <source text> contains one or more occurrences of <target subscring>\",\n example: {\n expression: 'contains(\"Royal Bank of Scotland\", \"bank\")',\n result: \"true\",\n },\n name: \"contains\",\n params: {\n description: \"( string )\",\n },\n type: \"boolean\",\n },\n\n /**\n * left()\n */\n {\n accepts: [\"string\", \"number\"],\n description:\n \"Returns the leftmost <number> characters from <string>. First argument may be a string literal, string column or other string expression.\",\n example: {\n expression: 'left(\"USD Benchmark Report\", 3)',\n result: '\"USD\"',\n },\n name: \"left\",\n params: {\n count: 2,\n description: \"( string, number )\",\n },\n type: \"string\",\n },\n /**\n * len()\n */\n {\n accepts: \"string\",\n description:\n \"Returns the number of characters in <string>. Argument may be a string literal, string column or other string expression.\",\n example: {\n expression: 'len(\"example\")',\n result: \"7\",\n },\n name: \"len\",\n params: {\n description: \"(string)\",\n },\n type: \"number\",\n },\n /**\n * lower()\n */\n {\n accepts: \"string\",\n description:\n \"Convert a string value to lowercase. Argument may be a string column or other string expression.\",\n example: {\n expression: 'lower(\"examPLE\")',\n result: '\"example\"',\n },\n name: \"lower\",\n params: {\n description: \"( string )\",\n },\n type: \"string\",\n },\n /**\n * or\n */\n {\n accepts: [\"boolean\"],\n description:\n \"Applies boolean or operator across supplied parameters to returns a single boolean result\",\n example: {\n expression: 'or(status=\"cancelled\",quantity=0)',\n result: \"true | false\",\n },\n name: \"or\",\n params: {\n description: \"( boolean, [ boolean* ] )\",\n },\n type: \"boolean\",\n },\n\n /**\n * upper()\n */\n {\n accepts: \"string\",\n description:\n \"Convert a string value to uppercase. Argument may be a string column or other string expression.\",\n example: {\n expression: 'upper(\"example\")',\n result: '\"EXAMPLE\"',\n },\n name: \"upper\",\n params: {\n description: \"( string )\",\n },\n type: \"string\",\n },\n /**\n * right()\n */\n {\n accepts: [\"string\", \"number\"],\n description:\n \"Returns the rightmost <number> characters from <string>. First argument may be a string literal, string column or other string expression.\",\n example: {\n expression: \"blah\",\n result: \"blah\",\n },\n name: \"right\",\n params: {\n description: \"( string )\",\n },\n type: \"string\",\n },\n /**\n * replace()\n */\n {\n accepts: [\"string\", \"string\", \"string\"],\n description:\n \"Replace characters within a string. Accepts three arguments: source text, text to replace and replacement text. Returns a copy of <source text> with any occurrences of <text to replace> replaced by <replacement text>\",\n example: {\n expression: \"blah\",\n result: \"blah\",\n },\n name: \"replace\",\n params: {\n description: \"( string )\",\n },\n type: \"string\",\n },\n /**\n * text()\n */\n {\n accepts: \"number\",\n description: \"Converts a number to a string.\",\n example: {\n expression: \"blah\",\n result: \"blah\",\n },\n name: \"text\",\n params: {\n description: \"( string )\",\n },\n type: \"string\",\n },\n /**\n * starts()\n */\n {\n accepts: \"string\",\n description:\n \"Tests a string value to determine whether it starts with a given substring. Accepts two arguments: source text and target substring. Returns true if <source text> starts with <target subscring>.\",\n example: {\n expression: \"blah\",\n result: \"blah\",\n },\n name: \"starts\",\n params: {\n description: \"( string )\",\n },\n type: \"boolean\",\n },\n /**\n * starts()\n */\n {\n accepts: \"string\",\n description:\n \"Tests a string value to determine whether it ends with a given substring. Accepts two arguments: source text and target substring. Returns true if <source text> ends with <target subscring>.\",\n example: {\n expression: \"blah\",\n result: \"blah\",\n },\n name: \"ends\",\n params: {\n description: \"( string )\",\n },\n type: \"boolean\",\n },\n {\n accepts: \"number\",\n description: \"blah\",\n example: {\n expression: \"blah\",\n result: \"blah\",\n },\n name: \"min\",\n params: {\n description: \"( string )\",\n },\n type: \"number\",\n },\n {\n accepts: \"number\",\n description: \"blah\",\n example: {\n expression: \"blah\",\n result: \"blah\",\n },\n name: \"max\",\n params: {\n description: \"( string )\",\n },\n type: \"number\",\n },\n {\n accepts: \"number\",\n description: \"blah\",\n example: {\n expression: \"blah\",\n result: \"blah\",\n },\n name: \"sum\",\n params: {\n description: \"( string )\",\n },\n type: \"number\",\n },\n {\n accepts: \"number\",\n description: \"blah\",\n example: {\n expression: \"blah\",\n result: \"blah\",\n },\n name: \"round\",\n params: {\n description: \"( string )\",\n },\n type: \"number\",\n },\n {\n accepts: \"any\",\n description: \"blah\",\n example: {\n expression: \"blah\",\n result: \"blah\",\n },\n name: \"or\",\n params: {\n description: \"( string )\",\n },\n type: \"boolean\",\n },\n {\n accepts: \"any\",\n description: \"blah\",\n example: {\n expression: \"blah\",\n result: \"blah\",\n },\n name: \"and\",\n params: {\n description: \"( string )\",\n },\n type: \"boolean\",\n },\n {\n accepts: \"any\",\n description:\n \"Return one of two possible result values, depending on the evaluation of a filter expression. If <filterExpression> resolves to true, result is <expression1>, otherwise <expression2>. \",\n example: {\n expression: \"blah\",\n result: \"blah\",\n },\n name: \"if\",\n params: {\n description: \"( filterExpression, expression1, expression 2)\",\n },\n type: \"variable\",\n },\n];\n", "import { createEl } from \"@vuu-ui/vuu-utils\";\nimport { ColumnFunctionDescriptor } from \"./column-function-descriptors\";\n\nexport const functionDocInfo = ({\n name,\n description,\n example,\n params,\n type,\n}: ColumnFunctionDescriptor) => {\n const rootElement = createEl(\"div\", \"vuuFunctionDoc\");\n const headingElement = createEl(\"div\", \"function-heading\");\n\n const nameElement = createEl(\"span\", \"function-name\", name);\n const paramElement = createEl(\"span\", \"param-list\", params.description);\n const typeElement = createEl(\"span\", \"function-type\", type);\n\n headingElement.appendChild(nameElement);\n headingElement.appendChild(paramElement);\n headingElement.appendChild(typeElement);\n\n const child2 = createEl(\"p\", undefined, description);\n\n rootElement.appendChild(headingElement);\n rootElement.appendChild(child2);\n\n if (example) {\n const exampleElement = createEl(\"div\", \"example-container\");\n const expressionElement = createEl(\n \"div\",\n \"example-expression\",\n example.expression\n );\n const resultElement = createEl(\"div\", \"example-result\", example.result);\n\n exampleElement.appendChild(expressionElement);\n\n rootElement.appendChild(exampleElement);\n rootElement.appendChild(resultElement);\n }\n\n return rootElement;\n};\n", "import { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport {\n getCalculatedColumnDetails,\n setCalculatedColumnExpression,\n setCalculatedColumnName,\n setCalculatedColumnType,\n} from \"@vuu-ui/vuu-utils\";\nimport { FormEventHandler, useCallback, useRef, useState } from \"react\";\nimport { ColumnExpressionPanelProps } from \"./ColumnExpressionPanel\";\n\nexport type ColumnExpressionHookProps = Pick<\n ColumnExpressionPanelProps,\n \"column\" | \"onChangeName\"\n>;\n\nconst applyDefaults = (column: ColumnDescriptor) => {\n const [name, expression, type] = getCalculatedColumnDetails(column);\n if (type === \"\") {\n return {\n ...column,\n name: `${name}:string:${expression}`,\n };\n } else {\n return column;\n }\n};\n\nexport const useColumnExpression = ({\n column: columnProp,\n onChangeName: onChangeNameProp,\n}: ColumnExpressionHookProps) => {\n const [column, _setColumn] = useState<ColumnDescriptor>(\n applyDefaults(columnProp)\n );\n const columnRef = useRef<ColumnDescriptor>(columnProp);\n const setColumn = useCallback((column: ColumnDescriptor) => {\n columnRef.current = column;\n _setColumn(column);\n }, []);\n\n // We need to track column name in a ref because ColunExpressionInput\n // is not a pure React component, it hosts a CodeMirror editor. We\n // do not want to cause it to render mid-edit. Therefore it uses memo\n // and only renders on initial load. onChangeExpression must be stable.\n // const columnNameRef = useRef<string>(column.name);\n // const expressionRef = useRef(getCalculatedColumnDetails(column)[1]);\n\n const onChangeName = useCallback<FormEventHandler>(\n (evt) => {\n const { value } = evt.target as HTMLInputElement;\n const newColumn = setCalculatedColumnName(column, value);\n // columnNameRef.current = newColumn.name;\n setColumn(newColumn);\n onChangeNameProp?.(newColumn.name);\n },\n [column, onChangeNameProp, setColumn]\n );\n\n const onChangeExpression = useCallback(\n (value: string) => {\n // we do not set state when this changes as the codemirror editor\n // manages state of the expression for us until complete\n const expression = value.trim();\n // expressionRef.current = expression;\n // const [name, , type] = column.name.split(\":\");\n // columnNameRef.current = `${name}:${expression}:${type}`;\n\n const { current: column } = columnRef;\n const newColumn = setCalculatedColumnExpression(column, expression);\n setColumn(newColumn);\n\n onChangeNameProp?.(newColumn.name);\n\n // console.log(`calculatedColumnName ${columnNameRef.current}`);\n },\n [onChangeNameProp, setColumn]\n );\n\n const onChangeType = useCallback(\n (evt, value: string | null) => {\n if (typeof value === \"string\") {\n const newColumn = setCalculatedColumnType(column, value);\n setColumn(newColumn);\n onChangeNameProp?.(newColumn.name);\n }\n },\n [column, onChangeNameProp, setColumn]\n );\n\n return {\n column,\n onChangeExpression,\n onChangeName,\n onChangeType,\n };\n};\n", "import {\n ColumnDescriptor,\n ColumnDescriptorCustomRenderer,\n ColumnTypeRendering,\n} from \"@vuu-ui/vuu-table-types\";\nimport { Dropdown, SingleSelectionHandler } from \"@vuu-ui/vuu-ui-controls\";\nimport {\n CellRendererDescriptor,\n ConfigurationEditorProps,\n getCellRendererOptions,\n getConfigurationEditor,\n isColumnTypeRenderer,\n isTypeDescriptor,\n} from \"@vuu-ui/vuu-utils\";\nimport { FormField, FormFieldLabel } from \"@salt-ds/core\";\nimport cx from \"clsx\";\nimport { HTMLAttributes, useCallback, useMemo } from \"react\";\nimport { BaseNumericFormattingSettings } from \"./BaseNumericFormattingSettings\";\nimport { LongTypeFormattingSettings } from \"./LongTypeFormattingSettings\";\nimport { FormattingSettingsProps } from \"./types\";\n\nconst classBase = \"vuuColumnFormattingPanel\";\n\nexport interface ColumnFormattingPanelProps\n extends HTMLAttributes<HTMLDivElement>,\n FormattingSettingsProps {\n availableRenderers: CellRendererDescriptor[];\n column: ColumnDescriptor;\n onChangeRendering: (renderProps: ColumnTypeRendering) => void;\n}\n\nconst itemToString = (item: CellRendererDescriptor) => item.label ?? item.name;\n\nexport const ColumnFormattingPanel = ({\n availableRenderers,\n className,\n column,\n onChangeFormatting,\n onChangeType,\n onChangeRendering,\n ...htmlAttributes\n}: ColumnFormattingPanelProps) => {\n const formattingSettingsForType = useMemo(\n () =>\n formattingSettingsByColType({ column, onChangeFormatting, onChangeType }),\n [column, onChangeFormatting, onChangeType]\n );\n\n const ConfigEditor = useMemo<\n React.FC<ConfigurationEditorProps> | undefined\n >(() => {\n const { type } = column;\n if (isTypeDescriptor(type) && isColumnTypeRenderer(type.renderer)) {\n const cellRendererOptions = getCellRendererOptions(type.renderer.name);\n return getConfigurationEditor(cellRendererOptions?.configEditor);\n }\n return undefined;\n }, [column]);\n\n const selectedCellRenderer = useMemo(() => {\n const { type } = column;\n const [defaultRenderer] = availableRenderers;\n const rendererName =\n isTypeDescriptor(type) && isColumnTypeRenderer(type.renderer)\n ? type.renderer.name\n : undefined;\n const configuredRenderer = availableRenderers.find(\n (renderer) => renderer.name === rendererName\n );\n return configuredRenderer ?? defaultRenderer;\n }, [availableRenderers, column]);\n\n const handleChangeRenderer = useCallback<\n SingleSelectionHandler<CellRendererDescriptor>\n >(\n (_, cellRendererDescriptor) => {\n const renderProps: ColumnTypeRendering = {\n name: cellRendererDescriptor.name,\n };\n onChangeRendering?.(renderProps);\n },\n [onChangeRendering]\n );\n\n const { serverDataType = \"string\" } = column;\n\n return (\n <div {...htmlAttributes} className={`vuuColumnSettingsPanel-header`}>\n <div>Formatting</div>\n\n <FormField>\n <FormFieldLabel>\n {`Renderer (data type ${column.serverDataType})`}\n </FormFieldLabel>\n <Dropdown<CellRendererDescriptor>\n className={cx(`${classBase}-renderer`)}\n itemToString={itemToString}\n onSelectionChange={handleChangeRenderer}\n selected={selectedCellRenderer}\n source={availableRenderers}\n width=\"100%\"\n />\n </FormField>\n <div\n className={cx(classBase, className, `${classBase}-${serverDataType}`)}\n >\n {formattingSettingsForType}\n {ConfigEditor ? (\n <ConfigEditor\n column={column as ColumnDescriptorCustomRenderer}\n onChangeRendering={onChangeRendering}\n />\n ) : null}\n </div>\n </div>\n );\n};\n\nfunction formattingSettingsByColType(props: FormattingSettingsProps) {\n const { column } = props;\n\n switch (column.serverDataType) {\n case \"double\":\n case \"int\":\n return <BaseNumericFormattingSettings {...props} />;\n case \"long\":\n return <LongTypeFormattingSettings {...props} />;\n default:\n return null;\n }\n}\n", "import { FormField, FormFieldLabel, Input, Switch } from \"@salt-ds/core\";\nimport { ColumnTypeFormatting } from \"@vuu-ui/vuu-table-types\";\nimport { getTypeFormattingFromColumn } from \"@vuu-ui/vuu-utils\";\nimport {\n ChangeEvent,\n KeyboardEvent,\n SyntheticEvent,\n useCallback,\n useState,\n} from \"react\";\nimport { FormattingSettingsProps } from \"./types\";\n\nconst classBase = \"vuuFormattingSettings\";\n\nexport const BaseNumericFormattingSettings = ({\n column,\n onChangeFormatting: onChange,\n}: FormattingSettingsProps) => {\n const [formattingSettings, setFormattingSettings] =\n useState<ColumnTypeFormatting>(getTypeFormattingFromColumn(column));\n\n const handleInputKeyDown = useCallback(\n (evt: KeyboardEvent<HTMLInputElement>) => {\n if (evt.key === \"Enter\" || evt.key === \"Tab\") {\n onChange(formattingSettings);\n }\n },\n [formattingSettings, onChange]\n );\n\n const handleChangeDecimals = useCallback(\n (evt: SyntheticEvent) => {\n const { value } = evt.target as HTMLFormElement;\n const numericValue: number | undefined =\n value === \"\"\n ? undefined\n : isNaN(parseInt(value))\n ? undefined\n : parseInt(value);\n\n const newFormattingSettings = {\n ...formattingSettings,\n decimals: numericValue,\n };\n setFormattingSettings(newFormattingSettings);\n },\n [formattingSettings]\n );\n\n const handleChangeAlignDecimals = useCallback(\n (evt: ChangeEvent<HTMLInputElement>) => {\n const { checked } = evt.target as HTMLInputElement;\n const newFormattingSettings = {\n ...formattingSettings,\n alignOnDecimals: checked,\n };\n setFormattingSettings(newFormattingSettings);\n onChange(newFormattingSettings);\n },\n [formattingSettings, onChange]\n );\n\n const handleChangeZeroPad = useCallback(\n (evt: ChangeEvent<HTMLInputElement>) => {\n const { checked } = evt.target as HTMLInputElement;\n const newFormattingSettings = {\n ...formattingSettings,\n zeroPad: checked,\n };\n setFormattingSettings(newFormattingSettings);\n onChange(newFormattingSettings);\n },\n [formattingSettings, onChange]\n );\n\n return (\n <div className={classBase}>\n <FormField data-field=\"decimals\">\n <FormFieldLabel>Number of decimals</FormFieldLabel>\n <Input\n className=\"vuuInput\"\n onChange={handleChangeDecimals}\n onKeyDown={handleInputKeyDown}\n value={formattingSettings.decimals ?? \"\"}\n />\n </FormField>\n\n <FormField labelPlacement=\"left\">\n <FormFieldLabel>Align on decimals</FormFieldLabel>\n <Switch\n checked={formattingSettings.alignOnDecimals ?? false}\n onChange={handleChangeAlignDecimals}\n value=\"align-decimals\"\n />\n </FormField>\n <FormField labelPlacement=\"left\">\n <FormFieldLabel>Zero pad decimals</FormFieldLabel>\n <Switch\n checked={formattingSettings.zeroPad ?? false}\n onChange={handleChangeZeroPad}\n value=\"zero-pad\"\n />\n </FormField>\n </div>\n );\n};\n", "import React, { useCallback } from \"react\";\nimport {\n FormField,\n FormFieldLabel,\n ToggleButton,\n ToggleButtonGroup,\n} from \"@salt-ds/core\";\nimport { isDateTimeColumn, isTypeDescriptor } from \"@vuu-ui/vuu-utils\";\nimport { DateTimeFormattingSettings } from \"./DateTimeFormattingSettings\";\nimport { BaseNumericFormattingSettings } from \"./BaseNumericFormattingSettings\";\nimport { FormattingSettingsProps } from \"./types\";\n\nimport \"./LongTypeFormattingSettings.css\";\n\nconst classBase = \"vuuLongColumnFormattingSettings\";\n\nexport const LongTypeFormattingSettings: React.FC<FormattingSettingsProps> = (\n props\n) => {\n const { column, onChangeType } = props;\n const type = isTypeDescriptor(column.type) ? column.type.name : column.type;\n\n const handleToggleChange = useCallback(\n (event: React.SyntheticEvent<HTMLButtonElement, Event>) => {\n const value = event.currentTarget.value as ToggleValue;\n onChangeType(value);\n },\n [onChangeType]\n );\n\n return (\n <div className={classBase}>\n <FormField>\n <FormFieldLabel>{\"Type inferred as\"}</FormFieldLabel>\n <ToggleButtonGroup\n className=\"vuuToggleButtonGroup\"\n onChange={handleToggleChange}\n value={type ?? \"number\"}\n >\n {toggleValues.map((v) => (\n <ToggleButton key={v} value={v}>\n {v.toUpperCase()}\n </ToggleButton>\n ))}\n </ToggleButtonGroup>\n </FormField>\n\n {isDateTimeColumn(column) ? (\n <DateTimeFormattingSettings {...props} column={column} />\n ) : (\n <BaseNumericFormattingSettings {...props} />\n )}\n </div>\n );\n};\n\nconst toggleValues = [\"number\", \"date/time\"] as const;\ntype ToggleValue = (typeof toggleValues)[number];\n", "import React, { SyntheticEvent, useCallback, useMemo, useState } from \"react\";\nimport { Dropdown, SingleSelectionHandler } from \"@vuu-ui/vuu-ui-controls\";\nimport {\n DateTimePattern,\n defaultPatternsByType,\n fallbackDateTimePattern,\n getTypeFormattingFromColumn,\n supportedDateTimePatterns,\n} from \"@vuu-ui/vuu-utils\";\nimport {\n FormField,\n FormFieldLabel,\n ToggleButton,\n ToggleButtonGroup,\n} from \"@salt-ds/core\";\nimport { DateTimeColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { FormattingSettingsProps } from \"./types\";\n\nexport const DateTimeFormattingSettings: React.FC<\n FormattingSettingsProps<DateTimeColumnDescriptor>\n> = ({ column, onChangeFormatting: onChange }) => {\n const formatting = getTypeFormattingFromColumn(column);\n const { pattern = fallbackDateTimePattern } = formatting;\n const toggleValue = useMemo(() => getToggleValue(pattern), [pattern]);\n\n const [fallbackState, setFallbackState] = useState<Required<DateTimePattern>>(\n {\n time: pattern.time ?? defaultPatternsByType.time,\n date: pattern.date ?? defaultPatternsByType.date,\n }\n );\n\n const onPatternChange = useCallback(\n (pattern: DateTimePattern) => onChange({ ...formatting, pattern }),\n [onChange, formatting]\n );\n\n const onDropdownChange = useCallback<\n <T extends keyof DateTimePattern>(\n key: T\n ) => SingleSelectionHandler<Required<DateTimePattern>[T]>\n >(\n (key) => (_, p) => {\n const updatedPattern = { ...(pattern ?? {}), [key]: p };\n setFallbackState((s) => ({\n time: updatedPattern.time ?? s.time,\n date: updatedPattern.date ?? s.date,\n }));\n onPatternChange(updatedPattern);\n },\n [onPatternChange, pattern]\n );\n\n const onToggleChange = useCallback(\n (evnt: SyntheticEvent<HTMLButtonElement, Event>) => {\n const value = evnt.currentTarget.value as ToggleValue;\n switch (value) {\n case \"time\":\n return onPatternChange({\n [value]: pattern[value] ?? fallbackState[value],\n });\n case \"date\":\n return onPatternChange({\n [value]: pattern[value] ?? fallbackState[value],\n });\n case \"both\":\n return onPatternChange({\n time: pattern.time ?? fallbackState.time,\n date: pattern.date ?? fallbackState.date,\n });\n }\n },\n [onPatternChange, pattern, fallbackState]\n );\n\n return (\n <>\n <FormField labelPlacement=\"left\">\n <FormFieldLabel>{\"Display\"}</FormFieldLabel>\n <ToggleButtonGroup\n className=\"vuuToggleButtonGroup\"\n onChange={onToggleChange}\n value={toggleValue}\n >\n {toggleValues.map((v) => (\n <ToggleButton key={v} value={v}>\n {v.toUpperCase()}\n </ToggleButton>\n ))}\n </ToggleButtonGroup>\n </FormField>\n\n {([\"date\", \"time\"] as const)\n .filter((v) => !!pattern[v])\n .map((v) => (\n <FormField labelPlacement=\"left\" key={v}>\n <FormFieldLabel>{`${labelByType[v]} pattern`}</FormFieldLabel>\n <Dropdown<Required<DateTimePattern>[typeof v]>\n onSelectionChange={onDropdownChange(v)}\n selected={pattern[v]}\n source={supportedDateTimePatterns[v]}\n width=\"100%\"\n />\n </FormField>\n ))}\n </>\n );\n};\n\nconst labelByType = { date: \"Date\", time: \"Time\" } as const;\n\nconst toggleValues = [\"date\", \"time\", \"both\"] as const;\n\ntype ToggleValue = (typeof toggleValues)[number];\n\nfunction getToggleValue(pattern: DateTimePattern): ToggleValue {\n return !pattern.time ? \"date\" : !pattern.date ? \"time\" : \"both\";\n}\n", "import { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport cx from \"clsx\";\n\nimport {\n getCalculatedColumnDetails,\n isCalculatedColumn,\n} from \"@vuu-ui/vuu-utils\";\n\nimport \"./ColumnNameLabel.css\";\nimport { MouseEventHandler } from \"react\";\n\nconst classBase = \"vuuColumnNameLabel\";\n\nexport interface ColumnNameLabelProps {\n column: ColumnDescriptor;\n onClick: MouseEventHandler;\n}\n\nexport const ColumnNameLabel = ({ column, onClick }: ColumnNameLabelProps) => {\n if (isCalculatedColumn(column.name)) {\n const [name, type, expression] = getCalculatedColumnDetails(column);\n const displayName = name || \"name\";\n const displayExpression = \"=expression\";\n\n const nameClass =\n displayName === \"name\" ? `${classBase}-placeholder` : undefined;\n const expressionClass =\n expression === \"\" ? `${classBase}-placeholder` : undefined;\n return (\n <div\n className={cx(classBase, `${classBase}-calculated`)}\n onClick={onClick}\n >\n <span className={nameClass}>{displayName}</span>\n <span>:</span>\n <span>{type || \"string\"}</span>\n <span>:</span>\n <span className={expressionClass}>{displayExpression}</span>\n <span className={`${classBase}-edit`} data-icon=\"edit\" />\n </div>\n );\n } else {\n return <div className={classBase}>{column.name}</div>;\n }\n};\n", "import {\n ColumnDescriptor,\n TableConfig,\n ColumnTypeFormatting,\n ColumnSettingsProps,\n ColumnTypeSimple,\n} from \"@vuu-ui/vuu-table-types\";\n\nimport {\n CellRendererDescriptor,\n ColumnRenderPropsChangeHandler,\n getRegisteredCellRenderers,\n isValidColumnAlignment,\n isValidPinLocation,\n setCalculatedColumnName,\n updateColumnRenderProps,\n updateColumnFormatting,\n updateColumnType,\n} from \"@vuu-ui/vuu-utils\";\nimport {\n FormEventHandler,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nconst integerCellRenderers: CellRendererDescriptor[] = [\n {\n description: \"Default formatter for columns with data type integer\",\n label: \"Default Renderer (int, long)\",\n name: \"default-int\",\n },\n ...getRegisteredCellRenderers(\"int\"),\n];\nconst doubleCellRenderers: CellRendererDescriptor[] = [\n {\n description: \"Default formatter for columns with data type double\",\n label: \"Default Renderer (double)\",\n name: \"default-double\",\n },\n ...getRegisteredCellRenderers(\"double\"),\n];\n\nconst stringCellRenderers: CellRendererDescriptor[] = [\n {\n description: \"Default formatter for columns with data type string\",\n label: \"Default Renderer (string)\",\n name: \"default-string\",\n },\n ...getRegisteredCellRenderers(\"string\"),\n];\n\nconst booleanCellRenderers: CellRendererDescriptor[] = [\n ...getRegisteredCellRenderers(\"boolean\"),\n];\n\nconst getAvailableCellRenderers = (\n column: ColumnDescriptor\n): CellRendererDescriptor[] => {\n switch (column.serverDataType) {\n case \"char\":\n case \"string\":\n return stringCellRenderers;\n case \"int\":\n case \"long\":\n return integerCellRenderers;\n case \"double\":\n return doubleCellRenderers;\n case \"boolean\":\n return booleanCellRenderers;\n default:\n return stringCellRenderers;\n }\n};\n\nconst getFieldName = (input: HTMLInputElement): string => {\n const saltFormField = input.closest(\".saltFormField\") as HTMLElement;\n if (saltFormField && saltFormField.dataset.field) {\n const {\n dataset: { field },\n } = saltFormField;\n return field;\n } else {\n throw Error(\"named form field not found\");\n }\n};\n\nconst getColumn = (columns: ColumnDescriptor[], column: ColumnDescriptor) => {\n if (column.name === \"::\") {\n // this is a new calculated column\n return column;\n } else {\n const col = columns.find((col) => col.name === column.name);\n if (col) {\n return col;\n }\n throw Error(`columns does not contain column ${name}`);\n }\n};\n\nconst replaceColumn = (\n tableConfig: TableConfig,\n column: ColumnDescriptor\n): TableConfig => ({\n ...tableConfig,\n columns: tableConfig.columns.map((col) =>\n col.name === column.name ? column : col\n ),\n});\n\nexport const useColumnSettings = ({\n column: columnProp,\n onCancelCreateColumn,\n onConfigChange,\n onCreateCalculatedColumn,\n tableConfig,\n}: Omit<ColumnSettingsProps, \"vuuTable\">) => {\n const [column, setColumn] = useState<ColumnDescriptor>(\n getColumn(tableConfig.columns, columnProp)\n );\n const columnRef = useRef<ColumnDescriptor>(column);\n const [inEditMode, setEditMode] = useState(column.name === \"::\");\n\n const handleEditCalculatedcolumn = useCallback(() => {\n columnRef.current = column;\n setEditMode(true);\n }, [column]);\n\n useEffect(() => {\n setColumn(columnProp);\n setEditMode(columnProp.name === \"::\");\n }, [columnProp]);\n\n const availableRenderers = useMemo(() => {\n return getAvailableCellRenderers(column);\n }, [column]);\n\n const handleInputCommit = useCallback(() => {\n onConfigChange(replaceColumn(tableConfig, column));\n }, [column, onConfigChange, tableConfig]);\n\n const handleChange = useCallback<FormEventHandler>(\n (evt) => {\n const input = evt.target as HTMLInputElement;\n const fieldName = getFieldName(input);\n const { value } = input;\n switch (fieldName) {\n case \"column-label\":\n setColumn((state) => ({ ...state, label: value }));\n break;\n case \"column-name\":\n setColumn((state) => setCalculatedColumnName(state, value));\n break;\n case \"column-width\":\n setColumn((state) => ({ ...state, width: parseInt(value) }));\n break;\n case \"column-alignment\":\n if (isValidColumnAlignment(value)) {\n const newColumn: ColumnDescriptor = {\n ...column,\n align: value || undefined,\n };\n setColumn(newColumn);\n onConfigChange(replaceColumn(tableConfig, newColumn));\n }\n break;\n case \"column-pin\":\n if (isValidPinLocation(value)) {\n const newColumn: ColumnDescriptor = {\n ...column,\n pin: value || undefined,\n };\n setColumn(newColumn);\n onConfigChange(replaceColumn(tableConfig, newColumn));\n\n break;\n }\n }\n },\n [column, onConfigChange, tableConfig]\n );\n\n const handleChangeCalculatedColumnName = useCallback((name: string) => {\n setColumn((state) => ({ ...state, name }));\n }, []);\n\n const handleChangeFormatting = useCallback(\n (formatting: ColumnTypeFormatting) => {\n const newColumn = updateColumnFormatting(column, formatting);\n setColumn(newColumn);\n onConfigChange(replaceColumn(tableConfig, newColumn));\n },\n [column, onConfigChange, tableConfig]\n );\n\n const handleChangeType = useCallback(\n (type: ColumnTypeSimple) => {\n const updatedColumn = updateColumnType(column, type);\n setColumn(updatedColumn);\n onConfigChange(replaceColumn(tableConfig, updatedColumn));\n },\n [column, onConfigChange, tableConfig]\n );\n\n const handleChangeRendering = useCallback<ColumnRenderPropsChangeHandler>(\n (renderProps) => {\n if (renderProps) {\n const newColumn: ColumnDescriptor = updateColumnRenderProps(\n column,\n renderProps\n );\n setColumn(newColumn);\n onConfigChange(replaceColumn(tableConfig, newColumn));\n }\n },\n [column, onConfigChange, tableConfig]\n );\n\n const navigateColumn = useCallback(\n ({ moveBy }: { moveBy: number }) => {\n const { columns } = tableConfig;\n const index = columns.indexOf(column) + moveBy;\n const newColumn = columns[index];\n if (newColumn) {\n setColumn(newColumn);\n }\n },\n [column, tableConfig]\n );\n const navigateNextColumn = useCallback(() => {\n navigateColumn({ moveBy: 1 });\n }, [navigateColumn]);\n\n const navigatePrevColumn = useCallback(() => {\n navigateColumn({ moveBy: -1 });\n }, [navigateColumn]);\n\n const handleSaveCalculatedColumn = useCallback(() => {\n // TODO validate expression, unique name\n onCreateCalculatedColumn(column);\n }, [column, onCreateCalculatedColumn]);\n\n const handleCancelEdit = useCallback(() => {\n if (columnProp.name === \"::\") {\n onCancelCreateColumn();\n } else {\n if (columnRef.current !== undefined && columnRef.current !== column) {\n setColumn(columnRef.current);\n }\n setEditMode(false);\n }\n }, [column, columnProp.name, onCancelCreateColumn]);\n\n return {\n availableRenderers,\n editCalculatedColumn: inEditMode,\n column,\n navigateNextColumn,\n navigatePrevColumn,\n onCancel: handleCancelEdit,\n onChange: handleChange,\n onChangeCalculatedColumnName: handleChangeCalculatedColumnName,\n onChangeFormatting: handleChangeFormatting,\n onChangeRendering: handleChangeRendering,\n onChangeType: handleChangeType,\n onEditCalculatedColumn: handleEditCalculatedcolumn,\n onInputCommit: handleInputCommit,\n onSave: handleSaveCalculatedColumn,\n };\n};\n", "import { DataSource } from \"@vuu-ui/vuu-data-types\";\nimport { VuuRange } from \"@vuu-ui/vuu-protocol-types\";\nimport cx from \"clsx\";\nimport { HTMLAttributes, useEffect, useState } from \"react\";\n\nimport \"./DatasourceStats.css\";\n\ninterface DataSourceStatsProps extends HTMLAttributes<HTMLSpanElement> {\n dataSource: DataSource;\n}\n\nconst classBase = \"vuuDatasourceStats\";\n\nconst numberFormatter = new Intl.NumberFormat();\n\nexport const DataSourceStats = ({\n className: classNameProp,\n dataSource,\n}: DataSourceStatsProps) => {\n const [range, setRange] = useState<VuuRange>(dataSource.range);\n const [size, setSize] = useState(dataSource.size);\n useEffect(() => {\n setSize(dataSource.size);\n\n dataSource.on(\"resize\", setSize);\n dataSource.on(\"range\", setRange);\n }, [dataSource]);\n\n const className = cx(classBase, classNameProp);\n const from = numberFormatter.format(range.from + 1);\n const to = numberFormatter.format(Math.min(range.to, size));\n const value = numberFormatter.format(size);\n return (\n <div className={className}>\n <span className={`${classBase}-label`}>Row count</span>\n <span className={`${classBase}-range`}>{from}</span>\n <span>-</span>\n <span className={`${classBase}-range`}>{to}</span>\n <span>of</span>\n <span className={`${classBase}-size`}>{value}</span>\n </div>\n );\n};\n", "import {\n Button,\n FormField,\n FormFieldLabel,\n Input,\n ToggleButton,\n ToggleButtonGroup,\n} from \"@salt-ds/core\";\nimport { TableSettingsProps } from \"@vuu-ui/vuu-table-types\";\nimport { ColumnList } from \"../column-list\";\nimport { useTableSettings } from \"./useTableSettings\";\n\nimport \"./TableSettingsPanel.css\";\n\nconst classBase = \"vuuTableSettingsPanel\";\n\n/**\n The TableSettingsPanel assumes 'ownership' of the tableSettings.\n It updates the settings in state locally and notifies caller of\n every change via onChange callback\n */\nexport const TableSettingsPanel = ({\n availableColumns,\n onAddCalculatedColumn,\n onConfigChange,\n onDataSourceConfigChange,\n onNavigateToColumn,\n tableConfig: tableConfigProp,\n}: TableSettingsProps) => {\n const {\n columnItems,\n columnLabelsValue,\n onChangeColumnLabels,\n onChangeTableAttribute,\n onColumnChange,\n onMoveListItem,\n tableConfig,\n } = useTableSettings({\n availableColumns,\n onConfigChange,\n onDataSourceConfigChange,\n tableConfig: tableConfigProp,\n });\n\n return (\n <div className={classBase}>\n <FormField>\n <FormFieldLabel>Column Labels</FormFieldLabel>\n <ToggleButtonGroup\n className=\"vuuToggleButtonGroup\"\n onChange={onChangeColumnLabels}\n value={columnLabelsValue}\n >\n <ToggleButton\n className=\"vuuIconToggleButton\"\n data-icon=\"text-strikethrough\"\n value={0}\n />\n <ToggleButton\n className=\"vuuIconToggleButton\"\n data-icon=\"text-Tt\"\n value={1}\n />\n <ToggleButton\n className=\"vuuIconToggleButton\"\n data-icon=\"text-T\"\n value={2}\n />\n </ToggleButtonGroup>\n </FormField>\n\n <FormField>\n <FormFieldLabel>Grid separators</FormFieldLabel>\n <div className=\"saltToggleButtonGroup vuuToggleButtonGroup saltToggleButtonGroup-horizontal vuuGridSeparators\">\n <ToggleButton\n className=\"vuuIconToggleButton\"\n data-icon=\"row-striping\"\n selected={tableConfig.zebraStripes ?? false}\n onChange={onChangeTableAttribute}\n value=\"zebraStripes\"\n />\n <ToggleButton\n className=\"vuuIconToggleButton\"\n data-icon=\"row-lines\"\n selected={tableConfig.rowSeparators ?? false}\n onChange={onChangeTableAttribute}\n value=\"rowSeparators\"\n />\n <ToggleButton\n className=\"vuuIconToggleButton\"\n data-icon=\"col-lines\"\n selected={tableConfig.columnSeparators ?? false}\n onChange={onChangeTableAttribute}\n value=\"columnSeparators\"\n />\n </div>\n </FormField>\n\n <FormField>\n <FormFieldLabel>Default Column Width</FormFieldLabel>\n <Input className=\"vuuInput\" />\n </FormField>\n\n <ColumnList\n columnItems={columnItems}\n onChange={onColumnChange}\n onMoveListItem={onMoveListItem}\n onNavigateToColumn={onNavigateToColumn}\n />\n\n <div className={`${classBase}-calculatedButtonbar`}>\n <Button data-icon=\"plus\" onClick={onAddCalculatedColumn} />\n <span className={`${classBase}-calculatedLabel`}>\n Add calculated column\n </span>\n </div>\n </div>\n );\n};\n", "import { SchemaColumn } from \"@vuu-ui/vuu-data-types\";\nimport { updateTableConfig } from \"@vuu-ui/vuu-table\";\nimport {\n ColumnDescriptor,\n TableConfig,\n TableSettingsProps,\n} from \"@vuu-ui/vuu-table-types\";\nimport {\n addColumnToSubscribedColumns,\n isCalculatedColumn,\n moveItem,\n subscribedOnly,\n useLayoutEffectSkipFirst,\n} from \"@vuu-ui/vuu-utils\";\nimport {\n MouseEvent,\n SyntheticEvent,\n useCallback,\n useMemo,\n useState,\n} from \"react\";\nimport { ColumnChangeHandler } from \"../column-list\";\n\nconst sortOrderFromAvailableColumns = (\n availableColumns: SchemaColumn[],\n columns: ColumnDescriptor[]\n) => {\n const sortedColumns: ColumnDescriptor[] = [];\n for (const { name } of availableColumns) {\n const column = columns.find((col) => col.name === name);\n if (column) {\n sortedColumns.push(column);\n }\n }\n return sortedColumns;\n};\n\nexport type ColumnItem = Pick<\n ColumnDescriptor,\n \"hidden\" | \"label\" | \"name\" | \"serverDataType\"\n> & {\n isCalculated: boolean;\n subscribed: boolean;\n};\n\nconst buildColumnItems = (\n availableColumns: SchemaColumn[],\n configuredColumns: ColumnDescriptor[]\n): ColumnItem[] => {\n return availableColumns.map<ColumnItem>(({ name, serverDataType }) => {\n const configuredColumn = configuredColumns.find((col) => col.name === name);\n return {\n hidden: configuredColumn?.hidden,\n isCalculated: isCalculatedColumn(name),\n label: configuredColumn?.label,\n name,\n serverDataType,\n subscribed: configuredColumn !== undefined,\n };\n });\n};\n\ntype ColumnState = {\n availableColumns: SchemaColumn[];\n tableConfig: TableConfig;\n};\n\nexport const useTableSettings = ({\n availableColumns: availableColumnsProp,\n onConfigChange,\n onDataSourceConfigChange,\n tableConfig: tableConfigProp,\n}: Omit<TableSettingsProps, \"onAddCalculatedColumn\">) => {\n const [{ availableColumns, tableConfig }, setColumnState] =\n useState<ColumnState>({\n availableColumns: availableColumnsProp,\n tableConfig: tableConfigProp,\n });\n\n const columnItems = useMemo(\n () => buildColumnItems(availableColumns, tableConfig.columns),\n [availableColumns, tableConfig.columns]\n );\n\n const handleMoveListItem = useCallback(\n (fromIndex: number, toIndex: number) => {\n setColumnState((state) => {\n const newAvailableColumns = moveItem(\n state.availableColumns,\n fromIndex,\n toIndex\n );\n const newColumns = sortOrderFromAvailableColumns(\n newAvailableColumns,\n tableConfig.columns\n );\n\n return {\n availableColumns: newAvailableColumns,\n tableConfig: {\n ...state.tableConfig,\n columns: newColumns,\n },\n };\n });\n },\n [tableConfig.columns]\n );\n\n const handleColumnChange = useCallback<ColumnChangeHandler>(\n (name, property, value) => {\n // to be applied immediately\n const columnItem = columnItems.find((col) => col.name === name);\n if (property === \"subscribed\") {\n if (columnItem?.subscribed) {\n const subscribedColumns = tableConfig.columns\n .filter((col) => col.name !== name)\n .map((col) => col.name);\n setColumnState((state) => ({\n ...state,\n tableConfig: {\n ...tableConfig,\n columns: tableConfig.columns.filter(\n subscribedOnly(subscribedColumns)\n ),\n },\n }));\n onDataSourceConfigChange({\n columns: subscribedColumns,\n });\n } else {\n const newConfig = {\n ...tableConfig,\n columns: addColumnToSubscribedColumns(\n tableConfig.columns,\n availableColumns,\n name\n ),\n };\n setColumnState((state) => ({\n ...state,\n tableConfig: newConfig,\n }));\n\n const subscribedColumns = newConfig.columns.map((col) => col.name);\n\n onDataSourceConfigChange({\n columns: subscribedColumns,\n });\n }\n } else if (columnItem?.subscribed) {\n const column = tableConfig.columns.find((col) => col.name === name);\n if (column) {\n const newConfig = updateTableConfig(tableConfig, {\n type: \"column-prop\",\n property,\n column,\n value,\n });\n setColumnState((state) => ({\n ...state,\n tableConfig: newConfig,\n }));\n }\n }\n },\n [availableColumns, columnItems, onDataSourceConfigChange, tableConfig]\n );\n\n const handleChangeColumnLabels = useCallback((evt: SyntheticEvent) => {\n const { value } = evt.target as HTMLFormElement;\n const columnFormatHeader =\n value === \"0\" ? undefined : value === \"1\" ? \"capitalize\" : \"uppercase\";\n setColumnState((state) => ({\n ...state,\n tableConfig: {\n ...state.tableConfig,\n columnFormatHeader,\n },\n }));\n }, []);\n\n const handleChangeTableAttribute = useCallback(\n (evt: MouseEvent<HTMLButtonElement>) => {\n const { ariaChecked, value } = evt.target as HTMLInputElement;\n setColumnState((state) => ({\n ...state,\n tableConfig: {\n ...state.tableConfig,\n [value]: ariaChecked !== \"true\",\n },\n }));\n },\n []\n );\n\n useLayoutEffectSkipFirst(() => {\n onConfigChange?.(tableConfig);\n }, [onConfigChange, tableConfig]);\n\n const columnLabelsValue =\n tableConfig.columnFormatHeader === undefined\n ? 0\n : tableConfig.columnFormatHeader === \"capitalize\"\n ? 1\n : 2;\n\n return {\n columnItems,\n columnLabelsValue,\n onChangeColumnLabels: handleChangeColumnLabels,\n onChangeTableAttribute: handleChangeTableAttribute,\n onColumnChange: handleColumnChange,\n onMoveListItem: handleMoveListItem,\n tableConfig,\n };\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["import_vuu_utils", "isString", "import_vuu_utils", "import_react", "import_vuu_utils", "BackgroundCell", "name", "cx", "import_vuu_utils", "import_react", "import_jsx_runtime", "classBase", "import_vuu_ui_controls", "import_vuu_utils", "import_react", "import_jsx_runtime", "classBase", "DropdownCell", "import_vuu_data_react", "import_vuu_utils", "import_react", "import_jsx_runtime", "LookupCell", "import_vuu_utils", "import_clsx", "import_jsx_runtime", "classBase", "name", "cx", "import_vuu_ui_controls", "import_core", "import_clsx", "import_react", "import_vuu_utils", "import_jsx_runtime", "classBase", "cx", "name", "import_vuu_ui_controls", "import_vuu_utils", "import_core", "import_clsx", "import_vuu_ui_controls", "import_vuu_utils", "import_core", "import_react", "import_react", "import_vuu_codemirror", "import_vuu_utils", "import_react", "tag", "_expressions", "_op", "name", "import_vuu_codemirror", "import_vuu_codemirror", "import_vuu_codemirror", "import_react", "makeSuggestions", "source", "clearInput", "createState", "import_jsx_runtime", "classBase", "import_vuu_codemirror", "import_vuu_data_react", "import_vuu_utils", "import_react", "import_vuu_utils", "name", "name", "import_vuu_utils", "import_react", "name", "column", "import_jsx_runtime", "classBase", "import_vuu_ui_controls", "import_vuu_utils", "import_core", "import_clsx", "import_react", "import_core", "import_vuu_utils", "import_react", "import_jsx_runtime", "classBase", "import_react", "import_core", "import_vuu_utils", "import_react", "import_vuu_ui_controls", "import_vuu_utils", "import_core", "import_jsx_runtime", "pattern", "_a", "_b", "import_jsx_runtime", "classBase", "toggleValues", "import_jsx_runtime", "classBase", "cx", "import_clsx", "import_vuu_utils", "import_jsx_runtime", "classBase", "name", "cx", "import_vuu_utils", "import_react", "col", "name", "import_jsx_runtime", "classBase", "getColumnLabel", "name", "cx", "import_clsx", "import_react", "import_jsx_runtime", "classBase", "cx", "import_core", "import_vuu_utils", "import_react", "name", "import_jsx_runtime", "classBase"]
7
7
  }