Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit e5b9d0b

Browse files
committed
feat: add Pagination to UI
Signed-off-by: Nick Mitchell <[email protected]>
1 parent 4052b39 commit e5b9d0b

File tree

4 files changed

+104
-9
lines changed

4 files changed

+104
-9
lines changed

pdl-live-react/src/view/masonry/Masonry.tsx

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,21 @@ import MasonryTile from "./MasonryTile"
33
import "./Masonry.css"
44

55
type Props = import("react").PropsWithChildren<{
6+
page: number
7+
perPage: number
68
run: import("./MasonryCombo").Runner
79
sml: import("./Toolbar").SML
810
model: import("./Tile").default[]
911
}>
1012

11-
export default function Masonry({ run, sml, model, children }: Props) {
13+
export default function Masonry({
14+
run,
15+
sml,
16+
model,
17+
children,
18+
page,
19+
perPage,
20+
}: Props) {
1221
return (
1322
<div className="pdl-masonry-view" data-padding={sml}>
1423
{(!children ? [] : Array.isArray(children) ? children : [children])
@@ -23,11 +32,11 @@ export default function Masonry({ run, sml, model, children }: Props) {
2332
{child}
2433
</div>
2534
))}
26-
{model.map((props, idx) => (
35+
{model.slice((page - 1) * perPage, page * perPage).map((props, idx) => (
2736
<MasonryTile
2837
key={props.id + "." + idx}
2938
{...props}
30-
idx={idx + 1}
39+
idx={(page - 1) * perPage + idx + 1}
3140
sml={sml}
3241
run={run}
3342
/>

pdl-live-react/src/view/masonry/MasonryCombo.tsx

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ import RunningIcon from "@patternfly/react-icons/dist/esm/icons/running-icon"
3939

4040
import "./Masonry.css"
4141

42+
/** Initial number of masonry tiles to show per page */
43+
const initialPerPage = 20
44+
4245
export type Runner = (
4346
block?: import("../../helpers").NonScalarPdlBlock,
4447
async?: boolean,
@@ -76,6 +79,9 @@ export default function MasonryCombo({ value, setValue }: Props) {
7679
const [sml, setSML] = useState<SML>(getSMLUserSetting())
7780
useEffect(() => setSMLUserSetting(sml), [sml])
7881

82+
const [page, setPage] = useState(1)
83+
const [perPage, setPerPage] = useState(initialPerPage)
84+
7985
const [modalIsDone, setModalIsDone] = useState(-1)
8086
const [modalContent, setModalContent] = useState<null | {
8187
header: string
@@ -102,10 +108,11 @@ export default function MasonryCombo({ value, setValue }: Props) {
102108
},
103109
[setModalIsDone, modalContent],
104110
)
105-
useEffect(
106-
() => setModalIsDone(modalContent === null ? -1 : -2),
107-
[modalContent],
108-
)
111+
useEffect(() => {
112+
setModalIsDone(modalContent === null ? -1 : -2)
113+
setPage(1)
114+
setPerPage(initialPerPage)
115+
}, [modalContent])
109116

110117
// special form of setModalContent for running a PDL program
111118
const run = useCallback<Runner>(
@@ -206,6 +213,11 @@ export default function MasonryCombo({ value, setValue }: Props) {
206213
run={run}
207214
isRunning={modalIsDone === -2}
208215
block={block}
216+
itemCount={masonry.length < initialPerPage ? -1 : masonry.length}
217+
page={page}
218+
perPage={perPage}
219+
setPage={setPage}
220+
setPerPage={setPerPage}
209221
/>
210222
</PageSection>
211223
<PageSection
@@ -214,7 +226,13 @@ export default function MasonryCombo({ value, setValue }: Props) {
214226
className="pdl-masonry-page-section"
215227
aria-label="PDL Viewer main section"
216228
>
217-
<Masonry model={masonry} sml={sml} run={run}>
229+
<Masonry
230+
model={masonry}
231+
sml={sml}
232+
run={run}
233+
page={page}
234+
perPage={perPage}
235+
>
218236
<MasonryTileWrapper sml={sml} variant="plain">
219237
<Timeline model={base} numbering={numbering} />
220238
</MasonryTileWrapper>

pdl-live-react/src/view/masonry/Toolbar.tsx

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Toolbar, ToolbarGroup, ToolbarContent } from "@patternfly/react-core"
22

33
import DarkModeToggle from "../../page/DarkModeToggle"
4+
import ToolbarPaginator from "./ToolbarPaginator"
45
import ToolbarSMLToggle from "./ToolbarSMLToggle"
56
import ToolbarReplayButton from "./ToolbarReplayButton"
67
import ToolbarShowSourceButton from "./ToolbarShowSourceButton"
@@ -11,7 +12,7 @@ const alignEnd = { default: "alignEnd" as const }
1112

1213
export type SML = "s" | "m" | "l" | "xl"
1314

14-
export type Props = {
15+
export type Props = import("./ToolbarPaginator").Props & {
1516
run: import("./MasonryCombo").Runner
1617
isRunning: boolean
1718
block: import("../../pdl_ast").PdlBlock
@@ -26,6 +27,12 @@ export default function MasonryToolbar({
2627
isRunning,
2728
sml,
2829
setSML,
30+
31+
itemCount,
32+
page,
33+
perPage,
34+
setPage,
35+
setPerPage,
2936
}: Props) {
3037
return (
3138
<Toolbar className="pdl-masonry-toolbar">
@@ -34,6 +41,14 @@ export default function MasonryToolbar({
3441
<ToolbarReplayButton run={run} isRunning={isRunning} />
3542
</ToolbarGroup>
3643
<ToolbarGroup align={alignEnd} variant="action-group">
44+
<ToolbarPaginator
45+
itemCount={itemCount}
46+
perPage={perPage}
47+
page={page}
48+
setPage={setPage}
49+
setPerPage={setPerPage}
50+
/>
51+
3752
{isNonScalarPdlBlock(block) && (
3853
<ToolbarShowSourceButton root={block.pdl__id ?? ""} />
3954
)}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import { Pagination, type PaginationProps } from "@patternfly/react-core"
2+
3+
export type Props = Pick<
4+
Required<PaginationProps>,
5+
"itemCount" | "perPage" | "page"
6+
> & {
7+
setPage(n: number): void
8+
setPerPage(n: number): void
9+
}
10+
11+
export default function ToolbarPaginator({
12+
itemCount,
13+
perPage,
14+
page,
15+
setPage,
16+
setPerPage,
17+
}: Props) {
18+
const onPerPageSelect = (
19+
_event:
20+
| import("react").MouseEvent
21+
| import("react").KeyboardEvent
22+
| MouseEvent,
23+
newPerPage: number,
24+
newPage: number,
25+
) => {
26+
setPerPage(newPerPage)
27+
setPage(newPage)
28+
}
29+
30+
const onSetPage = (
31+
_event:
32+
| import("react").MouseEvent
33+
| import("react").KeyboardEvent
34+
| MouseEvent,
35+
newPage: number,
36+
) => {
37+
setPage(newPage)
38+
}
39+
40+
return (
41+
itemCount > 1 && (
42+
<Pagination
43+
itemCount={itemCount}
44+
perPage={perPage}
45+
page={page}
46+
onSetPage={onSetPage}
47+
widgetId="masonry-paginator"
48+
onPerPageSelect={onPerPageSelect}
49+
ouiaId="PaginationTop"
50+
/>
51+
)
52+
)
53+
}

0 commit comments

Comments
 (0)