@innovaccer/design-system 2.13.2 → 2.13.4-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 (243) hide show
  1. package/core/components/atoms/checkbox/__stories__/Alignment.story.jsx +11 -13
  2. package/core/components/atoms/dropdown/Dropdown.tsx +18 -2
  3. package/core/components/atoms/dropdown/DropdownList.tsx +47 -57
  4. package/core/components/atoms/dropdown/__stories__/LabelInline.story.jsx +58 -0
  5. package/core/components/atoms/dropdown/__stories__/{LabelPositionInDropdown.story.jsx → LabelOnTop.story.jsx} +8 -9
  6. package/core/components/atoms/dropdown/option/DefaultOption.tsx +1 -1
  7. package/core/components/atoms/dropdown/utility.tsx +6 -0
  8. package/core/components/atoms/icon/__stories__/variants/Image.story.jsx +3 -3
  9. package/core/components/css-utilities/Miscellaneous/Miscellaneous.story.tsx +4 -0
  10. package/core/components/molecules/dropzone/FileSelectorUtils.tsx +3 -0
  11. package/core/components/molecules/sidesheet/__stories__/variants/twoSteps.story.jsx +6 -4
  12. package/core/components/organisms/calendar/__stories__/index.story.jsx +4 -6
  13. package/core/components/organisms/dateRangePicker/__stories__/variants/withSingleInput.story.jsx +3 -0
  14. package/core/components/organisms/horizontalNav/__stories__/leftAlign.story.jsx +35 -19
  15. package/core/components/organisms/pageHeader/__stories__/Responsiveness.story.jsx +2 -2
  16. package/core/components/organisms/pageHeader/__stories__/variants/withNavigation.story.jsx +2 -2
  17. package/core/components/organisms/pageHeader/__stories__/variants/withNavigationL1.story.jsx +2 -2
  18. package/core/components/organisms/pageHeader/__stories__/variants/withStepper.story.jsx +2 -2
  19. package/core/components/organisms/pageHeader/__stories__/variants/withStepperL1.story.jsx +2 -2
  20. package/core/components/organisms/pageHeader/__stories__/variants/withTabs.story.jsx +2 -2
  21. package/core/components/organisms/pageHeader/__stories__/variants/withTabsL1.story.jsx +2 -2
  22. package/core/components/organisms/pageHeader/__stories__/withFilter.story.jsx +2 -2
  23. package/core/components/organisms/pageHeader/__stories__/withFilterL1.story.jsx +2 -2
  24. package/core/components/organisms/pageHeader/__stories__/withNavigation.story.jsx +2 -2
  25. package/core/components/organisms/pageHeader/__stories__/withNavigationL1.story.jsx +2 -2
  26. package/core/components/organisms/pageHeader/__stories__/withStepperL1.story.jsx +4 -4
  27. package/core/components/organisms/table/__stories__/TableAsDescriptionList.story.jsx +4 -4
  28. package/core/components/organisms/timePicker/TimePicker.tsx +6 -113
  29. package/core/components/organisms/timePicker/TimePickerWithInput.tsx +124 -0
  30. package/core/components/organisms/timePicker/TimePickerWithSearch.tsx +198 -0
  31. package/core/components/organisms/timePicker/__stories__/TimeIntervals.story.jsx +52 -0
  32. package/core/components/organisms/timePicker/__stories__/disabledOption.story.jsx +52 -0
  33. package/core/components/organisms/timePicker/__stories__/fromTo.story.jsx +72 -0
  34. package/core/components/organisms/timePicker/__stories__/showDuration.story.jsx +52 -0
  35. package/core/components/organisms/timePicker/__stories__/withDatePicker.story.jsx +88 -0
  36. package/core/components/organisms/timePicker/__stories__/{index.story.jsx → withInput.story.jsx} +6 -3
  37. package/core/components/organisms/timePicker/__stories__/withSearch.story.jsx +89 -0
  38. package/core/components/organisms/timePicker/__tests__/TimePickerWithSearch.test.tsx +486 -0
  39. package/core/components/organisms/timePicker/__tests__/__snapshots__/TimePickerWithSearch.test.tsx.snap +169 -0
  40. package/core/components/organisms/timePicker/index.tsx +2 -0
  41. package/core/components/organisms/timePicker/utility/searchUtils.tsx +295 -0
  42. package/core/components/organisms/timePicker/utility/timePickerUtility.tsx +219 -0
  43. package/core/components/organisms/timePicker/utils.tsx +1 -1
  44. package/core/index.tsx +1 -0
  45. package/css/dist/index.css +4 -10
  46. package/css/dist/index.css.map +1 -1
  47. package/css/src/components/dropdown.css +2 -6
  48. package/css/src/components/metricInput.css +1 -0
  49. package/css/src/components/modal.css +1 -2
  50. package/dist/core/components/atoms/dropdown/Dropdown.d.ts +2 -0
  51. package/dist/core/components/atoms/dropdown/DropdownList.d.ts +1 -0
  52. package/dist/core/components/atoms/dropdown/utility.d.ts +1 -0
  53. package/dist/core/components/atoms/popperWrapper/PopperWrapper.d.ts +22 -22
  54. package/dist/core/components/organisms/timePicker/TimePicker.d.ts +5 -13
  55. package/dist/core/components/organisms/timePicker/TimePickerWithInput.d.ts +24 -0
  56. package/dist/core/components/organisms/timePicker/TimePickerWithSearch.d.ts +32 -0
  57. package/dist/core/components/organisms/timePicker/index.d.ts +2 -0
  58. package/dist/core/components/organisms/timePicker/utility/searchUtils.d.ts +7 -0
  59. package/dist/core/components/organisms/timePicker/utility/timePickerUtility.d.ts +19 -0
  60. package/dist/core/index.d.ts +1 -0
  61. package/dist/index.esm.js +709 -46
  62. package/dist/index.js +638 -68
  63. package/dist/index.js.map +1 -1
  64. package/dist/index.umd.js +1 -1
  65. package/dist/index.umd.js.br +0 -0
  66. package/dist/index.umd.js.gz +0 -0
  67. package/docs/.eslintrc.json +32 -1
  68. package/docs/.prettierrc +6 -0
  69. package/docs/README.md +14 -0
  70. package/docs/cypress/e2e/main.cy.js +35 -0
  71. package/docs/cypress/fixtures/example.json +5 -0
  72. package/docs/cypress/support/commands.ts +37 -0
  73. package/docs/cypress/support/e2e.ts +20 -0
  74. package/docs/cypress.config.js +9 -0
  75. package/docs/package.json +16 -2
  76. package/docs/src/components/Colors/Colors.js +13 -41
  77. package/docs/src/components/Container/ComponentsContainer.js +10 -30
  78. package/docs/src/components/Container/Container.js +10 -41
  79. package/docs/src/components/ErrorBoundary.js +9 -3
  80. package/docs/src/components/Footer/Footer.js +11 -10
  81. package/docs/src/components/GlobalSearch/index.js +47 -44
  82. package/docs/src/components/Header/Header.css +4 -0
  83. package/docs/src/components/Header/Header.js +25 -19
  84. package/docs/src/components/Layout.js +110 -172
  85. package/docs/src/components/LeftNav/LeftNav.js +12 -28
  86. package/docs/src/components/Logos/Logos.js +12 -26
  87. package/docs/src/components/MDXHeading.js +12 -18
  88. package/docs/src/components/Meta.js +9 -9
  89. package/docs/src/components/PropsTable/ArgJsDoc.tsx +2 -6
  90. package/docs/src/components/PropsTable/ArgRow.tsx +19 -47
  91. package/docs/src/components/PropsTable/ArgValue.tsx +50 -93
  92. package/docs/src/components/PropsTable/EmptyBlock.tsx +2 -5
  93. package/docs/src/components/PropsTable/SectionRow.tsx +7 -18
  94. package/docs/src/components/PropsTable/Table.tsx +43 -130
  95. package/docs/src/components/PropsTable/generateImports.tsx +1 -3
  96. package/docs/src/components/PropsTable/index.js +94 -140
  97. package/docs/src/components/PropsTable/prism.css +19 -20
  98. package/docs/src/components/Rules/DONTs.js +1 -6
  99. package/docs/src/components/Rules/DOs.js +1 -6
  100. package/docs/src/components/Rules/IconWrapper.js +6 -7
  101. package/docs/src/components/Rules/InlineMessage.js +1 -5
  102. package/docs/src/components/Rules/Rules.js +18 -28
  103. package/docs/src/components/TableOfContent/TableOfContent.js +49 -54
  104. package/docs/src/components/css/global.css +1 -1
  105. package/docs/src/components/css/prism.css +1 -1
  106. package/docs/src/components/css/style.css +7 -3
  107. package/docs/src/components/templates/Default.js +1 -1
  108. package/docs/src/components/templates/Homepage.js +4 -6
  109. package/docs/src/data/components/Overview.js +49 -56
  110. package/docs/src/data/components/images/Calendar.png +0 -0
  111. package/docs/src/data/components/images/MetaList.png +0 -0
  112. package/docs/src/data/components/images/PageHeader.png +0 -0
  113. package/docs/src/data/components/images/TimePicker.png +0 -0
  114. package/docs/src/data/components/images/mobile/Badge.png +0 -0
  115. package/docs/src/data/components/images/mobile/Dropdown.png +0 -0
  116. package/docs/src/data/components/images/mobile/Message.png +0 -0
  117. package/docs/src/data/components/images/mobile/MetaList.png +0 -0
  118. package/docs/src/data/components/images/mobile/Slider.png +0 -0
  119. package/docs/src/data/components/images/mobile/StatusHint.png +0 -0
  120. package/docs/src/data/components/images/mobile/Stepper.png +0 -0
  121. package/docs/src/data/components/index.js +168 -321
  122. package/docs/src/data/components/mobile.js +85 -125
  123. package/docs/src/data/components/overview.css +4 -2
  124. package/docs/src/data/components/patterns.js +25 -59
  125. package/docs/src/data/header-items.yaml +1 -0
  126. package/docs/src/data/nav/components.yaml +1 -7
  127. package/docs/src/pages/404.js +7 -17
  128. package/docs/src/pages/components/avatar/usage.mdx +1 -0
  129. package/docs/src/pages/components/button/usage.mdx +2 -2
  130. package/docs/src/pages/components/calendar/usage.mdx +3 -3
  131. package/docs/src/pages/components/chips/images/actionchip-state.png +0 -0
  132. package/docs/src/pages/components/chips/images/inputchips-state.png +0 -0
  133. package/docs/src/pages/components/chips/images/selectionchip-state.png +0 -0
  134. package/docs/src/pages/components/chips/usage.mdx +24 -2
  135. package/docs/src/pages/components/datePicker/images/datePicker-3.png +0 -0
  136. package/docs/src/pages/components/datePicker/images/datePicker-6.png +0 -0
  137. package/docs/src/pages/components/datePicker/usage.mdx +9 -2
  138. package/docs/src/pages/components/inlineEditableFields/images/inlineEditableField-2.png +0 -0
  139. package/docs/src/pages/components/inlineEditableFields/images/inlineEditableField-3.png +0 -0
  140. package/docs/src/pages/components/inlineEditableFields/images/inlineEditableFields-1.png +0 -0
  141. package/docs/src/pages/components/inlineEditableFields/images/inlineEditableFields-4.png +0 -0
  142. package/docs/src/pages/components/inlineEditableFields/usage.mdx +4 -4
  143. package/docs/src/pages/components/inputs/usage.mdx +7 -7
  144. package/docs/src/pages/components/tabs/images/tabs-1.png +0 -0
  145. package/docs/src/pages/content/button-guidelines/tabs/button-glossary.mdx +1776 -1
  146. package/docs/src/pages/content/button-guidelines/tabs/confusing-buttons.mdx +479 -8
  147. package/docs/src/pages/content/email-guidelines.mdx +3 -3
  148. package/docs/src/pages/content/house-rules/tabs/date,-time-&-numbers.mdx +24 -0
  149. package/docs/src/pages/content/house-rules/tabs/grammer.mdx +42 -2
  150. package/docs/src/pages/content/house-rules/tabs/punctuations.mdx +32 -0
  151. package/docs/src/pages/foundations/colors.mdx +338 -24
  152. package/docs/src/pages/foundations/layout/index.mdx +57 -82
  153. package/docs/src/pages/foundations/response-time.mdx +32 -77
  154. package/docs/src/pages/index.js +92 -121
  155. package/docs/src/pages/mobile/components/badges/images/badge-1.png +0 -0
  156. package/docs/src/pages/mobile/components/badges/images/badge-2.png +0 -0
  157. package/docs/src/pages/mobile/components/badges/images/badge-3.png +0 -0
  158. package/docs/src/pages/mobile/components/badges/images/badge-4.png +0 -0
  159. package/docs/src/pages/mobile/components/badges/images/badge-5.png +0 -0
  160. package/docs/src/pages/mobile/components/badges/usage.mdx +100 -0
  161. package/docs/src/pages/mobile/components/card/images/mcard-1.png +0 -0
  162. package/docs/src/pages/mobile/components/card/images/mcard-2.png +0 -0
  163. package/docs/src/pages/mobile/components/card/images/mcard-3.png +0 -0
  164. package/docs/src/pages/mobile/components/card/images/mcard-4.png +0 -0
  165. package/docs/src/pages/mobile/components/card/images/mcard-5.png +0 -0
  166. package/docs/src/pages/mobile/components/card/images/mcard-6.png +0 -0
  167. package/docs/src/pages/mobile/components/card/usage.mdx +54 -67
  168. package/docs/src/pages/mobile/components/checkbox/images/checkbox-1.png +0 -0
  169. package/docs/src/pages/mobile/components/checkbox/usage.mdx +26 -2
  170. package/docs/src/pages/mobile/components/dropdowns/images/dropdown-1.png +0 -0
  171. package/docs/src/pages/mobile/components/dropdowns/images/dropdown-10.png +0 -0
  172. package/docs/src/pages/mobile/components/dropdowns/images/dropdown-11.png +0 -0
  173. package/docs/src/pages/mobile/components/dropdowns/images/dropdown-2.png +0 -0
  174. package/docs/src/pages/mobile/components/dropdowns/images/dropdown-3.png +0 -0
  175. package/docs/src/pages/mobile/components/dropdowns/images/dropdown-4.png +0 -0
  176. package/docs/src/pages/mobile/components/dropdowns/images/dropdown-5.png +0 -0
  177. package/docs/src/pages/mobile/components/dropdowns/images/dropdown-6.png +0 -0
  178. package/docs/src/pages/mobile/components/dropdowns/images/dropdown-7.png +0 -0
  179. package/docs/src/pages/mobile/components/dropdowns/images/dropdown-8.png +0 -0
  180. package/docs/src/pages/mobile/components/dropdowns/images/dropdown-9.png +0 -0
  181. package/docs/src/pages/mobile/components/dropdowns/usage.mdx +88 -0
  182. package/docs/src/pages/mobile/components/message/images/messages-1.png +0 -0
  183. package/docs/src/pages/mobile/components/message/images/messages-10.png +0 -0
  184. package/docs/src/pages/mobile/components/message/images/messages-11.png +0 -0
  185. package/docs/src/pages/mobile/components/message/images/messages-12.png +0 -0
  186. package/docs/src/pages/mobile/components/message/images/messages-2.png +0 -0
  187. package/docs/src/pages/mobile/components/message/images/messages-3.png +0 -0
  188. package/docs/src/pages/mobile/components/message/images/messages-4.png +0 -0
  189. package/docs/src/pages/mobile/components/message/images/messages-5.png +0 -0
  190. package/docs/src/pages/mobile/components/message/images/messages-6.png +0 -0
  191. package/docs/src/pages/mobile/components/message/images/messages-7.png +0 -0
  192. package/docs/src/pages/mobile/components/message/images/messages-8.png +0 -0
  193. package/docs/src/pages/mobile/components/message/images/messages-9.png +0 -0
  194. package/docs/src/pages/mobile/components/message/usage.mdx +170 -0
  195. package/docs/src/pages/mobile/components/metaList/images/metaList-1.png +0 -0
  196. package/docs/src/pages/mobile/components/metaList/images/metaList-2.png +0 -0
  197. package/docs/src/pages/mobile/components/metaList/images/metaList-3.png +0 -0
  198. package/docs/src/pages/mobile/components/metaList/images/metaList-4.png +0 -0
  199. package/docs/src/pages/mobile/components/metaList/usage.mdx +71 -0
  200. package/docs/src/pages/mobile/components/slider/images/slider-1.png +0 -0
  201. package/docs/src/pages/mobile/components/slider/images/slider-2.png +0 -0
  202. package/docs/src/pages/mobile/components/slider/images/slider-3.png +0 -0
  203. package/docs/src/pages/mobile/components/slider/images/slider-4.png +0 -0
  204. package/docs/src/pages/mobile/components/slider/images/slider-5.png +0 -0
  205. package/docs/src/pages/mobile/components/slider/usage.mdx +83 -0
  206. package/docs/src/pages/mobile/components/statusHint/images/statushint-1.png +0 -0
  207. package/docs/src/pages/mobile/components/statusHint/images/statushint-2.png +0 -0
  208. package/docs/src/pages/mobile/components/statusHint/images/statushint-3.png +0 -0
  209. package/docs/src/pages/mobile/components/statusHint/images/statushint-4.png +0 -0
  210. package/docs/src/pages/mobile/components/statusHint/images/statushint-5.png +0 -0
  211. package/docs/src/pages/mobile/components/statusHint/images/statushint-6.png +0 -0
  212. package/docs/src/pages/mobile/components/statusHint/images/statushint-7.png +0 -0
  213. package/docs/src/pages/mobile/components/statusHint/usage.mdx +108 -0
  214. package/docs/src/pages/mobile/components/steppers/images/stepper-1.png +0 -0
  215. package/docs/src/pages/mobile/components/steppers/images/stepper-2.png +0 -0
  216. package/docs/src/pages/mobile/components/steppers/images/stepper-3.png +0 -0
  217. package/docs/src/pages/mobile/components/steppers/images/stepper-4.png +0 -0
  218. package/docs/src/pages/mobile/components/steppers/images/stepper-5.png +0 -0
  219. package/docs/src/pages/mobile/components/steppers/images/stepper-6.png +0 -0
  220. package/docs/src/pages/mobile/components/steppers/usage.mdx +111 -0
  221. package/docs/src/pages/mobile/foundations/layout/images/layout-2.png +0 -0
  222. package/docs/src/pages/mobile/foundations/layout/index.mdx +3 -1
  223. package/docs/src/pages/mobile/foundations/page-types/index.mdx +0 -214
  224. package/docs/src/pages/mobile/foundations/spacing/index.mdx +5 -0
  225. package/docs/src/pages/mobile/foundations/typography.mdx +1 -1
  226. package/docs/src/pages/patterns/uiStates/usage.mdx +92 -0
  227. package/docs/src/util/Frontmatter.js +4 -4
  228. package/docs/src/util/HeaderItems.js +2 -1
  229. package/docs/src/util/Helpers.js +3 -3
  230. package/docs/src/util/HomeIcons.js +91 -53
  231. package/docs/src/util/InPageNavItems.js +2 -6
  232. package/docs/src/util/Logos.js +2 -2
  233. package/docs/src/util/MdsChangelog.js +5 -10
  234. package/docs/src/util/MediumBlogs.js +13 -13
  235. package/docs/src/util/NavItems.js +14 -17
  236. package/docs/src/util/Search.js +2 -2
  237. package/docs/src/util/StorybookData.js +2 -4
  238. package/docs/src/util/constants.js +1 -5
  239. package/docs/src/util/context/NavContext.js +1 -4
  240. package/docs/src/util/hooks/useMetadata.js +1 -1
  241. package/package.json +1 -1
  242. package/docs/src/pages/components/inlineEditableFields/images/inlineEditableFields-2.png +0 -0
  243. package/docs/src/pages/components/inlineEditableFields/images/inlineEditableFields-3.png +0 -0
@@ -0,0 +1,486 @@
1
+ import * as React from 'react';
2
+ import { TimePicker } from '@/index';
3
+ import { render, fireEvent, waitFor } from '@testing-library/react';
4
+ import { testHelper, filterUndefined, valueHelper, testMessageHelper } from '@/utils/testHelper';
5
+ import { TimePickerProps as Props } from '@/index.type';
6
+ import { convert12To24HourFormat } from '../utility/timePickerUtility';
7
+
8
+ const optionID = 'DesignSystem-DropdownOption--DEFAULT';
9
+ const trigger = 'DesignSystem-DropdownTrigger';
10
+ const startTime = '05:00 AM';
11
+ const endTime = '11:00 PM';
12
+ const FunctionValue = jest.fn();
13
+ const booleanValue = [true, false];
14
+ const timeFormat = ['12-Hour', '24-Hour'];
15
+ const activeOptionClass = 'Option--active';
16
+
17
+ const fetchOption = () => {
18
+ return new Promise<any>((resolve) => {
19
+ window.setTimeout(() => {
20
+ resolve({
21
+ searchTerm: '',
22
+ options: [{ label: '10:00 AM', value: '10:00 AM' }],
23
+ count: 1,
24
+ });
25
+ }, 1000);
26
+ });
27
+ };
28
+
29
+ const testFunc = (props: Record<string, any>): void => {
30
+ const attr = filterUndefined(props) as Props;
31
+
32
+ it(testMessageHelper(attr), () => {
33
+ const { baseElement } = render(<TimePicker withSearch={true} {...attr} />);
34
+ expect(baseElement).toMatchSnapshot();
35
+ });
36
+ };
37
+
38
+ describe('TimePicker component snapshots', () => {
39
+ describe('renders snapshot for all props', () => {
40
+ const mapper: Record<string, any> = {
41
+ startTime: valueHelper(startTime, { required: true, iterate: false }),
42
+ endTime: valueHelper(endTime, { required: true, iterate: false }),
43
+ showDuration: valueHelper(booleanValue, { required: true, iterate: true }),
44
+ timeFormat: valueHelper(timeFormat, { required: true, iterate: true }),
45
+ };
46
+ testHelper(mapper, testFunc);
47
+ });
48
+ });
49
+
50
+ describe('TimePicker option list in 12 hour format', () => {
51
+ it('check list when no start time & end time is given', async () => {
52
+ const { getByTestId, getAllByTestId } = render(<TimePicker withSearch={true} />);
53
+ const dropdownTrigger = getByTestId(trigger);
54
+ fireEvent.click(dropdownTrigger);
55
+ await waitFor(() => {
56
+ const optionList = getAllByTestId(optionID);
57
+ const optionLen = optionList.length - 1;
58
+ expect(optionList[0]).toHaveTextContent('12:00 AM');
59
+ expect(optionList[optionLen]).toHaveTextContent('11:45 PM');
60
+ });
61
+ });
62
+
63
+ it('check list when only end time is given', async () => {
64
+ const { getByTestId, getAllByTestId } = render(<TimePicker withSearch={true} endTime={endTime} />);
65
+ const dropdownTrigger = getByTestId(trigger);
66
+ fireEvent.click(dropdownTrigger);
67
+ await waitFor(() => {
68
+ const optionList = getAllByTestId(optionID);
69
+ const optionLen = optionList.length - 1;
70
+ expect(optionList[0]).toHaveTextContent('12:00 AM');
71
+ expect(optionList[optionLen]).toHaveTextContent(endTime);
72
+ });
73
+ });
74
+
75
+ it('check list when only start time is given', async () => {
76
+ const { getByTestId, getAllByTestId } = render(<TimePicker withSearch={true} startTime={startTime} />);
77
+ const dropdownTrigger = getByTestId(trigger);
78
+ fireEvent.click(dropdownTrigger);
79
+ await waitFor(() => {
80
+ const optionList = getAllByTestId(optionID);
81
+ const optionLen = optionList.length - 1;
82
+ expect(optionList[0]).toHaveTextContent(startTime);
83
+ expect(optionList[optionLen]).toHaveTextContent('04:45 AM');
84
+ });
85
+ });
86
+
87
+ it('check list when both start & end time is given', async () => {
88
+ const { getByTestId, getAllByTestId } = render(
89
+ <TimePicker withSearch={true} endTime={endTime} startTime={startTime} />
90
+ );
91
+ const dropdownTrigger = getByTestId(trigger);
92
+ fireEvent.click(dropdownTrigger);
93
+ await waitFor(() => {
94
+ const optionList = getAllByTestId(optionID);
95
+ const optionLen = optionList.length - 1;
96
+ expect(optionList[0]).toHaveTextContent(startTime);
97
+ expect(optionList[optionLen]).toHaveTextContent(endTime);
98
+ });
99
+ });
100
+
101
+ it('check list when startTime is greater than endTime', async () => {
102
+ const { getByTestId, getAllByTestId } = render(
103
+ <TimePicker withSearch={true} startTime="10:15 PM" endTime="11:45 AM" />
104
+ );
105
+ const dropdownTrigger = getByTestId(trigger);
106
+ fireEvent.click(dropdownTrigger);
107
+ await waitFor(() => {
108
+ const optionList = getAllByTestId(optionID);
109
+ const optionLen = optionList.length - 1;
110
+ expect(optionList[0]).toHaveTextContent('10:15 PM');
111
+ expect(optionList[optionLen]).toHaveTextContent('11:45 AM');
112
+ });
113
+ });
114
+ });
115
+
116
+ describe('TimePicker option list in 24 hour format', () => {
117
+ it('check list when no start time & end time is given', async () => {
118
+ const { getByTestId, getAllByTestId } = render(<TimePicker timeFormat="24-Hour" withSearch={true} />);
119
+ const dropdownTrigger = getByTestId(trigger);
120
+ fireEvent.click(dropdownTrigger);
121
+ await waitFor(() => {
122
+ const optionList = getAllByTestId(optionID);
123
+ const optionLen = optionList.length - 1;
124
+ expect(optionList[0]).toHaveTextContent('00:00');
125
+ expect(optionList[optionLen]).toHaveTextContent('23:45');
126
+ });
127
+ });
128
+
129
+ it('check list when only end time is given', async () => {
130
+ const { getByTestId, getAllByTestId } = render(
131
+ <TimePicker timeFormat="24-Hour" withSearch={true} endTime="20:59" />
132
+ );
133
+ const dropdownTrigger = getByTestId(trigger);
134
+ fireEvent.click(dropdownTrigger);
135
+ await waitFor(() => {
136
+ const optionList = getAllByTestId(optionID);
137
+ const optionLen = optionList.length - 1;
138
+ expect(optionList[0]).toHaveTextContent('00:00');
139
+ expect(optionList[optionLen]).toHaveTextContent('20:45');
140
+ });
141
+ });
142
+
143
+ it('check list when only start time is given', async () => {
144
+ const { getByTestId, getAllByTestId } = render(
145
+ <TimePicker timeFormat="24-Hour" withSearch={true} startTime="10:00" />
146
+ );
147
+ const dropdownTrigger = getByTestId(trigger);
148
+ fireEvent.click(dropdownTrigger);
149
+ await waitFor(() => {
150
+ const optionList = getAllByTestId(optionID);
151
+ const optionLen = optionList.length - 1;
152
+ expect(optionList[0]).toHaveTextContent('10:00');
153
+ expect(optionList[optionLen]).toHaveTextContent('09:45');
154
+ });
155
+ });
156
+
157
+ it('check list when both start & end time is given', async () => {
158
+ const { getByTestId, getAllByTestId } = render(
159
+ <TimePicker timeFormat="24-Hour" withSearch={true} startTime="10:00" endTime="20:00" />
160
+ );
161
+ const dropdownTrigger = getByTestId(trigger);
162
+ fireEvent.click(dropdownTrigger);
163
+ await waitFor(() => {
164
+ const optionList = getAllByTestId(optionID);
165
+ const optionLen = optionList.length - 1;
166
+ expect(optionList[0]).toHaveTextContent('10:00');
167
+ expect(optionList[optionLen]).toHaveTextContent('20:00');
168
+ });
169
+ });
170
+
171
+ it('check list when startTime is greater than endTime', async () => {
172
+ const { getByTestId, getAllByTestId } = render(
173
+ <TimePicker timeFormat="24-Hour" withSearch={true} startTime="20:00" endTime="10:00" />
174
+ );
175
+ const dropdownTrigger = getByTestId(trigger);
176
+ fireEvent.click(dropdownTrigger);
177
+ await waitFor(() => {
178
+ const optionList = getAllByTestId(optionID);
179
+ const optionLen = optionList.length - 1;
180
+ expect(optionList[0]).toHaveTextContent('20:00');
181
+ expect(optionList[optionLen]).toHaveTextContent('10:00');
182
+ });
183
+ });
184
+ });
185
+
186
+ describe('TimePicker with disabled option list ', () => {
187
+ it('check disabled option list', async () => {
188
+ const { getByTestId, getAllByTestId } = render(
189
+ <TimePicker
190
+ startTime={startTime}
191
+ endTime={endTime}
192
+ withSearch={true}
193
+ disabledSlotList={['05:15 AM', '05:30 AM']}
194
+ />
195
+ );
196
+ const dropdownTrigger = getByTestId(trigger);
197
+ fireEvent.click(dropdownTrigger);
198
+ await waitFor(() => {
199
+ const optionList = getAllByTestId(optionID);
200
+ expect(optionList[1]).toHaveClass('Option--disabled');
201
+ expect(getAllByTestId('DesignSystem-Text')[2]).toHaveClass('Text--disabled');
202
+ });
203
+ });
204
+ });
205
+
206
+ describe('TimePicker with time duration label', () => {
207
+ it('check for time duration label in 12 hour format', async () => {
208
+ const { getByTestId, getAllByTestId } = render(
209
+ <TimePicker startTime={startTime} endTime={endTime} withSearch={true} showDuration={true} />
210
+ );
211
+ const dropdownTrigger = getByTestId(trigger);
212
+ fireEvent.click(dropdownTrigger);
213
+ await waitFor(() => {
214
+ const optionList = getAllByTestId(optionID);
215
+ expect(optionList[0]).toHaveTextContent('05:00 AM (0 hr 0 min)');
216
+ expect(optionList[1]).toHaveTextContent('05:15 AM (0 hr 15 min)');
217
+ expect(optionList[3]).toHaveTextContent('05:45 AM (0 hr 45 min)');
218
+ });
219
+ });
220
+
221
+ it('check for time duration label in 24 hour format', async () => {
222
+ const { getByTestId, getAllByTestId } = render(
223
+ <TimePicker timeFormat="24-Hour" startTime="05:00" endTime="20:00" withSearch={true} showDuration={true} />
224
+ );
225
+ const dropdownTrigger = getByTestId(trigger);
226
+ fireEvent.click(dropdownTrigger);
227
+ await waitFor(() => {
228
+ const optionList = getAllByTestId(optionID);
229
+ expect(optionList[0]).toHaveTextContent('05:00 (0 hr 0 min)');
230
+ expect(optionList[1]).toHaveTextContent('05:15 (0 hr 15 min)');
231
+ expect(optionList[3]).toHaveTextContent('05:45 (0 hr 45 min)');
232
+ });
233
+ });
234
+ });
235
+
236
+ describe('TimePicker list for different interval', () => {
237
+ it('check for 12 hour option list for different interval ', async () => {
238
+ const { getByTestId, getAllByTestId } = render(
239
+ <TimePicker startTime={startTime} endTime={endTime} withSearch={true} interval={30} />
240
+ );
241
+ const dropdownTrigger = getByTestId(trigger);
242
+ fireEvent.click(dropdownTrigger);
243
+ await waitFor(() => {
244
+ const optionList = getAllByTestId(optionID);
245
+ expect(optionList[0]).toHaveTextContent('05:00 AM');
246
+ expect(optionList[1]).toHaveTextContent('05:30 AM');
247
+ expect(optionList[3]).toHaveTextContent('06:30 AM');
248
+ });
249
+ });
250
+
251
+ it('check for 24 hour option list for different interval ', async () => {
252
+ const { getByTestId, getAllByTestId } = render(
253
+ <TimePicker startTime={startTime} endTime={endTime} withSearch={true} interval={30} />
254
+ );
255
+ const dropdownTrigger = getByTestId(trigger);
256
+ fireEvent.click(dropdownTrigger);
257
+ await waitFor(() => {
258
+ const optionList = getAllByTestId(optionID);
259
+ expect(optionList[0]).toHaveTextContent('05:00');
260
+ expect(optionList[1]).toHaveTextContent('05:30');
261
+ expect(optionList[3]).toHaveTextContent('06:30');
262
+ });
263
+ });
264
+ });
265
+
266
+ describe('TimePicker fetchOption list', () => {
267
+ it('check for fetchTimeOptions prop', async () => {
268
+ const { getByTestId, getAllByTestId } = render(<TimePicker withSearch={true} fetchTimeOptions={fetchOption} />);
269
+ const dropdownTrigger = getByTestId(trigger);
270
+ fireEvent.click(dropdownTrigger);
271
+ await waitFor(() => {
272
+ const optionList = getAllByTestId(optionID);
273
+ expect(optionList[0]).toHaveTextContent('10:00 AM');
274
+ });
275
+ });
276
+ });
277
+
278
+ describe('TimePicker Event Handlers', () => {
279
+ it('check for onChange prop', async () => {
280
+ const { getByTestId } = render(
281
+ <TimePicker onChange={FunctionValue} withSearch={true} fetchTimeOptions={fetchOption} />
282
+ );
283
+ const dropdownTrigger = getByTestId(trigger);
284
+
285
+ fireEvent.click(dropdownTrigger);
286
+ await waitFor(() => {
287
+ fireEvent.click(getByTestId('DesignSystem-Text'));
288
+ expect(FunctionValue).toHaveBeenCalled();
289
+ });
290
+ });
291
+ });
292
+
293
+ describe('TimePicker Search Error Handlers', () => {
294
+ it('check for five digit search query in 12 hour format', async () => {
295
+ const { getByTestId } = render(<TimePicker withSearch={true} />);
296
+ const dropdownTrigger = getByTestId(trigger);
297
+
298
+ fireEvent.click(dropdownTrigger);
299
+ const searchInput = getByTestId('DesignSystem-Input');
300
+ expect(searchInput).toBeInTheDocument();
301
+ fireEvent.input(searchInput, { target: { value: '123456' } });
302
+
303
+ await waitFor(() => {
304
+ expect(getByTestId('DesignSystem-Dropdown--errorWrapper')).toBeInTheDocument();
305
+ expect(getByTestId('DesignSystem-Dropdown--errorWrapper')).toHaveTextContent('No result found');
306
+ });
307
+ });
308
+
309
+ it('check for invalid search', async () => {
310
+ const { getByTestId } = render(<TimePicker startTime={startTime} endTime={endTime} withSearch={true} />);
311
+ const dropdownTrigger = getByTestId(trigger);
312
+
313
+ fireEvent.click(dropdownTrigger);
314
+ const searchInput = getByTestId('DesignSystem-Input');
315
+ expect(searchInput).toBeInTheDocument();
316
+ fireEvent.input(searchInput, { target: { value: 'abc:;' } });
317
+
318
+ await waitFor(() => {
319
+ expect(getByTestId('DesignSystem-Dropdown--errorWrapper')).toBeInTheDocument();
320
+ expect(getByTestId('DesignSystem-Dropdown--errorWrapper')).toHaveTextContent('No result found');
321
+ });
322
+ });
323
+
324
+ it('check for noResultFound prop on invalid search', async () => {
325
+ const { getByTestId } = render(
326
+ <TimePicker startTime={startTime} endTime={endTime} withSearch={true} noResultMessage="Invalid Time" />
327
+ );
328
+ const dropdownTrigger = getByTestId(trigger);
329
+
330
+ fireEvent.click(dropdownTrigger);
331
+ const searchInput = getByTestId('DesignSystem-Input');
332
+ expect(searchInput).toBeInTheDocument();
333
+ fireEvent.input(searchInput, { target: { value: 'abc:;' } });
334
+
335
+ await waitFor(() => {
336
+ expect(getByTestId('DesignSystem-Dropdown--errorWrapper')).toBeInTheDocument();
337
+ expect(getByTestId('DesignSystem-Dropdown--errorWrapper')).toHaveTextContent('Invalid Time');
338
+ });
339
+ });
340
+ });
341
+
342
+ const searchQueryWithTimeProp = [
343
+ { searchTime: '20', result: '08:00 PM', resultIndex: 60, desc: 'check for two digit' },
344
+ { searchTime: '715pm', result: '07:15 PM', resultIndex: 57, desc: 'check for time zone' },
345
+ { searchTime: '8am', result: '08:00 AM', resultIndex: 12, desc: 'check for one digit am/pm' },
346
+ ];
347
+
348
+ const searchQueryWithoutTimeProp = [
349
+ { searchTime: '00', result: '12:00 AM', resultIndex: 0, desc: 'check for 00 query' },
350
+ { searchTime: '20', result: '08:00 PM', resultIndex: 80, desc: 'check for 24 hr query' },
351
+ { searchTime: '2321', result: '11:30 PM', resultIndex: 94, desc: 'check for four digit' },
352
+ { searchTime: '24', result: '12:00 AM', resultIndex: 0, desc: 'check for search query 24' },
353
+ { searchTime: '905am', result: '09:15 AM', resultIndex: 37, desc: 'check for digit with AM/PM' },
354
+ { searchTime: '04;00am', result: '04:00 AM', resultIndex: 16, desc: 'check for special character' },
355
+ { searchTime: '1160Pm', result: '12:00 AM', resultIndex: 0, desc: 'check for four digit with time zone' },
356
+ { searchTime: '2360', result: '12:00 AM', resultIndex: 0, desc: 'check for query with minute set as 60' },
357
+ { searchTime: '14 30', result: '02:30 PM', resultIndex: 58, desc: 'check for query number/special char' },
358
+ { searchTime: '12pm', result: '12:00 PM', resultIndex: 48, desc: 'check for search query 12 with time zone' },
359
+ { searchTime: '14 30am', result: '02:30 AM', resultIndex: 10, desc: 'check for query number/timezone/special char' },
360
+ { searchTime: '0030', result: '12:30 AM', resultIndex: 2, desc: 'check for query with trailing zero' },
361
+ // { searchTime: '1230', result: '12:30 PM', resultIndex: 50, desc: 'check for search query with 12' },
362
+ ];
363
+
364
+ describe('TimePicker Search when start/end time is given', () => {
365
+ searchQueryWithTimeProp.forEach((testCase) => {
366
+ it(`${testCase.desc} in 12 hour format`, async () => {
367
+ const { getByTestId, getAllByTestId } = render(
368
+ <TimePicker startTime={startTime} endTime={endTime} withSearch={true} />
369
+ );
370
+ const dropdownTrigger = getByTestId(trigger);
371
+
372
+ fireEvent.click(dropdownTrigger);
373
+ const searchInput = getByTestId('DesignSystem-Input');
374
+ expect(searchInput).toBeInTheDocument();
375
+ fireEvent.input(searchInput, { target: { value: testCase.searchTime } });
376
+
377
+ await waitFor(() => {
378
+ const optionList = getAllByTestId(optionID);
379
+ expect(optionList[testCase.resultIndex]).toHaveTextContent(testCase.result);
380
+ expect(optionList[testCase.resultIndex]).toHaveClass(activeOptionClass);
381
+ });
382
+ });
383
+
384
+ it(`${testCase.desc} in 24 hour format`, async () => {
385
+ const { getByTestId, getAllByTestId } = render(
386
+ <TimePicker timeFormat="24-Hour" startTime={startTime} endTime={endTime} withSearch={true} />
387
+ );
388
+ const dropdownTrigger = getByTestId(trigger);
389
+
390
+ fireEvent.click(dropdownTrigger);
391
+ const searchInput = getByTestId('DesignSystem-Input');
392
+ expect(searchInput).toBeInTheDocument();
393
+ fireEvent.input(searchInput, { target: { value: testCase.searchTime } });
394
+
395
+ const result = convert12To24HourFormat(testCase.result);
396
+
397
+ await waitFor(() => {
398
+ const optionList = getAllByTestId(optionID);
399
+ expect(optionList[testCase.resultIndex]).toHaveTextContent(result);
400
+ expect(optionList[testCase.resultIndex]).toHaveClass(activeOptionClass);
401
+ });
402
+ });
403
+ });
404
+ });
405
+
406
+ describe('TimePicker Search when start/end time is not given', () => {
407
+ searchQueryWithoutTimeProp.forEach((testCase) => {
408
+ it(`${testCase.desc} in 12 hour format`, async () => {
409
+ const { getByTestId, getAllByTestId } = render(<TimePicker withSearch={true} />);
410
+ const dropdownTrigger = getByTestId(trigger);
411
+
412
+ fireEvent.click(dropdownTrigger);
413
+ const searchInput = getByTestId('DesignSystem-Input');
414
+ expect(searchInput).toBeInTheDocument();
415
+ fireEvent.input(searchInput, { target: { value: testCase.searchTime } });
416
+
417
+ await waitFor(() => {
418
+ const optionList = getAllByTestId(optionID);
419
+ expect(optionList[testCase.resultIndex]).toHaveTextContent(testCase.result);
420
+ expect(optionList[testCase.resultIndex]).toHaveClass(activeOptionClass);
421
+ });
422
+ });
423
+
424
+ it(`${testCase.desc} in 24 hour format`, async () => {
425
+ const { getByTestId, getAllByTestId } = render(<TimePicker timeFormat="24-Hour" withSearch={true} />);
426
+ const dropdownTrigger = getByTestId(trigger);
427
+
428
+ fireEvent.click(dropdownTrigger);
429
+ const searchInput = getByTestId('DesignSystem-Input');
430
+ expect(searchInput).toBeInTheDocument();
431
+ fireEvent.input(searchInput, { target: { value: testCase.searchTime } });
432
+
433
+ const result = convert12To24HourFormat(testCase.result);
434
+
435
+ await waitFor(() => {
436
+ const optionList = getAllByTestId(optionID);
437
+ expect(optionList[testCase.resultIndex]).toHaveTextContent(result);
438
+ expect(optionList[testCase.resultIndex]).toHaveClass(activeOptionClass);
439
+ });
440
+ });
441
+ });
442
+ });
443
+
444
+ describe('TimePicker Search when current time is in AM', () => {
445
+ const dateNowSpy = jest.spyOn(Date, 'now').mockImplementation(() => 1632314963710); // 7:15
446
+
447
+ it('check for one digit search query', async () => {
448
+ const { getByTestId, getAllByTestId } = render(<TimePicker withSearch={true} />);
449
+ const dropdownTrigger = getByTestId(trigger);
450
+
451
+ fireEvent.click(dropdownTrigger);
452
+ const searchInput = getByTestId('DesignSystem-Input');
453
+ expect(searchInput).toBeInTheDocument();
454
+ fireEvent.input(searchInput, { target: { value: '5' } });
455
+
456
+ await waitFor(() => {
457
+ const optionList = getAllByTestId(optionID);
458
+ expect(optionList[68]).toHaveTextContent('05:00 PM');
459
+ expect(optionList[68]).toHaveClass(activeOptionClass);
460
+ });
461
+ });
462
+
463
+ dateNowSpy.mockRestore();
464
+ });
465
+
466
+ describe('TimePicker Search when current time is in PM', () => {
467
+ const dateNowSpy = jest.spyOn(Date, 'now').mockImplementation(() => 1632315010510); // 20:15
468
+
469
+ it('check for one digit search query', async () => {
470
+ const { getByTestId, getAllByTestId } = render(<TimePicker withSearch={true} />);
471
+ const dropdownTrigger = getByTestId(trigger);
472
+
473
+ fireEvent.click(dropdownTrigger);
474
+ const searchInput = getByTestId('DesignSystem-Input');
475
+ expect(searchInput).toBeInTheDocument();
476
+ fireEvent.input(searchInput, { target: { value: '7' } });
477
+
478
+ await waitFor(() => {
479
+ const optionList = getAllByTestId(optionID);
480
+ expect(optionList[76]).toHaveTextContent('07:00 PM');
481
+ expect(optionList[76]).toHaveClass(activeOptionClass);
482
+ });
483
+ });
484
+
485
+ dateNowSpy.mockRestore();
486
+ });
@@ -0,0 +1,169 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`TimePicker component snapshots renders snapshot for all props
4
+ startTime: "05:00 AM", endTime: "11:00 PM", showDuration: false, timeFormat: "12-Hour"
5
+ 1`] = `
6
+ <body>
7
+ <div>
8
+ <div
9
+ class="Dropdown"
10
+ >
11
+ <style />
12
+ <div
13
+ class="OutsideClick PopperWrapper-trigger w-100"
14
+ >
15
+ <button
16
+ class="Button DropdownButton DropdownButton--regular DropdownButton--placeholder"
17
+ data-test="DesignSystem-DropdownTrigger"
18
+ tabindex="0"
19
+ type="button"
20
+ value=""
21
+ >
22
+ <div
23
+ class="DropdownButton-wrapper"
24
+ >
25
+ <span
26
+ class="Text Text--regular DropdownButton-text"
27
+ >
28
+ Select
29
+ </span>
30
+ </div>
31
+ <i
32
+ class="material-icons material-icons-round Icon Icon--default"
33
+ role="button"
34
+ style="font-size: 16px; width: 16px;"
35
+ >
36
+ keyboard_arrow_down_round
37
+ </i>
38
+ </button>
39
+ </div>
40
+ </div>
41
+ </div>
42
+ </body>
43
+ `;
44
+
45
+ exports[`TimePicker component snapshots renders snapshot for all props
46
+ startTime: "05:00 AM", endTime: "11:00 PM", showDuration: false, timeFormat: "24-Hour"
47
+ 1`] = `
48
+ <body>
49
+ <div>
50
+ <div
51
+ class="Dropdown"
52
+ >
53
+ <style />
54
+ <div
55
+ class="OutsideClick PopperWrapper-trigger w-100"
56
+ >
57
+ <button
58
+ class="Button DropdownButton DropdownButton--regular DropdownButton--placeholder"
59
+ data-test="DesignSystem-DropdownTrigger"
60
+ tabindex="0"
61
+ type="button"
62
+ value=""
63
+ >
64
+ <div
65
+ class="DropdownButton-wrapper"
66
+ >
67
+ <span
68
+ class="Text Text--regular DropdownButton-text"
69
+ >
70
+ Select
71
+ </span>
72
+ </div>
73
+ <i
74
+ class="material-icons material-icons-round Icon Icon--default"
75
+ role="button"
76
+ style="font-size: 16px; width: 16px;"
77
+ >
78
+ keyboard_arrow_down_round
79
+ </i>
80
+ </button>
81
+ </div>
82
+ </div>
83
+ </div>
84
+ </body>
85
+ `;
86
+
87
+ exports[`TimePicker component snapshots renders snapshot for all props
88
+ startTime: "05:00 AM", endTime: "11:00 PM", showDuration: true, timeFormat: "12-Hour"
89
+ 1`] = `
90
+ <body>
91
+ <div>
92
+ <div
93
+ class="Dropdown"
94
+ >
95
+ <style />
96
+ <div
97
+ class="OutsideClick PopperWrapper-trigger w-100"
98
+ >
99
+ <button
100
+ class="Button DropdownButton DropdownButton--regular DropdownButton--placeholder"
101
+ data-test="DesignSystem-DropdownTrigger"
102
+ tabindex="0"
103
+ type="button"
104
+ value=""
105
+ >
106
+ <div
107
+ class="DropdownButton-wrapper"
108
+ >
109
+ <span
110
+ class="Text Text--regular DropdownButton-text"
111
+ >
112
+ Select
113
+ </span>
114
+ </div>
115
+ <i
116
+ class="material-icons material-icons-round Icon Icon--default"
117
+ role="button"
118
+ style="font-size: 16px; width: 16px;"
119
+ >
120
+ keyboard_arrow_down_round
121
+ </i>
122
+ </button>
123
+ </div>
124
+ </div>
125
+ </div>
126
+ </body>
127
+ `;
128
+
129
+ exports[`TimePicker component snapshots renders snapshot for all props
130
+ startTime: "05:00 AM", endTime: "11:00 PM", showDuration: true, timeFormat: "24-Hour"
131
+ 1`] = `
132
+ <body>
133
+ <div>
134
+ <div
135
+ class="Dropdown"
136
+ >
137
+ <style />
138
+ <div
139
+ class="OutsideClick PopperWrapper-trigger w-100"
140
+ >
141
+ <button
142
+ class="Button DropdownButton DropdownButton--regular DropdownButton--placeholder"
143
+ data-test="DesignSystem-DropdownTrigger"
144
+ tabindex="0"
145
+ type="button"
146
+ value=""
147
+ >
148
+ <div
149
+ class="DropdownButton-wrapper"
150
+ >
151
+ <span
152
+ class="Text Text--regular DropdownButton-text"
153
+ >
154
+ Select
155
+ </span>
156
+ </div>
157
+ <i
158
+ class="material-icons material-icons-round Icon Icon--default"
159
+ role="button"
160
+ style="font-size: 16px; width: 16px;"
161
+ >
162
+ keyboard_arrow_down_round
163
+ </i>
164
+ </button>
165
+ </div>
166
+ </div>
167
+ </div>
168
+ </body>
169
+ `;
@@ -1,2 +1,4 @@
1
1
  export { default } from './TimePicker';
2
2
  export * from './TimePicker';
3
+ export * from './TimePickerWithInput';
4
+ export * from './TimePickerWithSearch';