@imposium-hub/components 2.14.11 → 2.15.0-1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (234) hide show
  1. package/dist/cjs/components/app-wrapper/AppWrapper.d.ts +1 -0
  2. package/dist/cjs/components/app-wrapper/AppWrapper.js +1 -1
  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/auth-gate/AuthGate.d.ts +2 -0
  23. package/dist/cjs/components/auth-gate/AuthGate.js +105 -0
  24. package/dist/cjs/components/auth-gate/AuthGate.js.map +1 -0
  25. package/dist/cjs/components/change-report/ChangeReportTree.d.ts +10 -0
  26. package/dist/cjs/components/change-report/ChangeReportTree.js +95 -0
  27. package/dist/cjs/components/change-report/ChangeReportTree.js.map +1 -0
  28. package/dist/cjs/components/dropdown/{Dropdown.stories.js → dropdown.stories.js} +1 -1
  29. package/dist/cjs/components/dropdown/{Dropdown.stories.js.map → dropdown.stories.js.map} +1 -1
  30. package/dist/cjs/components/edit-guide-modal/EditGuideModal.d.ts +8 -0
  31. package/dist/cjs/components/edit-guide-modal/EditGuideModal.js +132 -0
  32. package/dist/cjs/components/edit-guide-modal/EditGuideModal.js.map +1 -0
  33. package/dist/cjs/components/edit-marker-modal/EditMarkerModal.d.ts +8 -0
  34. package/dist/cjs/components/edit-marker-modal/EditMarkerModal.js +104 -0
  35. package/dist/cjs/components/edit-marker-modal/EditMarkerModal.js.map +1 -0
  36. package/dist/cjs/components/error-message-preview/ErrorMessagePreview.d.ts +15 -0
  37. package/dist/cjs/components/error-message-preview/ErrorMessagePreview.js +91 -0
  38. package/dist/cjs/components/error-message-preview/ErrorMessagePreview.js.map +1 -0
  39. package/dist/cjs/components/feature-flag-wrapper/FeatureFlagWrapper.d.ts +7 -0
  40. package/dist/cjs/components/feature-flag-wrapper/FeatureFlagWrapper.js +48 -0
  41. package/dist/cjs/components/feature-flag-wrapper/FeatureFlagWrapper.js.map +1 -0
  42. package/dist/cjs/components/header/Header_BACKUP_73021.d.ts +33 -0
  43. package/dist/cjs/components/header/Header_BACKUP_73021.js +393 -0
  44. package/dist/cjs/components/header/Header_BACKUP_73021.js.map +1 -0
  45. package/dist/cjs/components/header/Header_BASE_73021.d.ts +29 -0
  46. package/dist/cjs/components/header/Header_BASE_73021.js +376 -0
  47. package/dist/cjs/components/header/Header_BASE_73021.js.map +1 -0
  48. package/dist/cjs/components/header/Header_LOCAL_73021.d.ts +33 -0
  49. package/dist/cjs/components/header/Header_LOCAL_73021.js +382 -0
  50. package/dist/cjs/components/header/Header_LOCAL_73021.js.map +1 -0
  51. package/dist/cjs/components/header/Header_REMOTE_73021.d.ts +30 -0
  52. package/dist/cjs/components/header/Header_REMOTE_73021.js +386 -0
  53. package/dist/cjs/components/header/Header_REMOTE_73021.js.map +1 -0
  54. package/dist/cjs/components/header/StoryDropdown.d.ts +6 -0
  55. package/dist/cjs/components/header/StoryDropdown.js +111 -0
  56. package/dist/cjs/components/header/StoryDropdown.js.map +1 -0
  57. package/dist/cjs/components/number-field/NumberField.d.ts +2 -2
  58. package/dist/cjs/components/number-field/NumberField.js +4 -7
  59. package/dist/cjs/components/number-field/NumberField.js.map +1 -1
  60. package/dist/cjs/components/publish-wizard/PublishWizard.d.ts +4 -3
  61. package/dist/cjs/components/publish-wizard/PublishWizard.js +104 -38
  62. package/dist/cjs/components/publish-wizard/PublishWizard.js.map +1 -1
  63. package/dist/cjs/components/replace-files-modal/ReplaceFilesModal.d.ts +11 -0
  64. package/dist/cjs/components/replace-files-modal/ReplaceFilesModal.js +213 -0
  65. package/dist/cjs/components/replace-files-modal/ReplaceFilesModal.js.map +1 -0
  66. package/dist/cjs/components/service-icon/ServiceIcon.test.d.ts +0 -0
  67. package/dist/cjs/components/service-icon/ServiceIcon.test.js +1 -0
  68. package/dist/cjs/components/service-icon/ServiceIcon.test.js.map +1 -0
  69. package/dist/cjs/components/tag/Tag.test.d.ts +0 -0
  70. package/dist/cjs/components/tag/Tag.test.js +1 -0
  71. package/dist/cjs/components/tag/Tag.test.js.map +1 -0
  72. package/dist/cjs/constants/copy.d.ts +9 -0
  73. package/dist/cjs/constants/copy.js +13 -2
  74. package/dist/cjs/constants/copy.js.map +1 -1
  75. package/dist/cjs/constants/snippets.d.ts +18 -0
  76. package/dist/cjs/constants/snippets.js +3 -0
  77. package/dist/cjs/constants/snippets.js.map +1 -0
  78. package/dist/cjs/index.d.ts +3 -1
  79. package/dist/cjs/index.js +3 -1
  80. package/dist/cjs/index.js.map +1 -1
  81. package/dist/cjs/redux/actions/auth.d.ts +9 -0
  82. package/dist/cjs/redux/actions/auth.js +30 -0
  83. package/dist/cjs/redux/actions/auth.js.map +1 -0
  84. package/dist/cjs/redux/reducers/auth.d.ts +3 -0
  85. package/dist/cjs/redux/reducers/auth.js +67 -0
  86. package/dist/cjs/redux/reducers/auth.js.map +1 -0
  87. package/dist/cjs/services/API.d.ts +2 -0
  88. package/dist/cjs/services/API.js +6 -0
  89. package/dist/cjs/services/API.js.map +1 -1
  90. package/dist/cjs/services/Auth0.d.ts +18 -0
  91. package/dist/cjs/services/Auth0.js +102 -0
  92. package/dist/cjs/services/Auth0.js.map +1 -0
  93. package/dist/cjs/services/Session.d.ts +26 -0
  94. package/dist/cjs/services/Session.js +155 -0
  95. package/dist/cjs/services/Session.js.map +1 -0
  96. package/dist/esm/components/app-wrapper/AppWrapper.d.ts +1 -0
  97. package/dist/esm/components/app-wrapper/AppWrapper.js +1 -1
  98. package/dist/esm/components/app-wrapper/AppWrapper.js.map +1 -1
  99. package/dist/esm/components/app-wrapper/AppWrapperV2.d.ts +26 -0
  100. package/dist/esm/components/app-wrapper/AppWrapperV2.js +142 -0
  101. package/dist/esm/components/app-wrapper/AppWrapperV2.js.map +1 -0
  102. package/dist/esm/components/app-wrapper/AppWrapperV3.d.ts +19 -0
  103. package/dist/esm/components/app-wrapper/AppWrapperV3.js +88 -0
  104. package/dist/esm/components/app-wrapper/AppWrapperV3.js.map +1 -0
  105. package/dist/esm/components/app-wrapper/AppWrapper_BACKUP_73190.d.ts +27 -0
  106. package/dist/esm/components/app-wrapper/AppWrapper_BACKUP_73190.js +194 -0
  107. package/dist/esm/components/app-wrapper/AppWrapper_BACKUP_73190.js.map +1 -0
  108. package/dist/esm/components/app-wrapper/AppWrapper_BASE_73190.d.ts +28 -0
  109. package/dist/esm/components/app-wrapper/AppWrapper_BASE_73190.js +208 -0
  110. package/dist/esm/components/app-wrapper/AppWrapper_BASE_73190.js.map +1 -0
  111. package/dist/esm/components/app-wrapper/AppWrapper_LOCAL_73190.d.ts +27 -0
  112. package/dist/esm/components/app-wrapper/AppWrapper_LOCAL_73190.js +194 -0
  113. package/dist/esm/components/app-wrapper/AppWrapper_LOCAL_73190.js.map +1 -0
  114. package/dist/esm/components/app-wrapper/AppWrapper_REMOTE_73190.d.ts +28 -0
  115. package/dist/esm/components/app-wrapper/AppWrapper_REMOTE_73190.js +204 -0
  116. package/dist/esm/components/app-wrapper/AppWrapper_REMOTE_73190.js.map +1 -0
  117. package/dist/esm/components/auth-gate/AuthGate.d.ts +2 -0
  118. package/dist/esm/components/auth-gate/AuthGate.js +59 -0
  119. package/dist/esm/components/auth-gate/AuthGate.js.map +1 -0
  120. package/dist/esm/components/change-report/ChangeReportTree.d.ts +10 -0
  121. package/dist/esm/components/change-report/ChangeReportTree.js +42 -0
  122. package/dist/esm/components/change-report/ChangeReportTree.js.map +1 -0
  123. package/dist/esm/components/dropdown/{Dropdown.stories.js → dropdown.stories.js} +1 -1
  124. package/dist/esm/components/dropdown/{Dropdown.stories.js.map → dropdown.stories.js.map} +1 -1
  125. package/dist/esm/components/edit-guide-modal/EditGuideModal.d.ts +8 -0
  126. package/dist/esm/components/edit-guide-modal/EditGuideModal.js +65 -0
  127. package/dist/esm/components/edit-guide-modal/EditGuideModal.js.map +1 -0
  128. package/dist/esm/components/edit-marker-modal/EditMarkerModal.d.ts +8 -0
  129. package/dist/esm/components/edit-marker-modal/EditMarkerModal.js +72 -0
  130. package/dist/esm/components/edit-marker-modal/EditMarkerModal.js.map +1 -0
  131. package/dist/esm/components/error-message-preview/ErrorMessagePreview.d.ts +15 -0
  132. package/dist/esm/components/error-message-preview/ErrorMessagePreview.js +35 -0
  133. package/dist/esm/components/error-message-preview/ErrorMessagePreview.js.map +1 -0
  134. package/dist/esm/components/feature-flag-wrapper/FeatureFlagWrapper.d.ts +7 -0
  135. package/dist/esm/components/feature-flag-wrapper/FeatureFlagWrapper.js +10 -0
  136. package/dist/esm/components/feature-flag-wrapper/FeatureFlagWrapper.js.map +1 -0
  137. package/dist/esm/components/header/Header_BACKUP_73021.d.ts +33 -0
  138. package/dist/esm/components/header/Header_BACKUP_73021.js +336 -0
  139. package/dist/esm/components/header/Header_BACKUP_73021.js.map +1 -0
  140. package/dist/esm/components/header/Header_BASE_73021.d.ts +29 -0
  141. package/dist/esm/components/header/Header_BASE_73021.js +322 -0
  142. package/dist/esm/components/header/Header_BASE_73021.js.map +1 -0
  143. package/dist/esm/components/header/Header_LOCAL_73021.d.ts +33 -0
  144. package/dist/esm/components/header/Header_LOCAL_73021.js +328 -0
  145. package/dist/esm/components/header/Header_LOCAL_73021.js.map +1 -0
  146. package/dist/esm/components/header/Header_REMOTE_73021.d.ts +30 -0
  147. package/dist/esm/components/header/Header_REMOTE_73021.js +329 -0
  148. package/dist/esm/components/header/Header_REMOTE_73021.js.map +1 -0
  149. package/dist/esm/components/header/StoryDropdown.d.ts +6 -0
  150. package/dist/esm/components/header/StoryDropdown.js +82 -0
  151. package/dist/esm/components/header/StoryDropdown.js.map +1 -0
  152. package/dist/esm/components/number-field/NumberField.d.ts +2 -2
  153. package/dist/esm/components/number-field/NumberField.js +4 -5
  154. package/dist/esm/components/number-field/NumberField.js.map +1 -1
  155. package/dist/esm/components/publish-wizard/PublishWizard.d.ts +4 -3
  156. package/dist/esm/components/publish-wizard/PublishWizard.js +92 -38
  157. package/dist/esm/components/publish-wizard/PublishWizard.js.map +1 -1
  158. package/dist/esm/components/replace-files-modal/ReplaceFilesModal.d.ts +11 -0
  159. package/dist/esm/components/replace-files-modal/ReplaceFilesModal.js +141 -0
  160. package/dist/esm/components/replace-files-modal/ReplaceFilesModal.js.map +1 -0
  161. package/dist/esm/components/service-icon/ServiceIcon.test.d.ts +0 -0
  162. package/dist/esm/components/service-icon/ServiceIcon.test.js +1 -0
  163. package/dist/esm/components/service-icon/ServiceIcon.test.js.map +1 -0
  164. package/dist/esm/components/tag/Tag.test.d.ts +0 -0
  165. package/dist/esm/components/tag/Tag.test.js +1 -0
  166. package/dist/esm/components/tag/Tag.test.js.map +1 -0
  167. package/dist/esm/constants/copy.d.ts +9 -0
  168. package/dist/esm/constants/copy.js +13 -2
  169. package/dist/esm/constants/copy.js.map +1 -1
  170. package/dist/esm/constants/snippets.d.ts +18 -0
  171. package/dist/esm/constants/snippets.js +2 -0
  172. package/dist/esm/constants/snippets.js.map +1 -0
  173. package/dist/esm/index.d.ts +3 -1
  174. package/dist/esm/index.js +2 -1
  175. package/dist/esm/index.js.map +1 -1
  176. package/dist/esm/redux/actions/auth.d.ts +9 -0
  177. package/dist/esm/redux/actions/auth.js +25 -0
  178. package/dist/esm/redux/actions/auth.js.map +1 -0
  179. package/dist/esm/redux/reducers/auth.d.ts +3 -0
  180. package/dist/esm/redux/reducers/auth.js +27 -0
  181. package/dist/esm/redux/reducers/auth.js.map +1 -0
  182. package/dist/esm/services/API.d.ts +2 -0
  183. package/dist/esm/services/API.js +6 -0
  184. package/dist/esm/services/API.js.map +1 -1
  185. package/dist/esm/services/Auth0.d.ts +18 -0
  186. package/dist/esm/services/Auth0.js +68 -0
  187. package/dist/esm/services/Auth0.js.map +1 -0
  188. package/dist/esm/services/Session.d.ts +26 -0
  189. package/dist/esm/services/Session.js +107 -0
  190. package/dist/esm/services/Session.js.map +1 -0
  191. package/dist/styles.css +127 -0
  192. package/dist/styles.less +152 -0
  193. package/less/components/change-report.less +115 -0
  194. package/less/components/publish-wizard.less +36 -0
  195. package/less/entry.less +1 -0
  196. package/package.json +6 -17
  197. package/src/components/app-wrapper/AppWrapper.tsx +6 -1
  198. package/src/components/change-report/ChangeReportTree.tsx +125 -0
  199. package/src/components/number-field/NumberField.tsx +9 -15
  200. package/src/components/publish-wizard/PublishWizard.tsx +144 -45
  201. package/src/components/service-icon/ServiceIcon.test.tsx +0 -0
  202. package/src/components/tag/Tag.test.tsx +0 -0
  203. package/src/constants/copy.ts +16 -2
  204. package/src/constants/snippets.ts +25 -0
  205. package/src/index.ts +7 -1
  206. package/src/services/API.ts +8 -0
  207. package/tsconfig.json +1 -1
  208. package/src/components/advanced-number-field/AdvancedNumberField.test.tsx +0 -724
  209. package/src/components/anchor-field/AnchorField.test.tsx +0 -130
  210. package/src/components/asset-details/AssetDetails.test.tsx +0 -494
  211. package/src/components/assets/AssetField.test.tsx +0 -449
  212. package/src/components/assets/AssetsTableAssetIdCell.test.tsx +0 -142
  213. package/src/components/assets/AssetsTableAssetIdFilter.test.tsx +0 -95
  214. package/src/components/assets/AssetsTableComplexTagCell.test.tsx +0 -161
  215. package/src/components/assets/AssetsTableDateCell.test.tsx +0 -106
  216. package/src/components/assets/AssetsTableDropzone.test.tsx +0 -132
  217. package/src/components/assets/AssetsTableDurationCell.test.tsx +0 -119
  218. package/src/components/assets/AssetsTableGlobalCell.test.tsx +0 -46
  219. package/src/components/assets/AssetsTableNameCell.test.tsx +0 -166
  220. package/src/components/assets/AssetsTableNameFilter.test.tsx +0 -95
  221. package/src/components/assets/AssetsTablePreviewCell.test.tsx +0 -191
  222. package/src/components/assets/AssetsTableRateCell.test.tsx +0 -87
  223. package/src/components/assets/AssetsTableSelectCell.test.tsx +0 -156
  224. package/src/components/assets/AssetsTableSelectFilter.test.tsx +0 -119
  225. package/src/components/assets/AssetsTableStatusCell.test.tsx +0 -60
  226. package/src/components/number-field/NumberField.test.tsx +0 -383
  227. package/src/components/text-field/TextField.test.tsx +0 -988
  228. package/src/test/setup.ts +0 -91
  229. package/src/test/utils.tsx +0 -44
  230. package/tsconfig.eslint.json +0 -8
  231. package/vitest.config.ts +0 -31
  232. /package/dist/cjs/components/dropdown/{Dropdown.stories.d.ts → dropdown.stories.d.ts} +0 -0
  233. /package/dist/esm/components/dropdown/{Dropdown.stories.d.ts → dropdown.stories.d.ts} +0 -0
  234. /package/src/components/dropdown/{Dropdown.stories.tsx → dropdown.stories.tsx} +0 -0
@@ -1,166 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
- import React from 'react';
3
- import { render, act } from '@testing-library/react';
4
- import { Provider } from 'react-redux';
5
- import { legacy_createStore as createStore } from 'redux';
6
- import { assets as copy } from '../../constants/copy';
7
-
8
- let capturedTextFieldProps: any = {};
9
-
10
- vi.mock('../text-field/TextField', () => ({
11
- default: (props: any) => {
12
- capturedTextFieldProps = props;
13
- return (
14
- <div
15
- data-testid='mock-text-field'
16
- data-value={props.value}
17
- data-disabled={props.disabled}>
18
- <input
19
- value={props.value || ''}
20
- onChange={(e) => props.onChange((e.target as HTMLInputElement).value)}
21
- readOnly={props.disabled}
22
- />
23
- </div>
24
- );
25
- }
26
- }));
27
-
28
- vi.mock('../determinate-loader/DeterminateLoader', () => ({
29
- DeterminateLoader: ({ progress, text }: any) => (
30
- <div
31
- data-testid='determinate-loader'
32
- data-progress={progress}>
33
- {text}
34
- </div>
35
- )
36
- }));
37
-
38
- vi.mock('../../redux/actions/asset-list', () => ({
39
- updateAssetName: vi.fn((_api, _id, _name) => ({ type: 'MOCK_UPDATE_NAME' })),
40
- default: {}
41
- }));
42
-
43
- import AssetsTableNameCellConnected from './AssetsTableNameCell';
44
- import { updateAssetName } from '../../redux/actions/asset-list';
45
-
46
- const MOCK_ASSET_ID = 'asset-abc';
47
- const MOCK_ASSET_NAME = 'my-video.mp4';
48
- const MOCK_API = { updateAsset: vi.fn() };
49
-
50
- const createMockStore = () => createStore((state = {}) => state);
51
-
52
- const buildCellProp = (overrides: Record<string, any> = {}) => ({
53
- row: {
54
- original: {
55
- name: MOCK_ASSET_NAME,
56
- id: MOCK_ASSET_ID,
57
- percent: undefined,
58
- error: undefined,
59
- ...overrides
60
- }
61
- }
62
- });
63
-
64
- const renderComponent = (cellOverrides: Record<string, any> = {}, disabled = false) => {
65
- const store = createMockStore();
66
- const cell = buildCellProp(cellOverrides);
67
-
68
- const result = render(
69
- <Provider store={store}>
70
- <AssetsTableNameCellConnected
71
- cell={cell}
72
- api={MOCK_API}
73
- disabled={disabled}
74
- />
75
- </Provider>
76
- );
77
-
78
- return result;
79
- };
80
-
81
- describe('AssetsTableNameCell', () => {
82
- beforeEach(() => {
83
- vi.useFakeTimers();
84
- vi.mocked(updateAssetName).mockClear();
85
- capturedTextFieldProps = {};
86
- });
87
-
88
- afterEach(() => {
89
- vi.useRealTimers();
90
- });
91
-
92
- it('renders a TextField with the asset name when not uploading', () => {
93
- const { getByTestId } = renderComponent();
94
- const textField = getByTestId('mock-text-field');
95
-
96
- expect(textField.getAttribute('data-value')).toBe(MOCK_ASSET_NAME);
97
- expect(textField.getAttribute('data-disabled')).toBe('false');
98
- });
99
-
100
- it('renders a TextField as disabled when disabled prop is true', () => {
101
- const { getByTestId } = renderComponent({}, true);
102
- const textField = getByTestId('mock-text-field');
103
-
104
- expect(textField.getAttribute('data-disabled')).toBe('true');
105
- });
106
-
107
- it('renders DeterminateLoader when upload progress is under 100', () => {
108
- const { getByTestId } = renderComponent({ percent: 45 });
109
- const loader = getByTestId('determinate-loader');
110
-
111
- expect(loader.getAttribute('data-progress')).toBe('45');
112
- expect(loader.textContent).toBe(MOCK_ASSET_NAME);
113
- });
114
-
115
- it('renders prepare phase text when upload progress is 100 and no error', () => {
116
- const { container } = renderComponent({ percent: 100 });
117
-
118
- expect(container.textContent).toBe(copy.uploads.preparePhase);
119
- });
120
-
121
- it('renders error message when upload progress is 100 and error exists', () => {
122
- const errorMessage = 'Upload failed';
123
- const { container } = renderComponent({ percent: 100, error: errorMessage });
124
-
125
- expect(container.textContent).toBe(errorMessage);
126
- });
127
-
128
- it('dispatches updateAssetName after debounce on text change', () => {
129
- renderComponent();
130
-
131
- act(() => {
132
- capturedTextFieldProps.onChange('new-name');
133
- });
134
-
135
- expect(updateAssetName).not.toHaveBeenCalled();
136
-
137
- act(() => {
138
- vi.advanceTimersByTime(1000);
139
- });
140
-
141
- expect(updateAssetName).toHaveBeenCalledWith(MOCK_API, MOCK_ASSET_ID, 'new-name');
142
- });
143
-
144
- it('resets debounce timer on rapid changes', () => {
145
- renderComponent();
146
-
147
- act(() => {
148
- capturedTextFieldProps.onChange('first');
149
- });
150
-
151
- act(() => {
152
- vi.advanceTimersByTime(500);
153
- });
154
-
155
- act(() => {
156
- capturedTextFieldProps.onChange('second');
157
- });
158
-
159
- act(() => {
160
- vi.advanceTimersByTime(1000);
161
- });
162
-
163
- expect(updateAssetName).toHaveBeenCalledTimes(1);
164
- expect(updateAssetName).toHaveBeenCalledWith(MOCK_API, MOCK_ASSET_ID, 'second');
165
- });
166
- });
@@ -1,95 +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
- vi.mock('../text-field/TextField', () => ({
8
- default: ({ className, submittable, submittableType, value, doSubmit, header }: any) => (
9
- <div
10
- data-testid='mock-text-field'
11
- data-classname={className}
12
- data-submittable={submittable}
13
- data-submittable-type={submittableType}
14
- data-value={value || ''}
15
- data-header={header}>
16
- <button
17
- data-testid='submit-trigger'
18
- onClick={() => doSubmit('new-filter-value')}>
19
- Submit
20
- </button>
21
- </div>
22
- )
23
- }));
24
-
25
- vi.mock('../../redux/actions/asset-filters', () => ({
26
- updateFilters: vi.fn((filters) => ({ type: 'assetFilters/UPDATE', newFilters: filters })),
27
- default: { UPDATE: 'assetFilters/UPDATE', RESET: 'footageFilters/RESET' }
28
- }));
29
-
30
- import AssetsTableNameFilterMemoized from './AssetsTableNameFilter';
31
-
32
- const MOCK_NAME_FILTER = 'existing-name-filter';
33
-
34
- const createMockStore = (nameFilter = '') => {
35
- const initialState = { assetFilters: { name: nameFilter } };
36
- return createStore((state: any = initialState, action: any) => {
37
- if (action.type === 'assetFilters/UPDATE') {
38
- return {
39
- ...state,
40
- assetFilters: { ...state.assetFilters, ...action.newFilters }
41
- };
42
- }
43
- return state;
44
- });
45
- };
46
-
47
- const renderComponent = (nameFilter = '') => {
48
- const store = createMockStore(nameFilter);
49
-
50
- const result = render(
51
- <Provider store={store}>
52
- <AssetsTableNameFilterMemoized />
53
- </Provider>
54
- );
55
-
56
- return { ...result, store };
57
- };
58
-
59
- describe('AssetsTableNameFilter', () => {
60
- it('renders the TextField with correct props', () => {
61
- const { getByTestId } = renderComponent(MOCK_NAME_FILTER);
62
- const textField = getByTestId('mock-text-field');
63
-
64
- expect(textField.getAttribute('data-classname')).toBe('asset-name');
65
- expect(textField.getAttribute('data-submittable')).toBe('true');
66
- expect(textField.getAttribute('data-submittable-type')).toBe('search');
67
- expect(textField.getAttribute('data-value')).toBe(MOCK_NAME_FILTER);
68
- expect(textField.getAttribute('data-header')).toBe('true');
69
- });
70
-
71
- it('dispatches updateFilters with the submitted name value', () => {
72
- const { getByTestId, store } = renderComponent();
73
- const submitButton = getByTestId('submit-trigger');
74
-
75
- submitButton.click();
76
-
77
- const storeState = store.getState();
78
- expect(storeState.assetFilters.name).toBe('new-filter-value');
79
- });
80
-
81
- it('renders with an empty filter value when no name is set', () => {
82
- const { getByTestId } = renderComponent();
83
- const textField = getByTestId('mock-text-field');
84
-
85
- expect(textField.getAttribute('data-value')).toBe('');
86
- });
87
-
88
- it('passes the current filter value from the redux store', () => {
89
- const filterValue = 'search-term-xyz';
90
- const { getByTestId } = renderComponent(filterValue);
91
- const textField = getByTestId('mock-text-field');
92
-
93
- expect(textField.getAttribute('data-value')).toBe(filterValue);
94
- });
95
- });
@@ -1,191 +0,0 @@
1
- import { describe, it, expect, vi } from 'vitest';
2
- import React from 'react';
3
- import { render, fireEvent } from '@testing-library/react';
4
-
5
- const MOCK_PREVIEW_STYLE = { width: 200, height: 150 };
6
-
7
- vi.mock('../../index', () => ({
8
- ASSET_TYPES: {
9
- VIDEO: 'video',
10
- IMAGE: 'image',
11
- AUDIO: 'audio'
12
- },
13
- AssetsTypeIcon: ({ type }: any) => (
14
- <div
15
- data-testid='assets-type-icon'
16
- data-type={type}
17
- />
18
- ),
19
- ImagePreview: ({ url, onRequestClose, style }: any) => (
20
- <div
21
- data-testid='image-preview'
22
- data-url={url}
23
- style={style}>
24
- <button
25
- data-testid='image-close'
26
- onClick={onRequestClose}>
27
- Close
28
- </button>
29
- </div>
30
- ),
31
- VideoPreview: ({ url, onRequestClose, playbackSettings, style }: any) => (
32
- <div
33
- data-testid='video-preview'
34
- data-url={url}
35
- data-autoplay={playbackSettings?.autoPlay}
36
- data-loop={playbackSettings?.loop}
37
- style={style}>
38
- <button
39
- data-testid='video-close'
40
- onClick={onRequestClose}>
41
- Close
42
- </button>
43
- </div>
44
- ),
45
- AudioPreview: ({ url, onRequestClose, playbackSettings, style }: any) => (
46
- <div
47
- data-testid='audio-preview'
48
- data-url={url}
49
- data-autoplay={playbackSettings?.autoPlay}
50
- data-loop={playbackSettings?.loop}
51
- style={style}>
52
- <button
53
- data-testid='audio-close'
54
- onClick={onRequestClose}>
55
- Close
56
- </button>
57
- </div>
58
- ),
59
- getMediaPreviewStyle: vi.fn(() => MOCK_PREVIEW_STYLE)
60
- }));
61
-
62
- import AssetsTablePreviewCellMemoized from './AssetsTablePreviewCell';
63
-
64
- const MOCK_URL = 'https://example.com/asset.mp4';
65
- const MOCK_WIDTH = 1920;
66
- const MOCK_HEIGHT = 1080;
67
-
68
- const buildCellProp = (type: string) => ({
69
- row: {
70
- values: { type },
71
- original: {
72
- url: MOCK_URL,
73
- width: MOCK_WIDTH,
74
- height: MOCK_HEIGHT
75
- }
76
- }
77
- });
78
-
79
- const renderComponent = (
80
- type: string,
81
- showMedia: boolean,
82
- overrides: { asset?: any; onClick?: () => void; onRequestClose?: () => void } = {}
83
- ) => {
84
- const onClick = overrides.onClick ?? vi.fn();
85
- const onRequestClose = overrides.onRequestClose ?? vi.fn();
86
- const asset = overrides.asset ?? undefined;
87
- const cell = buildCellProp(type);
88
-
89
- const result = render(
90
- <AssetsTablePreviewCellMemoized
91
- cell={cell}
92
- showMedia={showMedia}
93
- asset={asset}
94
- onClick={onClick}
95
- onRequestClose={onRequestClose}
96
- />
97
- );
98
-
99
- return { ...result, onClick, onRequestClose };
100
- };
101
-
102
- describe('AssetsTablePreviewCell', () => {
103
- it('renders AssetsTypeIcon with the correct type', () => {
104
- const { getByTestId } = renderComponent('video', false);
105
- const icon = getByTestId('assets-type-icon');
106
-
107
- expect(icon.getAttribute('data-type')).toBe('video');
108
- });
109
-
110
- it('calls onClick when clicked and showMedia is false', () => {
111
- const onClick = vi.fn();
112
- const { container } = renderComponent('image', false, { onClick });
113
- const cell = container.querySelector('.asset-type-cell');
114
-
115
- if (cell) {
116
- fireEvent.click(cell);
117
- }
118
-
119
- expect(onClick).toHaveBeenCalledOnce();
120
- });
121
-
122
- it('does not call onClick when clicked and showMedia is true', () => {
123
- const onClick = vi.fn();
124
- const { container } = renderComponent('image', true, { onClick });
125
- const cell = container.querySelector('.asset-type-cell');
126
-
127
- if (cell) {
128
- fireEvent.click(cell);
129
- }
130
-
131
- expect(onClick).not.toHaveBeenCalled();
132
- });
133
-
134
- it('renders ImagePreview when type is IMAGE and showMedia is true', () => {
135
- const { getByTestId, queryByTestId } = renderComponent('image', true);
136
-
137
- expect(getByTestId('image-preview').getAttribute('data-url')).toBe(MOCK_URL);
138
- expect(queryByTestId('video-preview')).toBeNull();
139
- expect(queryByTestId('audio-preview')).toBeNull();
140
- });
141
-
142
- it('renders VideoPreview when type is VIDEO and showMedia is true', () => {
143
- const { getByTestId, queryByTestId } = renderComponent('video', true);
144
-
145
- expect(getByTestId('video-preview').getAttribute('data-url')).toBe(MOCK_URL);
146
- expect(queryByTestId('image-preview')).toBeNull();
147
- expect(queryByTestId('audio-preview')).toBeNull();
148
- });
149
-
150
- it('renders AudioPreview when type is AUDIO and showMedia is true', () => {
151
- const { getByTestId, queryByTestId } = renderComponent('audio', true);
152
-
153
- expect(getByTestId('audio-preview').getAttribute('data-url')).toBe(MOCK_URL);
154
- expect(queryByTestId('image-preview')).toBeNull();
155
- expect(queryByTestId('video-preview')).toBeNull();
156
- });
157
-
158
- it('does not render any preview when showMedia is false', () => {
159
- const { queryByTestId } = renderComponent('video', false);
160
-
161
- expect(queryByTestId('image-preview')).toBeNull();
162
- expect(queryByTestId('video-preview')).toBeNull();
163
- expect(queryByTestId('audio-preview')).toBeNull();
164
- });
165
-
166
- it('calls onRequestClose when a preview close button is clicked', () => {
167
- const onRequestClose = vi.fn();
168
- const { getByTestId } = renderComponent('image', true, { onRequestClose });
169
-
170
- fireEvent.click(getByTestId('image-close'));
171
-
172
- expect(onRequestClose).toHaveBeenCalledOnce();
173
- });
174
-
175
- it('uses asset url/dimensions when asset prop is provided', () => {
176
- const customAsset = {
177
- url: 'https://example.com/custom.png',
178
- width: 800,
179
- height: 600
180
- };
181
- const { getByTestId } = renderComponent('image', true, { asset: customAsset });
182
-
183
- expect(getByTestId('image-preview').getAttribute('data-url')).toBe(customAsset.url);
184
- });
185
-
186
- it('falls back to cell.row.original values when asset is undefined', () => {
187
- const { getByTestId } = renderComponent('image', true);
188
-
189
- expect(getByTestId('image-preview').getAttribute('data-url')).toBe(MOCK_URL);
190
- });
191
- });
@@ -1,87 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import React from 'react';
3
- import { render } from '@testing-library/react';
4
- import AssetsTableRateCell from './AssetsTableRateCell';
5
-
6
- const VIDEO_COMPOSITION_TYPE = 'video_composition';
7
- const VIDEO_TYPE = 'video';
8
-
9
- const buildCellProp = (overrides: Record<string, any> = {}) => ({
10
- row: {
11
- original: {
12
- type: VIDEO_TYPE,
13
- data: null,
14
- rate: null,
15
- ...overrides
16
- }
17
- }
18
- });
19
-
20
- const renderComponent = (overrides: Record<string, any> = {}) => {
21
- return render(<AssetsTableRateCell cell={buildCellProp(overrides)} />);
22
- };
23
-
24
- describe('AssetsTableRateCell', () => {
25
- it('renders the rate formatted to two decimal places', () => {
26
- const { container } = renderComponent({ rate: 29.97 });
27
- const cell = container.querySelector('.asset-rate-cell');
28
-
29
- expect(cell?.textContent).toBe('29.97');
30
- });
31
-
32
- it('renders an integer rate with two decimal places', () => {
33
- const { container } = renderComponent({ rate: 30 });
34
- const cell = container.querySelector('.asset-rate-cell');
35
-
36
- expect(cell?.textContent).toBe('30.00');
37
- });
38
-
39
- it('renders empty when rate is null', () => {
40
- const { container } = renderComponent({ rate: null });
41
- const cell = container.querySelector('.asset-rate-cell');
42
-
43
- expect(cell?.textContent).toBe('');
44
- });
45
-
46
- it('renders empty when rate is undefined', () => {
47
- const { container } = renderComponent({ rate: undefined });
48
- const cell = container.querySelector('.asset-rate-cell');
49
-
50
- expect(cell?.textContent).toBe('');
51
- });
52
-
53
- it('uses rate from parsed data JSON when type is video_composition', () => {
54
- const compositionData = JSON.stringify({ rate: 24 });
55
- const { container } = renderComponent({
56
- type: VIDEO_COMPOSITION_TYPE,
57
- data: compositionData,
58
- rate: 30
59
- });
60
- const cell = container.querySelector('.asset-rate-cell');
61
-
62
- expect(cell?.textContent).toBe('24.00');
63
- });
64
-
65
- it('ignores data when type is not video_composition', () => {
66
- const compositionData = JSON.stringify({ rate: 24 });
67
- const { container } = renderComponent({
68
- type: VIDEO_TYPE,
69
- data: compositionData,
70
- rate: 60
71
- });
72
- const cell = container.querySelector('.asset-rate-cell');
73
-
74
- expect(cell?.textContent).toBe('60.00');
75
- });
76
-
77
- it('does not parse data when data is null even for video_composition type', () => {
78
- const { container } = renderComponent({
79
- type: VIDEO_COMPOSITION_TYPE,
80
- data: null,
81
- rate: 25
82
- });
83
- const cell = container.querySelector('.asset-rate-cell');
84
-
85
- expect(cell?.textContent).toBe('25.00');
86
- });
87
- });
@@ -1,156 +0,0 @@
1
- import { describe, it, expect, vi } from 'vitest';
2
- import React from 'react';
3
- import { render, fireEvent } from '@testing-library/react';
4
- import { Provider } from 'react-redux';
5
- import { legacy_createStore as createStore } from 'redux';
6
-
7
- vi.mock('../checkbox-field/CheckboxField', () => ({
8
- default: ({ label, width, value, onChange }: any) => (
9
- <div
10
- data-testid='mock-checkbox-field'
11
- data-label={label}
12
- data-width={width}
13
- data-value={value}>
14
- <input
15
- type='checkbox'
16
- checked={value}
17
- onChange={(e) => onChange(e.target.checked, e)}
18
- />
19
- </div>
20
- )
21
- }));
22
-
23
- vi.mock('../../redux/actions/selected-assets', () => ({
24
- selectAsset: vi.fn((id) => ({ type: 'selectedAssets/SELECT', id })),
25
- deselectAsset: vi.fn((id) => ({ type: 'selectedAssets/DESELECT', id })),
26
- selectMultipleAssets: vi.fn((id) => ({ type: 'selectedAssets/SELECT_MULTIPLE', id }))
27
- }));
28
-
29
- import AssetsTableSelectCellMemoized from './AssetsTableSelectCell';
30
-
31
- const MOCK_ASSET_ID = 'asset-123';
32
- const MOCK_OTHER_ASSET_ID = 'asset-456';
33
-
34
- const buildCellProp = (overrides: Record<string, any> = {}) => ({
35
- row: {
36
- original: {
37
- id: MOCK_ASSET_ID,
38
- type: 'video',
39
- ...overrides
40
- }
41
- }
42
- });
43
-
44
- const createMockStore = (selectedAssets: string[] = []) => {
45
- const initialState = { selectedAssets };
46
- return createStore((state: any = initialState, action: any) => {
47
- switch (action.type) {
48
- case 'selectedAssets/SELECT':
49
- return {
50
- ...state,
51
- selectedAssets: [...state.selectedAssets, action.id]
52
- };
53
- case 'selectedAssets/DESELECT':
54
- return {
55
- ...state,
56
- selectedAssets: state.selectedAssets.filter((id) => id !== action.id)
57
- };
58
- case 'selectedAssets/SELECT_MULTIPLE':
59
- return {
60
- ...state,
61
- selectedAssets: [...state.selectedAssets, action.id]
62
- };
63
- default:
64
- return state;
65
- }
66
- });
67
- };
68
-
69
- const renderComponent = (
70
- cellOverrides: Record<string, any> = {},
71
- selectedAssets: string[] = []
72
- ) => {
73
- const store = createMockStore(selectedAssets);
74
- const cell = buildCellProp(cellOverrides);
75
-
76
- const result = render(
77
- <Provider store={store}>
78
- <AssetsTableSelectCellMemoized cell={cell} />
79
- </Provider>
80
- );
81
-
82
- return { ...result, store };
83
- };
84
-
85
- describe('AssetsTableSelectCell', () => {
86
- it('renders CheckboxField with correct props when asset is not selected', () => {
87
- const { getByTestId } = renderComponent();
88
- const checkbox = getByTestId('mock-checkbox-field');
89
-
90
- expect(checkbox.getAttribute('data-label')).toBe('');
91
- expect(checkbox.getAttribute('data-width')).toBe('auto');
92
- expect(checkbox.getAttribute('data-value')).toBe('false');
93
- });
94
-
95
- it('renders CheckboxField as checked when asset is selected', () => {
96
- const { getByTestId } = renderComponent({}, [MOCK_ASSET_ID]);
97
- const checkbox = getByTestId('mock-checkbox-field');
98
-
99
- expect(checkbox.getAttribute('data-value')).toBe('true');
100
- });
101
-
102
- it('returns null when asset type is upload', () => {
103
- const { container } = renderComponent({ type: 'upload' });
104
-
105
- expect(container.firstChild).toBeNull();
106
- });
107
-
108
- it('dispatches selectAsset when checkbox is checked without shift key', () => {
109
- const { getByRole, store } = renderComponent();
110
- const checkboxInput = getByRole('checkbox');
111
-
112
- fireEvent.click(checkboxInput);
113
-
114
- const storeState = store.getState();
115
- expect(storeState.selectedAssets).toContain(MOCK_ASSET_ID);
116
- });
117
-
118
- it('dispatches deselectAsset when checkbox is unchecked', () => {
119
- const { getByRole, store } = renderComponent({}, [MOCK_ASSET_ID]);
120
- const checkboxInput = getByRole('checkbox');
121
-
122
- fireEvent.click(checkboxInput);
123
-
124
- const storeState = store.getState();
125
- expect(storeState.selectedAssets).not.toContain(MOCK_ASSET_ID);
126
- });
127
-
128
- it('dispatches selectMultipleAssets when checkbox is checked with shift key and other assets selected', () => {
129
- const { getByRole, store } = renderComponent({}, [MOCK_OTHER_ASSET_ID]);
130
- const checkboxInput = getByRole('checkbox');
131
-
132
- fireEvent.click(checkboxInput, { shiftKey: true });
133
-
134
- const storeState = store.getState();
135
- expect(storeState.selectedAssets).toContain(MOCK_ASSET_ID);
136
- expect(storeState.selectedAssets).toContain(MOCK_OTHER_ASSET_ID);
137
- });
138
-
139
- it('dispatches selectAsset when shift key is pressed but no other assets are selected', () => {
140
- const { getByRole, store } = renderComponent();
141
- const checkboxInput = getByRole('checkbox');
142
-
143
- fireEvent.click(checkboxInput, { shiftKey: true });
144
-
145
- const storeState = store.getState();
146
- expect(storeState.selectedAssets).toContain(MOCK_ASSET_ID);
147
- expect(storeState.selectedAssets).toHaveLength(1);
148
- });
149
-
150
- it('correctly identifies selected state when asset ID is in selectedAssets array', () => {
151
- const { getByTestId } = renderComponent({}, [MOCK_OTHER_ASSET_ID, MOCK_ASSET_ID]);
152
- const checkbox = getByTestId('mock-checkbox-field');
153
-
154
- expect(checkbox.getAttribute('data-value')).toBe('true');
155
- });
156
- });