<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="style.css" />
</head>
<body>
<div ng-app="myApp">
<div ng-controller="attorneyCtrl as vm">
<p>Name: {{vm.currentAttorney.name}}</p>
<p>Practice Area</p>
<ul>
<li ng-repeat="area in vm.currentAttorney.areas">{{area}}</li>
</ul>
<p>What client says about this attorney:</p>
<p ><i>"{{vm.activeQuote.quote}}"</i> - {{vm.activeQuote.person}}</p>
</div>
</div>
<script data-require="angular.js@*" data-semver="1.4.0-beta.6" src="https://code.angularjs.org/1.4.0-beta.6/angular.js"></script>
<script src="script.js"></script>
</body>
</html>
(function() {
'use strict';
angular.module('myApp', []);
}());
(function() {
'use strict';
angular.module('myApp')
.value('pageSettings', {
attorneyId : 1
});
}());
(function() {
'use strict';
angular.module('myApp')
.factory('dataSvc', dataSvc);
dataSvc.$inject = ['$log', '$timeout'];
function dataSvc($log, $timeout) {
var data = {
"attorneys": [
{
"id":1,
"name":"Bob Smith",
"quotes":
[
{ "id": 1, "quote": "Wonderful guy!", "person": "Dovie" },
{ "id": 2, "quote": "If ye be wanting a haggis like no other, Bob be yer man!", "person": "Angus McLoed" },
{ "id": 3, "quote": "Wotta Hottie!", "person": "Bob's wife" }
],
"areas": ["altdispute", "litigation", "securities"]
}
]
};
var practiceareas = {
altdispute: "Alternative Dispute Resolution",
businesscorp: "Businesses & Corporations",
estateplanning: "Estate Planning",
futures: "Futures & Derivatives",
litigation: "Litigation",
productliability: "Product Liability",
realestate: "Real Estate",
securities: "Securities"
};
var service = {
getAttorneyById: getAttorneyById,
getPracticeAreas: getPracticeAreas
};
return service;
function getAttorneyById(id) {
return $timeout(function() {
var matches = data.attorneys.filter(function(a) {
return a.id === id;
});
if (matches.length === 1) {
var result = matches[0];
result.areas = result.areas.map(function(a) {
return practiceareas[a];
});
return result;
}
return null;
}, 250);
}
function getPracticeAreas() {
return $timeout(function() {
return practiceareas;
}, 250);
}
}
}());
(function(undefined) {
'use strict';
angular.module('myApp')
.controller('attorneyCtrl', attorneyCtrl);
attorneyCtrl.$inject = ['$q', '$log', '$timeout', 'dataSvc', 'pageSettings'];
function attorneyCtrl($q, $log, $timeout, dataSvc, pageSettings) {
/* jshint validthis: true */
var self = this;
self.currentAttorney = undefined;
self.activeQuote = undefined;
self.practiceAreas = [];
var activeQuoteIdx = 0;
activate();
function activate() {
dataSvc
.getPracticeAreas()
.then(bindPracticeAreas)
.then(getAttorneyDetails)
.then(bindAttorney)
.then(startFlippingQuotes);
}
function getAttorneyDetails() {
return dataSvc
.getAttorneyById(pageSettings.attorneyId);
}
function bindPracticeAreas(areas) {
self.practiceAreas = areas;
}
function bindAttorney(attorney) {
var dfd = $q.defer();
self.currentAttorney = attorney;
dfd.resolve(true);
return dfd.promise;
}
function startFlippingQuotes() {
if (!self.currentAttorney) return;
self.activeQuote = self.currentAttorney.quotes[activeQuoteIdx];
activeQuoteIdx = (activeQuoteIdx + 1) % self.currentAttorney.quotes.length;
$timeout(startFlippingQuotes, 5000);
}
}
}());
/* Styles go here */