@coveord/plasma-mantine 58.0.2 → 59.1.0

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.
Files changed (60) hide show
  1. package/.turbo/turbo-build.log +4 -4
  2. package/.turbo/turbo-test.log +99 -108
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/cjs/components/Alert/Alert.d.ts +5 -0
  5. package/dist/cjs/components/Alert/Alert.d.ts.map +1 -1
  6. package/dist/cjs/components/Alert/Alert.js +37 -9
  7. package/dist/cjs/components/Alert/Alert.js.map +1 -1
  8. package/dist/cjs/components/Badge/Badge.d.ts +2 -2
  9. package/dist/cjs/components/Badge/Badge.d.ts.map +1 -1
  10. package/dist/cjs/components/Badge/Badge.js.map +1 -1
  11. package/dist/cjs/components/Header/HeaderRight/HeaderRight.js +1 -1
  12. package/dist/cjs/components/Header/HeaderRight/HeaderRight.js.map +1 -1
  13. package/dist/cjs/components/Table/use-persisted-column-visibility.d.ts +16 -0
  14. package/dist/cjs/components/Table/use-persisted-column-visibility.d.ts.map +1 -0
  15. package/dist/cjs/components/Table/use-persisted-column-visibility.js +123 -0
  16. package/dist/cjs/components/Table/use-persisted-column-visibility.js.map +1 -0
  17. package/dist/cjs/components/Table/use-table.d.ts +12 -0
  18. package/dist/cjs/components/Table/use-table.d.ts.map +1 -1
  19. package/dist/cjs/components/Table/use-table.js +22 -7
  20. package/dist/cjs/components/Table/use-table.js.map +1 -1
  21. package/dist/cjs/styles/Alert.module.css +17 -5
  22. package/dist/cjs/styles/Modal.module.css +2 -2
  23. package/dist/cjs/utils/local-storage.d.ts +38 -0
  24. package/dist/cjs/utils/local-storage.d.ts.map +1 -0
  25. package/dist/cjs/utils/local-storage.js +175 -0
  26. package/dist/cjs/utils/local-storage.js.map +1 -0
  27. package/dist/esm/components/Alert/Alert.d.ts +5 -0
  28. package/dist/esm/components/Alert/Alert.d.ts.map +1 -1
  29. package/dist/esm/components/Alert/Alert.js +35 -9
  30. package/dist/esm/components/Alert/Alert.js.map +1 -1
  31. package/dist/esm/components/Badge/Badge.d.ts +2 -2
  32. package/dist/esm/components/Badge/Badge.d.ts.map +1 -1
  33. package/dist/esm/components/Badge/Badge.js.map +1 -1
  34. package/dist/esm/components/Header/HeaderRight/HeaderRight.js +1 -1
  35. package/dist/esm/components/Header/HeaderRight/HeaderRight.js.map +1 -1
  36. package/dist/esm/components/Table/use-persisted-column-visibility.d.ts +16 -0
  37. package/dist/esm/components/Table/use-persisted-column-visibility.d.ts.map +1 -0
  38. package/dist/esm/components/Table/use-persisted-column-visibility.js +85 -0
  39. package/dist/esm/components/Table/use-persisted-column-visibility.js.map +1 -0
  40. package/dist/esm/components/Table/use-table.d.ts +12 -0
  41. package/dist/esm/components/Table/use-table.d.ts.map +1 -1
  42. package/dist/esm/components/Table/use-table.js +15 -3
  43. package/dist/esm/components/Table/use-table.js.map +1 -1
  44. package/dist/esm/styles/Alert.module.css +17 -5
  45. package/dist/esm/styles/Modal.module.css +2 -2
  46. package/dist/esm/utils/local-storage.d.ts +38 -0
  47. package/dist/esm/utils/local-storage.d.ts.map +1 -0
  48. package/dist/esm/utils/local-storage.js +134 -0
  49. package/dist/esm/utils/local-storage.js.map +1 -0
  50. package/package.json +5 -5
  51. package/src/components/Alert/Alert.tsx +24 -6
  52. package/src/components/Badge/Badge.tsx +30 -27
  53. package/src/components/Header/HeaderRight/HeaderRight.tsx +1 -1
  54. package/src/components/Table/__tests__/use-persisted-column-visibility.spec.ts +203 -0
  55. package/src/components/Table/use-persisted-column-visibility.ts +79 -0
  56. package/src/components/Table/use-table.ts +36 -3
  57. package/src/styles/Alert.module.css +17 -5
  58. package/src/styles/Modal.module.css +2 -2
  59. package/src/utils/__tests__/local-storage.spec.ts +176 -0
  60. package/src/utils/local-storage.ts +151 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/Badge/Badge.tsx"],"sourcesContent":["import {\n alpha,\n BadgeCssVariables,\n BadgeProps,\n BadgeStylesNames,\n BadgeVariant,\n Badge as MantineBadge,\n polymorphicFactory,\n PolymorphicFactory,\n PolymorphicComponentProps,\n useComputedColorScheme,\n} from '@mantine/core';\nimport {forwardRef, ForwardRefExoticComponent, ReactElement, ReactNode, RefAttributes} from 'react';\n\nexport interface SemanticBadgeProps\n extends Pick<\n BadgeProps,\n | 'm'\n | 'mt'\n | 'mb'\n | 'ml'\n | 'mr'\n | 'ms'\n | 'me'\n | 'mx'\n | 'my'\n | 'miw'\n | 'maw'\n | 'pos'\n | 'top'\n | 'left'\n | 'right'\n | 'bottom'\n | 'inset'\n | 'display'\n | 'flex'\n | 'leftSection'\n | 'rightSection'\n | 'fullWidth'\n | 'circle'\n > {\n /**\n * The size of the badge.\n * @default 'small'\n */\n size?: 'small' | 'large';\n /**\n * Whether the badge is displayed over a light or dark background.\n * @default Falls back to theme.\n */\n on?: 'light' | 'dark';\n /**\n * The content of the badge.\n */\n children?: ReactNode;\n}\n\nexport type SemanticBadge = ForwardRefExoticComponent<SemanticBadgeProps & RefAttributes<HTMLDivElement>>;\n\nconst enhanceBadge = (\n ComponentLight: <L = 'div'>(props: PolymorphicComponentProps<L, BadgeProps>) => ReactElement,\n ComponentDark: <L = 'div'>(props: PolymorphicComponentProps<L, BadgeProps>) => ReactElement,\n displayName: string,\n): SemanticBadge => {\n const EnhancedBadge = forwardRef<HTMLDivElement, SemanticBadgeProps>((props, ref) => {\n const computedColorScheme = useComputedColorScheme('light', {getInitialValueInEffect: true});\n const Component = (props.on || computedColorScheme) === 'dark' ? ComponentDark : ComponentLight;\n return (\n <Component\n ref={ref}\n {...props}\n py={2}\n px={12}\n size={props.size === 'large' ? 'lg' : 'md'}\n h={props.size === 'large' ? 22 : 20}\n />\n );\n });\n EnhancedBadge.displayName = displayName;\n return EnhancedBadge;\n};\n\nconst BadgePrimary = enhanceBadge(\n MantineBadge.withProps({\n variant: 'light',\n bd: '1px solid var(--badge-bg)',\n c: 'var(--mantine-primary-color-6)',\n }),\n MantineBadge.withProps({\n variant: 'light',\n bd: `1px solid ${alpha('var(--mantine-primary-color-3)', 0.32)}`,\n c: 'var(--mantine-primary-color-2)',\n bg: alpha('var(--mantine-primary-color-3)', 0.32),\n }),\n 'Badge.Primary',\n);\nconst BadgeSecondary = enhanceBadge(\n MantineBadge.withProps({\n variant: 'light',\n color: 'gray',\n bd: '1px solid var(--badge-bg)',\n c: 'gray.7',\n }),\n MantineBadge.withProps({\n variant: 'light',\n color: 'gray',\n c: 'var(--mantine-color-white)',\n bd: `1px solid ${alpha('var(--mantine-color-gray-3)', 0.16)}`,\n bg: alpha('var(--mantine-color-gray-3)', 0.16),\n }),\n 'Badge.Secondary',\n);\nconst BadgeSuccess = enhanceBadge(\n MantineBadge.withProps({\n variant: 'light',\n color: 'green',\n bd: '1px solid var(--badge-bg)',\n c: 'green.6',\n }),\n MantineBadge.withProps({\n variant: 'light',\n color: 'green',\n c: 'green.2',\n bd: `1px solid ${alpha('var(--mantine-color-green-3)', 0.16)}`,\n bg: alpha('var(--mantine-color-green-3)', 0.16),\n }),\n 'Badge.Success',\n);\nconst BadgeCritical = enhanceBadge(\n MantineBadge.withProps({\n variant: 'light',\n color: 'critical',\n bd: '1px solid var(--badge-bg)',\n c: 'red.6',\n }),\n MantineBadge.withProps({\n variant: 'light',\n color: 'critical',\n c: 'red.2',\n bd: `1px solid ${alpha('var(--mantine-color-red-3)', 0.16)}`,\n bg: alpha('var(--mantine-color-red-3)', 0.16),\n }),\n 'Badge.Critical',\n);\nconst BadgeWarning = enhanceBadge(\n MantineBadge.withProps({\n variant: 'light',\n color: 'warning',\n bd: '1px solid var(--badge-bg)',\n c: 'yellow.6',\n }),\n MantineBadge.withProps({\n variant: 'light',\n color: 'warning',\n c: 'yellow.2',\n bd: `1px solid ${alpha('var(--mantine-color-yellow-3)', 0.16)}`,\n bg: alpha('var(--mantine-color-yellow-3)', 0.16),\n }),\n 'Badge.Warning',\n);\nconst BadgeDisabled = enhanceBadge(\n MantineBadge.withProps({\n variant: 'light',\n color: 'gray',\n c: 'var(--coveo-color-text-disabled)',\n bg: 'var(--coveo-color-bg-disabled)',\n }),\n MantineBadge.withProps({\n variant: 'light',\n color: 'gray',\n c: 'dark.3',\n bg: alpha('var(--mantine-color-gray-3)', 0.16),\n }),\n 'Badge.Disabled',\n);\n\nexport type BadgeOverloadFactory = PolymorphicFactory<{\n props: BadgeProps;\n defaultRef: HTMLDivElement;\n defaultComponent: 'div';\n stylesNames: BadgeStylesNames;\n vars: BadgeCssVariables;\n variant: BadgeVariant;\n staticComponents: {\n Primary: SemanticBadge;\n Secondary: SemanticBadge;\n Success: SemanticBadge;\n Critical: SemanticBadge;\n Warning: SemanticBadge;\n Disabled: SemanticBadge;\n };\n}>;\n\nexport const Badge = polymorphicFactory<BadgeOverloadFactory>((props, ref) => <MantineBadge ref={ref} {...props} />);\n\nBadge.Primary = BadgePrimary;\nBadge.Secondary = BadgeSecondary;\nBadge.Success = BadgeSuccess;\nBadge.Critical = BadgeCritical;\nBadge.Warning = BadgeWarning;\nBadge.Disabled = BadgeDisabled;\n"],"names":["alpha","Badge","MantineBadge","polymorphicFactory","useComputedColorScheme","forwardRef","enhanceBadge","ComponentLight","ComponentDark","displayName","EnhancedBadge","props","ref","computedColorScheme","getInitialValueInEffect","Component","on","py","px","size","h","BadgePrimary","withProps","variant","bd","c","bg","BadgeSecondary","color","BadgeSuccess","BadgeCritical","BadgeWarning","BadgeDisabled","Primary","Secondary","Success","Critical","Warning","Disabled"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/components/Badge/Badge.tsx"],"sourcesContent":["import {\n alpha,\n BadgeCssVariables,\n BadgeProps,\n BadgeStylesNames,\n BadgeVariant,\n ElementProps,\n Badge as MantineBadge,\n PolymorphicComponentProps,\n polymorphicFactory,\n PolymorphicFactory,\n useComputedColorScheme,\n} from '@mantine/core';\nimport {forwardRef, ForwardRefExoticComponent, ReactElement, ReactNode, RefAttributes} from 'react';\n\nexport interface SemanticBadgeProps\n extends\n Pick<\n BadgeProps,\n | 'm'\n | 'mt'\n | 'mb'\n | 'ml'\n | 'mr'\n | 'ms'\n | 'me'\n | 'mx'\n | 'my'\n | 'miw'\n | 'maw'\n | 'pos'\n | 'top'\n | 'left'\n | 'right'\n | 'bottom'\n | 'inset'\n | 'display'\n | 'flex'\n | 'leftSection'\n | 'rightSection'\n | 'fullWidth'\n | 'circle'\n >,\n ElementProps<'div'> {\n /**\n * The size of the badge.\n * @default 'small'\n */\n size?: 'small' | 'large';\n /**\n * Whether the badge is displayed over a light or dark background.\n * @default Falls back to theme.\n */\n on?: 'light' | 'dark';\n /**\n * The content of the badge.\n */\n children?: ReactNode;\n}\n\nexport type SemanticBadge = ForwardRefExoticComponent<SemanticBadgeProps & RefAttributes<HTMLDivElement>>;\n\nconst enhanceBadge = (\n ComponentLight: <L = 'div'>(props: PolymorphicComponentProps<L, BadgeProps>) => ReactElement,\n ComponentDark: <L = 'div'>(props: PolymorphicComponentProps<L, BadgeProps>) => ReactElement,\n displayName: string,\n): SemanticBadge => {\n const EnhancedBadge = forwardRef<HTMLDivElement, SemanticBadgeProps>((props, ref) => {\n const computedColorScheme = useComputedColorScheme('light', {getInitialValueInEffect: true});\n const Component = (props.on || computedColorScheme) === 'dark' ? ComponentDark : ComponentLight;\n return (\n <Component\n ref={ref}\n {...props}\n py={2}\n px={12}\n size={props.size === 'large' ? 'lg' : 'md'}\n h={props.size === 'large' ? 22 : 20}\n />\n );\n });\n EnhancedBadge.displayName = displayName;\n return EnhancedBadge;\n};\n\nconst BadgePrimary = enhanceBadge(\n MantineBadge.withProps({\n variant: 'light',\n bd: '1px solid var(--badge-bg)',\n c: 'var(--mantine-primary-color-6)',\n }),\n MantineBadge.withProps({\n variant: 'light',\n bd: `1px solid ${alpha('var(--mantine-primary-color-3)', 0.32)}`,\n c: 'var(--mantine-primary-color-2)',\n bg: alpha('var(--mantine-primary-color-3)', 0.32),\n }),\n 'Badge.Primary',\n);\nconst BadgeSecondary = enhanceBadge(\n MantineBadge.withProps({\n variant: 'light',\n color: 'gray',\n bd: '1px solid var(--badge-bg)',\n c: 'gray.7',\n }),\n MantineBadge.withProps({\n variant: 'light',\n color: 'gray',\n c: 'var(--mantine-color-white)',\n bd: `1px solid ${alpha('var(--mantine-color-gray-3)', 0.16)}`,\n bg: alpha('var(--mantine-color-gray-3)', 0.16),\n }),\n 'Badge.Secondary',\n);\nconst BadgeSuccess = enhanceBadge(\n MantineBadge.withProps({\n variant: 'light',\n color: 'green',\n bd: '1px solid var(--badge-bg)',\n c: 'green.6',\n }),\n MantineBadge.withProps({\n variant: 'light',\n color: 'green',\n c: 'green.2',\n bd: `1px solid ${alpha('var(--mantine-color-green-3)', 0.16)}`,\n bg: alpha('var(--mantine-color-green-3)', 0.16),\n }),\n 'Badge.Success',\n);\nconst BadgeCritical = enhanceBadge(\n MantineBadge.withProps({\n variant: 'light',\n color: 'critical',\n bd: '1px solid var(--badge-bg)',\n c: 'red.6',\n }),\n MantineBadge.withProps({\n variant: 'light',\n color: 'critical',\n c: 'red.2',\n bd: `1px solid ${alpha('var(--mantine-color-red-3)', 0.16)}`,\n bg: alpha('var(--mantine-color-red-3)', 0.16),\n }),\n 'Badge.Critical',\n);\nconst BadgeWarning = enhanceBadge(\n MantineBadge.withProps({\n variant: 'light',\n color: 'warning',\n bd: '1px solid var(--badge-bg)',\n c: 'yellow.6',\n }),\n MantineBadge.withProps({\n variant: 'light',\n color: 'warning',\n c: 'yellow.2',\n bd: `1px solid ${alpha('var(--mantine-color-yellow-3)', 0.16)}`,\n bg: alpha('var(--mantine-color-yellow-3)', 0.16),\n }),\n 'Badge.Warning',\n);\nconst BadgeDisabled = enhanceBadge(\n MantineBadge.withProps({\n variant: 'light',\n color: 'gray',\n c: 'var(--coveo-color-text-disabled)',\n bg: 'var(--coveo-color-bg-disabled)',\n }),\n MantineBadge.withProps({\n variant: 'light',\n color: 'gray',\n c: 'dark.3',\n bg: alpha('var(--mantine-color-gray-3)', 0.16),\n }),\n 'Badge.Disabled',\n);\n\nexport type BadgeOverloadFactory = PolymorphicFactory<{\n props: BadgeProps;\n defaultRef: HTMLDivElement;\n defaultComponent: 'div';\n stylesNames: BadgeStylesNames;\n vars: BadgeCssVariables;\n variant: BadgeVariant;\n staticComponents: {\n Primary: SemanticBadge;\n Secondary: SemanticBadge;\n Success: SemanticBadge;\n Critical: SemanticBadge;\n Warning: SemanticBadge;\n Disabled: SemanticBadge;\n };\n}>;\n\nexport const Badge = polymorphicFactory<BadgeOverloadFactory>((props, ref) => <MantineBadge ref={ref} {...props} />);\n\nBadge.Primary = BadgePrimary;\nBadge.Secondary = BadgeSecondary;\nBadge.Success = BadgeSuccess;\nBadge.Critical = BadgeCritical;\nBadge.Warning = BadgeWarning;\nBadge.Disabled = BadgeDisabled;\n"],"names":["alpha","Badge","MantineBadge","polymorphicFactory","useComputedColorScheme","forwardRef","enhanceBadge","ComponentLight","ComponentDark","displayName","EnhancedBadge","props","ref","computedColorScheme","getInitialValueInEffect","Component","on","py","px","size","h","BadgePrimary","withProps","variant","bd","c","bg","BadgeSecondary","color","BadgeSuccess","BadgeCritical","BadgeWarning","BadgeDisabled","Primary","Secondary","Success","Critical","Warning","Disabled"],"mappings":"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"}
@@ -2,7 +2,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { Group, factory, useProps } from '@mantine/core';
3
3
  import { useHeaderContext } from '../Header.context.js';
4
4
  const defaultProps = {
5
- gap: 'sm'
5
+ gap: 'xs'
6
6
  };
7
7
  export const HeaderRight = factory((_props, ref)=>{
8
8
  const props = useProps('HeaderRight', defaultProps, _props);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/components/Header/HeaderRight/HeaderRight.tsx"],"sourcesContent":["import {CompoundStylesApiProps, Factory, Group, GroupProps, factory, useProps} from '@mantine/core';\nimport {ReactNode} from 'react';\nimport {useHeaderContext} from '../Header.context.js';\n\nexport type HeaderRightStyleNames = 'right';\n\nexport interface HeaderRightProps\n extends\n Omit<GroupProps, 'classNames' | 'styles' | 'vars' | 'children'>,\n CompoundStylesApiProps<HeaderRightFactory> {\n children: ReactNode;\n}\n\nexport type HeaderRightFactory = Factory<{\n props: HeaderRightProps;\n ref: HTMLDivElement;\n stylesNames: HeaderRightStyleNames;\n compound: true;\n}>;\n\nconst defaultProps: Partial<HeaderRightProps> = {\n gap: 'sm',\n};\n\nexport const HeaderRight = factory<HeaderRightFactory>((_props, ref) => {\n const props = useProps('HeaderRight', defaultProps, _props);\n const {gap, className, classNames, styles, style, children, vars, ...others} = props;\n const ctx = useHeaderContext();\n\n return (\n <Group\n ref={ref}\n gap={gap}\n {...ctx.getStyles('right', {className, style, classNames, styles, props})}\n {...others}\n >\n {children}\n </Group>\n );\n});\n\nHeaderRight.displayName = 'Header.Right';\n"],"names":["Group","factory","useProps","useHeaderContext","defaultProps","gap","HeaderRight","_props","ref","props","className","classNames","styles","style","children","vars","others","ctx","getStyles","displayName"],"mappings":";AAAA,SAAyCA,KAAK,EAAcC,OAAO,EAAEC,QAAQ,QAAO,gBAAgB;AAEpG,SAAQC,gBAAgB,QAAO,uBAAuB;AAkBtD,MAAMC,eAA0C;IAC5CC,KAAK;AACT;AAEA,OAAO,MAAMC,cAAcL,QAA4B,CAACM,QAAQC;IAC5D,MAAMC,QAAQP,SAAS,eAAeE,cAAcG;IACpD,MAAM,EAACF,GAAG,EAAEK,SAAS,EAAEC,UAAU,EAAEC,MAAM,EAAEC,KAAK,EAAEC,QAAQ,EAAEC,IAAI,EAAE,GAAGC,QAAO,GAAGP;IAC/E,MAAMQ,MAAMd;IAEZ,qBACI,KAACH;QACGQ,KAAKA;QACLH,KAAKA;QACJ,GAAGY,IAAIC,SAAS,CAAC,SAAS;YAACR;YAAWG;YAAOF;YAAYC;YAAQH;QAAK,EAAE;QACxE,GAAGO,MAAM;kBAETF;;AAGb,GAAG;AAEHR,YAAYa,WAAW,GAAG"}
1
+ {"version":3,"sources":["../../../../../src/components/Header/HeaderRight/HeaderRight.tsx"],"sourcesContent":["import {CompoundStylesApiProps, Factory, Group, GroupProps, factory, useProps} from '@mantine/core';\nimport {ReactNode} from 'react';\nimport {useHeaderContext} from '../Header.context.js';\n\nexport type HeaderRightStyleNames = 'right';\n\nexport interface HeaderRightProps\n extends\n Omit<GroupProps, 'classNames' | 'styles' | 'vars' | 'children'>,\n CompoundStylesApiProps<HeaderRightFactory> {\n children: ReactNode;\n}\n\nexport type HeaderRightFactory = Factory<{\n props: HeaderRightProps;\n ref: HTMLDivElement;\n stylesNames: HeaderRightStyleNames;\n compound: true;\n}>;\n\nconst defaultProps: Partial<HeaderRightProps> = {\n gap: 'xs',\n};\n\nexport const HeaderRight = factory<HeaderRightFactory>((_props, ref) => {\n const props = useProps('HeaderRight', defaultProps, _props);\n const {gap, className, classNames, styles, style, children, vars, ...others} = props;\n const ctx = useHeaderContext();\n\n return (\n <Group\n ref={ref}\n gap={gap}\n {...ctx.getStyles('right', {className, style, classNames, styles, props})}\n {...others}\n >\n {children}\n </Group>\n );\n});\n\nHeaderRight.displayName = 'Header.Right';\n"],"names":["Group","factory","useProps","useHeaderContext","defaultProps","gap","HeaderRight","_props","ref","props","className","classNames","styles","style","children","vars","others","ctx","getStyles","displayName"],"mappings":";AAAA,SAAyCA,KAAK,EAAcC,OAAO,EAAEC,QAAQ,QAAO,gBAAgB;AAEpG,SAAQC,gBAAgB,QAAO,uBAAuB;AAkBtD,MAAMC,eAA0C;IAC5CC,KAAK;AACT;AAEA,OAAO,MAAMC,cAAcL,QAA4B,CAACM,QAAQC;IAC5D,MAAMC,QAAQP,SAAS,eAAeE,cAAcG;IACpD,MAAM,EAACF,GAAG,EAAEK,SAAS,EAAEC,UAAU,EAAEC,MAAM,EAAEC,KAAK,EAAEC,QAAQ,EAAEC,IAAI,EAAE,GAAGC,QAAO,GAAGP;IAC/E,MAAMQ,MAAMd;IAEZ,qBACI,KAACH;QACGQ,KAAKA;QACLH,KAAKA;QACJ,GAAGY,IAAIC,SAAS,CAAC,SAAS;YAACR;YAAWG;YAAOF;YAAYC;YAAQH;QAAK,EAAE;QACxE,GAAGO,MAAM;kBAETF;;AAGb,GAAG;AAEHR,YAAYa,WAAW,GAAG"}
@@ -0,0 +1,16 @@
1
+ import type { TableState } from './use-table.js';
2
+ type ColumnVisibility = TableState['columnVisibility'];
3
+ /**
4
+ * Hook that persists column visibility preferences to localStorage.
5
+ *
6
+ * @param defaultVisibleColumns - The default visibility map. Its keys define the set of valid column IDs.
7
+ * Must be a stable reference (e.g. via `useRef`) to avoid re-reading localStorage on every render.
8
+ * @param maxSelectableColumns - Maximum number of columns that can be visible at the same time.
9
+ * @param tableId - Unique identifier for the table. When omitted, no persistence occurs.
10
+ */
11
+ export declare const usePersistedColumnVisibility: (defaultVisibleColumns: ColumnVisibility, maxSelectableColumns: number, tableId?: string) => {
12
+ initialColumnVisibility: Record<string, boolean>;
13
+ persistColumnVisibility: (visibility: ColumnVisibility) => void;
14
+ };
15
+ export {};
16
+ //# sourceMappingURL=use-persisted-column-visibility.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-persisted-column-visibility.d.ts","sourceRoot":"","sources":["../../../../src/components/Table/use-persisted-column-visibility.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,gBAAgB,CAAC;AAE/C,KAAK,gBAAgB,GAAG,UAAU,CAAC,kBAAkB,CAAC,CAAC;AAgCvD;;;;;;;GAOG;AACH,eAAO,MAAM,4BAA4B,GACrC,uBAAuB,gBAAgB,EACvC,sBAAsB,MAAM,EAC5B,UAAU,MAAM;;0CAqBC,gBAAgB;CAUpC,CAAC"}
@@ -0,0 +1,85 @@
1
+ import { useCallback, useMemo } from 'react';
2
+ import { getStorageItem, setStorageItem } from '../../utils/local-storage.js';
3
+ const storagePath = (tableId)=>[
4
+ 'table',
5
+ tableId,
6
+ 'columnVisibility'
7
+ ];
8
+ const capVisibleColumns = (visibility, max)=>{
9
+ let visibleCount = 0;
10
+ const result = {};
11
+ for (const [key, isVisible] of Object.entries(visibility)){
12
+ const shouldShow = isVisible && visibleCount < max;
13
+ result[key] = shouldShow;
14
+ if (shouldShow) {
15
+ visibleCount++;
16
+ }
17
+ }
18
+ return result;
19
+ };
20
+ const sanitizeFromStorage = (raw, validColumnIds)=>{
21
+ const result = {};
22
+ if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {
23
+ return result;
24
+ }
25
+ for (const [key, value] of Object.entries(raw)){
26
+ if (validColumnIds.has(key) && typeof value === 'boolean') {
27
+ result[key] = value;
28
+ }
29
+ }
30
+ return result;
31
+ };
32
+ /**
33
+ * Hook that persists column visibility preferences to localStorage.
34
+ *
35
+ * @param defaultVisibleColumns - The default visibility map. Its keys define the set of valid column IDs.
36
+ * Must be a stable reference (e.g. via `useRef`) to avoid re-reading localStorage on every render.
37
+ * @param maxSelectableColumns - Maximum number of columns that can be visible at the same time.
38
+ * @param tableId - Unique identifier for the table. When omitted, no persistence occurs.
39
+ */ export const usePersistedColumnVisibility = (defaultVisibleColumns, maxSelectableColumns, tableId)=>{
40
+ const path = tableId ? storagePath(tableId) : null;
41
+ const validIds = useMemo(()=>new Set(Object.keys(defaultVisibleColumns)), [
42
+ defaultVisibleColumns
43
+ ]);
44
+ const hasValidIds = validIds.size > 0;
45
+ const initialColumnVisibility = useMemo(()=>{
46
+ if (!path || !hasValidIds) {
47
+ return defaultVisibleColumns;
48
+ }
49
+ const stored = getStorageItem([
50
+ ...path
51
+ ]);
52
+ if (stored !== null) {
53
+ const sanitized = sanitizeFromStorage(stored, validIds);
54
+ if (Object.keys(sanitized).length > 0) {
55
+ return capVisibleColumns({
56
+ ...defaultVisibleColumns,
57
+ ...sanitized
58
+ }, maxSelectableColumns);
59
+ }
60
+ }
61
+ return capVisibleColumns(defaultVisibleColumns, maxSelectableColumns);
62
+ }, [
63
+ path,
64
+ validIds,
65
+ defaultVisibleColumns,
66
+ maxSelectableColumns
67
+ ]);
68
+ const persistColumnVisibility = useCallback((visibility)=>{
69
+ if (!path || !hasValidIds) {
70
+ return;
71
+ }
72
+ setStorageItem([
73
+ ...path
74
+ ], visibility);
75
+ }, [
76
+ path,
77
+ hasValidIds
78
+ ]);
79
+ return {
80
+ initialColumnVisibility,
81
+ persistColumnVisibility
82
+ };
83
+ };
84
+
85
+ //# sourceMappingURL=use-persisted-column-visibility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/Table/use-persisted-column-visibility.ts"],"sourcesContent":["import {useCallback, useMemo} from 'react';\nimport {getStorageItem, setStorageItem} from '../../utils/local-storage.js';\nimport type {TableState} from './use-table.js';\n\ntype ColumnVisibility = TableState['columnVisibility'];\n\nconst storagePath = (tableId: string) => ['table', tableId, 'columnVisibility'] as const;\n\nconst capVisibleColumns = (visibility: ColumnVisibility, max: number): ColumnVisibility => {\n let visibleCount = 0;\n const result: ColumnVisibility = {};\n for (const [key, isVisible] of Object.entries(visibility)) {\n const shouldShow = isVisible && visibleCount < max;\n result[key] = shouldShow;\n if (shouldShow) {\n visibleCount++;\n }\n }\n return result;\n};\n\nconst sanitizeFromStorage = (raw: unknown, validColumnIds: Set<string>): ColumnVisibility => {\n const result: ColumnVisibility = {};\n\n if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {\n return result;\n }\n\n for (const [key, value] of Object.entries(raw as Record<string, unknown>)) {\n if (validColumnIds.has(key) && typeof value === 'boolean') {\n result[key] = value;\n }\n }\n return result;\n};\n\n/**\n * Hook that persists column visibility preferences to localStorage.\n *\n * @param defaultVisibleColumns - The default visibility map. Its keys define the set of valid column IDs.\n * Must be a stable reference (e.g. via `useRef`) to avoid re-reading localStorage on every render.\n * @param maxSelectableColumns - Maximum number of columns that can be visible at the same time.\n * @param tableId - Unique identifier for the table. When omitted, no persistence occurs.\n */\nexport const usePersistedColumnVisibility = (\n defaultVisibleColumns: ColumnVisibility,\n maxSelectableColumns: number,\n tableId?: string,\n) => {\n const path = tableId ? storagePath(tableId) : null;\n const validIds = useMemo(() => new Set(Object.keys(defaultVisibleColumns)), [defaultVisibleColumns]);\n const hasValidIds = validIds.size > 0;\n\n const initialColumnVisibility = useMemo((): ColumnVisibility => {\n if (!path || !hasValidIds) {\n return defaultVisibleColumns;\n }\n const stored = getStorageItem<unknown>([...path]);\n if (stored !== null) {\n const sanitized = sanitizeFromStorage(stored, validIds);\n if (Object.keys(sanitized).length > 0) {\n return capVisibleColumns({...defaultVisibleColumns, ...sanitized}, maxSelectableColumns);\n }\n }\n return capVisibleColumns(defaultVisibleColumns, maxSelectableColumns);\n }, [path, validIds, defaultVisibleColumns, maxSelectableColumns]);\n\n const persistColumnVisibility = useCallback(\n (visibility: ColumnVisibility) => {\n if (!path || !hasValidIds) {\n return;\n }\n setStorageItem([...path], visibility);\n },\n [path, hasValidIds],\n );\n\n return {initialColumnVisibility, persistColumnVisibility};\n};\n"],"names":["useCallback","useMemo","getStorageItem","setStorageItem","storagePath","tableId","capVisibleColumns","visibility","max","visibleCount","result","key","isVisible","Object","entries","shouldShow","sanitizeFromStorage","raw","validColumnIds","Array","isArray","value","has","usePersistedColumnVisibility","defaultVisibleColumns","maxSelectableColumns","path","validIds","Set","keys","hasValidIds","size","initialColumnVisibility","stored","sanitized","length","persistColumnVisibility"],"mappings":"AAAA,SAAQA,WAAW,EAAEC,OAAO,QAAO,QAAQ;AAC3C,SAAQC,cAAc,EAAEC,cAAc,QAAO,+BAA+B;AAK5E,MAAMC,cAAc,CAACC,UAAoB;QAAC;QAASA;QAAS;KAAmB;AAE/E,MAAMC,oBAAoB,CAACC,YAA8BC;IACrD,IAAIC,eAAe;IACnB,MAAMC,SAA2B,CAAC;IAClC,KAAK,MAAM,CAACC,KAAKC,UAAU,IAAIC,OAAOC,OAAO,CAACP,YAAa;QACvD,MAAMQ,aAAaH,aAAaH,eAAeD;QAC/CE,MAAM,CAACC,IAAI,GAAGI;QACd,IAAIA,YAAY;YACZN;QACJ;IACJ;IACA,OAAOC;AACX;AAEA,MAAMM,sBAAsB,CAACC,KAAcC;IACvC,MAAMR,SAA2B,CAAC;IAElC,IAAI,OAAOO,QAAQ,YAAYA,QAAQ,QAAQE,MAAMC,OAAO,CAACH,MAAM;QAC/D,OAAOP;IACX;IAEA,KAAK,MAAM,CAACC,KAAKU,MAAM,IAAIR,OAAOC,OAAO,CAACG,KAAiC;QACvE,IAAIC,eAAeI,GAAG,CAACX,QAAQ,OAAOU,UAAU,WAAW;YACvDX,MAAM,CAACC,IAAI,GAAGU;QAClB;IACJ;IACA,OAAOX;AACX;AAEA;;;;;;;CAOC,GACD,OAAO,MAAMa,+BAA+B,CACxCC,uBACAC,sBACApB;IAEA,MAAMqB,OAAOrB,UAAUD,YAAYC,WAAW;IAC9C,MAAMsB,WAAW1B,QAAQ,IAAM,IAAI2B,IAAIf,OAAOgB,IAAI,CAACL,yBAAyB;QAACA;KAAsB;IACnG,MAAMM,cAAcH,SAASI,IAAI,GAAG;IAEpC,MAAMC,0BAA0B/B,QAAQ;QACpC,IAAI,CAACyB,QAAQ,CAACI,aAAa;YACvB,OAAON;QACX;QACA,MAAMS,SAAS/B,eAAwB;eAAIwB;SAAK;QAChD,IAAIO,WAAW,MAAM;YACjB,MAAMC,YAAYlB,oBAAoBiB,QAAQN;YAC9C,IAAId,OAAOgB,IAAI,CAACK,WAAWC,MAAM,GAAG,GAAG;gBACnC,OAAO7B,kBAAkB;oBAAC,GAAGkB,qBAAqB;oBAAE,GAAGU,SAAS;gBAAA,GAAGT;YACvE;QACJ;QACA,OAAOnB,kBAAkBkB,uBAAuBC;IACpD,GAAG;QAACC;QAAMC;QAAUH;QAAuBC;KAAqB;IAEhE,MAAMW,0BAA0BpC,YAC5B,CAACO;QACG,IAAI,CAACmB,QAAQ,CAACI,aAAa;YACvB;QACJ;QACA3B,eAAe;eAAIuB;SAAK,EAAEnB;IAC9B,GACA;QAACmB;QAAMI;KAAY;IAGvB,OAAO;QAACE;QAAyBI;IAAuB;AAC5D,EAAE"}
@@ -182,6 +182,18 @@ export interface UseTableOptions<TData = unknown> {
182
182
  * @default false
183
183
  */
184
184
  syncWithUrl?: boolean;
185
+ /**
186
+ * Unique identifier for the table. When provided, column visibility preferences are persisted to localStorage.
187
+ */
188
+ tableId?: string;
189
+ /**
190
+ * Maximum number of columns that can be visible when restoring persisted visibility from localStorage.
191
+ * This only affects the initial column visibility resolved on mount when `tableId` is set.
192
+ * It does not enforce a runtime limit on `setColumnVisibility` — use `TableColumnsSelector` for UI enforcement.
193
+ *
194
+ * @default Infinity
195
+ */
196
+ maxSelectableColumns?: number;
185
197
  }
186
198
  export declare const useTable: <TData>(userOptions?: UseTableOptions<TData>) => TableStore<TData>;
187
199
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"use-table.d.ts","sourceRoot":"","sources":["../../../../src/components/Table/use-table.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"use-table.d.ts","sourceRoot":"","sources":["../../../../src/components/Table/use-table.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import { useDidUpdate } from '@mantine/hooks';
2
2
  import defaultsDeep from 'lodash.defaultsdeep';
3
3
  import { useCallback, useMemo, useState } from 'react';
4
4
  import { useUrlSyncedState } from '../../hooks/use-url-synced-state.js';
5
+ import { usePersistedColumnVisibility } from './use-persisted-column-visibility.js';
5
6
  const defaultOptions = {
6
7
  enableRowSelection: true,
7
8
  enableMultiRowSelection: false,
@@ -135,7 +136,7 @@ const COLUMN_VISIBILITY_SERIALIZATION = serialization({
135
136
  });
136
137
  export const useTable = (userOptions = {})=>{
137
138
  const options = defaultsDeep({}, userOptions, defaultOptions);
138
- const initialState = defaultsDeep({}, options.initialState, defaultState);
139
+ const [initialState] = useState(()=>defaultsDeep({}, userOptions.initialState, defaultState));
139
140
  /**
140
141
  * The `useUrlSyncedState` hook defaults to synchronize, but the table wants to default to not synchronize,
141
142
  * so always pass the sync option as a resolved boolean value.
@@ -171,11 +172,22 @@ export const useTable = (userOptions = {})=>{
171
172
  initialState: initialState.dateRange,
172
173
  sync
173
174
  });
174
- const [columnVisibility, setColumnVisibility] = useUrlSyncedState({
175
+ const { initialColumnVisibility, persistColumnVisibility } = usePersistedColumnVisibility(initialState.columnVisibility, options.maxSelectableColumns ?? Infinity, options.tableId);
176
+ const [columnVisibility, _setColumnVisibility] = useUrlSyncedState({
175
177
  ...COLUMN_VISIBILITY_SERIALIZATION,
176
- initialState: initialState.columnVisibility,
178
+ initialState: initialColumnVisibility,
177
179
  sync
178
180
  });
181
+ const setColumnVisibility = useCallback((updater)=>{
182
+ _setColumnVisibility((old)=>{
183
+ const newVis = updater instanceof Function ? updater(old) : updater;
184
+ persistColumnVisibility(newVis);
185
+ return newVis;
186
+ });
187
+ }, [
188
+ _setColumnVisibility,
189
+ persistColumnVisibility
190
+ ]);
179
191
  // unsynced
180
192
  const [totalEntries, _setTotalEntries] = useState(initialState.totalEntries);
181
193
  const [unfilteredTotalEntries, setUnfilteredTotalEntries] = useState(initialState.totalEntries);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/Table/use-table.ts"],"sourcesContent":["import type {DatesRangeValue, DateStringValue} from '@mantine/dates';\nimport {useDidUpdate} from '@mantine/hooks';\nimport {type ExpandedState, type PaginationState, type SortingState} from '@tanstack/table-core';\nimport defaultsDeep from 'lodash.defaultsdeep';\nimport {Dispatch, SetStateAction, useCallback, useMemo, useState} from 'react';\nimport {useUrlSyncedState, UseUrlSyncedStateOptions} from '../../hooks/use-url-synced-state.js';\n\n// Create a deeply optional version of another type\ntype DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\nexport interface TableState<TData = unknown> {\n /**\n * Current pagination state\n *\n * @default { pageIndex: 0, pageSize: 50 }\n */\n pagination: PaginationState;\n /**\n * Total number of entries in the table.\n * This number is used to calculate the number of pages in the pagination.\n * When null, the number of pages is calculated using the current data length.\n *\n * @default null\n */\n totalEntries: number | null;\n /**\n * Current sorting state\n *\n * @default []\n */\n sorting: SortingState;\n /**\n * Current global filter value\n *\n * @default ''\n */\n globalFilter: string;\n\n /**\n * Current expanded state\n *\n * @default {}\n */\n expanded: ExpandedState;\n /**\n * Predicates and their current value\n *\n * @default {}\n */\n predicates: Record<string, string>;\n /**\n * Layout currently selected. When null, the first layout is used.\n *\n * @default null\n */\n layout: string | null;\n /**\n * Currently selected date range\n *\n * @default [null, null]\n */\n dateRange: DatesRangeValue<DateStringValue | null>;\n /**\n * Currently selected rows\n *\n * @default {}\n */\n rowSelection: Record<string, TData>;\n /**\n * Columns that are currently visible\n *\n * @default {}\n */\n columnVisibility: Record<string, boolean>;\n}\n\nexport interface TableStore<TData = unknown> {\n /**\n * Current state of the table.\n */\n state: TableState<TData>;\n /**\n * Allows to change the pagination state.\n */\n setPagination: Dispatch<SetStateAction<TableState<TData>['pagination']>>;\n /**\n * Allows to change the total number of entries.\n */\n setTotalEntries: Dispatch<SetStateAction<TableState<TData>['totalEntries']>>;\n /**\n * Allows to change the sorting state.\n */\n setSorting: Dispatch<SetStateAction<TableState<TData>['sorting']>>;\n /**\n * Allows to change the global filter value.\n */\n setGlobalFilter: Dispatch<SetStateAction<TableState<TData>['globalFilter']>>;\n /**\n * Allows to change the rows expanded state.\n */\n setExpanded: Dispatch<SetStateAction<TableState<TData>['expanded']>>;\n /**\n * Allows to change the predicates values.\n */\n setPredicates: Dispatch<SetStateAction<TableState<TData>['predicates']>>;\n /**\n * Allows to change the selected layout.\n */\n setLayout: Dispatch<SetStateAction<TableState<TData>['layout']>>;\n /**\n * Allows to change the selected date range.\n */\n setDateRange: Dispatch<SetStateAction<TableState<TData>['dateRange']>>;\n /**\n * Allows to change the current row selection.\n */\n setRowSelection: Dispatch<SetStateAction<TableState<TData>['rowSelection']>>;\n /**\n * Allows to change the visible columns.\n */\n setColumnVisibility: Dispatch<SetStateAction<TableState<TData>['columnVisibility']>>;\n /**\n * Whether the table is currently filtered.\n */\n isFiltered: boolean;\n /**\n * Whether the table has data when unfiltered.\n *\n * This is derived from the totalEntries so make sure you set that number correctly, even if you're using a client side table.\n */\n isVacant: boolean;\n /**\n * Clear currently applied filters.\n */\n clearFilters: () => void;\n /**\n * Deselects all currently selected rows.\n */\n clearRowSelection: () => void;\n /**\n * Get currently selected rows.\n */\n getSelectedRows: () => TData[];\n /**\n * Get currently selected row\n */\n getSelectedRow: () => TData | null;\n /**\n * Whether the user can select multiple rows at the same time.\n */\n multiRowSelectionEnabled: boolean;\n /**\n * Whether rows can be selected.\n */\n rowSelectionEnabled: boolean;\n /**\n * Whether row selection is forced.\n */\n rowSelectionForced: boolean;\n}\n\nexport interface UseTableOptions<TData = unknown> {\n /**\n * Initial state of the table.\n */\n initialState?: DeepPartial<TableState<TData>>;\n /**\n * Whether rows can be selected.\n *\n * @default true\n */\n enableRowSelection?: boolean;\n /**\n * Whether multiple rows can be selected at the same time.\n *\n * @default false\n */\n enableMultiRowSelection?: boolean;\n /**\n * Forces the user to always have one row selected.\n * When activating that setting, a good practice is to have a row already selected in the initial state.\n *\n * @default false\n */\n forceSelection?: boolean;\n /**\n * Whether to sync the table state with the URL.\n *\n * @default false\n */\n syncWithUrl?: boolean;\n}\n\nconst defaultOptions: UseTableOptions = {\n enableRowSelection: true,\n enableMultiRowSelection: false,\n forceSelection: false,\n syncWithUrl: false,\n};\n\nconst defaultState: Partial<TableState> = {\n pagination: {\n pageIndex: 0,\n pageSize: 50,\n },\n totalEntries: null,\n sorting: [],\n globalFilter: '',\n predicates: {},\n layout: null,\n dateRange: [null, null],\n rowSelection: {},\n columnVisibility: {},\n};\n\nconst serialization = <K extends keyof TableState>(\n input: Pick<UseUrlSyncedStateOptions<TableState[K]>, 'serializer' | 'deserializer'>,\n) => Object.freeze(input);\n\nconst PAGINATION_SERIALIZATION = serialization<'pagination'>({\n serializer: ({pageIndex, pageSize}) => [\n ['page', (pageIndex + 1).toString()],\n ['pageSize', pageSize.toString()],\n ],\n deserializer: (params, initialState) =>\n defaultsDeep(\n {\n pageIndex: params.get('page') ? Math.max(1, parseInt(params.get('page'), 10)) - 1 : undefined,\n pageSize: params.get('pageSize') ? parseInt(params.get('pageSize'), 10) : undefined,\n },\n initialState,\n ),\n});\n\nconst SORTING_SERIALIZATION = serialization<'sorting'>({\n serializer: (sorting) => [['sortBy', sorting.map(({id, desc}) => `${id}.${desc ? 'desc' : 'asc'}`).join(',')]],\n deserializer: (params, initialState) => {\n if (!params.has('sortBy')) {\n return initialState;\n }\n const sorts = params.get('sortBy')?.split(',') ?? [];\n return sorts.map((sort) => {\n const [id, order] = sort.split('.');\n return {id, desc: order === 'desc'};\n });\n },\n});\n\nconst GLOBAL_FILTER_SERIALIZATION = serialization<'globalFilter'>({\n serializer: (filter) => [['filter', filter]],\n deserializer: (params, initialState) => params.get('filter') ?? initialState,\n});\n\nconst PREDICATES_SERIALIZATION = serialization<'predicates'>({\n serializer: (predicates) => Object.entries(predicates),\n deserializer: (params, initialState) =>\n Object.keys(initialState).reduce(\n (acc, predicateKey) => {\n acc[predicateKey] = params.get(predicateKey) ?? initialState[predicateKey];\n return acc;\n },\n {} as TableState['predicates'],\n ),\n});\n\nconst LAYOUT_SERIALIZATION = serialization<'layout'>({\n serializer: (_layout) => [['layout', _layout]],\n deserializer: (params, initialState) => params.get('layout') ?? initialState,\n});\n\nconst DATE_RANGE_SERIALIZATION = serialization<'dateRange'>({\n serializer: ([from, to]) => [\n ['from', from ? new Date(from).toISOString() : '', true],\n ['to', to ? new Date(to).toISOString() : '', true],\n ],\n deserializer: (params, initial) => [\n params.get('from') ? params.get('from') : initial[0],\n params.get('to') ? params.get('to') : initial[1],\n ],\n});\n\nconst COLUMN_VISIBILITY_SERIALIZATION = serialization<'columnVisibility'>({\n serializer: (columns) => [\n [\n 'show',\n Object.entries(columns)\n .filter(([, visible]) => visible === true)\n .map(([columnName]) => columnName)\n .join(','),\n ],\n [\n 'hide',\n Object.entries(columns)\n .filter(([, visible]) => visible === false)\n .map(([columnName]) => columnName)\n .join(','),\n ],\n ],\n deserializer: (params, initial) => {\n if (!params.has('show') && !params.has('hide')) {\n return initial;\n }\n const visible = params.get('show')?.split(',') ?? [];\n const invisible = params.get('hide')?.split(',') ?? [];\n const columns = {} as TableState['columnVisibility'];\n visible.forEach((column) => {\n columns[column] = true;\n });\n invisible.forEach((column) => {\n columns[column] = false;\n });\n return columns;\n },\n});\n\nexport const useTable = <TData>(userOptions: UseTableOptions<TData> = {}): TableStore<TData> => {\n const options = defaultsDeep({}, userOptions, defaultOptions) as UseTableOptions<TData>;\n const initialState = defaultsDeep({}, options.initialState, defaultState) as TableState<TData>;\n /**\n * The `useUrlSyncedState` hook defaults to synchronize, but the table wants to default to not synchronize,\n * so always pass the sync option as a resolved boolean value.\n */\n const sync = !!options.syncWithUrl;\n\n // (Optionally) synced with url\n const [pagination, setPagination] = useUrlSyncedState<TableState<TData>['pagination']>({\n ...PAGINATION_SERIALIZATION,\n initialState: initialState.pagination,\n sync,\n });\n const [sorting, setSorting] = useUrlSyncedState<TableState<TData>['sorting']>({\n ...SORTING_SERIALIZATION,\n initialState: initialState.sorting,\n sync,\n });\n const [globalFilter, setGlobalFilter] = useUrlSyncedState<TableState<TData>['globalFilter']>({\n ...GLOBAL_FILTER_SERIALIZATION,\n initialState: initialState.globalFilter,\n sync,\n });\n const [predicates, setPredicates] = useUrlSyncedState<TableState<TData>['predicates']>({\n ...PREDICATES_SERIALIZATION,\n initialState: initialState.predicates,\n sync,\n });\n const [layout, setLayout] = useUrlSyncedState<TableState<TData>['layout']>({\n ...LAYOUT_SERIALIZATION,\n initialState: initialState.layout,\n sync,\n });\n const [dateRange, setDateRange] = useUrlSyncedState<TableState<TData>['dateRange']>({\n ...DATE_RANGE_SERIALIZATION,\n initialState: initialState.dateRange,\n sync,\n });\n const [columnVisibility, setColumnVisibility] = useUrlSyncedState<TableState<TData>['columnVisibility']>({\n ...COLUMN_VISIBILITY_SERIALIZATION,\n initialState: initialState.columnVisibility,\n sync,\n });\n\n // unsynced\n const [totalEntries, _setTotalEntries] = useState<TableState<TData>['totalEntries']>(initialState.totalEntries);\n const [unfilteredTotalEntries, setUnfilteredTotalEntries] = useState<TableState<TData>['totalEntries']>(\n initialState.totalEntries,\n );\n const [expanded, setExpanded] = useState<TableState<TData>['expanded']>(initialState.expanded);\n const [rowSelection, setRowSelection] = useState<TableState<TData>['rowSelection']>(initialState.rowSelection);\n\n const isFiltered =\n !!globalFilter ||\n Object.keys(predicates).some((predicate) => !!predicates[predicate]) ||\n !!dateRange?.[0] ||\n !!dateRange?.[1];\n\n const isVacant = unfilteredTotalEntries === 0;\n\n const setTotalEntries: typeof _setTotalEntries = useCallback(\n (updater) => {\n _setTotalEntries((old) => {\n const newTotalEntries = updater instanceof Function ? updater(old) : updater;\n if (!isFiltered) {\n setUnfilteredTotalEntries(newTotalEntries);\n }\n return newTotalEntries;\n });\n },\n [isFiltered],\n );\n\n const clearFilters = useCallback(() => {\n setPredicates(initialState.predicates);\n setGlobalFilter('');\n }, []);\n\n const clearRowSelection = useCallback(() => {\n setRowSelection({});\n }, []);\n\n const getSelectedRows = useCallback(() => Object.values(rowSelection), [rowSelection]);\n\n const getSelectedRow = () => getSelectedRows()[0] ?? null;\n\n useDidUpdate(() => {\n if (!options.enableMultiRowSelection) {\n clearRowSelection();\n }\n }, [globalFilter, pagination, sorting, dateRange, predicates]);\n\n const state = useMemo(\n () => ({\n pagination,\n totalEntries,\n sorting,\n globalFilter,\n expanded,\n predicates,\n layout,\n dateRange,\n rowSelection,\n columnVisibility,\n }),\n [\n pagination,\n totalEntries,\n sorting,\n globalFilter,\n expanded,\n predicates,\n layout,\n dateRange,\n rowSelection,\n columnVisibility,\n ],\n );\n\n return {\n state,\n setPagination,\n setTotalEntries,\n setSorting,\n setGlobalFilter,\n setExpanded,\n setPredicates,\n setLayout,\n setDateRange,\n setRowSelection,\n setColumnVisibility,\n isFiltered,\n isVacant,\n clearFilters,\n clearRowSelection,\n getSelectedRows,\n getSelectedRow,\n rowSelectionEnabled: options.enableRowSelection,\n rowSelectionForced: options.forceSelection,\n multiRowSelectionEnabled: options.enableMultiRowSelection,\n };\n};\n"],"names":["useDidUpdate","defaultsDeep","useCallback","useMemo","useState","useUrlSyncedState","defaultOptions","enableRowSelection","enableMultiRowSelection","forceSelection","syncWithUrl","defaultState","pagination","pageIndex","pageSize","totalEntries","sorting","globalFilter","predicates","layout","dateRange","rowSelection","columnVisibility","serialization","input","Object","freeze","PAGINATION_SERIALIZATION","serializer","toString","deserializer","params","initialState","get","Math","max","parseInt","undefined","SORTING_SERIALIZATION","map","id","desc","join","has","sorts","split","sort","order","GLOBAL_FILTER_SERIALIZATION","filter","PREDICATES_SERIALIZATION","entries","keys","reduce","acc","predicateKey","LAYOUT_SERIALIZATION","_layout","DATE_RANGE_SERIALIZATION","from","to","Date","toISOString","initial","COLUMN_VISIBILITY_SERIALIZATION","columns","visible","columnName","invisible","forEach","column","useTable","userOptions","options","sync","setPagination","setSorting","setGlobalFilter","setPredicates","setLayout","setDateRange","setColumnVisibility","_setTotalEntries","unfilteredTotalEntries","setUnfilteredTotalEntries","expanded","setExpanded","setRowSelection","isFiltered","some","predicate","isVacant","setTotalEntries","updater","old","newTotalEntries","Function","clearFilters","clearRowSelection","getSelectedRows","values","getSelectedRow","state","rowSelectionEnabled","rowSelectionForced","multiRowSelectionEnabled"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/components/Table/use-table.ts"],"sourcesContent":["import type {DatesRangeValue, DateStringValue} from '@mantine/dates';\nimport {useDidUpdate} from '@mantine/hooks';\nimport {type ExpandedState, type PaginationState, type SortingState} from '@tanstack/table-core';\nimport defaultsDeep from 'lodash.defaultsdeep';\nimport {Dispatch, SetStateAction, useCallback, useMemo, useState} from 'react';\nimport {useUrlSyncedState, UseUrlSyncedStateOptions} from '../../hooks/use-url-synced-state.js';\nimport {usePersistedColumnVisibility} from './use-persisted-column-visibility.js';\n\n// Create a deeply optional version of another type\ntype DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\nexport interface TableState<TData = unknown> {\n /**\n * Current pagination state\n *\n * @default { pageIndex: 0, pageSize: 50 }\n */\n pagination: PaginationState;\n /**\n * Total number of entries in the table.\n * This number is used to calculate the number of pages in the pagination.\n * When null, the number of pages is calculated using the current data length.\n *\n * @default null\n */\n totalEntries: number | null;\n /**\n * Current sorting state\n *\n * @default []\n */\n sorting: SortingState;\n /**\n * Current global filter value\n *\n * @default ''\n */\n globalFilter: string;\n\n /**\n * Current expanded state\n *\n * @default {}\n */\n expanded: ExpandedState;\n /**\n * Predicates and their current value\n *\n * @default {}\n */\n predicates: Record<string, string>;\n /**\n * Layout currently selected. When null, the first layout is used.\n *\n * @default null\n */\n layout: string | null;\n /**\n * Currently selected date range\n *\n * @default [null, null]\n */\n dateRange: DatesRangeValue<DateStringValue | null>;\n /**\n * Currently selected rows\n *\n * @default {}\n */\n rowSelection: Record<string, TData>;\n /**\n * Columns that are currently visible\n *\n * @default {}\n */\n columnVisibility: Record<string, boolean>;\n}\n\nexport interface TableStore<TData = unknown> {\n /**\n * Current state of the table.\n */\n state: TableState<TData>;\n /**\n * Allows to change the pagination state.\n */\n setPagination: Dispatch<SetStateAction<TableState<TData>['pagination']>>;\n /**\n * Allows to change the total number of entries.\n */\n setTotalEntries: Dispatch<SetStateAction<TableState<TData>['totalEntries']>>;\n /**\n * Allows to change the sorting state.\n */\n setSorting: Dispatch<SetStateAction<TableState<TData>['sorting']>>;\n /**\n * Allows to change the global filter value.\n */\n setGlobalFilter: Dispatch<SetStateAction<TableState<TData>['globalFilter']>>;\n /**\n * Allows to change the rows expanded state.\n */\n setExpanded: Dispatch<SetStateAction<TableState<TData>['expanded']>>;\n /**\n * Allows to change the predicates values.\n */\n setPredicates: Dispatch<SetStateAction<TableState<TData>['predicates']>>;\n /**\n * Allows to change the selected layout.\n */\n setLayout: Dispatch<SetStateAction<TableState<TData>['layout']>>;\n /**\n * Allows to change the selected date range.\n */\n setDateRange: Dispatch<SetStateAction<TableState<TData>['dateRange']>>;\n /**\n * Allows to change the current row selection.\n */\n setRowSelection: Dispatch<SetStateAction<TableState<TData>['rowSelection']>>;\n /**\n * Allows to change the visible columns.\n */\n setColumnVisibility: Dispatch<SetStateAction<TableState<TData>['columnVisibility']>>;\n /**\n * Whether the table is currently filtered.\n */\n isFiltered: boolean;\n /**\n * Whether the table has data when unfiltered.\n *\n * This is derived from the totalEntries so make sure you set that number correctly, even if you're using a client side table.\n */\n isVacant: boolean;\n /**\n * Clear currently applied filters.\n */\n clearFilters: () => void;\n /**\n * Deselects all currently selected rows.\n */\n clearRowSelection: () => void;\n /**\n * Get currently selected rows.\n */\n getSelectedRows: () => TData[];\n /**\n * Get currently selected row\n */\n getSelectedRow: () => TData | null;\n /**\n * Whether the user can select multiple rows at the same time.\n */\n multiRowSelectionEnabled: boolean;\n /**\n * Whether rows can be selected.\n */\n rowSelectionEnabled: boolean;\n /**\n * Whether row selection is forced.\n */\n rowSelectionForced: boolean;\n}\n\nexport interface UseTableOptions<TData = unknown> {\n /**\n * Initial state of the table.\n */\n initialState?: DeepPartial<TableState<TData>>;\n /**\n * Whether rows can be selected.\n *\n * @default true\n */\n enableRowSelection?: boolean;\n /**\n * Whether multiple rows can be selected at the same time.\n *\n * @default false\n */\n enableMultiRowSelection?: boolean;\n /**\n * Forces the user to always have one row selected.\n * When activating that setting, a good practice is to have a row already selected in the initial state.\n *\n * @default false\n */\n forceSelection?: boolean;\n /**\n * Whether to sync the table state with the URL.\n *\n * @default false\n */\n syncWithUrl?: boolean;\n /**\n * Unique identifier for the table. When provided, column visibility preferences are persisted to localStorage.\n */\n tableId?: string;\n /**\n * Maximum number of columns that can be visible when restoring persisted visibility from localStorage.\n * This only affects the initial column visibility resolved on mount when `tableId` is set.\n * It does not enforce a runtime limit on `setColumnVisibility` — use `TableColumnsSelector` for UI enforcement.\n *\n * @default Infinity\n */\n maxSelectableColumns?: number;\n}\n\nconst defaultOptions: UseTableOptions = {\n enableRowSelection: true,\n enableMultiRowSelection: false,\n forceSelection: false,\n syncWithUrl: false,\n};\n\nconst defaultState: Partial<TableState> = {\n pagination: {\n pageIndex: 0,\n pageSize: 50,\n },\n totalEntries: null,\n sorting: [],\n globalFilter: '',\n predicates: {},\n layout: null,\n dateRange: [null, null],\n rowSelection: {},\n columnVisibility: {},\n};\n\nconst serialization = <K extends keyof TableState>(\n input: Pick<UseUrlSyncedStateOptions<TableState[K]>, 'serializer' | 'deserializer'>,\n) => Object.freeze(input);\n\nconst PAGINATION_SERIALIZATION = serialization<'pagination'>({\n serializer: ({pageIndex, pageSize}) => [\n ['page', (pageIndex + 1).toString()],\n ['pageSize', pageSize.toString()],\n ],\n deserializer: (params, initialState) =>\n defaultsDeep(\n {\n pageIndex: params.get('page') ? Math.max(1, parseInt(params.get('page'), 10)) - 1 : undefined,\n pageSize: params.get('pageSize') ? parseInt(params.get('pageSize'), 10) : undefined,\n },\n initialState,\n ),\n});\n\nconst SORTING_SERIALIZATION = serialization<'sorting'>({\n serializer: (sorting) => [['sortBy', sorting.map(({id, desc}) => `${id}.${desc ? 'desc' : 'asc'}`).join(',')]],\n deserializer: (params, initialState) => {\n if (!params.has('sortBy')) {\n return initialState;\n }\n const sorts = params.get('sortBy')?.split(',') ?? [];\n return sorts.map((sort) => {\n const [id, order] = sort.split('.');\n return {id, desc: order === 'desc'};\n });\n },\n});\n\nconst GLOBAL_FILTER_SERIALIZATION = serialization<'globalFilter'>({\n serializer: (filter) => [['filter', filter]],\n deserializer: (params, initialState) => params.get('filter') ?? initialState,\n});\n\nconst PREDICATES_SERIALIZATION = serialization<'predicates'>({\n serializer: (predicates) => Object.entries(predicates),\n deserializer: (params, initialState) =>\n Object.keys(initialState).reduce(\n (acc, predicateKey) => {\n acc[predicateKey] = params.get(predicateKey) ?? initialState[predicateKey];\n return acc;\n },\n {} as TableState['predicates'],\n ),\n});\n\nconst LAYOUT_SERIALIZATION = serialization<'layout'>({\n serializer: (_layout) => [['layout', _layout]],\n deserializer: (params, initialState) => params.get('layout') ?? initialState,\n});\n\nconst DATE_RANGE_SERIALIZATION = serialization<'dateRange'>({\n serializer: ([from, to]) => [\n ['from', from ? new Date(from).toISOString() : '', true],\n ['to', to ? new Date(to).toISOString() : '', true],\n ],\n deserializer: (params, initial) => [\n params.get('from') ? params.get('from') : initial[0],\n params.get('to') ? params.get('to') : initial[1],\n ],\n});\n\nconst COLUMN_VISIBILITY_SERIALIZATION = serialization<'columnVisibility'>({\n serializer: (columns) => [\n [\n 'show',\n Object.entries(columns)\n .filter(([, visible]) => visible === true)\n .map(([columnName]) => columnName)\n .join(','),\n ],\n [\n 'hide',\n Object.entries(columns)\n .filter(([, visible]) => visible === false)\n .map(([columnName]) => columnName)\n .join(','),\n ],\n ],\n deserializer: (params, initial) => {\n if (!params.has('show') && !params.has('hide')) {\n return initial;\n }\n const visible = params.get('show')?.split(',') ?? [];\n const invisible = params.get('hide')?.split(',') ?? [];\n const columns = {} as TableState['columnVisibility'];\n visible.forEach((column) => {\n columns[column] = true;\n });\n invisible.forEach((column) => {\n columns[column] = false;\n });\n return columns;\n },\n});\n\nexport const useTable = <TData>(userOptions: UseTableOptions<TData> = {}): TableStore<TData> => {\n const options = defaultsDeep({}, userOptions, defaultOptions) as UseTableOptions<TData>;\n const [initialState] = useState(\n () => defaultsDeep({}, userOptions.initialState, defaultState) as TableState<TData>,\n );\n /**\n * The `useUrlSyncedState` hook defaults to synchronize, but the table wants to default to not synchronize,\n * so always pass the sync option as a resolved boolean value.\n */\n const sync = !!options.syncWithUrl;\n\n // (Optionally) synced with url\n const [pagination, setPagination] = useUrlSyncedState<TableState<TData>['pagination']>({\n ...PAGINATION_SERIALIZATION,\n initialState: initialState.pagination,\n sync,\n });\n const [sorting, setSorting] = useUrlSyncedState<TableState<TData>['sorting']>({\n ...SORTING_SERIALIZATION,\n initialState: initialState.sorting,\n sync,\n });\n const [globalFilter, setGlobalFilter] = useUrlSyncedState<TableState<TData>['globalFilter']>({\n ...GLOBAL_FILTER_SERIALIZATION,\n initialState: initialState.globalFilter,\n sync,\n });\n const [predicates, setPredicates] = useUrlSyncedState<TableState<TData>['predicates']>({\n ...PREDICATES_SERIALIZATION,\n initialState: initialState.predicates,\n sync,\n });\n const [layout, setLayout] = useUrlSyncedState<TableState<TData>['layout']>({\n ...LAYOUT_SERIALIZATION,\n initialState: initialState.layout,\n sync,\n });\n const [dateRange, setDateRange] = useUrlSyncedState<TableState<TData>['dateRange']>({\n ...DATE_RANGE_SERIALIZATION,\n initialState: initialState.dateRange,\n sync,\n });\n\n const {initialColumnVisibility, persistColumnVisibility} = usePersistedColumnVisibility(\n initialState.columnVisibility,\n options.maxSelectableColumns ?? Infinity,\n options.tableId,\n );\n\n const [columnVisibility, _setColumnVisibility] = useUrlSyncedState<TableState<TData>['columnVisibility']>({\n ...COLUMN_VISIBILITY_SERIALIZATION,\n initialState: initialColumnVisibility,\n sync,\n });\n\n const setColumnVisibility: typeof _setColumnVisibility = useCallback(\n (updater) => {\n _setColumnVisibility((old) => {\n const newVis = updater instanceof Function ? updater(old) : updater;\n persistColumnVisibility(newVis);\n return newVis;\n });\n },\n [_setColumnVisibility, persistColumnVisibility],\n );\n\n // unsynced\n const [totalEntries, _setTotalEntries] = useState<TableState<TData>['totalEntries']>(initialState.totalEntries);\n const [unfilteredTotalEntries, setUnfilteredTotalEntries] = useState<TableState<TData>['totalEntries']>(\n initialState.totalEntries,\n );\n const [expanded, setExpanded] = useState<TableState<TData>['expanded']>(initialState.expanded);\n const [rowSelection, setRowSelection] = useState<TableState<TData>['rowSelection']>(initialState.rowSelection);\n\n const isFiltered =\n !!globalFilter ||\n Object.keys(predicates).some((predicate) => !!predicates[predicate]) ||\n !!dateRange?.[0] ||\n !!dateRange?.[1];\n\n const isVacant = unfilteredTotalEntries === 0;\n\n const setTotalEntries: typeof _setTotalEntries = useCallback(\n (updater) => {\n _setTotalEntries((old) => {\n const newTotalEntries = updater instanceof Function ? updater(old) : updater;\n if (!isFiltered) {\n setUnfilteredTotalEntries(newTotalEntries);\n }\n return newTotalEntries;\n });\n },\n [isFiltered],\n );\n\n const clearFilters = useCallback(() => {\n setPredicates(initialState.predicates);\n setGlobalFilter('');\n }, []);\n\n const clearRowSelection = useCallback(() => {\n setRowSelection({});\n }, []);\n\n const getSelectedRows = useCallback(() => Object.values(rowSelection), [rowSelection]);\n\n const getSelectedRow = () => getSelectedRows()[0] ?? null;\n\n useDidUpdate(() => {\n if (!options.enableMultiRowSelection) {\n clearRowSelection();\n }\n }, [globalFilter, pagination, sorting, dateRange, predicates]);\n\n const state = useMemo(\n () => ({\n pagination,\n totalEntries,\n sorting,\n globalFilter,\n expanded,\n predicates,\n layout,\n dateRange,\n rowSelection,\n columnVisibility,\n }),\n [\n pagination,\n totalEntries,\n sorting,\n globalFilter,\n expanded,\n predicates,\n layout,\n dateRange,\n rowSelection,\n columnVisibility,\n ],\n );\n\n return {\n state,\n setPagination,\n setTotalEntries,\n setSorting,\n setGlobalFilter,\n setExpanded,\n setPredicates,\n setLayout,\n setDateRange,\n setRowSelection,\n setColumnVisibility,\n isFiltered,\n isVacant,\n clearFilters,\n clearRowSelection,\n getSelectedRows,\n getSelectedRow,\n rowSelectionEnabled: options.enableRowSelection,\n rowSelectionForced: options.forceSelection,\n multiRowSelectionEnabled: options.enableMultiRowSelection,\n };\n};\n"],"names":["useDidUpdate","defaultsDeep","useCallback","useMemo","useState","useUrlSyncedState","usePersistedColumnVisibility","defaultOptions","enableRowSelection","enableMultiRowSelection","forceSelection","syncWithUrl","defaultState","pagination","pageIndex","pageSize","totalEntries","sorting","globalFilter","predicates","layout","dateRange","rowSelection","columnVisibility","serialization","input","Object","freeze","PAGINATION_SERIALIZATION","serializer","toString","deserializer","params","initialState","get","Math","max","parseInt","undefined","SORTING_SERIALIZATION","map","id","desc","join","has","sorts","split","sort","order","GLOBAL_FILTER_SERIALIZATION","filter","PREDICATES_SERIALIZATION","entries","keys","reduce","acc","predicateKey","LAYOUT_SERIALIZATION","_layout","DATE_RANGE_SERIALIZATION","from","to","Date","toISOString","initial","COLUMN_VISIBILITY_SERIALIZATION","columns","visible","columnName","invisible","forEach","column","useTable","userOptions","options","sync","setPagination","setSorting","setGlobalFilter","setPredicates","setLayout","setDateRange","initialColumnVisibility","persistColumnVisibility","maxSelectableColumns","Infinity","tableId","_setColumnVisibility","setColumnVisibility","updater","old","newVis","Function","_setTotalEntries","unfilteredTotalEntries","setUnfilteredTotalEntries","expanded","setExpanded","setRowSelection","isFiltered","some","predicate","isVacant","setTotalEntries","newTotalEntries","clearFilters","clearRowSelection","getSelectedRows","values","getSelectedRow","state","rowSelectionEnabled","rowSelectionForced","multiRowSelectionEnabled"],"mappings":"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"}
@@ -2,13 +2,25 @@
2
2
  font-weight: var(--coveo-fw-bold);
3
3
  }
4
4
 
5
+ .label {
6
+ color: var(--mantine-color-text);
7
+ }
8
+
9
+ .wrapper {
10
+ gap: var(--mantine-spacing-sm);
11
+ }
12
+
5
13
  .icon {
6
- margin-inline-end: var(--mantine-spacing-sm);
14
+ margin-inline-end: 0;
15
+ margin-top: 0;
16
+ width: var(--mantine-spacing-md);
17
+ height: var(--mantine-spacing-md);
18
+ }
19
+
20
+ .body {
21
+ gap: var(--mantine-spacing-xxs);
7
22
  }
8
23
 
9
24
  .closeButton {
10
- & svg {
11
- width: 20px;
12
- height: 20px;
13
- }
25
+ color: var(--mantine-color-text);
14
26
  }
@@ -12,13 +12,13 @@
12
12
  }
13
13
 
14
14
  .content {
15
- overflow-y: initial;
16
15
  display: flex;
17
16
  flex-direction: column;
17
+ overflow: hidden;
18
18
  }
19
19
 
20
20
  .body {
21
- overflow-y: scroll;
21
+ overflow-y: auto;
22
22
  border-end-start-radius: var(--modal-radius, var(--mantine-radius-default));
23
23
  border-end-end-radius: var(--modal-radius, var(--mantine-radius-default));
24
24
  }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Versioned localStorage utility for Plasma.
3
+ *
4
+ * All Plasma data is stored under a single `"plasma"` key with the shape:
5
+ * ```json
6
+ * {
7
+ * "storage-version": 1,
8
+ * "storage": {
9
+ * "table": {
10
+ * "my-table": { "columnVisibility": { ... } }
11
+ * }
12
+ * }
13
+ * }
14
+ * ```
15
+ */
16
+ export declare const STORAGE_KEY = "plasma";
17
+ export declare const CURRENT_STORAGE_VERSION = 1;
18
+ /**
19
+ * Read a value from the versioned Plasma storage at the given path.
20
+ *
21
+ * @param path - Path segments within `storage`, e.g. `['table', 'my-table', 'columnVisibility']`.
22
+ * @returns The stored value, or `null` if it doesn't exist or the storage is corrupted.
23
+ */
24
+ export declare const getStorageItem: <T = unknown>(path: string[]) => T | null;
25
+ /**
26
+ * Write a value to the versioned Plasma storage at the given path.
27
+ *
28
+ * @param path - Path segments within `storage`, e.g. `['table', 'my-table', 'columnVisibility']`.
29
+ * @param value - The value to store (must be JSON-serializable).
30
+ */
31
+ export declare const setStorageItem: <T = unknown>(path: string[], value: T) => void;
32
+ /**
33
+ * Remove a value from the versioned Plasma storage at the given path.
34
+ *
35
+ * @param path - Path segments within `storage`, e.g. `['table', 'my-table', 'columnVisibility']`.
36
+ */
37
+ export declare const removeStorageItem: (path: string[]) => void;
38
+ //# sourceMappingURL=local-storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-storage.d.ts","sourceRoot":"","sources":["../../../src/utils/local-storage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,eAAO,MAAM,WAAW,WAAW,CAAC;AACpC,eAAO,MAAM,uBAAuB,IAAI,CAAC;AA0EzC;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GAAI,CAAC,GAAG,OAAO,EAAE,MAAM,MAAM,EAAE,KAAG,CAAC,GAAG,IAUhE,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GAAI,CAAC,GAAG,OAAO,EAAE,MAAM,MAAM,EAAE,EAAE,OAAO,CAAC,KAAG,IAatE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,GAAI,MAAM,MAAM,EAAE,KAAG,IAelD,CAAC"}
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Versioned localStorage utility for Plasma.
3
+ *
4
+ * All Plasma data is stored under a single `"plasma"` key with the shape:
5
+ * ```json
6
+ * {
7
+ * "storage-version": 1,
8
+ * "storage": {
9
+ * "table": {
10
+ * "my-table": { "columnVisibility": { ... } }
11
+ * }
12
+ * }
13
+ * }
14
+ * ```
15
+ */ export const STORAGE_KEY = 'plasma';
16
+ export const CURRENT_STORAGE_VERSION = 1;
17
+ const createStorageObject = ()=>Object.create(null);
18
+ const isUnsafeKey = (key)=>key === '__proto__' || key === 'constructor' || key === 'prototype';
19
+ const isSafePath = (path)=>path.every((key)=>!isUnsafeKey(key));
20
+ const readStorage = ()=>{
21
+ try {
22
+ const raw = localStorage.getItem(STORAGE_KEY);
23
+ if (raw === null) {
24
+ return null;
25
+ }
26
+ const parsed = JSON.parse(raw);
27
+ if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
28
+ localStorage.removeItem(STORAGE_KEY);
29
+ return null;
30
+ }
31
+ return parsed;
32
+ } catch {
33
+ try {
34
+ localStorage.removeItem(STORAGE_KEY);
35
+ } catch {
36
+ console.warn(`Unable to clean up corrupted localStorage key "${STORAGE_KEY}".`);
37
+ }
38
+ return null;
39
+ }
40
+ };
41
+ const writeStorage = (data)=>{
42
+ try {
43
+ localStorage.setItem(STORAGE_KEY, JSON.stringify(data));
44
+ } catch {
45
+ console.warn(`Unable to write to localStorage key "${STORAGE_KEY}".`);
46
+ }
47
+ };
48
+ const getNestedValue = (obj, path)=>{
49
+ let current = obj;
50
+ for (const key of path){
51
+ if (typeof current !== 'object' || current === null) {
52
+ return undefined;
53
+ }
54
+ current = current[key];
55
+ }
56
+ return current;
57
+ };
58
+ const setNestedValue = (obj, path, value)=>{
59
+ let current = obj;
60
+ for(let i = 0; i < path.length - 1; i++){
61
+ const key = path[i];
62
+ if (isUnsafeKey(key)) {
63
+ return;
64
+ }
65
+ if (typeof current[key] !== 'object' || current[key] === null) {
66
+ current[key] = createStorageObject();
67
+ }
68
+ current = current[key];
69
+ }
70
+ const lastKey = path[path.length - 1];
71
+ if (!isUnsafeKey(lastKey)) {
72
+ current[lastKey] = value;
73
+ }
74
+ };
75
+ /**
76
+ * Read a value from the versioned Plasma storage at the given path.
77
+ *
78
+ * @param path - Path segments within `storage`, e.g. `['table', 'my-table', 'columnVisibility']`.
79
+ * @returns The stored value, or `null` if it doesn't exist or the storage is corrupted.
80
+ */ export const getStorageItem = (path)=>{
81
+ if (!isSafePath(path)) {
82
+ return null;
83
+ }
84
+ const data = readStorage();
85
+ if (!data || data['storage-version'] !== CURRENT_STORAGE_VERSION) {
86
+ return null;
87
+ }
88
+ const value = getNestedValue(data.storage ?? createStorageObject(), path);
89
+ return value !== undefined ? value : null;
90
+ };
91
+ /**
92
+ * Write a value to the versioned Plasma storage at the given path.
93
+ *
94
+ * @param path - Path segments within `storage`, e.g. `['table', 'my-table', 'columnVisibility']`.
95
+ * @param value - The value to store (must be JSON-serializable).
96
+ */ export const setStorageItem = (path, value)=>{
97
+ if (!isSafePath(path)) {
98
+ return;
99
+ }
100
+ let data = readStorage();
101
+ if (!data || data['storage-version'] !== CURRENT_STORAGE_VERSION) {
102
+ data = {
103
+ 'storage-version': CURRENT_STORAGE_VERSION,
104
+ storage: createStorageObject()
105
+ };
106
+ }
107
+ if (!data.storage) {
108
+ data.storage = createStorageObject();
109
+ }
110
+ setNestedValue(data.storage, path, value);
111
+ writeStorage(data);
112
+ };
113
+ /**
114
+ * Remove a value from the versioned Plasma storage at the given path.
115
+ *
116
+ * @param path - Path segments within `storage`, e.g. `['table', 'my-table', 'columnVisibility']`.
117
+ */ export const removeStorageItem = (path)=>{
118
+ if (!isSafePath(path)) {
119
+ return;
120
+ }
121
+ const data = readStorage();
122
+ if (!data || data['storage-version'] !== CURRENT_STORAGE_VERSION) {
123
+ return;
124
+ }
125
+ const parentPath = path.slice(0, -1);
126
+ const key = path[path.length - 1];
127
+ const parent = getNestedValue(data.storage ?? {}, parentPath);
128
+ if (typeof parent === 'object' && parent !== null) {
129
+ delete parent[key];
130
+ writeStorage(data);
131
+ }
132
+ };
133
+
134
+ //# sourceMappingURL=local-storage.js.map