From ed60948be49ab91692e7b3b37a54889a1e6740c3 Mon Sep 17 00:00:00 2001 From: kenilkb Date: Thu, 16 Jul 2026 12:36:17 +0530 Subject: [PATCH] Feat: Add multi-group support for partner recommendations, column asset counts, and detail modal lists --- Channel-Frontend/src/pages/AssetsPage.tsx | 22 ++++++---- .../src/pages/admin/DirectoryPage.tsx | 43 ++++++++++++++----- 2 files changed, 45 insertions(+), 20 deletions(-) diff --git a/Channel-Frontend/src/pages/AssetsPage.tsx b/Channel-Frontend/src/pages/AssetsPage.tsx index 8946420..57050f6 100644 --- a/Channel-Frontend/src/pages/AssetsPage.tsx +++ b/Channel-Frontend/src/pages/AssetsPage.tsx @@ -367,16 +367,20 @@ export const AssetsPage = () => { ); - // Find recommended assets based on user's partnerGroup matching any AssetGroup.name - const recommendedGroup = user?.partnerGroup && user.role === "PARTNER_USER" - ? groups.find(g => g.name.trim().toLowerCase() === user.partnerGroup?.trim().toLowerCase()) - : null; + // Find recommended assets based on user's partnerGroup matching any AssetGroup.name (supports comma-separated multiple groups) + const partnerGroupStrings = user?.partnerGroup && user.role === "PARTNER_USER" + ? user.partnerGroup.split(',').map(s => s.trim().toLowerCase()) + : []; - // Only recommend assets that the partner actually has permission to access - const recommendedAssets = recommendedGroup - ? recommendedGroup.assets.filter(recAsset => - assets.some(allAsset => allAsset.id === recAsset.id) - ) + // Only recommend assets that the partner actually has permission to access, and deduplicate + const recommendedAssets = partnerGroupStrings.length > 0 + ? groups + .filter(g => partnerGroupStrings.includes(g.name.trim().toLowerCase())) + .flatMap(g => g.assets) + .filter((recAsset, index, self) => + self.findIndex(a => a.id === recAsset.id) === index && + assets.some(allAsset => allAsset.id === recAsset.id) + ) : []; const showRecommendations = diff --git a/Channel-Frontend/src/pages/admin/DirectoryPage.tsx b/Channel-Frontend/src/pages/admin/DirectoryPage.tsx index 5359234..c6d062b 100644 --- a/Channel-Frontend/src/pages/admin/DirectoryPage.tsx +++ b/Channel-Frontend/src/pages/admin/DirectoryPage.tsx @@ -786,11 +786,20 @@ export const DirectoryPage: React.FC = () => { className="text-xs font-bold text-ink-700 hover:text-ink-950 hover:underline cursor-pointer focus:outline-none flex flex-col items-start gap-0.5" > - {((partner.sharedAssets?.length || 0) + (pGroup ? (assetGroups.find(g => g.name.trim().toLowerCase() === pGroup.trim().toLowerCase())?.assets?.length || 0) : 0))} assets + {(() => { + const directCount = partner.sharedAssets?.length || 0; + if (!pGroup) return directCount; + const pGroupNames = pGroup.split(',').map(s => s.trim().toLowerCase()); + const uniqueGroupAssetIds = new Set(); + assetGroups + .filter(g => pGroupNames.includes(g.name.trim().toLowerCase())) + .forEach(g => g.assets.forEach(a => uniqueGroupAssetIds.add(a.id))); + return directCount + uniqueGroupAssetIds.size; + })()} assets - {pGroup && assetGroups.some(g => g.name.trim().toLowerCase() === pGroup.trim().toLowerCase()) && ( + {pGroup && assetGroups.some(g => pGroup.split(',').map(s => s.trim().toLowerCase()).includes(g.name.trim().toLowerCase())) && ( - Includes {pGroup} Group + Includes {pGroup} )} @@ -988,13 +997,25 @@ export const DirectoryPage: React.FC = () => { ) : ( - /* Current Shared Assets List */ /* Current Shared Assets List */ (() => { - const matchedGroup = selectedPartnerForAssets?.partnerGroup - ? assetGroups.find(g => g.name.trim().toLowerCase() === selectedPartnerForAssets.partnerGroup.trim().toLowerCase()) - : null; - const inheritedAssets = matchedGroup ? matchedGroup.assets : []; + const matchedGroups = selectedPartnerForAssets?.partnerGroup + ? selectedPartnerForAssets.partnerGroup.split(',').map((s: string) => s.trim().toLowerCase()) + : []; + + // Map inherited assets and keep track of which group name they belong to + const inheritedAssetsMap = new Map(); + assetGroups + .filter(g => matchedGroups.includes(g.name.trim().toLowerCase())) + .forEach(g => { + g.assets.forEach(asset => { + if (!inheritedAssetsMap.has(asset.id)) { + inheritedAssetsMap.set(asset.id, { asset, groupName: g.name }); + } + }); + }); + + const inheritedAssets = Array.from(inheritedAssetsMap.values()); const directAssets = selectedPartnerForAssets?.sharedAssets || []; const totalCount = directAssets.length + inheritedAssets.length; @@ -1011,7 +1032,7 @@ export const DirectoryPage: React.FC = () => { return (
{/* Group Inherited Assets */} - {inheritedAssets.map((asset: any) => ( + {inheritedAssets.map(({ asset, groupName }) => (
{getFileIcon(asset.type || '', asset.title)} @@ -1022,12 +1043,12 @@ export const DirectoryPage: React.FC = () => { {asset.categoryId || 'General'} - Inherited ({selectedPartnerForAssets?.partnerGroup}) + Inherited ({groupName})
-
+