From e3df511890b94f72e6218fa8f73127561d19a025 Mon Sep 17 00:00:00 2001 From: Rama Priyanto Date: Tue, 24 Jun 2025 13:33:38 +0700 Subject: [PATCH] fix:supervisor, feedback create edit delete, knowledge base creat edit delete --- .../supervisor/knowledge-base/page.tsx | 265 ++++++++++++++++-- .../setting/feedback/components/feedback.tsx | 128 +++++++-- components/partials/auth/login-form.tsx | 20 +- service/master/knowledge-base.ts | 5 + 4 files changed, 370 insertions(+), 48 deletions(-) diff --git a/app/[locale]/(protected)/supervisor/knowledge-base/page.tsx b/app/[locale]/(protected)/supervisor/knowledge-base/page.tsx index c2117352..7f4c083f 100644 --- a/app/[locale]/(protected)/supervisor/knowledge-base/page.tsx +++ b/app/[locale]/(protected)/supervisor/knowledge-base/page.tsx @@ -13,21 +13,81 @@ import { deleteKnowledgeBase, getKnowledgeBaseCategoryList, getKnowledgeBaseList, + saveKnowledgeBase, + saveKnowledgeBaseCategory, } from "@/service/master/knowledge-base"; -import React from "react"; -import { Plus, Trash, Trash2 } from "lucide-react"; +import React, { useEffect, useState } from "react"; +import { Edit2Icon, Plus, Trash, Trash2 } from "lucide-react"; import { Button } from "@/components/ui/button"; import CreateCategory from "./create-category"; import withReactContent from "sweetalert2-react-content"; import Swal from "sweetalert2"; import { deleteMedia } from "@/service/content/content"; import { error } from "@/lib/swal"; +import { close, loading } from "@/config/swal"; +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "@/components/ui/dialog"; +import { + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, +} from "@/components/ui/form"; +import { Input } from "@/components/ui/input"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { useForm } from "react-hook-form"; +import { z } from "zod"; +import { toast } from "@/components/ui/use-toast"; +import { Textarea } from "@/components/ui/textarea"; + +const FormSchema = z.object({ + name: z.string().min(2, { + message: "Name must be at least 2 characters.", + }), +}); + +const FormSchemaCreate = z.object({ + title: z.string().min(2, { + message: "Judul minimal 2 karakter.", + }), + question: z.string().min(2, { + message: "Pertanyaan minimal 2 karakter.", + }), + answer: z.string().min(2, { + message: "Jawaban minimal 2 karakter.", + }), +}); const KnowledgeBase = () => { const MySwal = withReactContent(Swal); - const [categories, setCategories] = React.useState([]); - const [questions, setQuestions] = React.useState([]); + const [categories, setCategories] = useState([]); + const [questions, setQuestions] = useState([]); + const [selectedCategoryId, setSelectedCategoryId] = useState(0); + const [isDialogOpen, setIsDialogOpen] = useState(false); + const [viewCreate, setViewCreate] = useState(false); + const form = useForm>({ + resolver: zodResolver(FormSchema), + defaultValues: { + name: "", + }, + }); + + const formCreate = useForm>({ + resolver: zodResolver(FormSchemaCreate), + defaultValues: { + title: "", + question: "", + answer: "", + }, + }); React.useEffect(() => { fetchCategoryList(); }, []); @@ -37,7 +97,9 @@ const KnowledgeBase = () => { const data = response?.data?.data; if (data) { setCategories(data); - fetchQuestions(data[0]?.id); + fetchQuestions( + selectedCategoryId === 0 ? data[0]?.id : selectedCategoryId + ); } } @@ -50,7 +112,7 @@ const KnowledgeBase = () => { }; async function doDelete(id: any) { - // loading(); + loading(); const data = { id, }; @@ -61,6 +123,7 @@ const KnowledgeBase = () => { error(response.message); return false; } + close(); success(); } @@ -72,7 +135,7 @@ const KnowledgeBase = () => { confirmButtonText: "OK", }).then((result) => { if (result.isConfirmed) { - window.location.reload(); + fetchQuestions(selectedCategoryId); } }); } @@ -93,6 +156,50 @@ const KnowledgeBase = () => { }); }; + function onSubmit(data: z.infer) { + save(data); + setIsDialogOpen(false); + } + + useEffect(() => { + formCreate.reset(); + }, [viewCreate]); + + async function save(data: any) { + loading(); + const reqData = { + id: selectedCategoryId, + name: data.name, + }; + const response = await saveKnowledgeBaseCategory(reqData); + if (response?.error) { + return false; + } + close(); + toast({ + title: "Task created successfully.", + }); + fetchCategoryList(); + } + + async function onSubmitCreate(data: z.infer) { + const reqData = { + title: data.title, + categoryId: + selectedCategoryId === 0 ? categories[0]?.id : selectedCategoryId, + question: data.question, + answer: data.answer, + }; + const response = await saveKnowledgeBase(reqData); + if (response?.error) { + error(response.message); + return false; + } + fetchQuestions( + selectedCategoryId === 0 ? categories[0]?.id : selectedCategoryId + ); + } + return (
@@ -108,6 +215,7 @@ const KnowledgeBase = () => { value={`category-${index}`} onClick={() => { fetchQuestions(category?.id); + setSelectedCategoryId(category?.id); }} className="group data-[state=active]:bg-secondary data-[state=active]:text-default rounded-md px-6 py-3 w-full justify-between flex items-center" > @@ -116,7 +224,57 @@ const KnowledgeBase = () => { className="right-2 top-2 hidden group-hover:inline-flex" // onClick={() => deleteCategory(category?.id)} > - +
+ + + + form.setValue("name", category.name) + } + > + + + + + + Edit Category + +
+ + ( + + + Name + + + + + + + )} + /> +
+ +
+ + +
+
+ +
))} @@ -145,6 +303,7 @@ const KnowledgeBase = () => { }} className="text-left" /> + { ))} - {questions?.length > 0 && ( -
- - +
+ + +
+ {viewCreate && ( +
+
+ + ( + + + Judul + + + + + + + )} + /> + ( + + + Pertanyaan + + +