@imposium-hub/components 2.2.44-4 → 2.2.44-6

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 (124) hide show
  1. package/dist/cjs/Util.d.ts +1 -0
  2. package/dist/cjs/Util.js +8 -1
  3. package/dist/cjs/Util.js.map +1 -1
  4. package/dist/cjs/components/Tooltip.d.ts +2 -2
  5. package/dist/cjs/components/Tooltip.js +4 -7
  6. package/dist/cjs/components/Tooltip.js.map +1 -1
  7. package/dist/cjs/components/advanced-number-field/AdvancedNumberField.d.ts +1 -1
  8. package/dist/cjs/components/anchor-field/AnchorField.d.ts +1 -1
  9. package/dist/cjs/components/assets/AssetsTableDurationCell.js +1 -4
  10. package/dist/cjs/components/assets/AssetsTableDurationCell.js.map +1 -1
  11. package/dist/cjs/components/assets/AssetsTableTypeFilter.js +2 -2
  12. package/dist/cjs/components/assets/AssetsTableTypeFilter.js.map +1 -1
  13. package/dist/cjs/components/assets/AssetsUploadMenu.js.map +1 -1
  14. package/dist/cjs/components/button-group-field/ButtonGroupField.d.ts +1 -1
  15. package/dist/cjs/components/checkbox-field/CheckboxField.d.ts +1 -1
  16. package/dist/cjs/components/color-field/ColorField.d.ts +1 -1
  17. package/dist/cjs/components/context-menu/ContextMenu.js +8 -4
  18. package/dist/cjs/components/context-menu/ContextMenu.js.map +1 -1
  19. package/dist/cjs/components/copy-prop-id-button/CopyPropIdButton.d.ts +12 -0
  20. package/dist/cjs/components/copy-prop-id-button/CopyPropIdButton.js +75 -0
  21. package/dist/cjs/components/copy-prop-id-button/CopyPropIdButton.js.map +1 -0
  22. package/dist/cjs/components/header/Header.js +1 -1
  23. package/dist/cjs/components/header/Header.js.map +1 -1
  24. package/dist/cjs/components/list-field/ListField.d.ts +1 -1
  25. package/dist/cjs/components/number-field/NumberField.d.ts +1 -1
  26. package/dist/cjs/components/publish-wizard/PublishWizard.js +4 -0
  27. package/dist/cjs/components/publish-wizard/PublishWizard.js.map +1 -1
  28. package/dist/cjs/components/publish-wizard/publish/EmailWorkflow.js +28 -5
  29. package/dist/cjs/components/publish-wizard/publish/EmailWorkflow.js.map +1 -1
  30. package/dist/cjs/components/select-field/SelectField.d.ts +1 -1
  31. package/dist/cjs/components/select-field/SelectField.js +4 -0
  32. package/dist/cjs/components/select-field/SelectField.js.map +1 -1
  33. package/dist/cjs/components/slider-field/SliderField.d.ts +1 -1
  34. package/dist/cjs/components/smpte-field/SMPTEField.d.ts +1 -1
  35. package/dist/cjs/components/text-area-field/TextAreaField.d.ts +1 -1
  36. package/dist/cjs/components/text-field/TextField.d.ts +1 -1
  37. package/dist/cjs/constants/copy.d.ts +1 -0
  38. package/dist/cjs/constants/copy.js +1 -0
  39. package/dist/cjs/constants/copy.js.map +1 -1
  40. package/dist/cjs/index.d.ts +2 -1
  41. package/dist/cjs/index.js +3 -1
  42. package/dist/cjs/index.js.map +1 -1
  43. package/dist/cjs/redux/actions/asset-uploads.js +16 -19
  44. package/dist/cjs/redux/actions/asset-uploads.js.map +1 -1
  45. package/dist/esm/Util.d.ts +1 -0
  46. package/dist/esm/Util.js +6 -0
  47. package/dist/esm/Util.js.map +1 -1
  48. package/dist/esm/components/Tooltip.d.ts +2 -2
  49. package/dist/esm/components/Tooltip.js +4 -4
  50. package/dist/esm/components/Tooltip.js.map +1 -1
  51. package/dist/esm/components/advanced-number-field/AdvancedNumberField.d.ts +1 -1
  52. package/dist/esm/components/anchor-field/AnchorField.d.ts +1 -1
  53. package/dist/esm/components/assets/AssetsTableDurationCell.js +2 -5
  54. package/dist/esm/components/assets/AssetsTableDurationCell.js.map +1 -1
  55. package/dist/esm/components/assets/AssetsTableTypeFilter.js +2 -2
  56. package/dist/esm/components/assets/AssetsTableTypeFilter.js.map +1 -1
  57. package/dist/esm/components/assets/AssetsUploadMenu.js.map +1 -1
  58. package/dist/esm/components/button-group-field/ButtonGroupField.d.ts +1 -1
  59. package/dist/esm/components/checkbox-field/CheckboxField.d.ts +1 -1
  60. package/dist/esm/components/color-field/ColorField.d.ts +1 -1
  61. package/dist/esm/components/context-menu/ContextMenu.js +7 -3
  62. package/dist/esm/components/context-menu/ContextMenu.js.map +1 -1
  63. package/dist/esm/components/copy-prop-id-button/CopyPropIdButton.d.ts +12 -0
  64. package/dist/esm/components/copy-prop-id-button/CopyPropIdButton.js +24 -0
  65. package/dist/esm/components/copy-prop-id-button/CopyPropIdButton.js.map +1 -0
  66. package/dist/esm/components/header/Header.js +1 -1
  67. package/dist/esm/components/header/Header.js.map +1 -1
  68. package/dist/esm/components/list-field/ListField.d.ts +1 -1
  69. package/dist/esm/components/number-field/NumberField.d.ts +1 -1
  70. package/dist/esm/components/publish-wizard/PublishWizard.js +4 -0
  71. package/dist/esm/components/publish-wizard/PublishWizard.js.map +1 -1
  72. package/dist/esm/components/publish-wizard/publish/EmailWorkflow.js +28 -5
  73. package/dist/esm/components/publish-wizard/publish/EmailWorkflow.js.map +1 -1
  74. package/dist/esm/components/select-field/SelectField.d.ts +1 -1
  75. package/dist/esm/components/select-field/SelectField.js +3 -0
  76. package/dist/esm/components/select-field/SelectField.js.map +1 -1
  77. package/dist/esm/components/slider-field/SliderField.d.ts +1 -1
  78. package/dist/esm/components/smpte-field/SMPTEField.d.ts +1 -1
  79. package/dist/esm/components/text-area-field/TextAreaField.d.ts +1 -1
  80. package/dist/esm/components/text-field/TextField.d.ts +1 -1
  81. package/dist/esm/constants/copy.d.ts +1 -0
  82. package/dist/esm/constants/copy.js +1 -0
  83. package/dist/esm/constants/copy.js.map +1 -1
  84. package/dist/esm/index.d.ts +2 -1
  85. package/dist/esm/index.js +2 -1
  86. package/dist/esm/index.js.map +1 -1
  87. package/dist/esm/redux/actions/asset-uploads.js +15 -18
  88. package/dist/esm/redux/actions/asset-uploads.js.map +1 -1
  89. package/dist/styles.css +21 -0
  90. package/dist/styles.less +25 -1
  91. package/less/components/button.less +7 -1
  92. package/less/components/publish-wizard.less +20 -0
  93. package/package.json +4 -4
  94. package/src/Util.ts +10 -0
  95. package/src/components/Tooltip.tsx +9 -9
  96. package/src/components/advanced-number-field/AdvancedNumberField.tsx +1 -1
  97. package/src/components/anchor-field/AnchorField.tsx +1 -1
  98. package/src/components/assets/AssetsTableDurationCell.tsx +2 -5
  99. package/src/components/assets/AssetsTableTypeFilter.tsx +7 -8
  100. package/src/components/assets/AssetsUploadMenu.tsx +1 -2
  101. package/src/components/button-group-field/ButtonGroupField.tsx +1 -1
  102. package/src/components/checkbox-field/CheckboxField.tsx +1 -1
  103. package/src/components/color-field/ColorField.tsx +1 -1
  104. package/src/components/context-menu/ContextMenu.tsx +16 -11
  105. package/src/components/copy-prop-id-button/CopyPropIdButton.tsx +44 -0
  106. package/src/components/header/Header.tsx +1 -1
  107. package/src/components/list-field/ListField.tsx +1 -1
  108. package/src/components/number-field/NumberField.tsx +1 -1
  109. package/src/components/publish-wizard/PublishWizard.tsx +15 -7
  110. package/src/components/publish-wizard/publish/EmailWorkflow.tsx +42 -10
  111. package/src/components/select-field/SelectField.tsx +4 -1
  112. package/src/components/slider-field/SliderField.tsx +1 -1
  113. package/src/components/smpte-field/SMPTEField.tsx +1 -1
  114. package/src/components/text-area-field/TextAreaField.tsx +1 -1
  115. package/src/components/text-field/TextField.tsx +1 -1
  116. package/src/constants/copy.ts +1 -0
  117. package/src/index.ts +3 -1
  118. package/src/redux/actions/asset-uploads.ts +16 -18
  119. /package/dist/cjs/components/dropdown/{dropdown.stories.d.ts → Dropdown.stories.d.ts} +0 -0
  120. /package/dist/cjs/components/dropdown/{dropdown.stories.js → Dropdown.stories.js} +0 -0
  121. /package/dist/cjs/components/dropdown/{dropdown.stories.js.map → Dropdown.stories.js.map} +0 -0
  122. /package/dist/esm/components/dropdown/{dropdown.stories.d.ts → Dropdown.stories.d.ts} +0 -0
  123. /package/dist/esm/components/dropdown/{dropdown.stories.js → Dropdown.stories.js} +0 -0
  124. /package/dist/esm/components/dropdown/{dropdown.stories.js.map → Dropdown.stories.js.map} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@imposium-hub/components",
3
- "version": "2.2.44-4",
3
+ "version": "2.2.44-6",
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",
@@ -34,6 +34,7 @@
34
34
  },
35
35
  "homepage": "https://github.com/NickelMedia/Imposium-Hub-Components#readme",
36
36
  "dependencies": {
37
+ "@imposium-hub/react-color": "^2.19.4",
37
38
  "ansi_up": "^5.1.0",
38
39
  "auth0-js": "^9.11.3",
39
40
  "cogo-toast": "^4.2.3",
@@ -43,7 +44,6 @@
43
44
  "js-cookie": "^2.2.1",
44
45
  "lodash": "^4.17.21",
45
46
  "moment": "^2.29.1",
46
- "@imposium-hub/react-color": "^2.19.4",
47
47
  "react-merge-refs": "^1.1.0",
48
48
  "react-moveable": "^0.26.1",
49
49
  "react-transition-group": "^4.4.5"
@@ -68,7 +68,7 @@
68
68
  "react-resize-detector": "^6.7.1",
69
69
  "react-spinners": "^0.6.1",
70
70
  "react-table": "^7.7.0",
71
- "react-tooltip": "^4.2.21",
71
+ "react-tooltip": "^5.27.0",
72
72
  "smpte-timecode": "^1.2.3"
73
73
  },
74
74
  "devDependencies": {
@@ -118,7 +118,7 @@
118
118
  "react-resize-detector": "^6.7.1",
119
119
  "react-spinners": "^0.6.1",
120
120
  "react-table": "^7.7.0",
121
- "react-tooltip": "^4.2.21",
121
+ "react-tooltip": "^5.27.1",
122
122
  "run-sequence": "^2.2.1",
123
123
  "sb": "^6.4.22",
124
124
  "smpte-timecode": "^1.2.3",
package/src/Util.ts CHANGED
@@ -347,6 +347,16 @@ export const formattedTime = (millis: number) => {
347
347
  return `${minutes < 10 ? '0' : ''}${minutes}:${seconds < 10 ? '0' : ''}${seconds}`;
348
348
  };
349
349
 
350
+ export const formatAudioDuration = (duration: number) => {
351
+ const hours: any = Math.floor(duration / 3600);
352
+ const minutes: any = Math.floor((duration % 3600) / 60);
353
+ const seconds: any = duration % 60;
354
+
355
+ return `${hours < 10 ? '0' : ''}${hours}:${minutes < 10 ? '0' : ''}${minutes}:${
356
+ seconds < 10 ? '0' : ''
357
+ }${seconds.toFixed(2)}`;
358
+ };
359
+
350
360
  export const s3Url = (cloudFrontUrl: string, distro, origin): string => {
351
361
  if (cloudFrontUrl) {
352
362
  return cloudFrontUrl.replace(distro, origin);
@@ -1,10 +1,10 @@
1
1
  import * as React from 'react';
2
2
  import * as ReactDOM from 'react-dom';
3
- import ReactTooltip, { Place } from 'react-tooltip';
3
+ import { Tooltip as ReactTooltip, PlacesType } from 'react-tooltip';
4
4
 
5
5
  export interface IToolTipConfig {
6
6
  content: string;
7
- position?: Place;
7
+ position?: PlacesType;
8
8
  theme?: string;
9
9
  }
10
10
 
@@ -12,8 +12,8 @@ export const renderTooltipProps = (id: string, config: IToolTipConfig | string):
12
12
  if (config) {
13
13
  const content = typeof config === 'object' ? config.content : config;
14
14
  return {
15
- 'data-tip': content,
16
- 'data-for': id
15
+ 'data-tooltip-content': content,
16
+ 'data-tooltip-id': id
17
17
  };
18
18
  } else {
19
19
  return {};
@@ -25,7 +25,7 @@ export const renderTooltip = (id: string, config: IToolTipConfig | string): any
25
25
 
26
26
  if (config && tooltipLayer) {
27
27
  let theme = 'light';
28
- let place: Place = 'top';
28
+ let place: PlacesType = 'top';
29
29
 
30
30
  if (typeof config === 'object') {
31
31
  theme = config.theme ? config.theme : 'light';
@@ -34,12 +34,12 @@ export const renderTooltip = (id: string, config: IToolTipConfig | string): any
34
34
 
35
35
  const tooltipComponent = (
36
36
  <ReactTooltip
37
- place={place}
38
- offset={{ top: 0, right: 0, bottom: 0, left: 0 }}
37
+ data-tooltip-place={place}
38
+ data-tooltip-offset={{ top: 0, right: 0, bottom: 0, left: 0 }}
39
39
  id={id}
40
40
  className={`imposium-button-tooltip-${theme}`}
41
- delayShow={1000}
42
- effect='solid'
41
+ delayShow={500}
42
+ noArrow={true}
43
43
  />
44
44
  );
45
45
 
@@ -5,7 +5,7 @@ import { IToolTipConfig } from '../Tooltip';
5
5
 
6
6
  interface IAdvancedNumberFieldProps {
7
7
  buttons?: any;
8
- label?: string;
8
+ label?: any;
9
9
  placeholder?: string;
10
10
  readOnly?: boolean;
11
11
  value: number;
@@ -21,7 +21,7 @@ interface IAnchorFieldProps {
21
21
  labelPosition?: string;
22
22
  tooltip?: IToolTipConfig | string;
23
23
  width?: string | number;
24
- label?: string;
24
+ label?: any;
25
25
  labelWidth?: string | number;
26
26
  }
27
27
 
@@ -1,6 +1,6 @@
1
1
  import * as React from 'react';
2
2
  import { ASSET_TYPES } from '../../constants/assets';
3
- import { getDuration } from '../../Util';
3
+ import { formatAudioDuration, getDuration } from '../../Util';
4
4
 
5
5
  interface IAssetsTableDurationCell {
6
6
  cell: any;
@@ -30,10 +30,7 @@ const AssetsTableDurationCell: React.FC<IAssetsTableDurationCell> = (
30
30
  }
31
31
 
32
32
  if (type === ASSET_TYPES.AUDIO) {
33
- const date = new Date(null);
34
- date.setSeconds(original.duration);
35
- const timestamp = date.toISOString().slice(11, 19);
36
- duration = `${timestamp}.x`;
33
+ duration = formatAudioDuration(original.duration);
37
34
  }
38
35
 
39
36
  if (duration !== null && duration !== undefined) {
@@ -62,15 +62,14 @@ class AssetsTableTypeFilter extends React.PureComponent<
62
62
  buttonRef={this.typeFilterRef}
63
63
  onClick={() => this.setState({ openMenu: !openMenu })}>
64
64
  <AssetsTypeIcon type={type || 'filter'} />
65
-
66
- <ImposiumDropdown
67
- show={openMenu}
68
- position='bottomleft'
69
- toggleRef={this.typeFilterRef}
70
- onOutsideClick={() => this.setState({ openMenu: false })}>
71
- {filterButtons}
72
- </ImposiumDropdown>
73
65
  </Button>
66
+ <ImposiumDropdown
67
+ show={openMenu}
68
+ position='bottomleft'
69
+ toggleRef={this.typeFilterRef}
70
+ onOutsideClick={() => this.setState({ openMenu: false })}>
71
+ {filterButtons}
72
+ </ImposiumDropdown>
74
73
  </div>
75
74
  );
76
75
  };
@@ -98,7 +98,6 @@ class AssetsUploadMenu extends React.PureComponent<IAssetsUploadMenuProps, IAsse
98
98
  this.props.updateEditorConfig({
99
99
  assetUploads: newState
100
100
  });
101
-
102
101
  this.props.updateUploadTags();
103
102
  }
104
103
 
@@ -167,7 +166,6 @@ class AssetsUploadMenu extends React.PureComponent<IAssetsUploadMenuProps, IAsse
167
166
 
168
167
  let uploadsListInner;
169
168
  const uploading = [];
170
-
171
169
  if (uploads.length > 0) {
172
170
  uploadsListInner = uploads.map((u: any) => {
173
171
  const { filename, percent, tags } = u;
@@ -273,6 +271,7 @@ class AssetsUploadMenu extends React.PureComponent<IAssetsUploadMenuProps, IAsse
273
271
  const modifier = this.state.assetOver ? 'asset-over' : '';
274
272
  const show = this.props.show ? 'show' : '';
275
273
  const tableHover = this.props.tableHover ? 'table-hover' : '';
274
+
276
275
  return (
277
276
  <AssetsTableDropzone
278
277
  className={`uploads-dropzone ${show} ${tableHover} ${modifier}`}
@@ -12,7 +12,7 @@ interface IButtonGroupOption {
12
12
  }
13
13
 
14
14
  interface IButtonGroupFieldProps {
15
- label?: string;
15
+ label?: any;
16
16
  width?: string | number;
17
17
  value: string | boolean;
18
18
  options: IButtonGroupOption[];
@@ -4,7 +4,7 @@ import { IToolTipConfig } from '../Tooltip';
4
4
  import { ICON_CHECK } from '../../constants/icons';
5
5
 
6
6
  interface ICheckboxFieldProps {
7
- label?: string;
7
+ label?: any;
8
8
  value: boolean;
9
9
  width?: string | number;
10
10
  tooltip?: IToolTipConfig | string;
@@ -5,7 +5,7 @@ import { SketchPicker } from '@imposium-hub/react-color';
5
5
 
6
6
  interface IColorFieldProps {
7
7
  buttons?: any;
8
- label?: string;
8
+ label?: any;
9
9
  placeholder?: string;
10
10
  readOnly?: boolean;
11
11
  value: string;
@@ -19,6 +19,8 @@ const ContextMenu = ({
19
19
  }) => {
20
20
  const contextMenuEl = useRef(null);
21
21
  const [isVisible, setVisible] = useState(false);
22
+ const [top, setTop] = useState('');
23
+ const [left, setLeft] = useState('');
22
24
  const [clientPosition, setClientPosition] = useState(null);
23
25
 
24
26
  const showMenu = (e) => {
@@ -107,8 +109,8 @@ const ContextMenu = ({
107
109
  if (windowInnerHeight < clientY + elemHeight) newClientY = clientY - elemHeight;
108
110
  if (windowInnerWidth < clientX + elemWidth) newClientX = clientX - elemWidth;
109
111
 
110
- contextMenuEl.current.style.top = `${newClientY + 2}px`;
111
- contextMenuEl.current.style.left = `${newClientX + 2}px`;
112
+ setTop(`${newClientY + 2}px`);
113
+ setLeft(`${newClientX + 2}px`);
112
114
 
113
115
  if (onShow) onShow();
114
116
  }
@@ -118,15 +120,18 @@ const ContextMenu = ({
118
120
  React.cloneElement(child, { id })
119
121
  );
120
122
 
121
- const ContextComponent = () => (
122
- <div
123
- className={`contextmenu`}
124
- ref={contextMenuEl}
125
- onMouseLeave={handleMouseLeave}
126
- {...attributes}>
127
- {childrenWithProps}
128
- </div>
129
- );
123
+ const ContextComponent = () => {
124
+ return (
125
+ <div
126
+ className={`contextmenu`}
127
+ ref={contextMenuEl}
128
+ style={{ top, left }}
129
+ onMouseLeave={handleMouseLeave}
130
+ {...attributes}>
131
+ {childrenWithProps}
132
+ </div>
133
+ );
134
+ };
130
135
 
131
136
  const PortalContextComponent = () =>
132
137
  ReactDOM.createPortal(<ContextComponent />, document.querySelector(appendTo));
@@ -0,0 +1,44 @@
1
+ import React from 'react';
2
+ import { ICON_CLIPBOARD } from '../../constants/icons';
3
+ import Button from '../button/Button';
4
+ import { compositions as copy } from '../../constants/copy';
5
+
6
+ interface ICopyPropIdButtonProps {
7
+ copyPropId: string;
8
+ onNotification?(e): void;
9
+ onError?(e): void;
10
+ }
11
+
12
+ class CopyPropIdButton extends React.PureComponent<ICopyPropIdButtonProps, undefined> {
13
+ private clickHandler = () => this.copyPropId();
14
+
15
+ private copyPropId() {
16
+ const { onNotification, onError, copyPropId } = this.props;
17
+ navigator.clipboard.writeText(copyPropId).then(
18
+ () => {
19
+ if (onNotification) {
20
+ onNotification(`Property ID copied to clipboard.`);
21
+ }
22
+ },
23
+ () => {
24
+ if (onError) {
25
+ onError('Error copying property ID to clipboard.');
26
+ }
27
+ }
28
+ );
29
+ }
30
+
31
+ public render() {
32
+ return (
33
+ <Button
34
+ tooltip={copy.tooltipPropId}
35
+ onClick={this.clickHandler}
36
+ size='small'
37
+ style='subtle'>
38
+ {ICON_CLIPBOARD}
39
+ </Button>
40
+ );
41
+ }
42
+ }
43
+
44
+ export default CopyPropIdButton;
@@ -557,7 +557,7 @@ class ImposiumHeader extends React.PureComponent<IHeaderProps, IHeaderState> {
557
557
  {storyToggle}
558
558
  {accountDropdownToggle}
559
559
  <a
560
- href='https://flashtalkingus.atlassian.net/wiki/spaces/CPPW/pages/3296723007/IMPOSIUM+Dynamic+Video+Tool'
560
+ href='https://support.flashtalking.com/hc/en-us/sections/25515903148819-Imposium'
561
561
  target='_blank'>
562
562
  <div className='btn-help'>{ICON_HELP}</div>
563
563
  </a>
@@ -10,7 +10,7 @@ import { ICON_PLUS } from '../../constants/icons';
10
10
  interface IListFieldProps {
11
11
  buttons?: any;
12
12
  disabled?: boolean;
13
- label?: string;
13
+ label?: any;
14
14
  options: any;
15
15
  placeholder?: string;
16
16
  tooltip?: IToolTipConfig | string;
@@ -4,7 +4,7 @@ import { IToolTipConfig } from '../Tooltip';
4
4
 
5
5
  interface INumberFieldProps {
6
6
  buttons?: any;
7
- label?: string;
7
+ label?: any;
8
8
  placeholder?: string;
9
9
  readOnly?: boolean;
10
10
  value: number;
@@ -66,6 +66,7 @@ interface IPublishWizardProps {
66
66
  renderBatch: (batchId: string, postRenderActions?: any) => any;
67
67
  publishData: any;
68
68
  onDeleteBatch?: (batchId: string) => any;
69
+ onBackBtn?: () => void;
69
70
  }
70
71
 
71
72
  export interface ICredential {
@@ -349,13 +350,20 @@ class PublishWizard extends React.PureComponent<IPublishWizardProps, IPublishWiz
349
350
  size={'large'}
350
351
  key='btn-back'
351
352
  onClick={() =>
352
- this.setState({
353
- screenIndex: backIndex,
354
- next: false,
355
- nextStep: false,
356
- error: false,
357
- done: false
358
- })
353
+ this.setState(
354
+ {
355
+ screenIndex: backIndex,
356
+ next: false,
357
+ nextStep: false,
358
+ error: false,
359
+ done: false
360
+ },
361
+ () => {
362
+ if (this.props.onBackBtn) {
363
+ this.props.onBackBtn();
364
+ }
365
+ }
366
+ )
359
367
  }
360
368
  color='primary'>
361
369
  {copy.publish.btnBack}
@@ -488,12 +488,7 @@ class EmailWorkflow extends React.PureComponent<IEmailWorkflowProps, IEmailWorkf
488
488
  }
489
489
 
490
490
  public renderLabel() {
491
- const {
492
- isExport,
493
- batchJobs,
494
- publishDataset,
495
- batchesList: { error }
496
- } = this.props;
491
+ const { isExport, batchJobs, publishDataset } = this.props;
497
492
  const { renderedBatch, selectedBatchId, uploading, uploadComplete } = this.state;
498
493
 
499
494
  if (
@@ -512,10 +507,6 @@ class EmailWorkflow extends React.PureComponent<IEmailWorkflowProps, IEmailWorkf
512
507
  );
513
508
  }
514
509
 
515
- if (batchJobs.failed && error[selectedBatchId]) {
516
- return <>{error[selectedBatchId].error}</>;
517
- }
518
-
519
510
  if (uploading) {
520
511
  const uploadingCopy = isExport
521
512
  ? copy.publish.importingData
@@ -670,9 +661,14 @@ class EmailWorkflow extends React.PureComponent<IEmailWorkflowProps, IEmailWorkf
670
661
  batchError,
671
662
  creativeManagerOverrides
672
663
  } = this.state;
664
+
673
665
  const {
674
666
  isExport,
675
667
  batchJobs: { missing, renders, failed },
668
+ batchesList: {
669
+ error,
670
+ selected: { name }
671
+ },
676
672
  isCrM,
677
673
  publishDataset
678
674
  } = this.props;
@@ -776,13 +772,49 @@ class EmailWorkflow extends React.PureComponent<IEmailWorkflowProps, IEmailWorkf
776
772
  const title = publishDataset
777
773
  ? copy.publish.datasetTitle.replace('[dataset_name]', this.props.activeDataset?.name)
778
774
  : copy.publish.emailTitle;
775
+
779
776
  const desc = publishDataset ? '' : copy.publish.emailDesc;
780
777
 
778
+ const showBatchError = () => {
779
+ if (failed && error[selectedBatchId]) {
780
+ let errorMsg: JSX.Element = <></>;
781
+ let errorExpMsg: JSX.Element = <></>;
782
+ if (error[selectedBatchId]) {
783
+ const { experience } = error[selectedBatchId];
784
+ errorMsg = <span className='error-title'>{error[selectedBatchId].error}</span>;
785
+ errorExpMsg = experience?.error ? <div>{experience.error}</div> : <></>;
786
+ }
787
+
788
+ return (
789
+ <div className='batch-job-error'>
790
+ <h2>{`Batch "${name}" stopped due to errors.`}</h2>
791
+ <table>
792
+ <thead></thead>
793
+ <tbody>
794
+ <tr>
795
+ <td>Batch ID:</td>
796
+ <td>{selectedBatchId}</td>
797
+ </tr>
798
+ <tr>
799
+ <td>First Error:</td>
800
+ <td>
801
+ {errorMsg}
802
+ <br />
803
+ {errorExpMsg}
804
+ </td>
805
+ </tr>
806
+ </tbody>
807
+ </table>
808
+ </div>
809
+ );
810
+ }
811
+ };
781
812
  const uploadCSV = (
782
813
  <div>
783
814
  <h2>{title}</h2>
784
815
  <HRule />
785
816
  <p>{desc}</p>
817
+ {showBatchError()}
786
818
  <input
787
819
  type='file'
788
820
  style={{ display: 'none' }}
@@ -7,7 +7,7 @@ import { copying } from '../../constants/copy';
7
7
 
8
8
  interface ISelectFieldProps {
9
9
  buttons?: any;
10
- label?: string;
10
+ label?: any;
11
11
  selectRef?: any;
12
12
  options: any;
13
13
  disable?: boolean;
@@ -61,6 +61,9 @@ class SelectField extends React.PureComponent<ISelectFieldProps> {
61
61
  }
62
62
 
63
63
  this.props.onChange(val);
64
+ if (this.props.selectRef?.current) {
65
+ this.props.selectRef.current.blur();
66
+ }
64
67
  }
65
68
 
66
69
  public render() {
@@ -3,7 +3,7 @@ import FieldWrapper from '../field-wrapper/FieldWrapper';
3
3
  import { IToolTipConfig } from '../Tooltip';
4
4
 
5
5
  interface ISliderFieldProps {
6
- label?: string;
6
+ label?: any;
7
7
  value: number;
8
8
  width?: string | number;
9
9
  min: number;
@@ -5,7 +5,7 @@ import { TIMECODE } from '../../constants/timecode';
5
5
  import { getSMPTE } from '../../Util';
6
6
 
7
7
  interface ISMPTEFieldProps {
8
- label?: string;
8
+ label?: any;
9
9
  placeholder?: string;
10
10
  readOnly?: boolean;
11
11
  tooltip?: IToolTipConfig | string;
@@ -9,7 +9,7 @@ interface ITextAreaFieldProps {
9
9
  buttons?: any;
10
10
  controlled?: boolean;
11
11
  disabled?: boolean;
12
- label?: string;
12
+ label?: any;
13
13
  placeholder?: string;
14
14
  readOnly?: boolean;
15
15
  value: string;
@@ -23,7 +23,7 @@ interface ITextFieldProps {
23
23
  disabled?: boolean;
24
24
  submittable?: boolean;
25
25
  focusOnMount?: boolean;
26
- label?: string;
26
+ label?: any;
27
27
  placeholder?: string;
28
28
  readOnly?: boolean;
29
29
  value?: string;
@@ -77,6 +77,7 @@ export const previewer = {
77
77
  };
78
78
 
79
79
  export const compositions = {
80
+ tooltipPropId: 'Copy Property ID',
80
81
  name: 'Name',
81
82
  width: 'Width',
82
83
  height: 'Height',
package/src/index.ts CHANGED
@@ -156,6 +156,7 @@ import AssetsTableRateCell from './components/assets/AssetsTableRateCell';
156
156
  import ContextMenu from './components/context-menu/ContextMenu';
157
157
  import ContextMenuItem from './components/context-menu/ContextMenuItem';
158
158
  import ContextMenuTrigger from './components/context-menu/ContextMenuTrigger';
159
+ import CopyPropIdButton from './components/copy-prop-id-button/CopyPropIdButton';
159
160
  import Submenu from './components/context-menu/SubMenu';
160
161
 
161
162
  export {
@@ -309,5 +310,6 @@ export {
309
310
  ContextMenu,
310
311
  ContextMenuItem,
311
312
  ContextMenuTrigger,
312
- Submenu
313
+ Submenu,
314
+ CopyPropIdButton
313
315
  };
@@ -12,7 +12,7 @@ const assetUploadsActions: any = {
12
12
 
13
13
  const POLL_INTERVAL: number = 5000;
14
14
 
15
- const uploadFiles: File[] = [];
15
+ let uploadFiles: File[] = [];
16
16
  let setBindToOverlay;
17
17
 
18
18
  export const uploadAssets = (
@@ -394,21 +394,23 @@ const pollAssetJobs = (api, ongoingJobs: any[], timeout: number): void => {
394
394
  }, POLL_INTERVAL);
395
395
  };
396
396
 
397
+ const removeUploadHander = (fileName: string, api: IImposiumAPI, dispatch): any => {
398
+ uploadFiles = uploadFiles.filter((f) => f.name !== fileName);
399
+ api.cancelUploadAssets(fileName);
400
+ dispatch({
401
+ type: assetUploadsActions.REMOVE_UPLOAD,
402
+ filename: fileName
403
+ });
404
+ };
405
+
397
406
  export const cancelAssetUpload = (fileName: string, api: IImposiumAPI, assetId: string): any => {
398
407
  return (dispatch) => {
399
- uploadFiles.filter((f) => {
400
- return f.name !== fileName;
401
- });
402
- api.cancelUploadAssets(fileName);
403
408
  if (assetId) {
404
409
  api.deleteAsset(assetId)
405
410
  .then()
406
411
  .catch((e) => console.error(e));
407
412
  }
408
- dispatch({
409
- type: assetUploadsActions.REMOVE_UPLOAD,
410
- filename: fileName
411
- });
413
+ removeUploadHander(fileName, api, dispatch);
412
414
  };
413
415
  };
414
416
 
@@ -418,15 +420,11 @@ export const cancelNonUploadedAssets = (api: IImposiumAPI): any => {
418
420
  assetUploads: { uploads }
419
421
  } = getStore();
420
422
 
421
- if (uploadFiles.length > 0) {
422
- for (const file of uploadFiles) {
423
- const percent = uploads.find((f) => f.filename === file.name).percent;
424
- if (percent === 0) {
425
- api.cancelUploadAssets(file.name);
426
- dispatch({
427
- type: assetUploadsActions.REMOVE_UPLOAD,
428
- filename: file.name
429
- });
423
+ if (uploads.length > 0) {
424
+ for (const file of uploads) {
425
+ const upload = uploads.find((f) => f.filename === file.filename);
426
+ if (upload.percent === 0) {
427
+ removeUploadHander(file.filename, api, dispatch);
430
428
  }
431
429
  }
432
430
  }