From 1abfd530f9be055c6fa6f296f217a8a5fbe6b8ca Mon Sep 17 00:00:00 2001 From: Kven Ho Date: Mon, 23 Oct 2017 11:13:06 +0800 Subject: [PATCH 1/7] Initial app-config module [ISDK-80] --- src/app/app.module.ts | 2 + src/pages/tabs/tabs.page.ts | 12 +++++- src/shared/app-config/app-config.module.ts | 6 +++ src/shared/app-config/app-config.service.ts | 48 +++++++++++++++++++++ 4 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 src/shared/app-config/app-config.module.ts create mode 100644 src/shared/app-config/app-config.service.ts diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 4fdb7336..3bf96547 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -14,6 +14,7 @@ import { HttpModule, Http } from '@angular/http'; import { TranslateModule, TranslateLoader } from '@ngx-translate/core'; import { TranslateHttpLoader } from "@ngx-translate/http-loader"; import { i18nData } from './assets/i18n-en'; +import { AppConfigModule } from '../shared/app-config/app-config.module'; import { TranslationModule } from '../shared/translation/translation.module'; import { MomentModule } from 'angular2-moment'; @@ -156,6 +157,7 @@ export function HttpLoaderFactory(http: Http) { EscapeHtmlPipe, ], imports: [ + AppConfigModule, BrowserModule, CacheModule, FormsModule, diff --git a/src/pages/tabs/tabs.page.ts b/src/pages/tabs/tabs.page.ts index c0339b8b..02b49839 100644 --- a/src/pages/tabs/tabs.page.ts +++ b/src/pages/tabs/tabs.page.ts @@ -4,9 +4,10 @@ import { Component } from '@angular/core'; import { ActivitiesListPage } from '../activities/list/list.page'; import { RankingsPage } from '../rankings/list/rankings.page'; import { SettingsPage } from '../settings/settings.page'; -import { TestPage } from './test.page'; +// import { TestPage } from './test.page'; import { EventsListPage } from '../events/list/list.page'; // Others +import { AppConfigService } from '../../shared/app-config/app-config.service'; import { TranslationService } from '../../shared/translation/translation.service'; @Component({ @@ -22,7 +23,16 @@ export class TabsPage { settings: any = SettingsPage; events: any = EventsListPage; + tabs: any = []; + constructor( + public appConfig: AppConfigService, public translationService: TranslationService ) {} + + ionViewWillEnter() { + this.appConfig.getModule().then(modules => { + this.tabs = modules; + }); + } } diff --git a/src/shared/app-config/app-config.module.ts b/src/shared/app-config/app-config.module.ts new file mode 100644 index 00000000..58769a6f --- /dev/null +++ b/src/shared/app-config/app-config.module.ts @@ -0,0 +1,6 @@ +import { NgModule } from '@angular/core'; +import { AppConfigService } from './app-config.service'; +@NgModule({ + providers: [ AppConfigService ] +}) +export class AppConfigModule {} diff --git a/src/shared/app-config/app-config.service.ts b/src/shared/app-config/app-config.service.ts new file mode 100644 index 00000000..98664323 --- /dev/null +++ b/src/shared/app-config/app-config.service.ts @@ -0,0 +1,48 @@ +import { Injectable } from '@angular/core'; + +// Others +import * as _ from 'lodash'; + +@Injectable() +export class AppConfigService { + + appConfigContent: any = { + app: { + name: 'ISDK' + }, + modules: { + activities: { + title: 'Dashboard', + visible: true, + order: 0 + }, + events: { + title: 'Events', + visible: true, + order: 1 + }, + rankings: { + title: 'Rankings', + visible: true, + order: 2 + }, + settings: { + title: 'Settings', + visible: true, + order: 3 + } + } + }; + + get(): Promise { + return new Promise((resolve, reject) => { + resolve(this.appConfigContent); + }); + } + + getModule(): Promise { + return this.get().then((data: any) => { + return _.sortBy(data.modules, [(o) => o.order]); + }); + } +} From 3779d1b02df17fda753448e622a816f050379f26 Mon Sep 17 00:00:00 2001 From: Kven Ho Date: Mon, 23 Oct 2017 12:45:54 +0800 Subject: [PATCH 2/7] Assign page to tab automatically [ISDK-80] --- src/pages/tabs/tabs.html | 7 +---- src/pages/tabs/tabs.page.ts | 8 ------ src/shared/app-config/app-config.service.ts | 29 +++++++++++++++------ 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/pages/tabs/tabs.html b/src/pages/tabs/tabs.html index c45f2d85..a32f5ba4 100755 --- a/src/pages/tabs/tabs.html +++ b/src/pages/tabs/tabs.html @@ -1,9 +1,4 @@ - - - + - - - diff --git a/src/pages/tabs/tabs.page.ts b/src/pages/tabs/tabs.page.ts index 02b49839..745c47a9 100644 --- a/src/pages/tabs/tabs.page.ts +++ b/src/pages/tabs/tabs.page.ts @@ -2,10 +2,6 @@ import { Component } from '@angular/core'; // Pages import { ActivitiesListPage } from '../activities/list/list.page'; -import { RankingsPage } from '../rankings/list/rankings.page'; -import { SettingsPage } from '../settings/settings.page'; -// import { TestPage } from './test.page'; -import { EventsListPage } from '../events/list/list.page'; // Others import { AppConfigService } from '../../shared/app-config/app-config.service'; import { TranslationService } from '../../shared/translation/translation.service'; @@ -17,11 +13,7 @@ import { TranslationService } from '../../shared/translation/translation.service export class TabsPage { // this tells the tabs component which Pages // should be each tab's root Page - ranking: any = RankingsPage; - // ranking: any = TestPage; dashboard: any = ActivitiesListPage; - settings: any = SettingsPage; - events: any = EventsListPage; tabs: any = []; diff --git a/src/shared/app-config/app-config.service.ts b/src/shared/app-config/app-config.service.ts index 98664323..e62cdcb6 100644 --- a/src/shared/app-config/app-config.service.ts +++ b/src/shared/app-config/app-config.service.ts @@ -1,34 +1,42 @@ import { Injectable } from '@angular/core'; +// Pages +import { EventsListPage } from '../../pages/events/list/list.page'; +import { RankingsPage } from '../../pages/rankings/list/rankings.page'; +import { SettingsPage } from '../../pages/settings/settings.page'; + // Others import * as _ from 'lodash'; @Injectable() export class AppConfigService { + pagesMap: any = { + events: EventsListPage, + rankings: RankingsPage, + settings: SettingsPage + } appConfigContent: any = { app: { name: 'ISDK' }, modules: { - activities: { - title: 'Dashboard', - visible: true, - order: 0 - }, events: { + name: 'events', title: 'Events', - visible: true, + icon: 'md-calendar', order: 1 }, rankings: { + name: 'rankings', title: 'Rankings', - visible: true, + icon: 'md-medal', order: 2 }, settings: { + name: 'settings', title: 'Settings', - visible: true, + icon: 'md-person', order: 3 } } @@ -43,6 +51,11 @@ export class AppConfigService { getModule(): Promise { return this.get().then((data: any) => { return _.sortBy(data.modules, [(o) => o.order]); + }).then((data: any) => { + return _.map(data, (o) => { + o.root = this.pagesMap[o.name]; + return o; + }); }); } } From b46086eb2b0a1f6c1dfd025e6664db3740fdf8d9 Mon Sep 17 00:00:00 2001 From: Kven Ho Date: Mon, 23 Oct 2017 16:46:30 +0800 Subject: [PATCH 3/7] Add more page map [ISDK-80] --- src/shared/app-config/app-config.service.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/shared/app-config/app-config.service.ts b/src/shared/app-config/app-config.service.ts index e62cdcb6..bd4ba894 100644 --- a/src/shared/app-config/app-config.service.ts +++ b/src/shared/app-config/app-config.service.ts @@ -2,8 +2,11 @@ import { Injectable } from '@angular/core'; // Pages import { EventsListPage } from '../../pages/events/list/list.page'; +import { GalleryPage } from '../../pages/gallery/gallery.page'; +import { LevelsPage } from '../../pages/levels/list/list.page'; import { RankingsPage } from '../../pages/rankings/list/rankings.page'; import { SettingsPage } from '../../pages/settings/settings.page'; +import { TeamPage } from '../../pages/team/team.page'; // Others import * as _ from 'lodash'; @@ -13,9 +16,12 @@ export class AppConfigService { pagesMap: any = { events: EventsListPage, rankings: RankingsPage, - settings: SettingsPage + settings: SettingsPage, + gallery: GalleryPage, + team: TeamPage } + // JSON format sent back from server appConfigContent: any = { app: { name: 'ISDK' From 2c47fbeea4712c34fc508a318777597e02c05075 Mon Sep 17 00:00:00 2001 From: Kven Ho Date: Tue, 24 Oct 2017 09:39:47 +0800 Subject: [PATCH 4/7] Update code style [ISDK-80] --- src/app/app.module.ts | 4 ++-- src/pages/gallery/{gallery.ts => gallery.page.ts} | 0 src/pages/spinwheel/celebration.html | 3 --- src/pages/spinwheel/celebration.page.ts | 8 -------- src/pages/tabs/tabs.page.ts | 2 +- src/pages/team/{team.ts => team.page.ts} | 0 src/shared/app-config/app-config.service.ts | 6 +++--- src/shared/testModules/pages/test/test-start.page.ts | 9 ++------- 8 files changed, 8 insertions(+), 24 deletions(-) rename src/pages/gallery/{gallery.ts => gallery.page.ts} (100%) delete mode 100644 src/pages/spinwheel/celebration.html delete mode 100644 src/pages/spinwheel/celebration.page.ts rename src/pages/team/{team.ts => team.page.ts} (100%) diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 3bf96547..e948617f 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -68,7 +68,7 @@ import { EventsListPage } from '../pages/events/list/list.page'; import { EventsPreviewPage } from '../pages/events/download/events-preview.page'; import { EventsViewPage } from '../pages/events/view/events-view.page'; import { ForgetPasswordPage } from '../pages/forget-password/forget-password'; -import { GalleryPage } from '../pages/gallery/gallery'; +import { GalleryPage } from '../pages/gallery/gallery.page'; import { ItemsPopupPage } from '../pages/assessments/popup/items-popup.page'; import { LeaderboardSettingsPage } from '../pages/settings/leaderboard/leaderboard-settings.page'; import { LevelsListPage } from '../pages/levels/list/list'; @@ -83,7 +83,7 @@ import { ResetPasswordPage } from '../pages/reset-password/reset-password'; import { SettingsPage } from '../pages/settings/settings.page'; import { SidenavPage } from '../pages/sidenav/sidenav'; import { TabsPage } from '../pages/tabs/tabs.page'; -import { TeamPage } from '../pages/team/team'; +import { TeamPage } from '../pages/team/team.page'; import { TermConditionPage } from '../pages/term-condition/term-condition.page'; import { TestPage } from '../pages/tabs/test.page'; import { TutorialPage } from '../pages/settings/tutorial/tutorial.page'; diff --git a/src/pages/gallery/gallery.ts b/src/pages/gallery/gallery.page.ts similarity index 100% rename from src/pages/gallery/gallery.ts rename to src/pages/gallery/gallery.page.ts diff --git a/src/pages/spinwheel/celebration.html b/src/pages/spinwheel/celebration.html deleted file mode 100644 index f736105a..00000000 --- a/src/pages/spinwheel/celebration.html +++ /dev/null @@ -1,3 +0,0 @@ - - Test - diff --git a/src/pages/spinwheel/celebration.page.ts b/src/pages/spinwheel/celebration.page.ts deleted file mode 100644 index 5bf0adbe..00000000 --- a/src/pages/spinwheel/celebration.page.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - templateUrl: './celebration.html' -}) -export class CelebrationPage { - -} diff --git a/src/pages/tabs/tabs.page.ts b/src/pages/tabs/tabs.page.ts index 745c47a9..27ae955a 100644 --- a/src/pages/tabs/tabs.page.ts +++ b/src/pages/tabs/tabs.page.ts @@ -23,7 +23,7 @@ export class TabsPage { ) {} ionViewWillEnter() { - this.appConfig.getModule().then(modules => { + this.appConfig.getTabs().then(modules => { this.tabs = modules; }); } diff --git a/src/pages/team/team.ts b/src/pages/team/team.page.ts similarity index 100% rename from src/pages/team/team.ts rename to src/pages/team/team.page.ts diff --git a/src/shared/app-config/app-config.service.ts b/src/shared/app-config/app-config.service.ts index bd4ba894..4a982253 100644 --- a/src/shared/app-config/app-config.service.ts +++ b/src/shared/app-config/app-config.service.ts @@ -26,7 +26,7 @@ export class AppConfigService { app: { name: 'ISDK' }, - modules: { + tabs: { events: { name: 'events', title: 'Events', @@ -54,9 +54,9 @@ export class AppConfigService { }); } - getModule(): Promise { + getTabs(): Promise { return this.get().then((data: any) => { - return _.sortBy(data.modules, [(o) => o.order]); + return _.sortBy(data.tabs, [(o) => o.order]); }).then((data: any) => { return _.map(data, (o) => { o.root = this.pagesMap[o.name]; diff --git a/src/shared/testModules/pages/test/test-start.page.ts b/src/shared/testModules/pages/test/test-start.page.ts index 861ca6bd..b4d7fa5e 100755 --- a/src/shared/testModules/pages/test/test-start.page.ts +++ b/src/shared/testModules/pages/test/test-start.page.ts @@ -7,20 +7,15 @@ import { AssessmentsGroupPage } from '../../../../pages/assessments/group/assess import { ActivitiesClassicListPage } from '../../../../pages/activities-classic/list/activities-classic-list.page'; import { EventsListPage } from '../../../../pages/events/list/list.page'; import { EventsDownloadPage } from '../../../../pages/events/download/events-download.page'; -import { GalleryPage } from '../../../../pages/gallery/gallery'; +import { GalleryPage } from '../../../../pages/gallery/gallery.page'; import { LevelsListPage } from '../../../../pages/levels/list/list'; import { LoginPage } from '../../../../pages/login/login'; import { RegistrationPage } from '../../../../pages/registration/registration.page'; import { SettingsPage } from '../../../../pages/settings/settings.page'; import { EventCheckinPage } from '../../../../pages/events/checkin/event-checkin.page'; -import { TeamPage } from '../../../../pages/team/team'; -import { CelebrationPage } from '../../../../pages/spinwheel/celebration.page'; +import { TeamPage } from '../../../../pages/team/team.page'; const PAGES = [ - { - name: 'celebration', - page: CelebrationPage - }, { name: 'Check-in', page: EventCheckinPage, From 02b1c1048e9f012a06841626af021d8de006c544 Mon Sep 17 00:00:00 2001 From: Kven Ho Date: Tue, 24 Oct 2017 09:56:05 +0800 Subject: [PATCH 5/7] Add comment for code [ISDK-80] --- src/pages/tabs/tabs.page.ts | 4 +++- src/shared/app-config/app-config.service.ts | 8 ++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/pages/tabs/tabs.page.ts b/src/pages/tabs/tabs.page.ts index 27ae955a..dd6f6c46 100644 --- a/src/pages/tabs/tabs.page.ts +++ b/src/pages/tabs/tabs.page.ts @@ -13,8 +13,10 @@ import { TranslationService } from '../../shared/translation/translation.service export class TabsPage { // this tells the tabs component which Pages // should be each tab's root Page - dashboard: any = ActivitiesListPage; + // We need hardcode at least one tab menu, + // otherwise any misconfigure will break + dashboard: any = ActivitiesListPage; tabs: any = []; constructor( diff --git a/src/shared/app-config/app-config.service.ts b/src/shared/app-config/app-config.service.ts index 4a982253..35f07bd5 100644 --- a/src/shared/app-config/app-config.service.ts +++ b/src/shared/app-config/app-config.service.ts @@ -13,6 +13,8 @@ import * as _ from 'lodash'; @Injectable() export class AppConfigService { + // Mapping page to name, + // use for changing page in tab menu pagesMap: any = { events: EventsListPage, rankings: RankingsPage, @@ -48,12 +50,18 @@ export class AppConfigService { } }; + /** + * @description Get raw configure data from server + */ get(): Promise { return new Promise((resolve, reject) => { resolve(this.appConfigContent); }); } + /** + * @description Get only configure for tabs + */ getTabs(): Promise { return this.get().then((data: any) => { return _.sortBy(data.tabs, [(o) => o.order]); From db06d9263efeb1f1cfbea2a8bf446d44629e9584 Mon Sep 17 00:00:00 2001 From: Kven Ho Date: Tue, 24 Oct 2017 10:30:21 +0800 Subject: [PATCH 6/7] Update event service [ISDK-83] --- src/services/event.service.ts | 56 +++++++++++++++++++++++++++-------- 1 file changed, 43 insertions(+), 13 deletions(-) diff --git a/src/services/event.service.ts b/src/services/event.service.ts index 6115b751..5229dce4 100755 --- a/src/services/event.service.ts +++ b/src/services/event.service.ts @@ -17,6 +17,31 @@ export class EventService { public request: RequestService ) {} + /** + * @description Normalise event + * @param {[events]} events data from API + */ + + _normalise(events) { + _.forEach(events, (event, idx) => { + events[idx].isAttended = (event.isBooked === true && moment().isAfter(moment(event.end))); + // We assume server datetime response is UTC... + events[idx].startDisplay = moment.utc(event.start).local().format("dddd, MMM D [at] h:mm A"); + events[idx].startDisplayDate = moment.utc(event.start).local().format("dddd, MMM D"); + events[idx].startDisplayTime = moment.utc(event.start).local().format("h:mm A"); + events[idx].endDisplay = moment.utc(event.end).local().format("dddd, MMM D [at] h:mm A"); + events[idx].endDisplayDate = moment.utc(event.end).local().format("dddd, MMM D"); + events[idx].endDisplayTime = moment.utc(event.end).local().format("h:mm A"); + }); + + return events; + } + + /** + * @description Get events data + * @param {object} options + */ + getEvents(options: Object = {}) { options = _.merge({ search: { @@ -29,18 +54,8 @@ export class EventService { .toPromise(); } - _normalise(events) { - _.forEach(events, (event, idx) => { - events[idx].isAttended = (event.isBooked === true && moment().isAfter(moment(event.end))); - // We assume server datetime response is UTC... - events[idx].startDisplay = moment.utc(event.start).local().format("dddd, MMM D [at] h:mm A"); - }); - - return events; - } - /** - * download attachment by single event object + * @description download attachment by single event object * @param {[type]} event [description] */ @@ -52,16 +67,31 @@ export class EventService { } /** - * get event using observable + * @description get event using observable * @param {integer} eventId single event id */ + bookEvent(eventId) { let urlSearchParams = new URLSearchParams(); urlSearchParams.append('event_id', eventId); return this.request.post(this.bookEventUrl, urlSearchParams); } - cancelEventBooking(eventId){ + /** + * @description cancel booked event + * @param {integer} eventId single event id + */ + + cancelEventBooking(eventId) { return this.request.delete(this.bookEventUrl + '?event_id=' + eventId); } + + /** + * @description Get session events + * @param {[integer]} activityIDs + */ + + getUserEvents(activityIDs) { + return this.request.get(this.targetUrl+`?type=session&activity_id=[${activityIDs}]`); + } } From e9da64b16c12bfd02aa76f11a90fb77227219e79 Mon Sep 17 00:00:00 2001 From: Kven Ho Date: Tue, 14 Nov 2017 12:06:21 +0800 Subject: [PATCH 7/7] Update event only can checkin after started [ISDK-83] --- src/pages/events/list/list.page.ts | 4 ---- src/pages/events/view/events-view.html | 4 ++-- src/pages/events/view/events-view.page.ts | 12 ++++++++++-- src/shared/request/request.service.ts | 6 +++--- 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/pages/events/list/list.page.ts b/src/pages/events/list/list.page.ts index 49747192..cfb5a03d 100644 --- a/src/pages/events/list/list.page.ts +++ b/src/pages/events/list/list.page.ts @@ -177,10 +177,6 @@ export class EventsListPage { return result; } - // Check event allow to check-in - allowCheckIn(event) { - return (moment(event.start).isAfter() && moment(event.end).isBefore()); - } view(event) { this.navCtrl.push(EventsViewPage, { diff --git a/src/pages/events/view/events-view.html b/src/pages/events/view/events-view.html index cb512e27..109aee66 100644 --- a/src/pages/events/view/events-view.html +++ b/src/pages/events/view/events-view.html @@ -43,7 +43,7 @@ {{ 'EVENTS.BOOK' | translate }} - - diff --git a/src/pages/events/view/events-view.page.ts b/src/pages/events/view/events-view.page.ts index 9d8c3899..f9a49de5 100755 --- a/src/pages/events/view/events-view.page.ts +++ b/src/pages/events/view/events-view.page.ts @@ -180,16 +180,24 @@ export class EventsViewPage { /** * @note existence of References array determines if an event is * a checkin type - * @description examine event to allow check in + * @description examine event contain reference, because we need context ID * @param {Object} event */ - allowCheckIn(event) { + hasReference(event) { if (event.References && event.References.length > 0) { return true; } return false; } + /** + * @description examine event to allow check in + * @param {Object} event + */ + allowCheckIn(event) { + return moment().isAfter(moment(event.start)); + } + /** * Event checkin action * @param {Object} event single event object return from get_event API diff --git a/src/shared/request/request.service.ts b/src/shared/request/request.service.ts index 903fb2ab..ad1ca636 100755 --- a/src/shared/request/request.service.ts +++ b/src/shared/request/request.service.ts @@ -76,13 +76,13 @@ export class RequestService { let apiKey = this.cacheService.getCached('apikey') || this.cacheService.getLocal('apikey'); if (!_.isEmpty(apiKey)) { - result = result.set('apikey', apiKey.toString()); + result = result.set('apikey', _.toString(apiKey)); } // Inject timelineID from cached let timelineId = this.cacheService.getCached('timelineID') || this.cacheService.getLocal('timelineID'); if (timelineId) { - result = result.set('timelineID', timelineId.toString()); + result = result.set('timelineID', _.toString(timelineId)); } return result; } @@ -100,7 +100,7 @@ export class RequestService { let params = (options && options.params) ? options.params : new HttpParams(); if (options && options.search) { _.each(options.search, (value, key) => { - params = params.set(key, value.toString()); + params = params.set(key, _.toString(value)); }); } let timelineId = this.cacheService.getLocal('timelineID');