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.
- package/dist/auth/index.cjs +10 -1
- package/dist/auth/index.cjs.map +1 -1
- package/dist/auth/index.d.cts +4 -3
- package/dist/auth/index.d.ts +4 -3
- package/dist/auth/index.js +9 -1
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/login/header.d.cts +2 -2
- package/dist/auth/login/header.d.ts +2 -2
- package/dist/auth/login/index.cjs +24 -9
- package/dist/auth/login/index.cjs.map +1 -1
- package/dist/auth/login/index.d.cts +2 -2
- package/dist/auth/login/index.d.ts +2 -2
- package/dist/auth/login/index.js +32 -10
- package/dist/auth/login/index.js.map +1 -1
- package/dist/auth/profile/index.d.cts +1 -1
- package/dist/auth/profile/index.d.ts +1 -1
- package/dist/auth/profile/linked-logins.d.cts +2 -2
- package/dist/auth/profile/linked-logins.d.ts +2 -2
- package/dist/auth/profile/passkey.d.cts +2 -2
- package/dist/auth/profile/passkey.d.ts +2 -2
- package/dist/auth/profile/totp.d.cts +2 -2
- package/dist/auth/profile/totp.d.ts +2 -2
- package/dist/components/back-button.d.cts +2 -2
- package/dist/components/back-button.d.ts +2 -2
- package/dist/components/button-link.d.cts +2 -2
- package/dist/components/button-link.d.ts +2 -2
- package/dist/components/config/confirm.d.cts +2 -2
- package/dist/components/config/confirm.d.ts +2 -2
- package/dist/components/config/group.d.cts +1 -2
- package/dist/components/config/group.d.ts +1 -2
- package/dist/components/config/index.d.cts +3 -3
- package/dist/components/config/index.d.ts +3 -3
- package/dist/components/config/item.d.cts +3 -4
- package/dist/components/config/item.d.ts +3 -4
- package/dist/components/config/layout.d.cts +2 -2
- package/dist/components/config/layout.d.ts +2 -2
- package/dist/components/config/unsaved-changes.d.cts +2 -2
- package/dist/components/config/unsaved-changes.d.ts +2 -2
- package/dist/components/confirm-modal.d.cts +3 -3
- package/dist/components/confirm-modal.d.ts +3 -3
- package/dist/components/copy-button.d.cts +3 -3
- package/dist/components/copy-button.d.ts +3 -3
- package/dist/components/copy-text.d.cts +2 -2
- package/dist/components/copy-text.d.ts +2 -2
- package/dist/components/create-modal.d.cts +3 -3
- package/dist/components/create-modal.d.ts +3 -3
- package/dist/components/data-table.cjs +15 -0
- package/dist/components/data-table.cjs.map +1 -1
- package/dist/components/data-table.d.cts +10 -3
- package/dist/components/data-table.d.ts +10 -3
- package/dist/components/data-table.js +15 -0
- package/dist/components/data-table.js.map +1 -1
- package/dist/components/enable-switch.d.cts +2 -2
- package/dist/components/enable-switch.d.ts +2 -2
- package/dist/components/entity-header.d.cts +2 -2
- package/dist/components/entity-header.d.ts +2 -2
- package/dist/components/entity-page.d.cts +3 -3
- package/dist/components/entity-page.d.ts +3 -3
- package/dist/components/hover-error.d.cts +2 -2
- package/dist/components/hover-error.d.ts +2 -2
- package/dist/components/input-list.d.cts +2 -2
- package/dist/components/input-list.d.ts +2 -2
- package/dist/components/labelled-switch.d.cts +3 -3
- package/dist/components/labelled-switch.d.ts +3 -3
- package/dist/components/labels-group.d.cts +2 -2
- package/dist/components/labels-group.d.ts +2 -2
- package/dist/components/loading-screen.d.cts +2 -2
- package/dist/components/loading-screen.d.ts +2 -2
- package/dist/components/mobile-friendly-tabs.d.cts +5 -5
- package/dist/components/mobile-friendly-tabs.d.ts +5 -5
- package/dist/components/monaco/index.d.cts +3 -3
- package/dist/components/monaco/index.d.ts +3 -3
- package/dist/components/page-guard.d.cts +1 -2
- package/dist/components/page-guard.d.ts +1 -2
- package/dist/components/search-input.d.cts +2 -2
- package/dist/components/search-input.d.ts +2 -2
- package/dist/components/shared-text-update.d.cts +3 -3
- package/dist/components/shared-text-update.d.ts +3 -3
- package/dist/components/show-hide-button.d.cts +2 -2
- package/dist/components/show-hide-button.d.ts +2 -2
- package/dist/components/stat-bar.d.cts +3 -3
- package/dist/components/stat-bar.d.ts +3 -3
- package/dist/components/stat-cell.d.cts +3 -3
- package/dist/components/stat-cell.d.ts +3 -3
- package/dist/components/tabbed-page.d.cts +3 -3
- package/dist/components/tabbed-page.d.ts +3 -3
- package/dist/components/table-skeleton.d.cts +2 -2
- package/dist/components/table-skeleton.d.ts +2 -2
- package/dist/components/text-update-modal.d.cts +3 -3
- package/dist/components/text-update-modal.d.ts +3 -3
- package/dist/components/theme-toggle.d.cts +2 -2
- package/dist/components/theme-toggle.d.ts +2 -2
- package/dist/index.d.cts +1 -2
- package/dist/index.d.ts +1 -2
- package/dist/theme.d.cts +3 -3
- package/dist/theme.d.ts +3 -3
- package/package.json +26 -25
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import * as
|
|
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):
|
|
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
|
|
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):
|
|
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
|
|
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):
|
|
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
|
|
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):
|
|
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
|
|
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>):
|
|
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
|
|
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>):
|
|
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
|
|
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
|
-
}):
|
|
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>):
|
|
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
|
|
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
|
-
}):
|
|
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>):
|
|
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">):
|
|
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">):
|
|
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">):
|
|
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">):
|
|
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">):
|
|
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">):
|
|
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
|
|
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):
|
|
9
|
+
} & SectionProps): react.JSX.Element;
|
|
10
10
|
|
|
11
11
|
export { ConfigLayout };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import * as
|
|
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):
|
|
9
|
+
} & SectionProps): react.JSX.Element;
|
|
10
10
|
|
|
11
11
|
export { ConfigLayout };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import * as
|
|
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):
|
|
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
|
|
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):
|
|
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
|
|
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):
|
|
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
|
|
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):
|
|
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
|
|
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):
|
|
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
|
|
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):
|
|
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
|
|
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):
|
|
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
|
|
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):
|
|
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
|
|
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>):
|
|
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
|
-
}) =>
|
|
41
|
+
}) => react.JSX.Element;
|
|
35
42
|
|
|
36
43
|
export { DataTable, type DataTableProps, SortableHeader };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import * as
|
|
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>):
|
|
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
|
-
}) =>
|
|
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
|
{
|