diff --git a/packages/builder/src/components/backend/DataTable/modals/ManageAccessModal.svelte b/packages/builder/src/components/backend/DataTable/modals/ManageAccessModal.svelte index 031af85e62..c7120bd1ab 100644 --- a/packages/builder/src/components/backend/DataTable/modals/ManageAccessModal.svelte +++ b/packages/builder/src/components/backend/DataTable/modals/ManageAccessModal.svelte @@ -65,11 +65,27 @@ $: requiresPlanToModify = permissions.requiresPlanToModify - let dependantResources - async function loadDependantResources() { - dependantResources = await permissionsStore.getDependantsCount(resourceId) + let dependantsInfoMessage + async function loadDependantInfo() { + const dependantsInfo = await permissionsStore.getDependantsInfo(resourceId) + + const resourceByType = dependantsInfo?.resourceByType + + if (resourceByType) { + const total = Object.values(resourceByType).reduce((p, c) => p + c, 0) + let resourceDisplay = + Object.keys(resourceByType).length === 1 && resourceByType.view + ? "view" + : "resource" + + if (total === 1) { + dependantsInfoMessage = `1 ${resourceDisplay} is inheriting this access.` + } else if (total > 1) { + dependantsInfoMessage = `${total} ${resourceDisplay}s are inheriting this access.` + } + } } - loadDependantResources() + loadDependantInfo() @@ -101,12 +117,12 @@ {/each} - {#if dependantResources} + {#if dependantsInfoMessage}
- {dependantResources} resource/s are inheriting this access. + {dependantsInfoMessage}
diff --git a/packages/builder/src/stores/backend/permissions.js b/packages/builder/src/stores/backend/permissions.js index ad0429671b..0113f221c0 100644 --- a/packages/builder/src/stores/backend/permissions.js +++ b/packages/builder/src/stores/backend/permissions.js @@ -26,8 +26,8 @@ export function createPermissionStore() { forResourceDetailed: async resourceId => { return await API.getPermissionForResource(resourceId) }, - getDependantsCount: async resourceId => { - return (await API.getDependants(resourceId)).total + getDependantsInfo: async resourceId => { + return await API.getDependants(resourceId) }, } } diff --git a/packages/server/src/api/controllers/permission.ts b/packages/server/src/api/controllers/permission.ts index 8d7db9e5e4..a9cd686674 100644 --- a/packages/server/src/api/controllers/permission.ts +++ b/packages/server/src/api/controllers/permission.ts @@ -185,7 +185,7 @@ export async function getDependantResources( ) { const resourceId = ctx.params.resourceId ctx.body = { - total: await sdk.permissions.getDependantResources(resourceId), + resourceByType: await sdk.permissions.getDependantResources(resourceId), } } diff --git a/packages/server/src/sdk/app/permissions/index.ts b/packages/server/src/sdk/app/permissions/index.ts index 317e66a153..f122714822 100644 --- a/packages/server/src/sdk/app/permissions/index.ts +++ b/packages/server/src/sdk/app/permissions/index.ts @@ -137,9 +137,11 @@ export async function getResourcePerms( return result } -export async function getDependantResources(resourceId: string) { +export async function getDependantResources( + resourceId: string +): Promise | undefined> { if (db.isTableId(resourceId)) { - const dependants = new Set() + const dependants: Record> = {} const table = await sdk.tables.getTable(resourceId) const views = Object.values(table.views || {}) @@ -152,13 +154,17 @@ export async function getDependantResources(resourceId: string) { const permissions = await getResourcePerms(view.id) for (const [level, roleInfo] of Object.entries(permissions)) { if (roleInfo.type === PermissionSource.INHERITED) { - dependants.add(view.id) + dependants[VirtualDocumentType.VIEW] ??= new Set() + dependants[VirtualDocumentType.VIEW].add(view.id) } } } - return dependants.size + return Object.entries(dependants).reduce((p, [type, resources]) => { + p[type] = resources.size + return p + }, {} as Record) } - return 0 + return } diff --git a/packages/types/src/api/web/app/permission.ts b/packages/types/src/api/web/app/permission.ts index 1623abd8ac..a8ab0e8084 100644 --- a/packages/types/src/api/web/app/permission.ts +++ b/packages/types/src/api/web/app/permission.ts @@ -12,5 +12,5 @@ export interface GetResourcePermsResponse { } export interface GetDependantResourcesResponse { - total: number + resourceByType?: Record }