add loading states to async table and async table filter
This commit is contained in:
parent
7756862aeb
commit
7df0021fbe
@ -1033,6 +1033,8 @@ siteLayout' headingOverride widget = do
|
|||||||
addStylesheet $ StaticR css_utils_alerts_scss
|
addStylesheet $ StaticR css_utils_alerts_scss
|
||||||
addStylesheet $ StaticR css_utils_asidenav_scss
|
addStylesheet $ StaticR css_utils_asidenav_scss
|
||||||
addStylesheet $ StaticR css_utils_asyncForm_scss
|
addStylesheet $ StaticR css_utils_asyncForm_scss
|
||||||
|
addStylesheet $ StaticR css_utils_asyncTable_scss
|
||||||
|
addStylesheet $ StaticR css_utils_asyncTableFilter_scss
|
||||||
addStylesheet $ StaticR css_utils_form_scss
|
addStylesheet $ StaticR css_utils_form_scss
|
||||||
addStylesheet $ StaticR css_utils_inputs_scss
|
addStylesheet $ StaticR css_utils_inputs_scss
|
||||||
addStylesheet $ StaticR css_utils_modal_scss
|
addStylesheet $ StaticR css_utils_modal_scss
|
||||||
|
|||||||
5
static/css/utils/asyncTable.scss
Normal file
5
static/css/utils/asyncTable.scss
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
.async-table--loading {
|
||||||
|
opacity: 0.1;
|
||||||
|
pointer-events: none;
|
||||||
|
transition: opacity 400ms ease-in-out;
|
||||||
|
}
|
||||||
5
static/css/utils/asyncTableFilter.scss
Normal file
5
static/css/utils/asyncTableFilter.scss
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
.async-table-filter--loading {
|
||||||
|
opacity: 0.1;
|
||||||
|
pointer-events: none;
|
||||||
|
transition: opacity 400ms ease-in-out;
|
||||||
|
}
|
||||||
@ -6,6 +6,7 @@
|
|||||||
var HEADER_HEIGHT = 80;
|
var HEADER_HEIGHT = 80;
|
||||||
var RESET_OPTIONS = [ 'scrollTo' ];
|
var RESET_OPTIONS = [ 'scrollTo' ];
|
||||||
var TABLE_FILTER_FORM_CLASS = 'table-filter-form';
|
var TABLE_FILTER_FORM_CLASS = 'table-filter-form';
|
||||||
|
var ASYNC_TABLE_LOADING_CLASS = 'async-table--loading';
|
||||||
var JS_INITIALIZED_CLASS = 'js-async-table-initialized';
|
var JS_INITIALIZED_CLASS = 'js-async-table-initialized';
|
||||||
|
|
||||||
window.utils.asyncTable = function(wrapper, options) {
|
window.utils.asyncTable = function(wrapper, options) {
|
||||||
@ -140,6 +141,8 @@
|
|||||||
throw new Error('httpClient not found!');
|
throw new Error('httpClient not found!');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wrapper.classList.add(ASYNC_TABLE_LOADING_CLASS);
|
||||||
|
|
||||||
tableOptions = tableOptions || {};
|
tableOptions = tableOptions || {};
|
||||||
var headers = {
|
var headers = {
|
||||||
'Accept': 'text/html',
|
'Accept': 'text/html',
|
||||||
@ -157,6 +160,8 @@
|
|||||||
if (callback && typeof callback === 'function') {
|
if (callback && typeof callback === 'function') {
|
||||||
callback(wrapper);
|
callback(wrapper);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wrapper.classList.remove(ASYNC_TABLE_LOADING_CLASS);
|
||||||
}).catch(function(err) {
|
}).catch(function(err) {
|
||||||
console.error(err);
|
console.error(err);
|
||||||
});
|
});
|
||||||
|
|||||||
@ -3,7 +3,9 @@
|
|||||||
|
|
||||||
window.utils = window.utils || {};
|
window.utils = window.utils || {};
|
||||||
|
|
||||||
|
var ASYNC_TABLE_FILTER_LOADING_CLASS = 'async-table-filter--loading';
|
||||||
var JS_INITIALIZED_CLASS = 'js-async-table-filter-initialized';
|
var JS_INITIALIZED_CLASS = 'js-async-table-filter-initialized';
|
||||||
|
var INPUT_DEBOUNCE = 600;
|
||||||
|
|
||||||
// debounce function, taken from Underscore.js
|
// debounce function, taken from Underscore.js
|
||||||
function debounce(func, wait, immediate) {
|
function debounce(func, wait, immediate) {
|
||||||
@ -29,6 +31,8 @@
|
|||||||
if (formElement.matches('.' + JS_INITIALIZED_CLASS)) {
|
if (formElement.matches('.' + JS_INITIALIZED_CLASS)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
options = options || {};
|
||||||
|
var tableIdent = options.dbtIdent;
|
||||||
|
|
||||||
var formId = formElement.querySelector('[name="_formid"]').value;
|
var formId = formElement.querySelector('[name="_formid"]').value;
|
||||||
var inputs = {
|
var inputs = {
|
||||||
@ -67,7 +71,7 @@
|
|||||||
if (input.value.length === 0 || input.value.length > 2) {
|
if (input.value.length === 0 || input.value.length > 2) {
|
||||||
updateTable();
|
updateTable();
|
||||||
}
|
}
|
||||||
}, 400);
|
}, INPUT_DEBOUNCE);
|
||||||
input.addEventListener('input', debouncedInput);
|
input.addEventListener('input', debouncedInput);
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -76,7 +80,7 @@
|
|||||||
if (input.value.length === 0 || input.value.length > 2) {
|
if (input.value.length === 0 || input.value.length > 2) {
|
||||||
updateTable();
|
updateTable();
|
||||||
}
|
}
|
||||||
}, 400);
|
}, INPUT_DEBOUNCE);
|
||||||
input.addEventListener('input', debouncedInput);
|
input.addEventListener('input', debouncedInput);
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -102,6 +106,8 @@
|
|||||||
var url = serializeFormToURL();
|
var url = serializeFormToURL();
|
||||||
var callback = null;
|
var callback = null;
|
||||||
|
|
||||||
|
formElement.classList.add(ASYNC_TABLE_FILTER_LOADING_CLASS);
|
||||||
|
|
||||||
var focusedSearch = inputs.search.reduce(function(acc, input) {
|
var focusedSearch = inputs.search.reduce(function(acc, input) {
|
||||||
return acc || (input.matches(':focus') && input);
|
return acc || (input.matches(':focus') && input);
|
||||||
}, null);
|
}, null);
|
||||||
@ -123,6 +129,7 @@
|
|||||||
var url = new URL(options.currentUrl || window.location.href);
|
var url = new URL(options.currentUrl || window.location.href);
|
||||||
url.searchParams.set('_formid', formId);
|
url.searchParams.set('_formid', formId);
|
||||||
url.searchParams.set('_hasdata', 'true');
|
url.searchParams.set('_hasdata', 'true');
|
||||||
|
url.searchParams.set(tableIdent + '-page', '0');
|
||||||
|
|
||||||
inputs.search.forEach(function(input) {
|
inputs.search.forEach(function(input) {
|
||||||
url.searchParams.set(input.name, input.value);
|
url.searchParams.set(input.name, input.value);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user