Skip to content

Commit e4fbb8c

Browse files
authored
Merge pull request #2602 from trycompai/lewis/comp-framework-controls-fix
[dev] [carhartlewis] lewis/comp-framework-controls-fix
2 parents e432288 + e3b58bc commit e4fbb8c

3 files changed

Lines changed: 34 additions & 27 deletions

File tree

apps/api/src/frameworks/frameworks-scores.helper.ts

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,20 @@ interface EvidenceSubmissionForScoring {
227227
submittedAt: Date | string;
228228
}
229229

230+
function hasAnyArtifact(
231+
control: ControlForScoring,
232+
tasks: TaskWithControls[],
233+
): boolean {
234+
const policies = control.policies ?? [];
235+
const documentTypes = control.controlDocumentTypes ?? [];
236+
const controlTasks = tasks.filter((t) =>
237+
t.controls.some((c) => c.id === control.id),
238+
);
239+
return (
240+
policies.length > 0 || controlTasks.length > 0 || documentTypes.length > 0
241+
);
242+
}
243+
230244
function isControlCompleted(
231245
control: ControlForScoring,
232246
tasks: TaskWithControls[],
@@ -267,20 +281,17 @@ function isControlCompleted(
267281
}
268282
}
269283

270-
const hasAnyArtifact =
271-
policies.length > 0 || controlTasks.length > 0 || documentTypes.length > 0;
272-
273-
return (
274-
hasAnyArtifact && policiesComplete && tasksComplete && documentsComplete
275-
);
284+
return policiesComplete && tasksComplete && documentsComplete;
276285
}
277286

278287
export function computeFrameworkComplianceScore(
279288
framework: FrameworkWithControlsForScoring,
280289
tasks: TaskWithControls[],
281290
evidenceSubmissions: EvidenceSubmissionForScoring[] = [],
282291
): number {
283-
const controls = framework.controls ?? [];
292+
const controls = (framework.controls ?? []).filter((c) =>
293+
hasAnyArtifact(c, tasks),
294+
);
284295
if (controls.length === 0) return 0;
285296
const completed = controls.filter((c) =>
286297
isControlCompleted(c, tasks, evidenceSubmissions),

apps/app/src/app/(app)/[orgId]/frameworks/[frameworkInstanceId]/components/AddCustomRequirementSheet.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import { Input } from '@trycompai/ui/input';
2323
import { Textarea } from '@trycompai/ui/textarea';
2424
import { zodResolver } from '@hookform/resolvers/zod';
2525
import { useRouter } from 'next/navigation';
26-
import { useState } from 'react';
26+
import { useEffect, useState } from 'react';
2727
import { useForm } from 'react-hook-form';
2828
import { toast } from 'sonner';
2929
import { z } from 'zod';
@@ -52,6 +52,12 @@ export function AddCustomRequirementSheet({
5252
mode: 'onChange',
5353
});
5454

55+
useEffect(() => {
56+
if (!isOpen) {
57+
form.reset({ identifier: '', name: '', description: '' });
58+
}
59+
}, [isOpen, form]);
60+
5561
if (!hasPermission('framework', 'update')) return null;
5662

5763
const handleSubmit = async (values: FormValues) => {

apps/app/src/app/(app)/[orgId]/frameworks/[frameworkInstanceId]/controls/[controlId]/components/useControlOptions.ts

Lines changed: 9 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
'use client';
22

3-
import { apiClient } from '@/lib/api-client';
4-
import useSWR from 'swr';
3+
import { useApiSWR } from '@/hooks/use-api-swr';
54

65
interface PolicyOption {
76
id: string;
@@ -31,26 +30,17 @@ interface ControlOptionsResponse {
3130
}
3231

3332
export function useControlOptions(enabled: boolean) {
34-
const { data, isLoading, mutate } = useSWR<ControlOptionsResponse>(
35-
enabled ? '/v1/controls/options' : null,
36-
async (url: string) => {
37-
const res = await apiClient.get<ControlOptionsResponse>(url);
38-
if (res.error) throw new Error(res.error);
39-
return (
40-
res.data ?? {
41-
policies: [],
42-
tasks: [],
43-
requirements: [],
44-
}
45-
);
46-
},
47-
{ revalidateOnFocus: false },
33+
const { data, isLoading, mutate } = useApiSWR<ControlOptionsResponse>(
34+
'/v1/controls/options',
35+
{ enabled },
4836
);
4937

38+
const options = data?.data;
39+
5040
return {
51-
policies: data?.policies ?? [],
52-
tasks: data?.tasks ?? [],
53-
requirements: data?.requirements ?? [],
41+
policies: options?.policies ?? [],
42+
tasks: options?.tasks ?? [],
43+
requirements: options?.requirements ?? [],
5444
isLoading,
5545
mutate,
5646
};

0 commit comments

Comments
 (0)