diff --git a/customize.dist/src/less2/include/sidebar-layout.less b/customize.dist/src/less2/include/sidebar-layout.less index 6d080c6fc..c3bec918f 100644 --- a/customize.dist/src/less2/include/sidebar-layout.less +++ b/customize.dist/src/less2/include/sidebar-layout.less @@ -120,7 +120,10 @@ .cp-sidebar-bigger-alert { font-size: 16px; } - + label { + margin-bottom: 0; + margin-top: 0.5rem; + } } diff --git a/www/common/inner/sidebar-layout.js b/www/common/inner/sidebar-layout.js index a73071c3b..41b930013 100644 --- a/www/common/inner/sidebar-layout.js +++ b/www/common/inner/sidebar-layout.js @@ -83,6 +83,35 @@ define([ return box; }; + blocks.list = (items) => { + const table = h('table.cp-sidebar-list'); + + const headerRow = h('tr', [ + h('th', 'Link'), + h('th', 'Alias'), + h('th', 'Email'), + h('th', 'Creation Time'), + h('th', 'Actions') + ]); + table.appendChild(headerRow); + items.forEach(item => { + const row = h('tr', [ + h('td', item.url), + h('td', item.alias), + h('td', item.email), + h('td', new Date(item.time).toLocaleString()), + h('td', [ + h('button', 'Copy'), + h('button', 'Delete') + ]) + ]); + table.appendChild(row); + }); + + return table; + }; + + blocks.clickableButton = function (type, icon, text, callback) { var button = blocks.button(type, icon, text); var $button = $(button); diff --git a/www/newadmin/inner.js b/www/newadmin/inner.js index 96a62dbc1..653934bcf 100644 --- a/www/newadmin/inner.js +++ b/www/newadmin/inner.js @@ -483,7 +483,219 @@ define([ }); var getPrettySize = UIElements.prettySize; - //user blocks + //user blocks + //to determine functionilty for both sso reg and simpple one + sidebar.addCheckboxItem({ + key: 'registration', + getState: function () { + return APP.instanceStatus.restrictRegistration; + }, + query: function (val, setState) { + sFrameChan.query('Q_ADMIN_RPC', { + cmd: 'ADMIN_DECREE', + data: ['RESTRICT_REGISTRATION', [val]] + }, function (e, response) { + if (e || response.error) { + UI.warn(Messages.error); + console.error(e, response); + } + APP.updateStatus(function () { + setState(APP.instanceStatus.restrictRegistration); + refresh(); + flushCacheNotice(); + }); + }); + }, + }); + + var ssoEnabled = ApiConfig.sso && ApiConfig.sso.list && ApiConfig.sso.list.length; + + sidebar.addCheckboxItem({ + key: 'registration', + getState: function () { + return APP.instanceStatus.restrictRegistration; + }, + query: function (val, setState) { + sFrameChan.query('Q_ADMIN_RPC', { + cmd: 'ADMIN_DECREE', + data: ['RESTRICT_REGISTRATION', [val]] + }, function (e, response) { + if (e || response.error) { + UI.warn(Messages.error); + console.error(e, response); + } + APP.updateStatus(function () { + setState(APP.instanceStatus.restrictRegistration); + flushCacheNotice(); + }); + }); + }, + }); + + if (ssoEnabled) { + sidebar.addCheckboxItem({ + key: 'registration-sso', + getState: function () { + return APP.instanceStatus.restrictSsoRegistration; + }, + query: function (val, setState) { + sFrameChan.query('Q_ADMIN_RPC', { + cmd: 'ADMIN_DECREE', + data: ['RESTRICT_SSO_REGISTRATION', [val]] + }, function (e, response) { + if (e || response.error) { + UI.warn(Messages.error); + console.error(e, response); + } + APP.updateStatus(function () { + setState(APP.instanceStatus.restrictSsoRegistration); + flushCacheNotice(); + }); + }); + }, + }); + } + + //invitation + sidebar.addItem('invitation', function(cb){ + var button = blocks.button('primary', '', Messages.admin_invitationCreate); + var $b = $(button); + + var inputAlias = blocks.input({ + type: 'text', + 'aria-labelledby': 'cp-admin-invitation-alias' + }); + var input = blocks.labelledInput(Messages.admin_invitationAlias, inputAlias); + + var email = blocks.input({ + type: 'email', + 'aria-labelledby': 'cp-admin-invitation-email' + }); + var inputEmail = blocks.labelledInput(Messages.admin_invitationEmail, email); + + var refreshInvite = function () {}; + var refreshButton = blocks.button('secondary', '', Messages.oo_refresh); + Util.onClickEnter($(refreshButton), function () { + refreshInvite(); + }); + + var list = blocks.list([]); + var $list = $(list); + var nav = blocks.nav([button, refreshButton]); + var form = blocks.form([ + input, + inputEmail + ], nav); + + var metadataMgr = common.getMetadataMgr(); + var privateData = metadataMgr.getPrivateData(); + + var deleteInvite = function (id) { + sFrameChan.query('Q_ADMIN_RPC', { + cmd: 'DELETE_INVITATION', + data: id + }, function (e, response) { + $b.prop('disabled', false); + if (e || response.error) { + UI.warn(Messages.error); + return void console.error(e, response); + } + refreshInvite(); + }); + }; + + refreshInvite = function () { + $list.empty(); + sFrameChan.query('Q_ADMIN_RPC', { + cmd: 'GET_ALL_INVITATIONS', + }, function (e, response) { + if (e || response.error) { + if (!response || response.error !== "ENOENT") { UI.warn(Messages.error); } + console.error(e, response); + return; + } + if (!Array.isArray(response)) { return; } + var all = response[0]; + Object.keys(all).forEach(function (key, i) { + if (!i) { // First item: add header to table + var trHead = h('tr', [ + h('th', Messages.admin_invitationLink), + h('th', Messages.admin_invitationAlias), + h('th', Messages.admin_invitationEmail), + h('th', Messages.admin_documentCreationTime), + h('th') + ]); + $list.append(trHead); + } + var data = all[key]; + var url = privateData.origin + Hash.hashToHref(key, 'register'); + + var del = blocks.button('danger', 'fa.fa-trash', Messages.kanban_delete ) + var $del = $(del); + Util.onClickEnter($del, function () { + $del.attr('disabled', 'disabled'); + UI.confirm(Messages.admin_invitationDeleteConfirm, function (yes) { + $del.attr('disabled', ''); + if (!yes) { return; } + deleteInvite(key); + }); + }); + var copy = blocks.button('secondary', '', Messages.admin_invitationCopy ) + Util.onClickEnter($(copy), function () { + Clipboard.copy(url, () => { + UI.log(Messages.genericCopySuccess); + }); + }); + var line = h('tr', [ + h('td', UI.dialog.selectable(url)), + h('td', data.alias), + h('td', data.email), + h('td', new Date(data.time).toLocaleString()), + //h('td', data.createdBy), + h('td', [ + copy, + del + ]) + ]); + $list.append(line); + }); + }); + }; + + refreshInvite(); + + $b.on('click', () => { + var alias = $(input).val().trim(); + if (!alias) { return void UI.warn(Messages.error); } // FIXME better error message + $b.prop('disabled', true); + sFrameChan.query('Q_ADMIN_RPC', { + cmd: 'CREATE_INVITATION', + data: { + alias, + email: $(inputEmail).val() + } + }, function (e, response) { + $b.prop('disabled', false); + if (e || response.error) { + UI.warn(Messages.error); + return void console.error(e, response); + } + $(input).val('').focus(); + $(inputEmail).val(''); + refreshInvite(); + }); + }); + + cb(form); + }); + + //user directory + + + + //QUOTA + + //storage blocks sidebar.addItem('defaultlimit', function (cb) { @@ -538,6 +750,112 @@ define([ cb(form); }); + sidebar.addItem('setlimit', function(cb){ + + var userInput = blocks.input({ + type:'key', + 'aria-labelledby': 'cp-admin-setlimit-user' + }); + var user = blocks.labelledInput(Messages.admin_limitUser, userInput); + var $key = $(user); + var limitInput = blocks.input({ + type: 'number', + min: 0, + value: 0, + 'aria-labelledby': 'cp-admin-setlimit-value' + }); + var limit = blocks.labelledInput(Messages.admin_limitMB, limitInput); + var noteInput = blocks.input({ + type: 'text', + 'aria-labelledby': 'cp-admin-setlimit-note' + }); + var note = blocks.labelledInput(Messages.admin_limitSetNote, noteInput); + var $note = $(note); + var remove = blocks.button('danger', '',Messages.fc_remove ); + var set = blocks.button('primary', '', Messages.admin_setlimitButton); + var nav = blocks.nav([set, remove]); + var form = blocks.form([ + user, + limit, + note + ], nav); + + var getValues = function () { + var key = $key.val(); + var _limit = parseInt($(limit).val()); + if (key.length !== 44) { + try { + var u = Keys.parseUser(key); + if (!u.domain || !u.user || !u.pubkey) { + return void UI.warn(Messages.admin_invalKey); + } + } catch (e) { + return void UI.warn(Messages.admin_invalKey); + } + } + if (isNaN(_limit) || _limit < 0) { + return void UI.warn(Messages.admin_invalLimit); + } + var _note = ($note.val() || "").trim(); + return { + key: key, + data: { + limit: _limit * 1024 * 1024, + note: _note, + plan: 'custom' + } + }; + }; + UI.confirmButton(remove, { + classes: 'btn-danger', + multiple: true, + validate: function () { + var obj = getValues(); + if (!obj || !obj.key) { return false; } + return true; + } + }, function () { + var obj = getValues(); + var data = [obj.key]; + sFrameChan.query('Q_ADMIN_RPC', { + cmd: 'ADMIN_DECREE', + data: ['RM_QUOTA', data] + }, function (e, response) { + if (e || response.error) { + UI.warn(Messages.error); + console.error(e, response); + return; + } + APP.refreshLimits(); + $key.val(''); + }); + }); + + $(set).click(function () { + var obj = getValues(); + if (!obj || !obj.key) { return; } + var data = [obj.key, obj.data]; + sFrameChan.query('Q_ADMIN_RPC', { + cmd: 'ADMIN_DECREE', + data: ['SET_QUOTA', data] + }, function (e, response) { + if (e || response.error) { + UI.warn(Messages.error); + console.error(e, response); + return; + } + APP.refreshLimits(); + $key.val(''); + $note.val(''); + }); + }); + + cb(form); + + }); + + + sidebar.makeLeftside(categories); };