From 99603aa75d3dbbe71457873c8989e2c245b48ca3 Mon Sep 17 00:00:00 2001 From: Wahyu Ramadhan Date: Thu, 2 Mar 2023 14:37:29 +0700 Subject: [PATCH] Adding import activity --- package.json | 1 + public/template/template_activity.xlsx | Bin 0 -> 15577 bytes src/routes.js | 2 + .../SimproV2/CreatedProyek/DialogGantt.js | 7 + .../CreatedProyek/ImportActivity/index.js | 397 ++++++++++++++++++ .../CreatedProyek/ImportActivity/table.css | 13 + 6 files changed, 420 insertions(+) create mode 100644 public/template/template_activity.xlsx create mode 100644 src/views/SimproV2/CreatedProyek/ImportActivity/index.js create mode 100644 src/views/SimproV2/CreatedProyek/ImportActivity/table.css diff --git a/package.json b/package.json index d721a5b..3e8583b 100644 --- a/package.json +++ b/package.json @@ -74,6 +74,7 @@ "react-color": "^2.17.3", "react-content-loader": "^6.0.3", "react-dom": "^16.14.0", + "react-excel-renderer": "^1.1.0", "react-grid-layout": "^1.2.5", "react-highlight-words": "^0.18.0", "react-i18next": "^12.1.5", diff --git a/public/template/template_activity.xlsx b/public/template/template_activity.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..fea79a75b9c007aaf141d16d4fce74e7bea05df1 GIT binary patch literal 15577 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 import('./views/Master/ConfigAlert')); const ControlMonitoring = React.lazy(() => import('./views/Report/ControlMonitoring')); const ControlMonitoringGantt = React.lazy(() => import('./views/ControlMonitoringGantt')); const CreatedProyek = React.lazy(() => import('./views/SimproV2/CreatedProyek')); +const GanttImportActivity = React.lazy(() => import('./views/SimproV2/CreatedProyek/ImportActivity')); const Dashboard = React.lazy(() => import('./views/Dashboard')); const Divisi = React.lazy(() => import('./views/SimproV2/Divisi')); const DivisiKaryawan = React.lazy(() => import('./views/Master/MasterTipeKaryawan')); @@ -55,6 +56,7 @@ const routes = [ { path: '/dashboard-customer/:PROJECT_ID/:GANTT_ID', name: 'DashboardCustomer', component: DashboardCustomer }, { path: '/dashboard-project/:PROJECT_ID/:GANTT_ID', exact: true, name: 'Dashboard Project', component: DashboardProject }, { path: '/projects', exact: true, name: 'Projects', component: CreatedProyek }, + { path: '/projects/:id/import/activity', exact: true, name: 'Gantt Import Activity', component: GanttImportActivity }, { path: '/projects/:id/:project/gantt', exact: true, name: 'Gantt', component: Gantt }, { path: '/human-resource', exact: true, name: 'Human Resource', component: ResourceWorker }, { path: '/material-resource', exact: true, name: 'Material Resource', component: ResourceMaterial }, diff --git a/src/views/SimproV2/CreatedProyek/DialogGantt.js b/src/views/SimproV2/CreatedProyek/DialogGantt.js index 3574038..9c76af6 100644 --- a/src/views/SimproV2/CreatedProyek/DialogGantt.js +++ b/src/views/SimproV2/CreatedProyek/DialogGantt.js @@ -123,6 +123,13 @@ const DialogGantt = ({ openDialog, closeDialog, toggleDialog, idTask, proyekName {" "} + + {" "} + + {" "} + diff --git a/src/views/SimproV2/CreatedProyek/ImportActivity/index.js b/src/views/SimproV2/CreatedProyek/ImportActivity/index.js new file mode 100644 index 0000000..c1cd433 --- /dev/null +++ b/src/views/SimproV2/CreatedProyek/ImportActivity/index.js @@ -0,0 +1,397 @@ +import React, { useState, useEffect, useMemo } from 'react'; +import axios from "../../../../const/interceptorApi" +import { Card, CardBody, CardHeader, Col, Row, Input } from 'reactstrap'; +import { NotificationContainer, NotificationManager } from 'react-notifications'; +import { Button, Table, Form, Upload, Tooltip, Alert, Spin } from 'antd'; +import { InboxOutlined, UploadOutlined } from '@ant-design/icons'; +import {OutTable, ExcelRenderer} from 'react-excel-renderer'; +import './table.css'; +import { BASE_OSPRO } from '../../../../const/ApiConst'; +import { Prompt } from 'react-router-dom'; +// +const config = { + headers: + { + Authorization: `Bearer ${token}`, + "Content-type": `application/json` + } +}; +//const token = window.localStorage.getItem('token'); +const token = localStorage.getItem("token"); +const HEADER = { + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${token}`, + }, +}; + +const normFile = (e) => { + if (Array.isArray(e)) { + return e; + } + + return e?.fileList; +}; + +const formItemLayout = { + labelCol: { + span: 6, + }, + wrapperCol: { + span: 14, + }, +}; + +const errorHandler = { + // error notif + // reload table + // reload upload +}; + +const columnToIndexs = { + columnName: 'index', + level: 0, + predecessor: 1, + no: 2, + name: 3, + weight: 4, + start_date: 5, + end_date: 6, + picKit: 7, + picOwner: 8, + duration: 9 +} + +const ExcelDateToJSDate = (date) => { + let converted_date = new Date(Math.round((date - 25569) * 864e5)); + converted_date = String(converted_date).slice(4, 15) + date = converted_date.split(" ") + let day = date[1]; + let month = date[0]; + month = "JanFebMarAprMayJunJulAugSepOctNovDec".indexOf(month) / 3 + 1 + if (month.toString().length <= 1) + month = '0' + month + let year = date[2]; + return String(day + '-' + month + '-' + year.slice(2, 4)) +} + +const ImportActivity = ({ params }) => { + const pageName = params.name; + + const [dataTable, setDatatable] = useState([]) + // + const [isMovePage, setIsMovePage] = useState(false); + const [isPreview, setIsPreview] = useState(false); + + const fileHandler = (file) => { + setIsMovePage(true); + if(file.name.slice(file.name.lastIndexOf('.')+1) === "xlsx"){ + // NotificationManager.info('Loading...',' '); + setTimeout(() => { + previewHandler(file); + setIsMovePage(false); + }, 5000); + } else { + NotificationManager.error('file harus dalam format .xlsx', 'Failed'); + } + // else{ + // errorHandler() + // } + return false + } + + const previewHandler = (fileObj) => { + let dataMapped = [] + + ExcelRenderer(fileObj, (err, resp) => { + if(err){ + console.log(err) + errorHandler() + } else { + // let columns = resp.cols + let rawRows = resp.rows + + let rows = rawRows.filter(function (el) { + return el.length > 0; + }); + + for(let i = 5; i < rows.length; i++){ + let extractedRow = {} + + for (var prop in columnToIndexs) { + if (columnToIndexs.hasOwnProperty.call(columnToIndexs, prop)) { + let columnData = rows[i][columnToIndexs[prop]] + + // remove leading whitespace + if(typeof(columnData) == 'string') { + columnData = columnData.trim().replace(/ /g, '').replace(/<[^\/>][^>]*><\/[^>]+>/g, "") + } + + // convert excel's DATEVALUE + if(["start_date", "end_date"].includes(prop)){ + columnData = ExcelDateToJSDate(columnData) + } + + if(prop == 'weight'){ + columnData = Math.round(columnData * 100) + } + + extractedRow[prop] = columnData + + } + } + + dataMapped.push(extractedRow) + } + + setDatatable(dataMapped) + setIsPreview(true) + } + }); + + } + + const saveHandler = async (e) => { + setIsMovePage(true); + + let url = window.location.href; + let urlSplitted = url.split('/') + const ganttId = urlSplitted[5] + + const URL = `${BASE_OSPRO}/api/activity/import` + + let payload = { + ganttId: ganttId, + activities: dataTable + } + + const result = await axios + .post(URL, payload, HEADER) + .then((res) => res) + .catch((error) => error.response); + + console.log(result) + if (result.data.code == 200) { + window.location = urlSplitted[0] + '//' + urlSplitted[2] + `/#/projects/` + ganttId + '/' + result.data.projectId + '/gantt' + } + + setIsMovePage(true); + + } + + const columns = [ + { + title: 'No', + dataIndex: 'no', + key: 'no', + width: '5%', + }, + { + title: 'Level', + dataIndex: 'level', + key: 'level', + width: '10%', + align: 'center', + + }, + { + title: 'Predecessor', + dataIndex: 'predecessor', + key: 'predecessor', + align: 'center', + }, + { + title: 'Name', + dataIndex: 'name', + key: 'name', + render: (text, record) => { + let prepend = "" + for(let i = 1; i < record.level; i++) { + prepend = prepend + "--" + } + + return {prepend} {text} + }, + ellipsis: true, + width: '25%', + }, + { + title: 'Weight', + dataIndex: 'weight', + key: 'weight', + render: (text, record) => { + return {text}% + }, + width: '10%', + align: 'center', + }, + { + title: 'Start Date', + dataIndex: 'start_date', + key: 'start_date', + }, + { + title: 'Finish Date', + dataIndex: 'end_date', + key: 'end_date', + }, + { + title: 'Duration', + dataIndex: 'duration', + key: 'duration', + align: 'right', + }, + { + title: 'PIC KIT', + dataIndex: 'picKit', + key: 'picKit', + }, + { + title: 'PIC Owner', + dataIndex: 'picOwner', + key: 'picOwner', + }, + ]; + + if (isMovePage) { + return ( +
+ +
+ + +
+ + + + fileHandler(file)} + showUploadList={false} + > + + + + +
+ + + + +
+
+ + +

Data Preview

+
+ + + index % 2 == 0 ? 'table-row-light' : 'table-row-dark'} + dataSource={dataTable} + columns={columns} + pagination={false} + /> + + + + 'Import Activity belum disave ingin meninggalkan halaman ini?'} + /> + + ) + } + + return ( +
+ +
+ +
+ + + + + fileHandler(file)} + showUploadList={false} + > + + + + + + + + + + + + + +

Data Preview

+
+ +
index % 2 == 0 ? 'table-row-light' : 'table-row-dark'} + dataSource={dataTable} + columns={columns} + pagination={false} + /> + + + 'Import Activity belum disave ingin meninggalkan halaman ini?'} + /> + + ) +} + +export default ImportActivity; diff --git a/src/views/SimproV2/CreatedProyek/ImportActivity/table.css b/src/views/SimproV2/CreatedProyek/ImportActivity/table.css new file mode 100644 index 0000000..b519795 --- /dev/null +++ b/src/views/SimproV2/CreatedProyek/ImportActivity/table.css @@ -0,0 +1,13 @@ +.ant-table-tbody{ + padding: 0 !important; +} +.ant-table-tbody > tr > td{ + padding: 0 !important; +} + +.table-row-light { + background-color: #ffffff; +} +.table-row-dark { + background-color: #f0f3f5; +}