Skip to content

Commit 54a8352

Browse files
authored
Merge pull request #1699 from mfts/feat/improvements
feat(ee): granular permissions
2 parents 79946b5 + 805b58a commit 54a8352

30 files changed

Lines changed: 3625 additions & 700 deletions

File tree

app/api/views-dataroom/route.ts

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ export async function POST(request: NextRequest) {
115115
enableWatermark: true,
116116
watermarkConfig: true,
117117
groupId: true,
118+
permissionGroupId: true,
118119
audienceType: true,
119120
allowDownload: true,
120121
enableConversation: true,
@@ -854,10 +855,13 @@ export async function POST(request: NextRequest) {
854855

855856
// check if viewer can download the document based on group permissions
856857
let canDownload: boolean = link.allowDownload ?? false;
858+
const effectiveGroupId = link.groupId || link.permissionGroupId;
859+
857860
if (
858861
link.allowDownload &&
859-
link.audienceType === LinkAudienceType.GROUP &&
860-
link.groupId &&
862+
(link.audienceType === LinkAudienceType.GROUP ||
863+
link.permissionGroupId) &&
864+
effectiveGroupId &&
861865
documentId &&
862866
dataroomId
863867
) {
@@ -873,18 +877,36 @@ export async function POST(request: NextRequest) {
873877
if (!dataroomDocument) {
874878
canDownload = false;
875879
} else {
876-
const groupDocumentPermission =
877-
await prisma.viewerGroupAccessControls.findUnique({
878-
where: {
879-
groupId_itemId: {
880-
groupId: link.groupId,
881-
itemId: dataroomDocument.id,
880+
if (link.groupId) {
881+
// This is a ViewerGroup (legacy behavior)
882+
const groupDocumentPermission =
883+
await prisma.viewerGroupAccessControls.findUnique({
884+
where: {
885+
groupId_itemId: {
886+
groupId: link.groupId,
887+
itemId: dataroomDocument.id,
888+
},
889+
itemType: ItemType.DATAROOM_DOCUMENT,
882890
},
883-
itemType: ItemType.DATAROOM_DOCUMENT,
884-
},
885-
select: { canDownload: true },
886-
});
887-
canDownload = groupDocumentPermission?.canDownload ?? false;
891+
select: { canDownload: true },
892+
});
893+
canDownload = groupDocumentPermission?.canDownload ?? false;
894+
} else if (link.permissionGroupId) {
895+
// This is a PermissionGroup (new behavior)
896+
const permissionGroupDocumentPermission =
897+
await prisma.permissionGroupAccessControls.findUnique({
898+
where: {
899+
groupId_itemId: {
900+
groupId: link.permissionGroupId,
901+
itemId: dataroomDocument.id,
902+
},
903+
itemType: ItemType.DATAROOM_DOCUMENT,
904+
},
905+
select: { canDownload: true },
906+
});
907+
canDownload =
908+
permissionGroupDocumentPermission?.canDownload ?? false;
909+
}
888910
}
889911
}
890912

components/datarooms/dataroom-header.tsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,14 @@ import { BellRingIcon } from "lucide-react";
66

77
import { useDataroom, useDataroomLinks } from "@/lib/swr/use-dataroom";
88

9-
import LinkSheet from "@/components/links/link-sheet";
9+
import { DataroomLinkSheet } from "@/components/links/link-sheet/dataroom-link-sheet";
1010
import { Button } from "@/components/ui/button";
11-
1211
import {
1312
Tooltip,
1413
TooltipContent,
1514
TooltipPortal,
1615
TooltipTrigger,
17-
} from "../ui/tooltip";
16+
} from "@/components/ui/tooltip";
1817

1918
export const DataroomHeader = ({
2019
title,
@@ -70,7 +69,7 @@ export const DataroomHeader = ({
7069
Share
7170
</Button>
7271
</div>
73-
<LinkSheet
72+
<DataroomLinkSheet
7473
linkType={"DATAROOM_LINK"}
7574
isOpen={isLinkSheetOpen}
7675
setIsOpen={setIsLinkSheetOpen}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
"use client";
2+
3+
import {
4+
DataroomLinkSheet as DataroomLinkSheetEE,
5+
type ItemPermission as ItemPermissionEE,
6+
} from "@/ee/features/permissions/components/dataroom-link-sheet";
7+
8+
export type ItemPermission = ItemPermissionEE;
9+
10+
export function DataroomLinkSheet(props: any) {
11+
return <DataroomLinkSheetEE {...props} />;
12+
}

components/links/link-sheet/index.tsx

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
4343
import { ButtonTooltip } from "@/components/ui/tooltip";
4444

4545
import { CustomFieldData } from "./custom-fields-panel";
46+
import { type ItemPermission } from "./dataroom-link-sheet";
4647
import DomainSection from "./domain-section";
4748
import { LinkOptions } from "./link-options";
4849
import TagSection from "./tags/tag-section";
@@ -89,6 +90,8 @@ export const DEFAULT_LINK_PROPS = (
8990
uploadFolderId: null,
9091
uploadFolderName: "Home",
9192
enableIndexFile: false,
93+
permissions: {},
94+
permissionGroupId: null,
9295
});
9396

9497
export type DEFAULT_LINK_TYPE = {
@@ -129,6 +132,8 @@ export type DEFAULT_LINK_TYPE = {
129132
uploadFolderId: string | null;
130133
uploadFolderName: string;
131134
enableIndexFile: boolean;
135+
permissions?: ItemPermission | null; // For dataroom links file permissions
136+
permissionGroupId?: string | null;
132137
};
133138

134139
export default function LinkSheet({
@@ -250,10 +255,8 @@ export default function LinkSheet({
250255
enableAgreement: preset.enableAgreement || prev.enableAgreement,
251256
agreementId: preset.agreementId || prev.agreementId,
252257
enableScreenshotProtection:
253-
preset.enableScreenshotProtection ||
254-
prev.enableScreenshotProtection,
255-
enableNotification:
256-
!!preset.enableNotification,
258+
preset.enableScreenshotProtection || prev.enableScreenshotProtection,
259+
enableNotification: !!preset.enableNotification,
257260
};
258261
});
259262

@@ -443,7 +446,7 @@ export default function LinkSheet({
443446

444447
return (
445448
<Sheet open={isOpen} onOpenChange={(open: boolean) => setIsOpen(open)}>
446-
<SheetContent className="flex w-[90%] flex-col justify-between border-l border-gray-200 bg-background px-4 text-foreground dark:border-gray-800 dark:bg-gray-900 sm:w-[600px] sm:max-w-2xl md:px-5">
449+
<SheetContent className="flex w-[90%] flex-col justify-between border-l border-gray-200 bg-background px-4 text-foreground dark:border-gray-800 dark:bg-gray-900 sm:w-[800px] sm:max-w-4xl md:px-5">
447450
<SheetHeader className="text-start">
448451
<SheetTitle>
449452
{currentLink
@@ -458,7 +461,7 @@ export default function LinkSheet({
458461
>
459462
<ScrollArea className="flex-grow">
460463
<div className="h-0 flex-1">
461-
<div className="flex flex-1 flex-col justify-between">
464+
<div className="flex flex-1 flex-col justify-between pb-6">
462465
<div className="divide-y divide-gray-200">
463466
<Tabs
464467
value={data.audienceType}
@@ -493,7 +496,7 @@ export default function LinkSheet({
493496

494497
<TabsContent value={LinkAudienceType.GENERAL}>
495498
{/* GENERAL LINK */}
496-
<div className="space-y-6 pb-10 pt-2">
499+
<div className="space-y-6 pt-2">
497500
<div className="space-y-2">
498501
<Label htmlFor="link-name">Link Name</Label>
499502
<Input
@@ -516,12 +519,6 @@ export default function LinkSheet({
516519
editLink={!!currentLink}
517520
/>
518521
</div>
519-
<div className="space-y-2">
520-
<TagSection
521-
{...{ data, setData }}
522-
teamId={teamInfo?.currentTeam?.id as string}
523-
/>
524-
</div>
525522

526523
{/* Preset Selector - only show when creating a new link */}
527524
{!currentLink &&
@@ -582,7 +579,7 @@ export default function LinkSheet({
582579

583580
<TabsContent value={LinkAudienceType.GROUP}>
584581
{/* GROUP LINK */}
585-
<div className="space-y-6 pb-10 pt-2">
582+
<div className="space-y-6 pt-2">
586583
<div className="space-y-2">
587584
<div className="flex w-full items-center justify-between">
588585
<Label htmlFor="group-id">Group </Label>
@@ -672,12 +669,6 @@ export default function LinkSheet({
672669
editLink={!!currentLink}
673670
/>
674671
</div>
675-
<div className="space-y-2">
676-
<TagSection
677-
{...{ data, setData }}
678-
teamId={teamInfo?.currentTeam?.id as string}
679-
/>
680-
</div>
681672

682673
{/* Preset Selector for Group links - only show when creating a new link */}
683674
{!currentLink &&
@@ -737,6 +728,15 @@ export default function LinkSheet({
737728
</TabsContent>
738729
</Tabs>
739730
</div>
731+
732+
<Separator className="mb-6 mt-2" />
733+
734+
<div className="space-y-2">
735+
<TagSection
736+
{...{ data, setData }}
737+
teamId={teamInfo?.currentTeam?.id as string}
738+
/>
739+
</div>
740740
</div>
741741
</div>
742742
</ScrollArea>

0 commit comments

Comments
 (0)