Create.vue 6.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. <script setup>
  2. import { useForm, Head } from '@inertiajs/inertia-vue3'
  3. import { useFormErrorReset } from '@/components/useFormErrorReset'
  4. import { useProductAutoComplete } from './useProductAutoComplete'
  5. import { useCustomerAutoComplete } from './useCustomerAutoComplete'
  6. import { optionStatus } from './config'
  7. import SaleDetails from './Components/SaleDetails.vue'
  8. import AppInputText from '@/components/AppInputText.vue'
  9. import AppInputNumber from '@/components/AppInputNumber.vue'
  10. import AppDropdown from '@/components/AppDropdown.vue'
  11. import AppAutocompleteBasic from '@/components/AppAutocompleteBasic.vue'
  12. import DashboardLayout from '@/layouts/DashboardLayout.vue'
  13. const props = defineProps({
  14. number: String,
  15. customers: {
  16. type: Array,
  17. default: [],
  18. },
  19. products: {
  20. type: Array,
  21. default: [],
  22. },
  23. })
  24. const form = useForm({
  25. number: props.number,
  26. status: 'pending',
  27. price: null,
  28. qty: null,
  29. customer: null,
  30. product: null,
  31. })
  32. const { customerOnComplete, customerOnSelected, showCreateCustomer } =
  33. useCustomerAutoComplete(form)
  34. const { productOnComplete, productOnSelected, showCreateProduct } =
  35. useProductAutoComplete(form)
  36. useFormErrorReset(form)
  37. const onSubmit = () => {
  38. form
  39. .transform((data) => ({
  40. number: data.number,
  41. status: data.status,
  42. price: data.price,
  43. qty: data.qty,
  44. customer_id: data.customer.id,
  45. product_id: data.product.number,
  46. }))
  47. .post(route('sales.store'), { onSuccess: () => form.reset() })
  48. }
  49. </script>
  50. <template>
  51. <Head title="Tambah Penjualan" />
  52. <DashboardLayout>
  53. <DynamicDialog />
  54. <div class="grid">
  55. <div class="col-12 lg:col-8">
  56. <Card>
  57. <template #title> Tambah Penjualan </template>
  58. <template #content>
  59. <div class="grid">
  60. <div class="col-12 md:col-6">
  61. <AppInputText
  62. disabled
  63. label="Nomor Penjualan"
  64. placeholder="nomor penjualan"
  65. :error="form.errors.number"
  66. v-model="form.number"
  67. />
  68. </div>
  69. <div class="col-12 md:col-6">
  70. <AppDropdown
  71. label="Status"
  72. placeholder="status"
  73. :options="optionStatus"
  74. :error="form.errors.status"
  75. v-model="form.status"
  76. />
  77. </div>
  78. <div class="col-12 md:col-6">
  79. <AppAutocompleteBasic
  80. label="Pelanggan"
  81. placeholder="pelanggan"
  82. field="name"
  83. v-model="form.customer"
  84. :error="form.errors.customer_id"
  85. :suggestions="customers"
  86. @complete="customerOnComplete"
  87. @item-select="customerOnSelected"
  88. >
  89. <template #item="slotProps">
  90. <template v-if="slotProps.item">
  91. <div class="flex flex-column">
  92. <span>{{ slotProps.item.name }}</span>
  93. <span>{{ slotProps.item.npwp }}</span>
  94. </div>
  95. </template>
  96. </template>
  97. <template #empty>
  98. <span
  99. class="cursor-pointer"
  100. style="color: var(--primary-color)"
  101. @click="showCreateCustomer"
  102. >
  103. Tambah Pelanggan
  104. </span>
  105. </template>
  106. </AppAutocompleteBasic>
  107. </div>
  108. <div class="col-12 md:col-6">
  109. <AppAutocompleteBasic
  110. label="Produk"
  111. placeholder="produk"
  112. field="name"
  113. v-model="form.product"
  114. :error="form.errors.product_id"
  115. :suggestions="products"
  116. @complete="productOnComplete"
  117. @item-select="productOnSelected"
  118. >
  119. <template #item="slotProps">
  120. <template v-if="slotProps.item">
  121. <div class="flex flex-column">
  122. <span>{{ slotProps.item.number }}</span>
  123. <span>{{ slotProps.item.name }}</span>
  124. </div>
  125. </template>
  126. </template>
  127. <template #empty>
  128. <span
  129. class="cursor-pointer"
  130. style="color: var(--primary-color)"
  131. @click="showCreateProduct"
  132. >
  133. Tambah Produk
  134. </span>
  135. </template>
  136. </AppAutocompleteBasic>
  137. </div>
  138. <div class="col-12 md:col-6">
  139. <AppInputNumber
  140. label="Harga"
  141. placeholder="harga"
  142. :error="form.errors.price"
  143. v-model="form.price"
  144. />
  145. </div>
  146. <div class="col-12 md:col-6">
  147. <AppInputText
  148. label="Kuantitas"
  149. placeholder="kuantitas"
  150. type="number"
  151. :error="form.errors.qty"
  152. v-model="form.qty"
  153. />
  154. </div>
  155. </div>
  156. </template>
  157. <template #footer>
  158. <div class="flex flex-column md:flex-row justify-content-end">
  159. <Button
  160. label="Simpan"
  161. icon="pi pi-check"
  162. class="p-button-outlined"
  163. :disabled="form.processing"
  164. @click="onSubmit"
  165. />
  166. </div>
  167. </template>
  168. </Card>
  169. </div>
  170. <div class="col-12 lg:col-4">
  171. <SaleDetails
  172. :sale-number="number"
  173. :sale-price="form.price"
  174. :sale-qty="form.qty"
  175. :sale-status="form.status"
  176. :customer="form.customer"
  177. :product="form.product"
  178. />
  179. </div>
  180. </div>
  181. </DashboardLayout>
  182. </template>