Create.vue 4.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. <script setup>
  2. import { watch } from 'vue'
  3. import { Inertia } from '@inertiajs/inertia'
  4. import { useForm, Head } from '@inertiajs/inertia-vue3'
  5. import { useConfirm } from 'primevue/useconfirm'
  6. import FormValidationError from '@/utils/formValidationError'
  7. import { useFormErrorReset } from '@/components/useFormErrorReset'
  8. import AppInputText from '@/components/AppInputText.vue'
  9. import AppDropdown from '@/components/AppDropdown.vue'
  10. import DashboardLayout from '@/layouts/DashboardLayout.vue'
  11. import IndexTable from './TableHeader'
  12. const props = defineProps({
  13. outTransactions: Object,
  14. typeVehicles: Object,
  15. detailOutTransaction: Object,
  16. })
  17. const form = useForm({
  18. plat_number: null,
  19. entry_transaction_id: null,
  20. type_vehicle_id: null,
  21. })
  22. useFormErrorReset(form)
  23. watch(
  24. () => form.plat_number,
  25. () => {
  26. Inertia.reload({
  27. only: ['typeVehicles'],
  28. data: { plat_number: form.plat_number },
  29. })
  30. }
  31. )
  32. const confirm = useConfirm()
  33. const submitValidation = () => {
  34. form.clearErrors()
  35. const fieldError = []
  36. if (!form.plat_number) {
  37. fieldError.push('plat_number')
  38. }
  39. if (!form.entry_transaction_id) {
  40. fieldError.push('entry_transaction_id')
  41. }
  42. if (!form.type_vehicle_id) {
  43. fieldError.push('type_vehicle_id')
  44. }
  45. if (fieldError.length > 0) {
  46. throw new FormValidationError('Nilai tidak boleh kosong', fieldError)
  47. }
  48. }
  49. const submit = () => {
  50. try {
  51. submitValidation()
  52. Inertia.reload({
  53. only: ['detailOutTransaction'],
  54. data: { transaction_number: form.entry_transaction_id },
  55. })
  56. confirm.require({
  57. message: `
  58. Lama parkir ${props.detailOutTransaction.totalTimeParking},
  59. biaya yang dikenakan ${props.detailOutTransaction.totalPriceParking}
  60. `,
  61. header: 'Tagihan',
  62. acceptLabel: 'Bayar dan simpan',
  63. rejectLabel: 'Batalkan',
  64. accept: () => {
  65. form.post(route('transactions.store'), {
  66. onSuccess: () => form.reset(),
  67. })
  68. },
  69. reject: () => {
  70. confirm.close()
  71. },
  72. })
  73. } catch ($e) {
  74. if ($e.field) {
  75. $e.field.forEach((field) => form.setError(field, $e.message))
  76. }
  77. }
  78. }
  79. </script>
  80. <template>
  81. <Head title="Transaksi Keluar" />
  82. <DashboardLayout>
  83. <ConfirmDialog></ConfirmDialog>
  84. <div class="grid">
  85. <div class="col-12">
  86. <Card>
  87. <template #title> Tambah Transaksi Keluar </template>
  88. <template #content>
  89. <div class="grid">
  90. <div class="col-12 md:col-6">
  91. <AppInputText
  92. v-model="form.plat_number"
  93. label="Plat Kendaraan"
  94. placeholder="plat kendaraan"
  95. :error="form.errors.plat_number"
  96. />
  97. </div>
  98. <div class="col-12 md:col-6">
  99. <AppInputText
  100. v-model="form.entry_transaction_id"
  101. label="Nomor Transaksi"
  102. placeholder="nomor transaksi"
  103. :error="form.errors.entry_transaction_id"
  104. />
  105. </div>
  106. <div class="col-12 md:col-6">
  107. <AppDropdown
  108. v-model="form.type_vehicle_id"
  109. label="Jenis Kendaraan"
  110. placeholder="jenis kendaraan"
  111. :options="typeVehicles"
  112. :error="form.errors.type_vehicle_id"
  113. />
  114. </div>
  115. </div>
  116. </template>
  117. <template #footer>
  118. <div class="flex flex-column md:flex-row justify-content-end">
  119. <Button
  120. label="Simpan"
  121. icon="pi pi-check"
  122. class="p-button-outlined"
  123. :disabled="form.processing"
  124. @click="submit"
  125. />
  126. </div>
  127. </template>
  128. </Card>
  129. </div>
  130. <div class="col-12">
  131. <Card>
  132. <template #title> Kendaraan Keluar </template>
  133. <template #content>
  134. <DataTable
  135. responsiveLayout="scroll"
  136. columnResizeMode="expand"
  137. :value="outTransactions"
  138. :rowHover="true"
  139. :stripedRows="true"
  140. >
  141. <template #header>
  142. <span style="color: var(--red-600)"> Maksimal ditampilkan : </span>
  143. 10
  144. <br />
  145. <span style="color: var(--red-600)">Ditampilkan :</span>
  146. {{ Object.keys(outTransactions).length }}
  147. </template>
  148. <Column v-for="value in IndexTable" :field="value.field" :header="value.header" :key="value.field" />
  149. </DataTable>
  150. </template>
  151. </Card>
  152. </div>
  153. </div>
  154. </DashboardLayout>
  155. </template>