@datarobot/design-system 29.7.4 → 29.7.6
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/cjs/code-editor/code-editor.d.ts +0 -16
- package/cjs/code-editor/code-editor.js +1 -15
- package/cjs/datetime-range-picker/datetime-range-picker-panel.d.ts +6 -4
- package/cjs/datetime-range-picker/datetime-range-picker-panel.js +21 -9
- package/cjs/datetime-range-picker/datetime-range-picker.d.ts +4 -3
- package/cjs/datetime-range-picker/datetime-range-picker.js +2 -0
- package/cjs/datetime-range-picker/helpers.d.ts +29 -0
- package/cjs/datetime-range-picker/helpers.js +123 -0
- package/esm/code-editor/code-editor.d.ts +0 -16
- package/esm/code-editor/code-editor.js +0 -14
- package/esm/datetime-range-picker/datetime-range-picker-panel.d.ts +6 -4
- package/esm/datetime-range-picker/datetime-range-picker-panel.js +22 -10
- package/esm/datetime-range-picker/datetime-range-picker.d.ts +4 -3
- package/esm/datetime-range-picker/datetime-range-picker.js +2 -0
- package/esm/datetime-range-picker/helpers.d.ts +29 -0
- package/esm/datetime-range-picker/helpers.js +120 -0
- package/js/139/139.min.js +1 -1
- package/js/244/244.min.js +1 -1
- package/js/633/633.min.js +1 -1
- package/js/784/784.min.js +1 -1
- package/js/86/86.min.js +1 -1
- package/js/bundle/bundle.js +1844 -75
- package/js/bundle/bundle.min.js +1 -1
- package/js/bundle/index.d.ts +39 -24
- package/js/src_locales_es_419_translation_json/src_locales_es_419_translation_json.js +1 -1
- package/js/src_locales_fr_translation_json/src_locales_fr_translation_json.js +1 -1
- package/js/src_locales_ja_translation_json/src_locales_ja_translation_json.js +1 -1
- package/js/src_locales_ko_translation_json/src_locales_ko_translation_json.js +1 -1
- package/js/src_locales_pt_BR_translation_json/src_locales_pt_BR_translation_json.js +1 -1
- package/locales/es_419/translation.json +8 -4
- package/locales/fr/translation.json +8 -4
- package/locales/ja/translation.json +6 -4
- package/locales/ko/translation.json +8 -4
- package/locales/pt_BR/translation.json +8 -4
- package/package.json +1 -1
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { ReactElement } from 'react';
|
|
2
|
-
import PropTypes from 'prop-types';
|
|
3
2
|
import { ValueOf } from '../types';
|
|
4
3
|
import 'codemirror/mode/sql/sql';
|
|
5
4
|
import 'codemirror/mode/javascript/javascript';
|
|
@@ -57,21 +56,6 @@ export type CodeEditorOptions = {
|
|
|
57
56
|
readOnly?: string | boolean;
|
|
58
57
|
theme?: CodeEditorTheme;
|
|
59
58
|
};
|
|
60
|
-
export declare const CodeEditorOptionsShape: PropTypes.Requireable<PropTypes.InferProps<{
|
|
61
|
-
lineWrapping: PropTypes.Requireable<boolean>;
|
|
62
|
-
tabSize: PropTypes.Requireable<number>;
|
|
63
|
-
value: PropTypes.Requireable<string>;
|
|
64
|
-
mode: PropTypes.Requireable<"r" | "python" | "text/plain" | "text/x-sparksql" | "javascript" | "shell" | "htmlmixed" | "clike" | "yaml" | "xml" | {
|
|
65
|
-
name: "javascript";
|
|
66
|
-
json: boolean;
|
|
67
|
-
}>;
|
|
68
|
-
lineNumbers: PropTypes.Requireable<boolean>;
|
|
69
|
-
indentWithTabs: PropTypes.Requireable<boolean>;
|
|
70
|
-
smartIndent: PropTypes.Requireable<boolean>;
|
|
71
|
-
matchBrackets: PropTypes.Requireable<boolean>;
|
|
72
|
-
readOnly: PropTypes.Requireable<NonNullable<string | boolean | null | undefined>>;
|
|
73
|
-
theme: PropTypes.Requireable<"default" | "dracula">;
|
|
74
|
-
}>>;
|
|
75
59
|
export type CodeEditorControls = {
|
|
76
60
|
placement?: CORNER_PLACEMENTS_TYPES;
|
|
77
61
|
element?: ReactElement;
|
|
@@ -3,9 +3,8 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.JSON_MODE = exports.
|
|
6
|
+
exports.JSON_MODE = exports.CodeEditor = exports.CORNER_PLACEMENTS_TYPES = exports.CORNER_PLACEMENTS = exports.CODE_EDITOR_THEMES = exports.CODE_EDITOR_MODES = void 0;
|
|
7
7
|
var _react = _interopRequireDefault(require("react"));
|
|
8
|
-
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
9
8
|
var _classnames = _interopRequireDefault(require("classnames"));
|
|
10
9
|
var _hintWrapper = _interopRequireDefault(require("./utils/hint-wrapper"));
|
|
11
10
|
var _searchWrapper = require("./utils/search-wrapper");
|
|
@@ -65,19 +64,6 @@ const DefaultOptions = {
|
|
|
65
64
|
matchBrackets: true,
|
|
66
65
|
theme: CODE_EDITOR_THEMES.DARK
|
|
67
66
|
};
|
|
68
|
-
// Keeping this for backwards compatiblity
|
|
69
|
-
const CodeEditorOptionsShape = exports.CodeEditorOptionsShape = _propTypes.default.shape({
|
|
70
|
-
lineWrapping: _propTypes.default.bool,
|
|
71
|
-
tabSize: _propTypes.default.number,
|
|
72
|
-
value: _propTypes.default.string,
|
|
73
|
-
mode: _propTypes.default.oneOf([...Object.values(CODE_EDITOR_MODES), JSON_MODE]),
|
|
74
|
-
lineNumbers: _propTypes.default.bool,
|
|
75
|
-
indentWithTabs: _propTypes.default.bool,
|
|
76
|
-
smartIndent: _propTypes.default.bool,
|
|
77
|
-
matchBrackets: _propTypes.default.bool,
|
|
78
|
-
readOnly: _propTypes.default.oneOfType([_propTypes.default.bool, _propTypes.default.string]),
|
|
79
|
-
theme: _propTypes.default.oneOf(Object.values(CODE_EDITOR_THEMES))
|
|
80
|
-
});
|
|
81
67
|
|
|
82
68
|
// We need this to ignore an error when defaultProps are defined but the linters throws an error
|
|
83
69
|
|
|
@@ -36,8 +36,9 @@ type ValidateOnClickProps = {
|
|
|
36
36
|
dateTimeFormat: string;
|
|
37
37
|
minStart?: Moment;
|
|
38
38
|
maxEnd?: Moment;
|
|
39
|
+
sameDateError?: boolean;
|
|
39
40
|
};
|
|
40
|
-
export type ValidateOnClick = ({ start, end, viewMode, dateTimeFormat, minStart, maxEnd, }: ValidateOnClickProps) => {
|
|
41
|
+
export type ValidateOnClick = ({ start, end, viewMode, dateTimeFormat, minStart, maxEnd, sameDateError, }: ValidateOnClickProps) => {
|
|
41
42
|
startErrors: DateRangeErrors;
|
|
42
43
|
endErrors: DateRangeErrors;
|
|
43
44
|
};
|
|
@@ -53,16 +54,17 @@ export type DateRangePickerPanelProps = {
|
|
|
53
54
|
initialTargetInput?: DateRangeInputType;
|
|
54
55
|
maxEnd?: Moment;
|
|
55
56
|
minStart?: Moment;
|
|
57
|
+
sameDateError?: boolean;
|
|
56
58
|
onSubmit: (start: Moment, end: Moment) => void;
|
|
57
59
|
onDismiss: () => void;
|
|
58
60
|
resetText?: string;
|
|
59
61
|
timeFormat: string | boolean;
|
|
60
62
|
utcSuffix?: string;
|
|
61
|
-
validateOnClick
|
|
62
|
-
validateOnChange
|
|
63
|
+
validateOnClick?: ValidateOnClick;
|
|
64
|
+
validateOnChange?: ValidateOnChange;
|
|
63
65
|
dateStartInputAriaLabel: string;
|
|
64
66
|
dateEndInputAriaLabel: string;
|
|
65
67
|
};
|
|
66
68
|
/** Represents the panel used to select two datetimes that make up a range. */
|
|
67
|
-
declare function DateRangePickerPanel({ buttonText, cancelButtonText, dateFormat, defaultEnd, defaultStart, initialDirection, initialViewMode, initialTargetInput, maxEnd, minStart, onSubmit, onDismiss, resetText, timeFormat, utcSuffix, validateOnClick, validateOnChange, dateStartInputAriaLabel, dateEndInputAriaLabel, }: DateRangePickerPanelProps): import("react/jsx-runtime").JSX.Element;
|
|
69
|
+
declare function DateRangePickerPanel({ buttonText, cancelButtonText, dateFormat, defaultEnd, defaultStart, initialDirection, initialViewMode, initialTargetInput, maxEnd, minStart, sameDateError, onSubmit, onDismiss, resetText, timeFormat, utcSuffix, validateOnClick: propValidateOnClick, validateOnChange: propValidateOnChange, dateStartInputAriaLabel, dateEndInputAriaLabel, }: DateRangePickerPanelProps): import("react/jsx-runtime").JSX.Element;
|
|
68
70
|
export default DateRangePickerPanel;
|
|
@@ -91,16 +91,21 @@ function DateRangePickerPanel({
|
|
|
91
91
|
initialTargetInput,
|
|
92
92
|
maxEnd,
|
|
93
93
|
minStart,
|
|
94
|
+
sameDateError,
|
|
94
95
|
onSubmit,
|
|
95
96
|
onDismiss,
|
|
96
97
|
resetText,
|
|
97
98
|
timeFormat,
|
|
98
99
|
utcSuffix,
|
|
99
|
-
validateOnClick,
|
|
100
|
-
validateOnChange,
|
|
100
|
+
validateOnClick: propValidateOnClick,
|
|
101
|
+
validateOnChange: propValidateOnChange,
|
|
101
102
|
dateStartInputAriaLabel,
|
|
102
103
|
dateEndInputAriaLabel
|
|
103
104
|
}) {
|
|
105
|
+
const defaultValidateOnClick = (0, _helpers.useValidateOnClick)();
|
|
106
|
+
const defaultValidateOnChange = (0, _helpers.useGetDateTimeValidityError)();
|
|
107
|
+
const validateOnClick = propValidateOnClick || defaultValidateOnClick;
|
|
108
|
+
const validateOnChange = propValidateOnChange || defaultValidateOnChange;
|
|
104
109
|
const dateTimeFormat = (0, _helpers.getDateTimeFormat)(dateFormat, timeFormat);
|
|
105
110
|
|
|
106
111
|
// Developer-provided datetimes might not always follow the exact date and time format they want to use.
|
|
@@ -164,7 +169,8 @@ function DateRangePickerPanel({
|
|
|
164
169
|
viewMode: initialViewMode,
|
|
165
170
|
dateTimeFormat,
|
|
166
171
|
minStart,
|
|
167
|
-
maxEnd
|
|
172
|
+
maxEnd,
|
|
173
|
+
sameDateError
|
|
168
174
|
})
|
|
169
175
|
});
|
|
170
176
|
}
|
|
@@ -184,7 +190,8 @@ function DateRangePickerPanel({
|
|
|
184
190
|
viewMode: initialViewMode,
|
|
185
191
|
dateTimeFormat,
|
|
186
192
|
minStart,
|
|
187
|
-
maxEnd
|
|
193
|
+
maxEnd,
|
|
194
|
+
sameDateError
|
|
188
195
|
})
|
|
189
196
|
});
|
|
190
197
|
}
|
|
@@ -206,7 +213,8 @@ function DateRangePickerPanel({
|
|
|
206
213
|
viewMode: initialViewMode,
|
|
207
214
|
dateTimeFormat,
|
|
208
215
|
minStart,
|
|
209
|
-
maxEnd
|
|
216
|
+
maxEnd,
|
|
217
|
+
sameDateError
|
|
210
218
|
})
|
|
211
219
|
});
|
|
212
220
|
}
|
|
@@ -352,7 +360,8 @@ function DateRangePickerPanel({
|
|
|
352
360
|
viewMode: initialViewMode,
|
|
353
361
|
dateTimeFormat,
|
|
354
362
|
minStart,
|
|
355
|
-
maxEnd
|
|
363
|
+
maxEnd,
|
|
364
|
+
sameDateError
|
|
356
365
|
})
|
|
357
366
|
});
|
|
358
367
|
}
|
|
@@ -365,7 +374,8 @@ function DateRangePickerPanel({
|
|
|
365
374
|
viewMode: initialViewMode,
|
|
366
375
|
dateTimeFormat,
|
|
367
376
|
minStart,
|
|
368
|
-
maxEnd
|
|
377
|
+
maxEnd,
|
|
378
|
+
sameDateError
|
|
369
379
|
})
|
|
370
380
|
});
|
|
371
381
|
}
|
|
@@ -392,7 +402,8 @@ function DateRangePickerPanel({
|
|
|
392
402
|
viewMode: initialViewMode,
|
|
393
403
|
dateTimeFormat,
|
|
394
404
|
minStart,
|
|
395
|
-
maxEnd
|
|
405
|
+
maxEnd,
|
|
406
|
+
sameDateError
|
|
396
407
|
})
|
|
397
408
|
});
|
|
398
409
|
}
|
|
@@ -405,7 +416,8 @@ function DateRangePickerPanel({
|
|
|
405
416
|
viewMode: initialViewMode,
|
|
406
417
|
dateTimeFormat,
|
|
407
418
|
minStart,
|
|
408
|
-
maxEnd
|
|
419
|
+
maxEnd,
|
|
420
|
+
sameDateError
|
|
409
421
|
})
|
|
410
422
|
});
|
|
411
423
|
}
|
|
@@ -23,12 +23,13 @@ export declare const INITIAL_DIRECTION: {
|
|
|
23
23
|
export type InitialDirection = ValueOf<typeof INITIAL_DIRECTION>;
|
|
24
24
|
export type DateRangePickerProps = {
|
|
25
25
|
onUpdate: (updatedStart: Moment, updatedEnd: Moment) => void;
|
|
26
|
-
validateOnClick
|
|
27
|
-
validateOnChange
|
|
26
|
+
validateOnClick?: ValidateOnClick;
|
|
27
|
+
validateOnChange?: ValidateOnChange;
|
|
28
28
|
start: Moment;
|
|
29
29
|
end: Moment;
|
|
30
30
|
minStart?: Moment;
|
|
31
31
|
maxEnd?: Moment;
|
|
32
|
+
sameDateError?: boolean;
|
|
32
33
|
labelFormat?: string;
|
|
33
34
|
anchorType?: AnchorType;
|
|
34
35
|
isDisabled?: boolean;
|
|
@@ -50,5 +51,5 @@ export type DateRangePickerProps = {
|
|
|
50
51
|
* @midnight-gray-supported
|
|
51
52
|
* @alpine-light-supported
|
|
52
53
|
* */
|
|
53
|
-
declare function DateRangePicker({ onUpdate, validateOnChange, validateOnClick, start, end, minStart, maxEnd, labelFormat, anchorType, buttonText, cancelButtonText, resetText, dateFormat, timeFormat, initialDirection, initialViewMode, placement, showTimeZoneSuffix, isDisabled, utcSuffix, dateStartInputAriaLabel, dateEndInputAriaLabel, }: DateRangePickerProps): import("react/jsx-runtime").JSX.Element;
|
|
54
|
+
declare function DateRangePicker({ onUpdate, validateOnChange, validateOnClick, start, end, minStart, maxEnd, sameDateError, labelFormat, anchorType, buttonText, cancelButtonText, resetText, dateFormat, timeFormat, initialDirection, initialViewMode, placement, showTimeZoneSuffix, isDisabled, utcSuffix, dateStartInputAriaLabel, dateEndInputAriaLabel, }: DateRangePickerProps): import("react/jsx-runtime").JSX.Element;
|
|
54
55
|
export default DateRangePicker;
|
|
@@ -41,6 +41,7 @@ function DateRangePicker({
|
|
|
41
41
|
end,
|
|
42
42
|
minStart,
|
|
43
43
|
maxEnd,
|
|
44
|
+
sameDateError,
|
|
44
45
|
labelFormat,
|
|
45
46
|
anchorType = ANCHOR_TYPES.BUTTON,
|
|
46
47
|
buttonText,
|
|
@@ -120,6 +121,7 @@ function DateRangePicker({
|
|
|
120
121
|
defaultEnd: end,
|
|
121
122
|
minStart: minStart,
|
|
122
123
|
maxEnd: maxEnd,
|
|
124
|
+
sameDateError: sameDateError,
|
|
123
125
|
dateFormat: dateFormat,
|
|
124
126
|
timeFormat: timeFormat,
|
|
125
127
|
initialViewMode: initialViewMode,
|
|
@@ -2,6 +2,35 @@ import React, { RefObject } from 'react';
|
|
|
2
2
|
import moment, { MomentInput, Moment, unitOfTime } from 'moment';
|
|
3
3
|
import Datetime from 'react-datetime';
|
|
4
4
|
import { InitialDirection } from './datetime-range-picker';
|
|
5
|
+
export declare function useValidateOnClick(): ({ start, end, minStart, maxEnd, viewMode, dateTimeFormat, sameDateError, }: {
|
|
6
|
+
start?: moment.Moment | null | undefined;
|
|
7
|
+
end?: moment.Moment | null | undefined;
|
|
8
|
+
viewMode: string;
|
|
9
|
+
dateTimeFormat: string;
|
|
10
|
+
minStart?: moment.Moment | undefined;
|
|
11
|
+
maxEnd?: moment.Moment | undefined;
|
|
12
|
+
sameDateError?: boolean | undefined;
|
|
13
|
+
}) => {
|
|
14
|
+
startErrors: {
|
|
15
|
+
START_BEFORE_MIN?: string | undefined;
|
|
16
|
+
START_AFTER_MAX?: string | undefined;
|
|
17
|
+
INVALID_START_DATE?: string | undefined;
|
|
18
|
+
START_END_SAME?: string | undefined;
|
|
19
|
+
};
|
|
20
|
+
endErrors: {
|
|
21
|
+
INVALID_END_DATE?: string | undefined;
|
|
22
|
+
END_AFTER_MIN?: string | undefined;
|
|
23
|
+
END_AFTER_MAX?: string | undefined;
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
/** Checks whether a string can be strictly parsed as a moment object following a provided datetime format
|
|
27
|
+
*
|
|
28
|
+
* @param {string} proposedDateTime
|
|
29
|
+
* @param {string} dateTimeFormat
|
|
30
|
+
* @returns {boolean}
|
|
31
|
+
*/
|
|
32
|
+
export declare function isValidDateTime(proposedDateTime: string, dateTimeFormat: string): boolean;
|
|
33
|
+
export declare function useGetDateTimeValidityError(): (dateTime: string, dateTimeFormat: string) => string | undefined;
|
|
5
34
|
export interface StringToMomentParams {
|
|
6
35
|
dateTimeFormat?: string;
|
|
7
36
|
strictParse?: boolean;
|
|
@@ -13,17 +13,140 @@ exports.getValidityFromErrors = getValidityFromErrors;
|
|
|
13
13
|
exports.isMonthRelatedToTimePicker = isMonthRelatedToTimePicker;
|
|
14
14
|
exports.isNavigationAvailableForMonthsView = isNavigationAvailableForMonthsView;
|
|
15
15
|
exports.isNavigationAvailableForYearsView = isNavigationAvailableForYearsView;
|
|
16
|
+
exports.isValidDateTime = isValidDateTime;
|
|
16
17
|
exports.truncateDateTimeToFormat = truncateDateTimeToFormat;
|
|
18
|
+
exports.useGetDateTimeValidityError = useGetDateTimeValidityError;
|
|
19
|
+
exports.useValidateOnClick = useValidateOnClick;
|
|
17
20
|
var _react = _interopRequireDefault(require("react"));
|
|
18
21
|
var _moment = _interopRequireDefault(require("moment"));
|
|
19
22
|
var _isEmpty = _interopRequireDefault(require("lodash-es/isEmpty"));
|
|
23
|
+
var _omit = _interopRequireDefault(require("lodash-es/omit"));
|
|
20
24
|
var _formField = require("../form-field");
|
|
21
25
|
var _message = require("../message");
|
|
22
26
|
var _button = require("../button");
|
|
23
27
|
var _datetimeRangePicker = require("./datetime-range-picker");
|
|
28
|
+
var _useTranslation = require("../hooks/use-translation");
|
|
29
|
+
var _datetimeRangePickerPanel = require("./datetime-range-picker-panel");
|
|
24
30
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
25
31
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
26
32
|
const DEFAULT_DATETIME_FORMAT = 'YYYY-MM-DDTHH:mm:ss.SSSSSSZ';
|
|
33
|
+
const VALIDATION_ENTITY = {
|
|
34
|
+
days: {
|
|
35
|
+
start: 'Start Date',
|
|
36
|
+
end: 'End Date'
|
|
37
|
+
},
|
|
38
|
+
months: {
|
|
39
|
+
start: 'Start Month',
|
|
40
|
+
end: 'End Month'
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
function useValidateOnClick() {
|
|
44
|
+
const {
|
|
45
|
+
t
|
|
46
|
+
} = (0, _useTranslation.useTranslation)();
|
|
47
|
+
return function validateOnClick({
|
|
48
|
+
start,
|
|
49
|
+
end,
|
|
50
|
+
minStart,
|
|
51
|
+
maxEnd,
|
|
52
|
+
viewMode,
|
|
53
|
+
dateTimeFormat,
|
|
54
|
+
sameDateError
|
|
55
|
+
}) {
|
|
56
|
+
const [minStartTrimmed, maxEndTrimmed] = [minStart, maxEnd].map(datetime => datetime ? truncateDateTimeToFormat(datetime, dateTimeFormat) : null);
|
|
57
|
+
const startErrors = {};
|
|
58
|
+
let endErrors = {};
|
|
59
|
+
if (minStartTrimmed && start?.isBefore(minStartTrimmed)) {
|
|
60
|
+
startErrors[_datetimeRangePickerPanel.DATE_RANGE_ERROR_TYPES.START_BEFORE_MIN] = t('{{fieldName}} cannot be before {{date}}.', {
|
|
61
|
+
fieldName: VALIDATION_ENTITY[viewMode].start,
|
|
62
|
+
date: minStartTrimmed.format(dateTimeFormat)
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
if (maxEndTrimmed && start?.isAfter(maxEndTrimmed)) {
|
|
66
|
+
startErrors[_datetimeRangePickerPanel.DATE_RANGE_ERROR_TYPES.START_AFTER_MAX] = t('{{fieldName}} cannot be after {{date}}.', {
|
|
67
|
+
fieldName: VALIDATION_ENTITY[viewMode].start,
|
|
68
|
+
date: maxEndTrimmed.format(dateTimeFormat)
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
if (maxEndTrimmed && end?.isAfter(maxEndTrimmed)) {
|
|
72
|
+
endErrors[_datetimeRangePickerPanel.DATE_RANGE_ERROR_TYPES.END_AFTER_MAX] = t('{{fieldName}} cannot be after {{date}}.', {
|
|
73
|
+
fieldName: VALIDATION_ENTITY[viewMode].end,
|
|
74
|
+
date: maxEndTrimmed.format(dateTimeFormat)
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
if (minStartTrimmed && end?.isBefore(minStartTrimmed)) {
|
|
78
|
+
endErrors[_datetimeRangePickerPanel.DATE_RANGE_ERROR_TYPES.END_AFTER_MIN] = t('{{fieldName}} cannot be before {{date}}.', {
|
|
79
|
+
fieldName: VALIDATION_ENTITY[viewMode].end,
|
|
80
|
+
date: minStartTrimmed.format(dateTimeFormat)
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
if (!start?.isValid()) {
|
|
84
|
+
startErrors[_datetimeRangePickerPanel.DATE_RANGE_ERROR_TYPES.INVALID_START_DATE] = t('You need to set {{fieldName}}', {
|
|
85
|
+
fieldName: VALIDATION_ENTITY[viewMode].start
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
if (!end?.isValid()) {
|
|
89
|
+
endErrors[_datetimeRangePickerPanel.DATE_RANGE_ERROR_TYPES.INVALID_END_DATE] = t('You need to set {{fieldName}}', {
|
|
90
|
+
fieldName: VALIDATION_ENTITY[viewMode].end
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
if (start && !end?.isValid()) {
|
|
94
|
+
endErrors[_datetimeRangePickerPanel.DATE_RANGE_ERROR_TYPES.INVALID_END_DATE] = t('You need to set {{fieldName}}', {
|
|
95
|
+
fieldName: VALIDATION_ENTITY[viewMode].end
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
if (start && end && end.isValid()) {
|
|
99
|
+
endErrors = (0, _omit.default)(endErrors, [_datetimeRangePickerPanel.DATE_RANGE_ERROR_TYPES.INVALID_END_DATE]);
|
|
100
|
+
}
|
|
101
|
+
if (sameDateError && start?.isSame(end)) {
|
|
102
|
+
startErrors[_datetimeRangePickerPanel.DATE_RANGE_ERROR_TYPES.START_END_SAME] = t('{{startField}} and {{endField}} cannot be the same', {
|
|
103
|
+
startField: VALIDATION_ENTITY[viewMode].start,
|
|
104
|
+
endField: VALIDATION_ENTITY[viewMode].end
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
startErrors,
|
|
109
|
+
endErrors
|
|
110
|
+
};
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/** Checks whether a string can be strictly parsed as a moment object following a provided datetime format
|
|
115
|
+
*
|
|
116
|
+
* @param {string} proposedDateTime
|
|
117
|
+
* @param {string} dateTimeFormat
|
|
118
|
+
* @returns {boolean}
|
|
119
|
+
*/
|
|
120
|
+
function isValidDateTime(proposedDateTime, dateTimeFormat) {
|
|
121
|
+
try {
|
|
122
|
+
convertStringToMoment(proposedDateTime, {
|
|
123
|
+
dateTimeFormat
|
|
124
|
+
})?.isValid();
|
|
125
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
126
|
+
} catch (err) {
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
return true;
|
|
130
|
+
}
|
|
131
|
+
function useGetDateTimeValidityError() {
|
|
132
|
+
const {
|
|
133
|
+
t
|
|
134
|
+
} = (0, _useTranslation.useTranslation)();
|
|
135
|
+
return function getDateTimeValidityError(dateTime, dateTimeFormat) {
|
|
136
|
+
if (_moment.default.isMoment(dateTime)) {
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
if (typeof dateTime === 'string') {
|
|
140
|
+
if (isValidDateTime(dateTime, dateTimeFormat)) {
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
return t('Must follow {{dateTimeFormat}} format', {
|
|
144
|
+
dateTimeFormat
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
return t('Expected a datetime');
|
|
148
|
+
};
|
|
149
|
+
}
|
|
27
150
|
function getValidityFromErrors(errorMapping) {
|
|
28
151
|
let validityValues;
|
|
29
152
|
if ((0, _isEmpty.default)(errorMapping)) {
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { ReactElement } from 'react';
|
|
2
|
-
import PropTypes from 'prop-types';
|
|
3
2
|
import { ValueOf } from '../types';
|
|
4
3
|
import 'codemirror/mode/sql/sql';
|
|
5
4
|
import 'codemirror/mode/javascript/javascript';
|
|
@@ -57,21 +56,6 @@ export type CodeEditorOptions = {
|
|
|
57
56
|
readOnly?: string | boolean;
|
|
58
57
|
theme?: CodeEditorTheme;
|
|
59
58
|
};
|
|
60
|
-
export declare const CodeEditorOptionsShape: PropTypes.Requireable<PropTypes.InferProps<{
|
|
61
|
-
lineWrapping: PropTypes.Requireable<boolean>;
|
|
62
|
-
tabSize: PropTypes.Requireable<number>;
|
|
63
|
-
value: PropTypes.Requireable<string>;
|
|
64
|
-
mode: PropTypes.Requireable<"r" | "python" | "text/plain" | "text/x-sparksql" | "javascript" | "shell" | "htmlmixed" | "clike" | "yaml" | "xml" | {
|
|
65
|
-
name: "javascript";
|
|
66
|
-
json: boolean;
|
|
67
|
-
}>;
|
|
68
|
-
lineNumbers: PropTypes.Requireable<boolean>;
|
|
69
|
-
indentWithTabs: PropTypes.Requireable<boolean>;
|
|
70
|
-
smartIndent: PropTypes.Requireable<boolean>;
|
|
71
|
-
matchBrackets: PropTypes.Requireable<boolean>;
|
|
72
|
-
readOnly: PropTypes.Requireable<NonNullable<string | boolean | null | undefined>>;
|
|
73
|
-
theme: PropTypes.Requireable<"default" | "dracula">;
|
|
74
|
-
}>>;
|
|
75
59
|
export type CodeEditorControls = {
|
|
76
60
|
placement?: CORNER_PLACEMENTS_TYPES;
|
|
77
61
|
element?: ReactElement;
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import PropTypes from 'prop-types';
|
|
3
2
|
import classnames from 'classnames';
|
|
4
3
|
import InjectCombinedHint from './utils/hint-wrapper';
|
|
5
4
|
import { InjectSearch } from './utils/search-wrapper';
|
|
@@ -57,19 +56,6 @@ const DefaultOptions = {
|
|
|
57
56
|
matchBrackets: true,
|
|
58
57
|
theme: CODE_EDITOR_THEMES.DARK
|
|
59
58
|
};
|
|
60
|
-
// Keeping this for backwards compatiblity
|
|
61
|
-
export const CodeEditorOptionsShape = PropTypes.shape({
|
|
62
|
-
lineWrapping: PropTypes.bool,
|
|
63
|
-
tabSize: PropTypes.number,
|
|
64
|
-
value: PropTypes.string,
|
|
65
|
-
mode: PropTypes.oneOf([...Object.values(CODE_EDITOR_MODES), JSON_MODE]),
|
|
66
|
-
lineNumbers: PropTypes.bool,
|
|
67
|
-
indentWithTabs: PropTypes.bool,
|
|
68
|
-
smartIndent: PropTypes.bool,
|
|
69
|
-
matchBrackets: PropTypes.bool,
|
|
70
|
-
readOnly: PropTypes.oneOfType([PropTypes.bool, PropTypes.string]),
|
|
71
|
-
theme: PropTypes.oneOf(Object.values(CODE_EDITOR_THEMES))
|
|
72
|
-
});
|
|
73
59
|
|
|
74
60
|
// We need this to ignore an error when defaultProps are defined but the linters throws an error
|
|
75
61
|
|
|
@@ -36,8 +36,9 @@ type ValidateOnClickProps = {
|
|
|
36
36
|
dateTimeFormat: string;
|
|
37
37
|
minStart?: Moment;
|
|
38
38
|
maxEnd?: Moment;
|
|
39
|
+
sameDateError?: boolean;
|
|
39
40
|
};
|
|
40
|
-
export type ValidateOnClick = ({ start, end, viewMode, dateTimeFormat, minStart, maxEnd, }: ValidateOnClickProps) => {
|
|
41
|
+
export type ValidateOnClick = ({ start, end, viewMode, dateTimeFormat, minStart, maxEnd, sameDateError, }: ValidateOnClickProps) => {
|
|
41
42
|
startErrors: DateRangeErrors;
|
|
42
43
|
endErrors: DateRangeErrors;
|
|
43
44
|
};
|
|
@@ -53,16 +54,17 @@ export type DateRangePickerPanelProps = {
|
|
|
53
54
|
initialTargetInput?: DateRangeInputType;
|
|
54
55
|
maxEnd?: Moment;
|
|
55
56
|
minStart?: Moment;
|
|
57
|
+
sameDateError?: boolean;
|
|
56
58
|
onSubmit: (start: Moment, end: Moment) => void;
|
|
57
59
|
onDismiss: () => void;
|
|
58
60
|
resetText?: string;
|
|
59
61
|
timeFormat: string | boolean;
|
|
60
62
|
utcSuffix?: string;
|
|
61
|
-
validateOnClick
|
|
62
|
-
validateOnChange
|
|
63
|
+
validateOnClick?: ValidateOnClick;
|
|
64
|
+
validateOnChange?: ValidateOnChange;
|
|
63
65
|
dateStartInputAriaLabel: string;
|
|
64
66
|
dateEndInputAriaLabel: string;
|
|
65
67
|
};
|
|
66
68
|
/** Represents the panel used to select two datetimes that make up a range. */
|
|
67
|
-
declare function DateRangePickerPanel({ buttonText, cancelButtonText, dateFormat, defaultEnd, defaultStart, initialDirection, initialViewMode, initialTargetInput, maxEnd, minStart, onSubmit, onDismiss, resetText, timeFormat, utcSuffix, validateOnClick, validateOnChange, dateStartInputAriaLabel, dateEndInputAriaLabel, }: DateRangePickerPanelProps): import("react/jsx-runtime").JSX.Element;
|
|
69
|
+
declare function DateRangePickerPanel({ buttonText, cancelButtonText, dateFormat, defaultEnd, defaultStart, initialDirection, initialViewMode, initialTargetInput, maxEnd, minStart, sameDateError, onSubmit, onDismiss, resetText, timeFormat, utcSuffix, validateOnClick: propValidateOnClick, validateOnChange: propValidateOnChange, dateStartInputAriaLabel, dateEndInputAriaLabel, }: DateRangePickerPanelProps): import("react/jsx-runtime").JSX.Element;
|
|
68
70
|
export default DateRangePickerPanel;
|
|
@@ -7,7 +7,7 @@ import { ValidityMessages } from '../form-field';
|
|
|
7
7
|
import DateRangeSingleDatePicker from './date-range-single-date-picker';
|
|
8
8
|
import { VIEW_MODE_TYPE } from './datetime-range-picker';
|
|
9
9
|
import DateRangeSingleDatePickerInput from './date-range-single-date-picker-input';
|
|
10
|
-
import { getValidityFromErrors, customizeCalendarView, customizeRenderCalendarView, isMonthRelatedToTimePicker, isNavigationAvailableForMonthsView, isNavigationAvailableForYearsView, getLeftCalendarInitialView, getRightCalendarInitialView, truncateDateTimeToFormat, convertStringToMoment, getDateTimeFormat } from './helpers';
|
|
10
|
+
import { getValidityFromErrors, customizeCalendarView, customizeRenderCalendarView, isMonthRelatedToTimePicker, isNavigationAvailableForMonthsView, isNavigationAvailableForYearsView, getLeftCalendarInitialView, getRightCalendarInitialView, truncateDateTimeToFormat, convertStringToMoment, getDateTimeFormat, useValidateOnClick, useGetDateTimeValidityError } from './helpers';
|
|
11
11
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
12
12
|
export let DATE_RANGE_ERROR_TYPES = /*#__PURE__*/function (DATE_RANGE_ERROR_TYPES) {
|
|
13
13
|
DATE_RANGE_ERROR_TYPES["INVALID_DATETIME"] = "INVALID_DATETIME";
|
|
@@ -83,16 +83,21 @@ function DateRangePickerPanel({
|
|
|
83
83
|
initialTargetInput,
|
|
84
84
|
maxEnd,
|
|
85
85
|
minStart,
|
|
86
|
+
sameDateError,
|
|
86
87
|
onSubmit,
|
|
87
88
|
onDismiss,
|
|
88
89
|
resetText,
|
|
89
90
|
timeFormat,
|
|
90
91
|
utcSuffix,
|
|
91
|
-
validateOnClick,
|
|
92
|
-
validateOnChange,
|
|
92
|
+
validateOnClick: propValidateOnClick,
|
|
93
|
+
validateOnChange: propValidateOnChange,
|
|
93
94
|
dateStartInputAriaLabel,
|
|
94
95
|
dateEndInputAriaLabel
|
|
95
96
|
}) {
|
|
97
|
+
const defaultValidateOnClick = useValidateOnClick();
|
|
98
|
+
const defaultValidateOnChange = useGetDateTimeValidityError();
|
|
99
|
+
const validateOnClick = propValidateOnClick || defaultValidateOnClick;
|
|
100
|
+
const validateOnChange = propValidateOnChange || defaultValidateOnChange;
|
|
96
101
|
const dateTimeFormat = getDateTimeFormat(dateFormat, timeFormat);
|
|
97
102
|
|
|
98
103
|
// Developer-provided datetimes might not always follow the exact date and time format they want to use.
|
|
@@ -156,7 +161,8 @@ function DateRangePickerPanel({
|
|
|
156
161
|
viewMode: initialViewMode,
|
|
157
162
|
dateTimeFormat,
|
|
158
163
|
minStart,
|
|
159
|
-
maxEnd
|
|
164
|
+
maxEnd,
|
|
165
|
+
sameDateError
|
|
160
166
|
})
|
|
161
167
|
});
|
|
162
168
|
}
|
|
@@ -176,7 +182,8 @@ function DateRangePickerPanel({
|
|
|
176
182
|
viewMode: initialViewMode,
|
|
177
183
|
dateTimeFormat,
|
|
178
184
|
minStart,
|
|
179
|
-
maxEnd
|
|
185
|
+
maxEnd,
|
|
186
|
+
sameDateError
|
|
180
187
|
})
|
|
181
188
|
});
|
|
182
189
|
}
|
|
@@ -198,7 +205,8 @@ function DateRangePickerPanel({
|
|
|
198
205
|
viewMode: initialViewMode,
|
|
199
206
|
dateTimeFormat,
|
|
200
207
|
minStart,
|
|
201
|
-
maxEnd
|
|
208
|
+
maxEnd,
|
|
209
|
+
sameDateError
|
|
202
210
|
})
|
|
203
211
|
});
|
|
204
212
|
}
|
|
@@ -344,7 +352,8 @@ function DateRangePickerPanel({
|
|
|
344
352
|
viewMode: initialViewMode,
|
|
345
353
|
dateTimeFormat,
|
|
346
354
|
minStart,
|
|
347
|
-
maxEnd
|
|
355
|
+
maxEnd,
|
|
356
|
+
sameDateError
|
|
348
357
|
})
|
|
349
358
|
});
|
|
350
359
|
}
|
|
@@ -357,7 +366,8 @@ function DateRangePickerPanel({
|
|
|
357
366
|
viewMode: initialViewMode,
|
|
358
367
|
dateTimeFormat,
|
|
359
368
|
minStart,
|
|
360
|
-
maxEnd
|
|
369
|
+
maxEnd,
|
|
370
|
+
sameDateError
|
|
361
371
|
})
|
|
362
372
|
});
|
|
363
373
|
}
|
|
@@ -384,7 +394,8 @@ function DateRangePickerPanel({
|
|
|
384
394
|
viewMode: initialViewMode,
|
|
385
395
|
dateTimeFormat,
|
|
386
396
|
minStart,
|
|
387
|
-
maxEnd
|
|
397
|
+
maxEnd,
|
|
398
|
+
sameDateError
|
|
388
399
|
})
|
|
389
400
|
});
|
|
390
401
|
}
|
|
@@ -397,7 +408,8 @@ function DateRangePickerPanel({
|
|
|
397
408
|
viewMode: initialViewMode,
|
|
398
409
|
dateTimeFormat,
|
|
399
410
|
minStart,
|
|
400
|
-
maxEnd
|
|
411
|
+
maxEnd,
|
|
412
|
+
sameDateError
|
|
401
413
|
})
|
|
402
414
|
});
|
|
403
415
|
}
|
|
@@ -23,12 +23,13 @@ export declare const INITIAL_DIRECTION: {
|
|
|
23
23
|
export type InitialDirection = ValueOf<typeof INITIAL_DIRECTION>;
|
|
24
24
|
export type DateRangePickerProps = {
|
|
25
25
|
onUpdate: (updatedStart: Moment, updatedEnd: Moment) => void;
|
|
26
|
-
validateOnClick
|
|
27
|
-
validateOnChange
|
|
26
|
+
validateOnClick?: ValidateOnClick;
|
|
27
|
+
validateOnChange?: ValidateOnChange;
|
|
28
28
|
start: Moment;
|
|
29
29
|
end: Moment;
|
|
30
30
|
minStart?: Moment;
|
|
31
31
|
maxEnd?: Moment;
|
|
32
|
+
sameDateError?: boolean;
|
|
32
33
|
labelFormat?: string;
|
|
33
34
|
anchorType?: AnchorType;
|
|
34
35
|
isDisabled?: boolean;
|
|
@@ -50,5 +51,5 @@ export type DateRangePickerProps = {
|
|
|
50
51
|
* @midnight-gray-supported
|
|
51
52
|
* @alpine-light-supported
|
|
52
53
|
* */
|
|
53
|
-
declare function DateRangePicker({ onUpdate, validateOnChange, validateOnClick, start, end, minStart, maxEnd, labelFormat, anchorType, buttonText, cancelButtonText, resetText, dateFormat, timeFormat, initialDirection, initialViewMode, placement, showTimeZoneSuffix, isDisabled, utcSuffix, dateStartInputAriaLabel, dateEndInputAriaLabel, }: DateRangePickerProps): import("react/jsx-runtime").JSX.Element;
|
|
54
|
+
declare function DateRangePicker({ onUpdate, validateOnChange, validateOnClick, start, end, minStart, maxEnd, sameDateError, labelFormat, anchorType, buttonText, cancelButtonText, resetText, dateFormat, timeFormat, initialDirection, initialViewMode, placement, showTimeZoneSuffix, isDisabled, utcSuffix, dateStartInputAriaLabel, dateEndInputAriaLabel, }: DateRangePickerProps): import("react/jsx-runtime").JSX.Element;
|
|
54
55
|
export default DateRangePicker;
|
|
@@ -33,6 +33,7 @@ function DateRangePicker({
|
|
|
33
33
|
end,
|
|
34
34
|
minStart,
|
|
35
35
|
maxEnd,
|
|
36
|
+
sameDateError,
|
|
36
37
|
labelFormat,
|
|
37
38
|
anchorType = ANCHOR_TYPES.BUTTON,
|
|
38
39
|
buttonText,
|
|
@@ -112,6 +113,7 @@ function DateRangePicker({
|
|
|
112
113
|
defaultEnd: end,
|
|
113
114
|
minStart: minStart,
|
|
114
115
|
maxEnd: maxEnd,
|
|
116
|
+
sameDateError: sameDateError,
|
|
115
117
|
dateFormat: dateFormat,
|
|
116
118
|
timeFormat: timeFormat,
|
|
117
119
|
initialViewMode: initialViewMode,
|
|
@@ -2,6 +2,35 @@ import React, { RefObject } from 'react';
|
|
|
2
2
|
import moment, { MomentInput, Moment, unitOfTime } from 'moment';
|
|
3
3
|
import Datetime from 'react-datetime';
|
|
4
4
|
import { InitialDirection } from './datetime-range-picker';
|
|
5
|
+
export declare function useValidateOnClick(): ({ start, end, minStart, maxEnd, viewMode, dateTimeFormat, sameDateError, }: {
|
|
6
|
+
start?: moment.Moment | null | undefined;
|
|
7
|
+
end?: moment.Moment | null | undefined;
|
|
8
|
+
viewMode: string;
|
|
9
|
+
dateTimeFormat: string;
|
|
10
|
+
minStart?: moment.Moment | undefined;
|
|
11
|
+
maxEnd?: moment.Moment | undefined;
|
|
12
|
+
sameDateError?: boolean | undefined;
|
|
13
|
+
}) => {
|
|
14
|
+
startErrors: {
|
|
15
|
+
START_BEFORE_MIN?: string | undefined;
|
|
16
|
+
START_AFTER_MAX?: string | undefined;
|
|
17
|
+
INVALID_START_DATE?: string | undefined;
|
|
18
|
+
START_END_SAME?: string | undefined;
|
|
19
|
+
};
|
|
20
|
+
endErrors: {
|
|
21
|
+
INVALID_END_DATE?: string | undefined;
|
|
22
|
+
END_AFTER_MIN?: string | undefined;
|
|
23
|
+
END_AFTER_MAX?: string | undefined;
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
/** Checks whether a string can be strictly parsed as a moment object following a provided datetime format
|
|
27
|
+
*
|
|
28
|
+
* @param {string} proposedDateTime
|
|
29
|
+
* @param {string} dateTimeFormat
|
|
30
|
+
* @returns {boolean}
|
|
31
|
+
*/
|
|
32
|
+
export declare function isValidDateTime(proposedDateTime: string, dateTimeFormat: string): boolean;
|
|
33
|
+
export declare function useGetDateTimeValidityError(): (dateTime: string, dateTimeFormat: string) => string | undefined;
|
|
5
34
|
export interface StringToMomentParams {
|
|
6
35
|
dateTimeFormat?: string;
|
|
7
36
|
strictParse?: boolean;
|