From b91b7f93cde9506238ac9f4f227766a1dc58f8b5 Mon Sep 17 00:00:00 2001 From: hanif salafi Date: Tue, 7 Oct 2025 12:15:39 +0700 Subject: [PATCH] feat: update user levels and user management --- .../management-user/internal/create/page.tsx | 777 +---------------- .../internal/edit/[id]/page.tsx | 795 +----------------- .../(admin)/admin/settings/tenant/page.tsx | 2 +- components/form/tenant/tenant-update-form.tsx | 193 ++++- components/form/user/user-form.tsx | 350 ++++++++ .../management-user-internal-column-table.tsx | 27 +- service/approval-workflows.ts | 5 +- .../management-user/management-user.ts | 39 + 8 files changed, 628 insertions(+), 1560 deletions(-) create mode 100644 components/form/user/user-form.tsx diff --git a/app/[locale]/(admin)/admin/management-user/internal/create/page.tsx b/app/[locale]/(admin)/admin/management-user/internal/create/page.tsx index 65e8e20..c8a2e47 100644 --- a/app/[locale]/(admin)/admin/management-user/internal/create/page.tsx +++ b/app/[locale]/(admin)/admin/management-user/internal/create/page.tsx @@ -1,773 +1,26 @@ "use client"; -import SiteBreadcrumb from "@/components/site-breadcrumb"; -import { zodResolver } from "@hookform/resolvers/zod"; -import { Check, ChevronsUpDown, Eye, EyeOff } from "lucide-react"; -import { useForm } from "react-hook-form"; -import { z } from "zod"; -import { cn, getCookiesDecrypt } from "@/lib/utils"; -import { Button } from "@/components/ui/button"; -import { - Command, - CommandEmpty, - CommandGroup, - CommandInput, - CommandItem, - CommandList, -} from "@/components/ui/command"; -import { - Form, - FormControl, - FormField, - FormItem, - FormLabel, - FormMessage, -} from "@/components/ui/form"; -import { - Popover, - PopoverContent, - PopoverTrigger, -} from "@/components/ui/popover"; -import { useEffect, useState } from "react"; -import { Input } from "@/components/ui/input"; -import { Textarea } from "@/components/ui/textarea"; -import { Link, useRouter } from "@/i18n/routing"; -import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; -import dynamic from "next/dynamic"; -import { Checkbox } from "@/components/ui/checkbox"; -import { - Select, - SelectContent, - SelectItem, - SelectTrigger, - SelectValue, -} from "@/components/ui/select"; -import Swal from "sweetalert2"; -import withReactContent from "sweetalert2-react-content"; -import { close, error, loading } from "@/config/swal"; -import { AdministrationLevelList, getListCompetencies, getListEducation, getListSchools, saveUserInternal } from "@/service/service/management-user/management-user"; +import { useRouter } from "@/i18n/routing"; +import UserForm from "@/components/form/user/user-form"; -const PasswordChecklist = dynamic(() => import("react-password-checklist"), { - ssr: false, -}); - -const sns = [ - { - key: 1, - id: "comment", - typeId: 1, - name: "Komentar Konten", - }, - { - key: 2, - id: "fb", - typeId: 2, - name: "Facebook", - }, - { - key: 3, - id: "ig", - typeId: 3, - name: "Instagram", - }, - { - key: 4, - id: "twt", - typeId: 4, - name: "Twitter", - }, - { - key: 5, - id: "yt", - typeId: 5, - name: "Youtube", - }, - { - key: 6, - id: "emergency", - typeId: 6, - name: "Emergency Issue", - }, - { - key: 7, - id: "email", - typeId: 7, - name: "Email", - }, - { - key: 8, - id: "inbox", - typeId: 8, - name: "Pesan Masuk", - }, - { - key: 9, - id: "whatsapp", - typeId: 9, - name: "Whatssapp", - }, - { - key: 10, - id: "tiktok", - typeId: 10, - name: "Tiktok", - }, -]; - -interface RoleData { - id: number; - label: string; - name: string; - value: string; - levelNumber: number; -} - -const FormSchema = z.object({ - level: z.string({ - required_error: "Required", - }), - fullname: z.string({ - required_error: "Required", - }), - username: z.string({ - required_error: "Required", - }), - role: z.string({ - required_error: "Required", - }), - nrp: z.string({ - required_error: "Required", - }), - address: z.string({ - required_error: "Required", - }), - email: z.string({ - required_error: "Required", - }), - phoneNumber: z.string({ - required_error: "Required", - }), - password: z.string({ - required_error: "Required", - }), - confirmPassword: z.string({ - required_error: "Required", - }), - isValidPassword: z.boolean().refine((val) => val === true, { - message: "Check Password", - }), - sns: z.array(z.string()).optional(), - education: z.string().optional(), - school: z.string().optional(), - competency: z.string().optional(), -}); - -export default function CreateUserForm() { +export default function CreateUserPage() { const router = useRouter(); - const MySwal = withReactContent(Swal); - const levelName = getCookiesDecrypt("ulnae"); - const [roleList, setRoleList] = useState([]); - const [showPassword, setShowPassword] = useState(false); - const [showConfirmPassword, setShowConfirmPassword] = useState(false); - const [userEducations, setUserEducations] = useState(); - const [userSchools, setUserSchools] = useState(); - const [userCompetencies, setUserCompetencies] = useState(); - const form = useForm>({ - resolver: zodResolver(FormSchema), - defaultValues: { - password: "", - confirmPassword: "", - sns: [], - education: "1", - school: "4", - competency: "2", - }, - }); - - const passwordVal = form.watch("password"); - const confPasswordVal = form.watch("confirmPassword"); - const selectedRole = form.watch("role"); - - useEffect(() => { - initFetch(); - getDataAdditional(); - }, []); - - const initFetch = async () => { - const response = await AdministrationLevelList(); - const res = response?.data?.data; - var levelsArr: RoleData[] = []; - res.forEach((levels: RoleData) => { - levelsArr.push({ - id: levels.id, - label: levels.name, - name: levels.name, - value: String(levels.id), - levelNumber: levels.levelNumber, - }); - }); - setRoleList(levelsArr); + const handleSuccess = () => { + router.push("/admin/management-user"); }; - async function getDataAdditional() { - const resEducations = await getListEducation(); - setUserEducations(resEducations?.data?.data); - const resSchools = await getListSchools(); - setUserSchools(resSchools?.data?.data); - const resCompetencies = await getListCompetencies(); - setUserCompetencies(resCompetencies?.data?.data); - } - - const roles = - levelName == "MABES POLRI" - ? [ - { - id: "ADM-ID", - name: "Admin", - }, - { - id: "EXE-ID", - name: "Eksekutif", - }, - { - id: "APP-ID", - name: "Approver", - }, - { - id: "CON-ID", - name: "Kontributor", - }, - { - id: "SPV-ID", - name: "Supervisor Feedback Center", - }, - { - id: "OPT-ID", - name: "Operator Feedback Center", - }, - { - id: "KKUR-ID", - name: "Koor Kurator", - }, - { - id: "KUR-ID", - name: "Kurator", - }, - ] - : [ - { - id: "APP-ID", - name: "Approver", - }, - { - id: "CON-ID", - name: "Kontributor", - }, - ]; - - async function save(data: z.infer) { - let req: any = { - firstName: data.fullname, - username: data.username, - roleId: data.role, - userLevelId: Number(data.level), - memberIdentity: data.nrp, - address: data.address, - email: data.email, - phoneNumber: data.phoneNumber, - password: data.password, - passwordConf: data.confirmPassword, - isDefault: false, - isAdmin: true, - }; - - if (data.role == "OPT-ID") { - req.handledSocialMedia = data?.sns ? data.sns.join(",") : ""; - } - - if (data.role == "KUR-ID") { - req.userEducationId = Number(data.education); - req.userSchoolsId = Number(data.school); - req.userCompetencyId = Number(data.competency); - } - - loading(); - const response = await saveUserInternal(req); - - if (response?.error) { - error(response.message); - return false; - } - - close(); - MySwal.fire({ - title: "Sukses", - icon: "success", - confirmButtonColor: "#3085d6", - confirmButtonText: "Oke", - }).then((result) => { - if (result.isConfirmed) { - router.push("/admin/management-user"); - } - }); - return false; - } - - async function onSubmit(data: z.infer) { - MySwal.fire({ - title: "Simpan Data?", - text: "", - icon: "warning", - showCancelButton: true, - cancelButtonColor: "#d33", - confirmButtonColor: "#3085d6", - confirmButtonText: "Simpan", - }).then((result) => { - if (result.isConfirmed) { - save(data); - } - }); - } + const handleCancel = () => { + router.push("/admin/management-user"); + }; return ( -
- -
- -

Data Pengelola Media Hub

- ( - - Pilih Level - - - - - - - - - - - No role found. - - {roleList.map((role) => ( - { - form.setValue("level", role.value); - }} - > - {role.label} - - - ))} - - - - - - - - )} - /> - ( - - Nama Lengkap - - - - - - - )} - /> - ( - - Username - - - - - - - )} - /> - - ( - - Role - - - {roles.map((role) => ( - - - - - - {role.name} - - - ))} - - - - - )} - /> - {selectedRole === "OPT-ID" && ( - ( - -
- Social Media Yang Ditangani -
-
- {sns.map((item) => ( - { - return ( - - - { - return checked - ? field.onChange([ - ...(field.value || []), - String(item.typeId), - ]) - : field.onChange( - (field.value || []).filter( - (value) => - value !== String(item.typeId) - ) - ); - }} - /> - - - {item.name} - - - ); - }} - /> - ))} -
- - -
- )} - /> - )} - - {selectedRole === "KUR-ID" && ( - <> - ( - - Pendidikan Terakhir - - - - - )} - /> - ( - - Universitas / Perguruan Tinggi - - - - - )} - /> - ( - - Kompetensi - - - - - )} - /> - - )} - ( - - Nomor Regitrasi Polri {`(NRP)`} - - - - - - - )} - /> - - ( - - Alamat - -