UNPKG

wcz-layout

Version:

1 lines • 31.8 kB
{"version":3,"file":"AggregatedCell-C7nAQyMO.mjs","names":["Button","Dialog","DialogActions","DialogContent","DialogTitle","useEventCallback","useContext","useTranslation","DialogsContext","ReactNode","OpenDialogOptions","onClose","result","TResult","Promise","AlertOptions","title","ConfirmOptions","cancelText","DialogProps","payload","TPayload","open","OpenAlertDialog","message","options","OpenConfirmDialog","DialogComponent","React","ComponentType","OpenDialog","Component","CloseDialog","dialog","AlertDialogPayload","AlertDialogProps","AlertDialog","t0","$","_c","$i","Symbol","for","t","t1","t2","t3","t4","t5","t6","t7","t8","ConfirmDialogPayload","ConfirmDialogProps","ConfirmDialog","t9","t10","t11","t12","DialogHook","alert","confirm","close","useDialogs","undefined","message_0","options_0","Theme","formatForDisplay","Cell","CellData","Column","RowData","Range","defaultRangeExtractor","LayoutTableFeatures","LayoutColumnMeta","shortcutLabel","label","hotkey","AnyColumn","TData","TValue","columnLabel","column","meta","columnDef","header","id","hasColumnLabel","Boolean","columnAlign","align","columnFlex","Object","hasOwn","table","atoms","columnSizing","get","flex","moveColumn","delta","current","columnOrder","order","length","getAllLeafColumns","map","from","indexOf","to","splice","setColumnOrder","pinnedSx","isHeader","pinned","getIsPinned","position","zIndex","insetInlineStart","getStart","undefined","insetInlineEnd","getAfter","bgcolor","backgroundImage","theme","palette","action","hover","selected","getIsLastColumn","borderInlineEnd","borderInlineEndStyle","borderColor","getIsFirstColumn","borderInlineStart","borderInlineStartStyle","cellSelectionSx","cell","getIsSelected","edges","getSelectionEdges","outline","top","primary","main","bottom","left","right","filter","join","boxShadow","quoteTsv","text","test","replaceAll","toClipboardValue","value","String","Date","toISOString","JSON","stringify","toClipboardText","regions","Array","rows","cells","lookaheadRange","range","direction","lookahead","behind","overscan","ahead","startIndex","endIndex","dayjs","formatValue","value","dateFormat","undefined","Date","format","toString","JSON","stringify","aggregationFn_count","aggregationFn_extent","aggregationFn_first","aggregationFn_last","aggregationFn_max","aggregationFn_mean","aggregationFn_median","aggregationFn_min","aggregationFn_sum","aggregationFn_unique","aggregationFn_uniqueCount","createExpandedRowModel","createFacetedMinMaxValues","createFacetedRowModel","createFacetedUniqueValues","createFilteredRowModel","createGroupedRowModel","createPaginatedRowModel","createSortedRowModel","createTableHookContexts","filterFn_arrHas","filterFn_arrIncludes","filterFn_arrIncludesAll","filterFn_arrIncludesSome","filterFn_between","filterFn_betweenInclusive","filterFn_empty","filterFn_endsWith","filterFn_equals","filterFn_equalsString","filterFn_equalsStringSensitive","filterFn_greaterThan","filterFn_greaterThanOrEqualTo","filterFn_inDateRange","filterFn_inNumberRange","filterFn_includesString","filterFn_includesStringSensitive","filterFn_lessThan","filterFn_lessThanOrEqualTo","filterFn_notEmpty","filterFn_startsWith","filterFn_weakEquals","metaHelper","sortFn_alphanumeric","sortFn_alphanumericCaseSensitive","sortFn_basic","sortFn_datetime","sortFn_text","sortFn_textCaseSensitive","stockFeatures","tableFeatures","LayoutColumnMeta","layoutTableFeatures","columnMeta","filteredRowModel","sortedRowModel","paginatedRowModel","expandedRowModel","groupedRowModel","facetedRowModel","facetedUniqueValues","facetedMinMaxValues","filterFns","arrHas","arrIncludes","arrIncludesAll","arrIncludesSome","between","betweenInclusive","empty","endsWith","equals","equalsString","equalsStringSensitive","greaterThan","greaterThanOrEqualTo","inDateRange","inNumberRange","includesString","includesStringSensitive","lessThan","lessThanOrEqualTo","notEmpty","startsWith","weakEquals","sortFns","alphanumeric","alphanumericCaseSensitive","basic","datetime","text","textCaseSensitive","aggregationFns","sum","min","max","extent","mean","median","unique","uniqueCount","count","first","last","LayoutTableFeatures","tableContext","cellContext","headerContext","useTableContext","useCellContext","useHeaderContext","TypographyProps","Typography","FC","formatValue","useCellContext","AggregatedCell","prefix","options","Intl","NumberFormatOptions","dateFormat","t0","$","_c","$i","Symbol","for","props","t1","undefined","cell","T0","t2","t3","t4","t5","t6","t7","t8","bb0","value","getValue","t9","entry","toLocaleString","format","Array","isArray","map","join"],"sources":["../src/hooks/useDialogs.tsx","../src/components/table/utils.ts","../src/components/table/formatValue.ts","../src/components/table/context.ts","../src/components/table/cells/formatters/AggregatedCell.tsx"],"sourcesContent":["import {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n useEventCallback,\n} from \"@mui/material\";\nimport { useContext } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { DialogsContext } from \"../contexts/DialogsContext\";\nimport type { ReactNode } from \"react\";\n\nexport interface OpenDialogOptions<TResult> {\n onClose?: (result: TResult) => Promise<void>;\n}\n\nexport interface AlertOptions {\n title?: ReactNode;\n}\n\nexport interface ConfirmOptions {\n title?: ReactNode;\n cancelText?: ReactNode;\n}\n\nexport interface DialogProps<TPayload = undefined, TResult = void> {\n payload: TPayload;\n open: boolean;\n onClose: (result: TResult) => Promise<void>;\n}\n\nexport type OpenAlertDialog = (message: ReactNode, options?: AlertOptions) => Promise<void>;\n\nexport type OpenConfirmDialog = (message: ReactNode, options?: ConfirmOptions) => Promise<boolean>;\n\nexport type DialogComponent<TPayload, TResult> = React.ComponentType<\n DialogProps<TPayload, TResult>\n>;\n\nexport interface OpenDialog {\n <TPayload extends undefined, TResult>(\n Component: DialogComponent<TPayload, TResult>,\n payload?: TPayload,\n options?: OpenDialogOptions<TResult>,\n ): Promise<TResult>;\n <TPayload, TResult>(\n Component: DialogComponent<TPayload, TResult>,\n payload: TPayload,\n options?: OpenDialogOptions<TResult>,\n ): Promise<TResult>;\n}\n\nexport type CloseDialog = <TResult>(dialog: Promise<TResult>, result: TResult) => Promise<TResult>;\n\nexport interface AlertDialogPayload extends AlertOptions {\n message: ReactNode;\n}\n\nexport type AlertDialogProps = DialogProps<AlertDialogPayload, void>;\n\nexport function AlertDialog({ open, payload, onClose }: Readonly<AlertDialogProps>) {\n const { t } = useTranslation();\n\n return (\n <Dialog maxWidth=\"xs\" fullWidth open={open} onClose={() => onClose()} disableRestoreFocus>\n <DialogTitle>{payload.title ?? t(\"Layout.Dialog.Alert\")}</DialogTitle>\n <DialogContent>{payload.message}</DialogContent>\n <DialogActions>\n <Button onClick={() => onClose()} autoFocus>\n {t(\"Layout.Dialog.Confirm\")}\n </Button>\n </DialogActions>\n </Dialog>\n );\n}\n\nexport interface ConfirmDialogPayload extends ConfirmOptions {\n message: ReactNode;\n}\n\nexport type ConfirmDialogProps = DialogProps<ConfirmDialogPayload, boolean>;\n\nexport function ConfirmDialog({ open, payload, onClose }: Readonly<ConfirmDialogProps>) {\n const { t } = useTranslation();\n\n return (\n <Dialog maxWidth=\"xs\" fullWidth open={open} onClose={() => onClose(false)} disableRestoreFocus>\n <DialogTitle>{payload.title ?? t(\"Layout.Dialog.Confirm\")}</DialogTitle>\n <DialogContent>{payload.message}</DialogContent>\n <DialogActions>\n <Button onClick={() => onClose(false)}>\n {payload.cancelText ?? t(\"Layout.Dialog.Cancel\")}\n </Button>\n <Button onClick={() => onClose(true)} autoFocus>\n {t(\"Layout.Dialog.Confirm\")}\n </Button>\n </DialogActions>\n </Dialog>\n );\n}\n\ninterface DialogHook {\n alert: OpenAlertDialog;\n confirm: OpenConfirmDialog;\n open: OpenDialog;\n close: CloseDialog;\n}\n\nexport function useDialogs(): DialogHook {\n const { open, close } = useContext(DialogsContext);\n\n const alert = useEventCallback<OpenAlertDialog>((message, { ...options } = {}) =>\n open(AlertDialog, { ...options, message }),\n );\n\n const confirm = useEventCallback<OpenConfirmDialog>((message, { ...options } = {}) =>\n open(ConfirmDialog, { ...options, message }),\n );\n\n return { alert, confirm, open, close };\n}\n","import type { Theme } from \"@mui/material\";\r\nimport { formatForDisplay } from \"@tanstack/react-hotkeys\";\r\nimport type { Cell, CellData, Column, RowData } from \"@tanstack/react-table\";\r\nimport type { Range } from \"@tanstack/react-virtual\";\r\nimport { defaultRangeExtractor } from \"@tanstack/react-virtual\";\r\nimport type { LayoutTableFeatures } from \"~/components/table/context\";\r\nimport type { LayoutColumnMeta } from \"./types\";\r\n\r\nexport const shortcutLabel = (label: string, hotkey: string): string =>\r\n `${label} (${formatForDisplay(hotkey)})`;\r\n\r\ntype AnyColumn<TData extends RowData, TValue extends CellData> = Column<\r\n LayoutTableFeatures,\r\n TData,\r\n TValue\r\n>;\r\n\r\nexport const columnLabel = <TData extends RowData, TValue extends CellData>(\r\n column: AnyColumn<TData, TValue>,\r\n): string => {\r\n const meta = column.columnDef.meta as LayoutColumnMeta | undefined;\r\n if (meta?.label) return meta.label;\r\n\r\n return typeof column.columnDef.header === \"string\" ? column.columnDef.header : column.id;\r\n};\r\n\r\nexport const hasColumnLabel = <TData extends RowData, TValue extends CellData>(\r\n column: AnyColumn<TData, TValue>,\r\n): boolean =>\r\n Boolean((column.columnDef.meta as LayoutColumnMeta | undefined)?.label) ||\r\n typeof column.columnDef.header === \"string\";\r\n\r\nexport const columnAlign = <TData extends RowData, TValue extends CellData>(\r\n column: AnyColumn<TData, TValue>,\r\n): \"left\" | \"center\" | \"right\" =>\r\n (column.columnDef.meta as LayoutColumnMeta | undefined)?.align ??\r\n (hasColumnLabel(column) ? \"left\" : \"center\");\r\n\r\n/** The column's `meta.flex`, or 0 once the user has resized it to a fixed width. */\r\nexport const columnFlex = <TData extends RowData, TValue extends CellData>(\r\n column: AnyColumn<TData, TValue>,\r\n): number =>\r\n Object.hasOwn(column.table.atoms.columnSizing.get(), column.id)\r\n ? 0\r\n : ((column.columnDef.meta as LayoutColumnMeta | undefined)?.flex ?? 0);\r\n\r\nexport const moveColumn = <TData extends RowData, TValue extends CellData>(\r\n column: AnyColumn<TData, TValue>,\r\n delta: number,\r\n): void => {\r\n const { table } = column;\r\n const current = table.atoms.columnOrder.get();\r\n const order = current.length ? [...current] : table.getAllLeafColumns().map(({ id }) => id);\r\n const from = order.indexOf(column.id);\r\n const to = from + delta;\r\n if (from < 0 || to < 0 || to >= order.length) return;\r\n\r\n order.splice(to, 0, ...order.splice(from, 1));\r\n table.setColumnOrder(order);\r\n};\r\n\r\nexport const pinnedSx = <TData extends RowData, TValue extends CellData>(\r\n column: AnyColumn<TData, TValue>,\r\n isHeader = false,\r\n) => {\r\n const pinned = column.getIsPinned();\r\n if (!pinned) return {};\r\n\r\n return {\r\n position: \"sticky\",\r\n zIndex: isHeader ? 4 : 2,\r\n insetInlineStart: pinned === \"start\" ? column.getStart(\"start\") : undefined,\r\n insetInlineEnd: pinned === \"end\" ? column.getAfter(\"end\") : undefined,\r\n bgcolor: \"background.paper\",\r\n ...(!isHeader && {\r\n \".MuiTableRow-root:hover > &\": {\r\n backgroundImage: (theme: Theme) =>\r\n `linear-gradient(${theme.palette.action.hover}, ${theme.palette.action.hover})`,\r\n },\r\n \".MuiTableRow-root.Mui-selected > &\": {\r\n backgroundImage: (theme: Theme) =>\r\n `linear-gradient(${theme.palette.action.selected}, ${theme.palette.action.selected})`,\r\n },\r\n }),\r\n ...(pinned === \"start\" &&\r\n column.getIsLastColumn(\"start\") && {\r\n borderInlineEnd: 1,\r\n borderInlineEndStyle: \"solid\",\r\n borderColor: \"divider\",\r\n }),\r\n ...(pinned === \"end\" &&\r\n column.getIsFirstColumn(\"end\") && {\r\n borderInlineStart: 1,\r\n borderInlineStartStyle: \"solid\",\r\n borderColor: \"divider\",\r\n }),\r\n };\r\n};\r\n\r\nexport const cellSelectionSx = <TData extends RowData, TValue extends CellData>(\r\n cell: Cell<LayoutTableFeatures, TData, TValue>,\r\n) => {\r\n if (!cell.getIsSelected()) return {};\r\n\r\n const edges = cell.getSelectionEdges();\r\n const outline = (theme: Theme) =>\r\n [\r\n edges.top && `inset 0 2px 0 0 ${theme.palette.primary.main}`,\r\n edges.bottom && `inset 0 -2px 0 0 ${theme.palette.primary.main}`,\r\n edges.left && `inset 2px 0 0 0 ${theme.palette.primary.main}`,\r\n edges.right && `inset -2px 0 0 0 ${theme.palette.primary.main}`,\r\n ]\r\n .filter(Boolean)\r\n .join(\", \") || \"none\";\r\n\r\n return {\r\n backgroundImage: (theme: Theme) =>\r\n `linear-gradient(${theme.palette.action.selected}, ${theme.palette.action.selected})`,\r\n boxShadow: outline,\r\n };\r\n};\r\n\r\n/** Spreadsheet TSV quoting, so a cell holding a tab or a newline stays one cell. */\r\nconst quoteTsv = (text: string): string =>\r\n /[\"\\t\\n\\r]/.test(text) ? `\"${text.replaceAll('\"', '\"\"')}\"` : text;\r\n\r\nconst toClipboardValue = (value: unknown): string => {\r\n if (value == null) return \"\";\r\n if (typeof value === \"string\") return quoteTsv(value);\r\n if (typeof value === \"number\" || typeof value === \"boolean\" || typeof value === \"bigint\")\r\n return quoteTsv(String(value));\r\n if (value instanceof Date) return quoteTsv(value.toISOString());\r\n\r\n // Everything else — objects, and the odd symbol or function — as JSON or blank.\r\n return quoteTsv(JSON.stringify(value) ?? \"\");\r\n};\r\n\r\n/**\r\n * Serializes `table.getSelectedCellRangesData()` as TSV, which is what Excel,\r\n * Google Sheets and LibreOffice all paste as a grid. Disjoint selection regions\r\n * are separated by a blank line.\r\n */\r\nexport const toClipboardText = (regions: Array<Array<Array<unknown>>>): string =>\r\n regions\r\n .map((rows) => rows.map((cells) => cells.map(toClipboardValue).join(\"\\t\")).join(\"\\n\"))\r\n .join(\"\\n\\n\");\r\n\r\nexport const lookaheadRange = (\r\n range: Range,\r\n direction: \"forward\" | \"backward\" | null,\r\n lookahead: number,\r\n): Array<number> => {\r\n const behind = direction ? 0 : range.overscan;\r\n const ahead = direction ? lookahead : range.overscan;\r\n\r\n return defaultRangeExtractor({\r\n ...range,\r\n startIndex: range.startIndex - (direction === \"backward\" ? ahead : behind),\r\n endIndex: range.endIndex + (direction === \"backward\" ? behind : ahead),\r\n overscan: 0,\r\n });\r\n};\r\n","import dayjs from \"dayjs\";\n\nexport const formatValue = (value: unknown, dateFormat = \"L LT\"): string => {\n if (value === null || value === undefined) return \"\";\n if (value instanceof Date) return dayjs(value).format(dateFormat);\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\" || typeof value === \"bigint\") {\n return value.toString();\n }\n\n return JSON.stringify(value) ?? \"\";\n};\n","import {\n aggregationFn_count,\n aggregationFn_extent,\n aggregationFn_first,\n aggregationFn_last,\n aggregationFn_max,\n aggregationFn_mean,\n aggregationFn_median,\n aggregationFn_min,\n aggregationFn_sum,\n aggregationFn_unique,\n aggregationFn_uniqueCount,\n createExpandedRowModel,\n createFacetedMinMaxValues,\n createFacetedRowModel,\n createFacetedUniqueValues,\n createFilteredRowModel,\n createGroupedRowModel,\n createPaginatedRowModel,\n createSortedRowModel,\n createTableHookContexts,\n filterFn_arrHas,\n filterFn_arrIncludes,\n filterFn_arrIncludesAll,\n filterFn_arrIncludesSome,\n filterFn_between,\n filterFn_betweenInclusive,\n filterFn_empty,\n filterFn_endsWith,\n filterFn_equals,\n filterFn_equalsString,\n filterFn_equalsStringSensitive,\n filterFn_greaterThan,\n filterFn_greaterThanOrEqualTo,\n filterFn_inDateRange,\n filterFn_inNumberRange,\n filterFn_includesString,\n filterFn_includesStringSensitive,\n filterFn_lessThan,\n filterFn_lessThanOrEqualTo,\n filterFn_notEmpty,\n filterFn_startsWith,\n filterFn_weakEquals,\n metaHelper,\n sortFn_alphanumeric,\n sortFn_alphanumericCaseSensitive,\n sortFn_basic,\n sortFn_datetime,\n sortFn_text,\n sortFn_textCaseSensitive,\n stockFeatures,\n tableFeatures,\n} from \"@tanstack/react-table\";\nimport type { LayoutColumnMeta } from \"~/components/table/types\";\n\nexport const layoutTableFeatures = tableFeatures({\n ...stockFeatures,\n columnMeta: metaHelper<LayoutColumnMeta>(),\n filteredRowModel: createFilteredRowModel(),\n sortedRowModel: createSortedRowModel(),\n paginatedRowModel: createPaginatedRowModel(),\n expandedRowModel: createExpandedRowModel(),\n groupedRowModel: createGroupedRowModel(),\n facetedRowModel: createFacetedRowModel(),\n facetedUniqueValues: createFacetedUniqueValues(),\n facetedMinMaxValues: createFacetedMinMaxValues(),\n filterFns: {\n arrHas: filterFn_arrHas,\n arrIncludes: filterFn_arrIncludes,\n arrIncludesAll: filterFn_arrIncludesAll,\n arrIncludesSome: filterFn_arrIncludesSome,\n between: filterFn_between,\n betweenInclusive: filterFn_betweenInclusive,\n empty: filterFn_empty,\n endsWith: filterFn_endsWith,\n equals: filterFn_equals,\n equalsString: filterFn_equalsString,\n equalsStringSensitive: filterFn_equalsStringSensitive,\n greaterThan: filterFn_greaterThan,\n greaterThanOrEqualTo: filterFn_greaterThanOrEqualTo,\n inDateRange: filterFn_inDateRange,\n inNumberRange: filterFn_inNumberRange,\n includesString: filterFn_includesString,\n includesStringSensitive: filterFn_includesStringSensitive,\n lessThan: filterFn_lessThan,\n lessThanOrEqualTo: filterFn_lessThanOrEqualTo,\n notEmpty: filterFn_notEmpty,\n startsWith: filterFn_startsWith,\n weakEquals: filterFn_weakEquals,\n },\n sortFns: {\n alphanumeric: sortFn_alphanumeric,\n alphanumericCaseSensitive: sortFn_alphanumericCaseSensitive,\n basic: sortFn_basic,\n datetime: sortFn_datetime,\n text: sortFn_text,\n textCaseSensitive: sortFn_textCaseSensitive,\n },\n aggregationFns: {\n sum: aggregationFn_sum,\n min: aggregationFn_min,\n max: aggregationFn_max,\n extent: aggregationFn_extent,\n mean: aggregationFn_mean,\n median: aggregationFn_median,\n unique: aggregationFn_unique,\n uniqueCount: aggregationFn_uniqueCount,\n count: aggregationFn_count,\n first: aggregationFn_first,\n last: aggregationFn_last,\n },\n});\n\nexport type LayoutTableFeatures = typeof layoutTableFeatures;\n\nexport const {\n tableContext,\n cellContext,\n headerContext,\n useTableContext,\n useCellContext,\n useHeaderContext,\n} = createTableHookContexts<LayoutTableFeatures>();\n","import type { TypographyProps } from \"@mui/material\";\nimport { Typography } from \"@mui/material\";\nimport type { FC } from \"react\";\nimport { formatValue } from \"~/components/table/formatValue\";\nimport { useCellContext } from \"~/components/table/context\";\n\nexport const AggregatedCell: FC<\n TypographyProps & {\n prefix?: string;\n options?: Intl.NumberFormatOptions;\n dateFormat?: string;\n }\n> = ({ prefix = \"\", options, dateFormat, ...props }) => {\n const cell = useCellContext();\n const value = cell.getValue();\n if (value === null || value === undefined || value === \"\") return null;\n\n const format = (entry: unknown) =>\n typeof entry === \"number\"\n ? entry.toLocaleString(undefined, options)\n : formatValue(entry, dateFormat);\n\n return (\n <Typography variant=\"body2\" color=\"text.secondary\" noWrap {...props}>\n {prefix}\n {/* `extent` — the default aggregate for anything non-numeric — is a [min, max] pair. */}\n {Array.isArray(value) ? value.map(format).join(\" – \") : format(value)}\n </Typography>\n );\n};\n"],"mappings":"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"}