Diff is usable and traslated ! (#575)

This commit is contained in:
Xavier Guimard 2016-03-22 21:48:17 +00:00
parent 4ff2d16bce
commit cf5d05682c
8 changed files with 67 additions and 20 deletions

View File

@ -15,6 +15,7 @@ llapp.controller 'DiffCtrl', [ '$scope', '$http', '$q', '$translator', '$locatio
$scope.showM = false
$scope.cfg = []
$scope.data = {}
$scope.currentNode = null
# Import translations functions
$scope.translateTitle = (node) ->
@ -25,6 +26,10 @@ llapp.controller 'DiffCtrl', [ '$scope', '$http', '$q', '$translator', '$locatio
$scope.toggle = (scope) ->
scope.toggle()
$scope.stoggle = (scope,node) ->
$scope.currentNode = node
scope.toggle()
# Handle menu items
$scope.menuClick = (button) ->
if button.popup
@ -55,11 +60,14 @@ llapp.controller 'DiffCtrl', [ '$scope', '$http', '$q', '$translator', '$locatio
d = $q.defer()
if not $scope.cfg[b]? or $scope.cfg[b] != n
$http.get("#{confPrefix}#{n}").then (response) ->
$scope.cfg[b] = response.data
date = new Date response.data.cfgDate * 1000
$scope.cfg[b].date = date.toLocaleString()
console.log "Metadatas of cfg #{n} loaded"
d.resolve 'OK'
if response and response.data
$scope.cfg[b] = response.data
date = new Date response.data.cfgDate * 1000
$scope.cfg[b].date = date.toLocaleString()
console.log "Metadatas of cfg #{n} loaded"
d.resolve 'OK'
else
d.reject response
, (response) ->
console.log response
d.reject 'NOK'
@ -181,7 +189,7 @@ llapp.controller 'DiffCtrl', [ '$scope', '$http', '$q', '$translator', '$locatio
getCfg 0, n[1]
getCfg 1, n[2] if n[2]?
]
.then () ->
.then ->
if n[2]?
init()
else
@ -193,6 +201,9 @@ llapp.controller 'DiffCtrl', [ '$scope', '$http', '$q', '$translator', '$locatio
else
$scope.data = []
$scope.waiting = false
, ->
$scope.message = $scope.translate('error')
$scope.waiting = false
true
$scope.$on '$locationChangeSuccess', pathEvent

View File

@ -231,3 +231,9 @@ dl,
min-height: auto;
border: none;
}
.old {
color: #A00;
}
.new {
color: #0A0;
}

View File

@ -1 +1 @@
.tree-node{border-width:1px;border-style:solid;border-radius:4px;margin-bottom:8px}.tree-node-default{background:#fff}.angular-ui-tree-handle{cursor:pointer}#pleaseWait{background-color:#fff;width:100%;min-height:9.9%;height:auto;z-index:5000;position:absolute;left:0;top:0;margin-left:auto;margin-right:auto;padding:30% 20%;text-align:center;opacity:.8;filter:alpha(opacity=80)}.panel .table th{width:20%;vertical-align:middle}ul.cat-tree{list-style-type:square}p.cat-tree-category{font-weight:bold}html,body{margin:0;padding:0;height:100vh;background:radial-gradient(circle at 50% 0,#fff 0,#ddd 100%) no-repeat scroll 0 0 #ddd}header#navbar{height:9vh;margin-bottom:1vh;padding-bottom:0vh}#content{max-height:86vh;height:86vh;margin:0;padding:0;position:relative}header#navbar .navbar-brand{padding:10px 15px}header#navbar .navbar-brand img{background:#fff}textarea{width:100%}textarea#privateKey,textarea#publicKey,textarea#filetext{font-size:8pt}dl,.panel{margin-bottom:8px}.panel-body{padding:5px}.input-group-solid{border:1px solid #CCC;border-radius:4px;padding:6px 12px}.input-group>.input-group-solid:last-child{border-bottom-left-radius:0;border-top-left-radius:0}#cfgnum{position:relative}#cfgnum.label-warning:hover:after{content:attr(comment);padding:4px 8px;color:rgba(0,0,0,0.5);position:absolute;left:100%;bottom:100%;white-space:nowrap;z-index:2;border-radius:5px;background:#f0ad4e}.link{cursor:pointer}#bottom .panel{height:100%;margin-top:8px}#bottom .panel-body{height:100%}#right{display:flex;flex-direction:column}#bottom{flex:1}@media(min-width:768px){.scrollable-sm{max-height:86vh!important;overflow:auto}#right,#left{max-height:86vh!important;height:86vh}#top{overflow-x:hidden}#bottom{height:43vh;overflow:hidden}}#top,#bottom,#right,#left{position:relative}@media(max-width:767px){#right{position:absolute;top:0;z-index:1000}.lmmenu{position:static;float:left;width:100%;min-height:200px;margin-top:0;border:1px solid #ccc;box-shadow:none}#content{position:relative}}.scrollable{overflow:auto}.container{padding-bottom:15px}.hresizer{position:absolute;width:6px;top:0;bottom:0;right:0;background-color:#EEE;cursor:e-resize}.vresizer{position:absolute;height:6px;left:0;right:0;top:0;background-color:#EEE;cursor:n-resize}.angular-ui-tree-empty{min-height:auto;border:0}
.tree-node{border-width:1px;border-style:solid;border-radius:4px;margin-bottom:8px}.tree-node-default{background:#fff}.angular-ui-tree-handle{cursor:pointer}#pleaseWait{background-color:#fff;width:100%;min-height:9.9%;height:auto;z-index:5000;position:absolute;left:0;top:0;margin-left:auto;margin-right:auto;padding:30% 20%;text-align:center;opacity:.8;filter:alpha(opacity=80)}.panel .table th{width:20%;vertical-align:middle}ul.cat-tree{list-style-type:square}p.cat-tree-category{font-weight:bold}html,body{margin:0;padding:0;height:100vh;background:radial-gradient(circle at 50% 0,#fff 0,#ddd 100%) no-repeat scroll 0 0 #ddd}header#navbar{height:9vh;margin-bottom:1vh;padding-bottom:0vh}#content{max-height:86vh;height:86vh;margin:0;padding:0;position:relative}header#navbar .navbar-brand{padding:10px 15px}header#navbar .navbar-brand img{background:#fff}textarea{width:100%}textarea#privateKey,textarea#publicKey,textarea#filetext{font-size:8pt}dl,.panel{margin-bottom:8px}.panel-body{padding:5px}.input-group-solid{border:1px solid #CCC;border-radius:4px;padding:6px 12px}.input-group>.input-group-solid:last-child{border-bottom-left-radius:0;border-top-left-radius:0}#cfgnum{position:relative}#cfgnum.label-warning:hover:after{content:attr(comment);padding:4px 8px;color:rgba(0,0,0,0.5);position:absolute;left:100%;bottom:100%;white-space:nowrap;z-index:2;border-radius:5px;background:#f0ad4e}.link{cursor:pointer}#bottom .panel{height:100%;margin-top:8px}#bottom .panel-body{height:100%}#right{display:flex;flex-direction:column}#bottom{flex:1}@media(min-width:768px){.scrollable-sm{max-height:86vh!important;overflow:auto}#right,#left{max-height:86vh!important;height:86vh}#top{overflow-x:hidden}#bottom{height:43vh;overflow:hidden}}#top,#bottom,#right,#left{position:relative}@media(max-width:767px){#right{position:absolute;top:0;z-index:1000}.lmmenu{position:static;float:left;width:100%;min-height:200px;margin-top:0;border:1px solid #ccc;box-shadow:none}#content{position:relative}}.scrollable{overflow:auto}.container{padding-bottom:15px}.hresizer{position:absolute;width:6px;top:0;bottom:0;right:0;background-color:#EEE;cursor:e-resize}.vresizer{position:absolute;height:6px;left:0;right:0;top:0;background-color:#EEE;cursor:n-resize}.angular-ui-tree-empty{min-height:auto;border:0}.old{color:#A00}.new{color:#0A0}

View File

@ -21,6 +21,7 @@ diff.html script
$scope.showM = false;
$scope.cfg = [];
$scope.data = {};
$scope.currentNode = null;
$scope.translateTitle = function(node) {
return $translator.translateField(node, 'title');
};
@ -29,6 +30,10 @@ diff.html script
$scope.toggle = function(scope) {
return scope.toggle();
};
$scope.stoggle = function(scope, node) {
$scope.currentNode = node;
return scope.toggle();
};
$scope.menuClick = function(button) {
if (button.popup) {
window.open(button.popup);
@ -60,11 +65,15 @@ diff.html script
if (($scope.cfg[b] == null) || $scope.cfg[b] !== n) {
$http.get("" + confPrefix + n).then(function(response) {
var date;
$scope.cfg[b] = response.data;
date = new Date(response.data.cfgDate * 1000);
$scope.cfg[b].date = date.toLocaleString();
console.log("Metadatas of cfg " + n + " loaded");
return d.resolve('OK');
if (response && response.data) {
$scope.cfg[b] = response.data;
date = new Date(response.data.cfgDate * 1000);
$scope.cfg[b].date = date.toLocaleString();
console.log("Metadatas of cfg " + n + " loaded");
return d.resolve('OK');
} else {
return d.reject(response);
}
}, function(response) {
console.log(response);
return d.reject('NOK');
@ -244,6 +253,9 @@ diff.html script
return $scope.waiting = false;
}
}
}, function() {
$scope.message = $scope.translate('error');
return $scope.waiting = false;
});
}
return true;

View File

@ -1 +1 @@
(function(){var a;a=angular.module("llngConfDiff",["ui.tree","ui.bootstrap","llApp","ngCookies"]);a.controller("DiffCtrl",["$scope","$http","$q","$translator","$location",function(l,j,h,c,f){var b,d,m,i,g,e,k;l.links=links;l.menulinks=menulinks;l.staticPrefix=staticPrefix;l.scriptname=scriptname;l.availableLanguages=availableLanguages;l.waiting=true;l.showM=false;l.cfg=[];l.data={};l.translateTitle=function(n){return c.translateField(n,"title")};l.translateP=c.translateP;l.translate=c.translate;l.toggle=function(n){return n.toggle()};l.menuClick=function(n){if(n.popup){window.open(n.popup)}else{if(!n.action){n.action=n.title}switch(typeof n.action){case"function":n.action(l.currentNode,l);break;case"string":l[n.action]();break;default:console.log(typeof n.action)}}return l.showM=false};l.getLanguage=function(n){l.lang=n;l.init();return l.showM=false};d=function(o,q){var p;p=h.defer();if((l.cfg[o]==null)||l.cfg[o]!==q){j.get(""+confPrefix+q).then(function(n){var r;l.cfg[o]=n.data;r=new Date(n.data.cfgDate*1000);l.cfg[o].date=r.toLocaleString();console.log("Metadatas of cfg "+q+" loaded");return p.resolve("OK")},function(n){console.log(n);return p.reject("NOK")})}else{p.resolve()}return p.promise};m=function(){var n;l.message=null;n=h.defer();return j.get(scriptname+"diff/"+l.cfg[0].cfgNum+"/"+l.cfg[1].cfgNum).then(function(o){var p;p=[];p=g(o.data[0],o.data[1]);l.data=b(p);l.message="";return l.waiting=false},function(o){return l.message=(l.translate("error"))+" : "+o.statusLine})};g=function(s,r,t){var o,q,p,n;if(t==null){t=true}q=[];for(o in s){n=s[o];if(t){p={title:l.translate(o),id:o}}else{p={title:o}}if(!o.match(/^cfg(?:Num|Log|Author(?:IP)?|Date)$/)){if(typeof n==="object"){if(n.constructor==="array"){p.oldvalue=n;p.newvalue=r[o]}else{if(typeof r[o]==="object"){p.nodes=g(s[o],r[o],false)}else{p.oldnodes=k(n,"old")}}}else{p.oldvalue=n;p.newvalue=r[o]}q.push(p)}}for(o in r){n=r[o];if(!((o.match(/^cfg(?:Num|Log|Author(?:IP)?|Date)$/))||(s[o]!=null))){if(t){p={title:l.translate(o),id:o}}else{p={title:o}}if(typeof n==="object"){if(n.constructor==="array"){p.newvalue=n}else{p.newnodes=k(n,"new")}}else{p.newvalue=n}q.push(p)}}return q};k=function(t,r){var o,q,p,n;q=[];for(o in t){n=t[o];p={title:o};if(typeof n==="object"){if(n.constructor==="array"){p[r+"value"]=n}else{p[r+"nodes"]=k(t[o],r)}}else{p[r+"value"]=n}q.push(p)}return q};e=[];b=function(w){var q,B,x,u,r,y,v,s,o,p,t,A,z;if(e==null){return w}z=[];for(x=0,y=w.length;x<y;x++){q=w[x];t=z;A=e[q.id]!=null?e[q.id].split("/"):"";for(u=0,v=A.length;u<v;u++){p=A[u];if(p.length>0){if(t.length){B=false;for(r=0,s=t.length;r<s;r++){o=t[r];if(o.title===p){t=o.nodes;B=true}}if(!B){t.push({title:l.translate(p),nodes:[]});t=t[t.length-1].nodes}}else{t.push({title:l.translate(p),nodes:[]});t=t[0].nodes}}}t.push(q)}return z};l.newDiff=function(){return f.path("/"+l.cfg[0].cfgNum+"/"+l.cfg[1].cfgNum)};i=function(p,o,q){var r;r=o.match(new RegExp("#/(latest|[0-9]+)(?:/(latest|[0-9]+))?$"));if(r===null){f.path("/latest")}else{l.waiting=true;h.all([c.init(l.lang),j.get(staticPrefix+"reverseTree.json").then(function(n){e=n.data;return console.log("Structure loaded")}),d(0,r[1]),r[2]!=null?d(1,r[2]):void 0]).then(function(){if(r[2]!=null){return m()}else{if(l.cfg[0].prev){l.cfg[1]=l.cfg[0];return d(0,l.cfg[1].prev).then(function(){return m()})}else{l.data=[];return l.waiting=false}}})}return true};return l.$on("$locationChangeSuccess",i)}])}).call(this);
(function(){var a;a=angular.module("llngConfDiff",["ui.tree","ui.bootstrap","llApp","ngCookies"]);a.controller("DiffCtrl",["$scope","$http","$q","$translator","$location",function(l,j,h,c,f){var b,d,m,i,g,e,k;l.links=links;l.menulinks=menulinks;l.staticPrefix=staticPrefix;l.scriptname=scriptname;l.availableLanguages=availableLanguages;l.waiting=true;l.showM=false;l.cfg=[];l.data={};l.currentNode=null;l.translateTitle=function(n){return c.translateField(n,"title")};l.translateP=c.translateP;l.translate=c.translate;l.toggle=function(n){return n.toggle()};l.stoggle=function(n,o){l.currentNode=o;return n.toggle()};l.menuClick=function(n){if(n.popup){window.open(n.popup)}else{if(!n.action){n.action=n.title}switch(typeof n.action){case"function":n.action(l.currentNode,l);break;case"string":l[n.action]();break;default:console.log(typeof n.action)}}return l.showM=false};l.getLanguage=function(n){l.lang=n;l.init();return l.showM=false};d=function(o,q){var p;p=h.defer();if((l.cfg[o]==null)||l.cfg[o]!==q){j.get(""+confPrefix+q).then(function(n){var r;if(n&&n.data){l.cfg[o]=n.data;r=new Date(n.data.cfgDate*1000);l.cfg[o].date=r.toLocaleString();console.log("Metadatas of cfg "+q+" loaded");return p.resolve("OK")}else{return p.reject(n)}},function(n){console.log(n);return p.reject("NOK")})}else{p.resolve()}return p.promise};m=function(){var n;l.message=null;n=h.defer();return j.get(scriptname+"diff/"+l.cfg[0].cfgNum+"/"+l.cfg[1].cfgNum).then(function(o){var p;p=[];p=g(o.data[0],o.data[1]);l.data=b(p);l.message="";return l.waiting=false},function(o){return l.message=(l.translate("error"))+" : "+o.statusLine})};g=function(s,r,t){var o,q,p,n;if(t==null){t=true}q=[];for(o in s){n=s[o];if(t){p={title:l.translate(o),id:o}}else{p={title:o}}if(!o.match(/^cfg(?:Num|Log|Author(?:IP)?|Date)$/)){if(typeof n==="object"){if(n.constructor==="array"){p.oldvalue=n;p.newvalue=r[o]}else{if(typeof r[o]==="object"){p.nodes=g(s[o],r[o],false)}else{p.oldnodes=k(n,"old")}}}else{p.oldvalue=n;p.newvalue=r[o]}q.push(p)}}for(o in r){n=r[o];if(!((o.match(/^cfg(?:Num|Log|Author(?:IP)?|Date)$/))||(s[o]!=null))){if(t){p={title:l.translate(o),id:o}}else{p={title:o}}if(typeof n==="object"){if(n.constructor==="array"){p.newvalue=n}else{p.newnodes=k(n,"new")}}else{p.newvalue=n}q.push(p)}}return q};k=function(t,r){var o,q,p,n;q=[];for(o in t){n=t[o];p={title:o};if(typeof n==="object"){if(n.constructor==="array"){p[r+"value"]=n}else{p[r+"nodes"]=k(t[o],r)}}else{p[r+"value"]=n}q.push(p)}return q};e=[];b=function(w){var q,B,x,u,r,y,v,s,o,p,t,A,z;if(e==null){return w}z=[];for(x=0,y=w.length;x<y;x++){q=w[x];t=z;A=e[q.id]!=null?e[q.id].split("/"):"";for(u=0,v=A.length;u<v;u++){p=A[u];if(p.length>0){if(t.length){B=false;for(r=0,s=t.length;r<s;r++){o=t[r];if(o.title===p){t=o.nodes;B=true}}if(!B){t.push({title:l.translate(p),nodes:[]});t=t[t.length-1].nodes}}else{t.push({title:l.translate(p),nodes:[]});t=t[0].nodes}}}t.push(q)}return z};l.newDiff=function(){return f.path("/"+l.cfg[0].cfgNum+"/"+l.cfg[1].cfgNum)};i=function(p,o,q){var r;r=o.match(new RegExp("#/(latest|[0-9]+)(?:/(latest|[0-9]+))?$"));if(r===null){f.path("/latest")}else{l.waiting=true;h.all([c.init(l.lang),j.get(staticPrefix+"reverseTree.json").then(function(n){e=n.data;return console.log("Structure loaded")}),d(0,r[1]),r[2]!=null?d(1,r[2]):void 0]).then(function(){if(r[2]!=null){return m()}else{if(l.cfg[0].prev){l.cfg[1]=l.cfg[0];return d(0,l.cfg[1].prev).then(function(){return m()})}else{l.data=[];return l.waiting=false}}},function(){l.message=l.translate("error");return l.waiting=false})}return true};return l.$on("$locationChangeSuccess",i)}])}).call(this);

View File

@ -340,6 +340,7 @@
"newPostVar": "New variable",
"newRSAKey": "New keys",
"newRule": "New rule",
"newValue": "New value",
"next": "Next",
"noAjaxHook": "Keep redirections for Ajax",
"noDatas": "No datas to display",
@ -367,6 +368,7 @@
"nullParams": "Null parameters",
"number": "Number",
"off": "Off",
"oldValue": "Old value",
"on": "On",
"oidcAuthnLevel": "Authentication level",
"oidcOP": "OpenID Connect Provider",

View File

@ -340,6 +340,7 @@
"newPostVar": "Nouvelle variable",
"newRSAKey": "Nouvelles clefs",
"newRule": "Nouvelle règle",
"newValue": "Nouvelle valeur",
"next": "Suivante",
"noAjaxHook": "Conserver les redirections pour Ajax",
"noDatas": "Aucune donnée à afficher",
@ -367,6 +368,7 @@
"nullParams": "Paramètres Null",
"number": "Numéro",
"off": "Désactivé",
"oldValue": "Ancienne valeur",
"on": "Activé",
"oidcAuthnLevel": "Niveau d'authentification",
"oidcOP": "Fournisseur OpenID Connect",

View File

@ -40,17 +40,31 @@
<!-- Right div -->
<div id="right" class="col-lg-8 col-md-8 col-sm-7 col-xs-12 scrollable" ng-class="{'hidden-xs':showT&&!showM}">
<h1 ng-if="message">{{message}}</h1>
<pre>
{{data | json }}
</pre>
<h2 ng-if="message">{{message}}</h2>
<div class="panel panel-default" ng-if="currentNode">
<div class="panel-heading">
<h3 class="panel-title">{{currentNode.title}}</h3>
</div>
<table class="table table-striped">
<tr ng-show="currentNode.oldvalue">
<th><span class="old" trspan="oldValue"></span></th>
<td ng-show="currentNode.oldvalue.constructor === 'array'">{{currentNode.oldvalue|json}}</td>
<td ng-hide="currentNode.oldvalue.constructor === 'array'">{{currentNode.oldvalue}}</td>
</tr>
<tr ng-show="currentNode.newvalue">
<th><span class="new" trspan="newValue"></span></th>
<td ng-show="currentNode.newvalue.constructor === 'array'">{{currentNode.newvalue|json}}</td>
<td ng-hide="currentNode.newvalue.constructor === 'array'">{{currentNode.newvalue}}</td>
</tr>
</table>
</div>
</div>
</div>
<script type="text/ng-template" id="nodes_renderer.html">
<div ui-tree-handle class="tree-node tree-node-content panel-info tree-node-default">
<span ng-include="'arrow.html'"></span>
<span ng-click="toggle(this)">{{node.title}}</span>
<span ng-click="stoggle(this,node)">{{node.title}}</span>
</div>
<ol ui-tree-nodes="" ng-model="node" ng-class="{hidden: collapsed}" ng-include="'subnodes.html'">
</ol>
@ -58,7 +72,7 @@
<script type="text/ng-template" id="newnodes_renderer.html">
<div ui-tree-handle class="tree-node tree-node-content panel-info tree-node-default">
<span ng-include="'arrow.html'"></span>
<span ng-click="toggle(this)" style="color:#0A0">{{node.title}}</span>
<span ng-click="stoggle(this,node)" class="new">{{node.title}}</span>
</div>
<ol ui-tree-nodes="" ng-model="node" ng-class="{hidden: collapsed}" ng-include="'subnodes.html'">
</ol>
@ -66,7 +80,7 @@
<script type="text/ng-template" id="oldnodes_renderer.html">
<div ui-tree-handle class="tree-node tree-node-content panel-info tree-node-default">
<span ng-include="'arrow.html'"></span>
<span ng-click="toggle(this)" style="color:#A00">{{node.title}}</span>
<span ng-click="stoggle(this,node)" class="old">{{node.title}}</span>
</div>
<ol ui-tree-nodes="" ng-model="node" ng-class="{hidden: collapsed}" ng-include="'subnodes.html'">
</ol>