crud karyawan and default user

dev
ajikamaludin 2 years ago
parent 401f8575a8
commit 4ff9f62274
Signed by: ajikamaludin
GPG Key ID: 476C9A2B4B794EBB

@ -16,4 +16,9 @@ class GeneralController extends Controller
{
return Inertia::render('Jabatan/Index');
}
public function karyawan()
{
return Inertia::render('Karyawan/Index');
}
}

@ -121,7 +121,7 @@ export default function Authenticated({ auth, children }) {
</Link>
</li>
<li>
<Link href={route('dashboard')} className="flex items-center p-2 text-base font-normal text-gray-900 rounded-lg dark:text-white hover:bg-gray-100 dark:hover:bg-gray-700">
<Link href={route('karyawan')} className="flex items-center p-2 text-base font-normal text-gray-900 rounded-lg dark:text-white hover:bg-gray-100 dark:hover:bg-gray-700">
<span className="flex-1 ml-3 whitespace-nowrap">Karyawan</span>
</Link>
</li>

@ -1,14 +1,12 @@
import React, { useState } from 'react';
import React, { useEffect, useState } from 'react';
import Button from '@/Components/Button';
import Checkbox from '@/Components/Checkbox';
import Guest from '@/Layouts/Guest';
import Input from '@/Components/Input';
import Label from '@/Components/Label';
import ValidationErrors from '@/Components/ValidationErrors';
import { Head, Link, useForm } from '@inertiajs/inertia-react';
import { getAllUsers } from '@/Services/User';
import { forEach } from 'lodash';
import { Inertia } from '@inertiajs/inertia';
import { create } from '@/Services/Karyawan';
export default function Login({ status, canResetPassword }) {
const [isLoading, setLoading] = useState(false)
@ -46,6 +44,30 @@ export default function Login({ status, canResetPassword }) {
.finally(() => setLoading(false))
};
useEffect(() => {
// create default user
getAllUsers()
.then(items => {
if(items.length <= 0) {
create({
nik: "1234567890",
name: "admin",
username: "admin",
password: "admin",
jabatan: {
id: "1",
nama: "admin",
tunjangan: "0",
},
jenisKelamin: "Laki-Laki",
status: "Karyawan Tetap",
is_admin: "true",
})
}
})
}, [])
return (
<Guest>
<Head title="Log in" />

@ -50,9 +50,6 @@ export default function Jabatan(props) {
<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">
ID
</th>
<th scope="col" className="py-3 px-6">
Nama
</th>
@ -65,9 +62,6 @@ export default function Jabatan(props) {
<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.id}
</th>
<th scope="row" className="py-4 px-6 font-medium text-gray-900 whitespace-nowrap dark:text-white">
{item.data.nama}
</th>

@ -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
}

@ -30,5 +30,6 @@ Route::middleware([IsGuest::class])->group(function () {
Route::middleware([IsSessionAuth::class])->group(function () {
Route::get('/dashboard', [GeneralController::class, 'dashboard'])->name('dashboard');
Route::get('/jabatan', [GeneralController::class, 'jabatan'])->name('jabatan');
Route::get('/karyawan', [GeneralController::class, 'karyawan'])->name('karyawan');
Route::post('/logout', [AuthController::class, 'destroy'])->name('logout');
});

Loading…
Cancel
Save