From 212a544765ca89889180e51d5645c6b0b8019715 Mon Sep 17 00:00:00 2001 From: Anang Yusman Date: Wed, 12 Feb 2025 21:00:06 +0800 Subject: [PATCH] feat:upload contest --- .../(protected)/contributor/blog/page.tsx | 2 +- .../schedule/media/audio/create/page.tsx | 15 ++ .../schedule/media/image/create/page.tsx | 17 ++ .../schedule/media/text/create/page.tsx | 16 ++ .../schedule/media/video/create/page.tsx | 15 ++ .../(protected)/contributor/task/page.tsx | 2 +- .../(protected)/shared/contest/page.tsx | 2 +- .../form/contest/contest-detail-form.tsx | 190 +++++++++++------- .../form/schedule/event-detail-form.tsx | 111 +++++++++- components/form/schedule/event-form.tsx | 34 +++- .../form/schedule/event-update-form.tsx | 104 +++++++++- .../schedule/pers-release--detail-form.tsx | 129 +++++++++++- .../schedule/pers-release--update-form.tsx | 100 ++++++++- .../form/schedule/pers-release-form.tsx | 35 +++- lib/menus.ts | 14 +- public/assets/img/upload-audio.png | Bin 0 -> 7120 bytes public/assets/img/upload-image.png | Bin 0 -> 6350 bytes public/assets/img/upload-text.png | Bin 0 -> 6055 bytes public/assets/img/upload-video.png | Bin 0 -> 6172 bytes 19 files changed, 673 insertions(+), 113 deletions(-) create mode 100644 app/[locale]/(protected)/contributor/schedule/media/audio/create/page.tsx create mode 100644 app/[locale]/(protected)/contributor/schedule/media/image/create/page.tsx create mode 100644 app/[locale]/(protected)/contributor/schedule/media/text/create/page.tsx create mode 100644 app/[locale]/(protected)/contributor/schedule/media/video/create/page.tsx create mode 100644 public/assets/img/upload-audio.png create mode 100644 public/assets/img/upload-image.png create mode 100644 public/assets/img/upload-text.png create mode 100644 public/assets/img/upload-video.png diff --git a/app/[locale]/(protected)/contributor/blog/page.tsx b/app/[locale]/(protected)/contributor/blog/page.tsx index 6cfc19b4..71849fb4 100644 --- a/app/[locale]/(protected)/contributor/blog/page.tsx +++ b/app/[locale]/(protected)/contributor/blog/page.tsx @@ -15,7 +15,7 @@ const BlogPage = async () => {
- Table Indeks + Tabel Indeks
diff --git a/app/[locale]/(protected)/contributor/schedule/media/audio/create/page.tsx b/app/[locale]/(protected)/contributor/schedule/media/audio/create/page.tsx new file mode 100644 index 00000000..245ddf9f --- /dev/null +++ b/app/[locale]/(protected)/contributor/schedule/media/audio/create/page.tsx @@ -0,0 +1,15 @@ +import FormAudio from "@/components/form/content/audio-form"; +import SiteBreadcrumb from "@/components/site-breadcrumb"; + +const AudioScheduleCreatePage = async () => { + return ( +
+ +
+ +
+
+ ); +}; + +export default AudioScheduleCreatePage; diff --git a/app/[locale]/(protected)/contributor/schedule/media/image/create/page.tsx b/app/[locale]/(protected)/contributor/schedule/media/image/create/page.tsx new file mode 100644 index 00000000..73082e9a --- /dev/null +++ b/app/[locale]/(protected)/contributor/schedule/media/image/create/page.tsx @@ -0,0 +1,17 @@ +import { Card, CardContent } from "@/components/ui/card"; +import SiteBreadcrumb from "@/components/site-breadcrumb"; +import FormTask from "@/components/form/task/task-form"; +import FormImage from "@/components/form/content/image-form"; + +const ImageScheduleCreatePage = async () => { + return ( +
+ +
+ +
+
+ ); +}; + +export default ImageScheduleCreatePage; diff --git a/app/[locale]/(protected)/contributor/schedule/media/text/create/page.tsx b/app/[locale]/(protected)/contributor/schedule/media/text/create/page.tsx new file mode 100644 index 00000000..905e8275 --- /dev/null +++ b/app/[locale]/(protected)/contributor/schedule/media/text/create/page.tsx @@ -0,0 +1,16 @@ +import FormAudio from "@/components/form/content/audio-form"; +import FormTeks from "@/components/form/content/teks-form"; +import SiteBreadcrumb from "@/components/site-breadcrumb"; + +const TeksScheduleCreatePage = async () => { + return ( +
+ +
+ +
+
+ ); +}; + +export default TeksScheduleCreatePage; diff --git a/app/[locale]/(protected)/contributor/schedule/media/video/create/page.tsx b/app/[locale]/(protected)/contributor/schedule/media/video/create/page.tsx new file mode 100644 index 00000000..7c5eb0fc --- /dev/null +++ b/app/[locale]/(protected)/contributor/schedule/media/video/create/page.tsx @@ -0,0 +1,15 @@ +import FormVideo from "@/components/form/content/video-form"; +import SiteBreadcrumb from "@/components/site-breadcrumb"; + +const VideoScheduleCreatePage = async () => { + return ( +
+ +
+ +
+
+ ); +}; + +export default VideoScheduleCreatePage; diff --git a/app/[locale]/(protected)/contributor/task/page.tsx b/app/[locale]/(protected)/contributor/task/page.tsx index 0d91735d..54d82f79 100644 --- a/app/[locale]/(protected)/contributor/task/page.tsx +++ b/app/[locale]/(protected)/contributor/task/page.tsx @@ -27,7 +27,7 @@ const TaskPage = () => {
- Table Penugasan + Tabel Penugasan
diff --git a/app/[locale]/(protected)/shared/contest/page.tsx b/app/[locale]/(protected)/shared/contest/page.tsx index 72fbd099..77f8ed14 100644 --- a/app/[locale]/(protected)/shared/contest/page.tsx +++ b/app/[locale]/(protected)/shared/contest/page.tsx @@ -15,7 +15,7 @@ const ContestPage = () => {
- Table Lomba + Tabel Lomba
diff --git a/components/form/contest/contest-detail-form.tsx b/components/form/contest/contest-detail-form.tsx index 8cefbfc5..723d7c1d 100644 --- a/components/form/contest/contest-detail-form.tsx +++ b/components/form/contest/contest-detail-form.tsx @@ -51,9 +51,14 @@ import { AudioRecorder } from "react-audio-voice-recorder"; import { error, loading } from "@/lib/swal"; import { Upload } from "tus-js-client"; import { getCsrfToken } from "@/service/auth"; +import { getOnlyDate } from "@/utils/globals"; +import { duration } from "moment"; const contestSchema = z.object({ theme: z.string().min(1, { message: "Judul diperlukan" }), + duration: z + .array(z.string().min(1)) // Gunakan array string untuk menyimpan range tanggal + .min(1, { message: "Tanggal diperlukan" }), hastagCode: z.string().min(1, { message: "Judul diperlukan" }), description: z.string().min(2, { message: "Narasi Penugasan harus lebih dari 2 karakter.", @@ -76,7 +81,7 @@ export type contestDetail = { id: number; name: string; }; - createdAt: string; + duration: string; platformType: string | null; assignmentTypeId: string; targetOutput: string; @@ -190,9 +195,12 @@ export default function FormContestDetail() { const details = response?.data?.data; setDetail(details); - if (details?.createdAt) { - const parsedDate = parseISO(details.createdAt); - setDate({ from: parsedDate, to: parsedDate }); + if (details?.duration) { + const [start, end] = details.duration.split(" - "); // Pisahkan tanggal + setDate({ + from: parseISO(start), + to: end ? parseISO(end) : undefined, // Pastikan `to` bisa undefined jika hanya satu tanggal + }); } } } @@ -212,19 +220,19 @@ export default function FormContestDetail() { } }, [detail?.targetOutput]); - // useEffect(() => { - // if (detail?.targetParticipantTopLevel) { - // const outputSet = new Set( - // detail.targetParticipantTopLevel.split(",").map(Number) - // ); - // setUnitSelection({ - // allUnit: outputSet.has(0), - // mabes: outputSet.has(1), - // polda: outputSet.has(2), - // polres: outputSet.has(3), - // }); - // } - // }, [detail?.targetParticipantTopLevel]); + useEffect(() => { + if (detail?.targetParticipantTopLevel) { + const outputSet = new Set( + detail.targetParticipantTopLevel.split(",").map(Number) + ); + setUnitSelection({ + allUnit: outputSet.has(0), + mabes: outputSet.has(1), + polda: outputSet.has(2), + polres: outputSet.has(3), + }); + } + }, [detail?.targetParticipantTopLevel]); const handleCheckboxChange = (levelId: number) => { setCheckedLevels((prev) => { @@ -244,11 +252,11 @@ export default function FormContestDetail() { const save = async (data: ContestSchema) => { const fileTypeMapping = { - all: "1", + all: "0", video: "2", - audio: "3", - image: "4", - text: "5", + audio: "4", + image: "1", + text: "3", }; const unitMapping = { @@ -268,26 +276,38 @@ export default function FormContestDetail() { .map((key) => fileTypeMapping[key as keyof typeof fileTypeMapping]) // Konversi ke nilai string .join(","); + // Pastikan `data.duration` ada dan dikonversi ke `Date` + const startDate = data.duration?.[0] ? new Date(data.duration[0]) : null; + const endDate = data.duration?.[1] ? new Date(data.duration[1]) : null; + + const formattedDuration = startDate + ? endDate + ? `${getOnlyDate(startDate)} - ${getOnlyDate(endDate)}` + : getOnlyDate(startDate) + : ""; + const requestData: { id?: any; theme: string; - assignedToLevel: any; - assignmentPurpose: any; + duration: string; + targetParticipantTopLevel: any; + targetParticipant: any; hastagCode: string; description: string; - assignmentMainTypeId: any; scoringFormula: string; - fileTypeOutput: any; + targetOutput: any; + attachmentUrl: string[]; } = { ...data, hastagCode: data.hastagCode, theme: data.theme, + duration: formattedDuration, description: data.description, scoringFormula: data.scoringFormula, - assignmentMainTypeId: mainType, - assignedToLevel: handlePoldaPolresChange(), - assignmentPurpose: assignmentPurposeString, - fileTypeOutput: selectedOutputs, + targetParticipantTopLevel: handlePoldaPolresChange(), + targetParticipant: assignmentPurposeString, + targetOutput: selectedOutputs, + attachmentUrl: links, }; // if (id != undefined) { @@ -299,7 +319,7 @@ export default function FormContestDetail() { console.log("Form Data Submitted:", requestData); console.log("response", response); - const id = response?.data?.data.id; + const id = response?.data?.data?.id; loading(); if (imageFiles?.length == 0) { setIsImageUploadFinish(true); @@ -334,16 +354,6 @@ export default function FormContestDetail() { "0" // Optional: Replace with actual duration if available ); }); - - // MySwal.fire({ - // title: "Sukses", - // text: "Data berhasil disimpan.", - // icon: "success", - // confirmButtonColor: "#3085d6", - // confirmButtonText: "OK", - // }).then(() => { - // router.push("/en/shared/contest"); - // }); }; const onSubmit = (data: ContestSchema) => { @@ -584,43 +594,67 @@ export default function FormContestDetail() {
- - - - - - - - + ( + + + + + + { + setDate(newDate); // Update state lokal + if (newDate?.from) { + const formattedDate = [ + format(newDate.from, "yyyy-MM-dd"), + newDate.to + ? format(newDate.to, "yyyy-MM-dd") + : "", + ].filter(Boolean); // Hanya menyimpan yang tidak undefined + onChange(formattedDate); // Simpan ke React Hook Form + } else { + onChange([]); // Reset jika tidak ada tanggal + } + }} + numberOfMonths={1} + /> + + + )} + /> + {errors.duration?.message && ( +

+ {errors.duration.message} +

+ )}
@@ -763,7 +797,7 @@ export default function FormContestDetail() { )}
- +
+ + +
+ +

0 Lampiran

+
+
+ +

+ Pilih Jenis Lampiran +

+
+ +
+
+ {"item.label"} +

+ Audio Visual +

+
+
+

+ Unggah media berupa video dengan format avi, wmv, + atau mp4 dengan ukuran minimal 2mb dan maksimal + 500mb. +

+
+
+ + +
+
+ {"item.label"} +

Foto

+
+
+

+ Unggah media berupa video dengan format avi, wmv, + atau mp4 dengan ukuran minimal 2mb dan maksimal + 500mb. +

+
+
+ + +
+
+ {"item.label"} +

Teks

+
+
+

+ Unggah media berupa video dengan format avi, wmv, + atau mp4 dengan ukuran minimal 2mb dan maksimal + 500mb. +

+
+
+ + +
+
+ {"item.label"} +

Audio

+
+
+

+ Unggah media berupa video dengan format avi, wmv, + atau mp4 dengan ukuran minimal 2mb dan maksimal + 500mb. +

+
+
+ +
+
+
) : ( "" )} - {/* Submit Button -
- -
*/} +
+
+
diff --git a/components/form/schedule/event-form.tsx b/components/form/schedule/event-form.tsx index b3b9de11..9c86364e 100644 --- a/components/form/schedule/event-form.tsx +++ b/components/form/schedule/event-form.tsx @@ -26,7 +26,7 @@ import { PopoverTrigger, } from "@/components/ui/popover"; import { cn } from "@/lib/utils"; -import { CalendarIcon } from "lucide-react"; +import { CalendarIcon, Plus } from "lucide-react"; import { Calendar } from "@/components/ui/calendar"; import { addDays, format, setDate } from "date-fns"; import { DateRange } from "react-day-picker"; @@ -149,6 +149,23 @@ export default function FormEvent() { }); }; + const handleUploadAttachment = () => { + const scheduleId = Cookies.get("scheduleId"); + + if (scheduleId == undefined) { + MySwal.fire({ + title: "Simpan Jadwal Terlebih Dahulu", + icon: "info", + confirmButtonColor: "#3085d6", + confirmButtonText: "Ok", + }).then((result) => { + if (result.isConfirmed) { + return true; + } + }); + } + }; + return (
@@ -351,8 +368,19 @@ export default function FormEvent() {
- {/* Submit Button */} -
+
+ +

0 Llampiran

+
+
diff --git a/components/form/schedule/event-update-form.tsx b/components/form/schedule/event-update-form.tsx index 8ae2ebfa..bfd6bb6c 100644 --- a/components/form/schedule/event-update-form.tsx +++ b/components/form/schedule/event-update-form.tsx @@ -17,7 +17,7 @@ import { PopoverTrigger, } from "@/components/ui/popover"; import { cn } from "@/lib/utils"; -import { CalendarIcon } from "lucide-react"; +import { CalendarIcon, Plus } from "lucide-react"; import { Calendar } from "@/components/ui/calendar"; import { addDays, format, parseISO, setDate } from "date-fns"; import { DateRange } from "react-day-picker"; @@ -29,6 +29,8 @@ import { Textarea } from "@/components/ui/textarea"; import { error, loading } from "@/lib/swal"; import Cookies from "js-cookie"; import { detailSchedule, postSchedule } from "@/service/schedule/schedule"; +import { Dialog, DialogContent, DialogTrigger } from "@/components/ui/dialog"; +import { Link } from "@/i18n/routing"; const taskSchema = z.object({ title: z.string().min(1, { message: "Judul diperlukan" }), @@ -48,6 +50,7 @@ interface Detail { } export default function FormEventUpdate() { + const [open, setOpen] = useState(false); const { id } = useParams() as { id: string }; console.log(id); const router = useRouter(); @@ -379,12 +382,107 @@ export default function FormEventUpdate() { )}
+ + +
+ +

0 Lampiran

+
+
+ +

+ Pilih Jenis Lampiran +

+
+ +
+
+ {"item.label"} +

+ Audio Visual +

+
+
+

+ Unggah media berupa video dengan format avi, wmv, + atau mp4 dengan ukuran minimal 2mb dan maksimal + 500mb. +

+
+
+ + +
+
+ {"item.label"} +

Foto

+
+
+

+ Unggah media berupa video dengan format avi, wmv, + atau mp4 dengan ukuran minimal 2mb dan maksimal + 500mb. +

+
+
+ + +
+
+ {"item.label"} +

Teks

+
+
+

+ Unggah media berupa video dengan format avi, wmv, + atau mp4 dengan ukuran minimal 2mb dan maksimal + 500mb. +

+
+
+ + +
+
+ {"item.label"} +

Audio

+
+
+

+ Unggah media berupa video dengan format avi, wmv, + atau mp4 dengan ukuran minimal 2mb dan maksimal + 500mb. +

+
+
+ +
+
+
) : ( "" )} - {/* Submit Button */} -
+ +
diff --git a/components/form/schedule/pers-release--detail-form.tsx b/components/form/schedule/pers-release--detail-form.tsx index 253d0b9e..10e4eeaa 100644 --- a/components/form/schedule/pers-release--detail-form.tsx +++ b/components/form/schedule/pers-release--detail-form.tsx @@ -17,7 +17,7 @@ import { PopoverTrigger, } from "@/components/ui/popover"; import { cn } from "@/lib/utils"; -import { CalendarIcon, Clock1, MapPin, User2 } from "lucide-react"; +import { CalendarIcon, Clock1, MapPin, Plus, User2 } from "lucide-react"; import { Calendar } from "@/components/ui/calendar"; import { addDays, format, parseISO, setDate } from "date-fns"; import { DateRange } from "react-day-picker"; @@ -48,6 +48,8 @@ import { AccordionTrigger, } from "@/components/ui/accordion"; import { formatDate } from "@fullcalendar/core/index.js"; +import { Dialog, DialogContent, DialogTrigger } from "@/components/ui/dialog"; +import { Link } from "@/i18n/routing"; const taskSchema = z.object({ title: z.string().min(1, { message: "Judul diperlukan" }), @@ -67,7 +69,9 @@ interface Detail { } export default function FormDetailPressRillis() { + const [open, setOpen] = useState(false); const { id } = useParams() as { id: string }; + const MySwal = withReactContent(Swal); console.log(id); const router = useRouter(); const [isLiveStreamingEnabled, setIsLiveStreamingEnabled] = useState(false); @@ -135,6 +139,23 @@ export default function FormDetailPressRillis() { setEndTime(e.target.value); }; + const handleUploadAttachment = () => { + const scheduleId = Cookies.get("scheduleId"); + + if (scheduleId == undefined) { + MySwal.fire({ + title: "Simpan Jadwal Terlebih Dahulu", + icon: "info", + confirmButtonColor: "#3085d6", + confirmButtonText: "Ok", + }).then((result) => { + if (result.isConfirmed) { + return true; + } + }); + } + }; + return (
@@ -352,16 +373,110 @@ export default function FormDetailPressRillis() { )}
+ + +
+ +

0 Lampiran

+
+
+ +

+ Pilih Jenis Lampiran +

+
+ +
+
+ {"item.label"} +

+ Audio Visual +

+
+
+

+ Unggah media berupa video dengan format avi, wmv, + atau mp4 dengan ukuran minimal 2mb dan maksimal + 500mb. +

+
+
+ + +
+
+ {"item.label"} +

Foto

+
+
+

+ Unggah media berupa video dengan format avi, wmv, + atau mp4 dengan ukuran minimal 2mb dan maksimal + 500mb. +

+
+
+ + +
+
+ {"item.label"} +

Teks

+
+
+

+ Unggah media berupa video dengan format avi, wmv, + atau mp4 dengan ukuran minimal 2mb dan maksimal + 500mb. +

+
+
+ + +
+
+ {"item.label"} +

Audio

+
+
+

+ Unggah media berupa video dengan format avi, wmv, + atau mp4 dengan ukuran minimal 2mb dan maksimal + 500mb. +

+
+
+ +
+
+
) : ( "" )} - {/* Submit Button -
- -
*/} +
+ +
diff --git a/components/form/schedule/pers-release--update-form.tsx b/components/form/schedule/pers-release--update-form.tsx index 079dfdf7..af3df3a4 100644 --- a/components/form/schedule/pers-release--update-form.tsx +++ b/components/form/schedule/pers-release--update-form.tsx @@ -17,7 +17,7 @@ import { PopoverTrigger, } from "@/components/ui/popover"; import { cn } from "@/lib/utils"; -import { CalendarIcon } from "lucide-react"; +import { CalendarIcon, Plus } from "lucide-react"; import { Calendar } from "@/components/ui/calendar"; import { addDays, format, parseISO, setDate } from "date-fns"; import { DateRange } from "react-day-picker"; @@ -36,6 +36,8 @@ import { SelectTrigger, SelectValue, } from "@/components/ui/select"; +import { Dialog, DialogContent, DialogTrigger } from "@/components/ui/dialog"; +import { Link } from "@/i18n/routing"; const taskSchema = z.object({ title: z.string().min(1, { message: "Judul diperlukan" }), @@ -55,6 +57,7 @@ interface Detail { } export default function FormUpdatePressRelease() { + const [open, setOpen] = useState(false); const { id } = useParams() as { id: string }; console.log(id); const router = useRouter(); @@ -403,6 +406,101 @@ export default function FormUpdatePressRelease() { )} + + +
+ +

0 Lampiran

+
+
+ +

+ Pilih Jenis Lampiran +

+
+ +
+
+ {"item.label"} +

+ Audio Visual +

+
+
+

+ Unggah media berupa video dengan format avi, wmv, + atau mp4 dengan ukuran minimal 2mb dan maksimal + 500mb. +

+
+
+ + +
+
+ {"item.label"} +

Foto

+
+
+

+ Unggah media berupa video dengan format avi, wmv, + atau mp4 dengan ukuran minimal 2mb dan maksimal + 500mb. +

+
+
+ + +
+
+ {"item.label"} +

Teks

+
+
+

+ Unggah media berupa video dengan format avi, wmv, + atau mp4 dengan ukuran minimal 2mb dan maksimal + 500mb. +

+
+
+ + +
+
+ {"item.label"} +

Audio

+
+
+

+ Unggah media berupa video dengan format avi, wmv, + atau mp4 dengan ukuran minimal 2mb dan maksimal + 500mb. +

+
+
+ +
+
+
) : ( "" diff --git a/components/form/schedule/pers-release-form.tsx b/components/form/schedule/pers-release-form.tsx index 3628d9c2..ffca8506 100644 --- a/components/form/schedule/pers-release-form.tsx +++ b/components/form/schedule/pers-release-form.tsx @@ -27,7 +27,7 @@ import { PopoverTrigger, } from "@/components/ui/popover"; import { cn } from "@/lib/utils"; -import { CalendarIcon } from "lucide-react"; +import { CalendarIcon, Plus } from "lucide-react"; import { Calendar } from "@/components/ui/calendar"; import { addDays, format, setDate } from "date-fns"; import { DateRange } from "react-day-picker"; @@ -133,6 +133,23 @@ export default function FormPressRelease() { }); }; + const handleUploadAttachment = () => { + const scheduleId = Cookies.get("scheduleId"); + + if (scheduleId == undefined) { + MySwal.fire({ + title: "Simpan Jadwal Terlebih Dahulu", + icon: "info", + confirmButtonColor: "#3085d6", + confirmButtonText: "Ok", + }).then((result) => { + if (result.isConfirmed) { + return true; + } + }); + } + }; + const onSubmit = (data: TaskSchema) => { MySwal.fire({ title: "Simpan Data", @@ -367,9 +384,19 @@ export default function FormPressRelease() { - - {/* Submit Button */} -
+
+ +

0 Llampiran

+
+
diff --git a/lib/menus.ts b/lib/menus.ts index 5e369193..25a025ee 100644 --- a/lib/menus.ts +++ b/lib/menus.ts @@ -1599,7 +1599,7 @@ export function getMenuList(pathname: string, t: any): Group[] { { id: "contest", href: "/shared/contest", - label: t("contest"), + label: t("lomba"), active: pathname.includes("/contest"), icon: "ic:outline-emoji-events", submenus: [], @@ -1783,7 +1783,7 @@ export function getMenuList(pathname: string, t: any): Group[] { { id: "contest", href: "/shared/contest", - label: t("contest"), + label: t("lomba"), active: pathname.includes("/contest"), icon: "ic:outline-emoji-events", submenus: [], @@ -1949,7 +1949,7 @@ export function getMenuList(pathname: string, t: any): Group[] { { id: "contest", href: "/shared/contest", - label: t("contest"), + label: t("lomba"), active: pathname.includes("/contest"), icon: "ic:outline-emoji-events", submenus: [], @@ -2177,7 +2177,7 @@ export function getMenuList(pathname: string, t: any): Group[] { { id: "contest", href: "/shared/contest", - label: t("contest"), + label: t("lomba"), active: pathname.includes("/contest"), icon: "ic:outline-emoji-events", submenus: [], @@ -2386,7 +2386,7 @@ export function getMenuList(pathname: string, t: any): Group[] { { id: "contest", href: "/shared/contest", - label: t("contest"), + label: "Lomba", active: pathname.includes("/contest"), icon: "ic:outline-emoji-events", submenus: [], @@ -2669,7 +2669,7 @@ export function getMenuList(pathname: string, t: any): Group[] { { id: "contest", href: "/shared/contest", - label: t("contest"), + label: t("Lomba"), active: pathname.includes("/contest"), icon: "ic:outline-emoji-events", submenus: [], @@ -2873,7 +2873,7 @@ export function getMenuList(pathname: string, t: any): Group[] { { id: "contest", href: "/shared/contest", - label: t("contest"), + label: "Lomba", active: pathname.includes("/contest"), icon: "ic:outline-emoji-events", submenus: [], diff --git a/public/assets/img/upload-audio.png b/public/assets/img/upload-audio.png new file mode 100644 index 0000000000000000000000000000000000000000..88978967a585bff5f1979010fc1615862972fd9e GIT binary patch literal 7120 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 QBme*a07*qoM6N<$f?|U$cK`qY literal 0 HcmV?d00001 diff --git a/public/assets/img/upload-text.png b/public/assets/img/upload-text.png new file mode 100644 index 0000000000000000000000000000000000000000..1e18f22d98d52dccc005b603de706a079cd7d356 GIT binary patch literal 6055 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 uN6^