@imposium-hub/components 2.4.0-4 → 2.4.0-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 (152) hide show
  1. package/dist/cjs/components/Tooltip.d.ts +2 -2
  2. package/dist/cjs/components/Tooltip.js +4 -7
  3. package/dist/cjs/components/Tooltip.js.map +1 -1
  4. package/dist/cjs/components/advanced-number-field/AdvancedNumberField.d.ts +1 -1
  5. package/dist/cjs/components/anchor-field/AnchorField.d.ts +1 -1
  6. package/dist/cjs/components/assets/AssetField.js +2 -2
  7. package/dist/cjs/components/assets/AssetField.js.map +1 -1
  8. package/dist/cjs/components/assets/AssetsTableGlobalCell.js +1 -1
  9. package/dist/cjs/components/assets/AssetsTableGlobalCell.js.map +1 -1
  10. package/dist/cjs/components/assets/AssetsTableNameCell.js +2 -1
  11. package/dist/cjs/components/assets/AssetsTableNameCell.js.map +1 -1
  12. package/dist/cjs/components/assets/AssetsTableRateCell.js.map +1 -1
  13. package/dist/cjs/components/assets/AssetsTableTypeFilter.js +2 -2
  14. package/dist/cjs/components/assets/AssetsTableTypeFilter.js.map +1 -1
  15. package/dist/cjs/components/assets/AssetsUploadMenu.js +159 -34
  16. package/dist/cjs/components/assets/AssetsUploadMenu.js.map +1 -1
  17. package/dist/cjs/components/button-group-field/ButtonGroupField.d.ts +1 -1
  18. package/dist/cjs/components/checkbox-field/CheckboxField.d.ts +1 -1
  19. package/dist/cjs/components/color-field/ColorField.d.ts +1 -1
  20. package/dist/cjs/components/color-field/ColorField.js +2 -2
  21. package/dist/cjs/components/color-field/ColorField.js.map +1 -1
  22. package/dist/cjs/components/copy-prop-id-button/CopyPropIdButton.d.ts +12 -0
  23. package/dist/cjs/components/copy-prop-id-button/CopyPropIdButton.js +75 -0
  24. package/dist/cjs/components/copy-prop-id-button/CopyPropIdButton.js.map +1 -0
  25. package/dist/cjs/components/data-table/DataTable.js +2 -2
  26. package/dist/cjs/components/data-table/DataTable.js.map +1 -1
  27. package/dist/cjs/components/list-field/ListField.d.ts +1 -1
  28. package/dist/cjs/components/number-field/NumberField.d.ts +1 -1
  29. package/dist/cjs/components/publish-wizard/PublishWizard.js +5 -1
  30. package/dist/cjs/components/publish-wizard/PublishWizard.js.map +1 -1
  31. package/dist/cjs/components/publish-wizard/publish/EmailWorkflow.js +28 -5
  32. package/dist/cjs/components/publish-wizard/publish/EmailWorkflow.js.map +1 -1
  33. package/dist/cjs/components/select-field/SelectField.d.ts +1 -1
  34. package/dist/cjs/components/select-field/SelectField.js +4 -0
  35. package/dist/cjs/components/select-field/SelectField.js.map +1 -1
  36. package/dist/cjs/components/slider-field/SliderField.d.ts +1 -1
  37. package/dist/cjs/components/smpte-field/SMPTEField.d.ts +1 -1
  38. package/dist/cjs/components/story-previewer/StoryPreviewer.js +7 -2
  39. package/dist/cjs/components/story-previewer/StoryPreviewer.js.map +1 -1
  40. package/dist/cjs/components/text-area-field/TextAreaField.d.ts +1 -1
  41. package/dist/cjs/components/text-field/TextField.d.ts +1 -1
  42. package/dist/cjs/constants/copy.d.ts +2 -0
  43. package/dist/cjs/constants/copy.js +5 -3
  44. package/dist/cjs/constants/copy.js.map +1 -1
  45. package/dist/cjs/index.d.ts +4 -2
  46. package/dist/cjs/index.js +6 -3
  47. package/dist/cjs/index.js.map +1 -1
  48. package/dist/cjs/redux/actions/asset-uploads.d.ts +6 -11
  49. package/dist/cjs/redux/actions/asset-uploads.js +262 -182
  50. package/dist/cjs/redux/actions/asset-uploads.js.map +1 -1
  51. package/dist/cjs/redux/reducers/asset-uploads.js +10 -24
  52. package/dist/cjs/redux/reducers/asset-uploads.js.map +1 -1
  53. package/dist/cjs/services/API.d.ts +2 -2
  54. package/dist/cjs/services/API.js +2 -1
  55. package/dist/cjs/services/API.js.map +1 -1
  56. package/dist/cjs/utils/assets.d.ts +1 -2
  57. package/dist/cjs/utils/assets.js.map +1 -1
  58. package/dist/esm/components/Tooltip.d.ts +2 -2
  59. package/dist/esm/components/Tooltip.js +4 -4
  60. package/dist/esm/components/Tooltip.js.map +1 -1
  61. package/dist/esm/components/advanced-number-field/AdvancedNumberField.d.ts +1 -1
  62. package/dist/esm/components/anchor-field/AnchorField.d.ts +1 -1
  63. package/dist/esm/components/assets/AssetField.js +2 -2
  64. package/dist/esm/components/assets/AssetField.js.map +1 -1
  65. package/dist/esm/components/assets/AssetsTableGlobalCell.js +1 -1
  66. package/dist/esm/components/assets/AssetsTableGlobalCell.js.map +1 -1
  67. package/dist/esm/components/assets/AssetsTableNameCell.js +2 -1
  68. package/dist/esm/components/assets/AssetsTableNameCell.js.map +1 -1
  69. package/dist/esm/components/assets/AssetsTableRateCell.js.map +1 -1
  70. package/dist/esm/components/assets/AssetsTableTypeFilter.js +2 -2
  71. package/dist/esm/components/assets/AssetsTableTypeFilter.js.map +1 -1
  72. package/dist/esm/components/assets/AssetsUploadMenu.js +138 -34
  73. package/dist/esm/components/assets/AssetsUploadMenu.js.map +1 -1
  74. package/dist/esm/components/button-group-field/ButtonGroupField.d.ts +1 -1
  75. package/dist/esm/components/checkbox-field/CheckboxField.d.ts +1 -1
  76. package/dist/esm/components/color-field/ColorField.d.ts +1 -1
  77. package/dist/esm/components/color-field/ColorField.js +2 -2
  78. package/dist/esm/components/color-field/ColorField.js.map +1 -1
  79. package/dist/esm/components/copy-prop-id-button/CopyPropIdButton.d.ts +12 -0
  80. package/dist/esm/components/copy-prop-id-button/CopyPropIdButton.js +24 -0
  81. package/dist/esm/components/copy-prop-id-button/CopyPropIdButton.js.map +1 -0
  82. package/dist/esm/components/data-table/DataTable.js +2 -2
  83. package/dist/esm/components/data-table/DataTable.js.map +1 -1
  84. package/dist/esm/components/list-field/ListField.d.ts +1 -1
  85. package/dist/esm/components/number-field/NumberField.d.ts +1 -1
  86. package/dist/esm/components/publish-wizard/PublishWizard.js +5 -1
  87. package/dist/esm/components/publish-wizard/PublishWizard.js.map +1 -1
  88. package/dist/esm/components/publish-wizard/publish/EmailWorkflow.js +28 -5
  89. package/dist/esm/components/publish-wizard/publish/EmailWorkflow.js.map +1 -1
  90. package/dist/esm/components/select-field/SelectField.d.ts +1 -1
  91. package/dist/esm/components/select-field/SelectField.js +3 -0
  92. package/dist/esm/components/select-field/SelectField.js.map +1 -1
  93. package/dist/esm/components/slider-field/SliderField.d.ts +1 -1
  94. package/dist/esm/components/smpte-field/SMPTEField.d.ts +1 -1
  95. package/dist/esm/components/story-previewer/StoryPreviewer.js +7 -2
  96. package/dist/esm/components/story-previewer/StoryPreviewer.js.map +1 -1
  97. package/dist/esm/components/text-area-field/TextAreaField.d.ts +1 -1
  98. package/dist/esm/components/text-field/TextField.d.ts +1 -1
  99. package/dist/esm/constants/copy.d.ts +2 -0
  100. package/dist/esm/constants/copy.js +5 -3
  101. package/dist/esm/constants/copy.js.map +1 -1
  102. package/dist/esm/index.d.ts +4 -2
  103. package/dist/esm/index.js +4 -2
  104. package/dist/esm/index.js.map +1 -1
  105. package/dist/esm/redux/actions/asset-uploads.d.ts +6 -11
  106. package/dist/esm/redux/actions/asset-uploads.js +224 -167
  107. package/dist/esm/redux/actions/asset-uploads.js.map +1 -1
  108. package/dist/esm/redux/reducers/asset-uploads.js +15 -47
  109. package/dist/esm/redux/reducers/asset-uploads.js.map +1 -1
  110. package/dist/esm/services/API.d.ts +2 -2
  111. package/dist/esm/services/API.js +2 -1
  112. package/dist/esm/services/API.js.map +1 -1
  113. package/dist/esm/utils/assets.d.ts +1 -2
  114. package/dist/esm/utils/assets.js.map +1 -1
  115. package/dist/styles.css +151 -2
  116. package/dist/styles.less +280 -74
  117. package/less/components/assets.less +237 -63
  118. package/less/components/button.less +7 -1
  119. package/less/components/data-table.less +17 -11
  120. package/less/components/publish-wizard.less +20 -0
  121. package/less/components/story-previewer.less +1 -0
  122. package/package.json +6 -6
  123. package/src/components/Tooltip.tsx +9 -9
  124. package/src/components/advanced-number-field/AdvancedNumberField.tsx +1 -1
  125. package/src/components/anchor-field/AnchorField.tsx +1 -1
  126. package/src/components/assets/AssetField.tsx +3 -8
  127. package/src/components/assets/AssetsTableGlobalCell.tsx +15 -0
  128. package/src/components/assets/AssetsTableNameCell.tsx +2 -1
  129. package/src/components/assets/AssetsTableRateCell.tsx +0 -1
  130. package/src/components/assets/AssetsTableTypeFilter.tsx +7 -8
  131. package/src/components/assets/AssetsUploadMenu.tsx +278 -100
  132. package/src/components/button-group-field/ButtonGroupField.tsx +1 -1
  133. package/src/components/checkbox-field/CheckboxField.tsx +1 -1
  134. package/src/components/color-field/ColorField.tsx +3 -3
  135. package/src/components/copy-prop-id-button/CopyPropIdButton.tsx +44 -0
  136. package/src/components/data-table/DataTable.tsx +2 -2
  137. package/src/components/list-field/ListField.tsx +1 -1
  138. package/src/components/number-field/NumberField.tsx +1 -1
  139. package/src/components/publish-wizard/PublishWizard.tsx +16 -9
  140. package/src/components/publish-wizard/publish/EmailWorkflow.tsx +42 -10
  141. package/src/components/select-field/SelectField.tsx +4 -1
  142. package/src/components/slider-field/SliderField.tsx +1 -1
  143. package/src/components/smpte-field/SMPTEField.tsx +1 -1
  144. package/src/components/story-previewer/StoryPreviewer.tsx +10 -6
  145. package/src/components/text-area-field/TextAreaField.tsx +1 -1
  146. package/src/components/text-field/TextField.tsx +1 -1
  147. package/src/constants/copy.ts +5 -3
  148. package/src/index.ts +6 -8
  149. package/src/redux/actions/asset-uploads.ts +307 -206
  150. package/src/redux/reducers/asset-uploads.ts +17 -47
  151. package/src/services/API.ts +7 -2
  152. package/src/utils/assets.ts +1 -2
@@ -28,12 +28,7 @@ interface IAssetFieldProps {
28
28
  tooltip: string;
29
29
  onChange: (asset: any) => any;
30
30
  updateFilters: (filters: any) => any;
31
- uploadAssets: (
32
- api: any,
33
- files: File[],
34
- storyId?: string,
35
- bindToOverlay?: (f: any) => any
36
- ) => any;
31
+ uploadAssets: (api: any, files: File[], bindToOverlay?: (f: any) => any) => any;
37
32
  accepts?: string | string[];
38
33
  labelPosition?: string;
39
34
  onError?: (message: string) => void;
@@ -108,14 +103,14 @@ class AssetField extends React.PureComponent<IAssetFieldProps, IAssetFieldState>
108
103
  }
109
104
 
110
105
  private onFileDrop = (i: any, monitor: any): void => {
111
- const { accepts, storyId, api } = this.props;
106
+ const { accepts, api } = this.props;
112
107
  if (monitor) {
113
108
  const { files } = monitor.getItem();
114
109
 
115
110
  if (mimetypeConformsToOverlay(accepts, files[0])) {
116
111
  this.setState({ assetUploading: true });
117
112
 
118
- this.props.uploadAssets(api, [files[0]], storyId, (f: any) => {
113
+ this.props.uploadAssets(api, [files[0]], (f: any) => {
119
114
  this.setState({ assetName: f.name, error: false }, () => {
120
115
  this.setState({ assetUploading: false });
121
116
  this.props.onChange(f);
@@ -0,0 +1,15 @@
1
+ import * as React from 'react';
2
+ import { ICON_GLOBE } from '../../constants/icons';
3
+
4
+ interface IAssetsTableGlobalCell {
5
+ cell: any; // React table cell wrapper
6
+ }
7
+
8
+ const AssetsTableGlobalCell: React.FC<IAssetsTableGlobalCell> = (p: IAssetsTableGlobalCell) => {
9
+ return (
10
+ <div className='asset-global-cell'>{p.cell.row.original.story_id ? null : ICON_GLOBE}</div>
11
+ );
12
+ };
13
+
14
+ const AssetsTableGlobalCellMemoized = React.memo(AssetsTableGlobalCell);
15
+ export default AssetsTableGlobalCellMemoized;
@@ -6,6 +6,7 @@ import { connect } from 'react-redux';
6
6
  import { bindActionCreators } from 'redux';
7
7
  import { IImposiumAPI } from '../../services/API';
8
8
  import { DeterminateLoader } from '../determinate-loader/DeterminateLoader';
9
+ import { assets as copy } from '../../constants/copy';
9
10
 
10
11
  interface IAssetsTableNameCell {
11
12
  cell: any;
@@ -52,7 +53,7 @@ const AssetsTableNameCell: React.FC<IAssetsTableNameCell> = (props: IAssetsTable
52
53
  text={name}
53
54
  />
54
55
  ) : (
55
- <span>Preparing asset...</span>
56
+ <span>{copy.uploads.preparePhase}</span>
56
57
  );
57
58
  return loader;
58
59
  } else {
@@ -4,7 +4,6 @@ import { ASSET_TYPES } from '../../constants/assets';
4
4
  interface IAssetsTableRateCell {
5
5
  cell: any;
6
6
  }
7
-
8
7
  const AssetsTableRateCell: React.FC<IAssetsTableRateCell> = (props: IAssetsTableRateCell) => {
9
8
  const {
10
9
  cell: {
@@ -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
  };
@@ -1,17 +1,11 @@
1
1
  import * as React from 'react';
2
2
  import { assets as copy } from '../../constants/copy';
3
3
  import CheckboxField from '../checkbox-field/CheckboxField';
4
- import { DeterminateLoader } from '../determinate-loader/DeterminateLoader';
5
4
  import {
6
- toggleAssignToStory,
7
5
  cancelAssetUpload,
8
- toggleTagFileName,
9
- setDelimiter,
10
- toggleTagDelimiter,
11
- toggleManualTagging,
12
- addManualTag,
13
- deleteManualTag,
14
- deleteManualTags
6
+ uploadingAsset,
7
+ updateUploadTags,
8
+ cancelNonUploadedAssets
15
9
  } from '../../redux/actions/asset-uploads';
16
10
  import { bindActionCreators } from 'redux';
17
11
  import { connect } from 'react-redux';
@@ -24,27 +18,58 @@ import AssetsTableTagsPivot from './AssetsTableTagsPivot';
24
18
  import Tag from '../tag/Tag';
25
19
  import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
26
20
  import { faEraser } from '@fortawesome/free-solid-svg-icons';
21
+ import { ICON_TIMES, ICON_UPLOAD } from '../../constants/icons';
22
+ import AssetsTableDropzone from './AssetsTableDropzone';
27
23
 
28
24
  interface IAssetsUploadMenuProps {
25
+ editor: any;
29
26
  assetUploads: any;
30
27
  assetTags: string[];
31
28
  api: any;
32
- editor: any;
33
- toggleAutoTag: (toggle: boolean) => any;
34
- toggleTagFileName: (toggle: boolean) => any;
35
- toggleAssignToStory: (toggle: boolean) => any;
36
- toggleTagDelimiter: (togglle: boolean) => any;
37
- setDelimiter: (delimiter: string) => any;
38
- toggleManualTagging: (togglle: boolean) => any;
39
- addManualTag: (tag: string) => any;
40
- deleteManualTag: (tag: string) => any;
41
- deleteManualTags: () => void;
42
29
  cancelAssetUpload: (fileName: string, api: IImposiumAPI) => any;
30
+ cancelNonUploadedAssets: (api: IImposiumAPI) => any;
31
+ updateEditorConfig(c): void;
32
+ uploadingAsset: (api: IImposiumAPI) => void;
33
+ updateUploadTags: () => void;
34
+ onDrop: (i, m) => any;
35
+ show: boolean;
36
+ onMenuHover: (o) => void;
37
+ toggleRef?: any;
38
+ onOutsideClick: (...args) => any;
39
+ tableHover: boolean;
43
40
  }
44
41
 
45
- class AssetsUploadMenu extends React.PureComponent<IAssetsUploadMenuProps> {
42
+ interface IAssetsUploadMenuState {
43
+ assetOver: boolean;
44
+ }
45
+
46
+ class AssetsUploadMenu extends React.PureComponent<IAssetsUploadMenuProps, IAssetsUploadMenuState> {
47
+ private menuRef: any = null;
48
+
49
+ private clickHandler: any = (e) => this.detectOutsideClick(e);
50
+
46
51
  constructor(props: IAssetsUploadMenuProps) {
47
52
  super(props);
53
+
54
+ this.state = {
55
+ assetOver: false
56
+ };
57
+
58
+ this.menuRef = React.createRef();
59
+ }
60
+
61
+ public componentDidUpdate(prevProps: IAssetsUploadMenuProps) {
62
+ if (this.props.show && !prevProps.show) {
63
+ window.addEventListener('mousedown', this.clickHandler);
64
+ }
65
+
66
+ if (!this.props.show && prevProps.show) {
67
+ window.removeEventListener('mousedown', this.clickHandler);
68
+ }
69
+ }
70
+
71
+ public componentWillUnmount(): void {
72
+ window.removeEventListener('mousedown', this.clickHandler);
48
73
  }
49
74
 
50
75
  private handleCancelAssetUpload(fileName: string) {
@@ -52,82 +77,181 @@ class AssetsUploadMenu extends React.PureComponent<IAssetsUploadMenuProps> {
52
77
  this.props.cancelAssetUpload(fileName, api);
53
78
  }
54
79
 
80
+ private uploadFileHandler() {
81
+ const { api } = this.props;
82
+ this.props.uploadingAsset(api);
83
+ this.props.updateEditorConfig({ showUploadsDropdown: false });
84
+ }
85
+
86
+ private cancelUploadHandler(remove: boolean) {
87
+ const { api } = this.props;
88
+ if (!remove) {
89
+ this.props.cancelNonUploadedAssets(api);
90
+ }
91
+ this.props.updateEditorConfig({ showUploadsDropdown: false });
92
+ }
93
+
94
+ private uploadsSetting(state) {
95
+ const currState = this.props.editor.assetUploads;
96
+
97
+ const newState = { ...currState, ...state };
98
+ this.props.updateEditorConfig({
99
+ assetUploads: newState
100
+ });
101
+ this.props.updateUploadTags();
102
+ }
103
+
104
+ private deleteManualTag(tag) {
105
+ const { manualTags } = this.props.editor.assetUploads;
106
+ const updatedManualTags = manualTags.filter((t: string) => t !== tag);
107
+ this.uploadsSetting({ manualTags: updatedManualTags });
108
+ }
109
+
110
+ private addManualTag(tag) {
111
+ const { manualTags } = this.props.editor.assetUploads;
112
+ const updatedManualTags = manualTags ? manualTags : [];
113
+ updatedManualTags.push(tag);
114
+ this.uploadsSetting({ manualTags: updatedManualTags });
115
+ }
116
+
117
+ private checkHover(monitor) {
118
+ const isOver = monitor.isOver();
119
+ if (isOver !== this.state.assetOver) {
120
+ this.setState({ assetOver: isOver }, () => this.props.onMenuHover(isOver));
121
+ }
122
+ }
123
+
124
+ private detectOutsideClick = (e: any): void => {
125
+ const { toggleRef } = this.props;
126
+ const { target } = e;
127
+
128
+ const isResizing = target.classList.contains('Resizer') ? true : false;
129
+ const clickInside =
130
+ this.menuRef.current && this.menuRef.current.contains(target) ? true : false;
131
+ const clickOnToggle =
132
+ toggleRef && toggleRef.current && toggleRef.current.contains(target) ? true : false;
133
+
134
+ if (!isResizing && !clickInside && !clickOnToggle) {
135
+ this.cancelRender(true);
136
+ }
137
+ };
138
+
139
+ private cancelRender = (forced: boolean = false): void => {
140
+ const { onOutsideClick } = this.props;
141
+
142
+ window.removeEventListener('mousedown', this.clickHandler);
143
+
144
+ if (forced) {
145
+ onOutsideClick();
146
+ }
147
+ };
148
+
55
149
  public render() {
56
150
  const {
57
- assetUploads: {
58
- uploads,
59
- assignToStory,
60
- tagByFileName,
61
- tagByDelimiter,
62
- delimiter,
63
- tagManually,
64
- manualTags
151
+ assetUploads: { uploads },
152
+ editor: {
153
+ fromCrM,
154
+ showUploadsMenu,
155
+ assetUploads: {
156
+ tagByDelimiter,
157
+ delimiter,
158
+ assignToStory,
159
+ tagByFileName,
160
+ tagManually,
161
+ manualTags
162
+ }
65
163
  },
66
- assetTags,
67
- editor: { fromCrM }
164
+ assetTags
68
165
  } = this.props;
166
+ const disable = uploads.length > 0 ? false : true;
167
+
69
168
  let uploadsListInner;
169
+ const uploading = [];
70
170
  if (uploads.length > 0) {
71
171
  uploadsListInner = uploads.map((u: any) => {
72
- const { filename, percent } = u;
73
- const loader =
74
- percent < 100 ? (
75
- <DeterminateLoader progress={u.percent} />
76
- ) : (
77
- <span>{copy.uploads.preparePhase}</span>
172
+ const { filename, percent, tags } = u;
173
+
174
+ if (percent === 0) {
175
+ const closeButton = (
176
+ <Button
177
+ key='btn-cancel'
178
+ onClick={() => this.handleCancelAssetUpload(filename)}
179
+ style='subtle'
180
+ size='small'>
181
+ {ICON_TIMES}
182
+ </Button>
78
183
  );
79
- const closeButton = percent < 100 && (
80
- <Button
81
- key='btn-cancel'
82
- onClick={() => this.handleCancelAssetUpload(filename)}
83
- style='subtle'
84
- size='small'>
85
- {copy.uploads.cancelButton}
86
- </Button>
87
- );
88
-
89
- return (
90
- <div
91
- className='ongoing-upload'
92
- key={filename}>
93
- <div className='ongoing-upload-inner'>
94
- <div className='upload-filename'>{filename}</div>
95
- {closeButton}
184
+
185
+ const fileTags = tags.map((tag: string) => (
186
+ <Tag
187
+ key={tag}
188
+ copy={tag}
189
+ colorize={AssetsTableTagsPivot.COLORIZE_TAGS}
190
+ />
191
+ ));
192
+ return (
193
+ <div
194
+ className='ongoing-upload'
195
+ key={filename}>
196
+ <div className='ongoing-upload-inner'>
197
+ <input
198
+ className='upload-filename'
199
+ value={filename}
200
+ readOnly
201
+ />
202
+ <div className='tags-column'>{fileTags}</div>
203
+ {closeButton}
204
+ </div>
96
205
  </div>
97
- {loader}
98
- </div>
99
- );
206
+ );
207
+ } else {
208
+ uploading.push(true);
209
+ }
100
210
  });
101
211
  } else {
102
212
  uploadsListInner = <div className='no-ongoing-uploads'>{copy.uploads.noUploads}</div>;
103
213
  }
104
214
 
215
+ if (uploading.length === uploads.length) {
216
+ uploadsListInner = <div className='no-ongoing-uploads'>{copy.uploads.noUploads}</div>;
217
+ }
218
+
105
219
  const delimiterSelector = tagByDelimiter && (
106
220
  <SelectField
107
221
  width='35%'
108
222
  options={DELIMITER_OPTIONS}
109
223
  value={delimiter}
110
- onChange={(c) => this.props.setDelimiter(c)}
224
+ onChange={(c) => {
225
+ this.uploadsSetting({ delimiter: c });
226
+ }}
111
227
  />
112
228
  );
229
+
113
230
  const tagsArray = [...new Set(manualTags)];
231
+
114
232
  const tagsMarkup = tagsArray.map((tag: string) => (
115
233
  <Tag
116
234
  key={tag}
117
235
  copy={tag}
118
236
  colorize={AssetsTableTagsPivot.COLORIZE_TAGS}
119
- removeHandler={() => this.props.deleteManualTag(tag)}
237
+ removeHandler={() => {
238
+ this.deleteManualTag(tag);
239
+ }}
120
240
  />
121
241
  ));
242
+
122
243
  const removeTagsBtn =
123
244
  tagsArray.length > 0 ? (
124
245
  <Button
125
246
  tooltip='Remove All Tags'
126
247
  style='sublte'
127
- onClick={() => this.props.deleteManualTags()}>
248
+ onClick={() => {
249
+ this.uploadsSetting({ manualTags: [] });
250
+ }}>
128
251
  <FontAwesomeIcon icon={faEraser} />
129
252
  </Button>
130
253
  ) : null;
254
+
131
255
  const tagsColumn = tagManually && (
132
256
  <div className='tags-column'>
133
257
  <TextField
@@ -136,48 +260,107 @@ class AssetsUploadMenu extends React.PureComponent<IAssetsUploadMenuProps> {
136
260
  suggestions={assetTags}
137
261
  label={copy.tags.add}
138
262
  width={AssetsTableTagsPivot.ADD_TAG_INPUT_WIDTH}
139
- doSubmit={(t) => this.props.addManualTag(t)}
263
+ doSubmit={(t) => {
264
+ this.addManualTag(t);
265
+ }}
140
266
  />
141
267
  {tagsMarkup}
142
268
  {removeTagsBtn}
143
269
  </div>
144
270
  );
145
271
 
272
+ const modifier = this.state.assetOver ? 'asset-over' : '';
273
+ const show = this.props.show ? 'show' : '';
274
+ const tableHover = this.props.tableHover ? 'table-hover' : '';
275
+ const width = document.getElementsByClassName('assetUploads')[0]?.clientWidth;
276
+
146
277
  return (
147
- <div className='uploads-menu'>
148
- <div className='uploads-controls'>
149
- <CheckboxField
150
- width='50%'
151
- label={copy.uploads.autoTagDelimiter}
152
- value={tagByDelimiter}
153
- onChange={() => this.props.toggleTagDelimiter(!tagByDelimiter)}
154
- />
155
- {delimiterSelector}
156
- <CheckboxField
157
- width='50%'
158
- label={copy.uploads.manualTagging}
159
- value={tagManually}
160
- onChange={() => this.props.toggleManualTagging(!tagManually)}
161
- />
162
- <CheckboxField
163
- width='50%'
164
- label={copy.uploads.autoTagFilname}
165
- value={tagByFileName}
166
- onChange={() => this.props.toggleTagFileName(!tagByFileName)}
167
- />
168
- {!fromCrM && (
278
+ <AssetsTableDropzone
279
+ className={`uploads-dropzone ${show} ${tableHover} ${modifier}`}
280
+ onDrop={(i, m) => {
281
+ this.props.onDrop(i, m);
282
+ }}
283
+ onExternalCollect={(o) => this.checkHover(o)}>
284
+ <div className='overlay'>
285
+ <p style={{ display: this.state.assetOver ? 'block' : 'none' }}>
286
+ {copy.dropAsset}
287
+ </p>
288
+ </div>
289
+ <div
290
+ className='uploads-menu'
291
+ style={{ width }}
292
+ ref={this.menuRef}>
293
+ <div className='uploads-controls'>
294
+ <CheckboxField
295
+ width='50%'
296
+ label={copy.uploads.autoTagDelimiter}
297
+ value={tagByDelimiter}
298
+ onChange={() =>
299
+ this.uploadsSetting({ tagByDelimiter: !tagByDelimiter })
300
+ }
301
+ />
302
+ {delimiterSelector}
169
303
  <CheckboxField
170
304
  width='50%'
171
- label={copy.uploads.assignToProjectInput}
172
- info={copy.uploads.assignToProjectInfo}
173
- value={assignToStory}
174
- onChange={() => this.props.toggleAssignToStory(!assignToStory)}
305
+ label={copy.uploads.manualTagging}
306
+ value={tagManually}
307
+ onChange={() => this.uploadsSetting({ tagManually: !tagManually })}
175
308
  />
176
- )}
309
+ <CheckboxField
310
+ width='50%'
311
+ label={copy.uploads.autoTagFilname}
312
+ value={tagByFileName}
313
+ onChange={() => this.uploadsSetting({ tagByFileName: !tagByFileName })}
314
+ />
315
+ {!fromCrM && (
316
+ <CheckboxField
317
+ width='50%'
318
+ label={copy.uploads.assignToProjectInput}
319
+ info={copy.uploads.assignToProjectInfo}
320
+ value={!assignToStory}
321
+ onChange={() =>
322
+ this.uploadsSetting({ assignToStory: !assignToStory })
323
+ }
324
+ />
325
+ )}
326
+ </div>
327
+ {tagsColumn}
328
+ <div className='uploads-list'>{uploadsListInner}</div>
329
+ <div className='uploads-confirm'>
330
+ <CheckboxField
331
+ label={`Don't show again`}
332
+ value={!showUploadsMenu}
333
+ onChange={() =>
334
+ this.props.updateEditorConfig({
335
+ showUploadsMenu: !showUploadsMenu
336
+ })
337
+ }
338
+ />
339
+ <Button
340
+ key='cancel-upload'
341
+ onClick={() => this.cancelUploadHandler(disable)}
342
+ customStyles={{
343
+ color: 'black'
344
+ }}
345
+ style='bold'
346
+ color='secondary'
347
+ width='60px'
348
+ size='small'>
349
+ Cancel
350
+ </Button>
351
+ <Button
352
+ key='upload-file'
353
+ disabled={disable}
354
+ onClick={() => this.uploadFileHandler()}
355
+ style='bold'
356
+ color='primary'
357
+ width='80px'
358
+ size='small'>
359
+ Upload {ICON_UPLOAD}
360
+ </Button>
361
+ </div>
177
362
  </div>
178
- {tagsColumn}
179
- <div className='uploads-list'>{uploadsListInner}</div>
180
- </div>
363
+ </AssetsTableDropzone>
181
364
  );
182
365
  }
183
366
  }
@@ -185,15 +368,10 @@ class AssetsUploadMenu extends React.PureComponent<IAssetsUploadMenuProps> {
185
368
  const mapDispatchToProps = (dispatch): any => {
186
369
  return bindActionCreators(
187
370
  {
188
- toggleAssignToStory,
189
- toggleTagFileName,
190
371
  cancelAssetUpload,
191
- toggleTagDelimiter,
192
- setDelimiter,
193
- toggleManualTagging,
194
- addManualTag,
195
- deleteManualTag,
196
- deleteManualTags
372
+ cancelNonUploadedAssets,
373
+ uploadingAsset,
374
+ updateUploadTags
197
375
  },
198
376
  dispatch
199
377
  );
@@ -202,8 +380,8 @@ const mapDispatchToProps = (dispatch): any => {
202
380
  const mapStateToProps = (state): any => {
203
381
  return {
204
382
  assetUploads: state.assetUploads,
205
- editor: state.editor,
206
- assetTags: state.assetTags
383
+ assetTags: state.assetTags,
384
+ editor: state.editor
207
385
  };
208
386
  };
209
387
 
@@ -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;
@@ -1,11 +1,11 @@
1
1
  import * as React from 'react';
2
2
  import FieldWrapper from '../field-wrapper/FieldWrapper';
3
3
  import { IToolTipConfig } from '../Tooltip';
4
- import { SketchPicker } from 'react-color';
4
+ 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;
@@ -29,7 +29,7 @@ class ColorField extends React.PureComponent<IColorFieldProps, IColorFieldState>
29
29
 
30
30
  private picker: any;
31
31
 
32
- private transparentBg = `url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAMUlEQVQ4T2NkYGAQYcAP3uCTZhw1gGGYhAGBZIA/nYDCgBDAm9BGDWAAJyRCgLaBCAAgXwixzAS0pgAAAABJRU5ErkJggg==") left center`;
32
+ private transparentBg = `url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAADBJREFUOE9jPHPmzH8GPMDY2BifNAPjqAHDIgz+//+PNx2cPXsWfzoYNYCBceiHAQD1OVMJc/dYeAAAAABJRU5ErkJggg==") left center`;
33
33
 
34
34
  constructor(props) {
35
35
  super(props);
@@ -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;