### # Copyright (C) 2014-2018 Taiga Agile LLC # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # # File: modules/common/loading.coffee ### module = angular.module("taigaCommon") TgLoadingService = ($compile) -> spinner = "loading..." return () -> service = { settings: { target: null, scope: null, classes: [] timeout: 0, template: null }, target: (target) -> service.settings.target = target return service scope: (scope) -> service.settings.scope = scope return service template: (template) -> service.settings.template = template return service removeClasses: (classess...) -> service.settings.classes = classess return service timeout: (timeout) -> service.settings.timeout = timeout return service start: -> target = service.settings.target service.settings.classes.map (className) -> target.removeClass(className) if not target.hasClass('loading') && !service.settings.template service.settings.template = target.html() # The loader is shown after that quantity of milliseconds timeoutId = setTimeout (-> if not target.hasClass('loading') target.addClass('loading') target.html(spinner) ), service.settings.timeout service.settings.timeoutId = timeoutId return service finish: -> target = service.settings.target timeoutId = service.settings.timeoutId if timeoutId clearTimeout(timeoutId) removeClasses = service.settings.classes removeClasses.map (className) -> service.settings.target.addClass(className) target.html(service.settings.template) target.removeClass('loading') if service.settings.scope $compile(target.contents())(service.settings.scope) return service } return service TgLoadingService.$inject = [ "$compile" ] module.factory("$tgLoading", TgLoadingService) LoadingDirective = ($loading) -> link = ($scope, $el, attr) -> currentLoading = null template = $el.html() $scope.$watch attr.tgLoading, (showLoading) => if showLoading currentLoading = $loading() .target($el) .timeout(100) .template(template) .scope($scope) .start() else if currentLoading currentLoading.finish() return { priority: 99999, link:link } module.directive("tgLoading", ["$tgLoading", LoadingDirective])