From cc4c67d15b450feda2080d4f552065c40ea1bcef Mon Sep 17 00:00:00 2001 From: Anthony LC Date: Thu, 14 Aug 2025 12:57:12 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=A9=B9(frontend)=20add=20computed=5Flink?= =?UTF-8?q?=5Freach=20on=20PUT=20link-configuration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit By default a document is "restricted", a restricted document cannot have a role "editor" or "reader". With inheritance, a child document could have a computed link reach different than "restricted" though. We pass the computed link reach when we update the link role, to be sure if follows the parent computed link reach. --- CHANGELOG.md | 1 + .../app-impress/doc-inherited-share.spec.ts | 12 +++++++----- .../docs/doc-management/api/useUpdateDocLink.tsx | 4 ++-- .../docs/doc-share/components/DocVisibility.tsx | 10 ++++++++-- 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6eed33d2..3457ab25 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,6 +38,7 @@ and this project adheres to - πŸ›(backend) allow editor to delete subpages #1296 - πŸ›(frontend) fix dnd conflict with tree and Blocknote #1328 - πŸ›(frontend) fix display bug on homepage #1332 +- πŸ›link role update #1287 ## [3.5.0] - 2025-07-31 diff --git a/src/frontend/apps/e2e/__tests__/app-impress/doc-inherited-share.spec.ts b/src/frontend/apps/e2e/__tests__/app-impress/doc-inherited-share.spec.ts index 87ee6220..2b724ee1 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/doc-inherited-share.spec.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/doc-inherited-share.spec.ts @@ -52,6 +52,12 @@ test.describe('Inherited share accesses', () => { await expect(docVisibilityCard.getByText('Connected')).toBeVisible(); await expect(docVisibilityCard.getByText('Reading')).toBeVisible(); + await docVisibilityCard.getByText('Reading').click(); + await page.getByRole('menuitem', { name: 'Editing' }).click(); + + await expect(docVisibilityCard.getByText('Reading')).toBeHidden(); + await expect(docVisibilityCard.getByText('Editing')).toBeVisible(); + // Verify inherited link await docVisibilityCard.getByText('Connected').click(); await expect( @@ -61,17 +67,13 @@ test.describe('Inherited share accesses', () => { // Update child link await page.getByRole('menuitem', { name: 'Public' }).click(); - await docVisibilityCard.getByText('Reading').click(); - await page.getByRole('menuitem', { name: 'Editing' }).click(); - await expect(docVisibilityCard.getByText('Connected')).toBeHidden(); - await expect(docVisibilityCard.getByText('Reading')).toBeHidden(); await expect( docVisibilityCard.getByText('Public', { exact: true, }), ).toBeVisible(); - await expect(docVisibilityCard.getByText('Editing')).toBeVisible(); + await expect( docVisibilityCard.getByText( 'The link sharing rules differ from the parent document', diff --git a/src/frontend/apps/impress/src/features/docs/doc-management/api/useUpdateDocLink.tsx b/src/frontend/apps/impress/src/features/docs/doc-management/api/useUpdateDocLink.tsx index 1926d311..bc6df9f4 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-management/api/useUpdateDocLink.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-management/api/useUpdateDocLink.tsx @@ -6,8 +6,8 @@ import { APIError, errorCauses, fetchAPI } from '@/api'; import { Doc, KEY_DOC } from '@/docs/doc-management'; import { useBroadcastStore } from '@/stores'; -export type UpdateDocLinkParams = Pick & - Partial>; +export type UpdateDocLinkParams = Pick & + Partial>; export const updateDocLink = async ({ id, diff --git a/src/frontend/apps/impress/src/features/docs/doc-share/components/DocVisibility.tsx b/src/frontend/apps/impress/src/features/docs/doc-share/components/DocVisibility.tsx index 2c341480..dbcd3d2d 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-share/components/DocVisibility.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-share/components/DocVisibility.tsx @@ -17,6 +17,7 @@ import { LinkReach, LinkRole, getDocLinkReach, + getDocLinkRole, useDocUtils, useUpdateDocLink, } from '@/docs/doc-management'; @@ -36,7 +37,7 @@ export const DocVisibility = ({ doc }: DocVisibilityProps) => { const { spacingsTokens, colorsTokens } = useCunninghamTheme(); const canManage = doc.abilities.accesses_manage; const docLinkReach = getDocLinkReach(doc); - const docLinkRole = doc.computed_link_role ?? LinkRole.READER; + const docLinkRole = getDocLinkRole(doc); const { isDesynchronized } = useDocUtils(doc); const { linkModeTranslations, linkReachChoices, linkReachTranslations } = useTranslatedShareSettings(); @@ -85,7 +86,12 @@ export const DocVisibility = ({ doc }: DocVisibilityProps) => { const isDisabled = !options.includes(key); return { label: linkModeTranslations[key], - callback: () => updateDocLink({ id: doc.id, link_role: key }), + callback: () => + updateDocLink({ + id: doc.id, + link_role: key, + link_reach: docLinkReach, + }), isSelected: docLinkRole === key, disabled: isDisabled, };