crud karyawan and default user
parent
401f8575a8
commit
4ff9f62274
@ -0,0 +1,222 @@
|
||||
import React, { useEffect, useState } from 'react'
|
||||
import { toast } from 'react-toastify'
|
||||
import { Modal } from '@/Components/Modal'
|
||||
import { useForm } from '@inertiajs/inertia-react'
|
||||
import Button from '@/Components/Button'
|
||||
import Input from '@/Components/Input'
|
||||
import { create, update } from '@/Services/Karyawan'
|
||||
import { getAll as GetAllJabatan } from '@/Services/Jabatan'
|
||||
|
||||
export default function FormModal({ modalState, refresh }) {
|
||||
const [loading, setLoading] = useState(false)
|
||||
const { data, setData, reset } = useForm({
|
||||
nik: '',
|
||||
name: '',
|
||||
username: '',
|
||||
password: '',
|
||||
jenisKelamin: "Laki-Laki",
|
||||
jabatan: '',
|
||||
status: 'Karyawan Tetap',
|
||||
is_admin: false
|
||||
})
|
||||
|
||||
const [jabatans, setJabatans] = useState([])
|
||||
|
||||
useEffect(() => {
|
||||
GetAllJabatan()
|
||||
.then((items) => setJabatans(items))
|
||||
},[])
|
||||
|
||||
useEffect(() => {
|
||||
if (modalState.isOpen === false) {
|
||||
reset()
|
||||
modalState.setData(null)
|
||||
}
|
||||
if (modalState.data !== null) {
|
||||
setData(modalState.data.data)
|
||||
}
|
||||
}, [modalState])
|
||||
|
||||
const onHandleChange = (event) => {
|
||||
setData(
|
||||
event.target.name,
|
||||
event.target.type === 'checkbox'
|
||||
? event.target.checked
|
||||
: event.target.value
|
||||
)
|
||||
}
|
||||
|
||||
const onHandleJabatanChange = (event) => {
|
||||
if (event.target.value == "") {
|
||||
setData({
|
||||
...data,
|
||||
jabatan: ""
|
||||
})
|
||||
return
|
||||
}
|
||||
const jabatan = jabatans.find(item => item.id == event.target.value)
|
||||
setData({
|
||||
...data,
|
||||
jabatan: {...jabatan.data, id : jabatan.id}
|
||||
})
|
||||
}
|
||||
|
||||
const submit = (e) => {
|
||||
e.preventDefault()
|
||||
setLoading(true)
|
||||
if (modalState.data !== null) {
|
||||
update(data, modalState.data.id)
|
||||
.finally(() => {
|
||||
reset()
|
||||
toast.success("berhasil update")
|
||||
setLoading(false)
|
||||
modalState.toggle()
|
||||
refresh()
|
||||
})
|
||||
} else {
|
||||
create(data)
|
||||
.then((id) => console.log(id))
|
||||
.finally(() => {
|
||||
reset()
|
||||
toast.success("berhasil simpan")
|
||||
setLoading(false)
|
||||
modalState.toggle()
|
||||
refresh()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<Modal isOpen={modalState.isOpen} toggleModal={modalState.toggle}>
|
||||
<div className="text-lg font-bold">Karyawan</div>
|
||||
<label className="block text-sm mt-4">
|
||||
<span className="text-gray-700 dark:text-gray-400">
|
||||
NIK
|
||||
</span>
|
||||
<Input
|
||||
placeholder="John Doe"
|
||||
name="nik"
|
||||
value={data.nik}
|
||||
handleChange={onHandleChange}
|
||||
/>
|
||||
</label>
|
||||
<label className="block text-sm mt-4">
|
||||
<span className="text-gray-700 dark:text-gray-400">
|
||||
Nama
|
||||
</span>
|
||||
<Input
|
||||
placeholder="John Doe"
|
||||
name="name"
|
||||
value={data.name}
|
||||
handleChange={onHandleChange}
|
||||
/>
|
||||
</label>
|
||||
<label className="block text-sm mt-4">
|
||||
<span className="text-gray-700 dark:text-gray-400">
|
||||
Username
|
||||
</span>
|
||||
<Input
|
||||
placeholder="John Doe"
|
||||
name="username"
|
||||
value={data.username}
|
||||
handleChange={onHandleChange}
|
||||
/>
|
||||
</label>
|
||||
<label className="block text-sm mt-4">
|
||||
<span className="text-gray-700 dark:text-gray-400">
|
||||
Password
|
||||
</span>
|
||||
<Input
|
||||
placeholder="John Doe"
|
||||
name="password"
|
||||
value={data.password}
|
||||
handleChange={onHandleChange}
|
||||
/>
|
||||
</label>
|
||||
<label className="block text-sm mt-4">
|
||||
<span className="text-gray-700 dark:text-gray-400">
|
||||
Jenis Kelamin
|
||||
</span>
|
||||
<select
|
||||
className="border mt-1 border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
|
||||
value={data.jenisKelamin}
|
||||
name="jenisKelamin"
|
||||
onChange={onHandleChange}
|
||||
>
|
||||
{["Laki-Laki", "Perempuan"].map((val, index) => (
|
||||
<option
|
||||
key={`val-${index}`}
|
||||
value={val}
|
||||
>
|
||||
{val}
|
||||
</option>
|
||||
))}
|
||||
</select>
|
||||
</label>
|
||||
<label className="block text-sm mt-4">
|
||||
<span className="text-gray-700 dark:text-gray-400">
|
||||
Jabatan
|
||||
</span>
|
||||
<select
|
||||
className="border mt-1 border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
|
||||
value={data.jabatan?.id}
|
||||
name="jabatan"
|
||||
onChange={onHandleJabatanChange}
|
||||
>
|
||||
<option key="random123" value=""></option>
|
||||
{jabatans.map((val, index) => (
|
||||
<option
|
||||
key={`${val.nama}-${index}`}
|
||||
value={val.id}
|
||||
>
|
||||
{val.data.nama}
|
||||
</option>
|
||||
))}
|
||||
</select>
|
||||
</label>
|
||||
<label className="block text-sm mt-4">
|
||||
<span className="text-gray-700 dark:text-gray-400">
|
||||
Status
|
||||
</span>
|
||||
<select
|
||||
className="border mt-1 border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
|
||||
value={data.status}
|
||||
name="status"
|
||||
onChange={onHandleChange}
|
||||
>
|
||||
{["Karyawan Tetap", "Karyawan Tidak Tetap"].map((val, index) => (
|
||||
<option
|
||||
key={`val-${index}`}
|
||||
value={val}
|
||||
>
|
||||
{val}
|
||||
</option>
|
||||
))}
|
||||
</select>
|
||||
</label>
|
||||
<label className="block text-sm mt-4">
|
||||
<span className="text-gray-700 dark:text-gray-400">
|
||||
Hak Akses
|
||||
</span>
|
||||
<select
|
||||
className="border mt-1 border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
|
||||
value={data.is_admin}
|
||||
name="is_admin"
|
||||
onChange={onHandleChange}
|
||||
>
|
||||
{["Admin", "User"].map((val, index) => (
|
||||
<option
|
||||
key={`val-${index}`}
|
||||
value={val == "Admin"}
|
||||
>
|
||||
{val}
|
||||
</option>
|
||||
))}
|
||||
</select>
|
||||
</label>
|
||||
<Button className={'mt-4'} onClick={submit} disabled={loading} processing={loading}>
|
||||
Save
|
||||
</Button>
|
||||
</Modal>
|
||||
)
|
||||
}
|
@ -0,0 +1,91 @@
|
||||
import React, { useEffect, useState } from 'react';
|
||||
import Authenticated from '@/Layouts/Authenticated';
|
||||
import { Head } from '@inertiajs/inertia-react';
|
||||
import { useModalState } from '@/Hooks'
|
||||
import Button from '@/Components/Button';
|
||||
import FormModal from './FormModal';
|
||||
import { getAll, deleteById } from '@/Services/Karyawan';
|
||||
import { toast } from 'react-toastify';
|
||||
|
||||
export default function Karyawan(props) {
|
||||
const formModal = useModalState(false)
|
||||
const [items, setItems] = useState([])
|
||||
|
||||
const hanldeDeleteClick = (item) => {
|
||||
const con = confirm("delete item?")
|
||||
if (con) {
|
||||
deleteById(item.id)
|
||||
.then(() => toast.success('berhasil hapus'))
|
||||
.finally(() => fetchData())
|
||||
}
|
||||
}
|
||||
|
||||
const handleEditClick = (item) => {
|
||||
formModal.setData(item)
|
||||
formModal.toggle()
|
||||
}
|
||||
|
||||
const fetchData = () => {
|
||||
getAll()
|
||||
.then(items => setItems(items))
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
fetchData()
|
||||
}, [])
|
||||
|
||||
return (
|
||||
<Authenticated
|
||||
auth={props.auth}
|
||||
errors={props.errors}
|
||||
>
|
||||
<Head title="Jabatan" />
|
||||
|
||||
<div className="py-0">
|
||||
<div className="max-w-7xl sm:px-6">
|
||||
<div className="bg-white overflow-hidden shadow-sm sm:rounded-lg">
|
||||
<div className="p-6 bg-white border-b border-gray-200">
|
||||
<Button onClick={formModal.toggle}>Tambah</Button>
|
||||
<div className="overflow-x-auto relative pt-5">
|
||||
<table className="w-full text-sm text-left text-gray-500 dark:text-gray-400">
|
||||
<thead className="text-xs text-gray-700 uppercase bg-gray-50 dark:bg-gray-700 dark:text-gray-400">
|
||||
<tr>
|
||||
<th scope="col" className="py-3 px-6">
|
||||
Nama
|
||||
</th>
|
||||
<th scope="col" className="py-3 px-6">
|
||||
Jabatan
|
||||
</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{items.map(item => (
|
||||
<tr key={item.id} className="bg-white border-b dark:bg-gray-800 dark:border-gray-700">
|
||||
<th scope="row" className="py-4 px-6 font-medium text-gray-900 whitespace-nowrap dark:text-white">
|
||||
{item.data.name}
|
||||
</th>
|
||||
<td className="py-4 px-6">
|
||||
{item.data.jabatan.nama}
|
||||
</td>
|
||||
<th>
|
||||
<div className='flex space-x-1'>
|
||||
<Button onClick={() => handleEditClick(item)}>Edit</Button>
|
||||
{item.data.jabatan.id != "1" && (
|
||||
<Button onClick={() => hanldeDeleteClick(item)}>Hapus</Button>
|
||||
)}
|
||||
</div>
|
||||
</th>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<FormModal modalState={formModal} refresh={fetchData}/>
|
||||
</Authenticated>
|
||||
);
|
||||
}
|
@ -0,0 +1,41 @@
|
||||
import db from "@/firebase";
|
||||
import { collection, getDocs, doc, addDoc, deleteDoc, updateDoc } from "firebase/firestore";
|
||||
|
||||
const COLLECTION = "users"
|
||||
|
||||
async function getAll() {
|
||||
const collect = collection(db, COLLECTION)
|
||||
const data = await getDocs(collect)
|
||||
const lists = data.docs.map(doc => {
|
||||
return {
|
||||
data: doc.data(),
|
||||
id: doc.id
|
||||
}
|
||||
})
|
||||
return lists
|
||||
}
|
||||
|
||||
async function create(payload) {
|
||||
const docRef = await addDoc(collection(db, COLLECTION), payload)
|
||||
return docRef.id
|
||||
}
|
||||
|
||||
async function update(payload, id){
|
||||
const docRef = doc(db, COLLECTION, id)
|
||||
const result = await updateDoc(docRef, payload);
|
||||
return result
|
||||
}
|
||||
|
||||
async function deleteById(id) {
|
||||
console.log(id)
|
||||
const docRef = doc(db, COLLECTION, id)
|
||||
const result = await deleteDoc(docRef);
|
||||
return result
|
||||
}
|
||||
|
||||
export {
|
||||
getAll,
|
||||
create,
|
||||
update,
|
||||
deleteById
|
||||
}
|
Loading…
Reference in New Issue