@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.
- package/dist/cjs/components/assets/AssetsUploadMenu.js +1 -1
- package/dist/cjs/components/assets/AssetsUploadMenu.js.map +1 -1
- package/dist/cjs/components/button/Button.stories.d.ts +1 -0
- package/dist/cjs/components/button-group-field/ButtonGroupField.stories.d.ts +1 -0
- package/dist/cjs/components/button-menu/ButtonMenu.stories.d.ts +1 -0
- package/dist/cjs/components/card/Card.stories.d.ts +1 -0
- package/dist/cjs/components/checkbox-field/CheckboxField.stories.d.ts +1 -0
- package/dist/cjs/components/color-field/ColorFiled.stories.d.ts +1 -0
- package/dist/cjs/components/controlled-list/ControlledList.stories.d.ts +1 -0
- package/dist/cjs/components/field-wrapper/FieldWrapper.stories.d.ts +1 -0
- package/dist/cjs/components/h-rule/HRule.d.ts +1 -0
- package/dist/cjs/components/h-rule/HRule.stories.d.ts +1 -0
- package/dist/cjs/components/list-field/ListField.stories.d.ts +1 -0
- package/dist/cjs/components/modal/Modal.stories.d.ts +1 -0
- package/dist/cjs/components/number-field/NumberField.stories.d.ts +1 -0
- package/dist/cjs/components/publish-wizard/EmailWorkflow.d.ts +2 -0
- package/dist/cjs/components/publish-wizard/EmailWorkflow.js +491 -0
- package/dist/cjs/components/publish-wizard/EmailWorkflow.js.map +1 -0
- package/dist/cjs/components/publish-wizard/PublishWizard.js +14 -4
- package/dist/cjs/components/publish-wizard/PublishWizard.js.map +1 -1
- package/dist/cjs/components/publish-wizard/copy.d.ts +186 -0
- package/dist/cjs/components/publish-wizard/copy.js +199 -0
- package/dist/cjs/components/publish-wizard/copy.js.map +1 -0
- package/dist/cjs/components/publish-wizard/publish/EmailWorkflow.js +103 -25
- package/dist/cjs/components/publish-wizard/publish/EmailWorkflow.js.map +1 -1
- package/dist/cjs/components/section/Section.d.ts +1 -0
- package/dist/cjs/components/section/Section.stories.d.ts +1 -0
- package/dist/cjs/components/select-field/SelectField.stories.d.ts +1 -0
- package/dist/cjs/components/slider-field/SliderField.stories.d.ts +1 -0
- package/dist/cjs/components/story-previewer/StoryPreviewer.js +2 -2
- package/dist/cjs/components/story-previewer/StoryPreviewer.js.map +1 -1
- package/dist/cjs/components/story-previewer/StoryPreviewer_BACKUP_64741.d.ts +2 -0
- package/dist/cjs/components/story-previewer/StoryPreviewer_BACKUP_64741.js +670 -0
- package/dist/cjs/components/story-previewer/StoryPreviewer_BACKUP_64741.js.map +1 -0
- package/dist/cjs/components/story-previewer/StoryPreviewer_BASE_64741.d.ts +2 -0
- package/dist/cjs/components/story-previewer/StoryPreviewer_BASE_64741.js +553 -0
- package/dist/cjs/components/story-previewer/StoryPreviewer_BASE_64741.js.map +1 -0
- package/dist/cjs/components/story-previewer/StoryPreviewer_LOCAL_64741.d.ts +2 -0
- package/dist/cjs/components/story-previewer/StoryPreviewer_LOCAL_64741.js +650 -0
- package/dist/cjs/components/story-previewer/StoryPreviewer_LOCAL_64741.js.map +1 -0
- package/dist/cjs/components/story-previewer/StoryPreviewer_REMOTE_64741.d.ts +2 -0
- package/dist/cjs/components/story-previewer/StoryPreviewer_REMOTE_64741.js +639 -0
- package/dist/cjs/components/story-previewer/StoryPreviewer_REMOTE_64741.js.map +1 -0
- package/dist/cjs/components/text-area-field/TextAreaField.stories.d.ts +1 -0
- package/dist/cjs/components/text-field/TextField.stories.d.ts +1 -0
- package/dist/cjs/constants/assets_BACKUP_14924.d.ts +20 -0
- package/dist/cjs/constants/assets_BACKUP_14924.js +30 -0
- package/dist/cjs/constants/assets_BACKUP_14924.js.map +1 -0
- package/dist/cjs/constants/assets_BASE_14924.d.ts +21 -0
- package/dist/cjs/constants/assets_BASE_14924.js +32 -0
- package/dist/cjs/constants/assets_BASE_14924.js.map +1 -0
- package/dist/cjs/constants/assets_LOCAL_14924.d.ts +20 -0
- package/dist/cjs/constants/assets_LOCAL_14924.js +30 -0
- package/dist/cjs/constants/assets_LOCAL_14924.js.map +1 -0
- package/dist/cjs/constants/assets_REMOTE_14924.d.ts +21 -0
- package/dist/cjs/constants/assets_REMOTE_14924.js +32 -0
- package/dist/cjs/constants/assets_REMOTE_14924.js.map +1 -0
- package/dist/cjs/constants/copy.d.ts +11 -2
- package/dist/cjs/constants/copy.js +20 -11
- package/dist/cjs/constants/copy.js.map +1 -1
- package/dist/cjs/constants/publish.d.ts +9 -0
- package/dist/cjs/constants/publish.js +26 -0
- package/dist/cjs/constants/publish.js.map +1 -0
- package/dist/cjs/services/API.d.ts +2 -2
- package/dist/cjs/services/API.js +11 -4
- package/dist/cjs/services/API.js.map +1 -1
- package/dist/esm/components/assets/AssetsUploadMenu.js +1 -1
- package/dist/esm/components/assets/AssetsUploadMenu.js.map +1 -1
- package/dist/esm/components/button/Button.stories.d.ts +1 -0
- package/dist/esm/components/button-group-field/ButtonGroupField.stories.d.ts +1 -0
- package/dist/esm/components/button-menu/ButtonMenu.stories.d.ts +1 -0
- package/dist/esm/components/card/Card.stories.d.ts +1 -0
- package/dist/esm/components/checkbox-field/CheckboxField.stories.d.ts +1 -0
- package/dist/esm/components/color-field/ColorFiled.stories.d.ts +1 -0
- package/dist/esm/components/controlled-list/ControlledList.stories.d.ts +1 -0
- package/dist/esm/components/field-wrapper/FieldWrapper.stories.d.ts +1 -0
- package/dist/esm/components/h-rule/HRule.d.ts +1 -0
- package/dist/esm/components/h-rule/HRule.stories.d.ts +1 -0
- package/dist/esm/components/list-field/ListField.stories.d.ts +1 -0
- package/dist/esm/components/modal/Modal.stories.d.ts +1 -0
- package/dist/esm/components/number-field/NumberField.stories.d.ts +1 -0
- package/dist/esm/components/publish-wizard/EmailWorkflow.d.ts +2 -0
- package/dist/esm/components/publish-wizard/EmailWorkflow.js +398 -0
- package/dist/esm/components/publish-wizard/EmailWorkflow.js.map +1 -0
- package/dist/esm/components/publish-wizard/PublishWizard.js +15 -5
- package/dist/esm/components/publish-wizard/PublishWizard.js.map +1 -1
- package/dist/esm/components/publish-wizard/copy.d.ts +186 -0
- package/dist/esm/components/publish-wizard/copy.js +196 -0
- package/dist/esm/components/publish-wizard/copy.js.map +1 -0
- package/dist/esm/components/publish-wizard/publish/EmailWorkflow.js +90 -23
- package/dist/esm/components/publish-wizard/publish/EmailWorkflow.js.map +1 -1
- package/dist/esm/components/section/Section.d.ts +1 -0
- package/dist/esm/components/section/Section.stories.d.ts +1 -0
- package/dist/esm/components/select-field/SelectField.stories.d.ts +1 -0
- package/dist/esm/components/slider-field/SliderField.stories.d.ts +1 -0
- package/dist/esm/components/story-previewer/StoryPreviewer.js +1 -1
- package/dist/esm/components/story-previewer/StoryPreviewer.js.map +1 -1
- package/dist/esm/components/story-previewer/StoryPreviewer_BACKUP_64741.d.ts +2 -0
- package/dist/esm/components/story-previewer/StoryPreviewer_BACKUP_64741.js +554 -0
- package/dist/esm/components/story-previewer/StoryPreviewer_BACKUP_64741.js.map +1 -0
- package/dist/esm/components/story-previewer/StoryPreviewer_BASE_64741.d.ts +2 -0
- package/dist/esm/components/story-previewer/StoryPreviewer_BASE_64741.js +489 -0
- package/dist/esm/components/story-previewer/StoryPreviewer_BASE_64741.js.map +1 -0
- package/dist/esm/components/story-previewer/StoryPreviewer_LOCAL_64741.d.ts +2 -0
- package/dist/esm/components/story-previewer/StoryPreviewer_LOCAL_64741.js +537 -0
- package/dist/esm/components/story-previewer/StoryPreviewer_LOCAL_64741.js.map +1 -0
- package/dist/esm/components/story-previewer/StoryPreviewer_REMOTE_64741.d.ts +2 -0
- package/dist/esm/components/story-previewer/StoryPreviewer_REMOTE_64741.js +526 -0
- package/dist/esm/components/story-previewer/StoryPreviewer_REMOTE_64741.js.map +1 -0
- package/dist/esm/components/text-area-field/TextAreaField.stories.d.ts +1 -0
- package/dist/esm/components/text-field/TextField.stories.d.ts +1 -0
- package/dist/esm/constants/assets_BACKUP_14924.d.ts +20 -0
- package/dist/esm/constants/assets_BACKUP_14924.js +26 -0
- package/dist/esm/constants/assets_BACKUP_14924.js.map +1 -0
- package/dist/esm/constants/assets_BASE_14924.d.ts +21 -0
- package/dist/esm/constants/assets_BASE_14924.js +28 -0
- package/dist/esm/constants/assets_BASE_14924.js.map +1 -0
- package/dist/esm/constants/assets_LOCAL_14924.d.ts +20 -0
- package/dist/esm/constants/assets_LOCAL_14924.js +26 -0
- package/dist/esm/constants/assets_LOCAL_14924.js.map +1 -0
- package/dist/esm/constants/assets_REMOTE_14924.d.ts +21 -0
- package/dist/esm/constants/assets_REMOTE_14924.js +28 -0
- package/dist/esm/constants/assets_REMOTE_14924.js.map +1 -0
- package/dist/esm/constants/copy.d.ts +11 -2
- package/dist/esm/constants/copy.js +20 -11
- package/dist/esm/constants/copy.js.map +1 -1
- package/dist/esm/constants/publish.d.ts +9 -0
- package/dist/esm/constants/publish.js +23 -0
- package/dist/esm/constants/publish.js.map +1 -0
- package/dist/esm/services/API.d.ts +2 -2
- package/dist/esm/services/API.js +11 -4
- package/dist/esm/services/API.js.map +1 -1
- package/dist/styles.css +9 -3
- package/dist/styles.less +12 -4
- package/less/components/assets.less +1 -3
- package/less/components/form-field.less +2 -1
- package/less/components/publish-wizard.less +9 -0
- package/package.json +3 -3
- package/src/components/assets/AssetsUploadMenu.tsx +2 -2
- package/src/components/publish-wizard/PublishWizard.tsx +21 -7
- package/src/components/publish-wizard/publish/EmailWorkflow.tsx +182 -48
- package/src/components/story-previewer/StoryPreviewer.tsx +2 -2
- package/src/constants/copy.ts +23 -12
- package/src/constants/publish.ts +24 -0
- 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.
|
|
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.
|
|
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.
|
|
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.
|
|
85
|
-
info={copy.uploads.
|
|
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,
|
|
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} {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:
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
275
|
+
data: { id }
|
|
248
276
|
}
|
|
249
277
|
} = this.props;
|
|
250
|
-
|
|
251
|
-
|
|
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
|
|
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
|
|
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,
|
|
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({
|
|
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 {
|
|
493
|
-
|
|
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
|
-
|
|
538
|
-
<
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
{
|
|
542
|
-
</
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
<
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
<
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
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((
|
|
772
|
-
alert(`${ERROR.download.replace('[error]',
|
|
771
|
+
this.download(url, fileName).catch((e) =>
|
|
772
|
+
alert(`${ERROR.download.replace('[error]', e)}`)
|
|
773
773
|
);
|
|
774
774
|
}}>
|
|
775
775
|
{ICON_DOWNLOAD}
|
package/src/constants/copy.ts
CHANGED
|
@@ -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
|
-
|
|
24
|
-
|
|
25
|
-
'If selected, any assets uploaded will only be available to use with the currently selected
|
|
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
|
|
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
|
|
147
|
+
uploadCsv: 'Upload Your CSV',
|
|
139
148
|
generatingLink: 'STEP 4: Generating embed links',
|
|
140
|
-
downloadLink: 'STEP 5: Download Your
|
|
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
|
|
156
|
-
csvMatchColumns: 'Please match the column(s) provided to the
|
|
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
|
|
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
|
|
204
|
-
publishJobError: 'Error creating publish
|
|
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
|
+
];
|
package/src/services/API.ts
CHANGED
|
@@ -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 = (
|
|
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
|
|