From 735affa84e28460dfaedcb8df6074cdb99964802 Mon Sep 17 00:00:00 2001 From: Jennie Alles Date: Mon, 27 Nov 2023 18:21:46 +0700 Subject: [PATCH 01/11] fix(components): add search resource --- src/lib/components/table/MobileTitle.tsx | 10 +- src/lib/components/table/TableTitle.tsx | 10 +- .../components/modules/ModuleLists.tsx | 2 +- .../components/resources/ResourceOverview.tsx | 4 +- .../components/resources/ResourceSection.tsx | 3 +- .../resources/ResourceSectionBody.tsx | 152 +++++++++++------- src/lib/pages/account-details/index.tsx | 5 +- src/lib/services/move/resourceService.ts | 12 +- src/lib/types/move/resource.ts | 2 +- 9 files changed, 123 insertions(+), 77 deletions(-) diff --git a/src/lib/components/table/MobileTitle.tsx b/src/lib/components/table/MobileTitle.tsx index 0526769d9..276b714be 100644 --- a/src/lib/components/table/MobileTitle.tsx +++ b/src/lib/components/table/MobileTitle.tsx @@ -9,6 +9,7 @@ interface MobileTitleProps { title: string; count: Option; onViewMore?: () => void; + showCount?: boolean; } const cardProps = { width: "100%", @@ -17,14 +18,19 @@ const cardProps = { borderRadius: "8px", }; -export const MobileTitle = ({ onViewMore, title, count }: MobileTitleProps) => ( +export const MobileTitle = ({ + onViewMore, + title, + count, + showCount = true, +}: MobileTitleProps) => ( - + ); diff --git a/src/lib/components/table/TableTitle.tsx b/src/lib/components/table/TableTitle.tsx index de64e5c33..3650f029a 100644 --- a/src/lib/components/table/TableTitle.tsx +++ b/src/lib/components/table/TableTitle.tsx @@ -7,6 +7,7 @@ interface TableTitleProps extends BoxProps { title: string; count: Option; helperText?: string; + showCount?: boolean; } export const TableTitle = ({ @@ -14,6 +15,7 @@ export const TableTitle = ({ count, helperText, mb = 6, + showCount = true, ...props }: TableTitleProps) => ( @@ -21,9 +23,11 @@ export const TableTitle = ({ {title} - - {count ?? "N/A"} - + {showCount && ( + + {count ?? "N/A"} + + )} {helperText} diff --git a/src/lib/pages/account-details/components/modules/ModuleLists.tsx b/src/lib/pages/account-details/components/modules/ModuleLists.tsx index 60f60b511..22fc6a142 100644 --- a/src/lib/pages/account-details/components/modules/ModuleLists.tsx +++ b/src/lib/pages/account-details/components/modules/ModuleLists.tsx @@ -28,7 +28,7 @@ export const ModuleLists = ({ const isMobile = useMobile(); const isMobileOverview = isMobile && !!onViewMore; return ( - + {isMobileOverview ? ( ) : ( <> { const router = useRouter(); const navigate = useInternalNavigate(); + const [keyword, setKeyword] = useState(""); const [expandedIndexes, setExpandedIndexes] = useState([]); const selectedAccountParam = getFirstQueryParam(router.query.account); @@ -74,9 +76,10 @@ export const ResourceSectionBody = ({ setExpandedIndexes(indexes); useEffect(() => { - const resourcesLength = resourcesByOwner?.find( - (resource) => resource.owner === selectedAccountParam - )?.resources?.[selectedNameParam].items.length; + const resourcesLength = resourcesByOwner + ?.find((resource) => resource.owner === selectedAccountParam) + ?.resources?.find((resource) => resource.group === selectedNameParam) + ?.items.length; if (resourcesLength === 1) { setExpandedIndexes([0]); @@ -85,24 +88,51 @@ export const ResourceSectionBody = ({ } }, [resourcesByOwner, selectedNameParam, selectedAccountParam]); + const filteredResourcesByOwner = useMemo(() => { + if (!keyword) return resourcesByOwner; + + return resourcesByOwner?.map((each) => { + return { + ...each, + resources: each.resources.filter((resource) => + resource.group + .toLowerCase() + .includes(keyword.trim().toLocaleLowerCase()) + ), + }; + }); + }, [keyword, resourcesByOwner]); + if (isLoading) return ; - if (!resourcesByOwner) return ; - if (!resourcesByOwner.length) + if (!filteredResourcesByOwner) return ; + if (!filteredResourcesByOwner.length) return ; const selectedIndex = !selectedAccountParam ? 0 - : resourcesByOwner.findIndex((item) => item.owner === selectedAccountParam); - const selectedGroup = resourcesByOwner[selectedIndex]; - const selectedGroupArray = Object.values(selectedGroup.resources); - const selectedResources = - selectedGroupArray.find((item) => item.group === selectedNameParam) ?? - selectedGroupArray[0]; + : filteredResourcesByOwner.findIndex( + (item) => item.owner === selectedAccountParam + ); + const selectedGroup = filteredResourcesByOwner[selectedIndex]; + const selectedResources = selectedGroup.resources.find( + (item) => item.group === selectedNameParam + ); return ( <> - - - {resourcesByOwner.map((item) => ( + + setKeyword(e.target.value)} + action="execute-message-search" + /> + + {filteredResourcesByOwner.map((item) => ( @@ -119,7 +149,7 @@ export const ResourceSectionBody = ({ key={subitem.group} name={subitem.group} amount={subitem.items.length} - isSelected={selectedResources.group === subitem.group} + isSelected={selectedResources?.group === subitem.group} onClick={() => handleSelectResource(item.owner, subitem.group) } @@ -132,53 +162,55 @@ export const ResourceSectionBody = ({ ))} - - - - - {selectedGroup.owner}::{selectedResources.group} - - - {selectedResources.items.length} - + {selectedResources && ( + + + + + {selectedGroup.owner}::{selectedResources.group} + + + {selectedResources.items.length} + + + - + {selectedResources.items.map((item) => ( + + ))} + - - {selectedResources.items.map((item) => ( - - ))} - - + )} ); }; diff --git a/src/lib/pages/account-details/index.tsx b/src/lib/pages/account-details/index.tsx index 62ea0aa1c..c661b2f09 100644 --- a/src/lib/pages/account-details/index.tsx +++ b/src/lib/pages/account-details/index.tsx @@ -251,7 +251,6 @@ const AccountDetailsBody = ({ Admins