@rh-support/cases 2.6.233 → 2.6.235
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.
- package/lib/esm/components/case/NewCaseButton.js +1 -1
- package/lib/esm/components/case-list/CaseList.d.ts +7 -0
- package/lib/esm/components/case-list/CaseList.d.ts.map +1 -1
- package/lib/esm/components/case-list/CaseList.js +137 -374
- package/lib/esm/components/case-list/CaseListContext.d.ts.map +1 -1
- package/lib/esm/components/case-list/CaseListContext.js +2 -5
- package/lib/esm/components/case-list/CaseListFilterContext.d.ts.map +1 -1
- package/lib/esm/components/case-list/CaseListFilterContext.js +1 -2
- package/lib/esm/components/case-list/CaseListFilterHelpers.d.ts +2 -3
- package/lib/esm/components/case-list/CaseListFilterHelpers.d.ts.map +1 -1
- package/lib/esm/components/case-list/CaseListFilterHelpers.js +6 -19
- package/lib/esm/components/case-list/CaseListFilterReducer.d.ts +4 -36
- package/lib/esm/components/case-list/CaseListFilterReducer.d.ts.map +1 -1
- package/lib/esm/components/case-list/CaseListFilterReducer.js +12 -6
- package/lib/esm/components/case-list/CaseListReducer.d.ts +10 -22
- package/lib/esm/components/case-list/CaseListReducer.d.ts.map +1 -1
- package/lib/esm/components/case-list/CaseListReducer.js +7 -25
- package/lib/esm/components/case-list/case-list-filters/AccountsFilter.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/AccountsFilter.js +11 -18
- package/lib/esm/components/case-list/case-list-filters/AdditionalFilters.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/AdditionalFilters.js +4 -20
- package/lib/esm/components/case-list/case-list-filters/CaseListFilterChips.d.ts +7 -1
- package/lib/esm/components/case-list/case-list-filters/CaseListFilterChips.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/CaseListFilterChips.js +16 -12
- package/lib/esm/components/case-list/case-list-filters/CaseListFilters.d.ts +5 -2
- package/lib/esm/components/case-list/case-list-filters/CaseListFilters.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/CaseListFilters.js +13 -14
- package/lib/esm/components/case-list/case-list-filters/CreatorSsoNameFilter.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/CreatorSsoNameFilter.js +14 -21
- package/lib/esm/components/case-list/case-list-filters/CreatorSsoNameFilterChip.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/CreatorSsoNameFilterChip.js +0 -3
- package/lib/esm/components/case-list/case-list-filters/GroupsFilter.d.ts +1 -11
- package/lib/esm/components/case-list/case-list-filters/GroupsFilter.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/GroupsFilter.js +70 -90
- package/lib/esm/components/case-list/case-list-filters/ProductFilterChip.d.ts +3 -1
- package/lib/esm/components/case-list/case-list-filters/ProductFilterChip.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/ProductFilterChip.js +2 -2
- package/lib/esm/components/case-list/case-list-filters/ProductsFilter.d.ts +4 -5
- package/lib/esm/components/case-list/case-list-filters/ProductsFilter.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/ProductsFilter.js +54 -15
- package/lib/esm/components/case-list/case-list-filters/SeverityFilter.d.ts +3 -0
- package/lib/esm/components/case-list/case-list-filters/SeverityFilter.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/SeverityFilter.js +44 -18
- package/lib/esm/components/case-list/case-list-filters/StatusFilter.d.ts +3 -0
- package/lib/esm/components/case-list/case-list-filters/StatusFilter.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/StatusFilter.js +49 -23
- package/lib/esm/components/case-list/case-list-filters/VersionsFilter.d.ts +3 -1
- package/lib/esm/components/case-list/case-list-filters/VersionsFilter.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/VersionsFilter.js +59 -60
- package/lib/esm/components/case-list/case-list-table/CaseListTable.d.ts +3 -10
- package/lib/esm/components/case-list/case-list-table/CaseListTable.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-table/CaseListTable.js +84 -98
- package/lib/esm/components/case-list/case-list-table/DownloadCSVFileModal.d.ts +5 -0
- package/lib/esm/components/case-list/case-list-table/DownloadCSVFileModal.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-table/DownloadCSVFileModal.js +70 -51
- package/lib/esm/components/case-list/case-list-table/ExportCaseListCSV.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-table/ExportCaseListCSV.js +15 -5
- package/lib/esm/components/case-list/case-list-table/SeverityLabel.js +1 -1
- package/lib/esm/components/case-list/case-list-table/TableActionsDropdown.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-table/TableActionsDropdown.js +3 -2
- package/lib/esm/components/case-list/case-list-table/table-column-selector/TableColumnSelector.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-table/table-column-selector/TableColumnSelector.js +0 -1
- package/lib/esm/components/case-list/case-search/BookmarkedSearchesSelector.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-search/BookmarkedSearchesSelector.js +2 -15
- package/lib/esm/components/case-list/case-search/CaseSearch.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-search/CaseSearch.js +24 -55
- package/lib/esm/components/case-list/case-search/useAdvanceSearchParser.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-search/useAdvanceSearchParser.js +1 -2
- package/lib/esm/css/caseList.css +23 -188
- package/lib/esm/css/caseSearch.css +0 -114
- package/lib/esm/enums/case.d.ts +5 -13
- package/lib/esm/enums/case.d.ts.map +1 -1
- package/lib/esm/enums/case.js +3 -23
- package/lib/esm/enums/caseSearch.d.ts +0 -3
- package/lib/esm/enums/caseSearch.d.ts.map +1 -1
- package/lib/esm/enums/caseSearch.js +1 -2
- package/lib/esm/enums/filters.d.ts +1 -5
- package/lib/esm/enums/filters.d.ts.map +1 -1
- package/lib/esm/enums/filters.js +0 -4
- package/lib/esm/hooks/useCloseCase.d.ts.map +1 -1
- package/lib/esm/hooks/useCloseCase.js +21 -38
- package/lib/esm/hooks/useExportCaseListCSV.d.ts.map +1 -1
- package/lib/esm/hooks/useExportCaseListCSV.js +9 -1
- package/lib/esm/hooks/useFilterStateOnLoad.d.ts +1 -1
- package/lib/esm/hooks/useFilterStateOnLoad.d.ts.map +1 -1
- package/lib/esm/hooks/useFilterStateOnLoad.js +5 -7
- package/lib/esm/index.js +0 -1
- package/lib/esm/models/caseList.d.ts +0 -1
- package/lib/esm/models/caseList.d.ts.map +1 -1
- package/lib/esm/test-utils/mockData.d.ts +0 -1
- package/lib/esm/test-utils/mockData.d.ts.map +1 -1
- package/lib/esm/test-utils/mockData.js +1 -2
- package/lib/esm/utils/caseSearchUtils.d.ts.map +1 -1
- package/lib/esm/utils/caseSearchUtils.js +2 -39
- package/lib/esm/utils/constants.d.ts +1 -5
- package/lib/esm/utils/constants.d.ts.map +1 -1
- package/lib/esm/utils/constants.js +2 -10
- package/lib/esm/utils/mockSolrResponse.js +1 -1
- package/package.json +8 -10
- package/lib/esm/components/case-list/case-list-filters/CaseLabelsFilter.d.ts +0 -3
- package/lib/esm/components/case-list/case-list-filters/CaseLabelsFilter.d.ts.map +0 -1
- package/lib/esm/components/case-list/case-list-filters/CaseLabelsFilter.js +0 -178
- package/lib/esm/components/case-list/case-list-table/ArchivedCaseLabel.d.ts +0 -3
- package/lib/esm/components/case-list/case-list-table/ArchivedCaseLabel.d.ts.map +0 -1
- package/lib/esm/components/case-list/case-list-table/ArchivedCaseLabel.js +0 -8
- package/lib/esm/components/case-list/case-list-table/CaseListLabelGroup.d.ts +0 -9
- package/lib/esm/components/case-list/case-list-table/CaseListLabelGroup.d.ts.map +0 -1
- package/lib/esm/components/case-list/case-list-table/CaseListLabelGroup.js +0 -105
- package/lib/esm/components/case-list/case-list-table/CaseListTableRow.d.ts +0 -33
- package/lib/esm/components/case-list/case-list-table/CaseListTableRow.d.ts.map +0 -1
- package/lib/esm/components/case-list/case-list-table/CaseListTableRow.js +0 -51
- package/lib/esm/components/case-list/case-list-table/CaseListTableSkeletonRow.d.ts +0 -9
- package/lib/esm/components/case-list/case-list-table/CaseListTableSkeletonRow.d.ts.map +0 -1
- package/lib/esm/components/case-list/case-list-table/CaseListTableSkeletonRow.js +0 -10
- package/lib/esm/components/case-list/case-search/AdvanceSearchToggleButton.d.ts +0 -8
- package/lib/esm/components/case-list/case-search/AdvanceSearchToggleButton.d.ts.map +0 -1
- package/lib/esm/components/case-list/case-search/AdvanceSearchToggleButton.js +0 -8
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchAccountSection.d.ts +0 -10
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchAccountSection.d.ts.map +0 -1
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchAccountSection.js +0 -29
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchAuditsSection.d.ts +0 -10
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchAuditsSection.d.ts.map +0 -1
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchAuditsSection.js +0 -16
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchCaseSection.d.ts +0 -9
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchCaseSection.d.ts.map +0 -1
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchCaseSection.js +0 -21
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchDateRangeField.d.ts +0 -12
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchDateRangeField.d.ts.map +0 -1
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchDateRangeField.js +0 -31
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchFieldBlock.d.ts +0 -10
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchFieldBlock.d.ts.map +0 -1
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchFieldBlock.js +0 -10
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchModal.d.ts +0 -10
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchModal.d.ts.map +0 -1
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchModal.js +0 -92
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchOwnerSection.d.ts +0 -9
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchOwnerSection.d.ts.map +0 -1
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchOwnerSection.js +0 -20
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchProductSection.d.ts +0 -9
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchProductSection.d.ts.map +0 -1
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchProductSection.js +0 -28
- package/lib/esm/components/case-list/case-search/advance-search-modal/ProductVersionDrilldownSelect.d.ts +0 -9
- package/lib/esm/components/case-list/case-search/advance-search-modal/ProductVersionDrilldownSelect.d.ts.map +0 -1
- package/lib/esm/components/case-list/case-search/advance-search-modal/ProductVersionDrilldownSelect.js +0 -241
- package/lib/esm/components/case-list/case-search/advance-search-modal/SelectableLabelFilter.d.ts +0 -11
- package/lib/esm/components/case-list/case-search/advance-search-modal/SelectableLabelFilter.d.ts.map +0 -1
- package/lib/esm/components/case-list/case-search/advance-search-modal/SelectableLabelFilter.js +0 -23
- package/lib/esm/hooks/useCaseLabels.d.ts +0 -14
- package/lib/esm/hooks/useCaseLabels.d.ts.map +0 -1
- package/lib/esm/hooks/useCaseLabels.js +0 -50
- package/lib/esm/utils/advanceSearchFormMapper.d.ts +0 -11
- package/lib/esm/utils/advanceSearchFormMapper.d.ts.map +0 -1
- package/lib/esm/utils/advanceSearchFormMapper.js +0 -71
- package/lib/esm/utils/advanceSearchUtils.d.ts +0 -24
- package/lib/esm/utils/advanceSearchUtils.d.ts.map +0 -1
- package/lib/esm/utils/advanceSearchUtils.js +0 -150
- package/lib/esm/utils/caseGroupDefaultFilterUtils.d.ts +0 -12
- package/lib/esm/utils/caseGroupDefaultFilterUtils.d.ts.map +0 -1
- package/lib/esm/utils/caseGroupDefaultFilterUtils.js +0 -34
- package/lib/esm/utils/caseGroupDefaultUtils.d.ts +0 -10
- package/lib/esm/utils/caseGroupDefaultUtils.d.ts.map +0 -1
- package/lib/esm/utils/caseGroupDefaultUtils.js +0 -20
- package/lib/esm/utils/caseListGraphQLUtils.d.ts +0 -28
- package/lib/esm/utils/caseListGraphQLUtils.d.ts.map +0 -1
- package/lib/esm/utils/caseListGraphQLUtils.js +0 -304
- package/lib/esm/utils/caseListMapper.d.ts +0 -6
- package/lib/esm/utils/caseListMapper.d.ts.map +0 -1
- package/lib/esm/utils/caseListMapper.js +0 -47
- package/lib/esm/utils/caseListVariablesBuilder.d.ts +0 -17
- package/lib/esm/utils/caseListVariablesBuilder.d.ts.map +0 -1
- package/lib/esm/utils/caseListVariablesBuilder.js +0 -535
|
@@ -328,7 +328,6 @@ function createURLQueryFromFilterState(filterState) {
|
|
|
328
328
|
return finalQuery;
|
|
329
329
|
}
|
|
330
330
|
function createFilterStateFromUrlQuery(urlQuery, globalMetadataState, pageSize, currentPage, searchType = CaseSearchQueryType.BASIC) {
|
|
331
|
-
var _a;
|
|
332
331
|
const { paginationInfo: defaultPaginationInfo, sortInfo: defaultSortInfo, filterInfo: defaultFilterInfo, filterQueryInfo: defaultFilterQueryInfo, } = initialCaseFilterState;
|
|
333
332
|
const [filters = '', sortQuery] = (urlQuery || '').split(/orderBy/i);
|
|
334
333
|
const paginationInfoFromUrl = {
|
|
@@ -342,7 +341,7 @@ function createFilterStateFromUrlQuery(urlQuery, globalMetadataState, pageSize,
|
|
|
342
341
|
sortInfo = { column, direction: direction };
|
|
343
342
|
}
|
|
344
343
|
const filterInfo = {};
|
|
345
|
-
const
|
|
344
|
+
const _a = parseSolrQuery(filters), { keyword: queryString = [''] } = _a, restFilters = __rest(_a, ["keyword"]);
|
|
346
345
|
const filterQueryInfo = merge({}, defaultFilterQueryInfo, {
|
|
347
346
|
queryString: queryString[0].replace(/\\"/g, '"'),
|
|
348
347
|
type: searchType,
|
|
@@ -359,9 +358,6 @@ function createFilterStateFromUrlQuery(urlQuery, globalMetadataState, pageSize,
|
|
|
359
358
|
}
|
|
360
359
|
}
|
|
361
360
|
});
|
|
362
|
-
if ((_a = filterInfo[SolrPivotKeys.product_version]) === null || _a === void 0 ? void 0 : _a.length) {
|
|
363
|
-
enrichProductFilterWithIds(filterInfo[SolrPivotKeys.product_version], globalMetadataState);
|
|
364
|
-
}
|
|
365
361
|
const parsedQuery = filterQueryInfo.type === CaseSearchQueryType.ADVANCED
|
|
366
362
|
? createUserFriendlyQueryFromFilterStateAdvancedSearch(filterInfo, filterQueryInfo.queryString)
|
|
367
363
|
: '';
|
|
@@ -375,7 +371,6 @@ function createFilterStateFromUrlQuery(urlQuery, globalMetadataState, pageSize,
|
|
|
375
371
|
}
|
|
376
372
|
// advanced query
|
|
377
373
|
function createFilterStateFromAdvancedQuery(queryString, globalMetadataState, currentFilterState, parsedQuery = '', type = CaseSearchQueryType.BASIC) {
|
|
378
|
-
var _a;
|
|
379
374
|
const filterObj = parseSolrQuery(queryString);
|
|
380
375
|
const newFilterInfo = {};
|
|
381
376
|
let advanceToBasicQuery = [];
|
|
@@ -428,9 +423,6 @@ function createFilterStateFromAdvancedQuery(queryString, globalMetadataState, cu
|
|
|
428
423
|
}
|
|
429
424
|
delete newFilterInfo[SolrKeys.version];
|
|
430
425
|
}
|
|
431
|
-
if ((_a = newFilterInfo[SolrPivotKeys.product_version]) === null || _a === void 0 ? void 0 : _a.length) {
|
|
432
|
-
enrichProductFilterWithIds(newFilterInfo[SolrPivotKeys.product_version], globalMetadataState);
|
|
433
|
-
}
|
|
434
426
|
const filterState = Object.assign(Object.assign({}, currentFilterState), { filterQueryInfo: Object.assign(Object.assign({}, currentFilterState.filterQueryInfo), { queryString: advanceToBasicQuery.join(' AND '), parsedQuery,
|
|
435
427
|
type }), filterInfo: Object.assign(Object.assign({}, initialCaseFilterState.filterInfo), newFilterInfo) });
|
|
436
428
|
return filterState;
|
|
@@ -454,18 +446,9 @@ function getValidValues(solrFieldName, itemValues = [], globalMetadataState) {
|
|
|
454
446
|
return acc;
|
|
455
447
|
}, {});
|
|
456
448
|
itemValues.forEach((item) => {
|
|
457
|
-
|
|
458
|
-
mappedValues.push({ key: item, value: caseGroupsMap[item] });
|
|
459
|
-
}
|
|
460
|
-
else if (item && /^\d+$/.test(item)) {
|
|
461
|
-
console.warn(`[CaseSearch] Ignoring stale numeric group filter "${item}" from URL/saved search — group IDs are now Salesforce record IDs`);
|
|
462
|
-
}
|
|
449
|
+
caseGroupsMap[item] && mappedValues.push({ key: item, value: caseGroupsMap[item] });
|
|
463
450
|
});
|
|
464
451
|
}
|
|
465
|
-
else if (solrFieldName === SolrKeys.caseLabel) {
|
|
466
|
-
// Label names are resolved later by CaseLabelsFilter once account labels load
|
|
467
|
-
mappedValues = itemValues.map((item) => ({ key: item, value: item }));
|
|
468
|
-
}
|
|
469
452
|
else if (solrFieldName === SolrKeys.accountNumber) {
|
|
470
453
|
// when we go live with grouped bookmark, bookmarkedAccounts needs to be removed
|
|
471
454
|
let bookmarkedAccountsMap = (((_b = globalMetadataState.bookmarkedAccounts) === null || _b === void 0 ? void 0 : _b.data) || []).reduce((acc, { accountNumber, name }) => {
|
|
@@ -517,9 +500,6 @@ function getValidValuesAdvancedSearch(solrFieldName, itemValues = [], globalMeta
|
|
|
517
500
|
caseGroupsMap[item] && mappedValues.push({ key: caseGroupsMap[item], value: item });
|
|
518
501
|
});
|
|
519
502
|
}
|
|
520
|
-
else if (solrFieldName === SolrKeys.caseLabel) {
|
|
521
|
-
mappedValues = itemValues.map((item) => ({ key: item, value: item }));
|
|
522
|
-
}
|
|
523
503
|
else if (solrFieldName === SolrKeys.accountNumber) {
|
|
524
504
|
let bookmarkedAccountsMap = (((_b = globalMetadataState.bookmarkedAccounts) === null || _b === void 0 ? void 0 : _b.data) || []).reduce((acc, { accountNumber, name }) => {
|
|
525
505
|
acc[accountNumber] = getLabel(accountNumber, name);
|
|
@@ -576,21 +556,4 @@ function generateProductVersionPivotValue(values) {
|
|
|
576
556
|
};
|
|
577
557
|
});
|
|
578
558
|
}
|
|
579
|
-
/**
|
|
580
|
-
* Enriches product filter objects (from URL) with their parent Product2 IDs
|
|
581
|
-
* by matching product names against the allProducts metadata loaded at startup.
|
|
582
|
-
* This allows buildProductFilter to use ParentProduct__c when version IDs aren't yet resolved.
|
|
583
|
-
*/
|
|
584
|
-
function enrichProductFilterWithIds(products, globalMetadataState) {
|
|
585
|
-
var _a, _b;
|
|
586
|
-
const allProductsList = ((_b = (_a = globalMetadataState === null || globalMetadataState === void 0 ? void 0 : globalMetadataState.allProducts) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.productsResult) || [];
|
|
587
|
-
products.forEach((prod) => {
|
|
588
|
-
if (prod.productId)
|
|
589
|
-
return;
|
|
590
|
-
const matched = allProductsList.find((p) => p.name === prod.value || p.product === prod.value);
|
|
591
|
-
if (matched === null || matched === void 0 ? void 0 : matched.productId) {
|
|
592
|
-
prod.productId = matched.productId;
|
|
593
|
-
}
|
|
594
|
-
});
|
|
595
|
-
}
|
|
596
559
|
export { createSolrQueryFromFilterState, createUserFriendlyQueryFromFilterState, createUserFriendlyQueryFromFilterStateAdvancedSearch, createQueryForCSVDownload, createSFDCQueryFromFilterState, mapSFDCCaseListToSolrCaseList, createURLQueryFromFilterState, createFilterStateFromUrlQuery, createAdvancedSearchQueryFromFilterState, createFilterStateFromAdvancedQuery, };
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
export { PORTAL_STATUS_GROUPS, PORTAL_DISPLAY_STATUSES, PORTAL_USER_SELECTABLE_STATUSES, PORTAL_OPEN_DISPLAY_STATUSES, } from '@rh-support/utils';
|
|
2
1
|
export declare const filterNamesMap: {
|
|
3
2
|
readonly case_status: any;
|
|
4
3
|
readonly case_severity: any;
|
|
5
4
|
readonly case_folderNumber: any;
|
|
6
|
-
readonly case_label: any;
|
|
7
5
|
readonly case_accountNumber: any;
|
|
8
6
|
readonly case_summary: any;
|
|
9
7
|
readonly case_customer_escalation: any;
|
|
@@ -18,9 +16,7 @@ export declare const filterNamesMap: {
|
|
|
18
16
|
readonly case_createdby_sso_username: any;
|
|
19
17
|
readonly case_contact_sso_username: any;
|
|
20
18
|
readonly case_type: any;
|
|
21
|
-
readonly
|
|
22
|
-
readonly case_openshift_cluster_id: any;
|
|
19
|
+
readonly case_private: any;
|
|
23
20
|
readonly usernameFilterTitle: any;
|
|
24
21
|
};
|
|
25
|
-
export declare const UpdatedCaseDataEvent = "PCM-Next > case-list-data-background-refresh";
|
|
26
22
|
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/utils/constants.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/utils/constants.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;CA0D1B,CAAC"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import i18n from 'i18next';
|
|
2
2
|
import { SolrKeys } from '../enums/filters';
|
|
3
|
-
export { PORTAL_STATUS_GROUPS, PORTAL_DISPLAY_STATUSES, PORTAL_USER_SELECTABLE_STATUSES, PORTAL_OPEN_DISPLAY_STATUSES, } from '@rh-support/utils';
|
|
4
3
|
// used for adding title text for different solr fields
|
|
5
4
|
// test
|
|
6
5
|
export const filterNamesMap = {
|
|
@@ -13,9 +12,6 @@ export const filterNamesMap = {
|
|
|
13
12
|
get [SolrKeys.group]() {
|
|
14
13
|
return i18n.t('Groups');
|
|
15
14
|
},
|
|
16
|
-
get [SolrKeys.caseLabel]() {
|
|
17
|
-
return i18n.t('Case labels');
|
|
18
|
-
},
|
|
19
15
|
get [SolrKeys.accountNumber]() {
|
|
20
16
|
return i18n.t('Bookmarks');
|
|
21
17
|
},
|
|
@@ -58,14 +54,10 @@ export const filterNamesMap = {
|
|
|
58
54
|
get [SolrKeys.type]() {
|
|
59
55
|
return i18n.t('Support type');
|
|
60
56
|
},
|
|
61
|
-
get [SolrKeys.
|
|
62
|
-
return i18n.t('
|
|
63
|
-
},
|
|
64
|
-
get [SolrKeys.openshiftClusterId]() {
|
|
65
|
-
return i18n.t('Cluster ID');
|
|
57
|
+
get [SolrKeys.isPrivate]() {
|
|
58
|
+
return i18n.t('Private');
|
|
66
59
|
},
|
|
67
60
|
get usernameFilterTitle() {
|
|
68
61
|
return i18n.t('Username');
|
|
69
62
|
},
|
|
70
63
|
};
|
|
71
|
-
export const UpdatedCaseDataEvent = 'PCM-Next > case-list-data-background-refresh';
|
|
@@ -319,7 +319,7 @@ export const mockSolrResponse = {
|
|
|
319
319
|
'dfisher dummy test',
|
|
320
320
|
0,
|
|
321
321
|
],
|
|
322
|
-
case_severity: ['1 (Urgent)', 2335, '2 (High)', 158, '3 (
|
|
322
|
+
case_severity: ['1 (Urgent)', 2335, '2 (High)', 158, '3 (Normal)', 5984, '4 (Low)', 9338],
|
|
323
323
|
case_status: ['Closed', 6348, 'Waiting on Customer', 8, 'Waiting on Red Hat', 11459],
|
|
324
324
|
},
|
|
325
325
|
facet_ranges: {},
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rh-support/cases",
|
|
3
|
-
"version": "2.6.
|
|
3
|
+
"version": "2.6.235",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public",
|
|
6
6
|
"registry": "https://registry.npmjs.org"
|
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
"lib/**/*"
|
|
23
23
|
],
|
|
24
24
|
"peerDependencies": {
|
|
25
|
+
"@cee-eng/hydrajs": "4.18.111",
|
|
25
26
|
"@patternfly/patternfly": "6.2.1",
|
|
26
27
|
"@patternfly/react-core": "6.2.1",
|
|
27
28
|
"@patternfly/react-table": "6.2.1",
|
|
@@ -34,28 +35,25 @@
|
|
|
34
35
|
"solr-query-builder": "1.0.1"
|
|
35
36
|
},
|
|
36
37
|
"dependencies": {
|
|
37
|
-
"@cee-eng/hydrajs": "
|
|
38
|
+
"@cee-eng/hydrajs": "4.18.111",
|
|
38
39
|
"@patternfly/patternfly": "6.2.1",
|
|
39
40
|
"@patternfly/react-core": "6.2.1",
|
|
40
41
|
"@patternfly/react-table": "6.2.1",
|
|
41
|
-
"@rh-support/components": "2.5.
|
|
42
|
-
"@rh-support/react-context": "2.5.
|
|
42
|
+
"@rh-support/components": "2.5.231",
|
|
43
|
+
"@rh-support/react-context": "2.5.327",
|
|
43
44
|
"@rh-support/types": "2.0.26",
|
|
44
|
-
"@rh-support/user-permissions": "2.5.
|
|
45
|
-
"@rh-support/utils": "2.5.
|
|
45
|
+
"@rh-support/user-permissions": "2.5.170",
|
|
46
|
+
"@rh-support/utils": "2.5.149",
|
|
46
47
|
"localforage": "^1.10.0",
|
|
47
48
|
"lodash": "^4.17.21",
|
|
48
49
|
"pegjs": "^0.10.0",
|
|
49
50
|
"react": "18.2.0",
|
|
50
51
|
"react-dom": "18.2.0",
|
|
51
52
|
"react-i18next": "15.6.0",
|
|
52
|
-
"react-intersection-observer": "^10.0.3",
|
|
53
53
|
"react-router-dom": "^5.1.2",
|
|
54
54
|
"solr-query-builder": "1.0.1"
|
|
55
55
|
},
|
|
56
56
|
"devDependencies": {
|
|
57
|
-
"@patternfly/react-styles": "^6.2.1",
|
|
58
|
-
"@patternfly/react-tokens": "^6.2.1",
|
|
59
57
|
"@testing-library/jest-dom": "^6.2.0",
|
|
60
58
|
"@testing-library/react": "^14.1.2",
|
|
61
59
|
"@testing-library/user-event": "^14.5.1",
|
|
@@ -94,5 +92,5 @@
|
|
|
94
92
|
"defaults and supports es6-module",
|
|
95
93
|
"maintained node versions"
|
|
96
94
|
],
|
|
97
|
-
"gitHead": "
|
|
95
|
+
"gitHead": "a4db33129a9d9f0d6a6907d1c48df34784e57021"
|
|
98
96
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CaseLabelsFilter.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-list-filters/CaseLabelsFilter.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAA2D,MAAM,OAAO,CAAC;AAYhF,wBAAgB,gBAAgB,sBAgQ/B"}
|
|
@@ -1,178 +0,0 @@
|
|
|
1
|
-
import { MenuFooter, MenuToggle, Select, SelectList, SelectOption, TextInputGroup, TextInputGroupMain, } from '@patternfly/react-core';
|
|
2
|
-
import { GlobalMetadataStateContext } from '@rh-support/react-context';
|
|
3
|
-
import { ability, resourceActions, resources } from '@rh-support/user-permissions';
|
|
4
|
-
import { getDropdownBtnPlaceholder } from '@rh-support/utils';
|
|
5
|
-
import isEmpty from 'lodash/isEmpty';
|
|
6
|
-
import isEqual from 'lodash/isEqual';
|
|
7
|
-
import isUndefined from 'lodash/isUndefined';
|
|
8
|
-
import React, { useContext, useEffect, useMemo, useRef, useState } from 'react';
|
|
9
|
-
import { Trans, useTranslation } from 'react-i18next';
|
|
10
|
-
import { Link } from 'react-router-dom';
|
|
11
|
-
import { SolrKeys } from '../../../enums/filters';
|
|
12
|
-
import { useCaseLabels } from '../../../hooks/useCaseLabels';
|
|
13
|
-
import { filterNamesMap } from '../../../utils/constants';
|
|
14
|
-
import { CaseListFilterDispatchContext, CaseListFilterStateContext } from '../CaseListFilterContext';
|
|
15
|
-
import { updateFilter } from '../CaseListFilterReducer';
|
|
16
|
-
const EMPTY_LABELS = [];
|
|
17
|
-
export function CaseLabelsFilter() {
|
|
18
|
-
var _a, _b;
|
|
19
|
-
const { t } = useTranslation();
|
|
20
|
-
const { filterInfo } = useContext(CaseListFilterStateContext);
|
|
21
|
-
const dispatch = useContext(CaseListFilterDispatchContext);
|
|
22
|
-
const { globalMetadataState: { loggedInUsersAccount }, } = useContext(GlobalMetadataStateContext);
|
|
23
|
-
const accountId = (_a = loggedInUsersAccount.data) === null || _a === void 0 ? void 0 : _a.salesforceAccountId;
|
|
24
|
-
const { labels, loading: isLoading } = useCaseLabels(accountId);
|
|
25
|
-
const selectedLabels = (_b = filterInfo === null || filterInfo === void 0 ? void 0 : filterInfo[SolrKeys.caseLabel]) !== null && _b !== void 0 ? _b : EMPTY_LABELS;
|
|
26
|
-
const [inputValue, setInputValue] = useState('');
|
|
27
|
-
const [focusedItemIndex, setFocusedItemIndex] = useState(null);
|
|
28
|
-
const [activeItem, setActiveItem] = useState(null);
|
|
29
|
-
const [isOpen, setIsOpen] = useState(false);
|
|
30
|
-
const [selectedItems, setSelectedItems] = useState({});
|
|
31
|
-
const textInputRef = useRef();
|
|
32
|
-
const list = useMemo(() => labels.map((label) => ({ value: label.name, key: label.id })), [labels]);
|
|
33
|
-
const [selectOptions, setSelectOptions] = useState(list);
|
|
34
|
-
const canViewManageTab = ability.can(resourceActions.READ, resources.MANAGE);
|
|
35
|
-
const applyLabelSelection = (updatedFilterValues) => {
|
|
36
|
-
updateFilter(dispatch, {
|
|
37
|
-
filterKey: SolrKeys.caseLabel,
|
|
38
|
-
values: updatedFilterValues,
|
|
39
|
-
});
|
|
40
|
-
};
|
|
41
|
-
const isOptionSelected = (option) => Boolean((option.value && selectedItems[String(option.value)]) || (option.key && selectedItems[String(option.key)]));
|
|
42
|
-
const onToggleClick = () => {
|
|
43
|
-
setIsOpen(!isOpen);
|
|
44
|
-
};
|
|
45
|
-
const onSelect = (option) => {
|
|
46
|
-
const selectedOption = typeof option === 'string' ? list.find((item) => item.value === option || item.key === option) : option;
|
|
47
|
-
const optionValue = selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.value;
|
|
48
|
-
const optionKey = selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.key;
|
|
49
|
-
if (!optionValue || optionValue === 'no results' || !optionKey) {
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
const currentlySelected = selectedLabels.some((label) => label.key === optionKey);
|
|
53
|
-
const updatedFilterValues = currentlySelected
|
|
54
|
-
? selectedLabels.filter((label) => label.key !== optionKey)
|
|
55
|
-
: [
|
|
56
|
-
...selectedLabels.filter((label) => label.key !== optionKey),
|
|
57
|
-
{ key: String(optionKey), value: String(optionValue) },
|
|
58
|
-
];
|
|
59
|
-
applyLabelSelection(updatedFilterValues);
|
|
60
|
-
};
|
|
61
|
-
const handleMenuArrowKeys = (key) => {
|
|
62
|
-
if (!isOpen || !list.length) {
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
65
|
-
let indexToFocus = 0;
|
|
66
|
-
if (key === 'ArrowUp') {
|
|
67
|
-
if (focusedItemIndex === null || focusedItemIndex === 0) {
|
|
68
|
-
indexToFocus = list.length - 1;
|
|
69
|
-
}
|
|
70
|
-
else {
|
|
71
|
-
indexToFocus = focusedItemIndex - 1;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
if (key === 'ArrowDown') {
|
|
75
|
-
if (focusedItemIndex === null || focusedItemIndex === list.length - 1) {
|
|
76
|
-
indexToFocus = 0;
|
|
77
|
-
}
|
|
78
|
-
else {
|
|
79
|
-
indexToFocus = focusedItemIndex + 1;
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
setFocusedItemIndex(indexToFocus);
|
|
83
|
-
const focusedItem = list[indexToFocus];
|
|
84
|
-
if (focusedItem === null || focusedItem === void 0 ? void 0 : focusedItem.value) {
|
|
85
|
-
setActiveItem(`select-multi-typeahead-checkbox-${String(focusedItem.value).replace(' ', '-')}`);
|
|
86
|
-
}
|
|
87
|
-
};
|
|
88
|
-
const onInputKeyDown = (event) => {
|
|
89
|
-
const focusedItem = focusedItemIndex !== null ? list[focusedItemIndex] : list[0];
|
|
90
|
-
switch (event.key) {
|
|
91
|
-
case 'Enter':
|
|
92
|
-
if (!isOpen) {
|
|
93
|
-
setIsOpen((prevIsOpen) => !prevIsOpen);
|
|
94
|
-
}
|
|
95
|
-
else if (isOpen && (focusedItem === null || focusedItem === void 0 ? void 0 : focusedItem.value) !== 'no results') {
|
|
96
|
-
onSelect(focusedItem);
|
|
97
|
-
}
|
|
98
|
-
break;
|
|
99
|
-
case 'Tab':
|
|
100
|
-
case 'Escape':
|
|
101
|
-
setIsOpen(false);
|
|
102
|
-
setActiveItem(null);
|
|
103
|
-
break;
|
|
104
|
-
case 'ArrowUp':
|
|
105
|
-
case 'ArrowDown':
|
|
106
|
-
event.preventDefault();
|
|
107
|
-
handleMenuArrowKeys(event.key);
|
|
108
|
-
break;
|
|
109
|
-
}
|
|
110
|
-
};
|
|
111
|
-
const onTextInputChange = (_event, value) => {
|
|
112
|
-
setInputValue(value);
|
|
113
|
-
};
|
|
114
|
-
const placeholder = getDropdownBtnPlaceholder(isLoading ? t('Loading...') : t('Select a case label'), selectedLabels.map((label) => label.value), '', labels.length || 0, t('All selected'));
|
|
115
|
-
const toggle = (toggleRef) => (React.createElement(MenuToggle, { variant: "typeahead", onClick: onToggleClick, innerRef: toggleRef, isExpanded: isOpen, isFullWidth: true },
|
|
116
|
-
React.createElement(TextInputGroup, { isPlain: true },
|
|
117
|
-
React.createElement(TextInputGroupMain, Object.assign({ value: inputValue, onClick: onToggleClick, onChange: onTextInputChange, onKeyDown: onInputKeyDown, id: "case-list-case-label-filter-input", autoComplete: "off", innerRef: textInputRef, placeholder: placeholder }, (activeItem && { 'aria-activedescendant': activeItem }), { role: "combobox", isExpanded: isOpen, "aria-controls": "case-list-case-label-filter-listbox" })))));
|
|
118
|
-
const dropdownOptions = useMemo(() => {
|
|
119
|
-
return (!isEmpty(selectOptions) ? selectOptions : list).map((option, index) => !isUndefined(option.value) && (React.createElement(SelectOption, { key: option.key, value: option, hasCheckbox: true, isSelected: isOptionSelected(option), isFocused: focusedItemIndex !== null && focusedItemIndex === index, id: `select-multi-typeahead-${String(option.value).replace(' ', '-')}` }, option.value)));
|
|
120
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
121
|
-
}, [selectedItems, selectedLabels, labels, selectOptions, focusedItemIndex]);
|
|
122
|
-
useEffect(() => {
|
|
123
|
-
let newSelectOptions = list;
|
|
124
|
-
if (inputValue) {
|
|
125
|
-
const normalizedInput = inputValue.toLowerCase();
|
|
126
|
-
newSelectOptions = list.filter((option) => String(option === null || option === void 0 ? void 0 : option.value).toLowerCase().includes(normalizedInput));
|
|
127
|
-
if (!newSelectOptions.length) {
|
|
128
|
-
newSelectOptions = [{ isDisabled: false, children: `No results found` }];
|
|
129
|
-
}
|
|
130
|
-
if (!isOpen) {
|
|
131
|
-
setIsOpen(true);
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
setSelectOptions(newSelectOptions);
|
|
135
|
-
setFocusedItemIndex(null);
|
|
136
|
-
setActiveItem(null);
|
|
137
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
138
|
-
}, [inputValue, list]);
|
|
139
|
-
useEffect(() => {
|
|
140
|
-
if (isEmpty(selectedLabels)) {
|
|
141
|
-
setSelectedItems({});
|
|
142
|
-
return;
|
|
143
|
-
}
|
|
144
|
-
const nextSelectedItems = selectedLabels.reduce((selection, label) => {
|
|
145
|
-
if (label === null || label === void 0 ? void 0 : label.value) {
|
|
146
|
-
selection[label.value] = true;
|
|
147
|
-
}
|
|
148
|
-
if (label === null || label === void 0 ? void 0 : label.key) {
|
|
149
|
-
selection[label.key] = true;
|
|
150
|
-
}
|
|
151
|
-
return selection;
|
|
152
|
-
}, {});
|
|
153
|
-
setSelectedItems(nextSelectedItems);
|
|
154
|
-
}, [selectedLabels]);
|
|
155
|
-
// Resolve deep-linked label IDs to display names once account labels are loaded
|
|
156
|
-
useEffect(() => {
|
|
157
|
-
if (!labels.length || !selectedLabels.length) {
|
|
158
|
-
return;
|
|
159
|
-
}
|
|
160
|
-
const resolved = selectedLabels.map((selected) => {
|
|
161
|
-
const match = labels.find((label) => label.id === selected.key || label.name === selected.value);
|
|
162
|
-
return match ? { key: match.id, value: match.name } : selected;
|
|
163
|
-
});
|
|
164
|
-
if (!isEqual(resolved, selectedLabels)) {
|
|
165
|
-
applyLabelSelection(resolved);
|
|
166
|
-
}
|
|
167
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
168
|
-
}, [labels, selectedLabels]);
|
|
169
|
-
return (React.createElement("div", { className: "case-labels-filter group-filter", "data-testid": "case-labels-filter" },
|
|
170
|
-
React.createElement("label", { htmlFor: "case-list-case-label-filter", className: "pf-v6-u-mb-sm group-filter-label" }, t(filterNamesMap[SolrKeys.caseLabel])),
|
|
171
|
-
React.createElement("div", { className: "pf-v6-c-select" },
|
|
172
|
-
React.createElement(Select, { shouldFocusToggleOnSelect: true, shouldPreventScrollOnItemFocus: true, "data-tracking-id": "case-labels-filter", id: "case-list-case-label-filter", title: t(filterNamesMap[SolrKeys.caseLabel]), isOpen: isOpen, selected: selectedItems, onSelect: (_e, v) => onSelect(v), onOpenChange: (nextOpen) => setIsOpen(nextOpen), popperProps: { direction: 'down', enableFlip: false }, toggle: toggle, isScrollable: true },
|
|
173
|
-
React.createElement(SelectList, null,
|
|
174
|
-
dropdownOptions,
|
|
175
|
-
canViewManageTab && (React.createElement(MenuFooter, { className: "group-filter-manage-groups-footer" },
|
|
176
|
-
React.createElement(Link, { className: "cta cta-link", to: "/manage/case-labels" },
|
|
177
|
-
React.createElement(Trans, null, "Manage case labels")))))))));
|
|
178
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ArchivedCaseLabel.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-list-table/ArchivedCaseLabel.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,CAAC,OAAO,UAAU,iBAAiB,sBAYxC"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { Label } from '@patternfly/react-core';
|
|
2
|
-
import InfoCircleIcon from '@patternfly/react-icons/dist/js/icons/info-circle-icon';
|
|
3
|
-
import React from 'react';
|
|
4
|
-
import { Trans } from 'react-i18next';
|
|
5
|
-
export default function ArchivedCaseLabel() {
|
|
6
|
-
return (React.createElement(Label, { className: "pf-v6-u-mt-xs archived-case-label", variant: "outline", color: "purple", "data-testid": "archived-case-label", icon: React.createElement(InfoCircleIcon, null) },
|
|
7
|
-
React.createElement(Trans, null, "Archived")));
|
|
8
|
-
}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
interface IProps {
|
|
3
|
-
labels: string[];
|
|
4
|
-
}
|
|
5
|
-
export declare function truncateCollapsedLabelName(labelName: string): string;
|
|
6
|
-
export declare function getVisibleLabelCount(itemWidths: number[], availableWidth: number, overflowWidth: number, gap: number): number;
|
|
7
|
-
export default function CaseListLabelGroup({ labels }: IProps): React.JSX.Element;
|
|
8
|
-
export {};
|
|
9
|
-
//# sourceMappingURL=CaseListLabelGroup.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CaseListLabelGroup.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-list-table/CaseListLabelGroup.tsx"],"names":[],"mappings":"AACA,OAAO,KAA4C,MAAM,OAAO,CAAC;AAGjE,UAAU,MAAM;IACZ,MAAM,EAAE,MAAM,EAAE,CAAC;CACpB;AAWD,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAMpE;AAED,wBAAgB,oBAAoB,CAChC,UAAU,EAAE,MAAM,EAAE,EACpB,cAAc,EAAE,MAAM,EACtB,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,MAAM,GACZ,MAAM,CAuBR;AAED,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,EAAE,MAAM,EAAE,EAAE,MAAM,qBAyH5D"}
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
import { Label, LabelGroup, Popover, PopoverPosition } from '@patternfly/react-core';
|
|
2
|
-
import React, { useLayoutEffect, useRef, useState } from 'react';
|
|
3
|
-
import { useTranslation } from 'react-i18next';
|
|
4
|
-
const COLLAPSED_LABEL_CHAR_LIMIT = 12;
|
|
5
|
-
function getLabelGapPx(element) {
|
|
6
|
-
const gap = getComputedStyle(element).getPropertyValue('--case-list-label-gap').trim();
|
|
7
|
-
const parsedGap = Number.parseFloat(gap);
|
|
8
|
-
return Number.isNaN(parsedGap) ? 0 : parsedGap;
|
|
9
|
-
}
|
|
10
|
-
export function truncateCollapsedLabelName(labelName) {
|
|
11
|
-
if (labelName.length <= COLLAPSED_LABEL_CHAR_LIMIT) {
|
|
12
|
-
return labelName;
|
|
13
|
-
}
|
|
14
|
-
return `${labelName.slice(0, COLLAPSED_LABEL_CHAR_LIMIT)}...`;
|
|
15
|
-
}
|
|
16
|
-
export function getVisibleLabelCount(itemWidths, availableWidth, overflowWidth, gap) {
|
|
17
|
-
if (!itemWidths.length || availableWidth <= 0) {
|
|
18
|
-
return 0;
|
|
19
|
-
}
|
|
20
|
-
let usedWidth = 0;
|
|
21
|
-
let visibleCount = 0;
|
|
22
|
-
for (let index = 0; index < itemWidths.length; index++) {
|
|
23
|
-
const nextUsedWidth = usedWidth + (visibleCount > 0 ? gap : 0) + itemWidths[index];
|
|
24
|
-
const remainingCount = itemWidths.length - (index + 1);
|
|
25
|
-
const totalWidth = remainingCount > 0 ? nextUsedWidth + gap + overflowWidth : nextUsedWidth;
|
|
26
|
-
if (totalWidth <= availableWidth) {
|
|
27
|
-
usedWidth = nextUsedWidth;
|
|
28
|
-
visibleCount = index + 1;
|
|
29
|
-
continue;
|
|
30
|
-
}
|
|
31
|
-
return Math.max(1, visibleCount);
|
|
32
|
-
}
|
|
33
|
-
return visibleCount;
|
|
34
|
-
}
|
|
35
|
-
export default function CaseListLabelGroup({ labels }) {
|
|
36
|
-
const { t } = useTranslation();
|
|
37
|
-
const containerRef = useRef(null);
|
|
38
|
-
const measureRef = useRef(null);
|
|
39
|
-
const overflowMeasureRef = useRef(null);
|
|
40
|
-
const lastMeasuredWidthRef = useRef(0);
|
|
41
|
-
const [numVisible, setNumVisible] = useState(labels.length);
|
|
42
|
-
useLayoutEffect(() => {
|
|
43
|
-
const container = containerRef.current;
|
|
44
|
-
const measureRow = measureRef.current;
|
|
45
|
-
if (!container || !measureRow || !labels.length) {
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
const tableCell = container.closest('td');
|
|
49
|
-
const updateVisibleCount = () => {
|
|
50
|
-
var _a, _b, _c;
|
|
51
|
-
const availableWidth = (_a = tableCell === null || tableCell === void 0 ? void 0 : tableCell.clientWidth) !== null && _a !== void 0 ? _a : container.clientWidth;
|
|
52
|
-
if (availableWidth <= 0) {
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
const itemWidths = Array.from(measureRow.querySelectorAll('[data-measure-label]')).map((element) => element.offsetWidth);
|
|
56
|
-
const overflowWidth = (_c = (_b = overflowMeasureRef.current) === null || _b === void 0 ? void 0 : _b.offsetWidth) !== null && _c !== void 0 ? _c : 32;
|
|
57
|
-
const labelGapPx = getLabelGapPx(container);
|
|
58
|
-
const nextVisible = getVisibleLabelCount(itemWidths, availableWidth, overflowWidth, labelGapPx);
|
|
59
|
-
lastMeasuredWidthRef.current = availableWidth;
|
|
60
|
-
setNumVisible((current) => (current === nextVisible ? current : nextVisible));
|
|
61
|
-
};
|
|
62
|
-
updateVisibleCount();
|
|
63
|
-
if (typeof ResizeObserver === 'undefined') {
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
const resizeObserver = new ResizeObserver((entries) => {
|
|
67
|
-
const entry = entries[0];
|
|
68
|
-
if (!entry) {
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
const nextWidth = Math.round(entry.contentRect.width);
|
|
72
|
-
if (nextWidth === lastMeasuredWidthRef.current) {
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
updateVisibleCount();
|
|
76
|
-
});
|
|
77
|
-
resizeObserver.observe(tableCell !== null && tableCell !== void 0 ? tableCell : container);
|
|
78
|
-
return () => resizeObserver.disconnect();
|
|
79
|
-
}, [labels]);
|
|
80
|
-
const visibleLabels = labels.slice(0, numVisible);
|
|
81
|
-
const hiddenLabels = labels.slice(numVisible);
|
|
82
|
-
const remainingCount = hiddenLabels.length;
|
|
83
|
-
return (React.createElement("div", { ref: containerRef, className: "case-list-label-cell" },
|
|
84
|
-
React.createElement("div", { ref: measureRef, className: "case-list-label-cell__measure", "aria-hidden": "true" },
|
|
85
|
-
labels.map((labelName) => (React.createElement("span", { key: labelName, "data-measure-label": true },
|
|
86
|
-
React.createElement(Label, { variant: "outline" }, truncateCollapsedLabelName(labelName))))),
|
|
87
|
-
React.createElement("span", { ref: overflowMeasureRef },
|
|
88
|
-
React.createElement(Label, { variant: "outline" },
|
|
89
|
-
"+",
|
|
90
|
-
labels.length))),
|
|
91
|
-
React.createElement("div", { className: "pf-v6-c-label-group case-list-label-group" },
|
|
92
|
-
React.createElement("div", { className: "pf-v6-c-label-group__main" },
|
|
93
|
-
React.createElement("ul", { className: "pf-v6-c-label-group__list", "aria-label": t('Case labels') },
|
|
94
|
-
visibleLabels.map((labelName) => {
|
|
95
|
-
const displayName = truncateCollapsedLabelName(labelName);
|
|
96
|
-
return (React.createElement("li", { key: labelName, className: "pf-v6-c-label-group__list-item" },
|
|
97
|
-
React.createElement(Label, { variant: "outline", title: displayName !== labelName ? labelName : undefined }, displayName)));
|
|
98
|
-
}),
|
|
99
|
-
remainingCount > 0 && (React.createElement("li", { className: "pf-v6-c-label-group__list-item" },
|
|
100
|
-
React.createElement(Popover, { "aria-label": t('Additional case labels'), className: "case-list-label-popover-panel", position: PopoverPosition.topEnd, enableFlip: false, hasAutoWidth: true, maxWidth: "20rem", distance: 15, appendTo: () => document.body, bodyContent: React.createElement("div", { className: "case-list-label-popover" },
|
|
101
|
-
React.createElement(LabelGroup, { numLabels: hiddenLabels.length, "aria-label": t('Case labels') }, hiddenLabels.map((labelName) => (React.createElement(Label, { key: labelName, variant: "outline" }, labelName))))) },
|
|
102
|
-
React.createElement(Label, { variant: "overflow" },
|
|
103
|
-
"+",
|
|
104
|
-
remainingCount)))))))));
|
|
105
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
export interface ICaseListTableRow {
|
|
3
|
-
id: string;
|
|
4
|
-
case_summary: string;
|
|
5
|
-
case_number: string;
|
|
6
|
-
case_customer_escalation: boolean;
|
|
7
|
-
case_createdByName: string;
|
|
8
|
-
case_lastModifiedByName: string;
|
|
9
|
-
case_lastModifiedDate: string;
|
|
10
|
-
case_severity: string;
|
|
11
|
-
case_product: string[];
|
|
12
|
-
case_version: string;
|
|
13
|
-
case_type: string;
|
|
14
|
-
case_status: string;
|
|
15
|
-
case_createdDate: string;
|
|
16
|
-
case_accountNumber: string;
|
|
17
|
-
case_closedDate: string;
|
|
18
|
-
case_alternate_id: string;
|
|
19
|
-
case_folderName: string;
|
|
20
|
-
case_contactName: string;
|
|
21
|
-
case_label: string[];
|
|
22
|
-
}
|
|
23
|
-
interface IProps {
|
|
24
|
-
row: ICaseListTableRow;
|
|
25
|
-
rowIndex: number;
|
|
26
|
-
isColumnVisible: (columnId: string) => boolean;
|
|
27
|
-
isSelected: boolean;
|
|
28
|
-
onRowClick: (event: React.MouseEvent, row: ICaseListTableRow) => void;
|
|
29
|
-
onRowSelect: (event: React.FormEvent<HTMLInputElement>, caseNumber: string) => void;
|
|
30
|
-
}
|
|
31
|
-
export declare function CaseListTableRow({ row, rowIndex, isColumnVisible, isSelected, onRowClick, onRowSelect }: IProps): React.JSX.Element;
|
|
32
|
-
export {};
|
|
33
|
-
//# sourceMappingURL=CaseListTableRow.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CaseListTableRow.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-list-table/CaseListTableRow.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAS1B,MAAM,WAAW,iBAAiB;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,wBAAwB,EAAE,OAAO,CAAC;IAClC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,uBAAuB,EAAE,MAAM,CAAC;IAChC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,UAAU,MAAM;IACZ,GAAG,EAAE,iBAAiB,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;IAC/C,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,EAAE,GAAG,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACtE,WAAW,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,gBAAgB,CAAC,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;CACvF;AAMD,wBAAgB,gBAAgB,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,EAAE,MAAM,qBA+E/G"}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { Td, Tr, Visibility } from '@patternfly/react-table';
|
|
2
|
-
import { dtmTrackEventCaseStepEncountered, formatDate } from '@rh-support/utils';
|
|
3
|
-
import React from 'react';
|
|
4
|
-
import { Trans } from 'react-i18next';
|
|
5
|
-
import { Link } from 'react-router-dom';
|
|
6
|
-
import { CaseListColumnIds } from '../../../enums/case';
|
|
7
|
-
import ArchivedCaseLabel from './ArchivedCaseLabel';
|
|
8
|
-
import CaseListLabelGroup from './CaseListLabelGroup';
|
|
9
|
-
import SeverityLabel from './SeverityLabel';
|
|
10
|
-
function getColumnCellClass(columnId, isColumnVisible) {
|
|
11
|
-
return isColumnVisible(columnId) ? '' : Visibility.hidden || '';
|
|
12
|
-
}
|
|
13
|
-
export function CaseListTableRow({ row, rowIndex, isColumnVisible, isSelected, onRowClick, onRowSelect }) {
|
|
14
|
-
var _a;
|
|
15
|
-
return (React.createElement(Tr, { onRowClick: (event) => event && onRowClick(event, row) },
|
|
16
|
-
React.createElement(Td, { className: "pf-v6-u-pl-md", select: {
|
|
17
|
-
rowIndex,
|
|
18
|
-
onSelect: (event) => onRowSelect(event, row.case_number),
|
|
19
|
-
isSelected,
|
|
20
|
-
} }),
|
|
21
|
-
React.createElement(Td, { dataLabel: "Case ID", id: row.case_number, scope: "row" },
|
|
22
|
-
React.createElement("div", { className: "case-number-section" },
|
|
23
|
-
React.createElement(Link, { to: `/case/${row.case_number}`, onClick: () => {
|
|
24
|
-
var _a;
|
|
25
|
-
return dtmTrackEventCaseStepEncountered('review', row.case_number, (_a = row.case_product) === null || _a === void 0 ? void 0 : _a[0], row.case_version);
|
|
26
|
-
} },
|
|
27
|
-
React.createElement("span", { className: "case-number" }, row.case_number)),
|
|
28
|
-
row.case_customer_escalation ? (React.createElement("div", { className: "escalation-label" },
|
|
29
|
-
React.createElement(Trans, null, "Escalated"))) : null,
|
|
30
|
-
row.case_status === 'Archived' ? React.createElement(ArchivedCaseLabel, null) : null)),
|
|
31
|
-
React.createElement(Td, { dataLabel: "Title" }, row.case_summary),
|
|
32
|
-
React.createElement(Td, { className: getColumnCellClass('contactName', isColumnVisible), dataLabel: "Owner" }, row.case_contactName),
|
|
33
|
-
React.createElement(Td, { className: getColumnCellClass('lastModifiedDate', isColumnVisible), dataLabel: "Modified by" },
|
|
34
|
-
React.createElement("span", { className: "modified-name" }, row.case_lastModifiedByName),
|
|
35
|
-
row.case_lastModifiedDate ? formatDate(row.case_lastModifiedDate) : ''),
|
|
36
|
-
React.createElement(Td, { className: getColumnCellClass('severity', isColumnVisible), dataLabel: "Severity" },
|
|
37
|
-
React.createElement(SeverityLabel, { sevValue: row.case_severity })),
|
|
38
|
-
React.createElement(Td, { className: getColumnCellClass('status', isColumnVisible), dataLabel: "Status" }, row.case_status),
|
|
39
|
-
React.createElement(Td, { className: getColumnCellClass('createdDate', isColumnVisible), dataLabel: "Created by" },
|
|
40
|
-
React.createElement("span", { className: "created-name" }, row.case_createdByName),
|
|
41
|
-
row.case_createdDate ? formatDate(row.case_createdDate) : ''),
|
|
42
|
-
React.createElement(Td, { className: getColumnCellClass('product', isColumnVisible), dataLabel: "Product and Version" },
|
|
43
|
-
row.case_product,
|
|
44
|
-
React.createElement("span", { className: "pf-v6-u-display-block" }, row.case_version)),
|
|
45
|
-
React.createElement(Td, { className: getColumnCellClass('accountNumber', isColumnVisible), dataLabel: "Account number" }, row.case_accountNumber),
|
|
46
|
-
React.createElement(Td, { className: getColumnCellClass('alternateCaseId', isColumnVisible), "data-label": "Personal reference number" }, row.case_alternate_id || ''),
|
|
47
|
-
React.createElement(Td, { className: getColumnCellClass('type', isColumnVisible), "data-label": "Support type" }, row.case_type),
|
|
48
|
-
React.createElement(Td, { className: getColumnCellClass('closedDate', isColumnVisible), "data-label": "Closed date" }, row.case_closedDate ? formatDate(row.case_closedDate) : ''),
|
|
49
|
-
React.createElement(Td, { className: getColumnCellClass('folderName', isColumnVisible), "data-label": "Group" }, row.case_folderName || ''),
|
|
50
|
-
React.createElement(Td, { className: getColumnCellClass(CaseListColumnIds.caseLabel, isColumnVisible), dataLabel: "Case labels" }, ((_a = row.case_label) === null || _a === void 0 ? void 0 : _a.length) ? React.createElement(CaseListLabelGroup, { labels: row.case_label }) : null)));
|
|
51
|
-
}
|