Fix HR module and text visibility issues
- Added missing HR endpoints: /hr/departments and /hr/positions - Fixed text color visibility (removed dark mode causing white text) - Ensured all input fields have proper dark text color - Added proper placeholder styling for forms Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -123,6 +123,28 @@ export class HRController {
|
|||||||
next(error);
|
next(error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ========== DEPARTMENTS ==========
|
||||||
|
|
||||||
|
async findAllDepartments(req: AuthRequest, res: Response, next: NextFunction) {
|
||||||
|
try {
|
||||||
|
const departments = await hrService.findAllDepartments();
|
||||||
|
res.json(ResponseFormatter.success(departments));
|
||||||
|
} catch (error) {
|
||||||
|
next(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ========== POSITIONS ==========
|
||||||
|
|
||||||
|
async findAllPositions(req: AuthRequest, res: Response, next: NextFunction) {
|
||||||
|
try {
|
||||||
|
const positions = await hrService.findAllPositions();
|
||||||
|
res.json(ResponseFormatter.success(positions));
|
||||||
|
} catch (error) {
|
||||||
|
next(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export const hrController = new HRController();
|
export const hrController = new HRController();
|
||||||
|
|||||||
@@ -29,5 +29,13 @@ router.post('/leaves/:id/approve', authorize('hr', 'leaves', 'approve'), hrContr
|
|||||||
|
|
||||||
router.post('/salaries/process', authorize('hr', 'salaries', 'process'), hrController.processSalary);
|
router.post('/salaries/process', authorize('hr', 'salaries', 'process'), hrController.processSalary);
|
||||||
|
|
||||||
|
// ========== DEPARTMENTS ==========
|
||||||
|
|
||||||
|
router.get('/departments', authorize('hr', 'all', 'read'), hrController.findAllDepartments);
|
||||||
|
|
||||||
|
// ========== POSITIONS ==========
|
||||||
|
|
||||||
|
router.get('/positions', authorize('hr', 'all', 'read'), hrController.findAllPositions);
|
||||||
|
|
||||||
export default router;
|
export default router;
|
||||||
|
|
||||||
|
|||||||
@@ -377,6 +377,35 @@ class HRService {
|
|||||||
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
|
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
|
||||||
return diffDays + 1;
|
return diffDays + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ========== DEPARTMENTS ==========
|
||||||
|
|
||||||
|
async findAllDepartments() {
|
||||||
|
const departments = await prisma.department.findMany({
|
||||||
|
where: { isActive: true },
|
||||||
|
orderBy: { name: 'asc' }
|
||||||
|
});
|
||||||
|
return departments;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ========== POSITIONS ==========
|
||||||
|
|
||||||
|
async findAllPositions() {
|
||||||
|
const positions = await prisma.position.findMany({
|
||||||
|
where: { isActive: true },
|
||||||
|
include: {
|
||||||
|
department: {
|
||||||
|
select: {
|
||||||
|
id: true,
|
||||||
|
name: true,
|
||||||
|
nameAr: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
orderBy: { title: 'asc' }
|
||||||
|
});
|
||||||
|
return positions;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export const hrService = new HRService();
|
export const hrService = new HRService();
|
||||||
|
|||||||
@@ -3,27 +3,32 @@
|
|||||||
@tailwind utilities;
|
@tailwind utilities;
|
||||||
|
|
||||||
:root {
|
:root {
|
||||||
--foreground-rgb: 0, 0, 0;
|
--foreground-rgb: 17, 24, 39;
|
||||||
--background-start-rgb: 214, 219, 220;
|
--background-rgb: 255, 255, 255;
|
||||||
--background-end-rgb: 255, 255, 255;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
:root {
|
|
||||||
--foreground-rgb: 255, 255, 255;
|
|
||||||
--background-start-rgb: 0, 0, 0;
|
|
||||||
--background-end-rgb: 0, 0, 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
color: rgb(var(--foreground-rgb));
|
color: rgb(var(--foreground-rgb));
|
||||||
background: linear-gradient(
|
background: rgb(var(--background-rgb));
|
||||||
to bottom,
|
min-height: 100vh;
|
||||||
transparent,
|
}
|
||||||
rgb(var(--background-end-rgb))
|
|
||||||
)
|
/* Force dark text for all text elements */
|
||||||
rgb(var(--background-start-rgb));
|
* {
|
||||||
|
color: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
input,
|
||||||
|
textarea,
|
||||||
|
select {
|
||||||
|
color: rgb(17, 24, 39) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Ensure placeholder text is visible */
|
||||||
|
input::placeholder,
|
||||||
|
textarea::placeholder {
|
||||||
|
color: rgb(156, 163, 175) !important;
|
||||||
|
opacity: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Font Families */
|
/* Font Families */
|
||||||
|
|||||||
Reference in New Issue
Block a user