From a92af22a9898dca2b3f02b604797172a7fefde82 Mon Sep 17 00:00:00 2001 From: TamilRamGanesan-SF5080 Date: Sun, 21 Dec 2025 22:52:58 +0530 Subject: [PATCH] 1000396: Added responsive for All the pages in employee portal --- Employee_Managment_App/public/background.png | Bin 0 -> 47994 bytes Employee_Managment_App/public/index.html | 13 +- Employee_Managment_App/src/App.css | 370 ++++++++---------- .../src/components/Achievements.css | 33 +- .../src/components/Announcement.css | 2 +- .../src/components/AnnouncementDialog.css | 23 +- .../src/components/EmployeeInfo.tsx | 3 +- .../src/components/EmployeeLeave.css | 103 +++++ .../src/components/EmployeeLeave.tsx | 44 ++- .../src/components/EmployeePayRoll.tsx | 176 ++++++--- .../src/components/Employees.css | 2 +- .../src/components/Policies.css | 2 +- .../src/components/Policies.tsx | 1 + .../src/components/TopNav.css | 7 +- Employee_Managment_App/src/index.css | 259 +++--------- 15 files changed, 552 insertions(+), 486 deletions(-) create mode 100644 Employee_Managment_App/public/background.png diff --git a/Employee_Managment_App/public/background.png b/Employee_Managment_App/public/background.png new file mode 100644 index 0000000000000000000000000000000000000000..466b3eb5fb0c46a02e8b5c3992fa8f4526b48a44 GIT binary patch literal 47994 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 - + + - +
- + \ No newline at end of file diff --git a/Employee_Managment_App/src/App.css b/Employee_Managment_App/src/App.css index 7ee1bf7..d7d9455 100644 --- a/Employee_Managment_App/src/App.css +++ b/Employee_Managment_App/src/App.css @@ -1,237 +1,195 @@ -/* 1. GENERAL: Container paddings shrink, stacking, font adapt for mobile */ -@media (max-width: 768px) { - .app-layout { - padding-left: 0 !important; - padding-right: 0 !important; - min-width: 0; - font-size: 15px; - } - .app-main { - padding: 6px 0 0 0 !important; - } - .achievements-container, - .policies-content, - .employees-content { - padding: 10px 5px !important; - } +/* Fallbacks; App.tsx sets actual values via inline CSS variables */ +:root { + --header-h: 56px; + --sidebar-expanded: 240px; + --sidebar-collapsed: 72px; + --sidebar-current-width: var(--sidebar-expanded); } -/* 2. SIDEBAR: overlay, hide, and usability tweaks for mobile */ -@media (max-width: 991px) { - .e-sidebar { - width: 80vw !important; - min-width: 200px !important; - max-width: 97vw !important; - left: 0 !important; - top: 0 !important; - height: 100vh !important; - border-radius: 0 !important; - box-shadow: 0 2px 24px rgba(0,0,0,0.22); - z-index: 1111; - } +/* Container that holds header, sidebar, and main */ +.app-layout { + position: relative; + min-height: 100vh; + background: #f6f7f9; + color: #1f2937; +} + +/* Fixed sidebar */ +.app-sidebar { + position: fixed; + top: 0; + left: 0; + bottom: 0; + background-image: url(../public/background.png); + width: var(--sidebar-current-width); + background-color: #242a35; + color: #fff; + overflow: auto; + z-index: 1010; /* sits over header on mobile when open */ + transition: width 220ms ease, transform 220ms ease; +} + +/* Sidebar header row */ +.sidebar-brand { + display: flex; + align-items: center; + justify-content: space-between; + height: var(--header-h); + padding: 0 16px; + border-bottom: 1px solid rgba(255,255,255,0.08); + font-weight: 600; +} + +/* Top navigation bar positioning (content styled in TopNav.css) */ +.topnav { + position: fixed; + top: 0; + left: var(--sidebar-current-width); + width: calc(100% - var(--sidebar-current-width)); + height: var(--header-h); + z-index: 1000; + transition: left 220ms ease, width 220ms ease; +} + +/* Main content area takes the remaining space */ +.app-main { + position: relative; + margin-left: var(--sidebar-current-width); + padding: calc(var(--header-h) + 16px) 0 24px; + min-height: 100vh; + box-sizing: border-box; + background: #fff; + transition: margin-left 220ms ease; +} + +/* Optional: collapse style tweaks */ +.sidebar-is-collapsed .sidebar-brand .title { + display: none; +} + +/* Mobile/tablet: make sidebar off-canvas and let header+main take full width */ +@media (max-width: 991.98px) { .app-sidebar { - min-width: 0; - width: 100% !important; - padding: 0 !important; + transform: translateX(-100%); + width: var(--sidebar-expanded); } - .sidebar-brand { - gap: 8px !important; - font-size: 19px; - padding: 8px 0 9px 12px !important; + .app-layout.mobile-sidebar-is-open .app-sidebar { + transform: translateX(0); + box-shadow: 0 8px 24px rgba(0,0,0,0.2); } - .sidebar-toggle { - margin-left: auto; + + .topnav { + left: 0; + width: 100%; } - .nav.flex-column { - gap: 0; - padding: 2px 0; + + .app-main { + margin-left: 0; + width: 100%; + padding: calc(var(--header-h) + 12px) 12px 20px; } } -/* 3. TOP NAV: squash items, stack user info, hide create if needed */ -@media (max-width: 768px) { - .topnav-inner { - gap: 3px !important; - padding: 0 4px !important; - } - .cluster-right { - gap: 3px !important; - } - .btn-create-group, .btn-create { - min-width: 70px !important; - padding: 0 7px; - font-size: 13px !important; - } - .topnav-avatar-name { - font-size: 12px; - margin-left: 4px !important; - word-break: break-all; - } +/* Basic nav list resets (optional) */ +.nav { + list-style: none; + padding: 8px 0; + margin: 0; +} +.nav .nav-item .nav-link { + padding: 10px 16px; + color: #cfd6e4; + text-decoration: none; +} +.nav .nav-item .nav-link.active, +.nav .nav-item .nav-link:hover { + background: rgba(255,255,255,0.08); + color: #fff; } -/* 4. SEARCH: search bar fills width, form controls height shrink */ -@media (max-width: 768px) { - .cluster-center, .search-form { - width: 97vw !important; - min-width: 0 !important; - max-width: 99vw !important; - } - .search-form .search-field { - height: 32px !important; - font-size: 14px; - } +#employees_grid .e-pager .e-currentitem, #employees_grid .e-pager .e-currentitem:hover { + background: var(--color-sf-primary-bg-color); + border-color: var(--color-sf-primary-bg-color); + color: var(--color-sf-primary-text-color); } -/* Mobile search field needs full width */ -@media (max-width: 530px) { - .search-form, - .search-field.input-group { - width: 99vw !important; - min-width: 0 !important; - max-width: 100vw !important; - } + +/* Sidebar header with internal toggle */ +.app-sidebar .sidebar-brand { + display: flex; + align-items: center; + height: 56px; + padding: 0 12px; + gap: 10px; + border-bottom: 1px solid #1f2937; } -/* 5. BUTTONS, CHIPS, and TOOLBARS: stack and compress */ -@media (max-width: 640px) { - .toolbar-right, - .org-filters__pills, - .filter-chip-row { - flex-wrap: wrap !important; - gap: 7px !important; - row-gap: 6px !important; - justify-content: flex-start !important; - } - .toolbar-field, .filter-chip { - font-size: 13px !important; - padding: 6px 10px !important; - } - .annc-panel-tabs button { - padding: 8px 4px !important; - } +.app-sidebar .sidebar-brand .sidebar-toggle { + display: inline-flex; + align-items: center; + justify-content: center; + width: 34px; + height: 34px; + border-radius: 8px; + background: transparent; + border: 1px solid rgba(255,255,255,0.12); + color: #e5e7eb; + cursor: pointer; } -/* 6. GRIDS/TABLES: Horizontal scroll for overflow columns on mobile */ -@media (max-width: 900px) { - .e-grid, .lb-sections, .policies-grid-wrapper .e-grid { - overflow-x: auto !important; - min-width: 360px !important; - width: 100vw !important; - } +.app-sidebar .sidebar-brand .title { + color: #e5e7eb; + font-weight: 600; + font-size: 16px; } -/* For actual grid row cells, allow wrapping */ -@media (max-width: 640px) { - .e-grid .e-rowcell, .lb-row, .policy-name-cell { - font-size: 13px !important; - padding-left: 4px !important; - padding-right: 4px !important; - white-space: normal !important; - } + +/* Nav items: icon + text; hide text when docked */ +.app-sidebar .nav { + padding: 8px 6px; + margin: 0; } -/* Keep action buttons visible in grid on small screens */ -@media (max-width: 640px) { - .policy-dialog, .e-dialog { - max-width: 97vw !important; - min-width: 0 !important; - } + +.app-sidebar .nav-item { + list-style: none; + margin: 2px 0; } -/* 7. EMPLOYEE PROFILE (tabs, avatar, flexing) */ -@media (max-width: 600px) { - .overview-header { - flex-direction: column !important; - align-items: flex-start !important; - gap: 3px !important; - } - .profile-data-name, .profile-data-mail, .profile-data-designation, .profile-data-supervisor, .profile-data-branch { - font-size: 14px !important; - } - .profile-image svg { - width: 48px !important; - height: 48px !important; - } +.app-sidebar .nav-link { + display: flex; + align-items: center; + gap: 12px; + padding: 10px 12px; + color: #cbd5e1; + border-radius: 8px; + text-decoration: none; } -/* 8. DIALOGS/ANNOUNCEMENTS: Center and fill for mobile */ -@media (max-width: 570px) { - .e-annc-detail-dialog.e-dialog, .policy-dialog.e-dialog { - width: 97vw !important; - max-width: 97vw !important; - left: 1vw !important; - right: 1vw !important; - min-width: 0 !important; - border-radius: 11px !important; - padding-left: 0 !important; - padding-right: 0 !important; - } - .annc-dlg-content { - padding-left: 2vw !important; - padding-right: 2vw !important; - } +.app-sidebar .nav-link.active, +.app-sidebar .nav-link:hover { + background: rgba(255,255,255,0.06); + color: #fff; } -/* 9. ANNOUNCEMENTS PANEL: right panel covers full width on tiny screens */ -@media (max-width: 480px) { - .annc-right-panel { - width: 99vw !important; - min-width: 0 !important; - left: 0 !important; - border-radius: 0 !important; - max-width: 100vw !important; - font-size: 14px !important; - } - .annc-panel-header, .annc-panel-tabs, .annc-panel-content { - padding-left: 8px !important; - padding-right: 8px !important; - } +.app-sidebar .nav-icon { + display: inline-flex; + justify-content: center; + align-items: center; + font-size: 14px; + width: 18px; + height: 18px; + color: #cbd5e1; } -/* 10. LEADERBOARD/ACHIEVEMENTS: Stacked layout for sections on mobile */ -@media (max-width: 640px) { - .lb-sections { - grid-template-columns: 1fr !important; - } - .lb-section { - min-width: 0 !important; - border-radius: 10px !important; - margin-bottom: 14px !important; - } +/* When the layout is collapsed (desktop dock), hide text and center icons */ +.app-layout.sidebar-is-collapsed .app-sidebar .nav-link { + justify-content: center; + padding: 10px 0; } -/* 11. GENERAL: Shrink font slightly on XS mobile, compress app-body paddings */ -@media (max-width: 420px) { - html, body { - font-size: 13.6px !important; - } - .app-layout { - padding: 0 0 !important; - } +.app-layout.sidebar-is-collapsed .app-sidebar .nav-text { + display: none; } -@media (max-width: 991px) { - .e-sidebar { - width: 68vw !important; - font-size: 30px; - min-width: 160px !important; - max-width: 88vw !important; - border-top-right-radius: 20px; - border-bottom-right-radius: 20px; - box-shadow: 3px 0 10px rgba(0,0,0,0.34); - background: #222b3c; - } - .nav-icon{ - font-size:30px !important; - margin-right:15px; - } - .sidebar-brand{ - font-size: 35px; - } - .title{ - font-size: 35px !important; - } - .nav .flex-column{ - margin-top: 15px; - } - .sidebar-toggle{ - margin-right: 10px !important; - } +/* Keep brand title minimal when collapsed (we render 'HR' text already) */ +.app-layout.sidebar-is-collapsed .app-sidebar .sidebar-brand { + justify-content: center; } \ No newline at end of file diff --git a/Employee_Managment_App/src/components/Achievements.css b/Employee_Managment_App/src/components/Achievements.css index 7b9d23e..0545139 100644 --- a/Employee_Managment_App/src/components/Achievements.css +++ b/Employee_Managment_App/src/components/Achievements.css @@ -133,13 +133,39 @@ body, @media (max-width: 1280px) { .lb-sections { - grid-template-columns: repeat(2, minmax(260px, 1fr)); + grid-template-columns: repeat(1, minmax(260px, 1fr)); } } @media (max-width: 640px) { - .lb-sections { - grid-template-columns: 1fr; + .achievements-toolbar { + display: flex; + flex-direction: column; + } + .e-input-group{ + width:150px !important; + } + .toolbar-field{ + display: flex; + justify-content: space-between; + gap: 15px; + } + .toolbar-right{ + display:flex; + flex-direction: column; + } + .toolbar-left{ + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + text-align: center; + } + .topnav-avatar-name { + display: inline-block; + } + .icon-btn { + width: 51px; } } @@ -149,6 +175,7 @@ body, border: 1px solid var(--border); box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12); overflow: hidden; + border-radius: 10px; } /* Header - simple left color bar via icon badge, no gradient */ diff --git a/Employee_Managment_App/src/components/Announcement.css b/Employee_Managment_App/src/components/Announcement.css index 110a1e9..58a05d7 100644 --- a/Employee_Managment_App/src/components/Announcement.css +++ b/Employee_Managment_App/src/components/Announcement.css @@ -13,7 +13,7 @@ --color-sf-secondary-border-color-hover: #d1d5db; --color-sf-secondary-bg-color-hover: rgba(158, 158, 158, 0.2); --color-sf-content-text-color: #111827; - +} /* Backdrop area that starts below the top bar (top offset applied inline) */ .annc-panel-backdrop { position: fixed; diff --git a/Employee_Managment_App/src/components/AnnouncementDialog.css b/Employee_Managment_App/src/components/AnnouncementDialog.css index cc75ada..c6046e9 100644 --- a/Employee_Managment_App/src/components/AnnouncementDialog.css +++ b/Employee_Managment_App/src/components/AnnouncementDialog.css @@ -77,18 +77,32 @@ padding: 12px; margin-bottom: 14px; } - +@media (min-width: 960px) { .annc-dlg-details { display: flex; justify-content: space-between; align-items: center; } +} @media (max-width: 920px) { .annc-dlg-details { grid-template-columns: repeat(2, minmax(180px, 1fr)); } } -@media (max-width: 560px) { - .annc-dlg-details { grid-template-columns: 1fr; } -} +@media (max-width: 960px) { + .annc-dlg-details { + display: flex; + flex-direction: column; + justify-content: space-between; + } + .annc-dlg-details_item { + display: flex !important; + flex-direction: row !important; + justify-content: space-between; + align-items: center; + text-align: start ; + gap: 55px; + padding-bottom: 5px; + } + } .annc-dlg-details_item { min-width: 0; @@ -115,7 +129,6 @@ text-overflow: ellipsis; white-space: nowrap; } - .annc-dlg-section { margin-top: 6px; } .annc-dlg-section_title { font-size: 12px; diff --git a/Employee_Managment_App/src/components/EmployeeInfo.tsx b/Employee_Managment_App/src/components/EmployeeInfo.tsx index 3ad2292..2fa3e23 100644 --- a/Employee_Managment_App/src/components/EmployeeInfo.tsx +++ b/Employee_Managment_App/src/components/EmployeeInfo.tsx @@ -227,10 +227,11 @@ const EmployeeInfo = (props: { employeeData?: EmployeeDetails; userInfo?: Employ
{employeeData.Designation}
Supervisor: {employeeData.TeamLead}
Branch: {employeeData.Branch}
+
Available - {employeeData.Branch}
- + {employeeData && diff --git a/Employee_Managment_App/src/components/EmployeeLeave.css b/Employee_Managment_App/src/components/EmployeeLeave.css index daa18f5..74812f7 100644 --- a/Employee_Managment_App/src/components/EmployeeLeave.css +++ b/Employee_Managment_App/src/components/EmployeeLeave.css @@ -122,3 +122,106 @@ } /* (icon height handled above) */ + +/* --- Base badge look --- */ +.employee-leave-detail .e-badge { + display: inline-block; + padding: 4px 10px; + border-radius: 999px; + font-size: 12px; + font-weight: 600; + line-height: 1.2; + letter-spacing: .2px; +} + +/* Container for grid cell alignment */ +.leave-type-badge { + display: flex; + align-items: center; +} + +/* --- Leave Type (grid cells) --- */ +.lt-casual { + background-color: #D0E6FF; /* light blue */ + color: #0B63B6; /* dark blue text for contrast */ + border: 1px solid #9BC0F5; +} + +.lt-sick { + background-color: #A8E6CF; /* light green */ + color: #11624C; /* dark green */ + border: 1px solid #7BD4B4; +} + +.lt-emergency { + background-color: #FFD6D6; /* light red */ + color: #9B1C1C; /* dark red */ + border: 1px solid #F5A8A8; +} + +.lt-others { + background-color: #F2E6FF; /* light purple */ + color: #5B2E91; /* dark purple */ + border: 1px solid #D6C2F5; +} + +/* --- Header badges (summary) use same palette --- */ +.badge-casual { + background-color: #D0E6FF; + color: #0B63B6; + border: 1px solid #9BC0F5; +} + +.badge-sick { + background-color: #A8E6CF; + color: #11624C; + border: 1px solid #7BD4B4; +} + +.badge-others { + background-color: #F2E6FF; + color: #5B2E91; + border: 1px solid #D6C2F5; +} + +.badge-request { + background-color: #FFF3C4; /* light yellow for pending/request */ + color: #8A6A00; /* dark gold/brown */ + border: 1px solid #FFE28A; +} + +/* Optional: subtle hover for interactive feel in grid cells */ +.leave-type-badge .e-badge:hover { + filter: brightness(0.97); +} + +/* Optional: Dark mode support if your app has a dark theme class */ +.dark .lt-casual, .dark .badge-casual { + background-color: #193B59; + color: #CBE1FF; + border-color: #274B6B; +} + +.dark .lt-sick, .dark .badge-sick { + background-color: #124033; + color: #CBEFE2; + border-color: #1A5A47; +} + +.dark .lt-emergency, .dark .badge-emergency { + background-color: #4E1919; + color: #FFD9D9; + border-color: #6A2A2A; +} + +.dark .lt-others, .dark .badge-others { + background-color: #2E2150; + color: #E8DAFF; + border-color: #463775; +} + +.dark .badge-request { + background-color: #4B3F16; + color: #FFECA6; + border-color: #6A5617; +} diff --git a/Employee_Managment_App/src/components/EmployeeLeave.tsx b/Employee_Managment_App/src/components/EmployeeLeave.tsx index 64ff896..a921937 100644 --- a/Employee_Managment_App/src/components/EmployeeLeave.tsx +++ b/Employee_Managment_App/src/components/EmployeeLeave.tsx @@ -152,6 +152,28 @@ const EmployeeLeave = (props: { employeeData: EmployeeDetails; userInfo: Employe return { casual, sick, others, request }; } + +const leaveTypeTemplate = (args: any) => { + const rawType = String(args.AbsenceType || '').trim(); + const type = rawType.toLowerCase(); + + // Normalize common variants + const normalized = + type === 'casual' ? 'casual' : + type === 'sick' ? 'sick' : + type === 'emergency' ? 'emergency' : + 'others'; // default bucket + + return ( +
+ + {rawType || 'N/A'} + +
+ ); +}; + + const recomputeFromView = () => { if (!leaveGridIns.current) return; const viewRows = leaveGridIns.current.getCurrentViewRecords() as EmployeeLeaveDetails[]; @@ -243,14 +265,18 @@ const EmployeeLeave = (props: { employeeData: EmployeeDetails; userInfo: Employe }; return ( -
+
+
Leave:{' '} - {leaveCount.casual} d Casual |{' '} - {leaveCount.sick} d Sick |{' '} - {leaveCount.others} d Others |{' '} - {leaveCount.request} d Request +
+
+ {leaveCount.casual} d Casual |{' '} + {leaveCount.sick} d Sick |{' '} + {leaveCount.others} d Others |{' '} + {leaveCount.request} d Request +
@@ -263,7 +289,7 @@ const EmployeeLeave = (props: { employeeData: EmployeeDetails; userInfo: Employe dataSource={gridData} editSettings={{ allowEditing: true }} query={query} - allowPaging={false} + allowPaging={true} allowFiltering={true} filterSettings={{ type: 'Excel' }} toolbar={toolbar} @@ -280,10 +306,10 @@ const EmployeeLeave = (props: { employeeData: EmployeeDetails; userInfo: Employe - + - - + + {props.employeeData && diff --git a/Employee_Managment_App/src/components/EmployeePayRoll.tsx b/Employee_Managment_App/src/components/EmployeePayRoll.tsx index 239d212..a3fc10b 100644 --- a/Employee_Managment_App/src/components/EmployeePayRoll.tsx +++ b/Employee_Managment_App/src/components/EmployeePayRoll.tsx @@ -1,7 +1,24 @@ +// src/components/EmployeePayRoll.tsx import * as React from 'react'; -import { useRef } from 'react'; -import { GridComponent, ColumnsDirective, ColumnDirective, Filter, Page, Inject, Freeze, Aggregate, QueryCellInfoEventArgs } from '@syncfusion/ej2-react-grids'; -import { AggregateColumnDirective, AggregateColumnsDirective, AggregateDirective, AggregatesDirective, AggregateColumnModel } from '@syncfusion/ej2-react-grids'; +import { useRef, useEffect, useState } from 'react'; +import { + GridComponent, + ColumnsDirective, + ColumnDirective, + Filter, + Page, + Inject, + Freeze, + Aggregate, + QueryCellInfoEventArgs +} from '@syncfusion/ej2-react-grids'; +import { + AggregateColumnDirective, + AggregateColumnsDirective, + AggregateDirective, + AggregatesDirective, + AggregateColumnModel +} from '@syncfusion/ej2-react-grids'; import { DataManager, Query, UrlAdaptor } from '@syncfusion/ej2-data'; import { DropDownListComponent } from '@syncfusion/ej2-react-dropdowns'; import { EmployeeDetails, MonthPayStub } from '../interface.ts'; @@ -11,12 +28,18 @@ const gridData: DataManager = new DataManager({ adaptor: new UrlAdaptor(), }); +const MOBILE_BREAKPOINT = 768; // adjust breakpoint as needed + const EmployeePayRoll = (props: { employeeData: EmployeeDetails }) => { - let payRollGridIns = useRef(null); - let isPreviousYear: boolean = false; + const payRollGridIns = useRef(null); + const isPreviousYearRef = useRef(false); + + const [frozenCount, setFrozenCount] = useState(3); + const query: Query = new Query().where('EmployeeCode', 'equal', props.employeeData.EmployeeCode); const currentDate: Date = new Date(); const currentYear: number = currentDate.getFullYear() - 1; + const months: { field: string; headerText: string }[] = [ { field: 'JanPayStub', headerText: 'Jan' }, { field: 'FebPayStub', headerText: 'Feb' }, @@ -32,6 +55,23 @@ const EmployeePayRoll = (props: { employeeData: EmployeeDetails }) => { { field: 'DecPayStub', headerText: 'Dec' }, ]; + useEffect(() => { + const computeFrozen = () => { + const isMobile = typeof window !== 'undefined' && window.innerWidth <= MOBILE_BREAKPOINT; + // We have one hidden left column (EmployeeCode). + // Desktop: 2 visible frozen (Item, Total) => 1 hidden + 2 visible = 3 + // Mobile: 1 visible frozen (Item) => 1 hidden + 1 visible = 2 + const hiddenLeft = 1; + const desiredVisibleFrozen = isMobile ? 1 : 2; + setFrozenCount(hiddenLeft + desiredVisibleFrozen); + }; + + computeFrozen(); + const onResize = () => computeFrozen(); + window.addEventListener('resize', onResize); + return () => window.removeEventListener('resize', onResize); + }, []); + const itemTemplate = () => { return (
@@ -109,14 +149,15 @@ const EmployeePayRoll = (props: { employeeData: EmployeeDetails }) => { }; const paystubTemplate = (props: any) => { - const RegularHoursWorked: string = (props[props.column.field].RegularHoursWorked * (isPreviousYear ? 0.9 : 1)).toFixed(2); - const OverTimeHoursWorked: string = (props[props.column.field].OverTimeHoursWorked * (isPreviousYear ? 0.9 : 1)).toFixed(2); - const Bonus: string = (props[props.column.field].Bonus * (isPreviousYear ? 0.9 : 1)).toFixed(2); - const Commission: string = (props[props.column.field].Commission * (isPreviousYear ? 0.9 : 1)).toFixed(2); - const FederalIncomeTax: string = (props[props.column.field].FederalIncomeTax * (isPreviousYear ? 0.9 : 1)).toFixed(2); - const StateIncomeTax: string = (props[props.column.field].StateIncomeTax * (isPreviousYear ? 0.9 : 1)).toFixed(2); - const SocialSecurityTax: string = (props[props.column.field].SocialSecurityTax * (isPreviousYear ? 0.9 : 1)).toFixed(2); - const MedicareTax: string = (props[props.column.field].MedicareTax * (isPreviousYear ? 0.9 : 1)).toFixed(2); + const factor = isPreviousYearRef.current ? 0.9 : 1; + const RegularHoursWorked: string = (props[props.column.field].RegularHoursWorked * factor).toFixed(2); + const OverTimeHoursWorked: string = (props[props.column.field].OverTimeHoursWorked * factor).toFixed(2); + const Bonus: string = (props[props.column.field].Bonus * factor).toFixed(2); + const Commission: string = (props[props.column.field].Commission * factor).toFixed(2); + const FederalIncomeTax: string = (props[props.column.field].FederalIncomeTax * factor).toFixed(2); + const StateIncomeTax: string = (props[props.column.field].StateIncomeTax * factor).toFixed(2); + const SocialSecurityTax: string = (props[props.column.field].SocialSecurityTax * factor).toFixed(2); + const MedicareTax: string = (props[props.column.field].MedicareTax * factor).toFixed(2); return (
@@ -169,96 +210,129 @@ const EmployeePayRoll = (props: { employeeData: EmployeeDetails }) => { const queryCellInfo = (args: QueryCellInfoEventArgs): void => { if (args.column?.field === 'Total') { for (let i: number = 0; i < elemClass.length; i++) { - let elem: HTMLElement = args.cell?.querySelector('.' + elemClass[i]) as HTMLElement; + const elem: HTMLElement = args.cell?.querySelector('.' + elemClass[i]) as HTMLElement; let value: number = 0; for (let j: number = 0; j < months.length; j++) { if ((args.data as any)[months[j].field]) { - value += (args.data as any)[months[j].field][elemClass[i]] * (isPreviousYear ? 0.9 : 1); + value += (args.data as any)[months[j].field][elemClass[i]] * (isPreviousYearRef.current ? 0.9 : 1); } } - elem.innerText = '$ ' + value.toFixed(2); + if (elem) { + elem.innerText = '$ ' + value.toFixed(2); + } } } }; const calculteGrossAggregate = (data: any, aggColumn: AggregateColumnModel): string => { - let payStubData: MonthPayStub = data && data.result && data.result[0] ? data.result[0][aggColumn.field as string] : null; + const payStubData: MonthPayStub = + data && data.result && data.result[0] ? data.result[0][aggColumn.field as string] : null; if (payStubData) { - let grossSum: number = payStubData.RegularHoursWorked + payStubData.OverTimeHoursWorked + payStubData.Bonus + payStubData.Commission; - return (grossSum * (isPreviousYear ? 0.9 : 1)).toFixed(2); + const grossSum: number = + payStubData.RegularHoursWorked + + payStubData.OverTimeHoursWorked + + payStubData.Bonus + + payStubData.Commission; + return (grossSum * (isPreviousYearRef.current ? 0.9 : 1)).toFixed(2); } else { return ''; } }; const calculteDeductionAggregate = (data: any, aggColumn: AggregateColumnModel): string => { - let payStubData: MonthPayStub = data && data.result && data.result[0] ? data.result[0][aggColumn.field as string] : null; + const payStubData: MonthPayStub = + data && data.result && data.result[0] ? data.result[0][aggColumn.field as string] : null; if (payStubData) { - let deductionSum: number = payStubData.FederalIncomeTax + payStubData.StateIncomeTax + payStubData.SocialSecurityTax + payStubData.MedicareTax; - return (deductionSum * (isPreviousYear ? 0.9 : 1)).toFixed(2); + const deductionSum: number = + payStubData.FederalIncomeTax + + payStubData.StateIncomeTax + + payStubData.SocialSecurityTax + + payStubData.MedicareTax; + return (deductionSum * (isPreviousYearRef.current ? 0.9 : 1)).toFixed(2); } else { return ''; } }; const calculteNetPayAggregate = (data: any, aggColumn: AggregateColumnModel): string => { - let payStubData: MonthPayStub = data && data.result && data.result[0] ? data.result[0][aggColumn.field as string] : null; + const payStubData: MonthPayStub = + data && data.result && data.result[0] ? data.result[0][aggColumn.field as string] : null; if (payStubData) { - let grossSum: number = payStubData.RegularHoursWorked + payStubData.OverTimeHoursWorked + payStubData.Bonus + payStubData.Commission; - let deductionSum: number = payStubData.FederalIncomeTax + payStubData.StateIncomeTax + payStubData.SocialSecurityTax + payStubData.MedicareTax; - return ((grossSum - deductionSum) * (isPreviousYear ? 0.9 : 1)).toFixed(2); + const grossSum: number = + payStubData.RegularHoursWorked + + payStubData.OverTimeHoursWorked + + payStubData.Bonus + + payStubData.Commission; + const deductionSum: number = + payStubData.FederalIncomeTax + + payStubData.StateIncomeTax + + payStubData.SocialSecurityTax + + payStubData.MedicareTax; + return ((grossSum - deductionSum) * (isPreviousYearRef.current ? 0.9 : 1)).toFixed(2); } else { return ''; } }; const calculteGrossInYear = (data: any): string => { - let payStubData = data && data.result && data.result[0] ? data.result[0] : null; + const payStubData = data && data.result && data.result[0] ? data.result[0] : null; if (payStubData) { let grossSum: number = 0; months.forEach((x) => { - grossSum += (payStubData[x.field] as MonthPayStub).RegularHoursWorked + (payStubData[x.field] as MonthPayStub).OverTimeHoursWorked + - (payStubData[x.field] as MonthPayStub).Bonus + (payStubData[x.field] as MonthPayStub).Commission; + grossSum += + (payStubData[x.field] as MonthPayStub).RegularHoursWorked + + (payStubData[x.field] as MonthPayStub).OverTimeHoursWorked + + (payStubData[x.field] as MonthPayStub).Bonus + + (payStubData[x.field] as MonthPayStub).Commission; }); - return (grossSum * (isPreviousYear ? 0.9 : 1)).toFixed(2); + return (grossSum * (isPreviousYearRef.current ? 0.9 : 1)).toFixed(2); } else { return ''; } }; const calculteDeductionInYear = (data: any): string => { - let payStubData = data && data.result && data.result[0] ? data.result[0] : null; + const payStubData = data && data.result && data.result[0] ? data.result[0] : null; if (payStubData) { let deductionSum: number = 0; months.forEach((x) => { - deductionSum += (payStubData[x.field] as MonthPayStub).FederalIncomeTax + (payStubData[x.field] as MonthPayStub).StateIncomeTax + - (payStubData[x.field] as MonthPayStub).SocialSecurityTax + (payStubData[x.field] as MonthPayStub).MedicareTax; + deductionSum += + (payStubData[x.field] as MonthPayStub).FederalIncomeTax + + (payStubData[x.field] as MonthPayStub).StateIncomeTax + + (payStubData[x.field] as MonthPayStub).SocialSecurityTax + + (payStubData[x.field] as MonthPayStub).MedicareTax; }); - return (deductionSum * (isPreviousYear ? 0.9 : 1)).toFixed(2); + return (deductionSum * (isPreviousYearRef.current ? 0.9 : 1)).toFixed(2); } else { return ''; } }; const calculteNetPayInYear = (data: any): string => { - let payStubData = data && data.result && data.result[0] ? data.result[0] : null; + const payStubData = data && data.result && data.result[0] ? data.result[0] : null; if (payStubData) { let grossSum: number = 0; let deductionSum: number = 0; months.forEach((x) => { - grossSum += (payStubData[x.field] as MonthPayStub).RegularHoursWorked + (payStubData[x.field] as MonthPayStub).OverTimeHoursWorked + - (payStubData[x.field] as MonthPayStub).Bonus + (payStubData[x.field] as MonthPayStub).Commission; - deductionSum += (payStubData[x.field] as MonthPayStub).FederalIncomeTax + (payStubData[x.field] as MonthPayStub).StateIncomeTax + - (payStubData[x.field] as MonthPayStub).SocialSecurityTax + (payStubData[x.field] as MonthPayStub).MedicareTax; + grossSum += + (payStubData[x.field] as MonthPayStub).RegularHoursWorked + + (payStubData[x.field] as MonthPayStub).OverTimeHoursWorked + + (payStubData[x.field] as MonthPayStub).Bonus + + (payStubData[x.field] as MonthPayStub).Commission; + deductionSum += + (payStubData[x.field] as MonthPayStub).FederalIncomeTax + + (payStubData[x.field] as MonthPayStub).StateIncomeTax + + (payStubData[x.field] as MonthPayStub).SocialSecurityTax + + (payStubData[x.field] as MonthPayStub).MedicareTax; }); - return ((grossSum - deductionSum) * (isPreviousYear ? 0.9 : 1)).toFixed(2); + return ((grossSum - deductionSum) * (isPreviousYearRef.current ? 0.9 : 1)).toFixed(2); } else { return ''; } }; const payrollChange = (args: { value: number }) => { - isPreviousYear = args.value !== currentYear; + isPreviousYearRef.current = args.value !== currentYear; payRollGridIns.current?.refresh(); }; @@ -280,12 +354,12 @@ const EmployeePayRoll = (props: { employeeData: EmployeeDetails }) => { id="payroll_grid" ref={payRollGridIns} dataSource={gridData} - allowPaging={false} + allowPaging={true} query={query} width={'100%'} height={'auto'} queryCellInfo={queryCellInfo} - frozenColumns={3} + frozenColumns={frozenCount} // responsive frozen columns enableHover={false} allowSelection={false} > @@ -295,31 +369,34 @@ const EmployeePayRoll = (props: { employeeData: EmployeeDetails }) => { headerText="Code" visible={false} width="120" - > + /> + /> + /> {months.map((x, index) => { return ( + /> ); })} + @@ -353,6 +430,7 @@ const EmployeePayRoll = (props: { employeeData: EmployeeDetails }) => { })} + { })} + { +
); }; -export default EmployeePayRoll; +export default EmployeePayRoll; \ No newline at end of file diff --git a/Employee_Managment_App/src/components/Employees.css b/Employee_Managment_App/src/components/Employees.css index 4dfb585..3f905ca 100644 --- a/Employee_Managment_App/src/components/Employees.css +++ b/Employee_Managment_App/src/components/Employees.css @@ -1,3 +1,3 @@ #employees_grid .e-content { overflow-y: hidden !important; -} \ No newline at end of file +} diff --git a/Employee_Managment_App/src/components/Policies.css b/Employee_Managment_App/src/components/Policies.css index 6ab27de..59971d6 100644 --- a/Employee_Managment_App/src/components/Policies.css +++ b/Employee_Managment_App/src/components/Policies.css @@ -333,7 +333,7 @@ .meta-value { font-weight: 600; - font-size: 11px; + font-size: 12px; padding-top: 5px; color: var(--text-strong); } diff --git a/Employee_Managment_App/src/components/Policies.tsx b/Employee_Managment_App/src/components/Policies.tsx index e735ea0..f7c338f 100644 --- a/Employee_Managment_App/src/components/Policies.tsx +++ b/Employee_Managment_App/src/components/Policies.tsx @@ -151,6 +151,7 @@ const Policies: React.FC = () => { dataSource={filteredData} allowPaging allowSorting + enableAdaptiveUI={true} allowResizing toolbar={['Search']} pageSettings={{ pageSize: 5 }} diff --git a/Employee_Managment_App/src/components/TopNav.css b/Employee_Managment_App/src/components/TopNav.css index 15d3d8b..2e57159 100644 --- a/Employee_Managment_App/src/components/TopNav.css +++ b/Employee_Managment_App/src/components/TopNav.css @@ -89,8 +89,9 @@ .company-name { font-size: 16px; - font-weight: bold; color: rgba(0, 0, 0, 0.87); + font-family: math; + font-weight: 800; } /* Center cluster: search */ @@ -420,7 +421,9 @@ top: var(--topnav-height); z-index: 999; border-bottom: 1px solid var(--topnav-border); - padding: 8px; + padding-right:66px; + padding-top:8px; + padding-bottom: 8px; background: #fff; } diff --git a/Employee_Managment_App/src/index.css b/Employee_Managment_App/src/index.css index 4a59c7a..af7c811 100644 --- a/Employee_Managment_App/src/index.css +++ b/Employee_Managment_App/src/index.css @@ -16,7 +16,7 @@ text-transform: none; } #payroll_grid .e-summaryrow .e-leftfreeze.e-summarycell[data-index="2"] { - border-right-color: #818cf8; + border-right-color: #7ee098; border-right-width: 2px; } @@ -2380,7 +2380,7 @@ --color-sf-dialog-border: #fff; --color-sf-primary: #1ab394; --color-sf-primary-text-color: #fff; - --color-sf-primary-light: #818cf8; + --color-sf-primary-light: #7ee098; --color-sf-primary-lighter: #e0e7ff; --color-sf-primary-dark: #4338ca; --color-sf-primary-darker: #3730a3; @@ -2784,7 +2784,7 @@ --color-sf-dialog-border: rgba(255, 255, 255, .1); --color-sf-primary: rgba(99, 102, 241); --color-sf-primary-text-color: #000; - --color-sf-primary-light: #3730a3; + --color-sf-primary-light: #58d378; --color-sf-primary-lighter: #1e1b4b; --color-sf-primary-dark: #818cf8; --color-sf-primary-darker: #4f46e5; @@ -58138,16 +58138,46 @@ ejs-sidebar { width: auto; } } - +.payrollpage .CardTable{ + margin-left: 35px; +} +.e-leftfreeze .CardTable { + margin-left: 0px; +} +.e-rightalign .CardTable { + margin-left: 25px; +} @media (max-width: 768px) { + .payrollpage .CardTable{ + margin-left: 25px; +} +.e-leftfreeze .CardTable{ + margin-left: 0px; +} + +td[aria-label=" is template cell column header Total"] .CardTable { + margin-left: 20px; /* Adjust as needed */ +} + .e-prompt-dialog.e-dialog.e-popup, .e-prompt-dialog.e-dialog.e-popup { margin: 30px; width: auto; } + #payroll_grid .e-summaryrow .e-leftfreeze.e-summarycell[data-index="1"] { + border-right-color: #7ee098; + border-right-width: 2px; + } + + #payroll_grid.e-grid.e-left-shadow .e-summaryrow .e-leftfreeze.e-summarycell[data-index="1"] { + clip-path: inset(0 -15px 0 0); + box-shadow: 4px 0 8px rgba(0, 0, 0, 0.12); + border-right-width: 0px; + } } + @media (min-width: 768px) { .e-prompt-dialog.e-dialog.e-popup, @@ -70905,6 +70935,28 @@ td.cardcell.separateline { .statustxt.approved { color: #654321; } +.Profile-data-availability{ + margin-top: 5px; + background-color: #58d378; + color: white; + font-size: 11px; + animation-name: blinker; + animation-duration: 2s; + animation-timing-function: linear; + animation-iteration-count: infinite; +} + +@keyframes blinker { + 0% { + opacity: 1; + } + 50% { + opacity: 0; + } + 100% { + opacity: 1; + } +} .statustemp.needtoapprove { background-color: #df2222; @@ -71061,201 +71113,8 @@ td.cardcell.separateline { margin-left: 72px; padding-top: 56px; } + .employeeLeave-header .e-input-group.e-control-wrapper{ + margin-top: 5px; + width: 240px !important; } - -/* src/App.css */ - -/* Fallbacks; App.tsx sets actual values via inline CSS variables */ -:root { - --header-h: 56px; - --sidebar-expanded: 240px; - --sidebar-collapsed: 72px; - --sidebar-current-width: var(--sidebar-expanded); -} - -/* Container that holds header, sidebar, and main */ -.app-layout { - position: relative; - min-height: 100vh; - background: #f6f7f9; - color: #1f2937; } - -/* Fixed sidebar */ -.app-sidebar { - position: fixed; - top: 0; - left: 0; - bottom: 0; - width: var(--sidebar-current-width); - background: #242a35; - color: #fff; - overflow: auto; - z-index: 1010; /* sits over header on mobile when open */ - transition: width 220ms ease, transform 220ms ease; -} - -/* Sidebar header row */ -.sidebar-brand { - display: flex; - align-items: center; - justify-content: space-between; - height: var(--header-h); - padding: 0 16px; - border-bottom: 1px solid rgba(255,255,255,0.08); - font-weight: 600; -} - -/* Top navigation bar positioning (content styled in TopNav.css) */ -.topnav { - position: fixed; - top: 0; - left: var(--sidebar-current-width); - width: calc(100% - var(--sidebar-current-width)); - height: var(--header-h); - z-index: 1000; - transition: left 220ms ease, width 220ms ease; -} - -/* Main content area takes the remaining space */ -.app-main { - position: relative; - margin-left: var(--sidebar-current-width); - padding: calc(var(--header-h) + 16px) 0 24px; - min-height: 100vh; - box-sizing: border-box; - background: #fff; - transition: margin-left 220ms ease; -} - -/* Optional: collapse style tweaks */ -.sidebar-is-collapsed .sidebar-brand .title { - display: none; -} - -/* Mobile/tablet: make sidebar off-canvas and let header+main take full width */ -@media (max-width: 991.98px) { - .app-sidebar { - transform: translateX(-100%); - width: var(--sidebar-expanded); - } - .app-layout.mobile-sidebar-is-open .app-sidebar { - transform: translateX(0); - box-shadow: 0 8px 24px rgba(0,0,0,0.2); - } - - .topnav { - left: 0; - width: 100%; - } - - .app-main { - margin-left: 0; - width: 100%; - padding: calc(var(--header-h) + 12px) 12px 20px; - } -} - -/* Basic nav list resets (optional) */ -.nav { - list-style: none; - padding: 8px 0; - margin: 0; -} -.nav .nav-item .nav-link { - padding: 10px 16px; - color: #cfd6e4; - text-decoration: none; -} -.nav .nav-item .nav-link.active, -.nav .nav-item .nav-link:hover { - background: rgba(255,255,255,0.08); - color: #fff; -} - -#employees_grid .e-pager .e-currentitem, #employees_grid .e-pager .e-currentitem:hover { - background: var(--color-sf-primary-bg-color); - border-color: var(--color-sf-primary-bg-color); - color: var(--color-sf-primary-text-color); -} - -/* Sidebar header with internal toggle */ -.app-sidebar .sidebar-brand { - display: flex; - align-items: center; - height: 56px; - padding: 0 12px; - gap: 10px; - border-bottom: 1px solid #1f2937; -} - -.app-sidebar .sidebar-brand .sidebar-toggle { - display: inline-flex; - align-items: center; - justify-content: center; - width: 34px; - height: 34px; - border-radius: 8px; - background: transparent; - border: 1px solid rgba(255,255,255,0.12); - color: #e5e7eb; - cursor: pointer; -} - -.app-sidebar .sidebar-brand .title { - color: #e5e7eb; - font-weight: 600; - font-size: 16px; -} - -/* Nav items: icon + text; hide text when docked */ -.app-sidebar .nav { - padding: 8px 6px; - margin: 0; -} - -.app-sidebar .nav-item { - list-style: none; - margin: 2px 0; -} - -.app-sidebar .nav-link { - display: flex; - align-items: center; - gap: 12px; - padding: 10px 12px; - color: #cbd5e1; - border-radius: 8px; - text-decoration: none; -} - -.app-sidebar .nav-link.active, -.app-sidebar .nav-link:hover { - background: rgba(255,255,255,0.06); - color: #fff; -} - -.app-sidebar .nav-icon { - display: inline-flex; - justify-content: center; - align-items: center; - font-size: 14px; - width: 18px; - height: 18px; - color: #cbd5e1; -} - -/* When the layout is collapsed (desktop dock), hide text and center icons */ -.app-layout.sidebar-is-collapsed .app-sidebar .nav-link { - justify-content: center; - padding: 10px 0; -} - -.app-layout.sidebar-is-collapsed .app-sidebar .nav-text { - display: none; -} - -/* Keep brand title minimal when collapsed (we render 'HR' text already) */ -.app-layout.sidebar-is-collapsed .app-sidebar .sidebar-brand { - justify-content: center; -} \ No newline at end of file