WIP configure instance name, jurisdiction, and description on admin panel

This commit is contained in:
ansuz 2022-02-24 15:28:24 +05:30
parent f1fc2d2ad9
commit 1202b7a691
6 changed files with 213 additions and 4 deletions

View File

@ -351,6 +351,10 @@ var instanceStatus = function (Env, Server, cb) {
updateAvailable: Env.updateAvailable,
instancePurpose: Env.instancePurpose,
instanceDescription: Env.instanceDescription,
instanceJurisdiction: Env.instanceJurisdiction,
instanceName: Env.instanceName,
});
};

View File

@ -41,6 +41,9 @@ PROVIDE_AGGREGATE_STATISTICS
REMOVE_DONATE_BUTTON
BLOCK_DAILY_CHECK
SET_INSTANCE_JURISDICTION
SET_INSTANCE_DESCRIPTION
NOT IMPLEMENTED:
// RESTRICTED REGISTRATION
@ -176,6 +179,15 @@ commands.SET_SUPPORT_MAILBOX = makeGenericSetter('supportMailbox', function (arg
// CryptPad_AsyncStore.rpc.send('ADMIN', [ 'ADMIN_DECREE', ['SET_INSTANCE_PURPOSE', ["development"]]], console.log)
commands.SET_INSTANCE_PURPOSE = makeGenericSetter('instancePurpose', args_isString);
// CryptPad_AsyncStore.rpc.send('ADMIN', [ 'ADMIN_DECREE', ['SET_INSTANCE_JURISDICTION', ['France']]], console.log)
commands.SET_INSTANCE_JURISDICTION = makeGenericSetter('instanceJurisdiction', args_isString);
// CryptPad_AsyncStore.rpc.send('ADMIN', [ 'ADMIN_DECREE', ['SET_INSTANCE_NAME', ['My Personal CryptPad']]], console.log)
commands.SET_INSTANCE_NAME = makeGenericSetter('instanceDescription', args_isString);
// CryptPad_AsyncStore.rpc.send('ADMIN', [ 'ADMIN_DECREE', ['SET_INSTANCE_DESCRIPTION', ['A personal instance, hosted for me and nobody else']]], console.log)
commands.SET_INSTANCE_DESCRIPTION = makeGenericSetter('instanceDescription', args_isString);
// Maintenance: Empty string or an object with a start and end time
var isNumber = function (value) {
return typeof(value) === "number" && !isNaN(value);

View File

@ -121,6 +121,10 @@ module.exports.create = function (config) {
provideAggregateStatistics: false,
updateAvailable: undefined,
instanceName: '',
instanceDescription: '',
instanceJurisdiction: '',
myDomain: config.myDomain,
mySubdomain: config.mySubdomain, // only exists for the accounts integration
customLimits: {},

View File

@ -1,6 +1,11 @@
/*jshint esversion: 6 */
const Stats = module.exports;
var truthyStringOrNothing = function (s) {
if (typeof(s) !== 'string' || !s) { return undefined; }
return s.trim() || undefined;
};
Stats.instanceData = function (Env) {
var data = {
version: Env.version,
@ -55,6 +60,15 @@ Stats.instanceData = function (Env) {
// how long do you retain inactive accounts?
data.accountRetentionTime = Env.accountRetentionTime;
// does this instance have a name???
data.instanceName = truthyStringOrNothing(Env.instanceName);
// does this instance have a jurisdiction ???
data.instanceJurisdiction = truthyStringOrNothing(Env.instanceJurisdiction);
// does this instance have a description???
data.instanceDescription = truthyStringOrNothing(Env.instanceDescription);
// how long do you retain archived data?
//data.archiveRetentionTime = Env.archiveRetentionTime,
}

View File

@ -33,8 +33,12 @@
margin-top: 5px;
}
}
.cp-admin-setlimit-form + button {
margin-top: 5px !important;
.cp-admin-setlimit-form,
.cp-admin-setjurisdiction-form,
.cp-admin-setdescription-form {
+ button {
margin-top: 5px !important;
}
}
.cp-admin-getlimits {
code {
@ -199,6 +203,12 @@
input.cp-admin-inval {
border-color: red !important;
}
input[type="text"], textarea {
&.cp-listing-info[disabled] {
border: 1px solid transparent !important; //1px solid transparent !imprortant;;//none !important;
}
}
.cp-admin-nopassword {
.cp-admin-pw {
display: none !important;

View File

@ -56,7 +56,7 @@ define([
'cp-admin-archive',
'cp-admin-unarchive',
'cp-admin-registration',
'cp-admin-email'
'cp-admin-email',
],
'quota': [ // Msg.admin_cat_quota
'cp-admin-defaultlimit',
@ -92,6 +92,11 @@ define([
'cp-admin-block-daily-check',
//'cp-admin-provide-aggregate-statistics',
'cp-admin-list-my-instance',
'cp-admin-name',
'cp-admin-description',
'cp-admin-jurisdiction',
'cp-admin-consent-to-contact',
'cp-admin-remove-donate-button',
'cp-admin-instance-purpose',
@ -264,7 +269,7 @@ define([
UI.log(archive ? Messages.archivedFromServer : Messages.restoredFromServer);
$input.val('');
$pwInput.val('');
$reason.val('')
$reason.val('');
});
});
});
@ -325,6 +330,8 @@ define([
var key = data.key;
var $div = makeBlock(key);
// XXX support disabling this checkboxes in certain conditions, ie. when telemetry is off
var labelKey = 'admin_' + keyToCamlCase(key) + 'Label';
var titleKey = 'admin_' + keyToCamlCase(key) + 'Title';
var $cbox = $(UI.createCheckbox('cp-admin-' + key,
@ -407,6 +414,150 @@ define([
return $div;
};
Messages.admin_jurisdictionHint = 'Jurisdiction hint'; // XXX
Messages.admin_jurisdictionTitle = 'Jurisdiction title'; // XXX
Messages.admin_jurisdictionButton = 'Jurisdiction button'; // XXX
Messages.admin_jurisdictionPlaceholder = 'Jurisdiction placeholder'; // XXX
create['jurisdiction'] = function () {
var key = 'jurisdiction';
var $div = makeBlock(key, true); // Msg.admin_jurisdictionHint, Msg.admin_jurisdictionTitle, Msg.admin_jurisdictionButton
var $button = $div.find('button').addClass('cp-listing-action');
var input = h('input.cp-listing-info', {
type: 'text',
value: APP.instanceStatus.instanceJurisdiction || '',
placeholder: Messages.admin_jurisdictionPlaceholder,
});
var $input = $(input);
var innerDiv = h('div.cp-admin-setjurisdiction-form', input);
var spinner = UI.makeSpinner($(innerDiv));
$button.click(function () {
if (!$input.val()) { return; }
spinner.spin();
$button.attr('disabled', 'disabled');
sFrameChan.query('Q_ADMIN_RPC', {
cmd: 'ADMIN_DECREE',
data: ['SET_INSTANCE_JURISDICTION', [$input.val()]] // XXX not implemented
}, function (e, response) {
$button.removeAttr('disabled');
if (e || response.error) {
UI.warn(Messages.error);
$input.val('');
console.error(e, response);
spinner.hide();
return;
}
spinner.done();
UI.log(Messages.saved);
});
});
$button.before(innerDiv);
return $div;
};
Messages.admin_nameHint = 'instance name hint'; // XXX
Messages.admin_nameTitle = 'instance name title'; // XXX
Messages.admin_nameButton = 'instance name button'; // XXX
Messages.admin_namePlaceholder = 'instance name placeholder'; // XXX
create['name'] = function () {
var key = 'name';
var $div = makeBlock(key, true);
// Msg.admin_nameHint, Msg.admin_nameTitle, Msg.admin_nameButton
var $button = $div.find('button').addClass('cp-listing-action');
var input = h('input.cp-listing-info', {
type: 'text',
value: APP.instanceStatus.instanceName || '',
placeholder: Messages.admin_namePlaceholder,
style: 'margin-bottom: 5px;',
});
var $input = $(input);
var innerDiv = h('div.cp-admin-setname-form', input); // XXX fix styles
var spinner = UI.makeSpinner($(innerDiv));
$button.click(function () {
if (!$input.val()) { return; }
spinner.spin();
$button.attr('disabled', 'disabled');
sFrameChan.query('Q_ADMIN_RPC', {
cmd: 'ADMIN_DECREE',
data: ['SET_INSTANCE_NAME', [$input.val()]] // XXX not implemented
}, function (e, response) {
$button.removeAttr('disabled');
if (e || response.error) {
UI.warn(Messages.error);
$input.val('');
console.error(e, response);
spinner.hide();
return;
}
spinner.done();
UI.log(Messages.saved);
});
});
$button.before(innerDiv);
return $div;
};
Messages.admin_descriptionHint = 'Description hint'; // XXX
Messages.admin_descriptionTitle = 'Description title'; // XXX
Messages.admin_descriptionButton = 'Description button'; // XXX
Messages.admin_descriptionPlaceholder = 'Description placeholder'; // XXX
create['description'] = function () {
var key = 'description';
var $div = makeBlock(key, true);
var textarea = h('textarea.cp-admin-description-text.cp-listing-info', { // XXX use something from UI elements?
placeholder: Messages.admin_descriptionPlaceholder,
}, APP.instanceStatus.instanceDescription || '');
var $button = $div.find('button');
$button.addClass('cp-listing-action');
var innerDiv = h('div.cp-admin-setdescription-form', {
//style: 'margin-bottom: 5px', // XXX LOL NO
}, [
textarea,
]);
$button.before(innerDiv);
var $input = $(textarea);
var spinner = UI.makeSpinner($(innerDiv));
$button.click(function () {
if (!$input.val()) { return; }
spinner.spin();
$button.attr('disabled', 'disabled');
sFrameChan.query('Q_ADMIN_RPC', {
cmd: 'ADMIN_DECREE',
data: ['SET_INSTANCE_DESCRIPTION', [$input.val()]] // XXX
}, function (e, response) {
$button.removeAttr('disabled');
if (e || response.error) {
UI.warn(Messages.error);
$input.val('');
console.error(e, response);
spinner.hide();
return;
}
spinner.done();
UI.log(Messages.saved);
});
});
return $div;
};
var getPrettySize = UIElements.prettySize;
create['defaultlimit'] = function () {
@ -1799,6 +1950,7 @@ define([
},
});
// XXX disable this checkbox if server telemetry is disabled?
create['list-my-instance'] = makeAdminCheckbox({ // Messages.admin_listMyInstanceTitle.admin_listMyInstanceHint.admin_listMyInstanceLabel
key: 'list-my-instance',
getState: function () {
@ -2034,6 +2186,19 @@ define([
if (!Array.isArray(data)) { return void cb('EINVAL'); }
APP.instanceStatus = data[0];
console.log("Status", APP.instanceStatus);
var isListed = Boolean(APP.instanceStatus.listMyInstance);
var $actions = $('.cp-listing-action');
var $fields = $('.cp-listing-info');
if (isListed) {
$actions.removeAttr('disabled');
$fields.removeAttr('disabled');
} else {
$actions.attr('disabled', 'disabled');
$fields.attr('disabled', 'disabled');
}
cb();
});
};