@imposium-hub/components 1.58.8 → 1.59.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 (145) hide show
  1. package/dist/cjs/components/assets/AssetsUploadMenu.js +1 -1
  2. package/dist/cjs/components/assets/AssetsUploadMenu.js.map +1 -1
  3. package/dist/cjs/components/button/Button.stories.d.ts +1 -0
  4. package/dist/cjs/components/button-group-field/ButtonGroupField.stories.d.ts +1 -0
  5. package/dist/cjs/components/button-menu/ButtonMenu.stories.d.ts +1 -0
  6. package/dist/cjs/components/card/Card.stories.d.ts +1 -0
  7. package/dist/cjs/components/checkbox-field/CheckboxField.stories.d.ts +1 -0
  8. package/dist/cjs/components/color-field/ColorFiled.stories.d.ts +1 -0
  9. package/dist/cjs/components/controlled-list/ControlledList.stories.d.ts +1 -0
  10. package/dist/cjs/components/field-wrapper/FieldWrapper.stories.d.ts +1 -0
  11. package/dist/cjs/components/h-rule/HRule.d.ts +1 -0
  12. package/dist/cjs/components/h-rule/HRule.stories.d.ts +1 -0
  13. package/dist/cjs/components/list-field/ListField.stories.d.ts +1 -0
  14. package/dist/cjs/components/modal/Modal.stories.d.ts +1 -0
  15. package/dist/cjs/components/number-field/NumberField.stories.d.ts +1 -0
  16. package/dist/cjs/components/publish-wizard/EmailWorkflow.d.ts +2 -0
  17. package/dist/cjs/components/publish-wizard/EmailWorkflow.js +491 -0
  18. package/dist/cjs/components/publish-wizard/EmailWorkflow.js.map +1 -0
  19. package/dist/cjs/components/publish-wizard/PublishWizard.js +14 -4
  20. package/dist/cjs/components/publish-wizard/PublishWizard.js.map +1 -1
  21. package/dist/cjs/components/publish-wizard/copy.d.ts +186 -0
  22. package/dist/cjs/components/publish-wizard/copy.js +199 -0
  23. package/dist/cjs/components/publish-wizard/copy.js.map +1 -0
  24. package/dist/cjs/components/publish-wizard/publish/EmailWorkflow.js +103 -25
  25. package/dist/cjs/components/publish-wizard/publish/EmailWorkflow.js.map +1 -1
  26. package/dist/cjs/components/section/Section.d.ts +1 -0
  27. package/dist/cjs/components/section/Section.stories.d.ts +1 -0
  28. package/dist/cjs/components/select-field/SelectField.stories.d.ts +1 -0
  29. package/dist/cjs/components/slider-field/SliderField.stories.d.ts +1 -0
  30. package/dist/cjs/components/story-previewer/StoryPreviewer.js +2 -2
  31. package/dist/cjs/components/story-previewer/StoryPreviewer.js.map +1 -1
  32. package/dist/cjs/components/story-previewer/StoryPreviewer_BACKUP_64741.d.ts +2 -0
  33. package/dist/cjs/components/story-previewer/StoryPreviewer_BACKUP_64741.js +670 -0
  34. package/dist/cjs/components/story-previewer/StoryPreviewer_BACKUP_64741.js.map +1 -0
  35. package/dist/cjs/components/story-previewer/StoryPreviewer_BASE_64741.d.ts +2 -0
  36. package/dist/cjs/components/story-previewer/StoryPreviewer_BASE_64741.js +553 -0
  37. package/dist/cjs/components/story-previewer/StoryPreviewer_BASE_64741.js.map +1 -0
  38. package/dist/cjs/components/story-previewer/StoryPreviewer_LOCAL_64741.d.ts +2 -0
  39. package/dist/cjs/components/story-previewer/StoryPreviewer_LOCAL_64741.js +650 -0
  40. package/dist/cjs/components/story-previewer/StoryPreviewer_LOCAL_64741.js.map +1 -0
  41. package/dist/cjs/components/story-previewer/StoryPreviewer_REMOTE_64741.d.ts +2 -0
  42. package/dist/cjs/components/story-previewer/StoryPreviewer_REMOTE_64741.js +639 -0
  43. package/dist/cjs/components/story-previewer/StoryPreviewer_REMOTE_64741.js.map +1 -0
  44. package/dist/cjs/components/text-area-field/TextAreaField.stories.d.ts +1 -0
  45. package/dist/cjs/components/text-field/TextField.stories.d.ts +1 -0
  46. package/dist/cjs/constants/assets_BACKUP_14924.d.ts +20 -0
  47. package/dist/cjs/constants/assets_BACKUP_14924.js +30 -0
  48. package/dist/cjs/constants/assets_BACKUP_14924.js.map +1 -0
  49. package/dist/cjs/constants/assets_BASE_14924.d.ts +21 -0
  50. package/dist/cjs/constants/assets_BASE_14924.js +32 -0
  51. package/dist/cjs/constants/assets_BASE_14924.js.map +1 -0
  52. package/dist/cjs/constants/assets_LOCAL_14924.d.ts +20 -0
  53. package/dist/cjs/constants/assets_LOCAL_14924.js +30 -0
  54. package/dist/cjs/constants/assets_LOCAL_14924.js.map +1 -0
  55. package/dist/cjs/constants/assets_REMOTE_14924.d.ts +21 -0
  56. package/dist/cjs/constants/assets_REMOTE_14924.js +32 -0
  57. package/dist/cjs/constants/assets_REMOTE_14924.js.map +1 -0
  58. package/dist/cjs/constants/copy.d.ts +11 -2
  59. package/dist/cjs/constants/copy.js +20 -11
  60. package/dist/cjs/constants/copy.js.map +1 -1
  61. package/dist/cjs/constants/publish.d.ts +9 -0
  62. package/dist/cjs/constants/publish.js +26 -0
  63. package/dist/cjs/constants/publish.js.map +1 -0
  64. package/dist/cjs/services/API.d.ts +2 -2
  65. package/dist/cjs/services/API.js +11 -4
  66. package/dist/cjs/services/API.js.map +1 -1
  67. package/dist/esm/components/assets/AssetsUploadMenu.js +1 -1
  68. package/dist/esm/components/assets/AssetsUploadMenu.js.map +1 -1
  69. package/dist/esm/components/button/Button.stories.d.ts +1 -0
  70. package/dist/esm/components/button-group-field/ButtonGroupField.stories.d.ts +1 -0
  71. package/dist/esm/components/button-menu/ButtonMenu.stories.d.ts +1 -0
  72. package/dist/esm/components/card/Card.stories.d.ts +1 -0
  73. package/dist/esm/components/checkbox-field/CheckboxField.stories.d.ts +1 -0
  74. package/dist/esm/components/color-field/ColorFiled.stories.d.ts +1 -0
  75. package/dist/esm/components/controlled-list/ControlledList.stories.d.ts +1 -0
  76. package/dist/esm/components/field-wrapper/FieldWrapper.stories.d.ts +1 -0
  77. package/dist/esm/components/h-rule/HRule.d.ts +1 -0
  78. package/dist/esm/components/h-rule/HRule.stories.d.ts +1 -0
  79. package/dist/esm/components/list-field/ListField.stories.d.ts +1 -0
  80. package/dist/esm/components/modal/Modal.stories.d.ts +1 -0
  81. package/dist/esm/components/number-field/NumberField.stories.d.ts +1 -0
  82. package/dist/esm/components/publish-wizard/EmailWorkflow.d.ts +2 -0
  83. package/dist/esm/components/publish-wizard/EmailWorkflow.js +398 -0
  84. package/dist/esm/components/publish-wizard/EmailWorkflow.js.map +1 -0
  85. package/dist/esm/components/publish-wizard/PublishWizard.js +15 -5
  86. package/dist/esm/components/publish-wizard/PublishWizard.js.map +1 -1
  87. package/dist/esm/components/publish-wizard/copy.d.ts +186 -0
  88. package/dist/esm/components/publish-wizard/copy.js +196 -0
  89. package/dist/esm/components/publish-wizard/copy.js.map +1 -0
  90. package/dist/esm/components/publish-wizard/publish/EmailWorkflow.js +90 -23
  91. package/dist/esm/components/publish-wizard/publish/EmailWorkflow.js.map +1 -1
  92. package/dist/esm/components/section/Section.d.ts +1 -0
  93. package/dist/esm/components/section/Section.stories.d.ts +1 -0
  94. package/dist/esm/components/select-field/SelectField.stories.d.ts +1 -0
  95. package/dist/esm/components/slider-field/SliderField.stories.d.ts +1 -0
  96. package/dist/esm/components/story-previewer/StoryPreviewer.js +1 -1
  97. package/dist/esm/components/story-previewer/StoryPreviewer.js.map +1 -1
  98. package/dist/esm/components/story-previewer/StoryPreviewer_BACKUP_64741.d.ts +2 -0
  99. package/dist/esm/components/story-previewer/StoryPreviewer_BACKUP_64741.js +554 -0
  100. package/dist/esm/components/story-previewer/StoryPreviewer_BACKUP_64741.js.map +1 -0
  101. package/dist/esm/components/story-previewer/StoryPreviewer_BASE_64741.d.ts +2 -0
  102. package/dist/esm/components/story-previewer/StoryPreviewer_BASE_64741.js +489 -0
  103. package/dist/esm/components/story-previewer/StoryPreviewer_BASE_64741.js.map +1 -0
  104. package/dist/esm/components/story-previewer/StoryPreviewer_LOCAL_64741.d.ts +2 -0
  105. package/dist/esm/components/story-previewer/StoryPreviewer_LOCAL_64741.js +537 -0
  106. package/dist/esm/components/story-previewer/StoryPreviewer_LOCAL_64741.js.map +1 -0
  107. package/dist/esm/components/story-previewer/StoryPreviewer_REMOTE_64741.d.ts +2 -0
  108. package/dist/esm/components/story-previewer/StoryPreviewer_REMOTE_64741.js +526 -0
  109. package/dist/esm/components/story-previewer/StoryPreviewer_REMOTE_64741.js.map +1 -0
  110. package/dist/esm/components/text-area-field/TextAreaField.stories.d.ts +1 -0
  111. package/dist/esm/components/text-field/TextField.stories.d.ts +1 -0
  112. package/dist/esm/constants/assets_BACKUP_14924.d.ts +20 -0
  113. package/dist/esm/constants/assets_BACKUP_14924.js +26 -0
  114. package/dist/esm/constants/assets_BACKUP_14924.js.map +1 -0
  115. package/dist/esm/constants/assets_BASE_14924.d.ts +21 -0
  116. package/dist/esm/constants/assets_BASE_14924.js +28 -0
  117. package/dist/esm/constants/assets_BASE_14924.js.map +1 -0
  118. package/dist/esm/constants/assets_LOCAL_14924.d.ts +20 -0
  119. package/dist/esm/constants/assets_LOCAL_14924.js +26 -0
  120. package/dist/esm/constants/assets_LOCAL_14924.js.map +1 -0
  121. package/dist/esm/constants/assets_REMOTE_14924.d.ts +21 -0
  122. package/dist/esm/constants/assets_REMOTE_14924.js +28 -0
  123. package/dist/esm/constants/assets_REMOTE_14924.js.map +1 -0
  124. package/dist/esm/constants/copy.d.ts +11 -2
  125. package/dist/esm/constants/copy.js +20 -11
  126. package/dist/esm/constants/copy.js.map +1 -1
  127. package/dist/esm/constants/publish.d.ts +9 -0
  128. package/dist/esm/constants/publish.js +23 -0
  129. package/dist/esm/constants/publish.js.map +1 -0
  130. package/dist/esm/services/API.d.ts +2 -2
  131. package/dist/esm/services/API.js +11 -4
  132. package/dist/esm/services/API.js.map +1 -1
  133. package/dist/styles.css +9 -3
  134. package/dist/styles.less +12 -4
  135. package/less/components/assets.less +1 -3
  136. package/less/components/form-field.less +2 -1
  137. package/less/components/publish-wizard.less +9 -0
  138. package/package.json +3 -3
  139. package/src/components/assets/AssetsUploadMenu.tsx +2 -2
  140. package/src/components/publish-wizard/PublishWizard.tsx +21 -7
  141. package/src/components/publish-wizard/publish/EmailWorkflow.tsx +182 -48
  142. package/src/components/story-previewer/StoryPreviewer.tsx +2 -2
  143. package/src/constants/copy.ts +23 -12
  144. package/src/constants/publish.ts +24 -0
  145. package/src/services/API.ts +16 -5
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@imposium-hub/components",
3
- "version": "1.58.8",
3
+ "version": "1.59.1",
4
4
  "description": "React & Typescript component / asset library for Imposium front-ends",
5
5
  "main": "./dist/cjs/index.js",
6
6
  "module": "./dist/esm/index.js",
@@ -54,7 +54,7 @@
54
54
  "@fortawesome/pro-light-svg-icons": "^6.1.1",
55
55
  "@fortawesome/pro-solid-svg-icons": "^6.1.1",
56
56
  "@fortawesome/react-fontawesome": "^0.1.18",
57
- "@imposium-hub/react-textarea-autocomplete": "^4.9.5",
57
+ "@imposium-hub/react-textarea-autocomplete": "^4.9.6",
58
58
  "axios": "^0.21.1",
59
59
  "hotkeys-js": "^3.6.12",
60
60
  "localforage": "^1.7.3",
@@ -80,7 +80,7 @@
80
80
  "@fortawesome/react-fontawesome": "^0.1.18",
81
81
  "@imposium-hub/eslint-config": "^1.1.0",
82
82
  "@imposium-hub/prettier-config": "^2.1.0",
83
- "@imposium-hub/react-textarea-autocomplete": "^4.9.5",
83
+ "@imposium-hub/react-textarea-autocomplete": "^4.9.6",
84
84
  "@storybook/addon-actions": "^6.4.22",
85
85
  "@storybook/addon-docs": "^6.4.22",
86
86
  "@storybook/addon-essentials": "^6.4.22",
@@ -81,8 +81,8 @@ class AssetsUploadMenu extends React.PureComponent<IAssetsUploadMenuProps> {
81
81
  />
82
82
  <CheckboxField
83
83
  width='50%'
84
- label={copy.uploads.assignToStoryInput}
85
- info={copy.uploads.assignToStoryInfo}
84
+ label={copy.uploads.assignToProjectInput}
85
+ info={copy.uploads.assignToProjectInfo}
86
86
  value={assignToStory}
87
87
  onChange={() => this.props.toggleAssignToStory(!assignToStory)}
88
88
  />
@@ -7,6 +7,7 @@ import {
7
7
  ICON_EMAIL,
8
8
  ICON_GLOBE,
9
9
  ICON_HUBSPOT,
10
+ ICON_IMAGE,
10
11
  ICON_PROJECT_DIAGRAM
11
12
  } from '../../constants/icons';
12
13
  import { IImposiumAPI } from '../../services/API';
@@ -48,12 +49,13 @@ interface IPublishWizardProps {
48
49
  accessKey: string,
49
50
  compId: string,
50
51
  addEmbed: boolean,
51
- addMedia: boolean
52
+ addMedia: boolean,
53
+ overrides?: any
52
54
  ) => any;
53
55
  handleNotification?: (n) => void;
54
56
  batchJobs: any;
55
57
  activeComposition: string;
56
- renderBatch: (batchId: string, batchName?: string) => any;
58
+ renderBatch: (batchId: string, postRenderActions?: any) => any;
57
59
  publishData: any;
58
60
  }
59
61
 
@@ -430,6 +432,14 @@ class PublishWizard extends React.PureComponent<IPublishWizardProps, IPublishWiz
430
432
  </span>
431
433
  ),
432
434
  onClick: (e) => this.onSelectOption(7)
435
+ },
436
+ {
437
+ label: (
438
+ <span>
439
+ {ICON_IMAGE}&nbsp;{copy.publish.btnCRM}
440
+ </span>
441
+ ),
442
+ onClick: (e) => this.onSelectOption(8)
433
443
  }
434
444
  ];
435
445
 
@@ -478,7 +488,7 @@ class PublishWizard extends React.PureComponent<IPublishWizardProps, IPublishWiz
478
488
  private nextClickHandler = () => {
479
489
  this.setState({ nextStep: true, error: false });
480
490
 
481
- if (this.state.screenIndex === 7) {
491
+ if (this.state.screenIndex === 7 || this.state.screenIndex === 8) {
482
492
  this.emailWorkflow.current.getWrappedInstance().proceedWithExport();
483
493
  }
484
494
  };
@@ -487,12 +497,15 @@ class PublishWizard extends React.PureComponent<IPublishWizardProps, IPublishWiz
487
497
  this.setState({ done: true, error: false });
488
498
  };
489
499
 
490
- private onErrorHandler = () => {
491
- this.setState({ error: !this.state.error });
500
+ private onErrorHandler = (e) => {
501
+ this.setState({ error: e });
492
502
  };
493
503
 
494
504
  private onNextHandler = (val: boolean) => {
495
505
  this.setState({ next: val });
506
+ if (val === false) {
507
+ this.setState({ nextStep: false });
508
+ }
496
509
  };
497
510
 
498
511
  public render() {
@@ -543,9 +556,10 @@ class PublishWizard extends React.PureComponent<IPublishWizardProps, IPublishWiz
543
556
  accessKey={accessKey}
544
557
  />
545
558
  )}
546
- {(screenIndex === 3 || screenIndex === 7) && (
559
+ {(screenIndex === 3 || screenIndex === 7 || screenIndex === 8) && (
547
560
  <EmailWorkflow
548
- isExport={screenIndex === 7}
561
+ isCrM={screenIndex === 8}
562
+ isExport={screenIndex === 7 || screenIndex === 8}
549
563
  api={api}
550
564
  story={story}
551
565
  variables={variables}
@@ -11,6 +11,8 @@ import { bindActionCreators } from 'redux';
11
11
  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
+ import TextField from '../../text-field/TextField';
15
+ import { CRM_PLACEMENT_VARS } from '../../../constants/publish';
14
16
 
15
17
  interface IEmailWorkflowProps {
16
18
  story: any;
@@ -26,15 +28,16 @@ interface IEmailWorkflowProps {
26
28
  accessKey: string,
27
29
  compId: string,
28
30
  embed: boolean,
29
- addMedia: boolean
31
+ addMedia: boolean,
32
+ overrides?: any
30
33
  ) => any;
31
- renderBatch: (batchId: string, batchName: string) => any;
34
+ renderBatch: (batchId: string, postRenderActions?: any) => any;
32
35
  status: string;
33
36
  accessKey: string;
34
37
  compositionId: string;
35
38
  compositionName: string;
36
39
  onDone: () => void;
37
- onError: () => void;
40
+ onError: (error) => void;
38
41
  error: boolean;
39
42
  api: IImposiumAPI;
40
43
  handleError: (e) => any;
@@ -52,6 +55,14 @@ interface IEmailWorkflowProps {
52
55
  setPage: (page: number) => any;
53
56
  onNext: (val: boolean) => void;
54
57
  next: boolean;
58
+ isCrM: boolean;
59
+ }
60
+
61
+ interface CrMOverrides {
62
+ creative_id: string;
63
+ creative_library_id: string;
64
+ notification_email: string;
65
+ placement_type: string;
55
66
  }
56
67
 
57
68
  interface IEmailWorkflowState {
@@ -63,7 +74,8 @@ interface IEmailWorkflowState {
63
74
  inventory: any[];
64
75
  inventoryKeys: string[];
65
76
  missingColumns: string;
66
- isMissing: boolean;
77
+ batchError: string;
78
+ creativeManagerOverrides: CrMOverrides;
67
79
  }
68
80
 
69
81
  class EmailWorkflow extends React.PureComponent<IEmailWorkflowProps, IEmailWorkflowState> {
@@ -93,7 +105,13 @@ class EmailWorkflow extends React.PureComponent<IEmailWorkflowProps, IEmailWorkf
93
105
  inventory: [],
94
106
  inventoryKeys: [],
95
107
  missingColumns: '',
96
- isMissing: false
108
+ batchError: '',
109
+ creativeManagerOverrides: {
110
+ creative_id: '',
111
+ creative_library_id: '',
112
+ notification_email: '',
113
+ placement_type: 'crm-adstudio'
114
+ }
97
115
  };
98
116
 
99
117
  this.hiddenFileInputRef = React.createRef();
@@ -175,6 +193,7 @@ class EmailWorkflow extends React.PureComponent<IEmailWorkflowProps, IEmailWorkf
175
193
 
176
194
  public downloadSampleCsv() {
177
195
  const { name } = this.props.story;
196
+ const { isCrM } = this.props;
178
197
  const { inventory, inventoryKeys } = this.state;
179
198
 
180
199
  const maskConfig: any[] = inventoryKeys.map((currKey: string) => ({
@@ -183,6 +202,16 @@ class EmailWorkflow extends React.PureComponent<IEmailWorkflowProps, IEmailWorkf
183
202
  show: true
184
203
  }));
185
204
 
205
+ if (isCrM) {
206
+ for (const id of CRM_PLACEMENT_VARS) {
207
+ maskConfig.push({
208
+ id,
209
+ name: id,
210
+ show: true
211
+ });
212
+ }
213
+ }
214
+
186
215
  const emptyRow: any = maskConfig
187
216
  .map((m: any) => m.id)
188
217
  .reduce((prevState: any, currId: string) => ({ ...prevState, [currId]: '' }), {});
@@ -242,24 +271,17 @@ class EmailWorkflow extends React.PureComponent<IEmailWorkflowProps, IEmailWorkf
242
271
 
243
272
  public proceedWithExport() {
244
273
  const {
245
- renderBatch,
246
274
  activeBatch: {
247
- data: { id, name }
275
+ data: { id }
248
276
  }
249
277
  } = this.props;
250
- renderBatch(id, name)
251
- .then(() => {
252
- this.setState({ renderedBatch: true });
253
- })
254
- .catch((e) => {
255
- this.props.handleError(copy.publish.renderBatchFailed);
256
- this.setState({ renderedBatch: false });
257
- throw e;
258
- });
278
+
279
+ this.renderBatch({ id });
259
280
  }
260
281
 
261
282
  private importBatch({ story_id, id, name, uploadEvt }) {
262
283
  const { accessKey, compositionId, isExport, onError } = this.props;
284
+ onError(false); // reset the parent error
263
285
  this.props
264
286
  .importBatchFromCsv(
265
287
  story_id,
@@ -271,16 +293,16 @@ class EmailWorkflow extends React.PureComponent<IEmailWorkflowProps, IEmailWorkf
271
293
  !isExport,
272
294
  isExport
273
295
  )
274
- .then(() => {
296
+ .then((e) => {
275
297
  if (this.props.batchJobs.missing.length > 0) {
276
- onError();
298
+ onError(true); // set the error to true
277
299
  }
278
300
 
279
301
  this.setState({ uploadComplete: true, uploading: false });
280
302
  this.getBatch();
281
303
 
282
304
  if (isExport && Object.keys(this.props.batchJobs.missing).length === 0) {
283
- this.renderBatch({ id, name });
305
+ this.renderBatch({ id });
284
306
  }
285
307
  })
286
308
  .catch((e) => {
@@ -289,15 +311,49 @@ class EmailWorkflow extends React.PureComponent<IEmailWorkflowProps, IEmailWorkf
289
311
  });
290
312
  }
291
313
 
292
- private renderBatch({ id, name }) {
314
+ private getPostRenderActions() {
315
+ const CrMUploadAction = { data: {} };
316
+ const {
317
+ creativeManagerOverrides: {
318
+ placement_type,
319
+ creative_id,
320
+ creative_library_id,
321
+ notification_email
322
+ }
323
+ } = this.state;
324
+
325
+ CrMUploadAction['type'] = placement_type;
326
+ if (creative_id) {
327
+ CrMUploadAction.data['creative_id'] = creative_id;
328
+ }
329
+ if (creative_library_id) {
330
+ CrMUploadAction.data['creative_library_id'] = creative_library_id;
331
+ }
332
+ if (notification_email) {
333
+ CrMUploadAction.data['notification_email'] = notification_email;
334
+ }
335
+
336
+ return [CrMUploadAction];
337
+ }
338
+
339
+ private renderBatch({ id }) {
340
+ const { isCrM } = this.props;
341
+ const postRenderActions = isCrM ? this.getPostRenderActions() : null;
342
+ this.setState({ batchError: null });
293
343
  this.props
294
- .renderBatch(id, name)
344
+ .renderBatch(id, postRenderActions)
295
345
  .then(() => {
296
- this.setState({ renderedBatch: true });
346
+ this.setState({ renderedBatch: true, batchError: '' });
297
347
  })
298
348
  .catch((e) => {
299
349
  this.props.handleError(copy.publish.renderBatchFailed);
300
- this.setState({ renderedBatch: false });
350
+ this.setState({
351
+ renderedBatch: false,
352
+ batchError: e.response.data.error,
353
+ uploadComplete: false,
354
+ uploading: false,
355
+ downloading: false
356
+ });
301
357
  throw e;
302
358
  });
303
359
  }
@@ -489,11 +545,19 @@ class EmailWorkflow extends React.PureComponent<IEmailWorkflowProps, IEmailWorkf
489
545
  }
490
546
 
491
547
  public render() {
492
- const { uploadComplete, uploading, downloading, renderedBatch, selectedBatchId } =
493
- this.state;
548
+ const {
549
+ uploadComplete,
550
+ uploading,
551
+ downloading,
552
+ renderedBatch,
553
+ selectedBatchId,
554
+ batchError,
555
+ creativeManagerOverrides
556
+ } = this.state;
494
557
  const {
495
558
  isExport,
496
- batchJobs: { missing, renders }
559
+ batchJobs: { missing, renders },
560
+ isCrM
497
561
  } = this.props;
498
562
 
499
563
  const emailOptions = [
@@ -533,28 +597,41 @@ class EmailWorkflow extends React.PureComponent<IEmailWorkflowProps, IEmailWorkf
533
597
  </div>
534
598
  );
535
599
 
536
- const downloadCSVDiv = (
537
- <div>
538
- <h2>{uploadComplete ? copy.publish.downloadLink : copy.publish.generatingLink}</h2>
539
- <HRule />
540
- <p>
541
- {uploadComplete ? copy.publish.downloadDesc : copy.publish.generatingLinkDesc}
542
- </p>
543
-
544
- {isExport && uploadComplete && !renderedBatch ? (
545
- <BigButton
546
- label={reRenderLabel}
547
- disabled={isExport}
548
- />
549
- ) : (
550
- <BigButton
551
- label={downloadCsvLabel}
552
- disabled={downloading}
553
- onClick={() => this.downloadCsv()}
554
- />
555
- )}
556
- </div>
557
- );
600
+ const downloadCSVDiv =
601
+ isCrM && uploadComplete && renderedBatch ? (
602
+ <div>
603
+ <h2>{copy.publish.renderComplete}</h2>
604
+ <HRule />
605
+ <p>{copy.publish.goToCrM}</p>
606
+ </div>
607
+ ) : (
608
+ <div>
609
+ <h2>
610
+ {uploadComplete && renderedBatch
611
+ ? copy.publish.downloadLink
612
+ : copy.publish.generatingLink}
613
+ </h2>
614
+ <HRule />
615
+ <p>
616
+ {uploadComplete && renderedBatch
617
+ ? copy.publish.downloadDesc
618
+ : copy.publish.generatingLinkDesc}
619
+ </p>
620
+
621
+ {isExport && uploadComplete && !renderedBatch ? (
622
+ <BigButton
623
+ label={reRenderLabel}
624
+ disabled={isExport}
625
+ />
626
+ ) : (
627
+ <BigButton
628
+ label={downloadCsvLabel}
629
+ disabled={downloading}
630
+ onClick={() => this.downloadCsv()}
631
+ />
632
+ )}
633
+ </div>
634
+ );
558
635
 
559
636
  const downloadCSV = (
560
637
  <>
@@ -575,6 +652,13 @@ class EmailWorkflow extends React.PureComponent<IEmailWorkflowProps, IEmailWorkf
575
652
  ref={this.hiddenFileInputRef}
576
653
  onChange={this.doUploadCsv}
577
654
  />
655
+ {isCrM && (
656
+ <CrMOptions
657
+ options={creativeManagerOverrides}
658
+ errorCopy={batchError}
659
+ onChange={(c) => this.setState({ creativeManagerOverrides: c })}
660
+ />
661
+ )}
578
662
  <div className='link-wrapper'>
579
663
  {emailOptions?.map((option, index) => {
580
664
  return (
@@ -617,4 +701,54 @@ const mapStateToProps = (state): any => {
617
701
  batchesList: state.batchesList
618
702
  };
619
703
  };
704
+
705
+ const CrMOptions = ({ options, onChange, errorCopy = '' }) => {
706
+ const onInputChange = (key, val) => {
707
+ const newOpts = { ...options };
708
+ newOpts[key] = val;
709
+ onChange(newOpts);
710
+ };
711
+
712
+ const e = errorCopy ? (
713
+ <div className='batch-error'>
714
+ <p>Error: {errorCopy}</p>
715
+ <p>{copy.publish.missingFields}</p>
716
+ </div>
717
+ ) : null;
718
+
719
+ return (
720
+ <>
721
+ <HRule />
722
+ <br />
723
+ <h2>{copy.publish.crmPlacement}</h2>
724
+ <p>{copy.publish.crmData}</p>
725
+ {e}
726
+ <br />
727
+ <TextField
728
+ width={'33%'}
729
+ labelPosition='top'
730
+ label={copy.publish.creativeLibraryId}
731
+ value={options.creative_library_id}
732
+ onChange={(v) => onInputChange('creative_library_id', v)}
733
+ />
734
+ <TextField
735
+ width={'33%'}
736
+ labelPosition='top'
737
+ label={copy.publish.creativeId}
738
+ value={options.creative_id}
739
+ onChange={(v) => onInputChange('creative_id', v)}
740
+ />
741
+ <TextField
742
+ width={'33%'}
743
+ labelPosition='top'
744
+ label={copy.publish.email}
745
+ value={options.notification_email}
746
+ onChange={(v) => onInputChange('notification_email', v)}
747
+ />
748
+ <br />
749
+ <HRule />
750
+ </>
751
+ );
752
+ };
753
+
620
754
  export default connect(mapStateToProps, mapDispatchToProps, null, { withRef: true })(EmailWorkflow);
@@ -768,8 +768,8 @@ class StoryPreviewer extends React.PureComponent<IStoryPreviewerProps, IStoryPre
768
768
  tooltip='Download Preview'
769
769
  style='subtle'
770
770
  onClick={() => {
771
- this.download(url, fileName).catch((error) =>
772
- alert(`${ERROR.download.replace('[error]', error)}`)
771
+ this.download(url, fileName).catch((e) =>
772
+ alert(`${ERROR.download.replace('[error]', e)}`)
773
773
  );
774
774
  }}>
775
775
  {ICON_DOWNLOAD}
@@ -20,9 +20,9 @@ export const assets = {
20
20
  noUploads: 'There are currently no assets uploading...',
21
21
  preparePhase: 'Preparing asset...',
22
22
  autoTagInput: 'Tag by filename',
23
- assignToStoryInput: 'Assign to Story',
24
- assignToStoryInfo:
25
- 'If selected, any assets uploaded will only be available to use with the currently selected story.',
23
+ assignToProjectInput: 'Assign to Project',
24
+ assignToProjectInfo:
25
+ 'If selected, any assets uploaded will only be available to use with the currently selected project.',
26
26
  uploadButton: 'Upload',
27
27
  cancelButton: 'Cancel'
28
28
  },
@@ -105,9 +105,18 @@ export const compositions = {
105
105
  };
106
106
 
107
107
  export const publish = {
108
+ creativeLibraryId: 'Creative Library ID',
109
+ creativeId: 'Creative ID',
110
+ email: 'Notification Email',
111
+ missingFields: 'Please provide the missing fields and try again!',
112
+ crmPlacement: 'Creative Manager Placement Variables',
113
+ 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.`,
108
114
  accessKey: 'Access Key',
109
115
  tooltipAccessKey: 'API access key to use for this video distribution.',
110
116
  publishTitle: 'Publish & Deliver',
117
+ goToCrM:
118
+ 'Your videos have finished rendering. They will appear in Creative Manager momentarily.',
119
+ renderComplete: 'Render Complete!',
111
120
 
112
121
  // publish
113
122
  publishStepTitle: 'STEP 1: Publish your Project',
@@ -125,7 +134,7 @@ export const publish = {
125
134
  webpageTitle: 'STEP 3: Webpage',
126
135
  webPageHosted: 'Webpage hosted on Imposium',
127
136
  webpageDesc:
128
- 'You can share a demo page that is hosted on Imposium or you can download a sample webpage you can customize and use to generate videos. Please ensure you include a column for every variable on your story.',
137
+ 'You can share a demo page that is hosted on Imposium or you can download a sample webpage you can customize and use to generate videos. Please ensure you include a column for every variable on your project.',
129
138
  sampleWebpage: 'Download sample webpage',
130
139
 
131
140
  // email
@@ -135,9 +144,9 @@ export const publish = {
135
144
  emailDesc:
136
145
  'You can download a sample CSV with fields to populate as a starting point. Or you can upload one that already has the data in it.',
137
146
  downloadSampleCsvLink: 'Download Sample CSV',
138
- uploadCsv: 'Upload Your CSV UserList',
147
+ uploadCsv: 'Upload Your CSV',
139
148
  generatingLink: 'STEP 4: Generating embed links',
140
- downloadLink: 'STEP 5: Download Your Userlist CSV file',
149
+ downloadLink: 'STEP 5: Download Your CSV file',
141
150
  btnDownload: 'Download CSV',
142
151
  generatingLinkDesc:
143
152
  'Please wait while we generate the link for your users. This may take few minutes.',
@@ -152,8 +161,8 @@ export const publish = {
152
161
  'Your CSV data file is ready to download with an embed code you can import into your email platform to send out.',
153
162
  titleMissingColumns: 'Warning: ',
154
163
  csvMissingColumns:
155
- 'Some of your column names did not match up with the variables in the story. Please ensure these variables line up and then re-upload the csv: ',
156
- csvMatchColumns: 'Please match the column(s) provided to the story variables:',
164
+ 'Some of your column names did not match up with the variables in the project. Please ensure these variables line up and then re-upload the csv: ',
165
+ csvMatchColumns: 'Please match the column(s) provided to the project variables:',
157
166
  // export
158
167
  exportBatchOfVideo: 'Export batch of videos',
159
168
 
@@ -169,7 +178,9 @@ export const publish = {
169
178
  btnAPI: 'API integration',
170
179
 
171
180
  // export
172
- btnExport: 'Export',
181
+ btnExport: 'Export as Files',
182
+
183
+ btnCRM: 'Flashtalking Creative Manager',
173
184
 
174
185
  // global
175
186
  btnPublish: 'Publish',
@@ -179,7 +190,7 @@ export const publish = {
179
190
  btnCancel: 'Cancel',
180
191
  btnNext: 'Next',
181
192
  noCompErrorTitle: 'No Compositions Found',
182
- noCompErrorDesc: `You must have at least 1 composition on your story to render and distribute videos.`
193
+ noCompErrorDesc: `You must have at least 1 composition on your project to render and distribute videos.`
183
194
  };
184
195
 
185
196
  export const integration = {
@@ -200,8 +211,8 @@ export const integration = {
200
211
  export const header = {
201
212
  publishing: 'Publishing...',
202
213
  working: 'Using Working Copy',
203
- statusError: 'Error getting story status',
204
- publishJobError: 'Error creating publish story job',
214
+ statusError: 'Error getting project status',
215
+ publishJobError: 'Error creating publish project job',
205
216
  publishPollError: 'Error polling publish job status'
206
217
  };
207
218
 
@@ -0,0 +1,24 @@
1
+ export const CRM_PLACEMENT_TYPES = {
2
+ AD_STUDIO: 'crm-adstudio',
3
+ VIDEO_BUILDER: 'crm-videobuilder'
4
+ };
5
+
6
+ export const CRM_PLACEMENT_OPTIONS = [
7
+ {
8
+ value: CRM_PLACEMENT_TYPES.AD_STUDIO,
9
+ label: 'AdStudio'
10
+ },
11
+ {
12
+ value: CRM_PLACEMENT_TYPES.VIDEO_BUILDER,
13
+ label: 'Video Builder'
14
+ }
15
+ ];
16
+
17
+ export const CRM_PLACEMENT_VARS = [
18
+ 'creative_library_id',
19
+ 'creative_id',
20
+ 'version-name',
21
+ 'version-id',
22
+ 'clickTag1',
23
+ 'notificiaton_email'
24
+ ];
@@ -73,7 +73,7 @@ export interface IImposiumAPI {
73
73
  duplicateBatch(batchId: string);
74
74
  downloadBatchExport(batchId: string, exportId: number);
75
75
  deleteBatch(batchId: string);
76
- invokeBatchRenderJob(batchId: string);
76
+ invokeBatchRenderJob(batchId: string, postRenderActions?: any);
77
77
  cancelBatchRenderJob(batchId: string);
78
78
  getJob(jobId: string);
79
79
  pollJob(jobId: string);
@@ -660,6 +660,8 @@ export default class API {
660
660
  formData.append('include_email_embed', 'true');
661
661
  formData.append('composition_id', compId);
662
662
  formData.append('access_key', accessKey);
663
+ } else if (compId) {
664
+ formData.append('composition_id', compId);
663
665
  }
664
666
 
665
667
  if (addMedia) {
@@ -1119,13 +1121,22 @@ export default class API {
1119
1121
  });
1120
1122
  };
1121
1123
 
1122
- public invokeBatchRenderJob = (batchId: string): Promise<any | Error> => {
1124
+ public invokeBatchRenderJob = (
1125
+ batchId: string,
1126
+ postRenderActions?: any
1127
+ ): Promise<any | Error> => {
1128
+ const data = {
1129
+ batch_id: batchId
1130
+ };
1131
+
1132
+ if (postRenderActions) {
1133
+ data['post_render_actions'] = postRenderActions;
1134
+ }
1135
+
1123
1136
  return this.doRequest({
1124
1137
  method: 'POST',
1125
1138
  url: '/job/render-batch',
1126
- data: {
1127
- batch_id: batchId
1128
- }
1139
+ data
1129
1140
  });
1130
1141
  };
1131
1142