import {module} from '../module'; import splitingRegister from './splitingRegister'; factory.$inject = ['$http', '$window', '$ocLazyLoad', '$translatePartialLoader', '$translate']; export function factory($http, $window, $ocLazyLoad, $translatePartialLoader, $translate) { class ModuleLoader { constructor() { this._loaded = {}; } load(moduleName, validations) { let loaded = this._loaded; if (loaded[moduleName]) return loaded[moduleName]; loaded[moduleName] = Promise.resolve(true); let deps = splitingRegister.getDependencies(moduleName); let depPromises = []; if (deps) for (let dep of deps) depPromises.push(this.load(dep, validations)); loaded[moduleName] = new Promise((resolve, reject) => { Promise.all(depPromises) .then(() => { let promises = []; // FIXME: https://github.com/angular-translate/angular-translate/pull/1674 $translatePartialLoader.addPart(moduleName); promises.push($translate.refresh()); if (validations) promises.push(new Promise(resolve => { $http.get(`/${moduleName}/validations`).then( json => this.onValidationsReady(json, resolve), json => resolve() ); })); promises.push(new Promise(resolve => { splitingRegister.modules[moduleName](resolve); })); Promise.all(promises) .then(() => { this._loaded[moduleName] = true; resolve($ocLazyLoad.load({name: moduleName})); }) .catch(reject); }) .catch(reject); }); return loaded[moduleName]; } onValidationsReady(json, resolve) { let entities = json.data; for (let entity in entities) { let fields = entities[entity].validations; for (let field in fields) { let validations = fields[field]; for (let validation of validations) this.parseValidation(validation); } } Object.assign($window.validations, json.data); resolve(); } parseValidation(val) { switch (val.validation) { case 'custom': // TODO: Replace eval val.bindedFunction = eval(`(${val.bindedFunction})`); break; case 'format': val.with = new RegExp(val.with); break; } } } return new ModuleLoader(); } module.factory('vnModuleLoader', factory);