Skip to content

Commit 8b0d513

Browse files
committed
Merge branch 'master' into nav_to_project
Merge from master
2 parents 7fb925b + 44b30bc commit 8b0d513

9 files changed

Lines changed: 69 additions & 20 deletions

File tree

app/api/api/serializers.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,8 @@ class ScanReportViewSerializerV2(DynamicFieldsMixin, serializers.ModelSerializer
9494
"""
9595

9696
author = UserSerializer(read_only=True)
97+
viewers = UserSerializer(many=True, read_only=True)
98+
editors = UserSerializer(many=True, read_only=True)
9799
parent_dataset = DatasetSerializer(read_only=True)
98100
data_partner = serializers.SerializerMethodField()
99101
mapping_status = MappingStatusSerializer()
@@ -630,6 +632,12 @@ def validate(self, data):
630632

631633
class ScanReportEditSerializer(DynamicFieldsMixin, serializers.ModelSerializer):
632634
mapping_status = MappingStatusSerializer()
635+
viewers = serializers.PrimaryKeyRelatedField(
636+
many=True, queryset=User.objects.all(), required=False
637+
)
638+
editors = serializers.PrimaryKeyRelatedField(
639+
many=True, queryset=User.objects.all(), required=False
640+
)
633641

634642
def validate_author(self, author):
635643
if request := self.context.get("request"):

app/api/datasets/serializers.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from shared.mapping.models import DataPartner, Dataset
44
from shared.mapping.permissions import is_admin, is_az_function_user
55
from projects.serializers import ProjectNameSerializer
6+
from shared.users.serializers import UserSerializer
67

78

89
class DataPartnerSerializer(DynamicFieldsMixin, serializers.ModelSerializer):
@@ -51,6 +52,9 @@ class Meta:
5152
class DatasetViewSerializerV2(DynamicFieldsMixin, serializers.ModelSerializer):
5253
projects = ProjectNameSerializer(many=True, read_only=True)
5354
data_partner = DataPartnerNameSerializer(read_only=True)
55+
viewers = UserSerializer(many=True, read_only=True)
56+
editors = UserSerializer(many=True, read_only=True)
57+
admins = UserSerializer(many=True, read_only=True)
5458

5559
class Meta:
5660
model = Dataset

app/next-client-app/app/(protected)/datasets/[id]/layout.tsx

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { format } from "date-fns/format";
88
import { getDataSet, getDatasetPermissions } from "@/api/datasets";
99
import { Badge } from "@/components/ui/badge";
1010
import { InfoItem } from "@/components/core/InfoItem";
11+
import { AvatarList } from "@/components/core/avatar-list";
1112
import Link from "next/link";
1213

1314
interface LayoutProps {
@@ -83,7 +84,19 @@ export default async function DatasetLayout({
8384
value={format(createdDate, "MMM dd, yyyy h:mm a")}
8485
className="py-1 md:py-0 md:px-3"
8586
/>
87+
8688
</div>
89+
<div className="flex flex-col md:flex-row md:items-center h-7 text-sm space-y-2 md:space-y-0 divide-y md:divide-y-0 md:divide-x">
90+
<div className="flex items-center gap-2 text-muted-foreground">
91+
Members:{" "}
92+
<AvatarList
93+
members={[...dataset.viewers, ...dataset.editors].filter(
94+
(member, index, self) =>
95+
index === self.findIndex((m) => m.id === member.id)
96+
)}
97+
/>
98+
</div>
99+
</div>
87100
{/* "Navs" group */}
88101
<div className="flex justify-between">
89102
<NavGroup

app/next-client-app/app/(protected)/projects/[id]/layout.tsx

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,18 @@ export default async function DatasetLayout({ params, children }: LayoutProps) {
5454
value={format(createdDate, "MMM dd, yyyy h:mm a")}
5555
className="py-1 md:py-0 md:pr-3"
5656
/>
57-
<div className="py-1 md:py-0 md:px-3 h-5 flex items-center gap-2">
58-
Members: <AvatarList members={project?.members || []} />
59-
</div>
6057
</div>
58+
<div className="flex flex-col md:flex-row md:items-center h-7 text-sm space-y-2 md:space-y-0 divide-y md:divide-y-0 md:divide-x">
59+
<div className="flex items-center gap-2 text-muted-foreground">
60+
Members:{" "}
61+
<AvatarList
62+
members={[...project.members].filter(
63+
(member, index, self) =>
64+
index === self.findIndex((m) => m.id === member.id)
65+
)}
66+
/>
67+
</div>
68+
</div>
6169
{/* "Navs" group */}
6270
<div className="flex justify-between">
6371
<NavGroup

app/next-client-app/app/(protected)/scanreports/[id]/layout.tsx

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,20 @@
1-
import { getScanReport, getScanReportPermissions } from "@/api/scanreports";
1+
import {
2+
getScanReport,
3+
getScanReportPermissions,
4+
} from "@/api/scanreports";
25
import { Forbidden } from "@/components/core/Forbidden";
36
import { NavGroup } from "@/components/core/nav-group";
47
import DeleteDialog from "@/components/scanreports/DeleteDialog";
58
import { Button } from "@/components/ui/button";
6-
import { Edit, FileScan, Folders, GripVertical } from "lucide-react";
9+
import { FileScan, Folders, GripVertical } from "lucide-react";
710
import { Boundary } from "@/components/core/boundary";
11+
import { AvatarList } from "@/components/core/avatar-list";
812
import {
913
DropdownMenu,
1014
DropdownMenuContent,
1115
DropdownMenuTrigger,
1216
DropdownMenuSeparator,
13-
DropdownMenuLabel,
14-
17+
DropdownMenuLabel
1518
} from "@/components/ui/dropdown-menu";
1619
import { Suspense } from "react";
1720
import { Skeleton } from "@/components/ui/skeleton";
@@ -112,7 +115,7 @@ export default async function ScanReportLayout(
112115
value={format(createdDate, "MMM dd, yyyy h:mm a")}
113116
className="py-1 md:py-0 md:px-3"
114117
/>
115-
<div className="py-1 md:py-0 md:px-3 h-5 flex items-center gap-2">
118+
<div className="py-1 md:py-0 md:px-3 h-5 flex items-center gap-2 text-muted-foreground">
116119
Upload status:{" "}
117120
<StatusIcon
118121
statusOptions={UploadStatusOptions}
@@ -131,7 +134,20 @@ export default async function ScanReportLayout(
131134
}
132135
/>
133136
</div>
137+
138+
134139
</div>
140+
<div className="flex flex-col md:flex-row md:items-center h-7 text-sm space-y-2 md:space-y-0 divide-y md:divide-y-0 md:divide-x">
141+
<div className="flex items-center gap-2 text-muted-foreground">
142+
Members:{" "}
143+
<AvatarList
144+
members={[...scanreport.viewers, ...scanreport.editors].filter(
145+
(member, index, self) =>
146+
index === self.findIndex((m) => m.id === member.id)
147+
)}
148+
/>
149+
</div>
150+
</div>
135151
{/* "Navs" group */}
136152
<div className="flex flex-col md:flex-row justify-between">
137153
<div>
@@ -163,7 +179,7 @@ export default async function ScanReportLayout(
163179
scanReportId={params.id}
164180
scanReportName={scanreport.dataset}
165181
/>
166-
182+
167183
<DeleteDialog id={Number(params.id)} redirect needTrigger />
168184
</DropdownMenuContent>
169185
</DropdownMenu>

app/next-client-app/components/datasets/DatasetForm.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,9 @@ export function DatasetForm({
5252
)!;
5353
// Find and make initial data suitable for React select
5454
const initialPartnerFilter = FormDataFilter<DataPartner>(initialPartner);
55-
const initialViewersFilter = FindAndFormat<User>(users, dataset.viewers);
56-
const initialEditorsFilter = FindAndFormat<User>(users, dataset.editors);
57-
const initialAdminsFilter = FindAndFormat<User>(users, dataset.admins);
55+
const initialViewersFilter = FormDataFilter<User>(dataset.viewers);
56+
const initialEditorsFilter = FormDataFilter<User>(dataset.editors);
57+
const initialAdminsFilter = FormDataFilter<User>(dataset.admins);
5858
const initialProjectFilter = FindAndFormat<Project>(
5959
projects,
6060
dataset.projects.map((project) => project.id)
@@ -87,7 +87,7 @@ export function DatasetForm({
8787
editors: initialEditorsFilter.map((editor) => editor.value),
8888
dataPartner: initialPartnerFilter[0].value,
8989
admins: initialAdminsFilter.map((admin) => admin.value),
90-
projects: initialProjectFilter.map((project) => project.value),
90+
projects: initialProjectFilter.map((project) => project.value)
9191
}}
9292
onSubmit={(data) => {
9393
handleSubmit(data);

app/next-client-app/components/scanreports/ScanReportDetailsForm.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ export function ScanReportDetailsForm({
5454
const initialDatasetFilter =
5555
FormDataFilter<DataSetSRList>(initialParentDataset);
5656
const initialAuthorFilter = FormDataFilter<User>(initialAuthor);
57-
const initialViewersFilter = FindAndFormat<User>(users, scanreport.viewers);
58-
const initialEditorsFilter = FindAndFormat<User>(users, scanreport.editors);
57+
const initialViewersFilter = FormDataFilter<User>(scanreport.viewers);
58+
const initialEditorsFilter = FormDataFilter<User>(scanreport.editors);
5959

6060
const handleSubmit = async (data: FormData) => {
6161
const submittingData = {

app/next-client-app/types/dataset.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ interface DataSetSRList {
2626
visibility: string;
2727
hidden: boolean | null;
2828
data_partner: DataPartner;
29-
viewers: number[];
30-
admins: number[];
31-
editors: number[];
29+
viewers: User[];
30+
admins: User[];
31+
editors: User[];
3232
projects: Project[];
3333
}
3434

app/next-client-app/types/scanreport.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ interface ScanReport {
1414
hidden: boolean;
1515
visibility: string;
1616
author: User;
17-
viewers: number[];
18-
editors: number[];
17+
viewers: User[];
18+
editors: User[];
1919
}
2020

2121
interface ScanReportTable {

0 commit comments

Comments
 (0)