From e18887635d9dc0d40d4d73f8b313a947c2f950e8 Mon Sep 17 00:00:00 2001 From: Tobias Keinert Date: Fri, 24 Feb 2023 17:29:48 +0100 Subject: [PATCH] privat link site --- package-lock.json | 47 ++++++++++++++++++++++++++++++ package.json | 1 + src/App.js | 4 ++- src/privat/components/LinkBox.css | 12 ++++---- src/privat/components/LinkBox.js | 13 +++++++-- src/privat/components/Links.css | 11 +++++++ src/privat/components/Links.js | 14 +++++++-- src/privat/components/data.json | 29 ++++++++++++++++++ src/privat/components/schema.json | 38 ++++++++++++++++++++++++ src/privat/images/gitlab.svg | 12 ++++++++ src/privat/images/nginx.png | Bin 0 -> 18901 bytes src/privat/images/pihole.svg | 11 +++++++ src/privat/images/portainer.svg | 1 + 13 files changed, 182 insertions(+), 11 deletions(-) create mode 100644 src/privat/components/Links.css create mode 100644 src/privat/components/data.json create mode 100644 src/privat/components/schema.json create mode 100644 src/privat/images/gitlab.svg create mode 100644 src/privat/images/nginx.png create mode 100644 src/privat/images/pihole.svg create mode 100644 src/privat/images/portainer.svg diff --git a/package-lock.json b/package-lock.json index 8f2e7f4..bddeffb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-scripts": "5.0.1", + "react-svg": "^15.1.21", "web-vitals": "^2.1.4" } }, @@ -3406,6 +3407,16 @@ "url": "https://github.com/sponsors/gregberge" } }, + "node_modules/@tanem/svg-injector": { + "version": "10.1.45", + "resolved": "https://registry.npmjs.org/@tanem/svg-injector/-/svg-injector-10.1.45.tgz", + "integrity": "sha512-HOmdNqYIP808rxzxc6dCP8MZOQQ1zKscoNo5BkjZKgYGSm/ObNCW6r+IPTP30kVHET7y0HAzrDwnP0WYFyr3Tg==", + "dependencies": { + "@babel/runtime": "^7.20.7", + "content-type": "^1.0.4", + "tslib": "^2.4.1" + } + }, "node_modules/@testing-library/dom": { "version": "8.19.1", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.19.1.tgz", @@ -14249,6 +14260,21 @@ } } }, + "node_modules/react-svg": { + "version": "15.1.21", + "resolved": "https://registry.npmjs.org/react-svg/-/react-svg-15.1.21.tgz", + "integrity": "sha512-ISMX8ICoLNivt1+OPY24V0WmBYPSEuVU1EzgVhyXj7mSGs+aQosGFevatrfxx+1zh28iyvWRDma1YbpylGEwbw==", + "dependencies": { + "@babel/runtime": "^7.20.7", + "@tanem/svg-injector": "^10.1.42", + "@types/prop-types": "^15.7.5", + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -19279,6 +19305,16 @@ "loader-utils": "^2.0.0" } }, + "@tanem/svg-injector": { + "version": "10.1.45", + "resolved": "https://registry.npmjs.org/@tanem/svg-injector/-/svg-injector-10.1.45.tgz", + "integrity": "sha512-HOmdNqYIP808rxzxc6dCP8MZOQQ1zKscoNo5BkjZKgYGSm/ObNCW6r+IPTP30kVHET7y0HAzrDwnP0WYFyr3Tg==", + "requires": { + "@babel/runtime": "^7.20.7", + "content-type": "^1.0.4", + "tslib": "^2.4.1" + } + }, "@testing-library/dom": { "version": "8.19.1", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.19.1.tgz", @@ -27049,6 +27085,17 @@ "workbox-webpack-plugin": "^6.4.1" } }, + "react-svg": { + "version": "15.1.21", + "resolved": "https://registry.npmjs.org/react-svg/-/react-svg-15.1.21.tgz", + "integrity": "sha512-ISMX8ICoLNivt1+OPY24V0WmBYPSEuVU1EzgVhyXj7mSGs+aQosGFevatrfxx+1zh28iyvWRDma1YbpylGEwbw==", + "requires": { + "@babel/runtime": "^7.20.7", + "@tanem/svg-injector": "^10.1.42", + "@types/prop-types": "^15.7.5", + "prop-types": "^15.8.1" + } + }, "read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", diff --git a/package.json b/package.json index 2e1c08d..bbf72dc 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-scripts": "5.0.1", + "react-svg": "^15.1.21", "web-vitals": "^2.1.4" }, "scripts": { diff --git a/src/App.js b/src/App.js index a9fb268..a3752b6 100644 --- a/src/App.js +++ b/src/App.js @@ -1,7 +1,9 @@ import Menu from './main/components/Menu'; import Foot from './main/components/Foot'; +// eslint-disable-next-line import NotFound from './main/components/NotFound'; + import Links from './privat/components/Links'; @@ -12,7 +14,7 @@ function App() {
- +
diff --git a/src/privat/components/LinkBox.css b/src/privat/components/LinkBox.css index 477becd..d9c08a8 100644 --- a/src/privat/components/LinkBox.css +++ b/src/privat/components/LinkBox.css @@ -9,20 +9,22 @@ border-radius: 1em; border-width: 3px; border-style: solid; - background-color: #5555; - width: 300px; + background-color: #aaa5; color: black; text-decoration: none; + padding: 0.25em; + width: 350px; + box-sizing: border-box; } .link-box:hover { - color: blueviolet; + background-color: #fff7; } .link-box-logo { grid-area: logo; - width: 100%; - height: 100%; + height: 2.5em; + margin: auto; } .link-box-title { diff --git a/src/privat/components/LinkBox.js b/src/privat/components/LinkBox.js index 982a02f..cf8c692 100644 --- a/src/privat/components/LinkBox.js +++ b/src/privat/components/LinkBox.js @@ -1,11 +1,18 @@ -import "./LinkBox.css" +import "./LinkBox.css"; + +function importAll(r) { + let images = {}; + r.keys().forEach((item, index) => { images[item.replace('./', '')] = r(item); }); + return images + } +const images = importAll(require.context('../images', false, /\.(png|jpe?g|svg)$/)); function LinkBox (par) { const title = typeof par.title === "string" ? par.title : " "; const subtitle = typeof par.subtitle === "string" ? par.subtitle : " "; - const logo = typeof par.logo === "string" ? : " "; const url = typeof par.url === "string" ? par.url : "#"; - + const logo = typeof par.logo === "string" ? ({par.logo}) : " "; + return ( {logo} diff --git a/src/privat/components/Links.css b/src/privat/components/Links.css new file mode 100644 index 0000000..8480d86 --- /dev/null +++ b/src/privat/components/Links.css @@ -0,0 +1,11 @@ +.links { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(350px , 1fr)); + gap: 0.5em; + padding: 0.5em; + min-width: calc(350px + 1em); +} + +.links > a { + width: 100%; +} \ No newline at end of file diff --git a/src/privat/components/Links.js b/src/privat/components/Links.js index f0b5d34..44f6521 100644 --- a/src/privat/components/Links.js +++ b/src/privat/components/Links.js @@ -1,9 +1,19 @@ + + +// eslint-disable-next-line import LinkBox from './LinkBox'; +import LinkList from './data.json'; +import './Links.css'; + +let html = []; +for (let i = 0; i < LinkList.links.length; i++ ) { + html.push(()); +} function Links () { return ( -
- +
+ {html}
); } diff --git a/src/privat/components/data.json b/src/privat/components/data.json new file mode 100644 index 0000000..f42d556 --- /dev/null +++ b/src/privat/components/data.json @@ -0,0 +1,29 @@ +{ + "$schema": "./schema.json", + "links": [ + { + "title": "Gitlab", + "subtitle": "Git Verwaltung", + "url": "http://172.22.1.1:7202", + "logo": "gitlab.svg" + }, + { + "title": "Pihole", + "subtitle": "VPN Filter", + "url": "http://10.47.82.1:84/admin/login.php", + "logo": "pihole.svg" + }, + { + "title": "Nginx", + "subtitle": "Zertifakte, SubDomainVerwaltung", + "url": "http://letsstein.de:81", + "logo": "nginx.png" + }, + { + "title": "Portainer", + "subtitle": "Docker Verwaltung", + "url": "https://172.22.5.1:9443", + "logo": "portainer.svg" + } + ] +} \ No newline at end of file diff --git a/src/privat/components/schema.json b/src/privat/components/schema.json new file mode 100644 index 0000000..a84a6d4 --- /dev/null +++ b/src/privat/components/schema.json @@ -0,0 +1,38 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema", + "type": "object", + + "properties": { + "links":{ + "type":"array", + "title": "Links", + "description": "List of Links", + "items": { + "type":"object", + "properties": { + "title": { + "type":"string", + "description": "Title in LinkBox" + }, + "subtitle": { + "type":"string", + "description": "Subtitle in LinkBox" + }, + "url":{ + "type":"string", + "description": "Url of the link" + }, + "logo":{ + "type":"string", + "description": "Logo of the Link" + } + }, + "required":[ + "title", + "url" + ] + } + } + + } +} \ No newline at end of file diff --git a/src/privat/images/gitlab.svg b/src/privat/images/gitlab.svg new file mode 100644 index 0000000..274e620 --- /dev/null +++ b/src/privat/images/gitlab.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/privat/images/nginx.png b/src/privat/images/nginx.png new file mode 100644 index 0000000000000000000000000000000000000000..76e886d69cf70486bc46bbfd6556ff32f50095d4 GIT binary patch literal 18901 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 + + + + + + + + + + diff --git a/src/privat/images/portainer.svg b/src/privat/images/portainer.svg new file mode 100644 index 0000000..e8c91b3 --- /dev/null +++ b/src/privat/images/portainer.svg @@ -0,0 +1 @@ + \ No newline at end of file