diff --git a/customize.dist/application_config.js b/customize.dist/application_config.js index e0fcd2bf9..ab29b56fa 100644 --- a/customize.dist/application_config.js +++ b/customize.dist/application_config.js @@ -10,17 +10,13 @@ but you should not change it directly (/common/application_config_internal.js) */ -define([ - '/common/application_config_internal.js', - '/api/config' - ], function (AppConfig, ApiConfig ) { +define(['/common/application_config_internal.js'], function (AppConfig) { // Example: If you want to remove the survey link in the menu: // AppConfig.surveyURL = ""; // To inform users of the support ticket panel which languages your admins speak: //AppConfig.supportLanguages = [ 'en', 'fr' ]; - AppConfig.availablePadTypes = ['drive', 'teams', 'file', 'contacts', 'convert'].concat(ApiConfig.availableApps); return AppConfig; }); diff --git a/lib/commands/admin-rpc.js b/lib/commands/admin-rpc.js index 30415dd17..5d04f9f9d 100644 --- a/lib/commands/admin-rpc.js +++ b/lib/commands/admin-rpc.js @@ -468,7 +468,7 @@ var setLastEviction = function (Env, Server, cb, data, unsafeKey) { var instanceStatus = function (Env, Server, cb) { cb(void 0, { - availableApps: Env.availableApps, + appsToDisable: Env.appsToDisable, restrictRegistration: Env.restrictRegistration, restrictSsoRegistration: Env.restrictSsoRegistration, dontStoreSSOUsers: Env.dontStoreSSOUsers, diff --git a/lib/decrees.js b/lib/decrees.js index ef2d75f4b..5bbb89907 100644 --- a/lib/decrees.js +++ b/lib/decrees.js @@ -226,13 +226,9 @@ commands.SET_SUPPORT_MAILBOX = makeGenericSetter('supportMailbox', function (arg commands.DISABLE_APPS = function (Env, args) { - const availableApps = args; - // let validated = typeof(curvePublic) === "string" && - // (Core.isValidPublicKey(curvePublic) || !curvePublic) && - // typeof(edPublic) === "string" && - // (Core.isValidPublicKey(edPublic) || !edPublic); - // if (!validated) { throw new Error('INVALID_ARGS'); } - Env.availableApps = availableApps; + if (!Array.isArray(args)) { throw new Error("INVALID_ARGS"); } + const appsToDisable = args; + Env.appsToDisable = appsToDisable; return true; }; diff --git a/lib/http-worker.js b/lib/http-worker.js index cfdb677a0..a2424b9f0 100644 --- a/lib/http-worker.js +++ b/lib/http-worker.js @@ -583,7 +583,7 @@ var serveConfig = makeRouteCache(function () { maxUploadSize: Env.maxUploadSize, premiumUploadSize: Env.premiumUploadSize, restrictRegistration: Env.restrictRegistration, - availableApps: Env.availableApps, + appsToDisable: Env.appsToDisable, restrictSsoRegistration: Env.restrictSsoRegistration, httpSafeOrigin: Env.httpSafeOrigin, enableEmbedding: Env.enableEmbedding, diff --git a/lib/stats.js b/lib/stats.js index 449803004..e3c8e502d 100644 --- a/lib/stats.js +++ b/lib/stats.js @@ -49,9 +49,6 @@ Stats.instanceData = function (Env) { // do you allow registration? data.restrictRegistration = Boolean(Env.restrictRegistration); - //which apps have you disabled? - data.availableApps = Env.availableApps - // have you removed the donate button? data.removeDonateButton = Boolean(Env.removeDonateButton); diff --git a/www/admin/app-admin.less b/www/admin/app-admin.less index 5c179326d..4ced37da4 100644 --- a/www/admin/app-admin.less +++ b/www/admin/app-admin.less @@ -26,13 +26,13 @@ padding: 10px; } -.active-app { - background-color: #323232!important; +.cp-active-app { + background-color: #323232!important; max-width:30%; } -.inactive-app { - background-color: #424242!important; +.cp-inactive-app { + background-color:#424242!important; max-width:30%; } diff --git a/www/admin/inner.js b/www/admin/inner.js index 27f968956..116263667 100644 --- a/www/admin/inner.js +++ b/www/admin/inner.js @@ -5,6 +5,7 @@ define([ 'jquery', '/common/toolbar.js', + '/common/pad-types.js', '/components/nthen/index.js', '/common/sframe-common.js', '/common/common-interface.js', @@ -17,11 +18,11 @@ define([ '/common/hyperscript.js', '/common/clipboard.js', 'json.sortify', - '/customize/application_config.js', '/api/config', '/api/instance', '/lib/datepicker/flatpickr.js', '/common/hyperscript.js', + 'css!/lib/datepicker/flatpickr.min.css', 'css!/components/bootstrap/dist/css/bootstrap.min.css', 'css!/components/components-font-awesome/css/font-awesome.min.css', @@ -29,6 +30,7 @@ define([ ], function( $, Toolbar, + PadTypes, nThen, SFCommon, UI, @@ -39,18 +41,18 @@ define([ Messages, Keys, h, + Clipboard, Sortify, - AppConfig, ApiConfig, Instance, - Flatpickr + Flatpickr, ) { //XXX Messages.admin_appSelection = 'App configuration' Messages.admin_appsTitle = "Choose your applications" - Messages.admin_appsHint = "Choose which apps are available to users on your instance." + Messages.admin_appsHint = "Choose which apps to disable on your instance." Messages.admin_cat_apps = "Apps" var APP = window.APP = {}; @@ -636,39 +638,44 @@ define([ sidebar.addItem('apps', function (cb) { const grid = blocks.block([], 'cp-admin-customize-apps-grid'); - const allApps = ['pad', 'code', 'kanban', 'slide', 'sheet', 'form', 'whiteboard', 'diagram']; - const availableApps = []; + const allApps = PadTypes.appsToSelect; + const appsToDisable = ApiConfig.appsToDisable || []; - function select(app, appBlock) { - if (availableApps.indexOf(app) === -1) { - availableApps.push(app); - var checkMark = h('div.cp-onboardscreen-checkmark'); - $(checkMark).addClass('fa-check'); - appBlock.append(checkMark); - $(`#${app}-block`).addClass('active-app') - $(`#${app}-block`).removeClass('inactive-app') - } else { - availableApps.splice(availableApps.indexOf(app), 1); - $(`#${app}-block`).addClass('inactive-app') - $(`#${app}-block`).removeClass('active-app') - appBlock.find('.cp-onboardscreen-checkmark').remove(); - } - } + function select(app, appBlock) { + if (appsToDisable.indexOf(app) === -1) { + appsToDisable.push(app); + var checkMark = h('div.cp-onboardscreen-checkmark'); + $(checkMark).addClass('fa.fa-check'); + appBlock.append(checkMark); + $(`#${app}-block`).addClass('cp-active-app') + $(`#${app}-block`).removeClass('cp-inactive-app') + } else { + appsToDisable.splice(appsToDisable.indexOf(app), 1); + $(`#${app}-block`).addClass('cp-inactive-app') + $(`#${app}-block`).removeClass('cp-active-app') + appBlock.find('.cp-onboardscreen-checkmark').remove(); + } + } - allApps.forEach(app => { - let appBlock = h('div.cp-appblock.inactive-app', {id: `${app.toString()}-block`}, app.charAt(0).toUpperCase() + app.slice(1)) - $(grid).append(appBlock); - $(appBlock).on('click', () => select(app, $(appBlock))); - }); + allApps.forEach(app => { + + let appBlock = h('div.cp-appblock', {id: `${app.toString()}-block`}, app.charAt(0).toUpperCase() + app.slice(1)) + if (appsToDisable.indexOf(app) === -1) { + $(appBlock).addClass('cp-inactive-app') + } else { + $(appBlock).addClass('cp-active-app') + } + $(grid).append(appBlock); + $(appBlock).on('click', () => select(app, $(appBlock))); + }); var save = blocks.activeButton('primary', '', Messages.settings_save, function (done) { sFrameChan.query('Q_ADMIN_RPC', { cmd: 'ADMIN_DECREE', - data: ['DISABLE_APPS', availableApps] + data: ['DISABLE_APPS', appsToDisable] }, function (e, response) { if (e || response.error) { UI.warn(Messages.error); - $input.val(''); console.error(e, response); done(false); return; diff --git a/www/common/inner/sidebar-layout.js b/www/common/inner/sidebar-layout.js index 38748a18c..a57f7f97c 100644 --- a/www/common/inner/sidebar-layout.js +++ b/www/common/inner/sidebar-layout.js @@ -22,6 +22,9 @@ define([ h ) { const Sidebar = {}; + const keyToCamlCase = (key) => { + return key.replace(/-([a-z])/g, function (g) { return g[1].toUpperCase(); }); + }; Sidebar.blocks = function (app) { @@ -214,9 +217,7 @@ define([ return button; }; - const keyToCamlCase = (key) => { - return key.replace(/-([a-z])/g, function (g) { return g[1].toUpperCase(); }); - }; + blocks.activeCheckbox = (data) => { const state = data.getState(); const key = data.key; @@ -244,9 +245,6 @@ define([ } - // let blocks = Sidebar.blocks(app) = {}; - - Sidebar.create = function (common, app, $container) { const $leftside = $(h('div#cp-sidebarlayout-leftside')).appendTo($container); const $rightside = $(h('div#cp-sidebarlayout-rightside')).appendTo($container); @@ -258,9 +256,6 @@ define([ sidebar.blocks = Sidebar.blocks(app) sidebar.addItem = (key, get, options) => { - const keyToCamlCase = (key) => { - return key.replace(/-([a-z])/g, function (g) { return g[1].toUpperCase(); }); - }; const safeKey = keyToCamlCase(key); get((content) => { if (content === false) { return; } @@ -288,7 +283,7 @@ define([ sidebar.addCheckboxItem = (data) => { const key = data.key; - let blocks = Sidebar.blocks(app) + let blocks = sidebar.blocks let box = blocks.activeCheckbox(data); sidebar.addItem(key, function (cb) { cb(box); diff --git a/www/common/pad-types.js b/www/common/pad-types.js index 86390e885..724627a26 100644 --- a/www/common/pad-types.js +++ b/www/common/pad-types.js @@ -12,12 +12,22 @@ define([ OOCurrentVersion.currentVersion, ); - let availableTypes = AppConfig.availablePadTypes.filter( - (t) => ooEnabled || !OO_APPS.includes(t), + let availablePadTypes = AppConfig.availablePadTypes.filter( + (t) => ooEnabled || !OO_APPS.includes(t) ); + let availableTypes; + if (ApiConfig.appsToDisable) { + availableTypes = availablePadTypes.filter(value => !ApiConfig.appsToDisable.includes(value)) + } else { + availableTypes = availablePadTypes + } + + var appsToSelect = availablePadTypes.filter(value => !['drive', 'teams', 'file', 'contacts', 'convert'].includes(value)) + return { availableTypes, + appsToSelect, isAvailable: function (type) { return availableTypes.includes(type); diff --git a/www/common/translations/messages.json b/www/common/translations/messages.json index d3768036b..900de6aed 100644 --- a/www/common/translations/messages.json +++ b/www/common/translations/messages.json @@ -1006,7 +1006,6 @@ "snapshots_cantMake": "The snapshot could not be created. You are disconnected.", "admin_registrationHint": "Do not allow any new users to register", "admin_registrationTitle": "Close registration", - "install_registrationTitle": "Close registration", "admin_defaultlimitHint": "Maximum storage limit for CryptDrives (users and teams) when no custom rule is applied", "admin_defaultlimitTitle": "Storage limit (MB)", "admin_setlimitButton": "Set limit", @@ -1438,7 +1437,6 @@ "admin_uptimeHint": "Date and time at which the server was launched", "admin_cat_database": "Database", "admin_generatedAt": "Report timestamp", - "admin_cat_apps": "Apps", "ui_true": "true", "ui_false": "false", "ui_undefined": "unknown", @@ -1682,7 +1680,6 @@ "kanban_showTags": "See all tags", "kanban_hideTags": "See less tags", "admin_forcemfaTitle": "Mandatory Two-Factor Authentication", - "install_forcemfaTitle": "Mandatory Two-Factor Authentication", "admin_forcemfaHint": "All users on this instance will be asked to set up two-factor authentication to log in to their account.", "loading_mfa_required": "Two-factor authentication is required on this instance. Please update your account using an authenticator app and the form below.", "admin_cat_users": "User directory", diff --git a/www/install/onboarding.less b/www/install/onboarding.less index 0b53c5f1f..0ac025055 100644 --- a/www/install/onboarding.less +++ b/www/install/onboarding.less @@ -213,10 +213,10 @@ nav.cp-onboardscreen-nav { // padding: 10px; // } -// .active-app { -// background-color: #212121!important; -// max-width:30%; -// } +.cp-active-app { + background-color: #212121!important; + max-width:30%; +} // .cp-admin-customize-options-grid { // height:40%; diff --git a/www/install/onboardscreen.js b/www/install/onboardscreen.js index beb0b65a2..372d868e2 100644 --- a/www/install/onboardscreen.js +++ b/www/install/onboardscreen.js @@ -6,6 +6,8 @@ define([ '/common/common-interface.js', '/common/common-util.js', '/common/common-ui-elements.js', + '/common/pad-types.js', + '/api/instance', 'css!/components/bootstrap/dist/css/bootstrap.min.css', 'css!/components/components-font-awesome/css/font-awesome.min.css', @@ -17,18 +19,21 @@ define([ h, UI, Util, - UIElements + UIElements, + PadTypes ) { //XXX - Messages.install_onboardingNameTitle = 'Welcome to your CryptPad instance'; - Messages.install_onboardingNameHint = 'Please choose a title and description'; - Messages.install_onboardingAppsTitle = "Choose your applications"; - Messages.install_onboardingAppsHint = "Choose which apps are available to users on your instance"; - Messages.install_onboardingRegistrationTitle = "Options"; - Messages.install_onboardingRegistrationHint = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. In id tristique justo"; - Messages.install_onboardingRegistration = "Visitors to the instance are not able to create accounts. Invitations can be created by administrators"; - Messages.install_onboardingMfa = "All accounts on the instance have to use 2-factor authentication"; + Messages.admin_onboardingNameTitle = 'Welcome to your CryptPad instance'; + Messages.admin_onboardingNameHint = 'Please choose a title and description'; + Messages.admin_onboardingAppsTitle = "Choose your applications"; + Messages.admin_onboardingAppsHint = "Choose which apps to disable on your instance"; + Messages.admin_onboardingRegistrationTitle = "Options"; + Messages.admin_onboardingRegistrationHint = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. In id tristique justo"; + Messages.admin_onboardingRegistration = "Visitors to the instance are not able to create accounts. Invitations can be created by administrators"; + Messages.admin_onboardingMfa = "All accounts on the instance have to use 2-factor authentication"; + Messages.admin_onboardingNamePlaceholder = 'Instance title' + Messages.admin_onboardingDescPlaceholder = 'Placeholder description text' var OnboardScreen = {}; @@ -52,21 +57,33 @@ define([ }; + var flushCache = () => { + console.log('flushcashe') + // sendAdminDecree('FLUSH_CACHE', function (e, response) { + // if (e || response.error) { + // UI.warn(Messages.error); + // console.error(e, response); + // return; + // } + + // }) + }; + OnboardScreen.titleConfig = function (sendAdminDecree, sendAdminRpc) { - const blocks = Sidebar.blocks('install'); + const blocks = Sidebar.blocks('admin'); var titleDescBlock = function() { var input = blocks.input({ type: 'text', value: '', - placeholder: 'Instance title', + placeholder: Messages.admin_onboardingNamePlaceholder, 'aria-labelledby': 'cp-admin-name' }); var desc = blocks.textarea({ - placeholder: 'Placeholder description text', + placeholder: Messages.admin_onboardingDescPlaceholder, value: '', 'aria-labelledby': 'cp-admin-description' }); @@ -122,11 +139,9 @@ define([ UI.warn(Messages.error); $(inputLogo).val(''); console.error(e, response); - // done(false); return; } - // flushCache(); - // done(true); + flushCache(); redraw(); spinner.done(); UI.log(Messages.saved); @@ -191,12 +206,11 @@ define([ sendAdminDecree('SET_INSTANCE_NAME', [$(titleInput).val().trim()], function (e, response) { if (e || response.error) { UI.warn(Messages.error); - $input.val(''); console.error(e, response); done(false); return; } - // flushCache(); + flushCache(); done(true); UI.log(Messages.saved); @@ -204,12 +218,11 @@ define([ sendAdminDecree('SET_INSTANCE_DESCRIPTION', [$(desc).val().trim()], function (e, response) { if (e || response.error) { UI.warn(Messages.error); - $input.val(''); console.error(e, response); done(false); return; } - // flushCache(); + flushCache(); done(true); UI.log(Messages.saved); @@ -253,41 +266,40 @@ define([ OnboardScreen.appConfig = function (sendAdminDecree) { - const blocks = Sidebar.blocks('install'); + const blocks = Sidebar.blocks('admin'); const grid = blocks.block([], 'cp-admin-customize-apps-grid'); - const allApps = ['pad', 'code', 'kanban', 'slide', 'sheet', 'form', 'whiteboard', 'diagram']; - const availableApps = []; + const allApps = PadTypes.appsToSelect; + const appsToDisable = []; function select(app, appBlock) { - if (availableApps.indexOf(app) === -1) { - availableApps.push(app); + if (appsToDisable.indexOf(app) === -1) { + appsToDisable.push(app); var checkMark = h('div.cp-onboardscreen-checkmark'); $(checkMark).addClass('fa-check'); appBlock.append(checkMark); - $(`#${app}-block`).addClass('active-app') + $(`#${app}-block`).addClass('cp-active-app') } else { - availableApps.splice(availableApps.indexOf(app), 1); - $(`#${app}-block`).addClass('inactive-app') + appsToDisable.splice(appsToDisable.indexOf(app), 1); + $(`#${app}-block`).addClass('cp-inactive-app') appBlock.find('.cp-onboardscreen-checkmark').remove(); } } allApps.forEach(app => { - let appBlock = h('div.cp-appblock.inactive-app', {id: `${app.toString()}-block`}, app.charAt(0).toUpperCase() + app.slice(1)) + let appBlock = h('div.cp-appblock.cp-inactive-app', {id: `${app.toString()}-block`}, app.charAt(0).toUpperCase() + app.slice(1)) $(grid).append(appBlock); $(appBlock).on('click', () => select(app, $(appBlock))); }); var save = blocks.activeButton('primary', '', Messages.settings_save, function (done) { - sendAdminDecree('DISABLE_APPS', availableApps, function (e, response) { + sendAdminDecree('DISABLE_APPS', appsToDisable, function (e, response) { if (e || response.error) { UI.warn(Messages.error); - $input.val(''); console.error(e, response); done(false); return; } - // flushCache(); + flushCache(); done(true); UI.log(Messages.saved); @@ -318,7 +330,7 @@ define([ } OnboardScreen.mfaRegistrationScreen = function(sendAdminDecree, app) { - const blocks = Sidebar.blocks('install'); + const blocks = Sidebar.blocks('admin'); var restrict = blocks.activeCheckbox({ key: 'registration', @@ -330,13 +342,11 @@ define([ sendAdminDecree('RESTRICT_REGISTRATION', [val], function (e, response) { if (e || response.error) { UI.warn(Messages.error); - $input.val(''); console.error(e, response); done(false); return; } - // flushCache(); - // done(true); + flushCache(); UI.log(Messages.saved); }); @@ -353,13 +363,11 @@ define([ sendAdminDecree('ENFORCE_MFA', [val], function (e, response) { if (e || response.error) { UI.warn(Messages.error); - $input.val(''); console.error(e, response); done(false); return; } - // flushCache(); - // done(true); + flushCache(); UI.log(Messages.saved); }) @@ -369,9 +377,9 @@ define([ const grid = blocks.block([], 'cp-admin-customize-options-grid'); const options = [restrict, forceMFA]; - let mfaOption = h('div.cp-appblock.inactive-app', forceMFA, h('br'), Messages.install_onboardingMfa); + let mfaOption = h('div.cp-appblock.cp-inactive-app', forceMFA, h('br'), Messages.admin_onboardingMfa); $(grid).append(mfaOption); - let registrationOption = h('div.cp-appblock.inactive-app', restrict, h('br'), Messages.install_onboardingRegistration); + let registrationOption = h('div.cp-appblock.cp-inactive-app', restrict, h('br'), Messages.admin_onboardingRegistration); $(grid).append(registrationOption); var save = blocks.activeButton('primary', '', Messages.settings_save, function () {