Index.vue 4.8KB

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