1
0
Fork 0
mirror of https://github.com/koalyptus/TableFilter.git synced 2024-05-18 14:26:40 +02:00
TableFilter/src/modules/statusBar.js

309 lines
8.8 KiB
JavaScript
Raw Normal View History

import {Feature} from '../feature';
2016-05-08 07:26:52 +02:00
import {root} from '../root';
2016-05-25 09:31:53 +02:00
import {createElm, createText, elm, removeElm} from '../dom';
2017-10-08 12:14:25 +02:00
import {EMPTY_FN, isNull} from '../types';
2017-07-09 07:11:51 +02:00
import {defaultsStr, defaultsFn} from '../settings';
2017-10-08 12:14:25 +02:00
import {LEFT} from './toolbar';
2015-02-20 14:46:57 +01:00
const EVENTS = [
'after-filtering',
'after-populating-filter',
'after-page-change',
'after-clearing-filters',
'after-page-length-change',
'after-reset-page',
'after-reset-page-length',
'after-loading-extensions',
'after-loading-themes'
];
/**
* Status bar UI component
* @export
* @class StatusBar
* @extends {Feature}
*/
2016-05-24 10:42:11 +02:00
export class StatusBar extends Feature {
2015-02-20 14:46:57 +01:00
/**
* Creates an instance of StatusBar
* @param {TableFilter} tf TableFilter instance
2015-02-20 14:46:57 +01:00
*/
2016-05-24 10:42:11 +02:00
constructor(tf) {
2019-02-09 14:27:55 +01:00
super(tf, StatusBar);
2015-02-20 14:46:57 +01:00
// Configuration object
2017-05-16 05:55:48 +02:00
let f = this.config.status_bar || {};
2015-02-20 14:46:57 +01:00
/**
* ID of custom container element
* @type {String}
*/
2017-07-09 07:11:51 +02:00
this.targetId = defaultsStr(f.target_id, null);
/**
* Container DOM element
* @type {DOMElement}
* @private
*/
this.container = null;
/**
* Message container DOM element
* @type {DOMElement}
* @private
*/
this.msgContainer = null;
/**
* Label container DOM element
* @type {DOMElement}
* @private
*/
this.labelContainer = null;
/**
* Text preceding status message
* @type {String}
*/
2017-07-09 07:11:51 +02:00
this.text = defaultsStr(f.text, '');
/**
* Css class for container element
* @type {String}
*/
2017-07-09 07:11:51 +02:00
this.cssClass = defaultsStr(f.css_class, 'status');
/**
* Message visibility duration in milliseconds
* @type {Number}
* @private
*/
this.delay = 250;
/**
* Callback fired before the message is displayed
* @type {Function}
*/
2017-07-09 07:11:51 +02:00
this.onBeforeShowMsg = defaultsFn(f.on_before_show_msg, EMPTY_FN);
/**
* Callback fired after the message is displayed
* @type {Function}
*/
2017-07-09 07:11:51 +02:00
this.onAfterShowMsg = defaultsFn(f.on_after_show_msg, EMPTY_FN);
2015-02-20 14:46:57 +01:00
/**
* Message appearing upon filtering
* @type {String}
*/
2017-07-09 07:11:51 +02:00
this.msgFilter = defaultsStr(f.msg_filter, 'Filtering data...');
/**
* Message appearing when a drop-down filter is populated
* @type {String}
*/
2017-07-09 07:11:51 +02:00
this.msgPopulate = defaultsStr(f.msg_populate, 'Populating filter...');
/**
* Message appearing when a checklist filter is populated
* @type {String}
*/
2017-07-09 07:11:51 +02:00
this.msgPopulateCheckList = defaultsStr(f.msg_populate_checklist,
'Populating list...');
/**
* Message appearing when a pagination page is changed
* @type {String}
*/
2017-07-09 07:11:51 +02:00
this.msgChangePage = defaultsStr(f.msg_change_page,
'Collecting paging data...');
/**
* Message appearing when filters are cleared
* @type {String}
*/
2017-07-09 07:11:51 +02:00
this.msgClear = defaultsStr(f.msg_clear, 'Clearing filters...');
/**
* Message appearing when the page length is changed
* @type {String}
*/
2017-07-09 07:11:51 +02:00
this.msgChangeResults = defaultsStr(f.msg_change_results,
'Changing results per page...');
/**
* Message appearing when the page is re-set
* @type {String}
*/
2017-07-09 07:11:51 +02:00
this.msgResetPage = defaultsStr(f.msg_reset_page, 'Re-setting page...');
/**
* Message appearing when the page length is re-set
* @type {String}
*/
2017-07-09 07:11:51 +02:00
this.msgResetPageLength = defaultsStr(f.msg_reset_page_length,
'Re-setting page length...');
/**
* Message appearing upon column sorting
* @type {String}
*/
2017-07-09 07:11:51 +02:00
this.msgSort = defaultsStr(f.msg_sort, 'Sorting data...');
/**
* Message appearing when extensions are loading
* @type {String}
*/
2017-07-09 07:11:51 +02:00
this.msgLoadExtensions = defaultsStr(f.msg_load_extensions,
'Loading extensions...');
/**
* Message appearing when themes are loading
* @type {String}
*/
2017-07-09 07:11:51 +02:00
this.msgLoadThemes = defaultsStr(f.msg_load_themes,
'Loading theme(s)...');
2017-10-08 12:14:25 +02:00
/**
* Default position in toolbar ('left'|'center'|'right')
* @type {String}
*/
this.toolbarPosition = defaultsStr(f.toolbar_position, LEFT);
2015-02-20 14:46:57 +01:00
}
/**
* Initializes StatusBar instance
*/
2016-05-24 10:42:11 +02:00
init() {
if (this.initialized) {
2015-02-20 14:46:57 +01:00
return;
}
2016-01-02 15:33:31 +01:00
let tf = this.tf;
let emitter = this.emitter;
2017-10-08 12:14:25 +02:00
emitter.emit('initializing-feature', this, !isNull(this.targetId));
2017-10-09 12:56:58 +02:00
// status bar container
let statusDiv = createElm('div');
statusDiv.className = this.cssClass;
2015-02-20 14:46:57 +01:00
2017-10-09 12:56:58 +02:00
// status bar label
let statusSpan = createElm('span');
2017-10-09 12:56:58 +02:00
// preceding text
let statusSpanText = createElm('span');
statusSpanText.appendChild(createText(this.text));
2015-02-20 14:46:57 +01:00
// target element container
2017-10-09 12:56:58 +02:00
let targetEl = (!this.targetId) ?
tf.feature('toolbar').container(this.toolbarPosition) :
2017-10-08 12:14:25 +02:00
elm(this.targetId);
2015-02-20 14:46:57 +01:00
2017-10-09 12:56:58 +02:00
// default container
if (!this.targetId) {
2015-02-20 14:46:57 +01:00
statusDiv.appendChild(statusSpanText);
statusDiv.appendChild(statusSpan);
targetEl.appendChild(statusDiv);
} else {
// custom container, no need to append statusDiv
targetEl.appendChild(statusSpanText);
targetEl.appendChild(statusSpan);
}
this.container = statusDiv;
this.msgContainer = statusSpan;
this.labelContainer = statusSpanText;
2015-02-20 14:46:57 +01:00
2017-10-09 12:56:58 +02:00
// subscribe to events
2016-05-24 10:42:11 +02:00
emitter.on(['before-filtering'], () => this.message(this.msgFilter));
2016-01-03 03:49:04 +01:00
emitter.on(['before-populating-filter'],
2016-05-24 10:42:11 +02:00
() => this.message(this.msgPopulate));
emitter.on(['before-page-change'],
2016-05-24 10:42:11 +02:00
() => this.message(this.msgChangePage));
emitter.on(['before-clearing-filters'], () =>
2016-01-03 03:49:04 +01:00
this.message(this.msgClear));
emitter.on(['before-page-length-change'],
2016-05-24 10:42:11 +02:00
() => this.message(this.msgChangeResults));
emitter.on(['before-reset-page'],
() => this.message(this.msgResetPage));
2016-01-03 03:49:04 +01:00
emitter.on(['before-reset-page-length'],
2016-05-24 10:42:11 +02:00
() => this.message(this.msgResetPageLength));
2016-01-03 03:49:04 +01:00
emitter.on(['before-loading-extensions'],
2016-05-24 10:42:11 +02:00
() => this.message(this.msgLoadExtensions));
2016-01-03 03:49:04 +01:00
emitter.on(['before-loading-themes'],
2016-05-24 10:42:11 +02:00
() => this.message(this.msgLoadThemes));
2016-01-03 03:49:04 +01:00
emitter.on(EVENTS, () => this.message(''));
2016-01-02 15:33:31 +01:00
2017-10-06 05:07:55 +02:00
/** @inherited */
this.initialized = true;
2017-10-08 12:14:25 +02:00
emitter.emit('feature-initialized', this);
2015-02-20 14:46:57 +01:00
}
/**
* Display status message
* @param {String} [t=''] Message to be displayed
*/
2016-05-24 10:42:11 +02:00
message(t = '') {
if (!this.isEnabled()) {
2015-02-20 14:46:57 +01:00
return;
}
2016-12-22 12:01:59 +01:00
this.onBeforeShowMsg(this.tf, t);
2015-02-20 14:46:57 +01:00
let d = t === '' ? this.delay : 1;
2016-05-08 07:26:52 +02:00
root.setTimeout(() => {
2016-05-24 10:42:11 +02:00
if (!this.initialized) {
2016-01-02 15:33:31 +01:00
return;
}
this.msgContainer.innerHTML = t;
2016-12-22 12:01:59 +01:00
this.onAfterShowMsg(this.tf, t);
2015-02-20 14:46:57 +01:00
}, d);
}
/**
* Destroy StatusBar instance
*/
2016-05-24 10:42:11 +02:00
destroy() {
if (!this.initialized) {
2015-02-20 14:46:57 +01:00
return;
}
2016-01-02 15:33:31 +01:00
let emitter = this.emitter;
this.container.innerHTML = '';
if (!this.targetId) {
removeElm(this.container);
}
this.labelContainer = null;
this.msgContainer = null;
this.container = null;
2016-01-02 15:33:31 +01:00
// Unsubscribe to events
2016-05-24 10:42:11 +02:00
emitter.off(['before-filtering'], () => this.message(this.msgFilter));
2016-01-03 03:49:04 +01:00
emitter.off(['before-populating-filter'],
2016-05-24 10:42:11 +02:00
() => this.message(this.msgPopulate));
emitter.off(['before-page-change'],
2016-05-24 10:42:11 +02:00
() => this.message(this.msgChangePage));
2016-01-03 03:49:04 +01:00
emitter.off(['before-clearing-filters'],
2016-05-24 10:42:11 +02:00
() => this.message(this.msgClear));
emitter.off(['before-page-length-change'],
2016-05-24 10:42:11 +02:00
() => this.message(this.msgChangeResults));
emitter.off(['before-reset-page'], () =>
2016-01-03 03:49:04 +01:00
this.message(this.msgResetPage));
emitter.off(['before-reset-page-length'],
2016-05-24 10:42:11 +02:00
() => this.message(this.msgResetPageLength));
2016-01-03 03:49:04 +01:00
emitter.off(['before-loading-extensions'],
2016-05-24 10:42:11 +02:00
() => this.message(this.msgLoadExtensions));
2016-01-03 03:49:04 +01:00
emitter.off(['before-loading-themes'],
2016-05-24 10:42:11 +02:00
() => this.message(this.msgLoadThemes));
2016-01-03 03:49:04 +01:00
emitter.off(EVENTS, () => this.message(''));
2016-01-02 15:33:31 +01:00
this.initialized = false;
2015-02-20 14:46:57 +01:00
}
}