@imposium-hub/components 2.9.0-0 → 2.9.0-10

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 (195) hide show
  1. package/dist/cjs/components/app-wrapper/AppWrapper.js +10 -1
  2. package/dist/cjs/components/app-wrapper/AppWrapper.js.map +1 -1
  3. package/dist/cjs/components/assets/AssetsTableAssetIdFilter.js +1 -1
  4. package/dist/cjs/components/assets/AssetsTableAssetIdFilter.js.map +1 -1
  5. package/dist/cjs/components/assets/AssetsTableNameFilter.js +1 -1
  6. package/dist/cjs/components/assets/AssetsTableNameFilter.js.map +1 -1
  7. package/dist/cjs/components/assets/AssetsTableTagsFilter.js +1 -1
  8. package/dist/cjs/components/assets/AssetsTableTagsFilter.js.map +1 -1
  9. package/dist/cjs/components/assets/AssetsUploadMenu.js +6 -2
  10. package/dist/cjs/components/assets/AssetsUploadMenu.js.map +1 -1
  11. package/dist/cjs/components/confirm-modal/ConfirmModal.js +3 -2
  12. package/dist/cjs/components/confirm-modal/ConfirmModal.js.map +1 -1
  13. package/dist/cjs/components/edit-guide-modal/EditGuideModal.d.ts +8 -0
  14. package/dist/cjs/components/edit-guide-modal/EditGuideModal.js +122 -0
  15. package/dist/cjs/components/edit-guide-modal/EditGuideModal.js.map +1 -0
  16. package/dist/cjs/components/edit-marker-modal/EditMarkerModal.d.ts +8 -0
  17. package/dist/cjs/components/edit-marker-modal/EditMarkerModal.js +104 -0
  18. package/dist/cjs/components/edit-marker-modal/EditMarkerModal.js.map +1 -0
  19. package/dist/cjs/components/field-wrapper/FieldWrapper.d.ts +1 -0
  20. package/dist/cjs/components/field-wrapper/FieldWrapper.js +10 -8
  21. package/dist/cjs/components/field-wrapper/FieldWrapper.js.map +1 -1
  22. package/dist/cjs/components/header/Header.js +9 -5
  23. package/dist/cjs/components/header/Header.js.map +1 -1
  24. package/dist/cjs/components/number-field/NumberField.d.ts +1 -0
  25. package/dist/cjs/components/number-field/NumberField.js +5 -2
  26. package/dist/cjs/components/number-field/NumberField.js.map +1 -1
  27. package/dist/cjs/components/publish-wizard/publish/EmailWorkflow.js +52 -23
  28. package/dist/cjs/components/publish-wizard/publish/EmailWorkflow.js.map +1 -1
  29. package/dist/cjs/components/replace-files-modal/ReplaceFilesModal.d.ts +5 -3
  30. package/dist/cjs/components/replace-files-modal/ReplaceFilesModal.js +114 -46
  31. package/dist/cjs/components/replace-files-modal/ReplaceFilesModal.js.map +1 -1
  32. package/dist/cjs/components/slider-field/SliderField.d.ts +2 -0
  33. package/dist/cjs/components/slider-field/SliderField.js +17 -8
  34. package/dist/cjs/components/slider-field/SliderField.js.map +1 -1
  35. package/dist/cjs/components/story-previewer/StoryPreviewer.js +17 -3
  36. package/dist/cjs/components/story-previewer/StoryPreviewer.js.map +1 -1
  37. package/dist/cjs/components/tabs/Tabs.js +2 -1
  38. package/dist/cjs/components/tabs/Tabs.js.map +1 -1
  39. package/dist/cjs/components/text-field/TextField.d.ts +1 -0
  40. package/dist/cjs/components/text-field/TextField.js +2 -2
  41. package/dist/cjs/components/text-field/TextField.js.map +1 -1
  42. package/dist/cjs/constants/copy.d.ts +5 -1
  43. package/dist/cjs/constants/copy.js +6 -2
  44. package/dist/cjs/constants/copy.js.map +1 -1
  45. package/dist/cjs/constants/icons.d.ts +2 -0
  46. package/dist/cjs/constants/icons.js +3 -1
  47. package/dist/cjs/constants/icons.js.map +1 -1
  48. package/dist/cjs/constants/publish.d.ts +3 -0
  49. package/dist/cjs/constants/publish.js +5 -3
  50. package/dist/cjs/constants/publish.js.map +1 -1
  51. package/dist/cjs/index.d.ts +4 -3
  52. package/dist/cjs/index.js +8 -5
  53. package/dist/cjs/index.js.map +1 -1
  54. package/dist/cjs/redux/actions/asset-uploads.d.ts +1 -1
  55. package/dist/cjs/redux/actions/asset-uploads.js +169 -119
  56. package/dist/cjs/redux/actions/asset-uploads.js.map +1 -1
  57. package/dist/cjs/redux/actions/publish.js +14 -4
  58. package/dist/cjs/redux/actions/publish.js.map +1 -1
  59. package/dist/cjs/redux/reducers/asset-uploads.js +2 -1
  60. package/dist/cjs/redux/reducers/asset-uploads.js.map +1 -1
  61. package/dist/cjs/services/API.d.ts +3 -8
  62. package/dist/cjs/services/API.js +29 -101
  63. package/dist/cjs/services/API.js.map +1 -1
  64. package/dist/cjs/utils/modal.d.ts +4 -0
  65. package/dist/cjs/utils/modal.js +11 -2
  66. package/dist/cjs/utils/modal.js.map +1 -1
  67. package/dist/esm/components/app-wrapper/AppWrapper.js +10 -1
  68. package/dist/esm/components/app-wrapper/AppWrapper.js.map +1 -1
  69. package/dist/esm/components/assets/AssetsTableAssetIdFilter.js +1 -1
  70. package/dist/esm/components/assets/AssetsTableAssetIdFilter.js.map +1 -1
  71. package/dist/esm/components/assets/AssetsTableNameFilter.js +1 -1
  72. package/dist/esm/components/assets/AssetsTableNameFilter.js.map +1 -1
  73. package/dist/esm/components/assets/AssetsTableTagsFilter.js +1 -1
  74. package/dist/esm/components/assets/AssetsTableTagsFilter.js.map +1 -1
  75. package/dist/esm/components/assets/AssetsUploadMenu.js +7 -3
  76. package/dist/esm/components/assets/AssetsUploadMenu.js.map +1 -1
  77. package/dist/esm/components/confirm-modal/ConfirmModal.js +3 -2
  78. package/dist/esm/components/confirm-modal/ConfirmModal.js.map +1 -1
  79. package/dist/esm/components/edit-guide-modal/EditGuideModal.d.ts +8 -0
  80. package/dist/esm/components/edit-guide-modal/EditGuideModal.js +65 -0
  81. package/dist/esm/components/edit-guide-modal/EditGuideModal.js.map +1 -0
  82. package/dist/esm/components/edit-marker-modal/EditMarkerModal.d.ts +8 -0
  83. package/dist/esm/components/edit-marker-modal/EditMarkerModal.js +72 -0
  84. package/dist/esm/components/edit-marker-modal/EditMarkerModal.js.map +1 -0
  85. package/dist/esm/components/field-wrapper/FieldWrapper.d.ts +1 -0
  86. package/dist/esm/components/field-wrapper/FieldWrapper.js +10 -8
  87. package/dist/esm/components/field-wrapper/FieldWrapper.js.map +1 -1
  88. package/dist/esm/components/header/Header.js +7 -3
  89. package/dist/esm/components/header/Header.js.map +1 -1
  90. package/dist/esm/components/number-field/NumberField.d.ts +1 -0
  91. package/dist/esm/components/number-field/NumberField.js +5 -2
  92. package/dist/esm/components/number-field/NumberField.js.map +1 -1
  93. package/dist/esm/components/publish-wizard/publish/EmailWorkflow.js +43 -14
  94. package/dist/esm/components/publish-wizard/publish/EmailWorkflow.js.map +1 -1
  95. package/dist/esm/components/replace-files-modal/ReplaceFilesModal.d.ts +5 -3
  96. package/dist/esm/components/replace-files-modal/ReplaceFilesModal.js +110 -47
  97. package/dist/esm/components/replace-files-modal/ReplaceFilesModal.js.map +1 -1
  98. package/dist/esm/components/slider-field/SliderField.d.ts +2 -0
  99. package/dist/esm/components/slider-field/SliderField.js +17 -8
  100. package/dist/esm/components/slider-field/SliderField.js.map +1 -1
  101. package/dist/esm/components/story-previewer/StoryPreviewer.js +13 -4
  102. package/dist/esm/components/story-previewer/StoryPreviewer.js.map +1 -1
  103. package/dist/esm/components/tabs/Tabs.js +2 -1
  104. package/dist/esm/components/tabs/Tabs.js.map +1 -1
  105. package/dist/esm/components/text-field/TextField.d.ts +1 -0
  106. package/dist/esm/components/text-field/TextField.js +2 -2
  107. package/dist/esm/components/text-field/TextField.js.map +1 -1
  108. package/dist/esm/constants/copy.d.ts +5 -1
  109. package/dist/esm/constants/copy.js +6 -2
  110. package/dist/esm/constants/copy.js.map +1 -1
  111. package/dist/esm/constants/icons.d.ts +2 -0
  112. package/dist/esm/constants/icons.js +3 -1
  113. package/dist/esm/constants/icons.js.map +1 -1
  114. package/dist/esm/constants/publish.d.ts +3 -0
  115. package/dist/esm/constants/publish.js +4 -2
  116. package/dist/esm/constants/publish.js.map +1 -1
  117. package/dist/esm/index.d.ts +4 -3
  118. package/dist/esm/index.js +4 -3
  119. package/dist/esm/index.js.map +1 -1
  120. package/dist/esm/redux/actions/asset-uploads.d.ts +1 -1
  121. package/dist/esm/redux/actions/asset-uploads.js +165 -115
  122. package/dist/esm/redux/actions/asset-uploads.js.map +1 -1
  123. package/dist/esm/redux/actions/publish.js +14 -4
  124. package/dist/esm/redux/actions/publish.js.map +1 -1
  125. package/dist/esm/redux/reducers/asset-uploads.js +2 -1
  126. package/dist/esm/redux/reducers/asset-uploads.js.map +1 -1
  127. package/dist/esm/services/API.d.ts +3 -8
  128. package/dist/esm/services/API.js +9 -46
  129. package/dist/esm/services/API.js.map +1 -1
  130. package/dist/esm/utils/modal.d.ts +4 -0
  131. package/dist/esm/utils/modal.js +9 -1
  132. package/dist/esm/utils/modal.js.map +1 -1
  133. package/dist/styles.css +101 -6
  134. package/dist/styles.less +91 -58
  135. package/less/components/assets.less +5 -39
  136. package/less/components/button-menu.less +1 -0
  137. package/less/components/button.less +57 -19
  138. package/less/components/form-field.less +27 -0
  139. package/less/components/story-previewer.less +1 -1
  140. package/package.json +5 -5
  141. package/src/components/app-wrapper/AppWrapper.tsx +10 -0
  142. package/src/components/assets/AssetsTableAssetIdFilter.tsx +1 -0
  143. package/src/components/assets/AssetsTableNameFilter.tsx +1 -0
  144. package/src/components/assets/AssetsTableTagsFilter.tsx +1 -0
  145. package/src/components/assets/AssetsUploadMenu.tsx +21 -9
  146. package/src/components/confirm-modal/ConfirmModal.tsx +3 -2
  147. package/src/components/edit-guide-modal/EditGuideModal.tsx +110 -0
  148. package/src/components/field-wrapper/FieldWrapper.tsx +16 -12
  149. package/src/components/header/Header.tsx +7 -3
  150. package/src/components/number-field/NumberField.tsx +6 -2
  151. package/src/components/publish-wizard/publish/EmailWorkflow.tsx +66 -24
  152. package/src/components/replace-files-modal/ReplaceFilesModal.tsx +217 -0
  153. package/src/components/slider-field/SliderField.tsx +44 -22
  154. package/src/components/story-previewer/StoryPreviewer.tsx +24 -8
  155. package/src/components/tabs/Tabs.tsx +2 -1
  156. package/src/components/text-field/TextField.tsx +5 -2
  157. package/src/constants/copy.ts +6 -2
  158. package/src/constants/icons.tsx +10 -1
  159. package/src/constants/publish.ts +7 -2
  160. package/src/index.ts +6 -2
  161. package/src/redux/actions/asset-uploads.ts +193 -162
  162. package/src/redux/actions/publish.ts +14 -4
  163. package/src/redux/reducers/asset-uploads.ts +2 -1
  164. package/src/services/API.ts +13 -76
  165. package/src/utils/modal.ts +13 -1
  166. package/dist/cjs/components/auth-gate/AuthGate.d.ts +0 -2
  167. package/dist/cjs/components/auth-gate/AuthGate.js +0 -105
  168. package/dist/cjs/components/auth-gate/AuthGate.js.map +0 -1
  169. package/dist/cjs/redux/actions/auth.d.ts +0 -9
  170. package/dist/cjs/redux/actions/auth.js +0 -30
  171. package/dist/cjs/redux/actions/auth.js.map +0 -1
  172. package/dist/cjs/redux/reducers/auth.d.ts +0 -3
  173. package/dist/cjs/redux/reducers/auth.js +0 -67
  174. package/dist/cjs/redux/reducers/auth.js.map +0 -1
  175. package/dist/cjs/services/Auth0.d.ts +0 -18
  176. package/dist/cjs/services/Auth0.js +0 -102
  177. package/dist/cjs/services/Auth0.js.map +0 -1
  178. package/dist/cjs/services/Session.d.ts +0 -26
  179. package/dist/cjs/services/Session.js +0 -155
  180. package/dist/cjs/services/Session.js.map +0 -1
  181. package/dist/esm/components/auth-gate/AuthGate.d.ts +0 -2
  182. package/dist/esm/components/auth-gate/AuthGate.js +0 -59
  183. package/dist/esm/components/auth-gate/AuthGate.js.map +0 -1
  184. package/dist/esm/redux/actions/auth.d.ts +0 -9
  185. package/dist/esm/redux/actions/auth.js +0 -25
  186. package/dist/esm/redux/actions/auth.js.map +0 -1
  187. package/dist/esm/redux/reducers/auth.d.ts +0 -3
  188. package/dist/esm/redux/reducers/auth.js +0 -27
  189. package/dist/esm/redux/reducers/auth.js.map +0 -1
  190. package/dist/esm/services/Auth0.d.ts +0 -18
  191. package/dist/esm/services/Auth0.js +0 -68
  192. package/dist/esm/services/Auth0.js.map +0 -1
  193. package/dist/esm/services/Session.d.ts +0 -26
  194. package/dist/esm/services/Session.js +0 -107
  195. package/dist/esm/services/Session.js.map +0 -1
@@ -12,7 +12,13 @@ import { connect } from 'react-redux';
12
12
  import SelectField from '../../select-field/SelectField';
13
13
  import { updateAssociation, getBatch, setPage } from '../../../redux/actions/active-batch';
14
14
  import TextField from '../../text-field/TextField';
15
- import { CRM_PLACEMENT_VARS } from '../../../constants/publish';
15
+ import {
16
+ ADSTUDIO_POST_RENDER_ACTION,
17
+ ASSET_NAME_VAR,
18
+ ASSETS_POST_RENDER_ACTION,
19
+ CRM_PLACEMENT_VARS
20
+ } from '../../../constants/publish';
21
+ import CheckboxField from '../../checkbox-field/CheckboxField';
16
22
 
17
23
  interface IEmailWorkflowProps {
18
24
  story: any;
@@ -69,12 +75,12 @@ interface IEmailWorkflowProps {
69
75
  onNext: (val: boolean) => void;
70
76
  next: boolean;
71
77
  isCrM: boolean;
78
+ isCrMAsset?: boolean;
72
79
  }
73
80
 
74
81
  interface CrMOverrides {
75
82
  creative_id: string;
76
83
  creative_library_id: string;
77
- notification_email: string;
78
84
  placement_type: string;
79
85
  }
80
86
 
@@ -124,7 +130,6 @@ class EmailWorkflow extends React.PureComponent<IEmailWorkflowProps, IEmailWorkf
124
130
  creativeManagerOverrides: {
125
131
  creative_id: '',
126
132
  creative_library_id: '',
127
- notification_email: '',
128
133
  placement_type: 'crm-adstudio'
129
134
  },
130
135
  waitingForPublish: false,
@@ -266,6 +271,8 @@ class EmailWorkflow extends React.PureComponent<IEmailWorkflowProps, IEmailWorkf
266
271
  const { name } = this.props.story;
267
272
  const { isCrM } = this.props;
268
273
  const { inventory, inventoryKeys } = this.state;
274
+ const uploadAsAssets =
275
+ this.state.creativeManagerOverrides.placement_type === ASSETS_POST_RENDER_ACTION;
269
276
 
270
277
  const maskConfig: any[] = inventoryKeys.map((currKey: string) => {
271
278
  let value = '';
@@ -288,12 +295,27 @@ class EmailWorkflow extends React.PureComponent<IEmailWorkflowProps, IEmailWorkf
288
295
  });
289
296
 
290
297
  if (isCrM) {
291
- for (const id of CRM_PLACEMENT_VARS) {
292
- maskConfig.push({
293
- id,
294
- name: id,
295
- show: true
296
- });
298
+ if (uploadAsAssets) {
299
+ maskConfig.push(
300
+ {
301
+ id: ASSET_NAME_VAR,
302
+ name: ASSET_NAME_VAR,
303
+ show: true
304
+ },
305
+ {
306
+ id: 'creative_library_id',
307
+ name: 'creative_library_id',
308
+ show: true
309
+ }
310
+ );
311
+ } else {
312
+ for (const id of CRM_PLACEMENT_VARS) {
313
+ maskConfig.push({
314
+ id,
315
+ name: id,
316
+ show: true
317
+ });
318
+ }
297
319
  }
298
320
  }
299
321
 
@@ -436,12 +458,7 @@ class EmailWorkflow extends React.PureComponent<IEmailWorkflowProps, IEmailWorkf
436
458
  private getPostRenderActions() {
437
459
  const CrMUploadAction = { data: {} };
438
460
  const {
439
- creativeManagerOverrides: {
440
- placement_type,
441
- creative_id,
442
- creative_library_id,
443
- notification_email
444
- }
461
+ creativeManagerOverrides: { placement_type, creative_id, creative_library_id }
445
462
  } = this.state;
446
463
 
447
464
  CrMUploadAction['type'] = placement_type;
@@ -451,9 +468,6 @@ class EmailWorkflow extends React.PureComponent<IEmailWorkflowProps, IEmailWorkf
451
468
  if (creative_library_id) {
452
469
  CrMUploadAction.data['creative_library_id'] = creative_library_id;
453
470
  }
454
- if (notification_email) {
455
- CrMUploadAction.data['notification_email'] = notification_email;
456
- }
457
471
 
458
472
  return [CrMUploadAction];
459
473
  }
@@ -911,10 +925,8 @@ const CrMOptions: React.FC<ICrMOptionsProps> = ({ options, onChange, errorCopy =
911
925
  </div>
912
926
  ) : null;
913
927
 
914
- return (
928
+ const standardInterface = (
915
929
  <>
916
- <HRule />
917
- <br />
918
930
  <h2>{copy.publish.crmPlacement}</h2>
919
931
  <p>{copy.publish.crmData}</p>
920
932
  {e}
@@ -933,14 +945,44 @@ const CrMOptions: React.FC<ICrMOptionsProps> = ({ options, onChange, errorCopy =
933
945
  value={options.creative_id}
934
946
  onChange={(v) => onInputChange('creative_id', v)}
935
947
  />
948
+ </>
949
+ );
950
+
951
+ const assetInterface = (
952
+ <>
953
+ <h2>{copy.publish.crmPlacement}</h2>
954
+ <p>{copy.publish.crmData}</p>
955
+ {e}
956
+ <br />
936
957
  <TextField
937
958
  width={'33%'}
938
959
  labelPosition='top'
939
- label={copy.publish.email}
940
- value={options.notification_email}
941
- onChange={(v) => onInputChange('notification_email', v)}
960
+ label={copy.publish.creativeLibraryId}
961
+ value={options.creative_library_id}
962
+ onChange={(v) => onInputChange('creative_library_id', v)}
942
963
  />
964
+ </>
965
+ );
966
+ return (
967
+ <>
968
+ <HRule />
943
969
  <br />
970
+ {options['placement_type'] === ASSETS_POST_RENDER_ACTION
971
+ ? assetInterface
972
+ : standardInterface}
973
+ <br />
974
+ <HRule />
975
+ <CheckboxField
976
+ value={options['placement_type'] === ASSETS_POST_RENDER_ACTION ? true : false}
977
+ label={copy.publish.uploadAsAssets}
978
+ onChange={(v) => {
979
+ if (v === false) {
980
+ onInputChange('placement_type', ADSTUDIO_POST_RENDER_ACTION);
981
+ } else {
982
+ onInputChange('placement_type', ASSETS_POST_RENDER_ACTION);
983
+ }
984
+ }}
985
+ />
944
986
  <HRule />
945
987
  </>
946
988
  );
@@ -0,0 +1,217 @@
1
+ import React, { useCallback, useEffect, useRef, useState } from 'react';
2
+ import ReactDOM from 'react-dom';
3
+ import Modal from '../modal/Modal';
4
+ import Button from '../button/Button';
5
+ import CheckboxField from '../checkbox-field/CheckboxField';
6
+ import Section from '../section/Section';
7
+ import { assets as copy } from '../../constants/copy';
8
+ import { replaceFilesModalEvent } from '../../utils/modal';
9
+
10
+ export interface IReplaceFilesModalProps {
11
+ onUpload: (f) => any;
12
+ onInstantUpload: (f) => any;
13
+ onApplyToAll: (e) => any;
14
+ onClose: () => void;
15
+ applyToAll: boolean;
16
+ existedAssets: any[];
17
+ existedAssetIds: any[];
18
+ }
19
+
20
+ export const ReplaceFilesModal = () => {
21
+ const [props, setProps] = useState<IReplaceFilesModalProps>(null);
22
+ const [isOpen, setIsOpen] = useState<boolean>(false);
23
+ const [applyToAll, setApplyToAll] = useState<boolean>();
24
+ const [height, setHeight] = useState(200);
25
+ const [index, setIndex] = useState<number>(0);
26
+
27
+ const replaceFileModalRef = useRef(null);
28
+
29
+ useEffect(() => {
30
+ if (replaceFileModalRef.current) {
31
+ const {
32
+ current: { clientHeight }
33
+ } = replaceFileModalRef;
34
+ setHeight(clientHeight + 40);
35
+ }
36
+ });
37
+
38
+ const onOpen = (event) => {
39
+ setProps({
40
+ ...event.detail
41
+ });
42
+ setIsOpen(true);
43
+ };
44
+
45
+ const onClose = () => {
46
+ props.onClose();
47
+ setIsOpen(false);
48
+ };
49
+
50
+ const onReplaceHandler = (curApplyToAll, curIndex, file, assetId) => {
51
+ const newIndex = curIndex + 1;
52
+
53
+ if (curApplyToAll && curIndex === 0) {
54
+ const updatedAssets = props.existedAssets.map((asset, i) => {
55
+ const updatefile = asset;
56
+ updatefile['assetId'] = props.existedAssetIds[i];
57
+ return updatefile;
58
+ });
59
+
60
+ props.onInstantUpload(updatedAssets);
61
+ setIndex(0);
62
+ setIsOpen(false);
63
+ } else if (curApplyToAll) {
64
+ const updatedAssets = [];
65
+
66
+ for (let i = 0; i < props.existedAssets.length; i++) {
67
+ const updateFile =
68
+ curIndex === 0
69
+ ? props.existedAssets[i]
70
+ : [
71
+ ...props.existedAssets.slice(0, curIndex - 1),
72
+ ...props.existedAssets.slice(curIndex)
73
+ ][i];
74
+
75
+ if (updateFile) {
76
+ updateFile['assetId'] =
77
+ curIndex === 0
78
+ ? props.existedAssetIds[i]
79
+ : [
80
+ ...props.existedAssetIds.slice(0, curIndex - 1),
81
+ ...props.existedAssetIds.slice(curIndex)
82
+ ][i];
83
+ updatedAssets.push(updateFile);
84
+ props.onInstantUpload(updatedAssets);
85
+ setIndex(0);
86
+ onClose();
87
+ }
88
+ }
89
+ } else {
90
+ if (newIndex === props.existedAssets.length) {
91
+ setIndex(0);
92
+ onClose();
93
+ } else {
94
+ setIndex(newIndex);
95
+ }
96
+
97
+ const updateFile = file;
98
+ updateFile['assetId'] = assetId;
99
+ props.onUpload([updateFile]);
100
+ }
101
+ };
102
+
103
+ const onAsNewHandler = (curApplyToAll, curIndex, file) => {
104
+ const newIndex = curIndex + 1;
105
+
106
+ if (curApplyToAll) {
107
+ props.onUpload(
108
+ curIndex === 0 ? props.existedAssets : props.existedAssets.slice(curIndex)
109
+ );
110
+
111
+ setIndex(0);
112
+ onClose();
113
+ } else {
114
+ if (newIndex === props.existedAssets.length) {
115
+ setIndex(0);
116
+ onClose();
117
+ } else {
118
+ setIndex(newIndex);
119
+ }
120
+
121
+ props.onUpload([file]);
122
+ }
123
+ };
124
+
125
+ const onApplyToAllHandler = (e) => {
126
+ setApplyToAll(e);
127
+ props.onApplyToAll(e);
128
+ };
129
+
130
+ const onReplace = useCallback(
131
+ (curApplyToAll, curIndex, file, assetId) =>
132
+ onReplaceHandler(curApplyToAll, curIndex, file, assetId),
133
+ [isOpen]
134
+ );
135
+
136
+ const onApplyToAll = useCallback((e) => onApplyToAllHandler(e), [isOpen]);
137
+
138
+ const onAsNew = useCallback(
139
+ (curApplyToAll, curIndex, file) => onAsNewHandler(curApplyToAll, curIndex, file),
140
+ [isOpen]
141
+ );
142
+
143
+ useEffect(() => {
144
+ window.addEventListener(replaceFilesModalEvent, onOpen);
145
+ return () => {
146
+ window.removeEventListener(replaceFilesModalEvent, onOpen);
147
+ };
148
+ }, []);
149
+
150
+ const modal = () => {
151
+ if (isOpen) {
152
+ const file = props.existedAssets[index];
153
+ const assetId = props.existedAssetIds[index];
154
+ const name = file.name.slice(0, file.name.lastIndexOf('.'));
155
+ return (
156
+ <Modal
157
+ onRequestClose={onClose}
158
+ wrapperStyle={{
159
+ left: '0px',
160
+ width: '100%'
161
+ }}
162
+ style={{
163
+ width: '400px',
164
+ height: `${height}px`,
165
+ top: 'calc(50% - 150px)',
166
+ left: 'calc((100% - 400px) / 2)'
167
+ }}
168
+ isOpen={true}>
169
+ <Section>
170
+ <div
171
+ className='replace-files-modal'
172
+ ref={replaceFileModalRef}>
173
+ <p>{copy.uploads.title.replace('[name]', name)}</p>
174
+ <div className='replace-files-buttons'>
175
+ <div className='checkbox'>
176
+ <CheckboxField
177
+ label={copy.uploads.applyAll}
178
+ value={applyToAll}
179
+ onChange={onApplyToAll}
180
+ />
181
+ </div>
182
+ <div className='buttons'>
183
+ <Button
184
+ onClick={() => onAsNew(applyToAll, index, file)}
185
+ size='large'
186
+ style='bold'
187
+ color='primary'>
188
+ {copy.uploads.keepBoth}
189
+ </Button>
190
+ <Button
191
+ onClick={() => onReplace(applyToAll, index, file, assetId)}
192
+ size='large'
193
+ style='bold'
194
+ color='primary'>
195
+ {copy.uploads.replace}
196
+ </Button>
197
+ <Button
198
+ onClick={onClose}
199
+ size='large'
200
+ style='bold'
201
+ color='default'>
202
+ {copy.uploads.cancelButton}
203
+ </Button>
204
+ </div>
205
+ </div>
206
+ </div>
207
+ </Section>
208
+ </Modal>
209
+ );
210
+ }
211
+ };
212
+
213
+ const PortalContextComponent = () =>
214
+ ReactDOM.createPortal(modal(), document.querySelector('#react-root'));
215
+
216
+ return <PortalContextComponent />;
217
+ };
@@ -1,6 +1,7 @@
1
1
  import * as React from 'react';
2
2
  import FieldWrapper from '../field-wrapper/FieldWrapper';
3
3
  import { IToolTipConfig } from '../Tooltip';
4
+ import { ICON_CHECK } from '../../constants/icons';
4
5
 
5
6
  interface ISliderFieldProps {
6
7
  label?: any;
@@ -15,6 +16,7 @@ interface ISliderFieldProps {
15
16
  info?: string;
16
17
  labelPosition?: string;
17
18
  labelWidth?: string | number;
19
+ enabledToggle?: boolean;
18
20
  }
19
21
 
20
22
  interface ISliderFieldState {
@@ -69,6 +71,14 @@ class SliderField extends React.PureComponent<ISliderFieldProps, ISliderFieldSta
69
71
  }
70
72
  }
71
73
 
74
+ private toggle() {
75
+ if (this.props.value !== undefined && this.props.value !== null) {
76
+ this.props.onChange(null);
77
+ } else {
78
+ this.props.onChange(this.props.defaultValue);
79
+ }
80
+ }
81
+
72
82
  public render() {
73
83
  const {
74
84
  label,
@@ -81,16 +91,15 @@ class SliderField extends React.PureComponent<ISliderFieldProps, ISliderFieldSta
81
91
  tooltip,
82
92
  info,
83
93
  labelPosition,
84
- labelWidth
94
+ labelWidth,
95
+ enabledToggle
85
96
  } = this.props;
86
97
  const { tempValue } = this.state;
98
+ const valueSet = value !== null && value !== undefined;
99
+ const val = tempValue !== null ? tempValue : !valueSet ? defaultValue : value;
87
100
 
88
- const val =
89
- tempValue !== null
90
- ? tempValue
91
- : value === null || value === undefined
92
- ? defaultValue
93
- : value;
101
+ const showInputs = (enabledToggle && valueSet) || !enabledToggle;
102
+ const icon = valueSet ? ICON_CHECK : null;
94
103
 
95
104
  return (
96
105
  <FieldWrapper
@@ -101,21 +110,34 @@ class SliderField extends React.PureComponent<ISliderFieldProps, ISliderFieldSta
101
110
  labelPosition={labelPosition}
102
111
  labelWidth={labelWidth}
103
112
  width={width}>
104
- <input
105
- onChange={(e) => this.rangeInputChange(e)}
106
- type='range'
107
- min={min}
108
- max={max}
109
- value={val}
110
- step={step}
111
- />
112
-
113
- <input
114
- className='val'
115
- onChange={(e) => this.numberInputChange(e)}
116
- type='number'
117
- value={val}
118
- />
113
+ {enabledToggle && (
114
+ <div
115
+ className='checkbox'
116
+ onClick={(e) => this.toggle()}>
117
+ {icon}
118
+ </div>
119
+ )}
120
+
121
+ {showInputs && (
122
+ <input
123
+ className={enabledToggle ? 'toggle' : ''}
124
+ onChange={(e) => this.rangeInputChange(e)}
125
+ type='range'
126
+ min={min}
127
+ max={max}
128
+ value={val}
129
+ step={step}
130
+ />
131
+ )}
132
+
133
+ {showInputs && (
134
+ <input
135
+ className='val'
136
+ onChange={(e) => this.numberInputChange(e)}
137
+ type='number'
138
+ value={val}
139
+ />
140
+ )}
119
141
  </FieldWrapper>
120
142
  );
121
143
  }
@@ -48,6 +48,7 @@ interface IStoryPreviewerProps {
48
48
  compositionOptions?: any[];
49
49
  editor: any;
50
50
  updateEditorConfig(c): void;
51
+ reRender: boolean;
51
52
  }
52
53
 
53
54
  interface IStoryPreviewerState {
@@ -199,7 +200,15 @@ class StoryPreviewer extends React.PureComponent<IStoryPreviewerProps, IStoryPre
199
200
  if (!prevProps.editor?.autoRender && this.props.editor?.autoRender) {
200
201
  this.props.updateEditorConfig({ autoRender: false });
201
202
  this.evtHandlers.gotExperience = null;
202
- this.props.api.cancelExperiencePolling().then(() => this.createExperience());
203
+ this.props.api.cancelExperiencePolling().then(() => {
204
+ if (this.props.editor?.reRender) {
205
+ this.setState({ compositionOverride: null }, () =>
206
+ this.createExperience(this.props.compositionId)
207
+ );
208
+ } else {
209
+ this.createExperience();
210
+ }
211
+ });
203
212
  }
204
213
 
205
214
  if (
@@ -502,11 +511,17 @@ class StoryPreviewer extends React.PureComponent<IStoryPreviewerProps, IStoryPre
502
511
  onExperenceLoaded(resVideo);
503
512
  }
504
513
 
505
- this.setState({
506
- rendering: false,
507
- activeOutput: this.getFirstOutput(resVideo),
508
- experience: resVideo
509
- });
514
+ this.setState(
515
+ {
516
+ rendering: false,
517
+ activeOutput: this.getFirstOutput(resVideo),
518
+ experience: resVideo
519
+ },
520
+ () =>
521
+ this.props.updateEditorConfig({
522
+ reRender: false
523
+ })
524
+ );
510
525
  };
511
526
 
512
527
  api.getExperience(experienceId, true)
@@ -609,12 +624,12 @@ class StoryPreviewer extends React.PureComponent<IStoryPreviewerProps, IStoryPre
609
624
  );
610
625
  }
611
626
 
612
- private createExperience() {
627
+ private createExperience(compositionId?) {
613
628
  const { storyId, onNotification, onError, api, onExperienceCreated, useWorkingCopy } =
614
629
  this.props;
615
630
 
616
631
  const fastRender = this.props.editor?.fastRender || false;
617
- const compId = this.getCompId();
632
+ const compId = compositionId ? compositionId : this.getCompId();
618
633
 
619
634
  this.resetState(false, () => {
620
635
  this.setState(
@@ -879,6 +894,7 @@ class StoryPreviewer extends React.PureComponent<IStoryPreviewerProps, IStoryPre
879
894
  const { storyId } = this.props;
880
895
  const renderCopy = experience ? copy.btnReRender : copy.btnRender;
881
896
  const compId = this.getCompId();
897
+
882
898
  const btnRender = !rendering ? (
883
899
  <Button
884
900
  disabled={!compId}
@@ -95,7 +95,8 @@ class Tabs extends React.PureComponent<ITabsProps, ITabsState> {
95
95
  const content = React.cloneElement(option.content, {
96
96
  active,
97
97
  width,
98
- height
98
+ height,
99
+ key: option.key
99
100
  });
100
101
 
101
102
  contentArray.push(content);
@@ -46,6 +46,7 @@ interface ITextFieldProps {
46
46
  labelWidth?: string | number;
47
47
  className?: string;
48
48
  maxLength?: number;
49
+ header?: boolean;
49
50
  }
50
51
 
51
52
  interface ITextFieldState {
@@ -487,7 +488,8 @@ class TextField extends React.PureComponent<ITextFieldProps, ITextFieldState> {
487
488
  }
488
489
 
489
490
  public render() {
490
- const { label, width, tooltip, info, labelPosition, labelWidth, className } = this.props;
491
+ const { label, width, tooltip, info, labelPosition, labelWidth, className, header } =
492
+ this.props;
491
493
  return (
492
494
  <FieldWrapper
493
495
  customClass={`text-field ${className}`}
@@ -497,7 +499,8 @@ class TextField extends React.PureComponent<ITextFieldProps, ITextFieldState> {
497
499
  info={info}
498
500
  labelPosition={labelPosition}
499
501
  labelWidth={labelWidth}
500
- width={width}>
502
+ width={width}
503
+ header={header}>
501
504
  {this.renderInput()}
502
505
  </FieldWrapper>
503
506
  );
@@ -28,7 +28,11 @@ export const assets = {
28
28
  assignToProjectInfo:
29
29
  'If selected, any assets uploaded will be available to use with all projects on the current organization.',
30
30
  uploadButton: 'Upload',
31
- cancelButton: 'Cancel'
31
+ cancelButton: 'Cancel',
32
+ title: `An asset named "[name]" already exists in this project. Do you want to replace it with the one you're uploading?`,
33
+ keepBoth: 'Keep Both',
34
+ replace: 'Replace',
35
+ applyAll: 'Apply To All'
32
36
  },
33
37
  tags: {
34
38
  add: 'Add new tag',
@@ -123,6 +127,7 @@ export const compositions = {
123
127
  };
124
128
 
125
129
  export const publish = {
130
+ uploadAsAssets: 'Upload as Assets',
126
131
  noVariablesError:
127
132
  'No variables found on the project. Cannot proceed with publishing to Creative Manager until at least one variable is added to the project.',
128
133
  publishInProgress: 'Publish to Creative Manager in progress',
@@ -130,7 +135,6 @@ export const publish = {
130
135
  btnCrM: 'Creative Manager',
131
136
  creativeLibraryId: 'Creative Library ID',
132
137
  creativeId: 'Creative ID',
133
- email: 'Notification Email',
134
138
  missingFields: 'Please provide the missing fields and try again!',
135
139
  crmPlacement: 'Creative Manager Placement Variables',
136
140
  crmData: `If your CSV batch data doesn't contain the required Creative Manager placement variables, or you would like to override them, enter the values below before you upload the batch data.`,
@@ -73,7 +73,12 @@ import {
73
73
  } from '@fortawesome/pro-light-svg-icons';
74
74
  import { faCircleSmall } from '@fortawesome/pro-solid-svg-icons/faCircleSmall';
75
75
  import { faClapperboardPlay } from '@fortawesome/pro-solid-svg-icons/faClapperboardPlay';
76
- import { faCloudArrowUp, faFilters } from '@fortawesome/pro-solid-svg-icons';
76
+ import {
77
+ faCloudArrowUp,
78
+ faFileCirclePlus,
79
+ faFilePen,
80
+ faFilters
81
+ } from '@fortawesome/pro-solid-svg-icons';
77
82
  import { faCircleExclamation } from '@fortawesome/free-solid-svg-icons';
78
83
 
79
84
  export const ICON_VIDEO = <FontAwesomeIcon icon={faVideo} />;
@@ -223,3 +228,7 @@ export const ICON_UP_RIGHT_FROM_SQUARE = <FontAwesomeIcon icon={faUpRightFromSqu
223
228
  export const ICON_FILE_UPLOAD = <FontAwesomeIcon icon={faCloudArrowUp} />;
224
229
 
225
230
  export const ICON_FILE_ERROR = <FontAwesomeIcon icon={faCircleExclamation} />;
231
+
232
+ export const ICON_FILE_ADD = <FontAwesomeIcon icon={faFileCirclePlus} />;
233
+
234
+ export const ICON_FILE_REPLACE = <FontAwesomeIcon icon={faFilePen} />;
@@ -14,11 +14,16 @@ export const CRM_PLACEMENT_OPTIONS = [
14
14
  }
15
15
  ];
16
16
 
17
+ export const ASSET_NAME_VAR = 'asset-name';
18
+
17
19
  export const CRM_PLACEMENT_VARS = [
18
20
  'creative_library_id',
19
21
  'creative_id',
20
22
  'version-name',
21
23
  'version-id',
22
- 'clickTag1',
23
- 'notificiaton_email'
24
+ 'clickTag1'
24
25
  ];
26
+
27
+ export const ADSTUDIO_POST_RENDER_ACTION = 'crm-adstudio';
28
+
29
+ export const ASSETS_POST_RENDER_ACTION = 'crm-asset';