farhan048
1 year ago
5 changed files with 681 additions and 10 deletions
@ -0,0 +1,399 @@
|
||||
import React, { useState, useMemo, useEffect } from 'react' |
||||
import { |
||||
Modal, ModalHeader, ModalBody, ModalFooter, |
||||
Button, Form, FormGroup, Label, Input, Col, Row, Card, CardBody, Fade |
||||
} from 'reactstrap'; |
||||
import { Pagination, Table, Tooltip, Select, Input as InputAntd } from 'antd'; |
||||
import moment from 'moment'; |
||||
import { NotificationContainer, NotificationManager } from 'react-notifications'; |
||||
import DialogFormUser from './DialogFormUser'; |
||||
import 'antd/dist/antd.css'; |
||||
import { useTranslation } from 'react-i18next'; |
||||
import axios from "../../../const/interceptorApi" |
||||
import { |
||||
USER_SEARCH, USER_EDIT, USER_DELETE, ROLE_SEARCH, DIVISI_SEARCH, |
||||
} from '../../../const/ApiConst'; |
||||
const token = window.localStorage.getItem('token'); |
||||
const config = { |
||||
headers: |
||||
{ |
||||
Authorization: `Bearer ${token}`, |
||||
"Content-type": `application/json` |
||||
} |
||||
}; |
||||
const { Option } = Select |
||||
const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, dataEdit, roleList, companyID }) => { |
||||
const { t } = useTranslation() |
||||
const [registrationnumber, setRegistrationNumber] = useState('') |
||||
const [companyName, setCompanyName] = useState('') |
||||
const [addressCompany, setAddressCompany] = useState('') |
||||
const [phoneNumber, setPhoneNumber] = useState('') |
||||
const [emailCompany, setEmailCompany] = useState('') |
||||
const [description, setDescription] = useState('') |
||||
const [logoLogin, setLogoLogin] = useState([]) |
||||
const [logoHeader, setLogoHeader] = useState([]) |
||||
const [favIcon, setFavIcon] = useState([]) |
||||
const [loginInstruction, setLoginInstruction] = useState('') |
||||
const [about, setAbout] = useState('') |
||||
const [htmlTitle, setHtmlTitle] = useState('') |
||||
const [appName, setAppName] = useState('') |
||||
const [baseUrl, setBaseUrl] = useState([]) |
||||
const [statusCompany, setStatusCompany] = useState('active') |
||||
const [template, setTemplate] = useState('') |
||||
|
||||
const [dataTable, setDatatable] = useState([]) |
||||
const [openDialogUser, setOpenDialogUser] = useState(false) |
||||
const [typeDialogUser, setTypeDialogUser] = useState("add") |
||||
const [currentPage, setCurrentPage] = useState(1) |
||||
const [rowsPerPage, setRowsPerPage] = useState(10) |
||||
const [totalPage, setTotalPage] = useState(0) |
||||
const [search, setSearch] = useState('') |
||||
|
||||
useEffect(() => { |
||||
if (companyID) { |
||||
getDataUser() |
||||
} |
||||
}, [companyID, rowsPerPage, currentPage]) |
||||
|
||||
const onShowSizeChange = (current, pageSize) => { |
||||
setRowsPerPage(pageSize) |
||||
} |
||||
|
||||
const onPagination = (current, pageSize) => { |
||||
setCurrentPage(current) |
||||
} |
||||
|
||||
const getDataUser = async () => { |
||||
let start = 0; |
||||
|
||||
if (currentPage !== 1 && currentPage > 1) { |
||||
start = (currentPage * rowsPerPage) - rowsPerPage |
||||
} |
||||
|
||||
const payload = { |
||||
"paging": { |
||||
"start": start, |
||||
"length": rowsPerPage |
||||
}, |
||||
"columns": [], |
||||
"group_column": { |
||||
"operator": "AND", |
||||
"group_operator": "OR", |
||||
"where": [ |
||||
{ |
||||
"name": "name", |
||||
"logic_operator": "~*", |
||||
"value": search |
||||
}, |
||||
{ |
||||
"name": "ktp_number", |
||||
"logic_operator": "~*", |
||||
"value": search |
||||
}, |
||||
{ |
||||
"name": "name", |
||||
"logic_operator": "~*", |
||||
"value": search, |
||||
"table_name": "m_divisi" |
||||
}, |
||||
{ |
||||
"name": "employee_type", |
||||
"logic_operator": "~*", |
||||
"value": search |
||||
}, |
||||
{ |
||||
"name": "name", |
||||
"logic_operator": "~*", |
||||
"value": search, |
||||
"table_name": "m_roles" |
||||
}, |
||||
{ |
||||
"name": "phone_number", |
||||
"logic_operator": "~*", |
||||
"value": search |
||||
}, |
||||
{ |
||||
"name": "email", |
||||
"logic_operator": "~*", |
||||
"value": search |
||||
}, |
||||
{ |
||||
"name": "status_resource", |
||||
"logic_operator": "~*", |
||||
"value": search |
||||
}, |
||||
{ |
||||
"name": "company_id", |
||||
"logic_operator": "=", |
||||
"value": companyID |
||||
}, |
||||
] |
||||
}, |
||||
"joins": [ |
||||
{ |
||||
"name": "m_roles", |
||||
"column_join": "role_id", |
||||
"column_results": [ |
||||
"name", |
||||
"description" |
||||
] |
||||
}, |
||||
{ |
||||
"name": "m_divisi", |
||||
"column_join": "divisi_id", |
||||
"column_results": [ |
||||
"name" |
||||
] |
||||
} |
||||
], |
||||
"orders": { |
||||
"columns": [ |
||||
"id" |
||||
], |
||||
"ascending": false |
||||
} |
||||
} |
||||
|
||||
const result = await axios |
||||
.post(USER_SEARCH, payload, config) |
||||
.then(res => res) |
||||
.catch((error) => error.response); |
||||
|
||||
if (result && result.data && result.data.code == 200) { |
||||
setDatatable(result.data.data); |
||||
setTotalPage(result.data.totalRecord); |
||||
} else { |
||||
NotificationManager.error('Gagal Mengambil Data!!', 'Failed'); |
||||
} |
||||
} |
||||
|
||||
|
||||
|
||||
const handleAddUser = async () => { |
||||
await setTypeDialogUser("Save") |
||||
setOpenDialogUser(true) |
||||
} |
||||
|
||||
const closeDialogUser = () => { |
||||
setOpenDialogUser(false); |
||||
}; |
||||
|
||||
const handleSave = () => { |
||||
let data = ''; |
||||
|
||||
if (!registrationnumber && registrationnumber === "") { |
||||
alert("Please input Registration Number"); |
||||
return; |
||||
} |
||||
if (!companyName && companyName === "") { |
||||
alert("Please input the name"); |
||||
return; |
||||
} |
||||
|
||||
if (typeDialog === "Save") { |
||||
data = { |
||||
registration_no: registrationnumber, |
||||
company_name: companyName, |
||||
address: addressCompany, |
||||
phone_no: phoneNumber, |
||||
email: emailCompany, |
||||
description: description, |
||||
logo_login: logoLogin, |
||||
logo_header: logoHeader, |
||||
favicon_image: favIcon, |
||||
login_instruction: loginInstruction, |
||||
about: about, |
||||
html_title: htmlTitle, |
||||
app_name: appName, |
||||
base_url: baseUrl, |
||||
is_active: statusCompany, |
||||
template_id: template |
||||
} |
||||
console.log(data) |
||||
|
||||
closeDialog('save', data); |
||||
} else if (typeDialog === "Set") { |
||||
// if (!password && password === "") {
|
||||
// alert("Please fill password");
|
||||
// return;
|
||||
// }
|
||||
// if (password !== retryPassword) {
|
||||
// alert("Password doesn't match");
|
||||
// return;
|
||||
// }
|
||||
// if (password.length < 8) {
|
||||
// alert("Password minimum 8 character");
|
||||
// return;
|
||||
// }
|
||||
// data = {
|
||||
// id,
|
||||
// username,
|
||||
// password,
|
||||
// email,
|
||||
// }
|
||||
|
||||
closeDialog('edit', data); |
||||
} else { |
||||
|
||||
// data = {
|
||||
// id,
|
||||
// name: resourceName,
|
||||
// username,
|
||||
// employee_type: employeeType,
|
||||
// phone_number: phoneNo,
|
||||
// email,
|
||||
// gender,
|
||||
// birth_place: birthPlace,
|
||||
// blood_type: bloodType,
|
||||
// ktp_number: ktpNumber,
|
||||
// biaya_per_jam: biayaPerJam.replace('.', ''),
|
||||
// role_id: roleId,
|
||||
// divisi_id: divisionId,
|
||||
// address,
|
||||
// status_resource: statusResource,
|
||||
// status_boundary: statusRestriction,
|
||||
// company_id: company_id
|
||||
// }
|
||||
|
||||
// if (birthDate && birthDate != "") {
|
||||
// data['birth_date'] = birthDate;
|
||||
// }
|
||||
|
||||
closeDialog('edit', data); |
||||
} |
||||
} |
||||
|
||||
const handleCancel = () => { |
||||
closeDialog('cancel', 'none') |
||||
} |
||||
|
||||
const isValidEmail = (email) => { |
||||
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; |
||||
return emailRegex.test(email); |
||||
}; |
||||
|
||||
const setupSelectRole = () => { |
||||
return ( |
||||
<> |
||||
{roleList.map((val, index) => { |
||||
return ( |
||||
<Option key={index} value={val.id}>{val.name}</Option> |
||||
) |
||||
})} |
||||
</> |
||||
) |
||||
} |
||||
|
||||
|
||||
const renderFromCompany = () => { |
||||
return ( |
||||
<Form> |
||||
<Row> |
||||
<Col md={12}> |
||||
<span style={{ color: "red" }}>*</span>required. |
||||
</Col> |
||||
</Row> |
||||
</Form> |
||||
) |
||||
} |
||||
|
||||
|
||||
|
||||
const RenderTable = useMemo(() => { |
||||
const columns = [ |
||||
{ title: t('nik'), dataIndex: 'ktp_number', key: 'ktp_number' }, |
||||
{ title: t('nameHR'), dataIndex: 'name', key: 'name' }, |
||||
|
||||
{ title: t('employeeType'), dataIndex: 'employee_type', key: 'employee_type' }, |
||||
{ |
||||
title: t('roles'), |
||||
dataIndex: 'join_first_name', |
||||
key: 'join_first_name', |
||||
render: (text, record) => <>{record.join_first_name}</> |
||||
}, |
||||
{ title: 'Phone No.', dataIndex: 'phone_number', key: 'phone_number' }, |
||||
{ title: 'Email', dataIndex: 'email', key: 'email' }, |
||||
{ title: 'Status', dataIndex: 'status_resource', key: 'status_status' } |
||||
// title: t('action'),
|
||||
// dataIndex: '',
|
||||
// key: 'x',
|
||||
// render: (text, record) => <>
|
||||
// <Tooltip title={t('edit')}>
|
||||
// <Button size="small" type="link" style={{ color: 'green' }} onClick={() => handleEdit(text)}><i className="fa fa-edit"></i></Button>
|
||||
// </Tooltip>
|
||||
|
||||
// <Tooltip title={t('delete')}>
|
||||
// <Button size="small" type="link" style={{ color: 'red' }} onClick={() => handleDelete(text.id)}><i className="fa fa-trash"></i></Button>
|
||||
// </Tooltip>
|
||||
// <Tooltip title="Set User">
|
||||
// <Button size="small" type="link" style={{ color: 'primary' }} onClick={() => handleSetWorker(text)}><i className="fa fa-users"></i></Button>
|
||||
// </Tooltip>
|
||||
// </>,
|
||||
// },
|
||||
|
||||
// { title: "Number Registration", dataIndex: 'registration_no', key: 'registration_no' },
|
||||
// { title: "Name", dataIndex: 'company_name', key: 'company_name' },
|
||||
// { title: 'Phone No.', dataIndex: 'phone_no', key: 'phone_no' },
|
||||
// { title: 'Email', dataIndex: 'email', key: 'email' },
|
||||
// { title: 'Status', dataIndex: 'is_active', key: 'is_active', render: (text, record) => <>{text && text !== false ? "Active" : 'Inactive'}</> }
|
||||
]; |
||||
return ( |
||||
<Table |
||||
rowKey="id" |
||||
size="small" |
||||
columns={columns} |
||||
dataSource={dataTable} |
||||
pagination={false} |
||||
/> |
||||
) |
||||
}, [dataTable]) |
||||
|
||||
return ( |
||||
<> |
||||
<DialogFormUser |
||||
openDialog={openDialogUser} |
||||
closeDialog={closeDialogUser} |
||||
typeDialog={typeDialogUser} |
||||
roleList={roleList} |
||||
/> |
||||
<Modal size="xl" fullscreen="xl" scrollable={true} isOpen={openDialog} toggle={toggleDialog}> |
||||
<ModalHeader className="capitalize withBtn" toggle={closeDialog} style={{ width: "100%" }}> |
||||
{typeDialog === "Save" ? `Add` : typeDialog === "Set" ? "Manage Admin" : "Edit"} Company |
||||
{typeDialog === "Set" && ( |
||||
<Tooltip title={t("add")}> |
||||
<Button onClick={handleAddUser} size='sm' color="primary"><i className='fa fa-plus'></i></Button> |
||||
</Tooltip> |
||||
)} |
||||
</ModalHeader> |
||||
<ModalBody> |
||||
|
||||
{typeDialog !== "Set" && renderFromCompany()} |
||||
{typeDialog === "Set" && ( |
||||
<> |
||||
{RenderTable} |
||||
<Pagination |
||||
style={{ marginTop: "25px" }} |
||||
showSizeChanger |
||||
onShowSizeChange={onShowSizeChange} |
||||
onChange={onPagination} |
||||
pageSizeOptions={["10", "25", "50"]} |
||||
total={totalPage} |
||||
pageSize={rowsPerPage} |
||||
current={currentPage} |
||||
/> |
||||
</> |
||||
)} |
||||
|
||||
</ModalBody> |
||||
<ModalFooter> |
||||
{typeDialog !== "Set" && ( |
||||
<Button color="primary" onClick={() => handleSave()}>{typeDialog}</Button> |
||||
)} |
||||
<Button className="capitalize" color="secondary" onClick={() => handleCancel()}>cancel</Button> |
||||
</ModalFooter> |
||||
</Modal> |
||||
</> |
||||
) |
||||
|
||||
} |
||||
export default DialogForm; |
@ -0,0 +1,258 @@
|
||||
import React, { useState, useMemo } from 'react' |
||||
import { |
||||
Modal, ModalHeader, ModalBody, ModalFooter, |
||||
Button, Form, FormGroup, Label, Input, Col, Row, Card, CardBody, Fade |
||||
} from 'reactstrap'; |
||||
import { DatePicker, Table, Tooltip, Select, Input as InputAntd } from 'antd'; |
||||
import moment from 'moment'; |
||||
import 'antd/dist/antd.css'; |
||||
import { useTranslation } from 'react-i18next'; |
||||
const { Option } = Select |
||||
const DialogFormUser = ({ openDialog, closeDialog, toggleDialog, typeDialog, dataEdit, roleList }) => { |
||||
const { t } = useTranslation() |
||||
|
||||
const [resourceName, setResourceName] = useState('') |
||||
const [username, setUsername] = useState('') |
||||
const [password, setPassword] = useState('') |
||||
const [retryPassword, setRetryPassword] = useState('') |
||||
const [employeeType, setEmployeeType] = useState('') |
||||
const [phoneNo, setPhoneNo] = useState('') |
||||
const [email, setEmail] = useState('') |
||||
const [gender, setGender] = useState('') |
||||
const [birthDate, setBirthDate] = useState('') |
||||
const [birthPlace, setBirthPlace] = useState('') |
||||
const [ktpNumber, setKtpNumber] = useState('') |
||||
const [roleId, setRoleId] = useState('') |
||||
const [address, setAddress] = useState('') |
||||
const [statusResource, setStatusResource] = useState('active') |
||||
const [statusRestriction, setStatusRestriction] = useState(false) |
||||
|
||||
|
||||
|
||||
const handleSave = () => { |
||||
let data = ''; |
||||
|
||||
if (typeDialog === "Save") { |
||||
data = { |
||||
// registration_no: registrationnumber,
|
||||
// company_name: companyName,
|
||||
// address: addressCompany,
|
||||
// phone_no: phoneNumber,
|
||||
// email: emailCompany,
|
||||
// description: description,
|
||||
// logo_login: logoLogin,
|
||||
// logo_header: logoHeader,
|
||||
// favicon_image: favIcon,
|
||||
// login_instruction: loginInstruction,
|
||||
// about: about,
|
||||
// html_title: htmlTitle,
|
||||
// app_name: appName,
|
||||
// base_url: baseUrl,
|
||||
// is_active: statusCompany,
|
||||
// template_id: template
|
||||
} |
||||
console.log(data) |
||||
|
||||
closeDialog('save', data); |
||||
} else if (typeDialog === "Set") { |
||||
// if (!password && password === "") {
|
||||
// alert("Please fill password");
|
||||
// return;
|
||||
// }
|
||||
// if (password !== retryPassword) {
|
||||
// alert("Password doesn't match");
|
||||
// return;
|
||||
// }
|
||||
// if (password.length < 8) {
|
||||
// alert("Password minimum 8 character");
|
||||
// return;
|
||||
// }
|
||||
// data = {
|
||||
// id,
|
||||
// username,
|
||||
// password,
|
||||
// email,
|
||||
// }
|
||||
|
||||
closeDialog('edit', data); |
||||
} else { |
||||
|
||||
// data = {
|
||||
// id,
|
||||
// name: resourceName,
|
||||
// username,
|
||||
// employee_type: employeeType,
|
||||
// phone_number: phoneNo,
|
||||
// email,
|
||||
// gender,
|
||||
// birth_place: birthPlace,
|
||||
// blood_type: bloodType,
|
||||
// ktp_number: ktpNumber,
|
||||
// biaya_per_jam: biayaPerJam.replace('.', ''),
|
||||
// role_id: roleId,
|
||||
// divisi_id: divisionId,
|
||||
// address,
|
||||
// status_resource: statusResource,
|
||||
// status_boundary: statusRestriction,
|
||||
// company_id: company_id
|
||||
// }
|
||||
|
||||
// if (birthDate && birthDate != "") {
|
||||
// data['birth_date'] = birthDate;
|
||||
// }
|
||||
|
||||
closeDialog('edit', data); |
||||
} |
||||
} |
||||
|
||||
const handleCancel = () => { |
||||
closeDialog('cancel', 'none') |
||||
} |
||||
|
||||
const isValidEmail = (email) => { |
||||
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; |
||||
return emailRegex.test(email); |
||||
}; |
||||
|
||||
const setupSelectRole = () => { |
||||
return ( |
||||
<> |
||||
{roleList.map((val, index) => { |
||||
return ( |
||||
<Option key={index} value={val.id}>{val.name}</Option> |
||||
) |
||||
})} |
||||
</> |
||||
) |
||||
} |
||||
|
||||
|
||||
const renderFormSetAdmin = () => { |
||||
return ( |
||||
<Form> |
||||
<Row> |
||||
<Col md={12}> |
||||
<span style={{ color: "red" }}>*</span>required. |
||||
</Col> |
||||
</Row> |
||||
<Row> |
||||
<Col md={6}> |
||||
<FormGroup> |
||||
<Label className="capitalize">{t('nik')} <span style={{ color: "red" }}>*</span></Label> |
||||
<Input type="text" value={ktpNumber} onChange={(e) => setKtpNumber(e.target.value.replace(/[^0-9]/g, ''))} placeholder={t('inputNik')} maxLength="16" /> |
||||
</FormGroup> |
||||
</Col> |
||||
<Col md={6}> |
||||
<FormGroup> |
||||
<Label className="capitalize">{t('nameHR')}<span style={{ color: "red" }}>*</span></Label> |
||||
<Input type="text" value={resourceName} onChange={(e) => setResourceName(e.target.value)} placeholder={t('inputName')} /> |
||||
</FormGroup> |
||||
</Col> |
||||
</Row> |
||||
<Row> |
||||
<Col md={6}> |
||||
<FormGroup> |
||||
<Label className="capitalize">{t('employeeType')} <span style={{ color: "red" }}>*</span></Label> |
||||
<Select showSearch value={employeeType} defaultValue={employeeType} onChange={(val) => setEmployeeType(val)} placeholder="Select Employee Type" style={{ width: '100%' }}> |
||||
<Option value={'employee'}>Employee</Option> |
||||
<Option value={'subcon'}>Subcon</Option> |
||||
<Option value={'freelance'}>Freelance</Option> |
||||
</Select> |
||||
</FormGroup> |
||||
|
||||
</Col> |
||||
<Col md={6}> |
||||
<FormGroup> |
||||
<Label className="capitalize">Phone No.</Label> |
||||
<Input type="text" value={phoneNo} onChange={(e) => setPhoneNo(e.target.value.replace(/[^0-9]/g, ''))} placeholder={t('inputNoPhone')} maxLength="15" /> |
||||
</FormGroup> |
||||
</Col> |
||||
</Row> |
||||
<Row> |
||||
<Col md={6}> |
||||
<FormGroup> |
||||
<Label className="capitalize">Email</Label> |
||||
<Input type="email" value={email} onChange={(e) => setEmail(e.target.value)} placeholder={t('inputEmail')} |
||||
onBlur={(e) => { |
||||
if (!isValidEmail(e.target.value)) { |
||||
alert("Masukkan email yang valid."); |
||||
} |
||||
}} |
||||
/> |
||||
</FormGroup> |
||||
</Col> |
||||
<Col md={6}> |
||||
<FormGroup> |
||||
<Label className="capitalize">{t('gender')}</Label> |
||||
<Select showSearch value={gender} defaultValue={gender} onChange={(val) => setGender(val)} placeholder={t('selectGender')} style={{ width: '100%' }}> |
||||
<Option value="Male">Male</Option> |
||||
<Option value="Female">Female</Option> |
||||
{/* <Option value="Other">Other</Option> */} |
||||
</Select> |
||||
</FormGroup> |
||||
</Col> |
||||
</Row> |
||||
<Row> |
||||
<Col md={6}> |
||||
<FormGroup> |
||||
<Label className="capitalize">{t('birthPlace')}</Label> |
||||
<Input type="text" value={birthPlace} onChange={(e) => setBirthPlace(e.target.value)} placeholder={t('inputBrithPlace')} /> |
||||
</FormGroup> |
||||
</Col> |
||||
<Col md={6}> |
||||
<FormGroup> |
||||
<Label className="capitalize">{t('birthDate')}</Label> |
||||
<DatePicker format={"DD-MM-YYYY"} style={{ width: "100%" }} value={birthDate} placeholder={t('inputBrithDate')} onChange={(date, dateString) => setBirthDate(date)} /> |
||||
</FormGroup> |
||||
</Col> |
||||
</Row> |
||||
<Row> |
||||
<Col md={6}> |
||||
<FormGroup> |
||||
<Label className="capitalize">{t('roles')} <span style={{ color: "red" }}>*</span></Label> |
||||
<Select showSearch defaultValue={roleId} onChange={(val) => setRoleId(val)} placeholder={t('selectRole')} style={{ width: '100%' }}> |
||||
{setupSelectRole()} |
||||
</Select> |
||||
</FormGroup> |
||||
</Col> |
||||
</Row> |
||||
|
||||
<Row> |
||||
<Col md={6}> |
||||
<Label className="capitalize">Status</Label> |
||||
<Select style={{ width: "100%" }} defaultValue={statusResource} onChange={(e) => setStatusResource(e)}> |
||||
<Option value={'active'}>Active</Option> |
||||
<Option value={'inactive'}>Inactive</Option> |
||||
</Select> |
||||
</Col> |
||||
<Col md={6}> |
||||
<FormGroup> |
||||
<Label className="capitalize">{t('address')}</Label> |
||||
<Input type="textarea" value={address} onChange={(e) => setAddress(e.target.value)} placeholder={t('inputAddress')} /> |
||||
</FormGroup> |
||||
</Col> |
||||
|
||||
</Row> |
||||
</Form> |
||||
) |
||||
} |
||||
|
||||
return ( |
||||
<> |
||||
<Modal size="xl" fullscreen="xl" scrollable={true} isOpen={openDialog} toggle={toggleDialog}> |
||||
<ModalHeader className="capitalize withBtn" toggle={closeDialog} style={{ width: "100%" }}> |
||||
{typeDialog === "Save" ? `Add` : typeDialog === "Set" ? "Add " : "Edit"} User |
||||
</ModalHeader> |
||||
<ModalBody> |
||||
{renderFormSetAdmin()} |
||||
</ModalBody> |
||||
<ModalFooter> |
||||
<Button color="primary" onClick={() => handleSave()}>{typeDialog}</Button>{''} |
||||
<Button className="capitalize" color="secondary" onClick={() => handleCancel()}>cancel</Button> |
||||
</ModalFooter> |
||||
</Modal> |
||||
</> |
||||
) |
||||
|
||||
} |
||||
export default DialogFormUser; |
Loading…
Reference in new issue