Onboarding: remember values when switching page

This commit is contained in:
yflory 2024-06-20 16:45:00 +02:00
parent 51aeb8bc7e
commit 1feaa69652
3 changed files with 140 additions and 84 deletions

View file

@ -1064,6 +1064,21 @@ define([
} }
}; };
UI.getNewIcon = function (type) {
var icon = h('i.fa.fa-file-text-o');
if (AppConfig.applicationsIcon && AppConfig.applicationsIcon[type]) {
var icon = AppConfig.applicationsIcon[type];
var font = icon.indexOf('cptools') === 0 ? 'cptools' : 'fa';
if (type === 'fileupload') { type = 'file'; }
if (type === 'folderupload') { type = 'file'; }
if (type === 'link') { type = 'drive'; }
var appClass = ' cp-icon cp-icon-color-'+type;
icon = h('i', {'class': font + ' ' + icon + appClass});
}
return icon;
};
var $defaultIcon = $('<span>', {"class": "fa fa-file-text-o"}); var $defaultIcon = $('<span>', {"class": "fa fa-file-text-o"});
UI.getIcon = function (type) { UI.getIcon = function (type) {
var $icon = $defaultIcon.clone(); var $icon = $defaultIcon.clone();

View file

@ -4,6 +4,7 @@
@import (reference) "../../customize/src/less2/include/markdown.less"; @import (reference) "../../customize/src/less2/include/markdown.less";
@import (reference) "../../customize/src/less2/include/avatar.less"; @import (reference) "../../customize/src/less2/include/avatar.less";
@import (reference) '../../customize/src/less2/include/admin.less'; @import (reference) '../../customize/src/less2/include/admin.less';
@import (reference) '../../customize/src/less2/include/icon-colors.less';
&.cp-page-install { &.cp-page-install {
.admin_main(); .admin_main();
@ -29,6 +30,21 @@
box-shadow: 0px 0px 10px 0px @cp_shadow-color; box-shadow: 0px 0px 10px 0px @cp_shadow-color;
padding: 30px 110px 20px 110px; padding: 30px 110px 20px 110px;
} }
.cp-onboarding-logo-input {
display: none;
}
.cp-onboardscreen-logo {
min-width: 200px;
max-width: 200px;
nav {
display: flex;
margin-top: 0.5rem;
justify-content: center;
}
}
.cp-appblock {
.iconColors_main();
}
} }
} }
@ -73,7 +89,6 @@
border: 0px transparent !important; border: 0px transparent !important;
} }
.cp-onboardscreen-logo { .cp-onboardscreen-logo {
width: 130px;
.cp-sidebar-form { .cp-sidebar-form {
background-color: @cp_forms-bg; background-color: @cp_forms-bg;
border-radius: @variables_radius; border-radius: @variables_radius;
@ -224,9 +239,17 @@ nav.cp-onboardscreen-nav {
// padding: 10px; // padding: 10px;
// } // }
.cp-inactive-app {
.cp-on-enabled {
visibility: hidden;
}
}
.cp-active-app { .cp-active-app {
background-color: #212121!important; background-color: #212121!important;
max-width:30%; max-width:30%;
.cp-on-enabled {
visibility: visible;
}
} }
// .cp-admin-customize-options-grid { // .cp-admin-customize-options-grid {

View file

@ -2,6 +2,7 @@ define([
'jquery', 'jquery',
'/common/inner/sidebar-layout.js', '/common/inner/sidebar-layout.js',
'/customize/messages.js', '/customize/messages.js',
'/customize/application_config.js',
'/common/hyperscript.js', '/common/hyperscript.js',
'/common/common-interface.js', '/common/common-interface.js',
'/common/common-util.js', '/common/common-util.js',
@ -16,6 +17,7 @@ define([
$, $,
Sidebar, Sidebar,
Messages, Messages,
AppConfig,
h, h,
UI, UI,
Util, Util,
@ -24,6 +26,7 @@ define([
) { ) {
//XXX //XXX
Messages.onboarding_upload = "Select logo";
Messages.admin_onboardingNameTitle = 'Welcome to your CryptPad instance'; Messages.admin_onboardingNameTitle = 'Welcome to your CryptPad instance';
Messages.admin_onboardingNameHint = 'Please choose a title and description'; Messages.admin_onboardingNameHint = 'Please choose a title and description';
Messages.admin_onboardingAppsTitle = "Choose your applications"; Messages.admin_onboardingAppsTitle = "Choose your applications";
@ -45,6 +48,7 @@ define([
let frame = h('div.cp-onboarding-box', nextPageForm); let frame = h('div.cp-onboarding-box', nextPageForm);
Env.overlay.empty().append(frame); Env.overlay.empty().append(frame);
}; };
const blocks = Sidebar.blocks('admin');
//TODO: fix EXPECTED_FUNCTION error //TODO: fix EXPECTED_FUNCTION error
var flushCache = () => { var flushCache = () => {
@ -59,36 +63,33 @@ define([
// }) // })
}; };
var selections = {title: '', description: '', logoURL: '', color: '', appsToDisable: [], mfa: false, closeRegistration: false}; var selections = {
title: '',
description: '',
logoURL: '',
color: '',
appsToDisable: [],
mfa: false,
closeRegistration: false
};
const titleConfig = function (Env) { const titleConfig = function (Env) {
const { sendAdminDecree, sendAdminRpc } = Env; const { sendAdminDecree, sendAdminRpc } = Env;
const blocks = Sidebar.blocks('admin'); let titleInput = blocks.input({
var titleDescBlock = function() {
var input = blocks.input({
type: 'text', type: 'text',
value: '', value: selections.title,
placeholder: selections.title || Messages.admin_onboardingNamePlaceholder, placeholder: Messages.admin_onboardingNamePlaceholder,
'aria-labelledby': 'cp-admin-name' 'aria-labelledby': 'cp-admin-name'
}); });
let description = blocks.textarea({
var desc = blocks.textarea({ placeholder: Messages.admin_onboardingDescPlaceholder,
placeholder: selections.description || Messages.admin_onboardingDescPlaceholder,
value: '',
'aria-labelledby': 'cp-admin-description' 'aria-labelledby': 'cp-admin-description'
}); }, selections.description);
$(description).addClass('cp-onboardscreen-desc');
$(desc).addClass('cp-onboardscreen-desc');
return [input, desc];
};
let dataURL = '';
var logoBlock = function() {
let dataURL = selections.logoURL;
var getLogoBlock = function() {
let inputLogo = blocks.input({ let inputLogo = blocks.input({
type: 'file', type: 'file',
accept: 'image/*', accept: 'image/*',
@ -96,65 +97,73 @@ define([
}); });
var currentContainer = blocks.block([], 'cp-admin-customize-logo'); var currentContainer = blocks.block([], 'cp-admin-customize-logo');
let redraw = () => {
var current = h('img', {src: '/api/logo?'+(+new Date())});
$(currentContainer).empty().append(current);
};
redraw();
var upload = blocks.button('primary', '', Messages.admin_logoButton); var upload = blocks.button('secondary', '', Messages.onboarding_upload);
var remove = blocks.button('danger', '', Messages.admin_logoRemoveButton);
let spinnerBlock = blocks.inline();
let spinner = UI.makeSpinner($(spinnerBlock));
let formLogo = blocks.form([ let formLogo = blocks.form([
currentContainer, currentContainer,
blocks.block(inputLogo), blocks.block(inputLogo, 'cp-onboarding-logo-input'),
blocks.nav([upload, remove, spinnerBlock]) blocks.nav([upload])
]); ]);
let $button = $(upload); let $button = $(upload);
let $remove = $(remove);
//TODO: update preview let state = false;
Util.onClickEnter($button, function () { let redraw = () => {
var current = h('img', {src: dataURL || '/api/logo?'+(+new Date())});
$(currentContainer).empty().append(current);
$button.removeAttr('disabled');
state = !!dataURL;
if (dataURL) {
$button.text(Messages.admin_logoRemoveButton);
$button.removeClass('btn-secondary').addClass('btn-danger-alt');
} else {
$button.text(Messages.onboarding_upload);
$button.removeClass('btn-danger-alt').addClass('btn-secondary');
}
};
redraw();
let $input = $(inputLogo);
$input.on('change', function () {
let files = inputLogo.files; let files = inputLogo.files;
if (files.length !== 1) { if (files.length !== 1) {
UI.warn(Messages.error); UI.warn(Messages.error);
return; return;
} }
spinner.spin();
$button.attr('disabled', 'disabled');
let reader = new FileReader(); let reader = new FileReader();
reader.onloadend = function () { reader.onloadend = function () {
dataURL = this.result; dataURL = this.result;
redraw(dataURL);
}; };
reader.readAsDataURL(files[0]); reader.readAsDataURL(files[0]);
}); });
UI.confirmButton($remove, { Util.onClickEnter($button, function () {
classes: 'btn-danger', $button.attr('disabled', 'disabled');
multiple: true if (!state) {
}, function () { return void $input.click();
spinner.spin(); }
$remove.attr('disabled', 'disabled'); dataURL = '';
selections.logoURL = ''; redraw();
}); });
return formLogo; return formLogo;
}; };
var colorBlock = function () { var getColorBlock = function () {
let selectorColor = '';
// XXX Number of accent color presets // XXX Number of accent color presets
var colors = UIElements.makePalette(5, (color, $color) => { var colors = UIElements.makePalette(5, (color, $color) => {
let rgb = $color.css('background-color'); let rgb = $color.css('background-color');
let hex = Util.rgbToHex(rgb); let hex = Util.rgbToHex(rgb);
selectorColor = hex;
if (hex) { if (hex) {
selections.color = hex; selections.color = hex;
selections.colorId = color;
} }
}); });
if (selections.colorId) {
colors.setValue(selections.colorId);
}
var $colors = $(colors).attr('id', 'cp-install-color'); var $colors = $(colors).attr('id', 'cp-install-color');
var content = h('div.cp-onboardscreen-colorpick', [ var content = h('div.cp-onboardscreen-colorpick', [
h('label', {for:'cp-install-color'}, Messages.kanban_color), h('label', {for:'cp-install-color'}, Messages.kanban_color),
@ -165,12 +174,8 @@ define([
}; };
var button = blocks.activeButton('primary', '', Messages.settings_save, function (done) { var button = blocks.activeButton('primary', '', Messages.settings_save, function (done) {
if ($($(titleInput).children()[0]).val() !== '') { selections.title = $(titleInput).val() || '';
selections.title = $($(titleInput).children()[0]).val(); selections.description = $(description).val() || '';
}
if ($($(desc).children()[0]).val() !== '') {
selections.description = $($(desc).children()[0]).val();
}
if (dataURL) { if (dataURL) {
selections.logoURL = dataURL; selections.logoURL = dataURL;
} }
@ -178,25 +183,28 @@ define([
gotoPage(Env, 1); gotoPage(Env, 1);
}); });
var titleInput = h('div.cp-onboardscreen-name', titleDescBlock()[0]); var titleBlock = h('div.cp-onboardscreen-name', titleInput);
var logoInput = h('div.cp-onboardscreen-logo', logoBlock()); var descriptionBlock = h('div', description);
var desc = h('div', titleDescBlock()[1]); var logoBlock = h('div.cp-onboardscreen-logo', getLogoBlock());
var colorInput = h('div.cp-onboardscreen-color', colorBlock()); var colorBlock = h('div.cp-onboardscreen-color', getColorBlock());
var screenTitle = h('div.cp-onboardscreen-screentitle'); var screenTitle = h('div.cp-onboardscreen-screentitle');
$(screenTitle).append(h('div.cp-onboardscreen-maintitle', h('h1.cp-onboardscreen-title', Messages.admin_onboardingNameTitle), h('span', Messages.admin_onboardingNameHint))); $(screenTitle).append(('div.cp-onboardscreen-maintitle', [
var nav = blocks.nav([button]); h('h1.cp-onboardscreen-title', Messages.admin_onboardingNameTitle),
h('span', Messages.admin_onboardingNameHint)
]));
var nav = blocks.nav([h('span'), button]);
$(button).addClass('cp-onboardscreen-save'); $(button).addClass('cp-onboardscreen-save');
$(nav).addClass('cp-onboardscreen-nav'); $(nav).addClass('cp-onboardscreen-nav');
var textForm= h('div.cp-instance-text-form',[ var textForm = h('div.cp-instance-text-form', [
titleInput, titleBlock,
desc, descriptionBlock,
colorInput, colorBlock,
]); ]);
var instanceForm = h('div.cp-instance-form', [logoInput, textForm]); var instanceForm = h('div.cp-instance-form', [logoBlock, textForm]);
var form = blocks.form([ var form = blocks.form([
screenTitle, screenTitle,
@ -212,33 +220,45 @@ define([
const appConfig = function (Env) { const appConfig = function (Env) {
const { sendAdminDecree, sendAdminRpc } = Env; const { sendAdminDecree, sendAdminRpc } = Env;
const blocks = Sidebar.blocks('admin');
const grid = blocks.block([], 'cp-admin-customize-apps-grid'); const grid = blocks.block([], 'cp-admin-customize-apps-grid');
const $grid = $(grid);
const allApps = PadTypes.appsToSelect; const allApps = PadTypes.appsToSelect;
const appsToDisable = []; const appsToDisable = selections.appsToDisable;
function select(app, appBlock) { let apps = {};
let select = function (app, $app) {
if (appsToDisable.indexOf(app) === -1) { if (appsToDisable.indexOf(app) === -1) {
console.error('SET ACTIVE', app);
appsToDisable.push(app); appsToDisable.push(app);
var checkMark = h('div.cp-onboardscreen-checkmark'); $app.toggleClass('cp-inactive-app', true);
$(checkMark).addClass('fa-check'); $app.toggleClass('cp-active-app', false);
appBlock.append(checkMark);
$(`#${app}-block`).addClass('cp-active-app');
} else { } else {
console.error('SET INACTIVE', app);
appsToDisable.splice(appsToDisable.indexOf(app), 1); appsToDisable.splice(appsToDisable.indexOf(app), 1);
$(`#${app}-block`).addClass('cp-inactive-app'); $app.toggleClass('cp-inactive-app', false);
appBlock.find('.cp-onboardscreen-checkmark').remove(); $app.toggleClass('cp-active-app', true);
} }
} }
allApps.forEach(app => { allApps.forEach(app => {
let appBlock = h('div.cp-appblock.cp-inactive-app', {id: `${app.toString()}-block`}, app.charAt(0).toUpperCase() + app.slice(1)); let name = Messages.type[app] || app;
$(grid).append(appBlock); let icon = UI.getNewIcon(app);
$(appBlock).on('click', () => select(app, $(appBlock))); let appBlock = apps[app] = h('div.cp-appblock', [
icon,
h('span', name),
h('i.fa.fa-check.cp-on-enabled')
]);
let $app = $(appBlock).appendTo($grid);
if (appsToDisable.includes(app)) {
$app.addClass('cp-inactive-app');
} else {
$app.addClass('cp-active-app');
}
$app.on('click', () => select(app, $app));
}); });
var save = blocks.activeButton('primary', '', Messages.settings_save, function (done) { var save = blocks.activeButton('primary', '', Messages.settings_save, function (done) {
selections.appsToDisable = appsToDisable;
UI.log(Messages.saved); UI.log(Messages.saved);
gotoPage(Env, 2); gotoPage(Env, 2);
}); });
@ -266,8 +286,6 @@ define([
const mfaRegistrationScreen = function (Env) { const mfaRegistrationScreen = function (Env) {
const { sendAdminDecree, sendAdminRpc } = Env; const { sendAdminDecree, sendAdminRpc } = Env;
const blocks = Sidebar.blocks('admin');
var restrict = blocks.activeCheckbox({ var restrict = blocks.activeCheckbox({
key: 'registration', key: 'registration',
getState: function () { getState: function () {