diff --git a/apps/console/src/components/form/ControlledField.tsx b/apps/console/src/components/form/ControlledField.tsx index 4049d1fc7..36d223691 100644 --- a/apps/console/src/components/form/ControlledField.tsx +++ b/apps/console/src/components/form/ControlledField.tsx @@ -30,11 +30,11 @@ export function ControlledField( ); } -export function ControlledSelect({ +export function ControlledSelect({ control, name, ...props -}: Props) { +}: Props) { return ( 0 - ? (documents[0] as any).organization_name || "Organization" + ? documents[0].organization_name || "Organization" : "Organization"; setSigningData({ diff --git a/apps/console/src/pages/auth/LoginPage.tsx b/apps/console/src/pages/auth/LoginPage.tsx index 23a198ac0..14866d828 100644 --- a/apps/console/src/pages/auth/LoginPage.tsx +++ b/apps/console/src/pages/auth/LoginPage.tsx @@ -47,10 +47,10 @@ export default function LoginPage() { } window.location.href = "/"; - } catch (e: any) { + } catch (e: unknown) { toast({ title: __("Error"), - description: e.message as string, + description: e instanceof Error ? e.message : __("Failed to login"), variant: "error", }); } finally { @@ -90,10 +90,10 @@ export default function LoginPage() { } else { throw new Error(__("SSO not available for this email domain")); } - } catch (e: any) { + } catch (e: unknown) { toast({ title: __("Error"), - description: e.message as string, + description: e instanceof Error ? e.message : __("Failed to login"), variant: "error", }); } finally { diff --git a/apps/console/src/pages/organizations/NewOrganizationPage.tsx b/apps/console/src/pages/organizations/NewOrganizationPage.tsx index 868dc24d9..f127879ca 100644 --- a/apps/console/src/pages/organizations/NewOrganizationPage.tsx +++ b/apps/console/src/pages/organizations/NewOrganizationPage.tsx @@ -47,7 +47,16 @@ export default function NewOrganizationPage() { const handleSubmit: FormEventHandler = async (e) => { e.preventDefault(); const formData = new FormData(e.currentTarget); - const name = formData.get("name")?.toString()!; + const name = formData.get("name")?.toString(); + if (!name) { + toast({ + title: __("Error"), + description: __("Name is required"), + variant: "error", + }); + return; + } + setIsFetching(true); createOrganization({ diff --git a/apps/console/src/pages/organizations/assets/AssetDetailsPage.tsx b/apps/console/src/pages/organizations/assets/AssetDetailsPage.tsx index 74dafdcce..c7b315ca5 100644 --- a/apps/console/src/pages/organizations/assets/AssetDetailsPage.tsx +++ b/apps/console/src/pages/organizations/assets/AssetDetailsPage.tsx @@ -63,8 +63,8 @@ export default function AssetDetailsPage(props: Props) { ); const deleteAsset = useDeleteAsset(assetEntry, connectionId); - const vendors = assetEntry.vendors?.edges.map((edge: any) => edge.node) ?? []; - const vendorIds = vendors.map((vendor: any) => vendor.id); + const vendors = assetEntry.vendors?.edges.map((edge) => edge.node) ?? []; + const vendorIds = vendors.map((vendor) => vendor.id); const { control, formState, handleSubmit, register, reset } = useFormWithSchema(updateAssetSchema, { defaultValues: { diff --git a/apps/console/src/pages/organizations/audits/AuditDetailsPage.tsx b/apps/console/src/pages/organizations/audits/AuditDetailsPage.tsx index 7e8a148d7..f5d37a47d 100644 --- a/apps/console/src/pages/organizations/audits/AuditDetailsPage.tsx +++ b/apps/console/src/pages/organizations/audits/AuditDetailsPage.tsx @@ -54,9 +54,6 @@ export default function AuditDetailsPage(props: Props) { const { __ } = useTranslate(); const organizationId = useOrganizationId(); const { isAuthorized } = use(PermissionsContext); - if (!auditEntry || !auditEntry.id || !auditEntry.framework) { - return
{__("Audit not found")}
; - } const deleteAudit = useDeleteAudit( { id: auditEntry.id!, framework: { name: auditEntry.framework!.name } }, @@ -78,6 +75,10 @@ export default function AuditDetailsPage(props: Props) { const confirm = useConfirm(); const { toast } = useToast(); + if (!auditEntry || !auditEntry.id || !auditEntry.framework) { + return
{__("Audit not found")}
; + } + const onSubmit = handleSubmit(async (formData) => { if (!auditEntry.id) return; diff --git a/apps/console/src/pages/organizations/continualImprovements/ContinualImprovementDetailsPage.tsx b/apps/console/src/pages/organizations/continualImprovements/ContinualImprovementDetailsPage.tsx index 8c37c43d0..82da474ad 100644 --- a/apps/console/src/pages/organizations/continualImprovements/ContinualImprovementDetailsPage.tsx +++ b/apps/console/src/pages/organizations/continualImprovements/ContinualImprovementDetailsPage.tsx @@ -61,9 +61,6 @@ export default function ContinualImprovementDetailsPage(props: Props) { const { snapshotId } = useParams<{ snapshotId?: string }>(); const isSnapshotMode = Boolean(snapshotId); const { isAuthorized } = use(PermissionsContext); - if (!improvement) { - return
{__("Continual improvement entry not found")}
; - } validateSnapshotConsistency(improvement, snapshotId); @@ -94,6 +91,10 @@ export default function ContinualImprovementDetailsPage(props: Props) { } ); + if (!improvement) { + return
{__("Continual improvement entry not found")}
; + } + const onSubmit = handleSubmit(async (formData) => { try { await updateImprovement({ diff --git a/apps/console/src/pages/organizations/frameworks/FrameworkControlPage.tsx b/apps/console/src/pages/organizations/frameworks/FrameworkControlPage.tsx index 088790f32..d44d81c5c 100644 --- a/apps/console/src/pages/organizations/frameworks/FrameworkControlPage.tsx +++ b/apps/console/src/pages/organizations/frameworks/FrameworkControlPage.tsx @@ -281,7 +281,7 @@ export default function FrameworkControlPage({ queryRef }: Props) { variant="card" measures={control.measures?.edges.map((edge) => edge.node) ?? []} params={{ controlId: control.id }} - connectionId={control.measures?.__id!} + connectionId={control.measures?.__id ?? ""} onAttach={withErrorHandling(attachMeasure, __("Failed to link measure"))} onDetach={withErrorHandling(detachMeasure, __("Failed to unlink measure"))} disabled={isAttachingMeasure || isDetachingMeasure} @@ -292,7 +292,7 @@ export default function FrameworkControlPage({ queryRef }: Props) { variant="card" documents={control.documents?.edges.map((edge) => edge.node) ?? []} params={{ controlId: control.id }} - connectionId={control.documents?.__id!} + connectionId={control.documents?.__id ?? ""} onAttach={withErrorHandling(attachDocument, __("Failed to link document"))} onDetach={withErrorHandling(detachDocument, __("Failed to unlink document"))} disabled={isAttachingDocument || isDetachingDocument} @@ -303,7 +303,7 @@ export default function FrameworkControlPage({ queryRef }: Props) { variant="card" audits={control.audits?.edges.map((edge) => edge.node) ?? []} params={{ controlId: control.id }} - connectionId={control.audits?.__id!} + connectionId={control.audits?.__id ?? ""} onAttach={withErrorHandling(attachAudit, __("Failed to link audit"))} onDetach={withErrorHandling(detachAudit, __("Failed to unlink audit"))} disabled={isAttachingAudit || isDetachingAudit} @@ -314,7 +314,7 @@ export default function FrameworkControlPage({ queryRef }: Props) { variant="card" snapshots={control.snapshots?.edges.map((edge) => edge.node) ?? []} params={{ controlId: control.id }} - connectionId={control.snapshots?.__id!} + connectionId={control.snapshots?.__id ?? ""} onAttach={withErrorHandling(attachSnapshot, __("Failed to link snapshot"))} onDetach={withErrorHandling(detachSnapshot, __("Failed to unlink snapshot"))} disabled={isAttachingSnapshot || isDetachingSnapshot} diff --git a/apps/console/src/pages/organizations/frameworks/dialogs/FrameworkControlDialog.tsx b/apps/console/src/pages/organizations/frameworks/dialogs/FrameworkControlDialog.tsx index 6cb4fbffb..651663a6b 100644 --- a/apps/console/src/pages/organizations/frameworks/dialogs/FrameworkControlDialog.tsx +++ b/apps/console/src/pages/organizations/frameworks/dialogs/FrameworkControlDialog.tsx @@ -83,15 +83,10 @@ export function FrameworkControlDialog(props: Props) { const { __ } = useTranslate(); const frameworkControl = useFragment(controlFragment, props.control); const dialogRef = useDialogRef(); - const [mutate, isMutating] = props.control - ? useMutationWithToasts(updateMutation, { - successMessage: __("Control updated successfully."), - errorMessage: __("Failed to update control"), - }) - : useMutationWithToasts(createMutation, { - successMessage: __("Control created successfully."), - errorMessage: __("Failed to create control"), - }); + const [mutate, isMutating] = useMutationWithToasts(props.control ? updateMutation : createMutation, { + successMessage: __(`Control ${props.control ? "updated" : "created"} successfully.`), + errorMessage: __(`Failed to ${props.control ? "update" : "create"} control`), + }); const defaultValues = useMemo(() => ({ name: frameworkControl?.name ?? "", diff --git a/apps/console/src/pages/organizations/frameworks/dialogs/FrameworkFormDialog.tsx b/apps/console/src/pages/organizations/frameworks/dialogs/FrameworkFormDialog.tsx index 4bcdb692b..c9d002380 100644 --- a/apps/console/src/pages/organizations/frameworks/dialogs/FrameworkFormDialog.tsx +++ b/apps/console/src/pages/organizations/frameworks/dialogs/FrameworkFormDialog.tsx @@ -65,7 +65,8 @@ const schema = z.object({ */ export function FrameworkFormDialog(props: Props) { const { __ } = useTranslate(); - const dialogRef = props.ref ?? useDialogRef(); + const ref = useDialogRef(); + const dialogRef = props.ref ?? ref; const { register, handleSubmit, reset } = useFormWithSchema(schema, { defaultValues: { name: props.framework?.name ?? "", diff --git a/apps/console/src/pages/organizations/measures/dialog/MeasureFormDialog.tsx b/apps/console/src/pages/organizations/measures/dialog/MeasureFormDialog.tsx index 301162da5..6e94a43af 100644 --- a/apps/console/src/pages/organizations/measures/dialog/MeasureFormDialog.tsx +++ b/apps/console/src/pages/organizations/measures/dialog/MeasureFormDialog.tsx @@ -66,15 +66,16 @@ type Props = { export default function MeasureFormDialog(props: Props) { const { __ } = useTranslate(); + const ref = useDialogRef(); + const dialogRef = props.ref ?? ref; const measure = useFragment(measureFragment, props.measure); - const dialogRef = props.ref ?? useDialogRef(); const organizationId = useOrganizationId(); - const [mutate] = props.measure - ? useUpdateMeasure() - : useMutationWithToasts(measureCreateMutation, { - successMessage: __("Measure created successfully."), - errorMessage: __("Failed to create measure"), - }); + const [updateMeasure] = useUpdateMeasure(); + const [createMeasure] = useMutationWithToasts(measureCreateMutation, { + successMessage: __("Measure created successfully."), + errorMessage: __("Failed to create measure"), + }); + const mutate = props.measure ? updateMeasure : createMeasure; const { control, handleSubmit, register, formState, reset } = useFormWithSchema(measureSchema, { diff --git a/apps/console/src/pages/organizations/meetings/MeetingDetailPage.tsx b/apps/console/src/pages/organizations/meetings/MeetingDetailPage.tsx index db1e51131..e07896ad2 100644 --- a/apps/console/src/pages/organizations/meetings/MeetingDetailPage.tsx +++ b/apps/console/src/pages/organizations/meetings/MeetingDetailPage.tsx @@ -56,10 +56,6 @@ export default function MeetingDetailPage(props: Props) { const navigate = useNavigate(); const { isAuthorized } = use(PermissionsContext); - if (!meeting) { - return
{__("Meeting not found")}
; - } - const [deleteMeeting, isDeleting] = useDeleteMeetingMutation(); const confirm = useConfirm(); const updateMinutesDialogRef = useRef(null); @@ -117,12 +113,16 @@ export default function MeetingDetailPage(props: Props) { setCanDelete(false); } } - }, [organizationId]); - - const hasAnyAction = canUpdate || canDelete; + }, [organizationId, isAuthorized]); usePageTitle(meeting.name); + if (!meeting) { + return
{__("Meeting not found")}
; + } + + const hasAnyAction = canUpdate || canDelete; + const handleDelete = () => { confirm( () => diff --git a/apps/console/src/pages/organizations/obligations/ObligationDetailsPage.tsx b/apps/console/src/pages/organizations/obligations/ObligationDetailsPage.tsx index 7e9521ef6..4ab15d4bc 100644 --- a/apps/console/src/pages/organizations/obligations/ObligationDetailsPage.tsx +++ b/apps/console/src/pages/organizations/obligations/ObligationDetailsPage.tsx @@ -64,10 +64,6 @@ export default function ObligationDetailsPage(props: Props) { const isSnapshotMode = Boolean(snapshotId); const { isAuthorized } = use(PermissionsContext); - if (!obligation) { - return
{__("Obligation not found")}
; - } - validateSnapshotConsistency(obligation, snapshotId); const updateObligation = useUpdateObligation(); @@ -79,7 +75,7 @@ export default function ObligationDetailsPage(props: Props) { ); const deleteObligation = useDeleteObligation( - { id: obligation?.id! }, + { id: obligation?.id ?? "" }, connectionId ); @@ -104,6 +100,10 @@ export default function ObligationDetailsPage(props: Props) { } ); + if (!obligation) { + return
{__("Obligation not found")}
; + } + const onSubmit = handleSubmit(async (formData) => { try { await updateObligation({ diff --git a/apps/console/src/pages/organizations/processingActivities/ProcessingActivityDetailsPage.tsx b/apps/console/src/pages/organizations/processingActivities/ProcessingActivityDetailsPage.tsx index 1fca62fa2..7ef34bc28 100644 --- a/apps/console/src/pages/organizations/processingActivities/ProcessingActivityDetailsPage.tsx +++ b/apps/console/src/pages/organizations/processingActivities/ProcessingActivityDetailsPage.tsx @@ -77,10 +77,6 @@ export default function ProcessingActivityDetailsPage(props: Props) { const isSnapshotMode = Boolean(snapshotId); const { isAuthorized } = use(PermissionsContext); - if (!activity) { - return
{__("Processing activity not found")}
; - } - validateSnapshotConsistency(activity, snapshotId); const updateActivity = useUpdateProcessingActivity(); @@ -120,6 +116,10 @@ export default function ProcessingActivityDetailsPage(props: Props) { } ); + if (!activity) { + return
{__("Processing activity not found")}
; + } + const onSubmit = handleSubmit(async (formData) => { try { await updateActivity({ diff --git a/apps/console/src/pages/organizations/settings/SAMLSettingsTab.tsx b/apps/console/src/pages/organizations/settings/SAMLSettingsTab.tsx index 403d29b50..832088371 100644 --- a/apps/console/src/pages/organizations/settings/SAMLSettingsTab.tsx +++ b/apps/console/src/pages/organizations/settings/SAMLSettingsTab.tsx @@ -102,7 +102,7 @@ export default function SAMLSettingsTab() { const configs = organization.samlConfigurations; const dialogRef = useDialogRef(); - const [editingConfig, setEditingConfig] = useState(null); + const [editingConfig, setEditingConfig] = useState & {id: string} | null>(null); const [currentStep, setCurrentStep] = useState("initiate"); const [dnsRecord, setDnsRecord] = useState(""); @@ -222,7 +222,7 @@ export default function SAMLSettingsTab() { }, onCompleted: (response) => { setDnsRecord(response.initiateDomainVerification.dnsRecord); - setEditingConfig(response.initiateDomainVerification.samlConfiguration as any); + setEditingConfig(response.initiateDomainVerification.samlConfiguration); setCurrentStep("verify"); }, }); diff --git a/apps/console/src/pages/organizations/vendors/VendorDetailPage.tsx b/apps/console/src/pages/organizations/vendors/VendorDetailPage.tsx index 71323721c..264542067 100644 --- a/apps/console/src/pages/organizations/vendors/VendorDetailPage.tsx +++ b/apps/console/src/pages/organizations/vendors/VendorDetailPage.tsx @@ -45,10 +45,6 @@ export default function VendorDetailPage(props: Props) { const isSnapshotMode = Boolean(snapshotId); const { isAuthorized } = use(PermissionsContext); - if (!vendor) { - return
{__("Vendor not found")}
; - } - validateSnapshotConsistency(vendor, snapshotId); const deleteVendor = useDeleteVendor( vendor, @@ -60,6 +56,10 @@ export default function VendorDetailPage(props: Props) { vendor as VendorComplianceTabFragment$key ).complianceReports.edges.length; + if (!vendor) { + return
{__("Vendor not found")}
; + } + const vendorsUrl = isSnapshotMode && snapshotId ? `/organizations/${organizationId}/snapshots/${snapshotId}/vendors` : `/organizations/${organizationId}/vendors`; diff --git a/apps/console/src/pages/organizations/vendors/tabs/VendorCertificationsTab.tsx b/apps/console/src/pages/organizations/vendors/tabs/VendorCertificationsTab.tsx index 0e3dd0103..6950911e5 100644 --- a/apps/console/src/pages/organizations/vendors/tabs/VendorCertificationsTab.tsx +++ b/apps/console/src/pages/organizations/vendors/tabs/VendorCertificationsTab.tsx @@ -68,7 +68,7 @@ function Certifications(props: CertificationsProps) { ([key, value]) => [key, value.filter((c) => props.value.includes(c))] as const ) - .filter(([_, certifications]) => certifications.length > 0); + .filter(([, certifications]) => certifications.length > 0); categories.push([ "custom", props.value.filter((c) => !categorizedCertifications.includes(c)),