Create.vue 3.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  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 AppAutocompleteBasic from '@/components/AppAutocompleteBasic.vue'
  6. import AppLayout from '@/layouts/AppLayout.vue'
  7. defineProps({
  8. members: {
  9. type: Array,
  10. default: [],
  11. },
  12. })
  13. const errors = computed(() => usePage().props.value.errors)
  14. watch(errors, () => {
  15. form.clearErrors()
  16. })
  17. const memberOnComplete = (event) => {
  18. Inertia.reload({
  19. data: { search: event.query },
  20. only: ['members'],
  21. })
  22. }
  23. const memberOnSelected = (event) => {
  24. form.member = event.value
  25. }
  26. const gotoMember = () => {
  27. return Inertia.get(route('members.create'))
  28. }
  29. const form = useForm({
  30. member: null,
  31. })
  32. const submit = () => {
  33. form.post(route('top-ups.store'), { onSuccess: () => form.reset() })
  34. }
  35. </script>
  36. <template>
  37. <Head title="Top Up" />
  38. <AppLayout>
  39. <template v-if="form.member">
  40. <h1 class="text-2xl font-bold">Detail Member</h1>
  41. <div class="grid px-2">
  42. <div class="col-auto mr-7">
  43. <h2>
  44. <span class="text-base"> <i class="pi pi-user" /> Nama</span>
  45. <br />
  46. <span class="text-lg">{{ form.member.name }}</span>
  47. </h2>
  48. </div>
  49. <div class="col-auto mr-7">
  50. <h2>
  51. <span class="text-base"> <i class="pi pi-mobile" /> No HP</span>
  52. <br />
  53. <span class="text-lg">{{ form.member.phone }}</span>
  54. </h2>
  55. </div>
  56. </div>
  57. <div class="grid">
  58. <div class="col-12">
  59. <h2 class="mb-4">
  60. <span class="text-base">
  61. <i class="pi pi-car red-700" />
  62. Detail Plat Kendaraan
  63. </span>
  64. <br />
  65. <span class="text-lg">{{ form.member.platNumber }}</span>
  66. </h2>
  67. </div>
  68. </div>
  69. </template>
  70. <div class="grid">
  71. <div class="col-12 md:col-8">
  72. <Card>
  73. <template #title> Top Up </template>
  74. <template #content>
  75. <div class="grid">
  76. <div class="col-12 md:col-6">
  77. <AppAutocompleteBasic
  78. empty
  79. label="Member"
  80. field="name"
  81. placeholder="member"
  82. v-model="form.member"
  83. :error="form.errors.member"
  84. :suggestions="members"
  85. @complete="memberOnComplete"
  86. @item-select="memberOnSelected"
  87. >
  88. <template #item="slotProps">
  89. <template v-if="slotProps.item">
  90. <div class="flex flex-column">
  91. <span>{{ slotProps.item.name }}</span>
  92. <span class="font-bold">{{ slotProps.item.phone }}</span>
  93. <span class="font-bold">{{ slotProps.item.type }}</span>
  94. </div>
  95. </template>
  96. </template>
  97. <template #empty>
  98. <span class="cursor-pointer" style="color: var(--primary-color)" @click="gotoMember">
  99. Buat Member
  100. </span>
  101. </template>
  102. </AppAutocompleteBasic>
  103. </div>
  104. </div>
  105. </template>
  106. <template #footer>
  107. <div class="flex flex-column md:flex-row justify-content-end">
  108. <Button
  109. label="Simpan"
  110. icon="pi pi-check"
  111. class="p-button-outlined"
  112. :disabled="form.processing"
  113. @click="submit"
  114. />
  115. </div>
  116. </template>
  117. </Card>
  118. </div>
  119. </div>
  120. </AppLayout>
  121. </template>