mirror of
https://github.com/YunoHost/yunohost-admin.git
synced 2024-09-03 20:06:15 +02:00
Merge stretch-unstable, propagate button stuff to new pages (especially permissions)
This commit is contained in:
commit
4504caa0cc
25 changed files with 931 additions and 696 deletions
|
@ -38,4 +38,4 @@ https://example.com/yunohost/admin/views/domain/domain_list.ms)
|
|||
* Font-Awesome 4.5.0
|
||||
* Handlebars 1.3.0
|
||||
* Sammy 0.7.6
|
||||
* Jquery-Cookie 2.1.0
|
||||
* JS-cookie 2.1.0
|
||||
|
|
12
debian/changelog
vendored
12
debian/changelog
vendored
|
@ -1,3 +1,15 @@
|
|||
yunohost-admin (3.7.0) testing; urgency=low
|
||||
|
||||
- [enh] Add UI for groups and permissions (YunoHost-admin#257)
|
||||
- [mod] Rework migration system to have independent migrations (YunoHost-admin#258)
|
||||
- [enh] Quite a lot of messages improvements, string cleaning, language rework... (YunoHost-admin/10ea04a, YunoHost-admin#265)
|
||||
- [i18n] Improved translations for Catalan, Occitan, French, Esperanto, Arabic, German, Spanish, Norwegian Bokmål, Portuguese
|
||||
- [fix] Inline buttons responsiveness on migration screen (YunoHost-admin#259)
|
||||
|
||||
Thanks to all contributors <3 ! (accross all repo: Yunohost, Moulinette, SSOwat, Yunohost-admin) : advocatux, Aksel K., Aleks, Allan N., amirale qt, Armin P., Bram, ButterflyOfFire, Carles S. A., chema o. r., decentral1se, Emmanuel V., Etienne M., Filip B., Geoff M., htsr, Jibec, Josué, Julien J., Kayou, liberodark, ljf, lucaskev, Lukas D., madtibo, Martin D., Mélanie C., nr 458 h, pitfd, ppr, Quentí, sidddy, troll, tufek yamero, xaloc33, yalh76
|
||||
|
||||
-- Alexandre Aubin <alex.aubin@mailoo.org> Thu, 31 Oct 2019 19:00:00 +0000
|
||||
|
||||
yunohost-admin (3.6.5) stable; urgency=low
|
||||
|
||||
- [fix] Stupid / buggy error handling for postinstall (2187657)
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
"private": true,
|
||||
"dependencies": {
|
||||
"bootstrap": "3.3.6",
|
||||
"font-awesome": "4.5.0",
|
||||
"fork-awesome": "1.1.7",
|
||||
"handlebars-helper-intl": "1.1.2",
|
||||
"handlebars": "4.0.11",
|
||||
"sammy": "0.7.6",
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
/*
|
||||
* FontAwesome
|
||||
*/
|
||||
@import "../bower_components/font-awesome/less/font-awesome.less";
|
||||
@import "../bower_components/fork-awesome/less/fork-awesome.less";
|
||||
|
||||
|
||||
// Fixes
|
||||
|
@ -101,6 +101,10 @@ button {
|
|||
color: transparent;
|
||||
}
|
||||
|
||||
.label {
|
||||
border-radius: 1px;
|
||||
}
|
||||
|
||||
/*
|
||||
* The top heading of the doc
|
||||
*
|
||||
|
@ -698,6 +702,71 @@ input[type='radio'].nice-radio {
|
|||
}
|
||||
|
||||
|
||||
/** Groups View **/
|
||||
#view-groups {
|
||||
.panel-heading a {
|
||||
text-decoration: none;
|
||||
}
|
||||
.group-delete {
|
||||
font-size: 24px;
|
||||
line-height: 24px;
|
||||
padding: 0;
|
||||
float:right;
|
||||
color:lighten(@label-danger-bg, 20%);
|
||||
:hover {
|
||||
color:@label-danger-bg;
|
||||
}
|
||||
}
|
||||
.panel-body {
|
||||
h3 {
|
||||
margin-top:0;
|
||||
}
|
||||
button.dropdown-toggle {
|
||||
line-height: 15.666px;
|
||||
top: -1.666px;
|
||||
}
|
||||
.dropdown-menu {
|
||||
max-height: 200px;
|
||||
overflow-y: auto;
|
||||
|
||||
button {
|
||||
background: none;
|
||||
}
|
||||
}
|
||||
.label-removable {
|
||||
// The following match properties from regular btn's
|
||||
display:inline-block;
|
||||
font-size:14px;
|
||||
color:#333;
|
||||
background-color:#f8f8f8;
|
||||
border: #ccc 1px solid;
|
||||
font-weight: normal;
|
||||
margin-bottom:0;
|
||||
position: relative;
|
||||
top: -1.666px;
|
||||
height: 29.666px;
|
||||
vertical-align: middle;
|
||||
padding: 6px 12px;
|
||||
|
||||
margin-right:7px; // Spacing between labels
|
||||
|
||||
> button {
|
||||
line-height: 12px;
|
||||
margin-left:6px;
|
||||
padding: 0;
|
||||
padding-left:6px;
|
||||
border-left: #ccc 1px solid;
|
||||
color:lighten(@label-info-bg,20);
|
||||
|
||||
text-decoration: none;
|
||||
}
|
||||
> button:hover {
|
||||
color:@label-info-bg;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Flash messages **/
|
||||
#flashMessage {
|
||||
max-height: 120px;
|
||||
|
|
|
@ -71,7 +71,7 @@ gulp.task('js-lint', function() {
|
|||
// Fonts
|
||||
gulp.task('fonts', function() {
|
||||
return gulp.src([
|
||||
'bower_components/font-awesome/fonts/*',
|
||||
'bower_components/fork-awesome/fonts/*',
|
||||
'bower_components/source-code-pro/EOT/*.eot',
|
||||
'bower_components/source-code-pro/OTF/*.otf',
|
||||
'bower_components/source-code-pro/TTF/*.ttf',
|
||||
|
|
|
@ -202,8 +202,10 @@
|
|||
// Get app information
|
||||
app.get('#/apps/:app', function (c) {
|
||||
c.api('GET', '/apps/'+c.params['app']+'?raw', {}, function(data) {
|
||||
// Presentation
|
||||
data.settings.allowed_users = (data.settings.allowed_users) ? data.settings.allowed_users.replace(',', ', ')+"." : y18n.t('everyone_has_access');
|
||||
c.api('GET', '/users/permissions', {}, function(data_permissions) {
|
||||
|
||||
// Permissions
|
||||
data.permissions = data_permissions.permissions[c.params['app']+".main"]["allowed"];
|
||||
|
||||
// Multilingual description
|
||||
data.description = (typeof data.manifest.description[y18n.locale] !== 'undefined') ?
|
||||
|
@ -243,12 +245,6 @@
|
|||
});
|
||||
});
|
||||
});
|
||||
|
||||
// Get app debug page
|
||||
app.get('#/apps/:app/debug', function (c) {
|
||||
c.api('GET', '/apps/'+c.params['app']+'/debug', {}, function(data) {
|
||||
c.view('app/app_debug', data);
|
||||
});
|
||||
});
|
||||
|
||||
//
|
||||
|
@ -624,129 +620,6 @@
|
|||
);
|
||||
});
|
||||
|
||||
// Manage app access
|
||||
app.get('#/apps/:app/access', function (c) {
|
||||
c.api('GET', '/apps/'+c.params['app']+'?raw', {}, function(data) {
|
||||
c.api('GET', '/users', {}, function(dataUsers) {
|
||||
|
||||
// allowed_users as array
|
||||
if (typeof data.settings.allowed_users !== 'undefined') {
|
||||
if (data.settings.allowed_users.length === 0) {
|
||||
// Force empty array, means no user has access
|
||||
data.settings.allowed_users = [];
|
||||
}
|
||||
else {
|
||||
data.settings.allowed_users = data.settings.allowed_users.split(',');
|
||||
}
|
||||
} else {
|
||||
data.settings.allowed_users = []; // Force array
|
||||
// if 'allowed_users' is undefined, everyone has access
|
||||
// that means that undefined is different from empty array
|
||||
data.settings.allow_everyone = true;
|
||||
}
|
||||
|
||||
// Available users
|
||||
data.users = [];
|
||||
$.each(dataUsers.users, function(username, user){
|
||||
// Do not list allowed_users in select list
|
||||
if ( data.settings.allowed_users.indexOf(username) === -1 ) {
|
||||
data.users.push({
|
||||
value: username,
|
||||
label: user.fullname+' ('+user.mail+')'
|
||||
});
|
||||
} else {
|
||||
// Complete allowed_users data
|
||||
data.settings.allowed_users[data.settings.allowed_users.indexOf(username)] = {
|
||||
username: username,
|
||||
fullname: user.fullname,
|
||||
mail: user.mail,
|
||||
};
|
||||
}
|
||||
});
|
||||
|
||||
c.view('app/app_access', data);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
// Remove all access
|
||||
app.get('#/apps/:app/access/remove', function (c) {
|
||||
c.confirm(
|
||||
y18n.t('applications'),
|
||||
y18n.t('confirm_access_remove_all', [c.params['app']]),
|
||||
function() {
|
||||
var params = {
|
||||
apps: c.params['app'],
|
||||
users: []
|
||||
};
|
||||
c.api('DELETE', '/access?'+c.serialize(params), params, function(data) {
|
||||
c.redirect_to('#/apps/'+ c.params['app']+ '/access', {slide:false});
|
||||
});
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
// Remove access to a specific user
|
||||
app.get('#/apps/:app/access/remove/:user', function (c) {
|
||||
c.confirm(
|
||||
y18n.t('applications'),
|
||||
y18n.t('confirm_access_remove_user', [c.params['app'], c.params['user']]),
|
||||
function() {
|
||||
var params = {
|
||||
apps: c.params['app'],
|
||||
users: c.params['user']
|
||||
};
|
||||
c.api('DELETE', '/access?'+c.serialize(params), params, function(data) {
|
||||
c.redirect_to('#/apps/'+ c.params['app']+ '/access', {slide:false});
|
||||
});
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
// Grant all access
|
||||
app.get('#/apps/:app/access/add', function (c) {
|
||||
c.confirm(
|
||||
y18n.t('applications'),
|
||||
y18n.t('confirm_access_add', [c.params['app']]),
|
||||
function() {
|
||||
var params = {
|
||||
apps: c.params['app'],
|
||||
users: null
|
||||
};
|
||||
c.api('PUT', '/access', params, function() {
|
||||
c.redirect_to('#/apps/'+ c.params['app'] +'/access', {slide:false});
|
||||
});
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
// Grant access for a specific user
|
||||
app.post('#/apps/:app/access/add', function (c) {
|
||||
var params = {
|
||||
users: c.params['user'],
|
||||
apps: c.params['app']
|
||||
};
|
||||
c.api('PUT', '/access', params, function() {
|
||||
c.redirect_to('#/apps/'+ c.params['app'] +'/access', {slide:false});
|
||||
});
|
||||
});
|
||||
|
||||
// Clear access (reset)
|
||||
app.get('#/apps/:app/access/clear', function (c) {
|
||||
c.confirm(
|
||||
y18n.t('applications'),
|
||||
y18n.t('confirm_access_clear', [c.params['app']]),
|
||||
function() {
|
||||
var params = {
|
||||
apps: c.params['app']
|
||||
};
|
||||
c.api('POST', '/access', params, function() {
|
||||
c.redirect_to('#/apps/'+ c.params['app'] +'/access', {slide:false});
|
||||
});
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
// Get app change label page
|
||||
app.get('#/apps/:app/changelabel', function (c) {
|
||||
c.api('GET', '/apps/'+c.params['app']+'?raw', {}, function(app_data) {
|
||||
|
|
|
@ -100,7 +100,7 @@
|
|||
y18n.t('domains'),
|
||||
y18n.t('confirm_change_maindomain'),
|
||||
function() {
|
||||
c.api('PUT', '/domains/main', {new_domain: domain}, function() { c.refresh() });
|
||||
c.api('PUT', '/domains/main', {new_main_domain: domain}, function() { c.refresh() });
|
||||
}
|
||||
)
|
||||
});
|
||||
|
@ -212,6 +212,7 @@
|
|||
status: status_,
|
||||
actions_enabled : actions_enabled
|
||||
};
|
||||
|
||||
c.view('domain/domain_cert', data_, function() {
|
||||
// Configure install / renew buttons behavior
|
||||
$("button[data-action]").on("click", function () {
|
||||
|
|
|
@ -1,48 +0,0 @@
|
|||
(function() {
|
||||
// Get application context
|
||||
var app = Sammy.apps['#main'];
|
||||
var store = app.store;
|
||||
|
||||
/**
|
||||
* Monitor
|
||||
*
|
||||
*/
|
||||
|
||||
// Server monitoring
|
||||
app.get('#/tools/monitor', function (c) {
|
||||
var monitorData = {};
|
||||
|
||||
// Why this method ?
|
||||
c.api('GET', '/services/glances', {}, function(data) {
|
||||
monitorData.status = true;
|
||||
|
||||
if (data.status == 'running') {
|
||||
c.api('GET', '/monitor/system', {}, function(data) {
|
||||
monitorData.system = data;
|
||||
|
||||
c.api('GET', '/monitor/disk', {}, function(data) {
|
||||
monitorData.disk = data;
|
||||
|
||||
c.api('GET', '/monitor/network', {}, function(data) {
|
||||
monitorData.network = data;
|
||||
|
||||
// Remove useless interface
|
||||
delete monitorData.network.usage.lo;
|
||||
|
||||
// Get YunoHost versions too
|
||||
c.api('GET', '/diagnosis', {}, function(diagnosis) {
|
||||
monitorData.versions = diagnosis.packages;
|
||||
c.view('tools/tools_monitoring', monitorData);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
else {
|
||||
monitorData.status = false;
|
||||
c.view('tools/tools_monitoring', monitorData);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
})();
|
|
@ -5,6 +5,184 @@
|
|||
|
||||
var PASSWORD_MIN_LENGTH = 4;
|
||||
|
||||
// A small utility to convert a string to title case
|
||||
// e.g. "hAvE a NicE dAy" --> "Have A Nice Day"
|
||||
// Savagely stolen from https://stackoverflow.com/a/196991
|
||||
function toTitleCase(str) {
|
||||
return str.replace(
|
||||
/\w\S*/g,
|
||||
function(txt) {
|
||||
return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Groups and permissions
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* Update group or permissions
|
||||
*
|
||||
* @model data organize in the same way than /users/groups?full&include_primary_groups
|
||||
* @params.operation "add"|"remove"
|
||||
* @params.type "members"|"permissions"
|
||||
* @param.item Name of the user or the permission to add or remove
|
||||
* @param.group Name of the group affected
|
||||
*
|
||||
* This function is built to be apply with params generated by the use of
|
||||
* HTML dataset attributes (e.g. link in the partial inline view "label" in group_list.ms)
|
||||
*
|
||||
* @return void
|
||||
**/
|
||||
function updateGroup(model, params) {
|
||||
var type = params.type;
|
||||
var action = params.action;
|
||||
var item = params.item;
|
||||
var groupname = params.group;
|
||||
var group = data.groups[groupname];
|
||||
var to = (action == 'add')?group[type]:group[type + 'Inv'];
|
||||
var from = (action == 'add')?group[type+'Inv']:group[type];
|
||||
// Do nothing, if array of destination already contains the item
|
||||
if (from.indexOf(item) === -1) return;
|
||||
|
||||
// Hack to disable pacman loader if any
|
||||
if ($('div.loader').length === 0) {
|
||||
$('#main').append('<div class="loader loader-content" style="display: none"></div>');
|
||||
}
|
||||
$('div.loader').css('display', 'none');
|
||||
|
||||
// Update group
|
||||
var params = {}; var url;
|
||||
if (type == 'members') {
|
||||
url = '/users/groups/' + groupname;
|
||||
params[action] = [item];
|
||||
}
|
||||
else {
|
||||
url = '/users/permissions/' + item;
|
||||
params[action] = [groupname];
|
||||
}
|
||||
c.api('PUT', url, params, function(data_update) {
|
||||
to.push(item);
|
||||
from.splice(from.indexOf(item), 1);
|
||||
updateView(data);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the view with the new model
|
||||
*
|
||||
* @model data organize in the same way than /users/groups?full&include_primary_groups
|
||||
*
|
||||
* @return void
|
||||
**/
|
||||
function updateView(model) {
|
||||
// Sort in aphanumerical order to improve user experience
|
||||
for (var group in model.groups) {
|
||||
model.groups[group].permissions.sort();
|
||||
model.groups[group].permissionsInv.sort();
|
||||
model.groups[group].members.sort();
|
||||
model.groups[group].membersInv.sort();
|
||||
}
|
||||
|
||||
// Manual render, we don't use c.view to avoid scrollTop and other
|
||||
// uneeded behaviour
|
||||
var rendered = c.render('views/user/group_list.ms', model);
|
||||
rendered.swap(function () {
|
||||
// Add click event to get a nice "reactive" interface
|
||||
$("button[data-action='add'], button[data-action='remove']").on('click', function (e) {
|
||||
updateGroup(model, $(this)[0].dataset);
|
||||
return false;
|
||||
});
|
||||
$('button[data-action="add-user-specific-permission"]').on('click', function (e) {
|
||||
data.groups[$(this).data("user")].display = true;
|
||||
updateView(data);
|
||||
return false;
|
||||
});
|
||||
$('button[data-action="delete-group"]').on('click', function (e) {
|
||||
|
||||
var group = $(this).data("group");
|
||||
|
||||
c.confirm(
|
||||
y18n.t('groups'),
|
||||
$('<div>'+ y18n.t('confirm_delete', [group]) +'</div>'),
|
||||
function() {
|
||||
c.api('DELETE', '/users/groups/'+ group, {}, function(data) { c.refresh(); });
|
||||
}
|
||||
);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
app.get('#/groups', function (c) {
|
||||
c.api('GET', '/users/groups?full&include_primary_groups', {}, function(data_groups) {
|
||||
c.api('GET', '/users', {}, function(data_users) {
|
||||
c.api('GET', '/users/permissions?short', {}, function(data_permissions) {
|
||||
//var perms = data_permissions.permissions;
|
||||
var specific_perms = {};
|
||||
var all_perms = data_permissions.permissions;
|
||||
var users = Object.keys(data_users.users);
|
||||
|
||||
// Enrich groups data with primary group indicator and inversed items list
|
||||
for (var group in data_groups.groups) {
|
||||
data_groups.groups[group].primary = users.indexOf(group) !== -1;
|
||||
data_groups.groups[group].permissionsInv = all_perms.filter(function(item) {
|
||||
return data_groups.groups[group].permissions.indexOf(item) === -1;
|
||||
}).filter(function(item) {
|
||||
return group != "visitors" || (item != "mail.main" && item != "xmpp.main"); // Remove 'email' and 'xmpp' in visitors's permission choice list
|
||||
});
|
||||
data_groups.groups[group].membersInv = users.filter(function(item) {
|
||||
return data_groups.groups[group].members.indexOf(item) === -1;
|
||||
});
|
||||
}
|
||||
|
||||
// Declare all_users and visitors has special
|
||||
data_groups.groups['all_users'].special = true;
|
||||
data_groups.groups['visitors'].special = true;
|
||||
|
||||
// Data given to the view with 2 functions to convert technical
|
||||
// permission id to display names
|
||||
data = {
|
||||
'groups':data_groups.groups,
|
||||
'displayPermission': function (text) {
|
||||
// Display a permission correctly for a human
|
||||
text = text.replace('.main', '');
|
||||
if (text.indexOf('.') > -1)
|
||||
text = text.replace('.', ' (') + ')';
|
||||
|
||||
if (text == "mail")
|
||||
text = "E-mail";
|
||||
else if (text == "xmpp")
|
||||
text = "XMPP";
|
||||
else
|
||||
text = toTitleCase(text);
|
||||
|
||||
return text;
|
||||
},
|
||||
'displayUser': function (text) {
|
||||
return text;
|
||||
},
|
||||
};
|
||||
updateView(data);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
// Create a new group
|
||||
app.get('#/groups/create', function (c) {
|
||||
c.view('user/group_create', {});
|
||||
});
|
||||
|
||||
app.post('#/groups/create', function (c) {
|
||||
c.params['groupname'] = c.params['groupname'].replace(' ', '_').toLowerCase();
|
||||
c.api('POST', '/users/groups', c.params.toHash(), function(data) {
|
||||
c.redirect_to('#/groups');
|
||||
});
|
||||
});
|
||||
|
||||
/**
|
||||
* Users
|
||||
*
|
||||
|
@ -222,7 +400,7 @@
|
|||
});
|
||||
}
|
||||
}
|
||||
}, 'GET');
|
||||
});
|
||||
});
|
||||
|
||||
})();
|
||||
|
|
|
@ -265,6 +265,17 @@
|
|||
|
||||
c.hideLoader();
|
||||
|
||||
// Get modal element
|
||||
var box = $('#modal');
|
||||
|
||||
// Modal title
|
||||
if (typeof title === 'string' && title.length) {
|
||||
$('.title', box).html(title);
|
||||
}
|
||||
else {
|
||||
box.addClass('no-title');
|
||||
}
|
||||
|
||||
// Modal content
|
||||
$('.content', box).html(content);
|
||||
|
||||
|
@ -280,12 +291,10 @@
|
|||
|
||||
$('#modal footer button').unbind( "click" );
|
||||
// Reset & Hide modal
|
||||
box
|
||||
.removeClass('no-title')
|
||||
.modal('hide');
|
||||
box.removeClass('no-title').modal('hide');
|
||||
|
||||
// Do corresponding callback
|
||||
if ($(this).data('action') == 'confirm') {
|
||||
if ($(this).data('modal-action') == 'confirm') {
|
||||
confirmCallback();
|
||||
}
|
||||
else {
|
||||
|
|
|
@ -101,12 +101,43 @@
|
|||
|
||||
// equality stuff because mustache/Handlebars is lame
|
||||
// source https://stackoverflow.com/a/31632215
|
||||
Handlebars.registerHelper('eq', function(a, b) {
|
||||
Handlebars.registerHelper({
|
||||
eq: function(a, b) {
|
||||
return a === b;
|
||||
},
|
||||
neq: function(a, b) {
|
||||
return a !== b;
|
||||
},
|
||||
lt: function (v1, v2) {
|
||||
return v1 < v2;
|
||||
},
|
||||
gt: function (v1, v2) {
|
||||
return v1 > v2;
|
||||
},
|
||||
lte: function (v1, v2) {
|
||||
return v1 <= v2;
|
||||
},
|
||||
gte: function (v1, v2) {
|
||||
return v1 >= v2;
|
||||
},
|
||||
and: function () {
|
||||
return Array.prototype.slice.call(arguments).every(function (arg) {
|
||||
return (Array.isArray(arg))?arg.length !== 0:arg;
|
||||
});
|
||||
},
|
||||
or: function () {
|
||||
return Array.prototype.slice.call(arguments, 0, -1).some(function (arg) {
|
||||
return (Array.isArray(arg))?arg.length !== 0:arg;
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
Handlebars.registerHelper('neq', function(a, b) {
|
||||
return a !== b;
|
||||
// Be able to call a function given in context
|
||||
Handlebars.registerHelper('call', function () {
|
||||
var args = Array.prototype.slice.call(arguments);
|
||||
var func = args.shift();
|
||||
args.pop();
|
||||
return func.apply(null, args);
|
||||
});
|
||||
|
||||
Handlebars.registerHelper('in', function(a) {
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
"remove": "Suprimir",
|
||||
"administration_password": "Contrasenya d'administració",
|
||||
"allowed_users": "Usuaris permesos",
|
||||
"api_not_responding": "L'API no respon",
|
||||
"api_not_responding": "L'API de YunoHost no respon. Pot ser que «yunohost-api» estigui caigut o s'hagi reiniciat?",
|
||||
"app_access": "Accés",
|
||||
"app_access_addall_btn": "Habilitar l'accés a tots els utilitzadors",
|
||||
"app_access_addall_desc": "Tots els usuaris existents tindran accés a %s.",
|
||||
|
@ -18,7 +18,7 @@
|
|||
"app_change_url": "Canvia l'URL",
|
||||
"app_debug_no_logs": "Els registres de l'aplicació no estan disponibles",
|
||||
"app_debug_tab": "Mostra la informació de depuració",
|
||||
"app_info_access_desc": "Administrar l'accés d'usuaris. Usuaris permesos: %s",
|
||||
"app_info_access_desc": "Grups / usuaris autoritzats actualment a accedir a aquesta aplicació:",
|
||||
"app_info_changelabel_desc": "Canvia l'etiqueta de l'aplicació al portal.",
|
||||
"app_info_debug_desc": "Mostrar la informació de depuració per aquesta aplicació.",
|
||||
"app_info_default_desc": "Redirigeix l'arrel del domini a aquesta aplicació (%s).",
|
||||
|
@ -437,5 +437,20 @@
|
|||
"request_help": "ajuda necessària",
|
||||
"request_help_details": "El desenvolupador actual necessita ajuda per mantenir aquesta aplicació. Podeu contribuir-hi!",
|
||||
"advanced": "Avançat",
|
||||
"from_to": "de %s fins a %s"
|
||||
"from_to": "de %s fins a %s",
|
||||
"group": "Grup",
|
||||
"group_name": "Nom del grup",
|
||||
"group_all_users": "Tots els usuaris",
|
||||
"group_visitors": "Visitants",
|
||||
"group_format_name_help": "Podeu utilitzar caràcters alfanumèrics i l'espai",
|
||||
"group_add_member": "Afegir usuari",
|
||||
"group_explain_all_users": "Aquest és un grup especial que conté tots els comptes d'usuari del servidor",
|
||||
"group_add_permission": "Afegir permís",
|
||||
"group_new": "Nou grup",
|
||||
"group_explain_visitors": "Aquest és un grup especial que representa els visitants anònims",
|
||||
"group_specific_permissions": "Permisos específics de l'usuari",
|
||||
"groups_and_permissions": "Grups i permisos",
|
||||
"groups_and_permissions_manage": "Gestionar grups i usuaris",
|
||||
"permissions": "Permisos",
|
||||
"nobody": "Ningú"
|
||||
}
|
||||
|
|
|
@ -5,22 +5,11 @@
|
|||
"advanced": "Advanced",
|
||||
"remove": "Remove",
|
||||
"administration_password": "Administration password",
|
||||
"allowed_users": "Allowed users",
|
||||
"all_apps": "All apps",
|
||||
"api_not_responding": "The YunoHost API is not responding. Maybe 'yunohost-api' is down or got restarted?",
|
||||
"app_access": "Access",
|
||||
"app_access_addall_btn": "Enable access to all",
|
||||
"app_access_addall_desc": "All existing users will have access to %s.",
|
||||
"app_access_clearall_btn": "Clear all access",
|
||||
"app_access_clearall_desc": "Every user will have access to %s.",
|
||||
"app_access_removeall_btn": "Remove all access",
|
||||
"app_access_removeall_desc": "No users will have access to %s.",
|
||||
"app_access_title": "%s access",
|
||||
"app_change_label": "Change Label",
|
||||
"app_change_url": "Change URL",
|
||||
"app_debug_no_logs": "Application's logs are not available",
|
||||
"app_debug_tab": "Display debug information",
|
||||
"app_info_access_desc": "Manage user access. Allowed users: %s",
|
||||
"app_info_access_desc": "Groups / users currently allowed to access this app:",
|
||||
"app_info_changelabel_desc": "Change app label in the portal.",
|
||||
"app_info_debug_desc": "Display debugging information for this application.",
|
||||
"app_info_default_desc": "Redirect domain root to this application (%s).",
|
||||
|
@ -46,7 +35,6 @@
|
|||
"application": "Application",
|
||||
"applications": "Applications",
|
||||
"archive_empty": "Empty archive",
|
||||
"available": "Available",
|
||||
"available_apps": "Available apps",
|
||||
"backup": "Backup",
|
||||
"backup_action": "Backup",
|
||||
|
@ -62,17 +50,10 @@
|
|||
"backup_type": "Type",
|
||||
"backups_no": "No backup",
|
||||
"begin": "Begin",
|
||||
"bit_rate": "Bit rate",
|
||||
"both": "Both",
|
||||
"cancel": "Cancel",
|
||||
"check": "Check",
|
||||
"check_mx": "MX record",
|
||||
"check_stmp": "port 25 access",
|
||||
"close": "Close",
|
||||
"confirm_access_add": "Are you sure you want to add access to %s for all users?",
|
||||
"confirm_access_clear": "Are you sure you want to clear all access to %s?",
|
||||
"confirm_access_remove_all": "Are you sure you want to remove all access to %s?",
|
||||
"confirm_access_remove_user": "Are you sure you want to remove access to %s for %s?",
|
||||
"confirm_app_change_url": "Are you sure you want to change the app access URL?",
|
||||
"confirm_app_default": "Are you sure you want to make this app default?",
|
||||
"confirm_change_maindomain": "Are you sure you want to change the main domain?",
|
||||
|
@ -100,10 +81,7 @@
|
|||
"confirm_reboot_action_shutdown": "Are you sure you want to shutdown your server?",
|
||||
"connection": "Connection",
|
||||
"copy": "Copy",
|
||||
"count_min": "%s min",
|
||||
"cpu_load": "CPU Load",
|
||||
"created_at": "Created at",
|
||||
"cumulative_usage": "Cumulative usage",
|
||||
"current_maintainer_title": "Current maintainer of this package",
|
||||
"custom_app_install": "Install custom app",
|
||||
"custom_app_url_only_github": "Currently only from GitHub",
|
||||
|
@ -117,7 +95,6 @@
|
|||
"diagnosis_with_private": "Diagnosis with private data",
|
||||
"disable": "Disable",
|
||||
"disabled": "Disabled",
|
||||
"disk": "Disk",
|
||||
"dns": "DNS",
|
||||
"domain": "Domain",
|
||||
"domain_add": "Add domain",
|
||||
|
@ -146,18 +123,28 @@
|
|||
"error_server": "Server error",
|
||||
"error_server_unexpected": "Unexpected server error (%s)",
|
||||
"error_connection_interrupted": "The server closed the connection instead of answering it. Has nginx or the yunohost-api been restarted or stoppted for some reason? (Error code/message: %s)",
|
||||
"everyone_has_access": "Everyone has access.",
|
||||
"experimental_warning": "Warning: this feature is experimental and not consider stable, you shouldn't be using it except if you know what you are doing.",
|
||||
"filesystem": "Filesystem",
|
||||
"firewall": "Firewall",
|
||||
"footer_version": "Powered by <a href='https://yunohost.org'>YunoHost</a> %s (%s).",
|
||||
"form_input_example": "Example: %s",
|
||||
"free": "Free",
|
||||
"from_to": "from %s to %s",
|
||||
"fs_type": "FS Type",
|
||||
"gateway": "Gateway: ",
|
||||
"good_practices_about_admin_password": "You are now about to define a new admin password. The password should be at least 8 characters - though it is good practice to use longer password (i.e. a passphrase) and/or to use various kind of characters (uppercase, lowercase, digits and special characters).",
|
||||
"good_practices_about_user_password": "You are now about to define a new user password. The password should be at least 8 characters - though it is good practice to use longer password (i.e. a passphrase) and/or to use various kind of characters (uppercase, lowercase, digits and special characters).",
|
||||
"group": "Group",
|
||||
"group_name": "Group name",
|
||||
"group_all_users": "All users",
|
||||
"group_visitors": "Visitors",
|
||||
"group_format_name_help": "You can use alpha-numeric chars and space",
|
||||
"group_add_member": "Add a user",
|
||||
"group_add_permission": "Add a permission",
|
||||
"group_new": "New group",
|
||||
"group_explain_all_users": "This is a special group containing all users accounts on the server",
|
||||
"group_explain_visitors": "This is a special group representing anonymous visitors",
|
||||
"group_specific_permissions": "User specific permissions",
|
||||
"groups_and_permissions": "Groups and permissions",
|
||||
"groups_and_permissions_manage": "Manage groups and permissions",
|
||||
"permissions": "Permissions",
|
||||
"home": "Home",
|
||||
"hook_adminjs_group_configuration": "System configurations",
|
||||
"hook_conf_cron": "Automatic tasks",
|
||||
|
@ -174,7 +161,6 @@
|
|||
"hook_data_home_desc": "User data located in /home/USER",
|
||||
"hook_data_mail": "Mail",
|
||||
"hook_data_mail_desc": "Raw emails stored on the server",
|
||||
"hostname": "Hostname",
|
||||
"id": "ID",
|
||||
"inactive": "Inactive",
|
||||
"infos": "Info",
|
||||
|
@ -185,9 +171,7 @@
|
|||
"installed": "Installed",
|
||||
"installed_apps": "Installed apps",
|
||||
"installing": "Installing",
|
||||
"interface": "Interface",
|
||||
"internal_exception": "<strong>Yunohost encountered an internal error:/</strong><br><em>Really sorry about that.<br>You should look for help on <a href=\"https://forum.yunohost.org/\">the forum</a> or <a href=\"https://chat.yunohost.org/\">the chat</a> to fix the situation, or report the bug on <a href=\"https://github.com/YunoHost/issues\">the bugtracker</a>.</em><br>The following information might be useful for the person helping you:<h3>Action</h3><pre>%s%s</pre><h3>Traceback</h3><pre>%s</pre>",
|
||||
"io": "I/O",
|
||||
"ipv4": "IPv4",
|
||||
"ipv6": "IPv6",
|
||||
"label": "Label",
|
||||
|
@ -196,7 +180,6 @@
|
|||
"license": "License",
|
||||
"loading": "Loading …",
|
||||
"local_archives": "Local archives",
|
||||
"local_ip": "Local IP",
|
||||
"log": "Log",
|
||||
"logged_in": "Logged in",
|
||||
"logged_out": "Logged out",
|
||||
|
@ -209,7 +192,6 @@
|
|||
"manage_apps": "Manage apps",
|
||||
"manage_domains": "Manage domains",
|
||||
"manage_users": "Manage users",
|
||||
"memory": "Memory",
|
||||
"menu": "Menu",
|
||||
"migrations": "Migrations",
|
||||
"migrations_pending": "Pending migrations",
|
||||
|
@ -217,20 +199,14 @@
|
|||
"migrations_no_pending": "No pending migrations",
|
||||
"migrations_no_done": "No previous migrations",
|
||||
"mode": "Mode",
|
||||
"monitoring": "Monitoring",
|
||||
"monitoring_check_glances": "Check <a href='#/services/glances'>glances</a> service status.",
|
||||
"monitoring_disabled": "Monitoring is not enabled.",
|
||||
"mount_point": "Mount point",
|
||||
"multi_instance": "Multi instance",
|
||||
"myserver": "myserver",
|
||||
"myserver_org": "myserver.org",
|
||||
"network": "Network",
|
||||
"next": "Next",
|
||||
"no": "No",
|
||||
"no_allowed_users": "No allowed users.",
|
||||
"no_installed_apps": "No installed apps.",
|
||||
"no_log": "No log.",
|
||||
"no_user_to_add": "No more users to add.",
|
||||
"nobody": "Nobody",
|
||||
"non_compatible_api": "Non-compatible API",
|
||||
"ok": "OK",
|
||||
"only_highquality_apps": "Only high-quality apps",
|
||||
|
@ -240,7 +216,6 @@
|
|||
"operations": "Operations",
|
||||
"orphaned": "not maintained",
|
||||
"orphaned_details": "This app is not maintained anymore. It may still be working but won't receive any upgrade. Feel free to come and revive it!",
|
||||
"os": "OS",
|
||||
"password": "Password",
|
||||
"password_confirmation": "Password confirmation",
|
||||
"password_description": "Password must be at least %s characters long.",
|
||||
|
@ -280,25 +255,17 @@
|
|||
"postinstall_intro_3": "You can obtain more information by visiting the <a href='//yunohost.org/postinstall' target='_blank'>appropriate documentation page</a>",
|
||||
"postinstall_password": "This password will be used to manage everything on your server. Take the time to choose it wisely.",
|
||||
"previous": "Previous",
|
||||
"process": "Process",
|
||||
"protocol": "Protocol",
|
||||
"public_ip": "Public IP: ",
|
||||
"ram": "RAM",
|
||||
"read": "Read",
|
||||
"read_more": "Read more",
|
||||
"reception": "Reception",
|
||||
"refresh_app_list": "Refresh list",
|
||||
"remove_access": "Remove access",
|
||||
"request_adoption": "waiting adoption",
|
||||
"request_adoption_details": "The current maintainer would like to stop maintaining this app. Feel free to propose yourself as the new maintainer!",
|
||||
"request_help": "need help",
|
||||
"request_help_details": "The current maintainer would like some help with the maintainance of this app. Feel free to come contribute on it!",
|
||||
"restore": "Restore",
|
||||
"run": "Run",
|
||||
"running": "Running",
|
||||
"save": "Save",
|
||||
"search_for_apps": "Search for apps...",
|
||||
"select_user": "Select user",
|
||||
"select_all": "Select all",
|
||||
"select_none": "Select none",
|
||||
"service_description": "Description:",
|
||||
|
@ -317,7 +284,6 @@
|
|||
"storage_create": "Add remote storage",
|
||||
"storages_new": "New remote storage",
|
||||
"storages_no": "No storages.",
|
||||
"swap": "Swap",
|
||||
"system": "System",
|
||||
"system_apps": "Apps",
|
||||
"system_apps_nothing": "There are no apps to upgrade.",
|
||||
|
@ -329,7 +295,6 @@
|
|||
"system_upgrade_all_applications_btn": "Upgrade all applications",
|
||||
"system_upgrade_all_packages_btn": "Upgrade all packages",
|
||||
"tcp": "TCP",
|
||||
"time_since_update": "Time since update: ",
|
||||
"tools": "Tools",
|
||||
"tools_adminpw": "Change administration password",
|
||||
"tools_adminpw_confirm_placeholder": "Confirm the new password",
|
||||
|
@ -351,8 +316,6 @@
|
|||
"tools_shutdown_done": "Shutting down...",
|
||||
"tools_shuttingdown": "Your server is powering off. As long as your server is off, you won't be able to use the web administration.",
|
||||
"tools_shutdown_reboot": "Shutdown/Reboot",
|
||||
"total": "Total",
|
||||
"transmission": "Transmission",
|
||||
"udp": "UDP",
|
||||
"unauthorized": "Unauthorized",
|
||||
"uninstall": "Uninstall",
|
||||
|
@ -364,10 +327,7 @@
|
|||
"upnp": "UPnP",
|
||||
"upnp_disabled": "UPnP is disabled.",
|
||||
"upnp_enabled": "UPnP is enabled.",
|
||||
"uptime": "Uptime",
|
||||
"url": "URL",
|
||||
"usage": "Usage",
|
||||
"used": "Used",
|
||||
"user_email": "Email",
|
||||
"user_emailaliases": "Mail aliases",
|
||||
"user_emailforward": "Mail forward",
|
||||
|
@ -383,11 +343,8 @@
|
|||
"users_list": "User list",
|
||||
"users_new": "New user",
|
||||
"users_no": "No users.",
|
||||
"versions": "Versions",
|
||||
"version": "Version",
|
||||
"view_user_profile": "View %s's profile",
|
||||
"warning_first_user": "You probably need to <a href='#/users/create' class='alert-link'>create a user</a> first.",
|
||||
"write": "Write",
|
||||
"wrong_password": "Wrong password",
|
||||
"yes": "Yes",
|
||||
"certificate_alert_not_valid": "CRITICAL: Current certificate is not valid! HTTPS won't work at all!",
|
||||
|
|
|
@ -78,7 +78,7 @@
|
|||
"label": "vortiga",
|
||||
"confirm_reboot_action_reboot": "Ĉu vi certas, ke vi volas reagordi vian servilon ?",
|
||||
"confirm_upnp_enable": "Ĉu vi certas, ke vi volas ebligi UPnP ?",
|
||||
"api_not_responding": "API ne respondas",
|
||||
"api_not_responding": "La API YunoHost ne respondas. Eble 'yunohost-api' estas malaperigita aŭ rekomencita?",
|
||||
"domain_add_dyndns_doc": "... kaj mi volas dinamikan DNS-servon.",
|
||||
"internal_exception": "<strong> YunoHost renkontis internan eraron: /</strong><br><em> Vere bedaŭras. <br> Vi devas serĉi helpon ĉe <a href = \"https://forum.yunohost.org/ \"> la forumo </a> aŭ <a href=\"https://chat.yunohost.org/\"> la spektaklo </a> por solvi la problemon, aŭ raporti la eraron pri <a href =\" https: / /github.com/YunoHost/issues\"> TheTracking Tool </a>. </em> <br>La jenaj informoj povas esti helpemaj al la helpa persono: <h3> Ago </h3> <antaŭ ><pre>%s %s</pre><h3>spuron</h3><pre>%s</pre>",
|
||||
"hook_conf_ynh_currenthost": "Nuna ĉefa domajno",
|
||||
|
@ -206,5 +206,224 @@
|
|||
"infos": "Informoj",
|
||||
"bit_rate": "Bito kurzo",
|
||||
"hook_conf_xmpp": "XMPP",
|
||||
"id": "ID"
|
||||
"id": "ID",
|
||||
"logs_access": "Listo de aliroj kaj malpermesoj",
|
||||
"maintained_details": "Ĉi tiu programo estis prizorgita de ĝia subtenanto dum la lastaj monatoj.",
|
||||
"only_highquality_apps": "Nur altkvalitaj programoj",
|
||||
"only_decent_quality_apps": "Nur deca kvalito apps",
|
||||
"orphaned": "ne konservita",
|
||||
"request_adoption": "atendanta adopto",
|
||||
"migrations_pending": "Pendaj migradoj",
|
||||
"next": "Sekva",
|
||||
"orphaned_details": "Ĉi tiu app ne plu estas konservita. Ĝi eble ankoraŭ funkcios, sed ne ricevos iun ĝisdatigon. Sentu vin libera revivi ĝin!",
|
||||
"request_adoption_details": "La nuna prizorganto ŝatus ĉesi subteni ĉi tiun app. Bonvolu proponi vin kiel la novan prizorganton!",
|
||||
"request_help": "bezonas helpon",
|
||||
"request_help_details": "La nuna prizorganto ŝatus iom da helpo pri la bontenado de ĉi tiu app. Bonvolu veni kontribui pri ĝi!",
|
||||
"user_email": "Retpoŝto",
|
||||
"postinstall_intro_1": "Gratulojn! YunoHost estis sukcese instalita.",
|
||||
"time_since_update": "Tempo ekde ĝisdatigo: ",
|
||||
"no_installed_apps": "Neniuj instalitaj programoj.",
|
||||
"usage": "uzo",
|
||||
"uninstall": "Malinstali",
|
||||
"users_new": "Nova uzanto",
|
||||
"users": "Uzantoj",
|
||||
"system_apps_nothing": "Ne estas programoj por ĝisdatigi.",
|
||||
"used": "Uzata",
|
||||
"tools_security_feed_view_items": "Vidu ĉiujn sekurecajn sciigojn",
|
||||
"certificate_alert_letsencrypt_about_to_expire": "Nuna atestilo estas preskaŭ eksvalidiĝi. Ĝi baldaŭ renoviĝu aŭtomate.",
|
||||
"version": "versio",
|
||||
"yes": "Jes",
|
||||
"skip": "Salti",
|
||||
"search_for_apps": "Serĉi aplikojn ...",
|
||||
"upnp_disabled": "UPnP estas malebligita.",
|
||||
"logs_no_logs_registered": "Neniu registro registrita por ĉi tiu kategorio",
|
||||
"certificate_alert_good": "Bone, nuna atestilo aspektas bone!",
|
||||
"network": "reto",
|
||||
"purge_user_data_warning": "Purgaj datumoj de uzanto ne estas reverteblaj. Nepre vi scias, kion vi faras!",
|
||||
"domain_not_eligible_for_ACME": "Ĉi tiu domajno ne ŝajnas preta por Letero-Ĉifrado. Bonvolu kontroli vian atingon de DNS-agordo kaj HTTP-servilo.",
|
||||
"password_description": "Pasvorto devas esti almenaŭ %s signoj longa.",
|
||||
"select_all": "Elekti ĉiujn",
|
||||
"tcp": "TCP",
|
||||
"domain_is_eligible_for_ACME": "Ĉi tiu domajno ŝajnas ĝuste agordita por instali atestilon Lasu Ĉifri!",
|
||||
"system_upgrade_btn": "Altgradigon",
|
||||
"ssl_certificate": "SSL-atestilo",
|
||||
"certificate_manage": "Administri SSL-atestilon",
|
||||
"tools_security_feed_subscribe_rss": "Aboni RSS pri sciigoj",
|
||||
"tools_adminpw_confirm_placeholder": "Konfirmu la novan pasvorton",
|
||||
"total": "Entute",
|
||||
"confirm_cert_install_LE": "Ĉu vi certas, ke vi volas instali atestilon Lasu Ĉifri por ĉi tiu domajno?",
|
||||
"myserver_org": "miaservisto.org",
|
||||
"logs_operation": "Operacioj faritaj sur sistemo kun YunoHost",
|
||||
"monitoring_check_glances": "Kontrolu <a href='#/services/glances'> rigardojn </a> servo-staton.",
|
||||
"appslists": "Aplikoj-listoj",
|
||||
"install_letsencrypt_cert": "Instalu atestilon Lasu-Ĉifri",
|
||||
"appslists_custom": "Propra listo listo",
|
||||
"no_log": "Neniu ŝtipo.",
|
||||
"system_packages_nothing": "Ne estas pakoj por ĝisdatigi.",
|
||||
"system_upgrade_all_applications_btn": "Ĝisdatigu ĉiujn aplikojn",
|
||||
"postinstall": "post Instalaĵo",
|
||||
"service_description": "Priskribo:",
|
||||
"uptime": "Kuracado",
|
||||
"revert_to_selfsigned_cert": "Reiru al mem-subskribita atestilo",
|
||||
"certificate_old_letsencrypt_app_conflict": "La app 'letsencrypt' estas nuntempe instalita kaj konfliktas kun ĉi tiu funkcio. Bonvolu malinstali ĝin unue por uzi la novan registritan administran interfacon.",
|
||||
"system_update": "Sistema ĝisdatigo",
|
||||
"unauthorized": "Ne rajtigita",
|
||||
"wrong_password": "Erara pasvorto",
|
||||
"tools_security_feed": "Sekurecaj sciigoj",
|
||||
"system_packages": "Pakoj",
|
||||
"certificate_alert_unknown": "Nekonata stato",
|
||||
"tools_shutdown_reboot": "Ŝalti/Rekomenci",
|
||||
"logs_started_at": "Komencu",
|
||||
"confirm_cert_revert_to_selfsigned": "Ĉu vi certas, ke vi volas reverti ĉi tiun domajnon al mem-subskribita atestilo?",
|
||||
"postinstall_domain": "Ĉi tiu estas la unua domajna nomo ligita al via servilo YunoHost, sed ankaŭ la uzata de la uzantoj de via servilo por aliri la aŭtentikan portalon. Laŭe ĝi estos videbla de ĉiuj, do elektu ĝin zorgeme.",
|
||||
"users_no": "Neniuj uzantoj.",
|
||||
"tools_shutdown": "Enŝaltu vian servilon",
|
||||
"validity": "Valideco",
|
||||
"upnp_enabled": "UPnP estas ebligita.",
|
||||
"tools_reboot": "Reklamu vian servilon",
|
||||
"mode": "Modon",
|
||||
"manage_domains": "Administri domajnojn",
|
||||
"user_username_edit": "Redakti %s konton",
|
||||
"mount_point": "Montpunkto",
|
||||
"logs_package": "Historio pri administrado de pakoj Debian",
|
||||
"user_new_forward": "novjora@myforeigndomain.org",
|
||||
"manually_renew_letsencrypt_message": "Atestilo estos aŭtomate renovigita dum la lastaj 15 tagoj de valideco. Vi povas permane renovigi ĝin se vi volas. (Ne rekomendita).",
|
||||
"logs_share_with_yunopaste": "Kunhavigu kun YunoPaste",
|
||||
"tools_download_ca": "Elŝutu SSL Atestilon-Aŭtoritaton (CA)",
|
||||
"certificate": "Atestilo",
|
||||
"logs_system": "Kernel ŝtipoj kaj aliaj malaltnivelaj eventoj",
|
||||
"user_emailaliases": "Poŝti alias",
|
||||
"certificate_authority": "Atestado-aŭtoritato",
|
||||
"unmaintained": "Malkomprenita",
|
||||
"regenerate_selfsigned_cert": "Regeneri mem-subskribitan atestilon",
|
||||
"unknown_argument": "Nekonata argumento: %s",
|
||||
"ports": "havenoj",
|
||||
"select_user": "Elektu uzanton",
|
||||
"system": "Sistemo",
|
||||
"tools_reboot_btn": "Rekomencu",
|
||||
"logs_history": "Historio de komando funkcianta sur sistemo",
|
||||
"read_more": "Legu pli",
|
||||
"monitoring_disabled": "Monitorado ne estas enŝaltita.",
|
||||
"previous": "Antaŭa",
|
||||
"services_list": "Servo-Listo",
|
||||
"manage_users": "Administri uzantojn",
|
||||
"logs_service": "Servoj ŝtipoj",
|
||||
"tools_rebooting": "Via servilo rekomencas. Por reveni al la retadministra interfaco, vi devas atendi, ke via servilo funkcios. Vi povas kontroli tion per refreŝigado de ĉi tiu paĝo (F5).",
|
||||
"tools_adminpw": "Ŝanĝu administran pasvorton",
|
||||
"service_log": "%s ŝtipo",
|
||||
"write": "Skribu",
|
||||
"multi_instance": "Multaj ekzemploj",
|
||||
"no_allowed_users": "Neniuj permesitaj uzantoj.",
|
||||
"non_compatible_api": "Ne kongrua API",
|
||||
"revert_to_selfsigned_cert_message": "Se vi vere volas, vi povas reinstali mem-subskribitan atestilon. (Ne rekomendita)",
|
||||
"tools_adminpw_current_placeholder": "Enigu vian nunan pasvorton",
|
||||
"user_mailbox_quota": "Poŝta kesto",
|
||||
"operations": "Operacioj",
|
||||
"migrations_done": "Antaŭaj migradoj",
|
||||
"password_new": "Nova pasvorto",
|
||||
"manually_renew_letsencrypt": "Mane renovigu nun",
|
||||
"tools_adminpw_current": "Aktuala Pasvorto",
|
||||
"appslists_manage": "Administri listojn de aplikoj",
|
||||
"menu": "menuo",
|
||||
"service_start_on_boot": "Komencu je ekkuro: ",
|
||||
"storages_new": "Nova fora stokado",
|
||||
"storage_create": "Aldonu forajn stokadojn",
|
||||
"regenerate_selfsigned_cert_message": "Se vi volas, vi povas regeneri la mem-subskribitan atestilon.",
|
||||
"migrations_no_pending": "Neniuj pritraktataj migradoj",
|
||||
"appslists_last_update": "Lasta ĝisdatigo",
|
||||
"logs_more": "Vidigu pliajn liniojn",
|
||||
"logs_error": "Eraro",
|
||||
"certificate_status": "Atestita statuso",
|
||||
"no": "Ne",
|
||||
"remove_access": "Forigi aliron",
|
||||
"transmission": "transdono",
|
||||
"upload_archive": "Alŝuta arkivo",
|
||||
"tools_shutdown_btn": "Fermito",
|
||||
"purge_user_data_checkbox": "Purigi datumojn de %s? (Ĉi tio forigos la enhavon de ĝiaj hejmaj kaj poŝtaj adresaroj.)",
|
||||
"appslists_info_refresh_desc": "Refreŝigi statojn de ĉi tiu listo.",
|
||||
"migrations": "migrado",
|
||||
"logs_ended_at": "Fino",
|
||||
"restore": "Restaŭri",
|
||||
"meltdown": "Vi estas vundebla al la <a target=\"_blank\" href=\"https://meltdownattack.com/\"> meltdown </a> maltrankviliga sekureco. Por ripari tion, vi devas <a href=\"#/update\"> ĝisdatigi vian sistemon </a> tiam <a href=\"#/tools/reboot\"> reŝalti ĝin </a> por ŝarĝi la novan linux-kernon.",
|
||||
"view_user_profile": "Vidi %s profilon",
|
||||
"user_mailbox_use": "Poŝtejo uzis spacon",
|
||||
"appslists_unknown_list": "Listo de nekonataj programoj: %s",
|
||||
"appslists_info_remove_desc": "Aplikoj de ĉi tiu listo ne plu estos haveblaj.",
|
||||
"only_working_apps": "Nur funkciantaj programoj",
|
||||
"postinstall_password": "Ĉi tiu pasvorto estos uzata por administri ĉion en via servilo. Prenu la tempon por elekti ĝin prudente.",
|
||||
"start": "Komencu",
|
||||
"certificate_alert_great": "Bonega! Vi uzas validan atestilon Lasu Ĉifri!",
|
||||
"tools_download_ca_desc": "Alklaku ĉi tie por elŝuti vian SSL-atestan aŭtoritaton (CA)",
|
||||
"confirm_cert_regen_selfsigned": "Ĉu vi certas, ke vi volas regeneri mem-subskribitan atestilon por ĉi tiu domajno?",
|
||||
"storages_no": "Neniuj magazenoj.",
|
||||
"passwords_too_short": "Pasvorto estas tro mallonga",
|
||||
"appslists_confirm_remove": "Ĉu vi certas, ke vi volas forigi ĉi tiun liston de aplikoj?",
|
||||
"myserver": "mia servisto",
|
||||
"tools_adminpw_new_placeholder": "Enigu la novan pasvorton",
|
||||
"user_emailforward": "Poŝti antaŭen",
|
||||
"certificate_alert_about_to_expire": "AVERTO: Nuna atestilo finos! Ĝi ne renoviĝos aŭtomate!",
|
||||
"system_upgrade_all_packages_btn": "Ĝisdatigu ĉiujn pakaĵojn",
|
||||
"logs_end_with_error": "Ĉi tiu ŝtipo finiĝis per la eraro:",
|
||||
"users_list": "Uzantlisto",
|
||||
"migrations_no_done": "Neniuj antaŭaj migradoj",
|
||||
"url": "URL",
|
||||
"versions": "versioj",
|
||||
"select_none": "Elektu neniun",
|
||||
"size": "Grandeco",
|
||||
"confirm_cert_manual_renew_LE": "Ĉu vi certas, ke vi volas permane renovigi la atestilon Lasu Ĉifri por ĉi tiu regado nun?",
|
||||
"process": "Procezo",
|
||||
"upload": "Alŝuti",
|
||||
"logs": "Registroj",
|
||||
"postinstall_intro_3": "Vi povas akiri pliajn informojn vizitante la <a href='//yunohost.org/postinstall' target='_blank'> taŭgan dokumentan paĝon </a>",
|
||||
"user_new_mail": "novaĵisto@miadomino.org",
|
||||
"tools_shuttingdown": "Via servilo elŝaltas. Tiel longe kiel via servilo malŝaltas, vi ne povos uzi la retan administradon.",
|
||||
"logs_app": "Aplikoj ŝtipoj",
|
||||
"tools_security_feed_no_items": "Neniuj sekurecaj sciigoj",
|
||||
"running": "Kurado",
|
||||
"reception": "Ricevo",
|
||||
"appslists_no_lists": "Neniuj aplikoj-listoj",
|
||||
"tools_shutdown_done": "Fermi ...",
|
||||
"certificate_alert_not_valid": "KRITIKO: Nuna atestilo ne validas! HTTPS tute ne funkcios!",
|
||||
"path_url": "Pado",
|
||||
"status": "Statuso",
|
||||
"set_default": "Fiksita defaŭlte",
|
||||
"upnp": "UPnP",
|
||||
"certificate_alert_selfsigned": "AVERTO: Nuna atestilo estas mem-subskribita. Foliumiloj aperigos timigan averton al novaj vizitantoj!",
|
||||
"system_upgrade": "Sistema ĝisdatigo",
|
||||
"protocol": "Protokolo",
|
||||
"tools": "iloj",
|
||||
"os": "Mastruma sistemo",
|
||||
"port": "haveno",
|
||||
"public_ip": "Publika IP: ",
|
||||
"passwords_dont_match": "Pasvortoj ne kongruas",
|
||||
"service_status": "Statuso: ",
|
||||
"user_fullname": "Plena nomo",
|
||||
"stop": "Ĉesu",
|
||||
"save": "ŝpari",
|
||||
"warning_first_user": "Vi probable devas <a href='#/users/create' class='alert-link'> krei unue uzanton </a>.",
|
||||
"logs_context": "Kunteksto",
|
||||
"services": "servoj",
|
||||
"logs_path": "Pado",
|
||||
"read": "legado",
|
||||
"run": "Kuri",
|
||||
"manage_apps": "Administri aplikon",
|
||||
"system_apps": "Aplikoj",
|
||||
"user_username": "Uzantnomo",
|
||||
"path": "Pado",
|
||||
"password_confirmation": "Pasvorta konfirmo",
|
||||
"open": "Malfermu",
|
||||
"unknown_action": "Nekonata ago %s",
|
||||
"memory": "Memoro",
|
||||
"refresh_app_list": "Refreŝigi liston",
|
||||
"ram": "RAM",
|
||||
"started_at": "Komencite ĉe:",
|
||||
"tools_reboot_done": "Rekomencanta ...",
|
||||
"monitoring": "Monitorado",
|
||||
"password_empty": "La pasvorta kampo estas malplena",
|
||||
"no_user_to_add": "Ne plu uzantoj aldoni.",
|
||||
"postinstall_intro_2": "Du pliaj agordaj paŝoj necesas por aktivigi la servojn de via servilo.",
|
||||
"name": "Nomo",
|
||||
"udp": "UDP",
|
||||
"swap": "Interŝanĝu",
|
||||
"user_interface_link": "Uzantinterfaco"
|
||||
}
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
"add": "Añadir",
|
||||
"administration_password": "Contraseña de administración",
|
||||
"allowed_users": "Usuarios permitidos",
|
||||
"api_not_responding": "La API no está respondiendo",
|
||||
"api_not_responding": "La API de YunoHost no responde. ¿Tal vez «yunohost-api» está inoperativa o ha sido reiniciada?",
|
||||
"app_access": "Acceso",
|
||||
"app_access_addall_btn": "Habilitar acceso para todos",
|
||||
"app_access_addall_desc": "Todos los usuarios existentes tendrán acceso a %s 1.",
|
||||
|
@ -14,7 +14,7 @@
|
|||
"app_access_title": "Acceso %s 4",
|
||||
"app_debug_no_logs": "Los registros de la aplicación no están disponibles",
|
||||
"app_debug_tab": "Mostrar información de depuración",
|
||||
"app_info_access_desc": "Administrar el acceso de usuarios. Usuarios permitidos: %s 5",
|
||||
"app_info_access_desc": "Grupos / usuarios actualmente autorizados a acceder a esta aplicación:",
|
||||
"app_info_debug_desc": "Mostrar información de depuración para esta aplicación.",
|
||||
"app_info_default_desc": "Redirigir la raíz del dominio para esta aplicación (%s 6).",
|
||||
"app_info_uninstall_desc": "Eliminar a esta aplicación.",
|
||||
|
@ -440,5 +440,20 @@
|
|||
"appslists_confirm_remove": "¿Seguro que quiere eliminar esta lista de aplicaciones?",
|
||||
"level": "nivel",
|
||||
"system_upgrade_all_applications_btn": "Actualizar todas las aplicaciones",
|
||||
"select_all": "Seleccionar todo"
|
||||
"select_all": "Seleccionar todo",
|
||||
"group_explain_all_users": "Este es un grupo especial que contiene todas las cuentas de usuarios en el servidor",
|
||||
"group": "Grupo",
|
||||
"group_name": "Nombre del grupo",
|
||||
"group_all_users": "Todos los usuarios",
|
||||
"group_visitors": "Visitantes",
|
||||
"group_format_name_help": "Puede usar caracteres alfanuméricos y espacio",
|
||||
"group_add_member": "Añadir un usuario",
|
||||
"group_add_permission": "Añadir permiso",
|
||||
"group_new": "Nuevo grupo",
|
||||
"group_explain_visitors": "Este es un grupo especial que representa a los visitantes anónimos",
|
||||
"group_specific_permissions": "Permisos específicos de usuario",
|
||||
"groups_and_permissions": "Grupos y permisos",
|
||||
"groups_and_permissions_manage": "Gestionar grupos y permisos",
|
||||
"permissions": "Permisos",
|
||||
"nobody": "Nadie"
|
||||
}
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
"add": "Ajouter",
|
||||
"administration_password": "Mot de passe d'administration",
|
||||
"allowed_users": "Utilisateurs autorisés",
|
||||
"api_not_responding": "L'API ne répond pas",
|
||||
"api_not_responding": "L'API YunoHost ne répond pas. Peut-être que 'yunohost-api' est en panne ou a été redémarré ?",
|
||||
"app_access": "Accès",
|
||||
"app_access_addall_btn": "Ajouter l'accès à tous les utilisateurs",
|
||||
"app_access_addall_desc": "Tous les utilisateurs ont accès à %s.",
|
||||
|
|
|
@ -1,4 +1,170 @@
|
|||
{
|
||||
"action": "Åtgärd",
|
||||
"active": "Aktiv"
|
||||
"active": "Aktiv",
|
||||
"services": "Tjänster",
|
||||
"protocol": "Protokoll",
|
||||
"license": "Licens",
|
||||
"hook_conf_ssowat": "SSOwat",
|
||||
"advanced": "Avancerat",
|
||||
"from_to": "mellan %s och %s",
|
||||
"hook_conf_ynh_currenthost": "Nuvarande huvuddomän",
|
||||
"only_highquality_apps": "Endast högkvalitativa applikationer",
|
||||
"only_decent_quality_apps": "Endast applikationer av god kvalitet",
|
||||
"request_help": "behöver hjälp",
|
||||
"domain_select": "Välj domän",
|
||||
"installed": "Installerad",
|
||||
"domain_add_dyndns_doc": "… och jag vill använda en dynamisk DNS-tjänst.",
|
||||
"myserver_org": "minserver.org",
|
||||
"ipv4": "IPv4",
|
||||
"ram": "Arbetsminne",
|
||||
"inactive": "Inaktiv",
|
||||
"only_working_apps": "Endast fungerande applikationer",
|
||||
"restore": "Återskapa",
|
||||
"gateway": "Gateway: ",
|
||||
"installing": "Installerar",
|
||||
"migrations": "Förflyttningar",
|
||||
"services_list": "Lista över tjänster",
|
||||
"logs_ended_at": "Slut",
|
||||
"firewall": "Brandvägg",
|
||||
"manage_users": "Hantera användare",
|
||||
"mailbox_quota_description": "Som jämförelse är 700 MB en CD-skiva och 4700 MB en DVD.",
|
||||
"app_info_access_desc": "Hantera användaråtkomst. Tillåtna användare: %s",
|
||||
"domain_add": "Lägg till domän",
|
||||
"app_access_addall_btn": "Ge alla åtkomst",
|
||||
"logs_share_with_yunopaste": "Dela med YunoPaste",
|
||||
"logout": "Logga ut",
|
||||
"enable": "Aktivera",
|
||||
"logged_in": "Inloggad",
|
||||
"domain_default_longdesc": "Detta är din standarddomän.",
|
||||
"next": "Nästa",
|
||||
"app_change_label": "Redigera etikett",
|
||||
"select_all": "Markera alla",
|
||||
"no": "Nej",
|
||||
"domain_visit_url": "Besök %s",
|
||||
"footer_version": "Drivs av <a href='https://yunohost.org'>YunoHost</a> %s (%s).",
|
||||
"domains": "Domäner",
|
||||
"app_access_clearall_btn": "Neka alla åtkomst",
|
||||
"domain_list": "Lista över domäner",
|
||||
"hook_conf_ynh_mysql": "MySQL-lösenord",
|
||||
"administration_password": "Administratörslösenord",
|
||||
"remove": "Ta bort",
|
||||
"hook_adminjs_group_configuration": "Systeminställningar",
|
||||
"hook_data_home": "Användardata",
|
||||
"app_info_debug_desc": "Visa felsökningsinformation för den här applikationen.",
|
||||
"select_user": "Välj användare",
|
||||
"cancel": "Avbryt",
|
||||
"memory": "Minne",
|
||||
"mailbox_quota_placeholder": "Lämna tomt eller skriv 0 för att avaktivera.",
|
||||
"select_none": "Avmarkera alla",
|
||||
"search_for_apps": "Sök efter applikationer …",
|
||||
"running": "Körs",
|
||||
"service_log": "Logg för %s",
|
||||
"postinstall_intro_1": "Grattis! YunoHost har installerats korrekt.",
|
||||
"password_empty": "Lösenordsfältet är tomt",
|
||||
"app_info_changelabel_desc": "Redigera applikationsetikett i portalen.",
|
||||
"domain_dns_config": "DNS-inställningar",
|
||||
"installation_complete": "Installation färdig",
|
||||
"logs_app": "Applikationsloggar",
|
||||
"port": "Port",
|
||||
"app_debug_no_logs": "Det går inte att komma åt applikationens loggar",
|
||||
"label_for_manifestname": "Etikett för %s",
|
||||
"app_change_url": "Redigera länk",
|
||||
"migrations_pending": "Kommande förflyttningar",
|
||||
"infos": "Information",
|
||||
"app_access_addall_desc": "Alla existerande användare kommer kunna komma åt %s.",
|
||||
"domain_add_panel_with_domain": "Jag har redan ett domännamn …",
|
||||
"domain_delete_longdesc": "Radera den här domänen",
|
||||
"everyone_has_access": "Alla har åtkomst.",
|
||||
"run": "Kör",
|
||||
"hook_conf_ynh_certs": "SSL-certifikat",
|
||||
"hook_conf_ynh_firewall": "Brandvägg",
|
||||
"logged_out": "Utloggad",
|
||||
"no_installed_apps": "Inga installerade applikationer.",
|
||||
"fs_type": "Filsystem",
|
||||
"mode": "Läge",
|
||||
"password": "Lösenord",
|
||||
"install_time": "Tidpunkt för installation",
|
||||
"label": "Etikett",
|
||||
"password_new": "Nytt lösenord",
|
||||
"level": "nivå",
|
||||
"passwords_too_short": "Lösenordet är för kort",
|
||||
"hook_conf_nginx": "Nginx",
|
||||
"logs_service": "Tjänstloggar",
|
||||
"ipv6": "IPv6",
|
||||
"manage_apps": "Hantera applikationer",
|
||||
"service_description": "Beskrivning:",
|
||||
"local_archives": "Lokala arkiv",
|
||||
"install": "Installera",
|
||||
"download": "Ladda ner",
|
||||
"public_ip": "Offentlig IP-adress: ",
|
||||
"no_user_to_add": "Inga fler användare att lägga till.",
|
||||
"log": "Logg",
|
||||
"open": "Öppen",
|
||||
"hook_data_home_desc": "Användardata i /home/ANVÄNDARE",
|
||||
"service_start_on_boot": "Kör vid uppstart: ",
|
||||
"migrations_no_pending": "Inga kommande förflyttningar",
|
||||
"read_more": "Läs mer",
|
||||
"hook_conf_ssh": "SSH",
|
||||
"domain_default_desc": "Standarddomänen är den domän du vill att användare loggar in på.",
|
||||
"non_compatible_api": "Icke-kompatibelt API",
|
||||
"loading": "Hämtar …",
|
||||
"app_access": "Åtkomst",
|
||||
"logs_context": "Sammanhang",
|
||||
"hook_conf_xmpp": "XMPP",
|
||||
"logs_error": "Fel",
|
||||
"home": "Hem",
|
||||
"logs_path": "Sökväg",
|
||||
"add": "Lägg till",
|
||||
"install_name": "Installera %s",
|
||||
"domain_add_dns_doc": "… och jag har <a href='//yunohost.org/dns'>konfigurerat min DNS korrekt</a>.",
|
||||
"interface": "Gränssnitt",
|
||||
"error_server_unexpected": "Oväntat serverfel (%s)",
|
||||
"previous": "Föregående",
|
||||
"no_allowed_users": "Inga tillåtna användare.",
|
||||
"read": "Läs",
|
||||
"save": "Spara",
|
||||
"hook_data_mail": "E-post",
|
||||
"app_access_clearall_desc": "Alla användare kommer kunna komma åt %s.",
|
||||
"hook_conf_ldap": "LDAP-databas",
|
||||
"service_status": "Status: ",
|
||||
"ok": "Ok",
|
||||
"no_log": "Ingen logg.",
|
||||
"migrations_done": "Tidigare förflyttningar",
|
||||
"id": "ID",
|
||||
"domain_name": "Domännamn",
|
||||
"network": "Nätverk",
|
||||
"logs_more": "Visa fler rader",
|
||||
"domain_dns_longdesc": "Visa DNS-inställningar",
|
||||
"domain_default": "Standarddomän",
|
||||
"installed_apps": "Installerade applikationer",
|
||||
"monitoring": "Övervakning",
|
||||
"domain_add_panel_without_domain": "Jag har inte något domännamn …",
|
||||
"monitoring_disabled": "Övervakning är inte aktiverad.",
|
||||
"migrations_no_done": "Inga tidigare förflyttningar",
|
||||
"logs": "Loggar",
|
||||
"hostname": "Värdnamn",
|
||||
"local_ip": "Lokal IP-adress",
|
||||
"login": "Logga in",
|
||||
"all_apps": "Alla applikationer",
|
||||
"ports": "Portar",
|
||||
"domain": "Domän",
|
||||
"io": "I/O",
|
||||
"path": "Sökväg",
|
||||
"passwords_dont_match": "Lösenorden stämmer inte överens",
|
||||
"path_url": "Sökväg",
|
||||
"password_confirmation": "Lösenordsbekräftelse",
|
||||
"app_debug_tab": "Visa information för felsökning",
|
||||
"domain_visit": "Besök",
|
||||
"logs_started_at": "Start",
|
||||
"enabled": "Aktiverad",
|
||||
"filesystem": "Filsystem",
|
||||
"myserver": "minserver",
|
||||
"menu": "Meny",
|
||||
"manage_domains": "Hantera domäner",
|
||||
"operations": "Handlingar",
|
||||
"os": "Operativsystem",
|
||||
"error_server": "Serverfel",
|
||||
"refresh_app_list": "Uppdatera lista",
|
||||
"form_input_example": "Exempel: %s",
|
||||
"dns": "DNS"
|
||||
}
|
||||
|
|
|
@ -1,97 +0,0 @@
|
|||
<div class="btn-breadcrumb">
|
||||
<a href="#/" ><i class="fa-home"></i><span class="sr-only">{{t 'home'}}</span></a>
|
||||
<a href="#/apps" class="hidden-xs">{{t 'applications'}}</a>
|
||||
<a href="#/apps" class="visible-xs">…</a>
|
||||
<a href="#/apps/{{settings.id}}">{{settings.label}}</a>
|
||||
<a href="#/apps/{{settings.id}}/access">{{t 'app_access'}}</a>
|
||||
</div>
|
||||
|
||||
<div class="separator"></div>
|
||||
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<h2 class="panel-title"><span class="fa-fw fa-users"></span> {{t 'allowed_users'}}</h2>
|
||||
</div>
|
||||
{{#if settings.allowed_users}}
|
||||
<div class="list-group">
|
||||
{{#each settings.allowed_users}}
|
||||
<div class="list-group-item">
|
||||
<a role="button" href="#/apps/{{settings.id}}/access/remove/{{username}}" class="btn btn-danger slide back pull-right">
|
||||
<span class="fa-trash-o"></span> {{t 'remove_access'}}
|
||||
</a>
|
||||
<h3 class="list-group-item-heading">{{fullname}} ({{mail}})</h3>
|
||||
<a href="#/users/{{username}}">{{t 'view_user_profile' username}}</a>
|
||||
</div>
|
||||
{{/each}}
|
||||
</div>
|
||||
{{else}}
|
||||
<div class="panel-body">
|
||||
{{#if settings.allow_everyone}}
|
||||
<p class="text-success">{{t 'everyone_has_access'}}</p>
|
||||
{{else}}
|
||||
<p class="text-warning">{{t 'no_allowed_users'}}</p>
|
||||
{{/if}}
|
||||
</div>
|
||||
{{/if}}
|
||||
<div class="panel-footer">
|
||||
{{#if users}}
|
||||
<form method="POST" action="#/apps/{{settings.id}}/access/add" class="row">
|
||||
<input type="hidden" name="app" value="{{settings.id}}">
|
||||
<div class="col-sm-6">
|
||||
<select name="user" required class="form-control">
|
||||
<option value="" default disabled selected>{{t 'select_user'}}</option>
|
||||
{{#users}}<option value="{{value}}">{{label}}</option>{{/users}}
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
<br class="visible-xs" />
|
||||
<input type="submit" class="btn btn-success slide back" value="{{t 'add'}}">
|
||||
</div>
|
||||
</form>
|
||||
{{else}}
|
||||
<p class="text-warning">{{t 'no_user_to_add'}}</p>
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="panel-group" id="accordion">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<h2 class="panel-title">
|
||||
<a data-toggle="collapse" data-parent="#accordion" href="#collapseOne">
|
||||
<span class="fa-fw fa-wrench"></span> {{t 'operations'}}
|
||||
</a>
|
||||
</h2>
|
||||
</div>
|
||||
<div id="collapseOne" class="panel-collapse collapse">
|
||||
<div class="panel-body">
|
||||
{{#if users}}
|
||||
<div class="container">
|
||||
<p>{{t 'app_access_addall_desc' settings.label}}</p>
|
||||
<a role="button" href="#/apps/{{settings.id}}/access/add" class="btn btn-success slide back">
|
||||
<span class="fa-plus"></span> {{t 'app_access_addall_btn'}}
|
||||
</a>
|
||||
</div>
|
||||
<hr>
|
||||
{{/if}}
|
||||
{{#if settings.allowed_users}}
|
||||
<div class="container">
|
||||
<p>{{t 'app_access_removeall_desc' settings.label}}</p>
|
||||
<a role="button" href="#/apps/{{settings.id}}/access/remove" class="btn btn-danger slide back">
|
||||
<span class="fa-trash-o"></span> {{t 'app_access_removeall_btn'}}
|
||||
</a>
|
||||
</div>
|
||||
<hr>
|
||||
{{/if}}
|
||||
{{#unless settings.allow_everyone}}
|
||||
<div class="container">
|
||||
<p>{{t 'app_access_clearall_desc' settings.label}}</p>
|
||||
<a role="button" href="#/apps/{{settings.id}}/access/clear" class="btn btn-primary slide back">
|
||||
<span class="fa-unlock-alt"></span> {{t 'app_access_clearall_btn'}}
|
||||
</a>
|
||||
</div>
|
||||
{{/unless}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
|
@ -1,39 +0,0 @@
|
|||
<div class="btn-breadcrumb">
|
||||
<a href="#/" ><i class="fa-home"></i><span class="sr-only">{{t 'home'}}</span></a>
|
||||
<a href="#/apps">{{t 'applications'}}</a>
|
||||
<a href="#/apps/{{name}}">{{label}}</a>
|
||||
<a href="#/apps/{{name}}/debug">{{t 'debug'}}</a>
|
||||
</div>
|
||||
|
||||
<div class="separator"></div>
|
||||
|
||||
{{#if services}}
|
||||
<div class="panel-group" id="accordion" role="tablist" aria-multiselectable="true">
|
||||
{{#services}}
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading" role="tab" id="heading-{{ @index }}">
|
||||
<h2 class="panel-title">
|
||||
<a role="button" data-toggle="collapse" data-parent="#accordion" href="#collapse-{{ @index }}" aria-expanded="true" aria-controls="collapse-{{ @index }}">
|
||||
<span class="fa-fw fa-info-circle"></span> {{t 'service_log' name }}
|
||||
</a>
|
||||
</h2>
|
||||
</div>
|
||||
<div id="collapse-{{ @index }}" class="panel-collapse collapse" role="tabpanel" aria-labelledby="heading-{{ @index }}">
|
||||
<div class="panel-body">
|
||||
{{#logs}}
|
||||
<h3>{{file_name}}</h3>
|
||||
<pre id="service-log-{{ @index }}" class="service-log">{{file_content}}</pre>
|
||||
<button data-paste-content="#service-log-{{ @index }}"><i class="fa-cloud-upload"></i> {{t 'upload'}}</button>
|
||||
{{/logs}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{/services}}
|
||||
</div>
|
||||
|
||||
{{else}}
|
||||
<div class="alert alert-warning">
|
||||
<span class="fa-exclamation-triangle"></span>
|
||||
{{t 'app_debug_no_logs'}}
|
||||
</div>
|
||||
{{/if}}
|
|
@ -48,9 +48,10 @@
|
|||
</div>
|
||||
<hr>
|
||||
<div class="container">
|
||||
<p>{{t 'app_info_access_desc' settings.allowed_users}}</p>
|
||||
<a role="button" href="#/apps/{{settings.id}}/access" class="btn btn-info slide">
|
||||
<span class="fa-lock"></span> {{t 'app_access'}}
|
||||
<p>{{t 'app_info_access_desc'}} {{#each permissions}} {{ucwords .}}{{#unless @last}}, {{/unless}} {{ else }} {{t 'nobody'}} {{/each}}
|
||||
</p>
|
||||
<a role="button" href="#/groups" class="btn btn-info slide">
|
||||
<span class="fa-key-modern"></span> {{t 'groups_and_permissions_manage'}}
|
||||
</a>
|
||||
</div>
|
||||
<hr>
|
||||
|
@ -82,13 +83,6 @@
|
|||
<span class="fa-trash-o"></span> {{t 'uninstall'}}
|
||||
</button>
|
||||
</div>
|
||||
<hr>
|
||||
<div class="container">
|
||||
<p>{{t 'app_info_debug_desc'}}</p>
|
||||
<a href="#/apps/{{settings.id}}/debug" role="button" class ="btn btn-warning slide">
|
||||
<span class="fa-bug"></span> {{t 'app_debug_tab'}}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{load_tooltips}}
|
||||
|
|
|
@ -34,10 +34,6 @@
|
|||
<h2 style="font-weight:600; padding-left:0.5em;">{{t 'advanced'}}</h2>
|
||||
|
||||
<div class="list-group">
|
||||
<a href="#/tools/monitor" class="list-group-item slide clearfix">
|
||||
<span class="pull-right fa-chevron-right"></span>
|
||||
<h2 class="list-group-item-heading">{{t 'monitoring'}}</h2>
|
||||
</a>
|
||||
<a href="#/tools/firewall" class="list-group-item slide clearfix">
|
||||
<span class="pull-right fa-chevron-right"></span>
|
||||
<h2 class="list-group-item-heading">{{t 'firewall'}}</h2>
|
||||
|
|
|
@ -1,283 +0,0 @@
|
|||
<div class="btn-breadcrumb">
|
||||
<a href="#/" ><i class="fa-home"></i><span class="sr-only">{{t 'home'}}</span></a>
|
||||
<a href="#/tools">{{t 'tools'}}</a>
|
||||
<a href="#/tools/monitor">{{t 'monitoring'}}</a>
|
||||
</div>
|
||||
|
||||
<div class="separator"></div>
|
||||
|
||||
{{#if status}}
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<h2 class="panel-title"><span class="fa-fw fa-info-circle"></span> {{t 'infos'}}</h2>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<dl class="dl-horizontal">
|
||||
<dt>{{t 'hostname'}}</dt>
|
||||
<dd>{{system.infos.hostname}}</dd>
|
||||
<dt>{{t 'os'}}</dt>
|
||||
<dd>{{ucwords system.infos.linux_distro}} {{system.infos.platform}} ({{system.infos.os_name}} {{system.infos.os_version}})</dd>
|
||||
<dt>{{t 'uptime'}}</dt>
|
||||
<dd>{{system.uptime}}</dd>
|
||||
</dl>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<h2 class="panel-title"><span class="fa-fw fa-cogs"></span> {{t 'versions'}}</h2>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<dl class="dl-horizontal">
|
||||
{{#each versions}}
|
||||
<dt>{{@key}}</dt>
|
||||
<dd>{{version}} ({{repo}})</dd>
|
||||
{{/each}}
|
||||
</dl>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="panel-group" id="accordion">
|
||||
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<h2 class="panel-title">
|
||||
<span class="fa-fw fa-check-square-o"></span>
|
||||
<a data-toggle="collapse" data-parent="#accordion" href="#check">{{t 'check'}}</a>
|
||||
</h2>
|
||||
</div>
|
||||
<div id="check" class="panel-collapse collapse">
|
||||
<div class="panel-body">
|
||||
<dl class="dl-horizontal">
|
||||
<dt>{{t 'check_stmp'}}</dt>
|
||||
<dd>{{network.check.smtp_check}}</dd>
|
||||
<dt>{{t 'check_mx'}}</dt>
|
||||
<dd>
|
||||
{{#if network.check.mx_check.mx0}}
|
||||
<ul>
|
||||
{{#each network.check.mx_check}}
|
||||
<li>{{this}}</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
{{else}}
|
||||
{{network.check.mx_check}}
|
||||
{{/if}}
|
||||
</dd>
|
||||
</dl>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<h2 class="panel-title">
|
||||
<span class="fa-fw fa-cog"></span>
|
||||
<a data-toggle="collapse" data-parent="#accordion" href="#system">{{t 'system'}}</a>
|
||||
</h2>
|
||||
</div>
|
||||
<div id="system" class="panel-collapse collapse">
|
||||
<div class="panel-body row">
|
||||
|
||||
<div class="col-md-4">
|
||||
<h3>{{t 'memory'}}</h3>
|
||||
<h4>{{t 'ram'}}</h4>
|
||||
<table class="table table-condensed">
|
||||
<tr>
|
||||
<td>{{t 'used'}}</td>
|
||||
<td>{{humanSize system.memory.ram.used}} ({{system.memory.ram.percent}} %)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{t 'free'}}</td>
|
||||
<td>{{humanSize system.memory.ram.free}}</td>
|
||||
</tr>
|
||||
<tr class="active">
|
||||
<td>{{t 'total'}}</td>
|
||||
<td>{{humanSize system.memory.ram.total}}</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<h4>{{t 'swap'}}</h4>
|
||||
<table class="table table-condensed">
|
||||
<tr>
|
||||
<td>{{t 'used'}}</td>
|
||||
<td>{{humanSize system.memory.swap.used}} ({{system.memory.swap.percent}} %)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{t 'free'}}</td>
|
||||
<td>{{humanSize system.memory.swap.free}}</td>
|
||||
</tr>
|
||||
<tr class="active">
|
||||
<td>{{t 'total'}}</td>
|
||||
<td>{{humanSize system.memory.swap.total}}</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div class="col-md-4">
|
||||
<h3>{{t 'cpu_load'}}</h3>
|
||||
<table class="table table-condensed">
|
||||
<tr>
|
||||
<td>{{t 'count_min' "1"}}</td>
|
||||
<td>{{system.cpu.load.min1}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{t 'count_min' "5"}}</td>
|
||||
<td>{{system.cpu.load.min5}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{t 'count_min' "15"}}</td>
|
||||
<td>{{system.cpu.load.min15}}</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div class="col-md-4">
|
||||
<h3>{{t 'process'}}</h3>
|
||||
<table class="table table-condensed">
|
||||
<tr>
|
||||
<td>{{t 'running'}}</td>
|
||||
<td>{{system.process.running}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{t 'sleeping'}}</td>
|
||||
<td>{{system.process.sleeping}}</td>
|
||||
</tr>
|
||||
<tr class="active">
|
||||
<td>{{t 'total'}}</td>
|
||||
<td>{{system.process.total}}</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<h2 class="panel-title">
|
||||
<span class="fa-fw fa-cloud"></span>
|
||||
<a data-toggle="collapse" data-parent="#accordion" href="#network">{{t 'network'}}</a>
|
||||
</h2>
|
||||
</div>
|
||||
<div id="network" class="panel-collapse collapse">
|
||||
<div class="panel-body">
|
||||
<b>{{t 'public_ip'}}</b>{{network.infos.public_ip}}
|
||||
<br>
|
||||
<b>{{t 'gateway'}}</b>{{network.infos.gateway}}
|
||||
|
||||
<h3>{{t 'local_ip'}}</h3>
|
||||
<table class="table table-condensed">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>{{t 'interface'}}</th>
|
||||
<th>{{t 'ipv4'}}</th>
|
||||
<th>{{t 'ipv6'}}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{#each network.infos.local_ip}}
|
||||
<tr>
|
||||
<td>{{@key}}</td>
|
||||
<td>{{ ipv4 }}</td>
|
||||
<td>{{ ipv6 }}</td>
|
||||
</tr>
|
||||
{{/each}}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<h3>{{t 'usage'}}</h3>
|
||||
{{#each network.usage}}
|
||||
<div class="clearfix">
|
||||
<table class="table table-condensed">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>
|
||||
<h4>
|
||||
{{@key}}
|
||||
<small>{{t 'time_since_update'}}{{humanTime time_since_update}}</small>
|
||||
</h4>
|
||||
</th>
|
||||
<th>{{t 'bit_rate'}}</th>
|
||||
<th>{{t 'cumulative_usage'}}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>{{t 'transmission'}}</td>
|
||||
<td>{{bitRate tx time_since_update}}</td>
|
||||
<td>{{humanSize cumulative_tx}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{t 'reception'}}</td>
|
||||
<td>{{bitRate rx time_since_update}}</td>
|
||||
<td>{{humanSize cumulative_rx}}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{{/each}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<h2 class="panel-title">
|
||||
<span class="fa-fw fa-hdd-o"></span>
|
||||
<a data-toggle="collapse" data-parent="#accordion" href="#disk">{{t 'disk'}}</a>
|
||||
</h2>
|
||||
</div>
|
||||
<div id="disk" class="panel-collapse collapse">
|
||||
<div class="panel-body">
|
||||
{{#each disk}}
|
||||
<div class="clearfix">
|
||||
<h3>{{@key}}</h3>
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<h4>{{t 'filesystem'}}</h4>
|
||||
<table class="table table-condensed">
|
||||
<tr>
|
||||
<td>{{t 'fs_type'}}</td><td>{{ filesystem.fs_type }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{t 'mount_point'}}</td><td>{{ filesystem.mnt_point }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{t 'size'}}</td><td>{{humanSize filesystem.size }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{t 'used'}}</td><td>{{humanSize filesystem.used }}</td>
|
||||
</tr>
|
||||
<tr class="active">
|
||||
<td>{{t 'available'}}</td><td>{{humanSize filesystem.avail }}</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<h4>{{t 'io'}} <small>{{t 'time_since_update'}}{{humanTime io.time_since_update }}</small></h4>
|
||||
<table class="table table-condensed">
|
||||
<tr>
|
||||
<td>{{t 'read'}}</td><td>{{humanSize io.read_bytes }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{t 'write'}}</td><td>{{humanSize io.write_bytes }}</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
{{/each}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div><!-- .panel-group -->
|
||||
|
||||
{{else}}
|
||||
<div class="alert alert-warning">
|
||||
<span class="fa-exclamation-triangle"></span>
|
||||
{{t 'monitoring_disabled'}}
|
||||
<br>
|
||||
{{t 'monitoring_check_glances'}}
|
||||
</div>
|
||||
|
||||
{{/if}}
|
30
src/views/user/group_create.ms
Normal file
30
src/views/user/group_create.ms
Normal file
|
@ -0,0 +1,30 @@
|
|||
<div class="btn-breadcrumb">
|
||||
<a href="#/" ><i class="fa-home"></i><span class="sr-only">{{t 'home'}}</span></a>
|
||||
<a href="#/users" class="visible-xs">…</a>
|
||||
<a href="#/users" class="hidden-xs">{{t 'users'}}</a>
|
||||
<a href="#/groups" class="visible-xs">…</a>
|
||||
<a href="#/groups" class="hidden-xs">{{t 'group_permissions'}}</a>
|
||||
<a href="#/groups/create">{{t 'group_new'}}</a>
|
||||
</div>
|
||||
|
||||
<div class="separator"></div>
|
||||
|
||||
<form action="#/groups/create" method="POST" class="form-horizontal">
|
||||
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-body">
|
||||
<div class="form-group">
|
||||
<label for="groupname" class="col-sm-3 control-label">{{t 'group_name'}}</label>
|
||||
<div class="col-sm-9">
|
||||
<input type="text" id="groupname" name="groupname" class="form-control" placeholder="my group name" required pattern="[A-Za-z0-9_ ]+">
|
||||
<div class="help-block">{{t 'group_format_name_help'}}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="text-center">
|
||||
<input type="submit" role="button" class="btn btn-success slide back" value="{{t 'save'}}">
|
||||
</div>
|
||||
|
||||
</form>
|
134
src/views/user/group_list.ms
Normal file
134
src/views/user/group_list.ms
Normal file
|
@ -0,0 +1,134 @@
|
|||
<div class="btn-breadcrumb">
|
||||
<a href="#/"><i class="fa-home"></i><span class="sr-only">{{t 'home'}}</span></a>
|
||||
<a href="#/users">{{t 'users'}}</a>
|
||||
<a href="#/groups">{{t 'groups_and_permissions'}}</a>
|
||||
</div>
|
||||
|
||||
<div class="actions-group">
|
||||
<a role="button" href="#/groups/create" class="btn btn-success slide">
|
||||
<span class="fa-plus"></span> {{t 'group_new'}}
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="separator"></div>
|
||||
|
||||
{{!-- ======================== Partial inline view ======================= --}}
|
||||
{{#*inline "label"}}
|
||||
<span class="label label-default label-removable">
|
||||
<span class="fa-fw fa-{{icon}}"></span>
|
||||
{{text}}
|
||||
<button data-type="{{type}}s" data-action="remove" data-item="{{value}}" data-group="{{group}}">
|
||||
<span class="fa-close" style="margin-left:5px"></span>
|
||||
<span class="sr-only">{{t 'delete'}}</span>
|
||||
</button>
|
||||
</span>
|
||||
{{/inline}}
|
||||
|
||||
{{#*inline "labelsLine"}}
|
||||
{{#each items}}
|
||||
{{> label text=(call ../display .) value=. icon=../icon type=../type item=. group=../group}}
|
||||
{{/each}}
|
||||
{{#if inv}}
|
||||
<div class="btn-group">
|
||||
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||
<span class="fa-plus"></span> {{t (concat 'group_add_' type)}}
|
||||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
{{#each inv}}
|
||||
<li><button data-type="{{../type}}s" data-action="add" data-item="{{.}}" data-group="{{../group}}" >{{call ../display .}}</button></li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
</div>
|
||||
{{/if}}
|
||||
{{/inline}}
|
||||
<div id="view-groups">
|
||||
|
||||
{{!-- ======================== Groups ======================= --}}
|
||||
{{#each groups}}
|
||||
{{#unless primary}}
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading" role="tab" id="heading-context-group-{{@key}}">
|
||||
<h2 class="panel-title">
|
||||
<a role="button" data-toggle="collapse" href="#collapse-group-{{@key}}" aria-expanded="false" aria-controls="collapse-group-{{@key}}">
|
||||
<span class="fa-fw fa-group"></span> {{#if special}}{{t (concat 'group_' @key)}}{{else}}{{t 'group'}} "{{ucwords @key}}"{{/if}}
|
||||
</a>
|
||||
{{#unless special}}
|
||||
<button class="group-delete" data-action="delete-group" data-group="{{@key}}">
|
||||
<span class="fa-close"></span>
|
||||
<span class="sr-only">{{t 'delete'}}</span>
|
||||
</button>
|
||||
{{/unless}}
|
||||
</h2>
|
||||
</div>
|
||||
<div id="collapse-group-{{@key}}" class="panel-collapse collapse in" role="tabpanel" aria-labelledby="heading-context-group-{{@key}}">
|
||||
<div class="panel-body">
|
||||
<div class="row">
|
||||
<div class="col-sm-2">
|
||||
<h3>{{t 'users'}}</h3>
|
||||
</div>
|
||||
<div class="col-sm-10">
|
||||
{{#if special}}
|
||||
<div style="font-style:italic"><span class="fa-info-circle"></span> {{t (concat 'group_explain_' @key)}}</div>
|
||||
{{else}}
|
||||
{{> labelsLine display=../displayUser icon="user" type="member" items=members inv=membersInv group=@key}}
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
<hr />
|
||||
<div class="row">
|
||||
<div class="col-sm-2">
|
||||
<h3>{{t 'permissions'}}</h3>
|
||||
</div>
|
||||
<div class="col-sm-10">
|
||||
{{> labelsLine display=../displayPermission icon="key-modern" type="permission" items=permissions inv=permissionsInv group=@key}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{/unless}}
|
||||
{{/each}}
|
||||
|
||||
|
||||
{{!-- ====================== User specific permissions ==================== --}}
|
||||
<div class="panel panel-info">
|
||||
<div class="panel-heading" role="tab" id="heading-context-specific">
|
||||
<h2 class="panel-title">
|
||||
<a role="button" data-toggle="collapse" href="#collapse-specific" aria-expanded="false" aria-controls="collapse-specific">
|
||||
<span class="fa-fw fa-group"></span> {{t 'group_specific_permissions'}}
|
||||
</a>
|
||||
</h2>
|
||||
</div>
|
||||
<div id="collapse-specific" class="panel-collapse collapse in" role="tabpanel" aria-labelledby="heading-context-specific">
|
||||
<div class="panel-body">
|
||||
{{#each groups}}
|
||||
{{#if (or (and primary permissions) display)}}
|
||||
<div class="row">
|
||||
<div class="col-sm-2">
|
||||
<h3><span class="fa-fw fa-user"></span> {{@key}}</h3>
|
||||
</div>
|
||||
<div class="col-sm-10">
|
||||
{{> labelsLine display=../displayPermission icon="key-modern" type="permission" items=permissions inv=permissionsInv group=@key}}
|
||||
</div>
|
||||
</div>
|
||||
<hr />
|
||||
{{/if}}
|
||||
{{/each}}
|
||||
<div class="btn-group">
|
||||
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||
<span class="fa-plus"></span> {{t 'group_add_member'}}
|
||||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
{{#each groups}}
|
||||
{{#if primary}}
|
||||
{{#unless (or permissions display)}}
|
||||
<li><button data-action="add-user-specific-permission" data-user="{{@key}}">{{@key}}</button></li>
|
||||
{{/unless}}
|
||||
{{/if}}
|
||||
{{/each}}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
|
@ -4,6 +4,9 @@
|
|||
</div>
|
||||
|
||||
<div class="actions-group">
|
||||
<a href="#/groups" class="btn btn-info">
|
||||
<span class="fa-key-modern"></span> {{t 'groups_and_permissions_manage'}}
|
||||
</a>
|
||||
<a role="button" href="#/users/create" class="btn btn-success slide">
|
||||
<span class="fa-plus"></span> {{t 'users_new'}}
|
||||
</a>
|
||||
|
|
Loading…
Reference in a new issue