Merge branch 'prod' of https://gitlab.com/hanifsalafi/mediahub_redesign into prod
This commit is contained in:
commit
5fa74cc716
|
|
@ -19,7 +19,7 @@ build-prod:
|
|||
- echo "Username:$DEPLOY_USERNAME"
|
||||
- echo "Token:$DEPLOY_TOKEN"
|
||||
- echo "$DEPLOY_TOKEN" | docker login 103.82.242.92:8900 --username "$DEPLOY_USERNAME" --password-stdin
|
||||
- docker build -t 103.82.242.92:8900/mediahub/new-mediahub-fe:prod .
|
||||
- docker build --no-cache -t 103.82.242.92:8900/mediahub/new-mediahub-fe:prod .
|
||||
- docker push 103.82.242.92:8900/mediahub/new-mediahub-fe:prod
|
||||
|
||||
auto-deploy:
|
||||
|
|
|
|||
|
|
@ -25,7 +25,8 @@ RUN pnpm install
|
|||
COPY . .
|
||||
|
||||
# Build aplikasi
|
||||
RUN NODE_OPTIONS="--max-old-space-size=4096" pnpm run build
|
||||
# RUN NODE_OPTIONS="--max-old-space-size=4096"
|
||||
RUN pnpm run build
|
||||
|
||||
# Expose port untuk server
|
||||
EXPOSE 3000
|
||||
|
|
|
|||
|
|
@ -171,11 +171,11 @@ export default function CreateAccountForBroadcast() {
|
|||
{/* WA */}
|
||||
<div className="flex items-center gap-2">
|
||||
<Checkbox
|
||||
checked={field.value.includes("wa")}
|
||||
checked={field.value?.includes("wa") ?? false}
|
||||
onCheckedChange={(checked) =>
|
||||
checked
|
||||
? field.onChange([...field.value, "wa"])
|
||||
: field.onChange(field.value.filter((v) => v !== "wa"))
|
||||
? field.onChange([...(field.value ?? []), "wa"])
|
||||
: field.onChange((field.value ?? []).filter((v) => v !== "wa"))
|
||||
}
|
||||
/>
|
||||
<label>Whatsapp</label>
|
||||
|
|
@ -184,12 +184,12 @@ export default function CreateAccountForBroadcast() {
|
|||
{/* EMAIL */}
|
||||
<div className="flex items-center gap-2">
|
||||
<Checkbox
|
||||
checked={field.value.includes("email")}
|
||||
checked={field.value?.includes("email") ?? false}
|
||||
onCheckedChange={(checked) =>
|
||||
checked
|
||||
? field.onChange([...field.value, "email"])
|
||||
? field.onChange([...(field.value ?? []), "email"])
|
||||
: field.onChange(
|
||||
field.value.filter((v) => v !== "email")
|
||||
(field.value ?? []).filter((v) => v !== "email")
|
||||
)
|
||||
}
|
||||
/>
|
||||
|
|
@ -202,7 +202,7 @@ export default function CreateAccountForBroadcast() {
|
|||
/>
|
||||
|
||||
{/* FORM WHATSAPP */}
|
||||
{selectedTypes.includes("wa") && (
|
||||
{selectedTypes?.includes("wa") && (
|
||||
<FormField
|
||||
control={form.control}
|
||||
name="whatsapp"
|
||||
|
|
@ -221,7 +221,7 @@ export default function CreateAccountForBroadcast() {
|
|||
)}
|
||||
|
||||
{/* FORM EMAIL */}
|
||||
{selectedTypes.includes("email") && (
|
||||
{selectedTypes?.includes("email") && (
|
||||
<FormField
|
||||
control={form.control}
|
||||
name="email"
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ export default function PerformancePolda() {
|
|||
return (
|
||||
<div>
|
||||
<SiteBreadcrumb />
|
||||
<p className="font-semibold">PERFORMANCE KUMULATIF PER POLRES</p>
|
||||
{/* <p className="font-semibold">PERFORMANCE KUMULATIF PER POLRES</p> */}
|
||||
<PerformancePolresViz />
|
||||
</div>
|
||||
);
|
||||
|
|
|
|||
|
|
@ -6,7 +6,6 @@ export default function PerformanceSatker() {
|
|||
return (
|
||||
<div>
|
||||
<SiteBreadcrumb />
|
||||
<p className="font-semibold">PERFORMANCE KUMULATIF PER SATKER</p>
|
||||
<PerformanceSatkerViz />
|
||||
</div>
|
||||
);
|
||||
|
|
|
|||
|
|
@ -300,11 +300,11 @@ export default function CreateCategoryModal() {
|
|||
onCheckedChange={(checked) => {
|
||||
return checked
|
||||
? field.onChange([
|
||||
...field.value,
|
||||
...(field.value ?? []),
|
||||
item.id,
|
||||
])
|
||||
: field.onChange(
|
||||
field.value?.filter(
|
||||
(field.value ?? []).filter(
|
||||
(value) => value !== item.id
|
||||
)
|
||||
);
|
||||
|
|
@ -371,11 +371,11 @@ export default function CreateCategoryModal() {
|
|||
onCheckedChange={(checked) => {
|
||||
return checked
|
||||
? field.onChange([
|
||||
...field.value,
|
||||
...(field.value ?? []),
|
||||
item.id,
|
||||
])
|
||||
: field.onChange(
|
||||
field.value?.filter(
|
||||
(field.value ?? []).filter(
|
||||
(value) => value !== item.id
|
||||
)
|
||||
);
|
||||
|
|
@ -443,11 +443,11 @@ export default function CreateCategoryModal() {
|
|||
onCheckedChange={(checked) => {
|
||||
return checked
|
||||
? field.onChange([
|
||||
...field.value,
|
||||
...(field.value ?? []),
|
||||
item.id,
|
||||
])
|
||||
: field.onChange(
|
||||
field.value?.filter(
|
||||
(field.value ?? []).filter(
|
||||
(value) => value !== item.id
|
||||
)
|
||||
);
|
||||
|
|
|
|||
|
|
@ -326,11 +326,11 @@ export default function EditCategoryModal(props: {
|
|||
onCheckedChange={(checked) => {
|
||||
return checked
|
||||
? field.onChange([
|
||||
...field.value,
|
||||
...(field.value ?? []),
|
||||
item.id,
|
||||
])
|
||||
: field.onChange(
|
||||
field.value?.filter(
|
||||
(field.value ?? []).filter(
|
||||
(value) => value !== item.id
|
||||
)
|
||||
);
|
||||
|
|
@ -398,11 +398,11 @@ export default function EditCategoryModal(props: {
|
|||
onCheckedChange={(checked) => {
|
||||
return checked
|
||||
? field.onChange([
|
||||
...field.value,
|
||||
...(field.value ?? []),
|
||||
item.id,
|
||||
])
|
||||
: field.onChange(
|
||||
field.value?.filter(
|
||||
(field.value ?? []).filter(
|
||||
(value) => value !== item.id
|
||||
)
|
||||
);
|
||||
|
|
@ -473,11 +473,11 @@ export default function EditCategoryModal(props: {
|
|||
onCheckedChange={(checked) => {
|
||||
return checked
|
||||
? field.onChange([
|
||||
...field.value,
|
||||
...(field.value ?? []),
|
||||
item.id,
|
||||
])
|
||||
: field.onChange(
|
||||
field.value?.filter(
|
||||
(field.value ?? []).filter(
|
||||
(value) => value !== item.id
|
||||
)
|
||||
);
|
||||
|
|
|
|||
|
|
@ -150,11 +150,11 @@ export function UnitMapping(props: {
|
|||
onCheckedChange={(checked) => {
|
||||
return checked
|
||||
? field.onChange([
|
||||
...field.value,
|
||||
...(field.value ?? []),
|
||||
String(item.id),
|
||||
])
|
||||
: field.onChange(
|
||||
field.value?.filter(
|
||||
(field.value ?? []).filter(
|
||||
(value) => value !== String(item.id)
|
||||
)
|
||||
);
|
||||
|
|
@ -223,11 +223,11 @@ export function UnitMapping(props: {
|
|||
onCheckedChange={(checked) => {
|
||||
return checked
|
||||
? field.onChange([
|
||||
...field.value,
|
||||
...(field.value ?? []),
|
||||
String(item.id),
|
||||
])
|
||||
: field.onChange(
|
||||
field.value?.filter(
|
||||
(field.value ?? []).filter(
|
||||
(value) => value !== String(item.id)
|
||||
)
|
||||
);
|
||||
|
|
|
|||
|
|
@ -98,11 +98,11 @@ export default function DetailSettingTracking(props: {
|
|||
{wilayahList.map((item) => (
|
||||
<div key={item.id} className="flex items-center gap-2">
|
||||
<Checkbox
|
||||
checked={field.value.includes(item.id)}
|
||||
checked={field.value?.includes(item.id) ?? false}
|
||||
onCheckedChange={(checked) => {
|
||||
const updated = checked
|
||||
? [...field.value, item.id]
|
||||
: field.value.filter((val) => val !== item.id);
|
||||
? [...(field.value ?? []), item.id]
|
||||
: (field.value ?? []).filter((val) => val !== item.id);
|
||||
field.onChange(updated);
|
||||
}}
|
||||
/>
|
||||
|
|
@ -124,11 +124,11 @@ export default function DetailSettingTracking(props: {
|
|||
{jumlahList.map((num) => (
|
||||
<div key={num} className="flex items-center gap-2">
|
||||
<Checkbox
|
||||
checked={field.value.includes(num)}
|
||||
checked={field.value?.includes(num) ?? false}
|
||||
onCheckedChange={(checked) => {
|
||||
const updated = checked
|
||||
? [...field.value, num]
|
||||
: field.value.filter((val) => val !== num);
|
||||
? [...(field.value ?? []), num]
|
||||
: (field.value ?? []).filter((val) => val !== num);
|
||||
field.onChange(updated);
|
||||
}}
|
||||
/>
|
||||
|
|
|
|||
|
|
@ -98,11 +98,11 @@ export default function UpdateSettingTracking(props: {
|
|||
{wilayahList.map((item) => (
|
||||
<div key={item.id} className="flex items-center gap-2">
|
||||
<Checkbox
|
||||
checked={field.value.includes(item.id)}
|
||||
checked={field.value?.includes(item.id) ?? false}
|
||||
onCheckedChange={(checked) => {
|
||||
const updated = checked
|
||||
? [...field.value, item.id]
|
||||
: field.value.filter((val) => val !== item.id);
|
||||
? [...(field.value ?? []), item.id]
|
||||
: (field.value ?? []).filter((val) => val !== item.id);
|
||||
field.onChange(updated);
|
||||
}}
|
||||
/>
|
||||
|
|
@ -124,11 +124,11 @@ export default function UpdateSettingTracking(props: {
|
|||
{jumlahList.map((num) => (
|
||||
<div key={num} className="flex items-center gap-2">
|
||||
<Checkbox
|
||||
checked={field.value.includes(num)}
|
||||
checked={field.value?.includes(num) ?? false}
|
||||
onCheckedChange={(checked) => {
|
||||
const updated = checked
|
||||
? [...field.value, num]
|
||||
: field.value.filter((val) => val !== num);
|
||||
? [...(field.value ?? []), num]
|
||||
: (field.value ?? []).filter((val) => val !== num);
|
||||
field.onChange(updated);
|
||||
}}
|
||||
/>
|
||||
|
|
|
|||
|
|
@ -73,7 +73,22 @@ const useTableColumns = ({
|
|||
{
|
||||
accessorKey: "status",
|
||||
header: t("status", { defaultValue: "Status" }),
|
||||
cell: ({ row }) => <span className="">{row.getValue("status")}</span>,
|
||||
cell: ({ row }) => {
|
||||
const version = Number(row.original.version); // pastikan number
|
||||
|
||||
const isProcess = version === 0;
|
||||
const status = isProcess ? "Proses" : "Selesai";
|
||||
|
||||
return (
|
||||
<span
|
||||
className={`px-2 py-1 rounded-full text-white text-xs font-semibold ${
|
||||
isProcess ? "bg-yellow-500" : "bg-green-600"
|
||||
}`}
|
||||
>
|
||||
{status}
|
||||
</span>
|
||||
);
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
|
|
@ -131,7 +146,9 @@ const useTableColumns = ({
|
|||
|
||||
const response = await downloadReport(id);
|
||||
console.log(response?.data);
|
||||
const url = window.URL.createObjectURL(new Blob([response?.data], { type : "application/pdf"}));
|
||||
const url = window.URL.createObjectURL(
|
||||
new Blob([response?.data], { type: "application/pdf" })
|
||||
);
|
||||
const link = document.createElement("a");
|
||||
link.href = url;
|
||||
link.setAttribute("download", `report-${id}.pdf`);
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ export default function ExecutiveDataDashboard() {
|
|||
const baseUrl = "https://db-mediahub.polri.go.id/";
|
||||
const url = "https://db-mediahub.polri.go.id/trusted/";
|
||||
|
||||
const safeLevelName = levelNumber ?? "";
|
||||
const safeLevelName = levelName ?? "";
|
||||
|
||||
// const view1 =
|
||||
// levelName == "MABES POLRI"
|
||||
|
|
@ -53,7 +53,7 @@ export default function ExecutiveDataDashboard() {
|
|||
: levelNumber === "2"
|
||||
? `views/2025_10_MediaHUB-Viz-POLDA_Rev200/db-by-polda-publish-konten?provinsi-polda=${provState}&`
|
||||
: levelNumber === "3"
|
||||
? `views/2025_10_MediaHUB-Viz-POLDA_Rev200/db-satker?provinsi-polda=${provState}&`
|
||||
? `views/2025_10_MediaHUB-Viz-POLDA_Rev200/db-satker?satker-selected=${state}&`
|
||||
: "";
|
||||
|
||||
const view2 =
|
||||
|
|
@ -83,7 +83,7 @@ export default function ExecutiveDataDashboard() {
|
|||
: levelNumber === "2"
|
||||
? `views/2025_10_MediaHUB-Viz-POLDA_Rev200/db-by-polda-cat?provinsi-polda=${provState}&`
|
||||
: levelNumber === "3"
|
||||
? `views/2025_10_MediaHUB-Viz-POLDA_Rev200/db-satker-kategori?provinsi-polda=${provState}&`
|
||||
? `views/2025_10_MediaHUB-Viz-POLDA_Rev200/db-satker-kategori?satker-selected=${state}&`
|
||||
: "";
|
||||
|
||||
const view4 =
|
||||
|
|
@ -110,7 +110,7 @@ export default function ExecutiveDataDashboard() {
|
|||
: levelNumber === "2"
|
||||
? `views/2025_10_MediaHUB-Viz-POLDA_Rev200/db-published-produksi-executive?provinsi-polda=${provState}&`
|
||||
: levelNumber === "3"
|
||||
? `views/2025_10_MediaHUB-Viz-POLDA_Rev200/db-top-satker?provinsi-polda=${provState}&`
|
||||
? `views/2025_10_MediaHUB-Viz-POLDA_Rev200/db-top-satker?satker-selected=${state}&`
|
||||
: "";
|
||||
|
||||
// const view6 =
|
||||
|
|
@ -128,7 +128,7 @@ export default function ExecutiveDataDashboard() {
|
|||
: levelNumber === "2"
|
||||
? `views/2025_10_MediaHUB-Viz-POLDA_Rev200/db-heatmap-polda?provinsi-polda=${provState}&`
|
||||
: levelNumber === "3"
|
||||
? `views/2025_10_MediaHUB-Viz-POLDA_Rev200/db-hm-satker?provinsi-polda=${provState}&`
|
||||
? `views/2025_10_MediaHUB-Viz-POLDA_Rev200/db-hm-satker?satker-selected=${state}&`
|
||||
: "";
|
||||
|
||||
// const view7 =
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ export default function ExecutiveDashboard() {
|
|||
const baseUrl = "https://db-mediahub.polri.go.id/";
|
||||
const url = "https://db-mediahub.polri.go.id/trusted/";
|
||||
|
||||
const safeLevelName = levelNumber ?? "";
|
||||
const safeLevelName = levelName ?? "";
|
||||
|
||||
const view1 =
|
||||
levelName == "MABES POLRI"
|
||||
|
|
@ -62,7 +62,7 @@ export default function ExecutiveDashboard() {
|
|||
? // `views/2023_04_MediaHUB-Viz-POLDA_Rev200/db-published-produksi-polda-executive?polda-selected=${state}&`
|
||||
`views/2025_10_MediaHUB-Viz-POLDA_Rev200/db-published-produksi-executive?provinsi-polda=${provState}&`
|
||||
: // `views/2023_04_MediaHUB-Viz-POLDA_Rev200/db-published-produksi-polda-executive?polda-selected=${state}&`;
|
||||
`views/2025_10_MediaHUB-Viz-POLDA_Rev200/db-published-produksi-executive?provinsi-polda=${provState}&`;
|
||||
`views/2025_10_MediaHUB-Viz-POLDA_Rev200/db-top-satker?satker-selected=${state}&`;
|
||||
|
||||
const view3 =
|
||||
levelName == "MABES POLRI"
|
||||
|
|
@ -75,7 +75,7 @@ export default function ExecutiveDashboard() {
|
|||
? // `views/2023_04_MediaHUB-Viz-POLDA_Rev200/db-waktu-akses-pengguna-polda-executive?polda-selected=${state}&`
|
||||
`views/2025_10_MediaHUB-Viz-POLDA_Rev200/db-waktu-akses-pengguna-executive?provinsi-polda=${provState}`
|
||||
: // `views/2023_04_MediaHUB-Viz-POLDA_Rev200/db-waktu-akses-pengguna-polda-executive?polda-selected=${state}&`;
|
||||
`views/2025_10_MediaHUB-Viz-POLDA_Rev200/db-waktu-akses-pengguna-executive?provinsi-polda=${provState}`;
|
||||
`views/2025_10_MediaHUB-Viz-POLDA_Rev200/db-hm-satker?satker-selected=${state}`;
|
||||
|
||||
const view4 =
|
||||
levelName == "MABES POLRI"
|
||||
|
|
@ -86,9 +86,9 @@ export default function ExecutiveDashboard() {
|
|||
"views/2025_10_MediaHUB-Viz-POLDA_Rev200/db-konten-header?"
|
||||
: safeLevelName.includes("POLDA")
|
||||
? // `views/2023_04_MediaHUB-Viz-POLDA_Rev200/db-content-interaction-polda?polda-selected=${state}&`
|
||||
`/views/2025_10_MediaHUB-Viz-POLDA_Rev200/db-konten-header?provinsi-polda=${provState}&`
|
||||
`views/2025_10_MediaHUB-Viz-POLDA_Rev200/db-konten-header?provinsi-polda=${provState}&`
|
||||
: // `views/2023_04_MediaHUB-Viz-POLDA_Rev200/db-content-interaction-polda?polda-selected=${state}&`;
|
||||
`/views/2025_10_MediaHUB-Viz-POLDA_Rev200/db-konten-header?provinsi-polda=${provState}&`;
|
||||
`views/2025_10_MediaHUB-Viz-POLDA_Rev200/db-satker?satker-selected=${state}&`;
|
||||
|
||||
const view5 =
|
||||
levelName == "MABES POLRI"
|
||||
|
|
@ -160,10 +160,10 @@ export default function ExecutiveDashboard() {
|
|||
<Card className="rounded-sm p-5 w-full">
|
||||
<div className="flex flex-row flex-wrap gap-5 justify-between">
|
||||
{/* ===================== POLDA ===================== */}
|
||||
{(levelNumber === "1" || levelNumber === "2") && (
|
||||
{(levelNumber === "1" || levelNumber === "2" || levelNumber === "3") && (
|
||||
<div className="flex-1 min-w-[350px]">
|
||||
<p className="text-base font-semibold mb-3">
|
||||
Publish Konten Polda
|
||||
Publish Konten
|
||||
</p>
|
||||
|
||||
{ticket1 == "" ? (
|
||||
|
|
|
|||
|
|
@ -288,11 +288,11 @@ export default function ContentBlast() {
|
|||
<div className="flex gap-6">
|
||||
<label className="flex items-center gap-2">
|
||||
<Checkbox
|
||||
checked={field.value.includes("wa")}
|
||||
checked={field.value?.includes("wa") ?? false}
|
||||
onCheckedChange={(checked) => {
|
||||
checked
|
||||
? field.onChange([...field.value, "wa"])
|
||||
: field.onChange(field.value.filter((v) => v !== "wa"));
|
||||
? field.onChange([...(field.value ?? []), "wa"])
|
||||
: field.onChange((field.value ?? []).filter((v) => v !== "wa"));
|
||||
}}
|
||||
/>
|
||||
WhatsApp
|
||||
|
|
@ -300,12 +300,12 @@ export default function ContentBlast() {
|
|||
|
||||
<label className="flex items-center gap-2">
|
||||
<Checkbox
|
||||
checked={field.value.includes("email")}
|
||||
checked={field.value?.includes("email") ?? false}
|
||||
onCheckedChange={(checked) => {
|
||||
checked
|
||||
? field.onChange([...field.value, "email"])
|
||||
? field.onChange([...(field.value ?? []), "email"])
|
||||
: field.onChange(
|
||||
field.value.filter((v) => v !== "email")
|
||||
(field.value ?? []).filter((v) => v !== "email")
|
||||
);
|
||||
}}
|
||||
/>
|
||||
|
|
|
|||
|
|
@ -1748,13 +1748,13 @@ export default function FormAudio() {
|
|||
|
||||
{options.map((option) => {
|
||||
const isAllChecked =
|
||||
field.value.length ===
|
||||
(field.value?.length ?? 0) ===
|
||||
options.filter((opt: any) => opt.id !== "all").length;
|
||||
|
||||
const isChecked =
|
||||
option.id === "all"
|
||||
? isAllChecked
|
||||
: field.value.includes(option.id);
|
||||
: field.value?.includes(option.id) ?? false;
|
||||
|
||||
const handleChange = () => {
|
||||
let updated: string[] = [];
|
||||
|
|
@ -1767,8 +1767,8 @@ export default function FormAudio() {
|
|||
.map((opt: any) => opt.id);
|
||||
} else {
|
||||
updated = isChecked
|
||||
? field.value.filter((val) => val !== option.id)
|
||||
: [...field.value, option.id];
|
||||
? (field.value ?? []).filter((val) => val !== option.id)
|
||||
: [...(field.value ?? []), option.id];
|
||||
|
||||
if (isAllChecked && option.id !== "all") {
|
||||
updated = updated.filter((val) => val !== "all");
|
||||
|
|
|
|||
|
|
@ -1673,13 +1673,13 @@ export default function FormImage() {
|
|||
|
||||
{options.map((option) => {
|
||||
const isAllChecked =
|
||||
field.value.length ===
|
||||
(field.value?.length ?? 0) ===
|
||||
options.filter((opt: any) => opt.id !== "all").length;
|
||||
|
||||
const isChecked =
|
||||
option.id === "all"
|
||||
? isAllChecked
|
||||
: field.value.includes(option.id);
|
||||
: field.value?.includes(option.id) ?? false;
|
||||
|
||||
const handleChange = () => {
|
||||
let updated: string[] = [];
|
||||
|
|
@ -1692,8 +1692,8 @@ export default function FormImage() {
|
|||
.map((opt: any) => opt.id);
|
||||
} else {
|
||||
updated = isChecked
|
||||
? field.value.filter((val) => val !== option.id)
|
||||
: [...field.value, option.id];
|
||||
? (field.value ?? []).filter((val) => val !== option.id)
|
||||
: [...(field.value ?? []), option.id];
|
||||
|
||||
if (isAllChecked && option.id !== "all") {
|
||||
updated = updated.filter((val) => val !== "all");
|
||||
|
|
|
|||
|
|
@ -1715,13 +1715,13 @@ export default function FormTeks() {
|
|||
|
||||
{options.map((option) => {
|
||||
const isAllChecked =
|
||||
field.value.length ===
|
||||
(field.value?.length ?? 0) ===
|
||||
options.filter((opt: any) => opt.id !== "all").length;
|
||||
|
||||
const isChecked =
|
||||
option.id === "all"
|
||||
? isAllChecked
|
||||
: field.value.includes(option.id);
|
||||
: field.value?.includes(option.id) ?? false;
|
||||
|
||||
const handleChange = () => {
|
||||
let updated: string[] = [];
|
||||
|
|
@ -1734,8 +1734,8 @@ export default function FormTeks() {
|
|||
.map((opt: any) => opt.id);
|
||||
} else {
|
||||
updated = isChecked
|
||||
? field.value.filter((val) => val !== option.id)
|
||||
: [...field.value, option.id];
|
||||
? (field.value ?? []).filter((val) => val !== option.id)
|
||||
: [...(field.value ?? []), option.id];
|
||||
|
||||
if (isAllChecked && option.id !== "all") {
|
||||
updated = updated.filter((val) => val !== "all");
|
||||
|
|
|
|||
|
|
@ -1713,7 +1713,7 @@ export default function FormVideo() {
|
|||
if (e.key === "Enter" && e.currentTarget.value.trim()) {
|
||||
e.preventDefault();
|
||||
field.onChange([
|
||||
...field.value,
|
||||
...(field.value ?? []),
|
||||
e.currentTarget.value.trim(),
|
||||
]);
|
||||
e.currentTarget.value = "";
|
||||
|
|
@ -1722,7 +1722,7 @@ export default function FormVideo() {
|
|||
/>
|
||||
|
||||
<div className="mt-3">
|
||||
{field.value.map((tag: string, index: number) => (
|
||||
{(field.value ?? []).map((tag: string, index: number) => (
|
||||
<span
|
||||
key={index}
|
||||
className="px-1 py-1 rounded-lg bg-black text-white mr-2 text-sm font-sans"
|
||||
|
|
@ -1731,7 +1731,7 @@ export default function FormVideo() {
|
|||
<button
|
||||
type="button"
|
||||
onClick={() => {
|
||||
const updatedTags = field.value.filter(
|
||||
const updatedTags = (field.value ?? []).filter(
|
||||
(_, i) => i !== index
|
||||
);
|
||||
field.onChange(updatedTags);
|
||||
|
|
@ -1764,13 +1764,13 @@ export default function FormVideo() {
|
|||
|
||||
{options.map((option) => {
|
||||
const isAllChecked =
|
||||
field.value.length ===
|
||||
(field.value?.length ?? 0) ===
|
||||
options.filter((opt: any) => opt.id !== "all").length;
|
||||
|
||||
const isChecked =
|
||||
option.id === "all"
|
||||
? isAllChecked
|
||||
: field.value.includes(option.id);
|
||||
: field.value?.includes(option.id) ?? false;
|
||||
|
||||
const handleChange = () => {
|
||||
let updated: string[] = [];
|
||||
|
|
@ -1783,8 +1783,8 @@ export default function FormVideo() {
|
|||
.map((opt: any) => opt.id);
|
||||
} else {
|
||||
updated = isChecked
|
||||
? field.value.filter((val) => val !== option.id)
|
||||
: [...field.value, option.id];
|
||||
? (field.value ?? []).filter((val) => val !== option.id)
|
||||
: [...(field.value ?? []), option.id];
|
||||
|
||||
if (isAllChecked && option.id !== "all") {
|
||||
updated = updated.filter((val) => val !== "all");
|
||||
|
|
|
|||
|
|
@ -67,11 +67,11 @@ export default function DetailSettingTracking() {
|
|||
{wilayahList.map((item) => (
|
||||
<div key={item.id} className="flex items-center gap-2">
|
||||
<Checkbox
|
||||
checked={field.value.includes(item.id)}
|
||||
checked={field.value?.includes(item.id) ?? false}
|
||||
onCheckedChange={(checked) => {
|
||||
const updated = checked
|
||||
? [...field.value, item.id]
|
||||
: field.value.filter((val) => val !== item.id);
|
||||
? [...(field.value ?? []), item.id]
|
||||
: (field.value ?? []).filter((val) => val !== item.id);
|
||||
field.onChange(updated);
|
||||
}}
|
||||
/>
|
||||
|
|
|
|||
|
|
@ -67,11 +67,11 @@ export default function CreateSettingTracking() {
|
|||
{wilayahList.map((item) => (
|
||||
<div key={item.id} className="flex items-center gap-2">
|
||||
<Checkbox
|
||||
checked={field.value.includes(item.id)}
|
||||
checked={field.value?.includes(item.id) ?? false}
|
||||
onCheckedChange={(checked) => {
|
||||
const updated = checked
|
||||
? [...field.value, item.id]
|
||||
: field.value.filter((val) => val !== item.id);
|
||||
? [...(field.value ?? []), item.id]
|
||||
: (field.value ?? []).filter((val) => val !== item.id);
|
||||
field.onChange(updated);
|
||||
}}
|
||||
/>
|
||||
|
|
|
|||
|
|
@ -67,11 +67,11 @@ export default function UpdateSettingTracking() {
|
|||
{wilayahList.map((item) => (
|
||||
<div key={item.id} className="flex items-center gap-2">
|
||||
<Checkbox
|
||||
checked={field.value.includes(item.id)}
|
||||
checked={field.value?.includes(item.id) ?? false}
|
||||
onCheckedChange={(checked) => {
|
||||
const updated = checked
|
||||
? [...field.value, item.id]
|
||||
: field.value.filter((val) => val !== item.id);
|
||||
? [...(field.value ?? []), item.id]
|
||||
: (field.value ?? []).filter((val) => val !== item.id);
|
||||
field.onChange(updated);
|
||||
}}
|
||||
/>
|
||||
|
|
|
|||
|
|
@ -202,7 +202,7 @@ export function FormDatePicker<
|
|||
<Calendar
|
||||
initialFocus
|
||||
mode={mode}
|
||||
defaultMonth={mode === 'range' && 'from' in selectedDate ? selectedDate.from : selectedDate}
|
||||
defaultMonth={mode === 'range' && selectedDate && 'from' in selectedDate ? selectedDate.from : selectedDate}
|
||||
selected={selectedDate}
|
||||
onSelect={field.onChange}
|
||||
numberOfMonths={numberOfMonths}
|
||||
|
|
|
|||
|
|
@ -81,7 +81,7 @@ export default function PerformancePoldaViz() {
|
|||
<p className="text-lg">
|
||||
<b>
|
||||
{levelName == "MABES POLRI"
|
||||
? "PERFORMANCE PER POLDA"
|
||||
? "PERFORMANCE PER POLDA/SATKER"
|
||||
: "PERFORMANCE POLRES"}
|
||||
</b>
|
||||
</p>
|
||||
|
|
@ -105,8 +105,8 @@ export default function PerformancePoldaViz() {
|
|||
<p className="text-lg">
|
||||
<b>
|
||||
{isInternational[0]
|
||||
? "PUBLISH CONTENT PER POLDA"
|
||||
: "PUBLISH KONTEN PER POLDA"}
|
||||
? "PUBLISH CONTENT PER POLDA/SATKER"
|
||||
: "PUBLISH KONTEN PER POLDA/SATKER"}
|
||||
</b>
|
||||
</p>
|
||||
<div className="my-5">
|
||||
|
|
|
|||
|
|
@ -22,19 +22,17 @@ export default function PerformancePolresViz() {
|
|||
const baseUrl = "https://db-mediahub.polri.go.id/";
|
||||
const url = "https://db-mediahub.polri.go.id/trusted/";
|
||||
|
||||
const view1 =
|
||||
levelName == "MABES POLRI"
|
||||
? isInternational[0]
|
||||
? "views/2023_04_MediaHUB-Viz_INTL_Rev202/db-konten-top10?"
|
||||
: "views/2023_09_db-ranking-polda_rev100/db-ranking-13-polda?"
|
||||
: `/views/2023_09_db-ranking-polres-by-polda_rev100/db-ranking-by-polda?polda-selected=${poldaState}&`;
|
||||
|
||||
const view1 = `views/2025_10_MediaHUB-Viz-POLDA_Rev203/db-ranking-polda-satker?polda-selected=${poldaState}&`;
|
||||
const view2 = `views/2023_09_db-ranking-polres-by-polda_rev100/db-ranking-by-polda?polda-selected=${poldaState}&`;
|
||||
const param = ":embed=yes&:toolbar=yes&:iframeSizedToWindow=true";
|
||||
|
||||
useEffect(() => {
|
||||
async function initState() {
|
||||
const response1 = await generateTicket();
|
||||
setTicket1(response1?.data?.data);
|
||||
|
||||
const response2 = await generateTicket();
|
||||
setTicket2(response2?.data?.data);
|
||||
}
|
||||
|
||||
initState();
|
||||
|
|
@ -48,19 +46,10 @@ export default function PerformancePolresViz() {
|
|||
// Render
|
||||
if (!hasMounted) return null;
|
||||
|
||||
const handleInternational = (index: number, val: boolean) => {
|
||||
const updatedIsInternational = [...isInternational];
|
||||
|
||||
updatedIsInternational[index] = val;
|
||||
setIsInternational(updatedIsInternational);
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="flex flex-col gap-2 bg-white rounded-lg p-3">
|
||||
<p className="text-lg">
|
||||
<b>
|
||||
{isInternational[0] ? "POLRES PERFORMANCE" : "POLFORMANCE POLRES"}
|
||||
</b>
|
||||
<b>PERFORMANCE POLRES</b>
|
||||
</p>
|
||||
<div className="my-5">
|
||||
{ticket1 == "" ? (
|
||||
|
|
@ -79,6 +68,31 @@ export default function PerformancePolresViz() {
|
|||
/>
|
||||
)}
|
||||
</div>
|
||||
|
||||
<p className="text-lg">
|
||||
<b>
|
||||
{isInternational[0]
|
||||
? "PUBLISH CONTENT PER POLICE REGENCY"
|
||||
: "PUBLISH KONTEN PER POLRES"}
|
||||
</b>
|
||||
</p>
|
||||
<div className="my-5">
|
||||
{ticket2 == "" ? (
|
||||
<iframe
|
||||
src={`${baseUrl + view2 + param}`}
|
||||
width="100%"
|
||||
height="750"
|
||||
frameBorder="0"
|
||||
/>
|
||||
) : (
|
||||
<iframe
|
||||
src={`${`${url + ticket2}/${view2}${param}`}`}
|
||||
width="100%"
|
||||
height="750"
|
||||
frameBorder="0"
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,24 +10,16 @@ export default function PerformanceSatkerViz() {
|
|||
const [hasMounted, setHasMounted] = useState(false);
|
||||
const t = useTranslations("AnalyticsDashboard");
|
||||
const levelName = getCookiesDecrypt("ulnae");
|
||||
const poldaState = Cookies.get("state");
|
||||
const state = Cookies.get("state");
|
||||
const provState = Cookies.get("state-prov");
|
||||
|
||||
const [ticket1, setTicket1] = useState("");
|
||||
const [ticket2, setTicket2] = useState("");
|
||||
const [ticket3, setTicket3] = useState("");
|
||||
const [ticket4, setTicket4] = useState("");
|
||||
const [isInternational, setIsInternational] = useState([false, false, false]);
|
||||
|
||||
const baseUrl = "https://db-mediahub.polri.go.id/";
|
||||
const url = "https://db-mediahub.polri.go.id/trusted/";
|
||||
|
||||
const view1 =
|
||||
levelName == "MABES POLRI"
|
||||
? isInternational[0]
|
||||
? "views/2023_04_MediaHUB-Viz_INTL_Rev202/db-konten-top10?"
|
||||
: "views/2023_04_MediaHUB-Viz-POLDA_Rev201/db-konten-top10?"
|
||||
: `/views/2023_09_db-ranking-polres-by-polda_rev100/db-ranking-by-polda?polda-selected=${provState}&`;
|
||||
const view1 = `views/2025_10_MediaHUB-Viz-POLDA_Rev203/db-ranking-polda-satker?polda-selected=${state}&unit-work-level-1=SATKER`;
|
||||
|
||||
const param = ":embed=yes&:toolbar=yes&:iframeSizedToWindow=true";
|
||||
|
||||
|
|
@ -59,7 +51,7 @@ export default function PerformanceSatkerViz() {
|
|||
<div className="flex flex-col gap-2 bg-white rounded-lg p-3">
|
||||
<p className="text-lg">
|
||||
<b>
|
||||
{isInternational[0] ? "SATKER PERFORMANCE" : "POLFORMANCE SATKER"}
|
||||
{isInternational[0] ? "SATKER PERFORMANCE" : "PERFORMANCE SATKER"}
|
||||
</b>
|
||||
</p>
|
||||
<div className="my-5">
|
||||
|
|
|
|||
105
lib/menus.ts
105
lib/menus.ts
|
|
@ -2649,8 +2649,7 @@ export function getMenuList(pathname: string, t: any): Group[] {
|
|||
(Number(roleId) == 3 || Number(roleId) == 14 || Number(roleId) == 15) &&
|
||||
Number(levelNumber) == 3
|
||||
) {
|
||||
if (Number(userParentLevelId) != 761)
|
||||
{
|
||||
if (Number(userParentLevelId) != 761) {
|
||||
menusSelected = [
|
||||
{
|
||||
groupLabel: t("apps"),
|
||||
|
|
@ -4009,20 +4008,20 @@ export function getMenuList(pathname: string, t: any): Group[] {
|
|||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
groupLabel: "",
|
||||
id: "agenda-setting",
|
||||
menus: [
|
||||
{
|
||||
id: "agenda-setting",
|
||||
href: "/contributor/agenda-setting",
|
||||
label: t("agenda-setting"),
|
||||
active: pathname.includes("/agenda-setting"),
|
||||
icon: "iconoir:journal-page",
|
||||
submenus: [],
|
||||
},
|
||||
],
|
||||
},
|
||||
// {
|
||||
// groupLabel: "",
|
||||
// id: "agenda-setting",
|
||||
// menus: [
|
||||
// {
|
||||
// id: "agenda-setting",
|
||||
// href: "/contributor/agenda-setting",
|
||||
// label: t("agenda-setting"),
|
||||
// active: pathname.includes("/agenda-setting"),
|
||||
// icon: "iconoir:journal-page",
|
||||
// submenus: [],
|
||||
// },
|
||||
// ],
|
||||
// },
|
||||
{
|
||||
groupLabel: "",
|
||||
id: "performance-polres",
|
||||
|
|
@ -4050,7 +4049,7 @@ export function getMenuList(pathname: string, t: any): Group[] {
|
|||
submenus: [
|
||||
{
|
||||
href: "/admin/media-tracking/tracking-berita",
|
||||
label: "Tracking Beritra",
|
||||
label: "Tracking Berita",
|
||||
active: pathname === "/admin/media-tracking/tracking-berita",
|
||||
icon: "heroicons:arrow-trending-up",
|
||||
children: [],
|
||||
|
|
@ -4119,41 +4118,41 @@ export function getMenuList(pathname: string, t: any): Group[] {
|
|||
icon: "heroicons:arrow-trending-up",
|
||||
children: [],
|
||||
},
|
||||
{
|
||||
href: "/admin/settings/banner",
|
||||
label: "Banner",
|
||||
active: pathname === "/admin/settings/banner",
|
||||
icon: "heroicons:arrow-trending-up",
|
||||
children: [],
|
||||
},
|
||||
{
|
||||
href: "/admin/settings/feedback",
|
||||
label: "Feedback",
|
||||
active: pathname === "/admin/settings/feedback",
|
||||
icon: "heroicons:arrow-trending-up",
|
||||
children: [],
|
||||
},
|
||||
{
|
||||
href: "/admin/settings/faq",
|
||||
label: "FAQ",
|
||||
active: pathname === "/admin/settings/faq",
|
||||
icon: "heroicons:arrow-trending-up",
|
||||
children: [],
|
||||
},
|
||||
{
|
||||
href: "https://nat-mediahub.polri.go.id/",
|
||||
label: "Mediahub 2022",
|
||||
active: pathname === "/admin/settings/mediahub-2022",
|
||||
icon: "heroicons:arrow-trending-up",
|
||||
children: [],
|
||||
},
|
||||
{
|
||||
href: "/admin/settings/privacy",
|
||||
label: t("privacy"),
|
||||
active: pathname === "/admin/settings/privacy",
|
||||
icon: "heroicons:arrow-trending-up",
|
||||
children: [],
|
||||
},
|
||||
// {
|
||||
// href: "/admin/settings/banner",
|
||||
// label: "Banner",
|
||||
// active: pathname === "/admin/settings/banner",
|
||||
// icon: "heroicons:arrow-trending-up",
|
||||
// children: [],
|
||||
// },
|
||||
// {
|
||||
// href: "/admin/settings/feedback",
|
||||
// label: "Feedback",
|
||||
// active: pathname === "/admin/settings/feedback",
|
||||
// icon: "heroicons:arrow-trending-up",
|
||||
// children: [],
|
||||
// },
|
||||
// {
|
||||
// href: "/admin/settings/faq",
|
||||
// label: "FAQ",
|
||||
// active: pathname === "/admin/settings/faq",
|
||||
// icon: "heroicons:arrow-trending-up",
|
||||
// children: [],
|
||||
// },
|
||||
// {
|
||||
// href: "https://nat-mediahub.polri.go.id/",
|
||||
// label: "Mediahub 2022",
|
||||
// active: pathname === "/admin/settings/mediahub-2022",
|
||||
// icon: "heroicons:arrow-trending-up",
|
||||
// children: [],
|
||||
// },
|
||||
// {
|
||||
// href: "/admin/settings/privacy",
|
||||
// label: t("privacy"),
|
||||
// active: pathname === "/admin/settings/privacy",
|
||||
// icon: "heroicons:arrow-trending-up",
|
||||
// children: [],
|
||||
// },
|
||||
],
|
||||
},
|
||||
],
|
||||
|
|
@ -4259,7 +4258,7 @@ export function getMenuList(pathname: string, t: any): Group[] {
|
|||
submenus: [
|
||||
{
|
||||
href: "/admin/media-tracking/tracking-berita",
|
||||
label: "Tracking Beritra",
|
||||
label: "Tracking Berita",
|
||||
active: pathname === "/admin/media-tracking/tracking-berita",
|
||||
icon: "heroicons:arrow-trending-up",
|
||||
children: [],
|
||||
|
|
|
|||
|
|
@ -327,7 +327,7 @@
|
|||
"sellers": "Sellers",
|
||||
"typography": "Typography",
|
||||
"colors": "Colors",
|
||||
"performance-polda": "Performance Polda",
|
||||
"performance-polda": "Performance Polda/Satker",
|
||||
"performance-polres": "Performance Polres",
|
||||
"performance-satker": "Performance Satker",
|
||||
"analysis": "Analysis",
|
||||
|
|
|
|||
|
|
@ -328,7 +328,7 @@
|
|||
"sellers": "Sellers",
|
||||
"typography": "Typography",
|
||||
"colors": "Colors",
|
||||
"performance-polda": "Performa Polda",
|
||||
"performance-polda": "Performa Polda/Satker",
|
||||
"performance-polres": "Performa Polres",
|
||||
"performance-satker": "Performa Satker",
|
||||
"analysis": "Analisa",
|
||||
|
|
|
|||
Loading…
Reference in New Issue