@simplysm/solid 13.0.71 → 13.0.74
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/README.md +209 -202
- package/dist/components/data/calendar/Calendar.d.ts.map +1 -1
- package/dist/components/data/calendar/Calendar.js +3 -11
- package/dist/components/data/calendar/Calendar.js.map +2 -2
- package/dist/components/data/sheet/DataSheet.d.ts.map +1 -1
- package/dist/components/data/sheet/DataSheet.js +13 -16
- package/dist/components/data/sheet/DataSheet.js.map +2 -2
- package/dist/components/data/sheet/DataSheet.styles.d.ts.map +1 -1
- package/dist/components/data/sheet/DataSheet.styles.js +1 -1
- package/dist/components/data/sheet/DataSheet.styles.js.map +1 -1
- package/dist/components/data/sheet/DataSheetConfigDialog.d.ts.map +1 -1
- package/dist/components/data/sheet/DataSheetConfigDialog.js +27 -9
- package/dist/components/data/sheet/DataSheetConfigDialog.js.map +2 -2
- package/dist/components/disclosure/Dialog.d.ts +1 -1
- package/dist/components/disclosure/Dialog.d.ts.map +1 -1
- package/dist/components/disclosure/Dialog.js +5 -5
- package/dist/components/disclosure/Dialog.js.map +2 -2
- package/dist/components/disclosure/dialogZIndex.d.ts +1 -1
- package/dist/components/features/crud-detail/CrudDetail.js +23 -23
- package/dist/components/features/crud-detail/CrudDetail.js.map +2 -2
- package/dist/components/features/crud-sheet/CrudSheet.js +49 -49
- package/dist/components/features/crud-sheet/CrudSheet.js.map +2 -2
- package/dist/components/features/crud-sheet/types.d.ts +4 -4
- package/dist/components/features/crud-sheet/types.d.ts.map +1 -1
- package/dist/components/features/data-select-button/DataSelectButton.d.ts +25 -7
- package/dist/components/features/data-select-button/DataSelectButton.d.ts.map +1 -1
- package/dist/components/features/data-select-button/DataSelectButton.js +27 -12
- package/dist/components/features/data-select-button/DataSelectButton.js.map +2 -2
- package/dist/components/features/permission-table/PermissionTable.js +4 -4
- package/dist/components/features/permission-table/PermissionTable.js.map +2 -2
- package/dist/components/features/shared-data/SharedDataSelect.d.ts +22 -10
- package/dist/components/features/shared-data/SharedDataSelect.d.ts.map +1 -1
- package/dist/components/features/shared-data/SharedDataSelect.js +113 -29
- package/dist/components/features/shared-data/SharedDataSelect.js.map +2 -2
- package/dist/components/features/shared-data/SharedDataSelectButton.d.ts +3 -3
- package/dist/components/features/shared-data/SharedDataSelectButton.d.ts.map +1 -1
- package/dist/components/features/shared-data/SharedDataSelectButton.js.map +1 -1
- package/dist/components/features/shared-data/SharedDataSelectList.js +5 -4
- package/dist/components/features/shared-data/SharedDataSelectList.js.map +2 -2
- package/dist/components/feedback/notification/NotificationBanner.js +3 -3
- package/dist/components/feedback/notification/NotificationBanner.js.map +2 -2
- package/dist/components/feedback/notification/NotificationBell.d.ts.map +1 -1
- package/dist/components/feedback/notification/NotificationBell.js +12 -5
- package/dist/components/feedback/notification/NotificationBell.js.map +2 -2
- package/dist/components/feedback/notification/NotificationProvider.d.ts.map +1 -1
- package/dist/components/feedback/notification/NotificationProvider.js +3 -1
- package/dist/components/feedback/notification/NotificationProvider.js.map +2 -2
- package/dist/components/form-control/ThemeToggle.d.ts.map +1 -1
- package/dist/components/form-control/ThemeToggle.js +9 -6
- package/dist/components/form-control/ThemeToggle.js.map +2 -2
- package/dist/components/form-control/checkbox/Checkbox.d.ts.map +1 -1
- package/dist/components/form-control/checkbox/Checkbox.js +3 -1
- package/dist/components/form-control/checkbox/Checkbox.js.map +2 -2
- package/dist/components/form-control/checkbox/CheckboxGroup.js +1 -1
- package/dist/components/form-control/checkbox/CheckboxGroup.js.map +2 -2
- package/dist/components/form-control/checkbox/Radio.d.ts.map +1 -1
- package/dist/components/form-control/checkbox/Radio.js +3 -1
- package/dist/components/form-control/checkbox/Radio.js.map +2 -2
- package/dist/components/form-control/checkbox/RadioGroup.js +1 -1
- package/dist/components/form-control/checkbox/RadioGroup.js.map +2 -2
- package/dist/components/form-control/color-picker/ColorPicker.d.ts.map +1 -1
- package/dist/components/form-control/color-picker/ColorPicker.js +3 -1
- package/dist/components/form-control/color-picker/ColorPicker.js.map +2 -2
- package/dist/components/form-control/combobox/Combobox.d.ts.map +1 -1
- package/dist/components/form-control/combobox/Combobox.js +9 -5
- package/dist/components/form-control/combobox/Combobox.js.map +2 -2
- package/dist/components/form-control/date-range-picker/DateRangePicker.js +9 -9
- package/dist/components/form-control/date-range-picker/DateRangePicker.js.map +2 -2
- package/dist/components/form-control/editor/EditorToolbar.js +3 -3
- package/dist/components/form-control/editor/EditorToolbar.js.map +2 -2
- package/dist/components/form-control/field/DatePicker.d.ts.map +1 -1
- package/dist/components/form-control/field/DatePicker.js +9 -3
- package/dist/components/form-control/field/DatePicker.js.map +2 -2
- package/dist/components/form-control/field/DateTimePicker.d.ts.map +1 -1
- package/dist/components/form-control/field/DateTimePicker.js +9 -3
- package/dist/components/form-control/field/DateTimePicker.js.map +2 -2
- package/dist/components/form-control/field/NumberInput.d.ts.map +1 -1
- package/dist/components/form-control/field/NumberInput.js +9 -3
- package/dist/components/form-control/field/NumberInput.js.map +2 -2
- package/dist/components/form-control/field/TextInput.d.ts.map +1 -1
- package/dist/components/form-control/field/TextInput.js +10 -4
- package/dist/components/form-control/field/TextInput.js.map +2 -2
- package/dist/components/form-control/field/Textarea.d.ts.map +1 -1
- package/dist/components/form-control/field/Textarea.js +9 -3
- package/dist/components/form-control/field/Textarea.js.map +2 -2
- package/dist/components/form-control/field/TimePicker.d.ts.map +1 -1
- package/dist/components/form-control/field/TimePicker.js +9 -3
- package/dist/components/form-control/field/TimePicker.js.map +2 -2
- package/dist/components/form-control/numpad/Numpad.d.ts.map +1 -1
- package/dist/components/form-control/numpad/Numpad.js +5 -1
- package/dist/components/form-control/numpad/Numpad.js.map +2 -2
- package/dist/components/form-control/select/Select.js +7 -7
- package/dist/components/form-control/select/Select.js.map +2 -2
- package/dist/components/form-control/state-preset/StatePreset.d.ts.map +1 -1
- package/dist/components/form-control/state-preset/StatePreset.js +42 -20
- package/dist/components/form-control/state-preset/StatePreset.js.map +2 -2
- package/dist/components/layout/sidebar/SidebarContainer.js +3 -3
- package/dist/components/layout/sidebar/SidebarContainer.js.map +2 -2
- package/dist/components/layout/sidebar/SidebarMenu.d.ts.map +1 -1
- package/dist/components/layout/sidebar/SidebarMenu.js +5 -2
- package/dist/components/layout/sidebar/SidebarMenu.js.map +2 -2
- package/dist/components/layout/topbar/Topbar.js +3 -4
- package/dist/components/layout/topbar/Topbar.js.map +2 -2
- package/dist/components/layout/topbar/TopbarMenu.js +3 -3
- package/dist/components/layout/topbar/TopbarMenu.js.map +2 -2
- package/dist/hooks/createSelectionGroup.d.ts +2 -2
- package/dist/hooks/createSelectionGroup.d.ts.map +1 -1
- package/dist/hooks/createSelectionGroup.js +5 -2
- package/dist/hooks/createSelectionGroup.js.map +2 -2
- package/dist/providers/i18n/I18nContext.d.ts +0 -4
- package/dist/providers/i18n/I18nContext.d.ts.map +1 -1
- package/dist/providers/i18n/I18nContext.js +1 -5
- package/dist/providers/i18n/I18nContext.js.map +2 -2
- package/dist/providers/i18n/locales/en.d.ts +38 -0
- package/dist/providers/i18n/locales/en.d.ts.map +1 -1
- package/dist/providers/i18n/locales/en.js +39 -1
- package/dist/providers/i18n/locales/en.js.map +1 -1
- package/dist/providers/i18n/locales/ko.d.ts +38 -0
- package/dist/providers/i18n/locales/ko.d.ts.map +1 -1
- package/dist/providers/i18n/locales/ko.js +39 -1
- package/dist/providers/i18n/locales/ko.js.map +1 -1
- package/package.json +6 -6
- package/src/components/data/calendar/Calendar.tsx +3 -4
- package/src/components/data/sheet/DataSheet.styles.ts +1 -1
- package/src/components/data/sheet/DataSheet.tsx +14 -15
- package/src/components/data/sheet/DataSheetConfigDialog.tsx +12 -10
- package/src/components/data/sheet/types.ts +1 -1
- package/src/components/disclosure/Dialog.tsx +10 -10
- package/src/components/disclosure/dialogZIndex.ts +1 -1
- package/src/components/features/crud-detail/CrudDetail.tsx +25 -25
- package/src/components/features/crud-sheet/CrudSheet.tsx +53 -53
- package/src/components/features/crud-sheet/types.ts +4 -4
- package/src/components/features/data-select-button/DataSelectButton.tsx +51 -21
- package/src/components/features/permission-table/PermissionTable.tsx +3 -3
- package/src/components/features/shared-data/SharedDataSelect.tsx +172 -33
- package/src/components/features/shared-data/SharedDataSelectButton.tsx +3 -2
- package/src/components/features/shared-data/SharedDataSelectList.tsx +4 -4
- package/src/components/feedback/notification/NotificationBanner.tsx +3 -3
- package/src/components/feedback/notification/NotificationBell.tsx +6 -4
- package/src/components/feedback/notification/NotificationProvider.tsx +3 -1
- package/src/components/form-control/ThemeToggle.tsx +10 -6
- package/src/components/form-control/checkbox/Checkbox.tsx +4 -1
- package/src/components/form-control/checkbox/CheckboxGroup.tsx +1 -1
- package/src/components/form-control/checkbox/Radio.tsx +4 -1
- package/src/components/form-control/checkbox/RadioGroup.tsx +1 -1
- package/src/components/form-control/color-picker/ColorPicker.tsx +4 -1
- package/src/components/form-control/combobox/Combobox.tsx +6 -3
- package/src/components/form-control/date-range-picker/DateRangePicker.tsx +8 -8
- package/src/components/form-control/editor/EditorToolbar.tsx +23 -23
- package/src/components/form-control/field/DatePicker.tsx +6 -3
- package/src/components/form-control/field/DateTimePicker.tsx +6 -3
- package/src/components/form-control/field/NumberInput.tsx +6 -3
- package/src/components/form-control/field/TextInput.tsx +7 -4
- package/src/components/form-control/field/Textarea.tsx +6 -3
- package/src/components/form-control/field/TimePicker.tsx +6 -3
- package/src/components/form-control/numpad/Numpad.tsx +3 -1
- package/src/components/form-control/select/Select.tsx +7 -7
- package/src/components/form-control/state-preset/StatePreset.tsx +14 -12
- package/src/components/layout/sidebar/SidebarContainer.tsx +3 -3
- package/src/components/layout/sidebar/SidebarMenu.tsx +3 -1
- package/src/components/layout/topbar/Topbar.tsx +3 -3
- package/src/components/layout/topbar/TopbarMenu.tsx +3 -3
- package/src/hooks/createSelectionGroup.tsx +8 -4
- package/src/providers/i18n/I18nContext.tsx +0 -7
- package/src/providers/i18n/locales/en.ts +38 -0
- package/src/providers/i18n/locales/ko.ts +38 -0
- package/tailwind.config.ts +2 -2
- package/tests/components/data/kanban/Kanban.selection.spec.tsx +34 -24
- package/tests/components/disclosure/Dialog.spec.tsx +28 -28
- package/tests/components/disclosure/DialogProvider.spec.tsx +51 -25
- package/tests/components/features/address/AddressSearch.spec.tsx +12 -4
- package/tests/components/features/crud-detail/CrudDetail.spec.tsx +1 -0
- package/tests/components/features/crud-sheet/CrudSheet.spec.tsx +30 -6
- package/tests/components/features/data-select-button/DataSelectButton.spec.tsx +77 -56
- package/tests/components/features/permission-table/PermissionTable.spec.tsx +12 -8
- package/tests/components/features/shared-data/SharedDataSelect.spec.tsx +172 -0
- package/tests/components/features/shared-data/SharedDataSelectList.spec.tsx +14 -2
- package/tests/components/feedback/notification/LiveRegion.spec.tsx +20 -9
- package/tests/components/feedback/notification/NotificationBanner.spec.tsx +64 -46
- package/tests/components/feedback/notification/NotificationBell.spec.tsx +70 -51
- package/tests/components/feedback/notification/NotificationContext.spec.tsx +105 -78
- package/tests/components/form-control/checkbox/Checkbox.spec.tsx +25 -20
- package/tests/components/form-control/checkbox/CheckboxGroup.spec.tsx +53 -30
- package/tests/components/form-control/checkbox/Radio.spec.tsx +25 -20
- package/tests/components/form-control/checkbox/RadioGroup.spec.tsx +53 -30
- package/tests/components/form-control/color-picker/ColorPicker.spec.tsx +24 -15
- package/tests/components/form-control/combobox/Combobox.spec.tsx +92 -59
- package/tests/components/form-control/date-range-picker/DateRangePicker.spec.tsx +2 -2
- package/tests/components/form-control/field/DatePicker.spec.tsx +50 -44
- package/tests/components/form-control/field/DateTimePicker.spec.tsx +51 -45
- package/tests/components/form-control/field/NumberInput.spec.tsx +53 -47
- package/tests/components/form-control/field/TextInput.spec.tsx +50 -44
- package/tests/components/form-control/field/Textarea.spec.tsx +35 -29
- package/tests/components/form-control/field/TimePicker.spec.tsx +43 -37
- package/tests/components/form-control/numpad/Numpad.spec.tsx +175 -25
- package/tests/components/form-control/select/Select.spec.tsx +5 -0
- package/tests/components/form-control/select/SelectItem.spec.tsx +1 -0
- package/tests/components/layout/sidebar/Sidebar.spec.tsx +79 -35
- package/tests/components/layout/sidebar/SidebarContainer.spec.tsx +1 -0
- package/tests/components/layout/sidebar/SidebarMenu.spec.tsx +28 -17
- package/tests/components/layout/topbar/TopbarActions.spec.tsx +41 -23
- package/tests/components/layout/topbar/createTopbarActions.spec.tsx +1 -0
- package/tests/hooks/usePrint.spec.tsx +1 -1
- package/tests/hooks/useRouterLink.spec.tsx +2 -0
- package/tests/hooks/useSyncConfig.spec.tsx +1 -0
- package/tests/providers/ErrorLoggerProvider.spec.tsx +1 -0
- package/tests/providers/PwaUpdateProvider.spec.tsx +16 -6
- package/tests/providers/ServiceClientContext.spec.tsx +40 -25
- package/tests/providers/i18n/I18nContext.spec.tsx +3 -4
- package/tests/providers/shared-data/SharedDataProvider.spec.tsx +2 -0
- package/dist/hooks/usePrint.d.ts +0 -3
- package/dist/hooks/usePrint.d.ts.map +0 -1
- package/dist/hooks/usePrint.js +0 -5
- package/dist/hooks/usePrint.js.map +0 -6
- package/src/hooks/usePrint.ts +0 -2
|
@@ -21,7 +21,7 @@ import { createMountTransition } from "../../hooks/createMountTransition";
|
|
|
21
21
|
import { startPointerDrag } from "../../helpers/startPointerDrag";
|
|
22
22
|
import { createSlotComponent } from "../../helpers/createSlotComponent";
|
|
23
23
|
import { mergeStyles } from "../../helpers/mergeStyles";
|
|
24
|
-
import {
|
|
24
|
+
import { useI18n } from "../../providers/i18n/I18nContext";
|
|
25
25
|
import { Icon } from "../display/Icon";
|
|
26
26
|
import { borderSubtle } from "../../styles/tokens.styles";
|
|
27
27
|
import { DialogDefaultsContext } from "./DialogContext";
|
|
@@ -39,7 +39,7 @@ const DialogHeader = createSlotComponent(DialogSlotsContext, (ctx) => ctx.setHea
|
|
|
39
39
|
const DialogAction = createSlotComponent(DialogSlotsContext, (ctx) => ctx.setAction);
|
|
40
40
|
|
|
41
41
|
export interface DialogProps {
|
|
42
|
-
/**
|
|
42
|
+
/** Dialog open state */
|
|
43
43
|
open?: boolean;
|
|
44
44
|
/** Callback when open state changes */
|
|
45
45
|
onOpenChange?: (open: boolean) => void;
|
|
@@ -146,7 +146,7 @@ interface DialogComponent extends ParentComponent<DialogProps> {
|
|
|
146
146
|
|
|
147
147
|
export const Dialog: DialogComponent = (props) => {
|
|
148
148
|
const dialogDefaults = useContext(DialogDefaultsContext);
|
|
149
|
-
const i18n =
|
|
149
|
+
const i18n = useI18n();
|
|
150
150
|
|
|
151
151
|
const [local] = splitProps(props, [
|
|
152
152
|
"open",
|
|
@@ -479,10 +479,10 @@ export const Dialog: DialogComponent = (props) => {
|
|
|
479
479
|
<Show when={mounted()}>
|
|
480
480
|
<Portal>
|
|
481
481
|
<DialogSlotsContext.Provider value={{ setHeader, setAction }}>
|
|
482
|
-
<div ref={setWrapperRef} data-
|
|
482
|
+
<div ref={setWrapperRef} data-dialog class={wrapperClass()}>
|
|
483
483
|
{/* Backdrop */}
|
|
484
484
|
<Show when={!local.float}>
|
|
485
|
-
<div data-
|
|
485
|
+
<div data-dialog-backdrop class={backdropClass()} onClick={handleBackdropClick} />
|
|
486
486
|
</Show>
|
|
487
487
|
|
|
488
488
|
{/* Dialog */}
|
|
@@ -490,7 +490,7 @@ export const Dialog: DialogComponent = (props) => {
|
|
|
490
490
|
ref={(el) => {
|
|
491
491
|
dialogRef = el;
|
|
492
492
|
}}
|
|
493
|
-
data-
|
|
493
|
+
data-dialog-panel
|
|
494
494
|
role="dialog"
|
|
495
495
|
aria-modal={local.float ? undefined : true}
|
|
496
496
|
aria-labelledby={hasHeader() ? headerId : undefined}
|
|
@@ -503,7 +503,7 @@ export const Dialog: DialogComponent = (props) => {
|
|
|
503
503
|
{/* Header */}
|
|
504
504
|
<Show when={hasHeader()}>
|
|
505
505
|
<div
|
|
506
|
-
data-
|
|
506
|
+
data-dialog-header
|
|
507
507
|
class={clsx(headerClass(), "touch-none")}
|
|
508
508
|
style={
|
|
509
509
|
typeof local.headerStyle === "string"
|
|
@@ -518,10 +518,10 @@ export const Dialog: DialogComponent = (props) => {
|
|
|
518
518
|
<Show when={action()}>{action()!()}</Show>
|
|
519
519
|
<Show when={local.closable ?? true}>
|
|
520
520
|
<Button
|
|
521
|
-
data-
|
|
521
|
+
data-dialog-close
|
|
522
522
|
size={"sm"}
|
|
523
523
|
variant={"ghost"}
|
|
524
|
-
aria-label={i18n
|
|
524
|
+
aria-label={i18n.t("dialog.close")}
|
|
525
525
|
onClick={handleCloseClick}
|
|
526
526
|
>
|
|
527
527
|
<Icon icon={IconX} />
|
|
@@ -531,7 +531,7 @@ export const Dialog: DialogComponent = (props) => {
|
|
|
531
531
|
</Show>
|
|
532
532
|
|
|
533
533
|
{/* Content */}
|
|
534
|
-
<div data-
|
|
534
|
+
<div data-dialog-content class={dialogContentClass}>
|
|
535
535
|
{local.children}
|
|
536
536
|
</div>
|
|
537
537
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Dialog z-index registry
|
|
3
3
|
*
|
|
4
4
|
* Manages z-index of open Dialogs to prevent infinite increase.
|
|
5
|
-
* Base starting value is 2000 (same as tailwind z-
|
|
5
|
+
* Base starting value is 2000 (same as tailwind z-dialog), uses only as many as there are open Dialogs.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
const BASE_Z = 2000;
|
|
@@ -22,7 +22,7 @@ import { createTopbarActions, TopbarContext } from "../../layout/topbar/TopbarCo
|
|
|
22
22
|
import { useDialogInstance } from "../../disclosure/DialogInstanceContext";
|
|
23
23
|
import { Dialog } from "../../disclosure/Dialog";
|
|
24
24
|
import { createEventListener } from "@solid-primitives/event-listener";
|
|
25
|
-
import {
|
|
25
|
+
import { useI18n } from "../../../providers/i18n/I18nContext";
|
|
26
26
|
import clsx from "clsx";
|
|
27
27
|
import {
|
|
28
28
|
IconCheck,
|
|
@@ -64,11 +64,11 @@ const CrudDetailBase = <TData extends object>(props: CrudDetailProps<TData>) =>
|
|
|
64
64
|
]);
|
|
65
65
|
|
|
66
66
|
const noti = useNotification();
|
|
67
|
-
const i18n =
|
|
67
|
+
const i18n = useI18n();
|
|
68
68
|
const topbarCtx = useContext(TopbarContext);
|
|
69
69
|
const dialogInstance = useDialogInstance<boolean>();
|
|
70
70
|
|
|
71
|
-
const
|
|
71
|
+
const isInDialog = dialogInstance !== undefined;
|
|
72
72
|
|
|
73
73
|
const canEdit = () => local.editable ?? true;
|
|
74
74
|
|
|
@@ -96,7 +96,7 @@ const CrudDetailBase = <TData extends object>(props: CrudDetailProps<TData>) =>
|
|
|
96
96
|
originalData = objClone(result.data);
|
|
97
97
|
setInfo(result.info);
|
|
98
98
|
} catch (err) {
|
|
99
|
-
noti.error(err, i18n
|
|
99
|
+
noti.error(err, i18n.t("crudDetail.lookupFailed"));
|
|
100
100
|
}
|
|
101
101
|
setBusyCount((c) => c - 1);
|
|
102
102
|
setReady(true);
|
|
@@ -119,7 +119,7 @@ const CrudDetailBase = <TData extends object>(props: CrudDetailProps<TData>) =>
|
|
|
119
119
|
// -- Refresh --
|
|
120
120
|
async function handleRefresh() {
|
|
121
121
|
if (hasChanges()) {
|
|
122
|
-
if (!confirm(i18n
|
|
122
|
+
if (!confirm(i18n.t("crudDetail.discardChanges"))) return;
|
|
123
123
|
}
|
|
124
124
|
await doLoad();
|
|
125
125
|
}
|
|
@@ -131,7 +131,7 @@ const CrudDetailBase = <TData extends object>(props: CrudDetailProps<TData>) =>
|
|
|
131
131
|
|
|
132
132
|
const currentInfo = info();
|
|
133
133
|
if (currentInfo && !currentInfo.isNew && !hasChanges()) {
|
|
134
|
-
noti.info(i18n
|
|
134
|
+
noti.info(i18n.t("crudDetail.notice"), i18n.t("crudDetail.noChanges"));
|
|
135
135
|
return;
|
|
136
136
|
}
|
|
137
137
|
|
|
@@ -139,7 +139,7 @@ const CrudDetailBase = <TData extends object>(props: CrudDetailProps<TData>) =>
|
|
|
139
139
|
try {
|
|
140
140
|
const result = await local.submit(objClone(unwrap(data)));
|
|
141
141
|
if (result) {
|
|
142
|
-
noti.success(i18n
|
|
142
|
+
noti.success(i18n.t("crudDetail.saveCompleted"), i18n.t("crudDetail.saveSuccess"));
|
|
143
143
|
if (dialogInstance) {
|
|
144
144
|
dialogInstance.close(true);
|
|
145
145
|
} else {
|
|
@@ -147,7 +147,7 @@ const CrudDetailBase = <TData extends object>(props: CrudDetailProps<TData>) =>
|
|
|
147
147
|
}
|
|
148
148
|
}
|
|
149
149
|
} catch (err) {
|
|
150
|
-
noti.error(err, i18n
|
|
150
|
+
noti.error(err, i18n.t("crudDetail.saveFailed"));
|
|
151
151
|
}
|
|
152
152
|
setBusyCount((c) => c - 1);
|
|
153
153
|
}
|
|
@@ -171,7 +171,7 @@ const CrudDetailBase = <TData extends object>(props: CrudDetailProps<TData>) =>
|
|
|
171
171
|
try {
|
|
172
172
|
const result = await local.toggleDelete(del);
|
|
173
173
|
if (result) {
|
|
174
|
-
noti.success(del ?
|
|
174
|
+
noti.success(del ? i18n.t("crudDetail.deleteCompleted") : i18n.t("crudDetail.restoreCompleted"), del ? i18n.t("crudDetail.deleteSuccess") : i18n.t("crudDetail.restoreSuccess"));
|
|
175
175
|
if (dialogInstance) {
|
|
176
176
|
dialogInstance.close(true);
|
|
177
177
|
} else {
|
|
@@ -179,7 +179,7 @@ const CrudDetailBase = <TData extends object>(props: CrudDetailProps<TData>) =>
|
|
|
179
179
|
}
|
|
180
180
|
}
|
|
181
181
|
} catch (err) {
|
|
182
|
-
noti.error(err, del ?
|
|
182
|
+
noti.error(err, del ? i18n.t("crudDetail.deleteFailed") : i18n.t("crudDetail.restoreFailed"));
|
|
183
183
|
}
|
|
184
184
|
setBusyCount((c) => c - 1);
|
|
185
185
|
}
|
|
@@ -211,7 +211,7 @@ const CrudDetailBase = <TData extends object>(props: CrudDetailProps<TData>) =>
|
|
|
211
211
|
onClick={() => formRef?.requestSubmit()}
|
|
212
212
|
>
|
|
213
213
|
<Icon icon={IconDeviceFloppy} class="mr-1" />
|
|
214
|
-
{i18n
|
|
214
|
+
{i18n.t("crudDetail.save")}
|
|
215
215
|
</Button>
|
|
216
216
|
</Show>
|
|
217
217
|
<Show
|
|
@@ -227,13 +227,13 @@ const CrudDetailBase = <TData extends object>(props: CrudDetailProps<TData>) =>
|
|
|
227
227
|
onClick={() => void handleToggleDelete()}
|
|
228
228
|
>
|
|
229
229
|
<Icon icon={info()!.isDeleted ? IconTrashOff : IconTrash} class="mr-1" />
|
|
230
|
-
{info()!.isDeleted ?
|
|
230
|
+
{info()!.isDeleted ? i18n.t("crudDetail.restore") : i18n.t("crudDetail.delete")}
|
|
231
231
|
</Button>
|
|
232
232
|
)}
|
|
233
233
|
</Show>
|
|
234
234
|
<Button size="lg" variant="ghost" theme="info" onClick={() => void handleRefresh()}>
|
|
235
235
|
<Icon icon={IconRefresh} class="mr-1" />
|
|
236
|
-
{i18n
|
|
236
|
+
{i18n.t("crudDetail.refresh")}
|
|
237
237
|
</Button>
|
|
238
238
|
</>
|
|
239
239
|
));
|
|
@@ -272,8 +272,8 @@ const CrudDetailBase = <TData extends object>(props: CrudDetailProps<TData>) =>
|
|
|
272
272
|
// -- Render --
|
|
273
273
|
return (
|
|
274
274
|
<>
|
|
275
|
-
{/*
|
|
276
|
-
<Show when={
|
|
275
|
+
{/* Dialog mode: Dialog.Action (refresh button in header) */}
|
|
276
|
+
<Show when={isInDialog}>
|
|
277
277
|
<Dialog.Action>
|
|
278
278
|
<Button size={"sm"} variant={"ghost"} onClick={() => void handleRefresh()}>
|
|
279
279
|
<Icon icon={IconRefresh} />
|
|
@@ -287,9 +287,9 @@ const CrudDetailBase = <TData extends object>(props: CrudDetailProps<TData>) =>
|
|
|
287
287
|
class={clsx("flex h-full flex-col gap-2", local.class)}
|
|
288
288
|
>
|
|
289
289
|
{/* Toolbar */}
|
|
290
|
-
<Show when={(!
|
|
290
|
+
<Show when={(!isInDialog && !topbarCtx) || defs().tools}>
|
|
291
291
|
<div class="flex gap-2 pb-0">
|
|
292
|
-
<Show when={!topbarCtx && !
|
|
292
|
+
<Show when={!topbarCtx && !isInDialog}>
|
|
293
293
|
<Show when={canEdit() && local.submit}>
|
|
294
294
|
<Button
|
|
295
295
|
size="sm"
|
|
@@ -298,7 +298,7 @@ const CrudDetailBase = <TData extends object>(props: CrudDetailProps<TData>) =>
|
|
|
298
298
|
onClick={() => formRef?.requestSubmit()}
|
|
299
299
|
>
|
|
300
300
|
<Icon icon={IconDeviceFloppy} class="mr-1" />
|
|
301
|
-
{i18n
|
|
301
|
+
{i18n.t("crudDetail.save")}
|
|
302
302
|
</Button>
|
|
303
303
|
</Show>
|
|
304
304
|
<Show
|
|
@@ -318,13 +318,13 @@ const CrudDetailBase = <TData extends object>(props: CrudDetailProps<TData>) =>
|
|
|
318
318
|
onClick={() => void handleToggleDelete()}
|
|
319
319
|
>
|
|
320
320
|
<Icon icon={info()!.isDeleted ? IconTrashOff : IconTrash} class="mr-1" />
|
|
321
|
-
{info()!.isDeleted ?
|
|
321
|
+
{info()!.isDeleted ? i18n.t("crudDetail.restore") : i18n.t("crudDetail.delete")}
|
|
322
322
|
</Button>
|
|
323
323
|
)}
|
|
324
324
|
</Show>
|
|
325
325
|
<Button size="sm" theme="info" variant="ghost" onClick={() => void handleRefresh()}>
|
|
326
326
|
<Icon icon={IconRefresh} class="mr-1" />
|
|
327
|
-
{i18n
|
|
327
|
+
{i18n.t("crudDetail.refresh")}
|
|
328
328
|
</Button>
|
|
329
329
|
</Show>
|
|
330
330
|
<Show when={defs().tools}>{(toolsDef) => toolsDef().children}</Show>
|
|
@@ -343,7 +343,7 @@ const CrudDetailBase = <TData extends object>(props: CrudDetailProps<TData>) =>
|
|
|
343
343
|
<Show when={info()?.lastModifiedAt}>
|
|
344
344
|
{(_) => (
|
|
345
345
|
<div class="px-2 pb-1 text-xs text-base-400">
|
|
346
|
-
{i18n
|
|
346
|
+
{i18n.t("crudDetail.lastModified")}: {info()!.lastModifiedAt!.toFormatString("yyyy-MM-dd HH:mm")}
|
|
347
347
|
<Show when={info()?.lastModifiedBy}> ({info()!.lastModifiedBy})</Show>
|
|
348
348
|
</div>
|
|
349
349
|
)}
|
|
@@ -352,8 +352,8 @@ const CrudDetailBase = <TData extends object>(props: CrudDetailProps<TData>) =>
|
|
|
352
352
|
{/* After (outside form) */}
|
|
353
353
|
<Show when={defs().after}>{(afterDef) => afterDef().children}</Show>
|
|
354
354
|
|
|
355
|
-
{/*
|
|
356
|
-
<Show when={
|
|
355
|
+
{/* Dialog mode: bottom bar */}
|
|
356
|
+
<Show when={isInDialog && canEdit()}>
|
|
357
357
|
<div class="flex gap-2 border-t border-base-200 px-3 py-1.5">
|
|
358
358
|
<div class="flex-1" />
|
|
359
359
|
<Show
|
|
@@ -362,7 +362,7 @@ const CrudDetailBase = <TData extends object>(props: CrudDetailProps<TData>) =>
|
|
|
362
362
|
{(_) => (
|
|
363
363
|
<Button variant={"solid"} theme="danger" onClick={() => void handleToggleDelete()}>
|
|
364
364
|
<Icon icon={info()!.isDeleted ? IconTrashOff : IconTrash} class="mr-1" />
|
|
365
|
-
{info()!.isDeleted ?
|
|
365
|
+
{info()!.isDeleted ? i18n.t("crudDetail.restore") : i18n.t("crudDetail.delete")}
|
|
366
366
|
</Button>
|
|
367
367
|
)}
|
|
368
368
|
</Show>
|
|
@@ -374,7 +374,7 @@ const CrudDetailBase = <TData extends object>(props: CrudDetailProps<TData>) =>
|
|
|
374
374
|
class={"gap-1"}
|
|
375
375
|
>
|
|
376
376
|
<Icon icon={IconCheck} />
|
|
377
|
-
{i18n
|
|
377
|
+
{i18n.t("crudDetail.confirm")}
|
|
378
378
|
</Button>
|
|
379
379
|
</Show>
|
|
380
380
|
</div>
|
|
@@ -21,7 +21,7 @@ import { DataSheet } from "../../data/sheet/DataSheet";
|
|
|
21
21
|
import { DataSheetColumn } from "../../data/sheet/DataSheetColumn";
|
|
22
22
|
import { BusyContainer } from "../../feedback/busy/BusyContainer";
|
|
23
23
|
import { useNotification } from "../../feedback/notification/NotificationContext";
|
|
24
|
-
import {
|
|
24
|
+
import { useI18n } from "../../../providers/i18n/I18nContext";
|
|
25
25
|
import { Button } from "../../form-control/Button";
|
|
26
26
|
import { Icon } from "../../display/Icon";
|
|
27
27
|
import { FormGroup } from "../../layout/FormGroup";
|
|
@@ -85,7 +85,7 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
85
85
|
"items",
|
|
86
86
|
"onItemsChange",
|
|
87
87
|
"inlineEdit",
|
|
88
|
-
"
|
|
88
|
+
"dialogEdit",
|
|
89
89
|
"excel",
|
|
90
90
|
"selectMode",
|
|
91
91
|
"onSelect",
|
|
@@ -95,12 +95,12 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
95
95
|
]);
|
|
96
96
|
|
|
97
97
|
const noti = useNotification();
|
|
98
|
-
const i18n =
|
|
98
|
+
const i18n = useI18n();
|
|
99
99
|
const topbarCtx = useContext(TopbarContext);
|
|
100
100
|
const dialogInstance = useDialogInstance();
|
|
101
|
-
const
|
|
101
|
+
const isInDialog = dialogInstance !== undefined;
|
|
102
102
|
const isSelectMode = () => local.selectMode != null;
|
|
103
|
-
const canEdit = () => (isSelectMode() ? false : (local.editable ?? true));
|
|
103
|
+
const canEdit = () => (isInDialog && isSelectMode() ? false : (local.editable ?? true));
|
|
104
104
|
|
|
105
105
|
// -- Children Resolution --
|
|
106
106
|
const resolved = children(() => local.children);
|
|
@@ -168,7 +168,7 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
168
168
|
try {
|
|
169
169
|
await refresh();
|
|
170
170
|
} catch (err) {
|
|
171
|
-
noti.error(err, i18n
|
|
171
|
+
noti.error(err, i18n.t("crudSheet.lookupFailed"));
|
|
172
172
|
}
|
|
173
173
|
setBusyCount((c) => c - 1);
|
|
174
174
|
setReady(true);
|
|
@@ -192,7 +192,7 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
192
192
|
function checkIgnoreChanges(): boolean {
|
|
193
193
|
if (!local.inlineEdit) return true;
|
|
194
194
|
if (getItemDiffs().length === 0) return true;
|
|
195
|
-
return confirm(i18n
|
|
195
|
+
return confirm(i18n.t("crudSheet.discardChanges"));
|
|
196
196
|
}
|
|
197
197
|
|
|
198
198
|
// -- Filter --
|
|
@@ -243,18 +243,18 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
243
243
|
const diffs = getItemDiffs();
|
|
244
244
|
|
|
245
245
|
if (diffs.length === 0) {
|
|
246
|
-
noti.info(i18n
|
|
246
|
+
noti.info(i18n.t("crudSheet.notice"), i18n.t("crudSheet.noChanges"));
|
|
247
247
|
return;
|
|
248
248
|
}
|
|
249
249
|
|
|
250
250
|
setBusyCount((c) => c + 1);
|
|
251
251
|
try {
|
|
252
252
|
await local.inlineEdit.submit(diffs);
|
|
253
|
-
noti.success(i18n
|
|
253
|
+
noti.success(i18n.t("crudSheet.saveCompleted"), i18n.t("crudSheet.saveSuccess"));
|
|
254
254
|
await refresh();
|
|
255
255
|
local.onSubmitted?.();
|
|
256
256
|
} catch (err) {
|
|
257
|
-
noti.error(err, i18n
|
|
257
|
+
noti.error(err, i18n.t("crudSheet.saveFailed"));
|
|
258
258
|
}
|
|
259
259
|
setBusyCount((c) => c - 1);
|
|
260
260
|
}
|
|
@@ -264,47 +264,47 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
264
264
|
await handleSave();
|
|
265
265
|
}
|
|
266
266
|
|
|
267
|
-
// --
|
|
267
|
+
// -- Dialog Edit --
|
|
268
268
|
async function handleEditItem(item?: TItem) {
|
|
269
|
-
if (!local.
|
|
270
|
-
const result = await local.
|
|
269
|
+
if (!local.dialogEdit) return;
|
|
270
|
+
const result = await local.dialogEdit.editItem(item);
|
|
271
271
|
if (!result) return;
|
|
272
272
|
|
|
273
273
|
setBusyCount((c) => c + 1);
|
|
274
274
|
try {
|
|
275
275
|
await refresh();
|
|
276
276
|
} catch (err) {
|
|
277
|
-
noti.error(err, i18n
|
|
277
|
+
noti.error(err, i18n.t("crudSheet.lookupFailed"));
|
|
278
278
|
}
|
|
279
279
|
setBusyCount((c) => c - 1);
|
|
280
280
|
}
|
|
281
281
|
|
|
282
282
|
async function handleDeleteItems() {
|
|
283
|
-
if (!local.
|
|
284
|
-
const result = await local.
|
|
283
|
+
if (!local.dialogEdit?.deleteItems) return;
|
|
284
|
+
const result = await local.dialogEdit.deleteItems(selectedItems());
|
|
285
285
|
if (!result) return;
|
|
286
286
|
|
|
287
287
|
setBusyCount((c) => c + 1);
|
|
288
288
|
try {
|
|
289
289
|
await refresh();
|
|
290
|
-
noti.success(i18n
|
|
290
|
+
noti.success(i18n.t("crudSheet.deleteCompleted"), i18n.t("crudSheet.deleteSuccess"));
|
|
291
291
|
} catch (err) {
|
|
292
|
-
noti.error(err, i18n
|
|
292
|
+
noti.error(err, i18n.t("crudSheet.deleteFailed"));
|
|
293
293
|
}
|
|
294
294
|
setBusyCount((c) => c - 1);
|
|
295
295
|
}
|
|
296
296
|
|
|
297
297
|
async function handleRestoreItems() {
|
|
298
|
-
if (!local.
|
|
299
|
-
const result = await local.
|
|
298
|
+
if (!local.dialogEdit?.restoreItems) return;
|
|
299
|
+
const result = await local.dialogEdit.restoreItems(selectedItems());
|
|
300
300
|
if (!result) return;
|
|
301
301
|
|
|
302
302
|
setBusyCount((c) => c + 1);
|
|
303
303
|
try {
|
|
304
304
|
await refresh();
|
|
305
|
-
noti.success(i18n
|
|
305
|
+
noti.success(i18n.t("crudSheet.restoreCompleted"), i18n.t("crudSheet.restoreSuccess"));
|
|
306
306
|
} catch (err) {
|
|
307
|
-
noti.error(err, i18n
|
|
307
|
+
noti.error(err, i18n.t("crudSheet.restoreFailed"));
|
|
308
308
|
}
|
|
309
309
|
setBusyCount((c) => c - 1);
|
|
310
310
|
}
|
|
@@ -318,7 +318,7 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
318
318
|
const result = await local.search(lastFilter(), undefined, sorts());
|
|
319
319
|
await local.excel.download(result.items);
|
|
320
320
|
} catch (err) {
|
|
321
|
-
noti.error(err, i18n
|
|
321
|
+
noti.error(err, i18n.t("crudSheet.excelDownloadFailed"));
|
|
322
322
|
}
|
|
323
323
|
setBusyCount((c) => c - 1);
|
|
324
324
|
}
|
|
@@ -336,10 +336,10 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
336
336
|
setBusyCount((c) => c + 1);
|
|
337
337
|
try {
|
|
338
338
|
await local.excel!.upload!(file);
|
|
339
|
-
noti.success(i18n
|
|
339
|
+
noti.success(i18n.t("crudSheet.excelCompleted"), i18n.t("crudSheet.excelUploadSuccess"));
|
|
340
340
|
await refresh();
|
|
341
341
|
} catch (err) {
|
|
342
|
-
noti.error(err, i18n
|
|
342
|
+
noti.error(err, i18n.t("crudSheet.excelUploadFailed"));
|
|
343
343
|
}
|
|
344
344
|
setBusyCount((c) => c - 1);
|
|
345
345
|
};
|
|
@@ -413,7 +413,7 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
413
413
|
|
|
414
414
|
// -- Route Leave Guard --
|
|
415
415
|
// eslint-disable-next-line solid/reactivity -- inlineEdit is used only for initial value
|
|
416
|
-
if (!
|
|
416
|
+
if (!isInDialog && local.inlineEdit) {
|
|
417
417
|
try {
|
|
418
418
|
useBeforeLeave((e) => {
|
|
419
419
|
if (!checkIgnoreChanges()) {
|
|
@@ -437,12 +437,12 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
437
437
|
onClick={() => formRef?.requestSubmit()}
|
|
438
438
|
>
|
|
439
439
|
<Icon icon={IconDeviceFloppy} class="mr-1" />
|
|
440
|
-
{i18n
|
|
440
|
+
{i18n.t("crudSheet.save")}
|
|
441
441
|
</Button>
|
|
442
442
|
</Show>
|
|
443
443
|
<Button size="lg" variant="ghost" theme="info" onClick={handleRefresh}>
|
|
444
444
|
<Icon icon={IconRefresh} class="mr-1" />
|
|
445
|
-
{i18n
|
|
445
|
+
{i18n.t("crudSheet.refresh")}
|
|
446
446
|
</Button>
|
|
447
447
|
</>
|
|
448
448
|
));
|
|
@@ -475,8 +475,8 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
475
475
|
|
|
476
476
|
return (
|
|
477
477
|
<>
|
|
478
|
-
{/*
|
|
479
|
-
<Show when={
|
|
478
|
+
{/* Dialog mode: Dialog.Action (refresh button in header) */}
|
|
479
|
+
<Show when={isInDialog}>
|
|
480
480
|
<Dialog.Action>
|
|
481
481
|
<button
|
|
482
482
|
class="flex items-center px-2 text-base-400 hover:text-base-600"
|
|
@@ -493,7 +493,7 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
493
493
|
class={clsx("flex h-full flex-col", local.class)}
|
|
494
494
|
>
|
|
495
495
|
{/* Control mode: inline save/refresh bar */}
|
|
496
|
-
<Show when={!
|
|
496
|
+
<Show when={!isInDialog && !topbarCtx}>
|
|
497
497
|
<div class="flex gap-2 p-2 pb-0">
|
|
498
498
|
<Show when={canEdit() && local.inlineEdit}>
|
|
499
499
|
<Button
|
|
@@ -503,12 +503,12 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
503
503
|
onClick={() => formRef?.requestSubmit()}
|
|
504
504
|
>
|
|
505
505
|
<Icon icon={IconDeviceFloppy} class="mr-1" />
|
|
506
|
-
{i18n
|
|
506
|
+
{i18n.t("crudSheet.save")}
|
|
507
507
|
</Button>
|
|
508
508
|
</Show>
|
|
509
509
|
<Button size="sm" theme="info" variant="ghost" onClick={handleRefresh}>
|
|
510
510
|
<Icon icon={IconRefresh} class="mr-1" />
|
|
511
|
-
{i18n
|
|
511
|
+
{i18n.t("crudSheet.refresh")}
|
|
512
512
|
</Button>
|
|
513
513
|
</div>
|
|
514
514
|
</Show>
|
|
@@ -524,7 +524,7 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
524
524
|
<FormGroup.Item>
|
|
525
525
|
<Button type="submit" theme="info" variant="solid">
|
|
526
526
|
<Icon icon={IconSearch} class="mr-1" />
|
|
527
|
-
{i18n
|
|
527
|
+
{i18n.t("crudSheet.search")}
|
|
528
528
|
</Button>
|
|
529
529
|
</FormGroup.Item>
|
|
530
530
|
{filterDef().children(filter, setFilter)}
|
|
@@ -534,18 +534,18 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
534
534
|
</Show>
|
|
535
535
|
|
|
536
536
|
{/* Toolbar */}
|
|
537
|
-
<Show when={!isSelectMode()}>
|
|
537
|
+
<Show when={!(isInDialog && isSelectMode())}>
|
|
538
538
|
<div class="flex gap-2 p-2 pb-0">
|
|
539
539
|
<Show when={!local.hideAutoTools}>
|
|
540
540
|
{/* Inline edit buttons */}
|
|
541
541
|
<Show when={canEdit() && local.inlineEdit}>
|
|
542
542
|
<Button size="sm" theme="primary" variant="ghost" onClick={handleAddRow}>
|
|
543
|
-
<Icon icon={IconPlus} class="mr-1" />{i18n
|
|
543
|
+
<Icon icon={IconPlus} class="mr-1" />{i18n.t("crudSheet.addRow")}
|
|
544
544
|
</Button>
|
|
545
545
|
</Show>
|
|
546
546
|
|
|
547
|
-
{/*
|
|
548
|
-
<Show when={canEdit() && local.
|
|
547
|
+
{/* Dialog edit buttons */}
|
|
548
|
+
<Show when={canEdit() && local.dialogEdit}>
|
|
549
549
|
<Button
|
|
550
550
|
size="sm"
|
|
551
551
|
theme="primary"
|
|
@@ -553,10 +553,10 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
553
553
|
onClick={() => void handleEditItem()}
|
|
554
554
|
>
|
|
555
555
|
<Icon icon={IconPlus} class="mr-1" />
|
|
556
|
-
{i18n
|
|
556
|
+
{i18n.t("crudSheet.register")}
|
|
557
557
|
</Button>
|
|
558
558
|
</Show>
|
|
559
|
-
<Show when={canEdit() && local.
|
|
559
|
+
<Show when={canEdit() && local.dialogEdit?.deleteItems}>
|
|
560
560
|
<Button
|
|
561
561
|
size="sm"
|
|
562
562
|
theme="danger"
|
|
@@ -572,10 +572,10 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
572
572
|
}
|
|
573
573
|
>
|
|
574
574
|
<Icon icon={IconTrash} class="mr-1" />
|
|
575
|
-
{i18n
|
|
575
|
+
{i18n.t("crudSheet.deleteSelected")}
|
|
576
576
|
</Button>
|
|
577
577
|
</Show>
|
|
578
|
-
<Show when={canEdit() && local.
|
|
578
|
+
<Show when={canEdit() && local.dialogEdit?.restoreItems}>
|
|
579
579
|
<Button
|
|
580
580
|
size="sm"
|
|
581
581
|
theme="warning"
|
|
@@ -587,7 +587,7 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
587
587
|
}
|
|
588
588
|
>
|
|
589
589
|
<Icon icon={IconTrashOff} class="mr-1" />
|
|
590
|
-
{i18n
|
|
590
|
+
{i18n.t("crudSheet.restoreSelected")}
|
|
591
591
|
</Button>
|
|
592
592
|
</Show>
|
|
593
593
|
|
|
@@ -595,13 +595,13 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
595
595
|
<Show when={canEdit() && local.excel?.upload}>
|
|
596
596
|
<Button size="sm" theme="success" variant="ghost" onClick={handleExcelUpload}>
|
|
597
597
|
<Icon icon={IconUpload} class="mr-1" />
|
|
598
|
-
{i18n
|
|
598
|
+
{i18n.t("crudSheet.excelUpload")}
|
|
599
599
|
</Button>
|
|
600
600
|
</Show>
|
|
601
601
|
<Show when={local.excel}>
|
|
602
602
|
<Button size="sm" theme="success" variant="ghost" onClick={handleExcelDownload}>
|
|
603
603
|
<Icon icon={IconFileExcel} class="mr-1" />
|
|
604
|
-
{i18n
|
|
604
|
+
{i18n.t("crudSheet.excelDownload")}
|
|
605
605
|
</Button>
|
|
606
606
|
</Show>
|
|
607
607
|
</Show>
|
|
@@ -626,7 +626,7 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
626
626
|
selectMode={
|
|
627
627
|
isSelectMode()
|
|
628
628
|
? local.selectMode
|
|
629
|
-
: local.
|
|
629
|
+
: local.dialogEdit?.deleteItems != null || local.dialogEdit?.restoreItems != null
|
|
630
630
|
? "multiple"
|
|
631
631
|
: undefined
|
|
632
632
|
}
|
|
@@ -689,9 +689,9 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
689
689
|
},
|
|
690
690
|
};
|
|
691
691
|
|
|
692
|
-
//
|
|
692
|
+
// dialogEdit editable column -- wrap with edit link
|
|
693
693
|
if (
|
|
694
|
-
local.
|
|
694
|
+
local.dialogEdit &&
|
|
695
695
|
col.editTrigger &&
|
|
696
696
|
canEdit() &&
|
|
697
697
|
(local.itemEditable?.(dsCtx.item) ?? true)
|
|
@@ -721,7 +721,7 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
721
721
|
|
|
722
722
|
{/* Auto lastModified columns */}
|
|
723
723
|
<Show when={local.lastModifiedAtProp}>
|
|
724
|
-
<DataSheetColumn<TItem> key={local.lastModifiedAtProp!} header={i18n
|
|
724
|
+
<DataSheetColumn<TItem> key={local.lastModifiedAtProp!} header={i18n.t("crudSheet.lastModified")} hidden>
|
|
725
725
|
{(dsCtx) => (
|
|
726
726
|
<div class="px-2 py-1 text-center">
|
|
727
727
|
{(
|
|
@@ -735,7 +735,7 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
735
735
|
</Show>
|
|
736
736
|
|
|
737
737
|
<Show when={local.lastModifiedByProp}>
|
|
738
|
-
<DataSheetColumn<TItem> key={local.lastModifiedByProp!} header={i18n
|
|
738
|
+
<DataSheetColumn<TItem> key={local.lastModifiedByProp!} header={i18n.t("crudSheet.modifiedBy")} hidden>
|
|
739
739
|
{(dsCtx) => (
|
|
740
740
|
<div class="px-2 py-1 text-center">
|
|
741
741
|
{objGetChainValue(dsCtx.item, local.lastModifiedByProp!, true) as string}
|
|
@@ -747,17 +747,17 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
747
747
|
</form>
|
|
748
748
|
|
|
749
749
|
{/* Select mode bottom bar */}
|
|
750
|
-
<Show when={
|
|
750
|
+
<Show when={isInDialog && isSelectMode()}>
|
|
751
751
|
<div class="flex gap-2 border-t p-2">
|
|
752
752
|
<div class="flex-1" />
|
|
753
753
|
<Show when={selectedItems().length > 0}>
|
|
754
754
|
<Button size="sm" theme="danger" onClick={handleSelectCancel}>
|
|
755
|
-
{local.selectMode === "multiple" ?
|
|
755
|
+
{local.selectMode === "multiple" ? i18n.t("crudSheet.deselectAll") : i18n.t("crudSheet.deselect")}
|
|
756
756
|
</Button>
|
|
757
757
|
</Show>
|
|
758
758
|
<Show when={local.selectMode === "multiple"}>
|
|
759
759
|
<Button size="sm" theme="primary" onClick={handleSelectConfirm}>
|
|
760
|
-
{i18n
|
|
760
|
+
{i18n.t("crudSheet.confirm")} ({selectedItems().length})
|
|
761
761
|
</Button>
|
|
762
762
|
</Show>
|
|
763
763
|
</div>
|
|
@@ -19,7 +19,7 @@ export interface InlineEditConfig<TItem> {
|
|
|
19
19
|
diffsExcludes?: string[];
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
export interface
|
|
22
|
+
export interface DialogEditConfig<TItem> {
|
|
23
23
|
editItem: (item?: TItem) => Promise<boolean | undefined>;
|
|
24
24
|
deleteItems?: (items: TItem[]) => Promise<boolean>;
|
|
25
25
|
restoreItems?: (items: TItem[]) => Promise<boolean>;
|
|
@@ -70,9 +70,9 @@ export type CrudSheetProps<TItem, TFilter extends Record<string, any>> = CrudShe
|
|
|
70
70
|
TFilter
|
|
71
71
|
> &
|
|
72
72
|
(
|
|
73
|
-
| { inlineEdit: InlineEditConfig<TItem>;
|
|
74
|
-
| {
|
|
75
|
-
| { inlineEdit?: never;
|
|
73
|
+
| { inlineEdit: InlineEditConfig<TItem>; dialogEdit?: never }
|
|
74
|
+
| { dialogEdit: DialogEditConfig<TItem>; inlineEdit?: never }
|
|
75
|
+
| { inlineEdit?: never; dialogEdit?: never }
|
|
76
76
|
);
|
|
77
77
|
|
|
78
78
|
interface CrudSheetBaseProps<TItem, TFilter extends Record<string, any>> {
|