diff --git a/src/events/eventDraft.js b/src/events/eventDraft.js index 463cce447ef078c8fc2959ab083f31fa41fe8393..805e58966f6e3f405916176f2ef1e781d9c907ea 100644 --- a/src/events/eventDraft.js +++ b/src/events/eventDraft.js @@ -1,8 +1,10 @@ import m from 'mithril'; -import { Button, Card, TextField } from "polythene-mithril" +import { Button} from "polythene-mithril" import EditView from '../views/editView'; import { styler } from 'polythene-core-css'; + + const draftStyle = [ { '.footer': { @@ -10,9 +12,9 @@ const draftStyle = [ left: 0, bottom: 0, width: '100%', - 'background-color': 'red', - color: 'white', - 'text-align': 'center', + 'background-color': '#E8462B', + color: '#FFFFFF', + 'text-align': 'right', } } ] @@ -26,25 +28,21 @@ export default class eventDraft extends EditView { } view() { - - const fieldDescriptionEn = m(TextField, { - label: 'Description [EN]', - required: true, - floatingLabel: true, - dense: true, - multiLine: true, - rows: 6, - }); - - const buttonMaker = m(Button, { + //Submit Button + const buttonMaker = m(Button, { label: "Submit Request", + color: "white", - }); + //Error pop-up in case not all mandatory fields were completed + //CURRENTLY: Error triggered onclick + events: { + onclick: () => alert("You did not complete all prioritary fields!") + } + }); - // ]) return m('div',[ - m('h1', {class: "title"}, "Request a new event"), + m('h2', {class: "title"}, "Creating a new event:"), m('div.footer', buttonMaker), ]); } diff --git a/src/events/eventWithExport.js b/src/events/eventWithExport.js index 77a1ba41251f6ecb8ad251b8707c6c614a5f92f1..2d7171a66ec085c5c7d5b775f9a91336a5e4b6af 100644 --- a/src/events/eventWithExport.js +++ b/src/events/eventWithExport.js @@ -5,10 +5,27 @@ import { Card } from 'polythene-mithril'; import EditView from '../views/editView'; +import {styler} from 'polythene-core-css'; + +const draftStyle = [ + { + '.footer': { + position: 'fixed', + left: 0, + bottom: 0, + width: '100%', + 'background-color': '#E8462B', + 'text-align': 'right', + } + } +] + +styler.add('eventDraft', draftStyle); export default class eventWithExport extends EditView { constructor(vnode) { super(vnode, 'events'); + this.performedEdits = 0; } view() { @@ -18,6 +35,8 @@ export default class eventWithExport extends EditView { required: true, floatingLabel: true, dense: true, + onChange : (newState) => {this.title_en = newState.value; console.log(this.title_en);}, + value: this.title_en, }); const fieldDescriptionEn = m(TextField, { label: 'Description [EN]', @@ -25,21 +44,33 @@ export default class eventWithExport extends EditView { floatingLabel: true, dense: true, multiLine: true, - rows: 6, - }); - const creatorButton = m(Button, { - label: 'EXPORT' - // label: 'Create a hyperlink string describing your project.' + rows: 6, + onChange : (newState) => {this.fieldDescriptionEn = newState.value; console.log(this.fieldDescriptionEn);}, + value: this.fieldDescriptionEn, }); + // Needs administrator (Kulturi). const fieldLocation = m(TextField, { label: 'Location:', floatingLabel: true, required: true, + onChange : (newState) => {this.fieldLocation = newState.value; console.log(this.fieldLocation);}, + value: this.fieldLocation, + }); + + // Bottom. + const buttonMaker = m(Button, { + // console.log(JSON.stringify(this.keyDescriptors)), + label: "Submit Request!", + onClick: () => alert("You did not finish the editing of the fields.") }); - return m('div', [ - m('h1', 'For the event creator:', fieldTitleEn, fieldDescriptionEn, 'For the AMIV administrator:', fieldLocation, creatorButton), + // Return! + return m('div', { + style: { height: '100%', 'overflow-y': 'scroll'} + }, [ + m('h1', 'For the event creator:', fieldTitleEn , fieldDescriptionEn, 'For the AMIV administrator:', fieldLocation), + m('div.footer', buttonMaker), ]); } } \ No newline at end of file diff --git a/src/events/newEvent.js b/src/events/newEvent.js index 015adc1615b48e14216a15cb99f3f3af2079ef3a..4a41aac85250a417438fc9a17a0bc90f3db7b558 100644 --- a/src/events/newEvent.js +++ b/src/events/newEvent.js @@ -1,13 +1,269 @@ import m from 'mithril'; +import { TextField, Button, Checkbox, RadioGroup, IconButton, SVG } from 'polythene-mithril'; import EditView from '../views/editView'; - +import { icons } from '../views/elements'; export default class newEvent extends EditView { constructor(vnode) { super(vnode, 'events'); + this.currentpage = 1; + } + + addOne() { + this.currentpage = this.currentpage + 1; + if (this.currentpage === 4) { + this.currentpage = 3; + } } - view() { - return m('h1', 'Hello World'); + subOne() { + this.currentpage = this.currentpage - 1; + if (this.currentpage === 0) { + this.currentpage = 1; + } + } + + view(vnode) { + if (!this.currentpage) return ''; + // German and English Information + const fieldTitleEn = m(TextField, { + label: 'Event Title [EN]', + required: true, + floatingLabel: true, + dense: true, + onChange: (newState) => { this.title_en = newState.value; console.log(this.title_en); }, + value: vnode.state.title_en, + }); + + const fieldCatchphraseEn = m(TextField, { + label: 'Catchphrase [EN]', + floatingLabel: true, + dense: true, + help: 'Fun description to make your event look more interesting than it is', + focusHelp: true, + }); + + const fieldDescriptionEn = m(TextField, { + label: 'Description [EN]', + required: true, + floatingLabel: true, + dense: true, + multiLine: true, + rows: 6, + }); + + const fieldTitleDe = m(TextField, { + label: 'Event Title [DE]', + floatingLabel: true, + dense: true, + }); + + const fieldCatchphraseDe = m(TextField, { + label: 'Catchphrase [DE]', + floatingLabel: true, + dense: true, + help: 'Fun description to make your event look more interesting than it is', + focusHelp: true, + }); + + const fieldDescriptionDe = m(TextField, { + label: 'Description [DE]', + floatingLabel: true, + dense: true, + multiLine: true, + rows: 6, + }); + + // Start of relevant data + + const fieldPrice = m(TextField, { + label: 'Price:', + type: 'number', + help: 'In Rappen/Cents', + focusHelp: true, + floatingLabel: true, + required: true, + }); + const fieldStartDate = m(TextField, { + label: 'Event Start[Date and Time]:', + help: 'Format: 01.01.1970-18:00', + focusHelp: true, + floatingLabel: true, + required: true, + }); + const fieldEndDate = m(TextField, { + label: 'Event End[Date and Time]:', + help: 'Format: 01.01.1970-1800', + focusHelp: true, + floatingLabel: true, + required: true, + }); + const fieldStartRegDate = m(TextField, { + label: 'Registration Start[Date and Time]:', + help: 'Format: 01.01.1970-18:00', + focusHelp: true, + floatingLabel: true, + required: true, + }); + const fieldEndRegDate = m(TextField, { + label: 'Registration End[Date and Time]:', + help: 'Format: 01.01.1970-1800', + focusHelp: true, + floatingLabel: true, + required: true, + }); + const fieldLocation = m(TextField, { + label: 'Location:', + floatingLabel: true, + required: true, + }); + const fieldNumberOfParticipants = m(TextField, { + label: 'Number of open spots:', + type: 'number', + floatingLabel: true, + required: true, + }); + + // Everything above is working fine atm. (13:35) + + const fieldAdvStart = m(TextField, { + label: 'Registration Start[Date and Time]:', + type: 'datetime', + help: 'Format: 01.01.1970-18:00', + focusHelp: true, + floatingLabel: true, + required: true, + }); + const fieldAdvEnd = m(TextField, { + label: 'Registration End[Date and Time]:', + help: 'Format: 01.01.1970-1800', + focusHelp: true, + floatingLabel: true, + required: true, + }); + + const buttonBannerUp = m(Button, { + label: 'Select Banner File', + events: { + onclick: () => console.log('click'), + }, + }); + + const buttonInfoUp = m(Button, { + label: 'Select Infoscreen File', + events: { + onclick: () => console.log('click'), + }, + }); + + const buttonPosterUp = m(Button, { + label: 'Select Poster File', + events: { + onclick: () => console.log('click'), + }, + }); + + const buttonThumbUp = m(Button, { + label: 'Select Thumbnail File', + events: { + onclick: () => console.log('click'), + }, + }); + + const buttonUploadAll = m(Button, { + label: 'Upload', + events: { + onclick: () => console.log('click'), + }, + }); + + const iconRight = m( + IconButton, { events: { onclick: () => { this.addOne(); } } }, + m(SVG, m.trust(icons.ArrowRight)), + ); + + const iconLeft = m( + IconButton, { events: { onclick: () => { this.subOne(); } } }, + m(SVG, m.trust(icons.ArrowLeft)), + ); + + const checkboxAnnounce = m(Checkbox, { + defaultChecked: false, + label: 'Advertise in Announce?', + value: '100', + }); + + const checkboxWebsite = m(Checkbox, { + defaultChecked: false, + label: 'Advertise on Website?', + value: '100', + }); + + const checkboxInfoScreen = m(Checkbox, { + defaultChecked: false, + label: 'Advertise on Infoscreen?', + value: '100', + }); + + const checkboxAllowMail = m(Checkbox, { + defaultChecked: false, + label: 'Allow non AMIV Members?', + value: '100', + }); + + const radioButtonSelectionMode = m(RadioGroup, { + name: 'Selection Mode', + buttons: [ + { + value: 'fcfs', + label: 'First come, first serve', + }, + { + value: 'manual', + label: 'Selection made by organizer', + }, + ], + }); + + function layoutWith(page) { + return m('div', page); + } + // checks currentPage and selects the fitting page + if (this.currentpage === 1) { + return layoutWith(m( + 'div', { style: { height: '100%', 'overflow-y': 'scroll' } } + , [ + m( + 'h1', 'Event description:', iconLeft, iconRight, m('br'), + fieldTitleEn, fieldCatchphraseEn, fieldDescriptionEn, fieldTitleDe, + fieldCatchphraseDe, fieldDescriptionDe, + ), + ], + )); + } else if (this.currentpage === 2) { + return layoutWith(m( + 'div', { style: { height: '100%', 'overflow-y': 'scroll' } } + , [ + m( + 'h1', 'Critical Information:', iconLeft, iconRight, m('br'), fieldStartDate, + fieldEndDate, fieldStartRegDate, fieldEndRegDate, fieldLocation, fieldPrice, + fieldNumberOfParticipants, + ), + ], + )); + } else if (this.currentpage === 3) { + return layoutWith(m( + 'div', { style: { height: '100%', 'overflow-y': 'scroll' } } + , [ + m( + 'h1', 'Advertise Information', iconLeft, iconRight, m('br'), fieldAdvStart, + fieldAdvEnd, checkboxWebsite, checkboxAnnounce, checkboxInfoScreen, + buttonBannerUp, buttonInfoUp, buttonPosterUp, buttonThumbUp, m('br'), + buttonUploadAll, m('br'), checkboxAllowMail, radioButtonSelectionMode, + ), + ], + )); + } + return layoutWith(m('')); } } diff --git a/src/events/viewEvent.js b/src/events/viewEvent.js index 28f5b5a02b8838bcd849d77f2afa59081f5417b4..208996d4f21e6ea187bd2d2f2e6412f5f77f7cc9 100644 --- a/src/events/viewEvent.js +++ b/src/events/viewEvent.js @@ -1,5 +1,5 @@ import m from 'mithril'; -import { Checkbox, Button, Card, TextField, IconButton, Toolbar, ToolbarTitle } from 'polythene-mithril'; +import { Switch, Button, Card, TextField, IconButton, Toolbar, ToolbarTitle, MaterialDesignSpinner as Spinner } from 'polythene-mithril'; import ItemView from '../views/itemView'; import { events as config, eventsignups as signupConfig } from '../config.json'; import TableView from '../views/tableView'; @@ -7,12 +7,13 @@ import DatalistController from '../listcontroller'; import { dateFormatter } from '../utils'; import { icons } from '../views/elements'; import { styler } from 'polythene-core-css'; +import {ResourceHandler} from "../auth"; const viewLayout = [ { '.eventViewContainer': { display: 'grid', - 'grid-template-columns': '50% 50%', + 'grid-template-columns': '40% 55%', 'grid-gap': '50px', }, '.propertyTitle': { @@ -121,12 +122,40 @@ class ParticipantsTable { } } +class EmailList { + view({ attrs: { list } }) { + const emails = list.toString().replace(/,/g, '; '); + return m(Card, { + content: m(TextField, { value: emails, label: '', multiLine: true }, ''), + }); + } +} + export default class viewEvent extends ItemView { constructor() { super('events'); + this.signupHandler = new ResourceHandler('eventsignups'); this.details = false; - this.waitlist = false; this.emailAdresses = false; + + + this.emaillist = ['']; + this.showAllEmails = false; + this.setUpEmailList(this.showAllEmails); + } + + setUpEmailList(showAll) { + if (!showAll) { + this.signupHandler.get({ where: { accepted: true } }).then((data) => { + this.emaillist = (data._items.map(item => item.email)); + }); + } + else { + this.signupHandler.get({}).then((data) => { + this.emaillist = (data._items.map(item => item.email)); + }); + } + m.redraw(); } view() { @@ -138,10 +167,6 @@ export default class viewEvent extends ItemView { m(IconButton, { icon: { svg: m.trust(icons.ArrowRight) } }), m(ToolbarTitle, { text: "details" }), ]); - let displayWaitlistButton = m(Toolbar, { compact: true, events: { onclick: () => this.waitlist = !this.waitlist } }, [ - m(IconButton, { icon: { svg: m.trust(icons.ArrowRight) } }), - m(ToolbarTitle, { text: "waitlist" }), - ]); let displayEmailAdressesButton = m(Toolbar, { compact: true, events: { onclick: () => this.emailAdresses = !this.emailAdresses } }, [ m(IconButton, { icon: { svg: m.trust(icons.ArrowRight) } }), m(ToolbarTitle, { text: "email adresses" }), @@ -196,40 +221,6 @@ export default class viewEvent extends ItemView { }) } - if (this.waitlist) { - displayWaitlistButton = m(Toolbar, { compact: true, events: { onclick: () => this.waitlist = !this.waitlist } }, [ - m(IconButton, { icon: { svg: m.trust(icons.ArrowDown) } }), - m(ToolbarTitle, { text: "waitlist" }), - ]); - displayWaitlist = m(Card, { - content: [ - { - primary: { - title: "Primary title", - subtitle: "Subtitle" - } - }, - { - actions: { - content: [ - m(Button, { - label: "Action 1" - }), - m(Button, { - label: "Action 2" - }) - ] - } - }, - { - text: { - content: "More text" - } - } - ] - - }) - } if (this.emailAdresses) { displayEmailAdressesButton = m(Toolbar, { compact: true, events: { onclick: () => this.emailAdresses = !this.emailAdresses } }, [ @@ -239,31 +230,28 @@ export default class viewEvent extends ItemView { displayEmailAdresses = m(Card, { content: [ { - primary: { - title: "Primary title", - subtitle: "Subtitle" - } - }, - { - actions: { - content: [ - m(Button, { - label: "Action 1" + any: + { + content: m(Switch, { + defaultChecked: false, + label: 'show unaccepted', + onChange: () => { + this.showAllEmails = !this.showAllEmails; + this.setUpEmailList(this.showAllEmails); + + }, }), - m(Button, { - label: "Action 2" - }) - ] - } + }, }, { - text: { - content: "More text" - } - } - ] + any: + { + content: m(EmailList, { list: this.emaillist }), + } + }, + ], - }) + }); } @@ -287,9 +275,6 @@ export default class viewEvent extends ItemView { displayDetailsButton, displayDetails, - displayWaitlistButton, - displayWaitlist, - displayEmailAdressesButton, displayEmailAdresses, ]), diff --git a/src/views/elements.js b/src/views/elements.js index 3e60b74ddf111fe15266b3f55fb5b2f42e566ab0..98cd7d9e67eca4461b7f2cf728dd2bd0b9df6343 100644 --- a/src/views/elements.js +++ b/src/views/elements.js @@ -52,6 +52,7 @@ export const icons = { ArrowDown: '<svg fill="#000000" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M7.41 7.84L12 12.42l4.59-4.58L18 9.25l-6 6-6-6z"/><path d="M0-.75h24v24H0z" fill="none"/></svg>', iconUsersSVG: '<svg fill="#000000" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M3 5v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2H5c-1.11 0-2 .9-2 2zm12 4c0 1.66-1.34 3-3 3s-3-1.34-3-3 1.34-3 3-3 3 1.34 3 3zm-9 8c0-2 4-3.1 6-3.1s6 1.1 6 3.1v1H6v-1z"/><path d="M0 0h24v24H0z" fill="none"/></svg>', iconEventSVG: '<svg fill="#000000" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M9 11H7v2h2v-2zm4 0h-2v2h2v-2zm4 0h-2v2h2v-2zm2-7h-1V2h-2v2H8V2H6v2H5c-1.11 0-1.99.9-1.99 2L3 20c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 16H5V9h14v11z"/><path d="M0 0h24v24H0z" fill="none"/></svg>', + ArrowLeft: '<svg fill="#000000" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M15.41 16.09l-4.58-4.59 4.58-4.59L14 5.5l-6 6 6 6z"/><path d="M0-.5h24v24H0z" fill="none"/></svg>', }; export const BackButton = {