diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 5427b30b..8fbfa33c 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -14,6 +14,7 @@ import { HttpClientModule, HttpClient } from '@angular/common/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'; import { WindowRef } from '../shared/window'; @@ -63,7 +64,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'; @@ -77,7 +78,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 { TermsConditionsPage } from '../pages/registration/terms-conditions/terms-conditions.page'; import { TestPage } from '../pages/tabs/test.page'; import { TutorialPage } from '../pages/settings/tutorial/tutorial.page'; @@ -147,6 +148,7 @@ export function createTranslateLoader(http: HttpClient) { EscapeHtmlPipe, ], imports: [ + AppConfigModule, BrowserModule, CacheModule, FormsModule, 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/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.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 c0339b8b..dd6f6c46 100644 --- a/src/pages/tabs/tabs.page.ts +++ b/src/pages/tabs/tabs.page.ts @@ -2,11 +2,8 @@ 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'; @Component({ @@ -16,13 +13,20 @@ 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; + + // We need hardcode at least one tab menu, + // otherwise any misconfigure will break dashboard: any = ActivitiesListPage; - settings: any = SettingsPage; - events: any = EventsListPage; + tabs: any = []; constructor( + public appConfig: AppConfigService, public translationService: TranslationService ) {} + + ionViewWillEnter() { + 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/services/event.service.ts b/src/services/event.service.ts index cef12242..37f55626 100755 --- a/src/services/event.service.ts +++ b/src/services/event.service.ts @@ -10,32 +10,46 @@ import * as moment from 'moment'; @Injectable() export class EventService { bookEventUrl = 'api/book_events.json'; + targetUrl = 'api/events.json'; constructor( public cache: CacheService, public request: RequestService ) {} - getEvents(options: object = {}) { - return this.request.get('api/events.json', { - search: _.merge({ type: 'session' }, options) - }) - .map(this._normalise) - .toPromise(); - } - + /** + * @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; } /** - * download attachment by single event object + * @description Get events data + * @param {object} options + */ + getEvents(options: object = {}) { + return this.request.get(this.targetUrl, { + search: _.merge({ type: 'session' }, options) + }) + .map(this._normalise) + .toPromise(); + } + + /** + * @description download attachment by single event object * @param {[type]} event [description] */ @@ -47,14 +61,29 @@ export class EventService { } /** - * get event using observable + * @description get event using observable * @param {integer} eventId single event id */ + bookEvent(eventId) { return this.request.post(this.bookEventUrl, { event_id: eventId}); } - 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}]`); + } } 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..35f07bd5 --- /dev/null +++ b/src/shared/app-config/app-config.service.ts @@ -0,0 +1,75 @@ +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'; + +@Injectable() +export class AppConfigService { + // Mapping page to name, + // use for changing page in tab menu + pagesMap: any = { + events: EventsListPage, + rankings: RankingsPage, + settings: SettingsPage, + gallery: GalleryPage, + team: TeamPage + } + + // JSON format sent back from server + appConfigContent: any = { + app: { + name: 'ISDK' + }, + tabs: { + events: { + name: 'events', + title: 'Events', + icon: 'md-calendar', + order: 1 + }, + rankings: { + name: 'rankings', + title: 'Rankings', + icon: 'md-medal', + order: 2 + }, + settings: { + name: 'settings', + title: 'Settings', + icon: 'md-person', + order: 3 + } + } + }; + + /** + * @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]); + }).then((data: any) => { + return _.map(data, (o) => { + o.root = this.pagesMap[o.name]; + return o; + }); + }); + } +} 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'); diff --git a/src/shared/testModules/pages/test/test-start.page.ts b/src/shared/testModules/pages/test/test-start.page.ts index 26957cb4..1b8c511b 100755 --- a/src/shared/testModules/pages/test/test-start.page.ts +++ b/src/shared/testModules/pages/test/test-start.page.ts @@ -6,20 +6,15 @@ import { AssessmentsGroupPage } from '../../../../pages/assessments/group/assess import { ActivitiesListPage } from '../../../../pages/activities/list/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 { RegisterPage } from '../../../../pages/registration/register.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,