schummar-table 0.51.3 → 0.51.4

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["defaultColors: TableTheme['colors']","className","Badge: TableTheme['components']['Badge']","Button: TableTheme['components']['Button']","Checkbox: TableTheme['components']['Checkbox']","className","IconButton: TableTheme['components']['IconButton']","TextField: TableTheme['components']['TextField']","className","defaultComponents: TableTheme['components']","ClassNames","css","Export","defaultIcons: TableTheme['icons']","defaultTexts: TableTheme['text']","defaultTableTheme: TableTheme","deps: DependencyList","Store","TableSettingsContext","memo","globalTableTheme","column","mergeThemes","Popover","IconButton","FilterList","ArrowDropDown","filter","ClassNames","cx","css","TextField","lastArgs: Args | undefined","timeout: ReturnType<typeof setTimeout> | undefined","value","IconButton","FilterList","filter","Button","FilterList","filter","FilterDialog","months: DayzedCalendar[]","dates: ('' | DayzedDateObject)[]","weeks: ('' | DayzedDateObject)[][]","className","defaultDate","isIncludedType","maxValues","tabNext","value","localValue","Fragment","value","localValue","Fragment","Temporal","value","Button","IconButton","ChevronRight","today","min","max","getBackProps","getForwardProps","Fragment","getDateProps","value","flatMap","className","asNumber","TextField","minValue","maxValue","value","min","max","throttle","IconButton","Checkbox","Search","Clear","value","column","Button","value","id","key","data: any","state","column","sort","items","id","overrides","defaultProps: InternalTableProps<any>","id","defaults","overrides","state","state","state","Store","state","Button","defaultClasses","defaultClasses","className","Badge","ArrowUpward","index","column","toggle","StoreScope","column","index","defaultClasses","IconButton","Popover","Checkbox","Button","Settings","toggle","column","TableSettingsContext","Button","IconButton","Popover","Clipboard","defaultClasses","Cell","column","className","Details","className","defaultClasses","css","IconButton","Spinner","ChevronRight","toggle","Checkbox","isSelected","itemId","toggle","Row","item","ClassNames","cx","css","defaultClasses","itemIds","from","to","before","after","throttle","TableInner","defaultClasses","IconButton","Search","Clear","value"],"sources":["../src/misc/tableContext.ts","../src/theme/defaultTheme/defaultColors.ts","../src/components/spinnner.tsx","../src/theme/defaultTheme/badge.tsx","../src/theme/defaultTheme/button.tsx","../src/theme/defaultTheme/checkbox.tsx","../src/theme/defaultTheme/iconButton.tsx","../src/theme/defaultTheme/textField.tsx","../src/theme/defaultTheme/defaultComponents.ts","../src/theme/defaultTheme/defaultIcons.tsx","../src/theme/defaultTheme/defaultTexts.tsx","../src/theme/defaultTheme/index.tsx","../src/hooks/useTableMemo.tsx","../src/hooks/useTheme.ts","../src/theme/useCssVariables.ts","../src/components/filterControl.tsx","../src/components/autoFocusTextField.tsx","../src/misc/debounce.ts","../src/hooks/useFilter.ts","../src/components/filterDialog.tsx","../src/components/nestedFilterControl.tsx","../src/components/combinedFilter.tsx","../src/misc/defaults.ts","../src/vendor/dayzed/utils.ts","../src/vendor/dayzed/dayzed.ts","../src/hooks/useLatestRef.ts","../src/components/dateInput.tsx","../src/components/text.tsx","../src/components/timeInput.tsx","../src/components/datePicker.tsx","../src/components/dateFilter.tsx","../src/misc/helpers.ts","../src/components/numberField.tsx","../src/components/rangeFilter.tsx","../src/components/formControlLabel.tsx","../src/components/virtualList.tsx","../src/components/selectFilter.tsx","../src/hooks/useTableRef.ts","../src/misc/queue.ts","../src/internalState/tableStateStorage.ts","../src/internalState/calcItems.ts","../src/exporters/serializer.ts","../src/misc/overrides.ts","../src/internalState/calcProps.ts","../src/internalState/cleanupState.ts","../src/internalState/filterColumns.ts","../src/internalState/normalizeExpanded.ts","../src/internalState/syncSelections.ts","../src/internalState/watchDisplaySize.ts","../src/internalState/useTableState.ts","../src/components/clearFiltersButton.tsx","../src/components/columnFooter.tsx","../src/components/resizeHandle.tsx","../src/components/sortComponent.tsx","../src/components/columnHeader.tsx","../src/components/columnSelection.tsx","../src/components/export.tsx","../src/misc/calcClassNames.ts","../src/components/cell.tsx","../src/components/details.tsx","../src/components/expandControl.tsx","../src/components/selectComponent.tsx","../src/components/row.tsx","../src/components/virtualized.tsx","../src/components/table.tsx","../src/components/textFilter.tsx","../src/misc/textMatch.ts"],"sourcesContent":["import { createContext, useContext } from 'react';\nimport type { Store } from 'schummar-state/react';\nimport type { Id, InternalTableState } from '../types';\n\nexport const TableContext = createContext<Store<InternalTableState<any>> | null>(null);\n\nexport const TableResetContext = createContext<() => void>(() => undefined);\n\nexport const ColumnContext = createContext<Id | null>(null);\n\nexport function useTableContext<T>(): Store<InternalTableState<T>> {\n const value = useContext(TableContext);\n if (!value) throw new Error('No table context available');\n return value as Store<InternalTableState<T>>;\n}\n\nexport function useColumnContext(): Id {\n const value = useContext(ColumnContext);\n if (value === null) throw new Error('No column context available');\n return value;\n}\n","import type { TableTheme } from '../../types';\n\nexport const defaultColors: TableTheme['colors'] = {\n primary: { main: '#1976d2', light: '#42a5f5', contrastText: '#fff' },\n secondary: { main: '#9c27b0', light: '#ba68c8', contrastText: '#fff' },\n blocked: { main: '#f44336', light: '#f26257', contrastText: '#fff' },\n background: '#ffffff',\n text: 'inherit',\n border: '#777',\n borderLight: '#eee',\n};\n","import { css } from '@emotion/react';\n\nexport function Spinner({ className }: { className?: string }) {\n return (\n <div\n className={className}\n css={css`\n display: inline-block;\n position: relative;\n width: 1em;\n height: 1em;\n\n div {\n box-sizing: border-box;\n display: block;\n position: absolute;\n width: 0.8em;\n height: 0.8em;\n margin: 0.1em;\n border: 0.1em solid #fff;\n border-radius: 50%;\n animation: lds-ring 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;\n border-color: currentColor transparent transparent transparent;\n }\n div:nth-of-type(1) {\n animation-delay: -0.45s;\n }\n div:nth-of-type(2) {\n animation-delay: -0.3s;\n }\n div:nth-of-type(3) {\n animation-delay: -0.15s;\n }\n @keyframes lds-ring {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n }\n `}\n >\n <div />\n <div />\n <div />\n </div>\n );\n}\n","import type { TableTheme } from '../../types';\n\nexport const Badge: TableTheme['components']['Badge'] = ({ badgeContent, children }) => {\n return (\n <span\n css={{\n display: 'inline-flex',\n position: 'relative',\n flexShrink: 0,\n verticalAlign: 'middle',\n }}\n >\n {children}\n\n <span\n css={[\n {\n top: 0,\n right: 0,\n transform: 'scale(1) translate(50%, -50%)',\n transformOrigin: '100% 0%',\n height: 20,\n display: 'flex',\n padding: '0 6px',\n zIndex: 1,\n position: 'absolute',\n flexWrap: 'wrap',\n minWidth: 20,\n transition: 'transform 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms',\n alignItems: 'center',\n lineHeight: 1,\n alignContent: 'center',\n borderRadius: 10,\n justifyContent: 'center',\n fontSize: '0.8em',\n },\n !badgeContent && {\n transform: 'scale(0) translate(50%, -50%)',\n transition: 'transform 195ms cubic-bezier(0.4, 0, 0.2, 1) 0ms',\n },\n ]}\n >\n {badgeContent}\n </span>\n </span>\n );\n};\n","import type { TableTheme } from '../../types';\n\nexport const Button: TableTheme['components']['Button'] = ({\n startIcon,\n children,\n variant = 'text',\n ...props\n}) => {\n return (\n <button\n css={[\n {\n padding: `var(--spacing) calc(var(--spacing) * 2)`,\n display: 'inline-flex',\n alignItems: 'center',\n transition: 'background-color 150ms',\n border: 'none',\n cursor: 'pointer',\n background: 'transparent',\n borderRadius: 4,\n\n '&:active:not(:disabled)': {\n transform: 'scale3d(0.95, 0.95, 1)',\n },\n },\n variant === 'text' && {\n '&:hover': {\n background: 'rgba(0, 0, 0, 0.1)',\n },\n },\n variant === 'outlined' && {\n border: '1px solid var(--table-button-border, var(--table-border, #777777))',\n\n '&:disabled': {\n borderColor: 'var(--table-button-border-disabled, #eeeeee)',\n },\n },\n variant === 'contained' && {\n color: 'var(--primaryContrastText)',\n backgroundColor: 'var(--primaryMain)',\n boxShadow:\n '0px 3px 1px -2px rgb(0 0 0 / 20%), 0px 2px 2px 0px rgb(0 0 0 / 14%), 0px 1px 5px 0px rgb(0 0 0 / 12%)',\n\n '&:hover': {\n filter: 'brightness(0.9)',\n },\n\n '&:disabled': {\n filter: 'grayscale()',\n opacity: 0.5,\n },\n },\n ]}\n {...props}\n >\n {startIcon && <span css={{ marginRight: `calc(var(--spacing) * 2)` }}>{startIcon}</span>}\n <span>{children}</span>\n </button>\n );\n};\n","import type { TableTheme } from '../../types';\n\nexport const Checkbox: TableTheme['components']['Checkbox'] = ({ className, ...props }) => {\n return (\n <label\n css={[\n {\n padding: 'calc(var(--spacing) * 1.8)',\n display: 'flex',\n color: 'currentcolor',\n userSelect: 'none',\n\n '& input': {\n appearance: 'none',\n margin: 0,\n },\n },\n props.disabled && { color: 'rgba(0, 0, 0, 0.26)' },\n ]}\n className={className}\n >\n <input type=\"checkbox\" {...props} />\n\n {props.checked ? (\n <svg\n css={{ fontSize: '1.25rem', width: '1em', height: '1em', fill: 'var(--primaryMain)' }}\n focusable=\"false\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path d=\"M19 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.11 0 2-.9 2-2V5c0-1.1-.89-2-2-2zm-9 14l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\"></path>\n </svg>\n ) : (\n <svg\n css={{ fontSize: '1.25rem', width: '1em', height: '1em', fill: 'currentColor' }}\n focusable=\"false\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path d=\"M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z\"></path>\n </svg>\n )}\n </label>\n );\n};\n","import type { TableTheme } from '../../types';\n\nexport const IconButton: TableTheme['components']['IconButton'] = (props) => {\n return (\n <button\n css={{\n padding: 'var(--spacing)',\n borderRadius: '50%',\n display: 'inline-flex',\n justifyContent: 'center',\n alignItems: 'center',\n transition: 'background-color 150ms',\n border: 'none',\n cursor: 'pointer',\n color: 'inherit',\n background: 'transparent',\n\n '&:hover': {\n backgroundColor: 'rgba(0, 0, 0, 0.04)',\n },\n\n '&:active': {\n transformColor: 'scale3d(0.95, 0.95, 1)',\n },\n }}\n {...props}\n />\n );\n};\n","import type { TableTheme } from '../../types';\n\nexport const TextField: TableTheme['components']['TextField'] = ({\n startIcon,\n endIcon,\n className,\n inputRef,\n onBlur,\n ...props\n}) => {\n return (\n <div\n className={className}\n css={[\n {\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n border: '1px solid var(--table-textfield-border, var(--table-border, #777777))',\n borderRadius: 4,\n\n '&:focus-within': {\n border: '2px solid var(--primaryMain)',\n margin: -1,\n },\n },\n ]}\n >\n {startIcon}\n\n <input\n ref={inputRef}\n {...props}\n value={props.value ?? ''}\n onBlur={onBlur}\n css={{\n minWidth: 0,\n width: '100%',\n flex: 1,\n border: 'none',\n outline: 'none',\n borderRadius: 4,\n padding: 'calc(var(--spacing) * 2)',\n paddingLeft: startIcon ? 0 : undefined,\n paddingRight: endIcon ? 0 : undefined,\n transition: 'outline 500ms',\n }}\n />\n\n {endIcon}\n </div>\n );\n};\n","import { Spinner } from '../../components/spinnner';\nimport type { TableTheme } from '../../types';\nimport { Badge } from './badge';\nimport { Button } from './button';\nimport { Checkbox } from './checkbox';\nimport { IconButton } from './iconButton';\nimport { Popover } from './popover';\nimport { TextField } from './textField';\n\nexport const defaultComponents: TableTheme['components'] = {\n IconButton,\n Checkbox,\n Popover,\n Button,\n Badge,\n TextField,\n Spinner,\n};\n","import { ClassNames, css } from '@emotion/react';\nimport type { HTMLProps } from 'react';\nimport { cloneElement } from 'react';\nimport type { TableTheme } from '../../types';\n\nconst IconDefaultStyle = css({\n width: '1.5em',\n height: '1.5em',\n color: 'inherit',\n});\n\nfunction Icon(svg: JSX.Element) {\n return function IconComponent(props: HTMLProps<Element>) {\n return (\n <ClassNames>\n {({ css }) =>\n cloneElement(svg, {\n ...props,\n className: css(IconDefaultStyle, props.className),\n })\n }\n </ClassNames>\n );\n };\n}\n\nconst Settings = Icon(\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24px\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n fill=\"currentColor\"\n >\n <path d=\"M0 0h24v24H0V0z\" fill=\"none\" />\n <path d=\"M3 17v2h6v-2H3zM3 5v2h10V5H3zm10 16v-2h8v-2h-8v-2h-2v6h2zM7 9v2H3v2h4v2h2V9H7zm14 4v-2H11v2h10zm-6-4h2V7h4V5h-4V3h-2v6z\" />\n </svg>,\n);\n\nconst Export = Icon(\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n enableBackground=\"new 0 0 24 24\"\n height=\"24px\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n fill=\"currentColor\"\n >\n <g>\n <rect fill=\"none\" height=\"24\" width=\"24\" />\n </g>\n <g>\n <path d=\"M18,15v3H6v-3H4v3c0,1.1,0.9,2,2,2h12c1.1,0,2-0.9,2-2v-3H18z M17,11l-1.41-1.41L13,12.17V4h-2v8.17L8.41,9.59L7,11l5,5 L17,11z\" />\n </g>\n </svg>,\n);\n\nconst Clipboard = Icon(\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24px\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n fill=\"currentColor\"\n >\n <path d=\"M0 0h24v24H0V0z\" fill=\"none\" />\n <path d=\"M19 2h-4.18C14.4.84 13.3 0 12 0S9.6.84 9.18 2H5c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm7 18H5V4h2v3h10V4h2v16z\" />\n </svg>,\n);\n\nconst ChevronRight = Icon(\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24px\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n fill=\"currentColor\"\n >\n <path d=\"M0 0h24v24H0V0z\" fill=\"none\" />\n <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6-6-6z\" />\n </svg>,\n);\n\nconst Search = Icon(\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24px\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n fill=\"currentColor\"\n >\n <path d=\"M0 0h24v24H0V0z\" fill=\"none\" />\n <path d=\"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\" />\n </svg>,\n);\n\nconst Clear = Icon(\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24px\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n fill=\"currentColor\"\n >\n <path d=\"M0 0h24v24H0V0z\" fill=\"none\" />\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z\" />\n </svg>,\n);\n\nconst ArrowDropDown = Icon(\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24px\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n fill=\"currentColor\"\n >\n <path d=\"M0 0h24v24H0V0z\" fill=\"none\" />\n <path d=\"M7 10l5 5 5-5H7z\" />\n </svg>,\n);\n\nconst FilterList = Icon(\n <svg viewBox=\"0 0 24 24\">\n <path\n fill=\"currentColor\"\n d=\"M14,12V19.88C14.04,20.18 13.94,20.5 13.71,20.71C13.32,21.1 12.69,21.1 12.3,20.71L10.29,18.7C10.06,18.47 9.96,18.16 10,17.87V12H9.97L4.21,4.62C3.87,4.19 3.95,3.56 4.38,3.22C4.57,3.08 4.78,3 5,3V3H19V3C19.22,3 19.43,3.08 19.62,3.22C20.05,3.56 20.13,4.19 19.79,4.62L14.03,12H14Z\"\n />\n </svg>,\n);\n\nconst ArrowUpward = Icon(\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24px\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n fill=\"currentColor\"\n >\n <path d=\"M0 0h24v24H0V0z\" fill=\"none\" />\n <path d=\"M4 12l1.41 1.41L11 7.83V20h2V7.83l5.58 5.59L20 12l-8-8-8 8z\" />\n </svg>,\n);\n\nexport const defaultIcons: TableTheme['icons'] = {\n Settings,\n Export,\n Clipboard,\n ChevronRight,\n Search,\n Clear,\n ArrowDropDown,\n FilterList,\n ArrowUpward,\n};\n","import type { TableTheme } from '../../types';\n\nexport const defaultTexts: TableTheme['text'] = {\n selectColumns: 'Select visible columns',\n showAllColumns: 'Show all',\n hideAllColumns: 'Hide all',\n noResults: 'No results',\n exportTitle: 'Export',\n exportCopy: 'To clipboard',\n exportDownload: 'Download',\n today: 'Today',\n thisWeek: 'This week',\n thisMonth: 'This month',\n thisYear: 'This year',\n lastSevenDays: 'Last 7 days',\n lastThirtyDays: 'Last 30 days',\n clearFilters: 'Clear all filters',\n reset: 'Reset',\n loading: 'Loading',\n deselectAll: 'Deselect all',\n resetAll: 'Reset table state',\n rangeMin: 'Min',\n rangeMax: 'Max',\n calendarWeek: 'Wk',\n};\n","import type { TableTheme } from '../../types';\nimport { defaultColors } from './defaultColors';\nimport { defaultComponents } from './defaultComponents';\nimport { defaultIcons } from './defaultIcons';\nimport { defaultTexts } from './defaultTexts';\n\nexport const defaultTableTheme: TableTheme = {\n text: defaultTexts,\n components: defaultComponents,\n icons: defaultIcons,\n colors: defaultColors,\n spacing: '5px',\n};\n","import type { DependencyList, ReactNode } from 'react';\nimport { createContext, useContext, useMemo } from 'react';\nimport type { FunctionWithDeps } from '../types';\n\nconst TableMemoContext = createContext(new Map<string, [value: any, deps: DependencyList]>());\n\nexport function TableMemoContextProvider({ children }: { children: ReactNode }) {\n return (\n <TableMemoContext.Provider value={useMemo(() => new Map(), [])}>\n {children}\n </TableMemoContext.Provider>\n );\n}\n\nexport function useTableMemo() {\n const memoCache = useContext(TableMemoContext);\n\n return <Function_ extends (...args: any[]) => any>(\n key: string,\n function_: FunctionWithDeps<Function_>,\n ): Function_ => {\n let deps: DependencyList;\n if (Array.isArray(function_)) {\n deps = function_.slice(1);\n function_ = function_[0];\n } else {\n deps = [function_.toString()];\n }\n\n let cachedValue = memoCache.get(key);\n const hit =\n cachedValue &&\n cachedValue[1].length === deps.length &&\n cachedValue[1].every((x, i) => x === deps[i]);\n if (!cachedValue || !hit) {\n cachedValue = [function_, deps];\n memoCache.set(key, cachedValue);\n }\n return cachedValue[0];\n };\n}\n","import { useContext } from 'react';\nimport { Store } from 'schummar-state/react';\nimport { ColumnContext, TableContext } from '../misc/tableContext';\nimport { defaultTableTheme } from '../theme/defaultTheme';\nimport { globalTableTheme, mergeThemes } from '../theme/tableTheme';\nimport type { MemoizedTableTheme, TableTheme } from '../types';\nimport { useTableMemo } from './useTableMemo';\nimport { TableSettingsContext } from '../misc/tableSettings';\n\nconst emptyStore = new Store(undefined);\n\nexport function useTheme<T, S>(selector: (theme: MemoizedTableTheme<T>) => S): S {\n const { theme: contextTableTheme = {} } = useContext(TableSettingsContext);\n const table = useContext(TableContext);\n const columnId = useContext(ColumnContext);\n const memo = useTableMemo();\n const _globalTableTheme = globalTableTheme.useState();\n\n const process = (t: TableTheme<T>): MemoizedTableTheme<T> => {\n const rowClass = t.classes?.row;\n const rowStyles = t.styles?.row;\n const cellClass = t.classes?.cell;\n const cellStyles = t.styles?.cell;\n const detailsClass = t.classes?.details;\n const detailsStyles = t.styles?.details;\n\n return {\n ...t,\n classes: {\n ...t.classes,\n row:\n rowClass instanceof Function || Array.isArray(rowClass)\n ? memo('theme.classes.row', rowClass)\n : rowClass,\n cell:\n cellClass instanceof Function || Array.isArray(cellClass)\n ? memo('theme.classes.cell', cellClass)\n : cellClass,\n details:\n detailsClass instanceof Function || Array.isArray(detailsClass)\n ? memo('theme.classes.details', detailsClass)\n : detailsClass,\n },\n styles: {\n ...t.styles,\n row:\n rowStyles instanceof Function || Array.isArray(rowStyles)\n ? memo('theme.styles.row', rowStyles)\n : rowStyles,\n cell:\n cellStyles instanceof Function || Array.isArray(cellStyles)\n ? memo('theme.styles.cell', cellStyles)\n : cellStyles,\n details:\n detailsStyles instanceof Function || Array.isArray(detailsStyles)\n ? memo('theme.styles.details', detailsStyles)\n : detailsStyles,\n },\n text: {\n ...t.text,\n },\n };\n };\n\n const theme =\n table?.useState((state) => {\n const localTheme = {\n text: state.props.text,\n classes: state.props.classes,\n styles: state.props.styles,\n components: state.props.components,\n icons: state.props.icons,\n colors: state.props.colors,\n spacing: state.props.spacing,\n };\n\n const column = state.activeColumns.find((column) => column.id === columnId);\n const columnsTheme = {\n classes: column?.classes,\n styles: column?.styles,\n };\n\n const theme = mergeThemes(\n defaultTableTheme,\n _globalTableTheme,\n contextTableTheme,\n localTheme,\n columnsTheme,\n ) as TableTheme<T>;\n\n return selector(process(theme));\n }) ??\n emptyStore.useState() ??\n selector(\n process(\n mergeThemes(defaultTableTheme, _globalTableTheme, contextTableTheme) as TableTheme<T>,\n ),\n );\n\n return theme;\n}\n","import { useTheme } from '../hooks/useTheme';\n\nexport function useCssVariables() {\n return useTheme(({ spacing, colors }) => {\n return {\n '--spacing': spacing,\n '--primaryMain': colors.primary.main,\n '--primaryLight': colors.primary.light,\n '--primaryContrastText': colors.primary.contrastText,\n '--secondaryMain': colors.secondary.main,\n '--secondaryLight': colors.secondary.light,\n '--secondaryContrastText': colors.secondary.contrastText,\n '--blockedMain': colors.blocked.main,\n '--blockedLight': colors.blocked.light,\n '--blockedContrastText': colors.blocked.contrastText,\n '--table-background-color': colors.background,\n '--table-text-color': colors.text,\n '--table-border-color': colors.border,\n '--table-border-light-color': colors.borderLight,\n };\n });\n}\n","import { ClassNames } from '@emotion/react';\nimport { createContext, useState } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { useColumnContext, useTableContext } from '../misc/tableContext';\nimport { useCssVariables } from '../theme/useCssVariables';\n\nexport const FilterControlContext = createContext({\n isActive: false,\n close: (): void => undefined,\n});\n\nexport function FilterControl<T>(): JSX.Element | null {\n const table = useTableContext<T>();\n const columnId = useColumnContext();\n\n const Popover = useTheme((t) => t.components.Popover);\n const classes = useTheme((t) => t.classes);\n const styles = useTheme((t) => t.styles);\n const IconButton = useTheme((t) => t.components.IconButton);\n const FilterList = useTheme((t) => t.icons.FilterList);\n const ArrowDropDown = useTheme((t) => t.icons.ArrowDropDown);\n const cssVariables = useCssVariables();\n\n const [anchor, setAnchor] = useState<Element | null>(null);\n const isActive = table.useState((state) => {\n const filter = state.filters.get(columnId);\n const filterValue = state.filterValues.get(columnId);\n return filter !== undefined && filterValue !== undefined && filter.isActive(filterValue);\n });\n const filterClassNames = table.useState((state) => {\n const filter = state.filters.get(columnId);\n return filter?.classNames;\n });\n const filter = table.useState(\n (state) => state.activeColumns.find((column) => column.id === columnId)?.filter,\n );\n\n function reset() {\n const impl = table.getState().filters.get(columnId);\n\n impl?.onChange?.(undefined);\n\n if (impl?.value === undefined) {\n table.update((state) => {\n state.filterValues.delete(columnId);\n });\n }\n }\n\n if (!filter) return null;\n\n function close() {\n setAnchor(null);\n }\n\n return (\n <FilterControlContext.Provider value={{ isActive: !!anchor, close }}>\n <IconButton\n onClick={(event) => setAnchor(event.currentTarget)}\n onContextMenu={(event) => {\n reset();\n event.preventDefault();\n return false;\n }}\n css={[\n { color: '#b0bac9' },\n isActive && {\n color: 'var(--primaryMain) !important',\n },\n ]}\n >\n {isActive ? <FilterList /> : <ArrowDropDown />}\n </IconButton>\n\n <div\n onPointerDown={(event) => {\n event.stopPropagation();\n }}\n onPointerMove={(event) => {\n event.stopPropagation();\n }}\n >\n <ClassNames>\n {({ css, cx }) => (\n <Popover\n open\n hidden={!anchor}\n onClose={close}\n anchorEl={anchor ?? document.body}\n css={[cssVariables, styles?.popover]}\n className={cx(classes?.popover, filterClassNames?.popover)}\n backdropClassName={cx(\n classes?.popoverBackdrop,\n filterClassNames?.popoverBackdrop,\n css(styles?.popoverBackdrop),\n )}\n >\n {filter}\n </Popover>\n )}\n </ClassNames>\n </div>\n </FilterControlContext.Provider>\n );\n}\n","import type { ComponentType } from 'react';\nimport { useContext, useLayoutEffect, useRef } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport type { TableTheme } from '../types';\nimport { FilterControlContext } from './filterControl';\n\ntype Props = TableTheme['components']['TextField'] extends ComponentType<infer T> ? T : never;\n\nexport function AutoFocusTextField(props: Omit<Props, 'inputRef'>) {\n const TextField = useTheme((t) => t.components.TextField);\n\n const ref = useRef<HTMLInputElement>(null);\n const { isActive } = useContext(FilterControlContext);\n\n useLayoutEffect(() => {\n if (isActive && ref.current) {\n setTimeout(() => {\n ref.current?.focus();\n });\n }\n }, [isActive]);\n\n return (\n <TextField\n {...props}\n inputRef={ref}\n css={{\n input: {\n backgroundColor: 'inherit',\n color: 'inherit',\n },\n }}\n />\n );\n}\n","export function debounce<Args extends any[]>(\n function_: (...args: Args) => void,\n ms: number,\n): { (...args: Args): void; flush(): void; cancel(): void } {\n let lastArgs: Args | undefined;\n let timeout: ReturnType<typeof setTimeout> | undefined;\n\n function run() {\n const args = lastArgs;\n\n lastArgs = undefined;\n timeout = undefined;\n\n function_(...(args as Args));\n }\n\n return Object.assign(\n function (...args: Args) {\n lastArgs = args;\n\n if (timeout) {\n clearTimeout(timeout);\n }\n\n timeout = setTimeout(run, ms);\n },\n {\n flush() {\n if (timeout) {\n clearTimeout(timeout);\n run();\n }\n },\n\n cancel() {\n if (timeout) {\n clearTimeout(timeout);\n timeout = undefined;\n lastArgs = undefined;\n }\n },\n },\n );\n}\n","import { castDraft } from 'immer';\nimport { nanoid } from 'nanoid';\nimport { useContext, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { FilterControlContext } from '../components/filterControl';\nimport { debounce } from '../misc/debounce';\nimport { useColumnContext, useTableContext } from '../misc/tableContext';\nimport type { FilterImplementation } from '../types';\nimport { useTableMemo } from './useTableMemo';\n\nexport function useFilter<TItem, TColumnValue, TFilterBy, TFilterValue>(\n impl: FilterImplementation<TItem, TColumnValue, TFilterBy, TFilterValue>,\n) {\n const table = useTableContext<TItem>();\n const columnId = useColumnContext();\n const cache = useTableMemo();\n const cacheId = useMemo(() => nanoid(), []);\n const filterBy = impl.filterBy && cache(cacheId, impl.filterBy);\n\n // On mount and reset: Fire onChange\n useEffect(() => {\n if (impl.value === undefined) {\n impl.onChange?.(impl.defaultValue);\n }\n }, [table]);\n\n // Update implementation\n useEffect(() => {\n table.update((state) => {\n if (impl.defaultValue !== undefined) {\n state.filterValues.set(columnId, impl.defaultValue);\n }\n });\n }, [table]);\n\n useEffect(() => {\n table.update((state) => {\n state.filters.set(columnId, castDraft({ ...impl, filterBy }));\n\n if (impl.value !== undefined) {\n state.filterValues.set(columnId, impl.value);\n }\n });\n\n return () => {\n table.update((state) => {\n state.filters.delete(columnId);\n });\n };\n }, [table, columnId, impl]);\n\n // Track local value and update it globally after delay\n const value = table.useState(\n (state) => state.filterValues.get(columnId) as TFilterValue | undefined,\n );\n const [dirtyValue, setDirtyValue] = useState<TFilterValue>();\n const implRef = useRef(impl);\n\n useLayoutEffect(() => {\n implRef.current = impl;\n });\n\n const delayedUpdate = useMemo(\n () =>\n debounce((value?: TFilterValue) => {\n const { value: controlledValue, onChange } = implRef.current;\n\n if (controlledValue === undefined) {\n table.update((state) => {\n state.filterValues.set(columnId, value);\n });\n }\n\n onChange?.(value);\n setDirtyValue(undefined);\n }, 500),\n [table],\n );\n\n function onChange(value?: TFilterValue) {\n setDirtyValue(value);\n delayedUpdate(value);\n }\n\n useEffect(() => delayedUpdate.flush(), [delayedUpdate]);\n\n const context = useContext(FilterControlContext);\n\n return {\n value: dirtyValue ?? value,\n onChange,\n filterBy: filterBy ?? ((x) => x as unknown as TFilterBy | TFilterBy[]),\n ...context,\n };\n}\n","import { forwardRef, useContext } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { useColumnContext, useTableContext } from '../misc/tableContext';\nimport { FilterControlContext } from './filterControl';\n\nexport default forwardRef(FilterDialog);\n\nfunction FilterDialog(_props: {}, ref: React.Ref<HTMLDialogElement>): JSX.Element | null {\n const table = useTableContext();\n const columnId = useColumnContext();\n\n const classes = useTheme((t) => t.classes);\n const styles = useTheme((t) => t.styles);\n const IconButton = useTheme((t) => t.components.IconButton);\n const FilterList = useTheme((t) => t.icons.FilterList);\n\n const filter = table.useState(\n (state) => state.activeColumns.find((column) => column.id === columnId)?.filter,\n );\n\n const label = table.useState((state) => {\n return state.activeColumns.find((column) => column.id === columnId)?.header ?? null;\n });\n\n const isActive = table.useState((state) => {\n const filter = state.filters.get(columnId);\n const filterValue = state.filterValues.get(columnId);\n return filter !== undefined && filterValue !== undefined && filter.isActive(filterValue);\n });\n\n const { close } = useContext(FilterControlContext);\n\n return (\n <dialog\n ref={ref}\n onClick={close}\n className={classes?.dialog}\n css={[\n {\n padding: 0,\n border: 'none',\n borderRadius: 4,\n\n '::backdrop': {\n backgroundColor: 'rgba(0, 0, 0, 0.7)',\n },\n },\n styles?.dialog,\n ]}\n >\n <div onClick={(e) => e.stopPropagation()}>\n <div\n css={{\n position: 'relative',\n padding: 10,\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n gap: 10,\n }}\n >\n <FilterList\n css={{\n color: isActive ? 'var(--primaryMain)' : '#b0bac9',\n }}\n />\n\n <div\n css={{\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n paddingRight: '2em',\n }}\n >\n {label}\n </div>\n\n <IconButton\n onClick={close}\n css={{\n position: 'absolute',\n right: 0,\n top: 0,\n fontSize: '1em',\n padding: '0.5em',\n margin: '0.5em',\n lineHeight: 1,\n }}\n >\n ✕\n </IconButton>\n </div>\n\n <div\n css={{\n overflow: 'auto',\n }}\n >\n {filter}\n </div>\n </div>\n </dialog>\n );\n}\n","import { useContext, useEffect, useRef } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { useColumnContext, useTableContext } from '../misc/tableContext';\nimport { FilterControlContext } from './filterControl';\nimport FilterDialog from './filterDialog';\n\nexport function NestedFilterControl<T>(): JSX.Element | null {\n const table = useTableContext<T>();\n const columnId = useColumnContext();\n const Button = useTheme((t) => t.components.Button);\n const FilterList = useTheme((t) => t.icons.FilterList);\n const dialog = useRef<HTMLDialogElement>(null);\n const label = table.useState((state) => {\n return state.activeColumns.find((column) => column.id === columnId)?.header ?? null;\n });\n\n const isActive = table.useState((state) => {\n const filter = state.filters.get(columnId);\n const filterValue = state.filterValues.get(columnId);\n return filter !== undefined && filterValue !== undefined && filter.isActive(filterValue);\n });\n\n const filter = table.useState(\n (state) => state.activeColumns.find((column) => column.id === columnId)?.filter,\n );\n\n useEffect(\n () => () => {\n dialog.current?.close();\n },\n [],\n );\n\n if (!filter) return null;\n\n function reset() {\n const impl = table.getState().filters.get(columnId);\n\n impl?.onChange?.(undefined);\n\n if (impl?.value === undefined) {\n table.update((state) => {\n state.filterValues.delete(columnId);\n });\n }\n }\n\n const parentContext = useContext(FilterControlContext);\n\n function close() {\n dialog.current?.close();\n parentContext.close();\n }\n\n return (\n <FilterControlContext.Provider value={{ isActive: true, close }}>\n <Button\n onClick={() => dialog.current?.showModal()}\n onContextMenu={(event) => {\n reset();\n event.preventDefault();\n return false;\n }}\n startIcon={\n <FilterList\n css={{\n color: isActive ? 'var(--primaryMain)' : '#b0bac9',\n }}\n />\n }\n css={{\n width: '100%',\n color: isActive ? 'var(--primaryMain)' : 'var(--color-text)',\n }}\n >\n {label}\n </Button>\n\n <div\n onPointerDown={(event) => {\n event.stopPropagation();\n }}\n onPointerMove={(event) => {\n event.stopPropagation();\n }}\n >\n <FilterDialog ref={dialog} />\n </div>\n </FilterControlContext.Provider>\n );\n}\n","import { useFilter } from '../hooks/useFilter';\nimport { ColumnContext, useTableContext } from '../misc/tableContext';\nimport type { CommonFilterProps } from '../types';\nimport { NestedFilterControl } from './nestedFilterControl';\n\nexport interface CombinedFilterProps\n extends Pick<CommonFilterProps<any, any, any, any>, 'classNames'> {\n columnIds?: string[];\n}\n\nexport default function CombinedFilter({\n columnIds: inputColumnIds,\n ...props\n}: CombinedFilterProps) {\n const table = useTableContext();\n\n const columnIds = table.useState((state) => {\n return (\n inputColumnIds ??\n state.activeColumns\n .filter(\n (column) =>\n column.filter !== undefined && !state.visibleColumns.some((c) => c.id === column.id),\n )\n .map((column) => column.id)\n );\n });\n\n const isActive = table.useState((state) => {\n return columnIds.some((columnId) => {\n const filter = state.filters.get(columnId);\n const filterValue = state.filterValues.get(columnId);\n return filter !== undefined && filterValue !== undefined && filter.isActive(filterValue);\n });\n });\n\n useFilter({\n ...props,\n\n id: 'combinedFilter',\n\n value: isActive,\n\n isActive(filterValue) {\n return filterValue;\n },\n\n test() {\n return true;\n },\n\n onChange(value) {\n if (value === undefined) {\n for (const columnId of columnIds) {\n const impl = table.getState().filters.get(columnId);\n\n impl?.onChange?.(undefined);\n\n if (impl?.value === undefined) {\n table.update((state) => {\n state.filterValues.delete(columnId);\n });\n }\n }\n }\n },\n });\n\n return (\n <div>\n {columnIds.map((columnId) => (\n <ColumnContext.Provider key={columnId} value={columnId}>\n <NestedFilterControl />\n </ColumnContext.Provider>\n ))}\n </div>\n );\n}\n","export function defaults<T extends object>(first: T, ...more: Partial<T>[]): T {\n return more.reduce<T>((acc, source) => {\n const copy = { ...acc };\n\n for (const [key, value] of Object.entries(source)) {\n copy[key as keyof T] ??= value as any;\n }\n\n return copy;\n }, first);\n}\n","import { addDays, isBefore, isToday, startOfDay, differenceInCalendarMonths } from 'date-fns';\nimport { SyntheticEvent } from 'react';\n\nexport type DayzedDateObject = {\n date: Date;\n nextMonth: boolean;\n prevMonth: boolean;\n selectable: boolean;\n selected: boolean;\n today: boolean;\n};\n\nexport type DayzedCalendar = {\n firstDayOfMonth: Date;\n lastDayOfMonth: Date;\n month: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11;\n weeks: Array<Array<DayzedDateObject | ''>>;\n year: number;\n};\n\n/**\n * This is intended to be used to compose event handlers\n * They are executed in order until one of them calls\n * `event.preventDefault()`. Not sure this is the best\n * way to do this, but it seems legit...\n * @param {Function} fns the event hanlder functions\n * @return {Function} the event handler to add to an element\n */\nexport function composeEventHandlers(\n ...fns: (((event: SyntheticEvent, ...args: any[]) => any) | undefined)[]\n) {\n return (event: SyntheticEvent, ...args: any[]) =>\n fns.some((fn) => {\n if (fn) {\n fn(event, ...args);\n }\n return event.defaultPrevented;\n });\n}\n\n/**\n * Throws a helpful error message for required properties. Useful\n * to be used as a default in destructuring or object params.\n * @param {String} fnName the function name\n * @param {String} propName the prop name\n */\nexport function requiredProp(fnName: string, propName: string): never {\n throw new Error(`The property \"${propName}\" is required in \"${fnName}\"`);\n}\n\n/**\n * Takes a calendars array and figures out the number of months to subtract\n * based on the current offset and the minDate allowed.\n * @param {Object} param The param object\n * @param {Array} param.calendars The calendars array created by the getCalendars function\n * @param {Number} param.offset The num of months to be subtracted\n * @param {Date} param.minDate The earliest date we are allow to subtract back to\n * @returns {Number} The number of months to subtract\n */\nexport function subtractMonth({\n calendars,\n offset,\n minDate,\n}: {\n calendars: DayzedCalendar[];\n offset: number;\n minDate?: Date;\n}) {\n if (offset > 1 && minDate) {\n const { firstDayOfMonth } = calendars[0]!;\n const diffInMonths = differenceInCalendarMonths(firstDayOfMonth, minDate);\n if (diffInMonths < offset) {\n offset = diffInMonths;\n }\n }\n return offset;\n}\n\n/**\n * Takes a calendars array and figures out the number of months to add\n * based on the current offset and the maxDate allowed.\n * @param {Object} param The param object\n * @param {Array} param.calendars The calendars array created by the getCalendars function\n * @param {Number} param.offset The num of months to be added\n * @param {Date} param.maxDate The furthest date we are allow to add forward to\n * @returns {Number} The number of months to add\n */\nexport function addMonth({\n calendars,\n offset,\n maxDate,\n}: {\n calendars: DayzedCalendar[];\n offset: number;\n maxDate?: Date;\n}) {\n if (offset > 1 && maxDate) {\n const { lastDayOfMonth } = calendars[calendars.length - 1]!;\n const diffInMonths = differenceInCalendarMonths(maxDate, lastDayOfMonth);\n if (diffInMonths < offset) {\n offset = diffInMonths;\n }\n }\n return offset;\n}\n\n/**\n * Takes a calendars array and figures out if the back button should be\n * disabled based on the minDate allowed.\n * @param {Object} param The param object\n * @param {Array} param.calendars The calendars array created by the getCalendars function\n * @param {Date} param.minDate The earliest date available\n * @returns {Boolean} Whether the back button should be disabled.\n */\nexport function isBackDisabled({\n calendars,\n minDate,\n}: {\n calendars: DayzedCalendar[];\n minDate?: Date;\n}) {\n if (!minDate) {\n return false;\n }\n const { firstDayOfMonth } = calendars[0]!;\n const firstDayOfMonthMinusOne = addDays(firstDayOfMonth, -1);\n if (isBefore(firstDayOfMonthMinusOne, minDate)) {\n return true;\n }\n return false;\n}\n\n/**\n * Takes a calendars array and figures out if the forward button should be\n * disabled based on the maxDate allowed.\n * @param {Object} param The param object\n * @param {Array} param.calendars The calendars array created by the getCalendars function\n * @param {Date} param.maxDate The furthest date available\n * @returns {Boolean} Whether the forward button should be disabled.\n */\nexport function isForwardDisabled({\n calendars,\n maxDate,\n}: {\n calendars: DayzedCalendar[];\n maxDate?: Date;\n}) {\n if (!maxDate) {\n return false;\n }\n const { lastDayOfMonth } = calendars[calendars.length - 1]!;\n const lastDayOfMonthPlusOne = addDays(lastDayOfMonth, 1);\n if (isBefore(maxDate, lastDayOfMonthPlusOne)) {\n return true;\n }\n return false;\n}\n\n/**\n * Figures out the months data needed based off the number of monthsToDisplay\n * and other options provided.\n * @param {Object} param The param object\n * @param {Date} param.date The date to start the calendar at\n * @param {Array.<Date>} param.selected An array of dates currently selected\n * @param {Number} param.monthsToDisplay The number of months to return in the calendar view\n * @param {Number} param.offset The number of months to offset based off the param.date given\n * @param {Date} param.minDate The earliest date available\n * @param {Date} param.maxDate The furthest date available\n * @param {Number} param.firstDayOfWeek First day of week, 0-6 (Sunday to Saturday)\n * @param {Bool} param.showOutsideDays Flag to fill front and back weeks with dates from adjacent months\n * @returns {Array.<Object>} An array of objects with month data\n */\nexport function getCalendars({\n date,\n selected,\n monthsToDisplay,\n offset,\n minDate,\n maxDate,\n firstDayOfWeek,\n showOutsideDays,\n}: {\n date: Date;\n selected: Date[];\n monthsToDisplay: number;\n offset: number;\n minDate?: Date;\n maxDate?: Date;\n firstDayOfWeek: number;\n showOutsideDays: boolean;\n}): DayzedCalendar[] {\n const months: DayzedCalendar[] = [];\n const startDate = getStartDate(date, minDate, maxDate);\n for (let i = 0; i < monthsToDisplay; i++) {\n const calendarDates = getMonths({\n month: startDate.getMonth() + i + offset,\n year: startDate.getFullYear(),\n selectedDates: selected,\n minDate,\n maxDate,\n firstDayOfWeek,\n showOutsideDays,\n });\n months.push(calendarDates);\n }\n return months;\n}\n\n/**\n * Figures out the actual start date based on\n * the min and max dates available.\n * @param {Date} date The we want to start the calendar at\n * @param {Date} minDate The earliest date available to start at\n * @param {Date} maxDate The latest date available to start at\n * @returns {Date} The actual start date\n */\nfunction getStartDate(date: Date, minDate?: Date, maxDate?: Date): Date {\n let startDate = startOfDay(date);\n if (minDate) {\n const minDateNormalized = startOfDay(minDate);\n if (isBefore(startDate, minDateNormalized)) {\n startDate = minDateNormalized;\n }\n }\n if (maxDate) {\n const maxDateNormalized = startOfDay(maxDate);\n if (isBefore(maxDateNormalized, startDate)) {\n startDate = maxDateNormalized;\n }\n }\n return startDate;\n}\n\n/**\n * Figures what week/day data to return for the given month\n * and year. Adds flags to day data if found in the given selectedDates,\n * if is selectable inside the given min and max dates, or is today.\n * @param {Object} param The param object\n * @param {Number} param.month The month to grab data for\n * @param {Number} param.year The year to grab data for\n * @param {Array.<Date>} param.selectedDates An array of dates currently selected\n * @param {Date} param.minDate The earliest date available\n * @param {Date} param.maxDate The furthest date available\n * @param {Number} param.firstDayOfWeek First day of week, 0-6 (Sunday to Saturday)\n * @param {Bool} param.showOutsideDays Flag to fill front and back weeks with dates from adjacent months\n * @returns {Object} The data for the selected month/year\n */\nfunction getMonths({\n month,\n year,\n selectedDates,\n minDate,\n maxDate,\n firstDayOfWeek,\n showOutsideDays,\n}: {\n month: number;\n year: number;\n selectedDates: Date[];\n minDate?: Date;\n maxDate?: Date;\n firstDayOfWeek: number;\n showOutsideDays: boolean;\n}): DayzedCalendar {\n // Get the normalized month and year, along with days in the month.\n const daysMonthYear = getNumDaysMonthYear(month, year);\n const daysInMonth = daysMonthYear.daysInMonth;\n month = daysMonthYear.month;\n year = daysMonthYear.year;\n\n // Fill out the dates for the month.\n const dates: ('' | DayzedDateObject)[] = [];\n for (let day = 1; day <= daysInMonth; day++) {\n const date = new Date(year, month, day);\n const dateObj = {\n date,\n selected: isSelected(selectedDates, date),\n selectable: isSelectable(minDate, maxDate, date),\n today: isToday(date),\n prevMonth: false,\n nextMonth: false,\n };\n dates.push(dateObj);\n }\n\n const firstDayOfMonth = new Date(year, month, 1);\n const lastDayOfMonth = new Date(year, month, daysInMonth);\n\n const frontWeekBuffer = fillFrontWeek({\n firstDayOfMonth,\n minDate,\n maxDate,\n selectedDates,\n firstDayOfWeek,\n showOutsideDays,\n });\n\n const backWeekBuffer = fillBackWeek({\n lastDayOfMonth,\n minDate,\n maxDate,\n selectedDates,\n firstDayOfWeek,\n showOutsideDays,\n });\n\n dates.unshift(...frontWeekBuffer);\n dates.push(...backWeekBuffer);\n\n // Get the filled out weeks for the\n // given dates.\n const weeks = getWeeks(dates);\n // return the calendar data.\n return {\n firstDayOfMonth,\n lastDayOfMonth,\n month: month as DayzedCalendar['month'],\n year,\n weeks,\n };\n}\n\n/**\n * Fill front week with either empty buffer or dates from previous month,\n * depending on showOutsideDays flag\n * @param {Object} param The param object\n * @param {Array.<Date>} param.selectedDates An array of dates currently selected\n * @param {Date} param.minDate The earliest date available\n * @param {Date} param.maxDate The furthest date available\n * @param {Date} param.firstDayOfMonth First day of the month\n * @param {Number} param.firstDayOfWeek First day of week, 0-6 (Sunday to Saturday)\n * @param {Bool} param.showOutsideDays Flag to fill front and back weeks with dates from adjacent months\n * @returns {Array.<Date>} Buffer to fill front week\n */\nfunction fillFrontWeek({\n firstDayOfMonth,\n minDate,\n maxDate,\n selectedDates,\n firstDayOfWeek,\n showOutsideDays,\n}: {\n firstDayOfMonth: Date;\n minDate?: Date;\n maxDate?: Date;\n selectedDates: Date[];\n firstDayOfWeek: number;\n showOutsideDays: boolean;\n}) {\n const dates: ('' | DayzedDateObject)[] = [];\n let firstDay = (firstDayOfMonth.getDay() + 7 - firstDayOfWeek) % 7;\n\n if (showOutsideDays) {\n const lastDayOfPrevMonth = addDays(firstDayOfMonth, -1);\n const prevDate = lastDayOfPrevMonth.getDate();\n const prevDateMonth = lastDayOfPrevMonth.getMonth();\n const prevDateYear = lastDayOfPrevMonth.getFullYear();\n\n // Fill out front week for days from\n // preceding month with dates from previous month.\n let counter = 0;\n while (counter < firstDay) {\n const date = new Date(prevDateYear, prevDateMonth, prevDate - counter);\n const dateObj = {\n date,\n selected: isSelected(selectedDates, date),\n selectable: isSelectable(minDate, maxDate, date),\n today: false,\n prevMonth: true,\n nextMonth: false,\n };\n dates.unshift(dateObj);\n counter++;\n }\n } else {\n // Fill out front week for days from\n // preceding month with buffer.\n while (firstDay > 0) {\n dates.unshift('');\n firstDay--;\n }\n }\n\n return dates;\n}\n\n/**\n * Fill back weeks with either empty buffer or dates from next month,\n * depending on showOutsideDays flag\n * @param {Object} param The param object\n * @param {Array.<Date>} param.selectedDates An array of dates currently selected\n * @param {Date} param.minDate The earliest date available\n * @param {Date} param.maxDate The furthest date available\n * @param {Date} param.lastDayOfMonth Last day of the month\n * @param {Number} param.firstDayOfWeek First day of week, 0-6 (Sunday to Saturday)\n * @param {Bool} param.showOutsideDays Flag to fill front and back weeks with dates from adjacent months\n * @returns {Array.<Date>} Buffer to fill back week\n */\nfunction fillBackWeek({\n lastDayOfMonth,\n minDate,\n maxDate,\n selectedDates,\n firstDayOfWeek,\n showOutsideDays,\n}: {\n lastDayOfMonth: Date;\n minDate?: Date;\n maxDate?: Date;\n selectedDates: Date[];\n firstDayOfWeek: number;\n showOutsideDays: boolean;\n}) {\n const dates: ('' | DayzedDateObject)[] = [];\n let lastDay = (lastDayOfMonth.getDay() + 7 - firstDayOfWeek) % 7;\n\n if (showOutsideDays) {\n const firstDayOfNextMonth = addDays(lastDayOfMonth, 1);\n const nextDateMonth = firstDayOfNextMonth.getMonth();\n const nextDateYear = firstDayOfNextMonth.getFullYear();\n\n // Fill out back week for days from\n // following month with dates from next month.\n let counter = 0;\n while (counter < 6 - lastDay) {\n const date = new Date(nextDateYear, nextDateMonth, 1 + counter);\n const dateObj = {\n date,\n selected: isSelected(selectedDates, date),\n selectable: isSelectable(minDate, maxDate, date),\n today: false,\n prevMonth: false,\n nextMonth: true,\n };\n dates.push(dateObj);\n counter++;\n }\n } else {\n // Fill out back week for days from\n // following month with buffer.\n while (lastDay < 6) {\n dates.push('');\n lastDay++;\n }\n }\n\n return dates;\n}\n\n/**\n * Normalizes month (could be overflow) and year pairs and returns the\n * normalized month and year along with the number of days in the month.\n * @param {Number} month The month to normalize\n * @param {Number} year The year to normalize\n * @returns {Object} The normalized month and year along with the number of days in the month\n */\nfunction getNumDaysMonthYear(month: number, year: number) {\n // If a parameter you specify is outside of the expected range for Month or Day,\n // JS Date attempts to update the date information in the Date object accordingly!\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setMonth\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setDate\n\n // Let Date handle the overflow of the month,\n // which should return the normalized month and year.\n const normalizedMonthYear = new Date(year, month, 1);\n month = normalizedMonthYear.getMonth();\n year = normalizedMonthYear.getFullYear();\n // Overflow the date to the next month, then subtract the difference\n // to get the number of days in the previous month.\n // This will also account for leap years!\n const daysInMonth = 32 - new Date(year, month, 32).getDate();\n return { daysInMonth, month, year };\n}\n\n/**\n * Takes an array of dates, and turns them into a multi dimensional\n * array with 7 entries for each week.\n * @param {Array.<Object>} dates An array of dates\n * @returns {Array} The weeks as a multi dimensional array\n */\nfunction getWeeks(dates: ('' | DayzedDateObject)[]) {\n const weeksLength = Math.ceil(dates.length / 7);\n const weeks: ('' | DayzedDateObject)[][] = [];\n for (let i = 0; i < weeksLength; i++) {\n weeks[i] = [];\n for (let x = 0; x < 7; x++) {\n weeks[i]!.push(dates[i * 7 + x]!);\n }\n }\n return weeks;\n}\n\n/**\n * Normalizes dates to the beginning of the day,\n * then checks to see if the day given is found\n * in the selectedDates.\n * @param {Array.<Date>} selectedDates An array of dates currently selected\n * @param {Date} date The date to search with against selectedDates\n * @returns {Boolean} Whether day is found in selectedDates\n */\nfunction isSelected(selectedDates: Date[], date: Date): boolean {\n selectedDates = Array.isArray(selectedDates) ? selectedDates : [selectedDates];\n return selectedDates.some((selectedDate) => {\n if (\n selectedDate instanceof Date &&\n startOfDay(selectedDate).getTime() === startOfDay(date).getTime()\n ) {\n return true;\n }\n return false;\n });\n}\n\n/**\n * Checks to see if the date given is\n * between the min and max dates.\n * @param {Date} minDate The earliest date available\n * @param {Date} maxDate The furthest date available\n * @param {Date} date The date to compare with\n * @returns {Boolean} Whether the date is between min and max date\n */\nfunction isSelectable(minDate: Date | undefined, maxDate: Date | undefined, date: Date): boolean {\n if ((minDate && isBefore(date, minDate)) || (maxDate && isBefore(maxDate, date))) {\n return false;\n }\n return true;\n}\n","import { HTMLProps, SyntheticEvent, useState } from 'react';\n\nimport {\n composeEventHandlers,\n requiredProp,\n subtractMonth,\n addMonth,\n isBackDisabled,\n isForwardDisabled,\n getCalendars,\n type DayzedDateObject,\n type DayzedCalendar,\n} from './utils';\n\nfunction isOffsetControlled(propOffset: number | undefined) {\n return propOffset !== undefined;\n}\n\nfunction getOffset(prop: number | undefined, state: number) {\n return isOffsetControlled(prop) ? prop : state;\n}\n\nfunction getDateProps(\n onDateSelected: ((date: DayzedDateObject, event: SyntheticEvent) => void) | undefined,\n {\n onClick,\n dateObj = requiredProp('getDateProps', 'dateObj'),\n ...rest\n }: Partial<GetDatePropsOptions> = {},\n) {\n return {\n onClick: composeEventHandlers(onClick as any, (event) => {\n onDateSelected?.(dateObj, event);\n }),\n disabled: !dateObj.selectable,\n 'aria-label': dateObj.date.toDateString(),\n 'aria-pressed': dateObj.selected,\n role: 'button',\n ...rest,\n };\n}\n\nfunction getBackProps(\n {\n minDate,\n offsetMonth,\n handleOffsetChanged,\n }: {\n minDate?: Date;\n offsetMonth: number;\n handleOffsetChanged: (offset: number) => void;\n },\n {\n onClick,\n offset = 1,\n calendars = requiredProp('getBackProps', 'calendars'),\n ...rest\n }: Partial<GetBackForwardPropsOptions> = {},\n) {\n return {\n onClick: composeEventHandlers(onClick as any, () => {\n handleOffsetChanged(offsetMonth - subtractMonth({ calendars, offset, minDate }));\n }),\n disabled: isBackDisabled({ calendars, minDate }),\n 'aria-label': `Go back ${offset} month${offset === 1 ? '' : 's'}`,\n ...rest,\n };\n}\n\nfunction getForwardProps(\n {\n maxDate,\n offsetMonth,\n handleOffsetChanged,\n }: {\n maxDate?: Date;\n offsetMonth: number;\n handleOffsetChanged: (offset: number) => void;\n },\n {\n onClick,\n offset = 1,\n calendars = requiredProp('getForwardProps', 'calendars'),\n ...rest\n }: Partial<GetBackForwardPropsOptions> = {},\n) {\n return {\n onClick: composeEventHandlers(onClick as any, () => {\n handleOffsetChanged(offsetMonth + addMonth({ calendars, offset, maxDate }));\n }),\n disabled: isForwardDisabled({ calendars, maxDate }),\n 'aria-label': `Go forward ${offset} month${offset === 1 ? '' : 's'}`,\n ...rest,\n };\n}\n\nexport function useDayzed({\n date = new Date(),\n maxDate,\n minDate,\n monthsToDisplay = 1,\n firstDayOfWeek = 0,\n showOutsideDays = false,\n offset,\n onDateSelected,\n onOffsetChanged = () => {},\n selected,\n}: {\n date?: Date;\n maxDate?: Date;\n minDate?: Date;\n monthsToDisplay?: number;\n firstDayOfWeek?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n showOutsideDays?: boolean;\n selected?: Date | Date[];\n offset?: number;\n onOffsetChanged?(offset: number): void;\n onDateSelected(selectedDate: DayzedDateObject, event: SyntheticEvent): void;\n}): RenderProps {\n const [stateOffset, setStateOffset] = useState(0);\n const offsetMonth = getOffset(offset, stateOffset);\n\n function handleOffsetChanged(newOffset: number) {\n if (!isOffsetControlled(offset)) {\n setStateOffset(newOffset);\n }\n onOffsetChanged(newOffset);\n }\n\n const calendars = getCalendars({\n date,\n selected: Array.isArray(selected) ? selected : selected ? [selected] : [],\n monthsToDisplay,\n minDate,\n maxDate,\n offset: offsetMonth,\n firstDayOfWeek,\n showOutsideDays,\n });\n return {\n calendars,\n getDateProps: getDateProps.bind(null, onDateSelected),\n getBackProps: getBackProps.bind(null, {\n minDate,\n offsetMonth,\n handleOffsetChanged,\n }),\n getForwardProps: getForwardProps.bind(null, {\n maxDate,\n offsetMonth,\n handleOffsetChanged,\n }),\n };\n}\n\ninterface GetBackForwardPropsOptions extends HTMLProps<HTMLButtonElement> {\n calendars: DayzedCalendar[];\n offset?: number;\n}\n\ninterface GetDatePropsOptions extends HTMLProps<HTMLButtonElement> {\n dateObj: DayzedDateObject;\n}\n\ninterface RenderProps {\n calendars: DayzedCalendar[];\n getBackProps: (data: GetBackForwardPropsOptions) => Record<string, any>;\n getForwardProps: (data: GetBackForwardPropsOptions) => Record<string, any>;\n getDateProps: (data: GetDatePropsOptions) => Record<string, any>;\n}\n\nexport type { DayzedDateObject } from './utils';\n","import { useEffect, useRef } from 'react';\n\nexport default function useLatestRef<T>(value: T) {\n const latestValue = useRef(value);\n\n useEffect(() => {\n latestValue.current = value;\n }, [value]);\n\n return latestValue;\n}\n","import { nanoid } from 'nanoid';\nimport { Fragment, useMemo, useState } from 'react';\nimport useLatestRef from '../hooks/useLatestRef';\nimport { debounce } from '../misc/debounce';\n\nexport interface DateInputProps {\n value: Date | null;\n onChange: (date: Date | null) => void;\n locale?: string;\n}\n\ntype Part = 'day' | 'month' | 'year';\n\nconst className = 'schummar-table-date-input';\nconst defaultDate = new Date(1970, 0, 1);\n\nconst isIncludedType = (type: Intl.DateTimeFormatPartTypes): type is Part =>\n type === 'day' || type === 'month' || type === 'year';\n\nconst maxValues = {\n day: 31,\n month: 12,\n year: 9999,\n};\n\nconst tabNext = (event: Element, id: string) => {\n const all = Array.from(document.querySelectorAll(`.${className}-${id}`));\n const index = all.indexOf(event);\n const next = all[index + 1];\n\n if (next instanceof HTMLElement) {\n next.focus();\n }\n};\n\nfunction buildDate(value: Partial<Record<Part, string>>, baseDate = new Date()): Date {\n const date = new Date(baseDate);\n\n if (value.year) {\n date.setFullYear(Number(value.year));\n }\n\n if (value.month) {\n date.setMonth(Number(value.month) - 1);\n }\n\n if (value.day) {\n date.setDate(Number(value.day));\n }\n\n return date;\n}\n\nexport function DateInput({ value, onChange, locale }: DateInputProps) {\n const id = useMemo(() => nanoid(), []);\n const [localValue, setLocalValue] = useState<Partial<Record<Part, string>>>();\n const latestValue = useLatestRef(value);\n\n const commit = useMemo(\n () =>\n debounce(\n (\n localValue: Partial<Record<Part, string>> = {},\n value: Date | null,\n onChange: (date: Date | null) => void,\n ) => {\n if (value !== latestValue.current) {\n // Value has been changed from outside, don't override it.\n return;\n }\n\n const date = buildDate(localValue, value ?? undefined);\n setLocalValue(undefined);\n onChange(isNaN(date.getTime()) ? null : date);\n },\n 100,\n ),\n [],\n );\n\n const format = useMemo(\n () =>\n new Intl.DateTimeFormat(locale, {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n }),\n [locale],\n );\n\n let parts;\n try {\n parts = format.formatToParts(value ?? defaultDate);\n } catch {\n parts = format.formatToParts(defaultDate);\n }\n\n const isEmpty = !value;\n\n return (\n <div\n css={{\n display: 'flex',\n alignItems: 'baseline',\n }}\n >\n {parts.map(({ type, value: partValue }, index) => (\n <Fragment key={index}>\n {isIncludedType(type) ? (\n <input\n className={`${className}-${id}`}\n css={{\n boxSizing: 'content-box',\n overflow: 'visible',\n border: 'none',\n borderBottom: '2px solid transparent',\n outline: 'none',\n fontSize: 'inherit',\n backgroundColor: 'inherit',\n color: 'inherit',\n\n '::placeholder': {\n color: 'inherit',\n opacity: 0.5,\n },\n\n '&:focus': {\n borderBottom: '2px solid var(--primaryMain)',\n },\n }}\n style={{\n width: `${String(maxValues[type]).length}ch`,\n }}\n placeholder={''.padEnd(String(maxValues[type]).length, '0')}\n value={localValue?.[type] ?? (isEmpty ? '' : partValue)}\n onChange={(event) => {\n const input = event.target.value;\n if (!/^\\d*$/.test(input)) return;\n\n const newValue = { ...localValue, [type]: input };\n\n if (Number(input) > maxValues[type]) {\n newValue[type] = String(maxValues[type]);\n }\n\n setLocalValue(newValue);\n\n if (input.length >= String(maxValues[type]).length) {\n setTimeout(() => tabNext(event.target, id));\n }\n }}\n onFocus={(event) => {\n commit.cancel();\n event.target.select();\n }}\n onBlur={() => {\n commit(localValue, value, onChange);\n }}\n />\n ) : type === 'literal' ? (\n <span>{partValue}</span>\n ) : null}\n </Fragment>\n ))}\n </div>\n );\n}\n","import { useTheme } from '../hooks/useTheme';\nimport type { TableTheme } from '../types';\n\nexport interface TextProps {\n id: keyof TableTheme['text'];\n}\n\nexport function Text({ id }: TextProps) {\n const text = useTheme((t) => t.text[id]);\n\n return <>{text}</>;\n}\n","import { nanoid } from 'nanoid';\nimport { Fragment, useMemo, useState } from 'react';\nimport { debounce } from '../misc/debounce';\nimport useLatestRef from '../hooks/useLatestRef';\n\nexport interface TimeInputProps {\n value: Date | null;\n onChange: (date: Date | null) => void;\n locale?: string;\n showSeconds?: boolean;\n}\n\ntype Part = 'hour' | 'minute' | 'second';\n\nconst className = 'schummar-table-time-input';\nconst defaultDate = new Date(1970, 0, 1);\n\nconst isIncludedType = (type: Intl.DateTimeFormatPartTypes): type is Part =>\n type === 'hour' || type === 'minute' || type === 'second';\n\nconst maxValues = {\n hour: 23,\n minute: 59,\n second: 59,\n};\n\nconst tabNext = (event: Element, id: string) => {\n const all = Array.from(document.querySelectorAll(`.${className}-${id}`));\n const index = all.indexOf(event);\n const next = all[index + 1];\n\n if (next instanceof HTMLElement) {\n next.focus();\n }\n};\n\nfunction buildTime(value: Partial<Record<Part, string>>, baseDate = new Date()): Date {\n const date = new Date(baseDate);\n\n if (value.hour) {\n date.setHours(Number(value.hour));\n }\n\n if (value.minute) {\n date.setMinutes(Number(value.minute));\n }\n\n if (value.second) {\n date.setSeconds(Number(value.second));\n }\n\n return date;\n}\n\nexport function TimeInput({ value, onChange, locale, showSeconds = true }: TimeInputProps) {\n const id = useMemo(() => nanoid(), []);\n const [localValue, setLocalValue] = useState<Partial<Record<Part, string>>>();\n const latestValue = useLatestRef(value);\n\n const commit = useMemo(\n () =>\n debounce(\n (\n localValue: Partial<Record<Part, string>> = {},\n value: Date | null,\n onChange: (date: Date | null) => void,\n ) => {\n if (value !== latestValue.current) {\n // Value has been changed from outside, don't override it.\n return;\n }\n\n const date = buildTime(localValue, value ?? undefined);\n setLocalValue(undefined);\n onChange(isNaN(date.getTime()) ? null : date);\n },\n 100,\n ),\n [],\n );\n\n const format = useMemo(\n () =>\n new Intl.DateTimeFormat(locale, {\n hour: '2-digit',\n minute: '2-digit',\n second: showSeconds ? '2-digit' : undefined,\n }),\n [locale],\n );\n\n let parts;\n try {\n parts = format.formatToParts(value ?? defaultDate);\n } catch {\n parts = format.formatToParts(defaultDate);\n }\n\n const isEmpty = !value;\n\n return (\n <div\n css={{\n display: 'flex',\n alignItems: 'baseline',\n }}\n >\n {parts.map(({ type, value: partValue }, index) => (\n <Fragment key={index}>\n {isIncludedType(type) ? (\n <input\n className={`${className}-${id}`}\n css={{\n boxSizing: 'content-box',\n overflow: 'visible',\n border: 'none',\n borderBottom: '2px solid transparent',\n outline: 'none',\n fontSize: 'inherit',\n backgroundColor: 'inherit',\n color: 'inherit',\n\n '::placeholder': {\n color: 'inherit',\n opacity: 0.5,\n },\n\n '&:focus': {\n borderBottom: '2px solid var(--primaryMain)',\n },\n }}\n style={{\n width: `${String(maxValues[type]).length}ch`,\n }}\n placeholder={''.padEnd(String(maxValues[type]).length, '0')}\n value={localValue?.[type] ?? (isEmpty ? '' : partValue)}\n onChange={(event) => {\n const input = event.target.value;\n if (!/^\\d*$/.test(input)) return;\n\n const newValue = { ...localValue, [type]: input };\n\n if (Number(input) > maxValues[type]) {\n newValue[type] = String(maxValues[type]);\n }\n\n setLocalValue(newValue);\n\n if (input.length >= String(maxValues[type]).length) {\n setTimeout(() => tabNext(event.target, id));\n }\n }}\n onFocus={(event) => {\n commit.cancel();\n event.target.select();\n }}\n onBlur={() => {\n commit(localValue, value, onChange);\n }}\n />\n ) : type === 'literal' ? (\n <span>{partValue}</span>\n ) : null}\n </Fragment>\n ))}\n </div>\n );\n}\n","import { Interpolation, Theme } from '@emotion/react';\nimport {\n Fragment,\n ReactNode,\n createContext,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport { Temporal } from 'temporal-polyfill';\nimport { useTheme } from '../hooks/useTheme';\nimport { defaults } from '../misc/defaults';\nimport { useCssVariables } from '../theme/useCssVariables';\nimport { useDayzed, type DayzedDateObject } from '../vendor/dayzed/dayzed';\nimport { DateInput } from './dateInput';\nimport { Text } from './text';\nimport { TimeInput } from './timeInput';\n\nexport type DateRange = { min: Date; max: Date };\n\nexport type DatePickerQuickOption =\n | 'today'\n | 'thisWeek'\n | 'thisMonth'\n | 'thisYear'\n | 'lastSevenDays'\n | 'lastThirtyDays'\n | { label: ReactNode; value: Date | DateRange | (() => Date | DateRange) }\n | ((onChange: (value: Date | DateRange | null) => void) => ReactNode);\n\nexport type DatePickerChangeSource = 'input' | 'calendarWeek' | 'calendar' | 'quickOption';\n\nexport type DatePickerProps = {\n /** Currently selected day or range of days. */\n value: Date | DateRange | null;\n /** Callback for when the day (range) changes. */\n onChange: (value: Date | DateRange | null, source: DatePickerChangeSource) => void;\n /** Currently visible date. */\n dateInView?: Date;\n /** Callback for when the currently visible date changes. */\n onDateInViewChange?: (value: Date) => void;\n /** If enabled, ranges can be selected. */\n rangeSelect?: boolean;\n /** Which locale to use to render the calendar. */\n locale?: string;\n /** Which day of the week should be in the first column. (0=Sunday, 1=Monday, ...)\n * @default 1\n */\n firstDayOfWeek?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n /** Which month to show initially */\n defaultDateInView?: Date;\n /** Show buttons to quickly select suggested dates or date ranges */\n quickOptions?: DatePickerQuickOption[];\n noReset?: boolean;\n /** Minimum selectable date */\n /** Date ranges that are visually marked as blocked */\n blockedRanges?: DateRange[];\n minDate?: Date;\n /** Maximum selectable date */\n maxDate?: Date;\n /** Whether to show the calendar week in the first column */\n showCalendarWeek?: boolean;\n /** Whether to show and allow editing of time */\n showTime?: boolean | { showSeconds?: boolean };\n};\n\nconst DatePickerContext = createContext<Partial<Omit<DatePickerProps, 'value' | 'onChange'>>>({});\n\nexport function DatePickerProvider({\n children,\n ...props\n}: Partial<Omit<DatePickerProps, 'value' | 'onChange'>> & { children?: ReactNode }) {\n const value = useMemo(() => props, [JSON.stringify(props)]);\n\n return <DatePickerContext.Provider value={value}>{children}</DatePickerContext.Provider>;\n}\n\nconst weekDays = [0, 1, 2, 3, 4, 5, 6] as const;\n\n/** Rounds a date down to the start of the day. */\nexport const startOfDay = (d: Date) => new Date(d.getFullYear(), d.getMonth(), d.getDate());\n\n/** Rounds a date up to the end of the day. */\nexport const endOfDay = (d: Date) =>\n new Date(d.getFullYear(), d.getMonth(), d.getDate() + 1, 0, 0, 0, -1);\n\nexport const lastDays = (days: number): DateRange => {\n const now = new Date();\n const min = new Date(now);\n min.setDate(min.getDate() - days + 1);\n\n return {\n min: startOfDay(min),\n max: endOfDay(now),\n };\n};\n\nexport const today = () => lastDays(1);\n\nexport const thisWeek = (delta = 0, firstDayOfWeek = 1): DateRange => {\n const now = new Date();\n const min = new Date(now);\n\n let diff = min.getDay() - firstDayOfWeek;\n if (diff < 0) {\n diff += 7;\n }\n min.setDate(min.getDate() - diff + delta * 7);\n\n const max = new Date(min);\n max.setDate(max.getDate() + 6);\n\n return {\n min: startOfDay(min),\n max: endOfDay(max),\n };\n};\n\nexport const thisMonth = (delta = 0): DateRange => {\n const now = new Date();\n const min = new Date(now);\n min.setDate(1);\n min.setMonth(min.getMonth() + delta);\n const max = new Date(min);\n max.setMonth(max.getMonth() + 1);\n max.setDate(max.getDate() - 1);\n\n return {\n min: startOfDay(min),\n max: endOfDay(max),\n };\n};\n\nexport const thisYear = (delta = 0): DateRange => {\n const now = new Date();\n const min = new Date(now);\n min.setDate(1);\n min.setMonth(0);\n min.setFullYear(min.getFullYear() + delta);\n const max = new Date(min);\n max.setFullYear(max.getFullYear() + 1);\n max.setDate(max.getDate() - 1);\n\n return {\n min: startOfDay(min),\n max: endOfDay(max),\n };\n};\n\nexport const getCalendarWeek = (date: Date): number => {\n // ISO 8601: Week 1 is the week with the first Thursday of the year.\n // https://en.wikipedia.org/wiki/ISO_week_date\n\n const tz = Temporal.Now.timeZoneId();\n return (\n Temporal.Instant.fromEpochMilliseconds(date.getTime()).toZonedDateTimeISO(tz).weekOfYear ?? 0\n );\n};\n\nexport const commonQuickOptions = {\n today: { label: <Text id=\"today\" />, value: today },\n thisWeek: { label: <Text id=\"thisWeek\" />, value: (props) => thisWeek(0, props.firstDayOfWeek) },\n thisMonth: { label: <Text id=\"thisMonth\" />, value: () => thisMonth() },\n thisYear: { label: <Text id=\"thisYear\" />, value: () => thisYear() },\n lastSevenDays: { label: <Text id=\"lastSevenDays\" />, value: () => lastDays(7) },\n lastThirtyDays: { label: <Text id=\"lastThirtyDays\" />, value: () => lastDays(30) },\n} satisfies Record<\n DatePickerQuickOption & string,\n { label: ReactNode; value: Date | DateRange | ((props: DatePickerProps) => Date | DateRange) }\n>;\n\n/** Returns whether two dates and/or date ranges intersect. Intersection is considered per day. */\nexport function dateIntersect(\n a: Date | DateRange | null | undefined,\n b: Date | DateRange | null | undefined,\n) {\n if (a instanceof Date) {\n a = { min: a, max: a };\n }\n if (b instanceof Date) {\n b = { min: b, max: b };\n }\n\n if (!a?.min || !a.max || !b?.min || !b.max) {\n return false;\n }\n\n return !(endOfDay(a.max) < startOfDay(b.min) || startOfDay(a.min) > endOfDay(b.max));\n}\n\nexport function dateClamp(date: Date, min?: Date, max?: Date) {\n if (min && date < min) {\n return min;\n }\n\n if (max && date > max) {\n return max;\n }\n\n return date;\n}\n\nfunction getValueForComparison(value?: Date | DateRange | null) {\n if (!value) {\n return value;\n }\n if (value instanceof Date) {\n return value.getTime();\n }\n return `${value.min?.getTime()}-${value.max?.getTime()}`;\n}\n\nexport function DatePicker(props: DatePickerProps) {\n const context = useContext(DatePickerContext);\n\n const {\n value,\n rangeSelect,\n locale,\n firstDayOfWeek = 1,\n defaultDateInView,\n quickOptions = ['today', 'thisWeek'],\n noReset,\n minDate,\n maxDate,\n showCalendarWeek,\n blockedRanges = [],\n showTime,\n } = defaults<DatePickerProps>(props, context);\n\n function onChange(value: Date | DateRange | null, source: DatePickerChangeSource) {\n if (value instanceof Date) {\n value = dateClamp(value, minDate, maxDate);\n } else if (value) {\n value = {\n min: dateClamp(value.min, minDate, maxDate),\n max: dateClamp(value.max, minDate, maxDate),\n };\n }\n\n props.onChange(value, source);\n }\n\n const Button = useTheme((t) => t.components.Button);\n const IconButton = useTheme((t) => t.components.IconButton);\n const ChevronRight = useTheme((t) => t.icons.ChevronRight);\n const cssVariables = useCssVariables();\n function getDayCssStyles({\n disabled,\n prevMonth,\n nextMonth,\n today,\n blocked,\n selected,\n preSelected,\n }: {\n disabled?: boolean;\n prevMonth?: boolean;\n nextMonth?: boolean;\n today?: boolean;\n blocked?: boolean;\n selected?: boolean;\n preSelected?: boolean;\n }): Interpolation<Theme> {\n return [\n {\n padding: 10,\n border: 'none',\n background: 'transparent',\n cursor: disabled ? undefined : 'pointer',\n font: 'inherit',\n color: 'inherit',\n },\n (prevMonth || nextMonth) && {\n color: 'var(--date-picker-disemphasized, #bdbdbd)',\n },\n today && {\n outline: '1px solid var(--secondaryMain)',\n },\n blocked && {\n background: 'var(--blockedMain)',\n color: 'var(--blockedContrastText)',\n },\n selected && {\n background: 'var(--primaryMain)',\n color: 'var(--primaryContrastText)',\n },\n blocked &&\n selected && {\n position: 'relative',\n '::before': {\n content: '\"\"',\n position: 'absolute',\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n background: 'var(--blockedMain)',\n clipPath: 'polygon(0 0, 0 50%, 50% 0)',\n },\n },\n preSelected && {\n background: 'var(--primaryLight)',\n color: 'var(--primaryContrastText)',\n },\n ];\n }\n\n const mountTime = useMemo(() => new Date(), []);\n const [dirty, setDirty] = useState<Partial<DateRange>>();\n const [hovered, setHovered] = useState<DateRange>();\n const [dateInViewLocal, setDateInViewLocal] = useState<Date>(defaultDateInView ?? mountTime);\n const dateInView = props.dateInView ?? dateInViewLocal;\n\n function setDateInView(date: Date) {\n setDateInViewLocal(date);\n props.onDateInViewChange?.(date);\n }\n\n const min = dirty ? dirty.min : value instanceof Date ? value : value?.min;\n const max = dirty ? dirty.max : value instanceof Date ? value : value?.max;\n\n const resolvedQuickOptions = [\n ...quickOptions,\n ...(noReset ? [] : [{ label: <Text id=\"reset\" />, value: null }]),\n ].map((option, index) => {\n if (option instanceof Function) {\n return option((value) => {\n setDirty(undefined);\n onChange(value, 'quickOption');\n });\n }\n\n const { label, value } = typeof option === 'string' ? commonQuickOptions[option] : option;\n\n return (\n <Button\n key={index}\n variant=\"text\"\n type=\"button\"\n css={{\n color: 'inherit',\n }}\n onClick={() => {\n setDirty(undefined);\n\n if (value instanceof Function) {\n onChange(value(props), 'quickOption');\n } else {\n onChange(value, 'quickOption');\n }\n }}\n >\n {label}\n </Button>\n );\n });\n\n const { calendars, getBackProps, getForwardProps, getDateProps } = useDayzed({\n onDateSelected: () => undefined,\n firstDayOfWeek,\n showOutsideDays: true,\n date: dateInView,\n onOffsetChanged: (offset) =>\n setDateInView(new Date(dateInView.getFullYear(), dateInView.getMonth() + offset)),\n offset: 0,\n minDate,\n maxDate,\n });\n const now = useMemo(() => startOfDay(new Date()), []);\n\n const formatWeekday = useMemo(() => {\n const { format } = new Intl.DateTimeFormat(locale, { weekday: 'short' });\n return (weekDay: number) =>\n format(new Date(Date.UTC(2021, 7, ((weekDay + firstDayOfWeek) % 7) + 1)));\n }, [locale, firstDayOfWeek]);\n\n useEffect(\n () =>\n setDateInView(\n value === null ? defaultDateInView ?? mountTime : value instanceof Date ? value : value.max,\n ),\n [getValueForComparison(value), getValueForComparison(defaultDateInView), mountTime],\n );\n\n useEffect(() => {\n if (!rangeSelect) {\n setDirty(undefined);\n }\n }, [rangeSelect]);\n\n function set(source: DatePickerChangeSource, min?: Date, max?: Date, edit?: 'min' | 'max') {\n if (!rangeSelect) {\n onChange(min ?? null, source);\n return;\n }\n\n if (min && max && min > max) {\n if (edit === 'min') {\n max = min;\n } else if (edit === 'max') {\n min = max;\n } else {\n [min, max] = [max, min];\n }\n }\n\n if (!min === !max) {\n setDirty(undefined);\n onChange(min && max ? { min, max: endOfDay(max) } : null, source);\n } else {\n setDirty({ min, max });\n }\n }\n\n const formatMonth = useMemo(() => {\n const { format } = new Intl.DateTimeFormat(locale, { month: 'long' });\n return (month: number) => format(new Date(2021, month));\n }, [locale]);\n\n const formatYear = useMemo(() => {\n const { format } = new Intl.DateTimeFormat(locale, { year: 'numeric' });\n return (year: number) => format(new Date(year, 0, 1));\n }, [locale]);\n\n return (\n <div\n css={[\n cssVariables,\n {\n color: 'var(--table-text-color)',\n },\n ]}\n >\n <div\n css={{\n display: 'grid',\n gridAutoFlow: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n gap: 'calc(var(--spacing) * 4)',\n\n '& > div': {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n },\n }}\n >\n <div>\n <DateInput\n value={min ?? null}\n onChange={(newMin) => set('input', newMin ?? undefined, max, 'min')}\n locale={locale}\n />\n\n {showTime && (\n <TimeInput\n value={min ?? null}\n onChange={(newMin) => set('input', newMin ?? undefined, max, 'min')}\n locale={locale}\n showSeconds={typeof showTime === 'boolean' ? true : showTime.showSeconds}\n />\n )}\n </div>\n\n {rangeSelect && (\n <>\n {' - '}\n\n <div>\n <DateInput\n value={max ?? null}\n onChange={(newMax) => set('input', min, newMax ?? undefined, 'max')}\n locale={locale}\n />\n\n {showTime && (\n <TimeInput\n value={max ?? null}\n onChange={(newMax) => set('input', min, newMax ?? undefined, 'max')}\n locale={locale}\n showSeconds={typeof showTime === 'boolean' ? true : showTime.showSeconds}\n />\n )}\n </div>\n </>\n )}\n </div>\n\n {calendars.map(({ month, year, weeks }) => (\n <div key={`${month}${year}`} css={{ display: 'grid' }}>\n <div\n css={{\n margin: 'calc(var(--spacing) * 4) 0',\n display: 'grid',\n gridAutoFlow: 'column',\n justifyContent: 'space-between',\n alignItems: 'center',\n }}\n >\n <IconButton type=\"button\" {...getBackProps({ calendars })}>\n <ChevronRight css={{ transform: 'rotate3d(0, 0, 1, 180deg)' }} />\n </IconButton>\n\n <div css={{ display: 'flex' }}>\n {formatMonth(month)} {formatYear(year)}\n </div>\n\n <IconButton type=\"button\" {...getForwardProps({ calendars })}>\n <ChevronRight />\n </IconButton>\n </div>\n\n <div\n css={{\n justifySelf: 'center',\n display: 'grid',\n gridTemplateColumns: 'repeat(8, max-content)',\n }}\n >\n {showCalendarWeek ? (\n <div\n css={{\n justifySelf: 'center',\n padding: 10,\n borderRight:\n '1px solid var(--date-picker-separator, var(--table-border, #bdbdbd))',\n }}\n >\n <Text id=\"calendarWeek\" />\n </div>\n ) : (\n <div />\n )}\n\n {weekDays.map((_v, weekDay) => (\n <div\n key={weekDay}\n css={{\n justifySelf: 'center',\n padding: 10,\n }}\n >\n {formatWeekday(weekDay)}\n </div>\n ))}\n\n {weeks.map((week, index) => {\n const weekStart = week[0] as DayzedDateObject;\n const weekEnd = week[6] as DayzedDateObject;\n const weekDisabled =\n !rangeSelect ||\n (minDate && weekEnd.date < minDate) ||\n (maxDate && weekStart.date > maxDate);\n\n return (\n <Fragment key={index}>\n {showCalendarWeek ? (\n <button\n type=\"button\"\n css={{\n padding: 10,\n border: 'none',\n background: 'transparent',\n cursor: weekDisabled ? undefined : 'pointer',\n font: 'inherit',\n borderRight:\n '1px solid var(--date-picker-separator, var(--table-border, #bdbdbd))',\n color: 'inherit',\n }}\n onClick={() => {\n if (weekDisabled) {\n return;\n }\n\n const min = minDate && weekStart.date < minDate ? minDate : weekStart.date;\n const max = maxDate && weekEnd.date > maxDate ? maxDate : weekEnd.date;\n set('calendarWeek', min, max);\n }}\n onPointerOver={() =>\n !weekDisabled && setHovered({ min: weekStart.date, max: weekEnd.date })\n }\n onPointerOut={() => !weekDisabled && setHovered(undefined)}\n >\n {getCalendarWeek(weekEnd.date)}\n </button>\n ) : (\n <div />\n )}\n\n {week.map((dateObject, dayIndex) => {\n if (!dateObject) {\n return <div key={dayIndex} />;\n }\n\n const { prevMonth, nextMonth, date } = dateObject;\n const today = startOfDay(date).getTime() === now.getTime();\n const disabled = (minDate && date < minDate) || (maxDate && date > maxDate);\n\n const selected =\n date.getTime() === min?.getTime() ||\n (min && max && dateIntersect(date, { min, max }));\n const preSelected =\n !selected &&\n !disabled &&\n (dateIntersect(date, hovered) ||\n (min &&\n !max &&\n hovered &&\n dateIntersect(\n date,\n min <= hovered.min\n ? { min, max: hovered.min }\n : { min: hovered.max, max: min },\n )));\n const blocked = blockedRanges.some((range) => dateIntersect(date, range));\n\n return (\n <button\n type=\"button\"\n key={`${index}-${dayIndex}`}\n css={getDayCssStyles({\n disabled,\n prevMonth,\n nextMonth,\n today,\n blocked,\n selected,\n preSelected,\n })}\n {...getDateProps({ dateObj: dateObject })}\n onClick={() => {\n if (dirty) {\n if (min) set('calendar', min, date);\n else set('calendar', date, max);\n } else {\n set('calendar', date);\n }\n }}\n onPointerOver={() => setHovered({ min: date, max: date })}\n onPointerOut={() => setHovered(undefined)}\n disabled={disabled}\n >\n {date.getDate()}\n </button>\n );\n })}\n </Fragment>\n );\n })}\n </div>\n </div>\n ))}\n\n <div\n css={{\n marginTop: 'var(--spacing)',\n display: 'grid',\n gridAutoFlow: 'column',\n justifyContent: 'center',\n }}\n >\n {resolvedQuickOptions}\n </div>\n </div>\n );\n}\n","import { useFilter } from '../hooks/useFilter';\nimport type { CommonFilterProps } from '../types';\nimport type { DatePickerProps, DateRange } from './datePicker';\nimport { dateIntersect, DatePicker } from './datePicker';\n\nfunction convertDate(x: unknown): Date | null {\n if (x instanceof Date) return x;\n if (typeof x === 'number' || typeof x === 'string') return new Date(x);\n return null;\n}\n\nfunction convertDateOrRange(x: unknown): Date | DateRange | null {\n if (x instanceof Object && 'min' in x && 'max' in x) {\n const range = {\n min: convertDate((x as any).min),\n max: convertDate((x as any).max),\n };\n return range.min && range.max ? (range as DateRange) : null;\n }\n return convertDate(x);\n}\n\nfunction convertDateOrArray(x: unknown): Date | DateRange | (Date | DateRange)[] | null {\n if (Array.isArray(x)) return x.map(convertDateOrRange).filter(Boolean) as (Date | DateRange)[];\n return convertDateOrRange(x);\n}\n\nexport function DateFilter<TItem, TColumnValue>({\n locale,\n firstDayOfWeek,\n defaultDateInView,\n quickOptions,\n singleSelect,\n filterBy = convertDateOrArray,\n minDate,\n maxDate,\n showCalendarWeek,\n showTime,\n ...props\n}: {\n /** If enabled, only single days can be selected. Ranges otherwise. */\n singleSelect?: boolean;\n} & Pick<\n DatePickerProps,\n | 'locale'\n | 'firstDayOfWeek'\n | 'defaultDateInView'\n | 'quickOptions'\n | 'minDate'\n | 'maxDate'\n | 'showCalendarWeek'\n | 'showTime'\n> &\n CommonFilterProps<\n TItem,\n TColumnValue,\n Date | DateRange | null,\n Date | DateRange | null\n >): JSX.Element {\n const {\n value = null,\n onChange,\n close,\n } = useFilter({\n ...props,\n filterBy,\n\n id: 'dateFilter',\n\n isActive(filterValue) {\n return !!filterValue;\n },\n\n test(filterValue, value) {\n return dateIntersect(filterValue, value);\n },\n });\n\n return (\n <div\n css={{\n padding: 'calc(var(--spacing) * 2)',\n display: 'grid',\n }}\n >\n <DatePicker\n rangeSelect={!singleSelect}\n value={value}\n onChange={(value, source) => {\n onChange(value);\n if (source !== 'input') {\n close();\n }\n }}\n locale={locale}\n firstDayOfWeek={firstDayOfWeek}\n defaultDateInView={defaultDateInView}\n quickOptions={quickOptions}\n minDate={minDate}\n maxDate={maxDate}\n showCalendarWeek={showCalendarWeek}\n showTime={showTime}\n />\n </div>\n );\n}\n","import type { Id, TableItem } from '../types';\n\nexport const flatMap = <T, S>(array: Iterable<T>, flatMap: (t: T) => S[]): S[] => {\n return [...array].flatMap(flatMap);\n};\n\nexport const orderBy = <T>(\n array: T[],\n selectors: ((t: T) => any)[] = [],\n direction: ('desc' | 'asc')[] = [],\n locale?: (string | undefined)[],\n options?: (Intl.CollatorOptions | undefined)[],\n): T[] => {\n if (selectors.length === 0) selectors = [(t) => t];\n\n return [...array].sort((a, b) => {\n for (let i = 0; i < selectors.length; i++) {\n const _a = selectors[i]?.(a);\n const _b = selectors[i]?.(b);\n const _direction = direction[i] === 'desc' ? -1 : 1;\n const _locale = locale?.[i];\n const _options = options?.[i];\n\n if (typeof _a === 'string' && typeof _b === 'string') {\n return _a.localeCompare(_b, _locale, _options) * _direction;\n }\n\n if (_a > _b) return _direction;\n if (_a < _b) return -_direction;\n }\n return 0;\n });\n};\n\nexport const uniq = <T>(array: T[]): T[] => {\n const set = new Set<T>();\n for (const t of array) set.add(t);\n return Array.from(set);\n};\n\nexport const intersect = <T>(a: Iterable<T>, b: { has(t: T): boolean }): Set<T> => {\n const result = new Set<T>();\n for (const x of a) if (b.has(x)) result.add(x);\n return result;\n};\n\nexport const getAncestors = <T>(\n activeItemsById: Map<Id, TableItem<T>>,\n ...items: TableItem<T>[]\n): Set<Id> => {\n const result = new Set<Id>();\n\n const find = ({ parentId }: TableItem<T>): void => {\n const parent =\n parentId !== undefined && parentId !== null ? activeItemsById.get(parentId) : undefined;\n if (parent && !result.has(parent.id)) {\n result.add(parent.id);\n find(parent);\n }\n };\n items.forEach(find);\n return result;\n};\n\nexport const getDescendants = <T>(...items: TableItem<T>[]): Set<Id> => {\n const result = new Set<Id>();\n\n const find = (item: TableItem<T>): void => {\n for (const child of item.children) {\n if (!result.has(child.id)) {\n result.add(child.id);\n find(child);\n }\n }\n };\n items.forEach(find);\n return result;\n};\n\nexport const identity = (x: unknown): any => x;\n\nexport const asString = (x: unknown): string => {\n if (Array.isArray(x)) return x.map(asString).join(', ');\n if (x instanceof Object) return JSON.stringify(x);\n return String(x ?? '');\n};\n\nexport const asStringOrArray = (x: unknown): string | string[] => {\n if (Array.isArray(x)) return x.map(asString);\n return asString(x);\n};\n\nexport const asNumber = (x: unknown): number | null => {\n const n = Number(x);\n return Number.isNaN(n) ? null : n;\n};\n\nexport const asNumberOrArray = (x: unknown): number | null | (number | null)[] => {\n if (Array.isArray(x)) return x.map(asNumber);\n return asNumber(x);\n};\n\nexport const defaultEquals = (a: unknown, b: unknown): boolean => a === b;\n\nexport const subStringMatch = (a: string, b: string): boolean =>\n a.toLowerCase().includes(b.toLowerCase());\n\nexport const castArray = <T>(a: T | T[]) => (Array.isArray(a) ? a : [a]);\n\nexport const cx = (\n ...classNames: (string | false | undefined | null | Record<string, boolean>)[]\n) =>\n classNames\n .flatMap((entry) => {\n if (!entry) return [];\n if (typeof entry === 'string') return [entry];\n return Object.entries(entry)\n .filter(([, predicate]) => predicate)\n .map(([className]) => className);\n })\n .join(' ');\n\ntype Falsy = false | 0 | '' | null | undefined;\nexport function isTruthy<T>(x: T): x is Exclude<T, Falsy> {\n return !!x;\n}\n","import { useState } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport type { TableTheme } from '../types';\n\ntype TextFieldProps = TableTheme['components']['TextField'] extends React.ComponentType<infer T>\n ? T\n : never;\n\nexport interface NumberFieldProps extends Omit<TextFieldProps, 'value' | 'onChange'> {\n value?: number | null;\n onChange?: (value: number | null) => void;\n}\n\nconst Pattern = /^-?\\d*(?:[.,]\\d*)?$/;\n\nconst printNumber = (value: number | null, locale?: string) => {\n if (value === null) {\n return '';\n }\n\n return value.toLocaleString(locale);\n};\n\nconst parseNumber = (value: string) => {\n if (value === '') {\n return null;\n }\n\n const asNumber = Number(value.replace(',', '.'));\n return Number.isNaN(asNumber) ? null : asNumber;\n};\n\nexport function NumberField({\n value: commitedValue = null,\n onChange,\n ...textFieldProps\n}: NumberFieldProps) {\n const locale = useTheme((t) => t.locale);\n const TextField = useTheme((t) => t.components.TextField);\n const [value = printNumber(commitedValue, locale), setValue] = useState<string>();\n\n return (\n <TextField\n value={value}\n onChange={(event) => {\n if (Pattern.test(event.target.value)) {\n setValue(event.target.value);\n }\n }}\n onBlur={() => {\n onChange?.(parseNumber(value));\n setValue(undefined);\n }}\n {...textFieldProps}\n css={{\n input: {\n backgroundColor: 'inherit',\n color: 'inherit',\n },\n }}\n />\n );\n}\n","import { useFilter } from '../hooks/useFilter';\nimport { useTheme } from '../hooks/useTheme';\nimport { asNumberOrArray, castArray } from '../misc/helpers';\nimport { useColumnContext, useTableContext } from '../misc/tableContext';\nimport type { CommonFilterProps } from '../types';\nimport { NumberField } from './numberField';\n\nexport interface RangeFilterProps<T, V>\n extends CommonFilterProps<T, V, number | null, [number | null, number | null] | null> {\n min?: number;\n max?: number;\n}\n\nexport function RangeFilter<TItem, TColumnValue>({\n min,\n max,\n filterBy = asNumberOrArray,\n ...props\n}: RangeFilterProps<TItem, TColumnValue>): JSX.Element {\n const rangeMinText = useTheme((t) => t.text.rangeMin);\n const rangeMaxText = useTheme((t) => t.text.rangeMax);\n\n const table = useTableContext<TItem>();\n const columnId = useColumnContext();\n const filterByFunction = filterBy instanceof Function ? filterBy : filterBy[0];\n\n const [minValue, maxValue] = table.useState((state) => {\n if (typeof min === 'number' && typeof max === 'number') {\n return [min, max];\n }\n\n const column = state.activeColumns.find((c) => c.id === columnId);\n\n if (!column) {\n return [0, 100];\n }\n\n let minValue;\n let maxValue;\n\n for (const item of state.items) {\n const columnValue = column.value(item.value) as TColumnValue;\n const numberValues = castArray(filterByFunction(columnValue, item.value)).filter(\n (value): value is number => value !== null,\n );\n\n for (const value of numberValues) {\n minValue = Math.min(minValue ?? value, value);\n maxValue = Math.max(maxValue ?? value, value);\n }\n }\n\n return [min ?? minValue, max ?? maxValue];\n });\n\n const { value, onChange } = useFilter({\n ...props,\n filterBy,\n\n id: 'rangeFilter',\n\n isActive(filterValue) {\n return !!filterValue;\n },\n\n test(filterValue, value) {\n if (!filterValue || (filterValue[0] === null && filterValue[1] === null)) {\n return true;\n }\n\n const min = filterValue[0] ?? Number.NEGATIVE_INFINITY;\n const max = filterValue[1] ?? Number.POSITIVE_INFINITY;\n return value !== null && value >= min && value <= max;\n },\n });\n\n return (\n <div\n css={{\n padding: `calc(var(--spacing) * 2)`,\n display: 'grid',\n gap: '1em',\n }}\n >\n <div\n css={{\n display: 'flex',\n gap: '1em',\n alignItems: 'center',\n\n '& > *': {\n width: '10em',\n },\n }}\n >\n <NumberField\n value={value?.[0]}\n onChange={(newMin) => onChange(normalize(newMin, value?.[1], 'min', { min, max }))}\n startIcon={<span css={{ margin: '0 calc(var(--spacing) * 2)' }}>{rangeMinText}</span>}\n placeholder={String(minValue ?? '')}\n css={{\n alignItems: 'baseline',\n }}\n />\n -\n <NumberField\n value={value?.[1]}\n onChange={(newMax) => onChange(normalize(value?.[0], newMax, 'max', { min, max }))}\n startIcon={<span css={{ margin: '0 calc(var(--spacing) * 2)' }}>{rangeMaxText}</span>}\n placeholder={String(maxValue ?? '')}\n css={{\n alignItems: 'baseline',\n }}\n />\n </div>\n </div>\n );\n}\n\nfunction normalize(\n min: number | null | undefined,\n max: number | null | undefined,\n changed: 'min' | 'max',\n limits: { min?: number; max?: number },\n): [number | null, number | null] | null {\n min ??= null;\n max ??= null;\n\n if (min !== null && max !== null && min > max) {\n if (changed === 'min') {\n max = min;\n } else {\n min = max;\n }\n }\n\n return min !== null || max !== null\n ? [clamp(min, limits.min, limits.max), clamp(max, limits.min, limits.max)]\n : null;\n}\n\nfunction clamp(\n value: number | null,\n min = Number.NEGATIVE_INFINITY,\n max = Number.POSITIVE_INFINITY,\n): number | null {\n return value === null ? null : Math.min(Math.max(value, min), max);\n}\n","import type { ReactNode } from 'react';\n\nexport function FormControlLabel({\n control,\n label,\n disabled,\n}: {\n control: ReactNode;\n label: ReactNode;\n disabled?: boolean;\n}) {\n return (\n <label\n css={[\n {\n display: 'flex',\n alignItems: 'center',\n cursor: 'pointer',\n userSelect: 'none',\n\n '& > *': {\n cursor: 'pointer',\n },\n },\n disabled && { color: 'rgba(0, 0, 0, 0.26)' },\n ]}\n >\n {control}\n <span css={{ marginLeft: 'var(--spacing)' }}>{label}</span>\n </label>\n );\n}\n","import type { HTMLProps, ReactNode } from 'react';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { throttle } from '../misc/throttle';\n\nexport interface VirtualListProps<T> extends Omit<HTMLProps<HTMLDivElement>, 'children'> {\n virtual?:\n | boolean\n | {\n rowHeight?: number;\n initalRowHeight?: number;\n throttleScroll?: number;\n overscan?: number;\n overscanBottom?: number;\n overscanTop?: number;\n };\n items: T[];\n children: (item: T, index: number) => ReactNode;\n}\n\nexport function VirtualList<T>({\n virtual = true,\n items,\n children,\n ...props\n}: VirtualListProps<T>): JSX.Element {\n const container = useRef<HTMLDivElement>(null);\n const [, setId] = useState({});\n\n const throttleScroll = (typeof virtual === 'boolean' ? undefined : virtual)?.throttleScroll ?? 16;\n const update = useMemo(() => throttle(() => setId({}), throttleScroll), [throttleScroll]);\n\n useEffect(() => {\n if (!virtual) return;\n\n const ro = new ResizeObserver(update);\n\n if (container.current) {\n ro.observe(container.current);\n }\n\n window.addEventListener('resize', update, true);\n return () => {\n ro.disconnect();\n window.removeEventListener('resize', update, true);\n update.cancel();\n };\n }, [update, virtual, throttleScroll]);\n\n if (!virtual) {\n return (\n <div\n {...props}\n css={{\n overflowY: 'auto',\n display: 'grid',\n }}\n >\n {items.map((item, index) => children(item, index))}\n </div>\n );\n }\n\n const {\n rowHeight,\n initalRowHeight = 38,\n overscan = 100,\n overscanTop,\n overscanBottom,\n } = (virtual instanceof Object ? virtual : undefined) ?? {};\n\n const itemHeight = rowHeight ?? (averageItemHeight(container.current) || initalRowHeight);\n const from = container.current?.clientHeight\n ? Math.max(\n 0,\n Math.floor((container.current.scrollTop - (overscanTop ?? overscan)) / itemHeight),\n )\n : 0;\n const to = container.current?.clientHeight\n ? Math.min(\n items.length,\n Math.ceil(\n (container.current.scrollTop +\n container.current.clientHeight +\n (overscanBottom ?? overscan)) /\n itemHeight,\n ),\n )\n : 1;\n const before = from * itemHeight;\n const after = (items.length - to) * itemHeight;\n\n return (\n <div\n {...props}\n onScroll={(event) => {\n update();\n props.onScroll?.(event);\n }}\n ref={container}\n css={{\n overflowY: 'auto',\n display: 'grid',\n }}\n >\n <div data-virtual-before style={{ height: before }} />\n {items.slice(from, to).map((item, index) => children(item, index + from))}\n <div data-virtual-after style={{ height: after }} />\n </div>\n );\n}\n\nfunction averageItemHeight(container: HTMLDivElement | null) {\n if (!container?.children.length) {\n return undefined;\n }\n\n const heights = Array.from(container.children)\n .slice(1, -1)\n .map((child) => child.clientHeight);\n return heights.reduce((a, b) => a + b, 0) / heights.length;\n}\n","import type { ReactNode } from 'react';\nimport { useEffect, useMemo, useState } from 'react';\nimport { useFilter } from '../hooks/useFilter';\nimport { useTheme } from '../hooks/useTheme';\nimport { asString, castArray, flatMap, orderBy, uniq } from '../misc/helpers';\nimport { useColumnContext, useTableContext } from '../misc/tableContext';\nimport type { CommonFilterProps, InternalColumn } from '../types';\nimport { AutoFocusTextField } from './autoFocusTextField';\nimport { FormControlLabel } from './formControlLabel';\nimport type { VirtualListProps } from './virtualList';\nimport { VirtualList } from './virtualList';\n\nfunction toggle<T>(set: Set<T>, value: T, singleSelect?: boolean) {\n const newSet = new Set(singleSelect ? [] : set);\n if (set.has(value)) {\n newSet.delete(value);\n } else {\n newSet.add(value);\n }\n\n return newSet;\n}\n\nexport function SelectFilter<TItem, TColumnValue, TFilterBy>({\n options: providedOptions,\n stringValue = asString,\n render = stringValue,\n singleSelect,\n hideSearchField,\n hideResetButton,\n ...props\n}: {\n /** Which options are provided to select. By default all unique item values are used. */\n options?: TFilterBy[];\n /** String representation of a value. Used to filter options via the text field. */\n stringValue?: (value: TFilterBy) => string;\n /** Render values. By default a string representation of the value is used. */\n render?: (value: TFilterBy) => ReactNode;\n /** If enabled, only one option can be selected at a time. */\n singleSelect?: boolean;\n /** If enabled, the search field is hidden. */\n hideSearchField?: boolean;\n /** If enabled, the reset button is hidden. */\n hideResetButton?: boolean;\n /** Virtual list props.\n * @default true */\n virtual?: VirtualListProps<unknown>['virtual'];\n} & CommonFilterProps<TItem, TColumnValue, TFilterBy, Set<TFilterBy>>): JSX.Element {\n const IconButton = useTheme((t) => t.components.IconButton);\n const Checkbox = useTheme((t) => t.components.Checkbox);\n const Search = useTheme((t) => t.icons.Search);\n const Clear = useTheme((t) => t.icons.Clear);\n const deselectAll = useTheme((t) => t.text.deselectAll);\n const noResults = useTheme((t) => t.text.noResults);\n\n const table = useTableContext<TItem>();\n const columnId = useColumnContext();\n\n const {\n value = new Set<TFilterBy>(),\n onChange,\n filterBy,\n isActive,\n } = useFilter({\n ...props,\n\n id: 'selectFilter',\n\n isActive(filterValue) {\n return filterValue.size > 0;\n },\n\n test(filterValue, value) {\n return filterValue.has(value);\n },\n });\n\n const options = table.useState((state) => {\n if (providedOptions) return uniq(providedOptions);\n\n const column = state.activeColumns.find((column) => column.id === columnId) as\n | InternalColumn<TItem, TColumnValue>\n | undefined;\n if (!column) return [];\n\n return orderBy(\n uniq(\n flatMap(state.items, (item) => castArray(filterBy(column.value(item.value), item.value))),\n ),\n );\n });\n\n const [query, setQuery] = useState('');\n const filtered = options.filter(\n (option) => !query || stringValue(option).toLowerCase().includes(query.toLowerCase()),\n );\n const delayedValue = useMemo(() => value, [isActive]);\n const ordered = filtered\n .filter((option) => delayedValue.has(option))\n .concat(filtered.filter((option) => !delayedValue.has(option)));\n\n const Button = useTheme((t) => t.components.Button);\n\n useEffect(() => {\n setQuery('');\n }, [isActive]);\n\n return (\n <div\n css={{\n padding: 'calc(var(--spacing) * 2)',\n display: 'grid',\n gridTemplateColumns: 'minmax(0, 1fr)',\n gap: 'var(--spacing)',\n }}\n >\n {!hideSearchField && (\n <AutoFocusTextField\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n endIcon={\n <IconButton onClick={() => setQuery('')}>{!query ? <Search /> : <Clear />}</IconButton>\n }\n css={{ marginBottom: 'var(--spacing)' }}\n />\n )}\n\n {!hideResetButton && (\n <Button\n disabled={value.size === 0}\n onClick={() => onChange(new Set())}\n variant=\"outlined\"\n css={{\n justifyContent: 'center',\n width: '100%',\n marginBottom: 'var(--spacing)',\n color: 'inherit',\n }}\n >\n {deselectAll}\n </Button>\n )}\n\n <VirtualList\n items={ordered}\n css={{\n width: '20em',\n maxWidth: '100%',\n maxHeight: 'min(20em, 50vh)',\n overflow: 'hidden auto',\n display: 'grid',\n gridTemplateColumns: 'minmax(0, 1fr)',\n }}\n >\n {(option, index) => (\n <FormControlLabel\n key={index}\n control={\n <Checkbox\n checked={value.has(option)}\n onChange={() => onChange(toggle(value, option, singleSelect))}\n />\n }\n label={render(option)}\n />\n )}\n </VirtualList>\n\n {ordered.length === 0 && <span css={{ textAlign: 'center' }}>{noResults}</span>}\n </div>\n );\n}\n","import { useImperativeHandle, type ForwardedRef } from 'react';\nimport { Store } from 'schummar-state/react';\nimport type { InternalTableState, TableRef } from '../types';\n\nexport default function useTableRef<T>(\n table: Store<InternalTableState<T>>,\n ref: ForwardedRef<TableRef>,\n) {\n useImperativeHandle(\n ref,\n () => ({\n getSort() {\n return table.getState().sort;\n },\n\n setSort(sort) {\n table.update((state) => {\n state.sort = sort;\n });\n },\n\n getSelection() {\n return table.getState().selection;\n },\n\n setSelection(selection) {\n table.update((state) => {\n state.selection = selection;\n });\n },\n\n getExpanded() {\n return table.getState().expanded;\n },\n\n setExpanded(expanded) {\n table.update((state) => {\n state.expanded = expanded;\n });\n },\n\n getHiddenColumns() {\n return table.getState().hiddenColumns;\n },\n\n setHiddenColumns(hidden) {\n table.update((state) => {\n state.hiddenColumns = hidden;\n });\n },\n }),\n [table],\n );\n}\n","export class Queue {\n private q = new Array<{\n job: () => Promise<any>;\n resolve: (value: any) => void;\n reject: (reason?: any) => void;\n }>();\n\n private isRunning = false;\n\n run<T>(job: () => Promise<T>, replace?: boolean) {\n return new Promise<T>((resolve, reject) => {\n if (replace) {\n this.q = [];\n }\n this.q.push({ job, resolve, reject });\n\n if (!this.isRunning) this.start();\n });\n }\n\n clear() {\n this.q = [];\n }\n\n private async start() {\n this.isRunning = true;\n\n let next;\n while ((next = this.q.shift())) {\n try {\n const result = await next.job();\n next.resolve(result);\n } catch (error) {\n next.reject(error);\n }\n }\n\n this.isRunning = false;\n }\n}\n","import type { Draft } from 'immer';\nimport { useEffect, useState } from 'react';\nimport type { Store } from 'schummar-state/react';\nimport { Queue } from '../misc/queue';\nimport type { InternalTableState } from '../types';\n\nconst KEYS = [\n 'sort',\n 'selection',\n 'expanded',\n 'hiddenColumns',\n 'filterValues',\n 'columnWidths',\n 'columnOrder',\n] as const;\n\nconst storageName = (id: string) => `schummar-table_state-v1_${id}`;\n\nexport type TableStateStorage = {\n getItem: (key: string) => string | null | Promise<string | null>;\n setItem: (key: string, value: string) => unknown | Promise<unknown>;\n removeItem: (key: string) => unknown | Promise<unknown>;\n} & (\n | {\n keys: () => string[] | Promise<string[]>;\n }\n | {\n length: number | (() => number | Promise<number>);\n key: (keyIndex: number) => string | null | Promise<string | null>;\n }\n);\n\nfunction stringify(value: unknown) {\n function prepare(value: unknown): any {\n if (value instanceof Date) {\n return { __date: value.toJSON() };\n }\n\n if (value instanceof Set) {\n return { __set: Array.from(value).map(prepare) };\n }\n\n if (value instanceof Map) {\n return { __map: Array.from(value.entries()).map((entry) => entry.map(prepare)) };\n }\n\n if (Array.isArray(value)) {\n return value.map(prepare);\n }\n\n if (value instanceof Object) {\n return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, prepare(v)]));\n }\n\n return value;\n }\n\n return JSON.stringify(prepare(value));\n}\n\nfunction parse(value: string) {\n return JSON.parse(value, (_key, value) => {\n if (value instanceof Object && '__date' in value) {\n return new Date(value.__date);\n }\n\n if (value instanceof Object && '__set' in value) {\n return new Set(value.__set);\n }\n\n if (value instanceof Object && '__map' in value) {\n return new Map(value.__map);\n }\n\n return value;\n });\n}\n\nexport function useTableStateStorage(table: Store<InternalTableState<any>>) {\n const [isHydrated, setIsHydrated] = useState(false);\n const [q] = useState(() => new Queue());\n\n // On mount: load\n useEffect(() => {\n const { persist } = table.getState().props;\n if (!persist) {\n setIsHydrated(true);\n return;\n }\n\n let isCanceled = false;\n\n (async () => {\n try {\n const { storage, id, include, exclude } = persist;\n const json = await storage.getItem(storageName(id));\n if (isCanceled || !json) return;\n\n const data = parse(json);\n table.getState().props.debug?.('load', json, data);\n\n // eslint-disable-next-line no-inner-declarations\n function applyUpdate(state: Draft<InternalTableState<any>>, key: (typeof KEYS)[number]) {\n if (\n //\n (!include || include.includes(key)) &&\n !exclude?.includes(key) &&\n key in data\n ) {\n if (key === 'filterValues') {\n for (const [id, value] of data[key]) {\n const filter = state.filters.get(id);\n\n if (filter && (filter.persist ?? filter.value === undefined)) {\n state.filterValues.set(id, value);\n state.filters.get(id)?.onChange?.(value);\n }\n }\n } else {\n if (\n key === 'expanded' ||\n key === 'hiddenColumns' ||\n key === 'selection' ||\n key === 'sort'\n ) {\n if (state.props[key] !== undefined) {\n return;\n }\n\n state.props[\n `on${\n (key.slice(0, 1).toUpperCase() + key.slice(1)) as Capitalize<typeof key>\n }Change`\n ]?.(data[key]);\n }\n\n state[key] = data[key];\n }\n }\n }\n\n table.update((state) => {\n for (const key of KEYS.filter((key) => key !== 'filterValues')) {\n applyUpdate(state, key);\n }\n });\n\n // First apply other keys and wait until changes take effect. Filters cannot be applied to hidden columns.\n await new Promise((resolve) => {\n setTimeout(resolve);\n });\n table.update((state) => applyUpdate(state, 'filterValues'));\n } catch (error) {\n console.error('Failed to load table state:', error);\n } finally {\n setIsHydrated(true);\n }\n })();\n\n return () => {\n isCanceled = true;\n };\n }, [table]);\n\n // After isHydrated, watch and save state\n useEffect(() => {\n if (!isHydrated) return;\n\n return table.subscribe(\n (state) => {\n if (!state.props.persist) return;\n\n const { storage, id, include, exclude } = state.props.persist;\n const data: any = {};\n\n for (const key of KEYS) {\n if (\n //\n (!include || include.includes(key)) &&\n !exclude?.includes(key)\n ) {\n if (key === 'filterValues') {\n data[key] = new Map();\n for (const [id, value] of state.filterValues) {\n if (state.filters.get(id)?.persist ?? state.filters.get(id)?.value === undefined) {\n data.filterValues.set(id, value);\n }\n }\n } else {\n if (\n (key === 'expanded' ||\n key === 'hiddenColumns' ||\n key === 'selection' ||\n key === 'sort') &&\n state.props[key] !== undefined\n ) {\n continue;\n }\n\n data[key] = state[key];\n }\n }\n }\n\n return { storage, id, data };\n },\n (props) => {\n if (!props) return;\n const { storage, id, data } = props;\n\n table.getState().props.debug?.('save', data, stringify(data));\n q.run(async () => {\n await storage.setItem(storageName(id), stringify(data));\n }, true);\n },\n { throttle: 1000 },\n );\n }, [table, isHydrated]);\n\n async function clear() {\n await q.run(async () => {\n const persist = table.getState().props.persist;\n if (!persist) {\n return;\n }\n\n const { storage, id } = persist;\n await storage.removeItem(storageName(id));\n\n setIsHydrated(false);\n q.clear();\n });\n }\n\n return [isHydrated, clear] as const;\n}\n","import { castDraft } from 'immer';\nimport { useEffect } from 'react';\nimport type { Store } from 'schummar-state/react';\nimport { castArray, flatMap, orderBy } from '../misc/helpers';\nimport type { Id, InternalTableState, TableItem } from '../types';\n\nexport function calcItems<T>(state: Store<InternalTableState<T>>): void {\n useEffect(\n () =>\n state.addReaction(\n (state) =>\n [\n state.props.items,\n state.props.id,\n state.props.parentId,\n state.props.revealFiltered,\n state.props.externalSort,\n state.props.locale,\n state.sort,\n state.filters,\n state.filterValues,\n state.activeColumns,\n state.expanded,\n ] as const,\n (\n [\n items = [],\n id,\n parentId,\n revealFiltered,\n externalSort,\n locale,\n sort,\n filters,\n filterValues,\n activeColumns,\n ],\n draft,\n ) => {\n const tableItems = items.map<TableItem<T>>((item) => ({\n id: id(item),\n parentId: parentId?.(item),\n children: [],\n value: item,\n }));\n\n let sorted;\n if (sort.length === 0 || externalSort) {\n sorted = tableItems;\n } else {\n const selectors = flatMap(sort, (sort) => {\n const column = activeColumns.find((column) => column.id === sort.columnId);\n if (!column) return [];\n return column.sortBy.map((sortBy) => ({\n selector: (item: T) => sortBy(column.value(item), item),\n direction: sort.direction,\n locale: sort.locale ?? locale,\n options: sort.options,\n }));\n }).filter(Boolean);\n\n sorted = orderBy(\n tableItems,\n selectors.map((x) => (item) => x.selector(item.value)),\n selectors.map((x) => x.direction),\n selectors.map((x) => x.locale),\n selectors.map((x) => x.options),\n );\n }\n\n const lookup = new Map<Id, TableItem<T>>();\n for (const item of sorted) {\n lookup.set(item.id, item);\n }\n\n for (const item of sorted) {\n const parent =\n item.parentId !== undefined && item.parentId !== null\n ? lookup.get(item.parentId)\n : undefined;\n parent?.children.push(item);\n }\n\n const allItems = new Array<TableItem<T>>();\n const allItemsById = new Map<Id, TableItem<T>>();\n\n const traverse = (items: TableItem<T>[]): void => {\n for (const item of items) {\n allItems.push(item);\n allItemsById.set(item.id, item);\n traverse(item.children);\n }\n };\n traverse(sorted.filter((item) => item.parentId === undefined || item.parentId === null));\n\n let expandedChanged = false;\n const activeItemsById = new Map<Id, TableItem<T>>();\n const activeSet = new Set<Id>();\n const activeItems = [...allItems]\n .reverse()\n .filter((item) => {\n let isActive = activeSet.has(item.id);\n\n isActive ||= activeColumns.every((column) => {\n const filter = filters.get(column.id);\n if (!filter || filter.external) return true;\n\n const filterValue = filterValues.get(column.id);\n if (filterValue === undefined || !filter.isActive(filterValue)) return true;\n\n const filterBy = filter.filterBy ?? ((x) => x);\n const value = filterBy(column.value(item.value), item.value);\n return castArray(value).some((value) => filter.test(filterValue, value));\n });\n\n if (isActive && item.parentId !== undefined && item.parentId !== null) {\n activeSet.add(item.parentId);\n\n if (\n revealFiltered &&\n Array.from(filters.entries()).some(([id, filter]) => {\n const filterValue = filterValues.get(id);\n return !!filter && filterValue !== undefined && filter.isActive(filterValue);\n })\n ) {\n expandedChanged ||= !draft.expanded.has(item.parentId);\n draft.expanded.add(item.parentId);\n } else if (!draft.expanded.has(item.parentId)) {\n isActive = false;\n }\n }\n\n if (isActive) {\n activeItemsById.set(item.id, item);\n }\n\n return isActive;\n })\n .reverse();\n\n draft.items = castDraft(allItems);\n draft.itemsById = castDraft(allItemsById);\n draft.activeItems = castDraft(activeItems);\n draft.activeItemsById = castDraft(activeItemsById);\n\n if (expandedChanged) {\n setTimeout(() => {\n state.getState().props.onExpandedChange?.(state.getState().expanded);\n });\n }\n },\n { runNow: true },\n ),\n [state],\n );\n}\n","export function defaultSerializer(x: unknown): string | number | Date {\n if (x instanceof Date || typeof x === 'number' || typeof x === 'string') {\n return x;\n }\n\n return JSON.stringify(x) ?? '';\n}\n","export function overrides<T extends object>(first: T, ...overrides: (Partial<T> | undefined)[]): T {\n return overrides.reduce<T>(\n (result, source) => {\n for (const [key, value] of Object.entries(source ?? {})) {\n if (value !== undefined) {\n result[key as keyof T] = value as any;\n }\n }\n\n return result;\n },\n { ...first },\n );\n}\n","import { useMemo } from 'react';\nimport { defaultSerializer } from '../exporters/serializer';\nimport { useTableMemo } from '../hooks/useTableMemo';\nimport { asString, castArray } from '../misc/helpers';\nimport { overrides } from '../misc/overrides';\nimport type { Column, Id, InternalColumn, InternalTableProps, TableProps } from '../types';\n\nconst defaultProps: InternalTableProps<any> = {\n id: () => '',\n columns: [],\n enableSelection: true,\n selectSyncChildren: true,\n stickyHeader: true,\n stickyFooter: true,\n enableColumnSelection: true,\n enableColumnResize: true,\n enableColumnReorder: true,\n displaySizeOverrides: {\n mobile: {\n enableSelection: false,\n enableColumnSelection: false,\n enableExport: false,\n enableColumnResize: false,\n enableColumnReorder: false,\n },\n },\n};\n\nexport function calcProps<T>(props: TableProps<T>): InternalTableProps<T> {\n const cache = useTableMemo();\n\n return useMemo(\n () => overrides(defaultProps, calc(props, cache)) as InternalTableProps<T>,\n [props],\n );\n}\n\nfunction calc<T>(\n props: Partial<TableProps<T>>,\n cache: ReturnType<typeof useTableMemo>,\n): Partial<InternalTableProps<T>> {\n let id;\n if (props.id instanceof Function || Array.isArray(props.id)) {\n id = cache('id', props.id);\n } else if (props.id !== undefined) {\n id = cache('id', [(item: T) => item[props.id as keyof T] as unknown as Id, props.id]);\n }\n\n let parentId;\n if (props.parentId instanceof Function || Array.isArray(props.parentId)) {\n parentId = cache('parentId', props.parentId);\n } else if (props.parentId !== undefined) {\n parentId = cache('parentId', [\n (item: T) => item[props.parentId as keyof T] as unknown as Id | undefined,\n props.parentId,\n ]);\n }\n\n const columnProps = props.columnProps && cache('columnProps', props.columnProps);\n\n let inputColumns;\n if (props.columns instanceof Function) {\n inputColumns = props.columns((value, column) => ({ ...column, value }));\n } else if (props.columns !== undefined) {\n inputColumns = props.columns.map((column) => column && { ...column, dependecies: undefined });\n }\n\n const globalDefaults = props.defaultColumnProps;\n const mapColumn = <V>(\n {\n id: _id,\n header,\n exportHeader,\n footer,\n value,\n renderCell,\n exportCell,\n sortBy,\n disableSort,\n hidden,\n classes,\n styles,\n filter,\n width,\n displaySize,\n }: Column<T, V>,\n index: number,\n ): InternalColumn<T, V> => {\n const id = _id ?? index;\n const cacheKey = typeof id === 'string' ? `s${id}` : `n${id}`;\n const defaults = { ...globalDefaults, ...columnProps?.(id) };\n\n return {\n id,\n header: header ?? defaults?.header ?? null,\n exportHeader: exportHeader ?? defaults?.exportHeader ?? id,\n footer: footer ?? defaults?.footer ?? null,\n value: cache(`columns.${cacheKey}.value`, value),\n renderCell: cache(\n `columns.${cacheKey}.renderCell`,\n renderCell ?? defaults?.renderCell ?? asString,\n ),\n exportCell: exportCell ?? defaults?.exportCell ?? defaultSerializer,\n sortBy: (\n sortBy ??\n defaults?.sortBy ?? [\n (v) =>\n typeof v === 'number' || v instanceof Date\n ? v\n : v === null || v === undefined\n ? ''\n : String(v),\n ]\n ).map((function_, i) => cache(`columns.${cacheKey}.sortBy.${i}`, function_)),\n disableSort: disableSort ?? defaults?.disableSort ?? false,\n hidden: hidden ?? defaults?.hidden,\n classes: classes ?? defaults?.classes,\n styles: styles ?? defaults?.styles,\n filter: filter ?? defaults?.filter,\n width: width ?? defaults?.width,\n displaySize:\n (displaySize ?? defaults.displaySize) !== undefined\n ? castArray((displaySize ?? defaults.displaySize)!)\n : undefined,\n };\n };\n\n const columns = inputColumns?.filter((x): x is Column<T, any> => !!x).map(mapColumn);\n\n const wrapRow = props.wrapRow && cache('wrapRow', props.wrapRow);\n const wrapCell = props.wrapCell && cache('wrapCell', props.wrapCell);\n\n const rowAction =\n props.rowAction instanceof Function || Array.isArray(props.rowAction)\n ? cache('rowAction', props.rowAction)\n : props.rowAction;\n\n const rowDetails =\n props.rowDetails instanceof Function || Array.isArray(props.rowDetails)\n ? cache('rowDetails', props.rowDetails)\n : props.rowDetails;\n\n const displaySizeOverrides =\n props.displaySizeOverrides &&\n Object.fromEntries(\n Object.entries(props.displaySizeOverrides ?? {}).map(([size, overrides]) => [\n size,\n overrides && calc(overrides, cache),\n ]),\n );\n\n return {\n ...props,\n id,\n parentId,\n columns,\n columnProps,\n wrapRow,\n wrapCell,\n rowAction,\n rowDetails,\n enableSelection: props.enableSelection,\n selectSyncChildren: props.selectSyncChildren,\n stickyHeader: props.stickyHeader,\n stickyFooter: props.stickyFooter,\n enableColumnSelection: props.enableColumnSelection,\n enableExport: props.enableExport,\n enableClearFiltersButton: props.enableClearFiltersButton,\n enableColumnResize: props.enableColumnResize,\n enableColumnReorder: props.enableColumnReorder,\n displaySizeOverrides,\n };\n}\n","import { useEffect } from 'react';\nimport type { Store } from 'schummar-state/react';\nimport { intersect } from '../misc/helpers';\nimport type { InternalTableState } from '../types';\n\nexport function cleanupState<T>(state: Store<InternalTableState<T>>): void {\n useEffect(\n () =>\n state.addReaction(\n (state) =>\n [\n state.props.columns,\n state.itemsById,\n state.activeItemsById,\n state.activeColumns,\n ] as const,\n ([columns, itemsById, activeItemsById, activeColumns], draft) => {\n const columnIds = new Set(columns.map((column) => column.id));\n const activeColumnIds = new Set(activeColumns.map((column) => column.id));\n\n // Remove sort entries for non active columns\n const newSort = draft.sort.filter((s) => activeColumnIds.has(s.columnId));\n if (newSort.length < draft.sort.length) {\n draft.sort = newSort;\n setTimeout(() => {\n state.getState().props.onSortChange?.(newSort);\n });\n }\n\n // Remove filters for non active columns\n for (const id of draft.filters.keys()) {\n if (!activeColumnIds.has(id)) draft.filters.delete(id);\n }\n\n // Remove filterValues for non active columns\n for (const id of draft.filterValues.keys()) {\n if (!activeColumnIds.has(id)) draft.filterValues.delete(id);\n }\n\n // Remove hiddenColumns for non existing columns\n for (const id of draft.hiddenColumns.keys()) {\n if (!columnIds.has(id)) draft.hiddenColumns.delete(id);\n }\n\n // Remove columnWidth for non existing columns\n for (const id of draft.columnWidths.keys()) {\n if (!columnIds.has(id)) draft.columnWidths.delete(id);\n }\n\n // Remove non existing columns from columnOrder\n for (const id of draft.columnOrder) {\n if (!columnIds.has(id)) draft.columnOrder = draft.columnOrder.filter((x) => x !== id);\n }\n\n if (draft.props.items) {\n // Remove selection for non active items\n const newSelection = intersect(draft.selection, activeItemsById);\n if (newSelection.size !== draft.selection.size) {\n draft.selection = newSelection;\n setTimeout(() => {\n state.getState().props.onSelectionChange?.(newSelection);\n });\n }\n\n // Remove expanded for non existing items\n const newExpanded = intersect(draft.expanded, itemsById);\n if (newExpanded.size < draft.expanded.size) {\n draft.expanded = newExpanded;\n setTimeout(() => {\n state.getState().props.onExpandedChange?.(newExpanded);\n });\n }\n }\n },\n { runNow: true },\n ),\n [state],\n );\n}\n","import type { Draft } from 'immer';\nimport { useEffect } from 'react';\nimport type { Store } from 'schummar-state/react';\nimport { orderBy } from '../misc/helpers';\nimport { InternalColumn, type InternalTableState } from '../types';\n\nexport function filterColumns<T>(state: Store<InternalTableState<T>>): void {\n useEffect(\n () =>\n state.addReaction(\n (state) =>\n [state.props.columns, state.hiddenColumns, state.columnOrder, state.displaySize] as const,\n ([columns, hiddenColumns, columnOrder, displaySize], draft) => {\n draft.activeColumns = orderBy(\n columns.filter((column) => !(column.hidden ?? hiddenColumns.has(column.id))),\n [(column) => columnOrder.indexOf(column.id)],\n ) as Draft<InternalColumn<T, unknown>[]>;\n\n draft.visibleColumns = draft.activeColumns.filter(\n (column) =>\n displaySize === undefined ||\n column.displaySize === undefined ||\n column.displaySize.includes(displaySize),\n );\n\n draft.rowHeights.clear();\n },\n { runNow: true },\n ),\n [state],\n );\n}\n","import { useEffect } from 'react';\nimport type { Store } from 'schummar-state/react';\nimport { getAncestors, orderBy } from '../misc/helpers';\nimport type { Id, InternalTableState } from '../types';\n\nexport function normalizeExpanded<T>(table: Store<InternalTableState<T>>): void {\n useEffect(\n () =>\n table.addReaction(\n (state) => [state.props.expandOnlyOne, state.expanded, state.itemsById] as const,\n ([expandOnlyOne, , itemsById], state) => {\n let expanded = state.expanded;\n let hasChanged = false;\n\n const allAncestors = [...expanded].map((id) => {\n const item = itemsById.get(id);\n return {\n id,\n ancestors: item ? getAncestors(itemsById, item) : new Set<Id>(),\n };\n });\n\n // If only one branch may be expanded, check if there are more and close if necessary\n if (expandOnlyOne) {\n const withMostAncestors = orderBy(allAncestors, [(x) => x.ancestors.size], ['desc'])[0];\n\n if (\n [...expanded].some(\n (id) => id !== withMostAncestors?.id && !withMostAncestors?.ancestors.has(id),\n )\n ) {\n expanded = withMostAncestors?.ancestors ?? new Set();\n state.expanded = expanded;\n\n state.props.onExpandedChange?.(expanded);\n return;\n }\n }\n\n for (const { ancestors } of allAncestors) {\n for (const ancestor of ancestors ?? []) {\n if (!expanded.has(ancestor)) {\n expanded.add(ancestor);\n hasChanged = true;\n }\n }\n }\n\n if (hasChanged) {\n state.props.onExpandedChange?.(new Set(expanded));\n }\n },\n { runNow: true },\n ),\n [table],\n );\n}\n","import { useEffect } from 'react';\nimport type { Store } from 'schummar-state/react';\nimport type { InternalTableState } from '../types';\n\nexport function syncSelections<T>(table: Store<InternalTableState<T>>): void {\n useEffect(\n () =>\n table.addReaction(\n (state) => [state.props.selectSyncChildren, state.selection, state.activeItems] as const,\n ([selectSyncChildren, selection, activeItems], state) => {\n if (!selectSyncChildren) return;\n\n const newSelection = new Set(selection);\n for (const item of activeItems) {\n if (\n item.parentId !== undefined &&\n item.parentId !== null &&\n newSelection.has(item.parentId)\n ) {\n newSelection.add(item.id);\n }\n }\n\n if (newSelection.size !== selection.size) {\n state.selection = newSelection;\n setTimeout(() => {\n table.getState().props.onSelectionChange?.(newSelection);\n });\n }\n },\n { runNow: true },\n ),\n [table],\n );\n}\n","import { castDraft } from 'immer';\nimport { useEffect } from 'react';\nimport type { Store } from 'schummar-state/react';\nimport { overrides } from '../misc/overrides';\nimport type { InternalTableState } from '../types';\n\nexport function watchDisplaySize<T>(state: Store<InternalTableState<T>>): void {\n useEffect(() => {\n function onResize() {\n state.update((draft) => {\n draft.displaySizePx = window.innerWidth;\n });\n }\n\n onResize();\n document.defaultView?.addEventListener('resize', onResize);\n return () => document.defaultView?.removeEventListener('resize', onResize);\n }, [state]);\n\n useEffect(\n () =>\n state.addReaction(\n (state) => ({\n displaySizePx: state.displaySizePx,\n displaySize: state.props.displaySize,\n }),\n ({ displaySizePx, displaySize }, draft) => {\n if (displaySizePx === undefined) {\n return;\n }\n\n if (typeof displaySize === 'object') {\n const entry = Object.entries(displaySize).find(\n ([, maxWidth]) => maxWidth !== undefined && maxWidth >= displaySizePx,\n );\n draft.displaySize = entry?.[0];\n } else {\n draft.displaySize = displaySize;\n }\n },\n ),\n [state],\n );\n\n useEffect(\n () =>\n state.addReaction(\n (state) => ({\n props: state.normalizedProps,\n displaySize: state.displaySize,\n }),\n ({ props, displaySize }, draft) => {\n draft.props = castDraft(\n overrides(props, displaySize ? props.displaySizeOverrides?.[displaySize] : undefined),\n );\n },\n ),\n [state],\n );\n}\n","import { castDraft } from 'immer';\nimport { useEffect, useMemo, useState } from 'react';\nimport { Store } from 'schummar-state/react';\nimport type { InternalTableState, TableProps } from '../types';\nimport { calcItems } from './calcItems';\nimport { calcProps } from './calcProps';\nimport { cleanupState } from './cleanupState';\nimport { filterColumns } from './filterColumns';\nimport { normalizeExpanded } from './normalizeExpanded';\nimport { syncSelections } from './syncSelections';\nimport { watchDisplaySize } from './watchDisplaySize';\n\nexport function useTableState<T>(\n _props: TableProps<T>,\n): [Store<InternalTableState<T>>, () => void] {\n const [key, setKey] = useState({});\n const props = calcProps(_props);\n\n function reset() {\n setKey({});\n\n if (props.sort === undefined) {\n props.onSortChange?.(props.defaultSort ?? []);\n }\n\n if (props.expanded === undefined) {\n props.onExpandedChange?.(props.defaultExpanded ?? new Set());\n }\n\n if (props.selection === undefined) {\n props.onSelectionChange?.(props.defaultSelection ?? new Set());\n }\n\n if (props.hiddenColumns === undefined) {\n props.onHiddenColumnsChange?.(props.defaultHiddenColumns ?? new Set());\n }\n\n props.onReset?.('table');\n }\n\n const state = useMemo(\n () =>\n new Store<InternalTableState<T>>({\n normalizedProps: props,\n props,\n\n key,\n sort: props.defaultSort ?? [],\n selection: props.defaultSelection ?? new Set(),\n expanded: props.defaultExpanded ?? new Set(),\n rowHeights: new Map(),\n filters: new Map(),\n filterValues: new Map(),\n hiddenColumns: props.defaultHiddenColumns ?? new Set(),\n columnWidths: new Map(),\n columnOrder: props.columns.map((column) => column.id),\n columnStyleOverride: new Map(),\n\n activeColumns: [],\n visibleColumns: [],\n items: [],\n itemsById: new Map(),\n activeItems: [],\n activeItemsById: new Map(),\n lastSelectedId: undefined,\n displaySizePx: undefined,\n displaySize: undefined,\n }),\n [key],\n );\n\n filterColumns(state);\n calcItems(state);\n normalizeExpanded(state);\n syncSelections(state);\n cleanupState(state);\n watchDisplaySize(state);\n\n useEffect(() => {\n state.update((state) => {\n state.normalizedProps = castDraft(props);\n\n if (props.sort) state.sort = props.sort;\n if (props.selection) state.selection = props.selection;\n if (props.expanded) state.expanded = props.expanded;\n if (props.hiddenColumns) state.hiddenColumns = props.hiddenColumns;\n for (const column of props.columns) {\n if (!state.columnOrder.includes(column.id)) {\n const index = props.columns.indexOf(column);\n state.columnOrder.splice(index, 0, column.id);\n }\n }\n });\n }, [state, props]);\n\n return [state, reset];\n}\n","import { useTheme } from '../hooks/useTheme';\nimport { useTableContext } from '../misc/tableContext';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\n\nexport default function ClearFiltersButton<T>() {\n const Button = useTheme((t) => t.components.Button);\n const textClearFilters = useTheme((t) => t.text.clearFilters);\n const table = useTableContext<T>();\n\n return (\n <div css={defaultClasses.clearFiltersButton}>\n <Button\n variant=\"outlined\"\n onClick={() => {\n table.update((state) => {\n state.activeColumns.forEach((column) => {\n state.filterValues.delete(column.id);\n });\n table.getState().props.onReset?.('filters');\n });\n }}\n >\n {textClearFilters}\n </Button>\n </div>\n );\n}\n","import { useTheme } from '../hooks/useTheme';\nimport { cx } from '../misc/helpers';\nimport { useColumnContext, useTableContext } from '../misc/tableContext';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\n\nexport function ColumnFooter() {\n const table = useTableContext();\n const columnId = useColumnContext();\n const stickyFooter = table.useState((state) => state.props.stickyFooter);\n const columnStyleOverride = table.useState((state) => state.columnStyleOverride.get(columnId), {\n throttle: 16,\n });\n const columnClasses = table.useState(\n (state) => state.activeColumns.find((column) => column.id === columnId)?.classes?.footerCell,\n );\n const classes = useTheme((theme) => theme.classes?.footerCell);\n const columnCss = table.useState(\n (state) => state.activeColumns.find((column) => column.id === columnId)?.styles?.footerCell,\n );\n const styles = useTheme((theme) => theme.styles?.footerCell);\n\n const content = table.useState((state) => {\n const column = state.activeColumns.find((column) => column.id === columnId);\n\n return column?.footer;\n });\n\n return (\n <div\n className={cx(classes, columnClasses)}\n css={[\n defaultClasses.footerCell,\n stickyFooter && defaultClasses.stickyBottom,\n stickyFooter instanceof Object && stickyFooter,\n styles,\n columnCss,\n ]}\n style={columnStyleOverride}\n >\n {content}\n </div>\n );\n}\n","import type React from 'react';\nimport type { HTMLProps } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { useColumnContext, useTableContext } from '../misc/tableContext';\n\nexport function ResizeHandle() {\n const table = useTableContext();\n const columnId = useColumnContext();\n const enabled = table.useState((state) => state.props.enableColumnResize);\n const hasFilter = table.useState((state) => state.filters.get(columnId) !== undefined);\n\n function onPointerDown(event: React.PointerEvent) {\n event.stopPropagation();\n\n const div = event.target as HTMLDivElement;\n div.setPointerCapture(event.pointerId);\n }\n\n function onPointerMove(event: React.PointerEvent) {\n event.stopPropagation();\n\n const div = event.target as HTMLDivElement;\n if (!div.hasPointerCapture(event.pointerId)) return;\n\n const parent = div.parentElement as HTMLDivElement;\n const minWidth = hasFilter ? 80 : 50;\n const width = Math.max(event.clientX - parent.getBoundingClientRect().left + 5, minWidth);\n\n table.update((state) => {\n state.columnWidths.set(columnId, `${width}px`);\n });\n }\n\n function onPointerUp(event: React.PointerEvent) {\n event.stopPropagation();\n\n const div = event.target as HTMLDivElement;\n div.releasePointerCapture(event.pointerId);\n }\n\n function onDoubleClick(event: React.MouseEvent) {\n table.update((state) => {\n if (event.getModifierState('Control')) {\n state.columnWidths.delete(columnId);\n } else {\n state.columnWidths.set(columnId, 'max-content');\n }\n });\n }\n\n if (!enabled) {\n return null;\n }\n\n return (\n <ResizeHandleView\n enabled={enabled}\n onPointerDown={enabled ? onPointerDown : undefined}\n onPointerMove={enabled ? onPointerMove : undefined}\n onPointerUp={enabled ? onPointerUp : undefined}\n onDoubleClick={enabled ? onDoubleClick : undefined}\n />\n );\n}\n\nexport function ResizeHandleView({\n enabled,\n ...props\n}: HTMLProps<HTMLDivElement> & { enabled?: boolean | 'visualOnly' }) {\n const className = useTheme((theme) => theme.classes?.columnDivider);\n const styles = useTheme((theme) => theme.styles?.columnDivider);\n\n return (\n <div\n className={className}\n css={[\n {\n alignSelf: 'stretch',\n padding: '0 5px',\n cursor: enabled === true ? 'col-resize' : 'initial',\n display: 'flex',\n alignItems: 'center',\n\n '&:after': {\n content: '\"\"',\n width: 1,\n height: '1.5em',\n background: '#c9cfda',\n transition: 'transform 300ms',\n },\n\n '@media (pointer: coarse)': {\n pointerEvents: 'none',\n },\n },\n styles,\n ]}\n {...props}\n />\n );\n}\n","import type { ReactNode } from 'react';\nimport type React from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { useColumnContext, useTableContext } from '../misc/tableContext';\n\nexport function SortComponent<T>({ children }: { children: ReactNode }): JSX.Element {\n const table = useTableContext<T>();\n const columnId = useColumnContext();\n const Badge = useTheme((t) => t.components.Badge);\n const ArrowUpward = useTheme((t) => t.icons.ArrowUpward);\n\n const { direction, index, sortDisabled } = table.useState((state) => {\n const index = state.sort.findIndex((s) => s.columnId === columnId) ?? -1;\n const column = state.activeColumns.find((column) => column.id === columnId);\n\n return {\n direction: state.sort[index]?.direction,\n index: index >= 0 && state.sort.length > 1 ? index + 1 : undefined,\n sortDisabled: column?.disableSort ?? state.props.disableSort,\n };\n });\n\n function toggle(event: React.MouseEvent, off?: boolean) {\n if (sortDisabled) {\n return;\n }\n\n const {\n props: { sort: controlledSort, onSortChange },\n } = table.getState();\n\n const newDirection = direction === 'asc' ? 'desc' : 'asc';\n const newSort =\n event.getModifierState('Control') || off\n ? table.getState().sort.filter((s) => s.columnId !== columnId)\n : [];\n if (!off) {\n newSort.push({\n columnId,\n direction: newDirection,\n });\n }\n\n onSortChange?.(newSort);\n\n if (!controlledSort) {\n table.update((state) => {\n state.sort = newSort;\n });\n }\n\n event.preventDefault();\n return false;\n }\n\n return (\n <div\n css={{\n userSelect: 'none',\n display: 'grid',\n gridTemplateColumns: 'minmax(0, 1fr) max-content',\n alignItems: 'center',\n cursor: 'pointer',\n\n '& > div': {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n },\n }}\n onClick={(event) => toggle(event)}\n onContextMenu={(event) => toggle(event, true)}\n >\n <div>{children}</div>\n\n {\n <Badge badgeContent={sortDisabled ? 0 : index}>\n <span\n css={[\n { transition: 'all 300ms', fontSize: '0.8em' },\n !direction && { opacity: 0 },\n direction === 'desc' && { transform: 'rotate3d(0, 0, 1, 180deg)' },\n ]}\n >\n <ArrowUpward />\n </span>\n </Badge>\n }\n </div>\n );\n}\n","import { castDraft } from 'immer';\nimport type React from 'react';\nimport { useEffect, useRef } from 'react';\nimport { StoreScope } from 'schummar-state/react';\nimport { useColumnContext, useTableContext } from '../misc/tableContext';\nimport { useTheme } from '../hooks/useTheme';\nimport { cx } from '../misc/helpers';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\nimport type { Id } from '../types';\nimport { FilterControl } from './filterControl';\nimport { ResizeHandle } from './resizeHandle';\nimport { SortComponent } from './sortComponent';\n\nexport interface ColumnHeaderProps {\n index: number;\n}\n\nexport const ColumnHeaderContext = new StoreScope({\n items: new Map<Id, HTMLDivElement>(),\n});\n\nexport function ColumnHeader({ index }: ColumnHeaderProps): JSX.Element {\n const ref = useRef<HTMLDivElement>(null);\n const columnId = useColumnContext();\n const table = useTableContext();\n const enabled = table.useState((state) => state.props.enableColumnReorder);\n const columnStyleOverride = table.useState((state) => state.columnStyleOverride.get(columnId), {\n throttle: 16,\n });\n const stickyHeader = table.useState((state) => state.props.stickyHeader);\n const classes = useTheme((theme) => theme.classes?.headerCell);\n const styles = useTheme((theme) => theme.styles?.headerCell);\n\n const { header, columnClasses, columnStyles } = table.useState((state) => {\n const column = state.activeColumns.find((column) => column.id === columnId);\n return {\n header: column?.header,\n columnClasses: column?.classes?.headerCell,\n columnStyles: column?.styles?.headerCell,\n };\n });\n\n const store = ColumnHeaderContext.useStore();\n const draggingStart = useRef<{ mouseX: number; bounds: DOMRect }>();\n const clone = useRef<HTMLDivElement>();\n\n // Track each headers div in a store\n useEffect(() => {\n const div = ref.current;\n if (!div) return;\n\n store.update((state) => {\n state.items.set(columnId, castDraft(div));\n });\n\n return () => {\n store.update((state) => {\n state.items.delete(columnId);\n });\n };\n }, [store, columnId]);\n\n // Calculate which index the current header would get, given the current offset\n function calcTargetIndex(offsetLeft: number) {\n const cols = table\n .getState()\n .columnOrder.map((id) => ({ id, div: store.getState().items.get(id) }));\n\n const otherCols = cols.filter((col) => col.id !== columnId);\n\n const firstOffsetleft = cols.find((col) => col.div)?.div?.offsetLeft ?? 0;\n\n let sum = 0;\n const targetIndex = otherCols.findIndex((col) => {\n const width = col.div?.offsetWidth ?? 0;\n if (sum + width / 2 > offsetLeft - firstOffsetleft) return true;\n sum += width;\n return false;\n });\n\n return targetIndex === -1 ? otherCols.length : targetIndex;\n }\n\n // When starting clicking: Record initial mouse and div's bounds\n function onPointerDown(event: React.PointerEvent) {\n const div = ref.current;\n if (!div) return;\n draggingStart.current = { mouseX: event.clientX, bounds: div.getBoundingClientRect() };\n }\n\n // When mouse moves while clicked: Calculate transforms\n function onPointerMove(event: React.PointerEvent) {\n table.update((state) => {\n const div = ref.current;\n if (\n !div ||\n draggingStart.current === undefined ||\n Math.abs(event.clientX - draggingStart.current.mouseX) < 5\n )\n return;\n\n event.stopPropagation();\n div.setPointerCapture(event.pointerId);\n\n // Create clone of header div to move around with mouse\n if (!clone.current) {\n clone.current = div.cloneNode(true) as HTMLDivElement;\n document.body.append(clone.current);\n\n for (const [key, value] of Object.entries(getComputedStyle(div))) {\n try {\n clone.current.style[key as any] = value;\n } catch {\n // ignore\n }\n }\n\n Object.assign(clone.current.style, {\n pointerEvents: 'none',\n position: 'fixed',\n boxShadow:\n '0px 5px 5px -3px rgb(0 0 0 / 20%), 0px 8px 10px 1px rgb(0 0 0 / 14%), 0px 3px 14px 2px rgb(0 0 0 / 12%)',\n left: `${draggingStart.current.bounds.left}px`,\n top: `${draggingStart.current.bounds.top}px`,\n });\n\n div.style.color = 'rgba(0, 0, 0, 0.2)';\n }\n\n // Update clone's position each time\n clone.current.style.left = `${\n draggingStart.current.bounds.left + event.clientX - draggingStart.current.mouseX\n }px`;\n\n // Calculate target index\n const index = state.columnOrder.indexOf(columnId);\n const targetIndex = calcTargetIndex(\n div.offsetLeft + event.clientX - draggingStart.current.mouseX,\n );\n\n // Apply transforms to each column\n const columns = table.getState().columnOrder.map((id, index) => ({\n id,\n index,\n width: store.getState().items.get(id)?.offsetWidth ?? 0,\n }));\n\n state.columnOrder.forEach((id, i) => {\n let offset = 0;\n if (i === index) {\n // Current column: Move to target pos\n if (targetIndex > index) {\n offset = columns\n .slice(index + 1, targetIndex + 1)\n .reduce((sum, col) => sum + col.width, 0);\n } else if (targetIndex < index) {\n offset = -columns.slice(targetIndex, index).reduce((sum, col) => sum + col.width, 0);\n }\n } else if (i >= targetIndex && i < index) {\n // Left columns: Move right to make room if needed\n offset = div.offsetWidth;\n } else if (i > index && i <= targetIndex) {\n // Right columns: Move left to make room if needed\n offset = -div.offsetWidth;\n }\n\n state.columnStyleOverride.set(id, {\n transition: 'transform 500ms',\n transform: `translate3d(${offset}px, 0, 0)`,\n zIndex: i === index ? 1 : undefined,\n });\n });\n });\n }\n\n // When releasing mouse: Reset draggin state and apply column move\n function onPointerUp(event: React.PointerEvent) {\n table.update((state) => {\n const div = ref.current;\n if (!div || draggingStart.current === undefined) return;\n\n // Apply column move\n const index = state.columnOrder.indexOf(columnId);\n const targetIndex = calcTargetIndex(\n div.offsetLeft + event.clientX - draggingStart.current.mouseX,\n );\n\n state.columnOrder.splice(index, 1);\n state.columnOrder.splice(targetIndex, 0, columnId);\n\n // Cleanup\n clone.current?.remove();\n div.style.color = '';\n state.columnStyleOverride.clear();\n draggingStart.current = undefined;\n clone.current = undefined;\n });\n }\n\n return (\n <div\n ref={ref}\n className={cx(classes, columnClasses)}\n css={[\n defaultClasses.headerCell,\n {\n gridRow: 1,\n gridColumn: index + 3,\n position: 'relative',\n userSelect: 'none',\n },\n stickyHeader && defaultClasses.sticky,\n stickyHeader instanceof Object && stickyHeader,\n styles,\n columnStyles,\n ]}\n style={columnStyleOverride}\n onPointerDown={enabled ? onPointerDown : undefined}\n onPointerMove={enabled ? onPointerMove : undefined}\n onPointerUp={enabled ? onPointerUp : undefined}\n >\n <SortComponent>{header}</SortComponent>\n <div css={{ flex: 1 }} />\n <FilterControl />\n <ResizeHandle />\n </div>\n );\n}\n","import { useContext, useState } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { TableResetContext, useTableContext } from '../misc/tableContext';\nimport { useCssVariables } from '../theme/useCssVariables';\nimport type { InternalColumn } from '../types';\nimport { FormControlLabel } from './formControlLabel';\n\nexport function ColumnSelection<T>(): JSX.Element {\n const IconButton = useTheme((t) => t.components.IconButton);\n const Popover = useTheme((t) => t.components.Popover);\n const Checkbox = useTheme((t) => t.components.Checkbox);\n const Button = useTheme((t) => t.components.Button);\n const Settings = useTheme((t) => t.icons.Settings);\n const selectColumns = useTheme((t) => t.text.selectColumns);\n const resetAll = useTheme((t) => t.text.resetAll);\n const showAll = useTheme((t) => t.text.showAllColumns);\n const hideAll = useTheme((t) => t.text.hideAllColumns);\n const classes = useTheme((t) => t.classes);\n const cssVariables = useCssVariables();\n\n const table = useTableContext<T>();\n const reset = useContext(TableResetContext);\n const columns = table.useState((state) =>\n state.props.columns.filter(\n (column) =>\n state.displaySize === undefined ||\n column.displaySize === undefined ||\n column.displaySize.includes(state.displaySize),\n ),\n );\n const hiddenColumns = table.useState((state) => state.hiddenColumns);\n\n const [anchorElement, setAnchorElement] = useState<Element | null>(null);\n\n const toggle = (column?: InternalColumn<T, unknown>, state?: boolean) => {\n const {\n props: { hiddenColumns: controlledHiddenColumns, onHiddenColumnsChange },\n } = table.getState();\n\n const newValue = new Set(hiddenColumns);\n\n for (const columnId of column ? [column.id] : columns.map((column) => column.id)) {\n if (state ?? hiddenColumns.has(columnId)) {\n newValue.delete(columnId);\n } else {\n newValue.add(columnId);\n }\n }\n\n if (!controlledHiddenColumns) {\n table.update((state) => {\n state.hiddenColumns = newValue;\n });\n }\n\n onHiddenColumnsChange?.(newValue);\n };\n\n const allVisible = columns.every((column) => !hiddenColumns.has(column.id));\n\n return (\n <>\n <IconButton onClick={(event) => setAnchorElement(anchorElement ? null : event.currentTarget)}>\n <Settings />\n </IconButton>\n\n <Popover\n anchorEl={anchorElement}\n open={!!anchorElement}\n onClose={() => setAnchorElement(null)}\n css={cssVariables}\n className={classes?.popover}\n backdropClassName={classes?.popoverBackdrop}\n >\n <div css={{ padding: `calc(var(--spacing) * 2)`, display: 'grid' }}>\n <div css={{ marginBottom: 'var(--spacing)' }}>{selectColumns}</div>\n\n <div css={{ margin: '0.5em 0', display: 'flex', gap: '0.5em' }}>\n <Button variant=\"outlined\" onClick={() => toggle(undefined, !allVisible)}>\n {allVisible ? hideAll : showAll}\n </Button>\n\n <Button variant=\"outlined\" onClick={reset}>\n {resetAll}\n </Button>\n </div>\n\n {columns.map((column) => (\n <FormControlLabel\n key={column.id}\n control={\n <Checkbox\n checked={!(column.hidden ?? hiddenColumns.has(column.id))}\n onChange={() => toggle(column)}\n disabled={column.hidden !== undefined}\n />\n }\n label={column.header}\n ></FormControlLabel>\n ))}\n </div>\n </Popover>\n </>\n );\n}\n","import { useContext, useState } from 'react';\nimport { ExportOptions, ExporterEntry } from '../exporters/exporter';\nimport { useTheme } from '../hooks/useTheme';\nimport { useTableContext } from '../misc/tableContext';\nimport { TableSettingsContext } from '../misc/tableSettings';\nimport { useCssVariables } from '../theme/useCssVariables';\n\nexport function Export<T>(): JSX.Element {\n const { exporters: contextExporters } = useContext(TableSettingsContext);\n const table = useTableContext<T>();\n const Button = useTheme((t) => t.components.Button);\n const IconButton = useTheme((t) => t.components.IconButton);\n const Popover = useTheme((t) => t.components.Popover);\n const ExportIcon = useTheme((t) => t.icons.Export);\n const Clipboard = useTheme((t) => t.icons.Clipboard);\n const exportTitle = useTheme((t) => t.text.exportTitle);\n const exportCopy = useTheme((t) => t.text.exportCopy);\n const exportDownload = useTheme((t) => t.text.exportDownload);\n const classes = useTheme((t) => t.classes);\n const cssVariables = useCssVariables();\n\n const { all, exporters } = table.useState((state): ExportOptions => {\n if (typeof state.props.enableExport === 'boolean' || state.props.enableExport === undefined) {\n return {\n all: false,\n exporters: contextExporters,\n };\n }\n\n return state.props.enableExport;\n });\n\n const [anchor, setAnchor] = useState<Element | null>(null);\n\n function execute({ action, exporter }: ExporterEntry) {\n const { activeColumns, activeItems, items } = table.getState();\n const columns = activeColumns.map((column) => column.exportHeader);\n const rows = (all ? items : activeItems).map((item) =>\n activeColumns.map((column) => column.exportCell(column.value(item.value), item.value)),\n );\n\n if (action === 'copy') {\n const data = exporter.exportToString(columns, rows);\n navigator.clipboard.writeText(data);\n } else {\n const blob = exporter.exportToBlob(columns, rows);\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `export.${exporter.fileEnding}`;\n document.body.append(a);\n a.click();\n a.remove();\n URL.revokeObjectURL(url);\n }\n }\n\n return (\n <>\n <IconButton onClick={(event) => setAnchor(anchor ? null : event.currentTarget)}>\n <ExportIcon css={!!anchor && { color: 'var(--primaryMain)' }} />\n </IconButton>\n\n <Popover\n open={!!anchor}\n onClose={() => setAnchor(null)}\n anchorEl={anchor}\n css={cssVariables}\n className={classes?.popover}\n backdropClassName={classes?.popoverBackdrop}\n >\n <div\n css={{\n padding: `calc(var(--spacing) * 2)`,\n display: 'grid',\n justifyItems: 'stretch',\n gap: 'var(--spacing)',\n\n '& > *': {\n justifyContent: 'start',\n },\n }}\n >\n <div css={{ marginBottom: 'var(--spacing)' }}>{exportTitle}</div>\n\n {exporters.map((entry, index) => (\n <Button\n key={index}\n startIcon={entry.action === 'copy' ? <Clipboard /> : <ExportIcon />}\n onClick={() => execute(entry)}\n >\n {entry.action === 'copy' ? exportCopy : exportDownload} (.{entry.exporter.type})\n </Button>\n ))}\n </div>\n </Popover>\n </>\n );\n}\n","import type { MemoizedTableTheme } from '../types';\n\nexport function calcClassNames<T>(\n classes: MemoizedTableTheme<T>['classes'] | undefined,\n item: T,\n index: number,\n) {\n return [\n classes?.cell instanceof Function ? classes.cell(item, index) : classes?.cell,\n index % 2 === 0 && classes?.evenCell,\n index % 2 === 1 && classes?.oddCell,\n ];\n}\n\nexport function calcCss<T>(\n styles: MemoizedTableTheme<T>['styles'] | undefined,\n item: T | undefined,\n index: number,\n) {\n return [\n styles?.cell instanceof Function\n ? item !== undefined\n ? styles.cell(item, index)\n : undefined\n : styles?.cell,\n index % 2 === 0 && styles?.evenCell,\n index % 2 === 1 && styles?.oddCell,\n ];\n}\n","import type { ReactNode } from 'react';\nimport { memo, useLayoutEffect } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { calcClassNames, calcCss } from '../misc/calcClassNames';\nimport { cx } from '../misc/helpers';\nimport { useColumnContext, useTableContext } from '../misc/tableContext';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\nimport type { Id } from '../types';\n\nconst defaultWrapCell = (content: ReactNode) => {\n if (typeof content === 'string') {\n return (\n <span css={defaultClasses.text} title={content}>\n {content}\n </span>\n );\n }\n return content;\n};\n\nexport const Cell = memo(function Cell<T>({ itemId, rowIndex }: { itemId: Id; rowIndex: number }) {\n const table = useTableContext<T>();\n const columnId = useColumnContext();\n\n const column = table.useState((state) => {\n const col = state.activeColumns.find((column) => column.id === columnId);\n return (\n col && {\n value: col.value,\n renderCell: col.renderCell,\n }\n );\n });\n const wrapCell = table.useState((state) => state.props.wrapCell) ?? defaultWrapCell;\n const item = table.useState((state) => state.activeItemsById.get(itemId));\n const columnStyleOverride = table.useState((state) => state.columnStyleOverride.get(columnId), {\n throttle: 16,\n });\n\n useLayoutEffect(() => {\n table.getState().props.debugRender?.('render cell', itemId, columnId);\n });\n const className = useTheme((t) => cx(...calcClassNames(t.classes, item?.value, rowIndex)));\n const styles = useTheme((t) => calcCss<T>(t.styles, item?.value, rowIndex));\n\n if (!column || !item) return null;\n\n const content = column.renderCell(column.value(item.value), item.value);\n\n return (\n <div className={className} css={[defaultClasses.cell, styles]} style={columnStyleOverride}>\n {wrapCell(content, column.value(item.value), item.value, rowIndex)}\n </div>\n );\n});\n","import { forwardRef } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { useTableContext } from '../misc/tableContext';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\nimport { Id } from '../types';\n\nexport const Details = forwardRef<\n HTMLDivElement,\n {\n itemId: Id;\n rowIndex: number;\n }\n>(function Details({ itemId, rowIndex }, ref) {\n const table = useTableContext<unknown>();\n const classes = useTheme((t) => t.classes);\n const styles = useTheme((t) => t.styles);\n\n const { details, className, css } = table.useState((state) => {\n const item = state.activeItemsById.get(itemId);\n\n return {\n details: state.expanded.has(itemId)\n ? state.props.rowDetails instanceof Function\n ? item\n ? state.props.rowDetails(item.value, rowIndex)\n : null\n : state.props.rowDetails\n : undefined,\n className:\n classes?.details instanceof Function\n ? classes.details(item?.value, rowIndex)\n : classes?.details,\n css:\n styles?.details instanceof Function\n ? styles.details(item?.value, rowIndex)\n : styles?.details,\n };\n });\n\n return details ? (\n <div ref={ref} className={className} css={[defaultClasses.details, css]}>\n {details}\n </div>\n ) : null;\n});\n","import type { MouseEvent } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { getAncestors, getDescendants } from '../misc/helpers';\nimport { useTableContext } from '../misc/tableContext';\nimport type { Id } from '../types';\n\nexport function ExpandControl<T>({\n itemId,\n hasDeferredChildren,\n}: {\n itemId: Id;\n hasDeferredChildren?: boolean;\n}): JSX.Element {\n const IconButton = useTheme((t) => t.components.IconButton);\n const Spinner = useTheme((t) => t.components.Spinner);\n const ChevronRight = useTheme((t) => t.icons.ChevronRight);\n\n const table = useTableContext<T>();\n const isExpanded = table.useState((state) => state.expanded.has(itemId));\n const hasChildren = table.useState(\n (state) => !!state.activeItemsById.get(itemId)?.children.length,\n );\n\n function toggle(e: MouseEvent) {\n e.preventDefault();\n e.stopPropagation();\n\n const {\n props: { expanded: controlledExpanded, expandOnlyOne, onExpandedChange },\n expanded,\n activeItemsById,\n } = table.getState();\n\n const newExpanded = new Set(expanded);\n\n if (expandOnlyOne) {\n newExpanded.clear();\n\n const item = activeItemsById.get(itemId);\n for (const ancestor of item ? getAncestors(activeItemsById, item) : []) {\n newExpanded.add(ancestor);\n }\n }\n\n if (isExpanded) {\n newExpanded.delete(itemId);\n\n const item = activeItemsById.get(itemId);\n for (const descendant of item ? getDescendants(item) : []) {\n newExpanded.delete(descendant);\n }\n } else {\n newExpanded.add(itemId);\n }\n\n onExpandedChange?.(newExpanded);\n\n if (!controlledExpanded) {\n table.update((state) => {\n state.expanded = newExpanded;\n });\n }\n }\n\n if (isExpanded && hasDeferredChildren && !hasChildren) {\n return <Spinner css={{ margin: '0 var(--spacing)' }} />;\n }\n\n return (\n <IconButton onClick={toggle}>\n <span\n css={{\n display: 'inline-flex',\n transition: 'all 300ms',\n transform: isExpanded ? 'rotate3d(0, 0, 1, 90deg)' : 'rotate3d(0, 0, 1, 0deg)',\n }}\n >\n <ChevronRight />\n </span>\n </IconButton>\n );\n}\n","import type React from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { getAncestors, getDescendants } from '../misc/helpers';\nimport { useTableContext } from '../misc/tableContext';\nimport type { Id } from '../types';\n\nexport function SelectComponent<T>({ itemId }: { itemId?: Id }): JSX.Element {\n const table = useTableContext<T>();\n const Checkbox = useTheme((t) => t.components.Checkbox);\n\n const isSelected = table.useState((state) => {\n const itemIds = itemId ? [itemId] : Array.from(state.activeItemsById.keys());\n return state.activeItemsById.size > 0 && itemIds.every((itemId) => state.selection.has(itemId));\n });\n\n function toggle(event: React.ChangeEvent) {\n const mouseEvent = event.nativeEvent as MouseEvent;\n\n const {\n activeItems,\n activeItemsById,\n lastSelectedId,\n selection,\n props: { selectSyncChildren, selection: controlledSelection, onSelectionChange },\n } = table.getState();\n\n let range;\n if (mouseEvent.shiftKey && itemId) {\n const a = lastSelectedId ? activeItems.findIndex((i) => lastSelectedId === i.id) : 0;\n const b = activeItems.findIndex((item) => item.id === itemId);\n range = activeItems.slice(Math.min(a, b), Math.max(a, b) + 1);\n } else {\n const item = itemId ? activeItemsById.get(itemId) : undefined;\n range = item ? [item] : activeItems;\n }\n\n const newSelection = new Set(selection);\n for (const item of range) {\n if (isSelected) newSelection.delete(item.id);\n else newSelection.add(item.id);\n }\n\n if (selectSyncChildren && isSelected) {\n for (const ancestor of getAncestors(activeItemsById, ...range)) {\n newSelection.delete(ancestor);\n }\n for (const descendant of getDescendants(...range)) {\n newSelection.delete(descendant);\n }\n }\n\n onSelectionChange?.(newSelection);\n\n if (!controlledSelection) {\n table.update((state) => {\n state.selection = newSelection;\n });\n }\n\n table.update((state) => {\n state.lastSelectedId = itemId;\n });\n }\n\n return (\n <Checkbox\n css={{\n justifySelf: 'start',\n color: '#c9cfda',\n }}\n checked={isSelected}\n onChange={toggle}\n />\n );\n}\n","import { ClassNames } from '@emotion/react';\nimport { memo, useLayoutEffect, useRef } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { calcClassNames, calcCss } from '../misc/calcClassNames';\nimport { cx, getAncestors } from '../misc/helpers';\nimport { ColumnContext, useTableContext } from '../misc/tableContext';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\nimport type { Id } from '../types';\nimport { Cell } from './cell';\nimport { Details } from './details';\nimport { ExpandControl } from './expandControl';\nimport { SelectComponent } from './selectComponent';\n\nexport const Row = memo(function Row<T>({\n itemId,\n rowIndex,\n}: {\n itemId: Id;\n rowIndex: number;\n}): JSX.Element | null {\n const table = useTableContext<T>();\n const divRef = useRef<HTMLDivElement>(null);\n const detailsDivRef = useRef<HTMLDivElement>(null);\n\n const classes = useTheme((t) => t.classes);\n const styles = useTheme((t) => t.styles);\n\n const item = table.useState((state) => state.activeItemsById.get(itemId));\n const wrapRow = table.useState((state) => state.props.wrapRow) ?? ((props) => <div {...props} />);\n const rowClassName =\n classes?.row instanceof Function ? classes.row(item?.value, rowIndex) : classes?.row;\n const rowStyles =\n styles?.row instanceof Function ? styles.row(item?.value, rowIndex) : styles?.row;\n const subgrid = table.useState((state) => state.props.subgrid);\n\n const {\n cellClassName,\n css_,\n indent,\n hasChildren,\n hasDeferredChildren,\n columnIds,\n enableSelection,\n rowAction,\n hasDetails,\n } = table.useState((state) => {\n const item = state.activeItemsById.get(itemId);\n\n return {\n cellClassName: cx(...calcClassNames(classes, item?.value, rowIndex)),\n css_: calcCss<T>(styles, item?.value, rowIndex),\n indent: item ? getAncestors(state.activeItemsById, item).size : 0,\n hasChildren: !!item?.children.length,\n hasDeferredChildren: item && state.props.hasDeferredChildren?.(item.value),\n columnIds: state.visibleColumns.map((column) => column.id),\n enableSelection: state.props.enableSelection,\n rowAction:\n state.props.rowAction instanceof Function\n ? item\n ? state.props.rowAction(item.value, rowIndex)\n : null\n : state.props.rowAction,\n hasDetails:\n state.props.rowDetails instanceof Function\n ? item\n ? !!state.props.rowDetails(item.value, rowIndex)\n : null\n : !!state.props.rowDetails,\n };\n });\n\n useLayoutEffect(() => {\n function update() {\n table.update((state) => {\n if (!divRef.current) {\n return;\n }\n\n const h1 = divRef.current.offsetHeight;\n const h2 =\n detailsDivRef.current && document.contains(detailsDivRef.current)\n ? detailsDivRef.current.offsetHeight\n : 0;\n\n state.rowHeights.set(itemId, h1 + h2);\n });\n }\n\n update();\n\n const handles = [divRef.current, detailsDivRef.current]\n .filter((x): x is HTMLDivElement => !!x)\n .map((div) => {\n const o = new ResizeObserver(update);\n o.observe(div);\n return () => o.disconnect();\n });\n\n return () => {\n handles.forEach((h) => h());\n };\n }, [table, itemId, divRef.current, detailsDivRef.current]);\n\n useLayoutEffect(() => {\n table.getState().props.debugRender?.('render row', itemId);\n });\n\n if (!item) {\n return null;\n }\n\n return (\n <ClassNames>\n {({ css, cx }) => (\n <>\n {wrapRow(\n {\n className: cx(\n css([\n subgrid\n ? {\n gridColumn: `1 / -1`,\n display: 'grid',\n gridTemplateColumns: 'subgrid',\n }\n : {\n display: 'contents',\n },\n rowStyles,\n ]),\n rowClassName,\n ),\n\n children: (\n <>\n <div\n className={cellClassName}\n css={[defaultClasses.cellFill, css_]}\n ref={divRef}\n />\n\n <div\n className={cellClassName}\n css={[defaultClasses.cell, defaultClasses.firstCell, css_]}\n >\n {indent > 0 && <div css={{ width: indent * 20 }} />}\n\n {enableSelection && <SelectComponent itemId={itemId} />}\n\n {(hasChildren || hasDeferredChildren || hasDetails) && (\n <ExpandControl itemId={itemId} hasDeferredChildren={hasDeferredChildren} />\n )}\n\n {rowAction}\n </div>\n\n {columnIds.map((columnId) => (\n <ColumnContext.Provider key={columnId} value={columnId}>\n <Cell itemId={itemId} rowIndex={rowIndex} />\n </ColumnContext.Provider>\n ))}\n\n <div className={cellClassName} css={[defaultClasses.cellFill, css_]} />\n\n <Details ref={detailsDivRef} itemId={itemId} rowIndex={rowIndex} />\n </>\n ),\n },\n item.value,\n rowIndex,\n )}\n </>\n )}\n </ClassNames>\n );\n});\n","import type { HTMLProps, ReactNode } from 'react';\nimport { useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { useTableContext } from '../misc/tableContext';\nimport { throttle } from '../misc/throttle';\nimport type { Id } from '../types';\n\nconst findScrollRoot = (x: HTMLElement): HTMLElement => {\n const parent = x.parentElement;\n if (!parent) return document.documentElement;\n if (parent.scrollHeight > parent.clientHeight && getComputedStyle(parent).overflowY !== 'visible')\n return parent;\n return findScrollRoot(parent);\n};\n\nconst relativeOffset = (x: HTMLElement, y: HTMLElement): number => {\n if (x.offsetParent === y.offsetParent || !x.offsetParent) return x.offsetTop - y.offsetTop;\n if (x.offsetParent instanceof HTMLElement) return relativeOffset(x.offsetParent, y) + x.offsetTop;\n return 0;\n};\n\nexport function Virtualized<T>({\n header,\n footer,\n children,\n ...props\n}: {\n header: ReactNode;\n footer: ReactNode;\n children: (itemIds: Id[], startIndex: number) => ReactNode;\n} & Omit<HTMLProps<HTMLDivElement>, 'children'>): JSX.Element {\n const table = useTableContext<T>();\n const virtual = table.useState((state) => state.props.virtual);\n const probeRef = useRef<HTMLDivElement>(null);\n const [, setId] = useState({});\n\n const {\n itemIds = [],\n from = 0,\n to,\n before = 0,\n after = 0,\n } = table.useState(\n (state) => {\n const itemIds = state.activeItems.map((item) => item.id);\n const root = probeRef.current && findScrollRoot(probeRef.current);\n if (!state.props.virtual) return { itemIds };\n if (!probeRef.current || !root || !document.contains(root)) return {};\n\n const {\n rowHeight,\n initalRowHeight,\n overscan = 100,\n overscanTop,\n overscanBottom,\n } = (state.props.virtual instanceof Object ? state.props.virtual : undefined) ?? {};\n\n let totalHeight = 0;\n const rowHeights = itemIds.map((itemId, index) => {\n const h =\n rowHeight ??\n state.rowHeights.get(itemId) ??\n initalRowHeight ??\n (index === 0 ? 100 : totalHeight / index);\n totalHeight += h;\n return h;\n });\n\n const probeOffset = relativeOffset(probeRef.current, root);\n const headerHeight = probeRef.current.offsetTop;\n const topOfTable = root.scrollTop - probeOffset + headerHeight;\n const bottomOfTable = topOfTable + root.clientHeight - headerHeight;\n\n let from = 0;\n let to = itemIds.length;\n let before = 0;\n let after = 0;\n for (const h of rowHeights) {\n if (before + h > topOfTable - (overscanTop ?? overscan)) break;\n from++;\n before += h;\n }\n\n for (const h of rowHeights.reverse()) {\n if (after + h > totalHeight - bottomOfTable - (overscanBottom ?? overscan)) break;\n to--;\n after += h;\n }\n\n return { itemIds: itemIds.slice(from, to), from, to, before, after };\n },\n { throttle: 16 },\n );\n\n const throttleScroll = (typeof virtual === 'boolean' ? undefined : virtual)?.throttleScroll ?? 16;\n const update = useMemo(() => throttle(() => setId({}), throttleScroll), [throttleScroll]);\n\n useEffect(() => {\n if (!virtual || !probeRef.current) return;\n\n window.addEventListener('scroll', update, true);\n window.addEventListener('resize', update, true);\n return () => {\n window.removeEventListener('scroll', update, true);\n window.removeEventListener('resize', update, true);\n };\n }, [update, virtual]);\n\n useEffect(() => update.cancel, [update]);\n\n useLayoutEffect(() => {\n table.getState().props.debugRender?.(`Virtualized render ${from} to ${to}`);\n });\n\n return (\n <div {...props}>\n {header}\n\n {virtual && <div style={{ gridColumn: '1 / -1', height: before }} ref={probeRef} />}\n\n {children(itemIds, from)}\n\n {virtual && <div style={{ gridColumn: '1 / -1', height: after }} />}\n\n {footer}\n </div>\n );\n}\n","import { forwardRef, memo, useEffect, useLayoutEffect, useState, type ForwardedRef } from 'react';\nimport { TableMemoContextProvider } from '../hooks/useTableMemo';\nimport useTableRef from '../hooks/useTableRef';\nimport { useTheme } from '../hooks/useTheme';\nimport { useTableStateStorage } from '../internalState/tableStateStorage';\nimport { useTableState } from '../internalState/useTableState';\nimport {\n ColumnContext,\n TableContext,\n TableResetContext,\n useTableContext,\n} from '../misc/tableContext';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\nimport { useCssVariables } from '../theme/useCssVariables';\nimport type { TableProps, TableRef } from '../types';\nimport ClearFiltersButton from './clearFiltersButton';\nimport { ColumnFooter } from './columnFooter';\nimport { ColumnHeader, ColumnHeaderContext } from './columnHeader';\nimport { ColumnSelection } from './columnSelection';\nimport { Export } from './export';\nimport { ResizeHandleView } from './resizeHandle';\nimport { Row } from './row';\nimport { SelectComponent } from './selectComponent';\nimport { Virtualized } from './virtualized';\n\nexport const Table = forwardRef(_Table) as <T>(\n props: TableProps<T> & { ref?: ForwardedRef<TableRef> },\n) => ReturnType<typeof _Table>;\n\nfunction _Table<T>(props: TableProps<T>, ref: ForwardedRef<TableRef>): JSX.Element {\n const [table, resetState] = useTableState(props);\n const [isHydrated, clearStorage] = useTableStateStorage(table);\n useTableRef(table, ref);\n\n async function reset() {\n await clearStorage();\n resetState();\n }\n\n useLayoutEffect(() => {\n table.getState().props.debugRender?.('render table');\n });\n\n return (\n <TableContext.Provider value={table}>\n <TableResetContext.Provider value={reset}>\n <TableMemoContextProvider>\n <TableLoadingState isHydrated={isHydrated} />\n </TableMemoContextProvider>\n </TableResetContext.Provider>\n </TableContext.Provider>\n );\n}\n\nfunction TableLoadingState({ isHydrated }: { isHydrated: boolean }) {\n const loadingText = useTheme((t) => t.text.loading);\n const [showLoading, setShowLoading] = useState(false);\n\n useEffect(() => {\n const handle = setTimeout(() => setShowLoading(true), 500);\n return () => clearTimeout(handle);\n });\n\n return (\n <>\n {!isHydrated && showLoading && <div>{loadingText}</div>}\n <TableInner hidden={!isHydrated} />\n </>\n );\n}\n\nconst TableInner = memo(function TableInner<T>({ hidden }: { hidden: boolean }) {\n const table = useTableContext<T>();\n const fullWidth = table.useState((state) => state.props.fullWidth);\n\n const visibleColumns = table.useState((state) =>\n state.visibleColumns.map((column) => ({\n id: column.id,\n width: column.width,\n classes: column.classes,\n styles: column.styles,\n footer: column.footer,\n })),\n );\n\n const hasActiveFilters = table.useState((state) => {\n return state.activeColumns.some((column) => {\n const filter = state.filters.get(column.id);\n const filterValue = state.filterValues.get(column.id);\n return filter !== undefined && filterValue !== undefined && filter.isActive(filterValue);\n });\n });\n const columnWidths = table.useState((state) => state.columnWidths, { throttle: 16 });\n const hasFooter = table.useState((state) => state.activeColumns.some((column) => column.footer));\n\n const classes = useTheme((theme) => theme.classes);\n const styles = useTheme((theme) => theme.styles);\n const stickyHeader = table.useState((state) => state.props.stickyHeader);\n const stickyFooter = table.useState((state) => state.props.stickyFooter);\n\n const enableSelection = table.useState((state) => state.props.enableSelection);\n const enableColumnSelection = table.useState((state) => state.props.enableColumnSelection);\n const enableExport = table.useState((state) => state.props.enableExport);\n const cssVariables = useCssVariables();\n\n const enableClearFiltersButton = table.useState((state) => state.props.enableClearFiltersButton);\n\n useLayoutEffect(() => {\n table.getState().props.debugRender?.('render table inner');\n });\n\n return (\n <Virtualized\n className={classes?.table}\n css={[cssVariables, defaultClasses.table, styles?.table, hidden && { visibility: 'hidden' }]}\n style={{\n gridTemplateColumns: [\n //\n fullWidth === 'right' || fullWidth === true ? 'auto' : '0',\n 'max-content',\n ...visibleColumns.map(\n (column) => columnWidths.get(column.id) ?? column.width ?? 'max-content',\n ),\n fullWidth === 'left' || fullWidth === true ? 'auto' : '0',\n ].join(' '),\n }}\n header={\n <>\n <div\n className={classes?.headerCell}\n css={[\n { gridRow: 1, gridColumn: 1 },\n defaultClasses.headerFill,\n stickyHeader && defaultClasses.sticky,\n stickyHeader instanceof Object && stickyHeader,\n styles?.headerCell,\n ]}\n />\n\n <div\n className={classes?.headerCell}\n css={[\n { gridRow: 1, gridColumn: 2 },\n defaultClasses.headerCell,\n stickyHeader && defaultClasses.sticky,\n stickyHeader instanceof Object && stickyHeader,\n styles?.headerCell,\n ]}\n >\n {enableSelection && <SelectComponent />}\n\n {enableColumnSelection && <ColumnSelection />}\n\n {enableExport && <Export />}\n\n {(enableSelection || enableColumnSelection || enableExport) && (\n <>\n <div css={{ flex: 1 }} />\n <ResizeHandleView />\n </>\n )}\n </div>\n\n <ColumnHeaderContext.Provider>\n {visibleColumns.map((column, index) => (\n <ColumnContext.Provider key={column.id} value={column.id}>\n <ColumnHeader index={index} />\n </ColumnContext.Provider>\n ))}\n </ColumnHeaderContext.Provider>\n\n <div\n className={classes?.headerCell}\n css={[\n { gridRow: 1, gridColumn: visibleColumns.length + 3 },\n defaultClasses.headerFill,\n stickyHeader && defaultClasses.sticky,\n stickyHeader instanceof Object && stickyHeader,\n styles?.headerCell,\n ]}\n />\n </>\n }\n footer={\n <>\n {enableClearFiltersButton && hasActiveFilters && <ClearFiltersButton />}\n {hasFooter && (\n <>\n <div\n className={classes?.footerCell}\n css={[\n { gridColumn: 1 },\n defaultClasses.footerFill,\n stickyFooter && defaultClasses.stickyBottom,\n stickyFooter instanceof Object && stickyFooter,\n styles?.footerCell,\n ]}\n />\n <div\n className={classes?.footerCell}\n css={[\n defaultClasses.footerFill,\n stickyFooter && defaultClasses.stickyBottom,\n stickyFooter instanceof Object && stickyFooter,\n styles?.footerCell,\n ]}\n />\n\n {visibleColumns.map((column) => (\n <ColumnContext.Provider key={column.id} value={column.id}>\n <ColumnFooter />\n </ColumnContext.Provider>\n ))}\n\n <div\n className={classes?.footerCell}\n css={[\n defaultClasses.footerFill,\n stickyFooter && defaultClasses.stickyBottom,\n stickyFooter instanceof Object && stickyFooter,\n styles?.footerCell,\n ]}\n />\n </>\n )}\n </>\n }\n >\n {(itemIds, startIndex) =>\n itemIds.map((itemId, index) => (\n <Row key={itemId} itemId={itemId} rowIndex={startIndex + index} />\n ))\n }\n </Virtualized>\n );\n});\n","import { useFilter } from '../hooks/useFilter';\nimport { useTheme } from '../hooks/useTheme';\nimport { asStringOrArray } from '../misc/helpers';\nimport type { CommonFilterProps } from '../types';\nimport { AutoFocusTextField } from './autoFocusTextField';\n\nexport function substringCompare(itemValue: string, filterValue: string): boolean {\n return itemValue.toLowerCase().includes(filterValue.toLowerCase());\n}\n\nexport function prefixCompare(itemValue: string, filterValue: string): boolean {\n return itemValue.toLowerCase().includes(filterValue.toLowerCase());\n}\n\nexport function exactCompare(itemValue: string, filterValue: string): boolean {\n return itemValue.toLowerCase() === filterValue.toLowerCase();\n}\n\nexport function TextFilter<TItem, TColumnValue>({\n compare = substringCompare,\n filterBy = asStringOrArray,\n placeholder,\n ...props\n}: {\n /** Custom comparison function. Should return true if an item value matches the current filter value.\n * By default a fuzzy text comparison is used.\n */\n compare?: (itemValue: string, filterValue: string) => boolean;\n placeholder?: string;\n} & CommonFilterProps<TItem, TColumnValue, string, string>): JSX.Element {\n const IconButton = useTheme((t) => t.components.IconButton);\n const Search = useTheme((t) => t.icons.Search);\n const Clear = useTheme((t) => t.icons.Clear);\n\n const {\n value = '',\n onChange,\n close,\n } = useFilter({\n ...props,\n filterBy,\n\n id: 'textFilter',\n\n isActive(filterValue) {\n return !!filterValue;\n },\n\n test(filterValue, value) {\n return compare(value, filterValue);\n },\n });\n\n return (\n <div\n css={{\n padding: `calc(var(--spacing) * 2)`,\n display: 'grid',\n }}\n >\n <AutoFocusTextField\n value={value}\n onChange={(event) => onChange(event.target.value)}\n onKeyUp={(event) => {\n if (event.key === 'Enter') {\n close();\n }\n }}\n endIcon={\n <IconButton onClick={() => onChange('')}>{!value ? <Search /> : <Clear />}</IconButton>\n }\n placeholder={placeholder}\n />\n </div>\n );\n}\n","export const textMatch = (text: string, query: string): boolean => {\n text = text.toLowerCase();\n query = query.toLowerCase();\n return query.split(/\\s+/).every((part) => termMatch(text, part));\n};\n\nexport const termMatch = (text: string, query: string): boolean => {\n let i = 0;\n outer: for (const char of query) {\n for (; i < text.length; i++) {\n if (text[i] === char) {\n i++;\n continue outer;\n }\n }\n return false;\n }\n return true;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["defaultColors: TableTheme['colors']","className","Badge: TableTheme['components']['Badge']","Button: TableTheme['components']['Button']","Checkbox: TableTheme['components']['Checkbox']","className","IconButton: TableTheme['components']['IconButton']","TextField: TableTheme['components']['TextField']","className","defaultComponents: TableTheme['components']","ClassNames","css","Export","defaultIcons: TableTheme['icons']","defaultTexts: TableTheme['text']","defaultTableTheme: TableTheme","deps: DependencyList","Store","TableSettingsContext","memo","globalTableTheme","column","mergeThemes","Popover","IconButton","FilterList","ArrowDropDown","filter","ClassNames","cx","css","TextField","lastArgs: Args | undefined","timeout: ReturnType<typeof setTimeout> | undefined","value","IconButton","FilterList","filter","Button","FilterList","filter","FilterDialog","months: DayzedCalendar[]","dates: ('' | DayzedDateObject)[]","weeks: ('' | DayzedDateObject)[][]","className","defaultDate","isIncludedType","maxValues","tabNext","value","localValue","Fragment","value","localValue","Fragment","Temporal","value","Button","IconButton","ChevronRight","today","min","max","getBackProps","getForwardProps","Fragment","getDateProps","value","flatMap","className","asNumber","TextField","minValue","maxValue","value","min","max","throttle","IconButton","Checkbox","Search","Clear","value","column","Button","value","id","key","data: any","state","column","sort","items","id","overrides","defaultProps: InternalTableProps<any>","id","defaults","overrides","state","state","state","Store","state","Button","defaultClasses","defaultClasses","className","Badge","ArrowUpward","index","column","toggle","StoreScope","column","index","defaultClasses","IconButton","Popover","Checkbox","Button","Settings","toggle","column","TableSettingsContext","Button","IconButton","Popover","Clipboard","defaultClasses","Cell","column","className","Details","className","defaultClasses","css","IconButton","Spinner","ChevronRight","toggle","Checkbox","isSelected","itemId","toggle","Row","item","ClassNames","cx","css","defaultClasses","itemIds","from","to","before","after","throttle","TableInner","defaultClasses","IconButton","Search","Clear","value"],"sources":["../src/misc/tableContext.ts","../src/theme/defaultTheme/defaultColors.ts","../src/components/spinnner.tsx","../src/theme/defaultTheme/badge.tsx","../src/theme/defaultTheme/button.tsx","../src/theme/defaultTheme/checkbox.tsx","../src/theme/defaultTheme/iconButton.tsx","../src/theme/defaultTheme/textField.tsx","../src/theme/defaultTheme/defaultComponents.ts","../src/theme/defaultTheme/defaultIcons.tsx","../src/theme/defaultTheme/defaultTexts.tsx","../src/theme/defaultTheme/index.tsx","../src/hooks/useTableMemo.tsx","../src/hooks/useTheme.ts","../src/theme/useCssVariables.ts","../src/components/filterControl.tsx","../src/components/autoFocusTextField.tsx","../src/misc/debounce.ts","../src/hooks/useFilter.ts","../src/components/filterDialog.tsx","../src/components/nestedFilterControl.tsx","../src/components/combinedFilter.tsx","../src/misc/defaults.ts","../src/vendor/dayzed/utils.ts","../src/vendor/dayzed/dayzed.ts","../src/hooks/useLatestRef.ts","../src/components/dateInput.tsx","../src/components/text.tsx","../src/components/timeInput.tsx","../src/components/datePicker.tsx","../src/components/dateFilter.tsx","../src/misc/helpers.ts","../src/components/numberField.tsx","../src/components/rangeFilter.tsx","../src/components/formControlLabel.tsx","../src/components/virtualList.tsx","../src/components/selectFilter.tsx","../src/hooks/useTableRef.ts","../src/misc/queue.ts","../src/internalState/tableStateStorage.ts","../src/internalState/calcItems.ts","../src/exporters/serializer.ts","../src/misc/overrides.ts","../src/internalState/calcProps.ts","../src/internalState/cleanupState.ts","../src/internalState/filterColumns.ts","../src/internalState/normalizeExpanded.ts","../src/internalState/syncSelections.ts","../src/internalState/watchDisplaySize.ts","../src/internalState/useTableState.ts","../src/components/clearFiltersButton.tsx","../src/components/columnFooter.tsx","../src/components/resizeHandle.tsx","../src/components/sortComponent.tsx","../src/components/columnHeader.tsx","../src/components/columnSelection.tsx","../src/components/export.tsx","../src/misc/calcClassNames.ts","../src/components/cell.tsx","../src/components/details.tsx","../src/components/expandControl.tsx","../src/components/selectComponent.tsx","../src/components/row.tsx","../src/components/virtualized.tsx","../src/components/table.tsx","../src/components/textFilter.tsx","../src/misc/textMatch.ts"],"sourcesContent":["import { createContext, useContext } from 'react';\nimport type { Store } from 'schummar-state/react';\nimport type { Id, InternalTableState } from '../types';\n\nexport const TableContext = createContext<Store<InternalTableState<any>> | null>(null);\n\nexport const TableResetContext = createContext<() => void>(() => undefined);\n\nexport const ColumnContext = createContext<Id | null>(null);\n\nexport function useTableContext<T>(): Store<InternalTableState<T>> {\n const value = useContext(TableContext);\n if (!value) throw new Error('No table context available');\n return value as Store<InternalTableState<T>>;\n}\n\nexport function useColumnContext(): Id {\n const value = useContext(ColumnContext);\n if (value === null) throw new Error('No column context available');\n return value;\n}\n","import type { TableTheme } from '../../types';\n\nexport const defaultColors: TableTheme['colors'] = {\n primary: { main: '#1976d2', light: '#42a5f5', contrastText: '#fff' },\n secondary: { main: '#9c27b0', light: '#ba68c8', contrastText: '#fff' },\n blocked: { main: '#f44336', light: '#f26257', contrastText: '#fff' },\n background: '#ffffff',\n text: 'inherit',\n border: '#777',\n borderLight: '#eee',\n};\n","import { css } from '@emotion/react';\n\nexport function Spinner({ className }: { className?: string }) {\n return (\n <div\n className={className}\n css={css`\n display: inline-block;\n position: relative;\n width: 1em;\n height: 1em;\n\n div {\n box-sizing: border-box;\n display: block;\n position: absolute;\n width: 0.8em;\n height: 0.8em;\n margin: 0.1em;\n border: 0.1em solid #fff;\n border-radius: 50%;\n animation: lds-ring 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;\n border-color: currentColor transparent transparent transparent;\n }\n div:nth-of-type(1) {\n animation-delay: -0.45s;\n }\n div:nth-of-type(2) {\n animation-delay: -0.3s;\n }\n div:nth-of-type(3) {\n animation-delay: -0.15s;\n }\n @keyframes lds-ring {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n }\n `}\n >\n <div />\n <div />\n <div />\n </div>\n );\n}\n","import type { TableTheme } from '../../types';\n\nexport const Badge: TableTheme['components']['Badge'] = ({ badgeContent, children }) => {\n return (\n <span\n css={{\n display: 'inline-flex',\n position: 'relative',\n flexShrink: 0,\n verticalAlign: 'middle',\n }}\n >\n {children}\n\n <span\n css={[\n {\n top: 0,\n right: 0,\n transform: 'scale(1) translate(50%, -50%)',\n transformOrigin: '100% 0%',\n height: 20,\n display: 'flex',\n padding: '0 6px',\n zIndex: 1,\n position: 'absolute',\n flexWrap: 'wrap',\n minWidth: 20,\n transition: 'transform 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms',\n alignItems: 'center',\n lineHeight: 1,\n alignContent: 'center',\n borderRadius: 10,\n justifyContent: 'center',\n fontSize: '0.8em',\n },\n !badgeContent && {\n transform: 'scale(0) translate(50%, -50%)',\n transition: 'transform 195ms cubic-bezier(0.4, 0, 0.2, 1) 0ms',\n },\n ]}\n >\n {badgeContent}\n </span>\n </span>\n );\n};\n","import type { TableTheme } from '../../types';\n\nexport const Button: TableTheme['components']['Button'] = ({\n startIcon,\n children,\n variant = 'text',\n ...props\n}) => {\n return (\n <button\n css={[\n {\n padding: `var(--spacing) calc(var(--spacing) * 2)`,\n display: 'inline-flex',\n alignItems: 'center',\n transition: 'background-color 150ms',\n border: 'none',\n cursor: 'pointer',\n background: 'transparent',\n borderRadius: 4,\n\n '&:active:not(:disabled)': {\n transform: 'scale3d(0.95, 0.95, 1)',\n },\n },\n variant === 'text' && {\n '&:hover': {\n background: 'rgba(0, 0, 0, 0.1)',\n },\n },\n variant === 'outlined' && {\n border: '1px solid var(--table-button-border, var(--table-border, #777777))',\n\n '&:disabled': {\n borderColor: 'var(--table-button-border-disabled, #eeeeee)',\n },\n },\n variant === 'contained' && {\n color: 'var(--primaryContrastText)',\n backgroundColor: 'var(--primaryMain)',\n boxShadow:\n '0px 3px 1px -2px rgb(0 0 0 / 20%), 0px 2px 2px 0px rgb(0 0 0 / 14%), 0px 1px 5px 0px rgb(0 0 0 / 12%)',\n\n '&:hover': {\n filter: 'brightness(0.9)',\n },\n\n '&:disabled': {\n filter: 'grayscale()',\n opacity: 0.5,\n },\n },\n ]}\n {...props}\n >\n {startIcon && <span css={{ marginRight: `calc(var(--spacing) * 2)` }}>{startIcon}</span>}\n <span>{children}</span>\n </button>\n );\n};\n","import type { TableTheme } from '../../types';\n\nexport const Checkbox: TableTheme['components']['Checkbox'] = ({ className, ...props }) => {\n return (\n <label\n css={[\n {\n padding: 'calc(var(--spacing) * 1.8)',\n display: 'flex',\n color: 'currentcolor',\n userSelect: 'none',\n\n '& input': {\n appearance: 'none',\n margin: 0,\n },\n },\n props.disabled && { color: 'rgba(0, 0, 0, 0.26)' },\n ]}\n className={className}\n >\n <input type=\"checkbox\" {...props} />\n\n {props.checked ? (\n <svg\n css={{ fontSize: '1.25rem', width: '1em', height: '1em', fill: 'var(--primaryMain)' }}\n focusable=\"false\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path d=\"M19 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.11 0 2-.9 2-2V5c0-1.1-.89-2-2-2zm-9 14l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\"></path>\n </svg>\n ) : (\n <svg\n css={{ fontSize: '1.25rem', width: '1em', height: '1em', fill: 'currentColor' }}\n focusable=\"false\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path d=\"M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z\"></path>\n </svg>\n )}\n </label>\n );\n};\n","import type { TableTheme } from '../../types';\n\nexport const IconButton: TableTheme['components']['IconButton'] = (props) => {\n return (\n <button\n css={{\n padding: 'var(--spacing)',\n borderRadius: '50%',\n display: 'inline-flex',\n justifyContent: 'center',\n alignItems: 'center',\n transition: 'background-color 150ms',\n border: 'none',\n cursor: 'pointer',\n color: 'inherit',\n background: 'transparent',\n\n '&:hover': {\n backgroundColor: 'rgba(0, 0, 0, 0.04)',\n },\n\n '&:active': {\n transformColor: 'scale3d(0.95, 0.95, 1)',\n },\n }}\n {...props}\n />\n );\n};\n","import type { TableTheme } from '../../types';\n\nexport const TextField: TableTheme['components']['TextField'] = ({\n startIcon,\n endIcon,\n className,\n inputRef,\n onBlur,\n ...props\n}) => {\n return (\n <div\n className={className}\n css={[\n {\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n border: '1px solid var(--table-textfield-border, var(--table-border, #777777))',\n borderRadius: 4,\n\n '&:focus-within': {\n border: '2px solid var(--primaryMain)',\n margin: -1,\n },\n },\n ]}\n >\n {startIcon}\n\n <input\n ref={inputRef}\n {...props}\n value={props.value ?? ''}\n onBlur={onBlur}\n css={{\n minWidth: 0,\n width: '100%',\n flex: 1,\n border: 'none',\n outline: 'none',\n borderRadius: 4,\n padding: 'calc(var(--spacing) * 2)',\n paddingLeft: startIcon ? 0 : undefined,\n paddingRight: endIcon ? 0 : undefined,\n transition: 'outline 500ms',\n }}\n />\n\n {endIcon}\n </div>\n );\n};\n","import { Spinner } from '../../components/spinnner';\nimport type { TableTheme } from '../../types';\nimport { Badge } from './badge';\nimport { Button } from './button';\nimport { Checkbox } from './checkbox';\nimport { IconButton } from './iconButton';\nimport { Popover } from './popover';\nimport { TextField } from './textField';\n\nexport const defaultComponents: TableTheme['components'] = {\n IconButton,\n Checkbox,\n Popover,\n Button,\n Badge,\n TextField,\n Spinner,\n};\n","import { ClassNames, css } from '@emotion/react';\nimport type { HTMLProps } from 'react';\nimport { cloneElement } from 'react';\nimport type { TableTheme } from '../../types';\n\nconst IconDefaultStyle = css({\n width: '1.5em',\n height: '1.5em',\n color: 'inherit',\n});\n\nfunction Icon(svg: JSX.Element) {\n return function IconComponent(props: HTMLProps<Element>) {\n return (\n <ClassNames>\n {({ css }) =>\n cloneElement(svg, {\n ...props,\n className: css(IconDefaultStyle, props.className),\n })\n }\n </ClassNames>\n );\n };\n}\n\nconst Settings = Icon(\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24px\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n fill=\"currentColor\"\n >\n <path d=\"M0 0h24v24H0V0z\" fill=\"none\" />\n <path d=\"M3 17v2h6v-2H3zM3 5v2h10V5H3zm10 16v-2h8v-2h-8v-2h-2v6h2zM7 9v2H3v2h4v2h2V9H7zm14 4v-2H11v2h10zm-6-4h2V7h4V5h-4V3h-2v6z\" />\n </svg>,\n);\n\nconst Export = Icon(\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n enableBackground=\"new 0 0 24 24\"\n height=\"24px\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n fill=\"currentColor\"\n >\n <g>\n <rect fill=\"none\" height=\"24\" width=\"24\" />\n </g>\n <g>\n <path d=\"M18,15v3H6v-3H4v3c0,1.1,0.9,2,2,2h12c1.1,0,2-0.9,2-2v-3H18z M17,11l-1.41-1.41L13,12.17V4h-2v8.17L8.41,9.59L7,11l5,5 L17,11z\" />\n </g>\n </svg>,\n);\n\nconst Clipboard = Icon(\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24px\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n fill=\"currentColor\"\n >\n <path d=\"M0 0h24v24H0V0z\" fill=\"none\" />\n <path d=\"M19 2h-4.18C14.4.84 13.3 0 12 0S9.6.84 9.18 2H5c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm7 18H5V4h2v3h10V4h2v16z\" />\n </svg>,\n);\n\nconst ChevronRight = Icon(\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24px\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n fill=\"currentColor\"\n >\n <path d=\"M0 0h24v24H0V0z\" fill=\"none\" />\n <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6-6-6z\" />\n </svg>,\n);\n\nconst Search = Icon(\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24px\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n fill=\"currentColor\"\n >\n <path d=\"M0 0h24v24H0V0z\" fill=\"none\" />\n <path d=\"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\" />\n </svg>,\n);\n\nconst Clear = Icon(\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24px\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n fill=\"currentColor\"\n >\n <path d=\"M0 0h24v24H0V0z\" fill=\"none\" />\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z\" />\n </svg>,\n);\n\nconst ArrowDropDown = Icon(\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24px\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n fill=\"currentColor\"\n >\n <path d=\"M0 0h24v24H0V0z\" fill=\"none\" />\n <path d=\"M7 10l5 5 5-5H7z\" />\n </svg>,\n);\n\nconst FilterList = Icon(\n <svg viewBox=\"0 0 24 24\">\n <path\n fill=\"currentColor\"\n d=\"M14,12V19.88C14.04,20.18 13.94,20.5 13.71,20.71C13.32,21.1 12.69,21.1 12.3,20.71L10.29,18.7C10.06,18.47 9.96,18.16 10,17.87V12H9.97L4.21,4.62C3.87,4.19 3.95,3.56 4.38,3.22C4.57,3.08 4.78,3 5,3V3H19V3C19.22,3 19.43,3.08 19.62,3.22C20.05,3.56 20.13,4.19 19.79,4.62L14.03,12H14Z\"\n />\n </svg>,\n);\n\nconst ArrowUpward = Icon(\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24px\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n fill=\"currentColor\"\n >\n <path d=\"M0 0h24v24H0V0z\" fill=\"none\" />\n <path d=\"M4 12l1.41 1.41L11 7.83V20h2V7.83l5.58 5.59L20 12l-8-8-8 8z\" />\n </svg>,\n);\n\nexport const defaultIcons: TableTheme['icons'] = {\n Settings,\n Export,\n Clipboard,\n ChevronRight,\n Search,\n Clear,\n ArrowDropDown,\n FilterList,\n ArrowUpward,\n};\n","import type { TableTheme } from '../../types';\n\nexport const defaultTexts: TableTheme['text'] = {\n selectColumns: 'Select visible columns',\n showAllColumns: 'Show all',\n hideAllColumns: 'Hide all',\n noResults: 'No results',\n exportTitle: 'Export',\n exportCopy: 'To clipboard',\n exportDownload: 'Download',\n today: 'Today',\n thisWeek: 'This week',\n thisMonth: 'This month',\n thisYear: 'This year',\n lastSevenDays: 'Last 7 days',\n lastThirtyDays: 'Last 30 days',\n clearFilters: 'Clear all filters',\n reset: 'Reset',\n loading: 'Loading',\n deselectAll: 'Deselect all',\n resetAll: 'Reset table state',\n rangeMin: 'Min',\n rangeMax: 'Max',\n calendarWeek: 'Wk',\n};\n","import type { TableTheme } from '../../types';\nimport { defaultColors } from './defaultColors';\nimport { defaultComponents } from './defaultComponents';\nimport { defaultIcons } from './defaultIcons';\nimport { defaultTexts } from './defaultTexts';\n\nexport const defaultTableTheme: TableTheme = {\n text: defaultTexts,\n components: defaultComponents,\n icons: defaultIcons,\n colors: defaultColors,\n spacing: '5px',\n};\n","import type { DependencyList, ReactNode } from 'react';\nimport { createContext, useContext, useMemo } from 'react';\nimport type { FunctionWithDeps } from '../types';\n\nconst TableMemoContext = createContext(new Map<string, [value: any, deps: DependencyList]>());\n\nexport function TableMemoContextProvider({ children }: { children: ReactNode }) {\n return (\n <TableMemoContext.Provider value={useMemo(() => new Map(), [])}>\n {children}\n </TableMemoContext.Provider>\n );\n}\n\nexport function useTableMemo() {\n const memoCache = useContext(TableMemoContext);\n\n return <Function_ extends (...args: any[]) => any>(\n key: string,\n function_: FunctionWithDeps<Function_>,\n ): Function_ => {\n let deps: DependencyList;\n if (Array.isArray(function_)) {\n deps = function_.slice(1);\n function_ = function_[0];\n } else {\n deps = [function_.toString()];\n }\n\n let cachedValue = memoCache.get(key);\n const hit =\n cachedValue &&\n cachedValue[1].length === deps.length &&\n cachedValue[1].every((x, i) => x === deps[i]);\n if (!cachedValue || !hit) {\n cachedValue = [function_, deps];\n memoCache.set(key, cachedValue);\n }\n return cachedValue[0];\n };\n}\n","import { useContext } from 'react';\nimport { Store } from 'schummar-state/react';\nimport { ColumnContext, TableContext } from '../misc/tableContext';\nimport { defaultTableTheme } from '../theme/defaultTheme';\nimport { globalTableTheme, mergeThemes } from '../theme/tableTheme';\nimport type { MemoizedTableTheme, TableTheme } from '../types';\nimport { useTableMemo } from './useTableMemo';\nimport { TableSettingsContext } from '../misc/tableSettings';\n\nconst emptyStore = new Store(undefined);\n\nexport function useTheme<T, S>(selector: (theme: MemoizedTableTheme<T>) => S): S {\n const { theme: contextTableTheme = {} } = useContext(TableSettingsContext);\n const table = useContext(TableContext);\n const columnId = useContext(ColumnContext);\n const memo = useTableMemo();\n const _globalTableTheme = globalTableTheme.useState();\n\n const process = (t: TableTheme<T>): MemoizedTableTheme<T> => {\n const rowClass = t.classes?.row;\n const rowStyles = t.styles?.row;\n const cellClass = t.classes?.cell;\n const cellStyles = t.styles?.cell;\n const detailsClass = t.classes?.details;\n const detailsStyles = t.styles?.details;\n\n return {\n ...t,\n classes: {\n ...t.classes,\n row:\n rowClass instanceof Function || Array.isArray(rowClass)\n ? memo('theme.classes.row', rowClass)\n : rowClass,\n cell:\n cellClass instanceof Function || Array.isArray(cellClass)\n ? memo('theme.classes.cell', cellClass)\n : cellClass,\n details:\n detailsClass instanceof Function || Array.isArray(detailsClass)\n ? memo('theme.classes.details', detailsClass)\n : detailsClass,\n },\n styles: {\n ...t.styles,\n row:\n rowStyles instanceof Function || Array.isArray(rowStyles)\n ? memo('theme.styles.row', rowStyles)\n : rowStyles,\n cell:\n cellStyles instanceof Function || Array.isArray(cellStyles)\n ? memo('theme.styles.cell', cellStyles)\n : cellStyles,\n details:\n detailsStyles instanceof Function || Array.isArray(detailsStyles)\n ? memo('theme.styles.details', detailsStyles)\n : detailsStyles,\n },\n text: {\n ...t.text,\n },\n };\n };\n\n const theme =\n table?.useState((state) => {\n const localTheme = {\n text: state.props.text,\n classes: state.props.classes,\n styles: state.props.styles,\n components: state.props.components,\n icons: state.props.icons,\n colors: state.props.colors,\n spacing: state.props.spacing,\n };\n\n const column = state.activeColumns.find((column) => column.id === columnId);\n const columnsTheme = {\n classes: column?.classes,\n styles: column?.styles,\n };\n\n const theme = mergeThemes(\n defaultTableTheme,\n _globalTableTheme,\n contextTableTheme,\n localTheme,\n columnsTheme,\n ) as TableTheme<T>;\n\n return selector(process(theme));\n }) ??\n emptyStore.useState() ??\n selector(\n process(\n mergeThemes(defaultTableTheme, _globalTableTheme, contextTableTheme) as TableTheme<T>,\n ),\n );\n\n return theme;\n}\n","import { useTheme } from '../hooks/useTheme';\n\nexport function useCssVariables() {\n return useTheme(({ spacing, colors }) => {\n return {\n '--spacing': spacing,\n '--primaryMain': colors.primary.main,\n '--primaryLight': colors.primary.light,\n '--primaryContrastText': colors.primary.contrastText,\n '--secondaryMain': colors.secondary.main,\n '--secondaryLight': colors.secondary.light,\n '--secondaryContrastText': colors.secondary.contrastText,\n '--blockedMain': colors.blocked.main,\n '--blockedLight': colors.blocked.light,\n '--blockedContrastText': colors.blocked.contrastText,\n '--table-background-color': colors.background,\n '--table-text-color': colors.text,\n '--table-border-color': colors.border,\n '--table-border-light-color': colors.borderLight,\n };\n });\n}\n","import { ClassNames } from '@emotion/react';\nimport { createContext, useState } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { useColumnContext, useTableContext } from '../misc/tableContext';\nimport { useCssVariables } from '../theme/useCssVariables';\n\nexport const FilterControlContext = createContext({\n isActive: false,\n close: (): void => undefined,\n});\n\nexport function FilterControl<T>(): JSX.Element | null {\n const table = useTableContext<T>();\n const columnId = useColumnContext();\n\n const Popover = useTheme((t) => t.components.Popover);\n const classes = useTheme((t) => t.classes);\n const styles = useTheme((t) => t.styles);\n const IconButton = useTheme((t) => t.components.IconButton);\n const FilterList = useTheme((t) => t.icons.FilterList);\n const ArrowDropDown = useTheme((t) => t.icons.ArrowDropDown);\n const cssVariables = useCssVariables();\n\n const [anchor, setAnchor] = useState<Element | null>(null);\n const isActive = table.useState((state) => {\n const filter = state.filters.get(columnId);\n const filterValue = state.filterValues.get(columnId);\n return filter !== undefined && filterValue !== undefined && filter.isActive(filterValue);\n });\n const filterClassNames = table.useState((state) => {\n const filter = state.filters.get(columnId);\n return filter?.classNames;\n });\n const filter = table.useState(\n (state) => state.activeColumns.find((column) => column.id === columnId)?.filter,\n );\n\n function reset() {\n const impl = table.getState().filters.get(columnId);\n\n impl?.onChange?.(undefined);\n\n if (impl?.value === undefined) {\n table.update((state) => {\n state.filterValues.delete(columnId);\n });\n }\n }\n\n if (!filter) return null;\n\n function close() {\n setAnchor(null);\n }\n\n return (\n <FilterControlContext.Provider value={{ isActive: !!anchor, close }}>\n <IconButton\n onClick={(event) => setAnchor(event.currentTarget)}\n onContextMenu={(event) => {\n reset();\n event.preventDefault();\n return false;\n }}\n css={[\n { color: '#b0bac9' },\n isActive && {\n color: 'var(--primaryMain) !important',\n },\n ]}\n >\n {isActive ? <FilterList /> : <ArrowDropDown />}\n </IconButton>\n\n <div\n onPointerDown={(event) => {\n event.stopPropagation();\n }}\n onPointerMove={(event) => {\n event.stopPropagation();\n }}\n >\n <ClassNames>\n {({ css, cx }) => (\n <Popover\n open\n hidden={!anchor}\n onClose={close}\n anchorEl={anchor ?? document.body}\n css={[cssVariables, styles?.popover]}\n className={cx(classes?.popover, filterClassNames?.popover)}\n backdropClassName={cx(\n classes?.popoverBackdrop,\n filterClassNames?.popoverBackdrop,\n css(styles?.popoverBackdrop),\n )}\n >\n {filter}\n </Popover>\n )}\n </ClassNames>\n </div>\n </FilterControlContext.Provider>\n );\n}\n","import type { ComponentType } from 'react';\nimport { useContext, useLayoutEffect, useRef } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport type { TableTheme } from '../types';\nimport { FilterControlContext } from './filterControl';\n\ntype Props = TableTheme['components']['TextField'] extends ComponentType<infer T> ? T : never;\n\nexport function AutoFocusTextField(props: Omit<Props, 'inputRef'>) {\n const TextField = useTheme((t) => t.components.TextField);\n\n const ref = useRef<HTMLInputElement>(null);\n const { isActive } = useContext(FilterControlContext);\n\n useLayoutEffect(() => {\n if (isActive && ref.current) {\n setTimeout(() => {\n ref.current?.focus();\n });\n }\n }, [isActive]);\n\n return (\n <TextField\n {...props}\n inputRef={ref}\n css={{\n input: {\n backgroundColor: 'inherit',\n color: 'inherit',\n },\n }}\n />\n );\n}\n","export function debounce<Args extends any[]>(\n function_: (...args: Args) => void,\n ms: number,\n): { (...args: Args): void; flush(): void; cancel(): void } {\n let lastArgs: Args | undefined;\n let timeout: ReturnType<typeof setTimeout> | undefined;\n\n function run() {\n const args = lastArgs;\n\n lastArgs = undefined;\n timeout = undefined;\n\n function_(...(args as Args));\n }\n\n return Object.assign(\n function (...args: Args) {\n lastArgs = args;\n\n if (timeout) {\n clearTimeout(timeout);\n }\n\n timeout = setTimeout(run, ms);\n },\n {\n flush() {\n if (timeout) {\n clearTimeout(timeout);\n run();\n }\n },\n\n cancel() {\n if (timeout) {\n clearTimeout(timeout);\n timeout = undefined;\n lastArgs = undefined;\n }\n },\n },\n );\n}\n","import { castDraft } from 'immer';\nimport { nanoid } from 'nanoid';\nimport { useContext, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { FilterControlContext } from '../components/filterControl';\nimport { debounce } from '../misc/debounce';\nimport { useColumnContext, useTableContext } from '../misc/tableContext';\nimport type { FilterImplementation } from '../types';\nimport { useTableMemo } from './useTableMemo';\n\nexport function useFilter<TItem, TColumnValue, TFilterBy, TFilterValue>(\n impl: FilterImplementation<TItem, TColumnValue, TFilterBy, TFilterValue>,\n) {\n const table = useTableContext<TItem>();\n const columnId = useColumnContext();\n const cache = useTableMemo();\n const cacheId = useMemo(() => nanoid(), []);\n const filterBy = impl.filterBy && cache(cacheId, impl.filterBy);\n\n // On mount and reset: Fire onChange\n useEffect(() => {\n if (impl.value === undefined) {\n impl.onChange?.(impl.defaultValue);\n }\n }, [table]);\n\n // Update implementation\n useEffect(() => {\n table.update((state) => {\n if (impl.defaultValue !== undefined) {\n state.filterValues.set(columnId, impl.defaultValue);\n }\n });\n }, [table]);\n\n useEffect(() => {\n table.update((state) => {\n state.filters.set(columnId, castDraft({ ...impl, filterBy }));\n\n if (impl.value !== undefined) {\n state.filterValues.set(columnId, impl.value);\n }\n });\n\n return () => {\n table.update((state) => {\n state.filters.delete(columnId);\n });\n };\n }, [table, columnId, impl]);\n\n // Track local value and update it globally after delay\n const value = table.useState(\n (state) => state.filterValues.get(columnId) as TFilterValue | undefined,\n );\n const [dirtyValue, setDirtyValue] = useState<TFilterValue>();\n const implRef = useRef(impl);\n\n useLayoutEffect(() => {\n implRef.current = impl;\n });\n\n const delayedUpdate = useMemo(\n () =>\n debounce((value?: TFilterValue) => {\n const { value: controlledValue, onChange } = implRef.current;\n\n if (controlledValue === undefined) {\n table.update((state) => {\n state.filterValues.set(columnId, value);\n });\n }\n\n onChange?.(value);\n setDirtyValue(undefined);\n }, 500),\n [table],\n );\n\n function onChange(value?: TFilterValue) {\n setDirtyValue(value);\n delayedUpdate(value);\n }\n\n useEffect(() => delayedUpdate.flush(), [delayedUpdate]);\n\n const context = useContext(FilterControlContext);\n\n return {\n value: dirtyValue ?? value,\n onChange,\n filterBy: filterBy ?? ((x) => x as unknown as TFilterBy | TFilterBy[]),\n ...context,\n };\n}\n","import { forwardRef, useContext } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { useColumnContext, useTableContext } from '../misc/tableContext';\nimport { FilterControlContext } from './filterControl';\n\nexport default forwardRef(FilterDialog);\n\nfunction FilterDialog(_props: {}, ref: React.Ref<HTMLDialogElement>): JSX.Element | null {\n const table = useTableContext();\n const columnId = useColumnContext();\n\n const classes = useTheme((t) => t.classes);\n const styles = useTheme((t) => t.styles);\n const IconButton = useTheme((t) => t.components.IconButton);\n const FilterList = useTheme((t) => t.icons.FilterList);\n\n const filter = table.useState(\n (state) => state.activeColumns.find((column) => column.id === columnId)?.filter,\n );\n\n const label = table.useState((state) => {\n return state.activeColumns.find((column) => column.id === columnId)?.header ?? null;\n });\n\n const isActive = table.useState((state) => {\n const filter = state.filters.get(columnId);\n const filterValue = state.filterValues.get(columnId);\n return filter !== undefined && filterValue !== undefined && filter.isActive(filterValue);\n });\n\n const { close } = useContext(FilterControlContext);\n\n return (\n <dialog\n ref={ref}\n onClick={close}\n className={classes?.dialog}\n css={[\n {\n padding: 0,\n border: 'none',\n borderRadius: 4,\n\n '::backdrop': {\n backgroundColor: 'rgba(0, 0, 0, 0.7)',\n },\n },\n styles?.dialog,\n ]}\n >\n <div onClick={(e) => e.stopPropagation()}>\n <div\n css={{\n position: 'relative',\n padding: 10,\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n gap: 10,\n }}\n >\n <FilterList\n css={{\n color: isActive ? 'var(--primaryMain)' : '#b0bac9',\n }}\n />\n\n <div\n css={{\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n paddingRight: '2em',\n }}\n >\n {label}\n </div>\n\n <IconButton\n onClick={close}\n css={{\n position: 'absolute',\n right: 0,\n top: 0,\n fontSize: '1em',\n padding: '0.5em',\n margin: '0.5em',\n lineHeight: 1,\n }}\n >\n ✕\n </IconButton>\n </div>\n\n <div\n css={{\n overflow: 'auto',\n }}\n >\n {filter}\n </div>\n </div>\n </dialog>\n );\n}\n","import { useContext, useEffect, useRef } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { useColumnContext, useTableContext } from '../misc/tableContext';\nimport { FilterControlContext } from './filterControl';\nimport FilterDialog from './filterDialog';\n\nexport function NestedFilterControl<T>(): JSX.Element | null {\n const table = useTableContext<T>();\n const columnId = useColumnContext();\n const Button = useTheme((t) => t.components.Button);\n const FilterList = useTheme((t) => t.icons.FilterList);\n const dialog = useRef<HTMLDialogElement>(null);\n const label = table.useState((state) => {\n return state.activeColumns.find((column) => column.id === columnId)?.header ?? null;\n });\n\n const isActive = table.useState((state) => {\n const filter = state.filters.get(columnId);\n const filterValue = state.filterValues.get(columnId);\n return filter !== undefined && filterValue !== undefined && filter.isActive(filterValue);\n });\n\n const filter = table.useState(\n (state) => state.activeColumns.find((column) => column.id === columnId)?.filter,\n );\n\n useEffect(\n () => () => {\n dialog.current?.close();\n },\n [],\n );\n\n if (!filter) return null;\n\n function reset() {\n const impl = table.getState().filters.get(columnId);\n\n impl?.onChange?.(undefined);\n\n if (impl?.value === undefined) {\n table.update((state) => {\n state.filterValues.delete(columnId);\n });\n }\n }\n\n const parentContext = useContext(FilterControlContext);\n\n function close() {\n dialog.current?.close();\n parentContext.close();\n }\n\n return (\n <FilterControlContext.Provider value={{ isActive: true, close }}>\n <Button\n onClick={() => dialog.current?.showModal()}\n onContextMenu={(event) => {\n reset();\n event.preventDefault();\n return false;\n }}\n startIcon={\n <FilterList\n css={{\n color: isActive ? 'var(--primaryMain)' : '#b0bac9',\n }}\n />\n }\n css={{\n width: '100%',\n color: isActive ? 'var(--primaryMain)' : 'var(--color-text)',\n }}\n >\n {label}\n </Button>\n\n <div\n onPointerDown={(event) => {\n event.stopPropagation();\n }}\n onPointerMove={(event) => {\n event.stopPropagation();\n }}\n >\n <FilterDialog ref={dialog} />\n </div>\n </FilterControlContext.Provider>\n );\n}\n","import { useFilter } from '../hooks/useFilter';\nimport { ColumnContext, useTableContext } from '../misc/tableContext';\nimport type { CommonFilterProps } from '../types';\nimport { NestedFilterControl } from './nestedFilterControl';\n\nexport interface CombinedFilterProps\n extends Pick<CommonFilterProps<any, any, any, any>, 'classNames'> {\n columnIds?: string[];\n}\n\nexport default function CombinedFilter({\n columnIds: inputColumnIds,\n ...props\n}: CombinedFilterProps) {\n const table = useTableContext();\n\n const columnIds = table.useState((state) => {\n return (\n inputColumnIds ??\n state.activeColumns\n .filter(\n (column) =>\n column.filter !== undefined && !state.visibleColumns.some((c) => c.id === column.id),\n )\n .map((column) => column.id)\n );\n });\n\n const isActive = table.useState((state) => {\n return columnIds.some((columnId) => {\n const filter = state.filters.get(columnId);\n const filterValue = state.filterValues.get(columnId);\n return filter !== undefined && filterValue !== undefined && filter.isActive(filterValue);\n });\n });\n\n useFilter({\n ...props,\n\n id: 'combinedFilter',\n\n value: isActive,\n\n isActive(filterValue) {\n return filterValue;\n },\n\n test() {\n return true;\n },\n\n onChange(value) {\n if (value === undefined) {\n for (const columnId of columnIds) {\n const impl = table.getState().filters.get(columnId);\n\n impl?.onChange?.(undefined);\n\n if (impl?.value === undefined) {\n table.update((state) => {\n state.filterValues.delete(columnId);\n });\n }\n }\n }\n },\n });\n\n return (\n <div>\n {columnIds.map((columnId) => (\n <ColumnContext.Provider key={columnId} value={columnId}>\n <NestedFilterControl />\n </ColumnContext.Provider>\n ))}\n </div>\n );\n}\n","export function defaults<T extends object>(first: T, ...more: Partial<T>[]): T {\n return more.reduce<T>((acc, source) => {\n const copy = { ...acc };\n\n for (const [key, value] of Object.entries(source)) {\n copy[key as keyof T] ??= value as any;\n }\n\n return copy;\n }, first);\n}\n","import { addDays, isBefore, isToday, startOfDay, differenceInCalendarMonths } from 'date-fns';\nimport { SyntheticEvent } from 'react';\n\nexport type DayzedDateObject = {\n date: Date;\n nextMonth: boolean;\n prevMonth: boolean;\n selectable: boolean;\n selected: boolean;\n today: boolean;\n};\n\nexport type DayzedCalendar = {\n firstDayOfMonth: Date;\n lastDayOfMonth: Date;\n month: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11;\n weeks: Array<Array<DayzedDateObject | ''>>;\n year: number;\n};\n\n/**\n * This is intended to be used to compose event handlers\n * They are executed in order until one of them calls\n * `event.preventDefault()`. Not sure this is the best\n * way to do this, but it seems legit...\n * @param {Function} fns the event hanlder functions\n * @return {Function} the event handler to add to an element\n */\nexport function composeEventHandlers(\n ...fns: (((event: SyntheticEvent, ...args: any[]) => any) | undefined)[]\n) {\n return (event: SyntheticEvent, ...args: any[]) =>\n fns.some((fn) => {\n if (fn) {\n fn(event, ...args);\n }\n return event.defaultPrevented;\n });\n}\n\n/**\n * Throws a helpful error message for required properties. Useful\n * to be used as a default in destructuring or object params.\n * @param {String} fnName the function name\n * @param {String} propName the prop name\n */\nexport function requiredProp(fnName: string, propName: string): never {\n throw new Error(`The property \"${propName}\" is required in \"${fnName}\"`);\n}\n\n/**\n * Takes a calendars array and figures out the number of months to subtract\n * based on the current offset and the minDate allowed.\n * @param {Object} param The param object\n * @param {Array} param.calendars The calendars array created by the getCalendars function\n * @param {Number} param.offset The num of months to be subtracted\n * @param {Date} param.minDate The earliest date we are allow to subtract back to\n * @returns {Number} The number of months to subtract\n */\nexport function subtractMonth({\n calendars,\n offset,\n minDate,\n}: {\n calendars: DayzedCalendar[];\n offset: number;\n minDate?: Date;\n}) {\n if (offset > 1 && minDate) {\n const { firstDayOfMonth } = calendars[0]!;\n const diffInMonths = differenceInCalendarMonths(firstDayOfMonth, minDate);\n if (diffInMonths < offset) {\n offset = diffInMonths;\n }\n }\n return offset;\n}\n\n/**\n * Takes a calendars array and figures out the number of months to add\n * based on the current offset and the maxDate allowed.\n * @param {Object} param The param object\n * @param {Array} param.calendars The calendars array created by the getCalendars function\n * @param {Number} param.offset The num of months to be added\n * @param {Date} param.maxDate The furthest date we are allow to add forward to\n * @returns {Number} The number of months to add\n */\nexport function addMonth({\n calendars,\n offset,\n maxDate,\n}: {\n calendars: DayzedCalendar[];\n offset: number;\n maxDate?: Date;\n}) {\n if (offset > 1 && maxDate) {\n const { lastDayOfMonth } = calendars[calendars.length - 1]!;\n const diffInMonths = differenceInCalendarMonths(maxDate, lastDayOfMonth);\n if (diffInMonths < offset) {\n offset = diffInMonths;\n }\n }\n return offset;\n}\n\n/**\n * Takes a calendars array and figures out if the back button should be\n * disabled based on the minDate allowed.\n * @param {Object} param The param object\n * @param {Array} param.calendars The calendars array created by the getCalendars function\n * @param {Date} param.minDate The earliest date available\n * @returns {Boolean} Whether the back button should be disabled.\n */\nexport function isBackDisabled({\n calendars,\n minDate,\n}: {\n calendars: DayzedCalendar[];\n minDate?: Date;\n}) {\n if (!minDate) {\n return false;\n }\n const { firstDayOfMonth } = calendars[0]!;\n const firstDayOfMonthMinusOne = addDays(firstDayOfMonth, -1);\n if (isBefore(firstDayOfMonthMinusOne, minDate)) {\n return true;\n }\n return false;\n}\n\n/**\n * Takes a calendars array and figures out if the forward button should be\n * disabled based on the maxDate allowed.\n * @param {Object} param The param object\n * @param {Array} param.calendars The calendars array created by the getCalendars function\n * @param {Date} param.maxDate The furthest date available\n * @returns {Boolean} Whether the forward button should be disabled.\n */\nexport function isForwardDisabled({\n calendars,\n maxDate,\n}: {\n calendars: DayzedCalendar[];\n maxDate?: Date;\n}) {\n if (!maxDate) {\n return false;\n }\n const { lastDayOfMonth } = calendars[calendars.length - 1]!;\n const lastDayOfMonthPlusOne = addDays(lastDayOfMonth, 1);\n if (isBefore(maxDate, lastDayOfMonthPlusOne)) {\n return true;\n }\n return false;\n}\n\n/**\n * Figures out the months data needed based off the number of monthsToDisplay\n * and other options provided.\n * @param {Object} param The param object\n * @param {Date} param.date The date to start the calendar at\n * @param {Array.<Date>} param.selected An array of dates currently selected\n * @param {Number} param.monthsToDisplay The number of months to return in the calendar view\n * @param {Number} param.offset The number of months to offset based off the param.date given\n * @param {Date} param.minDate The earliest date available\n * @param {Date} param.maxDate The furthest date available\n * @param {Number} param.firstDayOfWeek First day of week, 0-6 (Sunday to Saturday)\n * @param {Bool} param.showOutsideDays Flag to fill front and back weeks with dates from adjacent months\n * @returns {Array.<Object>} An array of objects with month data\n */\nexport function getCalendars({\n date,\n selected,\n monthsToDisplay,\n offset,\n minDate,\n maxDate,\n firstDayOfWeek,\n showOutsideDays,\n}: {\n date: Date;\n selected: Date[];\n monthsToDisplay: number;\n offset: number;\n minDate?: Date;\n maxDate?: Date;\n firstDayOfWeek: number;\n showOutsideDays: boolean;\n}): DayzedCalendar[] {\n const months: DayzedCalendar[] = [];\n const startDate = getStartDate(date, minDate, maxDate);\n for (let i = 0; i < monthsToDisplay; i++) {\n const calendarDates = getMonths({\n month: startDate.getMonth() + i + offset,\n year: startDate.getFullYear(),\n selectedDates: selected,\n minDate,\n maxDate,\n firstDayOfWeek,\n showOutsideDays,\n });\n months.push(calendarDates);\n }\n return months;\n}\n\n/**\n * Figures out the actual start date based on\n * the min and max dates available.\n * @param {Date} date The we want to start the calendar at\n * @param {Date} minDate The earliest date available to start at\n * @param {Date} maxDate The latest date available to start at\n * @returns {Date} The actual start date\n */\nfunction getStartDate(date: Date, minDate?: Date, maxDate?: Date): Date {\n let startDate = startOfDay(date);\n if (minDate) {\n const minDateNormalized = startOfDay(minDate);\n if (isBefore(startDate, minDateNormalized)) {\n startDate = minDateNormalized;\n }\n }\n if (maxDate) {\n const maxDateNormalized = startOfDay(maxDate);\n if (isBefore(maxDateNormalized, startDate)) {\n startDate = maxDateNormalized;\n }\n }\n return startDate;\n}\n\n/**\n * Figures what week/day data to return for the given month\n * and year. Adds flags to day data if found in the given selectedDates,\n * if is selectable inside the given min and max dates, or is today.\n * @param {Object} param The param object\n * @param {Number} param.month The month to grab data for\n * @param {Number} param.year The year to grab data for\n * @param {Array.<Date>} param.selectedDates An array of dates currently selected\n * @param {Date} param.minDate The earliest date available\n * @param {Date} param.maxDate The furthest date available\n * @param {Number} param.firstDayOfWeek First day of week, 0-6 (Sunday to Saturday)\n * @param {Bool} param.showOutsideDays Flag to fill front and back weeks with dates from adjacent months\n * @returns {Object} The data for the selected month/year\n */\nfunction getMonths({\n month,\n year,\n selectedDates,\n minDate,\n maxDate,\n firstDayOfWeek,\n showOutsideDays,\n}: {\n month: number;\n year: number;\n selectedDates: Date[];\n minDate?: Date;\n maxDate?: Date;\n firstDayOfWeek: number;\n showOutsideDays: boolean;\n}): DayzedCalendar {\n // Get the normalized month and year, along with days in the month.\n const daysMonthYear = getNumDaysMonthYear(month, year);\n const daysInMonth = daysMonthYear.daysInMonth;\n month = daysMonthYear.month;\n year = daysMonthYear.year;\n\n // Fill out the dates for the month.\n const dates: ('' | DayzedDateObject)[] = [];\n for (let day = 1; day <= daysInMonth; day++) {\n const date = new Date(year, month, day);\n const dateObj = {\n date,\n selected: isSelected(selectedDates, date),\n selectable: isSelectable(minDate, maxDate, date),\n today: isToday(date),\n prevMonth: false,\n nextMonth: false,\n };\n dates.push(dateObj);\n }\n\n const firstDayOfMonth = new Date(year, month, 1);\n const lastDayOfMonth = new Date(year, month, daysInMonth);\n\n const frontWeekBuffer = fillFrontWeek({\n firstDayOfMonth,\n minDate,\n maxDate,\n selectedDates,\n firstDayOfWeek,\n showOutsideDays,\n });\n\n const backWeekBuffer = fillBackWeek({\n lastDayOfMonth,\n minDate,\n maxDate,\n selectedDates,\n firstDayOfWeek,\n showOutsideDays,\n });\n\n dates.unshift(...frontWeekBuffer);\n dates.push(...backWeekBuffer);\n\n // Get the filled out weeks for the\n // given dates.\n const weeks = getWeeks(dates);\n // return the calendar data.\n return {\n firstDayOfMonth,\n lastDayOfMonth,\n month: month as DayzedCalendar['month'],\n year,\n weeks,\n };\n}\n\n/**\n * Fill front week with either empty buffer or dates from previous month,\n * depending on showOutsideDays flag\n * @param {Object} param The param object\n * @param {Array.<Date>} param.selectedDates An array of dates currently selected\n * @param {Date} param.minDate The earliest date available\n * @param {Date} param.maxDate The furthest date available\n * @param {Date} param.firstDayOfMonth First day of the month\n * @param {Number} param.firstDayOfWeek First day of week, 0-6 (Sunday to Saturday)\n * @param {Bool} param.showOutsideDays Flag to fill front and back weeks with dates from adjacent months\n * @returns {Array.<Date>} Buffer to fill front week\n */\nfunction fillFrontWeek({\n firstDayOfMonth,\n minDate,\n maxDate,\n selectedDates,\n firstDayOfWeek,\n showOutsideDays,\n}: {\n firstDayOfMonth: Date;\n minDate?: Date;\n maxDate?: Date;\n selectedDates: Date[];\n firstDayOfWeek: number;\n showOutsideDays: boolean;\n}) {\n const dates: ('' | DayzedDateObject)[] = [];\n let firstDay = (firstDayOfMonth.getDay() + 7 - firstDayOfWeek) % 7;\n\n if (showOutsideDays) {\n const lastDayOfPrevMonth = addDays(firstDayOfMonth, -1);\n const prevDate = lastDayOfPrevMonth.getDate();\n const prevDateMonth = lastDayOfPrevMonth.getMonth();\n const prevDateYear = lastDayOfPrevMonth.getFullYear();\n\n // Fill out front week for days from\n // preceding month with dates from previous month.\n let counter = 0;\n while (counter < firstDay) {\n const date = new Date(prevDateYear, prevDateMonth, prevDate - counter);\n const dateObj = {\n date,\n selected: isSelected(selectedDates, date),\n selectable: isSelectable(minDate, maxDate, date),\n today: false,\n prevMonth: true,\n nextMonth: false,\n };\n dates.unshift(dateObj);\n counter++;\n }\n } else {\n // Fill out front week for days from\n // preceding month with buffer.\n while (firstDay > 0) {\n dates.unshift('');\n firstDay--;\n }\n }\n\n return dates;\n}\n\n/**\n * Fill back weeks with either empty buffer or dates from next month,\n * depending on showOutsideDays flag\n * @param {Object} param The param object\n * @param {Array.<Date>} param.selectedDates An array of dates currently selected\n * @param {Date} param.minDate The earliest date available\n * @param {Date} param.maxDate The furthest date available\n * @param {Date} param.lastDayOfMonth Last day of the month\n * @param {Number} param.firstDayOfWeek First day of week, 0-6 (Sunday to Saturday)\n * @param {Bool} param.showOutsideDays Flag to fill front and back weeks with dates from adjacent months\n * @returns {Array.<Date>} Buffer to fill back week\n */\nfunction fillBackWeek({\n lastDayOfMonth,\n minDate,\n maxDate,\n selectedDates,\n firstDayOfWeek,\n showOutsideDays,\n}: {\n lastDayOfMonth: Date;\n minDate?: Date;\n maxDate?: Date;\n selectedDates: Date[];\n firstDayOfWeek: number;\n showOutsideDays: boolean;\n}) {\n const dates: ('' | DayzedDateObject)[] = [];\n let lastDay = (lastDayOfMonth.getDay() + 7 - firstDayOfWeek) % 7;\n\n if (showOutsideDays) {\n const firstDayOfNextMonth = addDays(lastDayOfMonth, 1);\n const nextDateMonth = firstDayOfNextMonth.getMonth();\n const nextDateYear = firstDayOfNextMonth.getFullYear();\n\n // Fill out back week for days from\n // following month with dates from next month.\n let counter = 0;\n while (counter < 6 - lastDay) {\n const date = new Date(nextDateYear, nextDateMonth, 1 + counter);\n const dateObj = {\n date,\n selected: isSelected(selectedDates, date),\n selectable: isSelectable(minDate, maxDate, date),\n today: false,\n prevMonth: false,\n nextMonth: true,\n };\n dates.push(dateObj);\n counter++;\n }\n } else {\n // Fill out back week for days from\n // following month with buffer.\n while (lastDay < 6) {\n dates.push('');\n lastDay++;\n }\n }\n\n return dates;\n}\n\n/**\n * Normalizes month (could be overflow) and year pairs and returns the\n * normalized month and year along with the number of days in the month.\n * @param {Number} month The month to normalize\n * @param {Number} year The year to normalize\n * @returns {Object} The normalized month and year along with the number of days in the month\n */\nfunction getNumDaysMonthYear(month: number, year: number) {\n // If a parameter you specify is outside of the expected range for Month or Day,\n // JS Date attempts to update the date information in the Date object accordingly!\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setMonth\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setDate\n\n // Let Date handle the overflow of the month,\n // which should return the normalized month and year.\n const normalizedMonthYear = new Date(year, month, 1);\n month = normalizedMonthYear.getMonth();\n year = normalizedMonthYear.getFullYear();\n // Overflow the date to the next month, then subtract the difference\n // to get the number of days in the previous month.\n // This will also account for leap years!\n const daysInMonth = 32 - new Date(year, month, 32).getDate();\n return { daysInMonth, month, year };\n}\n\n/**\n * Takes an array of dates, and turns them into a multi dimensional\n * array with 7 entries for each week.\n * @param {Array.<Object>} dates An array of dates\n * @returns {Array} The weeks as a multi dimensional array\n */\nfunction getWeeks(dates: ('' | DayzedDateObject)[]) {\n const weeksLength = Math.ceil(dates.length / 7);\n const weeks: ('' | DayzedDateObject)[][] = [];\n for (let i = 0; i < weeksLength; i++) {\n weeks[i] = [];\n for (let x = 0; x < 7; x++) {\n weeks[i]!.push(dates[i * 7 + x]!);\n }\n }\n return weeks;\n}\n\n/**\n * Normalizes dates to the beginning of the day,\n * then checks to see if the day given is found\n * in the selectedDates.\n * @param {Array.<Date>} selectedDates An array of dates currently selected\n * @param {Date} date The date to search with against selectedDates\n * @returns {Boolean} Whether day is found in selectedDates\n */\nfunction isSelected(selectedDates: Date[], date: Date): boolean {\n selectedDates = Array.isArray(selectedDates) ? selectedDates : [selectedDates];\n return selectedDates.some((selectedDate) => {\n if (\n selectedDate instanceof Date &&\n startOfDay(selectedDate).getTime() === startOfDay(date).getTime()\n ) {\n return true;\n }\n return false;\n });\n}\n\n/**\n * Checks to see if the date given is\n * between the min and max dates.\n * @param {Date} minDate The earliest date available\n * @param {Date} maxDate The furthest date available\n * @param {Date} date The date to compare with\n * @returns {Boolean} Whether the date is between min and max date\n */\nfunction isSelectable(minDate: Date | undefined, maxDate: Date | undefined, date: Date): boolean {\n if ((minDate && isBefore(date, minDate)) || (maxDate && isBefore(maxDate, date))) {\n return false;\n }\n return true;\n}\n","import { HTMLProps, SyntheticEvent, useState } from 'react';\n\nimport {\n composeEventHandlers,\n requiredProp,\n subtractMonth,\n addMonth,\n isBackDisabled,\n isForwardDisabled,\n getCalendars,\n type DayzedDateObject,\n type DayzedCalendar,\n} from './utils';\n\nfunction isOffsetControlled(propOffset: number | undefined) {\n return propOffset !== undefined;\n}\n\nfunction getOffset(prop: number | undefined, state: number) {\n return isOffsetControlled(prop) ? prop : state;\n}\n\nfunction getDateProps(\n onDateSelected: ((date: DayzedDateObject, event: SyntheticEvent) => void) | undefined,\n {\n onClick,\n dateObj = requiredProp('getDateProps', 'dateObj'),\n ...rest\n }: Partial<GetDatePropsOptions> = {},\n) {\n return {\n onClick: composeEventHandlers(onClick as any, (event) => {\n onDateSelected?.(dateObj, event);\n }),\n disabled: !dateObj.selectable,\n 'aria-label': dateObj.date.toDateString(),\n 'aria-pressed': dateObj.selected,\n role: 'button',\n ...rest,\n };\n}\n\nfunction getBackProps(\n {\n minDate,\n offsetMonth,\n handleOffsetChanged,\n }: {\n minDate?: Date;\n offsetMonth: number;\n handleOffsetChanged: (offset: number) => void;\n },\n {\n onClick,\n offset = 1,\n calendars = requiredProp('getBackProps', 'calendars'),\n ...rest\n }: Partial<GetBackForwardPropsOptions> = {},\n) {\n return {\n onClick: composeEventHandlers(onClick as any, () => {\n handleOffsetChanged(offsetMonth - subtractMonth({ calendars, offset, minDate }));\n }),\n disabled: isBackDisabled({ calendars, minDate }),\n 'aria-label': `Go back ${offset} month${offset === 1 ? '' : 's'}`,\n ...rest,\n };\n}\n\nfunction getForwardProps(\n {\n maxDate,\n offsetMonth,\n handleOffsetChanged,\n }: {\n maxDate?: Date;\n offsetMonth: number;\n handleOffsetChanged: (offset: number) => void;\n },\n {\n onClick,\n offset = 1,\n calendars = requiredProp('getForwardProps', 'calendars'),\n ...rest\n }: Partial<GetBackForwardPropsOptions> = {},\n) {\n return {\n onClick: composeEventHandlers(onClick as any, () => {\n handleOffsetChanged(offsetMonth + addMonth({ calendars, offset, maxDate }));\n }),\n disabled: isForwardDisabled({ calendars, maxDate }),\n 'aria-label': `Go forward ${offset} month${offset === 1 ? '' : 's'}`,\n ...rest,\n };\n}\n\nexport function useDayzed({\n date = new Date(),\n maxDate,\n minDate,\n monthsToDisplay = 1,\n firstDayOfWeek = 0,\n showOutsideDays = false,\n offset,\n onDateSelected,\n onOffsetChanged = () => {},\n selected,\n}: {\n date?: Date;\n maxDate?: Date;\n minDate?: Date;\n monthsToDisplay?: number;\n firstDayOfWeek?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n showOutsideDays?: boolean;\n selected?: Date | Date[];\n offset?: number;\n onOffsetChanged?(offset: number): void;\n onDateSelected(selectedDate: DayzedDateObject, event: SyntheticEvent): void;\n}): RenderProps {\n const [stateOffset, setStateOffset] = useState(0);\n const offsetMonth = getOffset(offset, stateOffset);\n\n function handleOffsetChanged(newOffset: number) {\n if (!isOffsetControlled(offset)) {\n setStateOffset(newOffset);\n }\n onOffsetChanged(newOffset);\n }\n\n const calendars = getCalendars({\n date,\n selected: Array.isArray(selected) ? selected : selected ? [selected] : [],\n monthsToDisplay,\n minDate,\n maxDate,\n offset: offsetMonth,\n firstDayOfWeek,\n showOutsideDays,\n });\n return {\n calendars,\n getDateProps: getDateProps.bind(null, onDateSelected),\n getBackProps: getBackProps.bind(null, {\n minDate,\n offsetMonth,\n handleOffsetChanged,\n }),\n getForwardProps: getForwardProps.bind(null, {\n maxDate,\n offsetMonth,\n handleOffsetChanged,\n }),\n };\n}\n\ninterface GetBackForwardPropsOptions extends HTMLProps<HTMLButtonElement> {\n calendars: DayzedCalendar[];\n offset?: number;\n}\n\ninterface GetDatePropsOptions extends HTMLProps<HTMLButtonElement> {\n dateObj: DayzedDateObject;\n}\n\ninterface RenderProps {\n calendars: DayzedCalendar[];\n getBackProps: (data: GetBackForwardPropsOptions) => Record<string, any>;\n getForwardProps: (data: GetBackForwardPropsOptions) => Record<string, any>;\n getDateProps: (data: GetDatePropsOptions) => Record<string, any>;\n}\n\nexport type { DayzedDateObject } from './utils';\n","import { useEffect, useRef } from 'react';\n\nexport default function useLatestRef<T>(value: T) {\n const latestValue = useRef(value);\n\n useEffect(() => {\n latestValue.current = value;\n }, [value]);\n\n return latestValue;\n}\n","import { nanoid } from 'nanoid';\nimport { Fragment, useMemo, useState } from 'react';\nimport useLatestRef from '../hooks/useLatestRef';\nimport { debounce } from '../misc/debounce';\n\nexport interface DateInputProps {\n value: Date | null;\n onChange: (date: Date | null) => void;\n locale?: string;\n}\n\ntype Part = 'day' | 'month' | 'year';\n\nconst className = 'schummar-table-date-input';\nconst defaultDate = new Date(1970, 0, 1);\n\nconst isIncludedType = (type: Intl.DateTimeFormatPartTypes): type is Part =>\n type === 'day' || type === 'month' || type === 'year';\n\nconst maxValues = {\n day: 31,\n month: 12,\n year: 9999,\n};\n\nconst tabNext = (event: Element, id: string) => {\n const all = Array.from(document.querySelectorAll(`.${className}-${id}`));\n const index = all.indexOf(event);\n const next = all[index + 1];\n\n if (next instanceof HTMLElement) {\n next.focus();\n }\n};\n\nfunction buildDate(value: Partial<Record<Part, string>>, baseDate = new Date()): Date {\n const date = new Date(baseDate);\n\n if (value.year) {\n date.setFullYear(Number(value.year));\n }\n\n if (value.month) {\n date.setMonth(Number(value.month) - 1);\n }\n\n if (value.day) {\n date.setDate(Number(value.day));\n }\n\n return date;\n}\n\nexport function DateInput({ value, onChange, locale }: DateInputProps) {\n const id = useMemo(() => nanoid(), []);\n const [localValue, setLocalValue] = useState<Partial<Record<Part, string>>>();\n const latestValue = useLatestRef(value);\n\n const commit = useMemo(\n () =>\n debounce(\n (\n localValue: Partial<Record<Part, string>> = {},\n value: Date | null,\n onChange: (date: Date | null) => void,\n ) => {\n if (value !== latestValue.current) {\n // Value has been changed from outside, don't override it.\n return;\n }\n\n const date = buildDate(localValue, value ?? undefined);\n setLocalValue(undefined);\n onChange(isNaN(date.getTime()) ? null : date);\n },\n 100,\n ),\n [],\n );\n\n const format = useMemo(\n () =>\n new Intl.DateTimeFormat(locale, {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n }),\n [locale],\n );\n\n let parts;\n try {\n parts = format.formatToParts(value ?? defaultDate);\n } catch {\n parts = format.formatToParts(defaultDate);\n }\n\n const isEmpty = !value;\n\n return (\n <div\n css={{\n display: 'flex',\n alignItems: 'baseline',\n }}\n >\n {parts.map(({ type, value: partValue }, index) => (\n <Fragment key={index}>\n {isIncludedType(type) ? (\n <input\n className={`${className}-${id}`}\n css={{\n boxSizing: 'content-box',\n overflow: 'visible',\n border: 'none',\n borderBottom: '2px solid transparent',\n outline: 'none',\n fontSize: 'inherit',\n backgroundColor: 'inherit',\n color: 'inherit',\n\n '::placeholder': {\n color: 'inherit',\n opacity: 0.5,\n },\n\n '&:focus': {\n borderBottom: '2px solid var(--primaryMain)',\n },\n }}\n style={{\n width: `${String(maxValues[type]).length}ch`,\n }}\n placeholder={''.padEnd(String(maxValues[type]).length, '0')}\n value={localValue?.[type] ?? (isEmpty ? '' : partValue)}\n onChange={(event) => {\n const input = event.target.value;\n if (!/^\\d*$/.test(input)) return;\n\n const newValue = { ...localValue, [type]: input };\n\n if (Number(input) > maxValues[type]) {\n newValue[type] = String(maxValues[type]);\n }\n\n setLocalValue(newValue);\n\n if (input.length >= String(maxValues[type]).length) {\n setTimeout(() => tabNext(event.target, id));\n }\n }}\n onFocus={(event) => {\n commit.cancel();\n event.target.select();\n }}\n onBlur={() => {\n commit(localValue, value, onChange);\n }}\n />\n ) : type === 'literal' ? (\n <span>{partValue}</span>\n ) : null}\n </Fragment>\n ))}\n </div>\n );\n}\n","import { useTheme } from '../hooks/useTheme';\nimport type { TableTheme } from '../types';\n\nexport interface TextProps {\n id: keyof TableTheme['text'];\n}\n\nexport function Text({ id }: TextProps) {\n const text = useTheme((t) => t.text[id]);\n\n return <>{text}</>;\n}\n","import { nanoid } from 'nanoid';\nimport { Fragment, useMemo, useState } from 'react';\nimport { debounce } from '../misc/debounce';\nimport useLatestRef from '../hooks/useLatestRef';\n\nexport interface TimeInputProps {\n value: Date | null;\n onChange: (date: Date | null) => void;\n locale?: string;\n showSeconds?: boolean;\n}\n\ntype Part = 'hour' | 'minute' | 'second';\n\nconst className = 'schummar-table-time-input';\nconst defaultDate = new Date(1970, 0, 1);\n\nconst isIncludedType = (type: Intl.DateTimeFormatPartTypes): type is Part =>\n type === 'hour' || type === 'minute' || type === 'second';\n\nconst maxValues = {\n hour: 23,\n minute: 59,\n second: 59,\n};\n\nconst tabNext = (event: Element, id: string) => {\n const all = Array.from(document.querySelectorAll(`.${className}-${id}`));\n const index = all.indexOf(event);\n const next = all[index + 1];\n\n if (next instanceof HTMLElement) {\n next.focus();\n }\n};\n\nfunction buildTime(value: Partial<Record<Part, string>>, baseDate = new Date()): Date {\n const date = new Date(baseDate);\n\n if (value.hour) {\n date.setHours(Number(value.hour));\n }\n\n if (value.minute) {\n date.setMinutes(Number(value.minute));\n }\n\n if (value.second) {\n date.setSeconds(Number(value.second));\n }\n\n return date;\n}\n\nexport function TimeInput({ value, onChange, locale, showSeconds = true }: TimeInputProps) {\n const id = useMemo(() => nanoid(), []);\n const [localValue, setLocalValue] = useState<Partial<Record<Part, string>>>();\n const latestValue = useLatestRef(value);\n\n const commit = useMemo(\n () =>\n debounce(\n (\n localValue: Partial<Record<Part, string>> = {},\n value: Date | null,\n onChange: (date: Date | null) => void,\n ) => {\n if (value !== latestValue.current) {\n // Value has been changed from outside, don't override it.\n return;\n }\n\n const date = buildTime(localValue, value ?? undefined);\n setLocalValue(undefined);\n onChange(isNaN(date.getTime()) ? null : date);\n },\n 100,\n ),\n [],\n );\n\n const format = useMemo(\n () =>\n new Intl.DateTimeFormat(locale, {\n hour: '2-digit',\n minute: '2-digit',\n second: showSeconds ? '2-digit' : undefined,\n }),\n [locale],\n );\n\n let parts;\n try {\n parts = format.formatToParts(value ?? defaultDate);\n } catch {\n parts = format.formatToParts(defaultDate);\n }\n\n const isEmpty = !value;\n\n return (\n <div\n css={{\n display: 'flex',\n alignItems: 'baseline',\n }}\n >\n {parts.map(({ type, value: partValue }, index) => (\n <Fragment key={index}>\n {isIncludedType(type) ? (\n <input\n className={`${className}-${id}`}\n css={{\n boxSizing: 'content-box',\n overflow: 'visible',\n border: 'none',\n borderBottom: '2px solid transparent',\n outline: 'none',\n fontSize: 'inherit',\n backgroundColor: 'inherit',\n color: 'inherit',\n\n '::placeholder': {\n color: 'inherit',\n opacity: 0.5,\n },\n\n '&:focus': {\n borderBottom: '2px solid var(--primaryMain)',\n },\n }}\n style={{\n width: `${String(maxValues[type]).length}ch`,\n }}\n placeholder={''.padEnd(String(maxValues[type]).length, '0')}\n value={localValue?.[type] ?? (isEmpty ? '' : partValue)}\n onChange={(event) => {\n const input = event.target.value;\n if (!/^\\d*$/.test(input)) return;\n\n const newValue = { ...localValue, [type]: input };\n\n if (Number(input) > maxValues[type]) {\n newValue[type] = String(maxValues[type]);\n }\n\n setLocalValue(newValue);\n\n if (input.length >= String(maxValues[type]).length) {\n setTimeout(() => tabNext(event.target, id));\n }\n }}\n onFocus={(event) => {\n commit.cancel();\n event.target.select();\n }}\n onBlur={() => {\n commit(localValue, value, onChange);\n }}\n />\n ) : type === 'literal' ? (\n <span>{partValue}</span>\n ) : null}\n </Fragment>\n ))}\n </div>\n );\n}\n","import { Interpolation, Theme } from '@emotion/react';\nimport {\n Fragment,\n ReactNode,\n createContext,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport { Temporal } from 'temporal-polyfill';\nimport { useTheme } from '../hooks/useTheme';\nimport { defaults } from '../misc/defaults';\nimport { useCssVariables } from '../theme/useCssVariables';\nimport { useDayzed, type DayzedDateObject } from '../vendor/dayzed/dayzed';\nimport { DateInput } from './dateInput';\nimport { Text } from './text';\nimport { TimeInput } from './timeInput';\n\nexport type DateRange = { min: Date; max: Date };\n\nexport type DatePickerQuickOption =\n | 'today'\n | 'thisWeek'\n | 'thisMonth'\n | 'thisYear'\n | 'lastSevenDays'\n | 'lastThirtyDays'\n | { label: ReactNode; value: Date | DateRange | (() => Date | DateRange) }\n | ((onChange: (value: Date | DateRange | null) => void) => ReactNode);\n\nexport type DatePickerChangeSource = 'input' | 'calendarWeek' | 'calendar' | 'quickOption';\n\nexport type DatePickerProps = {\n /** Currently selected day or range of days. */\n value: Date | DateRange | null;\n /** Callback for when the day (range) changes. */\n onChange: (value: Date | DateRange | null, source: DatePickerChangeSource) => void;\n /** Currently visible date. */\n dateInView?: Date;\n /** Callback for when the currently visible date changes. */\n onDateInViewChange?: (value: Date) => void;\n /** If enabled, ranges can be selected. */\n rangeSelect?: boolean;\n /** Which locale to use to render the calendar. */\n locale?: string;\n /** Which day of the week should be in the first column. (0=Sunday, 1=Monday, ...)\n * @default 1\n */\n firstDayOfWeek?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n /** Which month to show initially */\n defaultDateInView?: Date;\n /** Show buttons to quickly select suggested dates or date ranges */\n quickOptions?: DatePickerQuickOption[];\n noReset?: boolean;\n /** Minimum selectable date */\n /** Date ranges that are visually marked as blocked */\n blockedRanges?: DateRange[];\n minDate?: Date;\n /** Maximum selectable date */\n maxDate?: Date;\n /** Whether to show the calendar week in the first column */\n showCalendarWeek?: boolean;\n /** Whether to show and allow editing of time */\n showTime?: boolean | { showSeconds?: boolean };\n};\n\nconst DatePickerContext = createContext<Partial<Omit<DatePickerProps, 'value' | 'onChange'>>>({});\n\nexport function DatePickerProvider({\n children,\n ...props\n}: Partial<Omit<DatePickerProps, 'value' | 'onChange'>> & { children?: ReactNode }) {\n const value = useMemo(() => props, [JSON.stringify(props)]);\n\n return <DatePickerContext.Provider value={value}>{children}</DatePickerContext.Provider>;\n}\n\nconst weekDays = [0, 1, 2, 3, 4, 5, 6] as const;\n\n/** Rounds a date down to the start of the day. */\nexport const startOfDay = (d: Date) => new Date(d.getFullYear(), d.getMonth(), d.getDate());\n\n/** Rounds a date up to the end of the day. */\nexport const endOfDay = (d: Date) =>\n new Date(d.getFullYear(), d.getMonth(), d.getDate() + 1, 0, 0, 0, -1);\n\nexport const lastDays = (days: number): DateRange => {\n const now = new Date();\n const min = new Date(now);\n min.setDate(min.getDate() - days + 1);\n\n return {\n min: startOfDay(min),\n max: endOfDay(now),\n };\n};\n\nexport const today = () => lastDays(1);\n\nexport const thisWeek = (delta = 0, firstDayOfWeek = 1): DateRange => {\n const now = new Date();\n const min = new Date(now);\n\n let diff = min.getDay() - firstDayOfWeek;\n if (diff < 0) {\n diff += 7;\n }\n min.setDate(min.getDate() - diff + delta * 7);\n\n const max = new Date(min);\n max.setDate(max.getDate() + 6);\n\n return {\n min: startOfDay(min),\n max: endOfDay(max),\n };\n};\n\nexport const thisMonth = (delta = 0): DateRange => {\n const now = new Date();\n const min = new Date(now);\n min.setDate(1);\n min.setMonth(min.getMonth() + delta);\n const max = new Date(min);\n max.setMonth(max.getMonth() + 1);\n max.setDate(max.getDate() - 1);\n\n return {\n min: startOfDay(min),\n max: endOfDay(max),\n };\n};\n\nexport const thisYear = (delta = 0): DateRange => {\n const now = new Date();\n const min = new Date(now);\n min.setDate(1);\n min.setMonth(0);\n min.setFullYear(min.getFullYear() + delta);\n const max = new Date(min);\n max.setFullYear(max.getFullYear() + 1);\n max.setDate(max.getDate() - 1);\n\n return {\n min: startOfDay(min),\n max: endOfDay(max),\n };\n};\n\nexport const getCalendarWeek = (date: Date): number => {\n // ISO 8601: Week 1 is the week with the first Thursday of the year.\n // https://en.wikipedia.org/wiki/ISO_week_date\n\n const tz = Temporal.Now.timeZoneId();\n return (\n Temporal.Instant.fromEpochMilliseconds(date.getTime()).toZonedDateTimeISO(tz).weekOfYear ?? 0\n );\n};\n\nexport const commonQuickOptions = {\n today: { label: <Text id=\"today\" />, value: today },\n thisWeek: { label: <Text id=\"thisWeek\" />, value: (props) => thisWeek(0, props.firstDayOfWeek) },\n thisMonth: { label: <Text id=\"thisMonth\" />, value: () => thisMonth() },\n thisYear: { label: <Text id=\"thisYear\" />, value: () => thisYear() },\n lastSevenDays: { label: <Text id=\"lastSevenDays\" />, value: () => lastDays(7) },\n lastThirtyDays: { label: <Text id=\"lastThirtyDays\" />, value: () => lastDays(30) },\n} satisfies Record<\n DatePickerQuickOption & string,\n { label: ReactNode; value: Date | DateRange | ((props: DatePickerProps) => Date | DateRange) }\n>;\n\n/** Returns whether two dates and/or date ranges intersect. Intersection is considered per day. */\nexport function dateIntersect(\n a: Date | DateRange | null | undefined,\n b: Date | DateRange | null | undefined,\n) {\n if (a instanceof Date) {\n a = { min: a, max: a };\n }\n if (b instanceof Date) {\n b = { min: b, max: b };\n }\n\n if (!a?.min || !a.max || !b?.min || !b.max) {\n return false;\n }\n\n return !(endOfDay(a.max) < startOfDay(b.min) || startOfDay(a.min) > endOfDay(b.max));\n}\n\nexport function dateClamp(date: Date, min?: Date, max?: Date) {\n if (min && date < min) {\n return min;\n }\n\n if (max && date > max) {\n return max;\n }\n\n return date;\n}\n\nfunction getValueForComparison(value?: Date | DateRange | null) {\n if (!value) {\n return value;\n }\n if (value instanceof Date) {\n return value.getTime();\n }\n return `${value.min?.getTime()}-${value.max?.getTime()}`;\n}\n\nexport function DatePicker(props: DatePickerProps) {\n const context = useContext(DatePickerContext);\n\n const {\n value,\n rangeSelect,\n locale,\n firstDayOfWeek = 1,\n defaultDateInView,\n quickOptions = ['today', 'thisWeek'],\n noReset,\n minDate,\n maxDate,\n showCalendarWeek,\n blockedRanges = [],\n showTime,\n } = defaults<DatePickerProps>(props, context);\n\n function onChange(value: Date | DateRange | null, source: DatePickerChangeSource) {\n if (value instanceof Date) {\n value = dateClamp(value, minDate, maxDate);\n } else if (value) {\n value = {\n min: dateClamp(value.min, minDate, maxDate),\n max: dateClamp(value.max, minDate, maxDate),\n };\n }\n\n props.onChange(value, source);\n }\n\n const Button = useTheme((t) => t.components.Button);\n const IconButton = useTheme((t) => t.components.IconButton);\n const ChevronRight = useTheme((t) => t.icons.ChevronRight);\n const cssVariables = useCssVariables();\n function getDayCssStyles({\n disabled,\n prevMonth,\n nextMonth,\n today,\n blocked,\n selected,\n preSelected,\n }: {\n disabled?: boolean;\n prevMonth?: boolean;\n nextMonth?: boolean;\n today?: boolean;\n blocked?: boolean;\n selected?: boolean;\n preSelected?: boolean;\n }): Interpolation<Theme> {\n return [\n {\n padding: 10,\n border: 'none',\n background: 'transparent',\n cursor: disabled ? undefined : 'pointer',\n font: 'inherit',\n color: 'inherit',\n },\n (prevMonth || nextMonth) && {\n color: 'var(--date-picker-disemphasized, #bdbdbd)',\n },\n today && {\n outline: '1px solid var(--secondaryMain)',\n },\n blocked && {\n background: 'var(--blockedMain)',\n color: 'var(--blockedContrastText)',\n },\n selected && {\n background: 'var(--primaryMain)',\n color: 'var(--primaryContrastText)',\n },\n blocked &&\n selected && {\n position: 'relative',\n '::before': {\n content: '\"\"',\n position: 'absolute',\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n background: 'var(--blockedMain)',\n clipPath: 'polygon(0 0, 0 50%, 50% 0)',\n },\n },\n preSelected && {\n background: 'var(--primaryLight)',\n color: 'var(--primaryContrastText)',\n },\n ];\n }\n\n const mountTime = useMemo(() => new Date(), []);\n const [dirty, setDirty] = useState<Partial<DateRange>>();\n const [hovered, setHovered] = useState<DateRange>();\n const [dateInViewLocal, setDateInViewLocal] = useState<Date>(defaultDateInView ?? mountTime);\n const dateInView = props.dateInView ?? dateInViewLocal;\n\n function setDateInView(date: Date) {\n setDateInViewLocal(date);\n props.onDateInViewChange?.(date);\n }\n\n const min = dirty ? dirty.min : value instanceof Date ? value : value?.min;\n const max = dirty ? dirty.max : value instanceof Date ? value : value?.max;\n\n const resolvedQuickOptions = [\n ...quickOptions,\n ...(noReset ? [] : [{ label: <Text id=\"reset\" />, value: null }]),\n ].map((option, index) => {\n if (option instanceof Function) {\n return option((value) => {\n setDirty(undefined);\n onChange(value, 'quickOption');\n });\n }\n\n const { label, value } = typeof option === 'string' ? commonQuickOptions[option] : option;\n\n return (\n <Button\n key={index}\n variant=\"text\"\n type=\"button\"\n css={{\n color: 'inherit',\n }}\n onClick={() => {\n setDirty(undefined);\n\n if (value instanceof Function) {\n onChange(value(props), 'quickOption');\n } else {\n onChange(value, 'quickOption');\n }\n }}\n >\n {label}\n </Button>\n );\n });\n\n const { calendars, getBackProps, getForwardProps, getDateProps } = useDayzed({\n onDateSelected: () => undefined,\n firstDayOfWeek,\n showOutsideDays: true,\n date: dateInView,\n onOffsetChanged: (offset) =>\n setDateInView(new Date(dateInView.getFullYear(), dateInView.getMonth() + offset)),\n offset: 0,\n minDate,\n maxDate,\n });\n const now = useMemo(() => startOfDay(new Date()), []);\n\n const formatWeekday = useMemo(() => {\n const { format } = new Intl.DateTimeFormat(locale, { weekday: 'short' });\n return (weekDay: number) =>\n format(new Date(Date.UTC(2021, 7, ((weekDay + firstDayOfWeek) % 7) + 1)));\n }, [locale, firstDayOfWeek]);\n\n useEffect(\n () =>\n setDateInView(\n value === null ? defaultDateInView ?? mountTime : value instanceof Date ? value : value.max,\n ),\n [getValueForComparison(value), getValueForComparison(defaultDateInView), mountTime],\n );\n\n useEffect(() => {\n if (!rangeSelect) {\n setDirty(undefined);\n }\n }, [rangeSelect]);\n\n function set(source: DatePickerChangeSource, min?: Date, max?: Date, edit?: 'min' | 'max') {\n if (!rangeSelect) {\n onChange(min ?? null, source);\n return;\n }\n\n if (min && max && min > max) {\n if (edit === 'min') {\n max = min;\n } else if (edit === 'max') {\n min = max;\n } else {\n [min, max] = [max, min];\n }\n }\n\n if (!min === !max) {\n setDirty(undefined);\n onChange(min && max ? { min, max: endOfDay(max) } : null, source);\n } else {\n setDirty({ min, max });\n }\n }\n\n const formatMonth = useMemo(() => {\n const { format } = new Intl.DateTimeFormat(locale, { month: 'long' });\n return (month: number) => format(new Date(2021, month));\n }, [locale]);\n\n const formatYear = useMemo(() => {\n const { format } = new Intl.DateTimeFormat(locale, { year: 'numeric' });\n return (year: number) => format(new Date(year, 0, 1));\n }, [locale]);\n\n return (\n <div\n css={[\n cssVariables,\n {\n color: 'var(--table-text-color)',\n },\n ]}\n >\n <div\n css={{\n display: 'grid',\n gridAutoFlow: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n gap: 'calc(var(--spacing) * 4)',\n\n '& > div': {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n },\n }}\n >\n <div>\n <DateInput\n value={min ?? null}\n onChange={(newMin) => set('input', newMin ?? undefined, max, 'min')}\n locale={locale}\n />\n\n {showTime && (\n <TimeInput\n value={min ?? null}\n onChange={(newMin) => set('input', newMin ?? undefined, max, 'min')}\n locale={locale}\n showSeconds={typeof showTime === 'boolean' ? true : showTime.showSeconds}\n />\n )}\n </div>\n\n {rangeSelect && (\n <>\n {' - '}\n\n <div>\n <DateInput\n value={max ?? null}\n onChange={(newMax) => set('input', min, newMax ?? undefined, 'max')}\n locale={locale}\n />\n\n {showTime && (\n <TimeInput\n value={max ?? null}\n onChange={(newMax) => set('input', min, newMax ?? undefined, 'max')}\n locale={locale}\n showSeconds={typeof showTime === 'boolean' ? true : showTime.showSeconds}\n />\n )}\n </div>\n </>\n )}\n </div>\n\n {calendars.map(({ month, year, weeks }) => (\n <div key={`${month}${year}`} css={{ display: 'grid' }}>\n <div\n css={{\n margin: 'calc(var(--spacing) * 4) 0',\n display: 'grid',\n gridAutoFlow: 'column',\n justifyContent: 'space-between',\n alignItems: 'center',\n }}\n >\n <IconButton type=\"button\" {...getBackProps({ calendars })}>\n <ChevronRight css={{ transform: 'rotate3d(0, 0, 1, 180deg)' }} />\n </IconButton>\n\n <div css={{ display: 'flex' }}>\n {formatMonth(month)} {formatYear(year)}\n </div>\n\n <IconButton type=\"button\" {...getForwardProps({ calendars })}>\n <ChevronRight />\n </IconButton>\n </div>\n\n <div\n css={{\n justifySelf: 'center',\n display: 'grid',\n gridTemplateColumns: 'repeat(8, max-content)',\n }}\n >\n {showCalendarWeek ? (\n <div\n css={{\n justifySelf: 'center',\n padding: 10,\n borderRight:\n '1px solid var(--date-picker-separator, var(--table-border, #bdbdbd))',\n }}\n >\n <Text id=\"calendarWeek\" />\n </div>\n ) : (\n <div />\n )}\n\n {weekDays.map((_v, weekDay) => (\n <div\n key={weekDay}\n css={{\n justifySelf: 'center',\n padding: 10,\n }}\n >\n {formatWeekday(weekDay)}\n </div>\n ))}\n\n {weeks.map((week, index) => {\n const weekStart = week[0] as DayzedDateObject;\n const weekEnd = week[6] as DayzedDateObject;\n const weekDisabled =\n !rangeSelect ||\n (minDate && weekEnd.date < minDate) ||\n (maxDate && weekStart.date > maxDate);\n\n return (\n <Fragment key={index}>\n {showCalendarWeek ? (\n <button\n type=\"button\"\n css={{\n padding: 10,\n border: 'none',\n background: 'transparent',\n cursor: weekDisabled ? undefined : 'pointer',\n font: 'inherit',\n borderRight:\n '1px solid var(--date-picker-separator, var(--table-border, #bdbdbd))',\n color: 'inherit',\n }}\n onClick={() => {\n if (weekDisabled) {\n return;\n }\n\n const min = minDate && weekStart.date < minDate ? minDate : weekStart.date;\n const max = maxDate && weekEnd.date > maxDate ? maxDate : weekEnd.date;\n set('calendarWeek', min, max);\n }}\n onPointerOver={() =>\n !weekDisabled && setHovered({ min: weekStart.date, max: weekEnd.date })\n }\n onPointerOut={() => !weekDisabled && setHovered(undefined)}\n >\n {getCalendarWeek(weekEnd.date)}\n </button>\n ) : (\n <div />\n )}\n\n {week.map((dateObject, dayIndex) => {\n if (!dateObject) {\n return <div key={dayIndex} />;\n }\n\n const { prevMonth, nextMonth, date } = dateObject;\n const today = startOfDay(date).getTime() === now.getTime();\n const disabled = (minDate && date < minDate) || (maxDate && date > maxDate);\n\n const selected =\n date.getTime() === min?.getTime() ||\n (min && max && dateIntersect(date, { min, max }));\n const preSelected =\n !selected &&\n !disabled &&\n (dateIntersect(date, hovered) ||\n (min &&\n !max &&\n hovered &&\n dateIntersect(\n date,\n min <= hovered.min\n ? { min, max: hovered.min }\n : { min: hovered.max, max: min },\n )));\n const blocked = blockedRanges.some((range) => dateIntersect(date, range));\n\n return (\n <button\n type=\"button\"\n key={`${index}-${dayIndex}`}\n css={getDayCssStyles({\n disabled,\n prevMonth,\n nextMonth,\n today,\n blocked,\n selected,\n preSelected,\n })}\n {...getDateProps({ dateObj: dateObject })}\n onClick={() => {\n if (dirty) {\n if (min) set('calendar', min, date);\n else set('calendar', date, max);\n } else {\n set('calendar', date);\n }\n }}\n onPointerOver={() => setHovered({ min: date, max: date })}\n onPointerOut={() => setHovered(undefined)}\n disabled={disabled}\n >\n {date.getDate()}\n </button>\n );\n })}\n </Fragment>\n );\n })}\n </div>\n </div>\n ))}\n\n <div\n css={{\n marginTop: 'var(--spacing)',\n display: 'grid',\n gridAutoFlow: 'column',\n justifyContent: 'center',\n }}\n >\n {resolvedQuickOptions}\n </div>\n </div>\n );\n}\n","import { useFilter } from '../hooks/useFilter';\nimport type { CommonFilterProps } from '../types';\nimport type { DatePickerProps, DateRange } from './datePicker';\nimport { dateIntersect, DatePicker } from './datePicker';\n\nfunction convertDate(x: unknown): Date | null {\n if (x instanceof Date) return x;\n if (typeof x === 'number' || typeof x === 'string') return new Date(x);\n return null;\n}\n\nfunction convertDateOrRange(x: unknown): Date | DateRange | null {\n if (x instanceof Object && 'min' in x && 'max' in x) {\n const range = {\n min: convertDate((x as any).min),\n max: convertDate((x as any).max),\n };\n return range.min && range.max ? (range as DateRange) : null;\n }\n return convertDate(x);\n}\n\nfunction convertDateOrArray(x: unknown): Date | DateRange | (Date | DateRange)[] | null {\n if (Array.isArray(x)) return x.map(convertDateOrRange).filter(Boolean) as (Date | DateRange)[];\n return convertDateOrRange(x);\n}\n\nexport function DateFilter<TItem, TColumnValue>({\n locale,\n firstDayOfWeek,\n defaultDateInView,\n quickOptions,\n singleSelect,\n filterBy = convertDateOrArray,\n minDate,\n maxDate,\n showCalendarWeek,\n showTime,\n ...props\n}: {\n /** If enabled, only single days can be selected. Ranges otherwise. */\n singleSelect?: boolean;\n} & Pick<\n DatePickerProps,\n | 'locale'\n | 'firstDayOfWeek'\n | 'defaultDateInView'\n | 'quickOptions'\n | 'minDate'\n | 'maxDate'\n | 'showCalendarWeek'\n | 'showTime'\n> &\n CommonFilterProps<\n TItem,\n TColumnValue,\n Date | DateRange | null,\n Date | DateRange | null\n >): JSX.Element {\n const {\n value = null,\n onChange,\n close,\n } = useFilter({\n ...props,\n filterBy,\n\n id: 'dateFilter',\n\n isActive(filterValue) {\n return !!filterValue;\n },\n\n test(filterValue, value) {\n return dateIntersect(filterValue, value);\n },\n });\n\n return (\n <div\n css={{\n padding: 'calc(var(--spacing) * 2)',\n display: 'grid',\n }}\n >\n <DatePicker\n rangeSelect={!singleSelect}\n value={value}\n onChange={(value, source) => {\n onChange(value);\n if (source !== 'input') {\n close();\n }\n }}\n locale={locale}\n firstDayOfWeek={firstDayOfWeek}\n defaultDateInView={defaultDateInView}\n quickOptions={quickOptions}\n minDate={minDate}\n maxDate={maxDate}\n showCalendarWeek={showCalendarWeek}\n showTime={showTime}\n />\n </div>\n );\n}\n","import type { Id, TableItem } from '../types';\n\nexport const flatMap = <T, S>(array: Iterable<T>, flatMap: (t: T) => S[]): S[] => {\n return [...array].flatMap(flatMap);\n};\n\nexport const orderBy = <T>(\n array: T[],\n selectors: ((t: T) => any)[] = [],\n direction: ('desc' | 'asc')[] = [],\n locale?: (string | undefined)[],\n options?: (Intl.CollatorOptions | undefined)[],\n): T[] => {\n if (selectors.length === 0) selectors = [(t) => t];\n\n return [...array].sort((a, b) => {\n for (let i = 0; i < selectors.length; i++) {\n const _a = selectors[i]?.(a);\n const _b = selectors[i]?.(b);\n const _direction = direction[i] === 'desc' ? -1 : 1;\n const _locale = locale?.[i];\n const _options = options?.[i];\n\n if (typeof _a === 'string' && typeof _b === 'string') {\n return _a.localeCompare(_b, _locale, _options) * _direction;\n }\n\n if (_a > _b) return _direction;\n if (_a < _b) return -_direction;\n }\n return 0;\n });\n};\n\nexport const uniq = <T>(array: T[]): T[] => {\n const set = new Set<T>();\n for (const t of array) set.add(t);\n return Array.from(set);\n};\n\nexport const intersect = <T>(a: Iterable<T>, b: { has(t: T): boolean }): Set<T> => {\n const result = new Set<T>();\n for (const x of a) if (b.has(x)) result.add(x);\n return result;\n};\n\nexport const getAncestors = <T>(\n activeItemsById: Map<Id, TableItem<T>>,\n ...items: TableItem<T>[]\n): Set<Id> => {\n const result = new Set<Id>();\n\n const find = ({ parentId }: TableItem<T>): void => {\n const parent =\n parentId !== undefined && parentId !== null ? activeItemsById.get(parentId) : undefined;\n if (parent && !result.has(parent.id)) {\n result.add(parent.id);\n find(parent);\n }\n };\n items.forEach(find);\n return result;\n};\n\nexport const getDescendants = <T>(...items: TableItem<T>[]): Set<Id> => {\n const result = new Set<Id>();\n\n const find = (item: TableItem<T>): void => {\n for (const child of item.children) {\n if (!result.has(child.id)) {\n result.add(child.id);\n find(child);\n }\n }\n };\n items.forEach(find);\n return result;\n};\n\nexport const identity = (x: unknown): any => x;\n\nexport const asString = (x: unknown): string => {\n if (Array.isArray(x)) return x.map(asString).join(', ');\n if (x instanceof Object) return JSON.stringify(x);\n return String(x ?? '');\n};\n\nexport const asStringOrArray = (x: unknown): string | string[] => {\n if (Array.isArray(x)) return x.map(asString);\n return asString(x);\n};\n\nexport const asNumber = (x: unknown): number | null => {\n const n = Number(x);\n return Number.isNaN(n) ? null : n;\n};\n\nexport const asNumberOrArray = (x: unknown): number | null | (number | null)[] => {\n if (Array.isArray(x)) return x.map(asNumber);\n return asNumber(x);\n};\n\nexport const defaultEquals = (a: unknown, b: unknown): boolean => a === b;\n\nexport const subStringMatch = (a: string, b: string): boolean =>\n a.toLowerCase().includes(b.toLowerCase());\n\nexport const castArray = <T>(a: T | T[]) => (Array.isArray(a) ? a : [a]);\n\nexport const cx = (\n ...classNames: (string | false | undefined | null | Record<string, boolean>)[]\n) =>\n classNames\n .flatMap((entry) => {\n if (!entry) return [];\n if (typeof entry === 'string') return [entry];\n return Object.entries(entry)\n .filter(([, predicate]) => predicate)\n .map(([className]) => className);\n })\n .join(' ');\n\ntype Falsy = false | 0 | '' | null | undefined;\nexport function isTruthy<T>(x: T): x is Exclude<T, Falsy> {\n return !!x;\n}\n","import { useState } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport type { TableTheme } from '../types';\n\ntype TextFieldProps = TableTheme['components']['TextField'] extends React.ComponentType<infer T>\n ? T\n : never;\n\nexport interface NumberFieldProps extends Omit<TextFieldProps, 'value' | 'onChange'> {\n value?: number | null;\n onChange?: (value: number | null) => void;\n}\n\nconst Pattern = /^-?\\d*(?:[.,]\\d*)?$/;\n\nconst printNumber = (value: number | null, locale?: string) => {\n if (value === null) {\n return '';\n }\n\n return value.toLocaleString(locale);\n};\n\nconst parseNumber = (value: string) => {\n if (value === '') {\n return null;\n }\n\n const asNumber = Number(value.replace(',', '.'));\n return Number.isNaN(asNumber) ? null : asNumber;\n};\n\nexport function NumberField({\n value: commitedValue = null,\n onChange,\n ...textFieldProps\n}: NumberFieldProps) {\n const locale = useTheme((t) => t.locale);\n const TextField = useTheme((t) => t.components.TextField);\n const [value = printNumber(commitedValue, locale), setValue] = useState<string>();\n\n return (\n <TextField\n value={value}\n onChange={(event) => {\n if (Pattern.test(event.target.value)) {\n setValue(event.target.value);\n }\n }}\n onBlur={() => {\n onChange?.(parseNumber(value));\n setValue(undefined);\n }}\n {...textFieldProps}\n css={{\n input: {\n backgroundColor: 'inherit',\n color: 'inherit',\n },\n }}\n />\n );\n}\n","import { useFilter } from '../hooks/useFilter';\nimport { useTheme } from '../hooks/useTheme';\nimport { asNumberOrArray, castArray } from '../misc/helpers';\nimport { useColumnContext, useTableContext } from '../misc/tableContext';\nimport type { CommonFilterProps } from '../types';\nimport { NumberField } from './numberField';\n\nexport interface RangeFilterProps<T, V>\n extends CommonFilterProps<T, V, number | null, [number | null, number | null] | null> {\n min?: number;\n max?: number;\n}\n\nexport function RangeFilter<TItem, TColumnValue>({\n min,\n max,\n filterBy = asNumberOrArray,\n ...props\n}: RangeFilterProps<TItem, TColumnValue>): JSX.Element {\n const rangeMinText = useTheme((t) => t.text.rangeMin);\n const rangeMaxText = useTheme((t) => t.text.rangeMax);\n\n const table = useTableContext<TItem>();\n const columnId = useColumnContext();\n const filterByFunction = filterBy instanceof Function ? filterBy : filterBy[0];\n\n const [minValue, maxValue] = table.useState((state) => {\n if (typeof min === 'number' && typeof max === 'number') {\n return [min, max];\n }\n\n const column = state.activeColumns.find((c) => c.id === columnId);\n\n if (!column) {\n return [0, 100];\n }\n\n let minValue;\n let maxValue;\n\n for (const item of state.items) {\n const columnValue = column.value(item.value) as TColumnValue;\n const numberValues = castArray(filterByFunction(columnValue, item.value)).filter(\n (value): value is number => value !== null,\n );\n\n for (const value of numberValues) {\n minValue = Math.min(minValue ?? value, value);\n maxValue = Math.max(maxValue ?? value, value);\n }\n }\n\n return [min ?? minValue, max ?? maxValue];\n });\n\n const { value, onChange } = useFilter({\n ...props,\n filterBy,\n\n id: 'rangeFilter',\n\n isActive(filterValue) {\n return !!filterValue;\n },\n\n test(filterValue, value) {\n if (!filterValue || (filterValue[0] === null && filterValue[1] === null)) {\n return true;\n }\n\n const min = filterValue[0] ?? Number.NEGATIVE_INFINITY;\n const max = filterValue[1] ?? Number.POSITIVE_INFINITY;\n return value !== null && value >= min && value <= max;\n },\n });\n\n return (\n <div\n css={{\n padding: `calc(var(--spacing) * 2)`,\n display: 'grid',\n gap: '1em',\n }}\n >\n <div\n css={{\n display: 'flex',\n gap: '1em',\n alignItems: 'center',\n\n '& > *': {\n width: '10em',\n },\n }}\n >\n <NumberField\n value={value?.[0]}\n onChange={(newMin) => onChange(normalize(newMin, value?.[1], 'min', { min, max }))}\n startIcon={<span css={{ margin: '0 calc(var(--spacing) * 2)' }}>{rangeMinText}</span>}\n placeholder={String(minValue ?? '')}\n css={{\n alignItems: 'baseline',\n }}\n />\n -\n <NumberField\n value={value?.[1]}\n onChange={(newMax) => onChange(normalize(value?.[0], newMax, 'max', { min, max }))}\n startIcon={<span css={{ margin: '0 calc(var(--spacing) * 2)' }}>{rangeMaxText}</span>}\n placeholder={String(maxValue ?? '')}\n css={{\n alignItems: 'baseline',\n }}\n />\n </div>\n </div>\n );\n}\n\nfunction normalize(\n min: number | null | undefined,\n max: number | null | undefined,\n changed: 'min' | 'max',\n limits: { min?: number; max?: number },\n): [number | null, number | null] | null {\n min ??= null;\n max ??= null;\n\n if (min !== null && max !== null && min > max) {\n if (changed === 'min') {\n max = min;\n } else {\n min = max;\n }\n }\n\n return min !== null || max !== null\n ? [clamp(min, limits.min, limits.max), clamp(max, limits.min, limits.max)]\n : null;\n}\n\nfunction clamp(\n value: number | null,\n min = Number.NEGATIVE_INFINITY,\n max = Number.POSITIVE_INFINITY,\n): number | null {\n return value === null ? null : Math.min(Math.max(value, min), max);\n}\n","import type { ReactNode } from 'react';\n\nexport function FormControlLabel({\n control,\n label,\n disabled,\n}: {\n control: ReactNode;\n label: ReactNode;\n disabled?: boolean;\n}) {\n return (\n <label\n css={[\n {\n display: 'flex',\n alignItems: 'center',\n cursor: 'pointer',\n userSelect: 'none',\n\n '& > *': {\n cursor: 'pointer',\n },\n },\n disabled && { color: 'rgba(0, 0, 0, 0.26)' },\n ]}\n >\n {control}\n <span css={{ marginLeft: 'var(--spacing)' }}>{label}</span>\n </label>\n );\n}\n","import type { HTMLProps, ReactNode } from 'react';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { throttle } from '../misc/throttle';\n\nexport interface VirtualListProps<T> extends Omit<HTMLProps<HTMLDivElement>, 'children'> {\n virtual?:\n | boolean\n | {\n rowHeight?: number;\n initalRowHeight?: number;\n throttleScroll?: number;\n overscan?: number;\n overscanBottom?: number;\n overscanTop?: number;\n };\n items: T[];\n children: (item: T, index: number) => ReactNode;\n}\n\nexport function VirtualList<T>({\n virtual = true,\n items,\n children,\n ...props\n}: VirtualListProps<T>): JSX.Element {\n const container = useRef<HTMLDivElement>(null);\n const [, setId] = useState({});\n\n const throttleScroll = (typeof virtual === 'boolean' ? undefined : virtual)?.throttleScroll ?? 16;\n const update = useMemo(() => throttle(() => setId({}), throttleScroll), [throttleScroll]);\n\n useEffect(() => {\n if (!virtual) return;\n\n const ro = new ResizeObserver(update);\n\n if (container.current) {\n ro.observe(container.current);\n }\n\n window.addEventListener('resize', update, true);\n return () => {\n ro.disconnect();\n window.removeEventListener('resize', update, true);\n update.cancel();\n };\n }, [update, virtual, throttleScroll]);\n\n if (!virtual) {\n return (\n <div\n {...props}\n css={{\n overflowY: 'auto',\n display: 'grid',\n }}\n >\n {items.map((item, index) => children(item, index))}\n </div>\n );\n }\n\n const {\n rowHeight,\n initalRowHeight = 38,\n overscan = 100,\n overscanTop,\n overscanBottom,\n } = (virtual instanceof Object ? virtual : undefined) ?? {};\n\n const itemHeight = rowHeight ?? (averageItemHeight(container.current) || initalRowHeight);\n const from = container.current?.clientHeight\n ? Math.max(\n 0,\n Math.floor((container.current.scrollTop - (overscanTop ?? overscan)) / itemHeight),\n )\n : 0;\n const to = container.current?.clientHeight\n ? Math.min(\n items.length,\n Math.ceil(\n (container.current.scrollTop +\n container.current.clientHeight +\n (overscanBottom ?? overscan)) /\n itemHeight,\n ),\n )\n : 1;\n const before = from * itemHeight;\n const after = (items.length - to) * itemHeight;\n\n return (\n <div\n {...props}\n onScroll={(event) => {\n update();\n props.onScroll?.(event);\n }}\n ref={container}\n css={{\n overflowY: 'auto',\n display: 'grid',\n }}\n >\n <div data-virtual-before style={{ height: before }} />\n {items.slice(from, to).map((item, index) => children(item, index + from))}\n <div data-virtual-after style={{ height: after }} />\n </div>\n );\n}\n\nfunction averageItemHeight(container: HTMLDivElement | null) {\n if (!container?.children.length) {\n return undefined;\n }\n\n const heights = Array.from(container.children)\n .slice(1, -1)\n .map((child) => child.clientHeight);\n return heights.reduce((a, b) => a + b, 0) / heights.length;\n}\n","import type { ReactNode } from 'react';\nimport { useEffect, useMemo, useState } from 'react';\nimport { useFilter } from '../hooks/useFilter';\nimport { useTheme } from '../hooks/useTheme';\nimport { asString, castArray, flatMap, orderBy, uniq } from '../misc/helpers';\nimport { useColumnContext, useTableContext } from '../misc/tableContext';\nimport type { CommonFilterProps, InternalColumn } from '../types';\nimport { AutoFocusTextField } from './autoFocusTextField';\nimport { FormControlLabel } from './formControlLabel';\nimport type { VirtualListProps } from './virtualList';\nimport { VirtualList } from './virtualList';\n\nfunction toggle<T>(set: Set<T>, value: T, singleSelect?: boolean) {\n const newSet = new Set(singleSelect ? [] : set);\n if (set.has(value)) {\n newSet.delete(value);\n } else {\n newSet.add(value);\n }\n\n return newSet;\n}\n\nexport function SelectFilter<TItem, TColumnValue, TFilterBy>({\n options: providedOptions,\n stringValue = asString,\n render = stringValue,\n singleSelect,\n hideSearchField,\n hideResetButton,\n ...props\n}: {\n /** Which options are provided to select. By default all unique item values are used. */\n options?: TFilterBy[];\n /** String representation of a value. Used to filter options via the text field. */\n stringValue?: (value: TFilterBy) => string;\n /** Render values. By default a string representation of the value is used. */\n render?: (value: TFilterBy) => ReactNode;\n /** If enabled, only one option can be selected at a time. */\n singleSelect?: boolean;\n /** If enabled, the search field is hidden. */\n hideSearchField?: boolean;\n /** If enabled, the reset button is hidden. */\n hideResetButton?: boolean;\n /** Virtual list props.\n * @default true */\n virtual?: VirtualListProps<unknown>['virtual'];\n} & CommonFilterProps<TItem, TColumnValue, TFilterBy, Set<TFilterBy>>): JSX.Element {\n const IconButton = useTheme((t) => t.components.IconButton);\n const Checkbox = useTheme((t) => t.components.Checkbox);\n const Search = useTheme((t) => t.icons.Search);\n const Clear = useTheme((t) => t.icons.Clear);\n const deselectAll = useTheme((t) => t.text.deselectAll);\n const noResults = useTheme((t) => t.text.noResults);\n\n const table = useTableContext<TItem>();\n const columnId = useColumnContext();\n\n const {\n value = new Set<TFilterBy>(),\n onChange,\n filterBy,\n isActive,\n } = useFilter({\n ...props,\n\n id: 'selectFilter',\n\n isActive(filterValue) {\n return filterValue.size > 0;\n },\n\n test(filterValue, value) {\n return filterValue.has(value);\n },\n });\n\n const options = table.useState((state) => {\n if (providedOptions) return uniq(providedOptions);\n\n const column = state.activeColumns.find((column) => column.id === columnId) as\n | InternalColumn<TItem, TColumnValue>\n | undefined;\n if (!column) return [];\n\n return orderBy(\n uniq(\n flatMap(state.items, (item) => castArray(filterBy(column.value(item.value), item.value))),\n ),\n );\n });\n\n const [query, setQuery] = useState('');\n const filtered = options.filter(\n (option) => !query || stringValue(option).toLowerCase().includes(query.toLowerCase()),\n );\n const delayedValue = useMemo(() => value, [isActive]);\n const ordered = filtered\n .filter((option) => delayedValue.has(option))\n .concat(filtered.filter((option) => !delayedValue.has(option)));\n\n const Button = useTheme((t) => t.components.Button);\n\n useEffect(() => {\n setQuery('');\n }, [isActive]);\n\n return (\n <div\n css={{\n padding: 'calc(var(--spacing) * 2)',\n display: 'grid',\n gridTemplateColumns: 'minmax(0, 1fr)',\n gap: 'var(--spacing)',\n }}\n >\n {!hideSearchField && (\n <AutoFocusTextField\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n endIcon={\n <IconButton onClick={() => setQuery('')}>{!query ? <Search /> : <Clear />}</IconButton>\n }\n css={{ marginBottom: 'var(--spacing)' }}\n />\n )}\n\n {!hideResetButton && (\n <Button\n disabled={value.size === 0}\n onClick={() => onChange(new Set())}\n variant=\"outlined\"\n css={{\n justifyContent: 'center',\n width: '100%',\n marginBottom: 'var(--spacing)',\n color: 'inherit',\n }}\n >\n {deselectAll}\n </Button>\n )}\n\n <VirtualList\n items={ordered}\n css={{\n width: '20em',\n maxWidth: '100%',\n maxHeight: 'min(20em, 50vh)',\n overflow: 'hidden auto',\n display: 'grid',\n gridTemplateColumns: 'minmax(0, 1fr)',\n }}\n >\n {(option, index) => (\n <FormControlLabel\n key={index}\n control={\n <Checkbox\n checked={value.has(option)}\n onChange={() => onChange(toggle(value, option, singleSelect))}\n />\n }\n label={render(option)}\n />\n )}\n </VirtualList>\n\n {ordered.length === 0 && <span css={{ textAlign: 'center' }}>{noResults}</span>}\n </div>\n );\n}\n","import { useImperativeHandle, type ForwardedRef } from 'react';\nimport { Store } from 'schummar-state/react';\nimport type { InternalTableState, TableRef } from '../types';\n\nexport default function useTableRef<T>(\n table: Store<InternalTableState<T>>,\n ref: ForwardedRef<TableRef>,\n) {\n useImperativeHandle(\n ref,\n () => ({\n getSort() {\n return table.getState().sort;\n },\n\n setSort(sort) {\n table.update((state) => {\n state.sort = sort;\n });\n },\n\n getSelection() {\n return table.getState().selection;\n },\n\n setSelection(selection) {\n table.update((state) => {\n state.selection = selection;\n });\n },\n\n getExpanded() {\n return table.getState().expanded;\n },\n\n setExpanded(expanded) {\n table.update((state) => {\n state.expanded = expanded;\n });\n },\n\n getHiddenColumns() {\n return table.getState().hiddenColumns;\n },\n\n setHiddenColumns(hidden) {\n table.update((state) => {\n state.hiddenColumns = hidden;\n });\n },\n }),\n [table],\n );\n}\n","export class Queue {\n private q = new Array<{\n job: () => Promise<any>;\n resolve: (value: any) => void;\n reject: (reason?: any) => void;\n }>();\n\n private isRunning = false;\n\n run<T>(job: () => Promise<T>, replace?: boolean) {\n return new Promise<T>((resolve, reject) => {\n if (replace) {\n this.q = [];\n }\n this.q.push({ job, resolve, reject });\n\n if (!this.isRunning) this.start();\n });\n }\n\n clear() {\n this.q = [];\n }\n\n private async start() {\n this.isRunning = true;\n\n let next;\n while ((next = this.q.shift())) {\n try {\n const result = await next.job();\n next.resolve(result);\n } catch (error) {\n next.reject(error);\n }\n }\n\n this.isRunning = false;\n }\n}\n","import type { Draft } from 'immer';\nimport { useEffect, useState } from 'react';\nimport type { Store } from 'schummar-state/react';\nimport { Queue } from '../misc/queue';\nimport type { InternalTableState } from '../types';\n\nconst KEYS = [\n 'sort',\n 'selection',\n 'expanded',\n 'hiddenColumns',\n 'filterValues',\n 'columnWidths',\n 'columnOrder',\n] as const;\n\nconst storageName = (id: string) => `schummar-table_state-v1_${id}`;\n\nexport type TableStateStorage = {\n getItem: (key: string) => string | null | Promise<string | null>;\n setItem: (key: string, value: string) => unknown | Promise<unknown>;\n removeItem: (key: string) => unknown | Promise<unknown>;\n} & (\n | {\n keys: () => string[] | Promise<string[]>;\n }\n | {\n length: number | (() => number | Promise<number>);\n key: (keyIndex: number) => string | null | Promise<string | null>;\n }\n);\n\nfunction stringify(value: unknown) {\n function prepare(value: unknown): any {\n if (value instanceof Date) {\n return { __date: value.toJSON() };\n }\n\n if (value instanceof Set) {\n return { __set: Array.from(value).map(prepare) };\n }\n\n if (value instanceof Map) {\n return { __map: Array.from(value.entries()).map((entry) => entry.map(prepare)) };\n }\n\n if (Array.isArray(value)) {\n return value.map(prepare);\n }\n\n if (value instanceof Object) {\n return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, prepare(v)]));\n }\n\n return value;\n }\n\n return JSON.stringify(prepare(value));\n}\n\nfunction parse(value: string) {\n return JSON.parse(value, (_key, value) => {\n if (value instanceof Object && '__date' in value) {\n return new Date(value.__date);\n }\n\n if (value instanceof Object && '__set' in value) {\n return new Set(value.__set);\n }\n\n if (value instanceof Object && '__map' in value) {\n return new Map(value.__map);\n }\n\n return value;\n });\n}\n\nexport function useTableStateStorage(table: Store<InternalTableState<any>>) {\n const [isHydrated, setIsHydrated] = useState(false);\n const [q] = useState(() => new Queue());\n\n // On mount: load\n useEffect(() => {\n const { persist } = table.getState().props;\n if (!persist) {\n setIsHydrated(true);\n return;\n }\n\n let isCanceled = false;\n\n (async () => {\n try {\n const { storage, id, include, exclude } = persist;\n const json = await storage.getItem(storageName(id));\n if (isCanceled || !json) return;\n\n const data = parse(json);\n table.getState().props.debug?.('load', json, data);\n\n // eslint-disable-next-line no-inner-declarations\n function applyUpdate(state: Draft<InternalTableState<any>>, key: (typeof KEYS)[number]) {\n if (\n //\n (!include || include.includes(key)) &&\n !exclude?.includes(key) &&\n key in data\n ) {\n if (key === 'filterValues') {\n for (const [id, value] of data[key]) {\n const filter = state.filters.get(id);\n\n if (filter && (filter.persist ?? filter.value === undefined)) {\n state.filterValues.set(id, value);\n state.filters.get(id)?.onChange?.(value);\n }\n }\n } else {\n if (\n key === 'expanded' ||\n key === 'hiddenColumns' ||\n key === 'selection' ||\n key === 'sort'\n ) {\n if (state.props[key] !== undefined) {\n return;\n }\n\n state.props[\n `on${\n (key.slice(0, 1).toUpperCase() + key.slice(1)) as Capitalize<typeof key>\n }Change`\n ]?.(data[key]);\n }\n\n state[key] = data[key];\n }\n }\n }\n\n table.update((state) => {\n for (const key of KEYS.filter((key) => key !== 'filterValues')) {\n applyUpdate(state, key);\n }\n });\n\n // First apply other keys and wait until changes take effect. Filters cannot be applied to hidden columns.\n await new Promise((resolve) => {\n setTimeout(resolve);\n });\n table.update((state) => applyUpdate(state, 'filterValues'));\n } catch (error) {\n console.error('Failed to load table state:', error);\n } finally {\n setIsHydrated(true);\n }\n })();\n\n return () => {\n isCanceled = true;\n };\n }, [table]);\n\n // After isHydrated, watch and save state\n useEffect(() => {\n if (!isHydrated) return;\n\n return table.subscribe(\n (state) => {\n if (!state.props.persist) return;\n\n const { storage, id, include, exclude } = state.props.persist;\n const data: any = {};\n\n for (const key of KEYS) {\n if (\n //\n (!include || include.includes(key)) &&\n !exclude?.includes(key)\n ) {\n if (key === 'filterValues') {\n data[key] = new Map();\n for (const [id, value] of state.filterValues) {\n if (state.filters.get(id)?.persist ?? state.filters.get(id)?.value === undefined) {\n data.filterValues.set(id, value);\n }\n }\n } else {\n if (\n (key === 'expanded' ||\n key === 'hiddenColumns' ||\n key === 'selection' ||\n key === 'sort') &&\n state.props[key] !== undefined\n ) {\n continue;\n }\n\n data[key] = state[key];\n }\n }\n }\n\n return { storage, id, data };\n },\n (props) => {\n if (!props) return;\n const { storage, id, data } = props;\n\n table.getState().props.debug?.('save', data, stringify(data));\n q.run(async () => {\n await storage.setItem(storageName(id), stringify(data));\n }, true);\n },\n { throttle: 1000 },\n );\n }, [table, isHydrated]);\n\n async function clear() {\n await q.run(async () => {\n const persist = table.getState().props.persist;\n if (!persist) {\n return;\n }\n\n const { storage, id } = persist;\n await storage.removeItem(storageName(id));\n\n setIsHydrated(false);\n q.clear();\n });\n }\n\n return [isHydrated, clear] as const;\n}\n","import { castDraft } from 'immer';\nimport { useEffect } from 'react';\nimport type { Store } from 'schummar-state/react';\nimport { castArray, flatMap, orderBy } from '../misc/helpers';\nimport type { Id, InternalTableState, TableItem } from '../types';\n\nexport function calcItems<T>(state: Store<InternalTableState<T>>): void {\n useEffect(\n () =>\n state.addReaction(\n (state) =>\n [\n state.props.items,\n state.props.id,\n state.props.parentId,\n state.props.revealFiltered,\n state.props.externalSort,\n state.props.locale,\n state.sort,\n state.filters,\n state.filterValues,\n state.activeColumns,\n state.expanded,\n ] as const,\n (\n [\n items = [],\n id,\n parentId,\n revealFiltered,\n externalSort,\n locale,\n sort,\n filters,\n filterValues,\n activeColumns,\n ],\n draft,\n ) => {\n const tableItems = items.map<TableItem<T>>((item) => ({\n id: id(item),\n parentId: parentId?.(item),\n children: [],\n value: item,\n }));\n\n let sorted;\n if (sort.length === 0 || externalSort) {\n sorted = tableItems;\n } else {\n const selectors = flatMap(sort, (sort) => {\n const column = activeColumns.find((column) => column.id === sort.columnId);\n if (!column) return [];\n return column.sortBy.map((sortBy) => ({\n selector: (item: T) => sortBy(column.value(item), item),\n direction: sort.direction,\n locale: sort.locale ?? locale,\n options: sort.options,\n }));\n }).filter(Boolean);\n\n sorted = orderBy(\n tableItems,\n selectors.map((x) => (item) => x.selector(item.value)),\n selectors.map((x) => x.direction),\n selectors.map((x) => x.locale),\n selectors.map((x) => x.options),\n );\n }\n\n const lookup = new Map<Id, TableItem<T>>();\n for (const item of sorted) {\n lookup.set(item.id, item);\n }\n\n for (const item of sorted) {\n const parent =\n item.parentId !== undefined && item.parentId !== null\n ? lookup.get(item.parentId)\n : undefined;\n parent?.children.push(item);\n }\n\n const allItems = new Array<TableItem<T>>();\n const allItemsById = new Map<Id, TableItem<T>>();\n\n const traverse = (items: TableItem<T>[]): void => {\n for (const item of items) {\n allItems.push(item);\n allItemsById.set(item.id, item);\n traverse(item.children);\n }\n };\n traverse(sorted.filter((item) => item.parentId === undefined || item.parentId === null));\n\n let expandedChanged = false;\n const activeItemsById = new Map<Id, TableItem<T>>();\n const activeSet = new Set<Id>();\n const activeItems = [...allItems]\n .reverse()\n .filter((item) => {\n let isActive = activeSet.has(item.id);\n\n isActive ||= activeColumns.every((column) => {\n const filter = filters.get(column.id);\n if (!filter || filter.external) return true;\n\n const filterValue = filterValues.get(column.id);\n if (filterValue === undefined || !filter.isActive(filterValue)) return true;\n\n const filterBy = filter.filterBy ?? ((x) => x);\n const value = filterBy(column.value(item.value), item.value);\n return castArray(value).some((value) => filter.test(filterValue, value));\n });\n\n if (isActive && item.parentId !== undefined && item.parentId !== null) {\n activeSet.add(item.parentId);\n\n if (\n revealFiltered &&\n Array.from(filters.entries()).some(([id, filter]) => {\n const filterValue = filterValues.get(id);\n return !!filter && filterValue !== undefined && filter.isActive(filterValue);\n })\n ) {\n expandedChanged ||= !draft.expanded.has(item.parentId);\n draft.expanded.add(item.parentId);\n } else if (!draft.expanded.has(item.parentId)) {\n isActive = false;\n }\n }\n\n if (isActive) {\n activeItemsById.set(item.id, item);\n }\n\n return isActive;\n })\n .reverse();\n\n draft.items = castDraft(allItems);\n draft.itemsById = castDraft(allItemsById);\n draft.activeItems = castDraft(activeItems);\n draft.activeItemsById = castDraft(activeItemsById);\n\n if (expandedChanged) {\n setTimeout(() => {\n state.getState().props.onExpandedChange?.(state.getState().expanded);\n });\n }\n },\n { runNow: true },\n ),\n [state],\n );\n}\n","export function defaultSerializer(x: unknown): string | number | Date {\n if (x instanceof Date || typeof x === 'number' || typeof x === 'string') {\n return x;\n }\n\n return JSON.stringify(x) ?? '';\n}\n","export function overrides<T extends object>(first: T, ...overrides: (Partial<T> | undefined)[]): T {\n return overrides.reduce<T>(\n (result, source) => {\n for (const [key, value] of Object.entries(source ?? {})) {\n if (value !== undefined) {\n result[key as keyof T] = value as any;\n }\n }\n\n return result;\n },\n { ...first },\n );\n}\n","import { useMemo } from 'react';\nimport { defaultSerializer } from '../exporters/serializer';\nimport { useTableMemo } from '../hooks/useTableMemo';\nimport { asString, castArray } from '../misc/helpers';\nimport { overrides } from '../misc/overrides';\nimport type { Column, Id, InternalColumn, InternalTableProps, TableProps } from '../types';\n\nconst defaultProps: InternalTableProps<any> = {\n id: () => '',\n columns: [],\n enableSelection: true,\n selectSyncChildren: true,\n stickyHeader: true,\n stickyFooter: true,\n enableColumnSelection: true,\n enableColumnResize: true,\n enableColumnReorder: true,\n displaySizeOverrides: {\n mobile: {\n enableSelection: false,\n enableColumnSelection: false,\n enableExport: false,\n enableColumnResize: false,\n enableColumnReorder: false,\n },\n },\n};\n\nexport function calcProps<T>(props: TableProps<T>): InternalTableProps<T> {\n const cache = useTableMemo();\n\n return useMemo(\n () => overrides(defaultProps, calc(props, cache)) as InternalTableProps<T>,\n [props],\n );\n}\n\nfunction calc<T>(\n props: Partial<TableProps<T>>,\n cache: ReturnType<typeof useTableMemo>,\n): Partial<InternalTableProps<T>> {\n let id;\n if (props.id instanceof Function || Array.isArray(props.id)) {\n id = cache('id', props.id);\n } else if (props.id !== undefined) {\n id = cache('id', [(item: T) => item[props.id as keyof T] as unknown as Id, props.id]);\n }\n\n let parentId;\n if (props.parentId instanceof Function || Array.isArray(props.parentId)) {\n parentId = cache('parentId', props.parentId);\n } else if (props.parentId !== undefined) {\n parentId = cache('parentId', [\n (item: T) => item[props.parentId as keyof T] as unknown as Id | undefined,\n props.parentId,\n ]);\n }\n\n const columnProps = props.columnProps && cache('columnProps', props.columnProps);\n\n let inputColumns;\n if (props.columns instanceof Function) {\n inputColumns = props.columns((value, column) => ({ ...column, value }));\n } else if (props.columns !== undefined) {\n inputColumns = props.columns.map((column) => column && { ...column, dependecies: undefined });\n }\n\n const globalDefaults = props.defaultColumnProps;\n const mapColumn = <V>(\n {\n id: _id,\n header,\n exportHeader,\n footer,\n value,\n renderCell,\n exportCell,\n sortBy,\n disableSort,\n hidden,\n classes,\n styles,\n filter,\n width,\n displaySize,\n }: Column<T, V>,\n index: number,\n ): InternalColumn<T, V> => {\n const id = _id ?? index;\n const cacheKey = typeof id === 'string' ? `s${id}` : `n${id}`;\n const defaults = { ...globalDefaults, ...columnProps?.(id) };\n\n return {\n id,\n header: header ?? defaults?.header ?? null,\n exportHeader: exportHeader ?? defaults?.exportHeader ?? id,\n footer: footer ?? defaults?.footer ?? null,\n value: cache(`columns.${cacheKey}.value`, value),\n renderCell: cache(\n `columns.${cacheKey}.renderCell`,\n renderCell ?? defaults?.renderCell ?? asString,\n ),\n exportCell: exportCell ?? defaults?.exportCell ?? defaultSerializer,\n sortBy: (\n sortBy ??\n defaults?.sortBy ?? [\n (v) =>\n typeof v === 'number' || v instanceof Date\n ? v\n : v === null || v === undefined\n ? ''\n : String(v),\n ]\n ).map((function_, i) => cache(`columns.${cacheKey}.sortBy.${i}`, function_)),\n disableSort: disableSort ?? defaults?.disableSort ?? false,\n hidden: hidden ?? defaults?.hidden,\n classes: classes ?? defaults?.classes,\n styles: styles ?? defaults?.styles,\n filter: filter ?? defaults?.filter,\n width: width ?? defaults?.width,\n displaySize:\n (displaySize ?? defaults.displaySize) !== undefined\n ? castArray((displaySize ?? defaults.displaySize)!)\n : undefined,\n };\n };\n\n const columns = inputColumns?.filter((x): x is Column<T, any> => !!x).map(mapColumn);\n\n const wrapRow = props.wrapRow && cache('wrapRow', props.wrapRow);\n const wrapCell = props.wrapCell && cache('wrapCell', props.wrapCell);\n\n const rowAction =\n props.rowAction instanceof Function || Array.isArray(props.rowAction)\n ? cache('rowAction', props.rowAction)\n : props.rowAction;\n\n const rowDetails =\n props.rowDetails instanceof Function || Array.isArray(props.rowDetails)\n ? cache('rowDetails', props.rowDetails)\n : props.rowDetails;\n\n const displaySizeOverrides =\n props.displaySizeOverrides &&\n Object.fromEntries(\n Object.entries(props.displaySizeOverrides ?? {}).map(([size, overrides]) => [\n size,\n overrides && calc(overrides, cache),\n ]),\n );\n\n return {\n ...props,\n id,\n parentId,\n columns,\n columnProps,\n wrapRow,\n wrapCell,\n rowAction,\n rowDetails,\n enableSelection: props.enableSelection,\n selectSyncChildren: props.selectSyncChildren,\n stickyHeader: props.stickyHeader,\n stickyFooter: props.stickyFooter,\n enableColumnSelection: props.enableColumnSelection,\n enableExport: props.enableExport,\n enableClearFiltersButton: props.enableClearFiltersButton,\n enableColumnResize: props.enableColumnResize,\n enableColumnReorder: props.enableColumnReorder,\n displaySizeOverrides,\n };\n}\n","import { useEffect } from 'react';\nimport type { Store } from 'schummar-state/react';\nimport { intersect } from '../misc/helpers';\nimport type { InternalTableState } from '../types';\n\nexport function cleanupState<T>(state: Store<InternalTableState<T>>): void {\n useEffect(\n () =>\n state.addReaction(\n (state) =>\n [\n state.props.columns,\n state.itemsById,\n state.activeItemsById,\n state.activeColumns,\n ] as const,\n ([columns, itemsById, activeItemsById, activeColumns], draft) => {\n const columnIds = new Set(columns.map((column) => column.id));\n const activeColumnIds = new Set(activeColumns.map((column) => column.id));\n\n // Remove sort entries for non active columns\n const newSort = draft.sort.filter((s) => activeColumnIds.has(s.columnId));\n if (newSort.length < draft.sort.length) {\n draft.sort = newSort;\n setTimeout(() => {\n state.getState().props.onSortChange?.(newSort);\n });\n }\n\n // Remove filters for non active columns\n for (const id of draft.filters.keys()) {\n if (!activeColumnIds.has(id)) draft.filters.delete(id);\n }\n\n // Remove filterValues for non active columns\n for (const id of draft.filterValues.keys()) {\n if (!activeColumnIds.has(id)) draft.filterValues.delete(id);\n }\n\n // Remove hiddenColumns for non existing columns\n for (const id of draft.hiddenColumns.keys()) {\n if (!columnIds.has(id)) draft.hiddenColumns.delete(id);\n }\n\n // Remove columnWidth for non existing columns\n for (const id of draft.columnWidths.keys()) {\n if (!columnIds.has(id)) draft.columnWidths.delete(id);\n }\n\n // Remove non existing columns from columnOrder\n for (const id of draft.columnOrder) {\n if (!columnIds.has(id)) draft.columnOrder = draft.columnOrder.filter((x) => x !== id);\n }\n\n if (draft.props.items) {\n // Remove selection for non active items\n const newSelection = intersect(draft.selection, activeItemsById);\n if (newSelection.size !== draft.selection.size) {\n draft.selection = newSelection;\n setTimeout(() => {\n state.getState().props.onSelectionChange?.(newSelection);\n });\n }\n\n // Remove expanded for non existing items\n const newExpanded = intersect(draft.expanded, itemsById);\n if (newExpanded.size < draft.expanded.size) {\n draft.expanded = newExpanded;\n setTimeout(() => {\n state.getState().props.onExpandedChange?.(newExpanded);\n });\n }\n }\n },\n { runNow: true },\n ),\n [state],\n );\n}\n","import type { Draft } from 'immer';\nimport { useEffect } from 'react';\nimport type { Store } from 'schummar-state/react';\nimport { orderBy } from '../misc/helpers';\nimport { InternalColumn, type InternalTableState } from '../types';\n\nexport function filterColumns<T>(state: Store<InternalTableState<T>>): void {\n useEffect(\n () =>\n state.addReaction(\n (state) =>\n [state.props.columns, state.hiddenColumns, state.columnOrder, state.displaySize] as const,\n ([columns, hiddenColumns, columnOrder, displaySize], draft) => {\n draft.activeColumns = orderBy(\n columns.filter((column) => !(column.hidden ?? hiddenColumns.has(column.id))),\n [(column) => columnOrder.indexOf(column.id)],\n ) as Draft<InternalColumn<T, unknown>[]>;\n\n draft.visibleColumns = draft.activeColumns.filter(\n (column) =>\n displaySize === undefined ||\n column.displaySize === undefined ||\n column.displaySize.includes(displaySize),\n );\n },\n { runNow: true },\n ),\n [state],\n );\n\n useEffect(\n () =>\n state.addReaction(\n (state) => new Set(state.visibleColumns.map((column) => column.id)),\n (_, draft) => {\n draft.rowHeights.clear();\n draft.rowHeightsKey = Math.random();\n },\n { runNow: false },\n ),\n [state],\n );\n}\n","import { useEffect } from 'react';\nimport type { Store } from 'schummar-state/react';\nimport { getAncestors, orderBy } from '../misc/helpers';\nimport type { Id, InternalTableState } from '../types';\n\nexport function normalizeExpanded<T>(table: Store<InternalTableState<T>>): void {\n useEffect(\n () =>\n table.addReaction(\n (state) => [state.props.expandOnlyOne, state.expanded, state.itemsById] as const,\n ([expandOnlyOne, , itemsById], state) => {\n let expanded = state.expanded;\n let hasChanged = false;\n\n const allAncestors = [...expanded].map((id) => {\n const item = itemsById.get(id);\n return {\n id,\n ancestors: item ? getAncestors(itemsById, item) : new Set<Id>(),\n };\n });\n\n // If only one branch may be expanded, check if there are more and close if necessary\n if (expandOnlyOne) {\n const withMostAncestors = orderBy(allAncestors, [(x) => x.ancestors.size], ['desc'])[0];\n\n if (\n [...expanded].some(\n (id) => id !== withMostAncestors?.id && !withMostAncestors?.ancestors.has(id),\n )\n ) {\n expanded = withMostAncestors?.ancestors ?? new Set();\n state.expanded = expanded;\n\n state.props.onExpandedChange?.(expanded);\n return;\n }\n }\n\n for (const { ancestors } of allAncestors) {\n for (const ancestor of ancestors ?? []) {\n if (!expanded.has(ancestor)) {\n expanded.add(ancestor);\n hasChanged = true;\n }\n }\n }\n\n if (hasChanged) {\n state.props.onExpandedChange?.(new Set(expanded));\n }\n },\n { runNow: true },\n ),\n [table],\n );\n}\n","import { useEffect } from 'react';\nimport type { Store } from 'schummar-state/react';\nimport type { InternalTableState } from '../types';\n\nexport function syncSelections<T>(table: Store<InternalTableState<T>>): void {\n useEffect(\n () =>\n table.addReaction(\n (state) => [state.props.selectSyncChildren, state.selection, state.activeItems] as const,\n ([selectSyncChildren, selection, activeItems], state) => {\n if (!selectSyncChildren) return;\n\n const newSelection = new Set(selection);\n for (const item of activeItems) {\n if (\n item.parentId !== undefined &&\n item.parentId !== null &&\n newSelection.has(item.parentId)\n ) {\n newSelection.add(item.id);\n }\n }\n\n if (newSelection.size !== selection.size) {\n state.selection = newSelection;\n setTimeout(() => {\n table.getState().props.onSelectionChange?.(newSelection);\n });\n }\n },\n { runNow: true },\n ),\n [table],\n );\n}\n","import { castDraft } from 'immer';\nimport { useEffect } from 'react';\nimport type { Store } from 'schummar-state/react';\nimport { overrides } from '../misc/overrides';\nimport type { InternalTableState } from '../types';\n\nexport function watchDisplaySize<T>(state: Store<InternalTableState<T>>): void {\n useEffect(() => {\n function onResize() {\n state.update((draft) => {\n draft.displaySizePx = window.innerWidth;\n });\n }\n\n onResize();\n document.defaultView?.addEventListener('resize', onResize);\n return () => document.defaultView?.removeEventListener('resize', onResize);\n }, [state]);\n\n useEffect(\n () =>\n state.addReaction(\n (state) => ({\n displaySizePx: state.displaySizePx,\n displaySize: state.props.displaySize,\n }),\n ({ displaySizePx, displaySize }, draft) => {\n if (displaySizePx === undefined) {\n return;\n }\n\n if (typeof displaySize === 'object') {\n const entry = Object.entries(displaySize).find(\n ([, maxWidth]) => maxWidth !== undefined && maxWidth >= displaySizePx,\n );\n draft.displaySize = entry?.[0];\n } else {\n draft.displaySize = displaySize;\n }\n },\n ),\n [state],\n );\n\n useEffect(\n () =>\n state.addReaction(\n (state) => ({\n props: state.normalizedProps,\n displaySize: state.displaySize,\n }),\n ({ props, displaySize }, draft) => {\n draft.props = castDraft(\n overrides(props, displaySize ? props.displaySizeOverrides?.[displaySize] : undefined),\n );\n },\n ),\n [state],\n );\n}\n","import { castDraft } from 'immer';\nimport { useEffect, useMemo, useState } from 'react';\nimport { Store } from 'schummar-state/react';\nimport type { InternalTableState, TableProps } from '../types';\nimport { calcItems } from './calcItems';\nimport { calcProps } from './calcProps';\nimport { cleanupState } from './cleanupState';\nimport { filterColumns } from './filterColumns';\nimport { normalizeExpanded } from './normalizeExpanded';\nimport { syncSelections } from './syncSelections';\nimport { watchDisplaySize } from './watchDisplaySize';\n\nexport function useTableState<T>(\n _props: TableProps<T>,\n): [Store<InternalTableState<T>>, () => void] {\n const [key, setKey] = useState({});\n const props = calcProps(_props);\n\n function reset() {\n setKey({});\n\n if (props.sort === undefined) {\n props.onSortChange?.(props.defaultSort ?? []);\n }\n\n if (props.expanded === undefined) {\n props.onExpandedChange?.(props.defaultExpanded ?? new Set());\n }\n\n if (props.selection === undefined) {\n props.onSelectionChange?.(props.defaultSelection ?? new Set());\n }\n\n if (props.hiddenColumns === undefined) {\n props.onHiddenColumnsChange?.(props.defaultHiddenColumns ?? new Set());\n }\n\n props.onReset?.('table');\n }\n\n const state = useMemo(\n () =>\n new Store<InternalTableState<T>>({\n normalizedProps: props,\n props,\n\n key,\n sort: props.defaultSort ?? [],\n selection: props.defaultSelection ?? new Set(),\n expanded: props.defaultExpanded ?? new Set(),\n rowHeights: new Map(),\n rowHeightsKey: Math.random(),\n filters: new Map(),\n filterValues: new Map(),\n hiddenColumns: props.defaultHiddenColumns ?? new Set(),\n columnWidths: new Map(),\n columnOrder: props.columns.map((column) => column.id),\n columnStyleOverride: new Map(),\n\n activeColumns: [],\n visibleColumns: [],\n items: [],\n itemsById: new Map(),\n activeItems: [],\n activeItemsById: new Map(),\n lastSelectedId: undefined,\n displaySizePx: undefined,\n displaySize: undefined,\n }),\n [key],\n );\n\n filterColumns(state);\n calcItems(state);\n normalizeExpanded(state);\n syncSelections(state);\n cleanupState(state);\n watchDisplaySize(state);\n\n useEffect(() => {\n state.update((state) => {\n state.normalizedProps = castDraft(props);\n\n if (props.sort) state.sort = props.sort;\n if (props.selection) state.selection = props.selection;\n if (props.expanded) state.expanded = props.expanded;\n if (props.hiddenColumns) state.hiddenColumns = props.hiddenColumns;\n for (const column of props.columns) {\n if (!state.columnOrder.includes(column.id)) {\n const index = props.columns.indexOf(column);\n state.columnOrder.splice(index, 0, column.id);\n }\n }\n });\n }, [state, props]);\n\n return [state, reset];\n}\n","import { useTheme } from '../hooks/useTheme';\nimport { useTableContext } from '../misc/tableContext';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\n\nexport default function ClearFiltersButton<T>() {\n const Button = useTheme((t) => t.components.Button);\n const textClearFilters = useTheme((t) => t.text.clearFilters);\n const table = useTableContext<T>();\n\n return (\n <div css={defaultClasses.clearFiltersButton}>\n <Button\n variant=\"outlined\"\n onClick={() => {\n table.update((state) => {\n state.activeColumns.forEach((column) => {\n state.filterValues.delete(column.id);\n });\n table.getState().props.onReset?.('filters');\n });\n }}\n >\n {textClearFilters}\n </Button>\n </div>\n );\n}\n","import { useTheme } from '../hooks/useTheme';\nimport { cx } from '../misc/helpers';\nimport { useColumnContext, useTableContext } from '../misc/tableContext';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\n\nexport function ColumnFooter() {\n const table = useTableContext();\n const columnId = useColumnContext();\n const stickyFooter = table.useState((state) => state.props.stickyFooter);\n const columnStyleOverride = table.useState((state) => state.columnStyleOverride.get(columnId), {\n throttle: 16,\n });\n const columnClasses = table.useState(\n (state) => state.activeColumns.find((column) => column.id === columnId)?.classes?.footerCell,\n );\n const classes = useTheme((theme) => theme.classes?.footerCell);\n const columnCss = table.useState(\n (state) => state.activeColumns.find((column) => column.id === columnId)?.styles?.footerCell,\n );\n const styles = useTheme((theme) => theme.styles?.footerCell);\n\n const content = table.useState((state) => {\n const column = state.activeColumns.find((column) => column.id === columnId);\n\n return column?.footer;\n });\n\n return (\n <div\n className={cx(classes, columnClasses)}\n css={[\n defaultClasses.footerCell,\n stickyFooter && defaultClasses.stickyBottom,\n stickyFooter instanceof Object && stickyFooter,\n styles,\n columnCss,\n ]}\n style={columnStyleOverride}\n >\n {content}\n </div>\n );\n}\n","import type React from 'react';\nimport type { HTMLProps } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { useColumnContext, useTableContext } from '../misc/tableContext';\n\nexport function ResizeHandle() {\n const table = useTableContext();\n const columnId = useColumnContext();\n const enabled = table.useState((state) => state.props.enableColumnResize);\n const hasFilter = table.useState((state) => state.filters.get(columnId) !== undefined);\n\n function onPointerDown(event: React.PointerEvent) {\n event.stopPropagation();\n\n const div = event.target as HTMLDivElement;\n div.setPointerCapture(event.pointerId);\n }\n\n function onPointerMove(event: React.PointerEvent) {\n event.stopPropagation();\n\n const div = event.target as HTMLDivElement;\n if (!div.hasPointerCapture(event.pointerId)) return;\n\n const parent = div.parentElement as HTMLDivElement;\n const minWidth = hasFilter ? 80 : 50;\n const width = Math.max(event.clientX - parent.getBoundingClientRect().left + 5, minWidth);\n\n table.update((state) => {\n state.columnWidths.set(columnId, `${width}px`);\n });\n }\n\n function onPointerUp(event: React.PointerEvent) {\n event.stopPropagation();\n\n const div = event.target as HTMLDivElement;\n div.releasePointerCapture(event.pointerId);\n }\n\n function onDoubleClick(event: React.MouseEvent) {\n table.update((state) => {\n if (event.getModifierState('Control')) {\n state.columnWidths.delete(columnId);\n } else {\n state.columnWidths.set(columnId, 'max-content');\n }\n });\n }\n\n if (!enabled) {\n return null;\n }\n\n return (\n <ResizeHandleView\n enabled={enabled}\n onPointerDown={enabled ? onPointerDown : undefined}\n onPointerMove={enabled ? onPointerMove : undefined}\n onPointerUp={enabled ? onPointerUp : undefined}\n onDoubleClick={enabled ? onDoubleClick : undefined}\n />\n );\n}\n\nexport function ResizeHandleView({\n enabled,\n ...props\n}: HTMLProps<HTMLDivElement> & { enabled?: boolean | 'visualOnly' }) {\n const className = useTheme((theme) => theme.classes?.columnDivider);\n const styles = useTheme((theme) => theme.styles?.columnDivider);\n\n return (\n <div\n className={className}\n css={[\n {\n alignSelf: 'stretch',\n padding: '0 5px',\n cursor: enabled === true ? 'col-resize' : 'initial',\n display: 'flex',\n alignItems: 'center',\n\n '&:after': {\n content: '\"\"',\n width: 1,\n height: '1.5em',\n background: '#c9cfda',\n transition: 'transform 300ms',\n },\n\n '@media (pointer: coarse)': {\n pointerEvents: 'none',\n },\n },\n styles,\n ]}\n {...props}\n />\n );\n}\n","import type { ReactNode } from 'react';\nimport type React from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { useColumnContext, useTableContext } from '../misc/tableContext';\n\nexport function SortComponent<T>({ children }: { children: ReactNode }): JSX.Element {\n const table = useTableContext<T>();\n const columnId = useColumnContext();\n const Badge = useTheme((t) => t.components.Badge);\n const ArrowUpward = useTheme((t) => t.icons.ArrowUpward);\n\n const { direction, index, sortDisabled } = table.useState((state) => {\n const index = state.sort.findIndex((s) => s.columnId === columnId) ?? -1;\n const column = state.activeColumns.find((column) => column.id === columnId);\n\n return {\n direction: state.sort[index]?.direction,\n index: index >= 0 && state.sort.length > 1 ? index + 1 : undefined,\n sortDisabled: column?.disableSort ?? state.props.disableSort,\n };\n });\n\n function toggle(event: React.MouseEvent, off?: boolean) {\n if (sortDisabled) {\n return;\n }\n\n const {\n props: { sort: controlledSort, onSortChange },\n } = table.getState();\n\n const newDirection = direction === 'asc' ? 'desc' : 'asc';\n const newSort =\n event.getModifierState('Control') || off\n ? table.getState().sort.filter((s) => s.columnId !== columnId)\n : [];\n if (!off) {\n newSort.push({\n columnId,\n direction: newDirection,\n });\n }\n\n onSortChange?.(newSort);\n\n if (!controlledSort) {\n table.update((state) => {\n state.sort = newSort;\n });\n }\n\n event.preventDefault();\n return false;\n }\n\n return (\n <div\n css={{\n userSelect: 'none',\n display: 'grid',\n gridTemplateColumns: 'minmax(0, 1fr) max-content',\n alignItems: 'center',\n cursor: 'pointer',\n\n '& > div': {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n },\n }}\n onClick={(event) => toggle(event)}\n onContextMenu={(event) => toggle(event, true)}\n >\n <div>{children}</div>\n\n {\n <Badge badgeContent={sortDisabled ? 0 : index}>\n <span\n css={[\n { transition: 'all 300ms', fontSize: '0.8em' },\n !direction && { opacity: 0 },\n direction === 'desc' && { transform: 'rotate3d(0, 0, 1, 180deg)' },\n ]}\n >\n <ArrowUpward />\n </span>\n </Badge>\n }\n </div>\n );\n}\n","import { castDraft } from 'immer';\nimport type React from 'react';\nimport { useEffect, useRef } from 'react';\nimport { StoreScope } from 'schummar-state/react';\nimport { useColumnContext, useTableContext } from '../misc/tableContext';\nimport { useTheme } from '../hooks/useTheme';\nimport { cx } from '../misc/helpers';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\nimport type { Id } from '../types';\nimport { FilterControl } from './filterControl';\nimport { ResizeHandle } from './resizeHandle';\nimport { SortComponent } from './sortComponent';\n\nexport interface ColumnHeaderProps {\n index: number;\n}\n\nexport const ColumnHeaderContext = new StoreScope({\n items: new Map<Id, HTMLDivElement>(),\n});\n\nexport function ColumnHeader({ index }: ColumnHeaderProps): JSX.Element {\n const ref = useRef<HTMLDivElement>(null);\n const columnId = useColumnContext();\n const table = useTableContext();\n const enabled = table.useState((state) => state.props.enableColumnReorder);\n const columnStyleOverride = table.useState((state) => state.columnStyleOverride.get(columnId), {\n throttle: 16,\n });\n const stickyHeader = table.useState((state) => state.props.stickyHeader);\n const classes = useTheme((theme) => theme.classes?.headerCell);\n const styles = useTheme((theme) => theme.styles?.headerCell);\n\n const { header, columnClasses, columnStyles } = table.useState((state) => {\n const column = state.activeColumns.find((column) => column.id === columnId);\n return {\n header: column?.header,\n columnClasses: column?.classes?.headerCell,\n columnStyles: column?.styles?.headerCell,\n };\n });\n\n const store = ColumnHeaderContext.useStore();\n const draggingStart = useRef<{ mouseX: number; bounds: DOMRect }>();\n const clone = useRef<HTMLDivElement>();\n\n // Track each headers div in a store\n useEffect(() => {\n const div = ref.current;\n if (!div) return;\n\n store.update((state) => {\n state.items.set(columnId, castDraft(div));\n });\n\n return () => {\n store.update((state) => {\n state.items.delete(columnId);\n });\n };\n }, [store, columnId]);\n\n // Calculate which index the current header would get, given the current offset\n function calcTargetIndex(offsetLeft: number) {\n const cols = table\n .getState()\n .columnOrder.map((id) => ({ id, div: store.getState().items.get(id) }));\n\n const otherCols = cols.filter((col) => col.id !== columnId);\n\n const firstOffsetleft = cols.find((col) => col.div)?.div?.offsetLeft ?? 0;\n\n let sum = 0;\n const targetIndex = otherCols.findIndex((col) => {\n const width = col.div?.offsetWidth ?? 0;\n if (sum + width / 2 > offsetLeft - firstOffsetleft) return true;\n sum += width;\n return false;\n });\n\n return targetIndex === -1 ? otherCols.length : targetIndex;\n }\n\n // When starting clicking: Record initial mouse and div's bounds\n function onPointerDown(event: React.PointerEvent) {\n const div = ref.current;\n if (!div) return;\n draggingStart.current = { mouseX: event.clientX, bounds: div.getBoundingClientRect() };\n }\n\n // When mouse moves while clicked: Calculate transforms\n function onPointerMove(event: React.PointerEvent) {\n table.update((state) => {\n const div = ref.current;\n if (\n !div ||\n draggingStart.current === undefined ||\n Math.abs(event.clientX - draggingStart.current.mouseX) < 5\n )\n return;\n\n event.stopPropagation();\n div.setPointerCapture(event.pointerId);\n\n // Create clone of header div to move around with mouse\n if (!clone.current) {\n clone.current = div.cloneNode(true) as HTMLDivElement;\n document.body.append(clone.current);\n\n for (const [key, value] of Object.entries(getComputedStyle(div))) {\n try {\n clone.current.style[key as any] = value;\n } catch {\n // ignore\n }\n }\n\n Object.assign(clone.current.style, {\n pointerEvents: 'none',\n position: 'fixed',\n boxShadow:\n '0px 5px 5px -3px rgb(0 0 0 / 20%), 0px 8px 10px 1px rgb(0 0 0 / 14%), 0px 3px 14px 2px rgb(0 0 0 / 12%)',\n left: `${draggingStart.current.bounds.left}px`,\n top: `${draggingStart.current.bounds.top}px`,\n });\n\n div.style.color = 'rgba(0, 0, 0, 0.2)';\n }\n\n // Update clone's position each time\n clone.current.style.left = `${\n draggingStart.current.bounds.left + event.clientX - draggingStart.current.mouseX\n }px`;\n\n // Calculate target index\n const index = state.columnOrder.indexOf(columnId);\n const targetIndex = calcTargetIndex(\n div.offsetLeft + event.clientX - draggingStart.current.mouseX,\n );\n\n // Apply transforms to each column\n const columns = table.getState().columnOrder.map((id, index) => ({\n id,\n index,\n width: store.getState().items.get(id)?.offsetWidth ?? 0,\n }));\n\n state.columnOrder.forEach((id, i) => {\n let offset = 0;\n if (i === index) {\n // Current column: Move to target pos\n if (targetIndex > index) {\n offset = columns\n .slice(index + 1, targetIndex + 1)\n .reduce((sum, col) => sum + col.width, 0);\n } else if (targetIndex < index) {\n offset = -columns.slice(targetIndex, index).reduce((sum, col) => sum + col.width, 0);\n }\n } else if (i >= targetIndex && i < index) {\n // Left columns: Move right to make room if needed\n offset = div.offsetWidth;\n } else if (i > index && i <= targetIndex) {\n // Right columns: Move left to make room if needed\n offset = -div.offsetWidth;\n }\n\n state.columnStyleOverride.set(id, {\n transition: 'transform 500ms',\n transform: `translate3d(${offset}px, 0, 0)`,\n zIndex: i === index ? 1 : undefined,\n });\n });\n });\n }\n\n // When releasing mouse: Reset draggin state and apply column move\n function onPointerUp(event: React.PointerEvent) {\n table.update((state) => {\n const div = ref.current;\n if (!div || draggingStart.current === undefined) return;\n\n // Apply column move\n const index = state.columnOrder.indexOf(columnId);\n const targetIndex = calcTargetIndex(\n div.offsetLeft + event.clientX - draggingStart.current.mouseX,\n );\n\n state.columnOrder.splice(index, 1);\n state.columnOrder.splice(targetIndex, 0, columnId);\n\n // Cleanup\n clone.current?.remove();\n div.style.color = '';\n state.columnStyleOverride.clear();\n draggingStart.current = undefined;\n clone.current = undefined;\n });\n }\n\n return (\n <div\n ref={ref}\n className={cx(classes, columnClasses)}\n css={[\n defaultClasses.headerCell,\n {\n gridRow: 1,\n gridColumn: index + 3,\n position: 'relative',\n userSelect: 'none',\n },\n stickyHeader && defaultClasses.sticky,\n stickyHeader instanceof Object && stickyHeader,\n styles,\n columnStyles,\n ]}\n style={columnStyleOverride}\n onPointerDown={enabled ? onPointerDown : undefined}\n onPointerMove={enabled ? onPointerMove : undefined}\n onPointerUp={enabled ? onPointerUp : undefined}\n >\n <SortComponent>{header}</SortComponent>\n <div css={{ flex: 1 }} />\n <FilterControl />\n <ResizeHandle />\n </div>\n );\n}\n","import { useContext, useState } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { TableResetContext, useTableContext } from '../misc/tableContext';\nimport { useCssVariables } from '../theme/useCssVariables';\nimport type { InternalColumn } from '../types';\nimport { FormControlLabel } from './formControlLabel';\n\nexport function ColumnSelection<T>(): JSX.Element {\n const IconButton = useTheme((t) => t.components.IconButton);\n const Popover = useTheme((t) => t.components.Popover);\n const Checkbox = useTheme((t) => t.components.Checkbox);\n const Button = useTheme((t) => t.components.Button);\n const Settings = useTheme((t) => t.icons.Settings);\n const selectColumns = useTheme((t) => t.text.selectColumns);\n const resetAll = useTheme((t) => t.text.resetAll);\n const showAll = useTheme((t) => t.text.showAllColumns);\n const hideAll = useTheme((t) => t.text.hideAllColumns);\n const classes = useTheme((t) => t.classes);\n const cssVariables = useCssVariables();\n\n const table = useTableContext<T>();\n const reset = useContext(TableResetContext);\n const columns = table.useState((state) =>\n state.props.columns.filter(\n (column) =>\n state.displaySize === undefined ||\n column.displaySize === undefined ||\n column.displaySize.includes(state.displaySize),\n ),\n );\n const hiddenColumns = table.useState((state) => state.hiddenColumns);\n\n const [anchorElement, setAnchorElement] = useState<Element | null>(null);\n\n const toggle = (column?: InternalColumn<T, unknown>, state?: boolean) => {\n const {\n props: { hiddenColumns: controlledHiddenColumns, onHiddenColumnsChange },\n } = table.getState();\n\n const newValue = new Set(hiddenColumns);\n\n for (const columnId of column ? [column.id] : columns.map((column) => column.id)) {\n if (state ?? hiddenColumns.has(columnId)) {\n newValue.delete(columnId);\n } else {\n newValue.add(columnId);\n }\n }\n\n if (!controlledHiddenColumns) {\n table.update((state) => {\n state.hiddenColumns = newValue;\n });\n }\n\n onHiddenColumnsChange?.(newValue);\n };\n\n const allVisible = columns.every((column) => !hiddenColumns.has(column.id));\n\n return (\n <>\n <IconButton onClick={(event) => setAnchorElement(anchorElement ? null : event.currentTarget)}>\n <Settings />\n </IconButton>\n\n <Popover\n anchorEl={anchorElement}\n open={!!anchorElement}\n onClose={() => setAnchorElement(null)}\n css={cssVariables}\n className={classes?.popover}\n backdropClassName={classes?.popoverBackdrop}\n >\n <div css={{ padding: `calc(var(--spacing) * 2)`, display: 'grid' }}>\n <div css={{ marginBottom: 'var(--spacing)' }}>{selectColumns}</div>\n\n <div css={{ margin: '0.5em 0', display: 'flex', gap: '0.5em' }}>\n <Button variant=\"outlined\" onClick={() => toggle(undefined, !allVisible)}>\n {allVisible ? hideAll : showAll}\n </Button>\n\n <Button variant=\"outlined\" onClick={reset}>\n {resetAll}\n </Button>\n </div>\n\n {columns.map((column) => (\n <FormControlLabel\n key={column.id}\n control={\n <Checkbox\n checked={!(column.hidden ?? hiddenColumns.has(column.id))}\n onChange={() => toggle(column)}\n disabled={column.hidden !== undefined}\n />\n }\n label={column.header}\n ></FormControlLabel>\n ))}\n </div>\n </Popover>\n </>\n );\n}\n","import { useContext, useState } from 'react';\nimport { ExportOptions, ExporterEntry } from '../exporters/exporter';\nimport { useTheme } from '../hooks/useTheme';\nimport { useTableContext } from '../misc/tableContext';\nimport { TableSettingsContext } from '../misc/tableSettings';\nimport { useCssVariables } from '../theme/useCssVariables';\n\nexport function Export<T>(): JSX.Element {\n const { exporters: contextExporters } = useContext(TableSettingsContext);\n const table = useTableContext<T>();\n const Button = useTheme((t) => t.components.Button);\n const IconButton = useTheme((t) => t.components.IconButton);\n const Popover = useTheme((t) => t.components.Popover);\n const ExportIcon = useTheme((t) => t.icons.Export);\n const Clipboard = useTheme((t) => t.icons.Clipboard);\n const exportTitle = useTheme((t) => t.text.exportTitle);\n const exportCopy = useTheme((t) => t.text.exportCopy);\n const exportDownload = useTheme((t) => t.text.exportDownload);\n const classes = useTheme((t) => t.classes);\n const cssVariables = useCssVariables();\n\n const { all, exporters } = table.useState((state): ExportOptions => {\n if (typeof state.props.enableExport === 'boolean' || state.props.enableExport === undefined) {\n return {\n all: false,\n exporters: contextExporters,\n };\n }\n\n return state.props.enableExport;\n });\n\n const [anchor, setAnchor] = useState<Element | null>(null);\n\n function execute({ action, exporter }: ExporterEntry) {\n const { activeColumns, activeItems, items } = table.getState();\n const columns = activeColumns.map((column) => column.exportHeader);\n const rows = (all ? items : activeItems).map((item) =>\n activeColumns.map((column) => column.exportCell(column.value(item.value), item.value)),\n );\n\n if (action === 'copy') {\n const data = exporter.exportToString(columns, rows);\n navigator.clipboard.writeText(data);\n } else {\n const blob = exporter.exportToBlob(columns, rows);\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `export.${exporter.fileEnding}`;\n document.body.append(a);\n a.click();\n a.remove();\n URL.revokeObjectURL(url);\n }\n }\n\n return (\n <>\n <IconButton onClick={(event) => setAnchor(anchor ? null : event.currentTarget)}>\n <ExportIcon css={!!anchor && { color: 'var(--primaryMain)' }} />\n </IconButton>\n\n <Popover\n open={!!anchor}\n onClose={() => setAnchor(null)}\n anchorEl={anchor}\n css={cssVariables}\n className={classes?.popover}\n backdropClassName={classes?.popoverBackdrop}\n >\n <div\n css={{\n padding: `calc(var(--spacing) * 2)`,\n display: 'grid',\n justifyItems: 'stretch',\n gap: 'var(--spacing)',\n\n '& > *': {\n justifyContent: 'start',\n },\n }}\n >\n <div css={{ marginBottom: 'var(--spacing)' }}>{exportTitle}</div>\n\n {exporters.map((entry, index) => (\n <Button\n key={index}\n startIcon={entry.action === 'copy' ? <Clipboard /> : <ExportIcon />}\n onClick={() => execute(entry)}\n >\n {entry.action === 'copy' ? exportCopy : exportDownload} (.{entry.exporter.type})\n </Button>\n ))}\n </div>\n </Popover>\n </>\n );\n}\n","import type { MemoizedTableTheme } from '../types';\n\nexport function calcClassNames<T>(\n classes: MemoizedTableTheme<T>['classes'] | undefined,\n item: T,\n index: number,\n) {\n return [\n classes?.cell instanceof Function ? classes.cell(item, index) : classes?.cell,\n index % 2 === 0 && classes?.evenCell,\n index % 2 === 1 && classes?.oddCell,\n ];\n}\n\nexport function calcCss<T>(\n styles: MemoizedTableTheme<T>['styles'] | undefined,\n item: T | undefined,\n index: number,\n) {\n return [\n styles?.cell instanceof Function\n ? item !== undefined\n ? styles.cell(item, index)\n : undefined\n : styles?.cell,\n index % 2 === 0 && styles?.evenCell,\n index % 2 === 1 && styles?.oddCell,\n ];\n}\n","import type { ReactNode } from 'react';\nimport { memo, useLayoutEffect } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { calcClassNames, calcCss } from '../misc/calcClassNames';\nimport { cx } from '../misc/helpers';\nimport { useColumnContext, useTableContext } from '../misc/tableContext';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\nimport type { Id } from '../types';\n\nconst defaultWrapCell = (content: ReactNode) => {\n if (typeof content === 'string') {\n return (\n <span css={defaultClasses.text} title={content}>\n {content}\n </span>\n );\n }\n return content;\n};\n\nexport const Cell = memo(function Cell<T>({ itemId, rowIndex }: { itemId: Id; rowIndex: number }) {\n const table = useTableContext<T>();\n const columnId = useColumnContext();\n\n const column = table.useState((state) => {\n const col = state.activeColumns.find((column) => column.id === columnId);\n return (\n col && {\n value: col.value,\n renderCell: col.renderCell,\n }\n );\n });\n const wrapCell = table.useState((state) => state.props.wrapCell) ?? defaultWrapCell;\n const item = table.useState((state) => state.activeItemsById.get(itemId));\n const columnStyleOverride = table.useState((state) => state.columnStyleOverride.get(columnId), {\n throttle: 16,\n });\n\n useLayoutEffect(() => {\n table.getState().props.debugRender?.('render cell', itemId, columnId);\n });\n const className = useTheme((t) => cx(...calcClassNames(t.classes, item?.value, rowIndex)));\n const styles = useTheme((t) => calcCss<T>(t.styles, item?.value, rowIndex));\n\n if (!column || !item) return null;\n\n const content = column.renderCell(column.value(item.value), item.value);\n\n return (\n <div className={className} css={[defaultClasses.cell, styles]} style={columnStyleOverride}>\n {wrapCell(content, column.value(item.value), item.value, rowIndex)}\n </div>\n );\n});\n","import { forwardRef } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { useTableContext } from '../misc/tableContext';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\nimport { Id } from '../types';\n\nexport const Details = forwardRef<\n HTMLDivElement,\n {\n itemId: Id;\n rowIndex: number;\n }\n>(function Details({ itemId, rowIndex }, ref) {\n const table = useTableContext<unknown>();\n const classes = useTheme((t) => t.classes);\n const styles = useTheme((t) => t.styles);\n\n const { details, className, css } = table.useState((state) => {\n const item = state.activeItemsById.get(itemId);\n\n return {\n details: state.expanded.has(itemId)\n ? state.props.rowDetails instanceof Function\n ? item\n ? state.props.rowDetails(item.value, rowIndex)\n : null\n : state.props.rowDetails\n : undefined,\n className:\n classes?.details instanceof Function\n ? classes.details(item?.value, rowIndex)\n : classes?.details,\n css:\n styles?.details instanceof Function\n ? styles.details(item?.value, rowIndex)\n : styles?.details,\n };\n });\n\n return details ? (\n <div ref={ref} className={className} css={[defaultClasses.details, css]}>\n {details}\n </div>\n ) : null;\n});\n","import type { MouseEvent } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { getAncestors, getDescendants } from '../misc/helpers';\nimport { useTableContext } from '../misc/tableContext';\nimport type { Id } from '../types';\n\nexport function ExpandControl<T>({\n itemId,\n hasDeferredChildren,\n}: {\n itemId: Id;\n hasDeferredChildren?: boolean;\n}): JSX.Element {\n const IconButton = useTheme((t) => t.components.IconButton);\n const Spinner = useTheme((t) => t.components.Spinner);\n const ChevronRight = useTheme((t) => t.icons.ChevronRight);\n\n const table = useTableContext<T>();\n const isExpanded = table.useState((state) => state.expanded.has(itemId));\n const hasChildren = table.useState(\n (state) => !!state.activeItemsById.get(itemId)?.children.length,\n );\n\n function toggle(e: MouseEvent) {\n e.preventDefault();\n e.stopPropagation();\n\n const {\n props: { expanded: controlledExpanded, expandOnlyOne, onExpandedChange },\n expanded,\n activeItemsById,\n } = table.getState();\n\n const newExpanded = new Set(expanded);\n\n if (expandOnlyOne) {\n newExpanded.clear();\n\n const item = activeItemsById.get(itemId);\n for (const ancestor of item ? getAncestors(activeItemsById, item) : []) {\n newExpanded.add(ancestor);\n }\n }\n\n if (isExpanded) {\n newExpanded.delete(itemId);\n\n const item = activeItemsById.get(itemId);\n for (const descendant of item ? getDescendants(item) : []) {\n newExpanded.delete(descendant);\n }\n } else {\n newExpanded.add(itemId);\n }\n\n onExpandedChange?.(newExpanded);\n\n if (!controlledExpanded) {\n table.update((state) => {\n state.expanded = newExpanded;\n });\n }\n }\n\n if (isExpanded && hasDeferredChildren && !hasChildren) {\n return <Spinner css={{ margin: '0 var(--spacing)' }} />;\n }\n\n return (\n <IconButton onClick={toggle}>\n <span\n css={{\n display: 'inline-flex',\n transition: 'all 300ms',\n transform: isExpanded ? 'rotate3d(0, 0, 1, 90deg)' : 'rotate3d(0, 0, 1, 0deg)',\n }}\n >\n <ChevronRight />\n </span>\n </IconButton>\n );\n}\n","import type React from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { getAncestors, getDescendants } from '../misc/helpers';\nimport { useTableContext } from '../misc/tableContext';\nimport type { Id } from '../types';\n\nexport function SelectComponent<T>({ itemId }: { itemId?: Id }): JSX.Element {\n const table = useTableContext<T>();\n const Checkbox = useTheme((t) => t.components.Checkbox);\n\n const isSelected = table.useState((state) => {\n const itemIds = itemId ? [itemId] : Array.from(state.activeItemsById.keys());\n return state.activeItemsById.size > 0 && itemIds.every((itemId) => state.selection.has(itemId));\n });\n\n function toggle(event: React.ChangeEvent) {\n const mouseEvent = event.nativeEvent as MouseEvent;\n\n const {\n activeItems,\n activeItemsById,\n lastSelectedId,\n selection,\n props: { selectSyncChildren, selection: controlledSelection, onSelectionChange },\n } = table.getState();\n\n let range;\n if (mouseEvent.shiftKey && itemId) {\n const a = lastSelectedId ? activeItems.findIndex((i) => lastSelectedId === i.id) : 0;\n const b = activeItems.findIndex((item) => item.id === itemId);\n range = activeItems.slice(Math.min(a, b), Math.max(a, b) + 1);\n } else {\n const item = itemId ? activeItemsById.get(itemId) : undefined;\n range = item ? [item] : activeItems;\n }\n\n const newSelection = new Set(selection);\n for (const item of range) {\n if (isSelected) newSelection.delete(item.id);\n else newSelection.add(item.id);\n }\n\n if (selectSyncChildren && isSelected) {\n for (const ancestor of getAncestors(activeItemsById, ...range)) {\n newSelection.delete(ancestor);\n }\n for (const descendant of getDescendants(...range)) {\n newSelection.delete(descendant);\n }\n }\n\n onSelectionChange?.(newSelection);\n\n if (!controlledSelection) {\n table.update((state) => {\n state.selection = newSelection;\n });\n }\n\n table.update((state) => {\n state.lastSelectedId = itemId;\n });\n }\n\n return (\n <Checkbox\n css={{\n justifySelf: 'start',\n color: '#c9cfda',\n }}\n checked={isSelected}\n onChange={toggle}\n />\n );\n}\n","import { ClassNames } from '@emotion/react';\nimport { memo, useLayoutEffect, useRef } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { calcClassNames, calcCss } from '../misc/calcClassNames';\nimport { cx, getAncestors } from '../misc/helpers';\nimport { ColumnContext, useTableContext } from '../misc/tableContext';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\nimport type { Id } from '../types';\nimport { Cell } from './cell';\nimport { Details } from './details';\nimport { ExpandControl } from './expandControl';\nimport { SelectComponent } from './selectComponent';\n\nexport const Row = memo(function Row<T>({\n itemId,\n rowIndex,\n rowHeightsKey,\n}: {\n itemId: Id;\n rowIndex: number;\n rowHeightsKey: {};\n}): JSX.Element | null {\n const table = useTableContext<T>();\n const divRef = useRef<HTMLDivElement>(null);\n const detailsDivRef = useRef<HTMLDivElement>(null);\n\n const classes = useTheme((t) => t.classes);\n const styles = useTheme((t) => t.styles);\n\n const item = table.useState((state) => state.activeItemsById.get(itemId));\n const wrapRow = table.useState((state) => state.props.wrapRow) ?? ((props) => <div {...props} />);\n const rowClassName =\n classes?.row instanceof Function ? classes.row(item?.value, rowIndex) : classes?.row;\n const rowStyles =\n styles?.row instanceof Function ? styles.row(item?.value, rowIndex) : styles?.row;\n const subgrid = table.useState((state) => state.props.subgrid);\n\n const {\n cellClassName,\n css_,\n indent,\n hasChildren,\n hasDeferredChildren,\n columnIds,\n enableSelection,\n rowAction,\n hasDetails,\n } = table.useState((state) => {\n const item = state.activeItemsById.get(itemId);\n\n return {\n cellClassName: cx(...calcClassNames(classes, item?.value, rowIndex)),\n css_: calcCss<T>(styles, item?.value, rowIndex),\n indent: item ? getAncestors(state.activeItemsById, item).size : 0,\n hasChildren: !!item?.children.length,\n hasDeferredChildren: item && state.props.hasDeferredChildren?.(item.value),\n columnIds: state.visibleColumns.map((column) => column.id),\n enableSelection: state.props.enableSelection,\n rowAction:\n state.props.rowAction instanceof Function\n ? item\n ? state.props.rowAction(item.value, rowIndex)\n : null\n : state.props.rowAction,\n hasDetails:\n state.props.rowDetails instanceof Function\n ? item\n ? !!state.props.rowDetails(item.value, rowIndex)\n : null\n : !!state.props.rowDetails,\n };\n });\n\n useLayoutEffect(() => {\n function update() {\n table.update((state) => {\n if (!divRef.current) {\n return;\n }\n\n const h1 = divRef.current.offsetHeight;\n const h2 =\n detailsDivRef.current && document.contains(detailsDivRef.current)\n ? detailsDivRef.current.offsetHeight\n : 0;\n\n state.rowHeights.set(itemId, h1 + h2);\n });\n }\n\n update();\n\n const handles = [divRef.current, detailsDivRef.current]\n .filter((x): x is HTMLDivElement => !!x)\n .map((div) => {\n const o = new ResizeObserver(update);\n o.observe(div);\n return () => o.disconnect();\n });\n\n return () => {\n handles.forEach((h) => h());\n };\n }, [table, itemId, divRef.current, detailsDivRef.current, rowHeightsKey]);\n\n useLayoutEffect(() => {\n table.getState().props.debugRender?.('render row', itemId);\n });\n\n if (!item) {\n return null;\n }\n\n return (\n <ClassNames>\n {({ css, cx }) => (\n <>\n {wrapRow(\n {\n className: cx(\n css([\n subgrid\n ? {\n gridColumn: `1 / -1`,\n display: 'grid',\n gridTemplateColumns: 'subgrid',\n }\n : {\n display: 'contents',\n },\n rowStyles,\n ]),\n rowClassName,\n ),\n\n children: (\n <>\n <div\n className={cellClassName}\n css={[defaultClasses.cellFill, css_]}\n ref={divRef}\n />\n\n <div\n className={cellClassName}\n css={[defaultClasses.cell, defaultClasses.firstCell, css_]}\n >\n {indent > 0 && <div css={{ width: indent * 20 }} />}\n\n {enableSelection && <SelectComponent itemId={itemId} />}\n\n {(hasChildren || hasDeferredChildren || hasDetails) && (\n <ExpandControl itemId={itemId} hasDeferredChildren={hasDeferredChildren} />\n )}\n\n {rowAction}\n </div>\n\n {columnIds.map((columnId) => (\n <ColumnContext.Provider key={columnId} value={columnId}>\n <Cell itemId={itemId} rowIndex={rowIndex} />\n </ColumnContext.Provider>\n ))}\n\n <div className={cellClassName} css={[defaultClasses.cellFill, css_]} />\n\n <Details ref={detailsDivRef} itemId={itemId} rowIndex={rowIndex} />\n </>\n ),\n },\n item.value,\n rowIndex,\n )}\n </>\n )}\n </ClassNames>\n );\n});\n","import type { HTMLProps, ReactNode } from 'react';\nimport { useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { useTableContext } from '../misc/tableContext';\nimport { throttle } from '../misc/throttle';\nimport type { Id } from '../types';\n\nconst findScrollRoot = (x: HTMLElement): HTMLElement => {\n const parent = x.parentElement;\n if (!parent) return document.documentElement;\n if (parent.scrollHeight > parent.clientHeight && getComputedStyle(parent).overflowY !== 'visible')\n return parent;\n return findScrollRoot(parent);\n};\n\nconst relativeOffset = (x: HTMLElement, y: HTMLElement): number => {\n if (x.offsetParent === y.offsetParent || !x.offsetParent) return x.offsetTop - y.offsetTop;\n if (x.offsetParent instanceof HTMLElement) return relativeOffset(x.offsetParent, y) + x.offsetTop;\n return 0;\n};\n\nexport function Virtualized<T>({\n header,\n footer,\n children,\n ...props\n}: {\n header: ReactNode;\n footer: ReactNode;\n children: (itemIds: Id[], startIndex: number) => ReactNode;\n} & Omit<HTMLProps<HTMLDivElement>, 'children'>): JSX.Element {\n const table = useTableContext<T>();\n const virtual = table.useState((state) => state.props.virtual);\n const probeRef = useRef<HTMLDivElement>(null);\n const [, setId] = useState({});\n\n const {\n itemIds = [],\n from = 0,\n to,\n before = 0,\n after = 0,\n } = table.useState(\n (state) => {\n const itemIds = state.activeItems.map((item) => item.id);\n const root = probeRef.current && findScrollRoot(probeRef.current);\n if (!state.props.virtual) return { itemIds };\n if (!probeRef.current || !root || !document.contains(root)) return {};\n\n const {\n rowHeight,\n initalRowHeight,\n overscan = 100,\n overscanTop,\n overscanBottom,\n } = (state.props.virtual instanceof Object ? state.props.virtual : undefined) ?? {};\n\n let totalHeight = 0;\n const rowHeights = itemIds.map((itemId, index) => {\n const h =\n rowHeight ??\n state.rowHeights.get(itemId) ??\n initalRowHeight ??\n (index === 0 ? 100 : totalHeight / index);\n totalHeight += h;\n return h;\n });\n\n const probeOffset = relativeOffset(probeRef.current, root);\n const headerHeight = probeRef.current.offsetTop;\n const topOfTable = root.scrollTop - probeOffset + headerHeight;\n const bottomOfTable = topOfTable + root.clientHeight - headerHeight;\n\n let from = 0;\n let to = itemIds.length;\n let before = 0;\n let after = 0;\n for (const h of rowHeights) {\n if (before + h > topOfTable - (overscanTop ?? overscan)) break;\n from++;\n before += h;\n }\n\n for (const h of rowHeights.reverse()) {\n if (after + h > totalHeight - bottomOfTable - (overscanBottom ?? overscan)) break;\n to--;\n after += h;\n }\n\n return { itemIds: itemIds.slice(from, to), from, to, before, after };\n },\n { throttle: 16 },\n );\n\n const throttleScroll = (typeof virtual === 'boolean' ? undefined : virtual)?.throttleScroll ?? 16;\n const update = useMemo(() => throttle(() => setId({}), throttleScroll), [throttleScroll]);\n\n useEffect(() => {\n if (!virtual || !probeRef.current) return;\n\n window.addEventListener('scroll', update, true);\n window.addEventListener('resize', update, true);\n return () => {\n window.removeEventListener('scroll', update, true);\n window.removeEventListener('resize', update, true);\n };\n }, [update, virtual]);\n\n useEffect(() => update.cancel, [update]);\n\n useLayoutEffect(() => {\n table.getState().props.debugRender?.(`Virtualized render ${from} to ${to}`);\n });\n\n return (\n <div {...props}>\n {header}\n\n {virtual && <div style={{ gridColumn: '1 / -1', height: before }} ref={probeRef} />}\n\n {children(itemIds, from)}\n\n {virtual && <div style={{ gridColumn: '1 / -1', height: after }} />}\n\n {footer}\n </div>\n );\n}\n","import { forwardRef, memo, useEffect, useLayoutEffect, useState, type ForwardedRef } from 'react';\nimport { TableMemoContextProvider } from '../hooks/useTableMemo';\nimport useTableRef from '../hooks/useTableRef';\nimport { useTheme } from '../hooks/useTheme';\nimport { useTableStateStorage } from '../internalState/tableStateStorage';\nimport { useTableState } from '../internalState/useTableState';\nimport {\n ColumnContext,\n TableContext,\n TableResetContext,\n useTableContext,\n} from '../misc/tableContext';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\nimport { useCssVariables } from '../theme/useCssVariables';\nimport type { TableProps, TableRef } from '../types';\nimport ClearFiltersButton from './clearFiltersButton';\nimport { ColumnFooter } from './columnFooter';\nimport { ColumnHeader, ColumnHeaderContext } from './columnHeader';\nimport { ColumnSelection } from './columnSelection';\nimport { Export } from './export';\nimport { ResizeHandleView } from './resizeHandle';\nimport { Row } from './row';\nimport { SelectComponent } from './selectComponent';\nimport { Virtualized } from './virtualized';\n\nexport const Table = forwardRef(_Table) as <T>(\n props: TableProps<T> & { ref?: ForwardedRef<TableRef> },\n) => ReturnType<typeof _Table>;\n\nfunction _Table<T>(props: TableProps<T>, ref: ForwardedRef<TableRef>): JSX.Element {\n const [table, resetState] = useTableState(props);\n const [isHydrated, clearStorage] = useTableStateStorage(table);\n useTableRef(table, ref);\n\n async function reset() {\n await clearStorage();\n resetState();\n }\n\n useLayoutEffect(() => {\n table.getState().props.debugRender?.('render table');\n });\n\n return (\n <TableContext.Provider value={table}>\n <TableResetContext.Provider value={reset}>\n <TableMemoContextProvider>\n <TableLoadingState isHydrated={isHydrated} />\n </TableMemoContextProvider>\n </TableResetContext.Provider>\n </TableContext.Provider>\n );\n}\n\nfunction TableLoadingState({ isHydrated }: { isHydrated: boolean }) {\n const loadingText = useTheme((t) => t.text.loading);\n const [showLoading, setShowLoading] = useState(false);\n\n useEffect(() => {\n const handle = setTimeout(() => setShowLoading(true), 500);\n return () => clearTimeout(handle);\n });\n\n return (\n <>\n {!isHydrated && showLoading && <div>{loadingText}</div>}\n <TableInner hidden={!isHydrated} />\n </>\n );\n}\n\nconst TableInner = memo(function TableInner<T>({ hidden }: { hidden: boolean }) {\n const table = useTableContext<T>();\n const fullWidth = table.useState((state) => state.props.fullWidth);\n\n const visibleColumns = table.useState((state) =>\n state.visibleColumns.map((column) => ({\n id: column.id,\n width: column.width,\n classes: column.classes,\n styles: column.styles,\n footer: column.footer,\n })),\n );\n\n const hasActiveFilters = table.useState((state) => {\n return state.activeColumns.some((column) => {\n const filter = state.filters.get(column.id);\n const filterValue = state.filterValues.get(column.id);\n return filter !== undefined && filterValue !== undefined && filter.isActive(filterValue);\n });\n });\n const columnWidths = table.useState((state) => state.columnWidths, { throttle: 16 });\n const hasFooter = table.useState((state) => state.activeColumns.some((column) => column.footer));\n\n const classes = useTheme((theme) => theme.classes);\n const styles = useTheme((theme) => theme.styles);\n const stickyHeader = table.useState((state) => state.props.stickyHeader);\n const stickyFooter = table.useState((state) => state.props.stickyFooter);\n\n const enableSelection = table.useState((state) => state.props.enableSelection);\n const enableColumnSelection = table.useState((state) => state.props.enableColumnSelection);\n const enableExport = table.useState((state) => state.props.enableExport);\n const cssVariables = useCssVariables();\n const rowHeightsKey = table.useState((state) => state.rowHeightsKey);\n\n const enableClearFiltersButton = table.useState((state) => state.props.enableClearFiltersButton);\n\n useLayoutEffect(() => {\n table.getState().props.debugRender?.('render table inner');\n });\n\n return (\n <Virtualized\n className={classes?.table}\n css={[cssVariables, defaultClasses.table, styles?.table, hidden && { visibility: 'hidden' }]}\n style={{\n gridTemplateColumns: [\n //\n fullWidth === 'right' || fullWidth === true ? 'auto' : '0',\n 'max-content',\n ...visibleColumns.map(\n (column) => columnWidths.get(column.id) ?? column.width ?? 'max-content',\n ),\n fullWidth === 'left' || fullWidth === true ? 'auto' : '0',\n ].join(' '),\n }}\n header={\n <>\n <div\n className={classes?.headerCell}\n css={[\n { gridRow: 1, gridColumn: 1 },\n defaultClasses.headerFill,\n stickyHeader && defaultClasses.sticky,\n stickyHeader instanceof Object && stickyHeader,\n styles?.headerCell,\n ]}\n />\n\n <div\n className={classes?.headerCell}\n css={[\n { gridRow: 1, gridColumn: 2 },\n defaultClasses.headerCell,\n stickyHeader && defaultClasses.sticky,\n stickyHeader instanceof Object && stickyHeader,\n styles?.headerCell,\n ]}\n >\n {enableSelection && <SelectComponent />}\n\n {enableColumnSelection && <ColumnSelection />}\n\n {enableExport && <Export />}\n\n {(enableSelection || enableColumnSelection || enableExport) && (\n <>\n <div css={{ flex: 1 }} />\n <ResizeHandleView />\n </>\n )}\n </div>\n\n <ColumnHeaderContext.Provider>\n {visibleColumns.map((column, index) => (\n <ColumnContext.Provider key={column.id} value={column.id}>\n <ColumnHeader index={index} />\n </ColumnContext.Provider>\n ))}\n </ColumnHeaderContext.Provider>\n\n <div\n className={classes?.headerCell}\n css={[\n { gridRow: 1, gridColumn: visibleColumns.length + 3 },\n defaultClasses.headerFill,\n stickyHeader && defaultClasses.sticky,\n stickyHeader instanceof Object && stickyHeader,\n styles?.headerCell,\n ]}\n />\n </>\n }\n footer={\n <>\n {enableClearFiltersButton && hasActiveFilters && <ClearFiltersButton />}\n {hasFooter && (\n <>\n <div\n className={classes?.footerCell}\n css={[\n { gridColumn: 1 },\n defaultClasses.footerFill,\n stickyFooter && defaultClasses.stickyBottom,\n stickyFooter instanceof Object && stickyFooter,\n styles?.footerCell,\n ]}\n />\n <div\n className={classes?.footerCell}\n css={[\n defaultClasses.footerFill,\n stickyFooter && defaultClasses.stickyBottom,\n stickyFooter instanceof Object && stickyFooter,\n styles?.footerCell,\n ]}\n />\n\n {visibleColumns.map((column) => (\n <ColumnContext.Provider key={column.id} value={column.id}>\n <ColumnFooter />\n </ColumnContext.Provider>\n ))}\n\n <div\n className={classes?.footerCell}\n css={[\n defaultClasses.footerFill,\n stickyFooter && defaultClasses.stickyBottom,\n stickyFooter instanceof Object && stickyFooter,\n styles?.footerCell,\n ]}\n />\n </>\n )}\n </>\n }\n >\n {(itemIds, startIndex) =>\n itemIds.map((itemId, index) => (\n <Row\n key={itemId}\n itemId={itemId}\n rowIndex={startIndex + index}\n rowHeightsKey={rowHeightsKey}\n />\n ))\n }\n </Virtualized>\n );\n});\n","import { useFilter } from '../hooks/useFilter';\nimport { useTheme } from '../hooks/useTheme';\nimport { asStringOrArray } from '../misc/helpers';\nimport type { CommonFilterProps } from '../types';\nimport { AutoFocusTextField } from './autoFocusTextField';\n\nexport function substringCompare(itemValue: string, filterValue: string): boolean {\n return itemValue.toLowerCase().includes(filterValue.toLowerCase());\n}\n\nexport function prefixCompare(itemValue: string, filterValue: string): boolean {\n return itemValue.toLowerCase().includes(filterValue.toLowerCase());\n}\n\nexport function exactCompare(itemValue: string, filterValue: string): boolean {\n return itemValue.toLowerCase() === filterValue.toLowerCase();\n}\n\nexport function TextFilter<TItem, TColumnValue>({\n compare = substringCompare,\n filterBy = asStringOrArray,\n placeholder,\n ...props\n}: {\n /** Custom comparison function. Should return true if an item value matches the current filter value.\n * By default a fuzzy text comparison is used.\n */\n compare?: (itemValue: string, filterValue: string) => boolean;\n placeholder?: string;\n} & CommonFilterProps<TItem, TColumnValue, string, string>): JSX.Element {\n const IconButton = useTheme((t) => t.components.IconButton);\n const Search = useTheme((t) => t.icons.Search);\n const Clear = useTheme((t) => t.icons.Clear);\n\n const {\n value = '',\n onChange,\n close,\n } = useFilter({\n ...props,\n filterBy,\n\n id: 'textFilter',\n\n isActive(filterValue) {\n return !!filterValue;\n },\n\n test(filterValue, value) {\n return compare(value, filterValue);\n },\n });\n\n return (\n <div\n css={{\n padding: `calc(var(--spacing) * 2)`,\n display: 'grid',\n }}\n >\n <AutoFocusTextField\n value={value}\n onChange={(event) => onChange(event.target.value)}\n onKeyUp={(event) => {\n if (event.key === 'Enter') {\n close();\n }\n }}\n endIcon={\n <IconButton onClick={() => onChange('')}>{!value ? <Search /> : <Clear />}</IconButton>\n }\n placeholder={placeholder}\n />\n </div>\n );\n}\n","export const textMatch = (text: string, query: string): boolean => {\n text = text.toLowerCase();\n query = query.toLowerCase();\n return query.split(/\\s+/).every((part) => termMatch(text, part));\n};\n\nexport const termMatch = (text: string, query: string): boolean => {\n let i = 0;\n outer: for (const char of query) {\n for (; i < text.length; i++) {\n if (text[i] === char) {\n i++;\n continue outer;\n }\n }\n return false;\n }\n return true;\n};\n"],"mappings":"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"}