diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/.editorconfig b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/.editorconfig
new file mode 100755
index 00000000..8369a3b7
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/.editorconfig
@@ -0,0 +1,19 @@
+# http://editorconfig.org
+root = true
+
+[*]
+charset = utf-8
+indent_style = space
+indent_size = 2
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+
+[*.md]
+max_line_length = 0
+trim_trailing_whitespace = false
+
+# Indentation override
+#[lib/**.js]
+#[{package.json,.travis.yml}]
+#[**/**.js]
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/bs-config.json b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/bs-config.json
new file mode 100755
index 00000000..e13c073a
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/bs-config.json
@@ -0,0 +1,8 @@
+{
+ "server": {
+ "baseDir": "src",
+ "routes": {
+ "/node_modules": "node_modules"
+ }
+ }
+}
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/config/helpers.js b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/config/helpers.js
new file mode 100755
index 00000000..0b19f260
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/config/helpers.js
@@ -0,0 +1,7 @@
+var path = require('path');
+var _root = path.resolve(__dirname, '..');
+function root(args) {
+ args = Array.prototype.slice.call(arguments, 0);
+ return path.join.apply(path, [_root].concat(args));
+}
+exports.root = root;
\ No newline at end of file
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/config/karma-test-shim.js b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/config/karma-test-shim.js
new file mode 100755
index 00000000..30d52388
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/config/karma-test-shim.js
@@ -0,0 +1,15 @@
+Error.stackTraceLimit = Infinity;
+require('core-js/es6');
+require('core-js/es7/reflect');
+require('zone.js/dist/zone');
+require('zone.js/dist/long-stack-trace-zone');
+require('zone.js/dist/proxy');
+require('zone.js/dist/sync-test');
+require('zone.js/dist/jasmine-patch');
+require('zone.js/dist/async-test');
+require('zone.js/dist/fake-async-test');
+var appContext = require.context('../src', true, /\.spec\.ts/);
+appContext.keys().forEach(appContext);
+var testing = require('@angular/core/testing');
+var browser = require('@angular/platform-browser-dynamic/testing');
+testing.TestBed.initTestEnvironment(browser.BrowserDynamicTestingModule, browser.platformBrowserDynamicTesting());
\ No newline at end of file
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/config/karma.conf.js b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/config/karma.conf.js
new file mode 100755
index 00000000..61caaa59
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/config/karma.conf.js
@@ -0,0 +1,29 @@
+var webpackConfig = require('./webpack.test');
+
+module.exports = function (config) {
+ var _config = {
+ basePath: '',
+ frameworks: ['jasmine'],
+ files: [
+ {pattern: './config/karma-test-shim.js', watched: false}
+ ],
+ preprocessors: {
+ './config/karma-test-shim.js': ['webpack', 'sourcemap']
+ },
+ webpack: webpackConfig,
+ webpackMiddleware: {
+ stats: 'errors-only'
+ },
+ webpackServer: {
+ noInfo: true
+ },
+ reporters: ['progress'],
+ port: 9876,
+ colors: true,
+ logLevel: config.LOG_INFO,
+ autoWatch: false,
+ browsers: ['PhantomJS'],
+ singleRun: true
+ };
+ config.set(_config);
+};
\ No newline at end of file
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/config/webpack.common.js b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/config/webpack.common.js
new file mode 100755
index 00000000..4fd9a807
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/config/webpack.common.js
@@ -0,0 +1,59 @@
+var webpack = require('webpack');
+var HtmlWebpackPlugin = require('html-webpack-plugin');
+var ExtractTextPlugin = require('extract-text-webpack-plugin');
+var helpers = require('./helpers');
+
+module.exports = {
+ entry: {
+ 'polyfills': './src/polyfills.ts',
+ 'vendor': './src/vendor.ts',
+ 'app': './src/main.ts'
+ },
+ resolve: {
+ extensions: ['.ts', '.js', '.html', '.css']
+ },
+ module: {
+ rules: [
+ {
+ test: /\.ts$/,
+ loaders: [{
+ loader: 'awesome-typescript-loader',
+ options: { configFileName: helpers.root('src', 'tsconfig.json') }
+ } , 'angular2-template-loader']
+ },
+ {
+ test: /\.html$/,
+ loader: 'html-loader'
+ },
+ {
+ test: /\.(png|jpe?g|gif|svg|woff|woff2|ttf|eot|ico)$/,
+ loader: 'file-loader?name=assets/[name].[hash].[ext]'
+ },
+ {
+ test: /\.css$/,
+ exclude: helpers.root('src', 'app'),
+ loader: ExtractTextPlugin.extract({ fallbackLoader: 'style-loader', loader: 'css-loader?sourceMap' })
+ },
+ {
+ test: /\.css$/,
+ include: helpers.root('src', 'app'),
+ loader: 'raw-loader'
+ }
+ ]
+ },
+ plugins: [
+ // Workaround for angular/angular#11580
+ new webpack.ContextReplacementPlugin(
+ // The (\\|\/) piece accounts for path separators in *nix and Windows
+ /angular(\\|\/)core(\\|\/)(esm(\\|\/)src|src)(\\|\/)linker/,
+ helpers.root('./src'), // location of your src
+ {} // a map of your routes
+ ),
+ new webpack.optimize.CommonsChunkPlugin({
+ name: ['app', 'vendor', 'polyfills']
+ }),
+ new HtmlWebpackPlugin({
+ template: 'src/index.html'
+ })
+ ]
+};
\ No newline at end of file
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/config/webpack.dev.js b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/config/webpack.dev.js
new file mode 100755
index 00000000..7da0e9a5
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/config/webpack.dev.js
@@ -0,0 +1,24 @@
+var webpackMerge = require('webpack-merge');
+var ExtractTextPlugin = require('extract-text-webpack-plugin');
+var commonConfig = require('./webpack.common.js');
+var helpers = require('./helpers');
+
+module.exports = webpackMerge(commonConfig, {
+ devtool: 'cheap-module-eval-source-map',
+
+ output: {
+ path: helpers.root('dist'),
+ publicPath: 'http://localhost:8080/',
+ filename: '[name].js',
+ chunkFilename: '[id].chunk.js'
+ },
+
+ plugins: [
+ new ExtractTextPlugin('[name].css')
+ ],
+
+ devServer: {
+ historyApiFallback: true,
+ stats: 'minimal'
+ }
+});
\ No newline at end of file
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/config/webpack.prod.js b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/config/webpack.prod.js
new file mode 100755
index 00000000..e4f6a51a
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/config/webpack.prod.js
@@ -0,0 +1,38 @@
+var webpack = require('webpack');
+var webpackMerge = require('webpack-merge');
+var ExtractTextPlugin = require('extract-text-webpack-plugin');
+var commonConfig = require('./webpack.common.js');
+var helpers = require('./helpers');
+
+const ENV = process.env.NODE_ENV = process.env.ENV = 'production';
+
+module.exports = webpackMerge(commonConfig, {
+ devtool: 'source-map',
+
+ output: {
+ path: helpers.root('dist'),
+ publicPath: '/',
+ filename: '[name].[hash].js',
+ chunkFilename: '[id].[hash].chunk.js'
+ },
+
+ plugins: [
+ new webpack.NoEmitOnErrorsPlugin(),
+ new webpack.optimize.UglifyJsPlugin({ // https://github.com/angular/angular/issues/10618
+ mangle: {
+ keep_fnames: true
+ }
+ }),
+ new ExtractTextPlugin('[name].[hash].css'),
+ new webpack.DefinePlugin({
+ 'process.env': {
+ 'ENV': JSON.stringify(ENV)
+ }
+ }),
+ new webpack.LoaderOptionsPlugin({
+ htmlLoader: {
+ minimize: false // workaround for ng2
+ }
+ })
+ ]
+});
\ No newline at end of file
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/config/webpack.test.js b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/config/webpack.test.js
new file mode 100755
index 00000000..41742759
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/config/webpack.test.js
@@ -0,0 +1,44 @@
+var webpack = require('webpack');
+var helpers = require('./helpers');
+
+module.exports = {
+ devtool: 'inline-source-map',
+ resolve: {
+ extensions: ['.ts', '.js']
+ },
+ module: {
+ rules: [
+ {
+ test: /\.ts$/,
+ loaders: ['awesome-typescript-loader', 'angular2-template-loader']
+ },
+ {
+ test: /\.html$/,
+ loader: 'html-loader'
+ },
+ {
+ test: /\.(png|jpe?g|gif|svg|woff|woff2|ttf|eot|ico)$/,
+ loader: 'null-loader'
+ },
+ {
+ test: /\.css$/,
+ exclude: helpers.root('src', 'app'),
+ loader: 'null-loader'
+ },
+ {
+ test: /\.css$/,
+ include: helpers.root('src', 'app'),
+ loader: 'raw-loader'
+ }
+ ]
+ },
+
+ plugins: [
+ new webpack.ContextReplacementPlugin(
+ // The (\\|\/) piece accounts for path separators in *nix and Windows
+ /angular(\\|\/)core(\\|\/)(esm(\\|\/)src|src)(\\|\/)linker/,
+ helpers.root('./src'), // location of your src
+ {} // a map of your routes
+ )
+ ]
+}
\ No newline at end of file
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/karma.conf.js b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/karma.conf.js
new file mode 100755
index 00000000..fc51e550
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/karma.conf.js
@@ -0,0 +1 @@
+module.exports = require('./config/karma.conf.js');
\ No newline at end of file
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/package.json b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/package.json
new file mode 100755
index 00000000..b859b7ce
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/package.json
@@ -0,0 +1,57 @@
+{
+ "name": "angular-quickstart",
+ "version": "1.0.0",
+ "description": "QuickStart package.json from the documentation, supplemented with testing support",
+ "scripts": {
+ "start": "webpack-dev-server --inline --progress --port 8080",
+ "test": "karma start",
+ "build": "rimraf dist && webpack --config config/webpack.prod.js --progress --profile --bail"
+ },
+ "keywords": [
+ "angular2",
+ "webpack",
+ "typescript"
+ ],
+ "author": "",
+ "license": "MIT",
+ "dependencies": {
+ "@angular/common": "~2.4.0",
+ "@angular/compiler": "~2.4.0",
+ "@angular/core": "~2.4.0",
+ "@angular/forms": "~2.4.0",
+ "@angular/http": "~2.4.0",
+ "@angular/platform-browser": "~2.4.0",
+ "@angular/platform-browser-dynamic": "~2.4.0",
+ "@angular/router": "~3.4.0",
+ "core-js": "^2.4.1",
+ "rxjs": "5.0.1",
+ "zone.js": "^0.7.4"
+ },
+ "devDependencies": {
+ "@types/jasmine": "^2.5.35",
+ "@types/node": "^6.0.45",
+ "angular2-template-loader": "^0.6.0",
+ "awesome-typescript-loader": "^2.2.4",
+ "css-loader": "^0.26.1",
+ "extract-text-webpack-plugin": "2.0.0-beta.5",
+ "file-loader": "^0.9.0",
+ "html-loader": "^0.4.3",
+ "html-webpack-plugin": "^2.16.1",
+ "jasmine-core": "^2.4.1",
+ "karma": "^1.2.0",
+ "karma-jasmine": "^1.0.2",
+ "karma-phantomjs-launcher": "^1.0.2",
+ "karma-sourcemap-loader": "^0.3.7",
+ "karma-webpack": "^2.0.1",
+ "null-loader": "^0.1.1",
+ "phantomjs-prebuilt": "^2.1.7",
+ "raw-loader": "^0.5.1",
+ "rimraf": "^2.5.2",
+ "style-loader": "^0.13.1",
+ "typescript": "~2.0.10",
+ "webpack": "^2.2.0",
+ "webpack-dev-server": "2.2.0-rc.0",
+ "webpack-merge": "^2.4.0"
+ },
+ "repository": {}
+}
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/app-routing.module.ts b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/app-routing.module.ts
new file mode 100644
index 00000000..88516bac
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/app-routing.module.ts
@@ -0,0 +1,19 @@
+import { NgModule } from '@angular/core';
+import { RouterModule, Routes } from '@angular/router';
+import { DashboardComponent } from './dashboard.component';
+import { HeroesComponent } from './heroes.component';
+import { HeroDetailComponent } from './hero-detail.component';
+import { HeroEditingComponent } from './hero-editing.component';
+
+const routes: Routes = [
+ { path: '', redirectTo: '/dashboard', pathMatch: 'full' },
+ { path: 'dashboard', component: DashboardComponent },
+ { path: 'detail/:id', component: HeroDetailComponent },
+ { path: 'editing/:id',component: HeroEditingComponent },
+ { path: 'heroes', component: HeroesComponent }
+];
+@NgModule({
+ imports: [ RouterModule.forRoot(routes) ],
+ exports: [ RouterModule ]
+})
+export class AppRoutingModule {}
\ No newline at end of file
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/app.component.css b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/app.component.css
new file mode 100755
index 00000000..3e9de533
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/app.component.css
@@ -0,0 +1,75 @@
+.selected {
+ background-color: #CFD8DC !important;
+ color: white;
+}
+.heroes {
+ margin: 0 0 2em 0;
+ list-style-type: none;
+ padding: 0;
+ width: 15em;
+}
+.heroes li {
+ cursor: pointer;
+ position: relative;
+ left: 0;
+ background-color: #EEE;
+ margin: .5em;
+ padding: .3em 0;
+ height: 1.6em;
+ border-radius: 4px;
+}
+.heroes li.selected:hover {
+ background-color: #BBD8DC !important;
+ color: white;
+}
+.heroes li:hover {
+ color: #607D8B;
+ background-color: #DDD;
+ left: .1em;
+}
+.heroes .text {
+ position: relative;
+ top: -3px;
+}
+.heroes .badge {
+ display: inline-block;
+ font-size: small;
+ color: white;
+ padding: 0.8em 0.7em 0 0.7em;
+ background-color: #607D8B;
+ line-height: 1em;
+ position: relative;
+ left: -1px;
+ top: -4px;
+ height: 1.8em;
+ margin-right: .8em;
+ border-radius: 4px 0 0 4px;
+}
+h1 {
+ font-size: 1.2em;
+ color: #999;
+ margin-bottom: 0;
+}
+h2 {
+ font-size: 2em;
+ margin-top: 0;
+ padding-top: 0;
+}
+nav a {
+ padding: 5px 10px;
+ text-decoration: none;
+ margin-top: 10px;
+ display: inline-block;
+ background-color: #eee;
+ border-radius: 4px;
+}
+nav a:visited, a:link {
+ color: #607D8B;
+}
+nav a:hover {
+ color: #039be5;
+ background-color: #CFD8DC;
+}
+nav a.active {
+ color: #039be5;
+}
\ No newline at end of file
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/app.component.html b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/app.component.html
new file mode 100755
index 00000000..dc12d499
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/app.component.html
@@ -0,0 +1,21 @@
+
+ {{title}}
+ My Heroes
+
+ -
+ {{hero.id}} {{hero.name}}
+
+
+
+
+
{{selectedHero.name}} details!
+
{{selectedHero.id}}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/app.component.js b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/app.component.js
new file mode 100755
index 00000000..671d0a3b
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/app.component.js
@@ -0,0 +1,36 @@
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var __metadata = (this && this.__metadata) || function (k, v) {
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
+};
+var core_1 = require('@angular/core');
+var Hero = (function () {
+ function Hero() {
+ }
+ return Hero;
+}());
+exports.Hero = Hero;
+var AppComponent = (function () {
+ function AppComponent() {
+ this.title = 'Tour of Heroes';
+ this.hero = {
+ id: 1,
+ name: 'Windstorm'
+ };
+ }
+ AppComponent = __decorate([
+ core_1.Component({
+ selector: 'my-app',
+ template: "\n
{{title}}
\n {{hero.name}} details!
\n {{hero.id}}
\n \n \n \n
\n "
+ }),
+ __metadata('design:paramtypes', [])
+ ], AppComponent);
+ return AppComponent;
+}());
+exports.AppComponent = AppComponent;
+//# sourceMappingURL=app.component.js.map
\ No newline at end of file
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/app.component.js.map b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/app.component.js.map
new file mode 100755
index 00000000..9b786aa3
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/app.component.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"app.component.js","sourceRoot":"","sources":["app.component.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,qBAA0B,eAAe,CAAC,CAAA;AAC1C;IAAA;IAGA,CAAC;IAAD,WAAC;AAAD,CAAC,AAHD,IAGC;AAHY,YAAI,OAGhB,CAAA;AAcD;IAAA;QACI,UAAK,GAAG,gBAAgB,CAAC;QACzB,SAAI,GAAS;YACT,EAAE,EAAE,CAAC;YACL,IAAI,EAAE,WAAW;SACpB,CAAC;IACN,CAAC;IAnBD;QAAC,gBAAS,CAAC;YACT,QAAQ,EAAE,QAAQ;YAClB,QAAQ,EAAC,oNAQR;SAEF,CAAC;;oBAAA;IAOF,mBAAC;AAAD,CAAC,AAND,IAMC;AANY,oBAAY,eAMxB,CAAA"}
\ No newline at end of file
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/app.component.spec.ts b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/app.component.spec.ts
new file mode 100755
index 00000000..87beafad
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/app.component.spec.ts
@@ -0,0 +1,11 @@
+import { TestBed } from '@angular/core/testing';
+import { AppComponent } from './app.component';
+describe('App', () => {
+ beforeEach(() => {
+ TestBed.configureTestingModule({ declarations: [AppComponent]});
+ });
+ it ('should work', () => {
+ let fixture = TestBed.createComponent(AppComponent);
+ expect(fixture.componentInstance instanceof AppComponent).toBe(true, 'should create AppComponent');
+ });
+});
\ No newline at end of file
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/app.component.ts b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/app.component.ts
new file mode 100644
index 00000000..be140e41
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/app.component.ts
@@ -0,0 +1,16 @@
+import { Component } from '@angular/core';
+@Component({
+ selector: 'my-app',
+ template: `
+ {{title}}
+
+
+ `,
+ styleUrls: ['./app.component.css'],
+})
+export class AppComponent {
+ title = 'Tour of Heroes';
+}
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/app.module.js b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/app.module.js
new file mode 100755
index 00000000..5091eb05
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/app.module.js
@@ -0,0 +1,34 @@
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var __metadata = (this && this.__metadata) || function (k, v) {
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
+};
+var core_1 = require('@angular/core');
+var platform_browser_1 = require('@angular/platform-browser');
+var forms_1 = require('@angular/forms');
+var app_component_1 = require('./app.component');
+var AppModule = (function () {
+ function AppModule() {
+ }
+ AppModule = __decorate([
+ core_1.NgModule({
+ imports: [
+ platform_browser_1.BrowserModule,
+ forms_1.FormsModule
+ ],
+ declarations: [
+ app_component_1.AppComponent
+ ],
+ bootstrap: [app_component_1.AppComponent]
+ }),
+ __metadata('design:paramtypes', [])
+ ], AppModule);
+ return AppModule;
+}());
+exports.AppModule = AppModule;
+//# sourceMappingURL=app.module.js.map
\ No newline at end of file
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/app.module.js.map b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/app.module.js.map
new file mode 100755
index 00000000..8a720fb5
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/app.module.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"app.module.js","sourceRoot":"","sources":["app.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,qBAA8B,eAAe,CAAC,CAAA;AAC9C,iCAA8B,2BAA2B,CAAC,CAAA;AAC1D,sBAA8B,gBAAgB,CAAC,CAAA;AAC/C,8BAA8B,iBAAiB,CAAC,CAAA;AAWhD;IAAA;IAAyB,CAAC;IAV1B;QAAC,eAAQ,CAAC;YACR,OAAO,EAAE;gBACP,gCAAa;gBACb,mBAAW;aACZ;YACD,YAAY,EAAE;gBACZ,4BAAY;aACb;YACD,SAAS,EAAE,CAAE,4BAAY,CAAE;SAC5B,CAAC;;iBAAA;IACuB,gBAAC;AAAD,CAAC,AAA1B,IAA0B;AAAb,iBAAS,YAAI,CAAA"}
\ No newline at end of file
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/app.module.ts b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/app.module.ts
new file mode 100755
index 00000000..a26157c1
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/app.module.ts
@@ -0,0 +1,38 @@
+import { NgModule } from '@angular/core';
+import { BrowserModule } from '@angular/platform-browser';
+import { FormsModule } from '@angular/forms';
+import { HttpModule } from '@angular/http';
+import { AppRoutingModule } from './app-routing.module';
+// Imports for loading & configuring the in-memory web api
+import { InMemoryWebApiModule } from 'angular-in-memory-web-api';
+import { InMemoryDataService } from './in-memory-data.service';
+import { AppComponent } from './app.component';
+import { DashboardComponent } from './dashboard.component';
+import { HeroesComponent } from './heroes.component';
+import { HeroDetailComponent } from './hero-detail.component';
+import { HeroEditingComponent } from './hero-editing.component';
+import { HeroService } from './hero.service';
+import { HeroSearchComponent } from './hero-search.component';
+import { ReactiveFormsModule } from '@angular/forms'; // <-- #1 import module
+
+@NgModule({
+ imports: [
+ BrowserModule,
+ FormsModule,
+ HttpModule,
+ InMemoryWebApiModule.forRoot(InMemoryDataService),
+ AppRoutingModule,
+ ReactiveFormsModule // <-- #2 add to Angular module imports
+ ],
+ declarations: [
+ AppComponent,
+ DashboardComponent,
+ HeroDetailComponent,
+ HeroEditingComponent,
+ HeroesComponent,
+ HeroSearchComponent
+ ],
+ providers: [ HeroService ],
+ bootstrap: [ AppComponent ]
+})
+export class AppModule { }
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/dashboard.component.css b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/dashboard.component.css
new file mode 100644
index 00000000..ca2e78f7
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/dashboard.component.css
@@ -0,0 +1,62 @@
+
+[class*='col-'] {
+ float: left;
+ padding-right: 20px;
+ padding-bottom: 20px;
+}
+[class*='col-']:last-of-type {
+ padding-right: 0;
+}
+a {
+ text-decoration: none;
+}
+*, *:after, *:before {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+h3 {
+ text-align: center; margin-bottom: 0;
+}
+h4 {
+ position: relative;
+}
+.grid {
+ margin: 0;
+}
+.col-1-4 {
+ width: 25%;
+}
+.module {
+ padding: 20px;
+ text-align: center;
+ color: #eee;
+ max-height: 120px;
+ min-width: 120px;
+ background-color: #607D8B;
+ border-radius: 2px;
+}
+.module:hover {
+ background-color: #EEE;
+ cursor: pointer;
+ color: #607d8b;
+}
+.grid-pad {
+ padding: 10px 0;
+}
+.grid-pad > [class*='col-']:last-of-type {
+ padding-right: 20px;
+}
+@media (max-width: 600px) {
+ .module {
+ font-size: 10px;
+ max-height: 75px; }
+}
+@media (max-width: 1024px) {
+ .grid {
+ margin: 0;
+ }
+ .module {
+ min-width: 60px;
+ }
+}
\ No newline at end of file
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/dashboard.component.html b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/dashboard.component.html
new file mode 100644
index 00000000..987b76dd
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/dashboard.component.html
@@ -0,0 +1,9 @@
+Top Heroes
+
+
\ No newline at end of file
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/dashboard.component.ts b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/dashboard.component.ts
new file mode 100644
index 00000000..f2cfc0f6
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/dashboard.component.ts
@@ -0,0 +1,21 @@
+import { Component, OnInit } from '@angular/core';
+import { Hero } from './hero';
+import { HeroService } from './hero.service';
+
+@Component({
+ //moduleId: module.id,
+ selector: 'my-dashboard',
+ templateUrl: './dashboard.component.html',
+ styleUrls: [ './dashboard.component.css' ]
+})
+export class DashboardComponent implements OnInit {
+
+ heroes: Hero[] = [];
+
+ constructor(private heroService: HeroService) { }
+
+ ngOnInit(): void {
+ this.heroService.getHeroes()
+ .then(heroes => this.heroes = heroes.slice(1, 5));
+ }
+}
\ No newline at end of file
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/hero-detail.component.css b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/hero-detail.component.css
new file mode 100644
index 00000000..b75cb026
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/hero-detail.component.css
@@ -0,0 +1,29 @@
+label {
+ display: inline-block;
+ width: 3em;
+ margin: .5em 0;
+ color: #607D8B;
+ font-weight: bold;
+}
+input {
+ height: 2em;
+ font-size: 1em;
+ padding-left: .4em;
+}
+button {
+ margin-top: 20px;
+ font-family: Arial;
+ background-color: #eee;
+ border: none;
+ padding: 5px 10px;
+ border-radius: 4px;
+ cursor: pointer; cursor: hand;
+}
+button:hover {
+ background-color: #cfd8dc;
+}
+button:disabled {
+ background-color: #eee;
+ color: #ccc;
+ cursor: auto;
+}
\ No newline at end of file
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/hero-detail.component.html b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/hero-detail.component.html
new file mode 100644
index 00000000..0e4157fb
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/hero-detail.component.html
@@ -0,0 +1,17 @@
+
+
+
{{hero.name}} details!
+
+ {{hero.id}}
+
+
+ {{hero.name}}
+
+
+ {{hero.skill}}
+
+
+

+
+
+
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/hero-detail.component.ts b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/hero-detail.component.ts
new file mode 100644
index 00000000..038b4de2
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/hero-detail.component.ts
@@ -0,0 +1,35 @@
+import { Component, Input, OnInit } from '@angular/core';
+import { ActivatedRoute, Params } from '@angular/router';
+import { Location } from '@angular/common';
+import { HeroService } from './hero.service';
+import { Hero } from './hero';
+import 'rxjs/add/operator/switchMap';
+import { FormBuilder, FormGroup, Validators } from '@angular/forms';
+
+@Component({
+ //moduleId: module.id,
+ selector: 'my-hero-detail',
+ templateUrl: './hero-detail.component.html'
+
+})
+export class HeroDetailComponent implements OnInit {
+ @Input() hero: Hero;
+
+ constructor(
+ private heroService: HeroService,
+ private route: ActivatedRoute,
+ private location: Location
+ ) {}
+
+ ngOnInit(): void {
+ this.route.params
+ .switchMap((params: Params) => this.heroService.getHero(+params['id']))
+ .subscribe(hero => {
+ this.hero = hero;
+ });
+ }
+
+ goBack(): void {
+ this.location.back();
+ }
+}
\ No newline at end of file
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/hero-editing.component.html b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/hero-editing.component.html
new file mode 100644
index 00000000..1b0629ef
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/hero-editing.component.html
@@ -0,0 +1,34 @@
+
+
{{hero.name}} details!
+
FormControl in a FormGroup
+
+
+
+Form value: {{ heroForm.value | json }}
+Form status: {{ heroForm.status | json }}
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/hero-editing.component.ts b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/hero-editing.component.ts
new file mode 100644
index 00000000..67246999
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/hero-editing.component.ts
@@ -0,0 +1,62 @@
+import { Component, Input, OnInit } from '@angular/core';
+import { ActivatedRoute, Params } from '@angular/router';
+import { Location } from '@angular/common';
+import { HeroService } from './hero.service';
+import { Hero } from './hero';
+import 'rxjs/add/operator/switchMap';
+import { FormGroup, Validators, FormBuilder} from '@angular/forms';
+
+@Component({
+ selector: 'my-hero-editing',
+ templateUrl: './hero-editing.component.html'
+
+})
+export class HeroEditingComponent {
+ heroForm: FormGroup;
+ @Input() hero: Hero;
+ constructor(
+ private heroService: HeroService,
+ private route: ActivatedRoute,
+ private location: Location,
+ private fb: FormBuilder
+ ) {}
+ ngOnInit(): void {
+ this.createForm();
+ this.route.params
+ .switchMap((params: Params) => this.heroService.getHero(+params['id']))
+ .subscribe(hero => {
+ this.hero = hero;
+ this.heroForm = this.fb.group({
+ id: this.hero.id,
+ name: this.hero.name,
+ skill: this.hero.skill,
+ avatar: this.hero.avatar
+ });
+
+ });
+ }
+
+ createForm() {
+ this.heroForm = this.fb.group({
+ id: '',
+ name: ['', Validators.required],
+ skill: '',
+ avatar: ''
+ });
+ }
+ goBack(): void {
+ this.location.back();
+ }
+ save(): void {
+ let formModel = this.heroForm.value;
+ let saveHero: Hero = {
+ id: this.hero.id,
+ name: formModel.name as string,
+ skill: formModel.skill as string,
+ avatar: this.hero.avatar
+ };
+ this.heroService
+ .update(saveHero)
+ .then(() => this.goBack());
+ }
+}
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/hero-search.component.css b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/hero-search.component.css
new file mode 100644
index 00000000..5f3c005e
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/hero-search.component.css
@@ -0,0 +1,18 @@
+.search-result{
+ border-bottom: 1px solid gray;
+ border-left: 1px solid gray;
+ border-right: 1px solid gray;
+ width:195px;
+ height: 16px;
+ padding: 5px;
+ background-color: white;
+ cursor: pointer;
+}
+.search-result:hover {
+ color: #eee;
+ background-color: #607D8B;
+}
+#search-box{
+ width: 200px;
+ height: 20px;
+}
\ No newline at end of file
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/hero-search.component.html b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/hero-search.component.html
new file mode 100644
index 00000000..7f8711ba
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/hero-search.component.html
@@ -0,0 +1,10 @@
+
\ No newline at end of file
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/hero-search.component.ts b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/hero-search.component.ts
new file mode 100644
index 00000000..0d8b7b0b
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/hero-search.component.ts
@@ -0,0 +1,49 @@
+import { Component, OnInit } from '@angular/core';
+import { Router } from '@angular/router';
+import { Observable } from 'rxjs/Observable';
+import { Subject } from 'rxjs/Subject';
+// Observable class extensions
+import 'rxjs/add/observable/of';
+// Observable operators
+import 'rxjs/add/operator/catch';
+import 'rxjs/add/operator/debounceTime';
+import 'rxjs/add/operator/distinctUntilChanged';
+import { HeroSearchService } from './hero-search.service';
+import { Hero } from './hero';
+@Component({
+ //moduleId: module.id,
+ selector: 'hero-search',
+ templateUrl: './hero-search.component.html',
+ styleUrls: [ './hero-search.component.css' ],
+ providers: [HeroSearchService]
+})
+export class HeroSearchComponent implements OnInit {
+ heroes: Observable;
+ private searchTerms = new Subject();
+ constructor(
+ private heroSearchService: HeroSearchService,
+ private router: Router) {}
+ // Push a search term into the observable stream.
+ search(term: string): void {
+ this.searchTerms.next(term);
+ }
+ ngOnInit(): void {
+ this.heroes = this.searchTerms
+ .debounceTime(300) // wait 300ms after each keystroke before considering the term
+ .distinctUntilChanged() // ignore if next search term is same as previous
+ .switchMap(term => term // switch to new observable each time the term changes
+ // return the http search observable
+ ? this.heroSearchService.search(term)
+ // or the observable of empty heroes if there was no search term
+ : Observable.of([]))
+ .catch(error => {
+ // TODO: add real error handling
+ console.log(error);
+ return Observable.of([]);
+ });
+ }
+ gotoDetail(hero: Hero): void {
+ let link = ['/detail', hero.id];
+ this.router.navigate(link);
+ }
+}
\ No newline at end of file
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/hero-search.service.ts b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/hero-search.service.ts
new file mode 100644
index 00000000..18b7a25e
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/hero-search.service.ts
@@ -0,0 +1,14 @@
+import { Injectable } from '@angular/core';
+import { Http } from '@angular/http';
+import { Observable } from 'rxjs/Observable';
+import 'rxjs/add/operator/map';
+import { Hero } from './hero';
+@Injectable()
+export class HeroSearchService {
+ constructor(private http: Http) {}
+ search(term: string): Observable {
+ return this.http
+ .get(`app/heroes/?name=${term}`)
+ .map(response => response.json().data as Hero[]);
+ }
+}
\ No newline at end of file
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/hero.service.ts b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/hero.service.ts
new file mode 100644
index 00000000..4cb3c4d2
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/hero.service.ts
@@ -0,0 +1,52 @@
+import { Injectable } from '@angular/core';
+import { Headers, Http } from '@angular/http';
+import 'rxjs/add/operator/toPromise';
+import { Hero } from './hero';
+//import { HEROES } from './mock-heroes';
+@Injectable()
+export class HeroService {
+ private heroesUrl = 'api/heroes'; // URL to web api
+ private headers = new Headers({'Content-Type': 'application/json'});
+
+ constructor(private http: Http) { }
+
+ getHeroes(): Promise {
+ return this.http.get(this.heroesUrl)
+ .toPromise()
+ .then(response => response.json().data as Hero[])
+ .catch(this.handleError);
+ }
+ private handleError(error: any): Promise {
+ return Promise.reject(error.message || error);
+ }
+ getHero(id: number): Promise {
+ const url = `${this.heroesUrl}/${id}`;
+ return this.http.get(url)
+ .toPromise()
+ .then(response => response.json().data as Hero)
+ .catch(this.handleError);
+ }
+ update(hero: Hero): Promise {
+ const url = `${this.heroesUrl}/${hero.id}`;
+ console.log(url + " " + JSON.stringify(hero) );
+ return this.http
+ .put(url, JSON.stringify(hero), {headers: this.headers})
+ .toPromise()
+ .then(() => hero)
+ .catch(this.handleError);
+ }
+ create(name: string): Promise {
+ return this.http
+ .post(this.heroesUrl, JSON.stringify({name: name}), {headers: this.headers})
+ .toPromise()
+ .then(res => res.json().data)
+ .catch(this.handleError);
+ }
+ delete(id: number): Promise {
+ const url = `${this.heroesUrl}/${id}`;
+ return this.http.delete(url, {headers: this.headers})
+ .toPromise()
+ .then(() => null)
+ .catch(this.handleError);
+ }
+}
\ No newline at end of file
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/hero.ts b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/hero.ts
new file mode 100644
index 00000000..feefc55f
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/hero.ts
@@ -0,0 +1,6 @@
+export class Hero {
+ id: number;
+ name: string;
+ skill: string;
+ avatar: string;
+}
\ No newline at end of file
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/heroes.component.css b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/heroes.component.css
new file mode 100644
index 00000000..f4bab6c8
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/heroes.component.css
@@ -0,0 +1,57 @@
+.selected {
+ background-color: #CFD8DC !important;
+ color: white;
+}
+.heroes {
+ margin: 0 0 2em 0;
+ list-style-type: none;
+ padding: 0;
+ width: 15em;
+}
+.heroes li {
+ cursor: pointer;
+ position: relative;
+ left: 0;
+ background-color: #EEE;
+ margin: .5em;
+ padding: .3em 0;
+ height: 1.6em;
+ border-radius: 4px;
+}
+.heroes li.selected:hover {
+ background-color: #BBD8DC !important;
+ color: white;
+}
+.heroes li:hover {
+ color: #607D8B;
+ background-color: #DDD;
+ left: .1em;
+}
+.heroes .text {
+ position: relative;
+ top: -3px;
+}
+.heroes .badge {
+ display: inline-block;
+ font-size: small;
+ color: white;
+ padding: 0.8em 0.7em 0 0.7em;
+ background-color: #607D8B;
+ line-height: 1em;
+ position: relative;
+ left: -1px;
+ top: -4px;
+ height: 1.8em;
+ margin-right: .8em;
+ border-radius: 4px 0 0 4px;
+}
+.edit_button {
+ float: right;
+}
+button.delete {
+ float:right;
+ margin-top: 2px;
+ margin-right: .8em;
+ background-color: gray !important;
+ color:white;
+}
\ No newline at end of file
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/heroes.component.html b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/heroes.component.html
new file mode 100644
index 00000000..511fe162
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/heroes.component.html
@@ -0,0 +1,27 @@
+
\ No newline at end of file
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/heroes.component.ts b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/heroes.component.ts
new file mode 100755
index 00000000..b4589626
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/heroes.component.ts
@@ -0,0 +1,58 @@
+import { Component, OnInit } from '@angular/core';
+import { Hero } from './hero';
+import { HeroService } from './hero.service';
+import { Router } from '@angular/router';
+
+
+@Component({
+ // moduleId: module.id,
+ selector: 'my-heroes',
+ templateUrl: 'heroes.component.html',
+ styleUrls: ['heroes.component.css'],
+ providers: [HeroService]
+})
+export class HeroesComponent implements OnInit {
+ heroes: Hero[];
+ selectedHero: Hero;
+
+ constructor(
+ private router: Router,
+ private heroService: HeroService) { }
+
+ getHeroes(): void {
+ this.heroService.getHeroes().then(heroes => this.heroes = heroes);
+ }
+
+ ngOnInit(): void {
+ this.getHeroes();
+ }
+
+ onSelect(hero: Hero): void {
+ this.selectedHero = hero;
+ }
+
+ gotoDetail(): void {
+ this.router.navigate(['/detail', this.selectedHero.id]);
+ }
+
+ gotoEditing(): void {
+ this.router.navigate(['/editing', this.selectedHero.id]);
+ }
+ add(name: string): void {
+ name = name.trim();
+ if (!name) { return; }
+ this.heroService.create(name)
+ .then(hero => {
+ this.heroes.push(hero);
+ this.selectedHero = null;
+ });
+ }
+ delete(hero: Hero): void {
+ this.heroService
+ .delete(hero.id)
+ .then(() => {
+ this.heroes = this.heroes.filter(h => h !== hero);
+ if (this.selectedHero === hero) { this.selectedHero = null; }
+ });
+ }
+}
\ No newline at end of file
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/in-memory-data.service.ts b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/in-memory-data.service.ts
new file mode 100644
index 00000000..e48c6f8e
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/app/in-memory-data.service.ts
@@ -0,0 +1,19 @@
+import { InMemoryDbService } from 'angular-in-memory-web-api';
+export class InMemoryDataService implements InMemoryDbService {
+ createDb() {
+ let heroes = [
+ {id: 11, name: 'Mr. Nice', skill: 'Freeze time', avatar: '/src/assets/1.jpg'},
+ {id: 12, name: 'Narco', skill: 'Warm', avatar: '/src/assets/2.jpg'},
+ {id: 13, name: 'Bombasto', skill: 'Telepathy', avatar: '/src/assets/3.jpg'},
+ {id: 14, name: 'Celeritas', skill: 'Telekines', avatar: '/src/assets/4.jpg'},
+ {id: 15, name: 'Magneta', skill: 'Empath', avatar: '/src/assets/5.jpg'},
+ {id: 16, name: 'RubberMan', skill: 'Flights', avatar: '/src/assets/6.jpg'},
+ {id: 17, name: 'Dynama', skill: 'High jump', avatar: '/src/assets/7.jpg'},
+ {id: 18, name: 'Dr IQ', skill: 'Laud voice', avatar: '/src/assets/8.jpg'},
+ {id: 19, name: 'Magma', skill: 'Fireball', avatar: '/src/assets/9.jpg'},
+ {id: 20, name: 'Tornado', skill: 'Teleport', avatar: '/src/assets/10.jpg'},
+ {id: 21, name: 'Celeb', skill: 'Cupid power', avatar: '/src/assets/11.jpg'}
+ ];
+ return {heroes};
+ }
+}
\ No newline at end of file
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/assets/1.jpg b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/assets/1.jpg
new file mode 100644
index 00000000..05e02a19
Binary files /dev/null and b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/assets/1.jpg differ
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/assets/10.jpg b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/assets/10.jpg
new file mode 100644
index 00000000..04619330
Binary files /dev/null and b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/assets/10.jpg differ
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/assets/11.jpg b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/assets/11.jpg
new file mode 100644
index 00000000..3409a4e7
Binary files /dev/null and b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/assets/11.jpg differ
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/assets/12.jpg b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/assets/12.jpg
new file mode 100644
index 00000000..589596ad
Binary files /dev/null and b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/assets/12.jpg differ
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/assets/2.jpg b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/assets/2.jpg
new file mode 100644
index 00000000..1dd84b14
Binary files /dev/null and b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/assets/2.jpg differ
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/assets/3.jpg b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/assets/3.jpg
new file mode 100644
index 00000000..e74c57c1
Binary files /dev/null and b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/assets/3.jpg differ
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/assets/4.jpg b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/assets/4.jpg
new file mode 100644
index 00000000..dc274a9d
Binary files /dev/null and b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/assets/4.jpg differ
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/assets/5.jpg b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/assets/5.jpg
new file mode 100644
index 00000000..6bc02307
Binary files /dev/null and b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/assets/5.jpg differ
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/assets/6.jpg b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/assets/6.jpg
new file mode 100644
index 00000000..36da7c68
Binary files /dev/null and b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/assets/6.jpg differ
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/assets/7.jpg b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/assets/7.jpg
new file mode 100644
index 00000000..2160b6aa
Binary files /dev/null and b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/assets/7.jpg differ
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/assets/8.jpg b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/assets/8.jpg
new file mode 100644
index 00000000..4f50c142
Binary files /dev/null and b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/assets/8.jpg differ
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/assets/9.jpg b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/assets/9.jpg
new file mode 100644
index 00000000..dc45e22e
Binary files /dev/null and b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/assets/9.jpg differ
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/index.html b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/index.html
new file mode 100755
index 00000000..346565bc
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/index.html
@@ -0,0 +1,13 @@
+
+
+
+ Angular With Webpack
+
+
+
+
+
+
+ Loading...
+
+
\ No newline at end of file
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/main.ts b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/main.ts
new file mode 100755
index 00000000..fb336317
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/main.ts
@@ -0,0 +1,7 @@
+import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
+import { enableProdMode } from '@angular/core';
+import { AppModule } from './app/app.module';
+if (process.env.ENV === 'production') {
+ enableProdMode();
+}
+platformBrowserDynamic().bootstrapModule(AppModule);
\ No newline at end of file
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/polyfills.ts b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/polyfills.ts
new file mode 100755
index 00000000..fa217c85
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/polyfills.ts
@@ -0,0 +1,11 @@
+import 'core-js/es6';
+import 'core-js/es7/reflect';
+require('zone.js/dist/zone');
+
+if (process.env.ENV === 'production') {
+ // Production
+} else {
+ // Development and test
+ Error['stackTraceLimit'] = Infinity;
+ require('zone.js/dist/long-stack-trace-zone');
+}
\ No newline at end of file
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/styles.css b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/styles.css
new file mode 100755
index 00000000..779c1581
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/styles.css
@@ -0,0 +1,23 @@
+/* Master Styles */
+h1 {
+ color: #369;
+ font-family: Arial, Helvetica, sans-serif;
+ font-size: 250%;
+}
+h2, h3 {
+ color: #444;
+ font-family: Arial, Helvetica, sans-serif;
+ font-weight: lighter;
+}
+body {
+ margin: 2em;
+}
+body, input[text], button {
+ color: #888;
+ font-family: Cambria, Georgia;
+}
+/* . . . */
+/* everywhere else */
+* {
+ font-family: Arial, Helvetica, sans-serif;
+}
\ No newline at end of file
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/vendor.ts b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/vendor.ts
new file mode 100755
index 00000000..efada3e3
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/src/vendor.ts
@@ -0,0 +1,11 @@
+// Angular
+import '@angular/platform-browser';
+import '@angular/platform-browser-dynamic';
+import '@angular/core';
+import '@angular/common';
+import '@angular/http';
+import '@angular/router';
+// RxJS
+import 'rxjs';
+// Other vendors for example jQuery, Lodash or Bootstrap
+// You can import js, ts, css, sass, ...
\ No newline at end of file
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/tsconfig.json b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/tsconfig.json
new file mode 100755
index 00000000..77b380c5
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/tsconfig.json
@@ -0,0 +1,13 @@
+{
+ "compilerOptions": {
+ "target": "es5",
+ "module": "commonjs",
+ "moduleResolution": "node",
+ "sourceMap": true,
+ "emitDecoratorMetadata": true,
+ "experimentalDecorators": true,
+ "lib": ["es2015", "dom"],
+ "noImplicitAny": true,
+ "suppressImplicitAnyIndexErrors": true
+ }
+}
\ No newline at end of file
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/tslint.json b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/tslint.json
new file mode 100755
index 00000000..5cf07f0c
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/tslint.json
@@ -0,0 +1,93 @@
+{
+ "rules": {
+ "class-name": true,
+ "comment-format": [
+ true,
+ "check-space"
+ ],
+ "curly": true,
+ "eofline": true,
+ "forin": true,
+ "indent": [
+ true,
+ "spaces"
+ ],
+ "label-position": true,
+ "label-undefined": true,
+ "max-line-length": [
+ true,
+ 140
+ ],
+ "member-access": false,
+ "member-ordering": [
+ true,
+ "static-before-instance",
+ "variables-before-functions"
+ ],
+ "no-arg": true,
+ "no-bitwise": true,
+ "no-console": [
+ true,
+ "debug",
+ "info",
+ "time",
+ "timeEnd",
+ "trace"
+ ],
+ "no-construct": true,
+ "no-debugger": true,
+ "no-duplicate-key": true,
+ "no-duplicate-variable": true,
+ "no-empty": false,
+ "no-eval": true,
+ "no-inferrable-types": true,
+ "no-shadowed-variable": true,
+ "no-string-literal": false,
+ "no-switch-case-fall-through": true,
+ "no-trailing-whitespace": true,
+ "no-unused-expression": true,
+ "no-unused-variable": true,
+ "no-unreachable": true,
+ "no-use-before-declare": true,
+ "no-var-keyword": true,
+ "object-literal-sort-keys": false,
+ "one-line": [
+ true,
+ "check-open-brace",
+ "check-catch",
+ "check-else",
+ "check-whitespace"
+ ],
+ "quotemark": [
+ true,
+ "single"
+ ],
+ "radix": true,
+ "semicolon": [
+ "always"
+ ],
+ "triple-equals": [
+ true,
+ "allow-null-check"
+ ],
+ "typedef-whitespace": [
+ true,
+ {
+ "call-signature": "nospace",
+ "index-signature": "nospace",
+ "parameter": "nospace",
+ "property-declaration": "nospace",
+ "variable-declaration": "nospace"
+ }
+ ],
+ "variable-name": false,
+ "whitespace": [
+ true,
+ "check-branch",
+ "check-decl",
+ "check-operator",
+ "check-separator",
+ "check-type"
+ ]
+ }
+}
diff --git a/homeworks/igor.sokurenko_praetorianlive/angular-test-project/webpack.config.js b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/webpack.config.js
new file mode 100755
index 00000000..0715c306
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/angular-test-project/webpack.config.js
@@ -0,0 +1 @@
+module.exports = require('./config/webpack.dev.js');
\ No newline at end of file
diff --git a/homeworks/igor.sokurenko_praetorianlive/homework_8/README.md b/homeworks/igor.sokurenko_praetorianlive/homework_8/README.md
new file mode 100644
index 00000000..c3c95b27
--- /dev/null
+++ b/homeworks/igor.sokurenko_praetorianlive/homework_8/README.md
@@ -0,0 +1,3 @@
+# tictactoe.github.io
+https://github.com/praetorianlive/tictactoe.github.io
+https://praetorianlive.github.io/tictactoe.github.io/
\ No newline at end of file