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 },
],
columnDefs: [
{ {
"title": "Action", targets: [-1], render: function (data, type, row) {
"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>";
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>";
} }
}, },
] {
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;
......
...@@ -607,6 +607,16 @@ class FormCreate extends Component { ...@@ -607,6 +607,16 @@ class FormCreate extends Component {
await this.setState({ submitForm: true }) await this.setState({ submitForm: true })
var js2xmlparser = require('js2xmlparser'); var js2xmlparser = require('js2xmlparser');
var parseString = require('xml2js').parseString; var parseString = require('xml2js').parseString;
// Check is exist document with same subject
let responseDataCheckSubject = await axios.get(process.env.REACT_APP_MAIN_APIURL + '/DocumentManagement/document/' + this.state.subject, { headers: { 'accept': 'application/xml' } })
let dataCheckSubject;
parseString(responseDataCheckSubject.data, function (err, result) {
dataCheckSubject = result.documentCollection.document;
})
if (dataCheckSubject != undefined && dataCheckSubject[0].doc_code[0].includes(this.state.businessUnit)) {
this.setState({ submitForm: false })
alert("Document with same subject is already exist in your department!");
} else {
//Get All Data Login //Get All Data Login
let responseDataLogin = await axios.get(process.env.REACT_APP_MAIN_APIURL + '/DocumentManagement/userkey/' + JSON.parse(localStorage.getItem("user")).Email, { headers: { 'accept': 'application/xml' } }) let responseDataLogin = await axios.get(process.env.REACT_APP_MAIN_APIURL + '/DocumentManagement/userkey/' + JSON.parse(localStorage.getItem("user")).Email, { headers: { 'accept': 'application/xml' } })
let user_id, doc_id; let user_id, doc_id;
...@@ -669,6 +679,7 @@ class FormCreate extends Component { ...@@ -669,6 +679,7 @@ class FormCreate extends Component {
this.props.history.push("/yourdocument") this.props.history.push("/yourdocument")
} }
} }
}
} catch (error) { } catch (error) {
await this.setState({ submitForm: false }) await this.setState({ submitForm: false })
alert(error + ""); alert(error + "");
......
...@@ -150,6 +150,13 @@ class FormCreateUpdateRole extends Component { ...@@ -150,6 +150,13 @@ class FormCreateUpdateRole extends Component {
} else { } else {
try { try {
await this.setState({ submitForm: true }) await this.setState({ submitForm: true })
let responseCheckDataUser = await axios.get(process.env.REACT_APP_MAIN_APIURL + '/DocumentManagement/userkey/' + this.state.email, { headers: { 'accept': 'application/xml' } })
console.log();
let checkDataUser;
parseString(responseCheckDataUser.data, function (err, result) {
checkDataUser = result.user_dataCollection.user_data;
})
if (checkDataUser == undefined) {
let uri_email = encodeURIComponent(this.state.email); 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"; 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, { fetch('http://10.10.88.12:8280/empyl/1.0.0/employee/' + uri_email, {
...@@ -188,6 +195,10 @@ class FormCreateUpdateRole extends Component { ...@@ -188,6 +195,10 @@ class FormCreateUpdateRole extends Component {
alert("Email is invalid!") alert("Email is invalid!")
} }
}) })
} else {
this.setState({ submitForm: false })
alert("Email is already exist");
}
} 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 {
let responseDataLoginLDAP = await axios.get('/signin', {
params: { params: {
uid: this.state.username, uid: this.state.username,
pwd: this.state.password, pwd: this.state.password,
key: '2ffb2a00a3abe029fdebae5e1d417ebcb04b7e103a0cd8b54763051cef08bc55' key: '2ffb2a00a3abe029fdebae5e1d417ebcb04b7e103a0cd8b54763051cef08bc55'
} }
}) })
.then((res) => { if (responseDataLoginLDAP.data.code == 401) {
if(res.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 (error) {
this.setState({ isLoginFailed: true, loggingIn: false, errMessage: "" + error })
} }
})
.catch((err) => {
this.setState({ isLoginFailed: true, loggingIn: false, errMessage: "" + err })
});
// 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 />
{
this.state.fetchStatus == true &&
<div className="container-fluid"> <div className="container-fluid">
<div className="form-group row"> <div className="form-group row">
<div className="col-xl-12 col-lg-12 col-md-12 col-sm-12"> <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> <Button className="center-block" color="primary" href="/formcreateupdaterole">Add User</Button>
</div> </div>
</div> </div>
{
this.state.fetchStatus == true &&
<DataTableManageUser data={this.state.dataUser}></DataTableManageUser> <DataTableManageUser data={this.state.dataUser}></DataTableManageUser>
</div>
} }
</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,6 +24,8 @@ const Navbar1 = (props) => { ...@@ -24,6 +24,8 @@ const Navbar1 = (props) => {
</SvgIcon> Home </SvgIcon> Home
</NavLink> </NavLink>
</NavItem> </NavItem>
{
localStorage.getItem("loginUserRole") != "View" &&
<NavItem> <NavItem>
<NavLink className={"text-" + (props.menu == "yourdocument" ? "warning" : "light")} href="/yourdocument"> <NavLink className={"text-" + (props.menu == "yourdocument" ? "warning" : "light")} href="/yourdocument">
<SvgIcon> <SvgIcon>
...@@ -31,6 +33,9 @@ const Navbar1 = (props) => { ...@@ -31,6 +33,9 @@ const Navbar1 = (props) => {
</SvgIcon> Your Document </SvgIcon> Your Document
</NavLink> </NavLink>
</NavItem> </NavItem>
}
{
localStorage.getItem("loginUserRole").includes("Admin") &&
<NavItem> <NavItem>
<NavLink className={"text-" + (props.menu == "manageuser" ? "warning" : "light")} href="/manageuser"> <NavLink className={"text-" + (props.menu == "manageuser" ? "warning" : "light")} href="/manageuser">
<SvgIcon> <SvgIcon>
...@@ -38,6 +43,7 @@ const Navbar1 = (props) => { ...@@ -38,6 +43,7 @@ const Navbar1 = (props) => {
</SvgIcon> Manage User </SvgIcon> Manage User
</NavLink> </NavLink>
</NavItem> </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 />
{
this.state.fetchStatus == true &&
<div className="container-fluid"> <div className="container-fluid">
<div className="form-group row"> <div className="form-group row">
<div className="col-xl-12 col-lg-12 col-md-12 col-sm-12"> <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> <Button className="center-block" color="primary" href="/formcreatedocument" disabled={ !localStorage.getItem("loginUserRole").includes("Creator") }>Create New Document</Button>
</div> </div>
</div> </div>
{
this.state.fetchStatus == true &&
<DataTableYourDocument data={this.state.dataDocument}></DataTableYourDocument> <DataTableYourDocument data={this.state.dataDocument}></DataTableYourDocument>
</div>
} }
</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