46 lines
1.2 KiB
TypeScript
46 lines
1.2 KiB
TypeScript
import angular from 'angular';
|
|
|
|
/* @ngInject */
|
|
export function delayHide($timeout: ng.ITimeoutService) {
|
|
return {
|
|
restrict: 'A',
|
|
scope: {
|
|
show: '=',
|
|
delay: '@'
|
|
},
|
|
link: function (scope: ng.IScope, elem: JQLite) {
|
|
const scopeAny = scope as any;
|
|
const showSpinner = () => {
|
|
if (scopeAny.hidePromise) {
|
|
$timeout.cancel(scopeAny.hidePromise);
|
|
scopeAny.hidePromise = null;
|
|
}
|
|
showElement(true);
|
|
};
|
|
|
|
const hideSpinner = () => {
|
|
scopeAny.hidePromise = $timeout(
|
|
showElement.bind(this as any, false),
|
|
getDelay()
|
|
);
|
|
};
|
|
|
|
const showElement = (show: boolean) => {
|
|
show ? elem.css({ display: '' }) : elem.css({ display: 'none' });
|
|
};
|
|
|
|
const getDelay = () => {
|
|
const delay = parseInt(scopeAny.delay);
|
|
return angular.isNumber(delay) ? delay : 200;
|
|
};
|
|
|
|
showElement(false);
|
|
// Whenever the scope variable updates we simply
|
|
// show if it evaluates to 'true' and hide if 'false'
|
|
scope.$watch('show', function (newVal) {
|
|
newVal ? showSpinner() : hideSpinner();
|
|
});
|
|
}
|
|
};
|
|
}
|