@imposium-hub/components 2.11.4 → 2.11.5-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (220) hide show
  1. package/dist/cjs/components/advanced-number-field/AdvancedNumberField.d.ts +1 -1
  2. package/dist/cjs/components/anchor-field/AnchorField.d.ts +1 -1
  3. package/dist/cjs/components/assets/AssetsTableDateCell.d.ts +6 -1
  4. package/dist/cjs/components/assets/AssetsTableGlobalCell.d.ts +5 -1
  5. package/dist/cjs/components/assets/AssetsTablePreviewCell.d.ts +17 -1
  6. package/dist/cjs/components/assets/AssetsTableStatusCell.d.ts +5 -1
  7. package/dist/cjs/components/assets/AssetsTableTagsCell.d.ts +6 -1
  8. package/dist/cjs/components/assets/AssetsTableTypeCell.d.ts +5 -1
  9. package/dist/cjs/components/assets/AssetsTypeIcon.d.ts +5 -1
  10. package/dist/cjs/components/assets/FontAssetPreview.d.ts +1 -1
  11. package/dist/cjs/components/assets/StoryTableTotalRendersCell.d.ts +2 -1
  12. package/dist/cjs/components/button/Button.d.ts +1 -1
  13. package/dist/cjs/components/button/Button.stories.d.ts +6 -5
  14. package/dist/cjs/components/button-group-field/ButtonGroupField.stories.d.ts +2 -1
  15. package/dist/cjs/components/button-menu/ButtonMenu.d.ts +2 -2
  16. package/dist/cjs/components/button-menu/ButtonMenu.stories.d.ts +2 -1
  17. package/dist/cjs/components/button-menu/ButtonMenuItem.d.ts +1 -1
  18. package/dist/cjs/components/card/Card.d.ts +4 -4
  19. package/dist/cjs/components/card/Card.stories.d.ts +2 -1
  20. package/dist/cjs/components/checkbox-field/CheckboxField.d.ts +1 -1
  21. package/dist/cjs/components/checkbox-field/CheckboxField.stories.d.ts +2 -1
  22. package/dist/cjs/components/color-field/ColorField.d.ts +1 -1
  23. package/dist/cjs/components/color-field/ColorFiled.stories.d.ts +2 -1
  24. package/dist/cjs/components/compositions/TextLayer.d.ts +1 -1
  25. package/dist/cjs/components/confirm-modal/ConfirmModal.d.ts +2 -1
  26. package/dist/cjs/components/controlled-list/ControlledList.d.ts +2 -2
  27. package/dist/cjs/components/controlled-list/ControlledList.stories.d.ts +2 -1
  28. package/dist/cjs/components/copy-prop-id-button/CopyPropIdButton.d.ts +1 -1
  29. package/dist/cjs/components/determinate-loader/DeterminateLoader.stories.d.ts +4 -3
  30. package/dist/cjs/components/dropdown/Dropdown.d.ts +1 -1
  31. package/dist/cjs/components/dropdown/dropdown.stories.d.ts +1 -1
  32. package/dist/cjs/components/field-wrapper/FieldWrapper.d.ts +2 -2
  33. package/dist/cjs/components/field-wrapper/FieldWrapper.stories.d.ts +2 -1
  34. package/dist/cjs/components/font-picker/FontPicker.d.ts +1 -1
  35. package/dist/cjs/components/h-rule/HRule.d.ts +2 -1
  36. package/dist/cjs/components/h-rule/HRule.stories.d.ts +3 -2
  37. package/dist/cjs/components/header/Header.js +2 -3
  38. package/dist/cjs/components/header/Header.js.map +1 -1
  39. package/dist/cjs/components/header/ProjectDropdown.d.ts +2 -1
  40. package/dist/cjs/components/list-field/ListField.d.ts +1 -1
  41. package/dist/cjs/components/list-field/ListField.stories.d.ts +2 -1
  42. package/dist/cjs/components/log-viewer/LogViewer.d.ts +1 -1
  43. package/dist/cjs/components/media-variable-field/MediaVariableField.d.ts +1 -1
  44. package/dist/cjs/components/modal/Modal.d.ts +1 -1
  45. package/dist/cjs/components/modal/Modal.stories.d.ts +2 -1
  46. package/dist/cjs/components/number-field/NumberField.d.ts +1 -1
  47. package/dist/cjs/components/number-field/NumberField.stories.d.ts +2 -1
  48. package/dist/cjs/components/players/AudioPlayer.d.ts +1 -1
  49. package/dist/cjs/components/players/AudioPreview.d.ts +1 -1
  50. package/dist/cjs/components/players/ImagePlayer.d.ts +1 -1
  51. package/dist/cjs/components/players/ImagePreview.d.ts +1 -1
  52. package/dist/cjs/components/players/ImageSequencePlayer.d.ts +1 -1
  53. package/dist/cjs/components/players/TemplatePlayer.d.ts +1 -1
  54. package/dist/cjs/components/players/VideoPlayer.d.ts +1 -1
  55. package/dist/cjs/components/players/VideoPreview.d.ts +1 -1
  56. package/dist/cjs/components/publish-wizard/PublishWizard.d.ts +2 -2
  57. package/dist/cjs/components/publish-wizard/PublishWizard.js +37 -14
  58. package/dist/cjs/components/publish-wizard/PublishWizard.js.map +1 -1
  59. package/dist/cjs/components/publish-wizard/publish/APIIntegration.d.ts +1 -1
  60. package/dist/cjs/components/publish-wizard/publish/CrMPublishCreativeSelectCell.js +1 -1
  61. package/dist/cjs/components/publish-wizard/publish/CrMPublishCreativeSelectCell.js.map +1 -1
  62. package/dist/cjs/components/publish-wizard/publish/CrMPublishCreativeSelectHeader.js.map +1 -1
  63. package/dist/cjs/components/publish-wizard/publish/CrMPublishNameCell.js +1 -1
  64. package/dist/cjs/components/publish-wizard/publish/CrMPublishNameCell.js.map +1 -1
  65. package/dist/cjs/components/publish-wizard/publish/CrMPublishPreviewCell.js.map +1 -1
  66. package/dist/cjs/components/publish-wizard/publish/CrMPublishStatusCell.js.map +1 -1
  67. package/dist/cjs/components/publish-wizard/publish/CrMPublishUI.js +15 -11
  68. package/dist/cjs/components/publish-wizard/publish/CrMPublishUI.js.map +1 -1
  69. package/dist/cjs/components/publish-wizard/publish/HubSpotFlow.d.ts +1 -1
  70. package/dist/cjs/components/publish-wizard/publish/WebpageHosted.d.ts +2 -2
  71. package/dist/cjs/components/section/Section.d.ts +2 -1
  72. package/dist/cjs/components/section/Section.stories.d.ts +3 -2
  73. package/dist/cjs/components/select-field/SelectField.d.ts +1 -1
  74. package/dist/cjs/components/select-field/SelectField.stories.d.ts +2 -1
  75. package/dist/cjs/components/shortcut-menu/ShortcutMenu.stories.d.ts +2 -1
  76. package/dist/cjs/components/slider-field/SliderField.d.ts +1 -1
  77. package/dist/cjs/components/slider-field/SliderField.stories.d.ts +2 -1
  78. package/dist/cjs/components/smpte-field/SMPTEField.d.ts +1 -1
  79. package/dist/cjs/components/tabs/Tabs.d.ts +4 -1
  80. package/dist/cjs/components/tabs/Tabs.stories.d.ts +5 -2
  81. package/dist/cjs/components/tag/Tag.d.ts +9 -1
  82. package/dist/cjs/components/text-area-field/TextAreaField.d.ts +1 -1
  83. package/dist/cjs/components/text-area-field/TextAreaField.stories.d.ts +2 -1
  84. package/dist/cjs/components/text-field/TextField.d.ts +1 -1
  85. package/dist/cjs/components/text-field/TextField.stories.d.ts +2 -1
  86. package/dist/cjs/constants/copy.d.ts +3 -0
  87. package/dist/cjs/constants/copy.js +3 -0
  88. package/dist/cjs/constants/copy.js.map +1 -1
  89. package/dist/cjs/constants/icons.d.ts +78 -76
  90. package/dist/cjs/constants/icons.js +3 -1
  91. package/dist/cjs/constants/icons.js.map +1 -1
  92. package/dist/cjs/constants/publish.d.ts +21 -0
  93. package/dist/cjs/constants/publish.js +26 -1
  94. package/dist/cjs/constants/publish.js.map +1 -1
  95. package/dist/cjs/redux/actions/publish.d.ts +1 -1
  96. package/dist/cjs/redux/actions/publish.js +2 -2
  97. package/dist/cjs/redux/actions/publish.js.map +1 -1
  98. package/dist/cjs/services/API.d.ts +4 -2
  99. package/dist/cjs/services/API.js +10 -1
  100. package/dist/cjs/services/API.js.map +1 -1
  101. package/dist/esm/components/advanced-number-field/AdvancedNumberField.d.ts +1 -1
  102. package/dist/esm/components/anchor-field/AnchorField.d.ts +1 -1
  103. package/dist/esm/components/assets/AssetsTableDateCell.d.ts +6 -1
  104. package/dist/esm/components/assets/AssetsTableGlobalCell.d.ts +5 -1
  105. package/dist/esm/components/assets/AssetsTablePreviewCell.d.ts +17 -1
  106. package/dist/esm/components/assets/AssetsTableStatusCell.d.ts +5 -1
  107. package/dist/esm/components/assets/AssetsTableTagsCell.d.ts +6 -1
  108. package/dist/esm/components/assets/AssetsTableTypeCell.d.ts +5 -1
  109. package/dist/esm/components/assets/AssetsTypeIcon.d.ts +5 -1
  110. package/dist/esm/components/assets/FontAssetPreview.d.ts +1 -1
  111. package/dist/esm/components/assets/StoryTableTotalRendersCell.d.ts +2 -1
  112. package/dist/esm/components/button/Button.d.ts +1 -1
  113. package/dist/esm/components/button/Button.stories.d.ts +6 -5
  114. package/dist/esm/components/button-group-field/ButtonGroupField.stories.d.ts +2 -1
  115. package/dist/esm/components/button-menu/ButtonMenu.d.ts +2 -2
  116. package/dist/esm/components/button-menu/ButtonMenu.stories.d.ts +2 -1
  117. package/dist/esm/components/button-menu/ButtonMenuItem.d.ts +1 -1
  118. package/dist/esm/components/card/Card.d.ts +4 -4
  119. package/dist/esm/components/card/Card.stories.d.ts +2 -1
  120. package/dist/esm/components/checkbox-field/CheckboxField.d.ts +1 -1
  121. package/dist/esm/components/checkbox-field/CheckboxField.stories.d.ts +2 -1
  122. package/dist/esm/components/color-field/ColorField.d.ts +1 -1
  123. package/dist/esm/components/color-field/ColorFiled.stories.d.ts +2 -1
  124. package/dist/esm/components/compositions/TextLayer.d.ts +1 -1
  125. package/dist/esm/components/confirm-modal/ConfirmModal.d.ts +2 -1
  126. package/dist/esm/components/controlled-list/ControlledList.d.ts +2 -2
  127. package/dist/esm/components/controlled-list/ControlledList.stories.d.ts +2 -1
  128. package/dist/esm/components/copy-prop-id-button/CopyPropIdButton.d.ts +1 -1
  129. package/dist/esm/components/determinate-loader/DeterminateLoader.stories.d.ts +4 -3
  130. package/dist/esm/components/dropdown/Dropdown.d.ts +1 -1
  131. package/dist/esm/components/dropdown/dropdown.stories.d.ts +1 -1
  132. package/dist/esm/components/field-wrapper/FieldWrapper.d.ts +2 -2
  133. package/dist/esm/components/field-wrapper/FieldWrapper.stories.d.ts +2 -1
  134. package/dist/esm/components/font-picker/FontPicker.d.ts +1 -1
  135. package/dist/esm/components/h-rule/HRule.d.ts +2 -1
  136. package/dist/esm/components/h-rule/HRule.stories.d.ts +3 -2
  137. package/dist/esm/components/header/Header.js +2 -3
  138. package/dist/esm/components/header/Header.js.map +1 -1
  139. package/dist/esm/components/header/ProjectDropdown.d.ts +2 -1
  140. package/dist/esm/components/list-field/ListField.d.ts +1 -1
  141. package/dist/esm/components/list-field/ListField.stories.d.ts +2 -1
  142. package/dist/esm/components/log-viewer/LogViewer.d.ts +1 -1
  143. package/dist/esm/components/media-variable-field/MediaVariableField.d.ts +1 -1
  144. package/dist/esm/components/modal/Modal.d.ts +1 -1
  145. package/dist/esm/components/modal/Modal.stories.d.ts +2 -1
  146. package/dist/esm/components/number-field/NumberField.d.ts +1 -1
  147. package/dist/esm/components/number-field/NumberField.stories.d.ts +2 -1
  148. package/dist/esm/components/players/AudioPlayer.d.ts +1 -1
  149. package/dist/esm/components/players/AudioPreview.d.ts +1 -1
  150. package/dist/esm/components/players/ImagePlayer.d.ts +1 -1
  151. package/dist/esm/components/players/ImagePreview.d.ts +1 -1
  152. package/dist/esm/components/players/ImageSequencePlayer.d.ts +1 -1
  153. package/dist/esm/components/players/TemplatePlayer.d.ts +1 -1
  154. package/dist/esm/components/players/VideoPlayer.d.ts +1 -1
  155. package/dist/esm/components/players/VideoPreview.d.ts +1 -1
  156. package/dist/esm/components/publish-wizard/PublishWizard.d.ts +2 -2
  157. package/dist/esm/components/publish-wizard/PublishWizard.js +36 -14
  158. package/dist/esm/components/publish-wizard/PublishWizard.js.map +1 -1
  159. package/dist/esm/components/publish-wizard/publish/APIIntegration.d.ts +1 -1
  160. package/dist/esm/components/publish-wizard/publish/CrMPublishCreativeSelectCell.js +1 -1
  161. package/dist/esm/components/publish-wizard/publish/CrMPublishCreativeSelectCell.js.map +1 -1
  162. package/dist/esm/components/publish-wizard/publish/CrMPublishCreativeSelectHeader.js +3 -3
  163. package/dist/esm/components/publish-wizard/publish/CrMPublishCreativeSelectHeader.js.map +1 -1
  164. package/dist/esm/components/publish-wizard/publish/CrMPublishNameCell.js +1 -1
  165. package/dist/esm/components/publish-wizard/publish/CrMPublishNameCell.js.map +1 -1
  166. package/dist/esm/components/publish-wizard/publish/CrMPublishPreviewCell.js.map +1 -1
  167. package/dist/esm/components/publish-wizard/publish/CrMPublishStatusCell.js.map +1 -1
  168. package/dist/esm/components/publish-wizard/publish/CrMPublishUI.js +19 -15
  169. package/dist/esm/components/publish-wizard/publish/CrMPublishUI.js.map +1 -1
  170. package/dist/esm/components/publish-wizard/publish/HubSpotFlow.d.ts +1 -1
  171. package/dist/esm/components/publish-wizard/publish/WebpageHosted.d.ts +2 -2
  172. package/dist/esm/components/section/Section.d.ts +2 -1
  173. package/dist/esm/components/section/Section.stories.d.ts +3 -2
  174. package/dist/esm/components/select-field/SelectField.d.ts +1 -1
  175. package/dist/esm/components/select-field/SelectField.stories.d.ts +2 -1
  176. package/dist/esm/components/shortcut-menu/ShortcutMenu.stories.d.ts +2 -1
  177. package/dist/esm/components/slider-field/SliderField.d.ts +1 -1
  178. package/dist/esm/components/slider-field/SliderField.stories.d.ts +2 -1
  179. package/dist/esm/components/smpte-field/SMPTEField.d.ts +1 -1
  180. package/dist/esm/components/tabs/Tabs.d.ts +4 -1
  181. package/dist/esm/components/tabs/Tabs.stories.d.ts +5 -2
  182. package/dist/esm/components/tag/Tag.d.ts +9 -1
  183. package/dist/esm/components/text-area-field/TextAreaField.d.ts +1 -1
  184. package/dist/esm/components/text-area-field/TextAreaField.stories.d.ts +2 -1
  185. package/dist/esm/components/text-field/TextField.d.ts +1 -1
  186. package/dist/esm/components/text-field/TextField.stories.d.ts +2 -1
  187. package/dist/esm/constants/copy.d.ts +3 -0
  188. package/dist/esm/constants/copy.js +3 -0
  189. package/dist/esm/constants/copy.js.map +1 -1
  190. package/dist/esm/constants/icons.d.ts +78 -76
  191. package/dist/esm/constants/icons.js +2 -0
  192. package/dist/esm/constants/icons.js.map +1 -1
  193. package/dist/esm/constants/publish.d.ts +21 -0
  194. package/dist/esm/constants/publish.js +25 -0
  195. package/dist/esm/constants/publish.js.map +1 -1
  196. package/dist/esm/redux/actions/publish.d.ts +1 -1
  197. package/dist/esm/redux/actions/publish.js +2 -2
  198. package/dist/esm/redux/actions/publish.js.map +1 -1
  199. package/dist/esm/services/API.d.ts +4 -2
  200. package/dist/esm/services/API.js +10 -1
  201. package/dist/esm/services/API.js.map +1 -1
  202. package/dist/styles.css +14 -4
  203. package/dist/styles.less +17 -5
  204. package/less/components/data-table.less +1 -0
  205. package/less/components/header.less +6 -5
  206. package/less/components/publish-wizard.less +10 -0
  207. package/package.json +1 -1
  208. package/src/components/header/Header.tsx +2 -4
  209. package/src/components/publish-wizard/PublishWizard.tsx +56 -18
  210. package/src/components/publish-wizard/publish/CrMPublishCreativeSelectCell.tsx +29 -0
  211. package/src/components/publish-wizard/publish/CrMPublishCreativeSelectHeader.tsx +33 -0
  212. package/src/components/publish-wizard/publish/CrMPublishNameCell.tsx +27 -0
  213. package/src/components/publish-wizard/publish/CrMPublishPreviewCell.tsx +27 -0
  214. package/src/components/publish-wizard/publish/CrMPublishStatusCell.tsx +13 -0
  215. package/src/components/publish-wizard/publish/CrMPublishUI.tsx +195 -0
  216. package/src/constants/copy.ts +3 -0
  217. package/src/constants/icons.tsx +3 -0
  218. package/src/constants/publish.ts +28 -0
  219. package/src/redux/actions/publish.ts +2 -2
  220. package/src/services/API.ts +19 -3
package/dist/styles.css CHANGED
@@ -1023,6 +1023,7 @@ body a {
1023
1023
  .ip-table-wrapper .ip-table .ip-table-filter .filterable-cell-wrapper {
1024
1024
  display: flex;
1025
1025
  align-items: center;
1026
+ justify-content: space-between;
1026
1027
  }
1027
1028
  .ip-table-wrapper .ip-table .ip-table-header .filterable-cell-wrapper,
1028
1029
  .ip-table-wrapper .ip-table .ip-table-filter .filterable-cell-wrapper {
@@ -1861,12 +1862,13 @@ body a {
1861
1862
  .imposium-header .inner-content .inner-right a {
1862
1863
  border: none;
1863
1864
  }
1864
- .imposium-header .inner-content .inner-right .additional-buttons {
1865
- margin-right: 10px;
1866
- }
1867
- .imposium-header .inner-content .inner-right .additional-buttons .creativeMgrBtn {
1865
+ .imposium-header .inner-content .inner-right .creativeMgrBtn {
1868
1866
  position: relative;
1869
1867
  top: 1px;
1868
+ margin-right: 10px;
1869
+ }
1870
+ .imposium-header .inner-content .inner-right .additional-buttons {
1871
+ margin-right: 10px;
1870
1872
  }
1871
1873
  .imposium-header .inner-content .inner-right .btn-help {
1872
1874
  -webkit-touch-callout: none;
@@ -2486,6 +2488,14 @@ body a {
2486
2488
  font-weight: bold;
2487
2489
  font-size: 14px;
2488
2490
  }
2491
+ .crm-publish-name {
2492
+ background: #161616;
2493
+ width: 100%;
2494
+ padding-left: 5px;
2495
+ }
2496
+ .crm-publish-name.disabled {
2497
+ opacity: 0.5;
2498
+ }
2489
2499
  .section {
2490
2500
  position: absolute;
2491
2501
  width: 100%;
package/dist/styles.less CHANGED
@@ -1131,6 +1131,7 @@ body{
1131
1131
  .filterable-cell-wrapper {
1132
1132
  display: flex;
1133
1133
  align-items: center;
1134
+ justify-content: space-between;
1134
1135
  }
1135
1136
 
1136
1137
  .filterable-cell-wrapper {
@@ -1866,13 +1867,14 @@ body{
1866
1867
  border:none;
1867
1868
  }
1868
1869
 
1869
- .additional-buttons{
1870
+ .creativeMgrBtn {
1871
+ position: relative;
1872
+ top: 1px;
1870
1873
  margin-right:10px;
1874
+ }
1871
1875
 
1872
- .creativeMgrBtn {
1873
- position: relative;
1874
- top: 1px;
1875
- }
1876
+ .additional-buttons{
1877
+ margin-right:10px;
1876
1878
  }
1877
1879
 
1878
1880
  .btn-help {
@@ -2417,6 +2419,16 @@ body{
2417
2419
  }
2418
2420
  }
2419
2421
 
2422
+ .crm-publish-name{
2423
+ background: @backgroundDark;
2424
+ width: 100%;
2425
+ padding-left: 5px;
2426
+
2427
+ &.disabled{
2428
+ opacity: 0.5;
2429
+ }
2430
+ }
2431
+
2420
2432
  @sectionPadding:7px 5px 5px 5px;
2421
2433
  @sectionHeaderHeight:25px;
2422
2434
  @loaderHeight:6px;
@@ -82,6 +82,7 @@
82
82
  .filterable-cell-wrapper {
83
83
  display: flex;
84
84
  align-items: center;
85
+ justify-content: space-between;
85
86
  }
86
87
 
87
88
  .filterable-cell-wrapper {
@@ -193,13 +193,14 @@
193
193
  border:none;
194
194
  }
195
195
 
196
- .additional-buttons{
196
+ .creativeMgrBtn {
197
+ position: relative;
198
+ top: 1px;
197
199
  margin-right:10px;
200
+ }
198
201
 
199
- .creativeMgrBtn {
200
- position: relative;
201
- top: 1px;
202
- }
202
+ .additional-buttons{
203
+ margin-right:10px;
203
204
  }
204
205
 
205
206
  .btn-help {
@@ -179,4 +179,14 @@
179
179
  font-weight: bold;
180
180
  font-size:14px;
181
181
  }
182
+ }
183
+
184
+ .crm-publish-name{
185
+ background: @backgroundDark;
186
+ width: 100%;
187
+ padding-left: 5px;
188
+
189
+ &.disabled{
190
+ opacity: 0.5;
191
+ }
182
192
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@imposium-hub/components",
3
- "version": "2.11.4",
3
+ "version": "2.11.5-0",
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",
@@ -544,11 +544,9 @@ class ImposiumHeader extends React.PureComponent<IHeaderProps, IHeaderState> {
544
544
  </span>
545
545
 
546
546
  <span className='inner-right'>
547
+ {CrMLink}
547
548
  {storyToggle}
548
- <div className='additional-buttons'>
549
- {additionalButtons}
550
- {CrMLink}
551
- </div>
549
+ <div className='additional-buttons'>{additionalButtons}</div>
552
550
  {accountDropdownToggle}
553
551
  <a
554
552
  href='https://support.flashtalking.com/hc/en-us/sections/25515903148819-Imposium'
@@ -1,4 +1,5 @@
1
1
  import * as React from 'react';
2
+ import { CrMPublishUI } from './publish/CrMPublishUI';
2
3
  import Button from '../button/Button';
3
4
  import SelectField from '../select-field/SelectField';
4
5
  import HRule from '../h-rule/HRule';
@@ -34,7 +35,7 @@ interface IPublishWizardProps {
34
35
  checkStoryForErrors(): any;
35
36
  addViewer(c: any): void;
36
37
  exportExperiences: () => void;
37
- publishVersion: (api: IImposiumAPI, sId: string) => any;
38
+ publishVersion: (api: IImposiumAPI, sId: string, creativeIds?: string[]) => any;
38
39
  batchesList: any;
39
40
  onClose(): any;
40
41
  api: IImposiumAPI;
@@ -94,6 +95,7 @@ interface IPublishWizardState {
94
95
  next: boolean;
95
96
  nextStep: boolean;
96
97
  publishError: string;
98
+ selectedCreatives: string[];
97
99
  }
98
100
 
99
101
  interface IBigButtonProps {
@@ -140,7 +142,8 @@ class PublishWizard extends React.PureComponent<IPublishWizardProps, IPublishWiz
140
142
  error: false,
141
143
  next: false,
142
144
  nextStep: false,
143
- publishError: null
145
+ publishError: null,
146
+ selectedCreatives: []
144
147
  };
145
148
  this.emailWorkflow = React.createRef();
146
149
  this.hiddenFileInputRef = React.createRef();
@@ -301,7 +304,7 @@ class PublishWizard extends React.PureComponent<IPublishWizardProps, IPublishWiz
301
304
 
302
305
  if (fromCrM) {
303
306
  this.props
304
- .publishVersion(api, id)
307
+ .publishVersion(api, id, this.state.selectedCreatives)
305
308
  .then(() => {
306
309
  this.setState({ screenIndex: 1 });
307
310
  })
@@ -334,12 +337,27 @@ class PublishWizard extends React.PureComponent<IPublishWizardProps, IPublishWiz
334
337
 
335
338
  if (fromCrM && varLength === 0) {
336
339
  return true;
340
+ } else if (fromCrM && this.state.selectedCreatives.length === 0) {
341
+ return true;
337
342
  }
338
343
  return false;
339
344
  }
340
345
 
346
+ private getErrorCopyForCrMPublish() {
347
+ const { story, project } = this.props;
348
+ const variables = story ? story.acts[project.actId].inventory : {};
349
+ const varLength = variables ? Object.keys(variables).length : 0;
350
+
351
+ if (varLength === 0) {
352
+ return copy.publish.noVariablesError;
353
+ } else if (this.state.selectedCreatives.length === 0) {
354
+ return null;
355
+ }
356
+ }
357
+
341
358
  private renderLowerButtons() {
342
359
  const { screenIndex, done, error, next } = this.state;
360
+ const { fromCrM } = this.props;
343
361
  const { publishing } = this.props.publishData;
344
362
  const disabledForCrM = this.shouldDisablePublishButtonForCrM();
345
363
  const lowerButtons = [];
@@ -347,6 +365,10 @@ class PublishWizard extends React.PureComponent<IPublishWizardProps, IPublishWiz
347
365
  // publish and skip buttons
348
366
  if (screenIndex === 0) {
349
367
  // publish
368
+
369
+ const btnCopy = fromCrM
370
+ ? `Publish to ${this.state.selectedCreatives.length} Creatives`
371
+ : copy.publish.btnPublish;
350
372
  lowerButtons.push(
351
373
  <Button
352
374
  tooltip={copy.publish.btnPublish}
@@ -355,7 +377,7 @@ class PublishWizard extends React.PureComponent<IPublishWizardProps, IPublishWiz
355
377
  key='btn-publish'
356
378
  onClick={() => this.handlePublish()}
357
379
  color='primary'>
358
- {copy.publish.btnPublish}
380
+ {btnCopy}
359
381
  </Button>
360
382
  );
361
383
 
@@ -434,28 +456,44 @@ class PublishWizard extends React.PureComponent<IPublishWizardProps, IPublishWiz
434
456
  }
435
457
 
436
458
  private renderPublish() {
459
+ const { fromCrM, story } = this.props;
437
460
  const { publishing } = this.props.publishData;
438
- const disabledForCrM = this.shouldDisablePublishButtonForCrM();
439
461
  const { publishError } = this.state;
440
- const errorCopy = publishError
441
- ? publishError
442
- : disabledForCrM
443
- ? copy.publish.noVariablesError
444
- : null;
462
+ const errorCopyForCrM = this.getErrorCopyForCrMPublish();
463
+ const errorCopy = publishError ? publishError : errorCopyForCrM ? errorCopyForCrM : null;
445
464
 
446
465
  const error = errorCopy ? (
447
466
  <p className='publish-error'>
448
467
  <span className='icon'>{ICON_EXCLAIMATION_TRIANGLE}</span>&nbsp;&nbsp;{errorCopy}
449
468
  </p>
450
469
  ) : null;
451
- return (
452
- <div>
453
- <h2>{copy.publish.publishStepTitle}</h2>
454
- <HRule />
455
- <p>{publishing ? copy.publish.publishInProgress : copy.publish.publishStepDesc}</p>
456
- {error}
457
- </div>
458
- );
470
+
471
+ if (fromCrM) {
472
+ return (
473
+ <CrMPublishUI
474
+ selectedCreatives={this.state.selectedCreatives}
475
+ onUpdateSelectedCreatives={(c) => this.setState({ selectedCreatives: c })}
476
+ onError={(e) => this.setState({ publishError: e })}
477
+ publishing={publishing}
478
+ error={error}
479
+ creativeLibraryId={story.creativeLibraryId}
480
+ projectId={story.id}
481
+ api={this.props.api}
482
+ crmBaseUrl={this.props.creativeManagerBaseUrl}
483
+ />
484
+ );
485
+ } else {
486
+ return (
487
+ <div>
488
+ <h2>{copy.publish.publishStepTitle}</h2>
489
+ <HRule />
490
+ <p>
491
+ {publishing ? copy.publish.publishInProgress : copy.publish.publishStepDesc}
492
+ </p>
493
+ {error}
494
+ </div>
495
+ );
496
+ }
459
497
  }
460
498
 
461
499
  private renderDistributionOptions() {
@@ -0,0 +1,29 @@
1
+ import * as React from 'react';
2
+ import CheckboxField from '../../checkbox-field/CheckboxField';
3
+ import { canBePublishedTo } from './CrMPublishUI';
4
+ interface ICrMPublishCreativeSelectCellProps {
5
+ cell: any;
6
+ onSelectChange: (creativeId: string, selected: boolean) => void;
7
+ selectedCreatives: string[];
8
+ }
9
+
10
+ export const CrMPublishCreativeSelectCell: React.FC<ICrMPublishCreativeSelectCellProps> = (
11
+ props
12
+ ) => {
13
+ const { cell, onSelectChange, selectedCreatives } = props;
14
+ const creativeId = cell.row.original.creativeId;
15
+ const isSelected = selectedCreatives.includes(creativeId);
16
+ const showCheckbox = canBePublishedTo(cell.row.original.approvalStatus);
17
+ if (showCheckbox) {
18
+ return (
19
+ <CheckboxField
20
+ label=''
21
+ propagate={false}
22
+ value={isSelected}
23
+ onChange={(selected) => onSelectChange(creativeId, selected)}
24
+ />
25
+ );
26
+ } else {
27
+ return null;
28
+ }
29
+ };
@@ -0,0 +1,33 @@
1
+ import * as React from 'react';
2
+ import CheckboxField from '../../checkbox-field/CheckboxField';
3
+ import { canBePublishedTo } from './CrMPublishUI';
4
+
5
+ interface ICrMPublishCreativeSelectHeaderProps {
6
+ onSelectChange: (selected: boolean) => void;
7
+ selectedCreatives: string[];
8
+ creativeConfig: any[];
9
+ }
10
+
11
+ export const CrMPublishCreativeSelectHeader: React.FC<ICrMPublishCreativeSelectHeaderProps> = (
12
+ props
13
+ ) => {
14
+ const { onSelectChange, selectedCreatives, creativeConfig } = props;
15
+
16
+ const publishableCreatives = creativeConfig.filter((creative) =>
17
+ canBePublishedTo(creative.approvalStatus)
18
+ );
19
+
20
+ const publishableCreativeIds = publishableCreatives.map((creative) => creative.creativeId);
21
+ const allPublishableSelected =
22
+ publishableCreativeIds.length > 0 &&
23
+ publishableCreativeIds.every((id) => selectedCreatives.includes(id));
24
+
25
+ return (
26
+ <CheckboxField
27
+ label=''
28
+ propagate={false}
29
+ value={allPublishableSelected}
30
+ onChange={(selected) => onSelectChange(selected)}
31
+ />
32
+ );
33
+ };
@@ -0,0 +1,27 @@
1
+ import * as React from 'react';
2
+ import { renderTooltip, renderTooltipProps } from '../../Tooltip';
3
+ import { canBePublishedTo } from './CrMPublishUI';
4
+ import * as copy from '../../../constants/copy';
5
+
6
+ interface ICrMPublishNameCellProps {
7
+ cell: any;
8
+ }
9
+
10
+ export const CrMPublishNameCell: React.FC<ICrMPublishNameCellProps> = (props) => {
11
+ const { cell } = props;
12
+ const canBePublished = canBePublishedTo(cell.row.original.approvalStatus);
13
+ const tooltipId = `publish-name-${cell.row.original.creativeId}`;
14
+
15
+ if (canBePublished) {
16
+ return <div className={`crm-publish-name`}>{cell.row.original.creativeName}</div>;
17
+ } else {
18
+ return (
19
+ <div
20
+ className={`crm-publish-name disabled`}
21
+ {...renderTooltipProps(tooltipId, copy.publish.disabledCreativeTooltip)}>
22
+ {cell.row.original.creativeName}
23
+ {renderTooltip(tooltipId, copy.publish.disabledCreativeTooltip)}
24
+ </div>
25
+ );
26
+ }
27
+ };
@@ -0,0 +1,27 @@
1
+ import * as React from 'react';
2
+ import { Button } from '../../..';
3
+ import { ICON_EYE } from '../../../constants/icons';
4
+
5
+ interface ICrMPublishPreviewCellProps {
6
+ cell: any;
7
+ crmBaseUrl: string;
8
+ creativeLibraryId: string;
9
+ }
10
+
11
+ export const CrMPublishPreviewCell: React.FC<ICrMPublishPreviewCellProps> = (props) => {
12
+ const { cell, crmBaseUrl, creativeLibraryId } = props;
13
+ const creativeId = cell.row.original.creativeId;
14
+ const previewUrl = `${crmBaseUrl}/library/${creativeLibraryId}/creative/${creativeId}/versions/`;
15
+
16
+ return (
17
+ <a
18
+ href={previewUrl}
19
+ target='_blank'>
20
+ <Button
21
+ style='subtle'
22
+ size='small'>
23
+ {ICON_EYE}
24
+ </Button>
25
+ </a>
26
+ );
27
+ };
@@ -0,0 +1,13 @@
1
+ import * as React from 'react';
2
+ import { CREATIVE_STATUS_LABELS } from '../../../constants/publish';
3
+
4
+ interface ICrMPublishStatusCellProps {
5
+ cell: any;
6
+ }
7
+
8
+ export const CrMPublishStatusCell: React.FC<ICrMPublishStatusCellProps> = (props) => {
9
+ const { cell } = props;
10
+ return (
11
+ CREATIVE_STATUS_LABELS[cell.row.original.approvalStatus] || cell.row.original.approvalStatus
12
+ );
13
+ };
@@ -0,0 +1,195 @@
1
+ import * as React from 'react';
2
+ import * as copy from '../../../constants/copy';
3
+ import { DataTable, HRule, Button, IImposiumAPI, TextField } from '../../..';
4
+ import { useEffect, useState, useCallback } from 'react';
5
+ import { ICON_SEARCH } from '../../../constants/icons';
6
+ import { CREATIVE_STATUSES_TO_PUBLISH } from '../../../constants/publish';
7
+ import { CrMPublishStatusCell } from './CrMPublishStatusCell';
8
+ import { CrMPublishPreviewCell } from './CrMPublishPreviewCell';
9
+ import { CrMPublishNameCell } from './CrMPublishNameCell';
10
+ import { CrMPublishCreativeSelectHeader } from './CrMPublishCreativeSelectHeader';
11
+ import { CrMPublishCreativeSelectCell } from './CrMPublishCreativeSelectCell';
12
+
13
+ interface ICrmPublishUIProps {
14
+ publishing: boolean;
15
+ error: React.ReactNode;
16
+ api: IImposiumAPI;
17
+ creativeLibraryId: string;
18
+ projectId: string;
19
+ crmBaseUrl: string;
20
+ selectedCreatives: string[];
21
+ onUpdateSelectedCreatives: (selectedCreatives) => void;
22
+ onError: (error: string) => void;
23
+ }
24
+
25
+ export const CrMPublishUI: React.FC<ICrmPublishUIProps> = (props) => {
26
+ const {
27
+ publishing,
28
+ error,
29
+ crmBaseUrl,
30
+ creativeLibraryId,
31
+ projectId,
32
+ api,
33
+ selectedCreatives,
34
+ onUpdateSelectedCreatives
35
+ } = props;
36
+ const [nameFilter, setNameFilter] = useState('');
37
+ const [creativeConfig, setCreativeConfig] = useState([]);
38
+
39
+ const nameSearch = (
40
+ <TextField
41
+ className='creative-name'
42
+ buttons={[
43
+ <Button
44
+ key='btn-search'
45
+ style='subtle'
46
+ size='small'>
47
+ {ICON_SEARCH}
48
+ </Button>
49
+ ]}
50
+ width='150px'
51
+ value={nameFilter}
52
+ onChange={(value) => setNameFilter(value)}
53
+ />
54
+ );
55
+
56
+ const onSelectChange = useCallback(
57
+ (creativeId: string, selected: boolean) => {
58
+ const previouslySelected = [...selectedCreatives];
59
+ if (selected) {
60
+ onUpdateSelectedCreatives([...previouslySelected, creativeId]);
61
+ } else {
62
+ onUpdateSelectedCreatives(previouslySelected.filter((id) => id !== creativeId));
63
+ }
64
+ },
65
+ [selectedCreatives, onUpdateSelectedCreatives]
66
+ );
67
+
68
+ const onSelectAllChange = useCallback(
69
+ (selected: boolean) => {
70
+ if (selected) {
71
+ const publishableCreativeIds = creativeConfig
72
+ .filter((creative) => canBePublishedTo(creative.approvalStatus))
73
+ .map((creative) => creative.creativeId);
74
+ onUpdateSelectedCreatives(publishableCreativeIds);
75
+ } else {
76
+ onUpdateSelectedCreatives([]);
77
+ }
78
+ },
79
+ [nameFilter, creativeConfig]
80
+ );
81
+
82
+ const COLUMN_CONFIG = [
83
+ {
84
+ accessor: 'selected',
85
+ width: 25,
86
+ disableResize: true,
87
+ disableSortBy: true,
88
+ Header: () => (
89
+ <CrMPublishCreativeSelectHeader
90
+ onSelectChange={onSelectAllChange}
91
+ selectedCreatives={selectedCreatives}
92
+ creativeConfig={creativeConfig}
93
+ />
94
+ ),
95
+ Cell: (cell: any) => (
96
+ <CrMPublishCreativeSelectCell
97
+ cell={cell}
98
+ onSelectChange={onSelectChange}
99
+ selectedCreatives={selectedCreatives}
100
+ />
101
+ )
102
+ },
103
+ {
104
+ accessor: 'creativeName',
105
+ Header: 'Creative Name',
106
+ width: 250,
107
+ minWidth: 250,
108
+ maxWidth: 250,
109
+ disableSortBy: true,
110
+ Cell: (cell: any) => <CrMPublishNameCell cell={cell} />,
111
+ Search: nameSearch
112
+ },
113
+ {
114
+ accessor: 'creativeId',
115
+ Header: 'ID',
116
+ width: 75,
117
+ minWidth: 75,
118
+ maxWidth: 75,
119
+ disableSortBy: true
120
+ },
121
+ {
122
+ accessor: 'numberOfVersions',
123
+ Header: 'Versions',
124
+ width: 75,
125
+ minWidth: 75,
126
+ maxWidth: 75,
127
+ disableSortBy: true
128
+ },
129
+ {
130
+ accessor: 'approvalStatus',
131
+ Header: 'Status',
132
+ width: 75,
133
+ minWidth: 75,
134
+ maxWidth: 75,
135
+ disableSortBy: true,
136
+ Cell: (cell: any) => <CrMPublishStatusCell cell={cell} />
137
+ },
138
+ {
139
+ accessor: 'preview',
140
+ Header: 'Preview',
141
+ width: 50,
142
+ minWidth: 50,
143
+ maxWidth: 50,
144
+ disableSortBy: true,
145
+ Cell: (cell: any) => (
146
+ <CrMPublishPreviewCell
147
+ cell={cell}
148
+ crmBaseUrl={crmBaseUrl}
149
+ creativeLibraryId={creativeLibraryId}
150
+ />
151
+ )
152
+ }
153
+ ];
154
+
155
+ useEffect(() => {
156
+ api.getCreativesLinkedToProject(projectId)
157
+ .then((res) => {
158
+ setCreativeConfig(res.creatives);
159
+ })
160
+ .catch((err) => {
161
+ const msg = err.response?.data?.error || err.message;
162
+ const errorCopy = copy.publish.errorGettingCreatives.replace('{{ERR}}', msg);
163
+ props.onError(errorCopy);
164
+ });
165
+ }, []);
166
+
167
+ return (
168
+ <div>
169
+ <h2>{copy.publish.publishStepTitleFromCrM}</h2>
170
+ <HRule />
171
+ <p>{publishing ? copy.publish.publishInProgress : ''}</p>
172
+ <DataTable
173
+ showInterstitial={publishing}
174
+ columns={COLUMN_CONFIG}
175
+ data={
176
+ nameFilter
177
+ ? creativeConfig.filter((creative) => {
178
+ return creative.creativeName
179
+ .toLowerCase()
180
+ .includes(nameFilter.toLowerCase());
181
+ })
182
+ : creativeConfig
183
+ }
184
+ hidePaginator={true}
185
+ itemsPerPage={1000}
186
+ tightRows={true}
187
+ />
188
+ {error && <p className='publish-error'>{error}</p>}
189
+ </div>
190
+ );
191
+ };
192
+
193
+ export const canBePublishedTo = (approvalStatus: string) => {
194
+ return CREATIVE_STATUSES_TO_PUBLISH.includes(approvalStatus);
195
+ };
@@ -127,6 +127,8 @@ export const compositions = {
127
127
  };
128
128
 
129
129
  export const publish = {
130
+ errorGettingCreatives: 'Error getting creatives linked to project: {{ERR}}',
131
+ disabledCreativeTooltip: 'You cannot publish a project to a creative with Approved status.',
130
132
  uploadAsAssets: 'Upload as Assets',
131
133
  noVariablesError:
132
134
  'No variables found on the project. Cannot proceed with publishing to Creative Manager until at least one variable is added to the project.',
@@ -147,6 +149,7 @@ export const publish = {
147
149
 
148
150
  // publish
149
151
  publishStepTitle: 'STEP 1: Publish your Project',
152
+ publishStepTitleFromCrM: 'STEP 1: Publish your Project to selected Creatives',
150
153
  publishStepDesc:
151
154
  "Your project needs to be published before your changes can be seen. If you haven't made any changes since the last time you published, you can skip to the next step.",
152
155
 
@@ -60,6 +60,7 @@ import { faJs } from '@fortawesome/free-brands-svg-icons/faJs';
60
60
  import { faDownload } from '@fortawesome/free-solid-svg-icons/faDownload';
61
61
  import { faUpload } from '@fortawesome/free-solid-svg-icons/faUpload';
62
62
  import { faCode } from '@fortawesome/free-solid-svg-icons/faCode';
63
+ import { faEye } from '@fortawesome/free-solid-svg-icons/faEye';
63
64
  import {
64
65
  faArrowDown,
65
66
  faArrowLeft,
@@ -232,3 +233,5 @@ export const ICON_FILE_ERROR = <FontAwesomeIcon icon={faCircleExclamation} />;
232
233
  export const ICON_FILE_ADD = <FontAwesomeIcon icon={faFileCirclePlus} />;
233
234
 
234
235
  export const ICON_FILE_REPLACE = <FontAwesomeIcon icon={faFilePen} />;
236
+
237
+ export const ICON_EYE = <FontAwesomeIcon icon={faEye} />;