diff --git a/app/[locale]/(protected)/admin/add-experts/create/page.tsx b/app/[locale]/(protected)/admin/add-experts/create/page.tsx index abc66bc2..783be176 100644 --- a/app/[locale]/(protected)/admin/add-experts/create/page.tsx +++ b/app/[locale]/(protected)/admin/add-experts/create/page.tsx @@ -34,6 +34,9 @@ const FormSchema = z.object({ email: z.string({ required_error: "Required", }), + position: z.string({ + required_error: "Required", + }), region: z.string({ required_error: "Required", }), @@ -147,7 +150,28 @@ export default function AddExpertForm() { )} /> + ( + + Posisi + + + + )} + /> [] = [ + { + accessorKey: "no", + header: "No", + cell: ({ row }) => {row.getValue("no")}, + }, + + { + accessorKey: "title", + header: "Judul", + cell: ({ row }) => {row.getValue("title")}, + }, + { + accessorKey: "fileTypeName", + header: "Konten", + cell: ({ row }) => {row.getValue("fileTypeName")}, + }, + { + accessorKey: "categoryName", + header: "Kategori", + cell: ({ row }) => {row.getValue("categoryName")}, + }, + { + accessorKey: "createdAt", + header: "Tanggal Unggah", + cell: ({ row }) => ( + {formatDateToIndonesian(row.getValue("createdAt"))} + ), + }, + + { + accessorKey: "statusName", + header: "Status", + cell: ({ row }) => {row.getValue("statusName")}, + }, + + { + id: "actions", + accessorKey: "action", + header: "Actions", + enableHiding: false, + cell: ({ row }) => { + return ( + + + + + + + + Detail + + + + + Email Blast + + + + + Whatsapp Blast + + + + + ); + }, + }, +]; + +export default columns; diff --git a/app/[locale]/(protected)/admin/broadcast/component/table.tsx b/app/[locale]/(protected)/admin/broadcast/email/component/table.tsx similarity index 97% rename from app/[locale]/(protected)/admin/broadcast/component/table.tsx rename to app/[locale]/(protected)/admin/broadcast/email/component/table.tsx index 6d7fcc2d..151b650e 100644 --- a/app/[locale]/(protected)/admin/broadcast/component/table.tsx +++ b/app/[locale]/(protected)/admin/broadcast/email/component/table.tsx @@ -60,13 +60,16 @@ import { PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; -import { listDataMedia } from "@/service/broadcast/broadcast"; +import { + listDataMedia, + listDataMediaBroadCast, +} 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"; -const BroadcastTable = () => { +const BroadcastEmailTable = () => { const router = useRouter(); const searchParams = useSearchParams(); const [search, setSearch] = React.useState(""); @@ -144,7 +147,7 @@ const BroadcastTable = () => { async function fetchData() { try { loading(); - const res = await listDataMedia( + const res = await listDataMediaBroadCast( page - 1, showData, search, @@ -202,17 +205,13 @@ const BroadcastTable = () => { return (
-
-

Brodcast

- +
+ -
- -
{ ); }; -export default BroadcastTable; +export default BroadcastEmailTable; diff --git a/app/[locale]/(protected)/admin/broadcast/page.tsx b/app/[locale]/(protected)/admin/broadcast/page.tsx index dcd756ee..d3dd5505 100644 --- a/app/[locale]/(protected)/admin/broadcast/page.tsx +++ b/app/[locale]/(protected)/admin/broadcast/page.tsx @@ -1,11 +1,51 @@ +"use client"; import SiteBreadcrumb from "@/components/site-breadcrumb"; -import BroadcastTable from "./component/table"; +import BroadcastTable from "./email/component/table"; +import { PlusIcon } from "lucide-react"; + +import EscalationTable from "../../shared/communication/escalation/components/escalation-table"; +import InternalTable from "../../shared/communication/internal/components/internal-table"; +import { useState } from "react"; +import { Link } from "@/i18n/routing"; +import { Button } from "@/components/ui/button"; +import BroadcastEmailTable from "./email/component/table"; +import BroadcastWhatsAppTable from "./whatsapp/component/table"; export default function AdminBroadcast() { + const [tab, setTab] = useState("Email Blast"); return (
- +
+
+ + +
+ {tab === "Email Blast" && } + {tab === "WhatsApp Blast" && } +
); } diff --git a/app/[locale]/(protected)/admin/broadcast/component/column.tsx b/app/[locale]/(protected)/admin/broadcast/whatsapp/component/column.tsx similarity index 100% rename from app/[locale]/(protected)/admin/broadcast/component/column.tsx rename to app/[locale]/(protected)/admin/broadcast/whatsapp/component/column.tsx diff --git a/app/[locale]/(protected)/admin/broadcast/whatsapp/component/table.tsx b/app/[locale]/(protected)/admin/broadcast/whatsapp/component/table.tsx new file mode 100644 index 00000000..0c6b79ab --- /dev/null +++ b/app/[locale]/(protected)/admin/broadcast/whatsapp/component/table.tsx @@ -0,0 +1,403 @@ +"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 { + listDataMedia, + listDataMediaBroadCast, +} 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"; + +const BroadcastWhatsAppTable = () => { + const router = useRouter(); + const searchParams = useSearchParams(); + const [search, setSearch] = React.useState(""); + const [showData, setShowData] = React.useState("10"); + const [categories, setCategories] = React.useState(); + const [dataTable, setDataTable] = React.useState([]); + const [totalData, setTotalData] = React.useState(1); + 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: Number(showData), + }); + const [categoryFilter, setCategoryFilter] = React.useState([]); + const [statusFilter, setStatusFilter] = React.useState([]); + 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, + }, + }); + + let typingTimer: any; + const doneTypingInterval = 1500; + + const handleKeyUp = () => { + clearTimeout(typingTimer); + typingTimer = setTimeout(doneTyping, doneTypingInterval); + }; + + const handleKeyDown = () => { + clearTimeout(typingTimer); + }; + + async function doneTyping() { + fetchData(); + } + + React.useEffect(() => { + const pageFromUrl = searchParams?.get("page"); + if (pageFromUrl) { + setPage(Number(pageFromUrl)); + } + }, [searchParams]); + + React.useEffect(() => { + fetchData(); + setPagination({ + pageIndex: 0, + pageSize: Number(showData), + }); + }, [page, showData]); + + async function fetchData() { + try { + loading(); + const res = await listDataMediaBroadCast( + page - 1, + showData, + search, + categoryFilter?.sort().join(","), + statusFilter?.sort().join(",") + ); + const data = res?.data?.data; + const contentData = data?.content; + contentData.forEach((item: any, index: number) => { + item.no = (page - 1) * Number(showData) + index + 1; + }); + + console.log("contentData : ", data); + + setDataTable(contentData); + setTotalData(data?.totalElements); + setTotalPage(data?.totalPages); + close(); + } catch (error) { + console.error("Error fetching tasks:", error); + } + } + + React.useEffect(() => { + getCategories(); + }, []); + + async function getCategories() { + const category = await listEnableCategory(""); + const resCategory = category?.data?.data?.content; + setCategories(resCategory); + } + + const handleChange = (type: string, id: number, checked: boolean) => { + if (type === "category") { + if (checked) { + const temp: number[] = [...categoryFilter]; + temp.push(id); + setCategoryFilter(temp); + } else { + const temp = categoryFilter.filter((a) => a !== id); + setCategoryFilter(temp); + } + } else { + if (checked) { + const temp: number[] = [...statusFilter]; + temp.push(id); + setStatusFilter(temp); + } else { + const temp = statusFilter.filter((a) => a !== id); + setStatusFilter(temp); + } + } + }; + + return ( +
+
+ + + + setSearch(e.target.value)} + className="max-w-[300px]" + /> +
+ + + + + + + + 1 - 10 Data + + + 1 - 20 Data + + + 1 - 25 Data + + + 1 - 50 Data + + + + + + + + + +
+ +
+

Kategory

+ {categories?.map((category: any) => ( +
+ + handleChange("category", category.id, Boolean(e)) + } + /> + +
+ ))} +

Status

+
+ + handleChange("status", 1, Boolean(e)) + } + /> + +
+
+ + handleChange("status", 2, Boolean(e)) + } + /> + +
+
+ + handleChange("status", 3, Boolean(e)) + } + /> + +
+
+ + handleChange("status", 4, Boolean(e)) + } + /> + +
+
+
+
+
+
+
+ + + {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 BroadcastWhatsAppTable; diff --git a/app/[locale]/(protected)/admin/management-user/internal/create/page.tsx b/app/[locale]/(protected)/admin/management-user/internal/create/page.tsx index c89159eb..34b6b2d5 100644 --- a/app/[locale]/(protected)/admin/management-user/internal/create/page.tsx +++ b/app/[locale]/(protected)/admin/management-user/internal/create/page.tsx @@ -232,6 +232,10 @@ export default function CreateUserForm() { id: "ADM-ID", name: "Admin", }, + { + id: "EXE-ID", + name: "Eksekutif", + }, { id: "APP-ID", name: "Approver", diff --git a/app/[locale]/(protected)/admin/media-tracking/media-online/component/column.tsx b/app/[locale]/(protected)/admin/media-tracking/media-online/component/column.tsx new file mode 100644 index 00000000..36024514 --- /dev/null +++ b/app/[locale]/(protected)/admin/media-tracking/media-online/component/column.tsx @@ -0,0 +1,54 @@ +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 { + formatDateToIndonesian, + getOnlyDate, + htmlToString, +} from "@/utils/globals"; +import { Link, useRouter } from "@/i18n/routing"; +import { + Accordion, + AccordionContent, + AccordionItem, + AccordionTrigger, +} from "@/components/ui/accordion"; +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "@/components/ui/dialog"; +import { Collapsible, CollapsibleContent } from "@/components/ui/collapsible"; + +const columns: ColumnDef[] = [ + { + accessorKey: "no", + header: "No", + cell: ({ row }) => {row.getValue("no")}, + }, + + { + accessorKey: "title", + header: "Nama Media Online", + cell: ({ row }) => {row.getValue("title")}, + }, + { + accessorKey: "link", + header: "Link", + cell: ({ row }) => {row.getValue("categoryName")}, + }, +]; + +export default columns; diff --git a/app/[locale]/(protected)/admin/media-tracking/media-online/component/table.tsx b/app/[locale]/(protected)/admin/media-tracking/media-online/component/table.tsx new file mode 100644 index 00000000..28c87044 --- /dev/null +++ b/app/[locale]/(protected)/admin/media-tracking/media-online/component/table.tsx @@ -0,0 +1,302 @@ +"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 { 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"; + +const MediaOnlineTable = () => { + const router = useRouter(); + const searchParams = useSearchParams(); + const [search, setSearch] = React.useState(""); + const [showData, setShowData] = React.useState("10"); + const [categories, setCategories] = React.useState(); + const [dataTable, setDataTable] = React.useState([]); + const [totalData, setTotalData] = React.useState(1); + 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: Number(showData), + }); + const [categoryFilter, setCategoryFilter] = React.useState([]); + const [statusFilter, setStatusFilter] = React.useState([]); + 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, + }, + }); + + let typingTimer: any; + const doneTypingInterval = 1500; + + // const handleKeyUp = () => { + // clearTimeout(typingTimer); + // typingTimer = setTimeout(doneTyping, doneTypingInterval); + // }; + + const handleKeyDown = () => { + clearTimeout(typingTimer); + }; + + // async function doneTyping() { + // fetchData(); + // } + + React.useEffect(() => { + const pageFromUrl = searchParams?.get("page"); + if (pageFromUrl) { + setPage(Number(pageFromUrl)); + } + }, [searchParams]); + + // React.useEffect(() => { + // fetchData(); + // setPagination({ + // pageIndex: 0, + // pageSize: Number(showData), + // }); + // }, [page, showData]); + + // async function fetchData() { + // try { + // loading(); + // const res = await listDataMedia( + // page - 1, + // showData, + // search, + // categoryFilter?.sort().join(","), + // statusFilter?.sort().join(",") + // ); + // const data = res?.data?.data; + // const contentData = data?.content; + // contentData.forEach((item: any, index: number) => { + // item.no = (page - 1) * Number(showData) + index + 1; + // }); + + // console.log("contentData : ", data); + + // setDataTable(contentData); + // setTotalData(data?.totalElements); + // setTotalPage(data?.totalPages); + // close(); + // } catch (error) { + // console.error("Error fetching tasks:", error); + // } + // } + + React.useEffect(() => { + getCategories(); + }, []); + + async function getCategories() { + const category = await listEnableCategory(""); + const resCategory = category?.data?.data?.content; + setCategories(resCategory); + } + + const handleChange = (type: string, id: number, checked: boolean) => { + if (type === "category") { + if (checked) { + const temp: number[] = [...categoryFilter]; + temp.push(id); + setCategoryFilter(temp); + } else { + const temp = categoryFilter.filter((a) => a !== id); + setCategoryFilter(temp); + } + } else { + if (checked) { + const temp: number[] = [...statusFilter]; + temp.push(id); + setStatusFilter(temp); + } else { + const temp = statusFilter.filter((a) => a !== id); + setStatusFilter(temp); + } + } + }; + + return ( +
+
+

Media Online

+
+ +
+ + + + setSearch(e.target.value)} + className="max-w-[300px]" + /> +
+ + + + + + + + 1 - 10 Data + + + 1 - 20 Data + + + 1 - 25 Data + + + 1 - 50 Data + + + + +
+
+ + + {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 MediaOnlineTable; diff --git a/app/[locale]/(protected)/admin/media-tracking/media-online/page.tsx b/app/[locale]/(protected)/admin/media-tracking/media-online/page.tsx new file mode 100644 index 00000000..bd811c30 --- /dev/null +++ b/app/[locale]/(protected)/admin/media-tracking/media-online/page.tsx @@ -0,0 +1,11 @@ +import SiteBreadcrumb from "@/components/site-breadcrumb"; +import MediaOnlineTable from "./component/table"; + +export default function AdminMediaOnline() { + return ( +
+ + +
+ ); +} diff --git a/app/[locale]/(protected)/admin/media-tracking/tb-news/component/column.tsx b/app/[locale]/(protected)/admin/media-tracking/tb-news/component/column.tsx new file mode 100644 index 00000000..e963dea3 --- /dev/null +++ b/app/[locale]/(protected)/admin/media-tracking/tb-news/component/column.tsx @@ -0,0 +1,58 @@ +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 { + formatDateToIndonesian, + getOnlyDate, + htmlToString, +} from "@/utils/globals"; +import { Link, useRouter } from "@/i18n/routing"; +import { + Accordion, + AccordionContent, + AccordionItem, + AccordionTrigger, +} from "@/components/ui/accordion"; +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "@/components/ui/dialog"; +import { Collapsible, CollapsibleContent } from "@/components/ui/collapsible"; + +const columns: ColumnDef[] = [ + { + accessorKey: "no", + header: "No", + cell: ({ row }) => {row.getValue("no")}, + }, + { + accessorKey: "date", + header: "Tanggal", + cell: ({ row }) => {row.getValue("categoryName")}, + }, + { + accessorKey: "title", + header: "Media Online", + cell: ({ row }) => {row.getValue("title")}, + }, + { + accessorKey: "link", + header: "Link Berita", + cell: ({ row }) => {row.getValue("categoryName")}, + }, +]; + +export default columns; diff --git a/app/[locale]/(protected)/admin/media-tracking/tb-news/component/table.tsx b/app/[locale]/(protected)/admin/media-tracking/tb-news/component/table.tsx new file mode 100644 index 00000000..c2407cd7 --- /dev/null +++ b/app/[locale]/(protected)/admin/media-tracking/tb-news/component/table.tsx @@ -0,0 +1,305 @@ +"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 { 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 { Label } from "@/components/ui/label"; + +const NewsTable = () => { + const router = useRouter(); + const searchParams = useSearchParams(); + const [search, setSearch] = React.useState(""); + const [showData, setShowData] = React.useState("10"); + const [categories, setCategories] = React.useState(); + const [dataTable, setDataTable] = React.useState([]); + const [totalData, setTotalData] = React.useState(1); + const [sorting, setSorting] = React.useState([]); + const [columnFilters, setColumnFilters] = React.useState( + [] + ); + const [showTable, setShowTable] = React.useState(false); + const [columnVisibility, setColumnVisibility] = + React.useState({}); + const [rowSelection, setRowSelection] = React.useState({}); + const [pagination, setPagination] = React.useState({ + pageIndex: 0, + pageSize: Number(showData), + }); + const [categoryFilter, setCategoryFilter] = React.useState([]); + const [statusFilter, setStatusFilter] = React.useState([]); + 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, + }, + }); + + let typingTimer: any; + const doneTypingInterval = 1500; + + // const handleKeyUp = () => { + // clearTimeout(typingTimer); + // typingTimer = setTimeout(doneTyping, doneTypingInterval); + // }; + + const handleKeyDown = () => { + clearTimeout(typingTimer); + }; + + // async function doneTyping() { + // fetchData(); + // } + + React.useEffect(() => { + const pageFromUrl = searchParams?.get("page"); + if (pageFromUrl) { + setPage(Number(pageFromUrl)); + } + }, [searchParams]); + + // React.useEffect(() => { + // fetchData(); + // setPagination({ + // pageIndex: 0, + // pageSize: Number(showData), + // }); + // }, [page, showData]); + + // async function fetchData() { + // try { + // loading(); + // const res = await listDataMedia( + // page - 1, + // showData, + // search, + // categoryFilter?.sort().join(","), + // statusFilter?.sort().join(",") + // ); + // const data = res?.data?.data; + // const contentData = data?.content; + // contentData.forEach((item: any, index: number) => { + // item.no = (page - 1) * Number(showData) + index + 1; + // }); + + // console.log("contentData : ", data); + + // setDataTable(contentData); + // setTotalData(data?.totalElements); + // setTotalPage(data?.totalPages); + // close(); + // } catch (error) { + // console.error("Error fetching tasks:", error); + // } + // } + + React.useEffect(() => { + getCategories(); + }, []); + + async function getCategories() { + const category = await listEnableCategory(""); + const resCategory = category?.data?.data?.content; + setCategories(resCategory); + } + + const handleChange = (type: string, id: number, checked: boolean) => { + if (type === "category") { + if (checked) { + const temp: number[] = [...categoryFilter]; + temp.push(id); + setCategoryFilter(temp); + } else { + const temp = categoryFilter.filter((a) => a !== id); + setCategoryFilter(temp); + } + } else { + if (checked) { + const temp: number[] = [...statusFilter]; + temp.push(id); + setStatusFilter(temp); + } else { + const temp = statusFilter.filter((a) => a !== id); + setStatusFilter(temp); + } + } + }; + + return ( +
+
+

+ Tracking Berita hari ini! +

+
+
+ + +

Sisa kuota harian: 30 Artikel

+
+ {!showTable && ( +
+ + +
+ )} + {showTable && ( + <> + + + {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 NewsTable; diff --git a/app/[locale]/(protected)/admin/media-tracking/tb-news/page.tsx b/app/[locale]/(protected)/admin/media-tracking/tb-news/page.tsx new file mode 100644 index 00000000..a8baea3f --- /dev/null +++ b/app/[locale]/(protected)/admin/media-tracking/tb-news/page.tsx @@ -0,0 +1,11 @@ +import SiteBreadcrumb from "@/components/site-breadcrumb"; +import NewsTable from "./component/table"; + +export default function AdminNews() { + return ( +
+ + +
+ ); +} diff --git a/app/[locale]/(protected)/contributor/agenda-setting/calender-view.tsx b/app/[locale]/(protected)/contributor/agenda-setting/calender-view.tsx index fdc17169..833a2129 100644 --- a/app/[locale]/(protected)/contributor/agenda-setting/calender-view.tsx +++ b/app/[locale]/(protected)/contributor/agenda-setting/calender-view.tsx @@ -10,7 +10,15 @@ import { Label } from "@/components/ui/label"; import ExternalDraggingevent from "./dragging-events"; import { Calendar } from "@/components/ui/calendar"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; -import { Book, CheckSquare2, CheckSquare2Icon, Plus } from "lucide-react"; +import { + Book, + CheckCheck, + CheckSquare2, + CheckSquare2Icon, + Plus, + Timer, + TimerIcon, +} from "lucide-react"; import { Checkbox } from "@/components/ui/checkbox"; import { EventContentArg } from "@fullcalendar/core"; import EventModal from "./event-modal"; @@ -46,6 +54,7 @@ export type CalendarEvent = { end: Date; createBy: string; createdByName: string; + isPublish: boolean | null; allDay: boolean; extendedProps: { calendar: string; @@ -94,7 +103,7 @@ interface ListItemProps { item: any; text: string; createdBy: string; - isPublish: boolean; + isPublish: boolean | null; bgColor: string; } @@ -176,12 +185,15 @@ const CalendarView = ({ categories }: CalendarViewProps) => { end: new Date(event.endDate), allDay: true, extendedProps: { + isPublish: event.isPublish, calendar: event.agendaType, description: event.description, createdByName: event.createdByName, }, })); + console.log("Dataaa event : ", events); + setCalendarEvents(events); } }; @@ -239,6 +251,7 @@ const CalendarView = ({ categories }: CalendarViewProps) => { title: item.title, createBy: "Mabes Polri - Approver", createdByName: item.createdByName, + isPublish: item.isPublish, start: new Date(item.startDate), end: new Date(item.endDate), allDay: true, // Sesuaikan jika memang ada event sepanjang hari @@ -335,14 +348,13 @@ const CalendarView = ({ categories }: CalendarViewProps) => { const renderEventContent = (eventInfo: any) => { const { title } = eventInfo.event; - const { isPublish } = eventInfo.event.extendedProps; - const { createdByName } = eventInfo.event.extendedProps; + const { createdByName, isPublish } = eventInfo.event.extendedProps; return ( <>
{" "} - {isPublish == true && } + {isPublish === true ? : }

{title}

@@ -417,6 +429,7 @@ const CalendarView = ({ categories }: CalendarViewProps) => { end: new Date(item.endDate), createBy: "Mabes Polri - Approver", // Sesuaikan dengan data yang sebenarnya jika ada createdByName: item.createdByName, + isPublish: item.isPublish, allDay: true, extendedProps: { calendar: item.agendaType, @@ -447,7 +460,7 @@ const CalendarView = ({ categories }: CalendarViewProps) => { onClick={() => handleClickListItem(item)} >
- {isPublish == true && } + {isPublish ? : }

{text}

Created By: {createdBy}

diff --git a/app/[locale]/(protected)/contributor/blog/page.tsx b/app/[locale]/(protected)/contributor/blog/page.tsx index 6cfc19b4..71849fb4 100644 --- a/app/[locale]/(protected)/contributor/blog/page.tsx +++ b/app/[locale]/(protected)/contributor/blog/page.tsx @@ -15,7 +15,7 @@ const BlogPage = async () => {
- Table Indeks + Tabel Indeks
diff --git a/app/[locale]/(protected)/contributor/content/audio/update-seo/[id]/page.tsx b/app/[locale]/(protected)/contributor/content/audio/update-seo/[id]/page.tsx new file mode 100644 index 00000000..7fe0e43c --- /dev/null +++ b/app/[locale]/(protected)/contributor/content/audio/update-seo/[id]/page.tsx @@ -0,0 +1,18 @@ +import SiteBreadcrumb from "@/components/site-breadcrumb"; +import FormImageDetail from "@/components/form/content/image-detail-form"; +import FormImageUpdate from "@/components/form/content/image-update-form"; +import FormAudioUpdate from "@/components/form/content/audio-update-form"; +import FormAudioSeo from "@/components/form/content/audio-update-seo"; + +const AudioUpdatePage = async () => { + return ( +
+ +
+ +
+
+ ); +}; + +export default AudioUpdatePage; diff --git a/app/[locale]/(protected)/contributor/content/image/update-seo/[id]/page.tsx b/app/[locale]/(protected)/contributor/content/image/update-seo/[id]/page.tsx new file mode 100644 index 00000000..152ee87e --- /dev/null +++ b/app/[locale]/(protected)/contributor/content/image/update-seo/[id]/page.tsx @@ -0,0 +1,17 @@ +import SiteBreadcrumb from "@/components/site-breadcrumb"; +import FormImageDetail from "@/components/form/content/image-detail-form"; +import FormImageUpdate from "@/components/form/content/image-update-form"; +import FormImageSeo from "@/components/form/content/image-update-seo"; + +const ImageUpdateSeoPage = async () => { + return ( +
+ +
+ +
+
+ ); +}; + +export default ImageUpdateSeoPage; diff --git a/app/[locale]/(protected)/contributor/content/teks/update-seo/[id]/page.tsx b/app/[locale]/(protected)/contributor/content/teks/update-seo/[id]/page.tsx new file mode 100644 index 00000000..f3182778 --- /dev/null +++ b/app/[locale]/(protected)/contributor/content/teks/update-seo/[id]/page.tsx @@ -0,0 +1,16 @@ +import SiteBreadcrumb from "@/components/site-breadcrumb"; +import FormTeksUpdate from "@/components/form/content/teks-update-form"; +import FormTeksSeo from "@/components/form/content/teks-update-seo"; + +const TeksUpdatePage = async () => { + return ( +
+ +
+ +
+
+ ); +}; + +export default TeksUpdatePage; diff --git a/app/[locale]/(protected)/contributor/content/video/update-seo/[id]/page.tsx b/app/[locale]/(protected)/contributor/content/video/update-seo/[id]/page.tsx new file mode 100644 index 00000000..260e06f2 --- /dev/null +++ b/app/[locale]/(protected)/contributor/content/video/update-seo/[id]/page.tsx @@ -0,0 +1,18 @@ +import SiteBreadcrumb from "@/components/site-breadcrumb"; +import FormImageDetail from "@/components/form/content/image-detail-form"; +import FormImageUpdate from "@/components/form/content/image-update-form"; +import FormVideoUpdate from "@/components/form/content/video-update-form"; +import FormVideoSeo from "@/components/form/content/video-update-seo"; + +const VideoUpdatePage = async () => { + return ( +
+ +
+ +
+
+ ); +}; + +export default VideoUpdatePage; diff --git a/app/[locale]/(protected)/contributor/schedule/media/audio/create/page.tsx b/app/[locale]/(protected)/contributor/schedule/media/audio/create/page.tsx new file mode 100644 index 00000000..245ddf9f --- /dev/null +++ b/app/[locale]/(protected)/contributor/schedule/media/audio/create/page.tsx @@ -0,0 +1,15 @@ +import FormAudio from "@/components/form/content/audio-form"; +import SiteBreadcrumb from "@/components/site-breadcrumb"; + +const AudioScheduleCreatePage = async () => { + return ( +
+ +
+ +
+
+ ); +}; + +export default AudioScheduleCreatePage; diff --git a/app/[locale]/(protected)/contributor/schedule/media/image/create/page.tsx b/app/[locale]/(protected)/contributor/schedule/media/image/create/page.tsx new file mode 100644 index 00000000..73082e9a --- /dev/null +++ b/app/[locale]/(protected)/contributor/schedule/media/image/create/page.tsx @@ -0,0 +1,17 @@ +import { Card, CardContent } from "@/components/ui/card"; +import SiteBreadcrumb from "@/components/site-breadcrumb"; +import FormTask from "@/components/form/task/task-form"; +import FormImage from "@/components/form/content/image-form"; + +const ImageScheduleCreatePage = async () => { + return ( +
+ +
+ +
+
+ ); +}; + +export default ImageScheduleCreatePage; diff --git a/app/[locale]/(protected)/contributor/schedule/media/text/create/page.tsx b/app/[locale]/(protected)/contributor/schedule/media/text/create/page.tsx new file mode 100644 index 00000000..905e8275 --- /dev/null +++ b/app/[locale]/(protected)/contributor/schedule/media/text/create/page.tsx @@ -0,0 +1,16 @@ +import FormAudio from "@/components/form/content/audio-form"; +import FormTeks from "@/components/form/content/teks-form"; +import SiteBreadcrumb from "@/components/site-breadcrumb"; + +const TeksScheduleCreatePage = async () => { + return ( +
+ +
+ +
+
+ ); +}; + +export default TeksScheduleCreatePage; diff --git a/app/[locale]/(protected)/contributor/schedule/media/video/create/page.tsx b/app/[locale]/(protected)/contributor/schedule/media/video/create/page.tsx new file mode 100644 index 00000000..7c5eb0fc --- /dev/null +++ b/app/[locale]/(protected)/contributor/schedule/media/video/create/page.tsx @@ -0,0 +1,15 @@ +import FormVideo from "@/components/form/content/video-form"; +import SiteBreadcrumb from "@/components/site-breadcrumb"; + +const VideoScheduleCreatePage = async () => { + return ( +
+ +
+ +
+
+ ); +}; + +export default VideoScheduleCreatePage; diff --git a/app/[locale]/(protected)/contributor/task/components/task-table.tsx b/app/[locale]/(protected)/contributor/task/components/task-table.tsx index 64d80ec2..82617efe 100644 --- a/app/[locale]/(protected)/contributor/task/components/task-table.tsx +++ b/app/[locale]/(protected)/contributor/task/components/task-table.tsx @@ -26,6 +26,7 @@ import { } from "@/components/ui/table"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { + ChevronDown, ChevronLeft, ChevronRight, Eye, @@ -52,6 +53,8 @@ import { useRouter, useSearchParams } from "next/navigation"; import TablePagination from "@/components/table/table-pagination"; import columns from "./columns"; import { listTask } from "@/service/task"; +import { Label } from "@/components/ui/label"; +import { format } from "date-fns"; const TaskTable = () => { const router = useRouter(); @@ -70,6 +73,10 @@ const TaskTable = () => { pageIndex: 0, pageSize: 10, }); + const [statusFilter, setStatusFilter] = React.useState([]); + const [dateFilter, setDateFilter] = React.useState(""); + const [endDate, setEndDate] = React.useState(""); + const [filterByCode, setFilterByCode] = React.useState(""); const [page, setPage] = React.useState(1); const [totalPage, setTotalPage] = React.useState(1); const [limit, setLimit] = React.useState(10); @@ -106,18 +113,43 @@ const TaskTable = () => { React.useEffect(() => { fetchData(); - }, [page, limit, isSpecificAttention, search]); + }, [ + page, + limit, + isSpecificAttention, + search, + dateFilter, + filterByCode, + statusFilter, + ]); async function fetchData() { + const formattedStartDate = dateFilter + ? format(new Date(dateFilter), "yyyy-MM-dd") + : ""; try { const res = await listTask( - search, page - 1, + search, limit, - isSpecificAttention ? "atensi-khusus" : "tugas-harian" + filterByCode, + formattedStartDate, + isSpecificAttention ? "atensi-khusus" : "tugas-harian", + statusFilter ); + const data = res?.data?.data; const contentData = data?.content; + + // let contentDataFilter = res?.data?.data?.content || []; + + // Filter berdasarkan status + // contentDataFilter = contentDataFilter.filter((item: any) => { + // const isSelesai = statusFilter.includes(1) ? item.isDone : true; + // const isAktif = statusFilter.includes(2) ? item.isActive : true; + // return isSelesai && isAktif; + // }); + contentData.forEach((item: any, index: number) => { item.no = (page - 1) * limit + index + 1; }); @@ -133,10 +165,26 @@ const TaskTable = () => { } const handleSearch = (e: React.ChangeEvent) => { - setSearch(e.target.value); // Perbarui state search - table.getColumn("judul")?.setFilterValue(e.target.value); // Set filter tabel + setFilterByCode(e.target.value); + setSearch(e.target.value); + table.getColumn("judul")?.setFilterValue(e.target.value); }; + function handleStatusCheckboxChange(value: number) { + setStatusFilter((prev) => + prev.includes(value) + ? prev.filter((status) => status !== value) + : [...prev, value] + ); + } + + // const handleSearchFilterByCode = (e: React.ChangeEvent) => { + // const value = e.target.value; + // console.log("code :", value); + // setFilterByCode(value); + // fetchData(); + // }; + return (
@@ -184,24 +232,88 @@ const TaskTable = () => {
-
- ) => - table.getColumn("status")?.setFilterValue(event.target.value) - } - className="max-w-sm " - /> +
+
+
+ + + + + +
+

Filter

+
+
+ + setDateFilter(e.target.value)} + className="max-w-sm" + /> +
+ {/*
+ + +
*/} + +
+ handleStatusCheckboxChange(1)} + /> + +
+
+ handleStatusCheckboxChange(2)} + /> + +
+
+
+
+
+ {/*
+ ) => + table.getColumn("status")?.setFilterValue(event.target.value) + } + className="max-w-sm " + /> +
*/}
diff --git a/app/[locale]/(protected)/contributor/task/page.tsx b/app/[locale]/(protected)/contributor/task/page.tsx index 0d91735d..54d82f79 100644 --- a/app/[locale]/(protected)/contributor/task/page.tsx +++ b/app/[locale]/(protected)/contributor/task/page.tsx @@ -27,7 +27,7 @@ const TaskPage = () => {
- Table Penugasan + Tabel Penugasan
diff --git a/app/[locale]/(protected)/shared/contest/page.tsx b/app/[locale]/(protected)/shared/contest/page.tsx index 72fbd099..77f8ed14 100644 --- a/app/[locale]/(protected)/shared/contest/page.tsx +++ b/app/[locale]/(protected)/shared/contest/page.tsx @@ -15,7 +15,7 @@ const ContestPage = () => {
- Table Lomba + Tabel Lomba
diff --git a/app/[locale]/(protected)/supervisor/faq/components/column.tsx b/app/[locale]/(protected)/supervisor/faq/components/column.tsx index ee7f653b..42fb7831 100644 --- a/app/[locale]/(protected)/supervisor/faq/components/column.tsx +++ b/app/[locale]/(protected)/supervisor/faq/components/column.tsx @@ -1,76 +1,101 @@ - import * as React from "react"; -import { - ColumnDef, -} from "@tanstack/react-table"; +import { ColumnDef } from "@tanstack/react-table"; + +import { Eye, MoreVertical, SquarePen, Trash2 } from "lucide-react"; -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"; +import { error } from "@/config/swal"; +import { deleteCategory, deleteDataFAQ } from "@/service/settings/settings"; +import { useToast } from "@/components/ui/use-toast"; + +import { + Menubar, + MenubarContent, + MenubarMenu, + MenubarTrigger, +} from "@/components/ui/menubar"; +import { htmlToString } from "@/utils/globals"; +import EditSpvFAQModal from "./edit"; + const columns: ColumnDef[] = [ { accessorKey: "no", header: "No", cell: ({ row }) => {row.getValue("no")}, }, + { accessorKey: "question", - header: "Question", - cell: ({ row }) => {row.getValue("question")}, + header: "Pertanyaan", + cell: ({ row }) => ( + + {htmlToString(row.getValue("question"))} + + ), }, { accessorKey: "answer", header: "Answer", - cell: ({ row }) => {row.getValue("answer")}, + cell: ({ row }) => ( + + {htmlToString(row.getValue("answer"))} + + ), }, + { id: "actions", accessorKey: "action", header: "Actions", enableHiding: false, cell: ({ row }) => { + const router = useRouter(); + const { toast } = useToast(); + + const faqDelete = async (id: string) => { + const response = await deleteDataFAQ(id); + console.log(response); + if (response?.error) { + error(response.message); + return false; + } + toast({ + title: "Sukses", + description: "Berhasil Delete", + }); + router.push("/supervisor/faq?dataChange=true"); + }; return ( - - - - - - - - View - - - - Edit - - - - Delete - - - + + + + + + + + + + + faqDelete(row.original.id)} + className="hover:underline cursor-pointer hover:text-destructive" + > + Delete + + + + ); }, }, ]; -export default columns; \ No newline at end of file +export default columns; diff --git a/app/[locale]/(protected)/supervisor/faq/components/create.tsx b/app/[locale]/(protected)/supervisor/faq/components/create.tsx new file mode 100644 index 00000000..a5af317c --- /dev/null +++ b/app/[locale]/(protected)/supervisor/faq/components/create.tsx @@ -0,0 +1,202 @@ +"use client"; + +import { Button } from "@/components/ui/button"; +import { + Dialog, + DialogContent, + DialogFooter, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "@/components/ui/dialog"; +import { z } from "zod"; +import { useForm } from "react-hook-form"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, +} from "@/components/ui/form"; +import { useRouter } from "@/i18n/routing"; + +import { + getUserRoles, + postCategory, + postDataFAQ, +} from "@/service/settings/settings"; +import { useState } from "react"; +import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; +import { Textarea } from "@/components/ui/textarea"; +import { close, error, loading } from "@/config/swal"; +import { useToast } from "@/components/ui/use-toast"; +import { stringify } from "querystring"; + +const FormSchema = z.object({ + answer: z.string({ + required_error: "Required", + }), + question: z.string({ + required_error: "Required", + }), + publishTo: z.string({ + required_error: "Required", + }), + + // publishTo: z.array(z.string()).refine((value) => value.some((item) => item), { + // message: "Required", + // }), +}); + +const publishToList = [ + { + id: "mabes", + name: "Nasional", + }, + { + id: "polda", + name: "Polda", + }, + { + id: "satker", + name: "Satker", + }, + { + id: "internasional", + name: "Internasional", + }, +]; + +export default function CreateSpvFAQModal() { + const router = useRouter(); + const { toast } = useToast(); + + const [isOpen, setIsOpen] = useState(false); + + const form = useForm>({ + resolver: zodResolver(FormSchema), + defaultValues: { publishTo: "wilayah" }, + }); + + const target = form.watch("publishTo"); + const isAllTargetChecked = publishToList.every((item) => + target?.includes(item.id) + ); + + const onSubmit = async (data: z.infer) => { + const request = { + question: data.question, + answer: data.answer, + isInternational: data.publishTo === "wilayah" ? false : true, + isActive: true, + }; + + const response = await postDataFAQ(request); + close(); + if (response?.error) { + toast({ title: stringify(response.message), variant: "destructive" }); + return false; + } + toast({ + title: "Succes", + description: "FAQ berhasil dibuat", + }); + router.push("/supervisor/faq?dataChange=true"); + setIsOpen(false); + }; + + return ( + + + + + + + Tambah FAQ + +
+ + ( + + Wilayah Publish + + + + + + + Wilayah + + + + + + + Internasional + + + + + + + )} + /> + + ( + + Pertanyaan + +