From bd8230036ed339f8ab27bfe4b77e048f46a698b6 Mon Sep 17 00:00:00 2001 From: Fewwy Date: Wed, 3 Jul 2024 15:17:54 +0200 Subject: [PATCH 1/5] feat(RHINENG-8850): add objects name prototype filter --- src/AppConstants.js | 1 + src/Components/ObjectsModal/ObjectsModal.js | 14 +++++++- .../ObjectsModalTable/ObjectsModalTable.js | 36 +++++++++++++++---- src/Services/Filters.js | 1 + src/Utilities/Workloads.js | 24 +++++++++++-- 5 files changed, 66 insertions(+), 10 deletions(-) diff --git a/src/AppConstants.js b/src/AppConstants.js index e66330a4..f5383610 100644 --- a/src/AppConstants.js +++ b/src/AppConstants.js @@ -533,6 +533,7 @@ export const WORKLOADS_RULES_FILTER_CONFIG = (filters, addParamFunction) => [ ]; export const ObjectsTableColumns = { + display_name: 'Name', object: 'Object ID', kind: 'Kind', }; diff --git a/src/Components/ObjectsModal/ObjectsModal.js b/src/Components/ObjectsModal/ObjectsModal.js index 42b61409..0f70fd06 100644 --- a/src/Components/ObjectsModal/ObjectsModal.js +++ b/src/Components/ObjectsModal/ObjectsModal.js @@ -20,6 +20,7 @@ const ObjectsModal = ({ isModalOpen, setIsModalOpen, objects }) => { setIsModalOpen(false); resetFilters(filters, WORKLOADS_OBJECTS_TABLE_INITIAL_STATE, updateFilters); }; + const objectsWithNames = objects.filter((object) => object.display_name); return ( { variant={'medium'} title="Objects" > - + ); }; @@ -42,6 +46,14 @@ ObjectsModal.propTypes = { PropTypes.shape({ kind: PropTypes.string, uid: PropTypes.string, + display_name: PropTypes.string, + }) + ), + objectsNamesArePresent: PropTypes.arrayOf( + PropTypes.shape({ + kind: PropTypes.string, + uid: PropTypes.string, + display_name: PropTypes.string, }) ), }; diff --git a/src/Components/ObjectsModalTable/ObjectsModalTable.js b/src/Components/ObjectsModalTable/ObjectsModalTable.js index a3165e89..2e989771 100644 --- a/src/Components/ObjectsModalTable/ObjectsModalTable.js +++ b/src/Components/ObjectsModalTable/ObjectsModalTable.js @@ -53,18 +53,38 @@ export const ObjectsModalTable = ({ objects }) => { placeholder: 'Filter by Object ID', }, }, + { + label: 'Object name', + type: 'text', + filterValues: { + key: 'display_name', + onChange: (_event, value) => + updateFilters({ ...filters, offset: 0, display_name: value }), + value: filters.display_name, + placeholder: 'Filter by name', + }, + }, ]; const buildFilterChips = () => { const localFilters = { ...filters }; delete localFilters.sortIndex; delete localFilters.sortDirection; - return pruneWorkloadsRulesFilters(localFilters, { - label: 'Object ID', - type: 'text', - title: 'object ID', - urlParam: 'object_id', - }); + return pruneWorkloadsRulesFilters( + localFilters, + { + label: 'Object ID', + type: 'text', + title: 'object ID', + urlParam: 'object_id', + }, + { + label: 'Object name', + type: 'text', + title: 'object name', + urlParam: 'display_name', + } + ); }; const activeFiltersConfig = { @@ -151,6 +171,7 @@ export const ObjectsModalTable = ({ objects }) => { + @@ -158,6 +179,9 @@ export const ObjectsModalTable = ({ objects }) => { {displayedRows?.map((object, index) => ( + diff --git a/src/Services/Filters.js b/src/Services/Filters.js index 135b6ffb..df2e5d64 100644 --- a/src/Services/Filters.js +++ b/src/Services/Filters.js @@ -69,6 +69,7 @@ export const WORKLOADS_OBJECTS_TABLE_INITIAL_STATE = { limit: 50, offset: 0, object_id: '', + display_name: '', }; const filtersInitialState = { diff --git a/src/Utilities/Workloads.js b/src/Utilities/Workloads.js index 6170e787..d321a461 100644 --- a/src/Utilities/Workloads.js +++ b/src/Utilities/Workloads.js @@ -133,7 +133,9 @@ export const pruneWorkloadsRulesFilters = (localFilters, filterCategories) => { }); } } else if ( - (name === 'description' || name === 'object_id') && + (name === 'description' || + name === 'object_id' || + name === 'display_name') && value.trim() !== '' ) { arr.push({ @@ -186,12 +188,28 @@ export const flatMapRows = (filteredRows, expandFirst) => { }; export const passObjectsFilters = (objects, filters) => { - return Object.entries(filters).some(([filterKey, filterValue]) => { + console.log(filters); + const cleanedUpFilters = _.omitBy(_.cloneDeep(filters), _.isEmpty); + return Object.entries(cleanedUpFilters).every(([filterKey, filterValue]) => { switch (filterKey) { + case 'display_name': + return ( + filterValue && + objects.display_name.toLowerCase().includes(filterValue.toLowerCase()) + ); case 'object_id': + return ( + filterValue && + objects.uid.toLowerCase().includes(filterValue.toLowerCase()) + ); + /* case 'object_id': return objects.uid.toLowerCase().includes(filterValue.toLowerCase()); + case 'display_name': + return objects.display_name + .toLowerCase() + .includes(filterValue.toLowerCase()); */ default: - return false; + return true; } }); }; From d7556f445e7b79b981c10e25106b7d5e193aa9e2 Mon Sep 17 00:00:00 2001 From: Fewwy Date: Thu, 4 Jul 2024 18:42:37 +0200 Subject: [PATCH 2/5] added conditional rendering for table and filters --- .../ObjectsModalTable/ObjectsModalTable.js | 110 +++++++++++++----- src/Utilities/Workloads.js | 10 +- 2 files changed, 88 insertions(+), 32 deletions(-) diff --git a/src/Components/ObjectsModalTable/ObjectsModalTable.js b/src/Components/ObjectsModalTable/ObjectsModalTable.js index 2e989771..130551a6 100644 --- a/src/Components/ObjectsModalTable/ObjectsModalTable.js +++ b/src/Components/ObjectsModalTable/ObjectsModalTable.js @@ -20,7 +20,7 @@ import { NoMatchingWorkloadsObjects } from '../MessageState/EmptyStates'; import Loading from '../Loading/Loading'; import { PaginationVariant } from '@patternfly/react-core/dist/js/components/Pagination/Pagination'; -export const ObjectsModalTable = ({ objects }) => { +export const ObjectsModalTable = ({ objects, objectsWithNames }) => { const objectsData = objects || []; const dispatch = useDispatch(); const [filtersApplied, setFiltersApplied] = useState(false); @@ -39,32 +39,38 @@ export const ObjectsModalTable = ({ objects }) => { const updateFilters = (payload) => dispatch(updateWorkloadsObjectsListFilters(payload)); const preparedRows = displayedRows.length > 0 ? true : false; + const renderTableWithNames = objectsWithNames; const loadingState = !rowsFiltered; - const filterConfigItems = [ - { - label: 'Object ID', - type: 'text', - filterValues: { - key: 'object_id', - onChange: (_event, value) => - updateFilters({ ...filters, offset: 0, object_id: value }), - value: filters.object_id, - placeholder: 'Filter by Object ID', - }, - }, - { - label: 'Object name', - type: 'text', - filterValues: { - key: 'display_name', - onChange: (_event, value) => - updateFilters({ ...filters, offset: 0, display_name: value }), - value: filters.display_name, - placeholder: 'Filter by name', - }, - }, - ]; + const filterConfigItems = (renderTableWithNames) => { + return renderTableWithNames + ? [ + { + label: 'Object name', + type: 'text', + filterValues: { + key: 'display_name', + onChange: (_event, value) => + updateFilters({ ...filters, offset: 0, display_name: value }), + value: filters.display_name, + placeholder: 'Filter by name', + }, + }, + ] + : [ + { + label: 'Object ID', + type: 'text', + filterValues: { + key: 'object_id', + onChange: (_event, value) => + updateFilters({ ...filters, offset: 0, object_id: value }), + value: filters.object_id, + placeholder: 'Filter by Object ID', + }, + }, + ]; + }; const buildFilterChips = () => { const localFilters = { ...filters }; @@ -161,28 +167,67 @@ export const ObjectsModalTable = ({ objects }) => { ouiaId: 'pager', itemCount: filteredRows.length, }} - filterConfig={{ items: filterConfigItems }} + filterConfig={{ items: filterConfigItems(renderTableWithNames) }} activeFiltersConfig={activeFiltersConfig} /> {loadingState ? ( - ) : preparedRows ? ( + ) : preparedRows && !renderTableWithNames ? (
{ObjectsTableColumns.display_name} {ObjectsTableColumns.object} {ObjectsTableColumns.kind}
+ {object.display_name} + {object.uid} {object.kind}
- + + {displayedRows?.map((object, index) => ( + + + + + ))} + +
{ObjectsTableColumns.display_name} {ObjectsTableColumns.object} {ObjectsTableColumns.kind}
{object.uid}{object.kind}
+ {displayedRows.length > 0 ? ( + + ) : ( + + )} + + ) : preparedRows && renderTableWithNames ? ( +
+ + + + + + + {displayedRows?.map((object, index) => ( - ))} @@ -225,4 +270,11 @@ ObjectsModalTable.propTypes = { uid: PropTypes.string, }) ), + objectsWithNames: PropTypes.arrayOf( + PropTypes.shape({ + kind: PropTypes.string, + uid: PropTypes.string, + display_name: PropTypes.string, + }) + ), }; diff --git a/src/Utilities/Workloads.js b/src/Utilities/Workloads.js index d321a461..53411f9a 100644 --- a/src/Utilities/Workloads.js +++ b/src/Utilities/Workloads.js @@ -132,10 +132,14 @@ export const pruneWorkloadsRulesFilters = (localFilters, filterCategories) => { urlParam: category.urlParam, }); } + } else if (name === 'display_name' && value.trim() !== '') { + arr.push({ + category: capitalize(name.replace('display_name', 'Name')), + chips: [{ name: value, value }], + urlParam: 'display_name', + }); } else if ( - (name === 'description' || - name === 'object_id' || - name === 'display_name') && + (name === 'description' || name === 'object_id') && value.trim() !== '' ) { arr.push({ From 762376a2cde33f1e8cc12168323fc892c5cd8962 Mon Sep 17 00:00:00 2001 From: Fewwy Date: Thu, 4 Jul 2024 19:23:24 +0200 Subject: [PATCH 3/5] added tests --- .../objectsWithNames.json | 407 ++++++++++++++++++ .../ExpandedRulesDetails.js | 2 + .../ObjectsModal/ObjectsModal.cy.js | 109 ++++- src/Components/ObjectsModal/ObjectsModal.js | 9 +- src/Utilities/Workloads.js | 13 +- 5 files changed, 516 insertions(+), 24 deletions(-) create mode 100644 cypress/fixtures/api/insights-results-aggregator/objectsWithNames.json diff --git a/cypress/fixtures/api/insights-results-aggregator/objectsWithNames.json b/cypress/fixtures/api/insights-results-aggregator/objectsWithNames.json new file mode 100644 index 00000000..40440413 --- /dev/null +++ b/cypress/fixtures/api/insights-results-aggregator/objectsWithNames.json @@ -0,0 +1,407 @@ +[ + { + "kind": "DaemonSet", + "uid": "da5a07e1-3273-4056-8914-2732beb41b4c", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "foobar", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "8e0375c6-a290-4011-95be-46a3193f9ee5", + "display_name": "pepeobject" + }, + { + "kind": "StatefulSet", + "uid": "975245fd-fec6-4a54-9fd4-2b6bcd7067b1", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "74106997-d5b2-4fa9-875a-d1cb45d2ce68", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "8e0375c6-a290-4011-95be-46a3193f9ee5", + "display_name": "pepeobject" + }, + { + "kind": "StatefulSet", + "uid": "975245fd-fec6-4a54-9fd4-2b6bcd7067b1", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "74106997-d5b2-4fa9-875a-d1cb45d2ce68", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "8e0375c6-a290-4011-95be-46a3193f9ee5", + "display_name": "pepeobject" + }, + { + "kind": "StatefulSet", + "uid": "975245fd-fec6-4a54-9fd4-2b6bcd7067b1", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "74106997", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "8e0375c6-a290-4011-95be-46a3193f9ee5", + "display_name": "pepeobject" + }, + { + "kind": "StatefulSet", + "uid": "975245fd-fec6-4a54-9fd4-2b6bcd7067b1", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "875a-d1cb45d2ce68", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "8e0375c6-a290-4011-95be-46a3193f9ee5", + "display_name": "pepeobject" + }, + { + "kind": "StatefulSet", + "uid": "975245fd-f4-9fd4-2b6bcd7067b1", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "741069cb45d2ce68", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "8e0375c6-a290-4011-95be-46a3193f9ee5", + "display_name": "pepeobject" + }, + { + "kind": "StatefulSet", + "uid": "975245fd-fec6-4a54-9fd7067b1", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "74106997ce68", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "8e0375c6-a290-4011-95be-46a3193f9ee5", + "display_name": "pepeobject" + }, + { + "kind": "StatefulSet", + "uid": "975245fd-fec6-4a54-9fd4-2b6bcd7067b1", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "74106997-d5b2-4fa9-875a-d1cb45d2ce68", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "8e0375c6-a290-4011-95be-46a3193f9ee5", + "display_name": "pepeobject" + }, + { + "kind": "StatefulSet", + "uid": "975245fd-f067b1", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "74106997-d5b2-4fa9-875a-d1cb45d2ce68", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "8e0375c6-a290-401e5", + "display_name": "pepeobject" + }, + { + "kind": "DaemonSet", + "uid": "da5a07e1-3273-4056-8914-2732beb41b4c", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "foobar", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "8e0375c6-a290-4011-95be-46a3193f9ee5", + "display_name": "pepeobject" + }, + { + "kind": "StatefulSet", + "uid": "975245fd-fec6-4a54-9fd4-2b6bcd7067b1", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "74106997-d5b2-4fa9-875a-d1cb45d2ce68", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "8e0375c6-a290-4011-95be-46a3193f9ee5", + "display_name": "pepeobject" + }, + { + "kind": "StatefulSet", + "uid": "975245fd-fec6-4a54-9fd4-2b6bcd7067b1", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "74106997-d5b2-4fa9-875a-d1cb45d2ce68", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "8e0375c6-a290-4011-95be-46a3193f9ee5", + "display_name": "pepeobject" + }, + { + "kind": "StatefulSet", + "uid": "975245fd-fec6-4a54-9fd4-2b6bcd7067b1", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "74106997", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "8e0375c6-a290-4011-95be-46a3193f9ee5", + "display_name": "pepeobject" + }, + { + "kind": "StatefulSet", + "uid": "975245fd-fec6-4a54-9fd4-2b6bcd7067b1", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "875a-d1cb45d2ce68", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "8e0375c6-a290-4011-95be-46a3193f9ee5", + "display_name": "pepeobject" + }, + { + "kind": "StatefulSet", + "uid": "975245fd-f4-9fd4-2b6bcd7067b1", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "741069cb45d2ce68", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "8e0375c6-a290-4011-95be-46a3193f9ee5", + "display_name": "pepeobject" + }, + { + "kind": "StatefulSet", + "uid": "975245fd-fec6-4a54-9fd7067b1", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "74106997ce68", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "8e0375c6-a290-4011-95be-46a3193f9ee5", + "display_name": "pepeobject" + }, + { + "kind": "StatefulSet", + "uid": "975245fd-fec6-4a54-9fd4-2b6bcd7067b1", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "74106997-d5b2-4fa9-875a-d1cb45d2ce68", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "8e0375c6-a290-4011-95be-46a3193f9ee5", + "display_name": "pepeobject" + }, + { + "kind": "StatefulSet", + "uid": "975245fd-f067b1", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "74106997-d5b2-4fa9-875a-d1cb45d2ce68", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "8e0375c6-a290-401e5", + "display_name": "pepeobject" + }, + { + "kind": "DaemonSet", + "uid": "da5a07e1-3273-4056-8914-2732beb41b4c", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "foobar", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "8e0375c6-a290-4011-95be-46a3193f9ee5", + "display_name": "pepeobject" + }, + { + "kind": "StatefulSet", + "uid": "975245fd-fec6-4a54-9fd4-2b6bcd7067b1", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "74106997-d5b2-4fa9-875a-d1cb45d2ce68", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "8e0375c6-a290-4011-95be-46a3193f9ee5", + "display_name": "pepeobject" + }, + { + "kind": "StatefulSet", + "uid": "975245fd-fec6-4a54-9fd4-2b6bcd7067b1", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "74106997-d5b2-4fa9-875a-d1cb45d2ce68", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "8e0375c6-a290-4011-95be-46a3193f9ee5", + "display_name": "pepeobject" + }, + { + "kind": "StatefulSet", + "uid": "975245fd-fec6-4a54-9fd4-2b6bcd7067b1", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "74106997", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "8e0375c6-a290-4011-95be-46a3193f9ee5", + "display_name": "pepeobject" + }, + { + "kind": "StatefulSet", + "uid": "975245fd-fec6-4a54-9fd4-2b6bcd7067b1", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "875a-d1cb45d2ce68", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "8e0375c6-a290-4011-95be-46a3193f9ee5", + "display_name": "pepeobject" + }, + { + "kind": "StatefulSet", + "uid": "975245fd-f4-9fd4-2b6bcd7067b1", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "741069cb45d2ce68", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "8e0375c6-a290-4011-95be-46a3193f9ee5", + "display_name": "pepeobject" + }, + { + "kind": "StatefulSet", + "uid": "975245fd-fec6-4a54-9fd7067b1", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "74106997ce68", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "8e0375c6-a290-4011-95be-46a3193f9ee5", + "display_name": "pepeobject" + }, + { + "kind": "StatefulSet", + "uid": "975245fd-fec6-4a54-9fd4-2b6bcd7067b1", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "74106997-d5b2-4fa9-875a-d1cb45d2ce68", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "8e0375c6-a290-4011-95be-46a3193f9ee5", + "display_name": "display name" + }, + { + "kind": "StatefulSet", + "uid": "975245fd-f067b1", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "74106997-d5b2-4fa9-875a-d1cb45d2ce68", + "display_name": "pepeobject" + }, + { + "kind": "Deployment", + "uid": "8e0375c6-a290-401e5", + "display_name": "pepeobject" + } +] \ No newline at end of file diff --git a/src/Components/ExpandedRulesDetails.js/ExpandedRulesDetails.js b/src/Components/ExpandedRulesDetails.js/ExpandedRulesDetails.js index 801be323..48f9b311 100644 --- a/src/Components/ExpandedRulesDetails.js/ExpandedRulesDetails.js +++ b/src/Components/ExpandedRulesDetails.js/ExpandedRulesDetails.js @@ -83,6 +83,7 @@ const ExpandedRulesDetails = ({ const objectsArePresent = Array.isArray(objects) && objects.length > 0; const moreInfoIsPresent = more_info.length > 0 ? true : false; const [objectsModalOpen, setObjectsModalOpen] = useState(false); + const objectsWithNames = objects?.filter((object) => object.display_name); return ( @@ -90,6 +91,7 @@ const ExpandedRulesDetails = ({ isModalOpen={objectsModalOpen} setIsModalOpen={setObjectsModalOpen} objects={objects} + objectsWithNames={objectsWithNames ? true : false} /> { +const mount = (url, objects, objectsWithNames) => { cy.mount( - + @@ -38,13 +43,13 @@ const DEFAULT_ROW_COUNT = 50; const DEFAULT_DISPLAYED_SIZE = Math.min(mockObjects.length, DEFAULT_ROW_COUNT); let values = _.cloneDeep(mockObjects); const data = _.orderBy(values, [(it) => it.uid], ['desc']); -console.log(data, 'data'); describe('Objects modal renders and filters data', () => { it('renders main components', () => { mount( '/openshift/insights/advisor/workloads/clustername/namespacename', - mockObjects + mockObjects, + false ); // renders table component cy.get('#objects-list-table').should('have.length', 1); @@ -55,7 +60,8 @@ describe('Objects modal renders and filters data', () => { it('renders empty state', () => { mount( '/openshift/insights/advisor/workloads/clustername/namespacename', - [] + [], + false ); cy.get('#objects-list-table') .ouiaId('empty-state') @@ -69,10 +75,11 @@ describe('Objects modal renders and filters data', () => { it('Adds filters and produces chips correctly', () => { mount( '/openshift/insights/advisor/workloads/clustername/namespacename', - mockObjects + mockObjects, + false ); cy.get('#objects-list-table'); - cy.get('input[data-ouia-component-type="PF5/TextInput"]').type('foobar', { + cy.get('input[data-ouia-component-id="ConditionalFilter"]').type('foobar', { force: true, }); cy.get(FILTER_CHIPS).each(($el) => @@ -84,7 +91,8 @@ describe('Objects modal renders and filters data', () => { it('Adds filters and produces empty state with no results', () => { mount( '/openshift/insights/advisor/workloads/clustername/namespacename', - mockObjects + mockObjects, + false ); cy.get('#objects-list-table'); cy.get('input[data-ouia-component-type="PF5/TextInput"]').type( @@ -107,7 +115,8 @@ describe('Pagination', () => { it('shows correct total number of objects', () => { mount( '/openshift/insights/advisor/workloads/clustername/namespacename', - mockObjects + mockObjects, + false ); checkPaginationTotal(mockObjects.length); }); @@ -115,7 +124,8 @@ describe('Pagination', () => { it(`is set to ${DEFAULT_ROW_COUNT}`, () => { mount( '/openshift/insights/advisor/workloads/clustername/namespacename', - mockObjects + mockObjects, + false ); cy.get(MENU_TOGGLE) .get('.pf-m-text') @@ -127,7 +137,8 @@ describe('Pagination', () => { it('values are expected ones', () => { mount( '/openshift/insights/advisor/workloads/clustername/namespacename', - mockObjects + mockObjects, + false ); checkPaginationValues(PAGINATION_VALUES); }); @@ -135,7 +146,8 @@ describe('Pagination', () => { it('can change page limit', () => { mount( '/openshift/insights/advisor/workloads/clustername/namespacename', - mockObjects + mockObjects, + false ); cy.wrap(PAGINATION_VALUES).each((el) => { changePagination(el).then(() => { @@ -147,7 +159,8 @@ describe('Pagination', () => { it('can iterate over pages', () => { mount( '/openshift/insights/advisor/workloads/clustername/namespacename', - mockObjects + mockObjects, + false ); cy.wrap(itemsPerPage(data.length)).each((el, index, list) => { checkRowCounts(el); @@ -164,3 +177,73 @@ describe('Pagination', () => { }); }); }); + +describe('Objects modal with names', () => { + it('renders main components', () => { + mount( + '/openshift/insights/advisor/workloads/clustername/namespacename', + objectsWithNames, + true + ); + // renders table component + cy.get('#objects-list-table').should('have.length', 1); + // test how many rows were rendered + checkRowCounts(DEFAULT_DISPLAYED_SIZE, true); + }); + + it('renders empty state', () => { + mount( + '/openshift/insights/advisor/workloads/clustername/namespacename', + [], + true + ); + cy.get('#objects-list-table') + .ouiaId('empty-state') + .should('have.length', 1); + cy.get(`h5[class="pf-v5-c-empty-state__title-text"]`).should( + 'have.text', + 'No matching workloads found' + ); + }); + + it('Adds filters and produces chips correctly', () => { + mount( + '/openshift/insights/advisor/workloads/clustername/namespacename', + objectsWithNames, + true + ); + cy.get('#objects-list-table'); + cy.get('input[data-ouia-component-id="ConditionalFilter"]').type( + 'display name', + { + force: true, + } + ); + cy.get(FILTER_CHIPS).each(($el) => + expect($el.text()).to.be.oneOf(['Name', 'display name']) + ); + checkRowCounts(1, true); + }); + + it('Adds filters and produces empty state with no results', () => { + mount( + '/openshift/insights/advisor/workloads/clustername/namespacename', + objectsWithNames, + true + ); + cy.get('#objects-list-table'); + cy.get('input[data-ouia-component-id="ConditionalFilter"]').type( + 'wrong filter', + { + force: true, + } + ); + cy.get(FILTER_CHIPS).each(($el) => + expect($el.text()).to.be.oneOf(['Object id', 'wrong filter']) + ); + cy.get(`h5[class="pf-v5-c-empty-state__title-text"]`).should( + 'have.text', + 'No matching workloads found' + ); + }); +}); diff --git a/src/Components/ObjectsModal/ObjectsModal.js b/src/Components/ObjectsModal/ObjectsModal.js index 0f70fd06..546c17a9 100644 --- a/src/Components/ObjectsModal/ObjectsModal.js +++ b/src/Components/ObjectsModal/ObjectsModal.js @@ -9,7 +9,12 @@ import { updateWorkloadsObjectsListFilters, } from '../../Services/Filters'; -const ObjectsModal = ({ isModalOpen, setIsModalOpen, objects }) => { +const ObjectsModal = ({ + isModalOpen, + setIsModalOpen, + objects, + objectsWithNames, +}) => { const dispatch = useDispatch(); const filters = useSelector( ({ filters }) => filters.workloadsObjectsListState @@ -20,7 +25,6 @@ const ObjectsModal = ({ isModalOpen, setIsModalOpen, objects }) => { setIsModalOpen(false); resetFilters(filters, WORKLOADS_OBJECTS_TABLE_INITIAL_STATE, updateFilters); }; - const objectsWithNames = objects.filter((object) => object.display_name); return ( { }; export const passObjectsFilters = (objects, filters) => { - console.log(filters); const cleanedUpFilters = _.omitBy(_.cloneDeep(filters), _.isEmpty); return Object.entries(cleanedUpFilters).every(([filterKey, filterValue]) => { switch (filterKey) { case 'display_name': return ( filterValue && - objects.display_name.toLowerCase().includes(filterValue.toLowerCase()) + objects?.display_name + ?.toLowerCase() + .includes(filterValue.toLowerCase()) ); case 'object_id': return ( filterValue && - objects.uid.toLowerCase().includes(filterValue.toLowerCase()) + objects?.uid?.toLowerCase().includes(filterValue.toLowerCase()) ); - /* case 'object_id': - return objects.uid.toLowerCase().includes(filterValue.toLowerCase()); - case 'display_name': - return objects.display_name - .toLowerCase() - .includes(filterValue.toLowerCase()); */ default: return true; } From 8ede4043aa873eb596eae2bc39e2dc70b9e0d607 Mon Sep 17 00:00:00 2001 From: Fewwy Date: Thu, 4 Jul 2024 19:28:35 +0200 Subject: [PATCH 4/5] adjusted lodash imports --- src/Utilities/Workloads.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/Utilities/Workloads.js b/src/Utilities/Workloads.js index 4cd05af1..f7085c7c 100644 --- a/src/Utilities/Workloads.js +++ b/src/Utilities/Workloads.js @@ -1,5 +1,7 @@ import { SortByDirection } from '@patternfly/react-table'; -import _ from 'lodash'; +import { omitBy } from 'lodash/omitBy'; +import { cloneDeep } from 'lodash/cloneDeep'; +import { isEmpty } from 'lodash/isEmpty'; export const SEVERITY_OPTIONS = [ { @@ -80,13 +82,13 @@ export const severityTypeToText = (value) => { }; export const filtersAreApplied = (params) => { - const cleanedUpParams = _.cloneDeep(params); + const cleanedUpParams = cloneDeep(params); delete cleanedUpParams.sortIndex; delete cleanedUpParams.sortDirection; delete cleanedUpParams.offset; delete cleanedUpParams.limit; delete cleanedUpParams.sort; - return Object.values(cleanedUpParams).filter((value) => !_.isEmpty(value)) + return Object.values(cleanedUpParams).filter((value) => !isEmpty(value)) .length ? true : false; @@ -192,7 +194,7 @@ export const flatMapRows = (filteredRows, expandFirst) => { }; export const passObjectsFilters = (objects, filters) => { - const cleanedUpFilters = _.omitBy(_.cloneDeep(filters), _.isEmpty); + const cleanedUpFilters = omitBy(cloneDeep(filters), isEmpty); return Object.entries(cleanedUpFilters).every(([filterKey, filterValue]) => { switch (filterKey) { case 'display_name': @@ -245,7 +247,7 @@ export const workloadsRulesAddFilterParam = ( : workloadsRulesRemoveFilterParam(currentFilters, updateFilters, param); export const passFilterWorkloadsRecs = (recommendation, filters) => { - const cleanedUpFilters = _.omitBy(_.cloneDeep(filters), _.isEmpty); + const cleanedUpFilters = omitBy(cloneDeep(filters), isEmpty); return Object.entries(cleanedUpFilters).every(([filterKey, filterValue]) => { switch (filterKey) { From 106aaf9eb096d656cdd0c69131897db164dd5bda Mon Sep 17 00:00:00 2001 From: Fewwy Date: Fri, 5 Jul 2024 01:09:59 +0200 Subject: [PATCH 5/5] fixed tests --- src/Components/ObjectsModal/ObjectsModal.js | 1 + src/Utilities/Workloads.js | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Components/ObjectsModal/ObjectsModal.js b/src/Components/ObjectsModal/ObjectsModal.js index 546c17a9..37153b0a 100644 --- a/src/Components/ObjectsModal/ObjectsModal.js +++ b/src/Components/ObjectsModal/ObjectsModal.js @@ -21,6 +21,7 @@ const ObjectsModal = ({ ); const updateFilters = (payload) => dispatch(updateWorkloadsObjectsListFilters(payload)); + const onClose = () => { setIsModalOpen(false); resetFilters(filters, WORKLOADS_OBJECTS_TABLE_INITIAL_STATE, updateFilters); diff --git a/src/Utilities/Workloads.js b/src/Utilities/Workloads.js index f7085c7c..b9c0ab67 100644 --- a/src/Utilities/Workloads.js +++ b/src/Utilities/Workloads.js @@ -1,7 +1,7 @@ import { SortByDirection } from '@patternfly/react-table'; -import { omitBy } from 'lodash/omitBy'; -import { cloneDeep } from 'lodash/cloneDeep'; -import { isEmpty } from 'lodash/isEmpty'; +import omitBy from 'lodash/omitBy'; +import cloneDeep from 'lodash/cloneDeep'; +import isEmpty from 'lodash/isEmpty'; export const SEVERITY_OPTIONS = [ {
{ObjectsTableColumns.display_name}{ObjectsTableColumns.kind}
{object.display_name} {object.uid} {object.kind}