Compare commits

..

46 Commits

Author SHA1 Message Date
Sabda Yagra 9223122e66 Merge branch 'dev-sabda-v2' of http://38.47.180.165:3000/mediahub/mediahub-fe
continuous-integration/drone/push Build is passing Details
2026-02-27 10:48:33 +07:00
Sabda Yagra 9e286ffd06 fix: dev fixing
continuous-integration/drone/push Build is passing Details
2026-02-27 10:47:55 +07:00
Sabda Yagra 18d6f32536 Merge branch 'dev-sabda-v2' of http://38.47.180.165:3000/mediahub/mediahub-fe
continuous-integration/drone/push Build is passing Details
2026-02-20 15:29:26 +07:00
Sabda Yagra 9c2b3612c6 fix: ck editor
continuous-integration/drone/push Build is passing Details
2026-02-20 15:16:23 +07:00
Sabda Yagra 6bd83237c4 fix: install all package and fixing task 2026-02-20 15:13:48 +07:00
Sabda Yagra 61df236e13 Merge branch 'dev-sabda-v2' of http://38.47.180.165:3000/mediahub/mediahub-fe
continuous-integration/drone/push Build is passing Details
2026-02-20 14:09:25 +07:00
Sabda Yagra 7f9166b866 fix: .drone.yml
continuous-integration/drone/push Build is passing Details
2026-02-20 14:04:40 +07:00
Sabda Yagra 2876e4eb30 Merge branch 'dev-sabda-v2' of http://38.47.180.165:3000/mediahub/mediahub-fe
continuous-integration/drone/push Build is passing Details
2026-02-20 13:55:41 +07:00
Sabda Yagra 292cde6ed0 feat: drone.yml
continuous-integration/drone/push Build is passing Details
2026-02-20 11:55:18 +07:00
Sabda Yagra 3c5e644668 Merge branch 'dev-sabda-v2' of https://gitlab.com/hanifsalafi/mediahub_redesign 2026-02-11 22:47:17 +07:00
Sabda Yagra d80adaa133 fix: schedule checkbox 2026-02-11 22:46:47 +07:00
Sabda Yagra eefa43a5b0 Merge branch 'dev-sabda-v2' of https://gitlab.com/hanifsalafi/mediahub_redesign 2026-02-11 18:13:06 +07:00
Sabda Yagra 277f1cc805 fix: api key maps google 2026-02-11 18:10:36 +07:00
Sabda Yagra f357a4e8ce fix: api key maps 2026-02-11 18:09:39 +07:00
Sabda Yagra bb91379058 Merge branch 'dev-sabda-v2' of https://gitlab.com/hanifsalafi/mediahub_redesign 2026-02-11 17:13:44 +07:00
Sabda Yagra 740d73d689 fix: satker section all and maps 2026-02-11 17:12:50 +07:00
Sabda Yagra 76c4ed9238 Merge branch 'dev-sabda-v2' of https://gitlab.com/hanifsalafi/mediahub_redesign 2026-01-29 18:39:52 +07:00
Sabda Yagra 44c6cc6d9d fix: menus for polres 2026-01-29 18:38:34 +07:00
Sabda Yagra 2b8f7b724e Merge branch 'dev-sabda-v2' of https://gitlab.com/hanifsalafi/mediahub_redesign 2026-01-22 14:28:34 +07:00
Sabda Yagra 10694547d1 fix: table task mabes=>koorkurator 2026-01-22 14:24:33 +07:00
Sabda Yagra e5e32496ab Merge branch 'dev-sabda-v2' of https://gitlab.com/hanifsalafi/mediahub_redesign 2026-01-22 12:03:33 +07:00
Sabda Yagra 78d1fc0d93 fix: schedule live report 2026-01-22 11:59:48 +07:00
Sabda Yagra c99e1a5c7d fix: penugasan mabes=>koorkurator 2026-01-21 10:06:40 +07:00
Sabda Yagra 274fd022e1 Merge branch 'main' of https://gitlab.com/hanifsalafi/mediahub_redesign 2026-01-13 09:55:09 +07:00
Sabda Yagra 933a672280 Merge branch 'dev-sabda-v2' of https://gitlab.com/hanifsalafi/mediahub_redesign 2026-01-13 09:53:07 +07:00
Sabda Yagra ce7c343808 fix: taskTA from mabes to koorkurator 2026-01-13 09:52:29 +07:00
hanif salafi cba94cf0a9 feat: rollback using pnpm 2026-01-13 02:20:57 +07:00
Sabda Yagra 7c721dcc96 fix: form create task-ta 2026-01-12 09:09:52 +07:00
Sabda Yagra 78ddd461df Merge branch 'dev-sabda-v2' of https://gitlab.com/hanifsalafi/mediahub_redesign 2026-01-09 20:33:10 +07:00
Sabda Yagra ec2d7eb203 fixing 2026-01-09 20:32:39 +07:00
Sabda Yagra ad5d048e78 fixing 2026-01-09 20:27:20 +07:00
Sabda Yagra 5614b5ada5 fixing 2026-01-09 20:08:13 +07:00
Sabda Yagra f1b59ee537 fix: add xlsx and file-saver dependency 2026-01-09 18:47:26 +07:00
Sabda Yagra 0ad1acee09 fix: button relevant in media tracking and table 2026-01-09 18:35:20 +07:00
Sabda Yagra 2d09af2e8b fix: local dev error 2026-01-09 14:30:51 +07:00
Sabda Yagra edafc223db fix: baseUrl api 2026-01-09 11:11:55 +07:00
Sabda Yagra 933cdb1100 fix: button validate in detail media tracking 2026-01-09 10:22:43 +07:00
Sabda Yagra 280ea508e9 fix: adjust coloumns media tracking 2026-01-06 11:22:13 +07:00
Sabda Yagra 1a0d53bb11 fix: new content typeId 2025-12-31 13:20:22 +07:00
Sabda Yagra be1c799629 fix: change docker 2025-12-29 08:37:26 +07:00
Sabda Yagra 3d23d75e05 fix: change ip docker image 2025-12-26 16:14:10 +07:00
Sabda Yagra 1ee379df71 fix: change docker and jenkins IP 2025-12-24 12:18:41 +07:00
Sabda Yagra 9a1b41e90b fix: change api url 2025-12-17 15:17:01 +07:00
Sabda Yagra fcfa24b06c fix: change ip jenkins 2025-12-17 11:22:20 +07:00
Sabda Yagra cf91ea33ec fix: adjust gitlab ci 2025-12-15 09:31:24 +07:00
Sabda Yagra 1cc7786dee fix: change gitlab ci 2025-12-15 08:36:49 +07:00
288 changed files with 5081 additions and 12139 deletions

45
.drone.yml Normal file
View File

@ -0,0 +1,45 @@
kind: pipeline
type: ssh
name: mediahub-fe-build-deploy
server:
host:
from_secret: ssh_host
user:
from_secret: ssh_user
ssh_key:
from_secret: ssh_key
steps:
- name: prepare repo
when:
branch:
- dev-sabda-v2
- main
- prod
commands:
- rm -rf /opt/build/mediahub-fe
- mkdir -p /opt/build
- cd /opt/build
- git clone http://38.47.180.165:3000/mediahub/mediahub-fe.git
- name: build image
when:
branch:
- dev-sabda-v2
- prod
commands:
- docker login 38.47.180.165:3000 -u administrator -p HarborDockerImageRep0
- cd /opt/build/mediahub-fe
- docker build -t 38.47.180.165:3000/mediahub/mediahub-fe:$DRONE_BRANCH .
- docker push 38.47.180.165:3000/mediahub/mediahub-fe:$DRONE_BRANCH
- name: deploy
when:
branch:
- prod
commands:
- docker pull 38.47.180.165:3000/mediahub/mediahub-fe:$DRONE_BRANCH
- docker stop new-mediahub-fe || true
- docker rm new-mediahub-fe || true
- docker run -dt -p 4200:3000 --restart always --name new-mediahub-fe 38.47.180.165:3000/mediahub/mediahub-fe:$DRONE_BRANCH

2
.env
View File

@ -1,3 +1,3 @@
NEXT_PUBLIC_API=https://new.netidhub.com/api/v2
NEXT_PUBLIC_API=https://new.netidhub.com/api
NEXT_PUBLIC=https://new.netidhub.com
NEXT_PUBLIC_TINYMCE_API_KEY=bhteuja26yz5p0aubxry9b95hs33amgn65kjv5km0fd5iuev

View File

@ -1,35 +1,30 @@
stages:
- build
- deploy
build-prod:
build-dev:
stage: build
when: on_success
only:
- main
- staging
- prod
image:
- dev-landing-v2
image:
name: docker:25.0.3-cli
services:
- name: docker:25.0.3-dind
command: ["--insecure-registry=103.82.242.92:8900"]
command: ["--insecure-registry=38.47.185.86:8900"]
script:
- docker logout
- 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 --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
- docker login -u $DEPLOY_USERNAME -p $DEPLOY_TOKEN 38.47.185.86:8900
- docker build -t 38.47.185.86:8900/mediahub/new-mediahub-fe:dev .
- docker push 38.47.185.86:8900/mediahub/new-mediahub-fe:dev
auto-deploy:
stage: deploy
when: on_success
only:
- main
- staging
- dev-landing-v2
image: curlimages/curl:latest
services:
- docker:dind
script:
- curl --user admin:$JENKINS_PWD http://103.31.38.120:8080/job/auto-deploy-new-mediahub-fe/build?token=autodeploynewmediahub
- curl --user admin:$JENKINS_PWD http://38.47.185.86:8080/job/auto-deploy-new-mediahub-fe/build?token=autodeploynewmediahub

View File

@ -25,8 +25,7 @@ RUN pnpm install
COPY . .
# Build aplikasi
# RUN NODE_OPTIONS="--max-old-space-size=4096"
RUN pnpm run build
RUN NODE_OPTIONS="--max-old-space-size=4096" pnpm run build
# Expose port untuk server
EXPOSE 3000

View File

@ -148,7 +148,7 @@ export default function AddExpertForm() {
};
const save = async (data: z.infer<typeof FormSchema>) => {
// console.log("data", data);
console.log("data", data);
const dataReq = {
firstName: data.name,
@ -274,10 +274,10 @@ export default function AddExpertForm() {
};
const handleRemoveRow = (index: number) => {
// console.log(index);
// console.log(placementRows);
console.log(index);
console.log(placementRows);
const newPlacements = placementRows.filter((row) => row.index != index);
// console.log(newPlacements);
console.log(newPlacements);
setPlacementRows(newPlacements);
};

View File

@ -233,7 +233,7 @@ export default function UpdateExpertForm() {
};
const save = async (data: z.infer<typeof FormSchema>) => {
// console.log("data", data);
console.log("data", data);
const dataReq = {
id: detail?.id,
@ -310,7 +310,7 @@ export default function UpdateExpertForm() {
const resExperiences = await getListExperiences();
setUserExperiences(resExperiences?.data?.data);
// console.log("experience", resExperiences?.data?.data);
console.log("experience", resExperiences?.data?.data);
const resUserLevels = await AdministrationLevelList();
const data = resUserLevels?.data?.data;
@ -353,10 +353,10 @@ export default function UpdateExpertForm() {
};
const handleRemoveRow = (index: number) => {
// console.log(index);
// console.log(placementRows);
console.log(index);
console.log(placementRows);
const newPlacements = placementRows.filter((row) => row.index != index);
// console.log(newPlacements);
console.log(newPlacements);
setPlacementRows(newPlacements);
};

View File

@ -43,8 +43,8 @@ export default function ContentManagement() {
const [ticket6, setTicket6] = 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 baseUrl = "https://analytic.sitani.info/";
const url = "https://analytic.sitani.info/trusted/";
const view1 =
levelName == "MABES POLRI"
@ -87,7 +87,7 @@ export default function ContentManagement() {
? "views/2023_08_MediaHUB-KtnMgt_Rev100/db-ktn-intl?"
: "views/2023_08_MediaHUB-KtnMgt_Rev100/db-ktn-intl?"
: `views/2023_08_MediaHUB-KtnMgt_Rev100/db-ktn-intl?provinsi-polda=${poldaState}&`;
const param = ":embed=yes&:toolbar=yes&:iframeSizedToWindow=true";
const param = ":embed=yes&:toolbar=no&:iframeSizedToWindow=true";
useEffect(() => {
async function initState() {

View File

@ -43,8 +43,8 @@ export default function EmergencyIssue() {
const [ticket6, setTicket6] = 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 baseUrl = "https://analytic.sitani.info/";
const url = "https://analytic.sitani.info/trusted/";
const view1 =
levelName == "MABES POLRI"
@ -53,7 +53,7 @@ export default function EmergencyIssue() {
: "views/2023_08_MediaHUB-KtnMgt_Rev100/db-emg-issue?"
: `views/2023_08_MediaHUB-KtnMgt_Rev100/db-emg-issue?provinsi-polda=${provState}&`;
const param = ":embed=yes&:toolbar=yes&:iframeSizedToWindow=true";
const param = ":embed=yes&:toolbar=no&:iframeSizedToWindow=true";
useEffect(() => {
async function initState() {

View File

@ -43,8 +43,8 @@ export default function FeedbackCenter() {
const [ticket6, setTicket6] = 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 baseUrl = "https://analytic.sitani.info/";
const url = "https://analytic.sitani.info/trusted/";
const view1 =
levelName == "MABES POLRI"
@ -53,7 +53,7 @@ export default function FeedbackCenter() {
: "views/2023_08_MediaHUB-KtnMgt_Rev100/db-tickets?"
: `views/2023_08_MediaHUB-KtnMgt_Rev100/db-tickets?provinsi-polda=${provState}&`;
const param = ":embed=yes&:toolbar=yes&:iframeSizedToWindow=true";
const param = ":embed=yes&:toolbar=no&:iframeSizedToWindow=true";
useEffect(() => {
async function initState() {

View File

@ -38,8 +38,8 @@ export default function ContentManagement() {
const [ticket6, setTicket6] = 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 baseUrl = "https://analytic.sitani.info/";
const url = "https://analytic.sitani.info/trusted/";
const view1 =
levelName == "MABES POLRI"
@ -69,7 +69,7 @@ export default function ContentManagement() {
: "views/2023_08_MediaHUB-KtnMgt_Rev100/db-ktn-act-jnl?"
: `views/2023_08_MediaHUB-KtnMgt_Rev100/db-ktn-act-jnl?provinsi-polda=${poldaState}&`;
const param = ":embed=yes&:toolbar=yes&:iframeSizedToWindow=true";
const param = ":embed=yes&:toolbar=no&:iframeSizedToWindow=true";
useEffect(() => {
async function initState() {

View File

@ -171,11 +171,11 @@ export default function CreateAccountForBroadcast() {
{/* WA */}
<div className="flex items-center gap-2">
<Checkbox
checked={field.value?.includes("wa") ?? false}
checked={field.value.includes("wa")}
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") ?? false}
checked={field.value.includes("email")}
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"

View File

@ -157,7 +157,7 @@ export default function EditAccountForBroadcast() {
isDefault: false,
isAdmin: true,
};
// console.log("data", data);
console.log("data", data);
const response = await saveUserInternal(reqData);
if (response?.error) {

View File

@ -136,7 +136,7 @@ const CampaignListTable = () => {
item.no = (page - 1) * 10 + index + 1;
});
// console.log("contentData : ", data);
console.log("contentData : ", data);
setDataTable(contentData);
setTotalData(data?.totalElements);

View File

@ -117,8 +117,8 @@ export default function BroadcastCampaignDetail({
async function getListPaginationData() {
loading();
// console.log("Type : ", typeFilter);
// console.log("Date : ", startDateString, endDateString);
console.log("Type : ", typeFilter);
console.log("Date : ", startDateString, endDateString);
try {
const res = await getMediaBlastBroadcastList(
@ -152,7 +152,7 @@ export default function BroadcastCampaignDetail({
]);
function setupData(rawData: PaginatedResponse) {
// console.log("raw", rawData);
console.log("raw", rawData);
if (rawData !== undefined) {
const dataContent = rawData?.content;
const data: CampaignData[] = [];
@ -251,7 +251,7 @@ export default function BroadcastCampaignDetail({
setEndDateString(getOnlyDate(endDate));
}
}
// console.log("date range", dateRange);
console.log("date range", dateRange);
initState();
}, [calenderState, startDate, endDate]);

View File

@ -160,7 +160,7 @@ const BroadcastEmailTable = () => {
item.no = (page - 1) * Number(showData) + index + 1;
});
// console.log("contentData : ", data);
console.log("contentData : ", data);
setDataTable(contentData);
setTotalData(data?.totalElements);

View File

@ -160,7 +160,7 @@ const BroadcastWhatsAppTable = () => {
item.no = (page - 1) * Number(showData) + index + 1;
});
// console.log("contentData : ", data);
console.log("contentData : ", data);
setDataTable(contentData);
setTotalData(data?.totalElements);

View File

@ -85,7 +85,7 @@ export default function EditUserForm() {
const response = await getUserById(String(id));
const res = response?.data?.data;
close();
// console.log("res", res);
console.log("res", res);
form.setValue("fullname", res?.fullname);
form.setValue("username", res?.username);
form.setValue("phoneNumber", res?.phoneNumber);

View File

@ -126,7 +126,7 @@ export default function EditUserForm() {
const response = await getUserById(String(id));
const res = response?.data?.data;
close();
// console.log("res", res);
console.log("res", res);
form.setValue("fullname", res?.fullname);
form.setValue("username", res?.username);
form.setValue("phoneNumber", res?.phoneNumber);

View File

@ -203,7 +203,7 @@ export default function DetailUserForm() {
const response = await getUserById(String(id));
const res = response?.data?.data;
close();
// console.log("res", res);
console.log("res", res);
if (Number(res.roleId) > 4) {
form.setValue("fullname", res?.fullname);
form.setValue("username", res?.username);
@ -215,7 +215,7 @@ export default function DetailUserForm() {
form.setValue("level", String(res?.userLevelId));
} else {
initFetch();
// console.log("sadad", res?.role?.code);
console.log("sadad", res?.role?.code);
form.setValue("fullname", res?.fullname);
form.setValue("username", res?.username);
form.setValue("phoneNumber", res?.phoneNumber);

View File

@ -209,7 +209,7 @@ export default function EditUserForm() {
const response = await getUserById(String(id));
const res = response?.data?.data;
close();
// console.log("res", res);
console.log("res", res);
if (Number(res.roleId) > 4) {
form.setValue("fullname", res?.fullname);
form.setValue("username", res?.username);

View File

@ -43,7 +43,7 @@ export default function TrackingMediaModal(props: { triggerFetch: () => void })
}
if (/\s/.test(value)) {
// console.log("Terdapat spasi dalam input");
console.log("Terdapat spasi dalam input");
fecthAll();
}

View File

@ -161,11 +161,11 @@ const NewsTable = () => {
setCategoryFilter(
categorie?.split("&")?.length > 1 ? categorie?.split("&") : [categorie]
);
// console.log(
// "Kategori",
// categorie,
// categorie?.split("&")?.length > 1 ? categorie?.split("&") : [categorie]
// );
console.log(
"Kategori",
categorie,
categorie?.split("&")?.length > 1 ? categorie?.split("&") : [categorie]
);
}
}, [categorie]);
@ -177,7 +177,7 @@ const NewsTable = () => {
} else {
filter.splice(categoryFilter.indexOf(id), 1);
}
// console.log("checkbox filter", filter);
console.log("checkbox filter", filter);
setCategoryFilter(filter);
router.push(`?category=${filter.join("&")}`);
};

View File

@ -31,6 +31,8 @@ import {
DialogTrigger,
} from "@/components/ui/dialog";
import { Collapsible, CollapsibleContent } from "@/components/ui/collapsible";
import { validateMediaLink } from "@/service/media-tracking/media-tracking";
import toast from "react-hot-toast";
const columns: ColumnDef<any>[] = [
{
@ -52,12 +54,132 @@ const columns: ColumnDef<any>[] = [
<span className="normal-case">{row.getValue("title")}</span>
),
},
// {
// accessorKey: "link",
// header: "Link Berita",
// cell: ({ row }) => (
// <span className="normal-case">{row.getValue("link")}</span>
// ),
// },
{
accessorKey: "link",
header: "Link Berita",
cell: ({ row }) => (
<span className="normal-case">{row.getValue("link")}</span>
),
cell: ({ row }) => {
const link = row.getValue<string>("link");
if (!link) {
return <span className="text-muted-foreground">-</span>;
}
return (
<Link
href={link}
target="_blank"
rel="noopener noreferrer"
className="text-blue-600 underline hover:text-blue-800 break-all"
>
{link}
</Link>
);
},
},
{
id: "validation",
header: "Validasi",
cell: ({ row, table }) => {
const original = row.original;
// const isValid = original.isValid;
const isRelevant = original.isRelevant;
const link = original.link;
const updateRow = (data: Partial<any>) => {
table.options.meta?.updateData(row.index, data);
};
const handleValid = async () => {
try {
await validateMediaLink(original.id, true);
updateRow({
isRelevant: true,
});
table.options.meta?.refetchData?.();
} catch (err: any) {
toast.error(err.message);
}
};
const handleInvalid = async () => {
try {
await validateMediaLink(original.id, false);
updateRow({
isRelevant: false,
});
table.options.meta?.refetchData?.();
} catch (err: any) {
toast.error(err.message);
}
};
if (!link) {
return <span className="text-muted-foreground">-</span>;
}
if (isRelevant === true) {
return (
<Button
size="sm"
className="bg-green-600 hover:bg-green-700"
disabled
>
Relevan
</Button>
);
}
return (
<div className="flex gap-2">
<Button
size="sm"
variant="outline"
onClick={handleValid}
className="flex items-center"
>
<svg
xmlns="http://www.w3.org/2000/svg"
width="20"
height="20"
viewBox="0 0 24 24"
>
<path
fill="currentColor"
d="M18.7 7.2c-.4-.4-1-.4-1.4 0l-7.5 7.5l-3.1-3.1c-.4-.4-1-.4-1.4 0s-.4 1 0 1.4l3.8 3.8c.2.2.4.3.7.3s.5-.1.7-.3l8.2-8.2c.4-.4.4-1 0-1.4"
/>
</svg>
Relevan
</Button>
<Button size="sm" variant="outline" onClick={handleInvalid} className="flex text-center items-center justify-center">
<svg
xmlns="http://www.w3.org/2000/svg"
width="20"
height="20"
viewBox="0 0 24 24"
>
<path
fill="none"
stroke="currentColor"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="1.5"
d="M6.758 17.243L12.001 12m5.243-5.243L12 12m0 0L6.758 6.757M12.001 12l5.243 5.243"
/>
</svg>
Tidak Relevan
</Button>
</div>
);
},
},
];

View File

@ -116,6 +116,18 @@ const NewsDetailTable = () => {
onColumnVisibilityChange: setColumnVisibility,
onRowSelectionChange: setRowSelection,
onPaginationChange: setPagination,
meta: {
updateData: (rowIndex: number, value: Partial<any>) => {
setDataTable((old) =>
old.map((row, index) =>
index === rowIndex ? { ...row, ...value } : row
)
);
},
refetchData: () => {
fetchData();
},
},
state: {
sorting,
columnFilters,
@ -154,7 +166,7 @@ const NewsDetailTable = () => {
pageIndex: 0,
pageSize: Number(showData),
});
}, [page, showData]);
}, [page, showData, id]);
async function fetchData() {
try {

View File

@ -1,7 +1,15 @@
import * as React from "react";
import { ColumnDef } from "@tanstack/react-table";
import { Eye, MoreVertical, SquarePen, Trash2 } from "lucide-react";
import { exportMediaTrackingToExcel } from "@/utils/export-media-tracking";
import { loading, close } from "@/config/swal";
import { error } from "@/lib/swal";
import {
DownloadIcon,
Eye,
MoreVertical,
SquarePen,
Trash2,
} from "lucide-react";
import { cn } from "@/lib/utils";
import {
DropdownMenu,
@ -46,7 +54,7 @@ const columns: ColumnDef<any>[] = [
},
{
accessorKey: "resultTotal",
header: () => <div className="text-center w-full">Jumlah Amplifikasi</div>,
header: () => <div className="text-center w-full">Total Artikel</div>,
cell: ({ row }) => {
const value = row.getValue("resultTotal") as number | string | null;
@ -58,6 +66,29 @@ const columns: ColumnDef<any>[] = [
return <div className="text-center w-full">{finalValue}</div>;
},
},
{
accessorKey: "amplification",
header: () => <div className="text-center w-full">Jumlah Amplifikasi</div>,
cell: ({ row }) => {
const raw = row.getValue("amplification") as string | null;
let total = 0;
let invalidTotal = 0;
if (raw && typeof raw === "string") {
const parts = raw.split("/").map((v) => v.trim());
total = Number(parts[0]) || 0;
invalidTotal = Number(parts[1]) || 0;
}
return (
<div className="text-center w-full font-medium">
{total}
<span className="text-muted-foreground">/{invalidTotal}</span>
</div>
);
},
},
// {
// accessorKey: "status",
@ -81,11 +112,7 @@ const columns: ColumnDef<any>[] = [
header: () => <div className="text-center">Status</div>,
cell: ({ row }) => {
const raw = Boolean(row.getValue("isProcessing"));
// KONDISI STATUS
const statusText = raw ? "Sedang Diproses" : "Sudah Selesai";
// WARNA STATUS
const colorClass = raw
? "bg-yellow-100 text-yellow-700 border border-yellow-300"
: "bg-green-100 text-green-700 border border-green-300";
@ -141,13 +168,31 @@ const columns: ColumnDef<any>[] = [
</DropdownMenuTrigger>
<DropdownMenuContent className="p-0" align="end">
<Link href={`/admin/media-tracking/detail/${row.original.id}`}>
<DropdownMenuItem className="p-2 border-b text-default-700 group focus:bg-default focus:text-primary-foreground items-center rounded-none">
<DropdownMenuItem className="p-2 border-b cursor-pointer text-default-700 group focus:bg-default focus:text-primary-foreground items-center rounded-none">
<Eye className="w-4 h-4 me-1.5" />
View&nbsp;
{row.original.mediaUpload.fileType.secondaryName &&
row.original.mediaUpload.fileType.secondaryName.toLowerCase()}
</DropdownMenuItem>
</Link>
<DropdownMenuItem
className="p-2 border-b cursor-pointer text-default-700 group rounded-none focus:bg-default focus:text-primary-foreground "
onClick={async () => {
try {
loading();
await exportMediaTrackingToExcel({
mediaTrackingId: row.original.id,
});
close();
} catch (e: any) {
close();
error(e.message || "Gagal export data");
}
}}
>
<DownloadIcon className="w-4 h-4 me-1.5" />
<p>Download</p>
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
);

View File

@ -179,11 +179,11 @@ const ResultTable = () => {
setCategoryFilter(
categorie?.split("&")?.length > 1 ? categorie?.split("&") : [categorie]
);
// console.log(
// "Kategori",
// categorie,
// categorie?.split("&")?.length > 1 ? categorie?.split("&") : [categorie]
// );
console.log(
"Kategori",
categorie,
categorie?.split("&")?.length > 1 ? categorie?.split("&") : [categorie]
);
}
}, [categorie]);
@ -195,7 +195,7 @@ const ResultTable = () => {
} else {
filter.splice(categoryFilter.indexOf(id), 1);
}
// console.log("checkbox filter", filter);
console.log("checkbox filter", filter);
setCategoryFilter(filter);
router.push(`?category=${filter.join("&")}`);
};

View File

@ -151,11 +151,11 @@ const NewsTable = () => {
setCategoryFilter(
categorie?.split("&")?.length > 1 ? categorie?.split("&") : [categorie]
);
// console.log(
// "Kategori",
// categorie,
// categorie?.split("&")?.length > 1 ? categorie?.split("&") : [categorie]
// );
console.log(
"Kategori",
categorie,
categorie?.split("&")?.length > 1 ? categorie?.split("&") : [categorie]
);
}
}, [categorie]);
@ -167,7 +167,7 @@ const NewsTable = () => {
} else {
filter.splice(categoryFilter.indexOf(id), 1);
}
// console.log("checkbox filter", filter);
console.log("checkbox filter", filter);
setCategoryFilter(filter);
router.push(`?category=${filter.join("&")}`);
};

View File

@ -5,7 +5,7 @@ export default function PerformancePolda() {
return (
<div>
<SiteBreadcrumb />
{/* <p className="font-semibold">PERFORMANCE KUMULATIF PER POLDA</p> */}
<p className="font-semibold">PERFORMANCE KUMULATIF PER POLDA</p>
<PerformancePoldaViz />
</div>
);

View File

@ -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>
);

View File

@ -6,6 +6,7 @@ export default function PerformanceSatker() {
return (
<div>
<SiteBreadcrumb />
<p className="font-semibold">PERFORMANCE KUMULATIF PER SATKER</p>
<PerformanceSatkerViz />
</div>
);

View File

@ -97,7 +97,7 @@ const BannerListTable = () => {
const response = await listBanner();
const data = response?.data?.data?.content;
// console.log("banner", data);
console.log("banner", data);
setGetData(data);
close();

View File

@ -176,7 +176,7 @@ const ContentListBanner = () => {
item.no = (page - 1) * Number(showData) + index + 1;
});
// console.log("contentData : ", data);
console.log("contentData : ", data);
setData(contentData);
setTotalData(data?.totalElements);

View File

@ -88,7 +88,7 @@ const columns: ColumnDef<any>[] = [
const categoryDelete = async (id: number) => {
const response = await deleteCategory(id);
// console.log(response);
console.log(response);
if (response?.error) {
error(response.message);
return false;

View File

@ -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
)
);

View File

@ -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
)
);

View File

@ -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)
)
);

View File

@ -68,7 +68,7 @@ const columns: ColumnDef<any>[] = [
const faqDelete = async (id: string) => {
const response = await deleteDataFAQ(id);
// console.log(response);
console.log(response);
if (response?.error) {
error(response.message);
return false;

View File

@ -110,7 +110,7 @@ const AdminFAQTable = () => {
loading();
const response = await getListFAQ();
const data = response?.data?.data;
// console.log("respone", response);
console.log("respone", response);
data.forEach((item: any, index: number) => {
item.no = (page - 1) * 10 + index + 1;
});

View File

@ -69,7 +69,7 @@ const columns: ColumnDef<any>[] = [
const faqDelete = async (id: string) => {
const response = await deleteDataFAQ(id);
// console.log(response);
console.log(response);
if (response?.error) {
error(response.message);
return false;

View File

@ -109,7 +109,7 @@ const AdminFeedbackTable = () => {
loading();
const response = await getListFeedback();
const data = response?.data?.data;
// console.log("respone", response);
console.log("respone", response);
data.forEach((item: any, index: number) => {
item.no = (page - 1) * 10 + index + 1;
});

View File

@ -97,7 +97,7 @@ const IklanListTable = () => {
const response = await listBanner();
const data = response?.data?.data?.content;
// console.log("banner", data);
console.log("banner", data);
setGetData(data);
close();

View File

@ -160,7 +160,7 @@ const AdvertisementsList = () => {
item.no = (page - 1) * Number(showData) + index + 1;
});
// console.log("contentData : ", data);
console.log("contentData : ", data);
setDataTable(contentData);
setTotalData(data?.totalElements);

View File

@ -100,7 +100,7 @@ const PopUpListTable = () => {
const response = await getListPopUp();
const data = response?.data?.data?.content;
// console.log("banner", data);
console.log("banner", data);
setGetData(data);
close();

View File

@ -178,7 +178,7 @@ const ContentListPopUp = () => {
item.no = (page - 1) * Number(showData) + index + 1;
});
// console.log("contentData : ", data);
console.log("contentData : ", data);
setData(contentData);
setTotalData(data?.totalElements);

View File

@ -64,7 +64,7 @@ export default function DetailSettingTracking(props: {
});
const onSubmit = (values: any) => {
// console.log("Submitted values:", values);
console.log("Submitted values:", values);
setIsOpen(false);
};
@ -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) ?? false}
checked={field.value.includes(item.id)}
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) ?? false}
checked={field.value.includes(num)}
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);
}}
/>

View File

@ -64,7 +64,7 @@ export default function UpdateSettingTracking(props: {
});
const onSubmit = (values: any) => {
// console.log("Submitted values:", values);
console.log("Submitted values:", values);
setIsOpen(false);
};
@ -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) ?? false}
checked={field.value.includes(item.id)}
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) ?? false}
checked={field.value.includes(num)}
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);
}}
/>

View File

@ -72,7 +72,7 @@ export default function CreateTagModal() {
categoryId: Number(data.category),
isActive: true,
};
// console.log("reqqq", request);
console.log("reqqq", request);
// const response = await postDataFeedback(request);
// close();
// if (response?.error) {
@ -93,7 +93,7 @@ export default function CreateTagModal() {
async function getCategoryParent() {
const response = await getCategoriesAll();
const res = response?.data?.data.content;
// console.log("res", res);
console.log("res", res);
var levelsArr: { id: number; label: string; value: string }[] = [];
res.forEach((levels: { id: number; name: string }) => {
levelsArr.push({

View File

@ -145,7 +145,7 @@ export default function EditTagModal(props: {
async function getCategoryParent() {
const response = await getCategoriesAll();
const res = response?.data?.data.content;
// console.log("res", res);
console.log("res", res);
var levelsArr: { id: number; label: string; value: string }[] = [];
res.forEach((levels: { id: number; name: string }) => {
levelsArr.push({

View File

@ -173,7 +173,7 @@ const SurveyListTable = () => {
item.no = (page - 1) * 10 + index + 1;
});
// console.log("contentData : ", data);
console.log("contentData : ", data);
setDataTable(contentData);
setTotalData(data?.totalElements);

View File

@ -178,7 +178,7 @@ const CalendarView = ({ categories }: CalendarViewProps) => {
},
}));
// console.log("Event Data : ", events);
console.log("Event Data : ", events);
setCalendarEvents(events);
}
} catch (err) {
@ -217,7 +217,7 @@ const CalendarView = ({ categories }: CalendarViewProps) => {
const filteredEvents = calendarEvents.filter((event) => {
if (!selectedCategory.length) return false;
// console.log("Event category : ", selectedCategory);
console.log("Event category : ", selectedCategory);
const eventCategories = event.extendedProps.calendar
?.split(",")

View File

@ -726,7 +726,7 @@ const EventModal = ({
endDate: date?.to ? format(date.to, "yyyy-MM-dd") : null,
};
// console.log("Submitted Data:", reqData);
console.log("Submitted Data:", reqData);
const response = await saveAgendaSettings(reqData);
if (response?.error) {
@ -794,6 +794,9 @@ const EventModal = ({
};
useEffect(() => {
console.log("Event data:", event);
console.log("Selected date:", selectedDate);
if (selectedDate) {
setDate({
from: selectedDate.date,
@ -826,7 +829,7 @@ const EventModal = ({
};
const toggleExpand = (poldaId: any) => {
// console.log("Toogle : ", expandedPolda);
console.log("Toogle : ", expandedPolda);
setExpandedPolda((prev: any) => ({
...prev,
[poldaId]: !prev[poldaId],
@ -887,11 +890,10 @@ const EventModal = ({
fileTypeId: string,
duration: string
) {
// console.log(idx, id, file, fileTypeId, duration);
console.log(idx, id, file, fileTypeId, duration);
const resCsrf = await getCsrfToken();
const csrfToken = resCsrf?.data?.token;
// console.log("CSRF TOKEN : ", csrfToken);
const headers = {
"X-XSRF-TOKEN": csrfToken,
};
@ -913,7 +915,7 @@ const EventModal = ({
xhr.withCredentials = true;
},
onError: async (e: any) => {
// console.log("Error upload :", e);
console.log("Error upload :", e);
error(e);
},
onChunkComplete: (
@ -1035,7 +1037,7 @@ const EventModal = ({
}).then(() => {
if (redirect === window.location.pathname) {
fetch(redirect, { method: "GET", cache: "reload" }).then(() => {
// console.log("Data diperbarui.");
console.log("Data diperbarui.");
});
} else {
window.location.href = redirect;
@ -1137,7 +1139,7 @@ const EventModal = ({
defaultMonth={date?.from}
selected={date}
onSelect={(newDate) => {
// console.log("Date selected:", newDate);
console.log("Date selected:", newDate);
setDate(newDate);
if (newDate?.from && newDate?.to) {
setIsDatePickerOpen(false);

View File

@ -22,14 +22,14 @@ const CalenderPage = () => {
let valueShowed: string[] = [];
if (userLevelNumber == 1) {
valueShowed = ["0", "1", "2", "3", "4", "5"];
} else if (userLevelNumber == 2 && userLevelId != 771) {
} else if (userLevelNumber == 2 && userLevelId != 761) {
valueShowed = ["2", "3"];
} else if (
(userLevelNumber == 2 && userLevelId == 771) ||
(userLevelNumber == 3 && userParentLevelId == 771)
(userLevelNumber == 2 && userLevelId == 761) ||
(userLevelNumber == 3 && userParentLevelId == 761)
) {
valueShowed = ["4"];
} else if (userLevelNumber == 3 && userParentLevelId != 771) {
} else if (userLevelNumber == 3 && userParentLevelId != 761) {
valueShowed = ["3"];
}
@ -39,7 +39,7 @@ const CalenderPage = () => {
...category,
activeClass: "",
}));
// console.log(formattedCategories);
console.log(formattedCategories);
setCategories(formattedCategories);
}
}, []);

View File

@ -127,7 +127,7 @@ const BlogTable = () => {
item.no = (page - 1) * Number(showData) + index + 1;
});
// console.log("contentData : ", contentData);
console.log("contentData : ", contentData);
setDataTable(contentData);
setTotalData(data?.totalElements);

View File

@ -105,13 +105,13 @@ const useTableColumns = () => {
if (isPublish && !isPublishOnPolda) {
displayText = "Mabes";
} else if (isPublish && isPublishOnPolda) {
if (Number(creatorGroupParentLevelId) == 771) {
if (Number(creatorGroupParentLevelId) == 761) {
displayText = "Mabes & Satker";
} else {
displayText = "Mabes & Polda";
}
} else if (!isPublish && isPublishOnPolda) {
if (Number(creatorGroupParentLevelId) == 771) {
if (Number(creatorGroupParentLevelId) == 761) {
displayText = "Satker";
} else {
displayText = "Polda";

View File

@ -107,13 +107,13 @@ const useTableColumns = () => {
if (isPublish && !isPublishOnPolda) {
displayText = "Mabes";
} else if (isPublish && isPublishOnPolda) {
if (Number(creatorGroupParentLevelId) == 771) {
if (Number(creatorGroupParentLevelId) == 761) {
displayText = "Mabes & Satker";
} else {
displayText = "Mabes & Polda";
}
} else if (!isPublish && isPublishOnPolda) {
if (Number(creatorGroupParentLevelId) == 771) {
if (Number(creatorGroupParentLevelId) == 761) {
displayText = "Satker";
} else {
displayText = "Polda";

View File

@ -133,7 +133,7 @@ const TableTeks = () => {
item.no = (page - 1) * limit + index + 1;
});
// console.log("contentData : ", contentData);
console.log("contentData : ", contentData);
setDataTable(contentData);
setTotalData(data?.totalElements);

View File

@ -144,7 +144,7 @@ const useTableColumns = () => {
const handleClick = (e: React.MouseEvent) => {
if (e.ctrlKey) {
// console.log("Ctrl + Click detected");
console.log("Ctrl + Click detected");
}
// Paksa buka menu meskipun ctrl ditekan
setOpen(true);

View File

@ -105,13 +105,13 @@ const useTableColumns = () => {
if (isPublish && !isPublishOnPolda) {
displayText = "Mabes";
} else if (isPublish && isPublishOnPolda) {
if (Number(creatorGroupParentLevelId) == 771) {
if (Number(creatorGroupParentLevelId) == 761) {
displayText = "Mabes & Satker";
} else {
displayText = "Mabes & Polda";
}
} else if (!isPublish && isPublishOnPolda) {
if (Number(creatorGroupParentLevelId) == 771) {
if (Number(creatorGroupParentLevelId) == 761) {
displayText = "Satker";
} else {
displayText = "Polda";

View File

@ -105,13 +105,13 @@ const useTableColumns = () => {
if (isPublish && !isPublishOnPolda) {
displayText = "Mabes";
} else if (isPublish && isPublishOnPolda) {
if (Number(creatorGroupParentLevelId) == 771) {
if (Number(creatorGroupParentLevelId) == 761) {
displayText = "Mabes & Satker";
} else {
displayText = "Mabes & Polda";
}
} else if (!isPublish && isPublishOnPolda) {
if (Number(creatorGroupParentLevelId) == 771) {
if (Number(creatorGroupParentLevelId) == 761) {
displayText = "Satker";
} else {
displayText = "Polda";

View File

@ -65,6 +65,7 @@ const useTableColumns = () => {
header: "Status",
cell: ({ row }) => {
const isActive = row.getValue<boolean>("isActive");
console.log("isActive value:", isActive); // TypeScript type is inferred correctly
return (
<div>
{isActive ? (

View File

@ -121,6 +121,9 @@ const MediahubTable = () => {
contentData.forEach((item: any, index: number) => {
item.no = (page - 1) * limit + index + 1;
});
console.log("contentData : ", contentData);
setDataTable(contentData);
setTotalData(data?.totalElements);
setTotalPage(data?.totalPages);

View File

@ -65,6 +65,7 @@ const useTableColumns = () => {
header: "Status",
cell: ({ row }) => {
const isActive = row.getValue<boolean>("isActive");
console.log("isActive value:", isActive); // TypeScript type is inferred correctly
return (
<div>
{isActive ? (

View File

@ -121,6 +121,9 @@ const MedsosTable = () => {
contentData.forEach((item: any, index: number) => {
item.no = (page - 1) * limit + index + 1;
});
console.log("contentData : ", contentData);
setDataTable(contentData);
setTotalData(data?.totalElements);
setTotalPage(data?.totalPages);

View File

@ -73,22 +73,7 @@ const useTableColumns = ({
{
accessorKey: "status",
header: t("status", { defaultValue: "Status" }),
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>
);
},
cell: ({ row }) => <span className="">{row.getValue("status")}</span>,
},
{
@ -146,9 +131,7 @@ 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`);
@ -170,7 +153,7 @@ const useTableColumns = ({
// try {
// loading();
// const response = await axios.get(
// `https://netidhub.com/api/media/report/download?id=${id}`,
// `https://new.netidhub.com/api/media/report/download?id=${id}`,
// {
// responseType: "blob",
// }

View File

@ -170,7 +170,7 @@ const ReportTable = () => {
};
const handlePreview = (id: string) => {
const url = `https://new.netidhub.com/api/v2/media/report/view?id=${id}`;
const url = `https://new.netidhub.com/api/media/report/view?id=${id}`;
setPreviewData({ url });
setOpenPreview(true);
};
@ -223,6 +223,9 @@ const ReportTable = () => {
contentData.forEach((item: any, index: number) => {
item.no = (page - 1) * Number(showData) + index + 1;
});
console.log("contentData : ", contentData);
setDataTable(contentData);
setTotalData(data?.totalElements);
setTotalPage(data?.totalPages);

View File

@ -130,6 +130,9 @@ const CalendarPolriTable = () => {
contentData.forEach((item: any, index: number) => {
item.no = (page - 1) * Number(showData) + index + 1;
});
console.log("contentData : ", contentData);
setDataTable(contentData);
setTotalData(data?.totalElements);
setTotalPage(data?.totalPages);

View File

@ -62,6 +62,7 @@ const useTableColumns = () => {
accessorKey: "time",
header: t("time", { defaultValue: "Time" }),
cell: ({ row }: { row: { original: any } }) => {
console.log("Row Original Data:", row.original);
const { startTime, endTime } = row.original;
return (
<span className="whitespace-nowrap">
@ -112,6 +113,7 @@ const useTableColumns = () => {
accessorKey: "speaker",
header: t("speaker", { defaultValue: "Speaker" }),
cell: ({ row }: { row: { original: any } }) => {
console.log("Row Original Data:", row.original);
const { speakerTitle, speakerName } = row.original;
return (
<span className="whitespace-nowrap">

View File

@ -114,6 +114,9 @@ const EventTable = () => {
contentData.forEach((item: any, index: number) => {
item.no = (page - 1) * Number(showData) + index + 1;
});
console.log("contentData : ", contentData);
setDataTable(contentData);
setTotalData(data?.totalElements);
setTotalPage(data?.totalPages);

View File

@ -66,7 +66,7 @@ const useTableColumns = (props: { selectedTypeSchedule: string }) => {
accessorKey: "time",
header: t("time", { defaultValue: "Time" }),
cell: ({ row }: { row: { original: any } }) => {
// console.log("Row Original Data:", row.original);
console.log("Row Original Data:", row.original);
const { startTime, endTime } = row.original;
return (
<span className="whitespace-nowrap">
@ -117,7 +117,7 @@ const useTableColumns = (props: { selectedTypeSchedule: string }) => {
accessorKey: "speaker",
header: t("speaker", { defaultValue: "Speaker" }),
cell: ({ row }: { row: { original: any } }) => {
// console.log("Row Original Data:", row.original);
console.log("Row Original Data:", row.original);
const { speakerTitle, speakerName } = row.original;
return (
<span className="whitespace-nowrap">

View File

@ -139,7 +139,7 @@ const LiveReportTable = () => {
item.no = (page - 1) * Number(showData) + index + 1;
});
// console.log("contentData : ", contentData);
console.log("contentData : ", contentData);
setDataTable(contentData);
setTotalData(data?.totalElements);

View File

@ -62,7 +62,7 @@ const useTableColumns = () => {
accessorKey: "time",
header: t("time", { defaultValue: "Time" }),
cell: ({ row }: { row: { original: any } }) => {
// console.log("Row Original Data:", row.original);
console.log("Row Original Data:", row.original);
const { startTime, endTime } = row.original;
return (
<span className="whitespace-nowrap">
@ -113,7 +113,7 @@ const useTableColumns = () => {
accessorKey: "speaker",
header: t("speaker", { defaultValue: "Speaker" }),
cell: ({ row }: { row: { original: any } }) => {
// console.log("Row Original Data:", row.original);
console.log("Row Original Data:", row.original);
const { speakerTitle, speakerName } = row.original;
return (
<span className="whitespace-nowrap">

View File

@ -129,7 +129,7 @@ const PressConferenceTable = () => {
item.no = (page - 1) * Number(showData) + index + 1;
});
// console.log("contentData : ", contentData);
console.log("contentData : ", contentData);
setDataTable(contentData);
setTotalData(data?.totalElements);

View File

@ -62,7 +62,7 @@ const useTableColumns = () => {
accessorKey: "time",
header: t("time", { defaultValue: "Time" }),
cell: ({ row }: { row: { original: any } }) => {
// console.log("Row Original Data:", row.original);
console.log("Row Original Data:", row.original);
const { startTime, endTime } = row.original;
return (
<span className="whitespace-nowrap">
@ -113,7 +113,7 @@ const useTableColumns = () => {
accessorKey: "speaker",
header: t("speaker", { defaultValue: "Speaker" }),
cell: ({ row }: { row: { original: any } }) => {
// console.log("Row Original Data:", row.original);
console.log("Row Original Data:", row.original);
const { speakerTitle, speakerName } = row.original;
return (
<span className="whitespace-nowrap">

View File

@ -130,7 +130,7 @@ const PressReleaseTable = () => {
item.no = (page - 1) * Number(showData) + index + 1;
});
// console.log("contentData : ", contentData);
console.log("contentData : ", contentData);
setDataTable(contentData);
setTotalData(data?.totalElements);

View File

@ -22,7 +22,9 @@ import withReactContent from "sweetalert2-react-content";
import Swal from "sweetalert2";
import { useTranslations } from "next-intl";
const useTableColumns = (activeTab: "ta" | "daily" | "special") => {
const useTableColumns = (
activeTab: "ta" | "daily" | "special" | "mabes-koor",
) => {
const t = useTranslations("Table");
const columns: ColumnDef<any>[] = [
{
@ -190,7 +192,11 @@ const useTableColumns = (activeTab: "ta" | "daily" | "special") => {
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent className="p-0" align="end">
{(roleId == 11 || roleId == 12 || roleId == 19) && (
{/* {(roleId == 11 || roleId == 12 || roleId == 19) && ( */}
{(roleId == 11 ||
roleId == 12 ||
roleId == 19 ||
roleId == 3) && (
<Link href={`/contributor/task-ta/detail/${row.original.id}`}>
<DropdownMenuItem className="p-2 border-b text-default-700 group focus:bg-default focus:text-primary-foreground rounded-none">
<Eye className="w-4 h-4 me-1.5" />
@ -198,14 +204,15 @@ const useTableColumns = (activeTab: "ta" | "daily" | "special") => {
</DropdownMenuItem>
</Link>
)}
{roleId == 11 && (
<Link href={`/contributor/task-ta/update/${row.original.id}`}>
<DropdownMenuItem className="p-2 border-b text-default-700 group focus:bg-default focus:text-primary-foreground rounded-none">
<SquarePen className="w-4 h-4 me-1.5" />
Edit
</DropdownMenuItem>
</Link>
)}
{roleId == 11 ||
(roleId == 3 && (
<Link href={`/contributor/task-ta/update/${row.original.id}`}>
<DropdownMenuItem className="p-2 border-b text-default-700 group focus:bg-default focus:text-primary-foreground rounded-none">
<SquarePen className="w-4 h-4 me-1.5" />
Edit
</DropdownMenuItem>
</Link>
))}
{(roleId == 12 || roleId == 19) && (
<Link
href={`/contributor/task-ta/upload-task/${row.original.id}`}
@ -216,15 +223,16 @@ const useTableColumns = (activeTab: "ta" | "daily" | "special") => {
</DropdownMenuItem>
</Link>
)}
{roleId == 11 && (
<DropdownMenuItem
onClick={() => TaskDelete(row.original.id)}
className="p-2 border-b text-destructive bg-destructive/30 focus:bg-destructive focus:text-destructive-foreground rounded-none"
>
<Trash2 className="w-4 h-4 me-1.5" />
Delete
</DropdownMenuItem>
)}
{roleId == 11 ||
(roleId == 3 && (
<DropdownMenuItem
onClick={() => TaskDelete(row.original.id)}
className="p-2 border-b text-destructive bg-destructive/30 focus:bg-destructive focus:text-destructive-foreground rounded-none"
>
<Trash2 className="w-4 h-4 me-1.5" />
Delete
</DropdownMenuItem>
))}
</DropdownMenuContent>
</DropdownMenu>
);

View File

@ -160,7 +160,7 @@ const TaskTable = () => {
item.no = (page - 1) * Number(showData) + index + 1;
});
// console.log("contentData : ", contentData);
console.log("contentData : ", contentData);
setDataTable(contentData);
setTotalData(data?.totalElements);

View File

@ -5,7 +5,11 @@ import { Button } from "@/components/ui/button";
import { UploadIcon } from "lucide-react";
import SiteBreadcrumb from "@/components/site-breadcrumb";
import { Link } from "@/components/navigation";
import { checkAuthorization, checkLoginSession } from "@/lib/utils";
import {
checkAuthorization,
checkLoginSession,
getCookiesDecrypt,
} from "@/lib/utils";
import React, { useEffect } from "react";
import { useTranslations } from "next-intl";
@ -13,12 +17,13 @@ const TaskPage = () => {
const t = useTranslations("AnalyticsDashboard");
useEffect(() => {
function initState() {
checkAuthorization("admin");
checkAuthorization("admin");
checkLoginSession();
}
initState();
}, []);
const levelNumber = getCookiesDecrypt("ulne");
return (
<div>
@ -29,16 +34,28 @@ const TaskPage = () => {
<CardTitle>
<div className="flex flex-col sm:flex-row lg:flex-row lg:items-center">
<div className="flex-1 text-xl font-medium text-default-900">
{t("tabel", { defaultValue: "Tabel" })} {t("task", { defaultValue: "Task" })}
{t("tabel", { defaultValue: "Tabel" })}{" "}
{t("task", { defaultValue: "Task" })}
</div>
<div className="flex-none">
{Number(levelNumber) !== 3 && (
<div className="flex-none">
<Link href="/contributor/task/create">
<Button color="primary" className="text-white">
<UploadIcon size={18} className="mr-2" />
{t("create-task", { defaultValue: "Create Task" })}
</Button>
</Link>
</div>
)}
{/* <div className="flex-none">
<Link href={"/contributor/task/create"}>
<Button color="primary" className="text-white">
<UploadIcon size={18} className="mr-2" />
{t("create-task", { defaultValue: "Create Task" })}
</Button>
</Link>
</div>
</div> */}
</div>
</CardTitle>
</CardHeader>

View File

@ -14,7 +14,7 @@ export default function UserFeedback() {
}, []);
async function initState() {
const response = await getUserFeedbacks();
// console.log("ssss", response?.data?.data);
console.log("ssss", response?.data?.data);
setListData(response?.data?.data);
}

View File

@ -115,7 +115,7 @@ const MediaTrackingTable = () => {
item.no = (page - 1) * limit + index + 1;
});
// console.log("contentData : ", data);
console.log("contentData : ", data);
setDataTable(contentData);
setTotalData(data?.totalElements);

View File

@ -113,12 +113,13 @@ const TaskPlanMediahubTable = (props: {
// try {
// const res = await ticketingPagination("", limit, page - 1);
// const data = res?.data?.data;
console.log("datgaa", data);
const contentData = data;
contentData.forEach((item: any, index: number) => {
item.no = (page - 1) * limit + index + 1;
});
// console.log("contentData : ", contentData);
console.log("contentData : ", contentData);
setDataTable(contentData);
// setTotalData(data?.totalElements);

View File

@ -153,6 +153,8 @@ export default function DetailDaily() {
if (res?.data?.data != undefined) {
const data = res?.data?.data;
console.log("data");
console.log("Data :", data);
form.setValue("title", data.title);
form.setValue("detail", data.description);
form.setValue("date", new Date(data.date));
@ -203,7 +205,7 @@ export default function DetailDaily() {
const editor = useRef(null);
const onSubmit = async (data: z.infer<typeof FormSchema>) => {
// console.log("data", data);
console.log("data", data);
if (form.getValues("detail") == "") {
form.setError("detail", {
type: "manual",
@ -232,7 +234,7 @@ export default function DetailDaily() {
.filter((key) => selected[key])
.join(", ");
};
// console.log("data", data, selected);
console.log("data", data, selected);
loading();
const reqData = {
@ -256,7 +258,7 @@ export default function DetailDaily() {
assignmentMainTypeId: 1,
};
// console.log("req =>", reqData);
console.log("req =>", reqData);
const response = await savePlanning(reqData);
if (response?.error) {

View File

@ -152,6 +152,8 @@ export default function EditDaily() {
if (res?.data?.data != undefined) {
const data = res?.data?.data;
console.log("data");
console.log("Data :", data);
form.setValue("title", data.title);
form.setValue("detail", data.description);
form.setValue("date", new Date(data.date));
@ -216,7 +218,7 @@ export default function EditDaily() {
const editor = useRef(null);
const onSubmit = async (data: z.infer<typeof FormSchema>) => {
// console.log("data", data);
console.log("data", data);
if (form.getValues("detail") == "") {
form.setError("detail", {
type: "manual",
@ -245,7 +247,7 @@ export default function EditDaily() {
.filter((key) => selected[key])
.join(", ");
};
// console.log("data", data, selected);
console.log("data", data, selected);
loading();
const reqData = {

View File

@ -166,7 +166,7 @@ export default function CreateDaily() {
const editor = useRef(null);
const onSubmit = async (data: z.infer<typeof FormSchema>) => {
// console.log("data", data);
console.log("data", data);
if (form.getValues("detail") == "") {
form.setError("detail", {
type: "manual",
@ -195,7 +195,7 @@ export default function CreateDaily() {
.filter((key) => selected[key])
.join(", ");
};
// console.log("data", data, selected);
console.log("data", data, selected);
loading();
const reqData = {
@ -219,7 +219,7 @@ export default function CreateDaily() {
assignmentMainTypeId: 1,
};
// console.log("req =>", reqData);
console.log("req =>", reqData);
const response = await savePlanning(reqData);
if (response?.error) {

View File

@ -76,9 +76,11 @@ export default function DetailMonthly() {
close();
if (res?.data?.data != undefined) {
const data = res?.data?.data;
console.log("Data :", data);
form.setValue("title", data?.title);
form.setValue("detail", data.description);
const date = parseDate(data.date);
console.log("date", date);
form.setValue(
"month",
new Date(date.getFullYear(), date.getMonth(), 1)
@ -125,7 +127,7 @@ export default function DetailMonthly() {
).getFullYear()}`,
status: "Open",
};
// console.log("req", reqData, data.month);
console.log("req", reqData, data.month);
const response = await savePlanning(reqData);
close();
if (response?.error) {
@ -152,7 +154,7 @@ export default function DetailMonthly() {
selectedDate.getMonth(),
1
);
// console.log("newDate", newDate, selectedDate);
console.log("newDate", newDate, selectedDate);
form.setValue("month", newDate);
};
return (

View File

@ -77,9 +77,11 @@ export default function EditMonthly() {
close();
if (res?.data?.data != undefined) {
const data = res?.data?.data;
console.log("Data :", data);
form.setValue("title", data?.title);
form.setValue("detail", data.description);
const date = parseDate(data.date);
console.log("date", date);
form.setValue(
"month",
new Date(date.getFullYear(), date.getMonth(), 1)
@ -127,7 +129,7 @@ export default function EditMonthly() {
date: `${month.toString().padStart(2, "0")}/${year}`,
status: "Open",
};
// console.log("req", reqData, data.month);
console.log("req", reqData, data.month);
const response = await savePlanning(reqData);
close();
if (response?.error) {
@ -154,7 +156,7 @@ export default function EditMonthly() {
selectedDate.getMonth(),
1
);
// console.log("newDate", newDate, selectedDate);
console.log("newDate", newDate, selectedDate);
form.setValue("month", newDate);
};
return (

View File

@ -97,7 +97,7 @@ export default function CreateMonthly() {
date: `${month.toString().padStart(2, "0")}/${year}`,
status: "Open",
};
// console.log("req", reqData, data.month);
console.log("req", reqData, data.month);
const response = await savePlanning(reqData);
close();
if (response?.error) {

View File

@ -119,7 +119,7 @@ export default function DetailWeekly() {
status: "Open",
parentId: parentId,
};
// console.log("req", reqData);
console.log("req", reqData);
const response = await savePlanning(reqData);
close();
if (response?.error) {
@ -147,7 +147,7 @@ export default function DetailWeekly() {
close();
if (res?.data?.data != undefined) {
const data = res?.data?.data;
// console.log("Data :", data);
console.log("Data :", data);
form.setValue("title", data?.title);
form.setValue("week", {
from: new Date(data?.startDate),

View File

@ -118,7 +118,7 @@ export default function EditWeekly() {
status: "Open",
parentId: parentId,
};
// console.log("req", reqData);
console.log("req", reqData);
const response = await savePlanning(reqData);
close();
if (response?.error) {
@ -146,7 +146,7 @@ export default function EditWeekly() {
close();
if (res?.data?.data != undefined) {
const data = res?.data?.data;
// console.log("Data :", data);
console.log("Data :", data);
form.setValue("title", data?.title);
form.setValue("week", {
from: new Date(data?.startDate),

View File

@ -117,7 +117,7 @@ export default function CreateMonthly() {
status: "Open",
parentId: Number(data.parentId),
};
// console.log("req", reqData);
console.log("req", reqData);
const response = await savePlanning(reqData);
close();
if (response?.error) {

View File

@ -48,7 +48,7 @@ export default function DetailTaskPlanMediahub() {
if (res?.data?.data != undefined) {
const data = res?.data?.data;
// console.log("Data :", data);
console.log("Data :", data);
setPlanningData(data);
setAssignedTopLevel(data?.assignedToTopLevel);
setArrayDestination(data?.assignedToLevel);
@ -112,7 +112,7 @@ export default function DetailTaskPlanMediahub() {
label: option.title,
value: option.id,
}));
// console.log("res", optionArr);
console.log("res", optionArr);
setWeeklyList(optionArr);
}

View File

@ -113,13 +113,13 @@ const TaskPlanMediahubTable = (props: {
// try {
// const res = await ticketingPagination("", limit, page - 1);
// const data = res?.data?.data;
// console.log("datgaa", data);
console.log("datgaa", data);
const contentData = data;
contentData.forEach((item: any, index: number) => {
item.no = (page - 1) * limit + index + 1;
});
// console.log("contentData : ", contentData);
console.log("contentData : ", contentData);
setDataTable(contentData);
// setTotalData(data?.totalElements);

View File

@ -153,6 +153,8 @@ export default function DetailDaily() {
if (res?.data?.data != undefined) {
const data = res?.data?.data;
console.log("data");
console.log("Data :", data);
form.setValue("title", data.title);
form.setValue("detail", data.description);
form.setValue("date", new Date(data.date));
@ -203,7 +205,7 @@ export default function DetailDaily() {
const editor = useRef(null);
const onSubmit = async (data: z.infer<typeof FormSchema>) => {
// console.log("data", data);
console.log("data", data);
if (form.getValues("detail") == "") {
form.setError("detail", {
type: "manual",
@ -232,7 +234,7 @@ export default function DetailDaily() {
.filter((key) => selected[key])
.join(", ");
};
// console.log("data", data, selected);
console.log("data", data, selected);
loading();
const reqData = {
@ -256,7 +258,7 @@ export default function DetailDaily() {
assignmentMainTypeId: 1,
};
// console.log("req =>", reqData);
console.log("req =>", reqData);
const response = await savePlanning(reqData);
if (response?.error) {

View File

@ -152,6 +152,8 @@ export default function EditDaily() {
if (res?.data?.data != undefined) {
const data = res?.data?.data;
console.log("data");
console.log("Data :", data);
form.setValue("title", data.title);
form.setValue("detail", data.description);
form.setValue("date", new Date(data.date));
@ -216,7 +218,7 @@ export default function EditDaily() {
const editor = useRef(null);
const onSubmit = async (data: z.infer<typeof FormSchema>) => {
// console.log("data", data);
console.log("data", data);
if (form.getValues("detail") == "") {
form.setError("detail", {
type: "manual",
@ -245,7 +247,7 @@ export default function EditDaily() {
.filter((key) => selected[key])
.join(", ");
};
// console.log("data", data, selected);
console.log("data", data, selected);
loading();
const reqData = {

View File

@ -239,7 +239,7 @@ export default function CreateDaily() {
assignmentMainTypeId: 2,
};
// console.log("req =>", reqData);
console.log("req =>", reqData);
const response = await savePlanning(reqData);
if (response?.error) {

View File

@ -76,11 +76,11 @@ export default function DetailMonthly() {
close();
if (res?.data?.data != undefined) {
const data = res?.data?.data;
// console.log("Data :", data);
console.log("Data :", data);
form.setValue("title", data?.title);
form.setValue("detail", data.description);
const date = parseDate(data.date);
// console.log("date", date);
console.log("date", date);
form.setValue(
"month",
new Date(date.getFullYear(), date.getMonth(), 1)
@ -127,7 +127,7 @@ export default function DetailMonthly() {
date: `${month.toString().padStart(2, "0")}/${year}`,
status: "Open",
};
// console.log("req", reqData, data.month);
console.log("req", reqData, data.month);
const response = await savePlanning(reqData);
close();
if (response?.error) {
@ -154,7 +154,7 @@ export default function DetailMonthly() {
selectedDate.getMonth(),
1
);
// console.log("newDate", newDate, selectedDate);
console.log("newDate", newDate, selectedDate);
form.setValue("month", newDate);
};
return (

View File

@ -76,11 +76,11 @@ export default function EditMonthly() {
close();
if (res?.data?.data != undefined) {
const data = res?.data?.data;
// console.log("Data :", data);
console.log("Data :", data);
form.setValue("title", data?.title);
form.setValue("detail", data.description);
const date = parseDate(data.date);
// console.log("date", date);
console.log("date", date);
form.setValue(
"month",
new Date(date.getFullYear(), date.getMonth(), 1)
@ -128,7 +128,7 @@ export default function EditMonthly() {
date: `${month.toString().padStart(2, "0")}/${year}`,
status: "Open",
};
// console.log("req", reqData, data.month);
console.log("req", reqData, data.month);
const response = await savePlanning(reqData);
close();
if (response?.error) {
@ -155,7 +155,7 @@ export default function EditMonthly() {
selectedDate.getMonth(),
1
);
// console.log("newDate", newDate, selectedDate);
console.log("newDate", newDate, selectedDate);
form.setValue("month", newDate);
};
return (

View File

@ -95,7 +95,7 @@ export default function CreateMonthly() {
date: `${month.toString().padStart(2, "0")}/${year}`,
status: "Open",
};
// console.log("req", reqData, data.month);
console.log("req", reqData, data.month);
const response = await savePlanning(reqData);
close();
if (response?.error) {

View File

@ -119,7 +119,7 @@ export default function DetailWeekly() {
status: "Open",
parentId: parentId,
};
// console.log("req", reqData);
console.log("req", reqData);
const response = await savePlanning(reqData);
close();
if (response?.error) {
@ -147,7 +147,7 @@ export default function DetailWeekly() {
close();
if (res?.data?.data != undefined) {
const data = res?.data?.data;
// console.log("Data :", data);
console.log("Data :", data);
form.setValue("title", data?.title);
form.setValue("week", {
from: new Date(data?.startDate),

View File

@ -117,7 +117,7 @@ export default function EditWeekly() {
status: "Open",
parentId: parentId,
};
// console.log("req", reqData);
console.log("req", reqData);
const response = await savePlanning(reqData);
close();
if (response?.error) {
@ -145,7 +145,7 @@ export default function EditWeekly() {
close();
if (res?.data?.data != undefined) {
const data = res?.data?.data;
// console.log("Data :", data);
console.log("Data :", data);
form.setValue("title", data?.title);
form.setValue("week", {
from: new Date(data?.startDate),

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