Skip to content

Commit 0e8c737

Browse files
committed
feat: add a progress bar on the search page
1 parent 5293565 commit 0e8c737

File tree

2 files changed

+61
-9
lines changed

2 files changed

+61
-9
lines changed

src/Resources/themes/default/doctum.js.twig

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -171,11 +171,19 @@ var Doctum = {
171171
}
172172
Doctum.doctumSearchAutoCompleteProgressBarContainer.className = 'search-bar';
173173
Doctum.doctumSearchAutoCompleteProgressBar.className = 'progress-bar indeterminate';
174+
if (typeof DoctumSearch === 'object' && DoctumSearch.pageFullyLoaded) {
175+
DoctumSearch.doctumSearchPageAutoCompleteProgressBarContainer.className = 'search-bar';
176+
DoctumSearch.doctumSearchPageAutoCompleteProgressBar.className = 'progress-bar indeterminate';
177+
}
174178
function reqListener() {
175179
Doctum.autoCompleteLoading = false;
176180
Doctum.autoCompleteData = JSON.parse(this.responseText).items;
177181
Doctum.doctumSearchAutoCompleteProgressBarContainer.className = 'search-bar hidden';
178182
Doctum.doctumSearchAutoCompleteProgressBar.className = 'progress-bar';
183+
if (typeof DoctumSearch === 'object' && DoctumSearch.pageFullyLoaded) {
184+
DoctumSearch.doctumSearchPageAutoCompleteProgressBarContainer.className = 'search-bar hidden';
185+
DoctumSearch.doctumSearchPageAutoCompleteProgressBar.className = 'progress-bar';
186+
}
179187

180188
resolve(Doctum.autoCompleteData);
181189
}
@@ -191,22 +199,46 @@ var Doctum = {
191199
oReq.onerror = reqError;
192200
oReq.onprogress = function (pe) {
193201
if (pe.lengthComputable) {
194-
Doctum.doctumSearchAutoCompleteProgressBar.className = 'progress-bar';
195202
Doctum.doctumSearchAutoCompleteProgressBarPercent = parseInt(pe.loaded / pe.total * 100, 10);
196-
Doctum.doctumSearchAutoCompleteProgressBar.style.width = Doctum.doctumSearchAutoCompleteProgressBarPercent + '%';
197-
Doctum.doctumSearchAutoCompleteProgressBar.setAttribute(
198-
'aria-valuenow', Doctum.doctumSearchAutoCompleteProgressBarPercent
203+
Doctum.makeProgressOnProgressBar(
204+
Doctum.doctumSearchAutoCompleteProgressBarPercent,
205+
Doctum.doctumSearchAutoCompleteProgressBar
199206
);
207+
if (typeof DoctumSearch === 'object' && DoctumSearch.pageFullyLoaded) {
208+
Doctum.makeProgressOnProgressBar(
209+
Doctum.doctumSearchAutoCompleteProgressBarPercent,
210+
DoctumSearch.doctumSearchPageAutoCompleteProgressBar
211+
);
212+
}
200213
}
201214
}
202215
oReq.onloadend = function (_) {
203216
Doctum.doctumSearchAutoCompleteProgressBarContainer.className = 'search-bar hidden';
204217
Doctum.doctumSearchAutoCompleteProgressBar.className = 'progress-bar';
218+
if (typeof DoctumSearch === 'object' && DoctumSearch.pageFullyLoaded) {
219+
DoctumSearch.doctumSearchPageAutoCompleteProgressBarContainer.className = 'search-bar hidden';
220+
DoctumSearch.doctumSearchPageAutoCompleteProgressBar.className = 'progress-bar';
221+
}
205222
}
206223
oReq.open('get', Doctum.autoCompleteDataUrl, true);
207224
oReq.send();
208225
});
209226
},
227+
/**
228+
* Make some progress on a progress bar
229+
*
230+
* @param number percentage
231+
* @param HTMLElement progressBar
232+
* @return void
233+
*/
234+
makeProgressOnProgressBar: function(percentage, progressBar) {
235+
progressBar.className = 'progress-bar';
236+
progressBar.style.width = percentage + '%';
237+
progressBar.setAttribute(
238+
'aria-valuenow', percentage
239+
);
240+
241+
},
210242
bootAutoComplete: function () {
211243
Doctum.autoCompleteJS = new autoComplete(
212244
{

src/Resources/themes/default/search.twig

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,12 @@
2323
</form>
2424

2525
<h2 id="search-results-header">{% trans 'Search Results' %}</h2>
26-
26+
<div class="search-bar hidden" id="search-page-progress-bar-container">
27+
<div class="progress">
28+
<div class="progress-bar" role="progressbar" id="search-page-progress-bar"
29+
aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0%"></div>
30+
</div>
31+
</div>
2732
<div class="container-fluid" id="search-results-container">
2833
</div>
2934

@@ -34,10 +39,16 @@
3439
{% block js_search %}
3540
<script type="text/javascript">
3641
var DoctumSearch = {
42+
/** @var boolean */
43+
pageFullyLoaded: false,
3744
/** @var string|null */
3845
searchTerm: null,
3946
/** @var autoComplete|null */
4047
autoCompleteJS: null,
48+
/** @var HTMLElement|null */
49+
doctumSearchPageAutoCompleteProgressBarContainer: null,
50+
/** @var HTMLElement|null */
51+
doctumSearchPageAutoCompleteProgressBar: null,
4152
searchTypeClasses: {
4253
'{{ 'Namespace'|trans|escape('js') }}': 'label-default',
4354
'{{ 'Class'|trans|escape('js') }}': 'label-info',
@@ -88,11 +99,21 @@
8899
},
89100
pageFullyLoaded: function (event) {// Will get fired by the main doctum.js script
90101
DoctumSearch.searchTerm = DoctumSearch.cleanSearchTerm();
102+
DoctumSearch.doctumSearchPageAutoCompleteProgressBarContainer = document.getElementById('search-page-progress-bar-container');
103+
DoctumSearch.doctumSearchPageAutoCompleteProgressBar = document.getElementById('search-page-progress-bar');
104+
DoctumSearch.pageFullyLoaded = true;
91105
DoctumSearch.launchSearch();
92106
},
107+
showNoResults: function() {
108+
document.getElementById('search-results-container').innerText = '{{ 'No results were found'|trans|escape('js') }}';
109+
},
93110
launchSearch: function (event) {
94-
if (! DoctumSearch.searchTerm) {
95-
document.getElementById('search-results-header').class = 'hidden';
111+
if (
112+
DoctumSearch.searchTerm === null
113+
|| (typeof DoctumSearch.searchTerm === 'string' && DoctumSearch.searchTerm.length === 0)
114+
|| typeof DoctumSearch.searchTerm !== 'string'
115+
) {
116+
document.getElementById('search-results-header').className = 'hidden';
96117
// Stop the process here
97118
return;
98119
}
@@ -182,8 +203,7 @@
182203
DoctumSearch.autoCompleteJS.unInit();// Stop the work, wait for the user to hit submit
183204
document.getElementById('search').addEventListener('results', function (event) {
184205
if (event.detail.results.length === 0) {
185-
// TODO: here
186-
// container.html('{% trans 'No results were found'%}');
206+
DoctumSearch.showNoResults();
187207
}
188208
});
189209
}

0 commit comments

Comments
 (0)