// Generated by CoffeeScript 1.12.8 /* LemonLDAP::NG Viewer client This is the main app file. Other are: - struct.json and js/confTree.js that contains the full tree - translate.json that contains the keywords translation This file contains: - the AngularJS controller */ (function() { var llapp; llapp = angular.module('llngViewer', ['ui.tree', 'ui.bootstrap', 'llApp', 'ngCookies']); /* Main AngularJS controller */ llapp.controller('TreeCtrl', [ '$scope', '$http', '$location', '$q', '$uibModal', '$translator', '$cookies', '$htmlParams', function($scope, $http, $location, $q, $uibModal, $translator, $cookies, $htmlParams) { var _download, _getAll, _stoggle, c, id, pathEvent, readError, setHelp; $scope.links = window.links; $scope.menu = $htmlParams.menu; $scope.menulinks = window.menulinks; $scope.staticPrefix = window.staticPrefix; $scope.formPrefix = window.formPrefix; $scope.availableLanguages = window.availableLanguages; $scope.waiting = true; $scope.showM = false; $scope.showT = false; $scope.form = 'homeViewer'; $scope.currentCfg = {}; $scope.viewPrefix = window.viewPrefix; $scope.allowDiff = window.allowDiff; $scope.message = {}; $scope.result = ''; $scope.translateTitle = function(node) { return $translator.translateField(node, 'title'); }; $scope.translateP = $translator.translateP; $scope.translate = $translator.translate; $scope.helpUrl = 'start.html#configuration'; $scope.setShowHelp = function(val) { var d; if (val == null) { val = !$scope.showH; } $scope.showH = val; d = new Date(Date.now()); d.setFullYear(d.getFullYear() + 1); return $cookies.put('showhelp', (val ? 'true' : 'false'), { "expires": d }); }; $scope.showH = $cookies.get('showhelp') === 'false' ? false : true; if ($scope.showH == null) { $scope.setShowHelp(true); } readError = function(response) { var e, j; e = response.status; j = response.statusLine; $scope.waiting = false; if (e === 403) { $scope.message = { title: 'forbidden', message: '', items: [] }; } else if (e === 401) { console.log('Authentication needed'); $scope.message = { title: 'authenticationNeeded', message: '__waitOrF5__', items: [] }; } else if (e === 400) { $scope.message = { title: 'badRequest', message: j, items: [] }; } else if (e > 0) { $scope.message = { title: 'badRequest', message: j, items: [] }; } else { $scope.message = { title: 'networkProblem', message: '', items: [] }; } return $scope.showModal('message.html'); }; $scope.showModal = function(tpl, init) { var d, modalInstance; modalInstance = $uibModal.open({ templateUrl: tpl, controller: 'ModalInstanceCtrl', size: 'lg', resolve: { elem: function() { return function(s) { return $scope[s]; }; }, set: function() { return function(f, s) { return $scope[f] = s; }; }, init: function() { return init; } } }); d = $q.defer(); modalInstance.result.then(function(msgok) { $scope.message = { title: '', message: '', items: [] }; return d.resolve(msgok); }, function(msgnok) { $scope.message = { title: '', message: '', items: [] }; return d.reject(msgnok); }); return d.promise; }; $scope.menuClick = function(button) { if (button.popup) { window.open(button.popup); } else { if (!button.action) { button.action = button.title; } switch (typeof button.action) { case 'function': button.action($scope.currentNode, $scope); break; case 'string': $scope[button.action](); break; default: console.log(typeof button.action); } } return $scope.showM = false; }; $scope.home = function() { $scope.form = 'homeViewer'; return $scope.showM = false; }; $scope.downloadConf = function() { return window.open($scope.viewPrefix + $scope.currentCfg.cfgNum + '?full=1'); }; id = 1; $scope._findContainer = function() { return $scope._findScopeContainer().$modelValue; }; $scope._findScopeContainer = function() { var cs; cs = $scope.currentScope; while (!cs.$modelValue.type.match(/Container$/)) { cs = cs.$parentNodeScope; } return cs; }; $scope._findScopeByKey = function(k) { var cs; cs = $scope.currentScope; while (!(cs.$modelValue.title === k)) { cs = cs.$parentNodeScope; } return cs; }; _getAll = function(node) { var d, d2; d = $q.defer(); d2 = $q.defer(); if (node._nodes) { _stoggle(node); d.resolve(); } else if (node.cnodes) { _download(node).then(function() { return d.resolve(); }); } else if (node.nodes || node.data) { d.resolve(); } else { $scope.getKey(node).then(function() { return d.resolve(); }); } d.promise.then(function() { var l, len, n, ref, t; t = []; if (node.nodes) { ref = node.nodes; for (l = 0, len = ref.length; l < len; l++) { n = ref[l]; t.push(_getAll(n)); } } return $q.all(t).then(function() { return d2.resolve(); }); }); return d2.promise; }; $scope.down = function() { var i, ind, l, len, n, p, ref, tmp; id = $scope.currentNode.id; p = $scope.currentScope.$parentNodeScope.$modelValue; ind = p.nodes.length; ref = p.nodes; for (i = l = 0, len = ref.length; l < len; i = ++l) { n = ref[i]; if (n.id === id) { ind = i; } } if (ind < p.nodes.length - 1) { tmp = p.nodes[ind]; p.nodes[ind] = p.nodes[ind + 1]; p.nodes[ind + 1] = tmp; } return ind; }; $scope.up = function() { var i, ind, l, len, n, p, ref, tmp; id = $scope.currentNode.id; p = $scope.currentScope.$parentNodeScope.$modelValue; ind = -1; ref = p.nodes; for (i = l = 0, len = ref.length; l < len; i = ++l) { n = ref[i]; if (n.id === id) { ind = i; } } if (ind > 0) { tmp = p.nodes[ind]; p.nodes[ind] = p.nodes[ind - 1]; p.nodes[ind - 1] = tmp; } return ind; }; $scope.inSelect = function(value) { var l, len, n, ref; ref = $scope.currentNode.select; for (l = 0, len = ref.length; l < len; l++) { n = ref[l]; if (n.k === value) { return true; } } return false; }; $scope.changeRuleTitle = function(node) { return node.title = node.comment.length > 0 ? node.comment : node.re; }; $scope.filters = {}; $scope.execFilters = function(scope) { var filter, func, ref; scope = scope ? scope : $scope; ref = $scope.filters; for (filter in ref) { func = ref[filter]; if ($scope.filters.hasOwnProperty(filter)) { return window.filterFunctions[filter](scope, $q, func); } } return false; }; $scope.stoggle = function(scope) { var node; node = scope.$modelValue; _stoggle(node); return scope.toggle(); }; _stoggle = function(node) { var a, l, len, len1, len2, m, n, o, ref, ref1, ref2; ref = ['nodes', 'nodes_cond']; for (l = 0, len = ref.length; l < len; l++) { n = ref[l]; if (node["_" + n]) { node[n] = []; ref1 = node["_" + n]; for (m = 0, len1 = ref1.length; m < len1; m++) { a = ref1[m]; node[n].push(a); } delete node["_" + n]; } } if (node._nodes_filter) { if (node.nodes) { ref2 = node.nodes; for (o = 0, len2 = ref2.length; o < len2; o++) { n = ref2[o]; n.onChange = $scope.execFilters; } } $scope.filters[node._nodes_filter] = node; return $scope.execFilters(); } }; $scope.toggle = function(scope) { return scope.toggle(); }; $scope.download = function(scope) { var node; node = scope.$modelValue; return _download(node); }; _download = function(node) { var d, uri; d = $q.defer(); d.notify('Trying to get datas'); $scope.waiting = true; console.log("Trying to get key " + node.cnodes); uri = encodeURI(node.cnodes); $http.get("" + window.confPrefix + $scope.currentCfg.cfgNum + "/" + uri).then(function(response) { var a, data, l, len; data = response.data; if (!data) { d.reject('Empty response from server'); } else if (data.error) { if (data.error.match(/setDefault$/)) { if (node['default']) { node.nodes = node['default'].slice(0); } else { node.nodes = []; } delete node.cnodes; d.resolve('Set data to default value'); } else { d.reject("Server return an error: " + data.error); } } else { delete node.cnodes; if (!node.type) { node.type = 'keyTextContainer'; } node.nodes = []; for (l = 0, len = data.length; l < len; l++) { a = data[l]; if (a.template) { a._nodes = templates(a.template, a.title); } node.nodes.push(a); } d.resolve('OK'); } return $scope.waiting = false; }, function(response) { readError(response); return d.reject(''); }); return d.promise; }; $scope.openCnode = function(scope) { return $scope.download(scope).then(function() { return scope.toggle(); }); }; setHelp = function(scope) { while (!scope.$modelValue.help && scope.$parentNodeScope) { scope = scope.$parentNodeScope; } return $scope.helpUrl = scope.$modelValue.help || 'start.html#configuration'; }; $scope.displayForm = function(scope) { var f, l, len, n, node, ref; node = scope.$modelValue; if (node.cnodes) { $scope.download(scope); } if (node._nodes) { $scope.stoggle(scope); } $scope.currentNode = node; $scope.currentScope = scope; f = node.type ? node.type : 'text'; if (node.nodes || node._nodes || node.cnodes) { $scope.form = f !== 'text' ? f : 'mini'; } else { $scope.form = f; $scope.getKey(node); } if (node.type && node.type === 'simpleInputContainer') { ref = node.nodes; for (l = 0, len = ref.length; l < len; l++) { n = ref[l]; $scope.getKey(n); } } $scope.showT = false; return setHelp(scope); }; $scope.keyWritable = function(scope) { var node; node = scope.$modelValue; if (node.type && node.type.match(/^(?:s(?:aml(?:(?:ID|S)PMetaDataNod|Attribut)e|fExtra)|(?:(?:cmbMod|r)ul|authChoic)e|(?:virtualHos|keyTex)t|menu(?:App|Cat))$/)) { return true; } else { return false; } }; $scope.getKey = function(node) { var d, i, l, len, n, ref, tmp, uri; d = $q.defer(); if (!node.data) { $scope.waiting = true; if (node.get && typeof node.get === 'object') { node.data = []; tmp = []; ref = node.get; for (i = l = 0, len = ref.length; l < len; i = ++l) { n = ref[i]; node.data[i] = { title: n, id: n }; tmp.push($scope.getKey(node.data[i])); } $q.all(tmp).then(function() { return d.resolve(node.data); }, function(response) { d.reject(response.statusLine); return $scope.waiting = false; }); } else { uri = ''; if (node.get) { console.log("Trying to get key " + node.get); uri = encodeURI(node.get); } else { console.log("Trying to get title " + node.title); } $http.get("" + window.confPrefix + $scope.currentCfg.cfgNum + "/" + (node.get ? uri : node.title)).then(function(response) { var data; data = response.data; if ((data.value === null || (data.error && data.error.match(/setDefault$/))) && node['default'] !== null) { node.data = node['default']; } else { node.data = data.value; } if (node.data && node.data.toString().match(/_Hidden_$/)) { node.type = 'text'; node.data = '######'; } if (node.type && node.type.match(/^(bool|trool|boolOrExpr)$/)) { if (typeof node.data === 'string' && node.data.match(/^(?:-1|0|1)$/)) { node.data = parseInt(node.data, 10); } } if (node.type && node.type.match(/^int$/)) { node.data = parseInt(node.data, 10); } else if (node.type && node.type.match(/^(saml(Service|Assertion)|blackWhiteList)$/) && !(typeof node.data === 'object')) { node.data = node.data.split(';'); } $scope.waiting = false; return d.resolve(node.data); }, function(response) { readError(response); return d.reject(response.status); }); } } else { if (node.data.toString().match(/_Hidden_$/)) { node.type = 'text'; node.data = '######'; } d.resolve(node.data); } return d.promise; }; pathEvent = function(event, next, current) { var n; n = next.match(new RegExp('#!?/view/(latest|[0-9]+)')); if (n === null) { return $location.path('/view/latest'); } else { console.log("Trying to get cfg number " + n[1]); return $scope.getCfg(n[1]); } }; $scope.$on('$locationChangeSuccess', pathEvent); $scope.getCfg = function(n) { if ($scope.currentCfg.cfgNum !== n) { return $http.get("" + window.viewPrefix + n).then(function(response) { var d; $scope.currentCfg = response.data; d = new Date($scope.currentCfg.cfgDate * 1000); $scope.currentCfg.date = d.toLocaleString(); console.log("Metadatas of cfg " + n + " loaded"); $location.path("/view/" + n); return $scope.init(); }, function(response) { return readError(response).then(function() { $scope.currentCfg.cfgNum = 0; return $scope.init(); }); }); } else { return $scope.waiting = false; } }; $scope.getLanguage = function(lang) { $scope.lang = lang; $scope.form = 'white'; $scope.init(); return $scope.showM = false; }; $scope.init = function() { var tmp; tmp = null; $scope.waiting = true; $scope.data = []; $scope.confirmNeeded = false; $scope.forceSave = false; $q.all([ $translator.init($scope.lang), $http.get(window.staticPrefix + "struct.json").then(function(response) { tmp = response.data; return console.log("Structure loaded"); }) ]).then(function() { console.log("Starting structure binding"); $scope.data = tmp; tmp = null; if ($scope.currentCfg.cfgNum !== 0) { setScopeVars($scope); } else { $scope.message = { title: 'emptyConf', message: '__zeroConfExplanations__' }; $scope.showModal('message.html'); } $scope.form = 'homeViewer'; return $scope.waiting = false; }, readError); $scope.activeModule = "viewer"; $scope.myStyle = { color: '#ffb84d' }; return $scope.bannerStyle = { 'background-color': "" + window.bannerColor }; }; c = $location.path().match(new RegExp('^/view/(latest|[0-9]+)')); if (!c) { console.log("Redirecting to /view/latest"); return $location.path('/view/latest'); } } ]); }).call(this);