fix:pagination media traking-tracking berita, setting banner, media tracking result
This commit is contained in:
parent
48d24e76b6
commit
f8829985f6
|
|
@ -49,11 +49,11 @@ const columns: ColumnDef<any>[] = [
|
||||||
header: "Jumlah Amplifikasi",
|
header: "Jumlah Amplifikasi",
|
||||||
cell: ({ row }) => <span>{row.getValue("link")}</span>,
|
cell: ({ row }) => <span>{row.getValue("link")}</span>,
|
||||||
},
|
},
|
||||||
{
|
// {
|
||||||
accessorKey: "status",
|
// accessorKey: "status",
|
||||||
header: "Status",
|
// header: "Status",
|
||||||
cell: ({ row }) => <span>{row.getValue("status")}</span>,
|
// cell: ({ row }) => <span>{row.getValue("status")}</span>,
|
||||||
},
|
// },
|
||||||
{
|
{
|
||||||
accessorKey: "date",
|
accessorKey: "date",
|
||||||
header: "Tanggal Penarikan",
|
header: "Tanggal Penarikan",
|
||||||
|
|
@ -77,10 +77,17 @@ const columns: ColumnDef<any>[] = [
|
||||||
</Button>
|
</Button>
|
||||||
</DropdownMenuTrigger>
|
</DropdownMenuTrigger>
|
||||||
<DropdownMenuContent className="p-0" align="end">
|
<DropdownMenuContent className="p-0" align="end">
|
||||||
<Link href={`/contributor/content/audio/detail/${row.original.id}`}>
|
<Link
|
||||||
|
href={`/contributor/content/${
|
||||||
|
row.original.mediaUpload.fileType.secondaryName &&
|
||||||
|
row.original.mediaUpload.fileType.secondaryName.toLowerCase()
|
||||||
|
}/detail/${row.original.mediaUpload.id}`}
|
||||||
|
>
|
||||||
<DropdownMenuItem className="p-2 border-b text-default-700 group focus:bg-default focus:text-primary-foreground rounded-none">
|
<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" />
|
<Eye className="w-4 h-4 me-1.5" />
|
||||||
View
|
View{" "}
|
||||||
|
{row.original.mediaUpload.fileType.secondaryName &&
|
||||||
|
row.original.mediaUpload.fileType.secondaryName.toLowerCase()}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
</Link>
|
</Link>
|
||||||
</DropdownMenuContent>
|
</DropdownMenuContent>
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ import {
|
||||||
listDataTracking,
|
listDataTracking,
|
||||||
mediaTrackingSave,
|
mediaTrackingSave,
|
||||||
} from "@/service/media-tracking/media-tracking";
|
} from "@/service/media-tracking/media-tracking";
|
||||||
import { error, loading } from "@/lib/swal";
|
import { error } from "@/lib/swal";
|
||||||
import { toast } from "sonner";
|
import { toast } from "sonner";
|
||||||
import {
|
import {
|
||||||
DropdownMenu,
|
DropdownMenu,
|
||||||
|
|
@ -20,31 +20,32 @@ import {
|
||||||
} from "@/components/ui/dropdown-menu";
|
} from "@/components/ui/dropdown-menu";
|
||||||
import { PaginationState } from "@tanstack/react-table";
|
import { PaginationState } from "@tanstack/react-table";
|
||||||
import page from "../page";
|
import page from "../page";
|
||||||
|
import CustomPagination from "@/components/table/custom-pagination";
|
||||||
|
import { close, loading } from "@/config/swal";
|
||||||
|
|
||||||
export default function TrackingBeritaCard() {
|
export default function TrackingBeritaCard() {
|
||||||
const [search, setSearch] = useState("");
|
const [search, setSearch] = useState("");
|
||||||
const [content, setContent] = useState<any[]>([]);
|
const [content, setContent] = useState<any[]>([]);
|
||||||
const [selectedItems, setSelectedItems] = useState<number[]>([]);
|
const [selectedItems, setSelectedItems] = useState<number[]>([]);
|
||||||
const [currentPage, setCurrentPage] = useState(1);
|
const [page, setPage] = useState(1);
|
||||||
const [page, setPage] = React.useState(1);
|
const [totalPage, setTotalPage] = useState(1);
|
||||||
const [showData, setShowData] = React.useState("10");
|
const [showData, setShowData] = useState("6");
|
||||||
const [pagination, setPagination] = React.useState<PaginationState>({
|
|
||||||
pageIndex: 0,
|
|
||||||
pageSize: Number(showData),
|
|
||||||
});
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
initFecth();
|
initFecth();
|
||||||
}, [showData]);
|
}, [showData, page]);
|
||||||
|
|
||||||
const initFecth = async () => {
|
const initFecth = async () => {
|
||||||
|
loading();
|
||||||
const response = await listDataTracking(showData, page - 1);
|
const response = await listDataTracking(showData, page - 1);
|
||||||
const data = response?.data?.data;
|
const data = response?.data?.data;
|
||||||
const newData = data?.content;
|
const newData = data?.content;
|
||||||
|
setTotalPage(data?.totalPages || 1);
|
||||||
newData.forEach((item: any, index: number) => {
|
newData.forEach((item: any, index: number) => {
|
||||||
item.no = (page - 1) * Number(showData) + index + 1;
|
item.no = (page - 1) * Number(showData) + index + 1;
|
||||||
});
|
});
|
||||||
setContent(response?.data?.data?.content || []);
|
setContent(response?.data?.data?.content || []);
|
||||||
|
close();
|
||||||
};
|
};
|
||||||
|
|
||||||
const fecthAll = async (keyword: string) => {
|
const fecthAll = async (keyword: string) => {
|
||||||
|
|
@ -117,17 +118,17 @@ export default function TrackingBeritaCard() {
|
||||||
value={showData}
|
value={showData}
|
||||||
onValueChange={setShowData}
|
onValueChange={setShowData}
|
||||||
>
|
>
|
||||||
<DropdownMenuRadioItem value="10">
|
<DropdownMenuRadioItem value="12">
|
||||||
1 - 10 Data
|
1 - 6 Data
|
||||||
</DropdownMenuRadioItem>
|
</DropdownMenuRadioItem>
|
||||||
<DropdownMenuRadioItem value="50">
|
<DropdownMenuRadioItem value="12">
|
||||||
1 - 50 Data
|
1 - 12 Data
|
||||||
</DropdownMenuRadioItem>
|
</DropdownMenuRadioItem>
|
||||||
<DropdownMenuRadioItem value="100">
|
<DropdownMenuRadioItem value="60">
|
||||||
1 - 100 Data
|
1 - 60 Data
|
||||||
</DropdownMenuRadioItem>
|
</DropdownMenuRadioItem>
|
||||||
<DropdownMenuRadioItem value="250">
|
<DropdownMenuRadioItem value="120">
|
||||||
1 - 250 Data
|
1 - 120 Data
|
||||||
</DropdownMenuRadioItem>
|
</DropdownMenuRadioItem>
|
||||||
</DropdownMenuRadioGroup>
|
</DropdownMenuRadioGroup>
|
||||||
</DropdownMenuContent>
|
</DropdownMenuContent>
|
||||||
|
|
@ -150,48 +151,40 @@ export default function TrackingBeritaCard() {
|
||||||
)}
|
)}
|
||||||
|
|
||||||
<div className="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-4">
|
<div className="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-4">
|
||||||
{content.map((item: any) => (
|
{content?.length > 1 &&
|
||||||
<Card
|
content.map((item: any) => (
|
||||||
key={item.id}
|
<Card
|
||||||
className="relative overflow-hidden shadow-sm border rounded-lg cursor-pointer"
|
key={item.id}
|
||||||
onClick={() => handleSelect(item.id)}
|
className="relative overflow-hidden shadow-sm border rounded-lg cursor-pointer"
|
||||||
>
|
onClick={() => handleSelect(item.id)}
|
||||||
<img
|
>
|
||||||
src={item.thumbnailLink}
|
<img
|
||||||
alt={item.title}
|
src={item.thumbnailLink}
|
||||||
className="w-full h-[300px] object-cover"
|
alt={item.title}
|
||||||
/>
|
className="w-full h-[300px] object-cover"
|
||||||
<div className="absolute top-2 left-2">
|
/>
|
||||||
<div className="w-5 h-5 border-2 border-white bg-white rounded-sm flex items-center justify-center">
|
<div className="absolute top-2 left-2">
|
||||||
{selectedItems.includes(item.id) && (
|
<div className="w-5 h-5 border-2 border-white bg-white rounded-sm flex items-center justify-center">
|
||||||
<div className="w-3 h-3 bg-blue-600 rounded-sm" />
|
{selectedItems.includes(item.id) && (
|
||||||
)}
|
<div className="w-3 h-3 bg-blue-600 rounded-sm" />
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<p className="p-2 text-sm font-medium text-gray-800 truncate">
|
||||||
<p className="p-2 text-sm font-medium text-gray-800 truncate">
|
{item.title}
|
||||||
{item.title}
|
</p>
|
||||||
</p>
|
</Card>
|
||||||
</Card>
|
))}
|
||||||
))}
|
|
||||||
</div>
|
</div>
|
||||||
|
<div className="mt-3">
|
||||||
<div className="flex justify-center items-center gap-2 mt-4">
|
{content && content?.length > 0 ? (
|
||||||
<Button
|
<CustomPagination
|
||||||
size="icon"
|
totalPage={totalPage}
|
||||||
variant="ghost"
|
onPageChange={(data) => setPage(data)}
|
||||||
disabled={currentPage === 1}
|
/>
|
||||||
onClick={() => setCurrentPage((p) => p - 1)}
|
) : (
|
||||||
>
|
<p>No Data</p>
|
||||||
<ChevronLeft className="w-4 h-4" />
|
)}
|
||||||
</Button>
|
|
||||||
<div className="px-3 py-1 rounded-full border">{currentPage}</div>
|
|
||||||
<Button
|
|
||||||
size="icon"
|
|
||||||
variant="ghost"
|
|
||||||
onClick={() => setCurrentPage((p) => p + 1)}
|
|
||||||
>
|
|
||||||
<ChevronRight className="w-4 h-4" />
|
|
||||||
</Button>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</Card>
|
</Card>
|
||||||
|
|
|
||||||
|
|
@ -69,6 +69,7 @@ import { data } from "jquery";
|
||||||
import { useToast } from "@/components/ui/use-toast";
|
import { useToast } from "@/components/ui/use-toast";
|
||||||
import { setBanner } from "@/service/settings/settings";
|
import { setBanner } from "@/service/settings/settings";
|
||||||
import { id } from "date-fns/locale";
|
import { id } from "date-fns/locale";
|
||||||
|
import CustomPagination from "@/components/table/custom-pagination";
|
||||||
|
|
||||||
const ContentListBanner = () => {
|
const ContentListBanner = () => {
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
|
@ -120,10 +121,10 @@ const ContentListBanner = () => {
|
||||||
|
|
||||||
React.useEffect(() => {
|
React.useEffect(() => {
|
||||||
fetchData();
|
fetchData();
|
||||||
setPagination({
|
// setPagination({
|
||||||
pageIndex: 0,
|
// pageIndex: 0,
|
||||||
pageSize: Number(showData),
|
// pageSize: Number(showData),
|
||||||
});
|
// });
|
||||||
}, [page, showData]);
|
}, [page, showData]);
|
||||||
|
|
||||||
async function fetchData() {
|
async function fetchData() {
|
||||||
|
|
@ -398,10 +399,15 @@ const ContentListBanner = () => {
|
||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
<div className="flex justify-center mt-6">
|
<div className="mt-3">
|
||||||
<div className="border rounded px-3 py-1 text-sm text-gray-600">
|
{data && data?.length > 0 ? (
|
||||||
1
|
<CustomPagination
|
||||||
</div>
|
totalPage={totalPage}
|
||||||
|
onPageChange={(data) => setPage(data)}
|
||||||
|
/>
|
||||||
|
) : (
|
||||||
|
<p>No Data</p>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,143 @@
|
||||||
|
"use client";
|
||||||
|
import {
|
||||||
|
Pagination,
|
||||||
|
PaginationContent,
|
||||||
|
PaginationEllipsis,
|
||||||
|
PaginationItem,
|
||||||
|
PaginationLink,
|
||||||
|
PaginationNext,
|
||||||
|
PaginationPrevious,
|
||||||
|
} from "@/components/ui/pagination";
|
||||||
|
|
||||||
|
import { useEffect, useState } from "react";
|
||||||
|
|
||||||
|
export default function CustomPagination(props: {
|
||||||
|
totalPage: number;
|
||||||
|
onPageChange: (data: number) => void;
|
||||||
|
}) {
|
||||||
|
const { totalPage, onPageChange } = props;
|
||||||
|
const [page, setPage] = useState(1);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
onPageChange(page);
|
||||||
|
}, [page]);
|
||||||
|
|
||||||
|
const renderPageNumbers = () => {
|
||||||
|
const pageNumbers = [];
|
||||||
|
const halfWindow = Math.floor(5 / 2);
|
||||||
|
let startPage = Math.max(2, page - halfWindow);
|
||||||
|
let endPage = Math.min(totalPage - 1, page + halfWindow);
|
||||||
|
|
||||||
|
if (endPage - startPage + 1 < 5) {
|
||||||
|
if (page <= halfWindow) {
|
||||||
|
endPage = Math.min(
|
||||||
|
totalPage,
|
||||||
|
endPage + (5 - (endPage - startPage + 1))
|
||||||
|
);
|
||||||
|
} else if (page + halfWindow >= totalPage) {
|
||||||
|
startPage = Math.max(1, startPage - (5 - (endPage - startPage + 1)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (startPage === endPage) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let i = startPage; i <= endPage; i++) {
|
||||||
|
pageNumbers.push(
|
||||||
|
<PaginationItem key={i} onClick={() => setPage(i)}>
|
||||||
|
<PaginationLink isActive={page === i}>{i}</PaginationLink>
|
||||||
|
</PaginationItem>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return pageNumbers;
|
||||||
|
};
|
||||||
|
return (
|
||||||
|
<Pagination>
|
||||||
|
<PaginationContent>
|
||||||
|
{page - 10 >= 1 && (
|
||||||
|
<PaginationItem>
|
||||||
|
<PaginationLink
|
||||||
|
onClick={() => (page > 10 ? setPage(page - 10) : setPage(1))}
|
||||||
|
>
|
||||||
|
{/* <DoubleArrowLeftIcon /> */}
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
fill="currentColor"
|
||||||
|
d="M18.41 7.41L17 6l-6 6l6 6l1.41-1.41L13.83 12zm-6 0L11 6l-6 6l6 6l1.41-1.41L7.83 12z"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</PaginationLink>
|
||||||
|
</PaginationItem>
|
||||||
|
)}
|
||||||
|
|
||||||
|
<PaginationItem className="hidden md:block">
|
||||||
|
<PaginationPrevious
|
||||||
|
onClick={() => (page > 1 ? setPage(page - 1) : "")}
|
||||||
|
/>
|
||||||
|
</PaginationItem>
|
||||||
|
<PaginationItem>
|
||||||
|
<PaginationLink onClick={() => setPage(1)} isActive={page === 1}>
|
||||||
|
{1}
|
||||||
|
</PaginationLink>
|
||||||
|
</PaginationItem>
|
||||||
|
{page > 4 && (
|
||||||
|
<PaginationItem>
|
||||||
|
<PaginationEllipsis onClick={() => setPage(page - 1)} />
|
||||||
|
</PaginationItem>
|
||||||
|
)}
|
||||||
|
{renderPageNumbers()}
|
||||||
|
{page < totalPage - 3 && (
|
||||||
|
<PaginationItem>
|
||||||
|
<PaginationEllipsis onClick={() => setPage(page + 1)} />
|
||||||
|
</PaginationItem>
|
||||||
|
)}
|
||||||
|
{totalPage > 1 && (
|
||||||
|
<PaginationItem>
|
||||||
|
<PaginationLink
|
||||||
|
onClick={() => setPage(totalPage)}
|
||||||
|
isActive={page === totalPage}
|
||||||
|
>
|
||||||
|
{totalPage}
|
||||||
|
</PaginationLink>
|
||||||
|
</PaginationItem>
|
||||||
|
)}
|
||||||
|
|
||||||
|
<PaginationItem className="hidden md:block">
|
||||||
|
<PaginationNext
|
||||||
|
onClick={() => (page < totalPage ? setPage(page + 1) : "")}
|
||||||
|
/>
|
||||||
|
</PaginationItem>
|
||||||
|
|
||||||
|
{page + 10 <= totalPage && totalPage > 9 && (
|
||||||
|
<PaginationItem>
|
||||||
|
<PaginationLink
|
||||||
|
onClick={() =>
|
||||||
|
page < totalPage - 10 ? setPage(page + 10) : setPage(totalPage)
|
||||||
|
}
|
||||||
|
>
|
||||||
|
{/* <DoubleArrowRightIcon /> */}
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
fill="currentColor"
|
||||||
|
d="M5.59 7.41L7 6l6 6l-6 6l-1.41-1.41L10.17 12zm6 0L13 6l6 6l-6 6l-1.41-1.41L16.17 12z"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</PaginationLink>
|
||||||
|
</PaginationItem>
|
||||||
|
)}
|
||||||
|
</PaginationContent>
|
||||||
|
</Pagination>
|
||||||
|
);
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue