Split support setup and support team management in admin page

This commit is contained in:
yflory 2024-03-25 16:36:21 +01:00
parent 14913451ef
commit 8f3ee15482
2 changed files with 144 additions and 125 deletions

View File

@ -79,5 +79,11 @@
padding: @sidebar_base-margin 0;
cursor: pointer;
}
.cp-admin-support-state {
i {
margin-right: @sidebar_base-margin;
}
}
}

View File

@ -101,6 +101,7 @@ define([
icon : 'fa fa-ambulance',
content : [
'support-setup',
'support-team',
]
},
'quota': {
@ -2783,22 +2784,133 @@ define([
Messages.admin_supportMembers = "Support team";
Messages.admin_supportAdd = "Add a contact to the support team";
Messages.admin_supportRotateNotify = "Warning: new keys have been generated but an unenexpected error prevented the system to send them to the moderators. Please remove and re-add all members of the support team";
Messages.admin_supportTeamTitle = "admin_supportTeamTitle";
Messages.admin_supportTeamHint = "admin_supportTeamHint";
let onRefreshSupportEvt = Util.mkEvent();
let refreshSupport = () => {
let moderators;
nThen((waitFor) => {
APP.supportModule.execCommand('GET_PRIVATE_KEY', {}, waitFor((obj) => {
supportKey = obj && obj.curvePublic;
}));
}).nThen((waitFor) => {
sFrameChan.query('Q_ADMIN_RPC', {
cmd: 'GET_MODERATORS',
data: {}
}, waitFor((e, response) => {
if (e || response.error) {
console.error(e || response.error);
UI.warn(Messages.error);
return;
}
moderators = response[0];
}));
}).nThen(() => {
onRefreshSupportEvt.fire({moderators, supportKey});
});
};
const getMyData = () => {
let metadataMgr = common.getMetadataMgr();
let priv = metadataMgr.getPrivateData();
let user = metadataMgr.getUserData();
return {
name: user.name,
edPublic: priv.edPublic,
curvePublic: user.curvePublic,
mailbox: user.notifications,
profile: user.profile
};
};
const getContactData = (curve) => {
if (!curve) { return getMyData(); }
let friends = common.getFriends(true);
let f = friends[curve];
return {
name: f.displayName,
edPublic: f.edPublic,
curvePublic: f.curvePublic,
mailbox: f.notifications,
profile: f.profile
};
};
let generateSupportKey = (moderatorsData, supportKey, cb) => {
let edPublic = common.getMetadataMgr().getPrivateData().edPublic;
if (supportKey && !moderatorsData[edPublic]) {
UI.alert("A support key already exists. You must be a moderator to generate a new one or delete the existing support data.");
return;
}
cb = cb || function () {};
const onError = (waitFor, err, res) => {
if (waitFor) { waitFor.abort(); }
console.error(err, res);
UI.warn(Messages.error);
cb(err);
};
nThen((waitFor) => {
// Add myself to moderator role if not already there
let me = getContactData();
if (moderatorsData[me.edPublic]) { return; }
sFrameChan.query('Q_ADMIN_RPC', {
cmd: 'ADD_MODERATOR',
data: me
}, waitFor((e, response) => {
console.error(e, response);
}));
}).nThen((waitFor) => {
// Copy chainpad doc and pin
APP.supportModule.execCommand('ROTATE_KEYS', {}, waitFor((obj) => {
if (obj && obj.error) { return void onError(waitFor, obj.error); }
if (obj && obj.success && obj.noNotify) {
UI.alert(Messages.admin_supportRotateNotify);
onError(waitFor, 'NOTIFY_ERROR', obj);
return;
}
UI.log(Messages.saved);
}));
}).nThen(() => {
refreshSupport();
});
};
sidebar.addItem('support-setup', function (cb) {
let supportKey = ApiConfig.supportMailboxKey;
let edPublic = common.getMetadataMgr().getPrivateData().edPublic; // My edPublic
let refresh = function () {};
let content = blocks.block();
const $div = $(content);
const redraw = function (moderatorsData) {
const redraw = function (moderatorsData, supportKey) {
$div.empty();
const state = blocks.block();
const state = blocks.block([], 'cp-admin-support-state');
const $state = $(state).appendTo($div);
const button = blocks.button('primary', '', Messages.admin_supportInit);
const button = blocks.activeButton('primary', '',
Messages.admin_supportInit, done => {
generateSupportKey(moderatorsData, supportKey, (err) => {
done(!err);
});
});
const $button = $(button).appendTo($div);
const delButton = blocks.button('danger', '', Messages.admin_supportDelete);
const delButton = blocks.activeButton('danger', '',
Messages.admin_supportDelete, done => {
UI.confirm(Messages.admin_supportConfirm, function (yes) {
if (!yes) { return void done(false); }
// Send the decree, don't delete data locally, we just want to remove
// the support UI for the clients
APP.supportModule.execCommand('DISABLE_SUPPORT', {}, (obj) => {
done(!(obj && obj.error));
if (obj && obj.error) {
console.error(obj.error);
return void UI.warn(Messages.error);
}
UI.log(Messages.saved);
refreshSupport();
});
});
});
const $delButton = $(delButton).appendTo($div).hide();
const spinner = UI.makeSpinner($div);
let nav = blocks.nav([button, delButton,
button.spinner, delButton.spinner]);
$div.append(nav);
const setState = function () {
$state.html('');
@ -2817,94 +2929,19 @@ define([
]);
};
setState();
};
onRefreshSupportEvt.reg(obj => {
redraw(obj.moderators, obj.supportKey);
});
cb(content);
});
Util.onClickEnter($delButton, function () {
UI.confirm(Messages.admin_supportConfirm, function (yes) {
if (!yes) { return; }
// Send the decree, don't delete data locally, we just want to remove
// the support UI for the clients
spinner.spin();
$delButton.attr('disabled', 'disabled');
APP.supportModule.execCommand('DISABLE_SUPPORT', {}, (obj) => {
$delButton.removeAttr('disabled');
if (obj && obj.error) {
UI.warn(Messages.error);
console.error(obj.error);
return void spinner.hide();
}
spinner.done();
UI.log(Messages.saved);
supportKey = undefined;
refresh();
});
});
});
const getMyData = () => {
let metadataMgr = common.getMetadataMgr();
let priv = metadataMgr.getPrivateData();
let user = metadataMgr.getUserData();
return {
name: user.name,
edPublic: priv.edPublic,
curvePublic: user.curvePublic,
mailbox: user.notifications,
profile: user.profile
};
};
const getContactData = (curve) => {
if (!curve) { return getMyData(); }
let friends = common.getFriends(true);
let f = friends[curve];
return {
name: f.displayName,
edPublic: f.edPublic,
curvePublic: f.curvePublic,
mailbox: f.notifications,
profile: f.profile
};
};
const generateKey = function () {
if (supportKey && !moderatorsData[edPublic]) {
UI.alert("A support key already exists. You must be a moderator to generate a new one or delete the existing support data.");
return;
}
spinner.spin();
$button.attr('disabled', 'disabled');
const onError = (waitFor, err, res) => {
if (waitFor) { waitFor.abort(); }
console.error(err, res);
spinner.hide();
UI.warn(Messages.error);
};
nThen((waitFor) => {
// Add myself to moderator role if not already there
let me = getContactData();
if (moderatorsData[me.edPublic]) { return; }
sFrameChan.query('Q_ADMIN_RPC', {
cmd: 'ADD_MODERATOR',
data: me
}, waitFor((e, response) => {
console.error(e, response);
}));
}).nThen((waitFor) => {
// Copy chainpad doc and pin
APP.supportModule.execCommand('ROTATE_KEYS', {}, waitFor((obj) => {
$button.removeAttr('disabled');
if (obj && obj.error) { return void onError(waitFor, obj.error); }
if (obj && obj.success && obj.noNotify) {
UI.alert(Messages.admin_supportRotateNotify);
onError(waitFor, 'NOTIFY_ERROR', obj);
return;
}
spinner.done();
UI.log(Messages.saved);
}));
}).nThen(() => {
refresh();
});
};
sidebar.addItem('support-team', function (cb) {
let edPublic = common.getMetadataMgr().getPrivateData().edPublic; // My edPublic
let content = blocks.block();
const $div = $(content);
const redraw = function (moderatorsData, supportKey) {
$div.empty();
const addModerator = (curve, _cb) => {
let cb = Util.mkAsync(_cb);
@ -2931,14 +2968,10 @@ define([
console.error(e || response.error);
return void UI.warn(Messages.error);
}
generateKey();
generateSupportKey(moderatorsData, supportKey);
});
};
Util.onClickEnter($button, function () {
generateKey();
});
const drawModerators = () => {
if (!supportKey) { return; }
const members = {};
@ -2987,7 +3020,7 @@ define([
addModerator(curve, waitFor());
});
}).nThen(() => {
refresh();
refreshSupport();
});
});
// Only moderators can add new moderators
@ -3005,32 +3038,12 @@ define([
};
drawModerators();
};
refresh = () => {
let moderators;
nThen((waitFor) => {
APP.supportModule.execCommand('GET_PRIVATE_KEY', {}, waitFor((obj) => {
supportKey = obj && obj.curvePublic;
}));
}).nThen((waitFor) => {
sFrameChan.query('Q_ADMIN_RPC', {
cmd: 'GET_MODERATORS',
data: {}
}, waitFor((e, response) => {
if (e || response.error) {
console.error(e || response.error);
UI.warn(Messages.error);
return;
}
moderators = response[0];
}));
}).nThen(() => {
redraw(moderators);
});
};
refresh();
onRefreshSupportEvt.reg(obj => {
redraw(obj.moderators, obj.supportKey);
});
cb(content);
});
setTimeout(refreshSupport);
sidebar.addItem('maintenance', function(cb){
var button = blocks.button('primary', '', Messages.admin_maintenanceButton);