From 096dc475adbdf594cabd1b34a28c1be40f47bc71 Mon Sep 17 00:00:00 2001 From: iamareebjamal Date: Sun, 26 Jul 2020 12:58:41 +0530 Subject: [PATCH 1/3] feat: Add more session states --- app/controllers/events/view/sessions.js | 6 +++ app/routes/events/view/sessions/list.js | 50 ++++++------------------- app/templates/events/view/sessions.hbs | 17 +++------ 3 files changed, 22 insertions(+), 51 deletions(-) diff --git a/app/controllers/events/view/sessions.js b/app/controllers/events/view/sessions.js index 96803c0ccc1..49955d5331d 100644 --- a/app/controllers/events/view/sessions.js +++ b/app/controllers/events/view/sessions.js @@ -2,6 +2,8 @@ import Controller from '@ember/controller'; import { computed, action } from '@ember/object'; import { run } from '@ember/runloop'; +export const SESSION_STATES = ['pending', 'accepted', 'confirmed', 'rejected', 'withdrawn', 'canceled']; + export default class extends Controller { isLoading = false; @@ -12,6 +14,10 @@ export default class extends Controller { return currentRouteName !== 'events.view.sessions.create' && currentRouteName !== 'events.view.sessions.edit'; } + get sessionStates() { + return SESSION_STATES; + } + @action export() { this.set('isLoading', true); diff --git a/app/routes/events/view/sessions/list.js b/app/routes/events/view/sessions/list.js index e38d8c87a86..26a95064f92 100644 --- a/app/routes/events/view/sessions/list.js +++ b/app/routes/events/view/sessions/list.js @@ -1,19 +1,16 @@ import Route from '@ember/routing/route'; import { action } from '@ember/object'; import EmberTableRouteMixin from 'open-event-frontend/mixins/ember-table-route'; +import { SESSION_STATES } from 'open-event-frontend/controllers/events/view/sessions'; +import { capitalize } from 'lodash-es'; + + export default class extends Route.extend(EmberTableRouteMixin) { titleToken() { - switch (this.params.session_status) { - case 'pending': - return this.l10n.t('Pending'); - case 'confirmed': - return this.l10n.t('Confirmed'); - case 'accepted': - return this.l10n.t('Accepted'); - case 'rejected': - return this.l10n.t('Rejected'); - default: - return this.l10n.t('Session'); + if (SESSION_STATES.includes(this.params.session_status)) { + return this.l10n.t(capitalize(this.params.session_status)); + } else { + return this.l10n.t('Session'); } } @@ -32,40 +29,15 @@ export default class extends Route.extend(EmberTableRouteMixin) { this.set('params', params); const searchField = 'title'; let filterOptions = []; - if (params.session_status === 'pending') { - filterOptions = [ - { - name : 'state', - op : 'eq', - val : 'pending' - } - ]; - } else if (params.session_status === 'accepted') { - filterOptions = [ - { - name : 'state', - op : 'eq', - val : 'accepted' - } - ]; - } else if (params.session_status === 'rejected') { - filterOptions = [ - { - name : 'state', - op : 'eq', - val : 'rejected' - } - ]; - } else if (params.session_status === 'confirmed') { + + if (SESSION_STATES.includes(params.session_status)) { filterOptions = [ { name : 'state', op : 'eq', - val : 'confirmed' + val : params.session_status } ]; - } else { - filterOptions = []; } let store = this.modelFor('events.view'); diff --git a/app/templates/events/view/sessions.hbs b/app/templates/events/view/sessions.hbs index 7c9b293630a..8d03f7f7f23 100644 --- a/app/templates/events/view/sessions.hbs +++ b/app/templates/events/view/sessions.hbs @@ -7,18 +7,11 @@ {{t 'All'}} - - {{t 'Pending'}} - - - {{t 'Accepted'}} - - - {{t 'Confirmed'}} - - - {{t 'Rejected'}} - + {{#each this.sessionStates as |state|}} + + {{t (capitalize state)}} + + {{/each}}
From 8c6300b294866968ff90f342606dab329700bee4 Mon Sep 17 00:00:00 2001 From: iamareebjamal Date: Sun, 26 Jul 2020 22:45:51 +0530 Subject: [PATCH 2/3] finalize --- .../cell/events/view/sessions/cell-buttons.js | 17 ++- .../view/sessions/cell-session-state.js | 11 +- app/controllers/admin/sessions/list.js | 2 +- app/controllers/events/view/sessions.js | 3 +- app/controllers/events/view/sessions/list.js | 101 +++----------- app/routes/admin/sessions.js | 7 + app/routes/admin/sessions/list.js | 126 +++--------------- app/routes/events/view/sessions/list.js | 18 ++- app/templates/admin/sessions.hbs | 17 +-- .../events/view/sessions/cell-buttons.hbs | 45 +++---- .../view/sessions/cell-session-state.hbs | 12 +- app/utils/dictionary/sessions.ts | 12 ++ 12 files changed, 117 insertions(+), 254 deletions(-) create mode 100644 app/utils/dictionary/sessions.ts diff --git a/app/components/ui-table/cell/events/view/sessions/cell-buttons.js b/app/components/ui-table/cell/events/view/sessions/cell-buttons.js index 45248689492..efcfba4e0c8 100644 --- a/app/components/ui-table/cell/events/view/sessions/cell-buttons.js +++ b/app/components/ui-table/cell/events/view/sessions/cell-buttons.js @@ -1,5 +1,20 @@ import classic from 'ember-classic-decorator'; import Component from '@ember/component'; +import { stateColorMap } from 'open-event-frontend/utils/dictionary/sessions'; +import { computed } from '@ember/object'; @classic -export default class CellButtons extends Component {} +export default class CellButtons extends Component { + + @computed('extraRecords.status') + get states() { + return Object.keys(this.props.options.sessionStateMap.organizer[this.extraRecords.status]) + .map(state => ({ name: state, color: stateColorMap[state] })); + } + + @computed('extraRecords.status') + get color() { + return stateColorMap[this.extraRecords.status]; + } + +} diff --git a/app/components/ui-table/cell/events/view/sessions/cell-session-state.js b/app/components/ui-table/cell/events/view/sessions/cell-session-state.js index 10c607bdf3a..16072b8a204 100644 --- a/app/components/ui-table/cell/events/view/sessions/cell-session-state.js +++ b/app/components/ui-table/cell/events/view/sessions/cell-session-state.js @@ -1,5 +1,14 @@ import classic from 'ember-classic-decorator'; import Component from '@ember/component'; +import { computed } from '@ember/object'; +import { stateColorMap } from 'open-event-frontend/utils/dictionary/sessions'; @classic -export default class CellSessionState extends Component {} +export default class CellSessionState extends Component { + + @computed('record') + get color() { + return stateColorMap[this.record] || 'yellow'; + } + +} diff --git a/app/controllers/admin/sessions/list.js b/app/controllers/admin/sessions/list.js index 91c8a7593f0..cfc3449c0d4 100644 --- a/app/controllers/admin/sessions/list.js +++ b/app/controllers/admin/sessions/list.js @@ -58,7 +58,7 @@ export default class extends Controller.extend(EmberTableControllerMixin) { } }, { - name : 'Actions', + name : 'Change State', cellComponent : 'ui-table/cell/cell-simple-buttons', valuePath : 'id', extraValuePaths : ['event'], diff --git a/app/controllers/events/view/sessions.js b/app/controllers/events/view/sessions.js index 49955d5331d..190f39c6160 100644 --- a/app/controllers/events/view/sessions.js +++ b/app/controllers/events/view/sessions.js @@ -1,8 +1,7 @@ import Controller from '@ember/controller'; import { computed, action } from '@ember/object'; import { run } from '@ember/runloop'; - -export const SESSION_STATES = ['pending', 'accepted', 'confirmed', 'rejected', 'withdrawn', 'canceled']; +import { SESSION_STATES } from 'open-event-frontend/utils/dictionary/sessions'; export default class extends Controller { diff --git a/app/controllers/events/view/sessions/list.js b/app/controllers/events/view/sessions/list.js index fbd6d67b5b9..2ee356aed49 100644 --- a/app/controllers/events/view/sessions/list.js +++ b/app/controllers/events/view/sessions/list.js @@ -47,14 +47,6 @@ export default class extends Controller.extend(EmberTableControllerMixin) { addRating : this.addRating.bind(this) } }, - { - name : 'Avg Rating', - valuePath : 'averageRating' - }, - { - name : 'No. of ratings', - valuePath : 'feedbacks.length' - }, { name : 'Track', valuePath : 'track.name' @@ -87,14 +79,15 @@ export default class extends Controller.extend(EmberTableControllerMixin) { cellComponent : 'ui-table/cell/events/view/sessions/cell-is-mail-sent' }, { - name : 'Actions', + name : 'Change State', cellComponent : 'ui-table/cell/events/view/sessions/cell-buttons', valuePath : 'id', extraValuePaths : ['status'], - actions : { - acceptProposal : this.acceptProposal.bind(this), - confirmProposal : this.confirmProposal.bind(this), - rejectProposal : this.rejectProposal.bind(this) + options : { + sessionStateMap: this.model.sessionStateMap + }, + actions: { + changeState: this.changeState.bind(this) } }, { @@ -192,94 +185,30 @@ export default class extends Controller.extend(EmberTableControllerMixin) { } @action - acceptProposal(session_id, sendEmail) { - let session = this.store.peekRecord('session', session_id, { backgroundReload: false }); - session.setProperties({ - sendEmail, - 'state' : 'accepted', - 'isMailSent' : sendEmail - }); - this.set('isLoading', true); - session.save() - .then(() => { - sendEmail ? this.notify.success(this.l10n.t('Session has been accepted and speaker has been notified via email.'), - { - id: 'session_accep_email' - }) - : this.notify.success(this.l10n.t('Session has been accepted'), - { - id: 'session_accep' - }); - this.refreshModel.bind(this)(); - }) - .catch(() => { - this.notify.error(this.l10n.t('An unexpected error has occurred.'), - { - id: 'session_unex_error' - }); - }) - .finally(() => { - this.set('isLoading', false); - }); - } - - @action - confirmProposal(session_id, sendEmail) { - let session = this.store.peekRecord('session', session_id, { backgroundReload: false }); - session.setProperties({ - sendEmail, - 'state' : 'confirmed', - 'isMailSent' : sendEmail - }); - this.set('isLoading', true); - session.save() - .then(() => { - sendEmail ? this.notify.success(this.l10n.t('Session has been confirmed and speaker has been notified via email.'), - { - id: 'session_confirm_email' - }) - : this.notify.success(this.l10n.t('Session has been confirmed'), - { - id: 'session_confirm' - }); - this.refreshModel.bind(this)(); - }) - .catch(() => { - this.notify.error(this.l10n.t('An unexpected error has occurred.'), - { - id: 'session_confirm_unexpected' - }); - }) - .finally(() => { - this.set('isLoading', false); - }); - } - - @action - rejectProposal(session_id, sendEmail) { - let session = this.store.peekRecord('session', session_id, { backgroundReload: false }); + changeState(session_id, state, sendEmail) { + const session = this.store.peekRecord('session', session_id, { backgroundReload: false }); session.setProperties({ sendEmail, - 'state' : 'rejected', - 'isMailSent' : sendEmail + state, + isMailSent: sendEmail }); this.set('isLoading', true); session.save() .then(() => { - sendEmail ? this.notify.success(this.l10n.t('Session has been rejected and speaker has been notified via email.'), + sendEmail ? this.notify.success(this.l10n.t(`Session has been ${state} and speaker has been notified via email.`), { - id: 'session_reject_email' + id: 'session_state_email' }) - : this.notify.success(this.l10n.t('Session has been rejected'), + : this.notify.success(this.l10n.t(`Session has been ${state}`), { - id: 'session_rejected' + id: 'session_state' }); this.refreshModel.bind(this)(); }) .catch(() => { this.notify.error(this.l10n.t('An unexpected error has occurred.'), { - id: 'session_reject_error' + id: 'session_state_unexpected' }); }) .finally(() => { diff --git a/app/routes/admin/sessions.js b/app/routes/admin/sessions.js index b502011be41..6496e2999f3 100644 --- a/app/routes/admin/sessions.js +++ b/app/routes/admin/sessions.js @@ -1,9 +1,16 @@ import classic from 'ember-classic-decorator'; import Route from '@ember/routing/route'; +import { SESSION_STATES } from 'open-event-frontend/utils/dictionary/sessions'; @classic export default class SessionsRoute extends Route { titleToken() { return this.l10n.t('Sessions'); } + + model() { + return { + sessionStates: SESSION_STATES + }; + } } diff --git a/app/routes/admin/sessions/list.js b/app/routes/admin/sessions/list.js index 5eac06b2959..e0599dffdbb 100644 --- a/app/routes/admin/sessions/list.js +++ b/app/routes/admin/sessions/list.js @@ -1,110 +1,32 @@ import Route from '@ember/routing/route'; import EmberTableRouteMixin from 'open-event-frontend/mixins/ember-table-route'; +import { capitalize } from 'lodash-es'; +import { SESSION_STATES } from 'open-event-frontend/utils/dictionary/sessions'; export default class extends Route.extend(EmberTableRouteMixin) { titleToken() { - switch (this.params.sessions_state) { - case 'confirmed': - return this.l10n.t('Confirmed'); - case 'pending': - return this.l10n.t('Pending'); - case 'accepted': - return this.l10n.t('Accepted'); - case 'rejected': - return this.l10n.t('Rejected'); - case 'deleted': - return this.l10n.t('Deleted'); - default: - return this.l10n.t('Session'); + if ([...SESSION_STATES, 'deleted'].includes(this.params.sessions_state)) { + return this.l10n.t(capitalize(this.params.sessions_state)); + } else { + return this.l10n.t('Session'); } } async model(params) { this.set('params', params); const searchField = 'title'; - let filterOptions = []; - if (params.sessions_state === 'pending') { - filterOptions = [ - { - and: - [ - { - name : 'event', - op : 'has', - val : { - name : 'deleted-at', - op : 'eq', - val : null - } - }, - { - name : 'deleted-at', - op : 'eq', - val : null - }, - { - name : 'state', - op : 'eq', - val : 'pending' - } - ] - } - ]; - } else if (params.sessions_state === 'confirmed') { - filterOptions = [ - { - and: - [ - { - name : 'event', - op : 'has', - val : { - name : 'deleted-at', - op : 'eq', - val : null - } - }, - { - name : 'deleted-at', - op : 'eq', - val : null - }, - { - name : 'state', - op : 'eq', - val : 'confirmed' - } - ] - } - ]; - } else if (params.sessions_state === 'accepted') { - filterOptions = [ - { - and: - [ - { - name : 'event', - op : 'has', - val : { - name : 'deleted-at', - op : 'eq', - val : null - } - }, - { - name : 'deleted-at', - op : 'eq', - val : null - }, - { - name : 'state', - op : 'eq', - val : 'accepted' - } - ] + let filterOptions = [ + { + name : 'event', + op : 'has', + val : { + name : 'deleted-at', + op : 'eq', + val : null } - ]; - } else if (params.sessions_state === 'rejected') { + } + ]; + if (SESSION_STATES.includes(params.sessions_state)) { filterOptions = [ { and: @@ -126,7 +48,7 @@ export default class extends Route.extend(EmberTableRouteMixin) { { name : 'state', op : 'eq', - val : 'rejected' + val : params.sessions_state } ] } @@ -153,18 +75,6 @@ export default class extends Route.extend(EmberTableRouteMixin) { ] } ]; - } else { - filterOptions = [ - { - name : 'event', - op : 'has', - val : { - name : 'deleted-at', - op : 'eq', - val : null - } - } - ]; } filterOptions = this.applySearchFilters(filterOptions, params, searchField); let queryString = { diff --git a/app/routes/events/view/sessions/list.js b/app/routes/events/view/sessions/list.js index 26a95064f92..b2fe734c205 100644 --- a/app/routes/events/view/sessions/list.js +++ b/app/routes/events/view/sessions/list.js @@ -1,9 +1,10 @@ import Route from '@ember/routing/route'; import { action } from '@ember/object'; import EmberTableRouteMixin from 'open-event-frontend/mixins/ember-table-route'; -import { SESSION_STATES } from 'open-event-frontend/controllers/events/view/sessions'; import { capitalize } from 'lodash-es'; +import { SESSION_STATES } from 'open-event-frontend/utils/dictionary/sessions'; +let sessionStateMapCached = null; export default class extends Route.extend(EmberTableRouteMixin) { titleToken() { @@ -59,7 +60,7 @@ export default class extends Route.extend(EmberTableRouteMixin) { } ] }; - let feedbacks = await this.authManager.currentUser.query('feedbacks', queryObject); + const feedbacksPromise = this.authManager.currentUser.query('feedbacks', queryObject); filterOptions = this.applySearchFilters(filterOptions, params, searchField); let queryString = { @@ -70,9 +71,18 @@ export default class extends Route.extend(EmberTableRouteMixin) { }; queryString = this.applySortFilters(queryString, params); + const sessionsPromise = this.asArray(store.query('sessions', queryString)); + + const sessionStatesMapPromise = sessionStateMapCached || this.loader.load('sessions/states'); + + const [feedbacks, sessions, sessionStateMap] = await Promise.all([feedbacksPromise, sessionsPromise, sessionStatesMapPromise]); + + sessionStateMapCached = sessionStateMap; + return { - sessions: await this.asArray(store.query('sessions', queryString)), - feedbacks + sessions, + feedbacks, + sessionStateMap }; } diff --git a/app/templates/admin/sessions.hbs b/app/templates/admin/sessions.hbs index 65ad523e55e..92e66d37d36 100644 --- a/app/templates/admin/sessions.hbs +++ b/app/templates/admin/sessions.hbs @@ -5,18 +5,11 @@ {{t 'All'}} - - {{t 'Confirmed'}} - - - {{t 'Pending'}} - - - {{t 'Accepted'}} - - - {{t 'Rejected'}} - + {{#each this.model.sessionStates as |state|}} + + {{t (capitalize state)}} + + {{/each}} {{t 'Deleted'}} diff --git a/app/templates/components/ui-table/cell/events/view/sessions/cell-buttons.hbs b/app/templates/components/ui-table/cell/events/view/sessions/cell-buttons.hbs index 473728a83a8..e1db0250413 100644 --- a/app/templates/components/ui-table/cell/events/view/sessions/cell-buttons.hbs +++ b/app/templates/components/ui-table/cell/events/view/sessions/cell-buttons.hbs @@ -1,29 +1,18 @@ -
- {{#if (or (eq this.extraRecords.status 'rejected')(eq this.extraRecords.status 'pending'))}} - - - + diff --git a/app/templates/components/ui-table/cell/events/view/sessions/cell-session-state.hbs b/app/templates/components/ui-table/cell/events/view/sessions/cell-session-state.hbs index 28c7bfd5f02..10190e61318 100644 --- a/app/templates/components/ui-table/cell/events/view/sessions/cell-session-state.hbs +++ b/app/templates/components/ui-table/cell/events/view/sessions/cell-session-state.hbs @@ -1,13 +1,3 @@ - {{#if (eq this.record "accepted")}} -
{{t 'Accepted'}}
- {{else if (eq this.record "confirmed")}} -
{{t 'Confirmed'}}
- {{else if (eq this.record "pending")}} -
{{t 'Pending'}}
- {{else if (eq this.record "rejected")}} -
{{t 'Rejected'}}
- {{else if (eq this.record "deleted")}} -
{{t 'Deleted'}}
- {{/if}} +
{{t (capitalize this.record)}}
diff --git a/app/utils/dictionary/sessions.ts b/app/utils/dictionary/sessions.ts new file mode 100644 index 00000000000..c6e5a3103b1 --- /dev/null +++ b/app/utils/dictionary/sessions.ts @@ -0,0 +1,12 @@ +export const stateColorMap = { + draft: 'grey', + accepted: 'teal', + confirmed: 'green', + pending: 'yellow', + rejected: 'red', + deleted: 'red', + withdrawn: 'black', + canceled: 'orange' +}; + +export const SESSION_STATES = ['pending', 'accepted', 'confirmed', 'rejected', 'withdrawn', 'canceled']; From 050c6a420fd1d77e5274d12682f9e9abba7e8676 Mon Sep 17 00:00:00 2001 From: iamareebjamal Date: Sun, 26 Jul 2020 23:20:41 +0530 Subject: [PATCH 3/3] f --- app/controllers/admin/sessions/list.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/admin/sessions/list.js b/app/controllers/admin/sessions/list.js index cfc3449c0d4..91c8a7593f0 100644 --- a/app/controllers/admin/sessions/list.js +++ b/app/controllers/admin/sessions/list.js @@ -58,7 +58,7 @@ export default class extends Controller.extend(EmberTableControllerMixin) { } }, { - name : 'Change State', + name : 'Actions', cellComponent : 'ui-table/cell/cell-simple-buttons', valuePath : 'id', extraValuePaths : ['event'],