Create.vue 7.1KB

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