diff --git a/app/[locale]/(protected)/schedule/event/create/page.tsx b/app/[locale]/(protected)/schedule/event/create/page.tsx new file mode 100644 index 00000000..b95f30e8 --- /dev/null +++ b/app/[locale]/(protected)/schedule/event/create/page.tsx @@ -0,0 +1,18 @@ +import { Card, CardContent } from "@/components/ui/card"; +import SiteBreadcrumb from "@/components/site-breadcrumb"; +import FormTask from "@/components/form/task/task-form"; +import FormPressConference from "@/components/form/schedule/press-conference-form"; +import FormEvent from "@/components/form/schedule/event-form"; + +const EventCreatePage = async () => { + return ( +
+ +
+ +
+
+ ); +}; + +export default EventCreatePage; diff --git a/app/[locale]/(protected)/schedule/event/page.tsx b/app/[locale]/(protected)/schedule/event/page.tsx index 51d278a4..35ed6c5a 100644 --- a/app/[locale]/(protected)/schedule/event/page.tsx +++ b/app/[locale]/(protected)/schedule/event/page.tsx @@ -4,6 +4,7 @@ import { Card, CardContent } from "@/components/ui/card"; import { UploadIcon } from "lucide-react"; import PressConferenceTable from "../press-conference/table-presscon/presscon-table"; import EventTable from "./table-event/event-table"; +import { Link } from "@/components/navigation"; const EventPage = async () => { return ( @@ -16,10 +17,12 @@ const EventPage = async () => { Jadwal Event
- + + +
diff --git a/app/[locale]/(protected)/schedule/press-conference/create/page.tsx b/app/[locale]/(protected)/schedule/press-conference/create/page.tsx new file mode 100644 index 00000000..5da19f92 --- /dev/null +++ b/app/[locale]/(protected)/schedule/press-conference/create/page.tsx @@ -0,0 +1,17 @@ +import { Card, CardContent } from "@/components/ui/card"; +import SiteBreadcrumb from "@/components/site-breadcrumb"; +import FormTask from "@/components/form/task/task-form"; +import FormPressConference from "@/components/form/schedule/press-conference-form"; + +const PressConCreatePage = async () => { + return ( +
+ +
+ +
+
+ ); +}; + +export default PressConCreatePage; diff --git a/app/[locale]/(protected)/schedule/press-conference/page.tsx b/app/[locale]/(protected)/schedule/press-conference/page.tsx index 2aa11f68..4af93bff 100644 --- a/app/[locale]/(protected)/schedule/press-conference/page.tsx +++ b/app/[locale]/(protected)/schedule/press-conference/page.tsx @@ -3,6 +3,7 @@ import { Button } from "@/components/ui/button"; import { Card, CardContent } from "@/components/ui/card"; import PressConferenceTable from "./table-presscon/presscon-table"; import { UploadIcon } from "lucide-react"; +import { Link } from "@/components/navigation"; const PressConferencePage = async () => { return ( @@ -15,10 +16,12 @@ const PressConferencePage = async () => { Jadwal Konferensi Pers
- + + +
diff --git a/app/[locale]/(protected)/schedule/press-release/create/page.tsx b/app/[locale]/(protected)/schedule/press-release/create/page.tsx new file mode 100644 index 00000000..fe24fb7b --- /dev/null +++ b/app/[locale]/(protected)/schedule/press-release/create/page.tsx @@ -0,0 +1,18 @@ +import { Card, CardContent } from "@/components/ui/card"; +import SiteBreadcrumb from "@/components/site-breadcrumb"; +import FormTask from "@/components/form/task/task-form"; +import FormPressConference from "@/components/form/schedule/press-conference-form"; +import FormPressRelease from "@/components/form/schedule/pers-release-form"; + +const PressReleaseCreatePage = async () => { + return ( +
+ +
+ +
+
+ ); +}; + +export default PressReleaseCreatePage; diff --git a/app/[locale]/(protected)/schedule/press-release/page.tsx b/app/[locale]/(protected)/schedule/press-release/page.tsx index b6a231bb..220a2941 100644 --- a/app/[locale]/(protected)/schedule/press-release/page.tsx +++ b/app/[locale]/(protected)/schedule/press-release/page.tsx @@ -3,6 +3,7 @@ import { Button } from "@/components/ui/button"; import { Card, CardContent } from "@/components/ui/card"; import { UploadIcon } from "lucide-react"; import PressReleaseTable from "../press-conference/table-presscon/presscon-table"; +import { Link } from "@/components/navigation"; const PressReleasePage = async () => { return ( @@ -15,10 +16,12 @@ const PressReleasePage = async () => { Jadwal Pers Rilis
- + + +
diff --git a/app/[locale]/(protected)/task/create/page.tsx b/app/[locale]/(protected)/task/create/page.tsx new file mode 100644 index 00000000..8531305f --- /dev/null +++ b/app/[locale]/(protected)/task/create/page.tsx @@ -0,0 +1,16 @@ +import { Card, CardContent } from "@/components/ui/card"; +import SiteBreadcrumb from "@/components/site-breadcrumb"; +import FormTask from "@/components/form/task/task-form"; + +const TaskCreatePage = async () => { + return ( +
+ +
+ +
+
+ ); +}; + +export default TaskCreatePage; diff --git a/app/[locale]/(protected)/task/detail/[id]/page.tsx b/app/[locale]/(protected)/task/detail/[id]/page.tsx new file mode 100644 index 00000000..cafd8320 --- /dev/null +++ b/app/[locale]/(protected)/task/detail/[id]/page.tsx @@ -0,0 +1,16 @@ +import { Card, CardContent } from "@/components/ui/card"; +import SiteBreadcrumb from "@/components/site-breadcrumb"; +import FormTask from "@/components/form/task/task-form"; + +const TaskDetailPage = async () => { + return ( +
+ +
+ +
+
+ ); +}; + +export default TaskDetailPage; diff --git a/app/[locale]/(protected)/task/page.tsx b/app/[locale]/(protected)/task/page.tsx index 41023d95..7b62e7dd 100644 --- a/app/[locale]/(protected)/task/page.tsx +++ b/app/[locale]/(protected)/task/page.tsx @@ -3,6 +3,7 @@ import TaskTable from "./table-task/task-table"; import { Button } from "@/components/ui/button"; import { UploadIcon } from "lucide-react"; import SiteBreadcrumb from "@/components/site-breadcrumb"; +import { Link } from "@/components/navigation"; const TaskPage = async () => { return ( @@ -14,6 +15,14 @@ const TaskPage = async () => {
Table Penugasan
+
+ + + +
diff --git a/app/[locale]/(protected)/task/table-task/task-table.tsx b/app/[locale]/(protected)/task/table-task/task-table.tsx index f2bf3b66..3a3644a2 100644 --- a/app/[locale]/(protected)/task/table-task/task-table.tsx +++ b/app/[locale]/(protected)/task/table-task/task-table.tsx @@ -56,6 +56,7 @@ export type CompanyData = { import { data } from "./data"; import { Input } from "@/components/ui/input"; import { InputGroup, InputGroupText } from "@/components/ui/input-group"; +import { Link } from "@/components/navigation"; export const columns: ColumnDef[] = [ { @@ -134,14 +135,12 @@ export const columns: ColumnDef[] = [ - - - View - - - - Edit - + + + + View + + Delete diff --git a/components/form/schedule/event-form.tsx b/components/form/schedule/event-form.tsx new file mode 100644 index 00000000..34ac0d07 --- /dev/null +++ b/components/form/schedule/event-form.tsx @@ -0,0 +1,358 @@ +"use client"; +import React, { useRef, useState } from "react"; +import { useForm, Controller } from "react-hook-form"; +import { Input } from "@/components/ui/input"; +import { Button } from "@/components/ui/button"; +import { Label } from "@/components/ui/label"; +import { Card } from "@/components/ui/card"; +import { zodResolver } from "@hookform/resolvers/zod"; +import * as z from "zod"; +import Swal from "sweetalert2"; +import withReactContent from "sweetalert2-react-content"; +import { useRouter } from "next/navigation"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; +import { Checkbox } from "@/components/ui/checkbox"; +import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; +import JoditEditor from "jodit-react"; +import { Switch } from "@/components/ui/switch"; +import { + Popover, + PopoverContent, + PopoverTrigger, +} from "@/components/ui/popover"; +import { cn } from "@/lib/utils"; +import { CalendarIcon } from "lucide-react"; +import { Calendar } from "@/components/ui/calendar"; +import { addDays, format, setDate } from "date-fns"; +import { DateRange } from "react-day-picker"; +import TimePicker from "react-time-picker"; +import "react-time-picker/dist/TimePicker.css"; +import "react-clock/dist/Clock.css"; +import { register } from "module"; +import MapHome from "@/components/maps/MapHome"; +import { Textarea } from "@/components/ui/textarea"; + +const taskSchema = z.object({ + title: z.string().min(1, { message: "Judul diperlukan" }), + rankName: z.string().min(1, { message: "Nama Pangkat diperlukan" }), + fullName: z.string().min(1, { message: "Nama Lengkap diperlukan" }), + naration: z.string().min(2, { + message: "Narasi Penugasan harus lebih dari 2 karakter.", + }), + location: z.string().min(1, { message: "Nama Lengkap diperlukan" }), +}); + +export default function FormEvent() { + const MySwal = withReactContent(Swal); + const router = useRouter(); + const editor = useRef(null); + const [isLiveStreamingEnabled, setIsLiveStreamingEnabled] = useState(false); + type TaskSchema = z.infer; + const [startTime, setStartTime] = useState("08:00"); + const [endTime, setEndTime] = useState("09:00"); + + const [date, setDate] = React.useState({ + from: new Date(2024, 0, 1), + }); + + const handleStartTime = (e: any) => { + setStartTime(e.target.value); + }; + + const handleEndTime = (e: any) => { + setEndTime(e.target.value); + }; + // State for various form fields + const [output, setOutput] = useState({ + all: false, + video: false, + audio: false, + image: false, + text: false, + }); + + const [assignmentType, setAssignmentType] = useState("mediahub"); + const [assignmentCategory, setAssignmentCategory] = useState("publication"); + + const [selectedTarget, setSelectedTarget] = useState("all"); + const [unitSelection, setUnitSelection] = useState({ + allUnit: false, + mabes: false, + polda: false, + polres: false, + }); + + const { + control, + handleSubmit, + setValue, + formState: { errors }, + } = useForm({ + resolver: zodResolver(taskSchema), + defaultValues: { + location: "", + }, + }); + + const save = async (data: TaskSchema) => { + const requestData = { + ...data, + output, + assignmentType, + assignmentCategory, + target: selectedTarget, + unitSelection, + }; + + console.log("Form Data Submitted:", requestData); + + MySwal.fire({ + title: "Sukses", + text: "Data berhasil disimpan.", + icon: "success", + confirmButtonColor: "#3085d6", + confirmButtonText: "OK", + }).then(() => { + router.push("/en/task"); + }); + }; + + const onSubmit = (data: TaskSchema) => { + MySwal.fire({ + title: "Simpan Data", + text: "Apakah Anda yakin ingin menyimpan data ini?", + icon: "warning", + showCancelButton: true, + cancelButtonColor: "#d33", + confirmButtonColor: "#3085d6", + confirmButtonText: "Simpan", + }).then((result) => { + if (result.isConfirmed) { + save(data); + } + }); + }; + + return ( +
+ +
+

Form Konferensi Pers

+
+
+ {/* Input Title */} +
+ + ( + + )} + /> + {errors.title?.message && ( +

{errors.title.message}

+ )} +
+
+
+ +
+

Aktifkan fitur live streaming

+ + setIsLiveStreamingEnabled(checked) + } + /> +
+
+
+ + {isLiveStreamingEnabled && ( +
+ ( + + )} + /> + {errors.title?.message && ( +

+ {errors.title.message} +

+ )} +
+ )} + +
+
+ + + + + + + + + +
+
+ +
+
+
+ handleStartTime(e)} + /> +
+
+ handleEndTime(e)} + /> +
+
+
+
+
+
+ {/* Kirim setValue ke MapHome */} + setValue("location", location)} + /> +
+
+ ( +