mogh_ui 0.6.1 → 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.
Files changed (97) hide show
  1. package/dist/auth/index.cjs +10 -1
  2. package/dist/auth/index.cjs.map +1 -1
  3. package/dist/auth/index.d.cts +4 -3
  4. package/dist/auth/index.d.ts +4 -3
  5. package/dist/auth/index.js +9 -1
  6. package/dist/auth/index.js.map +1 -1
  7. package/dist/auth/login/header.d.cts +2 -2
  8. package/dist/auth/login/header.d.ts +2 -2
  9. package/dist/auth/login/index.cjs +24 -9
  10. package/dist/auth/login/index.cjs.map +1 -1
  11. package/dist/auth/login/index.d.cts +2 -2
  12. package/dist/auth/login/index.d.ts +2 -2
  13. package/dist/auth/login/index.js +32 -10
  14. package/dist/auth/login/index.js.map +1 -1
  15. package/dist/auth/profile/index.d.cts +1 -1
  16. package/dist/auth/profile/index.d.ts +1 -1
  17. package/dist/auth/profile/linked-logins.d.cts +2 -2
  18. package/dist/auth/profile/linked-logins.d.ts +2 -2
  19. package/dist/auth/profile/passkey.d.cts +2 -2
  20. package/dist/auth/profile/passkey.d.ts +2 -2
  21. package/dist/auth/profile/totp.d.cts +2 -2
  22. package/dist/auth/profile/totp.d.ts +2 -2
  23. package/dist/components/back-button.d.cts +2 -2
  24. package/dist/components/back-button.d.ts +2 -2
  25. package/dist/components/button-link.d.cts +2 -2
  26. package/dist/components/button-link.d.ts +2 -2
  27. package/dist/components/config/confirm.d.cts +2 -2
  28. package/dist/components/config/confirm.d.ts +2 -2
  29. package/dist/components/config/group.d.cts +1 -2
  30. package/dist/components/config/group.d.ts +1 -2
  31. package/dist/components/config/index.d.cts +3 -3
  32. package/dist/components/config/index.d.ts +3 -3
  33. package/dist/components/config/item.d.cts +3 -4
  34. package/dist/components/config/item.d.ts +3 -4
  35. package/dist/components/config/layout.d.cts +2 -2
  36. package/dist/components/config/layout.d.ts +2 -2
  37. package/dist/components/config/unsaved-changes.d.cts +2 -2
  38. package/dist/components/config/unsaved-changes.d.ts +2 -2
  39. package/dist/components/confirm-modal.d.cts +3 -3
  40. package/dist/components/confirm-modal.d.ts +3 -3
  41. package/dist/components/copy-button.d.cts +3 -3
  42. package/dist/components/copy-button.d.ts +3 -3
  43. package/dist/components/copy-text.d.cts +2 -2
  44. package/dist/components/copy-text.d.ts +2 -2
  45. package/dist/components/create-modal.d.cts +3 -3
  46. package/dist/components/create-modal.d.ts +3 -3
  47. package/dist/components/data-table.cjs +15 -0
  48. package/dist/components/data-table.cjs.map +1 -1
  49. package/dist/components/data-table.d.cts +10 -3
  50. package/dist/components/data-table.d.ts +10 -3
  51. package/dist/components/data-table.js +15 -0
  52. package/dist/components/data-table.js.map +1 -1
  53. package/dist/components/enable-switch.d.cts +2 -2
  54. package/dist/components/enable-switch.d.ts +2 -2
  55. package/dist/components/entity-header.d.cts +2 -2
  56. package/dist/components/entity-header.d.ts +2 -2
  57. package/dist/components/entity-page.d.cts +3 -3
  58. package/dist/components/entity-page.d.ts +3 -3
  59. package/dist/components/hover-error.d.cts +2 -2
  60. package/dist/components/hover-error.d.ts +2 -2
  61. package/dist/components/input-list.d.cts +2 -2
  62. package/dist/components/input-list.d.ts +2 -2
  63. package/dist/components/labelled-switch.d.cts +3 -3
  64. package/dist/components/labelled-switch.d.ts +3 -3
  65. package/dist/components/labels-group.d.cts +2 -2
  66. package/dist/components/labels-group.d.ts +2 -2
  67. package/dist/components/loading-screen.d.cts +2 -2
  68. package/dist/components/loading-screen.d.ts +2 -2
  69. package/dist/components/mobile-friendly-tabs.d.cts +5 -5
  70. package/dist/components/mobile-friendly-tabs.d.ts +5 -5
  71. package/dist/components/monaco/index.d.cts +3 -3
  72. package/dist/components/monaco/index.d.ts +3 -3
  73. package/dist/components/page-guard.d.cts +1 -2
  74. package/dist/components/page-guard.d.ts +1 -2
  75. package/dist/components/search-input.d.cts +2 -2
  76. package/dist/components/search-input.d.ts +2 -2
  77. package/dist/components/shared-text-update.d.cts +3 -3
  78. package/dist/components/shared-text-update.d.ts +3 -3
  79. package/dist/components/show-hide-button.d.cts +2 -2
  80. package/dist/components/show-hide-button.d.ts +2 -2
  81. package/dist/components/stat-bar.d.cts +3 -3
  82. package/dist/components/stat-bar.d.ts +3 -3
  83. package/dist/components/stat-cell.d.cts +3 -3
  84. package/dist/components/stat-cell.d.ts +3 -3
  85. package/dist/components/tabbed-page.d.cts +3 -3
  86. package/dist/components/tabbed-page.d.ts +3 -3
  87. package/dist/components/table-skeleton.d.cts +2 -2
  88. package/dist/components/table-skeleton.d.ts +2 -2
  89. package/dist/components/text-update-modal.d.cts +3 -3
  90. package/dist/components/text-update-modal.d.ts +3 -3
  91. package/dist/components/theme-toggle.d.cts +2 -2
  92. package/dist/components/theme-toggle.d.ts +2 -2
  93. package/dist/index.d.cts +1 -2
  94. package/dist/index.d.ts +1 -2
  95. package/dist/theme.d.cts +3 -3
  96. package/dist/theme.d.ts +3 -3
  97. package/package.json +26 -25
@@ -1,9 +1,9 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
1
+ import * as react from 'react';
2
2
  import { ButtonProps } from '@mantine/core';
3
3
 
4
4
  interface BackButtonProps extends ButtonProps {
5
5
  to?: string | number;
6
6
  }
7
- declare function BackButton({ to, ...props }: BackButtonProps): react_jsx_runtime.JSX.Element;
7
+ declare function BackButton({ to, ...props }: BackButtonProps): react.JSX.Element;
8
8
 
9
9
  export { BackButton, type BackButtonProps };
@@ -1,9 +1,9 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
1
+ import * as react from 'react';
2
2
  import { ButtonProps } from '@mantine/core';
3
3
 
4
4
  interface BackButtonProps extends ButtonProps {
5
5
  to?: string | number;
6
6
  }
7
- declare function BackButton({ to, ...props }: BackButtonProps): react_jsx_runtime.JSX.Element;
7
+ declare function BackButton({ to, ...props }: BackButtonProps): react.JSX.Element;
8
8
 
9
9
  export { BackButton, type BackButtonProps };
@@ -1,9 +1,9 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
1
+ import * as react from 'react';
2
2
  import { ButtonProps } from '@mantine/core';
3
3
 
4
4
  interface ButtonLinkProps extends ButtonProps {
5
5
  to: string;
6
6
  }
7
- declare function ButtonLink({ to, ...props }: ButtonLinkProps): react_jsx_runtime.JSX.Element;
7
+ declare function ButtonLink({ to, ...props }: ButtonLinkProps): react.JSX.Element;
8
8
 
9
9
  export { ButtonLink, type ButtonLinkProps };
@@ -1,9 +1,9 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
1
+ import * as react from 'react';
2
2
  import { ButtonProps } from '@mantine/core';
3
3
 
4
4
  interface ButtonLinkProps extends ButtonProps {
5
5
  to: string;
6
6
  }
7
- declare function ButtonLink({ to, ...props }: ButtonLinkProps): react_jsx_runtime.JSX.Element;
7
+ declare function ButtonLink({ to, ...props }: ButtonLinkProps): react.JSX.Element;
8
8
 
9
9
  export { ButtonLink, type ButtonLinkProps };
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
1
+ import * as react from 'react';
2
2
  import { MonacoLanguage } from '../monaco/index.cjs';
3
3
  import '@mantine/core';
4
4
 
@@ -15,6 +15,6 @@ interface ConfirmUpdateProps<T> {
15
15
  confirmKeyListener?: boolean;
16
16
  enableFancyToml?: boolean;
17
17
  }
18
- declare function ConfirmUpdate<T>({ original, update, onConfirm, loading, disabled, language, fileContentsLanguage, fullWidth, openKeyListener, confirmKeyListener, enableFancyToml, }: ConfirmUpdateProps<T>): react_jsx_runtime.JSX.Element;
18
+ declare function ConfirmUpdate<T>({ original, update, onConfirm, loading, disabled, language, fileContentsLanguage, fullWidth, openKeyListener, confirmKeyListener, enableFancyToml, }: ConfirmUpdateProps<T>): react.JSX.Element;
19
19
 
20
20
  export { ConfirmUpdate, type ConfirmUpdateProps };
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
1
+ import * as react from 'react';
2
2
  import { MonacoLanguage } from '../monaco/index.js';
3
3
  import '@mantine/core';
4
4
 
@@ -15,6 +15,6 @@ interface ConfirmUpdateProps<T> {
15
15
  confirmKeyListener?: boolean;
16
16
  enableFancyToml?: boolean;
17
17
  }
18
- declare function ConfirmUpdate<T>({ original, update, onConfirm, loading, disabled, language, fileContentsLanguage, fullWidth, openKeyListener, confirmKeyListener, enableFancyToml, }: ConfirmUpdateProps<T>): react_jsx_runtime.JSX.Element;
18
+ declare function ConfirmUpdate<T>({ original, update, onConfirm, loading, disabled, language, fileContentsLanguage, fullWidth, openKeyListener, confirmKeyListener, enableFancyToml, }: ConfirmUpdateProps<T>): react.JSX.Element;
19
19
 
20
20
  export { ConfirmUpdate, type ConfirmUpdateProps };
@@ -1,6 +1,5 @@
1
- import 'react/jsx-runtime';
2
- export { ConfigGroup } from './index.cjs';
3
1
  import 'react';
2
+ export { ConfigGroup } from './index.cjs';
4
3
  import '../monaco/index.cjs';
5
4
  import '@mantine/core';
6
5
  import './confirm.cjs';
@@ -1,6 +1,5 @@
1
- import 'react/jsx-runtime';
2
- export { ConfigGroup } from './index.js';
3
1
  import 'react';
2
+ export { ConfigGroup } from './index.js';
4
3
  import '../monaco/index.js';
5
4
  import '@mantine/core';
6
5
  import './confirm.js';
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
1
+ import * as react from 'react';
2
2
  import { SetStateAction, ReactNode } from 'react';
3
3
  import { MonacoLanguage } from '../monaco/index.cjs';
4
4
  export { ConfirmUpdate, ConfirmUpdateProps } from './confirm.cjs';
@@ -15,7 +15,7 @@ declare function ConfigGroup<T>({ config, update, setUpdate, disabled, fields, }
15
15
  setUpdate: (update: Partial<T>) => void;
16
16
  disabled: boolean;
17
17
  fields: ConfigGroupArgs<T>["fields"];
18
- }): react_jsx_runtime.JSX.Element;
18
+ }): react.JSX.Element;
19
19
 
20
20
  interface ConfigFieldArgs {
21
21
  label?: string;
@@ -57,6 +57,6 @@ interface ConfigProps<T> {
57
57
  // Section key
58
58
  ConfigGroupArgs<T>[] | false | undefined>;
59
59
  }
60
- declare function Config<T>({ original, update, setUpdate, disabled, onSave, titleOther, disableSidebar, fileContentsLanguage, enableFancyToml, groups: _groups, }: ConfigProps<T>): react_jsx_runtime.JSX.Element;
60
+ declare function Config<T>({ original, update, setUpdate, disabled, onSave, titleOther, disableSidebar, fileContentsLanguage, enableFancyToml, groups: _groups, }: ConfigProps<T>): react.JSX.Element;
61
61
 
62
62
  export { Config, type ConfigFieldArgs, ConfigGroup, type ConfigGroupArgs, type ConfigProps };
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
1
+ import * as react from 'react';
2
2
  import { SetStateAction, ReactNode } from 'react';
3
3
  import { MonacoLanguage } from '../monaco/index.js';
4
4
  export { ConfirmUpdate, ConfirmUpdateProps } from './confirm.js';
@@ -15,7 +15,7 @@ declare function ConfigGroup<T>({ config, update, setUpdate, disabled, fields, }
15
15
  setUpdate: (update: Partial<T>) => void;
16
16
  disabled: boolean;
17
17
  fields: ConfigGroupArgs<T>["fields"];
18
- }): react_jsx_runtime.JSX.Element;
18
+ }): react.JSX.Element;
19
19
 
20
20
  interface ConfigFieldArgs {
21
21
  label?: string;
@@ -57,6 +57,6 @@ interface ConfigProps<T> {
57
57
  // Section key
58
58
  ConfigGroupArgs<T>[] | false | undefined>;
59
59
  }
60
- declare function Config<T>({ original, update, setUpdate, disabled, onSave, titleOther, disableSidebar, fileContentsLanguage, enableFancyToml, groups: _groups, }: ConfigProps<T>): react_jsx_runtime.JSX.Element;
60
+ declare function Config<T>({ original, update, setUpdate, disabled, onSave, titleOther, disableSidebar, fileContentsLanguage, enableFancyToml, groups: _groups, }: ConfigProps<T>): react.JSX.Element;
61
61
 
62
62
  export { Config, type ConfigFieldArgs, ConfigGroup, type ConfigGroupArgs, type ConfigProps };
@@ -1,4 +1,3 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
2
1
  import * as react from 'react';
3
2
  import { ReactNode } from 'react';
4
3
  import * as _mantine_core from '@mantine/core';
@@ -30,16 +29,16 @@ declare function ConfigInput({ value, disabled, placeholder, onChange, onValueCh
30
29
  inputRight?: ReactNode;
31
30
  inputProps?: TextInputProps;
32
31
  email?: boolean;
33
- } & Omit<ConfigItemProps, "children">): react_jsx_runtime.JSX.Element;
32
+ } & Omit<ConfigItemProps, "children">): react.JSX.Element;
34
33
  declare function ConfigSwitch({ value, disabled, onCheckedChange, switchProps, ...itemProps }: {
35
34
  value: boolean | undefined;
36
35
  disabled: boolean;
37
36
  onCheckedChange: (value: boolean) => void;
38
37
  switchProps?: SwitchProps;
39
- } & Omit<ConfigItemProps, "children">): react_jsx_runtime.JSX.Element;
38
+ } & Omit<ConfigItemProps, "children">): react.JSX.Element;
40
39
  declare function ConfigList<T>({ addLabel, label, description, ...inputListProps }: {
41
40
  label?: string;
42
41
  addLabel?: string;
43
- } & InputListProps<T> & Omit<ConfigItemProps, "children">): react_jsx_runtime.JSX.Element;
42
+ } & InputListProps<T> & Omit<ConfigItemProps, "children">): react.JSX.Element;
44
43
 
45
44
  export { ConfigInput, ConfigItem, type ConfigItemProps, ConfigList, ConfigSwitch };
@@ -1,4 +1,3 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
2
1
  import * as react from 'react';
3
2
  import { ReactNode } from 'react';
4
3
  import * as _mantine_core from '@mantine/core';
@@ -30,16 +29,16 @@ declare function ConfigInput({ value, disabled, placeholder, onChange, onValueCh
30
29
  inputRight?: ReactNode;
31
30
  inputProps?: TextInputProps;
32
31
  email?: boolean;
33
- } & Omit<ConfigItemProps, "children">): react_jsx_runtime.JSX.Element;
32
+ } & Omit<ConfigItemProps, "children">): react.JSX.Element;
34
33
  declare function ConfigSwitch({ value, disabled, onCheckedChange, switchProps, ...itemProps }: {
35
34
  value: boolean | undefined;
36
35
  disabled: boolean;
37
36
  onCheckedChange: (value: boolean) => void;
38
37
  switchProps?: SwitchProps;
39
- } & Omit<ConfigItemProps, "children">): react_jsx_runtime.JSX.Element;
38
+ } & Omit<ConfigItemProps, "children">): react.JSX.Element;
40
39
  declare function ConfigList<T>({ addLabel, label, description, ...inputListProps }: {
41
40
  label?: string;
42
41
  addLabel?: string;
43
- } & InputListProps<T> & Omit<ConfigItemProps, "children">): react_jsx_runtime.JSX.Element;
42
+ } & InputListProps<T> & Omit<ConfigItemProps, "children">): react.JSX.Element;
44
43
 
45
44
  export { ConfigInput, ConfigItem, type ConfigItemProps, ConfigList, ConfigSwitch };
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
1
+ import * as react from 'react';
2
2
  import { ReactNode } from 'react';
3
3
  import { SectionProps } from '../section.cjs';
4
4
  import '@mantine/core';
@@ -6,6 +6,6 @@ import '@mantine/core';
6
6
  /** Includes save buttons */
7
7
  declare function ConfigLayout({ title, icon, titleOther, SaveOrReset, ...sectionProps }: {
8
8
  SaveOrReset: ReactNode | undefined;
9
- } & SectionProps): react_jsx_runtime.JSX.Element;
9
+ } & SectionProps): react.JSX.Element;
10
10
 
11
11
  export { ConfigLayout };
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
1
+ import * as react from 'react';
2
2
  import { ReactNode } from 'react';
3
3
  import { SectionProps } from '../section.js';
4
4
  import '@mantine/core';
@@ -6,6 +6,6 @@ import '@mantine/core';
6
6
  /** Includes save buttons */
7
7
  declare function ConfigLayout({ title, icon, titleOther, SaveOrReset, ...sectionProps }: {
8
8
  SaveOrReset: ReactNode | undefined;
9
- } & SectionProps): react_jsx_runtime.JSX.Element;
9
+ } & SectionProps): react.JSX.Element;
10
10
 
11
11
  export { ConfigLayout };
@@ -1,7 +1,7 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
1
+ import * as react from 'react';
2
2
 
3
3
  declare function UnsavedChanges({ fullWidth }: {
4
4
  fullWidth?: boolean;
5
- }): react_jsx_runtime.JSX.Element;
5
+ }): react.JSX.Element;
6
6
 
7
7
  export { UnsavedChanges };
@@ -1,7 +1,7 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
1
+ import * as react from 'react';
2
2
 
3
3
  declare function UnsavedChanges({ fullWidth }: {
4
4
  fullWidth?: boolean;
5
- }): react_jsx_runtime.JSX.Element;
5
+ }): react.JSX.Element;
6
6
 
7
7
  export { UnsavedChanges };
@@ -1,6 +1,6 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { ModalProps, ButtonProps } from '@mantine/core';
1
+ import * as react from 'react';
3
2
  import { ReactNode } from 'react';
3
+ import { ModalProps, ButtonProps } from '@mantine/core';
4
4
 
5
5
  interface ConfirmModalProps extends Omit<Omit<Omit<ModalProps, "opened">, "onClose">, "onClick"> {
6
6
  children?: ReactNode;
@@ -20,6 +20,6 @@ interface ConfirmModalProps extends Omit<Omit<Omit<ModalProps, "opened">, "onClo
20
20
  /** Converts into ConfirmButton */
21
21
  disableModal?: boolean;
22
22
  }
23
- declare function ConfirmModal({ children, icon, disabled, confirmText, title, confirmButtonContent, onConfirm, loading, additional, topAdditonal, targetProps, targetNoIcon, confirmProps, disableModal, ...modalProps }: ConfirmModalProps): react_jsx_runtime.JSX.Element;
23
+ declare function ConfirmModal({ children, icon, disabled, confirmText, title, confirmButtonContent, onConfirm, loading, additional, topAdditonal, targetProps, targetNoIcon, confirmProps, disableModal, ...modalProps }: ConfirmModalProps): react.JSX.Element;
24
24
 
25
25
  export { ConfirmModal, type ConfirmModalProps };
@@ -1,6 +1,6 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { ModalProps, ButtonProps } from '@mantine/core';
1
+ import * as react from 'react';
3
2
  import { ReactNode } from 'react';
3
+ import { ModalProps, ButtonProps } from '@mantine/core';
4
4
 
5
5
  interface ConfirmModalProps extends Omit<Omit<Omit<ModalProps, "opened">, "onClose">, "onClick"> {
6
6
  children?: ReactNode;
@@ -20,6 +20,6 @@ interface ConfirmModalProps extends Omit<Omit<Omit<ModalProps, "opened">, "onClo
20
20
  /** Converts into ConfirmButton */
21
21
  disableModal?: boolean;
22
22
  }
23
- declare function ConfirmModal({ children, icon, disabled, confirmText, title, confirmButtonContent, onConfirm, loading, additional, topAdditonal, targetProps, targetNoIcon, confirmProps, disableModal, ...modalProps }: ConfirmModalProps): react_jsx_runtime.JSX.Element;
23
+ declare function ConfirmModal({ children, icon, disabled, confirmText, title, confirmButtonContent, onConfirm, loading, additional, topAdditonal, targetProps, targetNoIcon, confirmProps, disableModal, ...modalProps }: ConfirmModalProps): react.JSX.Element;
24
24
 
25
25
  export { ConfirmModal, type ConfirmModalProps };
@@ -1,6 +1,6 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { ActionIconProps } from '@mantine/core';
1
+ import * as react from 'react';
3
2
  import { ReactNode } from 'react';
3
+ import { ActionIconProps } from '@mantine/core';
4
4
 
5
5
  interface CopyButtonProps {
6
6
  content: string;
@@ -9,7 +9,7 @@ interface CopyButtonProps {
9
9
  size?: string | number;
10
10
  buttonSize?: ActionIconProps["size"];
11
11
  }
12
- declare function CopyButton({ content, icon, label, size, buttonSize, }: CopyButtonProps): react_jsx_runtime.JSX.Element;
12
+ declare function CopyButton({ content, icon, label, size, buttonSize, }: CopyButtonProps): react.JSX.Element;
13
13
  declare function sendCopyNotification(label?: string): void;
14
14
 
15
15
  export { CopyButton, type CopyButtonProps, sendCopyNotification };
@@ -1,6 +1,6 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { ActionIconProps } from '@mantine/core';
1
+ import * as react from 'react';
3
2
  import { ReactNode } from 'react';
3
+ import { ActionIconProps } from '@mantine/core';
4
4
 
5
5
  interface CopyButtonProps {
6
6
  content: string;
@@ -9,7 +9,7 @@ interface CopyButtonProps {
9
9
  size?: string | number;
10
10
  buttonSize?: ActionIconProps["size"];
11
11
  }
12
- declare function CopyButton({ content, icon, label, size, buttonSize, }: CopyButtonProps): react_jsx_runtime.JSX.Element;
12
+ declare function CopyButton({ content, icon, label, size, buttonSize, }: CopyButtonProps): react.JSX.Element;
13
13
  declare function sendCopyNotification(label?: string): void;
14
14
 
15
15
  export { CopyButton, type CopyButtonProps, sendCopyNotification };
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
1
+ import * as react from 'react';
2
2
  import { TextProps, GroupProps } from '@mantine/core';
3
3
 
4
4
  interface CopyTextProps extends TextProps {
@@ -6,6 +6,6 @@ interface CopyTextProps extends TextProps {
6
6
  label?: string;
7
7
  groupProps?: GroupProps;
8
8
  }
9
- declare function CopyText({ content, label, groupProps, ...textProps }: CopyTextProps): react_jsx_runtime.JSX.Element;
9
+ declare function CopyText({ content, label, groupProps, ...textProps }: CopyTextProps): react.JSX.Element;
10
10
 
11
11
  export { CopyText, type CopyTextProps };
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
1
+ import * as react from 'react';
2
2
  import { TextProps, GroupProps } from '@mantine/core';
3
3
 
4
4
  interface CopyTextProps extends TextProps {
@@ -6,6 +6,6 @@ interface CopyTextProps extends TextProps {
6
6
  label?: string;
7
7
  groupProps?: GroupProps;
8
8
  }
9
- declare function CopyText({ content, label, groupProps, ...textProps }: CopyTextProps): react_jsx_runtime.JSX.Element;
9
+ declare function CopyText({ content, label, groupProps, ...textProps }: CopyTextProps): react.JSX.Element;
10
10
 
11
11
  export { CopyText, type CopyTextProps };
@@ -1,6 +1,6 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { ButtonProps, ModalBaseProps } from '@mantine/core';
1
+ import * as react from 'react';
3
2
  import { ReactNode } from 'react';
3
+ import { ButtonProps, ModalBaseProps } from '@mantine/core';
4
4
 
5
5
  interface CreateModalProps extends ButtonProps {
6
6
  entityType: string;
@@ -13,6 +13,6 @@ interface CreateModalProps extends ButtonProps {
13
13
  children?: ReactNode;
14
14
  modalSize?: ModalBaseProps["size"];
15
15
  }
16
- declare function CreateModal({ entityType, configSection, disabled, loading, onConfirm, onOpenChange, configureLabel, openShiftKeyListener, leftSection, children, modalSize, ...targetProps }: CreateModalProps): react_jsx_runtime.JSX.Element;
16
+ declare function CreateModal({ entityType, configSection, disabled, loading, onConfirm, onOpenChange, configureLabel, openShiftKeyListener, leftSection, children, modalSize, ...targetProps }: CreateModalProps): react.JSX.Element;
17
17
 
18
18
  export { CreateModal, type CreateModalProps };
@@ -1,6 +1,6 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { ButtonProps, ModalBaseProps } from '@mantine/core';
1
+ import * as react from 'react';
3
2
  import { ReactNode } from 'react';
3
+ import { ButtonProps, ModalBaseProps } from '@mantine/core';
4
4
 
5
5
  interface CreateModalProps extends ButtonProps {
6
6
  entityType: string;
@@ -13,6 +13,6 @@ interface CreateModalProps extends ButtonProps {
13
13
  children?: ReactNode;
14
14
  modalSize?: ModalBaseProps["size"];
15
15
  }
16
- declare function CreateModal({ entityType, configSection, disabled, loading, onConfirm, onOpenChange, configureLabel, openShiftKeyListener, leftSection, children, modalSize, ...targetProps }: CreateModalProps): react_jsx_runtime.JSX.Element;
16
+ declare function CreateModal({ entityType, configSection, disabled, loading, onConfirm, onOpenChange, configureLabel, openShiftKeyListener, leftSection, children, modalSize, ...targetProps }: CreateModalProps): react.JSX.Element;
17
17
 
18
18
  export { CreateModal, type CreateModalProps };
@@ -36,6 +36,8 @@ function DataTable({
36
36
  noResults = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_core.Text, { c: "dimmed", children: "No results" }),
37
37
  sortDescFirst = false,
38
38
  defaultSort = [],
39
+ manualSorting,
40
+ onSortingStateChange,
39
41
  selectOptions,
40
42
  caption,
41
43
  tableProps,
@@ -53,6 +55,7 @@ function DataTable({
53
55
  getCoreRowModel: (0, import_react_table.getCoreRowModel)(),
54
56
  onSortingChange: setSorting,
55
57
  getSortedRowModel: (0, import_react_table.getSortedRowModel)(),
58
+ manualSorting,
56
59
  state: {
57
60
  sorting,
58
61
  rowSelection
@@ -70,6 +73,9 @@ function DataTable({
70
73
  (0, import_react.useEffect)(() => {
71
74
  localStorage.setItem("data-table-" + tableKey, JSON.stringify(sorting));
72
75
  }, [tableKey, sorting]);
76
+ (0, import_react.useEffect)(() => {
77
+ onSortingStateChange?.(sorting);
78
+ }, [sorting]);
73
79
  (0, import_react.useEffect)(() => {
74
80
  selectOptions?.onSelect?.(Object.keys(rowSelection));
75
81
  }, [rowSelection]);
@@ -198,6 +204,15 @@ const SortableHeader = ({
198
204
  description,
199
205
  sortDescFirst
200
206
  }) => {
207
+ if (!column.getCanSort()) {
208
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_core.Group, { justify: "start", gap: "xs", wrap: "nowrap", miw: "120", w: "fit-content", children: [
209
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_core.Text, { fw: 600, size: "sm", lineClamp: 1, children: title }),
210
+ description && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_core.HoverCard, { offset: 10, children: [
211
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_core.HoverCard.Target, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Info, { size: "1rem" }) }),
212
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_core.HoverCard.Dropdown, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_core.Text, { children: description }) })
213
+ ] })
214
+ ] });
215
+ }
201
216
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
202
217
  import_core.UnstyledButton,
203
218
  {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/data-table.tsx"],"sourcesContent":["import {\n Dispatch,\n ReactNode,\n SetStateAction,\n useEffect,\n useState,\n} from \"react\";\nimport {\n Column,\n ColumnDef,\n flexRender,\n getCoreRowModel,\n getSortedRowModel,\n Row,\n RowSelectionState,\n SortingState,\n useReactTable,\n} from \"@tanstack/react-table\";\nimport {\n Box,\n BoxProps,\n Center,\n Checkbox,\n DefaultMantineColor,\n Group,\n HoverCard,\n Loader,\n Table,\n TableProps,\n Text,\n UnstyledButton,\n} from \"@mantine/core\";\nimport { ArrowDown, ArrowUp, Info, Minus } from \"lucide-react\";\n\nexport interface DataTableProps<TData, TValue = unknown> extends BoxProps {\n /** Unique key given to table so sorting can be remembered on local storage */\n tableKey: string;\n columns: (ColumnDef<TData, TValue> | false | undefined)[];\n data: TData[];\n loading?: boolean;\n onRowClick?: (row: TData) => void;\n noResults?: ReactNode;\n defaultSort?: SortingState;\n sortDescFirst?: boolean;\n selectOptions?: {\n selectKey: (row: TData) => string;\n onSelect?: (selected: string[]) => void;\n state?: [RowSelectionState, Dispatch<SetStateAction<RowSelectionState>>];\n disableRow?: boolean | ((row: Row<TData>) => boolean);\n color?: DefaultMantineColor;\n };\n caption?: string;\n tableProps?: TableProps;\n noBox?: boolean;\n noBorder?: boolean;\n}\n\nexport function DataTable<TData, TValue>({\n tableKey,\n columns,\n data,\n loading,\n onRowClick,\n noResults = <Text c=\"dimmed\">No results</Text>,\n sortDescFirst = false,\n defaultSort = [],\n selectOptions,\n caption,\n tableProps,\n noBox,\n noBorder,\n mah = \"max(150px, calc(100vh - 320px))\",\n ...boxProps\n}: DataTableProps<TData, TValue>) {\n const [sorting, setSorting] = useState<SortingState>(defaultSort);\n\n // intentionally not initialized to clear selected values on table mount\n // could add some prop for adding default selected state to preserve between mounts\n const _internalState = useState<RowSelectionState>({});\n const [rowSelection, setRowSelection] = selectOptions?.state\n ? selectOptions.state\n : _internalState;\n\n const table = useReactTable({\n data,\n columns: columns.filter((c) => c) as any,\n getCoreRowModel: getCoreRowModel(),\n onSortingChange: setSorting,\n getSortedRowModel: getSortedRowModel(),\n state: {\n sorting,\n rowSelection,\n },\n sortDescFirst,\n onRowSelectionChange: setRowSelection,\n getRowId: selectOptions?.selectKey,\n enableRowSelection: selectOptions?.disableRow,\n });\n\n useEffect(() => {\n const stored = localStorage.getItem(\"data-table-\" + tableKey);\n const sorting = stored ? (JSON.parse(stored) as SortingState) : null;\n if (sorting) setSorting(sorting);\n }, [tableKey]);\n\n useEffect(() => {\n localStorage.setItem(\"data-table-\" + tableKey, JSON.stringify(sorting));\n }, [tableKey, sorting]);\n\n useEffect(() => {\n selectOptions?.onSelect?.(Object.keys(rowSelection));\n }, [rowSelection]);\n\n const rows = table.getPrePaginationRowModel().rows;\n\n const tableNode = (\n <Table\n borderColor=\"accent-border\"\n captionSide=\"top\"\n stickyHeader\n {...tableProps}\n >\n {caption ? <Table.Caption>{caption}</Table.Caption> : null}\n\n <Table.Thead>\n {table.getHeaderGroups().map((hg, i) => (\n <Table.Tr key={hg.id}>\n {i === 0 && selectOptions && (\n <Table.Th\n onClick={() =>\n selectOptions.disableRow !== true &&\n table.toggleAllRowsSelected()\n }\n style={{\n cursor: \"pointer\",\n borderColor: \"var(--mantine-color-accent-border-0)\",\n borderWidth: 0,\n borderRightWidth: 1,\n borderStyle: \"solid\",\n }}\n >\n <Checkbox\n color={selectOptions.color ?? \"Neutral\"}\n disabled={selectOptions.disableRow === true}\n checked={table.getIsAllRowsSelected()}\n indeterminate={table.getIsSomeRowsSelected()}\n />\n </Table.Th>\n )}\n {hg.headers.map((header, i) => {\n // const canSort = header.column.getCanSort();\n // const sortState = header.column.getIsSorted();\n return (\n <Table.Th\n key={header.id}\n px=\"md\"\n style={{\n cursor: \"pointer\",\n borderColor: \"var(--mantine-color-accent-border-0)\",\n borderWidth: 0,\n borderRightWidth: i < hg.headers.length - 1 ? 1 : 0,\n borderStyle: \"solid\",\n }}\n >\n {header.isPlaceholder ? null : (\n <Text fw={600} size=\"sm\" lineClamp={1}>\n {flexRender(\n header.column.columnDef.header,\n header.getContext(),\n )}\n </Text>\n )}\n </Table.Th>\n );\n })}\n </Table.Tr>\n ))}\n </Table.Thead>\n\n <Table.Tbody>\n {loading ? (\n <Table.Tr>\n <Table.Td\n colSpan={\n table.getAllLeafColumns().length + (selectOptions ? 1 : 0)\n }\n >\n <Group justify=\"center\" py=\"lg\">\n <Loader size=\"sm\" />\n </Group>\n </Table.Td>\n </Table.Tr>\n ) : rows.length === 0 ? (\n <Table.Tr>\n <Table.Td\n colSpan={\n table.getAllLeafColumns().length + (selectOptions ? 1 : 0)\n }\n >\n <Group justify=\"center\" py=\"lg\">\n {noResults}\n </Group>\n </Table.Td>\n </Table.Tr>\n ) : (\n rows.map((row) => (\n <Table.Tr\n key={row.id}\n style={{\n cursor: onRowClick ? \"pointer\" : undefined,\n contentVisibility: \"auto\",\n containIntrinsicSize: \"auto 2em\",\n }}\n >\n {selectOptions && (\n <Table.Td onClick={() => row.toggleSelected()}>\n <Checkbox\n aria-label=\"Select row\"\n color={selectOptions.color ?? \"Neutral\"}\n disabled={!row.getCanSelect()}\n checked={row.getIsSelected()}\n />\n </Table.Td>\n )}\n {row.getVisibleCells().map((cell) => (\n <Table.Td\n key={cell.id}\n onClick={\n onRowClick ? () => onRowClick(row.original) : undefined\n }\n style={{ flexWrap: \"nowrap\", textWrap: \"nowrap\" }}\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </Table.Td>\n ))}\n </Table.Tr>\n ))\n )}\n </Table.Tbody>\n </Table>\n );\n\n if (noBox) {\n return tableNode;\n } else {\n return (\n <Box\n p={noBorder ? undefined : \"lg\"}\n pt=\"0\"\n className={noBorder ? undefined : \"bordered-light\"}\n bdrs=\"md\"\n w=\"100%\"\n mah={mah}\n style={{ overflow: \"auto\" }}\n {...boxProps}\n >\n {tableNode}\n </Box>\n );\n }\n}\n\nexport const SortableHeader = <T, V>({\n column,\n title,\n description,\n sortDescFirst,\n}: {\n column: Column<T, V>;\n title: string;\n description?: ReactNode;\n sortDescFirst?: boolean;\n}) => {\n return (\n <UnstyledButton\n onClick={column.getToggleSortingHandler()}\n style={{ width: \"100%\" }}\n >\n <Group justify=\"space-between\" gap=\"sm\" wrap=\"nowrap\">\n <Group justify=\"start\" gap=\"xs\" wrap=\"nowrap\" miw=\"120\" w=\"fit-content\">\n <Text fw={600} size=\"sm\" lineClamp={1}>\n {title}\n </Text>\n {description && (\n <HoverCard offset={10}>\n <HoverCard.Target>\n <Info size=\"1rem\" />\n </HoverCard.Target>\n <HoverCard.Dropdown>\n <Text>{description}</Text>\n </HoverCard.Dropdown>\n </HoverCard>\n )}\n </Group>\n <Center>\n <SortIcon\n state={column.getIsSorted()}\n sortDescFirst={sortDescFirst}\n />\n </Center>\n </Group>\n </UnstyledButton>\n );\n};\n\nfunction SortIcon({\n state,\n sortDescFirst,\n}: {\n state: false | \"asc\" | \"desc\";\n sortDescFirst?: boolean;\n}) {\n if (state === \"asc\")\n return sortDescFirst ? <ArrowDown size={14} /> : <ArrowUp size={14} />;\n if (state === \"desc\")\n return sortDescFirst ? <ArrowUp size={14} /> : <ArrowDown size={14} />;\n return <Minus size={14} />;\n}\n"],"mappings":"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","names":["sorting","i"]}
1
+ {"version":3,"sources":["../../src/components/data-table.tsx"],"sourcesContent":["import {\n Dispatch,\n ReactNode,\n SetStateAction,\n useEffect,\n useState,\n} from \"react\";\nimport {\n Column,\n ColumnDef,\n flexRender,\n getCoreRowModel,\n getSortedRowModel,\n Row,\n RowSelectionState,\n SortingState,\n useReactTable,\n} from \"@tanstack/react-table\";\nimport {\n Box,\n BoxProps,\n Center,\n Checkbox,\n DefaultMantineColor,\n Group,\n HoverCard,\n Loader,\n Table,\n TableProps,\n Text,\n UnstyledButton,\n} from \"@mantine/core\";\nimport { ArrowDown, ArrowUp, Info, Minus } from \"lucide-react\";\n\nexport interface DataTableProps<TData, TValue = unknown> extends BoxProps {\n /** Unique key given to table so sorting can be remembered on local storage */\n tableKey: string;\n columns: (ColumnDef<TData, TValue> | false | undefined)[];\n data: TData[];\n loading?: boolean;\n onRowClick?: (row: TData) => void;\n noResults?: ReactNode;\n defaultSort?: SortingState;\n sortDescFirst?: boolean;\n /** Sorting is handled externally (eg. server side).\n * The table still manages / persists the sorting state,\n * but does not apply it to the rows. */\n manualSorting?: boolean;\n /** Called with the sorting state whenever it changes,\n * including on load from local storage. */\n onSortingStateChange?: (sorting: SortingState) => void;\n selectOptions?: {\n selectKey: (row: TData) => string;\n onSelect?: (selected: string[]) => void;\n state?: [RowSelectionState, Dispatch<SetStateAction<RowSelectionState>>];\n disableRow?: boolean | ((row: Row<TData>) => boolean);\n color?: DefaultMantineColor;\n };\n caption?: string;\n tableProps?: TableProps;\n noBox?: boolean;\n noBorder?: boolean;\n}\n\nexport function DataTable<TData, TValue>({\n tableKey,\n columns,\n data,\n loading,\n onRowClick,\n noResults = <Text c=\"dimmed\">No results</Text>,\n sortDescFirst = false,\n defaultSort = [],\n manualSorting,\n onSortingStateChange,\n selectOptions,\n caption,\n tableProps,\n noBox,\n noBorder,\n mah = \"max(150px, calc(100vh - 320px))\",\n ...boxProps\n}: DataTableProps<TData, TValue>) {\n const [sorting, setSorting] = useState<SortingState>(defaultSort);\n\n // intentionally not initialized to clear selected values on table mount\n // could add some prop for adding default selected state to preserve between mounts\n const _internalState = useState<RowSelectionState>({});\n const [rowSelection, setRowSelection] = selectOptions?.state\n ? selectOptions.state\n : _internalState;\n\n const table = useReactTable({\n data,\n columns: columns.filter((c) => c) as any,\n getCoreRowModel: getCoreRowModel(),\n onSortingChange: setSorting,\n getSortedRowModel: getSortedRowModel(),\n manualSorting,\n state: {\n sorting,\n rowSelection,\n },\n sortDescFirst,\n onRowSelectionChange: setRowSelection,\n getRowId: selectOptions?.selectKey,\n enableRowSelection: selectOptions?.disableRow,\n });\n\n useEffect(() => {\n const stored = localStorage.getItem(\"data-table-\" + tableKey);\n const sorting = stored ? (JSON.parse(stored) as SortingState) : null;\n if (sorting) setSorting(sorting);\n }, [tableKey]);\n\n useEffect(() => {\n localStorage.setItem(\"data-table-\" + tableKey, JSON.stringify(sorting));\n }, [tableKey, sorting]);\n\n useEffect(() => {\n onSortingStateChange?.(sorting);\n }, [sorting]);\n\n useEffect(() => {\n selectOptions?.onSelect?.(Object.keys(rowSelection));\n }, [rowSelection]);\n\n const rows = table.getPrePaginationRowModel().rows;\n\n const tableNode = (\n <Table\n borderColor=\"accent-border\"\n captionSide=\"top\"\n stickyHeader\n {...tableProps}\n >\n {caption ? <Table.Caption>{caption}</Table.Caption> : null}\n\n <Table.Thead>\n {table.getHeaderGroups().map((hg, i) => (\n <Table.Tr key={hg.id}>\n {i === 0 && selectOptions && (\n <Table.Th\n onClick={() =>\n selectOptions.disableRow !== true &&\n table.toggleAllRowsSelected()\n }\n style={{\n cursor: \"pointer\",\n borderColor: \"var(--mantine-color-accent-border-0)\",\n borderWidth: 0,\n borderRightWidth: 1,\n borderStyle: \"solid\",\n }}\n >\n <Checkbox\n color={selectOptions.color ?? \"Neutral\"}\n disabled={selectOptions.disableRow === true}\n checked={table.getIsAllRowsSelected()}\n indeterminate={table.getIsSomeRowsSelected()}\n />\n </Table.Th>\n )}\n {hg.headers.map((header, i) => {\n // const canSort = header.column.getCanSort();\n // const sortState = header.column.getIsSorted();\n return (\n <Table.Th\n key={header.id}\n px=\"md\"\n style={{\n cursor: \"pointer\",\n borderColor: \"var(--mantine-color-accent-border-0)\",\n borderWidth: 0,\n borderRightWidth: i < hg.headers.length - 1 ? 1 : 0,\n borderStyle: \"solid\",\n }}\n >\n {header.isPlaceholder ? null : (\n <Text fw={600} size=\"sm\" lineClamp={1}>\n {flexRender(\n header.column.columnDef.header,\n header.getContext(),\n )}\n </Text>\n )}\n </Table.Th>\n );\n })}\n </Table.Tr>\n ))}\n </Table.Thead>\n\n <Table.Tbody>\n {loading ? (\n <Table.Tr>\n <Table.Td\n colSpan={\n table.getAllLeafColumns().length + (selectOptions ? 1 : 0)\n }\n >\n <Group justify=\"center\" py=\"lg\">\n <Loader size=\"sm\" />\n </Group>\n </Table.Td>\n </Table.Tr>\n ) : rows.length === 0 ? (\n <Table.Tr>\n <Table.Td\n colSpan={\n table.getAllLeafColumns().length + (selectOptions ? 1 : 0)\n }\n >\n <Group justify=\"center\" py=\"lg\">\n {noResults}\n </Group>\n </Table.Td>\n </Table.Tr>\n ) : (\n rows.map((row) => (\n <Table.Tr\n key={row.id}\n style={{\n cursor: onRowClick ? \"pointer\" : undefined,\n contentVisibility: \"auto\",\n containIntrinsicSize: \"auto 2em\",\n }}\n >\n {selectOptions && (\n <Table.Td onClick={() => row.toggleSelected()}>\n <Checkbox\n aria-label=\"Select row\"\n color={selectOptions.color ?? \"Neutral\"}\n disabled={!row.getCanSelect()}\n checked={row.getIsSelected()}\n />\n </Table.Td>\n )}\n {row.getVisibleCells().map((cell) => (\n <Table.Td\n key={cell.id}\n onClick={\n onRowClick ? () => onRowClick(row.original) : undefined\n }\n style={{ flexWrap: \"nowrap\", textWrap: \"nowrap\" }}\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </Table.Td>\n ))}\n </Table.Tr>\n ))\n )}\n </Table.Tbody>\n </Table>\n );\n\n if (noBox) {\n return tableNode;\n } else {\n return (\n <Box\n p={noBorder ? undefined : \"lg\"}\n pt=\"0\"\n className={noBorder ? undefined : \"bordered-light\"}\n bdrs=\"md\"\n w=\"100%\"\n mah={mah}\n style={{ overflow: \"auto\" }}\n {...boxProps}\n >\n {tableNode}\n </Box>\n );\n }\n}\n\nexport const SortableHeader = <T, V>({\n column,\n title,\n description,\n sortDescFirst,\n}: {\n column: Column<T, V>;\n title: string;\n description?: ReactNode;\n sortDescFirst?: boolean;\n}) => {\n if (!column.getCanSort()) {\n return (\n <Group justify=\"start\" gap=\"xs\" wrap=\"nowrap\" miw=\"120\" w=\"fit-content\">\n <Text fw={600} size=\"sm\" lineClamp={1}>\n {title}\n </Text>\n {description && (\n <HoverCard offset={10}>\n <HoverCard.Target>\n <Info size=\"1rem\" />\n </HoverCard.Target>\n <HoverCard.Dropdown>\n <Text>{description}</Text>\n </HoverCard.Dropdown>\n </HoverCard>\n )}\n </Group>\n );\n }\n return (\n <UnstyledButton\n onClick={column.getToggleSortingHandler()}\n style={{ width: \"100%\" }}\n >\n <Group justify=\"space-between\" gap=\"sm\" wrap=\"nowrap\">\n <Group justify=\"start\" gap=\"xs\" wrap=\"nowrap\" miw=\"120\" w=\"fit-content\">\n <Text fw={600} size=\"sm\" lineClamp={1}>\n {title}\n </Text>\n {description && (\n <HoverCard offset={10}>\n <HoverCard.Target>\n <Info size=\"1rem\" />\n </HoverCard.Target>\n <HoverCard.Dropdown>\n <Text>{description}</Text>\n </HoverCard.Dropdown>\n </HoverCard>\n )}\n </Group>\n <Center>\n <SortIcon\n state={column.getIsSorted()}\n sortDescFirst={sortDescFirst}\n />\n </Center>\n </Group>\n </UnstyledButton>\n );\n};\n\nfunction SortIcon({\n state,\n sortDescFirst,\n}: {\n state: false | \"asc\" | \"desc\";\n sortDescFirst?: boolean;\n}) {\n if (state === \"asc\")\n return sortDescFirst ? <ArrowDown size={14} /> : <ArrowUp size={14} />;\n if (state === \"desc\")\n return sortDescFirst ? <ArrowUp size={14} /> : <ArrowDown size={14} />;\n return <Minus size={14} />;\n}\n"],"mappings":"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","names":["sorting","i"]}
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
1
+ import * as react from 'react';
2
2
  import { ReactNode, Dispatch, SetStateAction } from 'react';
3
3
  import { ColumnDef, SortingState, RowSelectionState, Row, Column } from '@tanstack/react-table';
4
4
  import { BoxProps, DefaultMantineColor, TableProps } from '@mantine/core';
@@ -13,6 +13,13 @@ interface DataTableProps<TData, TValue = unknown> extends BoxProps {
13
13
  noResults?: ReactNode;
14
14
  defaultSort?: SortingState;
15
15
  sortDescFirst?: boolean;
16
+ /** Sorting is handled externally (eg. server side).
17
+ * The table still manages / persists the sorting state,
18
+ * but does not apply it to the rows. */
19
+ manualSorting?: boolean;
20
+ /** Called with the sorting state whenever it changes,
21
+ * including on load from local storage. */
22
+ onSortingStateChange?: (sorting: SortingState) => void;
16
23
  selectOptions?: {
17
24
  selectKey: (row: TData) => string;
18
25
  onSelect?: (selected: string[]) => void;
@@ -25,12 +32,12 @@ interface DataTableProps<TData, TValue = unknown> extends BoxProps {
25
32
  noBox?: boolean;
26
33
  noBorder?: boolean;
27
34
  }
28
- declare function DataTable<TData, TValue>({ tableKey, columns, data, loading, onRowClick, noResults, sortDescFirst, defaultSort, selectOptions, caption, tableProps, noBox, noBorder, mah, ...boxProps }: DataTableProps<TData, TValue>): react_jsx_runtime.JSX.Element;
35
+ declare function DataTable<TData, TValue>({ tableKey, columns, data, loading, onRowClick, noResults, sortDescFirst, defaultSort, manualSorting, onSortingStateChange, selectOptions, caption, tableProps, noBox, noBorder, mah, ...boxProps }: DataTableProps<TData, TValue>): react.JSX.Element;
29
36
  declare const SortableHeader: <T, V>({ column, title, description, sortDescFirst, }: {
30
37
  column: Column<T, V>;
31
38
  title: string;
32
39
  description?: ReactNode;
33
40
  sortDescFirst?: boolean;
34
- }) => react_jsx_runtime.JSX.Element;
41
+ }) => react.JSX.Element;
35
42
 
36
43
  export { DataTable, type DataTableProps, SortableHeader };
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
1
+ import * as react from 'react';
2
2
  import { ReactNode, Dispatch, SetStateAction } from 'react';
3
3
  import { ColumnDef, SortingState, RowSelectionState, Row, Column } from '@tanstack/react-table';
4
4
  import { BoxProps, DefaultMantineColor, TableProps } from '@mantine/core';
@@ -13,6 +13,13 @@ interface DataTableProps<TData, TValue = unknown> extends BoxProps {
13
13
  noResults?: ReactNode;
14
14
  defaultSort?: SortingState;
15
15
  sortDescFirst?: boolean;
16
+ /** Sorting is handled externally (eg. server side).
17
+ * The table still manages / persists the sorting state,
18
+ * but does not apply it to the rows. */
19
+ manualSorting?: boolean;
20
+ /** Called with the sorting state whenever it changes,
21
+ * including on load from local storage. */
22
+ onSortingStateChange?: (sorting: SortingState) => void;
16
23
  selectOptions?: {
17
24
  selectKey: (row: TData) => string;
18
25
  onSelect?: (selected: string[]) => void;
@@ -25,12 +32,12 @@ interface DataTableProps<TData, TValue = unknown> extends BoxProps {
25
32
  noBox?: boolean;
26
33
  noBorder?: boolean;
27
34
  }
28
- declare function DataTable<TData, TValue>({ tableKey, columns, data, loading, onRowClick, noResults, sortDescFirst, defaultSort, selectOptions, caption, tableProps, noBox, noBorder, mah, ...boxProps }: DataTableProps<TData, TValue>): react_jsx_runtime.JSX.Element;
35
+ declare function DataTable<TData, TValue>({ tableKey, columns, data, loading, onRowClick, noResults, sortDescFirst, defaultSort, manualSorting, onSortingStateChange, selectOptions, caption, tableProps, noBox, noBorder, mah, ...boxProps }: DataTableProps<TData, TValue>): react.JSX.Element;
29
36
  declare const SortableHeader: <T, V>({ column, title, description, sortDescFirst, }: {
30
37
  column: Column<T, V>;
31
38
  title: string;
32
39
  description?: ReactNode;
33
40
  sortDescFirst?: boolean;
34
- }) => react_jsx_runtime.JSX.Element;
41
+ }) => react.JSX.Element;
35
42
 
36
43
  export { DataTable, type DataTableProps, SortableHeader };
@@ -30,6 +30,8 @@ function DataTable({
30
30
  noResults = /* @__PURE__ */ jsx(Text, { c: "dimmed", children: "No results" }),
31
31
  sortDescFirst = false,
32
32
  defaultSort = [],
33
+ manualSorting,
34
+ onSortingStateChange,
33
35
  selectOptions,
34
36
  caption,
35
37
  tableProps,
@@ -47,6 +49,7 @@ function DataTable({
47
49
  getCoreRowModel: getCoreRowModel(),
48
50
  onSortingChange: setSorting,
49
51
  getSortedRowModel: getSortedRowModel(),
52
+ manualSorting,
50
53
  state: {
51
54
  sorting,
52
55
  rowSelection
@@ -64,6 +67,9 @@ function DataTable({
64
67
  useEffect(() => {
65
68
  localStorage.setItem("data-table-" + tableKey, JSON.stringify(sorting));
66
69
  }, [tableKey, sorting]);
70
+ useEffect(() => {
71
+ onSortingStateChange?.(sorting);
72
+ }, [sorting]);
67
73
  useEffect(() => {
68
74
  selectOptions?.onSelect?.(Object.keys(rowSelection));
69
75
  }, [rowSelection]);
@@ -192,6 +198,15 @@ const SortableHeader = ({
192
198
  description,
193
199
  sortDescFirst
194
200
  }) => {
201
+ if (!column.getCanSort()) {
202
+ return /* @__PURE__ */ jsxs(Group, { justify: "start", gap: "xs", wrap: "nowrap", miw: "120", w: "fit-content", children: [
203
+ /* @__PURE__ */ jsx(Text, { fw: 600, size: "sm", lineClamp: 1, children: title }),
204
+ description && /* @__PURE__ */ jsxs(HoverCard, { offset: 10, children: [
205
+ /* @__PURE__ */ jsx(HoverCard.Target, { children: /* @__PURE__ */ jsx(Info, { size: "1rem" }) }),
206
+ /* @__PURE__ */ jsx(HoverCard.Dropdown, { children: /* @__PURE__ */ jsx(Text, { children: description }) })
207
+ ] })
208
+ ] });
209
+ }
195
210
  return /* @__PURE__ */ jsx(
196
211
  UnstyledButton,
197
212
  {