diff --git a/src/events/editEvent.js b/src/events/editEvent.js index 77bf2cbc58003e6d066f1aa1312cefb9e8ef6720..3e07b740d17005af9efbb6e3c4169c7cc031bb2b 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 1ea3647c21730f0e2714b2ce6f01c270b042883a..aefec454b207001e405ee7172012917c09d69da3 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 ab0195a547287f7a175de47393d86147d3e41e44..4c053bc0d1fb0f581876debd7312df530707ad6e 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 4f9e3aff4b9945c5c182b949b3cd0b16481c529d..2fdd69929030b7278c2c27c723c856c8fa39f8b2 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);