123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. <script setup>
  2. import { computed, watch } from 'vue'
  3. import { Inertia } from '@inertiajs/inertia'
  4. import { Head, useForm, usePage } from '@inertiajs/inertia-vue3'
  5. import { useConfirm } from 'primevue/useconfirm'
  6. import AppAutocompleteBasic from '@/components/AppAutocompleteBasic.vue'
  7. import AppLayout from '@/layouts/AppLayout.vue'
  8. defineProps({
  9. members: {
  10. type: Array,
  11. default: [],
  12. },
  13. })
  14. const errors = computed(() => usePage().props.value.errors)
  15. watch(errors, () => {
  16. form.clearErrors()
  17. })
  18. const memberOnComplete = (event) => {
  19. Inertia.reload({
  20. data: { search: event.query },
  21. only: ['members'],
  22. })
  23. }
  24. const memberOnSelected = (event) => {
  25. form.member = event.value
  26. }
  27. const gotoMember = () => {
  28. return Inertia.get(route('members.create'))
  29. }
  30. const form = useForm({
  31. member: null,
  32. })
  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 submit = () => {
  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. console.info('transaksi dibatalkan')
  52. },
  53. })
  54. }
  55. </script>
  56. <template>
  57. <Head title="Top Up" />
  58. <AppLayout>
  59. <ConfirmDialog></ConfirmDialog>
  60. <div class="grid">
  61. <div class="col-12 md:col-8">
  62. <Card class="surface-200">
  63. <template #title>Detail Member</template>
  64. <template v-if="form.member" #content>
  65. <p v-if="form.member.name">
  66. <span class="text-base font-bold"> Nama </span>
  67. <br />
  68. {{ form.member.name }}
  69. </p>
  70. <p v-if="form.member.phone">
  71. <span class="text-base font-bold"> Nomor HP </span>
  72. <br />
  73. {{ form.member.phone }}
  74. </p>
  75. <p v-if="form.member.type">
  76. <span class="text-base font-bold"> Jenis Member </span>
  77. <br />
  78. {{ form.member.type }}
  79. </p>
  80. <p v-if="form.member.price">
  81. <span class="text-base font-bold"> Tarif Member </span>
  82. <br />
  83. {{ form.member.price }}
  84. </p>
  85. <p v-if="form.member.expDate">
  86. <span class="text-base font-bold"> Berakhir </span>
  87. <br />
  88. {{ form.member.expDate }}
  89. </p>
  90. </template>
  91. </Card>
  92. </div>
  93. </div>
  94. <div class="grid">
  95. <div class="col-12 md:col-8">
  96. <Card>
  97. <template #title> Top Up </template>
  98. <template #content>
  99. <div class="grid">
  100. <div class="col-12 md:col-6">
  101. <AppAutocompleteBasic
  102. empty
  103. label="Member"
  104. field="name"
  105. placeholder="cari, contoh: 08xx, tina"
  106. v-model="form.member"
  107. :error="form.errors.member"
  108. :suggestions="members"
  109. @complete="memberOnComplete"
  110. @item-select="memberOnSelected"
  111. >
  112. <template #item="slotProps">
  113. <template v-if="slotProps.item">
  114. <div class="flex flex-column">
  115. <span>{{ slotProps.item.name }}</span>
  116. <span class="font-bold">{{ slotProps.item.phone }}</span>
  117. <span class="font-bold">{{ slotProps.item.type }}</span>
  118. </div>
  119. </template>
  120. </template>
  121. <template #empty>
  122. <span class="cursor-pointer" style="color: var(--primary-color)" @click="gotoMember">
  123. Buat Member
  124. </span>
  125. </template>
  126. </AppAutocompleteBasic>
  127. </div>
  128. </div>
  129. </template>
  130. <template #footer>
  131. <div class="flex flex-column md:flex-row justify-content-end">
  132. <Button
  133. label="Topup"
  134. icon="pi pi-check"
  135. class="p-button-outlined"
  136. :disabled="form.processing"
  137. @click="submit"
  138. />
  139. </div>
  140. </template>
  141. </Card>
  142. </div>
  143. </div>
  144. </AppLayout>
  145. </template>