with nearly finished form and report creator
This commit is contained in:
parent
5ada72873f
commit
7c2d0ae96c
6 changed files with 250 additions and 67 deletions
|
|
@ -15,7 +15,6 @@ import ObjektkatalogApi from './ObjektkatalogApi';
|
||||||
////////////////////
|
////////////////////
|
||||||
|
|
||||||
export async function fillTemplate(log, objectData) {
|
export async function fillTemplate(log, objectData) {
|
||||||
|
|
||||||
let buffer;
|
let buffer;
|
||||||
// Create docx document.
|
// Create docx document.
|
||||||
if (objectData.httpStatus === 200) {
|
if (objectData.httpStatus === 200) {
|
||||||
|
|
@ -26,24 +25,23 @@ export async function fillTemplate(log, objectData) {
|
||||||
buffer = await createReport({
|
buffer = await createReport({
|
||||||
template,
|
template,
|
||||||
data: {
|
data: {
|
||||||
inventarnummer: objectData.inventarnummer,
|
inventarnummer: objectData.inventarnummer ? objectData.inventarnummer : 'unbekannt' ,
|
||||||
titel: objectData.titel,
|
titel: objectData.titel ? objectData.titel : 'unbekannt',
|
||||||
hersteller: objectData.hersteller,
|
hersteller: objectData.hersteller ? objectData.hersteller : 'unbekannt',
|
||||||
herstellungsort: objectData.herstellungsort,
|
herstellungsort: objectData.herstellungsort ? objectData.herstellungsort : 'unbekannt',
|
||||||
herstellungsdatum: objectData.herstellungsdatum,
|
herstellungsdatum: objectData.herstellungsdatum ? objectData.herstellungsdatum : 'unbekannt',
|
||||||
materialTechnik: objectData.materialTechnik,
|
materialTechnik: objectData.materialTechnik ? objectData.materialTechnik : 'unbekannt' ,
|
||||||
masse: objectData.masse
|
masse: objectData.masse ? objectData.masse : 'unbekannt'
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
log = {
|
log = {
|
||||||
...log,
|
...log,
|
||||||
status: 'red',
|
status: 'red',
|
||||||
message: 'Konnte Template nicht öffnen: ' + err,
|
message: 'Konnte Template nicht erstellen: ' + err,
|
||||||
tip: 'Ist das Template vorhanden?',
|
tip: 'Ist das Template vorhanden?',
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
const folderPath = path.join(config.rootDir, objectData.inventarnummer);
|
const folderPath = path.join(config.rootDir, objectData.inventarnummer);
|
||||||
// Create Folder if necessary.
|
// Create Folder if necessary.
|
||||||
try {
|
try {
|
||||||
|
|
@ -51,20 +49,23 @@ export async function fillTemplate(log, objectData) {
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
log = {
|
log = {
|
||||||
...log,
|
...log,
|
||||||
status: 'green',
|
status: 'red',
|
||||||
message: 'Konnte den Pfad nicht erstellen' + err,
|
message: 'Konnte den Pfad nicht erstellen' + err,
|
||||||
tip: 'Bestehen Schreibrechte auf dem Ordner?'
|
tip: 'Bestehen Schreibrechte auf dem Ordner?'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Write document to disk.
|
// Write document to disk.
|
||||||
|
|
||||||
if (buffer) {
|
if (buffer) {
|
||||||
fs.writeFileSync(path.join(folderPath, 'report.docx'), buffer)
|
console.log(objectData)
|
||||||
|
fs.writeFileSync(path.join(folderPath, objectData.titel), buffer)
|
||||||
log = {
|
log = {
|
||||||
...log,
|
...log,
|
||||||
status: 'green',
|
status: 'green',
|
||||||
message: 'Dokument erstellt',
|
message: 'Dokument erstellt',
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
log = {
|
log = {
|
||||||
status: 'red',
|
status: 'red',
|
||||||
|
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
||||||
/* Main CSS file */
|
|
||||||
|
|
||||||
@import '_example/_example.css';
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
/* Example stylesheet */
|
|
||||||
@media screen and (prefers-color-scheme: light), screen and (prefers-color-scheme: no-preference) {
|
|
||||||
/* Light theme */
|
|
||||||
body{
|
|
||||||
color: #000;
|
|
||||||
background-color: #fff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (prefers-color-scheme: dark) {
|
|
||||||
/* Dark theme */
|
|
||||||
body {
|
|
||||||
color: #fff;
|
|
||||||
background-color: #000;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
h1 {
|
|
||||||
font-family: Helvetica, Arial, sans-serif;
|
|
||||||
font-size: 21px;
|
|
||||||
font-weight: 200;
|
|
||||||
}
|
|
||||||
|
|
@ -20,6 +20,16 @@ body {
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.checkup {
|
||||||
|
transition: height 1s;
|
||||||
|
height: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.closed{
|
||||||
|
height: 0;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
.column {
|
.column {
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
}
|
}
|
||||||
|
|
@ -82,6 +92,14 @@ input {
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
input[type="date"]::-webkit-calendar-picker-indicator {
|
||||||
|
color: #d5d5d5;
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
border-width: thin;
|
||||||
|
filter: invert(1);
|
||||||
|
}
|
||||||
|
|
||||||
input:focus {
|
input:focus {
|
||||||
background-color: #d5d5d5;
|
background-color: #d5d5d5;
|
||||||
color: #00152E;
|
color: #00152E;
|
||||||
|
|
@ -97,7 +115,7 @@ input.edit-input:not(:disabled) {
|
||||||
background-color: #00152E ;
|
background-color: #00152E ;
|
||||||
color: #d5d5d5;
|
color: #d5d5d5;
|
||||||
font-size: medium;
|
font-size: medium;
|
||||||
|
font-family: roboto, sans-serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -118,7 +136,14 @@ label {
|
||||||
font-size: 0.75em;
|
font-size: 0.75em;
|
||||||
height: 5em;
|
height: 5em;
|
||||||
}
|
}
|
||||||
|
.no-overflow {
|
||||||
|
overflow: hidden;
|
||||||
|
height: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
.open {
|
||||||
|
height: 700px;
|
||||||
|
}
|
||||||
p {
|
p {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
@ -1,9 +1,6 @@
|
||||||
// Components
|
// Components
|
||||||
import {DataForm} from "./DataForm";
|
import {DataForm} from "./DataForm";
|
||||||
import {Log} from "./Log"
|
import {Log} from "./Log"
|
||||||
|
|
||||||
// Modules
|
|
||||||
import {fillTemplate} from "../DocxInserter";
|
|
||||||
import SettingsIcon from '@mui/icons-material/Settings';
|
import SettingsIcon from '@mui/icons-material/Settings';
|
||||||
|
|
||||||
// React
|
// React
|
||||||
|
|
@ -11,7 +8,7 @@ import { Link } from "react-router-dom";
|
||||||
import React, {useState} from 'react'
|
import React, {useState} from 'react'
|
||||||
|
|
||||||
// CSS
|
// CSS
|
||||||
import '../styles.css'
|
import '../assets/css/styles.css'
|
||||||
import ObjektkatalogApi from "../ObjektkatalogApi";
|
import ObjektkatalogApi from "../ObjektkatalogApi";
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -19,10 +16,8 @@ import ObjektkatalogApi from "../ObjektkatalogApi";
|
||||||
// Main //
|
// Main //
|
||||||
////////////////////
|
////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
export const App = () => {
|
export const App = () => {
|
||||||
let log;
|
|
||||||
|
|
||||||
// States
|
// States
|
||||||
|
|
||||||
|
|
@ -42,6 +37,7 @@ export const App = () => {
|
||||||
|
|
||||||
const [objectData, setObjectData] = useState(
|
const [objectData, setObjectData] = useState(
|
||||||
{
|
{
|
||||||
|
datum: '',
|
||||||
inventarnummer: '',
|
inventarnummer: '',
|
||||||
titel: '',
|
titel: '',
|
||||||
hersteller: '',
|
hersteller: '',
|
||||||
|
|
@ -65,18 +61,38 @@ export const App = () => {
|
||||||
// Get objectId from user input.
|
// Get objectId from user input.
|
||||||
let objectId = document.getElementById('object-id').value
|
let objectId = document.getElementById('object-id').value
|
||||||
|
|
||||||
|
if (objectId) {
|
||||||
|
|
||||||
// Get object data from objektkatalog.gnm.de
|
// Get object data from objektkatalog.gnm.de
|
||||||
let objektkatalogApi = new ObjektkatalogApi();
|
let objektkatalogApi = new ObjektkatalogApi();
|
||||||
let objectData = await objektkatalogApi.getData(objectId);
|
let receivedObjectData = await objektkatalogApi.getData(objectId);
|
||||||
|
if (receivedObjectData.httpStatus === 404) {
|
||||||
console.log(objectData)
|
|
||||||
|
|
||||||
log = await fillTemplate(log, objectData);
|
|
||||||
// Set new state of log div with message and visibility class
|
|
||||||
setLogState({
|
setLogState({
|
||||||
log: log,
|
log: {
|
||||||
logStatus: 'active'
|
status: 'red',
|
||||||
});
|
message: 'Kein Objekt mit dieser Inventarnummer gefunden!',
|
||||||
|
code: '',
|
||||||
|
tip:'',
|
||||||
|
}, // with message, code, tip
|
||||||
|
logClass: 'active'
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
console.log(receivedObjectData)
|
||||||
|
// Fill and open check up form
|
||||||
|
setObjectData(receivedObjectData)
|
||||||
|
setCheckUpVisibility(true)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
setLogState({
|
||||||
|
log: {
|
||||||
|
status: 'red',
|
||||||
|
message: 'Bitte Inventarnummer eingeben!',
|
||||||
|
code: '',
|
||||||
|
tip:'',
|
||||||
|
}, // with message, code, tip
|
||||||
|
logClass: 'active'
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|
@ -108,7 +124,13 @@ export const App = () => {
|
||||||
|
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
<DataForm/>
|
<DataForm
|
||||||
|
className={checkUpVisibility ? 'open' : 'closed'}
|
||||||
|
objectData={objectData}
|
||||||
|
setObjectData={setObjectData}
|
||||||
|
logState={logState}
|
||||||
|
setLogState={setLogState}
|
||||||
|
/>
|
||||||
</main>
|
</main>
|
||||||
<footer>
|
<footer>
|
||||||
{/* We give state and state setter of the parent as params to the child components, so that child events can change parent states */}
|
{/* We give state and state setter of the parent as params to the child components, so that child events can change parent states */}
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,6 @@
|
||||||
|
// Modules
|
||||||
|
import {fillTemplate} from "../DocxInserter";
|
||||||
|
|
||||||
// React
|
// React
|
||||||
import React from 'react'
|
import React from 'react'
|
||||||
|
|
||||||
|
|
@ -5,38 +8,195 @@ import React from 'react'
|
||||||
// Main //
|
// Main //
|
||||||
////////////////////
|
////////////////////
|
||||||
|
|
||||||
export const DataForm = () => {
|
export const DataForm = ({className, objectData, setObjectData, logState, setLogState}) => {
|
||||||
return (<div>
|
let log;
|
||||||
<form className={'flex column'}>
|
|
||||||
|
// Handlers
|
||||||
|
|
||||||
|
const datumChangeHandler = (e) => {
|
||||||
|
console.log(e.target.form.datum.value)
|
||||||
|
setObjectData((prevState) => {
|
||||||
|
return {
|
||||||
|
...prevState,
|
||||||
|
datum: e.target.form.datum.value
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const inventarnummerChangeHandler = (e) => {
|
||||||
|
setObjectData((prevState) => {
|
||||||
|
return {
|
||||||
|
...prevState,
|
||||||
|
inventarnummer: e.target.form.inventarnummer.value
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const titelChangeHandler = (e) => {
|
||||||
|
setObjectData((prevState) => {
|
||||||
|
return {
|
||||||
|
...prevState,
|
||||||
|
titel: e.target.form.titel.value
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const herstellerChangeHandler = (e) => {
|
||||||
|
setObjectData((prevState) => {
|
||||||
|
return {
|
||||||
|
...prevState,
|
||||||
|
hersteller: e.target.form.hersteller.value
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const herstellungsortChangeHandler = (e) => {
|
||||||
|
setObjectData((prevState) => {
|
||||||
|
return {
|
||||||
|
...prevState,
|
||||||
|
herstellungsort: e.target.form.herstellungsort.value
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const herstellungsdatumChangeHandler = (e) => {
|
||||||
|
setObjectData((prevState) => {
|
||||||
|
return {
|
||||||
|
...prevState,
|
||||||
|
herstellungsdatum: e.target.form.herstellungsdatum.value
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const materialTechnikChangeHandler = (e) => {
|
||||||
|
setObjectData((prevState) => {
|
||||||
|
return {
|
||||||
|
...prevState,
|
||||||
|
materialTechnik: e.target.form.materialTechnik.value
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const masseChangeHandler = (e) => {
|
||||||
|
setObjectData((prevState) => {
|
||||||
|
return {
|
||||||
|
...prevState,
|
||||||
|
masse: e.target.form.masse.value
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const fillTemplateClickHandler = async (e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
console.log(objectData, 'parentobjectData')
|
||||||
|
log = await fillTemplate(logState, objectData);
|
||||||
|
// Set new state of log div with message and visibility class
|
||||||
|
setLogState({
|
||||||
|
log: log,
|
||||||
|
logStatus: 'active'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Default date of today
|
||||||
|
let today = new Date()
|
||||||
|
let todayFormat = today.getFullYear() + '-' + (String(today.getMonth() + 1).padStart(2, '0')) + '-' + String(today.getDate()).padStart(2, '0'); ;
|
||||||
|
|
||||||
|
return (<div className={'checkup ' + className}>
|
||||||
|
<form className={'flex column no-overflow'}>
|
||||||
|
<div >
|
||||||
|
<label htmlFor={'template-datum'} >Datum</label>
|
||||||
|
<input
|
||||||
|
id={"template-datum"}
|
||||||
|
name={"datum"}
|
||||||
|
type={"date"}
|
||||||
|
className={"full input-field"}
|
||||||
|
defaultValue={todayFormat}
|
||||||
|
onChange={datumChangeHandler}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
<div >
|
<div >
|
||||||
<label htmlFor={'template-inventarnummer'} >Inventarnummer</label>
|
<label htmlFor={'template-inventarnummer'} >Inventarnummer</label>
|
||||||
<input className={"full input-field"}/>
|
<input
|
||||||
|
id={"template-inventarnummer"}
|
||||||
|
name={"inventarnummer"}
|
||||||
|
type={"text"}
|
||||||
|
className={"full input-field"}
|
||||||
|
defaultValue={objectData.inventarnummer}
|
||||||
|
onChange={inventarnummerChangeHandler}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div >
|
<div >
|
||||||
<label htmlFor={'template-titel'}>Titel</label>
|
<label htmlFor={'template-titel'}>Titel</label>
|
||||||
<input type={"text"} className={"full input-field"}/>
|
<input
|
||||||
|
id={"template-titel"}
|
||||||
|
name={"titel"}
|
||||||
|
type={"text"}
|
||||||
|
className={"full input-field"}
|
||||||
|
defaultValue={objectData.titel}
|
||||||
|
onChange={titelChangeHandler}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<label htmlFor={'template-hersteller'}>Hersteller</label>
|
<label htmlFor={'template-hersteller'}>Hersteller</label>
|
||||||
<input type={"text"} className={"full input-field"}/>
|
<input
|
||||||
|
id={"template-hersteller"}
|
||||||
|
name={"hersteller"}
|
||||||
|
type={"text"}
|
||||||
|
className={"full input-field"}
|
||||||
|
defaultValue={objectData.hersteller}
|
||||||
|
onChange={herstellerChangeHandler}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<label htmlFor={'template-herstellungsort'}>Herstellungsort</label>
|
<label htmlFor={'template-herstellungsort'}>Herstellungsort</label>
|
||||||
<input type={"text"} className={"full input-field"}/>
|
<input
|
||||||
|
id={"template-herstellungsort"}
|
||||||
|
name={"herstellungsort"}
|
||||||
|
type={"text"}
|
||||||
|
className={"full input-field"}
|
||||||
|
defaultValue={objectData.herstellungsort}
|
||||||
|
onChange={herstellungsortChangeHandler}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div >
|
<div >
|
||||||
<label htmlFor={'template-herstellungsdatum'}>Herstellungsdatum</label>
|
<label htmlFor={'template-herstellungsdatum'}>Herstellungsdatum</label>
|
||||||
<input type={"text"} className={"full input-field"}/>
|
<input
|
||||||
|
id={"template-herstellungsdatum"}
|
||||||
|
name={"herstellungsdatum"}
|
||||||
|
type={"text"}
|
||||||
|
className={"full input-field"}
|
||||||
|
defaultValue={objectData.herstellungsdatum}
|
||||||
|
onChange={herstellungsdatumChangeHandler}
|
||||||
|
/>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div >
|
<div >
|
||||||
<label htmlFor={'template-materialTechnik'}>Material und Technik</label>
|
<label htmlFor={'template-materialTechnik'}>Material und Technik</label>
|
||||||
<input type={"text"} className={"full input-field"}/>
|
<input
|
||||||
|
id={"template-materialTechnik"}
|
||||||
|
name={"materialTechnik"}
|
||||||
|
type={"text"}
|
||||||
|
className={"full input-field"}
|
||||||
|
defaultValue={objectData.materialTechnik}
|
||||||
|
onChange={materialTechnikChangeHandler}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<label htmlFor={'template-masse'}>Maße</label>
|
<label htmlFor={'template-masse'}>Maße</label>
|
||||||
<input type={"text"} className={"full input-field"}/>
|
<input
|
||||||
|
id={"template-masse"}
|
||||||
|
name={"masse"}
|
||||||
|
type={"text"}
|
||||||
|
className={"full input-field"}
|
||||||
|
defaultValue={objectData.masse}
|
||||||
|
onChange={masseChangeHandler}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<button type={"submit"} className={'send-button center top-distance'} >Dokument erstellen</button>
|
<button
|
||||||
|
type={"submit"}
|
||||||
|
className={'send-button center top-distance'}
|
||||||
|
onClick={fillTemplateClickHandler}
|
||||||
|
>Dokument erstellen</button>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue