carbon-addons-iot-react 4.4.1 → 4.5.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.
Files changed (39) hide show
  1. package/README.MD +6 -2
  2. package/es/components/BarChartCard/BarChartCard.js +16 -4
  3. package/es/components/BarChartCard/barChartUtils.js +8 -7
  4. package/es/components/Card/Card.js +8 -5
  5. package/es/components/Card/CardToolbar.js +3 -1
  6. package/es/components/DateTimePicker/DateTimePicker.js +29 -10
  7. package/es/components/DateTimePicker/DateTimePickerV2WithTimeSpinner.js +2 -3
  8. package/es/components/DateTimePicker/DateTimePickerV2WithoutTimeSpinner.js +30 -10
  9. package/es/components/DateTimePicker/dateTimePickerUtils.js +34 -29
  10. package/es/components/ImageCard/ImageCard.js +15 -2
  11. package/es/components/ListCard/ListCard.js +7 -2
  12. package/es/components/TableCard/TableCard.js +15 -4
  13. package/es/components/TableCard/tableCardUtils.js +2 -2
  14. package/es/components/TimeSeriesCard/TimeSeriesCard.js +15 -4
  15. package/es/components/TimeSeriesCard/timeSeriesUtils.js +2 -2
  16. package/es/components/ValueCard/ValueCard.js +6 -1
  17. package/es/constants/CardPropTypes.js +2 -0
  18. package/es/utils/cardUtilityFunctions.js +1 -1
  19. package/es/utils/dayjs.js +21 -1
  20. package/lib/components/BarChartCard/BarChartCard.js +16 -4
  21. package/lib/components/BarChartCard/barChartUtils.js +8 -7
  22. package/lib/components/Card/Card.js +7 -4
  23. package/lib/components/Card/CardToolbar.js +3 -1
  24. package/lib/components/DateTimePicker/DateTimePicker.js +28 -9
  25. package/lib/components/DateTimePicker/DateTimePickerV2WithTimeSpinner.js +2 -3
  26. package/lib/components/DateTimePicker/DateTimePickerV2WithoutTimeSpinner.js +29 -9
  27. package/lib/components/DateTimePicker/dateTimePickerUtils.js +34 -29
  28. package/lib/components/ImageCard/ImageCard.js +15 -2
  29. package/lib/components/ListCard/ListCard.js +7 -2
  30. package/lib/components/TableCard/TableCard.js +15 -4
  31. package/lib/components/TableCard/tableCardUtils.js +2 -2
  32. package/lib/components/TimeSeriesCard/TimeSeriesCard.js +15 -4
  33. package/lib/components/TimeSeriesCard/timeSeriesUtils.js +2 -2
  34. package/lib/components/ValueCard/ValueCard.js +6 -1
  35. package/lib/constants/CardPropTypes.js +2 -0
  36. package/lib/utils/cardUtilityFunctions.js +1 -1
  37. package/lib/utils/dayjs.js +22 -0
  38. package/package.json +1 -1
  39. package/umd/carbon-addons-iot-react.js +234 -111
@@ -815,7 +815,6 @@ var DateTimePicker = function DateTimePicker(_ref2) {
815
815
  return setInvalidState(invalid);
816
816
  }, [invalid]);
817
817
  var onApplyClick = function onApplyClick() {
818
- var _value$absolute$start, _value$absolute$end;
819
818
  var value = renderValue();
820
819
  var returnValue = {
821
820
  timeRangeKind: value.kind,
@@ -830,8 +829,8 @@ var DateTimePicker = function DateTimePicker(_ref2) {
830
829
  returnValue.timeRangeValue = _objectSpread(_objectSpread({}, value.absolute), {}, {
831
830
  humanValue: humanValue,
832
831
  tooltipValue: tooltipValue,
833
- ISOStart: (_value$absolute$start = value.absolute.start) === null || _value$absolute$start === void 0 ? void 0 : _value$absolute$start.toISOString(),
834
- ISOEnd: (_value$absolute$end = value.absolute.end) === null || _value$absolute$end === void 0 ? void 0 : _value$absolute$end.toISOString()
832
+ ISOStart: value.absolute.start ? new Date(value.absolute.start).toISOString() : undefined,
833
+ ISOEnd: value.absolute.end ? new Date(value.absolute.end).toISOString() : undefined
835
834
  });
836
835
  break;
837
836
  case DateConstants.PICKER_KINDS.SINGLE:
@@ -43,7 +43,7 @@ var PropTypes__default = /*#__PURE__*/_interopDefault(PropTypes);
43
43
  var classnames__default = /*#__PURE__*/_interopDefault(classnames);
44
44
  var warning__default = /*#__PURE__*/_interopDefault(warning);
45
45
 
46
- var _excluded = ["testId", "defaultValue", "dateTimeMask", "presets", "intervals", "relatives", "expanded", "disabled", "invalid", "showRelativeOption", "showCustomRangeLink", "hasTimeInput", "renderPresetTooltipText", "onCancel", "onApply", "i18n", "light", "locale", "hasIconOnly", "menuOffset", "renderInPortal", "useAutoPositioning", "style", "buttonProps"];
46
+ var _excluded = ["testId", "defaultValue", "dateTimeMask", "presets", "intervals", "relatives", "expanded", "disabled", "invalid", "showRelativeOption", "showCustomRangeLink", "hasTimeInput", "renderPresetTooltipText", "onCancel", "onApply", "i18n", "light", "locale", "timeZone", "hasIconOnly", "menuOffset", "renderInPortal", "useAutoPositioning", "style", "buttonProps"];
47
47
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
48
48
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty__default.default(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
49
49
  var iotPrefix = Settings.settings.iotPrefix,
@@ -153,6 +153,8 @@ var propTypes = {
153
153
  light: PropTypes__default.default.bool,
154
154
  /** The language locale used to format the days of the week, months, and numbers. */
155
155
  locale: PropTypes__default.default.string,
156
+ /** IANA timezone string to set as default timezone for dayjs */
157
+ timeZone: PropTypes__default.default.string,
156
158
  /** Unique id of the component */
157
159
  id: PropTypes__default.default.string,
158
160
  /** Optionally renders only an icon rather than displaying the current selected time */
@@ -243,6 +245,7 @@ var defaultProps = {
243
245
  },
244
246
  light: false,
245
247
  locale: 'en',
248
+ timeZone: undefined,
246
249
  id: undefined,
247
250
  hasIconOnly: false,
248
251
  menuOffset: undefined,
@@ -271,6 +274,7 @@ var DateTimePicker = function DateTimePicker(_ref) {
271
274
  i18n = _ref.i18n,
272
275
  light = _ref.light,
273
276
  locale = _ref.locale,
277
+ timeZone = _ref.timeZone,
274
278
  hasIconOnly = _ref.hasIconOnly,
275
279
  menuOffset = _ref.menuOffset,
276
280
  renderInPortal = _ref.renderInPortal,
@@ -278,6 +282,9 @@ var DateTimePicker = function DateTimePicker(_ref) {
278
282
  style = _ref.style,
279
283
  buttonProps = _ref.buttonProps,
280
284
  others = _objectWithoutProperties__default.default(_ref, _excluded);
285
+ var effectiveTimezone = timeZone || dayjs.default.tz.guess();
286
+ dayjs.default.tz.setDefault(effectiveTimezone);
287
+ dayjs.default.locale(locale);
281
288
  var id = React.useRef(others.id || uuid.v4()).current;
282
289
  React__default.default.useEffect(function () {
283
290
  {
@@ -417,7 +424,7 @@ var DateTimePicker = function DateTimePicker(_ref) {
417
424
  value.kind = DateConstants.PICKER_KINDS.PRESET;
418
425
  }
419
426
  setCurrentValue(value);
420
- var parsedValue = dateTimePickerUtils.parseValue(value, dateTimeMask, mergedI18n.toLabel);
427
+ var parsedValue = dateTimePickerUtils.parseValue(value, dateTimeMask, mergedI18n.toLabel, hasTimeInput, effectiveTimezone);
421
428
  setHumanValue(parsedValue.readableValue);
422
429
  return _objectSpread(_objectSpread({}, value), parsedValue);
423
430
  };
@@ -472,15 +479,17 @@ var DateTimePicker = function DateTimePicker(_ref) {
472
479
  setIsCustomRange(true);
473
480
  setCustomRangeKind(DateConstants.PICKER_KINDS.ABSOLUTE);
474
481
  if (!absolute.hasOwnProperty('start')) {
475
- absolute.start = dayjs.default("".concat(absolute.startDate, " ").concat(absolute.startTime)).valueOf();
482
+ var startDateTime = "".concat(absolute.startDate, " ").concat(absolute.startTime);
483
+ absolute.start = dayjs.default.tz(startDateTime, dayjs.detectDateTimeFormat(startDateTime), effectiveTimezone).valueOf();
476
484
  }
477
485
  if (!absolute.hasOwnProperty('end')) {
478
- absolute.end = dayjs.default("".concat(absolute.endDate, " ").concat(absolute.endTime)).valueOf();
486
+ var endDateTime = "".concat(absolute.endDate, " ").concat(absolute.endTime);
487
+ absolute.end = dayjs.default.tz(endDateTime, dayjs.detectDateTimeFormat(endDateTime), effectiveTimezone).valueOf();
479
488
  }
480
- absolute.startDate = dayjs.default(absolute.start).format('MM/DD/YYYY');
481
- absolute.startTime = dayjs.default(absolute.start).format('HH:mm');
482
- absolute.endDate = dayjs.default(absolute.end).format('MM/DD/YYYY');
483
- absolute.endTime = dayjs.default(absolute.end).format('HH:mm');
489
+ absolute.startDate = dayjs.default.tz(absolute.start).format('MM/DD/YYYY');
490
+ absolute.startTime = dayjs.default.tz(absolute.start).format('HH:mm');
491
+ absolute.endDate = dayjs.default.tz(absolute.end).format('MM/DD/YYYY');
492
+ absolute.endTime = dayjs.default.tz(absolute.end).format('HH:mm');
484
493
  setAbsoluteValue(absolute);
485
494
  }
486
495
  } else {
@@ -527,7 +536,7 @@ var DateTimePicker = function DateTimePicker(_ref) {
527
536
  humanValue: humanValue
528
537
  });
529
538
  var disableRelativeApply = isCustomRange && customRangeKind === DateConstants.PICKER_KINDS.RELATIVE && (relativeLastNumberInvalid || relativeToTimeInvalid);
530
- var disableAbsoluteApply = isCustomRange && customRangeKind === DateConstants.PICKER_KINDS.ABSOLUTE && (absoluteStartTimeInvalid || absoluteEndTimeInvalid || absoluteValue.startDate === '' && absoluteValue.endDate === '' || (hasTimeInput ? !absoluteValue.startTime || !absoluteValue.endTime : false));
539
+ var disableAbsoluteApply = isCustomRange && customRangeKind === DateConstants.PICKER_KINDS.ABSOLUTE && (absoluteStartTimeInvalid || absoluteEndTimeInvalid || !absoluteValue.startDate || !absoluteValue.endDate || (hasTimeInput ? !absoluteValue.startTime || !absoluteValue.endTime : false));
531
540
  var disableApply = disableRelativeApply || disableAbsoluteApply;
532
541
  React.useEffect(function () {
533
542
  return setInvalidState(invalid || disableApply);
@@ -1221,6 +1230,17 @@ DateTimePicker.__docgenInfo = {
1221
1230
  },
1222
1231
  "required": false
1223
1232
  },
1233
+ "timeZone": {
1234
+ "defaultValue": {
1235
+ "value": "undefined",
1236
+ "computed": true
1237
+ },
1238
+ "description": "IANA timezone string to set as default timezone for dayjs",
1239
+ "type": {
1240
+ "name": "string"
1241
+ },
1242
+ "required": false
1243
+ },
1224
1244
  "id": {
1225
1245
  "defaultValue": {
1226
1246
  "value": "undefined",
@@ -89,7 +89,7 @@ var format12hourTo24hour = function format12hourTo24hour(time12hour) {
89
89
  * @param {Object} value - the absolute time selection
90
90
  * @returns {Object} a human readable value and a furtherly augmented value object
91
91
  */
92
- var parseValue = function parseValue(timeRange, dateTimeMask, toLabel, hasTimeInput) {
92
+ var parseValue = function parseValue(timeRange, dateTimeMask, toLabel, hasTimeInput, timeZone) {
93
93
  var _timeRange$kind, _timeRange$relative, _timeRange$absolute, _timeRange$single, _timeRange$preset;
94
94
  var readableValue = '';
95
95
  if (!timeRange) {
@@ -109,9 +109,9 @@ var parseValue = function parseValue(timeRange, dateTimeMask, toLabel, hasTimeIn
109
109
  switch (kind) {
110
110
  case DateConstants.PICKER_KINDS.RELATIVE:
111
111
  {
112
- var endDate = dayjs.default();
112
+ var endDate = dayjs.default.tz();
113
113
  if (value.relativeToWhen !== '') {
114
- endDate = value.relativeToWhen === DateConstants.RELATIVE_VALUES.YESTERDAY ? dayjs.default().add(-1, DateConstants.INTERVAL_VALUES.DAYS) : dayjs.default();
114
+ endDate = value.relativeToWhen === DateConstants.RELATIVE_VALUES.YESTERDAY ? dayjs.default.tz().subtract(1, DateConstants.INTERVAL_VALUES.DAYS) : dayjs.default.tz();
115
115
  // wait to parse it until fully typed
116
116
  if (value.relativeToTime.length === 5) {
117
117
  endDate = endDate.hour(Number(value.relativeToTime.split(':')[0]));
@@ -123,37 +123,42 @@ var parseValue = function parseValue(timeRange, dateTimeMask, toLabel, hasTimeIn
123
123
  }
124
124
  returnValue.relative.start = new Date(startDate.valueOf());
125
125
  returnValue.relative.end = new Date(endDate.valueOf());
126
- readableValue = "".concat(dayjs.default(startDate).format(dateTimeMask), " ").concat(toLabel, " ").concat(dayjs.default(endDate).format(dateTimeMask));
126
+ readableValue = "".concat(startDate.format(dateTimeMask), " ").concat(toLabel, " ").concat(endDate.format(dateTimeMask));
127
127
  }
128
128
  break;
129
129
  }
130
130
  case DateConstants.PICKER_KINDS.ABSOLUTE:
131
131
  {
132
- var _value$start, _value$end;
133
- var _startDate = dayjs.default((_value$start = value.start) !== null && _value$start !== void 0 ? _value$start : value.startDate);
134
- if (value.startTime) {
135
- var formatedStartTime = is24hours(dateTimeMask) ? value.startTime : format12hourTo24hour(value.startTime);
136
- _startDate = _startDate.hours(formatedStartTime.split(':')[0]);
137
- _startDate = _startDate.minutes(formatedStartTime.split(':')[1]);
138
- }
139
- if (!returnValue.absolute) {
140
- returnValue.absolute = {};
141
- }
142
- returnValue.absolute.start = new Date(_startDate.valueOf());
143
- var startTimeValue = value.startTime ? "".concat(dayjs.default(_startDate).format(dateTimeMask)) : "".concat(dayjs.default(_startDate).format(dateTimeMask)).split(' ')[0];
144
- if ((_value$end = value.end) !== null && _value$end !== void 0 ? _value$end : value.endDate) {
145
- var _value$end2;
146
- var _endDate = dayjs.default((_value$end2 = value.end) !== null && _value$end2 !== void 0 ? _value$end2 : value.endDate);
147
- if (value.endTime) {
148
- var formatedEndTime = is24hours(dateTimeMask) ? value.endTime : format12hourTo24hour(value.endTime);
149
- _endDate = _endDate.hours(formatedEndTime.split(':')[0]);
150
- _endDate = _endDate.minutes(formatedEndTime.split(':')[1]);
132
+ var _value$start;
133
+ if ((_value$start = value.start) !== null && _value$start !== void 0 ? _value$start : value.startDate) {
134
+ var _value$end;
135
+ var _startDate = value.start instanceof Date ? dayjs.default(value.start).tz(timeZone, true) // Date from picker - preserve local time
136
+ : value.start ? dayjs.default.tz(value.start) // Timestamp - convert from UTC
137
+ : dayjs.default.tz(value.startDate, 'MM/DD/YYYY', timeZone); // String - parse with format
138
+
139
+ if (value.startTime && value.startTime.includes(':')) {
140
+ var formatedStartTime = is24hours(dateTimeMask) ? value.startTime : format12hourTo24hour(value.startTime);
141
+ _startDate = _startDate.hours(formatedStartTime.split(':')[0]);
142
+ _startDate = _startDate.minutes(formatedStartTime.split(':')[1]);
143
+ }
144
+ if (!returnValue.absolute) {
145
+ returnValue.absolute = {};
146
+ }
147
+ returnValue.absolute.start = _startDate.valueOf();
148
+ var startTimeValue = value.startTime ? "".concat(_startDate.format(dateTimeMask)) : "".concat(_startDate.format(dateTimeMask)).split(' ')[0];
149
+ if ((_value$end = value.end) !== null && _value$end !== void 0 ? _value$end : value.endDate) {
150
+ var _endDate = value.end instanceof Date ? dayjs.default(value.end).tz(timeZone, true) : value.end ? dayjs.default(value.end).tz(timeZone) : dayjs.default.tz(value.endDate, 'MM/DD/YYYY', timeZone);
151
+ if (value.endTime && value.endTime.includes(':')) {
152
+ var formatedEndTime = is24hours(dateTimeMask) ? value.endTime : format12hourTo24hour(value.endTime);
153
+ _endDate = _endDate.hours(formatedEndTime.split(':')[0]);
154
+ _endDate = _endDate.minutes(formatedEndTime.split(':')[1]);
155
+ }
156
+ var endTimeValue = value.endTime ? "".concat(_endDate.format(dateTimeMask)) : "".concat(_endDate.format(dateTimeMask)).split(' ')[0];
157
+ returnValue.absolute.end = _endDate.valueOf();
158
+ readableValue = "".concat(startTimeValue, " ").concat(toLabel, " ").concat(endTimeValue);
159
+ } else {
160
+ readableValue = "".concat(startTimeValue, " ").concat(toLabel, " ").concat(startTimeValue);
151
161
  }
152
- var endTimeValue = value.endTime ? "".concat(dayjs.default(_endDate).format(dateTimeMask)) : "".concat(dayjs.default(_endDate).format(dateTimeMask)).split(' ')[0];
153
- returnValue.absolute.end = new Date(_endDate.valueOf());
154
- readableValue = "".concat(startTimeValue, " ").concat(toLabel, " ").concat(endTimeValue);
155
- } else {
156
- readableValue = "".concat(startTimeValue, " ").concat(toLabel, " ").concat(startTimeValue);
157
162
  }
158
163
  break;
159
164
  }
@@ -584,7 +589,7 @@ var getIntervalValue = function getIntervalValue(_ref7) {
584
589
  humanValue = _ref7.humanValue;
585
590
  if (currentValue) {
586
591
  if (currentValue.kind === DateConstants.PICKER_KINDS.PRESET) {
587
- return "".concat(dayjs.default().subtract(currentValue.preset.offset, 'minutes').format(dateTimeMask), " ").concat(mergedI18n.toNowLabel);
592
+ return "".concat(dayjs.default.tz().subtract(currentValue.preset.offset, 'minutes').format(dateTimeMask), " ").concat(mergedI18n.toNowLabel);
588
593
  }
589
594
  return humanValue;
590
595
  }
@@ -28,6 +28,7 @@ var Card = require('../Card/Card.js');
28
28
  var cardUtilityFunctions = require('../../utils/cardUtilityFunctions.js');
29
29
  var editorUtils = require('../DashboardEditor/editorUtils.js');
30
30
  var Settings = require('../../constants/Settings.js');
31
+ var dayjs = require('../../utils/dayjs.js');
31
32
  var ImageHotspots = require('./ImageHotspots.js');
32
33
  var ImageUploader = require('./ImageUploader.js');
33
34
  var iconsReact = require('@carbon/icons-react');
@@ -40,7 +41,7 @@ var _objectWithoutProperties__default = /*#__PURE__*/_interopDefault(_objectWith
40
41
  var _defineProperty__default = /*#__PURE__*/_interopDefault(_defineProperty);
41
42
  var React__default = /*#__PURE__*/_interopDefault(React);
42
43
 
43
- var _excluded = ["title", "content", "children", "values", "size", "onCardAction", "availableActions", "isEditable", "isExpanded", "isResizable", "error", "isLoading", "maxFileSizeInBytes", "i18n", "i18n", "renderIconByName", "locale", "onUpload", "validateUploadedImage", "onBrowseClick", "testID", "testId"];
44
+ var _excluded = ["title", "content", "children", "values", "size", "onCardAction", "availableActions", "isEditable", "isExpanded", "isResizable", "error", "isLoading", "maxFileSizeInBytes", "i18n", "i18n", "renderIconByName", "locale", "onUpload", "validateUploadedImage", "onBrowseClick", "testID", "testId", "timeZone"];
44
45
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
45
46
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty__default.default(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
46
47
  var iotPrefix = Settings.settings.iotPrefix;
@@ -62,6 +63,7 @@ var defaultProps = {
62
63
  }
63
64
  },
64
65
  locale: 'en',
66
+ timeZone: undefined,
65
67
  content: {},
66
68
  maxFileSizeInBytes: 1048576,
67
69
  accept: null,
@@ -121,7 +123,10 @@ var ImageCard = function ImageCard(_ref) {
121
123
  onBrowseClick = _ref.onBrowseClick,
122
124
  testID = _ref.testID,
123
125
  testId = _ref.testId,
126
+ timeZone = _ref.timeZone,
124
127
  others = _objectWithoutProperties__default.default(_ref, _excluded);
128
+ var effectiveTimezone = timeZone || dayjs.default.tz.guess();
129
+ dayjs.default.tz.setDefault(effectiveTimezone);
125
130
  var _useState = React.useState(content),
126
131
  _useState2 = _slicedToArray__default.default(_useState, 2),
127
132
  imgContent = _useState2[0],
@@ -180,7 +185,8 @@ var ImageCard = function ImageCard(_ref) {
180
185
  // TODO: remove deprecated testID prop in v3.
181
186
  ,
182
187
  testId: testID || testId,
183
- locale: locale
188
+ locale: locale,
189
+ timeZone: effectiveTimezone
184
190
  }, others, {
185
191
  error: error,
186
192
  i18n: mergedI18n
@@ -256,6 +262,13 @@ ImageCard.__docgenInfo = {
256
262
  },
257
263
  "required": false
258
264
  },
265
+ "timeZone": {
266
+ "defaultValue": {
267
+ "value": "undefined",
268
+ "computed": true
269
+ },
270
+ "required": false
271
+ },
259
272
  "content": {
260
273
  "defaultValue": {
261
274
  "value": "{}",
@@ -26,6 +26,7 @@ var CardPropTypes = require('../../constants/CardPropTypes.js');
26
26
  var Card = require('../Card/Card.js');
27
27
  var cardUtilityFunctions = require('../../utils/cardUtilityFunctions.js');
28
28
  var deprecate = require('../../internal/deprecate.js');
29
+ var dayjs = require('../../utils/dayjs.js');
29
30
 
30
31
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
31
32
 
@@ -36,7 +37,7 @@ var React__default = /*#__PURE__*/_interopDefault(React);
36
37
  var PropTypes__default = /*#__PURE__*/_interopDefault(PropTypes);
37
38
  var classnames__default = /*#__PURE__*/_interopDefault(classnames);
38
39
 
39
- var _excluded = ["id", "title", "size", "data", "isLoading", "isResizable", "loadData", "hasMoreData", "layout", "className", "children", "testID", "testId"];
40
+ var _excluded = ["id", "title", "size", "data", "isLoading", "isResizable", "loadData", "hasMoreData", "layout", "className", "children", "testID", "testId", "timeZone"];
40
41
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
41
42
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty__default.default(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
42
43
  var ListCard = function ListCard(_ref) {
@@ -53,7 +54,10 @@ var ListCard = function ListCard(_ref) {
53
54
  children = _ref.children,
54
55
  testID = _ref.testID,
55
56
  testId = _ref.testId,
57
+ timeZone = _ref.timeZone,
56
58
  others = _objectWithoutProperties__default.default(_ref, _excluded);
59
+ var effectiveTimezone = timeZone || dayjs.default.tz.guess();
60
+ dayjs.default.tz.setDefault(effectiveTimezone);
57
61
  var handleScroll = function handleScroll(e) {
58
62
  var element = e.target;
59
63
  // height of the elements content - height element’s content is scrolled vertically === height of the scrollable part of the element
@@ -71,7 +75,8 @@ var ListCard = function ListCard(_ref) {
71
75
  resizeHandles: resizeHandles
72
76
  // TODO: remove deprecated 'testID' in v3.
73
77
  ,
74
- testId: testID || testId
78
+ testId: testID || testId,
79
+ timeZone: effectiveTimezone
75
80
  }, others), /*#__PURE__*/React__default.default.createElement("div", {
76
81
  className: classnames__default.default('list-card', className),
77
82
  style: {
@@ -55,13 +55,14 @@ var React__default = /*#__PURE__*/_interopDefault(React);
55
55
  var classnames__default = /*#__PURE__*/_interopDefault(classnames);
56
56
  var PropTypes__default = /*#__PURE__*/_interopDefault(PropTypes);
57
57
 
58
- var _excluded = ["id", "title", "isExpanded", "content", "children", "size", "onCardAction", "values", "filters", "isEditable", "isResizable", "i18n", "tooltip", "locale", "timeRange", "timeRangeOptions", "availableActions", "isLoading", "testID", "testId", "className", "renderDateDropdownInPortal", "withToolbarTooltips", "defaultDateFormatPattern", "extraActions"];
58
+ var _excluded = ["id", "title", "isExpanded", "content", "children", "size", "onCardAction", "values", "filters", "isEditable", "isResizable", "i18n", "tooltip", "locale", "timeZone", "timeRange", "timeRangeOptions", "availableActions", "isLoading", "testID", "testId", "className", "renderDateDropdownInPortal", "withToolbarTooltips", "defaultDateFormatPattern", "extraActions"];
59
59
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
60
60
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty__default.default(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
61
61
  var iotPrefix = Settings.settings.iotPrefix;
62
62
  var defaultProps = {
63
63
  size: LayoutConstants.CARD_SIZES.LARGE,
64
64
  locale: 'en',
65
+ timeZone: undefined,
65
66
  values: [],
66
67
  filters: [],
67
68
  i18n: {
@@ -115,6 +116,7 @@ var TableCard = function TableCard(_ref) {
115
116
  i18n = _ref.i18n,
116
117
  tooltip = _ref.tooltip,
117
118
  locale = _ref.locale,
119
+ timeZone = _ref.timeZone,
118
120
  timeRange = _ref.timeRange,
119
121
  timeRangeOptions = _ref.timeRangeOptions,
120
122
  availableActions = _ref.availableActions,
@@ -128,8 +130,8 @@ var TableCard = function TableCard(_ref) {
128
130
  extraActions = _ref.extraActions,
129
131
  others = _objectWithoutProperties__default.default(_ref, _excluded);
130
132
  var mergedI18n = _objectSpread(_objectSpread({}, defaultProps.i18n), i18n);
131
-
132
- // Set the locale
133
+ var effectiveTimezone = timeZone || dayjs.default.tz.guess();
134
+ dayjs.default.tz.setDefault(effectiveTimezone);
133
135
  dayjs.default.locale(locale);
134
136
  /** Searches for variables and updates the card if it is passed the cardVariables prop */
135
137
  // Need to skip the linkTemplate variable for now because we will handle it at render time per row
@@ -312,7 +314,7 @@ var TableCard = function TableCard(_ref) {
312
314
  var values = _objectSpread({}, row.values);
313
315
  Object.keys(values).forEach(function (column) {
314
316
  if (!isEditable && filteredTimestampColumns.includes(column)) {
315
- values[column] = values[column] ? dayjs.default(values[column]).format(defaultDateFormatPattern) : '';
317
+ values[column] = values[column] ? dayjs.default.tz(values[column]).format(defaultDateFormatPattern) : '';
316
318
  }
317
319
  });
318
320
  return _objectSpread(_objectSpread({}, row), {}, {
@@ -490,6 +492,7 @@ var TableCard = function TableCard(_ref) {
490
492
  timeRangeOptions: timeRangeOptions,
491
493
  renderDateDropdownInPortal: renderDateDropdownInPortal,
492
494
  locale: locale,
495
+ timeZone: effectiveTimezone,
493
496
  id: id,
494
497
  extraActions: extraActions
495
498
  });
@@ -507,6 +510,7 @@ var TableCard = function TableCard(_ref) {
507
510
  isExpanded: isExpanded,
508
511
  i18n: mergedI18n,
509
512
  locale: locale,
513
+ timeZone: effectiveTimezone,
510
514
  resizeHandles: resizeHandles,
511
515
  hideHeader: true,
512
516
  className: classnames__default.default("".concat(iotPrefix, "--table-card"), className, _defineProperty__default.default({}, "".concat(iotPrefix, "--table-card--with-tooltips"), withToolbarTooltips))
@@ -614,6 +618,13 @@ TableCard.__docgenInfo = {
614
618
  },
615
619
  "required": false
616
620
  },
621
+ "timeZone": {
622
+ "defaultValue": {
623
+ "value": "undefined",
624
+ "computed": true
625
+ },
626
+ "required": false
627
+ },
617
628
  "values": {
618
629
  "defaultValue": {
619
630
  "value": "[]",
@@ -70,7 +70,7 @@ var createColumnsWithFormattedLinks = function createColumnsWithFormattedLinks(c
70
70
  });
71
71
  var variableValue =
72
72
  // format the TIMESTAMP type columns
73
- (matchingColumn === null || matchingColumn === void 0 ? void 0 : matchingColumn.type) === 'TIMESTAMP' ? dayjs.default(row[variable]).format(defaultDateFormatPattern) : row[variable];
73
+ (matchingColumn === null || matchingColumn === void 0 ? void 0 : matchingColumn.type) === 'TIMESTAMP' ? dayjs.default.tz(row[variable]).format(defaultDateFormatPattern) : row[variable];
74
74
  // encode value so the URL can be valid
75
75
  var encodedValue = typeof variableValue === 'string' && variableValue !== null && variableValue !== void 0 && variableValue.includes('https') ? variableValue : encodeURIComponent(variableValue);
76
76
  variableLink = variableLink.replace("{".concat(variable, "}"), encodedValue);
@@ -138,7 +138,7 @@ var determineFilterFunction = function determineFilterFunction(column, defaultFi
138
138
  var defaultDateFormatPattern = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : dayjs.DAYJS_INPUT_FORMATS.SECONDS;
139
139
  return _objectSpread(_objectSpread({}, column.type === 'TIMESTAMP' ? {
140
140
  filterFunction: function filterFunction(cellValue, filterValue) {
141
- var dateString = dayjs.default(cellValue).format(defaultDateFormatPattern);
141
+ var dateString = dayjs.default.tz(cellValue).format(defaultDateFormatPattern);
142
142
  return dateString.includes(filterValue);
143
143
  }
144
144
  } : {}), {}, {
@@ -54,7 +54,7 @@ var React__default = /*#__PURE__*/_interopDefault(React);
54
54
  var PropTypes__default = /*#__PURE__*/_interopDefault(PropTypes);
55
55
  var classnames__default = /*#__PURE__*/_interopDefault(classnames);
56
56
 
57
- var _excluded = ["title", "content", "children", "size", "interval", "isEditable", "isResizable", "values", "locale", "i18n", "isExpanded", "timeRange", "isLazyLoading", "isLoading", "domainRange", "tooltipDateFormatPattern", "tooltipShowTotals", "showTimeInGMT", "testID", "testId", "defaultDateFormatPattern"];
57
+ var _excluded = ["title", "content", "children", "size", "interval", "isEditable", "isResizable", "values", "locale", "timeZone", "i18n", "isExpanded", "timeRange", "isLazyLoading", "isLoading", "domainRange", "tooltipDateFormatPattern", "tooltipShowTotals", "showTimeInGMT", "testID", "testId", "defaultDateFormatPattern"];
58
58
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
59
59
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty__default.default(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
60
60
  var iotPrefix = Settings.settings.iotPrefix;
@@ -171,6 +171,7 @@ var defaultProps = {
171
171
  },
172
172
  chartType: LayoutConstants.TIME_SERIES_TYPES.LINE,
173
173
  locale: 'en',
174
+ timeZone: undefined,
174
175
  content: {
175
176
  series: [],
176
177
  timeDataSourceId: 'timestamp',
@@ -201,6 +202,7 @@ var TimeSeriesCard = function TimeSeriesCard(_ref) {
201
202
  isResizable = _ref.isResizable,
202
203
  initialValues = _ref.values,
203
204
  locale = _ref.locale,
205
+ timeZone = _ref.timeZone,
204
206
  i18n = _ref.i18n,
205
207
  isExpanded = _ref.isExpanded,
206
208
  timeRange = _ref.timeRange,
@@ -214,6 +216,9 @@ var TimeSeriesCard = function TimeSeriesCard(_ref) {
214
216
  testId = _ref.testId,
215
217
  defaultDateFormatPattern = _ref.defaultDateFormatPattern,
216
218
  others = _objectWithoutProperties__default.default(_ref, _excluded);
219
+ var effectiveTimezone = timeZone || dayjs.default.tz.guess();
220
+ dayjs.default.tz.setDefault(effectiveTimezone);
221
+ dayjs.default.locale(locale);
217
222
  // need to deep merge the nested content default props as default props only uses a shallow merge natively
218
223
  var contentWithDefaults = React.useMemo(function () {
219
224
  return defaultsDeep({}, content, defaultProps.content);
@@ -243,8 +248,6 @@ var TimeSeriesCard = function TimeSeriesCard(_ref) {
243
248
  valuesProp = _handleCardVariables.values;
244
249
  var chartRef = React.useRef(null);
245
250
  var previousTick = React.useRef();
246
- dayjs.default.locale(locale);
247
-
248
251
  // Workaround since downstream consumers might keep regenerating the series object and useMemo does a direct in-memory comparison for the object
249
252
  var objectAgnosticSeries = JSON.stringify(series);
250
253
  var objectAgnosticThresholds = JSON.stringify(thresholds);
@@ -324,7 +327,7 @@ var TimeSeriesCard = function TimeSeriesCard(_ref) {
324
327
  });
325
328
  return {
326
329
  id: "dataindex-".concat(index),
327
- values: _objectSpread(_objectSpread({}, omit(value, timeDataSourceId)), {}, _defineProperty__default.default({}, timeDataSourceId, dayjs.default(value[timeDataSourceId]).format(defaultDateFormatPattern))),
330
+ values: _objectSpread(_objectSpread({}, omit(value, timeDataSourceId)), {}, _defineProperty__default.default({}, timeDataSourceId, dayjs.default.tz(value[timeDataSourceId]).format(defaultDateFormatPattern))),
328
331
  isSelectable: false
329
332
  };
330
333
  });
@@ -478,6 +481,7 @@ var TimeSeriesCard = function TimeSeriesCard(_ref) {
478
481
  timeRange: timeRange
479
482
  }, others, {
480
483
  locale: locale,
484
+ timeZone: effectiveTimezone,
481
485
  isExpanded: isExpanded,
482
486
  isEditable: isEditable,
483
487
  isEmpty: isChartDataEmpty,
@@ -628,6 +632,13 @@ TimeSeriesCard.__docgenInfo = {
628
632
  },
629
633
  "required": false
630
634
  },
635
+ "timeZone": {
636
+ "defaultValue": {
637
+ "value": "undefined",
638
+ "computed": true
639
+ },
640
+ "required": false
641
+ },
631
642
  "content": {
632
643
  "defaultValue": {
633
644
  "value": "{\n series: [],\n timeDataSourceId: 'timestamp',\n includeZeroOnXaxis: false,\n includeZeroOnYaxis: false,\n showLegend: true,\n legendPosition: 'bottom',\n truncation: {\n type: 'end_line',\n threshold: 20,\n numCharacter: 20,\n },\n}",
@@ -146,7 +146,7 @@ var formatGraphTick = function formatGraphTick(timestamp, index, ticks, interval
146
146
  var previousTickTimestamp = arguments.length > 5 ? arguments[5] : undefined;
147
147
  var shouldDisplayGMT = arguments.length > 6 ? arguments[6] : undefined;
148
148
  dayjs.default.locale(locale);
149
- var currentTimestamp = shouldDisplayGMT ? dayjs.default.utc(timestamp) : dayjs.default(timestamp);
149
+ var currentTimestamp = shouldDisplayGMT ? dayjs.default.utc(timestamp) : dayjs.default.tz(timestamp);
150
150
  var sameDay = dayjs.default(previousTickTimestamp).isSame(currentTimestamp, 'day');
151
151
  var sameMonth = dayjs.default(previousTickTimestamp).isSame(currentTimestamp, 'month');
152
152
  var sameYear = dayjs.default(previousTickTimestamp).isSame(currentTimestamp, 'year');
@@ -240,7 +240,7 @@ var formatChartData = function formatChartData() {
240
240
  // Check to see if the data Item actually exists in this timestamp before adding to data (to support sparse data in the values)
241
241
  if (!isNil(dataItem[dataSourceId])) {
242
242
  data.push({
243
- date: dataItem[timeDataSourceId] instanceof Date ? dataItem[timeDataSourceId] : new Date(dataItem[timeDataSourceId]),
243
+ date: dayjs.default.tz(dataItem[timeDataSourceId]).toDate(),
244
244
  value: dataItem[dataSourceId],
245
245
  group: label,
246
246
  dataSourceId: dataSourceId
@@ -19,6 +19,7 @@ var CardPropTypes = require('../../constants/CardPropTypes.js');
19
19
  var LayoutConstants = require('../../constants/LayoutConstants.js');
20
20
  var Card = require('../Card/Card.js');
21
21
  var cardUtilityFunctions = require('../../utils/cardUtilityFunctions.js');
22
+ var dayjs = require('../../utils/dayjs.js');
22
23
  var valueCardUtils = require('./valueCardUtils.js');
23
24
  var ValueContent = require('./ValueContent.js');
24
25
 
@@ -30,7 +31,7 @@ var _objectWithoutProperties__default = /*#__PURE__*/_interopDefault(_objectWith
30
31
  var React__default = /*#__PURE__*/_interopDefault(React);
31
32
  var classnames__default = /*#__PURE__*/_interopDefault(classnames);
32
33
 
33
- var _excluded = ["title", "content", "size", "values", "isEditable", "isResizable", "i18n", "dataState", "id", "locale", "customFormatter", "children", "fontSize", "isNumberValueCompact", "testID", "testId", "onAttributeClick", "className", "shouldUseTranslatedLabels"];
34
+ var _excluded = ["title", "content", "size", "values", "isEditable", "isResizable", "i18n", "dataState", "id", "locale", "timeZone", "customFormatter", "children", "fontSize", "isNumberValueCompact", "testID", "testId", "onAttributeClick", "className", "shouldUseTranslatedLabels"];
34
35
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
35
36
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty__default.default(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
36
37
 
@@ -51,6 +52,7 @@ var ValueCard = function ValueCard(_ref) {
51
52
  dataState = _ref.dataState,
52
53
  id = _ref.id,
53
54
  locale = _ref.locale,
55
+ timeZone = _ref.timeZone,
54
56
  customFormatter = _ref.customFormatter,
55
57
  children = _ref.children,
56
58
  fontSize = _ref.fontSize,
@@ -61,6 +63,8 @@ var ValueCard = function ValueCard(_ref) {
61
63
  className = _ref.className,
62
64
  shouldUseTranslatedLabels = _ref.shouldUseTranslatedLabels,
63
65
  others = _objectWithoutProperties__default.default(_ref, _excluded);
66
+ var effectiveTimezone = timeZone || dayjs.default.tz.guess();
67
+ dayjs.default.tz.setDefault(effectiveTimezone);
64
68
  var availableActions = _objectSpread({
65
69
  expand: false
66
70
  }, others.availableActions);
@@ -86,6 +90,7 @@ var ValueCard = function ValueCard(_ref) {
86
90
  i18n: i18n,
87
91
  shouldUseTranslatedLabels: shouldUseTranslatedLabels,
88
92
  locale: locale,
93
+ timeZone: effectiveTimezone,
89
94
  id: id,
90
95
  className: classnames__default.default(className, _defineProperty__default.default(_defineProperty__default.default({}, "".concat(valueCardUtils.BASE_CLASS_NAME, "__horizontal"), layout === LayoutConstants.CARD_LAYOUTS.HORIZONTAL), "".concat(valueCardUtils.BASE_CLASS_NAME, "__vertical"), layout === LayoutConstants.CARD_LAYOUTS.VERTICAL))
91
96
  // TODO: remove deprecated 'testID' in v3.
@@ -753,6 +753,8 @@ var CardPropTypes = {
753
753
  testId: PropTypes__default.default.string,
754
754
  /** the locale of the card, needed for number and date formatting */
755
755
  locale: PropTypes__default.default.string,
756
+ /** IANA timezone string to set as default timezone for dayjs */
757
+ timeZone: PropTypes__default.default.string,
756
758
  /** a way to pass down dashboard grid resize handles, only used by other card types */
757
759
  resizeHandles: PropTypes__default.default.array,
758
760
  /** Optional callback function that is passed an onChange function and the original cardConfig object.
@@ -550,7 +550,7 @@ var handleTooltip = function handleTooltip(dataOrHoveredElement, defaultTooltip,
550
550
  : dataOrHoveredElement;
551
551
  var timeStamp = Array.isArray(data) ? (_data$ = data[0]) === null || _data$ === void 0 || (_data$ = _data$.date) === null || _data$ === void 0 ? void 0 : _data$.getTime() : data === null || data === void 0 || (_data$date = data.date) === null || _data$date === void 0 ? void 0 : _data$date.getTime();
552
552
  var dateLabel = timeStamp ? "<li class='datapoint-tooltip'>\n <p class='label'>".concat((showTimeInGMT // show timestamp in gmt or local time
553
- ? dayjs.default.utc(timeStamp) : dayjs.default(timeStamp)).format(tooltipDateFormatPattern), "</p>\n </li>") : '';
553
+ ? dayjs.default.utc(timeStamp) : dayjs.default.tz(timeStamp)).format(tooltipDateFormatPattern), "</p>\n </li>") : '';
554
554
  var matchingAlertRanges = findMatchingAlertRange(alertRanges, data);
555
555
  var matchingAlertLabels = Array.isArray(matchingAlertRanges) ? matchingAlertRanges.map(function (matchingAlertRange) {
556
556
  return "<li class='datapoint-tooltip'><a style=\"background-color:".concat(matchingAlertRange.color, "\" class=\"tooltip-color\"></a><p class='label'>").concat(alertDetected, " ").concat(matchingAlertRange.details, "</p></li>");
@@ -2,8 +2,10 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
+ require('core-js/modules/es.array.find.js');
5
6
  require('core-js/modules/es.object.keys.js');
6
7
  require('core-js/modules/es.object.to-string.js');
8
+ require('core-js/modules/es.string.trim.js');
7
9
  require('core-js/modules/web.dom-collections.for-each.js');
8
10
  var dayjs$2 = require('dayjs');
9
11
 
@@ -16,12 +18,14 @@ var utc = require('dayjs/plugin/utc');
16
18
  var pluralGetSet = require('dayjs/plugin/pluralGetSet');
17
19
  var timezone = require('dayjs/plugin/timezone');
18
20
  var localeData = require('dayjs/plugin/localeData');
21
+ var customParseFormat = require('dayjs/plugin/customParseFormat');
19
22
  var dayjs = dayjs__default.default;
20
23
  dayjs.extend(localizedFormat); // gives the 'L' formatting ability for .format
21
24
  dayjs.extend(utc); // gives .utc() and .local()
22
25
  dayjs.extend(pluralGetSet); // gives .hour .minute get/set ability
23
26
  dayjs.extend(timezone); // timezone support
24
27
  dayjs.extend(localeData); // gives local specific data
28
+ dayjs.extend(customParseFormat);
25
29
 
26
30
  /* eslint-disable global-require */
27
31
  var locales = {
@@ -451,7 +455,25 @@ var DAYJS_INPUT_FORMATS = {
451
455
  SECONDS: 'L HH:mm:ss',
452
456
  RANGE: 'L HH:mm'
453
457
  };
458
+ var formats = [
459
+ // ISO Variations (Most common for APIs)
460
+ 'YYYY-MM-DDTHH:mm:ssZ', 'YYYY-MM-DDTHH:mm:ss.SSSZ', 'YYYY-MM-DDTHH:mm:ss', 'YYYY-MM-DD HH:mm:ss', 'YYYY-MM-DD HH:mm',
461
+ // US / Common UI Variations
462
+ 'MM/DD/YYYY HH:mm:ss', 'MM/DD/YYYY HH:mm', 'MM-DD-YYYY HH:mm:ss', 'MM-DD-YYYY HH:mm',
463
+ // 12-Hour Variations (If users can type AM/PM)
464
+ 'MM/DD/YYYY hh:mm A', 'YYYY-MM-DD hh:mm A',
465
+ // Date Only Fallbacks
466
+ 'YYYY-MM-DD', 'MM/DD/YYYY', 'MM-DD-YYYY', 'L' // Localized format (uses the loaded Day.js locale)
467
+ ];
468
+ var detectDateTimeFormat = function detectDateTimeFormat(dateTimeString) {
469
+ if (!(dateTimeString !== null && dateTimeString !== void 0 && dateTimeString.trim())) return null;
470
+ return formats.find(function (format) {
471
+ return dayjs(dateTimeString, format, true).isValid();
472
+ });
473
+ };
454
474
  var dayjs$1 = dayjs;
455
475
 
456
476
  exports.DAYJS_INPUT_FORMATS = DAYJS_INPUT_FORMATS;
457
477
  exports.default = dayjs$1;
478
+ exports.detectDateTimeFormat = detectDateTimeFormat;
479
+ exports.formats = formats;
package/package.json CHANGED
@@ -344,7 +344,7 @@
344
344
  "whatwg-fetch": "^3.0.0"
345
345
  },
346
346
  "sideEffects": false,
347
- "version": "4.4.1",
347
+ "version": "4.5.1",
348
348
  "resolutions": {
349
349
  "chokidar": "3.3.1",
350
350
  "react-grid-layout": "1.2.2",