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' ? ( handleSkillToggle(category.id, sub.id, skill.id, skill.name)} - /> - {skill.name} - - {isSkillSelected(category.id, sub.id, skill.id) && ( -
    - handleSkillLevelChange(category.id, sub.id, skill.id, String(val))} + {sub.skills.map(skill => { + const booleanSkill = isBooleanSkill(category.id, sub.id) + const selected = isSkillSelected(category.id, sub.id, skill.id) + return ( +
    +
    - )} - -
    - ))} + {skill.name} + + {selected && ( + booleanSkill ? ( + Ja + ) : ( +
    + handleSkillLevelChange(category.id, sub.id, skill.id, String(val))} + /> +
    + ) + )} + + + ) + })} ))}