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

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 (137) hide show
  1. package/dist/cjs/components/app-wrapper/AppWrapper.d.ts +24 -5
  2. package/dist/cjs/components/app-wrapper/AppWrapper.js +104 -22
  3. package/dist/cjs/components/app-wrapper/AppWrapper.js.map +1 -1
  4. package/dist/cjs/components/assets/StoryTableNameFilter.d.ts +9 -2
  5. package/dist/cjs/components/assets/StoryTableNameFilter.js +3 -13
  6. package/dist/cjs/components/assets/StoryTableNameFilter.js.map +1 -1
  7. package/dist/cjs/components/context-menu/AnimateComponent.d.ts +6 -6
  8. package/dist/cjs/components/context-menu/AnimateComponent.js.map +1 -1
  9. package/dist/cjs/components/context-menu/ContextMenu.d.ts +12 -27
  10. package/dist/cjs/components/context-menu/ContextMenu.js +2 -15
  11. package/dist/cjs/components/context-menu/ContextMenu.js.map +1 -1
  12. package/dist/cjs/components/context-menu/ContextMenuItem.d.ts +6 -18
  13. package/dist/cjs/components/context-menu/ContextMenuItem.js +2 -21
  14. package/dist/cjs/components/context-menu/ContextMenuItem.js.map +1 -1
  15. package/dist/cjs/components/context-menu/ContextMenuTrigger.d.ts +6 -16
  16. package/dist/cjs/components/context-menu/ContextMenuTrigger.js +2 -20
  17. package/dist/cjs/components/context-menu/ContextMenuTrigger.js.map +1 -1
  18. package/dist/cjs/components/context-menu/SubMenu.d.ts +4 -12
  19. package/dist/cjs/components/context-menu/SubMenu.js +2 -17
  20. package/dist/cjs/components/context-menu/SubMenu.js.map +1 -1
  21. package/dist/cjs/components/data-table/Paginator.d.ts +16 -1
  22. package/dist/cjs/components/data-table/Paginator.js +1 -1
  23. package/dist/cjs/components/data-table/Paginator.js.map +1 -1
  24. package/dist/cjs/components/font-picker/font-manager/constants.d.ts +4 -0
  25. package/dist/cjs/components/font-picker/font-manager/constants.js +5 -1
  26. package/dist/cjs/components/font-picker/font-manager/constants.js.map +1 -1
  27. package/dist/cjs/components/header/Header.d.ts +3 -5
  28. package/dist/cjs/components/header/Header.js +77 -126
  29. package/dist/cjs/components/header/Header.js.map +1 -1
  30. package/dist/cjs/components/header/ProjectDropdown.d.ts +13 -0
  31. package/dist/cjs/components/header/ProjectDropdown.js +128 -0
  32. package/dist/cjs/components/header/ProjectDropdown.js.map +1 -0
  33. package/dist/cjs/components/header/StoryDropdown.d.ts +6 -0
  34. package/dist/cjs/components/header/StoryDropdown.js +111 -0
  35. package/dist/cjs/components/header/StoryDropdown.js.map +1 -0
  36. package/dist/cjs/components/portal/Portal.d.ts +0 -2
  37. package/dist/cjs/components/portal/Portal.js.map +1 -1
  38. package/dist/cjs/components/publish-wizard/PublishWizard.d.ts +1 -3
  39. package/dist/cjs/components/publish-wizard/PublishWizard.js.map +1 -1
  40. package/dist/cjs/components/publish-wizard/publish/EmailWorkflow.js.map +1 -1
  41. package/dist/cjs/constants/copy.d.ts +3 -0
  42. package/dist/cjs/constants/copy.js +3 -0
  43. package/dist/cjs/constants/copy.js.map +1 -1
  44. package/dist/cjs/index.d.ts +3 -1
  45. package/dist/cjs/index.js +9 -3
  46. package/dist/cjs/index.js.map +1 -1
  47. package/dist/cjs/services/API.d.ts +5 -2
  48. package/dist/cjs/services/API.js +198 -75
  49. package/dist/cjs/services/API.js.map +1 -1
  50. package/dist/cjs/utils/modal.d.ts +2 -0
  51. package/dist/cjs/utils/modal.js +11 -0
  52. package/dist/cjs/utils/modal.js.map +1 -0
  53. package/dist/cjs/utils/pendo.d.ts +24 -0
  54. package/dist/cjs/utils/pendo.js +62 -0
  55. package/dist/cjs/utils/pendo.js.map +1 -0
  56. package/dist/cjs/utils/routing.d.ts +2 -0
  57. package/dist/cjs/utils/routing.js +10 -1
  58. package/dist/cjs/utils/routing.js.map +1 -1
  59. package/dist/esm/components/app-wrapper/AppWrapper.d.ts +24 -5
  60. package/dist/esm/components/app-wrapper/AppWrapper.js +97 -19
  61. package/dist/esm/components/app-wrapper/AppWrapper.js.map +1 -1
  62. package/dist/esm/components/assets/StoryTableNameFilter.d.ts +9 -2
  63. package/dist/esm/components/assets/StoryTableNameFilter.js +3 -13
  64. package/dist/esm/components/assets/StoryTableNameFilter.js.map +1 -1
  65. package/dist/esm/components/context-menu/AnimateComponent.d.ts +6 -6
  66. package/dist/esm/components/context-menu/AnimateComponent.js.map +1 -1
  67. package/dist/esm/components/context-menu/ContextMenu.d.ts +12 -27
  68. package/dist/esm/components/context-menu/ContextMenu.js +2 -4
  69. package/dist/esm/components/context-menu/ContextMenu.js.map +1 -1
  70. package/dist/esm/components/context-menu/ContextMenuItem.d.ts +6 -18
  71. package/dist/esm/components/context-menu/ContextMenuItem.js +2 -10
  72. package/dist/esm/components/context-menu/ContextMenuItem.js.map +1 -1
  73. package/dist/esm/components/context-menu/ContextMenuTrigger.d.ts +6 -16
  74. package/dist/esm/components/context-menu/ContextMenuTrigger.js +2 -9
  75. package/dist/esm/components/context-menu/ContextMenuTrigger.js.map +1 -1
  76. package/dist/esm/components/context-menu/SubMenu.d.ts +4 -12
  77. package/dist/esm/components/context-menu/SubMenu.js +2 -6
  78. package/dist/esm/components/context-menu/SubMenu.js.map +1 -1
  79. package/dist/esm/components/data-table/Paginator.d.ts +16 -1
  80. package/dist/esm/components/data-table/Paginator.js +1 -1
  81. package/dist/esm/components/data-table/Paginator.js.map +1 -1
  82. package/dist/esm/components/font-picker/font-manager/constants.d.ts +4 -0
  83. package/dist/esm/components/font-picker/font-manager/constants.js +4 -0
  84. package/dist/esm/components/font-picker/font-manager/constants.js.map +1 -1
  85. package/dist/esm/components/header/Header.d.ts +3 -5
  86. package/dist/esm/components/header/Header.js +75 -115
  87. package/dist/esm/components/header/Header.js.map +1 -1
  88. package/dist/esm/components/header/ProjectDropdown.d.ts +13 -0
  89. package/dist/esm/components/header/ProjectDropdown.js +101 -0
  90. package/dist/esm/components/header/ProjectDropdown.js.map +1 -0
  91. package/dist/esm/components/header/StoryDropdown.d.ts +6 -0
  92. package/dist/esm/components/header/StoryDropdown.js +82 -0
  93. package/dist/esm/components/header/StoryDropdown.js.map +1 -0
  94. package/dist/esm/components/portal/Portal.d.ts +0 -2
  95. package/dist/esm/components/portal/Portal.js.map +1 -1
  96. package/dist/esm/components/publish-wizard/PublishWizard.d.ts +1 -3
  97. package/dist/esm/components/publish-wizard/PublishWizard.js.map +1 -1
  98. package/dist/esm/components/publish-wizard/publish/EmailWorkflow.js.map +1 -1
  99. package/dist/esm/constants/copy.d.ts +3 -0
  100. package/dist/esm/constants/copy.js +3 -0
  101. package/dist/esm/constants/copy.js.map +1 -1
  102. package/dist/esm/index.d.ts +3 -1
  103. package/dist/esm/index.js +3 -1
  104. package/dist/esm/index.js.map +1 -1
  105. package/dist/esm/services/API.d.ts +5 -2
  106. package/dist/esm/services/API.js +43 -18
  107. package/dist/esm/services/API.js.map +1 -1
  108. package/dist/esm/utils/modal.d.ts +2 -0
  109. package/dist/esm/utils/modal.js +7 -0
  110. package/dist/esm/utils/modal.js.map +1 -0
  111. package/dist/esm/utils/pendo.d.ts +24 -0
  112. package/dist/esm/utils/pendo.js +52 -0
  113. package/dist/esm/utils/pendo.js.map +1 -0
  114. package/dist/esm/utils/routing.d.ts +2 -0
  115. package/dist/esm/utils/routing.js +7 -0
  116. package/dist/esm/utils/routing.js.map +1 -1
  117. package/package.json +3 -1
  118. package/src/components/app-wrapper/AppWrapper.tsx +155 -26
  119. package/src/components/assets/StoryTableNameFilter.tsx +6 -22
  120. package/src/components/context-menu/AnimateComponent.tsx +12 -1
  121. package/src/components/context-menu/ContextMenu.tsx +16 -8
  122. package/src/components/context-menu/ContextMenuItem.tsx +12 -11
  123. package/src/components/context-menu/ContextMenuTrigger.tsx +12 -10
  124. package/src/components/context-menu/SubMenu.tsx +6 -8
  125. package/src/components/data-table/Paginator.tsx +19 -6
  126. package/src/components/font-picker/font-manager/constants.ts +5 -0
  127. package/src/components/header/Header.tsx +103 -190
  128. package/src/components/header/ProjectDropdown.tsx +174 -0
  129. package/src/components/portal/Portal.tsx +1 -2
  130. package/src/components/publish-wizard/PublishWizard.tsx +1 -1
  131. package/src/components/publish-wizard/publish/EmailWorkflow.tsx +7 -1
  132. package/src/constants/copy.ts +3 -0
  133. package/src/index.ts +5 -0
  134. package/src/services/API.ts +51 -20
  135. package/src/utils/modal.ts +9 -0
  136. package/src/utils/pendo.ts +61 -0
  137. package/src/utils/routing.ts +10 -0
@@ -4,9 +4,21 @@ import { registerEvent, callHideEvent } from './registerEvent';
4
4
  import AnimateComponent from './AnimateComponent';
5
5
  import { throttle } from './helper';
6
6
 
7
- const ContextMenu = ({
8
- children,
7
+ interface IContextMenuProps {
8
+ id: string;
9
+ appendTo: string;
10
+ hideOnLeave?: boolean;
11
+ onMouseLeave?: (e: any) => void;
12
+ onHide?: () => void;
13
+ onShow?: () => void;
14
+ preventHideOnScroll?: boolean;
15
+ preventHideOnResize?: boolean;
16
+ animation?: string;
17
+ }
18
+
19
+ const ContextMenu: React.FC<IContextMenuProps> = ({
9
20
  id,
21
+ children,
10
22
  appendTo,
11
23
  hideOnLeave,
12
24
  onMouseLeave,
@@ -14,7 +26,6 @@ const ContextMenu = ({
14
26
  onShow,
15
27
  preventHideOnScroll,
16
28
  preventHideOnResize,
17
- attributes,
18
29
  animation
19
30
  }) => {
20
31
  const contextMenuEl = useRef(null);
@@ -116,7 +127,7 @@ const ContextMenu = ({
116
127
  }
117
128
  }, [isVisible, clientPosition]);
118
129
 
119
- const childrenWithProps = React.Children.map(children, (child) =>
130
+ const childrenWithProps = React.Children.map(children, (child: any) =>
120
131
  React.cloneElement(child, { id })
121
132
  );
122
133
 
@@ -126,8 +137,7 @@ const ContextMenu = ({
126
137
  className={`contextmenu`}
127
138
  ref={contextMenuEl}
128
139
  style={{ top, left }}
129
- onMouseLeave={handleMouseLeave}
130
- {...attributes}>
140
+ onMouseLeave={handleMouseLeave}>
131
141
  {childrenWithProps}
132
142
  </div>
133
143
  );
@@ -168,8 +178,6 @@ ContextMenu.defaultProps = {
168
178
  hideOnLeave: false,
169
179
  preventHideOnResize: false,
170
180
  preventHideOnScroll: false,
171
- attributes: {},
172
- className: '',
173
181
  animation: 'fade',
174
182
  onMouseLeave: () => null,
175
183
  onHide: () => null,
@@ -1,7 +1,18 @@
1
1
  import React, { useCallback, useRef } from 'react';
2
2
  import { callHideEvent } from './registerEvent';
3
3
 
4
- const ContextMenuItem = ({ children, onClick, disabled, preventClose, attributes, className }) => {
4
+ interface IContextMenuItemProps {
5
+ onClick?(e: React.MouseEvent): void;
6
+ disabled?: boolean;
7
+ preventClose?: boolean;
8
+ }
9
+
10
+ const ContextMenuItem: React.FC<IContextMenuItemProps> = ({
11
+ children,
12
+ onClick,
13
+ disabled,
14
+ preventClose
15
+ }) => {
5
16
  const contextMenuItem = useRef(null);
6
17
 
7
18
  const handleClickEvent = useCallback((e) => {
@@ -15,7 +26,6 @@ const ContextMenuItem = ({ children, onClick, disabled, preventClose, attributes
15
26
  <div
16
27
  className={`${disabled ? 'contextmenu__item--disabled' : 'contextmenu__item'}`}
17
28
  onClick={handleClickEvent}
18
- {...attributes}
19
29
  ref={contextMenuItem}>
20
30
  {children}
21
31
  </div>
@@ -23,12 +33,3 @@ const ContextMenuItem = ({ children, onClick, disabled, preventClose, attributes
23
33
  };
24
34
 
25
35
  export default ContextMenuItem;
26
-
27
- ContextMenuItem.defaultProps = {
28
- disabled: false,
29
- preventClose: false,
30
- attributes: {},
31
- className: '',
32
- onClick: () => null,
33
- onItemHover: () => null
34
- };
@@ -1,7 +1,18 @@
1
1
  import React, { useRef, useCallback } from 'react';
2
2
  import { callShowEvent, callHideEvent } from './registerEvent';
3
3
 
4
- const ContextMenuTrigger = ({ children, id, disableWhileShiftPressed, attributes, disable }) => {
4
+ interface IContextMenuTriggerProps {
5
+ id: string;
6
+ disableWhileShiftPressed?: boolean;
7
+ disable?: boolean;
8
+ }
9
+
10
+ const ContextMenuTrigger: React.FC<IContextMenuTriggerProps> = ({
11
+ children,
12
+ id,
13
+ disableWhileShiftPressed,
14
+ disable
15
+ }) => {
5
16
  const menuTrigger = useRef(null);
6
17
 
7
18
  const handleContextMenu = useCallback((e) => {
@@ -29,7 +40,6 @@ const ContextMenuTrigger = ({ children, id, disableWhileShiftPressed, attributes
29
40
  <div
30
41
  className='menu-trigger'
31
42
  ref={menuTrigger}
32
- {...attributes}
33
43
  onContextMenu={(e) => handleContextMenu(e)}>
34
44
  {children}
35
45
  </div>
@@ -37,11 +47,3 @@ const ContextMenuTrigger = ({ children, id, disableWhileShiftPressed, attributes
37
47
  };
38
48
 
39
49
  export default ContextMenuTrigger;
40
-
41
- ContextMenuTrigger.defaultProps = {
42
- attributes: {},
43
- disable: false,
44
- renderTag: 'div',
45
- disableWhileShiftPressed: false,
46
- className: ''
47
- };
@@ -1,7 +1,11 @@
1
1
  import React, { useCallback, useState, useRef } from 'react';
2
2
  import ContextMenuItem from './ContextMenuItem';
3
3
 
4
- const Submenu = ({ children, title, attributes, className }) => {
4
+ interface ISubmenuProps {
5
+ title: string;
6
+ }
7
+
8
+ const Submenu: React.FC<ISubmenuProps> = ({ children, title }) => {
5
9
  const [submenuStyle, setSubmenuStyle] = useState(null);
6
10
  const submenuEl = useRef(null);
7
11
  const submenuItem = useRef(null);
@@ -49,8 +53,7 @@ const Submenu = ({ children, title, attributes, className }) => {
49
53
  onMouseOut={() => hideSubmenu()}
50
54
  onFocus={() => null}
51
55
  onBlur={() => null}
52
- ref={submenuItem}
53
- {...attributes}>
56
+ ref={submenuItem}>
54
57
  <ContextMenuItem>{title}</ContextMenuItem>
55
58
  <div
56
59
  className='submenu__item'
@@ -63,8 +66,3 @@ const Submenu = ({ children, title, attributes, className }) => {
63
66
  };
64
67
 
65
68
  export default Submenu;
66
-
67
- Submenu.defaultProps = {
68
- title: 'Sub Menu',
69
- className: ''
70
- };
@@ -11,27 +11,40 @@ import {
11
11
  import { assets as copy } from '../../constants/copy';
12
12
  let textInputTimeout: number;
13
13
 
14
- const Paginator: React.FC<any> = ({
15
- manualPagination,
14
+ interface IPaginatorProps {
15
+ pageCount: number;
16
+ pageIndex: number;
17
+ pageSize: number;
18
+ pageOptions: any;
19
+ totalItems: number;
20
+ canPreviousPage: boolean;
21
+ canNextPage: boolean;
22
+ gotoPage: (page: number, pageSize: number) => void;
23
+ previousPage: () => void;
24
+ nextPage: () => void;
25
+ setPageSize: (size: number) => void;
26
+ itemsPerPage: number;
27
+ onItemsPerPage: (size: number) => void;
28
+ }
29
+
30
+ const Paginator: React.FC<IPaginatorProps> = ({
16
31
  pageCount,
17
32
  pageIndex,
18
33
  pageSize,
19
- pageOptions,
20
34
  totalItems,
21
35
  canPreviousPage,
22
36
  canNextPage,
23
37
  gotoPage,
24
38
  previousPage,
25
39
  nextPage,
26
- setPageSize,
27
40
  itemsPerPage,
28
41
  onItemsPerPage
29
42
  }) => {
30
43
  const [getPageIndex, setPageIndex] = React.useState<number>(pageIndex);
31
44
  const [getItemsPerPage, setItemsPerPage] = React.useState<number>(itemsPerPage);
32
45
  const [getPageCount, setPageCount] = React.useState<number>(pageCount);
33
- const [inputPageIndex, setInputPageIndex] = React.useState<string>('');
34
- const [inputItemsPerPage, setInputItemsPerPage] = React.useState<string>('');
46
+ const [inputPageIndex, setInputPageIndex] = React.useState<any>('');
47
+ const [inputItemsPerPage, setInputItemsPerPage] = React.useState<any>('');
35
48
 
36
49
  React.useEffect(() => {
37
50
  if (pageCount === 0) {
@@ -5,3 +5,8 @@ export const LIST_BASE_URL = 'https://www.googleapis.com/webfonts/v1/webfonts';
5
5
  export const FONT_FACE_REGEX = /@font-face {([\s\S]*?)}/gm;
6
6
 
7
7
  export const FONT_FAMILY_DEFAULT = 'Open Sans';
8
+
9
+ export const API_AUTH_TYPES = {
10
+ TOKEN: 'TOKEN',
11
+ ACCESS_KEY: 'ACCESS_KEY'
12
+ };
@@ -9,29 +9,29 @@ 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 {
25
24
  auth0: any;
26
25
  api: IImposiumAPI;
26
+ errorState?: string;
27
27
  activeServiceId: string;
28
28
  activeOrganization: string;
29
29
  activeStory?: string;
30
30
  hideStoryPicker?: boolean;
31
31
  hideOrgPicker?: boolean;
32
32
  setAccessData(access: any): void;
33
- onOrganizationChange?: (orgId: string, storyId: string) => any;
34
- onStoryChange?: (story: any) => any;
33
+ unsavedChanges: boolean;
34
+ saveStory();
35
35
  onLogout();
36
36
  additionalButtons?: any[];
37
37
  CrMLink?: string;
@@ -53,9 +53,6 @@ export interface IHeaderState {
53
53
  showServiceDropdown: boolean;
54
54
  dropdownToggleColor: string;
55
55
  activeFirstChar: string;
56
- order: string;
57
- orderDirection: string;
58
- totalRendersLoading: boolean;
59
56
  }
60
57
 
61
58
  class ImposiumHeader extends React.PureComponent<IHeaderProps, IHeaderState> {
@@ -104,10 +101,7 @@ class ImposiumHeader extends React.PureComponent<IHeaderProps, IHeaderState> {
104
101
  showStoriesDropdown: false,
105
102
  showServiceDropdown: false,
106
103
  dropdownToggleColor: ImposiumHeader.DEFAULT_ACCOUNT_TOGGLE_COLOR,
107
- activeFirstChar: '',
108
- order: 'date_modified',
109
- orderDirection: 'desc',
110
- totalRendersLoading: false
104
+ activeFirstChar: ''
111
105
  };
112
106
 
113
107
  this.serviceToggleRef = React.createRef();
@@ -165,42 +159,80 @@ class ImposiumHeader extends React.PureComponent<IHeaderProps, IHeaderState> {
165
159
  });
166
160
  };
167
161
 
168
- private closeStoriesDropDown() {
169
- this.setState({ showStoriesDropdown: false }, () =>
170
- this.props.updateStoryFilter({ name: '' })
171
- );
172
- }
173
-
174
162
  private changeStory = (story: any): void => {
175
- const { onStoryChange, activeOrganization, api, activeServiceId } = this.props;
163
+ const { activeOrganization, api, activeServiceId, unsavedChanges } = this.props;
176
164
 
177
- if (typeof onStoryChange === 'function') {
178
- onStoryChange(story);
165
+ const changeStory = () => {
166
+ pushRoute(`/${activeOrganization}/${story.id}`);
179
167
  api.cacheActiveStory(activeServiceId, activeOrganization, story.id);
180
- this.closeStoriesDropDown();
168
+ };
169
+
170
+ if (unsavedChanges) {
171
+ const onYes = () => {
172
+ if (this.props.saveStory) {
173
+ this.props.saveStory();
174
+ }
175
+ changeStory();
176
+ };
177
+
178
+ openConfirmModal({
179
+ showCancel: true,
180
+ noLabel: header.noSave,
181
+ onNo: () => changeStory(),
182
+ yesLabel: header.onSave,
183
+ onYes: () => onYes(),
184
+ title: header.checkUnsaved
185
+ });
186
+ } else {
187
+ changeStory();
181
188
  }
182
189
  };
183
190
 
184
191
  private toggleAccountDropdown = (toggle: boolean, orgId: string = ''): void => {
185
- const { onOrganizationChange, api, activeServiceId } = this.props;
192
+ const { api, activeServiceId, unsavedChanges } = this.props;
186
193
  if (toggle) {
187
194
  this.setState({ showAccountDropdown: true });
188
195
  } else {
189
196
  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);
197
+
198
+ if (orgId) {
199
+ const lastModified = getLastModifiedStoryInOrg(orgId, this.props.access);
200
+ const changeOrg = () => {
201
+ let storyId = lastModified;
202
+ api.getCachedStoryForOrg(activeServiceId, orgId)
203
+ .then((res) => {
204
+ storyId = res.story_id ? res.story_id : lastModified;
205
+ if (storyId) {
206
+ pushRoute(`/${orgId}/${storyId}`);
207
+ api.cacheActiveStory(activeServiceId, orgId, storyId);
208
+ } else {
209
+ pushRoute(`/${orgId}`);
210
+ }
211
+ })
212
+ .catch((e) => {
213
+ console.error('Error getting cached storyID for Org');
214
+ pushRoute(`/${orgId}/${storyId}`);
215
+ api.cacheActiveStory(activeServiceId, orgId, storyId);
216
+ });
217
+ };
218
+
219
+ if (unsavedChanges) {
220
+ const onYes = () => {
221
+ this.props.saveStory();
222
+ changeOrg();
223
+ };
224
+
225
+ openConfirmModal({
226
+ showCancel: true,
227
+ noLabel: header.noSave,
228
+ onNo: () => changeOrg(),
229
+ yesLabel: header.onSave,
230
+ onYes: () => onYes(),
231
+ title: header.checkUnsaved
202
232
  });
203
- api.cacheActiveStory(activeServiceId, orgId, storyId);
233
+ } else {
234
+ changeOrg();
235
+ }
204
236
  }
205
237
  }
206
238
  };
@@ -254,70 +286,6 @@ class ImposiumHeader extends React.PureComponent<IHeaderProps, IHeaderState> {
254
286
  </div>
255
287
  );
256
288
 
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
289
  public render() {
322
290
  const {
323
291
  activeOrganization,
@@ -330,7 +298,8 @@ class ImposiumHeader extends React.PureComponent<IHeaderProps, IHeaderState> {
330
298
  hideDocs,
331
299
  access,
332
300
  api,
333
- access: { organizations }
301
+ access: { organizations },
302
+ errorState
334
303
  } = this.props;
335
304
  const {
336
305
  showAccountDropdown,
@@ -339,9 +308,7 @@ class ImposiumHeader extends React.PureComponent<IHeaderProps, IHeaderState> {
339
308
  activeOrganizationBlob,
340
309
  activeFirstChar,
341
310
  dropdownToggleColor,
342
- showServiceDropdown,
343
- order,
344
- orderDirection
311
+ showServiceDropdown
345
312
  } = this.state;
346
313
 
347
314
  let currentStory: any;
@@ -352,9 +319,6 @@ class ImposiumHeader extends React.PureComponent<IHeaderProps, IHeaderState> {
352
319
  let privateAnchors: JSX.Element[];
353
320
  let accountDropdownToggle: JSX.Element;
354
321
  let storyToggle: JSX.Element;
355
- let storyMenuInner: JSX.Element = (
356
- <div className='no-stories-dialog'>{ImposiumHeader.NO_STORIES_COPY}</div>
357
- );
358
322
  let serviceDropdownToggle: JSX.Element;
359
323
  let serviceDropdownMenu: JSX.Element;
360
324
 
@@ -438,21 +402,22 @@ class ImposiumHeader extends React.PureComponent<IHeaderProps, IHeaderState> {
438
402
  </div>
439
403
  );
440
404
 
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
- );
405
+ serviceDropdownToggle =
406
+ errorState !== APP_WRAPPER_ERROR_STATES.UNAUTHORIZED_ORG ? (
407
+ <button
408
+ id='btn-toggle-services'
409
+ className='btn-toggle-services'
410
+ style={serviceDropdownColor}
411
+ ref={this.serviceToggleRef}
412
+ onClick={() =>
413
+ this.setState({ showServiceDropdown: !this.state.showServiceDropdown })
414
+ }>
415
+ <span>
416
+ {activeService ? activeService.name : ImposiumHeader.SERVICE_MESH_ALIAS}
417
+ </span>
418
+ {this.renderDropdownChevron(showServiceDropdown)}
419
+ </button>
420
+ ) : null;
456
421
 
457
422
  accountDropdownToggle =
458
423
  !hideOrgPicker && access.organizations.length > 0 ? (
@@ -486,21 +451,7 @@ class ImposiumHeader extends React.PureComponent<IHeaderProps, IHeaderState> {
486
451
  className='btn-toggle-story'
487
452
  ref={this.storyToggleRef}
488
453
  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
- });
454
+ this.setState({ showStoriesDropdown: !showStoriesDropdown });
504
455
  }}>
505
456
  <div className='story-name'>
506
457
  {currentStory
@@ -512,48 +463,6 @@ class ImposiumHeader extends React.PureComponent<IHeaderProps, IHeaderState> {
512
463
  {this.renderDropdownChevron(showStoriesDropdown)}
513
464
  </button>
514
465
  );
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
466
  }
558
467
 
559
468
  const orgOptions = [];
@@ -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'