@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
|
@@ -1,45 +1,51 @@
|
|
|
1
1
|
import { render, fireEvent } from "@solidjs/testing-library";
|
|
2
|
-
import { describe, it, expect, vi } from "vitest";
|
|
2
|
+
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
3
3
|
import { createSignal } from "solid-js";
|
|
4
4
|
import { DateTime } from "@simplysm/core-common";
|
|
5
5
|
import { DateTimePicker } from "../../../../src/components/form-control/field/DateTimePicker";
|
|
6
|
+
import { I18nProvider } from "../../../../src/providers/i18n/I18nContext";
|
|
7
|
+
import { ConfigProvider } from "../../../../src/providers/ConfigContext";
|
|
6
8
|
|
|
7
9
|
describe("DateTimePicker component", () => {
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
localStorage.setItem("test.i18n-locale", JSON.stringify("en"));
|
|
12
|
+
});
|
|
13
|
+
|
|
8
14
|
describe("basic rendering", () => {
|
|
9
15
|
it("renders input type=datetime-local when unit=minute", () => {
|
|
10
|
-
const { container } = render(() => <DateTimePicker unit="minute"
|
|
16
|
+
const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DateTimePicker unit="minute" /></I18nProvider></ConfigProvider>);
|
|
11
17
|
const input = container.querySelector("input") as HTMLInputElement;
|
|
12
18
|
expect(input).toBeTruthy();
|
|
13
19
|
expect(input.type).toBe("datetime-local");
|
|
14
20
|
});
|
|
15
21
|
|
|
16
22
|
it("renders input type=datetime-local when unit=second", () => {
|
|
17
|
-
const { container } = render(() => <DateTimePicker unit="second"
|
|
23
|
+
const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DateTimePicker unit="second" /></I18nProvider></ConfigProvider>);
|
|
18
24
|
const input = container.querySelector("input") as HTMLInputElement;
|
|
19
25
|
expect(input).toBeTruthy();
|
|
20
26
|
expect(input.type).toBe("datetime-local");
|
|
21
27
|
});
|
|
22
28
|
|
|
23
29
|
it("defaults unit to minute", () => {
|
|
24
|
-
const { container } = render(() => <DateTimePicker
|
|
30
|
+
const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DateTimePicker /></I18nProvider></ConfigProvider>);
|
|
25
31
|
const input = container.querySelector("input") as HTMLInputElement;
|
|
26
32
|
expect(input.type).toBe("datetime-local");
|
|
27
33
|
});
|
|
28
34
|
|
|
29
35
|
it("defaults autocomplete to one-time-code", () => {
|
|
30
|
-
const { container } = render(() => <DateTimePicker
|
|
36
|
+
const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DateTimePicker /></I18nProvider></ConfigProvider>);
|
|
31
37
|
const input = container.querySelector("input") as HTMLInputElement;
|
|
32
38
|
expect(input.autocomplete).toBe("one-time-code");
|
|
33
39
|
});
|
|
34
40
|
|
|
35
41
|
it("sets step=1 when unit=second", () => {
|
|
36
|
-
const { container } = render(() => <DateTimePicker unit="second"
|
|
42
|
+
const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DateTimePicker unit="second" /></I18nProvider></ConfigProvider>);
|
|
37
43
|
const input = container.querySelector("input") as HTMLInputElement;
|
|
38
44
|
expect(input.step).toBe("1");
|
|
39
45
|
});
|
|
40
46
|
|
|
41
47
|
it("does not set step when unit=minute", () => {
|
|
42
|
-
const { container } = render(() => <DateTimePicker unit="minute"
|
|
48
|
+
const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DateTimePicker unit="minute" /></I18nProvider></ConfigProvider>);
|
|
43
49
|
const input = container.querySelector("input") as HTMLInputElement;
|
|
44
50
|
expect(input.step).toBe("");
|
|
45
51
|
});
|
|
@@ -48,14 +54,14 @@ describe("DateTimePicker component", () => {
|
|
|
48
54
|
describe("value conversion", () => {
|
|
49
55
|
it("displays DateTime in yyyy-MM-ddTHH:mm format for minute unit", () => {
|
|
50
56
|
const dateTime = new DateTime(2025, 3, 15, 10, 30, 45);
|
|
51
|
-
const { container } = render(() => <DateTimePicker unit="minute" value={dateTime}
|
|
57
|
+
const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DateTimePicker unit="minute" value={dateTime} /></I18nProvider></ConfigProvider>);
|
|
52
58
|
const input = container.querySelector("input") as HTMLInputElement;
|
|
53
59
|
expect(input.value).toBe("2025-03-15T10:30");
|
|
54
60
|
});
|
|
55
61
|
|
|
56
62
|
it("displays DateTime in yyyy-MM-ddTHH:mm:ss format for second unit", () => {
|
|
57
63
|
const dateTime = new DateTime(2025, 3, 15, 10, 30, 45);
|
|
58
|
-
const { container } = render(() => <DateTimePicker unit="second" value={dateTime}
|
|
64
|
+
const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DateTimePicker unit="second" value={dateTime} /></I18nProvider></ConfigProvider>);
|
|
59
65
|
const input = container.querySelector("input") as HTMLInputElement;
|
|
60
66
|
expect(input.value).toBe("2025-03-15T10:30:45");
|
|
61
67
|
});
|
|
@@ -63,7 +69,7 @@ describe("DateTimePicker component", () => {
|
|
|
63
69
|
it("passes DateTime converted from minute input to onValueChange", () => {
|
|
64
70
|
const handleChange = vi.fn();
|
|
65
71
|
const { container } = render(() => (
|
|
66
|
-
<DateTimePicker unit="minute" onValueChange={handleChange}
|
|
72
|
+
<ConfigProvider clientName="test"><I18nProvider><DateTimePicker unit="minute" onValueChange={handleChange} /></I18nProvider></ConfigProvider>
|
|
67
73
|
));
|
|
68
74
|
const input = container.querySelector("input") as HTMLInputElement;
|
|
69
75
|
|
|
@@ -82,7 +88,7 @@ describe("DateTimePicker component", () => {
|
|
|
82
88
|
it("passes DateTime converted from second input to onValueChange", () => {
|
|
83
89
|
const handleChange = vi.fn();
|
|
84
90
|
const { container } = render(() => (
|
|
85
|
-
<DateTimePicker unit="second" onValueChange={handleChange}
|
|
91
|
+
<ConfigProvider clientName="test"><I18nProvider><DateTimePicker unit="second" onValueChange={handleChange} /></I18nProvider></ConfigProvider>
|
|
86
92
|
));
|
|
87
93
|
const input = container.querySelector("input") as HTMLInputElement;
|
|
88
94
|
|
|
@@ -102,7 +108,7 @@ describe("DateTimePicker component", () => {
|
|
|
102
108
|
const handleChange = vi.fn();
|
|
103
109
|
const dateTime = new DateTime(2025, 3, 15, 10, 30, 45);
|
|
104
110
|
const { container } = render(() => (
|
|
105
|
-
<DateTimePicker unit="minute" value={dateTime} onValueChange={handleChange}
|
|
111
|
+
<ConfigProvider clientName="test"><I18nProvider><DateTimePicker unit="minute" value={dateTime} onValueChange={handleChange} /></I18nProvider></ConfigProvider>
|
|
106
112
|
));
|
|
107
113
|
const input = container.querySelector("input") as HTMLInputElement;
|
|
108
114
|
|
|
@@ -115,28 +121,28 @@ describe("DateTimePicker component", () => {
|
|
|
115
121
|
describe("min/max props", () => {
|
|
116
122
|
it("converts min to string for minute unit", () => {
|
|
117
123
|
const minDateTime = new DateTime(2025, 1, 1, 0, 0, 0);
|
|
118
|
-
const { container } = render(() => <DateTimePicker unit="minute" min={minDateTime}
|
|
124
|
+
const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DateTimePicker unit="minute" min={minDateTime} /></I18nProvider></ConfigProvider>);
|
|
119
125
|
const input = container.querySelector("input") as HTMLInputElement;
|
|
120
126
|
expect(input.min).toBe("2025-01-01T00:00");
|
|
121
127
|
});
|
|
122
128
|
|
|
123
129
|
it("converts max to string for minute unit", () => {
|
|
124
130
|
const maxDateTime = new DateTime(2025, 12, 31, 23, 59, 0);
|
|
125
|
-
const { container } = render(() => <DateTimePicker unit="minute" max={maxDateTime}
|
|
131
|
+
const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DateTimePicker unit="minute" max={maxDateTime} /></I18nProvider></ConfigProvider>);
|
|
126
132
|
const input = container.querySelector("input") as HTMLInputElement;
|
|
127
133
|
expect(input.max).toBe("2025-12-31T23:59");
|
|
128
134
|
});
|
|
129
135
|
|
|
130
136
|
it("includes seconds in min for second unit", () => {
|
|
131
137
|
const minDateTime = new DateTime(2025, 1, 1, 0, 0, 30);
|
|
132
|
-
const { container } = render(() => <DateTimePicker unit="second" min={minDateTime}
|
|
138
|
+
const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DateTimePicker unit="second" min={minDateTime} /></I18nProvider></ConfigProvider>);
|
|
133
139
|
const input = container.querySelector("input") as HTMLInputElement;
|
|
134
140
|
expect(input.min).toBe("2025-01-01T00:00:30");
|
|
135
141
|
});
|
|
136
142
|
|
|
137
143
|
it("includes seconds in max for second unit", () => {
|
|
138
144
|
const maxDateTime = new DateTime(2025, 12, 31, 23, 59, 59);
|
|
139
|
-
const { container } = render(() => <DateTimePicker unit="second" max={maxDateTime}
|
|
145
|
+
const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DateTimePicker unit="second" max={maxDateTime} /></I18nProvider></ConfigProvider>);
|
|
140
146
|
const input = container.querySelector("input") as HTMLInputElement;
|
|
141
147
|
expect(input.max).toBe("2025-12-31T23:59:59");
|
|
142
148
|
});
|
|
@@ -148,7 +154,7 @@ describe("DateTimePicker component", () => {
|
|
|
148
154
|
new DateTime(2025, 1, 1, 10, 0, 0),
|
|
149
155
|
);
|
|
150
156
|
const { container } = render(() => (
|
|
151
|
-
<DateTimePicker unit="minute" value={value()} onValueChange={setValue}
|
|
157
|
+
<ConfigProvider clientName="test"><I18nProvider><DateTimePicker unit="minute" value={value()} onValueChange={setValue} /></I18nProvider></ConfigProvider>
|
|
152
158
|
));
|
|
153
159
|
const input = container.querySelector("input") as HTMLInputElement;
|
|
154
160
|
|
|
@@ -162,7 +168,7 @@ describe("DateTimePicker component", () => {
|
|
|
162
168
|
describe("uncontrolled pattern", () => {
|
|
163
169
|
it("manages value internally without onValueChange", () => {
|
|
164
170
|
const { container } = render(() => (
|
|
165
|
-
<DateTimePicker unit="minute" value={new DateTime(2025, 1, 1, 10, 0, 0)}
|
|
171
|
+
<ConfigProvider clientName="test"><I18nProvider><DateTimePicker unit="minute" value={new DateTime(2025, 1, 1, 10, 0, 0)} /></I18nProvider></ConfigProvider>
|
|
166
172
|
));
|
|
167
173
|
const input = container.querySelector("input") as HTMLInputElement;
|
|
168
174
|
|
|
@@ -176,7 +182,7 @@ describe("DateTimePicker component", () => {
|
|
|
176
182
|
describe("disabled state", () => {
|
|
177
183
|
it("renders as div when disabled=true", () => {
|
|
178
184
|
const { container } = render(() => (
|
|
179
|
-
<DateTimePicker disabled value={new DateTime(2025, 3, 15, 10, 30, 0)}
|
|
185
|
+
<ConfigProvider clientName="test"><I18nProvider><DateTimePicker disabled value={new DateTime(2025, 3, 15, 10, 30, 0)} /></I18nProvider></ConfigProvider>
|
|
180
186
|
));
|
|
181
187
|
const input = container.querySelector("input:not([aria-hidden])");
|
|
182
188
|
const div = container.querySelector("div.sd-datetime-field");
|
|
@@ -187,14 +193,14 @@ describe("DateTimePicker component", () => {
|
|
|
187
193
|
|
|
188
194
|
it("displays value when disabled", () => {
|
|
189
195
|
const { getByText } = render(() => (
|
|
190
|
-
<DateTimePicker unit="minute" disabled value={new DateTime(2025, 3, 15, 10, 30, 0)}
|
|
196
|
+
<ConfigProvider clientName="test"><I18nProvider><DateTimePicker unit="minute" disabled value={new DateTime(2025, 3, 15, 10, 30, 0)} /></I18nProvider></ConfigProvider>
|
|
191
197
|
));
|
|
192
198
|
expect(getByText("2025-03-15T10:30")).toBeTruthy();
|
|
193
199
|
});
|
|
194
200
|
|
|
195
201
|
it("applies disabled style", () => {
|
|
196
202
|
const { container } = render(() => (
|
|
197
|
-
<DateTimePicker disabled value={new DateTime(2025, 3, 15, 10, 30, 0)}
|
|
203
|
+
<ConfigProvider clientName="test"><I18nProvider><DateTimePicker disabled value={new DateTime(2025, 3, 15, 10, 30, 0)} /></I18nProvider></ConfigProvider>
|
|
198
204
|
));
|
|
199
205
|
const div = container.querySelector("div.sd-datetime-field") as HTMLElement;
|
|
200
206
|
expect(div.classList.contains("bg-base-100")).toBe(true);
|
|
@@ -204,7 +210,7 @@ describe("DateTimePicker component", () => {
|
|
|
204
210
|
describe("readonly state", () => {
|
|
205
211
|
it("renders as div when readonly=true", () => {
|
|
206
212
|
const { container } = render(() => (
|
|
207
|
-
<DateTimePicker readonly value={new DateTime(2025, 3, 15, 10, 30, 0)}
|
|
213
|
+
<ConfigProvider clientName="test"><I18nProvider><DateTimePicker readonly value={new DateTime(2025, 3, 15, 10, 30, 0)} /></I18nProvider></ConfigProvider>
|
|
208
214
|
));
|
|
209
215
|
const input = container.querySelector("input:not([aria-hidden])");
|
|
210
216
|
const div = container.querySelector("div.sd-datetime-field");
|
|
@@ -215,7 +221,7 @@ describe("DateTimePicker component", () => {
|
|
|
215
221
|
|
|
216
222
|
it("displays value when readonly", () => {
|
|
217
223
|
const { getByText } = render(() => (
|
|
218
|
-
<DateTimePicker unit="minute" readonly value={new DateTime(2025, 3, 15, 10, 30, 0)}
|
|
224
|
+
<ConfigProvider clientName="test"><I18nProvider><DateTimePicker unit="minute" readonly value={new DateTime(2025, 3, 15, 10, 30, 0)} /></I18nProvider></ConfigProvider>
|
|
219
225
|
));
|
|
220
226
|
expect(getByText("2025-03-15T10:30")).toBeTruthy();
|
|
221
227
|
});
|
|
@@ -223,13 +229,13 @@ describe("DateTimePicker component", () => {
|
|
|
223
229
|
|
|
224
230
|
describe("size option", () => {
|
|
225
231
|
it("applies small padding when size=sm", () => {
|
|
226
|
-
const { container } = render(() => <DateTimePicker size="sm"
|
|
232
|
+
const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DateTimePicker size="sm" /></I18nProvider></ConfigProvider>);
|
|
227
233
|
const wrapper = container.firstChild as HTMLElement;
|
|
228
234
|
expect(wrapper.classList.contains("py-0.5")).toBe(true);
|
|
229
235
|
});
|
|
230
236
|
|
|
231
237
|
it("applies large padding when size=lg", () => {
|
|
232
|
-
const { container } = render(() => <DateTimePicker size="lg"
|
|
238
|
+
const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DateTimePicker size="lg" /></I18nProvider></ConfigProvider>);
|
|
233
239
|
const wrapper = container.firstChild as HTMLElement;
|
|
234
240
|
expect(wrapper.classList.contains("py-2")).toBe(true);
|
|
235
241
|
});
|
|
@@ -237,7 +243,7 @@ describe("DateTimePicker component", () => {
|
|
|
237
243
|
|
|
238
244
|
describe("inset style", () => {
|
|
239
245
|
it("applies relative to outer and inset style to content when inset=true", () => {
|
|
240
|
-
const { container } = render(() => <DateTimePicker inset
|
|
246
|
+
const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DateTimePicker inset /></I18nProvider></ConfigProvider>);
|
|
241
247
|
const outer = container.firstChild as HTMLElement;
|
|
242
248
|
expect(outer.classList.contains("relative")).toBe(true);
|
|
243
249
|
expect(outer.classList.contains("border-none")).toBe(false);
|
|
@@ -249,7 +255,7 @@ describe("DateTimePicker component", () => {
|
|
|
249
255
|
|
|
250
256
|
it("shows content div and no input when inset + readonly", () => {
|
|
251
257
|
const { container } = render(() => (
|
|
252
|
-
<DateTimePicker inset readonly value={new DateTime(2025, 3, 15, 14, 30, 0)}
|
|
258
|
+
<ConfigProvider clientName="test"><I18nProvider><DateTimePicker inset readonly value={new DateTime(2025, 3, 15, 14, 30, 0)} /></I18nProvider></ConfigProvider>
|
|
253
259
|
));
|
|
254
260
|
const outer = container.firstChild as HTMLElement;
|
|
255
261
|
expect(outer.classList.contains("relative")).toBe(true);
|
|
@@ -263,7 +269,7 @@ describe("DateTimePicker component", () => {
|
|
|
263
269
|
|
|
264
270
|
it("shows hidden content div and input when inset + editable", () => {
|
|
265
271
|
const { container } = render(() => (
|
|
266
|
-
<DateTimePicker inset value={new DateTime(2025, 3, 15, 14, 30, 0)}
|
|
272
|
+
<ConfigProvider clientName="test"><I18nProvider><DateTimePicker inset value={new DateTime(2025, 3, 15, 14, 30, 0)} /></I18nProvider></ConfigProvider>
|
|
267
273
|
));
|
|
268
274
|
const outer = container.firstChild as HTMLElement;
|
|
269
275
|
|
|
@@ -275,7 +281,7 @@ describe("DateTimePicker component", () => {
|
|
|
275
281
|
});
|
|
276
282
|
|
|
277
283
|
it("shows NBSP in content div when inset + empty value", () => {
|
|
278
|
-
const { container } = render(() => <DateTimePicker inset readonly
|
|
284
|
+
const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DateTimePicker inset readonly /></I18nProvider></ConfigProvider>);
|
|
279
285
|
const outer = container.firstChild as HTMLElement;
|
|
280
286
|
const contentDiv = outer.querySelector("[data-datetime-field-content]") as HTMLElement;
|
|
281
287
|
expect(contentDiv.textContent).toBe("\u00A0");
|
|
@@ -284,13 +290,13 @@ describe("DateTimePicker component", () => {
|
|
|
284
290
|
|
|
285
291
|
describe("dark mode style", () => {
|
|
286
292
|
it("applies dark mode border style", () => {
|
|
287
|
-
const { container } = render(() => <DateTimePicker
|
|
293
|
+
const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DateTimePicker /></I18nProvider></ConfigProvider>);
|
|
288
294
|
const wrapper = container.firstChild as HTMLElement;
|
|
289
295
|
expect(wrapper.classList.contains("dark:border-base-700")).toBe(true);
|
|
290
296
|
});
|
|
291
297
|
|
|
292
298
|
it("applies dark mode background style", () => {
|
|
293
|
-
const { container } = render(() => <DateTimePicker
|
|
299
|
+
const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DateTimePicker /></I18nProvider></ConfigProvider>);
|
|
294
300
|
const wrapper = container.firstChild as HTMLElement;
|
|
295
301
|
expect(wrapper.classList.contains("dark:bg-primary-950/30")).toBe(true);
|
|
296
302
|
});
|
|
@@ -299,7 +305,7 @@ describe("DateTimePicker component", () => {
|
|
|
299
305
|
describe("class merging", () => {
|
|
300
306
|
it("merges custom class with existing styles", () => {
|
|
301
307
|
// eslint-disable-next-line tailwindcss/no-custom-classname
|
|
302
|
-
const { container } = render(() => <DateTimePicker class="my-custom-class"
|
|
308
|
+
const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DateTimePicker class="my-custom-class" /></I18nProvider></ConfigProvider>);
|
|
303
309
|
const wrapper = container.firstChild as HTMLElement;
|
|
304
310
|
expect(wrapper.classList.contains("my-custom-class")).toBe(true);
|
|
305
311
|
});
|
|
@@ -307,14 +313,14 @@ describe("DateTimePicker component", () => {
|
|
|
307
313
|
|
|
308
314
|
describe("validation", () => {
|
|
309
315
|
it("sets error message when required and value is empty", () => {
|
|
310
|
-
const { container } = render(() => <DateTimePicker required value={undefined}
|
|
316
|
+
const { container } = render(() => <ConfigProvider clientName="test"><I18nProvider><DateTimePicker required value={undefined} /></I18nProvider></ConfigProvider>);
|
|
311
317
|
const hiddenInput = container.querySelector("input[aria-hidden='true']") as HTMLInputElement;
|
|
312
|
-
expect(hiddenInput.validationMessage).toBe("This
|
|
318
|
+
expect(hiddenInput.validationMessage).toBe("This is a required field");
|
|
313
319
|
});
|
|
314
320
|
|
|
315
321
|
it("is valid when required and value exists", () => {
|
|
316
322
|
const { container } = render(() => (
|
|
317
|
-
<DateTimePicker required value={new DateTime(2024, 1, 1, 0, 0, 0)}
|
|
323
|
+
<ConfigProvider clientName="test"><I18nProvider><DateTimePicker required value={new DateTime(2024, 1, 1, 0, 0, 0)} /></I18nProvider></ConfigProvider>
|
|
318
324
|
));
|
|
319
325
|
const hiddenInput = container.querySelector("input[aria-hidden='true']") as HTMLInputElement;
|
|
320
326
|
expect(hiddenInput.validity.valid).toBe(true);
|
|
@@ -322,10 +328,10 @@ describe("DateTimePicker component", () => {
|
|
|
322
328
|
|
|
323
329
|
it("sets error message when min is violated", () => {
|
|
324
330
|
const { container } = render(() => (
|
|
325
|
-
<DateTimePicker
|
|
331
|
+
<ConfigProvider clientName="test"><I18nProvider><DateTimePicker
|
|
326
332
|
min={new DateTime(2024, 6, 1, 0, 0, 0)}
|
|
327
333
|
value={new DateTime(2024, 1, 1, 0, 0, 0)}
|
|
328
|
-
|
|
334
|
+
/></I18nProvider></ConfigProvider>
|
|
329
335
|
));
|
|
330
336
|
const hiddenInput = container.querySelector("input[aria-hidden='true']") as HTMLInputElement;
|
|
331
337
|
expect(hiddenInput.validationMessage).not.toBe("");
|
|
@@ -333,10 +339,10 @@ describe("DateTimePicker component", () => {
|
|
|
333
339
|
|
|
334
340
|
it("is valid when min is satisfied", () => {
|
|
335
341
|
const { container } = render(() => (
|
|
336
|
-
<DateTimePicker
|
|
342
|
+
<ConfigProvider clientName="test"><I18nProvider><DateTimePicker
|
|
337
343
|
min={new DateTime(2024, 1, 1, 0, 0, 0)}
|
|
338
344
|
value={new DateTime(2024, 6, 1, 0, 0, 0)}
|
|
339
|
-
|
|
345
|
+
/></I18nProvider></ConfigProvider>
|
|
340
346
|
));
|
|
341
347
|
const hiddenInput = container.querySelector("input[aria-hidden='true']") as HTMLInputElement;
|
|
342
348
|
expect(hiddenInput.validity.valid).toBe(true);
|
|
@@ -344,10 +350,10 @@ describe("DateTimePicker component", () => {
|
|
|
344
350
|
|
|
345
351
|
it("sets error message when max is violated", () => {
|
|
346
352
|
const { container } = render(() => (
|
|
347
|
-
<DateTimePicker
|
|
353
|
+
<ConfigProvider clientName="test"><I18nProvider><DateTimePicker
|
|
348
354
|
max={new DateTime(2024, 6, 1, 0, 0, 0)}
|
|
349
355
|
value={new DateTime(2024, 12, 1, 0, 0, 0)}
|
|
350
|
-
|
|
356
|
+
/></I18nProvider></ConfigProvider>
|
|
351
357
|
));
|
|
352
358
|
const hiddenInput = container.querySelector("input[aria-hidden='true']") as HTMLInputElement;
|
|
353
359
|
expect(hiddenInput.validationMessage).not.toBe("");
|
|
@@ -355,10 +361,10 @@ describe("DateTimePicker component", () => {
|
|
|
355
361
|
|
|
356
362
|
it("is valid when max is satisfied", () => {
|
|
357
363
|
const { container } = render(() => (
|
|
358
|
-
<DateTimePicker
|
|
364
|
+
<ConfigProvider clientName="test"><I18nProvider><DateTimePicker
|
|
359
365
|
max={new DateTime(2024, 12, 31, 23, 59, 59)}
|
|
360
366
|
value={new DateTime(2024, 6, 1, 0, 0, 0)}
|
|
361
|
-
|
|
367
|
+
/></I18nProvider></ConfigProvider>
|
|
362
368
|
));
|
|
363
369
|
const hiddenInput = container.querySelector("input[aria-hidden='true']") as HTMLInputElement;
|
|
364
370
|
expect(hiddenInput.validity.valid).toBe(true);
|
|
@@ -366,7 +372,7 @@ describe("DateTimePicker component", () => {
|
|
|
366
372
|
|
|
367
373
|
it("sets error message returned by validate function", () => {
|
|
368
374
|
const { container } = render(() => (
|
|
369
|
-
<DateTimePicker value={new DateTime(2024, 1, 1, 0, 0, 0)} validate={() => "커스텀 에러"}
|
|
375
|
+
<ConfigProvider clientName="test"><I18nProvider><DateTimePicker value={new DateTime(2024, 1, 1, 0, 0, 0)} validate={() => "커스텀 에러"} /></I18nProvider></ConfigProvider>
|
|
370
376
|
));
|
|
371
377
|
const hiddenInput = container.querySelector("input[aria-hidden='true']") as HTMLInputElement;
|
|
372
378
|
expect(hiddenInput.validationMessage).toBe("커스텀 에러");
|
|
@@ -374,7 +380,7 @@ describe("DateTimePicker component", () => {
|
|
|
374
380
|
|
|
375
381
|
it("is valid when validate function returns undefined", () => {
|
|
376
382
|
const { container } = render(() => (
|
|
377
|
-
<DateTimePicker value={new DateTime(2024, 1, 1, 0, 0, 0)} validate={() => undefined}
|
|
383
|
+
<ConfigProvider clientName="test"><I18nProvider><DateTimePicker value={new DateTime(2024, 1, 1, 0, 0, 0)} validate={() => undefined} /></I18nProvider></ConfigProvider>
|
|
378
384
|
));
|
|
379
385
|
const hiddenInput = container.querySelector("input[aria-hidden='true']") as HTMLInputElement;
|
|
380
386
|
expect(hiddenInput.validity.valid).toBe(true);
|