diff --git a/src/events/newEvent.js b/src/events/newEvent.js index 3cff68aa1d0a4391bd6e61ca577ec273ace06f9c..4f808126d9eebd096179510361d817272e9e1d65 100644 --- a/src/events/newEvent.js +++ b/src/events/newEvent.js @@ -1,11 +1,22 @@ import m from 'mithril'; -import { TextField, Button, Checkbox, RadioGroup, IconButton, SVG } from 'polythene-mithril'; +import { Button, Checkbox, RadioGroup, IconButton, SVG } from 'polythene-mithril'; +import { styler } from 'polythene-core-css'; import EditView from '../views/editView'; -import { icons } from '../views/elements'; +import { icons, textInput } from '../views/elements'; + +const style = [ + { + '.mywrapper': { + padding: '10px', + }, + }, +]; +styler.add('event-add', style); + export default class newEvent extends EditView { constructor(vnode) { - super(vnode, 'events'); + super(vnode, 'events', {}); this.currentpage = 1; } @@ -14,6 +25,7 @@ export default class newEvent extends EditView { if (this.currentpage === 4) { this.currentpage = 3; } + //m.redraw(); } subOne() { @@ -21,126 +33,131 @@ export default class newEvent extends EditView { if (this.currentpage === 0) { this.currentpage = 1; } + //m.redraw(); } - view(vnode) { + view() { if (!this.currentpage) return ''; // German and English Information - const fieldTitleEn = m(TextField, { + const fieldTitleEn = m(textInput, this.bind({ + name: 'title_en', 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, { + const fieldCatchphraseEn = m(textInput, this.bind({ + name: 'catchphrase_en', 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, { + const fieldDescriptionEn = m(textInput, this.bind({ + name: 'description_en', label: 'Description [EN]', required: true, floatingLabel: true, - dense: true, multiLine: true, rows: 6, - }); + })); - const fieldTitleDe = m(TextField, { + const fieldTitleDe = m(textInput, this.bind({ + name: 'title_de', label: 'Event Title [DE]', floatingLabel: true, - dense: true, - }); + })); - const fieldCatchphraseDe = m(TextField, { + const fieldCatchphraseDe = m(textInput, this.bind({ + name: 'catchphrase_de', 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, { + const fieldDescriptionDe = m(textInput, this.bind({ + name: 'description_de', label: 'Description [DE]', floatingLabel: true, - dense: true, multiLine: true, rows: 6, - }); + })); // Start of relevant data - const fieldPrice = m(TextField, { + const fieldPrice = m(textInput, this.bind({ + name: 'price', label: 'Price:', type: 'number', help: 'In Rappen/Cents', focusHelp: true, floatingLabel: true, required: true, - }); - const fieldStartDate = m(TextField, { + })); + const fieldStartDate = m(textInput, this.bind({ + name: 'time_start', label: 'Event Start[Date and Time]:', help: 'Format: 01.01.1970-18:00', focusHelp: true, floatingLabel: true, required: true, - }); - const fieldEndDate = m(TextField, { + })); + const fieldEndDate = m(textInput, this.bind({ + name: 'time_end', label: 'Event End[Date and Time]:', help: 'Format: 01.01.1970-1800', focusHelp: true, floatingLabel: true, required: true, - }); - const fieldStartRegDate = m(TextField, { + })); + const fieldStartRegDate = m(textInput, this.bind({ + name: 'time_register_start', label: 'Registration Start[Date and Time]:', help: 'Format: 01.01.1970-18:00', focusHelp: true, floatingLabel: true, required: true, - }); - const fieldEndRegDate = m(TextField, { + })); + const fieldEndRegDate = m(textInput, this.bind({ + name: 'time_register_end', label: 'Registration End[Date and Time]:', help: 'Format: 01.01.1970-1800', focusHelp: true, floatingLabel: true, required: true, - }); - const fieldLocation = m(TextField, { + })); + const fieldLocation = m(textInput, this.bind({ + name: 'location', label: 'Location:', floatingLabel: true, required: true, - }); - const fieldNumberOfParticipants = m(TextField, { + })); + const fieldNumberOfParticipants = m(textInput, this.bind({ + name: 'spots', label: 'Number of open spots:', type: 'number', floatingLabel: true, required: true, - }); - - // Everything above is working fine atm. (13:35) - - const fieldAdvStart = m(TextField, { + })); + const fieldAdvStart = m(textInput, this.bind({ + name: 'time_advertising_start', 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, { + })); + const fieldAdvEnd = m(textInput, this.bind({ + name: 'time_advertising_end', 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', @@ -226,22 +243,41 @@ export default class newEvent extends EditView { }); function layoutWith(page) { - return m('div', page); + return m('div.mywrapper', page); } + + const page1 = { + view: function () { + return layoutWith(m( + 'h1', 'Event description:', m('br'), iconLeft, iconRight, m('br'), + fieldTitleEn, fieldCatchphraseEn, fieldDescriptionEn, fieldTitleDe, + )); + }, + }; + const page2 = { + view: function () { + return layoutWith(m( + 'h1', 'Critical Information:', m('br'), iconLeft, iconRight, m('br'), fieldStartDate, fieldEndDate, fieldStartRegDate, + fieldEndRegDate, fieldLocation, fieldPrice, fieldNumberOfParticipants, + )); + }, + }; + const page3 = { + view: function () { + return layoutWith(m( + 'h1', 'Advertise Information', m('br'), iconLeft, iconRight, m('br'), fieldAdvStart, fieldAdvEnd, checkboxWebsite, + checkboxAnnounce, checkboxInfoScreen, m('br'), buttonBannerUp, buttonInfoUp, buttonPosterUp, + buttonThumbUp, m('br'), buttonUploadAll, m('br'), checkboxAllowMail, radioButtonSelectionMode, + )); + }, + }; // checks currentPage and selects the fitting page if (this.currentpage === 1) { - return layoutWith(m('h1', 'Event description:', iconLeft, iconRight, m('br'), fieldTitleEn, fieldCatchphraseEn, fieldDescriptionEn, fieldTitleDe, fieldCatchphraseDe, fieldDescriptionDe)); + return m(page1); } else if (this.currentpage === 2) { - return layoutWith(m( - 'h1', 'Critical Information:', iconLeft, iconRight, m('br'), fieldStartDate, fieldEndDate, fieldStartRegDate, - fieldEndRegDate, fieldLocation, fieldPrice, fieldNumberOfParticipants, - )); + return m(page2); } else if (this.currentpage === 3) { - return layoutWith(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 m(page3); } return layoutWith(m('')); } diff --git a/src/views/editView.js b/src/views/editView.js index 91db119c24d2b021f4d0a3111e0625cd4e43b6d4..180a82c00f8f76d044c88723343365cbfba1973f 100644 --- a/src/views/editView.js +++ b/src/views/editView.js @@ -29,6 +29,7 @@ export default class EditView extends ItemView { constructor(vnode, resource, embedded, valid = true) { super(resource, embedded); this.changed = false; + this.resource = resource; // state for validation this.valid = valid; @@ -38,6 +39,7 @@ export default class EditView extends ItemView { allErrors: true, }); this.errors = {}; + this.data = {}; // callback when edit is finished this.callback = vnode.attrs.onfinish; @@ -55,7 +57,8 @@ export default class EditView extends ItemView { m.request(`${apiUrl}docs/api-docs`).then((schema) => { const objectSchema = schema.definitions[ objectNameForResource[this.resource]]; - this.ajv.addSchema(objectSchema, 'schema'); + console.log(schema); + //this.ajv.addSchema(objectSchema, 'schema'); }); } @@ -65,13 +68,15 @@ export default class EditView extends ItemView { if (!this.errors[attrs.name]) this.errors[attrs.name] = []; const boundFormelement = { - onchange: (e) => { + onChange: (name, value) => { this.changed = true; // bind changed data - this.data[e.target.name] = e.target.value; + this.data[name] = value; + + //console.log(this.data); // validate against schema - const validate = this.ajv.getSchema('schema'); + /*const validate = this.ajv.getSchema('schema'); this.valid = validate(this.data); console.log(validate.schema); @@ -87,7 +92,7 @@ export default class EditView extends ItemView { `.${field}` === error.dataPath); this.errors[field] = errors.map(error => error.message); }); - } + }*/ }, getErrors: () => this.errors[attrs.name], value: this.data[attrs.name], diff --git a/src/views/elements.js b/src/views/elements.js index 98cd7d9e67eca4461b7f2cf728dd2bd0b9df6343..0c07cec65b716304c1143f4ae31a8528edc9fccf 100644 --- a/src/views/elements.js +++ b/src/views/elements.js @@ -2,12 +2,14 @@ import m from 'mithril'; import { IconButton, TextField } from 'polythene-mithril'; export class textInput { - constructor({ attrs: { getErrors } }) { + constructor({ attrs: { getErrors, name, label } }) { // Link the error-getting function from the binding this.getErrors = () => []; + this.name = name; if (getErrors) { this.getErrors = getErrors; } + this.value = ''; } view({ attrs }) { @@ -15,8 +17,14 @@ export class textInput { const errors = this.getErrors(); const attributes = Object.assign({}, attrs); - attributes.valid = errors.length > 0; + attributes.valid = errors.length === 0; attributes.error = errors.join(', '); + attributes.onChange = ({ value }) => { + if (value !== this.value) { + this.value = value; + attrs.onChange(this.name, value); + } + }; return m(TextField, attributes); } }