It's time to show when a review was created using the createdOn
property. Follow the task below to add this in.javascript
On review save, we're running the addReview
function in our app.js
JavaScript file. Before the review is pushed onto the array, add a new key to the review namedcreatedOn
and value Date.now()
.css
app.controller("ReviewController", function(){ this.review = {}; this.addReview = function(product){ this.review.createdOn = Date.now(); product.reviews.push(this.review); this.review = {}; }; });
In the review template, we're already displaying most of the information about our review. Add the createdOn
date to the review within thecite
element. We want it to say "-<Author> on <date>".html
<cite class="clearfix">—{{review.author +" on "+ review.createdOn}}</cite>
Use the date filter on the createdOn
property in the template.java
<cite class="clearfix" >—{{review.author}}+' on '+{{review.createdOn | date:'MM/dd/yyyy @ h:mma'}}</cite>
https://docs.angularjs.org/api/ng/filter/dateangularjs
<!DOCTYPE html> <html ng-app="gemStore"> <head> <link rel="stylesheet" type="text/css" href="bootstrap.min.css" /> <script type="text/javascript" src="angular.min.js"></script> <script type="text/javascript" src="app.js"></script> </head> <body ng-controller="StoreController as store"> <!-- Store Header --> <header> <h1 class="text-center">Flatlander Crafted Gems</h1> <h2 class="text-center">– an Angular store –</h2> </header> <!-- Products Container --> <div class="list-group"> <!-- Product Container --> <div class="list-group-item" ng-repeat="product in store.products"> <h3>{{product.name}} <em class="pull-right">{{product.price | currency}}</em></h3> <!-- Image Gallery --> <div ng-controller="GalleryController as gallery" ng-show="product.images.length"> <div class="img-wrap"> <img ng-src="{{product.images[gallery.current]}}" /> </div> <ul class="img-thumbnails clearfix"> <li class="small-image pull-left thumbnail" ng-repeat="image in product.images"> <img ng-src="{{image}}" /> </li> </ul> </div> <!-- Product Tabs --> <section ng-controller="TabController as tab"> <ul class="nav nav-pills"> <li ng-class="{ active:tab.isSet(1) }"> <a href ng-click="tab.setTab(1)">Description</a> </li> <li ng-class="{ active:tab.isSet(2) }"> <a href ng-click="tab.setTab(2)">Specs</a> </li> <li ng-class="{ active:tab.isSet(3) }"> <a href ng-click="tab.setTab(3)">Reviews</a> </li> </ul> <!-- Description Tab's Content --> <div ng-show="tab.isSet(1)"> <h4>Description</h4> <blockquote>{{product.description}}</blockquote> </div> <!-- Spec Tab's Content --> <div ng-show="tab.isSet(2)"> <h4>Specs</h4> <blockquote>Shine: {{product.shine}}</blockquote> </div> <!-- Review Tab's Content --> <div ng-show="tab.isSet(3)"> <!-- Product Reviews List --> <ul> <h4>Reviews</h4> <li ng-repeat="review in product.reviews"> <blockquote> <strong>{{review.stars}} Stars</strong> {{review.body}} <cite class="clearfix" >—{{review.author}}+' on '+{{review.createdOn | date:'MM/dd/yyyy @ h:mma'}}</cite> </blockquote> </li> </ul> <!-- Review Form --> <form name="reviewForm" ng-controller="ReviewController as reviewCtrl" ng-submit="reviewCtrl.addReview(product)"> <!-- Live Preview --> <blockquote > <strong>{{reviewCtrl.review.stars}} Stars</strong> {{reviewCtrl.review.body}} <cite class="clearfix">—{{reviewCtrl.review.author}}</cite> </blockquote> <!-- Review Form --> <h4>Submit a Review</h4> <fieldset class="form-group"> <select ng-model="reviewCtrl.review.stars" class="form-control" ng-options="stars for stars in [5,4,3,2,1]" title="Stars"> <option value>Rate the Product</option> </select> </fieldset> <fieldset class="form-group"> <textarea ng-model="reviewCtrl.review.body" class="form-control" placeholder="Write a short review of the product..." title="Review"></textarea> </fieldset> <fieldset class="form-group"> <input ng-model="reviewCtrl.review.author" type="email" class="form-control" placeholder="jimmyDean@example.org" title="Email" /> </fieldset> <fieldset class="form-group"> <input type="submit" class="btn btn-primary pull-right" value="Submit Review" /> </fieldset> </form> </div> </section> </div> </div> </body> </html>
(function() { var app = angular.module('gemStore', []); app.controller('StoreController', function() { this.products = gems; }); app.controller("TabController", function() { this.tab = 1; this.isSet = function(checkTab) { return this.tab === checkTab; }; this.setTab = function(setTab) { this.tab = setTab; }; }); app.controller('GalleryController', function(){ this.current = 0; this.setCurrent = function(imageNumber){ this.current = imageNumber || 0; }; }); app.controller("ReviewController", function(){ this.review = {}; this.addReview = function(product){ this.review.createdOn = Date.now(); product.reviews.push(this.review); this.review = {}; }; }); var gems = [{ name: 'Azurite', description: "Some gems have hidden qualities beyond their luster, beyond their shine... Azurite is one of those gems.", shine: 8, price: 110.50, rarity: 7, color: '#CCC', faces: 14, images: [ "images/gem-02.gif", "images/gem-05.gif", "images/gem-09.gif" ], reviews: [{ stars: 5, body: "I love this gem!", author: "joe@example.org", createdOn: 1397490980837 }, { stars: 1, body: "This gem sucks.", author: "tim@example.org", createdOn: 1397490980837 }] }, { name: 'Bloodstone', description: "Origin of the Bloodstone is unknown, hence its low value. It has a very high shine and 12 sides, however.", shine: 9, price: 22.90, rarity: 6, color: '#EEE', faces: 12, images: [ "images/gem-01.gif", "images/gem-03.gif", "images/gem-04.gif", ], reviews: [{ stars: 3, body: "I think this gem was just OK, could honestly use more shine, IMO.", author: "JimmyDean@example.org", createdOn: 1397490980837 }, { stars: 4, body: "Any gem with 12 faces is for me!", author: "gemsRock@example.org", createdOn: 1397490980837 }] }, { name: 'Zircon', description: "Zircon is our most coveted and sought after gem. You will pay much to be the proud owner of this gorgeous and high shine gem.", shine: 70, price: 1100, rarity: 2, color: '#000', faces: 6, images: [ "images/gem-06.gif", "images/gem-07.gif", "images/gem-08.gif" ], reviews: [{ stars: 1, body: "This gem is WAY too expensive for its rarity value.", author: "turtleguyy@example.org", createdOn: 1397490980837 }, { stars: 1, body: "BBW: High Shine != High Quality.", author: "LouisW407@example.org", createdOn: 1397490980837 }, { stars: 1, body: "Don't waste your rubles!", author: "nat@example.org", createdOn: 1397490980837 }] }]; })();