Create.vue 7.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  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: [
  63. data.timePeriod1,
  64. data.timePeriod2,
  65. data.timePeriod3,
  66. data.timePeriod4,
  67. data.timePeriodNext,
  68. ],
  69. price: [
  70. data.price1,
  71. data.price2,
  72. data.price3,
  73. data.price4,
  74. data.priceNext,
  75. ],
  76. }))
  77. .post(route('parking-fees.store'), {
  78. onSuccess: () => (disabled.value = true),
  79. })
  80. } catch (e) {
  81. dialogVisible.value = true
  82. dialogMessage.value = e.message
  83. }
  84. }
  85. </script>
  86. <template>
  87. <DashboardLayout>
  88. <Dialog
  89. modal
  90. header="Ada Kesalahan"
  91. :visible="dialogVisible"
  92. :closable="false"
  93. >
  94. <span style="color: var(--red-500)">{{ dialogMessage }}</span>
  95. <template #footer>
  96. <Button label="tutup" @click="dialogVisible = false" />
  97. </template>
  98. </Dialog>
  99. <div class="grid">
  100. <div class="col-12 md:col-6">
  101. <Card>
  102. <template #title>
  103. <h1>Tarif Parkir <span class="text-base">24 jam pertama</span></h1>
  104. <div class="flex flex-column md:flex-row justify-content-end">
  105. <Button
  106. icon="pi pi-pencil"
  107. class="p-button-outlined p-button-primary"
  108. :label="editButtonLabel"
  109. @click="onEdit"
  110. />
  111. </div>
  112. </template>
  113. <template #content>
  114. <div class="grid">
  115. <Divider align="center">
  116. <span class="p-tag">Periode 1</span>
  117. </Divider>
  118. <AppInputNumber
  119. v-model="form.timePeriod1"
  120. class="col-12 md:col-6"
  121. label="Durasi/Jam"
  122. placeholder="durasi waktu, contoh: 1"
  123. :disabled="disabled"
  124. :error="form.errors['time_period.0']"
  125. />
  126. <AppInputNumber
  127. v-model="form.price1"
  128. class="col-12 md:col-6"
  129. label="Harga"
  130. placeholder="contoh: 100000"
  131. :disabled="disabled"
  132. :error="form.errors['price.0']"
  133. />
  134. </div>
  135. <Divider align="center">
  136. <span class="p-tag">Periode 2</span>
  137. </Divider>
  138. <div class="grid">
  139. <AppInputNumber
  140. v-model="form.timePeriod2"
  141. class="col-12 md:col-6"
  142. label="Durasi/Jam"
  143. placeholder="durasi waktu, contoh: 2"
  144. :disabled="disabled"
  145. :error="form.errors['time_period.1']"
  146. />
  147. <AppInputNumber
  148. v-model="form.price2"
  149. class="col-12 md:col-6"
  150. label="Harga"
  151. placeholder="contoh: 100000"
  152. :disabled="disabled"
  153. :error="form.errors['price.1']"
  154. />
  155. </div>
  156. <Divider align="center">
  157. <span class="p-tag">Periode 3</span>
  158. </Divider>
  159. <div class="grid">
  160. <AppInputNumber
  161. v-model="form.timePeriod3"
  162. class="col-12 md:col-6"
  163. label="Durasi/Jam"
  164. placeholder="durasi waktu, contoh: 3"
  165. :disabled="disabled"
  166. :error="form.errors['time_period.2']"
  167. />
  168. <AppInputNumber
  169. v-model="form.price3"
  170. class="col-12 md:col-6"
  171. label="Harga"
  172. placeholder="contoh: 100000"
  173. :disabled="disabled"
  174. :error="form.errors['price.2']"
  175. />
  176. </div>
  177. <Divider align="center">
  178. <span class="p-tag">Periode 4</span>
  179. </Divider>
  180. <div class="grid">
  181. <AppInputNumber
  182. v-model="form.timePeriod4"
  183. class="col-12 md:col-6"
  184. label="Durasi/Jam"
  185. placeholder="durasi waktu, contoh: 4"
  186. :disabled="disabled"
  187. :error="form.errors['time_period.3']"
  188. />
  189. <AppInputNumber
  190. v-model="form.price4"
  191. class="col-12 md:col-6"
  192. label="Harga"
  193. placeholder="contoh: 100000"
  194. :disabled="disabled"
  195. :error="form.errors['price.3']"
  196. />
  197. </div>
  198. <Divider align="center">
  199. <span class="p-tag">Seterusnya</span>
  200. </Divider>
  201. <div class="grid">
  202. <AppInputNumber
  203. v-model="form.timePeriodNext"
  204. class="col-12 md:col-6"
  205. label="Durasi/Jam"
  206. placeholder="durasi waktu, contoh: 4"
  207. :disabled="disabled"
  208. :error="form.errors['time_period.4']"
  209. />
  210. <AppInputNumber
  211. v-model="form.priceNext"
  212. class="col-12 md:col-6"
  213. label="Harga"
  214. placeholder="contoh: 100000"
  215. :disabled="disabled"
  216. :error="form.errors['price.4']"
  217. />
  218. </div>
  219. </template>
  220. <template #footer>
  221. <div class="flex flex-column md:flex-row justify-content-end">
  222. <Button
  223. label="Simpan"
  224. icon="pi pi-check"
  225. class="p-button-outlined"
  226. :disabled="form.processing || disabled"
  227. @click="onSubmit"
  228. />
  229. </div>
  230. </template>
  231. </Card>
  232. </div>
  233. </div>
  234. </DashboardLayout>
  235. </template>