@wordpress/dataviews 8.0.2-next.836ecdcae.0 → 9.0.0
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/CHANGELOG.md +23 -1
- package/README.md +127 -13
- package/build/components/dataviews-filters/input-widget.js +48 -4
- package/build/components/dataviews-filters/input-widget.js.map +1 -1
- package/build/components/dataviews-layout/index.js +3 -1
- package/build/components/dataviews-layout/index.js.map +1 -1
- package/build/dataform-controls/array.js +9 -7
- package/build/dataform-controls/array.js.map +1 -1
- package/build/dataform-controls/checkbox.js +40 -8
- package/build/dataform-controls/checkbox.js.map +1 -1
- package/build/dataform-controls/color.js +133 -0
- package/build/dataform-controls/color.js.map +1 -0
- package/build/dataform-controls/date.js +32 -24
- package/build/dataform-controls/date.js.map +1 -1
- package/build/dataform-controls/datetime.js +133 -19
- package/build/dataform-controls/datetime.js.map +1 -1
- package/build/dataform-controls/email.js +15 -3
- package/build/dataform-controls/email.js.map +1 -1
- package/build/dataform-controls/index.js +33 -2
- package/build/dataform-controls/index.js.map +1 -1
- package/build/dataform-controls/integer.js +47 -34
- package/build/dataform-controls/integer.js.map +1 -1
- package/build/dataform-controls/password.js +47 -0
- package/build/dataform-controls/password.js.map +1 -0
- package/build/dataform-controls/radio.js +42 -9
- package/build/dataform-controls/radio.js.map +1 -1
- package/build/dataform-controls/relative-date-control.js +6 -10
- package/build/dataform-controls/relative-date-control.js.map +1 -1
- package/build/dataform-controls/select.js +41 -10
- package/build/dataform-controls/select.js.map +1 -1
- package/build/dataform-controls/telephone.js +15 -3
- package/build/dataform-controls/telephone.js.map +1 -1
- package/build/dataform-controls/text.js +16 -4
- package/build/dataform-controls/text.js.map +1 -1
- package/build/dataform-controls/textarea.js +81 -0
- package/build/dataform-controls/textarea.js.map +1 -0
- package/build/dataform-controls/toggle-group.js +36 -6
- package/build/dataform-controls/toggle-group.js.map +1 -1
- package/build/dataform-controls/toggle.js +77 -0
- package/build/dataform-controls/toggle.js.map +1 -0
- package/build/dataform-controls/url.js +40 -0
- package/build/dataform-controls/url.js.map +1 -0
- package/build/dataform-controls/utils/validated-input.js +83 -0
- package/build/dataform-controls/utils/validated-input.js.map +1 -0
- package/build/dataforms-layouts/card/index.js +0 -4
- package/build/dataforms-layouts/card/index.js.map +1 -1
- package/build/dataforms-layouts/data-form-layout.js +16 -4
- package/build/dataforms-layouts/data-form-layout.js.map +1 -1
- package/build/dataforms-layouts/index.js +31 -1
- package/build/dataforms-layouts/index.js.map +1 -1
- package/build/dataforms-layouts/panel/dropdown.js +10 -14
- package/build/dataforms-layouts/panel/dropdown.js.map +1 -1
- package/build/dataforms-layouts/panel/index.js +24 -11
- package/build/dataforms-layouts/panel/index.js.map +1 -1
- package/build/dataforms-layouts/panel/modal.js +22 -27
- package/build/dataforms-layouts/panel/modal.js.map +1 -1
- package/build/dataforms-layouts/panel/summary-button.js +67 -0
- package/build/dataforms-layouts/panel/summary-button.js.map +1 -0
- package/build/dataforms-layouts/regular/index.js +7 -9
- package/build/dataforms-layouts/regular/index.js.map +1 -1
- package/build/dataforms-layouts/row/index.js +113 -0
- package/build/dataforms-layouts/row/index.js.map +1 -0
- package/build/dataviews-layouts/grid/index.js +5 -15
- package/build/dataviews-layouts/grid/index.js.map +1 -1
- package/build/dataviews-layouts/list/index.js +47 -2
- package/build/dataviews-layouts/list/index.js.map +1 -1
- package/build/dataviews-layouts/picker-grid/index.js +5 -15
- package/build/dataviews-layouts/picker-grid/index.js.map +1 -1
- package/build/dataviews-layouts/table/index.js +5 -17
- package/build/dataviews-layouts/table/index.js.map +1 -1
- package/build/dataviews-layouts/utils/get-data-by-group.js +23 -0
- package/build/dataviews-layouts/utils/get-data-by-group.js.map +1 -0
- package/build/field-types/boolean.js +1 -1
- package/build/field-types/boolean.js.map +1 -1
- package/build/field-types/color.js +113 -0
- package/build/field-types/color.js.map +1 -0
- package/build/field-types/index.js +12 -0
- package/build/field-types/index.js.map +1 -1
- package/build/field-types/password.js +51 -0
- package/build/field-types/password.js.map +1 -0
- package/build/field-types/url.js +57 -0
- package/build/field-types/url.js.map +1 -0
- package/build/normalize-fields.js +17 -0
- package/build/normalize-fields.js.map +1 -1
- package/build/normalize-form-fields.js +6 -0
- package/build/normalize-form-fields.js.map +1 -1
- package/build/types.js.map +1 -1
- package/build/validation.js +1 -1
- package/build/validation.js.map +1 -1
- package/build-module/components/dataviews-filters/input-widget.js +48 -4
- package/build-module/components/dataviews-filters/input-widget.js.map +1 -1
- package/build-module/components/dataviews-layout/index.js +3 -1
- package/build-module/components/dataviews-layout/index.js.map +1 -1
- package/build-module/dataform-controls/array.js +9 -7
- package/build-module/dataform-controls/array.js.map +1 -1
- package/build-module/dataform-controls/checkbox.js +41 -9
- package/build-module/dataform-controls/checkbox.js.map +1 -1
- package/build-module/dataform-controls/color.js +126 -0
- package/build-module/dataform-controls/color.js.map +1 -0
- package/build-module/dataform-controls/date.js +32 -24
- package/build-module/dataform-controls/date.js.map +1 -1
- package/build-module/dataform-controls/datetime.js +135 -21
- package/build-module/dataform-controls/datetime.js.map +1 -1
- package/build-module/dataform-controls/email.js +14 -2
- package/build-module/dataform-controls/email.js.map +1 -1
- package/build-module/dataform-controls/index.js +33 -2
- package/build-module/dataform-controls/index.js.map +1 -1
- package/build-module/dataform-controls/integer.js +46 -34
- package/build-module/dataform-controls/integer.js.map +1 -1
- package/build-module/dataform-controls/password.js +38 -0
- package/build-module/dataform-controls/password.js.map +1 -0
- package/build-module/dataform-controls/radio.js +44 -11
- package/build-module/dataform-controls/radio.js.map +1 -1
- package/build-module/dataform-controls/relative-date-control.js +6 -10
- package/build-module/dataform-controls/relative-date-control.js.map +1 -1
- package/build-module/dataform-controls/select.js +43 -12
- package/build-module/dataform-controls/select.js.map +1 -1
- package/build-module/dataform-controls/telephone.js +14 -2
- package/build-module/dataform-controls/telephone.js.map +1 -1
- package/build-module/dataform-controls/text.js +15 -3
- package/build-module/dataform-controls/text.js.map +1 -1
- package/build-module/dataform-controls/textarea.js +74 -0
- package/build-module/dataform-controls/textarea.js.map +1 -0
- package/build-module/dataform-controls/toggle-group.js +38 -8
- package/build-module/dataform-controls/toggle-group.js.map +1 -1
- package/build-module/dataform-controls/toggle.js +70 -0
- package/build-module/dataform-controls/toggle.js.map +1 -0
- package/build-module/dataform-controls/url.js +33 -0
- package/build-module/dataform-controls/url.js.map +1 -0
- package/build-module/dataform-controls/utils/validated-input.js +76 -0
- package/build-module/dataform-controls/utils/validated-input.js.map +1 -0
- package/build-module/dataforms-layouts/card/index.js +0 -4
- package/build-module/dataforms-layouts/card/index.js.map +1 -1
- package/build-module/dataforms-layouts/data-form-layout.js +14 -4
- package/build-module/dataforms-layouts/data-form-layout.js.map +1 -1
- package/build-module/dataforms-layouts/index.js +32 -1
- package/build-module/dataforms-layouts/index.js.map +1 -1
- package/build-module/dataforms-layouts/panel/dropdown.js +10 -15
- package/build-module/dataforms-layouts/panel/dropdown.js.map +1 -1
- package/build-module/dataforms-layouts/panel/index.js +24 -11
- package/build-module/dataforms-layouts/panel/index.js.map +1 -1
- package/build-module/dataforms-layouts/panel/modal.js +22 -28
- package/build-module/dataforms-layouts/panel/modal.js.map +1 -1
- package/build-module/dataforms-layouts/panel/summary-button.js +60 -0
- package/build-module/dataforms-layouts/panel/summary-button.js.map +1 -0
- package/build-module/dataforms-layouts/regular/index.js +8 -10
- package/build-module/dataforms-layouts/regular/index.js.map +1 -1
- package/build-module/dataforms-layouts/row/index.js +106 -0
- package/build-module/dataforms-layouts/row/index.js.map +1 -0
- package/build-module/dataviews-layouts/grid/index.js +6 -16
- package/build-module/dataviews-layouts/grid/index.js.map +1 -1
- package/build-module/dataviews-layouts/list/index.js +48 -3
- package/build-module/dataviews-layouts/list/index.js.map +1 -1
- package/build-module/dataviews-layouts/picker-grid/index.js +6 -16
- package/build-module/dataviews-layouts/picker-grid/index.js.map +1 -1
- package/build-module/dataviews-layouts/table/index.js +5 -17
- package/build-module/dataviews-layouts/table/index.js.map +1 -1
- package/build-module/dataviews-layouts/utils/get-data-by-group.js +17 -0
- package/build-module/dataviews-layouts/utils/get-data-by-group.js.map +1 -0
- package/build-module/field-types/boolean.js +1 -1
- package/build-module/field-types/boolean.js.map +1 -1
- package/build-module/field-types/color.js +107 -0
- package/build-module/field-types/color.js.map +1 -0
- package/build-module/field-types/index.js +12 -0
- package/build-module/field-types/index.js.map +1 -1
- package/build-module/field-types/password.js +46 -0
- package/build-module/field-types/password.js.map +1 -0
- package/build-module/field-types/url.js +51 -0
- package/build-module/field-types/url.js.map +1 -0
- package/build-module/normalize-fields.js +15 -0
- package/build-module/normalize-fields.js.map +1 -1
- package/build-module/normalize-form-fields.js +6 -0
- package/build-module/normalize-form-fields.js.map +1 -1
- package/build-module/types.js.map +1 -1
- package/build-module/validation.js +1 -1
- package/build-module/validation.js.map +1 -1
- package/build-style/style-rtl.css +13 -6
- package/build-style/style.css +13 -6
- package/build-types/components/dataform/stories/index.story.d.ts +21 -17
- package/build-types/components/dataform/stories/index.story.d.ts.map +1 -1
- package/build-types/components/dataviews/stories/fixtures.d.ts +4 -2
- package/build-types/components/dataviews/stories/fixtures.d.ts.map +1 -1
- package/build-types/components/dataviews-filters/input-widget.d.ts.map +1 -1
- package/build-types/dataform-controls/array.d.ts.map +1 -1
- package/build-types/dataform-controls/checkbox.d.ts.map +1 -1
- package/build-types/dataform-controls/color.d.ts +6 -0
- package/build-types/dataform-controls/color.d.ts.map +1 -0
- package/build-types/dataform-controls/date.d.ts.map +1 -1
- package/build-types/dataform-controls/datetime.d.ts.map +1 -1
- package/build-types/dataform-controls/email.d.ts.map +1 -1
- package/build-types/dataform-controls/index.d.ts +1 -1
- package/build-types/dataform-controls/index.d.ts.map +1 -1
- package/build-types/dataform-controls/integer.d.ts.map +1 -1
- package/build-types/dataform-controls/password.d.ts +3 -0
- package/build-types/dataform-controls/password.d.ts.map +1 -0
- package/build-types/dataform-controls/radio.d.ts.map +1 -1
- package/build-types/dataform-controls/relative-date-control.d.ts +6 -5
- package/build-types/dataform-controls/relative-date-control.d.ts.map +1 -1
- package/build-types/dataform-controls/select.d.ts.map +1 -1
- package/build-types/dataform-controls/telephone.d.ts.map +1 -1
- package/build-types/dataform-controls/text.d.ts +1 -1
- package/build-types/dataform-controls/text.d.ts.map +1 -1
- package/build-types/dataform-controls/textarea.d.ts +6 -0
- package/build-types/dataform-controls/textarea.d.ts.map +1 -0
- package/build-types/dataform-controls/toggle-group.d.ts.map +1 -1
- package/build-types/dataform-controls/toggle.d.ts +6 -0
- package/build-types/dataform-controls/toggle.d.ts.map +1 -0
- package/build-types/dataform-controls/url.d.ts +6 -0
- package/build-types/dataform-controls/url.d.ts.map +1 -0
- package/build-types/dataform-controls/utils/validated-input.d.ts +20 -0
- package/build-types/dataform-controls/utils/validated-input.d.ts.map +1 -0
- package/build-types/dataforms-layouts/card/index.d.ts +0 -3
- package/build-types/dataforms-layouts/card/index.d.ts.map +1 -1
- package/build-types/dataforms-layouts/data-form-layout.d.ts +4 -1
- package/build-types/dataforms-layouts/data-form-layout.d.ts.map +1 -1
- package/build-types/dataforms-layouts/index.d.ts +10 -0
- package/build-types/dataforms-layouts/index.d.ts.map +1 -1
- package/build-types/dataforms-layouts/panel/dropdown.d.ts +2 -1
- package/build-types/dataforms-layouts/panel/dropdown.d.ts.map +1 -1
- package/build-types/dataforms-layouts/panel/index.d.ts.map +1 -1
- package/build-types/dataforms-layouts/panel/modal.d.ts +2 -1
- package/build-types/dataforms-layouts/panel/modal.d.ts.map +1 -1
- package/build-types/dataforms-layouts/panel/summary-button.d.ts +15 -0
- package/build-types/dataforms-layouts/panel/summary-button.d.ts.map +1 -0
- package/build-types/dataforms-layouts/regular/index.d.ts.map +1 -1
- package/build-types/dataforms-layouts/row/index.d.ts +6 -0
- package/build-types/dataforms-layouts/row/index.d.ts.map +1 -0
- package/build-types/dataviews-layouts/grid/index.d.ts.map +1 -1
- package/build-types/dataviews-layouts/list/index.d.ts.map +1 -1
- package/build-types/dataviews-layouts/picker-grid/index.d.ts.map +1 -1
- package/build-types/dataviews-layouts/table/index.d.ts.map +1 -1
- package/build-types/dataviews-layouts/utils/get-data-by-group.d.ts +6 -0
- package/build-types/dataviews-layouts/utils/get-data-by-group.d.ts.map +1 -0
- package/build-types/field-types/color.d.ts +20 -0
- package/build-types/field-types/color.d.ts.map +1 -0
- package/build-types/field-types/index.d.ts.map +1 -1
- package/build-types/field-types/password.d.ts +17 -0
- package/build-types/field-types/password.d.ts.map +1 -0
- package/build-types/field-types/stories/index.story.d.ts +13 -1
- package/build-types/field-types/stories/index.story.d.ts.map +1 -1
- package/build-types/field-types/url.d.ts +20 -0
- package/build-types/field-types/url.d.ts.map +1 -0
- package/build-types/normalize-fields.d.ts +3 -0
- package/build-types/normalize-fields.d.ts.map +1 -1
- package/build-types/normalize-form-fields.d.ts.map +1 -1
- package/build-types/types.d.ts +78 -7
- package/build-types/types.d.ts.map +1 -1
- package/build-types/validation.d.ts.map +1 -1
- package/build-wp/index.js +2577 -1708
- package/package.json +17 -15
- package/src/components/dataform/stories/index.story.tsx +794 -27
- package/src/components/dataviews/stories/fixtures.tsx +99 -41
- package/src/components/dataviews/stories/index.story.tsx +2 -2
- package/src/components/dataviews-filters/input-widget.tsx +44 -5
- package/src/components/dataviews-layout/index.tsx +1 -1
- package/src/components/dataviews-picker/stories/index.story.tsx +1 -1
- package/src/dataform-controls/array.tsx +4 -6
- package/src/dataform-controls/checkbox.tsx +54 -7
- package/src/dataform-controls/color.tsx +148 -0
- package/src/dataform-controls/date.tsx +47 -21
- package/src/dataform-controls/datetime.tsx +171 -23
- package/src/dataform-controls/email.tsx +22 -2
- package/src/dataform-controls/index.tsx +36 -2
- package/src/dataform-controls/integer.tsx +82 -49
- package/src/dataform-controls/password.tsx +50 -0
- package/src/dataform-controls/radio.tsx +53 -11
- package/src/dataform-controls/relative-date-control.tsx +11 -10
- package/src/dataform-controls/select.tsx +53 -10
- package/src/dataform-controls/telephone.tsx +22 -2
- package/src/dataform-controls/text.tsx +19 -2
- package/src/dataform-controls/textarea.tsx +85 -0
- package/src/dataform-controls/toggle-group.tsx +50 -10
- package/src/dataform-controls/toggle.tsx +79 -0
- package/src/dataform-controls/url.tsx +38 -0
- package/src/dataform-controls/utils/validated-input.tsx +109 -0
- package/src/dataforms-layouts/card/index.tsx +0 -4
- package/src/dataforms-layouts/data-form-layout.tsx +15 -3
- package/src/dataforms-layouts/index.tsx +35 -0
- package/src/dataforms-layouts/panel/dropdown.tsx +12 -23
- package/src/dataforms-layouts/panel/index.tsx +39 -16
- package/src/dataforms-layouts/panel/modal.tsx +24 -30
- package/src/dataforms-layouts/panel/summary-button.tsx +92 -0
- package/src/dataforms-layouts/regular/index.tsx +9 -7
- package/src/dataforms-layouts/regular/style.scss +0 -6
- package/src/dataforms-layouts/row/index.tsx +115 -0
- package/src/dataforms-layouts/row/style.scss +3 -0
- package/src/dataviews-layouts/grid/index.tsx +9 -14
- package/src/dataviews-layouts/grid/style.scss +1 -0
- package/src/dataviews-layouts/list/index.tsx +74 -2
- package/src/dataviews-layouts/list/style.scss +8 -0
- package/src/dataviews-layouts/picker-grid/index.tsx +9 -13
- package/src/dataviews-layouts/table/index.tsx +10 -14
- package/src/dataviews-layouts/utils/get-data-by-group.ts +18 -0
- package/src/field-types/boolean.tsx +1 -1
- package/src/field-types/color.tsx +115 -0
- package/src/field-types/index.tsx +15 -0
- package/src/field-types/password.tsx +46 -0
- package/src/field-types/stories/index.story.tsx +234 -3
- package/src/field-types/url.tsx +71 -0
- package/src/normalize-fields.ts +18 -0
- package/src/normalize-form-fields.ts +6 -0
- package/src/style.scss +1 -0
- package/src/test/dataform.tsx +2 -2
- package/src/test/filter-and-sort-data-view.js +148 -138
- package/src/test/normalize-fields.ts +114 -0
- package/src/types.ts +89 -6
- package/src/validation.ts +5 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/build/dataform-controls/boolean.js +0 -64
- package/build/dataform-controls/boolean.js.map +0 -1
- package/build/dataform-controls/utils/validated-text.js +0 -68
- package/build/dataform-controls/utils/validated-text.js.map +0 -1
- package/build-module/dataform-controls/boolean.js +0 -58
- package/build-module/dataform-controls/boolean.js.map +0 -1
- package/build-module/dataform-controls/utils/validated-text.js +0 -62
- package/build-module/dataform-controls/utils/validated-text.js.map +0 -1
- package/build-types/dataform-controls/boolean.d.ts +0 -6
- package/build-types/dataform-controls/boolean.d.ts.map +0 -1
- package/build-types/dataform-controls/utils/validated-text.d.ts +0 -12
- package/build-types/dataform-controls/utils/validated-text.d.ts.map +0 -1
- package/src/dataform-controls/boolean.tsx +0 -61
- package/src/dataform-controls/utils/validated-text.tsx +0 -79
|
@@ -31,6 +31,7 @@ import {
|
|
|
31
31
|
*/
|
|
32
32
|
import RelativeDateControl, {
|
|
33
33
|
TIME_UNITS_OPTIONS,
|
|
34
|
+
type DateRelative,
|
|
34
35
|
} from './relative-date-control';
|
|
35
36
|
import {
|
|
36
37
|
OPERATOR_IN_THE_PAST,
|
|
@@ -42,6 +43,8 @@ import type { DataFormControlProps } from '../types';
|
|
|
42
43
|
|
|
43
44
|
const { DateCalendar, DateRangeCalendar } = unlock( componentsPrivateApis );
|
|
44
45
|
|
|
46
|
+
type DateRange = [ string, string ] | undefined;
|
|
47
|
+
|
|
45
48
|
const DATE_PRESETS: {
|
|
46
49
|
id: string;
|
|
47
50
|
label: string;
|
|
@@ -146,7 +149,7 @@ function CalendarDateControl( {
|
|
|
146
149
|
}: {
|
|
147
150
|
id: string;
|
|
148
151
|
value: string | undefined;
|
|
149
|
-
onChange: ( value:
|
|
152
|
+
onChange: ( value: string | undefined ) => void;
|
|
150
153
|
label: string;
|
|
151
154
|
hideLabelFromVision?: boolean;
|
|
152
155
|
className?: string;
|
|
@@ -165,10 +168,10 @@ function CalendarDateControl( {
|
|
|
165
168
|
const dateValue = newDate
|
|
166
169
|
? format( newDate, 'yyyy-MM-dd' )
|
|
167
170
|
: undefined;
|
|
168
|
-
onChange(
|
|
171
|
+
onChange( dateValue );
|
|
169
172
|
setSelectedPresetId( null );
|
|
170
173
|
},
|
|
171
|
-
[
|
|
174
|
+
[ onChange ]
|
|
172
175
|
);
|
|
173
176
|
|
|
174
177
|
const handlePresetClick = useCallback(
|
|
@@ -177,15 +180,15 @@ function CalendarDateControl( {
|
|
|
177
180
|
const dateValue = formatDate( presetDate );
|
|
178
181
|
|
|
179
182
|
setCalendarMonth( presetDate );
|
|
180
|
-
onChange(
|
|
183
|
+
onChange( dateValue );
|
|
181
184
|
setSelectedPresetId( preset.id );
|
|
182
185
|
},
|
|
183
|
-
[
|
|
186
|
+
[ onChange ]
|
|
184
187
|
);
|
|
185
188
|
|
|
186
189
|
const handleManualDateChange = useCallback(
|
|
187
190
|
( newValue?: string ) => {
|
|
188
|
-
onChange(
|
|
191
|
+
onChange( newValue );
|
|
189
192
|
if ( newValue ) {
|
|
190
193
|
const parsedDate = parseDate( newValue );
|
|
191
194
|
if ( parsedDate ) {
|
|
@@ -194,7 +197,7 @@ function CalendarDateControl( {
|
|
|
194
197
|
}
|
|
195
198
|
setSelectedPresetId( null );
|
|
196
199
|
},
|
|
197
|
-
[
|
|
200
|
+
[ onChange ]
|
|
198
201
|
);
|
|
199
202
|
|
|
200
203
|
const {
|
|
@@ -276,8 +279,8 @@ function CalendarDateRangeControl( {
|
|
|
276
279
|
className,
|
|
277
280
|
}: {
|
|
278
281
|
id: string;
|
|
279
|
-
value:
|
|
280
|
-
onChange: ( value:
|
|
282
|
+
value: DateRange;
|
|
283
|
+
onChange: ( value: DateRange ) => void;
|
|
281
284
|
label: string;
|
|
282
285
|
hideLabelFromVision?: boolean;
|
|
283
286
|
className?: string;
|
|
@@ -305,15 +308,13 @@ function CalendarDateRangeControl( {
|
|
|
305
308
|
const updateDateRange = useCallback(
|
|
306
309
|
( fromDate?: Date | string, toDate?: Date | string ) => {
|
|
307
310
|
if ( fromDate && toDate ) {
|
|
308
|
-
onChange(
|
|
309
|
-
[ id ]: [ formatDate( fromDate ), formatDate( toDate ) ],
|
|
310
|
-
} );
|
|
311
|
+
onChange( [ formatDate( fromDate ), formatDate( toDate ) ] );
|
|
311
312
|
} else if ( ! fromDate && ! toDate ) {
|
|
312
|
-
onChange(
|
|
313
|
+
onChange( undefined );
|
|
313
314
|
}
|
|
314
315
|
// Do nothing if only one date is set - wait for both
|
|
315
316
|
},
|
|
316
|
-
[
|
|
317
|
+
[ onChange ]
|
|
317
318
|
);
|
|
318
319
|
|
|
319
320
|
const onSelectCalendarRange = useCallback(
|
|
@@ -446,8 +447,33 @@ export default function DateControl< Item >( {
|
|
|
446
447
|
hideLabelFromVision,
|
|
447
448
|
operator,
|
|
448
449
|
}: DataFormControlProps< Item > ) {
|
|
449
|
-
const { id, label } = field;
|
|
450
|
-
const value =
|
|
450
|
+
const { id, label, getValue, setValue } = field;
|
|
451
|
+
const value = getValue( { item: data } );
|
|
452
|
+
|
|
453
|
+
const onChangeRelativeDateControl = useCallback(
|
|
454
|
+
( newValue: DateRelative ) => {
|
|
455
|
+
onChange( setValue( { item: data, value: newValue } ) );
|
|
456
|
+
},
|
|
457
|
+
[ data, onChange, setValue ]
|
|
458
|
+
);
|
|
459
|
+
|
|
460
|
+
const onChangeCalendarDateRangeControl = useCallback(
|
|
461
|
+
( newValue: DateRange ) => {
|
|
462
|
+
onChange(
|
|
463
|
+
setValue( {
|
|
464
|
+
item: data,
|
|
465
|
+
value: newValue,
|
|
466
|
+
} )
|
|
467
|
+
);
|
|
468
|
+
},
|
|
469
|
+
[ data, onChange, setValue ]
|
|
470
|
+
);
|
|
471
|
+
|
|
472
|
+
const onChangeCalendarDateControl = useCallback(
|
|
473
|
+
( newValue: string | undefined ) =>
|
|
474
|
+
onChange( setValue( { item: data, value: newValue } ) ),
|
|
475
|
+
[ data, onChange, setValue ]
|
|
476
|
+
);
|
|
451
477
|
|
|
452
478
|
if ( operator === OPERATOR_IN_THE_PAST || operator === OPERATOR_OVER ) {
|
|
453
479
|
return (
|
|
@@ -455,7 +481,7 @@ export default function DateControl< Item >( {
|
|
|
455
481
|
className="dataviews-controls__date"
|
|
456
482
|
id={ id }
|
|
457
483
|
value={ value && typeof value === 'object' ? value : {} }
|
|
458
|
-
onChange={
|
|
484
|
+
onChange={ onChangeRelativeDateControl }
|
|
459
485
|
label={ label }
|
|
460
486
|
hideLabelFromVision={ hideLabelFromVision }
|
|
461
487
|
options={ TIME_UNITS_OPTIONS[ operator ] }
|
|
@@ -464,14 +490,14 @@ export default function DateControl< Item >( {
|
|
|
464
490
|
}
|
|
465
491
|
|
|
466
492
|
if ( operator === OPERATOR_BETWEEN ) {
|
|
467
|
-
let dateRangeValue:
|
|
493
|
+
let dateRangeValue: DateRange;
|
|
468
494
|
if (
|
|
469
495
|
Array.isArray( value ) &&
|
|
470
496
|
value.length === 2 &&
|
|
471
497
|
value.every( ( date ) => typeof date === 'string' )
|
|
472
498
|
) {
|
|
473
499
|
// Ensure the value is expected format
|
|
474
|
-
dateRangeValue = value as
|
|
500
|
+
dateRangeValue = value as DateRange;
|
|
475
501
|
}
|
|
476
502
|
|
|
477
503
|
return (
|
|
@@ -479,7 +505,7 @@ export default function DateControl< Item >( {
|
|
|
479
505
|
className="dataviews-controls__date"
|
|
480
506
|
id={ id }
|
|
481
507
|
value={ dateRangeValue }
|
|
482
|
-
onChange={
|
|
508
|
+
onChange={ onChangeCalendarDateRangeControl }
|
|
483
509
|
label={ label }
|
|
484
510
|
hideLabelFromVision={ hideLabelFromVision }
|
|
485
511
|
/>
|
|
@@ -491,7 +517,7 @@ export default function DateControl< Item >( {
|
|
|
491
517
|
className="dataviews-controls__date"
|
|
492
518
|
id={ id }
|
|
493
519
|
value={ typeof value === 'string' ? value : undefined }
|
|
494
|
-
onChange={
|
|
520
|
+
onChange={ onChangeCalendarDateControl }
|
|
495
521
|
label={ label }
|
|
496
522
|
hideLabelFromVision={ hideLabelFromVision }
|
|
497
523
|
/>
|
|
@@ -1,8 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* WordPress dependencies
|
|
3
3
|
*/
|
|
4
|
-
import {
|
|
5
|
-
|
|
4
|
+
import {
|
|
5
|
+
BaseControl,
|
|
6
|
+
privateApis as componentsPrivateApis,
|
|
7
|
+
__experimentalInputControl as InputControl,
|
|
8
|
+
__experimentalVStack as VStack,
|
|
9
|
+
} from '@wordpress/components';
|
|
10
|
+
import { useCallback, useState } from '@wordpress/element';
|
|
11
|
+
import { __ } from '@wordpress/i18n';
|
|
12
|
+
import { getDate, getSettings } from '@wordpress/date';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* External dependencies
|
|
16
|
+
*/
|
|
17
|
+
import { format, isValid } from 'date-fns';
|
|
6
18
|
|
|
7
19
|
/**
|
|
8
20
|
* Internal dependencies
|
|
@@ -11,7 +23,142 @@ import type { DataFormControlProps } from '../types';
|
|
|
11
23
|
import { OPERATOR_IN_THE_PAST, OPERATOR_OVER } from '../constants';
|
|
12
24
|
import RelativeDateControl, {
|
|
13
25
|
TIME_UNITS_OPTIONS,
|
|
26
|
+
type DateRelative,
|
|
14
27
|
} from './relative-date-control';
|
|
28
|
+
import { unlock } from '../lock-unlock';
|
|
29
|
+
|
|
30
|
+
const { DateCalendar } = unlock( componentsPrivateApis );
|
|
31
|
+
|
|
32
|
+
const parseDateTime = ( dateTimeString?: string ): Date | null => {
|
|
33
|
+
if ( ! dateTimeString ) {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
const parsed = getDate( dateTimeString );
|
|
37
|
+
return parsed && isValid( parsed ) ? parsed : null;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
const formatDateTime = ( date?: Date | string ): string => {
|
|
41
|
+
if ( ! date ) {
|
|
42
|
+
return '';
|
|
43
|
+
}
|
|
44
|
+
if ( typeof date === 'string' ) {
|
|
45
|
+
return date;
|
|
46
|
+
}
|
|
47
|
+
// Format as datetime-local input expects: YYYY-MM-DDTHH:mm
|
|
48
|
+
return format( date, "yyyy-MM-dd'T'HH:mm" );
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
function CalendarDateTimeControl( {
|
|
52
|
+
id,
|
|
53
|
+
value,
|
|
54
|
+
onChange,
|
|
55
|
+
label,
|
|
56
|
+
description,
|
|
57
|
+
hideLabelFromVision,
|
|
58
|
+
}: {
|
|
59
|
+
id: string;
|
|
60
|
+
value: string | undefined;
|
|
61
|
+
onChange: ( value: string | undefined ) => void;
|
|
62
|
+
label: string;
|
|
63
|
+
description?: string;
|
|
64
|
+
hideLabelFromVision?: boolean;
|
|
65
|
+
} ) {
|
|
66
|
+
const [ calendarMonth, setCalendarMonth ] = useState< Date >( () => {
|
|
67
|
+
const parsedDate = parseDateTime( value );
|
|
68
|
+
return parsedDate || new Date(); // Default to current month
|
|
69
|
+
} );
|
|
70
|
+
|
|
71
|
+
const onSelectDate = useCallback(
|
|
72
|
+
( newDate: Date | undefined | null ) => {
|
|
73
|
+
if ( newDate ) {
|
|
74
|
+
// Preserve time if it exists in current value, otherwise use current time
|
|
75
|
+
let finalDateTime = newDate;
|
|
76
|
+
|
|
77
|
+
if ( value ) {
|
|
78
|
+
const currentDateTime = parseDateTime( value );
|
|
79
|
+
if ( currentDateTime ) {
|
|
80
|
+
// Preserve the time part
|
|
81
|
+
finalDateTime = new Date( newDate );
|
|
82
|
+
finalDateTime.setHours( currentDateTime.getHours() );
|
|
83
|
+
finalDateTime.setMinutes(
|
|
84
|
+
currentDateTime.getMinutes()
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const dateTimeValue = finalDateTime.toISOString();
|
|
90
|
+
onChange( dateTimeValue );
|
|
91
|
+
} else {
|
|
92
|
+
onChange( undefined );
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
[ onChange, value ]
|
|
96
|
+
);
|
|
97
|
+
|
|
98
|
+
const handleManualDateTimeChange = useCallback(
|
|
99
|
+
( newValue?: string ) => {
|
|
100
|
+
if ( newValue ) {
|
|
101
|
+
// Convert from datetime-local format to ISO string
|
|
102
|
+
const dateTime = new Date( newValue );
|
|
103
|
+
onChange( dateTime.toISOString() );
|
|
104
|
+
|
|
105
|
+
// Update calendar month to match
|
|
106
|
+
const parsedDate = parseDateTime( dateTime.toISOString() );
|
|
107
|
+
if ( parsedDate ) {
|
|
108
|
+
setCalendarMonth( parsedDate );
|
|
109
|
+
}
|
|
110
|
+
} else {
|
|
111
|
+
onChange( undefined );
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
[ onChange ]
|
|
115
|
+
);
|
|
116
|
+
|
|
117
|
+
const {
|
|
118
|
+
timezone: { string: timezoneString },
|
|
119
|
+
l10n: { startOfWeek },
|
|
120
|
+
} = getSettings();
|
|
121
|
+
|
|
122
|
+
return (
|
|
123
|
+
<BaseControl
|
|
124
|
+
__nextHasNoMarginBottom
|
|
125
|
+
id={ id }
|
|
126
|
+
label={ label }
|
|
127
|
+
help={ description }
|
|
128
|
+
hideLabelFromVision={ hideLabelFromVision }
|
|
129
|
+
>
|
|
130
|
+
<VStack spacing={ 4 }>
|
|
131
|
+
{ /* Calendar widget */ }
|
|
132
|
+
<DateCalendar
|
|
133
|
+
style={ { width: '100%' } }
|
|
134
|
+
selected={
|
|
135
|
+
value ? parseDateTime( value ) || undefined : undefined
|
|
136
|
+
}
|
|
137
|
+
onSelect={ onSelectDate }
|
|
138
|
+
month={ calendarMonth }
|
|
139
|
+
onMonthChange={ setCalendarMonth }
|
|
140
|
+
timeZone={ timezoneString || undefined }
|
|
141
|
+
weekStartsOn={ startOfWeek }
|
|
142
|
+
/>
|
|
143
|
+
{ /* Manual datetime input */ }
|
|
144
|
+
<InputControl
|
|
145
|
+
__next40pxDefaultSize
|
|
146
|
+
type="datetime-local"
|
|
147
|
+
label={ __( 'Date time' ) }
|
|
148
|
+
hideLabelFromVision
|
|
149
|
+
value={
|
|
150
|
+
value
|
|
151
|
+
? formatDateTime(
|
|
152
|
+
parseDateTime( value ) || undefined
|
|
153
|
+
)
|
|
154
|
+
: ''
|
|
155
|
+
}
|
|
156
|
+
onChange={ handleManualDateTimeChange }
|
|
157
|
+
/>
|
|
158
|
+
</VStack>
|
|
159
|
+
</BaseControl>
|
|
160
|
+
);
|
|
161
|
+
}
|
|
15
162
|
|
|
16
163
|
export default function DateTime< Item >( {
|
|
17
164
|
data,
|
|
@@ -20,20 +167,28 @@ export default function DateTime< Item >( {
|
|
|
20
167
|
hideLabelFromVision,
|
|
21
168
|
operator,
|
|
22
169
|
}: DataFormControlProps< Item > ) {
|
|
23
|
-
const { id, label } = field;
|
|
24
|
-
const value =
|
|
170
|
+
const { id, label, description, getValue, setValue } = field;
|
|
171
|
+
const value = getValue( { item: data } );
|
|
25
172
|
|
|
26
|
-
const
|
|
27
|
-
( newValue:
|
|
28
|
-
|
|
173
|
+
const onChangeRelativeDateControl = useCallback(
|
|
174
|
+
( newValue: DateRelative ) =>
|
|
175
|
+
onChange( setValue( { item: data, value: newValue } ) ),
|
|
176
|
+
[ data, onChange, setValue ]
|
|
177
|
+
);
|
|
178
|
+
|
|
179
|
+
const onChangeCalendarDateTimeControl = useCallback(
|
|
180
|
+
( newValue: string | undefined ) =>
|
|
181
|
+
onChange( setValue( { item: data, value: newValue } ) ),
|
|
182
|
+
[ data, onChange, setValue ]
|
|
29
183
|
);
|
|
30
184
|
|
|
31
185
|
if ( operator === OPERATOR_IN_THE_PAST || operator === OPERATOR_OVER ) {
|
|
32
186
|
return (
|
|
33
187
|
<RelativeDateControl
|
|
188
|
+
className="dataviews-controls__datetime"
|
|
34
189
|
id={ id }
|
|
35
190
|
value={ value && typeof value === 'object' ? value : {} }
|
|
36
|
-
onChange={
|
|
191
|
+
onChange={ onChangeRelativeDateControl }
|
|
37
192
|
label={ label }
|
|
38
193
|
hideLabelFromVision={ hideLabelFromVision }
|
|
39
194
|
options={ TIME_UNITS_OPTIONS[ operator ] }
|
|
@@ -42,20 +197,13 @@ export default function DateTime< Item >( {
|
|
|
42
197
|
}
|
|
43
198
|
|
|
44
199
|
return (
|
|
45
|
-
<
|
|
46
|
-
{
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
{ hideLabelFromVision
|
|
52
|
-
|
|
53
|
-
) }
|
|
54
|
-
<TimePicker
|
|
55
|
-
currentTime={ typeof value === 'string' ? value : undefined }
|
|
56
|
-
onChange={ onChangeControl }
|
|
57
|
-
hideLabelFromVision
|
|
58
|
-
/>
|
|
59
|
-
</fieldset>
|
|
200
|
+
<CalendarDateTimeControl
|
|
201
|
+
id={ id }
|
|
202
|
+
value={ typeof value === 'string' ? value : undefined }
|
|
203
|
+
onChange={ onChangeCalendarDateTimeControl }
|
|
204
|
+
label={ label }
|
|
205
|
+
description={ description }
|
|
206
|
+
hideLabelFromVision={ hideLabelFromVision }
|
|
207
|
+
/>
|
|
60
208
|
);
|
|
61
209
|
}
|
|
@@ -1,8 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WordPress dependencies
|
|
3
|
+
*/
|
|
4
|
+
import {
|
|
5
|
+
Icon,
|
|
6
|
+
__experimentalInputControlPrefixWrapper as InputControlPrefixWrapper,
|
|
7
|
+
} from '@wordpress/components';
|
|
8
|
+
import { atSymbol } from '@wordpress/icons';
|
|
9
|
+
|
|
1
10
|
/**
|
|
2
11
|
* Internal dependencies
|
|
3
12
|
*/
|
|
4
13
|
import type { DataFormControlProps } from '../types';
|
|
5
|
-
import ValidatedText from './utils/validated-
|
|
14
|
+
import ValidatedText from './utils/validated-input';
|
|
6
15
|
|
|
7
16
|
export default function Email< Item >( {
|
|
8
17
|
data,
|
|
@@ -12,7 +21,18 @@ export default function Email< Item >( {
|
|
|
12
21
|
}: DataFormControlProps< Item > ) {
|
|
13
22
|
return (
|
|
14
23
|
<ValidatedText
|
|
15
|
-
{ ...{
|
|
24
|
+
{ ...{
|
|
25
|
+
data,
|
|
26
|
+
field,
|
|
27
|
+
onChange,
|
|
28
|
+
hideLabelFromVision,
|
|
29
|
+
type: 'email',
|
|
30
|
+
prefix: (
|
|
31
|
+
<InputControlPrefixWrapper variant="icon">
|
|
32
|
+
<Icon icon={ atSymbol } />
|
|
33
|
+
</InputControlPrefixWrapper>
|
|
34
|
+
),
|
|
35
|
+
} }
|
|
16
36
|
/>
|
|
17
37
|
);
|
|
18
38
|
}
|
|
@@ -10,19 +10,24 @@ import type {
|
|
|
10
10
|
DataFormControlProps,
|
|
11
11
|
Field,
|
|
12
12
|
FieldTypeDefinition,
|
|
13
|
+
EditConfig,
|
|
13
14
|
} from '../types';
|
|
14
15
|
import checkbox from './checkbox';
|
|
15
16
|
import datetime from './datetime';
|
|
16
17
|
import date from './date';
|
|
17
18
|
import email from './email';
|
|
18
19
|
import telephone from './telephone';
|
|
20
|
+
import url from './url';
|
|
19
21
|
import integer from './integer';
|
|
20
22
|
import radio from './radio';
|
|
21
23
|
import select from './select';
|
|
22
24
|
import text from './text';
|
|
25
|
+
import toggle from './toggle';
|
|
26
|
+
import textarea from './textarea';
|
|
23
27
|
import toggleGroup from './toggle-group';
|
|
24
|
-
import boolean from './boolean';
|
|
25
28
|
import array from './array';
|
|
29
|
+
import color from './color';
|
|
30
|
+
import password from './password';
|
|
26
31
|
|
|
27
32
|
interface FormControls {
|
|
28
33
|
[ key: string ]: ComponentType< DataFormControlProps< any > >;
|
|
@@ -30,19 +35,40 @@ interface FormControls {
|
|
|
30
35
|
|
|
31
36
|
const FORM_CONTROLS: FormControls = {
|
|
32
37
|
array,
|
|
33
|
-
boolean,
|
|
34
38
|
checkbox,
|
|
39
|
+
color,
|
|
35
40
|
datetime,
|
|
36
41
|
date,
|
|
37
42
|
email,
|
|
38
43
|
telephone,
|
|
44
|
+
url,
|
|
39
45
|
integer,
|
|
46
|
+
password,
|
|
40
47
|
radio,
|
|
41
48
|
select,
|
|
42
49
|
text,
|
|
50
|
+
toggle,
|
|
51
|
+
textarea,
|
|
43
52
|
toggleGroup,
|
|
44
53
|
};
|
|
45
54
|
|
|
55
|
+
function isEditConfig( value: any ): value is EditConfig {
|
|
56
|
+
return (
|
|
57
|
+
value && typeof value === 'object' && typeof value.control === 'string'
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function createConfiguredControl( config: EditConfig ) {
|
|
62
|
+
const { control, ...controlConfig } = config;
|
|
63
|
+
const BaseControlType = getControlByType( control );
|
|
64
|
+
|
|
65
|
+
return function ConfiguredControl< Item >(
|
|
66
|
+
props: DataFormControlProps< Item >
|
|
67
|
+
) {
|
|
68
|
+
return <BaseControlType { ...props } config={ controlConfig } />;
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
|
|
46
72
|
export function getControl< Item >(
|
|
47
73
|
field: Field< Item >,
|
|
48
74
|
fieldTypeDefinition: FieldTypeDefinition< Item >
|
|
@@ -55,6 +81,10 @@ export function getControl< Item >(
|
|
|
55
81
|
return getControlByType( field.Edit );
|
|
56
82
|
}
|
|
57
83
|
|
|
84
|
+
if ( isEditConfig( field.Edit ) ) {
|
|
85
|
+
return createConfiguredControl( field.Edit );
|
|
86
|
+
}
|
|
87
|
+
|
|
58
88
|
if ( field.elements && field.type !== 'array' ) {
|
|
59
89
|
return getControlByType( 'select' );
|
|
60
90
|
}
|
|
@@ -63,6 +93,10 @@ export function getControl< Item >(
|
|
|
63
93
|
return getControlByType( fieldTypeDefinition.Edit );
|
|
64
94
|
}
|
|
65
95
|
|
|
96
|
+
if ( isEditConfig( fieldTypeDefinition.Edit ) ) {
|
|
97
|
+
return createConfiguredControl( fieldTypeDefinition.Edit );
|
|
98
|
+
}
|
|
99
|
+
|
|
66
100
|
return fieldTypeDefinition.Edit;
|
|
67
101
|
}
|
|
68
102
|
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* External dependencies
|
|
3
|
+
*/
|
|
4
|
+
import deepMerge from 'deepmerge';
|
|
5
|
+
|
|
1
6
|
/**
|
|
2
7
|
* WordPress dependencies
|
|
3
8
|
*/
|
|
@@ -19,33 +24,29 @@ import { unlock } from '../lock-unlock';
|
|
|
19
24
|
|
|
20
25
|
const { ValidatedNumberControl } = unlock( privateApis );
|
|
21
26
|
|
|
22
|
-
|
|
23
|
-
|
|
27
|
+
type IntegerBetween = [ number | string, number | string ];
|
|
28
|
+
|
|
29
|
+
function BetweenControls( {
|
|
24
30
|
value,
|
|
25
31
|
onChange,
|
|
26
32
|
hideLabelFromVision,
|
|
27
33
|
}: {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
onChange: DataFormControlProps< Item >[ 'onChange' ];
|
|
34
|
+
value: IntegerBetween;
|
|
35
|
+
onChange: ( [ min, max ]: IntegerBetween ) => void;
|
|
31
36
|
hideLabelFromVision?: boolean;
|
|
32
37
|
} ) {
|
|
33
|
-
const [ min = '', max = '' ] =
|
|
38
|
+
const [ min = '', max = '' ] = value;
|
|
34
39
|
|
|
35
40
|
const onChangeMin = useCallback(
|
|
36
41
|
( newValue: string | undefined ) =>
|
|
37
|
-
onChange(
|
|
38
|
-
|
|
39
|
-
} ),
|
|
40
|
-
[ id, onChange, max ]
|
|
42
|
+
onChange( [ Number( newValue ), max ] ),
|
|
43
|
+
[ onChange, max ]
|
|
41
44
|
);
|
|
42
45
|
|
|
43
46
|
const onChangeMax = useCallback(
|
|
44
47
|
( newValue: string | undefined ) =>
|
|
45
|
-
onChange(
|
|
46
|
-
|
|
47
|
-
} ),
|
|
48
|
-
[ id, onChange, min ]
|
|
48
|
+
onChange( [ min, Number( newValue ) ] ),
|
|
49
|
+
[ onChange, min ]
|
|
49
50
|
);
|
|
50
51
|
|
|
51
52
|
return (
|
|
@@ -82,8 +83,8 @@ export default function Integer< Item >( {
|
|
|
82
83
|
hideLabelFromVision,
|
|
83
84
|
operator,
|
|
84
85
|
}: DataFormControlProps< Item > ) {
|
|
85
|
-
const {
|
|
86
|
-
const value =
|
|
86
|
+
const { label, description, getValue, setValue } = field;
|
|
87
|
+
const value = getValue( { item: data } ) ?? '';
|
|
87
88
|
const [ customValidity, setCustomValidity ] =
|
|
88
89
|
useState<
|
|
89
90
|
React.ComponentProps<
|
|
@@ -93,24 +94,76 @@ export default function Integer< Item >( {
|
|
|
93
94
|
|
|
94
95
|
const onChangeControl = useCallback(
|
|
95
96
|
( newValue: string | undefined ) => {
|
|
96
|
-
onChange(
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
:
|
|
103
|
-
|
|
97
|
+
onChange(
|
|
98
|
+
setValue( {
|
|
99
|
+
item: data,
|
|
100
|
+
// Do not convert an empty string or undefined to a number,
|
|
101
|
+
// otherwise there's a mismatch between the UI control (empty)
|
|
102
|
+
// and the data relied by onChange (0).
|
|
103
|
+
value: [ '', undefined ].includes( newValue )
|
|
104
|
+
? undefined
|
|
105
|
+
: Number( newValue ),
|
|
106
|
+
} )
|
|
107
|
+
);
|
|
108
|
+
},
|
|
109
|
+
[ data, onChange, setValue ]
|
|
110
|
+
);
|
|
111
|
+
|
|
112
|
+
const onChangeBetweenControls = useCallback(
|
|
113
|
+
( newValue: IntegerBetween ) => {
|
|
114
|
+
onChange(
|
|
115
|
+
setValue( {
|
|
116
|
+
item: data,
|
|
117
|
+
value: newValue,
|
|
118
|
+
} )
|
|
119
|
+
);
|
|
120
|
+
},
|
|
121
|
+
[ data, onChange, setValue ]
|
|
122
|
+
);
|
|
123
|
+
|
|
124
|
+
const onValidateControl = useCallback(
|
|
125
|
+
( newValue: any ) => {
|
|
126
|
+
const message = field.isValid?.custom?.(
|
|
127
|
+
deepMerge(
|
|
128
|
+
data,
|
|
129
|
+
setValue( {
|
|
130
|
+
item: data,
|
|
131
|
+
value: [ undefined, '', null ].includes( newValue )
|
|
132
|
+
? undefined
|
|
133
|
+
: Number( newValue ),
|
|
134
|
+
} ) as Partial< Item >
|
|
135
|
+
),
|
|
136
|
+
field
|
|
137
|
+
);
|
|
138
|
+
|
|
139
|
+
if ( message ) {
|
|
140
|
+
setCustomValidity( {
|
|
141
|
+
type: 'invalid',
|
|
142
|
+
message,
|
|
143
|
+
} );
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
setCustomValidity( undefined );
|
|
104
148
|
},
|
|
105
|
-
[
|
|
149
|
+
[ data, field, setValue ]
|
|
106
150
|
);
|
|
107
151
|
|
|
108
152
|
if ( operator === OPERATOR_BETWEEN ) {
|
|
153
|
+
let valueBetween: IntegerBetween = [ '', '' ];
|
|
154
|
+
if (
|
|
155
|
+
Array.isArray( value ) &&
|
|
156
|
+
value.length === 2 &&
|
|
157
|
+
value.every(
|
|
158
|
+
( element ) => typeof element === 'number' || element === ''
|
|
159
|
+
)
|
|
160
|
+
) {
|
|
161
|
+
valueBetween = value as IntegerBetween;
|
|
162
|
+
}
|
|
109
163
|
return (
|
|
110
164
|
<BetweenControls
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
onChange={ onChange }
|
|
165
|
+
value={ valueBetween }
|
|
166
|
+
onChange={ onChangeBetweenControls }
|
|
114
167
|
hideLabelFromVision={ hideLabelFromVision }
|
|
115
168
|
/>
|
|
116
169
|
);
|
|
@@ -119,27 +172,7 @@ export default function Integer< Item >( {
|
|
|
119
172
|
return (
|
|
120
173
|
<ValidatedNumberControl
|
|
121
174
|
required={ !! field.isValid?.required }
|
|
122
|
-
onValidate={
|
|
123
|
-
const message = field.isValid?.custom?.(
|
|
124
|
-
{
|
|
125
|
-
...data,
|
|
126
|
-
[ id ]: [ undefined, '', null ].includes( newValue )
|
|
127
|
-
? undefined
|
|
128
|
-
: Number( newValue ),
|
|
129
|
-
},
|
|
130
|
-
field
|
|
131
|
-
);
|
|
132
|
-
|
|
133
|
-
if ( message ) {
|
|
134
|
-
setCustomValidity( {
|
|
135
|
-
type: 'invalid',
|
|
136
|
-
message,
|
|
137
|
-
} );
|
|
138
|
-
return;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
setCustomValidity( undefined );
|
|
142
|
-
} }
|
|
175
|
+
onValidate={ onValidateControl }
|
|
143
176
|
customValidity={ customValidity }
|
|
144
177
|
label={ label }
|
|
145
178
|
help={ description }
|