@imposium-hub/components 2.2.44-2 → 2.2.44-3

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 (33) hide show
  1. package/dist/cjs/components/assets/AssetsUploadMenu.js +132 -25
  2. package/dist/cjs/components/assets/AssetsUploadMenu.js.map +1 -1
  3. package/dist/cjs/components/color-field/ColorField.js +2 -2
  4. package/dist/cjs/components/color-field/ColorField.js.map +1 -1
  5. package/dist/cjs/constants/copy.d.ts +1 -0
  6. package/dist/cjs/constants/copy.js +2 -1
  7. package/dist/cjs/constants/copy.js.map +1 -1
  8. package/dist/cjs/redux/actions/asset-uploads.d.ts +5 -2
  9. package/dist/cjs/redux/actions/asset-uploads.js +258 -138
  10. package/dist/cjs/redux/actions/asset-uploads.js.map +1 -1
  11. package/dist/cjs/redux/reducers/asset-uploads.js +10 -0
  12. package/dist/cjs/redux/reducers/asset-uploads.js.map +1 -1
  13. package/dist/esm/components/assets/AssetsUploadMenu.js +125 -25
  14. package/dist/esm/components/assets/AssetsUploadMenu.js.map +1 -1
  15. package/dist/esm/components/color-field/ColorField.js +2 -2
  16. package/dist/esm/components/color-field/ColorField.js.map +1 -1
  17. package/dist/esm/constants/copy.d.ts +1 -0
  18. package/dist/esm/constants/copy.js +2 -1
  19. package/dist/esm/constants/copy.js.map +1 -1
  20. package/dist/esm/redux/actions/asset-uploads.d.ts +5 -2
  21. package/dist/esm/redux/actions/asset-uploads.js +221 -131
  22. package/dist/esm/redux/actions/asset-uploads.js.map +1 -1
  23. package/dist/esm/redux/reducers/asset-uploads.js +16 -0
  24. package/dist/esm/redux/reducers/asset-uploads.js.map +1 -1
  25. package/dist/styles.css +81 -2
  26. package/dist/styles.less +154 -62
  27. package/less/components/assets.less +154 -63
  28. package/package.json +4 -4
  29. package/src/components/assets/AssetsUploadMenu.tsx +251 -66
  30. package/src/components/color-field/ColorField.tsx +2 -2
  31. package/src/constants/copy.ts +2 -1
  32. package/src/redux/actions/asset-uploads.ts +299 -152
  33. package/src/redux/reducers/asset-uploads.ts +18 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@imposium-hub/components",
3
- "version": "2.2.44-2",
3
+ "version": "2.2.44-3",
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",
@@ -43,7 +43,7 @@
43
43
  "js-cookie": "^2.2.1",
44
44
  "lodash": "^4.17.21",
45
45
  "moment": "^2.29.1",
46
- "react-color": "^2.18.0",
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"
@@ -55,7 +55,7 @@
55
55
  "@fortawesome/pro-light-svg-icons": "^6.1.1",
56
56
  "@fortawesome/pro-solid-svg-icons": "^6.1.1",
57
57
  "@fortawesome/react-fontawesome": "^0.1.18",
58
- "@imposium-hub/react-textarea-autocomplete": "^4.9.13-1",
58
+ "@imposium-hub/react-textarea-autocomplete": "^4.9.13-5",
59
59
  "axios": "^0.21.1",
60
60
  "hotkeys-js": "^3.6.12",
61
61
  "localforage": "^1.7.3",
@@ -80,7 +80,7 @@
80
80
  "@fortawesome/react-fontawesome": "^0.1.18",
81
81
  "@imposium-hub/eslint-config": "^1.1.0",
82
82
  "@imposium-hub/prettier-config": "^2.1.0",
83
- "@imposium-hub/react-textarea-autocomplete": "^4.9.13-1",
83
+ "@imposium-hub/react-textarea-autocomplete": "^4.9.13-5",
84
84
  "@storybook/addon-actions": "^6.4.22",
85
85
  "@storybook/addon-docs": "^6.4.22",
86
86
  "@storybook/addon-essentials": "^6.4.22",
@@ -1,8 +1,12 @@
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
- import { cancelAssetUpload } from '../../redux/actions/asset-uploads';
4
+ import {
5
+ cancelAssetUpload,
6
+ uploadingAsset,
7
+ updateUploadTags,
8
+ cancelNonUploadedAssets
9
+ } from '../../redux/actions/asset-uploads';
6
10
  import { bindActionCreators } from 'redux';
7
11
  import { connect } from 'react-redux';
8
12
  import Button from '../button/Button';
@@ -14,19 +18,58 @@ import AssetsTableTagsPivot from './AssetsTableTagsPivot';
14
18
  import Tag from '../tag/Tag';
15
19
  import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
16
20
  import { faEraser } from '@fortawesome/free-solid-svg-icons';
21
+ import { ICON_TIMES, ICON_UPLOAD } from '../../constants/icons';
22
+ import AssetsTableDropzone from './AssetsTableDropzone';
17
23
 
18
24
  interface IAssetsUploadMenuProps {
25
+ editor: any;
19
26
  assetUploads: any;
20
27
  assetTags: string[];
21
28
  api: any;
22
29
  cancelAssetUpload: (fileName: string, api: IImposiumAPI) => any;
30
+ cancelNonUploadedAssets: (api: IImposiumAPI) => any;
23
31
  updateEditorConfig(c): void;
24
- editor: any;
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;
40
+ }
41
+
42
+ interface IAssetsUploadMenuState {
43
+ assetOver: boolean;
25
44
  }
26
45
 
27
- class AssetsUploadMenu extends React.PureComponent<IAssetsUploadMenuProps> {
46
+ class AssetsUploadMenu extends React.PureComponent<IAssetsUploadMenuProps, IAssetsUploadMenuState> {
47
+ private menuRef: any = null;
48
+
49
+ private clickHandler: any = (e) => this.detectOutsideClick(e);
50
+
28
51
  constructor(props: IAssetsUploadMenuProps) {
29
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);
30
73
  }
31
74
 
32
75
  private handleCancelAssetUpload(fileName: string) {
@@ -34,6 +77,20 @@ class AssetsUploadMenu extends React.PureComponent<IAssetsUploadMenuProps> {
34
77
  this.props.cancelAssetUpload(fileName, api);
35
78
  }
36
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
+
37
94
  private uploadsSetting(state) {
38
95
  const currState = this.props.editor.assetUploads;
39
96
 
@@ -41,6 +98,8 @@ class AssetsUploadMenu extends React.PureComponent<IAssetsUploadMenuProps> {
41
98
  this.props.updateEditorConfig({
42
99
  assetUploads: newState
43
100
  });
101
+
102
+ this.props.updateUploadTags();
44
103
  }
45
104
 
46
105
  private deleteManualTag(tag) {
@@ -56,10 +115,43 @@ class AssetsUploadMenu extends React.PureComponent<IAssetsUploadMenuProps> {
56
115
  this.uploadsSetting({ manualTags: updatedManualTags });
57
116
  }
58
117
 
118
+ private checkHover(monitor) {
119
+ const isOver = monitor.isOver();
120
+ if (isOver !== this.state.assetOver) {
121
+ this.setState({ assetOver: isOver }, () => this.props.onMenuHover(isOver));
122
+ }
123
+ }
124
+
125
+ private detectOutsideClick = (e: any): void => {
126
+ const { toggleRef } = this.props;
127
+ const { target } = e;
128
+
129
+ const isResizing = target.classList.contains('Resizer') ? true : false;
130
+ const clickInside =
131
+ this.menuRef.current && this.menuRef.current.contains(target) ? true : false;
132
+ const clickOnToggle =
133
+ toggleRef && toggleRef.current && toggleRef.current.contains(target) ? true : false;
134
+
135
+ if (!isResizing && !clickInside && !clickOnToggle) {
136
+ this.cancelRender(true);
137
+ }
138
+ };
139
+
140
+ private cancelRender = (forced: boolean = false): void => {
141
+ const { onOutsideClick } = this.props;
142
+
143
+ window.removeEventListener('mousedown', this.clickHandler);
144
+
145
+ if (forced) {
146
+ onOutsideClick();
147
+ }
148
+ };
149
+
59
150
  public render() {
60
151
  const {
61
152
  assetUploads: { uploads },
62
153
  editor: {
154
+ showUploadsMenu,
63
155
  assetUploads: {
64
156
  tagByDelimiter,
65
157
  delimiter,
@@ -71,68 +163,96 @@ class AssetsUploadMenu extends React.PureComponent<IAssetsUploadMenuProps> {
71
163
  },
72
164
  assetTags
73
165
  } = this.props;
166
+ const disable = uploads.length > 0 ? false : true;
167
+
74
168
  let uploadsListInner;
169
+ const uploading = [];
170
+
75
171
  if (uploads.length > 0) {
76
172
  uploadsListInner = uploads.map((u: any) => {
77
- const { filename, percent } = u;
78
- const loader =
79
- percent < 100 ? (
80
- <DeterminateLoader progress={u.percent} />
81
- ) : (
82
- <span>{copy.uploads.preparePhase}</span>
173
+ const { filename, percent, tags } = u;
174
+
175
+ if (percent === 0) {
176
+ const closeButton = (
177
+ <Button
178
+ key='btn-cancel'
179
+ onClick={() => this.handleCancelAssetUpload(filename)}
180
+ style='subtle'
181
+ size='small'>
182
+ {ICON_TIMES}
183
+ </Button>
83
184
  );
84
- const closeButton = percent < 100 && (
85
- <Button
86
- key='btn-cancel'
87
- onClick={() => this.handleCancelAssetUpload(filename)}
88
- style='subtle'
89
- size='small'>
90
- {copy.uploads.cancelButton}
91
- </Button>
92
- );
93
-
94
- return (
95
- <div
96
- className='ongoing-upload'
97
- key={filename}>
98
- <div className='ongoing-upload-inner'>
99
- <div className='upload-filename'>{filename}</div>
100
- {closeButton}
185
+
186
+ const fileTags = tags.map((tag: string) => (
187
+ <Tag
188
+ key={tag}
189
+ copy={tag}
190
+ colorize={AssetsTableTagsPivot.COLORIZE_TAGS}
191
+ />
192
+ ));
193
+ return (
194
+ <div
195
+ className='ongoing-upload'
196
+ key={filename}>
197
+ <div className='ongoing-upload-inner'>
198
+ <input
199
+ className='upload-filename'
200
+ value={filename}
201
+ readOnly
202
+ />
203
+ <div className='tags-column'>{fileTags}</div>
204
+ {closeButton}
205
+ </div>
101
206
  </div>
102
- {loader}
103
- </div>
104
- );
207
+ );
208
+ } else {
209
+ uploading.push(true);
210
+ }
105
211
  });
106
212
  } else {
107
213
  uploadsListInner = <div className='no-ongoing-uploads'>{copy.uploads.noUploads}</div>;
108
214
  }
109
215
 
216
+ if (uploading.length === uploads.length) {
217
+ uploadsListInner = <div className='no-ongoing-uploads'>{copy.uploads.noUploads}</div>;
218
+ }
219
+
110
220
  const delimiterSelector = tagByDelimiter && (
111
221
  <SelectField
112
222
  width='35%'
113
223
  options={DELIMITER_OPTIONS}
114
224
  value={delimiter}
115
- onChange={(c) => this.uploadsSetting({ delimiter: c })}
225
+ onChange={(c) => {
226
+ this.uploadsSetting({ delimiter: c });
227
+ }}
116
228
  />
117
229
  );
230
+
118
231
  const tagsArray = [...new Set(manualTags)];
232
+
119
233
  const tagsMarkup = tagsArray.map((tag: string) => (
120
234
  <Tag
121
235
  key={tag}
122
236
  copy={tag}
123
237
  colorize={AssetsTableTagsPivot.COLORIZE_TAGS}
124
- removeHandler={() => this.deleteManualTag(tag)}
238
+ removeHandler={() => {
239
+ this.deleteManualTag(tag);
240
+ }}
125
241
  />
126
242
  ));
243
+
127
244
  const removeTagsBtn =
128
245
  tagsArray.length > 0 ? (
129
246
  <Button
130
247
  tooltip='Remove All Tags'
131
248
  style='sublte'
132
- onClick={() => this.uploadsSetting({ manualTags: [] })}>
249
+ onClick={() => {
250
+ this.uploadsSetting({ manualTags: [] });
251
+ }}>
133
252
  <FontAwesomeIcon icon={faEraser} />
134
253
  </Button>
135
254
  ) : null;
255
+
136
256
  const tagsColumn = tagManually && (
137
257
  <div className='tags-column'>
138
258
  <TextField
@@ -141,46 +261,108 @@ class AssetsUploadMenu extends React.PureComponent<IAssetsUploadMenuProps> {
141
261
  suggestions={assetTags}
142
262
  label={copy.tags.add}
143
263
  width={AssetsTableTagsPivot.ADD_TAG_INPUT_WIDTH}
144
- doSubmit={(t) => this.addManualTag(t)}
264
+ doSubmit={(t) => {
265
+ this.addManualTag(t);
266
+ }}
145
267
  />
146
268
  {tagsMarkup}
147
269
  {removeTagsBtn}
148
270
  </div>
149
271
  );
150
272
 
273
+ const modifier = this.state.assetOver ? 'asset-over' : '';
274
+ const show = this.props.show ? 'show' : '';
275
+ const tableHover = this.props.tableHover ? 'table-hover' : '';
151
276
  return (
152
- <div className='uploads-menu'>
153
- <div className='uploads-controls'>
154
- <CheckboxField
155
- width='50%'
156
- label={copy.uploads.autoTagDelimiter}
157
- value={tagByDelimiter}
158
- onChange={() => this.uploadsSetting({ tagByDelimiter: !tagByDelimiter })}
159
- />
160
- {delimiterSelector}
161
- <CheckboxField
162
- width='50%'
163
- label={copy.uploads.manualTagging}
164
- value={tagManually}
165
- onChange={() => this.uploadsSetting({ tagManually: !tagManually })}
166
- />
167
- <CheckboxField
168
- width='50%'
169
- label={copy.uploads.autoTagFilname}
170
- value={tagByFileName}
171
- onChange={() => this.uploadsSetting({ tagByFileName: !tagByFileName })}
172
- />
173
- <CheckboxField
174
- width='50%'
175
- label={copy.uploads.assignToProjectInput}
176
- info={copy.uploads.assignToProjectInfo}
177
- value={!assignToStory}
178
- onChange={() => this.uploadsSetting({ assignToStory: !assignToStory })}
179
- />
277
+ <AssetsTableDropzone
278
+ className={`uploads-dropzone ${show} ${tableHover} ${modifier}`}
279
+ onDrop={(i, m) => {
280
+ this.props.onDrop(i, m);
281
+ }}
282
+ onExternalCollect={(o) => this.checkHover(o)}>
283
+ <div className='overlay'>
284
+ <p style={{ display: this.state.assetOver ? 'block' : 'none' }}>
285
+ {copy.dropAsset}
286
+ </p>
180
287
  </div>
181
- {tagsColumn}
182
- <div className='uploads-list'>{uploadsListInner}</div>
183
- </div>
288
+ <div className='uploads-menu'>
289
+ <div
290
+ className='uploads-menu'
291
+ ref={this.menuRef}>
292
+ <div className='uploads-controls'>
293
+ <CheckboxField
294
+ width='50%'
295
+ label={copy.uploads.autoTagDelimiter}
296
+ value={tagByDelimiter}
297
+ onChange={() => {
298
+ this.uploadsSetting({ tagByDelimiter: !tagByDelimiter });
299
+ }}
300
+ />
301
+ {delimiterSelector}
302
+ <CheckboxField
303
+ width='50%'
304
+ label={copy.uploads.manualTagging}
305
+ value={tagManually}
306
+ onChange={() => {
307
+ this.uploadsSetting({ tagManually: !tagManually });
308
+ }}
309
+ />
310
+ <CheckboxField
311
+ width='50%'
312
+ label={copy.uploads.autoTagFilname}
313
+ value={tagByFileName}
314
+ onChange={() => {
315
+ this.uploadsSetting({ tagByFileName: !tagByFileName });
316
+ }}
317
+ />
318
+ <CheckboxField
319
+ width='50%'
320
+ label={copy.uploads.assignToProjectInput}
321
+ info={copy.uploads.assignToProjectInfo}
322
+ value={!assignToStory}
323
+ onChange={() =>
324
+ this.uploadsSetting({ assignToStory: !assignToStory })
325
+ }
326
+ />
327
+ </div>
328
+ {tagsColumn}
329
+ <div className='uploads-list'>{uploadsListInner}</div>
330
+ <div className='uploads-confirm'>
331
+ <CheckboxField
332
+ label={`Don't show again`}
333
+ value={!showUploadsMenu}
334
+ onChange={() =>
335
+ this.props.updateEditorConfig({
336
+ showUploadsMenu: !showUploadsMenu
337
+ })
338
+ }
339
+ />
340
+ <Button
341
+ key='cancel-upload'
342
+ onClick={() => this.cancelUploadHandler(disable)}
343
+ customStyles={{
344
+ color: 'black'
345
+ }}
346
+ style='bold'
347
+ color='secondary'
348
+ width='60px'
349
+ size='small'>
350
+ Cancel
351
+ </Button>
352
+ <Button
353
+ key='upload-file'
354
+ disabled={disable}
355
+ onClick={() => this.uploadFileHandler()}
356
+ style='bold'
357
+ color='primary'
358
+ width='80px'
359
+ size='small'>
360
+ Upload {ICON_UPLOAD}
361
+ </Button>
362
+ </div>
363
+ </div>
364
+ </div>
365
+ </AssetsTableDropzone>
184
366
  );
185
367
  }
186
368
  }
@@ -188,7 +370,10 @@ class AssetsUploadMenu extends React.PureComponent<IAssetsUploadMenuProps> {
188
370
  const mapDispatchToProps = (dispatch): any => {
189
371
  return bindActionCreators(
190
372
  {
191
- cancelAssetUpload
373
+ cancelAssetUpload,
374
+ cancelNonUploadedAssets,
375
+ uploadingAsset,
376
+ updateUploadTags
192
377
  },
193
378
  dispatch
194
379
  );
@@ -1,7 +1,7 @@
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;
@@ -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);
@@ -1,6 +1,7 @@
1
1
  export const assets = {
2
2
  tooltipFilter: 'Filter by Asset type',
3
3
  previewNotAvailable: 'Preview Not Available for this Asset Type',
4
+ dropAsset: 'Drop file(s) here.',
4
5
  iconTypes: {
5
6
  filter: 'Filter By Type',
6
7
  lut: 'LUT',
@@ -17,7 +18,7 @@ export const assets = {
17
18
  after_effects: 'After Effects'
18
19
  },
19
20
  uploads: {
20
- noUploads: 'There are currently no assets uploading...',
21
+ noUploads: 'No files selected, drag and drop files here to begin.',
21
22
  preparePhase: 'Preparing asset...',
22
23
  autoTagFilname: 'Tag by file name',
23
24
  autoTagDelimiter: 'Tag by Delimiter',