From 9605a5b9723069cffbc2378298dd89ab86a958a1 Mon Sep 17 00:00:00 2001 From: Robert Nasarek Date: Thu, 8 Sep 2022 15:50:11 +0200 Subject: [PATCH] before restructering project --- .gitignore | 1 + electron-builder.json | 32 ++ main.js | 12 +- marvin256x256.png | Bin 0 -> 18521 bytes package.json | 23 +- resources/files/config/config.json | 3 - src/DocCreator.js | 478 ++++++++++++++++++ src/DocxInserter.js | 116 ----- src/Image.js | 30 ++ src/ObjektkatalogApi.js | 17 + src/assets/config/config.json | 3 + src/assets/css/styles.css | 53 +- .../assets}/images/marvin16x16.png | Bin .../assets}/templates/a-template.docx | Bin .../assets}/templates/lbb-template.docx | Bin .../assets}/templates/rp-template.docx | Bin src/components/App.js | 83 +-- src/components/DataForm.js | 18 +- src/components/Galary.js | 22 + src/components/Log.js | 6 +- src/routes/settings.js | 40 +- webpack.dev.config.js | 6 +- 22 files changed, 733 insertions(+), 210 deletions(-) create mode 100644 electron-builder.json create mode 100644 marvin256x256.png delete mode 100644 resources/files/config/config.json create mode 100644 src/DocCreator.js delete mode 100644 src/DocxInserter.js create mode 100644 src/Image.js create mode 100644 src/assets/config/config.json rename {resources/files => src/assets}/images/marvin16x16.png (100%) rename {resources/files => src/assets}/templates/a-template.docx (100%) rename {resources/files => src/assets}/templates/lbb-template.docx (100%) rename {resources/files => src/assets}/templates/rp-template.docx (100%) create mode 100644 src/components/Galary.js diff --git a/.gitignore b/.gitignore index 2a8f3c9..a6fc37f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ # Build folder and files # ########################## builds/ +installers/ # Development folders and files # ################################# diff --git a/electron-builder.json b/electron-builder.json new file mode 100644 index 0000000..6c17fbf --- /dev/null +++ b/electron-builder.json @@ -0,0 +1,32 @@ +{ + "appId": "org.nasarek.marvin", + "win": { + "target": "NSIS", + "icon": "marvin256x256.ico" + }, + "nsis": { + "oneClick": false, + "installerIcon": "marvin256x256.ico", + "uninstallerIcon": "marvin256x256.ico", + "allowToChangeInstallationDirectory": true + }, + "linux": { + "target": "deb", + "category": "Utility", + "icon": "marvin256x256.png" + }, + "files": [ + "*.js", + "**/*", + "./dist/bundle.css", + "./dist/index.html", + "./dist/main.js", + "./dist/main.js.LICENSE.txt", + "node_modules" + ], + "extraResources": [{ + "from": "resources/files", + "to": "files" + } + ] +} diff --git a/main.js b/main.js index 1429c87..d2b5099 100644 --- a/main.js +++ b/main.js @@ -142,6 +142,16 @@ let mainMenu = Menu.buildFromTemplate( ] ) +const RESOURCES_PATH = app.isPackaged + ? path.join(process.resourcesPath, 'assets') + : path.join(__dirname, '../../assets'); + +console.log(process.resourcesPath); +console.log(__dirname); + +const getAssetPath = (paths) => { + return path.join(RESOURCES_PATH, paths); +}; function createWindow(dimensions) { if (dev !== true) { @@ -255,5 +265,3 @@ app.on('activate', () => { } }) - -// IPC-Channel handling diff --git a/marvin256x256.png b/marvin256x256.png new file mode 100644 index 0000000000000000000000000000000000000000..1c861b8f7b7e2806049ad9e51e2cbe1bf2e8e49b GIT binary patch literal 18521 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 literal 0 HcmV?d00001 diff --git a/package.json b/package.json index 3fe99d2..ed4e429 100644 --- a/package.json +++ b/package.json @@ -33,25 +33,9 @@ "prod": "cross-env NODE_ENV=production webpack --mode production --config webpack.build.config.js && electron --noDevServer .", "start": "cross-env NODE_ENV=development webpack serve --hot --host 0.0.0.0 --config=./webpack.dev.config.js --mode development", "build": "cross-env NODE_ENV=production webpack --config webpack.build.config.js --mode production", - "installer": "electron-builder", + "pack:installer": "electron-builder build -lw", "package": "npm run build", - "postpackage": "electron-packager ./ --ignore 'resources/files' --out=./builds --asar --overwrite --platform win32,linux --icon marvin.ico --extra-resource 'resources/files'" - }, - "build": { - "appId": "marvin", - "win": { - "target": [ - "nsis" - ], - "icon": "marvin256x256.ico" - }, - "nsis": { - "oneClick": false, - "installerIcon": "marvin.ico", - "uninstallerIcon": "marvin.ico", - "uninstallDisplayName": "Marvin-Uninstaller", - "allowToChangeInstallationDirectory": true - } + "postpackage": "electron-packager ./ --ignore \"(resources|builds|installer)\" --out=./builds --overwrite --platform win32,linux --icon marvin.ico --extra-resource 'resources/files'" }, "dependencies": { "@emotion/react": "^11.10.0", @@ -60,10 +44,12 @@ "@mui/material": "^5.10.2", "about-window": "^1.15.2", "docx-templates": "^4.9.2", + "image-resize-compress": "^1.0.8", "postcss": "^8.4.16", "react": "^18.2.0", "react-async-devtools": "^10.0.1", "react-dom": "^18.2.0", + "react-image-gallery": "^1.2.9", "react-loader-spinner": "^5.3.3", "react-router-dom": "^6.3.0", "replace-special-characters": "^1.2.6", @@ -91,6 +77,7 @@ "postcss-nested": "^5.0.6", "postcss-preset-env": "^7.8.0", "postcss-pxtorem": "^6.0.0", + "source-map-support": "^0.5.21", "style-loader": "^3.3.1", "webpack": "^5.74.0", "webpack-cli": "^4.10.0", diff --git a/resources/files/config/config.json b/resources/files/config/config.json deleted file mode 100644 index 4ca2d73..0000000 --- a/resources/files/config/config.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "rootDir": "C:\\Users\\Robert\\Desktop\\marvin" -} \ No newline at end of file diff --git a/src/DocCreator.js b/src/DocCreator.js new file mode 100644 index 0000000..8c64deb --- /dev/null +++ b/src/DocCreator.js @@ -0,0 +1,478 @@ +// Modules +import createReport from 'docx-templates'; +import fs, {writeFile} from 'fs'; +import {mkdir} from 'node:fs/promises'; +import path from 'path'; +import replaceSpecialCharacters from "replace-special-characters"; + +import {parseString, Builder} from 'xml2js'; + + +//////////////////// +// Main // +//////////////////// + +class DocCreator { + constructor(log, objectData) { + + // Assign Log. + this.log = log; + + // Assign general object data. + this.objectData = objectData; + + // Get DateTime. + this.today = new Date(); + + // Get config file and parse to json. + this.configFile = fs.readFileSync('/resources/files/config/config.json') + this.configJson = JSON.parse(this.configFile.toString()) + + // Choose the template for selected document type. + switch (objectData.dokumenttyp) { + case 'rp': + this.documentInfo = { + documentType: 'restaurierungsprotokolle', docTypeAbbr: 'rp', templateFile: 'rp-template.docx', + } + break; + case 'lbb': + this.documentInfo = { + documentType: 'leihgabenbegleitblaetter', docTypeAbbr: 'lbb', templateFile: 'lbb-template.docx', + } + break; + case 'a': + this.documentInfo = { + documentType: 'analysen', docTypeAbbr: 'a', templateFile: 'a-template.docx', + } + break; + } + + // ObjectId normalisation. + const normCharacterObjectId = replaceSpecialCharacters(objectData.inventarnummer); + this.normObjectId = normCharacterObjectId.replace("__", "_"); + + // Title normalisation + const replaceEszettTitle = objectData.titel.replace("ß", "-ss-"); + let replaceUmlauteTitle = replaceEszettTitle.replace(/[^Ä]+/ig, "Ae"); + replaceUmlauteTitle = replaceUmlauteTitle.replace(/[^ä]+/ig, "ae"); + replaceUmlauteTitle = replaceUmlauteTitle.replace(/[^Ö]+/ig, "Oe"); + replaceUmlauteTitle = replaceUmlauteTitle.replace(/[^ö]+/ig, "oe"); + replaceUmlauteTitle = replaceUmlauteTitle.replace(/[^Ü]+/ig, "Ue"); + replaceUmlauteTitle = replaceUmlauteTitle.replace(/[^ü]+/ig, "ue"); + const normCharacterTitle = replaceSpecialCharacters(replaceUmlauteTitle); + const normSingleSpaceTitle = normCharacterTitle.replace("__", "_"); + const normSpacingTitle = normSingleSpaceTitle.replace(/[^A-Z0-9\-]+/ig, "_"); + this.normTitle = normSpacingTitle.slice(0, 50); + + const folderName = this.normObjectId + '__' + this.normTitle + this.objectPath = path.join(this.configJson.rootDir, folderName); + this.documentPath = path.join(this.objectPath, this.documentInfo.documentType, objectData.datum); + this.filename = this.normObjectId + '__' + this.normTitle + '__' + this.objectData.datum + '__' + this.objectData.dokumenttyp; + this.filenameWithExtension = this.filename + '.docx' + this.temporaryWorkDirPath = path.join(this.objectPath, 'werkstatt'); + + + } + +// Fills the docx template. + async fillTemplate() { + // Variables + let buffer; + let configJson + + // Create docx document if there was a response. + if (this.objectData.httpStatus === 200) { + try { + // Read template. + const template = fs.readFileSync(path.join('/resources/files/templates/', this.documentInfo.templateFile)); + + // Create report. + buffer = await createReport({ + template, data: { + inventarnummer: this.objectData.inventarnummer ? this.objectData.inventarnummer : 'unbekannt', + titel: this.objectData.titel ? this.objectData.titel : 'unbekannt', + hersteller: this.objectData.hersteller ? this.objectData.hersteller : 'unbekannt', + herstellungsort: this.objectData.herstellungsort ? this.objectData.herstellungsort : 'unbekannt', + herstellungsdatum: this.objectData.herstellungsdatum ? this.objectData.herstellungsdatum : 'unbekannt', + materialTechnik: this.objectData.materialTechnik ? this.objectData.materialTechnik : 'unbekannt', + masse: this.objectData.masse ? this.objectData.masse : 'unbekannt' + } + }); + } catch (err) { + // Set error log. + this.log = { + ...this.log, + status: 'red', + message: 'Konnte Template nicht erstellen: ' + err, + tip: 'Ist das Template vorhanden?', + }; + return this.log + } + + try { + const createDocumentPath = await mkdir(this.documentPath, {recursive: true}); + const createTemporaryWorkDirPath = await mkdir(this.temporaryWorkDirPath, {recursive: true}); + } catch (err) { + // Set error log. + this.log = { + ...this.log, + status: 'red', + message: 'Konnte den Pfad nicht erstellen' + err, + tip: 'Bestehen Schreibrechte auf dem Ordner?' + } + return this.log + } + + // Write document to disk. + if (buffer) { + fs.writeFileSync(path.join(this.documentPath, this.filenameWithExtension), buffer) + this.log = { + ...this.log, status: 'green', message: 'Dokument erstellt', + }; + } + + } else { + this.log = { + status: 'red', + message: 'Fehler bei der Kommunikation mit dem Objektkatalog', + code: this.objectData.httpStatus, + tip: 'Ist die Inventarnummer richtig?', + }; + } + return this.log; + } + + async createMetsMods() { + + const metsModsString = ` + + + + + ${process.env.REACT_APP_NAME} v${process.env.REACT_APP_VERSION} + + + + + + + + + + + + + + + + + + + + + + + + + + ${this.objectData.inventarnummer} + + + ${this.objectData.titel} + + + ${this.objectData.herstellungsdatum} + + ${this.objectData.herstellungsort} + + + + + cre + + ${this.objectData.herstellungsort} + ${this.objectData.herstellungsort} + + + + ${this.objectData.masse} + + + + + + + ` + + const metModsJson = { + 'mets:mets': { + $: { + 'xmlns:mets': "http://www.loc.gov/METS/", + 'xmlns:xlink': "http://www.w3.org/1999/xlink", + 'xmlns:xsi': "http://www.w3.org/2001/XMLSchema-instance", + 'xsi:schemaLocation': "info:lc/xmlns/premis-v2 http://www.loc.gov/standards/premis/v2/premis-v2-0.xsd " + + "http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-6.xsd " + + "http://www.loc.gov/METS/ http://www.loc.gov/standards/mets/version17/mets.v1-7.xsd " + + "http://www.loc.gov/mix/v10 http://www.loc.gov/standards/mix/mix10/mix10.xsd" + }, + 'mets:metsHdr': { + $: { + // Creation date of the mets/mods xml. + 'createDate': this.today // Should be w3ctdf format: YYYY-MM-DDThh:mm:ssTZD + }, + 'mets:agent': { + // App, which created the xml document + $: { + 'type': 'other', + 'otherType': 'software', + 'role': 'creator' + }, + 'mets:name': { + // App name and version + _: `${process.env.REACT_APP_NAME} v${process.env.REACT_APP_VERSION}` + } + } + }, + 'mets:fileSec': { + 'mets:fielGrp': { + $: { + // Documenttype + 'use': `${this.documentInfo.documentType}` + }, + 'mets:file': { + // Phyical file + $: { + 'id': `file__${this.filename}`, + 'mimeType': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' + }, + 'mets:FLocat': { + // Physical location - here in same folder + $: { + 'locType': 'other', + 'otherLocType': 'file', + 'xlink:href': `${this.filenameWithExtension}` + } + } + } + } + }, + 'mets:structMap': [ + { // These are solo documents only, this may be inappropriate. + $: { + // Physical structure. + 'type': 'physical' + }, + 'mets:div': { + $: { + // Documenttype and id. + 'type': `${this.documentInfo.docTypeAbbr}`, + // since we have only one document, id and dmdid are static. + 'id': `phys_00`, + 'dmdid': 'dmdphys_00' + }, + 'mets:fptr': { + $: { + // File id from above + 'fileId': `file__${this.filename}` + } + } + } + }, + { // These are solo documents only, this may be inappropriate. + $: { + // Physical structure. + 'type': 'logical' + }, + 'mets:div': { + $: { + // Documenttype and id. + 'type': `${this.documentInfo.docTypeAbbr}`, + // since we have only one document, id and dmdid are static. + 'id': `phys_00`, + 'dmdid': 'dmdphys_00' + }, + 'mets:fptr': { + $: { + // File id from above + 'fileId': `file__${this.filename}` + } + } + } + }], + 'mets:dmdSec': + { + $: { + // Since we have only one document, dmdlog is static + 'id': + `dmdlog_00` + } + , + 'mets:mdWrap': + { + $: { + 'mdType': + 'mods' + } + , + 'mets:xmlData': + { + 'mods:mods': + { + // Object properties as found at https://objektkatalog.gnm.de. + $: { + 'xmlns:mods': + 'http://www.loc.gov/mods/v3' + } + , + 'mods:recordInfo': + { + 'mods:recordIdentifier': + { + // ObjectId. + $: { + 'source': + 'https://objektkatalag.gnm.de' + } + , + _: `${this.objectData.inventarnummer}` + } + } + , + 'mods:titleInfo': + { + // Title. + 'mods:title': + { + _: `${this.objectData.titel}` + } + } + , + 'mods:originInfo': + { + // Creation date. + 'mods_dateIssued': + { + $: { + 'encoding': + 'w3cdtf', // W3C Date and Time, should be YYYY-MM-DDThh:mm:ssTZD + 'keyDate': + 'yes' + } + , + _: `${this.objectData.herstellungsdatum}` + } + , + 'mods:place': + { + // Creation place + 'mods:placeTerm': + { + $: { + 'type': + 'text' + } + , + _: `${this.objectData.herstellungsort}` + } + } + } + , + 'mods:name': + { + // Creator. + $: { + 'type': + 'personal' + } + , + 'mods:role': + { + 'mods:roleTerm': + { + $: { + 'authority': + 'marcrelator', + 'type': + 'code' + } + , + _: 'cre' + } + } + , + 'mods:namePart': + { + _: this.objectData.hersteller + } + , + 'mods:displayForm': + { + _: this.objectData.hersteller + } + } + , + 'mods:physicalDescription': + { + 'mods:form': + { + $: { + 'type': + 'Material and Technique', + 'lang': + 'de' + } + } + , + 'mods:extent': + { + _: `${this.objectData.masse}` + } + } + } + } + } + } + } + } + + let metModsXml + parseString(metsModsString, {trim: true}, + function (err, result) { + metModsXml = result; + } + ); + console.log(metModsXml, 'from string'); + + const builder = new Builder() + metModsXml = builder.buildObject(metModsJson); + console.log(metModsXml, 'from Json') + + const fileName = `.metsMods__${this.normObjectId}__${this.normTitle}.xml` + fs.writeFileSync(path.join(this.documentPath,fileName),metModsXml.toString(), + function (err) { + if (err) { + console.log(err); + } else { + console.log("The file was saved!"); + } + } + ) + return true; + } +} + +export {DocCreator}; diff --git a/src/DocxInserter.js b/src/DocxInserter.js deleted file mode 100644 index c20e80f..0000000 --- a/src/DocxInserter.js +++ /dev/null @@ -1,116 +0,0 @@ -// Modules -import createReport from 'docx-templates'; -import fs from 'fs'; -import { mkdir } from 'node:fs/promises'; -import path from 'path'; -import replaceSpecialCharacters from "replace-special-characters"; - - -//////////////////// -// Main // -//////////////////// - -// Fills the docx template. -export async function fillTemplate(log, objectData) { - // Variables - let buffer; - let configJson - - // Create docx document if there was a response. - if (objectData.httpStatus === 200) { - let documentInfo; - try { - // Load config file. - let ConfigFile = fs.readFileSync('resources/files/config/config.json') - configJson = JSON.parse(ConfigFile) - - // Choose the template for selected document type. - switch (objectData.dokumenttyp) { - case 'rp': - documentInfo = { - documentType: 'restaurierungsprotokolle', - templateFile: 'rp-template.docx', - } - break; - case 'lbb': - documentInfo = { - documentType: 'leihgabenbegleitblaetter', - templateFile: 'lbb-template.docx', - } - break; - case 'a': - documentInfo = { - documentType: 'analysen', - templateFile: 'a-template.docx', - } - break; - } - // Read template. - const template = fs.readFileSync(path.join('resources/files/templates/', documentInfo.templateFile)); - - // Create report. - buffer = await createReport({ - template, - data: { - inventarnummer: objectData.inventarnummer ? objectData.inventarnummer : 'unbekannt' , - titel: objectData.titel ? objectData.titel : 'unbekannt', - hersteller: objectData.hersteller ? objectData.hersteller : 'unbekannt', - herstellungsort: objectData.herstellungsort ? objectData.herstellungsort : 'unbekannt', - herstellungsdatum: objectData.herstellungsdatum ? objectData.herstellungsdatum : 'unbekannt', - materialTechnik: objectData.materialTechnik ? objectData.materialTechnik : 'unbekannt' , - masse: objectData.masse ? objectData.masse : 'unbekannt' - } - }); - } catch (err) { - // Set error log. - log = { - ...log, - status: 'red', - message: 'Konnte Template nicht erstellen: ' + err, - tip: 'Ist das Template vorhanden?', - }; - return log - } - - // Create folder (if necessary). - const objectPath = path.join(configJson.rootDir, objectData.inventarnummer); - const documentPath = path.join(objectPath, documentInfo.documentType); - const temporaryWorkDirPath = path.join(objectPath, 'werkstatt'); - try { - const createDocumentPath = await mkdir(documentPath, {recursive: true}); - const createTemporaryWorkDirPath = await mkdir(temporaryWorkDirPath, {recursive: true}); - } catch (err) { - // Set error log. - log = { - ...log, - status: 'red', - message: 'Konnte den Pfad nicht erstellen' + err, - tip: 'Bestehen Schreibrechte auf dem Ordner?' - } - return log - } - - // Write document to disk. - if (buffer) { - const normCharacterObjectId = replaceSpecialCharacters(objectData.inventarnummer) - const normCharacterTitle = replaceSpecialCharacters(objectData.titel) - const normSpacingTitle = normCharacterTitle.replace(/[^A-Z0-9]+/ig, "_"); - const filename = objectData.datum + '_' + normCharacterObjectId + '_' + normSpacingTitle + '.docx' - fs.writeFileSync(path.join(documentPath, filename), buffer) - log = { - ...log, - status: 'green', - message: 'Dokument erstellt', - }; - } - - } else { - log = { - status: 'red', - message: 'Fehler bei der Kommunikation mit dem Objektkatalog', - code: objectData.httpStatus, - tip: 'Ist die Inventarnummer richtig?', - }; - } - return log; -} diff --git a/src/Image.js b/src/Image.js new file mode 100644 index 0000000..bcdb8bc --- /dev/null +++ b/src/Image.js @@ -0,0 +1,30 @@ +import {blobToURL, fromURL} from "image-resize-compress"; + +class Image { + constructor(originalUri, originalHeight = '300px', originalWidth = '200px', loading = 'lazy') { + this.original = originalUri; + this.originalHeight = originalHeight; + this.originalWidth = originalWidth; + this.loading = loading; + + (async () => { + this.thumbnail = await this.convert2Thumbnail(this.original) + })(); + } + convert2Thumbnail = async (sourceUrl) => { + // quality value for webp and jpeg formats. + const quality = 80; + // output width. 0 will keep its original width and 'auto' will calculate its scale from height. + const width = 100; + // output height. 0 will keep its original height and 'auto' will calculate its scale from width. + const height = 'auto'; + // file format: png, jpeg, bmp, gif, webp. If null, original format will be used. + const format = 'webp'; + // note only the sourceUrl argument is required + let blob = await fromURL(sourceUrl, quality, width, height, format); + return await blobToURL(blob); + }; + +} + +export {Image}; diff --git a/src/ObjektkatalogApi.js b/src/ObjektkatalogApi.js index 424f497..041d6f4 100644 --- a/src/ObjektkatalogApi.js +++ b/src/ObjektkatalogApi.js @@ -18,12 +18,14 @@ class ObjektkatalogApi { masse: '', materialTechnik: '', titel: '', + wisskiUri: '', }; response; visibility; // Get data from objektkatalog.gnm.de. + async getData(objectId) { if (objectId) { // RESTful GET. @@ -50,6 +52,7 @@ class ObjektkatalogApi { eid: responseJson[0]['eid'], allgemeineBezeichnung: responseJson[0]['fc6392714594e73ddb2fa363815a8fdf'], beschreibung: responseJson[0]['f81f557caccf45074edfb65ff077011f'], + bilder: responseJson[0]['f41dae62df47283958f605716d141ebf'], darstellung: responseJson[0]['f217e1053b1e29411d4b00f3b1e1d52b'], erwerbsmethode: responseJson[0]['fa4aa035d411275cd36a2fbb5c159a2c'], fruehstes: responseJson[0]['ff4a178095c895a12fce6320c04ba0b0'], @@ -71,6 +74,7 @@ class ObjektkatalogApi { titel: responseJson[0]['f2049b2456b20f8fd80f714e154f1d47'], unterbringung: responseJson[0]['f15265e39237868a568ee63453492b17'], vitrinentext: responseJson[0]['fe5e3ff18aedf1d25c639dc79fb24ad1'], + wisskiUri: responseJson[0]['wisski_uri'][0]['value'], zustandsbeschreibung: responseJson[0]['f54b6da6006ea444c33a348b8c4370a8'] } break; @@ -118,6 +122,16 @@ class ObjektkatalogApi { return [this.receivedData, this.visibility] } + // Bilder + let bilder =[]; + if (this.raw.bilder.length !== 0) { + for (const bildIndex in this.raw.bilder) { + bilder.push(this.raw.bilder[bildIndex].url) + } + } else { + this.bilder = null; + } + // Datum // Default date of today let today = new Date() @@ -187,9 +201,11 @@ class ObjektkatalogApi { }) } + // Json with important data. this.receivedData = { ...this.receivedData, + bilder: bilder, datum: todayFormat, titel: titel, hersteller: hersteller, @@ -198,6 +214,7 @@ class ObjektkatalogApi { inventarnummer: inventarnummer, materialTechnik: materialTechnik, masse: masse, + wisskiUri: this.raw.wisskiUri, httpStatus: 200, } this.visibility = true diff --git a/src/assets/config/config.json b/src/assets/config/config.json new file mode 100644 index 0000000..99bebb3 --- /dev/null +++ b/src/assets/config/config.json @@ -0,0 +1,3 @@ +{ + "rootDir": "/home/rbrt/Schreibtisch/boehler" +} \ No newline at end of file diff --git a/src/assets/css/styles.css b/src/assets/css/styles.css index 81b89ad..d23db39 100644 --- a/src/assets/css/styles.css +++ b/src/assets/css/styles.css @@ -1,4 +1,7 @@ + + /* Imports */ @import url('https://fonts.googleapis.com/css?family=Open+Sans'); +@import "react-image-gallery/styles/css/image-gallery.css"; a { color: #d5d5d5; @@ -23,6 +26,10 @@ body { .checkup { transition: height 1s; height: 0; + display: flex; + justify-content: center; + align-items: center; + gap: 1rem; } .closed{ @@ -43,10 +50,6 @@ body { max-width: max-content; } -div { - padding: 0.5em; -} - .edit-button { background-color: #e30f27; color: #d5d5d5; @@ -55,6 +58,7 @@ div { border: unset; padding: 0 4px; height: 1.5rem; + border-radius: 0 .1875rem .1875rem 0; } .edit-input { @@ -87,6 +91,23 @@ div { background-color: darkgreen; } +h3 { + color: #464646; +} + +.image-gallery { + flex: .5 .5 50%; +} + +.image-gallery-thumbnails-container { + display: flex; + justify-content: center; +} + +.image-gallery-slide-wrapper { + margin-bottom: .5rem; +} + .inactive { display: none; } @@ -129,6 +150,10 @@ input.edit-input:not(:disabled) { font-family: "Open Sans", sans-serif; } + .justify-content-center { + display: flex; + justify-content: center; + } .justify-content-end { @@ -168,13 +193,16 @@ label { } .open { - height: 610px; + height: 100%; overflow: hidden; } p { margin: 0; } +.pd-05rem { + padding: .5rem; +} .position-absolute { position: absolute; } @@ -223,15 +251,15 @@ select { } .settings-div { - background-color: #d5d5d5; + background-color: #f2f2f2; color: black; - width: 300px; + width: 388px; border-top: none; border-right: none; border-left: none; border-bottom: 0.125rem solid #e30019; - border-radius: 0.1875rem; - overflow-x: scroll; + border-radius: .1875rem 0 0 .1875rem; + overflow-x: auto; white-space:nowrap; } @@ -256,10 +284,13 @@ textarea.select-folder-field, textarea.select-folder-field:focus, input.select-f } .v-distance { - margin-top: 0.25em; - margin-bottom: 0.25em; + margin-top: 0.25rem; + margin-bottom: 0.25rem; } +.bottom-distance { + margin-bottom: 1rem; +} /* width */ ::-webkit-scrollbar { width: 5px; diff --git a/resources/files/images/marvin16x16.png b/src/assets/images/marvin16x16.png similarity index 100% rename from resources/files/images/marvin16x16.png rename to src/assets/images/marvin16x16.png diff --git a/resources/files/templates/a-template.docx b/src/assets/templates/a-template.docx similarity index 100% rename from resources/files/templates/a-template.docx rename to src/assets/templates/a-template.docx diff --git a/resources/files/templates/lbb-template.docx b/src/assets/templates/lbb-template.docx similarity index 100% rename from resources/files/templates/lbb-template.docx rename to src/assets/templates/lbb-template.docx diff --git a/resources/files/templates/rp-template.docx b/src/assets/templates/rp-template.docx similarity index 100% rename from resources/files/templates/rp-template.docx rename to src/assets/templates/rp-template.docx diff --git a/src/components/App.js b/src/components/App.js index b643a31..42f5c48 100644 --- a/src/components/App.js +++ b/src/components/App.js @@ -1,6 +1,13 @@ // Components import {DataForm} from "./DataForm"; import {Log} from "./Log" + + +// CSS +import '../assets/css/styles.css' +import {LoadingIcon} from "./LoadingIcon"; + +// Icons import SettingsIcon from '@mui/icons-material/Settings'; // Modules @@ -10,10 +17,6 @@ import ObjektkatalogApi from "../ObjektkatalogApi"; import {NavLink} from "react-router-dom"; import React, {useState} from 'react' -// CSS -import '../assets/css/styles.css' -import {LoadingIcon} from "./LoadingIcon"; - //////////////////// // Main // @@ -91,8 +94,21 @@ export const App = () => { await setLogState({ log: { status: 'red', - message: 'Objektkatalog nicht erreichbar!', + message: 'Objektkatalog kann sich nicht um die Anfrage kümmern!', code: '503', + tip: 'Vielleicht hat der Katalog gerade sehr viele Zugriffe, probieren Sie es später noch einmal.', + }, // with message, code, tip + logClass: 'active' + }) + // Hide Loading + setIsLoading(false) + return; + case 404: + await setLogState({ + log: { + status: 'red', + message: 'Objektkatalog nicht erreichbar!', + code: '404', tip: 'Sind sie mit dem Internet verbunden und ist der Objektkatalog online?', }, // with message, code, tip logClass: 'active' @@ -170,34 +186,38 @@ export const App = () => { -
-
-
-
- - -
-
- - -
+
+

Marvin

+
+
+ +
+ + +
+
+ + +
- + - -
- + +
+ + +
{ logState={logState} setLogState={setLogState} /> +