Dummydaten und Sprache angepasst
Dieser Commit ist enthalten in:
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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"
|
||||
|
||||
@ -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": {
|
||||
|
||||
@ -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):')
|
||||
|
||||
@ -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>
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@ -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>
|
||||
</>
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@ -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>
|
||||
|
||||
|
||||
@ -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 },
|
||||
|
||||
@ -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')}
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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>
|
||||
)
|
||||
}
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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>
|
||||
) : (
|
||||
|
||||
@ -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>
|
||||
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren