@imposium-hub/components 2.2.15 → 2.2.17

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 (74) hide show
  1. package/dist/cjs/Util.d.ts +2 -2
  2. package/dist/cjs/components/assets/AssetsTableTagsPivot.js +13 -12
  3. package/dist/cjs/components/assets/AssetsTableTagsPivot.js.map +1 -1
  4. package/dist/cjs/components/assets/AssetsUploadMenu.js +86 -28
  5. package/dist/cjs/components/assets/AssetsUploadMenu.js.map +1 -1
  6. package/dist/cjs/components/dropdown/Dropdown.js +5 -5
  7. package/dist/cjs/components/dropdown/Dropdown.js.map +1 -1
  8. package/dist/cjs/components/header/Header.js +9 -9
  9. package/dist/cjs/components/publish-wizard/publish/EmailWorkflow.js +4 -1
  10. package/dist/cjs/components/publish-wizard/publish/EmailWorkflow.js.map +1 -1
  11. package/dist/cjs/components/story-previewer/StoryPreviewer.js +7 -6
  12. package/dist/cjs/components/story-previewer/StoryPreviewer.js.map +1 -1
  13. package/dist/cjs/components/tabs/Tabs.d.ts +3 -1
  14. package/dist/cjs/components/tag/Tag.js.map +1 -1
  15. package/dist/cjs/constants/assets.d.ts +4 -0
  16. package/dist/cjs/constants/assets.js +15 -1
  17. package/dist/cjs/constants/assets.js.map +1 -1
  18. package/dist/cjs/constants/copy.d.ts +4 -1
  19. package/dist/cjs/constants/copy.js +4 -1
  20. package/dist/cjs/constants/copy.js.map +1 -1
  21. package/dist/cjs/index.d.ts +2 -2
  22. package/dist/cjs/index.js +2 -2
  23. package/dist/cjs/index.js.map +1 -1
  24. package/dist/cjs/redux/actions/asset-uploads.d.ts +7 -1
  25. package/dist/cjs/redux/actions/asset-uploads.js +77 -8
  26. package/dist/cjs/redux/actions/asset-uploads.js.map +1 -1
  27. package/dist/cjs/redux/reducers/asset-uploads.js +21 -3
  28. package/dist/cjs/redux/reducers/asset-uploads.js.map +1 -1
  29. package/dist/cjs/services/Auth0.d.ts +1 -1
  30. package/dist/esm/Util.d.ts +2 -2
  31. package/dist/esm/components/assets/AssetsTableTagsPivot.js +2 -2
  32. package/dist/esm/components/assets/AssetsTableTagsPivot.js.map +1 -1
  33. package/dist/esm/components/assets/AssetsUploadMenu.js +40 -7
  34. package/dist/esm/components/assets/AssetsUploadMenu.js.map +1 -1
  35. package/dist/esm/components/header/Header.js +9 -9
  36. package/dist/esm/components/publish-wizard/publish/EmailWorkflow.js +4 -1
  37. package/dist/esm/components/publish-wizard/publish/EmailWorkflow.js.map +1 -1
  38. package/dist/esm/components/story-previewer/StoryPreviewer.js +7 -6
  39. package/dist/esm/components/story-previewer/StoryPreviewer.js.map +1 -1
  40. package/dist/esm/components/tabs/Tabs.d.ts +3 -1
  41. package/dist/esm/components/tag/Tag.js.map +1 -1
  42. package/dist/esm/constants/assets.d.ts +4 -0
  43. package/dist/esm/constants/assets.js +14 -0
  44. package/dist/esm/constants/assets.js.map +1 -1
  45. package/dist/esm/constants/copy.d.ts +4 -1
  46. package/dist/esm/constants/copy.js +4 -1
  47. package/dist/esm/constants/copy.js.map +1 -1
  48. package/dist/esm/index.d.ts +2 -2
  49. package/dist/esm/index.js +2 -2
  50. package/dist/esm/index.js.map +1 -1
  51. package/dist/esm/redux/actions/asset-uploads.d.ts +7 -1
  52. package/dist/esm/redux/actions/asset-uploads.js +44 -6
  53. package/dist/esm/redux/actions/asset-uploads.js.map +1 -1
  54. package/dist/esm/redux/actions/publish.d.ts +2 -2
  55. package/dist/esm/redux/reducers/asset-uploads.js +39 -3
  56. package/dist/esm/redux/reducers/asset-uploads.js.map +1 -1
  57. package/dist/esm/services/Auth0.d.ts +1 -1
  58. package/dist/esm/services/Storage.d.ts +1 -1
  59. package/dist/styles.css +2 -2
  60. package/dist/styles.less +2 -2
  61. package/less/components/assets.less +1 -1
  62. package/less/components/shortcut-menu.less +1 -1
  63. package/package.json +1 -1
  64. package/src/components/assets/AssetsTableTagsPivot.tsx +3 -3
  65. package/src/components/assets/AssetsUploadMenu.tsx +114 -14
  66. package/src/components/header/Header.tsx +9 -9
  67. package/src/components/publish-wizard/publish/EmailWorkflow.tsx +6 -1
  68. package/src/components/story-previewer/StoryPreviewer.tsx +8 -6
  69. package/src/components/tag/Tag.tsx +1 -1
  70. package/src/constants/assets.ts +15 -0
  71. package/src/constants/copy.ts +4 -1
  72. package/src/index.ts +2 -2
  73. package/src/redux/actions/asset-uploads.ts +63 -6
  74. package/src/redux/reducers/asset-uploads.ts +39 -3
@@ -1,15 +1,51 @@
1
1
  import assetUploadsActions from '../actions/asset-uploads';
2
2
  const initialState = {
3
- autoTag: true,
3
+ tagByDelimiter: true,
4
+ delimiter: '_',
5
+ tagManually: false,
6
+ manualTags: [],
7
+ tagByFileName: false,
4
8
  assignToStory: true,
5
9
  uploads: []
6
10
  };
7
11
  const assetUploads = (state = initialState, action) => {
8
12
  switch (action.type) {
9
- case assetUploadsActions.TOGGLE_AUTO_TAG:
13
+ case assetUploadsActions.TOGGLE_TAG_BY_FILENAME:
10
14
  return {
11
15
  ...state,
12
- autoTag: action.toggle
16
+ tagByFileName: action.toggle
17
+ };
18
+ case assetUploadsActions.TOGGLE_TAG_BY_DELIMITER:
19
+ return {
20
+ ...state,
21
+ tagByDelimiter: action.toggle
22
+ };
23
+ case assetUploadsActions.SET_DELIMITER:
24
+ return {
25
+ ...state,
26
+ delimiter: action.delimiter
27
+ };
28
+ case assetUploadsActions.TOGGLE_MANUAL_TAGGING:
29
+ return {
30
+ ...state,
31
+ tagManually: action.toggle
32
+ };
33
+ case assetUploadsActions.ADD_MANUAL_TAG:
34
+ const newManualTags = [...state.manualTags];
35
+ newManualTags.push(action.tag);
36
+ return {
37
+ ...state,
38
+ manualTags: newManualTags
39
+ };
40
+ case assetUploadsActions.DELETE_MANUAL_TAG:
41
+ return {
42
+ ...state,
43
+ manualTags: state.manualTags.filter((t) => t !== action.tag)
44
+ };
45
+ case assetUploadsActions.DELETE_MANUAL_TAGS:
46
+ return {
47
+ ...state,
48
+ manualTags: []
13
49
  };
14
50
  case assetUploadsActions.TOGGLE_ASSIGN_TO_STORY:
15
51
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"asset-uploads.js","sourceRoot":"","sources":["../../../../src/redux/reducers/asset-uploads.ts"],"names":[],"mappings":"AAAA,OAAO,mBAAmB,MAAM,0BAA0B,CAAC;AAE3D,MAAM,YAAY,GAAQ;IACtB,OAAO,EAAE,IAAI;IACb,aAAa,EAAE,IAAI;IACnB,OAAO,EAAE,EAAE;CACd,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,KAAK,GAAG,YAAY,EAAE,MAAM,EAAO,EAAE;IACvD,QAAQ,MAAM,CAAC,IAAI,EAAE;QACjB,KAAK,mBAAmB,CAAC,eAAe;YACpC,OAAO;gBACH,GAAG,KAAK;gBACR,OAAO,EAAE,MAAM,CAAC,MAAM;aACzB,CAAC;QACN,KAAK,mBAAmB,CAAC,sBAAsB;YAC3C,OAAO;gBACH,GAAG,KAAK;gBACR,aAAa,EAAE,MAAM,CAAC,MAAM;aAC/B,CAAC;QACN,KAAK,mBAAmB,CAAC,UAAU;YAC/B,OAAO;gBACH,GAAG,KAAK;gBACR,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC;aACjD,CAAC;QACN,KAAK,mBAAmB,CAAC,uBAAuB;YAC5C,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE;gBAC5C,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,EAAE;oBAChC,OAAO,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;iBAC5C;gBAED,OAAO,CAAC,CAAC;YACb,CAAC,CAAC,CAAC;YAEH,OAAO;gBACH,GAAG,KAAK;gBACR,OAAO,EAAE,UAAU;aACtB,CAAC;QACN,KAAK,mBAAmB,CAAC,aAAa;YAClC,OAAO;gBACH,GAAG,KAAK;gBACR,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,CAAC;aAC5E,CAAC;QACN;YACI,OAAO,KAAK,CAAC;KACpB;AACL,CAAC,CAAC;AAEF,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"asset-uploads.js","sourceRoot":"","sources":["../../../../src/redux/reducers/asset-uploads.ts"],"names":[],"mappings":"AAAA,OAAO,mBAAmB,MAAM,0BAA0B,CAAC;AAE3D,MAAM,YAAY,GAAQ;IACtB,cAAc,EAAE,IAAI;IACpB,SAAS,EAAE,GAAG;IACd,WAAW,EAAE,KAAK;IAClB,UAAU,EAAE,EAAE;IACd,aAAa,EAAE,KAAK;IACpB,aAAa,EAAE,IAAI;IACnB,OAAO,EAAE,EAAE;CACd,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,KAAK,GAAG,YAAY,EAAE,MAAM,EAAO,EAAE;IACvD,QAAQ,MAAM,CAAC,IAAI,EAAE;QACjB,KAAK,mBAAmB,CAAC,sBAAsB;YAC3C,OAAO;gBACH,GAAG,KAAK;gBACR,aAAa,EAAE,MAAM,CAAC,MAAM;aAC/B,CAAC;QACN,KAAK,mBAAmB,CAAC,uBAAuB;YAC5C,OAAO;gBACH,GAAG,KAAK;gBACR,cAAc,EAAE,MAAM,CAAC,MAAM;aAChC,CAAC;QACN,KAAK,mBAAmB,CAAC,aAAa;YAClC,OAAO;gBACH,GAAG,KAAK;gBACR,SAAS,EAAE,MAAM,CAAC,SAAS;aAC9B,CAAC;QACN,KAAK,mBAAmB,CAAC,qBAAqB;YAC1C,OAAO;gBACH,GAAG,KAAK;gBACR,WAAW,EAAE,MAAM,CAAC,MAAM;aAC7B,CAAC;QACN,KAAK,mBAAmB,CAAC,cAAc;YACnC,MAAM,aAAa,GAAG,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;YAC5C,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC/B,OAAO;gBACH,GAAG,KAAK;gBACR,UAAU,EAAE,aAAa;aAC5B,CAAC;QACN,KAAK,mBAAmB,CAAC,iBAAiB;YACtC,OAAO;gBACH,GAAG,KAAK;gBACR,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,GAAG,CAAC;aACvE,CAAC;QACN,KAAK,mBAAmB,CAAC,kBAAkB;YACvC,OAAO;gBACH,GAAG,KAAK;gBACR,UAAU,EAAE,EAAE;aACjB,CAAC;QACN,KAAK,mBAAmB,CAAC,sBAAsB;YAC3C,OAAO;gBACH,GAAG,KAAK;gBACR,aAAa,EAAE,MAAM,CAAC,MAAM;aAC/B,CAAC;QACN,KAAK,mBAAmB,CAAC,UAAU;YAC/B,OAAO;gBACH,GAAG,KAAK;gBACR,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC;aACjD,CAAC;QACN,KAAK,mBAAmB,CAAC,uBAAuB;YAC5C,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE;gBAC5C,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,EAAE;oBAChC,OAAO,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;iBAC5C;gBAED,OAAO,CAAC,CAAC;YACb,CAAC,CAAC,CAAC;YAEH,OAAO;gBACH,GAAG,KAAK;gBACR,OAAO,EAAE,UAAU;aACtB,CAAC;QACN,KAAK,mBAAmB,CAAC,aAAa;YAClC,OAAO;gBACH,GAAG,KAAK;gBACR,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,CAAC;aAC5E,CAAC;QACN;YACI,OAAO,KAAK,CAAC;KACpB;AACL,CAAC,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -14,5 +14,5 @@ export default class AuthService {
14
14
  static logout: () => void;
15
15
  static checkExpiry: (expiry: number) => boolean;
16
16
  static parseIdFromHash: (hash: string) => Promise<IIdentity>;
17
- static checkSession: () => Promise<any>;
17
+ static checkSession: () => Promise<IIdentity | Error>;
18
18
  }
@@ -1,4 +1,4 @@
1
1
  export default class StorageService {
2
2
  static setItem: (key: string, value: any) => Promise<Error>;
3
- static getItem: (key: string) => Promise<any>;
3
+ static getItem: (key: string) => Promise<any | Error>;
4
4
  }
package/dist/styles.css CHANGED
@@ -255,7 +255,7 @@ body a {
255
255
  display: none;
256
256
  }
257
257
  .uploads-menu {
258
- width: 320px;
258
+ width: 670px;
259
259
  height: 175px;
260
260
  overflow-y: auto;
261
261
  display: flex;
@@ -2198,7 +2198,7 @@ body a {
2198
2198
  padding: 5px;
2199
2199
  box-sizing: border-box;
2200
2200
  background: #272727;
2201
- width: 210px;
2201
+ width: 235px;
2202
2202
  }
2203
2203
  .shortcuts-menu table tr td {
2204
2204
  font-size: 12px;
package/dist/styles.less CHANGED
@@ -289,7 +289,7 @@ body{
289
289
  }
290
290
 
291
291
  .uploads-menu {
292
- width: 320px;
292
+ width: 670px;
293
293
  height: 175px;
294
294
  overflow-y: auto;
295
295
  display: flex;
@@ -2165,7 +2165,7 @@ body{
2165
2165
  padding: 5px;
2166
2166
  box-sizing: border-box;
2167
2167
  background: @background;
2168
- width: 210px;
2168
+ width: 235px;
2169
2169
  table {
2170
2170
  tr {
2171
2171
  td {
@@ -43,7 +43,7 @@
43
43
  }
44
44
 
45
45
  .uploads-menu {
46
- width: 320px;
46
+ width: 670px;
47
47
  height: 175px;
48
48
  overflow-y: auto;
49
49
  display: flex;
@@ -2,7 +2,7 @@
2
2
  padding: 5px;
3
3
  box-sizing: border-box;
4
4
  background: @background;
5
- width: 210px;
5
+ width: 235px;
6
6
  table {
7
7
  tr {
8
8
  td {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@imposium-hub/components",
3
- "version": "2.2.15",
3
+ "version": "2.2.17",
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",
@@ -52,7 +52,7 @@ class AssetsTableTagsPivot extends React.PureComponent<IAssetsTableTagsPivotProp
52
52
  }
53
53
  };
54
54
 
55
- public render = (): JSX.Element => {
55
+ public render() {
56
56
  const {
57
57
  row: {
58
58
  original: { id, tags }
@@ -61,7 +61,7 @@ class AssetsTableTagsPivot extends React.PureComponent<IAssetsTableTagsPivotProp
61
61
  } = this.props;
62
62
 
63
63
  const tagsArray = [...new Set(tags)];
64
- const tagsMarkup: JSX.Element[] = tagsArray.map((tag: string) => (
64
+ const tagsMarkup = tagsArray.map((tag: string) => (
65
65
  <Tag
66
66
  key={tag}
67
67
  copy={tag}
@@ -96,7 +96,7 @@ class AssetsTableTagsPivot extends React.PureComponent<IAssetsTableTagsPivotProp
96
96
  </>
97
97
  </div>
98
98
  );
99
- };
99
+ }
100
100
  }
101
101
 
102
102
  const mapDispatchToProps = (dispatch): any => {
@@ -3,20 +3,41 @@ import { assets as copy } from '../../constants/copy';
3
3
  import CheckboxField from '../checkbox-field/CheckboxField';
4
4
  import { DeterminateLoader } from '../determinate-loader/DeterminateLoader';
5
5
  import {
6
- toggleAutoTag,
7
6
  toggleAssignToStory,
8
- cancelAssetUpload
7
+ cancelAssetUpload,
8
+ toggleTagFileName,
9
+ setDelimiter,
10
+ toggleTagDelimiter,
11
+ toggleManualTagging,
12
+ addManualTag,
13
+ deleteManualTag,
14
+ deleteManualTags
9
15
  } from '../../redux/actions/asset-uploads';
10
16
  import { bindActionCreators } from 'redux';
11
17
  import { connect } from 'react-redux';
12
18
  import Button from '../button/Button';
13
19
  import { IImposiumAPI } from '../../services/API';
20
+ import SelectField from '../select-field/SelectField';
21
+ import { DELIMITER_OPTIONS } from '../../constants/assets';
22
+ import TextField from '../text-field/TextField';
23
+ import AssetsTableTagsPivot from './AssetsTableTagsPivot';
24
+ import Tag from '../tag/Tag';
25
+ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
26
+ import { faEraser } from '@fortawesome/free-solid-svg-icons';
14
27
 
15
28
  interface IAssetsUploadMenuProps {
16
29
  assetUploads: any;
30
+ assetTags: string[];
17
31
  api: any;
18
32
  toggleAutoTag: (toggle: boolean) => any;
33
+ toggleTagFileName: (toggle: boolean) => any;
19
34
  toggleAssignToStory: (toggle: boolean) => any;
35
+ toggleTagDelimiter: (togglle: boolean) => any;
36
+ setDelimiter: (delimiter: string) => any;
37
+ toggleManualTagging: (togglle: boolean) => any;
38
+ addManualTag: (tag: string) => any;
39
+ deleteManualTag: (tag: string) => any;
40
+ deleteManualTags: () => void;
20
41
  cancelAssetUpload: (fileName: string, api: IImposiumAPI) => any;
21
42
  }
22
43
 
@@ -30,21 +51,30 @@ class AssetsUploadMenu extends React.PureComponent<IAssetsUploadMenuProps> {
30
51
  this.props.cancelAssetUpload(fileName, api);
31
52
  }
32
53
 
33
- public render = (): JSX.Element => {
54
+ public render() {
34
55
  const {
35
- assetUploads: { uploads, autoTag, assignToStory }
56
+ assetUploads: {
57
+ uploads,
58
+ assignToStory,
59
+ tagByFileName,
60
+ tagByDelimiter,
61
+ delimiter,
62
+ tagManually,
63
+ manualTags
64
+ },
65
+ assetTags
36
66
  } = this.props;
37
- let uploadsListInner: JSX.Element[] | JSX.Element;
67
+ let uploadsListInner;
38
68
  if (uploads.length > 0) {
39
69
  uploadsListInner = uploads.map((u: any) => {
40
70
  const { filename, percent } = u;
41
- const loader: JSX.Element =
71
+ const loader =
42
72
  percent < 100 ? (
43
73
  <DeterminateLoader progress={u.percent} />
44
74
  ) : (
45
75
  <span>{copy.uploads.preparePhase}</span>
46
76
  );
47
- const closeButton: JSX.Element = percent < 100 && (
77
+ const closeButton = percent < 100 && (
48
78
  <Button
49
79
  key='btn-cancel'
50
80
  onClick={() => this.handleCancelAssetUpload(filename)}
@@ -70,14 +100,68 @@ class AssetsUploadMenu extends React.PureComponent<IAssetsUploadMenuProps> {
70
100
  uploadsListInner = <div className='no-ongoing-uploads'>{copy.uploads.noUploads}</div>;
71
101
  }
72
102
 
103
+ const delimiterSelector = tagByDelimiter && (
104
+ <SelectField
105
+ width='35%'
106
+ options={DELIMITER_OPTIONS}
107
+ value={delimiter}
108
+ onChange={(c) => this.props.setDelimiter(c)}
109
+ />
110
+ );
111
+ const tagsArray = [...new Set(manualTags)];
112
+ const tagsMarkup = tagsArray.map((tag: string) => (
113
+ <Tag
114
+ key={tag}
115
+ copy={tag}
116
+ colorize={AssetsTableTagsPivot.COLORIZE_TAGS}
117
+ removeHandler={() => this.props.deleteManualTag(tag)}
118
+ />
119
+ ));
120
+ const removeTagsBtn =
121
+ tagsArray.length > 0 ? (
122
+ <Button
123
+ tooltip='Remove All Tags'
124
+ style='sublte'
125
+ onClick={() => this.props.deleteManualTags()}>
126
+ <FontAwesomeIcon icon={faEraser} />
127
+ </Button>
128
+ ) : null;
129
+ const tagsColumn = tagManually && (
130
+ <div className='tags-column'>
131
+ <TextField
132
+ submittable
133
+ submittableType='add'
134
+ suggestions={assetTags}
135
+ label={copy.tags.add}
136
+ width={AssetsTableTagsPivot.ADD_TAG_INPUT_WIDTH}
137
+ doSubmit={(t) => this.props.addManualTag(t)}
138
+ />
139
+ {tagsMarkup}
140
+ {removeTagsBtn}
141
+ </div>
142
+ );
143
+
73
144
  return (
74
145
  <div className='uploads-menu'>
75
146
  <div className='uploads-controls'>
76
147
  <CheckboxField
77
148
  width='50%'
78
- label={copy.uploads.autoTagInput}
79
- value={autoTag}
80
- onChange={() => this.props.toggleAutoTag(!autoTag)}
149
+ label={copy.uploads.autoTagDelimiter}
150
+ value={tagByDelimiter}
151
+ onChange={() => this.props.toggleTagDelimiter(!tagByDelimiter)}
152
+ />
153
+ {delimiterSelector}
154
+ <CheckboxField
155
+ width='50%'
156
+ label={copy.uploads.manualTagging}
157
+ value={tagManually}
158
+ onChange={() => this.props.toggleManualTagging(!tagManually)}
159
+ />
160
+ <CheckboxField
161
+ width='50%'
162
+ label={copy.uploads.autoTagFilname}
163
+ value={tagByFileName}
164
+ onChange={() => this.props.toggleTagFileName(!tagByFileName)}
81
165
  />
82
166
  <CheckboxField
83
167
  width='50%'
@@ -87,19 +171,35 @@ class AssetsUploadMenu extends React.PureComponent<IAssetsUploadMenuProps> {
87
171
  onChange={() => this.props.toggleAssignToStory(!assignToStory)}
88
172
  />
89
173
  </div>
90
-
174
+ {tagsColumn}
91
175
  <div className='uploads-list'>{uploadsListInner}</div>
92
176
  </div>
93
177
  );
94
- };
178
+ }
95
179
  }
96
180
 
97
181
  const mapDispatchToProps = (dispatch): any => {
98
- return bindActionCreators({ toggleAutoTag, toggleAssignToStory, cancelAssetUpload }, dispatch);
182
+ return bindActionCreators(
183
+ {
184
+ toggleAssignToStory,
185
+ toggleTagFileName,
186
+ cancelAssetUpload,
187
+ toggleTagDelimiter,
188
+ setDelimiter,
189
+ toggleManualTagging,
190
+ addManualTag,
191
+ deleteManualTag,
192
+ deleteManualTags
193
+ },
194
+ dispatch
195
+ );
99
196
  };
100
197
 
101
198
  const mapStateToProps = (state): any => {
102
- return { assetUploads: state.assetUploads };
199
+ return {
200
+ assetUploads: state.assetUploads,
201
+ assetTags: state.assetTags
202
+ };
103
203
  };
104
204
 
105
205
  export default connect(mapStateToProps, mapDispatchToProps)(AssetsUploadMenu);
@@ -88,9 +88,9 @@ class ImposiumHeader extends React.PureComponent<IHeaderProps, IHeaderState> {
88
88
  {
89
89
  accessor: 'date_modified',
90
90
  Header: 'Last Modified',
91
- width: 45,
92
- minWidth: 45,
93
- maxWidth: 45,
91
+ width: 60,
92
+ minWidth: 60,
93
+ maxWidth: 60,
94
94
  disableSortBy: false,
95
95
  Cell: (cell: any) => (
96
96
  <AssetsTableDateCell
@@ -102,9 +102,9 @@ class ImposiumHeader extends React.PureComponent<IHeaderProps, IHeaderState> {
102
102
  {
103
103
  accessor: 'date_created',
104
104
  Header: 'Created Date',
105
- width: 45,
106
- minWidth: 45,
107
- maxWidth: 45,
105
+ width: 60,
106
+ minWidth: 60,
107
+ maxWidth: 60,
108
108
  disableSortBy: false,
109
109
  Cell: (cell: any) => (
110
110
  <AssetsTableDateCell
@@ -116,9 +116,9 @@ class ImposiumHeader extends React.PureComponent<IHeaderProps, IHeaderState> {
116
116
  {
117
117
  accessor: 'last_modified_by',
118
118
  Header: 'Last Modified By',
119
- width: 50,
120
- minWidth: 50,
121
- maxWidth: 50,
119
+ width: 55,
120
+ minWidth: 55,
121
+ maxWidth: 55,
122
122
  disableSortBy: true
123
123
  }
124
124
  ];
@@ -495,7 +495,7 @@ class EmailWorkflow extends React.PureComponent<IEmailWorkflowProps, IEmailWorkf
495
495
  isExport &&
496
496
  uploadComplete &&
497
497
  !renderedBatch &&
498
- Object.keys(this.props.batchJobs.missing).length === 0
498
+ Object.keys(batchJobs.missing).length === 0
499
499
  ) {
500
500
  return (
501
501
  <div className={'progress-bar'}>
@@ -506,6 +506,11 @@ class EmailWorkflow extends React.PureComponent<IEmailWorkflowProps, IEmailWorkf
506
506
  </div>
507
507
  );
508
508
  }
509
+
510
+ if (batchJobs.failed) {
511
+ return <>1 or more rows failed to render</>;
512
+ }
513
+
509
514
  if (uploading) {
510
515
  const uploadingCopy = isExport
511
516
  ? copy.publish.importingData
@@ -248,6 +248,12 @@ class StoryPreviewer extends React.PureComponent<IStoryPreviewerProps, IStoryPre
248
248
  });
249
249
  }
250
250
 
251
+ private getNameHandler = (obj) => {
252
+ const { name, url } = obj;
253
+ const getName = name ? name : url.substring(url.lastIndexOf('_') + 1, url.lastIndexOf('.'));
254
+ return getName;
255
+ };
256
+
251
257
  private getViewerOptions() {
252
258
  const opts = [];
253
259
 
@@ -274,12 +280,8 @@ class StoryPreviewer extends React.PureComponent<IStoryPreviewerProps, IStoryPre
274
280
  if (images) {
275
281
  for (const key in images) {
276
282
  if (images.hasOwnProperty(key)) {
277
- const { name, url } = images[key];
278
- const getName = name
279
- ? name
280
- : url.substring(url.lastIndexOf('_') + 1, url.lastIndexOf('.'));
281
283
  const i = {
282
- label: `Image: ${getName}`,
284
+ label: `Image: ${this.getNameHandler(images[key])}`,
283
285
  value: `${OUTPUT_TYPES.IMAGE}.${key}`
284
286
  };
285
287
  opts.push(i);
@@ -291,7 +293,7 @@ class StoryPreviewer extends React.PureComponent<IStoryPreviewerProps, IStoryPre
291
293
  for (const key in audios) {
292
294
  if (audios.hasOwnProperty(key)) {
293
295
  const a = {
294
- label: `Audio: ${audios[key].name}`,
296
+ label: `Audio: ${this.getNameHandler(audios[key])}`,
295
297
  value: `${OUTPUT_TYPES.AUDIO}.${key}`
296
298
  };
297
299
  opts.push(a);
@@ -14,7 +14,7 @@ const Tag: React.FC<ITagProps> = (p: ITagProps) => {
14
14
  }
15
15
 
16
16
  const borderLeftColor: string = p.colorize ? `${string2HexCode(p.copy)}` : '';
17
- const remove: JSX.Element = typeof p.removeHandler === 'function' && (
17
+ const remove = typeof p.removeHandler === 'function' && (
18
18
  <div
19
19
  className='remove-tag'
20
20
  onClick={p.removeHandler}>
@@ -46,3 +46,18 @@ export const PREVIEW_MAX_WIDTH: number = 400;
46
46
  export const PREVIEW_MAX_HEIGHT: number = 400;
47
47
 
48
48
  export const HEADER_HEIGHT: number = 30;
49
+
50
+ export const DELIMITER_OPTIONS = [
51
+ {
52
+ label: `Underscore: '_'`,
53
+ value: '_'
54
+ },
55
+ {
56
+ label: `Dash: '-'`,
57
+ value: '-'
58
+ },
59
+ {
60
+ label: `Space: ' '`,
61
+ value: ' '
62
+ }
63
+ ];
@@ -19,7 +19,10 @@ export const assets = {
19
19
  uploads: {
20
20
  noUploads: 'There are currently no assets uploading...',
21
21
  preparePhase: 'Preparing asset...',
22
- autoTagInput: 'Tag by filename',
22
+ autoTagFilname: 'Tag by file name',
23
+ autoTagDelimiter: 'Tag by Delimiter',
24
+ delimiterOptions: 'Delimiter Options',
25
+ manualTagging: 'Tag Manually',
23
26
  assignToProjectInput: 'Assign to Project',
24
27
  assignToProjectInfo:
25
28
  'If selected, any assets uploaded will only be available to use with the currently selected project.',
package/src/index.ts CHANGED
@@ -102,7 +102,7 @@ import {
102
102
  updateAssetStory
103
103
  } from './redux/actions/asset-list';
104
104
  import { getAssetTagList, addAssetTagToList } from './redux/actions/asset-tags';
105
- import { cancelAssetUpload, toggleAutoTag, uploadAssets } from './redux/actions/asset-uploads';
105
+ import { cancelAssetUpload, toggleTagFileName, uploadAssets } from './redux/actions/asset-uploads';
106
106
  import { selectAsset, deselectAsset, resetSelection } from './redux/actions/selected-assets';
107
107
  import assetFilters from './redux/reducers/asset-filters';
108
108
  import assetList from './redux/reducers/asset-list';
@@ -234,7 +234,7 @@ export {
234
234
  updateAssetName,
235
235
  updateAssetData,
236
236
  doAssetTableHydration,
237
- toggleAutoTag,
237
+ toggleTagFileName,
238
238
  uploadAssets,
239
239
  selectAsset,
240
240
  deselectAsset,
@@ -4,6 +4,13 @@ import axios from 'axios';
4
4
 
5
5
  const assetUploadsActions: any = {
6
6
  TOGGLE_AUTO_TAG: 'assetUploads/TOGGLE_AUTO_TAG',
7
+ TOGGLE_TAG_BY_FILENAME: 'assetUploads/TOGGLE_TAG_BY_FILENAME',
8
+ TOGGLE_TAG_BY_DELIMITER: 'assetUploads/TOGGLE_TAG_BY_DELIMITER',
9
+ SET_DELIMITER: 'assetUploads/SET_DELIMITER',
10
+ TOGGLE_MANUAL_TAGGING: 'assetUploads/TOGGLE_MANUAL_TAGGING',
11
+ ADD_MANUAL_TAG: 'assetUploads/ADD_MANUAL_TAG',
12
+ DELETE_MANUAL_TAG: 'assetUploads/DELETE_MANUAL_TAG',
13
+ DELETE_MANUAL_TAGS: 'assetUploads/DELETE_MANUAL_TAGS',
7
14
  TOGGLE_ASSIGN_TO_STORY: 'assetUploads/TOGGLE_ASSIGN_TO_STORY',
8
15
  ADD_UPLOAD: 'assetUploads/ADD_UPLOAD',
9
16
  UPDATE_PERCENT_UPLOADED: 'assetUploads/UPDATE_PERCENT_UPLOADED',
@@ -12,8 +19,8 @@ const assetUploadsActions: any = {
12
19
 
13
20
  const POLL_INTERVAL: number = 5000;
14
21
 
15
- export const toggleAutoTag = (toggle: boolean): any => ({
16
- type: assetUploadsActions.TOGGLE_AUTO_TAG,
22
+ export const toggleTagFileName = (toggle: boolean): any => ({
23
+ type: assetUploadsActions.TOGGLE_TAG_BY_FILENAME,
17
24
  toggle
18
25
  });
19
26
 
@@ -22,6 +29,35 @@ export const toggleAssignToStory = (toggle: boolean): any => ({
22
29
  toggle
23
30
  });
24
31
 
32
+ export const toggleTagDelimiter = (toggle: boolean): any => ({
33
+ type: assetUploadsActions.TOGGLE_TAG_BY_DELIMITER,
34
+ toggle
35
+ });
36
+
37
+ export const setDelimiter = (delimiter: string): any => ({
38
+ type: assetUploadsActions.SET_DELIMITER,
39
+ delimiter
40
+ });
41
+
42
+ export const toggleManualTagging = (toggle: boolean): any => ({
43
+ type: assetUploadsActions.TOGGLE_MANUAL_TAGGING,
44
+ toggle
45
+ });
46
+
47
+ export const addManualTag = (tag: string): any => ({
48
+ type: assetUploadsActions.ADD_MANUAL_TAG,
49
+ tag
50
+ });
51
+
52
+ export const deleteManualTag = (tag: string): any => ({
53
+ type: assetUploadsActions.DELETE_MANUAL_TAG,
54
+ tag
55
+ });
56
+
57
+ export const deleteManualTags = (): any => ({
58
+ type: assetUploadsActions.DELETE_MANUAL_TAGS
59
+ });
60
+
25
61
  export const uploadAssets = (
26
62
  api: IImposiumAPI,
27
63
  files: File[],
@@ -30,7 +66,15 @@ export const uploadAssets = (
30
66
  ): any => {
31
67
  return (dispatch, getStore) => {
32
68
  const {
33
- assetUploads: { autoTag, uploads, assignToStory }
69
+ assetUploads: {
70
+ uploads,
71
+ assignToStory,
72
+ tagByFileName,
73
+ tagByDelimiter,
74
+ delimiter,
75
+ tagManually,
76
+ manualTags
77
+ }
34
78
  } = getStore();
35
79
  let currentQueue: number = 0;
36
80
  let ongoingJobs: any[] = [];
@@ -44,9 +88,22 @@ export const uploadAssets = (
44
88
  uploadsWithSameName.length > 0
45
89
  ? `${file.name} (${uploadsWithSameName.length})`
46
90
  : file.name;
47
- const tags: string = autoTag
48
- ? file.name.substr(0, file.name.lastIndexOf('.')).split('_').join(',')
49
- : '';
91
+
92
+ let tags = [];
93
+
94
+ if (tagByFileName) {
95
+ tags = tags.concat(file.name.substr(0, file.name.lastIndexOf('.')));
96
+ }
97
+
98
+ if (tagByDelimiter) {
99
+ const tag = file.name.substr(0, file.name.lastIndexOf('.')).split(delimiter);
100
+ tags = [...new Set([...tags, ...tag])];
101
+ }
102
+
103
+ if (tagManually) {
104
+ tags = [...new Set([...tags, ...manualTags])];
105
+ }
106
+
50
107
  const uploadMeta: any = { filename, percent: 0 };
51
108
 
52
109
  const onUploadProgress = (progress: any): void => {