Browse Source

actualizador de datos mejorado y agregado modulo de precarga de datos

robert2206 8 years ago
parent
commit
a70a560602

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

@@ -2,8 +2,9 @@ import { NgModule } from '@angular/core';
 import { IonicApp, IonicModule } from 'ionic-angular';
 import { MyApp } from './app.component';
 
-import { LoginPage } from '../pages/login/login'
-import { HomePage } from '../pages/home/home'
+import { LoginPage } from '../pages/login/login';
+import { HallPage } from '../pages/hall/hall';
+import { HomePage } from '../pages/home/home';
 
 import { CustomerListPage } from '../pages/customer-list/customer-list';
 import { ProductListPage } from '../pages/product-list/product-list';
@@ -24,11 +25,13 @@ import { OdooProvider } from '../providers/odoo-provider';
 import { SyncProvider } from '../providers/sync-provider';
 import { NetworkProvider } from '../providers/network-provider';
 import { PreferencesProvider } from '../providers/preferences-provider';
+import { ToolsProvider } from '../providers/tools-provider';
 
 @NgModule({
     declarations: [
         MyApp,
         LoginPage,
+        HallPage,
         HomePage,
         CustomerListPage,
         ProductListPage,
@@ -49,6 +52,7 @@ import { PreferencesProvider } from '../providers/preferences-provider';
     entryComponents: [
         MyApp,
         LoginPage,
+        HallPage,
         HomePage,
         CustomerListPage,
         ProductListPage,
@@ -67,7 +71,8 @@ import { PreferencesProvider } from '../providers/preferences-provider';
         OdooProvider,
         SyncProvider,
         NetworkProvider,
-        PreferencesProvider
+        PreferencesProvider,
+        ToolsProvider
     ]
 })
 export class AppModule {}

+ 3 - 0
src/pages/hall/hall.html

@@ -0,0 +1,3 @@
+<ion-content padding>
+   <div class="drip"></div>
+</ion-content>

+ 142 - 0
src/pages/hall/hall.scss

@@ -0,0 +1,142 @@
+page-hall {
+    ion-content {
+        background: #3f50b4 !important;
+    }
+// Animation properties
+$anim-width:    200px;
+$anim-height:   250px;
+$anim-duration: 4s;
+
+// Splash properties
+$splash-width:  $anim-width;
+$splash-height: $anim-width / 2;
+$splash-origin: $splash-height / 2;
+$water-level:   $splash-origin;
+
+// Drip properties
+$drip-size:     15px;
+$drip-pos:      ($splash-width / 2) - ($drip-size / 2);
+$drip-rebound:  40px;
+$drip-re-size:  5px;
+$drip-re-pos:   ($splash-width / 2) - ($drip-re-size / 2);
+
+// Colours
+$c-drip:        #FFF;
+$c-splash:      #FFF;
+$c-bg:          #43A2CE;
+
+
+.drip {
+  width: $anim-width;
+  height: $anim-height;
+  display: flex;
+  flex-wrap: wrap;
+  justify-content: center;
+  margin: auto;
+  position: relative;
+
+  &:before {
+    position: absolute;
+    left: $drip-pos;
+    top: 0;
+    content: '';
+    width: $drip-size;
+    height: $drip-size;
+    background-color: $c-drip;
+    border-radius: 50%;
+    opacity: 0;
+    animation: drip $anim-duration ease infinite;
+  }
+
+  &:after {
+    box-sizing: border-box;
+    position: absolute;
+    bottom: 0;
+    left: 0;
+    content: '';
+    width: 0px;
+    height: 0px;
+    border: solid 4px $c-drip;
+    border-radius: 50%;
+    opacity: 0;
+    animation: splash $anim-duration ease infinite;
+  }
+}
+
+@keyframes drip {
+  10% {
+    top: 0;
+    opacity: 1;
+    animation-timing-function: cubic-bezier(.24,0,.76,.14);
+  }
+  25% {
+    opacity: 1;
+    top: $anim-height - $water-level;
+    animation-timing-function: ease-out;
+    width: $drip-size;
+    height: $drip-size;
+    left: $drip-pos;
+  }
+  30% {
+    opacity: 1;
+    top: $anim-height - ($water-level + $drip-rebound);
+    width: $drip-re-size;
+    height: $drip-re-size;
+    animation-timing-function: ease-in;
+    left: $drip-re-pos;
+  }
+  33% {
+    top: $anim-height - $water-level;
+    opacity: 0;
+    animation-timing-function: ease-out;
+    left: $drip-re-pos;
+  }
+  33.001% {
+    opacity: 0;
+  }
+  100% {
+    opacity: 0;
+  }
+}
+
+@keyframes splash {
+  0% {
+    opacity: 0;
+  }
+  25% {
+    bottom: $splash-height / 2;
+    left: $splash-width / 2;
+    opacity: 0;
+    width: 0px;
+    height: 0px;
+  }
+  25.001% {
+    opacity: 1;
+  }
+  33% {
+    bottom: 0;
+    left: 0;
+    opacity: 0;
+    width: $splash-width;
+    height: $splash-height;
+  }
+  33.001% {
+    bottom: $splash-height / 2;
+    left: $splash-width / 2;
+    opacity: 1;
+    width: 0px;
+    height: 0px;
+  }
+  43% {
+    bottom: 0;
+    left: 0;
+    opacity: 0;
+    width: $splash-width;
+    height: $splash-height;
+  }
+  43.001% {
+    opacity: 0;
+  }
+}
+
+}

+ 15 - 0
src/pages/hall/hall.ts

@@ -0,0 +1,15 @@
+import { Component } from '@angular/core';
+import { NavController } from 'ionic-angular';
+
+@Component({
+    selector: 'page-hall',
+    templateUrl: 'hall.html'
+})
+export class HallPage {
+
+    constructor(public navCtrl: NavController) {}
+
+    ionViewDidLoad() {
+      console.log('Hello Hall Page');
+   }
+}

+ 36 - 7
src/pages/login/login.ts

@@ -1,20 +1,22 @@
 import { Component } from '@angular/core';
-import { NavController, MenuController } from 'ionic-angular';
+import { NavController, MenuController, LoadingController, ToastController } from 'ionic-angular';
 import { TokenService } from '../../providers/token-service';
-import { HomePage } from '../home/home'
+import { HallPage } from '../hall/hall';
+import { HomePage } from '../home/home';
 
 @Component({
     selector: 'page-login',
     providers: [TokenService],
     templateUrl: 'login.html'
 })
-
 export class LoginPage {
 
     constructor(
         public navCtrl: NavController,
         public menuCtrl: MenuController,
-        public tokenService: TokenService
+        public tokenService: TokenService,
+        public loaderCtrl: LoadingController,
+        public toastCtrl: ToastController
     ) {}
 
     /**
@@ -24,22 +26,49 @@ export class LoginPage {
         this.menuCtrl.enable(false);
 
         if (this.tokenService.tokenIsPresent()) {
-            this.goToHome();
+             this.goToHall();
         }
     }
 
     // Signin odoo
     signin(): void {
+        let loader = this.loaderCtrl.create({
+             content: "Iniciando sesión, espere..."
+        });
+
+        loader.present();
+
         this.tokenService.getToken().then(r => {
-            console.log(r);
+            loader.dismiss();
+            this.goToHall();
+            // this.goToHome();
+
+            // this.toolsProvider.initializeDatabase().then(r => { 
+            //     loader.dismiss();
+            //     this.goToHome();
+            // }).catch(e => { 
+            //     console.log(e);
+                
+            // });
             
-            this.goToHome();
         }).catch(e => {
             console.log(e);
+            loader.dismiss();
             
+            this.toastCtrl.create({
+                message: "No se pudo establecer una conexión al servidor",
+                duration: 3000
+            }).present();
         });
     }
 
+    /**
+     *
+     */
+    private goToHall(): void {
+        this.navCtrl.setRoot(HallPage);
+    }
+
     // Go to home
     private goToHome(): void {
         this.navCtrl.setRoot(HomePage);

+ 1 - 1
src/pages/product-details/product-details.ts

@@ -12,7 +12,7 @@ import { CameraProvider } from '../../providers/camera-provider';
 export class ProductDetailsPage {
 
     product = {
-        company_id: null,
+        company_id: false,
         default_code: false,
         description: false,
         ean13: false,

+ 44 - 11
src/providers/odoo-provider.ts

@@ -6,16 +6,17 @@ import { PreferencesProvider } from './preferences-provider';
 import 'rxjs/add/operator/toPromise'
 import 'rxjs/add/operator/map';
 import 'rxjs/add/operator/catch';
-import 'rxjs/add/observable/throw'
+import 'rxjs/add/observable/throw';
+import 'rxjs/add/observable/forkJoin';
 
 @Injectable()
 export class OdooProvider {
 
-    url: string;
+    private url: string;
 
     constructor(
-        public http: Http,
-        public preferencesProvider: PreferencesProvider
+        private http: Http,
+        private preferencesProvider: PreferencesProvider
     ) {
         this.url = preferencesProvider.getHost();
         this.normalizeUrl();
@@ -31,32 +32,64 @@ export class OdooProvider {
     /**
      * 
      */
-    post(resource: string, data: Array<any>): Array<Promise<any>> {
+    post(resource: string, data: Array<any>): Promise<any> {
         let headers = new Headers({
+            'Content-Type':  'application/x-www-form-urlencoded',
             'Authorization': 'JWT ' + this.preferencesProvider.getToken()
         });
+
         let options = new RequestOptions({ headers: headers });
 
-        let promises: Array<Promise<any>> = [];
+        let toSend: Array<Observable<Response>> = [];
         for (let i = 0; i < data.length; i++) {
-            promises.push(this.http.post(this.url + resource, null, options).toPromise());
+            this.encodeData(data[i]);
+            toSend.push(this.http.post(this.url + resource, this.encodeData(data[i]), options));
         }
 
-        return promises;
+        return new Promise((resolve, reject) => { 
+            Observable.forkJoin(toSend).subscribe(r => { 
+                resolve(r);
+            }, e => {
+                reject(e);
+            });
+        });
+    }
+
+    /**
+     *
+     */
+    private encodeData(data: any) {
+        let body = [];
+        for (let field in data) {
+            if (['doc_state', "remote_id", "rev"].indexOf(field) == -1) {
+                continue;
+            }
+
+            body.push(field + "=" + data[field]);
+        }
+
+       return body.join("&");
     }
     
     /**
      *
      */
-    get(resource: string): Observable<Array<any>> {
+    get(resource: string, id?: number, filter?: Array<[string, string]>): Promise<any> {
         this.url = this.url + resource;
 
         let headers = new Headers({
             'Authorization': 'JWT ' + this.preferencesProvider.getToken()
         });
+        
         let options = new RequestOptions({ headers: headers });
- 
-        return this.http.get(this.url, options).map(this.extractData).catch(this.handleError);
+
+        return new Promise((resolve, reject) => {
+            this.http.get(this.url, options).toPromise().then(r => { 
+                resolve(r);
+            }).catch(e => { 
+                reject(e);
+            });
+        });
     }
 
     /**

+ 13 - 29
src/providers/sync-provider.ts

@@ -2,7 +2,6 @@ import { Injectable } from '@angular/core';
 import { DataProvider } from './data-provider';
 import { OdooProvider } from './odoo-provider';
 import { NetworkProvider } from './network-provider'
-import * as Async from 'async-each';
 
 @Injectable()    
 export class SyncProvider {
@@ -10,34 +9,20 @@ export class SyncProvider {
     constructor(
         public dataProvider: DataProvider,
         public odooProvider: OdooProvider
-    ) { 
-        console.log(Async);
-    }
+    ) { }
 
     /**
      *
      */
     doSync(): Promise<any> {
         return new Promise((resolve, reject) => {
-            // this.odooProvider.get("products").subscribe(data => {
-            
-            //     data.forEach(item => { 
-            //         this.dataProvider.save("product", item);
-            //     });
-                
-            //     resolve();
-            // }, err => {
-            //     reject();
-            // });
-            Promise.all([
-                this.pushCreatedProducts()
-            ]).then(r => {
-                console.log(r);
-                resolve();
-            }).catch(e => {
-                console.log(e);
-                reject(e);
+            this.getCreatedProducts().then(p => {
+                this.odooProvider.post("products", p).then(r => { 
+                    resolve(r);
+                }).catch(e => {
+                    reject(e);
                 });
+            });            
         });
     }
 
@@ -46,13 +31,12 @@ export class SyncProvider {
      */
     private pushCreatedProducts(): any {
         this.getCreatedProducts().then(p => {
-            return this.odooProvider.post("products", p);
-
-        }).then(p => {
-
-            console.log(p);
+            let promises = this.odooProvider.post("products", p);
             
-            return Promise.resolve();
+            console.log(promises);
+            
+        }).catch(e => {
+            console.log(e);
         });
     }
 
@@ -79,7 +63,7 @@ export class SyncProvider {
             this.dataProvider.getAll("product").then(r => { 
                 resolve(r.products.filter(item => {
                     return item.doc_state === "updated" && item.remote_id != 0;
-                 }));
+                }));
             }).catch(e => {
                 reject(e);
             });

+ 7 - 7
src/providers/token-service.ts

@@ -2,7 +2,7 @@ import { Injectable } from '@angular/core';
 import { Http, Response, Headers, RequestOptions } from '@angular/http';
 import { Observable } from 'rxjs/Observable'
 import { Token } from '../components/token-component';
-import { PreferencesProvider } from '../providers/preferences-provider';
+import { PreferencesProvider } from './preferences-provider';
 
 import 'rxjs/add/operator/map';
 import 'rxjs/add/operator/catch';
@@ -11,13 +11,13 @@ import 'rxjs/add/observable/throw'
 @Injectable()
 export class TokenService {
 
-    username: string = 'admin';
-    password: string = 'admin';
-    url: string = '192.168.88.123:8069';
+    private username: string = 'admin';
+    private password: string = 'admin';
+    private url: string = '192.168.88.123:8069';
 
     constructor(
-        public http: Http,
-        public preferencesProvider: PreferencesProvider
+        private http: Http,
+        private preferencesProvider: PreferencesProvider
     ) {
     }
 
@@ -54,10 +54,10 @@ export class TokenService {
 
         return this.http.post(this.normalizeCheckUrl(this.url), body, options).map(this.extractCheckData).catch(this.handleError);
     }
+    
     /**
     * Extract check value from token verification
     */
-
     private extractCheckData(response: Response): boolean {
         let body = response.json();
         return body.token == 'valid' ? true : false;

+ 22 - 0
src/providers/tools-provider.ts

@@ -0,0 +1,22 @@
+import { Injectable } from '@angular/core';
+import { OdooProvider } from './odoo-provider';
+// import { DataProvider } from './data-provider';
+
+
+@Injectable()
+export class ToolsProvider {
+
+    constructor(
+        public odooProvider: OdooProvider,
+        // public dataProvider: DataProvider
+    ) { }
+    
+    /**
+     *
+     */
+    initializeDatabase(): Promise<any> {
+        return new Promise((resolve, reject) => {
+            resolve("ok");
+        });
+    }
+}