<!DOCTYPE html>
<html>
<head>
<base href="." />
<title>AngularCli Todo</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.97.8/css/materialize.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.js"></script>
<link rel="stylesheet" href="style.css" />
<script src="https://unpkg.com/zone.js@0.6.25?main=browser"></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 type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/hammer.js/2.0.6/hammer.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.97.5/js/materialize.min.js"></script>
<script src="config.js"></script>
<script>
System.import('app')
.catch(console.error.bind(console));
</script>
</head>
<body>
<app-root>
loading...
</app-root>
</body>
</html>
body {
background-color: lightgray;
}
### Angular Starter Plunker - Typescript
System.config({
//use typescript for compilation
transpiler: 'typescript',
//typescript compiler options
typescriptOptions: {
emitDecoratorMetadata: true
},
paths: {
'npm:': 'https://unpkg.com/',
'ng2-restangular': 'http://code.2muchcoffee.com/ng2-restangular/0.1.22/esm/src'
},
//map tells the System loader where to look for things
map: {
'app': './src',
'@angular/core': 'npm:@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',
'@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',
'typescript': 'npm:typescript@2.0.2/lib/typescript.js',
'materialize-css': 'npm:materialize-css',
'materialize': 'npm:angular2-materialize',
'angular2-materialize': 'npm:angular2-materialize',
//'angular2-materialize': 'npm:angular2-materialize@6.3.0/dist',
'ng2-restangular': 'ng2-restangular',
'rxjs': 'npm:rxjs',
'lodash': 'npm:lodash'
},
//packages defines our app package
packages: {
app: {
main: './main.ts',
defaultExtension: 'ts'
},
rxjs: {
main: "./Rx.js",
defaultExtension: 'js'
},
lodash: {
main: './index.js',
defaultExtension: 'js'
},
"ng2-restangular": {
main: './index',
defaultExtension: 'js'
},
"materialize-css": {
"main": "dist/js/materialize"
},
"materialize": {
"main": "dist/materialize-directive",
"defaultExtension": "js"
},
"angular2-materialize": {
"main": "dist/index",
"defaultExtension": "js"
}
}
});
//main entry point
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app/app.module';
platformBrowserDynamic().bootstrapModule(AppModule);
//our root app component
import {NgModule} from '@angular/core';
import {CoreModule} from './core/core.module'
import {AppComponent} from './app.component';
import {MaterializeDirective} from "angular2-materialize";
import {FormsModule} from "@angular/forms";
import {CommonModule} from "@angular/common";
@NgModule({
declarations: [AppComponent,
MaterializeDirective
],
imports: [ CoreModule,
FormsModule,
CommonModule
],
declarations: [ AppComponent ],
bootstrap: [ AppComponent ]
})
export class AppModule {}
export class TodoModel {
completed: boolean;
title: string;
constructor(title: string) {
this.completed = false;
this.title = title;
}
}
import {Injectable} from '@angular/core'
import {Restangular} from "ng2-restangular";
@Injectable()
export class RestService {
constructor(private restangular: Restangular) {}
//methods
getTodoList() {
let list = this.restangular.all("list").getList();
return list;
}
addTodo(todo) {
return this.restangular.all("list").post(todo);
}
removeTodo(todo) {
return todo.remove();
}
}
export const TITLE: string = 'My todo list';
import {BrowserModule} from '@angular/platform-browser';
import {NgModule, Optional, SkipSelf} from '@angular/core';
import {HttpModule} from '@angular/http';
import {RestangularModule} from 'ng2-restangular';
import {RestService} from "../services/rest.service";
export function restangular (RestangularProvider) {
RestangularProvider.setBaseUrl('https://todos-876a.restdb.io/rest/');
RestangularProvider.setDefaultRequestParams({
apikey: '586680ad69ce295b1738efe5'
});
RestangularProvider.setRestangularFields({
id: "_id"
});
}
@NgModule({
declarations: [
],
imports: [
BrowserModule,
HttpModule,
RestangularModule.forRoot( restangular
),
],
providers: [RestService],
})
export class CoreModule {
constructor(@Optional() @SkipSelf() parentModule: CoreModule) {
if (parentModule) {
throw new Error(
'CoreModule is already loaded. Import it in the AppModule only');
}
}
}
import {Component} from '@angular/core';
import {RestService} from "./services/rest.service";
import {TodoModel} from "./models/todo.model";
import {TITLE} from "./share/const"
import * as _ from 'lodash';
import {Subject} from "rxjs";
@Component({
selector: 'app-root',
templateUrl: './src/app/app.component.html',
styleUrls: ['./src/app/app.component.css']
})
export class AppComponent {
title = TITLE;
inputText: string;
edit: boolean = false;
public todoList;
private _editTodo;
private changeStatus$ = new Subject();
constructor(private restService: RestService,) {
}
ngOnInit() {
this.restService.getTodoList().subscribe(
(res) => {
this.todoList = res;
},
(err) => {
console.log(err);
});
this.changeStatus$.debounceTime(1500)
.subscribe(todo => {
this.saveTodo(todo);
})
}
addTodo() {
let todo: TodoModel = new TodoModel(this.inputText); //!
this.restService.addTodo(todo).subscribe(
(res) => {
this.todoList.push(res);
},
(err) => {
console.log(err)
}
);
this.inputText = "";
}
removeTodo(todo): void {
this.restService.removeTodo(todo).subscribe(
(res) => {
_.remove(this.todoList, {_id: res.result[0]});
},
(err) => {
console.log(err)
}
);
}
editTodo(todo): void {
this.edit = true;
this._editTodo = todo;
this.inputText = todo.title;
}
saveTodo(editTodo) {
editTodo.put().subscribe(
(res) => {
},
(err) => {
console.log(err);
}
);
}
changeCompleted(todo) {
this.changeStatus$.next(todo);
}
saveTodoTittle() {
this._editTodo.title = this.inputText;
this.saveTodo(this._editTodo);
this.edit = false;
this._editTodo = null;
this.inputText = "";
}
}
.center-align {
font-size: 70px;
color: white;
}
li.row {
margin-bottom: 0;
}
li.row > div > .card > .card-content {
font-size: 20px;
padding-bottom: 2px;
}
li.row > div > .card > .card-content > .card-action {
padding-left: 0;
}
<section class="container">
<h1 class="center-align">
{{title}}
</h1>
<input type=text name="todo" id="todo" placeholder="What needs to be done?"
[(ngModel)]="inputText">
<button *ngIf="!edit" (click)="addTodo()" class="waves-effect waves-light btn">Add</button>
<button *ngIf="edit" (click)="saveTodoTittle()" class="waves-effect waves-light btn">Save</button>
<ul *ngIf="todoList">
<li *ngFor="let todo of todoList" class="row">
<div class="col s12 m8 offset-m2">
<div class="card blue-grey darken-1">
<div class="card-content white-text">
<div class="switch">
<label>
Uncompleted
<input type="checkbox"
[(ngModel)]="todo.completed"
(change)="changeCompleted(todo)">
<span class="lever"></span>
Completed
</label>
</div>
<span (dblclick)="editTodo(todo)">{{todo.title}}</span>
<div class="card-action">
<a (click)="removeTodo(todo)" class="waves-effect waves-light btn">Delete</a>
<a (click)="editTodo(todo)" class="waves-effect waves-light btn">Edit</a>
</div>
</div>
</div>
</div>
</li>
</ul>
</section>