with nearly finished form and report creator

This commit is contained in:
Robert Nasarek 2022-08-25 16:04:06 +02:00
parent 5ada72873f
commit 7c2d0ae96c
6 changed files with 250 additions and 67 deletions

View file

@ -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',

View file

@ -1,3 +0,0 @@
/* Main CSS file */
@import '_example/_example.css';

View file

@ -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;
}

View file

@ -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;
} }

View file

@ -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
// Get object data from objektkatalog.gnm.de if (objectId) {
let objektkatalogApi = new ObjektkatalogApi();
let objectData = await objektkatalogApi.getData(objectId);
console.log(objectData) // Get object data from objektkatalog.gnm.de
let objektkatalogApi = new ObjektkatalogApi();
log = await fillTemplate(log, objectData); let receivedObjectData = await objektkatalogApi.getData(objectId);
// Set new state of log div with message and visibility class if (receivedObjectData.httpStatus === 404) {
setLogState({
log: {
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({ setLogState({
log: log, log: {
logStatus: 'active' 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 */}

View file

@ -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>
) )