Skip to content

Commit d2cf23f

Browse files
authored
Merge branch 'main' into lewis/comp-onboarding-calendar
2 parents 42fe663 + 99ecd8b commit d2cf23f

File tree

72 files changed

+548
-514
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

72 files changed

+548
-514
lines changed

apps/app/src/actions/organization/lib/utils.ts

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@ import type { TemplateControl, TemplateTask, TemplatePolicy } from "@comp/data";
22
import { controls, tasks, frameworks, policies } from "@comp/data";
33
import { db } from "@comp/db";
44
import {
5-
FrameworkId,
65
type PolicyStatus,
7-
RequirementId,
86
TaskStatus,
97
TaskFrequency,
108
Departments,
@@ -36,7 +34,7 @@ export function getPolicyById(id: string): TemplatePolicy | undefined {
3634
* @returns Array of control templates relevant to the selected frameworks
3735
*/
3836
export function getRelevantControls(
39-
frameworkIds: FrameworkId[],
37+
frameworkIds: string[],
4038
): TemplateControl[] {
4139
return controls.filter((control) =>
4240
control.mappedRequirements.some((req) =>
@@ -62,7 +60,7 @@ export function getRelevantControls(
6260
*/
6361
export async function createFrameworkInstance(
6462
organizationId: string,
65-
frameworkId: FrameworkId,
63+
frameworkId: string,
6664
txClient?: Prisma.TransactionClient,
6765
) {
6866
const prisma: Prisma.TransactionClient | PrismaClient = txClient ?? db;
@@ -80,7 +78,8 @@ export async function createFrameworkInstance(
8078
}
8179

8280
// Verify the framework exists
83-
const framework = frameworks[frameworkId as FrameworkId];
81+
// @ts-expect-error
82+
const framework = frameworks[frameworkId];
8483

8584
if (!framework) {
8685
console.error(
@@ -99,7 +98,7 @@ export async function createFrameworkInstance(
9998
where: {
10099
organizationId_frameworkId: {
101100
organizationId,
102-
frameworkId: frameworkId as FrameworkId,
101+
frameworkId,
103102
},
104103
},
105104
},
@@ -113,13 +112,13 @@ export async function createFrameworkInstance(
113112
},
114113
data: {
115114
organizationId,
116-
frameworkId: frameworkId as FrameworkId,
115+
frameworkId,
117116
},
118117
})
119118
: await prisma.frameworkInstance.create({
120119
data: {
121120
organizationId,
122-
frameworkId: frameworkId as FrameworkId,
121+
frameworkId,
123122
},
124123
});
125124

@@ -136,6 +135,8 @@ export async function createFrameworkInstance(
136135
),
137136
);
138137

138+
console.log("frameworkControls", frameworkControls);
139+
139140
// Prepare data for batch control creation
140141
const controlsToCreate = frameworkControls.map((control) => ({
141142
organizationId,
@@ -144,6 +145,8 @@ export async function createFrameworkInstance(
144145
// We connect frameworkInstances later or handle differently if createMany doesn't support relation connection easily
145146
}));
146147

148+
console.log("controlsToCreate", controlsToCreate);
149+
147150
// Batch create controls if there are any to create
148151
if (controlsToCreate.length > 0) {
149152
await prisma.control.createMany({
@@ -163,6 +166,8 @@ export async function createFrameworkInstance(
163166
select: { id: true, name: true }, // Select only necessary fields
164167
});
165168

169+
console.log("createdOrFoundDbControls", createdOrFoundDbControls);
170+
166171
// Connect the controls to the framework instance
167172
if (createdOrFoundDbControls.length > 0) {
168173
await prisma.frameworkInstance.update({
@@ -213,7 +218,7 @@ export async function createFrameworkInstance(
213218
* @returns The number of requirement maps created
214219
*/
215220
export async function createRequirementMaps(
216-
frameworkInstance: { id: string; frameworkId: FrameworkId },
221+
frameworkInstance: { id: string; frameworkId: string },
217222
controls: { id: string; name: string }[],
218223
templateControls: TemplateControl[],
219224
txClient?: Prisma.TransactionClient,
@@ -234,7 +239,7 @@ export async function createRequirementMaps(
234239
const requirementMapsToCreate: {
235240
controlId: string;
236241
frameworkInstanceId: string;
237-
requirementId: RequirementId;
242+
requirementId: string;
238243
}[] = [];
239244

240245
// For each template control
@@ -259,8 +264,7 @@ export async function createRequirementMaps(
259264
requirementMapsToCreate.push({
260265
controlId: control.id,
261266
frameworkInstanceId: frameworkInstance.id,
262-
requirementId:
263-
`${frameworkInstance.frameworkId}_${requirement.requirementId}` as RequirementId,
267+
requirementId: requirement.requirementId,
264268
});
265269
}
266270
}

apps/app/src/actions/schema.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import {
22
CommentEntityType,
33
Departments,
4-
FrameworkId,
54
Frequency,
65
Impact,
76
Likelihood,
@@ -15,7 +14,7 @@ import { z } from "zod";
1514
export const organizationSchema = z.object({
1615
name: z.string().min(1, "Organization name is required"),
1716
frameworks: z
18-
.array(z.nativeEnum(FrameworkId))
17+
.array(z.string())
1918
.min(1, "Please select at least one framework to get started with"),
2019
website: z
2120
.string()

apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/controls/[controlId]/components/RequirementRow.tsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { FrameworkId, RequirementMap } from "@comp/db/types";
1+
import type { RequirementMap } from "@comp/db/types";
22
import { TableCell, TableRow } from "@comp/ui/table";
33
import { useRouter } from "next/navigation";
44
import { useParams } from "next/navigation";
@@ -11,11 +11,10 @@ interface RequirementRowProps {
1111
export function RequirementRow({ requirement }: RequirementRowProps) {
1212
const router = useRouter();
1313
const params = useParams();
14-
const [frameworkId, requirementId] = requirement.requirementId.split("_");
14+
const requirementId = requirement.requirementId;
1515
const orgId = params.orgId as string;
1616

1717
const requirementDetails = getRequirementDetails(
18-
frameworkId as FrameworkId,
1918
requirementId,
2019
);
2120

apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/controls/[controlId]/components/RequirementsTable.tsx

Lines changed: 20 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import { DataTableSortList } from "@/components/data-table/data-table-sort-list"
66
import { useDataTable } from "@/hooks/use-data-table";
77
import { useI18n } from "@/locales/client";
88
import type {
9-
FrameworkId,
109
FrameworkInstance,
1110
RequirementMap,
1211
} from "@comp/db/types";
@@ -43,37 +42,23 @@ export function RequirementsTable({
4342
/>
4443
),
4544
cell: ({ row }) => {
46-
const [frameworkId, requirementId] =
47-
row.original.requirementId.split("_");
48-
const details = getRequirementDetails(
49-
frameworkId as FrameworkId,
50-
requirementId,
51-
);
52-
5345
const frameworkDetails = getFrameworkDetails(
5446
row.original.frameworkInstance.frameworkId,
5547
);
48+
5649
return (
5750
<span>
58-
{frameworkDetails?.name} - {details?.name}
51+
{frameworkDetails.name}
5952
</span>
6053
);
6154
},
6255
enableSorting: true,
6356
sortingFn: (rowA, rowB, columnId) => {
64-
const [frameworkIdA, requirementIdA] =
65-
rowA.original.requirementId.split("_");
66-
const [frameworkIdB, requirementIdB] =
67-
rowB.original.requirementId.split("_");
68-
69-
const detailsA = getRequirementDetails(
70-
frameworkIdA as FrameworkId,
71-
requirementIdA,
72-
);
73-
const detailsB = getRequirementDetails(
74-
frameworkIdB as FrameworkId,
75-
requirementIdB,
76-
);
57+
const requirementIdA = rowA.original.requirementId;
58+
const requirementIdB = rowB.original.requirementId;
59+
60+
const detailsA = getRequirementDetails(requirementIdA);
61+
const detailsB = getRequirementDetails(requirementIdB);
7762

7863
const nameA = detailsA?.name || "";
7964
const nameB = detailsB?.name || "";
@@ -90,12 +75,10 @@ export function RequirementsTable({
9075
/>
9176
),
9277
cell: ({ row }) => {
93-
const [frameworkId, requirementId] =
94-
row.original.requirementId.split("_");
95-
const details = getRequirementDetails(
96-
frameworkId as FrameworkId,
97-
requirementId,
98-
);
78+
const requirementId = row.original.requirementId;
79+
const details = getRequirementDetails(requirementId);
80+
81+
console.log("details", requirementId);
9982
return (
10083
<span className="text-muted-foreground">
10184
{details?.description}
@@ -104,19 +87,11 @@ export function RequirementsTable({
10487
},
10588
enableSorting: true,
10689
sortingFn: (rowA, rowB, columnId) => {
107-
const [frameworkIdA, requirementIdA] =
108-
rowA.original.requirementId.split("_");
109-
const [frameworkIdB, requirementIdB] =
110-
rowB.original.requirementId.split("_");
111-
112-
const detailsA = getRequirementDetails(
113-
frameworkIdA as FrameworkId,
114-
requirementIdA,
115-
);
116-
const detailsB = getRequirementDetails(
117-
frameworkIdB as FrameworkId,
118-
requirementIdB,
119-
);
90+
const requirementIdA = rowA.original.requirementId;
91+
const requirementIdB = rowB.original.requirementId;
92+
93+
const detailsA = getRequirementDetails(requirementIdA);
94+
const detailsB = getRequirementDetails(requirementIdB);
12095

12196
const descA = detailsA?.description || "";
12297
const descB = detailsB?.description || "";
@@ -134,20 +109,14 @@ export function RequirementsTable({
134109

135110
const searchLower = searchTerm.toLowerCase();
136111
return requirements.filter((req) => {
137-
const [frameworkId, requirementId] = req.requirementId.split("_");
138-
const details = getRequirementDetails(
139-
frameworkId as FrameworkId,
140-
requirementId,
141-
);
112+
const requirementId = req.requirementId;
113+
const details = getRequirementDetails(requirementId);
142114

143115
// Search in ID, name, and description
144116
return (
145-
frameworkId.toLowerCase().includes(searchLower) ||
146117
requirementId.toLowerCase().includes(searchLower) ||
147118
details?.name?.toLowerCase().includes(searchLower) ||
148-
false ||
149-
details?.description?.toLowerCase().includes(searchLower) ||
150-
false
119+
details?.description?.toLowerCase().includes(searchLower)
151120
);
152121
});
153122
}, [requirements, searchTerm]);
@@ -195,7 +164,7 @@ export function RequirementsTable({
195164
table={table.table}
196165
rowClickBasePath={`/${orgId}/frameworks`}
197166
getRowId={(row) => {
198-
const [_, requirementId] = row.requirementId.split("_");
167+
const requirementId = row.requirementId;
199168
return `${row.frameworkInstanceId}/requirements/${requirementId}`;
200169
}}
201170
tableId={"r"}

apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/controls/components/controls-table-columns.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ export function getControlColumns(): ColumnDef<ControlWithRelations>[] {
7676
className="text-xs"
7777
>
7878
{frameworkName}:{" "}
79-
{req.requirementId.split("_").pop()}
79+
{req.requirementId}
8080
</Badge>
8181
);
8282
})

apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/frameworks/[frameworkInstanceId]/components/FrameworkRequirements.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import { DataTableColumnHeader } from "@/components/data-table/data-table-column
55
import { DataTableSortList } from "@/components/data-table/data-table-sort-list";
66
import { useDataTable } from "@/hooks/use-data-table";
77
import { useI18n } from "@/locales/client";
8-
import { FrameworkId } from "@comp/db/types";
98
import { Card, CardContent, CardHeader, CardTitle } from "@comp/ui/card";
109
import { Input } from "@comp/ui/input";
1110
import { ColumnDef } from "@tanstack/react-table";
@@ -26,7 +25,7 @@ export function FrameworkRequirements({
2625
frameworkId,
2726
frameworkInstanceWithControls,
2827
}: {
29-
frameworkId: FrameworkId;
28+
frameworkId: string;
3029
frameworkInstanceWithControls: FrameworkInstanceWithControls;
3130
}) {
3231
const t = useI18n();

apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/frameworks/[frameworkInstanceId]/requirements/[requirementKey]/components/RequirementControls.tsx

Lines changed: 5 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,39 +2,24 @@
22

33
import { useI18n } from "@/locales/client";
44
import type { Requirement } from "@comp/data";
5-
import { FrameworkId } from "@comp/db/types";
65
import { Card, CardContent, CardHeader, CardTitle } from "@comp/ui/card";
76
import { FrameworkInstanceWithControls } from "../../../../types";
87
import { RequirementControlsTable } from "./table/RequirementControlsTable";
9-
import type { Control, Task } from "@comp/db/types";
8+
import type { Control, RequirementMap, Task } from "@comp/db/types";
109

1110
interface RequirementControlsProps {
1211
requirement: Requirement;
13-
requirementKey: string;
14-
frameworkInstanceWithControls: FrameworkInstanceWithControls;
1512
tasks: (Task & { controls: Control[] })[];
13+
relatedControls: (RequirementMap & { control: Control })[];
1614
}
1715

1816
export function RequirementControls({
1917
requirement,
20-
requirementKey,
21-
frameworkInstanceWithControls,
2218
tasks,
19+
relatedControls,
2320
}: RequirementControlsProps) {
2421
const t = useI18n();
2522

26-
// Get the framework ID from the instance
27-
const frameworkId =
28-
frameworkInstanceWithControls.frameworkId as FrameworkId;
29-
const compositeId = `${frameworkId}_${requirementKey}`;
30-
31-
// Filter controls that are mapped to this requirement using the composite ID
32-
const requirementControls = frameworkInstanceWithControls.controls.filter(
33-
(control) =>
34-
control.requirementsMapped?.some(
35-
(req) => req.requirementId === compositeId,
36-
) ?? false,
37-
);
3823

3924
return (
4025
<div className="space-y-6">
@@ -62,12 +47,12 @@ export function RequirementControls({
6247
<CardHeader>
6348
<CardTitle>
6449
{t("frameworks.controls.title")} (
65-
{requirementControls.length})
50+
{relatedControls.length})
6651
</CardTitle>
6752
</CardHeader>
6853
<CardContent>
6954
<RequirementControlsTable
70-
controls={requirementControls}
55+
controls={relatedControls.map((control) => control.control)}
7156
tasks={tasks}
7257
/>
7358
</CardContent>

0 commit comments

Comments
 (0)