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

feature #3748: Add user settings tab

TODO user group quotas
This commit is contained in:
Daniel Molina 2015-06-15 18:51:02 +02:00
parent bcd74c856b
commit f399df791c
10 changed files with 295 additions and 26 deletions

View File

@ -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() {

View File

@ -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,

View File

@ -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: '<i class="fa fa-lg fa-fw fa-cog"></i>&emsp;' + Locale.tr("Settings"),
listHeader: '<i class="fa fa-cog"></i>&emsp;' + Locale.tr("Settings"),
resource: 'Settings',
actions: _actions,
content: '<span class="fa-stack fa-2x" style="color: #dfdfdf">' +
'<i class="fa fa-cloud fa-stack-2x"></i>' +
'<i class="fa fa-spinner fa-spin fa-stack-1x fa-inverse"></i>' +
'</span>',
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)))
}
})
}
});

View File

@ -0,0 +1,3 @@
define(function(require){
return 'settings-tab';
});

View File

@ -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
},

View File

@ -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('<select id="table_order_select">' +
'<option value="asc">' + Locale.tr("ascending") + '</option>' +
'<option value="desc">' + Locale.tr("descending") + '</option>' +
'</select>');
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('<select id="language_select">' +
Locale.language_options +
'</select>');
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 += '<option value="'+view+'">'+view+'</option>';
});
$(".value_td_view", context).html('<select id="view_select">' +
options +
'</select>');
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;
}
});

View File

@ -28,6 +28,33 @@
<td class="value_td">{{element.AUTH_DRIVER}}</td>
<td></td>
</tr>
<tr>
<td class="key_td">{{tr "Table Order"}}</td>
<td class="value_td_table_order">{{valOrDefault element.TEMPLATE.TABLE_ORDER "-"}}</td>
<td>
<div id="div_edit_table_order">
<a id="div_edit_table_order_link" class="edit_e" href="#"> <i class="fa fa-pencil-square-o right"/></a>
</div>
</td>
</tr>
<tr>
<td class="key_td">{{tr "Language"}}</td>
<td class="value_td_language">{{valOrDefault element.TEMPLATE.LANG "-"}}</td>
<td>
<div id="div_edit_language">
<a id="div_edit_language_link" class="edit_e" href="#"> <i class="fa fa-pencil-square-o right"/></a>
</div>
</td>
</tr>
<tr>
<td class="key_td">{{tr "View"}}</td>
<td class="value_td_view">{{valOrDefault element.TEMPLATE.DEFAULT_VIEW "-"}}</td>
<td>
<div id="div_edit_view">
<a id="div_edit_view_link" class="edit_e" href="#"> <i class="fa fa-pencil-square-o right"/></a>
</div>
</td>
</tr>
</tbody>
</table>
</div>

View File

@ -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;

View File

@ -1,8 +1,30 @@
define(function(require) {
var LANGUAGE_OPTIONS =
'<option value="en_US">English (en_US)</option>\
<option value="ca">Catalan (ca)</option>\
<option value="cs_CZ">Czech (cs_CZ)</option>\
<option value="nl_NL">Dutch (nl_NL)</option>\
<option value="da">Danish (da)</option>\
<option value="fr_FR">French (fr_FR)</option>\
<option value="de">German (de)</option>\
<option value="el_GR">Greek (el_GR)</option>\
<option value="it_IT">Italian (it_IT)</option>\
<option value="ja">Japanese (ja)</option>\
<option value="lt_LT">Lithuanian (lt_LT)</option>\
<option value="fa_IR">Persian (fa_IR)</option>\
<option value="pl">Polish (pl)</option>\
<option value="pt_BR">Portuguese (pt_BR)</option>\
<option value="pt_PT">Portuguese (pt_PT)</option>\
<option value="ru_RU">Russian (ru_RU)</option>\
<option value="zh_CN">Simplified Chinese (zh_CN)</option>\
<option value="sk_SK">Slovak (sk_SK)</option>\
<option value="es_ES">Spanish (es_ES)</option>\
<option value="zh_TW">Traditional Chinese (zh_TW)</option>';
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
}
});

View File

@ -137,7 +137,7 @@
</head>
<body class="antialiased">
<div class="row">
<div class="small-12 large-2 columns left-content" style="padding-top: 45px">
<div class="small-12 large-2 columns left-content" style="padding-top: 35px">
<div id="menu" class="row left-body">
<ul class="side-nav" id="navigation">
<div class="row left-header">