Index.vue 3.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. <script setup>
  2. import { Inertia } from '@inertiajs/inertia'
  3. import { watch, onMounted } from 'vue'
  4. import { Head, useForm } from '@inertiajs/inertia-vue3'
  5. import dayjs from 'dayjs'
  6. import pickBy from 'lodash/pickBy'
  7. import AppLayout from '@/layouts/AppLayout.vue'
  8. import AppPagination from '@/components/AppPagination.vue'
  9. import AppButton from '@/components/AppButton.vue'
  10. import TableHeader from './TableHeader'
  11. const props = defineProps({
  12. expenses: Object,
  13. filters: Object,
  14. outlets: Array,
  15. })
  16. const filterForm = useForm({
  17. dates: null,
  18. startDate: props.filters.startDate,
  19. endDate: props.filters.endDate,
  20. outlet: props.filters.outlet,
  21. })
  22. onMounted(() => {
  23. if (props.filters.startDate || props.filters.endDate) {
  24. if (props.filters.endDate) {
  25. filterForm.dates = [new Date(props.filters.startDate), new Date(props.filters.endDate)]
  26. } else {
  27. filterForm.dates = [new Date(props.filters.startDate), null]
  28. }
  29. }
  30. })
  31. watch(filterForm, () => {
  32. if (filterForm.dates) {
  33. if (filterForm.dates[1]) {
  34. filterForm.startDate = dayjs(filterForm.dates[0]).format('YYYY-MM-DD')
  35. filterForm.endDate = dayjs(filterForm.dates[1]).format('YYYY-MM-DD')
  36. } else {
  37. filterForm.startDate = dayjs(filterForm.dates[0]).format('YYYY-MM-DD')
  38. filterForm.endDate = null
  39. }
  40. } else {
  41. filterForm.endDate = null
  42. filterForm.startDate = null
  43. }
  44. Inertia.get(
  45. '/expenses',
  46. pickBy({
  47. startDate: filterForm.startDate,
  48. endDate: filterForm.endDate,
  49. outlet: filterForm.outlet,
  50. }),
  51. {
  52. preserveState: true,
  53. }
  54. )
  55. })
  56. const filterReset = () => {
  57. Inertia.get('/expenses')
  58. }
  59. </script>
  60. <template>
  61. <Head title="Pengeluaran" />
  62. <AppLayout>
  63. <DataTable
  64. responsive-layout="scroll"
  65. column-resize-mode="expand"
  66. :value="expenses.data"
  67. :row-hover="true"
  68. :striped-rows="true"
  69. >
  70. <template #header>
  71. <h1>Pengeluaran</h1>
  72. <div class="grid">
  73. <div class="col-12 md:col-8">
  74. <div class="grid">
  75. <div class="col-12 md:col-4">
  76. <Calendar
  77. class="w-full"
  78. v-model="filterForm.dates"
  79. selection-mode="range"
  80. placeholder="filter waktu..."
  81. date-format="dd/mm/yy"
  82. :manual-input="false"
  83. />
  84. </div>
  85. <div v-if="$page.props.auth.user.role_id === 1" class="col-12 md:col-4">
  86. <Dropdown
  87. class="w-full"
  88. placeholder="pilih outlet..."
  89. v-model="filterForm.outlet"
  90. option-label="label"
  91. option-value="value"
  92. :options="outlets"
  93. />
  94. </div>
  95. <div class="col-auto mt-2 ml-2">
  96. <Button label="reset" class="p-button-link" @click="filterReset" />
  97. </div>
  98. </div>
  99. </div>
  100. <div class="col-12 md:col-4 flex flex-column md:flex-row justify-content-end">
  101. <AppButton
  102. label="Tambah Pengeluaran"
  103. class="p-button-outlined"
  104. icon="pi pi-pencil"
  105. :href="route('expenses.create')"
  106. />
  107. </div>
  108. </div>
  109. </template>
  110. <Column
  111. v-for="tableHeader in TableHeader"
  112. :field="tableHeader.field"
  113. :header="tableHeader.header"
  114. :key="tableHeader.field"
  115. />
  116. <Column>
  117. <template #body="{ data }">
  118. <AppButton
  119. icon="pi pi-angle-double-right"
  120. class="p-button-text p-button-icon-only p-button-rounded p-button-text"
  121. :href="route('expenses.show', data.id)"
  122. />
  123. </template>
  124. </Column>
  125. </DataTable>
  126. <AppPagination :links="expenses.links" />
  127. </AppLayout>
  128. </template>