Skip to content

Commit 7ef5d1b

Browse files
committed
Virew progress bar fixes
1 parent 5a8b34c commit 7ef5d1b

File tree

3 files changed

+171
-29
lines changed

3 files changed

+171
-29
lines changed

src/main/webapp/static/com/atomgraph/linkeddatahub/xsl/bootstrap/2.3.2/client/block.xsl

Lines changed: 80 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -458,11 +458,11 @@ exclude-result-prefixes="#all"
458458
<xsl:sequence select="$context"/>
459459
</xsl:function>
460460

461-
<xsl:function name="ldh:update-progress" as="map(*)" ixsl:updating="yes">
461+
<xsl:function name="ldh:update-progress" as="item()*" ixsl:updating="yes">
462462
<xsl:param name="context" as="map(*)"/>
463463
<xsl:param name="percent" as="xs:double"/>
464464

465-
<xsl:message>ldh:update-progress <xsl:value-of select="$percent"/>%</xsl:message>
465+
<xsl:message>ldh:update-progress <xsl:value-of select="$percent"/>% at <xsl:value-of select="current-dateTime()"/></xsl:message>
466466

467467
<!-- Defensive check: ensure context exists and is a map before checking for keys -->
468468
<xsl:if test="exists($context) and $context instance of map(*) and map:contains($context, 'container')">
@@ -477,14 +477,91 @@ exclude-result-prefixes="#all"
477477

478478
<!-- Auto-hide when 100% complete -->
479479
<xsl:if test="$percent ge 100">
480+
<!-- Remove the parent row-fluid of the bar element -->
481+
<xsl:for-each select="$progress-container//div[contains-token(@class, 'bar')]/parent::div[contains-token(@class, 'row-fluid')]">
482+
<xsl:sequence select="ixsl:call(., 'remove', [])[current-date() lt xs:date('2000-01-01')]"/>
483+
</xsl:for-each>
484+
480485
<xsl:sequence select="ixsl:call(ixsl:get($progress-container, 'classList'), 'toggle', [ 'progress', false() ])[current-date() lt xs:date('2000-01-01')]"/>
481486
<xsl:sequence select="ixsl:call(ixsl:get($progress-container, 'classList'), 'toggle', [ 'progress-striped', false() ])[current-date() lt xs:date('2000-01-01')]"/>
482487
<xsl:sequence select="ixsl:call(ixsl:get($progress-container, 'classList'), 'toggle', [ 'active', false() ])[current-date() lt xs:date('2000-01-01')]"/>
483488
</xsl:if>
484489
</xsl:if>
485490
</xsl:if>
486491

487-
<xsl:sequence select="$context"/>
492+
<!-- Force async boundary to allow browser repaint -->
493+
<xsl:sequence select="
494+
ixsl:sleep(0) =>
495+
ixsl:then(function($ignored) { $context })
496+
"/>
497+
</xsl:function>
498+
499+
<!-- Progress tracking with dynamic counters -->
500+
501+
<xsl:function name="ldh:update-progress-counter" as="empty-sequence()" ixsl:updating="yes">
502+
<xsl:param name="cache" as="item()"/>
503+
<xsl:param name="context" as="map(*)"/>
504+
<xsl:param name="action" as="xs:string"/>
505+
<xsl:param name="value" as="xs:integer?"/>
506+
507+
<xsl:choose>
508+
<!-- Initialize with total step count -->
509+
<xsl:when test="$action = 'init'">
510+
<xsl:variable name="total-steps" select="if (exists($value)) then $value else 4" as="xs:integer"/>
511+
<xsl:variable name="step-size" select="100 div $total-steps" as="xs:double"/>
512+
513+
<ixsl:set-property name="current-progress" select="0" object="$cache"/>
514+
<ixsl:set-property name="step-size" select="$step-size" object="$cache"/>
515+
<ixsl:set-property name="completed-steps" select="0" object="$cache"/>
516+
<ixsl:set-property name="total-steps" select="$total-steps" object="$cache"/>
517+
<ixsl:set-property name="start-time" select="ixsl:call(ixsl:window(), 'Date.now', [])" object="$cache"/>
518+
519+
<xsl:message>[0ms] Progress INIT: total-steps=<xsl:value-of select="$total-steps"/> step-size=<xsl:value-of select="format-number($step-size, '0.0')"/>%</xsl:message>
520+
521+
<!-- Display 0% -->
522+
<xsl:sequence select="ldh:display-progress($cache, $context, 0)"/>
523+
</xsl:when>
524+
525+
<!-- Increment progress by one step -->
526+
<xsl:when test="$action = 'complete'">
527+
<xsl:variable name="step-size" select="ixsl:get($cache, 'step-size')" as="xs:double"/>
528+
<xsl:variable name="completed-steps" select="xs:integer(ixsl:get($cache, 'completed-steps')) + 1" as="xs:integer"/>
529+
<xsl:variable name="total-steps" select="xs:integer(ixsl:get($cache, 'total-steps'))" as="xs:integer"/>
530+
<xsl:variable name="progress" select="min((($completed-steps * $step-size), 100))" as="xs:double"/>
531+
<xsl:variable name="elapsed" select="ixsl:call(ixsl:window(), 'Date.now', []) - ixsl:get($cache, 'start-time')" as="xs:double"/>
532+
533+
<ixsl:set-property name="completed-steps" select="$completed-steps" object="$cache"/>
534+
<ixsl:set-property name="current-progress" select="$progress" object="$cache"/>
535+
536+
<xsl:message>[<xsl:value-of select="format-number($elapsed, '0')"/>ms] Progress STEP <xsl:value-of select="$completed-steps"/>/<xsl:value-of select="$total-steps"/>: <xsl:value-of select="format-number($progress, '0.0')"/>%</xsl:message>
537+
538+
<xsl:sequence select="ldh:display-progress($cache, $context, $progress)"/>
539+
</xsl:when>
540+
</xsl:choose>
541+
</xsl:function>
542+
543+
<!-- Helper: Update visual progress bar -->
544+
<xsl:function name="ldh:display-progress" as="empty-sequence()" ixsl:updating="yes">
545+
<xsl:param name="cache" as="item()"/>
546+
<xsl:param name="context" as="map(*)"/>
547+
<xsl:param name="percent" as="xs:double"/>
548+
549+
<xsl:if test="map:contains($context, 'container')">
550+
<xsl:variable name="container" select="$context('container')" as="element()"/>
551+
552+
<xsl:for-each select="$container/ancestor::div[contains-token(@class, 'progress')][contains-token(@class, 'active')][1]">
553+
<ixsl:set-style name="width" select="$percent || '%'" object=".//div[contains-token(@class, 'bar')]"/>
554+
555+
<!-- auto-hide when 100% -->
556+
<xsl:if test="$percent ge 100">
557+
<ixsl:set-style name="z-index" select="'-1'" object="./div[contains-token(@class, 'row-block-controls')]"/>
558+
559+
<xsl:sequence select="ixsl:call(ixsl:get(., 'classList'), 'toggle', [ 'progress', false() ])[current-date() lt xs:date('2000-01-01')]"/>
560+
<xsl:sequence select="ixsl:call(ixsl:get(., 'classList'), 'toggle', [ 'progress-striped', false() ])[current-date() lt xs:date('2000-01-01')]"/>
561+
<xsl:sequence select="ixsl:call(ixsl:get(., 'classList'), 'toggle', [ 'active', false() ])[current-date() lt xs:date('2000-01-01')]"/>
562+
</xsl:if>
563+
</xsl:for-each>
564+
</xsl:if>
488565
</xsl:function>
489566

490567
<!-- block delete -->

src/main/webapp/static/com/atomgraph/linkeddatahub/xsl/bootstrap/2.3.2/client/block/view.xsl

Lines changed: 52 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,10 @@ exclude-result-prefixes="#all"
7474
<ixsl:set-property name="{'`' || $block/@about || '`'}" select="ldh:new-object()" object="ixsl:get(ixsl:window(), 'LinkedDataHub.contents')"/>
7575
</xsl:if>
7676

77+
<!-- Initialize progress counters -->
78+
<xsl:variable name="cache" select="ixsl:get(ixsl:get(ixsl:window(), 'LinkedDataHub.contents'), '`' || $block/@about || '`')"/>
79+
<xsl:sequence select="ldh:update-progress-counter($cache, map{'container': $container}, 'init', ())"/>
80+
7781
<xsl:variable name="request-uri" select="ldh:href(ac:document-uri($query-uri), map{})" as="xs:anyURI"/>
7882
<xsl:variable name="request" select="map{ 'method': 'GET', 'href': $request-uri, 'headers': map{ 'Accept': 'application/rdf+xml' } }" as="map(*)"/>
7983
<!-- $about in the query gets set to the @about of the *parent* block -->
@@ -89,7 +93,10 @@ exclude-result-prefixes="#all"
8993
'query-uri': $query-uri,
9094
'cache': ixsl:get(ixsl:get(ixsl:window(), 'LinkedDataHub.contents'), '`' || $block/@about || '`')
9195
}"/>
92-
96+
97+
<!-- Track HTTP request start -->
98+
<xsl:sequence select="ldh:update-progress-counter($cache, map{'container': $container}, 'start', ())"/>
99+
93100
<xsl:sequence select="
94101
ldh:load-block#3(
95102
$context,
@@ -120,8 +127,7 @@ exclude-result-prefixes="#all"
120127
ixsl:http-request($context('request')) =>
121128
ixsl:then(ldh:rethread-response($context, ?)) =>
122129
ixsl:then(ldh:handle-response#1) =>
123-
ixsl:then(ldh:view-query-response#1) =>
124-
ixsl:then(ldh:update-progress(?, 33))
130+
ixsl:then(ldh:view-query-response#1)
125131
"/>
126132
</xsl:function>
127133

@@ -130,21 +136,18 @@ exclude-result-prefixes="#all"
130136

131137
<xsl:message>ldh:view-results-thunk</xsl:message>
132138

139+
<!-- Track HTTP request start -->
140+
<xsl:sequence select="ldh:update-progress-counter($context('cache'), $context, 'start', ())"/>
141+
133142
<xsl:sequence select="
134143
ixsl:http-request($context('request')) =>
135144
ixsl:then(ldh:rethread-response($context, ?)) =>
136145
ixsl:then(ldh:handle-response#1) =>
137-
ixsl:then(ldh:update-progress(?, 40)) =>
138146
ixsl:then(ldh:load-object-metadata#1) =>
139-
ixsl:then(ldh:update-progress(?, 50)) =>
140147
ixsl:then(ldh:http-request-threaded#1) =>
141148
ixsl:then(ldh:handle-response#1) =>
142-
ixsl:then(ldh:update-progress(?, 70)) =>
143149
ixsl:then(ldh:set-object-metadata#1) =>
144-
ixsl:then(ldh:update-progress(?, 80)) =>
145-
ixsl:then(ldh:render-view#1) =>
146-
ixsl:then(ldh:update-progress(?, 90)) =>
147-
ixsl:then(ldh:update-progress(?, 100))
150+
ixsl:then(ldh:render-view#1)
148151
"/>
149152
</xsl:function>
150153

@@ -164,8 +167,12 @@ exclude-result-prefixes="#all"
164167
<xsl:choose>
165168
<xsl:when test="$endpoint = sd:endpoint()">
166169
<xsl:variable name="object-uris" select="distinct-values($results/rdf:RDF/rdf:Description/*/@rdf:resource[not(key('resources', .))])" as="xs:string*"/>
167-
<xsl:variable name="query-string" select="$object-metadata-query || ' VALUES $this { ' || string-join(for $uri in $object-uris return '&lt;' || $uri || '&gt;', ' ') || ' }'" as="xs:string"/>
170+
<xsl:variable name="query-string" select="$object-metadata-query || ' VALUES $this { ' || string-join(for $uri in $object-uris return '&lt;' || $uri || '&gt;', ' ') || ' }'" as="xs:string"/>
168171
<xsl:variable name="request" select="map{ 'method': 'POST', 'href': ldh:href($endpoint), 'media-type': 'application/sparql-query', 'body': $query-string, 'headers': map{ 'Accept': 'application/rdf+xml' } }" as="map(*)"/>
172+
173+
<!-- Track HTTP request start -->
174+
<xsl:sequence select="ldh:update-progress-counter($context('cache'), $context, 'start', ())"/>
175+
169176
<xsl:sequence select="map:merge(($context, map{ 'request': $request , 'response': () , 'results': $results }), map{ 'duplicates': 'use-last' })"/>
170177
</xsl:when>
171178
<xsl:otherwise>
@@ -187,7 +194,7 @@ exclude-result-prefixes="#all"
187194

188195
<ixsl:set-style name="cursor" select="'default'" object="ixsl:page()//body"/>
189196

190-
<xsl:sequence select="ldh:hide-block-progress-bar($context, ())[current-date() lt xs:date('2000-01-01')]"/>
197+
<!-- <xsl:sequence select="ldh:hide-block-progress-bar($context, ())[current-date() lt xs:date('2000-01-01')]"/>-->
191198
<xsl:sequence select="
192199
error(
193200
QName('&ldh;', 'ldh:HTTPError'),
@@ -207,6 +214,9 @@ exclude-result-prefixes="#all"
207214

208215
<xsl:message>ldh:set-object-metadata</xsl:message>
209216

217+
<!-- Mark metadata response as complete -->
218+
<xsl:sequence select="ldh:update-progress-counter($context('cache'), $context, 'complete', ())"/>
219+
210220
<xsl:for-each select="$response">
211221
<xsl:choose>
212222
<xsl:when test="?status = 200 and ?media-type = 'application/rdf+xml'">
@@ -343,6 +353,7 @@ exclude-result-prefixes="#all"
343353
<xsl:param name="endpoint" as="xs:anyURI"/>
344354
<xsl:param name="select-xml" as="document-node()"/>
345355
<xsl:param name="focus-var-name" as="xs:string"/>
356+
<xsl:param name="cache" as="item()"/>
346357
<xsl:variable name="select-xml" as="document-node()">
347358
<xsl:document>
348359
<!-- unset ORDER BY/LIMIT/OFFSET - we want to COUNT all of the container's children; ordering is irrelevant -->
@@ -377,8 +388,13 @@ exclude-result-prefixes="#all"
377388
map {
378389
'request': $request,
379390
'container': .,
380-
'count-var-name': $count-var-name
391+
'count-var-name': $count-var-name,
392+
'cache': $cache
381393
}"/>
394+
395+
<!-- Track HTTP request start -->
396+
<xsl:sequence select="ldh:update-progress-counter($cache, $context, 'start', ())"/>
397+
382398
<ixsl:promise select="ixsl:http-request($context('request')) =>
383399
ixsl:then(ldh:rethread-response($context, ?)) =>
384400
ixsl:then(ldh:handle-response#1) =>
@@ -829,6 +845,7 @@ exclude-result-prefixes="#all"
829845
<xsl:with-param name="focus-var-name" select="$focus-var-name"/>
830846
<xsl:with-param name="endpoint" select="$endpoint"/>
831847
<xsl:with-param name="select-xml" select="$select-xml"/>
848+
<xsl:with-param name="cache" select="$cache"/>
832849
</xsl:call-template>
833850
</xsl:for-each>
834851

@@ -845,8 +862,10 @@ exclude-result-prefixes="#all"
845862
'container': id($order-by-container-id, ixsl:page()),
846863
'id': $id,
847864
'predicate': $predicate,
848-
'order-by-predicate': $order-by-predicate
865+
'order-by-predicate': $order-by-predicate,
866+
'cache': $cache
849867
}"/>
868+
850869
<ixsl:promise select="ixsl:http-request($context('request')) =>
851870
ixsl:then(ldh:rethread-response($context, ?)) =>
852871
ixsl:then(ldh:handle-response#1) =>
@@ -1750,6 +1769,9 @@ exclude-result-prefixes="#all"
17501769
<xsl:with-param name="cache" select="$cache"/>
17511770
</xsl:call-template>
17521771
</xsl:variable>
1772+
<!-- Mark query response as complete -->
1773+
<xsl:sequence select="ldh:update-progress-counter($cache, $context, 'complete', ())"/>
1774+
17531775
<xsl:sequence select="map:merge((map{ 'block': $block }, $view-context))"/>
17541776
</xsl:when>
17551777
<xsl:otherwise>
@@ -1779,7 +1801,7 @@ exclude-result-prefixes="#all"
17791801
</xsl:result-document>
17801802
</xsl:for-each>
17811803

1782-
<xsl:sequence select="ldh:hide-block-progress-bar($context, ())[current-date() lt xs:date('2000-01-01')]"/>
1804+
<!-- <xsl:sequence select="ldh:hide-block-progress-bar($context, ())[current-date() lt xs:date('2000-01-01')]"/>-->
17831805
<xsl:sequence select="
17841806
error(
17851807
QName('&ldh;', 'ldh:HTTPError'),
@@ -1814,6 +1836,7 @@ exclude-result-prefixes="#all"
18141836
<xsl:for-each select="$results">
18151837
<!-- use the BGPs where the predicate is a URI value and the subject and object are variables -->
18161838
<xsl:variable name="bgp-triples-map" select="$select-xml//json:map[json:string[@key = 'type'] = 'bgp']/json:array[@key = 'triples']/json:map[json:string[@key = 'subject'] = '?' || $initial-var-name][not(starts-with(json:string[@key = 'predicate'], '?'))][starts-with(json:string[@key = 'object'], '?')]" as="element()*"/>
1839+
18171840
<xsl:variable name="order-by-var-name" select="$select-xml/json:map/json:array[@key = 'order']/json:map[1]/json:string[@key = 'expression']/substring-after(., '?')" as="xs:string?"/>
18181841
<xsl:variable name="order-by-predicate" select="$bgp-triples-map[json:string[@key = 'object'] = '?' || $order-by-var-name][1]/json:string[@key = 'predicate']" as="xs:anyURI?"/>
18191842
<xsl:variable name="desc" select="$select-xml/json:map/json:array[@key = 'order']/json:map[1]/json:boolean[@key = 'descending']" as="xs:boolean?"/>
@@ -1879,6 +1902,9 @@ exclude-result-prefixes="#all"
18791902
<!-- loading is done - restore the default mouse cursor -->
18801903
<ixsl:set-style name="cursor" select="'default'" object="ixsl:page()//body"/>
18811904

1905+
<!-- Mark main view query as complete -->
1906+
<xsl:sequence select="ldh:update-progress-counter($cache, $context, 'complete', ())"/>
1907+
18821908
<xsl:sequence select="$context"/>
18831909
</xsl:function>
18841910

@@ -1892,7 +1918,7 @@ exclude-result-prefixes="#all"
18921918
<xsl:variable name="object-var-name" select="$context('object-var-name')" as="xs:string"/>
18931919

18941920
<xsl:message>ldh:facet-filter-response</xsl:message>
1895-
1921+
18961922
<xsl:for-each select="$response">
18971923
<xsl:if test="?status = 200 and ?media-type = 'application/rdf+xml' and ?body">
18981924
<xsl:variable name="body" select="?body" as="document-node()"/>
@@ -1908,7 +1934,7 @@ exclude-result-prefixes="#all"
19081934
</xsl:if>
19091935
<!-- ignore error response -->
19101936
</xsl:for-each>
1911-
1937+
19121938
<xsl:sequence select="$context"/>
19131939
</xsl:function>
19141940

@@ -1920,7 +1946,7 @@ exclude-result-prefixes="#all"
19201946
<xsl:variable name="results" select="$context('results')" as="document-node()"/>
19211947

19221948
<xsl:message>ldh:parallax-response</xsl:message>
1923-
1949+
19241950
<xsl:for-each select="$response">
19251951
<xsl:choose>
19261952
<xsl:when test="?status = 200 and ?media-type = 'application/sparql-results+xml'">
@@ -1976,7 +2002,7 @@ exclude-result-prefixes="#all"
19762002
<xsl:variable name="predicate" select="$context('predicate')" as="xs:anyURI"/>
19772003

19782004
<xsl:message>ldh:parallax-property-response</xsl:message>
1979-
2005+
19802006
<xsl:for-each select="$response">
19812007
<xsl:variable name="results" select="if (?status = 200 and ?media-type = 'application/rdf+xml') then ?body else ()" as="document-node()?"/>
19822008
<xsl:variable name="existing-items" select="$container/li" as="element()*"/>
@@ -2036,7 +2062,7 @@ exclude-result-prefixes="#all"
20362062
<xsl:variable name="label-sample-var-name" select="$context('label-sample-var-name')" as="xs:string"/>
20372063

20382064
<xsl:message>ldh:facet-value-response</xsl:message>
2039-
2065+
20402066
<xsl:for-each select="$response">
20412067
<xsl:variable name="response" select="." as="map(*)"/>
20422068
<xsl:choose>
@@ -2182,6 +2208,9 @@ exclude-result-prefixes="#all"
21822208

21832209
<xsl:message>ldh:result-count-response</xsl:message>
21842210

2211+
<!-- Mark result count response as complete -->
2212+
<xsl:sequence select="ldh:update-progress-counter($context('cache'), $context, 'complete', ())"/>
2213+
21852214
<xsl:for-each select="$response">
21862215
<xsl:choose>
21872216
<xsl:when test="?status = 200 and ?media-type = 'application/sparql-results+xml'">
@@ -2205,7 +2234,7 @@ exclude-result-prefixes="#all"
22052234
</xsl:otherwise>
22062235
</xsl:choose>
22072236
</xsl:for-each>
2208-
2237+
22092238
<xsl:sequence select="$context"/>
22102239
</xsl:function>
22112240

@@ -2220,7 +2249,7 @@ exclude-result-prefixes="#all"
22202249
<xsl:variable name="order-by-predicate" select="$context('order-by-predicate')" as="xs:anyURI?"/>
22212250

22222251
<xsl:message>ldh:order-by-response</xsl:message>
2223-
2252+
22242253
<xsl:for-each select="$response">
22252254
<xsl:if test="?status = 200 and ?media-type = 'application/rdf+xml' and ?body">
22262255
<xsl:variable name="body" select="?body" as="document-node()"/>
@@ -2234,7 +2263,7 @@ exclude-result-prefixes="#all"
22342263
</xsl:if>
22352264
<!-- ignore error response -->
22362265
</xsl:for-each>
2237-
2266+
22382267
<xsl:sequence select="$context"/>
22392268
</xsl:function>
22402269

0 commit comments

Comments
 (0)