You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
197 lines
6.5 KiB
JavaScript
197 lines
6.5 KiB
JavaScript
import React, { useEffect, useState } from "react";
|
|
import Modal from "@/Components/Modal";
|
|
import InputError from "@/Components/InputError";
|
|
import { DatePickerInput } from "@/Components/DatePickerInput";
|
|
import { useForm, usePage } from "@inertiajs/inertia-react";
|
|
import { toast } from "react-toastify";
|
|
|
|
export default function FormModal(props) {
|
|
const { auth: { user } } = usePage().props
|
|
|
|
const { modalState } = props
|
|
const { data, setData, post, put, processing, errors, reset, clearErrors } = useForm({
|
|
id: null,
|
|
name: "",
|
|
description: "",
|
|
job_number: "",
|
|
date_expense: new Date(),
|
|
amount: "",
|
|
isIncome: 0,
|
|
is_paid: 4,
|
|
})
|
|
|
|
const setType = (type) => {
|
|
setData('isIncome',type)
|
|
}
|
|
|
|
const handleOnChange = (event) => {
|
|
setData(event.target.name, event.target.value)
|
|
}
|
|
|
|
const handleReset = () => {
|
|
modalState.setData(null)
|
|
reset()
|
|
clearErrors()
|
|
}
|
|
|
|
const handleClose = () => {
|
|
handleReset()
|
|
modalState.toggle()
|
|
}
|
|
|
|
const handleSubmit = () => {
|
|
const expense = modalState.data
|
|
if(expense !== null) {
|
|
put(route('expenses.update', expense), {
|
|
onSuccess: () => {
|
|
toast.success('item updated')
|
|
handleClose()
|
|
}
|
|
})
|
|
return
|
|
}
|
|
post(route('expenses.store'), {
|
|
onSuccess: () => {
|
|
toast.success('item created')
|
|
handleClose()
|
|
}
|
|
})
|
|
}
|
|
|
|
const title = data.id ? 'Edit Data' : 'Tambah Data'
|
|
|
|
useEffect(() => {
|
|
const expense = modalState.data
|
|
if (expense !== null) {
|
|
setData({
|
|
id: expense?.id,
|
|
name: expense?.name,
|
|
description: expense?.description,
|
|
job_number: expense?.job_number,
|
|
date_expense: new Date(expense?.date_expense),
|
|
amount: expense?.amount,
|
|
isIncome: +expense?.isIncome,
|
|
is_paid: expense?.is_paid,
|
|
})
|
|
return
|
|
}
|
|
}, [modalState])
|
|
|
|
return (
|
|
<Modal
|
|
isOpen={modalState.isOpen}
|
|
toggle={handleClose}
|
|
title={title}
|
|
>
|
|
{+user.role === 1 && (
|
|
<div className="tabs w-full mb-2">
|
|
<a
|
|
className={`tab tab-bordered w-1/2 ${data.isIncome === 0 ? 'tab-active' : ''}`}
|
|
onClick={() => setType(0)}
|
|
>
|
|
Pengeluaran
|
|
</a>
|
|
<a
|
|
className={`tab tab-bordered w-1/2 ${data.isIncome === 1 ? 'tab-active' : ''}`}
|
|
onClick={() => setType(1)}
|
|
>
|
|
Pemasukan
|
|
</a>
|
|
</div>
|
|
)}
|
|
|
|
{data.isIncome === 0 && (
|
|
<>
|
|
<div className="form-control mb-2">
|
|
<label>Nama</label>
|
|
<input
|
|
className="input input-bordered"
|
|
name="name"
|
|
value={data.name}
|
|
onChange={handleOnChange}
|
|
/>
|
|
<InputError message={errors.name} className="mt-2" />
|
|
</div>
|
|
<div className="form-control mb-2">
|
|
<label>Job Number</label>
|
|
<input
|
|
className="input input-bordered"
|
|
name="job_number"
|
|
value={data.job_number}
|
|
onChange={handleOnChange}
|
|
/>
|
|
<InputError message={errors.job_number} className="mt-2" />
|
|
</div>
|
|
</>
|
|
)}
|
|
|
|
<div className="form-control mb-2">
|
|
<label>Deskripsi</label>
|
|
<textarea
|
|
className="textarea textarea-bordered"
|
|
name="description"
|
|
value={data.description}
|
|
onChange={handleOnChange}
|
|
rows={5}
|
|
/>
|
|
<InputError message={errors.description} className="mt-2" />
|
|
</div>
|
|
<div className="form-control mb-2">
|
|
<label>Tanggal</label>
|
|
<DatePickerInput
|
|
value={data.date_expense}
|
|
onChange={date => setData('date_expense', date)}
|
|
/>
|
|
<InputError message={errors.date_expense} className="mt-2" />
|
|
</div>
|
|
<div className="form-control mb-2">
|
|
<label>Amount</label>
|
|
<input
|
|
type="number"
|
|
className="input input-bordered"
|
|
name="amount"
|
|
value={data.amount}
|
|
onChange={handleOnChange}
|
|
/>
|
|
<InputError message={errors.amount} className="mt-2" />
|
|
</div>
|
|
|
|
{data.isIncome === 0 && (
|
|
<div className="form-control mb-2">
|
|
<label>Status</label>
|
|
<select
|
|
name="is_paid"
|
|
className="select select-bordered w-full"
|
|
disabled={+user.role === 2}
|
|
value={data.is_paid}
|
|
onChange={handleOnChange}
|
|
>
|
|
<option value="4">Draft</option>
|
|
<option value="0">Unpaid</option>
|
|
<option value="1">Paid</option>
|
|
<option value="2">Approve</option>
|
|
<option value="3">Reject</option>
|
|
</select>
|
|
<InputError message={errors.amount} className="mt-2" />
|
|
</div>
|
|
)}
|
|
|
|
<div className="w-full flex justify-end space-x-1 items-center mt-2">
|
|
<button
|
|
className="btn"
|
|
onClick={handleSubmit}
|
|
disabled={processing}
|
|
>
|
|
Simpan
|
|
</button>
|
|
<button
|
|
className="btn btn-secondary"
|
|
onClick={handleClose}
|
|
type="secondary"
|
|
>
|
|
Batal
|
|
</button>
|
|
</div>
|
|
</Modal>
|
|
)
|
|
} |