From 637c96ccf0a55357d603d2a6f9405bb6aedc1216 Mon Sep 17 00:00:00 2001 From: Kush Trivedi Date: Thu, 26 Dec 2019 08:47:23 +0530 Subject: [PATCH 1/9] feat: Removing session names from modal (#3515) --- .../components/modals/cfs-proposal-modal.hbs | 21 +------------------ .../components/public/call-for-speakers.hbs | 18 +++++++++++++++- 2 files changed, 18 insertions(+), 21 deletions(-) diff --git a/app/templates/components/modals/cfs-proposal-modal.hbs b/app/templates/components/modals/cfs-proposal-modal.hbs index 839acbd19cc..f366a86ac53 100644 --- a/app/templates/components/modals/cfs-proposal-modal.hbs +++ b/app/templates/components/modals/cfs-proposal-modal.hbs @@ -3,28 +3,9 @@ {{t 'Submit Proposal'}}
-

{{t 'Existing Sessions'}}

- {{#unless isNewSpeaker}} - {{#unless isNewSession}} -
- {{#each data.userSession as |session|}} - {{#if session.id}} - {{#link-to 'public.cfs.edit-session' session.id invokeAction=(action 'toggleView')}} -
- - {{t 'Edit Session - '}}{{session.title}} -
- {{/link-to}} - {{/if}} - {{/each}} -
- {{/unless}} - {{/unless}} {{#if isNewSession}}

{{t 'No existing sessions'}}

{{/if}} -
{{#if isNewSpeaker}} {{#link-to 'public.cfs.new-speaker' class='ui teal button' invokeAction=(action 'toggleView')}} @@ -41,7 +22,7 @@ {{/if}} {{#unless isNewSpeaker}} {{#link-to 'public.cfs.new-session' invokeAction=(action 'toggleView')}} - + {{/link-to}} {{/unless}}
diff --git a/app/templates/components/public/call-for-speakers.hbs b/app/templates/components/public/call-for-speakers.hbs index 8a0063620cf..cbd0f7e3c89 100644 --- a/app/templates/components/public/call-for-speakers.hbs +++ b/app/templates/components/public/call-for-speakers.hbs @@ -19,12 +19,28 @@
{{sanitize data.speakersCall.announcement}} + +

{{t 'Submitted Sessions'}}

+ {{#unless isNewSpeaker}} + {{#unless isNewSession}} +
+ {{#each data.userSession as |session|}} + {{#if session.id}} +
+ {{#link-to 'public.cfs.edit-session' session.id }} + {{session.title}} + {{/link-to}} +
+ {{/if}} + {{/each}} +
+ {{/unless}} + {{/unless}} {{#if data.speakersCall.isOpen}} {{/if}} - {{modals/cfs-proposal-modal isOpen=isCfsModalOpen isNewSpeaker=isNewSpeaker isNewSession=isNewSession data=data}} {{modals/login-signup-modal isOpen=isLoginModalOpen}} From 3478f4b987087483b22a8798551e917d9e4e1316 Mon Sep 17 00:00:00 2001 From: Nitin Kumar <46647141+snitin315@users.noreply.github.com> Date: Fri, 27 Dec 2019 18:12:54 +0530 Subject: [PATCH 2/9] chore: update consistent netlify badge (#3728) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e54a1d88b6d..1337d5c93c2 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ![Open Event Frontend](docs/images/Frontend_Branding.png) [![Build Status](https://travis-ci.org/fossasia/open-event-frontend.svg?branch=development)](https://travis-ci.org/fossasia/open-event-frontend) -[![Netlify Status](https://api.netlify.com/api/v1/badges/89d57fdc-826c-400b-af13-c542e9513f62/deploy-status)](https://app.netlify.com/sites/open-event-fe/deploys) +[![Netlify](https://img.shields.io/netlify/89d57fdc-826c-400b-af13-c542e9513f62)](https://app.netlify.com/sites/open-event-fe/deploys) [![Gitter](https://img.shields.io/badge/chat-on%20gitter-ff006f.svg?style=flat-square)](https://gitter.im/fossasia/open-event-frontend) [![Mailing](https://img.shields.io/badge/Mailing-List-red.svg)](https://groups.google.com/forum/#!forum/open-event) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/0d51cf60fc734d3699fd6eff6054e483)](https://www.codacy.com/app/fossasia/open-event-frontend?utm_source=github.com&utm_medium=referral&utm_content=fossasia/open-event-frontend&utm_campaign=Badge_Grade) From 942af59cf420e460a978d0ec453f5f9a7f2fb904 Mon Sep 17 00:00:00 2001 From: Sundaram Dubey <56407566+maze-runnar@users.noreply.github.com> Date: Fri, 27 Dec 2019 18:13:28 +0530 Subject: [PATCH 3/9] fix: hide cancel button when order state is cancelled (#3720) --- .../ui-table/cell/events/view/tickets/orders/cell-order.hbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/templates/components/ui-table/cell/events/view/tickets/orders/cell-order.hbs b/app/templates/components/ui-table/cell/events/view/tickets/orders/cell-order.hbs index b97801a1cd3..4e67627046c 100644 --- a/app/templates/components/ui-table/cell/events/view/tickets/orders/cell-order.hbs +++ b/app/templates/components/ui-table/cell/events/view/tickets/orders/cell-order.hbs @@ -29,7 +29,7 @@ {{/ui-popup}} {{/if}} - {{#if (and (not-eq record.status 'cancelled') (not-eq record.status 'expired') (can-modify-order record))}} + {{#if (and (not-eq extraRecords.status 'cancelled') (not-eq extraRecords.status 'expired') (can-modify-order record))}} {{#ui-popup content=(t 'Cancel order') click=(action (confirm (t 'Are you sure you would like to cancel this Order?') (action props.actions.cancelOrder record))) class="{{if device.isMobile 'medium' 'huge'}} ui icon button" position='top center'}} {{/ui-popup}} From 1d48b65f32c8adb8b489195557433072713fe47d Mon Sep 17 00:00:00 2001 From: Kush Trivedi Date: Sat, 28 Dec 2019 14:49:57 +0530 Subject: [PATCH 4/9] fix: Track field not rendering due to page size limit (#3732) --- app/routes/public/cfs/new-session.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/routes/public/cfs/new-session.js b/app/routes/public/cfs/new-session.js index 3891b053cc6..32e6b2e0b10 100644 --- a/app/routes/public/cfs/new-session.js +++ b/app/routes/public/cfs/new-session.js @@ -11,7 +11,7 @@ export default Route.extend({ event : eventDetails, forms : await eventDetails.query('customForms', { sort : 'id', - 'page[size]' : 50 + 'page[size]' : 0 }), session: await this.store.createRecord('session', { event : eventDetails, From bc8e05ed444f6e42f1a9d4efc4c9294e88136e8a Mon Sep 17 00:00:00 2001 From: Kush Trivedi Date: Sun, 29 Dec 2019 19:42:19 +0530 Subject: [PATCH 5/9] hotfix: Reverting forms controller to ES5 (#3737) --- app/controllers/events/view/edit/attendee.js | 64 +++++++++---------- .../events/view/edit/basic-details.js | 32 +++++----- .../events/view/edit/sessions-speakers.js | 40 ++++++------ app/controllers/events/view/edit/sponsors.js | 32 +++++----- 4 files changed, 82 insertions(+), 86 deletions(-) diff --git a/app/controllers/events/view/edit/attendee.js b/app/controllers/events/view/edit/attendee.js index 5d476bcd8e1..73de9836122 100644 --- a/app/controllers/events/view/edit/attendee.js +++ b/app/controllers/events/view/edit/attendee.js @@ -1,43 +1,41 @@ import Controller from '@ember/controller'; -import { action } from '@ember/object'; import EventWizardMixin from 'open-event-frontend/mixins/event-wizard'; -export default class extends Controller.extend(EventWizardMixin) { - +export default Controller.extend(EventWizardMixin, { async saveForms(data) { for (const customForm of data.customForms ? data.customForms.toArray() : []) { await customForm.save(); } return data; - } - @action - async save(data) { - try { - await this.saveForms(data); - this.saveEventDataAndRedirectTo( - 'events.view.index', - ['tickets'] - ); - } catch (error) { - this.notify.error(this.l10n.t(error.message), - { - id: 'attendee_error_serv' - }); - } - } - @action - async move(direction, data) { - try { - await this.saveForms(data); - this.saveEventDataAndRedirectTo( - direction === 'forwards' ? 'events.view.edit.sponsors' : 'events.view.edit.basic-details', - ['tickets'] - ); - } catch (error) { - this.notify.error(this.l10n.t(error.message), - { - id: 'attendee_move_error' - }); + }, + actions: { + async save(data) { + try { + await this.saveForms(data); + this.saveEventDataAndRedirectTo( + 'events.view.index', + ['tickets'] + ); + } catch (error) { + this.notify.error(this.l10n.t(error.message), + { + id: 'attendee_error_serv' + }); + } + }, + async move(direction, data) { + try { + await this.saveForms(data); + this.saveEventDataAndRedirectTo( + direction === 'forwards' ? 'events.view.edit.sponsors' : 'events.view.edit.basic-details', + ['tickets'] + ); + } catch (error) { + this.notify.error(this.l10n.t(error.message), + { + id: 'attendee_move_error' + }); + } } } -} +}); \ No newline at end of file diff --git a/app/controllers/events/view/edit/basic-details.js b/app/controllers/events/view/edit/basic-details.js index 21fa47c4a83..8e00401ac84 100644 --- a/app/controllers/events/view/edit/basic-details.js +++ b/app/controllers/events/view/edit/basic-details.js @@ -1,21 +1,19 @@ import Controller from '@ember/controller'; import EventWizardMixin from 'open-event-frontend/mixins/event-wizard'; -import { action } from '@ember/object'; -export default class extends Controller.extend(EventWizardMixin) { - @action - save() { - this.saveEventDataAndRedirectTo( - 'events.view.index', - ['tickets', 'socialLinks', 'copyright', 'tax', 'stripeAuthorization'] - ); +export default Controller.extend(EventWizardMixin, { + actions: { + save() { + this.saveEventDataAndRedirectTo( + 'events.view.index', + ['tickets', 'socialLinks', 'copyright', 'tax', 'stripeAuthorization'] + ); + }, + move() { + this.saveEventDataAndRedirectTo( + 'events.view.edit.attendee', + ['tickets', 'socialLinks', 'copyright', 'tax', 'stripeAuthorization'] + ); + } } - @action - move() { - this.saveEventDataAndRedirectTo( - 'events.view.edit.attendee', - ['tickets', 'socialLinks', 'copyright', 'tax', 'stripeAuthorization'] - ); - } -} - +}); \ No newline at end of file diff --git a/app/controllers/events/view/edit/sessions-speakers.js b/app/controllers/events/view/edit/sessions-speakers.js index b35b938917b..5ad85c42235 100644 --- a/app/controllers/events/view/edit/sessions-speakers.js +++ b/app/controllers/events/view/edit/sessions-speakers.js @@ -1,31 +1,31 @@ import Controller from '@ember/controller'; -import { action } from '@ember/object'; import EventWizardMixin from 'open-event-frontend/mixins/event-wizard'; -export default class extends Controller.extend(EventWizardMixin) { +export default Controller.extend(EventWizardMixin, { async saveEventData() { const event = await this._super(...arguments); - event.isSessionsSpeakersEnabled - ? await this.model.speakersCall.save() - : await this.model.speakersCall.destroyRecord(); + event.get('isSessionsSpeakersEnabled') + ? await this.get('model.speakersCall').save() + : await this.get('model.speakersCall').destroyRecord(); return event; - } + }, - @action - save() { - this.saveEventDataAndRedirectTo( - 'events.view.index', - ['tracks', 'sessionTypes', 'microlocations', 'customForms', 'tickets'] - ); - } - @action - move(direction) { - this.saveEventDataAndRedirectTo( - direction === 'forwards' ? 'events.view.edit.sponsors' : 'events.view.edit.sponsors', - ['tracks', 'sessionTypes', 'microlocations', 'customForms', 'tickets'] - ); + + actions: { + save() { + this.saveEventDataAndRedirectTo( + 'events.view.index', + ['tracks', 'sessionTypes', 'microlocations', 'customForms', 'tickets'] + ); + }, + move(direction) { + this.saveEventDataAndRedirectTo( + direction === 'forwards' ? 'events.view.edit.sponsors' : 'events.view.edit.sponsors', + ['tracks', 'sessionTypes', 'microlocations', 'customForms', 'tickets'] + ); + } } -} +}); \ No newline at end of file diff --git a/app/controllers/events/view/edit/sponsors.js b/app/controllers/events/view/edit/sponsors.js index ac01b93cf79..bc4b1ad91a4 100644 --- a/app/controllers/events/view/edit/sponsors.js +++ b/app/controllers/events/view/edit/sponsors.js @@ -1,21 +1,21 @@ import Controller from '@ember/controller'; import EventWizardMixin from 'open-event-frontend/mixins/event-wizard'; -import { action } from '@ember/object'; -export default class extends Controller.extend(EventWizardMixin) { +export default Controller.extend(EventWizardMixin, { - @action - save() { - this.saveEventDataAndRedirectTo( - 'events.view.index', - ['sponsors', 'tickets'] - ); + actions: { + save() { + this.saveEventDataAndRedirectTo( + 'events.view.index', + ['sponsors', 'tickets'] + ); + }, + move(direction) { + this.saveEventDataAndRedirectTo( + direction === 'forwards' ? 'events.view.edit.sessions-speakers' : 'events.view.edit.attendee', + ['sponsors', 'tickets'] + ); + } } - @action - move(direction) { - this.saveEventDataAndRedirectTo( - direction === 'forwards' ? 'events.view.edit.sessions-speakers' : 'events.view.edit.attendee', - ['sponsors', 'tickets'] - ); - } -} + +}); \ No newline at end of file From 01182ff82477950b5a55e7344365d1e9a2e24f4e Mon Sep 17 00:00:00 2001 From: Areeb Jamal Date: Mon, 30 Dec 2019 01:34:05 +0530 Subject: [PATCH 6/9] feat: Replace config at runtime (#3736) --- Dockerfile | 15 +++-- scripts/fastboot-server.js | 13 +++- scripts/replace-config.js | 132 +++++++++++++++++++++++++++++++++++++ 3 files changed, 151 insertions(+), 9 deletions(-) create mode 100644 scripts/replace-config.js diff --git a/Dockerfile b/Dockerfile index dfedbba36c3..59c309a0099 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,4 @@ -FROM node:10-alpine as builder -LABEL maintainer="Niranjan Rajendran " +FROM node:12-alpine as builder WORKDIR /app @@ -25,16 +24,18 @@ FROM node:10-alpine WORKDIR /fastboot -COPY scripts/fastboot-server.js . -COPY --from=builder /app/dist/ app/ +COPY --from=builder /app/dist/ dist/ RUN apk add --no-cache ca-certificates && \ - cp app/package.json . && \ + cp dist/package.json . && \ yarn install && \ - yarn add fastboot-app-server && \ + yarn add fastboot-app-server dotenv lodash safe-eval && \ rm -rf yarn.lock && \ yarn cache clean +COPY scripts/* ./scripts/ +COPY config/environment.js ./config/ + EXPOSE 4000 -CMD ["node", "fastboot-server.js"] +CMD ["node", "./scripts/fastboot-server.js"] diff --git a/scripts/fastboot-server.js b/scripts/fastboot-server.js index b0826e7edfc..1f0c9e13ade 100644 --- a/scripts/fastboot-server.js +++ b/scripts/fastboot-server.js @@ -1,7 +1,10 @@ +require('dotenv').config() + const FastBootAppServer = require('fastboot-app-server'); +const { injectEnvironment } = require('./replace-config'); const enableGzip = process.env.FASTBOOT_GZIP || 'true'; -const fastbootDistPath = process.env.FASTBOOT_DIST_PATH || '/fastboot/app'; +const fastbootDistPath = process.env.FASTBOOT_DIST_PATH || './dist'; const enableChunkedResponse = process.env.FASTBOOT_CHUNKED_RESPONSE || 'true'; const fastbootHost = process.env.FASTBOOT_HOST || '0.0.0.0'; const fastbootPort = process.env.FASTBOOT_PORT || process.env.PORT || '4000'; @@ -16,4 +19,10 @@ let fastbootServer = new FastBootAppServer({ workerCount : parseInt(fastbootWorkers) }); -fastbootServer.start(); +(async () => { + if (process.env.INJECT_ENV === 'true') { + await injectEnvironment(); + } + + fastbootServer.start(); +})(); diff --git a/scripts/replace-config.js b/scripts/replace-config.js new file mode 100644 index 00000000000..997586e25d7 --- /dev/null +++ b/scripts/replace-config.js @@ -0,0 +1,132 @@ +require('dotenv').config() + +const fs = require('fs'); +const promisify = require('util').promisify +const { merge } = require('lodash') +const safeEval = require('safe-eval') + +const env = require('../config/environment') +const appName = 'open-event-frontend' + +const environment = env('production') + +async function replaceFastbootConfig() { + const packagePath = './dist/package.json' + const packageInfo = require('.' + packagePath) + + const old = packageInfo.fastboot.config[appName] + packageInfo.fastboot.config[appName] = merge(old, environment); + await promisify(fs.writeFile)(packagePath, JSON.stringify(packageInfo)) + + console.log('Transformed package.json with new environment') +} + +function findObject(js, objectStart) { + let braceCount = 1; + + const start = js.indexOf("{", objectStart); + + if (start < 0) { + return null; + } + + let index = start + 1; + let parseBlocker = null; + let parseBlockerBuffer = null; + + while (index < js.length) { + const c = js[index]; + + if (!parseBlocker && !parseBlockerBuffer) { + if (c == "{") { + braceCount += 1; + } else if (c == "}") { + braceCount -= 1; + } else if (c === '"' || c === "'" || c === "`") { + parseBlocker = c; + } else if (js[index - 1] == "/") { + if (c == "/") parseBlocker = "\n"; + else if (c == "*") parseBlockerBuffer = "*/"; + } + + if (braceCount === 0) { + break; + } + } else { + if (c === parseBlocker) { + parseBlocker = null; + } else if (c == '/' && js[index - 1] == '*') { + parseBlockerBuffer = null; + } + } + + index++; + } + + if (index >= js.length) return null; + + return { + start, + end: index + }; +} + +function replace(str, start, end, replacement) { + return str.substring(0, start) + replacement + str.substring(end + 1, str.length) +} + +async function replaceWebConfig() { + const pattern = new RegExp(`^${appName}.*\.js$`) + const basePath = './dist/assets/' + const appJs = (await promisify(fs.readdir)(basePath)).filter(name => name.match(pattern)) + + const envDefinition = 'define("open-event-frontend/config/environment"' + + for (const js of appJs) { + const jsPath = basePath + js; + const code = (await promisify(fs.readFile)(jsPath)).toString() + let defineIndex = code.indexOf(envDefinition) + + if (defineIndex < 0) { + defineIndex = code.indexOf(envDefinition.replace(/"/g, "'")) + if (defineIndex < 0) + continue; + } + + const defaultIndex = code.indexOf('default', defineIndex + 1) + + if (defaultIndex < 0) + continue; + + // File with environment definition found + + console.log('Transforming ' + js) + + const object = findObject(code, defaultIndex) + + console.log('Environment Object Found', object) + + const webEnvJson = code.substring(object.start, object.end + 1) + const old = safeEval('(' + webEnvJson + ')') + + const newEnv = JSON.stringify(merge(old, environment)) + const newCode = replace(code, object.start, object.end, newEnv) + + console.log('Injected new environment') + + await promisify(fs.writeFile)(jsPath, newCode) + + console.log('Transformation Complete') + + break; + } +} + +async function injectEnvironment() { + await replaceFastbootConfig() + await replaceWebConfig() +} + +module.exports = { + injectEnvironment +} From 0b23af128207c23a83a66a70a1e5d95f83e1567c Mon Sep 17 00:00:00 2001 From: Kush Trivedi Date: Mon, 30 Dec 2019 07:35:48 +0530 Subject: [PATCH 7/9] fix: Remove email-override condition model hook for organiser (#3741) --- app/templates/components/forms/session-speaker-form.hbs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/app/templates/components/forms/session-speaker-form.hbs b/app/templates/components/forms/session-speaker-form.hbs index c26082079fc..cb9483ac8e6 100644 --- a/app/templates/components/forms/session-speaker-form.hbs +++ b/app/templates/components/forms/session-speaker-form.hbs @@ -122,10 +122,8 @@ {{widgets/forms/rich-text-editor value=(mut (get data.speaker field.fieldIdentifier)) textareaId=(if field.isRequired (concat 'speaker_' field.fieldIdentifier '_required') (concat 'speaker_' field.fieldIdentifier))}} {{else if (eq field.fieldIdentifier 'email')}} - {{#if (or isUserOwnerOrAdmin isUserOrganiser)}} - {{ui-checkbox label=(t 'Do not require email for this speaker.') checked=data.speaker.isEmailOverridden - onChange=(action (mut data.speaker.isEmailOverridden))}} - {{/if}} + {{ui-checkbox label=(t 'Do not require email for this speaker.') checked=data.speaker.isEmailOverridden + onChange=(action (mut data.speaker.isEmailOverridden))}} {{#if (not data.speaker.isEmailOverridden)}} {{input type=field.type value=(mut (get data.speaker field.fieldIdentifier)) id=(if field.isRequired (concat 'speaker_' field.fieldIdentifier '_required') (concat 'speaker_' field.fieldIdentifier))}} From 859d44bb4d2d5d3eba15290346bd4e5de047b38e Mon Sep 17 00:00:00 2001 From: Kush Trivedi Date: Mon, 30 Dec 2019 15:16:27 +0530 Subject: [PATCH 8/9] chore: Hiding custom widget until it is complete (#3742) --- .../components/forms/wizard/sessions-speakers-step.hbs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/templates/components/forms/wizard/sessions-speakers-step.hbs b/app/templates/components/forms/wizard/sessions-speakers-step.hbs index fb1783286b8..c9787d91760 100644 --- a/app/templates/components/forms/wizard/sessions-speakers-step.hbs +++ b/app/templates/components/forms/wizard/sessions-speakers-step.hbs @@ -316,7 +316,7 @@ {{else}}
{{/if}} - + {{!-- Hiding the Custom Widget Form, Until it is ready to be deployed for Development & Production. {{#each complexCustomForms as |form|}} {{form.isComplex}}
@@ -355,7 +355,7 @@ - + --}}
{{/ui-dropdown}} + {{else if (eq field.fieldIdentifier 'gender')}} + {{#ui-dropdown class='search selection' selected=data.speaker.gender onChange=(action (mut data.speaker.gender)) as |execute mapper|}} + +
{{t 'Select your gender'}}
+ + {{/ui-dropdown}} {{else}} {{#ui-dropdown class='search selection' onChange=(action (mut (get data.speaker field.fieldIdentifier))) as |execute mapper|}} diff --git a/app/templates/events/view/sessions/create.hbs b/app/templates/events/view/sessions/create.hbs index ce0434a6cc8..68de9d60d09 100644 --- a/app/templates/events/view/sessions/create.hbs +++ b/app/templates/events/view/sessions/create.hbs @@ -7,6 +7,7 @@ fields=model.form data=model speakers=model.speakers + event=model.event speakersDetails=model.session.speakers save=(action 'save') includeSession=true diff --git a/app/templates/events/view/speakers/create.hbs b/app/templates/events/view/speakers/create.hbs index 6952b810ade..fe97d7bf231 100644 --- a/app/templates/events/view/speakers/create.hbs +++ b/app/templates/events/view/speakers/create.hbs @@ -3,7 +3,7 @@ {{t 'Create a Speaker'}}
- {{forms/session-speaker-form fields=model.form data=model sessions=model.sessions sessionDetails=sessionDetails save=(action 'save' sessionDetails) + {{forms/session-speaker-form fields=model.form data=model event=model.event sessions=model.sessions sessionDetails=sessionDetails save=(action 'save' sessionDetails) includeSpeaker=true isSessionSpeaker=true isLoading=isLoading}}