Create.vue 7.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. <script setup>
  2. import { ref, watch } from 'vue'
  3. import { useForm } from '@inertiajs/inertia-vue3'
  4. import { useFormErrorReset } from '@/components/useFormErrorReset'
  5. import AppInputNumber from '@/components/AppInputNumber.vue'
  6. import DashboardLayout from '@/layouts/DashboardLayout.vue'
  7. const props = defineProps({
  8. parkingFees: Object,
  9. })
  10. const disabled = ref(true)
  11. const editButtonLabel = ref('Ubah tarif')
  12. watch(disabled, () => {
  13. if (disabled.value) {
  14. editButtonLabel.value = 'Batal ubah tarif'
  15. } else {
  16. editButtonLabel.value = 'Ubah tarif'
  17. }
  18. })
  19. const onEdit = () => {
  20. disabled.value = !disabled.value
  21. }
  22. const form = useForm({
  23. id1: props.parkingFees[0]?.id ?? null,
  24. id2: props.parkingFees[1]?.id ?? null,
  25. id3: props.parkingFees[2]?.id ?? null,
  26. id4: props.parkingFees[3]?.id ?? null,
  27. idNext: props.parkingFees[4]?.id ?? null,
  28. timePeriod1: props.parkingFees[0]?.timePeriod ?? null,
  29. timePeriod2: props.parkingFees[1]?.timePeriod ?? null,
  30. timePeriod3: props.parkingFees[2]?.timePeriod ?? null,
  31. timePeriod4: props.parkingFees[3]?.timePeriod ?? null,
  32. timePeriodNext: props.parkingFees[4]?.timePeriod ?? null,
  33. price1: props.parkingFees[0]?.price ?? null,
  34. price2: props.parkingFees[1]?.price ?? null,
  35. price3: props.parkingFees[2]?.price ?? null,
  36. price4: props.parkingFees[3]?.price ?? null,
  37. priceNext: props.parkingFees[4]?.price ?? null,
  38. })
  39. useFormErrorReset(form)
  40. const dialogVisible = ref()
  41. const dialogMessage = ref()
  42. const submitValidation = () => {
  43. const periodTimeCount = [
  44. form.timePeriod1,
  45. form.timePeriod2,
  46. form.timePeriod3,
  47. form.timePeriod4,
  48. form.timePeriodNext,
  49. ].reduce((prev, current) => prev + current)
  50. if (periodTimeCount > 24) {
  51. throw new Error('Waktu tidak boleh melebihi 24 jam')
  52. } else if (periodTimeCount < 24) {
  53. throw new Error('Waktu tidak boleh kurang dari 24 jam')
  54. }
  55. }
  56. const onSubmit = () => {
  57. try {
  58. submitValidation()
  59. form
  60. .transform((data) => ({
  61. id: [data.id1, data.id2, data.id3, data.id4, data.idNext],
  62. time_period: [data.timePeriod1, data.timePeriod2, data.timePeriod3, data.timePeriod4, data.timePeriodNext],
  63. price: [data.price1, data.price2, data.price3, data.price4, data.priceNext],
  64. }))
  65. .post(route('parking-fees.store'), { onSuccess: () => (disabled.value = true) })
  66. } catch (e) {
  67. dialogVisible.value = true
  68. dialogMessage.value = e.message
  69. }
  70. }
  71. </script>
  72. <template>
  73. <DashboardLayout>
  74. <Dialog modal header="Ada Kesalahan" :visible="dialogVisible" :closable="false">
  75. <span style="color: var(--red-500)">{{ dialogMessage }}</span>
  76. <template #footer>
  77. <Button label="tutup" @click="dialogVisible = false" />
  78. </template>
  79. </Dialog>
  80. <div class="grid">
  81. <div class="col-12 md:col-6">
  82. <Card>
  83. <template #title>
  84. <h1>Tarif Parkir <span class="text-base">24 jam pertama</span></h1>
  85. <div class="flex flex-column md:flex-row justify-content-end">
  86. <Button
  87. icon="pi pi-pencil"
  88. class="p-button-outlined p-button-primary"
  89. :label="editButtonLabel"
  90. @click="onEdit"
  91. />
  92. </div>
  93. </template>
  94. <template #content>
  95. <div class="grid">
  96. <Divider align="center">
  97. <span class="p-tag">Periode 1</span>
  98. </Divider>
  99. <AppInputNumber
  100. v-model="form.timePeriod1"
  101. class="col-12 md:col-6"
  102. label="Durasi/Jam"
  103. placeholder="durasi waktu, contoh: 1"
  104. :disabled="disabled"
  105. :error="form.errors['time_period.0']"
  106. />
  107. <AppInputNumber
  108. v-model="form.price1"
  109. class="col-12 md:col-6"
  110. label="Harga"
  111. placeholder="contoh: 100000"
  112. :disabled="disabled"
  113. :error="form.errors['price.0']"
  114. />
  115. </div>
  116. <Divider align="center">
  117. <span class="p-tag">Periode 2</span>
  118. </Divider>
  119. <div class="grid">
  120. <AppInputNumber
  121. v-model="form.timePeriod2"
  122. class="col-12 md:col-6"
  123. label="Durasi/Jam"
  124. placeholder="durasi waktu, contoh: 2"
  125. :disabled="disabled"
  126. :error="form.errors['time_period.1']"
  127. />
  128. <AppInputNumber
  129. v-model="form.price2"
  130. class="col-12 md:col-6"
  131. label="Harga"
  132. placeholder="contoh: 100000"
  133. :disabled="disabled"
  134. :error="form.errors['price.1']"
  135. />
  136. </div>
  137. <Divider align="center">
  138. <span class="p-tag">Periode 3</span>
  139. </Divider>
  140. <div class="grid">
  141. <AppInputNumber
  142. v-model="form.timePeriod3"
  143. class="col-12 md:col-6"
  144. label="Durasi/Jam"
  145. placeholder="durasi waktu, contoh: 3"
  146. :disabled="disabled"
  147. :error="form.errors['time_period.2']"
  148. />
  149. <AppInputNumber
  150. v-model="form.price3"
  151. class="col-12 md:col-6"
  152. label="Harga"
  153. placeholder="contoh: 100000"
  154. :disabled="disabled"
  155. :error="form.errors['price.2']"
  156. />
  157. </div>
  158. <Divider align="center">
  159. <span class="p-tag">Periode 4</span>
  160. </Divider>
  161. <div class="grid">
  162. <AppInputNumber
  163. v-model="form.timePeriod4"
  164. class="col-12 md:col-6"
  165. label="Durasi/Jam"
  166. placeholder="durasi waktu, contoh: 4"
  167. :disabled="disabled"
  168. :error="form.errors['time_period.3']"
  169. />
  170. <AppInputNumber
  171. v-model="form.price4"
  172. class="col-12 md:col-6"
  173. label="Harga"
  174. placeholder="contoh: 100000"
  175. :disabled="disabled"
  176. :error="form.errors['price.3']"
  177. />
  178. </div>
  179. <Divider align="center">
  180. <span class="p-tag">Seterusnya</span>
  181. </Divider>
  182. <div class="grid">
  183. <AppInputNumber
  184. v-model="form.timePeriodNext"
  185. class="col-12 md:col-6"
  186. label="Durasi/Jam"
  187. placeholder="durasi waktu, contoh: 4"
  188. :disabled="disabled"
  189. :error="form.errors['time_period.4']"
  190. />
  191. <AppInputNumber
  192. v-model="form.priceNext"
  193. class="col-12 md:col-6"
  194. label="Harga"
  195. placeholder="contoh: 100000"
  196. :disabled="disabled"
  197. :error="form.errors['price.4']"
  198. />
  199. </div>
  200. </template>
  201. <template #footer>
  202. <div class="flex flex-column md:flex-row justify-content-end">
  203. <Button
  204. label="Simpan"
  205. icon="pi pi-check"
  206. class="p-button-outlined"
  207. :disabled="form.processing || disabled"
  208. @click="onSubmit"
  209. />
  210. </div>
  211. </template>
  212. </Card>
  213. </div>
  214. </div>
  215. </DashboardLayout>
  216. </template>