From b882f5f41e8172d87174291ff0c9a60ed993d0cd Mon Sep 17 00:00:00 2001 From: juanmont Date: Fri, 5 May 2017 16:23:58 +0200 Subject: [PATCH] F #5043 Added persistents labels for users and system (#291) --- src/sunstone/models/SunstoneViews.rb | 11 ++ src/sunstone/public/app/utils/labels/tree.js | 57 +++++- src/sunstone/public/app/utils/labels/utils.js | 169 +++++++++++++----- src/sunstone/views/index.erb | 4 + 4 files changed, 200 insertions(+), 41 deletions(-) diff --git a/src/sunstone/models/SunstoneViews.rb b/src/sunstone/models/SunstoneViews.rb index 585b165d46..ddc2489651 100644 --- a/src/sunstone/models/SunstoneViews.rb +++ b/src/sunstone/models/SunstoneViews.rb @@ -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 diff --git a/src/sunstone/public/app/utils/labels/tree.js b/src/sunstone/public/app/utils/labels/tree.js index b188dba8ae..6467b3743d 100644 --- a/src/sunstone/public/app/utils/labels/tree.js +++ b/src/sunstone/public/app/utils/labels/tree.js @@ -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 = '
  • '; } 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 = '
  • '; } 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 = '
  • '; } - + if (!yaml) { + if (!persis) { + html += ''; + } else { + html += ''; + } + } html += ' '; } @@ -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/ diff --git a/src/sunstone/public/app/utils/labels/utils.js b/src/sunstone/public/app/utils/labels/utils.js index 4f9354abac..422b48bf1c 100644 --- a/src/sunstone/public/app/utils/labels/utils.js +++ b/src/sunstone/public/app/utils/labels/utils.js @@ -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( - '
    ' + - '
    ' + Locale.tr('Edit Labels') + '
    ' + - '
    ' + - Tree.html(_makeTree(labels), false) + - '
    ' + - '
    ' + - '' + - '
    ' + - '
    '); - - 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( + '
    ' + + '
    ' + Locale.tr('Edit Labels') + '
    ' + + '
    ' + + Tree.html(_makeTree(labels), false) + + '
    ' + + '
    ' + Locale.tr('System Labels') + '
    ' + + '
    ' + + Tree.html(_makeTree(labels_yaml), false) + + '
    ' + + '
    ' + + '' + + '
    ' + + '
    '); + 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 = - '' + + if(persis){ + var htmlStr = + '' + folderName + ''; + } else if (yaml) { + var htmlStr = + '' + + folderName + + ''; + } else { + var htmlStr = + '' + + folderName + + ''; + } + var tree = { htmlStr: htmlStr, diff --git a/src/sunstone/views/index.erb b/src/sunstone/views/index.erb index f3402e77a1..8f85f6ab18 100644 --- a/src/sunstone/views/index.erb +++ b/src/sunstone/views/index.erb @@ -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] %>',