From 4b20cbb154210fdbee9383b3541cd99a311c50c6 Mon Sep 17 00:00:00 2001 From: Claudiu Farcas Date: Tue, 21 Feb 2017 05:39:27 +0200 Subject: [PATCH] simple steps --- .editorconfig | 13 ++ .gitignore | 35 ++++++ README.md | 70 +++++++++++ angular-cli.json | 60 ++++++++++ data/importdata.png | Bin 0 -> 10450 bytes data/kanban2-d5e2a-export.json | 146 +++++++++++++++++++++++ data/screenshot01.png | Bin 0 -> 74696 bytes e2e/app.e2e-spec.ts | 14 +++ e2e/app.po.ts | 11 ++ e2e/tsconfig.json | 16 +++ karma.conf.js | 43 +++++++ package.json | 51 ++++++++ protractor.conf.js | 32 +++++ src/app/app.component.css | 0 src/app/app.component.html | 12 ++ src/app/app.component.ts | 67 +++++++++++ src/app/app.module.ts | 36 ++++++ src/app/card/card.component.css | 38 ++++++ src/app/card/card.component.html | 48 ++++++++ src/app/card/card.component.ts | 65 ++++++++++ src/app/cardlist/cardlist.component.css | 86 +++++++++++++ src/app/cardlist/cardlist.component.html | 53 ++++++++ src/app/cardlist/cardlist.component.ts | 107 +++++++++++++++++ src/app/index.ts | 2 + src/app/models/card-info.ts | 9 ++ src/app/models/cardlist-info.ts | 8 ++ src/app/models/project-info.ts | 5 + src/app/models/task-info.ts | 8 ++ src/app/shared/data.service.ts | 122 +++++++++++++++++++ src/assets/.gitkeep | 0 src/environments/environment.prod.ts | 3 + src/environments/environment.ts | 8 ++ src/environments/firebaseConfig.ts | 18 +++ src/favicon.ico | Bin 0 -> 5430 bytes src/index.html | 15 +++ src/main.ts | 12 ++ src/polyfills.ts | 19 +++ src/styles.css | 1 + src/test.ts | 32 +++++ src/tsconfig.json | 18 +++ src/typings.d.ts | 2 + tslint.json | 114 ++++++++++++++++++ 42 files changed, 1399 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 README.md create mode 100644 angular-cli.json create mode 100644 data/importdata.png create mode 100644 data/kanban2-d5e2a-export.json create mode 100644 data/screenshot01.png 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/app.component.css create mode 100644 src/app/app.component.html create mode 100644 src/app/app.component.ts create mode 100644 src/app/app.module.ts create mode 100644 src/app/card/card.component.css create mode 100644 src/app/card/card.component.html create mode 100644 src/app/card/card.component.ts create mode 100644 src/app/cardlist/cardlist.component.css create mode 100644 src/app/cardlist/cardlist.component.html create mode 100644 src/app/cardlist/cardlist.component.ts create mode 100644 src/app/index.ts create mode 100644 src/app/models/card-info.ts create mode 100644 src/app/models/cardlist-info.ts create mode 100644 src/app/models/project-info.ts create mode 100644 src/app/models/task-info.ts create mode 100644 src/app/shared/data.service.ts create mode 100644 src/assets/.gitkeep create mode 100644 src/environments/environment.prod.ts create mode 100644 src/environments/environment.ts create mode 100644 src/environments/firebaseConfig.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 src/typings.d.ts 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..ce200cb --- /dev/null +++ b/.gitignore @@ -0,0 +1,35 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp + +# dependencies +/node_modules +/bower_components + +# IDEs and editors +/.idea +/.vscode +.project +.classpath +.c9/ +*.launch +.settings/ + +# 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/README.md b/README.md new file mode 100644 index 0000000..ed50c9b --- /dev/null +++ b/README.md @@ -0,0 +1,70 @@ +# kanban2 + +## Project description + +This project is a playground for a Kanban board made with following libraries: + +* Angular 2 (based on angular-cli) +* Firebase via AngualarFire2 +* Bootstrap with ng2-bootstrap + +## Configuration + +You will need to configure your firebase credentials in firebaseConfig.ts. This can be copied +almost directly from the proposed configuration from the Firebase console. + +```angular2html + apiKey: "????", + authDomain: "????", + databaseURL: "???", + storageBucket: "???", + messagingSenderId: "???" +``` + +Initial data: + +In "data" folder there is "kanban2-d5e2a-export.json" file with some initial data +It can be imported in firebase console in a new fresh firebase database. + +![alt text](data/importdata.png "Import initial data") + + + +## Screenshots + +![alt text](data/screenshot01.png "Import initial data") + + + + +#Angular 2 Specifics + +This project was generated with [angular-cli](https://github.com/angular/angular-cli) version 1.0.0-beta.21. + +## Development server +Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. + +## Code scaffolding + +Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive/pipe/service/class`. + +## Build + +Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `-prod` flag for a production build. + +## Running unit tests + +Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). + +## Running end-to-end tests + +Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/). +Before running the tests make sure you are serving the app via `ng serve`. + +## Deploying to Github Pages + +Run `ng github-pages:deploy` to deploy to Github Pages. + +## Further help + +To get more help on the `angular-cli` use `ng --help` or go check out the [Angular-CLI README](https://github.com/angular/angular-cli/blob/master/README.md). diff --git a/angular-cli.json b/angular-cli.json new file mode 100644 index 0000000..60e12db --- /dev/null +++ b/angular-cli.json @@ -0,0 +1,60 @@ +{ + "project": { + "version": "1.0.0-beta.21", + "name": "kanban2" + }, + "apps": [ + { + "root": "src", + "outDir": "dist", + "assets": [ + "assets", + "favicon.ico" + ], + "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": [], + "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/data/importdata.png b/data/importdata.png new file mode 100644 index 0000000000000000000000000000000000000000..05ad71d65e4be4ee4e790c123e590c350b633643 GIT binary patch literal 10450 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 literal 0 HcmV?d00001 diff --git a/data/kanban2-d5e2a-export.json b/data/kanban2-d5e2a-export.json new file mode 100644 index 0000000..79b07f2 --- /dev/null +++ b/data/kanban2-d5e2a-export.json @@ -0,0 +1,146 @@ +{ + "cardlist" : { + "-KdRl7OguO3iT-Uapu1B" : { + "color" : "orange", + "created_at" : "Mon Feb 20 2017 20:24:25 GMT+0200 (GTB Standard Time)", + "name" : "IN PPROGRESS", + "order" : 1, + "projectId" : "-KdRh_nFQT3Im1KfUPMW" + }, + "-KdRmdEq-T-AmCqRvPQq" : { + "color" : "green", + "created_at" : "Mon Feb 20 2017 20:31:02 GMT+0200 (GTB Standard Time)", + "name" : "DONE", + "order" : 2, + "projectId" : "-KdRh_nFQT3Im1KfUPMW" + }, + "ToDo" : { + "color" : "gray", + "created_at" : "Mon Feb 20 2017 20:31:02 GMT+0200 (GTB Standard Time)", + "name" : "TO DO", + "order" : 0, + "projectId" : "-KdRh_nFQT3Im1KfUPMW" + } + }, + "cards" : { + "-KdTXIRPx0OAe8V9tfba" : { + "cardListId" : "ToDo", + "created_at" : "Tue Feb 21 2017 04:38:52 GMT+0200 (GTB Standard Time)", + "description" : "Read it before the Friday presentation, discuss ideas with the team.", + "isExpanded" : true, + "name" : "Read \"Don't make me think\"", + "order" : 0 + }, + "-KdTYCqtrRKoZejMUQaA" : { + "cardListId" : "ToDo", + "created_at" : "Tue Feb 21 2017 04:42:52 GMT+0200 (GTB Standard Time)", + "description" : "Test driven development desc", + "isExpanded" : false, + "name" : "Test driven development", + "order" : 0 + }, + "-KdT_XMJHSc5EEdMbZPL" : { + "cardListId" : "-KdRl7OguO3iT-Uapu1B", + "created_at" : "Tue Feb 21 2017 04:53:00 GMT+0200 (GTB Standard Time)", + "description" : "Read tech articles on medium desc", + "isExpanded" : false, + "name" : "Read tech articles on medium", + "order" : 0 + }, + "-KdT_hWu_JChDp22_yYe" : { + "cardListId" : "-KdRl7OguO3iT-Uapu1B", + "created_at" : "Tue Feb 21 2017 04:53:46 GMT+0200 (GTB Standard Time)", + "description" : "Write code with the supervision of another colleague.", + "isExpanded" : true, + "name" : "Pair programming", + "order" : 0 + }, + "-KdT_vWZ6zbKoG4ubmgF" : { + "cardListId" : "-KdRl7OguO3iT-Uapu1B", + "created_at" : "Tue Feb 21 2017 04:54:43 GMT+0200 (GTB Standard Time)", + "description" : "Read on time management desc", + "isExpanded" : false, + "name" : "Read on time management", + "order" : 0 + }, + "-KdTaA4uy_7iFCw0Bzr5" : { + "cardListId" : "-KdRmdEq-T-AmCqRvPQq", + "created_at" : "Tue Feb 21 2017 04:55:47 GMT+0200 (GTB Standard Time)", + "description" : "Have a meeting with the team in order to get our definitions on Agile aligned.", + "isExpanded" : true, + "name" : "Meeting on Agile", + "order" : 0 + } + }, + "projects" : { + "-KdRh_nFQT3Im1KfUPMW" : { + "created_at" : "Mon Feb 20 2017 20:08:59 GMT+0200 (GTB Standard Time)", + "name" : "TestProject1" + } + }, + "tasks" : { + "-KdT_iknV-6SxGejJkZt" : { + "cardId" : "-KdT_hWu_JChDp22_yYe", + "created_at" : "Tue Feb 21 2017 04:53:51 GMT+0200 (GTB Standard Time)", + "description" : "Write code", + "isCompleted" : true, + "order" : 0 + }, + "-KdT_jkICL5Q6SwKZ25c" : { + "cardId" : "-KdT_hWu_JChDp22_yYe", + "created_at" : "Tue Feb 21 2017 04:53:55 GMT+0200 (GTB Standard Time)", + "description" : "Check code", + "isCompleted" : false, + "order" : 0 + }, + "-KdT_mNQeZ0BmJvM-Xay" : { + "cardId" : "-KdTXIRPx0OAe8V9tfba", + "created_at" : "Tue Feb 21 2017 04:54:06 GMT+0200 (GTB Standard Time)", + "description" : "Read book", + "isCompleted" : false, + "order" : 0 + }, + "-KdT_oNftsSW6QX0mgYB" : { + "cardId" : "-KdTXIRPx0OAe8V9tfba", + "created_at" : "Tue Feb 21 2017 04:54:14 GMT+0200 (GTB Standard Time)", + "description" : "Find similar examples", + "isCompleted" : false, + "order" : 0 + }, + "-KdT_q8SgYfNs4USoVh3" : { + "cardId" : "-KdTXIRPx0OAe8V9tfba", + "created_at" : "Tue Feb 21 2017 04:54:21 GMT+0200 (GTB Standard Time)", + "description" : "Prepare presentation", + "isCompleted" : false, + "order" : 0 + }, + "-KdTaDPoEdDcMr9PujkO" : { + "cardId" : "-KdTaA4uy_7iFCw0Bzr5", + "created_at" : "Tue Feb 21 2017 04:56:00 GMT+0200 (GTB Standard Time)", + "description" : "Define Agile methodology", + "isCompleted" : true, + "order" : 0 + }, + "-KdTaFqonDXBEef6F-3o" : { + "cardId" : "-KdTaA4uy_7iFCw0Bzr5", + "created_at" : "Tue Feb 21 2017 04:56:10 GMT+0200 (GTB Standard Time)", + "description" : "What is Scrum?", + "isCompleted" : true, + "order" : 0 + }, + "-KdTaHSJYL0uviZyvOST" : { + "cardId" : "-KdTaA4uy_7iFCw0Bzr5", + "created_at" : "Tue Feb 21 2017 04:56:17 GMT+0200 (GTB Standard Time)", + "description" : "Current implementation", + "isCompleted" : true, + "order" : 0 + }, + "-KdTaKOLbyxnCrJz4GVs" : { + "cardId" : "-KdTaA4uy_7iFCw0Bzr5", + "created_at" : "Tue Feb 21 2017 04:56:29 GMT+0200 (GTB Standard Time)", + "description" : "What to improve?", + "isCompleted" : true, + "order" : 0 + } + } +} diff --git a/data/screenshot01.png b/data/screenshot01.png new file mode 100644 index 0000000000000000000000000000000000000000..221ae3a8dbae931d28448fe16c122b39f7944f56 GIT binary patch literal 74696 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 Vg;MksDST3INXUz4T)p%7e*w1X!utRK literal 0 HcmV?d00001 diff --git a/e2e/app.e2e-spec.ts b/e2e/app.e2e-spec.ts new file mode 100644 index 0000000..11804a8 --- /dev/null +++ b/e2e/app.e2e-spec.ts @@ -0,0 +1,14 @@ +import { ValuationJsPage } from './app.po'; + +describe('kanban2 App', function() { + let page: ValuationJsPage; + + beforeEach(() => { + page = new ValuationJsPage(); + }); + + 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..c07b268 --- /dev/null +++ b/e2e/app.po.ts @@ -0,0 +1,11 @@ +import { browser, element, by } from 'protractor'; + +export class ValuationJsPage { + 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..f72946a --- /dev/null +++ b/package.json @@ -0,0 +1,51 @@ +{ + "name": "kanban2", + "version": "0.0.0", + "license": "MIT", + "angular-cli": {}, + "scripts": { + "start": "ng serve", + "lint": "tslint \"src/**/*.ts\"", + "test": "ng test", + "pree2e": "webdriver-manager update", + "e2e": "protractor" + }, + "private": true, + "dependencies": { + "@angular/common": "2.4.7", + "@angular/compiler": "2.4.7", + "@angular/core": "2.4.7", + "@angular/forms": "2.4.7", + "@angular/http": "2.4.7", + "@angular/platform-browser": "2.4.7", + "@angular/platform-browser-dynamic": "2.4.7", + "@angular/router": "3.4.7", + "angularfire2": "^2.0.0-beta.7", + "bootstrap": "3.3.7", + "core-js": "2.4.1", + "firebase": "3.6.9", + "ng2-bootstrap": "^1.3.3", + "ng2-dnd": "^2.2.2", + "rxjs": "5.0.3", + "ts-helpers": "1.1.2", + "zone.js": "0.7.6" + }, + "devDependencies": { + "@angular/compiler-cli": "2.4.7", + "@types/jasmine": "2.5.38", + "@types/node": "^6.0.60", + "angular-cli": "1.0.0-beta.28.3", + "codelyzer": "~1.0.0-beta.3", + "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.2.0", + "typescript": "~2.1.6" + } +} diff --git a/protractor.conf.js b/protractor.conf.js new file mode 100644 index 0000000..169743b --- /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/docs/referenceConf.js + +/*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/app.component.css b/src/app/app.component.css new file mode 100644 index 0000000..e69de29 diff --git a/src/app/app.component.html b/src/app/app.component.html new file mode 100644 index 0000000..c952a6b --- /dev/null +++ b/src/app/app.component.html @@ -0,0 +1,12 @@ +
+

+ {{title}} +

+
+ +
+ + +
+
+
\ No newline at end of file diff --git a/src/app/app.component.ts b/src/app/app.component.ts new file mode 100644 index 0000000..e850680 --- /dev/null +++ b/src/app/app.component.ts @@ -0,0 +1,67 @@ +import {Component, OnInit} from "@angular/core"; +import {DataService} from "app/shared/data.service"; +import {Observable} from "rxjs"; + +import {Project} from "app/models/project-info"; +import {CardList} from "app/models/cardlist-info"; +import {Card} from "app/models/card-info"; + +@Component({ + selector: 'app-root', + templateUrl: './app.component.html', + styleUrls: ['./app.component.css'] +}) +export class AppComponent implements OnInit { + title = 'The Kanban Board'; + projects: Project[]; + cardlists: CardList[]; + + constructor(private dataService: DataService) { + } + + ngOnInit(){ + this.dataService.getProjects() + .subscribe(data => { + this.projects = data; + let firstProject = this.projects[0]; + //console.log(firstProject); + // this.addAddCardList( + // 'Done', + // firstProject.$key, + // 'green' + // ); + }); + this.dataService.getCardLists() + .subscribe(c => this.cardlists = c) + ; + this.dataService.getCards(); + this.dataService.getTasks(); + //this.addProject("TestProject1"); + } + + addProject(name: string) + { + let created_at = new Date().toString(); + let newProject:Project = new Project(); + newProject.name = name; + newProject.created_at= created_at; + this.dataService.addProject(newProject); + } + + addCardList( + name: string, + projectId: string, + color: string, + order: number) + { + let created_at = new Date().toString(); + let newCardList:CardList = new CardList(); + newCardList.name = name; + newCardList.projectId = projectId; + newCardList.color = color; + newCardList.order = order; + newCardList.created_at = created_at; + this.dataService.addCardList(newCardList); + } + +} diff --git a/src/app/app.module.ts b/src/app/app.module.ts new file mode 100644 index 0000000..9068be1 --- /dev/null +++ b/src/app/app.module.ts @@ -0,0 +1,36 @@ +import {BrowserModule} from "@angular/platform-browser"; +import {NgModule} from "@angular/core"; +import {FormsModule, ReactiveFormsModule} from "@angular/forms"; +import {HttpModule} from "@angular/http"; +import {AppComponent} from "./app.component"; +import {authConfig, firebaseConfig} from "environments/firebaseConfig"; +import {AngularFireModule} from "angularfire2"; +import {AlertModule} from "ng2-bootstrap"; +import {ModalModule} from 'ng2-bootstrap'; + +import {DataService} from "app/shared/data.service"; +import {CardListComponent} from "app/cardlist/cardlist.component"; +import {CardComponent} from "app/card/card.component"; +import {DndModule} from 'ng2-dnd'; + +@NgModule({ + declarations: [ + AppComponent, + CardListComponent, + CardComponent + ], + imports: [ + BrowserModule, + FormsModule, + ReactiveFormsModule, + HttpModule, + AlertModule.forRoot(), + ModalModule.forRoot(), + DndModule.forRoot(), + AngularFireModule.initializeApp(firebaseConfig, authConfig) + ], + providers: [DataService], + bootstrap: [AppComponent] +}) +export class AppModule { +} diff --git a/src/app/card/card.component.css b/src/app/card/card.component.css new file mode 100644 index 0000000..8c0217d --- /dev/null +++ b/src/app/card/card.component.css @@ -0,0 +1,38 @@ +.cardTitle{ + margin-left: 10px; + font-size: 1em; + font-weight: bold; +} +.cardDesc{ + margin-left: 10px; +} +.tasklist{ + margin: 10px; +} +.newtask +{ + font-size: 0.8em; +} +.link{ + cursor: pointer; +} +.carret{ + display: inline-block; + cursor: pointer; +} +.titleText{ + display: inline-block; +} +.modal-header { + padding:9px 15px; + border-bottom:1px solid #eee; + background-color: #ff4040; + -webkit-border-top-left-radius: 5px; + -webkit-border-top-right-radius: 5px; + -moz-border-radius-topleft: 5px; + -moz-border-radius-topright: 5px; + border-top-left-radius: 5px; + border-top-right-radius: 5px; + color: white; + font-weight: bold; + } \ No newline at end of file diff --git a/src/app/card/card.component.html b/src/app/card/card.component.html new file mode 100644 index 0000000..b696e0c --- /dev/null +++ b/src/app/card/card.component.html @@ -0,0 +1,48 @@ +
+
+ + +
+
+ {{item.name}} +
+
+
+
+ {{item.description}} +
+
+
+ + + {{task.description}} + + +
+
+
+
+ +
+
+
+ + + + \ No newline at end of file diff --git a/src/app/card/card.component.ts b/src/app/card/card.component.ts new file mode 100644 index 0000000..c66fe77 --- /dev/null +++ b/src/app/card/card.component.ts @@ -0,0 +1,65 @@ +import {Component, OnInit, Input, ViewChild} from "@angular/core"; +import {DataService} from "app/shared/data.service"; +import {Observable} from "rxjs"; +import {CardList} from "app/models/cardlist-info"; +import {Card} from "app/models/card-info"; +import {Task} from "app/models/task-info"; +import { ModalDirective } from 'ng2-bootstrap/modal'; + +@Component({ + selector: 'card', + templateUrl: './card.component.html', + styleUrls: ['./card.component.css'] +}) +export class CardComponent implements OnInit { + @ViewChild('childModal') public childModal:ModalDirective; + @Input() item: Card; + tasks : Task[] + + newtaskdesc; + + + constructor(private dataService: DataService) { + //console.log(this.item); + } + + ngOnInit() { + //console.log(this.item); + this.dataService.getTasksByCardId(this.item.$key) + .subscribe(data => { + this.tasks = data; + }) + } + + addNewTask(){ + //console.log('Add new subtask!'); + let newTask = new Task(); + newTask.cardId = this.item.$key; + newTask.description = this.newtaskdesc; + newTask.isCompleted = false; + newTask.order = 0; + newTask.created_at = new Date().toString(); + this.dataService.addTask(newTask) + .then(() => { + this.newtaskdesc = ''; + }); + } + + deleteTask(task){ + //console.log(task); + this.childModal.show(); + } + public hideChildModal():void { + this.childModal.hide(); + } + + changeTaskCompleted(task){ + //console.log(task); + this.dataService.updateTask(task.$key, task); + } + + clickCarret(){ + this.item.isExpanded = !this.item.isExpanded; + this.dataService.updateCard(this.item.$key,this.item); + } +} diff --git a/src/app/cardlist/cardlist.component.css b/src/app/cardlist/cardlist.component.css new file mode 100644 index 0000000..ca06fec --- /dev/null +++ b/src/app/cardlist/cardlist.component.css @@ -0,0 +1,86 @@ +.card{ + background-color: lightblue; + border: solid 1px; + border-left-width: 5px; + margin: 15px; +} +.cardTitle{ + margin-left: 10px; + font-size: 1em; +} +.cardDesc{ + margin-left: 10px; +} +.createCard{ + padding: 10px; + /*background-color: lightcyan;*/ +} +.fullScreen{ + position: fixed; + width: 100%; + height: 100%; + left: 0; + top: 0; + clear: both; + background: black; + opacity: 0.3; + padding-left: 35%; + padding-right: 35%; + padding-top: 35%; + padding-bottom: 15%; + z-index: 100; +} +.fullScreentransparent{ + position: absolute; + clear: both; + width: 100%; + height: 100%; + left: 0; + top: 0; + background: transparent; + z-index: 101; +} +.link{ + cursor: pointer; +} +.createTitle{ + font-weight: bold; + color: white; +} +.formfields{ + margin-top: 10px; +} +.inline{ + display: inline-block; +} +.listTitle{ + font-weight: bold; + font-size: 1.2em; +} + + + +.dnd-drag-start { + -moz-transform:scale(0.8); + -webkit-transform:scale(0.8); + transform:scale(0.8); + opacity:0.7; + border: 2px dashed #000; +} + +.dnd-drag-enter { + opacity:0.7; + border: 2px dashed #000; +} + +.dnd-drag-over { + border: 2px dashed #000; +} + +.dnd-sortable-drag { + -moz-transform:scale(0.9); + -webkit-transform:scale(0.9); + transform:scale(0.9); + opacity:0.7; + border: 1px dashed #000; +} \ No newline at end of file diff --git a/src/app/cardlist/cardlist.component.html b/src/app/cardlist/cardlist.component.html new file mode 100644 index 0000000..1b3de74 --- /dev/null +++ b/src/app/cardlist/cardlist.component.html @@ -0,0 +1,53 @@ +
+
+
+ + + {{item.name}} + + +
+
+
+
    +
  • + + +
  • +
+
+
+ +
+
+
+
+
+

New task - {{ item.name }} + +

+
+
+ + + + + +
+
+ +
+
+
\ No newline at end of file diff --git a/src/app/cardlist/cardlist.component.ts b/src/app/cardlist/cardlist.component.ts new file mode 100644 index 0000000..67a9ce9 --- /dev/null +++ b/src/app/cardlist/cardlist.component.ts @@ -0,0 +1,107 @@ +import {Component, OnInit, Input} from "@angular/core"; +import {DataService} from "app/shared/data.service"; +import {Observable} from "rxjs"; +import {CardList} from "app/models/cardlist-info"; +import {Card} from "app/models/card-info"; +import {Task} from "app/models/task-info"; + +@Component({ + selector: 'cardlist', + templateUrl: './cardlist.component.html', + styleUrls: ['./cardlist.component.css'] +}) +export class CardListComponent implements OnInit { + @Input() item: CardList; + cards : Card[] + + toShowAddCard:boolean; + editCard: Card; + cardname; + carddescription; + allowedDropFrom = []; + allowedDragTo = false; + + + constructor(private dataService: DataService) { + } + + ngOnInit() { + this.dataService.getCardsByListId(this.item.$key) + .subscribe(data => { + this.cards = data; + }); + //fill allowed drop-from containers + this.dataService.getCardListsByOrder(this.item.order-1) + .subscribe(d => { + if(d.length>0) + this.allowedDropFrom.push(d[0].$key); + } + ); + //fill if it has next containers + this.dataService.getCardListsByOrder(this.item.order+1) + .subscribe(d => { + if(d.length>0) + this.allowedDragTo = true; + } + ); + } + + showAddCard(){ + this.cardname = ''; + this.carddescription = ''; + this.toShowAddCard = true; + } + + cancelAddCard(){ + this.toShowAddCard = false; + } + saveAddCard(){ + //console.log('save card'); + this.addCard( + this.cardname, + this.carddescription, + true, + this.item.$key, + 0); + this.toShowAddCard = false; + } + + + addCard( + name: string, + description: string, + isExpanded: boolean, + cardListId: string, + order: number + ) + { + let created_at = new Date().toString(); + let newCard:Card = new Card(); + newCard.name = name; + newCard.description = description; + newCard.cardListId = cardListId; + newCard.isExpanded = isExpanded; + newCard.order = order; + newCard.created_at = created_at; + this.dataService.addCard(newCard); + } + + cardDropped(ev){ + let card:Card = ev.dragData; + if(card.cardListId !== this.item.$key){ + card.cardListId = this.item.$key; + this.dataService.updateCard(card.$key, card); + } + } + + allowDragFunction(card: Card){ + return this.allowedDragTo; + } + + allowDropFunction(): any { + return (dragData: Card) => { + return this.allowedDropFrom.indexOf(dragData.cardListId) > -1; + }; + } + +} diff --git a/src/app/index.ts b/src/app/index.ts new file mode 100644 index 0000000..875bdb2 --- /dev/null +++ b/src/app/index.ts @@ -0,0 +1,2 @@ +export * from './app.component'; +export * from './app.module'; diff --git a/src/app/models/card-info.ts b/src/app/models/card-info.ts new file mode 100644 index 0000000..2135ae4 --- /dev/null +++ b/src/app/models/card-info.ts @@ -0,0 +1,9 @@ +export class Card { + $key?: string; + name?: string; + description?: string; + cardListId?: string; + isExpanded?: boolean; + order?: number; + created_at?: string; +} diff --git a/src/app/models/cardlist-info.ts b/src/app/models/cardlist-info.ts new file mode 100644 index 0000000..efa3cf2 --- /dev/null +++ b/src/app/models/cardlist-info.ts @@ -0,0 +1,8 @@ +export class CardList { + $key?: string; + name?: string; + projectId?: string; + color?: string; + order?: number; + created_at?: string; +} diff --git a/src/app/models/project-info.ts b/src/app/models/project-info.ts new file mode 100644 index 0000000..9b2a026 --- /dev/null +++ b/src/app/models/project-info.ts @@ -0,0 +1,5 @@ +export class Project { + $key?: string; + name?: string; + created_at?: string; +} diff --git a/src/app/models/task-info.ts b/src/app/models/task-info.ts new file mode 100644 index 0000000..969a699 --- /dev/null +++ b/src/app/models/task-info.ts @@ -0,0 +1,8 @@ +export class Task { + $key?: string; + description?: string; + isCompleted: boolean; + cardId?: string; + order?: number; + created_at?: string; +} diff --git a/src/app/shared/data.service.ts b/src/app/shared/data.service.ts new file mode 100644 index 0000000..9fc5333 --- /dev/null +++ b/src/app/shared/data.service.ts @@ -0,0 +1,122 @@ +import {Injectable, EventEmitter, Output} from "@angular/core"; +import {AngularFire, FirebaseObjectObservable, FirebaseListObservable} from "angularfire2"; +import {BehaviorSubject} from "rxjs/BehaviorSubject"; +import {Observable, Subject, ReplaySubject, AsyncSubject} from "rxjs"; +import {Project} from "../models/project-info"; +import {CardList} from "../models/cardlist-info"; +import {Card} from "../models/card-info"; +import {Task} from "../models/task-info"; + +@Injectable() +export class DataService { + + projects: FirebaseListObservable; + cardlists: FirebaseListObservable; + cards: FirebaseListObservable; + tasks: FirebaseListObservable; + + constructor(private af: AngularFire) { + //console.log("DataService"); + } + + getProjects(){ + this.projects = this.af.database.list('/projects') as + FirebaseListObservable; + return this.projects; + } + + addProject(project) { + return this.projects.push(project); + } + + + + getCardLists(){ + this.cardlists = this.af.database.list('/cardlist',{ + query: { + orderByChild: 'order' + }} + ) as + FirebaseListObservable; + return this.cardlists; + } + getCardListsById(cardListId:string): FirebaseObjectObservable { + return this.af.database.object(`/cardlist/${cardListId}`) as FirebaseObjectObservable; + } + getCardListsByOrder(order:number): FirebaseListObservable { + let _cardlist = this.af.database.list('/cardlist',{ + query: { + orderByChild: 'order', + equalTo: order, + }} + ) as FirebaseListObservable; + return _cardlist; + } + getCachedCardListsById(cardListId:string):CardList { + return this.cardlists + .filter(d => d.$key == cardListId) + .map(d=> d.$key) + ; + //.first(); + } + getCardListsByProject(projectId: string){ + let _cardlist = this.af.database.list('/cardlist',{ + query: { + orderByChild: 'projectId', + equalTo: projectId, + }} + ) as FirebaseListObservable; + return _cardlist + } + addCardList(cardlist){ + return this.cardlists.push(cardlist); + } + + + + + getCards(){ + this.cards = this.af.database.list('/cards') as + FirebaseListObservable; + return this.cards; + } + getCardsByListId(listId:string){ + this.cards = this.af.database.list('/cards',{ + query: { + orderByChild: 'cardListId', + equalTo: listId, + }} + ) as + FirebaseListObservable; + return this.cards; + } + addCard(card){ + return this.cards.push(card); + } + updateCard(key, updCard){ + return this.cards.update(key, updCard); + } + + + + getTasks(){ + this.tasks = this.af.database.list('/tasks') as + FirebaseListObservable; + return this.cards; + } + getTasksByCardId(cardId:string){ + let _tasks = this.af.database.list('/tasks',{ + query: { + orderByChild: 'cardId', + equalTo: cardId, + }} + ) as FirebaseListObservable; + return _tasks; + } + addTask(task){ + return this.tasks.push(task); + } + updateTask(key, updTask){ + return this.tasks.update(key, updTask); + } +} \ 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/environments/environment.prod.ts b/src/environments/environment.prod.ts new file mode 100644 index 0000000..3612073 --- /dev/null +++ b/src/environments/environment.prod.ts @@ -0,0 +1,3 @@ +export const environment = { + production: true +}; diff --git a/src/environments/environment.ts b/src/environments/environment.ts new file mode 100644 index 0000000..00313f1 --- /dev/null +++ b/src/environments/environment.ts @@ -0,0 +1,8 @@ +// The file contents for the current environment will overwrite these during build. +// The build system defaults to the dev environment which uses `environment.ts`, but if you do +// `ng build --env=prod` then `environment.prod.ts` will be used instead. +// The list of which env maps to which file can be found in `angular-cli.json`. + +export const environment = { + production: false +}; diff --git a/src/environments/firebaseConfig.ts b/src/environments/firebaseConfig.ts new file mode 100644 index 0000000..e04402a --- /dev/null +++ b/src/environments/firebaseConfig.ts @@ -0,0 +1,18 @@ + +import {AuthMethods, AuthProviders} from "angularfire2"; + + +export const firebaseConfig = { + //get these from your created firebase project at https://console.firebase.google.com + // Paste all this from the Firebase console... + apiKey: "", + authDomain: "", + databaseURL: "", + storageBucket: "", + messagingSenderId: "" +}; + +export const authConfig = { + provider: AuthProviders.Password, + method: AuthMethods.Password +}; diff --git a/src/favicon.ico b/src/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..8081c7ceaf2be08bf59010158c586170d9d2d517 GIT binary patch literal 5430 zcmc(je{54#6vvCoAI3i*G5%$U7!sA3wtMZ$fH6V9C`=eXGJb@R1%(I_{vnZtpD{6n z5Pl{DmxzBDbrB>}`90e12m8T*36WoeDLA&SD_hw{H^wM!cl_RWcVA!I+x87ee975; z@4kD^=bYPn&pmG@(+JZ`rqQEKxW<}RzhW}I!|ulN=fmjVi@x{p$cC`)5$a!)X&U+blKNvN5tg=uLvuLnuqRM;Yc*swiexsoh#XPNu{9F#c`G zQLe{yWA(Y6(;>y|-efAy11k<09(@Oo1B2@0`PtZSkqK&${ zgEY}`W@t{%?9u5rF?}Y7OL{338l*JY#P!%MVQY@oqnItpZ}?s z!r?*kwuR{A@jg2Chlf0^{q*>8n5Ir~YWf*wmsh7B5&EpHfd5@xVaj&gqsdui^spyL zB|kUoblGoO7G(MuKTfa9?pGH0@QP^b#!lM1yHWLh*2iq#`C1TdrnO-d#?Oh@XV2HK zKA{`eo{--^K&MW66Lgsktfvn#cCAc*(}qsfhrvOjMGLE?`dHVipu1J3Kgr%g?cNa8 z)pkmC8DGH~fG+dlrp(5^-QBeEvkOvv#q7MBVLtm2oD^$lJZx--_=K&Ttd=-krx(Bb zcEoKJda@S!%%@`P-##$>*u%T*mh+QjV@)Qa=Mk1?#zLk+M4tIt%}wagT{5J%!tXAE;r{@=bb%nNVxvI+C+$t?!VJ@0d@HIyMJTI{vEw0Ul ze(ha!e&qANbTL1ZneNl45t=#Ot??C0MHjjgY8%*mGisN|S6%g3;Hlx#fMNcL<87MW zZ>6moo1YD?P!fJ#Jb(4)_cc50X5n0KoDYfdPoL^iV`k&o{LPyaoqMqk92wVM#_O0l z09$(A-D+gVIlq4TA&{1T@BsUH`Bm=r#l$Z51J-U&F32+hfUP-iLo=jg7Xmy+WLq6_tWv&`wDlz#`&)Jp~iQf zZP)tu>}pIIJKuw+$&t}GQuqMd%Z>0?t%&BM&Wo^4P^Y z)c6h^f2R>X8*}q|bblAF?@;%?2>$y+cMQbN{X$)^R>vtNq_5AB|0N5U*d^T?X9{xQnJYeU{ zoZL#obI;~Pp95f1`%X3D$Mh*4^?O?IT~7HqlWguezmg?Ybq|7>qQ(@pPHbE9V?f|( z+0xo!#m@Np9PljsyxBY-UA*{U*la#8Wz2sO|48_-5t8%_!n?S$zlGe+NA%?vmxjS- zHE5O3ZarU=X}$7>;Okp(UWXJxI%G_J-@IH;%5#Rt$(WUX?6*Ux!IRd$dLP6+SmPn= z8zjm4jGjN772R{FGkXwcNv8GBcZI#@Y2m{RNF_w8(Z%^A*!bS*!}s6sh*NnURytky humW;*g7R+&|Ledvc- + + + + The Kanban Board + + + + + + + + Loading... + + diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..5c3c520 --- /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/'; + +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..90d4ee0 --- /dev/null +++ b/src/styles.css @@ -0,0 +1 @@ +/* You can add global styles to this file, and also import other style files */ diff --git a/src/test.ts b/src/test.ts new file mode 100644 index 0000000..81af890 --- /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..1cf713a --- /dev/null +++ b/src/tsconfig.json @@ -0,0 +1,18 @@ +{ + "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" + ] + } +} diff --git a/src/typings.d.ts b/src/typings.d.ts new file mode 100644 index 0000000..ea52695 --- /dev/null +++ b/src/typings.d.ts @@ -0,0 +1,2 @@ +// Typings reference file, you can add your own global typings here +// https://www.typescriptlang.org/docs/handbook/writing-declaration-files.html diff --git a/tslint.json b/tslint.json new file mode 100644 index 0000000..ad0093e --- /dev/null +++ b/tslint.json @@ -0,0 +1,114 @@ +{ + "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, + "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" + ], + + "directive-selector-prefix": [true, "app"], + "component-selector-prefix": [true, "app"], + "directive-selector-name": [true, "camelCase"], + "component-selector-name": [true, "kebab-case"], + "directive-selector-type": [true, "attribute"], + "component-selector-type": [true, "element"], + "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, + "templates-use-public": true, + "invoke-injectable": true + } +}