diff --git a/src/sunstone/public/app/app.js b/src/sunstone/public/app/app.js index 47c0423167..fe02550d4c 100644 --- a/src/sunstone/public/app/app.js +++ b/src/sunstone/public/app/app.js @@ -1,6 +1,7 @@ define(function(require) { require('jquery'); + var DASHBOARD_TAB_ID = require('tabs/dashboard-tab/tabId'); var Sunstone = require('sunstone'); var _tabs = [ @@ -25,7 +26,8 @@ define(function(require) { require('tabs/marketplace-tab'), require('tabs/oneflow-dashboard'), require('tabs/oneflow-services-tab'), - require('tabs/oneflow-templates-tab') + require('tabs/oneflow-templates-tab'), + require('tabs/settings-tab') ]; var _commonDialogs = [ @@ -43,6 +45,8 @@ define(function(require) { Sunstone.insertTabs(); _setupAccordion(); + + Sunstone.showTab(DASHBOARD_TAB_ID); }); function _setupAccordion() { diff --git a/src/sunstone/public/app/sunstone.js b/src/sunstone/public/app/sunstone.js index ee4dcff28b..6c2f948f31 100644 --- a/src/sunstone/public/app/sunstone.js +++ b/src/sunstone/public/app/sunstone.js @@ -524,26 +524,21 @@ define(function(require) { $('.top_button, .list_button', context).attr('disabled', false); } - var _insertPanels = function(tabName, info) { - var context = $(".right-info", $("#" + tabName)); + var _insertPanels = function(tabName, info, contextTabId, context) { + var context = context || $(".right-info", $("#" + tabName)); var containerId = tabName + '-panels'; var activaTab = $("dd.active a", $("#" + containerId)); if (activaTab) { var activaTabHref = activaTab.attr('href'); } - var templateAttrs = { - 'containerId': containerId, - 'panels': [] - } - var panels = SunstoneCfg['tabs'][tabName].panels; var active = false; var templatePanelsParams = [] var panelInstances = [] $.each(panels, function(panelName, Panel) { - if (Config.isTabPanelEnabled(tabName, panelName)) { + if (Config.isTabPanelEnabled((contextTabId||tabName), panelName)) { if (activaTabHref) { if (activaTabHref == "#" + panelName) { active = true; @@ -554,7 +549,7 @@ define(function(require) { } try { - var panelInstance = new Panel(info); + var panelInstance = new Panel(info, contextTabId); panelInstances.push(panelInstance); templatePanelsParams.push({ 'panelName': panelName, diff --git a/src/sunstone/public/app/tabs/settings-tab.js b/src/sunstone/public/app/tabs/settings-tab.js new file mode 100644 index 0000000000..14a56cbd5d --- /dev/null +++ b/src/sunstone/public/app/tabs/settings-tab.js @@ -0,0 +1,63 @@ +define(function(require) { + var Locale = require('utils/locale'); + var OpenNebulaUser = require('opennebula/user') + var Sunstone = require('sunstone'); + + var TAB_ID = require('./settings-tab/tabId'); + var USERS_TAB_ID = require('tabs/users-tab/tabId'); + + var _buttons = { + "Settings.refresh" : { + type: "action", + layout: "refresh", + alwaysActive: true + } + }; + + var _actions = { + "Settings.refresh" : { + type: "custom", + call: _onShow + }, + } + + var _dialogs = [ + ]; + + var _userPanels = [ + require('tabs/users-tab/panels/info'), + require('tabs/users-tab/panels/quotas'), + require('tabs/users-tab/panels/accounting'), + require('tabs/users-tab/panels/showback') + ]; + + var _formPanels = [ + require('./acls-tab/form-panels/create') + ]; + + var Tab = { + tabId: TAB_ID, + title: ' ' + Locale.tr("Settings"), + listHeader: ' ' + Locale.tr("Settings"), + resource: 'Settings', + actions: _actions, + content: '' + + '' + + '' + + '', + dialogs: _dialogs + }; + + return Tab; + + function _onShow() { + OpenNebulaUser.show({ + data : { + id: -1 + }, + success: function(request, user_json) { + Sunstone.insertPanels(USERS_TAB_ID, user_json, TAB_ID, $(".right-list", $("#" + TAB_ID))) + } + }) + } +}); diff --git a/src/sunstone/public/app/tabs/settings-tab/tabId.js b/src/sunstone/public/app/tabs/settings-tab/tabId.js new file mode 100644 index 0000000000..493127bba2 --- /dev/null +++ b/src/sunstone/public/app/tabs/settings-tab/tabId.js @@ -0,0 +1,3 @@ +define(function(require){ + return 'settings-tab'; +}); \ No newline at end of file diff --git a/src/sunstone/public/app/tabs/users-tab/actions.js b/src/sunstone/public/app/tabs/users-tab/actions.js index d8fe5e9686..9aa00c21c1 100644 --- a/src/sunstone/public/app/tabs/users-tab/actions.js +++ b/src/sunstone/public/app/tabs/users-tab/actions.js @@ -150,6 +150,35 @@ define(function(require) { call: OpenNebulaResource.update, callback: function(request) { Sunstone.runAction(RESOURCE+'.show',request.request.data[0][0]); + if (request.request.data[0][0] == config['user_id']) { + Sunstone.runAction('Settings.refresh'); + } + }, + error: Notifier.onError + }, + + "User.update_language" : { + type: "single", + call: OpenNebulaResource.update, + callback: function(request) { + Sunstone.runAction(RESOURCE+'.show',request.request.data[0][0]); + if (request.request.data[0][0] == config['user_id']) { + Sunstone.runAction('Settings.refresh'); + } + Notifier.notifyMessage(Locale.tr("The user must refresh the page for the change to take effect")); + }, + error: Notifier.onError + }, + + "User.update_view" : { + type: "single", + call: OpenNebulaResource.update, + callback: function(request) { + Sunstone.runAction(RESOURCE+'.show',request.request.data[0][0]); + if (request.request.data[0][0] == config['user_id']) { + Sunstone.runAction('Settings.refresh'); + } + Notifier.notifyMessage(Locale.tr("The user must refresh the page for the change to take effect")); }, error: Notifier.onError }, diff --git a/src/sunstone/public/app/tabs/users-tab/panels/info.js b/src/sunstone/public/app/tabs/users-tab/panels/info.js index 13f7a765c9..727d7d7ce7 100644 --- a/src/sunstone/public/app/tabs/users-tab/panels/info.js +++ b/src/sunstone/public/app/tabs/users-tab/panels/info.js @@ -56,7 +56,7 @@ define(function(require) { var secondaryGroups; - if(typeof this.element.GROUPS.ID == "object"){ + if (typeof this.element.GROUPS.ID == "object") { secondaryGroups = this.element.GROUPS.ID.join(","); } else { secondaryGroups = "-"; @@ -65,6 +65,9 @@ define(function(require) { // TODO: simplify interface? var strippedTemplate = $.extend({}, this.element.TEMPLATE); delete strippedTemplate["SSH_PUBLIC_KEY"]; + delete strippedTemplate["LANG"]; + delete strippedTemplate["TABLE_ORDER"]; + delete strippedTemplate["DEFAULT_VIEW"]; var templateTableHTML = TemplateTable.html(strippedTemplate, RESOURCE, Locale.tr("Attributes")); @@ -85,11 +88,23 @@ define(function(require) { // TODO: simplify interface? var strippedTemplate = $.extend({}, this.element.TEMPLATE); delete strippedTemplate["SSH_PUBLIC_KEY"]; + delete strippedTemplate["LANG"]; + delete strippedTemplate["TABLE_ORDER"]; + delete strippedTemplate["DEFAULT_VIEW"]; var hiddenValues = {}; - if (this.element.TEMPLATE.SSH_PUBLIC_KEY != undefined){ - hiddenValues.SSH_PUBLIC_KEY = this.element.TEMPLATE.SSH_PUBLIC_KEY; + if (this.element.TEMPLATE.SSH_PUBLIC_KEY != undefined) { + hiddenValues.SSH_PUBLIC_KEY = this.element.TEMPLATE.SSH_PUBLIC_KEY; + } + if (this.element.TEMPLATE.LANG != undefined) { + hiddenValues.LANG = this.element.TEMPLATE.LANG; + } + if (this.element.TEMPLATE.TABLE_ORDER != undefined) { + hiddenValues.TABLE_ORDER = this.element.TEMPLATE.TABLE_ORDER; + } + if (this.element.TEMPLATE.DEFAULT_VIEW != undefined) { + hiddenValues.DEFAULT_VIEW = this.element.TEMPLATE.DEFAULT_VIEW; } TemplateTable.setup(strippedTemplate, RESOURCE, this.element.ID, context, hiddenValues); @@ -112,13 +127,13 @@ define(function(require) { // SSH input context.off("click", ".user_ssh_public_key_edit"); - context.on("click", ".user_ssh_public_key_edit", function(){ + context.on("click", ".user_ssh_public_key_edit", function() { $("#user_ssh_public_key_text", context).hide(); $("#user_ssh_public_key_textarea", context).show().focus(); }); context.off("change", "#user_ssh_public_key_textarea"); - context.on("change", "#user_ssh_public_key_textarea", function(){ + context.on("change", "#user_ssh_public_key_textarea", function() { var user_id = that.element.ID; // TODO: use update --append instead of a show + update @@ -127,13 +142,13 @@ define(function(require) { data : { id: user_id }, - success: function(request,user_json){ + success: function(request, user_json) { var template = that.element.TEMPLATE; template["SSH_PUBLIC_KEY"] = $("#user_ssh_public_key_textarea", context).val(); template_str = ""; - $.each(template,function(key,value){ + $.each(template, function(key, value) { template_str += (key + '=' + '"' + value + '"\n'); }); @@ -143,11 +158,120 @@ define(function(require) { }); context.off("focusout", "#user_ssh_public_key_textarea"); - context.on("focusout", "#user_ssh_public_key_textarea", function(){ + context.on("focusout", "#user_ssh_public_key_textarea", function() { $("#user_ssh_public_key_text", context).show(); $("#user_ssh_public_key_textarea", context).hide(); }); + // Change table Order + context.off("click", "#div_edit_table_order") + context.on("click", "#div_edit_table_order", function() { + $(".value_td_table_order", context).html(''); + + if (that.element.TEMPLATE.TABLE_ORDER) { + $('#table_order_select', context).val(that.element.TEMPLATE.TABLE_ORDER); + } + }); + + context.off("change", "#table_order_select") + context.on("change", "#table_order_select", function() { + var user_id = that.element.ID; + OpenNebulaUser.show({ + data : { + id: user_id + }, + success: function(request, user_json) { + var template = that.element.TEMPLATE; + + template["TABLE_ORDER"] = $("#table_order_select", context).val(); + + template_str = ""; + $.each(template, function(key, value) { + template_str += (key + '=' + '"' + value + '"\n'); + }); + + Sunstone.runAction("User.update_template", user_id, template_str); + } + }); + }); + + // Change language + context.off("click", "#div_edit_language") + context.on("click", "#div_edit_language", function() { + $(".value_td_language", context).html(''); + + if (that.element.TEMPLATE.LANG) { + $('#language_select', context).val(that.element.TEMPLATE.LANG); + } + }); + + context.off("change", "#language_select") + context.on("change", "#language_select", function() { + var user_id = that.element.ID; + OpenNebulaUser.show({ + data : { + id: user_id + }, + success: function(request, user_json) { + var template = that.element.TEMPLATE; + + template["LANG"] = $("#language_select", context).val(); + + template_str = ""; + $.each(template, function(key, value) { + template_str += (key + '=' + '"' + value + '"\n'); + }); + + Sunstone.runAction("User.update_language", user_id, template_str); + } + }); + }); + + // Change view + context.off("click", "#div_edit_view") + context.on("click", "#div_edit_view", function() { + var options = ''; + $.each( config['available_views'], function(id, view) { + options += ''; + }); + + $(".value_td_view", context).html(''); + + if (that.element.TEMPLATE.DEFAULT_VIEW) { + $('#view_select', context).val(that.element.TEMPLATE.DEFAULT_VIEW); + } + }); + + context.off("change", "#view_select") + context.on("change", "#view_select", function() { + var user_id = that.element.ID; + OpenNebulaUser.show({ + data : { + id: user_id + }, + success: function(request, user_json) { + var template = that.element.TEMPLATE; + + template["DEFAULT_VIEW"] = $("#view_select", context).val(); + + template_str = ""; + $.each(template, function(key, value) { + template_str += (key + '=' + '"' + value + '"\n'); + }); + + Sunstone.runAction("User.update_view", user_id, template_str); + } + }); + }); + return false; } }); + \ No newline at end of file diff --git a/src/sunstone/public/app/tabs/users-tab/panels/info/html.hbs b/src/sunstone/public/app/tabs/users-tab/panels/info/html.hbs index aa9a487ef4..e99a021b7a 100644 --- a/src/sunstone/public/app/tabs/users-tab/panels/info/html.hbs +++ b/src/sunstone/public/app/tabs/users-tab/panels/info/html.hbs @@ -28,6 +28,33 @@ {{element.AUTH_DRIVER}} + + {{tr "Table Order"}} + {{valOrDefault element.TEMPLATE.TABLE_ORDER "-"}} + +
+ +
+ + + + {{tr "Language"}} + {{valOrDefault element.TEMPLATE.LANG "-"}} + +
+ +
+ + + + {{tr "View"}} + {{valOrDefault element.TEMPLATE.DEFAULT_VIEW "-"}} + +
+ +
+ + diff --git a/src/sunstone/public/app/tabs/users-tab/panels/quotas.js b/src/sunstone/public/app/tabs/users-tab/panels/quotas.js index accf89f58b..7cbbd2c0d7 100644 --- a/src/sunstone/public/app/tabs/users-tab/panels/quotas.js +++ b/src/sunstone/public/app/tabs/users-tab/panels/quotas.js @@ -21,7 +21,8 @@ define(function(require) { CONSTRUCTOR */ - function Panel(info) { + function Panel(info, tabId) { + this.tabId = tabId || TAB_ID; this.title = Locale.tr("Quotas"); this.icon = "fa-align-left"; @@ -44,14 +45,14 @@ define(function(require) { return QuotaWidgets.initQuotasPanel( this.element, QuotaDefaults.getDefaultQuotas(RESOURCE), - Config.isTabActionEnabled(TAB_ID, RESOURCE+".quotas_dialog")); + Config.isTabActionEnabled(this.tabId, RESOURCE+".quotas_dialog")); } function _setup(context) { QuotaWidgets.setupQuotasPanel( this.element, context, - Config.isTabActionEnabled(TAB_ID, RESOURCE+".quotas_dialog"), + Config.isTabActionEnabled(this.tabId, RESOURCE+".quotas_dialog"), RESOURCE); return false; diff --git a/src/sunstone/public/app/utils/locale.js b/src/sunstone/public/app/utils/locale.js index dccc8dd857..528fe2b10c 100644 --- a/src/sunstone/public/app/utils/locale.js +++ b/src/sunstone/public/app/utils/locale.js @@ -1,8 +1,30 @@ define(function(require) { + var LANGUAGE_OPTIONS = + '\ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + '; + var MONTHS = new Array( - tr("January"),tr("February"),tr("March"),tr("April"),tr("May"), - tr("June"),tr("July"),tr("August"),tr("September"),tr("October"), - tr("November"),tr("December")); + tr("January"), tr("February"), tr("March"), tr("April"), tr("May"), + tr("June"), tr("July"), tr("August"), tr("September"), tr("October"), + tr("November"), tr("December")); function tr(str) { // TODO Add locale from the locale folder @@ -16,6 +38,7 @@ define(function(require) { return { 'tr': tr, - 'months': MONTHS + 'months': MONTHS, + 'language_options': LANGUAGE_OPTIONS } }); diff --git a/src/sunstone/views/index.erb b/src/sunstone/views/index.erb index c83fd255d0..274eee451b 100644 --- a/src/sunstone/views/index.erb +++ b/src/sunstone/views/index.erb @@ -137,7 +137,7 @@
-
+