- Coming Soon
- {/*
+ return (
+
+ Coming Soon
+ {/*
*/}
-
- );
+
+ );
}
const getRiskOverview = unstable_cache(
- async (organizationId: string) => {
- return await db.$transaction(async (tx) => {
- const [risks] = await Promise.all([
- tx.risk.count({
- where: { organizationId },
- }),
- ]);
+ async (organizationId: string) => {
+ return await db.$transaction(async (tx) => {
+ const [risks] = await Promise.all([
+ tx.risk.count({
+ where: { organizationId },
+ }),
+ ]);
- return {
- risks,
- };
- });
- },
- ["risk-overview-cache"],
+ return {
+ risks,
+ };
+ });
+ },
+ ["risk-overview-cache"],
);
export async function generateMetadata({
- params,
+ params,
}: {
- params: Promise<{ locale: string }>;
+ params: Promise<{ locale: string }>;
}): Promise
{
- const { locale } = await params;
- setStaticParamsLocale(locale);
- const t = await getI18n();
+ const { locale } = await params;
+ setStaticParamsLocale(locale);
+ const t = await getI18n();
- return {
- title: t("sidebar.risk"),
- };
+ return {
+ title: t("sidebar.risk"),
+ };
}
diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/[riskId]/comments/page.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/[riskId]/comments/page.tsx
deleted file mode 100644
index b1470f9224..0000000000
--- a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/[riskId]/comments/page.tsx
+++ /dev/null
@@ -1,86 +0,0 @@
-import { auth } from "@/auth";
-import { RiskComments } from "@/components/risks/risk-comments";
-import { getI18n } from "@/locales/server";
-import { db } from "@bubba/db";
-import type { Metadata } from "next";
-import { setStaticParamsLocale } from "next-international/server";
-import { unstable_cache } from "next/cache";
-import { redirect } from "next/navigation";
-
-interface PageProps {
- params: Promise<{ riskId: string }>;
-}
-
-export default async function RiskPage({ params }: PageProps) {
- const session = await auth();
- const { riskId } = await params;
-
- if (!session) {
- redirect("/auth");
- }
-
- if (!session.user.organizationId || !riskId) {
- redirect("/");
- }
-
- const risk = await getRisk(riskId, session.user.organizationId);
-
- if (!risk) {
- redirect("/risk");
- }
-
- const users = await getUsers(session.user.organizationId);
-
- return (
-
-
-
- );
-}
-
-const getRisk = unstable_cache(
- async (riskId: string, organizationId: string) => {
- const risk = await db.risk.findUnique({
- where: {
- id: riskId,
- organizationId: organizationId,
- },
- include: {
- owner: true,
- comments: {
- orderBy: {
- createdAt: "desc",
- },
- },
- },
- });
-
- return risk;
- },
- ["risk-cache"],
-);
-
-const getUsers = unstable_cache(
- async (organizationId: string) => {
- const users = await db.user.findMany({
- where: { organizationId: organizationId },
- });
-
- return users;
- },
- ["users-cache"],
-);
-
-export async function generateMetadata({
- params,
-}: {
- params: Promise<{ locale: string }>;
-}): Promise {
- const { locale } = await params;
- setStaticParamsLocale(locale);
- const t = await getI18n();
-
- return {
- title: t("sub_pages.risk.risk_comments"),
- };
-}
diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/[riskId]/layout.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/[riskId]/layout.tsx
deleted file mode 100644
index f69ab0e564..0000000000
--- a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/[riskId]/layout.tsx
+++ /dev/null
@@ -1,60 +0,0 @@
-import { auth } from "@/auth";
-import { Title } from "@/components/title";
-import { getI18n } from "@/locales/server";
-import { db } from "@bubba/db";
-import { SecondaryMenu } from "@bubba/ui/secondary-menu";
-import { unstable_cache } from "next/cache";
-import { redirect } from "next/navigation";
-
-interface LayoutProps {
- children: React.ReactNode;
- params: Promise<{ riskId: string }>;
-}
-
-export default async function Layout({ children, params }: LayoutProps) {
- const t = await getI18n();
- const session = await auth();
-
- if (!session || !session.user.organizationId) {
- redirect("/");
- }
-
- const riskId = await params;
- const risk = await getRisk(riskId.riskId, session.user.organizationId);
-
- if (!risk) {
- redirect("/risk");
- }
-
- return (
-
-
-
- {children}
-
- );
-}
-
-const getRisk = unstable_cache(
- async (riskId: string, organizationId: string) => {
- const risk = await db.risk.findUnique({
- where: {
- id: riskId,
- organizationId: organizationId,
- },
- });
-
- return risk;
- },
- ["risk-cache"],
-);
diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/[riskId]/page.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/[riskId]/page.tsx
deleted file mode 100644
index 763bc54db4..0000000000
--- a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/[riskId]/page.tsx
+++ /dev/null
@@ -1,251 +0,0 @@
-import { auth } from "@/auth";
-import { Loading } from "@/components/frameworks/loading";
-import { InherentRiskChart } from "@/components/risks/charts/inherent-risk-chart";
-import { ResidualRiskChart } from "@/components/risks/charts/residual-risk-chart";
-import { RiskOverview } from "@/components/risks/risk-overview";
-import type { RiskTaskType } from "@/components/tables/risk-tasks/columns";
-import { DataTable } from "@/components/tables/risk-tasks/data-table";
-import {
- NoResults,
- NoTasks,
-} from "@/components/tables/risk-tasks/empty-states";
-import { FilterToolbar } from "@/components/tables/risk-tasks/filter-toolbar";
-import { getServerColumnHeaders } from "@/components/tables/risk-tasks/server-columns";
-import { getI18n } from "@/locales/server";
-import { db } from "@bubba/db";
-import type { RiskTaskStatus } from "@bubba/db/types";
-import { Card, CardContent, CardHeader, CardTitle } from "@bubba/ui/card";
-import type { Metadata } from "next";
-import { setStaticParamsLocale } from "next-international/server";
-import { unstable_cache } from "next/cache";
-import { redirect } from "next/navigation";
-
-interface PageProps {
- searchParams: Promise<{
- search?: string;
- status?: string;
- sort?: string;
- page?: string;
- per_page?: string;
- }>;
- params: Promise<{ riskId: string; locale: string }>;
-}
-
-export default async function RiskPage({ searchParams, params }: PageProps) {
- const session = await auth();
- const t = await getI18n();
-
- const {
- search,
- status,
- sort,
- page = "1",
- per_page = "5",
- } = await searchParams;
-
- const { riskId } = await params;
- const columnHeaders = await getServerColumnHeaders();
- const [column, order] = sort?.split(":") ?? [];
- const hasFilters = !!(search || status);
- const { tasks: loadedTasks, total } = await getTasks({
- riskId,
- search,
- status: status as RiskTaskStatus,
- column,
- order,
- page: Number.parseInt(page),
- per_page: Number.parseInt(per_page),
- });
-
- if (!session) {
- redirect("/auth");
- }
-
- if (!session.user.organizationId || !riskId) {
- redirect("/");
- }
-
- const risk = await getRisk(riskId, session.user.organizationId);
-
- if (!risk) {
- redirect("/risk");
- }
-
- const users = await getUsers(session.user.organizationId);
-
- return (
-
-
-
-
-
-
-
- {t("risk.tasks.title")}
-
-
-
-
-
-
- {loadedTasks.length > 0 ? (
-
- ) : hasFilters ? (
-
- ) : (
- <>
-
-
- >
- )}
-
-
-
-
-
-
-
-
-
- );
-}
-
-const getRisk = unstable_cache(
- async (riskId: string, organizationId: string) => {
- const risk = await db.risk.findUnique({
- where: {
- id: riskId,
- organizationId: organizationId,
- },
- include: {
- owner: true,
- },
- });
-
- return risk;
- },
- ["risk-cache"],
-);
-
-const getTasks = unstable_cache(
- async function tasks({
- riskId,
- search,
- status,
- column,
- order,
- page = 1,
- per_page = 10,
- }: {
- riskId: string;
- search?: string;
- status?: RiskTaskStatus;
- column?: string;
- order?: string;
- page?: number;
- per_page?: number;
- }) {
- const skip = (page - 1) * per_page;
-
- const [tasks, total] = await Promise.all([
- db.riskMitigationTask
- .findMany({
- where: {
- riskId,
- AND: [
- search
- ? {
- OR: [
- { title: { contains: search, mode: "insensitive" } },
- {
- description: { contains: search, mode: "insensitive" },
- },
- ],
- }
- : {},
- status ? { status } : {},
- ],
- },
- orderBy: column
- ? {
- [column]: order === "asc" ? "asc" : "desc",
- }
- : {
- createdAt: "desc",
- },
- skip,
- take: per_page,
- include: {
- owner: {
- select: {
- name: true,
- image: true,
- },
- },
- },
- })
- .then((tasks) =>
- tasks.map(
- (task) =>
- ({
- ...task,
- dueDate: task.dueDate?.toISOString() ?? "",
- owner: {
- name: task.owner?.name ?? "",
- image: task.owner?.image ?? "",
- },
- }) as RiskTaskType,
- ),
- ),
- db.riskMitigationTask.count({
- where: {
- riskId,
- AND: [
- search
- ? {
- OR: [
- { title: { contains: search, mode: "insensitive" } },
- { description: { contains: search, mode: "insensitive" } },
- ],
- }
- : {},
- status ? { status } : {},
- ],
- },
- }),
- ]);
-
- return { tasks, total };
- },
- ["tasks-cache"],
-);
-
-const getUsers = unstable_cache(
- async (organizationId: string) => {
- const users = await db.user.findMany({
- where: { organizationId: organizationId },
- });
-
- return users;
- },
- ["users-cache"],
-);
-
-export async function generateMetadata({
- params,
-}: {
- params: Promise<{ locale: string }>;
-}): Promise {
- const { locale } = await params;
- setStaticParamsLocale(locale);
- const t = await getI18n();
-
- return {
- title: t("sub_pages.risk.risk_overview"),
- };
-}
diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/[riskId]/tasks/[taskId]/actions/getTaskAttachments.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/[riskId]/tasks/[taskId]/actions/getTaskAttachments.ts
deleted file mode 100644
index 8da91dda97..0000000000
--- a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/[riskId]/tasks/[taskId]/actions/getTaskAttachments.ts
+++ /dev/null
@@ -1,61 +0,0 @@
-"use server";
-
-import { authActionClient } from "@/actions/safe-action";
-import { db } from "@bubba/db";
-import { z } from "zod";
-
-export const getTaskAttachments = authActionClient
- .schema(
- z.object({
- id: z.string(),
- }),
- )
- .metadata({
- name: "getTaskAttachments",
- track: {
- event: "get-task-attachments",
- channel: "server",
- },
- })
- .action(async ({ ctx, parsedInput }) => {
- const { user } = ctx;
- const { id } = parsedInput;
-
- if (!user.organizationId) {
- return {
- success: false,
- error: "Not authorized - no organization found",
- };
- }
-
- try {
- const attachments = await db.taskAttachment.findMany({
- where: {
- riskMitigationTaskId: id,
- organizationId: user.organizationId,
- },
- select: {
- fileUrl: true,
- fileKey: true,
- },
- });
-
- if (!attachments) {
- return {
- success: false,
- error: "Task attachments not found",
- };
- }
-
- return {
- success: true,
- data: attachments,
- };
- } catch (error) {
- console.error("Error fetching task attachments:", error);
- return {
- success: false,
- error: "Failed to fetch task attachments",
- };
- }
- });
diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/[riskId]/tasks/[taskId]/hooks/useTaskAttachments.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/[riskId]/tasks/[taskId]/hooks/useTaskAttachments.ts
deleted file mode 100644
index 9e773bf37d..0000000000
--- a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/[riskId]/tasks/[taskId]/hooks/useTaskAttachments.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-"use client";
-
-import useSWR from "swr";
-import { getTaskAttachments } from "../actions/getTaskAttachments";
-
-interface UseTaskAttachmentProps {
- id: string;
-}
-
-async function fetchTaskAttachments({ id }: UseTaskAttachmentProps) {
- const result = await getTaskAttachments({ id });
-
- if (!result || "error" in result) {
- throw new Error(
- typeof result?.error === "string"
- ? result.error
- : "Failed to fetch task attachments",
- );
- }
-
- return result.data;
-}
-
-export function useTaskAttachments({ id }: UseTaskAttachmentProps) {
- return useSWR(["task-attachments", id], () => fetchTaskAttachments({ id }), {
- revalidateOnFocus: false,
- revalidateOnReconnect: false,
- });
-}
diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/[riskId]/tasks/[taskId]/page.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/[riskId]/tasks/[taskId]/page.tsx
deleted file mode 100644
index 532a3335a7..0000000000
--- a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/[riskId]/tasks/[taskId]/page.tsx
+++ /dev/null
@@ -1,87 +0,0 @@
-import { auth } from "@/auth";
-import { TaskComment } from "@/components/risks/tasks/task-comments";
-import { TaskOverview } from "@/components/risks/tasks/task-overview";
-import { TaskAttachments } from "@/components/risks/tasks/task-attachments";
-import { getI18n } from "@/locales/server";
-import { db } from "@bubba/db";
-import type { Metadata } from "next";
-import { setStaticParamsLocale } from "next-international/server";
-import { unstable_cache } from "next/cache";
-import { redirect } from "next/navigation";
-
-interface PageProps {
- params: Promise<{ riskId: string; taskId: string }>;
-}
-
-export default async function RiskPage({ params }: PageProps) {
- const session = await auth();
- const { riskId, taskId } = await params;
-
- if (!session) {
- redirect("/auth");
- }
-
- if (!session.user.organizationId || !riskId) {
- redirect("/");
- }
-
- const task = await getTask(riskId, taskId);
-
- if (!task) {
- redirect("/risk");
- }
-
- const users = await getUsers(session.user.organizationId);
-
- return (
-
-
-
-
-
- );
-}
-
-const getTask = unstable_cache(
- async (riskId: string, taskId: string) => {
- const task = await db.riskMitigationTask.findUnique({
- where: {
- riskId: riskId,
- id: taskId,
- },
- include: {
- owner: true,
- TaskAttachment: true,
- TaskComments: true,
- },
- });
-
- return task;
- },
- ["risk-cache"],
-);
-
-const getUsers = unstable_cache(
- async (organizationId: string) => {
- const users = await db.user.findMany({
- where: { organizationId: organizationId },
- });
-
- return users;
- },
- ["users-cache"],
-);
-
-export async function generateMetadata({
- params,
-}: {
- params: Promise<{ locale: string }>;
-}): Promise {
- const { locale } = await params;
- setStaticParamsLocale(locale);
- const t = await getI18n();
-
- return {
- title: t("sub_pages.risk.tasks.task_overview"),
- };
-}
diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/[riskId]/tasks/search-params.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/[riskId]/tasks/search-params.ts
deleted file mode 100644
index 55c0834e4e..0000000000
--- a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/[riskId]/tasks/search-params.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import {
- createSearchParamsCache,
- parseAsInteger,
- parseAsString,
-} from "nuqs/server";
-
-export const searchParamsCache = createSearchParamsCache({
- q: parseAsString,
- page: parseAsInteger.withDefault(0),
- start: parseAsString,
- end: parseAsString,
- status: parseAsString,
- ownerId: parseAsString,
-});
diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/components/create-risk-comment-form.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/components/create-risk-comment-form.tsx
deleted file mode 100644
index 1ac4951376..0000000000
--- a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/components/create-risk-comment-form.tsx
+++ /dev/null
@@ -1,106 +0,0 @@
-"use client";
-
-import { createRiskCommentAction } from "@/actions/risk/create-risk-comment";
-import { createRiskCommentSchema } from "@/actions/schema";
-import { useI18n } from "@/locales/client";
-import {
- Accordion,
- AccordionContent,
- AccordionItem,
- AccordionTrigger,
-} from "@bubba/ui/accordion";
-import { Button } from "@bubba/ui/button";
-import {
- Form,
- FormControl,
- FormField,
- FormItem,
- FormMessage,
-} from "@bubba/ui/form";
-import { Textarea } from "@bubba/ui/textarea";
-import { zodResolver } from "@hookform/resolvers/zod";
-import { ArrowRightIcon } from "lucide-react";
-import { useAction } from "next-safe-action/hooks";
-import { useParams } from "next/navigation";
-import { useQueryState } from "nuqs";
-import { useForm } from "react-hook-form";
-import { toast } from "sonner";
-import type { z } from "zod";
-
-export function CreateRiskCommentForm() {
- const t = useI18n();
- const [_, setCreateRiskCommentSheet] = useQueryState("risk-comment-sheet");
- const params = useParams<{ riskId: string }>();
-
- const createRiskComment = useAction(createRiskCommentAction, {
- onSuccess: () => {
- toast.success(t("common.comments.success"));
- setCreateRiskCommentSheet(null);
- },
- onError: () => {
- toast.error(t("common.comments.error"));
- },
- });
-
- const form = useForm>({
- resolver: zodResolver(createRiskCommentSchema),
- defaultValues: {
- content: "",
- riskId: params.riskId,
- },
- });
-
- const onSubmit = (data: z.infer) => {
- createRiskComment.execute(data);
- };
-
- return (
-
-
- );
-}
diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/components/create-risk-form.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/components/create-risk-form.tsx
deleted file mode 100644
index d79fce263d..0000000000
--- a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/components/create-risk-form.tsx
+++ /dev/null
@@ -1,306 +0,0 @@
-"use client";
-
-import { createRiskAction } from "@/actions/risk/create-risk-action";
-import { createRiskSchema } from "@/actions/schema";
-import { useOrganizationAdmins } from "@/app/[locale]/(app)/(dashboard)/[orgId]/hooks/useOrganizationAdmins";
-import { useRisks } from "@/app/[locale]/(app)/(dashboard)/[orgId]/risk/register/hooks/useRisks";
-import { SelectUser } from "@/components/select-user";
-import { useI18n } from "@/locales/client";
-import type { RiskStatus } from "@bubba/db/types";
-import { Departments, RiskCategory } from "@bubba/db/types";
-import {
- Accordion,
- AccordionContent,
- AccordionItem,
- AccordionTrigger,
-} from "@bubba/ui/accordion";
-import { Button } from "@bubba/ui/button";
-import {
- Form,
- FormControl,
- FormField,
- FormItem,
- FormLabel,
- FormMessage,
-} from "@bubba/ui/form";
-import { Input } from "@bubba/ui/input";
-import {
- Select,
- SelectContent,
- SelectItem,
- SelectTrigger,
- SelectValue,
-} from "@bubba/ui/select";
-import { Textarea } from "@bubba/ui/textarea";
-import { zodResolver } from "@hookform/resolvers/zod";
-import { ArrowRightIcon } from "lucide-react";
-import { useAction } from "next-safe-action/hooks";
-import { useQueryState } from "nuqs";
-import { useForm } from "react-hook-form";
-import { toast } from "sonner";
-import type { z } from "zod";
-
-interface User {
- id: string;
- image?: string | null;
- name: string | null;
-}
-
-export function CreateRisk() {
- const t = useI18n();
-
- // Get the same query parameters as the table
- const [search] = useQueryState("search");
- const [page] = useQueryState("page", {
- defaultValue: 1,
- parse: Number.parseInt,
- });
- const [pageSize] = useQueryState("pageSize", {
- defaultValue: 10,
- parse: Number,
- });
- const [status] = useQueryState("status", {
- defaultValue: null,
- parse: (value) => value as RiskStatus | null,
- });
- const [department] = useQueryState("department", {
- defaultValue: null,
- parse: (value) => value as Departments | null,
- });
- const [assigneeId] = useQueryState("assigneeId", {
- defaultValue: null,
- parse: (value) => value,
- });
-
- const { mutate: mutateRisks } = useRisks({
- search: search || "",
- page: Number(page),
- pageSize: Number(pageSize),
- status,
- department,
- assigneeId,
- });
-
- const { data: admins, isLoading: isLoadingAdmins } = useOrganizationAdmins();
- const [_, setCreateRiskSheet] = useQueryState("create-risk-sheet");
-
- const createRisk = useAction(createRiskAction, {
- onSuccess: async () => {
- toast.success(t("risk.form.create_risk_success"));
- setCreateRiskSheet(null);
- // Force invalidate and revalidate the risks list
- await mutateRisks();
- },
- onError: () => {
- toast.error(t("risk.form.create_risk_error"));
- },
- });
-
- const form = useForm>({
- resolver: zodResolver(createRiskSchema),
- defaultValues: {
- title: "",
- description: "",
- category: RiskCategory.operations,
- department: Departments.admin,
- },
- });
-
- const onSubmit = (data: z.infer) => {
- createRisk.execute(data);
- };
-
- return (
-
-
- );
-}
diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/components/create-vendor-sheet.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/components/create-vendor-sheet.tsx
deleted file mode 100644
index 749faa7eed..0000000000
--- a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/components/create-vendor-sheet.tsx
+++ /dev/null
@@ -1,55 +0,0 @@
-"use client";
-
-import { useI18n } from "@/locales/client";
-import { Button } from "@bubba/ui/button";
-import { Drawer, DrawerContent, DrawerTitle } from "@bubba/ui/drawer";
-import { useMediaQuery } from "@bubba/ui/hooks";
-import { ScrollArea } from "@bubba/ui/scroll-area";
-import { Sheet, SheetContent, SheetHeader, SheetTitle } from "@bubba/ui/sheet";
-import { X } from "lucide-react";
-import { useQueryState } from "nuqs";
-import { CreateRisk } from "./create-risk-form";
-
-export function CreateVendorSheet() {
- const t = useI18n();
- const isDesktop = useMediaQuery("(min-width: 768px)");
- const [open, setOpen] = useQueryState("createVendorSheet");
- const isOpen = Boolean(open);
-
- const handleOpenChange = (open: boolean) => {
- setOpen(open ? "true" : null);
- };
-
- if (isDesktop) {
- return (
-
-
-
- {t("risk.create")}
-
-
-
-
-
-
-
-
- );
- }
-
- return (
-
- {t("risk.create")}
-
-
-
-
- );
-}
diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/components/inherent-risk-form.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/components/inherent-risk-form.tsx
deleted file mode 100644
index 049a15142b..0000000000
--- a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/components/inherent-risk-form.tsx
+++ /dev/null
@@ -1,126 +0,0 @@
-"use client";
-
-import { updateInherentRiskAction } from "@/actions/risk/update-inherent-risk-action";
-import { updateInherentRiskSchema } from "@/actions/schema";
-import { useI18n } from "@/locales/client";
-import { Button } from "@bubba/ui/button";
-import {
- Form,
- FormControl,
- FormDescription,
- FormField,
- FormItem,
- FormLabel,
-} from "@bubba/ui/form";
-import { Slider } from "@bubba/ui/slider";
-import { zodResolver } from "@hookform/resolvers/zod";
-import { Loader2 } from "lucide-react";
-import { useAction } from "next-safe-action/hooks";
-import { useQueryState } from "nuqs";
-import { useForm } from "react-hook-form";
-import { toast } from "sonner";
-import type { z } from "zod";
-
-interface InherentRiskFormProps {
- riskId: string;
- initialProbability?: number;
- initialImpact?: number;
-}
-
-export function InherentRiskForm({
- riskId,
- initialProbability,
- initialImpact,
-}: InherentRiskFormProps) {
- const [_, setOpen] = useQueryState("inherent-risk-sheet");
- const t = useI18n();
-
- const updateInherentRisk = useAction(updateInherentRiskAction, {
- onSuccess: () => {
- toast.success(t("risk.form.update_inherent_risk_success"));
- setOpen(null);
- },
- onError: () => {
- toast.error(t("risk.form.update_inherent_risk_error"));
- },
- });
-
- const form = useForm>({
- resolver: zodResolver(updateInherentRiskSchema),
- defaultValues: {
- id: riskId,
- probability: initialProbability,
- impact: initialImpact,
- },
- });
-
- const onSubmit = (data: z.infer) => {
- updateInherentRisk.execute(data);
- };
-
- return (
-
-
- );
-}
diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/components/residual-risk-form.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/components/residual-risk-form.tsx
deleted file mode 100644
index 94566da12e..0000000000
--- a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/components/residual-risk-form.tsx
+++ /dev/null
@@ -1,132 +0,0 @@
-"use client";
-
-import { updateResidualRiskAction } from "@/actions/risk/update-residual-risk-action";
-import { updateResidualRiskSchema } from "@/actions/schema";
-import { useI18n } from "@/locales/client";
-import { Button } from "@bubba/ui/button";
-import {
- Form,
- FormControl,
- FormDescription,
- FormField,
- FormItem,
- FormLabel,
-} from "@bubba/ui/form";
-import { Slider } from "@bubba/ui/slider";
-import { zodResolver } from "@hookform/resolvers/zod";
-import { Loader2 } from "lucide-react";
-import { useAction } from "next-safe-action/hooks";
-import { useQueryState } from "nuqs";
-import { useForm } from "react-hook-form";
-import { toast } from "sonner";
-import type { z } from "zod";
-
-interface ResidualRiskFormProps {
- riskId: string;
- initialProbability: number;
- initialImpact: number;
- onSuccess?: () => void;
-}
-
-interface FormData {
- probability: number;
- impact: number;
-}
-
-export function ResidualRiskForm({
- riskId,
- initialProbability,
- initialImpact,
-}: ResidualRiskFormProps) {
- const t = useI18n();
- const [_, setOpen] = useQueryState("residual-risk-sheet");
-
- const form = useForm>({
- resolver: zodResolver(updateResidualRiskSchema),
- defaultValues: {
- id: riskId,
- probability: initialProbability ? initialProbability : 0,
- impact: initialImpact ? initialImpact : 0,
- },
- });
-
- const updateResidualRisk = useAction(updateResidualRiskAction, {
- onSuccess: () => {
- toast.success(t("risk.form.update_residual_risk_success"));
- setOpen(null);
- },
- onError: () => {
- toast.error(t("risk.form.update_residual_risk_error"));
- },
- });
-
- const onSubmit = (data: z.infer) => {
- updateResidualRisk.execute(data);
- };
-
- return (
-
-
- );
-}
diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/components/risk-overview.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/components/risk-overview.tsx
deleted file mode 100644
index e48665a389..0000000000
--- a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/components/risk-overview.tsx
+++ /dev/null
@@ -1,240 +0,0 @@
-"use client";
-
-import { updateRiskAction } from "@/actions/risk/update-risk-action";
-import { updateRiskSchema } from "@/actions/schema";
-import { SelectUser } from "@/components/select-user";
-import { STATUS_TYPES, Status, type StatusType } from "@/components/status";
-import { useI18n } from "@/locales/client";
-import {
- Departments,
- type Risk,
- RiskCategory,
- RiskStatus,
- type User,
-} from "@bubba/db/types";
-import { Button } from "@bubba/ui/button";
-import {
- Form,
- FormControl,
- FormField,
- FormItem,
- FormLabel,
- FormMessage,
-} from "@bubba/ui/form";
-import {
- Select,
- SelectContent,
- SelectItem,
- SelectTrigger,
- SelectValue,
-} from "@bubba/ui/select";
-import { zodResolver } from "@hookform/resolvers/zod";
-import { Loader2 } from "lucide-react";
-import { useAction } from "next-safe-action/hooks";
-
-import { useForm } from "react-hook-form";
-import { toast } from "sonner";
-import type { z } from "zod";
-
-export function UpdateRiskOverview({
- risk,
- users,
-}: {
- risk: Risk;
- users: User[];
-}) {
- const t = useI18n();
-
- const updateRisk = useAction(updateRiskAction, {
- onSuccess: () => {
- toast.success(t("risk.form.update_risk_success"));
- },
- onError: () => {
- toast.error(t("risk.form.update_risk_error"));
- },
- });
-
- const form = useForm>({
- resolver: zodResolver(updateRiskSchema),
- defaultValues: {
- id: risk.id,
- title: risk.title ?? "",
- description: risk.description ?? "",
- ownerId: risk.ownerId ?? undefined,
- category: risk.category ?? RiskCategory.operations,
- department: risk.department ?? Departments.admin,
- status: risk.status ?? RiskStatus.open,
- },
- });
-
- const onSubmit = (data: z.infer) => {
- updateRisk.execute({
- id: data.id,
- title: data.title,
- description: data.description,
- ownerId: data.ownerId,
- category: data.category,
- department: data.department,
- status: data.status,
- });
- };
-
- console.log(form.formState.defaultValues);
-
- return (
-
-
- );
-}
diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/components/task/create-task-comment-form.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/components/task/create-task-comment-form.tsx
deleted file mode 100644
index 4c63172f22..0000000000
--- a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/components/task/create-task-comment-form.tsx
+++ /dev/null
@@ -1,108 +0,0 @@
-"use client";
-
-import { createTaskCommentAction } from "@/actions/risk/task/create-task-comment";
-import { createTaskCommentSchema } from "@/actions/schema";
-import { useI18n } from "@/locales/client";
-import {
- Accordion,
- AccordionContent,
- AccordionItem,
- AccordionTrigger,
-} from "@bubba/ui/accordion";
-import { Button } from "@bubba/ui/button";
-import {
- Form,
- FormControl,
- FormField,
- FormItem,
- FormMessage,
-} from "@bubba/ui/form";
-import { Textarea } from "@bubba/ui/textarea";
-import { zodResolver } from "@hookform/resolvers/zod";
-import { ArrowRightIcon } from "lucide-react";
-import { useAction } from "next-safe-action/hooks";
-import { useParams } from "next/navigation";
-import { useQueryState } from "nuqs";
-import { useForm } from "react-hook-form";
-import { toast } from "sonner";
-import type { z } from "zod";
-
-export function CreateTaskCommentForm() {
- const t = useI18n();
- const [_, setCreateTaskCommentSheet] = useQueryState("task-comment-sheet");
- const params = useParams<{ riskId: string; taskId: string }>();
-
- const createTaskComment = useAction(createTaskCommentAction, {
- onSuccess: () => {
- toast.success(t("common.comments.success"));
- setCreateTaskCommentSheet(null);
- },
- onError: () => {
- toast.error(t("common.comments.error"));
- },
- });
-
- const form = useForm>({
- resolver: zodResolver(createTaskCommentSchema),
- defaultValues: {
- content: "",
- riskId: params.riskId,
- taskId: params.taskId,
- },
- });
-
- const onSubmit = (data: z.infer) => {
- createTaskComment.execute(data);
- };
-
- return (
-
-
- );
-}
diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/components/task/create-task-form.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/components/task/create-task-form.tsx
deleted file mode 100644
index 5d36bf1330..0000000000
--- a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/components/task/create-task-form.tsx
+++ /dev/null
@@ -1,250 +0,0 @@
-"use client";
-
-import { getOrganizationUsersAction } from "@/actions/organization/get-organization-users-action";
-import { createTaskAction } from "@/actions/risk/task/create-task-action";
-import { createTaskSchema } from "@/actions/schema";
-import { SelectUser } from "@/components/select-user";
-import { useI18n } from "@/locales/client";
-import {
- Accordion,
- AccordionContent,
- AccordionItem,
- AccordionTrigger,
-} from "@bubba/ui/accordion";
-import { Button } from "@bubba/ui/button";
-import { Calendar } from "@bubba/ui/calendar";
-import { cn } from "@bubba/ui/cn";
-import {
- Form,
- FormControl,
- FormField,
- FormItem,
- FormLabel,
- FormMessage,
-} from "@bubba/ui/form";
-import { Input } from "@bubba/ui/input";
-import { Popover, PopoverContent, PopoverTrigger } from "@bubba/ui/popover";
-import {
- Select,
- SelectContent,
- SelectTrigger,
- SelectValue,
-} from "@bubba/ui/select";
-import { Textarea } from "@bubba/ui/textarea";
-import { zodResolver } from "@hookform/resolvers/zod";
-import { format } from "date-fns";
-import { CalendarIcon } from "lucide-react";
-import { ArrowRightIcon } from "lucide-react";
-import { useAction } from "next-safe-action/hooks";
-import { useParams } from "next/navigation";
-import { useQueryState } from "nuqs";
-import { useEffect, useState } from "react";
-import { useForm } from "react-hook-form";
-import { toast } from "sonner";
-import type { z } from "zod";
-
-interface User {
- id: string;
- image?: string | null;
- name: string | null;
-}
-
-export function CreateTaskForm() {
- const t = useI18n();
-
- const [users, setUsers] = useState([]);
- const [isLoadingUsers, setIsLoadingUsers] = useState(true);
- const [_, setCreateTaskSheet] = useQueryState("create-task-sheet");
- const params = useParams<{ riskId: string }>();
-
- useEffect(() => {
- async function loadUsers() {
- const result = await getOrganizationUsersAction();
- if (result?.data?.success && result?.data?.data) {
- setUsers(result.data.data);
- }
- setIsLoadingUsers(false);
- }
-
- loadUsers();
- }, []);
-
- const createTask = useAction(createTaskAction, {
- onSuccess: () => {
- toast.success(t("risk.tasks.form.success"));
- setCreateTaskSheet(null);
- },
- onError: () => {
- toast.error(t("risk.tasks.form.error"));
- },
- });
-
- const form = useForm>({
- resolver: zodResolver(createTaskSchema),
- defaultValues: {
- title: "",
- description: "",
- dueDate: new Date(),
- ownerId: "",
- riskId: params.riskId,
- },
- });
-
- const onSubmit = (data: z.infer) => {
- createTask.execute(data);
- };
-
- return (
-
-
- );
-}
diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/components/task/update-task-form.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/components/task/update-task-form.tsx
deleted file mode 100644
index 47e9fc0476..0000000000
--- a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/components/task/update-task-form.tsx
+++ /dev/null
@@ -1,201 +0,0 @@
-"use client";
-
-import { updateTaskAction } from "@/actions/risk/task/update-task-action";
-import { updateTaskSchema } from "@/actions/schema";
-import { SelectUser } from "@/components/select-user";
-import { STATUS_TYPES, Status, type StatusType } from "@/components/status";
-import { useI18n } from "@/locales/client";
-import {
- type RiskMitigationTask,
- RiskTaskStatus,
- type User,
-} from "@bubba/db/types";
-import { Button } from "@bubba/ui/button";
-import { Calendar } from "@bubba/ui/calendar";
-import {
- Form,
- FormControl,
- FormField,
- FormItem,
- FormLabel,
- FormMessage,
-} from "@bubba/ui/form";
-import { Popover, PopoverContent, PopoverTrigger } from "@bubba/ui/popover";
-import {
- Select,
- SelectContent,
- SelectItem,
- SelectTrigger,
- SelectValue,
-} from "@bubba/ui/select";
-import { zodResolver } from "@hookform/resolvers/zod";
-import { format } from "date-fns";
-import { CalendarIcon, Loader2 } from "lucide-react";
-import { useAction } from "next-safe-action/hooks";
-import React from "react";
-
-import { useForm } from "react-hook-form";
-import { toast } from "sonner";
-import type { z } from "zod";
-import { cn } from "@bubba/ui/cn";
-
-export function UpdateTaskForm({
- task,
- users,
-}: {
- task: RiskMitigationTask;
- users: User[];
-}) {
- const t = useI18n();
-
- const updateTask = useAction(updateTaskAction, {
- onSuccess: () => {
- toast.success("Task updated successfully");
- },
- onError: () => {
- toast.error("Something went wrong, please try again.");
- },
- });
-
- const form = useForm>({
- resolver: zodResolver(updateTaskSchema),
- defaultValues: {
- id: task.id,
- dueDate: task.dueDate ? new Date(task.dueDate) : undefined,
- ownerId: task.ownerId ?? undefined,
- status: task.status ?? RiskTaskStatus.open,
- },
- });
-
- const onSubmit = (data: z.infer) => {
- updateTask.execute({
- id: data.id,
- dueDate: data.dueDate ? new Date(data.dueDate) : undefined,
- ownerId: data.ownerId,
- status: data.status as RiskTaskStatus,
- });
- };
-
- return (
-
-
- );
-}
diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/components/task/update-task-overview-form.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/components/task/update-task-overview-form.tsx
deleted file mode 100644
index d0b01477a7..0000000000
--- a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/components/task/update-task-overview-form.tsx
+++ /dev/null
@@ -1,124 +0,0 @@
-"use client";
-
-import { updateTaskAction } from "@/actions/risk/task/update-task-action";
-import { updateTaskSchema } from "@/actions/schema";
-import { useI18n } from "@/locales/client";
-import type { RiskMitigationTask } from "@bubba/db/types";
-import { Button } from "@bubba/ui/button";
-import {
- Form,
- FormControl,
- FormField,
- FormItem,
- FormLabel,
- FormMessage,
-} from "@bubba/ui/form";
-import { Input } from "@bubba/ui/input";
-import { Textarea } from "@bubba/ui/textarea";
-import { zodResolver } from "@hookform/resolvers/zod";
-import { Loader2 } from "lucide-react";
-import { useAction } from "next-safe-action/hooks";
-import { useQueryState } from "nuqs";
-import { useForm } from "react-hook-form";
-import { toast } from "sonner";
-import type { z } from "zod";
-
-export function UpdateTaskOverviewForm({
- task,
-}: {
- task: RiskMitigationTask;
-}) {
- const t = useI18n();
- const [open, setOpen] = useQueryState("task-update-overview-sheet");
-
- const updateTask = useAction(updateTaskAction, {
- onSuccess: () => {
- toast.success(t("risk.form.update_risk_success"));
- setOpen(null);
- },
- onError: () => {
- toast.error(t("risk.form.update_risk_error"));
- },
- });
-
- const form = useForm>({
- resolver: zodResolver(updateTaskSchema),
- defaultValues: {
- id: task.id,
- title: task.title,
- description: task.description,
- dueDate: task.dueDate ? new Date(task.dueDate) : undefined,
- status: task.status,
- ownerId: task.ownerId ?? undefined,
- },
- });
-
- const onSubmit = (data: z.infer) => {
- updateTask.execute({
- id: data.id,
- title: data.title,
- description: data.description,
- dueDate: data.dueDate ? new Date(data.dueDate) : undefined,
- status: data.status,
- ownerId: data.ownerId,
- });
- };
-
- return (
-
-
- );
-}
diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/components/update-risk-form.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/components/update-risk-form.tsx
deleted file mode 100644
index 5df1ff615f..0000000000
--- a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/components/update-risk-form.tsx
+++ /dev/null
@@ -1,126 +0,0 @@
-"use client";
-
-import { updateRiskAction } from "@/actions/risk/update-risk-action";
-import { updateRiskSchema } from "@/actions/schema";
-import { useI18n } from "@/locales/client";
-import { Departments, type Risk } from "@bubba/db/types";
-import { Button } from "@bubba/ui/button";
-import {
- Form,
- FormControl,
- FormField,
- FormItem,
- FormLabel,
- FormMessage,
-} from "@bubba/ui/form";
-import { Input } from "@bubba/ui/input";
-import { Textarea } from "@bubba/ui/textarea";
-import { zodResolver } from "@hookform/resolvers/zod";
-import { Loader2 } from "lucide-react";
-import { useAction } from "next-safe-action/hooks";
-import { useQueryState } from "nuqs";
-import { useForm } from "react-hook-form";
-import { toast } from "sonner";
-import type { z } from "zod";
-
-export function UpdateRiskForm({
- risk,
-}: {
- risk: Risk;
-}) {
- const t = useI18n();
- const [open, setOpen] = useQueryState("risk-overview-sheet");
-
- const updateRisk = useAction(updateRiskAction, {
- onSuccess: () => {
- toast.success(t("risk.form.update_risk_success"));
- setOpen(null);
- },
- onError: () => {
- toast.error(t("risk.form.update_risk_error"));
- },
- });
-
- const form = useForm>({
- resolver: zodResolver(updateRiskSchema),
- defaultValues: {
- id: risk.id,
- title: risk.title,
- description: risk.description,
- category: risk.category,
- department: risk.department ?? Departments.admin,
- status: risk.status,
- ownerId: risk.ownerId ?? undefined,
- },
- });
-
- const onSubmit = (data: z.infer) => {
- updateRisk.execute({
- id: data.id,
- title: data.title,
- description: data.description,
- category: data.category,
- department: data.department,
- status: data.status,
- ownerId: data.ownerId,
- });
- };
-
- return (
-
-
- );
-}
diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/register/VendorRegisterTable.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/register/VendorRegisterTable.tsx
deleted file mode 100644
index 36136f4a30..0000000000
--- a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/register/VendorRegisterTable.tsx
+++ /dev/null
@@ -1,119 +0,0 @@
-"use client";
-
-import { DataTable } from "@/components/ui/data-table";
-import { useI18n } from "@/locales/client";
-import type { Departments, RiskStatus, User, Vendor } from "@bubba/db/types";
-import { Plus } from "lucide-react";
-import { useQueryState } from "nuqs";
-import { useState } from "react";
-import { useOrganizationAdmins } from "@/app/[locale]/(app)/(dashboard)/[orgId]/hooks/useOrganizationAdmins";
-import { CreateVendorSheet } from "../components/create-vendor-sheet";
-import { columns } from "./components/table/RiskRegisterColumns";
-
-type VendorRegisterTableRow = Vendor & { owner: User | null };
-
-export const VendorRegisterTable = ({
- data,
-}: { data: VendorRegisterTableRow[] }) => {
- const t = useI18n();
- // State
- const [search, setSearch] = useState("");
- const [open, setOpen] = useQueryState("createVendorSheet");
-
- const [page, setPage] = useQueryState("page", {
- defaultValue: 1,
- parse: Number.parseInt,
- });
- const [pageSize, setPageSize] = useQueryState("pageSize", {
- defaultValue: 10,
- parse: Number,
- });
- const [status, setStatus] = useQueryState("status", {
- defaultValue: null,
- parse: (value) => value as RiskStatus | null,
- });
- const [department, setDepartment] = useQueryState(
- "department",
- {
- defaultValue: null,
- parse: (value) => value as Departments | null,
- },
- );
- const [assigneeId, setAssigneeId] = useQueryState(
- "assigneeId",
- {
- defaultValue: null,
- parse: (value) => value,
- },
- );
-
- const hasActiveFilters = Boolean(status || department || assigneeId);
-
- const handleClearFilters = () => {
- setStatus(null);
- setDepartment(null);
- setAssigneeId(null);
- setPage(1);
- };
-
- const departments: Departments[] = [
- "none",
- "it",
- "hr",
- "admin",
- "gov",
- "itsm",
- "qms",
- ] as const;
-
- const { data: admins } = useOrganizationAdmins();
-
- // const filterCategories = RiskRegisterFilters({
- // setPage: (newPage: number) => setPage(newPage),
- // departments: departments,
- // assignees: admins || [],
- // status,
- // setStatus,
- // department,
- // setDepartment,
- // assigneeId,
- // setAssigneeId,
- // });
-
- return (
- <>
-
- columns={columns}
- data={data}
- // isLoading={isLoading}
- search={{
- value: search,
- onChange: setSearch,
- }}
- pagination={{
- page: Number(page),
- pageSize: Number(pageSize),
- totalCount: data.length,
- totalPages: Math.ceil(data.length / Number(pageSize)),
- hasNextPage: Number(page) < Math.ceil(data.length / Number(pageSize)),
- hasPreviousPage: Number(page) > 1,
- }}
- onPageChange={(newPage) => setPage(newPage)}
- onPageSizeChange={(newPageSize) => setPageSize(newPageSize)}
- // filters={{
- // categories: filterCategories,
- // hasActiveFilters,
- // onClearFilters: handleClearFilters,
- // activeFilterCount: [status, department, assigneeId].filter(Boolean)
- // .length,
- // }}
- ctaButton={{
- label: t("vendors.register.create_new"),
- onClick: () => setOpen("true"),
- icon: ,
- }}
- />
-
- >
- );
-};
diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/register/components/table/RiskRegisterColumns.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/register/components/table/RiskRegisterColumns.tsx
deleted file mode 100644
index 78efc21925..0000000000
--- a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/register/components/table/RiskRegisterColumns.tsx
+++ /dev/null
@@ -1,56 +0,0 @@
-import type { Vendor, User } from "@bubba/db/types";
-import type { ColumnDef } from "@tanstack/react-table";
-import { Badge } from "@bubba/ui/badge";
-import Link from "next/link";
-import { Avatar, AvatarFallback, AvatarImage } from "@bubba/ui/avatar";
-import { Status } from "@/components/status";
-
-export const columns: ColumnDef[] = [
- {
- header: "Vendor",
- accessorKey: "name",
- cell: ({ row }) => {
- return (
- {row.original.name}
- );
- },
- },
- // {
- // header: "Status",
- // accessorKey: "status",
- // cell: ({ row }) => {
- // return ;
- // },
- // },
- // {
- // header: "Department",
- // accessorKey: "department",
- // cell: ({ row }) => {
- // return (
- //
- // {row.original.department}
- //
- // );
- // },
- // },
- // {
- // header: "Assignee",
- // accessorKey: "assignee",
- // cell: ({ row }) => {
- // return (
- //
- //
- //
- //
- // {row.original.owner?.name?.charAt(0) || "?"}
- //
- //
- //
{row.original.owner?.name}
- //
- // );
- // },
- // },
-];
diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/register/components/table/RiskRegisterFilters.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/register/components/table/RiskRegisterFilters.tsx
deleted file mode 100644
index ead50a73f8..0000000000
--- a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/register/components/table/RiskRegisterFilters.tsx
+++ /dev/null
@@ -1,72 +0,0 @@
-import { Status } from "@/components/status";
-import { type Departments, RiskStatus } from "@bubba/db/types";
-import type { Admin } from "@/app/[locale]/(app)/(dashboard)/[orgId]/hooks/useOrganizationAdmins";
-import { AssigneeAvatar } from "@/app/[locale]/(app)/(dashboard)/[orgId]/evidence/list/components/table/components/AssigneeAvatar";
-
-export const RiskRegisterFilters = ({
- setPage,
- departments,
- assignees,
- status,
- setStatus,
- department,
- setDepartment,
- assigneeId,
- setAssigneeId,
-}: {
- setPage: (page: number) => void;
- departments: Departments[];
- assignees: Admin[] | undefined;
- status: RiskStatus | null;
- setStatus: (status: RiskStatus | null) => void;
- department: Departments | null;
- setDepartment: (department: Departments | null) => void;
- assigneeId: string | null;
- setAssigneeId: (assigneeId: string | null) => void;
-}) => {
- return [
- {
- label: "Filter by Status",
- items: Object.values(RiskStatus).map((filter) => ({
- label: filter
- .split(" ")
- .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
- .join(" "),
- icon: ,
- value: filter,
- checked: status === filter,
- onChange: (checked: boolean) => {
- setStatus(checked ? filter : null);
- setPage(1);
- },
- })),
- },
- {
- label: "Filter by Department",
- items: departments.map((dept) => ({
- label: dept.replace(/_/g, " ").toUpperCase(),
- value: dept,
- checked: department === dept,
- onChange: (checked: boolean) => {
- setDepartment(checked ? dept : null);
- setPage(1);
- },
- })),
- maxHeight: "150px",
- },
- {
- label: "Filter by Assignee",
- items: (assignees || []).map((assignee) => ({
- label: assignee.name || "Unknown",
- value: assignee.id,
- checked: assigneeId === assignee.id,
- onChange: (checked: boolean) => {
- setAssigneeId(checked ? assignee.id : null);
- setPage(1);
- },
- icon: ,
- })),
- maxHeight: "150px",
- },
- ];
-};
diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/register/layout.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/register/layout.tsx
deleted file mode 100644
index 71699d2dc1..0000000000
--- a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/register/layout.tsx
+++ /dev/null
@@ -1,23 +0,0 @@
-import { getI18n } from "@/locales/server";
-import { SecondaryMenu } from "@bubba/ui/secondary-menu";
-
-export default async function Layout({
- children,
-}: {
- children: React.ReactNode;
-}) {
- const t = await getI18n();
-
- return (
-
-
-
- {children}
-
- );
-}
diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/register/page.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/register/page.tsx
deleted file mode 100644
index 100a2fa973..0000000000
--- a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/register/page.tsx
+++ /dev/null
@@ -1,77 +0,0 @@
-import { auth } from "@/auth";
-import { getI18n } from "@/locales/server";
-import { db } from "@bubba/db";
-import type { Metadata } from "next";
-import { setStaticParamsLocale } from "next-international/server";
-import { redirect } from "next/navigation";
-import { VendorRegisterTable } from "./VendorRegisterTable";
-import { Departments, VendorStatus } from "@bubba/db/types";
-import { z } from "zod";
-
-export default async function Page({
- searchParams,
-}: {
- searchParams: Promise<{
- createVendorSheet?: string;
- page?: string;
- pageSize?: string;
- status?: string;
- department?: string;
- assigneeId?: string;
- }>;
-}) {
- const searchParamsSchema = z.object({
- createVendorSheet: z.string().optional(),
- page: z.string().regex(/^\d+$/).transform(Number).optional(),
- pageSize: z.string().regex(/^\d+$/).transform(Number).optional(),
- status: z.nativeEnum(VendorStatus).optional(),
- department: z.nativeEnum(Departments).optional(),
- assigneeId: z.string().uuid().optional(),
- });
-
- const result = searchParamsSchema.safeParse(await searchParams);
-
- if (!result.success) {
- console.error("Invalid search params:", result.error);
- redirect("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/vendors/register");
- }
-
- const { createVendorSheet, page, pageSize, status, department, assigneeId } =
- result.data;
-
- const session = await auth();
-
- if (!session?.user?.organizationId) {
- redirect("/onboarding");
- }
-
- const vendors = await db.vendor.findMany({
- where: {
- organizationId: session.user.organizationId,
- ...(status && { status: status }),
- ...(department && { department: department }),
- ...(assigneeId && { ownerId: assigneeId }),
- },
- include: {
- owner: true,
- },
- skip: page ? (Number(page) - 1) * Number(pageSize || 10) : 0,
- take: Number(pageSize || 10),
- });
-
- return ;
-}
-
-export async function generateMetadata({
- params,
-}: {
- params: Promise<{ locale: string }>;
-}): Promise {
- const { locale } = await params;
- setStaticParamsLocale(locale);
- const t = await getI18n();
-
- return {
- title: t("sub_pages.vendors.register"),
- };
-}
diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/register/search-params.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/register/search-params.ts
deleted file mode 100644
index 3f1579e77b..0000000000
--- a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/register/search-params.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import {
- createSearchParamsCache,
- parseAsInteger,
- parseAsString,
-} from "nuqs/server";
-
-export const searchParamsCache = createSearchParamsCache({
- q: parseAsString,
- page: parseAsInteger.withDefault(0),
- start: parseAsString,
- end: parseAsString,
- status: parseAsString,
- department: parseAsString,
- ownerId: parseAsString,
-});
diff --git a/apps/app/src/components/tables/risk-register/columns.tsx b/apps/app/src/components/tables/risk-register/columns.tsx
index 22821c5abe..a261cc2c62 100644
--- a/apps/app/src/components/tables/risk-register/columns.tsx
+++ b/apps/app/src/components/tables/risk-register/columns.tsx
@@ -8,102 +8,104 @@ import { Button } from "@bubba/ui/button";
import { cn } from "@bubba/ui/cn";
import type { ColumnDef } from "@tanstack/react-table";
import Link from "next/link";
+import { useParams } from "next/navigation";
export type RiskRegisterType = {
- id: string;
- title: string;
- status: RiskStatus;
- department?: Departments;
- ownerId: string;
- owner: {
- image: string;
- name: string;
- };
+ id: string;
+ title: string;
+ status: RiskStatus;
+ department?: Departments;
+ ownerId: string;
+ owner: {
+ image: string;
+ name: string;
+ };
};
export function columns(): ColumnDef[] {
- const t = useI18n();
+ const t = useI18n();
+ const { orgId } = useParams<{ orgId: string }>();
- return [
- {
- id: "name",
- accessorKey: "name",
- header: t("risk.register.table.risk"),
- cell: ({ row }) => {
- const status = row.original.status;
+ return [
+ {
+ id: "name",
+ accessorKey: "name",
+ header: t("risk.register.table.risk"),
+ cell: ({ row }) => {
+ const status = row.original.status;
- return (
-
-
-
-
-
-
- );
- },
- },
- {
- id: "status",
- accessorKey: "status",
- header: () => (
- {t("common.table.status")}
- ),
- cell: ({ row }) => {
- const status = row.original.status;
+ return (
+
+
+
+
+
+
+ );
+ },
+ },
+ {
+ id: "status",
+ accessorKey: "status",
+ header: () => (
+ {t("common.table.status")}
+ ),
+ cell: ({ row }) => {
+ const status = row.original.status;
- return (
-
-
-
- );
- },
- },
- {
- id: "department",
- accessorKey: "department",
- header: () => (
-
- {t("common.filters.department")}
-
- ),
- cell: ({ row }) => {
- const department = row.original.department;
+ return (
+
+
+
+ );
+ },
+ },
+ {
+ id: "department",
+ accessorKey: "department",
+ header: () => (
+
+ {t("common.filters.department")}
+
+ ),
+ cell: ({ row }) => {
+ const department = row.original.department;
- if (!department) {
- return —;
- }
+ if (!department) {
+ return —;
+ }
- return (
-
-
- {department.replace(/_/g, " ").toUpperCase()}
-
-
- );
- },
- },
- {
- id: "ownerId",
- accessorKey: "ownerId",
- header: () => (
-
- {t("common.assignee.label")}
-
- ),
- cell: ({ row }) => {
- return (
-
- );
- },
- },
- ];
+ return (
+
+
+ {department.replace(/_/g, " ").toUpperCase()}
+
+
+ );
+ },
+ },
+ {
+ id: "ownerId",
+ accessorKey: "ownerId",
+ header: () => (
+
+ {t("common.assignee.label")}
+
+ ),
+ cell: ({ row }) => {
+ return (
+
+ );
+ },
+ },
+ ];
}
diff --git a/apps/app/src/components/tables/risk-tasks/columns.tsx b/apps/app/src/components/tables/risk-tasks/columns.tsx
index 1db4633f24..b4ac9c8923 100644
--- a/apps/app/src/components/tables/risk-tasks/columns.tsx
+++ b/apps/app/src/components/tables/risk-tasks/columns.tsx
@@ -7,95 +7,97 @@ import type { RiskTaskStatus } from "@bubba/db/types";
import { Button } from "@bubba/ui/button";
import type { ColumnDef } from "@tanstack/react-table";
import Link from "next/link";
+import { useParams } from "next/navigation";
export type RiskTaskType = {
- id: string;
- riskId: string;
- title: string;
- status: RiskTaskStatus;
- dueDate: string;
- ownerId: string;
- owner: {
- image: string;
- name: string;
- };
+ id: string;
+ riskId: string;
+ title: string;
+ status: RiskTaskStatus;
+ dueDate: string;
+ ownerId: string;
+ owner: {
+ image: string;
+ name: string;
+ };
};
export function columns(): ColumnDef[] {
- const t = useI18n();
+ const t = useI18n();
+ const { orgId } = useParams<{ orgId: string }>();
- return [
- {
- id: "title",
- accessorKey: "title",
- header: t("risk.tasks.title"),
- cell: ({ row }) => {
- return (
-
-
-
- );
- },
- },
- {
- id: "status",
- accessorKey: "status",
- header: t("common.table.status"),
- cell: ({ row }) => {
- const status = row.original.status;
+ return [
+ {
+ id: "title",
+ accessorKey: "title",
+ header: t("risk.tasks.title"),
+ cell: ({ row }) => {
+ return (
+
+
+
+ );
+ },
+ },
+ {
+ id: "status",
+ accessorKey: "status",
+ header: t("common.table.status"),
+ cell: ({ row }) => {
+ const status = row.original.status;
- return (
-
-
-
- );
- },
- },
- {
- id: "dueDate",
- accessorKey: "dueDate",
- header: () => (
-
- {t("common.table.due_date")}
-
- ),
- cell: ({ row }) => {
- const status = row.original.status;
+ return (
+
+
+
+ );
+ },
+ },
+ {
+ id: "dueDate",
+ accessorKey: "dueDate",
+ header: () => (
+
+ {t("common.table.due_date")}
+
+ ),
+ cell: ({ row }) => {
+ const status = row.original.status;
- return (
-
-
-
- );
- },
- },
- {
- id: "ownerId",
- accessorKey: "ownerId",
- header: () => (
-
- {t("common.table.assigned_to")}
-
- ),
- cell: ({ row }) => {
- return (
-
- );
- },
- },
- ];
+ return (
+
+
+
+ );
+ },
+ },
+ {
+ id: "ownerId",
+ accessorKey: "ownerId",
+ header: () => (
+
+ {t("common.table.assigned_to")}
+
+ ),
+ cell: ({ row }) => {
+ return (
+
+ );
+ },
+ },
+ ];
}
diff --git a/apps/app/src/components/tables/risk-tasks/empty-states.tsx b/apps/app/src/components/tables/risk-tasks/empty-states.tsx
index 7f2d9d0bfb..8aefb93b56 100644
--- a/apps/app/src/components/tables/risk-tasks/empty-states.tsx
+++ b/apps/app/src/components/tables/risk-tasks/empty-states.tsx
@@ -10,63 +10,63 @@ import { useRouter } from "next/navigation";
import { useQueryState } from "nuqs";
type Props = {
- hasFilters?: boolean;
+ hasFilters?: boolean;
};
export function NoResults({ hasFilters }: Props) {
- const t = useI18n();
- const router = useRouter();
- const params = useParams<{ riskId: string }>();
+ const t = useI18n();
+ const router = useRouter();
+ const { orgId, riskId } = useParams<{ orgId: string; riskId: string }>();
- return (
-
-
-
-
-
- {t("common.empty_states.no_results.title")}
-
-
- {hasFilters
- ? t("common.empty_states.no_results.description_filters")
- : t("common.empty_states.no_results.description_no_tasks")}
-
-
+ return (
+
+
+
+
+
+ {t("common.empty_states.no_results.title")}
+
+
+ {hasFilters
+ ? t("common.empty_states.no_results.description_filters")
+ : t("common.empty_states.no_results.description_no_tasks")}
+
+
- {hasFilters && (
-
- )}
-
-
- );
+ {hasFilters && (
+
+ )}
+
+
+ );
}
export function NoTasks({ isEmpty }: { isEmpty: boolean }) {
- const t = useI18n();
+ const t = useI18n();
- const [open, setOpen] = useQueryState("create-task-sheet");
+ const [open, setOpen] = useQueryState("create-task-sheet");
- return (
-
-
-
- {t("common.empty_states.no_results.title_tasks")}
-
-
- {t("common.empty_states.no_results.description_no_tasks")}
-
-
-
+ return (
+
+
+
+ {t("common.empty_states.no_results.title_tasks")}
+
+
+ {t("common.empty_states.no_results.description_no_tasks")}
+
+
+
-
-
- );
+
+
+ );
}
diff --git a/apps/app/src/components/tables/tests/empty-states.tsx b/apps/app/src/components/tables/tests/empty-states.tsx
index 98b1e2d252..13944be7d1 100644
--- a/apps/app/src/components/tables/tests/empty-states.tsx
+++ b/apps/app/src/components/tables/tests/empty-states.tsx
@@ -4,7 +4,7 @@ import { EmployeeInviteSheet } from "@/components/sheets/invite-user-sheet";
import { useI18n } from "@/locales/client";
import { Button } from "@bubba/ui/button";
import { CloudOff } from "lucide-react";
-import { useRouter } from "next/navigation";
+import { useParams, useRouter } from "next/navigation";
interface Props {
hasFilters?: boolean;
@@ -13,6 +13,7 @@ interface Props {
export function NoResults({ hasFilters }: Props) {
const router = useRouter();
const t = useI18n();
+ const { orgId } = useParams<{ orgId: string }>();
return (
@@ -30,7 +31,10 @@ export function NoResults({ hasFilters }: Props) {
{hasFilters && (
-