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
168 lines (138 loc) • 4.64 kB
text/typescript
import { Injectable } from '@angular/core';
import { Http } from '@angular/http';
import { UserData } from './user-data';
()
export class ConferenceData {
data: any;
constructor(public http: Http, public user: UserData) {}
load() {
if (this.data) {
// already loaded data
return Promise.resolve(this.data);
}
// don't have the data yet
return new Promise(resolve => {
// We're using Angular Http provider to request the data,
// then on the response it'll map the JSON data to a parsed JS object.
// Next we process the data and resolve the promise with the new data.
this.http.get('assets/data/data.json').subscribe(res => {
// we've got back the raw data, now generate the core schedule data
// and save the data for later reference
this.data = this.processData(res.json());
resolve(this.data);
});
});
}
processData(data) {
// just some good 'ol JS fun with objects and arrays
// build up the data by linking speakers to sessions
data.tracks = [];
// loop through each day in the schedule
data.schedule.forEach(day => {
// loop through each timeline group in the day
day.groups.forEach(group => {
// loop through each session in the timeline group
group.sessions.forEach(session => {
this.processSession(data, session);
});
});
});
return data;
}
processSession(data, session) {
// loop through each speaker and load the speaker data
// using the speaker name as the key
session.speakers = [];
if (session.speakerNames) {
session.speakerNames.forEach(speakerName => {
let speaker = data.speakers.find(s => s.name === speakerName);
if (speaker) {
session.speakers.push(speaker);
speaker.sessions = speaker.sessions || [];
speaker.sessions.push(session);
}
});
}
if (session.tracks) {
session.tracks.forEach(track => {
if (data.tracks.indexOf(track) < 0) {
data.tracks.push(track);
}
});
}
}
getTimeline(dayIndex, queryText = '', excludeTracks = [], segment = 'all') {
return this.load().then(data => {
let day = data.schedule[dayIndex];
day.shownSessions = 0;
queryText = queryText.toLowerCase().replace(/,|\.|-/g, ' ');
let queryWords = queryText.split(' ').filter(w => !!w.trim().length);
day.groups.forEach(group => {
group.hide = true;
group.sessions.forEach(session => {
// check if this session should show or not
this.filterSession(session, queryWords, excludeTracks, segment);
if (!session.hide) {
// if this session is not hidden then this group should show
group.hide = false;
day.shownSessions++;
}
});
});
return day;
});
}
filterSession(session, queryWords, excludeTracks, segment) {
let matchesQueryText = false;
if (queryWords.length) {
// of any query word is in the session name than it passes the query test
queryWords.forEach(queryWord => {
if (session.name.toLowerCase().indexOf(queryWord) > -1) {
matchesQueryText = true;
}
});
} else {
// if there are no query words then this session passes the query test
matchesQueryText = true;
}
// if any of the sessions tracks are not in the
// exclude tracks then this session passes the track test
let matchesTracks = false;
session.tracks.forEach(trackName => {
if (excludeTracks.indexOf(trackName) === -1) {
matchesTracks = true;
}
});
// if the segement is 'favorites', but session is not a user favorite
// then this session does not pass the segment test
let matchesSegment = false;
if (segment === 'favorites') {
if (this.user.hasFavorite(session.name)) {
matchesSegment = true;
}
} else {
matchesSegment = true;
}
// all tests must be true if it should not be hidden
session.hide = !(matchesQueryText && matchesTracks && matchesSegment);
}
getSpeakers() {
return this.load().then(data => {
return data.speakers.sort((a, b) => {
let aName = a.name.split(' ').pop();
let bName = b.name.split(' ').pop();
return aName.localeCompare(bName);
});
});
}
getTracks() {
return this.load().then(data => {
return data.tracks.sort();
});
}
getMap() {
return this.load().then(data => {
return data.map;
});
}
}