Browse Source

Adding saving distributor functionality

Herton 7 years ago
parent
commit
7c61bb992c

+ 1 - 0
index.html

@@ -3,6 +3,7 @@
   <head>
     <meta charset="utf-8">
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
+    <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.0.12/css/all.css" integrity="sha384-G0fIWCsCzJIMAVNQPfjH08cyYaUtMwjJwqiRKxxE/rx96Uroj1BtIQ6MLJuheaO9" crossorigin="anonymous">
     <title>Vue-distributors</title>
   </head>
   <body>

+ 119 - 46
src/components/Distributor-form.vue

@@ -5,7 +5,7 @@
       <b-form-group :label="labels.title"
                     label-for="distributor_title">
         <b-form-input id="distributor_title"
-                      v-model="distributor.title"
+                      v-model="distributorLocal.title"
                       required
                       :placeholder="labels.titlePlaceholder">
         </b-form-input>
@@ -14,7 +14,7 @@
       <b-form-group :label="labels.notes"
                       label-for="distributor_notes">
         <b-form-textarea id="distributor_notes"
-                      v-model="distributor.notes"
+                      v-model="distributorLocal.notes"
                       :placeholder="labels.notesPlaceholder"
                       :rows="3"
                       :max-rows="6">
@@ -23,7 +23,7 @@
        <!-- Contacts Fields -->
       <b-form-group :label="labels.contacts">
         <!-- If there are any contacts -->
-        <b-table v-if="names" :items="contacts" :fields="names">
+        <b-table v-if="names" :items="contacts" :fields="names" class="contacts-list">
           <template slot="actions" slot-scope="row">
             <b-button size="sm" @click.stop="onDelete(row.item)" class="mr-1">
               {{labels.delete}}
@@ -31,25 +31,78 @@
           </template>            
         </b-table>
         <!-- Inline contacts form -->
-        <b-form inline v-for="(contact, key) in distributor.contacts" :key="contact.id">
-          <b-input class="mb-3 mr-sm-3" 
-              v-model="contact.name"
-              :placeholder="labels.name" />
+        <b-form inline v-for="(contact, key) in distributorLocal.contacts" :key="contact.id">
+          <b-container>
+            <b-row>
+              <b-input-group class="col mb-3">
+                <b-input v-model="contact.name"
+                :placeholder="labels.name" />
+              </b-input-group>
+              
+              <b-input-group class="col mb-3">
+                <b-input v-model="contact.email" 
+                    type="email"
+                    :placeholder="labels.email" />
+              </b-input-group>
 
-          <b-input class="mb-3 mr-sm-3" 
-              v-model="contact.email" 
-              type="email"
-              :placeholder="labels.email" />
+              <b-input-group class="col mb-3">
+                <b-input v-model="contact.phone" 
+                  :placeholder="labels.phone"/>
+              </b-input-group>
 
-          <b-input class="mb-3 mr-sm-3" 
-              v-model="contact.phone" 
-              :placeholder="labels.phone"/>
-              
-          <b-button @click.stop="onDelete(key)" class="mb-3 mr-sm-3" variant="danger">{{labels.delete}}</b-button>
-        
+              <b-input-group class="col mb-3 col-sm-2">
+                <b-button @click.stop="onDelete(key)" 
+                  size="sm" 
+                  v-b-tooltip.hover :title="labels.delete"
+                  variant="danger">
+                  <i class="far fa-trash-alt"></i>
+                </b-button>
+              </b-input-group>
+            </b-row> 
+          </b-container>
+          
         </b-form>
 
         <b-form-group>
+          <!-- Inline New contact -->
+          <b-form inline v-if="newContact.show">
+            <b-container>
+              <b-row>
+                <b-input-group class="col mb-3">
+                  <b-input v-model="newContact.name"
+                      :placeholder="labels.name" />
+                </b-input-group>
+
+                <b-input-group class="col mb-3">
+                <b-input v-model="newContact.email" 
+                    type="email"
+                    :placeholder="labels.email" />
+                </b-input-group>
+
+                <b-input-group class="col mb-3">
+                  <b-input v-model="newContact.phone" 
+                    :placeholder="labels.phone"/>
+                </b-input-group>
+                <!-- Saving new contact -->
+                <b-input-group class="col mb-3 col-sm-2">
+                  <b-button @click.stop="onSaveContact()" 
+                      size="sm" 
+                      class="mr-3"
+                      v-b-tooltip.hover :title="labels.save"
+                      variant="success">
+                      <i class="far fa-save"></i>
+                  </b-button>
+                  <!-- Cancel adding contact -->
+                  <b-button @click.stop="onCancelSaveContact()" 
+                    size="sm" 
+                    v-b-tooltip.hover :title="labels.cancel"
+                    variant="danger">
+                    {{labels.cancel}}
+                  </b-button>
+                </b-input-group>
+              </b-row>
+            </b-container>
+          </b-form>
           <b-button @click.stop="onAddContact()" class="mb-12 mr-sm-12"  variant="primary">{{labels.add}}</b-button>
         </b-form-group>
     
@@ -80,17 +133,24 @@ export default {
         title: 'Title:',
         notes: 'Notes:',
         contacts: 'Contacts:',
-        delete: 'Delete',
+        delete: 'Delete contact',
         submit: 'Save',
         cancel: 'Cancel',
         titlePlaceholder: 'Enter title',
         notesPlaceholder: 'Enter something',
         add: 'Add Contact',
+        save: 'Save',
         name: 'Name',
         email: 'Email',
         phone: 'Phone',
       },
-      backup: {},
+      newContact: {
+        show: false,
+        name: '',
+        email: '',
+        phone: '',
+      },
+      distributorLocal: {},
     }
   },
   computed: {
@@ -98,28 +158,14 @@ export default {
           contacts: types.GET_CONTACTS,
           names: types.GET_CONTACT_FIELDS,
       }),
-      distributor: {
-        get() {
-          return this.$store.getters['distributor/GET_DISTRIBUTOR'](this.id)
-        },
-        set(val) {
-          //Placeholder
-        },
+      distributor() {
+        return this.$store.getters['distributor/GET_DISTRIBUTOR'](this.id)
       },
   },
   watch: {
-    distributor: {
-      handler(val){
-          this.saveDistributor({
-            id: val.id, 
-            distributor: val
-          });
-      },
-      deep: true
-    },
-    id(newId, oldId) {
-      if (newId !== oldId) {
-        this.backup = cloneDeep(this.distributor);
+    id(newId) {
+      if (newId) {
+        this.distributorLocal = cloneDeep(this.distributor);
       }
     }
   },
@@ -128,29 +174,56 @@ export default {
           saveDistributor: types.SET_DISTRIBUTOR,
       }),
     onSubmit (ev) {
-      // No need to save as all should already be saved
+      this.saveDistributor({
+        id: this.distributorLocal.id, 
+        distributor: this.distributorLocal
+      });
       this.$root.$emit('bv::hide::modal', 'distributor_modal_form');
     },
     onAddContact () {
-      console.log('add');
+      this.newContact.show = true;
+    },
+    onSaveContact() {
+      this.distributorLocal.contacts.push(this.newContact);
+      this.newContact.show = false;
+    },
+    onCancelSaveContact() {
+      this.newContact.show = false;
     },
     onDelete(item) {
-      console.log('delete', item);
+      this.distributorLocal.contacts.splice(item);
     },
     onCancel() {
-      //Reset the changes
-      this.saveDistributor({
-          id: this.backup.id, 
-          distributor: this.backup
-        });
       this.$root.$emit('bv::hide::modal', 'distributor_modal_form');
     }
   },
+  mounted() {
+    this.localCopy = cloneDeep(this.distributor);
+  },
 }
 </script>
 
 <style lang="scss">
   #distributor-form{
     text-align: left;
+    .col-form-label {
+      font-weight: 700;
+      font-size: 1.1em;
+    }
+    .contacts-list {
+      tr {
+        & th {
+          width: 25%;
+          &:last-child {
+            width: 18%;
+          }
+        }
+      }
+    }
+    .form-inline {
+      .input-group {
+        padding-left: 0;
+      }
+    }
   }
 </style>

+ 14 - 5
src/components/Distributor-modal-form.vue

@@ -4,7 +4,8 @@
       <b-modal id="distributor_modal_form" 
             :title="modalTitle"
             size="lg"
-            @hide="resetModal" hideFooter>
+            ref="distributor_modal"
+            @hide="closeModal" hideFooter>
         <!-- Distributor Form -->
         <distributor-form 
             :id="distributorId"/>
@@ -28,17 +29,25 @@ export default {
     },
   },
   data () {
-    return {
-    }
+    return {}
   },
   computed: {
       modalTitle() {
           return this.distributorId ? 'Edit distributor' : 'Add a distributor';
       },
+      showingModal() {
+        let isVisible;
+        if (this.$refs.distributor_modal) {
+            isVisible = this.$refs.distributor_modal.is_visible;
+        }
+        return isVisible;
+      },
   },
   methods: {
-    resetModal () {
-      this.$emit('closeItem');
+    // This method gets called when we close the modal from itself 
+    // We need this to reset the distributor id and allow reactivity
+    closeModal () {
+      this.$emit('closeModal');
     },
   },
 }

+ 8 - 5
src/components/Distributor.vue

@@ -9,7 +9,7 @@
       <!-- Distributor modal -->
       <distributor-modal-form
           :distributorId="selectedId"
-          @resetModal="resetModal">
+          @closeModal="resetDistributorModal">
       </distributor-modal-form>
 
       <div class="row mb-3">
@@ -17,8 +17,11 @@
 
            <!-- Action to edit Distributor-->
           <template slot="actions" slot-scope="row">
-            <b-button size="sm" @click.stop="editDistributor(row.item)" class="mr-1">
-              {{labels.edit_distributor}} 
+            <b-button size="sm" 
+            @click.stop="editDistributor(row.item)" 
+            class="mr-1"
+            v-b-tooltip.hover :title="labels.edit_distributor">
+              <i class="fas fa-edit"></i>
             </b-button>
           </template>      
 
@@ -70,9 +73,9 @@ export default {
       this.selectedId = parseInt(item.id);
       this.$root.$emit('bv::show::modal', 'distributor_modal_form')
     },
-    resetModal () {
+    // This method gets triggered afeter we close the modal from itself 
+    resetDistributorModal () {
       this.selectedId = null;
-      console.log('Modal resets');
     },
     ...mapActions({
       loadMockedDistributors: types.FETCH_DISTRIBUTORS,

+ 2 - 8
src/store/modules/distributor/getters.js

@@ -1,17 +1,11 @@
 import * as types from '../../types';
 
-const UUID = '44490103-92B7-4712-B494'; //A starting client side id
-let random = Math.floor(Math.random() * 9000);
-let count = 0;
 class DistributorClass {
     constructor() {
-        //Setting a random client side unique contact id
-        let uuid = uuid || `${UUID+count++}-${random}`;
         //Setting the basic properties
         this.title = '';
         this.notes = '';
         this.contacts = [{
-                uuid: uuid,
                 name: '',
                 email: '',
                 phone: '',
@@ -31,8 +25,8 @@ export default {
     [types.GET_CONTACT_FIELDS]: state => {
         let dist = new DistributorClass();
         let keys = Object.keys(dist.contacts[0]);
-        keys = keys.slice(1); //Removing uuid column
-        keys.push(''); //Adding empty Action column
+        keys = keys.filter(key=>key!=='uuid'); //Removing uuid column
+        keys.push('actions'); //Adding Action column
         return keys;
     },
     [types.GET_DISTRIBUTORS]: state => {