schummar-table 0.5.5 → 0.7.1

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.js","sources":["../../src/hooks/useTheme.ts","../../src/components/autoFocusTextField.tsx","../../src/theme/useCssVariables.ts","../../src/components/datePicker.tsx","../../src/components/dateFilter.tsx","../../src/misc/helpers.ts","../../src/components/formControlLabel.tsx","../../src/misc/queue.ts","../../src/internalState/tableStateStorage.ts","../../src/internalState/calcItems.ts","../../src/internalState/calcProps.ts","../../src/internalState/cleanupState.ts","../../src/internalState/filterColumns.ts","../../src/internalState/syncSelections.ts","../../src/internalState/useTableState.ts","../../src/components/columnHeader.tsx","../../src/components/columnSelection.tsx","../../src/misc/csvExport.ts","../../src/components/export.tsx","../../src/components/filterControl.tsx","../../src/components/resizeHandle.tsx","../../src/components/cell.tsx","../../src/components/expandControl.tsx","../../src/components/selectComponent.tsx","../../src/components/row.tsx","../../src/components/sortComponent.tsx","../../src/misc/throttle.ts","../../src/components/virtualized.tsx","../../src/components/table.tsx","../../src/components/selectFilter.tsx","../../src/misc/debounce.ts","../../src/hooks/useFilter.ts","../../src/misc/textMatch.ts","../../src/components/textFilter.tsx"],"sourcesContent":["import { useTableContext } from '..';\n\nexport function useTheme() {\n const table = useTableContext();\n return table.useState('theme');\n}\n","import { ComponentType, useContext, useLayoutEffect, useRef } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { PopoverContext } from '../theme/defaultTheme/popover';\nimport { TableTheme } from '../types';\n\ntype Props = TableTheme['components']['TextField'] extends ComponentType<infer T> ? T : never;\n\nexport function AutoFocusTextField(props: Omit<Props, 'inputRef'>) {\n const {\n components: { TextField },\n } = useTheme();\n\n const ref = useRef<HTMLInputElement>(null);\n const { visible } = useContext(PopoverContext);\n\n useLayoutEffect(() => {\n if (visible && ref.current) {\n ref.current.focus();\n }\n }, [visible]);\n\n return <TextField {...props} inputRef={ref} />;\n}\n","import { useTableContext } from '..';\n\nexport function useCssVariables() {\n const table = useTableContext();\n return table.useState((state) => ({\n '--spacing': state.theme.spacing,\n '--primaryMain': state.theme.colors.primary.main,\n '--primaryLight': state.theme.colors.primary.light,\n '--primaryContrastText': state.theme.colors.primary.contrastText,\n '--secondaryMain': state.theme.colors.secondary.main,\n '--secondaryLight': state.theme.colors.secondary.light,\n '--secondaryContrastText': state.theme.colors.secondary.contrastText,\n }));\n}\n","import { useDayzed } from 'dayzed';\nimport React, { useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { useTheme } from '..';\nimport { gray } from '../theme/defaultTheme/defaultClasses';\nimport { useCssVariables } from '../theme/useCssVariables';\n\nexport type DateRange = { min: Date; max: Date };\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) => 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. */\n firstDayOfWeek?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n};\n\nconst weekDays = [0, 1, 2, 3, 4, 5, 6] as const;\nconst months = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] 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) => new Date(d.getFullYear(), d.getMonth(), d.getDate() + 1, 0, 0, 0, -1);\n\n/** Returns whether two dates and/or date ranges intersect. Intersection is considered per day. */\nexport function dateIntersect(a: Date | null | DateRange, b: Date | null | DateRange) {\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 DatePicker({ value, onChange, rangeSelect, locale, firstDayOfWeek = 0 }: DatePickerProps) {\n const {\n components: { IconButton },\n icons: { ChevronRight },\n } = useTheme();\n\n const [baseDate] = useState(new Date());\n const [dateInView, setDateInView] = useState<Date>(baseDate);\n const [currentMin, setCurrentMin] = useState<Date>();\n const [hovered, setHovered] = useState<Date>();\n\n const min = currentMin ?? (value instanceof Date ? value : value?.min);\n const max = currentMin ? undefined : value instanceof Date ? value : value?.max;\n\n const { calendars, getBackProps, getForwardProps, getDateProps } = useDayzed({\n onDateSelected: () => undefined,\n firstDayOfWeek,\n showOutsideDays: true,\n date: dateInView,\n onOffsetChanged: (offset) => setDateInView(new Date(dateInView.getFullYear(), dateInView.getMonth() + offset)),\n offset: 0,\n });\n\n const formatWeekday = useMemo(() => {\n const { format } = new Intl.DateTimeFormat(locale, { weekday: 'short' });\n return (weekDay: number) => format(new Date(Date.UTC(2021, 5, weekDay)));\n }, [locale]);\n\n useEffect(() => setDateInView(value === null ? new Date() : value instanceof Date ? value : value.max), [value]);\n\n return (\n <div>\n {calendars.map(({ month, year, weeks }) => (\n <div key={`${month}${year}`}>\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 {...getBackProps({ calendars })}>\n <ChevronRight css={{ transform: 'rotate3d(0, 0, 1, 180deg)' }} />\n </IconButton>\n\n <div css={{ display: 'flex' }}>\n <MonthSelector value={month} onChange={(month) => setDateInView(new Date(year, month))} locale={locale} />\n\n <YearSelector value={year} onChange={(year) => setDateInView(new Date(year, month))} />\n </div>\n\n <IconButton {...getForwardProps({ calendars })}>\n <ChevronRight />\n </IconButton>\n </div>\n\n <div\n css={{\n display: 'grid',\n gridTemplateColumns: 'repeat(7, max-content)',\n fontWeight: 'bold',\n }}\n >\n {weekDays.map((_v, weekDay) => (\n <div key={weekDay} css={{ justifySelf: 'center', marginBottom: 'var(--spacing)' }}>\n {formatWeekday(weekDay)}\n </div>\n ))}\n\n {weeks.map((week, index) =>\n week.map((dateObj, dayIndex) => {\n if (!dateObj) {\n return <div />;\n }\n\n const { prevMonth, nextMonth, date, today } = dateObj;\n\n const selected = date.getTime() === min?.getTime() || (min && max && dateIntersect(date, { min, max }));\n const preSelected =\n !selected &&\n (date.getTime() === hovered?.getTime() ||\n (min && !max && hovered && dateIntersect(date, min <= hovered ? { min, max: hovered } : { min: hovered, max: min })));\n\n return (\n <button\n key={`${index}-${dayIndex}`}\n css={[\n {\n padding: 10,\n border: '1px solid transparent',\n background: 'transparent',\n cursor: 'pointer',\n },\n (prevMonth || nextMonth) && {\n color: gray,\n },\n today && {\n border: '1px solid var(--secondaryMain)',\n },\n selected && {\n background: 'var(--primaryMain)',\n color: 'var(--primaryContrastText)',\n },\n preSelected && {\n background: 'var(--primaryLight)',\n color: 'var(--primaryContrastText)',\n },\n ]}\n {...getDateProps({ dateObj })}\n onClick={() => {\n if (!rangeSelect) {\n setCurrentMin(undefined);\n onChange(date);\n } else if (min && !max) {\n setCurrentMin(undefined);\n if (date > min) {\n onChange({ min, max: date });\n } else {\n onChange({ min: date, max: min });\n }\n } else {\n setCurrentMin(date);\n }\n }}\n onPointerOver={() => setHovered(date)}\n onPointerOut={() => setHovered(undefined)}\n >\n {date.getDate()}\n </button>\n );\n }),\n )}\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nfunction MonthSelector({ value, onChange, locale }: { value: number; onChange: (month: number) => void; locale?: string }) {\n const {\n components: { Popover },\n } = useTheme();\n const cssVariables = useCssVariables();\n\n const [anchor, setAnchor] = useState<Element>();\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 return (\n <>\n <button\n css={{\n border: 'none',\n background: 'transparent',\n fontSize: 'inherit',\n cursor: 'pointer',\n }}\n onClick={(e) => setAnchor(e.currentTarget)}\n >\n {formatMonth(value)}\n </button>\n\n <Popover open={!!anchor} anchorEl={anchor ?? null} onClose={() => setAnchor(undefined)} align=\"center\" css={cssVariables}>\n <div\n css={{\n display: 'grid',\n }}\n >\n {months.map((month) => (\n <button\n key={month}\n css={[\n {\n padding: 'var(--spacing)',\n border: 'none',\n background: 'transparent',\n\n '&:hover': {\n background: 'var(--primaryLight)',\n },\n },\n month === value && { background: 'var(--primaryMain)' },\n ]}\n onClick={() => onChange(month)}\n >\n {formatMonth(month)}\n </button>\n ))}\n </div>\n </Popover>\n </>\n );\n}\n\nfunction YearSelector({ value, onChange, locale }: { value: number; onChange: (year: number) => void; locale?: string }) {\n const [input, setInput] = useState<string>();\n const ref = useRef<HTMLInputElement>(null);\n\n function apply() {\n onChange(Number(input));\n setInput(undefined);\n }\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 useLayoutEffect(() => ref.current?.focus(), [ref.current]);\n\n if (input === undefined) {\n return <div onClick={() => setInput(String(value))}>{formatYear(value)}</div>;\n }\n\n return (\n <input\n ref={ref}\n css={{ width: '4ch' }}\n value={input}\n onChange={(e) => {\n if (e.target.value.match(/^\\d{0,4}$/)) {\n setInput(e.target.value);\n }\n }}\n onBlur={apply}\n onKeyPress={(e) => e.key === 'Enter' && apply()}\n ></input>\n );\n}\n","import React, { useMemo } from 'react';\nimport { useFilter, useTheme } from '..';\nimport { CommonFilterProps } from '../types';\nimport { dateIntersect, DatePicker, DatePickerProps, DateRange, endOfDay, startOfDay } 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 (x instanceof Array) return x.map(convertDateOrRange).filter(Boolean) as (Date | DateRange)[];\n return convertDateOrRange(x);\n}\n\nexport function DateFilter<T, V>({\n locale,\n firstDayOfWeek,\n singleSelect,\n filterBy = convertDateOrArray,\n ...props\n}: {\n /** Which locale to use to render the calendar. */\n locale?: string;\n /** Which day of the week should be in the first column. */\n firstDayOfWeek?: DatePickerProps['firstDayOfWeek'];\n /** If enabled, only single days can be selected. Ranges otherwise. */\n singleSelect?: boolean;\n} & CommonFilterProps<T, V, Date | DateRange | null, Date | DateRange | null>): JSX.Element {\n const {\n components: { Button },\n text,\n } = useTheme();\n\n const { value = null, onChange } = 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 const formatDate = useMemo(() => {\n const { format } = new Intl.DateTimeFormat(locale, { dateStyle: 'medium' });\n return format;\n }, [locale]);\n\n return (\n <div\n css={{\n padding: 'calc(var(--spacing) * 2)',\n display: 'grid',\n }}\n >\n {!singleSelect && (\n <div\n css={{\n marginBottom: 'var(--spacing)',\n display: 'flex',\n justifyContent: 'center',\n }}\n >\n {value ? formatDate(value instanceof Date ? value : value.min) : ''} -{' '}\n {value ? formatDate(value instanceof Date ? value : value.max) : ''}\n </div>\n )}\n\n <DatePicker rangeSelect={!singleSelect} value={value} onChange={onChange} locale={locale} firstDayOfWeek={firstDayOfWeek} />\n\n <div css={{ marginTop: 'var(--spacing)', display: 'grid', gridAutoFlow: 'column', justifyContent: 'center' }}>\n <Button variant=\"text\" onClick={() => onChange(today())}>\n {text.today}\n </Button>\n\n <Button variant=\"text\" onClick={() => onChange(thisWeek(firstDayOfWeek))}>\n {text.thisWeek}\n </Button>\n\n <Button variant=\"text\" onClick={() => onChange(null)}>\n {text.reset}\n </Button>\n </div>\n </div>\n );\n}\n\nexport const today = (): DateRange => {\n const today = startOfDay(new Date());\n return { min: today, max: today };\n};\n\nexport const thisWeek = (firstDayOfWeek = 0): 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);\n\n const max = new Date(min);\n max.setDate(max.getDate() + 6);\n\n return { min: startOfDay(min), max: endOfDay(max) };\n};\n","import { Id, TableItem } from '../types';\n\nexport const flatMap = <T, S>(arr: Iterable<T>, flatMap: (t: T) => S[]): S[] => {\n return [...arr].reduce<S[]>((out, cur) => out.concat(flatMap(cur)), []);\n};\n\nexport const orderBy = <T>(arr: T[], selectors: ((t: T) => any)[] = [], direction: ('desc' | 'asc')[] = []): T[] => {\n if (selectors.length === 0) selectors = [(t) => t];\n\n return [...arr].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 dir = direction[i] === 'desc' ? -1 : 1;\n if (_a > _b) return dir;\n if (_a < _b) return -dir;\n }\n return 0;\n });\n};\n\nexport const uniq = <T>(arr: T[]): T[] => {\n const set = new Set<T>();\n for (const t of arr) 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>(activeItemsById: Map<Id, TableItem<T>>, ...items: TableItem<T>[]): Set<Id> => {\n const result = new Set<Id>();\n\n const find = ({ parentId }: TableItem<T>): void => {\n const parent = parentId ? 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 (x instanceof Array) 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 (x instanceof Array) return x.map(asString);\n return asString(x);\n};\n\nexport const defaultEquals = (a: unknown, b: unknown): boolean => a === b;\n\nexport const subStringMatch = (a: string, b: string): boolean => a.toLowerCase().includes(b.toLowerCase());\n\nexport const castArray = <T>(a: T | T[]) => (a instanceof Array ? a : [a]);\n\nexport const cx = (...classNames: (string | false | undefined | null | Record<string, boolean>)[]) =>\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","import { ReactNode } from 'react';\n\nexport function FormControlLabel({ control, label, disabled }: { control: ReactNode; label: ReactNode; disabled?: boolean }) {\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","export class Queue {\n private q = new Array<{ job: () => Promise<any>; resolve: (value: any) => void; reject: (reason?: any) => void }>();\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 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 (e) {\n next.reject(e);\n }\n }\n\n this.isRunning = false;\n }\n}\n","import { useEffect, useState } from 'react';\nimport { useTableContext } from '..';\nimport { Queue } from '../misc/queue';\nimport { SerializableValue } from '../types';\n\nconst KEYS = ['sort', 'selection', 'expanded', 'hiddenColumns', 'filterValues', 'columnWidths', 'columnOrder'] 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: SerializableValue) {\n function prepare(value: SerializableValue): 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 (value instanceof Array) {\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() {\n const table = useTableContext();\n const [isHydrated, setIsHydrated] = useState(false);\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 table.update((state) => {\n for (const key of KEYS) {\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 if (state.filters.get(id)?.persist ?? true) {\n state.filterValues.set(id, value);\n }\n }\n } else {\n state[key] = data[key];\n\n if (key === 'expanded' || key === 'hiddenColumns' || key === 'selection' || key === 'sort') {\n state.props[`on${(key.slice(0, 1).toUpperCase() + key.slice(1)) as Capitalize<typeof key>}Change`]?.(data[key]);\n }\n }\n }\n }\n });\n } catch (e) {\n console.error('Failed to load table state:', e);\n } finally {\n setIsHydrated(true);\n }\n })();\n\n return () => {\n isCanceled = true;\n };\n }, []);\n\n // After isHydrated, watch and save state\n useEffect(() => {\n if (!isHydrated) return;\n\n const q = new Queue();\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 ?? true) {\n data.filterValues.set(id, value);\n }\n }\n } else {\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 }, [isHydrated]);\n\n return isHydrated;\n}\n","import { castDraft } from 'immer';\nimport { useEffect } from 'react';\nimport { Store } from 'schummar-state/react';\nimport { castArray, flatMap, orderBy } from '../misc/helpers';\nimport { 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.sort,\n state.filters,\n state.filterValues,\n state.activeColumns,\n state.expanded,\n ] as const,\n ([items = [], id, parentId, revealFiltered, sort, filters, filterValues, activeColumns], draft) => {\n const tableItems = items.map<TableItem<T>>((item) => ({\n ...item,\n id: id(item),\n parentId: parentId?.(item),\n children: [],\n }));\n\n let sorted;\n if (sort.length === 0) {\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 const sortBy = column.sortBy instanceof Array ? column.sortBy : [column.sortBy];\n return sortBy.map((sortBy) => ({ selector: (item: T) => sortBy(column.value(item), item), direction: sort.direction }));\n }).filter(Boolean);\n\n sorted = orderBy(\n tableItems,\n selectors.map((x) => x.selector),\n selectors.map((x) => x.direction),\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 = item.parentId !== undefined ? lookup.get(item.parentId) : 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));\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) 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), item);\n return castArray(value).some((value) => filter.test(filterValue, value));\n });\n\n if (isActive && item.parentId !== undefined) {\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 && item.parentId !== undefined) {\n activeSet.add(item.parentId);\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","import { useMemo, useRef } from 'react';\nimport { asString } from '../misc/helpers';\nimport { Column, Id, InternalColumn, InternalTableProps, TableProps } from '../types';\n\nconst noopParentId = () => undefined;\n\nexport function calcProps<T>(props: TableProps<T>): InternalTableProps<T> {\n const columnCache = useRef(new Map<string | number, [any[], InternalColumn<T, any>]>());\n\n return useMemo(() => {\n let id;\n if (props.id instanceof Function) {\n id = props.id;\n } else {\n id = (item: T) => item[props.id as keyof T] as unknown as Id;\n }\n\n let parentId;\n if (props.parentId instanceof Function) {\n parentId = props.parentId;\n } else if (typeof props.parentId === 'string') {\n parentId = (item: T) => item[props.parentId as keyof T] as unknown as Id | undefined;\n } else {\n parentId = noopParentId;\n }\n\n let inputColumns;\n if (props.columns instanceof Function) {\n inputColumns = props.columns((value, column) => ({ ...column, value }));\n } else {\n inputColumns = props.columns.map((column) => ({ ...column, dependecies: undefined }));\n }\n\n const newColumnCache = new Map<string | number, [any[], InternalColumn<T, any>]>();\n\n const columns = inputColumns.map<InternalColumn<T, any>>(function <V>(\n {\n id,\n header = null,\n renderCell = asString,\n exportCell = asString,\n sortBy = (v) => (typeof v === 'number' || v instanceof Date ? v : String(v)),\n dependencies = [],\n ...props\n }: Column<T, V>,\n index: number,\n ) {\n const [depsInCache, columnInCache] = columnCache.current.get(id ?? index) ?? [];\n\n let column;\n if (\n depsInCache &&\n columnInCache &&\n depsInCache.length === dependencies.length &&\n depsInCache.every((x, i) => dependencies[i] === x)\n ) {\n column = columnInCache;\n } else {\n column = {\n id: id ?? index,\n header,\n renderCell,\n exportCell,\n sortBy,\n dependencies,\n ...props,\n };\n }\n\n newColumnCache.set(id ?? index, [dependencies, column]);\n return column;\n });\n\n columnCache.current = newColumnCache;\n\n let copy;\n if (props.enableExport === true || (props.enableExport instanceof Object && props.enableExport.copy === true)) {\n copy = { separator: '\\t' };\n } else if (props.enableExport && props.enableExport.copy instanceof Object) {\n copy = props.enableExport.copy;\n }\n\n let download;\n if (props.enableExport === true || (props.enableExport instanceof Object && props.enableExport.download === true)) {\n download = { sepPrefix: true };\n } else if (props.enableExport && props.enableExport.download instanceof Object) {\n download = props.enableExport.download;\n }\n\n const enableExport = { copy, download };\n\n return {\n ...props,\n id,\n parentId,\n columns,\n enableSelection: props.enableSelection ?? true,\n selectSyncChildren: props.selectSyncChildren ?? true,\n stickyHeader: props.stickyHeader ?? true,\n enableExport,\n enableColumnSelection: props.enableColumnSelection ?? true,\n enableColumnResize: props.enableColumnResize ?? true,\n enableColumnReorder: props.enableColumnReorder ?? true,\n };\n }, [props]);\n}\n","import { useEffect } from 'react';\nimport { Store } from 'schummar-state/react';\nimport { intersect } from '../misc/helpers';\nimport { InternalTableState } from '../types';\n\nexport function cleanupState<T>(state: Store<InternalTableState<T>>): void {\n useEffect(\n () =>\n state.addReaction(\n (state) => [state.props.columns, state.itemsById, state.activeItemsById, state.activeColumns] 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 { useEffect } from 'react';\nimport { Store } from 'schummar-state/react';\nimport { orderBy } from '../misc/helpers';\nimport { InternalTableState } from '../types';\n\nexport function filterColumns<T>(state: Store<InternalTableState<T>>): void {\n useEffect(\n () =>\n state.addReaction(\n (state) => [state.props.columns, state.hiddenColumns, state.columnOrder] as const,\n ([columns, hiddenColumns, columnOrder], draft) => {\n draft.activeColumns = orderBy(\n columns.filter((column) => !hiddenColumns.has(column.id)),\n [(column) => columnOrder.indexOf(column.id)],\n );\n },\n { runNow: true },\n ),\n [state],\n );\n}\n","import { useEffect } from 'react';\nimport { Store } from 'schummar-state/react';\nimport { 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 (item.parentId !== undefined && newSelection.has(item.parentId)) {\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, useMemo } from 'react';\nimport { Store } from 'schummar-state/react';\nimport { useTableTheme } from '../theme/tableTheme';\nimport { InternalTableState, TableProps } from '../types';\nimport { calcItems } from './calcItems';\nimport { calcProps } from './calcProps';\nimport { cleanupState } from './cleanupState';\nimport { filterColumns } from './filterColumns';\nimport { syncSelections } from './syncSelections';\n\nexport function useTableState<T>(_props: TableProps<T>): Store<InternalTableState<T>> {\n const props = calcProps(_props);\n const theme = useTableTheme(props);\n\n const state = useMemo(\n () =>\n new Store<InternalTableState<T>>({\n props,\n theme,\n\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 items: [],\n itemsById: new Map(),\n activeItems: [],\n activeItemsById: new Map(),\n lastSelectedId: undefined,\n }),\n [],\n );\n\n filterColumns(state);\n calcItems(state);\n syncSelections(state);\n cleanupState(state);\n\n useEffect(() => {\n state.update((state) => {\n state.props = castDraft(props);\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 state.theme = theme;\n });\n }, [state, props]);\n\n return state;\n}\n","import { castDraft } from 'immer';\nimport React, { HTMLProps, useEffect, useRef } from 'react';\nimport { StoreScope } from 'schummar-state/react';\nimport { Id, useColumnContext, useTableContext } from '..';\n\nexport const ColumnHeaderContext = new StoreScope({\n items: new Map<Id, HTMLDivElement>(),\n});\n\nexport function ColumnHeader(props: HTMLProps<HTMLDivElement>) {\n const ref = useRef<HTMLDivElement>(null);\n const columnId = useColumnContext();\n const table = useTableContext();\n const enabled = table.useState('props.enableColumnReorder');\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 }, [ref.current, 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.getState().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(e: React.PointerEvent) {\n const div = ref.current;\n if (!div) return;\n draggingStart.current = { mouseX: e.clientX, bounds: div.getBoundingClientRect() };\n }\n\n // When mouse moves while clicked: Calculate transforms\n function onPointerMove(e: React.PointerEvent) {\n table.update((state) => {\n const div = ref.current;\n if (!div || draggingStart.current === undefined || Math.abs(e.clientX - draggingStart.current.mouseX) < 5) return;\n\n e.stopPropagation();\n div.setPointerCapture(e.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: '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 = `${draggingStart.current.bounds.left + e.clientX - draggingStart.current.mouseX}px`;\n\n // Calculate target index\n const index = state.columnOrder.indexOf(columnId);\n const targetIndex = calcTargetIndex(div.offsetLeft + e.clientX - draggingStart.current.mouseX);\n\n // Apply transforms to each column\n const columns = table\n .getState()\n .columnOrder.map((id, index) => ({ id, index, width: store.getState().items.get(id)?.offsetWidth ?? 0 }));\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.slice(index + 1, targetIndex + 1).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(e: 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(div.offsetLeft + e.clientX - draggingStart.current.mouseX);\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 {...props}\n css={{\n position: 'relative',\n userSelect: 'none',\n }}\n ref={ref}\n onPointerDown={enabled ? onPointerDown : undefined}\n onPointerMove={enabled ? onPointerMove : undefined}\n onPointerUp={enabled ? onPointerUp : undefined}\n >\n {props.children}\n </div>\n );\n}\n","import React, { useState } from 'react';\nimport { useTheme } from '..';\nimport { useCssVariables } from '../theme/useCssVariables';\nimport { InternalColumn } from '../types';\nimport { FormControlLabel } from './formControlLabel';\nimport { useTableContext } from './table';\n\nexport function ColumnSelection<T>(): JSX.Element {\n const {\n components: { IconButton, Popover, Checkbox },\n icons: { Settings },\n text,\n } = useTheme();\n const cssVariables = useCssVariables();\n\n const table = useTableContext<T>();\n const columns = table.useState('props.columns');\n const hiddenColumns = table.useState('hiddenColumns');\n\n const [anchorEl, setAnchorEl] = useState<Element | null>(null);\n\n const toggle = (column: InternalColumn<T, unknown>) => {\n const {\n props: { hiddenColumns: controlledHiddenColumns, onHiddenColumnsChange },\n } = table.getState();\n\n const newValue = new Set(hiddenColumns);\n if (hiddenColumns.has(column.id)) newValue.delete(column.id);\n else newValue.add(column.id);\n\n if (!controlledHiddenColumns) {\n table.update((state) => {\n state.hiddenColumns = newValue;\n });\n }\n\n onHiddenColumnsChange?.(newValue);\n };\n\n return (\n <>\n <IconButton onClick={(e) => setAnchorEl(anchorEl ? null : e.currentTarget)}>\n <Settings />\n </IconButton>\n\n <Popover anchorEl={anchorEl} open={!!anchorEl} onClose={() => setAnchorEl(null)} css={cssVariables}>\n <div css={{ padding: `calc(var(--spacing) * 2)`, display: 'grid' }}>\n <div css={{ marginBottom: 'var(--spacing)' }}>{text.selectColumns}</div>\n\n {columns.map((column) => (\n <FormControlLabel\n key={column.id}\n control={<Checkbox checked={!hiddenColumns.has(column.id)} onChange={() => toggle(column)} disabled={column.cannotHide} />}\n label={column.header}\n ></FormControlLabel>\n ))}\n </div>\n </Popover>\n </>\n );\n}\n","export type CsvExportOptions = { sepPrefix?: boolean; separator?: string; quote?: string; eol?: string };\n\nexport function csvExport(\n data: (string | number)[][],\n { sepPrefix, separator = ',', quote = '\"', eol = '\\n' }: CsvExportOptions = {},\n): string {\n const cells = data.map((line) =>\n line.map((value) => {\n if (typeof value === 'number') return String(value);\n if (![separator, quote, eol].some((c) => value.includes(c))) return value;\n\n const clean = value.replace(new RegExp(quote, 'g'), `${quote}${quote}`);\n return `${quote}${clean}${quote}`;\n }),\n );\n\n return (sepPrefix ? `SEP=${separator}\\n` : '') + cells.map((line) => line.join(separator)).join(eol);\n}\n","import React, { useState } from 'react';\nimport { useTheme } from '..';\nimport { csvExport, CsvExportOptions } from '../misc/csvExport';\nimport { useCssVariables } from '../theme/useCssVariables';\nimport { useTableContext } from './table';\n\nexport function Export<T>(): JSX.Element {\n const table = useTableContext<T>();\n const {\n components: { Button, IconButton, Popover },\n icons: { Export, Clipboard },\n text,\n } = useTheme();\n const cssVariables = useCssVariables();\n\n const [anchor, setAnchor] = useState<Element | null>(null);\n\n const generate = (options?: CsvExportOptions) => {\n const { activeColumns, activeItems } = table.getState();\n\n const data = [\n activeColumns.map((column) => String(column.id)),\n ...activeItems.map((item) => activeColumns.map((column) => column.exportCell(column.value(item), item))),\n ];\n return csvExport(data, options);\n };\n\n const copy = () => {\n navigator.clipboard.writeText(generate(table.getState().props.enableExport.copy));\n };\n\n const download = () => {\n const a = document.createElement('a');\n a.href = 'data:text/csv;charset=utf-8,' + encodeURIComponent(generate(table.getState().props.enableExport.download));\n a.download = 'export.csv';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n };\n\n return (\n <>\n <IconButton onClick={(e) => setAnchor(anchor ? null : e.currentTarget)}>\n <Export css={!!anchor && { color: 'var(--primaryMain)' }} />\n </IconButton>\n\n <Popover open={!!anchor} onClose={() => setAnchor(null)} anchorEl={anchor} css={cssVariables}>\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)' }}>{text.exportTitle}</div>\n <Button startIcon={<Clipboard />} onClick={copy}>\n {text.exportCopy}\n </Button>\n <Button startIcon={<Export />} onClick={download}>\n {text.exportDownload}\n </Button>\n </div>\n </Popover>\n </>\n );\n}\n","import React, { createContext, useCallback, useState } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { useCssVariables } from '../theme/useCssVariables';\nimport { useColumnContext, useTableContext } from './table';\n\nexport const FilterControlContext = createContext((): void => void 0);\n\nexport function FilterControl<T>(): JSX.Element | null {\n const table = useTableContext<T>();\n const columnId = useColumnContext();\n const {\n components: { IconButton, Popover },\n icons: { FilterList, ArrowDropDown },\n } = useTheme();\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 filter = table.useState((state) => state.activeColumns.find((column) => column.id === columnId)?.filter);\n\n function reset() {\n table.update((state) => {\n state.filterValues.delete(columnId);\n });\n }\n\n const close = useCallback(function () {\n setAnchor(null);\n }, []);\n\n if (!filter) return null;\n\n return (\n <FilterControlContext.Provider value={close}>\n <div\n onClick={(e) => setAnchor(e.currentTarget)}\n onContextMenu={(e) => {\n reset();\n e.preventDefault();\n return false;\n }}\n >\n <IconButton\n css={[\n { color: '#b0bac9' },\n isActive && {\n color: 'var(--primaryMain) !important',\n },\n ]}\n >\n {isActive ? <FilterList /> : <ArrowDropDown />}\n </IconButton>\n </div>\n\n <div\n onPointerDown={(e) => {\n e.stopPropagation();\n }}\n onPointerMove={(e) => {\n e.stopPropagation();\n }}\n >\n <Popover open hidden={!anchor} onClose={() => setAnchor(null)} anchorEl={anchor ?? document.body} css={cssVariables}>\n {filter}\n </Popover>\n </div>\n </FilterControlContext.Provider>\n );\n}\n","import React, { HTMLProps } from 'react';\nimport { useColumnContext, useTableContext } from '..';\n\nexport function ResizeHandle() {\n const table = useTableContext();\n const columnId = useColumnContext();\n const enabled = table.useState('props.enableColumnResize');\n\n function onPointerDown(e: React.PointerEvent) {\n e.stopPropagation();\n\n const div = e.target as HTMLDivElement;\n div.setPointerCapture(e.pointerId);\n }\n\n function onPointerMove(e: React.PointerEvent) {\n e.stopPropagation();\n\n const div = e.target as HTMLDivElement;\n if (!div.hasPointerCapture(e.pointerId)) return;\n\n const parent = div.parentElement as HTMLDivElement;\n const width = Math.max(e.clientX - parent.getBoundingClientRect().left + 5, 50);\n\n table.update((state) => {\n state.columnWidths.set(columnId, `${width}px`);\n });\n }\n\n function onPointerUp(e: React.PointerEvent) {\n e.stopPropagation();\n\n const div = e.target as HTMLDivElement;\n div.releasePointerCapture(e.pointerId);\n }\n\n function onDoubleClick(e: React.MouseEvent) {\n table.update((state) => {\n if (e.getModifierState('Control')) {\n state.columnWidths.delete(columnId);\n } else {\n state.columnWidths.set(columnId, 'max-content');\n }\n });\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({ enabled, ...props }: HTMLProps<HTMLDivElement> & { enabled?: boolean }) {\n return (\n <div\n css={{\n alignSelf: 'stretch',\n padding: '0 5px',\n cursor: enabled ? '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 {...props}\n />\n );\n}\n","import React, { memo } from 'react';\nimport { Id, useColumnContext, useTableContext, useTheme } from '..';\nimport { cx } from '../misc/helpers';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\nimport { calcClassNames } from './row';\n\nexport const Cell = memo(function Cell<T>({ itemId, rowIndex }: { itemId: Id; rowIndex: number }) {\n const table = useTableContext<T>();\n const columnId = useColumnContext();\n const { classes } = useTheme();\n\n const column = table.useState((state) => state.activeColumns.find((column) => column.id === columnId));\n const item = table.useState((state) => state.activeItemsById.get(itemId));\n const columnStyleOverride = table.useState((state) => state.columnStyleOverride.get(columnId), { throttle: 16 });\n\n if (!column || !item) return null;\n table.getState().props.debugRender?.('render cell', itemId, columnId);\n\n const classNames = [...calcClassNames(classes, item, rowIndex), ...calcClassNames(column?.classes, item, rowIndex)];\n const content = column.renderCell(column.value(item), item);\n\n return (\n <div className={cx(...classNames)} css={[defaultClasses.cell, classNames, columnStyleOverride]}>\n {typeof content === 'string' ? (\n <span css={defaultClasses.text} title={content}>\n {content}\n </span>\n ) : (\n content\n )}\n </div>\n );\n});\n","import React from 'react';\nimport { useTheme } from '..';\nimport { getAncestors } from '../misc/helpers';\nimport { Id } from '../types';\nimport { useTableContext } from './table';\n\nexport function ExpandControl<T>({ itemId, hasDeferredChildren }: { itemId: Id; hasDeferredChildren?: boolean }): JSX.Element {\n const {\n components: { IconButton, Spinner },\n icons: { ChevronRight },\n } = useTheme();\n\n const table = useTableContext<T>();\n const isExpanded = table.useState((state) => state.expanded.has(itemId));\n const hasChildren = table.useState((state) => !!state.activeItemsById.get(itemId)?.children.length);\n\n function toggle() {\n const {\n props: { expanded: controlledExpanded, expandOnlyOne, onExpandedChange },\n expanded,\n activeItemsById,\n } = table.getState();\n\n const newExpanded = new Set(expanded);\n if (expandOnlyOne) newExpanded.clear();\n if (isExpanded) newExpanded.delete(itemId);\n else {\n newExpanded.add(itemId);\n\n const item = activeItemsById.get(itemId);\n for (const ancestor of item ? getAncestors(activeItemsById, item) : []) {\n newExpanded.add(ancestor);\n }\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 React from 'react';\nimport { useTheme } from '..';\nimport { getAncestors, getDescendants } from '../misc/helpers';\nimport { Id } from '../types';\nimport { useTableContext } from './table';\n\nexport function SelectComponent<T>({ itemId }: { itemId?: Id }): JSX.Element {\n const table = useTableContext<T>();\n const {\n components: { Checkbox },\n } = useTheme();\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(e: React.ChangeEvent) {\n const mouseEvent = e.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 React, { memo, useEffect, useRef } from 'react';\nimport { cx, getAncestors } from '../misc/helpers';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\nimport { Id, InternalColumn } from '../types';\nimport { Cell } from './cell';\nimport { ExpandControl } from './expandControl';\nimport { SelectComponent } from './selectComponent';\nimport { ColumnContext, useTableContext } from './table';\n\nexport function calcClassNames<T>(classes: InternalColumn<any, any>['classes'] | undefined, item: T, index: number) {\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 const Row = memo(function Row<T>({ itemId, rowIndex }: { itemId: Id; rowIndex: number }): JSX.Element | null {\n const table = useTableContext<T>();\n const divRef = useRef<HTMLDivElement>(null);\n\n const { className, indent, hasChildren, hasDeferredChildren, columnIds, enableSelection, rowAction } = table.useState((state) => {\n const item = state.activeItemsById.get(itemId);\n const index = !item ? -1 : state.activeItems.indexOf(item);\n\n return {\n className: cx(...calcClassNames(state.props.classes, item, index)),\n indent: item ? getAncestors(state.activeItemsById, item).size : 0,\n hasChildren: !!item?.children.length,\n hasDeferredChildren: item && state.props.hasDeferredChildren?.(item),\n columnIds: state.activeColumns.map((column) => column.id),\n enableSelection: state.props.enableSelection,\n rowAction: state.props.rowAction instanceof Function ? (item ? state.props.rowAction(item, index) : null) : state.props.rowAction,\n };\n });\n\n useEffect(() => {\n const div = divRef.current;\n if (!div) return;\n\n const o = new ResizeObserver(() => {\n if (!document.contains(div)) return;\n table.update((state) => {\n state.rowHeights.set(itemId, div.offsetHeight);\n });\n });\n o.observe(div);\n\n return () => o.disconnect();\n }, [divRef.current]);\n\n table.getState().props.debugRender?.('render row', itemId);\n\n return (\n <>\n <div className={className} css={[defaultClasses.cellFill]} ref={divRef} />\n\n <div className={className} css={[defaultClasses.cell, defaultClasses.firstCell]}>\n <div css={{ width: indent * 20 }} />\n\n {enableSelection && <SelectComponent itemId={itemId} />}\n\n {(hasChildren || hasDeferredChildren) && <ExpandControl itemId={itemId} hasDeferredChildren={hasDeferredChildren} />}\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={className} css={[defaultClasses.cellFill]} />\n </>\n );\n});\n","import React, { ReactNode } from 'react';\nimport { useTheme } from '..';\nimport { useColumnContext, useTableContext } from './table';\n\nexport function SortComponent<T>({ children }: { children: ReactNode }): JSX.Element {\n const table = useTableContext<T>();\n const columnId = useColumnContext();\n const {\n components: { Badge },\n icons: { ArrowUpward },\n } = useTheme();\n\n const { direction, index } = table.useState((state) => {\n const index = state.sort.findIndex((s) => s.columnId === columnId) ?? -1;\n return {\n direction: state.sort[index]?.direction,\n index: index >= 0 && state.sort.length > 1 ? index + 1 : undefined,\n };\n });\n\n function toggle(e: React.MouseEvent, off?: boolean) {\n const {\n props: { sort: controlledSort, onSortChange },\n } = table.getState();\n\n const newDirection = direction === 'asc' ? 'desc' : 'asc';\n const newSort = e.getModifierState('Control') || off ? table.getState().sort.filter((s) => s.columnId !== columnId) : [];\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 e.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={(e) => toggle(e)}\n onContextMenu={(e) => toggle(e, true)}\n >\n <div>{children}</div>\n\n <Badge badgeContent={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 </div>\n );\n}\n","export function throttle<Args extends any[]>(fn: (...args: Args) => void, ms: number): { (...args: Args): void; flush(): void } {\n let last = 0;\n let lastArgs: Args | undefined;\n let timeout: ReturnType<typeof setTimeout> | undefined;\n\n function run() {\n const args = lastArgs;\n\n last = Date.now();\n lastArgs = undefined;\n timeout = undefined;\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n fn(...args!);\n }\n\n return Object.assign(\n function (...args: Args) {\n const now = Date.now();\n lastArgs = args;\n\n if (timeout) {\n // do nothing\n } else if (now < last + ms) {\n timeout = setTimeout(run, last + ms - now);\n } else {\n run();\n }\n },\n {\n flush() {\n if (lastArgs) {\n run();\n }\n },\n },\n );\n}\n","import React, { HTMLProps, ReactNode, useEffect, useMemo, useRef, useState } from 'react';\nimport { throttle } from '../misc/throttle';\nimport { useTableContext } from './table';\nimport { 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') 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 children,\n ...props\n}: { header: ReactNode; children: (itemIds: Id[], startIndex: number) => ReactNode } & HTMLProps<HTMLDivElement>): JSX.Element {\n const table = useTableContext<T>();\n const virtual = table.useState('props.virtual');\n const probeRef = useRef<HTMLDivElement>(null);\n const [, setCounter] = useState(0);\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 = rowHeight ?? state.rowHeights.get(itemId) ?? initalRowHeight ?? (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 to = itemIds.length,\n before = 0,\n 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 incCounter = useMemo(() => throttle(() => setCounter((c) => c + 1), throttleScroll), [throttleScroll]);\n\n useEffect(() => {\n if (!virtual || !probeRef.current) return;\n\n window.addEventListener('scroll', incCounter, true);\n window.addEventListener('resize', incCounter, true);\n return () => {\n window.removeEventListener('scroll', incCounter, true);\n window.removeEventListener('resize', incCounter, true);\n };\n }, [probeRef.current, incCounter]);\n\n table.getState().props.debugRender?.(`Virtualalized render ${from} to ${to}`);\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 </div>\n );\n}\n","import React, { createContext, memo, useContext, useEffect, useState } from 'react';\nimport { Store } from 'schummar-state/react';\nimport { useTheme } from '..';\nimport { useTableStateStorage } from '../internalState/tableStateStorage';\nimport { useTableState } from '../internalState/useTableState';\nimport { cx } from '../misc/helpers';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\nimport { useCssVariables } from '../theme/useCssVariables';\nimport { Id, InternalTableState, TableProps } from '../types';\nimport { ColumnHeader, ColumnHeaderContext } from './columnHeader';\nimport { ColumnSelection } from './columnSelection';\nimport { Export } from './export';\nimport { FilterControl } from './filterControl';\nimport { ResizeHandle, ResizeHandleView } from './resizeHandle';\nimport { Row } from './row';\nimport { SelectComponent } from './selectComponent';\nimport { SortComponent } from './sortComponent';\nimport { Virtualized } from './virtualized';\n\nexport const TableContext = createContext<Store<InternalTableState<any>> | null>(null);\nexport const ColumnContext = createContext<Id | null>(null);\nexport function useTableContext<T>(): Store<InternalTableState<T>> {\n const value = useContext(TableContext);\n if (!value) throw Error('No table context available');\n return value as Store<InternalTableState<T>>;\n}\nexport function useColumnContext(): Id {\n const value = useContext(ColumnContext);\n if (value === null) throw Error('No column context available');\n return value;\n}\n\nexport function Table<T>(props: TableProps<T>): JSX.Element {\n const table = useTableState(props);\n\n table.getState().props.debugRender?.('render table');\n\n return (\n <TableContext.Provider value={table}>\n <TableLoadingState />\n </TableContext.Provider>\n );\n}\n\nfunction TableLoadingState() {\n const { text } = useTheme();\n const isHydrated = useTableStateStorage();\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>{text.loading}</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('props.fullWidth');\n const activeColumns = table.useState((state) =>\n state.activeColumns.map((column) => ({\n id: column.id,\n width: column.width,\n classes: column.classes,\n header: column.header,\n })),\n );\n const columnWidths = table.useState('columnWidths', { throttle: 16 });\n const columnStyleOverride = table.useState('columnStyleOverride', { throttle: 16 });\n const defaultWidth = table.useState('props.defaultWidth');\n const classes = table.useState('props.classes');\n const stickyHeader = table.useState('props.stickyHeader');\n const enableSelection = table.useState('props.enableSelection');\n const enableColumnSelection = table.useState('props.enableColumnSelection');\n const enableExport = table.useState((state) => !!state.props.enableExport.copy || !!state.props.enableExport.download);\n const cssVariables = useCssVariables();\n\n table.getState().props.debugRender?.('render table inner');\n\n return (\n <Virtualized\n className={classes?.table}\n css={[\n cssVariables,\n defaultClasses.table,\n {\n gridTemplateColumns: [\n //\n fullWidth === 'right' || fullWidth === true ? 'auto' : '0',\n 'max-content',\n ...activeColumns.map((column) => columnWidths.get(column.id) ?? column.width ?? defaultWidth ?? 'max-content'),\n fullWidth === 'left' || fullWidth === true ? 'auto' : '0',\n ].join(' '),\n },\n hidden && { visibility: 'hidden' },\n ]}\n header={\n <>\n <div\n className={classes?.headerCell}\n css={[defaultClasses.headerFill, stickyHeader && defaultClasses.sticky, stickyHeader instanceof Object && stickyHeader]}\n />\n\n <div\n className={classes?.headerCell}\n css={[defaultClasses.headerCell, stickyHeader && defaultClasses.sticky, stickyHeader instanceof Object && stickyHeader]}\n >\n {enableSelection && <SelectComponent />}\n\n {enableColumnSelection && <ColumnSelection />}\n\n {enableExport && <Export />}\n <ResizeHandleView />\n </div>\n\n <ColumnHeaderContext.Provider>\n {activeColumns.map((column) => (\n <ColumnContext.Provider key={column.id} value={column.id}>\n <ColumnHeader\n className={cx(classes?.headerCell, column.classes?.headerCell)}\n css={[\n defaultClasses.headerCell,\n columnStyleOverride.get(column.id),\n stickyHeader && defaultClasses.sticky,\n stickyHeader instanceof Object && stickyHeader,\n ]}\n key={column.id}\n >\n <SortComponent>{column.header}</SortComponent>\n <div css={{ flex: 1 }} />\n <FilterControl />\n <ResizeHandle />\n </ColumnHeader>\n </ColumnContext.Provider>\n ))}\n </ColumnHeaderContext.Provider>\n\n <div\n className={classes?.headerCell}\n css={[defaultClasses.headerFill, stickyHeader && defaultClasses.sticky, stickyHeader instanceof Object && stickyHeader]}\n />\n </>\n }\n >\n {(itemIds, startIndex) => itemIds.map((itemId, index) => <Row key={itemId} itemId={itemId} rowIndex={startIndex + index} />)}\n </Virtualized>\n );\n});\n","import React, { ReactNode, useState } from 'react';\nimport { useColumnContext, useFilter, useTheme } from '..';\nimport { asString, castArray, flatMap, uniq } from '../misc/helpers';\nimport { CommonFilterProps, InternalColumn, SerializableValue } from '../types';\nimport { AutoFocusTextField } from './autoFocusTextField';\nimport { FormControlLabel } from './formControlLabel';\nimport { useTableContext } from './table';\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<T, V, F extends SerializableValue>({\n options: providedOptions,\n stringValue = asString,\n render = stringValue,\n singleSelect,\n ...props\n}: {\n /** Which options are provided to select. By default all unique item values are used. */\n options?: F[];\n /** String representation of a value. Used to filter options via the text field. */\n stringValue?: (value: F) => string;\n /** Render values. By default a string representation of the value is used. */\n render?: (value: F) => ReactNode;\n /** If enabled, only one option can be selected at a time. */\n singleSelect?: boolean;\n} & CommonFilterProps<T, V, F, Set<F>>): JSX.Element {\n const {\n components: { IconButton, Checkbox },\n icons: { Search, Clear },\n text,\n } = useTheme();\n\n const table = useTableContext<T>();\n const columnId = useColumnContext();\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 InternalColumn<T, V> | undefined;\n if (!column) return [];\n\n const filterBy = props.filterBy ?? ((x) => x as unknown as F | F[]);\n\n return uniq(flatMap(state.items, (item) => castArray(filterBy(column.value(item), item))));\n });\n\n const [query, setQuery] = useState('');\n const filtered = options.filter((option) => !query || stringValue(option).toLowerCase().includes(query.toLowerCase()));\n\n const { value = new Set<F>(), onChange } = 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 return (\n <div\n css={{\n padding: 'calc(var(--spacing) * 2)',\n display: 'grid',\n gap: 'var(--spacing)',\n }}\n >\n <AutoFocusTextField\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n endIcon={<IconButton onClick={() => setQuery('')}>{!query ? <Search /> : <Clear />}</IconButton>}\n css={{ marginBottom: 'var(--spacing)' }}\n />\n\n <div css={{ maxHeight: '20em', overflowY: 'auto' }}>\n <FormControlLabel\n disabled={value.size === 0}\n control={<Checkbox disabled={value.size === 0} checked={value.size > 0} onChange={() => onChange(new Set())} />}\n label={<>&lt;{text.selected(value.size)}&gt;</>}\n ></FormControlLabel>\n\n {filtered.map((option, index) => (\n <FormControlLabel\n key={index}\n control={<Checkbox checked={value.has(option)} onChange={() => onChange(toggle(value, option, singleSelect))} />}\n label={render(option)}\n ></FormControlLabel>\n ))}\n </div>\n\n {filtered.length === 0 && <span css={{ textAlign: 'center' }}>{text.noResults}</span>}\n </div>\n );\n}\n","export function debounce<Args extends any[]>(fn: (...args: Args) => void, ms: number): { (...args: Args): void; flush(): 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 fn(...(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 );\n}\n","import { castDraft } from 'immer';\nimport { useContext, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { useColumnContext, useTableContext } from '..';\nimport { FilterControlContext } from '../components/filterControl';\nimport { debounce } from '../misc/debounce';\nimport { FilterImplementation, SerializableValue } from '../types';\n\nexport function useFilter<T, V, F, S extends SerializableValue>(impl: FilterImplementation<T, V, F, S>) {\n const table = useTableContext<T>();\n const columnId = useColumnContext();\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 }, []);\n\n useEffect(() => {\n table.update((state) => {\n state.filters.set(columnId, castDraft(impl));\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((state) => state.filterValues.get(columnId) as S | undefined);\n const [dirtyValue, setDirtyValue] = useState<S>();\n const implRef = useRef(impl);\n\n useLayoutEffect(() => {\n implRef.current = impl;\n });\n\n const delayedUpdate = useMemo(\n () =>\n debounce((value?: S) => {\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?: S) {\n setDirtyValue(value);\n delayedUpdate(value);\n }\n\n useEffect(() => delayedUpdate.flush(), [delayedUpdate]);\n\n return {\n value: dirtyValue ?? value,\n onChange,\n close: useContext(FilterControlContext),\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","import React from 'react';\nimport { useFilter } from '../hooks/useFilter';\nimport { useTheme } from '../hooks/useTheme';\nimport { asStringOrArray } from '../misc/helpers';\nimport { textMatch } from '../misc/textMatch';\nimport { CommonFilterProps } from '../types';\nimport { AutoFocusTextField } from './autoFocusTextField';\n\nexport function TextFilter<T, V>({\n compare = textMatch,\n filterBy = asStringOrArray,\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} & CommonFilterProps<T, V, string, string>): JSX.Element {\n const {\n components: { IconButton },\n icons: { Search, Clear },\n } = useTheme();\n\n const { value = '', onChange } = 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={(e) => onChange(e.target.value)}\n endIcon={<IconButton onClick={() => onChange('')}>{!value ? <Search /> : <Clear />}</IconButton>}\n />\n </div>\n );\n}\n"],"names":["props","components","TextField","useTheme","ref","useRef","visible","useContext","PopoverContext","current","focus","_jsx","weekDays","months","startOfDay","d","Date","getFullYear","getMonth","getDate","endOfDay","a","b","min","max","value","onChange","rangeSelect","locale","firstDayOfWeek","IconButton","icons","ChevronRight","baseDate","useState","dateInView","setDateInView","currentMin","setCurrentMin","hovered","setHovered","undefined","calendars","getBackProps","getForwardProps","getDateProps","useDayzed","onDateSelected","showOutsideDays","date","onOffsetChanged","offset","formatWeekday","useMemo","format","Intl","DateTimeFormat","weekday","weekDay","UTC","map","month","year","weeks","_jsxs","margin","display","gridAutoFlow","justifyContent","alignItems","transform","gridTemplateColumns","fontWeight","_v","justifySelf","marginBottom","week","index","dateObj","dayIndex","prevMonth","nextMonth","today","selected","getTime","dateIntersect","preSelected","padding","border","background","cursor","color","gray","Popover","cssVariables","useCssVariables","anchor","setAnchor","formatMonth","fontSize","e","currentTarget","input","setInput","Number","formatYear","String","width","target","match","apply","key","x","Object","range","convertDate","Array","convertDateOrRange","filter","Boolean","singleSelect","filterBy","convertDateOrArray","Button","text","useFilter","id","isActive","filterValue","test","formatDate","dateStyle","marginTop","thisWeek","reset","now","diff","getDay","setDate","control","label","disabled","userSelect","marginLeft","castDraft","useTableTheme","Store","ColumnHeaderContext","StoreScope","items","Map","columnId","useColumnContext","table","useTableContext","enabled","store","useStore","draggingStart","clone","div","update","state","set","delete","offsetLeft","cols","getState","columnOrder","get","otherCols","col","firstOffsetleft","find","sum","targetIndex","findIndex","offsetWidth","length","mouseX","clientX","bounds","getBoundingClientRect","Math","abs","stopPropagation","setPointerCapture","pointerId","cloneNode","body","append","entries","getComputedStyle","style","assign","pointerEvents","position","boxShadow","left","top","indexOf","calcTargetIndex","columns","forEach","i","slice","reduce","columnStyleOverride","transition","zIndex","splice","remove","clear","onPointerDown","onPointerMove","onPointerUp","children","Checkbox","Settings","hiddenColumns","anchorEl","setAnchorEl","toggle","column","controlledHiddenColumns","onHiddenColumnsChange","newValue","Set","has","add","selectColumns","cannotHide","header","Export","Clipboard","generate","options","activeColumns","activeItems","data","item","exportCell","csvExport","copy","clipboard","writeText","enableExport","download","document","createElement","href","encodeURIComponent","appendChild","click","removeChild","justifyItems","gap","exportTitle","exportCopy","exportDownload","FilterControlContext","createContext","FilterList","ArrowDropDown","filters","filterValues","close","useCallback","preventDefault","hasPointerCapture","parent","parentElement","columnWidths","releasePointerCapture","getModifierState","onDoubleClick","alignSelf","content","height","Cell","memo","itemId","rowIndex","classes","activeItemsById","throttle","debugRender","classNames","calcClassNames","renderCell","cx","defaultClasses","cell","hasDeferredChildren","Spinner","isExpanded","expanded","hasChildren","controlledExpanded","expandOnlyOne","onExpandedChange","newExpanded","ancestor","getAncestors","isSelected","itemIds","from","keys","size","every","selection","mouseEvent","nativeEvent","lastSelectedId","selectSyncChildren","controlledSelection","onSelectionChange","shiftKey","newSelection","descendant","getDescendants","Function","evenCell","oddCell","Row","divRef","className","indent","columnIds","enableSelection","rowAction","o","ResizeObserver","contains","rowHeights","offsetHeight","observe","disconnect","cellFill","firstCell","Badge","ArrowUpward","direction","sort","s","off","controlledSort","onSortChange","newDirection","newSort","push","overflow","textOverflow","opacity","findScrollRoot","documentElement","scrollHeight","clientHeight","overflowY","relativeOffset","y","offsetParent","offsetTop","HTMLElement","virtual","probeRef","setCounter","to","before","after","root","rowHeight","initalRowHeight","overscan","overscanTop","overscanBottom","totalHeight","h","probeOffset","headerHeight","topOfTable","scrollTop","bottomOfTable","reverse","throttleScroll","incCounter","c","addEventListener","removeEventListener","gridColumn","TableContext","ColumnContext","Error","useTableState","isHydrated","useTableStateStorage","showLoading","setShowLoading","handle","setTimeout","clearTimeout","loading","TableInner","hidden","fullWidth","defaultWidth","stickyHeader","enableColumnSelection","join","visibility","headerCell","headerFill","sticky","flex","startIndex","newSet","providedOptions","stringValue","asString","render","Search","Clear","uniq","flatMap","castArray","query","setQuery","filtered","option","toLowerCase","includes","maxHeight","textAlign","noResults","compare","textMatch","asStringOrArray"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/hooks/useTableMemo.tsx","../../src/misc/queue.ts","../../src/internalState/tableStateStorage.ts","../../src/misc/helpers.ts","../../src/internalState/calcItems.ts","../../src/internalState/calcProps.ts","../../src/internalState/cleanupState.ts","../../src/internalState/filterColumns.ts","../../src/internalState/syncSelections.ts","../../src/internalState/useTableState.ts","../../src/theme/useCssVariables.ts","../../src/components/columnHeader.tsx","../../src/components/formControlLabel.tsx","../../src/components/columnSelection.tsx","../../src/misc/csvExport.ts","../../src/components/export.tsx","../../src/components/filterControl.tsx","../../src/components/resizeHandle.tsx","../../src/components/cell.tsx","../../src/components/expandControl.tsx","../../src/components/selectComponent.tsx","../../src/components/row.tsx","../../src/components/sortComponent.tsx","../../src/misc/throttle.ts","../../src/components/virtualized.tsx","../../src/components/table.tsx","../../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/useTheme.ts","../../src/components/autoFocusTextField.tsx","../../src/components/dateInput.tsx","../../src/components/datePicker.tsx","../../src/components/dateFilter.tsx","../../src/components/selectFilter.tsx","../../src/misc/debounce.ts","../../src/hooks/useFilter.ts","../../src/misc/textMatch.ts","../../src/components/textFilter.tsx"],"sourcesContent":["import { createContext, DependencyList, ReactNode, useContext, useMemo } from 'react';\nimport { FunctionWithDeps } from '../types';\n\nconst TableMemoContext = createContext(new Map<string, [value: any, deps: DependencyList]>());\n\nexport function TableMemoContextProvider({ children }: { children: ReactNode }) {\n return <TableMemoContext.Provider value={useMemo(() => new Map(), [])}>{children}</TableMemoContext.Provider>;\n}\n\nexport function useTableMemo() {\n const memoCache = useContext(TableMemoContext);\n\n return <Fn extends (...args: any[]) => any>(key: string, fn: FunctionWithDeps<Fn>): Fn => {\n let deps: DependencyList;\n if (Array.isArray(fn)) {\n deps = fn.slice(1);\n fn = fn[0];\n } else {\n deps = [fn.toString()];\n }\n\n let cachedValue = memoCache.get(key);\n const hit = cachedValue && cachedValue[1].length === deps.length && cachedValue[1].every((x, i) => x === deps[i]);\n if (!cachedValue || !hit) {\n cachedValue = [fn, deps];\n memoCache.set(key, cachedValue);\n }\n return cachedValue[0];\n };\n}\n","export class Queue {\n private q = new Array<{ job: () => Promise<any>; resolve: (value: any) => void; reject: (reason?: any) => void }>();\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 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 (e) {\n next.reject(e);\n }\n }\n\n this.isRunning = false;\n }\n}\n","import { useEffect, useState } from 'react';\nimport { useTableContext } from '..';\nimport { Queue } from '../misc/queue';\nimport { SerializableValue } from '../types';\n\nconst KEYS = ['sort', 'selection', 'expanded', 'hiddenColumns', 'filterValues', 'columnWidths', 'columnOrder'] 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: SerializableValue) {\n function prepare(value: SerializableValue): 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 (value instanceof Array) {\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() {\n const table = useTableContext();\n const [isHydrated, setIsHydrated] = useState(false);\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 table.update((state) => {\n for (const key of KEYS) {\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 if (state.filters.get(id)?.persist ?? true) {\n state.filterValues.set(id, value);\n }\n }\n } else {\n state[key] = data[key];\n\n if (key === 'expanded' || key === 'hiddenColumns' || key === 'selection' || key === 'sort') {\n state.props[`on${(key.slice(0, 1).toUpperCase() + key.slice(1)) as Capitalize<typeof key>}Change`]?.(data[key]);\n }\n }\n }\n }\n });\n } catch (e) {\n console.error('Failed to load table state:', e);\n } finally {\n setIsHydrated(true);\n }\n })();\n\n return () => {\n isCanceled = true;\n };\n }, []);\n\n // After isHydrated, watch and save state\n useEffect(() => {\n if (!isHydrated) return;\n\n const q = new Queue();\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 ?? true) {\n data.filterValues.set(id, value);\n }\n }\n } else {\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 }, [isHydrated]);\n\n return isHydrated;\n}\n","import { Id, TableItem } from '../types';\n\nexport const flatMap = <T, S>(arr: Iterable<T>, flatMap: (t: T) => S[]): S[] => {\n return [...arr].reduce<S[]>((out, cur) => out.concat(flatMap(cur)), []);\n};\n\nexport const orderBy = <T>(arr: T[], selectors: ((t: T) => any)[] = [], direction: ('desc' | 'asc')[] = []): T[] => {\n if (selectors.length === 0) selectors = [(t) => t];\n\n return [...arr].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 dir = direction[i] === 'desc' ? -1 : 1;\n if (_a > _b) return dir;\n if (_a < _b) return -dir;\n }\n return 0;\n });\n};\n\nexport const uniq = <T>(arr: T[]): T[] => {\n const set = new Set<T>();\n for (const t of arr) 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>(activeItemsById: Map<Id, TableItem<T>>, ...items: TableItem<T>[]): Set<Id> => {\n const result = new Set<Id>();\n\n const find = ({ parentId }: TableItem<T>): void => {\n const parent = parentId ? 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 (x instanceof Array) 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 (x instanceof Array) return x.map(asString);\n return asString(x);\n};\n\nexport const defaultEquals = (a: unknown, b: unknown): boolean => a === b;\n\nexport const subStringMatch = (a: string, b: string): boolean => a.toLowerCase().includes(b.toLowerCase());\n\nexport const castArray = <T>(a: T | T[]) => (a instanceof Array ? a : [a]);\n\nexport const cx = (...classNames: (string | false | undefined | null | Record<string, boolean>)[]) =>\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","import { castDraft } from 'immer';\nimport { useEffect } from 'react';\nimport { Store } from 'schummar-state/react';\nimport { castArray, flatMap, orderBy } from '../misc/helpers';\nimport { 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.sort,\n state.filters,\n state.filterValues,\n state.activeColumns,\n state.expanded,\n ] as const,\n ([items = [], id, parentId, revealFiltered, sort, filters, filterValues, activeColumns], draft) => {\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) {\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 }));\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 );\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 = item.parentId !== undefined ? lookup.get(item.parentId) : 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));\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) 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) {\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 && item.parentId !== undefined) {\n activeSet.add(item.parentId);\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","import { useMemo } from 'react';\nimport { useTableMemo } from '../hooks/useTableMemo';\nimport { asString } from '../misc/helpers';\nimport { Column, Id, InternalColumn, InternalTableProps, TableProps } from '../types';\n\nconst noopParentId = () => undefined;\n\nexport function calcProps<T>(props: TableProps<T>): InternalTableProps<T> {\n const cache = useTableMemo();\n\n return useMemo(() => {\n let id;\n if (props.id instanceof Function || Array.isArray(props.id)) {\n id = cache('id', props.id);\n } else {\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', [(item: T) => item[props.parentId as keyof T] as unknown as Id | undefined, props.parentId]);\n } else {\n parentId = noopParentId;\n }\n\n let inputColumns;\n if (props.columns instanceof Function) {\n inputColumns = props.columns((value, column) => ({ ...column, value }));\n } else {\n inputColumns = props.columns.map((column) => ({ ...column, dependecies: undefined }));\n }\n\n const defCol = props.defaultColumnProps;\n const mapColumn = <V>(\n {\n id: _id,\n header = defCol?.header ?? null,\n value,\n renderCell = defCol?.renderCell ?? asString,\n exportCell = defCol?.exportCell ?? asString,\n sortBy = defCol?.sortBy ?? [(v) => (typeof v === 'number' || v instanceof Date ? v : String(v))],\n cannotHide = defCol?.cannotHide,\n classes = defCol?.classes,\n filter = defCol?.filter,\n width = defCol?.width,\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\n return {\n id,\n header,\n value: cache(`columns.${cacheKey}.value`, value),\n renderCell: cache(`columns.${cacheKey}.renderCell`, renderCell),\n exportCell,\n sortBy: sortBy.map((fn, i) => cache(`columns.${cacheKey}.sortBy.${i}`, fn)),\n cannotHide,\n classes,\n filter,\n width,\n };\n };\n\n const columns = inputColumns.map(mapColumn);\n\n const wrapCell = props.wrapCell && cache('wrapCell', props.wrapCell);\n\n const rowAction =\n props.rowAction instanceof Function || Array.isArray(props.rowAction) ? cache('rowAction', props.rowAction) : props.rowAction;\n\n let copy;\n if (props.enableExport === true || (props.enableExport instanceof Object && props.enableExport.copy === true)) {\n copy = { separator: '\\t' };\n } else if (props.enableExport && props.enableExport.copy instanceof Object) {\n copy = props.enableExport.copy;\n }\n\n let download;\n if (props.enableExport === true || (props.enableExport instanceof Object && props.enableExport.download === true)) {\n download = { sepPrefix: true };\n } else if (props.enableExport && props.enableExport.download instanceof Object) {\n download = props.enableExport.download;\n }\n\n const enableExport = { copy, download };\n\n return {\n ...props,\n id,\n parentId,\n columns,\n wrapCell,\n rowAction,\n enableSelection: props.enableSelection ?? true,\n selectSyncChildren: props.selectSyncChildren ?? true,\n stickyHeader: props.stickyHeader ?? true,\n enableExport,\n enableColumnSelection: props.enableColumnSelection ?? true,\n enableColumnResize: props.enableColumnResize ?? true,\n enableColumnReorder: props.enableColumnReorder ?? true,\n };\n }, [props]);\n}\n","import { useEffect } from 'react';\nimport { Store } from 'schummar-state/react';\nimport { intersect } from '../misc/helpers';\nimport { InternalTableState } from '../types';\n\nexport function cleanupState<T>(state: Store<InternalTableState<T>>): void {\n useEffect(\n () =>\n state.addReaction(\n (state) => [state.props.columns, state.itemsById, state.activeItemsById, state.activeColumns] 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 { useEffect } from 'react';\nimport { Store } from 'schummar-state/react';\nimport { orderBy } from '../misc/helpers';\nimport { InternalTableState } from '../types';\n\nexport function filterColumns<T>(state: Store<InternalTableState<T>>): void {\n useEffect(\n () =>\n state.addReaction(\n (state) => [state.props.columns, state.hiddenColumns, state.columnOrder] as const,\n ([columns, hiddenColumns, columnOrder], draft) => {\n draft.activeColumns = orderBy(\n columns.filter((column) => !hiddenColumns.has(column.id)),\n [(column) => columnOrder.indexOf(column.id)],\n );\n },\n { runNow: true },\n ),\n [state],\n );\n}\n","import { useEffect } from 'react';\nimport { Store } from 'schummar-state/react';\nimport { 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 (item.parentId !== undefined && newSelection.has(item.parentId)) {\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, useMemo } from 'react';\nimport { Store } from 'schummar-state/react';\nimport { InternalTableState, TableProps } from '../types';\nimport { calcItems } from './calcItems';\nimport { calcProps } from './calcProps';\nimport { cleanupState } from './cleanupState';\nimport { filterColumns } from './filterColumns';\nimport { syncSelections } from './syncSelections';\n\nexport function useTableState<T>(_props: TableProps<T>): Store<InternalTableState<T>> {\n const props = calcProps(_props);\n\n const state = useMemo(\n () =>\n new Store<InternalTableState<T>>({\n props,\n\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 items: [],\n itemsById: new Map(),\n activeItems: [],\n activeItemsById: new Map(),\n lastSelectedId: undefined,\n }),\n [],\n );\n\n filterColumns(state);\n calcItems(state);\n syncSelections(state);\n cleanupState(state);\n\n useEffect(() => {\n state.update((state) => {\n state.props = castDraft(props);\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;\n}\n","import { useTheme } from '../hooks/useTheme';\n\nexport function useCssVariables() {\n return useTheme(({ spacing, colors }) => ({\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 }));\n}\n","import { castDraft } from 'immer';\nimport React, { HTMLProps, useEffect, useRef } from 'react';\nimport { StoreScope } from 'schummar-state/react';\nimport { Id, useColumnContext, useTableContext } from '..';\n\nexport const ColumnHeaderContext = new StoreScope({\n items: new Map<Id, HTMLDivElement>(),\n});\n\nexport function ColumnHeader(props: HTMLProps<HTMLDivElement>) {\n const ref = useRef<HTMLDivElement>(null);\n const columnId = useColumnContext();\n const table = useTableContext();\n const enabled = table.useState('props.enableColumnReorder');\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 }, [ref.current, 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.getState().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(e: React.PointerEvent) {\n const div = ref.current;\n if (!div) return;\n draggingStart.current = { mouseX: e.clientX, bounds: div.getBoundingClientRect() };\n }\n\n // When mouse moves while clicked: Calculate transforms\n function onPointerMove(e: React.PointerEvent) {\n table.update((state) => {\n const div = ref.current;\n if (!div || draggingStart.current === undefined || Math.abs(e.clientX - draggingStart.current.mouseX) < 5) return;\n\n e.stopPropagation();\n div.setPointerCapture(e.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: '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 = `${draggingStart.current.bounds.left + e.clientX - draggingStart.current.mouseX}px`;\n\n // Calculate target index\n const index = state.columnOrder.indexOf(columnId);\n const targetIndex = calcTargetIndex(div.offsetLeft + e.clientX - draggingStart.current.mouseX);\n\n // Apply transforms to each column\n const columns = table\n .getState()\n .columnOrder.map((id, index) => ({ id, index, width: store.getState().items.get(id)?.offsetWidth ?? 0 }));\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.slice(index + 1, targetIndex + 1).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(e: 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(div.offsetLeft + e.clientX - draggingStart.current.mouseX);\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 {...props}\n css={{\n position: 'relative',\n userSelect: 'none',\n }}\n ref={ref}\n onPointerDown={enabled ? onPointerDown : undefined}\n onPointerMove={enabled ? onPointerMove : undefined}\n onPointerUp={enabled ? onPointerUp : undefined}\n >\n {props.children}\n </div>\n );\n}\n","import { ReactNode } from 'react';\n\nexport function FormControlLabel({ control, label, disabled }: { control: ReactNode; label: ReactNode; disabled?: boolean }) {\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 React, { useState } from 'react';\nimport { useTheme } from '..';\nimport { useCssVariables } from '../theme/useCssVariables';\nimport { InternalColumn } from '../types';\nimport { FormControlLabel } from './formControlLabel';\nimport { useTableContext } from './table';\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 Settings = useTheme((t) => t.icons.Settings);\n const selectColumns = useTheme((t) => t.text.selectColumns);\n const cssVariables = useCssVariables();\n\n const table = useTableContext<T>();\n const columns = table.useState('props.columns');\n const hiddenColumns = table.useState('hiddenColumns');\n\n const [anchorEl, setAnchorEl] = useState<Element | null>(null);\n\n const toggle = (column: InternalColumn<T, unknown>) => {\n const {\n props: { hiddenColumns: controlledHiddenColumns, onHiddenColumnsChange },\n } = table.getState();\n\n const newValue = new Set(hiddenColumns);\n if (hiddenColumns.has(column.id)) newValue.delete(column.id);\n else newValue.add(column.id);\n\n if (!controlledHiddenColumns) {\n table.update((state) => {\n state.hiddenColumns = newValue;\n });\n }\n\n onHiddenColumnsChange?.(newValue);\n };\n\n return (\n <>\n <IconButton onClick={(e) => setAnchorEl(anchorEl ? null : e.currentTarget)}>\n <Settings />\n </IconButton>\n\n <Popover anchorEl={anchorEl} open={!!anchorEl} onClose={() => setAnchorEl(null)} css={cssVariables}>\n <div css={{ padding: `calc(var(--spacing) * 2)`, display: 'grid' }}>\n <div css={{ marginBottom: 'var(--spacing)' }}>{selectColumns}</div>\n\n {columns.map((column) => (\n <FormControlLabel\n key={column.id}\n control={<Checkbox checked={!hiddenColumns.has(column.id)} onChange={() => toggle(column)} disabled={column.cannotHide} />}\n label={column.header}\n ></FormControlLabel>\n ))}\n </div>\n </Popover>\n </>\n );\n}\n","export type CsvExportOptions = { sepPrefix?: boolean; separator?: string; quote?: string; eol?: string };\n\nexport function csvExport(\n data: (string | number)[][],\n { sepPrefix, separator = ',', quote = '\"', eol = '\\n' }: CsvExportOptions = {},\n): string {\n const cells = data.map((line) =>\n line.map((value) => {\n if (typeof value === 'number') return String(value);\n if (![separator, quote, eol].some((c) => value.includes(c))) return value;\n\n const clean = value.replace(new RegExp(quote, 'g'), `${quote}${quote}`);\n return `${quote}${clean}${quote}`;\n }),\n );\n\n return (sepPrefix ? `SEP=${separator}\\n` : '') + cells.map((line) => line.join(separator)).join(eol);\n}\n","import React, { useState } from 'react';\nimport { useTheme } from '..';\nimport { csvExport, CsvExportOptions } from '../misc/csvExport';\nimport { useCssVariables } from '../theme/useCssVariables';\nimport { useTableContext } from './table';\n\nexport function Export<T>(): JSX.Element {\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 Export = 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 cssVariables = useCssVariables();\n\n const [anchor, setAnchor] = useState<Element | null>(null);\n\n const generate = (options?: CsvExportOptions) => {\n const { activeColumns, activeItems } = table.getState();\n\n const data = [\n activeColumns.map((column) => String(column.id)),\n ...activeItems.map((item) => activeColumns.map((column) => column.exportCell(column.value(item.value), item.value))),\n ];\n return csvExport(data, options);\n };\n\n const copy = () => {\n navigator.clipboard.writeText(generate(table.getState().props.enableExport.copy));\n };\n\n const download = () => {\n const a = document.createElement('a');\n a.href = 'data:text/csv;charset=utf-8,' + encodeURIComponent(generate(table.getState().props.enableExport.download));\n a.download = 'export.csv';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n };\n\n return (\n <>\n <IconButton onClick={(e) => setAnchor(anchor ? null : e.currentTarget)}>\n <Export css={!!anchor && { color: 'var(--primaryMain)' }} />\n </IconButton>\n\n <Popover open={!!anchor} onClose={() => setAnchor(null)} anchorEl={anchor} css={cssVariables}>\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 <Button startIcon={<Clipboard />} onClick={copy}>\n {exportCopy}\n </Button>\n <Button startIcon={<Export />} onClick={download}>\n {exportDownload}\n </Button>\n </div>\n </Popover>\n </>\n );\n}\n","import React, { createContext, useCallback, useState } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { useCssVariables } from '../theme/useCssVariables';\nimport { useColumnContext, useTableContext } from './table';\n\nexport const FilterControlContext = createContext((): void => void 0);\n\nexport function FilterControl<T>(): JSX.Element | null {\n const table = useTableContext<T>();\n const columnId = useColumnContext();\n const IconButton = useTheme((t) => t.components.IconButton);\n const Popover = useTheme((t) => t.components.Popover);\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 filter = table.useState((state) => state.activeColumns.find((column) => column.id === columnId)?.filter);\n\n function reset() {\n table.update((state) => {\n state.filterValues.delete(columnId);\n });\n }\n\n const close = useCallback(function () {\n setAnchor(null);\n }, []);\n\n if (!filter) return null;\n\n return (\n <FilterControlContext.Provider value={close}>\n <div\n onClick={(e) => setAnchor(e.currentTarget)}\n onContextMenu={(e) => {\n reset();\n e.preventDefault();\n return false;\n }}\n >\n <IconButton\n css={[\n { color: '#b0bac9' },\n isActive && {\n color: 'var(--primaryMain) !important',\n },\n ]}\n >\n {isActive ? <FilterList /> : <ArrowDropDown />}\n </IconButton>\n </div>\n\n <div\n onPointerDown={(e) => {\n e.stopPropagation();\n }}\n onPointerMove={(e) => {\n e.stopPropagation();\n }}\n >\n <Popover open hidden={!anchor} onClose={() => setAnchor(null)} anchorEl={anchor ?? document.body} css={cssVariables}>\n {filter}\n </Popover>\n </div>\n </FilterControlContext.Provider>\n );\n}\n","import React, { HTMLProps } from 'react';\nimport { useColumnContext, useTableContext } from '..';\n\nexport function ResizeHandle() {\n const table = useTableContext();\n const columnId = useColumnContext();\n const enabled = table.useState('props.enableColumnResize');\n\n function onPointerDown(e: React.PointerEvent) {\n e.stopPropagation();\n\n const div = e.target as HTMLDivElement;\n div.setPointerCapture(e.pointerId);\n }\n\n function onPointerMove(e: React.PointerEvent) {\n e.stopPropagation();\n\n const div = e.target as HTMLDivElement;\n if (!div.hasPointerCapture(e.pointerId)) return;\n\n const parent = div.parentElement as HTMLDivElement;\n const width = Math.max(e.clientX - parent.getBoundingClientRect().left + 5, 50);\n\n table.update((state) => {\n state.columnWidths.set(columnId, `${width}px`);\n });\n }\n\n function onPointerUp(e: React.PointerEvent) {\n e.stopPropagation();\n\n const div = e.target as HTMLDivElement;\n div.releasePointerCapture(e.pointerId);\n }\n\n function onDoubleClick(e: React.MouseEvent) {\n table.update((state) => {\n if (e.getModifierState('Control')) {\n state.columnWidths.delete(columnId);\n } else {\n state.columnWidths.set(columnId, 'max-content');\n }\n });\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({ enabled, ...props }: HTMLProps<HTMLDivElement> & { enabled?: boolean }) {\n return (\n <div\n css={{\n alignSelf: 'stretch',\n padding: '0 5px',\n cursor: enabled ? '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 {...props}\n />\n );\n}\n","import React, { memo, ReactNode, useLayoutEffect } from 'react';\nimport { Id, useColumnContext, useTableContext, useTheme } from '..';\nimport { cx } from '../misc/helpers';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\nimport { calcClassNames } from './row';\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), { throttle: 16 });\n\n useLayoutEffect(() => table.getState().props.debugRender?.('render cell', itemId, columnId));\n const className = useTheme((t) => cx(...calcClassNames(t.classes, item, 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, columnStyleOverride]}>\n {wrapCell(content, column.value(item.value), item.value, rowIndex)}\n </div>\n );\n});\n","import React from 'react';\nimport { useTheme } from '..';\nimport { getAncestors } from '../misc/helpers';\nimport { Id } from '../types';\nimport { useTableContext } from './table';\n\nexport function ExpandControl<T>({ itemId, hasDeferredChildren }: { itemId: Id; hasDeferredChildren?: boolean }): 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((state) => !!state.activeItemsById.get(itemId)?.children.length);\n\n function toggle() {\n const {\n props: { expanded: controlledExpanded, expandOnlyOne, onExpandedChange },\n expanded,\n activeItemsById,\n } = table.getState();\n\n const newExpanded = new Set(expanded);\n if (expandOnlyOne) newExpanded.clear();\n if (isExpanded) newExpanded.delete(itemId);\n else {\n newExpanded.add(itemId);\n\n const item = activeItemsById.get(itemId);\n for (const ancestor of item ? getAncestors(activeItemsById, item) : []) {\n newExpanded.add(ancestor);\n }\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 React from 'react';\nimport { useTheme } from '..';\nimport { getAncestors, getDescendants } from '../misc/helpers';\nimport { Id } from '../types';\nimport { useTableContext } from './table';\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(e: React.ChangeEvent) {\n const mouseEvent = e.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 React, { memo, useEffect, useLayoutEffect, useRef } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { cx, getAncestors } from '../misc/helpers';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\nimport { Id, MemoizedTableTheme } from '../types';\nimport { Cell } from './cell';\nimport { ExpandControl } from './expandControl';\nimport { SelectComponent } from './selectComponent';\nimport { ColumnContext, useTableContext } from './table';\n\nexport function calcClassNames<T>(classes: MemoizedTableTheme<any>['classes'] | undefined, item: T, index: number) {\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 const Row = memo(function Row<T>({ itemId, rowIndex }: { itemId: Id; rowIndex: number }): JSX.Element | null {\n const table = useTableContext<T>();\n const divRef = useRef<HTMLDivElement>(null);\n\n const classes = useTheme((t) => t.classes);\n\n const { className, indent, hasChildren, hasDeferredChildren, columnIds, enableSelection, rowAction } = table.useState((state) => {\n const item = state.activeItemsById.get(itemId);\n\n return {\n className: cx(...calcClassNames(classes, item, 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.activeColumns.map((column) => column.id),\n enableSelection: state.props.enableSelection,\n rowAction:\n state.props.rowAction instanceof Function ? (item ? state.props.rowAction(item.value, rowIndex) : null) : state.props.rowAction,\n };\n });\n\n useEffect(() => {\n const div = divRef.current;\n if (!div) return;\n\n const o = new ResizeObserver(() => {\n if (!document.contains(div)) return;\n table.update((state) => {\n state.rowHeights.set(itemId, div.offsetHeight);\n });\n });\n o.observe(div);\n\n return () => o.disconnect();\n }, [divRef.current]);\n\n useLayoutEffect(() => table.getState().props.debugRender?.('render row', itemId));\n\n return (\n <>\n <div className={className} css={[defaultClasses.cellFill]} ref={divRef} />\n\n <div className={className} css={[defaultClasses.cell, defaultClasses.firstCell]}>\n <div css={{ width: indent * 20 }} />\n\n {enableSelection && <SelectComponent itemId={itemId} />}\n\n {(hasChildren || hasDeferredChildren) && <ExpandControl itemId={itemId} hasDeferredChildren={hasDeferredChildren} />}\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={className} css={[defaultClasses.cellFill]} />\n </>\n );\n});\n","import React, { ReactNode } from 'react';\nimport { useTheme } from '..';\nimport { useColumnContext, useTableContext } from './table';\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 } = table.useState((state) => {\n const index = state.sort.findIndex((s) => s.columnId === columnId) ?? -1;\n return {\n direction: state.sort[index]?.direction,\n index: index >= 0 && state.sort.length > 1 ? index + 1 : undefined,\n };\n });\n\n function toggle(e: React.MouseEvent, off?: boolean) {\n const {\n props: { sort: controlledSort, onSortChange },\n } = table.getState();\n\n const newDirection = direction === 'asc' ? 'desc' : 'asc';\n const newSort = e.getModifierState('Control') || off ? table.getState().sort.filter((s) => s.columnId !== columnId) : [];\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 e.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={(e) => toggle(e)}\n onContextMenu={(e) => toggle(e, true)}\n >\n <div>{children}</div>\n\n <Badge badgeContent={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 </div>\n );\n}\n","export function throttle<Args extends any[]>(\n fn: (...args: Args) => void,\n ms: number,\n): { (...args: Args): void; flush(): void; cancel(): void } {\n let last = 0;\n let lastArgs: Args | undefined;\n let timeout: ReturnType<typeof setTimeout> | undefined;\n\n function run() {\n const args = lastArgs;\n\n last = Date.now();\n lastArgs = undefined;\n timeout = undefined;\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n fn(...args!);\n }\n\n return Object.assign(\n function (...args: Args) {\n const now = Date.now();\n lastArgs = args;\n\n if (timeout) {\n // do nothing\n } else if (now < last + ms) {\n timeout = setTimeout(run, last + ms - now);\n } else {\n run();\n }\n },\n {\n flush() {\n if (lastArgs) {\n run();\n }\n },\n\n cancel() {\n if (timeout) {\n clearTimeout(timeout);\n }\n },\n },\n );\n}\n","import React, { HTMLProps, ReactNode, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { throttle } from '../misc/throttle';\nimport { Id } from '../types';\nimport { useTableContext } from './table';\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') 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 children,\n ...props\n}: { header: ReactNode; children: (itemIds: Id[], startIndex: number) => ReactNode } & HTMLProps<HTMLDivElement>): JSX.Element {\n const table = useTableContext<T>();\n const virtual = table.useState('props.virtual');\n const probeRef = useRef<HTMLDivElement>(null);\n const [, setCounter] = useState(0);\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 = rowHeight ?? state.rowHeights.get(itemId) ?? initalRowHeight ?? (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 to = itemIds.length,\n before = 0,\n 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 incCounter = useMemo(() => throttle(() => setCounter((c) => c + 1), throttleScroll), [throttleScroll]);\n\n useEffect(() => {\n if (!virtual || !probeRef.current) return;\n\n window.addEventListener('scroll', incCounter, true);\n window.addEventListener('resize', incCounter, true);\n return () => {\n window.removeEventListener('scroll', incCounter, true);\n window.removeEventListener('resize', incCounter, true);\n };\n }, [probeRef.current, incCounter]);\n\n useEffect(() => incCounter.cancel, [incCounter]);\n\n useLayoutEffect(() => table.getState().props.debugRender?.(`Virtualalized render ${from} to ${to}`));\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 </div>\n );\n}\n","import React, { createContext, memo, useContext, useEffect, useLayoutEffect, useState } from 'react';\nimport { Store } from 'schummar-state/react';\nimport { useTheme } from '..';\nimport { TableMemoContextProvider } from '../hooks/useTableMemo';\nimport { useTableStateStorage } from '../internalState/tableStateStorage';\nimport { useTableState } from '../internalState/useTableState';\nimport { cx } from '../misc/helpers';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\nimport { useCssVariables } from '../theme/useCssVariables';\nimport { Id, InternalTableState, TableProps } from '../types';\nimport { ColumnHeader, ColumnHeaderContext } from './columnHeader';\nimport { ColumnSelection } from './columnSelection';\nimport { Export } from './export';\nimport { FilterControl } from './filterControl';\nimport { ResizeHandle, ResizeHandleView } from './resizeHandle';\nimport { Row } from './row';\nimport { SelectComponent } from './selectComponent';\nimport { SortComponent } from './sortComponent';\nimport { Virtualized } from './virtualized';\n\nexport const TableContext = createContext<Store<InternalTableState<any>> | null>(null);\nexport const ColumnContext = createContext<Id | null>(null);\nexport function useTableContext<T>(): Store<InternalTableState<T>> {\n const value = useContext(TableContext);\n if (!value) throw Error('No table context available');\n return value as Store<InternalTableState<T>>;\n}\nexport function useColumnContext(): Id {\n const value = useContext(ColumnContext);\n if (value === null) throw Error('No column context available');\n return value;\n}\n\nexport function Table<T>(props: TableProps<T>): JSX.Element {\n const table = useTableState(props);\n\n useLayoutEffect(() => table.getState().props.debugRender?.('render table'));\n\n return (\n <TableContext.Provider value={table}>\n <TableMemoContextProvider>\n <TableLoadingState />\n </TableMemoContextProvider>\n </TableContext.Provider>\n );\n}\n\nfunction TableLoadingState() {\n const loadingText = useTheme((t) => t.text.loading);\n const isHydrated = useTableStateStorage();\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('props.fullWidth');\n const activeColumns = table.useState((state) =>\n state.activeColumns.map((column) => ({\n id: column.id,\n width: column.width,\n classes: column.classes,\n header: column.header,\n })),\n );\n const columnWidths = table.useState('columnWidths', { throttle: 16 });\n const columnStyleOverride = table.useState('columnStyleOverride', { throttle: 16 });\n\n const classes = table.useState('props.classes');\n const stickyHeader = table.useState('props.stickyHeader');\n const enableSelection = table.useState('props.enableSelection');\n const enableColumnSelection = table.useState('props.enableColumnSelection');\n const enableExport = table.useState((state) => !!state.props.enableExport.copy || !!state.props.enableExport.download);\n const cssVariables = useCssVariables();\n\n useLayoutEffect(() => table.getState().props.debugRender?.('render table inner'));\n\n return (\n <Virtualized\n className={classes?.table}\n css={[\n cssVariables,\n defaultClasses.table,\n {\n gridTemplateColumns: [\n //\n fullWidth === 'right' || fullWidth === true ? 'auto' : '0',\n 'max-content',\n ...activeColumns.map((column) => columnWidths.get(column.id) ?? column.width ?? 'max-content'),\n fullWidth === 'left' || fullWidth === true ? 'auto' : '0',\n ].join(' '),\n },\n hidden && { visibility: 'hidden' },\n ]}\n header={\n <>\n <div\n className={classes?.headerCell}\n css={[defaultClasses.headerFill, stickyHeader && defaultClasses.sticky, stickyHeader instanceof Object && stickyHeader]}\n />\n\n <div\n className={classes?.headerCell}\n css={[defaultClasses.headerCell, stickyHeader && defaultClasses.sticky, stickyHeader instanceof Object && stickyHeader]}\n >\n {enableSelection && <SelectComponent />}\n\n {enableColumnSelection && <ColumnSelection />}\n\n {enableExport && <Export />}\n <ResizeHandleView />\n </div>\n\n <ColumnHeaderContext.Provider>\n {activeColumns.map((column) => (\n <ColumnContext.Provider key={column.id} value={column.id}>\n <ColumnHeader\n className={cx(classes?.headerCell, column.classes?.headerCell)}\n css={[\n defaultClasses.headerCell,\n columnStyleOverride.get(column.id),\n stickyHeader && defaultClasses.sticky,\n stickyHeader instanceof Object && stickyHeader,\n ]}\n key={column.id}\n >\n <SortComponent>{column.header}</SortComponent>\n <div css={{ flex: 1 }} />\n <FilterControl />\n <ResizeHandle />\n </ColumnHeader>\n </ColumnContext.Provider>\n ))}\n </ColumnHeaderContext.Provider>\n\n <div\n className={classes?.headerCell}\n css={[defaultClasses.headerFill, stickyHeader && defaultClasses.sticky, stickyHeader instanceof Object && stickyHeader]}\n />\n </>\n }\n >\n {(itemIds, startIndex) => itemIds.map((itemId, index) => <Row key={itemId} itemId={itemId} rowIndex={startIndex + index} />)}\n </Virtualized>\n );\n});\n","import { 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};\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 { TableTheme } from '../../types';\n\nexport const Badge: TableTheme['components']['Badge'] = ({ badgeContent, children }) => {\n if (!open) return null;\n\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 { TableTheme } from '../../types';\nimport { darkGray, lightGray } from './defaultClasses';\n\nexport const Button: TableTheme['components']['Button'] = ({ startIcon, children, variant = 'text', ...props }) => {\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 ${darkGray}`,\n\n '&:disabled': {\n borderColor: lightGray,\n },\n },\n variant === 'contained' && {\n color: 'var(--primaryContrastText)',\n backgroundColor: 'var(--primaryMain)',\n boxShadow: '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 { 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 { 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 { useState } from 'react';\nimport { TableTheme } from '../../types';\nimport { darkGray } from './defaultClasses';\n\nexport const TextField: TableTheme['components']['TextField'] = ({ endIcon, className, inputRef, ...props }) => {\n const [focus, setFocus] = useState(false);\n\n return (\n <div className={className} css={{ display: 'flex' }}>\n <span\n css={[\n {\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n border: `1px solid ${darkGray}`,\n borderRadius: 4,\n },\n focus && { border: '2px solid var(--primaryMain)', margin: -1 },\n ]}\n >\n <input\n ref={inputRef}\n {...props}\n value={props.value ?? ''}\n onFocus={() => setFocus(true)}\n onBlur={() => setFocus(false)}\n css={{\n flex: 1,\n border: 'none',\n outline: 'none',\n borderRadius: 4,\n padding: 'calc(var(--spacing) * 2)',\n paddingRight: 0,\n transition: 'outline 500ms',\n }}\n />\n\n {endIcon}\n </span>\n </div>\n );\n};\n","import { Spinner } from '../../components/spinnner';\nimport { 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 { cloneElement, HTMLProps } from 'react';\nimport { 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 (props: HTMLProps<Element>) => (\n <ClassNames>\n {({ css }) =>\n cloneElement(svg, {\n ...props,\n className: css(IconDefaultStyle, props.className),\n })\n }\n </ClassNames>\n );\n}\n\nconst Settings = Icon(\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 0 24 24\" width=\"24px\" fill=\"currentColor\">\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 xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 0 24 24\" width=\"24px\" fill=\"currentColor\">\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 xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 0 24 24\" width=\"24px\" fill=\"currentColor\">\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 xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 0 24 24\" width=\"24px\" fill=\"currentColor\">\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 xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 0 24 24\" width=\"24px\" fill=\"currentColor\">\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 xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 0 24 24\" width=\"24px\" fill=\"currentColor\">\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 xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 0 24 24\" width=\"24px\" fill=\"currentColor\">\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 { TableTheme } from '../../types';\n\nexport const defaultTexts: TableTheme['text'] = {\n selectColumns: 'Select visible columns',\n noResults: 'No results',\n exportTitle: 'Export',\n exportCopy: 'To clipboard',\n exportDownload: 'Download',\n today: 'Today',\n thisWeek: 'This week',\n reset: 'Reset',\n loading: 'Loading',\n selected: (count) => `${count} selected`,\n};\n","import { 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 { useContext } from 'react';\nimport { Store } from 'schummar-state/react';\nimport { ColumnContext, TableContext } from '../components/table';\nimport { defaultTableTheme } from '../theme/defaultTheme';\nimport { globalTableTheme, mergeThemes, TableThemeContext } from '../theme/tableTheme';\nimport { MemoizedTableTheme, TableTheme } from '../types';\nimport { useTableMemo } from './useTableMemo';\n\nconst emptyStore = new Store(undefined);\n\nexport function useTheme<T, S>(selector: (theme: MemoizedTableTheme<T>) => S): S {\n const contextTableTheme = useContext(TableThemeContext);\n const table = useContext(TableContext);\n const columnId = useContext(ColumnContext);\n const memo = useTableMemo();\n\n const process = (t: TableTheme<T>): MemoizedTableTheme<T> => {\n const cell = t.classes?.cell;\n const selected = t.text.selected;\n\n return {\n ...t,\n classes: {\n ...t.classes,\n cell: cell instanceof Function || Array.isArray(cell) ? memo('theme.classes.cell', cell) : cell,\n },\n text: {\n ...t.text,\n selected: selected instanceof Function || Array.isArray(selected) ? memo('theme.text.selected', selected) : selected,\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 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 };\n\n const theme = mergeThemes(defaultTableTheme, globalTableTheme, contextTableTheme, localTheme, columnsTheme) as TableTheme<T>;\n\n return selector(process(theme));\n }) ??\n emptyStore.useState() ??\n selector(process(mergeThemes(defaultTableTheme, globalTableTheme, contextTableTheme) as TableTheme<T>));\n\n return theme;\n}\n","import { ComponentType, useContext, useLayoutEffect, useRef } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { PopoverContext } from '../theme/defaultTheme/popover';\nimport { TableTheme } from '../types';\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 { visible } = useContext(PopoverContext);\n\n useLayoutEffect(() => {\n if (visible && ref.current) {\n ref.current.focus();\n }\n }, [visible]);\n\n return <TextField {...props} inputRef={ref} />;\n}\n","import { Fragment, useMemo, useState } from 'react';\n\nconst className = 'schummar-table-date-input';\n\nconst defaultDate = new Date(1970, 0, 1);\n\nconst isIncludedType = (type: Intl.DateTimeFormatPartTypes): type is 'day' | 'month' | 'year' =>\n type === 'day' || type === 'month' || type === 'year';\n\nconst defaultLengths = {\n day: 2,\n month: 2,\n year: 4,\n};\n\nconst maxLengths = {\n day: 2,\n month: 2,\n year: Infinity,\n};\n\nconst length = (type: 'day' | 'month' | 'year', value: string) => Math.max(value.length, defaultLengths[type]);\n\nconst tabNext = (e: Element) => {\n const all = Array.from(document.querySelectorAll(`.${className}`));\n const index = all.indexOf(e);\n const next = all[(index + 1) % all.length];\n\n if (next instanceof HTMLElement) {\n next.focus();\n }\n};\n\nexport function DateInput({ value, onChange, locale }: { value: Date | null; onChange: (date: Date | null) => void; locale?: string }) {\n const [override, setOverride] = useState<{ type: string; value: string }>();\n\n const commit = () => {\n if (!override) {\n return;\n }\n\n setOverride(undefined);\n\n if (!override.value) {\n onChange(null);\n return;\n }\n\n const newValue = value ? new Date(value) : new Date();\n if (override.type === 'day') {\n newValue.setDate(Number(override.value));\n } else if (override.type === 'month') {\n newValue.setMonth(Number(override.value) - 1);\n } else if (override.type === 'year') {\n newValue.setFullYear(Number(override.value));\n }\n\n onChange(newValue);\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 const parts = format.formatToParts(value ?? defaultDate);\n const isEmpty = !value;\n\n return (\n <div\n css={{\n display: 'flex',\n alignItems: 'baseline',\n }}\n >\n {parts.map(({ type, value }, index) => (\n <Fragment key={index}>\n {isIncludedType(type) ? (\n <input\n className={className}\n css={{\n width: `${length(type, value)}ch`,\n boxSizing: 'content-box',\n overflow: 'visible',\n border: 'none',\n borderBottom: '2px solid transparent',\n outline: 'none',\n fontSize: 'inherit',\n\n '&:focus': {\n borderBottom: '2px solid var(--primaryMain)',\n },\n }}\n placeholder={''.padEnd(length(type, value), '0')}\n value={override?.type === type ? override.value : !isEmpty ? value : ''}\n onChange={(e) => {\n setOverride({ type, value: e.target.value });\n if (e.target.value.length >= maxLengths[type]) {\n setTimeout(() => tabNext(e.target));\n }\n }}\n onFocus={(e) => e.target.select()}\n onBlur={commit}\n />\n ) : type === 'literal' ? (\n <span>{value}</span>\n ) : null}\n </Fragment>\n ))}\n </div>\n );\n}\n","import { useDayzed } from 'dayzed';\nimport React, { useEffect, useMemo, useState } from 'react';\nimport { useTheme } from '..';\nimport { gray } from '../theme/defaultTheme/defaultClasses';\nimport { DateInput } from './dateInput';\n\nexport type DateRange = { min: Date; max: Date };\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) => 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. */\n firstDayOfWeek?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\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) => new Date(d.getFullYear(), d.getMonth(), d.getDate() + 1, 0, 0, 0, -1);\n\nexport const today = (): DateRange => {\n const today = startOfDay(new Date());\n return { min: today, max: today };\n};\n\nexport const thisWeek = (firstDayOfWeek = 0): 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);\n\n const max = new Date(min);\n max.setDate(max.getDate() + 6);\n\n return { min: startOfDay(min), max: endOfDay(max) };\n};\n\n/** Returns whether two dates and/or date ranges intersect. Intersection is considered per day. */\nexport function dateIntersect(a: Date | null | DateRange, b: Date | null | DateRange) {\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 DatePicker({ value, onChange, rangeSelect, locale, firstDayOfWeek = 0 }: DatePickerProps) {\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 textToday = useTheme((t) => t.text.today);\n const textThisWeek = useTheme((t) => t.text.thisWeek);\n const textReset = useTheme((t) => t.text.reset);\n\n const [baseDate] = useState(new Date());\n const [dateInView, setDateInView] = useState<Date>(baseDate);\n const [dirty, setDirty] = useState<Partial<DateRange>>();\n const [hovered, setHovered] = useState<Date>();\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 { calendars, getBackProps, getForwardProps, getDateProps } = useDayzed({\n onDateSelected: () => undefined,\n firstDayOfWeek,\n showOutsideDays: true,\n date: dateInView,\n onOffsetChanged: (offset) => setDateInView(new Date(dateInView.getFullYear(), dateInView.getMonth() + offset)),\n offset: 0,\n });\n\n const formatWeekday = useMemo(() => {\n const { format } = new Intl.DateTimeFormat(locale, { weekday: 'short' });\n return (weekDay: number) => format(new Date(Date.UTC(2021, 5, weekDay)));\n }, [locale]);\n\n useEffect(() => setDateInView(value === null ? new Date() : value instanceof Date ? value : value.max), [value]);\n\n useEffect(() => {\n if (!rangeSelect) {\n setDirty(undefined);\n }\n }, [rangeSelect]);\n\n function set(min?: Date, max?: Date, edit?: 'min' | 'max') {\n if (!rangeSelect) {\n onChange(min ?? null);\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 } : null);\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 <div css={{ display: 'grid', gridAutoFlow: 'column', justifyContent: 'center', alignItems: 'baseline', gap: 'var(--spacing)' }}>\n <DateInput value={min ?? null} onChange={(date) => set(date ?? undefined, max, 'min')} locale={locale} />\n\n {rangeSelect && (\n <>\n {' - '}\n <DateInput value={max ?? null} onChange={(date) => set(min, date ?? undefined, 'max')} locale={locale} />\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 {...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 {...getForwardProps({ calendars })}>\n <ChevronRight />\n </IconButton>\n </div>\n\n <div\n css={{\n justifySelf: 'center',\n display: 'grid',\n gridTemplateColumns: 'repeat(7, max-content)',\n fontWeight: 'bold',\n }}\n >\n {weekDays.map((_v, weekDay) => (\n <div key={weekDay} css={{ justifySelf: 'center', marginBottom: 'var(--spacing)' }}>\n {formatWeekday(weekDay)}\n </div>\n ))}\n\n {weeks.map((week, index) =>\n week.map((dateObj, dayIndex) => {\n if (!dateObj) {\n return <div />;\n }\n\n const { prevMonth, nextMonth, date, today } = dateObj;\n\n const selected = date.getTime() === min?.getTime() || (min && max && dateIntersect(date, { min, max }));\n const preSelected =\n !selected &&\n (date.getTime() === hovered?.getTime() ||\n (min && !max && hovered && dateIntersect(date, min <= hovered ? { min, max: hovered } : { min: hovered, max: min })));\n\n return (\n <button\n key={`${index}-${dayIndex}`}\n css={[\n {\n padding: 10,\n border: '1px solid transparent',\n background: 'transparent',\n cursor: 'pointer',\n },\n (prevMonth || nextMonth) && {\n color: gray,\n },\n today && {\n border: '1px solid var(--secondaryMain)',\n },\n selected && {\n background: 'var(--primaryMain)',\n color: 'var(--primaryContrastText)',\n },\n preSelected && {\n background: 'var(--primaryLight)',\n color: 'var(--primaryContrastText)',\n },\n ]}\n {...getDateProps({ dateObj })}\n onClick={() => {\n if (dirty) {\n if (min) set(min, date);\n else set(date, max);\n } else {\n set(date);\n }\n }}\n onPointerOver={() => setHovered(date)}\n onPointerOut={() => setHovered(undefined)}\n >\n {date.getDate()}\n </button>\n );\n }),\n )}\n </div>\n </div>\n ))}\n\n <div css={{ marginTop: 'var(--spacing)', display: 'grid', gridAutoFlow: 'column', justifyContent: 'center' }}>\n <Button\n variant=\"text\"\n onClick={() => {\n setDirty(undefined);\n onChange(today());\n }}\n >\n {textToday}\n </Button>\n\n <Button\n variant=\"text\"\n onClick={() => {\n setDirty(undefined);\n onChange(thisWeek(firstDayOfWeek));\n }}\n >\n {textThisWeek}\n </Button>\n\n <Button\n variant=\"text\"\n onClick={() => {\n setDirty(undefined);\n onChange(null);\n }}\n >\n {textReset}\n </Button>\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport { useFilter } from '..';\nimport { CommonFilterProps } from '../types';\nimport { dateIntersect, DatePicker, DatePickerProps, DateRange } 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 (x instanceof Array) return x.map(convertDateOrRange).filter(Boolean) as (Date | DateRange)[];\n return convertDateOrRange(x);\n}\n\nexport function DateFilter<T, V>({\n locale,\n firstDayOfWeek,\n singleSelect,\n filterBy = convertDateOrArray,\n ...props\n}: {\n /** Which locale to use to render the calendar. */\n locale?: string;\n /** Which day of the week should be in the first column. */\n firstDayOfWeek?: DatePickerProps['firstDayOfWeek'];\n /** If enabled, only single days can be selected. Ranges otherwise. */\n singleSelect?: boolean;\n} & CommonFilterProps<T, V, Date | DateRange | null, Date | DateRange | null>): JSX.Element {\n const { value = null, onChange } = 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 rangeSelect={!singleSelect} value={value} onChange={onChange} locale={locale} firstDayOfWeek={firstDayOfWeek} />\n </div>\n );\n}\n","import React, { ReactNode, useState } from 'react';\nimport { useColumnContext, useFilter, useTheme } from '..';\nimport { asString, castArray, flatMap, uniq } from '../misc/helpers';\nimport { CommonFilterProps, InternalColumn, SerializableValue } from '../types';\nimport { AutoFocusTextField } from './autoFocusTextField';\nimport { FormControlLabel } from './formControlLabel';\nimport { useTableContext } from './table';\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<T, V, F extends SerializableValue>({\n options: providedOptions,\n stringValue = asString,\n render = stringValue,\n singleSelect,\n ...props\n}: {\n /** Which options are provided to select. By default all unique item values are used. */\n options?: F[];\n /** String representation of a value. Used to filter options via the text field. */\n stringValue?: (value: F) => string;\n /** Render values. By default a string representation of the value is used. */\n render?: (value: F) => ReactNode;\n /** If enabled, only one option can be selected at a time. */\n singleSelect?: boolean;\n} & CommonFilterProps<T, V, F, Set<F>>): 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 selected = useTheme((t) => t.text.selected);\n const noResults = useTheme((t) => t.text.noResults);\n\n const table = useTableContext<T>();\n const columnId = useColumnContext();\n\n const {\n value = new Set<F>(),\n onChange,\n filterBy,\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 InternalColumn<T, V> | undefined;\n if (!column) return [];\n\n return uniq(flatMap(state.items, (item) => castArray(filterBy(column.value(item.value), item.value))));\n });\n\n const [query, setQuery] = useState('');\n const filtered = options.filter((option) => !query || stringValue(option).toLowerCase().includes(query.toLowerCase()));\n\n return (\n <div\n css={{\n padding: 'calc(var(--spacing) * 2)',\n display: 'grid',\n gap: 'var(--spacing)',\n }}\n >\n <AutoFocusTextField\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n endIcon={<IconButton onClick={() => setQuery('')}>{!query ? <Search /> : <Clear />}</IconButton>}\n css={{ marginBottom: 'var(--spacing)' }}\n />\n\n <div css={{ maxHeight: '20em', overflowY: 'auto' }}>\n <FormControlLabel\n disabled={value.size === 0}\n control={<Checkbox disabled={value.size === 0} checked={value.size > 0} onChange={() => onChange(new Set())} />}\n label={<>&lt;{selected(value.size)}&gt;</>}\n ></FormControlLabel>\n\n {filtered.map((option, index) => (\n <FormControlLabel\n key={index}\n control={<Checkbox checked={value.has(option)} onChange={() => onChange(toggle(value, option, singleSelect))} />}\n label={render(option)}\n ></FormControlLabel>\n ))}\n </div>\n\n {filtered.length === 0 && <span css={{ textAlign: 'center' }}>{noResults}</span>}\n </div>\n );\n}\n","export function debounce<Args extends any[]>(fn: (...args: Args) => void, ms: number): { (...args: Args): void; flush(): 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 fn(...(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 );\n}\n","import { castDraft } from 'immer';\nimport { useContext, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { useColumnContext, useTableContext } from '..';\nimport { FilterControlContext } from '../components/filterControl';\nimport { debounce } from '../misc/debounce';\nimport { FilterImplementation, SerializableValue } from '../types';\nimport { useTableMemo } from './useTableMemo';\n\nexport function useFilter<T, V, F, S extends SerializableValue>(impl: FilterImplementation<T, V, F, S>) {\n const table = useTableContext<T>();\n const columnId = useColumnContext();\n const cache = useTableMemo();\n const filterBy = impl.filterBy && cache('', impl.filterBy);\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 }, []);\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((state) => state.filterValues.get(columnId) as S | undefined);\n const [dirtyValue, setDirtyValue] = useState<S>();\n const implRef = useRef(impl);\n\n useLayoutEffect(() => {\n implRef.current = impl;\n });\n\n const delayedUpdate = useMemo(\n () =>\n debounce((value?: S) => {\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?: S) {\n setDirtyValue(value);\n delayedUpdate(value);\n }\n\n useEffect(() => delayedUpdate.flush(), [delayedUpdate]);\n\n return {\n value: dirtyValue ?? value,\n onChange,\n close: useContext(FilterControlContext),\n filterBy: filterBy ?? ((x) => x as unknown as F | F[]),\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","import React from 'react';\nimport { useFilter } from '../hooks/useFilter';\nimport { useTheme } from '../hooks/useTheme';\nimport { asStringOrArray } from '../misc/helpers';\nimport { textMatch } from '../misc/textMatch';\nimport { CommonFilterProps } from '../types';\nimport { AutoFocusTextField } from './autoFocusTextField';\n\nexport function TextFilter<T, V>({\n compare = textMatch,\n filterBy = asStringOrArray,\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} & CommonFilterProps<T, V, 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 { value = '', onChange } = 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={(e) => onChange(e.target.value)}\n endIcon={<IconButton onClick={() => onChange('')}>{!value ? <Search /> : <Clear />}</IconButton>}\n />\n </div>\n );\n}\n"],"names":["TableMemoContext","createContext","Map","children","_jsx","useMemo","memoCache","useContext","key","fn","deps","Array","isArray","slice","toString","cachedValue","get","hit","length","every","x","i","set","useState","castDraft","Store","ColumnHeaderContext","StoreScope","items","props","ref","useRef","columnId","useColumnContext","table","useTableContext","enabled","store","useStore","draggingStart","clone","div","current","update","state","delete","offsetLeft","cols","getState","columnOrder","map","id","otherCols","filter","col","firstOffsetleft","find","sum","targetIndex","findIndex","width","offsetWidth","e","mouseX","clientX","bounds","getBoundingClientRect","undefined","Math","abs","stopPropagation","setPointerCapture","pointerId","cloneNode","body","append","value","Object","entries","getComputedStyle","style","assign","pointerEvents","position","boxShadow","left","top","color","index","indexOf","calcTargetIndex","columns","forEach","offset","reduce","columnStyleOverride","transition","transform","zIndex","splice","remove","clear","userSelect","onPointerDown","onPointerMove","onPointerUp","control","label","disabled","_jsxs","display","alignItems","cursor","marginLeft","IconButton","useTheme","t","components","Popover","Checkbox","Settings","icons","selectColumns","text","cssVariables","useCssVariables","hiddenColumns","anchorEl","setAnchorEl","toggle","column","controlledHiddenColumns","onHiddenColumnsChange","newValue","Set","has","add","currentTarget","padding","marginBottom","cannotHide","header","Button","Export","Clipboard","exportTitle","exportCopy","exportDownload","anchor","setAnchor","generate","options","activeColumns","activeItems","data","String","item","exportCell","csvExport","copy","clipboard","writeText","enableExport","download","a","document","createElement","href","encodeURIComponent","appendChild","click","removeChild","justifyItems","gap","justifyContent","FilterControlContext","FilterList","ArrowDropDown","isActive","filters","filterValue","filterValues","close","useCallback","preventDefault","target","hasPointerCapture","parent","parentElement","max","columnWidths","releasePointerCapture","getModifierState","onDoubleClick","alignSelf","content","height","background","defaultWrapCell","defaultClasses","Cell","memo","itemId","rowIndex","renderCell","wrapCell","activeItemsById","throttle","debugRender","className","cx","calcClassNames","classes","cell","hasDeferredChildren","Spinner","ChevronRight","isExpanded","expanded","hasChildren","controlledExpanded","expandOnlyOne","onExpandedChange","newExpanded","ancestor","getAncestors","margin","isSelected","itemIds","from","keys","size","selection","mouseEvent","nativeEvent","lastSelectedId","selectSyncChildren","controlledSelection","onSelectionChange","range","shiftKey","b","min","newSelection","descendant","getDescendants","justifySelf","Function","evenCell","oddCell","Row","divRef","indent","columnIds","enableSelection","rowAction","o","ResizeObserver","contains","rowHeights","offsetHeight","observe","disconnect","cellFill","firstCell","Badge","ArrowUpward","direction","sort","s","off","controlledSort","onSortChange","newDirection","newSort","push","gridTemplateColumns","overflow","textOverflow","fontSize","opacity","findScrollRoot","documentElement","scrollHeight","clientHeight","overflowY","relativeOffset","y","offsetParent","offsetTop","HTMLElement","virtual","probeRef","setCounter","to","before","after","root","rowHeight","initalRowHeight","overscan","overscanTop","overscanBottom","totalHeight","h","probeOffset","headerHeight","topOfTable","scrollTop","bottomOfTable","reverse","throttleScroll","incCounter","c","addEventListener","removeEventListener","cancel","gridColumn","TableContext","ColumnContext","Error","useTableState","loadingText","loading","isHydrated","useTableStateStorage","showLoading","setShowLoading","handle","setTimeout","clearTimeout","TableInner","hidden","fullWidth","stickyHeader","enableColumnSelection","join","visibility","headerCell","headerFill","sticky","flex","startIndex","css","badgeContent","open","flexShrink","verticalAlign","right","transformOrigin","flexWrap","minWidth","lineHeight","alignContent","borderRadius","startIcon","variant","border","darkGray","borderColor","lightGray","backgroundColor","marginRight","appearance","checked","fill","transformColor","TextField","endIcon","inputRef","focus","setFocus","outline","paddingRight","IconDefaultStyle","svg","ClassNames","cloneElement","Icon","Search","Clear","defaultIcons","defaultTexts","noResults","today","thisWeek","reset","selected","count","defaultTableTheme","defaultComponents","colors","defaultColors","spacing","TableThemeContext","mergeThemes","globalTableTheme","visible","PopoverContext","defaultDate","Date","isIncludedType","type","defaultLengths","day","month","year","maxLengths","Infinity","tabNext","all","querySelectorAll","next","onChange","locale","override","setOverride","commit","setDate","Number","setMonth","setFullYear","format","Intl","DateTimeFormat","parts","formatToParts","isEmpty","Fragment","boxSizing","borderBottom","padEnd","select","weekDays","startOfDay","d","getFullYear","getMonth","getDate","endOfDay","firstDayOfWeek","now","diff","getDay","rangeSelect","textToday","textThisWeek","textReset","baseDate","dateInView","setDateInView","dirty","setDirty","hovered","setHovered","calendars","getBackProps","getForwardProps","getDateProps","useDayzed","onDateSelected","showOutsideDays","date","onOffsetChanged","formatWeekday","weekday","weekDay","UTC","edit","formatMonth","formatYear","gridAutoFlow","weeks","fontWeight","_v","week","dateObj","dayIndex","prevMonth","nextMonth","getTime","dateIntersect","preSelected","gray","marginTop","convertDate","convertDateOrRange","Boolean","singleSelect","filterBy","convertDateOrArray","useFilter","test","newSet","providedOptions","stringValue","asString","render","uniq","flatMap","castArray","query","setQuery","filtered","option","toLowerCase","includes","maxHeight","textAlign","compare","textMatch","asStringOrArray"],"mappings":"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"}