add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks - Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists - Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services - Add Microsoft OIDC SSO, API token management, and user lifecycle features - Add swagger-ui vendor integration and OpenAPI spec - Add production Docker setup and bin/ scripts - Update composer dependencies, config, templates, and frontend assets throughout Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
33
templates/pdfs/de/access_info.html
Normal file
33
templates/pdfs/de/access_info.html
Normal file
@@ -0,0 +1,33 @@
|
||||
<!doctype html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>{{pdf_title}}</title>
|
||||
</head>
|
||||
<body style="font-family: DejaVu Sans, Arial, sans-serif; line-height: 1.45; color: #111;">
|
||||
{{email_header}}
|
||||
<p>{{greeting}}</p>
|
||||
<p>dein Zugang wurde eingerichtet.</p>
|
||||
<p><strong>Benutzername:</strong> {{username}}</p>
|
||||
<p><a href="{{login_url}}">Zur Anmeldung</a></p>
|
||||
<p>
|
||||
Falls du dein Passwort nicht kennst, kannst du es hier zurücksetzen:
|
||||
<a href="{{reset_url}}">Passwort vergessen</a>
|
||||
</p>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" style="margin-top: 20px;">
|
||||
<tr>
|
||||
<td style="padding-right: 16px; vertical-align: top;">
|
||||
<img src="{{login_qr_data_uri}}" alt="Login QR" width="150" height="150" style="display: block; border: 1px solid #ddd; border-radius: 8px;">
|
||||
</td>
|
||||
<td style="vertical-align: top;">
|
||||
<p style="margin-top: 0;"><strong>Login per QR-Code</strong></p>
|
||||
<p style="margin: 0 0 6px;">Scanne den Code, um die Login-Seite zu öffnen.</p>
|
||||
<p style="margin: 0;"><a href="{{login_url}}">{{login_url}}</a></p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p style="margin-top: 16px; font-size: 12px; color: #666;">Erstellt: {{generated_at}}</p>
|
||||
<p>Viele Grüße<br>{{app_name}}</p>
|
||||
{{email_footer}}
|
||||
</body>
|
||||
</html>
|
||||
16
templates/pdfs/de/partials/footer.html
Normal file
16
templates/pdfs/de/partials/footer.html
Normal file
@@ -0,0 +1,16 @@
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding:12px 24px 20px; border-top:1px solid #e6e6e6; font-size:12px; color:#555;">
|
||||
<div style="margin-bottom:8px;">
|
||||
<a href="{{imprint_url}}" style="color:#555; text-decoration:underline;">Impressum</a>
|
||||
·
|
||||
<a href="{{privacy_url}}" style="color:#555; text-decoration:underline;">Datenschutz</a>
|
||||
</div>
|
||||
{{app_name}} · Dieses PDF wurde automatisch erstellt.
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
14
templates/pdfs/de/partials/header.html
Normal file
14
templates/pdfs/de/partials/header.html
Normal file
@@ -0,0 +1,14 @@
|
||||
<table role="presentation" width="100%" cellspacing="0" cellpadding="0" style="background:#ffffff; padding:24px 0;">
|
||||
<tr>
|
||||
<td align="center">
|
||||
<table role="presentation" width="600" cellspacing="0" cellpadding="0" style="background:#ffffff; color:#111; border:1px solid #e6e6e6; border-radius:12px; width:100%; max-width:600px;">
|
||||
<tr>
|
||||
<td style="padding:20px 24px 12px; border-bottom:1px solid #e6e6e6;">
|
||||
<div style="font-size:18px; font-weight:700; color:#111;">
|
||||
<img src="{{app_logo_url}}" alt="{{app_name}}" height="32" style="display:inline-block; vertical-align:middle; margin-right:8px;">
|
||||
<span style="vertical-align:middle;">{{app_name}}</span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding:16px 24px 4px;">
|
||||
33
templates/pdfs/en/access_info.html
Normal file
33
templates/pdfs/en/access_info.html
Normal file
@@ -0,0 +1,33 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>{{pdf_title}}</title>
|
||||
</head>
|
||||
<body style="font-family: DejaVu Sans, Arial, sans-serif; line-height: 1.45; color: #111;">
|
||||
{{email_header}}
|
||||
<p>{{greeting}}</p>
|
||||
<p>Your access has been set up.</p>
|
||||
<p><strong>Username:</strong> {{username}}</p>
|
||||
<p><a href="{{login_url}}">Go to login</a></p>
|
||||
<p>
|
||||
If you do not know your password, you can reset it here:
|
||||
<a href="{{reset_url}}">Forgot password</a>
|
||||
</p>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" style="margin-top: 20px;">
|
||||
<tr>
|
||||
<td style="padding-right: 16px; vertical-align: top;">
|
||||
<img src="{{login_qr_data_uri}}" alt="Login QR" width="150" height="150" style="display: block; border: 1px solid #ddd; border-radius: 8px;">
|
||||
</td>
|
||||
<td style="vertical-align: top;">
|
||||
<p style="margin-top: 0;"><strong>Login via QR code</strong></p>
|
||||
<p style="margin: 0 0 6px;">Scan the code to open the login page.</p>
|
||||
<p style="margin: 0;"><a href="{{login_url}}">{{login_url}}</a></p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p style="margin-top: 16px; font-size: 12px; color: #666;">Generated: {{generated_at}}</p>
|
||||
<p>Best regards<br>{{app_name}}</p>
|
||||
{{email_footer}}
|
||||
</body>
|
||||
</html>
|
||||
16
templates/pdfs/en/partials/footer.html
Normal file
16
templates/pdfs/en/partials/footer.html
Normal file
@@ -0,0 +1,16 @@
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding:12px 24px 20px; border-top:1px solid #e6e6e6; font-size:12px; color:#555;">
|
||||
<div style="margin-bottom:8px;">
|
||||
<a href="{{imprint_url}}" style="color:#555; text-decoration:underline;">Imprint</a>
|
||||
·
|
||||
<a href="{{privacy_url}}" style="color:#555; text-decoration:underline;">Privacy</a>
|
||||
</div>
|
||||
{{app_name}} · This PDF was generated automatically.
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
14
templates/pdfs/en/partials/header.html
Normal file
14
templates/pdfs/en/partials/header.html
Normal file
@@ -0,0 +1,14 @@
|
||||
<table role="presentation" width="100%" cellspacing="0" cellpadding="0" style="background:#ffffff; padding:24px 0;">
|
||||
<tr>
|
||||
<td align="center">
|
||||
<table role="presentation" width="600" cellspacing="0" cellpadding="0" style="background:#ffffff; color:#111; border:1px solid #e6e6e6; border-radius:12px; width:100%; max-width:600px;">
|
||||
<tr>
|
||||
<td style="padding:20px 24px 12px; border-bottom:1px solid #e6e6e6;">
|
||||
<div style="font-size:18px; font-weight:700; color:#111;">
|
||||
<img src="{{app_logo_url}}" alt="{{app_name}}" height="32" style="display:inline-block; vertical-align:middle; margin-right:8px;">
|
||||
<span style="vertical-align:middle;">{{app_name}}</span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding:16px 24px 4px;">
|
||||
Reference in New Issue
Block a user