pull main

This commit is contained in:
Sabda Yagra 2025-06-30 10:52:44 +07:00
parent 9345345e02
commit 0f9c070af1
10295 changed files with 274 additions and 46 deletions

View File

@ -255,15 +255,15 @@ export default function FormImageDetail() {
setSelectedPublishers(publisherIds); setSelectedPublishers(publisherIds);
} }
const matchingCategory = categories.find( // const matchingCategory = categories.find(
(category) => category.id === details.categoryId // (category) => category.id === details.categoryId
); // );
if (matchingCategory) { // if (matchingCategory) {
setSelectedTarget(matchingCategory.name); // setSelectedTarget(matchingCategory.name);
} // }
setSelectedTarget(details.categoryId); // Untuk dropdown // setSelectedTarget(details.categoryId);
const filesData = details.files || []; const filesData = details.files || [];
const fileUrls = filesData.map((file: { thumbnailFileUrl: string }) => const fileUrls = filesData.map((file: { thumbnailFileUrl: string }) =>
@ -488,19 +488,21 @@ export default function FormImageDetail() {
<div className="flex items-center"> <div className="flex items-center">
<div className="py-3 w-full space-y-2"> <div className="py-3 w-full space-y-2">
<Label>{t("category")}</Label> <Label>{t("category")}</Label>
<Select <Select
value={detail?.category.name} // Nilai default berdasarkan detail disabled
onValueChange={(id) => { defaultValue={String(detail?.category.id)}
console.log("Selected Category:", id); // onValueChange={(id) => {
setSelectedTarget(id); // console.log("Selected Category:", id);
}} // setSelectedTarget(id);
// }}
> >
<SelectTrigger size="md"> <SelectTrigger size="md">
<SelectValue placeholder="Pilih" /> <SelectValue placeholder="Pilih" />
</SelectTrigger> </SelectTrigger>
<SelectContent> <SelectContent>
{categories.map((category) => ( {categories.map((category) => (
<SelectItem key={category.id} value={category.name}> <SelectItem key={String(category.id)} value={String(category.id)}>
{category.name} {category.name}
</SelectItem> </SelectItem>
))} ))}

View File

@ -390,16 +390,16 @@ export default function FormImage() {
e.preventDefault(); e.preventDefault();
const newTag = e.currentTarget.value.trim(); const newTag = e.currentTarget.value.trim();
if (!tags.includes(newTag)) { if (!tags.includes(newTag)) {
setTags((prevTags) => [...prevTags, newTag]); // Add new tag setTags((prevTags) => [...prevTags, newTag]);
if (inputRef.current) { if (inputRef.current) {
inputRef.current.value = ""; // Clear input field inputRef.current.value = "";
} }
} }
} }
}; };
const handleRemoveTag = (index: number) => { const handleRemoveTag = (index: number) => {
setTags((prevTags) => prevTags.filter((_, i) => i !== index)); // Remove tag setTags((prevTags) => prevTags.filter((_, i) => i !== index));
}; };
const handleRemoveImage = (index: number) => { const handleRemoveImage = (index: number) => {
@ -431,7 +431,7 @@ export default function FormImage() {
if (findCategory) { if (findCategory) {
// setValue("categoryId", findCategory.id); // setValue("categoryId", findCategory.id);
setSelectedCategory(findCategory.id); // Set the selected category setSelectedCategory(findCategory.id);
const response = await getTagsBySubCategoryId(findCategory.id); const response = await getTagsBySubCategoryId(findCategory.id);
setTags(response?.data?.data); setTags(response?.data?.data);
} }
@ -444,10 +444,8 @@ export default function FormImage() {
const handleCheckboxChange = (id: string): void => { const handleCheckboxChange = (id: string): void => {
if (id === "all") { if (id === "all") {
if (publishedFor.includes("all")) { if (publishedFor.includes("all")) {
// Uncheck all checkboxes
setPublishedFor([]); setPublishedFor([]);
} else { } else {
// Select all checkboxes
setPublishedFor( setPublishedFor(
options options
.filter((opt: any) => opt.id !== "all") .filter((opt: any) => opt.id !== "all")
@ -458,8 +456,6 @@ export default function FormImage() {
const updatedPublishedFor = publishedFor.includes(id) const updatedPublishedFor = publishedFor.includes(id)
? publishedFor.filter((item) => item !== id) ? publishedFor.filter((item) => item !== id)
: [...publishedFor, id]; : [...publishedFor, id];
// Remove "all" if any checkbox is unchecked
if (publishedFor.includes("all") && id !== "all") { if (publishedFor.includes("all") && id !== "all") {
setPublishedFor(updatedPublishedFor.filter((item) => item !== "all")); setPublishedFor(updatedPublishedFor.filter((item) => item !== "all"));
} else { } else {
@ -526,7 +522,7 @@ export default function FormImage() {
let id = Cookies.get("idCreate"); let id = Cookies.get("idCreate");
if (scheduleId !== undefined) { if (scheduleId !== undefined) {
requestData.attachFromScheduleId = Number(scheduleId); // ✅ Tambahkan nilai ini requestData.attachFromScheduleId = Number(scheduleId);
} }
if (id == undefined) { if (id == undefined) {
@ -535,8 +531,6 @@ export default function FormImage() {
Cookies.set("idCreate", response?.data?.data, { expires: 1 }); Cookies.set("idCreate", response?.data?.data, { expires: 1 });
id = response?.data?.data; id = response?.data?.data;
// Upload Thumbnail
const formMedia = new FormData(); const formMedia = new FormData();
const thumbnail = files[0]; const thumbnail = files[0];
formMedia.append("file", thumbnail); formMedia.append("file", thumbnail);
@ -546,8 +540,6 @@ export default function FormImage() {
return false; return false;
} }
} }
// Upload File
const progressInfoArr = files.map((item) => ({ const progressInfoArr = files.map((item) => ({
percentage: 0, percentage: 0,
fileName: item.name, fileName: item.name,
@ -613,7 +605,7 @@ export default function FormImage() {
filename: file.name, filename: file.name,
filetype: file.type, filetype: file.type,
duration, duration,
isWatermark: "true", // hardcode isWatermark: "true",
}, },
onBeforeRequest: function (req) { onBeforeRequest: function (req) {
var xhr = req.getUnderlyingObject(); var xhr = req.getUnderlyingObject();
@ -744,7 +736,6 @@ export default function FormImage() {
}; };
useEffect(() => { useEffect(() => {
// Jika input title kosong, isi dengan hasil generate title
if (!getValues("title") && title) { if (!getValues("title") && title) {
setValue("title", title); setValue("title", title);
} }
@ -758,7 +749,7 @@ export default function FormImage() {
lang: "id", lang: "id",
contextType: "text", contextType: "text",
urlContext: null, urlContext: null,
context: editorContent, // Ambil isi editor original context: editorContent,
createdBy: roleId, createdBy: roleId,
sentiment: "Humorous", sentiment: "Humorous",
clientId: "7QTW8cMojyayt6qnhqTOeJaBI70W4EaQ", clientId: "7QTW8cMojyayt6qnhqTOeJaBI70W4EaQ",
@ -821,7 +812,7 @@ export default function FormImage() {
<div className="py-3 space-y-2 w-full"> <div className="py-3 space-y-2 w-full">
<Label>{t("category")}</Label> <Label>{t("category")}</Label>
<Select <Select
value={selectedCategory} // Ensure selectedTarget is updated correctly value={selectedCategory}
onValueChange={(id) => { onValueChange={(id) => {
console.log("Selected Category ID:", id); console.log("Selected Category ID:", id);
setSelectedCategory(id); setSelectedCategory(id);

View File

@ -654,8 +654,6 @@ export default function FormImageUpdate() {
error(response.message); error(response.message);
return; return;
} }
// Jika berhasil, hapus file dari state lokal
setFiles((prevFiles: any) => setFiles((prevFiles: any) =>
prevFiles.filter((file: any) => file.id !== id) prevFiles.filter((file: any) => file.id !== id)
); );

View File

@ -503,7 +503,7 @@ export default function FormVideoDetail() {
className="object-fill h-full w-full" className="object-fill h-full w-full"
src={data.secondaryUrl} src={data.secondaryUrl}
controls controls
title={`Video ${data.id}`} // Mengganti alt dengan title title={`Video ${data.id}`}
/> />
</SwiperSlide> </SwiperSlide>
))} ))}

View File

@ -1,15 +1,22 @@
import search from "@/app/[locale]/(protected)/app/chat/components/search"; import search from "@/app/[locale]/(protected)/app/chat/components/search";
import { useTranslations } from "next-intl"; import { useTranslations } from "next-intl";
import { useParams, useRouter } from "next/navigation"; import { useParams } from "next/navigation";
import router from "next/router"; import router from "next/router";
import React, { useEffect, useState } from "react"; import React, { useEffect, useState } from "react";
import { Icon } from "@iconify/react/dist/iconify.js"; import { Icon } from "@iconify/react/dist/iconify.js";
import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue } from "../ui/select"; import {
Select,
SelectContent,
SelectGroup,
SelectItem,
SelectTrigger,
SelectValue,
} from "../ui/select";
import Image from "next/image"; import Image from "next/image";
import { getHeroData } from "@/service/landing/landing"; import { getHeroData } from "@/service/landing/landing";
import { title } from "process"; import { title } from "process";
import { htmlToString } from "@/utils/globals"; import { htmlToString } from "@/utils/globals";
import { Link } from "@/i18n/routing"; import { Link, useRouter } from "@/i18n/routing";
const ScrollableContentPolda = () => { const ScrollableContentPolda = () => {
const [contentType, setContentType] = useState("all"); const [contentType, setContentType] = useState("all");
@ -20,6 +27,14 @@ const ScrollableContentPolda = () => {
const t = useTranslations("LandingPage"); const t = useTranslations("LandingPage");
const poldaName: any = params?.polda_name; const poldaName: any = params?.polda_name;
const [content, setContent] = useState<any>(); const [content, setContent] = useState<any>();
const satkerName = params?.satker_name;
let prefixPath = poldaName
? `/polda/${poldaName}`
: satkerName
? `/satker/${satkerName}`
: "";
useEffect(() => { useEffect(() => {
async function fetchCategories() { async function fetchCategories() {
const url = "https://netidhub.com/api/csrf"; const url = "https://netidhub.com/api/csrf";
@ -71,7 +86,14 @@ const ScrollableContentPolda = () => {
<Select value={contentType} onValueChange={setContentType}> <Select value={contentType} onValueChange={setContentType}>
<SelectTrigger className="w-[180px] h-[55px]"> <SelectTrigger className="w-[180px] h-[55px]">
<span className="text-black"> <span className="text-black">
<svg className="mx-2 dark:" width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <svg
className="mx-2 dark:"
width="25"
height="24"
viewBox="0 0 25 24"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path <path
d="M20 7.5H5C4.6023 7.5004 4.221 7.65856 3.93978 7.93978C3.65856 8.221 3.5004 8.6023 3.5 9V19.5C3.5004 19.8977 3.65856 20.279 3.93978 20.5602C4.221 20.8414 4.6023 20.9996 5 21H20C20.3977 20.9996 20.779 20.8414 21.0602 20.5602C21.3414 20.279 21.4996 19.8977 21.5 19.5V9C21.4996 8.6023 21.3414 8.221 21.0602 7.93978C20.779 7.65856 20.3977 7.5004 20 7.5ZM10.25 17.25V11.25L15.5 14.25L10.25 17.25ZM5 4.5H20V6H5V4.5ZM6.5 1.5H18.5V3H6.5V1.5Z" d="M20 7.5H5C4.6023 7.5004 4.221 7.65856 3.93978 7.93978C3.65856 8.221 3.5004 8.6023 3.5 9V19.5C3.5004 19.8977 3.65856 20.279 3.93978 20.5602C4.221 20.8414 4.6023 20.9996 5 21H20C20.3977 20.9996 20.779 20.8414 21.0602 20.5602C21.3414 20.279 21.4996 19.8977 21.5 19.5V9C21.4996 8.6023 21.3414 8.221 21.0602 7.93978C20.779 7.65856 20.3977 7.5004 20 7.5ZM10.25 17.25V11.25L15.5 14.25L10.25 17.25ZM5 4.5H20V6H5V4.5ZM6.5 1.5H18.5V3H6.5V1.5Z"
fill="currentColor" fill="currentColor"
@ -92,17 +114,32 @@ const ScrollableContentPolda = () => {
</Select> </Select>
<div className="flex items-center flex-1 border border-gray-300 rounded-lg overflow-hidden"> <div className="flex items-center flex-1 border border-gray-300 rounded-lg overflow-hidden">
<span className="material-icons text-black dark:text-white px-4"> <span className="material-icons text-black dark:text-white px-4">
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"> <svg
xmlns="http://www.w3.org/2000/svg"
width="1em"
height="1em"
viewBox="0 0 24 24"
>
<path <path
fill="currentColor" fill="currentColor"
d="m19.6 21l-6.3-6.3q-.75.6-1.725.95T9.5 16q-2.725 0-4.612-1.888T3 9.5t1.888-4.612T9.5 3t4.613 1.888T16 9.5q0 1.1-.35 2.075T14.7 13.3l6.3 6.3zM9.5 14q1.875 0 3.188-1.312T14 9.5t-1.312-3.187T9.5 5T6.313 6.313T5 9.5t1.313 3.188T9.5 14" d="m19.6 21l-6.3-6.3q-.75.6-1.725.95T9.5 16q-2.725 0-4.612-1.888T3 9.5t1.888-4.612T9.5 3t4.613 1.888T16 9.5q0 1.1-.35 2.075T14.7 13.3l6.3 6.3zM9.5 14q1.875 0 3.188-1.312T14 9.5t-1.312-3.187T9.5 5T6.313 6.313T5 9.5t1.313 3.188T9.5 14"
/> />
</svg> </svg>
</span> </span>
<input type="text" placeholder={t("searchCoverageHere")} className="w-full py-4 px-2 text-sm text-gray-700 dark:text-gray-100 focus:outline-none" onChange={(e) => setSearch(e.target.value)} /> <input
type="text"
placeholder={t("searchCoverageHere")}
className="w-full py-4 px-2 text-sm text-gray-700 dark:text-gray-100 focus:outline-none"
onChange={(e) => setSearch(e.target.value)}
/>
</div> </div>
</div> </div>
<button onClick={() => router.push(`/${contentType}/filter?title=${search}`)} className="flex justify-center items-center px-6 w-full lg:w-[20%] py-4 bg-[#bb3523] gap-2 text-white rounded-lg hover:bg-red-700"> <button
onClick={() =>
router.push(prefixPath + `/${contentType}/filter?title=${search}`)
}
className="flex justify-center items-center px-6 w-full lg:w-[20%] py-4 bg-[#bb3523] gap-2 text-white rounded-lg hover:bg-red-700"
>
{t("searchCoverage")} {t("searchCoverage")}
<Icon icon="ri:arrow-right-s-line" fontSize={20} /> <Icon icon="ri:arrow-right-s-line" fontSize={20} />
</button> </button>

View File

@ -1,6 +1,6 @@
import search from "@/app/[locale]/(protected)/app/chat/components/search"; import search from "@/app/[locale]/(protected)/app/chat/components/search";
import { useTranslations } from "next-intl"; import { useTranslations } from "next-intl";
import { useParams, useRouter } from "next/navigation"; import { useParams } from "next/navigation";
import router from "next/router"; import router from "next/router";
import React, { useEffect, useState } from "react"; import React, { useEffect, useState } from "react";
import { Icon } from "@iconify/react/dist/iconify.js"; import { Icon } from "@iconify/react/dist/iconify.js";
@ -16,7 +16,7 @@ import Image from "next/image";
import { getHeroData } from "@/service/landing/landing"; import { getHeroData } from "@/service/landing/landing";
import { title } from "process"; import { title } from "process";
import { htmlToString } from "@/utils/globals"; import { htmlToString } from "@/utils/globals";
import { Link } from "@/i18n/routing"; import { Link, useRouter } from "@/i18n/routing";
const ScrollableContentSatker = () => { const ScrollableContentSatker = () => {
const [contentType, setContentType] = useState("all"); const [contentType, setContentType] = useState("all");
@ -27,6 +27,13 @@ const ScrollableContentSatker = () => {
const t = useTranslations("LandingPage"); const t = useTranslations("LandingPage");
const satkerName: any = params?.satker_name; const satkerName: any = params?.satker_name;
const [content, setContent] = useState<any>(); const [content, setContent] = useState<any>();
const poldaName: any = params?.polda_name;
let prefixPath = poldaName
? `/polda/${poldaName}`
: satkerName
? `/satker/${satkerName}`
: "";
useEffect(() => { useEffect(() => {
async function fetchCategories() { async function fetchCategories() {
const url = "https://netidhub.com/api/csrf"; const url = "https://netidhub.com/api/csrf";
@ -128,7 +135,7 @@ const ScrollableContentSatker = () => {
</div> </div>
<button <button
onClick={() => onClick={() =>
router.push(`/${contentType}/filter?title=${search}`) router.push(prefixPath + `/${contentType}/filter?title=${search}`)
} }
className="flex justify-center items-center px-6 w-full lg:w-[20%] py-4 bg-[#bb3523] gap-2 text-white rounded-lg hover:bg-red-700" className="flex justify-center items-center px-6 w-full lg:w-[20%] py-4 bg-[#bb3523] gap-2 text-white rounded-lg hover:bg-red-700"
> >

View File

@ -1,6 +1,6 @@
import search from "@/app/[locale]/(protected)/app/chat/components/search"; import search from "@/app/[locale]/(protected)/app/chat/components/search";
import { useTranslations } from "next-intl"; import { useTranslations } from "next-intl";
import { useParams, useRouter } from "next/navigation"; import { useParams } from "next/navigation";
import router from "next/router"; import router from "next/router";
import React, { useEffect, useState } from "react"; import React, { useEffect, useState } from "react";
import { Icon } from "@iconify/react/dist/iconify.js"; import { Icon } from "@iconify/react/dist/iconify.js";
@ -16,7 +16,7 @@ import Image from "next/image";
import { getHeroData } from "@/service/landing/landing"; import { getHeroData } from "@/service/landing/landing";
import { title } from "process"; import { title } from "process";
import { htmlToString } from "@/utils/globals"; import { htmlToString } from "@/utils/globals";
import { Link } from "@/i18n/routing"; import { Link, useRouter } from "@/i18n/routing";
import { Button } from "../ui/button"; import { Button } from "../ui/button";
const ScrollableContent = () => { const ScrollableContent = () => {
@ -150,7 +150,7 @@ const ScrollableContent = () => {
</div> </div>
<button <button
onClick={() => onClick={() =>
router.push(`/${contentType}/filter?title=${search}`) router.push( prefixPath + `/${contentType}/filter?title=${search}`)
} }
className="flex justify-center items-center px-6 w-full lg:w-[20%] py-4 bg-[#bb3523] gap-2 text-white rounded-lg hover:bg-red-700 text-[14px]" className="flex justify-center items-center px-6 w-full lg:w-[20%] py-4 bg-[#bb3523] gap-2 text-white rounded-lg hover:bg-red-700 text-[14px]"
> >

Some files were not shown because too many files have changed in this diff Show More