phonon
Version:
Phonon is an open source HTML, CSS and JavaScript agnostic framework that allows to create a website or a hybrid Web app.
94 lines (70 loc) • 2.17 kB
text/typescript
import Component from '../component';
import { Color, Size } from '../mixins';
import Util from '../util.js';
interface IProps {
element?: HTMLElement|string; // the element must exist
color?: Color;
size?: Size;
}
export default class Loader extends Component {
/**
*
* @param props
*/
constructor(props: IProps = { color: Color.primary, size: Size.md }) {
super('loader', { fade: true, size: Size.md, color: Color.primary }, props);
// no-template: loader is not a dynamic component
}
/**
* Shows the alert
* @returns {Boolean}
*/
public show(): boolean {
const element = this.getElement();
if (element.classList.contains('hide')) {
element.classList.remove('hide');
}
this.triggerEvent(Util.Event.SHOW);
// set size
const size = this.getProp('size');
Util.Selector.removeClasses(element, Object.values(Size), 'loader');
element.classList.add(`loader-${size}`);
// set color
const color = this.getProp('color');
const spinner = this.getSpinner();
Util.Selector.removeClasses(spinner, Object.values(Color), 'loader');
spinner.classList.add(`loader-${color}`);
this.triggerEvent(Util.Event.SHOWN);
return true;
}
public animate(startAnimation: boolean = true): boolean {
if (startAnimation) {
this.show();
} else {
this.hide();
}
const loaderSpinner = this.getSpinner();
if (startAnimation
&& !loaderSpinner.classList.contains('loader-spinner-animated')) {
loaderSpinner.classList.add('loader-spinner-animated');
return true;
}
if (!startAnimation
&& loaderSpinner.classList.contains('loader-spinner-animated')) {
loaderSpinner.classList.remove('loader-spinner-animated');
}
return true;
}
public hide(): boolean {
const element = this.getElement();
if (!element.classList.contains('hide')) {
element.classList.add('hide');
}
this.triggerEvent(Util.Event.HIDE);
this.triggerEvent(Util.Event.HIDDEN);
return true;
}
private getSpinner(): HTMLElement {
return this.getElement().querySelector('.loader-spinner');
}
}