From 3ee421bd0ade0b35255f72eb4530874864c8b508 Mon Sep 17 00:00:00 2001 From: boian <boian@student.ethz.ch> Date: Thu, 25 Apr 2019 20:25:44 +0200 Subject: [PATCH] Moderator management Adds the option to set or edit a moderator for an event and displays it when viewing an event. --- src/events/editEvent.js | 39 ++++++++++++++++++++++++++++++++++----- src/events/item.js | 2 +- src/events/viewEvent.js | 5 +++++ src/style.js | 3 +++ 4 files changed, 43 insertions(+), 6 deletions(-) diff --git a/src/events/editEvent.js b/src/events/editEvent.js index 77bf2cb..3e07b74 100644 --- a/src/events/editEvent.js +++ b/src/events/editEvent.js @@ -1,10 +1,13 @@ import m from 'mithril'; import { styler } from 'polythene-core-css'; -import { RadioGroup, Switch, Dialog, Button, Tabs, Icon } from 'polythene-mithril'; -import { FileInput } from 'amiv-web-ui-components'; +import { + RadioGroup, Switch, Dialog, Button, Tabs, Icon, TextField, +} from 'polythene-mithril'; +import { FileInput, ListSelect, DatalistController } from 'amiv-web-ui-components'; import { TabsCSS, ButtonCSS } from 'polythene-css'; // eslint-disable-next-line import/extensions import { apiUrl, ownUrl } from 'networkConfig'; +import { ResourceHandler } from '../auth'; import { colors } from '../style'; import { loadingScreen } from '../layout'; import { icons } from '../views/elements'; @@ -55,6 +58,11 @@ export default class newEvent extends EditView { super(vnode); this.currentpage = 1; + // Create a usercontroller to handle the moderator field + this.userHandler = new ResourceHandler('users', ['firstname', 'lastname', 'email', 'nethz']); + this.userController = new DatalistController((query, search) => + this.userHandler.get({ search, ...query })); + // check whether the user has the right to create events or can only propose this.rightSubmit = !m.route.get().startsWith('/proposeevent'); @@ -171,6 +179,9 @@ export default class newEvent extends EditView { else this.form.data.priority = 1; delete this.form.data.high_priority; + // Change moderator from user object to user id + if (this.form.data.moderator) this.form.data.moderator = this.form.data.moderator._id; + // if spots is not set, also remove 'allow_email_signup' if (!('spots' in this.form.data) && 'allow_email_signup' in this.form.data && !this.form.data.allow_email_signup) { @@ -241,7 +252,7 @@ export default class newEvent extends EditView { console.log(this.form.errors, this.form.valid); // Define the number of Tabs and their titles - const titles = ['Event Description', 'When and Where?', 'Signups', 'Advertisement']; + const titles = ['Event Description', 'When and Where?', 'Signups', 'Internal Info']; if (this.rightSubmit) titles.push('Images'); // Data fields of the event in the different tabs. Ordered the same way as the titles const keysPages = [[ @@ -254,7 +265,7 @@ export default class newEvent extends EditView { ], ['time_start', 'time_end', 'location'], ['price', 'spots', 'time_register_start', 'time_register_end'], - ['time_advertising_start', 'time_advertising_end'], + ['moderator', 'time_advertising_start', 'time_advertising_end'], [], ]; // Look which Tabs have errors @@ -448,10 +459,28 @@ export default class newEvent extends EditView { ...this.hasregistration && this.form.renderSchema(['allow_email_signup']), this.hasregistration && radioButtonSelectionMode, ]), - // page 4: advertisement + // PAGE 4: Internal Info m('div', { style: { display: (this.currentpage === 4) ? 'block' : 'none' }, }, [ + m('div', { style: { display: 'flex', 'margin-top': '5px' } }, [ + m(TextField, { + label: 'Moderator: ', + disabled: true, + style: { width: '200px' }, + help: 'Can edit the event and see signups.', + }), + m('div', { style: { 'flex-grow': 1 } }, m(ListSelect, { + controller: this.userController, + selection: this.form.data.moderator, + listTileAttrs: user => Object.assign( + {}, + { title: `${user.firstname} ${user.lastname}` }, + ), + selectedText: user => `${user.firstname} ${user.lastname}`, + onSelect: (data) => { this.form.data.moderator = data; }, + })), + ]), ...this.form.renderSchema(['time_advertising_start', 'time_advertising_end']), ...this.form.renderSchema(['show_website', 'show_announce', 'show_infoscreen']), // pritority update diff --git a/src/events/item.js b/src/events/item.js index 1ea3647..aefec45 100644 --- a/src/events/item.js +++ b/src/events/item.js @@ -6,7 +6,7 @@ import { loadingScreen } from '../layout'; export default class EventItem { constructor() { - this.controller = new ItemController('events'); + this.controller = new ItemController('events', { moderator: 1 }); } view() { diff --git a/src/events/viewEvent.js b/src/events/viewEvent.js index ab0195a..4c053bc 100644 --- a/src/events/viewEvent.js +++ b/src/events/viewEvent.js @@ -342,6 +342,11 @@ export default class viewEvent extends ItemView { title: 'Time', style: stdMargin, }, `${dateFormatter(this.data.time_start)} - ${dateFormatter(this.data.time_end)}`), + this.data.moderator && m(Property, { + title: 'Moderator', + style: stdMargin, + }, m.trust(`${this.data.moderator.firstname} ${this.data.moderator.lastname} + (<a href='mailto:${this.data.moderator.email}'>${this.data.moderator.email}</a>)`)), ]), // everything else is not listed in DropdownCards, which open only on request m('div.viewcontainer', [ diff --git a/src/style.js b/src/style.js index 4f9e3af..2fdd699 100644 --- a/src/style.js +++ b/src/style.js @@ -72,6 +72,9 @@ const style = [ p: { margin: '0', }, + a: { + color: 'rgba(0, 0, 0, 0.87)', + }, }, ]; styler.add('containers', style); -- GitLab