Merge branch 'appconfig_ui' of github.com:cryptpad/cryptpad into appconfig_ui

This commit is contained in:
David Benque 2024-06-19 17:45:05 +01:00
commit be2d9ad247
12 changed files with 114 additions and 108 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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