diff --git a/CLAUDE_PROJECT_README.md b/CLAUDE_PROJECT_README.md
index 2d1e72a..cc993a4 100644
--- a/CLAUDE_PROJECT_README.md
+++ b/CLAUDE_PROJECT_README.md
@@ -5,9 +5,9 @@
## Project Overview
- **Path**: `A:\GiTea\SkillMate`
-- **Files**: 189 files
-- **Size**: 4.6 MB
-- **Last Modified**: 2025-09-29 01:39
+- **Files**: 268 files
+- **Size**: 5.7 MB
+- **Last Modified**: 2025-09-29 20:12
## Technology Stack
@@ -84,6 +84,59 @@ backend/
│ ├── skillmate.dev.encrypted.db
│ ├── skillmate.dev.encrypted.db-shm
│ ├── skillmate.dev.encrypted.db-wal
+│ ├── dist/
+│ │ ├── index.js
+│ │ ├── index.js.map
+│ │ ├── config/
+│ │ │ ├── appConfig.js
+│ │ │ ├── appConfig.js.map
+│ │ │ ├── database.js
+│ │ │ ├── database.js.map
+│ │ │ ├── secureDatabase.js
+│ │ │ └── secureDatabase.js.map
+│ │ ├── middleware/
+│ │ │ ├── auth.js
+│ │ │ ├── auth.js.map
+│ │ │ ├── errorHandler.js
+│ │ │ ├── errorHandler.js.map
+│ │ │ ├── roleAuth.js
+│ │ │ └── roleAuth.js.map
+│ │ ├── repositories/
+│ │ │ ├── employeeRepository.js
+│ │ │ └── employeeRepository.js.map
+│ │ ├── routes/
+│ │ │ ├── analytics.js
+│ │ │ ├── analytics.js.map
+│ │ │ ├── auth.js
+│ │ │ ├── auth.js.map
+│ │ │ ├── employeeOrganization.js
+│ │ │ ├── employeeOrganization.js.map
+│ │ │ ├── employees.js
+│ │ │ ├── employees.js.map
+│ │ │ ├── employeesSecure.js
+│ │ │ └── employeesSecure.js.map
+│ │ ├── services/
+│ │ │ ├── auditService.js
+│ │ │ ├── auditService.js.map
+│ │ │ ├── emailService.js
+│ │ │ ├── emailService.js.map
+│ │ │ ├── encryption.js
+│ │ │ ├── encryption.js.map
+│ │ │ ├── reminderService.js
+│ │ │ ├── reminderService.js.map
+│ │ │ ├── skillSeeder.js
+│ │ │ └── skillSeeder.js.map
+│ │ ├── usecases/
+│ │ │ ├── employees.js
+│ │ │ ├── employees.js.map
+│ │ │ ├── users.js
+│ │ │ └── users.js.map
+│ │ ├── utils/
+│ │ │ ├── logger.js
+│ │ │ └── logger.js.map
+│ │ └── validation/
+│ │ ├── employeeValidators.js
+│ │ └── employeeValidators.js.map
│ ├── logs/
│ │ ├── combined.log
│ │ └── error.log
@@ -194,6 +247,8 @@ frontend/
│ │ └── skills.ts
│ ├── types/
│ │ └── electron.d.ts
+│ ├── utils/
+│ │ └── skillRules.ts
│ └── views/
│ ├── Dashboard.tsx
│ ├── DeskBooking.tsx
@@ -249,3 +304,4 @@ This project is managed with Claude Project Manager. To work with this project:
- README updated on 2025-09-27 12:01:06
- README updated on 2025-09-28 18:39:07
- README updated on 2025-09-29 19:21:55
+- README updated on 2025-09-29 20:15:07
diff --git a/frontend/src/utils/skillRules.ts b/frontend/src/utils/skillRules.ts
new file mode 100644
index 0000000..0f9ff34
--- /dev/null
+++ b/frontend/src/utils/skillRules.ts
@@ -0,0 +1,7 @@
+export const BOOLEAN_SKILL_GROUPS = new Set([
+ 'certifications.vehicles',
+ 'certifications.security_clearance'
+])
+
+export const isBooleanSkill = (categoryId: string, subCategoryId: string) =>
+ BOOLEAN_SKILL_GROUPS.has(`${categoryId}.${subCategoryId}`)
diff --git a/frontend/src/views/EmployeeDetail.tsx b/frontend/src/views/EmployeeDetail.tsx
index 5a284bf..110d9dd 100644
--- a/frontend/src/views/EmployeeDetail.tsx
+++ b/frontend/src/views/EmployeeDetail.tsx
@@ -5,7 +5,8 @@ import type { Employee } from '@skillmate/shared'
import SkillLevelBar from '../components/SkillLevelBar'
import OfficeMapModal from '../components/OfficeMapModal'
import { employeeApi } from '../services/api'
-import { useAuthStore } from '../stores/authStore'
+import { useAuthStore } from '../stores/authStore'
+import { isBooleanSkill } from '../utils/skillRules'
export default function EmployeeDetail() {
const { id } = useParams()
@@ -210,12 +211,18 @@ export default function EmployeeDetail() {
{selected.map((sk) => {
const info = employee.skills.find(es => es.id === sk.id)
const levelVal = info?.level ? Number(info.level) : ''
+ const booleanSkill = isBooleanSkill(cat.id, sub.id)
return (
{sk.name}
+ {booleanSkill && info && (
+ Ja
+ )}
- {}} disabled showHelp={false} />
+ {!booleanSkill && (
+ {}} disabled showHelp={false} />
+ )}
)
})}
diff --git a/frontend/src/views/EmployeeForm.tsx b/frontend/src/views/EmployeeForm.tsx
index 1f91ea4..1942d9e 100644
--- a/frontend/src/views/EmployeeForm.tsx
+++ b/frontend/src/views/EmployeeForm.tsx
@@ -5,6 +5,7 @@ import { employeeApi } from '../services/api'
import { SKILL_HIERARCHY, LANGUAGE_LEVELS } from '../data/skillCategories'
import PhotoPreview from '../components/PhotoPreview'
import OrganizationSelector from '../components/OrganizationSelector'
+import { isBooleanSkill } from '../utils/skillRules'
export default function EmployeeForm() {
const navigate = useNavigate()
@@ -87,7 +88,7 @@ export default function EmployeeForm() {
subCategoryId,
skillId,
name: skillName,
- level: ''
+ level: isBooleanSkill(categoryId, subCategoryId) ? 'yes' : ''
})
}
return { ...prev, skills }
@@ -95,6 +96,7 @@ export default function EmployeeForm() {
}
const handleSkillLevelChange = (categoryId: string, subCategoryId: string, skillId: string, level: string) => {
+ if (isBooleanSkill(categoryId, subCategoryId)) return
setFormData(prev => {
const skills = [...prev.skills]
const skill = skills.find(s =>
@@ -204,10 +206,10 @@ export default function EmployeeForm() {
const newEmployee: Partial = {
...formData,
skills: formData.skills.map((skill, index) => ({
- id: `skill-${index}`,
+ id: skill.skillId || `skill-${index}`,
name: skill.name,
category: skill.categoryId,
- level: skill.level || 3
+ level: isBooleanSkill(skill.categoryId, skill.subCategoryId) ? null : (skill.level || 'Basic')
})),
languages: formData.skills
.filter(s => s.subCategoryId === 'languages')
@@ -659,7 +661,9 @@ export default function EmployeeForm() {
{/* Niveauauswahl */}
{isSkillSelected(category.id, subCategory.id, skill.id) && (
- subCategory.id === 'languages' ? (
+ isBooleanSkill(category.id, subCategory.id) ? (
+ Ja
+ ) : subCategory.id === 'languages' ? (