1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-03-21 14:50:08 +03:00

F #5043 Added persistents labels for users and system (#291)

This commit is contained in:
juanmont 2017-05-05 16:23:58 +02:00 committed by Tino Vázquez
parent 7734743c3d
commit b882f5f41e
4 changed files with 200 additions and 41 deletions

View File

@ -131,6 +131,17 @@ class SunstoneViews
@views.keys
end
def get_all_labels(group_name)
labels = []
if @views_config['labels_groups'][group_name]
@views_config['labels_groups'][group_name].each{|l| labels.push(l)}
end
if @views_config['labels_groups']['default']
@views_config['labels_groups']['default'].each{|l| labels.push(l)}
end
return labels
end
def logo
@views_config['logo']
end

View File

@ -16,6 +16,9 @@
define(function(require) {
var Locale = require('utils/locale');
var OpenNebulaUser = require('opennebula/user');
var Sunstone = require('sunstone');
var TemplateUtils = require('utils/template-utils');
/*
CONSTRUCTOR
@ -61,6 +64,8 @@ define(function(require) {
html = '<li><i class="left tree-toggle fa fa-fw fa-angle-right"></i> ';
} else {
var title = $(tree.htmlStr).attr('title');
var persis = $(tree.htmlStr).attr('persis');
var yaml = $(tree.htmlStr).attr('yaml');
var color = _labelHue(title);
if (title != undefined && title != "") {
@ -82,6 +87,8 @@ define(function(require) {
html = '<li><i class="left tree-toggle fa fa-fw fa-angle-down"></i> ';
} else {
var title = $(tree.htmlStr).attr('title');
var persis = $(tree.htmlStr).attr('persis');
var yaml = $(tree.htmlStr).attr('yaml');
var color = _labelHue(title);
if (title != undefined && title != "") {
@ -89,7 +96,13 @@ define(function(require) {
} else {
html = '<li>';
}
if (!yaml) {
if (!persis) {
html += '<a class="lock" type="unlock" title="' + title + '"><i class="left fa fa-fw fa-unlock" style="color:hsl(' + color + ', 90%, 70%);"></i></a>';
} else {
html += '<a class="lock" type="lock" title="' + title + '"><i class="left fa fa-fw fa-lock" style="color:hsl(' + color + ', 90%, 70%);"></i></a>';
}
}
html += '<i class="left fa fa-fw fa-tag"></i> ';
}
@ -131,6 +144,48 @@ define(function(require) {
$('.one-label', this).addClass('active');
}
});
$(".lock", context).on("click", function(){
var type = $(this).attr("type");
var title = $(this).attr("title");
if (type == "unlock"){
$(".fa-unlock", this).attr("class", "left fa fa-fw fa-lock");
$(this).attr("type", "lock");
} else {
$(".fa-lock", this).attr("class", "left fa fa-fw fa-unlock");
$(this).attr("type", "unlock");
}
var that = this;
OpenNebulaUser.show({
data : {
id: config['user_id']
},
success: function(request, user_json) {
var final_template = {};
if (user_json["USER"]["TEMPLATE"]) {
if (user_json["USER"]["TEMPLATE"]["LABELS"]) {
var titles = user_json["USER"]["TEMPLATE"]["LABELS"].split(",");
var pos = titles.indexOf(title);
if (type == "lock" && pos != -1){ //unlock
titles.splice(pos, 1);
$(this).removeAttr("locked");
} else if (type == "unlock" && pos == -1) { //lock
titles.push(title);
$(this).attr("locked", "true");
}
user_json["USER"]["TEMPLATE"]["LABELS"] = titles.join(",");
} else {
user_json["USER"]["TEMPLATE"]["LABELS"] = title;
}
if (user_json["USER"]["TEMPLATE"]["LABELS"] == ""){
delete user_json["USER"]["TEMPLATE"]["LABELS"];
}
template_str = TemplateUtils.templateToString(user_json["USER"]["TEMPLATE"]);
Sunstone.runAction("User.update_template", config['user_id'], template_str);
}
}
});
});
}
// http://werxltd.com/wp/2010/05/13/javascript-implementation-of-javas-string-hashcode-method/

View File

@ -23,6 +23,7 @@ define(function(require) {
var Locale = require('utils/locale');
var Notifier = require('utils/notifier');
var TemplateUtils = require('utils/template-utils');
var OpenNebulaUser = require('opennebula/user');
var LABELS_ATTR = 'LABELS';
@ -117,20 +118,59 @@ define(function(require) {
var labelsDropdown = $('#' + tabName + 'LabelsDropdown');
var labels = _getLabels(dataTable, labelsColumn);
labelsDropdown.html(
'<div>' +
'<h6>' + Locale.tr('Edit Labels') + '</h6>' +
'<div class="labeltree-container">' +
Tree.html(_makeTree(labels), false) +
'</div>' +
'<div class="input-container">' +
'<input type="text" class="newLabelInput" placeholder="' + Locale.tr("Add Label") + '"/>' +
'</div>' +
'</div>');
Tree.setup(labelsDropdown);
OpenNebulaUser.show({
data : {
id: config['user_id']
},
success: function(request, user_json) {
var labels_persis = '';
if (user_json["USER"]["TEMPLATE"]) {
if (user_json["USER"]["TEMPLATE"]["LABELS"]) {
labels_persis = user_json["USER"]["TEMPLATE"]["LABELS"];
}
}
var labels = _getLabels(dataTable, labelsColumn);
labels_persis = _deserializeLabels(labels_persis);
var array_labels_yaml = [];
$.each(config['all_labels'], function(index){
array_labels_yaml.push(config['all_labels'][index]+'_YAML');
if(labels[config['all_labels'][index]]){
delete labels[config['all_labels'][index]];
}
})
var labels_yaml = _deserializeLabels(array_labels_yaml.join(','));
var keys = Object.keys(labels_persis).sort();
for (var i = 0; i < keys.length; i++){
if(labels[keys[i]]){
delete labels[keys[i]];
}
labels_persis[keys[i]+"_PERSIS"] = labels_persis[keys[i]];
delete labels_persis[keys[i]];
}
$.extend(labels, labels_persis);
labelsDropdown.html(
'<div>' +
'<h6>' + Locale.tr('Edit Labels') + '</h6>' +
'<div class="labeltree-container">' +
Tree.html(_makeTree(labels), false) +
'</div>' +
'<h6>' + Locale.tr('System Labels') + '</h6>' +
'<div class="labeltree-container">' +
Tree.html(_makeTree(labels_yaml), false) +
'</div>' +
'<div class="input-container">' +
'<input type="text" class="newLabelInput" placeholder="' + Locale.tr("Add Label") + '"/>' +
'</div>' +
'</div>');
Tree.setup(labelsDropdown);
recountLabels();
$('[data-toggle="' + tabName + 'LabelsDropdown"]').off('click');
$('[data-toggle="' + tabName + 'LabelsDropdown"]').on('click', function(){
recountLabels();
});
}
});
/*
Update Dropdown with selected items
[v] If all the selected items has a label
@ -183,12 +223,6 @@ define(function(require) {
$('.newLabelInput', labelsDropdown).focus();
}
recountLabels();
$('[data-toggle="' + tabName + 'LabelsDropdown"]').off('click');
$('[data-toggle="' + tabName + 'LabelsDropdown"]').on('click', function(){
recountLabels();
});
/*
Check/Uncheck label & Update Templates
*/
@ -204,25 +238,44 @@ define(function(require) {
action = 'remove';
$(that).removeClass('fa-check-square-o fa-minus-square-o').addClass('fa-square-o');
}
var labelName = $('.one-label', $(that).closest('li')).attr('one-label-full-name');
var labelsArray, labelIndex;
var selectedItems = tabTable.elements();
$.each(selectedItems, function(index, resourceId) {
labelsStr = _getLabel(tabName, dataTable, labelsColumn, resourceId);
if (labelsStr != '') {
labelsArray = labelsStr.split(',')
} else {
labelsArray = []
}
labelIndex = $.inArray(labelName, labelsArray);
if (action == 'add' && labelIndex == -1) {
labelsArray.push(labelName)
_updateResouceLabels(tabName, resourceId, labelsArray);
} else if (action == 'remove' && labelIndex != -1) {
labelsArray.splice(labelIndex, 1);
_updateResouceLabels(tabName, resourceId, labelsArray);
OpenNebulaUser.show({
data : {
id: config['user_id']
},
success: function(request, user_json) {
var labels_persis = '';
if (user_json["USER"]["TEMPLATE"]) {
if (user_json["USER"]["TEMPLATE"]["LABELS"]) {
labels_persis = user_json["USER"]["TEMPLATE"]["LABELS"];
}
}
var labelName = $('.one-label', $(that).closest('li')).attr('one-label-full-name');
var labelsArray,labelsArray_persis, labelIndex;
var selectedItems = tabTable.elements();
if (labels_persis != '') {
labelsArray_persis = labels_persis.split(',')
} else {
labelsArray_persis = []
}
$.each(selectedItems, function(index, resourceId) {
labelsStr = _getLabel(tabName, dataTable, labelsColumn, resourceId);
if (labelsStr != '') {
labelsArray = labelsStr.split(',')
} else {
labelsArray = []
}
labelIndex = $.inArray(labelName, labelsArray);
if (action == 'add' && labelIndex == -1) {
labelsArray.push(labelName)
_updateResouceLabels(tabName, resourceId, labelsArray);
} else if (action == 'remove' && labelIndex != -1) {
if ((!labelsArray_persis || (labelsArray_persis && $.inArray(labelName, labelsArray_persis) == -1)) ||
(!config['all_labels'] || (config['all_labels'] && $.inArray(labelName, config['all_labels']) == -1))) {
labelsArray.splice(labelIndex, 1);
_updateResouceLabels(tabName, resourceId, labelsArray);
}
}
});
}
});
});
@ -342,11 +395,47 @@ define(function(require) {
}
function _makeSubTree(parentName, folderName, childs, currentLabel) {
var name_split = folderName.split("_");
var persis = false;
var yaml = false;
if(name_split.indexOf("PERSIS") > -1){
folderName = "";
$.each(name_split, function(value){
if(name_split[value] != "PERSIS"){
folderName += name_split[value]+"_";
}
});
folderName = folderName.slice(0,-1);
persis = true;
}
else if(name_split.indexOf("YAML") > -1){
folderName = "";
$.each(name_split, function(value){
if(name_split[value] != "YAML"){
folderName += name_split[value]+"_";
}
});
folderName = folderName.slice(0,-1);
yaml = true;
}
var fullName = parentName + folderName;
var htmlStr =
'<span class="secondary one-label" title="' + fullName + '" one-label-full-name="' + fullName + '">' +
if(persis){
var htmlStr =
'<span class="secondary one-label" persis="true" title="' + fullName + '" one-label-full-name="' + fullName + '">' +
folderName +
'</span>';
} else if (yaml) {
var htmlStr =
'<span class="secondary one-label" yaml="true" title="' + fullName + '" one-label-full-name="' + fullName + '">' +
folderName +
'</span>';
} else {
var htmlStr =
'<span class="secondary one-label" title="' + fullName + '" one-label-full-name="' + fullName + '">' +
folderName +
'</span>';
}
var tree = {
htmlStr: htmlStr,

View File

@ -22,6 +22,9 @@
var available_views = JSON.parse('["<%=
$views_config.available_views(session[:user], session[:user_gname]).join('","')
%>"]')
var all_labels = JSON.parse('["<%=
$views_config.get_all_labels(session[:user_gname]).join('","')
%>"]')
var all_views = JSON.parse('["<%=
$views_config.get_all_views.join('","')
%>"]')
@ -42,6 +45,7 @@
},
'view' : view,
'available_views' : available_views,
'all_labels' : all_labels,
'all_views' : all_views,
'user_id' : '<%= session[:user_id] %>',
'user_gid' : '<%= session[:user_gid] %>',