({
resolver: zodResolver(imageSchema),
@@ -940,7 +947,11 @@ export default function FormImageUpdate() {
const temp = [];
for (let i = 0; i < filePlacements?.length; i++) {
const file = files[i] as any;
- if (file.id && filePlacements[file.id] && filePlacements[file.id].length > 0) {
+ if (
+ file.id &&
+ filePlacements[file.id] &&
+ filePlacements[file.id].length > 0
+ ) {
const now = filePlacements[file.id];
const normalizedNow = now.map((item): PlacementType => {
const value = String(item);
@@ -971,12 +982,19 @@ export default function FormImageUpdate() {
const save = async (data: ImageSchema) => {
loading();
const finalTags = tags.join(", ");
+
+ // ✅ tentukan isi description sesuai pilihan bahasa
+ const descFinal =
+ selectedLang === "en" && translatedContent
+ ? translatedContent
+ : data.description;
+
const requestData = {
...data,
id: detail?.id,
title: data.title,
- description: htmlToString(data.description),
- htmlDescription: data.description,
+ description: htmlToString(descFinal), // versi plain text
+ htmlDescription: descFinal, // versi HTML
fileTypeId,
categoryId: selectedTarget,
subCategoryId: selectedTarget,
@@ -993,7 +1011,6 @@ export default function FormImageUpdate() {
console.log("getPlacement(): ", getPlacement());
const response = await createMedia(requestData);
- console.log("Form Data Submitted:", requestData);
if (response?.error) {
error(response?.message);
return false;
@@ -1158,22 +1175,6 @@ export default function FormImageUpdate() {
setFiles([]);
};
- // const renderFilePreview = (file: FileWithPreview) => {
- // if (file?.type?.startsWith("image")) {
- // return (
- //
- // );
- // } else {
- // return ;
- // }
- // };
-
const renderFilePreview = (file: FileWithPreview | any) => {
if (file?.preview || file instanceof File) {
return (
@@ -1206,41 +1207,6 @@ export default function FormImageUpdate() {
setFiles([...filtered]);
};
- // const fileList = files.map((file: any) => (
- //
- //
- //
{renderFilePreview(file)}
- //
- //
- // {file.fileName || file.name}
- //
- //
- // {Math.round(file.size / 100) / 10 > 1000 ? (
- // <>{(Math.round(file.size / 100) / 10000).toFixed(1)}>
- // ) : (
- // <>{(Math.round(file.size / 100) / 10).toFixed(1)}>
- // )}
- // {" kb"}
- //
- //
- //
-
- //
- //
- // ));
-
const fileList = files.map((file: any) => (
([]);
- // const [filePlacements, setFilePlacements] = useState([]);
-
- // const setupPlacement = (
- // index: number,
- // placement: string,
- // checked: boolean
- // ) => {
- // let temp = [...filePlacements];
- // if (checked) {
- // if (placement === "all") {
- // temp[index] = ["all", "mabes", "polda", "satker", "international"];
-
- // for (let i = 0; i < tempFile?.length; i++) {
- // const element = tempFile[i];
-
- // // Checklist semua item di modal
- // listDest.forEach((item: any) => {
- // currentFileLevels.add(Number(item.id));
- // if (item.subDestination) {
- // item.subDestination.forEach((sub: any) => {
- // currentFileLevels.add(Number(sub.id));
- // });
- // }
- // });
-
- // newArray[index] = currentFileLevels;
- // return newArray;
- // });
-
- // // Update fileUnitSelections untuk checkbox tingkat utama
- // setFileUnitSelections((prevSelections) => {
- // const newSelections = [...prevSelections];
- // const currentSelection = { ...newSelections[index] };
-
- // // Set semua checkbox tingkat utama ke true
- // currentSelection.nasional = true;
- // currentSelection.wilayah = true;
- // currentSelection.international = true;
- // currentSelection.polda = true;
- // currentSelection.satker = true;
- // currentSelection.semua = true;
-
- // newSelections[index] = currentSelection;
- // return newSelections;
- // });
- // } else if (placement === "satker") {
- // // Ketika satker di-checklist, HANYA tambahkan satker saja
- // const now = temp[index] || [];
- // if (!now.includes("satker")) {
- // now.push("satker");
- // }
- // temp[index] = now;
- // } else if (placement === "polda") {
- // // Ketika polda di-checklist, tambahkan polda ke filePlacements
- // const now = temp[index] || [];
- // if (!now.includes("polda")) {
- // now.push("polda");
- // }
- // temp[index] = now;
- // } else if (placement === "wilayah") {
- // // Ketika wilayah dicentang, tambahkan wilayah, polda, dan satker
- // const now = temp[index] || [];
- // if (!now.includes("wilayah")) {
- // now.push("wilayah");
- // }
- // if (!now.includes("polda")) {
- // now.push("polda");
- // }
- // if (!now.includes("satker")) {
- // now.push("satker");
- // }
- // temp[index] = now;
- // } else {
- // const now = temp[index] || [];
- // if (!now.includes(placement)) {
- // now.push(placement);
- // }
- // // Auto-checklist "all" jika nasional, wilayah, dan international ter-checklist
- // const requiredItems = ["nasional", "wilayah", "international"];
- // const hasAllRequired = requiredItems.every(item => now.includes(item));
- // if (hasAllRequired && !now.includes("all")) {
- // now.push("all");
- // }
- // temp[index] = now;
- // }
- // } else {
- // if (placement === "all") {
- // temp[index] = [];
-
- // if (findPlacementIdx > -1) {
- // const findPlacement = filePlacements[findPlacementIdx];
-
- // // Unchecklist semua item di modal
- // currentFileLevels.clear();
-
- // newArray[index] = currentFileLevels;
- // return newArray;
- // });
-
- // // Update fileUnitSelections untuk checkbox tingkat utama
- // setFileUnitSelections((prevSelections) => {
- // const newSelections = [...prevSelections];
- // const currentSelection = { ...newSelections[index] };
-
- // // Set semua checkbox tingkat utama ke false
- // currentSelection.nasional = false;
- // currentSelection.wilayah = false;
- // currentSelection.international = false;
- // currentSelection.polda = false;
- // currentSelection.satker = false;
- // currentSelection.semua = false;
-
- // newSelections[index] = currentSelection;
- // return newSelections;
- // });
- // } else {
- // if (placement === "wilayah") {
- // // Ketika wilayah di-uncheck, hapus wilayah, polda, dan satker
- // const now = temp[index]?.filter((a) =>
- // a !== "wilayah" && a !== "polda" && a !== "satker"
- // );
- // temp[index] = now;
- // } else if (placement === "polda") {
- // // Ketika polda di-uncheck, hapus polda dari filePlacements
- // const now = temp[index]?.filter((a) => a !== "polda");
- // temp[index] = now;
- // } else if (placement === "satker") {
- // // Ketika satker di-uncheck, hapus satker dari filePlacements
- // const now = temp[index]?.filter((a) => a !== "satker");
- // temp[index] = now;
- // } else {
- // const now = temp[index]?.filter((a) => a !== placement);
- // temp[index] = now;
- // }
-
- // // Hapus "all" jika tidak semua item ter-checklist
- // const currentNow = temp[index] || [];
- // if (currentNow.includes("all")) {
- // const requiredItems = ["nasional", "wilayah", "international"];
- // const hasAllRequired = requiredItems.every(item => currentNow.includes(item));
- // if (!hasAllRequired) {
- // const newData = currentNow.filter((b) => b !== "all");
- // temp[index] = newData;
- // }
- // } else {
- // const file: FilePlacement = {
- // mediaFileId: Number(element.id),
- // placements: [placement],
- // };
-
- // arrayFile.push(file);
- // }
- // }
- // }
-
- // const finalPlacements = [...filePlacements, ...arrayFile];
- // setFilePlacements(finalPlacements);
- // console.log("FileDestination.leng::", finalPlacements);
- // };
const setupPlacement = (
index: number,
placement: string,
@@ -1456,15 +1263,11 @@ export default function FormImageUpdate() {
if (checked) {
if (placement === "all") {
temp[index] = ["all", "mabes", "polda", "international"];
-
- // Update fileCheckedLevels untuk sinkronisasi dengan modal ketika "all" diklik
setFileCheckedLevels((prevLevels) => {
const newArray = [...prevLevels];
const currentFileLevels = new Set(
newArray[index] || new Set()
);
-
- // Checklist semua item di modal
listDest.forEach((item: any) => {
currentFileLevels.add(Number(item.id));
if (item.subDestination) {
@@ -1473,17 +1276,12 @@ export default function FormImageUpdate() {
});
}
});
-
newArray[index] = currentFileLevels;
return newArray;
});
-
- // Update fileUnitSelections untuk checkbox tingkat utama
setFileUnitSelections((prevSelections) => {
const newSelections = [...prevSelections];
const currentSelection = { ...newSelections[index] };
-
- // Set semua checkbox tingkat utama ke true
currentSelection.nasional = true;
currentSelection.wilayah = true;
currentSelection.international = true;
@@ -1496,8 +1294,6 @@ export default function FormImageUpdate() {
return newSelections;
});
} else if (placement === "satker") {
- // Ketika satker di-checklist, HANYA tambahkan satker saja
- // JANGAN otomatis checklist polres
const now = temp[index] || [];
if (!now.includes("satker")) {
now.push("satker");
@@ -1508,8 +1304,6 @@ export default function FormImageUpdate() {
if (!now.includes(placement)) {
now.push(placement);
}
- // Hanya auto-checklist "all" jika polda, polres, dan mabes ter-checklist
- // JANGAN include satker dalam perhitungan auto "all"
const nonSatkerItems = now.filter(
(item) => item !== "satker" && item !== "all"
);
@@ -1521,15 +1315,11 @@ export default function FormImageUpdate() {
} else {
if (placement === "all") {
temp[index] = [];
-
- // Update fileCheckedLevels untuk sinkronisasi dengan modal ketika "all" di-unchecklist
setFileCheckedLevels((prevLevels) => {
const newArray = [...prevLevels];
const currentFileLevels = new Set(
newArray[index] || new Set()
);
-
- // Unchecklist semua item di modal
currentFileLevels.clear();
newArray[index] = currentFileLevels;
@@ -1559,8 +1349,8 @@ export default function FormImageUpdate() {
temp[index] = now;
if (placement === "wilayah") {
// Ketika wilayah di-uncheck, hapus wilayah, polda, dan satker
- const now = temp[index]?.filter((a) =>
- a !== "wilayah" && a !== "polda" && a !== "satker"
+ const now = temp[index]?.filter(
+ (a) => a !== "wilayah" && a !== "polda" && a !== "satker"
);
temp[index] = now;
} else if (placement === "polda") {
@@ -1571,11 +1361,11 @@ export default function FormImageUpdate() {
// Ketika satker di-uncheck, hapus satker dari filePlacements
const now = temp[index]?.filter((a) => a !== "satker");
temp[index] = now;
- } else {
- const now = temp[index]?.filter((a) => a !== placement);
- temp[index] = now;
+ } else {
+ const now = temp[index]?.filter((a) => a !== placement);
+ temp[index] = now;
}
-
+
// Hapus "all" jika tidak semua item ter-checklist
if (now.includes("all")) {
const nonSatkerItems = now.filter(
@@ -1833,6 +1623,105 @@ export default function FormImageUpdate() {
+
+
+
+ {roleId === "14" && (
+
+ )}
+
+
+ {/* Pilihan bahasa untuk posting */}
+ {roleId === "14" && (
+
+
+
+ )}
+
+ {/* Editor Bahasa Indonesia */}
+
(
+
+ )}
+ />
+
+ {/* Editor Bahasa Inggris */}
+ {translatedContent && (
+
+
+
+
+
+
+
setTranslatedContent(val)}
+ initialData={translatedContent}
+ />
+
+ )}
+
+ {errors.description?.message && (
+
+ {errors.description.message}
+
+ )}
+
+ {/*
@@ -1851,7 +1740,7 @@ export default function FormImageUpdate() {
{errors.description.message}
)}
-
+ */}
));
-
const handleAddTag = (e: React.KeyboardEvent) => {
if (e.key === "Enter" && e.currentTarget.value.trim()) {
e.preventDefault();
@@ -1552,7 +1591,107 @@ export default function FormTeksUpdate() {
+
+
+
+
+ {roleId === "14" && (
+
+ )}
+
+
+ {/* Pilihan bahasa untuk posting */}
+ {roleId === "14" && (
+
+
+
+ )}
+
+ {/* Editor Bahasa Indonesia */}
+
(
+
+ )}
+ />
+
+ {/* Editor Bahasa Inggris */}
+ {translatedContent && (
+
+
+
+
+
+
+
setTranslatedContent(val)}
+ initialData={translatedContent}
+ />
+
+ )}
+
+ {errors.description?.message && (
+
+ {errors.description.message}
+
+ )}
+
+ {/*
@@ -1568,7 +1707,7 @@ export default function FormTeksUpdate() {
{errors.description.message}
)}
-
+ */}
-
+
+
))}
{/* Detail Wilayah */}
- {fileUnitSelections[files.indexOf(file)]?.wilayah && isDetailOfRegionShowed && (
-
-
- Detail Wilayah:
-
+ {fileUnitSelections[files.indexOf(file)]
+ ?.wilayah &&
+ isDetailOfRegionShowed && (
+
+
+ Detail Wilayah:
+
- {/* Checkbox Sub-kategori dengan tombol Kustom sejajar */}
-
- {[
- { key: "polda", label: "POLDA" },
- { key: "satker", label: "SATKER" },
- ].map((item, idx) => (
-
-
{
- handleFileUnitChange(
- files.indexOf(file),
- item.key as keyof typeof unitSelection,
- value as boolean
- );
- setupPlacement(
- files.indexOf(file),
- item.key as keyof typeof unitSelection,
- Boolean(value)
- );
- }}
- />
-
-
- )}
+ )}
diff --git a/components/form/content/video-form.tsx b/components/form/content/video-form.tsx
index b0a30bb6..5789eae1 100644
--- a/components/form/content/video-form.tsx
+++ b/components/form/content/video-form.tsx
@@ -549,6 +549,15 @@ export default function FormVideo() {
return;
}
+ // 👉 tempelkan hasil translate ke form agar ikut terkirim
+ if (translatedContent) {
+ data.descriptionOri = translatedContent;
+ console.log(
+ "🌍 Translate dimasukkan ke descriptionOri:",
+ translatedContent
+ );
+ }
+
let requestData: {
title: string;
description: string;
diff --git a/components/form/content/video-update-form.tsx b/components/form/content/video-update-form.tsx
index c66e4ed7..9666e1ce 100644
--- a/components/form/content/video-update-form.tsx
+++ b/components/form/content/video-update-form.tsx
@@ -25,7 +25,14 @@ import {
} from "@/components/ui/select";
import { Checkbox } from "@/components/ui/checkbox";
import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group";
-import { Dialog, DialogClose, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog";
+import {
+ Dialog,
+ DialogClose,
+ DialogContent,
+ DialogHeader,
+ DialogTitle,
+ DialogTrigger,
+} from "@/components/ui/dialog";
import { register } from "module";
import { Switch } from "@/components/ui/switch";
@@ -61,6 +68,9 @@ import { useTranslations } from "next-intl";
import dynamic from "next/dynamic";
import { htmlToString } from "@/utils/globals";
import { v4 as uuidv4 } from "uuid";
+import { getCookiesDecrypt } from "@/lib/utils";
+import { translateText } from "@/service/content/ai";
+import { close } from "@/config/swal";
const videoSchema = z.object({
title: z.string().min(1, { message: "Judul diperlukan" }),
@@ -102,7 +112,13 @@ type Option = {
name: string;
};
-type PlacementType = "all" | "mabes" | "wilayah" | "polda" | "satker" | "international";
+type PlacementType =
+ | "all"
+ | "mabes"
+ | "wilayah"
+ | "polda"
+ | "satker"
+ | "international";
interface FilePlacement {
id: string;
@@ -147,9 +163,7 @@ export default function FormVideoUpdate() {
type VideoSchema = z.infer;
let progressInfo: any = [];
let counterUpdateProgress = 0;
-
const isDetailOfRegionShowed = false;
-
const [progressList, setProgressList] = useState([]);
let uploadPersen = 0;
const [isStartUpload, setIsStartUpload] = useState(false);
@@ -199,12 +213,19 @@ export default function FormVideoUpdate() {
const [fileCheckedLevels, setFileCheckedLevels] = useState<{
[fileId: string]: Set;
}>({});
- const [isUpdatingFromMainCheckbox, setIsUpdatingFromMainCheckbox] = useState(false);
- const [mainCheckboxChangeType, setMainCheckboxChangeType] = useState(null);
+ const [isUpdatingFromMainCheckbox, setIsUpdatingFromMainCheckbox] =
+ useState(false);
+ const [mainCheckboxChangeType, setMainCheckboxChangeType] = useState<
+ string | null
+ >(null);
const [filePlacements, setFilePlacements] = useState<{
[fileId: string]: PlacementType[];
}>({});
const [tempFile, setTempFile] = useState(null);
+ const [isLoadingTranslate, setIsLoadingTranslate] = useState(false);
+ const [translatedContent, setTranslatedContent] = React.useState("");
+ const [selectedLang, setSelectedLang] = React.useState<"id" | "en">("id");
+ const roleId = getCookiesDecrypt("urie");
const options: Option[] = [
{ id: "all", name: "SEMUA" },
@@ -218,10 +239,14 @@ export default function FormVideoUpdate() {
const { getRootProps, getInputProps } = useDropzone({
onDrop: (acceptedFiles) => {
- setFiles(acceptedFiles.map((file) => Object.assign(file, {
- id: uuidv4(),
- preview: URL.createObjectURL(file)
- })));
+ setFiles(
+ acceptedFiles.map((file) =>
+ Object.assign(file, {
+ id: uuidv4(),
+ preview: URL.createObjectURL(file),
+ })
+ )
+ );
},
accept: {
"video/*": [],
@@ -231,23 +256,13 @@ export default function FormVideoUpdate() {
const {
control,
handleSubmit,
+ getValues,
setValue,
formState: { errors },
} = useForm({
resolver: zodResolver(videoSchema),
});
- // const handleKeyDown = (e: any) => {
- // const newTag = e.target.value.trim(); // Ambil nilai input
- // if (e.key === "Enter" && newTag) {
- // e.preventDefault(); // Hentikan submit form
- // if (!tags.includes(newTag)) {
- // setTags((prevTags) => [...prevTags, newTag]); // Tambah tag baru
- // setValue("tags", ""); // Kosongkan input
- // }
- // }
- // };
-
const handleImageChange = (event: ChangeEvent) => {
if (event.target.files) {
const files = Array.from(event.target.files);
@@ -369,12 +384,14 @@ export default function FormVideoUpdate() {
if (details?.files) {
setFiles(details.files);
-
+
// Initialize filePlacements
const initialFilePlacements: { [key: string]: PlacementType[] } = {};
details.files.forEach((file: any) => {
if (file.placements) {
- const placements = file.placements.split(",").map((p: string) => p.trim() as PlacementType);
+ const placements = file.placements
+ .split(",")
+ .map((p: string) => p.trim() as PlacementType);
initialFilePlacements[file.id] = placements;
}
});
@@ -384,7 +401,9 @@ export default function FormVideoUpdate() {
const initialFileCheckedLevels: { [key: string]: Set } = {};
details.files.forEach((file: any) => {
if (file.customLocationPlacements) {
- const levelIds = file.customLocationPlacements.split(",").map((id: string) => parseInt(id.trim()));
+ const levelIds = file.customLocationPlacements
+ .split(",")
+ .map((id: string) => parseInt(id.trim()));
initialFileCheckedLevels[file.id] = new Set(levelIds);
}
});
@@ -394,11 +413,16 @@ export default function FormVideoUpdate() {
const initialFileUnitSelections: { [key: string]: any } = {};
details.files.forEach((file: any) => {
if (file.placements) {
- const placements = file.placements.split(",").map((p: string) => p.trim());
+ const placements = file.placements
+ .split(",")
+ .map((p: string) => p.trim());
initialFileUnitSelections[file.id] = {
semua: placements.includes("all"),
nasional: placements.includes("mabes"),
- wilayah: placements.includes("wilayah") || placements.includes("polda") || placements.includes("satker"),
+ wilayah:
+ placements.includes("wilayah") ||
+ placements.includes("polda") ||
+ placements.includes("satker"),
international: placements.includes("international"),
polda: placements.includes("polda"),
satker: placements.includes("satker"),
@@ -439,18 +463,32 @@ export default function FormVideoUpdate() {
const updateMainCheckboxFromModalLegacy = () => {
const checkedPoldaCount = listDest.filter(
- (item) => item.levelNumber === 2 && item.name !== "SATKER POLRI" && checkedLevels.has(item.id)
+ (item) =>
+ item.levelNumber === 2 &&
+ item.name !== "SATKER POLRI" &&
+ checkedLevels.has(item.id)
).length;
const hasSelectedPolda = checkedPoldaCount > 0;
- const allPoldaChecked = checkedPoldaCount === listDest.filter(item => item.levelNumber === 2 && item.name !== "SATKER POLRI").length;
+ const allPoldaChecked =
+ checkedPoldaCount ===
+ listDest.filter(
+ (item) => item.levelNumber === 2 && item.name !== "SATKER POLRI"
+ ).length;
const checkedSatkerCount = listDest.filter(
- (item) => item.levelNumber === 2 && item.name === "SATKER POLRI" && checkedLevels.has(item.id)
+ (item) =>
+ item.levelNumber === 2 &&
+ item.name === "SATKER POLRI" &&
+ checkedLevels.has(item.id)
).length;
const hasSelectedSatker = checkedSatkerCount > 0;
- const allSatkerChecked = checkedSatkerCount === listDest.filter(item => item.levelNumber === 2 && item.name === "SATKER POLRI").length;
+ const allSatkerChecked =
+ checkedSatkerCount ===
+ listDest.filter(
+ (item) => item.levelNumber === 2 && item.name === "SATKER POLRI"
+ ).length;
- setUnitSelection(prev => ({
+ setUnitSelection((prev) => ({
...prev,
polda: hasSelectedPolda,
satker: hasSelectedSatker,
@@ -461,83 +499,115 @@ export default function FormVideoUpdate() {
const syncModalWithMainCheckbox = () => {
if (mainCheckboxChangeType === "wilayah_checked") {
const poldaIds = listDest
- .filter(item => item.levelNumber === 2 && item.name !== "SATKER POLRI")
- .map(item => item.id);
+ .filter(
+ (item) => item.levelNumber === 2 && item.name !== "SATKER POLRI"
+ )
+ .map((item) => item.id);
const satkerIds = listDest
- .filter(item => item.levelNumber === 2 && item.name === "SATKER POLRI")
- .map(item => item.id);
+ .filter(
+ (item) => item.levelNumber === 2 && item.name === "SATKER POLRI"
+ )
+ .map((item) => item.id);
const allSatkerSubIds = listDest
- .filter(item => item.levelNumber === 2 && item.name === "SATKER POLRI")
- .flatMap(item => item.subDestination.map(sub => sub.id));
+ .filter(
+ (item) => item.levelNumber === 2 && item.name === "SATKER POLRI"
+ )
+ .flatMap((item) => item.subDestination.map((sub) => sub.id));
- setCheckedLevels(prev => {
+ setCheckedLevels((prev) => {
const newSet = new Set(prev);
- [...poldaIds, ...satkerIds, ...allSatkerSubIds].forEach(id => newSet.add(id));
+ [...poldaIds, ...satkerIds, ...allSatkerSubIds].forEach((id) =>
+ newSet.add(id)
+ );
return newSet;
});
} else if (mainCheckboxChangeType === "wilayah_unchecked") {
const poldaIds = listDest
- .filter(item => item.levelNumber === 2 && item.name !== "SATKER POLRI")
- .map(item => item.id);
+ .filter(
+ (item) => item.levelNumber === 2 && item.name !== "SATKER POLRI"
+ )
+ .map((item) => item.id);
const satkerIds = listDest
- .filter(item => item.levelNumber === 2 && item.name === "SATKER POLRI")
- .map(item => item.id);
+ .filter(
+ (item) => item.levelNumber === 2 && item.name === "SATKER POLRI"
+ )
+ .map((item) => item.id);
const allSatkerSubIds = listDest
- .filter(item => item.levelNumber === 2 && item.name === "SATKER POLRI")
- .flatMap(item => item.subDestination.map(sub => sub.id));
+ .filter(
+ (item) => item.levelNumber === 2 && item.name === "SATKER POLRI"
+ )
+ .flatMap((item) => item.subDestination.map((sub) => sub.id));
- setCheckedLevels(prev => {
+ setCheckedLevels((prev) => {
const newSet = new Set(prev);
- [...poldaIds, ...satkerIds, ...allSatkerSubIds].forEach(id => newSet.delete(id));
+ [...poldaIds, ...satkerIds, ...allSatkerSubIds].forEach((id) =>
+ newSet.delete(id)
+ );
return newSet;
});
} else if (mainCheckboxChangeType === "polda_checked") {
const poldaIds = listDest
- .filter(item => item.levelNumber === 2 && item.name !== "SATKER POLRI")
- .map(item => item.id);
- setCheckedLevels(prev => {
+ .filter(
+ (item) => item.levelNumber === 2 && item.name !== "SATKER POLRI"
+ )
+ .map((item) => item.id);
+ setCheckedLevels((prev) => {
const newSet = new Set(prev);
- poldaIds.forEach(id => newSet.add(id));
+ poldaIds.forEach((id) => newSet.add(id));
return newSet;
});
} else if (mainCheckboxChangeType === "polda_unchecked") {
const poldaIds = listDest
- .filter(item => item.levelNumber === 2 && item.name !== "SATKER POLRI")
- .map(item => item.id);
- setCheckedLevels(prev => {
+ .filter(
+ (item) => item.levelNumber === 2 && item.name !== "SATKER POLRI"
+ )
+ .map((item) => item.id);
+ setCheckedLevels((prev) => {
const newSet = new Set(prev);
- poldaIds.forEach(id => newSet.delete(id));
+ poldaIds.forEach((id) => newSet.delete(id));
return newSet;
});
} else if (mainCheckboxChangeType === "satker_checked") {
const satkerIds = listDest
- .filter(item => item.levelNumber === 2 && item.name === "SATKER POLRI")
- .map(item => item.id);
+ .filter(
+ (item) => item.levelNumber === 2 && item.name === "SATKER POLRI"
+ )
+ .map((item) => item.id);
const allSatkerSubIds = listDest
- .filter(item => item.levelNumber === 2 && item.name === "SATKER POLRI")
- .flatMap(item => item.subDestination.map(sub => sub.id));
- setCheckedLevels(prev => {
+ .filter(
+ (item) => item.levelNumber === 2 && item.name === "SATKER POLRI"
+ )
+ .flatMap((item) => item.subDestination.map((sub) => sub.id));
+ setCheckedLevels((prev) => {
const newSet = new Set(prev);
- [...satkerIds, ...allSatkerSubIds].forEach(id => newSet.add(id));
+ [...satkerIds, ...allSatkerSubIds].forEach((id) => newSet.add(id));
return newSet;
});
} else if (mainCheckboxChangeType === "satker_unchecked") {
const satkerIds = listDest
- .filter(item => item.levelNumber === 2 && item.name === "SATKER POLRI")
- .map(item => item.id);
+ .filter(
+ (item) => item.levelNumber === 2 && item.name === "SATKER POLRI"
+ )
+ .map((item) => item.id);
const allSatkerSubIds = listDest
- .filter(item => item.levelNumber === 2 && item.name === "SATKER POLRI")
- .flatMap(item => item.subDestination.map(sub => sub.id));
- setCheckedLevels(prev => {
+ .filter(
+ (item) => item.levelNumber === 2 && item.name === "SATKER POLRI"
+ )
+ .flatMap((item) => item.subDestination.map((sub) => sub.id));
+ setCheckedLevels((prev) => {
const newSet = new Set(prev);
- [...satkerIds, ...allSatkerSubIds].forEach(id => newSet.delete(id));
+ [...satkerIds, ...allSatkerSubIds].forEach((id) => newSet.delete(id));
return newSet;
});
}
};
- const handleFileUnitChange = (fileId: string, key: string, value: boolean) => {
- setFileUnitSelections(prev => {
+ const handleFileUnitChange = (
+ fileId: string,
+ key: string,
+ value: boolean
+ ) => {
+ setFileUnitSelections((prev) => {
const currentSelection = prev[fileId] || {
semua: false,
nasional: false,
@@ -552,37 +622,37 @@ export default function FormVideoUpdate() {
if (key === "wilayah" && value) {
newSelection.polda = true;
newSelection.satker = true;
-
+
// Update fileCheckedLevels for wilayah
- setFileCheckedLevels(prevLevels => {
+ setFileCheckedLevels((prevLevels) => {
const currentFileLevels = prevLevels[fileId] || new Set();
const newFileLevels = new Set(currentFileLevels);
-
+
// Add all POLDA items
- listDest.forEach(item => {
+ listDest.forEach((item) => {
if (item.levelNumber === 2 && item.name !== "SATKER POLRI") {
newFileLevels.add(item.id);
}
});
-
+
// Add SATKER POLRI items and their sub-destinations
- listDest.forEach(item => {
+ listDest.forEach((item) => {
if (item.levelNumber === 2 && item.name === "SATKER POLRI") {
newFileLevels.add(item.id);
- item.subDestination.forEach(satkerItem => {
+ item.subDestination.forEach((satkerItem) => {
newFileLevels.add(satkerItem.id);
});
}
});
-
+
return { ...prevLevels, [fileId]: newFileLevels };
});
} else if (key === "wilayah" && !value) {
newSelection.polda = false;
newSelection.satker = false;
-
+
// Clear fileCheckedLevels for wilayah
- setFileCheckedLevels(prevLevels => {
+ setFileCheckedLevels((prevLevels) => {
const newFileLevels = new Set();
return { ...prevLevels, [fileId]: newFileLevels };
});
@@ -598,41 +668,51 @@ export default function FormVideoUpdate() {
});
// Update filePlacements
- setFilePlacements(prev => {
+ setFilePlacements((prev) => {
const currentPlacements = prev[fileId] || [];
let newPlacements = [...currentPlacements];
if (key === "semua" && value) {
- newPlacements = ["all", "mabes", "wilayah", "polda", "satker", "international"];
+ newPlacements = [
+ "all",
+ "mabes",
+ "wilayah",
+ "polda",
+ "satker",
+ "international",
+ ];
} else if (key === "semua" && !value) {
newPlacements = [];
} else if (key === "nasional" && value) {
if (!newPlacements.includes("mabes")) newPlacements.push("mabes");
} else if (key === "nasional" && !value) {
- newPlacements = newPlacements.filter(p => p !== "mabes");
+ newPlacements = newPlacements.filter((p) => p !== "mabes");
} else if (key === "wilayah" && value) {
if (!newPlacements.includes("wilayah")) newPlacements.push("wilayah");
if (!newPlacements.includes("polda")) newPlacements.push("polda");
if (!newPlacements.includes("satker")) newPlacements.push("satker");
} else if (key === "wilayah" && !value) {
- newPlacements = newPlacements.filter(p => !["wilayah", "polda", "satker"].includes(p));
+ newPlacements = newPlacements.filter(
+ (p) => !["wilayah", "polda", "satker"].includes(p)
+ );
} else if (key === "international" && value) {
- if (!newPlacements.includes("international")) newPlacements.push("international");
+ if (!newPlacements.includes("international"))
+ newPlacements.push("international");
} else if (key === "international" && !value) {
- newPlacements = newPlacements.filter(p => p !== "international");
+ newPlacements = newPlacements.filter((p) => p !== "international");
} else if (key === "polda" && value) {
if (!newPlacements.includes("polda")) newPlacements.push("polda");
} else if (key === "polda" && !value) {
- newPlacements = newPlacements.filter(p => p !== "polda");
+ newPlacements = newPlacements.filter((p) => p !== "polda");
} else if (key === "satker" && value) {
if (!newPlacements.includes("satker")) newPlacements.push("satker");
} else if (key === "satker" && !value) {
- newPlacements = newPlacements.filter(p => p !== "satker");
+ newPlacements = newPlacements.filter((p) => p !== "satker");
}
// Remove "all" if any individual option is unchecked
if (newPlacements.includes("all") && !value && key !== "semua") {
- newPlacements = newPlacements.filter(p => p !== "all");
+ newPlacements = newPlacements.filter((p) => p !== "all");
}
return { ...prev, [fileId]: newPlacements };
@@ -656,8 +736,12 @@ export default function FormVideoUpdate() {
}
};
- const handleFileCheckboxChangePlacement = (fileId: string, poldaItem: Destination, isChecked: boolean) => {
- setFileCheckedLevels(prev => {
+ const handleFileCheckboxChangePlacement = (
+ fileId: string,
+ poldaItem: Destination,
+ isChecked: boolean
+ ) => {
+ setFileCheckedLevels((prev) => {
const currentFileLevels = prev[fileId] || new Set();
const newFileLevels = new Set(currentFileLevels);
@@ -684,54 +768,58 @@ export default function FormVideoUpdate() {
// Update fileUnitSelections based on checked levels
const updatedFileLevels = fileCheckedLevels[fileId] || new Set();
- const hasPolda = listDest.some(item =>
- item.levelNumber === 2 &&
- item.name !== "SATKER POLRI" &&
- updatedFileLevels.has(item.id)
+ const hasPolda = listDest.some(
+ (item) =>
+ item.levelNumber === 2 &&
+ item.name !== "SATKER POLRI" &&
+ updatedFileLevels.has(item.id)
);
- const hasSatker = listDest.some(item =>
- item.levelNumber === 2 &&
- item.name === "SATKER POLRI" &&
- updatedFileLevels.has(item.id)
+ const hasSatker = listDest.some(
+ (item) =>
+ item.levelNumber === 2 &&
+ item.name === "SATKER POLRI" &&
+ updatedFileLevels.has(item.id)
);
- setFileUnitSelections(prev => ({
+ setFileUnitSelections((prev) => ({
...prev,
[fileId]: {
...prev[fileId],
polda: hasPolda,
satker: hasSatker,
wilayah: hasPolda || hasSatker,
- }
+ },
}));
};
const updateMainCheckboxFromModal = (fileId: string) => {
const fileLevels = fileCheckedLevels[fileId] || new Set();
- const hasPolda = listDest.some(item =>
- item.levelNumber === 2 &&
- item.name !== "SATKER POLRI" &&
- fileLevels.has(item.id)
+ const hasPolda = listDest.some(
+ (item) =>
+ item.levelNumber === 2 &&
+ item.name !== "SATKER POLRI" &&
+ fileLevels.has(item.id)
);
- const hasSatker = listDest.some(item =>
- item.levelNumber === 2 &&
- item.name === "SATKER POLRI" &&
- fileLevels.has(item.id)
+ const hasSatker = listDest.some(
+ (item) =>
+ item.levelNumber === 2 &&
+ item.name === "SATKER POLRI" &&
+ fileLevels.has(item.id)
);
- setFileUnitSelections(prev => ({
+ setFileUnitSelections((prev) => ({
...prev,
[fileId]: {
...prev[fileId],
polda: hasPolda,
satker: hasSatker,
wilayah: hasPolda || hasSatker,
- }
+ },
}));
};
const toggleExpand = (poldaId: number) => {
- setExpandedPolda(prev => {
+ setExpandedPolda((prev) => {
const newSet = new Set(prev);
if (newSet.has(poldaId)) {
newSet.delete(poldaId);
@@ -744,22 +832,22 @@ export default function FormVideoUpdate() {
const handleSelectAllSubItems = (fileId: string, poldaItem: Destination) => {
const fileLevels = fileCheckedLevels[fileId] || new Set();
- const allSubItemsSelected = poldaItem.subDestination.every(subItem =>
+ const allSubItemsSelected = poldaItem.subDestination.every((subItem) =>
fileLevels.has(subItem.id)
);
- setFileCheckedLevels(prev => {
+ setFileCheckedLevels((prev) => {
const currentFileLevels = prev[fileId] || new Set();
const newFileLevels = new Set(currentFileLevels);
if (allSubItemsSelected) {
// Unselect all sub-items
- poldaItem.subDestination.forEach(subItem => {
+ poldaItem.subDestination.forEach((subItem) => {
newFileLevels.delete(subItem.id);
});
} else {
// Select all sub-items
- poldaItem.subDestination.forEach(subItem => {
+ poldaItem.subDestination.forEach((subItem) => {
newFileLevels.add(subItem.id);
});
}
@@ -772,7 +860,11 @@ export default function FormVideoUpdate() {
const temp = [];
for (let i = 0; i < files.length; i++) {
const file = files[i] as any;
- if (file.id && filePlacements[file.id] && filePlacements[file.id].length > 0) {
+ if (
+ file.id &&
+ filePlacements[file.id] &&
+ filePlacements[file.id].length > 0
+ ) {
const now = filePlacements[file.id];
const normalizedNow = now.map((item): PlacementType => {
const value = String(item);
@@ -800,14 +892,25 @@ export default function FormVideoUpdate() {
return temp;
};
- const setupPlacement = (fileId: string, placement: string, isChecked: boolean) => {
- setFilePlacements(prev => {
+ const setupPlacement = (
+ fileId: string,
+ placement: string,
+ isChecked: boolean
+ ) => {
+ setFilePlacements((prev) => {
const currentPlacements = prev[fileId] || [];
let temp = { ...prev };
-
+
if (isChecked) {
if (placement === "all") {
- temp[fileId] = ["all", "mabes", "wilayah", "polda", "satker", "international"];
+ temp[fileId] = [
+ "all",
+ "mabes",
+ "wilayah",
+ "polda",
+ "satker",
+ "international",
+ ];
} else if (placement === "wilayah") {
temp[fileId] = [...currentPlacements, "wilayah", "polda", "satker"];
} else if (placement === "polda") {
@@ -821,13 +924,15 @@ export default function FormVideoUpdate() {
if (placement === "all") {
temp[fileId] = [];
} else if (placement === "wilayah") {
- temp[fileId] = currentPlacements.filter(p => !["wilayah", "polda", "satker"].includes(p));
+ temp[fileId] = currentPlacements.filter(
+ (p) => !["wilayah", "polda", "satker"].includes(p)
+ );
} else if (placement === "polda") {
- temp[fileId] = currentPlacements.filter(p => p !== "polda");
+ temp[fileId] = currentPlacements.filter((p) => p !== "polda");
} else if (placement === "satker") {
- temp[fileId] = currentPlacements.filter(p => p !== "satker");
+ temp[fileId] = currentPlacements.filter((p) => p !== "satker");
} else {
- temp[fileId] = currentPlacements.filter(p => p !== placement);
+ temp[fileId] = currentPlacements.filter((p) => p !== placement);
}
}
@@ -837,25 +942,27 @@ export default function FormVideoUpdate() {
const updateModalChecklistLevels = (fileId: string) => {
const fileLevels = fileCheckedLevels[fileId] || new Set();
- const hasPolda = listDest.some(item =>
- item.levelNumber === 2 &&
- item.name !== "SATKER POLRI" &&
- fileLevels.has(item.id)
+ const hasPolda = listDest.some(
+ (item) =>
+ item.levelNumber === 2 &&
+ item.name !== "SATKER POLRI" &&
+ fileLevels.has(item.id)
);
- const hasSatker = listDest.some(item =>
- item.levelNumber === 2 &&
- item.name === "SATKER POLRI" &&
- fileLevels.has(item.id)
+ const hasSatker = listDest.some(
+ (item) =>
+ item.levelNumber === 2 &&
+ item.name === "SATKER POLRI" &&
+ fileLevels.has(item.id)
);
- setFileUnitSelections(prev => ({
+ setFileUnitSelections((prev) => ({
...prev,
[fileId]: {
...prev[fileId],
polda: hasPolda,
satker: hasSatker,
wilayah: hasPolda || hasSatker,
- }
+ },
}));
};
@@ -916,16 +1023,23 @@ export default function FormVideoUpdate() {
// // router.push("/en/contributor/content/video");
// // });
// };
+
const save = async (data: VideoSchema) => {
loading();
const finalTags = tags.join(", ");
+
+ const descFinal =
+ selectedLang === "en" && translatedContent
+ ? translatedContent
+ : data.description;
+
const requestData = {
...data,
id: detail?.id,
title: data.title,
- description: htmlToString(data.description),
- htmlDescription: data.description,
+ description: htmlToString(descFinal),
+ htmlDescription: descFinal,
fileTypeId,
categoryId: selectedTarget,
subCategoryId: selectedTarget,
@@ -959,7 +1073,6 @@ export default function FormVideoUpdate() {
formMedia.append("file", thumbnail);
const responseThumbnail = await uploadThumbnail(id, formMedia);
if (responseThumbnail?.error) {
- // Perbaiki pengecekan error
error(responseThumbnail?.message);
return false;
}
@@ -1150,7 +1263,6 @@ export default function FormVideoUpdate() {
));
-
function success() {
MySwal.fire({
title: "Sukses",
@@ -1273,6 +1385,105 @@ export default function FormVideoUpdate() {
+
+
+
+ {roleId === "14" && (
+ {
+ try {
+ loading();
+ setIsLoadingTranslate(true);
+ const res = await translateText({
+ text: getValues("description"),
+ sourceLang: "ID",
+ targetLang: "EN",
+ });
+
+ if (!res.error) {
+ const resultText =
+ res?.data?.data?.translations?.[0]?.text || "";
+
+ setTranslatedContent(resultText);
+ }
+ } catch (err) {
+ close();
+ console.error("Translate gagal:", err);
+ } finally {
+ close();
+ setIsLoadingTranslate(false);
+ }
+ }}
+ className="px-3 py-2 bg-blue-500 text-white rounded-md hover:bg-blue-600"
+ >
+ {isLoadingTranslate
+ ? "Translating..."
+ : "Translate to English"}
+
+ )}
+
+
+ {/* Pilihan bahasa untuk posting */}
+ {roleId === "14" && (
+
+
+
+ )}
+
+ {/* Editor Bahasa Indonesia */}
+
(
+
+ )}
+ />
+
+ {/* Editor Bahasa Inggris */}
+ {translatedContent && (
+
+
+
+
+
+
+
setTranslatedContent(val)}
+ initialData={translatedContent}
+ />
+
+ )}
+
+ {errors.description?.message && (
+
+ {errors.description.message}
+
+ )}
+
+ {/*
@@ -1288,7 +1499,7 @@ export default function FormVideoUpdate() {
{errors.description.message}
)}
-
+ */}
{/* Detail Wilayah */}
- {fileUnitSelections[file.id]?.wilayah && isDetailOfRegionShowed && (
-
-
- Detail Wilayah:
-
+ {fileUnitSelections[file.id]?.wilayah &&
+ isDetailOfRegionShowed && (
+
+
+ Detail Wilayah:
+
- {/* Checkbox Sub-kategori dengan tombol Kustom sejajar */}
-
- {[
- { key: "polda", label: "POLDA" },
- { key: "satker", label: "SATKER" },
- ].map((item, idx) => (
-
-
{
- handleFileUnitChange(
- file.id,
- item.key,
- value as boolean
- );
- setupPlacement(
- file.id,
- item.key,
- Boolean(value)
- );
- }}
- />
-
-
- )}
+ )}
diff --git a/components/landing-page/filter-all/audio-filter-card.tsx b/components/landing-page/filter-all/audio-filter-card.tsx
index 5a641788..c143f6d1 100644
--- a/components/landing-page/filter-all/audio-filter-card.tsx
+++ b/components/landing-page/filter-all/audio-filter-card.tsx
@@ -243,7 +243,10 @@ export default function FilterAudioComponent(props: {
{newContent?.map((audio: any) => (
// router.push(prefixPath + `/audio/detail/${audio?.slug}`)
diff --git a/components/landing-page/filter-all/document-filter-card.tsx b/components/landing-page/filter-all/document-filter-card.tsx
index aa8bc82d..f56c0a66 100644
--- a/components/landing-page/filter-all/document-filter-card.tsx
+++ b/components/landing-page/filter-all/document-filter-card.tsx
@@ -214,7 +214,10 @@ export default function FilterDocumentComponent(props: {
{newContent?.map((text: any) => (
// router.push(prefixPath + `/document/detail/${text?.slug}`)
diff --git a/components/landing-page/filter-all/image-filter-card.tsx b/components/landing-page/filter-all/image-filter-card.tsx
index d68c47f4..3e950a90 100644
--- a/components/landing-page/filter-all/image-filter-card.tsx
+++ b/components/landing-page/filter-all/image-filter-card.tsx
@@ -200,7 +200,10 @@ export default function FilterImageComponent(props: {
{newContent?.map((image: any) => (
// router.push(prefixPath + `/image/detail/${image?.slug}`)
// }
diff --git a/components/landing-page/filter-all/video-filter-card.tsx b/components/landing-page/filter-all/video-filter-card.tsx
index d689f66e..26acff0f 100644
--- a/components/landing-page/filter-all/video-filter-card.tsx
+++ b/components/landing-page/filter-all/video-filter-card.tsx
@@ -161,7 +161,10 @@ export default function FilterVideoComponent(props: {
{newContent?.map((video: any) => (
// router.push(prefixPath + `/video/detail/${video?.slug}`)