Commit 0494aa8e authored by Internship UKSW 2019's avatar Internship UKSW 2019

Initial commit

parent fe2f58cf
...@@ -11767,6 +11767,11 @@ ...@@ -11767,6 +11767,11 @@
"resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz",
"integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA=="
}, },
"react-loading": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/react-loading/-/react-loading-2.0.3.tgz",
"integrity": "sha512-Vdqy79zq+bpeWJqC+xjltUjuGApyoItPgL0vgVfcJHhqwU7bAMKzysfGW/ADu6i0z0JiOCRJjo+IkFNkRNbA3A=="
},
"react-popper": { "react-popper": {
"version": "1.3.4", "version": "1.3.4",
"resolved": "https://registry.npmjs.org/react-popper/-/react-popper-1.3.4.tgz", "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-1.3.4.tgz",
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
"react": "^16.10.2", "react": "^16.10.2",
"react-dom": "^16.10.2", "react-dom": "^16.10.2",
"react-expand-collapse": "^0.2.0", "react-expand-collapse": "^0.2.0",
"react-loading": "^2.0.3",
"react-redux": "^7.1.3", "react-redux": "^7.1.3",
"react-router-dom": "^5.1.2", "react-router-dom": "^5.1.2",
"react-scripts": "^3.3.0", "react-scripts": "^3.3.0",
......
import React, { Component } from 'react'; import React, { Component } from 'react';
import { BrowserRouter, Route, Switch } from 'react-router-dom'; import { BrowserRouter, Route, Switch } from 'react-router-dom';
import PrivateRoute from './PrivateRoute'; import PrivateRoute from './PrivateRoute';
import CreateDocumentRoute from './CreateDocumentRoute';
import YourDocumentRoute from './YourDocumentRoute';
import ManageUserRoute from './ManageUserRoute';
import FormLogin from './FormLogin'; import FormLogin from './FormLogin';
import Home from './Home'; import Home from './Home';
import PreviewDocument from './PreviewDocument'; import PreviewDocument from './PreviewDocument';
...@@ -21,12 +24,12 @@ class App extends Component { ...@@ -21,12 +24,12 @@ class App extends Component {
<Route exact path='/' component={FormLogin} /> <Route exact path='/' component={FormLogin} />
<PrivateRoute exact path="/home" component={Home} /> <PrivateRoute exact path="/home" component={Home} />
<PrivateRoute exact path="/previewdocument" component={PreviewDocument}/> <PrivateRoute exact path="/previewdocument" component={PreviewDocument}/>
<PrivateRoute exact path="/yourdocument" component={YourDocument} /> <YourDocumentRoute exact path="/yourdocument" component={YourDocument} />
<PrivateRoute exact path="/manageuser" component={ManageUser} /> <ManageUserRoute exact path="/manageuser" component={ManageUser} />
<PrivateRoute exact path="/formcreateupdaterole" component={FormCreateUpdateRole} /> <ManageUserRoute exact path="/formcreateupdaterole" component={FormCreateUpdateRole} />
<PrivateRoute exact path="/formcreatedocument" component={FormCreateDocument} /> <CreateDocumentRoute exact path="/formcreatedocument" component={FormCreateDocument} />
<PrivateRoute exact path="/formapprover" component={FormApprover} /> <YourDocumentRoute exact path="/formapprover" component={FormApprover} />
<PrivateRoute exact path="/formrevision" component={FormRevision} /> <YourDocumentRoute exact path="/formrevision" component={FormRevision} />
<Route path='*' component={NotFoundPage} /> <Route path='*' component={NotFoundPage} />
</Switch> </Switch>
</BrowserRouter> </BrowserRouter>
......
import React from 'react'
import { Redirect, Route } from 'react-router-dom'
const CreateDocumentRoute = ({ component: Component, ...rest }) => {
return (
<Route
{...rest}
render={
props =>
localStorage.getItem("user") && localStorage.getItem("loginUserRole").includes("Creator") ? (
<Component {...props} />
) : (
<Redirect to={{ pathname: '/', state: { from: props.location } }} />
)
}
/>
)
}
export default CreateDocumentRoute;
\ No newline at end of file
...@@ -6,21 +6,59 @@ $.DataTable = require('datatables.net'); ...@@ -6,21 +6,59 @@ $.DataTable = require('datatables.net');
export class DataTableHome extends Component { export class DataTableHome extends Component {
componentDidMount = () => { componentDidMount = () => {
this.$el = $(this.el) this.$el = $(this.el)
this.$el.DataTable({ var table = this.$el.DataTable({
"data": this.props.data, data: this.props.data,
"columns": [ columns: [
{ "title": "Code" }, { title: "No", width: 30 },
{ title: "Code" },
{ title: "Subject" },
{ title: "Type" },
{ title: "Revision Date" },
{ title: "Effective Date" },
{ title: "Business Process" },
],
columnDefs: [
{ {
"title": "Subject", searchable: false,
"fnCreatedCell": function (nTd, data) { orderable: false,
$(nTd).html("<a class='text-decoration-none' href='http://10.10.86.48:3000/previewdocument?subject=" + data + "' target='_blank' rel='noopener noreferrer'>" + data + "</a>"); targets: 0
},
{
orderable: false,
targets: 1,
render: function (data, type, row) {
return "<a class='text-decoration-none' href='#'>" + data + "</a>";
}
//<a class='text-decoration-none' href='http://localhost:3000/previewdocument?subject=" + data + "' target='_blank' rel='noopener noreferrer'>" + data + "</a>
},
{
orderable: false,
targets: 2,
render: function (data, type, row) {
return "<a class='text-decoration-none' href='#'>" + data + "</a>";
} }
}, },
{ "title": "Type" }, {
{ "title": "Revision Date" }, orderable: false,
{ "title": "Effective Date" }, targets: 4
{ "title": "Business Process" }, },
] {
orderable: false,
targets: 5
},
],
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 = () => { componentWillUnmount = () => {
......
...@@ -3,41 +3,79 @@ import './DocumentManagement.css'; ...@@ -3,41 +3,79 @@ import './DocumentManagement.css';
const $ = require('jquery'); const $ = require('jquery');
$.DataTable = require('datatables.net'); $.DataTable = require('datatables.net');
$(document).ready(function() {
$("#btn-delete").click(function(){
alert("Ini button delete!");
});
});
export class DataTableManageUser extends Component { export class DataTableManageUser extends Component {
componentDidMount = () => { componentDidMount = () => {
this.$el = $(this.el) this.$el = $(this.el)
this.$el.DataTable({ var table = this.$el.DataTable({
"data": this.props.data, data: this.props.data,
"columns": [ columns: [
{ "title": "No" }, { title: "No", width: 30 },
{ "title": "User Id" }, { title: "User Name" },
{ "title": "User Name" }, { title: "Department" },
{ "title": "Department" }, { title: "Role" },
{ "title": "Role" }, { title: "Manager Name" },
{ "title": "Manager Name" }, { title: "Email" },
{ "title": "Email" }, { title: "Action", width: 190 },
{ ],
"title": "Action", columnDefs: [
"render": function (data, type, row) { {
return "<a href='/formcreateupdaterole?edit=" + data + "' target='_self' rel='noopener noreferrer'><button type='button' class='button-1 btn btn-success'>Edit</button></a>&nbsp;<a href='/manageuser?delete=" + data + "' target='_self' rel='noopener noreferrer'><button type='button' class='button-1 btn btn-danger'>Delete</button></a>"; targets: [-1], render: function (data, type, row) {
return "<a href='/formcreateupdaterole?edit=" + data + "' target='_self' rel='noopener noreferrer'><button name='btn-edit' class='button-1 btn btn-success'>Edit</button></a>&nbsp;<button name='btn-delete' class='button-1 btn btn-danger'>Delete</button>";
} }
}, },
] {
searchable: false,
orderable: false,
targets: 0
},
{
orderable: false,
targets: 1
},
{
orderable: false,
targets: 4
},
{
orderable: false,
targets: 5
},
{
searchable: false,
orderable: false,
targets: 6
},
],
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", "button[name = 'btn-delete']", function () {
let data = table.row($(this).parents("tr")).data();
let isDelete = window.confirm("Are you sure want to delete " + data[1] + "?");
if (isDelete) {
// process.env.REACT_APP_MAIN_APIURL
fetch(process.env.REACT_APP_MAIN_APIURL + '/user/', {
headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' },
method: 'DELETE',
body: 'email=' + data[5]
}).then(res => {
window.location.reload();
alert("Data has been deleted!");
}).catch(err => {
alert(err + "");
})
}
}) })
} }
$
componentWillUnmount = () => { componentWillUnmount = () => {
this.$el.DataTable.destroy(true); this.$el.DataTable.destroy(true);
} }
handleDeleteRole = () => {
alert("Ini tombol delete!");
}
render() { render() {
return ( return (
<div> <div>
......
...@@ -6,16 +6,58 @@ $.DataTable = require('datatables.net'); ...@@ -6,16 +6,58 @@ $.DataTable = require('datatables.net');
export class DataTableYourDocument extends Component { export class DataTableYourDocument extends Component {
componentDidMount = () => { componentDidMount = () => {
this.$el = $(this.el) this.$el = $(this.el)
this.$el.DataTable({ var table = this.$el.DataTable({
"data": this.props.data, data: this.props.data,
"columns": [ columns: [
{ "title": "No" }, { title: "No", width: 30 },
{ "title": "Code" }, { title: "Code" },
{ "title": "Subject" }, { title: "Subject" },
{ "title": "Status" }, { title: "Status" },
{ "title": "Tracking" }, { title: "Tracking" },
{ "title": "Creator" }, { 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
}
],
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 = () => { componentWillUnmount = () => {
......
...@@ -5,6 +5,9 @@ ...@@ -5,6 +5,9 @@
text-align: center; text-align: center;
margin-top: 6%; margin-top: 6%;
} }
.content-loading {
margin-top: 20%;
}
.login-form { .login-form {
padding-top: 5rem; padding-top: 5rem;
padding-bottom: 5rem; padding-bottom: 5rem;
......
This diff is collapsed.
...@@ -150,44 +150,55 @@ class FormCreateUpdateRole extends Component { ...@@ -150,44 +150,55 @@ class FormCreateUpdateRole extends Component {
} else { } else {
try { try {
await this.setState({ submitForm: true }) await this.setState({ submitForm: true })
let uri_email = encodeURIComponent(this.state.email); let responseCheckDataUser = await axios.get(process.env.REACT_APP_MAIN_APIURL + '/DocumentManagement/userkey/' + this.state.email, { headers: { 'accept': 'application/xml' } })
let API_token = "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6IlpqUm1ZVE13TlRKak9XVTVNbUl6TWpnek5ESTNZMkl5TW1JeVkyRXpNamRoWmpWaU1qYzBaZz09In0.eyJhdWQiOiJodHRwOlwvXC9vcmcud3NvMi5hcGltZ3RcL2dhdGV3YXkiLCJzdWIiOiJhZG1pbkBjYXJib24uc3VwZXIiLCJhcHBsaWNhdGlvbiI6eyJvd25lciI6ImFkbWluIiwidGllciI6IjEwUGVyTWluIiwibmFtZSI6ImFwcGwiLCJpZCI6MTMsInV1aWQiOm51bGx9LCJzY29wZSI6ImFtX2FwcGxpY2F0aW9uX3Njb3BlIGRlZmF1bHQiLCJpc3MiOiJodHRwczpcL1wvMTAuMTAuODguMTI6OTQ0M1wvb2F1dGgyXC90b2tlbiIsInRpZXJJbmZvIjp7IlVubGltaXRlZCI6eyJzdG9wT25RdW90YVJlYWNoIjp0cnVlLCJzcGlrZUFycmVzdExpbWl0IjowLCJzcGlrZUFycmVzdFVuaXQiOm51bGx9fSwia2V5dHlwZSI6IlBST0RVQ1RJT04iLCJzdWJzY3JpYmVkQVBJcyI6W3sic3Vic2NyaWJlclRlbmFudERvbWFpbiI6ImNhcmJvbi5zdXBlciIsIm5hbWUiOiJlbXBsb3llZV9wcm9maWxlIiwiY29udGV4dCI6IlwvZW1weWxcLzEuMC4wIiwicHVibGlzaGVyIjoiYWRtaW4iLCJ2ZXJzaW9uIjoiMS4wLjAiLCJzdWJzY3JpcHRpb25UaWVyIjoiVW5saW1pdGVkIn1dLCJjb25zdW1lcktleSI6ImlqMHNnaWVLVVprdFBTbElkcl9mU2tFanI1a2EiLCJleHAiOjE2MzUyOTk3NDYsImlhdCI6MTU4MDk3ODc0NiwianRpIjoiNDFlM2FlMGYtMmYzZC00NWIzLTllN2YtMjI5YjRiNTkwOWE1In0.ZZ1_-3Z2bnsa5ar7b-QnuNGy95Olh5rQSMifJCTnW09T9omU1Zzql1Wllaey7veC9xy6yi-WxPpPeRee_-UtZdloGE9PCd99rMdNLsNuXWxmN0MvyXjMYqUvOYe9lbXzirE99yQhywa7LzVxpJVccGl42a5HhJ-BHF85IXiSSKK_-ykssK2WNfQhyUySJoz-lUj44-Eur2svbEWTVX6sOaejdwdv3xBFya8WoAAXPaelaE0Fm2SONQdh4DZZx0OdJS794fcYGNKshdTJiAG7Kau1jQMjy6-Pa3fv8wpFxV7GQuQy24TeTBo3jNxX2Fu5b2-P_YFIgA1KuqSM9Fnp2Q"; console.log();
fetch('http://10.10.88.12:8280/empyl/1.0.0/employee/' + uri_email, { let checkDataUser;
headers: { 'Authorization': API_token } parseString(responseCheckDataUser.data, function (err, result) {
checkDataUser = result.user_dataCollection.user_data;
}) })
.then(response => response.text()) if (checkDataUser == undefined) {
.then(text => { let uri_email = encodeURIComponent(this.state.email);
let dataEmployee; let API_token = "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6IlpqUm1ZVE13TlRKak9XVTVNbUl6TWpnek5ESTNZMkl5TW1JeVkyRXpNamRoWmpWaU1qYzBaZz09In0.eyJhdWQiOiJodHRwOlwvXC9vcmcud3NvMi5hcGltZ3RcL2dhdGV3YXkiLCJzdWIiOiJhZG1pbkBjYXJib24uc3VwZXIiLCJhcHBsaWNhdGlvbiI6eyJvd25lciI6ImFkbWluIiwidGllciI6IjEwUGVyTWluIiwibmFtZSI6ImFwcGwiLCJpZCI6MTMsInV1aWQiOm51bGx9LCJzY29wZSI6ImFtX2FwcGxpY2F0aW9uX3Njb3BlIGRlZmF1bHQiLCJpc3MiOiJodHRwczpcL1wvMTAuMTAuODguMTI6OTQ0M1wvb2F1dGgyXC90b2tlbiIsInRpZXJJbmZvIjp7IlVubGltaXRlZCI6eyJzdG9wT25RdW90YVJlYWNoIjp0cnVlLCJzcGlrZUFycmVzdExpbWl0IjowLCJzcGlrZUFycmVzdFVuaXQiOm51bGx9fSwia2V5dHlwZSI6IlBST0RVQ1RJT04iLCJzdWJzY3JpYmVkQVBJcyI6W3sic3Vic2NyaWJlclRlbmFudERvbWFpbiI6ImNhcmJvbi5zdXBlciIsIm5hbWUiOiJlbXBsb3llZV9wcm9maWxlIiwiY29udGV4dCI6IlwvZW1weWxcLzEuMC4wIiwicHVibGlzaGVyIjoiYWRtaW4iLCJ2ZXJzaW9uIjoiMS4wLjAiLCJzdWJzY3JpcHRpb25UaWVyIjoiVW5saW1pdGVkIn1dLCJjb25zdW1lcktleSI6ImlqMHNnaWVLVVprdFBTbElkcl9mU2tFanI1a2EiLCJleHAiOjE2MzUyOTk3NDYsImlhdCI6MTU4MDk3ODc0NiwianRpIjoiNDFlM2FlMGYtMmYzZC00NWIzLTllN2YtMjI5YjRiNTkwOWE1In0.ZZ1_-3Z2bnsa5ar7b-QnuNGy95Olh5rQSMifJCTnW09T9omU1Zzql1Wllaey7veC9xy6yi-WxPpPeRee_-UtZdloGE9PCd99rMdNLsNuXWxmN0MvyXjMYqUvOYe9lbXzirE99yQhywa7LzVxpJVccGl42a5HhJ-BHF85IXiSSKK_-ykssK2WNfQhyUySJoz-lUj44-Eur2svbEWTVX6sOaejdwdv3xBFya8WoAAXPaelaE0Fm2SONQdh4DZZx0OdJS794fcYGNKshdTJiAG7Kau1jQMjy6-Pa3fv8wpFxV7GQuQy24TeTBo3jNxX2Fu5b2-P_YFIgA1KuqSM9Fnp2Q";
parseString(text, function (err, result) { fetch('http://10.10.88.12:8280/empyl/1.0.0/employee/' + uri_email, {
dataEmployee = result.VU_EmployeeMACCollection.VU_EmployeeMAC; headers: { 'Authorization': API_token }
}) })
if (dataEmployee != undefined) { .then(response => response.text())
let userRole2 = ""; .then(text => {
for (let i = 0; i < this.state.roles.length; i++) { let dataEmployee;
if (i > 0) { parseString(text, function (err, result) {
userRole2 = userRole2 + ", "; dataEmployee = result.VU_EmployeeMACCollection.VU_EmployeeMAC;
})
if (dataEmployee != undefined) {
let userRole2 = "";
for (let i = 0; i < this.state.roles.length; i++) {
if (i > 0) {
userRole2 = userRole2 + ", ";
}
userRole2 = userRole2 + this.state.roles[i];
} }
userRole2 = userRole2 + this.state.roles[i]; let dataUsers = {
} "user_name": dataEmployee[0].EmpFullName[0],
let dataUsers = { "user_dpt": dataEmployee[0].Department[0],
"user_name": dataEmployee[0].EmpFullName[0], "user_role": userRole2,
"user_dpt": dataEmployee[0].Department[0], "manager_name": dataEmployee[0].ManagerName[0],
"user_role": userRole2, "email": this.state.email
"manager_name": dataEmployee[0].ManagerName[0], }
"email": this.state.email let postDataUsers = js2xmlparser.parse("_postuserinsert", dataUsers);
axios.post(process.env.REACT_APP_MAIN_APIURL + '/DocumentManagement/userinsert', postDataUsers, { headers: { 'Content-Type': 'text/xml' } })
.then(res => {
this.setState({ submitForm: false })
alert("User role has been successfully added");
this.props.history.push("/manageuser")
})
} else {
this.setState({ submitForm: false })
alert("Email is invalid!")
} }
let postDataUsers = js2xmlparser.parse("_postuserinsert", dataUsers); })
axios.post(process.env.REACT_APP_MAIN_APIURL + '/DocumentManagement/userinsert', postDataUsers, { headers: { 'Content-Type': 'text/xml' } }) } else {
.then(res => { this.setState({ submitForm: false })
this.setState({ submitForm: false }) alert("Email is already exist");
alert("User role has been successfully added"); }
this.props.history.push("/manageuser")
})
} else {
this.setState({ submitForm: false })
alert("Email is invalid!")
}
})
} catch (error) { } catch (error) {
this.setState({ submitForm: false }) this.setState({ submitForm: false })
alert(error + ""); alert(error + "");
......
import React from 'react'; import React, { Component } from 'react';
import { Navbar, NavbarBrand, Button } from 'reactstrap'; import { Navbar, NavbarBrand, Button } from 'reactstrap';
import { createStore } from 'redux'; import { createStore } from 'redux';
import axios from 'axios';
import sessionReducer from './sessionReducer'; import sessionReducer from './sessionReducer';
import './DocumentManagement.css'; import './DocumentManagement.css';
import axios from 'axios';
class FormLogin extends React.Component { class FormLogin extends Component {
constructor(props) { constructor(props) {
super(props) super(props)
this.state = { this.state = {
...@@ -29,28 +29,39 @@ class FormLogin extends React.Component { ...@@ -29,28 +29,39 @@ class FormLogin extends React.Component {
} }
} }
handleSubmitLogin = async () => { handleSubmitLogin = async () => {
await this.setState({ submitted: true }) await this.setState({ submitted: true, loggingIn: true, isLoginFailed: false })
if (this.state.username != "" && this.state.password != "") { if (this.state.username != "" && this.state.password != "") {
axios.get('/signin', { try {
params: { let responseDataLoginLDAP = await axios.get('/signin', {
uid: this.state.username, params: {
pwd: this.state.password, uid: this.state.username,
key: '2ffb2a00a3abe029fdebae5e1d417ebcb04b7e103a0cd8b54763051cef08bc55' pwd: this.state.password,
} key: '2ffb2a00a3abe029fdebae5e1d417ebcb04b7e103a0cd8b54763051cef08bc55'
}) }
.then((res) => { })
if(res.data.code == 401) { if (responseDataLoginLDAP.data.code == 401) {
this.setState({ isLoginFailed: true, loggingIn: false, errMessage: "Username or Password is Invalid!" }) this.setState({ isLoginFailed: true, loggingIn: false, errMessage: "Username or Password is Invalid!" })
} else { } else {
var parseString = require('xml2js').parseString;
let responseDataUser = await axios.get(process.env.REACT_APP_MAIN_APIURL + '/DocumentManagement/userkey/' + responseDataLoginLDAP.data.Email, { headers: { 'accept': 'application/xml' } })
let dataUser;
parseString(responseDataUser.data, function (err, result) {
dataUser = result.user_dataCollection.user_data;
})
if (dataUser != undefined) {
localStorage.setItem('loginUserDpt', dataUser[0].user_dpt[0]);
localStorage.setItem('loginUserRole', dataUser[0].user_role[0]);
let store = createStore(sessionReducer); let store = createStore(sessionReducer);
let todoAction = { type: "add_session", payload: res.data }; let todoAction = { type: "add_session", payload: responseDataLoginLDAP.data };
store.dispatch(todoAction); store.dispatch(todoAction);
this.props.history.push("/home"); this.props.history.push("/home");
} else {
this.setState({ isLoginFailed: true, loggingIn: false, errMessage: "Your account is not Registered!" })
} }
}) }
.catch((err) => { } catch (error) {
this.setState({ isLoginFailed: true, loggingIn: false, errMessage: "" + err }) this.setState({ isLoginFailed: true, loggingIn: false, errMessage: "" + error })
}); }
// let URLItop = "http://10.10.88.182:8280/services/VionaApi/auth"; // let URLItop = "http://10.10.88.182:8280/services/VionaApi/auth";
// fetch(URLItop, { // fetch(URLItop, {
// method: "GET", // method: "GET",
......
...@@ -24,6 +24,7 @@ class Home extends Component { ...@@ -24,6 +24,7 @@ class Home extends Component {
if (data != undefined) { if (data != undefined) {
for (let i = 0; i < data.length; i++) { for (let i = 0; i < data.length; i++) {
let datarow = []; let datarow = [];
datarow.push("");
datarow.push(data[i].doc_code[0]); datarow.push(data[i].doc_code[0]);
datarow.push(data[i].subject[0]); datarow.push(data[i].subject[0]);
datarow.push(data[i].doc_type[0]); datarow.push(data[i].doc_type[0]);
......
import React, { Component } from 'react'; import React, { Component } from 'react';
import { Button } from 'reactstrap'; import { Button } from 'reactstrap';
import { connect } from 'react-redux';
import axios from 'axios'; import axios from 'axios';
import Navbar1 from './Navbar'; import Navbar1 from './Navbar';
import queryString from 'query-string';
import './DocumentManagement.css'; import './DocumentManagement.css';
import { DataTableManageUser } from './DataTableManageUser'; import { DataTableManageUser } from './DataTableManageUser';
...@@ -17,37 +15,7 @@ class ManageUser extends Component { ...@@ -17,37 +15,7 @@ class ManageUser extends Component {
} }
componentDidMount = async () => { componentDidMount = async () => {
try { try {
var js2xmlparser = require('js2xmlparser');
var parseString = require('xml2js').parseString; var parseString = require('xml2js').parseString;
if (this.props.location.search != "") {
let values = queryString.parse(this.props.location.search);
if (values.delete != "") {
let dataUser = {
"_deleteuserdelete_user_id": {
"user_id": values.delete
}
}
let deleteDataUser = js2xmlparser.parse("_deleteuserdelete_user_id", dataUser);
axios.delete(process.env.REACT_APP_MAIN_APIURL + '/DocumentManagement/userdelete/' + values.delete, {
params: {
"_deleteuserdelete_user_id": {
"user_id": values.delete
}
},
headers : {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Transfer-Encoding': 'chunked'
}
})
.then(res => {
console.log(res);
this.props.history.push("/manageuser");
}).catch(err => {
this.props.history.push("/manageuser");
})
}
}
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; let data;
parseString(response.data, function (err, result) { parseString(response.data, function (err, result) {
...@@ -56,8 +24,7 @@ class ManageUser extends Component { ...@@ -56,8 +24,7 @@ class ManageUser extends Component {
if (data != undefined) { if (data != undefined) {
for (let i = 0; i < data.length; i++) { for (let i = 0; i < data.length; i++) {
let datarow = []; let datarow = [];
datarow.push(i+1); datarow.push("");
datarow.push(data[i].user_id[0]);
datarow.push(data[i].user_name[0]); datarow.push(data[i].user_name[0]);
datarow.push(data[i].user_dpt[0]); datarow.push(data[i].user_dpt[0]);
datarow.push(data[i].user_role[0]); datarow.push(data[i].user_role[0]);
...@@ -67,9 +34,9 @@ class ManageUser extends Component { ...@@ -67,9 +34,9 @@ class ManageUser extends Component {
this.state.dataUser.push(datarow); this.state.dataUser.push(datarow);
} }
} }
this.setState({ fetchStatus: true}) this.setState({ fetchStatus: true })
} catch (error) { } catch (error) {
this.setState({ fetchStatus: true}) this.setState({ fetchStatus: true })
console.log(error + ""); console.log(error + "");
} }
} }
...@@ -78,26 +45,20 @@ class ManageUser extends Component { ...@@ -78,26 +45,20 @@ class ManageUser extends Component {
return ( return (
<div> <div>
<Navbar1 menu="manageuser" /><br /> <Navbar1 menu="manageuser" /><br />
{ <div className="container-fluid">
this.state.fetchStatus == true && <div className="form-group row">
<div className="container-fluid"> <div className="col-xl-12 col-lg-12 col-md-12 col-sm-12">
<div className="form-group row"> <Button className="center-block" color="primary" href="/formcreateupdaterole">Add User</Button>
<div className="col-xl-12 col-lg-12 col-md-12 col-sm-12">
<Button className="center-block" color="primary" href="/formcreateupdaterole">Add User</Button>
</div>
</div> </div>
<DataTableManageUser data={this.state.dataUser}></DataTableManageUser>
</div> </div>
} {
this.state.fetchStatus == true &&
<DataTableManageUser data={this.state.dataUser}></DataTableManageUser>
}
</div>
</div> </div>
) )
} }
} }
const mapStateToProps = (state) => { export default ManageUser;
return { \ No newline at end of file
session: state.session
}
}
export default connect(mapStateToProps)(ManageUser);
\ No newline at end of file
import React from 'react'
import { Redirect, Route } from 'react-router-dom'
const ManageUserRoute = ({ component: Component, ...rest }) => {
return (
<Route
{...rest}
render={
props =>
localStorage.getItem("user") && localStorage.getItem("loginUserRole").includes("Admin") ? (
<Component {...props} />
) : (
<Redirect to={{ pathname: '/', state: { from: props.location } }} />
)
}
/>
)
}
export default ManageUserRoute;
\ No newline at end of file
...@@ -24,20 +24,26 @@ const Navbar1 = (props) => { ...@@ -24,20 +24,26 @@ const Navbar1 = (props) => {
</SvgIcon> Home </SvgIcon> Home
</NavLink> </NavLink>
</NavItem> </NavItem>
<NavItem> {
<NavLink className={"text-" + (props.menu == "yourdocument" ? "warning" : "light")} href="/yourdocument"> localStorage.getItem("loginUserRole") != "View" &&
<SvgIcon> <NavItem>
<path fill="#000000" d="M6,2A2,2 0 0,0 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2H6M6,4H13V9H18V20H6V4M8,12V14H16V12H8M8,16V18H13V16H8Z" /> <NavLink className={"text-" + (props.menu == "yourdocument" ? "warning" : "light")} href="/yourdocument">
</SvgIcon> Your Document <SvgIcon>
</NavLink> <path fill="#000000" d="M6,2A2,2 0 0,0 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2H6M6,4H13V9H18V20H6V4M8,12V14H16V12H8M8,16V18H13V16H8Z" />
</NavItem> </SvgIcon> Your Document
<NavItem> </NavLink>
<NavLink className={"text-" + (props.menu == "manageuser" ? "warning" : "light")} href="/manageuser"> </NavItem>
<SvgIcon> }
<path fill="#000000" d="M10 4C7.79 4 6 5.79 6 8S7.79 12 10 12 14 10.21 14 8 12.21 4 10 4M10 14C5.58 14 2 15.79 2 18V20H11.5C11.17 19.21 11 18.36 11 17.5C11 16.31 11.33 15.15 11.95 14.14C11.32 14.06 10.68 14 10 14M22.77 18.32L21.7 17.5C21.72 17.33 21.74 17.17 21.74 17S21.73 16.67 21.7 16.5L22.76 15.68C22.85 15.6 22.88 15.47 22.82 15.36L21.82 13.63C21.76 13.5 21.63 13.5 21.5 13.5L20.27 14C20 13.82 19.73 13.65 19.42 13.53L19.23 12.21C19.22 12.09 19.11 12 19 12H17C16.87 12 16.76 12.09 16.74 12.21L16.55 13.53C16.25 13.66 15.96 13.82 15.7 14L14.46 13.5C14.35 13.5 14.22 13.5 14.15 13.63L13.15 15.36C13.09 15.47 13.11 15.6 13.21 15.68L14.27 16.5C14.25 16.67 14.24 16.83 14.24 17S14.25 17.33 14.27 17.5L13.21 18.32C13.12 18.4 13.09 18.53 13.15 18.64L14.15 20.37C14.21 20.5 14.34 20.5 14.46 20.5L15.7 20C15.96 20.18 16.24 20.35 16.55 20.47L16.74 21.79C16.76 21.91 16.86 22 17 22H19C19.11 22 19.22 21.91 19.24 21.79L19.43 20.47C19.73 20.34 20 20.18 20.27 20L21.5 20.5C21.63 20.5 21.76 20.5 21.83 20.37L22.83 18.64C22.89 18.53 22.86 18.4 22.77 18.32M18 18.5C17.16 18.5 16.5 17.83 16.5 17S17.17 15.5 18 15.5 19.5 16.17 19.5 17 18.83 18.5 18 18.5Z" /> {
</SvgIcon> Manage User localStorage.getItem("loginUserRole").includes("Admin") &&
</NavLink> <NavItem>
</NavItem> <NavLink className={"text-" + (props.menu == "manageuser" ? "warning" : "light")} href="/manageuser">
<SvgIcon>
<path fill="#000000" d="M10 4C7.79 4 6 5.79 6 8S7.79 12 10 12 14 10.21 14 8 12.21 4 10 4M10 14C5.58 14 2 15.79 2 18V20H11.5C11.17 19.21 11 18.36 11 17.5C11 16.31 11.33 15.15 11.95 14.14C11.32 14.06 10.68 14 10 14M22.77 18.32L21.7 17.5C21.72 17.33 21.74 17.17 21.74 17S21.73 16.67 21.7 16.5L22.76 15.68C22.85 15.6 22.88 15.47 22.82 15.36L21.82 13.63C21.76 13.5 21.63 13.5 21.5 13.5L20.27 14C20 13.82 19.73 13.65 19.42 13.53L19.23 12.21C19.22 12.09 19.11 12 19 12H17C16.87 12 16.76 12.09 16.74 12.21L16.55 13.53C16.25 13.66 15.96 13.82 15.7 14L14.46 13.5C14.35 13.5 14.22 13.5 14.15 13.63L13.15 15.36C13.09 15.47 13.11 15.6 13.21 15.68L14.27 16.5C14.25 16.67 14.24 16.83 14.24 17S14.25 17.33 14.27 17.5L13.21 18.32C13.12 18.4 13.09 18.53 13.15 18.64L14.15 20.37C14.21 20.5 14.34 20.5 14.46 20.5L15.7 20C15.96 20.18 16.24 20.35 16.55 20.47L16.74 21.79C16.76 21.91 16.86 22 17 22H19C19.11 22 19.22 21.91 19.24 21.79L19.43 20.47C19.73 20.34 20 20.18 20.27 20L21.5 20.5C21.63 20.5 21.76 20.5 21.83 20.37L22.83 18.64C22.89 18.53 22.86 18.4 22.77 18.32M18 18.5C17.16 18.5 16.5 17.83 16.5 17S17.17 15.5 18 15.5 19.5 16.17 19.5 17 18.83 18.5 18 18.5Z" />
</SvgIcon> Manage User
</NavLink>
</NavItem>
}
<NavItem> <NavItem>
<NavLink className="text-light" href="/" onClick={handleSignOut}> <NavLink className="text-light" href="/" onClick={handleSignOut}>
<SvgIcon> <SvgIcon>
......
...@@ -2,6 +2,7 @@ import React, { Component } from 'react'; ...@@ -2,6 +2,7 @@ import React, { Component } from 'react';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import queryString from 'query-string'; import queryString from 'query-string';
import axios from 'axios'; import axios from 'axios';
import ReactLoading from 'react-loading';
import './DocumentManagement.css'; import './DocumentManagement.css';
class PreviewDocument extends Component { class PreviewDocument extends Component {
...@@ -113,6 +114,19 @@ class PreviewDocument extends Component { ...@@ -113,6 +114,19 @@ class PreviewDocument extends Component {
const { session } = this.props; const { session } = this.props;
return ( return (
<div> <div>
{
this.state.isFetched == false && this.state.isDocumentNotFound == false &&
<div className="container">
<div className="row justify-content-center">
<div className="content-loading">
<div className="form-group row">
<h3 className="text-center">Retrieving Data </h3>
<ReactLoading type="bubbles" color="dark" width="40px" height="20px"></ReactLoading>
</div>
</div>
</div>
</div>
}
{ {
this.state.isNotValidLocation == true && this.state.isNotValidLocation == true &&
<div className="header-top-2"> <div className="header-top-2">
...@@ -150,7 +164,7 @@ class PreviewDocument extends Component { ...@@ -150,7 +164,7 @@ class PreviewDocument extends Component {
</div> </div>
<hr /> <hr />
<h3 className="text-center">Sejarah Dokumen</h3><br /> <h3 className="text-center">Sejarah Dokumen</h3><br />
<table className="my-table table table-striped table-hover"> <table className="my-table table table-bordered">
<thead> <thead>
<tr> <tr>
<th className="col-xl-4 col-lg-4 col-md-4 col-sm-4">Revisi</th> <th className="col-xl-4 col-lg-4 col-md-4 col-sm-4">Revisi</th>
......
...@@ -7,7 +7,7 @@ const PrivateRoute = ({ component: Component, ...rest }) => { ...@@ -7,7 +7,7 @@ const PrivateRoute = ({ component: Component, ...rest }) => {
{...rest} {...rest}
render={ render={
props => props =>
localStorage.getItem('user') ? ( localStorage.getItem("user") ? (
<Component {...props} /> <Component {...props} />
) : ( ) : (
<Redirect to={{ pathname: '/', state: { from: props.location } }} /> <Redirect to={{ pathname: '/', state: { from: props.location } }} />
......
import React, { Component } from 'react'; import React, { Component } from 'react';
import { Button } from 'reactstrap'; import { Button } from 'reactstrap';
import { connect } from 'react-redux';
import axios from 'axios'; import axios from 'axios';
import Navbar1 from './Navbar'; import Navbar1 from './Navbar';
import { DataTableYourDocument } from './DataTableYourDocument'; import { DataTableYourDocument } from './DataTableYourDocument';
...@@ -21,15 +20,17 @@ class YourDocument extends Component { ...@@ -21,15 +20,17 @@ class YourDocument extends Component {
parseString(response1.data, function (err, result) { parseString(response1.data, function (err, result) {
user_id = result.user_dataCollection.user_data[0].user_id[0]; user_id = result.user_dataCollection.user_data[0].user_id[0];
}) })
console.log("User id", user_id);
let response2 = await axios.get(process.env.REACT_APP_MAIN_APIURL + '/DocumentManagement/yourdocument/' + user_id, { headers: { 'accept': 'application/xml' } }); let response2 = await axios.get(process.env.REACT_APP_MAIN_APIURL + '/DocumentManagement/yourdocument/' + user_id, { headers: { 'accept': 'application/xml' } });
let data; let data;
parseString(response2.data, function (err, result) { parseString(response2.data, function (err, result) {
data = result.documentCollection.document; data = result.documentCollection.document;
}) })
console.log("Data", data);
if (data != undefined) { if (data != undefined) {
for (let i = 0; i < data.length; i++) { for (let i = 0; i < data.length; i++) {
let datarow = []; let datarow = [];
datarow.push(i+1); datarow.push("");
datarow.push(data[i].doc_code[0]); datarow.push(data[i].doc_code[0]);
datarow.push(data[i].subject[0]); datarow.push(data[i].subject[0]);
datarow.push(data[i].doc_status[0]); datarow.push(data[i].doc_status[0]);
...@@ -37,10 +38,10 @@ class YourDocument extends Component { ...@@ -37,10 +38,10 @@ class YourDocument extends Component {
datarow.push(JSON.parse(localStorage.getItem("user"))["Full Name"]) datarow.push(JSON.parse(localStorage.getItem("user"))["Full Name"])
this.state.dataDocument.push(datarow); this.state.dataDocument.push(datarow);
} }
this.setState({ fetchStatus: true})
} }
this.setState({ fetchStatus: true })
} catch (error) { } catch (error) {
this.setState({ fetchStatus: true}) this.setState({ fetchStatus: true })
console.log(error + ""); console.log(error + "");
} }
} }
...@@ -49,26 +50,20 @@ class YourDocument extends Component { ...@@ -49,26 +50,20 @@ class YourDocument extends Component {
return ( return (
<div> <div>
<Navbar1 menu="yourdocument" /><br /> <Navbar1 menu="yourdocument" /><br />
{ <div className="container-fluid">
this.state.fetchStatus == true && <div className="form-group row">
<div className="container-fluid"> <div className="col-xl-12 col-lg-12 col-md-12 col-sm-12">
<div className="form-group row"> <Button className="center-block" color="primary" href="/formcreatedocument" disabled={ !localStorage.getItem("loginUserRole").includes("Creator") }>Create New Document</Button>
<div className="col-xl-12 col-lg-12 col-md-12 col-sm-12">
<Button className="center-block" color="primary" href="/formcreatedocument">Create New Document</Button>
</div>
</div> </div>
<DataTableYourDocument data={this.state.dataDocument}></DataTableYourDocument>
</div> </div>
} {
this.state.fetchStatus == true &&
<DataTableYourDocument data={this.state.dataDocument}></DataTableYourDocument>
}
</div>
</div> </div>
) )
} }
} }
const mapStateToProps = (state) => { export default YourDocument;
return { \ No newline at end of file
session: state.session
}
}
export default connect(mapStateToProps)(YourDocument);
\ No newline at end of file
import React from 'react'
import { Redirect, Route } from 'react-router-dom'
const YourDocumentRoute = ({ component: Component, ...rest }) => {
return (
<Route
{...rest}
render={
props =>
localStorage.getItem("user") && localStorage.getItem("loginUserRole") != "View" ? (
<Component {...props} />
) : (
<Redirect to={{ pathname: '/', state: { from: props.location } }} />
)
}
/>
)
}
export default YourDocumentRoute;
\ No newline at end of file
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