Add initial "inventory" component, for updating row counts
This commit is contained in:
		
							parent
							
								
									62d3c5fc05
								
							
						
					
					
						commit
						af21cab150
					
				
					 3 changed files with 230 additions and 0 deletions
				
			
		|  | @ -5,6 +5,7 @@ import ByjoveFeedback from './feedback' | |||
| import ByjoveAutocomplete from './autocomplete' | ||||
| import ByjoveModelIndex from './model-index' | ||||
| import ByjoveModelCrud from './model-crud' | ||||
| import ByjoveInventory from './inventory' | ||||
| import ByjoveReceiving from './receiving' | ||||
| 
 | ||||
| export { | ||||
|  | @ -15,5 +16,6 @@ export { | |||
|     ByjoveAutocomplete, | ||||
|     ByjoveModelIndex, | ||||
|     ByjoveModelCrud, | ||||
|     ByjoveInventory, | ||||
|     ByjoveReceiving, | ||||
| } | ||||
|  |  | |||
							
								
								
									
										200
									
								
								src/components/inventory/ByjoveInventory.vue
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										200
									
								
								src/components/inventory/ByjoveInventory.vue
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,200 @@ | |||
| <template> | ||||
|   <div class="inventory"> | ||||
| 
 | ||||
|     <nav class="breadcrumb"> | ||||
|       <ul> | ||||
|         <li> | ||||
|           <router-link :to="getIndexUrl()"> | ||||
|             Inventory | ||||
|           </router-link> | ||||
|         </li> | ||||
|         <li> | ||||
|           <router-link :to="getBatchUrl()"> | ||||
|             {{ row.batch_id_str }} | ||||
|           </router-link> | ||||
|         </li> | ||||
|         <li> | ||||
|             {{ row[productKey] }} | ||||
|         </li> | ||||
|       </ul> | ||||
|     </nav> | ||||
| 
 | ||||
|     <div style="display: flex;"> | ||||
|       <div style="flex-grow: 1;"> | ||||
|         <p class="has-text-weight-bold"> | ||||
|           {{ row.brand_name }} | ||||
|         </p> | ||||
| 
 | ||||
|         <p class="has-text-weight-bold"> | ||||
|           {{ row.description }} {{ row.size }} | ||||
|         </p> | ||||
| 
 | ||||
|         <p class="has-text-weight-bold"> | ||||
|           <br /> | ||||
|           1 CS = {{ row.case_quantity || 1 }} {{ row.unit_uom }} | ||||
|         </p> | ||||
|       </div> | ||||
|       <div> | ||||
|         <img :src="row.image_url" /> | ||||
|       </div> | ||||
|     </div> | ||||
| 
 | ||||
|     <b-field grouped> | ||||
|       <b-field label="Cases" expanded> | ||||
|         <b-input v-model="row.cases" | ||||
|                  type="number" | ||||
|                  :disabled="!shouldAllowCases()"> | ||||
|         </b-input> | ||||
|       </b-field> | ||||
|       <b-field label="Units" expanded> | ||||
|         <b-input v-model="row.units" | ||||
|                  type="number"> | ||||
|         </b-input> | ||||
|       </b-field> | ||||
|     </b-field> | ||||
| 
 | ||||
|     <div class="buttons"> | ||||
|       <b-button type="is-primary" | ||||
|                 icon-left="save" | ||||
|                 @click="saveCounts()"> | ||||
|         Save Counts | ||||
|       </b-button> | ||||
|       <b-button tag="router-link" | ||||
|                 :to="`/inventory/rows/${row.uuid}`"> | ||||
|         Cancel | ||||
|       </b-button> | ||||
|     </div> | ||||
|   </div> | ||||
| </template> | ||||
| 
 | ||||
| <script> | ||||
| export default { | ||||
|     name: 'ByjoveInventory', | ||||
|     props: { | ||||
|         productKey: { | ||||
|             type: String, | ||||
|             default: 'upc_pretty', | ||||
|         }, | ||||
|         allowCases: { | ||||
|             type: Boolean, | ||||
|             default: true, | ||||
|         }, | ||||
|         allowEdit: { | ||||
|             type: Boolean, | ||||
|             default: false, | ||||
|         }, | ||||
|         allowDelete: { | ||||
|             type: Boolean, | ||||
|             default: false, | ||||
|         }, | ||||
|     }, | ||||
|     data() { | ||||
|         return { | ||||
|             row: {}, | ||||
|         } | ||||
|     }, | ||||
| 
 | ||||
|     created() { | ||||
|         this.fetch(this.$route.params.uuid) | ||||
|     }, | ||||
| 
 | ||||
|     methods: { | ||||
| 
 | ||||
|         getIndexUrl() { | ||||
|             return '/inventory/' | ||||
|         }, | ||||
| 
 | ||||
|         getBatchUrl() { | ||||
|             return `/inventory/${this.row.batch_uuid}` | ||||
|         }, | ||||
| 
 | ||||
|         getViewUrl() { | ||||
|             return `/inventory/rows/${this.row.uuid}` | ||||
|         }, | ||||
| 
 | ||||
|         getDeleteUrl() { | ||||
|             return `/inventory/rows/${this.row.uuid}/delete` | ||||
|         }, | ||||
| 
 | ||||
|         getApiUrl(uuid) { | ||||
|             if (!uuid) { | ||||
|                 uuid = this.row.uuid | ||||
|             } | ||||
|             return `/api/inventory-batch-row/${uuid}` | ||||
|         }, | ||||
| 
 | ||||
|         shouldAllowCases() { | ||||
|             if (!this.allowCases) { | ||||
|                 return false | ||||
|             } | ||||
|             return this.row.allow_cases | ||||
|         }, | ||||
| 
 | ||||
|         shouldAllowEdit() { | ||||
|             if (!this.allowEdit) { | ||||
|                 return false | ||||
|             } | ||||
|             return true | ||||
|         }, | ||||
| 
 | ||||
|         shouldAllowDelete() { | ||||
|             if (!this.allowDelete) { | ||||
|                 return false | ||||
|             } | ||||
|             return true | ||||
|         }, | ||||
| 
 | ||||
|         fetch(uuid) { | ||||
|             let url = this.getApiUrl(uuid) | ||||
|             this.$http.get(url).then(response => { | ||||
|                 this.row = response.data.data | ||||
|                 if (this.row.batch_executed || this.row.batch_complete) { | ||||
|                     // cannot edit this row, so view it instead | ||||
|                     this.$router.push(this.getViewUrl()) | ||||
|                 } | ||||
|             }, response => { | ||||
|                 if (response.status == 403) { // forbidden; redirect to model index | ||||
|                     this.$buefy.toast.open({ | ||||
|                         message: "You do not have permission to access that page.", | ||||
|                         type: 'is-danger', | ||||
|                     }) | ||||
|                     this.$router.push(this.getIndexUrl()) | ||||
|                 } else { | ||||
|                     this.$buefy.toast.open({ | ||||
|                         message: "Failed to fetch page data!", | ||||
|                         type: 'is-danger', | ||||
|                     }) | ||||
|                 } | ||||
|             }) | ||||
| 
 | ||||
|         }, | ||||
| 
 | ||||
|         saveCounts() { | ||||
|             let url = this.getApiUrl() | ||||
|             let params = { | ||||
|                 row: this.row.uuid, | ||||
|                 units: this.row.units, | ||||
|             } | ||||
|             if (this.shouldAllowCases()) { | ||||
|                 params.cases = this.row.cases | ||||
|             } | ||||
|             this.$http.post(url, params).then(response => { | ||||
|                 if (response.data.data) { | ||||
|                     // return to batch view | ||||
|                     this.$router.push(this.getBatchUrl()) | ||||
|                 } else { | ||||
|                     this.$buefy.toast.open({ | ||||
|                         message: response.data.error || "Failed to save counts!", | ||||
|                         type: 'is-danger', | ||||
|                     }) | ||||
|                 } | ||||
|             }, response => { | ||||
|                 this.$buefy.toast.open({ | ||||
|                     message: "Failed to save counts (server error)!", | ||||
|                     type: 'is-danger', | ||||
|                 }) | ||||
|             }) | ||||
|         }, | ||||
|     }, | ||||
| } | ||||
| </script> | ||||
							
								
								
									
										28
									
								
								src/components/inventory/index.js
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								src/components/inventory/index.js
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,28 @@ | |||
| // Import vue component
 | ||||
| import ByjoveInventory from './ByjoveInventory.vue' | ||||
| 
 | ||||
| // Declare install function executed by Vue.use()
 | ||||
| export function install(Vue) { | ||||
|     if (install.installed) return; | ||||
|     install.installed = true; | ||||
|     Vue.component('ByjoveInventory', ByjoveInventory); | ||||
| } | ||||
| 
 | ||||
| // Create module definition for Vue.use()
 | ||||
| const plugin = { | ||||
|     install, | ||||
| }; | ||||
| 
 | ||||
| // Auto-install when vue is found (eg. in browser via <script> tag)
 | ||||
| let GlobalVue = null; | ||||
| if (typeof window !== 'undefined') { | ||||
|     GlobalVue = window.Vue; | ||||
| } else if (typeof global !== 'undefined') { | ||||
|     GlobalVue = global.Vue; | ||||
| } | ||||
| if (GlobalVue) { | ||||
|     GlobalVue.use(plugin); | ||||
| } | ||||
| 
 | ||||
| // To allow use as module (npm/webpack/etc.) export component
 | ||||
| export default ByjoveInventory | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Lance Edgar
						Lance Edgar