From 6656f9c05ae64414a5c074321b0a5a881f5b2f01 Mon Sep 17 00:00:00 2001 From: mwlt39 Date: Wed, 18 Mar 2026 19:38:08 +0100 Subject: [PATCH 01/16] feat: adding fontawesome library, changing from CSS to Tailwind, configure setup for frontend hot reload --- .github/workflows/github-actions-demo.yml | 18 ----- .../service/CustomUserDetailsService.java | 2 + projekt/docker-compose.dev.yml | 4 +- projekt/frontend/Dockerfile.dev | 27 ++++--- projekt/frontend/package-lock.json | 75 +++++++++++++++++++ projekt/frontend/package.json | 5 ++ .../src/components/CreateDocument.tsx | 64 +++++++++------- .../frontend/src/components/ErrorMessage.tsx | 4 +- projekt/frontend/src/components/Navbar.tsx | 46 +++++++----- projekt/frontend/src/components/Searchbar.tsx | 21 ++---- .../frontend/src/styling/CreateDocuments.css | 62 --------------- projekt/frontend/src/styling/Navbar.css | 75 ------------------- projekt/frontend/src/styling/Searchbar.css | 65 ---------------- projekt/frontend/vite.config.ts | 13 ++++ 14 files changed, 187 insertions(+), 294 deletions(-) delete mode 100644 .github/workflows/github-actions-demo.yml delete mode 100644 projekt/frontend/src/styling/CreateDocuments.css delete mode 100644 projekt/frontend/src/styling/Navbar.css delete mode 100644 projekt/frontend/src/styling/Searchbar.css diff --git a/.github/workflows/github-actions-demo.yml b/.github/workflows/github-actions-demo.yml deleted file mode 100644 index b00f8e9..0000000 --- a/.github/workflows/github-actions-demo.yml +++ /dev/null @@ -1,18 +0,0 @@ -name: GitHub Actions Demo -run-name: ${{ github.actor }} is testing out GitHub Actions 🚀 -on: [push] -jobs: - Explore-GitHub-Actions: - runs-on: ubuntu-latest - steps: - - run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event." - - run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by GitHub!" - - run: echo "🔎 The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}." - - name: Check out repository code - uses: actions/checkout@v5 - - run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner." - - run: echo "đŸ–„ïž The workflow is now ready to test your code on the runner." - - name: List files in the repository - run: | - ls ${{ github.workspace }} - - run: echo "🍏 This job's status is ${{ job.status }}." diff --git a/projekt/backend/src/main/java/com/projektsse/backend/service/CustomUserDetailsService.java b/projekt/backend/src/main/java/com/projektsse/backend/service/CustomUserDetailsService.java index 4e3d69e..c5e0284 100644 --- a/projekt/backend/src/main/java/com/projektsse/backend/service/CustomUserDetailsService.java +++ b/projekt/backend/src/main/java/com/projektsse/backend/service/CustomUserDetailsService.java @@ -3,6 +3,7 @@ import com.projektsse.backend.models.CustomUserDetails; import com.projektsse.backend.repository.UserRepository; import com.projektsse.backend.repository.entities.User; +import org.jspecify.annotations.NullMarked; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; @@ -19,6 +20,7 @@ public CustomUserDetailsService(UserRepository userRepository) { } @Override + @NullMarked public UserDetails loadUserByUsername(String userId) throws UsernameNotFoundException { User user = userRepository.findById(UUID.fromString(userId)) .orElseThrow(() -> new UsernameNotFoundException("User not found with id: " + userId)); diff --git a/projekt/docker-compose.dev.yml b/projekt/docker-compose.dev.yml index 7c08d49..8b3dd06 100644 --- a/projekt/docker-compose.dev.yml +++ b/projekt/docker-compose.dev.yml @@ -51,4 +51,6 @@ services: links: - "backend:backend" ports: - - "8080:8080" \ No newline at end of file + - "8080:8080" + volumes: + - ./frontend/src:/app/src \ No newline at end of file diff --git a/projekt/frontend/Dockerfile.dev b/projekt/frontend/Dockerfile.dev index 2466fd8..92fac3b 100644 --- a/projekt/frontend/Dockerfile.dev +++ b/projekt/frontend/Dockerfile.dev @@ -8,19 +8,24 @@ RUN npm install COPY . . -RUN npm run build +EXPOSE 8080 -FROM nginx:1.29.4-alpine +CMD ["npm", "run", "dev", "--", "--host", "--port", "8080"] -COPY nginx.dev.conf /etc/nginx/conf.d/default.conf -COPY --from=build /app/dist /usr/share/nginx/html +# RUN npm run build -RUN touch /var/run/nginx.pid -RUN chown -R nginx:nginx /var/cache/nginx && \ - chown -R nginx:nginx /var/log/nginx && \ - chown -R nginx:nginx /etc/nginx/conf.d && \ - chown nginx:nginx /var/run/nginx.pid +# FROM nginx:1.29.4-alpine -USER nginx +# COPY nginx.dev.conf /etc/nginx/conf.d/default.conf +# COPY --from=build /app/dist /usr/share/nginx/html + +# RUN touch /var/run/nginx.pid +# RUN chown -R nginx:nginx /var/cache/nginx && \ +# chown -R nginx:nginx /var/log/nginx && \ +# chown -R nginx:nginx /etc/nginx/conf.d && \ +# chown nginx:nginx /var/run/nginx.pid + +# USER nginx + +# CMD ["nginx","-g","daemon off;"] -CMD ["nginx","-g","daemon off;"] \ No newline at end of file diff --git a/projekt/frontend/package-lock.json b/projekt/frontend/package-lock.json index c90034a..e53b384 100644 --- a/projekt/frontend/package-lock.json +++ b/projekt/frontend/package-lock.json @@ -8,6 +8,11 @@ "name": "frontend", "version": "0.0.0", "dependencies": { + "@fortawesome/fontawesome-svg-core": "^7.2.0", + "@fortawesome/free-brands-svg-icons": "^7.2.0", + "@fortawesome/free-regular-svg-icons": "^7.2.0", + "@fortawesome/free-solid-svg-icons": "^7.2.0", + "@fortawesome/react-fontawesome": "^3.2.0", "@tailwindcss/vite": "^4.2.1", "@zxcvbn-ts/core": "^3.0.4", "@zxcvbn-ts/language-common": "^3.0.4", @@ -1136,6 +1141,76 @@ } } }, + "node_modules/@fortawesome/fontawesome-common-types": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-7.2.0.tgz", + "integrity": "sha512-IpR0bER9FY25p+e7BmFH25MZKEwFHTfRAfhOyJubgiDnoJNsSvJ7nigLraHtp4VOG/cy8D7uiV0dLkHOne5Fhw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/fontawesome-svg-core": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-7.2.0.tgz", + "integrity": "sha512-6639htZMjEkwskf3J+e6/iar+4cTNM9qhoWuRfj9F3eJD6r7iCzV1SWnQr2Mdv0QT0suuqU8BoJCZUyCtP9R4Q==", + "license": "MIT", + "dependencies": { + "@fortawesome/fontawesome-common-types": "7.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-brands-svg-icons": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-7.2.0.tgz", + "integrity": "sha512-VNG8xqOip1JuJcC3zsVsKRQ60oXG9+oYNDCosjoU/H9pgYmLTEwWw8pE0jhPz/JWdHeUuK6+NQ3qsM4gIbdbYQ==", + "license": "(CC-BY-4.0 AND MIT)", + "dependencies": { + "@fortawesome/fontawesome-common-types": "7.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-regular-svg-icons": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-7.2.0.tgz", + "integrity": "sha512-iycmlN51EULlQ4D/UU9WZnHiN0CvjJ2TuuCrAh+1MVdzD+4ViKYH2deNAll4XAAYlZa8WAefHR5taSK8hYmSMw==", + "license": "(CC-BY-4.0 AND MIT)", + "dependencies": { + "@fortawesome/fontawesome-common-types": "7.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-solid-svg-icons": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-7.2.0.tgz", + "integrity": "sha512-YTVITFGN0/24PxzXrwqCgnyd7njDuzp5ZvaCx5nq/jg55kUYd94Nj8UTchBdBofi/L0nwRfjGOg0E41d2u9T1w==", + "license": "(CC-BY-4.0 AND MIT)", + "dependencies": { + "@fortawesome/fontawesome-common-types": "7.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/react-fontawesome": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-3.2.0.tgz", + "integrity": "sha512-E9Gu1hqd6JussVO26EC4WqRZssXMnQr2ol7ZNWkkFOH8jZUaxDJ9Z9WF9wIVkC+kJGXUdY3tlffpDwEKfgQrQw==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@fortawesome/fontawesome-svg-core": "~6 || ~7", + "react": "^18.0.0 || ^19.0.0" + } + }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", diff --git a/projekt/frontend/package.json b/projekt/frontend/package.json index 640a4ba..97ab20b 100644 --- a/projekt/frontend/package.json +++ b/projekt/frontend/package.json @@ -12,6 +12,11 @@ "test:ci": "vitest run" }, "dependencies": { + "@fortawesome/fontawesome-svg-core": "^7.2.0", + "@fortawesome/free-brands-svg-icons": "^7.2.0", + "@fortawesome/free-regular-svg-icons": "^7.2.0", + "@fortawesome/free-solid-svg-icons": "^7.2.0", + "@fortawesome/react-fontawesome": "^3.2.0", "@tailwindcss/vite": "^4.2.1", "@zxcvbn-ts/core": "^3.0.4", "@zxcvbn-ts/language-common": "^3.0.4", diff --git a/projekt/frontend/src/components/CreateDocument.tsx b/projekt/frontend/src/components/CreateDocument.tsx index 87ba306..2580a6e 100644 --- a/projekt/frontend/src/components/CreateDocument.tsx +++ b/projekt/frontend/src/components/CreateDocument.tsx @@ -4,7 +4,8 @@ import { useNavigate } from 'react-router'; import { apiFetch } from '../utils/apiFetch'; import ErrorMessage from './ErrorMessage'; import Navbar from './Navbar'; -import '../styling/CreateDocuments.css'; +import {FontAwesomeIcon} from "@fortawesome/react-fontawesome"; +import {faBan, faCirclePlus} from "@fortawesome/free-solid-svg-icons"; interface FormData { title: string; @@ -56,23 +57,23 @@ function CreateDocument() { } }; - const handleSubmit = async (e: React.FormEvent): Promise => { + const handleSubmit = async (e: React.SubmitEvent): Promise => { e.preventDefault(); if (!auth.isAuthenticated) { - setErrors({ general: 'Sie mĂŒssen angemeldet sein, um ein Dokument zu erstellen.' }); + setErrors({ general: 'You have to be authorized to create a document' }); return; } const newErrors: Errors = {}; if (!formData.title.trim()) { - newErrors.title = 'Titel ist erforderlich'; + newErrors.title = 'Title is required.'; } else if (formData.title.length > 200) { - newErrors.title = 'Titel darf maximal 200 Zeichen haben'; + newErrors.title = 'Title cannot exceed 200 characters.'; } if (!formData.mdContent.trim()) { - newErrors.content = 'Inhalt ist erforderlich'; + newErrors.content = 'Content is required.'; } if (Object.keys(newErrors).length > 0) { @@ -92,7 +93,7 @@ function CreateDocument() { if (!response.ok) { const errorData = await response.json(); - throw new Error(errorData.message || 'Dokument konnte nicht erstellt werden'); + throw new Error(errorData.mdContent || 'Failed to create document'); } const data = await response.json(); @@ -100,7 +101,7 @@ function CreateDocument() { } catch (error) { setErrors({ - general: error instanceof Error ? error.message : 'Ein Fehler ist aufgetreten' + general: error instanceof Error ? error.message : 'An error occurred.' }); } finally { setIsSubmitting(false); @@ -110,62 +111,69 @@ function CreateDocument() { return ( <> -
-

Neues Dokument erstellen

+
+

Create new document

-
-
- + +
+
-
- +
+
+ +

+ Chars: {formData.mdContent.length} / 10000 +

+