From 399f6cf846fcfb63b045e096bb58a23b12a1d922 Mon Sep 17 00:00:00 2001 From: farhan048 Date: Tue, 21 Feb 2023 13:49:58 +0700 Subject: [PATCH] update Translate and profile, Setting Page --- src/App.js | 34 +- src/assets/img/profile.png | Bin 0 -> 36073 bytes src/const/en.json | 72 +++- src/const/i18n.js | 28 +- src/const/id.json | 75 +++- src/containers/DefaultLayout/DefaultLayout.js | 57 +-- src/routes.js | 7 +- src/utils/LangUtils.js | 3 +- src/views/Dashboard/DashboardBOD.js | 2 +- .../Master/MasterBroadcast/DialogDetail.js | 104 ++--- .../Master/MasterBroadcast/DialogForm.js | 277 ++++++------- src/views/Master/MasterBroadcast/index.js | 372 +++++++++--------- src/views/Master/MasterRoles/index.js | 19 +- src/views/Report/k3/index.js | 11 +- src/views/SimproV2/PanicButton/index.js | 235 +++++------ src/views/SimproV2/ProjectType/index.js | 4 +- .../SimproV2/ResourceMaterial/DialogForm.js | 72 ++-- src/views/SimproV2/ResourceMaterial/index.js | 101 ++--- .../ResourceTools/DialogEditReqTools.js | 39 +- .../SimproV2/ResourceTools/DialogForm.js | 32 +- src/views/SimproV2/ResourceTools/index.js | 76 ++-- src/views/SimproV2/ResourceWorker/index.js | 30 +- src/views/SimproV2/Settings/DialogForm.js | 265 +++++++++++++ src/views/SimproV2/Settings/index.js | 257 ++++++++++++ 24 files changed, 1436 insertions(+), 736 deletions(-) create mode 100644 src/assets/img/profile.png create mode 100644 src/views/SimproV2/Settings/DialogForm.js create mode 100644 src/views/SimproV2/Settings/index.js diff --git a/src/App.js b/src/App.js index 357336a..5125e75 100644 --- a/src/App.js +++ b/src/App.js @@ -5,7 +5,7 @@ import 'react-notifications/lib/notifications.css'; import { Provider } from 'react-redux'; import { PersistGate } from 'redux-persist/integration/react'; import { persistor, store } from './appredux/store'; - +import { handleChangeLng } from "../src/utils/LangUtils"; const loading = () =>
Loading...
; const DefaultLayout = React.lazy(() => import('./containers/DefaultLayout')); @@ -22,22 +22,22 @@ class App extends Component { render() { return ( - - - - } /> - {/* } /> */} - } /> - } /> - } /> - } /> - } /> - {/* } />*/} - {/* } />*/} - } /> - - - + + + + } /> + {/* } /> */} + } /> + } /> + } /> + } /> + } /> + {/* } />*/} + {/* } />*/} + } /> + + + ); } diff --git a/src/assets/img/profile.png b/src/assets/img/profile.png new file mode 100644 index 0000000000000000000000000000000000000000..b398aa2a458da8cfbda422025510d22e9e664d64 GIT binary patch literal 36073 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 { + localStorage.setItem("language", lng); +}); + +export default i18n; diff --git a/src/const/id.json b/src/const/id.json index 35863af..3d63238 100644 --- a/src/const/id.json +++ b/src/const/id.json @@ -3,13 +3,30 @@ "7days": "7 Hari Yang lalu", "action": "Aksi", "add": "Tambah", + "address": "Alamat", + "all": "Semua", + "assetType": "Tipe Aset", + "broadcastAdd": "Tambah Pesan Siaran", + "broadcastDetail": "Detail Pesan Siaran", + "broadcastDescription": "Deskripsi Pesan Siaran", + "birthPlace": "Tempat Lahir", + "birthDate": "Tanggal Lahir", "ChecklistK3Add": "Tambah Ceklis K3", "cancel": "Batal", "close": "Tutup", "color": "Warna", "date": "Tanggal", + "dateSend": "Tanggal Kirim", "dateAbsent": "Tanggal Absen", "dateReport": "Tanggal Lapor", + "dateRequired": "Tanggal Permintaan", + "dateFOM": "Tanggal FOM", + "datePR": "Tanggal PR", + "datePO": "Tanggal PO", + "dateDelivery": "Tanggal Pengiriman", + "dateReceived": "Tanggal Penerimaan", + "dateDeliverySite": "Tanggal Pengiriman ke Lokasi", + "dateReceivedWerehouse": "Tanggal Penerimaan ke Gudang", "delete": "Hapus", "deleteMsg": "Hapus Data Ini ?", "deleteConfirm": "Apakah Anda Yakin ?", @@ -20,41 +37,80 @@ "export": "Ekspor", "exportExcel": "Ekspor Excel", "exportPdf": "Ekspor Pdf", + "employeeType": "Tipe Pegawai", "gearUse": "Perlengkapan Dikenakan", "gearNotUse": "Perlengkapan Tidak Dikenakan", + "gender": "Jenis Kelamin", "hr": "Pegawai", + "hradd": "Tambah Pegawai", "icon": "Ikon", "inputIcon": "Masukan Kode Ikon", "inputName": "Masukan Nama", + "inputaddress": "Masukan Alamat", + "inputBrithPlace": "Masukan Tempat Lahir", + "inputBrithDate": "Pilih Tanggal Lahir", "inputDescription": "Masukan Deskripsi", "inputParentMenu": "Pilih Induk Menu", "inputAliasMenu": "Masukan Alias Menu", "inputOrder": "Masukan Urutan", "inputUrl": "Masukan URL", + "inputMsg": "Masukan Pesan", + "inputTitle": "Masukan Judul", + "inputUOM": "Masukan Satuan", + "inputAsset": "Masukan Aset", + "inputQTY": "Masukan Satuan", + "inputQtyReceived": "Masukan Kuantitas Yang Diterima", + "inputUnitPrice": "Masukan Harga Satuan", + "inputPrice": "Masukan Harga", + "inputEmail": "Masukan Email", + "inputNoPhone": "Masukan No Telp", + "inputNik": "Masukan NIK (KTP)", "image": "Gambar", "imageCheck": "Lihat Selfie Presensi", "locIn": "Lokasi Masuk", "locOut": "Lokasi Pulang", "menuRoles": "Menu Peran", "menuAdd": "Tambah Menu", - "nik": "NIK", + "map": "Peta", + "materialResource": "Manajemen Material", + "materialRequest": "Permintaan Material", + "materialDelivery": "Pengiriman Material Ke Lokasi", + "message": "Pesan", + "messageBroadcast": "Pesan Siaran", + "messageNotification": "Pesan Notifikasi", + "nik": "NIK (KTP/ID Card)", "nameDivision": "Nama Divisi", "name": "Nama", "nameHR": "Nama Pegawai", "nameRole": "Nama Peran", "nameProjectType": "Tipe Proyek", "nameProjectRole": "Peran Proyek", + "nameAsset": "Nama Aset", "noData": "Data Belum tersedia", "order": "Urutan", + "own": "Milik Sendiri", + "ownershipStatus": "Status Kepemilikan", + "ownershipName": "Nama Pemilik", "parentMenu": "Menu Induk", "phase": "Fase Proyek", "projectType": "Tambah Tipe Proyek", "projectPhase": "Tambah Fase Proyek", "presenceIn": "Waktu Masuk", "presenceOut": "Waktu Pulang", + "panicButton": "Tombol Panik", + "price": "Harga", + "qty": "Kuantitas", + "qtyReceived": "Kuantitas Diterima", + "retryPassword": "Konfirmasi Password", + "required": "Wajib Diisi", + "rent": "Sewa", "rolesAdd": "Tambah Roles", "roles": "Peran", + "receiver": "Penerima", + "resourceToolsAdd": "Tambah Data Alat", + "restrictions": "Pembatasan Area Kerja", "save": "Simpan", + "saveSend": "Simpan & Kirim", "search": "Cari", "searchType": "Cari Tipe Proyek", "searchPhase": "Cari Fase Proyek", @@ -66,9 +122,26 @@ "searchProject": "Semua / Pilih Proyek", "searchMenu": "Cari Menu", "searchHR": "Cari Nama Pegawai", + "searchToolsRequest": "Cari Permintaan Alat", + "searchToolsDelivery": "Cari Pengiriman Alat", + "searchTools": "Cari Alat", + "searchMaterial": "Cari Material", + "statusResponse": "Status Respon", + "statusSend": "Status Kirim", + "selectOwnershipStatus": "Pilih Status Kepemilikan", + "selectRole": "Pilih Peran", + "selectDivision": "Pilih Divisi", + "selectGender": "Pilih Jenis Kelamin", "today": "Hari Ini", + "title": "Judul", + "titleNotification": "Judul Notifikasi", + "toolsRequest": "Permintaan Alat", + "toolsResource": "Manajemen Alat", + "toolsDelivery": "Pengiriman Alat", + "user": "Pengguna", "uom": "Satuan", "uomAdd": "Tambah Satuan", + "unitPrice": "Harga Satuan", "workDuration": "Durasi Kerja", "workAreaIn": "Area Kerja In", "workAreaOut": "Area Kerja Out" diff --git a/src/containers/DefaultLayout/DefaultLayout.js b/src/containers/DefaultLayout/DefaultLayout.js index 17045f1..8796a91 100644 --- a/src/containers/DefaultLayout/DefaultLayout.js +++ b/src/containers/DefaultLayout/DefaultLayout.js @@ -1,10 +1,10 @@ import React, { Component, Suspense, Divider } from 'react'; import { Redirect, Route, Switch } from 'react-router-dom'; import * as router from 'react-router-dom'; -import { Container } from 'reactstrap'; +import { Badge, Container, UncontrolledDropdown, DropdownItem, DropdownMenu, DropdownToggle, Nav, NavItem } from 'reactstrap'; import axios from 'axios'; import { ALERTUSER_SEARCH, ALERT_SEARCH, MENU_SEARCH, ROLEMENU_SEARCH, ALERTUSER_STATUSVIEW, ALERT_STATUSVIEW, MENU_MANAGEMENT, CONTROL_MONITORING_SEARCH } from '../../const/ApiConst'; - +import user_logo from '../../assets/img/avatars/user.png' import { AppAside, AppFooter, @@ -51,7 +51,7 @@ class DefaultLayout extends Component { const menu = localStorage.getItem("menu_login") if (menu) this.setMenu(JSON.parse(menu)) this.getAppBreadcrumb(); - if(!localStorage.getItem("token")){ + if (!localStorage.getItem("token")) { this.signOut(); } } @@ -92,14 +92,14 @@ class DefaultLayout extends Component { loading = () =>
Loading...
- async signOut(e) { - if (e) { - e.preventDefault() - } - await localStorage.removeItem("role_id"); - await window.localStorage.clear(); - this.props.history.replace('/login') + async signOut(e) { + if (e) { + e.preventDefault() } + await localStorage.removeItem("role_id"); + await window.localStorage.clear(); + this.props.history.replace('/login') + } getDataMenu = async () => { errorCount++; @@ -212,7 +212,7 @@ class DefaultLayout extends Component { }); } else { - if (!window.location.href.includes("dashboard")){ + if (!window.location.href.includes("dashboard")) { return } } @@ -238,18 +238,27 @@ class DefaultLayout extends Component { {/* this.signOut(e)} /> */} {/* */} {/* */} -
+
{this.getMenu()} -
  • - this.signOut(e)}> + + {/* this.signOut(e)}> Logout - -
  • + */} + + + {/* siopas_user */} + {localStorage.getItem('user_name')} + + + Settings + this.signOut(e)}> Logout + +
    @@ -269,7 +278,7 @@ class DefaultLayout extends Component { )} /> ) : (null); })} - + @@ -281,13 +290,13 @@ class DefaultLayout extends Component { {!this.isKominfo ? - ( - - - - - - ) : null + ( + + + + + + ) : null } ); diff --git a/src/routes.js b/src/routes.js index cd38e1e..bd565bb 100644 --- a/src/routes.js +++ b/src/routes.js @@ -47,12 +47,12 @@ const DashboardBOD = React.lazy(() => import('./views/Dashboard/DashboardBOD')); const DashboardCustomer = React.lazy(() => import('./views/Dashboard/DashboardCustomer')); const DashboardProject = React.lazy(() => import('./views/Dashboard/DashboardProject')); const MapMonitoring = React.lazy(() => import('./views/MapMonitoring')); - +const Settings = React.lazy(() => import('./views/SimproV2/Settings')); const routes = [ { path: '/', exact: true, name: 'Home' }, // { path: '/dashboard', name: 'Dashboard', component: Dashboard}, - { path: '/dashboard', name: 'DashboardBOD', component: DashboardBOD}, - { path: '/dashboard-customer/:PROJECT_ID/:GANTT_ID', name: 'DashboardCustomer', component: DashboardCustomer}, + { path: '/dashboard', name: 'DashboardBOD', component: DashboardBOD }, + { path: '/dashboard-customer/:PROJECT_ID/:GANTT_ID', name: 'DashboardCustomer', component: DashboardCustomer }, { path: '/dashboard-project/:PROJECT_ID/:GANTT_ID', exact: true, name: 'Dashboard Project', component: DashboardProject }, { path: '/projects', exact: true, name: 'Projects', component: CreatedProyek }, { path: '/projects/:id/:project/gantt', exact: true, name: 'Gantt', component: Gantt }, @@ -102,6 +102,7 @@ const routes = [ { path: '/working-hour', exact: true, name: 'Working Hour', component: Shift }, { path: '/map-monitoring', exact: true, name: 'Map Monitoring', component: MapMonitoring }, // { path: '/dashboard-project/:ID/:GANTTID', exact: true, name: 'Dashboard Project', component: DashboardProject }, + { path: '/settings', exact: true, name: 'Settings', component: Settings }, ]; export default routes; diff --git a/src/utils/LangUtils.js b/src/utils/LangUtils.js index ef1f15f..b518490 100644 --- a/src/utils/LangUtils.js +++ b/src/utils/LangUtils.js @@ -1,6 +1,7 @@ import i18n from "../const/i18n"; export const handleChangeLng = (lng) => { + console.log("Changing language to:", lng); i18n.changeLanguage(lng); localStorage.setItem("lng", lng); -}; \ No newline at end of file +}; diff --git a/src/views/Dashboard/DashboardBOD.js b/src/views/Dashboard/DashboardBOD.js index 39797b4..5f67336 100644 --- a/src/views/Dashboard/DashboardBOD.js +++ b/src/views/Dashboard/DashboardBOD.js @@ -318,7 +318,7 @@ const DashboardBOD = () => { tableData.push({ "id": item.id, "last_gantt_id": item.lastGanttId?.last_gantt_id, - "kode_sortname": item.kode_sortname?.kode_sortname ? item.kode_sortname : "-", + "kode_sortname": item.kode_sortname ? item.kode_sortname : "-", "project_name": item.nama, "project_manager": item.pm?.name, "planned_interval": `${item.mulai_proyek ? moment(item.mulai_proyek).format('DD/MM/YYYY') : '-'} - ${item.akhir_proyek ? moment(item.akhir_proyek).format('DD/MM/YYYY') : '-'}`, diff --git a/src/views/Master/MasterBroadcast/DialogDetail.js b/src/views/Master/MasterBroadcast/DialogDetail.js index f1da7f7..80d73be 100644 --- a/src/views/Master/MasterBroadcast/DialogDetail.js +++ b/src/views/Master/MasterBroadcast/DialogDetail.js @@ -6,19 +6,20 @@ import Select from 'react-select'; import axios from 'axios'; import { BASE_URL_GEOHR_API } from '../../../const/ApiConst'; import { Transfer } from 'antd'; +import { withTranslation } from 'react-i18next'; const ERROR_TITLE = "judul is required!" const ERROR_MESSAGE = "message is required!" const BASE_URL = "https://oslog.id/geohr-api/"; let countError = 0; -export default class DialogDetail extends Component { +class DialogDetail extends Component { constructor(props) { super(props) - this.state = { + this.state = { openDialog: false, isParentClick: false, - dataListDetail:[], - id:0, + dataListDetail: [], + id: 0, } } @@ -31,8 +32,8 @@ export default class DialogDetail extends Component { const { dataDetail } = this.props console.log("cek data detail", dataDetail) this.setState({ - id:dataDetail.id - },() => { + id: dataDetail.id + }, () => { this.getDataDetail(); this.setState({ isParentClick: false }); }); @@ -41,38 +42,38 @@ export default class DialogDetail extends Component { getDataDetail = async () => { countError++; - let url = BASE_URL_GEOHR_API+`/broadcast-detail/search?broadcastId=${this.state.id}`; + let url = BASE_URL_GEOHR_API + `/broadcast-detail/search?broadcastId=${this.state.id}`; const payload = { - "paging": {"start": 0, "length": 25}, - "orders": {"columns": ["id"], "ascending": true}, - "columns": [ - {"name": "status_send", "logic_operator": "ilike", "value":"", "operator": "AND"} - ], - "joins": [ - {"name": "m_broadcast", "column_results": ["title_notif","message_notif","description","status_send"], "column_join":"broadcast_id"} - ] + "paging": { "start": 0, "length": 25 }, + "orders": { "columns": ["id"], "ascending": true }, + "columns": [ + { "name": "status_send", "logic_operator": "ilike", "value": "", "operator": "AND" } + ], + "joins": [ + { "name": "m_broadcast", "column_results": ["title_notif", "message_notif", "description", "status_send"], "column_join": "broadcast_id" } + ] } const result = await axios - .post(url,payload) + .post(url, payload) .then(res => res) - .catch((error) => error.response ); - console.log('cek data detail', result.data) + .catch((error) => error.response); + console.log('cek data detail', result.data) - if(result && result.data && result.data.code === 200){ - if (result.data.data && result.data.data.broadcast_details) { - this.setState({ dataListDetail:result.data.data.broadcast_details }) - } - }else{ - if(countError<6){ - this.getDataDetail(); - } + if (result && result.data && result.data.code === 200) { + if (result.data.data && result.data.data.broadcast_details) { + this.setState({ dataListDetail: result.data.data.broadcast_details }) } + } else { + if (countError < 6) { + this.getDataDetail(); + } + } } showDialog = () => { this.setState({ isParentClick: true }); } - + handleCloseDialog = () => { this.props.closeDialog() } @@ -80,38 +81,39 @@ export default class DialogDetail extends Component { render() { return ( - Detail Broadcast + {this.props.t('broadcastDetail')} - - +
    + - - - - - + + + + + - - - {this.state.dataListDetail.map((val, index) => { - return( - - - - - - - + + + {this.state.dataListDetail.map((val, index) => { + return ( + + + + + + + ) - })} - -
    Status SendTanggal KirimDeskripsiJudul NotifikasiPesan Notifikasi{this.props.t('statusSend')}{this.props.t('dateSend')}{this.props.t('description')}{this.props.t('titleNotification')}{this.props.t('messageNotification')}
    {val.join.status_send==="" ? "-" :val.status_send}{val.join.created_date==="" ? "-" : moment(val.created_date).format("YYYY-MM-DD HH:mm:ss")}{val.join.broadcast_description==="" ? "-" : val.join.broadcast_description}{val.join.broadcast_title_notif==="" ? "-" : val.join.broadcast_title_notif}{val.join.broadcast_message_notif==="" ? "-" : val.join.broadcast_message_notif}
    {val.join.status_send === "" ? "-" : val.status_send}{val.join.created_date === "" ? "-" : moment(val.created_date).format("YYYY-MM-DD HH:mm:ss")}{val.join.broadcast_description === "" ? "-" : val.join.broadcast_description}{val.join.broadcast_title_notif === "" ? "-" : val.join.broadcast_title_notif}{val.join.broadcast_message_notif === "" ? "-" : val.join.broadcast_message_notif}
    - + })} + + +
    - +
    ) } } +export default withTranslation()(DialogDetail); \ No newline at end of file diff --git a/src/views/Master/MasterBroadcast/DialogForm.js b/src/views/Master/MasterBroadcast/DialogForm.js index bee164d..c114a4d 100644 --- a/src/views/Master/MasterBroadcast/DialogForm.js +++ b/src/views/Master/MasterBroadcast/DialogForm.js @@ -5,15 +5,16 @@ import Select from 'react-select'; import axios from 'axios'; import { BASE_URL_GEOHR_API2, ROLE_SEARCH, USER_WASPANG } from '../../../const/ApiConst'; import { Transfer } from 'antd'; +import { withTranslation } from 'react-i18next'; const token = window.localStorage.getItem('token'); const config = { - headers: - { - Authorization : `Bearer ${token}`, - "Content-type" : `application/json` + headers: + { + Authorization: `Bearer ${token}`, + "Content-type": `application/json` } }; @@ -23,7 +24,7 @@ const ERROR_MESSAGE = "message is required!" const BASE_URL = "https://oslog.id/geohr-api/"; const roleName = window.localStorage.getItem('role_name'); let countError = 0; -export default class DialogForm extends Component { +class DialogForm extends Component { constructor(props) { super(props) this.state = { @@ -37,7 +38,7 @@ export default class DialogForm extends Component { errorMessage: "", errorDivision: "", errorEmployee: "", - penerima:"all", + penerima: "all", displayKaryawan: "none", displayDivisi: "none", listOrganizationSelect: [], @@ -45,12 +46,12 @@ export default class DialogForm extends Component { dataEmployee: [], dataSourceEmployee: [], idOrganization: 0, - targetKeys:[], + targetKeys: [], selectedKeys: [], - allEmployeeId:[], + allEmployeeId: [], idEmployeeDivision: [], - idOrganization:[], - disableTransfer:true + idOrganization: [], + disableTransfer: true } } @@ -86,7 +87,7 @@ export default class DialogForm extends Component { showDialog = () => { this.setState({ isParentClick: true }); } - + validate = () => { @@ -109,12 +110,12 @@ export default class DialogForm extends Component { this.setState({ errorMessage: "message minimum 3-200 karakter!" }) } - if(penerima=== "division"){ - if(this.state.idOrganization===0){ + if (penerima === "division") { + if (this.state.idOrganization === 0) { this.setState({ errorDivision: "Silahkan pilih divisi penerima!" }) } - }else if(penerima==="karyawan"){ - if(this.state.selectedKeys.length===0){ + } else if (penerima === "karyawan") { + if (this.state.selectedKeys.length === 0) { this.setState({ errorEmployee: "Silahkan pilih karyawan penerima!" }) } } @@ -133,18 +134,18 @@ export default class DialogForm extends Component { let idSend = []; let send_to_type = "all"; - if(penerima==="all"){ + if (penerima === "all") { idSend = this.state.allEmployeeId; send_to_type = "all"; - }else if(penerima==="division"){ + } else if (penerima === "division") { idSend = this.state.idOrganization; send_to_type = "roles"; - }else if(penerima==="karyawan"){ + } else if (penerima === "karyawan") { idSend = this.state.targetKeys; send_to_type = "users"; } - idSend = idSend.map(function(e){ + idSend = idSend.map(function (e) { return e.toString() }); @@ -153,13 +154,13 @@ export default class DialogForm extends Component { description, message, send_to_type, - id:idSend + id: idSend } if (param === 'registered' || param === 'send') { this.props.handleSaveBroadcast(param, data) } - this.setState({ id: 0,idOrganization:0,currentSelectDiv:null,targetKeys:[],penerima:"all",displayKaryawan:"none",displayDivisi:"none",disableTransfer:true }); + this.setState({ id: 0, idOrganization: 0, currentSelectDiv: null, targetKeys: [], penerima: "all", displayKaryawan: "none", displayDivisi: "none", disableTransfer: true }); } } @@ -168,18 +169,18 @@ export default class DialogForm extends Component { } handleChangePenerima = type => { - if(type==="organization"){ - this.setState({ displayDivisi:"block",displayKaryawan:"none",disableTransfer:true,errorDivision:"",targetKeys:[] }) - }else if(type==="karyawan"){ - this.setState({ displayKaryawan:"block",displayDivisi:"none",disableTransfer:false,errorEmployee:"",idEmployeeDivision:[],currentSelectDiv:null }) - }else{ - this.setState({ displayKaryawan:"none",displayDivisi:"none",disableTransfer:true,errorDivision:"",errorEmployee:"",targetKeys:[],idEmployeeDivision:[],currentSelectDiv:null }) + if (type === "organization") { + this.setState({ displayDivisi: "block", displayKaryawan: "none", disableTransfer: true, errorDivision: "", targetKeys: [] }) + } else if (type === "karyawan") { + this.setState({ displayKaryawan: "block", displayDivisi: "none", disableTransfer: false, errorEmployee: "", idEmployeeDivision: [], currentSelectDiv: null }) + } else { + this.setState({ displayKaryawan: "none", displayDivisi: "none", disableTransfer: true, errorDivision: "", errorEmployee: "", targetKeys: [], idEmployeeDivision: [], currentSelectDiv: null }) } - this.setState({ penerima:type }); + this.setState({ penerima: type }); } handleSelectOrganization = (inputValue, actionMeta) => { - this.setState({ idOrganization:inputValue.value,currentSelectDiv:{ value:inputValue.value,label:inputValue.label },errorDivision:"" }, () => { + this.setState({ idOrganization: inputValue.value, currentSelectDiv: { value: inputValue.value, label: inputValue.label }, errorDivision: "" }, () => { this.setEmployeeOrganization(); }); } @@ -188,17 +189,17 @@ export default class DialogForm extends Component { let arrEd = this.state.dataEmployee; let cek = arrEd.filter(this.filterId) - this.setState({ idEmployeeDivision:cek }) + this.setState({ idEmployeeDivision: cek }) } - filterId= (val) => { + filterId = (val) => { return val.organization_id == this.state.idOrganization } getDataRole = async () => { const payload = { - - "orders": {"columns": ["id"], "ascending": false} + + "orders": { "columns": ["id"], "ascending": false } } const result = await axios @@ -207,106 +208,106 @@ export default class DialogForm extends Component { .catch((error) => error.response); console.log('test role', result) - if(result && result.data && result.data.code === 200){ - this.setState({ dataDivision:result.data.data },()=>{ - this.setDataOrganization(); - }) - }else{ - } + if (result && result.data && result.data.code === 200) { + this.setState({ dataDivision: result.data.data }, () => { + this.setDataOrganization(); + }) + } else { + } } setDataOrganization = () => { const { dataDivision } = this.state const listOrganization = [] - dataDivision.map((val, index)=> { + dataDivision.map((val, index) => { listOrganization.push({ - value:val.id, - label:val.name + value: val.id, + label: val.name }) }) - this.setState({ listOrganizationSelect:listOrganization }) + this.setState({ listOrganizationSelect: listOrganization }) } getDataUsers = async () => { const payload = { - "paging":{ - "start":0, - "length":10 + "paging": { + "start": 0, + "length": 10 }, - "filter_columns":[ - { - "name":"name", - "value":"", - "table_name":"m_users" - } + "filter_columns": [ + { + "name": "name", + "value": "", + "table_name": "m_users" + } ], - "columns":[ - { - "name":"name", - "logic_operator":"like", - "value":"", - "operator":"AND", - "table_name":"m_users" - }, - { - "name":"id", - "logic_operator":"=", - "value":"3", - "operator":"AND", - "table_name":"m_roles" - } + "columns": [ + { + "name": "name", + "logic_operator": "like", + "value": "", + "operator": "AND", + "table_name": "m_users" + }, + { + "name": "id", + "logic_operator": "=", + "value": "3", + "operator": "AND", + "table_name": "m_roles" + } ], - "joins":[ - { - "name":"m_users", - "column_join":"user_id", - "column_results":[ - "username", - "name", - "email", - "gender", - "phone_number", - "address", - "birth_place", - "birth_date" - ] - }, - { - "name":"m_roles", - "column_join":"role_id", - "column_results":[ - "name" - ] - } + "joins": [ + { + "name": "m_users", + "column_join": "user_id", + "column_results": [ + "username", + "name", + "email", + "gender", + "phone_number", + "address", + "birth_place", + "birth_date" + ] + }, + { + "name": "m_roles", + "column_join": "role_id", + "column_results": [ + "name" + ] + } ], - "orders":{ - "columns":[ - "id" - ], - "ascending":false + "orders": { + "columns": [ + "id" + ], + "ascending": false } - } + } - const result = await axios + const result = await axios .post(USER_WASPANG, payload, config) .then(res => res) .catch((error) => error.response); console.log('test role', result) - - if (result && result.data && result.code == "200") { - this.setState({ dataEmployee: result.data }, ()=> { - this.setDataEmployee(); - }); - } else { - } + + if (result && result.data && result.code == "200") { + this.setState({ dataEmployee: result.data }, () => { + this.setDataEmployee(); + }); + } else { + } } setDataEmployee = () => { const listEmployee = []; const allIdEmployee = []; - this.state.dataEmployee.map((val, index)=> { + this.state.dataEmployee.map((val, index) => { allIdEmployee.push(val.id); listEmployee.push({ key: val.id, @@ -315,55 +316,56 @@ export default class DialogForm extends Component { }); }) - this.setState({ dataSourceEmployee: listEmployee, allEmployeeId:allIdEmployee }) + this.setState({ dataSourceEmployee: listEmployee, allEmployeeId: allIdEmployee }) } handleChangeTransfer = (nextTargetKeys, direction, moveKeys) => { - this.setState({ targetKeys: nextTargetKeys,errorEmployee:"" }); + this.setState({ targetKeys: nextTargetKeys, errorEmployee: "" }); }; handleSelectChangeTransfer = (sourceSelectedKeys, targetSelectedKeys) => { - this.setState({ selectedKeys: [...sourceSelectedKeys, ...targetSelectedKeys],errorEmployee:"" }); + this.setState({ selectedKeys: [...sourceSelectedKeys, ...targetSelectedKeys], errorEmployee: "" }); }; renderForm = () => { + const t = this.props const { errorTitle, errorMessage } = this.state return (
    - - this.handleChangePenerima(e.target.value )}> - - - + + this.handleChangePenerima(e.target.value)}> + + + - - + + this.setState( @@ -371,26 +373,26 @@ export default class DialogForm extends Component { errorTitle: e.target.value !== "" ? "" : ERROR_TITLE, title: e.target.value })} - placeholder="judul.." /> + placeholder={this.props.t('inputTitle')} /> {errorTitle && ( {errorTitle} )} - + this.setState({ errorMessage: e.target.value !== "" ? "" : ERROR_MESSAGE, message: e.target.value })} placeholder="pesan.." /> + onChange={(e) => this.setState({ errorMessage: e.target.value !== "" ? "" : ERROR_MESSAGE, message: e.target.value })} placeholder={this.props.t('inputMsg')} /> {errorMessage && ( {errorMessage} )} - - this.setState({ description: e.target.value })} placeholder="deskripsi.." /> + + this.setState({ description: e.target.value })} placeholder={this.props.t('inputDescription')} /> ) @@ -408,16 +410,17 @@ export default class DialogForm extends Component { render() { return ( - Broadcast + {this.props.t('broadcastDetail')} {this.renderForm()} - {' '} - {' '} - + {' '} + {' '} + ) } } +export default withTranslation()(DialogForm); \ No newline at end of file diff --git a/src/views/Master/MasterBroadcast/index.js b/src/views/Master/MasterBroadcast/index.js index 90ec78e..e99e2af 100644 --- a/src/views/Master/MasterBroadcast/index.js +++ b/src/views/Master/MasterBroadcast/index.js @@ -10,32 +10,25 @@ import { Button, Card, CardBody, CardHeader, DropdownItem, DropdownMenu, Dropdow import { DatePicker, Pagination } from 'antd'; import { NotificationContainer, NotificationManager } from 'react-notifications'; import { Tooltip } from 'reactstrap'; +import { withTranslation } from 'react-i18next'; const { RangePicker } = DatePicker; const token = window.localStorage.getItem('token'); const config = { headers: { - Authorization : `Bearer ${token}`, - "Content-type" : `application/json` + Authorization: `Bearer ${token}`, + "Content-type": `application/json` } }; const id_org = window.localStorage.getItem('id_org'); const roleName = window.localStorage.getItem('role_name'); -const column = [ - { name: "Aksi" }, - { name: "Judul" }, - { name: "Pesan" }, - { name: "Deskripsi" }, - { name: "Status" }, - { name: "Tanggal" }, -] const LENGTH_DATA = 10 -export default class index extends Component { +class index extends Component { constructor(props) { super(props) this.state = { @@ -43,10 +36,10 @@ export default class index extends Component { alertDelete: false, currentDay: 'today', currentPage: 1, - dataDetail:[], + dataDetail: [], dataEdit: null, dataExport: [], - dataExport:[], + dataExport: [], dataGs: [], dataIdHo: [], dataTable: [], @@ -63,13 +56,13 @@ export default class index extends Component { splitButtonOpen: false, startDate: moment(moment().format("YYYY-M-D")), statusSend: '', - toltipDetail:false, + toltipDetail: false, tooltipDelete: false, tooltipEdit: false, - tooltipExport:false, - tooltipTambah:false, - tooltipresend:false, - tooltipsend:false, + tooltipExport: false, + tooltipTambah: false, + tooltipresend: false, + tooltipsend: false, totalPage: 0, typeClock: "All", typeDialog: 'Save', @@ -129,19 +122,19 @@ export default class index extends Component { "length": this.state.rowsPerPage, "start": start } - } + } - if(this.state.search!=="" && this.state.search!==null){ + if (this.state.search !== "" && this.state.search !== null) { } const result = await axios - .post(url, payload, config) - .then(res => res) - .catch((error) => error.response); + .post(url, payload, config) + .then(res => res) + .catch((error) => error.response); if (result && result.data) { - if(result.data.code===200){ + if (result.data.code === 200) { this.setState({ dataTable: result.data.data, totalPage: result.data.totalRecord }); - }else{ + } else { NotificationManager.error('Failed retreiving data!!', 'Failed'); } } else { @@ -195,15 +188,15 @@ export default class index extends Component { "send_to_type": "all", "message_notif": data.message, "description": data.description, - } + } const paramRoles = { - "title_notif": data.title, - "status_send": type, - "send_to_type": "roles", - "message_notif": data.message, - "description": data.description, - "send_to_id": data.id + "title_notif": data.title, + "status_send": type, + "send_to_type": "roles", + "message_notif": data.message, + "description": data.description, + "send_to_id": data.id } const paramUsers = { @@ -213,63 +206,63 @@ export default class index extends Component { "message_notif": data.message, "description": data.description, "send_to_id": data.id.map((id, index) => id) - } - - if(data.send_to_type === "all") { - const result = await axios.post(url, param, config) - .then(res => res) - .catch((error) => error.response); - if (result) { - if(result.data){ - if(result.data.code===200){ - this.getDataBroadcast(); - NotificationManager.success('Broadcast berhasil terkirimkan', 'Success!!'); - }else{ - NotificationManager.error(`${result.data.message}`, 'Failed!!'); - } - }else{ - NotificationManager.error(`${result.data.message}`, 'Failed!!'); - } - }else{ - NotificationManager.error(`${result.data.message}`, 'Failed!!'); - } - } else if(data.send_to_type === "roles") { - const result = await axios.post(url, paramRoles, config) - .then(res => res) - .catch((error) => error.response); - if (result) { - if(result.data){ - if(result.data.code===200){ - this.getDataBroadcast(); - NotificationManager.success('Broadcast berhasil terkirimkan', 'Success!!'); - }else{ - NotificationManager.error(`${result.data.message}`, 'Failed!!'); - } - }else{ - NotificationManager.error(`${result.data.message}`, 'Failed!!'); - } - }else{ - NotificationManager.error(`${result.data.message}`, 'Failed!!'); - } - } else if(data.send_to_type === "users") { - const result = await axios.post(url, paramUsers, config) - .then(res => res) - .catch((error) => error.response); - if (result) { - if(result.data){ - if(result.data.code === 200){ - this.getDataBroadcast(); - NotificationManager.success('Broadcast berhasil terkirimkan', 'Success!!'); - }else{ - NotificationManager.error(`${result.data.message}`, 'Failed!!'); - } - }else{ - NotificationManager.error(`${result.data.message}`, 'Failed!!'); - } - }else{ - NotificationManager.error(`${result.data.message}`, 'Failed!!'); - } - } + } + + if (data.send_to_type === "all") { + const result = await axios.post(url, param, config) + .then(res => res) + .catch((error) => error.response); + if (result) { + if (result.data) { + if (result.data.code === 200) { + this.getDataBroadcast(); + NotificationManager.success('Broadcast berhasil terkirimkan', 'Success!!'); + } else { + NotificationManager.error(`${result.data.message}`, 'Failed!!'); + } + } else { + NotificationManager.error(`${result.data.message}`, 'Failed!!'); + } + } else { + NotificationManager.error(`${result.data.message}`, 'Failed!!'); + } + } else if (data.send_to_type === "roles") { + const result = await axios.post(url, paramRoles, config) + .then(res => res) + .catch((error) => error.response); + if (result) { + if (result.data) { + if (result.data.code === 200) { + this.getDataBroadcast(); + NotificationManager.success('Broadcast berhasil terkirimkan', 'Success!!'); + } else { + NotificationManager.error(`${result.data.message}`, 'Failed!!'); + } + } else { + NotificationManager.error(`${result.data.message}`, 'Failed!!'); + } + } else { + NotificationManager.error(`${result.data.message}`, 'Failed!!'); + } + } else if (data.send_to_type === "users") { + const result = await axios.post(url, paramUsers, config) + .then(res => res) + .catch((error) => error.response); + if (result) { + if (result.data) { + if (result.data.code === 200) { + this.getDataBroadcast(); + NotificationManager.success('Broadcast berhasil terkirimkan', 'Success!!'); + } else { + NotificationManager.error(`${result.data.message}`, 'Failed!!'); + } + } else { + NotificationManager.error(`${result.data.message}`, 'Failed!!'); + } + } else { + NotificationManager.error(`${result.data.message}`, 'Failed!!'); + } + } } @@ -300,7 +293,7 @@ export default class index extends Component { this.setState(prevState => ({ tooltipDelete: !prevState.tooltipDelete })) } else if (param === "tambah") { this.setState(prevState => ({ tooltipTambah: !prevState.tooltipTambah })) - } else if (param === "export") { + } else if (param === "export") { this.setState(prevState => ({ tooltipExport: !prevState.tooltipExport })) } } @@ -330,25 +323,25 @@ export default class index extends Component { let dateEnd = this.state.endDate; const formData = new FormData(); - formData.append("startDate", dateStart.format("YYYY-M-D")+" 00:00:00"); - formData.append("endDate", dateEnd.format("YYYY-M-D")+" 23:59:59"); + formData.append("startDate", dateStart.format("YYYY-M-D") + " 00:00:00"); + formData.append("endDate", dateEnd.format("YYYY-M-D") + " 23:59:59"); formData.append('field', this.state.searchDetailField); formData.append("start", start); formData.append("length", "all"); - if(this.state.search!=="" && this.state.search!==null){ + if (this.state.search !== "" && this.state.search !== null) { formData.append('value', this.state.search); } const result = await axios - .post(url, formData) - .then(res => res) - .catch((error) => error.response); + .post(url, formData) + .then(res => res) + .catch((error) => error.response); if (result && result.data) { - if(result.data.code_status===200){ + if (result.data.code_status === 200) { this.setState({ dataExport: result.data.data }, () => { this.exportExcel(); }); - }else{ + } else { } } else { } @@ -378,19 +371,19 @@ export default class index extends Component { handleDetail = (data) => { console.log("ceh handle detail", data) - this.setState({ dataDetail:data },()=> { + this.setState({ dataDetail: data }, () => { this.showDetailDialog(); - this.setState({ openDialogDetail:true }); + this.setState({ openDialogDetail: true }); }); } toggleTooltip = (type) => { - if(type==="detail"){ - this.setState({ toltipDetail:!this.state.toltipDetail }) - }else if(type==="resend"){ - this.setState({ tooltipresend:!this.state.tooltipresend }) - }else if(type==="send"){ - this.setState({ tooltipsend:!this.state.tooltipsend }) + if (type === "detail") { + this.setState({ toltipDetail: !this.state.toltipDetail }) + } else if (type === "resend") { + this.setState({ tooltipresend: !this.state.tooltipresend }) + } else if (type === "send") { + this.setState({ tooltipsend: !this.state.tooltipsend }) } } @@ -417,6 +410,15 @@ export default class index extends Component { } renderTable = () => { + const column = [ + { name: this.props.t('action') }, + { name: this.props.t('title') }, + { name: this.props.t('message') }, + { name: this.props.t('description') }, + { name: "Status" }, + { name: this.props.t('date') }, + ] + const t = this.props const dataTable2 = this.state.dataTable || []; return ( @@ -425,10 +427,10 @@ export default class index extends Component { - {n.status_send === 'completed' || n.status_send === 'failed' || n.status_send === 'send' ? - this.renderBtnResend(n.id) : - this.renderBtnSend(n.id) - } + {n.status_send === 'completed' || n.status_send === 'failed' || n.status_send === 'send' ? + this.renderBtnResend(n.id) : + this.renderBtnSend(n.id) + } this.handleDetail(n)}> this.toggleTooltip("detail")}> @@ -446,7 +448,7 @@ export default class index extends Component { ) }) : - Data Tidak Tersedia + {this.props.t('noData')} } @@ -458,46 +460,55 @@ export default class index extends Component { } handleCloseDetail = () => { - this.setState({ openDialogDetail:false }) + this.setState({ openDialogDetail: false }) } toggleDialogDetail = () => { - this.setState({ openDialogDetail:!this.state.openDialogDetail }) + this.setState({ openDialogDetail: !this.state.openDialogDetail }) } handleChangeDay = (e) => { const val = e.target.value; - this.setState({ currentDay:val }); - if(val==="today"){ + this.setState({ currentDay: val }); + if (val === "today") { this.setState({ - startDate:moment(moment().format("YYYY-M-D")), - endDate:moment(moment().format("YYYY-M-D")), + startDate: moment(moment().format("YYYY-M-D")), + endDate: moment(moment().format("YYYY-M-D")), currentPage: 1 }) - }else if(val==="3 day"){ + } else if (val === "3 day") { this.setState({ - startDate:moment(moment().subtract(3, "days").format("YYYY-M-D")), - endDate:moment(moment().format("YYYY-M-D")), + startDate: moment(moment().subtract(3, "days").format("YYYY-M-D")), + endDate: moment(moment().format("YYYY-M-D")), currentPage: 1 }) - }else if(val==="7 day"){ + } else if (val === "7 day") { this.setState({ - startDate:moment(moment().subtract(7, "days").format("YYYY-M-D")), - endDate:moment(moment().format("YYYY-M-D")), + startDate: moment(moment().subtract(7, "days").format("YYYY-M-D")), + endDate: moment(moment().format("YYYY-M-D")), currentPage: 1 }) - }else{ - console.log("test 2 test",val); + } else { + console.log("test 2 test", val); this.setState({ - startDate:moment(moment().format("YYYY-M-D")), - endDate:moment(moment().format("YYYY-M-D")), + startDate: moment(moment().format("YYYY-M-D")), + endDate: moment(moment().format("YYYY-M-D")), currentPage: 1 }) } } render() { - const { tooltipTambah, tooltipExport,dataTable, splitButtonOpen, openDialog, currentPage, rowsPerPage, totalPage, search, tooltipEdit, tooltipDelete, statusSend } = this.state + const column = [ + { name: this.props.t('action') }, + { name: this.props.t('title') }, + { name: this.props.t('message') }, + { name: this.props.t('description') }, + { name: "Status" }, + { name: this.props.t('date') }, + ] + const t = this.props; + const { tooltipTambah, tooltipExport, dataTable, splitButtonOpen, openDialog, currentPage, rowsPerPage, totalPage, search, tooltipEdit, tooltipDelete, statusSend } = this.state return (
    @@ -507,7 +518,7 @@ export default class index extends Component { showCancel confirmBtnText="Yes!" confirmBtnBsStyle="danger" - title="Are your sure?" + title={this.props.t('deleteConfirm')} onConfirm={this.onConfirmBroadcast} onCancel={() => this.setState({ alertBroadcast: false })} focusCancelBtn @@ -537,63 +548,63 @@ export default class index extends Component { - - this.toggle("tambah")}> - Tambah Broadcast - - this.toggle("export")}> - Export Excel - + + this.toggle("tambah")}> + {this.props.t('broadcastAdd')} + + this.toggle("export")}> + {this.props.t('exprotExcel')} + -
    -
    -
    - this.handleChangeDay(e)} defaultValue={this.state.currentDay}> - - - - -
    -
    - {' '} - -
    +
    +
    +
    + this.handleChangeDay(e)} defaultValue={this.state.currentDay}> + + + + +
    +
    + {' '} +
    - - - - - - this.setState({ - searchDetail: "Judul", - searchDetailField: "title_notif" - })}>Judul - this.setState({ - searchDetail: "Deskripsi", - searchDetailField: "description" - })}>Deskripsi - this.setState({ - searchDetail: "Pesan", - searchDetailField: "message_notif" - })}>Pesan - this.setState({ - searchDetail: "Status", - searchDetailField: "status_send" - })}>Status - - -
    + + + + + + this.setState({ + searchDetail: this.props.t('title'), + searchDetailField: "title_notif" + })}>Judul + this.setState({ + searchDetail: this.props.t('description'), + searchDetailField: "description" + })}>Deskripsi + this.setState({ + searchDetail: this.props.t('message'), + searchDetailField: "message_notif" + })}>Pesan + this.setState({ + searchDetail: "Status", + searchDetailField: "status_send" + })}>Status + + + +
    @@ -621,3 +632,4 @@ export default class index extends Component { ) } } +export default withTranslation()(index); \ No newline at end of file diff --git a/src/views/Master/MasterRoles/index.js b/src/views/Master/MasterRoles/index.js index a32ba37..36828aa 100644 --- a/src/views/Master/MasterRoles/index.js +++ b/src/views/Master/MasterRoles/index.js @@ -89,6 +89,9 @@ class index extends Component { async componentDidUpdate(prevProps, prevState) { const { search } = this.state if (search !== prevState.search) this.getDataRoles() + if (prevProps.dataExport !== this.props.dataExport && this.props.dataExport.length > 0) { + this.handleExportExcel(); + } } handleSearch = e => { @@ -324,16 +327,20 @@ class index extends Component { handleExportExcel = async () => { let start = 0; let end = "ALL"; - let url = BASE_URL + "roles.php?act=get_data"; - const formData = new FormData(); - formData.append('field', 'name'); - if (this.state.search !== "") { - formData.append('value', this.state.search); + const formData = { + "paging": { "start": start, "length": this.state.rowsPerPage }, + "columns": [ + { "name": "name", "logic_operator": "ilike", "value": this.state.search, "operator": "AND" } + ], + "joins": [], + "orders": { "columns": ["id"], "ascending": false } } + const result = await axios - .post(url, formData) + .post(ROLE_SEARCH, formData, config) .then(res => res) .catch((error) => error.response); + if (result && result.data && result.statusText == "OK") { const dataRes = result.data.data || []; const dataExport = []; diff --git a/src/views/Report/k3/index.js b/src/views/Report/k3/index.js index 7b89480..ec0f2ab 100644 --- a/src/views/Report/k3/index.js +++ b/src/views/Report/k3/index.js @@ -129,13 +129,6 @@ class index extends Component { } } - - - - - - - getDataLaporanK3 = async () => { let start = 0; @@ -450,11 +443,11 @@ class index extends Component { - + ) }) : - + } diff --git a/src/views/SimproV2/PanicButton/index.js b/src/views/SimproV2/PanicButton/index.js index 51b23e0..91c7582 100644 --- a/src/views/SimproV2/PanicButton/index.js +++ b/src/views/SimproV2/PanicButton/index.js @@ -11,6 +11,7 @@ import { DatePicker } from 'antd'; import { NotificationContainer, NotificationManager } from 'react-notifications'; import { PANIC_BUTTON_UPDATE, PANIC_BUTTON_SEARCH } from '../../../const/ApiConst'; import { Pagination, Tooltip } from 'antd'; +import { withTranslation } from 'react-i18next'; const id_org = window.localStorage.getItem('id_org'); const roleName = window.localStorage.getItem('role_name'); @@ -19,8 +20,8 @@ const token = window.localStorage.getItem('token'); const config = { headers: { - Authorization : `Bearer ${token}`, - "Content-type" : `application/json` + Authorization: `Bearer ${token}`, + "Content-type": `application/json` } }; @@ -28,16 +29,11 @@ const { RangePicker } = DatePicker; const momentFormat = 'HH:mm'; -const column = [ - { name: "Action" }, - { name: "Date" }, - { name: "Employee Name " }, - { name: "Status Response" }, -] + const LENGTH_DATA = 10 -export default class index extends Component { +class index extends Component { constructor(props) { super(props) this.state = { @@ -48,18 +44,18 @@ export default class index extends Component { dataExport: [], dataGs: [], dataIdHo: [], - dataMap:"", + dataMap: "", dataTable: [], - endDate:moment(moment().format("YYYY-M-D")), + endDate: moment(moment().format("YYYY-M-D")), idDelete: 0, openDialog: false, - openDialogEdit:false, + openDialogEdit: false, page: 0, rowsPerPage: LENGTH_DATA, search: "", - startDate:moment(moment().format("YYYY-M-D")), + startDate: moment(moment().format("YYYY-M-D")), tooltipDelete: false, - tooltipExport:false, + tooltipExport: false, tooltipMap: false, totalPage: 0, typeClock: "All", @@ -72,7 +68,7 @@ export default class index extends Component { } async componentDidUpdate(prevProps, prevState) { - const { search,startDate } = this.state + const { search, startDate } = this.state if (search !== prevState.search) this.getDataPanicButton() if (startDate !== prevState.startDate) this.getDataPanicButton() } @@ -88,39 +84,39 @@ export default class index extends Component { start = (this.state.currentPage * this.state.rowsPerPage) - this.state.rowsPerPage } - let dateStart = moment(this.state.startDate).format("YYYY-MM-DD 00:00:00"); - let dateEnd = moment(this.state.endDate).format("YYYY-MM-DD 23:59:59"); + let dateStart = moment(this.state.startDate).format("YYYY-MM-DD 00:00:00"); + let dateEnd = moment(this.state.endDate).format("YYYY-MM-DD 23:59:59"); const payload = { - "paging":{ - "start":start, - "length":this.state.rowsPerPage + "paging": { + "start": start, + "length": this.state.rowsPerPage }, - "filter_columns":[ - { - "name":"name", - "value":"", - "table_name":"m_users" - } + "filter_columns": [ + { + "name": "name", + "value": "", + "table_name": "m_users" + } ], - "columns":[ - {"name": "created_at", "logic_operator": "range", "value": dateStart, "value1": dateEnd, "operator": "AND"}, - {"name": "name", "logic_operator": "ilike", "value": this.state.search, "operator": "AND", "table_name":"m_users"} + "columns": [ + { "name": "created_at", "logic_operator": "range", "value": dateStart, "value1": dateEnd, "operator": "AND" }, + { "name": "name", "logic_operator": "ilike", "value": this.state.search, "operator": "AND", "table_name": "m_users" } ], - "joins":[ - { - "name":"m_users", - "column_join":"user_id", - "column_results":[ - "name", - ] - } + "joins": [ + { + "name": "m_users", + "column_join": "user_id", + "column_results": [ + "name", + ] + } ], - "orders":{ - "columns":[ - "id" - ], - "ascending":false + "orders": { + "columns": [ + "id" + ], + "ascending": false } } @@ -128,9 +124,9 @@ export default class index extends Component { .post(PANIC_BUTTON_SEARCH, payload, config) .then(res => res) .catch((error) => error.response); - if(result && result.data){ + if (result && result.data) { if (result && result.data && result.data.code == 200) { - this.setState({ dataTable: result.data.data, totalPage: result.data.totalRecord,dataExport:result.data.data_export }); + this.setState({ dataTable: result.data.data, totalPage: result.data.totalRecord, dataExport: result.data.data_export }); } else { NotificationManager.error('Gagal Menerima Data!!', 'Failed'); } @@ -138,10 +134,10 @@ export default class index extends Component { } handleOpenDialog = (type) => { - if(type==="Map"){ + if (type === "Map") { this.setState({ openDialog: true }) this.showChildDialog(); - }else{ + } else { this.setState({ openDialogEdit: true }) this.showDialogEdit(); } @@ -153,7 +149,7 @@ export default class index extends Component { } handleCloseDialogEdit = (type, data) => { - if(type==="save"){ + if (type === "save") { this.updateStatusResponse(data); } this.setState({ openDialogEdit: false }) @@ -164,7 +160,7 @@ export default class index extends Component { } toggleEditDialog = () => { - this.setState({ openDialogEdit:!this.state.openDialogEdit }); + this.setState({ openDialogEdit: !this.state.openDialogEdit }); } handleMap = data => { @@ -173,7 +169,7 @@ export default class index extends Component { } handleEdit = data => { - this.setState({ dataEdit:data }); + this.setState({ dataEdit: data }); this.handleOpenDialog('Edit'); } @@ -196,7 +192,7 @@ export default class index extends Component { toggle = (param) => { if (param === "map") { this.setState(prevState => ({ tooltipMap: !prevState.tooltipMap })) - }else if(param==="edit"){ + } else if (param === "edit") { this.setState(prevState => ({ tooltipEdit: !prevState.tooltipEdit })) } else if (param === "delete") { this.setState(prevState => ({ tooltipDelete: !prevState.tooltipDelete })) @@ -206,13 +202,13 @@ export default class index extends Component { } handleDatePicker = (date, dateString) => { - this.setState({ startDate:date[0],endDate:date[1] },()=>{ + this.setState({ startDate: date[0], endDate: date[1] }, () => { this.getDataPanicButton(); }) } handleTipe = (e) => { - this.setState({ typeClock:e.target.value }, () => { + this.setState({ typeClock: e.target.value }, () => { this.getDataPanicButton(); }); } @@ -221,27 +217,27 @@ export default class index extends Component { const dataExcel = this.state.dataTable || []; const fileName = "Panic Button.xlsx"; let dataExport = []; - dataExcel.map((val)=>{ + dataExcel.map((val) => { let row = { "Tanggal": moment(val.created_date).format("DD-MM-YYYY HH:MM:SS"), - "Nama Karyawan" : val.employee_name, - "Latitude" : val.lan, - "Longitude" : val.lon, - "Status" : val.status_response + "Nama Karyawan": val.join_first_name, + "Latitude": val.lat, + "Longitude": val.lon, + "Status": val.status_response } dataExport.push(row); }) const ws = XLSX.utils.json_to_sheet(dataExport); - const wb = XLSX.utils.book_new(); - XLSX.utils.book_append_sheet(wb, ws, 'Panic Button'); + const wb = XLSX.utils.book_new(); + XLSX.utils.book_append_sheet(wb, ws, 'Panic Button'); - XLSX.writeFile(wb, fileName); + XLSX.writeFile(wb, fileName); } updateStatusResponse = async (data) => { let url = PANIC_BUTTON_UPDATE(data.id); let payload = { - "user_id" : data.user_id, + "user_id": data.user_id, "lat": data.lat, "lon": data.lon, "status_response": data.status_response, @@ -253,7 +249,7 @@ export default class index extends Component { .put(url, payload, config) .then(res => res) .catch((error) => error.response); - if(result && result.data){ + if (result && result.data) { if (result.data.code == 200) { this.getDataPanicButton() NotificationManager.success('Berhasil update status response!!', 'Success!'); @@ -264,65 +260,73 @@ export default class index extends Component { } renderTable = () => { + const t = this.props; const dataTable2 = this.state.dataTable || []; return ( - {dataTable2.length!==0 ? dataTable2.map((n) => { - return ( - - - - - - - ) - }) : - - - } - + {dataTable2.length !== 0 ? dataTable2.map((n) => { + return ( + + + + + + + ) + }) : + + + } + ) } handleChangeDay = (e) => { const val = e.target.value; - this.setState({ currentDay:val }); - if(val==="today"){ + this.setState({ currentDay: val }); + if (val === "today") { this.setState({ - startDate:moment(moment().format("YYYY-M-D")), - endDate:moment(moment().format("YYYY-M-D")), + startDate: moment(moment().format("YYYY-M-D")), + endDate: moment(moment().format("YYYY-M-D")), currentPage: 1 }) - }else if(val==="3 day"){ + } else if (val === "3 day") { this.setState({ - startDate:moment(moment().subtract(3, "days").format("YYYY-M-D")), - endDate:moment(moment().format("YYYY-M-D")), + startDate: moment(moment().subtract(3, "days").format("YYYY-M-D")), + endDate: moment(moment().format("YYYY-M-D")), currentPage: 1 }) - }else if(val==="7 day"){ + } else if (val === "7 day") { this.setState({ - startDate:moment(moment().subtract(7, "days").format("YYYY-M-D")), - endDate:moment(moment().format("YYYY-M-D")), + startDate: moment(moment().subtract(7, "days").format("YYYY-M-D")), + endDate: moment(moment().format("YYYY-M-D")), currentPage: 1 }) - }else{ + } else { this.setState({ - startDate:moment(moment().format("YYYY-M-D")), - endDate:moment(moment().format("YYYY-M-D")), + startDate: moment(moment().format("YYYY-M-D")), + endDate: moment(moment().format("YYYY-M-D")), currentPage: 1 }) } } render() { - const { tooltipExport,dataTable, openDialogEdit, openDialog, currentPage, rowsPerPage, totalPage, search, tooltipMap, tooltipDelete } = this.state + const column = [ + { name: this.props.t('action') }, + { name: this.props.t('date') }, + { name: this.props.t('nameHR') }, + { name: this.props.t('statusResponse') }, + ] + const t = this.props; + const { tooltipExport, dataTable, openDialogEdit, openDialog, currentPage, rowsPerPage, totalPage, search, tooltipMap, tooltipDelete } = this.state return (
    @@ -342,29 +346,29 @@ export default class index extends Component { /> -

    Panic Button

    +

    {this.props.t('panicButton')}

    - - - + + +
    -
    -
    -
    - this.handleChangeDay(e)} defaultValue={this.state.currentDay}> - - - - -
    -
    - {' '} - -
    +
    +
    +
    + this.handleChangeDay(e)} defaultValue={this.state.currentDay}> + + + + +
    +
    + {' '} +
    +
    {n.k3_checked.length ? n.k3_checked.join() : "-"} {n.k3_not_checked.length ? n.k3_not_checked.join() : "-"} {n.description ? n.description : "-"} {n.image ? this.lihatFoto(n.image)} className='fa fa-image'> : ""} {n.image ? this.lihatFoto(n.image)} className='fa fa-image'> : ""}
    No Data Available{this.props.t('noData')}
    - - this.handleEdit(n)}> - - - this.handleMap(n)}> - - { n.created_date!==null ? moment(n.created_at).format("DD-MM-YYYY HH:mm:ss") : "-" }{ n.join_first_name !==null ? n.join_first_name : "-" }{ n.status_response!==null ? n.status_response : "-" }
    No Data Available
    + + this.handleEdit(n)}> + + + this.handleMap(n)}> + + {n.created_date !== null ? moment(n.created_at).format("DD-MM-YYYY HH:mm:ss") : "-"}{n.join_first_name !== null ? n.join_first_name : "-"}{n.status_response !== null ? n.status_response : "-"}
    No Data Available
    @@ -375,7 +379,7 @@ export default class index extends Component { })} - { this.renderTable() } + {this.renderTable()}
    { } ], "orders": { - "ascending": true, + "ascending": false, "columns": [ 'id' ] diff --git a/src/views/SimproV2/ResourceMaterial/DialogForm.js b/src/views/SimproV2/ResourceMaterial/DialogForm.js index 2957798..4c9c5e9 100644 --- a/src/views/SimproV2/ResourceMaterial/DialogForm.js +++ b/src/views/SimproV2/ResourceMaterial/DialogForm.js @@ -7,6 +7,7 @@ import { DatePicker, Tooltip, Select } from 'antd'; import { formatRupiah, formatNumber } from '../../../const/CustomFunc' import moment from 'moment'; import 'antd/dist/antd.css'; +import { useTranslation } from 'react-i18next'; const { Option } = Select const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, dataEdit, dataUom }) => { @@ -26,7 +27,7 @@ const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, dataEdi const [poDate, setPoDate] = useState(null) const [receivedDate, setReceivedDate] = useState(null) const [deliveryDate, setDeliveryDate] = useState(null) - + const { t } = useTranslation() @@ -173,22 +174,21 @@ const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, dataEdi - - setMaterialName(e.target.value)} placeholder={`Input material name...`} /> + + setMaterialName(e.target.value)} placeholder={t('inputName')} /> - - setQty(e.target.value)} placeholder={`Input qty...`} /> + + setQty(e.target.value)} placeholder={t('inputQty')} /> - - + @@ -201,8 +201,8 @@ const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, dataEdi - - setUnitPrice(formatNumber(e.target.value))} placeholder={`Unit Price...`} /> + + setUnitPrice(formatNumber(e.target.value))} placeholder={t('inputUnitPrice')} /> @@ -215,8 +215,8 @@ const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, dataEdi - - setDescription(e.target.value)} placeholder={`Description ...`} /> + + setDescription(e.target.value)} placeholder={t('inputDescription')} /> @@ -243,21 +243,21 @@ const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, dataEdi - - setPriceReq(formatNumber(e.target.value))} placeholder={`Input Price ...`} /> + + setPriceReq(formatNumber(e.target.value))} placeholder={t('inputPrice')} /> - - setDescription(e.target.value)} placeholder={`Description ...`} /> + + setDescription(e.target.value)} placeholder={t('inputDescription')} /> - + setRequiredDate(date)} /> @@ -265,13 +265,13 @@ const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, dataEdi - + setQty(e.target.value)} placeholder={`Input QTY...`} disabled /> - + setUom(e.target.value)} placeholder={`Input UOM...`} disabled /> @@ -279,13 +279,13 @@ const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, dataEdi - - setQtyReceived(e.target.value)} placeholder={`Input QTY Received...`} /> + + setQtyReceived(e.target.value)} placeholder={t('inputQtyReceived')} /> - + setFomDate(date)} /> @@ -293,13 +293,13 @@ const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, dataEdi - + setPrDate(date)} /> - + setPoDate(date)} /> @@ -307,13 +307,13 @@ const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, dataEdi - + setReceivedDate(date)} /> - + setDeliveryDate(date)} /> @@ -339,8 +339,8 @@ const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, dataEdi - - setDescription(e.target.value)} placeholder={`Description ...`} /> + + setDescription(e.target.value)} placeholder={t('inputDescription')} /> @@ -353,13 +353,13 @@ const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, dataEdi - + setQty(e.target.value)} placeholder={`Input QTY...`} disabled /> - + setUom(e.target.value)} placeholder={`Input UOM...`} disabled /> @@ -367,13 +367,13 @@ const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, dataEdi - + setQtyReceived(e.target.value)} placeholder={`Input QTY Received...`} /> - + setFomDate(date)} /> @@ -381,13 +381,13 @@ const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, dataEdi - + setPrDate(date)} /> - + setPoDate(date)} /> @@ -395,13 +395,13 @@ const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, dataEdi - + setReceivedDate(date)} /> - + setDeliveryDate(date)} /> @@ -421,7 +421,7 @@ const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, dataEdi {' '} - + diff --git a/src/views/SimproV2/ResourceMaterial/index.js b/src/views/SimproV2/ResourceMaterial/index.js index e566aa5..a00bf8a 100644 --- a/src/views/SimproV2/ResourceMaterial/index.js +++ b/src/views/SimproV2/ResourceMaterial/index.js @@ -16,6 +16,7 @@ import { REQUEST_MATERIAL_SEARCH, REQUEST_MATERIAL_EDIT, REQUEST_MATERIAL_UPDATE_WAREHOUSE_SITE, SATUAN_SEARCH } from '../../../const/ApiConst'; +import { useTranslation } from 'react-i18next'; const { TabPane } = Tabs; const { Panel } = Collapse; @@ -60,7 +61,7 @@ const Resource = ({ params }) => { const [totalPage, setTotalPage] = useState(0) const [typeDialog, setTypeDialog] = useState('Save') const pageName = params.name; - + const { t } = useTranslation() useEffect(() => { getDataReqMaterial() getDataSatuan() @@ -514,23 +515,23 @@ const Resource = ({ params }) => { const RenderTable = useMemo(() => { const columns = [ { - title: 'Action', + title: t('action'), dataIndex: '', key: 'x', className: 'nowrap', render: (text, record) => <> - - + + - + , }, - { title: 'Material Name', dataIndex: 'name', key: 'name' }, - { title: 'QTY', dataIndex: 'qty', key: 'qty' }, - { title: 'UOM', dataIndex: 'uom', key: 'uom' }, - { title: 'Description', dataIndex: 'description', key: 'description' }, + { title: t('name'), dataIndex: 'name', key: 'name' }, + { title: t('qty'), dataIndex: 'qty', key: 'qty' }, + { title: t('uom'), dataIndex: 'uom', key: 'uom' }, + { title: t('description'), dataIndex: 'description', key: 'description' }, { title: 'Status', dataIndex: 'status', key: 'status' } ]; @@ -547,31 +548,31 @@ const Resource = ({ params }) => { const RenderRequestMaterialTable = useMemo(() => { const columns = [ { - title: 'Action', + title: t('action'), dataIndex: '', key: 'id', className: "nowrap", render: (text, record) => <> - - + + {" "} - + , }, { title: 'Status', dataIndex: 'status', key: 'status', render: (text, record) => renderLabelStatus(text) }, - { title: 'Description', dataIndex: 'description', key: 'description' }, - { title: 'Required Date', dataIndex: 'required_date', key: 'required_date', className: "nowrap", render: (text, record) => (
    {moment(text).format("D-M-YYYY")}
    ) }, - { title: 'QTY', dataIndex: 'qty', key: 'qty', render: (text, record) => (
    {text ? text : "-"}
    ) }, - { title: 'UOM', dataIndex: 'uom', key: 'uom', render: (text, record) => (
    {text ? text : "-"}
    ) }, - { title: 'QTY Received', dataIndex: 'qty_received', key: 'qty_received', className: "nowrap", render: (text, record) => (
    {text ? text : "-"}
    ) }, - { title: 'Unit Price', dataIndex: 'price', key: 'price', render: (text, record) => { return renderFormatNumber(text, "Rp") } }, - { title: 'FOM Date', dataIndex: 'fom_date', key: 'fom_date', render: (text, record) => (
    {moment(text).format("D-M-YYYY")}
    ) }, - { title: 'PR Date', dataIndex: 'pr_date', key: 'pr_date', className: "nowrap", render: (text, record) => (
    {text ? moment(text).format("D-M-YYYY") : "-"}
    ) }, - { title: 'PO Date', dataIndex: 'po_date', key: 'po_date', className: "nowrap", render: (text, record) => (
    {text ? moment(text).format("D-M-YYYY") : "-"}
    ) }, - { title: 'Received Date', dataIndex: 'received_date', key: 'received_date', className: "nowrap", render: (text, record) => (
    {text ? moment(text).format("D-M-YYYY") : "-"}
    ) }, - { title: 'Delivery Date', dataIndex: 'delivery_date', key: 'delivery_date', className: "nowrap", render: (text, record) => (
    {text ? moment(text).format("D-M-YYYY") : "-"}
    ) }, + { title: t('description'), dataIndex: 'description', key: 'description' }, + { title: t('dateRequired'), dataIndex: 'required_date', key: 'required_date', className: "nowrap", render: (text, record) => (
    {moment(text).format("D-M-YYYY")}
    ) }, + { title: t('qty'), dataIndex: 'qty', key: 'qty', render: (text, record) => (
    {text ? text : "-"}
    ) }, + { title: t('uom'), dataIndex: 'uom', key: 'uom', render: (text, record) => (
    {text ? text : "-"}
    ) }, + { title: t('qtyReceived'), dataIndex: 'qty_received', key: 'qty_received', className: "nowrap", render: (text, record) => (
    {text ? text : "-"}
    ) }, + { title: t('unitPrice'), dataIndex: 'price', key: 'price', render: (text, record) => { return renderFormatNumber(text, "Rp") } }, + { title: t('dateFOM'), dataIndex: 'fom_date', key: 'fom_date', render: (text, record) => (
    {moment(text).format("D-M-YYYY")}
    ) }, + { title: t('datePR'), dataIndex: 'pr_date', key: 'pr_date', className: "nowrap", render: (text, record) => (
    {text ? moment(text).format("D-M-YYYY") : "-"}
    ) }, + { title: t('datePO'), dataIndex: 'po_date', key: 'po_date', className: "nowrap", render: (text, record) => (
    {text ? moment(text).format("D-M-YYYY") : "-"}
    ) }, + { title: t('dateReceived'), dataIndex: 'received_date', key: 'received_date', className: "nowrap", render: (text, record) => (
    {text ? moment(text).format("D-M-YYYY") : "-"}
    ) }, + { title: t('dateDelivery'), dataIndex: 'delivery_date', key: 'delivery_date', className: "nowrap", render: (text, record) => (
    {text ? moment(text).format("D-M-YYYY") : "-"}
    ) }, ]; let componentGroup = []; @@ -599,32 +600,32 @@ const Resource = ({ params }) => { const RenderMaterialDeliveryTable = useMemo(() => { const columns = [ { - title: 'Action', + title: t('action'), dataIndex: '', key: 'id', className: "nowrap", render: (text, record) => <> {text.status == "receipt to warehouse" ? <> - - - {" "} + + + {" "} : "-"} , }, { title: 'Status', dataIndex: 'status', key: 'status' }, - { title: 'Description', dataIndex: 'description', key: 'description' }, - { title: 'Required Date', dataIndex: 'required_date', key: 'required_date', className: "nowrap", render: (text, record) => (
    {moment(text).format("D-M-YYYY")}
    ) }, - { title: 'QTY', dataIndex: 'qty', key: 'qty', render: (text, record) => (
    {text ? text : "-"}
    ) }, - { title: 'UOM', dataIndex: 'uom', key: 'uom', render: (text, record) => (
    {text ? text : "-"}
    ) }, - { title: 'QTY Received', dataIndex: 'qty_received', key: 'qty_received', className: "nowrap", render: (text, record) => (
    {text ? text : "-"}
    ) }, - { title: 'FOM Date', dataIndex: 'fom_date', key: 'fom_date', render: (text, record) => (
    {moment(text).format("D-M-YYYY")}
    ) }, - { title: 'PR Date', dataIndex: 'pr_date', key: 'pr_date', className: "nowrap", render: (text, record) => (
    {text ? moment(text).format("D-M-YYYY") : "-"}
    ) }, - { title: 'PO Date', dataIndex: 'po_date', key: 'po_date', className: "nowrap", render: (text, record) => (
    {text ? moment(text).format("D-M-YYYY") : "-"}
    ) }, - { title: 'Received Date', dataIndex: 'received_date', key: 'received_date', className: "nowrap", render: (text, record) => (
    {text ? moment(text).format("D-M-YYYY") : "-"}
    ) }, - { title: 'Delivery Date', dataIndex: 'delivery_date', key: 'delivery_date', className: "nowrap", render: (text, record) => (
    {text ? moment(text).format("D-M-YYYY") : "-"}
    ) }, + { title: t('description'), dataIndex: 'description', key: 'description' }, + { title: t('dateRequired'), dataIndex: 'required_date', key: 'required_date', className: "nowrap", render: (text, record) => (
    {moment(text).format("D-M-YYYY")}
    ) }, + { title: t('qty'), dataIndex: 'qty', key: 'qty', render: (text, record) => (
    {text ? text : "-"}
    ) }, + { title: t('uom'), dataIndex: 'uom', key: 'uom', render: (text, record) => (
    {text ? text : "-"}
    ) }, + { title: t('qtyReceived'), dataIndex: 'qty_received', key: 'qty_received', className: "nowrap", render: (text, record) => (
    {text ? text : "-"}
    ) }, + { title: t('dateFOM'), dataIndex: 'fom_date', key: 'fom_date', render: (text, record) => (
    {moment(text).format("D-M-YYYY")}
    ) }, + { title: t('datePR'), dataIndex: 'pr_date', key: 'pr_date', className: "nowrap", render: (text, record) => (
    {text ? moment(text).format("D-M-YYYY") : "-"}
    ) }, + { title: t('datePO'), dataIndex: 'po_date', key: 'po_date', className: "nowrap", render: (text, record) => (
    {text ? moment(text).format("D-M-YYYY") : "-"}
    ) }, + { title: t('dateReceived'), dataIndex: 'received_date', key: 'received_date', className: "nowrap", render: (text, record) => (
    {text ? moment(text).format("D-M-YYYY") : "-"}
    ) }, + { title: t('dateDelivery'), dataIndex: 'delivery_date', key: 'delivery_date', className: "nowrap", render: (text, record) => (
    {text ? moment(text).format("D-M-YYYY") : "-"}
    ) }, ]; let componentGroup = []; @@ -655,13 +656,13 @@ const Resource = ({ params }) => {

    {pageName}

    - + - + - + @@ -688,13 +689,13 @@ const Resource = ({ params }) => { return ( -

    Material Request

    +

    {t('materialRequest')}

    - + - + @@ -713,7 +714,7 @@ const Resource = ({ params }) => { return ( -

    Material Delivery to Site

    +

    {t('materialDelivery')}

    @@ -743,12 +744,12 @@ const Resource = ({ params }) => { showCancel confirmBtnText="Delete" confirmBtnBsStyle="danger" - title={`Are you sure?`} + title={t('deleteConfirm')} onConfirm={onConfirmDelete} onCancel={() => cancelDelete()} focusCancelBtn > - Delete this data + {t('deleteMsg')} { dataUom={dataSatuan} /> - + {CardMasterMaterial} - + {CardMaterialRequest} - + {CardMaterialDelivery} diff --git a/src/views/SimproV2/ResourceTools/DialogEditReqTools.js b/src/views/SimproV2/ResourceTools/DialogEditReqTools.js index e77fb14..8284935 100644 --- a/src/views/SimproV2/ResourceTools/DialogEditReqTools.js +++ b/src/views/SimproV2/ResourceTools/DialogEditReqTools.js @@ -8,6 +8,7 @@ import { AXIOS, REQUEST_TOOLS_EDIT, BASE_SIMPRO, TYPE_PROYEK, USER_LIST, USERPRO import axios from "../../../const/interceptorApi" import { NotificationContainer, NotificationManager } from 'react-notifications'; import _, { initial } from 'underscore' +import { useTranslation } from 'react-i18next'; const { Option } = Select @@ -40,7 +41,7 @@ const DialogTools = ({ openDialog, closeDialog, toggleDialog, idTask, handleClos const [description, setDescription] = useState(""); const [ownershipStatus, setOwnershipStatus] = useState("") const [ownershipName, setOwnershipName] = useState("") - + const { t } = useTranslation() const handleClearData = () => { setStatus("") @@ -131,13 +132,13 @@ const DialogTools = ({ openDialog, closeDialog, toggleDialog, idTask, handleClos - + setAssetType(e.target.value)} placeholder={`Input Asset Type...`} /> - + setAssetName(e.target.value)} placeholder={`Input Asset Name...`} /> @@ -145,19 +146,19 @@ const DialogTools = ({ openDialog, closeDialog, toggleDialog, idTask, handleClos - - setQty(e.target.value)} placeholder={`Input QTY...`} /> + + setQty(e.target.value)} placeholder={t('inputQty')} /> - - setQtyReceived(e.target.value)} placeholder={`Input QTY Received...`} /> + + setQtyReceived(e.target.value)} placeholder={t('inputQtyReceived')} /> - + setUom(e.target.value)} placeholder={`Input UOM...`} /> @@ -165,24 +166,24 @@ const DialogTools = ({ openDialog, closeDialog, toggleDialog, idTask, handleClos - + - - setDescription(e.target.value)} placeholder={`Input Description...`} /> + + setDescription(e.target.value)} placeholder={t('inputDescription')} /> - - setOwnershipStatus(val)} placeholder={t('selectOwnershipStatus')} style={{ width: '100%' }}> + + @@ -190,7 +191,7 @@ const DialogTools = ({ openDialog, closeDialog, toggleDialog, idTask, handleClos ownershipStatus === 'rent' ? - + setOwnershipName(e.target.value)} placeholder={`Input Ownership Name...`} /> @@ -206,13 +207,13 @@ const DialogTools = ({ openDialog, closeDialog, toggleDialog, idTask, handleClos return ( <> - Add Tools + {`${t('edit')} ${t('toolsRequest')}`} {renderForm()} - {' '} - + {' '} + diff --git a/src/views/SimproV2/ResourceTools/DialogForm.js b/src/views/SimproV2/ResourceTools/DialogForm.js index 6425f77..225d0ed 100644 --- a/src/views/SimproV2/ResourceTools/DialogForm.js +++ b/src/views/SimproV2/ResourceTools/DialogForm.js @@ -3,12 +3,8 @@ import { Modal, ModalHeader, ModalBody, ModalFooter, Button, Form, FormGroup, Label, Input, Col, Row } from 'reactstrap'; -import { DatePicker, Tooltip, Select, Input as InputAntd } from 'antd'; -import moment from 'moment'; import 'antd/dist/antd.css'; -import { formatRupiah, formatNumber } from '../../../const/CustomFunc' -import { ROLE_SEARCH } from '../../../const/ApiConst' -const { Option } = Select +import { useTranslation } from 'react-i18next'; const token = window.localStorage.getItem('token'); const config = { @@ -26,7 +22,7 @@ const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, dataEdi const [qty, setQty] = useState('') const [assetType, setAssetType] = useState('') const [description, setDescription] = useState('') - + const { t } = useTranslation() useEffect(() => { if (typeDialog === "Edit") { setId(dataEdit.id) @@ -88,36 +84,36 @@ const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, dataEdi - - setName(e.target.value)} placeholder={`Name...`} /> + + setName(e.target.value)} placeholder={t('inputName')} /> - - setAssetType(e.target.value)} placeholder={`Asset Type...`} /> + + setAssetType(e.target.value)} placeholder={t('inputAsset')} /> - - setUom(e.target.value)} placeholder={`UOM...`} /> + + setUom(e.target.value)} placeholder={t('inputUOM')} /> - - setQty(e.target.value)} placeholder={`QTY...`} /> + + setQty(e.target.value)} placeholder={t('inputQTY')} /> - - setDescription(e.target.value)} placeholder={`Description...`} /> + + setDescription(e.target.value)} placeholder={t('inputDescription')} /> @@ -129,13 +125,13 @@ const DialogForm = ({ openDialog, closeDialog, toggleDialog, typeDialog, dataEdi return ( <> - {typeDialog == "Save" ? `Add` : "Edit"} Tools Resource + {typeDialog == "Save" ? `Add` : "Edit"} {t('toolsResource')} {renderForm()} {' '} - + diff --git a/src/views/SimproV2/ResourceTools/index.js b/src/views/SimproV2/ResourceTools/index.js index d38cf68..6003a5c 100644 --- a/src/views/SimproV2/ResourceTools/index.js +++ b/src/views/SimproV2/ResourceTools/index.js @@ -5,15 +5,14 @@ import React, { useState, useEffect, useMemo } from 'react'; import SweetAlert from 'react-bootstrap-sweetalert'; import _, { initial } from 'underscore' import axios from "../../../const/interceptorApi" -import moment from 'moment' import { Card, CardBody, CardHeader, Col, Row, Input } from 'reactstrap'; -import { DownloadOutlined } from '@ant-design/icons'; import { NotificationContainer, NotificationManager } from 'react-notifications'; import { Pagination, Table, Button, Tooltip, Tabs, Collapse } from 'antd'; import { renderLabelStatus } from '../../../const/CustomFunc'; import { TOOLS_RESOURCE_ADD, TOOLS_RESOURCE_SEARCH, REQUEST_TOOLS_SEARCH, TOOLS_RESOURCE_EDIT, TOOLS_RESOURCE_DELETE } from '../../../const/ApiConst'; +import { useTranslation } from 'react-i18next'; const { TabPane } = Tabs; const { Panel } = Collapse; @@ -61,6 +60,7 @@ const ResourceWorker = ({ params }) => { const [totalPage, setTotalPage] = useState(0) const [typeDialog, setTypeDialog] = useState('Save') const pageName = params.name; + const { t } = useTranslation(); useEffect(() => { getDataReqTools() @@ -508,24 +508,24 @@ const ResourceWorker = ({ params }) => { const RenderTable = useMemo(() => { const columns = [ { - title: 'Action', + title: t('action'), dataIndex: '', key: 'x', className: 'nowrap', render: (text, record) => <> - - + + - + , }, - { title: 'Name', dataIndex: 'name', key: 'name' }, - { title: 'Asset Type', dataIndex: 'asset_type', key: 'asset_type' }, - { title: 'UOM', dataIndex: 'uom', key: 'uom' }, - { title: 'QTY', dataIndex: 'qty', key: 'qty' }, - { title: 'Description', dataIndex: 'description', key: 'description' }, + { title: t('name'), dataIndex: 'name', key: 'name' }, + { title: t('assetType'), dataIndex: 'asset_type', key: 'asset_type' }, + { title: t('uom'), dataIndex: 'uom', key: 'uom' }, + { title: t('qty'), dataIndex: 'qty', key: 'qty' }, + { title: t('description'), dataIndex: 'description', key: 'description' }, ]; return ( {

    {pageName}

    - + - + - + @@ -588,32 +588,32 @@ const ResourceWorker = ({ params }) => { let columns = [ { - title: 'Action', + title: t('action'), dataIndex: '', key: 'x', render: (text, record) => <> {type == "delivery" ? "-" : ( - <> - + <> + - + )} , }, { title: 'Status', dataIndex: 'status', key: 'status', render: (text, record) => renderLabelStatus(text) }, - { title: 'Name', dataIndex: 'asset_name', key: 'asset_name' }, - { title: 'Asset Type', dataIndex: 'asset_type', key: 'asset_type' }, - { title: 'UOM', dataIndex: 'uom', key: 'uom' }, - { title: 'QTY', dataIndex: 'qty', key: 'qty' }, + { title: t('name'), dataIndex: 'asset_name', key: 'asset_name' }, + { title: t('assetType'), dataIndex: 'asset_type', key: 'asset_type' }, + { title: t('uom'), dataIndex: 'uom', key: 'uom' }, + { title: t('qty'), dataIndex: 'qty', key: 'qty' }, ]; if (type === 'request') { - columns.push({ title: 'QTY Received', dataIndex: 'qty_received', key: 'qty_received' }); + columns.push({ title: t('qtyReceived'), dataIndex: 'qty_received', key: 'qty_received' }); } - columns.push({ title: 'Ownership Status', dataIndex: 'ownership_status', key: 'ownership_status' }); - columns.push({ title: 'Ownership Name', dataIndex: 'ownership_name', key: 'ownership_name' }); + columns.push({ title: t('ownershipStatus'), dataIndex: 'ownership_status', key: 'ownership_status' }); + columns.push({ title: t('ownershipName'), dataIndex: 'ownership_name', key: 'ownership_name' }); return (
    { const RenderToolsRequest = () => -

    Tools Request

    +

    {t('toolsRequest')}

    - + - + @@ -651,20 +651,20 @@ const ResourceWorker = ({ params }) => { })} : -
    No data available
    +
    {t('noData')}
    } const RenderToolsDeliver = () => -

    Tools Delivery

    +

    {t('toolsDelivery')}

    - + - + @@ -682,7 +682,7 @@ const ResourceWorker = ({ params }) => { })} : -
    No data available
    +
    {t('noData')}
    } @@ -707,12 +707,12 @@ const ResourceWorker = ({ params }) => { showCancel confirmBtnText="Delete" confirmBtnBsStyle="danger" - title={`Are you sure?`} + title={t('deleteConfirm')} onConfirm={onConfirmDelete} onCancel={() => cancelDelete()} focusCancelBtn > - Delete this data + {t('deleteMsg')} { {RenderDialogFormTools} - + {RenderToolsResource()} - + {RenderToolsRequest()} - + {RenderToolsDeliver()} diff --git a/src/views/SimproV2/ResourceWorker/index.js b/src/views/SimproV2/ResourceWorker/index.js index b311491..b7a4e35 100644 --- a/src/views/SimproV2/ResourceWorker/index.js +++ b/src/views/SimproV2/ResourceWorker/index.js @@ -12,7 +12,7 @@ import { Pagination, Table, Button, Tooltip } from 'antd'; import { PROYEK_SEARCH, USER_ADD, USER_SEARCH, USER_EDIT, USER_DELETE, ROLE_SEARCH, DIVISI_SEARCH, USER_SHIFT_ADD } from '../../../const/ApiConst'; - +import { useTranslation } from 'react-i18next'; const url = ""; const proyek_id = localStorage.getItem('proyek_id'); const role_id = localStorage.getItem('role_id'); @@ -52,7 +52,7 @@ const ResourceWorker = ({ params }) => { const [typeDialog, setTypeDialog] = useState('Save') const [typeDialogShift, setTypeDialogShift] = useState('Save') const pageName = params.name; - + const { t } = useTranslation(); useEffect(() => { getRoleList() getDivisiList() @@ -468,15 +468,15 @@ const ResourceWorker = ({ params }) => { const RenderTable = useMemo(() => { const columns = [ { - title: 'Action', + title: t('action'), dataIndex: '', key: 'x', render: (text, record) => <> - + - + @@ -485,12 +485,12 @@ const ResourceWorker = ({ params }) => { , }, - { title: 'NIK (KTP/ ID Card)', dataIndex: 'ktp_number', key: 'ktp_number' }, - { title: 'Employee Name', dataIndex: 'name', key: 'name' }, - { title: 'Divisi', dataIndex: 'join_second_name', key: 'join_second_name' }, - { title: 'Employee Type', dataIndex: 'employee_type', key: 'employee_type' }, + { title: t('nik'), dataIndex: 'ktp_number', key: 'ktp_number' }, + { title: t('nameHR'), dataIndex: 'name', key: 'name' }, + { title: t('division'), dataIndex: 'join_second_name', key: 'join_second_name' }, + { title: t('employeeType'), dataIndex: 'employee_type', key: 'employee_type' }, { - title: 'Role', + title: t('roles'), dataIndex: 'join_first_name', key: 'join_first_name', render: (text, record) => <>{record.join_first_name} @@ -519,12 +519,12 @@ const ResourceWorker = ({ params }) => { showCancel confirmBtnText="Delete" confirmBtnBsStyle="danger" - title={`Are you sure?`} + title={t('deleteConfirm')} onConfirm={onConfirmDelete} onCancel={() => cancelDelete()} focusCancelBtn > - Delete this data + {t('deleteMsg')} {

    {pageName}

    - + - + - + diff --git a/src/views/SimproV2/Settings/DialogForm.js b/src/views/SimproV2/Settings/DialogForm.js new file mode 100644 index 0000000..33c57cc --- /dev/null +++ b/src/views/SimproV2/Settings/DialogForm.js @@ -0,0 +1,265 @@ +import React, { useEffect, useState } from 'react' +import { + Modal, ModalHeader, ModalBody, ModalFooter, + Button, Form, FormGroup, Label, Input, Col, Row, + Nav, NavItem, NavLink, TabContent, TabPane +} from 'reactstrap'; + +import { Select, DatePicker } from 'antd'; + +const { Option } = Select + + + +const DialogForm = ({ + openDialog, + closeDialog, + toggleDialog, + typeDialogProp, + roleList, + nameProp, + noHpProp, + idNumberProp, + genderProp, + birthdayPlaceProp, + birthdayDateProp, + addressProp, + emailProp, + userNameProp, +}) => { + const token = window.localStorage.getItem('token'); + const [typeDialog, setTypeDialog] = useState(typeDialogProp) + const [userName, setUserName] = useState(userNameProp) + const [name, setName] = useState(nameProp) + const [noHp, setNohp] = useState(noHpProp) + const [gender, setGender] = useState(genderProp) + const [address, setAddres] = useState(addressProp) + const [birthdayPlace, setBirthdayplace] = useState(birthdayPlaceProp) + const [birthdayDate, setBirthdaydate] = useState(birthdayDateProp) + const [idNumber, setIdnumber] = useState(idNumberProp) + const [email, setEmail] = useState(emailProp) + const [password, setPassword] = useState('') + const [oldPassword, setOldPassword] = useState('') + const [newPassword, setNewPassword] = useState('') + const [newPasswordConfirm, setNewPasswordConfirm] = useState('') + const [activeTab, setActiveTab] = useState('tab1') + + const handleSave = () => { + let data = ''; + if (typeDialog === "Personal") { + data = { + name: name, + phone_number: noHp, + gender: gender, + ktp_number: idNumber, + birth_place: birthdayPlace, + address: address, + }; + if (birthdayDate) { + data.birth_date = birthdayDate; + } + closeDialog('profile', data) + } else if (typeDialog === "Account") { + data = { + username: userName, + email: email, + password: newPassword, + } + closeDialog('profile', data) + } + } + + const handleCancel = () => { + closeDialog('cancel', 'none') + } + + const setupSelectRole = () => { + return ( + <> + {roleList.map((val, index) => { + return ( + + ) + })} + + ) + } + + + const renderForm = () => { + return ( +
    + +
    + + + setName(e.target.value)} /> + + + + + setIdnumber(e.target.value)} /> + + + + + setAddres(e.target.value)} /> + + + + + + + setNohp(e.target.value)} /> + + + + + setGender(e.target.value)}> + + + + + + + + + setBirthdayplace(e.target.value)} /> + + + + + setBirthdaydate(date)} /> + + + + + + ) + } + + const renderFormAccount = () => { + return ( + + + + + + setUserName(e.target.value)} /> + + + + + + setEmail(e.target.value)} /> + + + + + + setOldPassword(e.target.value)} /> + + + + + setNewPassword(e.target.value)} /> + + + + + setNewPasswordConfirm(e.target.value)} /> + + + + + ) + } + + const renderFormSetting = () => { + return ( + + + + + + setUserName(e.target.value)} /> + + + + + + setEmail(e.target.value)} /> + + + + + ) + } + + return ( + <> + + + Update {typeDialog == "Personal" ? `Personal` : "Account"} Data + + + + + + {renderForm()} + + + {renderFormAccount()} + + + {renderFormSetting()} + + + + + {' '} + + + + + ) + + + +} + +export default DialogForm; diff --git a/src/views/SimproV2/Settings/index.js b/src/views/SimproV2/Settings/index.js new file mode 100644 index 0000000..c18e4bb --- /dev/null +++ b/src/views/SimproV2/Settings/index.js @@ -0,0 +1,257 @@ +import * as XLSX from 'xlsx'; +import React, { useState, useEffect, useMemo } from 'react'; +import SweetAlert from 'react-bootstrap-sweetalert'; +import axios from "../../../const/interceptorApi" +import { Card, CardBody, CardHeader, Col, Row, Input, Table, Button } from 'reactstrap'; +import { NotificationContainer, NotificationManager } from 'react-notifications'; +import { Pagination, Tooltip } from 'antd'; +import { USER_EDIT, SATUAN_ADD, SATUAN_EDIT, SATUAN_DELETE, SATUAN_SEARCH } from '../../../const/ApiConst'; +import profile from '../../../assets/img/profile.png' +import DialogForm from './DialogForm' +import { ROLE_SEARCH, BASE_OSPRO } from '../../../const/ApiConst' + + + + +const Setting = ({ params }) => { + const token = localStorage.getItem("token") + const config = { + headers: { + "Content-Type": "application/json", + "Authorization": `Bearer ${token}` + } + } + + const pageName = params.name; + + + + + const [openDialog, setOpenDialog] = useState(false) + const [typeDialog, setTypeDialog] = useState('Personal') + const [id, setId] = useState(0) + const [roleList, setRoleList] = useState([]) + const [userProfile, setUserprofile] = useState(null) + const [userName, setUserName] = useState("") + const [name, setName] = useState('') + const [noHp, setNohp] = useState("") + const [gender, setGender] = useState("") + const [address, setAddres] = useState("") + const [birthdayPlace, setBirthdayplace] = useState("") + const [birthdayDate, setBirthdaydate] = useState("") + const [idNumber, setIdnumber] = useState("") + const [divisi, setDivisi] = useState("") + const [role, setRole] = useState("") + const [email, setEmail] = useState("") + const [employeeType, setEmployeeType] = useState("") + + + console.log('divisi', divisi) + console.log('divisi', role) + console.log('divisi', email) + + + + + + + + // console.log('userProfile', userProfile) + + useEffect(() => { + getDataProfileUser(); + getRoleList() + }, []) + + useEffect(() => { + if (userProfile && userProfile != {}) { + setId(userProfile?.id) + setUserName(userProfile?.username); + setName(userProfile?.name); + setEmail(userProfile?.email); + setNohp(userProfile?.phone_number); + setAddres(userProfile?.address); + setIdnumber(userProfile?.ktp_number); + setGender(userProfile?.gender); + // setDivisi(userProfile?.divisi.name); + // setRole(userProfile?.role.name); + setBirthdayplace(userProfile?.birth_place); + setBirthdaydate(userProfile?.birth_date); + setEmployeeType(userProfile?.employee_type); + + } + }, [userProfile]) + + const handleOpenDialog = (type) => { + setOpenDialog(true) + setTypeDialog(type) + } + + const handleCloseDialog = (type, data) => { + if (type === "profile") { + saveProfile(data); + } + setOpenDialog(false) + } + + const saveProfile = async (data) => { + + let urlEdit = USER_EDIT(id) + const formData = data + + const result = await axios.put(urlEdit, formData, config) + .then(res => res) + .catch((error) => error.response); + + if (result && result.data && result.data.code === 200) { + getDataProfileUser(); + NotificationManager.success(`Data resource berhasil diedit`, 'Success!!'); + } else { + NotificationManager.error(`Data resource gagal di edit`, `Failed!!`); + } + } + + const toggleAddDialog = () => { + setOpenDialog(!openDialog) + } + + const getRoleList = async () => { + const formData = { + "paging": { "start": 0, "length": -1 }, + "orders": { "columns": ["id"], "ascending": false } + } + + const result = await axios + .post(ROLE_SEARCH, formData, config) + .then(res => res) + .catch((error) => error.response); + + if (result && result.data && result.data.code == 200) { + setRoleList(result.data.data); + } + } + + const getDataProfileUser = async () => { + const id = localStorage.getItem("user_id") + + const url = `${BASE_OSPRO}/api/human-resource/edit/${id}` + + + const result = await axios + .get(url, config) + .then((res) => res) + .catch((error) => error.response); + console.log("data User :", result); + if (result && result.data && result.data.code == 200) { + let dataRes = result.data.data; + setUserprofile(dataRes); + } else { + NotificationManager.error("Gagal Mengambil Data!!", "Failed"); + } + }; + + + + return ( +
    + + toggleAddDialog} + typeDialogProp={typeDialog} + roleList={roleList} + nameProp={name} + noHpProp={noHp} + idNumberProp={idNumber} + genderProp={gender} + divisiProp={divisi} + birthdayPlaceProp={birthdayPlace} + birthdayDateProp={birthdayDate} + addressProp={address} + emailProp={email} + userNameProp={userName} + /> + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + ) +} + +export default Setting;
    Profile Setting
    Nama   :  {name}
    Username   :  {userName}
    Email   :  {email}
    Password     :  **********
    Nomor Handphone   :   {noHp}
    Alamat   :   {address}
    ID Number   :   {idNumber}
    Gender   :   {gender}
    Divisi   :   {divisi}
    employee   :   {divisi}
    Role   :   {role}
    Tempat Lahir  :   {birthdayPlace}
    Tanggal Lahir   :   {birthdayDate}