diff --git a/app/(admin)/admin/article/page.tsx b/app/(admin)/admin/article/page.tsx index ad22653..b8ebefa 100644 --- a/app/(admin)/admin/article/page.tsx +++ b/app/(admin)/admin/article/page.tsx @@ -23,7 +23,7 @@ export default function BasicPage() { return (
-
+
*/}
-
+
diff --git a/app/(admin)/admin/e-magazine/page.tsx b/app/(admin)/admin/e-magazine/page.tsx deleted file mode 100644 index b2250f5..0000000 --- a/app/(admin)/admin/e-magazine/page.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import MagazineTable from '@/components/table/magazine/magazine-table' -import React from 'react' - -const AdminMagazine = () => { - return ( -
- ) -} - -export default AdminMagazine \ No newline at end of file diff --git a/app/(admin)/admin/e-magazine/create/page.tsx b/app/(admin)/admin/magazine/create/page.tsx similarity index 100% rename from app/(admin)/admin/e-magazine/create/page.tsx rename to app/(admin)/admin/magazine/create/page.tsx diff --git a/app/(admin)/admin/e-magazine/detail/page.tsx b/app/(admin)/admin/magazine/detail/page.tsx similarity index 100% rename from app/(admin)/admin/e-magazine/detail/page.tsx rename to app/(admin)/admin/magazine/detail/page.tsx diff --git a/app/(admin)/admin/magazine/page.tsx b/app/(admin)/admin/magazine/page.tsx new file mode 100644 index 0000000..f2c6555 --- /dev/null +++ b/app/(admin)/admin/magazine/page.tsx @@ -0,0 +1,41 @@ +"use client"; +import { AddIcon } from "@/components/icons"; +import ArticleTable from "@/components/table/article-table"; +import generatedArticleIds from "@/store/generated-article-store"; +import { Button, Card } from "@nextui-org/react"; +import Link from "next/link"; +import { useRouter } from "next/navigation"; + +export default function MagazineTable() { + const router = useRouter(); + const setGeneratedArticleIdStore = generatedArticleIds( + (state) => state.setArticleIds + ); + + return ( +
+
+
+ + + + {/* */} +
+
+ +
+
+
+ ); +} diff --git a/app/(admin)/admin/master-category/page.tsx b/app/(admin)/admin/master-category/page.tsx index ad10faf..c3a6a51 100644 --- a/app/(admin)/admin/master-category/page.tsx +++ b/app/(admin)/admin/master-category/page.tsx @@ -1,4 +1,339 @@ "use client"; -export default function MasterCategory() { - return
master category
; +import { AddIcon, CloudUploadIcon, TimesIcon } from "@/components/icons"; +import ArticleTable from "@/components/table/article-table"; +import CategoriesTable from "@/components/table/master-categories/categories-table"; +import generatedArticleIds from "@/store/generated-article-store"; +import { + Button, + Card, + Input, + Modal, + ModalBody, + ModalContent, + ModalFooter, + ModalHeader, + Textarea, + useDisclosure, +} from "@nextui-org/react"; +import Link from "next/link"; +import { useRouter } from "next/navigation"; +import * as z from "zod"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { Controller, useForm } from "react-hook-form"; +import { Fragment, useEffect, useState } from "react"; +import { getArticleByCategory } from "@/service/article"; +import ReactSelect from "react-select"; +import makeAnimated from "react-select/animated"; +import { useDropzone } from "react-dropzone"; +import { close, error, loading } from "@/config/swal"; +import { + createCategory, + uploadCategoryThumbnail, +} from "@/service/master-categories"; +import Swal from "sweetalert2"; +import withReactContent from "sweetalert2-react-content"; + +const categorySchema = z.object({ + id: z.number(), + label: z.string(), + value: z.number(), +}); + +const createArticleSchema = z.object({ + title: z.string().min(2, { + message: "Judul harus diisi", + }), + description: z.string().min(2, { + message: "Deskripsi harus diisi", + }), + category: z.array(categorySchema).nonempty({ + message: "Kategori harus memiliki setidaknya satu item", + }), +}); + +interface CategoryType { + id: number; + label: string; + value: number; +} + +export default function MasterCategoryTable() { + const router = useRouter(); + const MySwal = withReactContent(Swal); + + const animatedComponents = makeAnimated(); + const { isOpen, onOpen, onOpenChange, onClose } = useDisclosure(); + const [listCategory, setListCategory] = useState([]); + const [files, setFiles] = useState([]); + const [refresh, setRefresh] = useState(false); + + const formOptions = { + resolver: zodResolver(createArticleSchema), + defaultValues: { title: "", description: "", category: [], tags: [] }, + }; + + const { getRootProps, getInputProps } = useDropzone({ + onDrop: (acceptedFiles) => { + setFiles(acceptedFiles.map((file) => Object.assign(file))); + }, + maxFiles: 1, + }); + type UserSettingSchema = z.infer; + const { + control, + handleSubmit, + formState: { errors }, + setValue, + getValues, + watch, + setError, + clearErrors, + } = useForm(formOptions); + + useEffect(() => { + fetchCategory(); + }, []); + + const fetchCategory = async () => { + const res = await getArticleByCategory(); + if (res?.data?.data) { + setupCategory(res?.data?.data); + } + }; + + const setupCategory = (data: any) => { + const temp = []; + for (const element of data) { + temp.push({ + id: element.id, + label: element.title, + value: element.id, + }); + } + setListCategory(temp); + }; + + const onSubmit = async (values: z.infer) => { + console.log("values,", values); + loading(); + const formData = { + title: values.title, + statusId: 1, + parentId: values.category[0].id, + description: values.description, + }; + + const response = await createCategory(formData); + + if (response?.error) { + error(response.message); + return false; + } + const categoryId = response?.data?.data?.id; + const formFiles = new FormData(); + + formFiles.append("file", files[0]); + const resFile = await uploadCategoryThumbnail(categoryId, formFiles); + if (resFile?.error) { + error(resFile.message); + return false; + } + close(); + setRefresh(!refresh); + MySwal.fire({ + title: "Sukses", + icon: "success", + confirmButtonColor: "#3085d6", + confirmButtonText: "OK", + }).then((result) => { + if (result.isConfirmed) { + } + }); + }; + + const handleRemoveFile = (file: File) => { + const uploadedFiles = files; + const filtered = uploadedFiles.filter((i) => i.name !== file.name); + setFiles([...filtered]); + }; + + return ( +
+
+
+ + + + {() => ( + <> + + Kategori Baru + + +
+
+

Nama Kategori

+ ( + + )} + /> + {errors?.title && ( +

+ {errors.title?.message} +

+ )} +
+
+

Deskripsi

+ ( +