Quellcode durchsuchen

mejorado performance en la carga de datos y visualización de variantes en la vista del producto

robert2206 vor 8 Jahren
Ursprung
Commit
678f0d76a0

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

@@ -24,7 +24,7 @@ import { AboutPage } from '../pages/about/about'
 import { DataProvider } from '../providers/data-provider';
 import { OdooProvider } from '../providers/odoo-provider';
 import { SyncProvider } from '../providers/sync-provider';
-import { ProductTemplateSyncProvider } from '../providers/sync/product-sync-provider';
+import { ProductTemplateSyncProvider } from '../providers/sync/product-template-sync-provider';
 import { ProductAttributeSyncProvider } from '../providers/sync/product-attribute-sync-provider';
 import { ProductAttributeLineSyncProvider } from '../providers/sync/product-attribute-line-sync-provider';
 import { ProductAttributeValueSyncProvider } from '../providers/sync/product-attribute-value-sync-provider';
@@ -34,7 +34,8 @@ import { ToolsProvider } from '../providers/tools-provider';
 
 import { ViewMenuPipe } from '../pipes/view-menu-pipe';
 import { ImageSanitizerPipe } from '../pipes/image-sanitizer-pipe';
-import { ProductAttributeLinePipe } from '../pipes/product-attribute-pipe';
+import { ProductAttributeLinePipe } from '../pipes/product-attribute-line-pipe';
+import { ProductAttributeValuePipe } from '../pipes/product-attribute-value-pipe';
 
 import { ChartModule } from 'ng2-chartjs2';
 
@@ -58,7 +59,8 @@ import { ChartModule } from 'ng2-chartjs2';
         AboutPage,
         ViewMenuPipe,
         ImageSanitizerPipe,
-        ProductAttributeLinePipe
+        ProductAttributeLinePipe,
+        ProductAttributeValuePipe
     ],
     imports: [
         IonicModule.forRoot(OdooMobileApp),

+ 6 - 0
src/decorators/document-type.ts

@@ -0,0 +1,6 @@
+function type(name: string) {
+    return (target: Function) => {
+        console.log(target + " called");
+        
+    }
+}

+ 2 - 0
src/models/product.ts

@@ -1,4 +1,6 @@
+import '../decorators/document-type';
 
+@type('product_template')
 export class Product {
 
     company_id: number = 0;

+ 5 - 5
src/pages/home/home.ts

@@ -34,16 +34,16 @@ export class HomePage {
      *
      */
     draw(): void {
-        this.dataProvider.getAll("products").then(result => {
-            let products: Array<any> = result.products.filter(item => {
+        this.dataProvider.getAll("product").then(products => {
+            let items: Array<any> = products.filter(item => {
                 return item.sales_count;
             }).sort((left, right) => {
                 return left.sales_count - right.sales_count;
             }).slice(0, 10);
 
-            for (let i = 0; i < products.length; i++) {
-                this.labels[i] = products[i].name;
-                this.data[0].data[i] = products[i].sales_count;
+            for (let i = 0; i < items.length; i++) {
+                this.labels[i] = items[i].name;
+                this.data[0].data[i] = items[i].sales_count;
             }
             
         }).catch(e => {

+ 5 - 6
src/pages/product-details/product-details.html

@@ -28,7 +28,7 @@
     <ion-segment [(ngModel)]="view">
         <ion-segment-button value="information">Información</ion-segment-button>
         <ion-segment-button value="supplying">Abastecimiento</ion-segment-button>
-        <ion-segment-button value="variants">Variantes</ion-segment-button>
+        <ion-segment-button value="variants" (ionSelect)="loadVariants()">Variantes</ion-segment-button>
     </ion-segment>
 
     <div [ngSwitch]="view">
@@ -81,19 +81,18 @@
          </ion-list>
 
         <div *ngSwitchCase="'variants'">
-            <ion-card *ngFor="let attribute_line of (product.attribute_line_ids | productAttributeLine:attributes)">
-                {{ attribute_line.attribute_id }}
+            <ion-card *ngFor="let attribute_line of (product.attribute_line_ids | productAttributeLine:attribute_lines)">
                 <ion-item>
                     <ion-label stacked>Atributo</ion-label>
-                    <ion-select [(ngModel)]="attribute_line.attribute_id">
+                    <ion-select [ngModel]="attribute_line.attribute_id" disabled="true">
                         <ion-option *ngFor="let a of attributes" [value]="a.remote_id">{{ a.name }}</ion-option>
                     </ion-select>
                 </ion-item>
 
                 <ion-item>
                     <ion-label stacked>Valor del atributo</ion-label>
-                    <ion-select [(ngModel)]="attribute_line.value_ids" multiple="true">
-                        <ion-option *ngFor="let v of values" [value]="v.id">{{ v.name }}</ion-option>
+                    <ion-select [ngModel]="attribute_line.value_ids" (ngModelChange)="saveAttributeValues(attribute_line.attribute_id, $event)" okText="Aceptar" cancelText="Cancelar" multiple="true">
+                        <ion-option *ngFor="let value of (attribute_values | productAttributeValue:attribute_line.attribute_id)" [value]="value.remote_id">{{ value.name }}</ion-option>
                     </ion-select>
                 </ion-item>
             </ion-card>

+ 58 - 15
src/pages/product-details/product-details.ts

@@ -31,9 +31,13 @@ export class ProductDetailsPage {
         website_published: false,
         remote_id: 0,
         doc_state: "created",
-        attribute_line_ids: []
+        attribute_line_ids: [],
+        write_date: null,
+        rev: null
     }
 
+    attribute_lines: Array<any> = [];
+    attribute_values: Array<any> = [];
     attributes: Array<any> = [];
     view: string = "information";
     watcher: any;
@@ -51,6 +55,8 @@ export class ProductDetailsPage {
         if (!(this.params.data instanceof Array)) {
             this.product = this.params.data;
             this.product.doc_state = "updated";
+
+            delete this.product.rev;
         }
     }
 
@@ -85,17 +91,7 @@ export class ProductDetailsPage {
      *
      */
     private initialize() {
-        let loader = this.loadingCtrl.create({
-            content: "Cargando, espere..."
-        });
-        loader.present();
-
-        this.data.getAll('product_attribute_line').then(attributes => {
-            this.attributes = attributes.product_attribute_lines;
-            loader.dismiss();
-        }).catch(e => { 
-            console.log(e);
-        });
+        
     }
 
     /**
@@ -150,6 +146,32 @@ export class ProductDetailsPage {
         });
     }
 
+    /**
+     *
+     */
+    loadVariants(): void {
+        let loader = this.loadingCtrl.create({
+            content: "Cargando variantes, espere..."
+        });
+        loader.present();
+
+        this.data.getAll('product_attribute_line').then(product_attribute_lines => {
+            this.attribute_lines = product_attribute_lines;
+
+            return this.data.getAll('product_attribute');
+        }).then(product_attributes => {
+            this.attributes = product_attributes;
+
+            return this.data.getAll('product_attribute_value');
+        }).then(product_attribute_values => {
+            this.attribute_values = product_attribute_values;
+
+            loader.dismiss();
+        }).catch(e => {
+            console.log(e);  
+        });
+    }
+
     /**
      *
      */
@@ -162,7 +184,27 @@ export class ProductDetailsPage {
             attribute: 1,
             value: 1
         });
-    } 
+    }
+
+    /**
+     *
+     */
+    saveAttributeValues(attribute_id, attribute_values) {
+        let attribute_line = this.attribute_lines.filter(item => {
+            return this.product.attribute_line_ids.indexOf(item.remote_id) > -1 && item.attribute_id === attribute_id;
+        })[0];
+
+        attribute_line.value_ids = attribute_values;
+
+        this.data.save('product_attribute_line', attribute_line).then(pal => { 
+            console.log(pal);
+            
+        }, e => { 
+            console.log(e);
+            
+        });
+        
+    }
 
     /**
      *
@@ -172,8 +214,9 @@ export class ProductDetailsPage {
             return;
         }
 
-        this.product.company_id = this.preferencesPreferences.getCompany();
-    
+        console.log(this.product);
+        
+
         this.data.save('product', this.product).then(result => {
             if (this.params.data instanceof Array) {
                 this.params.data.push(result.products[0]);

+ 3 - 2
src/pages/product-list/product-list.ts

@@ -24,6 +24,7 @@ export class ProductListPage extends DefaultListable<Product> implements INaviga
         public popoverCtrl: PopoverController
     ){
         super(loadingCtrl);
+        
     }
     
     ionViewDidLoad() {
@@ -39,8 +40,8 @@ export class ProductListPage extends DefaultListable<Product> implements INaviga
         });
 
         loader.present();
-        this.dataProvider.getAll("product_template").then(r => {
-            this.elements = r.product_templates.filter(item => {
+        this.dataProvider.getAll("product_template").then(templates => {
+            this.elements = templates.filter(item => {
                 return item.doc_state !== "deleted"; 
             });
 

+ 0 - 2
src/pipes/product-attribute-pipe.ts → src/pipes/product-attribute-line-pipe.ts

@@ -7,8 +7,6 @@ export class ProductAttributeLinePipe implements PipeTransform {
             return attribute_line_ids.indexOf(item.remote_id) > -1;
         });
 
-        console.log(lines);
-
         return lines; 
     }
 }

+ 12 - 0
src/pipes/product-attribute-value-pipe.ts

@@ -0,0 +1,12 @@
+import { Pipe, PipeTransform } from '@angular/core';
+
+@Pipe({ name: 'productAttributeValue' })
+export class ProductAttributeValuePipe implements PipeTransform {
+    transform(attribute_values: Array<any>, attribute_id?: number) {
+        let values = attribute_values.filter(item => {
+            return item.attribute_id === attribute_id;
+        });
+
+        return values;
+    }
+}

+ 89 - 73
src/providers/data-provider.ts

@@ -11,13 +11,61 @@ PouchDB.plugin(Relational).plugin(Sqlite);
 export class DataProvider {
 
     data: any;
+    schema: Array<any> = [
+        {
+            singular: 'partner',
+            plural: 'partners'
+        },
+        {
+            singular: 'user',
+            plural: 'users'
+        },
+        {
+            singular: 'currency',
+            plural: 'currencies'
+        },
+        {
+            singular: 'company',
+            plural: 'companies'
+        },
+        {
+            singular: 'product_template',
+            plural: 'product_templates'
+        },
+        {
+            singular: 'warehouse',
+            plural: 'warehouses',
+        },
+        {
+            singular: 'stock',
+            plural: 'stocks'
+        },
+        {
+            singular: 'lead',
+            plural: 'leads'
+        },
+        {
+            singular: 'product_attribute',
+            plural: 'product_attributes'
+        },
+        {
+            singular: 'product_attribute_line',
+            plural: 'product_attribute_lines'
+        },
+        {
+            singular: 'product_attribute_value',
+            plural: 'product_attribute_values'
+        },
+        {
+            singular: 'product',
+            plural: 'products'
+        }
+    ];
 
     constructor(
         public platform: Platform
     ) {
-        platform.ready().then(r => {
-            this.initialize();
-        });
+        this.initialize();
     }
 
     /**
@@ -29,56 +77,21 @@ export class DataProvider {
             adapter: this.platform.is('core') ? 'idb' : 'websql'
         });
         
-        this.data.setSchema([
-            {
-                singular: 'partner',
-                plural: 'partners'
-            },
-            {
-                singular: 'user',
-                plural: 'users'
-            },
-            {
-                singular: 'currency',
-                plural: 'currencies'
-            },
-            {
-                singular: 'company',
-                plural: 'companies'
-            },
-            {
-                singular: 'product_template',
-                plural: 'product_templates'
-            },
-            {
-                singular: 'warehouse',
-                plural: 'warehouses',
-            },
-            {
-                singular: 'stock',
-                plural: 'stocks'
-            },
-            {
-                singular: 'lead',
-                plural: 'leads'
-            },
-            {
-                singular: 'product_attribute',
-                plural: 'product_attributes'
-            },
-            {
-                singular: 'product_attribute_line',
-                plural: 'product_attribute_lines'
-            },
-            {
-                singular: 'product_attribute_value',
-                plural: 'product_attribute_value'
-            },
-            {
-                singular: 'product',
-                plural: 'products'
+        this.data.setSchema(this.schema);
+    }
+
+    /**
+     *
+     */
+    private getPlural(singular: string) {
+        for (let i = 0; i < this.schema.length; i++) {
+            if (this.schema[i].singular === singular) {
+                return this.schema[i].plural;
             }
-        ]);
+            
+        }
+
+        return null;
     }
 
     /**
@@ -88,27 +101,29 @@ export class DataProvider {
      */
     save(type: string, data: any): Promise<any> {
         return new Promise((resolve, reject) => {
-            this.platform.ready().then(r => {
-                if (data instanceof Array) {
+            if (data instanceof Array) {
 
-                    each(data, (i, c) => {
-                        this.data.rel.save(type, i).then(() => {
-                            c();
-                        }).catch(e => {
-                            c(e);
-                        });
-                    }, e => {
-                        if (e) {
-                            reject(e);
-                        } else {
-                            resolve();
-                        }
+                each(data, (i, c) => {
+                    this.data.rel.save(type, i).then(() => {
+                        c();
+                    }).catch(e => {
+                        c(e);
                     });
+                }, e => {
+                    if (e) {
+                        reject(e);
+                    } else {
+                        resolve();
+                    }
+                });
 
-                } else {
-                    resolve(this.data.rel.save(type, data));
-                }
-            });
+            } else {
+                this.data.rel.save(type, data).then(doc => { 
+                    resolve(doc[this.getPlural(type)][0]);
+                }).catch(e => {
+                    reject(e);
+                });
+            }
         });
     }
 
@@ -153,11 +168,12 @@ export class DataProvider {
      */
     getAll(type: string): Promise<any> {
         return new Promise((resolve, reject) => {
-            this.platform.ready().then(r => {
-                resolve(this.data.rel.find(type));
+            this.data.rel.find(type).then(result => {
+                resolve(result[this.getPlural(type)]);
+            }).catch(e => {
+                reject(e);
             });
         });
-        
     }
 
     /**

+ 1 - 1
src/providers/sync-provider.ts

@@ -1,5 +1,5 @@
 import { Injectable } from '@angular/core';
-import { ProductTemplateSyncProvider } from './sync/product-sync-provider';
+import { ProductTemplateSyncProvider } from './sync/product-template-sync-provider';
 import { ProductAttributeSyncProvider } from './sync/product-attribute-sync-provider';
 import { ProductAttributeLineSyncProvider } from './sync/product-attribute-line-sync-provider';
 import { ProductAttributeValueSyncProvider } from './sync/product-attribute-value-sync-provider';

+ 1 - 0
src/providers/sync/product-attribute-line-sync-provider.ts

@@ -20,6 +20,7 @@ export class ProductAttributeLineSyncProvider {
             }).then(lines => {
                 return this.storeLines(lines);
             }).then(() => {
+                console.log('product_attribute_line: product attribute lines downloaded');
                 resolve();
             }).catch(e => { 
                 reject(e);    

+ 1 - 0
src/providers/sync/product-attribute-sync-provider.ts

@@ -20,6 +20,7 @@ export class ProductAttributeSyncProvider {
             }).then(attrs => {
                 return this.storeAttributes(attrs);
             }).then(() => {
+                console.log('product_attribute: product attributes downloaded');
                 resolve();
             }).catch(e => { 
                 reject(e);    

+ 1 - 0
src/providers/sync/product-attribute-value-sync-provider.ts

@@ -20,6 +20,7 @@ export class ProductAttributeValueSyncProvider {
             }).then(lines => {
                 return this.storeValues(lines);
             }).then(() => {
+                console.log('product_attribute_value: product attribute values downloaded');
                 resolve();
             }).catch(e => { 
                 reject(e);    

+ 12 - 6
src/providers/sync/product-sync-provider.ts → src/providers/sync/product-template-sync-provider.ts

@@ -20,18 +20,22 @@ export class ProductTemplateSyncProvider {
             }).then(products => {
                 return this.odooProvider.post("product_template", products);
             }).then(() => {
+                console.log('product_template: new products sended');    
                 return this.getUpdatedProducts();
             }).then(products => {
                 return this.odooProvider.put("product_template", products);
             }).then(() => {
+                console.log('product_template: modified products sended');   
                 return this.getDeletedProducts();
             }).then(products => {
                 return this.odooProvider.delete("product_template", products);
             }).then(() => {
+                console.log('product_template: deleted products sended');
                 return this.odooProvider.get("product_template");
             }).then(products => {
                 return this.storeProducts(products);
             }).then(() => {
+                console.log('product_template: products downloaded');
                 resolve(true);    
             }).catch(e => { 
                 reject(e);
@@ -44,8 +48,8 @@ export class ProductTemplateSyncProvider {
      */
     private getCreatedProducts(): Promise<any> {
         return new Promise((resolve, reject) => {
-            this.dataProvider.getAll("product_template").then(r => {
-                resolve(r.product_templates.filter(item => {
+            this.dataProvider.getAll("product_template").then(templates => {
+                resolve(templates.filter(item => {
                     return item.doc_state === "created" || (item.doc_state === "updated" && !item.remote_id);
                 }));
             }).catch(e => {
@@ -59,8 +63,8 @@ export class ProductTemplateSyncProvider {
      */
     private getUpdatedProducts(): Promise<any> {
         return new Promise((resolve, reject) => {
-            this.dataProvider.getAll("product_template").then(data => {
-                let products = data.product_templates.filter(item => {
+            this.dataProvider.getAll("product_template").then(templates => {
+                let products = templates.filter(item => {
                     return item.doc_state === "updated" && item.remote_id;
                 });
                 
@@ -79,8 +83,8 @@ export class ProductTemplateSyncProvider {
      */
     private getDeletedProducts(): Promise<any> {
         return new Promise((resolve, reject) => { 
-            this.dataProvider.getAll("product_template").then(data => {
-                let products = data.product_templates.filter(item => { 
+            this.dataProvider.getAll("product_template").then(templates => {
+                let products = templates.filter(item => { 
                     return item.doc_state === "deleted";
                 });
                 
@@ -102,6 +106,8 @@ export class ProductTemplateSyncProvider {
             this.dataProvider.deleteAll("product_template").then(() => {
                 return;
             }).then(() => {
+                console.log(products);
+                
                 
                 return this.dataProvider.save("product_template", products.map(item => {
                     item.remote_id = item.id;

+ 5 - 5
src/providers/tools-provider.ts

@@ -33,18 +33,18 @@ export class ToolsProvider {
     private getUserInformation(): Promise<any> {
         return new Promise((resolve, reject) => {
 
-            this.dataProvider.getAll("user").then(r => {
+            this.dataProvider.getAll("user").then(users => {
 
-                if (r.users.length == 0) {
+                if (users.length == 0) {
                     this.odooProvider.get("user").then(users => {
                 
                     let user = users.filter(item => {
                         return item.jwt_token === this.preferencesProvider.getToken();
                     });
 
-                    this.dataProvider.save("user", user[0]).then(r => {
-                        this.preferencesProvider.setCompany(r.users[0].company_id);
-                        this.preferencesProvider.setPartner(r.users[0].partner_id);
+                    this.dataProvider.save("user", user[0]).then(user => {
+                        this.preferencesProvider.setCompany(user.company_id);
+                        this.preferencesProvider.setPartner(user.partner_id);
                         
                         resolve();
                     }).catch(e => {