Index.vue 4.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. <script setup>
  2. import { ref } from 'vue'
  3. import { Inertia } from '@inertiajs/inertia'
  4. import { Head, useForm } from '@inertiajs/inertia-vue3'
  5. import AppButton from '@/components/AppButton.vue'
  6. import AppPagination from '@/components/AppPagination.vue'
  7. import AppMenu from '@/components/AppMenu.vue'
  8. import AppDropdown from '@/components/AppDropdown.vue'
  9. import AppLayout from '@/layouts/AppLayout.vue'
  10. import { IndexTable } from './TableHeader'
  11. const props = defineProps({
  12. transactions: Object,
  13. transactionsStatus: Array,
  14. })
  15. const transactionId = ref()
  16. const updateStatusDialog = ref(false)
  17. const updateStatusForm = useForm({
  18. transaction_status_id: null,
  19. })
  20. const updateStatusSubmit = () => {
  21. updateStatusForm.put(route('transactions.update', transactionId.value), {
  22. onSuccess: () => {
  23. updateStatusDialog.value = false
  24. },
  25. })
  26. }
  27. const updateStatusItems = ref([])
  28. const overlayMenu = ref()
  29. const overlayItems = ref([])
  30. const overlayToggle = (event, data) => {
  31. overlayItems.value = [
  32. {
  33. label: 'Perbaharui status',
  34. icon: 'pi pi-refresh',
  35. command() {
  36. updateStatusDialog.value = true
  37. },
  38. },
  39. {
  40. label: 'Lihat detail',
  41. icon: 'pi pi-eye',
  42. to: route('transactions.show', data.id),
  43. },
  44. {
  45. label: 'Cetak ulang',
  46. icon: 'pi pi-print',
  47. command() {},
  48. },
  49. ]
  50. updateStatusItems.value = props.transactionsStatus.filter((val) => val.value >= data.transactionStatusId)
  51. updateStatusForm.transaction_status_id = data.transactionStatusId
  52. transactionId.value = data.id
  53. overlayMenu.value.toggle(event)
  54. }
  55. </script>
  56. <template>
  57. <Head title="Daftar Transaksi" />
  58. <AppLayout>
  59. <DataTable
  60. responsiveLayout="scroll"
  61. columnResizeMode="expand"
  62. :value="transactions.data"
  63. :rowHover="true"
  64. :stripedRows="true"
  65. >
  66. <template #header>
  67. <div class="grid">
  68. <div class="col-12 md:col-6">
  69. <div class="flex align-items-center">
  70. <h5 class="mr-3 mb-0">Transaksi</h5>
  71. <InputText class="w-full md:w-27rem" placeholder="cari..." />
  72. </div>
  73. </div>
  74. <div class="col-12 md:col-6 flex justify-content-end">
  75. <AppButton
  76. label="Tambah Transaksi"
  77. class="p-button-text"
  78. icon="pi pi-pencil"
  79. :href="route('transactions.create')"
  80. />
  81. </div>
  82. </div>
  83. </template>
  84. <Column
  85. v-for="indexTable in IndexTable"
  86. :field="indexTable.field"
  87. :header="indexTable.header"
  88. :key="indexTable.field"
  89. >
  90. <template #body="{ data, field }">
  91. <template v-if="field === 'transactionStatusName'">
  92. <Badge v-if="data['transactionStatusId'] === 1" :value="data[field]"></Badge>
  93. <Badge v-else-if="data['transactionStatusId'] === 2" :value="data[field]" severity="warning"></Badge>
  94. <Badge v-else :value="data[field]" severity="success"></Badge>
  95. </template>
  96. <template v-else-if="field === 'customer'">
  97. <p class="font-bold">{{ data.customer.number }}</p>
  98. <p>{{ data.customer.name }}</p>
  99. <p>{{ data.customer.phone }}</p>
  100. </template>
  101. <template v-else-if="field === 'transactionNumber'">
  102. <p class="font-bold">{{ data[field] }}</p>
  103. <p>{{ data.dateLaundry }}</p>
  104. </template>
  105. <template v-else>
  106. {{ data[field] }}
  107. </template>
  108. </template>
  109. </Column>
  110. <Column>
  111. <template #body="slotProps">
  112. <Button
  113. icon="pi pi-angle-double-down"
  114. class="p-button-rounded p-button-text"
  115. aria-controls="overlay_menu"
  116. @click="overlayToggle($event, slotProps.data)"
  117. />
  118. <AppMenu id="overlay_menu" ref="overlayMenu" :popup="true" :model="overlayItems" />
  119. </template>
  120. </Column>
  121. </DataTable>
  122. <AppPagination :links="transactions.links" />
  123. <Dialog
  124. modal
  125. v-model:visible="updateStatusDialog"
  126. class="p-fluid"
  127. header="Perbaharui Status"
  128. :style="{ width: '450px' }"
  129. :breakpoints="{ '960px': '75vw' }"
  130. @hide="updateStatusDialog"
  131. >
  132. <div class="grid">
  133. <div class="col-12">
  134. <AppDropdown
  135. label="Perbaharui Status"
  136. placeholder="pilih satu"
  137. v-model="updateStatusForm.transaction_status_id"
  138. :error="updateStatusForm.error"
  139. :options="updateStatusItems"
  140. />
  141. </div>
  142. </div>
  143. <template #footer>
  144. <div class="flex justify-content-end">
  145. <AppButton
  146. label="Simpan"
  147. icon="pi pi-check"
  148. class="p-button-text"
  149. :disabled="updateStatusForm.processing"
  150. @click="updateStatusSubmit"
  151. />
  152. </div>
  153. </template>
  154. </Dialog>
  155. </AppLayout>
  156. </template>