@databiosphere/findable-ui 21.4.0 → 22.0.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 (208) hide show
  1. package/.release-please-manifest.json +1 -1
  2. package/.storybook/main.ts +7 -1
  3. package/CHANGELOG.md +17 -0
  4. package/lib/components/DataDictionary/components/Entities/constants.d.ts +2 -0
  5. package/lib/components/DataDictionary/components/Entities/constants.js +6 -0
  6. package/lib/components/DataDictionary/components/Entities/entities.d.ts +2 -0
  7. package/lib/components/DataDictionary/components/Entities/entities.js +7 -0
  8. package/lib/components/DataDictionary/components/Entities/types.d.ts +4 -0
  9. package/lib/components/DataDictionary/components/Entities/types.js +1 -0
  10. package/lib/components/DataDictionary/components/Entity/constants.d.ts +2 -0
  11. package/lib/components/DataDictionary/components/Entity/constants.js +5 -0
  12. package/lib/components/DataDictionary/components/Entity/entity.d.ts +2 -0
  13. package/lib/components/DataDictionary/components/Entity/entity.js +14 -0
  14. package/lib/components/DataDictionary/components/Entity/types.d.ts +4 -0
  15. package/lib/components/DataDictionary/components/Entity/types.js +1 -0
  16. package/lib/components/DataDictionary/components/Table/columns/columnDef.d.ts +6 -0
  17. package/lib/components/DataDictionary/components/Table/columns/columnDef.js +33 -0
  18. package/lib/components/DataDictionary/components/Table/columns/columnIdentifier.d.ts +5 -0
  19. package/lib/components/DataDictionary/components/Table/columns/columnIdentifier.js +5 -0
  20. package/lib/components/DataDictionary/components/Table/columns/types.d.ts +2 -0
  21. package/lib/components/DataDictionary/components/Table/columns/types.js +1 -0
  22. package/lib/components/DataDictionary/components/Table/components/BasicCell/basicCell.d.ts +2 -0
  23. package/lib/components/DataDictionary/components/Table/components/BasicCell/basicCell.js +6 -0
  24. package/lib/components/DataDictionary/components/Table/components/BasicCell/types.d.ts +4 -0
  25. package/lib/components/DataDictionary/components/Table/components/BasicCell/types.js +1 -0
  26. package/lib/components/DataDictionary/components/Table/hook.d.ts +3 -0
  27. package/lib/components/DataDictionary/components/Table/hook.js +11 -0
  28. package/lib/components/DataDictionary/components/Table/options/core/constants.d.ts +3 -0
  29. package/lib/components/DataDictionary/components/Table/options/core/constants.js +7 -0
  30. package/lib/components/DataDictionary/components/Table/options/hook.d.ts +3 -0
  31. package/lib/components/DataDictionary/components/Table/options/hook.js +8 -0
  32. package/lib/components/DataDictionary/components/Table/options/sorting/constants.d.ts +3 -0
  33. package/lib/components/DataDictionary/components/Table/options/sorting/constants.js +3 -0
  34. package/lib/components/DataDictionary/components/Table/table.d.ts +2 -0
  35. package/lib/components/DataDictionary/components/Table/table.js +17 -0
  36. package/lib/components/DataDictionary/components/Table/table.styles.d.ts +3 -0
  37. package/lib/components/DataDictionary/components/Table/table.styles.js +5 -0
  38. package/lib/components/DataDictionary/components/Table/types.d.ts +5 -0
  39. package/lib/components/DataDictionary/components/Table/types.js +1 -0
  40. package/lib/components/DataDictionary/dataDictionary.d.ts +2 -0
  41. package/lib/components/DataDictionary/dataDictionary.js +9 -0
  42. package/lib/components/DataDictionary/dataDictionary.styles.d.ts +1 -0
  43. package/lib/components/DataDictionary/dataDictionary.styles.js +7 -0
  44. package/lib/components/DataDictionary/hooks/UseDataDictionary/hook.d.ts +2 -0
  45. package/lib/components/DataDictionary/hooks/UseDataDictionary/hook.js +5 -0
  46. package/lib/components/DataDictionary/hooks/UseDataDictionary/types.d.ts +4 -0
  47. package/lib/components/DataDictionary/hooks/UseDataDictionary/types.js +1 -0
  48. package/lib/components/Detail/detail.stories.d.ts +36 -5
  49. package/lib/components/Detail/detail.stories.js +27 -18
  50. package/lib/components/Export/components/ExportMethod/exportMethod.stories.d.ts +22 -5
  51. package/lib/components/Export/components/ExportMethod/exportMethod.stories.js +9 -9
  52. package/lib/components/Filter/components/Filter/filter.stories.d.ts +25 -5
  53. package/lib/components/Filter/components/Filter/filter.stories.js +25 -24
  54. package/lib/components/Filter/components/FilterLabel/filterLabel.stories.d.ts +31 -5
  55. package/lib/components/Filter/components/FilterLabel/filterLabel.stories.js +10 -8
  56. package/lib/components/Filter/components/FilterMenu/filterMenu.stories.d.ts +38 -5
  57. package/lib/components/Filter/components/FilterMenu/filterMenu.stories.js +107 -104
  58. package/lib/components/Filter/components/FilterTag/filterTag.stories.d.ts +16 -5
  59. package/lib/components/Filter/components/FilterTag/filterTag.stories.js +8 -7
  60. package/lib/components/Filter/components/FilterTags/filterTags.stories.d.ts +18 -5
  61. package/lib/components/Filter/components/FilterTags/filterTags.stories.js +40 -39
  62. package/lib/components/Index/components/AzulFileDownload/azulFileDownload.stories.d.ts +8 -5
  63. package/lib/components/Index/components/AzulFileDownload/azulFileDownload.stories.js +9 -6
  64. package/lib/components/Index/components/Hero/components/Summaries/summaries.stories.d.ts +13 -5
  65. package/lib/components/Index/components/Hero/components/Summaries/summaries.stories.js +11 -11
  66. package/lib/components/Index/components/Hero/hero.stories.d.ts +23 -5
  67. package/lib/components/Index/components/Hero/hero.stories.js +8 -6
  68. package/lib/components/Index/components/NTagCell/nTagCell.stories.d.ts +16 -5
  69. package/lib/components/Index/components/NTagCell/nTagCell.stories.js +8 -8
  70. package/lib/components/Index/index.stories.js +2 -1
  71. package/lib/components/Layout/components/BackPage/backPageView.stories.d.ts +31 -5
  72. package/lib/components/Layout/components/BackPage/backPageView.stories.js +27 -18
  73. package/lib/components/Layout/components/Footer/footer.stories.d.ts +24 -3
  74. package/lib/components/Layout/components/Footer/footer.stories.js +4 -3
  75. package/lib/components/Layout/components/Header/header.stories.js +1 -1
  76. package/lib/components/Layout/components/Sidebar/components/SidebarLabel/sidebarLabel.stories.d.ts +13 -5
  77. package/lib/components/Layout/components/Sidebar/components/SidebarLabel/sidebarLabel.stories.js +6 -6
  78. package/lib/components/Layout/components/Sidebar/sidebar.stories.js +2 -0
  79. package/lib/components/Links/links.stories.d.ts +13 -5
  80. package/lib/components/Links/links.stories.js +14 -14
  81. package/lib/components/Loading/loading.stories.d.ts +34 -5
  82. package/lib/components/Loading/loading.stories.js +8 -6
  83. package/lib/components/Project/components/CollaboratingOrganizations/collaboratingOrganizations.stories.d.ts +13 -5
  84. package/lib/components/Project/components/CollaboratingOrganizations/collaboratingOrganizations.stories.js +20 -20
  85. package/lib/components/Project/components/Contacts/contacts.stories.d.ts +13 -5
  86. package/lib/components/Project/components/Contacts/contacts.stories.js +18 -18
  87. package/lib/components/Project/components/Contributors/contributors.stories.d.ts +8 -5
  88. package/lib/components/Project/components/Contributors/contributors.stories.js +27 -27
  89. package/lib/components/Project/components/DataCurators/dataCurators.stories.d.ts +13 -5
  90. package/lib/components/Project/components/DataCurators/dataCurators.stories.js +7 -7
  91. package/lib/components/Project/components/DataReleasePolicy/dataReleasePolicy.stories.d.ts +8 -5
  92. package/lib/components/Project/components/DataReleasePolicy/dataReleasePolicy.stories.js +3 -4
  93. package/lib/components/Project/components/Description/description.stories.d.ts +8 -5
  94. package/lib/components/Project/components/Description/description.stories.js +6 -6
  95. package/lib/components/Project/components/Details/details.stories.d.ts +16 -5
  96. package/lib/components/Project/components/Details/details.stories.js +7 -7
  97. package/lib/components/Project/components/Publications/publications.stories.d.ts +8 -5
  98. package/lib/components/Project/components/Publications/publications.stories.js +17 -17
  99. package/lib/components/Project/components/SupplementaryLinks/supplementaryLinks.stories.d.ts +8 -5
  100. package/lib/components/Project/components/SupplementaryLinks/supplementaryLinks.stories.js +18 -18
  101. package/lib/components/Support/components/SupportRequest/components/SupportRequestForm/common/constants.d.ts +16 -33
  102. package/lib/components/Support/components/SupportRequest/components/SupportRequestForm/common/constants.js +10 -9
  103. package/lib/components/Support/components/SupportRequest/components/SupportRequestForm/supportRequestForm.js +26 -14
  104. package/lib/components/Support/components/ViewSupport/types.d.ts +6 -0
  105. package/lib/components/Support/components/ViewSupport/types.js +1 -0
  106. package/lib/components/Support/components/ViewSupport/viewSupport.d.ts +2 -9
  107. package/lib/components/Support/components/ViewSupport/viewSupport.js +7 -3
  108. package/lib/components/Table/components/Pagination/pagination.stories.d.ts +28 -5
  109. package/lib/components/Table/components/Pagination/pagination.stories.js +11 -7
  110. package/lib/components/common/Accordion/accordion.stories.d.ts +6 -3
  111. package/lib/components/common/Accordion/accordion.stories.js +2 -1
  112. package/lib/components/common/Breadcrumbs/breadcrumbs.stories.d.ts +10 -7
  113. package/lib/components/common/Breadcrumbs/breadcrumbs.stories.js +42 -43
  114. package/lib/components/common/Button/components/CallToActionButton/callToActionButton.stories.d.ts +9 -6
  115. package/lib/components/common/Button/components/CallToActionButton/callToActionButton.stories.js +13 -15
  116. package/lib/components/common/Button/components/HelpIconButton/helpIconButton.stories.d.ts +19 -2
  117. package/lib/components/common/Button/components/HelpIconButton/helpIconButton.stories.js +2 -2
  118. package/lib/components/common/Card/card.stories.d.ts +6 -3
  119. package/lib/components/common/Card/card.stories.js +2 -1
  120. package/lib/components/common/Code/code.stories.d.ts +5 -3
  121. package/lib/components/common/CopyToClipboard/copyToClipboard.stories.d.ts +11 -3
  122. package/lib/components/common/CopyToClipboard/copyToClipboard.stories.js +2 -1
  123. package/lib/components/common/Section/components/SectionTitle/sectionTitle.stories.d.ts +13 -5
  124. package/lib/components/common/Section/components/SectionTitle/sectionTitle.stories.js +6 -6
  125. package/lib/components/common/Socials/socials.stories.d.ts +11 -3
  126. package/lib/components/common/Socials/socials.stories.js +2 -1
  127. package/lib/components/common/StaticImage/staticImage.stories.d.ts +22 -5
  128. package/lib/components/common/StaticImage/staticImage.stories.js +8 -8
  129. package/lib/components/common/StatusIcon/statusIcon.stories.d.ts +19 -5
  130. package/lib/components/common/StatusIcon/statusIcon.stories.js +7 -7
  131. package/lib/components/common/Tag/tag.stories.d.ts +15 -5
  132. package/lib/components/common/Tag/tag.stories.js +7 -5
  133. package/lib/components/common/ToggleButtonGroup/toggleButtonGroup.stories.d.ts +18 -5
  134. package/lib/components/common/ToggleButtonGroup/toggleButtonGroup.stories.js +19 -19
  135. package/lib/styles/common/mui/typography.js +1 -0
  136. package/lib/views/DataDictionaryView/dataDictionaryView.d.ts +2 -0
  137. package/lib/views/DataDictionaryView/dataDictionaryView.js +5 -0
  138. package/package.json +13 -13
  139. package/src/components/DataDictionary/components/Entities/constants.ts +8 -0
  140. package/src/components/DataDictionary/components/Entities/entities.tsx +15 -0
  141. package/src/components/DataDictionary/components/Entities/types.ts +5 -0
  142. package/src/components/DataDictionary/components/Entity/constants.ts +7 -0
  143. package/src/components/DataDictionary/components/Entity/entity.tsx +28 -0
  144. package/src/components/DataDictionary/components/Entity/types.ts +5 -0
  145. package/src/components/DataDictionary/components/Table/columns/columnDef.ts +47 -0
  146. package/src/components/DataDictionary/components/Table/columns/columnIdentifier.ts +5 -0
  147. package/src/components/DataDictionary/components/Table/columns/types.ts +3 -0
  148. package/src/components/DataDictionary/components/Table/components/BasicCell/basicCell.tsx +8 -0
  149. package/src/components/DataDictionary/components/Table/components/BasicCell/types.ts +5 -0
  150. package/src/components/DataDictionary/components/Table/hook.ts +13 -0
  151. package/src/components/DataDictionary/components/Table/options/core/constants.ts +12 -0
  152. package/src/components/DataDictionary/components/Table/options/hook.ts +14 -0
  153. package/src/components/DataDictionary/components/Table/options/sorting/constants.ts +9 -0
  154. package/src/components/DataDictionary/components/Table/table.styles.ts +6 -0
  155. package/src/components/DataDictionary/components/Table/table.tsx +35 -0
  156. package/src/components/DataDictionary/components/Table/types.ts +6 -0
  157. package/src/components/DataDictionary/dataDictionary.styles.ts +8 -0
  158. package/src/components/DataDictionary/dataDictionary.tsx +16 -0
  159. package/src/components/DataDictionary/hooks/UseDataDictionary/hook.ts +9 -0
  160. package/src/components/DataDictionary/hooks/UseDataDictionary/types.ts +5 -0
  161. package/src/components/Detail/detail.stories.tsx +41 -36
  162. package/src/components/Export/components/ExportMethod/exportMethod.stories.tsx +13 -13
  163. package/src/components/Filter/components/Filter/filter.stories.tsx +29 -28
  164. package/src/components/Filter/components/FilterLabel/filterLabel.stories.tsx +14 -12
  165. package/src/components/Filter/components/FilterMenu/filterMenu.stories.tsx +111 -108
  166. package/src/components/Filter/components/FilterTag/filterTag.stories.tsx +12 -11
  167. package/src/components/Filter/components/FilterTags/filterTags.stories.tsx +44 -43
  168. package/src/components/Index/components/AzulFileDownload/azulFileDownload.stories.tsx +13 -10
  169. package/src/components/Index/components/Hero/components/Summaries/summaries.stories.tsx +15 -15
  170. package/src/components/Index/components/Hero/hero.stories.tsx +12 -8
  171. package/src/components/Index/components/NTagCell/nTagCell.stories.tsx +12 -12
  172. package/src/components/Index/index.stories.tsx +2 -1
  173. package/src/components/Layout/components/BackPage/backPageView.stories.tsx +42 -36
  174. package/src/components/Layout/components/Footer/footer.stories.tsx +6 -4
  175. package/src/components/Layout/components/Header/header.stories.tsx +1 -1
  176. package/src/components/Layout/components/Sidebar/components/SidebarLabel/sidebarLabel.stories.tsx +10 -10
  177. package/src/components/Layout/components/Sidebar/sidebar.stories.tsx +2 -0
  178. package/src/components/Links/links.stories.tsx +18 -18
  179. package/src/components/Loading/loading.stories.tsx +12 -10
  180. package/src/components/Project/components/CollaboratingOrganizations/collaboratingOrganizations.stories.tsx +24 -25
  181. package/src/components/Project/components/Contacts/contacts.stories.tsx +22 -22
  182. package/src/components/Project/components/Contributors/contributors.stories.tsx +31 -31
  183. package/src/components/Project/components/DataCurators/dataCurators.stories.tsx +11 -11
  184. package/src/components/Project/components/DataReleasePolicy/dataReleasePolicy.stories.tsx +7 -8
  185. package/src/components/Project/components/Description/description.stories.tsx +11 -11
  186. package/src/components/Project/components/Details/details.stories.tsx +11 -11
  187. package/src/components/Project/components/Publications/publications.stories.tsx +23 -23
  188. package/src/components/Project/components/SupplementaryLinks/supplementaryLinks.stories.tsx +22 -22
  189. package/src/components/Support/components/SupportRequest/components/SupportRequestForm/common/constants.ts +10 -9
  190. package/src/components/Support/components/SupportRequest/components/SupportRequestForm/supportRequestForm.tsx +44 -15
  191. package/src/components/Support/components/ViewSupport/types.ts +9 -0
  192. package/src/components/Support/components/ViewSupport/viewSupport.tsx +6 -10
  193. package/src/components/Table/components/Pagination/pagination.stories.tsx +15 -11
  194. package/src/components/common/Accordion/accordion.stories.tsx +4 -2
  195. package/src/components/common/Breadcrumbs/breadcrumbs.stories.tsx +46 -47
  196. package/src/components/common/Button/components/CallToActionButton/callToActionButton.stories.tsx +17 -20
  197. package/src/components/common/Button/components/HelpIconButton/helpIconButton.stories.tsx +4 -4
  198. package/src/components/common/Card/card.stories.tsx +4 -2
  199. package/src/components/common/Code/code.stories.tsx +1 -1
  200. package/src/components/common/CopyToClipboard/copyToClipboard.stories.tsx +4 -2
  201. package/src/components/common/Section/components/SectionTitle/sectionTitle.stories.tsx +10 -10
  202. package/src/components/common/Socials/socials.stories.tsx +4 -2
  203. package/src/components/common/StaticImage/staticImage.stories.tsx +12 -12
  204. package/src/components/common/StatusIcon/statusIcon.stories.tsx +11 -11
  205. package/src/components/common/Tag/tag.stories.tsx +11 -9
  206. package/src/components/common/ToggleButtonGroup/toggleButtonGroup.stories.tsx +23 -23
  207. package/src/styles/common/mui/typography.ts +1 -0
  208. package/src/views/DataDictionaryView/dataDictionaryView.tsx +9 -0
@@ -7,7 +7,7 @@ import React, {
7
7
  useState,
8
8
  } from "react";
9
9
  import { FileRejection } from "react-dropzone";
10
- import validate from "validate.js";
10
+ import { ValidationError } from "yup";
11
11
  import { TEXT_BODY_400 } from "../../../../../../theme/common/typography";
12
12
  import { ButtonPrimary } from "../../../../../common/Button/components/ButtonPrimary/buttonPrimary";
13
13
  import { Input } from "../../../../../common/Form/components/Input/input";
@@ -21,18 +21,17 @@ import {
21
21
  import { SupportRequest } from "../../supportRequest";
22
22
  import Dropzone from "../Dropzone/dropzone";
23
23
  import {
24
- CONSTRAINTS,
25
24
  DEFAULT_FORM_STATE,
26
25
  DRAGGING_STYLE,
27
26
  MAX_ATTACHMENT_SIZE,
28
27
  OPTIONS,
28
+ VALIDATION_SCHEMA,
29
29
  } from "./common/constants";
30
30
  import {
31
31
  FORM_CONTROL_LABEL,
32
32
  FORM_CONTROL_NAME,
33
33
  FormState,
34
34
  RequestValue,
35
- ValidateResponse,
36
35
  } from "./common/entities";
37
36
  import { createSupportRequest, uploadAttachment } from "./common/utils";
38
37
  import { Section, Title } from "./supportRequestForm.styles";
@@ -47,7 +46,23 @@ export const SupportRequestForm = ({
47
46
  supportRequest,
48
47
  }: SupportRequestFormProps): JSX.Element => {
49
48
  const [formState, setFormState] = useState<FormState>(DEFAULT_FORM_STATE);
50
- const errors = validate(buildSupportRequest(formState), CONSTRAINTS); // Determine error state of form
49
+ const [errorFields, setErrorFields] = useState<Set<string>>();
50
+
51
+ // Validate form state when it changes.
52
+ React.useEffect(() => {
53
+ VALIDATION_SCHEMA.validate(buildSupportRequest(formState), {
54
+ abortEarly: false,
55
+ })
56
+ .then(() => setErrorFields(undefined))
57
+ .catch((aggregateError: ValidationError) => {
58
+ const fields = new Set<string>();
59
+ for (const error of aggregateError.inner) {
60
+ if (error.path) fields.add(error.path);
61
+ }
62
+ setErrorFields(fields);
63
+ });
64
+ }, [formState]);
65
+
51
66
  const { FIELD_ID, requestURL, uploadURL } = supportRequest;
52
67
 
53
68
  // Delete attachment.
@@ -177,7 +192,11 @@ export const SupportRequestForm = ({
177
192
  </Section>
178
193
  <Section>
179
194
  <Input
180
- error={isFieldError(formState, errors, FORM_CONTROL_NAME.NAME)}
195
+ error={isFieldError(
196
+ formState,
197
+ errorFields,
198
+ FORM_CONTROL_NAME.NAME
199
+ )}
181
200
  isFilled={Boolean(formState[FORM_CONTROL_NAME.NAME])}
182
201
  label={FORM_CONTROL_LABEL.NAME}
183
202
  name={FORM_CONTROL_NAME.NAME}
@@ -185,7 +204,11 @@ export const SupportRequestForm = ({
185
204
  onChange={onInputChange}
186
205
  />
187
206
  <Input
188
- error={isFieldError(formState, errors, FORM_CONTROL_NAME.EMAIL)}
207
+ error={isFieldError(
208
+ formState,
209
+ errorFields,
210
+ FORM_CONTROL_NAME.EMAIL
211
+ )}
189
212
  isFilled={Boolean(formState[FORM_CONTROL_NAME.EMAIL])}
190
213
  label={FORM_CONTROL_LABEL.EMAIL}
191
214
  name={FORM_CONTROL_NAME.EMAIL}
@@ -194,7 +217,11 @@ export const SupportRequestForm = ({
194
217
  />
195
218
  <Select
196
219
  displayEmpty={true}
197
- error={isFieldError(formState, errors, FORM_CONTROL_NAME.TYPE)}
220
+ error={isFieldError(
221
+ formState,
222
+ errorFields,
223
+ FORM_CONTROL_NAME.TYPE
224
+ )}
198
225
  isFilled={Boolean(formState[FORM_CONTROL_NAME.TYPE])}
199
226
  label={FORM_CONTROL_LABEL.TYPE}
200
227
  name={FORM_CONTROL_NAME.TYPE}
@@ -211,7 +238,11 @@ export const SupportRequestForm = ({
211
238
  ))}
212
239
  </Select>
213
240
  <Input
214
- error={isFieldError(formState, errors, FORM_CONTROL_NAME.SUBJECT)}
241
+ error={isFieldError(
242
+ formState,
243
+ errorFields,
244
+ FORM_CONTROL_NAME.SUBJECT
245
+ )}
215
246
  isFilled={Boolean(formState[FORM_CONTROL_NAME.SUBJECT])}
216
247
  label={FORM_CONTROL_LABEL.SUBJECT}
217
248
  name={FORM_CONTROL_NAME.SUBJECT}
@@ -221,7 +252,7 @@ export const SupportRequestForm = ({
221
252
  <Input
222
253
  error={isFieldError(
223
254
  formState,
224
- errors,
255
+ errorFields,
225
256
  FORM_CONTROL_NAME.DESCRIPTION
226
257
  )}
227
258
  isFilled={Boolean(formState[FORM_CONTROL_NAME.DESCRIPTION])}
@@ -244,7 +275,7 @@ export const SupportRequestForm = ({
244
275
  <Section>
245
276
  <SectionActions>
246
277
  <ButtonPrimary
247
- disabled={Boolean(errors) || formState.submitting}
278
+ disabled={Boolean(errorFields) || formState.submitting}
248
279
  fullWidth
249
280
  onClick={onSupportRequestSubmitted}
250
281
  id="button-support-request"
@@ -280,18 +311,16 @@ function buildSupportRequest(formState: FormState): RequestValue {
280
311
  /**
281
312
  * Returns true if the given field is touched and has an error.
282
313
  * @param formState - Form state.
283
- * @param error - Validate.js error object.
314
+ * @param errorFields - Set of names of fields that have errors.
284
315
  * @param fieldName - Field name.
285
316
  * @returns true if the given field has an error.
286
317
  */
287
318
  function isFieldError(
288
319
  formState: FormState,
289
- error: ValidateResponse | undefined,
320
+ errorFields: Set<string> | undefined,
290
321
  fieldName: FORM_CONTROL_NAME
291
322
  ): boolean {
292
- const hasError = Boolean(error?.[fieldName]);
293
- const isTouched = Boolean(formState.touched[fieldName]);
294
- return isTouched && hasError;
323
+ return Boolean(formState.touched[fieldName] && errorFields?.has(fieldName));
295
324
  }
296
325
 
297
326
  /**
@@ -0,0 +1,9 @@
1
+ import { AnchorHTMLAttributes, ElementType } from "react";
2
+ import { BaseComponentProps } from "../../../types";
3
+
4
+ export interface ViewSupportProps
5
+ extends AnchorHTMLAttributes<HTMLAnchorElement>,
6
+ BaseComponentProps {
7
+ Icon?: ElementType;
8
+ url: string;
9
+ }
@@ -1,6 +1,7 @@
1
- import React, { ElementType } from "react";
1
+ import React from "react";
2
2
  import { ContactSupportIcon } from "../../../common/CustomIcon/components/ContactSupportIcon/contactSupportIcon";
3
- import { ANCHOR_TARGET } from "../../../Links/common/entities";
3
+ import { ANCHOR_TARGET, REL_ATTRIBUTE } from "../../../Links/common/entities";
4
+ import { ViewSupportProps } from "./types";
4
5
  import { Fab } from "./viewSupport.styles";
5
6
 
6
7
  /**
@@ -8,21 +9,16 @@ import { Fab } from "./viewSupport.styles";
8
9
  * Navigates to support URL provided.
9
10
  */
10
11
 
11
- export interface ViewSupportProps {
12
- className?: string;
13
- Icon?: ElementType;
14
- target?: ANCHOR_TARGET;
15
- url: string;
16
- }
17
-
18
12
  export const ViewSupport = ({
19
13
  className,
20
14
  Icon = ContactSupportIcon,
15
+ rel = REL_ATTRIBUTE.NO_OPENER_NO_REFERRER,
21
16
  target = ANCHOR_TARGET.BLANK,
22
17
  url,
18
+ ...props /* AnchorHTMLAttributes<HTMLAnchorElement> */
23
19
  }: ViewSupportProps): JSX.Element => {
24
20
  return (
25
- <Fab className={className} href={url} target={target}>
21
+ <Fab className={className} href={url} rel={rel} target={target} {...props}>
26
22
  <Icon fontSize="inherit" />
27
23
  </Fab>
28
24
  );
@@ -1,8 +1,7 @@
1
- import { ComponentMeta, ComponentStory } from "@storybook/react";
2
- import React from "react";
1
+ import { Meta, StoryObj } from "@storybook/react";
3
2
  import { Pagination } from "./pagination";
4
3
 
5
- export default {
4
+ const meta = {
6
5
  argTypes: {
7
6
  canNextPage: { control: "boolean" },
8
7
  canPreviousPage: { control: "boolean" },
@@ -13,14 +12,19 @@ export default {
13
12
  },
14
13
  component: Pagination,
15
14
  title: "Components/Table",
16
- } as ComponentMeta<typeof Pagination>;
15
+ } satisfies Meta<typeof Pagination>;
17
16
 
18
- const PaginationTemplate: ComponentStory<typeof Pagination> = (args) => (
19
- <Pagination {...args} />
20
- );
17
+ export default meta;
21
18
 
22
- export const PaginationStory = PaginationTemplate.bind({});
23
- PaginationStory.args = {
24
- currentPage: 1,
25
- totalPage: 25,
19
+ type Story = StoryObj<typeof meta>;
20
+
21
+ export const PaginationStory: Story = {
22
+ args: {
23
+ canNextPage: true,
24
+ canPreviousPage: false,
25
+ currentPage: 1,
26
+ onNextPage: () => {},
27
+ onPreviousPage: () => {},
28
+ totalPage: 25,
29
+ },
26
30
  };
@@ -3,10 +3,12 @@ import { Meta, StoryObj } from "@storybook/react";
3
3
  import React from "react";
4
4
  import { Accordion } from "./accordion";
5
5
 
6
- export default {
6
+ const meta = {
7
7
  component: Accordion,
8
8
  title: "Components/Common/Accordion",
9
- } as Meta<typeof Accordion>;
9
+ } satisfies Meta<typeof Accordion>;
10
+
11
+ export default meta;
10
12
 
11
13
  type Story = StoryObj<typeof Accordion>;
12
14
 
@@ -1,58 +1,57 @@
1
- import { ComponentMeta, ComponentStory } from "@storybook/react";
2
- import React from "react";
1
+ import { Meta, StoryObj } from "@storybook/react";
3
2
  import { Breadcrumbs } from "./breadcrumbs";
4
3
 
5
- export default {
6
- argTypes: {
7
- children: { control: { disabled: true } },
8
- },
4
+ const meta = {
9
5
  component: Breadcrumbs,
10
6
  title: "Components/Common/BreadCrumbs",
11
- } as ComponentMeta<typeof Breadcrumbs>;
7
+ } satisfies Meta<typeof Breadcrumbs>;
8
+
9
+ export default meta;
12
10
 
13
- const BreadcrumbTemplate: ComponentStory<typeof Breadcrumbs> = (args) => (
14
- <Breadcrumbs {...args} />
15
- );
11
+ type Story = StoryObj<typeof meta>;
16
12
 
17
- export const BreadcrumbDefaultStory = BreadcrumbTemplate.bind({});
18
- BreadcrumbDefaultStory.args = {
19
- breadcrumbs: [
20
- {
21
- path: "#",
22
- text: "Home",
23
- },
24
- {
25
- path: "#",
26
- text: "Data Explorer",
27
- },
28
- ],
13
+ export const BreadcrumbDefaultStory: Story = {
14
+ args: {
15
+ breadcrumbs: [
16
+ {
17
+ path: "#",
18
+ text: "Home",
19
+ },
20
+ {
21
+ path: "#",
22
+ text: "Data Explorer",
23
+ },
24
+ ],
25
+ },
29
26
  };
30
27
 
31
- export const BreadcrumbCustomSeparatorStory = BreadcrumbTemplate.bind({});
32
- BreadcrumbCustomSeparatorStory.args = {
33
- Separator: " | ",
34
- breadcrumbs: [
35
- {
36
- path: "#",
37
- text: "Home",
38
- },
39
- {
40
- path: "#",
41
- text: "Data Explorer",
42
- },
43
- ],
28
+ export const BreadcrumbCustomSeparatorStory: Story = {
29
+ args: {
30
+ Separator: " | ",
31
+ breadcrumbs: [
32
+ {
33
+ path: "#",
34
+ text: "Home",
35
+ },
36
+ {
37
+ path: "#",
38
+ text: "Data Explorer",
39
+ },
40
+ ],
41
+ },
44
42
  };
45
43
 
46
- export const BreadcrumbWithLongerTitleStory = BreadcrumbTemplate.bind({});
47
- BreadcrumbWithLongerTitleStory.args = {
48
- breadcrumbs: [
49
- {
50
- path: "#",
51
- text: "Explore",
52
- },
53
- {
54
- path: "#",
55
- text: "A Single-Cell Transcriptomic Map of the Human and Mouse Pancreas Reveals Inter- and Intra-cell Population Structure",
56
- },
57
- ],
44
+ export const BreadcrumbWithLongerTitleStory: Story = {
45
+ args: {
46
+ breadcrumbs: [
47
+ {
48
+ path: "#",
49
+ text: "Explore",
50
+ },
51
+ {
52
+ path: "#",
53
+ text: "A Single-Cell Transcriptomic Map of the Human and Mouse Pancreas Reveals Inter- and Intra-cell Population Structure",
54
+ },
55
+ ],
56
+ },
58
57
  };
@@ -1,19 +1,15 @@
1
- import { ComponentMeta, ComponentStory } from "@storybook/react";
2
- import React from "react";
1
+ import { Meta, StoryObj } from "@storybook/react";
3
2
  import { ANCHOR_TARGET } from "../../../../Links/common/entities";
4
3
  import { CallToAction, CallToActionButton } from "./callToActionButton";
5
4
 
6
- export default {
7
- argTypes: {
8
- children: { control: { disabled: true } },
9
- },
5
+ const meta = {
10
6
  component: CallToActionButton,
11
7
  title: "Components/Common/CallToActionButton",
12
- } as ComponentMeta<typeof CallToActionButton>;
8
+ } satisfies Meta<typeof CallToActionButton>;
9
+
10
+ export default meta;
13
11
 
14
- const CallToActionButtonTemplate: ComponentStory<typeof CallToActionButton> = (
15
- args
16
- ) => <CallToActionButton {...args} />;
12
+ type Story = StoryObj<typeof meta>;
17
13
 
18
14
  const callToAction: CallToAction = {
19
15
  label: "Click here",
@@ -21,16 +17,17 @@ const callToAction: CallToAction = {
21
17
  url: "https://www.google.com",
22
18
  };
23
19
 
24
- export const CallToActionButtonStory = CallToActionButtonTemplate.bind({});
25
- CallToActionButtonStory.args = {
26
- callToAction,
27
- className: "call-to-action-button",
28
- disabled: false,
20
+ export const CallToActionButtonStory: Story = {
21
+ args: {
22
+ callToAction,
23
+ className: "call-to-action-button",
24
+ disabled: false,
25
+ },
29
26
  };
30
27
 
31
- export const CallToActionButtonWithCustomComponentStory =
32
- CallToActionButtonTemplate.bind({});
33
- CallToActionButtonWithCustomComponentStory.args = {
34
- ButtonElType: "a",
35
- callToAction,
28
+ export const CallToActionButtonWithCustomComponentStory: Story = {
29
+ args: {
30
+ ButtonElType: "a",
31
+ callToAction,
32
+ },
36
33
  };
@@ -2,15 +2,15 @@ import { Meta, StoryObj } from "@storybook/react";
2
2
  import { ANCHOR_TARGET } from "../../../../Links/common/entities";
3
3
  import { HelpIconButton } from "./helpIconButton";
4
4
 
5
- const meta: Meta<typeof HelpIconButton> = {
5
+ const meta = {
6
6
  argTypes: {
7
- size: { control: "select" },
8
- target: { control: "select" },
7
+ size: { control: "select", options: ["small", "medium", "large"] },
8
+ target: { control: "select", options: Object.values(ANCHOR_TARGET) },
9
9
  url: { control: "text" },
10
10
  },
11
11
  component: HelpIconButton,
12
12
  title: "Components/Common/HelpIconButton",
13
- };
13
+ } satisfies Meta<typeof HelpIconButton>;
14
14
 
15
15
  export default meta;
16
16
 
@@ -2,10 +2,12 @@ import { Meta, StoryObj } from "@storybook/react";
2
2
  import logo from "../../../images/logo.svg";
3
3
  import { Card } from "./card";
4
4
 
5
- export default {
5
+ const meta = {
6
6
  component: Card,
7
7
  title: "Components/Common/Card",
8
- } as Meta<typeof Card>;
8
+ } satisfies Meta<typeof Card>;
9
+
10
+ export default meta;
9
11
 
10
12
  type Story = StoryObj<typeof Card>;
11
13
 
@@ -4,7 +4,7 @@ import { Code } from "./code";
4
4
  const meta = {
5
5
  component: Code,
6
6
  title: "Components/Common/Code",
7
- } as Meta<typeof Code>;
7
+ } satisfies Meta<typeof Code>;
8
8
 
9
9
  export default meta;
10
10
 
@@ -1,7 +1,7 @@
1
1
  import { Meta, StoryObj } from "@storybook/react";
2
2
  import { CopyToClipboard } from "./copyToClipboard";
3
3
 
4
- export default {
4
+ const meta = {
5
5
  argTypes: {
6
6
  copyStr: {
7
7
  description: "String to be copied",
@@ -9,7 +9,9 @@ export default {
9
9
  },
10
10
  component: CopyToClipboard,
11
11
  title: "Components/Common/CopyToClipboard",
12
- } as Meta<typeof CopyToClipboard>;
12
+ } satisfies Meta<typeof CopyToClipboard>;
13
+
14
+ export default meta;
13
15
 
14
16
  type Story = StoryObj<typeof CopyToClipboard>;
15
17
 
@@ -1,20 +1,20 @@
1
- import { ComponentMeta, ComponentStory } from "@storybook/react";
2
- import React from "react";
1
+ import { Meta, StoryObj } from "@storybook/react";
3
2
  import { SectionTitle } from "./sectionTitle";
4
3
 
5
- export default {
4
+ const meta = {
6
5
  argTypes: {
7
6
  title: { control: "text" },
8
7
  },
9
8
  component: SectionTitle,
10
9
  title: "Components/SectionContent/Title",
11
- } as ComponentMeta<typeof SectionTitle>;
10
+ } satisfies Meta<typeof SectionTitle>;
12
11
 
13
- const SectionTitleTemplate: ComponentStory<typeof SectionTitle> = (args) => (
14
- <SectionTitle {...args} />
15
- );
12
+ export default meta;
16
13
 
17
- export const SectionTitleStory = SectionTitleTemplate.bind({});
18
- SectionTitleStory.args = {
19
- title: "Analysis Portals",
14
+ type Story = StoryObj<typeof meta>;
15
+
16
+ export const SectionTitleStory: Story = {
17
+ args: {
18
+ title: "Analysis Portals",
19
+ },
20
20
  };
@@ -8,13 +8,15 @@ import { XIcon } from "../CustomIcon/components/XIcon/xIcon";
8
8
  import { YouTubeIcon } from "../CustomIcon/components/YouTubeIcon/youTubeIcon";
9
9
  import { Socials } from "./socials";
10
10
 
11
- export default {
11
+ const meta = {
12
12
  argTypes: {
13
13
  socials: { control: "object" },
14
14
  },
15
15
  component: Socials,
16
16
  title: "Components/Navigation/SocialLinks",
17
- } as Meta<typeof Socials>;
17
+ } satisfies Meta<typeof Socials>;
18
+
19
+ export default meta;
18
20
 
19
21
  type Story = StoryObj<typeof Socials>;
20
22
 
@@ -1,9 +1,8 @@
1
- import { ComponentMeta, ComponentStory } from "@storybook/react";
2
- import React from "react";
1
+ import { Meta, StoryObj } from "@storybook/react";
3
2
  import logo from "../../../images/logo.svg";
4
3
  import { StaticImage } from "./staticImage";
5
4
 
6
- export default {
5
+ const meta = {
7
6
  argTypes: {
8
7
  alt: { control: "text" },
9
8
  height: { control: "number" },
@@ -12,15 +11,16 @@ export default {
12
11
  },
13
12
  component: StaticImage,
14
13
  title: "Components/Common/Image/StaticImage",
15
- } as ComponentMeta<typeof StaticImage>;
14
+ } satisfies Meta<typeof StaticImage>;
16
15
 
17
- const StaticImageTemplate: ComponentStory<typeof StaticImage> = (args) => (
18
- <StaticImage {...args} />
19
- );
16
+ export default meta;
20
17
 
21
- export const StaticImageStory = StaticImageTemplate.bind({});
22
- StaticImageStory.args = {
23
- alt: "Data Explorer",
24
- height: 40,
25
- src: logo,
18
+ type Story = StoryObj<typeof meta>;
19
+
20
+ export const StaticImageStory: Story = {
21
+ args: {
22
+ alt: "Data Explorer",
23
+ height: 40,
24
+ src: logo.src,
25
+ },
26
26
  };
@@ -1,23 +1,23 @@
1
- import { ComponentMeta, ComponentStory } from "@storybook/react";
2
- import React from "react";
1
+ import { Meta, StoryObj } from "@storybook/react";
3
2
  import { SearchOffIcon } from "../CustomIcon/components/SearchOffIcon/searchOffIcon";
4
3
  import { PRIORITY, StatusIcon } from "./statusIcon";
5
4
 
6
- export default {
5
+ const meta = {
7
6
  argTypes: {
8
7
  StatusIcon: { control: { disable: true } },
9
8
  priority: { control: "select", options: Array.from(Object.keys(PRIORITY)) },
10
9
  },
11
10
  component: StatusIcon,
12
11
  title: "Components/Common/Alert/StatusIcon",
13
- } as ComponentMeta<typeof StatusIcon>;
12
+ } satisfies Meta<typeof StatusIcon>;
14
13
 
15
- const StatusIconTemplate: ComponentStory<typeof StatusIcon> = (args) => (
16
- <StatusIcon {...args} />
17
- );
14
+ export default meta;
18
15
 
19
- export const StatusIconStory = StatusIconTemplate.bind({});
20
- StatusIconStory.args = {
21
- StatusIcon: SearchOffIcon,
22
- priority: PRIORITY.LOW,
16
+ type Story = StoryObj<typeof meta>;
17
+
18
+ export const StatusIconStory: Story = {
19
+ args: {
20
+ StatusIcon: SearchOffIcon,
21
+ priority: PRIORITY.LOW,
22
+ },
23
23
  };
@@ -1,21 +1,23 @@
1
- import { ComponentMeta, ComponentStory } from "@storybook/react";
1
+ import { Meta, StoryObj } from "@storybook/react";
2
2
  import React from "react";
3
3
  import { Tag } from "./tag";
4
4
  import { TagWarning } from "./tag.styles";
5
5
 
6
- export default {
6
+ const meta = {
7
7
  argTypes: {
8
8
  children: { control: { disabled: true } },
9
9
  },
10
10
  component: Tag,
11
11
  title: "Components/Common/Alert/Tag",
12
- } as ComponentMeta<typeof Tag>;
12
+ } satisfies Meta<typeof Tag>;
13
13
 
14
- const WarningTagTemplate: ComponentStory<typeof Tag> = (args) => (
15
- <TagWarning {...args}>{args.children}</TagWarning>
16
- );
14
+ export default meta;
17
15
 
18
- export const WarningTagStory = WarningTagTemplate.bind({});
19
- WarningTagStory.args = {
20
- children: "Please note",
16
+ type Story = StoryObj<typeof meta>;
17
+
18
+ export const WarningTagStory: Story = {
19
+ args: {
20
+ children: "Please note",
21
+ },
22
+ render: (args) => <TagWarning {...args}>{args.children}</TagWarning>,
21
23
  };