Create.vue 5.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. <script setup>
  2. import { Inertia } from '@inertiajs/inertia'
  3. import { Head, useForm } from '@inertiajs/inertia-vue3'
  4. import { useFormErrorReset } from '@/components/useFormErrorReset'
  5. import { useConfirm } from 'primevue/useconfirm'
  6. import AppAutocompleteBasic from '@/components/AppAutocompleteBasic.vue'
  7. import DashboardLayout from '@/layouts/DashboardLayout.vue'
  8. defineProps({
  9. members: {
  10. type: Array,
  11. default: [],
  12. },
  13. })
  14. const memberOnComplete = (event) => {
  15. Inertia.reload({
  16. data: { search: event.query },
  17. only: ['members'],
  18. })
  19. }
  20. const memberOnSelected = (event) => {
  21. form.member = event.value
  22. }
  23. const gotoMember = () => {
  24. return Inertia.get(route('members.create'))
  25. }
  26. const checkMember = () => {
  27. return form.member === null || typeof form.member !== 'object'
  28. }
  29. const form = useForm({
  30. member: null,
  31. })
  32. useFormErrorReset(form)
  33. const confirm = useConfirm()
  34. const formSent = () => {
  35. form
  36. .transform((data) => ({
  37. member_id: data.member.id,
  38. }))
  39. .post(route('top-ups.store'), { onSuccess: () => form.reset() })
  40. }
  41. const onSubmit = () => {
  42. confirm.require({
  43. message: `Dikenakan tagihan sebesar ${form.member.price}`,
  44. header: 'Top Up',
  45. acceptLabel: 'Bayar dan simpan',
  46. rejectLabel: 'Batalkan',
  47. accept: () => {
  48. formSent()
  49. },
  50. reject: () => {
  51. confirm.close()
  52. },
  53. })
  54. }
  55. </script>
  56. <template>
  57. <Head title="Top Up" />
  58. <DashboardLayout>
  59. <ConfirmDialog></ConfirmDialog>
  60. <div class="grid">
  61. <div class="col-12 md:col-8">
  62. <Card>
  63. <template #title>Detail Member</template>
  64. <template v-if="form.member" #content>
  65. <div v-if="form.member.id" class="grid">
  66. <div class="col-12">
  67. <h2>
  68. <span class="text-base"> <i class="pi pi-user" /> Nama</span>
  69. <br />
  70. <span class="text-lg">{{ form.member.name }}</span>
  71. </h2>
  72. </div>
  73. <div class="col-12">
  74. <h2>
  75. <span class="text-base"> <i class="pi pi-phone" /> Nomor HP</span>
  76. <br />
  77. <span class="text-lg">{{ form.member.phone }}</span>
  78. </h2>
  79. </div>
  80. <div class="col-12">
  81. <h2>
  82. <span class="text-base"> <i class="pi pi-id-card" /> Jenis Member</span>
  83. <br />
  84. <span class="text-lg">{{ form.member.type }}</span>
  85. </h2>
  86. </div>
  87. <div class="col-12">
  88. <h2>
  89. <span class="text-base"> <i class="pi pi-wallet" /> Tarif Member</span>
  90. <br />
  91. <span class="text-lg">{{ form.member.price }}</span>
  92. </h2>
  93. </div>
  94. <div class="col-12">
  95. <h2>
  96. <span class="text-base"> <i class="pi pi-calendar-times" /> Berakhir</span>
  97. <br />
  98. <span class="text-lg">{{ form.member.expDate }}</span>
  99. </h2>
  100. </div>
  101. </div>
  102. </template>
  103. </Card>
  104. </div>
  105. </div>
  106. <div class="grid">
  107. <div class="col-12 md:col-8">
  108. <Card>
  109. <template #title> Top Up </template>
  110. <template #content>
  111. <div class="grid">
  112. <div class="col-12 md:col-6">
  113. <AppAutocompleteBasic
  114. label="Member"
  115. field="name"
  116. placeholder="cari, contoh: 08xx, tina"
  117. v-model="form.member"
  118. :error="form.errors.member"
  119. :suggestions="members"
  120. @complete="memberOnComplete"
  121. @item-select="memberOnSelected"
  122. >
  123. <template #item="slotProps">
  124. <template v-if="slotProps.item">
  125. <div class="flex flex-column">
  126. <span>{{ slotProps.item.name }}</span>
  127. <span class="font-bold">{{ slotProps.item.phone }}</span>
  128. <span class="font-bold">{{ slotProps.item.type }}</span>
  129. </div>
  130. </template>
  131. </template>
  132. <template #empty>
  133. <span class="cursor-pointer" style="color: var(--primary-color)" @click="gotoMember">
  134. Buat Member
  135. </span>
  136. </template>
  137. </AppAutocompleteBasic>
  138. </div>
  139. </div>
  140. </template>
  141. <template #footer>
  142. <div class="flex flex-column md:flex-row justify-content-end">
  143. <Button
  144. label="Topup"
  145. icon="pi pi-check"
  146. class="p-button-outlined"
  147. :disabled="form.processing || checkMember()"
  148. @click="onSubmit"
  149. />
  150. </div>
  151. </template>
  152. </Card>
  153. </div>
  154. </div>
  155. </DashboardLayout>
  156. </template>