Prechádzať zdrojové kódy

add customer details page and delete account tools

robert2206 8 rokov pred
rodič
commit
3eb8a9abeb

+ 2 - 1
package.json

@@ -10,7 +10,7 @@
     "ionic:serve": "ionic-app-scripts serve"
   },
   "dependencies": {
-    "@angular/common": "2.2.1",
+    "@angular/common": "2.4.1",
     "@angular/compiler": "2.2.1",
     "@angular/compiler-cli": "2.2.1",
     "@angular/core": "2.2.1",
@@ -21,6 +21,7 @@
     "@angular/platform-server": "2.2.1",
     "@ionic/storage": "1.1.7",
     "angular2-odoo-jsonrpc": "0.0.7",
+    "angular2-uuid": "^1.1.1",
     "app-root-path": "^2.0.1",
     "async": "^2.1.5",
     "glob": "^7.1.1",

+ 12 - 3
src/app/app.module.ts

@@ -8,7 +8,7 @@ import { OMasterHeader } from "../components/omaster-header/omaster-header";
 import { OMasterFooter } from "../components/omaster-footer/omaster-footer";
 import { ODetailHeader } from "../components/odetail-header/odetail-header";
 
-// Pages
+// List Pages
 import { LoginPage } from "../pages/login/login";
 import { HomePage } from "../pages/home/home";
 import { CustomersPage } from "../pages/customers/customers";
@@ -20,6 +20,9 @@ import { PhonecallsPage } from "../pages/phonecalls/phonecalls";
 import { ToolsPage } from "../pages/tools/tools";
 import { AboutPage } from "../pages/about/about";
 
+// Detail Pages
+import { CustomerPage } from "../pages/customer/customer";
+
 // Services
 import { OdooRPCService } from "angular2-odoo-jsonrpc";
 import { AuthService } from "../services/auth-service";
@@ -37,7 +40,7 @@ import { DoubleTap } from "../directives/double-tap";
 @NgModule({
     declarations: [
         MyApp,
-        // Pages
+        // List Pages
         LoginPage,
         HomePage,
         CustomersPage,
@@ -48,6 +51,8 @@ import { DoubleTap } from "../directives/double-tap";
         PhonecallsPage,
         ToolsPage,
         AboutPage,
+        // Detail Pages
+        CustomerPage,
         // Components
         OMasterHeader,
         OMasterFooter,
@@ -65,6 +70,7 @@ import { DoubleTap } from "../directives/double-tap";
     bootstrap: [IonicApp],
     entryComponents: [
         MyApp,
+        // List Pages
         LoginPage,
         HomePage,
         CustomersPage,
@@ -73,8 +79,11 @@ import { DoubleTap } from "../directives/double-tap";
         OrdersPage,
         LeadsPage,
         PhonecallsPage,
+        // Detail Pages
+        CustomerPage,
+        // Other Pages
         ToolsPage,
-        AboutPage
+        AboutPage,
     ],
     providers: [
         OdooRPCService,

+ 26 - 0
src/base/base-details-view.ts

@@ -0,0 +1,26 @@
+import { BaseView } from "./base-view";
+import { PouchService } from "../services/pouch-service";
+import { Observable } from "rxjs/Observable";
+
+export abstract class BaseDetailsView<T> extends BaseView<T> {
+    
+
+    constructor(c: { new (): T; }) {
+        super(c, PouchService);
+    }
+
+    /**
+     * 
+     * @param data 
+     */
+    save(data: T): Observable<any> {
+        let storableData = {
+            odoo_model: super.getModelName(),
+            records: [
+                data
+            ]
+        };
+
+        return super.getInjectable(PouchService).save(storableData);
+    }
+}

+ 1 - 2
src/base/base-list-view.ts

@@ -1,5 +1,4 @@
 import { BaseView } from "./base-view";
-
 import { PouchService } from "../services/pouch-service";
 
 export abstract class BaseListView<T> extends BaseView<T>{
@@ -22,7 +21,7 @@ export abstract class BaseListView<T> extends BaseView<T>{
      * 
      */
     initialize() {
-        this.inject(PouchService).getAll(this.getModelName()).subscribe(result => { 
+        super.getInjectable(PouchService).getAll(this.getModelName()).subscribe(result => { 
             let obj = result.docs.shift();
 
             if (!obj) {

+ 1 - 1
src/base/base-view.ts

@@ -19,7 +19,7 @@ export class BaseView<T> {
      * 
      * @param injectable 
      */
-    inject(injectable: any): any {
+    getInjectable(injectable: any): any {
         return this.injector.get(injectable);
     }
 

+ 38 - 0
src/pages/customer/customer.html

@@ -0,0 +1,38 @@
+<ion-header>
+    <ion-navbar>
+        <ion-title>Cliente</ion-title>
+        <ion-buttons end>
+            <button ion-button type="submit" form="details-form" [disabled]="customerForm.invalid">
+                GUARDAR
+            </button>
+        </ion-buttons>
+    </ion-navbar>
+</ion-header>
+<ion-content>
+    <form id="details-form" [formGroup]="customerForm" (ngSubmit)="submit(customerForm.value)">
+        <ion-item>
+            <ion-label floating>Nombre</ion-label>
+            <ion-input type="text" formControlName="name"></ion-input>
+        </ion-item>
+        <ion-item>
+            <ion-label floating>Ciudad</ion-label>
+            <ion-input type="text" formControlName="city"></ion-input>
+        </ion-item>
+        <ion-item>
+            <ion-label floating>Dirección</ion-label>
+            <ion-input type="text" formControlName="street"></ion-input>
+        </ion-item>
+        <ion-item>
+            <ion-label floating>Celular</ion-label>
+            <ion-input type="text" formControlName="mobile"></ion-input>
+        </ion-item>
+        <ion-item>
+            <ion-label floating>Teléfono</ion-label>
+            <ion-input type="text" formControlName="phone"></ion-input>
+        </ion-item>
+        <ion-item>
+            <ion-label floating>Email</ion-label>
+            <ion-input type="text" formControlName="email"></ion-input>
+        </ion-item>
+    </form>
+</ion-content>

+ 2 - 0
src/pages/customer/customer.scss

@@ -0,0 +1,2 @@
+page-customer {
+}

+ 56 - 0
src/pages/customer/customer.ts

@@ -0,0 +1,56 @@
+import { Component } from '@angular/core';
+import { Validators, FormGroup, FormBuilder } from "@angular/forms";
+import { NavController, NavParams } from 'ionic-angular';
+
+import { Partner } from "../../odoo/models/res.partner";
+import { BaseDetailsView } from "../../base/base-details-view";
+
+@Component({
+    selector: 'page-customer',
+    templateUrl: 'customer.html'
+})
+export class CustomerPage extends BaseDetailsView<Partner>{
+
+    customerForm: FormGroup;
+
+    constructor(
+        public navCtrl: NavController,
+        public navParams: NavParams,
+        public formBuilder: FormBuilder
+    ) {
+        super(Partner);
+
+        this.customerForm = this.formBuilder.group({
+            name: ["", Validators.required],
+            city: ["", Validators.maxLength(35)],
+            street: ["", Validators.maxLength(35)],
+            mobile: ["", Validators.pattern("^\\d+$")],
+            phone: ["", Validators.pattern("^\\d+$")],
+            email: ["", Validators.pattern("^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+$")]
+        });
+    }
+
+    /**
+     * 
+     */
+    ionViewDidLoad() {
+        console.log('ionViewDidLoad CustomerPage');
+    }
+
+    /**
+     * 
+     * @param data 
+     */
+    submit(data: any) {
+        if (this.customerForm.invalid) {
+            return;
+        }
+        data.customer = true;
+
+        super.save(data).subscribe(result => { 
+            console.log(result);
+        }, error => {
+            console.log(error);
+        });
+    }
+}

+ 1 - 1
src/pages/customers/customers.html

@@ -30,7 +30,7 @@
 		</ion-item>
 	</ion-list>
 	<ion-fab right bottom>
-        <button ion-fab>
+        <button ion-fab (click)="goToDetails()">
             <ion-icon name="add"></ion-icon>
         </button>
     </ion-fab>

+ 13 - 1
src/pages/customers/customers.ts

@@ -3,6 +3,7 @@ import { NavController, NavParams, ActionSheetController } from "ionic-angular";
 
 import { BaseListView } from "../../base/base-list-view";
 import { Partner } from "../../odoo/models/res.partner";
+import { CustomerPage } from "../customer/customer";
 
 @Component({
     selector: 'page-customers',
@@ -10,10 +11,12 @@ import { Partner } from "../../odoo/models/res.partner";
 })
 export class CustomersPage extends BaseListView<Partner> {
 
+
+
     constructor(
         public navCtrl: NavController,
         public navParams: NavParams,
-        public actionSheetCtrl: ActionSheetController 
+        public actionSheetCtrl: ActionSheetController
     ) {
         super(Partner, ["customer", "=", true]);
      }
@@ -76,4 +79,13 @@ export class CustomersPage extends BaseListView<Partner> {
             ]
         }).present();
     }
+
+    /**
+     * 
+     */
+    goToDetails(): void {
+        console.log("Details");
+
+        this.navCtrl.push(CustomerPage);
+    }
 }

+ 2 - 7
src/pages/tools/tools.ts

@@ -56,11 +56,8 @@ export class ToolsPage {
      *
      */
     syncData(): void {
-        let numberOfModels = getMetadataStorage().models.length - 1;
-        let numberOfUpdated = 0;
-
         let loader = this.loadingCtrl.create({
-            content: "Actualizando " + numberOfUpdated + " de " + numberOfModels + " , espere..."
+            content: "Actualizando datos , espere..."
         });
         loader.present();
 
@@ -69,9 +66,7 @@ export class ToolsPage {
         });
 
         this.sync.do().subscribe(s => {
-            numberOfUpdated++;
 
-            loader.setContent("Actualizando " + numberOfUpdated + " de " + numberOfModels + " , espere...");
         }, e => {
             console.log(e);
             toast.setMessage("No se pudo actualizar los datos");
@@ -117,7 +112,7 @@ export class ToolsPage {
             duration: 3000
         });
         
-        this.pouch.destroyAndInitialize().subscribe(s => { 
+        this.sync.removeAll().subscribe(s => { 
             localStorage.clear();
             this.navCtrl.setRoot(LoginPage);
         }, e => {

+ 69 - 12
src/services/pouch-service.ts

@@ -5,6 +5,8 @@ import PouchDB from "pouchdb";
 
 import * as PouchFind from "pouchdb-find";
 
+import { UUID } from "angular2-uuid";
+
 import "rxjs/add/observable/throw";
 import "rxjs/add/observable/fromPromise";
 import "rxjs/add/observable/from";
@@ -12,6 +14,12 @@ import "rxjs/add/operator/concatMap";
 
 PouchDB.plugin(PouchFind);
 
+export enum SaveAction {
+    Add = 1,
+    Update = 2,
+    Delete = 3
+}
+
 @Injectable()
 export class PouchService {
 
@@ -36,15 +44,62 @@ export class PouchService {
         }));
     }
 
+
     /**
      *
      */
-    save(data: any): Observable<any> {
+    save(data: any, action?: SaveAction): Observable<any> {
         if (!data.odoo_model) {
             return Observable.throw("Error: Cannot save data without model name");
         }
 
-        return Observable.fromPromise(this.pouchDB.post(data));
+        return this.getAll(data.odoo_model).concatMap(result => this.pouchDB.post(result.docs.length !== 0 ? Object.assign(result.docs.shift(), { records: data.records }) : data ));
+        // return this.getAll(data.odoo_model).concatMap(r => this.pouchDB.post(this.alignData(r.docs.shift(), data, action)));
+    }
+
+    /**
+     * 
+     * @param dataStored 
+     * @param newData 
+     * @param action 
+     */
+    protected alignData(dataStored: any, data: any, action?: SaveAction) {
+        if (!dataStored) {
+            return this.fillRecordsWithUUID(data);
+        }
+
+        if (!action) {
+            dataStored.records = data.records;
+            return this.fillRecordsWithUUID(dataStored);
+        }
+
+        if (action === SaveAction.Add) {
+            dataStored.records = this.fillRecordsWithUUID(data).records.concat(dataStored.records);
+            return dataStored;
+        }
+
+        if (action === SaveAction.Update) {
+
+        }
+
+        if (action === SaveAction.Delete) {
+
+        }
+    }
+
+    /**
+     * 
+     * @param data 
+     */
+    protected fillRecordsWithUUID(data: any): any {
+        data.records = data.records.map(record => {
+            record.odoo_id = record.id;
+            record.id = UUID.UUID();
+
+            return record;
+        });
+
+        return data;
     }
 
     /**
@@ -62,16 +117,21 @@ export class PouchService {
      *
      */
     removeAll(type: string): Observable<any> {
-        // return this.getAll(type).concatMap(result => Observable.from(result.docs)).concatMap(doc => this.remove(Object.assign(doc, { _deleted: true })));
-        return this.getAll(type).concatMap(result => this.test(result.docs.shift()));
+        return this.getAll(type).concatMap(result => this.cleanDoc(result.docs.shift()));
     }
 
+    /**
+     * 
+     * @param doc 
+     */
+    private cleanDoc(doc: any): Observable<any> {
+        if (!doc || !doc.records) {
+            return Observable.empty();
+        }
 
-    private test(doc: any): Observable<any> {
-        return Observable.create((o: Observer<any>) => {
-            o.next(doc);
-            o.complete();
-        });
+        doc.records = [];
+        
+        return this.save(doc);
     }
 
     /**
@@ -89,9 +149,6 @@ export class PouchService {
      *
      */
     getAll(odoo_model: string): Observable<any> {
-        console.log(odoo_model);
-        
-
         return Observable.fromPromise(this.pouchDB.find({
             selector: {
                 odoo_model: {

+ 2 - 15
src/services/sync-service.ts

@@ -30,8 +30,7 @@ export class SyncService {
      *
      */
     do(): Observable<any> {
-        // return this.login().concat(this.removeAll()).concat(this.download());
-        return this.removeAll();
+        return this.login().concat(this.download());
     }
 
     /**
@@ -61,7 +60,7 @@ export class SyncService {
     /**
      *
      */
-    protected removeAll(): Observable<any> {
+    removeAll(): Observable<any> {
         return this.getModels().concatMap(item => this.pouch.removeAll(item.model.name));
     }
 
@@ -81,18 +80,6 @@ export class SyncService {
             .concatMap(data => this.pouch.save(data));
     }
 
-    /**
-     * 
-     * @param data 
-     */
-    protected test(data?: any) {
-        console.log(data);
-        
-        return Observable.create((o: Observer<any>) => {
-            o.complete();
-        });
-    }
-
     /**
      *
      */