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