@servicetitan/design-system 13.8.1 → 13.8.3

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 (37) hide show
  1. package/dist/components/DatePicker/utils/utils.d.ts +1 -1
  2. package/dist/components/DatePicker/utils/utils.js +10 -7
  3. package/dist/components/DatePicker/utils/utils.js.map +1 -1
  4. package/dist/components/DatePicker/utils/utils.missingTimeZone.test.d.ts +1 -0
  5. package/dist/components/DatePicker/utils/utils.missingTimeZone.test.js +35 -0
  6. package/dist/components/DatePicker/utils/utils.missingTimeZone.test.js.map +1 -0
  7. package/dist/components/OptionList/Option.js +1 -0
  8. package/dist/components/OptionList/Option.js.map +1 -1
  9. package/dist/components/OptionList/OptionList.css +3 -0
  10. package/dist/components/OptionList/OptionList.css.map +1 -1
  11. package/dist/components/OptionList/index.css +3 -0
  12. package/dist/components/OptionList/index.css.map +1 -1
  13. package/dist/components/Select/Select.js +1 -1
  14. package/dist/components/Select/Select.js.map +1 -1
  15. package/dist/components/TimePicker/TimePicker.css +3 -0
  16. package/dist/components/TimePicker/TimePicker.css.map +1 -1
  17. package/dist/components/TimePicker/index.css +3 -0
  18. package/dist/components/TimePicker/index.css.map +1 -1
  19. package/dist/components/TimePicker/utils/TimePickerUtils.test.js +73 -0
  20. package/dist/components/TimePicker/utils/TimePickerUtils.test.js.map +1 -1
  21. package/dist/components/TimePicker/utils/timezoneUtils.d.ts +1 -0
  22. package/dist/components/TimePicker/utils/timezoneUtils.js +25 -15
  23. package/dist/components/TimePicker/utils/timezoneUtils.js.map +1 -1
  24. package/dist/components/index.css +3 -0
  25. package/dist/components/index.css.map +1 -1
  26. package/dist/global/index.css +1 -1
  27. package/dist/global/version.css +1 -1
  28. package/dist/system-light.css +1 -1
  29. package/dist/system-light.min.css +1 -1
  30. package/dist/system.css +4 -1
  31. package/dist/system.css.map +1 -1
  32. package/dist/system.min.css +2 -2
  33. package/dist/utilities/TimezoneProvider/TimezoneProvider.js +9 -6
  34. package/dist/utilities/TimezoneProvider/TimezoneProvider.js.map +1 -1
  35. package/dist/utilities/TimezoneProvider/TimezoneProvider.test.js +41 -0
  36. package/dist/utilities/TimezoneProvider/TimezoneProvider.test.js.map +1 -1
  37. package/package.json +9 -9
@@ -22,6 +22,6 @@ export declare const toDateObj: ({ date, tz, isValid, invalidReason, ...rest }:
22
22
  export declare const toDateTime: (value: Date | DateTime | string | undefined, tz?: string) => DateTime | null;
23
23
  export declare const toFormat: (date: any, format?: string) => any;
24
24
  export declare const toTimeZone: (date: Date, tz?: string, opts?: any) => Date;
25
- export declare const fromTimeZone: (date: Date, tz: string) => Date;
25
+ export declare const fromTimeZone: (date: Date, tz?: string) => Date;
26
26
  export declare const compareObj: (value?: Date | string) => string | number;
27
27
  export {};
@@ -22,7 +22,7 @@ export const isValidDate = (date) => {
22
22
  return !isInvalidDate(date);
23
23
  return false;
24
24
  };
25
- const defaultTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
25
+ const defaultTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone || undefined;
26
26
  const isBoolean = (value) => typeof value === 'boolean';
27
27
  export const toDateObj = (_a) => {
28
28
  var { date, tz = defaultTimezone, isValid, invalidReason } = _a, rest = __rest(_a, ["date", "tz", "isValid", "invalidReason"]);
@@ -50,15 +50,16 @@ export const toDateObj = (_a) => {
50
50
  return result;
51
51
  };
52
52
  export const toDateTime = (value, tz) => {
53
- var _a, _b;
54
53
  if (!value)
55
54
  return undefined;
55
+ // Undefined zone names fall through to Luxon's system zone.
56
56
  if (value instanceof DateTime)
57
57
  return value.setZone(tz);
58
58
  const timezone = tz || defaultTimezone;
59
- return value instanceof Date
60
- ? (_a = DateTime.fromJSDate(value)) === null || _a === void 0 ? void 0 : _a.setZone(timezone) // Parse Date
61
- : (_b = DateTime.fromISO(value)) === null || _b === void 0 ? void 0 : _b.setZone(timezone); // Parse String
59
+ const dateTime = value instanceof Date
60
+ ? DateTime.fromJSDate(value) // System zone
61
+ : DateTime.fromISO(value); // System zone
62
+ return timezone ? dateTime === null || dateTime === void 0 ? void 0 : dateTime.setZone(timezone) : dateTime;
62
63
  };
63
64
  export const toFormat = (date, format = 'LL/dd/yyyy') => {
64
65
  if (date instanceof Date)
@@ -81,9 +82,11 @@ export const toTimeZone = (date, tz, opts) => {
81
82
  };
82
83
  // Inverse function for toTimeZone
83
84
  export const fromTimeZone = (date, tz) => {
84
- var _a, _b;
85
+ var _a, _b, _c;
85
86
  const unzoned = (_a = DateTime.fromJSDate(date)) === null || _a === void 0 ? void 0 : _a.toISO({ includeOffset: false });
86
- return (_b = DateTime.fromISO(unzoned, { zone: tz })) === null || _b === void 0 ? void 0 : _b.toJSDate();
87
+ if (!tz)
88
+ return (_b = DateTime.fromISO(unzoned)) === null || _b === void 0 ? void 0 : _b.toJSDate();
89
+ return (_c = DateTime.fromISO(unzoned, { zone: tz })) === null || _c === void 0 ? void 0 : _c.toJSDate();
87
90
  };
88
91
  export const compareObj = (value) => {
89
92
  if (value instanceof Date) {
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/components/DatePicker/utils/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { DateTime } from 'luxon';\n\n// Generate Date object with value Invalid Date\nexport const invalidDate = new Date('');\n\nexport const isInvalidDate = (d: Date | undefined): boolean => {\n\tif (typeof d === 'undefined') return false;\n\treturn d instanceof Date && isNaN(d as any);\n};\n\nexport const isValidDate = (date: Date) => {\n\tif (date instanceof Date) return !isInvalidDate(date);\n\treturn false;\n};\n\nexport interface DateObj {\n\tdateTime: DateTime | undefined;\n\ttimezone: string;\n\tisValid: boolean;\n\tinvalidReason?: string;\n\ttoISO?: () => string;\n\ttoJSDate?: () => Date;\n\tisEqualDate?: (obj: DateObj) => boolean;\n\tisEqual?: (obj: DateObj) => boolean;\n}\n\ninterface ToDateObj {\n\tdate: Date | DateTime | string | undefined;\n\ttz?: string;\n\tisValid?: boolean;\n\tinvalidReason?: string;\n}\n\nconst defaultTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\nconst isBoolean = (value: any) => typeof value === 'boolean';\n\nexport const toDateObj = ({\n\tdate,\n\ttz = defaultTimezone,\n\tisValid,\n\tinvalidReason,\n\t...rest\n}: ToDateObj): DateObj => {\n\tconst dateTime = toDateTime(date, tz);\n\tconst valid = isBoolean(isValid) ? isValid : dateTime?.isValid;\n\tconst reason = invalidReason;\n\n\tconst result: DateObj = {\n\t\tdateTime,\n\t\ttimezone: tz,\n\t\tisValid: valid,\n\t\tinvalidReason: reason,\n\t\t...rest,\n\t};\n\n\tresult.toISO = (): string =>\n\t\tresult.dateTime ? result.dateTime.toISO() : undefined;\n\tresult.toJSDate = (): Date =>\n\t\tresult.dateTime ? result.dateTime.toJSDate() : undefined;\n\tresult.isEqualDate = (other: DateObj): boolean => {\n\t\tconst dt1 = result.dateTime;\n\t\tconst dt2 = other.dateTime;\n\t\tif ((!dt1 && !!dt2) || (!!dt1 && !dt2)) return false; // One is valid, other not\n\t\tif (typeof dt1 === 'undefined' && typeof dt2 === 'undefined')\n\t\t\treturn true; // Both undefined\n\t\tif (!dt1.isValid && !dt2.isValid) return true; // Both invalid\n\t\treturn +dt1 === +dt2; // Compare millis\n\t};\n\tresult.isEqual = (other: DateObj): boolean =>\n\t\tresult.isValid === other.isValid &&\n\t\tresult.timezone === other.timezone &&\n\t\tresult.invalidReason === other.invalidReason &&\n\t\tresult.isEqualDate(other); // Equal dates\n\n\treturn result;\n};\n\nexport const toDateTime = (\n\tvalue: Date | DateTime | string | undefined,\n\ttz?: string\n): DateTime | null => {\n\tif (!value) return undefined;\n\tif (value instanceof DateTime) return value.setZone(tz);\n\n\tconst timezone = tz || defaultTimezone;\n\n\treturn value instanceof Date\n\t\t? DateTime.fromJSDate(value)?.setZone(timezone) // Parse Date\n\t\t: DateTime.fromISO(value)?.setZone(timezone); // Parse String\n};\n\nexport const toFormat = (date: any, format = 'LL/dd/yyyy') => {\n\tif (date instanceof Date) return DateTime.fromJSDate(date).toFormat(format);\n\tif (date instanceof DateTime) return date.toFormat(format);\n\treturn date;\n};\n\n/*\n * Shifts date to timezone, so that date.toString()\n * to have same digits as corresponding date in timezone.\n */\nexport const toTimeZone = (date: Date, tz?: string, opts?: any) => {\n\tconst dateTime = opts?.startOfDay\n\t\t? toDateTime(date, tz).startOf('day')\n\t\t: toDateTime(date, tz);\n\treturn dateTime?.isValid\n\t\t? new Date(dateTime.toISO({ includeOffset: false })) // Main routine\n\t\t: undefined;\n};\n\n// Inverse function for toTimeZone\nexport const fromTimeZone = (date: Date, tz: string) => {\n\tconst unzoned = DateTime.fromJSDate(date)?.toISO({ includeOffset: false });\n\treturn DateTime.fromISO(unzoned, { zone: tz })?.toJSDate();\n};\n\nexport const compareObj = (value?: Date | string) => {\n\tif (value instanceof Date) {\n\t\tif (isInvalidDate(value)) return 'Invalid Date';\n\t\treturn value.getTime();\n\t}\n\tif (typeof value === 'undefined') return 'undefined';\n\treturn value;\n};\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/components/DatePicker/utils/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { DateTime } from 'luxon';\n\n// Generate Date object with value Invalid Date\nexport const invalidDate = new Date('');\n\nexport const isInvalidDate = (d: Date | undefined): boolean => {\n\tif (typeof d === 'undefined') return false;\n\treturn d instanceof Date && isNaN(d as any);\n};\n\nexport const isValidDate = (date: Date) => {\n\tif (date instanceof Date) return !isInvalidDate(date);\n\treturn false;\n};\n\nexport interface DateObj {\n\tdateTime: DateTime | undefined;\n\ttimezone: string;\n\tisValid: boolean;\n\tinvalidReason?: string;\n\ttoISO?: () => string;\n\ttoJSDate?: () => Date;\n\tisEqualDate?: (obj: DateObj) => boolean;\n\tisEqual?: (obj: DateObj) => boolean;\n}\n\ninterface ToDateObj {\n\tdate: Date | DateTime | string | undefined;\n\ttz?: string;\n\tisValid?: boolean;\n\tinvalidReason?: string;\n}\n\nconst defaultTimezone =\n\tIntl.DateTimeFormat().resolvedOptions().timeZone || undefined;\nconst isBoolean = (value: any) => typeof value === 'boolean';\n\nexport const toDateObj = ({\n\tdate,\n\ttz = defaultTimezone,\n\tisValid,\n\tinvalidReason,\n\t...rest\n}: ToDateObj): DateObj => {\n\tconst dateTime = toDateTime(date, tz);\n\tconst valid = isBoolean(isValid) ? isValid : dateTime?.isValid;\n\tconst reason = invalidReason;\n\n\tconst result: DateObj = {\n\t\tdateTime,\n\t\ttimezone: tz,\n\t\tisValid: valid,\n\t\tinvalidReason: reason,\n\t\t...rest,\n\t};\n\n\tresult.toISO = (): string =>\n\t\tresult.dateTime ? result.dateTime.toISO() : undefined;\n\tresult.toJSDate = (): Date =>\n\t\tresult.dateTime ? result.dateTime.toJSDate() : undefined;\n\tresult.isEqualDate = (other: DateObj): boolean => {\n\t\tconst dt1 = result.dateTime;\n\t\tconst dt2 = other.dateTime;\n\t\tif ((!dt1 && !!dt2) || (!!dt1 && !dt2)) return false; // One is valid, other not\n\t\tif (typeof dt1 === 'undefined' && typeof dt2 === 'undefined')\n\t\t\treturn true; // Both undefined\n\t\tif (!dt1.isValid && !dt2.isValid) return true; // Both invalid\n\t\treturn +dt1 === +dt2; // Compare millis\n\t};\n\tresult.isEqual = (other: DateObj): boolean =>\n\t\tresult.isValid === other.isValid &&\n\t\tresult.timezone === other.timezone &&\n\t\tresult.invalidReason === other.invalidReason &&\n\t\tresult.isEqualDate(other); // Equal dates\n\n\treturn result;\n};\n\nexport const toDateTime = (\n\tvalue: Date | DateTime | string | undefined,\n\ttz?: string\n): DateTime | null => {\n\tif (!value) return undefined;\n\t// Undefined zone names fall through to Luxon's system zone.\n\tif (value instanceof DateTime) return value.setZone(tz);\n\n\tconst timezone = tz || defaultTimezone;\n\tconst dateTime =\n\t\tvalue instanceof Date\n\t\t\t? DateTime.fromJSDate(value) // System zone\n\t\t\t: DateTime.fromISO(value); // System zone\n\n\treturn timezone ? dateTime?.setZone(timezone) : dateTime;\n};\n\nexport const toFormat = (date: any, format = 'LL/dd/yyyy') => {\n\tif (date instanceof Date) return DateTime.fromJSDate(date).toFormat(format);\n\tif (date instanceof DateTime) return date.toFormat(format);\n\treturn date;\n};\n\n/*\n * Shifts date to timezone, so that date.toString()\n * to have same digits as corresponding date in timezone.\n */\nexport const toTimeZone = (date: Date, tz?: string, opts?: any) => {\n\tconst dateTime = opts?.startOfDay\n\t\t? toDateTime(date, tz).startOf('day')\n\t\t: toDateTime(date, tz);\n\treturn dateTime?.isValid\n\t\t? new Date(dateTime.toISO({ includeOffset: false })) // Main routine\n\t\t: undefined;\n};\n\n// Inverse function for toTimeZone\nexport const fromTimeZone = (date: Date, tz?: string) => {\n\tconst unzoned = DateTime.fromJSDate(date)?.toISO({ includeOffset: false });\n\tif (!tz) return DateTime.fromISO(unzoned)?.toJSDate();\n\treturn DateTime.fromISO(unzoned, { zone: tz })?.toJSDate();\n};\n\nexport const compareObj = (value?: Date | string) => {\n\tif (value instanceof Date) {\n\t\tif (isInvalidDate(value)) return 'Invalid Date';\n\t\treturn value.getTime();\n\t}\n\tif (typeof value === 'undefined') return 'undefined';\n\treturn value;\n};\n"]}
@@ -0,0 +1,35 @@
1
+ import { DateTime } from 'luxon';
2
+ const OriginalDateTimeFormat = Intl.DateTimeFormat;
3
+ describe('DatePicker utils when resolvedOptions().timeZone is undefined', () => {
4
+ beforeEach(() => {
5
+ jest.spyOn(Intl, 'DateTimeFormat').mockImplementation(((locales, options) => {
6
+ const formatter = new OriginalDateTimeFormat(locales, options);
7
+ if (!(options === null || options === void 0 ? void 0 : options.timeZone)) {
8
+ const resolved = formatter.resolvedOptions.bind(formatter);
9
+ formatter.resolvedOptions = () => (Object.assign(Object.assign({}, resolved()), { timeZone: undefined }));
10
+ }
11
+ return formatter;
12
+ }));
13
+ });
14
+ afterEach(() => {
15
+ jest.restoreAllMocks();
16
+ });
17
+ const loadUtils = () => {
18
+ let utils;
19
+ jest.isolateModules(() => {
20
+ utils = require('./utils');
21
+ });
22
+ return utils;
23
+ };
24
+ it('falls back to the system zone instead of calling setZone with a missing name', () => {
25
+ const { toDateTime, fromTimeZone } = loadUtils();
26
+ const date = new Date('2023-01-01T00:00:00Z');
27
+ const dateTime = toDateTime(date, undefined);
28
+ expect(dateTime.isValid).toBe(true);
29
+ expect(dateTime.toUTC().toISO()).toBe(DateTime.fromJSDate(date).toUTC().toISO());
30
+ expect(toDateTime(date, 'UTC').toFormat('HH:mm')).toBe('00:00');
31
+ const roundTrip = fromTimeZone(date, undefined);
32
+ expect(roundTrip.toISOString()).toBe(date.toISOString());
33
+ });
34
+ });
35
+ //# sourceMappingURL=utils.missingTimeZone.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.missingTimeZone.test.js","sourceRoot":"","sources":["../../../../src/components/DatePicker/utils/utils.missingTimeZone.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjC,MAAM,sBAAsB,GAAG,IAAI,CAAC,cAAc,CAAC;AAEnD,QAAQ,CAAC,+DAA+D,EAAE,GAAG,EAAE;IAC9E,UAAU,CAAC,GAAG,EAAE;QACf,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC,kBAAkB,CAAC,CAAC,CACtD,OAA2B,EAC3B,OAAoC,EACnC,EAAE;YACH,MAAM,SAAS,GAAG,IAAI,sBAAsB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC/D,IAAI,CAAC,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,QAAQ,CAAA,EAAE;gBACvB,MAAM,QAAQ,GAAG,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAE1D,SACA,CAAC,eAAe,GAAG,GAAG,EAAE,CAAC,iCACtB,QAAQ,EAAE,KACb,QAAQ,EAAE,SAAS,IAClB,CAAC;aACH;YACD,OAAO,SAAS,CAAC;QAClB,CAAC,CAA+B,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,eAAe,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,GAAG,EAAE;QACtB,IAAI,KAA+B,CAAC;QACpC,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE;YACxB,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QACH,OAAO,KAAK,CAAC;IACd,CAAC,CAAC;IAEF,EAAE,CAAC,8EAA8E,EAAE,GAAG,EAAE;QACvF,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,SAAS,EAAE,CAAC;QACjD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAE9C,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC7C,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CACpC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CACzC,CAAC;QACF,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEhE,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAChD,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["import { DateTime } from 'luxon';\n\nconst OriginalDateTimeFormat = Intl.DateTimeFormat;\n\ndescribe('DatePicker utils when resolvedOptions().timeZone is undefined', () => {\n\tbeforeEach(() => {\n\t\tjest.spyOn(Intl, 'DateTimeFormat').mockImplementation(((\n\t\t\tlocales?: string | string[],\n\t\t\toptions?: Intl.DateTimeFormatOptions\n\t\t) => {\n\t\t\tconst formatter = new OriginalDateTimeFormat(locales, options);\n\t\t\tif (!options?.timeZone) {\n\t\t\t\tconst resolved = formatter.resolvedOptions.bind(formatter);\n\t\t\t\t(\n\t\t\t\t\tformatter as { resolvedOptions: () => unknown }\n\t\t\t\t).resolvedOptions = () => ({\n\t\t\t\t\t...resolved(),\n\t\t\t\t\ttimeZone: undefined,\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn formatter;\n\t\t}) as typeof Intl.DateTimeFormat);\n\t});\n\n\tafterEach(() => {\n\t\tjest.restoreAllMocks();\n\t});\n\n\tconst loadUtils = () => {\n\t\tlet utils: typeof import('./utils');\n\t\tjest.isolateModules(() => {\n\t\t\tutils = require('./utils');\n\t\t});\n\t\treturn utils;\n\t};\n\n\tit('falls back to the system zone instead of calling setZone with a missing name', () => {\n\t\tconst { toDateTime, fromTimeZone } = loadUtils();\n\t\tconst date = new Date('2023-01-01T00:00:00Z');\n\n\t\tconst dateTime = toDateTime(date, undefined);\n\t\texpect(dateTime.isValid).toBe(true);\n\t\texpect(dateTime.toUTC().toISO()).toBe(\n\t\t\tDateTime.fromJSDate(date).toUTC().toISO()\n\t\t);\n\t\texpect(toDateTime(date, 'UTC').toFormat('HH:mm')).toBe('00:00');\n\n\t\tconst roundTrip = fromTimeZone(date, undefined);\n\t\texpect(roundTrip.toISOString()).toBe(date.toISOString());\n\t});\n});\n"]}
@@ -34,6 +34,7 @@ export const Option = (_a) => {
34
34
  'OptionList__option--read-only': readOnly || disabled,
35
35
  'OptionList__option--custom': content && typeof content !== 'string',
36
36
  'OptionList__option--text': !(content && typeof content !== 'string'),
37
+ 'OptionList__option--collapsible': collapseControl,
37
38
  });
38
39
  const getCollapseButton = () => {
39
40
  if (!collapseControl)
@@ -1 +1 @@
1
- {"version":3,"file":"Option.js","sourceRoot":"","sources":["../../../src/components/OptionList/Option.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useLayoutEffect, useRef, FC } from 'react';\nimport { Checkbox } from '../Checkbox';\nimport { Spinner } from '../Spinner';\nimport { Button } from '../Button';\nimport classnames from 'classnames';\n\nexport interface SingleOptionPropStrict {\n\t/** Adds one or more classnames for an element */\n\tclassName?: string;\n\n\t/** Whether child options are visible or not. */\n\tcollapsed?: boolean;\n\n\t/** Whether the option should have the expand/collapse button. */\n\tcollapseControl?: boolean;\n\n\t/** The default visualization of an option in the Popover of the Select */\n\tcontent?: React.ReactNode | string;\n\n\t/** Indicates whether the option is disabled or not. It makes the option unselectable */\n\tdisabled?: boolean;\n\n\t/** Function to allow OptionList to set focus */\n\tgetFocus?: (value: any) => boolean;\n\n\t/** Indeterminate visual for a checkbox */\n\tindeterminate?: boolean;\n\n\t/** Function to allow OptionList to set indeterminate */\n\tgetIndeterminate?: (value: any) => boolean;\n\n\t/** Provides tree-type styling to option, and ARIA label. Can be automatically calculated. */\n\tlevel?: number;\n\n\t/** Visual that an option is loading. Used when child options need to be brought in on expand */\n\tloading?: boolean;\n\n\t/** Calls when the option changes in value */\n\tonChange?: (\n\t\tdata: SingleOptionProps['value'],\n\t\tchecked: boolean,\n\t\tchildObject: SingleOptionProps[],\n\t\tselfObject: SingleOptionProps\n\t) => void;\n\n\t/** Calls when the expand/collapse button is clicked */\n\tonExpand?: (data: SingleOptionProps['value']) => void;\n\n\t/** Grouping of options within options */\n\toptions?: SingleOptionProps[];\n\n\t/** A secondary action a user can take on a single option */\n\tsecondaryAction?: React.ReactNode;\n\n\t/** Whether or not the option is selected */\n\tselected?: boolean;\n\n\t/** Function to allow OptionList to set selected */\n\tgetSelected?: (value: any) => boolean;\n\n\t/** Prevents a user from selecting the option, without giving it the disabled styling/state */\n\treadOnly?: boolean;\n\n\t/** Function to pass option data (value, DOM element) to OptionList */\n\tregisterOption?: (optionData: RegisterOptionData) => void;\n\n\t/** The default string of an option in the trigger of the Select */\n\ttext?: string;\n\n\t/** Value of the option, passed into Anvil's Checkbox value */\n\tvalue?: any;\n}\n\nexport interface SingleOptionProps extends SingleOptionPropStrict {\n\t/** Unstrict Props */\n\t[propName: string]: any;\n}\n\nexport interface RegisterOptionData {\n\ttext?: SingleOptionProps['string'];\n\tvalue?: SingleOptionProps['value'];\n\tdisabled?: SingleOptionProps['disabled'];\n\telement?: HTMLDivElement | null; // TODO: Make this type more generic\n}\n\nexport const Option: FC<SingleOptionProps> = ({\n\tclassName,\n\tcollapseControl,\n\tcollapsed,\n\tcontent,\n\tdisabled,\n\tfocus,\n\tgetFocus,\n\tindeterminate,\n\tgetIndeterminate,\n\tlabel,\n\tlevel,\n\tloading,\n\tonChange,\n\tonExpand,\n\tonKeyDown,\n\toptions,\n\treadOnly,\n\tregisterOption,\n\tsecondaryAction,\n\tselected,\n\tgetSelected,\n\tselfObject,\n\ttext,\n\tvalue,\n\t...props\n}) => {\n\t// after the component has rendered, pass the option data to registerOption\n\tconst checkboxRef = useRef<RegisterOptionData['element']>(null);\n\n\tuseLayoutEffect(() => {\n\t\tif (registerOption) {\n\t\t\tregisterOption({\n\t\t\t\ttext,\n\t\t\t\tvalue,\n\t\t\t\tdisabled,\n\t\t\t\telement: checkboxRef.current,\n\t\t\t});\n\t\t}\n\t});\n\n\tconst OptionClasses = classnames('OptionList__option', className, {\n\t\t'OptionList__option--selected': selected,\n\t\t'OptionList__option--disabled': disabled,\n\t\t'OptionList__option--read-only': readOnly || disabled,\n\t\t'OptionList__option--custom': content && typeof content !== 'string',\n\t\t'OptionList__option--text': !(content && typeof content !== 'string'),\n\t});\n\n\tconst getCollapseButton = () => {\n\t\tif (!collapseControl) return;\n\t\tconst arrow = collapsed\n\t\t\t? 'keyboard_arrow_down'\n\t\t\t: 'keyboard_arrow_right';\n\t\treturn (\n\t\t\t<Button\n\t\t\t\ticonName={arrow}\n\t\t\t\txsmall\n\t\t\t\tfill=\"subtle\"\n\t\t\t\tonClick={handleOnClick}\n\t\t\t\tclassName=\"OptionList__collapse\"\n\t\t\t\taria-expanded={collapsed}\n\t\t\t\taria-label={collapsed ? 'collapse options' : 'expand options'}\n\t\t\t/>\n\t\t);\n\t};\n\n\tconst getLabel = () => {\n\t\tif (label) return label;\n\t\tif (content !== undefined && content !== null) return content;\n\t\tif (text !== undefined && text !== null) return text;\n\t\treturn String(value);\n\t};\n\n\tconst getLoading = () => {\n\t\tif (!loading) return;\n\t\treturn <Spinner size=\"tiny\" className=\"OptionList__spinner\" />;\n\t};\n\n\tconst getSecondaryAction = () => {\n\t\tif (secondaryAction === undefined) return;\n\t\treturn (\n\t\t\t<div className=\"OptionList__option--secondary-action\">\n\t\t\t\t{secondaryAction}\n\t\t\t</div>\n\t\t);\n\t};\n\n\tconst handleOnClick = () => {\n\t\treturn onExpand(value);\n\t};\n\n\tconst handleOnChange = (value: any, checked: boolean) => {\n\t\tif (readOnly || onChange === undefined) return;\n\t\treturn onChange(value, checked, options, selfObject);\n\t};\n\n\tconst handleOnKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n\t\tif (onKeyDown === undefined) return;\n\t\treturn onKeyDown(e, selfObject);\n\t};\n\n\treturn (\n\t\t<div\n\t\t\tclassName={OptionClasses}\n\t\t\trole=\"treeitem\"\n\t\t\taria-level={level}\n\t\t\t{...props}\n\t\t>\n\t\t\t{getLoading() || getCollapseButton()}\n\t\t\t<Checkbox\n\t\t\t\tref={checkboxRef}\n\t\t\t\tchecked={\n\t\t\t\t\tselected != null\n\t\t\t\t\t\t? selected\n\t\t\t\t\t\t: getSelected\n\t\t\t\t\t\t? getSelected(value)\n\t\t\t\t\t\t: null\n\t\t\t\t}\n\t\t\t\tdisabled={disabled}\n\t\t\t\tfocus={\n\t\t\t\t\tfocus != null ? focus : getFocus ? getFocus(value) : null\n\t\t\t\t}\n\t\t\t\tindeterminate={\n\t\t\t\t\tindeterminate != null\n\t\t\t\t\t\t? indeterminate\n\t\t\t\t\t\t: getIndeterminate\n\t\t\t\t\t\t? getIndeterminate(value)\n\t\t\t\t\t\t: null\n\t\t\t\t}\n\t\t\t\tlabel={getLabel()}\n\t\t\t\tonChange={handleOnChange}\n\t\t\t\tonKeyDown={handleOnKeyDown}\n\t\t\t\tvalue={value}\n\t\t\t/>\n\t\t\t{getSecondaryAction()}\n\t\t</div>\n\t);\n};\n"]}
1
+ {"version":3,"file":"Option.js","sourceRoot":"","sources":["../../../src/components/OptionList/Option.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useLayoutEffect, useRef, FC } from 'react';\nimport { Checkbox } from '../Checkbox';\nimport { Spinner } from '../Spinner';\nimport { Button } from '../Button';\nimport classnames from 'classnames';\n\nexport interface SingleOptionPropStrict {\n\t/** Adds one or more classnames for an element */\n\tclassName?: string;\n\n\t/** Whether child options are visible or not. */\n\tcollapsed?: boolean;\n\n\t/** Whether the option should have the expand/collapse button. */\n\tcollapseControl?: boolean;\n\n\t/** The default visualization of an option in the Popover of the Select */\n\tcontent?: React.ReactNode | string;\n\n\t/** Indicates whether the option is disabled or not. It makes the option unselectable */\n\tdisabled?: boolean;\n\n\t/** Function to allow OptionList to set focus */\n\tgetFocus?: (value: any) => boolean;\n\n\t/** Indeterminate visual for a checkbox */\n\tindeterminate?: boolean;\n\n\t/** Function to allow OptionList to set indeterminate */\n\tgetIndeterminate?: (value: any) => boolean;\n\n\t/** Provides tree-type styling to option, and ARIA label. Can be automatically calculated. */\n\tlevel?: number;\n\n\t/** Visual that an option is loading. Used when child options need to be brought in on expand */\n\tloading?: boolean;\n\n\t/** Calls when the option changes in value */\n\tonChange?: (\n\t\tdata: SingleOptionProps['value'],\n\t\tchecked: boolean,\n\t\tchildObject: SingleOptionProps[],\n\t\tselfObject: SingleOptionProps\n\t) => void;\n\n\t/** Calls when the expand/collapse button is clicked */\n\tonExpand?: (data: SingleOptionProps['value']) => void;\n\n\t/** Grouping of options within options */\n\toptions?: SingleOptionProps[];\n\n\t/** A secondary action a user can take on a single option */\n\tsecondaryAction?: React.ReactNode;\n\n\t/** Whether or not the option is selected */\n\tselected?: boolean;\n\n\t/** Function to allow OptionList to set selected */\n\tgetSelected?: (value: any) => boolean;\n\n\t/** Prevents a user from selecting the option, without giving it the disabled styling/state */\n\treadOnly?: boolean;\n\n\t/** Function to pass option data (value, DOM element) to OptionList */\n\tregisterOption?: (optionData: RegisterOptionData) => void;\n\n\t/** The default string of an option in the trigger of the Select */\n\ttext?: string;\n\n\t/** Value of the option, passed into Anvil's Checkbox value */\n\tvalue?: any;\n}\n\nexport interface SingleOptionProps extends SingleOptionPropStrict {\n\t/** Unstrict Props */\n\t[propName: string]: any;\n}\n\nexport interface RegisterOptionData {\n\ttext?: SingleOptionProps['string'];\n\tvalue?: SingleOptionProps['value'];\n\tdisabled?: SingleOptionProps['disabled'];\n\telement?: HTMLDivElement | null; // TODO: Make this type more generic\n}\n\nexport const Option: FC<SingleOptionProps> = ({\n\tclassName,\n\tcollapseControl,\n\tcollapsed,\n\tcontent,\n\tdisabled,\n\tfocus,\n\tgetFocus,\n\tindeterminate,\n\tgetIndeterminate,\n\tlabel,\n\tlevel,\n\tloading,\n\tonChange,\n\tonExpand,\n\tonKeyDown,\n\toptions,\n\treadOnly,\n\tregisterOption,\n\tsecondaryAction,\n\tselected,\n\tgetSelected,\n\tselfObject,\n\ttext,\n\tvalue,\n\t...props\n}) => {\n\t// after the component has rendered, pass the option data to registerOption\n\tconst checkboxRef = useRef<RegisterOptionData['element']>(null);\n\n\tuseLayoutEffect(() => {\n\t\tif (registerOption) {\n\t\t\tregisterOption({\n\t\t\t\ttext,\n\t\t\t\tvalue,\n\t\t\t\tdisabled,\n\t\t\t\telement: checkboxRef.current,\n\t\t\t});\n\t\t}\n\t});\n\n\tconst OptionClasses = classnames('OptionList__option', className, {\n\t\t'OptionList__option--selected': selected,\n\t\t'OptionList__option--disabled': disabled,\n\t\t'OptionList__option--read-only': readOnly || disabled,\n\t\t'OptionList__option--custom': content && typeof content !== 'string',\n\t\t'OptionList__option--text': !(content && typeof content !== 'string'),\n\t\t'OptionList__option--collapsible': collapseControl,\n\t});\n\n\tconst getCollapseButton = () => {\n\t\tif (!collapseControl) return;\n\t\tconst arrow = collapsed\n\t\t\t? 'keyboard_arrow_down'\n\t\t\t: 'keyboard_arrow_right';\n\t\treturn (\n\t\t\t<Button\n\t\t\t\ticonName={arrow}\n\t\t\t\txsmall\n\t\t\t\tfill=\"subtle\"\n\t\t\t\tonClick={handleOnClick}\n\t\t\t\tclassName=\"OptionList__collapse\"\n\t\t\t\taria-expanded={collapsed}\n\t\t\t\taria-label={collapsed ? 'collapse options' : 'expand options'}\n\t\t\t/>\n\t\t);\n\t};\n\n\tconst getLabel = () => {\n\t\tif (label) return label;\n\t\tif (content !== undefined && content !== null) return content;\n\t\tif (text !== undefined && text !== null) return text;\n\t\treturn String(value);\n\t};\n\n\tconst getLoading = () => {\n\t\tif (!loading) return;\n\t\treturn <Spinner size=\"tiny\" className=\"OptionList__spinner\" />;\n\t};\n\n\tconst getSecondaryAction = () => {\n\t\tif (secondaryAction === undefined) return;\n\t\treturn (\n\t\t\t<div className=\"OptionList__option--secondary-action\">\n\t\t\t\t{secondaryAction}\n\t\t\t</div>\n\t\t);\n\t};\n\n\tconst handleOnClick = () => {\n\t\treturn onExpand(value);\n\t};\n\n\tconst handleOnChange = (value: any, checked: boolean) => {\n\t\tif (readOnly || onChange === undefined) return;\n\t\treturn onChange(value, checked, options, selfObject);\n\t};\n\n\tconst handleOnKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n\t\tif (onKeyDown === undefined) return;\n\t\treturn onKeyDown(e, selfObject);\n\t};\n\n\treturn (\n\t\t<div\n\t\t\tclassName={OptionClasses}\n\t\t\trole=\"treeitem\"\n\t\t\taria-level={level}\n\t\t\t{...props}\n\t\t>\n\t\t\t{getLoading() || getCollapseButton()}\n\t\t\t<Checkbox\n\t\t\t\tref={checkboxRef}\n\t\t\t\tchecked={\n\t\t\t\t\tselected != null\n\t\t\t\t\t\t? selected\n\t\t\t\t\t\t: getSelected\n\t\t\t\t\t\t? getSelected(value)\n\t\t\t\t\t\t: null\n\t\t\t\t}\n\t\t\t\tdisabled={disabled}\n\t\t\t\tfocus={\n\t\t\t\t\tfocus != null ? focus : getFocus ? getFocus(value) : null\n\t\t\t\t}\n\t\t\t\tindeterminate={\n\t\t\t\t\tindeterminate != null\n\t\t\t\t\t\t? indeterminate\n\t\t\t\t\t\t: getIndeterminate\n\t\t\t\t\t\t? getIndeterminate(value)\n\t\t\t\t\t\t: null\n\t\t\t\t}\n\t\t\t\tlabel={getLabel()}\n\t\t\t\tonChange={handleOnChange}\n\t\t\t\tonKeyDown={handleOnKeyDown}\n\t\t\t\tvalue={value}\n\t\t\t/>\n\t\t\t{getSecondaryAction()}\n\t\t</div>\n\t);\n};\n"]}
@@ -51,6 +51,9 @@
51
51
  .OptionList__option .Checkbox__box {
52
52
  top: 0;
53
53
  }
54
+ .OptionList__option.OptionList__option--collapsible .Checkbox__label::after {
55
+ inset: -8px -16px -8px 0;
56
+ }
54
57
 
55
58
  .OptionList__header {
56
59
  line-height: normal;
@@ -1 +1 @@
1
- {"version":3,"sourceRoot":"","sources":["../../../src/utilities/_visually-hidden.scss","../../../src/components/OptionList/OptionList.scss","../../../src/utilities/_component-reset.scss","../../../node_modules/@servicetitan/tokens/core/tokens.scss"],"names":[],"mappings":"AAAA;ACSC;EACC;EACA;EACA;EACA;EACA;EACA;EACA,kBAXwB;;;AAe1B;ACjBC;EACA;AAEA;EACA;;;ADiBD;AAEC;EACC;;;AAIF;AACA;EACC,eE8FW;EF7FX,eEbiB;EFcjB;EACA;EACA;AAuBA;;AAhBA;EACC,WE4FY;EF3FZ,aE8DoB;EF7DpB;;AAGA;EACC;EACA;EACA;EACA;;AAIF;EAAc;;AAGd;EACC;EACA;;AAED;EAAiB;;;AAGlB;EACC;EACA,gBEwDW;EFvDX,cEwDW;;;AFpDX;EAKC,kBA5EyB;;AAwEzB;EACC,OAvEkB;;AA8ElB;EAAY,kBAhFY;;;AAqF3B;AACA;EAAsC,cEqC1B;;;AFjCV;EACC;;;AADD;EACC;;;AADD;EACC;;;AADD;EACC;;;AADD;EACC;;;AADD;EACC;;;AADD;EACC;;;AAKH;AACA;EACC;EACA;EACA;EACA,cE6Bc;;;AF1Bf;AACA;EACC;EACA;EACA;;;AAGD;AAEC;EAAwB;;AACxB;EAAiB;;;AAGlB;AACA;EACC;EACA;EACA;EACA;EACA,cEDW;;;AFIZ;AAAA;AAAA;AAAA;AAKC;AAAA;EAGC;;AAEA;AAAA;EACC;;AAIF;EAAwB;;;AAGzB;AAAA;AAAA;AAAA;AAKC;EAAwB","file":"OptionList.css"}
1
+ {"version":3,"sourceRoot":"","sources":["../../../src/utilities/_visually-hidden.scss","../../../src/components/OptionList/OptionList.scss","../../../src/utilities/_component-reset.scss","../../../node_modules/@servicetitan/tokens/core/tokens.scss"],"names":[],"mappings":"AAAA;ACSC;EACC;EACA;EACA;EACA;EACA;EACA;EACA,kBAXwB;;;AAe1B;ACjBC;EACA;AAEA;EACA;;;ADiBD;AAEC;EACC;;;AAIF;AACA;EACC,eE8FW;EF7FX,eEbiB;EFcjB;EACA;EACA;AAuBA;;AAhBA;EACC,WE4FY;EF3FZ,aE8DoB;EF7DpB;;AAGA;EACC;EACA;EACA;EACA;;AAIF;EAAc;;AAGd;EACC;EACA;;AAED;EAAiB;;AAIf;EACC;;;AAOJ;EACC;EACA,gBE+CW;EF9CX,cE+CW;;;AF3CX;EAKC,kBArFyB;;AAiFzB;EACC,OAhFkB;;AAuFlB;EAAY,kBAzFY;;;AA8F3B;AACA;EAAsC,cE4B1B;;;AFxBV;EACC;;;AADD;EACC;;;AADD;EACC;;;AADD;EACC;;;AADD;EACC;;;AADD;EACC;;;AADD;EACC;;;AAKH;AACA;EACC;EACA;EACA;EACA,cEoBc;;;AFjBf;AACA;EACC;EACA;EACA;;;AAGD;AAEC;EAAwB;;AACxB;EAAiB;;;AAGlB;AACA;EACC;EACA;EACA;EACA;EACA,cEVW;;;AFaZ;AAAA;AAAA;AAAA;AAKC;AAAA;EAGC;;AAEA;AAAA;EACC;;AAIF;EAAwB;;;AAGzB;AAAA;AAAA;AAAA;AAKC;EAAwB","file":"OptionList.css"}
@@ -51,6 +51,9 @@
51
51
  .OptionList__option .Checkbox__box {
52
52
  top: 0;
53
53
  }
54
+ .OptionList__option.OptionList__option--collapsible .Checkbox__label::after {
55
+ inset: -8px -16px -8px 0;
56
+ }
54
57
 
55
58
  .OptionList__header {
56
59
  line-height: normal;
@@ -1 +1 @@
1
- {"version":3,"sourceRoot":"","sources":["../../../src/utilities/_visually-hidden.scss","../../../src/components/OptionList/OptionList.scss","../../../src/utilities/_component-reset.scss","../../../node_modules/@servicetitan/tokens/core/tokens.scss"],"names":[],"mappings":"AAAA;ACSC;EACC;EACA;EACA;EACA;EACA;EACA;EACA,kBAXwB;;;AAe1B;ACjBC;EACA;AAEA;EACA;;;ADiBD;AAEC;EACC;;;AAIF;AACA;EACC,eE8FW;EF7FX,eEbiB;EFcjB;EACA;EACA;AAuBA;;AAhBA;EACC,WE4FY;EF3FZ,aE8DoB;EF7DpB;;AAGA;EACC;EACA;EACA;EACA;;AAIF;EAAc;;AAGd;EACC;EACA;;AAED;EAAiB;;;AAGlB;EACC;EACA,gBEwDW;EFvDX,cEwDW;;;AFpDX;EAKC,kBA5EyB;;AAwEzB;EACC,OAvEkB;;AA8ElB;EAAY,kBAhFY;;;AAqF3B;AACA;EAAsC,cEqC1B;;;AFjCV;EACC;;;AADD;EACC;;;AADD;EACC;;;AADD;EACC;;;AADD;EACC;;;AADD;EACC;;;AADD;EACC;;;AAKH;AACA;EACC;EACA;EACA;EACA,cE6Bc;;;AF1Bf;AACA;EACC;EACA;EACA;;;AAGD;AAEC;EAAwB;;AACxB;EAAiB;;;AAGlB;AACA;EACC;EACA;EACA;EACA;EACA,cEDW;;;AFIZ;AAAA;AAAA;AAAA;AAKC;AAAA;EAGC;;AAEA;AAAA;EACC;;AAIF;EAAwB;;;AAGzB;AAAA;AAAA;AAAA;AAKC;EAAwB","file":"index.css"}
1
+ {"version":3,"sourceRoot":"","sources":["../../../src/utilities/_visually-hidden.scss","../../../src/components/OptionList/OptionList.scss","../../../src/utilities/_component-reset.scss","../../../node_modules/@servicetitan/tokens/core/tokens.scss"],"names":[],"mappings":"AAAA;ACSC;EACC;EACA;EACA;EACA;EACA;EACA;EACA,kBAXwB;;;AAe1B;ACjBC;EACA;AAEA;EACA;;;ADiBD;AAEC;EACC;;;AAIF;AACA;EACC,eE8FW;EF7FX,eEbiB;EFcjB;EACA;EACA;AAuBA;;AAhBA;EACC,WE4FY;EF3FZ,aE8DoB;EF7DpB;;AAGA;EACC;EACA;EACA;EACA;;AAIF;EAAc;;AAGd;EACC;EACA;;AAED;EAAiB;;AAIf;EACC;;;AAOJ;EACC;EACA,gBE+CW;EF9CX,cE+CW;;;AF3CX;EAKC,kBArFyB;;AAiFzB;EACC,OAhFkB;;AAuFlB;EAAY,kBAzFY;;;AA8F3B;AACA;EAAsC,cE4B1B;;;AFxBV;EACC;;;AADD;EACC;;;AADD;EACC;;;AADD;EACC;;;AADD;EACC;;;AADD;EACC;;;AADD;EACC;;;AAKH;AACA;EACC;EACA;EACA;EACA,cEoBc;;;AFjBf;AACA;EACC;EACA;EACA;;;AAGD;AAEC;EAAwB;;AACxB;EAAiB;;;AAGlB;AACA;EACC;EACA;EACA;EACA;EACA,cEVW;;;AFaZ;AAAA;AAAA;AAAA;AAKC;AAAA;EAGC;;AAEA;AAAA;EACC;;AAIF;EAAwB;;;AAGzB;AAAA;AAAA;AAAA;AAKC;EAAwB","file":"index.css"}
@@ -148,7 +148,7 @@ export class Select extends Component {
148
148
  'Select--grouped': grouped,
149
149
  });
150
150
  const realValue = value === undefined ? (this.props.multiple ? [] : '') : value;
151
- return (React.createElement(Dropdown, Object.assign({}, props, { options: this.options, value: realValue, onChange: this.handleChange, onSearchChange: this.handleSearchChange, onClose: this.handleClose, className: SelectClasses })));
151
+ return (React.createElement(Dropdown, Object.assign({}, props, { selectOnBlur: false, options: this.options, value: realValue, onChange: this.handleChange, onSearchChange: this.handleSearchChange, onClose: this.handleClose, className: SelectClasses })));
152
152
  }
153
153
  }
154
154
  Select.defaultProps = {
@@ -1 +1 @@
1
- {"version":3,"file":"Select.js","sourceRoot":"","sources":["../../../src/components/Select/Select.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { FC, Component } from 'react';\nimport classnames from 'classnames';\nimport memoizeOne from 'memoize-one';\nimport {\n\tDropdownItemProps,\n\tDropdownOnSearchChangeData,\n} from 'semantic-ui-react';\nimport { Dropdown, DropdownProps } from '../Dropdown';\n\ninterface GroupedSelectItemProps extends DropdownItemProps {\n\tgroup?: string;\n\tindex?: number;\n}\n\nconst GroupedSelectItem: FC<GroupedSelectItemProps> = (props) => {\n\tconst content = props.content !== undefined ? props.content : props.text;\n\treturn (\n\t\t<React.Fragment>\n\t\t\t{props.index === 0 && props.group && (\n\t\t\t\t<div className=\"group\">{props.group}</div>\n\t\t\t)}\n\n\t\t\t<span className=\"text\">{content}</span>\n\t\t</React.Fragment>\n\t);\n};\n\ninterface SelectState {\n\tsearchQuery?: SelectProps['searchQuery'];\n}\n\nexport interface SelectProps extends DropdownProps {\n\t/** Set size of the select.<br /> Possible values: <i>'large'</i>, <i>'small'</i> */\n\tsize?: 'small' | 'medium' | 'large';\n\n\t/** Shortcut for large-sized select */\n\tlarge?: boolean;\n\n\t/** Shortcut for small-sized select */\n\tsmall?: boolean;\n\n\t/** Array of items in Select */\n\toptions: DropdownItemProps[];\n\n\t/** Allow for grouping of Select options */\n\tgrouped?: boolean;\n}\n\nexport class Select extends Component<SelectProps, SelectState> {\n\tstatic defaultProps = {\n\t\tselection: true,\n\t\tsize: 'medium',\n\t};\n\n\tstatic displayName = 'Select';\n\n\tget searchQuery() {\n\t\treturn this.props.hasOwnProperty('searchQuery')\n\t\t\t? this.props.searchQuery\n\t\t\t: this.props.grouped\n\t\t\t? this.state.searchQuery\n\t\t\t: undefined;\n\t}\n\n\tget options() {\n\t\tif (!this.props.grouped) {\n\t\t\treturn this.props.options;\n\t\t}\n\n\t\treturn this.memoizedOptions(\n\t\t\tthis.props.options,\n\t\t\tthis.searchQuery,\n\t\t\tthis.props.value,\n\t\t\tthis.props.multiple\n\t\t);\n\t}\n\n\tmemoizedOptions = memoizeOne(\n\t\t(\n\t\t\toptions: DropdownItemProps[],\n\t\t\tsearchQuery?: SelectProps['searchQuery'],\n\t\t\tvalue?: SelectProps['value'],\n\t\t\tmultiple?: boolean\n\t\t) => {\n\t\t\tconst splitedOptions = this.splitOptions(\n\t\t\t\toptions,\n\t\t\t\tsearchQuery,\n\t\t\t\tvalue,\n\t\t\t\tmultiple\n\t\t\t);\n\n\t\t\treturn [\n\t\t\t\t...this.groupOptions(splitedOptions.available),\n\t\t\t\t...splitedOptions.selected,\n\t\t\t\t...splitedOptions.excluded,\n\t\t\t];\n\t\t}\n\t);\n\n\tconstructor(props: SelectProps) {\n\t\tsuper(props);\n\n\t\tthis.state = {\n\t\t\tsearchQuery: '',\n\t\t};\n\t}\n\n\thandleChange = (\n\t\tevent: React.SyntheticEvent<HTMLElement>,\n\t\tdata: DropdownProps\n\t) => {\n\t\t/*\n\t\t * search query is cleared every time Select is closed,\n\t\t * so if this.props.multiple !== true search query will be an empty string anyway\n\t\t * because Select will be closed after an element is selected\n\t\t */\n\t\tif (this.searchQuery && this.props.multiple) {\n\t\t\tconst splittedOptions = this.splitOptions(\n\t\t\t\tthis.props.options,\n\t\t\t\tthis.searchQuery,\n\t\t\t\tdata.value,\n\t\t\t\tthis.props.multiple\n\t\t\t);\n\n\t\t\t// Semantic UI resets filter (without event firing) when selected last filtered element\n\t\t\tif (splittedOptions.available.length === 0) {\n\t\t\t\tconst searchData = { ...data, searchQuery: '' };\n\n\t\t\t\tthis.handleSearchChange(event, searchData);\n\t\t\t}\n\t\t}\n\n\t\tdata.value = data.value === '' ? undefined : data.value;\n\n\t\tif (this.props.onChange) {\n\t\t\tthis.props.onChange(event, data);\n\t\t}\n\t};\n\n\thandleSearchChange = (\n\t\tevent: React.SyntheticEvent<HTMLElement>,\n\t\tdata: DropdownOnSearchChangeData\n\t) => {\n\t\tif (this.props.grouped && !this.props.hasOwnProperty('searchQuery')) {\n\t\t\tthis.setState({\n\t\t\t\tsearchQuery: data.searchQuery,\n\t\t\t});\n\t\t}\n\n\t\tif (this.props.onSearchChange) {\n\t\t\tthis.props.onSearchChange(event, data);\n\t\t}\n\t};\n\n\t// Semantic UI resets filter (without event firing) on select close\n\thandleClose = (\n\t\tevent: React.SyntheticEvent<HTMLElement>,\n\t\tdata: DropdownProps\n\t) => {\n\t\tconst searchData = { ...data, searchQuery: '' };\n\t\tthis.handleSearchChange(event, searchData);\n\n\t\tif (this.props.onClose) {\n\t\t\tthis.props.onClose(event, data);\n\t\t}\n\t};\n\n\tisOptionSuitable(\n\t\toption: DropdownItemProps,\n\t\tsearchQuery: SelectProps['searchQuery']\n\t) {\n\t\tif (option.text == null) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn option.text\n\t\t\t.toString()\n\t\t\t.toLowerCase()\n\t\t\t.includes(searchQuery.toLowerCase());\n\t}\n\n\tsplitOptions = memoizeOne(\n\t\t(\n\t\t\toptions: DropdownItemProps[],\n\t\t\tsearchQuery?: SelectProps['searchQuery'],\n\t\t\tvalue?: SelectProps['value'],\n\t\t\tmultiple?: boolean\n\t\t) => {\n\t\t\tconst available: DropdownItemProps[] = [];\n\t\t\tconst selected: DropdownItemProps[] = [];\n\t\t\tconst excluded: DropdownItemProps[] = [];\n\n\t\t\tfor (const option of options) {\n\t\t\t\tif (multiple) {\n\t\t\t\t\tif (Array.isArray(value) && value.includes(option.value)) {\n\t\t\t\t\t\tselected.push(option);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\t!searchQuery ||\n\t\t\t\t\tthis.isOptionSuitable(option, searchQuery)\n\t\t\t\t) {\n\t\t\t\t\tavailable.push(option);\n\t\t\t\t} else {\n\t\t\t\t\texcluded.push(option);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tavailable,\n\t\t\t\tselected,\n\t\t\t\texcluded,\n\t\t\t} as Record<\n\t\t\t\t'available' | 'selected' | 'excluded',\n\t\t\t\tDropdownItemProps[]\n\t\t\t>;\n\t\t}\n\t);\n\n\tgroupOptions = (options: DropdownItemProps[]) => {\n\t\tconst groups = options.reduce((result, current) => {\n\t\t\tconst group: string = current.group || ('' as string);\n\n\t\t\tif (!result[group]) {\n\t\t\t\tresult[group] = [];\n\t\t\t}\n\n\t\t\tresult[group].push(current);\n\n\t\t\treturn result;\n\t\t}, {} as Record<string, DropdownItemProps[]>);\n\n\t\treturn [].concat(\n\t\t\t// building flat list of options\n\t\t\t...Object.keys(groups)\n\t\t\t\t.sort()\n\t\t\t\t.map(\n\t\t\t\t\t// sorting groups and converting them to the collection\n\t\t\t\t\t(group) =>\n\t\t\t\t\t\tgroups[group].map((option, index) => ({\n\t\t\t\t\t\t\t...option,\n\t\t\t\t\t\t\tindex,\n\t\t\t\t\t\t\tclassName: classnames(\n\t\t\t\t\t\t\t\toption.className,\n\t\t\t\t\t\t\t\tindex === 0 && 'with-group'\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tcontent: (\n\t\t\t\t\t\t\t\t<GroupedSelectItem index={index} {...option} />\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t}))\n\t\t\t\t)\n\t\t) as GroupedSelectItemProps[];\n\t};\n\n\trender() {\n\t\tconst {\n\t\t\tclassName,\n\t\t\tgrouped,\n\t\t\tlarge,\n\t\t\tonChange,\n\t\t\tonClose,\n\t\t\tonSearchChange,\n\t\t\toptions,\n\t\t\tsize,\n\t\t\tsmall,\n\t\t\tvalue,\n\t\t\t...props\n\t\t} = this.props;\n\n\t\tlet realSize = size;\n\n\t\tif (small) realSize = 'small';\n\t\tif (large) realSize = 'large';\n\n\t\tconst SelectClasses = classnames('Select', className, {\n\t\t\t'Select--small': realSize === 'small',\n\t\t\t'Select--large': realSize === 'large',\n\t\t\t'Select--grouped': grouped,\n\t\t});\n\n\t\tconst realValue =\n\t\t\tvalue === undefined ? (this.props.multiple ? [] : '') : value;\n\n\t\treturn (\n\t\t\t<Dropdown\n\t\t\t\t{...props}\n\t\t\t\toptions={this.options}\n\t\t\t\tvalue={realValue}\n\t\t\t\tonChange={this.handleChange}\n\t\t\t\tonSearchChange={this.handleSearchChange}\n\t\t\t\tonClose={this.handleClose}\n\t\t\t\tclassName={SelectClasses}\n\t\t\t/>\n\t\t);\n\t}\n}\n"]}
1
+ {"version":3,"file":"Select.js","sourceRoot":"","sources":["../../../src/components/Select/Select.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,KAAK,EAAE,EAAM,SAAS,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,UAAU,MAAM,aAAa,CAAC;AAKrC,OAAO,EAAE,QAAQ,EAAiB,MAAM,aAAa,CAAC;AAOtD,MAAM,iBAAiB,GAA+B,CAAC,KAAK,EAAE,EAAE;IAC/D,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;IACzE,OAAO,CACN,oBAAC,KAAK,CAAC,QAAQ;QACb,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,IAAI,CACpC,6BAAK,SAAS,EAAC,OAAO,IAAE,KAAK,CAAC,KAAK,CAAO,CAC1C;QAED,8BAAM,SAAS,EAAC,MAAM,IAAE,OAAO,CAAQ,CACvB,CACjB,CAAC;AACH,CAAC,CAAC;AAuBF,MAAM,OAAO,MAAO,SAAQ,SAAmC;IAmD9D,YAAY,KAAkB;QAC7B,KAAK,CAAC,KAAK,CAAC,CAAC;QAvBd,oBAAe,GAAG,UAAU,CAC3B,CACC,OAA4B,EAC5B,WAAwC,EACxC,KAA4B,EAC5B,QAAkB,EACjB,EAAE;YACH,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,CACvC,OAAO,EACP,WAAW,EACX,KAAK,EACL,QAAQ,CACR,CAAC;YAEF,OAAO;gBACN,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,SAAS,CAAC;gBAC9C,GAAG,cAAc,CAAC,QAAQ;gBAC1B,GAAG,cAAc,CAAC,QAAQ;aAC1B,CAAC;QACH,CAAC,CACD,CAAC;QAUF,iBAAY,GAAG,CACd,KAAwC,EACxC,IAAmB,EAClB,EAAE;YACH;;;;eAIG;YACH,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;gBAC5C,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,CACxC,IAAI,CAAC,KAAK,CAAC,OAAO,EAClB,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,KAAK,CAAC,QAAQ,CACnB,CAAC;gBAEF,uFAAuF;gBACvF,IAAI,eAAe,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;oBAC3C,MAAM,UAAU,mCAAQ,IAAI,KAAE,WAAW,EAAE,EAAE,GAAE,CAAC;oBAEhD,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;iBAC3C;aACD;YAED,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;YAExD,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;gBACxB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;aACjC;QACF,CAAC,CAAC;QAEF,uBAAkB,GAAG,CACpB,KAAwC,EACxC,IAAgC,EAC/B,EAAE;YACH,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE;gBACpE,IAAI,CAAC,QAAQ,CAAC;oBACb,WAAW,EAAE,IAAI,CAAC,WAAW;iBAC7B,CAAC,CAAC;aACH;YAED,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;gBAC9B,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;aACvC;QACF,CAAC,CAAC;QAEF,mEAAmE;QACnE,gBAAW,GAAG,CACb,KAAwC,EACxC,IAAmB,EAClB,EAAE;YACH,MAAM,UAAU,mCAAQ,IAAI,KAAE,WAAW,EAAE,EAAE,GAAE,CAAC;YAChD,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;YAE3C,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;gBACvB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;aAChC;QACF,CAAC,CAAC;QAgBF,iBAAY,GAAG,UAAU,CACxB,CACC,OAA4B,EAC5B,WAAwC,EACxC,KAA4B,EAC5B,QAAkB,EACjB,EAAE;YACH,MAAM,SAAS,GAAwB,EAAE,CAAC;YAC1C,MAAM,QAAQ,GAAwB,EAAE,CAAC;YACzC,MAAM,QAAQ,GAAwB,EAAE,CAAC;YAEzC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;gBAC7B,IAAI,QAAQ,EAAE;oBACb,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;wBACzD,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;wBACtB,SAAS;qBACT;iBACD;gBAED,IACC,CAAC,WAAW;oBACZ,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,WAAW,CAAC,EACzC;oBACD,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;iBACvB;qBAAM;oBACN,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;iBACtB;aACD;YAED,OAAO;gBACN,SAAS;gBACT,QAAQ;gBACR,QAAQ;aAIR,CAAC;QACH,CAAC,CACD,CAAC;QAEF,iBAAY,GAAG,CAAC,OAA4B,EAAE,EAAE;YAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE;gBACjD,MAAM,KAAK,GAAW,OAAO,CAAC,KAAK,IAAK,EAAa,CAAC;gBAEtD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;oBACnB,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;iBACnB;gBAED,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAE5B,OAAO,MAAM,CAAC;YACf,CAAC,EAAE,EAAyC,CAAC,CAAC;YAE9C,OAAO,EAAE,CAAC,MAAM;YACf,gCAAgC;YAChC,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;iBACpB,IAAI,EAAE;iBACN,GAAG;YACH,uDAAuD;YACvD,CAAC,KAAK,EAAE,EAAE,CACT,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,iCACjC,MAAM,KACT,KAAK,EACL,SAAS,EAAE,UAAU,CACpB,MAAM,CAAC,SAAS,EAChB,KAAK,KAAK,CAAC,IAAI,YAAY,CAC3B,EACD,OAAO,EAAE,CACR,oBAAC,iBAAiB,kBAAC,KAAK,EAAE,KAAK,IAAM,MAAM,EAAI,CAC/C,IACA,CAAC,CACJ,CAC0B,CAAC;QAC/B,CAAC,CAAC;QAxJD,IAAI,CAAC,KAAK,GAAG;YACZ,WAAW,EAAE,EAAE;SACf,CAAC;IACH,CAAC;IAjDD,IAAI,WAAW;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,aAAa,CAAC;YAC9C,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW;YACxB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO;gBACpB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW;gBACxB,CAAC,CAAC,SAAS,CAAC;IACd,CAAC;IAED,IAAI,OAAO;QACV,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;YACxB,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;SAC1B;QAED,OAAO,IAAI,CAAC,eAAe,CAC1B,IAAI,CAAC,KAAK,CAAC,OAAO,EAClB,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,KAAK,CAAC,KAAK,EAChB,IAAI,CAAC,KAAK,CAAC,QAAQ,CACnB,CAAC;IACH,CAAC;IA4FD,gBAAgB,CACf,MAAyB,EACzB,WAAuC;QAEvC,IAAI,MAAM,CAAC,IAAI,IAAI,IAAI,EAAE;YACxB,OAAO,IAAI,CAAC;SACZ;QAED,OAAO,MAAM,CAAC,IAAI;aAChB,QAAQ,EAAE;aACV,WAAW,EAAE;aACb,QAAQ,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC;IACvC,CAAC;IA6ED,MAAM;QACL,MAAM,KAYF,IAAI,CAAC,KAAK,EAZR,EACL,SAAS,EACT,OAAO,EACP,KAAK,EACL,QAAQ,EACR,OAAO,EACP,cAAc,EACd,OAAO,EACP,IAAI,EACJ,KAAK,EACL,KAAK,OAEQ,EADV,KAAK,cAXH,+GAYL,CAAa,CAAC;QAEf,IAAI,QAAQ,GAAG,IAAI,CAAC;QAEpB,IAAI,KAAK;YAAE,QAAQ,GAAG,OAAO,CAAC;QAC9B,IAAI,KAAK;YAAE,QAAQ,GAAG,OAAO,CAAC;QAE9B,MAAM,aAAa,GAAG,UAAU,CAAC,QAAQ,EAAE,SAAS,EAAE;YACrD,eAAe,EAAE,QAAQ,KAAK,OAAO;YACrC,eAAe,EAAE,QAAQ,KAAK,OAAO;YACrC,iBAAiB,EAAE,OAAO;SAC1B,CAAC,CAAC;QAEH,MAAM,SAAS,GACd,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAE/D,OAAO,CACN,oBAAC,QAAQ,oBACJ,KAAK,IACT,YAAY,EAAE,KAAK,EACnB,OAAO,EAAE,IAAI,CAAC,OAAO,EACrB,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,IAAI,CAAC,YAAY,EAC3B,cAAc,EAAE,IAAI,CAAC,kBAAkB,EACvC,OAAO,EAAE,IAAI,CAAC,WAAW,EACzB,SAAS,EAAE,aAAa,IACvB,CACF,CAAC;IACH,CAAC;;AAxPM,mBAAY,GAAG;IACrB,SAAS,EAAE,IAAI;IACf,IAAI,EAAE,QAAQ;CACd,CAAC;AAEK,kBAAW,GAAG,QAAQ,CAAC","sourcesContent":["import React, { FC, Component } from 'react';\nimport classnames from 'classnames';\nimport memoizeOne from 'memoize-one';\nimport {\n\tDropdownItemProps,\n\tDropdownOnSearchChangeData,\n} from 'semantic-ui-react';\nimport { Dropdown, DropdownProps } from '../Dropdown';\n\ninterface GroupedSelectItemProps extends DropdownItemProps {\n\tgroup?: string;\n\tindex?: number;\n}\n\nconst GroupedSelectItem: FC<GroupedSelectItemProps> = (props) => {\n\tconst content = props.content !== undefined ? props.content : props.text;\n\treturn (\n\t\t<React.Fragment>\n\t\t\t{props.index === 0 && props.group && (\n\t\t\t\t<div className=\"group\">{props.group}</div>\n\t\t\t)}\n\n\t\t\t<span className=\"text\">{content}</span>\n\t\t</React.Fragment>\n\t);\n};\n\ninterface SelectState {\n\tsearchQuery?: SelectProps['searchQuery'];\n}\n\nexport interface SelectProps extends DropdownProps {\n\t/** Set size of the select.<br /> Possible values: <i>'large'</i>, <i>'small'</i> */\n\tsize?: 'small' | 'medium' | 'large';\n\n\t/** Shortcut for large-sized select */\n\tlarge?: boolean;\n\n\t/** Shortcut for small-sized select */\n\tsmall?: boolean;\n\n\t/** Array of items in Select */\n\toptions: DropdownItemProps[];\n\n\t/** Allow for grouping of Select options */\n\tgrouped?: boolean;\n}\n\nexport class Select extends Component<SelectProps, SelectState> {\n\tstatic defaultProps = {\n\t\tselection: true,\n\t\tsize: 'medium',\n\t};\n\n\tstatic displayName = 'Select';\n\n\tget searchQuery() {\n\t\treturn this.props.hasOwnProperty('searchQuery')\n\t\t\t? this.props.searchQuery\n\t\t\t: this.props.grouped\n\t\t\t? this.state.searchQuery\n\t\t\t: undefined;\n\t}\n\n\tget options() {\n\t\tif (!this.props.grouped) {\n\t\t\treturn this.props.options;\n\t\t}\n\n\t\treturn this.memoizedOptions(\n\t\t\tthis.props.options,\n\t\t\tthis.searchQuery,\n\t\t\tthis.props.value,\n\t\t\tthis.props.multiple\n\t\t);\n\t}\n\n\tmemoizedOptions = memoizeOne(\n\t\t(\n\t\t\toptions: DropdownItemProps[],\n\t\t\tsearchQuery?: SelectProps['searchQuery'],\n\t\t\tvalue?: SelectProps['value'],\n\t\t\tmultiple?: boolean\n\t\t) => {\n\t\t\tconst splitedOptions = this.splitOptions(\n\t\t\t\toptions,\n\t\t\t\tsearchQuery,\n\t\t\t\tvalue,\n\t\t\t\tmultiple\n\t\t\t);\n\n\t\t\treturn [\n\t\t\t\t...this.groupOptions(splitedOptions.available),\n\t\t\t\t...splitedOptions.selected,\n\t\t\t\t...splitedOptions.excluded,\n\t\t\t];\n\t\t}\n\t);\n\n\tconstructor(props: SelectProps) {\n\t\tsuper(props);\n\n\t\tthis.state = {\n\t\t\tsearchQuery: '',\n\t\t};\n\t}\n\n\thandleChange = (\n\t\tevent: React.SyntheticEvent<HTMLElement>,\n\t\tdata: DropdownProps\n\t) => {\n\t\t/*\n\t\t * search query is cleared every time Select is closed,\n\t\t * so if this.props.multiple !== true search query will be an empty string anyway\n\t\t * because Select will be closed after an element is selected\n\t\t */\n\t\tif (this.searchQuery && this.props.multiple) {\n\t\t\tconst splittedOptions = this.splitOptions(\n\t\t\t\tthis.props.options,\n\t\t\t\tthis.searchQuery,\n\t\t\t\tdata.value,\n\t\t\t\tthis.props.multiple\n\t\t\t);\n\n\t\t\t// Semantic UI resets filter (without event firing) when selected last filtered element\n\t\t\tif (splittedOptions.available.length === 0) {\n\t\t\t\tconst searchData = { ...data, searchQuery: '' };\n\n\t\t\t\tthis.handleSearchChange(event, searchData);\n\t\t\t}\n\t\t}\n\n\t\tdata.value = data.value === '' ? undefined : data.value;\n\n\t\tif (this.props.onChange) {\n\t\t\tthis.props.onChange(event, data);\n\t\t}\n\t};\n\n\thandleSearchChange = (\n\t\tevent: React.SyntheticEvent<HTMLElement>,\n\t\tdata: DropdownOnSearchChangeData\n\t) => {\n\t\tif (this.props.grouped && !this.props.hasOwnProperty('searchQuery')) {\n\t\t\tthis.setState({\n\t\t\t\tsearchQuery: data.searchQuery,\n\t\t\t});\n\t\t}\n\n\t\tif (this.props.onSearchChange) {\n\t\t\tthis.props.onSearchChange(event, data);\n\t\t}\n\t};\n\n\t// Semantic UI resets filter (without event firing) on select close\n\thandleClose = (\n\t\tevent: React.SyntheticEvent<HTMLElement>,\n\t\tdata: DropdownProps\n\t) => {\n\t\tconst searchData = { ...data, searchQuery: '' };\n\t\tthis.handleSearchChange(event, searchData);\n\n\t\tif (this.props.onClose) {\n\t\t\tthis.props.onClose(event, data);\n\t\t}\n\t};\n\n\tisOptionSuitable(\n\t\toption: DropdownItemProps,\n\t\tsearchQuery: SelectProps['searchQuery']\n\t) {\n\t\tif (option.text == null) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn option.text\n\t\t\t.toString()\n\t\t\t.toLowerCase()\n\t\t\t.includes(searchQuery.toLowerCase());\n\t}\n\n\tsplitOptions = memoizeOne(\n\t\t(\n\t\t\toptions: DropdownItemProps[],\n\t\t\tsearchQuery?: SelectProps['searchQuery'],\n\t\t\tvalue?: SelectProps['value'],\n\t\t\tmultiple?: boolean\n\t\t) => {\n\t\t\tconst available: DropdownItemProps[] = [];\n\t\t\tconst selected: DropdownItemProps[] = [];\n\t\t\tconst excluded: DropdownItemProps[] = [];\n\n\t\t\tfor (const option of options) {\n\t\t\t\tif (multiple) {\n\t\t\t\t\tif (Array.isArray(value) && value.includes(option.value)) {\n\t\t\t\t\t\tselected.push(option);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\t!searchQuery ||\n\t\t\t\t\tthis.isOptionSuitable(option, searchQuery)\n\t\t\t\t) {\n\t\t\t\t\tavailable.push(option);\n\t\t\t\t} else {\n\t\t\t\t\texcluded.push(option);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tavailable,\n\t\t\t\tselected,\n\t\t\t\texcluded,\n\t\t\t} as Record<\n\t\t\t\t'available' | 'selected' | 'excluded',\n\t\t\t\tDropdownItemProps[]\n\t\t\t>;\n\t\t}\n\t);\n\n\tgroupOptions = (options: DropdownItemProps[]) => {\n\t\tconst groups = options.reduce((result, current) => {\n\t\t\tconst group: string = current.group || ('' as string);\n\n\t\t\tif (!result[group]) {\n\t\t\t\tresult[group] = [];\n\t\t\t}\n\n\t\t\tresult[group].push(current);\n\n\t\t\treturn result;\n\t\t}, {} as Record<string, DropdownItemProps[]>);\n\n\t\treturn [].concat(\n\t\t\t// building flat list of options\n\t\t\t...Object.keys(groups)\n\t\t\t\t.sort()\n\t\t\t\t.map(\n\t\t\t\t\t// sorting groups and converting them to the collection\n\t\t\t\t\t(group) =>\n\t\t\t\t\t\tgroups[group].map((option, index) => ({\n\t\t\t\t\t\t\t...option,\n\t\t\t\t\t\t\tindex,\n\t\t\t\t\t\t\tclassName: classnames(\n\t\t\t\t\t\t\t\toption.className,\n\t\t\t\t\t\t\t\tindex === 0 && 'with-group'\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tcontent: (\n\t\t\t\t\t\t\t\t<GroupedSelectItem index={index} {...option} />\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t}))\n\t\t\t\t)\n\t\t) as GroupedSelectItemProps[];\n\t};\n\n\trender() {\n\t\tconst {\n\t\t\tclassName,\n\t\t\tgrouped,\n\t\t\tlarge,\n\t\t\tonChange,\n\t\t\tonClose,\n\t\t\tonSearchChange,\n\t\t\toptions,\n\t\t\tsize,\n\t\t\tsmall,\n\t\t\tvalue,\n\t\t\t...props\n\t\t} = this.props;\n\n\t\tlet realSize = size;\n\n\t\tif (small) realSize = 'small';\n\t\tif (large) realSize = 'large';\n\n\t\tconst SelectClasses = classnames('Select', className, {\n\t\t\t'Select--small': realSize === 'small',\n\t\t\t'Select--large': realSize === 'large',\n\t\t\t'Select--grouped': grouped,\n\t\t});\n\n\t\tconst realValue =\n\t\t\tvalue === undefined ? (this.props.multiple ? [] : '') : value;\n\n\t\treturn (\n\t\t\t<Dropdown\n\t\t\t\t{...props}\n\t\t\t\tselectOnBlur={false}\n\t\t\t\toptions={this.options}\n\t\t\t\tvalue={realValue}\n\t\t\t\tonChange={this.handleChange}\n\t\t\t\tonSearchChange={this.handleSearchChange}\n\t\t\t\tonClose={this.handleClose}\n\t\t\t\tclassName={SelectClasses}\n\t\t\t/>\n\t\t);\n\t}\n}\n"]}
@@ -51,6 +51,9 @@
51
51
  .OptionList__option .Checkbox__box {
52
52
  top: 0;
53
53
  }
54
+ .OptionList__option.OptionList__option--collapsible .Checkbox__label::after {
55
+ inset: -8px -16px -8px 0;
56
+ }
54
57
 
55
58
  .OptionList__header {
56
59
  line-height: normal;
@@ -1 +1 @@
1
- {"version":3,"sourceRoot":"","sources":["../../../src/utilities/_visually-hidden.scss","../../../src/components/OptionList/OptionList.scss","../../../src/utilities/_component-reset.scss","../../../node_modules/@servicetitan/tokens/core/tokens.scss","../../../src/components/TimePicker/TimePicker.scss"],"names":[],"mappings":"AAAA;ACSC;EACC;EACA;EACA;EACA;EACA;EACA;EACA,kBAXwB;;;AAe1B;ACjBC;EACA;AAEA;EACA;;;ADiBD;AAEC;EACC;;;AAIF;AACA;EACC,eE8FW;EF7FX,eEbiB;EFcjB;EACA;EACA;AAuBA;;AAhBA;EACC,WE4FY;EF3FZ,aE8DoB;EF7DpB;;AAGA;EACC;EACA;EACA;EACA;;AAIF;EAAc;;AAGd;EACC;EACA;;AAED;EAAiB;;;AAGlB;EACC;EACA,gBEwDW;EFvDX,cEwDW;;;AFpDX;EAKC,kBA5EyB;;AAwEzB;EACC,OAvEkB;;AA8ElB;EAAY,kBAhFY;;;AAqF3B;AACA;EAAsC,cEqC1B;;;AFjCV;EACC;;;AADD;EACC;;;AADD;EACC;;;AADD;EACC;;;AADD;EACC;;;AADD;EACC;;;AADD;EACC;;;AAKH;AACA;EACC;EACA;EACA;EACA,cE6Bc;;;AF1Bf;AACA;EACC;EACA;EACA;;;AAGD;AAEC;EAAwB;;AACxB;EAAiB;;;AAGlB;AACA;EACC;EACA;EACA;EACA;EACA,cEDW;;;AFIZ;AAAA;AAAA;AAAA;AAKC;AAAA;EAGC;;AAEA;AAAA;EACC;;AAIF;EAAwB;;;AAGzB;AAAA;AAAA;AAAA;AAKC;EAAwB;;;AG/IzB;AFPC;EACA;AAEA;EACA;EEMA;;AAEA;EACC;EACA;;;AAIF;EAAqB;;;AACrB;EAAgD;;;AAEhD;EACC;EACA;;AAEA;EAAoB;;;AAQrB;EAAuC,eD0F3B;;;ACrFV;EACC,kBArCkB;EAsClB,cApCe;;AAyChB;EACC,kBA3CgB;EA4ChB,cA1CY","file":"TimePicker.css"}
1
+ {"version":3,"sourceRoot":"","sources":["../../../src/utilities/_visually-hidden.scss","../../../src/components/OptionList/OptionList.scss","../../../src/utilities/_component-reset.scss","../../../node_modules/@servicetitan/tokens/core/tokens.scss","../../../src/components/TimePicker/TimePicker.scss"],"names":[],"mappings":"AAAA;ACSC;EACC;EACA;EACA;EACA;EACA;EACA;EACA,kBAXwB;;;AAe1B;ACjBC;EACA;AAEA;EACA;;;ADiBD;AAEC;EACC;;;AAIF;AACA;EACC,eE8FW;EF7FX,eEbiB;EFcjB;EACA;EACA;AAuBA;;AAhBA;EACC,WE4FY;EF3FZ,aE8DoB;EF7DpB;;AAGA;EACC;EACA;EACA;EACA;;AAIF;EAAc;;AAGd;EACC;EACA;;AAED;EAAiB;;AAIf;EACC;;;AAOJ;EACC;EACA,gBE+CW;EF9CX,cE+CW;;;AF3CX;EAKC,kBArFyB;;AAiFzB;EACC,OAhFkB;;AAuFlB;EAAY,kBAzFY;;;AA8F3B;AACA;EAAsC,cE4B1B;;;AFxBV;EACC;;;AADD;EACC;;;AADD;EACC;;;AADD;EACC;;;AADD;EACC;;;AADD;EACC;;;AADD;EACC;;;AAKH;AACA;EACC;EACA;EACA;EACA,cEoBc;;;AFjBf;AACA;EACC;EACA;EACA;;;AAGD;AAEC;EAAwB;;AACxB;EAAiB;;;AAGlB;AACA;EACC;EACA;EACA;EACA;EACA,cEVW;;;AFaZ;AAAA;AAAA;AAAA;AAKC;AAAA;EAGC;;AAEA;AAAA;EACC;;AAIF;EAAwB;;;AAGzB;AAAA;AAAA;AAAA;AAKC;EAAwB;;;AGxJzB;AFPC;EACA;AAEA;EACA;EEMA;;AAEA;EACC;EACA;;;AAIF;EAAqB;;;AACrB;EAAgD;;;AAEhD;EACC;EACA;;AAEA;EAAoB;;;AAQrB;EAAuC,eD0F3B;;;ACrFV;EACC,kBArCkB;EAsClB,cApCe;;AAyChB;EACC,kBA3CgB;EA4ChB,cA1CY","file":"TimePicker.css"}
@@ -51,6 +51,9 @@
51
51
  .OptionList__option .Checkbox__box {
52
52
  top: 0;
53
53
  }
54
+ .OptionList__option.OptionList__option--collapsible .Checkbox__label::after {
55
+ inset: -8px -16px -8px 0;
56
+ }
54
57
 
55
58
  .OptionList__header {
56
59
  line-height: normal;
@@ -1 +1 @@
1
- {"version":3,"sourceRoot":"","sources":["../../../src/utilities/_visually-hidden.scss","../../../src/components/OptionList/OptionList.scss","../../../src/utilities/_component-reset.scss","../../../node_modules/@servicetitan/tokens/core/tokens.scss","../../../src/components/TimePicker/TimePicker.scss"],"names":[],"mappings":"AAAA;ACSC;EACC;EACA;EACA;EACA;EACA;EACA;EACA,kBAXwB;;;AAe1B;ACjBC;EACA;AAEA;EACA;;;ADiBD;AAEC;EACC;;;AAIF;AACA;EACC,eE8FW;EF7FX,eEbiB;EFcjB;EACA;EACA;AAuBA;;AAhBA;EACC,WE4FY;EF3FZ,aE8DoB;EF7DpB;;AAGA;EACC;EACA;EACA;EACA;;AAIF;EAAc;;AAGd;EACC;EACA;;AAED;EAAiB;;;AAGlB;EACC;EACA,gBEwDW;EFvDX,cEwDW;;;AFpDX;EAKC,kBA5EyB;;AAwEzB;EACC,OAvEkB;;AA8ElB;EAAY,kBAhFY;;;AAqF3B;AACA;EAAsC,cEqC1B;;;AFjCV;EACC;;;AADD;EACC;;;AADD;EACC;;;AADD;EACC;;;AADD;EACC;;;AADD;EACC;;;AADD;EACC;;;AAKH;AACA;EACC;EACA;EACA;EACA,cE6Bc;;;AF1Bf;AACA;EACC;EACA;EACA;;;AAGD;AAEC;EAAwB;;AACxB;EAAiB;;;AAGlB;AACA;EACC;EACA;EACA;EACA;EACA,cEDW;;;AFIZ;AAAA;AAAA;AAAA;AAKC;AAAA;EAGC;;AAEA;AAAA;EACC;;AAIF;EAAwB;;;AAGzB;AAAA;AAAA;AAAA;AAKC;EAAwB;;;AG/IzB;AFPC;EACA;AAEA;EACA;EEMA;;AAEA;EACC;EACA;;;AAIF;EAAqB;;;AACrB;EAAgD;;;AAEhD;EACC;EACA;;AAEA;EAAoB;;;AAQrB;EAAuC,eD0F3B;;;ACrFV;EACC,kBArCkB;EAsClB,cApCe;;AAyChB;EACC,kBA3CgB;EA4ChB,cA1CY","file":"index.css"}
1
+ {"version":3,"sourceRoot":"","sources":["../../../src/utilities/_visually-hidden.scss","../../../src/components/OptionList/OptionList.scss","../../../src/utilities/_component-reset.scss","../../../node_modules/@servicetitan/tokens/core/tokens.scss","../../../src/components/TimePicker/TimePicker.scss"],"names":[],"mappings":"AAAA;ACSC;EACC;EACA;EACA;EACA;EACA;EACA;EACA,kBAXwB;;;AAe1B;ACjBC;EACA;AAEA;EACA;;;ADiBD;AAEC;EACC;;;AAIF;AACA;EACC,eE8FW;EF7FX,eEbiB;EFcjB;EACA;EACA;AAuBA;;AAhBA;EACC,WE4FY;EF3FZ,aE8DoB;EF7DpB;;AAGA;EACC;EACA;EACA;EACA;;AAIF;EAAc;;AAGd;EACC;EACA;;AAED;EAAiB;;AAIf;EACC;;;AAOJ;EACC;EACA,gBE+CW;EF9CX,cE+CW;;;AF3CX;EAKC,kBArFyB;;AAiFzB;EACC,OAhFkB;;AAuFlB;EAAY,kBAzFY;;;AA8F3B;AACA;EAAsC,cE4B1B;;;AFxBV;EACC;;;AADD;EACC;;;AADD;EACC;;;AADD;EACC;;;AADD;EACC;;;AADD;EACC;;;AADD;EACC;;;AAKH;AACA;EACC;EACA;EACA;EACA,cEoBc;;;AFjBf;AACA;EACC;EACA;EACA;;;AAGD;AAEC;EAAwB;;AACxB;EAAiB;;;AAGlB;AACA;EACC;EACA;EACA;EACA;EACA,cEVW;;;AFaZ;AAAA;AAAA;AAAA;AAKC;AAAA;EAGC;;AAEA;AAAA;EACC;;AAIF;EAAwB;;;AAGzB;AAAA;AAAA;AAAA;AAKC;EAAwB;;;AGxJzB;AFPC;EACA;AAEA;EACA;EEMA;;AAEA;EACC;EACA;;;AAIF;EAAqB;;;AACrB;EAAgD;;;AAEhD;EACC;EACA;;AAEA;EAAoB;;;AAQrB;EAAuC,eD0F3B;;;ACrFV;EACC,kBArCkB;EAsClB,cApCe;;AAyChB;EACC,kBA3CgB;EA4ChB,cA1CY","file":"index.css"}
@@ -53,6 +53,15 @@ describe('TimePickerUtils', () => {
53
53
  [minT, maxT] = ['12:00 AM', '12:00 PM'];
54
54
  expect(consumeMinMax(minT, maxT).min).toEqual('00:00');
55
55
  expect(consumeMinMax(minT, maxT).max).toEqual('12:00');
56
+ /*
57
+ * String bounds are clock times. A tenant zone does not shift them.
58
+ */
59
+ expect(consumeMinMax('01:00', '02:00', 'Asia/Tokyo')).toEqual({
60
+ min: '01:00',
61
+ max: '02:00',
62
+ });
63
+ // Empty timezone stays on the system zone, so same-day Date bounds keep their clock times.
64
+ expect(consumeMinMax(new Date(2023, 0, 1, 9, 0), new Date(2023, 0, 1, 17, 0), '')).toEqual({ min: '09:00', max: '17:00' });
56
65
  // undefined, null, wrong entry
57
66
  [minT, maxT] = [undefined, undefined];
58
67
  expect(consumeMinMax(minT, maxT).min).toEqual('00:00');
@@ -301,4 +310,68 @@ describe('timezone utils', () => {
301
310
  expect(date.toISOString()).toBe('2022-12-31T15:00:00.000Z'); // 15:00 UTC = 00:00 seoul
302
311
  });
303
312
  });
313
+ const OriginalDateTimeFormat = Intl.DateTimeFormat;
314
+ const mockMissingBrowserTimeZone = () => {
315
+ jest.spyOn(Intl, 'DateTimeFormat').mockImplementation(((locales, options) => {
316
+ const formatter = new OriginalDateTimeFormat(locales, options);
317
+ if (!(options === null || options === void 0 ? void 0 : options.timeZone)) {
318
+ const resolved = formatter.resolvedOptions.bind(formatter);
319
+ formatter.resolvedOptions =
320
+ () => (Object.assign(Object.assign({}, resolved()), { timeZone: undefined }));
321
+ }
322
+ return formatter;
323
+ }));
324
+ };
325
+ describe('when resolvedOptions().timeZone is undefined', () => {
326
+ beforeEach(() => {
327
+ mockMissingBrowserTimeZone();
328
+ jest.spyOn(console, 'warn').mockImplementation(() => undefined);
329
+ });
330
+ afterEach(() => {
331
+ jest.restoreAllMocks();
332
+ });
333
+ const loadTimezoneUtils = () => {
334
+ let utils;
335
+ jest.isolateModules(() => {
336
+ utils = require('./timezoneUtils');
337
+ });
338
+ return utils;
339
+ };
340
+ it('normalizes the browser zone to undefined and formats in the system zone', () => {
341
+ const { dateToTime, localTimezone, timeToDate } = loadTimezoneUtils();
342
+ const localMidnight = new Date(2023, 0, 1, 0, 0);
343
+ expect(localTimezone).toBeUndefined();
344
+ expect(() => dateToTime(localMidnight)).not.toThrow();
345
+ expect(dateToTime(localMidnight, undefined, 'hh:mm')).toBe('00:00');
346
+ const date = timeToDate('10:30', undefined);
347
+ expect(date.getHours()).toBe(10);
348
+ expect(date.getMinutes()).toBe(30);
349
+ expect(dateToTime(date, undefined)).toBe('10:30 AM');
350
+ });
351
+ it('still converts a valid tenant timezone', () => {
352
+ const { dateToTime, timeToDate } = loadTimezoneUtils();
353
+ const utc0 = new Date('2023-01-01T00:00:00Z');
354
+ expect(dateToTime(utc0, tz.la, 'hh:mm')).toBe('16:00');
355
+ const date = timeToDate('01:23 AM', tz.la, utc0);
356
+ expect(dateToTime(date, tz.la, 'hh:mm')).toBe('01:23');
357
+ expect(date.toISOString()).toBe('2022-12-31T09:23:00.000Z');
358
+ });
359
+ it('keeps string min and max as clock times', () => {
360
+ const { consumeMinMax } = loadTimezoneUtils();
361
+ expect(consumeMinMax('01:00', '02:00', 'Asia/Tokyo')).toEqual({
362
+ min: '01:00',
363
+ max: '02:00',
364
+ });
365
+ expect(consumeMinMax('08:00', undefined, undefined)).toEqual({
366
+ min: '08:00',
367
+ max: '23:59',
368
+ });
369
+ });
370
+ it('does not throw when the timezone name is invalid', () => {
371
+ const { dateToTime, timeToDate } = loadTimezoneUtils();
372
+ const utc0 = new Date('2023-01-01T00:00:00Z');
373
+ expect(dateToTime(utc0, 'Not/AZone')).toBeUndefined();
374
+ expect(timeToDate('10:30', 'Not/AZone')).toBeUndefined();
375
+ });
376
+ });
304
377
  //# sourceMappingURL=TimePickerUtils.test.js.map