public/javascripts/app/models/SnapshotModel.js (90 lines of code) (raw):
import angular from 'angular';
import moment from 'moment';
import flatten from 'flatten';
import lodash_get from 'lodash.get';
import BaseModel from './BaseModel';
var SnapshotModelMod = angular.module('SnapshotModelMod', []);
const getListItemContent = (item, htmlFromElements) => {
const title = item.title ? `<h2>${item.title}</h2>` : "";
const bio = item.bio ? `${item.bio}` : "";
const endNote = item.endNote ? `<p><em>${item.endNote}</em></p>` : "";
const byline = item.byline ? `<p>${item.byline}</p>` : "";
return `${title} ${byline} ${bio} ${htmlFromElements(item.content)} ${endNote}`
}
const getTimelineEventContent = (event, htmlFromElements) => {
const title = event.title ? `<h2>${event.title}</h2>` : "";
const date = event.date ? `<p>${event.date}</p>` : "";
return `${title} ${date} ${htmlFromElements(event.body)}`
}
SnapshotModelMod.factory('SnapshotModel', [
function(){
class SnapshotModel extends BaseModel{
constructor(systemId, timestamp, snapshotData){
super();
this.data = {
systemId: systemId,
timestamp: timestamp,
createdDate: moment(timestamp),
activeState: false,
snapshot: snapshotData
};
}
getCreatedDate(){
return this.get('createdDate').format('HH:mm:ss D MMMM YYYY');
}
getHeadline() {
return this.get("snapshot.preview.fields.headline");
}
getStandfirst() {
return this.get("snapshot.preview.fields.standfirst");
}
getTrailText() {
return this.get("snapshot.preview.fields.trailText");
}
getHTMLContent(){
var content = this.get('snapshot.preview').blocks.map((block) => block.elements);
content = flatten(content);
function htmlFromElements(elements) {
return elements.map((element) => {
if (element.fields.text) {
return element.fields.text;
}
if (element.fields.html) {
return element.fields.html;
}
if (element.fields.items) {
// This element is a List element (Key takeaways, Q&A Explainer, Mini profiles)
return element.fields.items.map((item) => {
return getListItemContent(item, htmlFromElements)
}).join('');
}
if (element.fields.sections) {
// This element is a Timeline element
return element.fields.sections.map((section) => {
return `${section.title} ${section.events.map(event => getTimelineEventContent(event, htmlFromElements)).join('')}`
}).join('');
}
}).join('');
}
return htmlFromElements(content);
}
get(key){
return lodash_get(this.data, key);
}
//https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#toJSON_behavior
toJSON(){
var clone = angular.extend({}, this.data);
//clear decorated data
delete clone.timestamp;
delete clone.createdDate;
delete clone.activeState;
delete clone.snapshot;
delete clone.systemId;
return clone;
}
getJSON(){
return JSON.stringify(this.get('snapshot'), null, 2);
}
}
return {
getModel: (systemId, timestamp, data) => new SnapshotModel(systemId, timestamp, data)
};
}
]);
export default SnapshotModelMod;