xmpp.chapril.org-conversejs/src/plugins/muc-views/modtools.js

243 lines
8.6 KiB
JavaScript

import log from '@converse/headless/log.js';
import tpl_moderator_tools from './templates/moderator-tools.js';
import { AFFILIATIONS, ROLES } from '@converse/headless/plugins/muc/index.js';
import { CustomElement } from 'shared/components/element.js';
import { __ } from 'i18n';
import { _converse, api, converse } from '@converse/headless/core.js';
import { getAssignableRoles, getAutoFetchedAffiliationLists } from '@converse/headless/plugins/muc/utils.js';
import { getOpenPromise } from '@converse/openpromise';
import {
getAffiliationList,
getAssignableAffiliations,
setAffiliation,
} from '@converse/headless/plugins/muc/affiliations/utils.js';
const { Strophe, sizzle, u } = converse.env;
export default class ModeratorTools extends CustomElement {
static get properties () {
return {
affiliation: { type: String },
affiliations_filter: { type: String, attribute: false },
alert_message: { type: String, attribute: false },
alert_type: { type: String, attribute: false },
jid: { type: String },
muc: { type: Object, attribute: false },
role: { type: String },
roles_filter: { type: String, attribute: false },
users_with_affiliation: { type: Array, attribute: false },
users_with_role: { type: Array, attribute: false },
};
}
constructor () {
super();
this.affiliation = '';
this.affiliations_filter = '';
this.role = '';
this.roles_filter = '';
}
updated (changed) {
changed.has('role') && this.onSearchRoleChange();
changed.has('affiliation') && this.onSearchAffiliationChange();
changed.has('jid') && changed.get('jid') && this.initialize();
}
async initialize () {
this.initialized = getOpenPromise();
const muc = await api.rooms.get(this.jid);
await muc.initialized;
this.muc = muc;
this.initialized.resolve();
}
render () {
if (this.muc?.occupants) {
const occupant = this.muc.occupants.findWhere({ 'jid': _converse.bare_jid });
return tpl_moderator_tools({
'affiliations_filter': this.affiliations_filter,
'alert_message': this.alert_message,
'alert_type': this.alert_type,
'assignAffiliation': ev => this.assignAffiliation(ev),
'assignRole': ev => this.assignRole(ev),
'assignable_affiliations': getAssignableAffiliations(occupant),
'assignable_roles': getAssignableRoles(occupant),
'filterAffiliationResults': ev => this.filterAffiliationResults(ev),
'filterRoleResults': ev => this.filterRoleResults(ev),
'loading_users_with_affiliation': this.loading_users_with_affiliation,
'queryAffiliation': ev => this.queryAffiliation(ev),
'queryRole': ev => this.queryRole(ev),
'queryable_affiliations': AFFILIATIONS.filter(a => !api.settings.get('modtools_disable_query').includes(a)),
'queryable_roles': ROLES.filter(a => !api.settings.get('modtools_disable_query').includes(a)),
'roles_filter': this.roles_filter,
'switchTab': ev => this.switchTab(ev),
'toggleForm': ev => this.toggleForm(ev),
'users_with_affiliation': this.users_with_affiliation,
'users_with_role': this.users_with_role,
})
} else {
return '';
}
}
async onSearchAffiliationChange () {
if (!this.affiliation) {
return;
}
await this.initialized;
this.clearAlert();
this.loading_users_with_affiliation = true;
this.users_with_affiliation = null;
if (this.shouldFetchAffiliationsList()) {
const result = await getAffiliationList(this.affiliation, this.jid);
if (result instanceof Error) {
this.alert(result.message, 'danger');
this.users_with_affiliation = [];
} else {
this.users_with_affiliation = result;
}
} else {
this.users_with_affiliation = this.muc.getOccupantsWithAffiliation(this.affiliation);
}
this.loading_users_with_affiliation = false;
}
async onSearchRoleChange () {
if (!this.role) {
return;
}
await this.initialized;
this.clearAlert();
this.users_with_role = this.muc.getOccupantsWithRole(this.role);
}
shouldFetchAffiliationsList () {
const affiliation = this.affiliation;
if (affiliation === 'none') {
return false;
}
const auto_fetched_affs = getAutoFetchedAffiliationLists();
if (auto_fetched_affs.includes(affiliation)) {
return false;
} else {
return true;
}
}
toggleForm (ev) { // eslint-disable-line class-methods-use-this
ev.stopPropagation();
ev.preventDefault();
const toggle = u.ancestor(ev.target, '.toggle-form');
const form_class = toggle.getAttribute('data-form');
const form = u.ancestor(toggle, '.list-group-item').querySelector(`.${form_class}`);
if (u.hasClass('hidden', form)) {
u.removeClass('hidden', form);
} else {
u.addClass('hidden', form);
}
}
filterRoleResults (ev) {
this.roles_filter = ev.target.value;
this.render();
}
filterAffiliationResults (ev) {
this.affiliations_filter = ev.target.value;
}
queryRole (ev) {
ev.stopPropagation();
ev.preventDefault();
const data = new FormData(ev.target);
const role = data.get('role');
this.role = null;
this.role = role;
}
queryAffiliation (ev) {
ev.stopPropagation();
ev.preventDefault();
const data = new FormData(ev.target);
const affiliation = data.get('affiliation');
this.affiliation = null;
this.affiliation = affiliation;
}
alert (message, type) {
this.alert_message = message;
this.alert_type = type;
}
clearAlert () {
this.alert_message = undefined;
this.alert_type = undefined;
}
async assignAffiliation (ev) {
ev.stopPropagation();
ev.preventDefault();
this.clearAlert();
const data = new FormData(ev.target);
const affiliation = data.get('affiliation');
const attrs = {
'jid': data.get('jid'),
'reason': data.get('reason'),
};
const current_affiliation = this.affiliation;
const muc_jid = this.muc.get('jid');
try {
await setAffiliation(affiliation, muc_jid, [attrs]);
} catch (e) {
if (e === null) {
this.alert(__('Timeout error while trying to set the affiliation'), 'danger');
} else if (sizzle(`not-allowed[xmlns="${Strophe.NS.STANZAS}"]`, e).length) {
this.alert(__("Sorry, you're not allowed to make that change"), 'danger');
} else {
this.alert(__('Sorry, something went wrong while trying to set the affiliation'), 'danger');
}
log.error(e);
return;
}
await this.muc.occupants.fetchMembers();
this.affiliation = null;
this.affiliation = current_affiliation;
this.alert(__('Affiliation changed'), 'primary');
}
assignRole (ev) {
ev.stopPropagation();
ev.preventDefault();
this.clearAlert();
const data = new FormData(ev.target);
const occupant = this.muc.getOccupant(data.get('jid') || data.get('nick'));
const role = data.get('role');
const reason = data.get('reason');
const current_role = this.role;
this.muc.setRole(
occupant,
role,
reason,
() => {
this.alert(__('Role changed'), 'primary');
this.role = null;
this.role = current_role;
},
e => {
if (sizzle(`not-allowed[xmlns="${Strophe.NS.STANZAS}"]`, e).length) {
this.alert(__("You're not allowed to make that change"), 'danger');
} else {
this.alert(__('Sorry, something went wrong while trying to set the role'), 'danger');
if (u.isErrorObject(e)) {
log.error(e);
}
}
}
);
}
}
api.elements.define('converse-modtools', ModeratorTools);