Browse Source

trans

pull/2/head
farhan048 2 years ago
parent
commit
bb279c5769
  1. 2
      package.json
  2. 2
      src/const/ApiConst.js
  3. 75
      src/const/en.json
  4. 24
      src/const/i18n.js
  5. 75
      src/const/id.json
  6. 6
      src/utils/LangUtils.js
  7. 45
      src/views/Master/MasterAbsensi/index.js
  8. 25
      src/views/Master/MasterMenu/DialogForm.js
  9. 28
      src/views/Master/MasterMenu/index.js
  10. 17
      src/views/Master/MasterRoles/DialogForm.js
  11. 10
      src/views/Master/MasterRoles/DialogMenuRoles.js
  12. 29
      src/views/Master/MasterRoles/index.js
  13. 10
      src/views/Master/ProjectPhase/DialogForm.js
  14. 28
      src/views/Master/ProjectPhase/index.js
  15. 17
      src/views/Master/RoleProject/DialogForm.js
  16. 28
      src/views/Master/RoleProject/index.js
  17. 46
      src/views/Report/k3/index.js
  18. 15
      src/views/SimproV2/ChecklistK3/DialogForm.js
  19. 30
      src/views/SimproV2/ChecklistK3/index.js
  20. 21
      src/views/SimproV2/Divisi/DialogForm.js
  21. 26
      src/views/SimproV2/Divisi/index.js
  22. 8
      src/views/SimproV2/Presence/DialogFoto.js
  23. 40
      src/views/SimproV2/Presence/index.js
  24. 13
      src/views/SimproV2/ProjectType/DialogForm.js
  25. 26
      src/views/SimproV2/ProjectType/DialogInitialGantt.js
  26. 31
      src/views/SimproV2/ProjectType/index.js
  27. 13
      src/views/SimproV2/Satuan/DialogForm.js
  28. 30
      src/views/SimproV2/Satuan/index.js

2
package.json

@ -46,6 +46,7 @@
"enzyme-adapter-react-16": "^1.14.0", "enzyme-adapter-react-16": "^1.14.0",
"flag-icon-css": "^3.3.0", "flag-icon-css": "^3.3.0",
"font-awesome": "^4.7.0", "font-awesome": "^4.7.0",
"i18next": "^22.4.9",
"interactjs": "^1.10.11", "interactjs": "^1.10.11",
"jspdf": "^2.5.1", "jspdf": "^2.5.1",
"jspdf-autotable": "^3.5.25", "jspdf-autotable": "^3.5.25",
@ -73,6 +74,7 @@
"react-dom": "^16.14.0", "react-dom": "^16.14.0",
"react-grid-layout": "^1.2.5", "react-grid-layout": "^1.2.5",
"react-highlight-words": "^0.18.0", "react-highlight-words": "^0.18.0",
"react-i18next": "^12.1.5",
"react-leaflet": "^3.2.0", "react-leaflet": "^3.2.0",
"react-leaflet-draw": "^0.19.8", "react-leaflet-draw": "^0.19.8",
"react-loader-spinner": "^3.1.5", "react-loader-spinner": "^3.1.5",

2
src/const/ApiConst.js

@ -113,7 +113,7 @@ export const TOKEN_ADW = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiIxMjAyI
// export let BASE_OSPRO = "https://ospro-api.ospro.id"; // export let BASE_OSPRO = "https://ospro-api.ospro.id";
export let BASE_OSPRO = "https://adw-api.ospro.id"; export let BASE_OSPRO = "https://adw-api.ospro.id";
// export let BASE_OSPRO = "http://localhost:8444"; // export let BASE_OSPRO = "http://localhost:8444/adw-backend";
// export let BASE_OSPRO = "http://192.168.1.123:8444"; // local // export let BASE_OSPRO = "http://192.168.1.123:8444"; // local
// export let BASE_OSPRO = "http://103.73.125.81:8444"; // ip public adw // export let BASE_OSPRO = "http://103.73.125.81:8444"; // ip public adw
export let BASE_SIMPRO_LUMEN = `${BASE_OSPRO}/api`; export let BASE_SIMPRO_LUMEN = `${BASE_OSPRO}/api`;

75
src/const/en.json

@ -0,0 +1,75 @@
{
"3days": "3 Days Ago",
"7days": "7 Days Ago",
"action": "Action",
"add": "Add",
"ChecklistK3Add": "Add Checklist K3",
"cancel": "Cancel",
"close": "Close",
"color": "Color",
"date": "Date",
"dateAbsent": "Absent Date",
"dateReport": "Report Date",
"delete": "Delete",
"deleteMsg": "Delete this data ?",
"deleteConfirm": "Are you sure ?",
"description": "Description",
"division": "Division",
"divisionAdd": "Add Division",
"edit": "Edit",
"export": "Export",
"exportExcel": "Export Excel",
"exportPdf": "Export Pdf",
"gearUse": "Gear Used",
"gearNotUse": "Gear Not used",
"hr": "Human Resource",
"icon": "Icon",
"inputIcon": "Input Code Icon",
"inputName": "Input Name",
"inputDescription": "Input Description",
"inputParentMenu": "Select Parent Menu",
"inputAliasMenu": "Input Menu Alias",
"inputOrder": "Input Order",
"inputUrl": "Input URL",
"image": "Image",
"imageCheck": "Selfie Presence",
"locIn": "Location In",
"locOut": "Location Out",
"menuRoles": "Roles Menu",
"menuAdd": "Add Menu",
"nik": "ID Card",
"name": "Name",
"nameHR": "Name Human Resource",
"nameRole": "Name Role",
"nameDivision": "Name Division",
"nameProjectType": "Project Type",
"nameProjectRole": "Project Role",
"noData": "Data not yet available",
"order": "Order",
"parentMenu": "Parent Menu",
"phase": "Project Phase",
"projectType": "Add Project Type",
"projectPhase": "Add Project Phase",
"presenceIn": "Presence In",
"presenceOut": "Presence Out",
"rolesAdd": "Add Roles",
"roles": "Roles",
"search": "Search",
"save": "Save",
"searchType": "Search Project Type",
"searchPhase": "Search Project Phase",
"searchDivision": "Search Division",
"searchUom": "Search UOM",
"searchChecklistK3": "Search checklist K3",
"searchRoles": "Search Roles",
"searchProjectRoles": "Search Project Roles",
"searchProject": "All / Select Projects",
"searchMenu": "Search Menu",
"searchHR": "Search Human Resource",
"today": "Today",
"uom": "UOM",
"uomAdd": "Add UOM",
"workDuration": "Work Duration",
"workAreaIn": "Work Area In",
"workAreaOut": "Work Area Out"
}

24
src/const/i18n.js

@ -0,0 +1,24 @@
import i18n from "i18next";
import { initReactI18next } from "react-i18next";
import en from "./en.json";
import id from "./id.json";
i18n
.use(initReactI18next)
.init({
debug: true,
fallbackLng: 'id',
interpolation: {
escapeValue: false, // not needed for react as it escapes by default
},
resources: {
en: {
translation: en,
},
id: {
translation: id,
}
},
lng: localStorage.getItem("lng") || "id",
});
export default i18n;

75
src/const/id.json

@ -0,0 +1,75 @@
{
"3days": "3 Hari Yang lalu",
"7days": "7 Hari Yang lalu",
"action": "Aksi",
"add": "Tambah",
"ChecklistK3Add": "Tambah Ceklis K3",
"cancel": "Batal",
"close": "Tutup",
"color": "Warna",
"date": "Tanggal",
"dateAbsent": "Tanggal Absen",
"dateReport": "Tanggal Lapor",
"delete": "Hapus",
"deleteMsg": "Hapus Data Ini ?",
"deleteConfirm": "Apakah Anda Yakin ?",
"description": "Deskripsi",
"division": "Divisi",
"divisionAdd": "Tambah Divisi",
"edit": "Ubah",
"export": "Ekspor",
"exportExcel": "Ekspor Excel",
"exportPdf": "Ekspor Pdf",
"gearUse": "Perlengkapan Dikenakan",
"gearNotUse": "Perlengkapan Tidak Dikenakan",
"hr": "Pegawai",
"icon": "Ikon",
"inputIcon": "Masukan Kode Ikon",
"inputName": "Masukan Nama",
"inputDescription": "Masukan Deskripsi",
"inputParentMenu": "Pilih Induk Menu",
"inputAliasMenu": "Masukan Alias Menu",
"inputOrder": "Masukan Urutan",
"inputUrl": "Masukan URL",
"image": "Gambar",
"imageCheck": "Lihat Selfie Presensi",
"locIn": "Lokasi Masuk",
"locOut": "Lokasi Pulang",
"menuRoles": "Menu Peran",
"menuAdd": "Tambah Menu",
"nik": "NIK",
"nameDivision": "Nama Divisi",
"name": "Nama",
"nameHR": "Nama Pegawai",
"nameRole": "Nama Peran",
"nameProjectType": "Tipe Proyek",
"nameProjectRole": "Peran Proyek",
"noData": "Data Belum tersedia",
"order": "Urutan",
"parentMenu": "Menu Induk",
"phase": "Fase Proyek",
"projectType": "Tambah Tipe Proyek",
"projectPhase": "Tambah Fase Proyek",
"presenceIn": "Waktu Masuk",
"presenceOut": "Waktu Pulang",
"rolesAdd": "Tambah Roles",
"roles": "Peran",
"save": "Simpan",
"search": "Cari",
"searchType": "Cari Tipe Proyek",
"searchPhase": "Cari Fase Proyek",
"searchDivision": "Cari Divisi",
"searchUom": "Cari Satuan",
"searchChecklistK3": "Cari Ceklis K3",
"searchRoles": "Cari Peran",
"searchProjectRoles": "Cari Peran Proyek",
"searchProject": "Semua / Pilih Proyek",
"searchMenu": "Cari Menu",
"searchHR": "Cari Nama Pegawai",
"today": "Hari Ini",
"uom": "Satuan",
"uomAdd": "Tambah Satuan",
"workDuration": "Durasi Kerja",
"workAreaIn": "Area Kerja In",
"workAreaOut": "Area Kerja Out"
}

6
src/utils/LangUtils.js

@ -0,0 +1,6 @@
import i18n from "../const/i18n";
export const handleChangeLng = (lng) => {
i18n.changeLanguage(lng);
localStorage.setItem("lng", lng);
};

45
src/views/Master/MasterAbsensi/index.js

@ -11,6 +11,7 @@ import { DatePicker,Select } from 'antd';
import * as XLSX from 'xlsx'; import * as XLSX from 'xlsx';
import { ABSENSI_SEARCH, ABSENSI_ADD, ABSENSI_DELETE, ABSENSI_EDIT, PROYEK_SEARCH, USERPROYEK_SEARCH } from '../../../const/ApiConst.js'; import { ABSENSI_SEARCH, ABSENSI_ADD, ABSENSI_DELETE, ABSENSI_EDIT, PROYEK_SEARCH, USERPROYEK_SEARCH } from '../../../const/ApiConst.js';
import MapConfig from '../../MapConfig/MapConfig'; import MapConfig from '../../MapConfig/MapConfig';
import { withTranslation } from 'react-i18next';
const { RangePicker } = DatePicker; const { RangePicker } = DatePicker;
const { Option } = Select const { Option } = Select
const token = window.localStorage.getItem('token'); const token = window.localStorage.getItem('token');
@ -24,17 +25,9 @@ const config = {
const BASE_URL = ""; const BASE_URL = "";
const column = [
{ name: "Nama Human Resource" },
{ name: "Deskripsi"},
{ name: "Tanggal Absensi"},
]
const LENGTH_DATA = 10 const LENGTH_DATA = 10
export default class index extends Component { class index extends Component {
constructor(props) { constructor(props) {
super(props) super(props)
this.state = { this.state = {
@ -438,6 +431,7 @@ export default class index extends Component {
} }
renderTable = () => { renderTable = () => {
const t = this.props;
const dataTable2 = this.state.dataTable || []; const dataTable2 = this.state.dataTable || [];
return ( return (
<tbody> <tbody>
@ -461,7 +455,7 @@ export default class index extends Component {
</tr> </tr>
) )
}) : <tr> }) : <tr>
<td colSpan="4" align="center">No Data Available</td> <td colSpan="4" align="center">{this.props.t('noData')}</td>
</tr> </tr>
} }
</tbody> </tbody>
@ -472,21 +466,18 @@ export default class index extends Component {
const val = e.target.value; const val = e.target.value;
this.setState({ currentDay: val }); this.setState({ currentDay: val });
if (val === "today") { if (val === "today") {
console.log("test 1 test",val);
this.setState({ this.setState({
startDate: moment(moment().format("YYYY-M-D")), startDate: moment(moment().format("YYYY-M-D")),
endDate: moment(moment().format("YYYY-M-D")), endDate: moment(moment().format("YYYY-M-D")),
currentPage: 1 currentPage: 1
}) })
} else if (val === "3 day") { } else if (val === "3 day") {
console.log("test test",val);
this.setState({ this.setState({
startDate: moment(moment().subtract(3, "days").format("YYYY-M-D")), startDate: moment(moment().subtract(3, "days").format("YYYY-M-D")),
endDate: moment(moment().format("YYYY-M-D")), endDate: moment(moment().format("YYYY-M-D")),
currentPage: 1 currentPage: 1
}) })
} else if (val === "7 day") { } else if (val === "7 day") {
console.log("test test",val);
this.setState({ this.setState({
startDate: moment(moment().subtract(7, "days").format("YYYY-M-D")), startDate: moment(moment().subtract(7, "days").format("YYYY-M-D")),
endDate: moment(moment().format("YYYY-M-D")), endDate: moment(moment().format("YYYY-M-D")),
@ -503,6 +494,12 @@ export default class index extends Component {
} }
render() { render() {
const t = this.props;
const column = [
{ name: this.props.t('nameHR') },
{ name: this.props.t('description') },
{ name: this.props.t('dateAbsent') },
]
const { tooltipTambah, tooltipExport, dataTable, openDialog, currentPage, rowsPerPage, totalPage, search, tooltipEdit, tooltipDelete } = this.state const { tooltipTambah, tooltipExport, dataTable, openDialog, currentPage, rowsPerPage, totalPage, search, tooltipEdit, tooltipDelete } = this.state
return ( return (
<div> <div>
@ -513,12 +510,12 @@ export default class index extends Component {
showCancel showCancel
confirmBtnText="Delete" confirmBtnText="Delete"
confirmBtnBsStyle="danger" confirmBtnBsStyle="danger"
title="Are you sure?" title={this.props.t('deleteConfirm')}
onConfirm={this.onConfirmDelete} onConfirm={this.onConfirmDelete}
onCancel={() => this.setState({ alertDelete: false, idDelete: 0 })} onCancel={() => this.setState({ alertDelete: false, idDelete: 0 })}
focusCancelBtn focusCancelBtn
> >
Data Absensi karyawan akan terhapus!! {this.props.t('deleteMsg')}
</SweetAlert> </SweetAlert>
<DialogForm <DialogForm
openDialog={openDialog} openDialog={openDialog}
@ -533,14 +530,9 @@ export default class index extends Component {
<CardHeader style={{ display: "flex", justifyContent: "space-between" }}> <CardHeader style={{ display: "flex", justifyContent: "space-between" }}>
<h4>{this.props.params.name}</h4> <h4>{this.props.params.name}</h4>
<div> <div>
{/* <Button id="TooltipTambah" color="success" onClick={() => this.handleOpenDialog('Save')}><i className="fa fa-plus"></i></Button> */} <Tooltip title={this.props.t('exportExcel')}>
<Tooltip title="Export Excel">
<Button style={{ marginLeft: "5px" }} id="TooltipExport" color="primary" onClick={() => this.handleExportExcel()}><i className="fa fa-print"></i></Button> <Button style={{ marginLeft: "5px" }} id="TooltipExport" color="primary" onClick={() => this.handleExportExcel()}><i className="fa fa-print"></i></Button>
</Tooltip> </Tooltip>
{/* <Button color="primary" onClick={() => this.handleOpenDialog('Save')}>Tambah Divisi Karyawan</Button> */}
{/* <Tooltip placement="right" isOpen={tooltipTambah} target="TooltipTambah" toggle={() => this.toggle("tambah")}>
Tambah Absensi
</Tooltip> */}
</div> </div>
</CardHeader> </CardHeader>
<CardBody> <CardBody>
@ -548,17 +540,17 @@ export default class index extends Component {
<div style={{ width: "100%", display: "flex", alignItems: "center" }}> <div style={{ width: "100%", display: "flex", alignItems: "center" }}>
<div style={{ width: "100%", marginRight: "10px", maxWidth: "200px" }}> <div style={{ width: "100%", marginRight: "10px", maxWidth: "200px" }}>
<Input type="select" onChange={(e) => this.handleChangeDay(e)} defaultValue={this.state.currentDay}> <Input type="select" onChange={(e) => this.handleChangeDay(e)} defaultValue={this.state.currentDay}>
<option value="today">Hari Ini</option> <option value="today">{this.props.t('today')}</option>
<option value="3 day">3 Hari yang lalu</option> <option value="3 day">{this.props.t('3days')}</option>
<option value="7 day">7 Hari yang lalu</option> <option value="7 day">{this.props.t('7days')}</option>
</Input> </Input>
</div> </div>
<div style={{ width: "50%", marginTop: "3px" }}> <div style={{ width: "50%", marginTop: "3px" }}>
<RangePicker size="default" allowClear={false} value={[this.state.startDate, this.state.endDate]} onChange={this.handleDatePicker} />{' '} <RangePicker size="default" allowClear={false} value={[this.state.startDate, this.state.endDate]} onChange={this.handleDatePicker} />{' '}
<Button color="primary" onClick={() => this.getDataAbsensi()}>Cari</Button> <Button color="primary" onClick={() => this.getDataAbsensi()}>{this.props.t('search')}</Button>
</div> </div>
</div> </div>
<Input onChange={this.handleSearch} value={search} type="text" name="search" id="search" placeholder="Cari nama human resource" style={{ maxWidth: "200px", marginBottom: "20px" }} /> <Input onChange={this.handleSearch} value={search} type="text" name="search" id="search" placeholder={this.props.t('searchHR')} style={{ maxWidth: "200px", marginBottom: "20px" }} />
</div> </div>
<Table responsive striped hover> <Table responsive striped hover>
<thead> <thead>
@ -588,3 +580,4 @@ export default class index extends Component {
) )
} }
} }
export default withTranslation()(index);

25
src/views/Master/MasterMenu/DialogForm.js

@ -4,6 +4,7 @@ import { Button, Form, FormGroup, Label, Input, Col, Row } from 'reactstrap';
import { Select } from 'antd'; import { Select } from 'antd';
import moment from 'moment'; import moment from 'moment';
import 'antd/dist/antd.css'; import 'antd/dist/antd.css';
import { useTranslation } from 'react-i18next';
const { Option } = Select const { Option } = Select
@ -15,7 +16,7 @@ const DialogForm = ({openDialog, closeDialog, toggleDialog, typeDialog, dataEdit
const [icon, setIcon] = useState('') const [icon, setIcon] = useState('')
const [sequence, setSequence] = useState(0) const [sequence, setSequence] = useState(0)
const [parentId, setParentId] = useState(null) const [parentId, setParentId] = useState(null)
const { t } = useTranslation()
useEffect(() => { useEffect(() => {
if (typeDialog === "Edit") { if (typeDialog === "Edit") {
@ -112,32 +113,32 @@ const DialogForm = ({openDialog, closeDialog, toggleDialog, typeDialog, dataEdit
<Row> <Row>
<Col> <Col>
<FormGroup> <FormGroup>
<Label className="capitalize">Nama Menu</Label> <Label className="capitalize">{t('name')} Menu</Label>
<Input type="text" value={name} onChange={(e)=> setName(e.target.value)} placeholder={`Menu..`}/> <Input type="text" value={name} onChange={(e) => setName(e.target.value)} placeholder={t('inputName')} />
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<Label className="capitalize">URL</Label> <Label className="capitalize">URL</Label>
<Input type="text" value={url} onChange={(e)=> setUrl(e.target.value)} placeholder={`Url..`} /> <Input type="text" value={url} onChange={(e) => setUrl(e.target.value)} placeholder={t('inputUrl')} />
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<Label className="capitalize">Icon</Label> <Label className="capitalize">{t('icon')} </Label>
<Input type="text" value={icon} onChange={(e)=> setIcon(e.target.value)} placeholder={`Ikon..`} /> <Input type="text" value={icon} onChange={(e) => setIcon(e.target.value)} placeholder={t('inputIcon')} />
</FormGroup> </FormGroup>
</Col> </Col>
<Col> <Col>
<FormGroup> <FormGroup>
<Label className="capitalize">Urutan</Label> <Label className="capitalize">{t('order')}</Label>
<Input type="number" value={sequence} onChange={(e)=> setSequence(e.target.value)} placeholder={`urutan..`} /> <Input type="number" value={sequence} onChange={(e) => setSequence(e.target.value)} placeholder={t('inputOrder')} />
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<Label className="capitalize">Parent</Label> <Label className="capitalize">{t('parentMenu')}</Label>
<Select showSearch defaultValue={parentId} onChange={onChangeParent} placeholder="Select Parent" style={{width:'100%'}}> <Select showSearch defaultValue={parentId} onChange={onChangeParent} placeholder={t('inputParentMenu')} style={{ width: '100%' }}>
{setupSelectParent()} {setupSelectParent()}
</Select> </Select>
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<Label className="capitalize">Alias Menu</Label> <Label className="capitalize">Alias Menu</Label>
<Input type="text" value={aliasName} onChange={(e)=> setAliasName(e.target.value)} placeholder={`Alias..`} /> <Input type="text" value={aliasName} onChange={(e) => setAliasName(e.target.value)} placeholder={t('inputAliasMenu')} />
</FormGroup> </FormGroup>
</Col> </Col>
</Row> </Row>
@ -155,7 +156,7 @@ const DialogForm = ({openDialog, closeDialog, toggleDialog, typeDialog, dataEdit
</ModalBody> </ModalBody>
<ModalFooter> <ModalFooter>
<Button color="primary" onClick={() => handleSave()}>{typeDialog}</Button>{' '} <Button color="primary" onClick={() => handleSave()}>{typeDialog}</Button>{' '}
<Button className="capitalize" color="secondary" onClick={() => handleCancel()}>Batal</Button> <Button className="capitalize" color="secondary" onClick={() => handleCancel()}>{t('cancel')}</Button>
</ModalFooter> </ModalFooter>
</Modal> </Modal>
) )

28
src/views/Master/MasterMenu/index.js

@ -8,7 +8,7 @@ import { Card, CardBody, CardHeader, Col, Row, Input } from 'reactstrap';
import { MENU_ADD, MENU_SEARCH, MENU_EDIT, MENU_DELETE } from '../../../const/ApiConst.js'; import { MENU_ADD, MENU_SEARCH, MENU_EDIT, MENU_DELETE } from '../../../const/ApiConst.js';
import { NotificationContainer, NotificationManager } from 'react-notifications'; import { NotificationContainer, NotificationManager } from 'react-notifications';
import { Pagination, Tooltip, Table } from 'antd'; import { Pagination, Tooltip, Table } from 'antd';
import { useTranslation } from 'react-i18next';
const token = window.localStorage.getItem('token'); const token = window.localStorage.getItem('token');
const column = [ const column = [
@ -38,7 +38,7 @@ const Index = ({params}) => {
const [tooltipTambah, setTooltipTambah] = useState(false) const [tooltipTambah, setTooltipTambah] = useState(false)
const [totalPage, setTotalPage] = useState(0) const [totalPage, setTotalPage] = useState(0)
const [typeDialog, setTypeDialog] = useState('Save') const [typeDialog, setTypeDialog] = useState('Save')
const { t } = useTranslation()
const pageName = params.name; const pageName = params.name;
const config = { const config = {
@ -284,24 +284,24 @@ const Index = ({params}) => {
const renderTable = useMemo(() => { const renderTable = useMemo(() => {
const columns = [ const columns = [
{ {
title: 'Action', title: t('action'),
dataIndex: '', dataIndex: '',
key: 'x', key: 'x',
render: (text, record) => <> render: (text, record) => <>
<Tooltip title="Delete"> <Tooltip title={t('delete')}>
<i id="TooltipDelete" className="fa fa-trash" style={{ color: 'red', marginRight: '10px', cursor: "pointer" }} onClick={() => handleDelete(text.id)}></i> <i id="TooltipDelete" className="fa fa-trash" style={{ color: 'red', marginRight: '10px', cursor: "pointer" }} onClick={() => handleDelete(text.id)}></i>
</Tooltip> </Tooltip>
<Tooltip title="Edit"> <Tooltip title={t('edit')}>
<i id="TooltipEdit" className="fa fa-edit" style={{ color: 'green', cursor: "pointer" }} onClick={() => handleEdit(text)}></i> <i id="TooltipEdit" className="fa fa-edit" style={{ color: 'green', cursor: "pointer" }} onClick={() => handleEdit(text)}></i>
</Tooltip> </Tooltip>
</>, </>,
}, },
{ title: 'Nama Menu', dataIndex: 'name', key: 'name' }, { title: t('name'), dataIndex: 'name', key: 'name' },
{ title: 'Url', dataIndex: 'url', key: 'url' }, { title: 'Url', dataIndex: 'url', key: 'url' },
{ title: 'Ikon', dataIndex: 'icon', key: 'icon' }, { title: t('icon'), dataIndex: 'icon', key: 'icon' },
{ title: 'Alias', dataIndex: 'alias_name', key: 'alias_name' }, { title: 'Alias', dataIndex: 'alias_name', key: 'alias_name' },
{ title: 'Urutan', dataIndex: 'sequence', key: 'sequence' }, { title: t('order'), dataIndex: 'sequence', key: 'sequence' },
{ title: 'Parent Menu', dataIndex: 'join_first_name', key: 'join_first_name', render: (text, record) => (text ? text : "-") } { title: t('parentMenu'), dataIndex: 'join_first_name', key: 'join_first_name', render: (text, record) => (text ? text : "-") }
]; ];
return ( return (
<Table <Table
@ -323,12 +323,12 @@ const Index = ({params}) => {
showCancel showCancel
confirmBtnText="Delete" confirmBtnText="Delete"
confirmBtnBsStyle="danger" confirmBtnBsStyle="danger"
title={`Apakah anda yakin?`} title={t('deleteConfirm')}
onConfirm={onConfirmDelete} onConfirm={onConfirmDelete}
onCancel={() => cancelDelete()} onCancel={() => cancelDelete()}
focusCancelBtn focusCancelBtn
> >
Data akan terhapus {t('deleteMsg')}
</SweetAlert> </SweetAlert>
<DialogForm <DialogForm
openDialog={openDialog} openDialog={openDialog}
@ -344,13 +344,13 @@ const Index = ({params}) => {
<h4 className="capitalize">{pageName}</h4> <h4 className="capitalize">{pageName}</h4>
<Row> <Row>
<Col> <Col>
<Input onChange={handleSearch} value={search} type="text" name="search" id="search" placeholder={`Cari nama`} /> <Input onChange={handleSearch} value={search} type="text" name="search" id="search" placeholder={t('searchMenu')} />
</Col> </Col>
<Col> <Col>
<Tooltip title="Tambah Menu"> <Tooltip title={t('menuAdd')}>
<Button id="TooltipTambah" color="success" onClick={() => handleOpenDialog('Save')}><i className="fa fa-plus"></i></Button> <Button id="TooltipTambah" color="success" onClick={() => handleOpenDialog('Save')}><i className="fa fa-plus"></i></Button>
</Tooltip> </Tooltip>
<Tooltip title="Export Excel"> <Tooltip title={t('exportExcel')}>
<Button style={{ marginLeft: "5px" }} id="TooltipExport" color="primary" onClick={() => handleExportExcel()}><i className="fa fa-print"></i></Button> <Button style={{ marginLeft: "5px" }} id="TooltipExport" color="primary" onClick={() => handleExportExcel()}><i className="fa fa-print"></i></Button>
</Tooltip> </Tooltip>
</Col> </Col>

17
src/views/Master/MasterRoles/DialogForm.js

@ -2,8 +2,9 @@ import React, { Component } from 'react'
import { Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap'; import { Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap';
import { Button, Form, FormGroup, Label, Input } from 'reactstrap'; import { Button, Form, FormGroup, Label, Input } from 'reactstrap';
import 'antd/dist/antd.css'; import 'antd/dist/antd.css';
import { withTranslation } from 'react-i18next';
export default class DialogForm extends Component { class DialogForm extends Component {
constructor(props) { constructor(props) {
super(props) super(props)
this.state = { this.state = {
@ -78,15 +79,16 @@ export default class DialogForm extends Component {
} }
renderForm = () => { renderForm = () => {
const { t } = this.props;
return ( return (
<Form> <Form>
<FormGroup> <FormGroup>
<Label>Nama</Label> <Label>{this.props.t('nameRole')}</Label>
<Input type="text" value={this.state.name} onChange={(e)=>this.setState({ name:e.target.value })} placeholder="name roles.." /> <Input type="text" value={this.state.name} onChange={(e) => this.setState({ name: e.target.value })} placeholder={this.props.t('inputName')} />
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<Label>Deskripsi</Label> <Label>{this.props.t('description')}</Label>
<Input type="text" value={this.state.description} onChange={(e)=>this.setState({ description:e.target.value })} placeholder="deskripsi.." /> <Input type="text" value={this.state.description} onChange={(e) => this.setState({ description: e.target.value })} placeholder={this.props.t('inputDescription')} />
</FormGroup> </FormGroup>
</Form> </Form>
) )
@ -95,15 +97,16 @@ export default class DialogForm extends Component {
render() { render() {
return ( return (
<Modal isOpen={this.props.openDialog} toggle={this.props.toggleDialog}> <Modal isOpen={this.props.openDialog} toggle={this.props.toggleDialog}>
<ModalHeader toggle={this.props.closeDialog}>{this.props.typeDialog=="Save" ? "Tambah" : "Edit"} Roles</ModalHeader> <ModalHeader toggle={this.props.closeDialog}>{this.props.typeDialog == "Save" ? "Tambah" : "Edit"} {this.props.t('roles')}</ModalHeader>
<ModalBody> <ModalBody>
{this.renderForm()} {this.renderForm()}
</ModalBody> </ModalBody>
<ModalFooter> <ModalFooter>
<Button color="primary" onClick={() => this.handleSave()}>{this.props.typeDialog}</Button>{' '} <Button color="primary" onClick={() => this.handleSave()}>{this.props.typeDialog}</Button>{' '}
<Button color="secondary" onClick={() => this.handleCancel()}>Cancel</Button> <Button color="secondary" onClick={() => this.handleCancel()}>{this.props.t('cancel')}</Button>
</ModalFooter> </ModalFooter>
</Modal> </Modal>
) )
} }
} }
export default withTranslation()(DialogForm);

10
src/views/Master/MasterRoles/DialogMenuRoles.js

@ -4,6 +4,7 @@ import { Button, Form, FormGroup, Label, Input } from 'reactstrap';
import 'antd/dist/antd.css'; import 'antd/dist/antd.css';
import axios from 'axios'; import axios from 'axios';
import { MENU_SEARCH } from '../../../const/ApiConst.js'; import { MENU_SEARCH } from '../../../const/ApiConst.js';
import { withTranslation, WithTranslation } from 'react-i18next';
const BASE_URL = "http://siopas.co.id/custom-php/api/geohr/"; const BASE_URL = "http://siopas.co.id/custom-php/api/geohr/";
const token = window.localStorage.getItem('token'); const token = window.localStorage.getItem('token');
@ -17,7 +18,7 @@ const config = {
} }
}; };
export default class DialogMenuRoles extends Component { class DialogMenuRoles extends Component {
constructor(props) { constructor(props) {
super(props) super(props)
this.state = { this.state = {
@ -200,7 +201,7 @@ export default class DialogMenuRoles extends Component {
render() { render() {
return ( return (
<Modal scrollable={true} isOpen={this.props.openDialog} toggle={this.props.toggleDialog}> <Modal scrollable={true} isOpen={this.props.openDialog} toggle={this.props.toggleDialog}>
<ModalHeader toggle={this.props.closeDialog}>Roles Menu</ModalHeader> <ModalHeader toggle={this.props.closeDialog}>{this.props.t('menuRoles')}</ModalHeader>
<ModalBody> <ModalBody>
<Form> <Form>
<Table> <Table>
@ -223,10 +224,11 @@ export default class DialogMenuRoles extends Component {
</Form> </Form>
</ModalBody> </ModalBody>
<ModalFooter> <ModalFooter>
<Button color="primary" onClick={() => this.handleSave()}>Save</Button>{' '} <Button color="primary" onClick={() => this.handleSave()}>{this.props.t('save')}</Button>{' '}
<Button color="secondary" onClick={() => this.handleCancel()}>Cancel</Button> <Button color="secondary" onClick={() => this.handleCancel()}>{this.props.t('cancel')}</Button>
</ModalFooter> </ModalFooter>
</Modal> </Modal>
) )
} }
} }
export default withTranslation()(DialogMenuRoles);

29
src/views/Master/MasterRoles/index.js

@ -9,6 +9,7 @@ import { Card, CardBody, CardHeader, Col, Row, Input } from 'reactstrap';
import { NotificationContainer, NotificationManager } from 'react-notifications'; import { NotificationContainer, NotificationManager } from 'react-notifications';
import { Pagination, Tooltip, Table } from 'antd'; import { Pagination, Tooltip, Table } from 'antd';
import { ROLE_ADD, ROLE_SEARCH, ROLE_EDIT, ROLE_DELETE, ROLEMENU_ADD, ROLEMENU_SEARCH, ROLEMENU_DELETE_ROLE } from '../../../const/ApiConst.js'; import { ROLE_ADD, ROLE_SEARCH, ROLE_EDIT, ROLE_DELETE, ROLEMENU_ADD, ROLEMENU_SEARCH, ROLEMENU_DELETE_ROLE } from '../../../const/ApiConst.js';
import { withTranslation } from 'react-i18next';
const token = window.localStorage.getItem('token'); const token = window.localStorage.getItem('token');
@ -26,7 +27,7 @@ const momentFormat = 'HH:mm';
const LENGTH_DATA = 10 const LENGTH_DATA = 10
export default class index extends Component { class index extends Component {
constructor(props) { constructor(props) {
super(props) super(props)
this.state = { this.state = {
@ -58,26 +59,26 @@ export default class index extends Component {
this.columns = [ this.columns = [
{ {
title: 'Action', title: this.props.t('action'),
dataIndex: '', dataIndex: '',
key: 'x', key: 'x',
className: 'nowrap', className: 'nowrap',
render: (text, record) => <> render: (text, record) => <>
<Tooltip title="Roles Menu"> <Tooltip title={this.props.t('menuRoles')}>
<i className="cil-menu" style={{ color: 'green', marginRight: 10, cursor: "pointer" }} onClick={() => this.handleMenuRoles(text.id)}></i> <i className="cil-menu" style={{ color: 'green', marginRight: 10, cursor: "pointer" }} onClick={() => this.handleMenuRoles(text.id)}></i>
</Tooltip> </Tooltip>
<Tooltip title="Hapus"> <Tooltip title={this.props.t('delete')}>
<i className="fa fa-trash" style={{ color: 'red', marginRight: 10, cursor: "pointer" }} onClick={() => this.handleDelete(text.id)}></i> <i className="fa fa-trash" style={{ color: 'red', marginRight: 10, cursor: "pointer" }} onClick={() => this.handleDelete(text.id)}></i>
</Tooltip> </Tooltip>
<Tooltip title="Edit"> <Tooltip title={this.props.t('edit')}>
<i className="fa fa-edit" style={{ color: 'green', cursor: "pointer" }} onClick={() => this.handleEdit(text)}></i> <i className="fa fa-edit" style={{ color: 'green', cursor: "pointer" }} onClick={() => this.handleEdit(text)}></i>
</Tooltip> </Tooltip>
</>, </>,
}, },
{ title: 'Nama Role', dataIndex: 'name', key: 'name', className: "nowrap" }, { title: this.props.t('nameRole'), dataIndex: 'name', key: 'name', className: "nowrap" },
{ title: 'Description', dataIndex: 'description', key: 'description' }, { title: this.props.t('description'), dataIndex: 'description', key: 'description' },
] ]
} }
@ -249,7 +250,7 @@ export default class index extends Component {
if (this.state.dataTable.length === 0) { if (this.state.dataTable.length === 0) {
return ( return (
<tr> <tr>
<td align="center" colSpan="3">Not Data Available</td> <td align="center" colSpan="3">{this.props.t('noData')}</td>
</tr> </tr>
) )
} }
@ -361,6 +362,7 @@ export default class index extends Component {
} }
render() { render() {
const { t } = this.props;
const { tooltipTambah, tooltipExport, dialogMenuForm, dataTable, openDialog, currentPage, rowsPerPage, totalPage, search, tooltipEdit, tooltipDelete, tooltipMenu } = this.state const { tooltipTambah, tooltipExport, dialogMenuForm, dataTable, openDialog, currentPage, rowsPerPage, totalPage, search, tooltipEdit, tooltipDelete, tooltipMenu } = this.state
let noSeq = 0; let noSeq = 0;
return ( return (
@ -372,12 +374,12 @@ export default class index extends Component {
showCancel showCancel
confirmBtnText="Delete" confirmBtnText="Delete"
confirmBtnBsStyle="danger" confirmBtnBsStyle="danger"
title="Are you sure?" title={this.props.t('deleteConfirm')}
onConfirm={this.onConfirmDelete} onConfirm={this.onConfirmDelete}
onCancel={() => this.setState({ alertDelete: false, idDelete: 0 })} onCancel={() => this.setState({ alertDelete: false, idDelete: 0 })}
focusCancelBtn focusCancelBtn
> >
Data tipe roles akan terhapus!! {this.props.t('deleteMsg')}
</SweetAlert> </SweetAlert>
<SweetAlert <SweetAlert
show={this.state.alertNotDelete} show={this.state.alertNotDelete}
@ -410,13 +412,13 @@ export default class index extends Component {
<h4>{this.props.params.name}</h4> <h4>{this.props.params.name}</h4>
<Row> <Row>
<Col> <Col>
<Input onChange={this.handleSearch} value={search} type="text" name="search" id="search" placeholder="Cari Nama Roles" /> <Input onChange={this.handleSearch} value={search} type="text" name="search" id="search" placeholder={this.props.t('searchRoles')} />
</Col> </Col>
<Col> <Col>
<Tooltip title="Tambah Roles"> <Tooltip title={this.props.t('rolesAdd')}>
<Button id="TooltipTambah" color="success" onClick={() => this.handleOpenDialog('Save')}><i className="fa fa-plus"></i></Button> <Button id="TooltipTambah" color="success" onClick={() => this.handleOpenDialog('Save')}><i className="fa fa-plus"></i></Button>
</Tooltip> </Tooltip>
<Tooltip title="Export Excel"> <Tooltip title={this.props.t('exportExcel')}>
<Button style={{ marginLeft: "5px" }} id="TooltipExport" color="primary" onClick={() => this.handleExportExcel()}><i className="fa fa-print"></i></Button> <Button style={{ marginLeft: "5px" }} id="TooltipExport" color="primary" onClick={() => this.handleExportExcel()}><i className="fa fa-print"></i></Button>
</Tooltip> </Tooltip>
</Col> </Col>
@ -447,3 +449,4 @@ export default class index extends Component {
) )
} }
} }
export default withTranslation()(index);

10
src/views/Master/ProjectPhase/DialogForm.js

@ -7,12 +7,12 @@ import 'antd/dist/antd.css';
import InputColor from "./InputColor"; import InputColor from "./InputColor";
import "./styles.css"; import "./styles.css";
import "rc-color-picker/assets/index.css"; import "rc-color-picker/assets/index.css";
import { useTranslation } from 'react-i18next';
const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, dataEdit }) => { const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, dataEdit }) => {
const [id, setId] = useState(0) const [id, setId] = useState(0)
const [projectType, setProjectType] = useState('') const [projectType, setProjectType] = useState('')
const [color, setColor] = useState('') const [color, setColor] = useState('')
const { t } = useTranslation();
useEffect(() => { useEffect(() => {
if (typeDialog === "Edit") { if (typeDialog === "Edit") {
console.log("cel data Edit", dataEdit) console.log("cel data Edit", dataEdit)
@ -56,13 +56,13 @@ const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, dataEdi
<Row> <Row>
<Col md={6}> <Col md={6}>
<FormGroup> <FormGroup>
<Label className="capitalize">Phase</Label> <Label className="capitalize">{t('phase')}</Label>
<Input type="text" value={projectType} onChange={(e) => setProjectType(e.target.value)} /> <Input type="text" value={projectType} onChange={(e) => setProjectType(e.target.value)} />
</FormGroup> </FormGroup>
</Col> </Col>
<Col md={6}> <Col md={6}>
<FormGroup> <FormGroup>
<Label className="capitalize">Warna</Label> <Label className="capitalize">{t('color')}</Label>
<InputColor value={color} color={color} onChange={(e) => setColor(e.color)} /> <InputColor value={color} color={color} onChange={(e) => setColor(e.color)} />
</FormGroup> </FormGroup>
</Col> </Col>
@ -80,7 +80,7 @@ const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, dataEdi
</ModalBody> </ModalBody>
<ModalFooter> <ModalFooter>
<Button color="primary" onClick={() => handleSave()}>{typeDialog}</Button>{' '} <Button color="primary" onClick={() => handleSave()}>{typeDialog}</Button>{' '}
<Button className="capitalize" color="secondary" onClick={() => handleCancel()}>Batal</Button> <Button className="capitalize" color="secondary" onClick={() => handleCancel()}>{t('cancel')}</Button>
</ModalFooter> </ModalFooter>
</Modal> </Modal>
</> </>

28
src/views/Master/ProjectPhase/index.js

@ -8,7 +8,7 @@ import { Card, CardBody, CardHeader, Col, Row, Input } from 'reactstrap';
import { NotificationContainer, NotificationManager } from 'react-notifications'; import { NotificationContainer, NotificationManager } from 'react-notifications';
import { PROJECT_PHASE_ADD, PROJECT_PHASE_EDIT, PROJECT_PHASE_DELETE, PROJECT_PHASE_SEARCH, PROJECT_PHASE_LIST, BASE_OSPRO } from '../../../const/ApiConst'; import { PROJECT_PHASE_ADD, PROJECT_PHASE_EDIT, PROJECT_PHASE_DELETE, PROJECT_PHASE_SEARCH, PROJECT_PHASE_LIST, BASE_OSPRO } from '../../../const/ApiConst';
import { Pagination, Button, Tooltip, Table } from 'antd'; import { Pagination, Button, Tooltip, Table } from 'antd';
import { useTranslation } from 'react-i18next';
const token = window.localStorage.getItem('token'); const token = window.localStorage.getItem('token');
const config = { const config = {
headers: headers:
@ -50,7 +50,7 @@ const ProjectPhase = ({ params }) => {
const [search, setSearch] = useState('') const [search, setSearch] = useState('')
const [totalPage, setTotalPage] = useState(0) const [totalPage, setTotalPage] = useState(0)
const [typeDialog, setTypeDialog] = useState('Save') const [typeDialog, setTypeDialog] = useState('Save')
const { t } = useTranslation()
useEffect(() => { useEffect(() => {
getDataProjectPhase() getDataProjectPhase()
}, [currentPage, rowsPerPage, search]) }, [currentPage, rowsPerPage, search])
@ -279,7 +279,7 @@ const ProjectPhase = ({ params }) => {
if (dataTable.length === 0) { if (dataTable.length === 0) {
return ( return (
<tr> <tr>
<td align="center" colSpan="3">Tidak ada data project phase</td> <td align="center" colSpan="3">{t('noData')}</td>
</tr> </tr>
) )
} }
@ -288,22 +288,22 @@ const ProjectPhase = ({ params }) => {
const renderTable = useMemo(() => { const renderTable = useMemo(() => {
const columns = [ const columns = [
{ {
title: 'Action', title: t('action'),
dataIndex: '', dataIndex: '',
key: 'x', key: 'x',
className: 'nowrap', className: 'nowrap',
render: (text, record) => <> render: (text, record) => <>
<Tooltip title="Delete"> <Tooltip title={t('delete')}>
<i className="fa fa-trash" style={{ color: 'red', marginRight: '10px', cursor: "pointer" }} onClick={() => handleDelete(text.id)}></i> <i className="fa fa-trash" style={{ color: 'red', marginRight: '10px', cursor: "pointer" }} onClick={() => handleDelete(text.id)}></i>
</Tooltip> </Tooltip>
<Tooltip title="Edit"> <Tooltip title={t('Edit')}>
<i className="fa fa-edit" style={{ color: 'green', cursor: "pointer" }} onClick={() => handleEdit(text)}></i> <i className="fa fa-edit" style={{ color: 'green', cursor: "pointer" }} onClick={() => handleEdit(text)}></i>
</Tooltip>{" "} </Tooltip>{" "}
</>, </>,
}, },
{ title: 'Fase', dataIndex: 'name', key: 'name', className: "nowrap" }, { title: t('phase'), dataIndex: 'name', key: 'name', className: "nowrap" },
{ {
title: 'Warna', title: t('color'),
dataIndex: 'color', dataIndex: 'color',
key: 'color', key: 'color',
render: (text) => <> render: (text) => <>
@ -333,12 +333,12 @@ const ProjectPhase = ({ params }) => {
showCancel showCancel
confirmBtnText="Delete" confirmBtnText="Delete"
confirmBtnBsStyle="danger" confirmBtnBsStyle="danger"
title={`Are you sure?`} title={t('deleteConfirm')}
onConfirm={onConfirmDelete} onConfirm={onConfirmDelete}
onCancel={() => cancelDelete()} onCancel={cancelDelete}
focusCancelBtn focusCancelBtn
> >
Delete this data {t('deleteMsg')}
</SweetAlert> </SweetAlert>
<DialogForm <DialogForm
openDialog={openDialog} openDialog={openDialog}
@ -354,13 +354,13 @@ const ProjectPhase = ({ params }) => {
<h4 className="capitalize">{pageName}</h4> <h4 className="capitalize">{pageName}</h4>
<Row> <Row>
<Col> <Col>
<Input onChange={handleSearch} value={search} type="text" name="search" id="search" placeholder={`Cari Fase`} /> <Input onChange={handleSearch} value={search} type="text" name="search" id="search" placeholder={t('searchPhase')} />
</Col> </Col>
<Col> <Col>
<Tooltip title="Add new data"> <Tooltip title={t('projectPhase')}>
<Button style={{ background: "#4caf50", color: "#fff" }} onClick={() => handleOpenDialog('Save')}><i className="fa fa-plus"></i></Button> <Button style={{ background: "#4caf50", color: "#fff" }} onClick={() => handleOpenDialog('Save')}><i className="fa fa-plus"></i></Button>
</Tooltip> </Tooltip>
<Tooltip title="Export Excel"> <Tooltip title={t('exportExcel')}>
<Button style={{ marginLeft: "5px" }} onClick={() => handleExportExcel()}><i className="fa fa-print"></i></Button> <Button style={{ marginLeft: "5px" }} onClick={() => handleExportExcel()}><i className="fa fa-print"></i></Button>
</Tooltip> </Tooltip>
</Col> </Col>

17
src/views/Master/RoleProject/DialogForm.js

@ -2,8 +2,9 @@ import React, { Component } from 'react'
import { Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap'; import { Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap';
import { Button, Form, FormGroup, Label, Input } from 'reactstrap'; import { Button, Form, FormGroup, Label, Input } from 'reactstrap';
import 'antd/dist/antd.css'; import 'antd/dist/antd.css';
import { withTranslation } from 'react-i18next';
export default class DialogForm extends Component { class DialogForm extends Component {
constructor(props) { constructor(props) {
super(props) super(props)
this.state = { this.state = {
@ -78,15 +79,16 @@ export default class DialogForm extends Component {
} }
renderForm = () => { renderForm = () => {
const { t } = this.props;
return ( return (
<Form> <Form>
<FormGroup> <FormGroup>
<Label>Nama</Label> <Label>{this.props.t('name')}</Label>
<Input type="text" value={this.state.name} onChange={(e)=>this.setState({ name:e.target.value })} placeholder="name roles.." /> <Input type="text" value={this.state.name} onChange={(e) => this.setState({ name: e.target.value })} placeholder={this.props.t('inputName')} />
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<Label>Deskripsi</Label> <Label>{this.props.t('description')}</Label>
<Input type="text" value={this.state.description} onChange={(e)=>this.setState({ description:e.target.value })} placeholder="deskripsi.." /> <Input type="text" value={this.state.description} onChange={(e) => this.setState({ description: e.target.value })} placeholder={this.props.t('inputDescription')} />
</FormGroup> </FormGroup>
</Form> </Form>
) )
@ -95,15 +97,16 @@ export default class DialogForm extends Component {
render() { render() {
return ( return (
<Modal isOpen={this.props.openDialog} toggle={this.props.toggleDialog}> <Modal isOpen={this.props.openDialog} toggle={this.props.toggleDialog}>
<ModalHeader toggle={this.props.closeDialog}>{this.props.typeDialog=="Save" ? "Tambah" : "Edit"} Project Role</ModalHeader> <ModalHeader toggle={this.props.closeDialog}>{this.props.typeDialog == "Save" ? "Tambah" : "Edit"} {this.props.t('nameProjectRole')}</ModalHeader>
<ModalBody> <ModalBody>
{this.renderForm()} {this.renderForm()}
</ModalBody> </ModalBody>
<ModalFooter> <ModalFooter>
<Button color="primary" onClick={() => this.handleSave()}>{this.props.typeDialog}</Button>{' '} <Button color="primary" onClick={() => this.handleSave()}>{this.props.typeDialog}</Button>{' '}
<Button color="secondary" onClick={() => this.handleCancel()}>Cancel</Button> <Button color="secondary" onClick={() => this.handleCancel()}>{this.props.t('cancel')}</Button>
</ModalFooter> </ModalFooter>
</Modal> </Modal>
) )
} }
} }
export default withTranslation()(DialogForm);

28
src/views/Master/RoleProject/index.js

@ -8,7 +8,7 @@ import { Card, CardBody, CardHeader, Col, Row, Input } from 'reactstrap';
import { NotificationContainer, NotificationManager } from 'react-notifications'; import { NotificationContainer, NotificationManager } from 'react-notifications';
import { PROJECT_ROLE_ADD, PROJECT_ROLE_SEARCH, PROJECT_ROLE_EDIT, PROJECT_ROLE_DELETE, ROLEMENU_ADD, ROLEMENU_SEARCH, ROLEMENU_DELETE_ROLE } from '../../../const/ApiConst.js'; import { PROJECT_ROLE_ADD, PROJECT_ROLE_SEARCH, PROJECT_ROLE_EDIT, PROJECT_ROLE_DELETE, ROLEMENU_ADD, ROLEMENU_SEARCH, ROLEMENU_DELETE_ROLE } from '../../../const/ApiConst.js';
import { Pagination, Tooltip, Table } from 'antd'; import { Pagination, Tooltip, Table } from 'antd';
import { withTranslation } from 'react-i18next';
const token = window.localStorage.getItem('token'); const token = window.localStorage.getItem('token');
const BASE_URL = "http://siopas.co.id/custom-php/api/geohr/"; const BASE_URL = "http://siopas.co.id/custom-php/api/geohr/";
@ -32,7 +32,7 @@ const column = [
const LENGTH_DATA = 10 const LENGTH_DATA = 10
export default class index extends Component { class index extends Component {
constructor(props) { constructor(props) {
super(props) super(props)
this.state = { this.state = {
@ -63,23 +63,23 @@ export default class index extends Component {
} }
this.columns = [ this.columns = [
{ {
title: 'Action', title: this.props.t('action'),
dataIndex: '', dataIndex: '',
key: 'x', key: 'x',
className: 'nowrap', className: 'nowrap',
render: (text, record) => <> render: (text, record) => <>
<Tooltip title="Hapus"> <Tooltip title={this.props.t('delete')}>
<i className="fa fa-trash" style={{ color: 'red', marginRight: 10, cursor: "pointer" }} onClick={() => this.handleDelete(text.id)}></i> <i className="fa fa-trash" style={{ color: 'red', marginRight: 10, cursor: "pointer" }} onClick={() => this.handleDelete(text.id)}></i>
</Tooltip> </Tooltip>
<Tooltip title="Edit"> <Tooltip title={this.props.t('edit')}>
<i className="fa fa-edit" style={{ color: 'green', cursor: "pointer" }} onClick={() => this.handleEdit(text)}></i> <i className="fa fa-edit" style={{ color: 'green', cursor: "pointer" }} onClick={() => this.handleEdit(text)}></i>
</Tooltip> </Tooltip>
</>, </>,
}, },
{ title: 'Nama Role', dataIndex: 'name', key: 'name', className: "nowrap" }, { title: this.props.t('name'), dataIndex: 'name', key: 'name', className: "nowrap" },
{ title: 'Description', dataIndex: 'description', key: 'description' }, { title: this.props.t('description'), dataIndex: 'description', key: 'description' },
]; ];
} }
@ -255,7 +255,7 @@ export default class index extends Component {
if (this.state.dataTable.length === 0) { if (this.state.dataTable.length === 0) {
return ( return (
<tr> <tr>
<td align="center" colSpan="3">Tidak ada data project role</td> <td align="center" colSpan="3">{this.props.t('noData')}</td>
</tr> </tr>
) )
} }
@ -303,6 +303,7 @@ export default class index extends Component {
} }
render() { render() {
const { t } = this.props;
const { tooltipTambah, tooltipExport, dialogMenuForm, dataTable, openDialog, currentPage, rowsPerPage, totalPage, search, tooltipEdit, tooltipDelete, tooltipMenu } = this.state const { tooltipTambah, tooltipExport, dialogMenuForm, dataTable, openDialog, currentPage, rowsPerPage, totalPage, search, tooltipEdit, tooltipDelete, tooltipMenu } = this.state
let noSeq = 0; let noSeq = 0;
return ( return (
@ -314,12 +315,12 @@ export default class index extends Component {
showCancel showCancel
confirmBtnText="Delete" confirmBtnText="Delete"
confirmBtnBsStyle="danger" confirmBtnBsStyle="danger"
title="Are you sure?" title={this.props.t('deleteConfirm')}
onConfirm={this.onConfirmDelete} onConfirm={this.onConfirmDelete}
onCancel={() => this.setState({ alertDelete: false, idDelete: 0 })} onCancel={() => this.setState({ alertDelete: false, idDelete: 0 })}
focusCancelBtn focusCancelBtn
> >
Data project role akan terhapus!! {this.props.t('deleteMsg')}
</SweetAlert> </SweetAlert>
<SweetAlert <SweetAlert
show={this.state.alertNotDelete} show={this.state.alertNotDelete}
@ -345,13 +346,13 @@ export default class index extends Component {
<h4>{this.props.params.name}</h4> <h4>{this.props.params.name}</h4>
<Row> <Row>
<Col> <Col>
<Input onChange={this.handleSearch} value={search} type="text" name="search" id="search" placeholder="Cari Nama Project Role" /> <Input onChange={this.handleSearch} value={search} type="text" name="search" id="search" placeholder={this.props.t('searchProjectRoles')} />
</Col> </Col>
<Col> <Col>
<Tooltip title="Tambah Roles"> <Tooltip title={this.props.t('rolesAdd')}>
<Button id="TooltipTambah" color="success" onClick={() => this.handleOpenDialog('Save')}><i className="fa fa-plus"></i></Button> <Button id="TooltipTambah" color="success" onClick={() => this.handleOpenDialog('Save')}><i className="fa fa-plus"></i></Button>
</Tooltip> </Tooltip>
<Tooltip title="Export Excel"> <Tooltip title={this.props.t('exportExcel')}>
<Button style={{ marginLeft: "5px" }} id="TooltipExport" color="primary" onClick={() => this.handleExportExcel()}><i className="fa fa-print"></i></Button> <Button style={{ marginLeft: "5px" }} id="TooltipExport" color="primary" onClick={() => this.handleExportExcel()}><i className="fa fa-print"></i></Button>
</Tooltip> </Tooltip>
</Col> </Col>
@ -382,3 +383,4 @@ export default class index extends Component {
) )
} }
} }
export default withTranslation()(index);

46
src/views/Report/k3/index.js

@ -10,6 +10,7 @@ import { Pagination, Tooltip } from 'antd';
import { DatePicker, Select } from 'antd'; import { DatePicker, Select } from 'antd';
import * as XLSX from 'xlsx'; import * as XLSX from 'xlsx';
import { PRESENSI_SEARCH, PROYEK_SEARCH, USERPROYEK_SEARCH, K3_SEARCH, SIMPRO_BASE_IMAGE } from '../../../const/ApiConst.js'; import { PRESENSI_SEARCH, PROYEK_SEARCH, USERPROYEK_SEARCH, K3_SEARCH, SIMPRO_BASE_IMAGE } from '../../../const/ApiConst.js';
import { withTranslation } from 'react-i18next';
const { RangePicker } = DatePicker; const { RangePicker } = DatePicker;
const { Option } = Select const { Option } = Select
const token = localStorage.getItem('token'); const token = localStorage.getItem('token');
@ -25,18 +26,11 @@ const BASE_URL = ""
const momentFormat = 'DD-MM-YY'; const momentFormat = 'DD-MM-YY';
const column = [
{ name: "Nama Human Resource" },
{ name: "Tanggal Lapor"},
{ name: "Perlengkapan Dikenakan"},
{ name: "Perlengkapan Tidak Dikenakan"},
{ name: "Deskripsi" },
{ name: "Action" },
]
const LENGTH_DATA = 10 const LENGTH_DATA = 10
export default class index extends Component { class index extends Component {
constructor(props) { constructor(props) {
super(props) super(props)
this.state = { this.state = {
@ -444,6 +438,7 @@ export default class index extends Component {
} }
renderTable = () => { renderTable = () => {
const { t } = this.props;
const dataTable2 = this.state.dataTable || []; const dataTable2 = this.state.dataTable || [];
return ( return (
<tbody> <tbody>
@ -455,11 +450,11 @@ export default class index extends Component {
<td>{n.k3_checked.length ? n.k3_checked.join() : "-"}</td> <td>{n.k3_checked.length ? n.k3_checked.join() : "-"}</td>
<td>{n.k3_not_checked.length ? n.k3_not_checked.join() : "-"}</td> <td>{n.k3_not_checked.length ? n.k3_not_checked.join() : "-"}</td>
<td>{n.description ? n.description : "-"}</td> <td>{n.description ? n.description : "-"}</td>
<td> {n.image ? <Tooltip title="Lihat Foto"><i onClick={() => this.lihatFoto(n.image)} className='fa fa-image'></i></Tooltip>: ""}</td> <td> {n.image ? <Tooltip title={this.props.t('image')}><i onClick={() => this.lihatFoto(n.image)} className='fa fa-image'></i></Tooltip> : ""}</td>
</tr> </tr>
) )
}) : <tr> }) : <tr>
<td colSpan="9" align="center">No Data Available</td> <td colSpan="9" align="center">{this.props.t('noData')}</td>
</tr> </tr>
} }
</tbody> </tbody>
@ -517,6 +512,15 @@ export default class index extends Component {
delay = (ms) => new Promise(res => setTimeout(res, ms)); delay = (ms) => new Promise(res => setTimeout(res, ms));
render() { render() {
const column = [
{ name: this.props.t('nameHR') },
{ name: this.props.t('dateReport') },
{ name: this.props.t('gearUse') },
{ name: this.props.t('gearNotUse') },
{ name: this.props.t('description') },
{ name: this.props.t('action') },
]
const t = this.props;
const { tooltipExport, dataTable, openDialog, currentPage, rowsPerPage, totalPage, search, tooltipEdit, tooltipDelete } = this.state const { tooltipExport, dataTable, openDialog, currentPage, rowsPerPage, totalPage, search, tooltipEdit, tooltipDelete } = this.state
return ( return (
<div> <div>
@ -527,12 +531,12 @@ export default class index extends Component {
showCancel showCancel
confirmBtnText="Delete" confirmBtnText="Delete"
confirmBtnBsStyle="danger" confirmBtnBsStyle="danger"
title="Are you sure?" title={this.props.t('deleteConfirm')}
onConfirm={this.onConfirmDelete} onConfirm={this.onConfirmDelete}
onCancel={() => this.setState({ alertDelete: false, idDelete: 0 })} onCancel={() => this.setState({ alertDelete: false, idDelete: 0 })}
focusCancelBtn focusCancelBtn
> >
Data report k3 akan terhapus!! {this.props.t('deleteMsg')}
</SweetAlert> </SweetAlert>
<DialogForm <DialogForm
openDialog={openDialog} openDialog={openDialog}
@ -545,33 +549,32 @@ export default class index extends Component {
<CardHeader style={{ display: "flex", justifyContent: "space-between" }}> <CardHeader style={{ display: "flex", justifyContent: "space-between" }}>
<h4>{this.props.params.name}</h4> <h4>{this.props.params.name}</h4>
<div> <div>
<Tooltip title="Export Excel"> <Tooltip title={this.props.t('exportExcel')}>
<Button id="TooltipExport" color="primary" onClick={() => this.handleExportExcel()}><i className="fa fa-print"></i></Button> <Button id="TooltipExport" color="primary" onClick={() => this.handleExportExcel()}><i className="fa fa-print"></i></Button>
</Tooltip> </Tooltip>
{/* <Button color="success" onClick={() => this.handleExportExcel()}>Export Excel</Button> */}
</div> </div>
</CardHeader> </CardHeader>
<CardBody> <CardBody>
<div style={{ display: "flex", justifyContent: "space-between" }}> <div style={{ display: "flex", justifyContent: "space-between" }}>
<div style={{ width: "100%", display: "flex", alignItems: "center" }}> <div style={{ width: "100%", display: "flex", alignItems: "center" }}>
<div style={{ width: "100%", marginRight: "10px", maxWidth: "200px" }}> <div style={{ width: "100%", marginRight: "10px", maxWidth: "200px" }}>
<Select showSearch defaultValue={this.state.currentProyek} onChange={this.onChangeProyek} placeholder="Semua / Pilih Proyek >" style={{width:'100%'}} disabled={this.state.disableProyek} allowClear={true}> <Select showSearch defaultValue={this.state.currentProyek} onChange={this.onChangeProyek} placeholder={this.props.t('searchProject')} style={{ width: '100%' }} disabled={this.state.disableProyek} allowClear={true}>
{this.setupSelectProyek()} {this.setupSelectProyek()}
</Select> </Select>
</div> </div>
<div style={{ width: "100%", marginRight: "10px", maxWidth: "200px" }}> <div style={{ width: "100%", marginRight: "10px", maxWidth: "200px" }}>
<Input type="select" onChange={(e) => this.handleChangeDay(e)} defaultValue={this.state.currentDay}> <Input type="select" onChange={(e) => this.handleChangeDay(e)} defaultValue={this.state.currentDay}>
<option value="today">Hari Ini</option> <option value="today">{this.props.t('today')}</option>
<option value="3 day">3 Hari yang lalu</option> <option value="3 day">{this.props.t('3days')}</option>
<option value="7 day">7 Hari yang lalu</option> <option value="7 day">{this.props.t('7days')}</option>
</Input> </Input>
</div> </div>
<div style={{ width: "50%", marginTop: "3px" }}> <div style={{ width: "50%", marginTop: "3px" }}>
<RangePicker size="default" allowClear={false} value={[this.state.startDate, this.state.endDate]} onChange={this.handleDatePicker} />{' '} <RangePicker size="default" allowClear={false} value={[this.state.startDate, this.state.endDate]} onChange={this.handleDatePicker} />{' '}
<Button color="primary" onClick={() => this.getDataLaporanK3()}>Cari</Button> <Button color="primary" onClick={() => this.getDataLaporanK3()}>{this.props.t('search')}</Button>
</div> </div>
</div> </div>
<Input onChange={this.handleSearch} value={search} type="text" name="search" id="search" placeholder="Cari nama human resource" style={{ maxWidth: "200px", marginBottom: "20px" }} /> <Input onChange={this.handleSearch} value={search} type="text" name="search" id="search" placeholder={this.props.t('searchHR')} style={{ maxWidth: "200px", marginBottom: "20px" }} />
</div> </div>
<Table responsive striped hover> <Table responsive striped hover>
<thead> <thead>
@ -601,3 +604,4 @@ export default class index extends Component {
) )
} }
} }
export default withTranslation()(index);

15
src/views/SimproV2/ChecklistK3/DialogForm.js

@ -4,13 +4,14 @@ import {
Button, Form, FormGroup, Label, Input, Col, Row Button, Form, FormGroup, Label, Input, Col, Row
} from 'reactstrap'; } from 'reactstrap';
import 'antd/dist/antd.css'; import 'antd/dist/antd.css';
import { useTranslation } from 'react-i18next';
const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, dataEdit }) => { const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, dataEdit }) => {
const [id, setId] = useState(0) const [id, setId] = useState(0)
const [name, setName] = useState('') const [name, setName] = useState('')
const [description, setDescription] = useState('') const [description, setDescription] = useState('')
const { t } = useTranslation()
useEffect(() => { useEffect(() => {
@ -62,14 +63,14 @@ const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, dataEdi
<Row> <Row>
<Col md={6}> <Col md={6}>
<FormGroup> <FormGroup>
<Label className="capitalize">Name</Label> <Label className="capitalize">{t('name')}</Label>
<Input type="text" value={name} onChange={(e) => setName(e.target.value)} placeholder={`Input name...`} /> <Input type="text" value={name} onChange={(e) => setName(e.target.value)} placeholder={t('inputName')} />
</FormGroup> </FormGroup>
</Col> </Col>
<Col md={6}> <Col md={6}>
<FormGroup> <FormGroup>
<Label className="capitalize">Description</Label> <Label className="capitalize">{t('description')}</Label>
<Input row="4" type="textarea" value={description} onChange={(e) => setDescription(e.target.value)} placeholder={`Description ...`} /> <Input row="4" type="textarea" value={description} onChange={(e) => setDescription(e.target.value)} placeholder={t('inputDescription')} />
</FormGroup> </FormGroup>
</Col> </Col>
</Row> </Row>
@ -81,13 +82,13 @@ const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, dataEdi
return ( return (
<> <>
<Modal size="lg" isOpen={openDialog} toggle={toggleDialog}> <Modal size="lg" isOpen={openDialog} toggle={toggleDialog}>
<ModalHeader className="capitalize" toggle={closeDialog}>{typeDialog == "Save" ? `Add` : "Edit"} Resource</ModalHeader> <ModalHeader className="capitalize" toggle={closeDialog}>{typeDialog == "Save" ? `Add` : "Edit"} Checlist K3</ModalHeader>
<ModalBody> <ModalBody>
{renderForm()} {renderForm()}
</ModalBody> </ModalBody>
<ModalFooter> <ModalFooter>
<Button color="primary" onClick={() => handleSave()}>{typeDialog}</Button>{' '} <Button color="primary" onClick={() => handleSave()}>{typeDialog}</Button>{' '}
<Button className="capitalize" color="secondary" onClick={() => handleCancel()}>Batal</Button> <Button className="capitalize" color="secondary" onClick={() => handleCancel()}>{t('cancel')}</Button>
</ModalFooter> </ModalFooter>
</Modal> </Modal>
</> </>

30
src/views/SimproV2/ChecklistK3/index.js

@ -9,6 +9,7 @@ import { Pagination, Button, Tooltip } from 'antd';
import { import {
CHECKLIST_K3_ADD, CHECKLIST_K3_EDIT, CHECKLIST_K3_DELETE, CHECKLIST_K3_SEARCH CHECKLIST_K3_ADD, CHECKLIST_K3_EDIT, CHECKLIST_K3_DELETE, CHECKLIST_K3_SEARCH
} from '../../../const/ApiConst'; } from '../../../const/ApiConst';
import { useTranslation } from 'react-i18next';
const token = window.localStorage.getItem('token'); const token = window.localStorage.getItem('token');
const config = { const config = {
@ -18,10 +19,7 @@ const config = {
"Content-type": `application/json` "Content-type": `application/json`
} }
}; };
const column = [
{ name: "Nama" },
{ name: "Deskripsi" },
]
const ChecklistK3 = ({ params }) => { const ChecklistK3 = ({ params }) => {
const token = localStorage.getItem("token") const token = localStorage.getItem("token")
const HEADER = { const HEADER = {
@ -45,7 +43,11 @@ const ChecklistK3 = ({ params }) => {
const [search, setSearch] = useState('') const [search, setSearch] = useState('')
const [totalPage, setTotalPage] = useState(0) const [totalPage, setTotalPage] = useState(0)
const [typeDialog, setTypeDialog] = useState('Save') const [typeDialog, setTypeDialog] = useState('Save')
const { t } = useTranslation()
const column = [
{ name: t('name') },
{ name: t('description') },
]
useEffect(() => { useEffect(() => {
getDataChecklistK3() getDataChecklistK3()
}, [currentPage, rowsPerPage, search]) }, [currentPage, rowsPerPage, search])
@ -240,7 +242,7 @@ const ChecklistK3 = ({ params }) => {
if (dataTable.length === 0) { if (dataTable.length === 0) {
return ( return (
<tr> <tr>
<td align="center" colSpan="3">Tidak ada data project type</td> <td align="center" colSpan="3">{t('noData')}</td>
</tr> </tr>
) )
} }
@ -255,12 +257,12 @@ const ChecklistK3 = ({ params }) => {
showCancel showCancel
confirmBtnText="Delete" confirmBtnText="Delete"
confirmBtnBsStyle="danger" confirmBtnBsStyle="danger"
title={`Are you sure?`} title={t('deleteConfirm')}
onConfirm={onConfirmDelete} onConfirm={onConfirmDelete}
onCancel={() => cancelDelete()} onCancel={() => cancelDelete()}
focusCancelBtn focusCancelBtn
> >
Delete this data {t('deleteMsg')}
</SweetAlert> </SweetAlert>
<DialogForm <DialogForm
openDialog={openDialog} openDialog={openDialog}
@ -276,13 +278,13 @@ const ChecklistK3 = ({ params }) => {
<h4 className="capitalize">{pageName}</h4> <h4 className="capitalize">{pageName}</h4>
<Row> <Row>
<Col> <Col>
<Input onChange={handleSearch} value={search} type="text" name="search" id="search" placeholder={`Search checklist K3...`} /> <Input onChange={handleSearch} value={search} type="text" name="search" id="search" placeholder={t('searchChecklistK3')} />
</Col> </Col>
<Col> <Col>
<Tooltip title="Add Checklist K3"> <Tooltip title={t('ChecklistK3Add')}>
<Button style={{ background: "#4caf50", color: "#fff" }} onClick={() => handleOpenDialog('Save')}><i className="fa fa-plus"></i></Button> <Button style={{ background: "#4caf50", color: "#fff" }} onClick={() => handleOpenDialog('Save')}><i className="fa fa-plus"></i></Button>
</Tooltip> </Tooltip>
<Tooltip title="Export Excel"> <Tooltip title={t('exportExcel')}>
<Button style={{ marginLeft: "5px" }} color="primary" onClick={() => handleExportExcel()}><i className="fa fa-print"></i></Button> <Button style={{ marginLeft: "5px" }} color="primary" onClick={() => handleExportExcel()}><i className="fa fa-print"></i></Button>
</Tooltip> </Tooltip>
</Col> </Col>
@ -292,7 +294,7 @@ const ChecklistK3 = ({ params }) => {
<Table responsive striped hover> <Table responsive striped hover>
<thead> <thead>
<tr> <tr>
<th>Aksi</th> <th>{t('action')}</th>
{column.map((i, index) => { {column.map((i, index) => {
return ( return (
<th key={index} scope="row">{i.name}</th> <th key={index} scope="row">{i.name}</th>
@ -306,10 +308,10 @@ const ChecklistK3 = ({ params }) => {
return ( return (
<tr key={n.id}> <tr key={n.id}>
<td className='nowrap'> <td className='nowrap'>
<Tooltip title="Hapus"> <Tooltip title={t('delete')}>
<i id="TooltipDelete" className="fa fa-trash" style={{ color: 'red', marginRight: 10, cursor: "pointer" }} onClick={() => handleDelete(n.id)}></i> <i id="TooltipDelete" className="fa fa-trash" style={{ color: 'red', marginRight: 10, cursor: "pointer" }} onClick={() => handleDelete(n.id)}></i>
</Tooltip> </Tooltip>
<Tooltip title="Edit"> <Tooltip title={t('edit')}>
<i id="TooltipEdit" className="fa fa-edit" style={{ color: 'green', cursor: "pointer" }} onClick={() => handleEdit(n)}></i> <i id="TooltipEdit" className="fa fa-edit" style={{ color: 'green', cursor: "pointer" }} onClick={() => handleEdit(n)}></i>
</Tooltip> </Tooltip>
</td> </td>

21
src/views/SimproV2/Divisi/DialogForm.js

@ -3,17 +3,16 @@ import {
Modal, ModalHeader, ModalBody, ModalFooter, Modal, ModalHeader, ModalBody, ModalFooter,
Button, Form, FormGroup, Label, Input, Col, Row Button, Form, FormGroup, Label, Input, Col, Row
} from 'reactstrap'; } from 'reactstrap';
import { DatePicker, Tooltip, Select } from 'antd'; import { Select } from 'antd';
import { formatRupiah, formatNumber } from '../../../const/CustomFunc'
import moment from 'moment';
import 'antd/dist/antd.css'; import 'antd/dist/antd.css';
import { useTranslation } from 'react-i18next';
const { Option } = Select const { Option } = Select
const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, dataEdit, dataDivisions }) => { const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, dataEdit, dataDivisions }) => {
const [id, setId] = useState(0) const [id, setId] = useState(0)
const [name, setName] = useState('') const [name, setName] = useState('')
const [parent, setParent] = useState(null) const [parent, setParent] = useState(null)
const [description, setDescription] = useState('') const [description, setDescription] = useState('')
const { t } = useTranslation()
const onChangeParent = (val) => { const onChangeParent = (val) => {
setParent(val) setParent(val)
@ -63,15 +62,15 @@ const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, dataEdi
<Row> <Row>
<Col md={6}> <Col md={6}>
<FormGroup> <FormGroup>
<Label className="capitalize">Name</Label> <Label className="capitalize">{t('name')}</Label>
<Input type="text" value={name} onChange={(e) => setName(e.target.value)}/> <Input type="text" value={name} onChange={(e) => setName(e.target.value)} placeholder={t('inputName')} />
</FormGroup> </FormGroup>
</Col> </Col>
</Row> </Row>
<Row> <Row>
<Col md={6}> <Col md={6}>
<FormGroup> <FormGroup>
<Label className="capitalize">Parent</Label> <Label className="capitalize">{t('nameDivision')}</Label>
<Select showSearch <Select showSearch
value={parent} value={parent}
onChange={onChangeParent} onChange={onChangeParent}
@ -88,8 +87,8 @@ const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, dataEdi
<Row> <Row>
<Col md={6}> <Col md={6}>
<FormGroup> <FormGroup>
<Label className="capitalize">Description</Label> <Label className="capitalize">{t('description')}</Label>
<Input row="4" type="textarea" value={description} onChange={(e) => setDescription(e.target.value)}/> <Input row="4" type="textarea" value={description} onChange={(e) => setDescription(e.target.value)} placeholder={t('inputDescription')} />
</FormGroup> </FormGroup>
</Col> </Col>
</Row> </Row>
@ -101,13 +100,13 @@ const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, dataEdi
return ( return (
<> <>
<Modal size="lg" isOpen={openDialog} toggle={toggleDialog}> <Modal size="lg" isOpen={openDialog} toggle={toggleDialog}>
<ModalHeader className="capitalize" toggle={closeDialog}>{typeDialog == "Save" ? `Add` : "Edit"} Resource</ModalHeader> <ModalHeader className="capitalize" toggle={closeDialog}>{typeDialog == "Save" ? `Add` : "Edit"} {t('division')}</ModalHeader>
<ModalBody> <ModalBody>
{renderForm()} {renderForm()}
</ModalBody> </ModalBody>
<ModalFooter> <ModalFooter>
<Button color="primary" onClick={() => handleSave()}>{typeDialog}</Button>{' '} <Button color="primary" onClick={() => handleSave()}>{typeDialog}</Button>{' '}
<Button className="capitalize" color="secondary" onClick={() => handleCancel()}>Batal</Button> <Button className="capitalize" color="secondary" onClick={() => handleCancel()}>{t('cancel')}</Button>
</ModalFooter> </ModalFooter>
</Modal> </Modal>
</> </>

26
src/views/SimproV2/Divisi/index.js

@ -1,15 +1,13 @@
import * as XLSX from 'xlsx'; import * as XLSX from 'xlsx';
import DialogForm from './DialogForm'; import DialogForm from './DialogForm';
import React, { useState, useEffect, useMemo } from 'react'; import React, { useState, useEffect } from 'react';
import SweetAlert from 'react-bootstrap-sweetalert'; import SweetAlert from 'react-bootstrap-sweetalert';
import axios from "../../../const/interceptorApi" import axios from "../../../const/interceptorApi"
import moment from 'moment'
import { Card, CardBody, CardHeader, Col, Row, Input, Table } from 'reactstrap'; import { Card, CardBody, CardHeader, Col, Row, Input, Table } from 'reactstrap';
import { DIVISI_LIST, DIVISI_ADD, DIVISI_EDIT, DIVISI_DELETE, DIVISI_SEARCH } from '../../../const/ApiConst'; import { DIVISI_LIST, DIVISI_ADD, DIVISI_EDIT, DIVISI_DELETE, DIVISI_SEARCH } from '../../../const/ApiConst';
import { DownloadOutlined } from '@ant-design/icons';
import { NotificationContainer, NotificationManager } from 'react-notifications'; import { NotificationContainer, NotificationManager } from 'react-notifications';
import { Pagination, Button, Tooltip } from 'antd'; import { Pagination, Button, Tooltip } from 'antd';
import { formatRupiah, formatNumber } from '../../../const/CustomFunc' import { useTranslation } from 'react-i18next';
const url = ""; const url = "";
const proyek_id = localStorage.getItem('proyek_id'); const proyek_id = localStorage.getItem('proyek_id');
@ -53,7 +51,7 @@ const ProjectType = ({ params }) => {
const [totalPage, setTotalPage] = useState(0) const [totalPage, setTotalPage] = useState(0)
const [typeDialog, setTypeDialog] = useState('Save') const [typeDialog, setTypeDialog] = useState('Save')
const [dataDivisions, setDataDivisions] = useState([]) const [dataDivisions, setDataDivisions] = useState([])
const { t } = useTranslation()
useEffect(() => { useEffect(() => {
getListDivision() getListDivision()
@ -281,7 +279,7 @@ const ProjectType = ({ params }) => {
if (dataTable.length === 0) { if (dataTable.length === 0) {
return ( return (
<tr> <tr>
<td align="center" colSpan="3">Belum ada data.</td> <td align="center" colSpan="3">{t('noData')}</td>
</tr> </tr>
) )
} }
@ -296,12 +294,12 @@ const ProjectType = ({ params }) => {
showCancel showCancel
confirmBtnText="Delete" confirmBtnText="Delete"
confirmBtnBsStyle="danger" confirmBtnBsStyle="danger"
title={`Are you sure?`} title={t('deleteConfirm')}
onConfirm={onConfirmDelete} onConfirm={onConfirmDelete}
onCancel={() => cancelDelete()} onCancel={cancelDelete}
focusCancelBtn focusCancelBtn
> >
Delete this data {t('deleteMsg')}
</SweetAlert> </SweetAlert>
<DialogForm <DialogForm
openDialog={openDialog} openDialog={openDialog}
@ -318,13 +316,13 @@ const ProjectType = ({ params }) => {
<h4 className="capitalize">{pageName}</h4> <h4 className="capitalize">{pageName}</h4>
<Row> <Row>
<Col> <Col>
<Input onChange={handleSearch} value={search} type="text" name="search" id="search" placeholder={`Cari Divisi`} /> <Input onChange={handleSearch} value={search} type="text" name="search" id="search" placeholder={t('searchDivision')} />
</Col> </Col>
<Col> <Col>
<Tooltip title="Add Data"> <Tooltip title={t('divisionAdd')}>
<Button style={{ background: "#4caf50", color: "#fff" }} onClick={() => handleOpenDialog('Save')}><i className="fa fa-plus"></i></Button> <Button style={{ background: "#4caf50", color: "#fff" }} onClick={() => handleOpenDialog('Save')}><i className="fa fa-plus"></i></Button>
</Tooltip> </Tooltip>
<Tooltip title="Export Excel"> <Tooltip title={t('exportExcel')}>
<Button style={{ marginLeft: "5px" }} onClick={() => handleExportExcel()}><i className="fa fa-print"></i></Button> <Button style={{ marginLeft: "5px" }} onClick={() => handleExportExcel()}><i className="fa fa-print"></i></Button>
</Tooltip> </Tooltip>
</Col> </Col>
@ -348,10 +346,10 @@ const ProjectType = ({ params }) => {
return ( return (
<tr key={n.id}> <tr key={n.id}>
<td className='nowrap'> <td className='nowrap'>
<Tooltip title="Hapus"> <Tooltip title={t('delete')}>
<i id="TooltipDelete" className="fa fa-trash" style={{ color: 'red', marginRight: 10, cursor: "pointer" }} onClick={() => handleDelete(n.id)}></i> <i id="TooltipDelete" className="fa fa-trash" style={{ color: 'red', marginRight: 10, cursor: "pointer" }} onClick={() => handleDelete(n.id)}></i>
</Tooltip> </Tooltip>
<Tooltip title="Edit"> <Tooltip title={t('edit')}>
<i id="TooltipEdit" className="fa fa-edit" style={{ color: 'green', cursor: "pointer" }} onClick={() => handleEdit(n)}></i> <i id="TooltipEdit" className="fa fa-edit" style={{ color: 'green', cursor: "pointer" }} onClick={() => handleEdit(n)}></i>
</Tooltip> </Tooltip>
</td> </td>

8
src/views/SimproV2/Presence/DialogFoto.js

@ -4,6 +4,7 @@ import { Button } from 'reactstrap';
import { Image } from 'antd' import { Image } from 'antd'
import { BASE_SIMPRO_LUMEN_IMAGE } from '../../../const/ApiConst'; import { BASE_SIMPRO_LUMEN_IMAGE } from '../../../const/ApiConst';
import 'antd/dist/antd.css'; import 'antd/dist/antd.css';
import { useTranslation } from 'react-i18next';
const DialogFoto = ({ openDialog, closeDialog, toggleDialog, dataImage }) => { const DialogFoto = ({ openDialog, closeDialog, toggleDialog, dataImage }) => {
@ -11,7 +12,7 @@ const DialogFoto = ({ openDialog, closeDialog, toggleDialog, dataImage }) => {
const [urlImage, setUrlImage] = useState("") const [urlImage, setUrlImage] = useState("")
const [dataReady, setDataReady] = useState(false) const [dataReady, setDataReady] = useState(false)
const [hrName, setHrName] = useState(false) const [hrName, setHrName] = useState(false)
const { t } = useTranslation()
useEffect(() => { useEffect(() => {
if (dataImage && dataImage != null) { if (dataImage && dataImage != null) {
setUrlImage(dataImage.url); setUrlImage(dataImage.url);
@ -31,7 +32,6 @@ const DialogFoto = ({ openDialog, closeDialog, toggleDialog, dataImage }) => {
const renderModalBody = () => { const renderModalBody = () => {
return ( return (
<div style={{ width: '100%', display: 'flex', justifyContent: 'center', flexDirection: 'column', alignItems: 'flex-start' }}> <div style={{ width: '100%', display: 'flex', justifyContent: 'center', flexDirection: 'column', alignItems: 'flex-start' }}>
<h6>Foto Selfie :</h6>
<div style={{ width: '100%', display: 'flex', justifyContent: 'center', alignItems: 'center' }}> <div style={{ width: '100%', display: 'flex', justifyContent: 'center', alignItems: 'center' }}>
<Image <Image
width={200} width={200}
@ -44,12 +44,12 @@ const DialogFoto = ({ openDialog, closeDialog, toggleDialog, dataImage }) => {
return ( return (
<Modal isOpen={openDialog} toggle={toggleDialog}> <Modal isOpen={openDialog} toggle={toggleDialog}>
<ModalHeader className="capitalize" toggle={closeDialog}>Lihat Selfie Presensi | Nama Human Resource {hrName}</ModalHeader> <ModalHeader className="capitalize" toggle={closeDialog}>{t('imageCheck')} | {t('nameHR')} {hrName}</ModalHeader>
<ModalBody> <ModalBody>
{dataReady ? renderModalBody() : null} {dataReady ? renderModalBody() : null}
</ModalBody> </ModalBody>
<ModalFooter> <ModalFooter>
<Button className="capitalize" color="secondary" onClick={closeDialog}>Close</Button> <Button className="capitalize" color="secondary" onClick={closeDialog}>{t('close')}</Button>
</ModalFooter> </ModalFooter>
</Modal> </Modal>
) )

40
src/views/SimproV2/Presence/index.js

@ -8,6 +8,7 @@ import { Pagination, Tooltip, Table, DatePicker } from 'antd';
import moment from 'moment'; import moment from 'moment';
import { PRESENCE_SEARCH, IMAGE_GET_BY_ID } from '../../../const/ApiConst.js'; import { PRESENCE_SEARCH, IMAGE_GET_BY_ID } from '../../../const/ApiConst.js';
import DialogFoto from './DialogFoto'; import DialogFoto from './DialogFoto';
import { useTranslation } from 'react-i18next';
const { RangePicker } = DatePicker; const { RangePicker } = DatePicker;
const token = window.localStorage.getItem('token'); const token = window.localStorage.getItem('token');
@ -24,6 +25,7 @@ const Index = ({ params }) => {
const [currentDay, setCurrentDay] = useState("today") const [currentDay, setCurrentDay] = useState("today")
const [dataImage, setDataImage] = useState(null) const [dataImage, setDataImage] = useState(null)
const [openImage, setOpenImage] = useState(false) const [openImage, setOpenImage] = useState(false)
const { t } = useTranslation()
const pageName = params.name; const pageName = params.name;
const config = { const config = {
@ -230,26 +232,20 @@ const Index = ({ params }) => {
dataIndex: '', dataIndex: '',
key: 'x', key: 'x',
render: (text, record) => <> render: (text, record) => <>
{/* <Tooltip title="Delete"> <Tooltip title={t('image')}>
<i id="TooltipDelete" className="fa fa-trash" style={{ color: 'red', marginRight: '10px', cursor: "pointer" }} onClick={() => handleDelete(text.id)}></i>
</Tooltip>
<Tooltip title="Edit">
<i id="TooltipEdit" className="fa fa-edit" style={{ color: 'green', cursor: "pointer" }} onClick={() => handleEdit(text)}></i>
</Tooltip> */}
<Tooltip title="Image">
<i id="TooltipEdit" className="fa fa-image" style={{ color: 'green', cursor: "pointer" }} onClick={() => handleImage(text.id, text.join_first_name)}></i> <i id="TooltipEdit" className="fa fa-image" style={{ color: 'green', cursor: "pointer" }} onClick={() => handleImage(text.id, text.join_first_name)}></i>
</Tooltip> </Tooltip>
</>, </>,
}, },
{ title: 'NIK/ID Card', dataIndex: 'join_first_ktp_number', key: 'join_first_ktp_number' }, { title: t('nik'), dataIndex: 'join_first_ktp_number', key: 'join_first_ktp_number' },
{ title: 'Nama HR', dataIndex: 'join_first_name', key: 'join_first_name' }, { title: t('nameHR'), dataIndex: 'join_first_name', key: 'join_first_name' },
{ title: 'Waktu Masuk', dataIndex: 'clock_in', key: 'clock_in', render: (text, record) => (<div style={{ whiteSpace: "nowrap" }}>{text ? moment(text).format("D-M-YYYY HH:mm:ss") : "-"}</div>) }, { title: t('presenceIn'), dataIndex: 'clock_in', key: 'clock_in', render: (text, record) => (<div style={{ whiteSpace: "nowrap" }}>{text ? moment(text).format("D-M-YYYY HH:mm:ss") : "-"}</div>) },
{ title: 'Waktu Keluar', dataIndex: 'clock_out', key: 'clock_out', render: (text, record) => (<div style={{ whiteSpace: "nowrap" }}>{text ? moment(text).format("D-M-YYYY HH:mm:ss") : "-"}</div>) }, { title: t('presenceOut'), dataIndex: 'clock_out', key: 'clock_out', render: (text, record) => (<div style={{ whiteSpace: "nowrap" }}>{text ? moment(text).format("D-M-YYYY HH:mm:ss") : "-"}</div>) },
{ title: 'Durasi Kerja', render: (text, record) => (<div style={{ whiteSpace: "nowrap" }}>{renderDurasiKerja(record.clock_in, record.clock_out)}</div>) }, { title: t('workDuration'), render: (text, record) => (<div style={{ whiteSpace: "nowrap" }}>{renderDurasiKerja(record.clock_in, record.clock_out)}</div>) },
{ title: 'Lokasi Masuk', dataIndex: 'clock_in_loc', key: 'clock_in_loc', render: (text, record) => <>{text && text !== '' ? text : '-'}</> }, { title: t('locIn'), dataIndex: 'clock_in_loc', key: 'clock_in_loc', render: (text, record) => <>{text && text !== '' ? text : '-'}</> },
{ title: 'Lokasi Pulang', dataIndex: 'clock_out_loc', key: 'clock_out_loc', render: (text, record) => <>{text && text !== '' ? text : '-'}</> }, { title: t('locOut'), dataIndex: 'clock_out_loc', key: 'clock_out_loc', render: (text, record) => <>{text && text !== '' ? text : '-'}</> },
{ title: 'Area Kerja In', dataIndex: 'clock_out_loc', key: 'clock_out_loc', render: (text, record) => (<div style={{ whiteSpace: "nowrap", textAlign: "center" }}>{record.clock_in_boundary ? <i className="fa fa-check-circle fa-lg" style={{ color: 'green' }}></i> : <i className="fa fa-times-circle fa-lg" style={{ color: 'red' }}></i>}</div>) }, { title: t('workAreaIn'), dataIndex: 'clock_out_loc', key: 'clock_out_loc', render: (text, record) => (<div style={{ whiteSpace: "nowrap", textAlign: "center" }}>{record.clock_in_boundary ? <i className="fa fa-check-circle fa-lg" style={{ color: 'green' }}></i> : <i className="fa fa-times-circle fa-lg" style={{ color: 'red' }}></i>}</div>) },
{ title: 'Area Kerja Out', dataIndex: 'clock_out_loc', key: 'clock_out_loc', render: (text, record) => (<div style={{ whiteSpace: "nowrap", textAlign: "center" }}>{record.clock_out_boundary == null ? <i class="fa fa-window-minimize fa-lg" style={{ color: 'orange' }}></i> : record.clock_out_boundary ? <i className="fa fa-check-circle fa-lg" style={{ color: 'green' }}></i> : <i className="fa fa-times-circle fa-lg" style={{ color: 'red' }}></i>}</div>) }, { title: t('workAreaOut'), dataIndex: 'clock_out_loc', key: 'clock_out_loc', render: (text, record) => (<div style={{ whiteSpace: "nowrap", textAlign: "center" }}>{record.clock_out_boundary == null ? <i class="fa fa-window-minimize fa-lg" style={{ color: 'orange' }}></i> : record.clock_out_boundary ? <i className="fa fa-check-circle fa-lg" style={{ color: 'green' }}></i> : <i className="fa fa-times-circle fa-lg" style={{ color: 'red' }}></i>}</div>) },
]; ];
return ( return (
<Table <Table
@ -303,7 +299,7 @@ const Index = ({ params }) => {
<h4 className="capitalize">{pageName}</h4> <h4 className="capitalize">{pageName}</h4>
<Row> <Row>
<Col> <Col>
<Tooltip title="Export Excel"> <Tooltip title={t('exportExcel')}>
<Button style={{ marginLeft: "5px" }} id="TooltipExport" color="primary" onClick={() => handleExportExcel()}><i className="fa fa-print"></i></Button> <Button style={{ marginLeft: "5px" }} id="TooltipExport" color="primary" onClick={() => handleExportExcel()}><i className="fa fa-print"></i></Button>
</Tooltip> </Tooltip>
</Col> </Col>
@ -314,17 +310,17 @@ const Index = ({ params }) => {
<div style={{ width: "100%", display: "flex", alignItems: "center" }}> <div style={{ width: "100%", display: "flex", alignItems: "center" }}>
<div style={{ width: "100%", marginRight: "10px", maxWidth: "200px" }}> <div style={{ width: "100%", marginRight: "10px", maxWidth: "200px" }}>
<Input type="select" onChange={(e) => handleChangeDay(e)} defaultValue={currentDay}> <Input type="select" onChange={(e) => handleChangeDay(e)} defaultValue={currentDay}>
<option value="today">Hari Ini</option> <option value="today">{t('today')}</option>
<option value="3 day">3 Hari yang lalu</option> <option value="3 day">{t('3days')}</option>
<option value="7 day">7 Hari yang lalu</option> <option value="7 day">{t('7days')}</option>
</Input> </Input>
</div> </div>
<div style={{ width: "50%", marginTop: "3px" }}> <div style={{ width: "50%", marginTop: "3px" }}>
<RangePicker size="default" allowClear={false} value={[startDate, endDate]} onChange={handleDatePicker} />{' '} <RangePicker size="default" allowClear={false} value={[startDate, endDate]} onChange={handleDatePicker} />{' '}
<Button color="primary" onClick={() => getDataPresence()}>Cari</Button> <Button color="primary" onClick={() => getDataPresence()}>{t('search')}</Button>
</div> </div>
</div> </div>
<Input onChange={handleSearch} value={search} type="text" name="search" id="search" placeholder="Cari nama human resource" style={{ maxWidth: "200px", marginBottom: "20px" }} /> <Input onChange={handleSearch} value={search} type="text" name="search" id="search" placeholder={t('searchHR')} style={{ maxWidth: "200px", marginBottom: "20px" }} />
</div> </div>
{renderTable} {renderTable}
<Pagination <Pagination

13
src/views/SimproV2/ProjectType/DialogForm.js

@ -7,6 +7,7 @@ import { DatePicker, Tooltip, Select } from 'antd';
import { formatRupiah, formatNumber } from '../../../const/CustomFunc' import { formatRupiah, formatNumber } from '../../../const/CustomFunc'
import moment from 'moment'; import moment from 'moment';
import 'antd/dist/antd.css'; import 'antd/dist/antd.css';
import { useTranslation } from 'react-i18next';
const { Option } = Select const { Option } = Select
const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, dataEdit }) => { const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, dataEdit }) => {
@ -15,7 +16,7 @@ const DialogForm = ({openDialog, closeDialog, toggleDialog, typeDialog, dataEdit
const [uom, setUom] = useState('') const [uom, setUom] = useState('')
const [description, setDescription] = useState('') const [description, setDescription] = useState('')
const [unitPrice, setUnitPrice] = useState() const [unitPrice, setUnitPrice] = useState()
const { t } = useTranslation();
@ -74,14 +75,14 @@ const DialogForm = ({openDialog, closeDialog, toggleDialog, typeDialog, dataEdit
<Row> <Row>
<Col md={6}> <Col md={6}>
<FormGroup> <FormGroup>
<Label className="capitalize">Project Type</Label> <Label className="capitalize">{t('nameProjectType')}</Label>
<Input type="text" value={projectType} onChange={(e)=> setProjectType(e.target.value)} placeholder={`Input material name...`}/> <Input type="text" value={projectType} onChange={(e) => setProjectType(e.target.value)} placeholder={t('inputName')} />
</FormGroup> </FormGroup>
</Col> </Col>
<Col md={6}> <Col md={6}>
<FormGroup> <FormGroup>
<Label className="capitalize">Description</Label> <Label className="capitalize">{t('description')}</Label>
<Input row="4" type="textarea" value={description} onChange={(e)=> setDescription(e.target.value)} placeholder={`Description ...`} /> <Input row="4" type="textarea" value={description} onChange={(e) => setDescription(e.target.value)} placeholder={t('inputDescription')} />
</FormGroup> </FormGroup>
</Col> </Col>
</Row> </Row>
@ -99,7 +100,7 @@ const DialogForm = ({openDialog, closeDialog, toggleDialog, typeDialog, dataEdit
</ModalBody> </ModalBody>
<ModalFooter> <ModalFooter>
<Button color="primary" onClick={() => handleSave()}>{typeDialog}</Button>{' '} <Button color="primary" onClick={() => handleSave()}>{typeDialog}</Button>{' '}
<Button className="capitalize" color="secondary" onClick={() => handleCancel()}>Batal</Button> <Button className="capitalize" color="secondary" onClick={() => handleCancel()}>{t('cancel')}</Button>
</ModalFooter> </ModalFooter>
</Modal> </Modal>

26
src/views/SimproV2/ProjectType/DialogInitialGantt.js

@ -8,6 +8,7 @@ import SweetAlert from 'react-bootstrap-sweetalert';
import { TEMPLATE_GANTT_ADD, TEMPLATE_GANTT_DELETE, TEMPLATE_GANTT_EDIT, TEMPLATE_GANTT_TREE } from '../../../const/ApiConst'; import { TEMPLATE_GANTT_ADD, TEMPLATE_GANTT_DELETE, TEMPLATE_GANTT_EDIT, TEMPLATE_GANTT_TREE } from '../../../const/ApiConst';
import axios from "../../../const/interceptorApi" import axios from "../../../const/interceptorApi"
import DialogForm from './DialogFormInitial'; import DialogForm from './DialogFormInitial';
import { useTranslation } from 'react-i18next';
const DialogInitialGantt = ({ openDialog, closeDialog, toggleDialog, idTypeProject }) => { const DialogInitialGantt = ({ openDialog, closeDialog, toggleDialog, idTypeProject }) => {
const token = window.localStorage.getItem('token'); const token = window.localStorage.getItem('token');
@ -26,7 +27,7 @@ const DialogInitialGantt = ({ openDialog, closeDialog, toggleDialog, idTypeProje
const [openDialogForm, setOpenDialogForm] = useState(false) const [openDialogForm, setOpenDialogForm] = useState(false)
const [typeDialog, setTypeDialog] = useState("add") const [typeDialog, setTypeDialog] = useState("add")
const [dataEdit, setDataEdit] = useState([]) const [dataEdit, setDataEdit] = useState([])
const { t } = useTranslation();
useEffect(() => { useEffect(() => {
if (idTypeProject && idTypeProject > 0) { if (idTypeProject && idTypeProject > 0) {
getDataInitial(); getDataInitial();
@ -149,12 +150,12 @@ const DialogInitialGantt = ({ openDialog, closeDialog, toggleDialog, idTypeProje
className: "nowrap", className: "nowrap",
render: (text, record) => render: (text, record) =>
<> <>
<Tooltip title="Delete Activity"> <Tooltip title={t("delete")}>
<Button size="small" size={"sm"} color='danger' onClick={() => handleDelete(text.id)}><i className="fa fa-trash"></i></Button> <Button size="small" color='danger' onClick={() => handleDelete(text.id)}><i className="fa fa-trash"></i></Button>
</Tooltip>{" "}<Tooltip title="Add Activity"> </Tooltip>{" "}<Tooltip title={t("add")}>
<Button size="small" size={"sm"} color='primary' onClick={() => handleAddWithParent(text.id)}><i className="fa fa-plus"></i></Button> <Button size="small" color='primary' onClick={() => handleAddWithParent(text.id)}><i className="fa fa-plus"></i></Button>
</Tooltip>{" "}<Tooltip title="Edit Activity"> </Tooltip>{" "}<Tooltip title={t("edit")}>
<Button size="small" size={"sm"} color='warning' onClick={() => handleEdit(text)}><i className="fa fa-edit"></i></Button> <Button size="small" color='warning' onClick={() => handleEdit(text)}><i className="fa fa-edit"></i></Button>
</Tooltip> </Tooltip>
</> </>
, ,
@ -181,12 +182,12 @@ const DialogInitialGantt = ({ openDialog, closeDialog, toggleDialog, idTypeProje
showCancel showCancel
confirmBtnText="Delete" confirmBtnText="Delete"
confirmBtnBsStyle="danger" confirmBtnBsStyle="danger"
title={`Are you sure?`} title={t('deleteConfirm')}
onConfirm={onConfirmDelete} onConfirm={onConfirmDelete}
onCancel={cancelDelete} onCancel={cancelDelete}
focusCancelBtn focusCancelBtn
> >
Delete this data {t('deleteMsg')}
</SweetAlert> </SweetAlert>
<DialogForm <DialogForm
openDialog={openDialogForm} openDialog={openDialogForm}
@ -200,13 +201,16 @@ const DialogInitialGantt = ({ openDialog, closeDialog, toggleDialog, idTypeProje
<Modal size="lg" isOpen={openDialog} toggle={toggleDialog}> <Modal size="lg" isOpen={openDialog} toggle={toggleDialog}>
{/* <ModalHeader className="capitalize" toggle={closeDialog}>Initial Gantt</ModalHeader> */} {/* <ModalHeader className="capitalize" toggle={closeDialog}>Initial Gantt</ModalHeader> */}
<ModalHeader className="capitalize withBtn" toggle={closeDialog} style={{ width: "100%" }}> <ModalHeader className="capitalize withBtn" toggle={closeDialog} style={{ width: "100%" }}>
<div>Template Gantt</div> <Button onClick={handleAdd} size='sm' color="primary"><i className='fa fa-plus'></i></Button> <div>Template Gantt</div>
<Tooltip title={t("add")}>
<Button onClick={handleAdd} size='sm' color="primary"><i className='fa fa-plus'></i></Button>
</Tooltip>
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>
{renderTable} {renderTable}
</ModalBody> </ModalBody>
<ModalFooter> <ModalFooter>
<Button className="capitalize" color="secondary" onClick={closeDialog}>Close</Button> <Button className="capitalize" color="secondary" onClick={closeDialog}>{t('close')}</Button>
</ModalFooter> </ModalFooter>
</Modal> </Modal>
</> </>

31
src/views/SimproV2/ProjectType/index.js

@ -10,7 +10,8 @@ import { DownloadOutlined } from '@ant-design/icons';
import { NotificationContainer, NotificationManager } from 'react-notifications'; import { NotificationContainer, NotificationManager } from 'react-notifications';
import { PROJECT_TYPE_ADD, PROJECT_TYPE_EDIT, PROJECT_TYPE_DELETE, PROJECT_TYPE_SEARCH } from '../../../const/ApiConst'; import { PROJECT_TYPE_ADD, PROJECT_TYPE_EDIT, PROJECT_TYPE_DELETE, PROJECT_TYPE_SEARCH } from '../../../const/ApiConst';
import { Pagination, Button, Tooltip, Table } from 'antd'; import { Pagination, Button, Tooltip, Table } from 'antd';
import { useTranslation } from 'react-i18next';
import { handleChangeLng } from '../../../utils/LangUtils';
const url = ""; const url = "";
const proyek_id = localStorage.getItem('proyek_id'); const proyek_id = localStorage.getItem('proyek_id');
const role_id = localStorage.getItem('role_id'); const role_id = localStorage.getItem('role_id');
@ -54,7 +55,7 @@ const ProjectType = ({ params }) => {
const [search, setSearch] = useState('') const [search, setSearch] = useState('')
const [totalPage, setTotalPage] = useState(0) const [totalPage, setTotalPage] = useState(0)
const [typeDialog, setTypeDialog] = useState('Save') const [typeDialog, setTypeDialog] = useState('Save')
const { t } = useTranslation();
useEffect(() => { useEffect(() => {
getDataProjectType() getDataProjectType()
}, [currentPage, rowsPerPage, search]) }, [currentPage, rowsPerPage, search])
@ -286,7 +287,7 @@ const ProjectType = ({ params }) => {
if (dataTable.length === 0) { if (dataTable.length === 0) {
return ( return (
<tr> <tr>
<td align="center" colSpan="3">Tidak ada data project type</td> <td align="center" colSpan="3">{t('noData')}</td>
</tr> </tr>
) )
} }
@ -295,15 +296,15 @@ const ProjectType = ({ params }) => {
const renderTable = useMemo(() => { const renderTable = useMemo(() => {
const columns = [ const columns = [
{ {
title: 'Action', title: t('action'),
dataIndex: '', dataIndex: '',
key: 'x', key: 'x',
className: 'nowrap', className: 'nowrap',
render: (text, record) => <> render: (text, record) => <>
<Tooltip title="Delete"> <Tooltip title={t('delete')}>
<i className="fa fa-trash" style={{ color: 'red', marginRight: '10px', cursor: "pointer" }} onClick={() => handleDelete(text.id)}></i> <i className="fa fa-trash" style={{ color: 'red', marginRight: '10px', cursor: "pointer" }} onClick={() => handleDelete(text.id)}></i>
</Tooltip> </Tooltip>
<Tooltip title="Edit"> <Tooltip title={t('edit')}>
<i className="fa fa-edit" style={{ color: 'green', cursor: "pointer" }} onClick={() => handleEdit(text)}></i> <i className="fa fa-edit" style={{ color: 'green', cursor: "pointer" }} onClick={() => handleEdit(text)}></i>
</Tooltip>{" "} </Tooltip>{" "}
<Tooltip title="Template Gantt"> <Tooltip title="Template Gantt">
@ -311,8 +312,8 @@ const ProjectType = ({ params }) => {
</Tooltip> </Tooltip>
</>, </>,
}, },
{ title: 'Nama Role', dataIndex: 'name', key: 'name', className: "nowrap" }, { title: t('nameProjectType'), dataIndex: 'name', key: 'name', className: "nowrap" },
{ title: 'Description', dataIndex: 'description', key: 'description' }, { title: t('description'), dataIndex: 'description', key: 'description' },
]; ];
return ( return (
<Table <Table
@ -334,12 +335,12 @@ const ProjectType = ({ params }) => {
showCancel showCancel
confirmBtnText="Delete" confirmBtnText="Delete"
confirmBtnBsStyle="danger" confirmBtnBsStyle="danger"
title={`Are you sure?`} title={t('deleteConfirm')}
onConfirm={onConfirmDelete} onConfirm={onConfirmDelete}
onCancel={() => cancelDelete()} onCancel={() => cancelDelete()}
focusCancelBtn focusCancelBtn
> >
Delete this data {t('deleteMsg')}
</SweetAlert> </SweetAlert>
<DialogForm <DialogForm
openDialog={openDialog} openDialog={openDialog}
@ -361,13 +362,17 @@ const ProjectType = ({ params }) => {
<h4 className="capitalize">{pageName}</h4> <h4 className="capitalize">{pageName}</h4>
<Row> <Row>
<Col> <Col>
<Input onChange={handleSearch} value={search} type="text" name="search" id="search" placeholder={`Search project type...`} /> <button onClick={() => handleChangeLng("en")}>EN</button>
<button onClick={() => handleChangeLng("id")}>ID</button>
</Col>
<Col>
<Input onChange={handleSearch} value={search} type="text" name="search" id="search" placeholder={t('searchType')} />
</Col> </Col>
<Col> <Col>
<Tooltip title="Add Material Resource"> <Tooltip title={t('projectType')}>
<Button style={{ background: "#4caf50", color: "#fff" }} onClick={() => handleOpenDialog('Save')}><i className="fa fa-plus"></i></Button> <Button style={{ background: "#4caf50", color: "#fff" }} onClick={() => handleOpenDialog('Save')}><i className="fa fa-plus"></i></Button>
</Tooltip> </Tooltip>
<Tooltip title="Export Excel"> <Tooltip title={t('exportExcel')}>
<Button style={{ marginLeft: "5px" }} onClick={() => handleExportExcel()}><i className="fa fa-print"></i></Button> <Button style={{ marginLeft: "5px" }} onClick={() => handleExportExcel()}><i className="fa fa-print"></i></Button>
</Tooltip> </Tooltip>
</Col> </Col>

13
src/views/SimproV2/Satuan/DialogForm.js

@ -4,13 +4,14 @@ import {
Button, Form, FormGroup, Label, Input, Col, Row Button, Form, FormGroup, Label, Input, Col, Row
} from 'reactstrap'; } from 'reactstrap';
import 'antd/dist/antd.css'; import 'antd/dist/antd.css';
import { useTranslation } from 'react-i18next';
const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, dataEdit }) => { const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, dataEdit }) => {
const [id, setId] = useState(0) const [id, setId] = useState(0)
const [name, setName] = useState('') const [name, setName] = useState('')
const [description, setDescription] = useState('') const [description, setDescription] = useState('')
const { t } = useTranslation()
useEffect(() => { useEffect(() => {
@ -60,14 +61,14 @@ const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, dataEdi
<Row> <Row>
<Col md={6}> <Col md={6}>
<FormGroup> <FormGroup>
<Label className="capitalize">Name</Label> <Label className="capitalize">{t('name')}</Label>
<Input type="text" value={name} onChange={(e) => setName(e.target.value)} placeholder={`Input name...`} /> <Input type="text" value={name} onChange={(e) => setName(e.target.value)} placeholder={t('inputName')} />
</FormGroup> </FormGroup>
</Col> </Col>
<Col md={6}> <Col md={6}>
<FormGroup> <FormGroup>
<Label className="capitalize">Description</Label> <Label className="capitalize">Description</Label>
<Input row="4" type="textarea" value={description} onChange={(e) => setDescription(e.target.value)} placeholder={`Description ...`} /> <Input row="4" type="textarea" value={description} onChange={(e) => setDescription(e.target.value)} placeholder={t('inputDescription')} />
</FormGroup> </FormGroup>
</Col> </Col>
</Row> </Row>
@ -79,13 +80,13 @@ const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, dataEdi
return ( return (
<> <>
<Modal size="lg" isOpen={openDialog} toggle={toggleDialog}> <Modal size="lg" isOpen={openDialog} toggle={toggleDialog}>
<ModalHeader className="capitalize" toggle={closeDialog}>{typeDialog == "Save" ? `Add` : "Edit"} Resource</ModalHeader> <ModalHeader className="capitalize" toggle={closeDialog}>{typeDialog == "Save" ? `Add` : "Edit"} {'uom'}</ModalHeader>
<ModalBody> <ModalBody>
{renderForm()} {renderForm()}
</ModalBody> </ModalBody>
<ModalFooter> <ModalFooter>
<Button color="primary" onClick={() => handleSave()}>{typeDialog}</Button>{' '} <Button color="primary" onClick={() => handleSave()}>{typeDialog}</Button>{' '}
<Button className="capitalize" color="secondary" onClick={() => handleCancel()}>Batal</Button> <Button className="capitalize" color="secondary" onClick={() => handleCancel()}>{t('cancel')}</Button>
</ModalFooter> </ModalFooter>
</Modal> </Modal>
</> </>

30
src/views/SimproV2/Satuan/index.js

@ -7,6 +7,7 @@ import { Card, CardBody, CardHeader, Col, Row, Input, Table } from 'reactstrap';
import { NotificationContainer, NotificationManager } from 'react-notifications'; import { NotificationContainer, NotificationManager } from 'react-notifications';
import { Pagination, Button, Tooltip } from 'antd'; import { Pagination, Button, Tooltip } from 'antd';
import { SATUAN_ADD, SATUAN_EDIT, SATUAN_DELETE, SATUAN_SEARCH } from '../../../const/ApiConst'; import { SATUAN_ADD, SATUAN_EDIT, SATUAN_DELETE, SATUAN_SEARCH } from '../../../const/ApiConst';
import { useTranslation } from 'react-i18next';
const token = window.localStorage.getItem('token'); const token = window.localStorage.getItem('token');
const config = { const config = {
@ -17,11 +18,6 @@ const config = {
} }
}; };
const column = [
{ name: "Nama" },
{ name: "Deskripsi" },
]
const Satuan = ({ params }) => { const Satuan = ({ params }) => {
const token = localStorage.getItem("token") const token = localStorage.getItem("token")
const HEADER = { const HEADER = {
@ -45,7 +41,7 @@ const Satuan = ({ params }) => {
const [search, setSearch] = useState('') const [search, setSearch] = useState('')
const [totalPage, setTotalPage] = useState(0) const [totalPage, setTotalPage] = useState(0)
const [typeDialog, setTypeDialog] = useState('Save') const [typeDialog, setTypeDialog] = useState('Save')
const { t } = useTranslation()
useEffect(() => { useEffect(() => {
getDataSatuan() getDataSatuan()
}, [currentPage, rowsPerPage, search]) }, [currentPage, rowsPerPage, search])
@ -57,6 +53,10 @@ const Satuan = ({ params }) => {
} }
}, [dataExport]) }, [dataExport])
const column = [
{ name: t('name') },
{ name: t('description') },
]
const getDataSatuan = async () => { const getDataSatuan = async () => {
let start = 0; let start = 0;
@ -243,7 +243,7 @@ const Satuan = ({ params }) => {
if (dataTable.length === 0) { if (dataTable.length === 0) {
return ( return (
<tr> <tr>
<td align="center" colSpan="3">Tidak ada data project type</td> <td align="center" colSpan="3">{t('noData')}</td>
</tr> </tr>
) )
} }
@ -258,12 +258,12 @@ const Satuan = ({ params }) => {
showCancel showCancel
confirmBtnText="Delete" confirmBtnText="Delete"
confirmBtnBsStyle="danger" confirmBtnBsStyle="danger"
title={`Are you sure?`} title={t('deleteConfirm')}
onConfirm={onConfirmDelete} onConfirm={onConfirmDelete}
onCancel={() => cancelDelete()} onCancel={() => cancelDelete()}
focusCancelBtn focusCancelBtn
> >
Delete this data {t('deleteMsg')}
</SweetAlert> </SweetAlert>
<DialogForm <DialogForm
openDialog={openDialog} openDialog={openDialog}
@ -279,13 +279,13 @@ const Satuan = ({ params }) => {
<h4 className="capitalize">{pageName}</h4> <h4 className="capitalize">{pageName}</h4>
<Row> <Row>
<Col> <Col>
<Input onChange={handleSearch} value={search} type="text" name="search" id="search" placeholder={`Pencarian`} /> <Input onChange={handleSearch} value={search} type="text" name="search" id="search" placeholder={t('searchUom')} />
</Col> </Col>
<Col> <Col>
<Tooltip title="Add UOM"> <Tooltip title={t('uomAdd')}>
<Button style={{ background: "#4caf50", color: "#fff" }} onClick={() => handleOpenDialog('Save')}><i className="fa fa-plus"></i></Button> <Button style={{ background: "#4caf50", color: "#fff" }} onClick={() => handleOpenDialog('Save')}><i className="fa fa-plus"></i></Button>
</Tooltip> </Tooltip>
<Tooltip title="Export Excel"> <Tooltip title={t('exportExcel')}>
<Button style={{ marginLeft: "5px" }} color="primary" onClick={() => handleExportExcel()}><i className="fa fa-print"></i></Button> <Button style={{ marginLeft: "5px" }} color="primary" onClick={() => handleExportExcel()}><i className="fa fa-print"></i></Button>
</Tooltip> </Tooltip>
</Col> </Col>
@ -295,7 +295,7 @@ const Satuan = ({ params }) => {
<Table responsive striped hover> <Table responsive striped hover>
<thead> <thead>
<tr> <tr>
<th>Aksi</th> <th>{t('action')}</th>
{column.map((i, index) => { {column.map((i, index) => {
return ( return (
<th key={index} scope="row">{i.name}</th> <th key={index} scope="row">{i.name}</th>
@ -310,11 +310,11 @@ const Satuan = ({ params }) => {
<tr key={n.id}> <tr key={n.id}>
<td className='nowrap'> <td className='nowrap'>
<Tooltip title="Hapus"> <Tooltip title={t('delete')}>
<i id="TooltipDelete" className="fa fa-trash" style={{ color: 'red', marginRight: 10, cursor: "pointer" }} onClick={() => handleDelete(n.id)}></i> <i id="TooltipDelete" className="fa fa-trash" style={{ color: 'red', marginRight: 10, cursor: "pointer" }} onClick={() => handleDelete(n.id)}></i>
</Tooltip> </Tooltip>
<Tooltip title="Edit"> <Tooltip title={t('ubah')}>
<i id="TooltipEdit" className="fa fa-edit" style={{ color: 'green', cursor: "pointer" }} onClick={() => handleEdit(n)}></i> <i id="TooltipEdit" className="fa fa-edit" style={{ color: 'green', cursor: "pointer" }} onClick={() => handleEdit(n)}></i>
</Tooltip> </Tooltip>
</td> </td>

Loading…
Cancel
Save