From cf68d405c98cd8cea6428b8bed0bec6f7c53841c Mon Sep 17 00:00:00 2001 From: Your NameSuraj Date: Sun, 5 Feb 2017 03:36:40 +0530 Subject: [PATCH] initial --- .editorconfig | 13 +++ .gitignore | 40 +++++++ angular-cli.json | 63 +++++++++++ e2e/app.e2e-spec.ts | 14 +++ e2e/app.po.ts | 11 ++ e2e/tsconfig.json | 16 +++ karma.conf.js | 43 +++++++ package.json | 52 +++++++++ protractor.conf.js | 32 ++++++ src/app/api.service.spec.ts | 16 +++ src/app/api.service.ts | 29 +++++ src/app/app.component.css | 13 +++ src/app/app.component.html | 12 ++ src/app/app.component.spec.ts | 34 ++++++ src/app/app.component.ts | 13 +++ src/app/app.module.ts | 42 +++++++ .../add-edit/add-edit.component.css | 14 +++ .../add-edit/add-edit.component.html | 34 ++++++ .../add-edit/add-edit.component.spec.ts | 28 +++++ .../components/add-edit/add-edit.component.ts | 35 ++++++ .../components/loader/loader.component.css | 0 .../components/loader/loader.component.html | 5 + .../loader/loader.component.spec.ts | 28 +++++ src/app/components/loader/loader.component.ts | 14 +++ src/app/components/tasks/tasks.component.css | 33 ++++++ src/app/components/tasks/tasks.component.html | 39 +++++++ .../components/tasks/tasks.component.spec.ts | 28 +++++ src/app/components/tasks/tasks.component.ts | 61 ++++++++++ src/app/models/task.ts | 12 ++ src/assets/.gitkeep | 0 src/balls.gif | Bin 0 -> 26917 bytes src/environments/environment.prod.ts | 3 + src/environments/environment.ts | 8 ++ src/favicon.ico | Bin 0 -> 5430 bytes src/index.html | 17 +++ src/main.ts | 12 ++ src/polyfills.ts | 19 ++++ src/styles.css | 23 ++++ src/test.ts | 32 ++++++ src/tsconfig.json | 25 ++++ tslint.json | 107 ++++++++++++++++++ 41 files changed, 1020 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 angular-cli.json create mode 100644 e2e/app.e2e-spec.ts create mode 100644 e2e/app.po.ts create mode 100644 e2e/tsconfig.json create mode 100644 karma.conf.js create mode 100644 package.json create mode 100644 protractor.conf.js create mode 100644 src/app/api.service.spec.ts create mode 100644 src/app/api.service.ts create mode 100644 src/app/app.component.css create mode 100644 src/app/app.component.html create mode 100644 src/app/app.component.spec.ts create mode 100644 src/app/app.component.ts create mode 100644 src/app/app.module.ts create mode 100644 src/app/components/add-edit/add-edit.component.css create mode 100644 src/app/components/add-edit/add-edit.component.html create mode 100644 src/app/components/add-edit/add-edit.component.spec.ts create mode 100644 src/app/components/add-edit/add-edit.component.ts create mode 100644 src/app/components/loader/loader.component.css create mode 100644 src/app/components/loader/loader.component.html create mode 100644 src/app/components/loader/loader.component.spec.ts create mode 100644 src/app/components/loader/loader.component.ts create mode 100644 src/app/components/tasks/tasks.component.css create mode 100644 src/app/components/tasks/tasks.component.html create mode 100644 src/app/components/tasks/tasks.component.spec.ts create mode 100644 src/app/components/tasks/tasks.component.ts create mode 100644 src/app/models/task.ts create mode 100644 src/assets/.gitkeep create mode 100644 src/balls.gif create mode 100644 src/environments/environment.prod.ts create mode 100644 src/environments/environment.ts create mode 100644 src/favicon.ico create mode 100644 src/index.html create mode 100644 src/main.ts create mode 100644 src/polyfills.ts create mode 100644 src/styles.css create mode 100644 src/test.ts create mode 100644 src/tsconfig.json create mode 100644 tslint.json diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..6e87a00 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,13 @@ +# Editor configuration, see 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 = off +trim_trailing_whitespace = false diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fe6f8a7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,40 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp + +# dependencies +/node_modules + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +# misc +/.sass-cache +/connect.lock +/coverage/* +/libpeerconnection.log +npm-debug.log +testem.log +/typings + +# e2e +/e2e/*.js +/e2e/*.map + +#System Files +.DS_Store +Thumbs.db diff --git a/angular-cli.json b/angular-cli.json new file mode 100644 index 0000000..6de31dc --- /dev/null +++ b/angular-cli.json @@ -0,0 +1,63 @@ +{ + "project": { + "version": "1.0.0-beta.24", + "name": "to-do-app" + }, + "apps": [ + { + "root": "src", + "outDir": "dist", + "assets": [ + "assets", + "favicon.ico", + "balls.gif" + ], + "index": "index.html", + "main": "main.ts", + "test": "test.ts", + "tsconfig": "tsconfig.json", + "prefix": "app", + "mobile": false, + "styles": [ + "styles.css","../node_modules/bootstrap/dist/css/bootstrap.min.css" + ], + "scripts": [ + "../node_modules/jquery/dist/jquery.min.js", + "../node_modules/bootstrap/dist/js/bootstrap.min.js" + ], + "environments": { + "source": "environments/environment.ts", + "dev": "environments/environment.ts", + "prod": "environments/environment.prod.ts" + } + } + ], + "addons": [], + "packages": [], + "e2e": { + "protractor": { + "config": "./protractor.conf.js" + } + }, + "test": { + "karma": { + "config": "./karma.conf.js" + } + }, + "defaults": { + "styleExt": "css", + "prefixInterfaces": false, + "inline": { + "style": false, + "template": false + }, + "spec": { + "class": false, + "component": true, + "directive": true, + "module": false, + "pipe": true, + "service": true + } + } +} diff --git a/e2e/app.e2e-spec.ts b/e2e/app.e2e-spec.ts new file mode 100644 index 0000000..74756e9 --- /dev/null +++ b/e2e/app.e2e-spec.ts @@ -0,0 +1,14 @@ +import { ToDoAppPage } from './app.po'; + +describe('to-do-app App', function() { + let page: ToDoAppPage; + + beforeEach(() => { + page = new ToDoAppPage(); + }); + + it('should display message saying app works', () => { + page.navigateTo(); + expect(page.getParagraphText()).toEqual('app works!'); + }); +}); diff --git a/e2e/app.po.ts b/e2e/app.po.ts new file mode 100644 index 0000000..74ce402 --- /dev/null +++ b/e2e/app.po.ts @@ -0,0 +1,11 @@ +import { browser, element, by } from 'protractor'; + +export class ToDoAppPage { + navigateTo() { + return browser.get('/'); + } + + getParagraphText() { + return element(by.css('app-root h1')).getText(); + } +} diff --git a/e2e/tsconfig.json b/e2e/tsconfig.json new file mode 100644 index 0000000..656bdb1 --- /dev/null +++ b/e2e/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "declaration": false, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "module": "commonjs", + "moduleResolution": "node", + "outDir": "../dist/out-tsc-e2e", + "sourceMap": true, + "target": "es5", + "typeRoots": [ + "../node_modules/@types" + ] + } +} diff --git a/karma.conf.js b/karma.conf.js new file mode 100644 index 0000000..1f2613a --- /dev/null +++ b/karma.conf.js @@ -0,0 +1,43 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/0.13/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', 'angular-cli'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-remap-istanbul'), + require('angular-cli/plugins/karma') + ], + files: [ + { pattern: './src/test.ts', watched: false } + ], + preprocessors: { + './src/test.ts': ['angular-cli'] + }, + mime: { + 'text/x-typescript': ['ts','tsx'] + }, + remapIstanbulReporter: { + reports: { + html: 'coverage', + lcovonly: './coverage/coverage.lcov' + } + }, + angularCli: { + config: './angular-cli.json', + environment: 'dev' + }, + reporters: config.angularCli && config.angularCli.codeCoverage + ? ['progress', 'karma-remap-istanbul'] + : ['progress'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false + }); +}; diff --git a/package.json b/package.json new file mode 100644 index 0000000..9078293 --- /dev/null +++ b/package.json @@ -0,0 +1,52 @@ +{ + "name": "to-do-app", + "version": "0.0.0", + "license": "MIT", + "angular-cli": {}, + "scripts": { + "ng": "ng", + "start": "ng serve", + "lint": "tslint \"src/**/*.ts\"", + "test": "ng test", + "pree2e": "webdriver-manager update --standalone false --gecko false", + "e2e": "protractor" + }, + "private": true, + "dependencies": { + "@angular/common": "^2.3.1", + "@angular/compiler": "^2.3.1", + "@angular/core": "^2.3.1", + "@angular/forms": "^2.3.1", + "@angular/http": "^2.3.1", + "@angular/platform-browser": "^2.3.1", + "@angular/platform-browser-dynamic": "^2.3.1", + "@angular/router": "^3.3.1", + "angularfire2": "^2.0.0-beta.7", + "bootstrap": "^3.3.7", + "core-js": "^2.4.1", + "firebase": "^3.6.8", + "jquery": "^3.1.1", + "ng2-bootstrap": "^1.3.3", + "rxjs": "^5.0.1", + "ts-helpers": "^1.1.1", + "zone.js": "^0.7.2" + }, + "devDependencies": { + "@angular/compiler-cli": "^2.3.1", + "@types/jasmine": "2.5.38", + "@types/node": "^6.0.42", + "angular-cli": "1.0.0-beta.24", + "codelyzer": "~2.0.0-beta.1", + "jasmine-core": "2.5.2", + "jasmine-spec-reporter": "2.5.0", + "karma": "1.2.0", + "karma-chrome-launcher": "^2.0.0", + "karma-cli": "^1.0.1", + "karma-jasmine": "^1.0.2", + "karma-remap-istanbul": "^0.2.1", + "protractor": "~4.0.13", + "ts-node": "1.2.1", + "tslint": "^4.0.2", + "typescript": "~2.0.3" + } +} diff --git a/protractor.conf.js b/protractor.conf.js new file mode 100644 index 0000000..ffded70 --- /dev/null +++ b/protractor.conf.js @@ -0,0 +1,32 @@ +// Protractor configuration file, see link for more information +// https://github.com/angular/protractor/blob/master/lib/config.ts + +/*global jasmine */ +var SpecReporter = require('jasmine-spec-reporter'); + +exports.config = { + allScriptsTimeout: 11000, + specs: [ + './e2e/**/*.e2e-spec.ts' + ], + capabilities: { + 'browserName': 'chrome' + }, + directConnect: true, + baseUrl: 'http://localhost:4200/', + framework: 'jasmine', + jasmineNodeOpts: { + showColors: true, + defaultTimeoutInterval: 30000, + print: function() {} + }, + useAllAngular2AppRoots: true, + beforeLaunch: function() { + require('ts-node').register({ + project: 'e2e' + }); + }, + onPrepare: function() { + jasmine.getEnv().addReporter(new SpecReporter()); + } +}; diff --git a/src/app/api.service.spec.ts b/src/app/api.service.spec.ts new file mode 100644 index 0000000..b525153 --- /dev/null +++ b/src/app/api.service.spec.ts @@ -0,0 +1,16 @@ +/* tslint:disable:no-unused-variable */ + +import { TestBed, async, inject } from '@angular/core/testing'; +import { ApiService } from './api.service'; + +describe('ApiService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [ApiService] + }); + }); + + it('should ...', inject([ApiService], (service: ApiService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/src/app/api.service.ts b/src/app/api.service.ts new file mode 100644 index 0000000..0a0c3e1 --- /dev/null +++ b/src/app/api.service.ts @@ -0,0 +1,29 @@ +import { Injectable } from '@angular/core'; +import { AngularFire, FirebaseListObservable } from "angularfire2"; +import 'rxjs/Rx'; +import { Observable } from 'rxjs/Rx'; + +import { ITask, } from './models/task'; + +@Injectable() +export class ApiService { + private tasks: FirebaseListObservable; + constructor(private af: AngularFire) { + this.tasks = this.af.database.list('tasks') + } + getData() { + return this.tasks; + } + + createTask(task){ + return this.tasks.push(task); + } + + updateTask(task){ + return this.tasks.update(task.$key, task); + } + + removeTask(task) { + return this.tasks.remove(task.$key); + } +} diff --git a/src/app/app.component.css b/src/app/app.component.css new file mode 100644 index 0000000..ee5d173 --- /dev/null +++ b/src/app/app.component.css @@ -0,0 +1,13 @@ +.navbar-default +{ + background-color: #c9302c; + border:none; + border-radius: 0; +} +.navbar-brand +{ + color: white; +} +/*.loader-container{ + position: relative; +}*/ \ No newline at end of file diff --git a/src/app/app.component.html b/src/app/app.component.html new file mode 100644 index 0000000..5dfec0c --- /dev/null +++ b/src/app/app.component.html @@ -0,0 +1,12 @@ + +
+ +
\ No newline at end of file diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts new file mode 100644 index 0000000..3ad633e --- /dev/null +++ b/src/app/app.component.spec.ts @@ -0,0 +1,34 @@ +/* tslint:disable:no-unused-variable */ + +import { TestBed, async } from '@angular/core/testing'; +import { AppComponent } from './app.component'; + +describe('AppComponent', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [ + AppComponent + ], + }); + TestBed.compileComponents(); + }); + + it('should create the app', async(() => { + let fixture = TestBed.createComponent(AppComponent); + let app = fixture.debugElement.componentInstance; + expect(app).toBeTruthy(); + })); + + it(`should have as title 'app works!'`, async(() => { + let fixture = TestBed.createComponent(AppComponent); + let app = fixture.debugElement.componentInstance; + expect(app.title).toEqual('app works!'); + })); + + it('should render title in a h1 tag', async(() => { + let fixture = TestBed.createComponent(AppComponent); + fixture.detectChanges(); + let compiled = fixture.debugElement.nativeElement; + expect(compiled.querySelector('h1').textContent).toContain('app works!'); + })); +}); diff --git a/src/app/app.component.ts b/src/app/app.component.ts new file mode 100644 index 0000000..ba80b70 --- /dev/null +++ b/src/app/app.component.ts @@ -0,0 +1,13 @@ +import { Component } from '@angular/core'; + + +import {Task} from './models/task'; + +@Component({ + selector: 'app-root', + templateUrl: './app.component.html', + styleUrls: ['./app.component.css'] +}) +export class AppComponent { + title:string = 'To Do App'; + } diff --git a/src/app/app.module.ts b/src/app/app.module.ts new file mode 100644 index 0000000..a6730ca --- /dev/null +++ b/src/app/app.module.ts @@ -0,0 +1,42 @@ +import { BrowserModule } from '@angular/platform-browser'; +import { NgModule } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { HttpModule } from '@angular/http'; +import { + AngularFireModule, + AuthMethods, + AuthProviders +} from "angularfire2"; + +import {ApiService} from './api.service'; +import { AppComponent } from './app.component'; +import { TasksComponent } from './components/tasks/tasks.component'; +import { AddEditComponent } from './components/add-edit/add-edit.component'; +import { LoaderComponent } from './components/loader/loader.component'; + +const firebaseConfig = { + apiKey: "AIzaSyB5R-7qXKQ6Iy-7CxWf6TVQzxMzX3_j9ss", + authDomain: "tutorapps.firebaseapp.com", + databaseURL: "https://tutorapps.firebaseio.com", + storageBucket: "firebase-tutorapps.appspot.com", + messagingSenderId: "1046096271852" +}; + + +@NgModule({ + declarations: [ + AppComponent, + TasksComponent, + AddEditComponent, + LoaderComponent, + ], + imports: [ + BrowserModule, + FormsModule, + HttpModule, + AngularFireModule.initializeApp(firebaseConfig) + ], + providers: [ApiService], + bootstrap: [AppComponent] +}) +export class AppModule { } diff --git a/src/app/components/add-edit/add-edit.component.css b/src/app/components/add-edit/add-edit.component.css new file mode 100644 index 0000000..c9a4a8a --- /dev/null +++ b/src/app/components/add-edit/add-edit.component.css @@ -0,0 +1,14 @@ +.modal-header +{ + background-color: #e5e5e5; + border-top-right-radius: 5px; + border-top-left-radius: 5px; +} +.form-control:focus { + border-color: #d9534f; + outline: 0; + box-shadow: inset 0 1px 1px rgba(217,83,79,.075), 0 0 8px rgba(217,83,79,.6); +} +/*#modal select option:hover, #modal select option:selected, #modal select option:focus{ + background-color: #d9534f; +}*/ \ No newline at end of file diff --git a/src/app/components/add-edit/add-edit.component.html b/src/app/components/add-edit/add-edit.component.html new file mode 100644 index 0000000..ee03fbd --- /dev/null +++ b/src/app/components/add-edit/add-edit.component.html @@ -0,0 +1,34 @@ + \ No newline at end of file diff --git a/src/app/components/add-edit/add-edit.component.spec.ts b/src/app/components/add-edit/add-edit.component.spec.ts new file mode 100644 index 0000000..9234fa1 --- /dev/null +++ b/src/app/components/add-edit/add-edit.component.spec.ts @@ -0,0 +1,28 @@ +/* tslint:disable:no-unused-variable */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { DebugElement } from '@angular/core'; + +import { AddEditComponent } from './add-edit.component'; + +describe('AddEditComponent', () => { + let component: AddEditComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ AddEditComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AddEditComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/add-edit/add-edit.component.ts b/src/app/components/add-edit/add-edit.component.ts new file mode 100644 index 0000000..9837e7f --- /dev/null +++ b/src/app/components/add-edit/add-edit.component.ts @@ -0,0 +1,35 @@ +import { Component, OnChanges, Input, SimpleChanges,Output, EventEmitter } from '@angular/core'; +declare var $; +@Component({ + selector: 'app-add-edit', + templateUrl: './add-edit.component.html', + styleUrls: ['./add-edit.component.css'] +}) +export class AddEditComponent implements OnChanges { + @Input() task; + @Output() addUpdate = new EventEmitter(); + modalHeader: string = ""; + constructor() { + + } + + ngOnChanges(changes) { + if (changes.task.currentValue.status) { + this.modalHeader = changes.task.currentValue.title ? "Edit Task" : "Add Task"; + this.openModal(); + } + else + this.closeModal(); + } + openModal() { + $('#modal').modal({ backdrop: 'static' }); + } + + closeModal(){ + $('#modal').modal('hide'); + } + + saveData(){ + this.addUpdate.emit(this.task); + } +} diff --git a/src/app/components/loader/loader.component.css b/src/app/components/loader/loader.component.css new file mode 100644 index 0000000..e69de29 diff --git a/src/app/components/loader/loader.component.html b/src/app/components/loader/loader.component.html new file mode 100644 index 0000000..7b6a002 --- /dev/null +++ b/src/app/components/loader/loader.component.html @@ -0,0 +1,5 @@ +
+ +
+
+
\ No newline at end of file diff --git a/src/app/components/loader/loader.component.spec.ts b/src/app/components/loader/loader.component.spec.ts new file mode 100644 index 0000000..f46d098 --- /dev/null +++ b/src/app/components/loader/loader.component.spec.ts @@ -0,0 +1,28 @@ +/* tslint:disable:no-unused-variable */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { DebugElement } from '@angular/core'; + +import { LoaderComponent } from './loader.component'; + +describe('LoaderComponent', () => { + let component: LoaderComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ LoaderComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(LoaderComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/loader/loader.component.ts b/src/app/components/loader/loader.component.ts new file mode 100644 index 0000000..681b68d --- /dev/null +++ b/src/app/components/loader/loader.component.ts @@ -0,0 +1,14 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-loader', + templateUrl: './loader.component.html', + styleUrls: ['./loader.component.css'] +}) +export class LoaderComponent { + + constructor() { + + } + +} diff --git a/src/app/components/tasks/tasks.component.css b/src/app/components/tasks/tasks.component.css new file mode 100644 index 0000000..6b15041 --- /dev/null +++ b/src/app/components/tasks/tasks.component.css @@ -0,0 +1,33 @@ +h4{ + text-align: center; +} +h4 button{ + float: right; + margin-right: 40px; +} +.edit-action{ + margin: 0 5px; + color: orange; + opacity: .5; + font-size: 1.2em; +} + +.delete-action{ + margin: 0 5px; + color: red; + opacity: .5; + font-size: 1.2em; +} + +.edit-action:hover, .delete-action:hover{ + opacity: 1; + animation: roll 1s; +} +@keyframes roll { + 0% { + transform: rotate(0); + } + 100% { + transform: rotate(360deg); + } +} diff --git a/src/app/components/tasks/tasks.component.html b/src/app/components/tasks/tasks.component.html new file mode 100644 index 0000000..45d6dba --- /dev/null +++ b/src/app/components/tasks/tasks.component.html @@ -0,0 +1,39 @@ + +
+
+
+
+ + + + + + + + + + + + + + + + + + + +
#IdTitleStatusAction
{{i}}{{task.id}}{{task.title}}{{task.status}} + + +
+
+
+
+
+ + + \ No newline at end of file diff --git a/src/app/components/tasks/tasks.component.spec.ts b/src/app/components/tasks/tasks.component.spec.ts new file mode 100644 index 0000000..7b7cac8 --- /dev/null +++ b/src/app/components/tasks/tasks.component.spec.ts @@ -0,0 +1,28 @@ +/* tslint:disable:no-unused-variable */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { DebugElement } from '@angular/core'; + +import { TasksComponent } from './tasks.component'; + +describe('TasksComponent', () => { + let component: TasksComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ TasksComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(TasksComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/tasks/tasks.component.ts b/src/app/components/tasks/tasks.component.ts new file mode 100644 index 0000000..d11c8fd --- /dev/null +++ b/src/app/components/tasks/tasks.component.ts @@ -0,0 +1,61 @@ +import { Component, OnInit, Input } from '@angular/core'; +import { ApiService } from '../../api.service'; +import { ITask } from '../../models/task'; + +@Component({ + selector: 'app-tasks', + templateUrl: './tasks.component.html', + styleUrls: ['./tasks.component.css'] +}) +export class TasksComponent implements OnInit { + tasks = Array(); + currentTask = {}; + showLoader: boolean = true; + constructor(private apiService: ApiService) { + + } + + ngOnInit() { + this.getTasks(); + } + getTasks() { + this.apiService.getData() + .subscribe(data => { + this.tasks = data; + this.showLoader = false; + }) + } + + addTask() { + this.currentTask = { id: this.nextTaskId(), title: "", status: "Pending" }; + } + + editTask(task: ITask) { + this.currentTask = task; + } + deleteTask(task) { + this.apiService.removeTask(task); + } + + handleAddUpdate($event) { + if ($event.hasOwnProperty('$key')) { + this.apiService.updateTask($event).then(()=> { + this.showLoader = false; + this.currentTask = {}; + },(error)=> { + alert("Some Error Occured"); + }) + } + else{ + this.apiService.createTask($event).then(() => { + this.currentTask = {}; + }) + + } + + } + nextTaskId() { + return this.tasks.length > 0 ? this.tasks[this.tasks.length - 1].id + 1 : 1; + } + +} diff --git a/src/app/models/task.ts b/src/app/models/task.ts new file mode 100644 index 0000000..db406dc --- /dev/null +++ b/src/app/models/task.ts @@ -0,0 +1,12 @@ +export class Task{ + id:number; + title: string; + status: string; + $key?: string; +} +export interface ITask { + $key?: string; + status: boolean; + title: string; + id: number; +} \ No newline at end of file diff --git a/src/assets/.gitkeep b/src/assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/balls.gif b/src/balls.gif new file mode 100644 index 0000000000000000000000000000000000000000..a964622f5ce348b73338a924f8256d714c62c8d0 GIT binary patch literal 26917 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 humW;*g7R+&|Ledvc- + + + + ToDoApp + + + + + + + +
+
+
+ + diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..ac78a71 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,12 @@ +import './polyfills.ts'; + +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; +import { enableProdMode } from '@angular/core'; +import { environment } from './environments/environment'; +import { AppModule } from './app/app.module'; + +if (environment.production) { + enableProdMode(); +} + +platformBrowserDynamic().bootstrapModule(AppModule); diff --git a/src/polyfills.ts b/src/polyfills.ts new file mode 100644 index 0000000..3b4c55b --- /dev/null +++ b/src/polyfills.ts @@ -0,0 +1,19 @@ +// This file includes polyfills needed by Angular 2 and is loaded before +// the app. You can add your own extra polyfills to this file. +import 'core-js/es6/symbol'; +import 'core-js/es6/object'; +import 'core-js/es6/function'; +import 'core-js/es6/parse-int'; +import 'core-js/es6/parse-float'; +import 'core-js/es6/number'; +import 'core-js/es6/math'; +import 'core-js/es6/string'; +import 'core-js/es6/date'; +import 'core-js/es6/array'; +import 'core-js/es6/regexp'; +import 'core-js/es6/map'; +import 'core-js/es6/set'; +import 'core-js/es6/reflect'; + +import 'core-js/es7/reflect'; +import 'zone.js/dist/zone'; diff --git a/src/styles.css b/src/styles.css new file mode 100644 index 0000000..9961065 --- /dev/null +++ b/src/styles.css @@ -0,0 +1,23 @@ +/* You can add global styles to this file, and also import other style files */ +html{ + height: 100%; +} +body{ + position: relative; + width:100%; + height:100%; +} +.loader{ + position: absolute; + top:0; + width: 100%; + height: 100%; + opacity: .9; + background-color: #FFFFFF; +} +.loading-overlay{ + background: url("./balls.gif") no-repeat center center; + margin-top: 250px; + height: 150px; + background-color: #DDD; +} \ No newline at end of file diff --git a/src/test.ts b/src/test.ts new file mode 100644 index 0000000..be44dc5 --- /dev/null +++ b/src/test.ts @@ -0,0 +1,32 @@ +import './polyfills.ts'; + +import 'zone.js/dist/long-stack-trace-zone'; +import 'zone.js/dist/proxy.js'; +import 'zone.js/dist/sync-test'; +import 'zone.js/dist/jasmine-patch'; +import 'zone.js/dist/async-test'; +import 'zone.js/dist/fake-async-test'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting +} from '@angular/platform-browser-dynamic/testing'; + +// Unfortunately there's no typing for the `__karma__` variable. Just declare it as any. +declare var __karma__: any; +declare var require: any; + +// Prevent Karma from running prematurely. +__karma__.loaded = function () {}; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting() +); +// Then we find all the tests. +let context = require.context('./', true, /\.spec\.ts$/); +// And load the modules. +context.keys().map(context); +// Finally, start Karma to run the tests. +__karma__.start(); diff --git a/src/tsconfig.json b/src/tsconfig.json new file mode 100644 index 0000000..5eab165 --- /dev/null +++ b/src/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "baseUrl": "", + "declaration": false, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "lib": [ + "es6", + "dom" + ], + "mapRoot": "./", + "module": "es6", + "moduleResolution": "node", + "outDir": "../dist/out-tsc", + "sourceMap": true, + "target": "es5", + "typeRoots": [ + "../node_modules/@types" + ], + "types": [ + "firebase", + "node" + ] + } +} \ No newline at end of file diff --git a/tslint.json b/tslint.json new file mode 100644 index 0000000..640d02c --- /dev/null +++ b/tslint.json @@ -0,0 +1,107 @@ +{ + "rulesDirectory": [ + "node_modules/codelyzer" + ], + "rules": { + "class-name": true, + "comment-format": [ + true, + "check-space" + ], + "curly": true, + "eofline": true, + "forin": true, + "indent": [ + true, + "spaces" + ], + "label-position": 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-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-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" + ], + + "directive-selector": [true, "attribute", "app", "camelCase"], + "component-selector": [true, "element", "app", "kebab-case"], + "use-input-property-decorator": true, + "use-output-property-decorator": true, + "use-host-property-decorator": true, + "no-input-rename": true, + "no-output-rename": true, + "use-life-cycle-interface": true, + "use-pipe-transform-interface": true, + "component-class-suffix": true, + "directive-class-suffix": true, + "no-access-missing-member": true, + "templates-use-public": true, + "invoke-injectable": true + } +}