File size: 4,020 Bytes
b86d7f0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
<!-- src/components/OrderForm.vue -->
<template>
    <div class="fixed inset-0 bg-black bg-opacity-30 flex items-center justify-center">
      <div class="bg-white rounded-lg w-full max-w-2xl p-6 space-y-4">
        <h2 class="text-2xl font-bold">{{ order?.id ? 'Edit Order' : 'New Order' }}</h2>
  
        <div class="grid grid-cols-2 gap-4">
          <div>
            <label class="block mb-1">Customer</label>
            <select v-model="form.customer" class="w-full p-2 border rounded">
              <option v-for="c in dropdowns.customers" :key="c" :value="c">{{ c }}</option>
            </select>
          </div>
  
          <div>
            <label class="block mb-1">Employee</label>
            <select v-model="form.employee" class="w-full p-2 border rounded">
              <option v-for="e in dropdowns.employees" :key="e" :value="e">{{ e }}</option>
            </select>
          </div>
  
          <div>
            <label class="block mb-1">Shipper</label>
            <select v-model="form.shipper" class="w-full p-2 border rounded">
              <option v-for="s in dropdowns.shippers" :key="s" :value="s">{{ s }}</option>
            </select>
          </div>
  
          <div>
            <label class="block mb-1">Ship City</label>
            <input v-model="form.shipCity" type="text" class="w-full p-2 border rounded" />
          </div>
  
          <div>
            <label class="block mb-1">Order Date</label>
            <input v-model="form.orderDate" type="date" class="w-full p-2 border rounded" />
          </div>
  
          <div>
            <label class="block mb-1">Shipped Date</label>
            <input v-model="form.shippedDate" type="date" class="w-full p-2 border rounded" />
          </div>
        </div>
  
        <div>
          <h3 class="text-lg font-semibold mt-4">Order Items</h3>
          <div v-for="(item, index) in form.items" :key="index" class="flex gap-2 items-center mt-2">
            <select v-model="item.product" class="flex-1 p-2 border rounded">
              <option v-for="p in dropdowns.products" :key="p" :value="p">{{ p }}</option>
            </select>
            <input v-model.number="item.quantity" type="number" placeholder="Qty" class="w-20 p-2 border rounded" />
            <input v-model.number="item.price" type="number" placeholder="Price" class="w-24 p-2 border rounded" />
            <button @click="removeItem(index)" class="text-red-600">🗑️</button>
          </div>
  
          <button @click="addItem" class="mt-2 bg-green-500 text-white px-4 py-1 rounded hover:bg-green-600">
            ➕ Add Item
          </button>
        </div>
  
        <div class="flex justify-end gap-4 mt-6">
          <button @click="$emit('close')" class="bg-gray-400 text-white px-4 py-2 rounded hover:bg-gray-500">
            Cancel
          </button>
          <button @click="saveOrder" class="bg-blue-600 text-white px-4 py-2 rounded hover:bg-blue-700">
            Save
          </button>
        </div>
      </div>
    </div>
  </template>
  
  <script setup>
  import { ref, onMounted } from 'vue'
  import orderService from '@/services/orderService'
  
  const props = defineProps(['order'])
  const emit = defineEmits(['close', 'saved'])
  
  const form = ref({
    customer: '',
    employee: '',
    shipper: '',
    shipCity: '',
    orderDate: '',
    shippedDate: '',
    freight: 0,
    items: []
  })
  
  const dropdowns = ref({
    customers: [],
    employees: [],
    shippers: [],
    products: []
  })
  
  onMounted(async () => {
    dropdowns.value = await orderService.getDropdownData()
    if (props.order) {
      form.value = JSON.parse(JSON.stringify(props.order))
    }
  })
  
  const addItem = () => {
    form.value.items.push({ product: '', quantity: 1, price: 0 })
  }
  
  const removeItem = (index) => {
    form.value.items.splice(index, 1)
  }
  
  const saveOrder = async () => {
    await orderService.saveOrder(form.value)
    emit('saved')
    emit('close')
  }
  </script>