Skip to content

Commit 28580d2

Browse files
committed
chore(dashboard): show and separate deleted apps on the permitted and unpermitted tabs
1 parent c833456 commit 28580d2

File tree

2 files changed

+113
-30
lines changed

2 files changed

+113
-30
lines changed

packages/apps/app-dashboard/src/components/user-dashboard/dashboard/PermittedAppsPage.tsx

Lines changed: 93 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,29 @@ export function PermittedAppsPage({
8888

8989
const emptyState = getEmptyStateMessage();
9090

91+
// Separate active and deleted apps for display purposes (only for permitted/unpermitted views)
92+
const activeApps = apps.filter((app) => {
93+
const permission =
94+
permittedPkps.find((p) => p.appId === app.appId) ||
95+
unpermittedPkps.find((p) => p.appId === app.appId);
96+
return !permission?.isDeleted;
97+
});
98+
99+
const deletedApps = apps.filter((app) => {
100+
const permission =
101+
permittedPkps.find((p) => p.appId === app.appId) ||
102+
unpermittedPkps.find((p) => p.appId === app.appId);
103+
return permission?.isDeleted;
104+
});
105+
106+
// Determine if we should show the deleted section separately
107+
const shouldShowDeletedSection =
108+
(filterState === 'permitted' || filterState === 'unpermitted') && deletedApps.length > 0;
109+
110+
// Apps to display in the main grid (active apps for permitted/unpermitted, all apps for deleted/all)
111+
const mainGridApps =
112+
filterState === 'permitted' || filterState === 'unpermitted' ? activeApps : apps;
113+
91114
return (
92115
<motion.div
93116
initial={{ opacity: 0 }}
@@ -228,26 +251,76 @@ export function PermittedAppsPage({
228251
</div>
229252
</div>
230253
) : (
231-
<div className="w-full grid grid-cols-1 md:grid-cols-2 lg:grid-cols-2 xl:grid-cols-3 2xl:grid-cols-4 gap-6">
232-
{apps.map((app, index) => {
233-
const permittedPermission = permittedPkps.find((p) => p.appId === app.appId);
234-
const unpermittedPermission = unpermittedPkps.find((p) => p.appId === app.appId);
235-
const permission = permittedPermission || unpermittedPermission;
236-
const isUnpermitted = !!unpermittedPermission && !permittedPermission;
237-
const isDeleted = permission?.isDeleted ?? false;
238-
return (
239-
<PermittedAppCard
240-
key={app.appId}
241-
app={app}
242-
permission={permission}
243-
isUnpermitted={isUnpermitted}
244-
isDeleted={isDeleted}
245-
index={index}
246-
appVersionsMap={appVersionsMap}
247-
/>
248-
);
249-
})}
250-
</div>
254+
<>
255+
{/* Main grid - active apps for permitted/unpermitted, all apps for deleted/all */}
256+
<div className="w-full grid grid-cols-1 md:grid-cols-2 lg:grid-cols-2 xl:grid-cols-3 2xl:grid-cols-4 gap-6">
257+
{mainGridApps.map((app, index) => {
258+
const permittedPermission = permittedPkps.find((p) => p.appId === app.appId);
259+
const unpermittedPermission = unpermittedPkps.find((p) => p.appId === app.appId);
260+
const permission = permittedPermission || unpermittedPermission;
261+
const isUnpermitted = !!unpermittedPermission && !permittedPermission;
262+
const isDeleted = permission?.isDeleted ?? false;
263+
return (
264+
<PermittedAppCard
265+
key={app.appId}
266+
app={app}
267+
permission={permission}
268+
isUnpermitted={isUnpermitted}
269+
isDeleted={isDeleted}
270+
index={index}
271+
appVersionsMap={appVersionsMap}
272+
/>
273+
);
274+
})}
275+
</div>
276+
277+
{/* Show deleted apps section for permitted/unpermitted views */}
278+
{shouldShowDeletedSection && (
279+
<>
280+
{/* Divider */}
281+
<div className="my-8 flex items-center gap-4">
282+
<div className={`flex-1 border-t ${theme.cardBorder}`} />
283+
<div
284+
className={`px-4 py-2 rounded-lg ${theme.itemBg} ${theme.cardBorder} border`}
285+
>
286+
<p
287+
className={`text-sm font-semibold ${theme.text} whitespace-nowrap`}
288+
style={fonts.heading}
289+
>
290+
{filterState === 'permitted'
291+
? 'Deleted Apps (Still Permitted)'
292+
: 'Deleted Apps (Unpermitted)'}
293+
</p>
294+
</div>
295+
<div className={`flex-1 border-t ${theme.cardBorder}`} />
296+
</div>
297+
298+
{/* Deleted apps grid */}
299+
<div className="w-full grid grid-cols-1 md:grid-cols-2 lg:grid-cols-2 xl:grid-cols-3 2xl:grid-cols-4 gap-6">
300+
{deletedApps.map((app, index) => {
301+
const permittedPermission = permittedPkps.find((p) => p.appId === app.appId);
302+
const unpermittedPermission = unpermittedPkps.find(
303+
(p) => p.appId === app.appId,
304+
);
305+
const permission = permittedPermission || unpermittedPermission;
306+
const isUnpermitted = !!unpermittedPermission && !permittedPermission;
307+
const isDeleted = permission?.isDeleted ?? false;
308+
return (
309+
<PermittedAppCard
310+
key={app.appId}
311+
app={app}
312+
permission={permission}
313+
isUnpermitted={isUnpermitted}
314+
isDeleted={isDeleted}
315+
index={index + mainGridApps.length}
316+
appVersionsMap={appVersionsMap}
317+
/>
318+
);
319+
})}
320+
</div>
321+
</>
322+
)}
323+
</>
251324
)}
252325
</div>
253326
</div>

packages/apps/app-dashboard/src/components/user-dashboard/dashboard/PermittedAppsWrapper.tsx

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -42,26 +42,29 @@ export function PermittedAppsWrapper() {
4242

4343
// Get permitted, unpermitted, and deleted apps
4444
const { permittedApps, unpermittedApps, deletedApps } = useMemo(() => {
45-
if (!allApps) return { permittedApps: [], unpermittedApps: [], deletedApps: [] };
45+
if (!allApps)
46+
return {
47+
permittedApps: [],
48+
unpermittedApps: [],
49+
deletedApps: [],
50+
};
4651

4752
// Build sets of appIds for each category in a single pass
4853
const permittedAppIds = new Set<number>();
4954
const unpermittedAppIds = new Set<number>();
5055
const deletedAppIds = new Set<number>();
5156

5257
permittedPkps.forEach((p) => {
58+
permittedAppIds.add(p.appId);
5359
if (p.isDeleted) {
5460
deletedAppIds.add(p.appId);
55-
} else {
56-
permittedAppIds.add(p.appId);
5761
}
5862
});
5963

6064
unpermittedPkps.forEach((p) => {
65+
unpermittedAppIds.add(p.appId);
6166
if (p.isDeleted) {
6267
deletedAppIds.add(p.appId);
63-
} else {
64-
unpermittedAppIds.add(p.appId);
6568
}
6669
});
6770

@@ -71,16 +74,22 @@ export function PermittedAppsWrapper() {
7174
const deleted: typeof allApps = [];
7275

7376
allApps.forEach((app) => {
74-
if (deletedAppIds.has(app.appId)) {
75-
deleted.push(app);
76-
} else if (permittedAppIds.has(app.appId)) {
77+
if (permittedAppIds.has(app.appId)) {
7778
permitted.push(app);
7879
} else if (unpermittedAppIds.has(app.appId)) {
7980
unpermitted.push(app);
8081
}
82+
83+
if (deletedAppIds.has(app.appId)) {
84+
deleted.push(app);
85+
}
8186
});
8287

83-
return { permittedApps: permitted, unpermittedApps: unpermitted, deletedApps: deleted };
88+
return {
89+
permittedApps: permitted,
90+
unpermittedApps: unpermitted,
91+
deletedApps: deleted,
92+
};
8493
}, [allApps, permittedPkps, unpermittedPkps]);
8594

8695
// Filter apps based on filter state
@@ -93,7 +102,8 @@ export function PermittedAppsWrapper() {
93102
case 'deleted':
94103
return deletedApps;
95104
case 'all':
96-
return [...permittedApps, ...unpermittedApps, ...deletedApps];
105+
// permittedApps and unpermittedApps already include deleted apps, so just combine them
106+
return [...permittedApps, ...unpermittedApps];
97107
default:
98108
return permittedApps;
99109
}

0 commit comments

Comments
 (0)