@rh-support/cases 2.4.10-beta.6 → 2.5.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 (130) hide show
  1. package/README.md +2 -0
  2. package/lib/esm/components/case/NewCaseButton.d.ts +2 -1
  3. package/lib/esm/components/case/NewCaseButton.d.ts.map +1 -1
  4. package/lib/esm/components/case-list/CaseList.d.ts +4 -3
  5. package/lib/esm/components/case-list/CaseList.d.ts.map +1 -1
  6. package/lib/esm/components/case-list/CaseList.js +42 -44
  7. package/lib/esm/components/case-list/CaseListContext.d.ts +1 -1
  8. package/lib/esm/components/case-list/CaseListContext.d.ts.map +1 -1
  9. package/lib/esm/components/case-list/CaseListFilterContext.d.ts +1 -1
  10. package/lib/esm/components/case-list/CaseListFilterContext.d.ts.map +1 -1
  11. package/lib/esm/components/case-list/CaseListFilterHelpers.d.ts.map +1 -1
  12. package/lib/esm/components/case-list/CaseListFilterReducer.d.ts +6 -3
  13. package/lib/esm/components/case-list/CaseListFilterReducer.d.ts.map +1 -1
  14. package/lib/esm/components/case-list/CaseListFilterReducer.js +3 -0
  15. package/lib/esm/components/case-list/CaseListReducer.d.ts +2 -2
  16. package/lib/esm/components/case-list/CaseListReducer.d.ts.map +1 -1
  17. package/lib/esm/components/case-list/case-list-filters/AccountsBookmarkedGroupFilter.d.ts +3 -2
  18. package/lib/esm/components/case-list/case-list-filters/AccountsBookmarkedGroupFilter.d.ts.map +1 -1
  19. package/lib/esm/components/case-list/case-list-filters/AccountsBookmarkedGroupFilter.js +25 -11
  20. package/lib/esm/components/case-list/case-list-filters/AccountsFilter.d.ts +2 -1
  21. package/lib/esm/components/case-list/case-list-filters/AccountsFilter.d.ts.map +1 -1
  22. package/lib/esm/components/case-list/case-list-filters/AccountsFilter.js +10 -5
  23. package/lib/esm/components/case-list/case-list-filters/AdditionalFilters.d.ts +2 -1
  24. package/lib/esm/components/case-list/case-list-filters/AdditionalFilters.d.ts.map +1 -1
  25. package/lib/esm/components/case-list/case-list-filters/AdditionalFilters.js +19 -4
  26. package/lib/esm/components/case-list/case-list-filters/CaseListFilterChips.d.ts +2 -1
  27. package/lib/esm/components/case-list/case-list-filters/CaseListFilterChips.d.ts.map +1 -1
  28. package/lib/esm/components/case-list/case-list-filters/CaseListFilterChips.js +1 -1
  29. package/lib/esm/components/case-list/case-list-filters/CaseListFilters.d.ts +2 -1
  30. package/lib/esm/components/case-list/case-list-filters/CaseListFilters.d.ts.map +1 -1
  31. package/lib/esm/components/case-list/case-list-filters/CreatorSsoNameFilter.d.ts +12 -1
  32. package/lib/esm/components/case-list/case-list-filters/CreatorSsoNameFilter.d.ts.map +1 -1
  33. package/lib/esm/components/case-list/case-list-filters/CreatorSsoNameFilter.js +138 -163
  34. package/lib/esm/components/case-list/case-list-filters/CreatorSsoNameFilterChip.d.ts +2 -1
  35. package/lib/esm/components/case-list/case-list-filters/CreatorSsoNameFilterChip.d.ts.map +1 -1
  36. package/lib/esm/components/case-list/case-list-filters/CreatorSsoNameFilterChip.js +1 -1
  37. package/lib/esm/components/case-list/case-list-filters/GroupsFilter.d.ts +2 -1
  38. package/lib/esm/components/case-list/case-list-filters/GroupsFilter.d.ts.map +1 -1
  39. package/lib/esm/components/case-list/case-list-filters/GroupsFilter.js +157 -27
  40. package/lib/esm/components/case-list/case-list-filters/InternalSsoNameFilter.d.ts +3 -0
  41. package/lib/esm/components/case-list/case-list-filters/InternalSsoNameFilter.d.ts.map +1 -0
  42. package/lib/esm/components/case-list/case-list-filters/InternalSsoNameFilter.js +207 -0
  43. package/lib/esm/components/case-list/case-list-filters/ProductFilterChip.d.ts +2 -1
  44. package/lib/esm/components/case-list/case-list-filters/ProductFilterChip.d.ts.map +1 -1
  45. package/lib/esm/components/case-list/case-list-filters/ProductFilterChip.js +1 -1
  46. package/lib/esm/components/case-list/case-list-filters/ProductsFilter.d.ts +2 -1
  47. package/lib/esm/components/case-list/case-list-filters/ProductsFilter.d.ts.map +1 -1
  48. package/lib/esm/components/case-list/case-list-filters/ProductsFilter.js +7 -5
  49. package/lib/esm/components/case-list/case-list-filters/SeverityFilter.d.ts +2 -1
  50. package/lib/esm/components/case-list/case-list-filters/SeverityFilter.d.ts.map +1 -1
  51. package/lib/esm/components/case-list/case-list-filters/SeverityFilter.js +4 -4
  52. package/lib/esm/components/case-list/case-list-filters/StatusFilter.d.ts +2 -1
  53. package/lib/esm/components/case-list/case-list-filters/StatusFilter.d.ts.map +1 -1
  54. package/lib/esm/components/case-list/case-list-filters/StatusFilter.js +4 -4
  55. package/lib/esm/components/case-list/case-list-filters/TypeFilter.d.ts +2 -1
  56. package/lib/esm/components/case-list/case-list-filters/TypeFilter.d.ts.map +1 -1
  57. package/lib/esm/components/case-list/case-list-filters/TypeFilter.js +3 -3
  58. package/lib/esm/components/case-list/case-list-filters/VersionsFilter.d.ts +2 -1
  59. package/lib/esm/components/case-list/case-list-filters/VersionsFilter.d.ts.map +1 -1
  60. package/lib/esm/components/case-list/case-list-filters/VersionsFilter.js +35 -4
  61. package/lib/esm/components/case-list/case-list-table/CaseListTable.d.ts +2 -1
  62. package/lib/esm/components/case-list/case-list-table/CaseListTable.d.ts.map +1 -1
  63. package/lib/esm/components/case-list/case-list-table/CaseListTable.js +211 -113
  64. package/lib/esm/components/case-list/case-list-table/CloseCaseBtn.d.ts +2 -1
  65. package/lib/esm/components/case-list/case-list-table/CloseCaseBtn.d.ts.map +1 -1
  66. package/lib/esm/components/case-list/case-list-table/CloseCaseBtn.js +7 -2
  67. package/lib/esm/components/case-list/case-list-table/DownloadCSVFileModal.d.ts +19 -0
  68. package/lib/esm/components/case-list/case-list-table/DownloadCSVFileModal.d.ts.map +1 -0
  69. package/lib/esm/components/case-list/case-list-table/DownloadCSVFileModal.js +296 -0
  70. package/lib/esm/components/case-list/case-list-table/DownloadCSVFileModal.scss +27 -0
  71. package/lib/esm/components/case-list/case-list-table/ExportCaseListCSV.d.ts +3 -1
  72. package/lib/esm/components/case-list/case-list-table/ExportCaseListCSV.d.ts.map +1 -1
  73. package/lib/esm/components/case-list/case-list-table/ExportCaseListCSV.js +19 -96
  74. package/lib/esm/components/case-list/case-list-table/SeverityLabel.d.ts +2 -1
  75. package/lib/esm/components/case-list/case-list-table/SeverityLabel.d.ts.map +1 -1
  76. package/lib/esm/components/case-list/case-list-table/table-column-selector/TableColumnSelector.d.ts +9 -0
  77. package/lib/esm/components/case-list/case-list-table/table-column-selector/TableColumnSelector.d.ts.map +1 -0
  78. package/lib/esm/components/case-list/case-list-table/table-column-selector/TableColumnSelector.js +53 -0
  79. package/lib/esm/components/case-list/case-list-table/table-column-selector/TableColumnSelector.scss +7 -0
  80. package/lib/esm/components/case-list/case-search/AdvanceSearch.d.ts +2 -1
  81. package/lib/esm/components/case-list/case-search/AdvanceSearch.d.ts.map +1 -1
  82. package/lib/esm/components/case-list/case-search/AdvanceSearch.js +18 -13
  83. package/lib/esm/components/case-list/case-search/BookmarkedSearchesSelector.d.ts +2 -1
  84. package/lib/esm/components/case-list/case-search/BookmarkedSearchesSelector.d.ts.map +1 -1
  85. package/lib/esm/components/case-list/case-search/BookmarkedSearchesSelector.js +7 -6
  86. package/lib/esm/components/case-list/case-search/CaseSearch.d.ts +2 -1
  87. package/lib/esm/components/case-list/case-search/CaseSearch.d.ts.map +1 -1
  88. package/lib/esm/components/case-list/case-search/CaseSearch.js +2 -2
  89. package/lib/esm/components/case-list/case-search/SaveCaseSearchModal.d.ts +2 -1
  90. package/lib/esm/components/case-list/case-search/SaveCaseSearchModal.d.ts.map +1 -1
  91. package/lib/esm/components/case-list/case-search/SaveCaseSearchModal.js +48 -40
  92. package/lib/esm/components/case-list/case-search/useAdvanceSearchParser.js +1 -1
  93. package/lib/esm/components/escalations/EscalationForm.d.ts +1 -1
  94. package/lib/esm/components/escalations/EscalationForm.d.ts.map +1 -1
  95. package/lib/esm/components/escalations/EscalationForm.js +18 -9
  96. package/lib/esm/components/escalations/PartnerEscalation.d.ts +2 -1
  97. package/lib/esm/components/escalations/PartnerEscalation.d.ts.map +1 -1
  98. package/lib/esm/components/index.d.ts +2 -8
  99. package/lib/esm/components/index.d.ts.map +1 -1
  100. package/lib/esm/components/index.js +5 -8
  101. package/lib/esm/css/caseList.css +85 -64
  102. package/lib/esm/css/caseSearch.css +1 -1
  103. package/lib/esm/css/escalation.css +4 -4
  104. package/lib/esm/enums/cache.d.ts +1 -1
  105. package/lib/esm/enums/cache.d.ts.map +1 -1
  106. package/lib/esm/enums/case.js +1 -1
  107. package/lib/esm/enums/filters.d.ts +1 -1
  108. package/lib/esm/enums/filters.d.ts.map +1 -1
  109. package/lib/esm/enums/filters.js +1 -1
  110. package/lib/esm/i18n/template-es.js +1 -1
  111. package/lib/esm/index.d.ts +0 -2
  112. package/lib/esm/index.d.ts.map +1 -1
  113. package/lib/esm/index.js +0 -2
  114. package/lib/esm/models/caseList.d.ts +5 -2
  115. package/lib/esm/models/caseList.d.ts.map +1 -1
  116. package/lib/esm/scss/_main.scss +11 -11
  117. package/lib/esm/scss/_pf-overrides.scss +40 -4
  118. package/lib/esm/scss/index.scss +0 -1
  119. package/lib/esm/test-utils/testSetup.d.ts +1 -1
  120. package/lib/esm/test-utils/testSetup.d.ts.map +1 -1
  121. package/lib/esm/test-utils/testSetup.js +1 -1
  122. package/lib/esm/test-utils/testUtils.d.ts +1 -1
  123. package/lib/esm/test-utils/testUtils.js +1 -1
  124. package/lib/esm/utils/caseListUtils.js +3 -3
  125. package/lib/esm/utils/caseSearchUtils.d.ts +3 -3
  126. package/lib/esm/utils/caseSearchUtils.d.ts.map +1 -1
  127. package/lib/esm/utils/caseSearchUtils.js +18 -5
  128. package/lib/esm/utils/constants.js +1 -1
  129. package/lib/esm/utils/routeUtils.js +2 -1
  130. package/package.json +35 -32
@@ -1 +1 @@
1
- {"version":3,"file":"CaseListFilters.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-list-filters/CaseListFilters.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,OAAO,EAAE,0BAA0B,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAC;AAK7F,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAWxD,UAAU,MAAM;IACZ,YAAY,EAAE,0BAA0B,CAAC,YAAY,CAAC,CAAC;IACvD,gBAAgB,EAAE,OAAO,CAAC;IAC1B,YAAY,EAAE,mBAAmB,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,eAAe,EAAE,mBAAmB,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/C,iBAAiB,EAAE,mBAAmB,CAAC,MAAM,EAAE,CAAC,CAAC;IACjD,WAAW,EAAE,mBAAmB,CAAC,4BAA4B,CAAC,CAAC;CAClE;AAID,eAAO,MAAM,eAAe,uGAOzB,MAAM,gBA2ER,CAAC"}
1
+ {"version":3,"file":"CaseListFilters.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-list-filters/CaseListFilters.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,OAAO,EAAE,0BAA0B,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAC;AAE7F,OAAO,KAAqB,MAAM,OAAO,CAAC;AAG1C,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAWxD,UAAU,MAAM;IACZ,YAAY,EAAE,0BAA0B,CAAC,YAAY,CAAC,CAAC;IACvD,gBAAgB,EAAE,OAAO,CAAC;IAC1B,YAAY,EAAE,mBAAmB,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,eAAe,EAAE,mBAAmB,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/C,iBAAiB,EAAE,mBAAmB,CAAC,MAAM,EAAE,CAAC,CAAC;IACjD,WAAW,EAAE,mBAAmB,CAAC,4BAA4B,CAAC,CAAC;CAClE;AAID,eAAO,MAAM,eAAe,uGAOzB,MAAM,sBA2ER,CAAC"}
@@ -1,2 +1,13 @@
1
- export declare function CreatorSsoNameFilter(): JSX.Element;
1
+ import React from 'react';
2
+ export declare const getFullName: (contact: any) => string;
3
+ export declare const getFilterValues: (contactList: any, own: any) => {
4
+ firstName: string;
5
+ lastName: string;
6
+ firstNameCustom: string;
7
+ lastNameCustom: string;
8
+ value: string;
9
+ label: string;
10
+ }[];
11
+ export declare const getSelectedListObj: (contactsList: any, filterInfo: any, own: any, t: any) => any[];
12
+ export declare function CreatorSsoNameFilter(): React.JSX.Element;
2
13
  //# sourceMappingURL=CreatorSsoNameFilter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CreatorSsoNameFilter.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-list-filters/CreatorSsoNameFilter.tsx"],"names":[],"mappings":"AAmDA,wBAAgB,oBAAoB,gBAwSnC"}
1
+ {"version":3,"file":"CreatorSsoNameFilter.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-list-filters/CreatorSsoNameFilter.tsx"],"names":[],"mappings":"AAuBA,OAAO,KAA2D,MAAM,OAAO,CAAC;AAYhF,eAAO,MAAM,WAAW,0BAIvB,CAAC;AAYF,eAAO,MAAM,eAAe;;;;;;;GAA6E,CAAC;AAE1G,eAAO,MAAM,kBAAkB,iEAyC9B,CAAC;AAEF,wBAAgB,oBAAoB,sBA4PnC"}
@@ -7,21 +7,26 @@ 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 { accounts, contacts } from '@cee-eng/hydrajs';
11
- import { AsyncMultiDropDownList, MultiSelectDropDownList, useFetch } from '@rh-support/components';
10
+ import { accounts } from '@cee-eng/hydrajs';
11
+ import { Button, MenuToggle, Select, SelectGroup, SelectList, SelectOption, TextInputGroup, TextInputGroupMain, TextInputGroupUtilities, Truncate, } from '@patternfly/react-core';
12
+ import TimesCircleIcon from '@patternfly/react-icons/dist/js/icons/times-circle-icon';
13
+ import { LoadingIndicator, useFetch, useSelectKeyboardNavigator } from '@rh-support/components';
12
14
  import { GlobalMetadataStateContext } from '@rh-support/react-context';
13
- import { getDropdownBtnPlaceholder, toOptions } from '@rh-support/utils';
15
+ import { getDropdownBtnPlaceholder } from '@rh-support/utils';
14
16
  import isEmpty from 'lodash/isEmpty';
17
+ import isNull from 'lodash/isNull';
18
+ import isUndefined from 'lodash/isUndefined';
15
19
  import uniqBy from 'lodash/uniqBy';
16
- import React, { useContext, useEffect, useRef, useState } from 'react';
20
+ import React, { useContext, useEffect, useMemo, useRef, useState } from 'react';
17
21
  import { Trans, useTranslation } from 'react-i18next';
18
22
  import { SolrKeys } from '../../../enums/filters';
19
23
  import { filterNamesMap } from '../../../utils/constants';
20
- import { useCaseListDispatchContext, useCaseListStateContext } from '../CaseListContext';
24
+ import { useCaseListDispatchContext } from '../CaseListContext';
21
25
  import { CaseListFilterDispatchContext, CaseListFilterStateContext } from '../CaseListFilterContext';
22
26
  import { updateFilters } from '../CaseListFilterReducer';
23
27
  import { setChipsNameSsoMap } from '../CaseListReducer';
24
- const getFullName = (contact) => {
28
+ import InternalSsoNameFilter from './InternalSsoNameFilter';
29
+ export const getFullName = (contact) => {
25
30
  return contact.fullNameCustom
26
31
  ? `${contact.firstNameCustom} ${contact.lastNameCustom}`
27
32
  : `${contact.firstName} ${contact.lastName}`;
@@ -34,49 +39,103 @@ const mapToObj = (arr) => arr.map((item) => ({
34
39
  value: item.ssoUsername,
35
40
  label: `${getFullName(item)} <${item.ssoUsername}>`,
36
41
  }));
37
- const getFilterValues = (contactList, own) => mapToObj(contactList).filter((o) => o.value !== own);
42
+ export const getFilterValues = (contactList, own) => mapToObj(contactList).filter((o) => o.value !== own);
43
+ export const getSelectedListObj = (contactsList, filterInfo, own, t) => {
44
+ const created = [...filterInfo[SolrKeys.createdBySsoUsername]].reduce((result, sso) => {
45
+ if (sso === own) {
46
+ result.push({ value: 'createdByMe', label: t('Cases created by me') });
47
+ }
48
+ else {
49
+ const contact = contactsList.find((item) => (item === null || item === void 0 ? void 0 : item.ssoUsername) === sso);
50
+ contact &&
51
+ result.push({
52
+ value: contact.ssoUsername,
53
+ label: `${getFullName(contact)} <${contact.ssoUsername}>`,
54
+ });
55
+ !contact &&
56
+ result.push({
57
+ value: sso,
58
+ label: '',
59
+ });
60
+ }
61
+ return result;
62
+ }, []);
63
+ const owned = [...filterInfo[SolrKeys.caseContactSSO]].reduce((result, sso) => {
64
+ if (sso === own) {
65
+ result.push({ value: 'ownedByMe', label: t('Cases owned by me') });
66
+ }
67
+ else {
68
+ const contact = contactsList.find((item) => item.ssoUsername === sso);
69
+ contact &&
70
+ result.push({
71
+ value: contact.ssoUsername,
72
+ label: `${getFullName(contact)} <${contact.ssoUsername}>`,
73
+ });
74
+ !contact &&
75
+ result.push({
76
+ value: sso,
77
+ label: '',
78
+ });
79
+ }
80
+ return result;
81
+ }, []);
82
+ const selected = uniqBy([...created, ...owned], 'value');
83
+ return selected;
84
+ };
38
85
  export function CreatorSsoNameFilter() {
39
86
  const { t } = useTranslation();
40
87
  const { filterInfo } = useContext(CaseListFilterStateContext);
41
88
  const dispatch = useContext(CaseListFilterDispatchContext);
42
89
  const { globalMetadataState: { loggedInUserRights }, } = useContext(GlobalMetadataStateContext);
43
- const { chipsNameSsoMap } = useCaseListStateContext();
44
90
  const CaseListDispatch = useCaseListDispatchContext();
45
91
  const own = loggedInUserRights.data.getSSOUsername();
46
- const PER_PAGE = 200;
47
92
  const isExternalNonOrgAdmin = !loggedInUserRights.data.isInternal() && loggedInUserRights.data.isCustomerNonOrgAdmin();
48
- const ASYNC_DROPDOWN_PAGE_SIZE = 10000;
49
93
  const { request: getExternalUserContactsList, isFetching: isFetchingExternalContacts } = useFetch(accounts.getAccountContacts, { propgateErrors: true });
50
- const { request: getInternalUserContactsList, isFetching: isFetchingInternalContacts } = useFetch(contacts.getSFDCContacts, { propgateErrors: true });
51
- const abortControllerRef = useRef(undefined);
94
+ const externalInputRef = useRef();
52
95
  const [externalContactList, setExternalContactList] = useState([]);
53
- const [internalContactList, setInternalContactList] = useState([]);
54
- const onFilterChange = (items) => {
55
- const selectedItems = items.map((item) => item.value.value);
56
- const caseCreated = selectedItems
57
- .filter((o) => o !== 'ownedByMe')
58
- .map((o) => (o === 'createdByMe' ? own : o));
59
- const caseOwnedBy = selectedItems
60
- .filter((o) => o !== 'createdByMe')
61
- .map((o) => (o === 'ownedByMe' ? own : o));
62
- const caseOwner = loggedInUserRights.data.isInternal() && caseOwnedBy.indexOf(own) !== -1 ? [own] : [];
63
- updateFilters(dispatch, [
64
- {
65
- filterKey: SolrKeys.createdBySsoUsername,
66
- values: caseCreated,
67
- },
68
- {
69
- filterKey: SolrKeys.caseContactSSO,
70
- values: caseOwnedBy,
71
- },
72
- {
73
- filterKey: SolrKeys.caseOwner,
74
- values: caseOwner,
75
- },
76
- ]);
96
+ const [isExternalOpen, setIsExternalOpen] = useState(false);
97
+ const [noResults, setNoResults] = useState(false);
98
+ const [externalQuery, setExternalQuery] = useState('');
99
+ const onSelectExternal = (contact) => {
100
+ if (isNull(contact) || isUndefined(contact))
101
+ return;
102
+ let list = [];
103
+ if (selectedExternalContacts.some((item) => item.value === contact.value)) {
104
+ list = selectedExternalContacts.filter((item) => item.value !== contact.value);
105
+ }
106
+ else {
107
+ list = [...selectedExternalContacts, contact];
108
+ }
109
+ onFilterChange(list);
77
110
  };
78
- const onFilterChangeAsync = (items) => {
79
- const selectedItems = items.map((item) => item.value.value);
111
+ const dropdownHeader = [
112
+ {
113
+ label: `${t('Cases created by me')}`,
114
+ value: 'createdByMe',
115
+ },
116
+ {
117
+ label: `${t('Cases owned by me')}`,
118
+ value: 'ownedByMe',
119
+ },
120
+ ];
121
+ const filteredOptions = useMemo(() => {
122
+ const filteredValues = getFilterValues(externalContactList, own);
123
+ const input = new RegExp(externalQuery, 'i');
124
+ const newOptions = filteredValues.filter((v) => input.test(v.label || ''));
125
+ setNoResults(isEmpty(newOptions));
126
+ return newOptions;
127
+ }, [externalContactList, own, externalQuery]);
128
+ const { onInputKeyDown, focusedItemIndex } = useSelectKeyboardNavigator({
129
+ list: [...dropdownHeader, ...filteredOptions],
130
+ isOpen: isExternalOpen,
131
+ setIsOpen: setIsExternalOpen,
132
+ onSelect: onSelectExternal,
133
+ });
134
+ const selectedExternalContacts = useMemo(() => getSelectedListObj(externalContactList, filterInfo, own, t),
135
+ // eslint-disable-next-line react-hooks/exhaustive-deps
136
+ [externalContactList, filterInfo, own]);
137
+ const onFilterChange = (items) => {
138
+ const selectedItems = items.map((item) => item.value);
80
139
  const caseCreated = selectedItems
81
140
  .filter((o) => o !== 'ownedByMe')
82
141
  .map((o) => (o === 'createdByMe' ? own : o));
@@ -98,111 +157,7 @@ export function CreatorSsoNameFilter() {
98
157
  values: caseOwner,
99
158
  },
100
159
  ]);
101
- // set name/sso pairs on state to be used in filter chip component
102
- if (loggedInUserRights.data.isInternal()) {
103
- const chipsNameSsoPairs = {};
104
- items.forEach((item) => {
105
- var _a, _b, _c, _d;
106
- const sso = item.value.value;
107
- if (sso !== 'ownedByMe' && sso !== 'createdByMe' && !chipsNameSsoMap[sso]) {
108
- chipsNameSsoPairs[sso] = {
109
- firstName: ((_a = item.value) === null || _a === void 0 ? void 0 : _a.firstName) || '',
110
- lastName: ((_b = item.value) === null || _b === void 0 ? void 0 : _b.lastName) || '',
111
- firstNameCustom: ((_c = item.value) === null || _c === void 0 ? void 0 : _c.firstNameCustom) || '',
112
- lastNameCustom: ((_d = item.value) === null || _d === void 0 ? void 0 : _d.lastNameCustom) || '',
113
- };
114
- }
115
- });
116
- setChipsNameSsoMap(CaseListDispatch, chipsNameSsoPairs);
117
- }
118
160
  };
119
- const dropdownHeader = [
120
- {
121
- isNotSearchable: true,
122
- label: `${t('Cases created by me')}`,
123
- value: 'createdByMe',
124
- },
125
- {
126
- isNotSearchable: true,
127
- label: `${t('Cases owned by me')}`,
128
- value: 'ownedByMe',
129
- },
130
- {
131
- children: isExternalNonOrgAdmin || (externalContactList.length === 0 && internalContactList.length === 0) ? (React.createElement(React.Fragment, null)) : (React.createElement(React.Fragment, null,
132
- React.createElement("div", { className: "pf-c-divider", role: "separator" }),
133
- React.createElement("h3", { className: "subheading subheading-sm pf-u-pl-md" },
134
- React.createElement(Trans, null, "Created or owned by")))),
135
- isNotSearchable: true,
136
- isNonActionable: true,
137
- isNotSelectable: true,
138
- },
139
- ];
140
- const getSelectedListObj = (contactsList) => {
141
- const created = [...filterInfo[SolrKeys.createdBySsoUsername]].reduce((result, sso) => {
142
- if (sso === own) {
143
- result.push({ value: 'createdByMe', label: t('Cases created by me') });
144
- }
145
- else {
146
- const contact = contactsList.find((item) => (item === null || item === void 0 ? void 0 : item.ssoUsername) === sso);
147
- contact &&
148
- result.push({
149
- value: contact.ssoUsername,
150
- label: `${getFullName(contact)} <${contact.ssoUsername}>`,
151
- });
152
- !contact &&
153
- result.push({
154
- value: sso,
155
- label: '',
156
- });
157
- }
158
- return result;
159
- }, []);
160
- const owned = [...filterInfo[SolrKeys.caseContactSSO]].reduce((result, sso) => {
161
- if (sso === own) {
162
- result.push({ value: 'ownedByMe', label: t('Cases owned by me') });
163
- }
164
- else {
165
- const contact = contactsList.find((item) => item.ssoUsername === sso);
166
- contact &&
167
- result.push({
168
- value: contact.ssoUsername,
169
- label: `${getFullName(contact)} <${contact.ssoUsername}>`,
170
- });
171
- !contact &&
172
- result.push({
173
- value: sso,
174
- label: '',
175
- });
176
- }
177
- return result;
178
- }, []);
179
- const selected = uniqBy([...created, ...owned], 'value');
180
- return toOptions(selected, {
181
- labelKey: 'label',
182
- });
183
- };
184
- const onSearchAsync = (query) => __awaiter(this, void 0, void 0, function* () {
185
- if (query == null) {
186
- return;
187
- }
188
- if (abortControllerRef.current !== undefined) {
189
- // Cancel the previous request
190
- abortControllerRef.current.abort();
191
- }
192
- // recreate a new AbortController for each call
193
- let controller = new AbortController();
194
- abortControllerRef.current = controller;
195
- const queryParams = {
196
- internal: false,
197
- limit: ASYNC_DROPDOWN_PAGE_SIZE,
198
- nameLookup: query,
199
- };
200
- const response = yield getInternalUserContactsList(queryParams, controller.signal);
201
- const contacts = response && response.items && response.items.length !== 0
202
- ? response.items.filter((c) => !isEmpty(c.ssoUsername))
203
- : [];
204
- setInternalContactList(contacts);
205
- });
206
161
  // fetch data on load for external users
207
162
  useEffect(() => {
208
163
  if (loggedInUserRights.data.isInternal())
@@ -221,25 +176,45 @@ export function CreatorSsoNameFilter() {
221
176
  fetchStrataAccountUsers();
222
177
  // eslint-disable-next-line react-hooks/exhaustive-deps
223
178
  }, [dispatch, isExternalNonOrgAdmin, loggedInUserRights.data]);
224
- const asyncMultiDropDownList = [
225
- ...dropdownHeader,
226
- ...getFilterValues(internalContactList, own),
227
- ];
228
- const multiDropDownList = [
229
- ...dropdownHeader,
230
- ...getFilterValues(externalContactList, own),
231
- ];
232
- return (React.createElement(React.Fragment, null, !loggedInUserRights.data.isInternal() ? (React.createElement(MultiSelectDropDownList, { placeholder: getDropdownBtnPlaceholder(t('Search for a name'), getSelectedListObj(externalContactList).map((i) => i.label), ' ', multiDropDownList.length, t('All contacts')), id: "external-ssousername-filter", "data-tracking-id": "external-ssousername-filter", selectedItems: getSelectedListObj(externalContactList), list: toOptions(multiDropDownList, {
233
- labelKey: 'label',
234
- childrenKey: 'children',
235
- nonSearchableItemKey: 'isNotSearchable',
236
- nonActionableItemKey: 'isNonActionable',
237
- nonSelectableItemKey: 'isNotSelectable',
238
- }), title: t(filterNamesMap['usernameFilterTitle']), onChange: onFilterChange, emptyListLabel: isExternalNonOrgAdmin ? '' : t('No results found'), searchable: true, label: t(filterNamesMap['usernameFilterTitle']), isLoadingList: isFetchingExternalContacts })) : (React.createElement(AsyncMultiDropDownList, { placeholder: getDropdownBtnPlaceholder(t('Search for a name'), getSelectedListObj(internalContactList).map((i) => i.label), ' ', asyncMultiDropDownList.length, t('All contacts')), id: "internal-ssousername-async-filter", "data-tracking-id": "internal-ssousername-async-filter", selectedItems: getSelectedListObj(internalContactList), list: toOptions(asyncMultiDropDownList, {
239
- labelKey: 'label',
240
- childrenKey: 'children',
241
- nonSearchableItemKey: 'isNotSearchable',
242
- nonActionableItemKey: 'isNonActionable',
243
- nonSelectableItemKey: 'isNotSelectable',
244
- }), title: t(filterNamesMap['usernameFilterTitle']), onChange: onFilterChangeAsync, delay: 300, useCache: true, paginate: true, emptyListLabel: t('No results found'), maxResults: PER_PAGE, onSearch: onSearchAsync, minLength: 0, label: t(filterNamesMap['usernameFilterTitle']), isLoadingList: isFetchingInternalContacts }))));
179
+ const filteredExternalList = useMemo(() => {
180
+ return [
181
+ ...(noResults && !isExternalNonOrgAdmin
182
+ ? [
183
+ React.createElement("div", { key: "no-results", className: "pf-v5-u-p-sm" },
184
+ React.createElement(Trans, null, "No results found")),
185
+ ]
186
+ : []),
187
+ ...dropdownHeader.map((contact, index) => (React.createElement(SelectOption, { key: contact.value, isFocused: focusedItemIndex === index, value: contact, hasCheckbox: true, isSelected: selectedExternalContacts.some((c) => c.value === contact.value) }, contact.label))),
188
+ ...(!isEmpty(filteredOptions)
189
+ ? [
190
+ React.createElement("div", { className: "pf-v5-c-divider", role: "separator", key: "separator" }),
191
+ React.createElement(SelectGroup, { key: "created-or-owned-by-accounts-group" },
192
+ React.createElement("h6", { className: "pf-v5-u-pl-md" },
193
+ React.createElement(Trans, null, "Created or owned by")),
194
+ filteredOptions.map((contact, index) => (React.createElement(SelectOption, { key: contact.value, isFocused: focusedItemIndex === index + dropdownHeader.length, value: contact, hasCheckbox: true, isSelected: selectedExternalContacts.some((c) => c.value === contact.value) },
195
+ React.createElement(Truncate, { content: contact.label }))))),
196
+ ]
197
+ : []),
198
+ ];
199
+ // eslint-disable-next-line react-hooks/exhaustive-deps
200
+ }, [filteredOptions, selectedExternalContacts, focusedItemIndex, noResults]);
201
+ const onExternalQueryChange = (_v, query) => {
202
+ setExternalQuery(query);
203
+ };
204
+ const onExternalToggle = (e) => {
205
+ e.stopPropagation();
206
+ setIsExternalOpen((pre) => !pre);
207
+ };
208
+ const externalToggle = (toggleRef) => (React.createElement(MenuToggle, { variant: "typeahead", onClick: onExternalToggle, innerRef: toggleRef, isExpanded: isExternalOpen, isFullWidth: true },
209
+ React.createElement(TextInputGroup, { isPlain: true },
210
+ React.createElement(TextInputGroupMain, { value: externalQuery, onClick: onExternalToggle, onKeyDown: onInputKeyDown, placeholder: isExternalNonOrgAdmin
211
+ ? t('Username')
212
+ : getDropdownBtnPlaceholder(t('Search for a name'), selectedExternalContacts.map((i) => i.label), ' ', filteredOptions.length + dropdownHeader.length, t('All selected')), onChange: onExternalQueryChange, isExpanded: isExternalOpen, innerRef: externalInputRef, "aria-controls": "external-ssousername-filter", role: "combobox" }),
213
+ React.createElement(TextInputGroupUtilities, null, !isEmpty(externalQuery) && (React.createElement(Button, { variant: "plain", onClick: () => setExternalQuery(''), isDisabled: isFetchingExternalContacts, "aria-label": t('Clear') }, isFetchingExternalContacts ? (React.createElement(LoadingIndicator, { show: true, size: "sm" })) : (React.createElement(TimesCircleIcon, { "aria-hidden": true }))))))));
214
+ const customToggle = (toggleRef) => (React.createElement(MenuToggle, { ref: toggleRef, onClick: onExternalToggle, isExpanded: isExternalOpen, style: { width: '100%' } }, getDropdownBtnPlaceholder(t('Username'), selectedExternalContacts.map((i) => i.label), ' ', dropdownHeader.length, t('All selected'))));
215
+ return (React.createElement("div", null,
216
+ React.createElement("label", { htmlFor: "case-list-username-filter", className: "case-list-username-filter-label" },
217
+ React.createElement(Trans, null, filterNamesMap['usernameFilterTitle'])),
218
+ !loggedInUserRights.data.isInternal() ? (React.createElement(Select, { id: "external-ssousername-filter", "data-tracking-id": "external-ssousername-filter", isOpen: isExternalOpen, onOpenChange: () => setIsExternalOpen(false), toggle: isExternalNonOrgAdmin ? customToggle : externalToggle, popperProps: { direction: 'down', enableFlip: false }, isScrollable: true, onSelect: (_e, v) => onSelectExternal(v) },
219
+ React.createElement(SelectList, null, filteredExternalList))) : (React.createElement(InternalSsoNameFilter, null))));
245
220
  }
@@ -1,2 +1,3 @@
1
- export declare function CreatorSsoNameFilterChip(): JSX.Element;
1
+ import React from 'react';
2
+ export declare function CreatorSsoNameFilterChip(): React.JSX.Element;
2
3
  //# sourceMappingURL=CreatorSsoNameFilterChip.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CreatorSsoNameFilterChip.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-list-filters/CreatorSsoNameFilterChip.tsx"],"names":[],"mappings":"AAeA,wBAAgB,wBAAwB,gBA2HvC"}
1
+ {"version":3,"file":"CreatorSsoNameFilterChip.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-list-filters/CreatorSsoNameFilterChip.tsx"],"names":[],"mappings":"AAKA,OAAO,KAA0C,MAAM,OAAO,CAAC;AAU/D,wBAAgB,wBAAwB,sBA2HvC"}
@@ -103,7 +103,7 @@ export function CreatorSsoNameFilterChip() {
103
103
  return (React.createElement("div", { className: "filter-chip" },
104
104
  React.createElement("span", { className: "filter-chip__heading" },
105
105
  React.createElement(Trans, null, filterNamesMap['usernameFilterTitle'])),
106
- React.createElement(ChipGroup, { numChips: 7, className: "pf-c-chip-group" },
106
+ React.createElement(ChipGroup, { numChips: 7, className: "pf-v5-c-chip-group" },
107
107
  own &&
108
108
  filterInfo &&
109
109
  filterInfo[SolrKeys.createdBySsoUsername] &&
@@ -1,2 +1,3 @@
1
- export declare function GroupsFilter(): JSX.Element;
1
+ import React from 'react';
2
+ export declare function GroupsFilter(): React.JSX.Element;
2
3
  //# sourceMappingURL=GroupsFilter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"GroupsFilter.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-list-filters/GroupsFilter.tsx"],"names":[],"mappings":"AAwBA,wBAAgB,YAAY,gBA6D3B"}
1
+ {"version":3,"file":"GroupsFilter.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-list-filters/GroupsFilter.tsx"],"names":[],"mappings":"AAmBA,OAAO,KAA2D,MAAM,OAAO,CAAC;AAShF,wBAAgB,YAAY,sBA2P3B"}
@@ -1,11 +1,13 @@
1
- import { MultiSelectDropDownList } from '@rh-support/components';
1
+ import { Button, Divider, MenuToggle, Select, SelectList, SelectOption, TextInputGroup, TextInputGroupMain, TextInputGroupUtilities, } from '@patternfly/react-core';
2
+ import TimesIcon from '@patternfly/react-icons/dist/js/icons/times-icon';
2
3
  import { GlobalMetadataStateContext } from '@rh-support/react-context';
3
4
  import { ability, resourceActions, resources } from '@rh-support/user-permissions';
4
- import { getDropdownBtnPlaceholder, toOptions } from '@rh-support/utils';
5
- import React, { useContext } from 'react';
5
+ import { getDropdownBtnPlaceholder } from '@rh-support/utils';
6
+ import isEmpty from 'lodash/isEmpty';
7
+ import isUndefined from 'lodash/isUndefined';
8
+ import React, { useContext, useEffect, useMemo, useRef, useState } from 'react';
6
9
  import { Trans, useTranslation } from 'react-i18next';
7
10
  import { Link } from 'react-router-dom';
8
- import { FILTER_SEARCHABLE_MODE_LIMIT } from '../../../enums/caseSearch';
9
11
  import { SolrKeys } from '../../../enums/filters';
10
12
  import { filterNamesMap } from '../../../utils/constants';
11
13
  import { CaseListFilterDispatchContext, CaseListFilterStateContext } from '../CaseListFilterContext';
@@ -15,30 +17,158 @@ export function GroupsFilter() {
15
17
  const { globalMetadataState: { caseGroups }, } = useContext(GlobalMetadataStateContext);
16
18
  const { filterInfo } = useContext(CaseListFilterStateContext);
17
19
  const dispatch = useContext(CaseListFilterDispatchContext);
20
+ const [inputValue, setInputValue] = useState('');
21
+ const [focusedItemIndex, setFocusedItemIndex] = useState(null);
22
+ const [activeItem, setActiveItem] = useState(null);
23
+ const list = [
24
+ ...(caseGroups.data ? caseGroups === null || caseGroups === void 0 ? void 0 : caseGroups.data.map((group) => ({ value: group.name, key: group.groupNum })) : []),
25
+ ];
26
+ const [selectOptions, setSelectOptions] = useState(list);
18
27
  const canViewManageTab = ability.can(resourceActions.READ, resources.MANAGE);
19
28
  const canViewCaseGroups = ability.can(resourceActions.READ, resources.CASE_GROUPS) && canViewManageTab;
20
- const onGroupFilterChange = (selectedGroups) => {
21
- selectedGroups = selectedGroups.map((i) => i.value);
22
- updateFilter(dispatch, { filterKey: SolrKeys.group, values: selectedGroups });
29
+ const [isOpen, setIsOpen] = useState(false);
30
+ const [selectedItems, setSelectedItems] = useState({});
31
+ const textInputRef = useRef();
32
+ const onToggleClick = (e) => {
33
+ e.stopPropagation();
34
+ setIsOpen(!isOpen);
23
35
  };
24
- const isFilterSearchable = caseGroups.data && caseGroups.data.length > FILTER_SEARCHABLE_MODE_LIMIT;
25
- const list = [
26
- ...(caseGroups.data ? caseGroups.data.map((group) => ({ value: group.name, key: group.groupNum })) : []),
27
- {
28
- children: canViewCaseGroups ? (React.createElement(React.Fragment, null,
29
- React.createElement("div", { className: "pf-c-divider", role: "separator" }),
30
- React.createElement(Link, { className: "cta cta-link pf-c-select__menu-item", to: "/manage/groups" },
31
- React.createElement(Trans, null, "Manage groups")))) : (React.createElement(React.Fragment, null)),
32
- isNotSearchable: true,
33
- isNonActionable: true,
34
- isNotSelectable: true,
35
- },
36
- ];
37
- return (React.createElement(MultiSelectDropDownList, { placeholder: getDropdownBtnPlaceholder(t('Select a group'), filterInfo[SolrKeys.group], ' ', (caseGroups.data || []).length, t('All selected')), "data-tracking-id": "groups-filter", id: "case-list-group-filter", title: t(filterNamesMap[SolrKeys.group]), label: t(filterNamesMap[SolrKeys.group]), searchable: isFilterSearchable, onChange: onGroupFilterChange, selectedItems: toOptions(filterInfo[SolrKeys.group], { labelKey: 'value' }), list: toOptions(list, {
38
- labelKey: 'value',
39
- childrenKey: 'children',
40
- nonSearchableItemKey: 'isNotSearchable',
41
- nonActionableItemKey: 'isNonActionable',
42
- nonSelectableItemKey: 'isNotSelectable',
43
- }) }));
36
+ const onSelect = (option) => {
37
+ const prevSelectedGroups = Object.keys(selectedItems).filter((item) => selectedItems[item] && item);
38
+ if (selectedItems[option.value]) {
39
+ setSelectedItems((prevData) => (Object.assign(Object.assign({}, prevData), { [option.value]: !prevData[option.value] })));
40
+ const indexOfGroup = prevSelectedGroups.indexOf(option.value);
41
+ prevSelectedGroups.splice(indexOfGroup, 1);
42
+ }
43
+ else {
44
+ setSelectedItems((prevData) => (Object.assign(Object.assign({}, prevData), { [option.value]: true })));
45
+ prevSelectedGroups.push(option.value);
46
+ }
47
+ const mapValueToKey = (value) => {
48
+ const selectedItem = list.find((item) => item.value === value);
49
+ return selectedItem;
50
+ };
51
+ const updatedFilterValues = prevSelectedGroups.map((item) => mapValueToKey(item));
52
+ updateFilter(dispatch, {
53
+ filterKey: SolrKeys.group,
54
+ values: updatedFilterValues,
55
+ });
56
+ };
57
+ const handleMenuArrowKeys = (key) => {
58
+ let indexToFocus;
59
+ if (isOpen) {
60
+ if (key === 'ArrowUp') {
61
+ // When no index is set or at the first index, focus to the last, otherwise decrement focus index
62
+ if (focusedItemIndex === null || focusedItemIndex === 0) {
63
+ indexToFocus = (list === null || list === void 0 ? void 0 : list.length) - 1;
64
+ }
65
+ else {
66
+ indexToFocus = focusedItemIndex - 1;
67
+ }
68
+ }
69
+ if (key === 'ArrowDown') {
70
+ // When no index is set or at the last index, focus to the first, otherwise increment focus index
71
+ if (focusedItemIndex === null || focusedItemIndex === (list === null || list === void 0 ? void 0 : list.length) - 1) {
72
+ indexToFocus = 0;
73
+ }
74
+ else {
75
+ indexToFocus = focusedItemIndex + 1;
76
+ }
77
+ }
78
+ setFocusedItemIndex(indexToFocus);
79
+ const focusedItem = list[indexToFocus];
80
+ setActiveItem(`select-multi-typeahead-checkbox-${focusedItem === null || focusedItem === void 0 ? void 0 : focusedItem.value.replace(' ', '-')}`);
81
+ }
82
+ };
83
+ const onInputKeyDown = (event) => {
84
+ const focusedItem = focusedItemIndex ? list[focusedItemIndex] : list[0];
85
+ switch (event.key) {
86
+ // Select the first available option
87
+ case 'Enter':
88
+ if (!isOpen) {
89
+ setIsOpen((prevIsOpen) => !prevIsOpen);
90
+ }
91
+ else if (isOpen && (focusedItem === null || focusedItem === void 0 ? void 0 : focusedItem.value) !== 'no results') {
92
+ onSelect(focusedItem === null || focusedItem === void 0 ? void 0 : focusedItem.value);
93
+ }
94
+ break;
95
+ case 'Tab':
96
+ case 'Escape':
97
+ setIsOpen(false);
98
+ setActiveItem(null);
99
+ break;
100
+ case 'ArrowUp':
101
+ case 'ArrowDown':
102
+ event.preventDefault();
103
+ handleMenuArrowKeys(event.key);
104
+ break;
105
+ }
106
+ };
107
+ const onTextInputChange = (_event, value) => {
108
+ setInputValue(value);
109
+ };
110
+ const placeholder = getDropdownBtnPlaceholder(t('Select a group'), filterInfo[SolrKeys.group], '', (caseGroups.data || []).length, t('All selected'));
111
+ const onClick = () => {
112
+ var _a;
113
+ setInputValue('');
114
+ setSelectedItems({});
115
+ updateFilter(dispatch, {
116
+ filterKey: SolrKeys.group,
117
+ values: [],
118
+ });
119
+ (_a = textInputRef === null || textInputRef === void 0 ? void 0 : textInputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
120
+ };
121
+ const toggle = (toggleRef) => (React.createElement(MenuToggle, { variant: "typeahead", onClick: onToggleClick, innerRef: toggleRef, isExpanded: isOpen, isFullWidth: true },
122
+ React.createElement(TextInputGroup, { isPlain: true },
123
+ React.createElement(TextInputGroupMain, Object.assign({ value: inputValue, onClick: onToggleClick, onChange: onTextInputChange, onKeyDown: onInputKeyDown, id: "multi-typeahead-select-checkbox-input", autoComplete: "off", innerRef: textInputRef, placeholder: placeholder }, (activeItem && { 'aria-activedescendant': activeItem }), { role: "combobox", isExpanded: isOpen, "aria-controls": "select-multi-typeahead-checkbox-listbox" })),
124
+ Object.keys(selectedItems).filter((key) => selectedItems[key] === true).length ? (React.createElement(TextInputGroupUtilities, null,
125
+ React.createElement(Button, { variant: "plain", onClick: onClick, "aria-label": "Clear input value" },
126
+ React.createElement(TimesIcon, { "aria-hidden": true })))) : (''))));
127
+ const dropdownOptions = useMemo(() => {
128
+ return (!isEmpty(selectOptions) ? selectOptions : list).map((option, index) => !isUndefined(option.value) && (React.createElement(SelectOption, { key: option.key, value: option, hasCheckbox: true, isSelected: selectedItems[option.value], isFocused: focusedItemIndex !== null && focusedItemIndex === index, id: `select-multi-typeahead-${option.value.replace(' ', '-')}` }, option.value)));
129
+ // eslint-disable-next-line react-hooks/exhaustive-deps
130
+ }, [selectedItems, caseGroups === null || caseGroups === void 0 ? void 0 : caseGroups.data, selectOptions, focusedItemIndex]);
131
+ useEffect(() => {
132
+ let newSelectOptions = list;
133
+ // Filter menu items based on the text input value when one exists
134
+ if (inputValue) {
135
+ newSelectOptions = list.filter((option) => String(option === null || option === void 0 ? void 0 : option.value).toLowerCase().startsWith(inputValue.toLowerCase()));
136
+ // When no options are found after filtering, display 'No results found'
137
+ if (!newSelectOptions.length) {
138
+ newSelectOptions = [{ isDisabled: false, children: `No results found` }];
139
+ }
140
+ // Open the menu when the input value changes and the new value is not empty
141
+ if (!isOpen) {
142
+ setIsOpen(true);
143
+ }
144
+ }
145
+ setSelectOptions(newSelectOptions);
146
+ setFocusedItemIndex(null);
147
+ setActiveItem(null);
148
+ // eslint-disable-next-line react-hooks/exhaustive-deps
149
+ }, [inputValue]);
150
+ useEffect(() => {
151
+ var _a;
152
+ if (isEmpty(filterInfo[SolrKeys.group])) {
153
+ setSelectedItems({});
154
+ }
155
+ else {
156
+ const selectedGroups = (_a = filterInfo[SolrKeys.group]) === null || _a === void 0 ? void 0 : _a.reduce((selection, group) => {
157
+ selection[group === null || group === void 0 ? void 0 : group.value] = true;
158
+ return selection;
159
+ }, {});
160
+ setSelectedItems(selectedGroups);
161
+ }
162
+ // eslint-disable-next-line react-hooks/exhaustive-deps
163
+ }, [filterInfo[SolrKeys.group]]);
164
+ return (React.createElement("div", { className: "group-filter" },
165
+ React.createElement("label", { htmlFor: "case-list-group-filter", className: "pf-v5-u-mb-sm group-filter-label" }, t(filterNamesMap[SolrKeys.group])),
166
+ React.createElement("div", { className: "pf-v5-c-select" },
167
+ React.createElement(Select, { role: "menu", "data-tracking-id": "groups-filter", id: "case-list-group-filter", title: t(filterNamesMap[SolrKeys.group]), isOpen: isOpen, selected: selectedItems, onSelect: (_e, v) => onSelect(v), onOpenChange: (nextOpen) => setIsOpen(nextOpen), popperProps: { direction: 'down', enableFlip: false }, toggle: toggle, isScrollable: true },
168
+ React.createElement(SelectList, null, dropdownOptions),
169
+ canViewCaseGroups && (React.createElement(React.Fragment, null,
170
+ React.createElement(Divider, { className: "case-group-filter" }),
171
+ React.createElement(SelectList, null,
172
+ React.createElement(Link, { className: "cta cta-link pf-v5-c-select__menu-item", to: "/manage/groups" },
173
+ React.createElement(Trans, null, "Manage groups")))))))));
44
174
  }
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ export default function InternalSsoNameFilter(): React.JSX.Element;
3
+ //# sourceMappingURL=InternalSsoNameFilter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InternalSsoNameFilter.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-list-filters/InternalSsoNameFilter.tsx"],"names":[],"mappings":"AAwBA,OAAO,KAA2D,MAAM,OAAO,CAAC;AAUhF,MAAM,CAAC,OAAO,UAAU,qBAAqB,sBA+R5C"}