From 414956bbd8592a9a036b32d0b4b5f4538d2c9247 Mon Sep 17 00:00:00 2001 From: wahyu Date: Mon, 16 Oct 2023 16:25:16 +0700 Subject: [PATCH 1/7] default page --- src/views/Master/MasterRoles/DialogForm.js | 63 +- .../Master/MasterRoles/DialogMenuRoles.js | 468 +++++------ src/views/Master/MasterRoles/index.js | 6 +- src/views/Pages/Login/Login.js | 739 ++++++++++-------- 4 files changed, 688 insertions(+), 588 deletions(-) diff --git a/src/views/Master/MasterRoles/DialogForm.js b/src/views/Master/MasterRoles/DialogForm.js index a511605..a33f686 100644 --- a/src/views/Master/MasterRoles/DialogForm.js +++ b/src/views/Master/MasterRoles/DialogForm.js @@ -3,6 +3,19 @@ import { Modal, ModalHeader, ModalBody, ModalFooter, Row, Col } from 'reactstrap import { Button, Form, FormGroup, Label, Input } from 'reactstrap'; import 'antd/dist/antd.css'; import { withTranslation } from 'react-i18next'; +import axios from 'axios'; +import { Select } from 'antd'; +import { MENU_SEARCH } from '../../../const/ApiConst.js'; + +const { Option } = Select +const token = window.localStorage.getItem('token'); +const config = { + headers: + { + Authorization: `Bearer ${token}`, + "Content-type": `application/json` + } +}; class DialogForm extends Component { constructor(props) { @@ -13,11 +26,14 @@ class DialogForm extends Component { description: "", openDialog: false, isParentClick: false, + menu: [], + selectedMenu: null } } async componentDidMount() { this.props.showDialog(this.showDialog); + this.getAllMenu(); } async componentDidUpdate() { @@ -27,19 +43,38 @@ class DialogForm extends Component { this.setState({ id: dataEdit.id, name: dataEdit.name, - description: dataEdit.description + description: dataEdit.description, + selectedMenu: dataEdit.default_page }) } else { this.setState({ id: 0, name: "", - description: "" + description: "", + selectedMenu: null }) } this.setState({ isParentClick: false }); } } + getAllMenu = async () => { + const payload = { + "paging": { "start": 0, "length": -1 }, + "columns": [ + { "name": "name", "logic_operator": "ilike", "value": "", "operator": "AND" } + ], + "joins": [], + "orders": { "columns": ["id"], "ascending": false } + } + const result = await axios + .post(MENU_SEARCH, payload, config) + .then(res => res) + .catch((error) => error.response); + if (result && result.data && result.data.code == 200) { + this.setState({ menu: result.data.data }); + } + } showDialog = () => { this.setState({ isParentClick: true }); @@ -60,7 +95,8 @@ class DialogForm extends Component { const { id, name, - description + description, + selectedMenu } = this.state let data = ''; @@ -70,14 +106,16 @@ class DialogForm extends Component { data = { id, name, - description + description, + selectedMenu } this.props.closeDialog('save', data); } else { data = { id, name, - description + description, + selectedMenu } this.props.closeDialog('edit', data); } @@ -113,6 +151,21 @@ class DialogForm extends Component { this.setState({ description: e.target.value })} placeholder={this.props.t('inputDescription')} /> + + + + { + this.setState({ selectedMenu: e.target.value }); + }}> + {this.state.menu.map((item) => ( + + ))} + + + ) diff --git a/src/views/Master/MasterRoles/DialogMenuRoles.js b/src/views/Master/MasterRoles/DialogMenuRoles.js index 2ab0523..cec1b42 100644 --- a/src/views/Master/MasterRoles/DialogMenuRoles.js +++ b/src/views/Master/MasterRoles/DialogMenuRoles.js @@ -1,234 +1,234 @@ -import React, { Component } from 'react' -import { Modal, ModalHeader, ModalBody, ModalFooter, Row, Col, Table } from 'reactstrap'; -import { Button, Form, FormGroup, Label, Input } from 'reactstrap'; -import 'antd/dist/antd.css'; -import axios from 'axios'; -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 token = window.localStorage.getItem('token'); - - -const config = { - headers: - { - Authorization: `Bearer ${token}`, - "Content-type": `application/json` - } -}; - -class DialogMenuRoles extends Component { - constructor(props) { - super(props) - this.state = { - id: 0, - name: "", - description: "", - openDialog: false, - isParentClick: false, - menu: [], - stateMenu: [], - allChecked: true, - } - } - - async componentDidMount() { - this.props.showDialog(this.showDialog); - this.getAllMenu(); - } - - async componentDidUpdate() { - if (this.state.isParentClick === true) { - const { idRoles } = this.props - this.setStateMenu(true); - this.setState({ isParentClick: false, id: idRoles }); - } - } - - - showDialog = () => { - this.setState({ isParentClick: true }); - } - - getAllMenu = async () => { - const payload = { - "paging": { "start": 0, "length": -1 }, - "columns": [ - { "name": "name", "logic_operator": "ilike", "value": "", "operator": "AND" } - ], - "joins": [], - "orders": { "columns": ["id"], "ascending": false } - } - - - - const result = await axios - .post(MENU_SEARCH, payload, config) - .then(res => res) - .catch((error) => error.response); - - - if (result && result.data && result.data.code == 200) { - this.setState({ menu: result.data.data }, () => { - this.setStateMenu(false); - }); - } else { - } - - } - - setStateMenu = edit => { - const stateMenu = []; - this.state.menu.map((val) => { - stateMenu.push(false); - }) - this.setState({ stateMenu: [] }, () => { - this.setState({ stateMenu: stateMenu }, () => { - if (edit) { - this.checkMenuRoles(); - } - }) - }) - } - - checkMenuRoles = () => { - let copyStateMenu = [...this.state.stateMenu]; - this.props.menuRoles.map((val, indexMenu) => { - let index = this.getIndexDataMenu(val.menu_id); - console.log("index true", val.menu_id); - if (index >= 0) { - copyStateMenu[index] = true; - } - }) - this.setState({ stateMenu: [] }, () => { - let check = copyStateMenu.some(this.checkArray); - if (check === false) { - this.setState({ allChecked: true, stateMenu: copyStateMenu }) - } else { - this.setState({ allChecked: false, stateMenu: copyStateMenu }) - } - }) - } - - - getIndexDataMenu = (id) => { - let index = this.state.menu.findIndex(obj => obj.id === id); - return index - } - - handleSave = () => { - const { - stateMenu, - menu, - id - } = this.state - - const arrayData = []; - - menu.map((val, index) => { - let data = { - roles_id: id, - menu_id: val.id, - checked: stateMenu[index] - } - arrayData.push(data); - }) - this.props.closeDialog('save', arrayData); - this.setState({ id: 0 }); - } - - handleCancel = () => { - this.props.closeDialog('cancel', 'none') - } - - handleChangeCheckbox = (checked, index) => { - let copyStateMenu = [...this.state.stateMenu]; - copyStateMenu[index] = checked; - console.log("cek uncek", copyStateMenu); - this.setState({ stateMenu: copyStateMenu }) - } - - renderForm = () => { - const { menu, stateMenu } = this.state - return ( - menu.map((val, index) => { - return ( - - {val.name} - this.handleChangeCheckbox(e.target.checked, index)} defaultChecked={stateMenu[index]} /> - - ) - }) - ) - } - - checkArray = (val) => { - return val === false; - } - - handleAllChecked = (checked) => { - this.setState({ allChecked: !this.state.allChecked }); - if (checked === true) { - console.log("test 1") - let check = this.state.stateMenu.some(this.checkArray); - - if (check) { - const stateMenu = []; - this.state.menu.map((val) => { - stateMenu.push(true); - }) - - this.setState({ stateMenu: [] }, () => { - this.setState({ stateMenu: stateMenu }); - }) - } - - - } else { - console.log("test 1 2 3 ") - const stateMenu = []; - this.state.menu.map((val) => { - stateMenu.push(false); - }) - - this.setState({ stateMenu: [] }, () => { - this.setState({ stateMenu: stateMenu }); - }) - } - } - - render() { - return ( - - {this.props.t('menuRoles')} - -
- - - - - - - - - - - - - {this.renderForm()} - -
Menu - T/F -
All this.handleAllChecked(e.target.checked)} checked={this.state.allChecked} />
-
-
- - {' '} - - -
- ) - } -} -export default withTranslation()(DialogMenuRoles); \ No newline at end of file +import React, { Component } from 'react' +import { Modal, ModalHeader, ModalBody, ModalFooter, Row, Col, Table } from 'reactstrap'; +import { Button, Form, FormGroup, Label, Input } from 'reactstrap'; +import 'antd/dist/antd.css'; +import axios from 'axios'; +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 token = window.localStorage.getItem('token'); + + +const config = { + headers: + { + Authorization: `Bearer ${token}`, + "Content-type": `application/json` + } +}; + +class DialogMenuRoles extends Component { + constructor(props) { + super(props) + this.state = { + id: 0, + name: "", + description: "", + openDialog: false, + isParentClick: false, + menu: [], + stateMenu: [], + allChecked: true, + } + } + + async componentDidMount() { + this.props.showDialog(this.showDialog); + this.getAllMenu(); + } + + async componentDidUpdate() { + if (this.state.isParentClick === true) { + const { idRoles } = this.props + this.setStateMenu(true); + this.setState({ isParentClick: false, id: idRoles }); + } + } + + + showDialog = () => { + this.setState({ isParentClick: true }); + } + + getAllMenu = async () => { + const payload = { + "paging": { "start": 0, "length": -1 }, + "columns": [ + { "name": "name", "logic_operator": "ilike", "value": "", "operator": "AND" } + ], + "joins": [], + "orders": { "columns": ["id"], "ascending": false } + } + + + + const result = await axios + .post(MENU_SEARCH, payload, config) + .then(res => res) + .catch((error) => error.response); + + + if (result && result.data && result.data.code == 200) { + this.setState({ menu: result.data.data }, () => { + this.setStateMenu(false); + }); + } else { + } + + } + + setStateMenu = edit => { + const stateMenu = []; + this.state.menu.map((val) => { + stateMenu.push(false); + }) + this.setState({ stateMenu: [] }, () => { + this.setState({ stateMenu: stateMenu }, () => { + if (edit) { + this.checkMenuRoles(); + } + }) + }) + } + + checkMenuRoles = () => { + let copyStateMenu = [...this.state.stateMenu]; + this.props.menuRoles.map((val, indexMenu) => { + let index = this.getIndexDataMenu(val.menu_id); + console.log("index true", val.menu_id); + if (index >= 0) { + copyStateMenu[index] = true; + } + }) + this.setState({ stateMenu: [] }, () => { + let check = copyStateMenu.some(this.checkArray); + if (check === false) { + this.setState({ allChecked: true, stateMenu: copyStateMenu }) + } else { + this.setState({ allChecked: false, stateMenu: copyStateMenu }) + } + }) + } + + + getIndexDataMenu = (id) => { + let index = this.state.menu.findIndex(obj => obj.id === id); + return index + } + + handleSave = () => { + const { + stateMenu, + menu, + id + } = this.state + + const arrayData = []; + + menu.map((val, index) => { + let data = { + roles_id: id, + menu_id: val.id, + checked: stateMenu[index] + } + arrayData.push(data); + }) + this.props.closeDialog('save', arrayData); + this.setState({ id: 0 }); + } + + handleCancel = () => { + this.props.closeDialog('cancel', 'none') + } + + handleChangeCheckbox = (checked, index) => { + let copyStateMenu = [...this.state.stateMenu]; + copyStateMenu[index] = checked; + console.log("cek uncek", copyStateMenu); + this.setState({ stateMenu: copyStateMenu }) + } + + renderForm = () => { + const { menu, stateMenu } = this.state + return ( + menu.map((val, index) => { + return ( + + {val.name} + this.handleChangeCheckbox(e.target.checked, index)} defaultChecked={stateMenu[index]} /> + + ) + }) + ) + } + + checkArray = (val) => { + return val === false; + } + + handleAllChecked = (checked) => { + this.setState({ allChecked: !this.state.allChecked }); + if (checked === true) { + console.log("test 1") + let check = this.state.stateMenu.some(this.checkArray); + + if (check) { + const stateMenu = []; + this.state.menu.map((val) => { + stateMenu.push(true); + }) + + this.setState({ stateMenu: [] }, () => { + this.setState({ stateMenu: stateMenu }); + }) + } + + + } else { + console.log("test 1 2 3 ") + const stateMenu = []; + this.state.menu.map((val) => { + stateMenu.push(false); + }) + + this.setState({ stateMenu: [] }, () => { + this.setState({ stateMenu: stateMenu }); + }) + } + } + + render() { + return ( + + {this.props.t('menuRoles')} + +
+ + + + + + + + + + + + + {this.renderForm()} + +
Menu + T/F +
All this.handleAllChecked(e.target.checked)} checked={this.state.allChecked} />
+
+
+ + {' '} + + +
+ ) + } +} +export default withTranslation()(DialogMenuRoles); diff --git a/src/views/Master/MasterRoles/index.js b/src/views/Master/MasterRoles/index.js index e1b6546..332f3c8 100644 --- a/src/views/Master/MasterRoles/index.js +++ b/src/views/Master/MasterRoles/index.js @@ -179,7 +179,8 @@ class index extends Component { const formData = { name: data.name, - description: data.description + description: data.description, + default_page : data.selectedMenu } const result = await axios.post(ROLE_ADD, formData, config) @@ -198,7 +199,8 @@ class index extends Component { editRole = async (data) => { const formData = { name: data.name, - description: data.description + description: data.description, + default_page: data.selectedMenu } const url = ROLE_EDIT(data.id) const result = await axios.put(url, formData, config) diff --git a/src/views/Pages/Login/Login.js b/src/views/Pages/Login/Login.js index cb1034c..7bda490 100644 --- a/src/views/Pages/Login/Login.js +++ b/src/views/Pages/Login/Login.js @@ -1,347 +1,392 @@ -import React, { Component } from 'react'; -import { Link } from 'react-router-dom'; -import "slick-carousel/slick/slick.css"; -import "slick-carousel/slick/slick-theme.css"; -import Slider from "react-slick"; -import { Spin } from 'antd'; -import { Checkbox } from 'antd'; -import { LoadingOutlined, EyeOutlined, EyeInvisibleOutlined } from '@ant-design/icons'; -import { - Button, - Card, - CardBody, - CardGroup, - Col, - Container, - Form, - Input, - InputGroup, - InputGroupAddon, - InputGroupText, - Row, - UncontrolledAlert, - Alert, - Carousel, - CarouselIndicators, - CarouselCaption, - CarouselItem, - CarouselControl -} from 'reactstrap'; -import { USER_LOGIN, USER_LOGIN_V2, CALERTUSER_SEARCH, MENU_MANAGEMENT, APP_MODE } from '../../../const/ApiConst.js'; -import { appConfig, reloadConstants } from '../../../const/MapConst.js'; -import { APP_NAME } from '../../../const/AppConst.js' -import moment from "moment" -import axios from 'axios'; -import { NotificationContainer, NotificationManager } from 'react-notifications'; -import logo_login_adw from '../../../assets/img/logo_adyawinsa.jpg' -import logo_login_kit from '../../../assets/img/logo_kit.png' -import logo_login_nawakara from '../../../assets/img/logo_nawakara.png' -import logo_login_si from '../../../assets/img/logo-surveyor-indonesia.png' - - -const antIcon = ; - -const settings = { - dots: true, - infinite: true, - speed: 500, - arrows: false, - autoplay: true, - slidesToShow: 1, - slidesToScroll: 1 -}; - -class Login extends Component { - constructor(props) { - super(props); - this.state = { - name: '', - password: '', - remember: '', - alertVisible: false, - alertMessage: '', - alertColor: 'success', - validate: { - emailState: '', - }, - loader: false, - type: 'password' - } - this.handleChange = this.handleChange.bind(this); - this.showHide = this.showHide.bind(this); - } - showHide(e) { - e.preventDefault(); - e.stopPropagation(); - this.setState({ - type: this.state.type === 'input' ? 'password' : 'input' - }) - } - validateEmail(e) { - const emailRex = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; - const { validate } = this.state - if (emailRex.test(e.target.value)) { - validate.emailState = 'has-success' - } else { - validate.emailState = 'has-danger' - } - this.setState({ validate }) - } - - handleChange = async (event) => { - const { target } = event; - const value = target.type === 'checkbox' ? target.checked : target.value; - const { name } = target; - await this.setState({ - [name]: value, - }); - } - - getDataMenu = async (token, role_id) => { - const config = { - headers: - { - Authorization: `Bearer ${token}`, - "Content-type": `application/json` - } - }; - - let url = MENU_MANAGEMENT(role_id) - const result = await axios - .get(url, config) - .then(res => res) - .catch((error) => error.response); - - if (result && result.data && result.data.code == 200) { - let resData = result.data.data - window.localStorage.setItem('menu_login', JSON.stringify(resData)); - this.setState({ loader: false }) - // custom redirect home after login - if (role_id == 28) { - this.props.history.push("/dashboard-customer/58/63"); - } - else { - this.props.history.push("/dashboard"); - } - } else { - NotificationManager.error('Login Failed', 'Failed'); - this.setState({ loader: false }) - } - } - - submitForm = (event) => { - event.preventDefault(); - this.submitFormLogin(); - } - - submitFormLogin = async () => { - this.setState({ loader: true }) - const { name, password, remember } = this.state - - if (name === '') { - NotificationManager.error('Please fill username', 'Login Failed!'); - this.setState({ loader: false }) - return false; - } - - if (password === '') { - NotificationManager.error('Please fill password', 'Login Failed!'); - this.setState({ loader: false }) - return false; - } - - let formData = { - username: name, - password, - remember, - } - - const doLogin = await axios.post(USER_LOGIN_V2, formData) - .then(response => response) - .catch(error => { - this.setState({ loader: false }); - }); - - if (doLogin && doLogin.data && doLogin.data.code === 200) { - const { access_token, data_user } = doLogin.data.data - this.getDataMenu(access_token, data_user.role_id) - window.localStorage.setItem('isLogin', true); - window.localStorage.setItem('token', access_token); - window.localStorage.setItem('user_id', data_user.id); - window.localStorage.setItem('user_name', data_user.name); - window.localStorage.setItem('role_id', data_user.role_id); - } else { - console.log("kode : ", doLogin.data.code); - // NotificationManager.error('Cek username atau password anda!', 'Gagal Login!'); - NotificationManager.error(doLogin.data.message, 'Login Failed!'); - this.setState({ loader: false }); - } - - } - - getConfigAlert = async (token, user_id) => { - const config = { - headers: - { - Authorization: `Bearer ${token}`, - "Content-type": `application/json` - } - }; - - const payload = { - "paging": { "start": 0, "length": -1 }, - "columns": [ - { "name": "user_id", "logic_operator": "=", "value": `${user_id}`, "operator": "AND" } - ], - "joins": [], - "orders": { "columns": ["id"], "ascending": false } - } - - const result = await axios - .post(CALERTUSER_SEARCH, payload, config) - .then(res => res) - .catch((error) => error.response); - - if (result && result.data && result.data.code == 200) { - let resData = result.data.data - let configAlert = [] - resData.map((val, index) => { - configAlert.push(val.config_alert_id); - }); - window.localStorage.setItem('userConfigAlert', configAlert.join()); - } - } - - onShowAlert = (alertColor, alertMessage) => { - this.setState({ alertVisible: true, alertColor: alertColor, alertMessage: alertMessage }, () => { - window.setTimeout(() => { - this.setState({ alertVisible: false }) - }, 3000) - }); - } - - getLoginLogo = () => { - return
- } - - getLoginSlider = () => { - return -
- -
-
- -
-
- -
-
- -
-
- } - - onChecked = (e) => { - this.setState({ remember: e.target.checked }) - }; - - render() { - const { name, password, remember } = this.state; - const u_group = window.localStorage.getItem('u_group') - if (u_group !== null) { - this.props.history.push("/dashboard"); - } - return ( -
- - - - - {this.state.alertMessage} - - - - {this.getLoginSlider()} - - -
- - - -
- {this.getLoginLogo()} -

Sign In to your account

- - - - - - - { - this.setState({ name: e.target.value }) - }} - /> - - - - - - - - this.setState({ password: e.target.value })} - /> - - - {this.state.type === 'input' ? : } - - - - - - - - Remember me (7 days) - - - {this.state.loader ? ( - - ) : ( - - )} - - - - - - - -
-
-
-
-
- -
-
-
- ); - } -} - -export default Login; +import React, { Component } from 'react'; +import { Link } from 'react-router-dom'; +import "slick-carousel/slick/slick.css"; +import "slick-carousel/slick/slick-theme.css"; +import Slider from "react-slick"; +import { Spin } from 'antd'; +import { Checkbox } from 'antd'; +import { LoadingOutlined, EyeOutlined, EyeInvisibleOutlined } from '@ant-design/icons'; +import { + Button, + Card, + CardBody, + CardGroup, + Col, + Container, + Form, + Input, + InputGroup, + InputGroupAddon, + InputGroupText, + Row, + UncontrolledAlert, + Alert, + Carousel, + CarouselIndicators, + CarouselCaption, + CarouselItem, + CarouselControl +} from 'reactstrap'; +import { USER_LOGIN, USER_LOGIN_V2, CALERTUSER_SEARCH, MENU_MANAGEMENT, APP_MODE, ROLE_SEARCH } from '../../../const/ApiConst.js'; +import { appConfig, reloadConstants } from '../../../const/MapConst.js'; +import { APP_NAME } from '../../../const/AppConst.js' +import moment from "moment" +import axios from 'axios'; +import { NotificationContainer, NotificationManager } from 'react-notifications'; +import logo_login_adw from '../../../assets/img/logo_adyawinsa.jpg' +import logo_login_kit from '../../../assets/img/logo_kit.png' +import logo_login_nawakara from '../../../assets/img/logo_nawakara.png' +import logo_login_si from '../../../assets/img/logo-surveyor-indonesia.png' + + +const antIcon = ; + +const settings = { + dots: true, + infinite: true, + speed: 500, + arrows: false, + autoplay: true, + slidesToShow: 1, + slidesToScroll: 1 +}; + +class Login extends Component { + constructor(props) { + super(props); + this.state = { + name: '', + password: '', + remember: '', + alertVisible: false, + alertMessage: '', + alertColor: 'success', + validate: { + emailState: '', + }, + loader: false, + type: 'password', + defaultPage: '' + } + this.handleChange = this.handleChange.bind(this); + this.showHide = this.showHide.bind(this); + } + showHide(e) { + e.preventDefault(); + e.stopPropagation(); + this.setState({ + type: this.state.type === 'input' ? 'password' : 'input' + }) + } + validateEmail(e) { + const emailRex = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; + const { validate } = this.state + if (emailRex.test(e.target.value)) { + validate.emailState = 'has-success' + } else { + validate.emailState = 'has-danger' + } + this.setState({ validate }) + } + + handleChange = async (event) => { + const { target } = event; + const value = target.type === 'checkbox' ? target.checked : target.value; + const { name } = target; + await this.setState({ + [name]: value, + }); + } + + getDataRole = async (token, role_id) => { + const config = { + headers: + { + Authorization: `Bearer ${token}`, + "Content-type": `application/json` + } + }; + + const payload = { + "paging": { "start": 0, "length": -1 }, + "columns": [ + { "name": "id", "logic_operator": "=", "value": `${role_id}`, "operator": "AND" } + ], + "joins": [ + { + "name": "m_menu", + "column_join": "default_page", + "column_results": ["id", "name", "url"], + }, + ], + "orders": { "columns": ["id"], "ascending": false } + } + + const result = await axios + .post(ROLE_SEARCH, payload, config) + .then(res => res) + .catch((error) => error.response); + + if (result && result.data && result.data.code == 200) { + let resData = result.data.data + this.setState({defaultPage: resData[0].join_first_url}) + } + } + + getDataMenu = async (token, role_id) => { + const config = { + headers: + { + Authorization: `Bearer ${token}`, + "Content-type": `application/json` + } + }; + + let url = MENU_MANAGEMENT(role_id) + const result = await axios + .get(url, config) + .then(res => res) + .catch((error) => error.response); + + if (result && result.data && result.data.code == 200) { + let resData = result.data.data + window.localStorage.setItem('menu_login', JSON.stringify(resData)); + this.setState({ loader: false }) + // custom redirect home after login + if (role_id == 28) { + this.props.history.push("/dashboard-customer/58/63"); + } + else { + this.props.history.push("/dashboard"); + } + if (this.state.defaultPage) { + this.props.history.push(this.state.defaultPage); + } else if (role_id == 28) { + this.props.history.push("/dashboard-customer/58/63"); + } + else { + this.props.history.push("/dashboard"); + } + } else { + NotificationManager.error('Login Failed', 'Failed'); + this.setState({ loader: false }) + } + } + + submitForm = (event) => { + event.preventDefault(); + this.submitFormLogin(); + } + + submitFormLogin = async () => { + this.setState({ loader: true }) + const { name, password, remember } = this.state + + if (name === '') { + NotificationManager.error('Please fill username', 'Login Failed!'); + this.setState({ loader: false }) + return false; + } + + if (password === '') { + NotificationManager.error('Please fill password', 'Login Failed!'); + this.setState({ loader: false }) + return false; + } + + let formData = { + username: name, + password, + remember, + } + + const doLogin = await axios.post(USER_LOGIN_V2, formData) + .then(response => response) + .catch(error => { + this.setState({ loader: false }); + }); + + if (doLogin && doLogin.data && doLogin.data.code === 200) { + const { access_token, data_user } = doLogin.data.data + this.getDataRole(access_token, data_user.role_id) + this.getDataMenu(access_token, data_user.role_id) + window.localStorage.setItem('isLogin', true); + window.localStorage.setItem('token', access_token); + window.localStorage.setItem('user_id', data_user.id); + window.localStorage.setItem('user_name', data_user.name); + window.localStorage.setItem('role_id', data_user.role_id); + } else { + console.log("kode : ", doLogin.data.code); + // NotificationManager.error('Cek username atau password anda!', 'Gagal Login!'); + NotificationManager.error(doLogin.data.message, 'Login Failed!'); + this.setState({ loader: false }); + } + + } + + getConfigAlert = async (token, user_id) => { + const config = { + headers: + { + Authorization: `Bearer ${token}`, + "Content-type": `application/json` + } + }; + + const payload = { + "paging": { "start": 0, "length": -1 }, + "columns": [ + { "name": "user_id", "logic_operator": "=", "value": `${user_id}`, "operator": "AND" } + ], + "joins": [], + "orders": { "columns": ["id"], "ascending": false } + } + + const result = await axios + .post(CALERTUSER_SEARCH, payload, config) + .then(res => res) + .catch((error) => error.response); + + if (result && result.data && result.data.code == 200) { + let resData = result.data.data + let configAlert = [] + resData.map((val, index) => { + configAlert.push(val.config_alert_id); + }); + window.localStorage.setItem('userConfigAlert', configAlert.join()); + } + } + + onShowAlert = (alertColor, alertMessage) => { + this.setState({ alertVisible: true, alertColor: alertColor, alertMessage: alertMessage }, () => { + window.setTimeout(() => { + this.setState({ alertVisible: false }) + }, 3000) + }); + } + + getLoginLogo = () => { + return
+ } + + getLoginSlider = () => { + return +
+ +
+
+ +
+
+ +
+
+ +
+
+ } + + onChecked = (e) => { + this.setState({ remember: e.target.checked }) + }; + + render() { + const { name, password, remember } = this.state; + const u_group = window.localStorage.getItem('u_group') + if (u_group !== null) { + this.props.history.push("/dashboard"); + } + return ( +
+ + + + + {this.state.alertMessage} + + + + {this.getLoginSlider()} + + +
+ + + +
+ {this.getLoginLogo()} +

Sign In to your account

+ + + + + + + { + this.setState({ name: e.target.value }) + }} + /> + + + + + + + + this.setState({ password: e.target.value })} + /> + + + {this.state.type === 'input' ? : } + + + + + + + + Remember me (7 days) + + + {this.state.loader ? ( + + ) : ( + + )} + + + + + + + +
+
+
+
+
+ +
+
+
+ ); + } +} + +export default Login; From d7fe5cd02b29863d9698b3de820e2d1eb6afc1c7 Mon Sep 17 00:00:00 2001 From: wahyu Date: Wed, 18 Oct 2023 09:16:45 +0700 Subject: [PATCH 2/7] report analysis init --- .../SimproV2/CreatedProyek/ReportAnalysis.js | 26 ++++++++++++++++++ src/views/SimproV2/CreatedProyek/index.js | 27 ++++++++++++++++++- 2 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 src/views/SimproV2/CreatedProyek/ReportAnalysis.js diff --git a/src/views/SimproV2/CreatedProyek/ReportAnalysis.js b/src/views/SimproV2/CreatedProyek/ReportAnalysis.js new file mode 100644 index 0000000..44b6406 --- /dev/null +++ b/src/views/SimproV2/CreatedProyek/ReportAnalysis.js @@ -0,0 +1,26 @@ +import React from 'react' +import { Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap'; +import { Button } from 'reactstrap'; +import 'antd/dist/antd.css'; +import './style.css' + + + const ReportAnalysis = ({ openDialog, closeDialog, toggleDialog }) => { + + return ( + <> + + Project + +
Report Analysis
+
+ + + +
+ + ) + +} + +export default ReportAnalysis; diff --git a/src/views/SimproV2/CreatedProyek/index.js b/src/views/SimproV2/CreatedProyek/index.js index 6c2f44b..9e59876 100644 --- a/src/views/SimproV2/CreatedProyek/index.js +++ b/src/views/SimproV2/CreatedProyek/index.js @@ -87,6 +87,7 @@ import AssignHrProject from "./AsignHrProject"; import AssignCustProject from "./AsignCustProject"; import AssignK3Project from "./AssignK3Project"; import ViewProject from "./ViewProject"; +import ReportAnalysis from "./ReportAnalysis"; import { Icon } from "@iconify/react"; // import { Link } from 'react-router-dom'; // import SubProyekComp from './SubProyekComp'; @@ -122,6 +123,7 @@ const CreatedProyek = ({ params, ...props }) => { const [totalPage, setTotalPage] = useState(0); const [openDialog, setOpenDialog] = useState(false); const [openDialogViewDetail, setOpenDialogViewDetail] = useState(false); + const [openDialogRA, setOpenDialogRA] = useState(false); const [openDialogMaterial, setOpenDialogMaterial] = useState(false); const [openDialogTools, setOpenDialogTools] = useState(false); const [openDialogGantt, setOpenDialogGantt] = useState(false); @@ -591,6 +593,12 @@ const CreatedProyek = ({ params, ...props }) => { getProjectDetail(data.id); }; + const handleOpenReport = async (data) => { + setOpenDialogRA(true); + } + const handleCloseReport = async (data) => { + setOpenDialogRA(false); + } const getDataProject = async (proyek_id) => { const url = PROYEK_GET_ID(proyek_id); const result = await axios @@ -849,6 +857,7 @@ const CreatedProyek = ({ params, ...props }) => { const toggleAddDialog = () => setOpenDialog(!openDialog); const toggleAddDialogProyek = () => setOpenDialogProyek(!openDialogProyek); + const toggleAddDialogRA = () => setOpenDialogRA(!openDialogRA); const toggleAddDialogView = () => { if (openDialogViewDetail) { setProjectApproval(null); @@ -1504,6 +1513,12 @@ const CreatedProyek = ({ params, ...props }) => { S Curve +
handleOpenReport(text)}> + + + + Report Analysis +
{/* */}
{ ), [openDialogViewDetail] ); - + const renderReportAnalysis = useMemo( + () => ( + + ), + [openDialogRA] + ); const renderDialogGantt = useMemo( () => ( { Delete this data {ViewProyek} + {renderReportAnalysis} {RenderDialogForm} {RenderDialogFormProyek} {RenderDialogFormMaterial} From fc4b41b6730ec447ba79d9bfecbb1383e9e45a68 Mon Sep 17 00:00:00 2001 From: wahyu Date: Wed, 18 Oct 2023 11:10:45 +0700 Subject: [PATCH 3/7] Report analysis mockup --- .../SimproV2/CreatedProyek/ReportAnalysis.js | 152 +++++++++++++++++- 1 file changed, 149 insertions(+), 3 deletions(-) diff --git a/src/views/SimproV2/CreatedProyek/ReportAnalysis.js b/src/views/SimproV2/CreatedProyek/ReportAnalysis.js index 44b6406..d797a83 100644 --- a/src/views/SimproV2/CreatedProyek/ReportAnalysis.js +++ b/src/views/SimproV2/CreatedProyek/ReportAnalysis.js @@ -1,18 +1,164 @@ -import React from 'react' -import { Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap'; +import React, {useState} from 'react' +import { Modal, ModalHeader, ModalBody, ModalFooter, Card, CardHeader, CardBody, Table } from 'reactstrap'; +import { TabContent, TabPane, Nav, NavItem, NavLink, Row, Col, Input } from 'reactstrap'; import { Button } from 'reactstrap'; import 'antd/dist/antd.css'; import './style.css' const ReportAnalysis = ({ openDialog, closeDialog, toggleDialog }) => { + const [activeTab, setActiveTab] = useState('1'); + const [search, setSearch] = useState(''); + const toggle = (tab) => { + if (activeTab !== tab) { + setActiveTab(tab); + } + }; + + const handleSearch = (e) => { + const value = e.target.value; + setSearch(value); + }; return ( <> Project -
Report Analysis
+
+ + + + + + + + + + + + +
+

+ Hello World +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#First NameLast NameUsername
1MarkOtto@mdo
2JacobThornton@fat
3Larrythe Bird@twitter
+
+
+
+ + + + + + + + + + + + + + + + +
+

+ Hello World +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#First NameLast NameUsername
1MarkOtto@mdo
2JacobThornton@fat
3Larrythe Bird@twitter
+
+
+
+
+
From cd698c92f8807c906ee160c31c663fe4773becbe Mon Sep 17 00:00:00 2001 From: wahyu Date: Wed, 18 Oct 2023 11:50:08 +0700 Subject: [PATCH 4/7] fix endline --- .../SimproV2/CreatedProyek/FormAsignHr.js | 492 +++++++++--------- 1 file changed, 246 insertions(+), 246 deletions(-) diff --git a/src/views/SimproV2/CreatedProyek/FormAsignHr.js b/src/views/SimproV2/CreatedProyek/FormAsignHr.js index b02909d..a080fa0 100644 --- a/src/views/SimproV2/CreatedProyek/FormAsignHr.js +++ b/src/views/SimproV2/CreatedProyek/FormAsignHr.js @@ -1,246 +1,246 @@ -import React, { useEffect, useState } from 'react' -import { Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap'; -import { Button, Form, FormGroup, Label, Input, Col, Row } from 'reactstrap'; -import { DatePicker, Select } from 'antd'; -import 'antd/dist/antd.css'; -import { formatNumber } from '../../../const/CustomFunc'; -const { Option } = Select - -const FormAsignHr = ({ openDialog, closeDialog, toggleDialog, idTask, dataEdit, dataHr, dataCurrentHr, dataRole }) => { - const [id, setId] = useState(null) - const [typeForm, setTypeForm] = useState('add') - const [user, setUser] = useState(null) - const [rbs, setRbs] = useState("") - const [projectRole, setProjectRole] = useState(null) - const [groupR, setGroupR] = useState("") - const [maxUsed, setMaxUsed] = useState("") - const [standartRate, setStandartRate] = useState("") - const [uomStandartRate, setUomStandartRate] = useState(null) - const [overTimeRate, setOverTimeRate] = useState("") - const [overTimeRateUom, setOverTimeRateUom] = useState(null) - const [costPerUsed, setCostPerUsed] = useState("") - const [accrue, setAccrue] = useState("") - const [baseCalender, setBaseCalender] = useState("") - const [listHr, setListHr] = useState([]) - const [isCustomer, setIsCustomer] = useState(false) - - const handleClearData = () => { - setUser(null) - setRbs("") - setProjectRole(null) - setGroupR("") - setMaxUsed("") - setIsCustomer(false) - setStandartRate("") - setUomStandartRate(null) - setOverTimeRate("") - setOverTimeRateUom(null) - setCostPerUsed("") - setAccrue("") - setBaseCalender("") - } - - useEffect(() => { - let data = dataHr || [] - let availableHr = [] - data.map((val, index) => { - if(dataEdit && dataEdit.user_id){ - if(parseInt(val.id)===parseInt(dataEdit.user_id)){ - availableHr.push(val); - } - } - let check = dataCurrentHr.some(function (x) { - return parseInt(val.id)==parseInt(x.user_id) - }); - if(!check){ - availableHr.push(val); - } - }); - setListHr(availableHr) - }, [dataHr, dataCurrentHr, dataEdit]) - - useEffect(() => { - if (idTask && idTask > 0) { - if(dataEdit && dataEdit!=""){ - setTypeForm('edit') - setId(dataEdit.id) - setUser(dataEdit.user_id) - setRbs(dataEdit.rbs) - setProjectRole(dataEdit.project_role) - setGroupR(dataEdit.group_r) - setMaxUsed(dataEdit.max_used ? formatNumber(dataEdit.max_used.toString()) : '') - setIsCustomer(dataEdit.is_customer) - setStandartRate(dataEdit.standart_rate ? formatNumber(dataEdit.standart_rate.toString()) : '') - setUomStandartRate(dataEdit.uom_standart_rate) - setOverTimeRate(dataEdit.overtime_rate ? formatNumber(dataEdit.overtime_rate.toString()) : '') - setOverTimeRateUom(dataEdit.uom_overtime_rate) - setCostPerUsed(dataEdit.cost_per_used) - setAccrue(dataEdit.accrue_at) - setBaseCalender(dataEdit.base_calender) - }else{ - handleClearData() - setTypeForm('add') - } - } else { - handleClearData() - } - }, [openDialog]) - - const handleSave = () => { - let data = ''; - if (typeForm=="edit") { - data = { - id, - proyek_id: idTask, - user_id:user, - project_role:projectRole, - is_customer: isCustomer, - max_used:maxUsed.replaceAll(".", ""), - standart_rate:standartRate.replaceAll(".", ""), - uom_standart_rate:uomStandartRate, - overtime_rate:overTimeRate.replaceAll(".", ""), - uom_overtime_rate:overTimeRateUom, - } - - closeDialog('edit', data); - } else { - data = { - proyek_id: idTask, - user_id:user, - project_role:projectRole, - is_customer: isCustomer, - max_used:maxUsed.replaceAll(".", ""), - standart_rate:standartRate.replaceAll(".", ""), - uom_standart_rate:uomStandartRate, - overtime_rate:overTimeRate.replaceAll(".", ""), - uom_overtime_rate:overTimeRateUom, - } - closeDialog('add', data); - } - handleClearData() - } - - const handleCancel = () => { - closeDialog('cancel', 'none') - handleClearData() - } - - - const renderForm = () => { - return ( -
- - - - - - - - - - - - - - - - - setMaxUsed(formatNumber(e.target.value))} value={maxUsed} placeholder='' required/> - - - - - - - -
- setStandartRate(formatNumber(e.target.value))} value={standartRate} placeholder='1.000...' /> - -
- / -
- - - - -
- -
- - - setOverTimeRate(formatNumber(e.target.value))} value={overTimeRate} placeholder='1.000...' /> - -
- / -
- - - - -
- - ) - } - - return ( - <> - - {typeForm=="add" ? "Add" : "Edit" } Assign Human Resource - - {renderForm()} - - - {' '} - - - - - ) - -} - -export default FormAsignHr; +import React, { useEffect, useState } from 'react' +import { Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap'; +import { Button, Form, FormGroup, Label, Input, Col, Row } from 'reactstrap'; +import { DatePicker, Select } from 'antd'; +import 'antd/dist/antd.css'; +import { formatNumber } from '../../../const/CustomFunc'; +const { Option } = Select + +const FormAsignHr = ({ openDialog, closeDialog, toggleDialog, idTask, dataEdit, dataHr, dataCurrentHr, dataRole }) => { + const [id, setId] = useState(null) + const [typeForm, setTypeForm] = useState('add') + const [user, setUser] = useState(null) + const [rbs, setRbs] = useState("") + const [projectRole, setProjectRole] = useState(null) + const [groupR, setGroupR] = useState("") + const [maxUsed, setMaxUsed] = useState("") + const [standartRate, setStandartRate] = useState("") + const [uomStandartRate, setUomStandartRate] = useState(null) + const [overTimeRate, setOverTimeRate] = useState("") + const [overTimeRateUom, setOverTimeRateUom] = useState(null) + const [costPerUsed, setCostPerUsed] = useState("") + const [accrue, setAccrue] = useState("") + const [baseCalender, setBaseCalender] = useState("") + const [listHr, setListHr] = useState([]) + const [isCustomer, setIsCustomer] = useState(false) + + const handleClearData = () => { + setUser(null) + setRbs("") + setProjectRole(null) + setGroupR("") + setMaxUsed("") + setIsCustomer(false) + setStandartRate("") + setUomStandartRate(null) + setOverTimeRate("") + setOverTimeRateUom(null) + setCostPerUsed("") + setAccrue("") + setBaseCalender("") + } + + useEffect(() => { + let data = dataHr || [] + let availableHr = [] + data.map((val, index) => { + if(dataEdit && dataEdit.user_id){ + if(parseInt(val.id)===parseInt(dataEdit.user_id)){ + availableHr.push(val); + } + } + let check = dataCurrentHr.some(function (x) { + return parseInt(val.id)==parseInt(x.user_id) + }); + if(!check){ + availableHr.push(val); + } + }); + setListHr(availableHr) + }, [dataHr, dataCurrentHr, dataEdit]) + + useEffect(() => { + if (idTask && idTask > 0) { + if(dataEdit && dataEdit!=""){ + setTypeForm('edit') + setId(dataEdit.id) + setUser(dataEdit.user_id) + setRbs(dataEdit.rbs) + setProjectRole(dataEdit.project_role) + setGroupR(dataEdit.group_r) + setMaxUsed(dataEdit.max_used ? formatNumber(dataEdit.max_used.toString()) : '') + setIsCustomer(dataEdit.is_customer) + setStandartRate(dataEdit.standart_rate ? formatNumber(dataEdit.standart_rate.toString()) : '') + setUomStandartRate(dataEdit.uom_standart_rate) + setOverTimeRate(dataEdit.overtime_rate ? formatNumber(dataEdit.overtime_rate.toString()) : '') + setOverTimeRateUom(dataEdit.uom_overtime_rate) + setCostPerUsed(dataEdit.cost_per_used) + setAccrue(dataEdit.accrue_at) + setBaseCalender(dataEdit.base_calender) + }else{ + handleClearData() + setTypeForm('add') + } + } else { + handleClearData() + } + }, [openDialog]) + + const handleSave = () => { + let data = ''; + if (typeForm=="edit") { + data = { + id, + proyek_id: idTask, + user_id:user, + project_role:projectRole, + is_customer: isCustomer, + max_used:maxUsed.replaceAll(".", ""), + standart_rate:standartRate.replaceAll(".", ""), + uom_standart_rate:uomStandartRate, + overtime_rate:overTimeRate.replaceAll(".", ""), + uom_overtime_rate:overTimeRateUom, + } + + closeDialog('edit', data); + } else { + data = { + proyek_id: idTask, + user_id:user, + project_role:projectRole, + is_customer: isCustomer, + max_used:maxUsed.replaceAll(".", ""), + standart_rate:standartRate.replaceAll(".", ""), + uom_standart_rate:uomStandartRate, + overtime_rate:overTimeRate.replaceAll(".", ""), + uom_overtime_rate:overTimeRateUom, + } + closeDialog('add', data); + } + handleClearData() + } + + const handleCancel = () => { + closeDialog('cancel', 'none') + handleClearData() + } + + + const renderForm = () => { + return ( +
+ + + + + + + + + + + + + + + + + setMaxUsed(formatNumber(e.target.value))} value={maxUsed} placeholder='' required/> + + + + + + + +
+ setStandartRate(formatNumber(e.target.value))} value={standartRate} placeholder='1.000...' /> + +
+ / +
+ + + + +
+ +
+ + + setOverTimeRate(formatNumber(e.target.value))} value={overTimeRate} placeholder='1.000...' /> + +
+ / +
+ + + + +
+ + ) + } + + return ( + <> + + {typeForm=="add" ? "Add" : "Edit" } Assign Human Resource + + {renderForm()} + + + {' '} + + + + + ) + +} + +export default FormAsignHr; From 28a6615a1445e337ff34b73c845d83e4aa6dc7e0 Mon Sep 17 00:00:00 2001 From: wahyu Date: Wed, 18 Oct 2023 13:25:27 +0700 Subject: [PATCH 5/7] report analysis no sum --- .../SimproV2/CreatedProyek/ReportAnalysis.js | 215 ++++++++++++------ 1 file changed, 144 insertions(+), 71 deletions(-) diff --git a/src/views/SimproV2/CreatedProyek/ReportAnalysis.js b/src/views/SimproV2/CreatedProyek/ReportAnalysis.js index d797a83..581cb0c 100644 --- a/src/views/SimproV2/CreatedProyek/ReportAnalysis.js +++ b/src/views/SimproV2/CreatedProyek/ReportAnalysis.js @@ -1,25 +1,142 @@ -import React, {useState} from 'react' -import { Modal, ModalHeader, ModalBody, ModalFooter, Card, CardHeader, CardBody, Table } from 'reactstrap'; +import React, {useState, useEffect} from 'react' +import { Modal, ModalHeader, ModalBody, ModalFooter, Card, CardHeader, CardBody } from 'reactstrap'; import { TabContent, TabPane, Nav, NavItem, NavLink, Row, Col, Input } from 'reactstrap'; import { Button } from 'reactstrap'; +import axios from "../../../const/interceptorApi"; +import { + NotificationManager, +} from "react-notifications"; +import { BASE_SIMPRO_LUMEN } from "../../../const/ApiConst"; import 'antd/dist/antd.css'; import './style.css' +import { Select, Table } from 'antd'; +const { Option } = Select - - const ReportAnalysis = ({ openDialog, closeDialog, toggleDialog }) => { +const ReportAnalysis = ({ openDialog, closeDialog, toggleDialog }) => { + const token = localStorage.getItem("token"); const [activeTab, setActiveTab] = useState('1'); const [search, setSearch] = useState(''); + const [dataTable, setDatatable] = useState([]); + const [dataTableActivityToHr, setDataTableActivityToHr] = useState([]); + const [hrList, setHrList] = useState([]); + const [selectedHr, setSelectedHr] = useState(null); + const toggle = (tab) => { if (activeTab !== tab) { setActiveTab(tab); } }; + const HEADER = { + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${token}`, + }, + }; + + const columns = [ + {title: "Activity Name", dataIndex: "name", key: "name"} + ] + + const columnActivityToHr = [ + {title: "Activity Name", dataIndex: "join_first_name", key: "join_first_name"} + ] + + useEffect(() => { + if (search) { + getDataActivity() + } + }, [search]); + + useEffect(() => { + if (selectedHr) { + getDataActivityToHr() + } + }, [selectedHr]); + + useEffect(() => { + getDataHr() + }, []); + const handleSearch = (e) => { const value = e.target.value; setSearch(value); }; + const getDataHr = async () => { + const result = await axios + .get(`${BASE_SIMPRO_LUMEN}/human-resource/list`, HEADER) + .then((res) => res) + .catch((error) => error.response); + + if (result && result.data && result.data.code == 200) { + let dataRes = result.data.data || []; + setHrList(dataRes); + } else { + NotificationManager.error("Gagal Mengambil Data!!", "Failed"); + } + } + const getDataActivityToHr = async () => { + const payload = { + columns: [ + { + name: "user_id", + logic_operator: "=", + value: selectedHr, + operator: "AND", + }, + ], + joins: [ + { + name: "m_activity", + column_join: "activity_id", + column_results: ["name"] + } + ], + orders: { columns: ["id"], ascending: false }, + paging: { start: 0, length: -1 }, + }; + + const result = await axios + .post(`${BASE_SIMPRO_LUMEN}/user-to-activity/search-analysis`, payload, HEADER) + .then((res) => res) + .catch((error) => error.response); + + if (result && result.data && result.data.code == 200) { + let dataRes = result.data.data || []; + setDataTableActivityToHr(dataRes); + } else { + NotificationManager.error("Gagal Mengambil Data!!", "Failed"); + } + }; + + const getDataActivity = async () => { + const payload = { + columns: [ + { + name: "name", + logic_operator: "ilike", + value: search, + operator: "AND", + }, + ], + orders: { columns: ["id"], ascending: false }, + paging: { start: 0, length: -1 }, + }; + + const result = await axios + .post(`${BASE_SIMPRO_LUMEN}/activity/search`, payload, HEADER) + .then((res) => res) + .catch((error) => error.response); + + if (result && result.data && result.data.code == 200) { + let dataRes = result.data.data || []; + + setDatatable(dataRes); + } else { + NotificationManager.error("Gagal Mengambil Data!!", "Failed"); + } + }; return ( <> @@ -55,6 +172,8 @@ import './style.css'
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#First NameLast NameUsername
1MarkOtto@mdo
2JacobThornton@fat
3Larrythe Bird@twitter
+ @@ -108,13 +204,13 @@ import './style.css' - - - - - - - + @@ -124,36 +220,13 @@ import './style.css' Hello World -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#First NameLast NameUsername
1MarkOtto@mdo
2JacobThornton@fat
3Larrythe Bird@twitter
+ From 11fff21f3eb96c6c8750a9f054673bdd552c6476 Mon Sep 17 00:00:00 2001 From: wahyu Date: Wed, 18 Oct 2023 14:19:39 +0700 Subject: [PATCH 6/7] add sum --- .../SimproV2/CreatedProyek/ReportAnalysis.js | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/views/SimproV2/CreatedProyek/ReportAnalysis.js b/src/views/SimproV2/CreatedProyek/ReportAnalysis.js index 581cb0c..cb16993 100644 --- a/src/views/SimproV2/CreatedProyek/ReportAnalysis.js +++ b/src/views/SimproV2/CreatedProyek/ReportAnalysis.js @@ -16,6 +16,7 @@ const ReportAnalysis = ({ openDialog, closeDialog, toggleDialog }) => { const token = localStorage.getItem("token"); const [activeTab, setActiveTab] = useState('1'); const [search, setSearch] = useState(''); + const [avgActivity, setAvgActivity] = useState(0); const [dataTable, setDatatable] = useState([]); const [dataTableActivityToHr, setDataTableActivityToHr] = useState([]); const [hrList, setHrList] = useState([]); @@ -77,6 +78,8 @@ const ReportAnalysis = ({ openDialog, closeDialog, toggleDialog }) => { } } const getDataActivityToHr = async () => { + setAvgActivity(0); + let sum = 0; const payload = { columns: [ { @@ -104,6 +107,10 @@ const ReportAnalysis = ({ openDialog, closeDialog, toggleDialog }) => { if (result && result.data && result.data.code == 200) { let dataRes = result.data.data || []; + dataRes.forEach(element => { + element.persentase_progress ? sum += parseInt(element.persentase_progress) : sum += 0; + }); + setAvgActivity(sum / dataRes.length); setDataTableActivityToHr(dataRes); } else { NotificationManager.error("Gagal Mengambil Data!!", "Failed"); @@ -111,6 +118,8 @@ const ReportAnalysis = ({ openDialog, closeDialog, toggleDialog }) => { }; const getDataActivity = async () => { + setAvgActivity(0); + let sum = 0; const payload = { columns: [ { @@ -132,6 +141,10 @@ const ReportAnalysis = ({ openDialog, closeDialog, toggleDialog }) => { if (result && result.data && result.data.code == 200) { let dataRes = result.data.data || []; + dataRes.forEach(element => { + element.persentase_progress ? sum += parseInt(element.persentase_progress) : sum += 0; + }); + setAvgActivity(sum / dataRes.length); setDatatable(dataRes); } else { NotificationManager.error("Gagal Mengambil Data!!", "Failed"); @@ -186,7 +199,9 @@ const ReportAnalysis = ({ openDialog, closeDialog, toggleDialog }) => {

- Hello World + { + search && avgActivity ? `Activity ${search} adalah ${avgActivity.toFixed(2)} %` : null + }

{

- Hello World + { + selectedHr && avgActivity ? `Activity user ini adalah ${avgActivity.toFixed(2)} %` : null + }

Date: Thu, 19 Oct 2023 09:09:49 +0700 Subject: [PATCH 7/7] report analysis hr data --- .../SimproV2/CreatedProyek/ReportAnalysis.js | 34 +++++++++++++++---- src/views/SimproV2/CreatedProyek/index.js | 3 ++ 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/views/SimproV2/CreatedProyek/ReportAnalysis.js b/src/views/SimproV2/CreatedProyek/ReportAnalysis.js index cb16993..02b4d33 100644 --- a/src/views/SimproV2/CreatedProyek/ReportAnalysis.js +++ b/src/views/SimproV2/CreatedProyek/ReportAnalysis.js @@ -12,7 +12,7 @@ import './style.css' import { Select, Table } from 'antd'; const { Option } = Select -const ReportAnalysis = ({ openDialog, closeDialog, toggleDialog }) => { +const ReportAnalysis = ({ openDialog, closeDialog, toggleDialog, projectId }) => { const token = localStorage.getItem("token"); const [activeTab, setActiveTab] = useState('1'); const [search, setSearch] = useState(''); @@ -40,7 +40,12 @@ const ReportAnalysis = ({ openDialog, closeDialog, toggleDialog }) => { ] const columnActivityToHr = [ - {title: "Activity Name", dataIndex: "join_first_name", key: "join_first_name"} + {title: "Activity", dataIndex: "join_third_name", key: "join_third_name"}, + {title: "Human Resource", dataIndex: "join_second_name", key: "join_second_name"}, + {title: "Report Date", dataIndex: "report_date", key: "report_date"}, + {title: "Volume Actual", dataIndex: "qty", key: "qty"}, + {title: "Volume Planned", dataIndex: "join_first_qty_planning", key: "join_first_qty_planning"}, + {title: "Description", dataIndex: "description", key: "description"} ] useEffect(() => { @@ -88,12 +93,29 @@ const ReportAnalysis = ({ openDialog, closeDialog, toggleDialog }) => { value: selectedHr, operator: "AND", }, + { + name: "proyek_id", + logic_operator: "=", + value: projectId, + table_name: "m_activity", + operator: "AND", + } ], joins: [ + { + name: "assign_material_to_activity", + column_join: "assign_material_id", + column_results: ["qty_planning"] + }, + { + name: "m_users", + column_join: "user_id", + column_results: ["name"] + }, { name: "m_activity", column_join: "activity_id", - column_results: ["name"] + column_results: ["name", "persentase_progress"] } ], orders: { columns: ["id"], ascending: false }, @@ -101,14 +123,14 @@ const ReportAnalysis = ({ openDialog, closeDialog, toggleDialog }) => { }; const result = await axios - .post(`${BASE_SIMPRO_LUMEN}/user-to-activity/search-analysis`, payload, HEADER) + .post(`${BASE_SIMPRO_LUMEN}/report-activity-material/search`, payload, HEADER) .then((res) => res) .catch((error) => error.response); if (result && result.data && result.data.code == 200) { let dataRes = result.data.data || []; dataRes.forEach(element => { - element.persentase_progress ? sum += parseInt(element.persentase_progress) : sum += 0; + element.join_third_persentase_progress ? sum += parseInt(element.join_third_persentase_progress) : sum += 0; }); setAvgActivity(sum / dataRes.length); setDataTableActivityToHr(dataRes); @@ -190,7 +212,7 @@ const ReportAnalysis = ({ openDialog, closeDialog, toggleDialog }) => { type="text" name="search" id="search" - placeholder={`Search Project Name`} + placeholder={`Search Activity Name`} style={{ width: 200 }} /> diff --git a/src/views/SimproV2/CreatedProyek/index.js b/src/views/SimproV2/CreatedProyek/index.js index 9e59876..485b32c 100644 --- a/src/views/SimproV2/CreatedProyek/index.js +++ b/src/views/SimproV2/CreatedProyek/index.js @@ -117,6 +117,7 @@ const CreatedProyek = ({ params, ...props }) => { }; const [idTask, setidTask] = useState(0); + const [projectId, setProjectId] = useState(0); const [dataTable, setDatatable] = useState([]); const [search, setSearch] = useState(""); const [currentPage, setCurrentPage] = useState(1); @@ -595,6 +596,7 @@ const CreatedProyek = ({ params, ...props }) => { const handleOpenReport = async (data) => { setOpenDialogRA(true); + setProjectId(data.id); } const handleCloseReport = async (data) => { setOpenDialogRA(false); @@ -1907,6 +1909,7 @@ const CreatedProyek = ({ params, ...props }) => { openDialog={openDialogRA} closeDialog={handleCloseReport} toggleDialog={toggleAddDialogRA} + projectId={projectId} /> ), [openDialogRA]