diff --git a/app/[locale]/(protected)/admin/add-experts/create/page.tsx b/app/[locale]/(protected)/admin/add-experts/create/page.tsx index 783be176..3612d814 100644 --- a/app/[locale]/(protected)/admin/add-experts/create/page.tsx +++ b/app/[locale]/(protected)/admin/add-experts/create/page.tsx @@ -23,27 +23,30 @@ import { SelectTrigger, SelectValue, } from "@/components/ui/select"; +import { useEffect, useState } from "react"; +import { AdministrationLevelList, getListCompetencies, getListExperiences, saveUserInternal, saveUserRolePlacements } from "@/service/management-user/management-user"; +import { loading } from "@/config/swal"; const FormSchema = z.object({ name: z.string({ required_error: "Required", }), + username: z.string({ + required_error: "Required", + }), + password: z.string({ + required_error: "Required", + }), phoneNumber: z.string({ required_error: "Required", }), email: z.string({ required_error: "Required", }), - position: z.string({ - required_error: "Required", - }), - region: z.string({ - required_error: "Required", - }), skills: z.string({ required_error: "Required", }), - experience: z.string({ + experiences: z.string({ required_error: "Required", }), company: z.string({ @@ -51,12 +54,34 @@ const FormSchema = z.object({ }), }); +export type Placements = { + index: number; + roleId?: string; + userLevelId?: number; +} + export default function AddExpertForm() { const MySwal = withReactContent(Swal); const router = useRouter(); const form = useForm>({ resolver: zodResolver(FormSchema), }); + const [incrementId, setIncrementId] = useState(1); + const [placementRows, setPlacementRows] = useState([{ index: 0, roleId: "", userLevelId: 0 }]); + const [userCompetencies, setUserCompetencies] = useState(); + const [userExperiences, setUserExperiences] = useState(); + const [userLevels, setUserLevels] = useState(); + + const roleSelection = [ + { + id: "11", + name: "Koor Kurator", + }, + { + id: "12", + name: "Kurator", + } + ]; const onSubmit = async (data: z.infer) => { MySwal.fire({ @@ -77,9 +102,85 @@ export default function AddExpertForm() { const save = async (data: z.infer) => { console.log("data", data); - // successSubmit(); + const dataReq = { + firstName: data.name, + username: data.username, + email: data.email, + password: data.password, + adress: "", + roleId: "EXP-ID", + phoneNumber: data.phoneNumber, + userCompetencyId: data.skills, + userExperienceId: data.experiences, + companyName: data.company, + } + + loading(); + const res = await saveUserInternal(dataReq); + const resData = res?.data?.data; + const userProfileId = resData.id; + + var placementArr: any[] = []; + placementRows.forEach((row: any) => { + placementArr.push({ + roleId: Number(row.roleId), + userLevelId: Number(row.userLevelId), + userProfileId: userProfileId, + }); + }); + + const dataReq2 = { + userId: userProfileId, + placements: placementArr + } + const res2 = await saveUserRolePlacements(dataReq2); + const resData2 = res2?.data?.data; + + success("/admin/add-experts"); }; + + function success(redirect: string): void { + MySwal.fire({ + title: '

Sukses

', + icon: "success", + confirmButtonColor: "#3085d6", + confirmButtonText: 'OK', + allowOutsideClick: false, + }).then((result) => { + if (result.isConfirmed) { + router.push(redirect); + } + }); + } + + useEffect(() => { + getDataAdditional(); + }, []); + + async function getDataAdditional() { + const resCompetencies = await getListCompetencies(); + setUserCompetencies(resCompetencies?.data?.data); + + const resExperiences = await getListExperiences(); + setUserExperiences(resExperiences?.data?.data); + + const resUserLevels = await AdministrationLevelList(); + const data = resUserLevels?.data?.data; + var levelsArr: any[] = []; + data.forEach((levels: any) => { + levelsArr.push({ + id: levels.id, + label: levels.name, + name: levels.name, + value: String(levels.id), + levelNumber: levels.levelNumber, + }); + }); + setUserLevels(levelsArr); + } + + function successSubmit() { MySwal.fire({ title: "Sukses", @@ -92,6 +193,29 @@ export default function AddExpertForm() { } }); } + + const handleSelectionChange = (index: number, type: "roleId" | "userLevelId", value: string) => { + setPlacementRows((prevRows) => + prevRows.map((row) => + row.index === index ? { ...row, [type]: value } : row + ) + ); + }; + + + const handleRemoveRow = (index: number) => { + console.log(index); + console.log(placementRows); + const newPlacements = placementRows.filter((row) => row.index != index); + console.log(newPlacements); + setPlacementRows(newPlacements); + }; + + const handleAddRow = () => { + setPlacementRows((prevRows: any) => [...prevRows, { index: incrementId, roleId: "", userLevelId: 0 }]); + setIncrementId((prevId) => prevId + 1); + }; + return (
@@ -118,6 +242,22 @@ export default function AddExpertForm() { )} /> + ( + + Username + + + + + )} + /> ( - Posisi - - - - - )} - /> - ( - - Wilayah - - + Password + )} @@ -208,19 +319,20 @@ export default function AddExpertForm() { - Komunikasi - Hukum - Bahasa + {userCompetencies?.map((item: any) => ( + + {item.name} + + ))} - - )} /> + ( Pengalaman @@ -231,15 +343,13 @@ export default function AddExpertForm() { - Akademisi - Praktisi - - Akademisi + Praktisi - + {userExperiences?.map((item: any) => ( + + {item.name} + + ))} - - )} /> @@ -261,6 +371,59 @@ export default function AddExpertForm() { )} /> +
+ Penempatan + {placementRows?.map((row: any) => ( +
+ + + {placementRows.length > 1 && ( + + )} +
+ ))} + +
+
diff --git a/components/partials/sidebar/common/team-workspace-switcher.tsx b/components/partials/sidebar/common/team-workspace-switcher.tsx new file mode 100644 index 00000000..1fd821f4 --- /dev/null +++ b/components/partials/sidebar/common/team-workspace-switcher.tsx @@ -0,0 +1,285 @@ +"use client" + +import * as React from "react" +import { ChevronsUpDown, Check, CirclePlus } from 'lucide-react'; + +import { cn, getCookiesDecrypt } from "@/lib/utils" +import { + Avatar, + AvatarFallback, + AvatarImage, +} from "@/components/ui/avatar" +import { Button } from "@/components/ui/button" +import { + Command, + CommandEmpty, + CommandGroup, + CommandInput, + CommandItem, + CommandList, + CommandSeparator, +} from "@/components/ui/command" +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "@/components/ui/dialog" +import { Input } from "@/components/ui/input" +import { Label } from "@/components/ui/label" +import { + Popover, + PopoverContent, + PopoverTrigger, +} from "@/components/ui/popover" +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select" +import { useConfig } from "@/hooks/use-config"; +import { useMediaQuery } from "@/hooks/use-media-query"; +import { motion, AnimatePresence } from "framer-motion"; +import { useMenuHoverConfig } from "@/hooks/use-menu-hover"; +import { getInfoProfile } from "@/service/auth"; +import { getUserRolePlacements, saveUserRolePlacements } from "@/service/management-user/management-user"; + +// var groups = [ +// { +// label: "Wilayah Tugas", +// teams: [], +// }, +// ] + +// type Team = (typeof groups)[number]["teams"][number] + +type PopoverTriggerProps = React.ComponentPropsWithoutRef + +interface TeamSwitcherProps extends PopoverTriggerProps { } + +const scaleVariants = { + collapsed: { scale: 0.8 }, + expanded: { scale: 1 } +}; + +export default function TeamWorkspaceSwitcher({ className }: TeamSwitcherProps) { + const [config] = useConfig(); + const [hoverConfig] = useMenuHoverConfig(); + const { hovered } = hoverConfig; + const [detail, setDetail] = React.useState(); + const userId = getCookiesDecrypt("uie"); + const [open, setOpen] = React.useState(false); + const [showNewTeamDialog, setShowNewTeamDialog] = React.useState(false); + const [groups, setGroups] = React.useState() + const [selectedTeam, setSelectedTeam] = React.useState({ label: "", value: "" }); + const isDesktop = useMediaQuery("(min-width: 1280px)") + if (config.showSwitcher === false || config.sidebar === 'compact') return null + + React.useEffect(() => { + async function initState() { + const response = await getInfoProfile(); + const details = response?.data?.data; + + setDetail(details); + console.log("data", details); + } + + async function getPlacement() { + const response = await getUserRolePlacements(Number(userId)); + const data = response?.data?.data; + + var placementArr: any[] = []; + data?.forEach((row: any) => { + placementArr.push({ + label: row.roleName + " | " + row.userLevelName, + value: Number(row.id), + }); + }); + const groupsTemp = [ + { + label: "Wilayah Tugas", + teams: placementArr, + } + ]; + setGroups(groupsTemp); + } + + initState(); + getPlacement(); + }, []); + + + return ( + + + + + + + + + + {(config.collapsed && !hovered) ? : } + + + + + + + + No team found. + {groups?.map((group: any) => ( + + {group.teams.map((team: any) => ( + { + setSelectedTeam(team) + setOpen(false) + }} + className="text-sm font-normal" + > + + {team.label} + + + ))} + + ))} + + {/* */} + {/* + + + { + setOpen(false) + setShowNewTeamDialog(true) + }} + > + + Create Team + + + + */} + + + + + + Create team + + Add a new team to manage products and customers. + + +
+
+
+ + +
+
+ + +
+
+
+ + + + +
+
+ ) +} diff --git a/components/partials/sidebar/menu/menu-classic.tsx b/components/partials/sidebar/menu/menu-classic.tsx index 4fdae2b2..b371b9ed 100644 --- a/components/partials/sidebar/menu/menu-classic.tsx +++ b/components/partials/sidebar/menu/menu-classic.tsx @@ -3,7 +3,7 @@ import React from 'react' import { Ellipsis, LogOut } from "lucide-react"; import { usePathname } from "@/components/navigation"; -import { cn } from "@/lib/utils"; +import { cn, getCookiesDecrypt } from "@/lib/utils"; import { getMenuList } from "@/lib/menus"; import { ScrollArea } from "@/components/ui/scroll-area"; import { @@ -26,6 +26,7 @@ import Logo from '@/components/logo'; import SidebarHoverToggle from '@/components/partials/sidebar/sidebar-hover-toggle'; import { useMenuHoverConfig } from '@/hooks/use-menu-hover'; import { useMediaQuery } from '@/hooks/use-media-query'; +import TeamWorkspaceSwitcher from '../common/team-workspace-switcher'; export function MenuClassic({ }) { @@ -36,7 +37,7 @@ export function MenuClassic({ }) { const direction = getLangDir(params?.locale ?? ''); const isDesktop = useMediaQuery('(min-width: 1280px)') - + const userRoleId = getCookiesDecrypt("urie"); const menuList = getMenuList(pathname, t); const [config, setConfig] = useConfig() @@ -71,17 +72,16 @@ export function MenuClassic({ }) { - {/* {isDesktop && ( + {isDesktop && Number(userRoleId) == 19 ? (
- - - + + {/* */}
- )} */} + ) : ""}