Skip to content

Commit 566e4ea

Browse files
authored
Add skeleton loader (jenkinsci#690)
1 parent dbb7b1f commit 566e4ea

File tree

6 files changed

+83
-25
lines changed

6 files changed

+83
-25
lines changed

src/main/frontend/common/tree-api.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@ import startPollingPipelineStatus from "../pipeline-graph-view/pipeline-graph/ma
44
import { getRunStatusFromPath, RunStatus } from "./RestClient.tsx";
55
import { mergeStageInfos } from "./utils/stage-merge.ts";
66

7-
const onPipelineComplete = () => undefined;
8-
97
const onPollingError = (err: Error) =>
108
console.log("There was an error when polling the pipeline status", err);
119

@@ -18,6 +16,7 @@ export default function useRunPoller({
1816
previousRunPath,
1917
}: RunPollerProps) {
2018
const [run, setRun] = useState<RunStatus>();
19+
const [loading, setLoading] = useState(true);
2120

2221
useEffect(() => {
2322
let onPipelineDataReceived: (data: RunStatus) => void;
@@ -48,13 +47,14 @@ export default function useRunPoller({
4847
startPollingPipelineStatus(
4948
onPipelineDataReceived,
5049
onPollingError,
51-
onPipelineComplete,
50+
() => setLoading(false),
5251
currentRunPath,
5352
);
5453
}, []);
5554

5655
return {
5756
run,
57+
loading,
5858
};
5959
}
6060

src/main/frontend/pipeline-console-view/pipeline-console/main/PipelineConsole.tsx

Lines changed: 40 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import React from "react";
66

77
import Dropdown from "../../../common/components/dropdown.tsx";
88
import DropdownPortal from "../../../common/components/dropdown-portal.tsx";
9+
import Skeleton from "./components/skeleton.tsx";
910
import Stages from "./components/stages.tsx";
1011
import StagesCustomization from "./components/stages-customization.tsx";
1112
import DataTreeView from "./DataTreeView.tsx";
@@ -31,6 +32,7 @@ export default function PipelineConsole() {
3132
handleStageSelect,
3233
onStepToggle,
3334
onMoreConsoleClick,
35+
loading,
3436
} = useStepsPoller({ currentRunPath, previousRunPath });
3537

3638
return (
@@ -59,14 +61,17 @@ export default function PipelineConsole() {
5961
storageKey="graph"
6062
>
6163
{(mainViewVisibility === "both" ||
62-
mainViewVisibility === "graphOnly") && (
63-
<Stages
64-
stages={stages}
65-
selectedStage={openStage || undefined}
66-
stageViewPosition={stageViewPosition}
67-
onStageSelect={handleStageSelect}
68-
/>
69-
)}
64+
mainViewVisibility === "graphOnly") &&
65+
(loading ? (
66+
<Skeleton />
67+
) : (
68+
<Stages
69+
stages={stages}
70+
selectedStage={openStage || undefined}
71+
stageViewPosition={stageViewPosition}
72+
onStageSelect={handleStageSelect}
73+
/>
74+
))}
7075

7176
<SplitView storageKey="stages">
7277
{(mainViewVisibility === "both" ||
@@ -76,23 +81,37 @@ export default function PipelineConsole() {
7681
id="tree-view-pane"
7782
className="pgv-sticky-sidebar"
7883
>
79-
<DataTreeView
80-
onNodeSelect={(_, nodeId) => handleStageSelect(nodeId)}
81-
selected={openStage?.id}
82-
stages={stages}
83-
/>
84+
{loading ? (
85+
<div className={"pgv-skeleton-column"}>
86+
<Skeleton height={2.625} />
87+
<Skeleton height={20} />
88+
</div>
89+
) : (
90+
<DataTreeView
91+
onNodeSelect={(_, nodeId) => handleStageSelect(nodeId)}
92+
selected={openStage?.id}
93+
stages={stages}
94+
/>
95+
)}
8496
</div>
8597
)}
8698

8799
<div key="stage-view" id="stage-view-pane">
88-
<StageView
89-
stage={openStage}
90-
steps={openStageSteps}
91-
stepBuffers={openStageStepBuffers}
92-
expandedSteps={expandedSteps}
93-
onStepToggle={onStepToggle}
94-
onMoreConsoleClick={onMoreConsoleClick}
95-
/>
100+
{loading ? (
101+
<div className={"pgv-skeleton-column"}>
102+
<Skeleton height={2.625} />
103+
<Skeleton height={20} />
104+
</div>
105+
) : (
106+
<StageView
107+
stage={openStage}
108+
steps={openStageSteps}
109+
stepBuffers={openStageStepBuffers}
110+
expandedSteps={expandedSteps}
111+
onStepToggle={onStepToggle}
112+
onMoreConsoleClick={onMoreConsoleClick}
113+
/>
114+
)}
96115
</div>
97116
</SplitView>
98117
</SplitView>
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
.pgv-skeleton {
2+
background: var(--button-background);
3+
border: 1.5px solid
4+
color-mix(in srgb, var(--text-color-secondary) 3%, transparent);
5+
border-radius: var(--form-input-border-radius);
6+
height: 100%;
7+
animation: pulse-skeleton 2s both ease-in-out infinite;
8+
}
9+
10+
@keyframes pulse-skeleton {
11+
50% {
12+
background: var(--button-background--active);
13+
}
14+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import "./skeleton.scss";
2+
3+
import React from "react";
4+
5+
export default function Skeleton({ height }: { height?: number }) {
6+
return (
7+
<div
8+
className={"pgv-skeleton"}
9+
style={
10+
height
11+
? {
12+
height: `${height}rem`,
13+
}
14+
: {}
15+
}
16+
/>
17+
);
18+
}

src/main/frontend/pipeline-console-view/pipeline-console/main/hooks/use-steps-poller.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import {
1313
} from "../PipelineConsoleModel.tsx";
1414

1515
export function useStepsPoller(props: RunPollerProps) {
16-
const { run } = useRunPoller({
16+
const { run, loading } = useRunPoller({
1717
currentRunPath: props.currentRunPath,
1818
previousRunPath: props.previousRunPath,
1919
});
@@ -258,6 +258,7 @@ export function useStepsPoller(props: RunPollerProps) {
258258
handleStageSelect,
259259
onStepToggle,
260260
onMoreConsoleClick,
261+
loading,
261262
};
262263
}
263264

src/main/frontend/pipeline-console-view/pipeline-console/main/pipeline-console.scss

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,3 +67,9 @@
6767
position: sticky;
6868
top: calc(var(--header-height) + var(--section-padding));
6969
}
70+
71+
.pgv-skeleton-column {
72+
display: flex;
73+
flex-direction: column;
74+
gap: 0.75rem;
75+
}

0 commit comments

Comments
 (0)