mirror of
https://git.v0l.io/Kieran/void.cat.git
synced 2025-09-26 18:26:48 +02:00
Add page selector
This commit is contained in:
@@ -8,16 +8,19 @@ import "./FileList.css";
|
|||||||
import {AdminApi} from "../Api";
|
import {AdminApi} from "../Api";
|
||||||
import {logout} from "../LoginState";
|
import {logout} from "../LoginState";
|
||||||
import {PagedSortBy, PageSortOrder} from "../Const";
|
import {PagedSortBy, PageSortOrder} from "../Const";
|
||||||
|
import {PageSelector} from "../PageSelector";
|
||||||
|
|
||||||
export function FileList(props) {
|
export function FileList(props) {
|
||||||
const auth = useSelector((state) => state.login.jwt);
|
const auth = useSelector((state) => state.login.jwt);
|
||||||
const dispatch = useDispatch();
|
const dispatch = useDispatch();
|
||||||
const [files, setFiles] = useState([]);
|
const [files, setFiles] = useState();
|
||||||
|
const [page, setPage] = useState(0);
|
||||||
|
const pageSize = 10;
|
||||||
|
|
||||||
async function loadFileList() {
|
async function loadFileList() {
|
||||||
let pageReq = {
|
let pageReq = {
|
||||||
page: 0,
|
page: page,
|
||||||
pageSize: 20,
|
pageSize,
|
||||||
sortBy: PagedSortBy.Date,
|
sortBy: PagedSortBy.Date,
|
||||||
sortOrder: PageSortOrder.Dsc
|
sortOrder: PageSortOrder.Dsc
|
||||||
};
|
};
|
||||||
@@ -34,9 +37,10 @@ export function FileList(props) {
|
|||||||
if (window.confirm(`Are you sure you want to delete: ${id}?`)) {
|
if (window.confirm(`Are you sure you want to delete: ${id}?`)) {
|
||||||
let req = await AdminApi.deleteFile(auth, id);
|
let req = await AdminApi.deleteFile(auth, id);
|
||||||
if (req.ok) {
|
if (req.ok) {
|
||||||
setFiles([
|
setFiles({
|
||||||
...files.filter(a => a.id !== id)
|
...files,
|
||||||
]);
|
results: files.results.filter(a => a.id !== id)
|
||||||
|
});
|
||||||
} else {
|
} else {
|
||||||
alert("Failed to delete file!");
|
alert("Failed to delete file!");
|
||||||
}
|
}
|
||||||
@@ -64,7 +68,7 @@ export function FileList(props) {
|
|||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
loadFileList()
|
loadFileList()
|
||||||
}, []);
|
}, [page]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<table className="file-list">
|
<table className="file-list">
|
||||||
@@ -79,7 +83,13 @@ export function FileList(props) {
|
|||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{files?.map(a => renderItem(a))}
|
{files ? files.results.map(a => renderItem(a)) : null}
|
||||||
|
</tbody>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td colSpan={999}>{files ?
|
||||||
|
<PageSelector onSelectPage={(x) => setPage(x)} page={page} total={files.totalResults} pageSize={pageSize}/> : null}</td>
|
||||||
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
);
|
);
|
||||||
|
27
VoidCat/spa/src/PageSelector.css
Normal file
27
VoidCat/spa/src/PageSelector.css
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
.page-buttons {
|
||||||
|
display: grid;
|
||||||
|
grid-auto-flow: column;
|
||||||
|
width: min-content;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page-buttons > div {
|
||||||
|
padding: 5px 8px;
|
||||||
|
border: 1px solid;
|
||||||
|
user-select: none;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page-buttons > div:first-child {
|
||||||
|
border-top-left-radius: 3px;
|
||||||
|
border-bottom-left-radius: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page-buttons > div:last-child {
|
||||||
|
border-top-right-radius: 3px;
|
||||||
|
border-bottom-right-radius: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page-buttons > small {
|
||||||
|
line-height: 32px;
|
||||||
|
margin-left: 10px;
|
||||||
|
}
|
31
VoidCat/spa/src/PageSelector.js
Normal file
31
VoidCat/spa/src/PageSelector.js
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
import "./PageSelector.css";
|
||||||
|
|
||||||
|
export function PageSelector(props) {
|
||||||
|
const total = props.total;
|
||||||
|
const pageSize = props.pageSize;
|
||||||
|
const page = props.page;
|
||||||
|
const onSelectPage = props.onSelectPage;
|
||||||
|
const options = {
|
||||||
|
showPages: 2,
|
||||||
|
...(props.options || {})
|
||||||
|
};
|
||||||
|
|
||||||
|
let totalPages = Math.floor(total / pageSize);
|
||||||
|
let first = Math.max(0, page - options.showPages);
|
||||||
|
let firstDiff = page - first;
|
||||||
|
let last = Math.min(totalPages, page + options.showPages + options.showPages - firstDiff);
|
||||||
|
|
||||||
|
let buttons = [];
|
||||||
|
for (let x = first; x <= last; x++) {
|
||||||
|
buttons.push(<div onClick={(e) => onSelectPage(x)} key={x}>{x+1}</div>);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="page-buttons">
|
||||||
|
<div onClick={() => onSelectPage(0)}><<</div>
|
||||||
|
{buttons}
|
||||||
|
<div onClick={() => onSelectPage(totalPages)}>>></div>
|
||||||
|
<small>Total: {total}</small>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
Reference in New Issue
Block a user