Commit 6eeba545 authored by Internship UKSW 2019's avatar Internship UKSW 2019

Initial commit

parent f64839d1
......@@ -49,6 +49,14 @@ export class DataTableApprovalDocument extends Component {
orderable: false,
targets: 5
},
{
visible: false,
orderable: false,
targets: 6,
render: function (data, type, row) {
return "<div>" + data + "</div>";
}
}
],
order: [[1, "asc"]],
lengthMenu: [[25, 50, 75, 100], [25, 50, 75, 100]]
......
import React, { Component } from 'react';
import axios from 'axios';
const $ = require('jquery');
$.DataTable = require('datatables.net');
export class DataTableExpiredDocument extends Component {
componentDidMount = () => {
this.$el = $(this.el)
var table = this.$el.DataTable({
scrollY: "250px",
scrollCollapse: true,
paging: false,
data: this.props.data,
columns: [
{ title: "No", width: 30 },
{ title: "Code" },
{ title: "Subject" },
{ title: "Status" },
{ title: "Tracking" },
{ title: "Creator" },
],
columnDefs: [
{
searchable: false,
orderable: false,
targets: 0
},
{
orderable: false,
targets: 1,
render: function (data, type, row) {
return "<a class='text-decoration-none' href='#'>" + data + "</a>";
}
},
{
orderable: false,
targets: 2
},
{
orderable: false,
targets: 3
},
{
orderable: false,
targets: 4
},
{
orderable: false,
targets: 5
},
{
visible: false,
orderable: false,
targets: 6,
render: function (data, type, row) {
return "<div>" + data + "</div>";
}
}
],
order: [[1, "asc"]],
lengthMenu: [[25, 50, 75, 100], [25, 50, 75, 100]]
})
table.on("order.dt search.dt", function () {
table.column(0, { search: "applied", order: "applied" }).nodes().each(function (cell, i) {
cell.innerHTML = i + 1;
});
}).draw();
table.on("click", "a", function (e) {
e.preventDefault();
let data = table.row($(this).parents("tr")).data();
window.open("http://10.10.86.48:3000/previewdocument?subject=" + data[2], "_blank");
})
}
componentWillUnmount = () => {
this.$el.DataTable.destroy(true);
}
render() {
return (
<div>
<table className="display" width="100%" ref={el => this.el = el}></table>
</div>
)
}
}
\ No newline at end of file
......@@ -49,6 +49,18 @@ export class DataTableHome extends Component {
orderable: false,
targets: 5
},
{
orderable: false,
targets: 6,
},
{
visible: false,
orderable: false,
targets: 7,
render: function (data, type, row) {
return "<div>" + data + "</div>";
}
}
],
order: [[ 1, "asc" ]],
lengthMenu: [[25, 50, 75, 100], [25, 50, 75, 100]]
......
......@@ -31,7 +31,7 @@ export class DataTableMyDocument extends Component {
orderable: false,
targets: 1,
render: function (data, type, row) {
return "<a class='text-decoration-none' href='#'>" + data + "</a>";
return "<a id='revision' class='text-decoration-none' href='#'>" + data + "</a>";
}
},
{
......@@ -51,10 +51,18 @@ export class DataTableMyDocument extends Component {
targets: 5
},
{
visible: false,
orderable: false,
targets: 6,
render: function (data, type, row) {
return "&nbsp;&nbsp;<svg style='width:24px;height:24px' viewBox='0 0 24 24'><path fill='currentColor' d='M9,3V4H4V6H5V19A2,2 0 0,0 7,21H17A2,2 0 0,0 19,19V6H20V4H15V3H9M7,6H17V19H7V6M9,8V17H11V8H9M13,8V17H15V8H13Z' /></svg>";
return "<div>" + data + "</div>";
}
},
{
orderable: false,
targets: 7,
render: function (data, type, row) {
return "&nbsp;&nbsp;<a id='withdraw' class='text-decoration-none text-dark' href='#'><svg style='width:24px;height:24px' viewBox='0 0 24 24'><path fill='currentColor' d='M9,3V4H4V6H5V19A2,2 0 0,0 7,21H17A2,2 0 0,0 19,19V6H20V4H15V3H9M7,6H17V19H7V6M9,8V17H11V8H9M13,8V17H15V8H13Z' /></svg></a>";
}
}
],
......@@ -66,12 +74,12 @@ export class DataTableMyDocument extends Component {
cell.innerHTML = i + 1;
});
}).draw();
table.on("click", "a", function (e) {
table.on("click", "a#revision", function (e) {
e.preventDefault();
let data = table.row($(this).parents("tr")).data();
window.open("http://10.10.86.48:3000/formrevision?subject=" + data[2], "_self");
})
table.on("click", "svg", function (e) {
table.on("click", "a#withdraw", function (e) {
e.preventDefault();
let data = table.row($(this).parents("tr")).data();
var parseString = require('xml2js').parseString;
......
......@@ -49,6 +49,14 @@ export class DataTablePublishDocument extends Component {
orderable: false,
targets: 5
},
{
visible: false,
orderable: false,
targets: 6,
render: function (data, type, row) {
return "<div>" + data + "</div>";
}
}
],
order: [[1, "asc"]],
lengthMenu: [[25, 50, 75, 100], [25, 50, 75, 100]]
......
......@@ -39,8 +39,57 @@ body {
background: rgb(50, 50, 50);
width: 100%;
}
.background-grey2 {
background: rgb(85, 85, 85);
width: 100%;
}
.scrolling-wrapper {
overflow-x: scroll;
overflow-y: hidden;
white-space: nowrap;
}
.headerPreview {
width: 21cm;
margin: 0 auto;
margin-bottom: 0.5cm;
text-align: right;
}
.A4 {
background: white;
width: 21cm;
height: 29.7cm;
display: block;
margin: 0 auto;
padding: 50px 70px;
margin-bottom: 0.5cm;
/* box-shadow: 0 0 0.5cm rgba(0, 0, 0, 0.5); */
/* overflow-y: scroll; */
box-sizing: border-box;
font-size: 12pt;
}
@media print {
.page-break {
display: block;
page-break-before: always;
}
}
@media print {
body {
margin: 0;
padding: 0;
}
.A4 {
box-shadow: none;
margin: 0;
width: auto;
height: auto;
}
.noprint {
display: none;
}
.enable-print {
display: block;
}
}
\ No newline at end of file
......@@ -25,6 +25,7 @@ class FormApprover extends Component {
labelChangePage: ["< Back", "Next >"],
page: [true, false, false, false, false],
validSubmitReject: false,
validSubmitApprove: true,
validPage: [true, true, true],
dataAdditionalApprover: [],
optionAdditionalApprover: [],
......@@ -39,6 +40,8 @@ class FormApprover extends Component {
isTableReferenceDraw: false,
dataRevisionHistory: [],
dataAuditTrail: [],
dataComplianceOfficer: [],
dataManagementRepresentative: [],
headerContent: "Form Approver Document",
remark: "",
doc_id: "",
......@@ -98,9 +101,10 @@ class FormApprover extends Component {
let dataRevision = responseDataRevision.data.revisionCollection.revision;
// Check is user valid to open the document
if (
(dataRevision[dataRevision.length - 1].status == "Waiting for Approval - " + JSON.parse(localStorage.getItem("dataLogin")).user_name[0] && JSON.parse(localStorage.getItem('dataLogin')).user_role[0].includes("Approver") && JSON.parse(localStorage.getItem("dataLDAP"))["Login Name"] == JSON.parse(approver).LoginName) ||
(dataRevision[dataRevision.length - 1].status == "Waiting for Approval - Compliance Officer" && JSON.parse(localStorage.getItem('dataLogin')).user_role[0].includes("Compliance Officer")) ||
(dataRevision[dataRevision.length - 1].status == "Waiting for Approval - Manager Representative" && JSON.parse(localStorage.getItem('dataLogin')).user_role[0].includes("Manager Representative")) ||
JSON.parse(localStorage.getItem('dataLogin')).user_role[0].includes("Approver") ||
(dataRevision[dataRevision.length - 1].status == "Waiting for Approval - " + JSON.parse(localStorage.getItem("dataLogin")).user_name[0] && JSON.parse(localStorage.getItem('dataLogin')).user_role[0].includes("Approver")) ||
(dataRevision[dataRevision.length - 1].status == "Waiting for Approval - " + JSON.parse(localStorage.getItem("dataLogin")).user_name[0] && JSON.parse(localStorage.getItem('dataLogin')).user_role[0].includes("Compliance Officer")) ||
(dataRevision[dataRevision.length - 1].status == "Waiting for Approval - Management Representative" && JSON.parse(localStorage.getItem('dataLogin')).user_role[0].includes("Management Representative")) ||
(dataRevision[dataRevision.length - 1].status == "Waiting for Additional Approver" && JSON.parse(localStorage.getItem('dataLogin')).user_role[0].includes("Compliance Officer") ||
(dataRevision[dataRevision.length - 1].status.includes(JSON.parse(localStorage.getItem('dataLogin')).user_name[0])) && JSON.parse(localStorage.getItem('dataLogin')).user_role[0].includes("Additional Approver"))
) {
......@@ -119,6 +123,21 @@ class FormApprover extends Component {
}
this.state.dataRevisionHistory.push(dataRevisionTable);
}
let response = await axios.get(process.env.REACT_APP_MAIN_APIURL + '/DocumentManagement/user', { headers: { 'accept': 'application/xml' } })
let data;
parseString(response.data, function (err, result) {
data = result.user_dataCollection.user_data;
})
if (data != undefined) {
for (let i = 0; i < data.length; i++) {
if (data[i].user_role[0].includes("Compliance Officer")) {
this.state.dataComplianceOfficer.push(data[i]);
}
if (data[i].user_role[0].includes("Compliance Officer")) {
this.state.dataManagementRepresentative.push(data[i]);
}
}
}
let responseDataAuditTrail = await axios.get(process.env.REACT_APP_MAIN_APIURL + '/DocumentManagement/trailkey/' + doc_id, { headers: { 'Content-Type': 'application/xml' } })
let dataAuditTrail = responseDataAuditTrail.data.trailCollection.trail;
for (let i = 0; i < dataAuditTrail.length; i++) {
......@@ -564,7 +583,7 @@ class FormApprover extends Component {
let isAdded = window.confirm("Are you sure want to submit additional approver?");
if (isAdded) {
try {
await this.setState({ submitForm: true });
await this.setState({ submitForm: true, validSubmitApprover: false});
var js2xmlparser = require('js2xmlparser');
var parseString = require('xml2js').parseString;
let responseDataRevision = await axios.get(process.env.REACT_APP_MAIN_APIURL + '/DocumentManagement/revisionkey/' + this.state.doc_id, { headers: { 'Content-Type': 'application/xml' } })
......@@ -634,7 +653,7 @@ class FormApprover extends Component {
alert("Additional approver has been successfully added");
this.props.history.push("/yourdocument");
} catch (err) {
await this.setState({ submitForm: false });
await this.setState({ submitForm: false, validSubmitApprover: true });
alert(err + "");
}
}
......@@ -718,7 +737,7 @@ class FormApprover extends Component {
let isApprove = window.confirm("Are you sure want to approve document " + this.state.subject + "?");
if (isApprove) {
try {
await this.setState({ submitForm: true });
await this.setState({ submitForm: true, validSubmitApprove: false });
var js2xmlparser = require('js2xmlparser');
var parseString = require('xml2js').parseString;
let responseDataRevision = await axios.get(process.env.REACT_APP_MAIN_APIURL + '/DocumentManagement/revisionkey/' + this.state.doc_id, { headers: { 'Content-Type': 'application/xml' } })
......@@ -737,8 +756,8 @@ class FormApprover extends Component {
<p>Admin</p><br /> \
<p><i>Ini adalah email otomatis, harap jangan me-reply ke alamat email ini</i></p>";
usr = "Approver";
tracking = "Waiting for Approval - Compliance Officer";
} else if (dataRevision[i].status == "Waiting for Approval - Compliance Officer") {
tracking = "Waiting for Approval - " + this.state.dataComplianceOfficer[0].user_name[0];
} else if (dataRevision[i].status == "Waiting for Approval - " + this.state.dataComplianceOfficer[0].user_name[0]) {
subject = "Approval Review dan Approval Dokumen " + this.state.businessUnit + "-" + this.state.documentType + "-" + this.state.revisionCode + "-" + this.state.subject;
emailCc = "";
emailSend = this.state.creator_email;
......@@ -749,8 +768,8 @@ class FormApprover extends Component {
<p>Admin</p><br /> \
<p><i>Ini adalah email otomatis, harap jangan me-reply ke alamat email ini</i></p>";
usr = "Compliance Officer";
tracking = "Waiting for Approval - Manager Representative";
} else if (dataRevision[i].status == "Waiting for Approval - Manager Representative") {
tracking = "Waiting for Approval - Management Representative";
} else if (dataRevision[i].status == "Waiting for Approval - Management Representative") {
subject = "Approval Review dan Approval Dokumen " + this.state.businessUnit + "-" + this.state.documentType + "-" + this.state.revisionCode + "-" + this.state.subject;
emailCc = "";
emailSend = this.state.creator_email;
......@@ -760,7 +779,7 @@ class FormApprover extends Component {
<p>Regards, \
<p>Admin</p><br /> \
<p><i>Ini adalah email otomatis, harap jangan me-reply ke alamat email ini</i></p>";
usr = "Manager Representative";
usr = "Management Representative";
if (this.state.documentType == "WI") {
tracking = "Waiting for Publish";
} else {
......@@ -873,7 +892,7 @@ class FormApprover extends Component {
alert("Document has been successfully approved");
this.props.history.push("/yourdocument");
} catch (err) {
await this.setState({ submitForm: false });
await this.setState({ submitForm: false, validSubmitApprove: true });
alert(err + "");
}
}
......@@ -896,7 +915,7 @@ class FormApprover extends Component {
}
handleSubmitReject = async () => {
try {
await this.setState({ submitForm: true });
await this.setState({ submitForm: true, validSubmitReject: false });
var js2xmlparser = require('js2xmlparser');
var parseString = require('xml2js').parseString;
let responseDataRevision = await axios.get(process.env.REACT_APP_MAIN_APIURL + '/DocumentManagement/revisionkey/' + this.state.doc_id, { headers: { 'Content-Type': 'application/xml' } })
......@@ -913,7 +932,7 @@ class FormApprover extends Component {
<p>Admin</p><br /> \
<p><i>Ini adalah email otomatis, harap jangan me-reply ke alamat email ini</i></p>";
tracking = "Document Rejected By " + JSON.parse(localStorage.getItem("dataLogin")).user_name[0];
} else if (dataRevision[dataRevision.length - 1].status == "Waiting for Approval - Compliance Officer") {
} else if (dataRevision[dataRevision.length - 1].status == "Waiting for Approval - " + this.state.dataComplianceOfficer[0].user_name[0]) {
subject = "Dokumen " + this.state.businessUnit + "-" + this.state.documentType + "-" + this.state.revisionCode + "-" + this.state.subject + " Direject dan Perlu Direvisi";
emailCc = "";
emailSend = this.state.creator_email;
......@@ -924,7 +943,7 @@ class FormApprover extends Component {
<p>Admin</p><br /> \
<p><i>Ini adalah email otomatis, harap jangan me-reply ke alamat email ini</i></p>";
tracking = "Document Rejected By " + JSON.parse(localStorage.getItem("dataLogin")).user_name[0];
} else if (dataRevision[dataRevision.length - 1].status == "Waiting for Approval - Manager Representative") {
} else if (dataRevision[dataRevision.length - 1].status == "Waiting for Approval - Management Representative") {
subject = "Dokumen " + this.state.businessUnit + "-" + this.state.documentType + "-" + this.state.revisionCode + "-" + this.state.subject + " Direject dan Perlu Direvisi";
emailCc = "";
emailSend = this.state.creator_email;
......@@ -1013,7 +1032,7 @@ class FormApprover extends Component {
alert("Document has been successfully rejected");
this.props.history.push("/yourdocument");
} catch (err) {
await this.setState({ submitForm: false });
await this.setState({ submitForm: false, validSubmitReject: true });
alert(err + "");
}
}
......@@ -1433,7 +1452,8 @@ class FormApprover extends Component {
}
handleSaveChanges = async () => {
try {
await this.setState({ submitForm: true });
this.state.validPage[2] = false;
await this.setState({ submitForm: true, validPage: this.state.validPage })
var js2xmlparser = require('js2xmlparser');
var parseString = require('xml2js').parseString;
let responseDataRevision = await axios.get(process.env.REACT_APP_MAIN_APIURL + '/DocumentManagement/revisionkey/' + this.state.doc_id, { headers: { 'Content-Type': 'application/xml' } })
......@@ -1452,8 +1472,8 @@ class FormApprover extends Component {
<p>Admin</p><br /> \
<p><i>Ini adalah email otomatis, harap jangan me-reply ke alamat email ini</i></p>";
usr = "Approver";
tracking = "Waiting for Approval - Compliance Officer";
} else if (dataRevision[i].status == "Waiting for Approval - Compliance Officer") {
tracking = "Waiting for Approval - " + this.state.dataComplianceOfficer[0].user_name[0];
} else if (dataRevision[i].status == "Waiting for Approval - " + this.state.dataComplianceOfficer[0].user_name[0]) {
subject = "Approval Review dan Approval Dokumen " + this.state.businessUnit + "-" + this.state.documentType + "-" + this.state.revisionCode + "-" + this.state.subject;
emailCc = "";
emailSend = this.state.creator_email;
......@@ -1464,8 +1484,8 @@ class FormApprover extends Component {
<p>Admin</p><br /> \
<p><i>Ini adalah email otomatis, harap jangan me-reply ke alamat email ini</i></p>";
usr = "Compliance Officer";
tracking = "Waiting for Approval - Manager Representative";
} else if (dataRevision[i].status == "Waiting for Approval - Manager Representative") {
tracking = "Waiting for Approval - Management Representative";
} else if (dataRevision[i].status == "Waiting for Approval - Management Representative") {
subject = "Approval Review dan Approval Dokumen " + this.state.businessUnit + "-" + this.state.documentType + "-" + this.state.revisionCode + "-" + this.state.subject;
emailCc = "";
emailSend = this.state.creator_email;
......@@ -1475,7 +1495,7 @@ class FormApprover extends Component {
<p>Regards, \
<p>Admin</p><br /> \
<p><i>Ini adalah email otomatis, harap jangan me-reply ke alamat email ini</i></p>";
usr = "Manager Representative";
usr = "Management Representative";
if (this.state.documentType == "WI") {
tracking = "Waiting for Publish";
} else {
......@@ -1660,7 +1680,8 @@ class FormApprover extends Component {
alert("Document has been successfully updated and approved");
this.props.history.push("/yourdocument");
} catch (error) {
await this.setState({ submitForm: false })
this.state.validPage[2] = true;
await this.setState({ submitForm: false, validPage: this.state.validPage })
alert(error + "");
}
}
......@@ -1711,7 +1732,7 @@ class FormApprover extends Component {
{({ getRootProps, getInputProps }) => (
<section>
<div {...getRootProps()} className="p-4 text-center" style={{ height: "250px", backgroundColor: "lightgrey", border: "1px solid black", borderRadius: "20px", borderStyle: "dashed" }}>
<input {...getInputProps()} />
<input {...getInputProps()} accept=".doc,.docx,.xls,.xlsx" />
{
this.state.contentForm.title == "" &&
<div>
......@@ -1784,7 +1805,7 @@ class FormApprover extends Component {
plugins: [
'advlist autolink table lists link image charmap print preview anchor',
'searchreplace wordcount visualblocks code fullscreen',
'insertdatetime media table contextmenu paste responsivefilemanager code'
'insertdatetime media table contextmenu paste code'
],
toolbar:
'undo redo | image code | table tabledelete | \
......@@ -1792,13 +1813,8 @@ class FormApprover extends Component {
tableinsertrowbefore tableinsertrowafter tabledeleterow | \
tableinsertcolbefore tableinsertcolafter tabledeletecol | \
formatselect | bold italic underline strikethrough | \
responsivefilemanager | link unlink | \
alignleft aligncenter alignright alignjustify | \
link unlink | alignleft aligncenter alignright alignjustify | \
bullist numlist outdent indent | removeformat | help',
image_advtab: true,
external_filemanager_path: '/filemanager/',
filemanager_title: 'Responsive Filemanager',
external_plugins: { 'responsivefilemanager': '/filemanager/plugin.min.js' },
content_css: '//www.tinymce.com/css/codepen.min.css',
file_picker_types: 'image',
file_picker_callback: function (callback, value, meta) {
......@@ -2115,7 +2131,7 @@ class FormApprover extends Component {
}
{
this.state.documentType == "FORM" &&
<a href={this.state.contentForm.file} download={this.state.contentForm.title}>{this.state.contentForm.title}</a>
<a className="text-decoration-none" href={this.state.contentForm.file} download={this.state.contentForm.title}>{this.state.contentForm.title}</a>
}
</label>
</div>
......@@ -2225,7 +2241,7 @@ class FormApprover extends Component {
</div>
<div className="col-xl-9 col-lg-9 col-md-9 col-sm-9 text-right">
<Button color="primary" className="button-2" onClick={() => this.handleClickPreview()}>Preview</Button>&nbsp;
<Button color="success" className="button-2" onClick={() => this.handleClickApprove()}>Approve&nbsp;
<Button color="success" className="button-2" onClick={() => this.handleClickApprove()} disabled={!this.state.validSubmitApprove}>Approve&nbsp;
{
this.state.submitForm &&
<img src="data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQJCgAAACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkECQoAAAAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkECQoAAAAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkECQoAAAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQJCgAAACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQJCgAAACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAkKAAAALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==" />
......@@ -2339,7 +2355,7 @@ class FormApprover extends Component {
}
{
this.state.documentType == "FORM" &&
<a className="text-decoration-none" href={"http://10.10.86.48:3000/previewdocumentform?subject=" + this.state.subject} target="_blank">{this.state.contentForm.title}</a>
<a className="text-decoration-none" href={this.state.contentForm.file} download={this.state.contentForm.title}>{this.state.contentForm.title}</a>
}
</label>
</div>
......@@ -2512,7 +2528,7 @@ class FormApprover extends Component {
}
{
this.state.documentType == "FORM" &&
<a className="text-decoration-none" href={"http://10.10.86.48:3000/previewdocumentform?subject=" + this.state.subject} target="_blank">{this.state.contentForm.title}</a>
<a className="text-decoration-none" href={this.state.contentForm.file} download={this.state.contentForm.title}>{this.state.contentForm.title}</a>
}
</label>
</div>
......
......@@ -15,7 +15,7 @@ class FormCreate extends Component {
this.state = {
labelChangePage: ["< Back", "Next >"],
page: [true, false, false, false, false],
validPage: [false, false, false],
validPage: [false, false, false, true],
optionScopes: ["All Department"],
pageScope: false,
pageReference: false,
......@@ -59,7 +59,7 @@ class FormCreate extends Component {
datarow.push(dataDepartmentList[i].DepartmentCode[0] + "-" + dataDepartmentList[i].Department[0]);
this.state.dataScopes.push(datarow);
}
let responseReferences = await axios.get(process.env.REACT_APP_MAIN_APIURL + '/DocumentManagement/home', { headers: { 'accept': 'application/xml' } });
let responseReferences = await axios.get(process.env.REACT_APP_MAIN_APIURL + '/DocumentManagement/home', { headers: { 'accept': 'application/xml' } })
let dataReferences;
parseString(responseReferences.data, function (err, result) {
dataReferences = result.documentCollection.document;
......@@ -67,11 +67,30 @@ class FormCreate extends Component {
if (dataReferences != undefined) {
for (let i = 0; i < dataReferences.length; i++) {
let datarow = [];
let content = "";
let apiContent = "contentkey";
if (dataReferences[i].doc_code[0].includes("FORM")) {
apiContent = "contentkey2";
}
let responseDataContent = await axios.get(process.env.REACT_APP_MAIN_APIURL + '/DocumentManagement/' + apiContent + '/' + dataReferences[i].doc_id[0], { headers: { 'accept': 'application/xml' } })
let dataContent;
parseString(responseDataContent.data, function (err, result) {
dataContent = result.contentCollection.content;
})
if (dataContent != undefined && dataReferences[i].doc_type[0] != "FORM") {
for (let j = 0; j < dataContent.length; j++) {
content += "<p>" + dataContent[j].cont_title[0] + "</p>" + dataContent[j].cont[0];
}
}
if (dataContent != undefined && dataReferences[i].doc_type[0] == "FORM") {
content = "<p>" + dataContent[0].cont_title[0] + "</p>";
}
datarow.push(dataReferences[i].doc_code[0]);
datarow.push(dataReferences[i].subject[0]);
datarow.push(dataReferences[i].doc_type[0]);
datarow.push(dataReferences[i].usr_dpt[0]);
datarow.push(dataReferences[i].subject[0]);
datarow.push(content);
this.state.dataReferences.push(datarow);
}
}
......@@ -177,6 +196,14 @@ class FormCreate extends Component {
render: function (data, type, row) {
return "<input type='checkbox' name='listReference[]' value='" + data + "'/>";
}
},
{
visible: false,
orderable: false,
targets: 5,
render: function (data, type, row) {
return "<div>" + data + "</div>";
}
}
]
})
......@@ -706,27 +733,28 @@ class FormCreate extends Component {
}
handleSubmitForm = async () => {
try {
await this.setState({ submitForm: true })
this.state.validPage[3] = false;
await this.setState({ submitForm: true, validPage: this.state.validPage });
var js2xmlparser = require('js2xmlparser');
var parseString = require('xml2js').parseString;
//Send Email Notification
let postdataEmail = {
"subject": "Permintaan Review dan Approval Dokumen",
"emailcc": "andrewahyudi1899@gmail.com",// JSON.parse(localStorage.getItem("dataLogin")).email[0]
"emailsend": "672016038@student.uksw.edu",// dataApprover[0].EMail[0]
"message": "<p>Dengan hormat,</p> \
<p>Terdapat pengajuan dokumen dengan No." + this.state.businessUnit + "-" + this.state.documentType + "-" + this.state.revisionCode + " " + this.state.subject + " yang diajukan oleh " + JSON.parse(localStorage.getItem("user"))["Full Name"] + ".<br /> Untuk review dan approval silahkan klik link berikut ini <a href='http://10.10.86.48:3000' target='_blank'>Link Dokumen</a></p> \
<p>Terimakasih</p> \
<p>Regards, \
<p>Admin</p><br /> \
<p><i>Ini adalah email otomatis, harap jangan me-reply ke alamat email ini</i></p>"
}
//process.env.REACT_APP_MAIN_APIURL
let responseSendEmail = await fetch('http://localhost:9000/email', {
headers: { 'Content-Type': 'application/json' },
method: 'POST',
body: JSON.stringify(postdataEmail)
})
// //Send Email Notification
// let postdataEmail = {
// "subject": "Permintaan Review dan Approval Dokumen",
// "emailcc": "freezingfrost519@gmail.com",//JSON.parse(localStorage.getItem("dataLogin")).email[0]
// "emailsend": "fajar.ayu.int@visionet.co.id",//dataApprover[0].EMail[0]
// "message": "<p>Dengan hormat,</p> \
// <p>Terdapat pengajuan dokumen dengan No." + this.state.businessUnit + "-" + this.state.documentType + "-" + this.state.revisionCode + " " + this.state.subject + " yang diajukan oleh " + JSON.parse(localStorage.getItem("user"))["Full Name"] + ".<br /> Untuk review dan approval silahkan klik link berikut ini <a href='http://10.10.86.48:3000' target='_blank'>Link Dokumen</a></p> \
// <p>Terimakasih</p> \
// <p>Regards, \
// <p>Admin</p><br /> \
// <p><i>Ini adalah email otomatis, harap jangan me-reply ke alamat email ini</i></p>"
// }
// //process.env.REACT_APP_MAIN_APIURL
// let responseSendEmail = await fetch(process.env.REACT_APP_MAIN_APIURL + '/email', {
// headers: { 'Content-Type': 'application/json' },
// method: 'POST',
// body: JSON.stringify(postdataEmail)
// })
let user_id, doc_id;
user_id = JSON.parse(localStorage.getItem("dataLogin")).user_id[0];
//Get data manager creator
......@@ -865,8 +893,8 @@ class FormCreate extends Component {
// //Send Email Notification
// let postdataEmail = {
// "subject": "Permintaan Review dan Approval Dokumen",
// "emailcc": "andrewahyudi1899@gmail.com",// JSON.parse(localStorage.getItem("dataLogin")).email[0]
// "emailsend": "672016038@student.uksw.edu",// dataApprover[0].EMail[0]
// "emailcc": "freezingfrost519@gmail.com",//JSON.parse(localStorage.getItem("dataLogin")).email[0]
// "emailsend": "fajar.ayu.int@visionet.co.id",//dataApprover[0].EMail[0]
// "message": "<p>Dengan hormat,</p> \
// <p>Terdapat pengajuan dokumen dengan No." + this.state.businessUnit + "-" + this.state.documentType + "-" + this.state.revisionCode + " " + this.state.subject + " yang diajukan oleh " + JSON.parse(localStorage.getItem("user"))["Full Name"] + ".<br /> Untuk review dan approval silahkan klik link berikut ini <a href='http://10.10.86.48:3000' target='_blank'>Link Dokumen</a></p> \
// <p>Terimakasih</p> \
......@@ -883,7 +911,8 @@ class FormCreate extends Component {
alert("Document has been successfully submited");
this.props.history.push("/yourdocument");
} catch (error) {
await this.setState({ submitForm: false })
this.state.validPage[3] = true;
await this.setState({ submitForm: false, validPage: this.state.validPage });
alert(error + "");
}
}
......@@ -900,7 +929,7 @@ class FormCreate extends Component {
{({ getRootProps, getInputProps }) => (
<section>
<div {...getRootProps()} className="p-4 text-center" style={{ height: "250px", backgroundColor: "lightgrey", border: "1px solid black", borderRadius: "20px", borderStyle: "dashed" }}>
<input {...getInputProps()} />
<input {...getInputProps()} accept=".doc,.docx,.xls,.xlsx"/>
{
this.state.contentForm.title == "" &&
<div>
......@@ -1375,7 +1404,7 @@ class FormCreate extends Component {
&nbsp;{this.state.labelChangePage[0]}&nbsp;</Button>
</div>
<div className="col-xl-9 col-lg-9 col-md-9 col-sm-9 text-right">
<Button color="primary" onClick={() => this.handleSubmitForm()}>&nbsp;&nbsp;Submit&nbsp;
<Button color="primary" onClick={() => this.handleSubmitForm()} disabled={!this.state.validPage[3]}>&nbsp;&nbsp;Submit&nbsp;
{
this.state.submitForm &&
<img src="data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQJCgAAACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkECQoAAAAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkECQoAAAAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkECQoAAAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQJCgAAACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQJCgAAACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAkKAAAALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==" />
......
......@@ -11,7 +11,7 @@ class FormCreateUpdateRole extends Component {
this.state = {
isFetched: false,
isEdit: false,
optionRoles: ["Admin", "Approver", "Additional Approver", "Compliance Officer", "Creator", "Manager Representative", "Viewer"],
optionRoles: ["Admin", "Approver", "Additional Approver", "Compliance Officer", "Creator", "Management Representative", "Viewer"],
validFormUser: false,
userid: "",
username: "",
......@@ -127,7 +127,7 @@ class FormCreateUpdateRole extends Component {
var parseString = require('xml2js').parseString;
if (this.state.isEdit == true) {
try {
await this.setState({ submitForm: true })
await this.setState({ submitForm: true, validFormUser: false });
let userRole1 = "";
for (let i = 0; i < this.state.roles.length; i++) {
if (i > 0) {
......@@ -135,6 +135,22 @@ class FormCreateUpdateRole extends Component {
}
userRole1 = userRole1 + this.state.roles[i];
}
let isValidComplianceOfficer = true;
if (userRole1.includes("Compliance Officer")) {
let response = await axios.get(process.env.REACT_APP_MAIN_APIURL + '/DocumentManagement/user', { headers: { 'accept': 'application/xml' } })
let data;
parseString(response.data, function (err, result) {
data = result.user_dataCollection.user_data;
})
if (data != undefined) {
for (let i = 0; i < data.length; i++) {
if (data[i].user_role[0].includes("Compliance Officer")) {
isValidComplianceOfficer = false;
}
}
}
}
if (isValidComplianceOfficer) {
let dataEdit = {
"user_name": this.state.username,
"user_dpt": this.state.department,
......@@ -156,13 +172,17 @@ class FormCreateUpdateRole extends Component {
alert("User role has been successfully edited");
this.props.history.push("/manageuser")
})
} else {
await this.setState({ submitForm: false });
alert("A user with compliance officer roles already exist");
}
} catch (error) {
this.setState({ submitForm: false })
this.setState({ submitForm: false, validFormUser: true })
alert(error + "");
}
} else {
try {
await this.setState({ submitForm: true })
await this.setState({ submitForm: true, validFormUser: false });
let responseCheckDataUser = await axios.get(process.env.REACT_APP_MAIN_APIURL + '/DocumentManagement/userkey/' + this.state.email, { headers: { 'accept': 'application/xml' } })
let checkDataUser;
parseString(responseCheckDataUser.data, function (err, result) {
......@@ -200,35 +220,19 @@ class FormCreateUpdateRole extends Component {
this.props.history.push("/manageuser")
})
.catch(err => {
this.setState({ submitForm: false })
this.setState({ submitForm: false, validFormUser: true })
alert(err + "");
})
} else {
this.setState({ submitForm: false })
this.setState({ submitForm: false, validFormUser: true })
alert("Email is invalid!")
}
// let uri_email = encodeURIComponent(this.state.email);
// let API_token = "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6IlpqUm1ZVE13TlRKak9XVTVNbUl6TWpnek5ESTNZMkl5TW1JeVkyRXpNamRoWmpWaU1qYzBaZz09In0.eyJhdWQiOiJodHRwOlwvXC9vcmcud3NvMi5hcGltZ3RcL2dhdGV3YXkiLCJzdWIiOiJhZG1pbkBjYXJib24uc3VwZXIiLCJhcHBsaWNhdGlvbiI6eyJvd25lciI6ImFkbWluIiwidGllciI6IjEwUGVyTWluIiwibmFtZSI6ImFwcGwiLCJpZCI6MTMsInV1aWQiOm51bGx9LCJzY29wZSI6ImFtX2FwcGxpY2F0aW9uX3Njb3BlIGRlZmF1bHQiLCJpc3MiOiJodHRwczpcL1wvMTAuMTAuODguMTI6OTQ0M1wvb2F1dGgyXC90b2tlbiIsInRpZXJJbmZvIjp7IlVubGltaXRlZCI6eyJzdG9wT25RdW90YVJlYWNoIjp0cnVlLCJzcGlrZUFycmVzdExpbWl0IjowLCJzcGlrZUFycmVzdFVuaXQiOm51bGx9fSwia2V5dHlwZSI6IlBST0RVQ1RJT04iLCJzdWJzY3JpYmVkQVBJcyI6W3sic3Vic2NyaWJlclRlbmFudERvbWFpbiI6ImNhcmJvbi5zdXBlciIsIm5hbWUiOiJlbXBsb3llZV9wcm9maWxlIiwiY29udGV4dCI6IlwvZW1weWxcLzEuMC4wIiwicHVibGlzaGVyIjoiYWRtaW4iLCJ2ZXJzaW9uIjoiMS4wLjAiLCJzdWJzY3JpcHRpb25UaWVyIjoiVW5saW1pdGVkIn1dLCJjb25zdW1lcktleSI6ImlqMHNnaWVLVVprdFBTbElkcl9mU2tFanI1a2EiLCJleHAiOjE2MzUyOTk3NDYsImlhdCI6MTU4MDk3ODc0NiwianRpIjoiNDFlM2FlMGYtMmYzZC00NWIzLTllN2YtMjI5YjRiNTkwOWE1In0.ZZ1_-3Z2bnsa5ar7b-QnuNGy95Olh5rQSMifJCTnW09T9omU1Zzql1Wllaey7veC9xy6yi-WxPpPeRee_-UtZdloGE9PCd99rMdNLsNuXWxmN0MvyXjMYqUvOYe9lbXzirE99yQhywa7LzVxpJVccGl42a5HhJ-BHF85IXiSSKK_-ykssK2WNfQhyUySJoz-lUj44-Eur2svbEWTVX6sOaejdwdv3xBFya8WoAAXPaelaE0Fm2SONQdh4DZZx0OdJS794fcYGNKshdTJiAG7Kau1jQMjy6-Pa3fv8wpFxV7GQuQy24TeTBo3jNxX2Fu5b2-P_YFIgA1KuqSM9Fnp2Q";
// fetch('http://10.10.88.12:8280/empyl/1.0.0/employee/' + uri_email, {
// headers: { 'Authorization': API_token }
// })
// .then(response => response.text())
// .then(text => {
// let dataEmployee;
// parseString(text, function (err, result) {
// dataEmployee = result.VU_EmployeeMACCollection.VU_EmployeeMAC;
// })
// console.log("dataEmployee", dataEmployee)
// })
// .catch(err => {
// alert(err + "");
// })
} else {
this.setState({ submitForm: false })
await this.setState({ submitForm: false, validFormUser: true })
alert("Email is already exist");
}
} catch (error) {
this.setState({ submitForm: false })
await this.setState({ submitForm: false, validFormUser: true })
alert(error + "");
}
}
......
......@@ -17,6 +17,7 @@ class FormPublish extends Component {
dataRevisionHistory: [],
dataAuditTrail: [],
statusPublish: false,
validSubmitPublish: true,
remark: "",
doc_id: "",
user_id: "",
......@@ -187,7 +188,7 @@ class FormPublish extends Component {
let isPublish = window.confirm("Are you sure want to " + labelPublish + " document " + this.state.subject + "?");
if (isPublish) {
try {
await this.setState({ submitForm: true });
await this.setState({ submitForm: true, validSubmitPublish: false });
var js2xmlparser = require('js2xmlparser');
var parseString = require('xml2js').parseString;
if (actionPublish == "Publish Document") {
......@@ -322,7 +323,7 @@ class FormPublish extends Component {
alert("Document has been successfully " + labelPublish);
this.props.history.push("/yourdocument");
} catch (err) {
await this.setState({ submitForm: false });
await this.setState({ submitForm: false, validSubmitPublish: true });
alert(err + "");
}
}
......@@ -463,7 +464,7 @@ class FormPublish extends Component {
</div>
<div className="col-xl-9 col-lg-9 col-md-9 col-sm-9 text-right">
<Button color="primary" className="button-2" onClick={() => this.handleClickPreview()}>Preview</Button>&nbsp;
<Button color="primary" className="button-2" onClick={() => this.handleClickPublish()}>{this.handleShowLabelPublish()}&nbsp;
<Button color="primary" className="button-2" onClick={() => this.handleClickPublish()} disabled={!this.state.validSubmitPublish}>{this.handleShowLabelPublish()}&nbsp;
{
this.state.submitForm &&
<img src="data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQJCgAAACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkECQoAAAAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkECQoAAAAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkECQoAAAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQJCgAAACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQJCgAAACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAkKAAAALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==" />
......@@ -561,7 +562,7 @@ class FormPublish extends Component {
}
{
this.state.documentType == "FORM" &&
<a href={this.state.contentForm.file} download={this.state.contentForm.title}>{this.state.contentForm.title}</a>
<a className="text-decoration-none" href={this.state.contentForm.file} download={this.state.contentForm.title}>{this.state.contentForm.title}</a>
}
</label>
</div>
......
......@@ -890,7 +890,8 @@ class FormRevision extends Component {
}
handleSaveChanges = async () => {
try {
await this.setState({ submitForm: true });
this.state.validPage[2] = false;
await this.setState({ submitForm: true, validPage: this.state.validPage });
var js2xmlparser = require('js2xmlparser');
var parseString = require('xml2js').parseString;
let responseDataRevision = await axios.get(process.env.REACT_APP_MAIN_APIURL + '/DocumentManagement/revisionkey/' + this.state.doc_id, { headers: { 'Content-Type': 'application/xml' } })
......@@ -1089,7 +1090,8 @@ class FormRevision extends Component {
alert("Document has been successfully updated");
this.props.history.push("/yourdocument");
} catch (error) {
await this.setState({ submitForm: false })
this.state.validPage[2] = true;
await this.setState({ submitForm: false, validPage: this.state.validPage })
alert(error + "");
}
}
......@@ -1140,7 +1142,7 @@ class FormRevision extends Component {
{({ getRootProps, getInputProps }) => (
<section>
<div {...getRootProps()} className="p-4 text-center" style={{ height: "250px", backgroundColor: "lightgrey", border: "1px solid black", borderRadius: "20px", borderStyle: "dashed" }}>
<input {...getInputProps()} />
<input {...getInputProps()} accept=".doc,.docx,.xls,.xlsx"/>
{
this.state.contentForm.title == "" &&
<div>
......@@ -1213,7 +1215,7 @@ class FormRevision extends Component {
plugins: [
'advlist autolink table lists link image charmap print preview anchor',
'searchreplace wordcount visualblocks code fullscreen',
'insertdatetime media table contextmenu paste responsivefilemanager code'
'insertdatetime media table contextmenu paste code'
],
toolbar:
'undo redo | image code | table tabledelete | \
......@@ -1221,13 +1223,8 @@ class FormRevision extends Component {
tableinsertrowbefore tableinsertrowafter tabledeleterow | \
tableinsertcolbefore tableinsertcolafter tabledeletecol | \
formatselect | bold italic underline strikethrough | \
responsivefilemanager | link unlink | \
alignleft aligncenter alignright alignjustify | \
link unlink | alignleft aligncenter alignright alignjustify | \
bullist numlist outdent indent | removeformat | help',
image_advtab: true,
external_filemanager_path: '/filemanager/',
filemanager_title: 'Responsive Filemanager',
external_plugins: { 'responsivefilemanager': '/filemanager/plugin.min.js' },
content_css: '//www.tinymce.com/css/codepen.min.css',
file_picker_types: 'image',
file_picker_callback: function (callback, value, meta) {
......@@ -1556,7 +1553,7 @@ class FormRevision extends Component {
}
{
this.state.documentType == "FORM" &&
<a href={this.state.contentForm.file} download={this.state.contentForm.title}>{this.state.contentForm.title}</a>
<a className="text-decoration-none" href={this.state.contentForm.file} download={this.state.contentForm.title}>{this.state.contentForm.title}</a>
}
</label>
</div>
......
......@@ -17,7 +17,7 @@ class Home extends Component {
componentDidMount = async () => {
console.log(JSON.parse(localStorage.getItem("dataLogin")).email[0]);
try {
let response = await axios.get(process.env.REACT_APP_MAIN_APIURL + '/DocumentManagement/home', { headers: { 'accept': 'application/xml' } });
let response = await axios.get(process.env.REACT_APP_MAIN_APIURL + '/DocumentManagement/home', { headers: { 'accept': 'application/xml' } })
var parseString = require('xml2js').parseString;
let data;
parseString(response.data, function (err, result) {
......@@ -26,6 +26,24 @@ class Home extends Component {
if (data != undefined) {
for (let i = 0; i < data.length; i++) {
let datarow = [];
let content = "";
let apiContent = "contentkey";
if (data[i].doc_code[0].includes("FORM")) {
apiContent = "contentkey2";
}
let responseDataContent = await axios.get(process.env.REACT_APP_MAIN_APIURL + '/DocumentManagement/' + apiContent + '/' + data[i].doc_id[0], { headers: { 'accept': 'application/xml' } })
let dataContent;
parseString(responseDataContent.data, function (err, result) {
dataContent = result.contentCollection.content;
})
if (dataContent != undefined && data[i].doc_type[0] != "FORM") {
for (let j = 0; j < dataContent.length; j++) {
content += "<p>" + dataContent[j].cont_title[0] + "</p>" + dataContent[j].cont[0];
}
}
if (dataContent != undefined && data[i].doc_type[0] == "FORM") {
content = "<p>" + dataContent[0].cont_title[0] + "</p>";
}
datarow.push("");
datarow.push(data[i].doc_code[0]);
datarow.push(data[i].subject[0]);
......@@ -41,6 +59,7 @@ class Home extends Component {
}
datarow.push(new_effdate);
datarow.push(data[i].usr_dpt[0]);
datarow.push(content);
this.state.dataDocument.push(datarow);
}
}
......
......@@ -18,7 +18,7 @@ class ManageUser extends Component {
componentDidMount = async () => {
try {
var parseString = require('xml2js').parseString;
let response = await axios.get(process.env.REACT_APP_MAIN_APIURL + '/DocumentManagement/user', { headers: { 'accept': 'application/xml' } });
let response = await axios.get(process.env.REACT_APP_MAIN_APIURL + '/DocumentManagement/user', { headers: { 'accept': 'application/xml' } })
let data;
parseString(response.data, function (err, result) {
data = result.user_dataCollection.user_data;
......
......@@ -7,6 +7,10 @@ import * as html2canvas from 'html2canvas';
import * as jsPDF from 'jspdf';
import './DocumentManagement.css';
const $ = require('jquery');
var max_pages = 100;
var page_count = 0;
class PreviewDocument extends Component {
constructor(props) {
super(props)
......@@ -31,6 +35,27 @@ class PreviewDocument extends Component {
approvalDocument: [],
}
}
snipMe = () => {
page_count++;
if (page_count > max_pages) {
return;
}
var long = $(this)[0].scrollHeight - Math.ceil($(this).innerHeight());
var children = $(this).children().toArray();
var removed = [];
while (long > 0 && children.length > 0) {
var child = children.pop();
$(child).detach();
removed.unshift(child);
long = $(this)[0].scrollHeight - Math.ceil($(this).innerHeight());
}
if (removed.length > 0) {
var a4 = $('<div className="A4"></div>');
a4.append(removed);
$(this).after(a4);
this.snipMe.call(a4[0]);
}
}
componentDidMount = async () => {
try {
if (this.props.location.search != "") {
......@@ -98,9 +123,13 @@ class PreviewDocument extends Component {
this.state.contentForm.file = dataContent[0].cont[0];
this.setState({ contentForm: this.state.contentForm });
}
this.setState({ isFetched: true });
let t = this;
await this.setState({ isFetched: true });
// $('.A4').each(function() {
// t.snipMe.call(t);
// });
} else {
this.setState({ isFetched: true, isDocumentNotFound: true });
await this.setState({ isFetched: true, isDocumentNotFound: true });
}
} else {
this.setState({ isNotValidLocation: true });
......@@ -113,16 +142,37 @@ class PreviewDocument extends Component {
console.log(error + "");
}
}
handleDownloadPDF = () => {
const input = document.getElementById('printDocument');
let title = this.state.subject;
html2canvas(input)
.then((canvas) => {
let imageData = canvas.toDataURL('image/png');
handleDownloadPDF = async () => {
let pdf = new jsPDF();
pdf.addImage(imageData, 'JPEG', 0, 0);
pdf.save(title + ".pdf");
});
let title = this.state.subject;
// let printDocument = document.getElementById('printDocument');
// window.html2canvas = html2canvas;
// // pdf.html(printDocument, {
// // callback: function () {
// // pdf.save(title + ".pdf");
// // }
// // });
// let paper1 = document.getElementById('paper1');
// let paper2 = document.getElementById('paper2');
// let paper3 = document.getElementById('paper3');
// let paper4 = document.getElementById('paper4');
// let canvas1 = await html2canvas(paper1);
// let canvas2 = await html2canvas(paper2);
// let canvas3 = await html2canvas(paper3);
// let canvas4 = await html2canvas(paper4);
// let imagePaper1 = canvas1.toDataURL('image/png');
// let imagePaper2 = canvas2.toDataURL('image/png');
// let imagePaper3 = canvas3.toDataURL('image/png');
// let imagePaper4 = canvas4.toDataURL('image/png');
// pdf.addImage(imagePaper1, 'PNG', 0, 0);
// pdf.addPage();
// pdf.addImage(imagePaper2, 'PNG', 0, 0);
// pdf.addPage();
// pdf.addImage(imagePaper3, 'PNG', 0, 0);
// pdf.addPage();
// pdf.addImage(imagePaper4, 'PNG', 0, 0);
// pdf.save(title + ".pdf");
}
showApproval = (approval) => {
let approvalDocument;
......@@ -222,13 +272,158 @@ class PreviewDocument extends Component {
}
{
this.state.isFetched == true && this.state.isDocumentNotFound == false && this.state.fetchError == false &&
<div className="container">
<div className="row justify-content-center">
<div className="col-xl-10 col-lg-11 col-md-12 col-sm-12 text-right my-2">
// <div className="container">
// <div className="row justify-content-center">
// <div className="col-xl-10 col-lg-11 col-md-12 col-sm-12 text-right my-2">
// <Button color="primary" onClick={this.handleDownloadPDF}>Download</Button>
// </div>
// <div className="col-xl-10 col-lg-10 col-md-10 col-sm-10" id="printDocument">
// <div className="border p-5">
// <img src="logo-visionet.png" alt="visionet" width="210px" height="70px" />
// <h2 className="text-center">PT. VISIONET DATA INTERNASIONAL</h2><hr />
// {this.handleShowDocumentType()}<br /><br />
// <h2 className="text-center">{this.state.subject}</h2><br />
// <div className="form-group">
// <label className="col-xl-3 col-lg-3 col-md-3 col-sm-3 control-label">Code</label>
// <label className="col-xl-9 col-lg-9 col-md-9 col-sm-9 control-label">{": " + this.state.documentCode}</label>
// </div>
// <div className="form-group">
// <label className="col-xl-3 col-lg-3 col-md-3 col-sm-3 control-label">Revision Date</label>
// <label className="col-xl-9 col-lg-9 col-md-9 col-sm-9 control-label">{": " + this.state.revisionDate}</label>
// </div>
// <div className="form-group">
// <label className="col-xl-3 col-lg-3 col-md-3 col-sm-3 control-label">Effective Date</label>
// <label className="col-xl-9 col-lg-9 col-md-9 col-sm-9 control-label">{": " + this.state.effectiveDate}</label>
// </div>
// <hr />
// <h3 className="text-center">Sejarah Dokumen</h3><br />
// <table className="my-table table table-bordered">
// <thead>
// <tr>
// <th className="col-xl-3 col-lg-3 col-md-3 col-sm-3">Revisi</th>
// <th className="col-xl-5 col-lg-5 col-md-5 col-sm-5">Keterangan Revisi</th>
// <th className="col-xl-4 col-lg-4 col-md-4 col-sm-4">Persetujuan</th>
// </tr>
// </thead>
// <tbody>
// {
// this.state.revisions.map((revision, index) => {
// return (
// <tr key={index}>
// <td>{revision.revision_code}</td>
// <td>{revision.remark}</td>
// <td>{this.showApproval(revision.approval)}</td>
// </tr>
// )
// })
// }
// </tbody>
// </table>
// <hr />
// <h3 className="text-center">UMUM</h3><br />
// <div className="form-group row">
// <label className="col-xl-3 col-lg-3 col-md-3 col-sm-3 control-label">I. Tujuan</label>
// <label className="col-xl-9 col-lg-9 col-md-9 col-sm-9 control-label">
// {
// this.state.purpose.map((purpose, index) => {
// return (
// <div key={index}>
// <label className="control-label">{(index + 1) + ". " + purpose}</label>
// </div>
// )
// })
// }
// </label>
// </div>
// <hr />
// <div className="form-group row">
// <label className="col-xl-3 col-lg-3 col-md-3 col-sm-3 control-label">II. Lingkup</label>
// <label className="col-xl-9 col-lg-9 col-md-9 col-sm-9 control-label">
// {
// this.state.scopes.map((scope, index) => {
// return (
// <div key={index}>
// <label className="control-label">{(index + 1) + ". " + scope}</label>
// </div>
// )
// })
// }
// </label>
// </div>
// <hr />
// <div className="form-group row">
// <label className="col-xl-3 col-lg-3 col-md-3 col-sm-3 control-label">III. Definisi</label>
// <label className="col-xl-9 col-lg-9 col-md-9 col-sm-9 control-label">
// {
// this.state.definitions.map((definition, index) => {
// return (
// <div key={index}>
// <label className="control-label">{(index + 1) + ". " + definition}</label>
// </div>
// )
// })
// }
// </label>
// </div>
// <hr />
// <div className="form-group row">
// <label className="col-xl-3 col-lg-3 col-md-3 col-sm-3 control-label">IV. Referensi</label>
// <label className="col-xl-9 col-lg-9 col-md-9 col-sm-9 control-label">
// {
// this.state.references.map((reference, index) => {
// return (
// <div key={index}>
// <label className="control-label">{(index + 1) + ". " + reference}</label>
// </div>
// )
// })
// }
// </label>
// </div>
// <hr />
// <div className="form-group row">
// <label className="col-xl-3 col-lg-3 col-md-3 col-sm-3 control-label">IV. Bab Isi</label>
// <label className="col-xl-9 col-lg-9 col-md-9 col-sm-9 control-label">
// {
// this.state.contents.map((content, index) => {
// return (
// <div key={index}>
// <label className="control-label">{content.title}</label><br />
// </div>
// )
// })
// }
// </label>
// </div>
// <hr />
// {
// this.state.documentType != "FORM" &&
// this.state.contents.map((content, index) => {
// return (
// <div key={index}>
// <label className="control-label">{content.title}</label><br />
// <div className="row">
// <div className="col-xl-12 col-lg-12 col-md-12 col-sm-12">
// <div dangerouslySetInnerHTML={{ __html: content.description }}></div>
// </div>
// </div>
// </div>
// )
// })
// }
// {
// this.state.documentType == "FORM" &&
// <a href={this.state.contentForm.file} download={this.state.contentForm.title}>{this.state.contentForm.title}</a>
// }
// </div>
// </div>
// </div>
// </div>
<div className="background-grey2" id="printDocument"><br />
<div className="headerPreview">
<Button color="primary" onClick={this.handleDownloadPDF}>Download</Button>
</div>
<div className="col-xl-10 col-lg-10 col-md-10 col-sm-10" id="printDocument">
<div className="border p-5">
<div className="A4" id="paper1">
<img src="logo-visionet.png" alt="visionet" width="210px" height="70px" />
<h2 className="text-center">PT. VISIONET DATA INTERNASIONAL</h2><hr />
{this.handleShowDocumentType()}<br /><br />
......@@ -245,6 +440,8 @@ class PreviewDocument extends Component {
<label className="col-xl-3 col-lg-3 col-md-3 col-sm-3 control-label">Effective Date</label>
<label className="col-xl-9 col-lg-9 col-md-9 col-sm-9 control-label">{": " + this.state.effectiveDate}</label>
</div>
</div>
<div className="A4" id="paper2">
<hr />
<h3 className="text-center">Sejarah Dokumen</h3><br />
<table className="my-table table table-bordered">
......@@ -269,6 +466,8 @@ class PreviewDocument extends Component {
}
</tbody>
</table>
</div>
<div className="A4" id="paper3">
<hr />
<h3 className="text-center">UMUM</h3><br />
<div className="form-group row">
......@@ -345,6 +544,8 @@ class PreviewDocument extends Component {
}
</label>
</div>
</div>
<div className="A4" id="paper4">
<hr />
{
this.state.documentType != "FORM" &&
......@@ -363,10 +564,12 @@ class PreviewDocument extends Component {
}
{
this.state.documentType == "FORM" &&
<a href={this.state.contentForm.file} download={this.state.contentForm.title}>{this.state.contentForm.title}</a>
}
<div className="row">
<div className="col-xl-12 col-lg-12 col-md-12 col-sm-12">
<a className="text-decoration-none" href={this.state.contentForm.file} download={this.state.contentForm.title}>{this.state.contentForm.title}</a>
</div>
</div>
}
</div>
</div>
}
......
......@@ -6,6 +6,7 @@ import ReactLoading from 'react-loading';
import { DataTableMyDocument } from './DataTableMyDocument';
import { DataTableApprovalDocument } from './DataTableApprovalDocument';
import { DataTablePublishDocument } from './DataTablePublishDocument';
import { DataTableExpiredDocument } from './DataTableExpiredDocument';
class YourDocument extends Component {
constructor(props) {
......@@ -15,7 +16,8 @@ class YourDocument extends Component {
fetchStatus: false,
dataDocument: [],
dataApprovalDocument: [],
dataPublishDocument: []
dataPublishDocument: [],
dataExpiredDocument: []
}
}
componentDidMount = async () => {
......@@ -35,28 +37,63 @@ class YourDocument extends Component {
let responseDataRevision, dataRevision;
if (dataAllDocument != undefined) {
for (let i = 0; i < dataAllDocument.length; i++) {
let content = "";
let apiContent = "contentkey";
if (dataAllDocument[i].doc_code[0].includes("FORM")) {
apiContent = "contentkey2";
}
responseDataRevision = await axios.get(process.env.REACT_APP_MAIN_APIURL + '/DocumentManagement/revisionkey/' + dataAllDocument[i].doc_id[0], { headers: { 'Content-Type': 'application/xml' } })
dataRevision = responseDataRevision.data.revisionCollection.revision;
if (dataAllDocument[i].user_id[0] == user_id && dataAllDocument[i].doc_status[0] == "New") {
let datarow = [];
let responseDataContent = await axios.get(process.env.REACT_APP_MAIN_APIURL + '/DocumentManagement/' + apiContent + '/' + dataAllDocument[i].doc_id[0], { headers: { 'accept': 'application/xml' } })
let dataContent;
parseString(responseDataContent.data, function (err, result) {
dataContent = result.contentCollection.content;
})
if (dataContent != undefined && dataAllDocument[i].doc_type[0] != "FORM") {
for (let j = 0; j < dataContent.length; j++) {
content += "<p>" + dataContent[j].cont_title[0] + "</p>" + dataContent[j].cont[0];
}
}
if (dataContent != undefined && dataAllDocument[i].doc_type[0] == "FORM") {
content = "<p>" + dataContent[0].cont_title[0] + "</p>";
}
datarow.push("");
datarow.push(dataAllDocument[i].doc_code[0]);
datarow.push(dataAllDocument[i].subject[0]);
datarow.push(dataAllDocument[i].doc_status[0]);
datarow.push(dataRevision[dataRevision.length - 1].status);
datarow.push(JSON.parse(localStorage.getItem("user"))["Full Name"]);
datarow.push(content);
this.state.dataDocument.push(datarow);
}
if ((dataRevision[dataRevision.length - 1].status.includes("Waiting for Approval") || dataRevision[dataRevision.length - 1].status.includes("Waiting for Approver") || dataRevision[dataRevision.length - 1].status.includes("Additional Approver")) && dataAllDocument[i].doc_status[0] == "New") {
if (
(dataRevision[dataRevision.length - 1].status == "Waiting for Approval - " + JSON.parse(localStorage.getItem("dataLogin")).user_name[0] && JSON.parse(localStorage.getItem('dataLogin')).user_role[0].includes("Approver") && JSON.parse(localStorage.getItem("dataLDAP"))["Login Name"] == JSON.parse(dataAllDocument[i].approver[0]).LoginName) ||
(dataRevision[dataRevision.length - 1].status == "Waiting for Approval - Compliance Officer" && JSON.parse(localStorage.getItem('dataLogin')).user_role[0].includes("Compliance Officer")) ||
(dataRevision[dataRevision.length - 1].status == "Waiting for Approval - Manager Representative" && JSON.parse(localStorage.getItem('dataLogin')).user_role[0].includes("Manager Representative")) ||
JSON.parse(localStorage.getItem('dataLogin')).user_role[0].includes("Approver") ||
(dataRevision[dataRevision.length - 1].status == "Waiting for Approval - " + JSON.parse(localStorage.getItem("dataLogin")).user_name[0] && JSON.parse(localStorage.getItem('dataLogin')).user_role[0].includes("Approver")) ||
(dataRevision[dataRevision.length - 1].status == "Waiting for Approval - " + JSON.parse(localStorage.getItem("dataLogin")).user_name[0] && JSON.parse(localStorage.getItem('dataLogin')).user_role[0].includes("Compliance Officer")) ||
(dataRevision[dataRevision.length - 1].status == "Waiting for Approval - Management Representative" && JSON.parse(localStorage.getItem('dataLogin')).user_role[0].includes("Management Representative")) ||
(dataRevision[dataRevision.length - 1].status == "Waiting for Additional Approver" && JSON.parse(localStorage.getItem('dataLogin')).user_role[0].includes("Compliance Officer") ||
(dataRevision[dataRevision.length - 1].status.includes(JSON.parse(localStorage.getItem('dataLogin')).user_name[0])) && JSON.parse(localStorage.getItem('dataLogin')).user_role[0].includes("Additional Approver"))
) {
let datarow2 = [];
let user_name = "";
if (content == "") {
let responseDataContent = await axios.get(process.env.REACT_APP_MAIN_APIURL + '/DocumentManagement/' + apiContent + '/' + dataAllDocument[i].doc_id[0], { headers: { 'accept': 'application/xml' } })
let dataContent;
parseString(responseDataContent.data, function (err, result) {
dataContent = result.contentCollection.content;
})
if (dataContent != undefined && dataAllDocument[i].doc_type[0] != "FORM") {
for (let j = 0; j < dataContent.length; j++) {
content += "<p>" + dataContent[j].cont_title[0] + "</p>" + dataContent[j].cont[0];
}
}
if (dataContent != undefined && dataAllDocument[i].doc_type[0] == "FORM") {
content = "<p>" + dataContent[0].cont_title[0] + "</p>";
}
}
for (let j = 0; j < dataUser.length; j++) {
if (dataUser[j].user_id[0] == dataAllDocument[i].user_id[0]) {
user_name = dataUser[j].user_name[0];
......@@ -68,13 +105,29 @@ class YourDocument extends Component {
datarow2.push(dataAllDocument[i].subject[0]);
datarow2.push(dataAllDocument[i].doc_status[0]);
datarow2.push(dataRevision[dataRevision.length - 1].status);
datarow2.push(user_name)
datarow2.push(user_name);
datarow2.push(content);
this.state.dataApprovalDocument.push(datarow2);
}
}
if ((dataRevision[dataRevision.length - 1].status.includes("Waiting for Publish") || dataAllDocument[i].doc_status[0] == "Publish") && JSON.parse(localStorage.getItem('dataLogin')).user_role[0].includes("Compliance Officer")) {
let datarow3 = [];
let user_name2 = "";
if (content == "") {
let responseDataContent = await axios.get(process.env.REACT_APP_MAIN_APIURL + '/DocumentManagement/' + apiContent + '/' + dataAllDocument[i].doc_id[0], { headers: { 'accept': 'application/xml' } })
let dataContent;
parseString(responseDataContent.data, function (err, result) {
dataContent = result.contentCollection.content;
})
if (dataContent != undefined && dataAllDocument[i].doc_type[0] != "FORM") {
for (let j = 0; j < dataContent.length; j++) {
content += "<p>" + dataContent[j].cont_title[0] + "</p>" + dataContent[j].cont[0];
}
}
if (dataContent != undefined && dataAllDocument[i].doc_type[0] == "FORM") {
content = "<p>" + dataContent[0].cont_title[0] + "</p>";
}
}
for (let j = 0; j < dataUser.length; j++) {
if (dataUser[j].user_id[0] == dataAllDocument[i].user_id[0]) {
user_name2 = dataUser[j].user_name[0];
......@@ -87,8 +140,42 @@ class YourDocument extends Component {
datarow3.push(dataAllDocument[i].doc_status[0]);
datarow3.push(dataRevision[dataRevision.length - 1].status);
datarow3.push(user_name2);
datarow3.push(content);
this.state.dataPublishDocument.push(datarow3);
}
if (dataAllDocument[i].doc_status[0] == "Unpublish" && JSON.parse(localStorage.getItem('dataLogin')).user_role[0].includes("Compliance Officer")) {
let datarow4 = [];
let user_name3 = "";
if (content == "") {
let responseDataContent = await axios.get(process.env.REACT_APP_MAIN_APIURL + '/DocumentManagement/' + apiContent + '/' + dataAllDocument[i].doc_id[0], { headers: { 'accept': 'application/xml' } })
let dataContent;
parseString(responseDataContent.data, function (err, result) {
dataContent = result.contentCollection.content;
})
if (dataContent != undefined && dataAllDocument[i].doc_type[0] != "FORM") {
for (let j = 0; j < dataContent.length; j++) {
content += "<p>" + dataContent[j].cont_title[0] + "</p>" + dataContent[j].cont[0];
}
}
if (dataContent != undefined && dataAllDocument[i].doc_type[0] == "FORM") {
content = "<p>" + dataContent[0].cont_title[0] + "</p>";
}
}
for (let j = 0; j < dataUser.length; j++) {
if (dataUser[j].user_id[0] == dataAllDocument[i].user_id[0]) {
user_name3 = dataUser[j].user_name[0];
break;
}
}
datarow4.push("");
datarow4.push(dataAllDocument[i].doc_code[0]);
datarow4.push(dataAllDocument[i].subject[0]);
datarow4.push(dataAllDocument[i].doc_status[0]);
datarow4.push(dataRevision[dataRevision.length - 1].status);
datarow4.push(user_name3);
datarow4.push(content);
this.state.dataExpiredDocument.push(datarow4);
}
}
}
await this.setState({ fetchStatus: true });
......@@ -156,7 +243,7 @@ class YourDocument extends Component {
JSON.parse(localStorage.getItem('dataLogin')).user_role[0].includes("Approver") ||
JSON.parse(localStorage.getItem('dataLogin')).user_role[0].includes("Additional Approver") ||
JSON.parse(localStorage.getItem('dataLogin')).user_role[0].includes("Compliance Officer") ||
JSON.parse(localStorage.getItem('dataLogin')).user_role[0].includes("Manager Representative")
JSON.parse(localStorage.getItem('dataLogin')).user_role[0].includes("Management Representative")
) &&
<div>
<hr />
......@@ -180,6 +267,18 @@ class YourDocument extends Component {
<DataTablePublishDocument data={this.state.dataPublishDocument}></DataTablePublishDocument>
</div>
}
{
this.state.fetchStatus == true && JSON.parse(localStorage.getItem('dataLogin')).user_role[0].includes("Compliance Officer") && this.state.fetchError == false &&
<div>
<hr />
<div className="form-group row">
<div className="col-xl-12 col-lg-12 col-md-12 col-sm-12">
<h3>Expired Document</h3>
</div>
</div>
<DataTableExpiredDocument data={this.state.dataExpiredDocument}></DataTableExpiredDocument>
</div>
}
</div>
</div>
)
......
......@@ -12,7 +12,7 @@ const YourDocumentRoute = ({ component: Component, ...rest }) => {
JSON.parse(localStorage.getItem('dataLogin')).user_role[0].includes("Additional Approver") ||
JSON.parse(localStorage.getItem('dataLogin')).user_role[0].includes("Compliance Officer") ||
JSON.parse(localStorage.getItem('dataLogin')).user_role[0].includes("Creator") ||
JSON.parse(localStorage.getItem('dataLogin')).user_role[0].includes("Manager Representative")) ? (
JSON.parse(localStorage.getItem('dataLogin')).user_role[0].includes("Management Representative")) ? (
<Component {...props} />
) : (
<Redirect to={{ pathname: '/', state: { from: props.location } }} />
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment