awaken-direct-democracy
Version:
This is the functional skeleton / working mock up of a disruptive app to increase voter turnout and participation driven at the start by just one person - Tom Atkinson in New Zealand - after watching in horror the signing of the TPPA in Auckland February
148 lines (124 loc) • 4.25 kB
text/typescript
import { Component, ViewChild } from '@angular/core';
import { AlertController, App, ItemSliding, List, ModalController, NavController } from 'ionic-angular';
/*
To learn how to use third party libs in an
Awaken Direct Democracy check out our docs here: http://ionicframework.com/docs/v2/resources/third-party-libs/
*/
import moment from 'moment';
import { ConferenceData } from '../../providers/conference-data';
import { ScheduleFilterPage } from '../schedule-filter/schedule-filter';
import { SessionDetailPage } from '../session-detail/session-detail';
import { UserData } from '../../providers/user-data';
export class SchedulePage {
// the list is a child of the schedule page
// @ViewChild('scheduleList') gets a reference to the list
// with the variable #scheduleList, `read: List` tells it to return
// the List and not a reference to the element
scheduleList: List;
dayIndex = 0;
queryText = '';
segment = 'all';
excludeTracks = [];
shownSessions: any = [];
groups = [];
confDate: string;
constructor(
public alertCtrl: AlertController,
public app: App,
public modalCtrl: ModalController,
public navCtrl: NavController,
public confData: ConferenceData,
public user: UserData
) {
}
ionViewDidEnter() {
this.app.setTitle('Schedule');
}
ngAfterViewInit() {
this.updateSchedule();
}
updateSchedule() {
// Close any open sliding items when the schedule updates
this.scheduleList && this.scheduleList.closeSlidingItems();
this.confData.getTimeline(this.dayIndex, this.queryText, this.excludeTracks, this.segment).then(data => {
let timestamp = data.date;
/*
To learn how to use third party libs in an
Awaken Direct Democracy check out our docs here: http://ionicframework.com/docs/v2/resources/third-party-libs/
*/
this.confDate = moment(timestamp).format('MM/DD/YYYY');
this.shownSessions = data.shownSessions;
this.groups = data.groups;
});
}
presentFilter() {
let modal = this.modalCtrl.create(ScheduleFilterPage, this.excludeTracks);
modal.present();
modal.onDidDismiss((data: any[]) => {
if (data) {
this.excludeTracks = data;
this.updateSchedule();
}
});
}
goToSessionDetail(sessionData) {
// go to the session detail page
// and pass in the session data
this.navCtrl.push(SessionDetailPage, sessionData);
}
addFavorite(slidingItem: ItemSliding, sessionData) {
if (this.user.hasFavorite(sessionData.name)) {
// woops, they already favorited it! What shall we do!?
// prompt them to remove it
this.removeFavorite(slidingItem, sessionData, 'Favorite already added');
} else {
// remember this session as a user favorite
this.user.addFavorite(sessionData.name);
// create an alert instance
let alert = this.alertCtrl.create({
title: 'Favorite Added',
buttons: [{
text: 'OK',
handler: () => {
// close the sliding item
slidingItem.close();
}
}]
});
// now present the alert on top of all other content
alert.present();
}
}
removeFavorite(slidingItem: ItemSliding, sessionData, title) {
let alert = this.alertCtrl.create({
title: title,
message: 'Would you like to remove this session from your favorites?',
buttons: [
{
text: 'Cancel',
handler: () => {
// they clicked the cancel button, do not remove the session
// close the sliding item and hide the option buttons
slidingItem.close();
}
},
{
text: 'Remove',
handler: () => {
// they want to remove this session from their favorites
this.user.removeFavorite(sessionData.name);
this.updateSchedule();
// close the sliding item and hide the option buttons
slidingItem.close();
}
}
]
});
// now present the alert on top of all other content
alert.present();
}
}