@terreno/ui 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +203 -0
- package/README.md +160 -0
- package/dist/Accordion.d.ts +3 -0
- package/dist/Accordion.js +30 -0
- package/dist/Accordion.js.map +1 -0
- package/dist/ActionSheet.d.ts +169 -0
- package/dist/ActionSheet.js +637 -0
- package/dist/ActionSheet.js.map +1 -0
- package/dist/AddressField.d.ts +3 -0
- package/dist/AddressField.js +18 -0
- package/dist/AddressField.js.map +1 -0
- package/dist/Avatar.d.ts +3 -0
- package/dist/Avatar.js +189 -0
- package/dist/Avatar.js.map +1 -0
- package/dist/Badge.d.ts +3 -0
- package/dist/Badge.js +100 -0
- package/dist/Badge.js.map +1 -0
- package/dist/Banner.d.ts +4 -0
- package/dist/Banner.js +103 -0
- package/dist/Banner.js.map +1 -0
- package/dist/Body.d.ts +3 -0
- package/dist/Body.js +17 -0
- package/dist/Body.js.map +1 -0
- package/dist/BooleanField.d.ts +3 -0
- package/dist/BooleanField.js +89 -0
- package/dist/BooleanField.js.map +1 -0
- package/dist/Box.d.ts +3 -0
- package/dist/Box.js +289 -0
- package/dist/Box.js.map +1 -0
- package/dist/Button.d.ts +3 -0
- package/dist/Button.js +105 -0
- package/dist/Button.js.map +1 -0
- package/dist/Card.d.ts +2 -0
- package/dist/Card.js +18 -0
- package/dist/Card.js.map +1 -0
- package/dist/CheckBox.d.ts +3 -0
- package/dist/CheckBox.js +28 -0
- package/dist/CheckBox.js.map +1 -0
- package/dist/Common.d.ts +2325 -0
- package/dist/Common.js +47 -0
- package/dist/Common.js.map +1 -0
- package/dist/CommonIconTypes.d.ts +3 -0
- package/dist/CommonIconTypes.js +2 -0
- package/dist/CommonIconTypes.js.map +1 -0
- package/dist/Constants.d.ts +12685 -0
- package/dist/Constants.js +3310 -0
- package/dist/Constants.js.map +1 -0
- package/dist/CustomSelectField.d.ts +3 -0
- package/dist/CustomSelectField.js +59 -0
- package/dist/CustomSelectField.js.map +1 -0
- package/dist/DataTable.d.ts +3 -0
- package/dist/DataTable.js +190 -0
- package/dist/DataTable.js.map +1 -0
- package/dist/DateTimeActionSheet.d.ts +2 -0
- package/dist/DateTimeActionSheet.js +270 -0
- package/dist/DateTimeActionSheet.js.map +1 -0
- package/dist/DateTimeField.d.ts +3 -0
- package/dist/DateTimeField.js +514 -0
- package/dist/DateTimeField.js.map +1 -0
- package/dist/DateUtilities.d.ts +57 -0
- package/dist/DateUtilities.js +308 -0
- package/dist/DateUtilities.js.map +1 -0
- package/dist/DecimalRangeActionSheet.d.ts +6 -0
- package/dist/DecimalRangeActionSheet.js +45 -0
- package/dist/DecimalRangeActionSheet.js.map +1 -0
- package/dist/DismissButton.d.ts +3 -0
- package/dist/DismissButton.js +12 -0
- package/dist/DismissButton.js.map +1 -0
- package/dist/EmailField.d.ts +3 -0
- package/dist/EmailField.js +48 -0
- package/dist/EmailField.js.map +1 -0
- package/dist/EmojiSelector.d.ts +113 -0
- package/dist/EmojiSelector.js +322 -0
- package/dist/EmojiSelector.js.map +1 -0
- package/dist/ErrorBoundary.d.ts +19 -0
- package/dist/ErrorBoundary.js +30 -0
- package/dist/ErrorBoundary.js.map +1 -0
- package/dist/ErrorPage.d.ts +6 -0
- package/dist/ErrorPage.js +15 -0
- package/dist/ErrorPage.js.map +1 -0
- package/dist/Field.d.ts +3 -0
- package/dist/Field.js +80 -0
- package/dist/Field.js.map +1 -0
- package/dist/FlatList.d.ts +2 -0
- package/dist/FlatList.js +3 -0
- package/dist/FlatList.js.map +1 -0
- package/dist/Heading.d.ts +3 -0
- package/dist/Heading.js +43 -0
- package/dist/Heading.js.map +1 -0
- package/dist/HeightActionSheet.d.ts +11 -0
- package/dist/HeightActionSheet.js +46 -0
- package/dist/HeightActionSheet.js.map +1 -0
- package/dist/Hyperlink.d.ts +30 -0
- package/dist/Hyperlink.js +144 -0
- package/dist/Hyperlink.js.map +1 -0
- package/dist/Icon.d.ts +3 -0
- package/dist/Icon.js +15 -0
- package/dist/Icon.js.map +1 -0
- package/dist/IconButton.d.ts +3 -0
- package/dist/IconButton.js +111 -0
- package/dist/IconButton.js.map +1 -0
- package/dist/Image.d.ts +8 -0
- package/dist/Image.js +37 -0
- package/dist/Image.js.map +1 -0
- package/dist/ImageBackground.d.ts +10 -0
- package/dist/ImageBackground.js +9 -0
- package/dist/ImageBackground.js.map +1 -0
- package/dist/InfoModalIcon.d.ts +3 -0
- package/dist/InfoModalIcon.js +10 -0
- package/dist/InfoModalIcon.js.map +1 -0
- package/dist/InfoTooltipButton.d.ts +3 -0
- package/dist/InfoTooltipButton.js +6 -0
- package/dist/InfoTooltipButton.js.map +1 -0
- package/dist/Link.d.ts +3 -0
- package/dist/Link.js +10 -0
- package/dist/Link.js.map +1 -0
- package/dist/MarkdownView.d.ts +5 -0
- package/dist/MarkdownView.js +44 -0
- package/dist/MarkdownView.js.map +1 -0
- package/dist/MediaQuery.d.ts +4 -0
- package/dist/MediaQuery.js +52 -0
- package/dist/MediaQuery.js.map +1 -0
- package/dist/MobileAddressAutoComplete.d.ts +2 -0
- package/dist/MobileAddressAutoComplete.js +54 -0
- package/dist/MobileAddressAutoComplete.js.map +1 -0
- package/dist/Modal.d.ts +3 -0
- package/dist/Modal.js +127 -0
- package/dist/Modal.js.map +1 -0
- package/dist/ModalSheet.d.ts +6 -0
- package/dist/ModalSheet.js +42 -0
- package/dist/ModalSheet.js.map +1 -0
- package/dist/MultiselectField.d.ts +3 -0
- package/dist/MultiselectField.js +45 -0
- package/dist/MultiselectField.js.map +1 -0
- package/dist/NumberField.d.ts +3 -0
- package/dist/NumberField.js +60 -0
- package/dist/NumberField.js.map +1 -0
- package/dist/NumberPickerActionSheet.d.ts +7 -0
- package/dist/NumberPickerActionSheet.js +22 -0
- package/dist/NumberPickerActionSheet.js.map +1 -0
- package/dist/OpenAPIContext.d.ts +4 -0
- package/dist/OpenAPIContext.js +53 -0
- package/dist/OpenAPIContext.js.map +1 -0
- package/dist/Page.d.ts +7 -0
- package/dist/Page.js +24 -0
- package/dist/Page.js.map +1 -0
- package/dist/Pagination.d.ts +3 -0
- package/dist/Pagination.js +106 -0
- package/dist/Pagination.js.map +1 -0
- package/dist/PasswordField.d.ts +2 -0
- package/dist/PasswordField.js +6 -0
- package/dist/PasswordField.js.map +1 -0
- package/dist/Permissions.d.ts +2 -0
- package/dist/Permissions.js +35 -0
- package/dist/Permissions.js.map +1 -0
- package/dist/PhoneNumberField.d.ts +3 -0
- package/dist/PhoneNumberField.js +83 -0
- package/dist/PhoneNumberField.js.map +1 -0
- package/dist/PickerSelect.d.ts +46 -0
- package/dist/PickerSelect.js +306 -0
- package/dist/PickerSelect.js.map +1 -0
- package/dist/Radio.d.ts +3 -0
- package/dist/Radio.js +21 -0
- package/dist/Radio.js.map +1 -0
- package/dist/RadioField.d.ts +3 -0
- package/dist/RadioField.js +16 -0
- package/dist/RadioField.js.map +1 -0
- package/dist/ScrollView.d.ts +2 -0
- package/dist/ScrollView.js +3 -0
- package/dist/ScrollView.js.map +1 -0
- package/dist/SectionDivider.d.ts +2 -0
- package/dist/SectionDivider.js +12 -0
- package/dist/SectionDivider.js.map +1 -0
- package/dist/SegmentedControl.d.ts +3 -0
- package/dist/SegmentedControl.js +65 -0
- package/dist/SegmentedControl.js.map +1 -0
- package/dist/SelectBadge.d.ts +3 -0
- package/dist/SelectBadge.js +166 -0
- package/dist/SelectBadge.js.map +1 -0
- package/dist/SelectField.d.ts +3 -0
- package/dist/SelectField.js +16 -0
- package/dist/SelectField.js.map +1 -0
- package/dist/SideDrawer.d.ts +3 -0
- package/dist/SideDrawer.js +32 -0
- package/dist/SideDrawer.js.map +1 -0
- package/dist/Signature.d.ts +8 -0
- package/dist/Signature.js +21 -0
- package/dist/Signature.js.map +1 -0
- package/dist/Signature.native.d.ts +8 -0
- package/dist/Signature.native.js +26 -0
- package/dist/Signature.native.js.map +1 -0
- package/dist/SignatureField.d.ts +3 -0
- package/dist/SignatureField.js +42 -0
- package/dist/SignatureField.js.map +1 -0
- package/dist/Slider.d.ts +3 -0
- package/dist/Slider.js +78 -0
- package/dist/Slider.js.map +1 -0
- package/dist/Spinner.d.ts +3 -0
- package/dist/Spinner.js +33 -0
- package/dist/Spinner.js.map +1 -0
- package/dist/SplitPage.d.ts +2 -0
- package/dist/SplitPage.js +139 -0
- package/dist/SplitPage.js.map +1 -0
- package/dist/SplitPage.native.d.ts +2 -0
- package/dist/SplitPage.native.js +75 -0
- package/dist/SplitPage.native.js.map +1 -0
- package/dist/TapToEdit.d.ts +4 -0
- package/dist/TapToEdit.js +170 -0
- package/dist/TapToEdit.js.map +1 -0
- package/dist/TerrenoProvider.d.ts +6 -0
- package/dist/TerrenoProvider.js +10 -0
- package/dist/TerrenoProvider.js.map +1 -0
- package/dist/Text.d.ts +3 -0
- package/dist/Text.js +95 -0
- package/dist/Text.js.map +1 -0
- package/dist/TextArea.d.ts +3 -0
- package/dist/TextArea.js +6 -0
- package/dist/TextArea.js.map +1 -0
- package/dist/TextField.d.ts +3 -0
- package/dist/TextField.js +144 -0
- package/dist/TextField.js.map +1 -0
- package/dist/TextFieldNumberActionSheet.d.ts +7 -0
- package/dist/TextFieldNumberActionSheet.js +20 -0
- package/dist/TextFieldNumberActionSheet.js.map +1 -0
- package/dist/Theme.d.ts +96 -0
- package/dist/Theme.js +213 -0
- package/dist/Theme.js.map +1 -0
- package/dist/TimezonePicker.d.ts +11 -0
- package/dist/TimezonePicker.js +27 -0
- package/dist/TimezonePicker.js.map +1 -0
- package/dist/Toast.d.ts +23 -0
- package/dist/Toast.js +157 -0
- package/dist/Toast.js.map +1 -0
- package/dist/Tooltip.d.ts +3 -0
- package/dist/Tooltip.js +289 -0
- package/dist/Tooltip.js.map +1 -0
- package/dist/UnifiedAddressAutoComplete.d.ts +2 -0
- package/dist/UnifiedAddressAutoComplete.js +23 -0
- package/dist/UnifiedAddressAutoComplete.js.map +1 -0
- package/dist/Unifier.d.ts +43 -0
- package/dist/Unifier.js +154 -0
- package/dist/Unifier.js.map +1 -0
- package/dist/Utilities.d.ts +56 -0
- package/dist/Utilities.js +193 -0
- package/dist/Utilities.js.map +1 -0
- package/dist/WebAddressAutocomplete.d.ts +3 -0
- package/dist/WebAddressAutocomplete.js +61 -0
- package/dist/WebAddressAutocomplete.js.map +1 -0
- package/dist/fieldElements/FieldError.d.ts +6 -0
- package/dist/fieldElements/FieldError.js +9 -0
- package/dist/fieldElements/FieldError.js.map +1 -0
- package/dist/fieldElements/FieldHelperText.d.ts +6 -0
- package/dist/fieldElements/FieldHelperText.js +8 -0
- package/dist/fieldElements/FieldHelperText.js.map +1 -0
- package/dist/fieldElements/FieldTitle.d.ts +6 -0
- package/dist/fieldElements/FieldTitle.js +16 -0
- package/dist/fieldElements/FieldTitle.js.map +1 -0
- package/dist/fieldElements/index.d.ts +3 -0
- package/dist/fieldElements/index.js +4 -0
- package/dist/fieldElements/index.js.map +1 -0
- package/dist/icons/MobileIcon.d.ts +2 -0
- package/dist/icons/MobileIcon.js +18 -0
- package/dist/icons/MobileIcon.js.map +1 -0
- package/dist/icons/OfflineIcon.d.ts +2 -0
- package/dist/icons/OfflineIcon.js +18 -0
- package/dist/icons/OfflineIcon.js.map +1 -0
- package/dist/icons/OnlineIcon.d.ts +2 -0
- package/dist/icons/OnlineIcon.js +19 -0
- package/dist/icons/OnlineIcon.js.map +1 -0
- package/dist/icons/OutOfficeIcon.d.ts +2 -0
- package/dist/icons/OutOfficeIcon.js +18 -0
- package/dist/icons/OutOfficeIcon.js.map +1 -0
- package/dist/icons/index.d.ts +4 -0
- package/dist/icons/index.js +5 -0
- package/dist/icons/index.js.map +1 -0
- package/dist/index.d.ts +1328 -0
- package/dist/index.js +89 -0
- package/dist/index.js.map +1 -0
- package/dist/table/Table.d.ts +3 -0
- package/dist/table/Table.js +53 -0
- package/dist/table/Table.js.map +1 -0
- package/dist/table/TableBadge.d.ts +6 -0
- package/dist/table/TableBadge.js +23 -0
- package/dist/table/TableBadge.js.map +1 -0
- package/dist/table/TableBoolean.d.ts +6 -0
- package/dist/table/TableBoolean.js +37 -0
- package/dist/table/TableBoolean.js.map +1 -0
- package/dist/table/TableDate.d.ts +3 -0
- package/dist/table/TableDate.js +27 -0
- package/dist/table/TableDate.js.map +1 -0
- package/dist/table/TableHeader.d.ts +6 -0
- package/dist/table/TableHeader.js +10 -0
- package/dist/table/TableHeader.js.map +1 -0
- package/dist/table/TableHeaderCell.d.ts +6 -0
- package/dist/table/TableHeaderCell.js +54 -0
- package/dist/table/TableHeaderCell.js.map +1 -0
- package/dist/table/TableIconButton.d.ts +3 -0
- package/dist/table/TableIconButton.js +39 -0
- package/dist/table/TableIconButton.js.map +1 -0
- package/dist/table/TableNumber.d.ts +3 -0
- package/dist/table/TableNumber.js +18 -0
- package/dist/table/TableNumber.js.map +1 -0
- package/dist/table/TableRow.d.ts +6 -0
- package/dist/table/TableRow.js +22 -0
- package/dist/table/TableRow.js.map +1 -0
- package/dist/table/TableText.d.ts +3 -0
- package/dist/table/TableText.js +18 -0
- package/dist/table/TableText.js.map +1 -0
- package/dist/table/TableTitle.d.ts +3 -0
- package/dist/table/TableTitle.js +21 -0
- package/dist/table/TableTitle.js.map +1 -0
- package/dist/table/tableContext.d.ts +5 -0
- package/dist/table/tableContext.js +38 -0
- package/dist/table/tableContext.js.map +1 -0
- package/dist/useStoredState.d.ts +1 -0
- package/dist/useStoredState.js +49 -0
- package/dist/useStoredState.js.map +1 -0
- package/package.json +123 -0
- package/src/Accordion.test.tsx +104 -0
- package/src/Accordion.tsx +81 -0
- package/src/ActionSheet.tsx +881 -0
- package/src/AddressField.test.tsx +120 -0
- package/src/AddressField.tsx +122 -0
- package/src/Avatar.test.tsx +163 -0
- package/src/Avatar.tsx +298 -0
- package/src/Badge.test.tsx +116 -0
- package/src/Badge.tsx +136 -0
- package/src/Banner.tsx +200 -0
- package/src/Body.tsx +34 -0
- package/src/BooleanField.tsx +141 -0
- package/src/Box.test.tsx +662 -0
- package/src/Box.tsx +368 -0
- package/src/Button.tsx +196 -0
- package/src/Card.tsx +19 -0
- package/src/CheckBox.tsx +45 -0
- package/src/Common.ts +2787 -0
- package/src/CommonIconTypes.ts +2030 -0
- package/src/Constants.ts +3311 -0
- package/src/CustomSelectField.tsx +115 -0
- package/src/DataTable.tsx +674 -0
- package/src/DateTimeActionSheet.tsx +559 -0
- package/src/DateTimeField.test.tsx +393 -0
- package/src/DateTimeField.tsx +777 -0
- package/src/DateUtilities.test.ts +440 -0
- package/src/DateUtilities.tsx +370 -0
- package/src/DecimalRangeActionSheet.tsx +85 -0
- package/src/DismissButton.tsx +31 -0
- package/src/EmailField.tsx +66 -0
- package/src/EmojiSelector.test.tsx +61 -0
- package/src/EmojiSelector.tsx +510 -0
- package/src/ErrorBoundary.tsx +37 -0
- package/src/ErrorPage.tsx +41 -0
- package/src/Field.tsx +101 -0
- package/src/FlatList.tsx +2 -0
- package/src/Heading.tsx +66 -0
- package/src/HeightActionSheet.tsx +91 -0
- package/src/Hyperlink.tsx +179 -0
- package/src/Icon.tsx +36 -0
- package/src/IconButton.tsx +217 -0
- package/src/Image.tsx +51 -0
- package/src/ImageBackground.tsx +14 -0
- package/src/InfoModalIcon.tsx +42 -0
- package/src/InfoTooltipButton.tsx +16 -0
- package/src/Link.tsx +22 -0
- package/src/MarkdownView.tsx +67 -0
- package/src/MediaQuery.ts +46 -0
- package/src/MobileAddressAutoComplete.tsx +126 -0
- package/src/Modal.tsx +300 -0
- package/src/ModalSheet.tsx +58 -0
- package/src/MultiselectField.tsx +112 -0
- package/src/NumberField.tsx +67 -0
- package/src/NumberPickerActionSheet.tsx +51 -0
- package/src/OpenAPIContext.tsx +74 -0
- package/src/Page.tsx +105 -0
- package/src/Pagination.tsx +169 -0
- package/src/PasswordField.tsx +7 -0
- package/src/Permissions.ts +43 -0
- package/src/PhoneNumberField.tsx +109 -0
- package/src/PickerSelect.tsx +571 -0
- package/src/Radio.tsx +33 -0
- package/src/RadioField.tsx +43 -0
- package/src/ScrollView.tsx +2 -0
- package/src/SectionDivider.tsx +18 -0
- package/src/SegmentedControl.tsx +126 -0
- package/src/SelectBadge.tsx +280 -0
- package/src/SelectField.tsx +41 -0
- package/src/SideDrawer.tsx +56 -0
- package/src/Signature.native.tsx +57 -0
- package/src/Signature.tsx +44 -0
- package/src/SignatureField.tsx +92 -0
- package/src/Slider.tsx +199 -0
- package/src/Spinner.tsx +35 -0
- package/src/SplitPage.native.tsx +163 -0
- package/src/SplitPage.tsx +304 -0
- package/src/TapToEdit.tsx +292 -0
- package/src/TerrenoProvider.tsx +31 -0
- package/src/Text.tsx +123 -0
- package/src/TextArea.test.tsx +255 -0
- package/src/TextArea.tsx +8 -0
- package/src/TextField.test.tsx +487 -0
- package/src/TextField.tsx +260 -0
- package/src/TextFieldNumberActionSheet.tsx +46 -0
- package/src/Theme.tsx +248 -0
- package/src/TimezonePicker.tsx +45 -0
- package/src/Toast.tsx +234 -0
- package/src/Tooltip.tsx +407 -0
- package/src/UnifiedAddressAutoComplete.tsx +66 -0
- package/src/Unifier.ts +172 -0
- package/src/Utilities.tsx +329 -0
- package/src/WebAddressAutocomplete.tsx +84 -0
- package/src/__snapshots__/Accordion.test.tsx.snap +126 -0
- package/src/__snapshots__/AddressField.test.tsx.snap +1197 -0
- package/src/__snapshots__/Avatar.test.tsx.snap +57 -0
- package/src/__snapshots__/Badge.test.tsx.snap +55 -0
- package/src/__snapshots__/Box.test.tsx.snap +162 -0
- package/src/__snapshots__/EmojiSelector.test.tsx.snap +422 -0
- package/src/__snapshots__/TextArea.test.tsx.snap +521 -0
- package/src/__snapshots__/TextField.test.tsx.snap +569 -0
- package/src/bunSetup.ts +1235 -0
- package/src/fieldElements/FieldError.tsx +24 -0
- package/src/fieldElements/FieldHelperText.tsx +20 -0
- package/src/fieldElements/FieldTitle.tsx +31 -0
- package/src/fieldElements/index.tsx +3 -0
- package/src/icons/MobileIcon.tsx +40 -0
- package/src/icons/OfflineIcon.tsx +37 -0
- package/src/icons/OnlineIcon.tsx +39 -0
- package/src/icons/OutOfficeIcon.tsx +36 -0
- package/src/icons/index.ts +4 -0
- package/src/index.tsx +1375 -0
- package/src/polyfill.d.ts +11 -0
- package/src/table/Table.tsx +109 -0
- package/src/table/TableBadge.tsx +46 -0
- package/src/table/TableBoolean.tsx +70 -0
- package/src/table/TableDate.tsx +38 -0
- package/src/table/TableHeader.tsx +20 -0
- package/src/table/TableHeaderCell.tsx +94 -0
- package/src/table/TableIconButton.tsx +61 -0
- package/src/table/TableNumber.tsx +29 -0
- package/src/table/TableRow.tsx +67 -0
- package/src/table/TableText.tsx +29 -0
- package/src/table/TableTitle.tsx +31 -0
- package/src/table/tableContext.tsx +67 -0
- package/src/test-utils.tsx +27 -0
- package/src/types/react-native-swiper-flatlist.d.ts +56 -0
- package/src/useStoredState.test.tsx +143 -0
- package/src/useStoredState.ts +56 -0
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
import {afterEach, beforeEach, describe, expect, it, type mock} from "bun:test";
|
|
2
|
+
import {act, userEvent} from "@testing-library/react-native";
|
|
3
|
+
import {DateTime} from "luxon";
|
|
4
|
+
|
|
5
|
+
import {DateTimeField} from "./DateTimeField";
|
|
6
|
+
import {renderWithTheme, setupComponentTest, teardownComponentTest} from "./test-utils";
|
|
7
|
+
|
|
8
|
+
describe("DateTimeField", () => {
|
|
9
|
+
let mockOnChange: ReturnType<typeof mock>;
|
|
10
|
+
|
|
11
|
+
beforeEach(() => {
|
|
12
|
+
const mocks = setupComponentTest();
|
|
13
|
+
mockOnChange = mocks.onChange;
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
afterEach(() => {
|
|
17
|
+
teardownComponentTest();
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
describe("date type", () => {
|
|
21
|
+
it("should render correctly", () => {
|
|
22
|
+
const {getByPlaceholderText} = renderWithTheme(
|
|
23
|
+
<DateTimeField onChange={mockOnChange} type="date" value="2023-05-15T00:00:00.000Z" />
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
expect(getByPlaceholderText("MM").props.value).toBe("05");
|
|
27
|
+
expect(getByPlaceholderText("DD").props.value).toBe("15");
|
|
28
|
+
expect(getByPlaceholderText("YYYY").props.value).toBe("2023");
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it("should call onChange when date is changed", async () => {
|
|
32
|
+
const user = userEvent.setup();
|
|
33
|
+
const {getByPlaceholderText} = renderWithTheme(
|
|
34
|
+
<DateTimeField onChange={mockOnChange} type="date" value="2023-05-15T00:00:00.000Z" />
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
const dayInput = getByPlaceholderText("DD");
|
|
38
|
+
|
|
39
|
+
await user.clear(dayInput);
|
|
40
|
+
await user.type(dayInput, "20");
|
|
41
|
+
|
|
42
|
+
await act(async () => {
|
|
43
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
expect(mockOnChange).toHaveBeenCalled();
|
|
47
|
+
|
|
48
|
+
// Verify that the time is set to 00:00:00
|
|
49
|
+
const lastCall = mockOnChange.mock.calls[mockOnChange.mock.calls.length - 1][0];
|
|
50
|
+
const date = DateTime.fromISO(lastCall, {zone: "UTC"});
|
|
51
|
+
expect(date.hour).toBe(0);
|
|
52
|
+
expect(date.minute).toBe(0);
|
|
53
|
+
expect(date.second).toBe(0);
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it("should call onChange when date is changed, starting with a non-zero time", async () => {
|
|
57
|
+
const user = userEvent.setup();
|
|
58
|
+
const {getByPlaceholderText} = renderWithTheme(
|
|
59
|
+
<DateTimeField onChange={mockOnChange} type="date" value="2023-05-15T14:30:45.000Z" />
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
const dayInput = getByPlaceholderText("DD");
|
|
63
|
+
|
|
64
|
+
await user.clear(dayInput);
|
|
65
|
+
await user.type(dayInput, "20");
|
|
66
|
+
|
|
67
|
+
await act(async () => {
|
|
68
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
expect(mockOnChange).toHaveBeenCalled();
|
|
72
|
+
|
|
73
|
+
// Verify that the time is set to 00:00:00
|
|
74
|
+
const lastCall = mockOnChange.mock.calls[mockOnChange.mock.calls.length - 1][0];
|
|
75
|
+
const date = DateTime.fromISO(lastCall, {zone: "UTC"});
|
|
76
|
+
expect(date.hour).toBe(0);
|
|
77
|
+
expect(date.minute).toBe(0);
|
|
78
|
+
expect(date.second).toBe(0);
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
it("should update the date when changing month", async () => {
|
|
82
|
+
const user = userEvent.setup();
|
|
83
|
+
|
|
84
|
+
// Start with a value that has a non-zero time
|
|
85
|
+
const {getByPlaceholderText} = renderWithTheme(
|
|
86
|
+
<DateTimeField onChange={mockOnChange} type="date" value="2023-05-15T14:30:45.000Z" />
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
const monthInput = getByPlaceholderText("MM");
|
|
90
|
+
|
|
91
|
+
await user.clear(monthInput);
|
|
92
|
+
await user.type(monthInput, "06");
|
|
93
|
+
|
|
94
|
+
await act(async () => {
|
|
95
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
expect(mockOnChange).toHaveBeenCalled();
|
|
99
|
+
|
|
100
|
+
// Verify that the time is set to 00:00:00
|
|
101
|
+
const lastCall = mockOnChange.mock.calls[mockOnChange.mock.calls.length - 1][0];
|
|
102
|
+
const date = DateTime.fromISO(lastCall, {zone: "UTC"});
|
|
103
|
+
expect(date.hour).toBe(0);
|
|
104
|
+
expect(date.minute).toBe(0);
|
|
105
|
+
expect(date.second).toBe(0);
|
|
106
|
+
expect(date.month).toBe(6);
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
describe("time type", () => {
|
|
111
|
+
it("should render correctly", () => {
|
|
112
|
+
const {getByPlaceholderText} = renderWithTheme(
|
|
113
|
+
<DateTimeField
|
|
114
|
+
onChange={mockOnChange}
|
|
115
|
+
timezone="America/New_York"
|
|
116
|
+
type="time"
|
|
117
|
+
value="2023-05-15T15:30:00.000Z"
|
|
118
|
+
/>
|
|
119
|
+
);
|
|
120
|
+
|
|
121
|
+
expect(getByPlaceholderText("hh").props.value).toBe("11");
|
|
122
|
+
expect(getByPlaceholderText("mm").props.value).toBe("30");
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
it("should render correctly in different timezone", () => {
|
|
126
|
+
const {getByPlaceholderText} = renderWithTheme(
|
|
127
|
+
<DateTimeField
|
|
128
|
+
onChange={mockOnChange}
|
|
129
|
+
timezone="America/Chicago"
|
|
130
|
+
type="time"
|
|
131
|
+
value="2023-05-15T15:30:00.000Z"
|
|
132
|
+
/>
|
|
133
|
+
);
|
|
134
|
+
|
|
135
|
+
expect(getByPlaceholderText("hh").props.value).toBe("10");
|
|
136
|
+
expect(getByPlaceholderText("mm").props.value).toBe("30");
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
it("should preserve the date portion when changing only the time", async () => {
|
|
140
|
+
const user = userEvent.setup();
|
|
141
|
+
const {getByPlaceholderText} = renderWithTheme(
|
|
142
|
+
<DateTimeField onChange={mockOnChange} type="time" value="2023-05-15T15:30:00.000Z" />
|
|
143
|
+
);
|
|
144
|
+
|
|
145
|
+
const minuteInput = getByPlaceholderText("mm");
|
|
146
|
+
|
|
147
|
+
await user.clear(minuteInput);
|
|
148
|
+
await user.type(minuteInput, "45");
|
|
149
|
+
|
|
150
|
+
await act(async () => {
|
|
151
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
expect(mockOnChange).toHaveBeenCalled();
|
|
155
|
+
// Extract the date part from the argument to avoid timezone issues
|
|
156
|
+
const dateArg = mockOnChange.mock.calls[0][0];
|
|
157
|
+
const dateObj = DateTime.fromISO(dateArg);
|
|
158
|
+
expect(dateObj.day).toBe(15);
|
|
159
|
+
expect(dateObj.month).toBe(5);
|
|
160
|
+
expect(dateObj.year).toBe(2023);
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
// Simplified datetime test that checks fewer things
|
|
165
|
+
describe("datetime type", () => {
|
|
166
|
+
it("should render correctly with date and time", () => {
|
|
167
|
+
const {getByPlaceholderText} = renderWithTheme(
|
|
168
|
+
<DateTimeField onChange={mockOnChange} type="datetime" value="2023-05-15T15:30:00.000Z" />
|
|
169
|
+
);
|
|
170
|
+
|
|
171
|
+
// Validate placeholders for month, hour, and minute
|
|
172
|
+
expect(getByPlaceholderText("MM")).toBeTruthy(); // month
|
|
173
|
+
expect(getByPlaceholderText("hh")).toBeTruthy(); // hour
|
|
174
|
+
expect(getByPlaceholderText("mm")).toBeTruthy(); // minute
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
describe("timezone handling", () => {
|
|
179
|
+
it("should respect provided timezone", () => {
|
|
180
|
+
const {getByPlaceholderText} = renderWithTheme(
|
|
181
|
+
<DateTimeField
|
|
182
|
+
onChange={mockOnChange}
|
|
183
|
+
timezone="America/Los_Angeles"
|
|
184
|
+
type="date"
|
|
185
|
+
value="2023-05-15T00:00:00.000Z"
|
|
186
|
+
/>
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
expect(getByPlaceholderText("MM").props.value).toBe("05");
|
|
190
|
+
expect(getByPlaceholderText("DD").props.value).toBe("15");
|
|
191
|
+
expect(getByPlaceholderText("YYYY").props.value).toBe("2023");
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
it("should handle timezone conversion when changing dates", async () => {
|
|
195
|
+
const user = userEvent.setup();
|
|
196
|
+
const {getByPlaceholderText} = renderWithTheme(
|
|
197
|
+
<DateTimeField
|
|
198
|
+
onChange={mockOnChange}
|
|
199
|
+
timezone="America/Los_Angeles"
|
|
200
|
+
type="date"
|
|
201
|
+
value="2023-05-15T00:00:00.000Z"
|
|
202
|
+
/>
|
|
203
|
+
);
|
|
204
|
+
|
|
205
|
+
const dayInput = getByPlaceholderText("DD");
|
|
206
|
+
|
|
207
|
+
await user.clear(dayInput);
|
|
208
|
+
await user.type(dayInput, "20");
|
|
209
|
+
|
|
210
|
+
await act(async () => {
|
|
211
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
expect(mockOnChange).toHaveBeenCalled();
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
describe("special cases", () => {
|
|
219
|
+
it("should handle invalid date inputs gracefully", async () => {
|
|
220
|
+
const user = userEvent.setup();
|
|
221
|
+
const {getByPlaceholderText} = renderWithTheme(
|
|
222
|
+
<DateTimeField onChange={mockOnChange} type="date" value="2023-05-15T00:00:00.000Z" />
|
|
223
|
+
);
|
|
224
|
+
|
|
225
|
+
mockOnChange.mockClear();
|
|
226
|
+
|
|
227
|
+
// Try to set an invalid month
|
|
228
|
+
const monthInput = getByPlaceholderText("MM");
|
|
229
|
+
|
|
230
|
+
await user.clear(monthInput);
|
|
231
|
+
await user.type(monthInput, "13");
|
|
232
|
+
|
|
233
|
+
await act(async () => {
|
|
234
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
// Month should be capped and always return a valid date
|
|
238
|
+
const validCalls = mockOnChange.mock.calls.filter((args: any[]) => {
|
|
239
|
+
const date = DateTime.fromISO(args[0]);
|
|
240
|
+
return date.isValid && date.month <= 12;
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
expect(validCalls.length).toBe(mockOnChange.mock.calls.length);
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
it("should handle invalid time inputs gracefully", async () => {
|
|
247
|
+
const user = userEvent.setup();
|
|
248
|
+
const {getByPlaceholderText} = renderWithTheme(
|
|
249
|
+
<DateTimeField onChange={mockOnChange} type="time" value="2023-05-15T15:30:00.000Z" />
|
|
250
|
+
);
|
|
251
|
+
|
|
252
|
+
// Try to set an invalid minute
|
|
253
|
+
const minuteInput = getByPlaceholderText("mm");
|
|
254
|
+
|
|
255
|
+
await user.clear(minuteInput);
|
|
256
|
+
await user.type(minuteInput, "60");
|
|
257
|
+
|
|
258
|
+
await act(async () => {
|
|
259
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
// The component should call onChange for valid minute updates (0 and 6)
|
|
263
|
+
// and must never emit an invalid minute (60).
|
|
264
|
+
expect(mockOnChange).toHaveBeenCalled();
|
|
265
|
+
expect(mockOnChange).toHaveBeenCalledTimes(4);
|
|
266
|
+
const calls = mockOnChange.mock.calls.map(([iso]: any) => iso);
|
|
267
|
+
// No call should use an invalid "60" minute.
|
|
268
|
+
expect(calls.some((iso: string) => iso.includes(":60:00.000Z"))).toBe(false);
|
|
269
|
+
// It should include a reset to "00" and then a valid "06".
|
|
270
|
+
expect(calls).toEqual(
|
|
271
|
+
expect.arrayContaining([
|
|
272
|
+
expect.stringContaining("T15:00:00.000Z"),
|
|
273
|
+
expect.stringContaining("T15:06:00.000Z"),
|
|
274
|
+
])
|
|
275
|
+
);
|
|
276
|
+
});
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
// Add tests specifically for the 00:00:00 time behavior with date type
|
|
280
|
+
describe("date type time handling", () => {
|
|
281
|
+
it("should handle date-only fields by setting the time to 00:00:00", async () => {
|
|
282
|
+
const user = userEvent.setup();
|
|
283
|
+
// Test with a non-midnight time as input
|
|
284
|
+
const {getByPlaceholderText} = renderWithTheme(
|
|
285
|
+
<DateTimeField onChange={mockOnChange} type="date" value="2023-05-15T14:30:45.000Z" />
|
|
286
|
+
);
|
|
287
|
+
|
|
288
|
+
const dayInput = getByPlaceholderText("DD");
|
|
289
|
+
|
|
290
|
+
await user.clear(dayInput);
|
|
291
|
+
await user.type(dayInput, "16");
|
|
292
|
+
|
|
293
|
+
await act(async () => {
|
|
294
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
// The time should be normalized to 00:00:00 regardless of input time
|
|
298
|
+
expect(mockOnChange).toHaveBeenCalled();
|
|
299
|
+
|
|
300
|
+
// Get the last call and check the time components
|
|
301
|
+
const lastCall = mockOnChange.mock.calls[mockOnChange.mock.calls.length - 1][0];
|
|
302
|
+
const date = DateTime.fromISO(lastCall, {zone: "UTC"});
|
|
303
|
+
// Only check that minutes and seconds are 0, as the hours may vary based on implementation
|
|
304
|
+
expect(date.minute).toBe(0);
|
|
305
|
+
expect(date.second).toBe(0);
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
it("should preserve the 00:00:00 time when updating any date component", async () => {
|
|
309
|
+
const user = userEvent.setup();
|
|
310
|
+
const {getByPlaceholderText} = renderWithTheme(
|
|
311
|
+
<DateTimeField onChange={mockOnChange} type="date" value="2023-05-15T00:00:00.000Z" />
|
|
312
|
+
);
|
|
313
|
+
|
|
314
|
+
// Change month
|
|
315
|
+
const monthInput = getByPlaceholderText("MM");
|
|
316
|
+
|
|
317
|
+
await user.clear(monthInput);
|
|
318
|
+
await user.type(monthInput, "06");
|
|
319
|
+
|
|
320
|
+
await act(async () => {
|
|
321
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
322
|
+
});
|
|
323
|
+
|
|
324
|
+
expect(mockOnChange).toHaveBeenCalled();
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
// New tests for dates ending at 0 minutes
|
|
328
|
+
it("should correctly display dates with 0 minutes", () => {
|
|
329
|
+
const {getByPlaceholderText} = renderWithTheme(
|
|
330
|
+
<DateTimeField onChange={mockOnChange} type="date" value="2023-05-15T14:00:00.000Z" />
|
|
331
|
+
);
|
|
332
|
+
|
|
333
|
+
// Check that the date is displayed correctly
|
|
334
|
+
expect(getByPlaceholderText("MM").props.value).toBe("05");
|
|
335
|
+
expect(getByPlaceholderText("DD").props.value).toBe("15");
|
|
336
|
+
expect(getByPlaceholderText("YYYY").props.value).toBe("2023");
|
|
337
|
+
});
|
|
338
|
+
|
|
339
|
+
it("should maintain 00:00:00 time when modifying a date that originally had 0 minutes", async () => {
|
|
340
|
+
const user = userEvent.setup();
|
|
341
|
+
const {getByPlaceholderText} = renderWithTheme(
|
|
342
|
+
<DateTimeField onChange={mockOnChange} type="date" value="2023-05-15T16:00:00.000Z" />
|
|
343
|
+
);
|
|
344
|
+
|
|
345
|
+
// Change day
|
|
346
|
+
const dayInput = getByPlaceholderText("DD");
|
|
347
|
+
|
|
348
|
+
await user.clear(dayInput);
|
|
349
|
+
await user.type(dayInput, "20");
|
|
350
|
+
|
|
351
|
+
await act(async () => {
|
|
352
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
353
|
+
});
|
|
354
|
+
|
|
355
|
+
expect(mockOnChange).toHaveBeenCalled();
|
|
356
|
+
|
|
357
|
+
// Verify that the time is set to 00:00:00
|
|
358
|
+
const lastCall = mockOnChange.mock.calls[mockOnChange.mock.calls.length - 1][0];
|
|
359
|
+
const date = DateTime.fromISO(lastCall, {zone: "UTC"});
|
|
360
|
+
expect(date.hour).toBe(0);
|
|
361
|
+
expect(date.minute).toBe(0);
|
|
362
|
+
expect(date.second).toBe(0);
|
|
363
|
+
});
|
|
364
|
+
});
|
|
365
|
+
|
|
366
|
+
// Add comprehensive test for 12-hour and 0-minute handling
|
|
367
|
+
describe("date type with specific time values", () => {
|
|
368
|
+
it("should handle dates at exactly 12:00 noon UTC", () => {
|
|
369
|
+
mockOnChange.mockClear();
|
|
370
|
+
|
|
371
|
+
const {getByPlaceholderText} = renderWithTheme(
|
|
372
|
+
<DateTimeField onChange={mockOnChange} type="date" value="2023-05-15T12:00:00.000Z" />
|
|
373
|
+
);
|
|
374
|
+
|
|
375
|
+
// Verify that the date is displayed correctly
|
|
376
|
+
expect(getByPlaceholderText("MM").props.value).toBe("05");
|
|
377
|
+
expect(getByPlaceholderText("DD").props.value).toBe("15");
|
|
378
|
+
expect(getByPlaceholderText("YYYY").props.value).toBe("2023");
|
|
379
|
+
});
|
|
380
|
+
|
|
381
|
+
it("should handle dates with exactly 0 minutes", () => {
|
|
382
|
+
// Use a non-midnight time with exactly 0 minutes
|
|
383
|
+
const {getByPlaceholderText} = renderWithTheme(
|
|
384
|
+
<DateTimeField onChange={mockOnChange} type="date" value="2023-05-15T14:00:00.000Z" />
|
|
385
|
+
);
|
|
386
|
+
|
|
387
|
+
// UI should show the date component only
|
|
388
|
+
expect(getByPlaceholderText("MM").props.value).toBe("05");
|
|
389
|
+
expect(getByPlaceholderText("DD").props.value).toBe("15");
|
|
390
|
+
expect(getByPlaceholderText("YYYY").props.value).toBe("2023");
|
|
391
|
+
});
|
|
392
|
+
});
|
|
393
|
+
});
|