From 08d1994fae5f10fb6573adaa6bafde1296998e90 Mon Sep 17 00:00:00 2001 From: farhantock Date: Tue, 23 Jan 2024 17:29:54 +0700 Subject: [PATCH 1/5] update html title --- public/OSPRO.ico | Bin 0 -> 105726 bytes public/index.html | 4 ++-- src/App.js | 2 -- src/containers/DefaultLayout/DefaultLayout.js | 2 ++ src/routes.js | 2 +- src/views/Pages/Login/Login.js | 16 ++++++++++++++++ 6 files changed, 21 insertions(+), 5 deletions(-) create mode 100644 public/OSPRO.ico diff --git a/public/OSPRO.ico b/public/OSPRO.ico new file mode 100644 index 0000000000000000000000000000000000000000..113520704ff10e10a1a985138d1e55e7f1e368c4 GIT binary patch literal 105726 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 - + OSPRO - + import('./views/Layers/Layer')); const Layers = React.lazy(() => import('./views/Layers/Layers')); const Lembur = React.lazy(() => import('./views/Master/MasterLembur')); const MapConfig = React.lazy(() => import('./views/MapConfig')); -const Menu = React.lazy(() => import('./views/Master/MasterMenu')); +const Menu = React.lazy(() => import('./views/Master/MenuCompany')); const OfficeHours = React.lazy(() => import('./views/Master/MasterOfficeHours')); const Organization = React.lazy(() => import('./views/Master/MasterOrganization')); const PanicButton = React.lazy(() => import('./views/SimproV2/PanicButton')); diff --git a/src/views/Pages/Login/Login.js b/src/views/Pages/Login/Login.js index 8cbdca8..47c8e9d 100644 --- a/src/views/Pages/Login/Login.js +++ b/src/views/Pages/Login/Login.js @@ -58,6 +58,21 @@ class Login extends Component { this.handleChange = this.handleChange.bind(this); this.showHide = this.showHide.bind(this); } + updatePageTitle = () => { + try { + const storedData = localStorage.getItem('configApp'); + if (storedData !== null) { + const data = JSON.parse(storedData); + const htmlTitle = data.html_title || 'OSPRO'; + console.log('htmlTitle', htmlTitle); + document.getElementById('title').innerText = htmlTitle; + } else { + document.title = 'OSPRO'; + } + } catch (error) { + document.title = 'OSPRO'; + } + } showHide(e) { e.preventDefault(); e.stopPropagation(); @@ -255,6 +270,7 @@ class Login extends Component { window.localStorage.setItem('all_project', data_user.role.all_project); window.localStorage.setItem('hierarchy', JSON.stringify(data_user.hierarchy)); window.localStorage.setItem('configApp', JSON.stringify(data_user.configApp)); + this.updatePageTitle(); } else { // NotificationManager.error('Cek username atau password anda!', 'Gagal Login!'); NotificationManager.error(doLogin.data.message, 'Login Failed!'); From 4b22ba52c417b8acc1170ce8d7734b93687145c5 Mon Sep 17 00:00:00 2001 From: farhantock Date: Tue, 23 Jan 2024 17:30:18 +0700 Subject: [PATCH 2/5] update filter --- src/views/Dashboard/DashboardBOD.js | 91 +++++++++-------------------- 1 file changed, 28 insertions(+), 63 deletions(-) diff --git a/src/views/Dashboard/DashboardBOD.js b/src/views/Dashboard/DashboardBOD.js index 64084b4..a63d260 100644 --- a/src/views/Dashboard/DashboardBOD.js +++ b/src/views/Dashboard/DashboardBOD.js @@ -15,19 +15,19 @@ import { HealthByBudget, HealthBySchedule } from './Components'; import { Link } from 'react-router-dom'; import { Card, CardBody, CardHeader, Input } from "reactstrap"; const DashboardBOD = (props) => { - let role_id = 0, user_id = 0, isLogin = false, token = '', company_id = 0, all_project = null, role_name='', hierarchy=[], user_name=''; - if (props && props.role_id && props.user_id) { - role_id = props.role_id; - user_id = props.user_id; - token = props.token; - isLogin = props.isLogin; - company_id = props.company_id; - all_project = props.all_project; - role_name = props.role_name; - isLogin = props.isLogin; - hierarchy = props.hierarchy; - user_name = props.user_name; - } + let role_id = 0, user_id = 0, isLogin = false, token = '', company_id = 0, all_project = null, role_name = '', hierarchy = [], user_name = ''; + if (props && props.role_id && props.user_id) { + role_id = props.role_id; + user_id = props.user_id; + token = props.token; + isLogin = props.isLogin; + company_id = props.company_id; + all_project = props.all_project; + role_name = props.role_name; + isLogin = props.isLogin; + hierarchy = props.hierarchy; + user_name = props.user_name; + } const HEADER = { headers: { "Content-Type": "application/json", @@ -61,13 +61,6 @@ const DashboardBOD = (props) => { const [READY_TABLE_DETAIL_EXPENDITURE, SET_READY_TABLE_DETAIL_EXPENDITURE] = useState(false); const [DATA_DETAIL_EXPENDITURE, SET_DATA_DETAIL_EXPENDITURE] = useState([]); - const currentYear = new Date().getFullYear(); - const years = Array.from({ length: 6 }, (_, index) => currentYear - index); - const storedYear = localStorage.getItem('selectedYear'); - const initialYear = storedYear ? storedYear : currentYear.toString(); - - const [searchColumn, setSearchColumn] = useState(initialYear); - useEffect(() => { getCompanyCashFlow(); // expenditure getCompanyExpenditureColor(); // expenditure Color @@ -82,14 +75,13 @@ const DashboardBOD = (props) => { getProjectScheduleHealthPerDivision(); // project by schedule health per division getTotalProjectPerDivision(); // project by division getTotalProjectValuePerDivision(); // project value by division - localStorage.setItem('selectedYear', searchColumn); - }, [searchColumn]) + }, []) // project expenditure const getCompanyCashFlow = async () => { - const URL = `${BASE_OSPRO}/api/dashboard/get-company-cashflow/${searchColumn}/${company_id}/${all_project}/${hierarchy}` + const URL = `${BASE_OSPRO}/api/dashboard/get-company-cashflow/${company_id}/${all_project}/${hierarchy}/${role_name}` const result = await axios.get(URL, HEADER).then(res => res).catch(err => err.response) const content = "Get Project Expenditure."; @@ -115,31 +107,31 @@ const DashboardBOD = (props) => { // Project Expenditure Color const getCompanyExpenditureColor = async () => { - const URL = `${BASE_OSPRO}/api/dashboard/get-detail-expenditure-color/${company_id}` + const URL = `${BASE_OSPRO}/api/dashboard/get-detail-expenditure-color/${company_id}/${role_name}` const result = await axios.get(URL, HEADER).then(res => res).catch(err => err.response) SET_PROJECT_EXPENDITURE_COLOR(result.data.data) } const getCompanyFinancialHealthColor = async () => { - const URL = `${BASE_OSPRO}/api/dashboard/get-detail-financial-health-color/${company_id}` + const URL = `${BASE_OSPRO}/api/dashboard/get-detail-financial-health-color/${company_id}/${role_name}` const result = await axios.get(URL, HEADER).then(res => res).catch(err => err.response) SET_PROJECT_FINANCIAL_HEALTH_COLOR(result.data.data) } const getCompanyScheduleHealthColor = async () => { - const URL = `${BASE_OSPRO}/api/dashboard/get-detail-schedule-health-color/${company_id}` + const URL = `${BASE_OSPRO}/api/dashboard/get-detail-schedule-health-color/${company_id}/${role_name}` const result = await axios.get(URL, HEADER).then(res => res).catch(err => err.response) SET_PROJECT_SCHEDULE_HEALTH_COLOR(result.data.data) } const getCompanyInvoiceColor = async () => { - const URL = `${BASE_OSPRO}/api/dashboard/get-detail-invoice-color/${company_id}` + const URL = `${BASE_OSPRO}/api/dashboard/get-detail-invoice-color/${company_id}/${role_name}` const result = await axios.get(URL, HEADER).then(res => res).catch(err => err.response) SET_PROJECT_INVOICE_COLOR(result.data.data) } const getInvoiceOutstanding = async () => { - const URL = `${BASE_OSPRO}/api/dashboard/get-invoice-outstanding/${searchColumn}/${company_id}/${all_project}/${hierarchy}` + const URL = `${BASE_OSPRO}/api/dashboard/get-invoice-outstanding/${company_id}/${all_project}/${hierarchy}/${role_name}` const result = await axios.get(URL, HEADER).then(res => res).catch(err => err.response) const content = "Get Project Invoice vs Cash In."; @@ -162,7 +154,7 @@ const DashboardBOD = (props) => { } const getProjectPerScheduleHealth = async () => { - const URL = `${BASE_OSPRO}/api/dashboard/get-total-project-per-schedule-health/${searchColumn}/${company_id}/${all_project}/${hierarchy}` + const URL = `${BASE_OSPRO}/api/dashboard/get-total-project-per-schedule-health/${company_id}/${all_project}/${hierarchy}/${role_name}` const result = await axios.get(URL, HEADER).then(res => res).catch(err => err.response) const content = "Get Project by Schedule Health."; @@ -186,7 +178,7 @@ const DashboardBOD = (props) => { } const getProjectPerBudgetHealth = async () => { - const URL = `${BASE_OSPRO}/api/dashboard/get-total-project-per-budget-health/${searchColumn}/${company_id}/${all_project}/${hierarchy}` + const URL = `${BASE_OSPRO}/api/dashboard/get-total-project-per-budget-health/${company_id}/${all_project}/${hierarchy}/${role_name}` const result = await axios.get(URL, HEADER).then(res => res).catch(err => err.response) const content = "Get Project by Budget Health."; @@ -209,7 +201,7 @@ const DashboardBOD = (props) => { } const getProjectBudgetHealthPerDivision = async () => { - const URL = `${BASE_OSPRO}/api/dashboard/get-total-project-budget-health-per-division/${searchColumn}/${company_id}/${all_project}/${hierarchy}` + const URL = `${BASE_OSPRO}/api/dashboard/get-total-project-budget-health-per-division/${company_id}/${all_project}/${hierarchy}/${role_name}` const result = await axios.get(URL, HEADER).then(res => res).catch(err => err.response) const content = "Get Project by Schedule Health per Division."; @@ -233,7 +225,7 @@ const DashboardBOD = (props) => { } const getProjectScheduleHealthPerDivision = async () => { - const URL = `${BASE_OSPRO}/api/dashboard/get-total-project-schedule-health-per-division/${searchColumn}/${company_id}/${all_project}/${hierarchy}` + const URL = `${BASE_OSPRO}/api/dashboard/get-total-project-schedule-health-per-division/${company_id}/${all_project}/${hierarchy}/${role_name}` const result = await axios.get(URL, HEADER).then(res => res).catch(err => err.response) const content = "Get Project by Schedule Health."; @@ -256,7 +248,7 @@ const DashboardBOD = (props) => { } const getProjectPerPhase = async () => { - const URL = `${BASE_OSPRO}/api/dashboard/get-total-project-per-phase/${searchColumn}/${company_id}/${all_project}/${hierarchy}` + const URL = `${BASE_OSPRO}/api/dashboard/get-total-project-per-phase/${company_id}/${all_project}/${hierarchy}/${role_name}` const result = await axios.get(URL, HEADER).then(res => res).catch(err => err.response) const content = "Get Project by Phase."; @@ -281,7 +273,7 @@ const DashboardBOD = (props) => { } const getTotalProjectPerDivision = async () => { - const URL = `${BASE_OSPRO}/api/dashboard/get-total-project-per-division/${searchColumn}/${company_id}/${all_project}/${hierarchy}` + const URL = `${BASE_OSPRO}/api/dashboard/get-total-project-per-division/${company_id}/${all_project}/${hierarchy}/${role_name}` const result = await axios.get(URL, HEADER).then(res => res).catch(err => err.response) const content = "Get Project by Division."; @@ -306,7 +298,7 @@ const DashboardBOD = (props) => { } const getTotalProjectValuePerDivision = async () => { - const URL = `${BASE_OSPRO}/api/dashboard/get-total-project-value-per-division/${searchColumn}/${company_id}/${all_project}/${hierarchy}` + const URL = `${BASE_OSPRO}/api/dashboard/get-total-project-value-per-division/${company_id}/${all_project}/${hierarchy}/${role_name}` const result = await axios.get(URL, HEADER).then(res => res).catch(err => err.response) const content = "Get Project Value by Division"; @@ -335,7 +327,7 @@ const DashboardBOD = (props) => { return; } setOpenDetailedView(true); - const URL = `${BASE_OSPRO}/api/dashboard/get-detail-expenditure/${searchColumn}/${company_id}/${all_project}/${hierarchy}` + const URL = `${BASE_OSPRO}/api/dashboard/get-detail-expenditure/${company_id}/${all_project}/${hierarchy}/${role_name}` const result = await axios.get(URL, HEADER).then(res => res).catch(err => err.response) const content = "Get Detail Expenditure"; @@ -454,33 +446,6 @@ const DashboardBOD = (props) => {
{/* */} - - -
-

Dashboard

-
-
-
-

Search by Years

-
-
- setSearchColumn(e.target.value)} - name="select" - > - {years.map((year) => ( - - ))} - -
-
- -
From 33e3e36706351ce297ce5f9afdfaeda078f12ff7 Mon Sep 17 00:00:00 2001 From: farhantock Date: Tue, 23 Jan 2024 17:30:29 +0700 Subject: [PATCH 3/5] update from adw --- src/views/Dashboard/DashboardProject.js | 218 ++++++++++++++++-------- 1 file changed, 145 insertions(+), 73 deletions(-) diff --git a/src/views/Dashboard/DashboardProject.js b/src/views/Dashboard/DashboardProject.js index 376bada..7ec0cbe 100644 --- a/src/views/Dashboard/DashboardProject.js +++ b/src/views/Dashboard/DashboardProject.js @@ -30,7 +30,9 @@ import { } from "./Components"; import { Fab, Action } from "react-tiny-fab"; import "react-tiny-fab/dist/styles.css"; -import { useHistory, useLocation, useParams } from "react-router-dom"; +import { useHistory, useParams } from "react-router-dom"; +import { Icon } from '@iconify/react'; +import arrowLeft from '@iconify/icons-ion/ios-arrow-back'; const { TextArea } = Input; @@ -64,8 +66,7 @@ const center = { }; const DashboardProject = (props) => { - - let role_id = 0, user_id = 0, isLogin = false, token = '', company_id = 0, all_project = null, role_name='', hierarchy=[], user_name=''; + let role_id = 0, user_id = 0, isLogin = false, token = '', company_id = 0, all_project = null, role_name = '', hierarchy = [], user_name = ''; if (props && props.role_id && props.user_id) { role_id = props.role_id; user_id = props.user_id; @@ -78,7 +79,6 @@ const DashboardProject = (props) => { hierarchy = props.hierarchy; user_name = props.user_name; } - const HEADER = { headers: { "Content-Type": "application/json", @@ -87,7 +87,7 @@ const DashboardProject = (props) => { }; const { PROJECT_ID, GANTT_ID, SCURVE } = useParams(); const URL_GANTT = `https://project-gantt.ospro.id/view-mode/index.html?base_url=${BASE_OSPRO}/api&gantt_id=${GANTT_ID}&proyek_id=${PROJECT_ID}&token=${token}&ro=1&role_name=${role_name}&company_id=${company_id}`; - // const URL_GANTT = `http://localhost:8444/generic-ospro-gantt/view-mode/index.html?base_url=${BASE_OSPRO}/api&gantt_id=${GANTT_ID}&proyek_id=${PROJECT_ID}&token=${token}&ro=1&role_name=${role_name}&company_id=${company_id}`; + // const URL_GANTT = `http://localhost:8444/generic-ospro-gantt/view-mode/index.html?base_url=${BASE_OSPRO}/api&gantt_id=${GANTT_ID}&proyek_id=${PROJECT_ID}&token=${token}&ro=1&role_name=${role_name}&company_id=${company_id}`; const mapRef = useRef(); const [projectName, setProjectName] = useState(""); const [projectManagerName, setProjectManagerName] = useState(""); @@ -140,6 +140,8 @@ const DashboardProject = (props) => { const [isReadyGanttParents, setIsReadyGanttParents] = useState(false); const [calculationStatus, setCalculationStatus] = useState(false); const [isHierarchy, setIsHierarchy] = useState(null); + const [dataOverdue, setDataOverdue] = useState(null); + const [projectType, setProjectType] = useState(null); let history = useHistory(); useEffect(() => { @@ -150,6 +152,7 @@ const DashboardProject = (props) => { getGantt(); getGanttParents(); return () => { + console.log("unmount RenderMap"); }; }, []); @@ -158,9 +161,10 @@ const DashboardProject = (props) => { getSCurve(); } window.addEventListener("message", handleIframeMessage); - + window.addEventListener('message', handleGetOverdue); return () => { window.removeEventListener("message", handleIframeMessage); + window.removeEventListener("message", handleGetOverdue); }; }, [isHierarchy]); @@ -183,8 +187,13 @@ const DashboardProject = (props) => { useEffect(() => { let deviation = 0; - if (plannedCost && totalCost) { - deviation = plannedCost - totalCost; + // Convert plannedCost and totalCost to numbers + const plannedCostNumber = parseFloat(plannedCost); + const totalCostNumber = parseFloat(totalCost); + + // Check if conversion is successful + if (!isNaN(plannedCostNumber) && !isNaN(totalCostNumber)) { + deviation = plannedCostNumber - totalCostNumber; } setRemToComplete(deviation.toString()); }, [plannedCost, totalCost]); @@ -199,6 +208,7 @@ const DashboardProject = (props) => { const response = await axios.get(url, HEADER); setManPower(response.data.totalRecord); } catch (error) { + console.error("Failed to get manpower:", error); } }; @@ -215,6 +225,7 @@ const DashboardProject = (props) => { } setIsReadyGantt(true); } catch (error) { + console.error("Failed to get gantt data:", error); setIsReadyGantt(true); } }; @@ -227,6 +238,7 @@ const DashboardProject = (props) => { setDataGanttParents(response); setIsReadyGanttParents(true); } catch (error) { + console.error("Failed to get gantt data:", error); setIsReadyGanttParents(true); } }; @@ -244,6 +256,7 @@ const DashboardProject = (props) => { setAssignedHrCount(assignedList.length); setAssignedHr(assignedList); } catch (error) { + console.error("Failed to get assigned HR:", error); } }; @@ -300,6 +313,7 @@ const DashboardProject = (props) => { .get(URL, HEADER) .then((res) => res) .catch((err) => err.response); + console.log("getProjectDetail", result); if (!result) { NotificationManager.error(`Could not connect to internet.`, "Failed"); setIsReadyProjectDetail(true); @@ -314,6 +328,8 @@ const DashboardProject = (props) => { setIsReadyProjectDetail(true); return; } else if (result.status == 200 && result.data.data) { + console.log(result.data.data); + // setComments(result.data.data); setProjectName(result.data.data.nama ? result.data.data.nama : "-"); setProjectManagerName( result.data.data.projectManager ? result.data.data.projectManager : "-" @@ -341,6 +357,7 @@ const DashboardProject = (props) => { ? result.data.data.header?.planned_end : null ); + setProjectType(result.data.data.type_proyek_id); setActualStart( result.data.data.header?.start_date ? result.data.data.header.start_date @@ -408,6 +425,7 @@ const DashboardProject = (props) => { let selisihProgress = 0; let planningProgress = 0; let actualProgress = 0; + console.log("test flow ", result.data.data); let statusHealthBySchedule = "on-schedule"; if ( result.data.data.length > 0 && @@ -431,21 +449,13 @@ const DashboardProject = (props) => { result.data.data[0].data.budget_control.cost_deviation?.toString() ); } - let now = new Date().toISOString().slice(0, 10); - let dates = result.data.data[0].data?.date; - let n = dates.findIndex( - (element) => new Date(now) < new Date(element[0]) - ); - if (n < 0) { - n = dates.length - 1; - } if ( result.data.data.length > 0 && result.data.data[0].data?.percentagePlan && result.data.data[0].data?.percentagePlan.length > 0 ) { - planningProgress = result.data.data[0].data?.percentagePlan[n]; - setPlanningProgress(planningProgress); + planningProgress = result.data.data[0].data?.percentagePlan[result.data.data[0].data?.percentagePlan.length - 1]; + setPlanningProgress(Math.ceil(planningProgress)); } if ( result.data.data.length > 0 && @@ -484,6 +494,7 @@ const DashboardProject = (props) => { .post(URL, payload, HEADER) .then((res) => res) .catch((err) => err.response); + console.log("getOverdueActivities", result); if (!result) { NotificationManager.error(`Could not connect to internet.`, "Failed"); setIsReadyOverdueActivities(true); @@ -520,6 +531,7 @@ const DashboardProject = (props) => { .post(URL, payload, HEADER) .then((res) => res) .catch((err) => err.response); + console.log("getIntegrationInvoice", result); if (!result) { NotificationManager.error(`Could not connect to internet.`, "Failed"); setIsReadyIntegrationInvoice(true); @@ -566,6 +578,7 @@ const DashboardProject = (props) => { .post(URL, payload, HEADER) .then((res) => res) .catch((err) => err.response); + console.log("getReportDistribution", result); if (!result) { NotificationManager.error(`Could not connect to internet.`, "Failed"); setIsReadyReportDistribution(true); @@ -618,6 +631,7 @@ const DashboardProject = (props) => { .post(URL, payload, HEADER) .then((res) => res) .catch((err) => err.response); + console.log("getComments", result); if (!result) { NotificationManager.error(`Could not connect to internet.`, "Failed"); setIsReadyComments(true); @@ -638,6 +652,7 @@ const DashboardProject = (props) => { }; const handleSendComment = async () => { + // console.log('handleSendComment', comment); setIsSendingComment(true); if (comment === "") { NotificationManager.error( @@ -684,6 +699,10 @@ const DashboardProject = (props) => { setIsSendingComment(false); }; + const handleBack = async () => { + window.parent.location.reload(); + }; + const initMap = () => { let mymap = L.map("map-area", { center: center, @@ -731,6 +750,12 @@ const DashboardProject = (props) => { } }; + const handleGetOverdue = (event) => { + if (event.data.type === 'dataOverdueUpdate') { + setDataOverdue(event.data.dataOverdue); + } + } + const RenderGantt = useMemo( () => (