diff --git a/blog-complete/app/app.module.ts b/blog-complete/app/app.module.ts
new file mode 100644
index 0000000..851c55c
--- /dev/null
+++ b/blog-complete/app/app.module.ts
@@ -0,0 +1,11 @@
+import { NgModule } from '@angular/core';
+import { BrowserModule } from '@angular/platform-browser';
+import {AppComponent} from './blog/app.component';
+import {BlogEntryComponent} from './blog/blog-entry.component';
+
+@NgModule({
+ imports: [ BrowserModule ],
+ declarations: [ AppComponent, BlogEntryComponent ],
+ bootstrap: [ AppComponent ]
+})
+export class AppModule { }
diff --git a/blog-complete/app/blog/app.component.html b/blog-complete/app/blog/app.component.html
new file mode 100644
index 0000000..0f91b43
--- /dev/null
+++ b/blog-complete/app/blog/app.component.html
@@ -0,0 +1,25 @@
+
Mein Angular-Blog
+
+Neuen Blog-Eintrag erstellen
+
+
diff --git a/blog-complete/app/blog/app.component.ts b/blog-complete/app/blog/app.component.ts
new file mode 100644
index 0000000..94627bd
--- /dev/null
+++ b/blog-complete/app/blog/app.component.ts
@@ -0,0 +1,29 @@
+import {Component} from '@angular/core';
+import {initialEntries} from './initialEntries';
+import {BlogEntry} from './blog-entry';
+
+@Component({
+ moduleId: module.id,
+ selector: 'app-root',
+ templateUrl: 'app.component.html'
+})
+export class AppComponent {
+
+ entries: BlogEntry[] = [];
+
+ constructor() {
+ this.entries = [];
+ this.entries = initialEntries
+ }
+
+ createBlogEntry(title:string, image:string, text:string) {
+ console.log(title, image, text);
+ let entry = new BlogEntry();
+ entry.title = title;
+ entry.image = image;
+ entry.text = text;
+
+ this.entries.push(entry);
+ }
+}
+
diff --git a/blog-complete/app/blog/blog-entry.component.html b/blog-complete/app/blog/blog-entry.component.html
new file mode 100644
index 0000000..b034fbf
--- /dev/null
+++ b/blog-complete/app/blog/blog-entry.component.html
@@ -0,0 +1,9 @@
+
+
+
+
+
+
{{entry.title}}
+
{{entry.text}}
+
+
\ No newline at end of file
diff --git a/blog-complete/app/blog/blog-entry.component.ts b/blog-complete/app/blog/blog-entry.component.ts
new file mode 100644
index 0000000..d865882
--- /dev/null
+++ b/blog-complete/app/blog/blog-entry.component.ts
@@ -0,0 +1,11 @@
+import {Component, Input} from '@angular/core';
+import {BlogEntry} from './blog-entry';
+
+@Component({
+ moduleId: module.id,
+ selector: 'app-blog-entry',
+ templateUrl: 'blog-entry.component.html'
+})
+export class BlogEntryComponent {
+ @Input() entry: BlogEntry;
+}
diff --git a/blog-complete/app/blog/blog-entry.ts b/blog-complete/app/blog/blog-entry.ts
new file mode 100644
index 0000000..b84c33d
--- /dev/null
+++ b/blog-complete/app/blog/blog-entry.ts
@@ -0,0 +1,5 @@
+export class BlogEntry {
+ title: string;
+ text: string;
+ image: string;
+}
diff --git a/blog-complete/app/blog/initialEntries.ts b/blog-complete/app/blog/initialEntries.ts
new file mode 100644
index 0000000..7a53b05
--- /dev/null
+++ b/blog-complete/app/blog/initialEntries.ts
@@ -0,0 +1,12 @@
+export var initialEntries = [
+ {
+ title: "Angular 2 erschienen",
+ image: "data:image/png;base64,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",
+ text: "Endlich ist die finale Version von Angular 2 erschienen. Nach langer Beta-Phase ..."
+ },
+ {
+ title: "Neue Vorschläge für die kommende Module-Loader-Syntax",
+ image: "https://cdn-images-1.medium.com/max/1000/1*RQFLsbQumE-iNrXzs_Oz8g.jpeg",
+ text: "Nachdem im ES2015-Standard bereits die Module-API verabschiedet wurde, hat das zuständige Konsortium nun neue Vorschläge für die Module-Loader-Syntax bekannt gegeben..."
+ }
+]
\ No newline at end of file
diff --git a/blog-complete/app/main.ts b/blog-complete/app/main.ts
new file mode 100644
index 0000000..8509392
--- /dev/null
+++ b/blog-complete/app/main.ts
@@ -0,0 +1,4 @@
+import {platformBrowserDynamic} from '@angular/platform-browser-dynamic';
+import {AppModule} from './app.module';
+
+platformBrowserDynamic().bootstrapModule(AppModule);
\ No newline at end of file
diff --git a/blog-complete/dist/app.module.js b/blog-complete/dist/app.module.js
new file mode 100644
index 0000000..10ebda2
--- /dev/null
+++ b/blog-complete/dist/app.module.js
@@ -0,0 +1,26 @@
+"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;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+var core_1 = require("@angular/core");
+var platform_browser_1 = require("@angular/platform-browser");
+var app_component_1 = require("./blog/app.component");
+var blog_entry_component_1 = require("./blog/blog-entry.component");
+var AppModule = (function () {
+ function AppModule() {
+ }
+ return AppModule;
+}());
+AppModule = __decorate([
+ core_1.NgModule({
+ imports: [platform_browser_1.BrowserModule],
+ declarations: [app_component_1.AppComponent, blog_entry_component_1.BlogEntryComponent],
+ bootstrap: [app_component_1.AppComponent]
+ })
+], AppModule);
+exports.AppModule = AppModule;
+//# sourceMappingURL=app.module.js.map
\ No newline at end of file
diff --git a/blog-complete/dist/app.module.js.map b/blog-complete/dist/app.module.js.map
new file mode 100644
index 0000000..4e186ed
--- /dev/null
+++ b/blog-complete/dist/app.module.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"app.module.js","sourceRoot":"","sources":["../app/app.module.ts"],"names":[],"mappings":";;;;;;;;AAAA,sCAA8C;AAC9C,8DAA0D;AAC1D,sDAAkD;AAClD,oEAA+D;AAO/D,IAAa,SAAS;IAAtB;IAAyB,CAAC;IAAD,gBAAC;AAAD,CAAC,AAA1B,IAA0B;AAAb,SAAS;IALrB,eAAQ,CAAC;QACR,OAAO,EAAE,CAAE,gCAAa,CAAE;QAC1B,YAAY,EAAE,CAAE,4BAAY,EAAE,yCAAkB,CAAE;QAClD,SAAS,EAAE,CAAE,4BAAY,CAAE;KAC5B,CAAC;GACW,SAAS,CAAI;AAAb,8BAAS"}
\ No newline at end of file
diff --git a/blog-complete/dist/blog/app.component.html b/blog-complete/dist/blog/app.component.html
new file mode 100644
index 0000000..0f91b43
--- /dev/null
+++ b/blog-complete/dist/blog/app.component.html
@@ -0,0 +1,25 @@
+Mein Angular-Blog
+
+Neuen Blog-Eintrag erstellen
+
+
diff --git a/blog-complete/dist/blog/app.component.js b/blog-complete/dist/blog/app.component.js
new file mode 100644
index 0000000..96e1816
--- /dev/null
+++ b/blog-complete/dist/blog/app.component.js
@@ -0,0 +1,40 @@
+"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);
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+var core_1 = require("@angular/core");
+var initialEntries_1 = require("./initialEntries");
+var blog_entry_1 = require("./blog-entry");
+var AppComponent = (function () {
+ function AppComponent() {
+ this.entries = [];
+ this.entries = [];
+ this.entries = initialEntries_1.initialEntries;
+ }
+ AppComponent.prototype.createBlogEntry = function (title, image, text) {
+ console.log(title, image, text);
+ var entry = new blog_entry_1.BlogEntry();
+ entry.title = title;
+ entry.image = image;
+ entry.text = text;
+ this.entries.push(entry);
+ };
+ return AppComponent;
+}());
+AppComponent = __decorate([
+ core_1.Component({
+ moduleId: module.id,
+ selector: 'app-root',
+ templateUrl: 'app.component.html'
+ }),
+ __metadata("design:paramtypes", [])
+], AppComponent);
+exports.AppComponent = AppComponent;
+//# sourceMappingURL=app.component.js.map
\ No newline at end of file
diff --git a/blog-complete/dist/blog/app.component.js.map b/blog-complete/dist/blog/app.component.js.map
new file mode 100644
index 0000000..8859bef
--- /dev/null
+++ b/blog-complete/dist/blog/app.component.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"app.component.js","sourceRoot":"","sources":["../../app/blog/app.component.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,sCAAwC;AACxC,mDAAgD;AAChD,2CAAuC;AAOvC,IAAa,YAAY;IAIvB;QAFA,YAAO,GAAgB,EAAE,CAAC;QAGxB,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,IAAI,CAAC,OAAO,GAAG,+BAAc,CAAA;IAC/B,CAAC;IAED,sCAAe,GAAf,UAAgB,KAAY,EAAE,KAAY,EAAE,IAAW;QACrD,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QAChC,IAAI,KAAK,GAAG,IAAI,sBAAS,EAAE,CAAC;QAC5B,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;QACpB,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;QACpB,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;QAElB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IACH,mBAAC;AAAD,CAAC,AAlBD,IAkBC;AAlBY,YAAY;IALxB,gBAAS,CAAC;QACT,QAAQ,EAAE,MAAM,CAAC,EAAE;QACnB,QAAQ,EAAE,UAAU;QACpB,WAAW,EAAE,oBAAoB;KAClC,CAAC;;GACW,YAAY,CAkBxB;AAlBY,oCAAY"}
\ No newline at end of file
diff --git a/blog-complete/dist/blog/blog-entry.component.html b/blog-complete/dist/blog/blog-entry.component.html
new file mode 100644
index 0000000..b034fbf
--- /dev/null
+++ b/blog-complete/dist/blog/blog-entry.component.html
@@ -0,0 +1,9 @@
+
+
+
+
+
+
{{entry.title}}
+
{{entry.text}}
+
+
\ No newline at end of file
diff --git a/blog-complete/dist/blog/blog-entry.component.js b/blog-complete/dist/blog/blog-entry.component.js
new file mode 100644
index 0000000..10defa0
--- /dev/null
+++ b/blog-complete/dist/blog/blog-entry.component.js
@@ -0,0 +1,31 @@
+"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);
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+var core_1 = require("@angular/core");
+var blog_entry_1 = require("./blog-entry");
+var BlogEntryComponent = (function () {
+ function BlogEntryComponent() {
+ }
+ return BlogEntryComponent;
+}());
+__decorate([
+ core_1.Input(),
+ __metadata("design:type", blog_entry_1.BlogEntry)
+], BlogEntryComponent.prototype, "entry", void 0);
+BlogEntryComponent = __decorate([
+ core_1.Component({
+ moduleId: module.id,
+ selector: 'app-blog-entry',
+ templateUrl: 'blog-entry.component.html'
+ })
+], BlogEntryComponent);
+exports.BlogEntryComponent = BlogEntryComponent;
+//# sourceMappingURL=blog-entry.component.js.map
\ No newline at end of file
diff --git a/blog-complete/dist/blog/blog-entry.component.js.map b/blog-complete/dist/blog/blog-entry.component.js.map
new file mode 100644
index 0000000..337d16a
--- /dev/null
+++ b/blog-complete/dist/blog/blog-entry.component.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"blog-entry.component.js","sourceRoot":"","sources":["../../app/blog/blog-entry.component.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,sCAA+C;AAC/C,2CAAuC;AAOvC,IAAa,kBAAkB;IAA/B;IAEA,CAAC;IAAD,yBAAC;AAAD,CAAC,AAFD,IAEC;AADU;IAAR,YAAK,EAAE;8BAAQ,sBAAS;iDAAC;AADf,kBAAkB;IAL9B,gBAAS,CAAC;QACT,QAAQ,EAAE,MAAM,CAAC,EAAE;QACnB,QAAQ,EAAE,gBAAgB;QAC1B,WAAW,EAAE,2BAA2B;KACzC,CAAC;GACW,kBAAkB,CAE9B;AAFY,gDAAkB"}
\ No newline at end of file
diff --git a/blog-complete/dist/blog/blog-entry.js b/blog-complete/dist/blog/blog-entry.js
new file mode 100644
index 0000000..1b45497
--- /dev/null
+++ b/blog-complete/dist/blog/blog-entry.js
@@ -0,0 +1,9 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var BlogEntry = (function () {
+ function BlogEntry() {
+ }
+ return BlogEntry;
+}());
+exports.BlogEntry = BlogEntry;
+//# sourceMappingURL=blog-entry.js.map
\ No newline at end of file
diff --git a/blog-complete/dist/blog/blog-entry.js.map b/blog-complete/dist/blog/blog-entry.js.map
new file mode 100644
index 0000000..63b0cb4
--- /dev/null
+++ b/blog-complete/dist/blog/blog-entry.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"blog-entry.js","sourceRoot":"","sources":["../../app/blog/blog-entry.ts"],"names":[],"mappings":";;AAAA;IAAA;IAIA,CAAC;IAAD,gBAAC;AAAD,CAAC,AAJD,IAIC;AAJY,8BAAS"}
\ No newline at end of file
diff --git a/blog-complete/dist/blog/initialEntries.js b/blog-complete/dist/blog/initialEntries.js
new file mode 100644
index 0000000..62b04c2
--- /dev/null
+++ b/blog-complete/dist/blog/initialEntries.js
@@ -0,0 +1,15 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.initialEntries = [
+ {
+ title: "Angular 2 erschienen",
+ image: "data:image/png;base64,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",
+ text: "Endlich ist die finale Version von Angular 2 erschienen. Nach langer Beta-Phase ..."
+ },
+ {
+ title: "Neue Vorschläge für die kommende Module-Loader-Syntax",
+ image: "https://cdn-images-1.medium.com/max/1000/1*RQFLsbQumE-iNrXzs_Oz8g.jpeg",
+ text: "Nachdem im ES2015-Standard bereits die Module-API verabschiedet wurde, hat das zuständige Konsortium nun neue Vorschläge für die Module-Loader-Syntax bekannt gegeben..."
+ }
+];
+//# sourceMappingURL=initialEntries.js.map
\ No newline at end of file
diff --git a/blog-complete/dist/blog/initialEntries.js.map b/blog-complete/dist/blog/initialEntries.js.map
new file mode 100644
index 0000000..c38bb30
--- /dev/null
+++ b/blog-complete/dist/blog/initialEntries.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"initialEntries.js","sourceRoot":"","sources":["../../app/blog/initialEntries.ts"],"names":[],"mappings":";;AAAW,QAAA,cAAc,GAAG;IAC1B;QACE,KAAK,EAAE,sBAAsB;QAC7B,KAAK,EAAE,4kLAA4kL;QACnlL,IAAI,EAAE,qFAAqF;KAC5F;IACD;QACE,KAAK,EAAE,uDAAuD;QAC9D,KAAK,EAAE,wEAAwE;QAC/E,IAAI,EAAE,0KAA0K;KACjL;CACF,CAAA"}
\ No newline at end of file
diff --git a/blog-complete/dist/main.js b/blog-complete/dist/main.js
new file mode 100644
index 0000000..4b1ba88
--- /dev/null
+++ b/blog-complete/dist/main.js
@@ -0,0 +1,6 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var platform_browser_dynamic_1 = require("@angular/platform-browser-dynamic");
+var app_module_1 = require("./app.module");
+platform_browser_dynamic_1.platformBrowserDynamic().bootstrapModule(app_module_1.AppModule);
+//# sourceMappingURL=main.js.map
\ No newline at end of file
diff --git a/blog-complete/dist/main.js.map b/blog-complete/dist/main.js.map
new file mode 100644
index 0000000..65d30de
--- /dev/null
+++ b/blog-complete/dist/main.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"main.js","sourceRoot":"","sources":["../app/main.ts"],"names":[],"mappings":";;AAAA,8EAAyE;AACzE,2CAAuC;AAEvC,iDAAsB,EAAE,CAAC,eAAe,CAAC,sBAAS,CAAC,CAAC"}
\ No newline at end of file
diff --git a/blog-complete/favicon.ico b/blog-complete/favicon.ico
new file mode 100644
index 0000000..8081c7c
Binary files /dev/null and b/blog-complete/favicon.ico differ
diff --git a/blog-complete/index.html b/blog-complete/index.html
new file mode 100644
index 0000000..bf96190
--- /dev/null
+++ b/blog-complete/index.html
@@ -0,0 +1,25 @@
+
+
+
+ Hallo Angular
+
+
+
+
+
+
+ Die Applikation wird geladen...
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/blog-complete/karma.conf.js b/blog-complete/karma.conf.js
new file mode 100644
index 0000000..cc7c84b
--- /dev/null
+++ b/blog-complete/karma.conf.js
@@ -0,0 +1,68 @@
+// Karma configuration
+// Generated on Sat Feb 25 2017 12:32:32 GMT+0100 (CET)
+
+module.exports = function(config) {
+ config.set({
+
+ // base path that will be used to resolve all patterns (eg. files, exclude)
+ basePath: '',
+
+
+ // frameworks to use
+ // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
+ frameworks: ['jasmine'],
+
+
+ // list of files / patterns to load in the browser
+ files: [
+ ],
+
+
+ // list of files to exclude
+ exclude: [
+ ],
+
+
+ // preprocess matching files before serving them to the browser
+ // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
+ preprocessors: {
+ },
+
+
+ // test results reporter to use
+ // possible values: 'dots', 'progress'
+ // available reporters: https://npmjs.org/browse/keyword/karma-reporter
+ reporters: ['progress'],
+
+
+ // web server port
+ port: 9876,
+
+
+ // enable / disable colors in the output (reporters and logs)
+ colors: true,
+
+
+ // level of logging
+ // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
+ logLevel: config.LOG_INFO,
+
+
+ // enable / disable watching file and executing tests whenever any file changes
+ autoWatch: true,
+
+
+ // start these browsers
+ // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
+ browsers: ['Chrome'],
+
+
+ // Continuous Integration mode
+ // if true, Karma captures browsers, runs the tests and exits
+ singleRun: false,
+
+ // Concurrency level
+ // how many browser should be started simultaneous
+ concurrency: Infinity
+ })
+}
diff --git a/blog-complete/package.json b/blog-complete/package.json
new file mode 100644
index 0000000..06988a2
--- /dev/null
+++ b/blog-complete/package.json
@@ -0,0 +1,52 @@
+{
+ "name": "blog-app",
+ "version": "1.0.0",
+ "description": "Blog Applikation",
+ "watch": {
+ "copy:html": "./app/**/*.html"
+ },
+ "scripts": {
+ "start": "tsc && npm run copy:html && concurrently \"npm run tsc:w\" \"npm run html:watch\" \"live-server\" ",
+ "tsc": "./node_modules/.bin/tsc",
+ "tsc:w": "./node_modules/.bin/tsc --watch",
+ "copy:html": "copyfiles -u 1 ./app/**/*.html dist",
+ "html:watch": "onchange \"./app/**/*.html\" -v -- npm run copy:html"
+ },
+ "keywords": [],
+ "author": "",
+ "license": "ISC",
+ "dependencies": {
+ "@angular/common": "2.4.3",
+ "@angular/compiler": "2.4.3",
+ "@angular/core": "2.4.3",
+ "@angular/forms": "2.4.3",
+ "@angular/http": "2.4.3",
+ "@angular/platform-browser": "2.4.3",
+ "@angular/platform-browser-dynamic": "2.4.3",
+ "systemjs": "0.19.27",
+ "core-js": "^2.4.1",
+ "reflect-metadata": "^0.1.3",
+ "rxjs": "5.0.3",
+ "zone.js": "^0.7.0",
+ "bootstrap": "^3.3.6"
+ },
+ "devDependencies": {
+ "canonical-path": "0.0.2",
+ "concurrently": "^2.2.0",
+ "copyfiles": "^1.0.0",
+ "http-server": "^0.9.0",
+ "jasmine": "^2.5.3",
+ "jasmine-core": "^2.5.2",
+ "karma": "^1.5.0",
+ "karma-jasmine": "^1.1.0",
+ "live-server": "^1.1.0",
+ "lodash": "^4.11.1",
+ "npm-watch": "^0.1.6",
+ "onchange": "^3.0.2",
+ "rimraf": "^2.5.2",
+ "tslint": "^3.7.4",
+ "typescript": "^2.0.2",
+ "typings": "^1.0.4"
+ },
+ "repository": {}
+}
diff --git a/blog-complete/styles.css b/blog-complete/styles.css
new file mode 100644
index 0000000..0aa72d4
--- /dev/null
+++ b/blog-complete/styles.css
@@ -0,0 +1,65 @@
+body {
+ font-family: Helvetica;
+ padding-left: 15px;
+}
+
+.form {
+ background-color: #eee;
+ width: 580px; /* Breite des Formulars */
+ padding: 20px;
+ border: 1px solid #8c8c8c;
+ position: absolute;
+ margin-bottom: 25px;
+}
+
+.control {
+ display: flex;
+}
+
+label {
+ width: 100px;
+ cursor: pointer;
+}
+
+input,
+textarea {
+ width: 550px;
+ border: 1px solid #8c8c8c;
+ margin-bottom: 1em;
+}
+
+span.title {
+ font-size: x-large;
+}
+
+.clear-fix {
+ clear: both;
+}
+
+.blog-entry {
+ width: 600px;
+ display: flex;
+ padding-bottom: 30px;
+}
+
+button {
+ float: right;
+ padding-right: 20px;
+}
+
+.blog-image {
+ width: 30%;
+}
+
+img {
+ max-width: 90%;
+ max-height: 100px;
+}
+
+.blog-summary {
+ width: 70%;
+}
+
+textarea {
+ height: 7em;
+}
\ No newline at end of file
diff --git a/blog-complete/systemjs.config.js b/blog-complete/systemjs.config.js
new file mode 100644
index 0000000..504b0d2
--- /dev/null
+++ b/blog-complete/systemjs.config.js
@@ -0,0 +1,61 @@
+/**
+ * System configuration for Angular 2 samples
+ * Adjust as necessary for your application needs.
+ */
+(function (global) {
+ System.config({
+ paths: {
+ // paths serve as alias
+ 'npm:': 'node_modules/'
+ },
+ // map tells the System loader where to look for things
+ map: {
+ // our app is within the app folder
+ 'app': 'dist',
+
+ // angular bundles
+ '@angular/core': 'node_modules/@angular/core/bundles/core.umd.js',
+ '@angular/common': 'npm:@angular/common/bundles/common.umd.js',
+ '@angular/compiler': 'npm:@angular/compiler/bundles/compiler.umd.js',
+ '@angular/platform-browser': 'npm:@angular/platform-browser/bundles/platform-browser.umd.js',
+ '@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.js',
+ '@angular/http': 'npm:@angular/http/bundles/http.umd.js',
+ '@angular/router': 'npm:@angular/router/bundles/router.umd.js',
+ '@angular/forms': 'npm:@angular/forms/bundles/forms.umd.js',
+
+ // other libraries
+ 'rxjs': 'npm:rxjs',
+ 'angular2-in-memory-web-api': 'npm:angular2-in-memory-web-api',
+ },
+ // packages tells the System loader how to load when no filename and/or no extension
+ packages: {
+ app: {
+ main: './main.js',
+ defaultExtension: 'js'
+ },
+ rxjs: {
+ defaultExtension: 'js'
+ },
+ 'angular2-in-memory-web-api': {
+ main: './index.js',
+ defaultExtension: 'js'
+ }
+ }
+ });
+})(this);
+
+System.config({
+ paths: {
+ // paths serve as alias
+ 'npm:': 'node_modules/'
+ },
+ map: {
+ 'app': 'dist', // Kompilierte Anwendung liegt im dist-Verzeichnis
+ '@angular/core': 'node_modules/@angular/core/bundles/core.umd.js',
+ 'rxjs': 'node_modules/rxjs',
+ },
+ packages: {
+ app: { main: './main.js', defaultExtension: 'js' },
+ rxjs: { defaultExtension: 'js' },
+ }
+});
diff --git a/blog-complete/tsconfig.json b/blog-complete/tsconfig.json
new file mode 100644
index 0000000..2857a1f
--- /dev/null
+++ b/blog-complete/tsconfig.json
@@ -0,0 +1,18 @@
+{
+ "compilerOptions": {
+ "outDir": "dist",
+ "target": "es5",
+ "module": "commonjs",
+ "moduleResolution": "node",
+ "sourceMap": true,
+ "lib": [
+ "es6",
+ "dom"
+ ],
+ "emitDecoratorMetadata": true,
+ "experimentalDecorators": true,
+ "removeComments": false,
+ "noImplicitAny": true,
+ "suppressImplicitAnyIndexErrors": true
+ }
+}
diff --git a/blog-complete/typings.d.ts b/blog-complete/typings.d.ts
new file mode 100644
index 0000000..6ed0217
--- /dev/null
+++ b/blog-complete/typings.d.ts
@@ -0,0 +1 @@
+declare var module: any;
diff --git a/project-manager-reactive/createTaskFailure.png b/project-manager-reactive/createTaskFailure.png
deleted file mode 100644
index 44cf2f7..0000000
Binary files a/project-manager-reactive/createTaskFailure.png and /dev/null differ
diff --git a/project-manager-reactive/projects-server/test.json b/project-manager-reactive/projects-server/test.json
index 9d31a12..7506597 100644
--- a/project-manager-reactive/projects-server/test.json
+++ b/project-manager-reactive/projects-server/test.json
@@ -43,6 +43,20 @@
"state": "IN_PROGRESS",
"title": "New Task",
"id": 7
+ },
+ {
+ "assignee": {},
+ "tags": [],
+ "state": "IN_PROGRESS",
+ "title": "New Task 1487974284967",
+ "id": 8
+ },
+ {
+ "assignee": {},
+ "tags": [],
+ "state": "IN_PROGRESS",
+ "title": "New Task",
+ "id": 9
}
]
}
\ No newline at end of file