@imposium-hub/components 2.14.9 → 2.15.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 (293) hide show
  1. package/dist/cjs/components/app-wrapper/AppWrapper.d.ts +1 -6
  2. package/dist/cjs/components/app-wrapper/AppWrapper.js +4 -8
  3. package/dist/cjs/components/app-wrapper/AppWrapper.js.map +1 -1
  4. package/dist/cjs/components/app-wrapper/AppWrapperV2.d.ts +26 -0
  5. package/dist/cjs/components/app-wrapper/AppWrapperV2.js +266 -0
  6. package/dist/cjs/components/app-wrapper/AppWrapperV2.js.map +1 -0
  7. package/dist/cjs/components/app-wrapper/AppWrapperV3.d.ts +19 -0
  8. package/dist/cjs/components/app-wrapper/AppWrapperV3.js +195 -0
  9. package/dist/cjs/components/app-wrapper/AppWrapperV3.js.map +1 -0
  10. package/dist/cjs/components/app-wrapper/AppWrapper_BACKUP_73190.d.ts +27 -0
  11. package/dist/cjs/components/app-wrapper/AppWrapper_BACKUP_73190.js +243 -0
  12. package/dist/cjs/components/app-wrapper/AppWrapper_BACKUP_73190.js.map +1 -0
  13. package/dist/cjs/components/app-wrapper/AppWrapper_BASE_73190.d.ts +28 -0
  14. package/dist/cjs/components/app-wrapper/AppWrapper_BASE_73190.js +255 -0
  15. package/dist/cjs/components/app-wrapper/AppWrapper_BASE_73190.js.map +1 -0
  16. package/dist/cjs/components/app-wrapper/AppWrapper_LOCAL_73190.d.ts +27 -0
  17. package/dist/cjs/components/app-wrapper/AppWrapper_LOCAL_73190.js +243 -0
  18. package/dist/cjs/components/app-wrapper/AppWrapper_LOCAL_73190.js.map +1 -0
  19. package/dist/cjs/components/app-wrapper/AppWrapper_REMOTE_73190.d.ts +28 -0
  20. package/dist/cjs/components/app-wrapper/AppWrapper_REMOTE_73190.js +251 -0
  21. package/dist/cjs/components/app-wrapper/AppWrapper_REMOTE_73190.js.map +1 -0
  22. package/dist/cjs/components/assets/AssetsUploadMenu.js +5 -5
  23. package/dist/cjs/components/auth-gate/AuthGate.d.ts +2 -0
  24. package/dist/cjs/components/auth-gate/AuthGate.js +105 -0
  25. package/dist/cjs/components/auth-gate/AuthGate.js.map +1 -0
  26. package/dist/cjs/components/change-report/ChangeReportTree.d.ts +10 -0
  27. package/dist/cjs/components/change-report/ChangeReportTree.js +95 -0
  28. package/dist/cjs/components/change-report/ChangeReportTree.js.map +1 -0
  29. package/dist/cjs/components/context-menu/AnimateComponent.d.ts +0 -1
  30. package/dist/cjs/components/context-menu/AnimateComponent.js.map +1 -1
  31. package/dist/cjs/components/context-menu/ContextMenu.d.ts +0 -1
  32. package/dist/cjs/components/context-menu/ContextMenu.js +6 -6
  33. package/dist/cjs/components/context-menu/ContextMenu.js.map +1 -1
  34. package/dist/cjs/components/context-menu/ContextMenuItem.d.ts +0 -1
  35. package/dist/cjs/components/context-menu/ContextMenuItem.js.map +1 -1
  36. package/dist/cjs/components/context-menu/ContextMenuTrigger.d.ts +0 -1
  37. package/dist/cjs/components/context-menu/ContextMenuTrigger.js.map +1 -1
  38. package/dist/cjs/components/context-menu/SubMenu.d.ts +0 -1
  39. package/dist/cjs/components/context-menu/SubMenu.js.map +1 -1
  40. package/dist/cjs/components/dropdown/{Dropdown.stories.js → dropdown.stories.js} +1 -1
  41. package/dist/cjs/components/dropdown/{Dropdown.stories.js.map → dropdown.stories.js.map} +1 -1
  42. package/dist/cjs/components/edit-guide-modal/EditGuideModal.d.ts +8 -0
  43. package/dist/cjs/components/edit-guide-modal/EditGuideModal.js +132 -0
  44. package/dist/cjs/components/edit-guide-modal/EditGuideModal.js.map +1 -0
  45. package/dist/cjs/components/edit-marker-modal/EditMarkerModal.d.ts +8 -0
  46. package/dist/cjs/components/edit-marker-modal/EditMarkerModal.js +104 -0
  47. package/dist/cjs/components/edit-marker-modal/EditMarkerModal.js.map +1 -0
  48. package/dist/cjs/components/error-message-preview/ErrorMessagePreview.d.ts +15 -0
  49. package/dist/cjs/components/error-message-preview/ErrorMessagePreview.js +91 -0
  50. package/dist/cjs/components/error-message-preview/ErrorMessagePreview.js.map +1 -0
  51. package/dist/cjs/components/feature-flag-wrapper/FeatureFlagWrapper.d.ts +7 -0
  52. package/dist/cjs/components/feature-flag-wrapper/FeatureFlagWrapper.js +48 -0
  53. package/dist/cjs/components/feature-flag-wrapper/FeatureFlagWrapper.js.map +1 -0
  54. package/dist/cjs/components/header/Header_BACKUP_73021.d.ts +33 -0
  55. package/dist/cjs/components/header/Header_BACKUP_73021.js +393 -0
  56. package/dist/cjs/components/header/Header_BACKUP_73021.js.map +1 -0
  57. package/dist/cjs/components/header/Header_BASE_73021.d.ts +29 -0
  58. package/dist/cjs/components/header/Header_BASE_73021.js +376 -0
  59. package/dist/cjs/components/header/Header_BASE_73021.js.map +1 -0
  60. package/dist/cjs/components/header/Header_LOCAL_73021.d.ts +33 -0
  61. package/dist/cjs/components/header/Header_LOCAL_73021.js +382 -0
  62. package/dist/cjs/components/header/Header_LOCAL_73021.js.map +1 -0
  63. package/dist/cjs/components/header/Header_REMOTE_73021.d.ts +30 -0
  64. package/dist/cjs/components/header/Header_REMOTE_73021.js +386 -0
  65. package/dist/cjs/components/header/Header_REMOTE_73021.js.map +1 -0
  66. package/dist/cjs/components/header/StoryDropdown.d.ts +6 -0
  67. package/dist/cjs/components/header/StoryDropdown.js +111 -0
  68. package/dist/cjs/components/header/StoryDropdown.js.map +1 -0
  69. package/dist/cjs/components/number-field/NumberField.d.ts +2 -3
  70. package/dist/cjs/components/number-field/NumberField.js +19 -23
  71. package/dist/cjs/components/number-field/NumberField.js.map +1 -1
  72. package/dist/cjs/components/portal/Portal.d.ts +0 -1
  73. package/dist/cjs/components/portal/Portal.js.map +1 -1
  74. package/dist/cjs/components/publish-wizard/PublishWizard.d.ts +5 -4
  75. package/dist/cjs/components/publish-wizard/PublishWizard.js +103 -34
  76. package/dist/cjs/components/publish-wizard/PublishWizard.js.map +1 -1
  77. package/dist/cjs/components/replace-files-modal/ReplaceFilesModal.d.ts +11 -0
  78. package/dist/cjs/components/replace-files-modal/ReplaceFilesModal.js +213 -0
  79. package/dist/cjs/components/replace-files-modal/ReplaceFilesModal.js.map +1 -0
  80. package/dist/cjs/components/service-icon/ServiceIcon.test.d.ts +0 -0
  81. package/dist/cjs/components/service-icon/ServiceIcon.test.js +1 -0
  82. package/dist/cjs/components/service-icon/ServiceIcon.test.js.map +1 -0
  83. package/dist/cjs/components/story-previewer/StoryPreviewer.js +2 -15
  84. package/dist/cjs/components/story-previewer/StoryPreviewer.js.map +1 -1
  85. package/dist/cjs/components/tabs/Tabs.d.ts +4 -12
  86. package/dist/cjs/components/tabs/Tabs.js +3 -21
  87. package/dist/cjs/components/tabs/Tabs.js.map +1 -1
  88. package/dist/cjs/components/tabs/Tabs.stories.d.ts +3 -1
  89. package/dist/cjs/components/tag/Tag.test.d.ts +0 -0
  90. package/dist/cjs/components/tag/Tag.test.js +1 -0
  91. package/dist/cjs/components/tag/Tag.test.js.map +1 -0
  92. package/dist/cjs/constants/copy.d.ts +9 -0
  93. package/dist/cjs/constants/copy.js +13 -2
  94. package/dist/cjs/constants/copy.js.map +1 -1
  95. package/dist/cjs/constants/snippets.d.ts +18 -0
  96. package/dist/cjs/constants/snippets.js +3 -0
  97. package/dist/cjs/constants/snippets.js.map +1 -0
  98. package/dist/cjs/index.d.ts +4 -2
  99. package/dist/cjs/index.js +4 -36
  100. package/dist/cjs/index.js.map +1 -1
  101. package/dist/cjs/redux/actions/auth.d.ts +9 -0
  102. package/dist/cjs/redux/actions/auth.js +30 -0
  103. package/dist/cjs/redux/actions/auth.js.map +1 -0
  104. package/dist/cjs/redux/reducers/auth.d.ts +3 -0
  105. package/dist/cjs/redux/reducers/auth.js +67 -0
  106. package/dist/cjs/redux/reducers/auth.js.map +1 -0
  107. package/dist/cjs/services/API.d.ts +2 -0
  108. package/dist/cjs/services/API.js +6 -0
  109. package/dist/cjs/services/API.js.map +1 -1
  110. package/dist/cjs/services/Auth0.d.ts +18 -0
  111. package/dist/cjs/services/Auth0.js +102 -0
  112. package/dist/cjs/services/Auth0.js.map +1 -0
  113. package/dist/cjs/services/Session.d.ts +26 -0
  114. package/dist/cjs/services/Session.js +155 -0
  115. package/dist/cjs/services/Session.js.map +1 -0
  116. package/dist/cjs/utils/routing.d.ts +2 -4
  117. package/dist/cjs/utils/routing.js +4 -8
  118. package/dist/cjs/utils/routing.js.map +1 -1
  119. package/dist/esm/components/app-wrapper/AppWrapper.d.ts +1 -6
  120. package/dist/esm/components/app-wrapper/AppWrapper.js +5 -9
  121. package/dist/esm/components/app-wrapper/AppWrapper.js.map +1 -1
  122. package/dist/esm/components/app-wrapper/AppWrapperV2.d.ts +26 -0
  123. package/dist/esm/components/app-wrapper/AppWrapperV2.js +142 -0
  124. package/dist/esm/components/app-wrapper/AppWrapperV2.js.map +1 -0
  125. package/dist/esm/components/app-wrapper/AppWrapperV3.d.ts +19 -0
  126. package/dist/esm/components/app-wrapper/AppWrapperV3.js +88 -0
  127. package/dist/esm/components/app-wrapper/AppWrapperV3.js.map +1 -0
  128. package/dist/esm/components/app-wrapper/AppWrapper_BACKUP_73190.d.ts +27 -0
  129. package/dist/esm/components/app-wrapper/AppWrapper_BACKUP_73190.js +194 -0
  130. package/dist/esm/components/app-wrapper/AppWrapper_BACKUP_73190.js.map +1 -0
  131. package/dist/esm/components/app-wrapper/AppWrapper_BASE_73190.d.ts +28 -0
  132. package/dist/esm/components/app-wrapper/AppWrapper_BASE_73190.js +208 -0
  133. package/dist/esm/components/app-wrapper/AppWrapper_BASE_73190.js.map +1 -0
  134. package/dist/esm/components/app-wrapper/AppWrapper_LOCAL_73190.d.ts +27 -0
  135. package/dist/esm/components/app-wrapper/AppWrapper_LOCAL_73190.js +194 -0
  136. package/dist/esm/components/app-wrapper/AppWrapper_LOCAL_73190.js.map +1 -0
  137. package/dist/esm/components/app-wrapper/AppWrapper_REMOTE_73190.d.ts +28 -0
  138. package/dist/esm/components/app-wrapper/AppWrapper_REMOTE_73190.js +204 -0
  139. package/dist/esm/components/app-wrapper/AppWrapper_REMOTE_73190.js.map +1 -0
  140. package/dist/esm/components/assets/AssetsUploadMenu.js +5 -5
  141. package/dist/esm/components/auth-gate/AuthGate.d.ts +2 -0
  142. package/dist/esm/components/auth-gate/AuthGate.js +59 -0
  143. package/dist/esm/components/auth-gate/AuthGate.js.map +1 -0
  144. package/dist/esm/components/change-report/ChangeReportTree.d.ts +10 -0
  145. package/dist/esm/components/change-report/ChangeReportTree.js +42 -0
  146. package/dist/esm/components/change-report/ChangeReportTree.js.map +1 -0
  147. package/dist/esm/components/context-menu/AnimateComponent.d.ts +0 -1
  148. package/dist/esm/components/context-menu/AnimateComponent.js.map +1 -1
  149. package/dist/esm/components/context-menu/ContextMenu.d.ts +0 -1
  150. package/dist/esm/components/context-menu/ContextMenu.js +1 -2
  151. package/dist/esm/components/context-menu/ContextMenu.js.map +1 -1
  152. package/dist/esm/components/context-menu/ContextMenuItem.d.ts +0 -1
  153. package/dist/esm/components/context-menu/ContextMenuItem.js.map +1 -1
  154. package/dist/esm/components/context-menu/ContextMenuTrigger.d.ts +0 -1
  155. package/dist/esm/components/context-menu/ContextMenuTrigger.js.map +1 -1
  156. package/dist/esm/components/context-menu/SubMenu.d.ts +0 -1
  157. package/dist/esm/components/context-menu/SubMenu.js.map +1 -1
  158. package/dist/esm/components/dropdown/{Dropdown.stories.js → dropdown.stories.js} +1 -1
  159. package/dist/esm/components/dropdown/{Dropdown.stories.js.map → dropdown.stories.js.map} +1 -1
  160. package/dist/esm/components/edit-guide-modal/EditGuideModal.d.ts +8 -0
  161. package/dist/esm/components/edit-guide-modal/EditGuideModal.js +65 -0
  162. package/dist/esm/components/edit-guide-modal/EditGuideModal.js.map +1 -0
  163. package/dist/esm/components/edit-marker-modal/EditMarkerModal.d.ts +8 -0
  164. package/dist/esm/components/edit-marker-modal/EditMarkerModal.js +72 -0
  165. package/dist/esm/components/edit-marker-modal/EditMarkerModal.js.map +1 -0
  166. package/dist/esm/components/error-message-preview/ErrorMessagePreview.d.ts +15 -0
  167. package/dist/esm/components/error-message-preview/ErrorMessagePreview.js +35 -0
  168. package/dist/esm/components/error-message-preview/ErrorMessagePreview.js.map +1 -0
  169. package/dist/esm/components/feature-flag-wrapper/FeatureFlagWrapper.d.ts +7 -0
  170. package/dist/esm/components/feature-flag-wrapper/FeatureFlagWrapper.js +10 -0
  171. package/dist/esm/components/feature-flag-wrapper/FeatureFlagWrapper.js.map +1 -0
  172. package/dist/esm/components/header/Header_BACKUP_73021.d.ts +33 -0
  173. package/dist/esm/components/header/Header_BACKUP_73021.js +336 -0
  174. package/dist/esm/components/header/Header_BACKUP_73021.js.map +1 -0
  175. package/dist/esm/components/header/Header_BASE_73021.d.ts +29 -0
  176. package/dist/esm/components/header/Header_BASE_73021.js +322 -0
  177. package/dist/esm/components/header/Header_BASE_73021.js.map +1 -0
  178. package/dist/esm/components/header/Header_LOCAL_73021.d.ts +33 -0
  179. package/dist/esm/components/header/Header_LOCAL_73021.js +328 -0
  180. package/dist/esm/components/header/Header_LOCAL_73021.js.map +1 -0
  181. package/dist/esm/components/header/Header_REMOTE_73021.d.ts +30 -0
  182. package/dist/esm/components/header/Header_REMOTE_73021.js +329 -0
  183. package/dist/esm/components/header/Header_REMOTE_73021.js.map +1 -0
  184. package/dist/esm/components/header/StoryDropdown.d.ts +6 -0
  185. package/dist/esm/components/header/StoryDropdown.js +82 -0
  186. package/dist/esm/components/header/StoryDropdown.js.map +1 -0
  187. package/dist/esm/components/number-field/NumberField.d.ts +2 -3
  188. package/dist/esm/components/number-field/NumberField.js +19 -18
  189. package/dist/esm/components/number-field/NumberField.js.map +1 -1
  190. package/dist/esm/components/portal/Portal.d.ts +0 -1
  191. package/dist/esm/components/portal/Portal.js.map +1 -1
  192. package/dist/esm/components/publish-wizard/PublishWizard.d.ts +5 -4
  193. package/dist/esm/components/publish-wizard/PublishWizard.js +91 -34
  194. package/dist/esm/components/publish-wizard/PublishWizard.js.map +1 -1
  195. package/dist/esm/components/replace-files-modal/ReplaceFilesModal.d.ts +11 -0
  196. package/dist/esm/components/replace-files-modal/ReplaceFilesModal.js +141 -0
  197. package/dist/esm/components/replace-files-modal/ReplaceFilesModal.js.map +1 -0
  198. package/dist/esm/components/service-icon/ServiceIcon.test.d.ts +0 -0
  199. package/dist/esm/components/service-icon/ServiceIcon.test.js +1 -0
  200. package/dist/esm/components/service-icon/ServiceIcon.test.js.map +1 -0
  201. package/dist/esm/components/story-previewer/StoryPreviewer.js +2 -14
  202. package/dist/esm/components/story-previewer/StoryPreviewer.js.map +1 -1
  203. package/dist/esm/components/tabs/Tabs.d.ts +4 -12
  204. package/dist/esm/components/tabs/Tabs.js +4 -11
  205. package/dist/esm/components/tabs/Tabs.js.map +1 -1
  206. package/dist/esm/components/tabs/Tabs.stories.d.ts +3 -1
  207. package/dist/esm/components/tag/Tag.test.d.ts +0 -0
  208. package/dist/esm/components/tag/Tag.test.js +1 -0
  209. package/dist/esm/components/tag/Tag.test.js.map +1 -0
  210. package/dist/esm/constants/copy.d.ts +9 -0
  211. package/dist/esm/constants/copy.js +13 -2
  212. package/dist/esm/constants/copy.js.map +1 -1
  213. package/dist/esm/constants/snippets.d.ts +18 -0
  214. package/dist/esm/constants/snippets.js +2 -0
  215. package/dist/esm/constants/snippets.js.map +1 -0
  216. package/dist/esm/index.d.ts +4 -2
  217. package/dist/esm/index.js +3 -2
  218. package/dist/esm/index.js.map +1 -1
  219. package/dist/esm/redux/actions/auth.d.ts +9 -0
  220. package/dist/esm/redux/actions/auth.js +25 -0
  221. package/dist/esm/redux/actions/auth.js.map +1 -0
  222. package/dist/esm/redux/reducers/auth.d.ts +3 -0
  223. package/dist/esm/redux/reducers/auth.js +27 -0
  224. package/dist/esm/redux/reducers/auth.js.map +1 -0
  225. package/dist/esm/services/API.d.ts +2 -0
  226. package/dist/esm/services/API.js +6 -0
  227. package/dist/esm/services/API.js.map +1 -1
  228. package/dist/esm/services/Auth0.d.ts +18 -0
  229. package/dist/esm/services/Auth0.js +68 -0
  230. package/dist/esm/services/Auth0.js.map +1 -0
  231. package/dist/esm/services/Session.d.ts +26 -0
  232. package/dist/esm/services/Session.js +107 -0
  233. package/dist/esm/services/Session.js.map +1 -0
  234. package/dist/esm/utils/routing.d.ts +2 -4
  235. package/dist/esm/utils/routing.js +3 -6
  236. package/dist/esm/utils/routing.js.map +1 -1
  237. package/dist/styles.css +130 -3
  238. package/dist/styles.less +215 -64
  239. package/less/components/assets.less +5 -6
  240. package/less/components/auth-gate.less +1 -1
  241. package/less/components/change-report.less +115 -0
  242. package/less/components/data-table.less +2 -2
  243. package/less/components/determinate-loader.less +2 -2
  244. package/less/components/font-preview.less +1 -1
  245. package/less/components/form-field.less +5 -5
  246. package/less/components/header.less +30 -30
  247. package/less/components/modal.less +2 -2
  248. package/less/components/player.less +2 -2
  249. package/less/components/publish-wizard.less +36 -0
  250. package/less/components/section.less +2 -2
  251. package/less/components/static-composition-editor.less +4 -4
  252. package/less/components/story-previewer.less +4 -4
  253. package/less/components/tabs.less +3 -3
  254. package/less/entry.less +1 -0
  255. package/package.json +13 -24
  256. package/src/components/app-wrapper/AppWrapper.tsx +10 -18
  257. package/src/components/assets/AssetsUploadMenu.tsx +5 -5
  258. package/src/components/change-report/ChangeReportTree.tsx +125 -0
  259. package/src/components/context-menu/AnimateComponent.tsx +0 -1
  260. package/src/components/context-menu/ContextMenu.tsx +13 -15
  261. package/src/components/context-menu/ContextMenuItem.tsx +0 -1
  262. package/src/components/context-menu/ContextMenuTrigger.tsx +0 -1
  263. package/src/components/context-menu/SubMenu.tsx +0 -1
  264. package/src/components/number-field/NumberField.tsx +24 -33
  265. package/src/components/portal/Portal.tsx +0 -1
  266. package/src/components/publish-wizard/PublishWizard.tsx +144 -39
  267. package/src/components/service-icon/ServiceIcon.test.tsx +0 -0
  268. package/src/components/story-previewer/StoryPreviewer.tsx +8 -21
  269. package/src/components/tabs/Tabs.tsx +8 -25
  270. package/src/components/tag/Tag.test.tsx +0 -0
  271. package/src/constants/copy.ts +16 -2
  272. package/src/constants/snippets.ts +25 -0
  273. package/src/index.ts +7 -2
  274. package/src/services/API.ts +8 -0
  275. package/src/utils/routing.ts +6 -10
  276. package/tsconfig.json +1 -1
  277. package/src/components/advanced-number-field/AdvancedNumberField.test.tsx +0 -704
  278. package/src/components/anchor-field/AnchorField.test.tsx +0 -130
  279. package/src/components/asset-details/AssetDetails.test.tsx +0 -494
  280. package/src/components/assets/AssetField.test.tsx +0 -439
  281. package/src/components/assets/AssetsTableAssetIdCell.test.tsx +0 -134
  282. package/src/components/assets/AssetsTableAssetIdFilter.test.tsx +0 -95
  283. package/src/components/assets/AssetsTableComplexTagCell.test.tsx +0 -159
  284. package/src/components/assets/AssetsTableDateCell.test.tsx +0 -106
  285. package/src/components/number-field/NumberField.test.tsx +0 -383
  286. package/src/components/text-field/TextField.test.tsx +0 -988
  287. package/src/test/setup.ts +0 -91
  288. package/src/test/utils.tsx +0 -44
  289. package/tsconfig.eslint.json +0 -8
  290. package/vitest.config.ts +0 -31
  291. /package/dist/cjs/components/dropdown/{Dropdown.stories.d.ts → dropdown.stories.d.ts} +0 -0
  292. /package/dist/esm/components/dropdown/{Dropdown.stories.d.ts → dropdown.stories.d.ts} +0 -0
  293. /package/src/components/dropdown/{Dropdown.stories.tsx → dropdown.stories.tsx} +0 -0
@@ -1,159 +0,0 @@
1
- import { describe, it, expect, vi } from 'vitest';
2
- import React from 'react';
3
- import { render } from '@testing-library/react';
4
- import { Provider } from 'react-redux';
5
- import { legacy_createStore as createStore } from 'redux';
6
-
7
- let capturedDoSubmit: (value: string) => void;
8
- let capturedRemoveHandlers: Record<string, () => void> = {};
9
-
10
- vi.mock('../tag/Tag', () => ({
11
- default: ({ copy, removeHandler }: any) => {
12
- capturedRemoveHandlers[copy] = removeHandler;
13
- return (
14
- <div
15
- data-testid={`tag-${copy}`}
16
- className='mock-tag'>
17
- <span>{copy}</span>
18
- <button
19
- data-testid={`remove-${copy}`}
20
- onClick={removeHandler}>
21
- x
22
- </button>
23
- </div>
24
- );
25
- }
26
- }));
27
-
28
- vi.mock('../text-field/TextField', () => ({
29
- default: ({ submittable, submittableType, placeholder, value, doSubmit, suggestions }: any) => {
30
- capturedDoSubmit = doSubmit;
31
- return (
32
- <div
33
- data-testid='mock-text-field'
34
- data-submittable={submittable}
35
- data-submittable-type={submittableType}
36
- data-placeholder={placeholder}
37
- data-value={value}
38
- data-suggestions={JSON.stringify(suggestions || [])}>
39
- <button
40
- data-testid='submit-trigger'
41
- onClick={() => doSubmit('new-tag')}>
42
- Add
43
- </button>
44
- </div>
45
- );
46
- }
47
- }));
48
-
49
- vi.mock('../../redux/actions/asset-list', () => ({
50
- addAssetTag: vi.fn((_api, _id, _tags) => ({ type: 'MOCK_ADD_TAG' })),
51
- deleteAssetTag: vi.fn((_api, _id, _tag) => ({ type: 'MOCK_DELETE_TAG' })),
52
- default: {}
53
- }));
54
-
55
- import AssetsTableComplexTagCellMemoized from './AssetsTableComplexTagCell';
56
- import { addAssetTag, deleteAssetTag } from '../../redux/actions/asset-list';
57
-
58
- const MOCK_ASSET_ID = 'asset-999';
59
- const MOCK_API = { addAssetTag: vi.fn(), deleteAssetTag: vi.fn() };
60
- const MOCK_SUGGESTIONS = ['alpha', 'beta', 'gamma'];
61
-
62
- const createMockStore = (assetTags: string[] = MOCK_SUGGESTIONS) => {
63
- const initialState = { assetTags };
64
- return createStore((state = initialState) => state);
65
- };
66
-
67
- const buildCellProp = (tags: string[] = ['tag-a', 'tag-b']) => ({
68
- row: {
69
- original: { id: MOCK_ASSET_ID, tags }
70
- }
71
- });
72
-
73
- const renderComponent = (tagOverrides?: string[], storeOverrides?: string[]) => {
74
- capturedRemoveHandlers = {};
75
- const store = createMockStore(storeOverrides);
76
- const cell = buildCellProp(tagOverrides);
77
-
78
- const result = render(
79
- <Provider store={store}>
80
- <AssetsTableComplexTagCellMemoized
81
- cell={cell}
82
- api={MOCK_API}
83
- />
84
- </Provider>
85
- );
86
-
87
- return { ...result, store };
88
- };
89
-
90
- describe('AssetsTableComplexTagCell', () => {
91
- it('renders existing tags as Tag components', () => {
92
- const tags = ['tag-a', 'tag-b', 'tag-c'];
93
- const { getByTestId } = renderComponent(tags);
94
-
95
- tags.forEach((tag) => {
96
- expect(getByTestId(`tag-${tag}`)).toBeTruthy();
97
- });
98
- });
99
-
100
- it('deduplicates tags before rendering', () => {
101
- const { container } = renderComponent(['dup', 'dup', 'unique']);
102
- const renderedTags = container.querySelectorAll('.mock-tag');
103
-
104
- expect(renderedTags).toHaveLength(2);
105
- });
106
-
107
- it('renders the TextField with correct props', () => {
108
- const { getByTestId } = renderComponent();
109
- const textField = getByTestId('mock-text-field');
110
-
111
- expect(textField.getAttribute('data-submittable')).toBe('true');
112
- expect(textField.getAttribute('data-submittable-type')).toBe('add');
113
- expect(textField.getAttribute('data-placeholder')).toBe('+');
114
- expect(textField.getAttribute('data-value')).toBe('');
115
- });
116
-
117
- it('passes assetTags from store as suggestions', () => {
118
- const suggestions = ['x', 'y', 'z'];
119
- const { getByTestId } = renderComponent([], suggestions);
120
- const textField = getByTestId('mock-text-field');
121
-
122
- const suggestionsAttr = textField.getAttribute('data-suggestions');
123
- expect(suggestionsAttr).toBeTruthy();
124
- expect(JSON.parse(suggestionsAttr)).toEqual(suggestions);
125
- });
126
-
127
- it('dispatches addAssetTag when submitting a new tag', () => {
128
- renderComponent(['existing']);
129
-
130
- capturedDoSubmit('brand-new');
131
-
132
- expect(addAssetTag).toHaveBeenCalledWith(MOCK_API, MOCK_ASSET_ID, 'brand-new');
133
- });
134
-
135
- it('does not dispatch addAssetTag when submitting a duplicate tag', () => {
136
- vi.mocked(addAssetTag).mockClear();
137
- renderComponent(['already-here']);
138
-
139
- capturedDoSubmit('already-here');
140
-
141
- expect(addAssetTag).not.toHaveBeenCalled();
142
- });
143
-
144
- it('dispatches deleteAssetTag when removing a tag', () => {
145
- renderComponent(['removable']);
146
-
147
- capturedRemoveHandlers['removable']();
148
-
149
- expect(deleteAssetTag).toHaveBeenCalledWith(MOCK_API, MOCK_ASSET_ID, 'removable');
150
- });
151
-
152
- it('renders with no tags', () => {
153
- const { container, getByTestId } = renderComponent([]);
154
- const renderedTags = container.querySelectorAll('.mock-tag');
155
-
156
- expect(renderedTags).toHaveLength(0);
157
- expect(getByTestId('mock-text-field')).toBeTruthy();
158
- });
159
- });
@@ -1,106 +0,0 @@
1
- import { describe, it, expect, vi } from 'vitest';
2
- import React from 'react';
3
- import { render } from '@testing-library/react';
4
-
5
- const MOCK_FORMATTED_DATE = '4/9/2026 3:00 PM';
6
-
7
- vi.mock('../../Util', async (importOriginal) => {
8
- const actual = (await importOriginal()) as any;
9
- return {
10
- ...actual,
11
- formatDateDefault: vi.fn(() => MOCK_FORMATTED_DATE)
12
- };
13
- });
14
-
15
- import AssetsTableDateCellMemoized from './AssetsTableDateCell';
16
- import { formatDateDefault } from '../../Util';
17
-
18
- const MOCK_UNIX_TIMESTAMP = 1776013200;
19
-
20
- const buildCellProp = (values: Record<string, any>) => ({
21
- row: { values }
22
- });
23
-
24
- describe('AssetsTableDateCell', () => {
25
- it('renders date_created when date_created prop is true and value exists', () => {
26
- const cell = buildCellProp({ date_created: MOCK_UNIX_TIMESTAMP });
27
- const { container } = render(
28
- <AssetsTableDateCellMemoized
29
- cell={cell}
30
- date_created={true}
31
- />
32
- );
33
-
34
- expect(formatDateDefault).toHaveBeenCalledWith(MOCK_UNIX_TIMESTAMP);
35
- expect(container.textContent).toBe(MOCK_FORMATTED_DATE);
36
- });
37
-
38
- it('renders date_modified when date_created is false', () => {
39
- const cell = buildCellProp({ date_modified: MOCK_UNIX_TIMESTAMP });
40
- const { container } = render(
41
- <AssetsTableDateCellMemoized
42
- cell={cell}
43
- date_created={false}
44
- />
45
- );
46
-
47
- expect(formatDateDefault).toHaveBeenCalledWith(MOCK_UNIX_TIMESTAMP);
48
- expect(container.textContent).toBe(MOCK_FORMATTED_DATE);
49
- });
50
-
51
- it('falls through to date_updated when date_modified is absent', () => {
52
- const cell = buildCellProp({ date_updated: MOCK_UNIX_TIMESTAMP });
53
- const { container } = render(
54
- <AssetsTableDateCellMemoized
55
- cell={cell}
56
- date_created={false}
57
- />
58
- );
59
-
60
- expect(formatDateDefault).toHaveBeenCalledWith(MOCK_UNIX_TIMESTAMP);
61
- expect(container.textContent).toBe(MOCK_FORMATTED_DATE);
62
- });
63
-
64
- it('prefers date_modified over date_updated when both exist', () => {
65
- const modifiedTimestamp = 1776099600;
66
- const cell = buildCellProp({
67
- date_modified: modifiedTimestamp,
68
- date_updated: MOCK_UNIX_TIMESTAMP
69
- });
70
- const { container } = render(
71
- <AssetsTableDateCellMemoized
72
- cell={cell}
73
- date_created={false}
74
- />
75
- );
76
-
77
- expect(formatDateDefault).toHaveBeenCalledWith(modifiedTimestamp);
78
- expect(container.textContent).toBe(MOCK_FORMATTED_DATE);
79
- });
80
-
81
- it('skips date_created value when date_created prop is false', () => {
82
- vi.mocked(formatDateDefault).mockClear();
83
- const cell = buildCellProp({ date_created: MOCK_UNIX_TIMESTAMP });
84
- const { container } = render(
85
- <AssetsTableDateCellMemoized
86
- cell={cell}
87
- date_created={false}
88
- />
89
- );
90
-
91
- expect(formatDateDefault).not.toHaveBeenCalled();
92
- expect(container.innerHTML).toBe('');
93
- });
94
-
95
- it('returns null when no date values are present', () => {
96
- const cell = buildCellProp({});
97
- const { container } = render(
98
- <AssetsTableDateCellMemoized
99
- cell={cell}
100
- date_created={false}
101
- />
102
- );
103
-
104
- expect(container.innerHTML).toBe('');
105
- });
106
- });
@@ -1,383 +0,0 @@
1
- import React from 'react';
2
- import { describe, it, expect, vi, beforeEach } from 'vitest';
3
- import { render, fireEvent, screen } from '../../test/utils';
4
- import NumberField, { validateNumInput } from './NumberField';
5
-
6
- describe('NumberField', () => {
7
- const defaultProps = {
8
- value: 10,
9
- onChange: vi.fn(),
10
- label: 'Test Number Field'
11
- };
12
-
13
- beforeEach(() => {
14
- vi.clearAllMocks();
15
- });
16
-
17
- describe('Rendering', () => {
18
- it('renders without crashing', () => {
19
- render(<NumberField {...defaultProps} />);
20
- const input = screen.getByRole('spinbutton');
21
- expect(input).toBeDefined();
22
- });
23
-
24
- it('displays the correct value', () => {
25
- render(
26
- <NumberField
27
- {...defaultProps}
28
- value={25}
29
- />
30
- );
31
- const input: HTMLInputElement = screen.getByRole('spinbutton');
32
- expect(input.value).toBe('25');
33
- });
34
-
35
- it('displays placeholder when provided', () => {
36
- render(
37
- <NumberField
38
- {...defaultProps}
39
- placeholder='Enter number'
40
- />
41
- );
42
- const input: HTMLInputElement = screen.getByRole('spinbutton');
43
- expect(input.placeholder).toBe('Enter number');
44
- });
45
-
46
- it('displays empty string when value is null', () => {
47
- render(
48
- <NumberField
49
- {...defaultProps}
50
- value={null}
51
- />
52
- );
53
- const input: HTMLInputElement = screen.getByRole('spinbutton');
54
- expect(input.value).toBe('');
55
- });
56
-
57
- it('applies min and max attributes', () => {
58
- render(
59
- <NumberField
60
- {...defaultProps}
61
- min={0}
62
- max={100}
63
- />
64
- );
65
- const input: HTMLInputElement = screen.getByRole('spinbutton');
66
- expect(input.min).toBe('0');
67
- expect(input.max).toBe('100');
68
- });
69
-
70
- it('sets readOnly attribute when readOnly prop is true', () => {
71
- render(
72
- <NumberField
73
- {...defaultProps}
74
- readOnly
75
- />
76
- );
77
- const input: HTMLInputElement = screen.getByRole('spinbutton');
78
- expect(input.readOnly).toBe(true);
79
- });
80
- });
81
-
82
- describe('User Interactions', () => {
83
- it('calls onChange when value changes', () => {
84
- const onChange = vi.fn();
85
- render(
86
- <NumberField
87
- {...defaultProps}
88
- onChange={onChange}
89
- />
90
- );
91
-
92
- const input: HTMLInputElement = screen.getByRole('spinbutton');
93
- fireEvent.change(input, { target: { value: '42' } });
94
-
95
- expect(onChange).toHaveBeenCalledWith(42);
96
- });
97
-
98
- it('calls onChange with min value when empty string is entered', () => {
99
- const onChange = vi.fn();
100
- render(
101
- <NumberField
102
- {...defaultProps}
103
- onChange={onChange}
104
- min={5}
105
- />
106
- );
107
-
108
- const input: HTMLInputElement = screen.getByRole('spinbutton');
109
- fireEvent.change(input, { target: { value: '' } });
110
-
111
- expect(onChange).toHaveBeenCalledWith(5);
112
- });
113
-
114
- it('parses float values correctly', () => {
115
- const onChange = vi.fn();
116
- render(
117
- <NumberField
118
- {...defaultProps}
119
- onChange={onChange}
120
- />
121
- );
122
-
123
- const input: HTMLInputElement = screen.getByRole('spinbutton');
124
- fireEvent.change(input, { target: { value: '3.14' } });
125
-
126
- expect(onChange).toHaveBeenCalledWith(3.14);
127
- });
128
-
129
- it('calls onBlur when provided', () => {
130
- const onBlur = vi.fn();
131
- render(
132
- <NumberField
133
- {...defaultProps}
134
- onBlur={onBlur}
135
- />
136
- );
137
-
138
- const input: HTMLInputElement = screen.getByRole('spinbutton');
139
- fireEvent.blur(input, { target: { value: '15' } });
140
-
141
- expect(onBlur).toHaveBeenCalledWith('15');
142
- });
143
-
144
- it('focuses input on mount when focusOnMount is true', () => {
145
- render(
146
- <NumberField
147
- {...defaultProps}
148
- focusOnMount
149
- />
150
- );
151
- const input: HTMLInputElement = screen.getByRole('spinbutton');
152
- expect(document.activeElement).toBe(input);
153
- });
154
- });
155
-
156
- describe('Keyboard Interactions', () => {
157
- it('increases value by 9 when Shift+ArrowUp is pressed', () => {
158
- const onChange = vi.fn();
159
- render(
160
- <NumberField
161
- {...defaultProps}
162
- value={10}
163
- onChange={onChange}
164
- />
165
- );
166
-
167
- const input: HTMLInputElement = screen.getByRole('spinbutton');
168
- fireEvent.keyDown(input, {
169
- code: 'ArrowUp',
170
- shiftKey: true
171
- });
172
-
173
- expect(onChange).toHaveBeenCalledWith(19);
174
- });
175
-
176
- it('decreases value by 9 when Shift+ArrowDown is pressed', () => {
177
- const onChange = vi.fn();
178
- render(
179
- <NumberField
180
- {...defaultProps}
181
- value={20}
182
- onChange={onChange}
183
- />
184
- );
185
-
186
- const input: HTMLInputElement = screen.getByRole('spinbutton');
187
- fireEvent.keyDown(input, {
188
- code: 'ArrowDown',
189
- shiftKey: true
190
- });
191
-
192
- expect(onChange).toHaveBeenCalledWith(11);
193
- });
194
-
195
- it('does not call onChange when value would exceed max limit', () => {
196
- const onChange = vi.fn();
197
- render(
198
- <NumberField
199
- {...defaultProps}
200
- value={95}
201
- max={100}
202
- onChange={onChange}
203
- />
204
- );
205
-
206
- const input = screen.getByRole('spinbutton');
207
- fireEvent.keyDown(input, {
208
- code: 'ArrowUp',
209
- shiftKey: true
210
- });
211
-
212
- expect(onChange).not.toHaveBeenCalled();
213
- });
214
-
215
- it('sets error state when value would go below min limit', () => {
216
- const onChange = vi.fn();
217
- render(
218
- <NumberField
219
- {...defaultProps}
220
- value={5}
221
- min={0}
222
- onChange={onChange}
223
- />
224
- );
225
-
226
- const input = screen.getByRole('spinbutton');
227
- fireEvent.keyDown(input, {
228
- code: 'ArrowDown',
229
- shiftKey: true
230
- });
231
-
232
- // The component should set error state instead of calling onChange
233
- const { container } = render(
234
- <NumberField
235
- {...defaultProps}
236
- value={-5}
237
- min={0}
238
- />
239
- );
240
- const formField = container.querySelector('.number-field.invalid');
241
- expect(formField).toBeDefined();
242
- });
243
- });
244
-
245
- describe('Validation', () => {
246
- it('shows error state when value is below minimum', () => {
247
- const { container } = render(
248
- <NumberField
249
- {...defaultProps}
250
- value={5}
251
- min={10}
252
- />
253
- );
254
- const formField = container.querySelector('.number-field.invalid');
255
- expect(formField).toBeDefined();
256
- });
257
-
258
- it('shows error state when value is above maximum', () => {
259
- const { container } = render(
260
- <NumberField
261
- {...defaultProps}
262
- value={150}
263
- max={100}
264
- />
265
- );
266
- const formField = container.querySelector('.number-field.invalid');
267
- expect(formField).toBeDefined();
268
- });
269
-
270
- it('shows error state for min constraint', () => {
271
- const { container } = render(
272
- <NumberField
273
- {...defaultProps}
274
- value={5}
275
- min={10}
276
- />
277
- );
278
- const formField = container.querySelector('.number-field.invalid');
279
- expect(formField).toBeDefined();
280
- });
281
-
282
- it('shows error state for max constraint', () => {
283
- const { container } = render(
284
- <NumberField
285
- {...defaultProps}
286
- value={150}
287
- max={100}
288
- />
289
- );
290
- const formField = container.querySelector('.number-field.invalid');
291
- expect(formField).toBeDefined();
292
- });
293
-
294
- it('shows error state for min and max constraints', () => {
295
- const { container } = render(
296
- <NumberField
297
- {...defaultProps}
298
- value={150}
299
- min={10}
300
- max={100}
301
- />
302
- );
303
- const formField = container.querySelector('.number-field.invalid');
304
- expect(formField).toBeDefined();
305
- });
306
-
307
- it('does not show error state when value is valid', () => {
308
- const { container } = render(
309
- <NumberField
310
- {...defaultProps}
311
- value={50}
312
- min={10}
313
- max={100}
314
- />
315
- );
316
- const formField = container.querySelector('.number-field.invalid');
317
- expect(formField).toBeNull();
318
- });
319
- });
320
-
321
- describe('Component Updates', () => {
322
- it('updates internal state when props.value changes', () => {
323
- const { rerender } = render(
324
- <NumberField
325
- {...defaultProps}
326
- value={10}
327
- />
328
- );
329
-
330
- rerender(
331
- <NumberField
332
- {...defaultProps}
333
- value={20}
334
- />
335
- );
336
-
337
- const input: HTMLInputElement = screen.getByRole('spinbutton');
338
- expect(input.value).toBe('20');
339
- });
340
-
341
- it('validates value when props change', () => {
342
- const { container, rerender } = render(
343
- <NumberField
344
- {...defaultProps}
345
- value={50}
346
- />
347
- );
348
-
349
- rerender(
350
- <NumberField
351
- {...defaultProps}
352
- value={150}
353
- max={100}
354
- />
355
- );
356
-
357
- const formField = container.querySelector('.number-field.invalid');
358
- expect(formField).toBeDefined();
359
- });
360
- });
361
- });
362
-
363
- describe('validateNumInput utility', () => {
364
- it('returns true for valid values within range', () => {
365
- expect(validateNumInput(50, 0, 100)).toBe(true);
366
- expect(validateNumInput(0, 0, 100)).toBe(true);
367
- expect(validateNumInput(100, 0, 100)).toBe(true);
368
- });
369
-
370
- it('returns false for values below minimum', () => {
371
- expect(validateNumInput(-5, 0, 100)).toBe(false);
372
- });
373
-
374
- it('returns false for values above maximum', () => {
375
- expect(validateNumInput(150, 0, 100)).toBe(false);
376
- });
377
-
378
- it('handles undefined min/max values', () => {
379
- expect(validateNumInput(50, undefined, 100)).toBe(true);
380
- expect(validateNumInput(50, 0, undefined)).toBe(true);
381
- expect(validateNumInput(50, undefined, undefined)).toBe(true);
382
- });
383
- });