<!DOCTYPE html>
<html>
<head>
<base href="." />
<title>angular2 stocks dash</title>
<link rel="stylesheet" href="style.css" />
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
<!-- Optional theme -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous">
<script src="https://unpkg.com/core-js@2.4.1/client/shim.min.js"></script>
<script src="https://unpkg.com/zone.js/dist/zone.js"></script>
<script src="https://unpkg.com/zone.js/dist/long-stack-trace-zone.js"></script>
<script src="https://unpkg.com/reflect-metadata@0.1.3/Reflect.js"></script>
<script src="https://unpkg.com/systemjs@0.19.31/dist/system.js"></script>
<script src="config.js"></script>
<script>
System.import('app')
.catch(console.error.bind(console));
</script>
</head>
<body>
<div class="container">
<div class="row">
<app-root>Loading...</app-root>
</div>
</div>
</body>
</html>
/* Styles go here */
### Angular Starter Plunker - Typescript
System.config({
//use typescript for compilation
transpiler: 'typescript',
//typescript compiler options
typescriptOptions: {
emitDecoratorMetadata: true
},
paths: {
'npm:': 'https://unpkg.com/'
},
//map tells the System loader where to look for things
map: {
'app': './src',
'@angular/core': 'npm:@angular/core@2.3.1/bundles/core.umd.js',
'@angular/common': 'npm:@angular/common@2.3.1/bundles/common.umd.js',
'@angular/compiler': 'npm:@angular/compiler@2.3.1/bundles/compiler.umd.js',
'@angular/platform-browser': 'npm:@angular/platform-browser@2.3.1/bundles/platform-browser.umd.js',
'@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic@2.3.1/bundles/platform-browser-dynamic.umd.js',
'@angular/http': 'npm:@angular/http@2.3.1/bundles/http.umd.js',
'@angular/router': 'npm:@angular/router@2.3.1/bundles/router.umd.js',
'@angular/forms': 'npm:@angular/forms@2.3.1/bundles/forms.umd.js',
'@angular/core/testing': 'npm:@angular/core/bundles/core-testing.umd.js',
'@angular/common/testing': 'npm:@angular/common/bundles/common-testing.umd.js',
'@angular/compiler/testing': 'npm:@angular/compiler/bundles/compiler-testing.umd.js',
'@angular/platform-browser/testing': 'npm:@angular/platform-browser/bundles/platform-browser-testing.umd.js',
'@angular/platform-browser-dynamic/testing': 'npm:@angular/platform-browser-dynamic/bundles/platform-browser-dynamic-testing.umd.js',
'@angular/http/testing': 'npm:@angular/http/bundles/http-testing.umd.js',
'@angular/router/testing': 'npm:@angular/router/bundles/router-testing.umd.js',
'rxjs': 'npm:rxjs',
'typescript': 'npm:typescript@2.0.2/lib/typescript.js'
},
//packages defines our app package
packages: {
app: {
main: './main.ts',
defaultExtension: 'ts'
},
rxjs: {
defaultExtension: 'js'
}
}
});
//main entry point
import {platformBrowserDynamic} from '@angular/platform-browser-dynamic';
import {AppModule} from './app';
platformBrowserDynamic().bootstrapModule(AppModule)
import { Component, trigger, state, style, animate, transition } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http';
import { StockService } from './stockservice';
@Component({
selector: 'app-root',
templateUrl: './src/app.component.html',
styleUrls: ['./src/app.component.css'],
animations: [
trigger('trending', [
state('DOWN', style({
'background-color': 'red'
})),
state('UP', style({
'background-color': 'green'
})),
transition('UP => DOWN', [
style({transform: 'translateX(-100%)'}),
animate(3000)
]),
transition('DOWN => UP', [
style({transform: 'translateY(-100%)'}),
animate(200)
])
])
],
providers: [StockService]
})
export class AppComponent {
title = 'Stock Dashboard';
stockPrices = [];
stockService: StockService;
constructor(stockService: StockService) {
this.stockService = stockService;
}
getStockPrices() {
this.stockService.getStockPrices().then(prices => {
console.log('just got prices: ', prices);
this.stockPrices = prices;
});
}
ngOnInit() {
// check for updated prices
setInterval(() => {this.getStockPrices(); }, 1000);
}
}
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
FormsModule,
HttpModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
<!-- src/app/app.component.html -->
<h1>
{{title}}
</h1>
<!--top-Header-menu-->
<ul class="nav nav-pills">
<li role="presentation" class="active"><a href="#">Stock Summary</a></li>
<li role="presentation"><a href="#">Add New</a></li>
<li role="presentation"><a href="https://github.com/tranc99/stockportfolio" target="_blank">About StockDashboard</a></li>
</ul>
<hr>
<h2>Welcome, here are the latest updates on your stock picks.</h2>
<br>
<div class="row-fluid">
<div class="widget-box">
<div class="widget-content nopadding">
<table class="table table-bordered data-table">
<thead>
<tr>
<th>Stock Symbol</th>
<th>Price</th>
<th>Bought At</th>
<th>Quantity</th>
<th>Total Value</th>
<th>Current Trend</th>
</tr>
</thead>
<tbody>
<tr class="gradeX" *ngFor="let stock of stockPrices" [@trending]="stock.trend">
<td>{{stock.symbol}}</td>
<td>USD {{stock.price}}</td>
<td>{{stock.bought_price}}</td>
<td class="center">{{stock.quantity}}</td>
<td>{{stock.price * stock.quantity}}</td>
<td>{{stock.trend}}</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
/* src/app.component.css */
.movable {
background: coral;
height: 200px;
width: 200px;
text-align: center;
font-size: 20px;
color: white;
font-weight: bold;
margin-bottom: 10px;
position: relative;
}
tr {
color: white;
background: fuchsia;
}
th {
color: white;
}
import { Injectable } from '@angular/core';
@Injectable()
export class StockService {
static stocks: any;
getStockPrices = () => {
//setInterval(() => {this.computePrices(); }, 1000);
StockService.computePrices(StockService.stocks);
return Promise.resolve(StockService.stocks);
}
static incrementPrice = (stock, index) => {
var price = stock.price;
price += 5;
if (price > 120) {
price = 120;
}
StockService.stocks[index].compute = StockService.uptrend;
StockService.stocks[index].trend = 'UP';
StockService.stocks[index].price = price;
}
static decreasePrice = (stock, index) => {
var price = stock.price;
price -= 5;
if (price < 0) {
price = 0;
}
StockService.stocks[index].compute = StockService.downtrend;
StockService.stocks[index].trend = 'DOWN';
StockService.stocks[index].price = price;
}
static computePrices = (input) => {
console.log('computing new prices');
input.forEach(function(stock, index) {
if (stock.price >= 120) {
StockService.decreasePrice(stock, index);
}
if (stock.price <= 0) {
StockService.incrementPrice(stock, index)
}
input[index].price = stock.compute.call(null, stock);
});
return input;
}
static uptrend = (stock) => {
return stock.price + 5;
}
static downtrend = function(stock) {
return stock.price - 5;
}
constructor() {
StockService.stocks = [
{ symbol: "GOOG", price: 120, compute: StockService.uptrend, bought_price: 50, quantity: 0, total_value: 21000, trend: 'UP' },
{ symbol: "YHOO", price: 100, compute: StockService.uptrend, bought_price: 100, quantity: 0, total_value: 21000, trend: 'UP' },
{ symbol: "MSFT", price: 20, compute: StockService.uptrend, bought_price: 120, quantity: 0, total_value: 21000, trend: 'UP' },
{ symbol: "AAPL", price: 200, compute: StockService.uptrend, bought_price: 85, quantity: 20, total_value: 21000, trend: 'UP' },
];
console.log("Stocks from the stock service ", StockService.stocks.toString());
}
}