@innovaccer/design-system 2.5.0-4 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (264) hide show
  1. package/.all-contributorsrc +1 -1
  2. package/.eslintrc.json +53 -0
  3. package/.github/workflows/jira.yml +1 -2
  4. package/.github/workflows/main.yml +2 -2
  5. package/.github/workflows/pull_request.yml +1 -1
  6. package/.github/workflows/test.yml +1 -1
  7. package/.husky/commit-msg +4 -0
  8. package/.prettierrc +2 -2
  9. package/CHANGELOG.md +38 -88
  10. package/CONTRIBUTING.md +173 -97
  11. package/README.md +1 -1
  12. package/commitlint.config.js +1 -0
  13. package/core/accessibility/utils/index.ts +5 -0
  14. package/core/accessibility/utils/isEnterKey.ts +5 -0
  15. package/core/accessibility/utils/isSpaceKey.ts +5 -0
  16. package/core/accessibility/utils/useAccessibilityProps.ts +31 -0
  17. package/core/components/atoms/_chip/__tests__/__snapshots__/_chip.test.tsx.snap +8 -0
  18. package/core/components/atoms/_chip/index.tsx +2 -0
  19. package/core/components/atoms/button/__stories__/Alert.story.tsx +8 -1
  20. package/core/components/atoms/button/__stories__/Cancel.story.tsx +4 -1
  21. package/core/components/atoms/button/__stories__/IconButtonGroup.story.tsx +12 -3
  22. package/core/components/atoms/button/__stories__/IconButtonSecondary.story.tsx +6 -1
  23. package/core/components/atoms/button/__stories__/IconLeftSecondary.story.tsx +4 -1
  24. package/core/components/atoms/button/__stories__/IconRightSecondary.story.tsx +4 -1
  25. package/core/components/atoms/button/__stories__/IconTransparent.story.tsx +4 -1
  26. package/core/components/atoms/button/__stories__/LabelButtonGroup.story.tsx +14 -3
  27. package/core/components/atoms/button/__stories__/LargeIconExpanded.story.tsx +4 -1
  28. package/core/components/atoms/button/__stories__/LoadingPrimary.story.tsx +4 -1
  29. package/core/components/atoms/button/__stories__/Primary.story.tsx +5 -2
  30. package/core/components/atoms/button/__stories__/SplitButton.story.tsx +6 -1
  31. package/core/components/atoms/button/__stories__/Transparent.story.tsx +8 -1
  32. package/core/components/atoms/button/__stories__/index.story.tsx +11 -1
  33. package/core/components/atoms/button/__stories__/variants/Appearance.story.tsx +4 -0
  34. package/core/components/atoms/button/__stories__/variants/Expanded.story.tsx +4 -0
  35. package/core/components/atoms/button/__stories__/variants/Size.story.tsx +4 -0
  36. package/core/components/atoms/button/__stories__/variants/icon/Icon.story.tsx +15 -0
  37. package/core/components/atoms/button/__stories__/variants/icon/IconLeft.story.tsx +4 -0
  38. package/core/components/atoms/button/__stories__/variants/icon/IconRight.story.tsx +4 -0
  39. package/core/components/atoms/button/__stories__/variants/state/Alert.story.tsx +7 -17
  40. package/core/components/atoms/button/__stories__/variants/state/Basic.story.tsx +9 -17
  41. package/core/components/atoms/button/__stories__/variants/state/Primary.story.tsx +7 -17
  42. package/core/components/atoms/button/__stories__/variants/state/Success.story.tsx +7 -17
  43. package/core/components/atoms/button/__stories__/variants/state/Transparent.story.tsx +13 -17
  44. package/core/components/atoms/chipGroup/__tests__/__snapshots__/chipGroup.test.tsx.snap +6 -0
  45. package/core/components/atoms/collapsible/__stories__/index.story.tsx +2 -2
  46. package/core/components/atoms/collapsible/__tests__/__snapshots__/Collapsible.test.tsx.snap +8 -0
  47. package/core/components/atoms/divider/Divider.tsx +44 -0
  48. package/core/components/atoms/divider/__stories__/BasicDividerInCard.story.tsx +74 -0
  49. package/core/components/atoms/divider/__stories__/HeaderDividerInCard.story.tsx +35 -0
  50. package/core/components/atoms/divider/__stories__/IndentedDivider.story.tsx +49 -0
  51. package/core/components/atoms/divider/__stories__/Vertical.story.tsx +51 -0
  52. package/core/components/atoms/divider/__stories__/index.story.tsx +91 -0
  53. package/core/components/atoms/divider/__stories__/variants/HorizontalDivider.story.tsx +27 -0
  54. package/core/components/atoms/divider/__tests__/Divider.test.tsx +50 -0
  55. package/core/components/atoms/divider/__tests__/__snapshots__/Divider.test.tsx.snap +53 -0
  56. package/core/components/atoms/divider/index.tsx +2 -0
  57. package/core/components/atoms/dropdown/DropdownList.tsx +8 -2
  58. package/core/components/atoms/dropdown/__stories__/variants/controlledDropdown/MultiSelect.story.tsx +27 -17
  59. package/core/components/atoms/dropdown/option/DefaultOption.tsx +3 -0
  60. package/core/components/atoms/dropdown/option/IconOption.tsx +3 -0
  61. package/core/components/atoms/dropdown/option/IconWithMetaOption.tsx +3 -0
  62. package/core/components/atoms/dropdown/option/MetaOption.tsx +3 -0
  63. package/core/components/atoms/editable/Editable.tsx +3 -0
  64. package/core/components/atoms/icon/Icon.tsx +14 -3
  65. package/core/components/atoms/icon/__stories__/variants/Image.story.tsx +6 -1
  66. package/core/components/atoms/icon/__tests__/__snapshots__/Icon.test.tsx.snap +74 -0
  67. package/core/components/atoms/input/Input.tsx +14 -4
  68. package/core/components/atoms/input/__stories__/BasicInput.story.tsx +2 -1
  69. package/core/components/atoms/input/__stories__/InputWithCaption.story.tsx +29 -9
  70. package/core/components/atoms/input/__stories__/InputWithLabel.story.tsx +11 -3
  71. package/core/components/atoms/input/__stories__/LabelPosition.story.tsx +8 -4
  72. package/core/components/atoms/input/__stories__/RequiredVsOptional.story.tsx +12 -8
  73. package/core/components/atoms/input/__tests__/__snapshots__/Input.test.tsx.snap +19 -0
  74. package/core/components/atoms/legend/Legend.tsx +3 -0
  75. package/core/components/atoms/message/__stories__/CustomDescription.tsx +25 -0
  76. package/core/components/atoms/metricInput/MetricInput.tsx +12 -2
  77. package/core/components/atoms/metricInput/__stories__/DefaultMetric.story.tsx +8 -2
  78. package/core/components/atoms/metricInput/__stories__/WithPrefix.story.tsx +6 -2
  79. package/core/components/atoms/metricInput/__stories__/index.story.tsx +1 -0
  80. package/core/components/atoms/metricInput/__stories__/variants/Controlled.story.tsx +2 -0
  81. package/core/components/atoms/metricInput/__stories__/variants/Size.story.tsx +2 -2
  82. package/core/components/atoms/metricInput/__stories__/withSuffix.story.tsx +6 -2
  83. package/core/components/atoms/metricInput/__tests__/__snapshots__/MetricInput.test.tsx.snap +20 -4
  84. package/core/components/atoms/multiSlider/Handle.tsx +3 -0
  85. package/core/components/atoms/multiSlider/index.tsx +6 -0
  86. package/core/components/atoms/outsideClick/__stories__/index.story.tsx +1 -1
  87. package/core/components/atoms/statusHint/StatusHint.tsx +3 -0
  88. package/core/components/atoms/switchInput/Switch.tsx +10 -4
  89. package/core/components/atoms/switchInput/__stories__/DefaultSwitch.story.tsx +4 -1
  90. package/core/components/atoms/switchInput/__stories__/OffState.story.tsx +4 -1
  91. package/core/components/atoms/switchInput/__stories__/index.story.tsx +26 -3
  92. package/core/components/atoms/switchInput/__stories__/variants/Size.story.tsx +10 -1
  93. package/core/components/atoms/switchInput/__stories__/variants/State.story.tsx +9 -2
  94. package/core/components/atoms/textarea/__stories__/TextareaWithCaption.story.tsx +9 -3
  95. package/core/components/atoms/textarea/__stories__/defaultTextarea.story.tsx +10 -2
  96. package/core/components/atoms/textarea/__stories__/index.story.tsx +1 -0
  97. package/core/components/atoms/textarea/__stories__/variants/Disable.story.tsx +1 -0
  98. package/core/components/atoms/toast/__tests__/__snapshots__/Toast.test.tsx.snap +30 -0
  99. package/core/components/css-utilities/Align/Align.story.tsx +1 -1
  100. package/core/components/css-utilities/Background/Background.story.tsx +1 -1
  101. package/core/components/css-utilities/Border/Border.story.tsx +1 -1
  102. package/core/components/css-utilities/Display/Display.story.tsx +1 -1
  103. package/core/components/css-utilities/Flex/Flex.story.tsx +1 -1
  104. package/core/components/css-utilities/Miscellaneous/Miscellaneous.story.tsx +1 -1
  105. package/core/components/css-utilities/Overflow/Overflow.story.tsx +1 -1
  106. package/core/components/css-utilities/Position/Position.story.tsx +1 -1
  107. package/core/components/css-utilities/Sizing/Sizing.story.tsx +1 -1
  108. package/core/components/css-utilities/Spacing/Spacing.story.tsx +1 -1
  109. package/core/components/molecules/chatMessage/Box.tsx +3 -0
  110. package/core/components/molecules/chipInput/ChipInput.tsx +3 -0
  111. package/core/components/molecules/chipInput/__tests__/__snapshots__/ChipInput.test.tsx.snap +12 -0
  112. package/core/components/molecules/dropzone/Dropzone.tsx +3 -0
  113. package/core/components/molecules/dropzone/FileSelectorUtils.tsx +1 -1
  114. package/core/components/molecules/editableChipInput/EditableChipInput.tsx +9 -5
  115. package/core/components/molecules/editableChipInput/__stories__/Uncontrolled.story.tsx +1 -1
  116. package/core/components/molecules/editableChipInput/__tests__/__snapshots__/EditableChipInput.test.tsx.snap +8 -0
  117. package/core/components/molecules/editableDropdown/EditableDropdown.tsx +2 -2
  118. package/core/components/molecules/editableInput/EditableInput.tsx +13 -4
  119. package/core/components/molecules/emptyState/EmptyState.tsx +5 -1
  120. package/core/components/molecules/fileList/FileListItem.tsx +2 -0
  121. package/core/components/molecules/fileUploader/FileUploaderItem.tsx +2 -0
  122. package/core/components/molecules/fileUploader/__stories__/index.story.tsx +156 -21
  123. package/core/components/molecules/inputMask/InputMask.tsx +1 -1
  124. package/core/components/molecules/inputMask/__tests__/__snapshots__/InputMask.test.tsx.snap +1 -0
  125. package/core/components/molecules/pagination/__tests__/__snapshots__/Pagination.test.tsx.snap +5 -1
  126. package/core/components/molecules/stepper/Step.tsx +2 -0
  127. package/core/components/molecules/tabs/Tabs.tsx +2 -0
  128. package/core/components/molecules/tabs/TabsWrapper.tsx +2 -0
  129. package/core/components/molecules/tabs/__stories__/CustomLabels.story.tsx +1 -1
  130. package/core/components/molecules/verificationCodeInput/VerificationCodeInput.tsx +8 -4
  131. package/core/components/molecules/verificationCodeInput/__stories__/index.story.tsx +3 -1
  132. package/core/components/molecules/verificationCodeInput/__tests__/__snapshots__/VerificationCodeInput.test.tsx.snap +1 -0
  133. package/core/components/organisms/calendar/Calendar.tsx +130 -8
  134. package/core/components/organisms/calendar/__tests__/Calendar.test.tsx +27 -0
  135. package/core/components/organisms/choiceList/ChoiceList.tsx +1 -1
  136. package/core/components/organisms/datePicker/DatePicker.tsx +30 -15
  137. package/core/components/organisms/datePicker/__tests__/DatePicker.test.tsx +136 -46
  138. package/core/components/organisms/datePicker/__tests__/__snapshots__/DatePicker.test.tsx.snap +4388 -1857
  139. package/core/components/organisms/dateRangePicker/__tests__/__snapshots__/DateRangePicker.test.tsx.snap +112 -40
  140. package/core/components/organisms/grid/Cell.tsx +4 -0
  141. package/core/components/organisms/grid/GridRow.tsx +4 -0
  142. package/core/components/organisms/grid/__stories__/_common_/fetchData.ts +2 -2
  143. package/core/components/organisms/horizontalNav/HorizontalNav.tsx +2 -0
  144. package/core/components/organisms/inlineMessage/InlineMessage.tsx +3 -5
  145. package/core/components/organisms/inlineMessage/__tests__/__snapshots__/InlineMessage.test.tsx.snap +30 -40
  146. package/core/components/organisms/navigation/VerticalNavigation.tsx +4 -0
  147. package/core/components/organisms/table/Table.tsx +1 -0
  148. package/core/components/organisms/table/__stories__/NestedTableWithNestedCard.story.tsx +4 -1
  149. package/core/components/organisms/table/__stories__/ResourceTable.story.tsx +3 -2
  150. package/core/components/organisms/table/__stories__/Selection.story.tsx +2 -2
  151. package/core/components/organisms/table/__stories__/TableAsDescriptionList.story.tsx +1 -1
  152. package/core/components/organisms/table/__stories__/TableAsOptionList.story.tsx +1 -1
  153. package/core/components/organisms/table/__stories__/syncTable.story.tsx +14 -6
  154. package/core/components/organisms/table/__stories__/variants/nestedRows.story.tsx +5 -2
  155. package/core/components/organisms/table/__stories__/variants/withHeader.story.tsx +0 -2
  156. package/core/components/organisms/timePicker/TimePicker.tsx +1 -1
  157. package/core/components/organisms/timePicker/__tests__/__snapshots__/TimePicker.test.tsx.snap +14 -2
  158. package/core/components/organisms/verticalNav/MenuItem.tsx +2 -0
  159. package/core/components/patterns/datePicker/datePickerWithPresets.story.tsx +126 -0
  160. package/core/components/patterns/dateRangePicker/withCustomPopover.story.tsx +8 -8
  161. package/core/components/patterns/forms/CreatePassword.story.tsx +1 -1
  162. package/core/components/patterns/forms/VerificationCodeInput.story.tsx +2 -2
  163. package/core/components/patterns/table/Table with Header/tableWithHeader.story.jsx +7 -7
  164. package/core/index.tsx +1 -0
  165. package/core/index.type.tsx +1 -0
  166. package/core/utils/Keys.ts +4 -0
  167. package/core/utils/__tests__/__snapshots__/TS.test.tsx.snap +544 -536
  168. package/core/utils/docPage/index.tsx +22 -17
  169. package/core/utils/testHelper.ts +1 -1
  170. package/core/utils/validators.ts +37 -34
  171. package/css/dist/index.css +1523 -1402
  172. package/css/dist/index.css.map +1 -1
  173. package/css/src/components/Legend.css +7 -7
  174. package/css/src/components/ProgressBar.css +1 -1
  175. package/css/src/components/avatarGroup.css +1 -1
  176. package/css/src/components/backdrop.css +12 -6
  177. package/css/src/components/badge.css +52 -52
  178. package/css/src/components/button.css +99 -94
  179. package/css/src/components/calendar.css +137 -126
  180. package/css/src/components/card.css +0 -1
  181. package/css/src/components/cardSubdued.css +3 -5
  182. package/css/src/components/chat.css +1 -1
  183. package/css/src/components/checkbox.css +71 -70
  184. package/css/src/components/chip.css +14 -13
  185. package/css/src/components/chipGroup.css +5 -5
  186. package/css/src/components/chipInput.css +1 -1
  187. package/css/src/components/choiceList.css +4 -4
  188. package/css/src/components/dateRangePicker.css +13 -13
  189. package/css/src/components/divider.css +20 -0
  190. package/css/src/components/dropdown.css +61 -61
  191. package/css/src/components/dropdownButton.css +36 -36
  192. package/css/src/components/dropzone.css +16 -20
  193. package/css/src/components/editableChipInput.css +10 -9
  194. package/css/src/components/editableDropdown.css +1 -1
  195. package/css/src/components/editableInput.css +1 -1
  196. package/css/src/components/emptyState.css +15 -15
  197. package/css/src/components/fileList.css +44 -45
  198. package/css/src/components/grid.css +217 -199
  199. package/css/src/components/horizontalNav.css +0 -1
  200. package/css/src/components/icon.css +1 -7
  201. package/css/src/components/inlineMessage.css +2 -1
  202. package/css/src/components/input.css +62 -62
  203. package/css/src/components/link.css +1 -1
  204. package/css/src/components/list.css +10 -10
  205. package/css/src/components/message.css +69 -70
  206. package/css/src/components/metaList.css +26 -26
  207. package/css/src/components/metricInput.css +3 -4
  208. package/css/src/components/modal.css +1 -1
  209. package/css/src/components/navigation.css +3 -3
  210. package/css/src/components/pageHeader.css +1 -2
  211. package/css/src/components/pagination.css +36 -36
  212. package/css/src/components/pills.css +19 -19
  213. package/css/src/components/placeholder.css +10 -5
  214. package/css/src/components/popover.css +2 -2
  215. package/css/src/components/progressRing.css +1 -1
  216. package/css/src/components/radio.css +74 -74
  217. package/css/src/components/slider.css +5 -5
  218. package/css/src/components/statusHints.css +15 -15
  219. package/css/src/components/switch.css +45 -41
  220. package/css/src/components/table.css +15 -15
  221. package/css/src/components/tabs.css +53 -53
  222. package/css/src/components/textarea.css +1 -1
  223. package/css/src/components/toast.css +53 -53
  224. package/css/src/components/verificationCodeInput.css +5 -6
  225. package/css/src/components/verticalNav.css +1 -2
  226. package/css/src/core/base.css +3 -0
  227. package/css/src/core/typography.css +1 -1
  228. package/css/src/core/utilities.css +1 -1
  229. package/css/src/tokens/index.css +63 -63
  230. package/css/src/utils/align.css +1 -1
  231. package/css/src/utils/background.css +1 -1
  232. package/css/src/utils/cursor.css +1 -1
  233. package/css/src/utils/display.css +1 -1
  234. package/css/src/utils/flex.css +1 -1
  235. package/css/src/utils/grid.css +1 -1
  236. package/css/src/utils/overflow.css +1 -1
  237. package/css/src/utils/position.css +1 -1
  238. package/css/src/utils/spacing.css +1 -1
  239. package/css/src/utils/utility.css +13 -13
  240. package/css/src/variables/index.css +1 -1
  241. package/dist/core/accessibility/utils/index.d.ts +4 -0
  242. package/dist/core/accessibility/utils/isEnterKey.d.ts +3 -0
  243. package/dist/core/accessibility/utils/isSpaceKey.d.ts +3 -0
  244. package/dist/core/accessibility/utils/useAccessibilityProps.d.ts +15 -0
  245. package/dist/core/components/atoms/divider/Divider.d.ts +15 -0
  246. package/dist/core/components/atoms/divider/index.d.ts +2 -0
  247. package/dist/core/components/atoms/icon/Icon.d.ts +3 -1
  248. package/dist/core/components/atoms/input/Input.d.ts +1 -1
  249. package/dist/core/components/atoms/popperWrapper/PopperWrapper.d.ts +50 -49
  250. package/dist/core/components/atoms/switchInput/Switch.d.ts +2 -1
  251. package/dist/core/components/organisms/calendar/Calendar.d.ts +31 -0
  252. package/dist/core/components/organisms/datePicker/DatePicker.d.ts +2 -0
  253. package/dist/core/components/patterns/datePicker/datePickerWithPresets.story.d.ts +15 -0
  254. package/dist/core/index.d.ts +1 -0
  255. package/dist/core/index.type.d.ts +1 -0
  256. package/dist/index.esm.js +829 -495
  257. package/dist/index.js +313 -144
  258. package/dist/index.js.map +1 -1
  259. package/dist/index.umd.js +1 -1
  260. package/dist/index.umd.js.br +0 -0
  261. package/dist/index.umd.js.gz +0 -0
  262. package/package.json +17 -14
  263. package/.husky/prepare-commit-msg +0 -6
  264. package/tslint.json +0 -30
@@ -98,14 +98,19 @@ export const EditableInput = (props: EditableInputProps) => {
98
98
 
99
99
  const onChangeHandler = (eventType: string) => {
100
100
  switch (eventType) {
101
- case 'edit':
101
+ case 'edit': {
102
102
  inputRef.current?.focus();
103
103
  setEditing(true);
104
- case 'hover':
105
104
  setShowComponent(true);
106
- return;
107
- case 'default':
105
+ break;
106
+ }
107
+ case 'hover': {
108
+ setShowComponent(true);
109
+ break;
110
+ }
111
+ case 'default': {
108
112
  setShowComponent(false);
113
+ }
109
114
  }
110
115
  };
111
116
 
@@ -114,6 +119,8 @@ export const EditableInput = (props: EditableInputProps) => {
114
119
  defaultValue={inputValue}
115
120
  placeholder={placeholder}
116
121
  className={InputClass}
122
+ // TODO(a11y)
123
+ // eslint-disable-next-line jsx-a11y/no-autofocus
117
124
  autoFocus={editing}
118
125
  size={size}
119
126
  onChange={onInputChangeHandler}
@@ -159,6 +166,8 @@ export const EditableInput = (props: EditableInputProps) => {
159
166
  };
160
167
 
161
168
  return (
169
+ // TODO(a11y)
170
+ // eslint-disable-next-line jsx-a11y/no-static-element-interactions
162
171
  <div data-test="DesignSystem-EditableInput" {...baseProps} className={EditableInputClass} onKeyDown={onKeyDown}>
163
172
  <Editable onChange={onChangeHandler} editing={editing}>
164
173
  {renderChildren()}
@@ -75,7 +75,11 @@ export const EmptyState = (props: EmptyStateProps) => {
75
75
  return (
76
76
  <div data-test="DesignSystem-EmptyState" {...baseProps} className={WrapperClass}>
77
77
  {image && <div style={{ height: imageHeight[size] }}>{image}</div>}
78
- {imageSrc && !image && <img src={imageSrc} height={imageHeight[size]} data-test="DesignSystem-EmptyState--Img" />}
78
+ {imageSrc && !image && (
79
+ //TODO(a11y)
80
+ //eslint-disable-next-line
81
+ <img src={imageSrc} height={imageHeight[size]} data-test="DesignSystem-EmptyState--Img" />
82
+ )}
79
83
  <Heading data-test="DesignSystem-EmptyState--Heading" size={HeadingSize[size]} className={HeadingClass}>
80
84
  {title}
81
85
  </Heading>
@@ -80,6 +80,8 @@ export const FileListItem = (props: FileListItemProps) => {
80
80
  };
81
81
 
82
82
  return (
83
+ // TODO(a11y)
84
+ // eslint-disable-next-line
83
85
  <div {...baseProps} className={FileItemClass} onClick={onClickHandler} data-test="DesignSystem-FileListItem">
84
86
  <div className="FileItem-file">
85
87
  <div className="FileItem-fileContent">
@@ -54,6 +54,8 @@ export const FileUploaderItem = (props: FileUploaderItemProps) => {
54
54
  );
55
55
 
56
56
  return (
57
+ // TODO(a11y)
58
+ // eslint-disable-next-line
57
59
  <div
58
60
  {...baseProps}
59
61
  data-test="DesignSystem-FileUploader--Item"
@@ -2,34 +2,101 @@ import * as React from 'react';
2
2
  import { text, boolean } from '@storybook/addon-knobs';
3
3
  import { FileUploader, FileUploaderList, Link } from '@/index';
4
4
  import { FileUploaderComponent, FileUploaderListComponent } from './_common_/types';
5
+ import { FileItem } from '../FileUploaderItem';
5
6
 
6
7
  export const all = () => {
7
- const [fileNames, setFileNames] = React.useState<any>([]);
8
+ const [fileNames, setFileNames] = React.useState<FileItem[]>([]);
9
+ const [errorOccured, setErrorOccured] = React.useState(false);
8
10
 
9
11
  const title = text('title', 'Upload files');
10
- const formatLabel = text('formatLabel', 'Accepted formats: PDF, jpg');
12
+ const formatLabel = text('formatLabel', 'Accepted formats: pdf, jpg, jpeg, png');
11
13
  const sizeLabel = text('sizeLabel', 'Maximum size: 25 MB');
12
14
  const multiple = boolean('multiple', true);
13
15
 
14
- const onChangeHandler = (fileList: File[]) => {
15
- const files = fileList.map((file) => {
16
- return {
16
+ const randomBetween = (value: number) => Math.round(Math.random() * value);
17
+
18
+ const imitateUploading = (fileItem: FileItem) => {
19
+ const randomProgressChunks = [5, 8, 13];
20
+ const randomChunkIndex = randomBetween(randomProgressChunks.length - 1);
21
+ const progressChunk = randomProgressChunks[randomChunkIndex];
22
+ let baseProgress = fileItem.progress || 0;
23
+
24
+ const increment = () => {
25
+ baseProgress += progressChunk;
26
+ setProgressFileName(fileItem, baseProgress);
27
+
28
+ if (baseProgress < 100) {
29
+ setTimeout(() => increment(), 100);
30
+ }
31
+ };
32
+
33
+ increment();
34
+ };
35
+
36
+ const setProgressFileName = (fileName: FileItem, progress = 0) => {
37
+ setFileNames((previousFileNames) => {
38
+ const fileNameIndex = previousFileNames.findIndex((fn) => fn.file === fileName.file);
39
+
40
+ if (fileNameIndex === -1) {
41
+ return [...previousFileNames, fileName];
42
+ }
43
+
44
+ return previousFileNames.map((previousFileName, index) => {
45
+ if (fileNameIndex !== index) return previousFileName;
46
+
47
+ return {
48
+ ...previousFileName,
49
+ progress,
50
+ status: progress >= 100 ? 'completed' : 'uploading',
51
+ };
52
+ });
53
+ });
54
+ };
55
+
56
+ const uploadFiles = (fileList: File[]) => {
57
+ if (!errorOccured && (fileList.length > 1 || fileNames.length > 0)) {
58
+ const randomErrorIndex = randomBetween(fileList.length - 1);
59
+ setFileNames((previousFileNames) => [
60
+ ...previousFileNames,
61
+ { file: fileList[randomErrorIndex], status: 'error' },
62
+ ]);
63
+ setErrorOccured(true);
64
+
65
+ if (fileList.length <= 1) {
66
+ return;
67
+ }
68
+
69
+ fileList.splice(randomErrorIndex, 1);
70
+ }
71
+
72
+ fileList.forEach((file) => {
73
+ const fileItem: FileItem = {
17
74
  file,
18
- status: 'completed',
75
+ status: 'uploading',
76
+ progress: 0,
19
77
  };
78
+
79
+ imitateUploading(fileItem);
20
80
  });
81
+ };
82
+
83
+ const retryUploadFile = (file: File) => {
84
+ uploadFiles([file]);
85
+ };
21
86
 
22
- setFileNames(files);
87
+ const deleteUploadedFile = (file: File) => {
88
+ setFileNames((previousFileNames) => previousFileNames.filter((fileName) => fileName.file !== file));
23
89
  };
24
90
 
25
91
  return (
26
92
  <div>
27
93
  <FileUploader
28
- onChange={onChangeHandler}
94
+ onChange={uploadFiles}
29
95
  multiple={multiple}
30
96
  title={title}
31
97
  formatLabel={formatLabel}
32
98
  sizeLabel={sizeLabel}
99
+ accept={['image/png', 'application/pdf', 'image/jpeg']}
33
100
  sampleFileLink={
34
101
  <Link
35
102
  href="http://www.adobe.com/content/dam/Adobe/en/accessibility/pdfs/accessing-pdf-sr.pdf"
@@ -40,32 +107,100 @@ export const all = () => {
40
107
  </Link>
41
108
  }
42
109
  />
43
- <FileUploaderList fileList={fileNames} className="mt-4" />
110
+ <FileUploaderList onDelete={deleteUploadedFile} onRetry={retryUploadFile} fileList={fileNames} className="mt-4" />
44
111
  </div>
45
112
  );
46
113
  };
47
114
 
48
115
  const customCode = `() => {
49
116
  const [fileNames, setFileNames] = React.useState([]);
117
+ const [errorOccured, setErrorOccured] = React.useState(false);
50
118
 
51
- const onChangeHandler = (fileList) => {
52
- const files = fileList.map(file => {
53
- return {
54
- file,
55
- status: 'completed',
119
+ const randomBetween = (value) => Math.round(Math.random() * value);
120
+
121
+ const imitateUploading = (fileItem) => {
122
+ const randomProgressChunks = [5, 8, 13];
123
+ const randomChunkIndex = randomBetween(randomProgressChunks.length - 1);
124
+ const progressChunk = randomProgressChunks[randomChunkIndex];
125
+ let baseProgress = fileItem.progress || 0;
126
+
127
+ const increment = () => {
128
+ baseProgress += progressChunk;
129
+ setProgressFileName(fileItem, baseProgress);
130
+
131
+ if (baseProgress < 100) {
132
+ setTimeout(() => increment(), 100);
133
+ }
134
+ };
135
+
136
+ increment();
137
+ };
138
+
139
+ const setProgressFileName = (fileName, progress = 0) => {
140
+ setFileNames((previousFileNames) => {
141
+ const fileNameIndex = previousFileNames.findIndex((fn) => fn.file === fileName.file);
142
+
143
+ if (fileNameIndex === -1) {
144
+ return [...previousFileNames, fileName];
145
+ }
146
+
147
+ return previousFileNames.map((previousFileName, index) => {
148
+ if (fileNameIndex !== index) return previousFileName;
149
+
150
+ return {
151
+ ...previousFileName,
152
+ status: progress >= 100 ? 'completed' : 'uploading',
153
+ progress,
154
+ };
155
+ });
156
+ });
157
+ };
158
+
159
+ const uploadFiles = (fileList) => {
160
+ if ((!errorOccured && (fileList.length > 1 || fileNames.length > 0))) {
161
+ const randomErrorIndex = randomBetween(fileList.length - 1);
162
+ setFileNames((previousFileNames) => [
163
+ ...previousFileNames,
164
+ { file: fileList[randomErrorIndex], status: 'error' },
165
+ ]);
166
+ setErrorOccured(true);
167
+
168
+ if (fileList.length <= 1) {
169
+ return;
56
170
  }
171
+
172
+ fileList.splice(randomErrorIndex, 1);
173
+ }
174
+
175
+ fileList.forEach((file) => {
176
+ const fileItem = {
177
+ file,
178
+ status: 'uploading',
179
+ progress: 0,
180
+ };
181
+
182
+ imitateUploading(fileItem);
57
183
  });
184
+ };
185
+
186
+ const retryUploadFile = (file) => {
187
+ uploadFiles([file]);
188
+ };
58
189
 
59
- setFileNames(files);
190
+ const deleteUploadedFile = (file) => {
191
+ setFileNames((previousFileNames) => previousFileNames.filter(fileName => fileName.file !== file));
60
192
  };
61
193
 
62
194
  return (
63
195
  <div>
64
196
  <FileUploader
65
- onChange={onChangeHandler}
66
- multiple={true}
67
- formatLabel='Accepted formats: PDF, jpg'
68
- sampleFileLink={(
197
+ onChange={uploadFiles}
198
+ multiple
199
+ title="Upload files"
200
+ accept={['image/png', 'application/pdf', 'image/jpeg']}
201
+ formatLabel="Accepted formats: pdf, jpg, jpeg, png"
202
+ sizeLabel="Maximum size: 25 MB"
203
+ sampleFileLink={
69
204
  <Link
70
205
  href="http://www.adobe.com/content/dam/Adobe/en/accessibility/pdfs/accessing-pdf-sr.pdf"
71
206
  download="Test.pdf"
@@ -73,9 +208,9 @@ const customCode = `() => {
73
208
  >
74
209
  Download sample file
75
210
  </Link>
76
- )}
211
+ }
77
212
  />
78
- <FileUploaderList fileList={fileNames} className="mt-4" />
213
+ <FileUploaderList onDelete={deleteUploadedFile} onRetry={retryUploadFile} fileList={fileNames} className="mt-4" />
79
214
  </div>
80
215
  );
81
216
  }`;
@@ -235,7 +235,7 @@ export const InputMask = React.forwardRef<HTMLInputElement, InputMaskProps>((pro
235
235
  if (deferId.current) window.cancelAnimationFrame(deferId.current);
236
236
  };
237
237
 
238
- const onClearHandler = (e: React.MouseEvent<HTMLElement>) => {
238
+ const onClearHandler = (e: React.MouseEvent<HTMLElement> | React.KeyboardEvent<HTMLElement>) => {
239
239
  // setValue('');
240
240
  // window.requestAnimationFrame(() => ref.current!.blur());
241
241
  setValue(getPlaceholderValue());
@@ -12,6 +12,7 @@ exports[`Input Mask component
12
12
  <div
13
13
  class="Input Input--regular"
14
14
  data-test="DesignSystem-InputWrapper"
15
+ role="presentation"
15
16
  style="min-width: 256px;"
16
17
  >
17
18
  <input
@@ -140,6 +140,7 @@ exports[`Pagination component
140
140
  <div
141
141
  class="MetricInput MetricInput--regular Pagination-MetricInput"
142
142
  data-test="DesignSystem-MetricInputWrapper"
143
+ role="presentation"
143
144
  >
144
145
  <input
145
146
  class="MetricInput-input MetricInput-input--regular"
@@ -150,19 +151,22 @@ exports[`Pagination component
150
151
  />
151
152
  <div
152
153
  class="MetricInput-arrowIcons"
153
- tabindex="0"
154
154
  >
155
155
  <i
156
156
  class="material-icons material-icons-round Icon MetricInput-arrowIcon MetricInput-arrowIcon--regular MetricInput-arrowIcon--up"
157
157
  data-test="DesignSystem-MetricInput--upIcon"
158
+ role="button"
158
159
  style="font-size: 12px; width: 12px;"
160
+ tabindex="0"
159
161
  >
160
162
  keyboard_arrow_up_round
161
163
  </i>
162
164
  <i
163
165
  class="material-icons material-icons-round Icon MetricInput-arrowIcon MetricInput-arrowIcon--regular MetricInput-arrowIcon--down"
164
166
  data-test="DesignSystem-MetricInput--downIcon"
167
+ role="button"
165
168
  style="font-size: 12px; width: 12px;"
169
+ tabindex="0"
166
170
  >
167
171
  keyboard_arrow_down_round
168
172
  </i>
@@ -30,6 +30,8 @@ export const Step = (props: StepProps) => {
30
30
  const appearance = active ? 'link' : disabled ? 'disabled' : 'default';
31
31
 
32
32
  return (
33
+ // TODO(a11y)
34
+ // eslint-disable-next-line
33
35
  <div data-test="DesignSystem-Step" className={StepClass} onClick={onClickHandle}>
34
36
  <Icon
35
37
  data-test="DesignSystem-Step--Icon"
@@ -189,6 +189,8 @@ export const Tabs = (props: TabsProps) => {
189
189
  });
190
190
 
191
191
  return (
192
+ // TODO(a11y)
193
+ // eslint-disable-next-line
192
194
  <div
193
195
  ref={(element) => element && !disabled && tabRefs.push(element)}
194
196
  data-test="DesignSystem-Tabs--Tab"
@@ -52,6 +52,8 @@ export const TabsWrapper = (props: TabsWrapperProps) => {
52
52
  });
53
53
 
54
54
  return (
55
+ // TODO(a11y)
56
+ // eslint-disable-next-line
55
57
  <div
56
58
  data-test="DesignSystem-Tabs--Header"
57
59
  key={index}
@@ -54,7 +54,7 @@ const customCode = `() => {
54
54
 
55
55
  const onTabChangeHandler = (tabIndex) => {
56
56
  setActiveIndex(tabIndex);
57
- console.log(\`\tab-change: \${tabIndex}\`)();
57
+ console.log(\`tab-change: \${tabIndex}\`)();
58
58
  };
59
59
 
60
60
  return (
@@ -156,7 +156,7 @@ const VerificationCodeInput = (props: VerificationCodeInputProps) => {
156
156
  const prev = refs[prevIndex];
157
157
  const nextRef = refs[nextIndex];
158
158
  switch (e.key) {
159
- case KEY_CODE.backspace:
159
+ case KEY_CODE.backspace: {
160
160
  e.preventDefault();
161
161
  const vals = [...values];
162
162
  if (values[index]) {
@@ -168,26 +168,30 @@ const VerificationCodeInput = (props: VerificationCodeInputProps) => {
168
168
  setValues(vals);
169
169
  }
170
170
  break;
171
- case KEY_CODE.left:
171
+ }
172
+ case KEY_CODE.left: {
172
173
  e.preventDefault();
173
174
  if (prev && prev.current) {
174
175
  prev.current.focus({ preventScroll: true });
175
176
  }
176
177
  break;
177
- case KEY_CODE.right:
178
+ }
179
+ case KEY_CODE.right: {
178
180
  e.preventDefault();
179
181
  if (nextRef && nextRef.current) {
180
182
  nextRef.current.focus({ preventScroll: true });
181
183
  }
182
184
  break;
185
+ }
183
186
  case KEY_CODE.up:
184
187
  case KEY_CODE.down:
185
188
  case KEY_CODE.e:
186
- case KEY_CODE.E:
189
+ case KEY_CODE.E: {
187
190
  if (type === 'number') {
188
191
  e.preventDefault();
189
192
  }
190
193
  break;
194
+ }
191
195
  default:
192
196
  break;
193
197
  }
@@ -1,6 +1,6 @@
1
1
  import * as React from 'react';
2
2
  import { VerificationCodeInput, Label } from '@/index';
3
- import { select, text, boolean, number } from '@storybook/addon-knobs';
3
+ import { select, text, boolean } from '@storybook/addon-knobs';
4
4
  import { action } from '@storybook/addon-actions';
5
5
 
6
6
  // CSF format story
@@ -38,6 +38,8 @@ export const all = () => {
38
38
  placeholder={placeholder}
39
39
  error={error}
40
40
  pattern={pattern}
41
+ // TODO(a11y)
42
+ // eslint-disable-next-line
41
43
  autoFocus={autoFocus}
42
44
  />
43
45
  </>
@@ -12,6 +12,7 @@ exports[`VerificationCodeInput component
12
12
  <div
13
13
  class="Input Input--large VerificationCodeInput-Input"
14
14
  data-test="DesignSystem-InputWrapper"
15
+ role="presentation"
15
16
  style="min-width: 40px;"
16
17
  >
17
18
  <input