diff --git a/src/views/Master/MasterRoles/DialogMenuRoles.js b/src/views/Master/MasterRoles/DialogMenuRoles.js index fa0eda6..b066bc4 100644 --- a/src/views/Master/MasterRoles/DialogMenuRoles.js +++ b/src/views/Master/MasterRoles/DialogMenuRoles.js @@ -4,10 +4,19 @@ 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/"; -class DialogMenuRoles extends Component { +const token = window.localStorage.getItem('token'); + + +const config = { + headers: + { + Authorization: `Bearer ${token}`, + "Content-type": `application/json` + } +}; + +export default class DialogMenuRoles extends Component { constructor(props) { super(props) this.state = { @@ -16,24 +25,39 @@ class DialogMenuRoles extends Component { description: "", openDialog: false, isParentClick: false, + menu: [], stateMenu: [], - menu:[], + stateRead: [], + stateCreate: [], + stateUpdate: [], + stateDelete: [], + stateReadAll: false, + stateCreateAll: false, + stateUpdateAll: false, + stateDeleteAll: false, allChecked: true, - company_id: props.company_id || null, - role_name: props.role_name || '', - token: props.token || '', - config: { - headers: { - Authorization: `Bearer ${props.token || ''}`, - "Content-type": "application/json", - } - } } } - async componentDidMount() { - this.getAllMenu() this.props.showDialog(this.showDialog); + this.getAllMenu(); + } + + async componentDidUpdate() { + if (this.state.isParentClick === true) { + const { idRoles } = this.props + this.setStateMenu(true); + this.setStateRead(true); + this.setStateUpdate(true); + this.setStateCreate(true); + this.setStateDelete(true); + this.setState({ isParentClick: false, id: idRoles }); + } + } + + + showDialog = () => { + this.setState({ isParentClick: true }); } getAllMenu = async () => { @@ -42,30 +66,30 @@ class DialogMenuRoles extends Component { "columns": [ { "name": "name", "logic_operator": "ilike", "value": "", "operator": "AND" } ], - "joins": [], + "joins": [ + { "name": "t_roles_menu", "column_join": "id", "column_results": ["create", "update", "delete", "read"] } + ], "orders": { "columns": ["id"], "ascending": false } } + + + const result = await axios - .post(MENU_SEARCH, payload, this.state.config) + .post(MENU_SEARCH, payload, config) .then(res => res) .catch((error) => error.response); + + // console.log('78', result); if (result && result.data && result.data.code == 200) { - this.setState({ menu: result.data.data }); + this.setState({ menu: result.data.data }, () => { + this.setStateMenu(false); + }); + } else { } - } - 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 }); - } setStateMenu = edit => { const stateMenu = []; @@ -81,11 +105,69 @@ class DialogMenuRoles extends Component { }) } + setStateRead = edit => { + const stateRead = []; + this.state.menu.map((val) => { + stateRead.push(false); + }) + this.setState({ stateRead: [] }, () => { + this.setState({ stateRead: stateRead }, () => { + if (edit) { + this.checkReadRoles(); + } + }) + }) + } + + setStateCreate = edit => { + const stateCreate = []; + this.state.menu.map((val) => { + stateCreate.push(false); + }) + this.setState({ stateCreate: [] }, () => { + this.setState({ stateCreate: stateCreate }, () => { + if (edit) { + this.checkCreateRoles(); + } + }) + }) + } + + setStateUpdate = edit => { + const stateUpdate = []; + this.state.menu.map((val) => { + stateUpdate.push(false); + }) + this.setState({ stateUpdate: [] }, () => { + this.setState({ stateUpdate: stateUpdate }, () => { + if (edit) { + this.checkUpdateRoles(); + } + }) + }) + } + + setStateDelete = edit => { + const stateDelete = []; + this.state.menu.map((val) => { + stateDelete.push(false); + }) + this.setState({ stateDelete: [] }, () => { + this.setState({ stateDelete: stateDelete }, () => { + if (edit) { + this.checkDeleteRoles(); + } + }) + }) + } + checkMenuRoles = () => { let copyStateMenu = [...this.state.stateMenu]; + this.props.menuRoles.map((val, indexMenu) => { let index = this.getIndexDataMenu(val.menu_id); - if (index >= 0) { + + if (index >= 0 || val.read === true || val.create === true || val.update === true || val.delete === true) { copyStateMenu[index] = true; } }) @@ -99,15 +181,125 @@ class DialogMenuRoles extends Component { }) } + checkReadRoles = () => { + let copyStateRead = [...this.state.stateRead]; + this.props.menuRoles.map((val) => { + let index = this.getIndexDataMenu(val.menu_id); + if (val.read === true) { + copyStateRead[index] = true; + } else { + copyStateRead[index] = false; + } + }) + + this.setState({ stateRead: [] }, () => { + let check = copyStateRead.some(this.checkArray); + if (check === false) { + this.setState({ allChecked: true, stateRead: copyStateRead, }) + } else { + this.setState({ allChecked: false, stateRead: copyStateRead, }) + } + }) + } + + checkCreateRoles = () => { + let copyStateCreate = [...this.state.stateCreate]; + + this.props.menuRoles.map((val) => { + let index = this.getIndexDataMenu(val.menu_id); + if (val.create === true) { + copyStateCreate[index] = true; + } else { + copyStateCreate[index] = false; + } + }) + + this.setState({ stateCreate: [] }, () => { + let check = copyStateCreate.some(this.checkArray); + if (check === false) { + this.setState({ allChecked: true, stateCreate: copyStateCreate, }) + } else { + this.setState({ allChecked: false, stateCreate: copyStateCreate, }) + } + }) + } + + checkUpdateRoles = () => { + let copyStateUpdate = [...this.state.stateUpdate]; + + this.props.menuRoles.map((val) => { + let index = this.getIndexDataMenu(val.menu_id); + if (val.update === true) { + copyStateUpdate[index] = true; + } else { + copyStateUpdate[index] = false; + } + }) + + this.setState({ stateUpdate: [] }, () => { + let check = copyStateUpdate.some(this.checkArray); + if (check === false) { + this.setState({ allChecked: true, stateUpdate: copyStateUpdate, }) + } else { + this.setState({ allChecked: false, stateUpdate: copyStateUpdate, }) + } + }) + } + + checkDeleteRoles = () => { + let copyStateDelete = [...this.state.stateDelete]; + + this.props.menuRoles.map((val) => { + let index = this.getIndexDataMenu(val.menu_id); + if (val.delete === true) { + copyStateDelete[index] = true; + } else { + copyStateDelete[index] = false; + } + }) + + this.setState({ stateDelete: [] }, () => { + let check = copyStateDelete.some(this.checkArray); + if (check === false) { + this.setState({ allChecked: true, stateDelete: copyStateDelete, }) + } else { + this.setState({ allChecked: false, stateDelete: copyStateDelete, }) + } + }) + } getIndexDataMenu = (id) => { let index = this.state.menu.findIndex(obj => obj.id === id); return index } + getIndexDataCreate = (id) => { + let index = this.state.stateCreate.findIndex(obj => obj.id === id); + return index + } + + getIndexDataDelete = (id) => { + let index = this.state.stateDelete.findIndex(obj => obj.id === id); + return index + } + + getIndexDataRead = (id) => { + let index = this.state.stateRead.findIndex(obj => obj.id === id); + return index + } + + getIndexDataUpdate = (id) => { + let index = this.state.stateUpdate.findIndex(obj => obj.id === id); + return index + } + handleSave = () => { const { stateMenu, + stateCreate, + stateDelete, + stateRead, + stateUpdate, menu, id } = this.state @@ -118,11 +310,19 @@ class DialogMenuRoles extends Component { let data = { roles_id: id, menu_id: val.id, - checked: stateMenu[index] + read: stateRead[index], + create: stateCreate[index], + update: stateUpdate[index], + delete: stateDelete[index], + checked: stateMenu[index], + } arrayData.push(data); + + }) - this.props.closeDialog('save', arrayData); + console.log('arrayData', arrayData); + // this.props.closeDialog('save', arrayData); this.setState({ id: 0 }); } @@ -133,23 +333,146 @@ class DialogMenuRoles extends Component { handleChangeCheckbox = (checked, index) => { let copyStateMenu = [...this.state.stateMenu]; copyStateMenu[index] = checked; + this.setState({ stateMenu: copyStateMenu }) } + handleChangeCheckboxRead = (checked, index) => { + let copyStateRead = [...this.state.stateRead]; + copyStateRead[index] = checked; + + this.setState({ stateRead: copyStateRead }) + } + + handleChangeCheckboxCreate = (checked, index) => { + let copyStateCreate = [...this.state.stateCreate]; + copyStateCreate[index] = checked; + + this.setState({ stateCreate: copyStateCreate }) + } + + handleChangeCheckboxEdit = (checked, index) => { + let copyStateEdit = [...this.state.stateUpdate]; + copyStateEdit[index] = checked; + + this.setState({ stateUpdate: copyStateEdit }) + } + + handleChangeCheckboxDelete = (checked, index) => { + let copyStateDelete = [...this.state.stateDelete]; + copyStateDelete[index] = checked; + + this.setState({ stateDelete: copyStateDelete }) + } + + handleChangeCheckboxReadAll = (checked) => { + let copyStateRead = [...this.state.stateRead]; + copyStateRead.map((val, index) => { + copyStateRead[index] = checked; + }) + this.setState({ stateRead: copyStateRead }) + } + + handleChangeCheckboxCreateAll = (checked, index) => { + let copyStateCreate = [...this.state.stateCreate]; + copyStateCreate.map((val, index) => { + copyStateCreate[index] = checked; + }) + this.setState({ stateCreate: copyStateCreate }) + } + + handleChangeCheckboxEditAll = (checked, index) => { + let copyStateEdit = [...this.state.stateUpdate]; + copyStateEdit.map((val, index) => { + copyStateEdit[index] = checked; + }) + this.setState({ stateUpdate: copyStateEdit }) + } + + handleChangeCheckboxDeleteAll = (checked, index) => { + let copyStateDelete = [...this.state.stateDelete]; + copyStateDelete.map((val, index) => { + copyStateDelete[index] = checked; + }) + this.setState({ stateDelete: copyStateDelete }) + } + + // renderForm = () => { + // const { menu, stateRead, stateCreate, stateUpdate, stateDelete } = this.state + // console.log('menu', menu); + // return ( + // menu.map((val, index) => { + + // return ( + // + // {val.name} + // this.handleChangeCheckboxRead(e.target.checked, index)} defaultChecked={stateRead[index]} /> + // this.handleChangeCheckboxCreate(e.target.checked, index)} defaultChecked={stateCreate[index]} /> + // this.handleChangeCheckboxEdit(e.target.checked, index)} defaultChecked={stateUpdate[index]} /> + // this.handleChangeCheckboxDelete(e.target.checked, index)} defaultChecked={stateDelete[index]} /> + // + // ) + // }) + // ) + + // } + renderForm = () => { - const { menu, stateMenu } = this.state - return ( - menu.map((val, index) => { + const { menu, stateRead, stateCreate, stateUpdate, stateDelete } = this.state; + + const getChildren = (parentId) => { + return menu.filter(item => item.parent_id === parentId); + }; + + // Function to render menu items + const renderMenu = (parentId, depth = 0) => { + const children = getChildren(parentId); + + return children.map((menuItem, index) => { + const paddingLeft = depth * 20; + const fontWeight = menuItem.parent_id === null ? 'bold' : 'normal'; + return ( - - {val.name} - this.handleChangeCheckbox(e.target.checked, index)} defaultChecked={stateMenu[index]} /> - - ) - }) + + + {menuItem.name} + this.handleChangeCheckboxRead(e.target.checked, index)} defaultChecked={stateRead[index]} /> + this.handleChangeCheckboxCreate(e.target.checked, index)} defaultChecked={stateCreate[index]} /> + this.handleChangeCheckboxEdit(e.target.checked, index)} defaultChecked={stateUpdate[index]} /> + this.handleChangeCheckboxDelete(e.target.checked, index)} defaultChecked={stateDelete[index]} /> + + {renderMenu(menuItem.id, depth + 1)} {/* Recursively render children */} + + ); + }); + }; + + // Render top-level menu items (parents) + return ( + + {this.renderAll()} {/* Render the "All" row */} + {renderMenu(null)} {/* Render the menu items */} + + ); + }; + + + renderAll = () => { + + return ( + + All + this.handleChangeCheckboxReadAll(e.target.checked)} defaultChecked={this.state.stateReadAll} /> + this.handleChangeCheckboxCreateAll(e.target.checked)} defaultChecked={this.state.stateCreateAll} /> + this.handleChangeCheckboxEditAll(e.target.checked)} defaultChecked={this.state.stateUpdateAll} /> + this.handleChangeCheckboxDeleteAll(e.target.checked)} defaultChecked={this.state.stateDeleteAll} /> + ) } + + + checkArray = (val) => { return val === false; } @@ -157,6 +480,7 @@ class DialogMenuRoles extends Component { handleAllChecked = (checked) => { this.setState({ allChecked: !this.state.allChecked }); if (checked === true) { + let check = this.state.stateMenu.some(this.checkArray); if (check) { @@ -172,6 +496,7 @@ class DialogMenuRoles extends Component { } else { + const stateMenu = []; this.state.menu.map((val) => { stateMenu.push(false); @@ -185,8 +510,8 @@ class DialogMenuRoles extends Component { render() { return ( - - {this.props.t('menuRoles')} + + Roles Menu
@@ -194,26 +519,31 @@ class DialogMenuRoles extends Component { + + + + - - - - {this.renderForm()}
Menu - T/F + View + + Create + + Edite + Delete +
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 dfb48c9..7b45a97 100644 --- a/src/views/Master/MasterRoles/index.js +++ b/src/views/Master/MasterRoles/index.js @@ -307,7 +307,7 @@ class index extends Component { "columns": [ { "name": "role_id", "logic_operator": "=", "value": `${id}`, "operator": "AND" } ], - "joins": [], + "joins": [{ "name": "m_menu", "column_join": "menu_id", "column_results": ["parent_id", "name"] }], "orders": { "columns": ["id"], "ascending": false } } @@ -476,7 +476,7 @@ class index extends Component { dataHs={this.state.dataIdHo} company_id={this.state.company_id} role_name={this.state.role_name} - token={this.state.token} + token={this.state.token} /> this.showMenuRolesDialog = showDialog} menuRoles={this.state.menuRoles} - company_id={this.state.company_id} + company_id={this.state.company_id} role_name={this.state.role_name} - token={this.state.token} + role_id={this.state.role_id} + token={this.state.token} /> diff --git a/src/views/SimproV2/CreatedProyek/ReportAnalysis.js b/src/views/SimproV2/CreatedProyek/ReportAnalysis.js index 7bc00bc..c46dad4 100644 --- a/src/views/SimproV2/CreatedProyek/ReportAnalysis.js +++ b/src/views/SimproV2/CreatedProyek/ReportAnalysis.js @@ -1,4 +1,4 @@ -import React, {useState, useEffect} from 'react' +import React, { useState, useEffect } from 'react' import { Modal, ModalHeader, @@ -73,67 +73,76 @@ const ReportAnalysis = ({ openDialog, closeDialog, toggleDialog, projectId }) => }; const columns = [ - {title: "Gantt", dataIndex: "name_version", key: "name_version"}, - {title: "Baseline Start", dataIndex: "planned_start", key: "planned_start", + { title: "Gantt", dataIndex: "name_version", key: "name_version" }, + { + title: "Baseline Start", dataIndex: "planned_start", key: "planned_start", render: (text, record) => ( - <> - {record.planned_start ? moment(record.planned_start).format("DD-MM-YY") : ''} - - ), + <> + {record.planned_start ? moment(record.planned_start).format("DD-MM-YY") : ''} + + ), }, - {title: "Baseline Finish", dataIndex: "planned_end", key: "planned_end", + { + title: "Baseline Finish", dataIndex: "planned_end", key: "planned_end", render: (text, record) => ( - <> - {record.planned_end ? moment(record.planned_end).format("DD-MM-YY") : ''} - - ), + <> + {record.planned_end ? moment(record.planned_end).format("DD-MM-YY") : ''} + + ), }, - {title: "Early Start", dataIndex: "start_date", key: "start_date", + { + title: "Early Start", dataIndex: "start_date", key: "start_date", render: (text, record) => ( - <> - {moment(record.start_date).format("DD-MM-YY")} - - ), + <> + {moment(record.start_date).format("DD-MM-YY")} + + ), }, - {title: "Early Finish", dataIndex: "end_date", key: "end_date", + { + title: "Early Finish", dataIndex: "end_date", key: "end_date", render: (text, record) => ( - <> - {moment(record.end_date).format("DD-MM-YY")} - - ), + <> + {moment(record.end_date).format("DD-MM-YY")} + + ), }, - {title: "Actual Start", dataIndex: "actual_start", key: "actual_start", + { + title: "Actual Start", dataIndex: "actual_start", key: "actual_start", render: (text, record) => ( - <> - {record.actual_start ? moment(record.actual_start).format("DD-MM-YY") : ""} - - ), + <> + {record.actual_start ? moment(record.actual_start).format("DD-MM-YY") : ""} + + ), }, - {title: "Actual Finish", dataIndex: "actual_end", key: "actual_end", + { + title: "Actual Finish", dataIndex: "actual_end", key: "actual_end", render: (text, record) => ( - <> - {record.actual_end ? moment(record.actual_end).format("DD-MM-YY") : ""} - - ), + <> + {record.actual_end ? moment(record.actual_end).format("DD-MM-YY") : ""} + + ), }, - {title: "Assign HR", dataIndex: "user_name", key: "user_name", width: "8%", - ellipsis:{ - showTitle: true - }, - render: (text) => - - {text} - + { + title: "Assign HR", dataIndex: "user_name", key: "user_name", width: "8%", + ellipsis: { + showTitle: true + }, + render: (text) => + + {text} + }, - {title: "Volume Plan", dataIndex: "qty_planning", key: "qty_planning", - render: (text, record) => - <> - {text ? text : 0} - + { + title: "Volume Plan", dataIndex: "qty_planning", key: "qty_planning", + render: (text, record) => + <> + {text ? text : 0} + }, - {title: "Volume Actual", dataIndex: "qty", key: "qty"}, - {title: "Progress Plan (%)", dataIndex: "persentase_progress", key: "persentase_progress", - render: (text, record) => { + { title: "Volume Actual", dataIndex: "qty", key: "qty" }, + { + title: "Progress Plan (%)", dataIndex: "persentase_progress", key: "persentase_progress", + render: (text, record) => { const startDate = moment(record.start_date); const duration = record.duration; @@ -148,7 +157,7 @@ const ReportAnalysis = ({ openDialog, closeDialog, toggleDialog, projectId }) => ); }, }, - {title: "Progress Actual (%)", dataIndex: "persentase_progress", key: "persentase_progress", width: "8%"}, + { title: "Progress Actual (%)", dataIndex: "persentase_progress", key: "persentase_progress", width: "8%" }, { title: 'Action', dataIndex: '', @@ -165,59 +174,67 @@ const ReportAnalysis = ({ openDialog, closeDialog, toggleDialog, projectId }) => ] const columnActivityToHr = [ - {title: "Activity", dataIndex: "join_second_name", key: "join_second_name"}, - {title: "Gantt", dataIndex: "join_fourth_name_version", key: "join_fourth_name_version"}, - {title: "Baseline Start", dataIndex: "join_second_planned_start", key: "join_second_planned_start", + { title: "Activity", dataIndex: "join_second_name", key: "join_second_name" }, + { title: "Gantt", dataIndex: "join_fourth_name_version", key: "join_fourth_name_version" }, + { + title: "Baseline Start", dataIndex: "join_second_planned_start", key: "join_second_planned_start", render: (text, record) => ( - <> - {moment(record.join_second_planned_start).format("DD-MM-YY")} - - ), + <> + {moment(record.join_second_planned_start).format("DD-MM-YY")} + + ), }, - {title: "Baseline Finish", dataIndex: "join_second_planned_end", key: "join_second_planned_end", + { + title: "Baseline Finish", dataIndex: "join_second_planned_end", key: "join_second_planned_end", render: (text, record) => ( - <> - {moment(record.join_second_planned_end).format("DD-MM-YY")} - - ), + <> + {moment(record.join_second_planned_end).format("DD-MM-YY")} + + ), }, - {title: "Early Start", dataIndex: "join_second_start_date", key: "join_second_start_date", + { + title: "Early Start", dataIndex: "join_second_start_date", key: "join_second_start_date", render: (text, record) => ( - <> - {moment(record.join_second_start_date).format("DD-MM-YY")} - - ), + <> + {moment(record.join_second_start_date).format("DD-MM-YY")} + + ), }, - {title: "Early Finish", dataIndex: "join_second_end_date", key: "join_second_end_date", + { + title: "Early Finish", dataIndex: "join_second_end_date", key: "join_second_end_date", render: (text, record) => ( - <> - {moment(record.join_second_end_date).format("DD-MM-YY")} - - ), + <> + {moment(record.join_second_end_date).format("DD-MM-YY")} + + ), }, - {title: "Actual Start", dataIndex: "join_second_actual_start", key: "join_second_actual_start", + { + title: "Actual Start", dataIndex: "join_second_actual_start", key: "join_second_actual_start", render: (text, record) => ( - <> - {record.join_second_actual_start ? moment(record.join_second_actual_start).format("DD-MM-YY") : ""} - - ), + <> + {record.join_second_actual_start ? moment(record.join_second_actual_start).format("DD-MM-YY") : ""} + + ), }, - {title: "Actual Finish", dataIndex: "join_second_actual_end", key: "join_second_actual_end", + { + title: "Actual Finish", dataIndex: "join_second_actual_end", key: "join_second_actual_end", render: (text, record) => ( - <> - {record.join_second_actual_end ? moment(record.join_second_actual_end).format("DD-MM-YY") : ""} - - ), + <> + {record.join_second_actual_end ? moment(record.join_second_actual_end).format("DD-MM-YY") : ""} + + ), }, - {title: "Volume Plan", dataIndex: "join_third_qty_planning", key: "join_third_qty_planning", - render: (text, record) => - <> - {text ? text : 0} - + { + title: "Volume Plan", dataIndex: "join_third_qty_planning", key: "join_third_qty_planning", + render: (text, record) => + <> + {text ? text : 0} + }, - {title: "Volume Actual", dataIndex: "volume_actual", key: "volume_actual"}, - {title: "Progress Plan (%)", dataIndex: "join_second_persentase_progress", key: "persentase_progress", - render: (text, record) => { + { title: "Volume Actual", dataIndex: "volume_actual", key: "volume_actual" }, + { + title: "Progress Plan (%)", dataIndex: "join_second_persentase_progress", key: "persentase_progress", + render: (text, record) => { const startDate = moment(record.join_second_start_date); const duration = record.join_second_duration; @@ -232,20 +249,20 @@ const ReportAnalysis = ({ openDialog, closeDialog, toggleDialog, projectId }) => ); }, }, - {title: "Progress Actual (%)", dataIndex: "join_second_persentase_progress", key: "persentase_progress"}, + { title: "Progress Actual (%)", dataIndex: "join_second_persentase_progress", key: "persentase_progress" }, { - title: 'Action', - dataIndex: '', - key: 'id', - className: "nowrap", - render: (text, record) => - <> - - - {" "} - - , - }, + title: 'Action', + dataIndex: '', + key: 'id', + className: "nowrap", + render: (text, record) => + <> + + + {" "} + + , + }, ] useEffect(() => { @@ -297,10 +314,10 @@ const ReportAnalysis = ({ openDialog, closeDialog, toggleDialog, projectId }) => if (status == "Save") { // getdataGantt() NotificationManager.success(`Gantt berhasil dibuat!`, 'Success!!'); - }else if (status == "Edit") { + } else if (status == "Edit") { // getdataGantt() NotificationManager.success(`Gantt berhasil dibubah!`, 'Failed!!'); - }else if (status == "failed") { + } else if (status == "failed") { NotificationManager.error(`Gantt gagal dibuat!`, 'Failed!!'); } setDataDetail(null) @@ -338,7 +355,21 @@ const ReportAnalysis = ({ openDialog, closeDialog, toggleDialog, projectId }) => if (result && result.data && result.data.code == 200) { let dataRes = result.data.data || []; - setHrList(dataRes); + let groupedData = {}; + + dataRes.forEach(data => { + if (groupedData[data.join_first_name]) { + groupedData[data.join_first_name].join_first_id = Math.min(groupedData[data.join_first_name].join_first_id, data.join_first_id); + } else { + groupedData[data.join_first_name] = { + join_first_id: data.join_first_id, + join_first_name: data.join_first_name + }; + } + }); + let dataFiltered = Object.values(groupedData); + + setHrList(dataFiltered); } else { NotificationManager.error("Gagal Mengambil Data!!", "Failed"); } @@ -382,21 +413,21 @@ const ReportAnalysis = ({ openDialog, closeDialog, toggleDialog, projectId }) => name1: "m_activity", name: "assign_material_to_activity", column_join: "id", - column_self:"activity_id", - column_results: ["id", "qty_planning"] + column_self: "activity_id", + column_results: ["qty_planning"] }, { name1: "m_activity", name: "m_version_gantt", column_join: "version_gantt_id", - column_self:"id", + column_self: "id", column_results: ["name_version"] }, { name1: "m_activity", name: "report_activity_material", column_join: "id", - column_self:"activity_id", + column_self: "activity_id", }, ], orders: { columns: ["id"], ascending: false }, @@ -411,7 +442,7 @@ const ReportAnalysis = ({ openDialog, closeDialog, toggleDialog, projectId }) => if (result && result.data && result.data.code == 200) { let dataRes = result.data.data || []; dataRes.forEach(element => { - element.join_third_persentase_progress ? sum += parseInt(element.join_third_persentase_progress) : sum += 0; + element.join_third_persentase_progress ? sum += parseInt(element.join_third_persentase_progress) : sum += 0; }); setAvgActivityHr(sum / dataRes.length); setDataTableActivityToHr(dataRes); @@ -485,9 +516,9 @@ const ReportAnalysis = ({ openDialog, closeDialog, toggleDialog, projectId }) => let dataRes = result.data.data || []; dataRes.forEach(element => { - element.persentase_progress ? sum += parseInt(element.persentase_progress) : sum += 0; - element.qty_planning ? sumPlan += parseInt(element.qty_planning) : sumPlan += 0; - element.qty ? sumAct += parseInt(element.qty) : sumAct += 0; + element.persentase_progress ? sum += parseInt(element.persentase_progress) : sum += 0; + element.qty_planning ? sumPlan += parseInt(element.qty_planning) : sumPlan += 0; + element.qty ? sumAct += parseInt(element.qty) : sumAct += 0; }); setAvgActivity(sum / dataRes.length); setSumVolPlan(sumPlan); @@ -536,9 +567,9 @@ const ReportAnalysis = ({ openDialog, closeDialog, toggleDialog, projectId }) => @@ -573,9 +604,9 @@ const ReportAnalysis = ({ openDialog, closeDialog, toggleDialog, projectId }) =>