diff --git a/Dockerfile b/Dockerfile index 1d64af49..53296033 100644 --- a/Dockerfile +++ b/Dockerfile @@ -17,7 +17,8 @@ COPY package.json pnpm-lock.yaml ./ COPY vendor/ckeditor5 ./vendor/ckeditor5 # Install dependencies -RUN pnpm install --frozen-lockfile +RUN pnpm install +# RUN pnpm install --frozen-lockfile # Menyalin source code aplikasi COPY . . diff --git a/app/[locale]/(protected)/admin/add-experts/component/column.tsx b/app/[locale]/(protected)/admin/add-experts/component/column.tsx index 37b97cab..309e8f46 100644 --- a/app/[locale]/(protected)/admin/add-experts/component/column.tsx +++ b/app/[locale]/(protected)/admin/add-experts/component/column.tsx @@ -61,6 +61,12 @@ const columns: ColumnDef[] = [ cell: ({ row }) => {row.getValue("experience")}, }, + { + accessorKey: "experience", + header: "Posisi", + cell: ({ row }) => {row.getValue("experience")}, + }, + { id: "actions", accessorKey: "action", diff --git a/app/[locale]/(protected)/admin/add-experts/create/page.tsx b/app/[locale]/(protected)/admin/add-experts/create/page.tsx index 3612d814..8c908a52 100644 --- a/app/[locale]/(protected)/admin/add-experts/create/page.tsx +++ b/app/[locale]/(protected)/admin/add-experts/create/page.tsx @@ -24,7 +24,13 @@ import { SelectValue, } from "@/components/ui/select"; import { useEffect, useState } from "react"; -import { AdministrationLevelList, getListCompetencies, getListExperiences, saveUserInternal, saveUserRolePlacements } from "@/service/management-user/management-user"; +import { + AdministrationLevelList, + getListCompetencies, + getListExperiences, + saveUserInternal, + saveUserRolePlacements, +} from "@/service/management-user/management-user"; import { loading } from "@/config/swal"; const FormSchema = z.object({ @@ -58,7 +64,7 @@ export type Placements = { index: number; roleId?: string; userLevelId?: number; -} +}; export default function AddExpertForm() { const MySwal = withReactContent(Swal); @@ -67,7 +73,9 @@ export default function AddExpertForm() { resolver: zodResolver(FormSchema), }); const [incrementId, setIncrementId] = useState(1); - const [placementRows, setPlacementRows] = useState([{ index: 0, roleId: "", userLevelId: 0 }]); + const [placementRows, setPlacementRows] = useState([ + { index: 0, roleId: "", userLevelId: 0 }, + ]); const [userCompetencies, setUserCompetencies] = useState(); const [userExperiences, setUserExperiences] = useState(); const [userLevels, setUserLevels] = useState(); @@ -80,7 +88,7 @@ export default function AddExpertForm() { { id: "12", name: "Kurator", - } + }, ]; const onSubmit = async (data: z.infer) => { @@ -113,12 +121,12 @@ export default function AddExpertForm() { userCompetencyId: data.skills, userExperienceId: data.experiences, companyName: data.company, - } + }; loading(); const res = await saveUserInternal(dataReq); const resData = res?.data?.data; - const userProfileId = resData.id; + const userProfileId = resData?.id; var placementArr: any[] = []; placementRows.forEach((row: any) => { @@ -131,15 +139,14 @@ export default function AddExpertForm() { const dataReq2 = { userId: userProfileId, - placements: placementArr - } + 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

', @@ -180,7 +187,6 @@ export default function AddExpertForm() { setUserLevels(levelsArr); } - function successSubmit() { MySwal.fire({ title: "Sukses", @@ -194,7 +200,11 @@ export default function AddExpertForm() { }); } - const handleSelectionChange = (index: number, type: "roleId" | "userLevelId", value: string) => { + const handleSelectionChange = ( + index: number, + type: "roleId" | "userLevelId", + value: string + ) => { setPlacementRows((prevRows) => prevRows.map((row) => row.index === index ? { ...row, [type]: value } : row @@ -202,7 +212,6 @@ export default function AddExpertForm() { ); }; - const handleRemoveRow = (index: number) => { console.log(index); console.log(placementRows); @@ -212,7 +221,10 @@ export default function AddExpertForm() { }; const handleAddRow = () => { - setPlacementRows((prevRows: any) => [...prevRows, { index: incrementId, roleId: "", userLevelId: 0 }]); + setPlacementRows((prevRows: any) => [ + ...prevRows, + { index: incrementId, roleId: "", userLevelId: 0 }, + ]); setIncrementId((prevId) => prevId + 1); }; @@ -372,10 +384,14 @@ export default function AddExpertForm() { />
- Penempatan + Posisi {placementRows?.map((row: any) => (
- + handleSelectionChange(row.index, "roleId", e) + } + > @@ -389,7 +405,11 @@ export default function AddExpertForm() { ))} - + handleSelectionChange(row.index, "userLevelId", e) + } + > @@ -415,11 +435,7 @@ export default function AddExpertForm() { )}
))} -
diff --git a/app/[locale]/(protected)/admin/analysis/content-management/page.tsx b/app/[locale]/(protected)/admin/analysis/content-management/page.tsx index a278e85c..62fe0ab0 100644 --- a/app/[locale]/(protected)/admin/analysis/content-management/page.tsx +++ b/app/[locale]/(protected)/admin/analysis/content-management/page.tsx @@ -43,8 +43,8 @@ export default function ContentManagement() { const [ticket6, setTicket6] = useState(""); const [isInternational, setIsInternational] = useState([false, false, false]); - const baseUrl = "https://db-mediahub.polri.go.id/"; - const url = "https://db-mediahub.polri.go.id/trusted/"; + const baseUrl = "https://analytic.sitani.info/"; + const url = "https://analytic.sitani.info/trusted/"; const view1 = levelName == "MABES POLRI" diff --git a/app/[locale]/(protected)/admin/analysis/emergency-issue/page.tsx b/app/[locale]/(protected)/admin/analysis/emergency-issue/page.tsx index 9fd67f21..7ccb7c31 100644 --- a/app/[locale]/(protected)/admin/analysis/emergency-issue/page.tsx +++ b/app/[locale]/(protected)/admin/analysis/emergency-issue/page.tsx @@ -43,8 +43,8 @@ export default function EmergencyIssue() { const [ticket6, setTicket6] = useState(""); const [isInternational, setIsInternational] = useState([false, false, false]); - const baseUrl = "https://db-mediahub.polri.go.id/"; - const url = "https://db-mediahub.polri.go.id/trusted/"; + const baseUrl = "https://analytic.sitani.info/"; + const url = "https://analytic.sitani.info/trusted/"; const view1 = levelName == "MABES POLRI" diff --git a/app/[locale]/(protected)/admin/analysis/feedback-center/page.tsx b/app/[locale]/(protected)/admin/analysis/feedback-center/page.tsx index 1e0b0fcc..1ccb475e 100644 --- a/app/[locale]/(protected)/admin/analysis/feedback-center/page.tsx +++ b/app/[locale]/(protected)/admin/analysis/feedback-center/page.tsx @@ -43,8 +43,8 @@ export default function FeedbackCenter() { const [ticket6, setTicket6] = useState(""); const [isInternational, setIsInternational] = useState([false, false, false]); - const baseUrl = "https://db-mediahub.polri.go.id/"; - const url = "https://db-mediahub.polri.go.id/trusted/"; + const baseUrl = "https://analytic.sitani.info/"; + const url = "https://analytic.sitani.info/trusted/"; const view1 = levelName == "MABES POLRI" diff --git a/app/[locale]/(protected)/admin/analysis/schedule/page.tsx b/app/[locale]/(protected)/admin/analysis/schedule/page.tsx index 342c2298..5e51bc33 100644 --- a/app/[locale]/(protected)/admin/analysis/schedule/page.tsx +++ b/app/[locale]/(protected)/admin/analysis/schedule/page.tsx @@ -38,8 +38,8 @@ export default function ContentManagement() { const [ticket6, setTicket6] = useState(""); const [isInternational, setIsInternational] = useState([false, false, false]); - const baseUrl = "https://db-mediahub.polri.go.id/"; - const url = "https://db-mediahub.polri.go.id/trusted/"; + const baseUrl = "https://analytic.sitani.info/"; + const url = "https://analytic.sitani.info/trusted/"; const view1 = levelName == "MABES POLRI" diff --git a/app/[locale]/(protected)/admin/management-user/page.tsx b/app/[locale]/(protected)/admin/management-user/page.tsx index ff0e82fa..a3692b2a 100644 --- a/app/[locale]/(protected)/admin/management-user/page.tsx +++ b/app/[locale]/(protected)/admin/management-user/page.tsx @@ -2,20 +2,33 @@ import SiteBreadcrumb from "@/components/site-breadcrumb"; import UserExternalTable from "@/components/table/management-user/management-user-external-table"; import UserInternalTable from "@/components/table/management-user/management-user-internal-table"; -import InternalTable from "@/components/table/management-user/management-user-internal-table"; import { Button } from "@/components/ui/button"; -import DashboardVisualization from "@/components/visualization/dashboard-viz"; import ManagementUserVisualization from "@/components/visualization/management-user-viz"; import { Link, useRouter } from "@/i18n/routing"; import { PlusIcon } from "lucide-react"; import { useEffect, useState } from "react"; +import Cookies from "js-cookie"; +import { getCookiesDecrypt } from "@/lib/utils"; export default function ManagementUser() { const [isInternal, setIsInternal] = useState(true); + const [levelNumber, setLevelNumber] = useState(null); const router = useRouter(); + + useEffect(() => { + const encryptedLevel = Cookies.get("ulne"); + if (encryptedLevel) { + const decryptedLevel = getCookiesDecrypt("ulne"); + setLevelNumber(Number(decryptedLevel)); + } + }, []); + useEffect(() => { router.push("?page=1"); }, [isInternal]); + + const showExternalButton = levelNumber !== 2 && levelNumber !== 3; + return (
@@ -23,10 +36,7 @@ export default function ManagementUser() { -
+

Data User {isInternal ? "Internal" : "Eksternal"} @@ -40,28 +50,31 @@ export default function ManagementUser() { )}

+
- + + {showExternalButton && ( + + )}
+ {isInternal ? : }
diff --git a/app/[locale]/(protected)/admin/settings/category/component/create.tsx b/app/[locale]/(protected)/admin/settings/category/component/create.tsx index 73fe6478..afd65cd9 100644 --- a/app/[locale]/(protected)/admin/settings/category/component/create.tsx +++ b/app/[locale]/(protected)/admin/settings/category/component/create.tsx @@ -243,7 +243,10 @@ export default function CreateCategoryModal() { {t("add-category")} - + {t("add-category")} diff --git a/app/[locale]/(protected)/admin/survey/component/column.tsx b/app/[locale]/(protected)/admin/survey/component/column.tsx new file mode 100644 index 00000000..dfbf1b9e --- /dev/null +++ b/app/[locale]/(protected)/admin/survey/component/column.tsx @@ -0,0 +1,103 @@ +import * as React from "react"; +import { ColumnDef } from "@tanstack/react-table"; + +import { Eye, MoreVertical, SquarePen, Trash2 } from "lucide-react"; +import { cn } from "@/lib/utils"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuTrigger, + DropdownMenuItem, +} from "@/components/ui/dropdown-menu"; +import { Button } from "@/components/ui/button"; +import { Badge } from "@/components/ui/badge"; + +import { Link, useRouter } from "@/i18n/routing"; + +const columns: ColumnDef[] = [ + { + accessorKey: "no", + header: "No", + cell: ({ row }) => {row.getValue("no")}, + }, + { + accessorKey: "createdAt", + header: "Tanggal", + cell: ({ row }) => ( + {row.getValue("createdAt")} + ), + }, + { + accessorKey: "account-type", + header: "Jenis Akun", + cell: ({ row }) => ( + {row.getValue("account-type")} + ), + }, + { + accessorKey: "userName", + header: "UserName", + cell: ({ row }) => ( + {row.getValue("userName")} + ), + }, + { + accessorKey: "accessMediahub", + header: "Akses Mediahub", + cell: ({ row }) => ( + {row.getValue("accessMediahub")} + ), + }, + { + accessorKey: "desaignWeb", + header: "Tampilan Desain Web", + cell: ({ row }) => ( + {row.getValue("desaignWeb")} + ), + }, + { + accessorKey: "navigation", + header: "Kemudahan Navigasi", + cell: ({ row }) => ( + {row.getValue("navigation")} + ), + }, + { + accessorKey: "fastAccess", + header: "Kecepatan Akses", + cell: ({ row }) => ( + {row.getValue("fastAccess")} + ), + }, + { + id: "actions", + accessorKey: "action", + header: "Actions", + enableHiding: false, + cell: ({ row }) => { + return ( + + + + + + + + Detail + + + + + ); + }, + }, +]; + +export default columns; diff --git a/app/[locale]/(protected)/admin/survey/component/table.tsx b/app/[locale]/(protected)/admin/survey/component/table.tsx new file mode 100644 index 00000000..a6efa990 --- /dev/null +++ b/app/[locale]/(protected)/admin/survey/component/table.tsx @@ -0,0 +1,346 @@ +"use client"; + +import * as React from "react"; +import { + ColumnDef, + ColumnFiltersState, + PaginationState, + SortingState, + VisibilityState, + flexRender, + getCoreRowModel, + getFilteredRowModel, + getPaginationRowModel, + getSortedRowModel, + useReactTable, +} from "@tanstack/react-table"; +import { Button } from "@/components/ui/button"; + +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/components/ui/table"; +import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; +import { + ChevronLeft, + ChevronRight, + Eye, + MoreVertical, + Search, + SquarePen, + Trash2, + TrendingDown, + TrendingUp, + UserIcon, +} from "lucide-react"; +import { cn } from "@/lib/utils"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuRadioGroup, + DropdownMenuRadioItem, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; +import { Input } from "@/components/ui/input"; +import { InputGroup, InputGroupText } from "@/components/ui/input-group"; +import { paginationBlog } from "@/service/blog/blog"; +import { ticketingPagination } from "@/service/ticketing/ticketing"; +import { Badge } from "@/components/ui/badge"; +import { useRouter, useSearchParams } from "next/navigation"; +import TablePagination from "@/components/table/table-pagination"; +import columns from "./column"; +import { getPlanningPagination } from "@/service/agenda-setting/agenda-setting"; +import { + Popover, + PopoverContent, + PopoverTrigger, +} from "@/components/ui/popover"; +import { + getMediaBlastCampaignPage, + listDataMedia, +} from "@/service/broadcast/broadcast"; +import { listEnableCategory } from "@/service/content/content"; +import { Checkbox } from "@/components/ui/checkbox"; +import { close, loading } from "@/config/swal"; +import { Link } from "@/i18n/routing"; +import { NewCampaignIcon } from "@/components/icon"; +import search from "../../../app/chat/components/search"; +import { + Select, + SelectContent, + SelectGroup, + SelectItem, + SelectLabel, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; +import { Card, CardContent } from "@/components/ui/card"; +import { + Bar, + BarChart, + CartesianGrid, + Label, + ResponsiveContainer, + Tooltip, + XAxis, + YAxis, +} from "recharts"; + +const data = [ + { + question: "Seberapa Sering User Mengakses\nMediaHub Polri", + total: 100, + }, + { + question: "Tampilan dan Desain pada Website\nMediaHub Polri", + total: 90, + }, + { + question: "Kemudahan Navigasi pada Website\nMediaHub Polri", + total: 80, + }, + { + question: "Kecepatan Akses pada Website\nMediaHub Polri", + total: 70, + }, + { + question: + "Seberapa Akurat dan Terpercaya\nInformasi pada Website MediaHub Polri", + total: 60, + }, + { + question: + "Seberapa Lengkap Informasi dan Berita\npada Website MediaHub Polri", + total: 55, + }, + { + question: "Seberapa membantu dalam\nmendapatkan Informasi terkait Polri", + total: 52, + }, +]; + +const SurveyListTable = () => { + const router = useRouter(); + const searchParams = useSearchParams(); + const [dataTable, setDataTable] = React.useState([]); + const [totalData, setTotalData] = React.useState(1); + const [search, setSearch] = React.useState(""); + const [showData, setShowData] = React.useState("polri"); + const [startDate, setStartDate] = React.useState(""); + const [sorting, setSorting] = React.useState([]); + const [columnFilters, setColumnFilters] = React.useState( + [] + ); + const [columnVisibility, setColumnVisibility] = + React.useState({}); + const [rowSelection, setRowSelection] = React.useState({}); + const [pagination, setPagination] = React.useState({ + pageIndex: 0, + pageSize: 10, + }); + + const [page, setPage] = React.useState(1); + const [totalPage, setTotalPage] = React.useState(1); + const table = useReactTable({ + data: dataTable, + columns, + onSortingChange: setSorting, + onColumnFiltersChange: setColumnFilters, + getCoreRowModel: getCoreRowModel(), + getPaginationRowModel: getPaginationRowModel(), + getSortedRowModel: getSortedRowModel(), + getFilteredRowModel: getFilteredRowModel(), + onColumnVisibilityChange: setColumnVisibility, + onRowSelectionChange: setRowSelection, + onPaginationChange: setPagination, + state: { + sorting, + columnFilters, + columnVisibility, + rowSelection, + pagination, + }, + }); + + React.useEffect(() => { + const pageFromUrl = searchParams?.get("page"); + if (pageFromUrl) { + setPage(Number(pageFromUrl)); + } + }, [searchParams]); + + React.useEffect(() => { + fetchData(); + }, [page]); + + async function fetchData() { + try { + loading(); + const res = await getMediaBlastCampaignPage(page - 1); + const data = res?.data?.data; + const contentData = data?.content; + contentData.forEach((item: any, index: number) => { + item.no = (page - 1) * 10 + index + 1; + }); + + console.log("contentData : ", data); + + setDataTable(contentData); + setTotalData(data?.totalElements); + setTotalPage(data?.totalPages); + close(); + } catch (error) { + console.error("Error fetching tasks:", error); + } + } + + const handleSearch = (e: React.ChangeEvent) => { + setSearch(e.target.value); // Perbarui state search + table.getColumn("judul")?.setFilterValue(e.target.value); // Set filter tabel + }; + + return ( +
+
Survey
+
+
+ + + + + + +
+
+
+ setStartDate(e.target.value)} + className="max-w-sm" + /> +
+
+ +
+
+
+
+

+ Survei Kepuasan Pengguna MediaHub Polri +

+ + + + + + + value.length > 40 ? value.slice(0, 37) + "..." : value + } // Atur potong teks panjang, atau hapus kalau mau tampil semua + > + + + + + +
+ + + + {table.getHeaderGroups().map((headerGroup) => ( + + {headerGroup.headers.map((header) => ( + + {header.isPlaceholder + ? null + : flexRender( + header.column.columnDef.header, + header.getContext() + )} + + ))} + + ))} + + + {table.getRowModel().rows?.length ? ( + table.getRowModel().rows.map((row) => ( + + {row.getVisibleCells().map((cell) => ( + + {flexRender(cell.column.columnDef.cell, cell.getContext())} + + ))} + + )) + ) : ( + + + No results. + + + )} + +
+ +
+ ); +}; + +export default SurveyListTable; diff --git a/app/[locale]/(protected)/admin/survey/page.tsx b/app/[locale]/(protected)/admin/survey/page.tsx new file mode 100644 index 00000000..0f7d981f --- /dev/null +++ b/app/[locale]/(protected)/admin/survey/page.tsx @@ -0,0 +1,18 @@ +"use client"; +import SiteBreadcrumb from "@/components/site-breadcrumb"; +import { useState } from "react"; +import { Link } from "@/i18n/routing"; +import { Button } from "@/components/ui/button"; +import SurveyListTable from "./component/table"; + +export default function AdminSurvey() { + const [tab, setTab] = useState("Email Blast"); + return ( +
+ +
+ +
+
+ ); +} diff --git a/app/[locale]/(protected)/contributor/agenda-setting/calender-view.tsx b/app/[locale]/(protected)/contributor/agenda-setting/calender-view.tsx index 7068813f..7a63a970 100644 --- a/app/[locale]/(protected)/contributor/agenda-setting/calender-view.tsx +++ b/app/[locale]/(protected)/contributor/agenda-setting/calender-view.tsx @@ -581,7 +581,7 @@ const CalendarView = ({ categories }: CalendarViewProps) => { {roleId == 3 || roleId == 11 || roleId == 2 || roleId == 12 ? ( ) : null} diff --git a/app/[locale]/(protected)/contributor/agenda-setting/event-modal.tsx b/app/[locale]/(protected)/contributor/agenda-setting/event-modal.tsx index f69da9a3..b65789cb 100644 --- a/app/[locale]/(protected)/contributor/agenda-setting/event-modal.tsx +++ b/app/[locale]/(protected)/contributor/agenda-setting/event-modal.tsx @@ -775,7 +775,7 @@ const EventModal = ({ checked={wilayahPublish.semua} onCheckedChange={() => toggleWilayah("semua")} /> -