Przeglądaj źródła

all details view linked to correspond list

robert2206 8 lat temu
rodzic
commit
f62fc216b7

+ 6 - 1
src/app/app.component.ts

@@ -50,6 +50,7 @@ export class MyApp {
                         icon: "basket",
                         component: OrdersPage,
                         params: {
+                            kind: "budget",
                             filters: [["state", "=", "draft"]]
                         }
                     },
@@ -59,6 +60,7 @@ export class MyApp {
                         icon: "cart",
                         component: OrdersPage,
                         params: {
+                            kind: "sale",
                             filters: [["state", "!=", "draft"]]
                         }
                     },
@@ -86,6 +88,7 @@ export class MyApp {
                         icon: "flag",
                         component: LeadsPage,
                         params: {
+                            kind: "lead",
                             filters: [["type", "=", "lead"]]
                         }
                     },
@@ -95,6 +98,7 @@ export class MyApp {
                         icon: "bonfire",
                         component: LeadsPage,
                         params: {
+                            kind: "opportunity",
                             filters: [["type", "=", "opportunity"]]
                         }
                     },
@@ -157,7 +161,8 @@ export class MyApp {
                             handler: () => {
                                 this.alertCtrl.create({
                                     title: "Detalles del error",
-                                    message: data
+                                    message: data,
+                                    buttons: [{ text: "Cerrar" }]
                                 }).present();
                             }
                         },

+ 6 - 0
src/app/app.module.ts

@@ -24,6 +24,8 @@ import { AboutPage } from "../pages/about/about";
 import { CustomerPage } from "../pages/customer/customer";
 import { ProductPage } from "../pages/product/product";
 import { OrderPage } from "../pages/order/order";
+import { LeadPage } from "../pages/lead/lead";
+import { PhonecallPage } from "../pages/phonecall/phonecall";
 
 // Services
 import { OdooRPCService } from "angular2-odoo-jsonrpc";
@@ -57,6 +59,8 @@ import { DoubleTap } from "../directives/double-tap";
         CustomerPage,
         ProductPage,
         OrderPage,
+        LeadPage,
+        PhonecallPage,
         // Components
         OMasterHeader,
         OMasterFooter,
@@ -87,6 +91,8 @@ import { DoubleTap } from "../directives/double-tap";
         CustomerPage,
         ProductPage,
         OrderPage,
+        LeadPage,
+        PhonecallPage,
         // Other Pages
         ToolsPage,
         AboutPage,

+ 19 - 2
src/base/base-details-view.ts

@@ -7,12 +7,14 @@ import { EventsManager } from "../base/events/event-manager";
 export abstract class BaseDetailsView<T> extends BaseView<T> {
 
     item: T;
+    kind: string;
     action: string;
 
-    constructor(c: { new (): T; }, item?: T) {
+    constructor(c: { new (): T; }, item?: T, kind?: string) {
         super(c, PouchService);
-        
+
         this.item = item;
+        this.kind = kind;
         this.action = this.itemExists() ? "to_update" : "to_create";
     }
 
@@ -31,6 +33,21 @@ export abstract class BaseDetailsView<T> extends BaseView<T> {
         this.item = item;
     }
 
+    /**
+     * 
+     */
+    getKind(): string {
+        return this.kind;
+    }
+
+    /**
+     * 
+     * @param kind 
+     */
+    setKind(kind: string): void {
+        this.kind = kind;
+    }
+
     /**
      * 
      */

+ 4 - 2
src/pages/customer/customer.ts

@@ -19,7 +19,7 @@ export class CustomerPage extends BaseDetailsView<Partner>{
         public formBuilder: FormBuilder
     ) {
         super(Partner, navParams.data); 
-        super.setTitle(super.itemExists() ? "Editar Cliente" : "Nuevo Cliente");
+        super.setTitle(super.itemExists() ? "Editar Cliente" : "Crear Cliente");
 
         this.customerForm = this.formBuilder.group({
             name: ["", Validators.required],
@@ -53,7 +53,9 @@ export class CustomerPage extends BaseDetailsView<Partner>{
             return;
         }
 
-        super.setItem(Object.assign(this.getItem(), data, { customer: true }));
+        console.log(super.getItem());
+        
+        super.setItem(Object.assign(super.getItem(), data, { customer: true }));
         super.performSave();
         this.navCtrl.pop();
     }

+ 2 - 2
src/pages/customers/customers.ts

@@ -31,7 +31,7 @@ export class CustomersPage extends BaseListView<Partner> {
      * 
      */
     ionViewDidEnter() {
-        super.setSelectedIndex(-1);
+        super.deselectItem();
     }
 
     /**
@@ -77,7 +77,7 @@ export class CustomersPage extends BaseListView<Partner> {
                     text: "Cancelar",
                     role: "cancel",
                     handler: () => {
-                        super.setSelectedIndex(-1);
+                        super.deselectItem();
                     }
                 },
             ]

+ 14 - 0
src/pages/lead/lead.html

@@ -0,0 +1,14 @@
+<ion-header>
+    <ion-navbar>
+        <ion-title>{{ title }}</ion-title>
+        <ion-buttons end>
+            <!--<button ion-button type="submit" form="details-form" [visible]="productForm.invalid">-->
+            <button ion-button type="submit" form="details-form">
+                GUARDAR
+            </button>
+        </ion-buttons>
+    </ion-navbar>
+</ion-header>
+<ion-content>
+
+</ion-content>

+ 3 - 0
src/pages/lead/lead.scss

@@ -0,0 +1,3 @@
+page-lead {
+
+}

+ 30 - 0
src/pages/lead/lead.ts

@@ -0,0 +1,30 @@
+import { Component } from '@angular/core';
+import { NavController, NavParams } from 'ionic-angular';
+
+import { Lead } from "../../odoo/models/crm.lead";
+import { BaseDetailsView } from "../../base/base-details-view";
+
+@Component({
+    selector: 'page-lead',
+    templateUrl: 'lead.html'
+})
+export class LeadPage extends BaseDetailsView<Lead> {
+
+    constructor(
+        public navCtrl: NavController,
+        public navParams: NavParams
+    ) { 
+        super(Lead, navParams.data.item, navParams.data.kind);
+
+        let titleKind = super.getKind() === "lead" ? "Iniciativa" : "Oportunidad";
+        super.setTitle(super.itemExists() ? "Editar " + titleKind : "Crear " + titleKind);
+    }
+
+    /**
+     * 
+     */
+    ionViewDidLoad() {
+        console.log('ionViewDidLoad LeadPage');
+    }
+
+}

+ 6 - 6
src/pages/leads/leads.html

@@ -8,8 +8,8 @@
 </ion-header>
 <ion-content>
    <ion-list [virtualScroll]="getItems()" approxItemHeight="35px">
-		<ion-item *virtualItem="let item">
-			<h2>{{ item.contact_name }}</h2>
+		<ion-item *virtualItem="let item" (doubleTap)="openOptions(item)" [ngClass]="{ 'selected-item': item === getSelectedItem() }">
+			<h2>{{ item.contact_name || "Sin Contacto" }}</h2>
             <p>{{ item.name }}</p>
             <p>
                 <strong>Probabilidad:</strong>
@@ -17,20 +17,20 @@
             </p>
             <p>
                 <strong>Celular:</strong>
-                {{ item.mobile }}
+                {{ item.mobile || "n/a" }}
             </p>
             <p>
                 <strong>Teléfono:</strong>
-                {{ item.phone }}
+                {{ item.phone || "n/a" }}
             </p>
             <p>
                 <strong>Dirección:</strong>
-                {{ item.street }}
+                {{ item.street || "n/a"}}
             </p>
 		</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>

+ 90 - 3
src/pages/leads/leads.ts

@@ -1,18 +1,21 @@
 import { Component } from '@angular/core';
-import { NavController, NavParams } from 'ionic-angular';
+import { NavController, NavParams, ActionSheetController, AlertController } from 'ionic-angular';
 
 import { BaseListView } from "../../base/base-list-view";
 import { Lead } from "../../odoo/models/crm.lead";
+import { LeadPage } from "../lead/lead";
 
 @Component({
     selector: 'page-leads',
     templateUrl: 'leads.html'
 })
-export class LeadsPage extends BaseListView<Lead> {
+export class LeadsPage extends BaseListView<Lead>  {
 
     constructor(
         public navCtrl: NavController,
-        public navParams: NavParams
+        public navParams: NavParams,
+        public actionSheetCtrl: ActionSheetController,
+        public alertCtrl: AlertController
     ) { 
         super(Lead);
 
@@ -20,7 +23,91 @@ export class LeadsPage extends BaseListView<Lead> {
         this.setFilters(navParams.data.params.filters);
     }
 
+    /**
+     * 
+     */
     ionViewDidLoad() {
         console.log('ionViewDidLoad LeadsPage');
     }
+
+    /**
+     * 
+     */
+    ionViewDidEnter() {
+        super.deselectItem();
+    }
+
+      /**
+     * 
+     * @param item
+     */
+    openOptions(item: Lead): void {
+        super.setSelectedItem(item);
+        
+        this.actionSheetCtrl.create({
+            title: "Opciones",
+            buttons: [
+                {
+                    text: "Abrir",
+                    icon: "open",
+                    handler: () => {
+                        this.goToDetails();
+                    }
+                },
+                {
+                    text: "Convertir a Oportunidad",
+                    icon: "share-alt",
+                    handler: () => {
+                        console.log("convert");
+                    }
+                },
+                {
+                    text: "Eliminar",
+                    icon: "close",
+                    role: "destructive",
+                    handler: () => {
+                        this.askIfDelete();
+                    }
+                },
+                {
+                    text: "Cancel",
+                    role: "cancel",
+                    handler: () => {
+                        super.deselectItem();
+                    }
+                },
+            ]
+        }).present();
+    }
+
+     /**
+     * 
+     */
+    goToDetails(): void {
+        this.navCtrl.push(LeadPage, {
+            item: super.getSelectedItem(),
+            kind: this.navParams.data.params.kind
+        });
+    }
+
+    /**
+     * 
+     */
+    askIfDelete(): void {
+        this.alertCtrl.create({
+            title: "Confirmar",
+            message: "Quieres eliminar esta iniciativa?",
+            buttons: [
+                {
+                    text: "Cancelar"
+                },
+                {
+                    text: "Aceptar",
+                    handler: () => {
+                        super.performDelete();
+                    }
+                }
+            ]
+        }).present();
+    }
 }

+ 4 - 4
src/pages/order/order.ts

@@ -15,10 +15,10 @@ export class OrderPage extends BaseDetailsView<SaleOrder> {
         public navCtrl: NavController,
         public navParams: NavParams
     ) { 
-        super(SaleOrder, navParams.data.item);
-        console.log(navParams.data);
-        
-        super.setTitle(super.itemExists() ? "Editar Presupuesto" : "Nuevo Presupuesto");
+        super(SaleOrder, navParams.data.item, navParams.data.kind);
+
+        let titleKind = super.getKind() === "budget" ? "Presupuesto" : "Venta";
+        super.setTitle(super.itemExists() ? "Editar " + titleKind : "Crear " + titleKind);
     }
 
     /**

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

@@ -8,7 +8,7 @@
 </ion-header>
 <ion-content>
     <ion-list [virtualScroll]="getItems()" approxItemHeight="141px">
-		<ion-item *virtualItem="let item" (doubleTap)="openOptions(item)">
+		<ion-item *virtualItem="let item" (doubleTap)="openOptions(item)" [ngClass]="{ 'selected-item': item === getSelectedItem() }">
 			<h2>{{ item.name }}</h2>
             <p>
                 <strong>Cantidad:</strong>

+ 4 - 1
src/pages/orders/orders.ts

@@ -84,7 +84,10 @@ export class OrdersPage extends BaseListView<SaleOrder> {
      * 
      */
     goToDetails(): void {
-        this.navCtrl.push(OrderPage, super.getSelectedItem());
+        this.navCtrl.push(OrderPage, {
+            item: super.getSelectedItem(),
+            kind: this.navParams.data.params.kind
+        });
     }
 
     /**

+ 14 - 0
src/pages/phonecall/phonecall.html

@@ -0,0 +1,14 @@
+<ion-header>
+    <ion-navbar>
+        <ion-title>{{ title }}</ion-title>
+        <ion-buttons end>
+            <!--<button ion-button type="submit" form="details-form" [visible]="productForm.invalid">-->
+            <button ion-button type="submit" form="details-form">
+                GUARDAR
+            </button>
+        </ion-buttons>
+    </ion-navbar>
+</ion-header>
+<ion-content padding>
+
+</ion-content>

+ 3 - 0
src/pages/phonecall/phonecall.scss

@@ -0,0 +1,3 @@
+page-phonecall {
+
+}

+ 27 - 0
src/pages/phonecall/phonecall.ts

@@ -0,0 +1,27 @@
+import { Component } from '@angular/core';
+import { NavController, NavParams } from 'ionic-angular';
+
+import { Phonecall } from "../../odoo/models/crm.phonecall";
+import { BaseDetailsView } from "../../base/base-details-view";
+
+@Component({
+    selector: 'page-phonecall',
+    templateUrl: 'phonecall.html'
+})
+export class PhonecallPage extends BaseDetailsView<Phonecall> {
+
+    constructor(
+        public navCtrl: NavController,
+        public navParams: NavParams
+    ) { 
+        super(Phonecall, navParams.data);
+        super.setTitle(super.itemExists() ? "Editar Llamada" : "Crear Llamada");
+    }
+
+    /**
+     * 
+     */
+    ionViewDidLoad() {
+        console.log('ionViewDidLoad PhonecallPage');
+    }
+}

+ 2 - 2
src/pages/phonecalls/phonecalls.html

@@ -8,7 +8,7 @@
 </ion-header>
 <ion-content>
   <ion-list [virtualScroll]="getItems()" approxItemHeight="215px">
-		<ion-item *virtualItem="let item">
+		<ion-item *virtualItem="let item" (doubleTap)="openOptions(item)" [ngClass]="{ 'selected-item': item === getSelectedItem() }">
 			<h2>{{ item.date }}</h2>
             <p>{{ item.name }}</p>
             <p>
@@ -22,7 +22,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>

+ 76 - 2
src/pages/phonecalls/phonecalls.ts

@@ -1,8 +1,9 @@
 import { Component } from '@angular/core';
-import { NavController, NavParams } from 'ionic-angular';
+import { NavController, NavParams, ActionSheetController, AlertController } from 'ionic-angular';
 
 import { BaseListView } from "../../base/base-list-view";
 import { Phonecall } from "../../odoo/models/crm.phonecall";
+import { PhonecallPage } from "../phonecall/phonecall"
 
 @Component({
     selector: 'page-phonecalls',
@@ -12,7 +13,9 @@ export class PhonecallsPage extends BaseListView<Phonecall> {
 
     constructor(
         public navCtrl: NavController,
-        public navParams: NavParams
+        public navParams: NavParams,
+        public actionSheetCtrl: ActionSheetController,
+        public alertCtrl: AlertController
     ) { 
         super(Phonecall);
     }
@@ -23,4 +26,75 @@ export class PhonecallsPage extends BaseListView<Phonecall> {
     ionViewDidLoad() {
         console.log('ionViewDidLoad PhonecallsPage');
     }
+
+    /**
+     * 
+     */
+    ionViewDidEnter() {
+        super.deselectItem();
+    }
+
+    /**
+     * 
+     * @param item
+     */
+    openOptions(item: Phonecall): void {
+        super.setSelectedItem(item);
+        
+        this.actionSheetCtrl.create({
+            title: "Opciones",
+            buttons: [
+                {
+                    text: "Abrir",
+                    icon: "open",
+                    handler: () => {
+                        this.goToDetails();
+                    }
+                },
+                {
+                    text: "Eliminar",
+                    icon: "close",
+                    role: "destructive",
+                    handler: () => {
+                        this.askIfDelete();
+                    }
+                },
+                {
+                    text: "Cancelar",
+                    role: "cancel",
+                    handler: () => {
+                        super.deselectItem();
+                    }
+                },
+            ]
+        }).present();
+    }
+
+    /**
+     * 
+     */
+    goToDetails(): void {
+        this.navCtrl.push(PhonecallPage, super.getSelectedItem());
+    }
+
+    /**
+     * 
+     */
+    askIfDelete(): void {
+        this.alertCtrl.create({
+            title: "Confirmar",
+            message: "Quieres eliminar esta llamada?",
+            buttons: [
+                {
+                    text: "Cancelar"
+                },
+                {
+                    text: "Aceptar",
+                    handler: () => {
+                        super.performDelete();
+                    }
+                }
+            ]
+        }).present();
+    }
 }

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

@@ -45,7 +45,7 @@ export class ProductPage extends BaseDetailsView<ProductTemplate>{
             return;
         }
 
-        // super.setItem(Object.assign(this.getItem(), data));
+        super.setItem(Object.assign(this.getItem(), data));
         super.performSave();
         this.navCtrl.pop();
     }