Dummydaten und Sprache angepasst

Dieser Commit ist enthalten in:
Claude Project Manager
2025-09-29 00:35:31 +02:00
Ursprung b462f69281
Commit e275b8fcd6
32 geänderte Dateien mit 122 neuen und 175 gelöschten Zeilen

Datei anzeigen

@ -55,8 +55,8 @@
"shortcutName": "SkillMate",
"runAfterFinish": true,
"menuCategory": true,
"description": "Mitarbeiter-Skills-Management für Sicherheitsbehörden",
"branding": "SkillMate - Professionelle Mitarbeiterverwaltung",
"description": "Skill-Management für Sicherheitsbehörden",
"branding": "SkillMate - Professionelles Skill-Management",
"vendor": "SkillMate Development",
"installerHeaderIcon": "build/icon.ico",
"ui": {
@ -81,11 +81,11 @@
"createStartMenuShortcut": true,
"shortcutName": "SkillMate",
"menuCategory": true,
"description": "Mitarbeiter-Skills-Management für Sicherheitsbehörden",
"description": "Skill-Management für Sicherheitsbehörden",
"language": "1031",
"multiLanguageInstaller": false,
"installerHeader": "build/installer-header.bmp",
"installerSidebar": "build/installer-sidebar.bmp"
},
"publish": null
}
}

Datei anzeigen

@ -4,7 +4,7 @@
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/icon.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>SkillMate - Mitarbeiter-Skills-Management</title>
<title>SkillMate - Skill-Management</title>
<script>
// Define process for Electron renderer
window.process = {
@ -17,4 +17,4 @@
<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>
</body>
</html>
</html>

Datei anzeigen

@ -4,10 +4,10 @@
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/icon.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>SkillMate - Mitarbeiter-Skills-Management</title>
<title>SkillMate - Skill-Management</title>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>
</body>
</html>
</html>

Datei anzeigen

@ -31,7 +31,7 @@ UninstallDisplayName={#MyAppName}
UninstallDisplayIcon={app}\{#MyAppExeName}
VersionInfoVersion={#MyAppVersion}
VersionInfoCompany={#MyAppPublisher}
VersionInfoDescription=Mitarbeiter-Skills-Management für Sicherheitsbehörden
VersionInfoDescription=Skill-Management für Sicherheitsbehörden
VersionInfoCopyright=Copyright (C) 2024 {#MyAppPublisher}
VersionInfoProductName={#MyAppName}
VersionInfoProductVersion={#MyAppVersion}
@ -76,4 +76,4 @@ begin
end;
[UninstallDelete]
Type: filesandordirs; Name: "{userappdata}\SkillMate"
Type: filesandordirs; Name: "{userappdata}\SkillMate"

Datei anzeigen

@ -1,7 +1,7 @@
{
"name": "@skillmate/frontend",
"version": "1.0.0",
"description": "SkillMate - Mitarbeiter-Skills-Management für Sicherheitsbehörden",
"description": "SkillMate - Skill-Management für Sicherheitsbehörden",
"author": "SkillMate Development",
"private": true,
"scripts": {

Datei anzeigen

@ -80,7 +80,7 @@ export default function DeputyManagement() {
}
const handleDelegate = async (assignmentId: string) => {
const toDeputyId = prompt('Bitte geben Sie die Mitarbeiter-ID des neuen Vertreters ein:')
const toDeputyId = prompt('Bitte geben Sie die Personen-ID des neuen Vertretenden ein:')
if (!toDeputyId) return
const reason = prompt('Grund für die Weitergabe (optional):')

Datei anzeigen

@ -426,7 +426,7 @@ export default function OfficeMap3D({ targetEmployeeId, targetRoom, currentUserR
<p className="text-sm text-gray-400">{roomDetails.floorName}</p>
{roomDetails.occupantNames && roomDetails.occupantNames.length > 0 && (
<div className="mt-2">
<p className="text-sm text-gray-400">Mitarbeiter:</p>
<p className="text-sm text-gray-400">Mitarbeitende:</p>
{roomDetails.occupantNames.map((name, i) => (
<p key={i} className="text-sm"> {name}</p>
))}
@ -562,4 +562,4 @@ export default function OfficeMap3D({ targetEmployeeId, targetRoom, currentUserR
</div>
</div>
)
}
}

Datei anzeigen

@ -37,7 +37,7 @@ export default function OfficeMapModal({
<div className="flex justify-between items-center p-4 border-b border-gray-700">
<div>
<h2 className="text-xl font-semibold text-white">
Wegbeschreibung zu {employeeName || 'Mitarbeiter'}
Wegbeschreibung zu {employeeName || 'dieser Person'}
</h2>
<p className="text-sm text-gray-400 mt-1">
<span className="text-green-400"> Start:</span> Ihr Büro
@ -95,4 +95,4 @@ export default function OfficeMapModal({
</div>
</>
)
}
}

Datei anzeigen

@ -321,7 +321,7 @@ export default function OrganizationChart({ onClose }: OrganizationChartProps) {
<div className="border-b border-gray-200 dark:border-gray-700 mb-4">
<div className="flex gap-4">
<button className="pb-2 border-b-2 border-blue-500 dark:text-white">
Mitarbeiter
Mitarbeitende
</button>
<button className="pb-2 dark:text-gray-400">
Skills
@ -353,7 +353,7 @@ export default function OrganizationChart({ onClose }: OrganizationChartProps) {
<p className="text-sm text-gray-600 dark:text-gray-400">
{emp.role === 'leiter' && '🔑 Leitung'}
{emp.role === 'stellvertreter' && '↔️ Stellvertretung'}
{emp.role === 'mitarbeiter' && 'Mitarbeiter'}
{emp.role === 'mitarbeiter' && 'Mitarbeitende Person'}
{emp.role === 'beauftragter' && '🎖️ Beauftragter'}
</p>
</div>
@ -361,7 +361,7 @@ export default function OrganizationChart({ onClose }: OrganizationChartProps) {
</div>
))}
{unitEmployees.length === 0 && (
<p className="text-gray-500 dark:text-gray-400">Keine Mitarbeiter zugeordnet</p>
<p className="text-gray-500 dark:text-gray-400">Keine Mitarbeitenden zugeordnet</p>
)}
</div>

Datei anzeigen

@ -13,7 +13,7 @@ import { useAuthStore } from '../stores/authStore'
const navigation = [
{ name: 'Dashboard', href: '/', icon: HomeIcon },
{ name: 'Mein Profil', href: '/profile', icon: UsersIcon },
{ name: 'Mitarbeiter', href: '/employees', icon: UsersIcon },
{ name: 'Mitarbeitende', href: '/employees', icon: UsersIcon },
{ name: 'Skill-Suche', href: '/search', icon: SearchIcon },
{ name: 'Team-Zusammenstellung', href: '/team', icon: UsersIcon },
{ name: 'Einstellungen', href: '/settings', icon: SettingsIcon },

Datei anzeigen

@ -61,7 +61,7 @@ export default function Dashboard() {
const statsCards = [
{
title: 'Mitarbeiter gesamt',
title: 'Mitarbeitende gesamt',
value: stats.totalEmployees,
color: 'text-primary-blue',
bgColor: 'bg-bg-accent',
@ -200,7 +200,7 @@ export default function Dashboard() {
<div className="card">
<h2 className="text-title-card font-poppins font-semibold text-primary mb-4">Profilqualität</h2>
{!user?.employeeId ? (
<p className="text-tertiary">Kein Mitarbeiterprofil mit Ihrem Nutzer verknüpft.</p>
<p className="text-tertiary">Kein Mitarbeitendenprofil mit Ihrem Nutzer verknüpft.</p>
) : (
<>
<div className="w-full h-3 bg-bg-gray dark:bg-dark-primary rounded-input overflow-hidden">
@ -237,7 +237,7 @@ export default function Dashboard() {
onClick={() => navigate('/employees')}
className="w-full btn-secondary"
>
Mitarbeiter verwalten
Mitarbeitende verwalten
</button>
<button
onClick={() => navigate('/search')}

Datei anzeigen

@ -84,12 +84,12 @@ export default function EmployeeDetail() {
if (!employee) {
return (
<div className="flex items-center justify-center h-full">
<p className="text-tertiary">Mitarbeiter wird geladen...</p>
<p className="text-tertiary">Profil wird geladen...</p>
</div>
)
}
// Hinweis: Verfügbarkeits-Badge wird im Mitarbeiter-Detail nicht angezeigt
// Hinweis: Verfügbarkeits-Badge wird im Mitarbeitenden-Detail nicht angezeigt
return (
<div>

Datei anzeigen

@ -175,7 +175,7 @@ export default function EmployeeForm() {
if (!formData.firstName.trim()) errors.firstName = 'Vorname ist erforderlich'
if (!formData.lastName.trim()) errors.lastName = 'Nachname ist erforderlich'
if (!formData.employeeNumber.trim()) errors.employeeNumber = 'Mitarbeiternummer ist erforderlich'
if (!formData.employeeNumber.trim()) errors.employeeNumber = 'Personalnummer ist erforderlich'
if (!formData.position.trim()) errors.position = 'Position ist erforderlich'
if (!formData.department.trim()) errors.department = 'Abteilung ist erforderlich'
if (!formData.email.trim()) errors.email = 'E-Mail ist erforderlich'
@ -250,7 +250,7 @@ export default function EmployeeForm() {
if (err.response?.status === 401) {
setError('Ihre Session ist abgelaufen. Bitte melden Sie sich erneut an.')
} else {
setError(err.response?.data?.message || 'Fehler beim Erstellen des Mitarbeiters')
setError(err.response?.data?.message || 'Fehler beim Erstellen des Profils')
}
} finally {
setLoading(false)
@ -261,7 +261,7 @@ export default function EmployeeForm() {
<div>
<div className="flex justify-between items-center mb-8">
<h1 className="text-title-lg font-poppins font-bold text-primary">
Neuer Mitarbeiter
Neues Mitarbeitendenprofil
</h1>
<button
onClick={() => navigate('/employees')}
@ -288,7 +288,7 @@ export default function EmployeeForm() {
<div className="md:col-span-2 flex justify-center mb-6">
<div>
<label className="block text-sm font-medium text-secondary mb-2 text-center">
Mitarbeiterfoto
Profilfoto
</label>
<PhotoPreview
currentPhoto={employeePhoto || undefined}
@ -696,7 +696,7 @@ export default function EmployeeForm() {
disabled={loading}
className="btn-primary"
>
{loading ? 'Wird gespeichert...' : 'Mitarbeiter erstellen'}
{loading ? 'Wird gespeichert...' : 'Profil erstellen'}
</button>
</div>
</form>

Datei anzeigen

@ -87,17 +87,17 @@ export default function EmployeeList() {
<div>
<div className="flex justify-between items-center mb-8">
<h1 className="text-3xl font-bold text-gray-900 dark:text-white">
Mitarbeiter & Expert:innen
Mitarbeitende & Expertise
</h1>
<p className="text-gray-600 dark:text-gray-400 mt-1">
{filteredEmployees.length} von {employees.length} Mitarbeitern
{filteredEmployees.length} von {employees.length} Mitarbeitenden
</p>
{canCreateEmployee() && (
<button
onClick={() => navigate('/employees/new')}
className="btn-primary"
>
Mitarbeiter hinzufügen
Mitarbeitende hinzufügen
</button>
)}
</div>
@ -189,7 +189,7 @@ export default function EmployeeList() {
{filteredEmployees.length === 0 && (
<div className="text-center py-12">
<p className="text-tertiary">Keine Mitarbeiter gefunden</p>
<p className="text-tertiary">Keine Mitarbeitenden gefunden</p>
</div>
)}
</div>

Datei anzeigen

@ -142,7 +142,7 @@ export default function MyProfile() {
const payload = {
firstName: form.firstName,
lastName: form.lastName,
position: form.position || 'Mitarbeiter',
position: form.position || 'Teammitglied',
department: form.department || '',
employeeNumber: form.employeeNumber || undefined,
email: user?.email || form.email,
@ -178,7 +178,7 @@ export default function MyProfile() {
return (
<div>
<h1 className="text-title-lg font-poppins font-bold text-primary mb-4">Mein Profil</h1>
<p className="text-tertiary">Kein Mitarbeiterprofil mit Ihrem Nutzer verknüpft.</p>
<p className="text-tertiary">Kein Mitarbeitendenprofil mit Ihrem Nutzer verknüpft.</p>
</div>
)
}

Datei anzeigen

@ -117,8 +117,7 @@ export default function Settings() {
<span className="font-medium">Entwickelt für:</span> Sicherheitsbehörden
</p>
<p className="text-small text-tertiary mt-4">
SkillMate ist eine spezialisierte Anwendung zur Verwaltung von
Mitarbeiterfähigkeiten und -kompetenzen in Sicherheitsbehörden.
SkillMate ist eine spezialisierte Anwendung zur Verwaltung von Fähigkeiten und Kompetenzen der Mitarbeitenden in Sicherheitsbehörden.
</p>
</div>
</div>

Datei anzeigen

@ -396,7 +396,7 @@ export default function SkillSearch() {
)}
</div>
<span className="text-xs text-tertiary ml-auto">
{skill.userCount} Mitarbeiter
{skill.userCount} Mitarbeitende
</span>
</div>
</button>
@ -530,7 +530,7 @@ export default function SkillSearch() {
<div className="lg:col-span-1">
<div className="card">
<h2 className="text-title-card font-poppins font-semibold text-primary mb-4">
Mitarbeiter
Mitarbeitende
{filteredEmployees.length > 0 && (
<span className="ml-2 text-body font-normal text-tertiary">
({filteredEmployees.length})
@ -547,7 +547,7 @@ export default function SkillSearch() {
) : filteredEmployees.length === 0 ? (
<div className="text-center py-8">
<p className="text-tertiary text-sm">
Keine Mitarbeiter gefunden
Keine Mitarbeitenden gefunden
</p>
</div>
) : (

Datei anzeigen

@ -418,7 +418,7 @@ export default function TeamZusammenstellung() {
Team-Zusammenstellung
</h1>
<p className="text-tertiary">
Wählen Sie Skills oder nutzen Sie die Filter, um passende Mitarbeiter zu finden und Ihrem Team zuzuweisen.
Wählen Sie Skills oder nutzen Sie die Filter, um passende Mitarbeitende zu finden und Ihrem Team zuzuweisen.
</p>
</div>
@ -629,8 +629,8 @@ export default function TeamZusammenstellung() {
<div className="card">
<h2 className="text-title-card font-poppins font-semibold text-primary mb-4">
{selectedSkills.size > 0 || searchTerm || selectedDepartment || selectedPosition
? `Gefilterte Mitarbeiter (${filteredEmployees.length})`
: `Mitarbeiter`
? `Gefilterte Mitarbeitende (${filteredEmployees.length})`
: `Mitarbeitende`
}
</h2>
@ -641,12 +641,12 @@ export default function TeamZusammenstellung() {
Nutzen Sie die Filter oder wählen Sie Skills aus
</p>
<p className="text-sm text-tertiary">
Die passenden Mitarbeiter werden dann hier angezeigt
Die passenden Mitarbeitenden werden dann hier angezeigt
</p>
</div>
) : filteredEmployees.length === 0 ? (
<p className="text-center text-tertiary py-8">
Keine passenden Mitarbeiter gefunden
Keine passenden Mitarbeitenden gefunden
</p>
) : (
filteredEmployees.map((employee: any) => {
@ -912,7 +912,7 @@ export default function TeamZusammenstellung() {
</button>
) : (
<div className="py-2 text-center text-xs text-gray-400">
Wählen Sie einen Mitarbeiter aus
Wählen Sie eine Person aus
</div>
)}
</div>