Skip to content

Commit 397050b

Browse files
Daniel SheffieldDaniel Sheffield
Daniel Sheffield
authored and
Daniel Sheffield
committed
sqlpage#435: WIP - show spinner indicating page is loading
1 parent 33b3d85 commit 397050b

File tree

7 files changed

+98
-1
lines changed

7 files changed

+98
-1
lines changed

examples/show-progress/README.md

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# SQLPage display progress
2+
3+
This is a very simple example of a page that shows a spinner to indicate page is loading.

examples/show-progress/index.sql

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
SELECT 'spinner-start' AS component;
2+
SELECT 'spinner-progress' AS component,
3+
'0' AS percent,
4+
'Sleeping 3 seconds' AS stage;
5+
SELECT sqlpage.exec('sleep', '3');
6+
7+
SELECT 'spinner-progress' AS component,
8+
'30' AS percent,
9+
'Sleeping 5 seconds' AS stage;
10+
SELECT sqlpage.exec('sleep', '5');
11+
12+
/* stage property is optional */
13+
SELECT 'spinner-progress' AS component,
14+
'80' AS percent;
15+
SELECT sqlpage.exec('sleep', '1');
16+
17+
SELECT 'spinner-stop' AS component;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
allow_exec: True
2+
compress_responses: False
3+
database_url: "sqlite://:memory:"

sqlpage/sqlpage.css

+64-1
Original file line numberDiff line numberDiff line change
@@ -50,4 +50,67 @@ td > p {
5050
.datagrid {
5151
--tblr-datagrid-padding: 1.25rem;
5252
--tblr-datagrid-item-width: 12rem;
53-
}
53+
}
54+
55+
/* spinner container */
56+
div.sqlpage-spinner-start {
57+
/* TODO: center this */
58+
position: absolute;
59+
left: 50vw;
60+
top: 50vh;
61+
margin-top: -5.5em;
62+
margin-left: -87.5px;
63+
padding-bottom: 2em;
64+
height: 9em;
65+
width: 175px;
66+
}
67+
div.sqlpage-spinner-start:not(:has(+ .sqlpage-spinner-stop)) {
68+
/* only display if not followed by sqlpage-spinner-stop */
69+
display: block;
70+
}
71+
.sqlpage-spinner-start:not(:last-child) {
72+
/* firefox doesn't support :has
73+
so hide the spinner if is no longer the last element */
74+
display: none;
75+
}
76+
77+
/* default indeterminate loader */
78+
.sqlpage-loader {
79+
width: 48px;
80+
height: 48px;
81+
border: 5px solid var(--tblr-body-color);
82+
border-bottom-color: transparent;
83+
border-radius: 50%;
84+
display: inline-block;
85+
box-sizing: border-box;
86+
animation: sqlpage-loader-rotation 1s linear infinite;
87+
}
88+
89+
@keyframes sqlpage-loader-rotation {
90+
0% {
91+
transform: rotate(0deg);
92+
}
93+
100% {
94+
transform: rotate(360deg);
95+
}
96+
}
97+
98+
/* progress indicator container */
99+
div.sqlpage-spinner-progress {
100+
margin: 1em 0 1em;
101+
}
102+
div.sqlpage-spinner-progress:not(:has(+ .sqlpage-spinner-progress)) {
103+
/* only display if not followed by progress update */
104+
display: block;
105+
}
106+
.sqlpage-spinner-progress:not(:last-child) {
107+
/* firefox doesn't support :has
108+
so hide the spinner if is no longer the last element */
109+
display: none;
110+
}
111+
.sqlpage-spinner-progress label {
112+
text-align:left;
113+
}
114+
.sqlpage-spinner-progress label:after {
115+
content: "...";
116+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<div class="sqlpage-spinner-progress">
2+
<progress id="sqlpage-loading-{{default stage "progress"}}" value="{{percent}}" max="100"></progress>
3+
{{#if stage}}
4+
<br/>
5+
<label for="sqlpage-loading-{{stage}}">{{stage}}</label>
6+
{{/if}}
7+
</div>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
<div {{#if id}}id="{{id}}"{{/if}} class="sqlpage-spinner-start">
2+
<span class="{{default spinner "sqlpage-loader"}}"></span>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
</div>
2+
<div class="sqlpage-spinner-stop" />

0 commit comments

Comments
 (0)