This commit is contained in:
hanif salafi 2025-03-10 11:08:10 +07:00
commit ac2bba1e02
57 changed files with 3216 additions and 2595 deletions

View File

@ -5,7 +5,7 @@ export default function PerformancePolda() {
return ( return (
<div> <div>
<SiteBreadcrumb /> <SiteBreadcrumb />
<p className="font-semibold">PERFORMANCE KUMULATIF PER POLDA</p> <p className="font-semibold">PERFORMANCE KUMULATIF PER POLRES</p>
<PerformancePolresViz /> <PerformancePolresViz />
</div> </div>
); );

View File

@ -0,0 +1,13 @@
import SiteBreadcrumb from "@/components/site-breadcrumb";
import PerformancePolresViz from "@/components/visualization/performance-polres";
import PerformanceSatkerViz from "@/components/visualization/performance-satker";
export default function PerformanceSatker() {
return (
<div>
<SiteBreadcrumb />
<p className="font-semibold">PERFORMANCE KUMULATIF PER SATKER</p>
<PerformanceSatkerViz />
</div>
);
}

View File

@ -14,9 +14,7 @@ export default function AdminBanner() {
<SiteBreadcrumb /> <SiteBreadcrumb />
<div className="w-full overflow-x-auto bg-white p-4 rounded-sm space-y-3"> <div className="w-full overflow-x-auto bg-white p-4 rounded-sm space-y-3">
<div className="flex justify-between"> <div className="flex justify-between">
{selectedTab === "content" {selectedTab === "content" ? "List Media" : " List Banner"}
? "Daftar List Media"
: "Table List Banner"}
<div className="flex flex-row gap-1 border-2 rounded-md w-fit mb-5"> <div className="flex flex-row gap-1 border-2 rounded-md w-fit mb-5">
<Button <Button

View File

@ -39,6 +39,7 @@ import Image from "next/image";
import { Upload } from "tus-js-client"; import { Upload } from "tus-js-client";
import { getCookiesDecrypt } from "@/lib/utils"; import { getCookiesDecrypt } from "@/lib/utils";
import Cookies from "js-cookie"; import Cookies from "js-cookie";
import { useTranslations } from "next-intl";
const FormSchema = z.object({ const FormSchema = z.object({
title: z.string({ title: z.string({
@ -109,7 +110,7 @@ export default function CreateCategoryModal() {
const levelNumber = getCookiesDecrypt("ulne"); const levelNumber = getCookiesDecrypt("ulne");
const userLevelId = getCookiesDecrypt("ulie"); const userLevelId = getCookiesDecrypt("ulie");
const poldaState = Cookies.get("state"); const poldaState = Cookies.get("state");
const t = useTranslations("Menu");
const [files, setFiles] = useState<File[]>([]); const [files, setFiles] = useState<File[]>([]);
const [isOpen, setIsOpen] = useState(false); const [isOpen, setIsOpen] = useState(false);
const [satkerData, setSatkerData] = useState<string[]>([]); const [satkerData, setSatkerData] = useState<string[]>([]);
@ -239,12 +240,12 @@ export default function CreateCategoryModal() {
<Dialog open={isOpen} onOpenChange={setIsOpen}> <Dialog open={isOpen} onOpenChange={setIsOpen}>
<DialogTrigger asChild> <DialogTrigger asChild>
<Button color="primary" size="md"> <Button color="primary" size="md">
Tambah Kategori {t("add-category")}
</Button> </Button>
</DialogTrigger> </DialogTrigger>
<DialogContent size="md"> <DialogContent size="md">
<DialogHeader> <DialogHeader>
<DialogTitle>Tambah Kategori</DialogTitle> <DialogTitle> {t("add-category")}</DialogTitle>
</DialogHeader> </DialogHeader>
<Form {...form}> <Form {...form}>
<form <form

View File

@ -44,10 +44,12 @@ import {
DialogTrigger, DialogTrigger,
} from "@/components/ui/dialog"; } from "@/components/ui/dialog";
import CreateCategoryModal from "./create"; import CreateCategoryModal from "./create";
import { useTranslations } from "next-intl";
const AdminCategoryTable = () => { const AdminCategoryTable = () => {
const router = useRouter(); const router = useRouter();
const searchParams = useSearchParams(); const searchParams = useSearchParams();
const t = useTranslations("Menu");
const dataChange = searchParams?.get("dataChange"); const dataChange = searchParams?.get("dataChange");
const [openModal, setOpenModal] = React.useState(false); const [openModal, setOpenModal] = React.useState(false);
const [dataTable, setDataTable] = React.useState<any[]>([]); const [dataTable, setDataTable] = React.useState<any[]>([]);
@ -127,7 +129,7 @@ const AdminCategoryTable = () => {
return ( return (
<div className="w-full overflow-x-auto bg-white p-4 rounded-sm space-y-3"> <div className="w-full overflow-x-auto bg-white p-4 rounded-sm space-y-3">
<div className="flex justify-between mb-10 items-center"> <div className="flex justify-between mb-10 items-center">
<p className="text-xl font-medium text-default-900">Kategori</p> <p className="text-xl font-medium text-default-900">{t("category")}</p>
<CreateCategoryModal /> <CreateCategoryModal />
</div> </div>

View File

@ -40,6 +40,7 @@ import { useDropzone } from "react-dropzone";
import { CloudUpload } from "lucide-react"; import { CloudUpload } from "lucide-react";
import Image from "next/image"; import Image from "next/image";
import { Upload } from "tus-js-client"; import { Upload } from "tus-js-client";
import { useTranslations } from "next-intl";
const FormSchema = z.object({ const FormSchema = z.object({
answer: z.string({ answer: z.string({
@ -79,7 +80,7 @@ const publishToList = [
export default function CreateFAQModal() { export default function CreateFAQModal() {
const router = useRouter(); const router = useRouter();
const { toast } = useToast(); const { toast } = useToast();
const t = useTranslations("Menu");
const [isOpen, setIsOpen] = useState(false); const [isOpen, setIsOpen] = useState(false);
const [satkerData, setSatkerData] = useState<string[]>([]); const [satkerData, setSatkerData] = useState<string[]>([]);
const [unitData, setUnitData] = useState<string[]>([]); const [unitData, setUnitData] = useState<string[]>([]);
@ -120,12 +121,12 @@ export default function CreateFAQModal() {
<Dialog open={isOpen} onOpenChange={setIsOpen}> <Dialog open={isOpen} onOpenChange={setIsOpen}>
<DialogTrigger asChild> <DialogTrigger asChild>
<Button color="primary" size="md"> <Button color="primary" size="md">
Tambah FAQ {t("add")} FAQ
</Button> </Button>
</DialogTrigger> </DialogTrigger>
<DialogContent size="md"> <DialogContent size="md">
<DialogHeader> <DialogHeader>
<DialogTitle>Tambah FAQ</DialogTitle> <DialogTitle>{t("add")} FAQ</DialogTitle>
</DialogHeader> </DialogHeader>
<Form {...form}> <Form {...form}>
<form <form

View File

@ -41,6 +41,7 @@ import { useDropzone } from "react-dropzone";
import { CloudUpload } from "lucide-react"; import { CloudUpload } from "lucide-react";
import Image from "next/image"; import Image from "next/image";
import { Upload } from "tus-js-client"; import { Upload } from "tus-js-client";
import { useTranslations } from "next-intl";
const FormSchema = z.object({ const FormSchema = z.object({
question: z.string({ question: z.string({
@ -77,7 +78,7 @@ const publishToList = [
export default function CreateFAQModal() { export default function CreateFAQModal() {
const router = useRouter(); const router = useRouter();
const { toast } = useToast(); const { toast } = useToast();
const t = useTranslations("Menu");
const [isOpen, setIsOpen] = useState(false); const [isOpen, setIsOpen] = useState(false);
const form = useForm<z.infer<typeof FormSchema>>({ const form = useForm<z.infer<typeof FormSchema>>({
@ -110,12 +111,12 @@ export default function CreateFAQModal() {
<Dialog open={isOpen} onOpenChange={setIsOpen}> <Dialog open={isOpen} onOpenChange={setIsOpen}>
<DialogTrigger asChild> <DialogTrigger asChild>
<Button color="primary" size="md"> <Button color="primary" size="md">
Tambah Feedback {t("add")} Feedback
</Button> </Button>
</DialogTrigger> </DialogTrigger>
<DialogContent size="md"> <DialogContent size="md">
<DialogHeader> <DialogHeader>
<DialogTitle>Tambah Feedback</DialogTitle> <DialogTitle>{t("add")} Feedback</DialogTitle>
</DialogHeader> </DialogHeader>
<Form {...form}> <Form {...form}>
<form <form

View File

@ -41,11 +41,13 @@ import {
} from "@/service/settings/settings"; } from "@/service/settings/settings";
import CreateFAQModal from "./create"; import CreateFAQModal from "./create";
import { useTranslations } from "next-intl";
const AdminFeedbackTable = () => { const AdminFeedbackTable = () => {
const router = useRouter(); const router = useRouter();
const searchParams = useSearchParams(); const searchParams = useSearchParams();
const dataChange = searchParams?.get("dataChange"); const dataChange = searchParams?.get("dataChange");
const [openModal, setOpenModal] = React.useState(false); const [openModal, setOpenModal] = React.useState(false);
const [dataTable, setDataTable] = React.useState<any[]>([]); const [dataTable, setDataTable] = React.useState<any[]>([]);
const [totalData, setTotalData] = React.useState<number>(1); const [totalData, setTotalData] = React.useState<number>(1);

View File

@ -42,6 +42,7 @@ import {
CommandList, CommandList,
} from "@/components/ui/command"; } from "@/components/ui/command";
import { cn } from "@/lib/utils"; import { cn } from "@/lib/utils";
import { useTranslations } from "next-intl";
const FormSchema = z.object({ const FormSchema = z.object({
name: z.string({ name: z.string({
@ -55,6 +56,7 @@ const FormSchema = z.object({
export default function CreateTagModal() { export default function CreateTagModal() {
const router = useRouter(); const router = useRouter();
const { toast } = useToast(); const { toast } = useToast();
const t = useTranslations("Menu");
const [categoryList, setCategoryList] = useState< const [categoryList, setCategoryList] = useState<
{ id: number; label: string; value: string }[] { id: number; label: string; value: string }[]
>([]); >([]);
@ -107,12 +109,12 @@ export default function CreateTagModal() {
<Dialog open={isOpen} onOpenChange={setIsOpen}> <Dialog open={isOpen} onOpenChange={setIsOpen}>
<DialogTrigger asChild> <DialogTrigger asChild>
<Button color="primary" size="md"> <Button color="primary" size="md">
Tambah Tag {t("add-tags")}
</Button> </Button>
</DialogTrigger> </DialogTrigger>
<DialogContent size="md"> <DialogContent size="md">
<DialogHeader> <DialogHeader>
<DialogTitle>Tambah Tag</DialogTitle> <DialogTitle> {t("add-tags")}</DialogTitle>
</DialogHeader> </DialogHeader>
<Form {...form}> <Form {...form}>
<form <form

View File

@ -42,10 +42,12 @@ import {
} from "@/service/settings/settings"; } from "@/service/settings/settings";
import CreateFAQModal from "./create"; import CreateFAQModal from "./create";
import { useTranslations } from "next-intl";
const AdminTagTable = () => { const AdminTagTable = () => {
const router = useRouter(); const router = useRouter();
const searchParams = useSearchParams(); const searchParams = useSearchParams();
const t = useTranslations("Menu");
const dataChange = searchParams?.get("dataChange"); const dataChange = searchParams?.get("dataChange");
const [openModal, setOpenModal] = React.useState(false); const [openModal, setOpenModal] = React.useState(false);
const [dataTable, setDataTable] = React.useState<any[]>([]); const [dataTable, setDataTable] = React.useState<any[]>([]);
@ -124,7 +126,7 @@ const AdminTagTable = () => {
return ( return (
<div className="w-full overflow-x-auto bg-white p-4 rounded-sm space-y-3"> <div className="w-full overflow-x-auto bg-white p-4 rounded-sm space-y-3">
<div className="flex justify-between mb-10 items-center"> <div className="flex justify-between mb-10 items-center">
<p className="text-xl font-medium text-default-900">Tag</p> <p className="text-xl font-medium text-default-900">{t("tags")}</p>
<CreateFAQModal /> <CreateFAQModal />
</div> </div>

View File

@ -45,6 +45,7 @@ import { listEnableCategory } from "@/service/content/content";
import { useTranslations } from "next-intl"; import { useTranslations } from "next-intl";
import { CardHeader, CardTitle } from "@/components/ui/card"; import { CardHeader, CardTitle } from "@/components/ui/card";
import { Link } from "@/i18n/routing"; import { Link } from "@/i18n/routing";
import useTableColumns from "./columns";
const BlogTable = () => { const BlogTable = () => {
const router = useRouter(); const router = useRouter();
@ -73,7 +74,7 @@ const BlogTable = () => {
); );
const [categoryFilter, setCategoryFilter] = React.useState<string>(""); const [categoryFilter, setCategoryFilter] = React.useState<string>("");
const [statusFilter, setStatusFilter] = React.useState<any[]>([]); const [statusFilter, setStatusFilter] = React.useState<any[]>([]);
const columns = useTableColumns();
const table = useReactTable({ const table = useReactTable({
data: dataTable, data: dataTable,
columns, columns,

View File

@ -17,28 +17,32 @@ import Swal from "sweetalert2";
import withReactContent from "sweetalert2-react-content"; import withReactContent from "sweetalert2-react-content";
import { deleteBlog } from "@/service/blog/blog"; import { deleteBlog } from "@/service/blog/blog";
import { error, loading } from "@/lib/swal"; import { error, loading } from "@/lib/swal";
import { useTranslations } from "next-intl";
const columns: ColumnDef<any>[] = [ const useTableColumns = () => {
const t = useTranslations("Table"); // Panggil di dalam hook
const columns: ColumnDef<any>[] = [
{ {
accessorKey: "no", accessorKey: "no",
header: "No", header: t("no"),
cell: ({ row }) => <span>{row.getValue("no")}</span>, cell: ({ row }) => <span>{row.getValue("no")}</span>,
}, },
{ {
accessorKey: "title", accessorKey: "title",
header: "Title", header: t("title"),
cell: ({ row }) => ( cell: ({ row }) => (
<span className="whitespace-normal">{row.getValue("title")}</span> <span className="whitespace-normal">{row.getValue("title")}</span>
), ),
}, },
{ {
accessorKey: "categoryName", accessorKey: "categoryName",
header: "Category", header: t("category"),
cell: ({ row }) => <span>{row.getValue("categoryName")}</span>, cell: ({ row }) => <span>{row.getValue("categoryName")}</span>,
}, },
{ {
accessorKey: "createdAt", accessorKey: "createdAt",
header: "Upload Date", header: t("upload-date"),
cell: ({ row }) => { cell: ({ row }) => {
const createdAt = row.getValue("createdAt") as const createdAt = row.getValue("createdAt") as
| string | string
@ -54,7 +58,7 @@ const columns: ColumnDef<any>[] = [
}, },
{ {
accessorKey: "tags", accessorKey: "tags",
header: "Tag", header: t("tag"),
cell: ({ row }) => <span className="">{row.getValue("tags")}</span>, cell: ({ row }) => <span className="">{row.getValue("tags")}</span>,
}, },
{ {
@ -85,7 +89,7 @@ const columns: ColumnDef<any>[] = [
{ {
id: "actions", id: "actions",
accessorKey: "action", accessorKey: "action",
header: "Actions", header: t("action"),
enableHiding: false, enableHiding: false,
cell: ({ row }) => { cell: ({ row }) => {
const router = useRouter(); const router = useRouter();
@ -166,6 +170,9 @@ const columns: ColumnDef<any>[] = [
); );
}, },
}, },
]; ];
export default columns; return columns;
};
export default useTableColumns;

View File

@ -17,11 +17,15 @@ import withReactContent from "sweetalert2-react-content";
import { deleteMedia } from "@/service/content/content"; import { deleteMedia } from "@/service/content/content";
import { error } from "@/lib/swal"; import { error } from "@/lib/swal";
import Swal from "sweetalert2"; import Swal from "sweetalert2";
import { useTranslations } from "next-intl";
const columns: ColumnDef<any>[] = [ const useTableColumns = () => {
const t = useTranslations("Table"); // Panggil di dalam hook
const MySwal = withReactContent(Swal);
const columns: ColumnDef<any>[] = [
{ {
accessorKey: "no", accessorKey: "no",
header: "No", header: t("no"),
cell: ({ row }) => ( cell: ({ row }) => (
<div className="flex items-center gap-5"> <div className="flex items-center gap-5">
<div className="flex-1 text-start"> <div className="flex-1 text-start">
@ -34,7 +38,7 @@ const columns: ColumnDef<any>[] = [
}, },
{ {
accessorKey: "title", accessorKey: "title",
header: "Title", header: t("title"),
cell: ({ row }: { row: { getValue: (key: string) => string } }) => { cell: ({ row }: { row: { getValue: (key: string) => string } }) => {
const title: string = row.getValue("title"); const title: string = row.getValue("title");
return ( return (
@ -46,14 +50,16 @@ const columns: ColumnDef<any>[] = [
}, },
{ {
accessorKey: "categoryName", accessorKey: "categoryName",
header: "Category Name", header: t("category-name"),
cell: ({ row }) => ( cell: ({ row }) => (
<span className="whitespace-nowrap">{row.getValue("categoryName")}</span> <span className="whitespace-nowrap">
{row.getValue("categoryName")}
</span>
), ),
}, },
{ {
accessorKey: "createdAt", accessorKey: "createdAt",
header: "Upload Date", header: t("upload-date"),
cell: ({ row }) => { cell: ({ row }) => {
const createdAt = row.getValue("createdAt") as const createdAt = row.getValue("createdAt") as
| string | string
@ -69,14 +75,14 @@ const columns: ColumnDef<any>[] = [
}, },
{ {
accessorKey: "creatorName", accessorKey: "creatorName",
header: "Creator Group", header: t("creator-group"),
cell: ({ row }) => ( cell: ({ row }) => (
<span className="whitespace-nowrap">{row.getValue("creatorName")}</span> <span className="whitespace-nowrap">{row.getValue("creatorName")}</span>
), ),
}, },
{ {
accessorKey: "creatorGroupLevelName", accessorKey: "creatorGroupLevelName",
header: "Sumber", header: t("source"),
cell: ({ row }) => ( cell: ({ row }) => (
<span className="whitespace-nowrap"> <span className="whitespace-nowrap">
{row.getValue("creatorGroupLevelName")} {row.getValue("creatorGroupLevelName")}
@ -85,7 +91,7 @@ const columns: ColumnDef<any>[] = [
}, },
{ {
accessorKey: "publishedOn", accessorKey: "publishedOn",
header: "Published", header: t("published"),
cell: ({ row }) => { cell: ({ row }) => {
const isPublish = row.original.isPublish; const isPublish = row.original.isPublish;
const isPublishOnPolda = row.original.isPublishOnPolda; const isPublishOnPolda = row.original.isPublishOnPolda;
@ -138,7 +144,7 @@ const columns: ColumnDef<any>[] = [
{ {
id: "actions", id: "actions",
accessorKey: "action", accessorKey: "action",
header: "Actions", header: t("action"),
enableHiding: false, enableHiding: false,
cell: ({ row }) => { cell: ({ row }) => {
const MySwal = withReactContent(Swal); const MySwal = withReactContent(Swal);
@ -198,13 +204,17 @@ const columns: ColumnDef<any>[] = [
</Button> </Button>
</DropdownMenuTrigger> </DropdownMenuTrigger>
<DropdownMenuContent className="p-0" align="end"> <DropdownMenuContent className="p-0" align="end">
<Link href={`/contributor/content/audio/detail/${row.original.id}`}> <Link
href={`/contributor/content/audio/detail/${row.original.id}`}
>
<DropdownMenuItem className="p-2 border-b text-default-700 group focus:bg-default focus:text-primary-foreground rounded-none"> <DropdownMenuItem className="p-2 border-b text-default-700 group focus:bg-default focus:text-primary-foreground rounded-none">
<Eye className="w-4 h-4 me-1.5" /> <Eye className="w-4 h-4 me-1.5" />
View View
</DropdownMenuItem> </DropdownMenuItem>
</Link> </Link>
<Link href={`/contributor/content/audio/update/${row.original.id}`}> <Link
href={`/contributor/content/audio/update/${row.original.id}`}
>
<DropdownMenuItem className="p-2 border-b text-default-700 group focus:bg-default focus:text-primary-foreground rounded-none"> <DropdownMenuItem className="p-2 border-b text-default-700 group focus:bg-default focus:text-primary-foreground rounded-none">
<SquarePen className="w-4 h-4 me-1.5" /> <SquarePen className="w-4 h-4 me-1.5" />
Edit Edit
@ -222,6 +232,9 @@ const columns: ColumnDef<any>[] = [
); );
}, },
}, },
]; ];
export default columns; return columns;
};
export default useTableColumns;

View File

@ -61,6 +61,7 @@ import {
} from "@/service/content/content"; } from "@/service/content/content";
import { Label } from "@/components/ui/label"; import { Label } from "@/components/ui/label";
import { format } from "date-fns"; import { format } from "date-fns";
import useTableColumns from "./columns";
const TableAudio = () => { const TableAudio = () => {
const router = useRouter(); const router = useRouter();
@ -99,7 +100,7 @@ const TableAudio = () => {
const [filterByCreatorGroup, setFilterByCreatorGroup] = React.useState(""); const [filterByCreatorGroup, setFilterByCreatorGroup] = React.useState("");
const roleId = getCookiesDecrypt("urie"); const roleId = getCookiesDecrypt("urie");
const columns = useTableColumns();
const table = useReactTable({ const table = useReactTable({
data: dataTable, data: dataTable,
columns, columns,

View File

@ -1,3 +1,4 @@
"use client";
import * as React from "react"; import * as React from "react";
import { ColumnDef } from "@tanstack/react-table"; import { ColumnDef } from "@tanstack/react-table";
@ -19,13 +20,15 @@ import { deleteMedia } from "@/service/content/content";
import { error, loading } from "@/lib/swal"; import { error, loading } from "@/lib/swal";
import Swal from "sweetalert2"; import Swal from "sweetalert2";
import withReactContent from "sweetalert2-react-content"; import withReactContent from "sweetalert2-react-content";
import { useTranslations } from "next-intl";
const MySwal = withReactContent(Swal); const useTableColumns = () => {
const t = useTranslations("Table"); // Panggil di dalam hook
const columns: ColumnDef<any>[] = [ const MySwal = withReactContent(Swal);
const columns: ColumnDef<any>[] = [
{ {
accessorKey: "no", accessorKey: "no",
header: "No", header: t("no"),
cell: ({ row }) => ( cell: ({ row }) => (
<div className="flex items-center gap-5"> <div className="flex items-center gap-5">
<div className="flex-1 text-start"> <div className="flex-1 text-start">
@ -38,7 +41,7 @@ const columns: ColumnDef<any>[] = [
}, },
{ {
accessorKey: "title", accessorKey: "title",
header: "Title", header: t("title"),
cell: ({ row }: { row: { getValue: (key: string) => string } }) => { cell: ({ row }: { row: { getValue: (key: string) => string } }) => {
const title: string = row.getValue("title"); const title: string = row.getValue("title");
return ( return (
@ -50,14 +53,16 @@ const columns: ColumnDef<any>[] = [
}, },
{ {
accessorKey: "categoryName", accessorKey: "categoryName",
header: "Category Name", header: t("category-name"),
cell: ({ row }) => ( cell: ({ row }) => (
<span className="whitespace-nowrap">{row.getValue("categoryName")}</span> <span className="whitespace-nowrap">
{row.getValue("categoryName")}
</span>
), ),
}, },
{ {
accessorKey: "createdAt", accessorKey: "createdAt",
header: "Upload Date", header: t("upload-date"),
cell: ({ row }) => { cell: ({ row }) => {
const createdAt = row.getValue("createdAt") as const createdAt = row.getValue("createdAt") as
| string | string
@ -73,14 +78,14 @@ const columns: ColumnDef<any>[] = [
}, },
{ {
accessorKey: "creatorName", accessorKey: "creatorName",
header: "Creator Group", header: t("creator-group"),
cell: ({ row }) => ( cell: ({ row }) => (
<span className="whitespace-nowrap">{row.getValue("creatorName")}</span> <span className="whitespace-nowrap">{row.getValue("creatorName")}</span>
), ),
}, },
{ {
accessorKey: "creatorGroupLevelName", accessorKey: "creatorGroupLevelName",
header: "Sumber", header: t("source"),
cell: ({ row }) => ( cell: ({ row }) => (
<span className="whitespace-nowrap"> <span className="whitespace-nowrap">
{row.getValue("creatorGroupLevelName")} {row.getValue("creatorGroupLevelName")}
@ -89,7 +94,7 @@ const columns: ColumnDef<any>[] = [
}, },
{ {
accessorKey: "publishedOn", accessorKey: "publishedOn",
header: "Published", header: t("published"),
cell: ({ row }) => { cell: ({ row }) => {
const isPublish = row.original.isPublish; const isPublish = row.original.isPublish;
const isPublishOnPolda = row.original.isPublishOnPolda; const isPublishOnPolda = row.original.isPublishOnPolda;
@ -141,7 +146,7 @@ const columns: ColumnDef<any>[] = [
{ {
id: "actions", id: "actions",
accessorKey: "action", accessorKey: "action",
header: "Actions", header: t("action"),
enableHiding: false, enableHiding: false,
cell: ({ row }) => { cell: ({ row }) => {
const router = useRouter(); const router = useRouter();
@ -202,13 +207,17 @@ const columns: ColumnDef<any>[] = [
</Button> </Button>
</DropdownMenuTrigger> </DropdownMenuTrigger>
<DropdownMenuContent className="p-0" align="end"> <DropdownMenuContent className="p-0" align="end">
<Link href={`/contributor/content/image/detail/${row.original.id}`}> <Link
href={`/contributor/content/image/detail/${row.original.id}`}
>
<DropdownMenuItem className="p-2 border-b text-default-700 group focus:bg-default focus:text-primary-foreground rounded-none"> <DropdownMenuItem className="p-2 border-b text-default-700 group focus:bg-default focus:text-primary-foreground rounded-none">
<Eye className="w-4 h-4 me-1.5" /> <Eye className="w-4 h-4 me-1.5" />
View View
</DropdownMenuItem> </DropdownMenuItem>
</Link> </Link>
<Link href={`/contributor/content/image/update/${row.original.id}`}> <Link
href={`/contributor/content/image/update/${row.original.id}`}
>
<DropdownMenuItem className="p-2 border-b text-default-700 group focus:bg-default focus:text-primary-foreground rounded-none"> <DropdownMenuItem className="p-2 border-b text-default-700 group focus:bg-default focus:text-primary-foreground rounded-none">
<SquarePen className="w-4 h-4 me-1.5" /> <SquarePen className="w-4 h-4 me-1.5" />
Edit Edit
@ -226,6 +235,9 @@ const columns: ColumnDef<any>[] = [
); );
}, },
}, },
]; ];
export default columns; return columns;
};
export default useTableColumns;

View File

@ -52,7 +52,7 @@ import { ticketingPagination } from "@/service/ticketing/ticketing";
import { Badge } from "@/components/ui/badge"; import { Badge } from "@/components/ui/badge";
import { useRouter, useSearchParams } from "next/navigation"; import { useRouter, useSearchParams } from "next/navigation";
import TablePagination from "@/components/table/table-pagination"; import TablePagination from "@/components/table/table-pagination";
import columns from "./columns";
import { import {
deleteMedia, deleteMedia,
listDataImage, listDataImage,
@ -66,6 +66,7 @@ import withReactContent from "sweetalert2-react-content";
import { error } from "@/lib/swal"; import { error } from "@/lib/swal";
import { Label } from "@/components/ui/label"; import { Label } from "@/components/ui/label";
import { format } from "date-fns"; import { format } from "date-fns";
import useTableColumns from "./columns";
const TableImage = () => { const TableImage = () => {
const router = useRouter(); const router = useRouter();
@ -104,7 +105,7 @@ const TableImage = () => {
const [filterByCreatorGroup, setFilterByCreatorGroup] = React.useState(""); const [filterByCreatorGroup, setFilterByCreatorGroup] = React.useState("");
const roleId = getCookiesDecrypt("urie"); const roleId = getCookiesDecrypt("urie");
const columns = useTableColumns();
const table = useReactTable({ const table = useReactTable({
data: dataTable, data: dataTable,
columns, columns,

View File

@ -16,11 +16,17 @@ import {
} from "@/components/ui/dropdown-menu"; } from "@/components/ui/dropdown-menu";
import { format } from "date-fns"; import { format } from "date-fns";
import { Link } from "@/components/navigation"; import { Link } from "@/components/navigation";
import { useTranslations } from "next-intl";
import withReactContent from "sweetalert2-react-content";
import Swal from "sweetalert2";
const columns: ColumnDef<any>[] = [ const useTableColumns = () => {
const t = useTranslations("Table"); // Panggil di dalam hook
const MySwal = withReactContent(Swal);
const columns: ColumnDef<any>[] = [
{ {
accessorKey: "no", accessorKey: "no",
header: "No", header: t("no"),
cell: ({ row }) => ( cell: ({ row }) => (
<div className="flex items-center gap-5"> <div className="flex items-center gap-5">
<div className="flex-1 text-start"> <div className="flex-1 text-start">
@ -33,7 +39,7 @@ const columns: ColumnDef<any>[] = [
}, },
{ {
accessorKey: "contentTitle", accessorKey: "contentTitle",
header: "Judul", header: t("title"),
cell: ({ row }: { row: { getValue: (key: string) => string } }) => { cell: ({ row }: { row: { getValue: (key: string) => string } }) => {
const title: string = row.getValue("contentTitle"); const title: string = row.getValue("contentTitle");
return ( return (
@ -45,7 +51,7 @@ const columns: ColumnDef<any>[] = [
}, },
{ {
accessorKey: "contentTag", accessorKey: "contentTag",
header: "Tag", header: t("tag"),
cell: ({ row }) => ( cell: ({ row }) => (
<span className="whitespace-nowrap">{row.getValue("contentTag")}</span> <span className="whitespace-nowrap">{row.getValue("contentTag")}</span>
), ),
@ -53,14 +59,14 @@ const columns: ColumnDef<any>[] = [
{ {
accessorKey: "contentType", accessorKey: "contentType",
header: "Tipe Konten ", header: t("type-content"),
cell: ({ row }) => ( cell: ({ row }) => (
<span className="whitespace-nowrap">{row.getValue("contentType")}</span> <span className="whitespace-nowrap">{row.getValue("contentType")}</span>
), ),
}, },
{ {
accessorKey: "contentCreatedGroupBy", accessorKey: "contentCreatedGroupBy",
header: "Sumber ", header: t("source"),
cell: ({ row }) => ( cell: ({ row }) => (
<span className="whitespace-nowrap"> <span className="whitespace-nowrap">
{row.getValue("contentCreatedGroupBy")} {row.getValue("contentCreatedGroupBy")}
@ -92,7 +98,7 @@ const columns: ColumnDef<any>[] = [
{ {
accessorKey: "contentCreatedDate", accessorKey: "contentCreatedDate",
header: "Tanggal Unggah", header: t("upload-date"),
cell: ({ row }) => { cell: ({ row }) => {
const createdAt = row.getValue("contentCreatedDate") as const createdAt = row.getValue("contentCreatedDate") as
| string | string
@ -147,6 +153,9 @@ const columns: ColumnDef<any>[] = [
); );
}, },
}, },
]; ];
export default columns; return columns;
};
export default useTableColumns;

View File

@ -49,6 +49,7 @@ import {
import { Label } from "@/components/ui/label"; import { Label } from "@/components/ui/label";
import { useTranslations } from "next-intl"; import { useTranslations } from "next-intl";
import { format } from "date-fns"; import { format } from "date-fns";
import useTableColumns from "./columns";
// export type CompanyData = { // export type CompanyData = {
// no: number; // no: number;
@ -89,7 +90,7 @@ const TableSPIT = () => {
const [statusFilter, setStatusFilter] = React.useState<any[]>([]); const [statusFilter, setStatusFilter] = React.useState<any[]>([]);
const roleId = getCookiesDecrypt("urie"); const roleId = getCookiesDecrypt("urie");
const columns = useTableColumns();
const table = useReactTable({ const table = useReactTable({
data: spitTable, data: spitTable,
columns, columns,

View File

@ -17,11 +17,15 @@ import { error } from "@/lib/swal";
import { deleteMedia } from "@/service/content/content"; import { deleteMedia } from "@/service/content/content";
import withReactContent from "sweetalert2-react-content"; import withReactContent from "sweetalert2-react-content";
import Swal from "sweetalert2"; import Swal from "sweetalert2";
import { useTranslations } from "next-intl";
const columns: ColumnDef<any>[] = [ const useTableColumns = () => {
const t = useTranslations("Table"); // Panggil di dalam hook
const MySwal = withReactContent(Swal);
const columns: ColumnDef<any>[] = [
{ {
accessorKey: "no", accessorKey: "no",
header: "No", header: t("no"),
cell: ({ row }) => ( cell: ({ row }) => (
<div className="flex items-center gap-5"> <div className="flex items-center gap-5">
<div className="flex-1 text-start"> <div className="flex-1 text-start">
@ -34,7 +38,7 @@ const columns: ColumnDef<any>[] = [
}, },
{ {
accessorKey: "title", accessorKey: "title",
header: "Title", header: t("title"),
cell: ({ row }: { row: { getValue: (key: string) => string } }) => { cell: ({ row }: { row: { getValue: (key: string) => string } }) => {
const title: string = row.getValue("title"); const title: string = row.getValue("title");
return ( return (
@ -46,14 +50,16 @@ const columns: ColumnDef<any>[] = [
}, },
{ {
accessorKey: "categoryName", accessorKey: "categoryName",
header: "Category Name", header: t("category-name"),
cell: ({ row }) => ( cell: ({ row }) => (
<span className="whitespace-nowrap">{row.getValue("categoryName")}</span> <span className="whitespace-nowrap">
{row.getValue("categoryName")}
</span>
), ),
}, },
{ {
accessorKey: "createdAt", accessorKey: "createdAt",
header: "Upload Date", header: t("upload-date"),
cell: ({ row }) => { cell: ({ row }) => {
const createdAt = row.getValue("createdAt") as const createdAt = row.getValue("createdAt") as
| string | string
@ -69,14 +75,14 @@ const columns: ColumnDef<any>[] = [
}, },
{ {
accessorKey: "creatorName", accessorKey: "creatorName",
header: "Creator Group", header: t("creator-group"),
cell: ({ row }) => ( cell: ({ row }) => (
<span className="whitespace-nowrap">{row.getValue("creatorName")}</span> <span className="whitespace-nowrap">{row.getValue("creatorName")}</span>
), ),
}, },
{ {
accessorKey: "creatorGroupLevelName", accessorKey: "creatorGroupLevelName",
header: "Sumber", header: t("source"),
cell: ({ row }) => ( cell: ({ row }) => (
<span className="whitespace-nowrap"> <span className="whitespace-nowrap">
{row.getValue("creatorGroupLevelName")} {row.getValue("creatorGroupLevelName")}
@ -85,7 +91,7 @@ const columns: ColumnDef<any>[] = [
}, },
{ {
accessorKey: "publishedOn", accessorKey: "publishedOn",
header: "Published", header: t("published"),
cell: ({ row }) => { cell: ({ row }) => {
const isPublish = row.original.isPublish; const isPublish = row.original.isPublish;
const isPublishOnPolda = row.original.isPublishOnPolda; const isPublishOnPolda = row.original.isPublishOnPolda;
@ -139,7 +145,7 @@ const columns: ColumnDef<any>[] = [
{ {
id: "actions", id: "actions",
accessorKey: "action", accessorKey: "action",
header: "Actions", header: t("action"),
enableHiding: false, enableHiding: false,
cell: ({ row }) => { cell: ({ row }) => {
const MySwal = withReactContent(Swal); const MySwal = withReactContent(Swal);
@ -199,13 +205,17 @@ const columns: ColumnDef<any>[] = [
</Button> </Button>
</DropdownMenuTrigger> </DropdownMenuTrigger>
<DropdownMenuContent className="p-0" align="end"> <DropdownMenuContent className="p-0" align="end">
<Link href={`/contributor/content/teks/detail/${row.original.id}`}> <Link
href={`/contributor/content/teks/detail/${row.original.id}`}
>
<DropdownMenuItem className="p-2 border-b text-default-700 group focus:bg-default focus:text-primary-foreground rounded-none"> <DropdownMenuItem className="p-2 border-b text-default-700 group focus:bg-default focus:text-primary-foreground rounded-none">
<Eye className="w-4 h-4 me-1.5" /> <Eye className="w-4 h-4 me-1.5" />
View View
</DropdownMenuItem> </DropdownMenuItem>
</Link> </Link>
<Link href={`/contributor/content/teks/update/${row.original.id}`}> <Link
href={`/contributor/content/teks/update/${row.original.id}`}
>
<DropdownMenuItem className="p-2 border-b text-default-700 group focus:bg-default focus:text-primary-foreground rounded-none"> <DropdownMenuItem className="p-2 border-b text-default-700 group focus:bg-default focus:text-primary-foreground rounded-none">
<SquarePen className="w-4 h-4 me-1.5" /> <SquarePen className="w-4 h-4 me-1.5" />
Edit Edit
@ -223,6 +233,8 @@ const columns: ColumnDef<any>[] = [
); );
}, },
}, },
]; ];
return columns;
};
export default columns; export default useTableColumns;

View File

@ -60,6 +60,7 @@ import {
} from "@/service/content/content"; } from "@/service/content/content";
import { Label } from "@/components/ui/label"; import { Label } from "@/components/ui/label";
import { format } from "date-fns"; import { format } from "date-fns";
import useTableColumns from "./columns";
const TableTeks = () => { const TableTeks = () => {
const router = useRouter(); const router = useRouter();
@ -98,7 +99,7 @@ const TableTeks = () => {
const [filterByCreatorGroup, setFilterByCreatorGroup] = React.useState(""); const [filterByCreatorGroup, setFilterByCreatorGroup] = React.useState("");
const roleId = getCookiesDecrypt("urie"); const roleId = getCookiesDecrypt("urie");
const columns = useTableColumns();
const table = useReactTable({ const table = useReactTable({
data: dataTable, data: dataTable,
columns, columns,

View File

@ -17,11 +17,16 @@ import { deleteMedia } from "@/service/content/content";
import Swal from "sweetalert2"; import Swal from "sweetalert2";
import withReactContent from "sweetalert2-react-content"; import withReactContent from "sweetalert2-react-content";
import { error } from "@/lib/swal"; import { error } from "@/lib/swal";
import { useTranslations } from "next-intl";
const columns: ColumnDef<any>[] = [ const useTableColumns = () => {
const t = useTranslations("Table"); // Panggil di dalam hook
const MySwal = withReactContent(Swal);
const columns: ColumnDef<any>[] = [
{ {
accessorKey: "no", accessorKey: "no",
header: "No", header: t("no"),
cell: ({ row }) => ( cell: ({ row }) => (
<div className="flex items-center gap-5"> <div className="flex items-center gap-5">
<div className="flex-1 text-start"> <div className="flex-1 text-start">
@ -34,7 +39,7 @@ const columns: ColumnDef<any>[] = [
}, },
{ {
accessorKey: "title", accessorKey: "title",
header: "Title", header: t("title"),
cell: ({ row }: { row: { getValue: (key: string) => string } }) => { cell: ({ row }: { row: { getValue: (key: string) => string } }) => {
const title: string = row.getValue("title"); const title: string = row.getValue("title");
return ( return (
@ -46,14 +51,16 @@ const columns: ColumnDef<any>[] = [
}, },
{ {
accessorKey: "categoryName", accessorKey: "categoryName",
header: "Category Name", header: t("category-name"),
cell: ({ row }) => ( cell: ({ row }) => (
<span className="whitespace-nowrap">{row.getValue("categoryName")}</span> <span className="whitespace-nowrap">
{row.getValue("categoryName")}
</span>
), ),
}, },
{ {
accessorKey: "createdAt", accessorKey: "createdAt",
header: "Upload Date", header: t("upload-date"),
cell: ({ row }) => { cell: ({ row }) => {
const createdAt = row.getValue("createdAt") as const createdAt = row.getValue("createdAt") as
| string | string
@ -69,14 +76,14 @@ const columns: ColumnDef<any>[] = [
}, },
{ {
accessorKey: "creatorName", accessorKey: "creatorName",
header: "Creator Group", header: t("creator-group"),
cell: ({ row }) => ( cell: ({ row }) => (
<span className="whitespace-nowrap">{row.getValue("creatorName")}</span> <span className="whitespace-nowrap">{row.getValue("creatorName")}</span>
), ),
}, },
{ {
accessorKey: "creatorGroupLevelName", accessorKey: "creatorGroupLevelName",
header: "Sumber", header: t("source"),
cell: ({ row }) => ( cell: ({ row }) => (
<span className="whitespace-nowrap"> <span className="whitespace-nowrap">
{row.getValue("creatorGroupLevelName")} {row.getValue("creatorGroupLevelName")}
@ -85,7 +92,7 @@ const columns: ColumnDef<any>[] = [
}, },
{ {
accessorKey: "publishedOn", accessorKey: "publishedOn",
header: "Published", header: t("published"),
cell: ({ row }) => { cell: ({ row }) => {
const isPublish = row.original.isPublish; const isPublish = row.original.isPublish;
const isPublishOnPolda = row.original.isPublishOnPolda; const isPublishOnPolda = row.original.isPublishOnPolda;
@ -136,7 +143,7 @@ const columns: ColumnDef<any>[] = [
{ {
id: "actions", id: "actions",
accessorKey: "action", accessorKey: "action",
header: "Actions", header: t("action"),
enableHiding: false, enableHiding: false,
cell: ({ row }) => { cell: ({ row }) => {
const MySwal = withReactContent(Swal); const MySwal = withReactContent(Swal);
@ -196,13 +203,17 @@ const columns: ColumnDef<any>[] = [
</Button> </Button>
</DropdownMenuTrigger> </DropdownMenuTrigger>
<DropdownMenuContent className="p-0" align="end"> <DropdownMenuContent className="p-0" align="end">
<Link href={`/contributor/content/video/detail/${row.original.id}`}> <Link
href={`/contributor/content/video/detail/${row.original.id}`}
>
<DropdownMenuItem className="p-2 border-b text-default-700 group focus:bg-default focus:text-primary-foreground rounded-none"> <DropdownMenuItem className="p-2 border-b text-default-700 group focus:bg-default focus:text-primary-foreground rounded-none">
<Eye className="w-4 h-4 me-1.5" /> <Eye className="w-4 h-4 me-1.5" />
View View
</DropdownMenuItem> </DropdownMenuItem>
</Link> </Link>
<Link href={`/contributor/content/video/update/${row.original.id}`}> <Link
href={`/contributor/content/video/update/${row.original.id}`}
>
<DropdownMenuItem className="p-2 border-b text-default-700 group focus:bg-default focus:text-primary-foreground rounded-none"> <DropdownMenuItem className="p-2 border-b text-default-700 group focus:bg-default focus:text-primary-foreground rounded-none">
<SquarePen className="w-4 h-4 me-1.5" /> <SquarePen className="w-4 h-4 me-1.5" />
Edit Edit
@ -220,6 +231,9 @@ const columns: ColumnDef<any>[] = [
); );
}, },
}, },
]; ];
export default columns; return columns;
};
export default useTableColumns;

View File

@ -60,6 +60,7 @@ import {
} from "@/service/content/content"; } from "@/service/content/content";
import { Label } from "@/components/ui/label"; import { Label } from "@/components/ui/label";
import { format } from "date-fns"; import { format } from "date-fns";
import useTableColumns from "./columns";
const TableVideo = () => { const TableVideo = () => {
const router = useRouter(); const router = useRouter();
@ -98,7 +99,7 @@ const TableVideo = () => {
const [filterByCreatorGroup, setFilterByCreatorGroup] = React.useState(""); const [filterByCreatorGroup, setFilterByCreatorGroup] = React.useState("");
const roleId = getCookiesDecrypt("urie"); const roleId = getCookiesDecrypt("urie");
const columns = useTableColumns();
const table = useReactTable({ const table = useReactTable({
data: dataTable, data: dataTable,
columns, columns,

View File

@ -13,11 +13,14 @@ import { Button } from "@/components/ui/button";
import { Badge } from "@/components/ui/badge"; import { Badge } from "@/components/ui/badge";
import { format } from "date-fns"; import { format } from "date-fns";
import { Link } from "@/components/navigation"; import { Link } from "@/components/navigation";
import { useTranslations } from "next-intl";
const columns: ColumnDef<any>[] = [ const useTableColumns = () => {
const t = useTranslations("Table"); // Panggil di dalam hook
const columns: ColumnDef<any>[] = [
{ {
accessorKey: "no", accessorKey: "no",
header: "No", header: t("no"),
cell: ({ row }) => ( cell: ({ row }) => (
<div className="flex items-center gap-5"> <div className="flex items-center gap-5">
<div className="flex-1 text-start"> <div className="flex-1 text-start">
@ -30,7 +33,7 @@ const columns: ColumnDef<any>[] = [
}, },
{ {
accessorKey: "title", accessorKey: "title",
header: "Judul", header: t("title"),
cell: ({ row }) => ( cell: ({ row }) => (
<div className="flex items-center gap-5"> <div className="flex items-center gap-5">
<div className="flex-1 text-start"> <div className="flex-1 text-start">
@ -43,7 +46,7 @@ const columns: ColumnDef<any>[] = [
}, },
{ {
accessorKey: "createdAt", accessorKey: "createdAt",
header: "Tanggal Unggah ", header: t("upload-date"),
cell: ({ row }) => { cell: ({ row }) => {
const createdAt = row.getValue("createdAt") as const createdAt = row.getValue("createdAt") as
| string | string
@ -77,7 +80,7 @@ const columns: ColumnDef<any>[] = [
{ {
id: "actions", id: "actions",
accessorKey: "action", accessorKey: "action",
header: "Actions", header: t("action"),
enableHiding: false, enableHiding: false,
cell: ({ row }) => { cell: ({ row }) => {
return ( return (
@ -112,6 +115,9 @@ const columns: ColumnDef<any>[] = [
); );
}, },
}, },
]; ];
export default columns; return columns;
};
export default useTableColumns;

View File

@ -55,6 +55,7 @@ import { getPlanningSentPagination } from "@/service/planning/planning";
import search from "@/app/[locale]/(protected)/app/chat/components/search"; import search from "@/app/[locale]/(protected)/app/chat/components/search";
import { CardHeader, CardTitle } from "@/components/ui/card"; import { CardHeader, CardTitle } from "@/components/ui/card";
import { useTranslations } from "next-intl"; import { useTranslations } from "next-intl";
import useTableColumns from "./columns";
const MediahubTable = () => { const MediahubTable = () => {
const t = useTranslations("Planning"); const t = useTranslations("Planning");
@ -78,7 +79,7 @@ const MediahubTable = () => {
const [totalPage, setTotalPage] = React.useState(1); const [totalPage, setTotalPage] = React.useState(1);
const [limit, setLimit] = React.useState(10); const [limit, setLimit] = React.useState(10);
const [search, setSearch] = React.useState(""); const [search, setSearch] = React.useState("");
const columns = useTableColumns();
const table = useReactTable({ const table = useReactTable({
data: dataTable, data: dataTable,
columns, columns,

View File

@ -13,11 +13,14 @@ import { Button } from "@/components/ui/button";
import { Badge } from "@/components/ui/badge"; import { Badge } from "@/components/ui/badge";
import { format } from "date-fns"; import { format } from "date-fns";
import { Link } from "@/components/navigation"; import { Link } from "@/components/navigation";
import { useTranslations } from "next-intl";
const columns: ColumnDef<any>[] = [ const useTableColumns = () => {
const t = useTranslations("Table"); // Panggil di dalam hook
const columns: ColumnDef<any>[] = [
{ {
accessorKey: "no", accessorKey: "no",
header: "No", header: t("no"),
cell: ({ row }) => ( cell: ({ row }) => (
<div className="flex items-center gap-5"> <div className="flex items-center gap-5">
<div className="flex-1 text-start"> <div className="flex-1 text-start">
@ -30,7 +33,7 @@ const columns: ColumnDef<any>[] = [
}, },
{ {
accessorKey: "title", accessorKey: "title",
header: "Judul", header: t("title"),
cell: ({ row }) => ( cell: ({ row }) => (
<div className="flex items-center gap-5"> <div className="flex items-center gap-5">
<div className="flex-1 text-start"> <div className="flex-1 text-start">
@ -43,7 +46,7 @@ const columns: ColumnDef<any>[] = [
}, },
{ {
accessorKey: "createdAt", accessorKey: "createdAt",
header: "Tanggal Unggah ", header: t("upload-date"),
cell: ({ row }) => { cell: ({ row }) => {
const createdAt = row.getValue("createdAt") as const createdAt = row.getValue("createdAt") as
| string | string
@ -77,7 +80,7 @@ const columns: ColumnDef<any>[] = [
{ {
id: "actions", id: "actions",
accessorKey: "action", accessorKey: "action",
header: "Actions", header: t("action"),
enableHiding: false, enableHiding: false,
cell: ({ row }) => { cell: ({ row }) => {
return ( return (
@ -110,6 +113,9 @@ const columns: ColumnDef<any>[] = [
); );
}, },
}, },
]; ];
export default columns; return columns;
};
export default useTableColumns;

View File

@ -54,6 +54,7 @@ import columns from "./columns";
import { getPlanningSentPagination } from "@/service/planning/planning"; import { getPlanningSentPagination } from "@/service/planning/planning";
import { CardHeader, CardTitle } from "@/components/ui/card"; import { CardHeader, CardTitle } from "@/components/ui/card";
import { useTranslations } from "next-intl"; import { useTranslations } from "next-intl";
import useTableColumns from "./columns";
const MedsosTable = () => { const MedsosTable = () => {
const t = useTranslations("Planning"); const t = useTranslations("Planning");
@ -77,7 +78,7 @@ const MedsosTable = () => {
const [totalPage, setTotalPage] = React.useState(1); const [totalPage, setTotalPage] = React.useState(1);
const [limit, setLimit] = React.useState(10); const [limit, setLimit] = React.useState(10);
const [search, setSearch] = React.useState(""); const [search, setSearch] = React.useState("");
const columns = useTableColumns();
const table = useReactTable({ const table = useReactTable({
data: dataTable, data: dataTable,
columns, columns,

View File

@ -12,11 +12,15 @@ import {
import { Button } from "@/components/ui/button"; import { Button } from "@/components/ui/button";
import { Badge } from "@/components/ui/badge"; import { Badge } from "@/components/ui/badge";
import { Link } from "@/components/navigation"; import { Link } from "@/components/navigation";
import { useTranslations } from "next-intl";
const columns: ColumnDef<any>[] = [ const useTableColumns = () => {
const t = useTranslations("Table"); // Panggil di dalam hook
const columns: ColumnDef<any>[] = [
{ {
accessorKey: "no", accessorKey: "no",
header: "No", header: t("no"),
cell: ({ row }) => ( cell: ({ row }) => (
<div className="flex items-center gap-5"> <div className="flex items-center gap-5">
<div className="flex-1 text-start"> <div className="flex-1 text-start">
@ -30,7 +34,7 @@ const columns: ColumnDef<any>[] = [
{ {
accessorKey: "title", accessorKey: "title",
header: "Title", header: t("title"),
cell: ({ row }: { row: { getValue: (key: string) => string } }) => { cell: ({ row }: { row: { getValue: (key: string) => string } }) => {
const title: string = row.getValue("title"); const title: string = row.getValue("title");
return ( return (
@ -42,21 +46,21 @@ const columns: ColumnDef<any>[] = [
}, },
{ {
accessorKey: "startDate", accessorKey: "startDate",
header: "Start Date ", header: t("start-date"),
cell: ({ row }) => ( cell: ({ row }) => (
<span className="whitespace-nowrap">{row.getValue("startDate")}</span> <span className="whitespace-nowrap">{row.getValue("startDate")}</span>
), ),
}, },
{ {
accessorKey: "endDate", accessorKey: "endDate",
header: "End Date", header: t("end-date"),
cell: ({ row }) => ( cell: ({ row }) => (
<span className="whitespace-nowrap">{row.getValue("endDate")}</span> <span className="whitespace-nowrap">{row.getValue("endDate")}</span>
), ),
}, },
{ {
accessorKey: "time", accessorKey: "time",
header: "Time", header: t("time"),
cell: ({ row }: { row: { original: any } }) => { cell: ({ row }: { row: { original: any } }) => {
console.log("Row Original Data:", row.original); console.log("Row Original Data:", row.original);
const { startTime, endTime } = row.original; const { startTime, endTime } = row.original;
@ -69,7 +73,7 @@ const columns: ColumnDef<any>[] = [
}, },
{ {
accessorKey: "address", accessorKey: "address",
header: "Address", header: t("address"),
cell: ({ row }: { row: { getValue: (key: string) => string } }) => { cell: ({ row }: { row: { getValue: (key: string) => string } }) => {
const address: string = row.getValue("address"); const address: string = row.getValue("address");
return ( return (
@ -107,7 +111,7 @@ const columns: ColumnDef<any>[] = [
}, },
{ {
accessorKey: "speaker", accessorKey: "speaker",
header: "Disampaikan oleh", header: t("speaker"),
cell: ({ row }: { row: { original: any } }) => { cell: ({ row }: { row: { original: any } }) => {
console.log("Row Original Data:", row.original); console.log("Row Original Data:", row.original);
const { speakerTitle, speakerName } = row.original; const { speakerTitle, speakerName } = row.original;
@ -120,16 +124,18 @@ const columns: ColumnDef<any>[] = [
}, },
{ {
accessorKey: "uploaderName", accessorKey: "uploaderName",
header: "Sumber ", header: t("source"),
cell: ({ row }) => ( cell: ({ row }) => (
<span className="whitespace-nowrap">{row.getValue("uploaderName")}</span> <span className="whitespace-nowrap">
{row.getValue("uploaderName")}
</span>
), ),
}, },
{ {
id: "actions", id: "actions",
accessorKey: "action", accessorKey: "action",
header: "Actions", header: t("action"),
enableHiding: false, enableHiding: false,
cell: ({ row }) => { cell: ({ row }) => {
return ( return (
@ -169,6 +175,8 @@ const columns: ColumnDef<any>[] = [
); );
}, },
}, },
]; ];
return columns;
};
export default columns; export default useTableColumns;

View File

@ -33,6 +33,7 @@ import { useTranslations } from "next-intl";
import { CardHeader, CardTitle } from "@/components/ui/card"; import { CardHeader, CardTitle } from "@/components/ui/card";
import { Link } from "@/i18n/routing"; import { Link } from "@/i18n/routing";
import { Button } from "@/components/ui/button"; import { Button } from "@/components/ui/button";
import useTableColumns from "./columns";
const EventTable = () => { const EventTable = () => {
const router = useRouter(); const router = useRouter();
@ -55,7 +56,7 @@ const EventTable = () => {
const [totalPage, setTotalPage] = React.useState(1); const [totalPage, setTotalPage] = React.useState(1);
const [limit, setLimit] = React.useState(10); const [limit, setLimit] = React.useState(10);
const [search, setSearch] = React.useState<string>(""); const [search, setSearch] = React.useState<string>("");
const columns = useTableColumns();
const table = useReactTable({ const table = useReactTable({
data: dataTable, data: dataTable,
columns, columns,

View File

@ -12,11 +12,15 @@ import {
import { Button } from "@/components/ui/button"; import { Button } from "@/components/ui/button";
import { Badge } from "@/components/ui/badge"; import { Badge } from "@/components/ui/badge";
import { Link } from "@/components/navigation"; import { Link } from "@/components/navigation";
import { useTranslations } from "next-intl";
const columns: ColumnDef<any>[] = [ const useTableColumns = () => {
const t = useTranslations("Table"); // Panggil di dalam hook
const columns: ColumnDef<any>[] = [
{ {
accessorKey: "no", accessorKey: "no",
header: "No", header: t("no"),
cell: ({ row }) => ( cell: ({ row }) => (
<div className="flex items-center gap-5"> <div className="flex items-center gap-5">
<div className="flex-1 text-start"> <div className="flex-1 text-start">
@ -30,7 +34,7 @@ const columns: ColumnDef<any>[] = [
{ {
accessorKey: "title", accessorKey: "title",
header: "Title", header: t("title"),
cell: ({ row }: { row: { getValue: (key: string) => string } }) => { cell: ({ row }: { row: { getValue: (key: string) => string } }) => {
const title: string = row.getValue("title"); const title: string = row.getValue("title");
return ( return (
@ -42,21 +46,21 @@ const columns: ColumnDef<any>[] = [
}, },
{ {
accessorKey: "startDate", accessorKey: "startDate",
header: "Start Date ", header: t("start-date"),
cell: ({ row }) => ( cell: ({ row }) => (
<span className="whitespace-nowrap">{row.getValue("startDate")}</span> <span className="whitespace-nowrap">{row.getValue("startDate")}</span>
), ),
}, },
{ {
accessorKey: "endDate", accessorKey: "endDate",
header: "End Date", header: t("end-date"),
cell: ({ row }) => ( cell: ({ row }) => (
<span className="whitespace-nowrap">{row.getValue("endDate")}</span> <span className="whitespace-nowrap">{row.getValue("endDate")}</span>
), ),
}, },
{ {
accessorKey: "time", accessorKey: "time",
header: "Time", header: t("time"),
cell: ({ row }: { row: { original: any } }) => { cell: ({ row }: { row: { original: any } }) => {
console.log("Row Original Data:", row.original); console.log("Row Original Data:", row.original);
const { startTime, endTime } = row.original; const { startTime, endTime } = row.original;
@ -69,7 +73,7 @@ const columns: ColumnDef<any>[] = [
}, },
{ {
accessorKey: "address", accessorKey: "address",
header: "Address", header: t("address"),
cell: ({ row }: { row: { getValue: (key: string) => string } }) => { cell: ({ row }: { row: { getValue: (key: string) => string } }) => {
const address: string = row.getValue("address"); const address: string = row.getValue("address");
return ( return (
@ -107,7 +111,7 @@ const columns: ColumnDef<any>[] = [
}, },
{ {
accessorKey: "speaker", accessorKey: "speaker",
header: "Disampaikan oleh", header: t("speaker"),
cell: ({ row }: { row: { original: any } }) => { cell: ({ row }: { row: { original: any } }) => {
console.log("Row Original Data:", row.original); console.log("Row Original Data:", row.original);
const { speakerTitle, speakerName } = row.original; const { speakerTitle, speakerName } = row.original;
@ -120,16 +124,18 @@ const columns: ColumnDef<any>[] = [
}, },
{ {
accessorKey: "uploaderName", accessorKey: "uploaderName",
header: "Sumber ", header: t("source"),
cell: ({ row }) => ( cell: ({ row }) => (
<span className="whitespace-nowrap">{row.getValue("uploaderName")}</span> <span className="whitespace-nowrap">
{row.getValue("uploaderName")}
</span>
), ),
}, },
{ {
id: "actions", id: "actions",
accessorKey: "action", accessorKey: "action",
header: "Actions", header: t("action"),
enableHiding: false, enableHiding: false,
cell: ({ row }) => { cell: ({ row }) => {
return ( return (
@ -169,6 +175,9 @@ const columns: ColumnDef<any>[] = [
); );
}, },
}, },
]; ];
export default columns; return columns;
};
export default useTableColumns;

View File

@ -46,6 +46,7 @@ import { paginationSchedule } from "@/service/schedule/schedule";
import { CardHeader, CardTitle } from "@/components/ui/card"; import { CardHeader, CardTitle } from "@/components/ui/card";
import { Link } from "@/i18n/routing"; import { Link } from "@/i18n/routing";
import { useTranslations } from "next-intl"; import { useTranslations } from "next-intl";
import useTableColumns from "./columns";
const PressConferenceTable = () => { const PressConferenceTable = () => {
const router = useRouter(); const router = useRouter();
@ -68,7 +69,7 @@ const PressConferenceTable = () => {
const [totalPage, setTotalPage] = React.useState(1); const [totalPage, setTotalPage] = React.useState(1);
const [limit, setLimit] = React.useState(10); const [limit, setLimit] = React.useState(10);
const [search, setSearch] = React.useState<string>(""); const [search, setSearch] = React.useState<string>("");
const columns = useTableColumns();
const table = useReactTable({ const table = useReactTable({
data: dataTable, data: dataTable,
columns, columns,

View File

@ -12,11 +12,15 @@ import {
import { Button } from "@/components/ui/button"; import { Button } from "@/components/ui/button";
import { Badge } from "@/components/ui/badge"; import { Badge } from "@/components/ui/badge";
import { Link } from "@/components/navigation"; import { Link } from "@/components/navigation";
import { useTranslations } from "next-intl";
const columns: ColumnDef<any>[] = [ const useTableColumns = () => {
const t = useTranslations("Table"); // Panggil di dalam hook
const columns: ColumnDef<any>[] = [
{ {
accessorKey: "no", accessorKey: "no",
header: "No", header: t("no"),
cell: ({ row }) => ( cell: ({ row }) => (
<div className="flex items-center gap-5"> <div className="flex items-center gap-5">
<div className="flex-1 text-start"> <div className="flex-1 text-start">
@ -30,7 +34,7 @@ const columns: ColumnDef<any>[] = [
{ {
accessorKey: "title", accessorKey: "title",
header: "Title", header: t("title"),
cell: ({ row }: { row: { getValue: (key: string) => string } }) => { cell: ({ row }: { row: { getValue: (key: string) => string } }) => {
const title: string = row.getValue("title"); const title: string = row.getValue("title");
return ( return (
@ -42,21 +46,21 @@ const columns: ColumnDef<any>[] = [
}, },
{ {
accessorKey: "startDate", accessorKey: "startDate",
header: "Start Date ", header: t("start-date"),
cell: ({ row }) => ( cell: ({ row }) => (
<span className="whitespace-nowrap">{row.getValue("startDate")}</span> <span className="whitespace-nowrap">{row.getValue("startDate")}</span>
), ),
}, },
{ {
accessorKey: "endDate", accessorKey: "endDate",
header: "End Date", header: t("end-date"),
cell: ({ row }) => ( cell: ({ row }) => (
<span className="whitespace-nowrap">{row.getValue("endDate")}</span> <span className="whitespace-nowrap">{row.getValue("endDate")}</span>
), ),
}, },
{ {
accessorKey: "time", accessorKey: "time",
header: "Time", header: t("time"),
cell: ({ row }: { row: { original: any } }) => { cell: ({ row }: { row: { original: any } }) => {
console.log("Row Original Data:", row.original); console.log("Row Original Data:", row.original);
const { startTime, endTime } = row.original; const { startTime, endTime } = row.original;
@ -69,7 +73,7 @@ const columns: ColumnDef<any>[] = [
}, },
{ {
accessorKey: "address", accessorKey: "address",
header: "Address", header: t("address"),
cell: ({ row }: { row: { getValue: (key: string) => string } }) => { cell: ({ row }: { row: { getValue: (key: string) => string } }) => {
const address: string = row.getValue("address"); const address: string = row.getValue("address");
return ( return (
@ -107,7 +111,7 @@ const columns: ColumnDef<any>[] = [
}, },
{ {
accessorKey: "speaker", accessorKey: "speaker",
header: "Disampaikan oleh", header: t("speaker"),
cell: ({ row }: { row: { original: any } }) => { cell: ({ row }: { row: { original: any } }) => {
console.log("Row Original Data:", row.original); console.log("Row Original Data:", row.original);
const { speakerTitle, speakerName } = row.original; const { speakerTitle, speakerName } = row.original;
@ -120,16 +124,18 @@ const columns: ColumnDef<any>[] = [
}, },
{ {
accessorKey: "uploaderName", accessorKey: "uploaderName",
header: "Sumber ", header: t("source"),
cell: ({ row }) => ( cell: ({ row }) => (
<span className="whitespace-nowrap">{row.getValue("uploaderName")}</span> <span className="whitespace-nowrap">
{row.getValue("uploaderName")}
</span>
), ),
}, },
{ {
id: "actions", id: "actions",
accessorKey: "action", accessorKey: "action",
header: "Actions", header: t("action"),
enableHiding: false, enableHiding: false,
cell: ({ row }) => { cell: ({ row }) => {
return ( return (
@ -169,6 +175,9 @@ const columns: ColumnDef<any>[] = [
); );
}, },
}, },
]; ];
export default columns; return columns;
};
export default useTableColumns;

View File

@ -47,6 +47,7 @@ import { paginationSchedule } from "@/service/schedule/schedule";
import { useTranslations } from "next-intl"; import { useTranslations } from "next-intl";
import { CardHeader, CardTitle } from "@/components/ui/card"; import { CardHeader, CardTitle } from "@/components/ui/card";
import { Link } from "@/i18n/routing"; import { Link } from "@/i18n/routing";
import useTableColumns from "./columns";
const PressReleaseTable = () => { const PressReleaseTable = () => {
const router = useRouter(); const router = useRouter();
@ -69,7 +70,7 @@ const PressReleaseTable = () => {
const [totalPage, setTotalPage] = React.useState(1); const [totalPage, setTotalPage] = React.useState(1);
const [limit, setLimit] = React.useState(10); const [limit, setLimit] = React.useState(10);
const [search, setSearch] = React.useState<string>(""); const [search, setSearch] = React.useState<string>("");
const columns = useTableColumns();
const table = useReactTable({ const table = useReactTable({
data: dataTable, data: dataTable,
columns, columns,

View File

@ -20,16 +20,19 @@ import { deleteTask } from "@/service/task";
import { error, loading } from "@/lib/swal"; import { error, loading } from "@/lib/swal";
import withReactContent from "sweetalert2-react-content"; import withReactContent from "sweetalert2-react-content";
import Swal from "sweetalert2"; import Swal from "sweetalert2";
import { useTranslations } from "next-intl";
const columns: ColumnDef<any>[] = [ const useTableColumns = () => {
const t = useTranslations("Table"); // Panggil di dalam hook
const columns: ColumnDef<any>[] = [
{ {
accessorKey: "no", accessorKey: "no",
header: "No", header: t("no"),
cell: ({ row }) => <span>{row.getValue("no")}</span>, cell: ({ row }) => <span>{row.getValue("no")}</span>,
}, },
{ {
accessorKey: "title", accessorKey: "title",
header: "Title", header: t("title"),
cell: ({ row }) => ( cell: ({ row }) => (
<div> <div>
<span>{row.getValue("title")}</span> <span>{row.getValue("title")}</span>
@ -49,13 +52,13 @@ const columns: ColumnDef<any>[] = [
{ {
accessorKey: "uniqueCode", accessorKey: "uniqueCode",
header: "Code", header: t("code"),
cell: ({ row }) => <span>{row.getValue("uniqueCode")}</span>, cell: ({ row }) => <span>{row.getValue("uniqueCode")}</span>,
}, },
{ {
accessorKey: "assignmentMainType", accessorKey: "assignmentMainType",
header: "Type Task", header: t("type-task"),
cell: ({ row }) => { cell: ({ row }) => {
const type = row.getValue("assignmentMainType") as { name: string }; const type = row.getValue("assignmentMainType") as { name: string };
return <span>{type?.name}</span>; return <span>{type?.name}</span>;
@ -63,7 +66,7 @@ const columns: ColumnDef<any>[] = [
}, },
{ {
accessorKey: "assignmentType", accessorKey: "assignmentType",
header: "Category Task", header: t("category-task"),
cell: ({ row }) => { cell: ({ row }) => {
const type = row.getValue("assignmentType") as { name: string }; const type = row.getValue("assignmentType") as { name: string };
return <span>{type?.name}</span>; return <span>{type?.name}</span>;
@ -71,7 +74,7 @@ const columns: ColumnDef<any>[] = [
}, },
{ {
accessorKey: "createdAt", accessorKey: "createdAt",
header: "Upload Date ", header: t("upload-date"),
cell: ({ row }) => { cell: ({ row }) => {
const createdAt = row.getValue("createdAt") as const createdAt = row.getValue("createdAt") as
| string | string
@ -119,7 +122,7 @@ const columns: ColumnDef<any>[] = [
{ {
id: "actions", id: "actions",
accessorKey: "action", accessorKey: "action",
header: "Actions", header: t("action"),
enableHiding: false, enableHiding: false,
cell: ({ row }) => { cell: ({ row }) => {
const router = useRouter(); const router = useRouter();
@ -201,6 +204,9 @@ const columns: ColumnDef<any>[] = [
); );
}, },
}, },
]; ];
export default columns; return columns;
};
export default useTableColumns;

View File

@ -56,6 +56,7 @@ import { listTask } from "@/service/task";
import { Label } from "@/components/ui/label"; import { Label } from "@/components/ui/label";
import { format } from "date-fns"; import { format } from "date-fns";
import { useTranslations } from "next-intl"; import { useTranslations } from "next-intl";
import useTableColumns from "./columns";
const TaskTable = () => { const TaskTable = () => {
const router = useRouter(); const router = useRouter();
@ -83,7 +84,7 @@ const TaskTable = () => {
const [limit, setLimit] = React.useState(10); const [limit, setLimit] = React.useState(10);
const [isSpecificAttention, setIsSpecificAttention] = React.useState(true); const [isSpecificAttention, setIsSpecificAttention] = React.useState(true);
const [search, setSearch] = React.useState<string>(""); const [search, setSearch] = React.useState<string>("");
const columns = useTableColumns();
const table = useReactTable({ const table = useReactTable({
data: dataTable, data: dataTable,
columns, columns,

View File

@ -250,35 +250,6 @@ export default function ExecutiveDashboard() {
return ( return (
<div> <div>
<SiteBreadcrumb /> <SiteBreadcrumb />
<Dialog>
<DialogTrigger asChild>
<Button variant="outline">Download Report</Button>
</DialogTrigger>
<DialogContent className="sm:max-w-[425px]">
<DialogHeader>
<DialogTitle>Download Report</DialogTitle>
</DialogHeader>
<div className="grid gap-4 py-4">
<div className="w-full">
<Label>Date</Label>
<Input
type="date"
// value={dateFilter}
// onChange={(e) => setDateFilter(e.target.value)}
className="w-full"
/>
</div>
</div>
<DialogFooter>
<Button
type="submit"
// onClick={downloadReport}
>
Download
</Button>
</DialogFooter>
</DialogContent>
</Dialog>
<div className="mt-3 flex flex-row gap-3 justify-center"> <div className="mt-3 flex flex-row gap-3 justify-center">
<Card className="rounded-sm w-4/12 p-3"> <Card className="rounded-sm w-4/12 p-3">
<div className="flex flex-row justify-between"> <div className="flex flex-row justify-between">
@ -412,7 +383,7 @@ export default function ExecutiveDashboard() {
</Card> </Card>
</div> </div>
<div className="w-full mt-3"> <div className="w-full mt-3">
<Card className="rounded-sm p-3 h-[300px]"> <Card className="rounded-sm p-3 h-auto">
<div className="flex flex-row justify-between"> <div className="flex flex-row justify-between">
<p className="text-base font-semibold">Emergency Issue</p> <p className="text-base font-semibold">Emergency Issue</p>
<LucideBoxSelect /> <LucideBoxSelect />

View File

@ -63,6 +63,7 @@ import {
getTicketingEscalationPagination, getTicketingEscalationPagination,
listTicketingInternal, listTicketingInternal,
} from "@/service/communication/communication"; } from "@/service/communication/communication";
import useTableColumns from "./columns";
const CollaborationTable = () => { const CollaborationTable = () => {
const router = useRouter(); const router = useRouter();
@ -88,7 +89,7 @@ const CollaborationTable = () => {
const [search, setSearch] = React.useState<string>(""); const [search, setSearch] = React.useState<string>("");
const roleId = getCookiesDecrypt("urie"); const roleId = getCookiesDecrypt("urie");
const columns = useTableColumns();
const table = useReactTable({ const table = useReactTable({
data: dataTable, data: dataTable,
columns, columns,

View File

@ -13,30 +13,36 @@ import { Button } from "@/components/ui/button";
import { Badge } from "@/components/ui/badge"; import { Badge } from "@/components/ui/badge";
import { format } from "date-fns"; import { format } from "date-fns";
import { Link, useRouter } from "@/i18n/routing"; import { Link, useRouter } from "@/i18n/routing";
import { useTranslations } from "next-intl";
const columns: ColumnDef<any>[] = [ const useTableColumns = () => {
const t = useTranslations("Table"); // Panggil di dalam hook
const columns: ColumnDef<any>[] = [
{ {
accessorKey: "no", accessorKey: "no",
header: "No", header: t("no"),
cell: ({ row }) => <span> {row.getValue("no")}</span>, cell: ({ row }) => <span> {row.getValue("no")}</span>,
}, },
{ {
accessorKey: "title", accessorKey: "title",
header: "Pertanyaan", header: t("question"),
cell: ({ row }) => ( cell: ({ row }) => (
<span className="normal-case"> {row.getValue("title")}</span> <span className="normal-case"> {row.getValue("title")}</span>
), ),
}, },
{ {
accessorKey: "commentFromUserName", accessorKey: "commentFromUserName",
header: "CreateBy", header: t("sender"),
cell: ({ row }) => ( cell: ({ row }) => (
<span className="normal-case">{row.getValue("commentFromUserName")}</span> <span className="normal-case">
{row.getValue("commentFromUserName")}
</span>
), ),
}, },
{ {
accessorKey: "Type", accessorKey: "Type",
header: "Channel", header: t("type"),
cell: ({ row }) => { cell: ({ row }) => {
const type = row.original.type; const type = row.original.type;
return <span className="normal-case">{type?.name || "N/A"}</span>; return <span className="normal-case">{type?.name || "N/A"}</span>;
@ -44,7 +50,7 @@ const columns: ColumnDef<any>[] = [
}, },
{ {
accessorKey: "createdAt", accessorKey: "createdAt",
header: "Waktu", header: t("time"),
cell: ({ row }) => { cell: ({ row }) => {
const createdAt = row.getValue("createdAt") as const createdAt = row.getValue("createdAt") as
| string | string
@ -69,7 +75,9 @@ const columns: ColumnDef<any>[] = [
: "bg-red-100 text-red-600"; // Gaya untuk "Closed" : "bg-red-100 text-red-600"; // Gaya untuk "Closed"
return ( return (
<Badge className={`rounded-full px-5 ${statusStyles}`}>{status}</Badge> <Badge className={`rounded-full px-5 ${statusStyles}`}>
{status}
</Badge>
); );
}, },
}, },
@ -77,7 +85,7 @@ const columns: ColumnDef<any>[] = [
{ {
id: "actions", id: "actions",
accessorKey: "action", accessorKey: "action",
header: "Actions", header: t("action"),
enableHiding: false, enableHiding: false,
cell: ({ row }) => { cell: ({ row }) => {
const router = useRouter(); const router = useRouter();
@ -109,6 +117,9 @@ const columns: ColumnDef<any>[] = [
); );
}, },
}, },
]; ];
export default columns; return columns;
};
export default useTableColumns;

View File

@ -13,30 +13,36 @@ import { Button } from "@/components/ui/button";
import { Badge } from "@/components/ui/badge"; import { Badge } from "@/components/ui/badge";
import { format } from "date-fns"; import { format } from "date-fns";
import { Link } from "@/components/navigation"; import { Link } from "@/components/navigation";
import { useTranslations } from "next-intl";
const columns: ColumnDef<any>[] = [ const useTableColumns = () => {
const t = useTranslations("Table"); // Panggil di dalam hook
const columns: ColumnDef<any>[] = [
{ {
accessorKey: "no", accessorKey: "no",
header: "No", header: t("no"),
cell: ({ row }) => <span> {row.getValue("no")}</span>, cell: ({ row }) => <span> {row.getValue("no")}</span>,
}, },
{ {
accessorKey: "title", accessorKey: "title",
header: "Pertanyaan", header: t("question"),
cell: ({ row }) => ( cell: ({ row }) => (
<span className="normal-case"> {row.getValue("title")}</span> <span className="normal-case"> {row.getValue("title")}</span>
), ),
}, },
{ {
accessorKey: "commentFromUserName", accessorKey: "commentFromUserName",
header: "Penerima", header: t("sender"),
cell: ({ row }) => ( cell: ({ row }) => (
<span className="normal-case">{row.getValue("commentFromUserName")}</span> <span className="normal-case">
{row.getValue("commentFromUserName")}
</span>
), ),
}, },
{ {
accessorKey: "type", accessorKey: "type",
header: "Penerima", header: t("type"),
cell: ({ row }) => { cell: ({ row }) => {
const type = row.original.type; // Akses properti category const type = row.original.type; // Akses properti category
return <span className="normal-case">{type?.name || "N/A"}</span>; return <span className="normal-case">{type?.name || "N/A"}</span>;
@ -44,7 +50,7 @@ const columns: ColumnDef<any>[] = [
}, },
{ {
accessorKey: "createdAt", accessorKey: "createdAt",
header: "Waktu", header: t("time"),
cell: ({ row }) => { cell: ({ row }) => {
const createdAt = row.getValue("createdAt") as const createdAt = row.getValue("createdAt") as
| string | string
@ -69,7 +75,9 @@ const columns: ColumnDef<any>[] = [
: "bg-red-100 text-red-600"; // Gaya untuk "Closed" : "bg-red-100 text-red-600"; // Gaya untuk "Closed"
return ( return (
<Badge className={`rounded-full px-5 ${statusStyles}`}>{status}</Badge> <Badge className={`rounded-full px-5 ${statusStyles}`}>
{status}
</Badge>
); );
}, },
}, },
@ -77,7 +85,7 @@ const columns: ColumnDef<any>[] = [
{ {
id: "actions", id: "actions",
accessorKey: "action", accessorKey: "action",
header: "Actions", header: t("action"),
enableHiding: false, enableHiding: false,
cell: ({ row }) => { cell: ({ row }) => {
return ( return (
@ -105,6 +113,8 @@ const columns: ColumnDef<any>[] = [
); );
}, },
}, },
]; ];
return columns;
};
export default columns; export default useTableColumns;

View File

@ -62,6 +62,7 @@ import {
getTicketingEscalationPagination, getTicketingEscalationPagination,
listTicketingInternal, listTicketingInternal,
} from "@/service/communication/communication"; } from "@/service/communication/communication";
import useTableColumns from "./columns";
const EscalationTable = () => { const EscalationTable = () => {
const router = useRouter(); const router = useRouter();
@ -87,7 +88,7 @@ const EscalationTable = () => {
const [search, setSearch] = React.useState<string>(""); const [search, setSearch] = React.useState<string>("");
const roleId = getCookiesDecrypt("urie"); const roleId = getCookiesDecrypt("urie");
const columns = useTableColumns();
const table = useReactTable({ const table = useReactTable({
data: dataTable, data: dataTable,
columns, columns,

View File

@ -13,23 +13,27 @@ import { Button } from "@/components/ui/button";
import { Badge } from "@/components/ui/badge"; import { Badge } from "@/components/ui/badge";
import { format } from "date-fns"; import { format } from "date-fns";
import { Link } from "@/components/navigation"; import { Link } from "@/components/navigation";
import { useTranslations } from "next-intl";
const columns: ColumnDef<any>[] = [ const useTableColumns = () => {
const t = useTranslations("Table"); // Panggil di dalam hook
const columns: ColumnDef<any>[] = [
{ {
accessorKey: "no", accessorKey: "no",
header: "No", header: t("no"),
cell: ({ row }) => <span> {row.getValue("no")}</span>, cell: ({ row }) => <span> {row.getValue("no")}</span>,
}, },
{ {
accessorKey: "title", accessorKey: "title",
header: "Pertanyaan", header: t("question"),
cell: ({ row }) => ( cell: ({ row }) => (
<span className="normal-case"> {row.getValue("title")}</span> <span className="normal-case"> {row.getValue("title")}</span>
), ),
}, },
{ {
accessorKey: "createdBy", accessorKey: "createdBy",
header: "Pengirim", header: t("sender"),
cell: ({ row }) => { cell: ({ row }) => {
const createdBy = row.original.createdBy; // Akses properti category const createdBy = row.original.createdBy; // Akses properti category
return ( return (
@ -39,7 +43,7 @@ const columns: ColumnDef<any>[] = [
}, },
{ {
accessorKey: "sendTo", accessorKey: "sendTo",
header: "Penerima", header: t("sendto"),
cell: ({ row }) => { cell: ({ row }) => {
const sendTo = row.original.sendTo; // Akses properti category const sendTo = row.original.sendTo; // Akses properti category
return <span className="normal-case">{sendTo?.fullname || "N/A"}</span>; return <span className="normal-case">{sendTo?.fullname || "N/A"}</span>;
@ -47,7 +51,7 @@ const columns: ColumnDef<any>[] = [
}, },
{ {
accessorKey: "createdAt", accessorKey: "createdAt",
header: "Waktu", header: t("time"),
cell: ({ row }) => { cell: ({ row }) => {
const createdAt = row.getValue("createdAt") as const createdAt = row.getValue("createdAt") as
| string | string
@ -64,7 +68,7 @@ const columns: ColumnDef<any>[] = [
{ {
id: "actions", id: "actions",
accessorKey: "action", accessorKey: "action",
header: "Actions", header: t("action"),
enableHiding: false, enableHiding: false,
cell: ({ row }) => { cell: ({ row }) => {
return ( return (
@ -104,6 +108,9 @@ const columns: ColumnDef<any>[] = [
); );
}, },
}, },
]; ];
export default columns; return columns;
};
export default useTableColumns;

View File

@ -61,6 +61,7 @@ import {
} from "@/service/content/content"; } from "@/service/content/content";
import { listTicketingInternal } from "@/service/communication/communication"; import { listTicketingInternal } from "@/service/communication/communication";
import { Link } from "@/components/navigation"; import { Link } from "@/components/navigation";
import useTableColumns from "./columns";
const InternalTable = () => { const InternalTable = () => {
const router = useRouter(); const router = useRouter();
@ -88,7 +89,7 @@ const InternalTable = () => {
const userLevelId = getCookiesDecrypt("ulie"); const userLevelId = getCookiesDecrypt("ulie");
const roleId = getCookiesDecrypt("urie"); const roleId = getCookiesDecrypt("urie");
const columns = useTableColumns();
const table = useReactTable({ const table = useReactTable({
data: dataTable, data: dataTable,
columns, columns,

View File

@ -18,11 +18,15 @@ import Swal from "sweetalert2";
import { error } from "@/lib/swal"; import { error } from "@/lib/swal";
import { deleteMedia } from "@/service/content/content"; import { deleteMedia } from "@/service/content/content";
import { publishContest } from "@/service/contest/contest"; import { publishContest } from "@/service/contest/contest";
import { useTranslations } from "next-intl";
const columns: ColumnDef<any>[] = [ const useTableColumns = () => {
const t = useTranslations("Table"); // Panggil di dalam hook
const columns: ColumnDef<any>[] = [
{ {
accessorKey: "no", accessorKey: "no",
header: "No", header: t("no"),
cell: ({ row }) => ( cell: ({ row }) => (
<div className="flex items-center gap-5"> <div className="flex items-center gap-5">
<div className="flex-1 text-start"> <div className="flex-1 text-start">
@ -35,7 +39,7 @@ const columns: ColumnDef<any>[] = [
}, },
{ {
accessorKey: "hastagCode", accessorKey: "hastagCode",
header: "Kode", header: t("code"),
cell: ({ row }) => ( cell: ({ row }) => (
<div className="flex items-center gap-5"> <div className="flex items-center gap-5">
<div className="flex-1 text-start"> <div className="flex-1 text-start">
@ -51,7 +55,7 @@ const columns: ColumnDef<any>[] = [
}, },
{ {
accessorKey: "theme", accessorKey: "theme",
header: "Judul", header: t("title"),
cell: ({ row }) => ( cell: ({ row }) => (
<div className="flex items-center gap-5"> <div className="flex items-center gap-5">
<div className="flex-1 text-start"> <div className="flex-1 text-start">
@ -64,21 +68,23 @@ const columns: ColumnDef<any>[] = [
}, },
{ {
accessorKey: "duration", accessorKey: "duration",
header: "Durasi ", header: t("duration"),
cell: ({ row }) => ( cell: ({ row }) => (
<span className="whitespace-nowrap">{row.getValue("duration")}</span> <span className="whitespace-nowrap">{row.getValue("duration")}</span>
), ),
}, },
{ {
accessorKey: "targetOutput", accessorKey: "targetOutput",
header: "Target Output ", header: t("target-output"),
cell: ({ row }) => ( cell: ({ row }) => (
<span className="whitespace-nowrap">{row.getValue("targetOutput")}</span> <span className="whitespace-nowrap">
{row.getValue("targetOutput")}
</span>
), ),
}, },
{ {
accessorKey: "targetParticipantTopLevel", accessorKey: "targetParticipantTopLevel",
header: "Target Participant ", header: t("target-participant"),
cell: ({ row }) => ( cell: ({ row }) => (
<span className="whitespace-nowrap"> <span className="whitespace-nowrap">
{row.getValue("targetParticipantTopLevel")} {row.getValue("targetParticipantTopLevel")}
@ -128,7 +134,7 @@ const columns: ColumnDef<any>[] = [
{ {
id: "actions", id: "actions",
accessorKey: "action", accessorKey: "action",
header: "Actions", header: t("action"),
enableHiding: false, enableHiding: false,
cell: ({ row }) => { cell: ({ row }) => {
const MySwal = withReactContent(Swal); const MySwal = withReactContent(Swal);
@ -224,6 +230,9 @@ const columns: ColumnDef<any>[] = [
); );
}, },
}, },
]; ];
export default columns; return columns;
};
export default useTableColumns;

View File

@ -42,6 +42,7 @@ import { useRouter, useSearchParams } from "next/navigation";
import TablePagination from "@/components/table/table-pagination"; import TablePagination from "@/components/table/table-pagination";
import columns from "./columns"; import columns from "./columns";
import { listContest } from "@/service/contest/contest"; import { listContest } from "@/service/contest/contest";
import useTableColumns from "./columns";
const TaskTable = () => { const TaskTable = () => {
const router = useRouter(); const router = useRouter();
@ -63,7 +64,7 @@ const TaskTable = () => {
const [totalPage, setTotalPage] = React.useState(1); const [totalPage, setTotalPage] = React.useState(1);
const [limit, setLimit] = React.useState(10); const [limit, setLimit] = React.useState(10);
const [search, setSearch] = React.useState<string>(""); const [search, setSearch] = React.useState<string>("");
const columns = useTableColumns();
const table = useReactTable({ const table = useReactTable({
data: dataTable, data: dataTable,
columns, columns,

View File

@ -24,15 +24,19 @@ import AudioSliderPage from "./giat-routine/audio/audio";
import ImageSliderPage from "./giat-routine/image/image"; import ImageSliderPage from "./giat-routine/image/image";
import TeksSliderPage from "./giat-routine/document/teks"; import TeksSliderPage from "./giat-routine/document/teks";
import ContestTable from "../contest/components/contest-table"; import ContestTable from "../contest/components/contest-table";
import { useTranslations } from "next-intl";
const CuratedContentPage = () => { const CuratedContentPage = () => {
const t = useTranslations("Curation");
return ( return (
<div> <div>
<SiteBreadcrumb /> <SiteBreadcrumb />
<div className="my-3"> <div className="my-3">
<Tabs defaultValue="giat-routine" className="w-full"> <Tabs defaultValue="giat-routine" className="w-full">
<Card className="py-3 px-2 my-4"> <Card className="py-3 px-2 my-4">
<p className="text-lg font-semibold ml-2">Kurasi Konten</p> <p className="text-lg font-semibold ml-2">
{t("content-curation")}
</p>
<TabsList className="flex-wrap"> <TabsList className="flex-wrap">
<TabsTrigger <TabsTrigger
value="giat-routine" value="giat-routine"

View File

@ -442,7 +442,22 @@ export default function FormAudio() {
return; return;
} }
const requestData = { let requestData: {
title: string;
description: string;
htmlDescription: string;
fileTypeId: string;
categoryId: any;
subCategoryId: any;
uploadedBy: string;
statusId: string;
publishedFor: string;
creatorName: string;
tags: string;
isYoutube: boolean;
isInternationalMedia: boolean;
attachFromScheduleId?: number; // ✅ Tambahkan properti ini
} = {
...data, ...data,
title: finalTitle, title: finalTitle,
description: finalDescription, description: finalDescription,
@ -461,6 +476,10 @@ export default function FormAudio() {
let id = Cookies.get("idCreate"); let id = Cookies.get("idCreate");
if (scheduleId !== undefined) {
requestData.attachFromScheduleId = Number(scheduleId); // ✅ Tambahkan nilai ini
}
if (id == undefined) { if (id == undefined) {
const response = await createMedia(requestData); const response = await createMedia(requestData);
console.log("Form Data Submitted:", requestData); console.log("Form Data Submitted:", requestData);

View File

@ -56,6 +56,7 @@ import { options } from "@fullcalendar/core/preact.js";
import dynamic from "next/dynamic"; import dynamic from "next/dynamic";
import { getCsrfToken } from "@/service/auth"; import { getCsrfToken } from "@/service/auth";
import { Link } from "@/i18n/routing"; import { Link } from "@/i18n/routing";
import { request } from "http";
interface FileWithPreview extends File { interface FileWithPreview extends File {
preview: string; preview: string;
@ -443,11 +444,28 @@ export default function FormImage() {
const finalTags = tags.join(", "); const finalTags = tags.join(", ");
const finalTitle = isSwitchOn ? title : data.title; const finalTitle = isSwitchOn ? title : data.title;
const finalDescription = articleBody || data.description; const finalDescription = articleBody || data.description;
if (!finalDescription.trim()) { if (!finalDescription.trim()) {
MySwal.fire("Error", "Deskripsi tidak boleh kosong.", "error"); MySwal.fire("Error", "Deskripsi tidak boleh kosong.", "error");
return; return;
} }
const requestData = {
let requestData: {
title: string;
description: string;
htmlDescription: string;
fileTypeId: string;
categoryId: any;
subCategoryId: any;
uploadedBy: string;
statusId: string;
publishedFor: string;
creatorName: string;
tags: string;
isYoutube: boolean;
isInternationalMedia: boolean;
attachFromScheduleId?: number; // ✅ Tambahkan properti ini
} = {
...data, ...data,
title: finalTitle, title: finalTitle,
description: finalDescription, description: finalDescription,
@ -466,14 +484,14 @@ export default function FormImage() {
let id = Cookies.get("idCreate"); let id = Cookies.get("idCreate");
if (scheduleId !== undefined) {
requestData.attachFromScheduleId = Number(scheduleId); // ✅ Tambahkan nilai ini
}
if (id == undefined) { if (id == undefined) {
const response = await createMedia(requestData); const response = await createMedia(requestData);
console.log("Form Data Submitted:", requestData); console.log("Form Data Submitted:", requestData);
// if (response?.error) {
// MySwal.fire("Error", response?.message, "error");
// return;
// }
Cookies.set("idCreate", response?.data?.data, { expires: 1 }); Cookies.set("idCreate", response?.data?.data, { expires: 1 });
id = response?.data?.data; id = response?.data?.data;
@ -489,16 +507,15 @@ export default function FormImage() {
} }
// Upload File // Upload File
const progressInfoArr = []; const progressInfoArr = files.map((item) => ({
for (const item of files) { percentage: 0,
progressInfoArr.push({ percentage: 0, fileName: item.name }); fileName: item.name,
} }));
progressInfo = progressInfoArr; progressInfo = progressInfoArr;
setIsStartUpload(true); setIsStartUpload(true);
setProgressList(progressInfoArr); setProgressList(progressInfoArr);
close(); close();
// showProgress();
files.map(async (item: any, index: number) => { files.map(async (item: any, index: number) => {
await uploadResumableFile( await uploadResumableFile(
index, index,
@ -509,8 +526,6 @@ export default function FormImage() {
}); });
Cookies.remove("idCreate"); Cookies.remove("idCreate");
// MySwal.fire("Sukses", "Data berhasil disimpan.", "success");
}; };
const onSubmit = (data: ImageSchema) => { const onSubmit = (data: ImageSchema) => {

View File

@ -812,7 +812,7 @@ export default function FormConvertSPIT() {
<div className="mt-3"> <div className="mt-3">
<Label className="text-xl">Penempatan file</Label> <Label className="text-xl">Penempatan file</Label>
</div> </div>
{files.length > 1 && ( {files?.length > 1 && (
<div className="flex flex-wrap gap-2 mt-2"> <div className="flex flex-wrap gap-2 mt-2">
<div className="flex items-center space-x-2"> <div className="flex items-center space-x-2">
<Checkbox <Checkbox

View File

@ -441,7 +441,22 @@ export default function FormTeks() {
MySwal.fire("Error", "Deskripsi tidak boleh kosong.", "error"); MySwal.fire("Error", "Deskripsi tidak boleh kosong.", "error");
return; return;
} }
const requestData = { let requestData: {
title: string;
description: string;
htmlDescription: string;
fileTypeId: string;
categoryId: any;
subCategoryId: any;
uploadedBy: string;
statusId: string;
publishedFor: string;
creatorName: string;
tags: string;
isYoutube: boolean;
isInternationalMedia: boolean;
attachFromScheduleId?: number; // ✅ Tambahkan properti ini
} = {
...data, ...data,
title: finalTitle, title: finalTitle,
description: finalDescription, description: finalDescription,
@ -460,6 +475,10 @@ export default function FormTeks() {
let id = Cookies.get("idCreate"); let id = Cookies.get("idCreate");
if (scheduleId !== undefined) {
requestData.attachFromScheduleId = Number(scheduleId); // ✅ Tambahkan nilai ini
}
if (id == undefined) { if (id == undefined) {
const response = await createMedia(requestData); const response = await createMedia(requestData);
console.log("Form Data Submitted:", requestData); console.log("Form Data Submitted:", requestData);

View File

@ -441,7 +441,22 @@ export default function FormVideo() {
MySwal.fire("Error", "Deskripsi tidak boleh kosong.", "error"); MySwal.fire("Error", "Deskripsi tidak boleh kosong.", "error");
return; return;
} }
const requestData = { let requestData: {
title: string;
description: string;
htmlDescription: string;
fileTypeId: string;
categoryId: any;
subCategoryId: any;
uploadedBy: string;
statusId: string;
publishedFor: string;
creatorName: string;
tags: string;
isYoutube: boolean;
isInternationalMedia: boolean;
attachFromScheduleId?: number; // ✅ Tambahkan properti ini
} = {
...data, ...data,
title: finalTitle, title: finalTitle,
description: finalDescription, description: finalDescription,
@ -460,6 +475,10 @@ export default function FormVideo() {
let id = Cookies.get("idCreate"); let id = Cookies.get("idCreate");
if (scheduleId !== undefined) {
requestData.attachFromScheduleId = Number(scheduleId); // ✅ Tambahkan nilai ini
}
if (id == undefined) { if (id == undefined) {
const response = await createMedia(requestData); const response = await createMedia(requestData);
console.log("Form Data Submitted:", requestData); console.log("Form Data Submitted:", requestData);

View File

@ -17,7 +17,7 @@ import {
PopoverTrigger, PopoverTrigger,
} from "@/components/ui/popover"; } from "@/components/ui/popover";
import { cn } from "@/lib/utils"; import { cn } from "@/lib/utils";
import { CalendarIcon, Clock1, MapPin, Plus, User2 } from "lucide-react"; import { CalendarIcon, Clock1, Eye, MapPin, Plus, User2 } from "lucide-react";
import { Calendar } from "@/components/ui/calendar"; import { Calendar } from "@/components/ui/calendar";
import { addDays, format, parseISO, setDate } from "date-fns"; import { addDays, format, parseISO, setDate } from "date-fns";
import { DateRange } from "react-day-picker"; import { DateRange } from "react-day-picker";
@ -30,6 +30,7 @@ import { error, loading } from "@/lib/swal";
import Cookies from "js-cookie"; import Cookies from "js-cookie";
import { import {
detailSchedule, detailSchedule,
getListScheduleAttachment,
listScheduleNext, listScheduleNext,
listScheduleToday, listScheduleToday,
postSchedule, postSchedule,
@ -61,6 +62,14 @@ interface Detail {
addressLong: number; addressLong: number;
} }
interface Attachment {
id: any;
title: string;
fileTypeId: number;
type: number;
fileTypeName: string;
}
export default function FormEventDetail() { export default function FormEventDetail() {
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);
const { id } = useParams() as { id: string }; const { id } = useParams() as { id: string };
@ -89,6 +98,14 @@ export default function FormEventDetail() {
}, },
}); });
const [lampiran, setDataLampiran] = useState<Attachment[]>([]);
async function getDataAttachment() {
const response = await getListScheduleAttachment(id);
console.log("data attach", response?.data?.data?.content);
setDataLampiran(response?.data?.data?.content);
}
async function getDataByDate() { async function getDataByDate() {
const resToday = await listScheduleToday(); const resToday = await listScheduleToday();
const today = resToday?.data?.data; const today = resToday?.data?.data;
@ -120,6 +137,7 @@ export default function FormEventDetail() {
} }
} }
initState(); initState();
getDataAttachment();
}, [refresh, setValue]); }, [refresh, setValue]);
const handleStartTime = (e: React.ChangeEvent<HTMLInputElement>) => { const handleStartTime = (e: React.ChangeEvent<HTMLInputElement>) => {
@ -130,6 +148,29 @@ export default function FormEventDetail() {
setEndTime(e.target.value); setEndTime(e.target.value);
}; };
const handleDestinationUpload = (
type: number,
id: string | number,
setOpen: (open: boolean) => void,
router: any
) => {
setOpen(false); // Tutup modal dialog
if (id !== undefined) {
Cookies.set("scheduleId", id.toString(), { expires: 1 });
Cookies.set("scheduleType", "3", { expires: 1 });
const routes: Record<number, string> = {
1: "/in/contributor/schedule/media/image/create",
2: "/in/contributor/schedule/media/video/create",
3: "/in/contributor/schedule/media/text/create",
4: "/in/contributor/schedule/media/audio/create",
};
router.push(routes[type] || "/admin/schedule/media/audio/create");
}
};
return ( return (
<div className="flex flex-col lg:flex-row gap-2"> <div className="flex flex-col lg:flex-row gap-2">
<Card className="w-full lg:w-9/12"> <Card className="w-full lg:w-9/12">
@ -336,92 +377,67 @@ export default function FormEventDetail() {
<Button color="primary" size="sm" type="button"> <Button color="primary" size="sm" type="button">
<Plus /> Tambah Lampiran <Plus /> Tambah Lampiran
</Button> </Button>
<p>0 Lampiran</p> <p>{lampiran?.length || 0} Lampiran</p>
</div> </div>
</DialogTrigger> </DialogTrigger>
<DialogContent className="max-w-md p-6 bg-white rounded-lg shadow-lg h-[420px] w-[700px]"> <DialogContent className="max-w-md p-6 bg-white rounded-lg shadow-lg h-[420px] w-[700px]">
<h2 className="text-lg font-semibold"> <h2 className="text-lg font-semibold">
Pilih Jenis Lampiran Pilih Jenis Lampiran
</h2> </h2>
<div className=" space-y-4 gap-y-4"> <div className="space-y-4 gap-y-4">
<Link href={"/contributor/schedule/media/video/create"}> {[
{
type: 2,
img: "/assets/img/upload-video.png",
label: "Audio Visual",
},
{
type: 1,
img: "/assets/img/upload-image.png",
label: "Foto",
},
{
type: 3,
img: "/assets/img/upload-text.png",
label: "Teks",
},
{
type: 4,
img: "/assets/img/upload-audio.png",
label: "Audio",
},
].map((item) => (
<a
key={item.type}
onClick={() =>
handleDestinationUpload(
item.type,
id,
setOpen,
router
)
}
>
<div className="flex flex-row items-center space-x-4"> <div className="flex flex-row items-center space-x-4">
<div className="flex flex-col w-4/12 items-center"> <div className="flex flex-col w-4/12 items-center">
<img <img
src={"/assets/img/upload-video.png"} src={item.img}
alt={"item.label"} alt={item.label}
className="w-12 h-12" className="w-12 h-12"
/> />
<h3 className="text-base font-semibold"> <h3 className="text-base font-semibold">
Audio Visual {item.label}
</h3> </h3>
</div> </div>
<div className="w-8/12"> <div className="w-8/12">
<p className="text-sm text-gray-600"> <p className="text-sm text-gray-600">
Unggah media berupa video dengan format avi, wmv, Unggah media berupa {item.label.toLowerCase()}{" "}
atau mp4 dengan ukuran minimal 2mb dan maksimal dengan format sesuai yang didukung.
500mb.
</p> </p>
</div> </div>
</div> </div>
</Link> </a>
<Link href={"/contributor/schedule/media/image/create"}> ))}
<div className="flex flex-row items-center space-x-4">
<div className="flex flex-col w-4/12 items-center">
<img
src={"/assets/img/upload-image.png"}
alt={"item.label"}
className="w-12 h-12"
/>
<h3 className="text-base font-semibold">Foto</h3>
</div>
<div className="w-8/12">
<p className="text-sm text-gray-600">
Unggah media berupa video dengan format avi, wmv,
atau mp4 dengan ukuran minimal 2mb dan maksimal
500mb.
</p>
</div>
</div>
</Link>
<Link href={"/contributor/schedule/media/text/create"}>
<div className="flex flex-row items-center space-x-4">
<div className="flex flex-col w-4/12 items-center">
<img
src={"/assets/img/upload-text.png"}
alt={"item.label"}
className="w-12 h-12"
/>
<h3 className="text-base font-semibold">Teks</h3>
</div>
<div className="w-8/12">
<p className="text-sm text-gray-600">
Unggah media berupa video dengan format avi, wmv,
atau mp4 dengan ukuran minimal 2mb dan maksimal
500mb.
</p>
</div>
</div>
</Link>
<Link href={"/contributor/schedule/media/audio/create"}>
<div className="flex flex-row items-center space-x-4">
<div className="flex flex-col w-4/12 items-center">
<img
src={"/assets/img/upload-audio.png"}
alt={"item.label"}
className="w-12 h-12"
/>
<h3 className="text-base font-semibold">Audio</h3>
</div>
<div className="w-8/12">
<p className="text-sm text-gray-600">
Unggah media berupa video dengan format avi, wmv,
atau mp4 dengan ukuran minimal 2mb dan maksimal
500mb.
</p>
</div>
</div>
</Link>
</div> </div>
</DialogContent> </DialogContent>
</Dialog> </Dialog>
@ -430,7 +446,52 @@ export default function FormEventDetail() {
"" ""
)} )}
</div> </div>
<div className="mt-4 flex justify-end"> <div className="mt-6 mx-6">
<table className="w-full border border-gray-300 rounded-lg">
<thead className="bg-gray-200 text-left">
<tr>
<th className="p-3 font-semibold">Judul Konten</th>
<th className="p-3 font-semibold">Konten</th>
<th className="p-3 font-semibold">Tindakan</th>
<th className="p-3 font-semibold">Aksi</th>
</tr>
</thead>
<tbody>
{lampiran.map((item, index) => (
<tr key={index} className="border-t border-gray-300">
<td className="p-3 text-blue-600 cursor-pointer">
{item.title}
</td>
<td className="p-3">{item.fileTypeName}</td>
<td className="p-3 text-blue-600">Konfersi Ai</td>
<td className="p-3">
<Link
href={
Number(item.fileTypeId) == 1
? `/contributor/content/image/detail/${item.id}`
: Number(item.fileTypeId) == 2
? `/contributor/content/video/detail/${item.id}`
: Number(item.fileTypeId) == 3
? `/contributor/content/teks/detail/${item.id}`
: `/contributor/content/audio/detail/${item.id}`
}
target="_blank"
className="btn"
rel="noreferrer"
>
<Eye
className={
item.type === 1 ? "text-blue-600" : "text-black"
}
/>
</Link>
</td>
</tr>
))}
</tbody>
</table>
</div>
<div className="my-4 mr-6 flex justify-end">
<Button type="submit" color="primary"> <Button type="submit" color="primary">
Submit Submit
</Button> </Button>

View File

@ -17,7 +17,7 @@ import {
PopoverTrigger, PopoverTrigger,
} from "@/components/ui/popover"; } from "@/components/ui/popover";
import { cn } from "@/lib/utils"; import { cn } from "@/lib/utils";
import { CalendarIcon, Clock1, MapPin, Plus, User2 } from "lucide-react"; import { CalendarIcon, Clock1, Eye, MapPin, Plus, User2 } from "lucide-react";
import { Calendar } from "@/components/ui/calendar"; import { Calendar } from "@/components/ui/calendar";
import { addDays, format, parseISO, setDate } from "date-fns"; import { addDays, format, parseISO, setDate } from "date-fns";
import { DateRange } from "react-day-picker"; import { DateRange } from "react-day-picker";
@ -30,6 +30,7 @@ import { error, loading } from "@/lib/swal";
import Cookies from "js-cookie"; import Cookies from "js-cookie";
import { import {
detailSchedule, detailSchedule,
getListScheduleAttachment,
listScheduleNext, listScheduleNext,
listScheduleToday, listScheduleToday,
postSchedule, postSchedule,
@ -50,6 +51,7 @@ import {
import { formatDate } from "@fullcalendar/core/index.js"; import { formatDate } from "@fullcalendar/core/index.js";
import { Dialog, DialogContent, DialogTrigger } from "@/components/ui/dialog"; import { Dialog, DialogContent, DialogTrigger } from "@/components/ui/dialog";
import { Link } from "@/i18n/routing"; import { Link } from "@/i18n/routing";
import $ from "jquery";
const taskSchema = z.object({ const taskSchema = z.object({
title: z.string().min(1, { message: "Judul diperlukan" }), title: z.string().min(1, { message: "Judul diperlukan" }),
@ -68,6 +70,14 @@ interface Detail {
addressLong: number; addressLong: number;
} }
interface Attachment {
id: any;
title: string;
fileTypeId: number;
type: number;
fileTypeName: string;
}
export default function FormDetailPressRillis() { export default function FormDetailPressRillis() {
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);
const { id } = useParams() as { id: string }; const { id } = useParams() as { id: string };
@ -98,6 +108,14 @@ export default function FormDetailPressRillis() {
}, },
}); });
const [lampiran, setDataLampiran] = useState<Attachment[]>([]);
async function getDataAttachment() {
const response = await getListScheduleAttachment(id);
console.log("data attach", response?.data?.data?.content);
setDataLampiran(response?.data?.data?.content);
}
async function getDataByDate() { async function getDataByDate() {
const resToday = await listScheduleToday(); const resToday = await listScheduleToday();
const today = resToday?.data?.data; const today = resToday?.data?.data;
@ -129,6 +147,7 @@ export default function FormDetailPressRillis() {
} }
} }
initState(); initState();
getDataAttachment();
}, [refresh, setValue]); }, [refresh, setValue]);
const handleStartTime = (e: React.ChangeEvent<HTMLInputElement>) => { const handleStartTime = (e: React.ChangeEvent<HTMLInputElement>) => {
@ -139,20 +158,26 @@ export default function FormDetailPressRillis() {
setEndTime(e.target.value); setEndTime(e.target.value);
}; };
const handleUploadAttachment = () => { const handleDestinationUpload = (
const scheduleId = Cookies.get("scheduleId"); type: number,
id: string | number,
setOpen: (open: boolean) => void,
router: any
) => {
setOpen(false); // Tutup modal dialog
if (scheduleId == undefined) { if (id !== undefined) {
MySwal.fire({ Cookies.set("scheduleId", id.toString(), { expires: 1 });
title: "Simpan Jadwal Terlebih Dahulu", Cookies.set("scheduleType", "3", { expires: 1 });
icon: "info",
confirmButtonColor: "#3085d6", const routes: Record<number, string> = {
confirmButtonText: "Ok", 1: "/in/contributor/schedule/media/image/create",
}).then((result) => { 2: "/in/contributor/schedule/media/video/create",
if (result.isConfirmed) { 3: "/in/contributor/schedule/media/text/create",
return true; 4: "/in/contributor/schedule/media/audio/create",
} };
});
router.push(routes[type] || "/admin/schedule/media/audio/create");
} }
}; };
@ -379,92 +404,67 @@ export default function FormDetailPressRillis() {
<Button color="primary" size="sm" type="button"> <Button color="primary" size="sm" type="button">
<Plus /> Tambah Lampiran <Plus /> Tambah Lampiran
</Button> </Button>
<p>0 Lampiran</p> <p>{lampiran?.length || 0} Lampiran</p>
</div> </div>
</DialogTrigger> </DialogTrigger>
<DialogContent className="max-w-md p-6 bg-white rounded-lg shadow-lg h-[420px] w-[700px]"> <DialogContent className="max-w-md p-6 bg-white rounded-lg shadow-lg h-[420px] w-[700px]">
<h2 className="text-lg font-semibold"> <h2 className="text-lg font-semibold">
Pilih Jenis Lampiran Pilih Jenis Lampiran
</h2> </h2>
<div className=" space-y-4 gap-y-4"> <div className="space-y-4 gap-y-4">
<Link href={"/contributor/schedule/media/video/create"}> {[
{
type: 2,
img: "/assets/img/upload-video.png",
label: "Audio Visual",
},
{
type: 1,
img: "/assets/img/upload-image.png",
label: "Foto",
},
{
type: 3,
img: "/assets/img/upload-text.png",
label: "Teks",
},
{
type: 4,
img: "/assets/img/upload-audio.png",
label: "Audio",
},
].map((item) => (
<a
key={item.type}
onClick={() =>
handleDestinationUpload(
item.type,
id,
setOpen,
router
)
}
>
<div className="flex flex-row items-center space-x-4"> <div className="flex flex-row items-center space-x-4">
<div className="flex flex-col w-4/12 items-center"> <div className="flex flex-col w-4/12 items-center">
<img <img
src={"/assets/img/upload-video.png"} src={item.img}
alt={"item.label"} alt={item.label}
className="w-12 h-12" className="w-12 h-12"
/> />
<h3 className="text-base font-semibold"> <h3 className="text-base font-semibold">
Audio Visual {item.label}
</h3> </h3>
</div> </div>
<div className="w-8/12"> <div className="w-8/12">
<p className="text-sm text-gray-600"> <p className="text-sm text-gray-600">
Unggah media berupa video dengan format avi, wmv, Unggah media berupa {item.label.toLowerCase()}{" "}
atau mp4 dengan ukuran minimal 2mb dan maksimal dengan format sesuai yang didukung.
500mb.
</p> </p>
</div> </div>
</div> </div>
</Link> </a>
<Link href={"/contributor/schedule/media/image/create"}> ))}
<div className="flex flex-row items-center space-x-4">
<div className="flex flex-col w-4/12 items-center">
<img
src={"/assets/img/upload-image.png"}
alt={"item.label"}
className="w-12 h-12"
/>
<h3 className="text-base font-semibold">Foto</h3>
</div>
<div className="w-8/12">
<p className="text-sm text-gray-600">
Unggah media berupa video dengan format avi, wmv,
atau mp4 dengan ukuran minimal 2mb dan maksimal
500mb.
</p>
</div>
</div>
</Link>
<Link href={"/contributor/schedule/media/text/create"}>
<div className="flex flex-row items-center space-x-4">
<div className="flex flex-col w-4/12 items-center">
<img
src={"/assets/img/upload-text.png"}
alt={"item.label"}
className="w-12 h-12"
/>
<h3 className="text-base font-semibold">Teks</h3>
</div>
<div className="w-8/12">
<p className="text-sm text-gray-600">
Unggah media berupa video dengan format avi, wmv,
atau mp4 dengan ukuran minimal 2mb dan maksimal
500mb.
</p>
</div>
</div>
</Link>
<Link href={"/contributor/schedule/media/audio/create"}>
<div className="flex flex-row items-center space-x-4">
<div className="flex flex-col w-4/12 items-center">
<img
src={"/assets/img/upload-audio.png"}
alt={"item.label"}
className="w-12 h-12"
/>
<h3 className="text-base font-semibold">Audio</h3>
</div>
<div className="w-8/12">
<p className="text-sm text-gray-600">
Unggah media berupa video dengan format avi, wmv,
atau mp4 dengan ukuran minimal 2mb dan maksimal
500mb.
</p>
</div>
</div>
</Link>
</div> </div>
</DialogContent> </DialogContent>
</Dialog> </Dialog>
@ -472,6 +472,51 @@ export default function FormDetailPressRillis() {
) : ( ) : (
"" ""
)} )}
<div className="mt-6">
<table className="w-full border border-gray-300 rounded-lg">
<thead className="bg-gray-200 text-left">
<tr>
<th className="p-3 font-semibold">Judul Konten</th>
<th className="p-3 font-semibold">Konten</th>
<th className="p-3 font-semibold">Tindakan</th>
<th className="p-3 font-semibold">Aksi</th>
</tr>
</thead>
<tbody>
{lampiran.map((item, index) => (
<tr key={index} className="border-t border-gray-300">
<td className="p-3 text-blue-600 cursor-pointer">
{item.title}
</td>
<td className="p-3">{item.fileTypeName}</td>
<td className="p-3 text-blue-600">Konfersi Ai</td>
<td className="p-3">
<Link
href={
Number(item.fileTypeId) == 1
? `/contributor/content/image/detail/${item.id}`
: Number(item.fileTypeId) == 2
? `/contributor/content/video/detail/${item.id}`
: Number(item.fileTypeId) == 3
? `/contributor/content/teks/detail/${item.id}`
: `/contributor/content/audio/detail/${item.id}`
}
target="_blank"
className="btn"
rel="noreferrer"
>
<Eye
className={
item.type === 1 ? "text-blue-600" : "text-black"
}
/>
</Link>
</td>
</tr>
))}
</tbody>
</table>
</div>
<div className="mt-4 flex justify-end"> <div className="mt-4 flex justify-end">
<Button type="submit" color="primary"> <Button type="submit" color="primary">
Submit Submit

View File

@ -3,6 +3,17 @@ import React, { useEffect } from "react";
import DateRangePicker from "@/components/date-range-picker"; import DateRangePicker from "@/components/date-range-picker";
import { usePathname } from "@/components/navigation"; import { usePathname } from "@/components/navigation";
import { cn, getCookiesDecrypt } from "@/lib/utils"; import { cn, getCookiesDecrypt } from "@/lib/utils";
import {
Dialog,
DialogContent,
DialogFooter,
DialogHeader,
DialogTitle,
DialogTrigger,
} from "./ui/dialog";
import { Button } from "./ui/button";
import { Label } from "./ui/label";
import { Input } from "./ui/input";
const PageTitle = ({ const PageTitle = ({
title, title,
@ -30,7 +41,35 @@ const PageTitle = ({
<div className="text-2xl font-medium text-default-800 capitalize"> <div className="text-2xl font-medium text-default-800 capitalize">
Dashboard Dashboard
</div> </div>
<DateRangePicker /> <Dialog>
<DialogTrigger asChild>
<Button variant="outline">Download Report</Button>
</DialogTrigger>
<DialogContent className="sm:max-w-[425px]">
<DialogHeader>
<DialogTitle>Download Report</DialogTitle>
</DialogHeader>
<div className="grid gap-4 py-4">
<div className="w-full">
<Label>Date</Label>
<Input
type="date"
// value={dateFilter}
// onChange={(e) => setDateFilter(e.target.value)}
className="w-full"
/>
</div>
</div>
<DialogFooter>
<Button
type="submit"
// onClick={downloadReport}
>
Download
</Button>
</DialogFooter>
</DialogContent>
</Dialog>
</div> </div>
); );
}; };

View File

@ -0,0 +1,84 @@
"use client";
import Cookies from "js-cookie";
import { useEffect, useState } from "react";
import { getCookiesDecrypt } from "@/lib/utils";
import { generateTicket } from "@/service/tableau/tableau-service";
import { Button } from "../ui/button";
import { useTranslations } from "next-intl";
export default function PerformanceSatkerViz() {
const [hasMounted, setHasMounted] = useState(false);
const t = useTranslations("AnalyticsDashboard");
const levelName = getCookiesDecrypt("ulnae");
const poldaState = Cookies.get("state");
const provState = Cookies.get("state-prov");
const [ticket1, setTicket1] = useState("");
const [ticket2, setTicket2] = useState("");
const [ticket3, setTicket3] = useState("");
const [ticket4, setTicket4] = 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 view1 =
levelName == "MABES POLRI"
? isInternational[0]
? "views/2023_04_MediaHUB-Viz_INTL_Rev202/db-konten-top10?"
: "views/2023_04_MediaHUB-Viz-POLDA_Rev201/db-konten-top10?"
: `/views/2023_09_db-ranking-polres-by-polda_rev100/db-ranking-by-polda?polda-selected=${provState}&`;
const param = ":embed=yes&:toolbar=yes&:iframeSizedToWindow=true";
useEffect(() => {
async function initState() {
const response1 = await generateTicket();
setTicket1(response1?.data?.data);
}
initState();
}, [isInternational]);
// Hooks
useEffect(() => {
setHasMounted(true);
}, []);
// Render
if (!hasMounted) return null;
const handleInternational = (index: number, val: boolean) => {
const updatedIsInternational = [...isInternational];
updatedIsInternational[index] = val;
setIsInternational(updatedIsInternational);
};
return (
<div className="flex flex-col gap-2 bg-white rounded-lg p-3">
<p className="text-lg">
<b>
{isInternational[0] ? "SATKER PERFORMANCE" : "POLFORMANCE SATKER"}
</b>
</p>
<div className="my-5">
{ticket1 == "" ? (
<iframe
src={`${baseUrl + view1 + param}`}
width="100%"
height="750"
frameBorder="0"
/>
) : (
<iframe
src={`${`${url + ticket1}/${view1}${param}`}`}
width="100%"
height="750"
frameBorder="0"
/>
)}
</div>
</div>
);
}

View File

@ -1591,21 +1591,21 @@ export function getMenuList(pathname: string, t: any): Group[] {
submenus: [ submenus: [
{ {
href: "/contributor/schedule/press-conference", href: "/contributor/schedule/press-conference",
label: "konferensi pers", label: t("press-conference"),
active: pathname.includes("/schedule/press-conference"), active: pathname.includes("/schedule/press-conference"),
icon: "heroicons:arrow-trending-up", icon: "heroicons:arrow-trending-up",
children: [], children: [],
}, },
{ {
href: "/contributor/schedule/event", href: "/contributor/schedule/event",
label: "event", label: t("event"),
active: pathname.includes("/schedule/event"), active: pathname.includes("/schedule/event"),
icon: "heroicons:shopping-cart", icon: "heroicons:shopping-cart",
children: [], children: [],
}, },
{ {
href: "/contributor/schedule/press-release", href: "/contributor/schedule/press-release",
label: "pers rilis", label: t("press-release"),
active: pathname.includes("/schedule/press-release"), active: pathname.includes("/schedule/press-release"),
icon: "heroicons:shopping-cart", icon: "heroicons:shopping-cart",
children: [], children: [],
@ -1789,21 +1789,21 @@ export function getMenuList(pathname: string, t: any): Group[] {
submenus: [ submenus: [
{ {
href: "/contributor/schedule/press-conference", href: "/contributor/schedule/press-conference",
label: "konferensi pers", label: t("press-conference"),
active: pathname.includes("/schedule/press-conference"), active: pathname.includes("/schedule/press-conference"),
icon: "heroicons:arrow-trending-up", icon: "heroicons:arrow-trending-up",
children: [], children: [],
}, },
{ {
href: "/contributor/schedule/event", href: "/contributor/schedule/event",
label: "event", label: t("event"),
active: pathname.includes("/schedule/event"), active: pathname.includes("/schedule/event"),
icon: "heroicons:shopping-cart", icon: "heroicons:shopping-cart",
children: [], children: [],
}, },
{ {
href: "/contributor/schedule/press-release", href: "/contributor/schedule/press-release",
label: "pers rilis", label: t("press-release"),
active: pathname.includes("/schedule/press-release"), active: pathname.includes("/schedule/press-release"),
icon: "heroicons:shopping-cart", icon: "heroicons:shopping-cart",
children: [], children: [],
@ -2019,7 +2019,7 @@ export function getMenuList(pathname: string, t: any): Group[] {
submenus: [ submenus: [
{ {
href: "/contributor/schedule/press-conference", href: "/contributor/schedule/press-conference",
label: "konferensi pers", label: t("press-conference"),
active: pathname.includes("/schedule/press-conference"), active: pathname.includes("/schedule/press-conference"),
icon: "heroicons:arrow-trending-up", icon: "heroicons:arrow-trending-up",
children: [], children: [],
@ -2033,7 +2033,7 @@ export function getMenuList(pathname: string, t: any): Group[] {
}, },
{ {
href: "/contributor/schedule/press-release", href: "/contributor/schedule/press-release",
label: "pers rilis", label: t("press-release"),
active: pathname.includes("/schedule/press-release"), active: pathname.includes("/schedule/press-release"),
icon: "heroicons:shopping-cart", icon: "heroicons:shopping-cart",
children: [], children: [],
@ -2233,21 +2233,21 @@ export function getMenuList(pathname: string, t: any): Group[] {
submenus: [ submenus: [
{ {
href: "/contributor/schedule/press-conference", href: "/contributor/schedule/press-conference",
label: "konferensi pers", label: t("press-conference"),
active: pathname.includes("/schedule/press-conference"), active: pathname.includes("/schedule/press-conference"),
icon: "heroicons:arrow-trending-up", icon: "heroicons:arrow-trending-up",
children: [], children: [],
}, },
{ {
href: "/contributor/schedule/event", href: "/contributor/schedule/event",
label: "event", label: t("event"),
active: pathname.includes("/schedule/event"), active: pathname.includes("/schedule/event"),
icon: "heroicons:shopping-cart", icon: "heroicons:shopping-cart",
children: [], children: [],
}, },
{ {
href: "/contributor/schedule/press-release", href: "/contributor/schedule/press-release",
label: "pers rilis", label: t("press-release"),
active: pathname.includes("/schedule/press-release"), active: pathname.includes("/schedule/press-release"),
icon: "heroicons:shopping-cart", icon: "heroicons:shopping-cart",
children: [], children: [],
@ -2442,21 +2442,21 @@ export function getMenuList(pathname: string, t: any): Group[] {
submenus: [ submenus: [
{ {
href: "/contributor/schedule/press-conference", href: "/contributor/schedule/press-conference",
label: "konferensi pers", label: t("press-conference"),
active: pathname.includes("/schedule/press-conference"), active: pathname.includes("/schedule/press-conference"),
icon: "heroicons:arrow-trending-up", icon: "heroicons:arrow-trending-up",
children: [], children: [],
}, },
{ {
href: "/contributor/schedule/event", href: "/contributor/schedule/event",
label: "event", label: t("event"),
active: pathname.includes("/schedule/event"), active: pathname.includes("/schedule/event"),
icon: "heroicons:shopping-cart", icon: "heroicons:shopping-cart",
children: [], children: [],
}, },
{ {
href: "/contributor/schedule/press-release", href: "/contributor/schedule/press-release",
label: "pers rilis", label: t("press-release"),
active: pathname.includes("/schedule/press-release"), active: pathname.includes("/schedule/press-release"),
icon: "heroicons:shopping-cart", icon: "heroicons:shopping-cart",
children: [], children: [],
@ -3202,20 +3202,20 @@ export function getMenuList(pathname: string, t: any): Group[] {
}, },
], ],
}, },
{ // {
groupLabel: "", // groupLabel: "",
id: "agenda-setting", // id: "agenda-setting",
menus: [ // menus: [
{ // {
id: "agenda-setting", // id: "agenda-setting",
href: "/contributor/agenda-setting", // href: "/contributor/agenda-setting",
label: t("agenda-setting"), // label: t("agenda-setting"),
active: pathname.includes("/agenda-setting"), // active: pathname.includes("/agenda-setting"),
icon: "iconoir:journal-page", // icon: "iconoir:journal-page",
submenus: [], // submenus: [],
}, // },
], // ],
}, // },
{ {
groupLabel: "", groupLabel: "",
id: "performance-polres", id: "performance-polres",
@ -3364,11 +3364,39 @@ export function getMenuList(pathname: string, t: any): Group[] {
label: t("dashboard"), label: t("dashboard"),
active: pathname.includes("/dashboard"), active: pathname.includes("/dashboard"),
icon: "material-symbols:dashboard", icon: "material-symbols:dashboard",
submenus: [
{
href: "/dashboard/executive",
label: "Executive",
active: pathname === "/dashboard/executive",
icon: "heroicons:arrow-trending-up",
children: [],
},
{
href: "/dashboard",
label: "Breakdown",
active: pathname === "/dashboard",
icon: "heroicons:arrow-trending-up",
children: [],
},
],
},
],
},
{
groupLabel: "",
id: "management-user",
menus: [
{
id: "management-user-menu",
href: "/admin/management-user",
label: "Management User",
active: pathname.includes("/management-user"),
icon: "clarity:users-solid",
submenus: [], submenus: [],
}, },
], ],
}, },
{ {
groupLabel: "", groupLabel: "",
id: "content-production", id: "content-production",
@ -3397,6 +3425,49 @@ export function getMenuList(pathname: string, t: any): Group[] {
}, },
], ],
}, },
{
groupLabel: "",
id: "performance-polres",
menus: [
{
id: "performance-polres",
href: "/admin/performance-satker",
label: t("performance-satker"),
active: pathname.includes("/admin/performance-satker"),
icon: "ant-design:signal-filled",
submenus: [],
},
],
},
{
groupLabel: "",
id: "media-tracking",
menus: [
{
id: "media-tracking",
href: "/curator/media-tracking",
label: t("media-tracking"),
active: pathname.includes("/media-tracking"),
icon: "material-symbols:map-search-outline",
submenus: [
{
href: "/admin/media-tracking/media-online",
label: "Media Online",
active: pathname === "/media-tracking/media-online",
icon: "heroicons:arrow-trending-up",
children: [],
},
{
href: "/admin/media-tracking/tb-news",
label: "Tracking Beritra Hari Ini",
active: pathname === "/media-tracking/news",
icon: "heroicons:arrow-trending-up",
children: [],
},
],
},
],
},
{ {
groupLabel: "", groupLabel: "",
id: "communication", id: "communication",

View File

@ -325,10 +325,15 @@
"colors": "Colors", "colors": "Colors",
"performance-polda": "Performance Polda", "performance-polda": "Performance Polda",
"performance-polres": "Performance Polres", "performance-polres": "Performance Polres",
"performance-satker": "Performance Satker",
"analysis": "Analysis", "analysis": "Analysis",
"management-content": "Content Management ", "management-content": "Content Management ",
"add-experts": "Add Experts", "add-experts": "Add Experts",
"category": "Category", "category": "Category",
"add-category": "Add Category",
"tags": "Tags",
"add-tags": "Add Tags",
"add": "Add",
"privacy": "Privacy Policy" "privacy": "Privacy Policy"
}, },
"Changelog": { "Changelog": {
@ -580,7 +585,8 @@
"schedule": "Schedule", "schedule": "Schedule",
"press-conference": "Press Conference", "press-conference": "Press Conference",
"press-release": "Press Release", "press-release": "Press Release",
"create-schedule": "Create Schedule" "create-schedule": "Create Schedule",
"event": "event"
}, },
"Blog": { "Blog": {
"table": "Table", "table": "Table",
@ -599,5 +605,37 @@
"table": "Table", "table": "Table",
"contest": "Lomba", "contest": "Lomba",
"create-contest": "Create Contest" "create-contest": "Create Contest"
},
"Curation": {
"content-curation": "Content Curation"
},
"Table": {
"no": "No",
"title": "Title",
"category-name": "Category Name",
"upload-date": "Upload Date",
"creator-group": "Creator Group",
"source": "source",
"published": "Published",
"date": "Date",
"category": "Category",
"tag": "Tag",
"type-content": "Content Type",
"type-task": "Task Type",
"category-task": "Category Task",
"code": "Code",
"start-date": "Start Date",
"end-date": "End Date",
"speaker": "Speaker",
"time": "Time",
"address": "Address",
"question": "Question",
"sender": "Created By",
"sendto": "SendTo",
"type": "Type",
"duration": "Duration",
"target-output": "Target Output",
"target-participant": "Target Participant",
"action": "Actions"
} }
} }

View File

@ -326,10 +326,15 @@
"colors": "Colors", "colors": "Colors",
"performance-polda": "Performa Polda", "performance-polda": "Performa Polda",
"performance-polres": "Performa Polres", "performance-polres": "Performa Polres",
"performance-satker": "Performa Satker",
"analysis": "Analisa", "analysis": "Analisa",
"management-content": "Manajemen Konten", "management-content": "Manajemen Konten",
"add-experts": "Tambah Tenaga Ahli", "add-experts": "Tambah Tenaga Ahli",
"category": "Kategori", "category": "Kategori",
"add-category": "Tambah Kategori",
"tags": "Tag",
"add-tags": "Tambah Tag",
"add": "Tambah",
"privacy": "Kebijakan Privacy" "privacy": "Kebijakan Privacy"
}, },
"Changelog": { "Changelog": {
@ -581,7 +586,8 @@
"schedule": "Jadwal", "schedule": "Jadwal",
"press-conference": "Konferensi Pers", "press-conference": "Konferensi Pers",
"press-release": "Pers Rilis", "press-release": "Pers Rilis",
"create-schedule": "Buat Jadwal" "create-schedule": "Buat Jadwal",
"event": "event"
}, },
"Blog": { "Blog": {
"table": "Tabel", "table": "Tabel",
@ -600,5 +606,37 @@
"table": "Tabel", "table": "Tabel",
"contest": "Lomba", "contest": "Lomba",
"create-contest": "Buat Lomba" "create-contest": "Buat Lomba"
},
"Curation": {
"content-curation": "Kurasi Konten"
},
"Table": {
"no": "Nomor",
"title": "Judul",
"category-name": "Nama Kategori",
"upload-date": "Tanggal Upload",
"creator-group": "Pembuat",
"source": "Sumber",
"published": "Diterbitkan",
"date": "Tanggal",
"category": "Kategori",
"tag": "Tag",
"type-content": "Tipe Konten",
"type-task": "Tipen Penugasan",
"category-task": "Kategori Penugasan",
"code": "Kode",
"start-date": "Tanggal Mulai",
"end-date": "Tanggal Selesai",
"speaker": "Disampaikan Oleh",
"time": "Waktu",
"address": "Alamat",
"question": "Pertanyaan",
"sender": "Pengirim",
"sendto": "Penerima",
"type": "Tipe",
"duration": "Durasi",
"target-output": "Target Output",
"target-participant": "Target Peserta",
"action": "Aksi"
} }
} }

View File

@ -5,8 +5,15 @@ import {
import { httpGet } from "../http-config/http-base-service"; import { httpGet } from "../http-config/http-base-service";
import { any } from "zod"; import { any } from "zod";
export async function paginationSchedule(size: number, page: number, type: any, title: string = "") { export async function paginationSchedule(
return await httpGetInterceptor(`schedule/pagination?enablePage=1&scheduleTypeId=${type}&page=${page}&size=${size}&title=${title}`); size: number,
page: number,
type: any,
title: string = ""
) {
return await httpGetInterceptor(
`schedule/pagination?enablePage=1&scheduleTypeId=${type}&page=${page}&size=${size}&title=${title}`
);
} }
export async function postSchedule(data: any) { export async function postSchedule(data: any) {
@ -49,6 +56,11 @@ export async function listScheduleToday() {
return httpGetInterceptor(url); return httpGetInterceptor(url);
} }
export async function getListScheduleAttachment(scheduleId: any) {
const url = `media/list?&enablePage=0&scheduleId=${scheduleId}`;
return httpGetInterceptor(url);
}
export async function listScheduleNext() { export async function listScheduleNext() {
const url = "schedule/next-activity"; const url = "schedule/next-activity";
return httpGetInterceptor(url); return httpGetInterceptor(url);