@rh-support/manage 1.0.30 → 1.0.32

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.
@@ -1 +1 @@
1
- {"version":3,"file":"ManageTab.d.ts","sourceRoot":"","sources":["../../src/ManageTab.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAIxD,UAAU,MAAM;IACZ,GAAG,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;CAC7B;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,eAYtC"}
1
+ {"version":3,"file":"ManageTab.d.ts","sourceRoot":"","sources":["../../src/ManageTab.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGxD,UAAU,MAAM;IACZ,GAAG,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;CAC7B;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,eAkBtC"}
@@ -1,11 +1,12 @@
1
1
  import { ErrorBoundary } from '@rh-support/components';
2
2
  import React from 'react';
3
- import { Trans } from 'react-i18next';
3
+ import { Trans, useTranslation } from 'react-i18next';
4
4
  export function ManageTab(props) {
5
5
  const tab = props.tab;
6
+ const { t } = useTranslation();
6
7
  return (React.createElement(React.Fragment, null,
7
8
  React.createElement("pfe-tab", { role: "heading", slot: "tab", "data-tracking-id": tab['data-tracking-id'], onClick: tab.onClick },
8
9
  React.createElement(Trans, null, tab.title)),
9
10
  React.createElement("pfe-tab-panel", { role: "region", slot: "panel" },
10
- React.createElement(ErrorBoundary, { isPageLevelError: true }, tab.component))));
11
+ React.createElement(ErrorBoundary, { errorMsgInfo: t('There was an error loading manage tab. Please try refreshing the page.'), isPageLevelError: true }, tab.component))));
11
12
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AddEditBookmarkModal.d.ts","sourceRoot":"","sources":["../../../../src/components/ManageBookmarkedAccountsTab/AddEditBookmarkModal.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAStD,UAAU,MAAM;IACZ,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,MAAM,EAAE,CAAC,gBAAgB,EAAE,SAAS,EAAE,EAAE,aAAa,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACxE,gBAAgB,EAAE,SAAS,EAAE,CAAC;IAC9B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,uBAAuB,EAAE,SAAS,EAAE,CAAC;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,oBAAoB,UAAW,MAAM,gBAmIjD,CAAC"}
1
+ {"version":3,"file":"AddEditBookmarkModal.d.ts","sourceRoot":"","sources":["../../../../src/components/ManageBookmarkedAccountsTab/AddEditBookmarkModal.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAStD,UAAU,MAAM;IACZ,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,MAAM,EAAE,CAAC,gBAAgB,EAAE,SAAS,EAAE,EAAE,aAAa,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACxE,gBAAgB,EAAE,SAAS,EAAE,CAAC;IAC9B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,uBAAuB,EAAE,SAAS,EAAE,CAAC;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,oBAAoB,UAAW,MAAM,gBA2IjD,CAAC"}
@@ -10,6 +10,14 @@ export const AddEditBookmarkModal = (props) => {
10
10
  const [localSelectedBookmarks, setLocalSelectedBookmarks] = useState([]);
11
11
  const [isInValid, setIsInValid] = useState(false);
12
12
  const [saveButtonIsClicked, setSaveButtonIsClicked] = useState(false);
13
+ const [isPresentInGroups, setIsPresentInGroups] = useState(false);
14
+ const checkBookmarkPresent = () => {
15
+ if (!(props === null || props === void 0 ? void 0 : props.groups) || !(props === null || props === void 0 ? void 0 : props.selectedAccounts[0])) {
16
+ return false;
17
+ }
18
+ const firstSelectedGroup = props.selectedAccounts[0].bookmarkGroupName;
19
+ return props.groups.some((b) => b === selectedGroup && selectedGroup !== firstSelectedGroup);
20
+ };
13
21
  // only check if save button has been clicked once
14
22
  const checkIsInvalid = (group, selectedAccounts) => {
15
23
  const isInvalid = isEmpty(group === null || group === void 0 ? void 0 : group.trim()) || selectedAccounts.length === 0;
@@ -17,28 +25,34 @@ export const AddEditBookmarkModal = (props) => {
17
25
  };
18
26
  const resetModal = () => {
19
27
  setIsInValid(false);
28
+ setIsPresentInGroups(false);
20
29
  setSaveButtonIsClicked(false);
21
30
  };
22
31
  const save = () => {
23
32
  setSaveButtonIsClicked(true);
24
- if (isEmpty(selectedGroup === null || selectedGroup === void 0 ? void 0 : selectedGroup.trim()) || localSelectedBookmarks.length === 0) {
33
+ let isInvalid = isEmpty(selectedGroup === null || selectedGroup === void 0 ? void 0 : selectedGroup.trim()) || localSelectedBookmarks.length === 0;
34
+ //check if there is already a bookmark with this name
35
+ if (checkBookmarkPresent()) {
36
+ isInvalid = true;
37
+ setIsPresentInGroups(true);
38
+ }
39
+ else {
40
+ setIsPresentInGroups(false);
41
+ }
42
+ if (isInvalid) {
25
43
  setIsInValid(true);
26
44
  return;
27
45
  }
28
46
  resetModal();
29
47
  props.onSave(localSelectedBookmarks, selectedGroup === null || selectedGroup === void 0 ? void 0 : selectedGroup.trim());
30
48
  };
31
- const remove = () => {
32
- props.onRemove(selectedGroup);
33
- resetModal();
34
- props.onClose();
35
- };
36
49
  const close = () => {
37
50
  resetModal();
38
51
  props.onClose();
39
52
  };
40
53
  const onGroupInputBoxChanged = (group) => {
41
54
  setSelectedGroup(group);
55
+ setIsPresentInGroups(false);
42
56
  saveButtonIsClicked && checkIsInvalid(group, localSelectedBookmarks);
43
57
  };
44
58
  const onBookMarkAccountSelected = (selected) => {
@@ -56,19 +70,18 @@ export const AddEditBookmarkModal = (props) => {
56
70
  isEqual(props.selectedAccounts.map((a) => a.accountNumber).sort(), localSelectedBookmarks.map((a) => a.accountNumber).sort()) &&
57
71
  selectedGroup === ((_a = props.selectedAccounts[0]) === null || _a === void 0 ? void 0 : _a.bookmarkGroupName));
58
72
  };
59
- return (React.createElement(Modal, { id: "Add-edit-bookmark-modal", className: "pf-modal-overflow-visible", title: props.title, "aria-describedby": "Add-edit-bookmark-modal", isOpen: props.isOpen, onClose: props.onClose, showClose: true, onEscapePress: props.onClose, variant: ModalVariant.medium, actions: [
73
+ return (React.createElement(Modal, { id: "Add-edit-bookmark-modal", className: "pf-modal-overflow-visible", title: props.title, "aria-describedby": "Add-edit-bookmark-modal", isOpen: props.isOpen, onClose: close, showClose: true, onEscapePress: props.onClose, variant: ModalVariant.medium, actions: [
60
74
  React.createElement(Button, { key: "save", variant: ButtonVariant.primary, onClick: save, isDisabled: isInValid || isNothingIsChangedOnEditMode() },
61
75
  React.createElement(Trans, null, "Save")),
62
76
  React.createElement(Button, { key: "cancel", variant: props.addMode ? ButtonVariant.link : ButtonVariant.secondary, onClick: close },
63
77
  React.createElement(Trans, null, "Cancel")),
64
- !props.addMode && (React.createElement(Button, { key: "remove", variant: ButtonVariant.link, onClick: remove, isDisabled: !props.groups.includes(selectedGroup), style: props.groups.includes(selectedGroup) ? { color: '#a30000' } : {} },
65
- React.createElement(Trans, null, "Remove"))),
66
78
  ] },
67
79
  React.createElement("div", null,
68
80
  React.createElement("div", { className: "pf-u-mb-lg" },
81
+ React.createElement(BookmarkGroupSelector, { selectedGroup: selectedGroup, groups: props.groups, onGroupInputBoxChanged: onGroupInputBoxChanged, isInValid: isInValid && (isPresentInGroups || isEmpty(selectedGroup === null || selectedGroup === void 0 ? void 0 : selectedGroup.trim())), setIsInValid: setIsInValid, isPresentInGroups: isPresentInGroups })),
82
+ React.createElement("div", null,
69
83
  React.createElement("label", { id: "add-bookmark-account-on-add-modal" },
70
84
  React.createElement(Trans, null, "Account(s)"),
71
85
  React.createElement("span", { className: "form-required", "aria-hidden": true }, "*")),
72
- React.createElement(BookmarkAccountSelector, { defaultSelected: props.selectedAccounts, labelId: "add-bookmark-account-on-add-modal", bookmarkedGroupAccounts: props.bookmarkedGroupAccounts, onBookMarkAccountSelected: onBookMarkAccountSelected, addMode: props.addMode, isInValid: isInValid && isEmpty(localSelectedBookmarks) })),
73
- React.createElement(BookmarkGroupSelector, { selectedGroup: selectedGroup, groups: props.groups, onGroupInputBoxChanged: onGroupInputBoxChanged, isInValid: isInValid && isEmpty(selectedGroup === null || selectedGroup === void 0 ? void 0 : selectedGroup.trim()) }))));
86
+ React.createElement(BookmarkAccountSelector, { defaultSelected: props.selectedAccounts, labelId: "add-bookmark-account-on-add-modal", bookmarkedGroupAccounts: props.bookmarkedGroupAccounts, onBookMarkAccountSelected: onBookMarkAccountSelected, addMode: props.addMode, isInValid: isInValid && isEmpty(localSelectedBookmarks) })))));
74
87
  };
@@ -1 +1 @@
1
- {"version":3,"file":"BookmarkAccountSelector.d.ts","sourceRoot":"","sources":["../../../../src/components/ManageBookmarkedAccountsTab/BookmarkAccountSelector.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAGhF,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAUtD,UAAU,MAAM;IACZ,uBAAuB,EAAE,SAAS,EAAE,CAAC;IACrC,iBAAiB,CAAC,EAAE,kBAAkB,CAAC;IACvC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,yBAAyB,CAAC,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,IAAI,CAAC;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,SAAS,EAAE,CAAC;IAC9B,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,eAyPpD;yBAzPe,uBAAuB"}
1
+ {"version":3,"file":"BookmarkAccountSelector.d.ts","sourceRoot":"","sources":["../../../../src/components/ManageBookmarkedAccountsTab/BookmarkAccountSelector.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAGhF,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAUtD,UAAU,MAAM;IACZ,uBAAuB,EAAE,SAAS,EAAE,CAAC;IACrC,iBAAiB,CAAC,EAAE,kBAAkB,CAAC;IACvC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,yBAAyB,CAAC,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,IAAI,CAAC;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,SAAS,EAAE,CAAC;IAC9B,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,eAwPpD;yBAxPe,uBAAuB"}
@@ -103,16 +103,16 @@ export function BookmarkAccountSelector(props) {
103
103
  })
104
104
  .map((a) => a.accountNumber)) ||
105
105
  [];
106
- const removeAccountChip = (removedAccount) => {
106
+ const removeAccountLabel = (removedAccount) => {
107
107
  const updatedSelectedAccounts = remove(selected, (account) => account.accountNumber !== removedAccount.accountNumber);
108
108
  setSelected(updatedSelectedAccounts);
109
109
  props.onBookMarkAccountSelected(updatedSelectedAccounts);
110
110
  };
111
111
  const labelGroupComponent = () => {
112
- return (React.createElement(LabelGroup, { numLabels: 2 }, (selected || []).map((currentChip) => (React.createElement(Label, { key: currentChip.accountNumber, onClose: () => removeAccountChip(currentChip), isTruncated: false, color: "cyan" },
113
- currentChip.name,
112
+ return (React.createElement(LabelGroup, { numLabels: 2 }, (selected || []).map((currentLabel) => (React.createElement(Label, { key: currentLabel.accountNumber, onClose: () => removeAccountLabel(currentLabel), isTruncated: false, color: "cyan" },
113
+ currentLabel.name,
114
114
  " (",
115
- currentChip.accountNumber,
115
+ currentLabel.accountNumber,
116
116
  ")")))));
117
117
  };
118
118
  useEffect(() => {
@@ -1,8 +1,11 @@
1
+ import React from 'react';
1
2
  interface IProps {
2
3
  groups: string[];
3
4
  onGroupInputBoxChanged: (group: string) => void;
4
5
  selectedGroup: string;
5
6
  isInValid: boolean;
7
+ setIsInValid: React.Dispatch<React.SetStateAction<boolean>>;
8
+ isPresentInGroups: boolean;
6
9
  }
7
10
  declare const BookmarkGroupSelector: (props: IProps) => JSX.Element;
8
11
  export { BookmarkGroupSelector };
@@ -1 +1 @@
1
- {"version":3,"file":"BookmarkGroupSelector.d.ts","sourceRoot":"","sources":["../../../../src/components/ManageBookmarkedAccountsTab/BookmarkGroupSelector.tsx"],"names":[],"mappings":"AAKA,UAAU,MAAM;IACZ,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,sBAAsB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;CACtB;AAED,QAAA,MAAM,qBAAqB,UAAW,MAAM,gBAsE3C,CAAC;AAEF,OAAO,EAAE,qBAAqB,EAAE,CAAC"}
1
+ {"version":3,"file":"BookmarkGroupSelector.d.ts","sourceRoot":"","sources":["../../../../src/components/ManageBookmarkedAccountsTab/BookmarkGroupSelector.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAGnD,UAAU,MAAM;IACZ,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,sBAAsB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5D,iBAAiB,EAAE,OAAO,CAAC;CAC9B;AAED,QAAA,MAAM,qBAAqB,UAAW,MAAM,gBAkD3C,CAAC;AAEF,OAAO,EAAE,qBAAqB,EAAE,CAAC"}
@@ -1,27 +1,11 @@
1
- import { Select, SelectOption, SelectVariant } from '@patternfly/react-core';
1
+ import { Form, FormGroup, TextInput } from '@patternfly/react-core';
2
2
  import React, { useEffect, useState } from 'react';
3
3
  import { Trans, useTranslation } from 'react-i18next';
4
4
  const BookmarkGroupSelector = (props) => {
5
5
  const { t } = useTranslation();
6
- const [isOpen, setIsOpen] = useState(false);
7
6
  const [validated, setValidated] = useState('default');
8
- const onToggle = (isOpen) => {
9
- setIsOpen(isOpen);
10
- };
11
- const onSelect = (event, selection, isPlaceholder) => {
12
- if (isPlaceholder)
13
- clearSelection();
14
- else {
15
- setIsOpen(false);
16
- props.onGroupInputBoxChanged(selection);
17
- }
18
- };
19
- const onCreateOption = (newValue) => {
20
- props.onGroupInputBoxChanged(newValue);
21
- };
22
- const clearSelection = () => {
23
- setIsOpen(false);
24
- props.onGroupInputBoxChanged('');
7
+ const onInputSave = (value) => {
8
+ props.onGroupInputBoxChanged(value);
25
9
  };
26
10
  useEffect(() => {
27
11
  if (props.isInValid) {
@@ -31,13 +15,15 @@ const BookmarkGroupSelector = (props) => {
31
15
  setValidated('default');
32
16
  }
33
17
  }, [props.isInValid]);
34
- const titleId = 'group-name-select';
18
+ const titleId = 'group-name-input';
35
19
  return (React.createElement(React.Fragment, null,
36
20
  React.createElement("label", { id: titleId },
37
21
  React.createElement(Trans, null, "Bookmark name"),
38
22
  React.createElement("span", { className: "form-required", "aria-hidden": true }, "*")),
39
- React.createElement(Select, { variant: SelectVariant.typeahead, typeAheadAriaLabel: t('Search for existing bookmarks or create a new one'), onToggle: onToggle, onSelect: onSelect, onClear: clearSelection, selections: props.selectedGroup, isOpen: isOpen, placeholderText: t('Search for existing bookmarks or create a new one'), isCreatable: true, noValidate: props.isInValid, onCreateOption: onCreateOption, "aria-labelledby": titleId, "aria-invalid": props.isInValid, "aria-describedby": "validated-helper", validated: validated }, props.groups.map((option, index) => (React.createElement(SelectOption, { key: index, value: option })))),
40
- React.createElement("p", { id: "validated-helper", className: `form-instructions ${props.isInValid ? 'form-invalid' : ''}` },
41
- React.createElement(Trans, null, "Enter a unique name to create a new bookmark or add accounts to an existing one."))));
23
+ React.createElement(Form, null,
24
+ React.createElement(FormGroup, { helperTextInvalid: props.isPresentInGroups
25
+ ? t('A bookmark with this name already exists')
26
+ : t('Add a name to your bookmark'), validated: validated },
27
+ React.createElement(TextInput, { value: props.selectedGroup, onChange: onInputSave, placeholder: t('Enter a unique name for your bookmark'), "aria-invalid": props.isInValid, validated: validated, selected: false, id: "bookmark-group-input", width: 200 })))));
42
28
  };
43
29
  export { BookmarkGroupSelector };
@@ -1 +1 @@
1
- {"version":3,"file":"ManageGroupedBookmarkedAccountsTab.d.ts","sourceRoot":"","sources":["../../../../src/components/ManageBookmarkedAccountsTab/ManageGroupedBookmarkedAccountsTab.tsx"],"names":[],"mappings":"AAyCA,UAAU,MAAM;IACZ,yBAAyB,EAAE,OAAO,CAAC;CACtC;AAED,wBAAgB,kCAAkC,CAAC,EAAE,yBAAyB,EAAE,EAAE,MAAM,eA6XvF"}
1
+ {"version":3,"file":"ManageGroupedBookmarkedAccountsTab.d.ts","sourceRoot":"","sources":["../../../../src/components/ManageBookmarkedAccountsTab/ManageGroupedBookmarkedAccountsTab.tsx"],"names":[],"mappings":"AA6CA,UAAU,MAAM;IACZ,yBAAyB,EAAE,OAAO,CAAC;CACtC;AAED,wBAAgB,kCAAkC,CAAC,EAAE,yBAAyB,EAAE,EAAE,MAAM,eA4YvF"}
@@ -7,7 +7,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
7
7
  step((generator = generator.apply(thisArg, _arguments || [])).next());
8
8
  });
9
9
  };
10
- import { AlertVariant, Button, ButtonVariant, Label, LabelGroup, Popover, PopoverPosition, SearchInput, } from '@patternfly/react-core';
10
+ import { ActionList, ActionListItem, AlertVariant, Button, ButtonVariant, Label, LabelGroup, Popover, PopoverPosition, SearchInput, } from '@patternfly/react-core';
11
+ import PencilAltIcon from '@patternfly/react-icons/dist/esm/icons/pencil-alt-icon';
12
+ import TrashIcon from '@patternfly/react-icons/dist/esm/icons/trash-icon';
11
13
  import { defaultTableSortMethod, ErrorBoundary, ToastNotification, useConfirmation, } from '@rh-support/components';
12
14
  import { addEditbookmarks, getBookmarkGroups, removeGroupedBookmarks, removeWholeGroup, useGlobalDispatchContext, useGlobalStateContext, useGroupedBookmarkApiCalls, } from '@rh-support/react-context';
13
15
  import { ability, CaseListFields, resourceActions, resources } from '@rh-support/user-permissions';
@@ -15,6 +17,7 @@ import { promiseReflection } from '@rh-support/utils';
15
17
  import differenceBy from 'lodash/differenceBy';
16
18
  import groupBy from 'lodash/groupBy';
17
19
  import isEmpty from 'lodash/isEmpty';
20
+ import isUndefined from 'lodash/isUndefined';
18
21
  import uniq from 'lodash/uniq';
19
22
  import React, { useRef, useState } from 'react';
20
23
  import { Trans, useTranslation } from 'react-i18next';
@@ -94,7 +97,7 @@ export function ManageGroupedBookmarkedAccountsTab({ canManageBookmarkAccounts }
94
97
  });
95
98
  // remove already added accounts from selected accounts
96
99
  const accounts = selectedAccounts.filter((a) => !alreadyAdded.includes(a.accountNumber));
97
- if (accounts.length === 0 && accountsRemovedFromGroup.length === 0) {
100
+ if (isEmpty(accounts) && isEmpty(accountsRemovedFromGroup)) {
98
101
  // clear the account selector inputbox
99
102
  if (isInAddMode) {
100
103
  setLocalSelectedAccounts([]);
@@ -104,15 +107,29 @@ export function ManageGroupedBookmarkedAccountsTab({ canManageBookmarkAccounts }
104
107
  return;
105
108
  }
106
109
  try {
107
- if (group === selectedGroupOnEdit) {
108
- accountsRemovedFromGroup.map((account) => __awaiter(this, void 0, void 0, function* () { return yield apiCalls.removeAccountApiCalls(account); }));
109
- }
110
- // add bookmarks
111
110
  let response = undefined;
112
- if (accounts.length !== 0) {
111
+ if (isInAddMode) {
113
112
  response = yield apiCalls.addBookmarksApiCall(accounts, group);
114
113
  }
115
- addEditbookmarks(dispatchGlobalContext, bookmarkedGroupAccounts.data, response, accounts, group, group === selectedGroupOnEdit ? accountsRemovedFromGroup : []);
114
+ else {
115
+ if (!isEmpty(accountsRemovedFromGroup)) {
116
+ yield Promise.all(accountsRemovedFromGroup.map((account) => apiCalls.removeAccountApiCalls(account)));
117
+ }
118
+ const rootBookmarkId = allGroups[selectedGroupOnEdit][0].rootBookmarkId;
119
+ // if we are renaming bookmark then call edit bookmark api
120
+ if (group !== selectedGroupOnEdit) {
121
+ // already existing bookmark accounts are deleted and new bookmark accounts are generated for this group
122
+ response = yield apiCalls.editBookmarkApiCall(selectedAccounts, group, rootBookmarkId);
123
+ selectedAccounts.forEach((a) => {
124
+ if (!isUndefined(a.bookmarkId))
125
+ accountsRemovedFromGroup.push(a);
126
+ });
127
+ }
128
+ else if (!isEmpty(accounts)) {
129
+ response = yield apiCalls.addBookmarksApiCall(accounts, group);
130
+ }
131
+ }
132
+ addEditbookmarks(dispatchGlobalContext, bookmarkedGroupAccounts.data, response, accounts, group, accountsRemovedFromGroup);
116
133
  // clear the account selector inputbox
117
134
  clearRef.current();
118
135
  ToastNotification.addSuccessMessage(t(`Account has been successfully updated`));
@@ -194,7 +211,7 @@ export function ManageGroupedBookmarkedAccountsTab({ canManageBookmarkAccounts }
194
211
  sortable: true,
195
212
  id: 'bookmark-group-name',
196
213
  title: t('Bookmark name'),
197
- cellWidth: 25,
214
+ cellWidth: 20,
198
215
  sortMethod: (a, b) => defaultTableSortMethod(a.toLowerCase(), b.toLowerCase()),
199
216
  },
200
217
  {
@@ -208,23 +225,20 @@ export function ManageGroupedBookmarkedAccountsTab({ canManageBookmarkAccounts }
208
225
  account.accountNumber,
209
226
  ")"))))),
210
227
  },
228
+ {
229
+ id: 'bookmark-actions',
230
+ title: '',
231
+ sortable: false,
232
+ cellWidth: 10,
233
+ cell: (group) => (React.createElement(ActionList, { isIconList: true },
234
+ React.createElement(ActionListItem, null,
235
+ React.createElement(Button, { variant: "plain", onClick: () => onOpenEditGroupOpenModal(group) },
236
+ React.createElement(PencilAltIcon, null))),
237
+ React.createElement(ActionListItem, null,
238
+ React.createElement(Button, { variant: "plain", onClick: () => removeGroup(group) },
239
+ React.createElement(TrashIcon, null))))),
240
+ },
211
241
  ];
212
- const actionResolver = (rowData) => {
213
- //@ts-ignore
214
- const group = (rowData === null || rowData === void 0 ? void 0 : rowData.cells[0]) || '';
215
- return [
216
- {
217
- title: 'Edit',
218
- onClick: () => onOpenEditGroupOpenModal(group),
219
- itemKey: 'edit-bookmaked-group',
220
- },
221
- {
222
- title: 'Remove',
223
- onClick: () => removeGroup(group),
224
- itemKey: 'remove-bookmaked-group',
225
- },
226
- ];
227
- };
228
242
  const isValid = () => {
229
243
  return !localSelectedAccounts || localSelectedAccounts.length === 0;
230
244
  };
@@ -242,24 +256,25 @@ export function ManageGroupedBookmarkedAccountsTab({ canManageBookmarkAccounts }
242
256
  React.createElement("a", { href: "https://source.redhat.com/communitiesatredhat/applications/integration-community-of-practice/misplaced/lostnfound/bookmarking", target: "_blank", rel: "noopener noreferrer" },
243
257
  ' ',
244
258
  "bookmarks in the customer support tool"))), closeBtnAriaLabel: "Close" },
245
- React.createElement("i", { "aria-label": "Cluster Id Info", className: "m-l-1 fa fa-question-circle" }))))),
259
+ React.createElement("i", { "aria-label": "Cluster Id Info", className: "m-l-1 fa fa-info-circle" }))))),
246
260
  React.createElement("div", { className: "toolbar" },
247
261
  React.createElement("form", { className: "toolbar-left" },
248
262
  React.createElement("label", { htmlFor: "bookmark-account-selector" },
249
- React.createElement(Trans, null, "Bookmark")),
263
+ React.createElement(Trans, null, "Search accounts")),
250
264
  React.createElement("span", { className: "bookmark-account" },
251
265
  React.createElement(BookmarkAccountSelector, { clearRef: clearRef, labelId: "bookmark-account-selector", isDisabled: !loggedInUserRights.data.isInternal() || !canBookmarkAccounts, bookmarkedGroupAccounts: bookmarkedGroupAccounts.data, onBookMarkAccountSelected: onBookMarkAccountSelected, addMode: true, isInValid: false })),
252
266
  React.createElement("span", { className: "pf-u-ml-sm" },
253
267
  React.createElement(Button, { variant: ButtonVariant.primary, isInline: true, onClick: onOpenAddBookmarkModal, "data-tracking-id": "bookmark-add-button", isDisabled: isValid() || apiCalls.isAddingBookmark },
254
- React.createElement(Trans, null, "Add")))),
268
+ React.createElement(Trans, null, "Add bookmark")))),
255
269
  React.createElement("div", { className: "toolbar-right" },
256
270
  React.createElement("label", { htmlFor: "search-bookmark-account-selector" },
257
271
  React.createElement(Trans, null, "Filter by")),
258
272
  React.createElement(SearchInput, { className: "pf-u-flex-grow-1 pf-c-search-input pf-u-background-color-100", value: searchString, id: "search-bookmark-account-selector", placeholder: t('Search for a bookmark'), "aria-label": t('Filter by searching for a bookmark'), onChange: setSearchString, onClear: () => setSearchString('') }))),
259
- React.createElement(AddEditBookmarkModal, { selectedAccounts: isInAddMode ? localSelectedAccounts : editGroupSelectedAccounts, groups: groups, isOpen: isUpdateBookmarkModalOpen, onSave: onAddEditBookmarksSave, onClose: closeAddEditBookmarkModal, onRemove: removeGroup, bookmarkedGroupAccounts: bookmarkedGroupAccounts.data, addMode: isInAddMode, title: isInAddMode ? t('Create or add to an existing bookmark') : t('Edit bookmark') }),
273
+ React.createElement(AddEditBookmarkModal, { selectedAccounts: isInAddMode ? localSelectedAccounts : editGroupSelectedAccounts, groups: groups, isOpen: isUpdateBookmarkModalOpen, onSave: onAddEditBookmarksSave, onClose: closeAddEditBookmarkModal, onRemove: removeGroup, bookmarkedGroupAccounts: bookmarkedGroupAccounts.data, addMode: isInAddMode, title: isInAddMode ? t('Add a bookmark') : t('Edit bookmark') }),
260
274
  React.createElement(ErrorBoundary, { errorMsgInfo: { message: t('There was an error loading bookmarked accounts list') } },
261
275
  React.createElement(ManageTable, { ariaLabel: t('Table to manage bookmarks'), columns: columns, data: groupNames, sortInfo: { column: 'bookmark-group-name', direction: 'asc' }, errorVariant: AlertVariant.warning, isFetching: bookmarkedGroupAccounts.isFetching ||
262
276
  loggedInUser.isFetching ||
263
277
  apiCalls.isAddingBookmark ||
264
- apiCalls.isRemovingBookmark, isError: bookmarkedGroupAccounts.isError, errorTitle: t('Bookmarked accounts error'), errorComponent: React.createElement(Trans, null, "Could not get bookmarked accounts"), actionResolver: bookmarkedGroupAccounts.data.length !== 0 ? actionResolver : null, noResultText: t('There are no results to display. Try adding a bookmark or refining your search') }))));
278
+ apiCalls.isRemovingBookmark ||
279
+ apiCalls.isEditingBookmark, isError: bookmarkedGroupAccounts.isError, errorTitle: t('Bookmarked accounts error'), errorComponent: React.createElement(Trans, null, "Could not get bookmarked accounts"), noResultText: t('There are no results to display. Try adding a bookmark or refining your search') }))));
265
280
  }
@@ -1 +1 @@
1
- {"version":3,"file":"PreferencesCaseCreate.d.ts","sourceRoot":"","sources":["../../../../../src/components/ManagePreferences/sections/PreferencesCaseCreate.tsx"],"names":[],"mappings":"AAoBA,UAAU,MAAM;CAAG;AACnB,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,eAkKlD"}
1
+ {"version":3,"file":"PreferencesCaseCreate.d.ts","sourceRoot":"","sources":["../../../../../src/components/ManagePreferences/sections/PreferencesCaseCreate.tsx"],"names":[],"mappings":"AAmBA,UAAU,MAAM;CAAG;AACnB,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,eA8KlD"}
@@ -7,11 +7,11 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
7
7
  step((generator = generator.apply(thisArg, _arguments || [])).next());
8
8
  });
9
9
  };
10
+ import { publicApi } from '@cee-eng/hydrajs';
10
11
  import { Card, CardBody, CardHeader, SelectOption } from '@patternfly/react-core';
11
- import { ToastNotification } from '@rh-support/components';
12
- import { fetchCaseGroupsForSSO, fetchLanguageMetadata, GlobalMetadataDispatchContext, GlobalMetadataStateContext, } from '@rh-support/react-context';
12
+ import { ToastNotification, useFetch } from '@rh-support/components';
13
+ import { fetchLanguageMetadata, GlobalMetadataDispatchContext, GlobalMetadataStateContext, } from '@rh-support/react-context';
13
14
  import { haventLoadedMetadata, PreferredLanguages } from '@rh-support/utils';
14
- import invert from 'lodash/invert';
15
15
  import isEmpty from 'lodash/isEmpty';
16
16
  import map from 'lodash/map';
17
17
  import React, { useContext, useEffect, useState } from 'react';
@@ -20,9 +20,43 @@ import { useUserPreferences } from '../../../hooks/useUserPreferences';
20
20
  import { PreferenceSelect } from '../components/PreferenceSelect';
21
21
  export function PreferencesCaseCreate(props) {
22
22
  const { t } = useTranslation();
23
- const { globalMetadataState: { caseGroups, caseLanguages, loggedInUserJwtToken }, } = useContext(GlobalMetadataStateContext);
23
+ const { globalMetadataState: { caseGroups, caseLanguages, loggedInUserJwtToken, loggedInUserRights, loggedInUsersAccount, }, } = useContext(GlobalMetadataStateContext);
24
24
  const dispatchToGlobalMetadataReducer = useContext(GlobalMetadataDispatchContext);
25
25
  const languageConst = caseLanguages.data;
26
+ const getDefaultGroupFetch = useFetch(publicApi.caseGroups.getCaseGroupsForSSO, {
27
+ propgateErrors: true,
28
+ });
29
+ const toggleDefaultGroupFetch = useFetch(publicApi.caseGroups.toggleDefaultGroup, {
30
+ propgateErrors: true,
31
+ });
32
+ useEffect(() => {
33
+ const grabDefaultGroupList = (ssoUser) => __awaiter(this, void 0, void 0, function* () {
34
+ try {
35
+ let list = yield getDefaultGroupFetch.request(ssoUser);
36
+ setUserDefaultGroupList(list);
37
+ let filteredDefaultGroup = (list ? list : []).filter((group) => group.isDefault === true);
38
+ if (!isEmpty(filteredDefaultGroup)) {
39
+ setOriginalDefaultGroup(filteredDefaultGroup[0].name);
40
+ }
41
+ else {
42
+ setOriginalDefaultGroup('Ungrouped Case');
43
+ }
44
+ }
45
+ catch (error) {
46
+ console.log(error);
47
+ }
48
+ });
49
+ grabDefaultGroupList(loggedInUserRights.data.getSSOUsername());
50
+ // eslint-disable-next-line react-hooks/exhaustive-deps
51
+ }, [loggedInUserRights, caseGroups]);
52
+ const updateDefaultGroupPref = (groupNum) => __awaiter(this, void 0, void 0, function* () {
53
+ try {
54
+ yield toggleDefaultGroupFetch.request(groupNum, loggedInUserRights.data.getSSOUsername(), true, loggedInUsersAccount.data.secureSupport);
55
+ }
56
+ catch (error) {
57
+ console.log(error);
58
+ }
59
+ });
26
60
  useEffect(() => {
27
61
  if (haventLoadedMetadata(caseLanguages)) {
28
62
  fetchLanguageMetadata(dispatchToGlobalMetadataReducer);
@@ -35,9 +69,8 @@ export function PreferencesCaseCreate(props) {
35
69
  }));
36
70
  const [originalPreferredLanguage, setOriginalPreferredLanguage] = useState('');
37
71
  const [originalDefaultGroup, setOriginalDefaultGroup] = useState('');
38
- const [groupDictionary, setGroupDictionary] = useState({});
39
- const [userDefaultGroupList, setUserDefaultGroupList] = useState([]);
40
- const { getPreferredLanguage, updatePreferredLanguage, updateDefaultGroup, getDefaultGroup } = useUserPreferences();
72
+ const [userDefaultGroupList, setUserDefaultGroupList] = useState();
73
+ const { getPreferredLanguage, updatePreferredLanguage } = useUserPreferences();
41
74
  const preferredLangTitleId = 'preferred-language-select';
42
75
  const defaultGroupTitleId = 'default-group-select';
43
76
  const getLanguageKey = (selection) => {
@@ -60,53 +93,21 @@ export function PreferencesCaseCreate(props) {
60
93
  }
61
94
  });
62
95
  const onDefaultGroupSelect = (event, selection, isPlaceholder) => __awaiter(this, void 0, void 0, function* () {
63
- const selectionKey = invert(groupDictionary)[selection];
64
96
  try {
65
- yield updateDefaultGroup(selectionKey);
66
- setOriginalDefaultGroup(selection);
97
+ if (selection === 'Ungrouped Case') {
98
+ updateDefaultGroupPref('-1');
99
+ }
100
+ if (!isEmpty(userDefaultGroupList)) {
101
+ let filteredGroupSelect = userDefaultGroupList.filter((group) => group.name === selection);
102
+ yield updateDefaultGroupPref(filteredGroupSelect[0].groupNum);
103
+ setOriginalDefaultGroup(filteredGroupSelect[0].name);
104
+ }
67
105
  }
68
106
  catch (error) {
69
107
  console.log(error);
70
108
  }
71
109
  });
72
- const createCaseGroupStruct = (caseGroups) => {
73
- const defaultGroupDictionary = {};
74
- for (let i = 0; i < caseGroups.data.length; i++) {
75
- defaultGroupDictionary[caseGroups.data[i].groupNum] = caseGroups.data[i].name;
76
- }
77
- return defaultGroupDictionary;
78
- };
79
- //Set user default group after group obj built
80
- useEffect(() => {
81
- const userOriginalDefaultGroup = () => __awaiter(this, void 0, void 0, function* () {
82
- try {
83
- const retrievedGroupId = yield getDefaultGroup();
84
- setOriginalDefaultGroup(groupDictionary[retrievedGroupId]);
85
- }
86
- catch (e) {
87
- ToastNotification.addWarningMessage(t('Failed to fetch original preference'));
88
- }
89
- });
90
- userOriginalDefaultGroup();
91
- // eslint-disable-next-line react-hooks/exhaustive-deps
92
- }, [groupDictionary]);
93
- // used to build the groups object and fetch pref language
94
110
  useEffect(() => {
95
- const refreshParsedGroups = () => __awaiter(this, void 0, void 0, function* () {
96
- var _a;
97
- if (haventLoadedMetadata(caseGroups, (data) => data === undefined)) {
98
- yield fetchCaseGroupsForSSO(dispatchToGlobalMetadataReducer, loggedInUserJwtToken.username);
99
- }
100
- if (!isEmpty(caseGroups) && ((_a = caseGroups === null || caseGroups === void 0 ? void 0 : caseGroups.data) === null || _a === void 0 ? void 0 : _a.length) > 0) {
101
- let updatedDictionary = createCaseGroupStruct(caseGroups);
102
- setGroupDictionary(updatedDictionary);
103
- const parsedDefaultGroupNames = [];
104
- for (let groupId in updatedDictionary) {
105
- parsedDefaultGroupNames.push(updatedDictionary[groupId]);
106
- }
107
- setUserDefaultGroupList(parsedDefaultGroupNames);
108
- }
109
- });
110
111
  const userOriginalPreferredLanguage = () => __awaiter(this, void 0, void 0, function* () {
111
112
  try {
112
113
  const retrievedLanguage = yield getPreferredLanguage();
@@ -117,7 +118,6 @@ export function PreferencesCaseCreate(props) {
117
118
  ToastNotification.addWarningMessage(t('Failed to fetch original preference'));
118
119
  }
119
120
  });
120
- refreshParsedGroups();
121
121
  userOriginalPreferredLanguage();
122
122
  // eslint-disable-next-line react-hooks/exhaustive-deps
123
123
  }, [caseLanguages, caseGroups, dispatchToGlobalMetadataReducer, loggedInUserJwtToken]);
@@ -132,5 +132,5 @@ export function PreferencesCaseCreate(props) {
132
132
  React.createElement("p", { className: "form-instructions" },
133
133
  React.createElement(Trans, null, "Preferred language will impact future cases, not existing ones."))),
134
134
  React.createElement("div", { className: "form-group" },
135
- React.createElement(PreferenceSelect, { label: "Default group", id: defaultGroupTitleId, onSelect: onDefaultGroupSelect, selections: originalDefaultGroup }, userDefaultGroupList.map((option, index) => (React.createElement(SelectOption, { key: index, value: option })))))))));
135
+ React.createElement(PreferenceSelect, { label: "Default group", id: defaultGroupTitleId, onSelect: onDefaultGroupSelect, selections: originalDefaultGroup }, (userDefaultGroupList ? userDefaultGroupList : []).map((option, index) => (React.createElement(SelectOption, { key: index, value: option.name })))))))));
136
136
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rh-support/manage",
3
- "version": "1.0.30",
3
+ "version": "1.0.32",
4
4
  "description": "Customer Support Manage App",
5
5
  "author": "Jordan Eudy <jeudy100@gmail.com>",
6
6
  "homepage": "",
@@ -94,9 +94,9 @@
94
94
  "@patternfly/pfe-tabs": "1.12.3",
95
95
  "@patternfly/react-core": "4.264.0",
96
96
  "@patternfly/react-table": "4.111.33",
97
- "@rh-support/components": "1.2.14",
97
+ "@rh-support/components": "1.2.16",
98
98
  "@rh-support/configs": "1.0.0",
99
- "@rh-support/react-context": "1.0.21",
99
+ "@rh-support/react-context": "1.0.23",
100
100
  "@rh-support/types": "0.2.0",
101
101
  "@rh-support/user-permissions": "1.0.11",
102
102
  "@rh-support/utils": "1.0.9",
@@ -109,5 +109,5 @@
109
109
  "react-i18next": ">=10.11.0",
110
110
  "react-router-dom": ">=5.1.2"
111
111
  },
112
- "gitHead": "ba8c19db472fb4f0af4bc6128cb8b1a49033e2ce"
112
+ "gitHead": "af45effefff4d9434a171992428c249f80fc84ce"
113
113
  }