@imposium-hub/components 2.6.0-0 → 2.6.0-2

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 (149) hide show
  1. package/dist/cjs/Util.d.ts +1 -1
  2. package/dist/cjs/Util.js +33 -20
  3. package/dist/cjs/Util.js.map +1 -1
  4. package/dist/cjs/components/app-wrapper/AppWrapper.d.ts +26 -5
  5. package/dist/cjs/components/app-wrapper/AppWrapper.js +110 -22
  6. package/dist/cjs/components/app-wrapper/AppWrapper.js.map +1 -1
  7. package/dist/cjs/components/assets/StoryTableNameFilter.d.ts +9 -2
  8. package/dist/cjs/components/assets/StoryTableNameFilter.js +3 -13
  9. package/dist/cjs/components/assets/StoryTableNameFilter.js.map +1 -1
  10. package/dist/cjs/components/context-menu/AnimateComponent.d.ts +6 -6
  11. package/dist/cjs/components/context-menu/AnimateComponent.js.map +1 -1
  12. package/dist/cjs/components/context-menu/ContextMenu.d.ts +12 -27
  13. package/dist/cjs/components/context-menu/ContextMenu.js +2 -15
  14. package/dist/cjs/components/context-menu/ContextMenu.js.map +1 -1
  15. package/dist/cjs/components/context-menu/ContextMenuItem.d.ts +6 -18
  16. package/dist/cjs/components/context-menu/ContextMenuItem.js +2 -21
  17. package/dist/cjs/components/context-menu/ContextMenuItem.js.map +1 -1
  18. package/dist/cjs/components/context-menu/ContextMenuTrigger.d.ts +6 -16
  19. package/dist/cjs/components/context-menu/ContextMenuTrigger.js +2 -20
  20. package/dist/cjs/components/context-menu/ContextMenuTrigger.js.map +1 -1
  21. package/dist/cjs/components/context-menu/SubMenu.d.ts +4 -12
  22. package/dist/cjs/components/context-menu/SubMenu.js +2 -17
  23. package/dist/cjs/components/context-menu/SubMenu.js.map +1 -1
  24. package/dist/cjs/components/data-table/Paginator.d.ts +16 -1
  25. package/dist/cjs/components/data-table/Paginator.js +1 -1
  26. package/dist/cjs/components/data-table/Paginator.js.map +1 -1
  27. package/dist/cjs/components/font-picker/font-manager/constants.d.ts +4 -0
  28. package/dist/cjs/components/font-picker/font-manager/constants.js +5 -1
  29. package/dist/cjs/components/font-picker/font-manager/constants.js.map +1 -1
  30. package/dist/cjs/components/header/Header.d.ts +4 -5
  31. package/dist/cjs/components/header/Header.js +77 -128
  32. package/dist/cjs/components/header/Header.js.map +1 -1
  33. package/dist/cjs/components/header/ProjectDropdown.d.ts +13 -0
  34. package/dist/cjs/components/header/ProjectDropdown.js +128 -0
  35. package/dist/cjs/components/header/ProjectDropdown.js.map +1 -0
  36. package/dist/cjs/components/header/StoryDropdown.d.ts +6 -0
  37. package/dist/cjs/components/header/StoryDropdown.js +111 -0
  38. package/dist/cjs/components/header/StoryDropdown.js.map +1 -0
  39. package/dist/cjs/components/portal/Portal.d.ts +0 -2
  40. package/dist/cjs/components/portal/Portal.js.map +1 -1
  41. package/dist/cjs/components/publish-wizard/PublishWizard.d.ts +1 -3
  42. package/dist/cjs/components/publish-wizard/PublishWizard.js.map +1 -1
  43. package/dist/cjs/components/publish-wizard/publish/EmailWorkflow.js.map +1 -1
  44. package/dist/cjs/constants/copy.d.ts +3 -0
  45. package/dist/cjs/constants/copy.js +3 -0
  46. package/dist/cjs/constants/copy.js.map +1 -1
  47. package/dist/cjs/index.d.ts +4 -2
  48. package/dist/cjs/index.js +10 -4
  49. package/dist/cjs/index.js.map +1 -1
  50. package/dist/cjs/redux/actions/access.js +44 -37
  51. package/dist/cjs/redux/actions/access.js.map +1 -1
  52. package/dist/cjs/services/API.d.ts +9 -2
  53. package/dist/cjs/services/API.js +198 -75
  54. package/dist/cjs/services/API.js.map +1 -1
  55. package/dist/cjs/utils/modal.d.ts +2 -0
  56. package/dist/cjs/utils/modal.js +11 -0
  57. package/dist/cjs/utils/modal.js.map +1 -0
  58. package/dist/cjs/utils/pendo.d.ts +2 -0
  59. package/dist/cjs/utils/pendo.js +39 -0
  60. package/dist/cjs/utils/pendo.js.map +1 -0
  61. package/dist/cjs/utils/routing.d.ts +2 -0
  62. package/dist/cjs/utils/routing.js +10 -1
  63. package/dist/cjs/utils/routing.js.map +1 -1
  64. package/dist/esm/Util.d.ts +1 -1
  65. package/dist/esm/Util.js +10 -19
  66. package/dist/esm/Util.js.map +1 -1
  67. package/dist/esm/components/app-wrapper/AppWrapper.d.ts +26 -5
  68. package/dist/esm/components/app-wrapper/AppWrapper.js +103 -19
  69. package/dist/esm/components/app-wrapper/AppWrapper.js.map +1 -1
  70. package/dist/esm/components/assets/StoryTableNameFilter.d.ts +9 -2
  71. package/dist/esm/components/assets/StoryTableNameFilter.js +3 -13
  72. package/dist/esm/components/assets/StoryTableNameFilter.js.map +1 -1
  73. package/dist/esm/components/context-menu/AnimateComponent.d.ts +6 -6
  74. package/dist/esm/components/context-menu/AnimateComponent.js.map +1 -1
  75. package/dist/esm/components/context-menu/ContextMenu.d.ts +12 -27
  76. package/dist/esm/components/context-menu/ContextMenu.js +2 -4
  77. package/dist/esm/components/context-menu/ContextMenu.js.map +1 -1
  78. package/dist/esm/components/context-menu/ContextMenuItem.d.ts +6 -18
  79. package/dist/esm/components/context-menu/ContextMenuItem.js +2 -10
  80. package/dist/esm/components/context-menu/ContextMenuItem.js.map +1 -1
  81. package/dist/esm/components/context-menu/ContextMenuTrigger.d.ts +6 -16
  82. package/dist/esm/components/context-menu/ContextMenuTrigger.js +2 -9
  83. package/dist/esm/components/context-menu/ContextMenuTrigger.js.map +1 -1
  84. package/dist/esm/components/context-menu/SubMenu.d.ts +4 -12
  85. package/dist/esm/components/context-menu/SubMenu.js +2 -6
  86. package/dist/esm/components/context-menu/SubMenu.js.map +1 -1
  87. package/dist/esm/components/data-table/Paginator.d.ts +16 -1
  88. package/dist/esm/components/data-table/Paginator.js +1 -1
  89. package/dist/esm/components/data-table/Paginator.js.map +1 -1
  90. package/dist/esm/components/font-picker/font-manager/constants.d.ts +4 -0
  91. package/dist/esm/components/font-picker/font-manager/constants.js +4 -0
  92. package/dist/esm/components/font-picker/font-manager/constants.js.map +1 -1
  93. package/dist/esm/components/header/Header.d.ts +4 -5
  94. package/dist/esm/components/header/Header.js +75 -117
  95. package/dist/esm/components/header/Header.js.map +1 -1
  96. package/dist/esm/components/header/ProjectDropdown.d.ts +13 -0
  97. package/dist/esm/components/header/ProjectDropdown.js +101 -0
  98. package/dist/esm/components/header/ProjectDropdown.js.map +1 -0
  99. package/dist/esm/components/header/StoryDropdown.d.ts +6 -0
  100. package/dist/esm/components/header/StoryDropdown.js +82 -0
  101. package/dist/esm/components/header/StoryDropdown.js.map +1 -0
  102. package/dist/esm/components/portal/Portal.d.ts +0 -2
  103. package/dist/esm/components/portal/Portal.js.map +1 -1
  104. package/dist/esm/components/publish-wizard/PublishWizard.d.ts +1 -3
  105. package/dist/esm/components/publish-wizard/PublishWizard.js.map +1 -1
  106. package/dist/esm/components/publish-wizard/publish/EmailWorkflow.js.map +1 -1
  107. package/dist/esm/constants/copy.d.ts +3 -0
  108. package/dist/esm/constants/copy.js +3 -0
  109. package/dist/esm/constants/copy.js.map +1 -1
  110. package/dist/esm/index.d.ts +4 -2
  111. package/dist/esm/index.js +4 -2
  112. package/dist/esm/index.js.map +1 -1
  113. package/dist/esm/redux/actions/access.js +63 -56
  114. package/dist/esm/redux/actions/access.js.map +1 -1
  115. package/dist/esm/services/API.d.ts +9 -2
  116. package/dist/esm/services/API.js +43 -18
  117. package/dist/esm/services/API.js.map +1 -1
  118. package/dist/esm/utils/modal.d.ts +2 -0
  119. package/dist/esm/utils/modal.js +7 -0
  120. package/dist/esm/utils/modal.js.map +1 -0
  121. package/dist/esm/utils/pendo.d.ts +2 -0
  122. package/dist/esm/utils/pendo.js +29 -0
  123. package/dist/esm/utils/pendo.js.map +1 -0
  124. package/dist/esm/utils/routing.d.ts +2 -0
  125. package/dist/esm/utils/routing.js +7 -0
  126. package/dist/esm/utils/routing.js.map +1 -1
  127. package/package.json +10 -7
  128. package/src/Util.ts +10 -16
  129. package/src/components/app-wrapper/AppWrapper.tsx +167 -26
  130. package/src/components/assets/StoryTableNameFilter.tsx +6 -22
  131. package/src/components/context-menu/AnimateComponent.tsx +12 -1
  132. package/src/components/context-menu/ContextMenu.tsx +16 -8
  133. package/src/components/context-menu/ContextMenuItem.tsx +12 -11
  134. package/src/components/context-menu/ContextMenuTrigger.tsx +12 -10
  135. package/src/components/context-menu/SubMenu.tsx +6 -8
  136. package/src/components/data-table/Paginator.tsx +19 -6
  137. package/src/components/font-picker/font-manager/constants.ts +5 -0
  138. package/src/components/header/Header.tsx +105 -192
  139. package/src/components/header/ProjectDropdown.tsx +174 -0
  140. package/src/components/portal/Portal.tsx +1 -2
  141. package/src/components/publish-wizard/PublishWizard.tsx +1 -1
  142. package/src/components/publish-wizard/publish/EmailWorkflow.tsx +7 -1
  143. package/src/constants/copy.ts +3 -0
  144. package/src/index.ts +8 -3
  145. package/src/redux/actions/access.ts +64 -72
  146. package/src/services/API.ts +55 -20
  147. package/src/utils/modal.ts +9 -0
  148. package/src/utils/pendo.ts +38 -0
  149. package/src/utils/routing.ts +10 -0
@@ -9,29 +9,30 @@ import {
9
9
  ICON_UP_RIGHT_FROM_SQUARE
10
10
  } from '../../constants/icons';
11
11
  import { connect } from 'react-redux';
12
- import _ from 'lodash';
13
- import DataTable from '../data-table/DataTable';
14
- import AssetsTableDateCell from '../assets/AssetsTableDateCell';
15
12
  import Button from '../button/Button';
16
13
  import Select, { createFilter } from 'react-select';
17
14
  import { setAccessData } from '../../redux/actions/access';
18
15
  import { bindActionCreators } from 'redux';
19
- import { StoryTableTotalRendersCell } from '../assets/StoryTableTotalRendersCell';
20
- import StoryTableNameFilter from '../assets/StoryTableNameFilter';
21
16
  import { updateStoryFilter } from '../../redux/actions/story-filter';
22
17
  import { IImposiumAPI } from '../../services/API';
23
-
18
+ import { pushRoute } from '../../utils/routing';
19
+ import { openConfirmModal } from '../../utils/modal';
20
+ import { header } from '../../constants/copy';
21
+ import { ProjectDropdown } from './ProjectDropdown';
22
+ import { APP_WRAPPER_ERROR_STATES } from '../app-wrapper/AppWrapper';
24
23
  export interface IHeaderProps {
24
+ email: string;
25
25
  auth0: any;
26
26
  api: IImposiumAPI;
27
+ errorState?: string;
27
28
  activeServiceId: string;
28
29
  activeOrganization: string;
29
30
  activeStory?: string;
30
31
  hideStoryPicker?: boolean;
31
32
  hideOrgPicker?: boolean;
32
33
  setAccessData(access: any): void;
33
- onOrganizationChange?: (orgId: string, storyId: string) => any;
34
- onStoryChange?: (story: any) => any;
34
+ unsavedChanges: boolean;
35
+ saveStory();
35
36
  onLogout();
36
37
  additionalButtons?: any[];
37
38
  CrMLink?: string;
@@ -53,9 +54,6 @@ export interface IHeaderState {
53
54
  showServiceDropdown: boolean;
54
55
  dropdownToggleColor: string;
55
56
  activeFirstChar: string;
56
- order: string;
57
- orderDirection: string;
58
- totalRendersLoading: boolean;
59
57
  }
60
58
 
61
59
  class ImposiumHeader extends React.PureComponent<IHeaderProps, IHeaderState> {
@@ -104,10 +102,7 @@ class ImposiumHeader extends React.PureComponent<IHeaderProps, IHeaderState> {
104
102
  showStoriesDropdown: false,
105
103
  showServiceDropdown: false,
106
104
  dropdownToggleColor: ImposiumHeader.DEFAULT_ACCOUNT_TOGGLE_COLOR,
107
- activeFirstChar: '',
108
- order: 'date_modified',
109
- orderDirection: 'desc',
110
- totalRendersLoading: false
105
+ activeFirstChar: ''
111
106
  };
112
107
 
113
108
  this.serviceToggleRef = React.createRef();
@@ -165,42 +160,80 @@ class ImposiumHeader extends React.PureComponent<IHeaderProps, IHeaderState> {
165
160
  });
166
161
  };
167
162
 
168
- private closeStoriesDropDown() {
169
- this.setState({ showStoriesDropdown: false }, () =>
170
- this.props.updateStoryFilter({ name: '' })
171
- );
172
- }
173
-
174
163
  private changeStory = (story: any): void => {
175
- const { onStoryChange, activeOrganization, api, activeServiceId } = this.props;
164
+ const { activeOrganization, api, activeServiceId, unsavedChanges } = this.props;
176
165
 
177
- if (typeof onStoryChange === 'function') {
178
- onStoryChange(story);
166
+ const changeStory = () => {
167
+ pushRoute(`/${activeOrganization}/${story.id}`);
179
168
  api.cacheActiveStory(activeServiceId, activeOrganization, story.id);
180
- this.closeStoriesDropDown();
169
+ };
170
+
171
+ if (unsavedChanges) {
172
+ const onYes = () => {
173
+ if (this.props.saveStory) {
174
+ this.props.saveStory();
175
+ }
176
+ changeStory();
177
+ };
178
+
179
+ openConfirmModal({
180
+ showCancel: true,
181
+ noLabel: header.noSave,
182
+ onNo: () => changeStory(),
183
+ yesLabel: header.onSave,
184
+ onYes: () => onYes(),
185
+ title: header.checkUnsaved
186
+ });
187
+ } else {
188
+ changeStory();
181
189
  }
182
190
  };
183
191
 
184
192
  private toggleAccountDropdown = (toggle: boolean, orgId: string = ''): void => {
185
- const { onOrganizationChange, api, activeServiceId } = this.props;
193
+ const { api, activeServiceId, unsavedChanges } = this.props;
186
194
  if (toggle) {
187
195
  this.setState({ showAccountDropdown: true });
188
196
  } else {
189
197
  this.setState({ showAccountDropdown: false });
190
- const lastModified = getLastModifiedStoryInOrg(orgId, this.props.access);
191
-
192
- if (orgId && onOrganizationChange) {
193
- let storyId = lastModified;
194
- api.getCachedStoryForOrg(activeServiceId, orgId)
195
- .then((res) => {
196
- storyId = res.story_id ? res.story_id : lastModified;
197
- onOrganizationChange(orgId, storyId);
198
- })
199
- .catch((e) => {
200
- console.error('Error getting cached storyID for Org');
201
- onOrganizationChange(orgId, storyId);
198
+
199
+ if (orgId) {
200
+ const lastModified = getLastModifiedStoryInOrg(orgId, this.props.access);
201
+ const changeOrg = () => {
202
+ let storyId = lastModified;
203
+ api.getCachedStoryForOrg(activeServiceId, orgId)
204
+ .then((res) => {
205
+ storyId = res.story_id ? res.story_id : lastModified;
206
+ if (storyId) {
207
+ pushRoute(`/${orgId}/${storyId}`);
208
+ api.cacheActiveStory(activeServiceId, orgId, storyId);
209
+ } else {
210
+ pushRoute(`/${orgId}`);
211
+ }
212
+ })
213
+ .catch((e) => {
214
+ console.error('Error getting cached storyID for Org');
215
+ pushRoute(`/${orgId}/${storyId}`);
216
+ api.cacheActiveStory(activeServiceId, orgId, storyId);
217
+ });
218
+ };
219
+
220
+ if (unsavedChanges) {
221
+ const onYes = () => {
222
+ this.props.saveStory();
223
+ changeOrg();
224
+ };
225
+
226
+ openConfirmModal({
227
+ showCancel: true,
228
+ noLabel: header.noSave,
229
+ onNo: () => changeOrg(),
230
+ yesLabel: header.onSave,
231
+ onYes: () => onYes(),
232
+ title: header.checkUnsaved
202
233
  });
203
- api.cacheActiveStory(activeServiceId, orgId, storyId);
234
+ } else {
235
+ changeOrg();
236
+ }
204
237
  }
205
238
  }
206
239
  };
@@ -254,70 +287,6 @@ class ImposiumHeader extends React.PureComponent<IHeaderProps, IHeaderState> {
254
287
  </div>
255
288
  );
256
289
 
257
- private getStoriesColumns() {
258
- return [
259
- {
260
- accessor: 'name',
261
- Header: 'Name',
262
- width: 115,
263
- minWidth: 115,
264
- Search: () => <StoryTableNameFilter />,
265
- disableSortBy: false
266
- },
267
- {
268
- accessor: 'total_renders',
269
- Header: 'Total Renders',
270
- width: 60,
271
- minWidth: 60,
272
- maxWidth: 60,
273
- disableSortBy: false,
274
- Cell: (cell: any) => (
275
- <StoryTableTotalRendersCell
276
- loading={this.state.totalRendersLoading}
277
- cell={cell}
278
- date_created={false}
279
- />
280
- )
281
- },
282
- {
283
- accessor: 'last_modified_by',
284
- Header: 'Last Modified By',
285
- width: 60,
286
- minWidth: 60,
287
- maxWidth: 60,
288
- disableSortBy: true
289
- },
290
- {
291
- accessor: 'date_modified',
292
- Header: 'Last Modified',
293
- width: 65,
294
- minWidth: 65,
295
- maxWidth: 65,
296
- disableSortBy: false,
297
- Cell: (cell: any) => (
298
- <AssetsTableDateCell
299
- cell={cell}
300
- date_created={false}
301
- />
302
- )
303
- },
304
- {
305
- accessor: 'date_created',
306
- Header: 'Created Date',
307
- width: 65,
308
- minWidth: 65,
309
- maxWidth: 65,
310
- disableSortBy: false,
311
- Cell: (cell: any) => (
312
- <AssetsTableDateCell
313
- cell={cell}
314
- date_created={true}
315
- />
316
- )
317
- }
318
- ];
319
- }
320
-
321
290
  public render() {
322
291
  const {
323
292
  activeOrganization,
@@ -330,7 +299,9 @@ class ImposiumHeader extends React.PureComponent<IHeaderProps, IHeaderState> {
330
299
  hideDocs,
331
300
  access,
332
301
  api,
333
- access: { organizations }
302
+ access: { organizations },
303
+ errorState,
304
+ email
334
305
  } = this.props;
335
306
  const {
336
307
  showAccountDropdown,
@@ -339,9 +310,7 @@ class ImposiumHeader extends React.PureComponent<IHeaderProps, IHeaderState> {
339
310
  activeOrganizationBlob,
340
311
  activeFirstChar,
341
312
  dropdownToggleColor,
342
- showServiceDropdown,
343
- order,
344
- orderDirection
313
+ showServiceDropdown
345
314
  } = this.state;
346
315
 
347
316
  let currentStory: any;
@@ -352,9 +321,6 @@ class ImposiumHeader extends React.PureComponent<IHeaderProps, IHeaderState> {
352
321
  let privateAnchors: JSX.Element[];
353
322
  let accountDropdownToggle: JSX.Element;
354
323
  let storyToggle: JSX.Element;
355
- let storyMenuInner: JSX.Element = (
356
- <div className='no-stories-dialog'>{ImposiumHeader.NO_STORIES_COPY}</div>
357
- );
358
324
  let serviceDropdownToggle: JSX.Element;
359
325
  let serviceDropdownMenu: JSX.Element;
360
326
 
@@ -438,21 +404,22 @@ class ImposiumHeader extends React.PureComponent<IHeaderProps, IHeaderState> {
438
404
  </div>
439
405
  );
440
406
 
441
- serviceDropdownToggle = (
442
- <button
443
- id='btn-toggle-services'
444
- className='btn-toggle-services'
445
- style={serviceDropdownColor}
446
- ref={this.serviceToggleRef}
447
- onClick={() =>
448
- this.setState({ showServiceDropdown: !this.state.showServiceDropdown })
449
- }>
450
- <span>
451
- {activeService ? activeService.name : ImposiumHeader.SERVICE_MESH_ALIAS}
452
- </span>
453
- {this.renderDropdownChevron(showServiceDropdown)}
454
- </button>
455
- );
407
+ serviceDropdownToggle =
408
+ errorState !== APP_WRAPPER_ERROR_STATES.UNAUTHORIZED_ORG ? (
409
+ <button
410
+ id='btn-toggle-services'
411
+ className='btn-toggle-services'
412
+ style={serviceDropdownColor}
413
+ ref={this.serviceToggleRef}
414
+ onClick={() =>
415
+ this.setState({ showServiceDropdown: !this.state.showServiceDropdown })
416
+ }>
417
+ <span>
418
+ {activeService ? activeService.name : ImposiumHeader.SERVICE_MESH_ALIAS}
419
+ </span>
420
+ {this.renderDropdownChevron(showServiceDropdown)}
421
+ </button>
422
+ ) : null;
456
423
 
457
424
  accountDropdownToggle =
458
425
  !hideOrgPicker && access.organizations.length > 0 ? (
@@ -486,21 +453,7 @@ class ImposiumHeader extends React.PureComponent<IHeaderProps, IHeaderState> {
486
453
  className='btn-toggle-story'
487
454
  ref={this.storyToggleRef}
488
455
  onClick={() => {
489
- this.setState({ showStoriesDropdown: !showStoriesDropdown }, () => {
490
- if (showStoriesDropdown === false) {
491
- this.props.updateStoryFilter({ name: '' });
492
- this.setState({ totalRendersLoading: true });
493
- api.getAccessData(true)
494
- .then((res) => {
495
- this.props.setAccessData(res);
496
- this.setState({ totalRendersLoading: false });
497
- })
498
- .catch((e) => {
499
- console.error(e);
500
- console.error('Error getting access data from Header');
501
- });
502
- }
503
- });
456
+ this.setState({ showStoriesDropdown: !showStoriesDropdown });
504
457
  }}>
505
458
  <div className='story-name'>
506
459
  {currentStory
@@ -512,48 +465,6 @@ class ImposiumHeader extends React.PureComponent<IHeaderProps, IHeaderState> {
512
465
  {this.renderDropdownChevron(showStoriesDropdown)}
513
466
  </button>
514
467
  );
515
-
516
- if (activeOrganizationBlob.stories.length !== 0) {
517
- const sortBy =
518
- order && orderDirection
519
- ? [{ id: order, desc: orderDirection === 'desc' }]
520
- : undefined;
521
-
522
- let sortedStories = _.orderBy(
523
- activeOrganizationBlob.stories,
524
- ['date_modified'],
525
- ['desc']
526
- );
527
-
528
- if (this.props.storyFilter && this.props.storyFilter?.name) {
529
- const storyFilter = this.props.storyFilter.name.toLowerCase();
530
-
531
- sortedStories = sortedStories.filter((stories) =>
532
- stories.name.toLowerCase().includes(storyFilter)
533
- );
534
-
535
- const sortById = sortedStories.filter((stories) =>
536
- stories.id.includes(storyFilter)
537
- );
538
-
539
- if (sortById.length > 0) {
540
- sortedStories = sortById;
541
- }
542
- }
543
-
544
- storyMenuInner = (
545
- <DataTable
546
- columns={this.getStoriesColumns()}
547
- data={sortedStories}
548
- sortBy={sortBy}
549
- noDataText={ImposiumHeader.NO_STORIES_COPY}
550
- itemsPerPage={activeOrganizationBlob.stories.length}
551
- hidePaginator={true}
552
- onRowClick={this.changeStory}
553
- keyboardNav={true}
554
- />
555
- );
556
- }
557
468
  }
558
469
 
559
470
  const orgOptions = [];
@@ -565,8 +476,6 @@ class ImposiumHeader extends React.PureComponent<IHeaderProps, IHeaderState> {
565
476
  });
566
477
  }
567
478
 
568
- const email = '';
569
- // const email = scrapeEmail(auth);
570
479
  // TODO: plug this back in
571
480
  const orgSelect = () => {
572
481
  return (
@@ -653,14 +562,18 @@ class ImposiumHeader extends React.PureComponent<IHeaderProps, IHeaderState> {
653
562
  {serviceDropdownMenu}
654
563
  </ImposiumDropdown>
655
564
 
656
- <ImposiumDropdown
657
- key='stories-dropdown'
658
- position='bottomright'
659
- show={showStoriesDropdown}
660
- toggleRef={this.storyToggleRef}
661
- onOutsideClick={() => this.closeStoriesDropDown()}>
662
- <div className='stories-menu'>{storyMenuInner}</div>
663
- </ImposiumDropdown>
565
+ {activeOrganizationBlob && (
566
+ <ProjectDropdown
567
+ api={api}
568
+ position='bottomright'
569
+ setAccessData={this.props.setAccessData}
570
+ storiesArray={activeOrganizationBlob.stories}
571
+ show={this.state.showStoriesDropdown}
572
+ onClose={() => this.setState({ showStoriesDropdown: false })}
573
+ changeStory={this.changeStory}
574
+ toggleRef={this.storyToggleRef}
575
+ />
576
+ )}
664
577
 
665
578
  <ImposiumDropdown
666
579
  key='org-dropdown'
@@ -0,0 +1,174 @@
1
+ import { useEffect, useState } from 'react';
2
+ import ImposiumDropdown from '../dropdown/Dropdown';
3
+ import StoryTableNameFilter from '../assets/StoryTableNameFilter';
4
+ import { StoryTableTotalRendersCell } from '../assets/StoryTableTotalRendersCell';
5
+ import React from 'react';
6
+ import AssetsTableDateCell from '../assets/AssetsTableDateCell';
7
+ import DataTable from '../data-table/DataTable';
8
+ import { ImposiumHeader } from '../..';
9
+ import _ from 'lodash';
10
+
11
+ interface IProjectDropdownProps {
12
+ position: any;
13
+ api: any;
14
+ toggleRef: any;
15
+ show: boolean;
16
+ storiesArray: any;
17
+ changeStory(storyRow: any): void;
18
+ setAccessData(data): void;
19
+ onClose(): void;
20
+ }
21
+
22
+ export const ProjectDropdown = (props: IProjectDropdownProps) => {
23
+ const { toggleRef, changeStory, storiesArray, show, onClose, setAccessData, api, position } =
24
+ props;
25
+
26
+ const [storyFilter, setStoryFilter] = useState({
27
+ name: ''
28
+ });
29
+ const [totalRendersLoading, setTotalRendersLoading] = useState(false);
30
+ const [order] = useState('date_modified');
31
+ const [orderDirection] = useState('desc');
32
+
33
+ if (!storiesArray) {
34
+ return null;
35
+ }
36
+
37
+ useEffect(() => {
38
+ if (show) {
39
+ setTotalRendersLoading(true);
40
+ api.getAccessData(true).then((data) => {
41
+ setAccessData(data);
42
+ setTotalRendersLoading(false);
43
+ });
44
+ }
45
+ }, [show]);
46
+
47
+ const closeProjectDropdown = () => {
48
+ setStoryFilter({
49
+ name: ''
50
+ });
51
+ onClose();
52
+ };
53
+
54
+ const getStoriesColumns = () => {
55
+ return [
56
+ {
57
+ accessor: 'name',
58
+ Header: 'Name',
59
+ width: 115,
60
+ minWidth: 115,
61
+ Search: () => (
62
+ <StoryTableNameFilter
63
+ filter={storyFilter.name}
64
+ updateFilter={setStoryFilter}
65
+ />
66
+ ),
67
+ disableSortBy: false
68
+ },
69
+ {
70
+ accessor: 'total_renders',
71
+ Header: 'Total Renders',
72
+ width: 60,
73
+ minWidth: 60,
74
+ maxWidth: 60,
75
+ disableSortBy: false,
76
+ Cell: (cell: any) => (
77
+ <StoryTableTotalRendersCell
78
+ loading={totalRendersLoading}
79
+ cell={cell}
80
+ date_created={false}
81
+ />
82
+ )
83
+ },
84
+ {
85
+ accessor: 'last_modified_by',
86
+ Header: 'Last Modified By',
87
+ width: 60,
88
+ minWidth: 60,
89
+ maxWidth: 60,
90
+ disableSortBy: true
91
+ },
92
+ {
93
+ accessor: 'date_modified',
94
+ Header: 'Last Modified',
95
+ width: 65,
96
+ minWidth: 65,
97
+ maxWidth: 65,
98
+ disableSortBy: false,
99
+ Cell: (cell: any) => (
100
+ <AssetsTableDateCell
101
+ cell={cell}
102
+ date_created={false}
103
+ />
104
+ )
105
+ },
106
+ {
107
+ accessor: 'date_created',
108
+ Header: 'Created Date',
109
+ width: 65,
110
+ minWidth: 65,
111
+ maxWidth: 65,
112
+ disableSortBy: false,
113
+ Cell: (cell: any) => (
114
+ <AssetsTableDateCell
115
+ cell={cell}
116
+ date_created={true}
117
+ />
118
+ )
119
+ }
120
+ ];
121
+ };
122
+
123
+ const sortBy =
124
+ order && orderDirection ? [{ id: order, desc: orderDirection === 'desc' }] : undefined;
125
+
126
+ let sortedStories = _.orderBy(storiesArray, ['date_modified'], ['desc']);
127
+
128
+ if (storyFilter.name) {
129
+ const storyFilterLowercase = storyFilter.name.toLowerCase();
130
+
131
+ sortedStories = sortedStories.filter((stories) =>
132
+ stories.name.toLowerCase().includes(storyFilterLowercase)
133
+ );
134
+
135
+ const sortById = sortedStories.filter((stories) =>
136
+ stories.id.includes(storyFilterLowercase)
137
+ );
138
+
139
+ if (sortById.length > 0) {
140
+ sortedStories = sortById;
141
+ }
142
+ }
143
+
144
+ const onRowClick = (r: any) => {
145
+ onClose();
146
+ changeStory(r);
147
+ };
148
+
149
+ return (
150
+ <>
151
+ <ImposiumDropdown
152
+ key='stories-dropdown'
153
+ position={position}
154
+ show={show}
155
+ toggleRef={toggleRef}
156
+ onOutsideClick={closeProjectDropdown}>
157
+ <div className='stories-menu'>
158
+ {
159
+ <DataTable
160
+ columns={getStoriesColumns()}
161
+ data={sortedStories}
162
+ sortBy={sortBy}
163
+ noDataText={ImposiumHeader.NO_STORIES_COPY}
164
+ itemsPerPage={storiesArray.length}
165
+ hidePaginator={true}
166
+ onRowClick={onRowClick}
167
+ keyboardNav={true}
168
+ />
169
+ }
170
+ </div>
171
+ </ImposiumDropdown>
172
+ </>
173
+ );
174
+ };
@@ -1,4 +1,4 @@
1
- import { ReactNode, ReactPortal } from 'react';
1
+ import { ReactPortal } from 'react';
2
2
  import { useEffect } from 'react';
3
3
  import { createPortal } from 'react-dom';
4
4
 
@@ -7,7 +7,6 @@ import { createPortal } from 'react-dom';
7
7
  // Just wrap desired element in <Portal>{YourElement}</Portal>
8
8
 
9
9
  interface IPortalProps {
10
- children: ReactNode;
11
10
  id: string;
12
11
  }
13
12
 
@@ -779,7 +779,7 @@ export const BigButton: React.FC<IBigButtonProps> = (p) => (
779
779
  </div>
780
780
  );
781
781
 
782
- export const TabContent = ({ children }) => (
782
+ export const TabContent: React.FC = ({ children }) => (
783
783
  <div className='tab-content'>
784
784
  <div className='settings-tab'>
785
785
  <div className='integration-details'>{children}</div>
@@ -876,7 +876,13 @@ const mapStateToProps = (state): any => {
876
876
  };
877
877
  };
878
878
 
879
- const CrMOptions = ({ options, onChange, errorCopy = '' }) => {
879
+ interface ICrMOptionsProps {
880
+ options: any;
881
+ onChange(options: any): void;
882
+ errorCopy: string;
883
+ }
884
+
885
+ const CrMOptions: React.FC<ICrMOptionsProps> = ({ options, onChange, errorCopy = '' }) => {
880
886
  const onInputChange = (key, val) => {
881
887
  const newOpts = { ...options };
882
888
  newOpts[key] = val;
@@ -238,6 +238,9 @@ export const integration = {
238
238
  };
239
239
 
240
240
  export const header = {
241
+ noSave: `Don't Save`,
242
+ onSave: 'Save',
243
+ checkUnsaved: 'You have unsaved changes, would you like to save and continue?',
241
244
  publishing: 'Publishing...',
242
245
  working: 'Using Working Copy',
243
246
  statusError: 'Error getting project status',
package/src/index.ts CHANGED
@@ -129,7 +129,6 @@ import {
129
129
  toFixed,
130
130
  padStart,
131
131
  parameterizeServiceUrl,
132
- scrapeEmail,
133
132
  fitToContainer,
134
133
  filterHotkeys,
135
134
  mimetypeConformsToOverlay,
@@ -139,7 +138,8 @@ import {
139
138
  formattedTime,
140
139
  getSMPTE,
141
140
  checkStoryId,
142
- IMAGE_EXTENSIONS
141
+ IMAGE_EXTENSIONS,
142
+ getOrgIdFromStory
143
143
  } from './Util';
144
144
  import PublishStatusIndicator from './components/publish-wizard/publish/PublishStatusIndicator';
145
145
  import { getMediaPreviewStyle } from './utils/assets';
@@ -159,8 +159,13 @@ import { resetStoryFilter, updateStoryFilter } from './redux/actions/story-filte
159
159
  import storyFilter from './redux/reducers/story-filter';
160
160
  import StoryTableNameFilter from './components/assets/StoryTableNameFilter';
161
161
  import { AppWrapper } from './components/app-wrapper/AppWrapper';
162
+ import { pushRoute, replaceRoute } from './utils/routing';
163
+ import { ProjectDropdown } from './components/header/ProjectDropdown';
162
164
 
163
165
  export {
166
+ ProjectDropdown,
167
+ pushRoute,
168
+ replaceRoute,
164
169
  AppWrapper,
165
170
  ImposiumHeader,
166
171
  ImposiumDropdown,
@@ -276,8 +281,8 @@ export {
276
281
  getFirstStoryInOrg,
277
282
  string2HexCode,
278
283
  parameterizeServiceUrl,
279
- scrapeEmail,
280
284
  fitToContainer,
285
+ getOrgIdFromStory,
281
286
  formattedTime,
282
287
  filterHotkeys,
283
288
  mimetypeConformsToOverlay,