Wahyu Ramadhan
2 years ago
5 changed files with 560 additions and 59 deletions
@ -0,0 +1,244 @@
|
||||
import React, { useEffect, useState } from 'react' |
||||
import { |
||||
Modal, ModalHeader, ModalBody, ModalFooter, |
||||
Button, Form, FormGroup, Label, Input, Col, Row, |
||||
Nav, NavItem, NavLink, TabContent, TabPane |
||||
} from 'reactstrap'; |
||||
|
||||
import { Select, DatePicker } from 'antd'; |
||||
|
||||
const { Option } = Select |
||||
|
||||
|
||||
|
||||
const DialogForm = ({ |
||||
openDialog, |
||||
closeDialog, |
||||
toggleDialog, |
||||
typeDialogProp, |
||||
roleList, |
||||
nameProp, |
||||
noHpProp, |
||||
idNumberProp, |
||||
genderProp, |
||||
birthdayPlaceProp, |
||||
birthdayDateProp, |
||||
addressProp, |
||||
emailProp, |
||||
userNameProp, |
||||
}) => { |
||||
const token = window.localStorage.getItem('token'); |
||||
const [typeDialog, setTypeDialog] = useState(typeDialogProp) |
||||
const [userName, setUserName] = useState(userNameProp) |
||||
const [name, setName] = useState(nameProp) |
||||
const [noHp, setNohp] = useState(noHpProp) |
||||
const [gender, setGender] = useState(genderProp) |
||||
const [address, setAddres] = useState(addressProp) |
||||
const [birthdayPlace, setBirthdayplace] = useState(birthdayPlaceProp) |
||||
const [birthdayDate, setBirthdaydate] = useState(birthdayDateProp) |
||||
const [idNumber, setIdnumber] = useState(idNumberProp) |
||||
const [email, setEmail] = useState(emailProp) |
||||
const [password, setPassword] = useState('') |
||||
const [oldPassword, setOldPassword] = useState('') |
||||
const [newPassword, setNewPassword] = useState('') |
||||
const [newPasswordConfirm, setNewPasswordConfirm] = useState('') |
||||
const [activeTab, setActiveTab] = useState('tab1') |
||||
|
||||
useEffect(() => { |
||||
setUserName(userNameProp); |
||||
setName(nameProp); |
||||
setNohp(noHpProp); |
||||
setGender(genderProp); |
||||
setAddres(addressProp); |
||||
setBirthdayplace(birthdayPlaceProp); |
||||
setIdnumber(idNumberProp); |
||||
setEmail(emailProp); |
||||
}, [userNameProp, nameProp, noHpProp, genderProp, addressProp, birthdayPlaceProp, idNumberProp, emailProp]); |
||||
|
||||
const handleSave = () => { |
||||
let data = ''; |
||||
if (typeDialog === "Personal") { |
||||
data = { |
||||
name: name, |
||||
phone_number: noHp, |
||||
gender: gender, |
||||
ktp_number: idNumber, |
||||
birth_place: birthdayPlace, |
||||
address: address, |
||||
}; |
||||
if (birthdayDate) { |
||||
data.birth_date = birthdayDate; |
||||
} |
||||
closeDialog('profile', data) |
||||
} else if (typeDialog === "Account") { |
||||
data = { |
||||
username: userName, |
||||
email: email, |
||||
}; |
||||
if (newPassword) { |
||||
data.password = newPassword; |
||||
} |
||||
console.log(data); |
||||
closeDialog('profile', data) |
||||
} |
||||
} |
||||
|
||||
const handleCancel = () => { |
||||
closeDialog('cancel', 'none') |
||||
} |
||||
|
||||
const setupSelectRole = () => { |
||||
return ( |
||||
<> |
||||
{roleList.map((val, index) => { |
||||
return ( |
||||
<Option key={index} value={val.id}>{val.name}</Option> |
||||
) |
||||
})} |
||||
</> |
||||
) |
||||
} |
||||
|
||||
|
||||
const renderForm = () => { |
||||
return ( |
||||
<Form> |
||||
<Row> |
||||
<Col md={6}> |
||||
<FormGroup> |
||||
<Label className="capitalize">Nama</Label> |
||||
<Input type="text" value={name} onChange={(e) => setName(e.target.value)} /> |
||||
</FormGroup> |
||||
|
||||
<FormGroup> |
||||
<Label className="capitalize">ID Number</Label> |
||||
<Input type="text" value={idNumber} onChange={(e) => setIdnumber(e.target.value)} /> |
||||
</FormGroup> |
||||
|
||||
<FormGroup> |
||||
<Label className="capitalize">Alamat</Label> |
||||
<Input type="text" value={address} onChange={(e) => setAddres(e.target.value)} /> |
||||
</FormGroup> |
||||
|
||||
</Col> |
||||
<Col md={6}> |
||||
<FormGroup> |
||||
<Label className="capitalize">Nomor Handphone</Label> |
||||
<Input type="text" value={noHp} onChange={(e) => setNohp(e.target.value)} /> |
||||
</FormGroup> |
||||
|
||||
<FormGroup> |
||||
<Label className="capitalize">Gender</Label> |
||||
<Input type="select" value={gender} onChange={(e) => setGender(e.target.value)}> |
||||
<option value="">Please select</option> |
||||
<option value="Laki-laki">Male</option> |
||||
<option value="Perempuan">Female</option> |
||||
</Input> |
||||
</FormGroup> |
||||
|
||||
<FormGroup> |
||||
<Label className="capitalize">Tempat Lahir</Label> |
||||
<Input type="text" value={birthdayPlace} onChange={(e) => setBirthdayplace(e.target.value)} /> |
||||
</FormGroup> |
||||
|
||||
<FormGroup> |
||||
<Label className="capitalize">Tanggal Lahir</Label> |
||||
<DatePicker style={{ width: "100%" }} value={birthdayDate} defaultValue={birthdayDate} onChange={(date, dateString) => setBirthdaydate(date)} /> |
||||
</FormGroup> |
||||
|
||||
</Col> |
||||
</Row> |
||||
</Form> |
||||
) |
||||
} |
||||
|
||||
const renderFormAccount = () => { |
||||
return ( |
||||
<Form> |
||||
<Row> |
||||
<Col md={6}> |
||||
<FormGroup> |
||||
<Label className="capitalize">Username</Label> |
||||
<Input type="text" value={userName} onChange={(e) => setUserName(e.target.value)} /> |
||||
</FormGroup> |
||||
|
||||
<FormGroup> |
||||
<Label className="capitalize">Email</Label> |
||||
|
||||
<Input type="text" value={email} onChange={(e) => setEmail(e.target.value)} /> |
||||
</FormGroup> |
||||
</Col> |
||||
<Col md={6}> |
||||
<FormGroup> |
||||
<Label className="capitalize">Old password</Label> |
||||
<Input type="text" value={oldPassword} onChange={(e) => setOldPassword(e.target.value)} /> |
||||
</FormGroup> |
||||
|
||||
<FormGroup> |
||||
<Label className="capitalize">New password</Label> |
||||
<Input type="text" value={newPassword} onChange={(e) => setNewPassword(e.target.value)} /> |
||||
</FormGroup> |
||||
|
||||
<FormGroup> |
||||
<Label className="capitalize">Confirm new password</Label> |
||||
<Input type="text" value={newPasswordConfirm} onChange={(e) => setNewPasswordConfirm(e.target.value)} /> |
||||
</FormGroup> |
||||
</Col> |
||||
</Row> |
||||
</Form> |
||||
) |
||||
} |
||||
|
||||
return ( |
||||
<> |
||||
<Modal size="lg" isOpen={openDialog} toggle={toggleDialog}> |
||||
<ModalHeader className="capitalize" toggle={closeDialog}> |
||||
Update {typeDialog == "Personal" ? `Personal` : "Account"} Data |
||||
</ModalHeader> |
||||
<ModalBody> |
||||
<Nav tabs> |
||||
<NavItem> |
||||
<NavLink |
||||
onClick={() => { |
||||
setActiveTab("tab1"); |
||||
setTypeDialog("Personal"); |
||||
}} |
||||
active={activeTab === "tab1"} |
||||
> |
||||
Personal |
||||
</NavLink> |
||||
</NavItem> |
||||
<NavItem> |
||||
<NavLink |
||||
onClick={() => { |
||||
setActiveTab("tab2"); |
||||
setTypeDialog("Account"); |
||||
}} |
||||
active={activeTab === "tab2"} |
||||
> |
||||
Account |
||||
</NavLink> |
||||
</NavItem> |
||||
</Nav> |
||||
<TabContent activeTab={activeTab}> |
||||
<TabPane tabId="tab1"> |
||||
{renderForm()} |
||||
</TabPane> |
||||
<TabPane tabId="tab2"> |
||||
{renderFormAccount()} |
||||
</TabPane> |
||||
</TabContent> |
||||
</ModalBody> |
||||
<ModalFooter> |
||||
<Button color="primary" onClick={() => handleSave()}>{typeDialog == "Profile" ? `Profile` : "Save"}</Button> {' '} |
||||
<Button className="capitalize" color="secondary" onClick={() => handleCancel()}>Batal</Button> |
||||
</ModalFooter> |
||||
</Modal> |
||||
</> |
||||
) |
||||
|
||||
|
||||
|
||||
} |
||||
|
||||
export default DialogForm; |
@ -0,0 +1,260 @@
|
||||
import * as XLSX from 'xlsx'; |
||||
import React, { useState, useEffect, useMemo } from 'react'; |
||||
import SweetAlert from 'react-bootstrap-sweetalert'; |
||||
import axios from "../../../const/interceptorApi" |
||||
import { Card, CardBody, CardHeader, Col, Row, Input, Table, Button } from 'reactstrap'; |
||||
import { NotificationContainer, NotificationManager } from 'react-notifications'; |
||||
import { Pagination, Tooltip } from 'antd'; |
||||
import { USER_EDIT, SATUAN_ADD, SATUAN_EDIT, SATUAN_DELETE, SATUAN_SEARCH } from '../../../const/ApiConst'; |
||||
import profile from '../../../assets/img/profile.png' |
||||
import DialogForm from './DialogForm' |
||||
import { ROLE_SEARCH, BASE_OSPRO } from '../../../const/ApiConst' |
||||
|
||||
|
||||
|
||||
|
||||
const Profile = ({ params }) => { |
||||
const token = localStorage.getItem("token") |
||||
const config = { |
||||
headers: { |
||||
"Content-Type": "application/json", |
||||
"Authorization": `Bearer ${token}` |
||||
} |
||||
} |
||||
|
||||
const pageName = params.name; |
||||
|
||||
|
||||
|
||||
|
||||
const [openDialog, setOpenDialog] = useState(false) |
||||
const [typeDialog, setTypeDialog] = useState('Personal') |
||||
const [id, setId] = useState(0) |
||||
const [roleList, setRoleList] = useState([]) |
||||
const [userProfile, setUserprofile] = useState(null) |
||||
const [userName, setUserName] = useState("") |
||||
const [name, setName] = useState('') |
||||
const [noHp, setNohp] = useState("") |
||||
const [gender, setGender] = useState("") |
||||
const [address, setAddres] = useState("") |
||||
const [birthdayPlace, setBirthdayplace] = useState("") |
||||
const [birthdayDate, setBirthdaydate] = useState("") |
||||
const [idNumber, setIdnumber] = useState("") |
||||
const [divisi, setDivisi] = useState("") |
||||
const [role, setRole] = useState("") |
||||
const [email, setEmail] = useState("") |
||||
const [employeeType, setEmployeeType] = useState("") |
||||
|
||||
useEffect(() => { |
||||
getDataProfileUser(); |
||||
getRoleList() |
||||
}, []) |
||||
|
||||
useEffect(() => { |
||||
if (userProfile && userProfile != {}) { |
||||
setId(userProfile?.id) |
||||
setUserName(userProfile?.username); |
||||
setName(userProfile?.name); |
||||
setEmail(userProfile?.email); |
||||
setNohp(userProfile?.phone_number); |
||||
setAddres(userProfile?.address); |
||||
setIdnumber(userProfile?.ktp_number); |
||||
setGender(userProfile?.gender); |
||||
setDivisi(userProfile?.divisi_id); |
||||
setRole(userProfile?.role_id); |
||||
setBirthdayplace(userProfile?.birth_place); |
||||
setBirthdaydate(userProfile?.birth_date); |
||||
setEmployeeType(userProfile?.employee_type); |
||||
|
||||
} |
||||
}, [userProfile]) |
||||
|
||||
const handleOpenDialog = (type) => { |
||||
setOpenDialog(true) |
||||
setTypeDialog(type) |
||||
} |
||||
|
||||
const handleCloseDialog = (type, data) => { |
||||
if (type === "profile") { |
||||
saveProfile(data); |
||||
} |
||||
setOpenDialog(false) |
||||
} |
||||
|
||||
const saveProfile = async (data) => { |
||||
|
||||
let urlEdit = USER_EDIT(id) |
||||
const formData = data |
||||
|
||||
const result = await axios.put(urlEdit, formData, config) |
||||
.then(res => res) |
||||
.catch((error) => error.response); |
||||
|
||||
if (result && result.data && result.data.code === 200) { |
||||
getDataProfileUser(); |
||||
NotificationManager.success(`Data resource berhasil diedit`, 'Success!!'); |
||||
} else { |
||||
NotificationManager.error(`Data resource gagal di edit`, `Failed!!`); |
||||
} |
||||
} |
||||
|
||||
const toggleAddDialog = () => { |
||||
setOpenDialog(!openDialog) |
||||
} |
||||
|
||||
const getRoleList = async () => { |
||||
const formData = { |
||||
"paging": { "start": 0, "length": -1 }, |
||||
"orders": { "columns": ["id"], "ascending": false } |
||||
} |
||||
|
||||
const result = await axios |
||||
.post(ROLE_SEARCH, formData, config) |
||||
.then(res => res) |
||||
.catch((error) => error.response); |
||||
|
||||
if (result && result.data && result.data.code == 200) { |
||||
setRoleList(result.data.data); |
||||
} |
||||
} |
||||
|
||||
const getDataProfileUser = async () => { |
||||
const id = localStorage.getItem("user_id") |
||||
|
||||
const url = `${BASE_OSPRO}/api/human-resource/edit/${id}` |
||||
// const payload = {
|
||||
// columns: [
|
||||
// {
|
||||
// name: "name",
|
||||
// logic_operator: "ilike",
|
||||
// value: 'admin',
|
||||
// operator: "AND",
|
||||
// },
|
||||
// ],
|
||||
// joins: [
|
||||
// {
|
||||
// name: "m_divisi",
|
||||
// column_join: "id",
|
||||
// column_results: ["name"],
|
||||
// },
|
||||
// ]
|
||||
// };
|
||||
|
||||
const result = await axios |
||||
.get(url, config) |
||||
.then((res) => res) |
||||
.catch((error) => error.response); |
||||
console.log(result); |
||||
if (result && result.data && result.data.code == 200) { |
||||
let dataRes = result.data.data; |
||||
setUserprofile(dataRes); |
||||
} else { |
||||
NotificationManager.error("Gagal Mengambil Data!!", "Failed"); |
||||
} |
||||
}; |
||||
|
||||
|
||||
|
||||
return ( |
||||
<div> |
||||
<NotificationContainer /> |
||||
<DialogForm |
||||
openDialog={openDialog} |
||||
closeDialog={handleCloseDialog} |
||||
toggleDialog={() => toggleAddDialog} |
||||
typeDialogProp={typeDialog} |
||||
roleList={roleList} |
||||
nameProp={name} |
||||
noHpProp={noHp} |
||||
idNumberProp={idNumber} |
||||
genderProp={gender} |
||||
divisiProp={divisi} |
||||
birthdayPlaceProp={birthdayPlace} |
||||
birthdayDateProp={birthdayDate} |
||||
addressProp={address} |
||||
emailProp={email} |
||||
userNameProp={userName} |
||||
/> |
||||
|
||||
<Card> |
||||
<Row style={{ padding: '10px' }}> |
||||
<Col md={11}> |
||||
<img src={profile} height="80" width="80" /> |
||||
</Col> |
||||
<Col md={1}> |
||||
<Button color="primary" onClick={() => handleOpenDialog('Personal')}>Edit Profil</Button> |
||||
</Col> |
||||
</Row> |
||||
</Card> |
||||
|
||||
<Card> |
||||
<Col> |
||||
<tr> |
||||
<td><b>Profile Setting</b></td> |
||||
</tr> |
||||
</Col> |
||||
<Col> |
||||
<tbody> |
||||
<tr> |
||||
<td><b>Nama </b> </td> |
||||
<td> : {name}</td> |
||||
</tr> |
||||
<tr> |
||||
<td><b>Username </b> </td> |
||||
<td> : {userName}</td> |
||||
</tr> |
||||
<tr> |
||||
<td><b>Email </b></td> |
||||
<td>: {email}</td> |
||||
</tr> |
||||
|
||||
<tr> |
||||
<td><b>Password </b> </td> |
||||
<td> : **********</td> |
||||
|
||||
</tr> |
||||
<tr> |
||||
<td><b>Nomor Handphone </b></td> |
||||
<td>: {noHp}</td> |
||||
</tr> |
||||
<tr> |
||||
<td><b>Alamat </b></td> |
||||
<td>: {address}</td> |
||||
</tr> |
||||
<tr> |
||||
<td><b>ID Number </b></td> |
||||
<td>: {idNumber}</td> |
||||
</tr> |
||||
<tr> |
||||
<td><b>Gender </b></td> |
||||
<td> : {gender}</td> |
||||
</tr> |
||||
<tr> |
||||
<td><b>Divisi </b></td> |
||||
<td> : {divisi}</td> |
||||
</tr> |
||||
<tr> |
||||
<td><b>Employee Type </b></td> |
||||
<td> : {employeeType}</td> |
||||
</tr> |
||||
<tr> |
||||
<td><b>Role </b></td> |
||||
<td>: {role}</td> |
||||
</tr> |
||||
<tr> |
||||
<td><b>Tempat Lahir </b></td> |
||||
<td>: {birthdayPlace}</td> |
||||
</tr> |
||||
<tr> |
||||
<td><b>Tanggal Lahir </b></td> |
||||
<td>: {birthdayDate}</td> |
||||
</tr> |
||||
</tbody> |
||||
<br /> |
||||
</Col> |
||||
</Card> |
||||
</div> |
||||
) |
||||
} |
||||
|
||||
export default Profile; |
Loading…
Reference in new issue