├── src ├── app │ ├── app.component.css │ ├── leaves │ │ ├── leaves.component.css │ │ └── leaves.component.spec.ts │ ├── pages │ │ ├── admin │ │ │ ├── footer │ │ │ │ ├── footer.component.css │ │ │ │ ├── footer.component.ts │ │ │ │ ├── footer.component.html │ │ │ │ └── footer.component.spec.ts │ │ │ ├── topbar │ │ │ │ ├── topbar.component.css │ │ │ │ ├── topbar.component.ts │ │ │ │ └── topbar.component.spec.ts │ │ │ ├── sidebar │ │ │ │ ├── sidebar.component.css │ │ │ │ ├── sidebar.component.ts │ │ │ │ └── sidebar.component.spec.ts │ │ │ ├── admin-layout │ │ │ │ ├── admin-layout.component.css │ │ │ │ ├── admin-layout.component.ts │ │ │ │ ├── admin-layout.component.html │ │ │ │ └── admin-layout.component.spec.ts │ │ │ └── admin-dashboard │ │ │ │ ├── admin-dashboard.component.css │ │ │ │ ├── admin-dashboard.component.ts │ │ │ │ └── admin-dashboard.component.spec.ts │ │ ├── layout │ │ │ ├── guide │ │ │ │ └── components │ │ │ │ │ └── importing │ │ │ └── layout.component.spec.ts │ │ ├── auth │ │ │ ├── auth-layout │ │ │ │ ├── auth-layout.component.css │ │ │ │ ├── auth-layout.component.ts │ │ │ │ ├── auth-layout.component.spec.ts │ │ │ │ └── auth-layout.component.html │ │ │ ├── verify-email │ │ │ │ └── verify-email.component.css │ │ │ ├── reset-password │ │ │ │ └── reset-password.component.css │ │ │ ├── model │ │ │ │ └── interface │ │ │ │ │ └── auth.ts │ │ │ ├── service │ │ │ │ └── auth.service.spec.ts │ │ │ ├── guard │ │ │ │ ├── auth.guard.spec.ts │ │ │ │ └── auth.guard.ts │ │ │ ├── login │ │ │ │ └── login.component.spec.ts │ │ │ ├── registration │ │ │ │ └── registration.component.spec.ts │ │ │ └── forgot-password │ │ │ │ ├── forgot-password.component.css │ │ │ │ └── forgot-password.component.ts │ │ ├── not-found │ │ │ ├── not-found.component.css │ │ │ ├── not-found.component.ts │ │ │ ├── not-found.component.spec.ts │ │ │ └── not-found.component.html │ │ ├── project │ │ │ └── project.component.spec.ts │ │ ├── employee │ │ │ └── employee.component.spec.ts │ │ ├── dashboard │ │ │ ├── dashboard.component.spec.ts │ │ │ └── dashboard.component.css │ │ └── project-employee │ │ │ └── project-employee.component.spec.ts │ ├── app.component.html │ ├── environments │ │ └── environment.ts │ ├── shared │ │ ├── confirm-modal │ │ │ ├── confirm-modal.component.css │ │ │ ├── confirm-modal.component.spec.ts │ │ │ ├── confirm-modal.component.ts │ │ │ └── confirm-modal.component.html │ │ └── custom-alert │ │ │ └── custom-alert.component.html │ ├── app.component.ts │ ├── leaves.service.spec.ts │ ├── service │ │ ├── master.service.spec.ts │ │ └── master.service.ts │ ├── employee.service.spec.ts │ ├── app.config.ts │ ├── settings │ │ ├── settings.component.spec.ts │ │ └── settings.component.css │ ├── app.component.spec.ts │ └── model │ │ └── interface │ │ └── master.ts ├── favicon.ico ├── assets │ └── img │ │ ├── pages │ │ ├── 404.jpg │ │ ├── 500.jpg │ │ ├── lock.jpg │ │ ├── sign-in.jpg │ │ ├── sign-up.jpg │ │ ├── overview.jpg │ │ ├── settings.jpg │ │ ├── transactions.jpg │ │ ├── forgot-password.jpg │ │ ├── reset-password.jpg │ │ └── mockup-presentation.png │ │ ├── profile-cover.jpg │ │ ├── Untitled_design.png │ │ ├── favicon │ │ ├── favicon.ico │ │ ├── favicon-16x16.png │ │ ├── favicon-32x32.png │ │ ├── mstile-150x150.png │ │ ├── apple-touch-icon.png │ │ ├── android-chrome-192x192.png │ │ ├── android-chrome-512x512.png │ │ ├── browserconfig.xml │ │ ├── site.webmanifest │ │ ├── manifest.json │ │ ├── favicon.svg │ │ └── safari-pinned-tab.svg │ │ ├── themesberg-mockup.jpg │ │ ├── mockup-presentation.png │ │ ├── mockup-map-presentation.png │ │ ├── team │ │ ├── profile-picture-1.jpg │ │ ├── profile-picture-2.jpg │ │ ├── profile-picture-3.jpg │ │ ├── profile-picture-4.jpg │ │ ├── profile-picture-5.jpg │ │ └── profile-picture-6.jpg │ │ ├── mockup-kanban-presentation.png │ │ ├── mockup-calendar-presentation.png │ │ ├── WhatsApp Image 2025-07-30 at 6.41.50 PM.jpeg │ │ ├── marker.svg │ │ ├── icons │ │ ├── google_analytics.svg │ │ └── google-tag-manager.svg │ │ ├── brand │ │ ├── light.svg │ │ └── dark.svg │ │ ├── technologies │ │ ├── vuejs-logo.svg │ │ ├── bootstrap-5-logo.svg │ │ ├── react-logo.svg │ │ └── react-logo-primary.svg │ │ ├── flags │ │ ├── japan.svg │ │ ├── indonesia.svg │ │ ├── ukraine.svg │ │ ├── republic-of-poland.svg │ │ ├── vietnam.svg │ │ ├── switzerland.svg │ │ ├── france.svg │ │ ├── ireland.svg │ │ ├── italy.svg │ │ ├── luxembourg.svg │ │ ├── netherlands.svg │ │ ├── latvia.svg │ │ ├── peru.svg │ │ ├── nigeria.svg │ │ ├── bahrain.svg │ │ ├── colombia.svg │ │ ├── czech-republic.svg │ │ ├── russia.svg │ │ ├── finland.svg │ │ ├── belgium.svg │ │ ├── estonia.svg │ │ ├── germany.svg │ │ ├── armenia.svg │ │ ├── bolivia.svg │ │ ├── hungary.svg │ │ ├── united-arab-emirates.svg │ │ ├── bulgaria.svg │ │ ├── ivory-coast.svg │ │ ├── lithuania.svg │ │ ├── spain.svg │ │ ├── chile.svg │ │ ├── austria.svg │ │ ├── costa-rica.svg │ │ ├── thailand.svg │ │ ├── romania.svg │ │ ├── kuwait.svg │ │ ├── liechtenstein.svg │ │ ├── slovenia.svg │ │ ├── turkey.svg │ │ ├── denmark.svg │ │ ├── india.svg │ │ ├── sweden.svg │ │ ├── china.svg │ │ ├── argentina.svg │ │ ├── egypt.svg │ │ ├── cameroon.svg │ │ ├── canada.svg │ │ ├── panama.svg │ │ ├── tunisia.svg │ │ ├── brazil.svg │ │ ├── portugal.svg │ │ ├── haiti.svg │ │ ├── nauru.svg │ │ ├── botswana.svg │ │ ├── algeria.svg │ │ ├── albania.svg │ │ ├── cyprus.svg │ │ ├── greece.svg │ │ ├── cambodia.svg │ │ ├── mexico.svg │ │ ├── puerto-rico.svg │ │ ├── kazakhstan.svg │ │ ├── paraguay.svg │ │ ├── taiwan.svg │ │ ├── iceland.svg │ │ ├── nicaragua.svg │ │ ├── norway.svg │ │ ├── south-africa.svg │ │ ├── israel.svg │ │ ├── pakistan.svg │ │ ├── ecuador.svg │ │ ├── iraq.svg │ │ ├── american-samoa.svg │ │ ├── cuba.svg │ │ ├── ethiopia.svg │ │ ├── iran.svg │ │ ├── uruguay.svg │ │ ├── belarus.svg │ │ ├── azerbaijan.svg │ │ ├── republic-of-macedonia.svg │ │ ├── mongolia.svg │ │ ├── aland-islands.svg │ │ ├── hong-kong.svg │ │ ├── sri-lanka.svg │ │ ├── malaysia.svg │ │ ├── philippines.svg │ │ ├── montenegro.svg │ │ ├── georgia.svg │ │ ├── slovakia.svg │ │ ├── singapore.svg │ │ ├── serbia.svg │ │ ├── bosnia-and-herzegovina.svg │ │ ├── united-states.svg │ │ └── united-states-of-america.svg │ │ └── themesberg.svg ├── main.ts └── index.html ├── .vscode ├── settings.json ├── extensions.json ├── launch.json └── tasks.json ├── public └── favicon.ico ├── .dockerignore ├── dockerfile ├── .editorconfig ├── tsconfig.app.json ├── tsconfig.spec.json ├── .gitignore ├── tsconfig.json └── package.json /src/app/app.component.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/app/leaves/leaves.component.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/app/pages/admin/footer/footer.component.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/app/pages/admin/topbar/topbar.component.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/app/pages/layout/guide/components/importing: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/app/pages/admin/sidebar/sidebar.component.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/app/pages/auth/auth-layout/auth-layout.component.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/app/pages/auth/verify-email/verify-email.component.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/app/app.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /src/app/pages/admin/admin-layout/admin-layout.component.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/app/pages/auth/reset-password/reset-password.component.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/app/pages/admin/admin-dashboard/admin-dashboard.component.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "liveServer.settings.port": 5505 3 | } -------------------------------------------------------------------------------- /src/app/pages/not-found/not-found.component.css: -------------------------------------------------------------------------------- 1 | .error-template { 2 | margin-bottom: 4rem; 3 | } -------------------------------------------------------------------------------- /src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhisek247767/PeopleHub-Frontend/HEAD/src/favicon.ico -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhisek247767/PeopleHub-Frontend/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | npm-debug.log 3 | .git 4 | .env 5 | .gitignore 6 | Dockerfile 7 | .dockerignore 8 | -------------------------------------------------------------------------------- /src/assets/img/pages/404.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhisek247767/PeopleHub-Frontend/HEAD/src/assets/img/pages/404.jpg -------------------------------------------------------------------------------- /src/assets/img/pages/500.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhisek247767/PeopleHub-Frontend/HEAD/src/assets/img/pages/500.jpg -------------------------------------------------------------------------------- /src/assets/img/pages/lock.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhisek247767/PeopleHub-Frontend/HEAD/src/assets/img/pages/lock.jpg -------------------------------------------------------------------------------- /src/assets/img/pages/sign-in.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhisek247767/PeopleHub-Frontend/HEAD/src/assets/img/pages/sign-in.jpg -------------------------------------------------------------------------------- /src/assets/img/pages/sign-up.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhisek247767/PeopleHub-Frontend/HEAD/src/assets/img/pages/sign-up.jpg -------------------------------------------------------------------------------- /src/assets/img/profile-cover.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhisek247767/PeopleHub-Frontend/HEAD/src/assets/img/profile-cover.jpg -------------------------------------------------------------------------------- /src/assets/img/Untitled_design.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhisek247767/PeopleHub-Frontend/HEAD/src/assets/img/Untitled_design.png -------------------------------------------------------------------------------- /src/assets/img/favicon/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhisek247767/PeopleHub-Frontend/HEAD/src/assets/img/favicon/favicon.ico -------------------------------------------------------------------------------- /src/assets/img/pages/overview.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhisek247767/PeopleHub-Frontend/HEAD/src/assets/img/pages/overview.jpg -------------------------------------------------------------------------------- /src/assets/img/pages/settings.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhisek247767/PeopleHub-Frontend/HEAD/src/assets/img/pages/settings.jpg -------------------------------------------------------------------------------- /src/assets/img/pages/transactions.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhisek247767/PeopleHub-Frontend/HEAD/src/assets/img/pages/transactions.jpg -------------------------------------------------------------------------------- /src/assets/img/themesberg-mockup.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhisek247767/PeopleHub-Frontend/HEAD/src/assets/img/themesberg-mockup.jpg -------------------------------------------------------------------------------- /src/assets/img/favicon/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhisek247767/PeopleHub-Frontend/HEAD/src/assets/img/favicon/favicon-16x16.png -------------------------------------------------------------------------------- /src/assets/img/favicon/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhisek247767/PeopleHub-Frontend/HEAD/src/assets/img/favicon/favicon-32x32.png -------------------------------------------------------------------------------- /src/assets/img/mockup-presentation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhisek247767/PeopleHub-Frontend/HEAD/src/assets/img/mockup-presentation.png -------------------------------------------------------------------------------- /src/assets/img/pages/forgot-password.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhisek247767/PeopleHub-Frontend/HEAD/src/assets/img/pages/forgot-password.jpg -------------------------------------------------------------------------------- /src/assets/img/pages/reset-password.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhisek247767/PeopleHub-Frontend/HEAD/src/assets/img/pages/reset-password.jpg -------------------------------------------------------------------------------- /src/assets/img/favicon/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhisek247767/PeopleHub-Frontend/HEAD/src/assets/img/favicon/mstile-150x150.png -------------------------------------------------------------------------------- /src/assets/img/mockup-map-presentation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhisek247767/PeopleHub-Frontend/HEAD/src/assets/img/mockup-map-presentation.png -------------------------------------------------------------------------------- /src/assets/img/team/profile-picture-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhisek247767/PeopleHub-Frontend/HEAD/src/assets/img/team/profile-picture-1.jpg -------------------------------------------------------------------------------- /src/assets/img/team/profile-picture-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhisek247767/PeopleHub-Frontend/HEAD/src/assets/img/team/profile-picture-2.jpg -------------------------------------------------------------------------------- /src/assets/img/team/profile-picture-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhisek247767/PeopleHub-Frontend/HEAD/src/assets/img/team/profile-picture-3.jpg -------------------------------------------------------------------------------- /src/assets/img/team/profile-picture-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhisek247767/PeopleHub-Frontend/HEAD/src/assets/img/team/profile-picture-4.jpg -------------------------------------------------------------------------------- /src/assets/img/team/profile-picture-5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhisek247767/PeopleHub-Frontend/HEAD/src/assets/img/team/profile-picture-5.jpg -------------------------------------------------------------------------------- /src/assets/img/team/profile-picture-6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhisek247767/PeopleHub-Frontend/HEAD/src/assets/img/team/profile-picture-6.jpg -------------------------------------------------------------------------------- /src/assets/img/favicon/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhisek247767/PeopleHub-Frontend/HEAD/src/assets/img/favicon/apple-touch-icon.png -------------------------------------------------------------------------------- /src/assets/img/mockup-kanban-presentation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhisek247767/PeopleHub-Frontend/HEAD/src/assets/img/mockup-kanban-presentation.png -------------------------------------------------------------------------------- /src/assets/img/pages/mockup-presentation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhisek247767/PeopleHub-Frontend/HEAD/src/assets/img/pages/mockup-presentation.png -------------------------------------------------------------------------------- /src/assets/img/mockup-calendar-presentation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhisek247767/PeopleHub-Frontend/HEAD/src/assets/img/mockup-calendar-presentation.png -------------------------------------------------------------------------------- /src/assets/img/favicon/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhisek247767/PeopleHub-Frontend/HEAD/src/assets/img/favicon/android-chrome-192x192.png -------------------------------------------------------------------------------- /src/assets/img/favicon/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhisek247767/PeopleHub-Frontend/HEAD/src/assets/img/favicon/android-chrome-512x512.png -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=827846 3 | "recommendations": ["angular.ng-template"] 4 | } 5 | -------------------------------------------------------------------------------- /src/app/environments/environment.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true, 3 | apiUrl: 'http://127.0.0.1:3000', 4 | sessionTimeout: 3600, 5 | }; -------------------------------------------------------------------------------- /src/app/shared/confirm-modal/confirm-modal.component.css: -------------------------------------------------------------------------------- 1 | .modal { 2 | z-index: 1050; 3 | } 4 | .modal-backdrop { 5 | z-index: 1040; 6 | position: fixed; 7 | inset: 0; 8 | } 9 | -------------------------------------------------------------------------------- /src/assets/img/WhatsApp Image 2025-07-30 at 6.41.50 PM.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhisek247767/PeopleHub-Frontend/HEAD/src/assets/img/WhatsApp Image 2025-07-30 at 6.41.50 PM.jpeg -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { appConfig } from './app/app.config'; 3 | import { AppComponent } from './app/app.component'; 4 | 5 | bootstrapApplication(AppComponent, appConfig) 6 | .catch((err) => console.error(err)); -------------------------------------------------------------------------------- /src/app/pages/admin/footer/footer.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-footer', 5 | imports: [], 6 | templateUrl: './footer.component.html', 7 | styleUrl: './footer.component.css' 8 | }) 9 | export class FooterComponent { 10 | 11 | } 12 | -------------------------------------------------------------------------------- /src/app/pages/admin/topbar/topbar.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-topbar', 5 | imports: [], 6 | templateUrl: './topbar.component.html', 7 | styleUrl: './topbar.component.css' 8 | }) 9 | export class TopbarComponent { 10 | 11 | } 12 | -------------------------------------------------------------------------------- /src/app/pages/admin/footer/footer.component.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/app/pages/admin/sidebar/sidebar.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-sidebar', 5 | imports: [], 6 | templateUrl: './sidebar.component.html', 7 | styleUrl: './sidebar.component.css' 8 | }) 9 | export class SidebarComponent { 10 | 11 | } 12 | -------------------------------------------------------------------------------- /src/assets/img/favicon/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | #ffffff 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { RouterOutlet } from '@angular/router'; 3 | 4 | @Component({ 5 | selector: 'app-root', 6 | imports: [RouterOutlet], 7 | templateUrl: './app.component.html', 8 | styleUrl: './app.component.css' 9 | }) 10 | export class AppComponent { 11 | title = 'employee'; 12 | } 13 | -------------------------------------------------------------------------------- /src/app/pages/admin/admin-dashboard/admin-dashboard.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-admin-dashboard', 5 | imports: [], 6 | templateUrl: './admin-dashboard.component.html', 7 | styleUrl: './admin-dashboard.component.css' 8 | }) 9 | export class AdminDashboardComponent { 10 | 11 | } 12 | -------------------------------------------------------------------------------- /dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:23-alpine3.20 as build 2 | 3 | WORKDIR /usr/src/app 4 | 5 | COPY package*.json ./ 6 | 7 | RUN npm install --frozen-lockfile 8 | 9 | COPY . . 10 | 11 | RUN npm run build --prod 12 | 13 | FROM nginx:alpine 14 | 15 | COPY --from=build /dist/employee /usr/share/nginx/html 16 | 17 | EXPOSE 80 18 | 19 | CMD ["nginx", "-g", "daemon off;"] 20 | -------------------------------------------------------------------------------- /src/assets/img/marker.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.ts] 12 | quote_type = single 13 | ij_typescript_use_double_quotes = false 14 | 15 | [*.md] 16 | max_line_length = off 17 | trim_trailing_whitespace = false 18 | -------------------------------------------------------------------------------- /src/app/pages/not-found/not-found.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { FooterComponent } from '../footer/footer.component'; 3 | 4 | @Component({ 5 | selector: 'app-not-found', 6 | imports: [FooterComponent], 7 | templateUrl: './not-found.component.html', 8 | styleUrl: './not-found.component.css' 9 | }) 10 | export class NotFoundComponent { 11 | 12 | } 13 | -------------------------------------------------------------------------------- /src/app/pages/auth/model/interface/auth.ts: -------------------------------------------------------------------------------- 1 | export interface ILoginResponse { 2 | token: string; 3 | user: { 4 | role(arg0: string, role: any): unknown; 5 | id: string; 6 | email: string; 7 | username: string; 8 | }; 9 | } 10 | 11 | export interface IRegisterationResponse { 12 | message: string; 13 | user: { 14 | id: string; 15 | email: string; 16 | username: string; 17 | }; 18 | } 19 | -------------------------------------------------------------------------------- /src/app/leaves.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing'; 2 | 3 | import { LeavesService } from './leaves.service'; 4 | 5 | describe('LeavesService', () => { 6 | let service: LeavesService; 7 | 8 | beforeEach(() => { 9 | TestBed.configureTestingModule({}); 10 | service = TestBed.inject(LeavesService); 11 | }); 12 | 13 | it('should be created', () => { 14 | expect(service).toBeTruthy(); 15 | }); 16 | }); 17 | -------------------------------------------------------------------------------- /src/assets/img/icons/google_analytics.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/app/pages/auth/service/auth.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing'; 2 | 3 | import { AuthService } from './auth.service'; 4 | 5 | describe('AuthService', () => { 6 | let service: AuthService; 7 | 8 | beforeEach(() => { 9 | TestBed.configureTestingModule({}); 10 | service = TestBed.inject(AuthService); 11 | }); 12 | 13 | it('should be created', () => { 14 | expect(service).toBeTruthy(); 15 | }); 16 | }); 17 | -------------------------------------------------------------------------------- /src/app/service/master.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing'; 2 | 3 | import { MasterService } from './master.service'; 4 | 5 | describe('MasterService', () => { 6 | let service: MasterService; 7 | 8 | beforeEach(() => { 9 | TestBed.configureTestingModule({}); 10 | service = TestBed.inject(MasterService); 11 | }); 12 | 13 | it('should be created', () => { 14 | expect(service).toBeTruthy(); 15 | }); 16 | }); 17 | -------------------------------------------------------------------------------- /src/app/employee.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing'; 2 | 3 | import { EmployeeService } from './employee.service'; 4 | 5 | describe('EmployeeService', () => { 6 | let service: EmployeeService; 7 | 8 | beforeEach(() => { 9 | TestBed.configureTestingModule({}); 10 | service = TestBed.inject(EmployeeService); 11 | }); 12 | 13 | it('should be created', () => { 14 | expect(service).toBeTruthy(); 15 | }); 16 | }); 17 | -------------------------------------------------------------------------------- /src/assets/img/brand/light.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tsconfig.app.json: -------------------------------------------------------------------------------- 1 | /* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ 2 | /* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ 3 | { 4 | "extends": "./tsconfig.json", 5 | "compilerOptions": { 6 | "outDir": "./out-tsc/app", 7 | "types": [] 8 | }, 9 | "files": [ 10 | "src/main.ts" 11 | ], 12 | "include": [ 13 | "src/**/*.d.ts" 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | /* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ 2 | /* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ 3 | { 4 | "extends": "./tsconfig.json", 5 | "compilerOptions": { 6 | "outDir": "./out-tsc/spec", 7 | "types": [ 8 | "jasmine" 9 | ] 10 | }, 11 | "include": [ 12 | "src/**/*.spec.ts", 13 | "src/**/*.d.ts" 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /src/app/pages/auth/auth-layout/auth-layout.component.ts: -------------------------------------------------------------------------------- 1 | import { CommonModule } from '@angular/common'; 2 | import { Component } from '@angular/core'; 3 | import { FormsModule } from '@angular/forms'; 4 | import { RouterOutlet } from '@angular/router'; 5 | 6 | @Component({ 7 | selector: 'app-auth-layout', 8 | imports: [RouterOutlet,CommonModule,FormsModule], 9 | templateUrl: './auth-layout.component.html', 10 | styleUrl: './auth-layout.component.css' 11 | }) 12 | export class AuthLayoutComponent { 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/assets/img/favicon/site.webmanifest: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Themesberg", 3 | "short_name": "Themesberg", 4 | "icons": [ 5 | { 6 | "src": "/android-chrome-192x192.png", 7 | "sizes": "192x192", 8 | "type": "image/png" 9 | }, 10 | { 11 | "src": "/android-chrome-512x512.png", 12 | "sizes": "512x512", 13 | "type": "image/png" 14 | } 15 | ], 16 | "theme_color": "#ffffff", 17 | "background_color": "#ffffff", 18 | "display": "standalone" 19 | } 20 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 3 | "version": "0.2.0", 4 | "configurations": [ 5 | { 6 | "name": "ng serve", 7 | "type": "chrome", 8 | "request": "launch", 9 | "preLaunchTask": "npm: start", 10 | "url": "http://localhost:4200/" 11 | }, 12 | { 13 | "name": "ng test", 14 | "type": "chrome", 15 | "request": "launch", 16 | "preLaunchTask": "npm: test", 17 | "url": "http://localhost:9876/debug.html" 18 | } 19 | ] 20 | } 21 | -------------------------------------------------------------------------------- /src/app/pages/auth/guard/auth.guard.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing'; 2 | import { CanActivateFn } from '@angular/router'; 3 | 4 | import { authGuard } from './auth.guard'; 5 | 6 | describe('authGuard', () => { 7 | const executeGuard: CanActivateFn = (...guardParameters) => 8 | TestBed.runInInjectionContext(() => authGuard(...guardParameters)); 9 | 10 | beforeEach(() => { 11 | TestBed.configureTestingModule({}); 12 | }); 13 | 14 | it('should be created', () => { 15 | expect(executeGuard).toBeTruthy(); 16 | }); 17 | }); 18 | -------------------------------------------------------------------------------- /src/app/pages/auth/guard/auth.guard.ts: -------------------------------------------------------------------------------- 1 | import { inject } from '@angular/core'; 2 | import { CanActivateFn, Router } from '@angular/router'; 3 | import {AuthService} from '../service/auth.service' 4 | 5 | export const authGuard: CanActivateFn = (route, state) => { 6 | // Check if the user is logged in or not 7 | //debugger; 8 | const router = inject(Router); 9 | const authService = inject(AuthService); 10 | 11 | if (authService.isAuthenticated()) { 12 | return true; 13 | } else { 14 | router.navigate(['/login']) 15 | return false; 16 | } 17 | 18 | }; 19 | -------------------------------------------------------------------------------- /src/assets/img/favicon/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Bootstrap", 3 | "short_name": "Bootstrap", 4 | "icons": [ 5 | { 6 | "src": "/docs/4.3/assets/img/favicons/android-chrome-192x192.png", 7 | "sizes": "192x192", 8 | "type": "image/png" 9 | }, 10 | { 11 | "src": "/docs/4.3/assets/img/favicons/android-chrome-512x512.png", 12 | "sizes": "512x512", 13 | "type": "image/png" 14 | } 15 | ], 16 | "start_url": "/?utm_source=a2hs", 17 | "theme_color": "#563d7c", 18 | "background_color": "#563d7c", 19 | "display": "standalone" 20 | } 21 | -------------------------------------------------------------------------------- /src/assets/img/technologies/vuejs-logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/app/app.config.ts: -------------------------------------------------------------------------------- 1 | import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core'; 2 | import { provideRouter } from '@angular/router'; 3 | import { routes } from './app.routes'; 4 | import { provideHttpClient } from '@angular/common/http'; 5 | import { provideToastr } from 'ngx-toastr'; 6 | import { provideAnimations } from '@angular/platform-browser/animations'; 7 | 8 | export const appConfig: ApplicationConfig = { 9 | providers: [ 10 | provideZoneChangeDetection({ eventCoalescing: true }), 11 | provideRouter(routes), 12 | provideHttpClient(), 13 | provideToastr(), 14 | provideAnimations(), 15 | ] 16 | }; 17 | -------------------------------------------------------------------------------- /src/app/pages/admin/admin-layout/admin-layout.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { SidebarComponent } from "../sidebar/sidebar.component"; 3 | import { TopbarComponent } from "../topbar/topbar.component"; 4 | import { FooterComponent } from "../footer/footer.component"; 5 | import { RouterOutlet } from '@angular/router'; 6 | 7 | @Component({ 8 | selector: 'app-admin-layout', 9 | imports: [SidebarComponent, TopbarComponent, FooterComponent, RouterOutlet], 10 | templateUrl: './admin-layout.component.html', 11 | styleUrl: './admin-layout.component.css' 12 | }) 13 | export class AdminLayoutComponent { 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/app/leaves/leaves.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { LeavesComponent } from './leaves.component'; 4 | 5 | describe('LeavesComponent', () => { 6 | let component: LeavesComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | imports: [LeavesComponent] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(LeavesComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/pages/auth/login/login.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { LoginComponent } from './login.component'; 4 | 5 | describe('LoginComponent', () => { 6 | let component: LoginComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | imports: [LoginComponent] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(LoginComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/pages/layout/layout.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { LayoutComponent } from './layout.component'; 4 | 5 | describe('LayoutComponent', () => { 6 | let component: LayoutComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | imports: [LayoutComponent] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(LayoutComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/pages/admin/footer/footer.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { FooterComponent } from './footer.component'; 4 | 5 | describe('FooterComponent', () => { 6 | let component: FooterComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | imports: [FooterComponent] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(FooterComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/pages/admin/topbar/topbar.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { TopbarComponent } from './topbar.component'; 4 | 5 | describe('TopbarComponent', () => { 6 | let component: TopbarComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | imports: [TopbarComponent] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(TopbarComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/pages/project/project.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { ProjectComponent } from './project.component'; 4 | 5 | describe('ProjectComponent', () => { 6 | let component: ProjectComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | imports: [ProjectComponent] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(ProjectComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/pages/admin/sidebar/sidebar.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { SidebarComponent } from './sidebar.component'; 4 | 5 | describe('SidebarComponent', () => { 6 | let component: SidebarComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | imports: [SidebarComponent] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(SidebarComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/settings/settings.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { SettingsComponent } from './settings.component'; 4 | 5 | describe('SettingsComponent', () => { 6 | let component: SettingsComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | imports: [SettingsComponent] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(SettingsComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/pages/employee/employee.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { EmployeeComponent } from './employee.component'; 4 | 5 | describe('EmployeeComponent', () => { 6 | let component: EmployeeComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | imports: [EmployeeComponent] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(EmployeeComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PeopleHub 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 17 | 18 | 19 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /src/app/pages/not-found/not-found.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { NotFoundComponent } from './not-found.component'; 4 | 5 | describe('NotFoundComponent', () => { 6 | let component: NotFoundComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | imports: [NotFoundComponent] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(NotFoundComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/pages/dashboard/dashboard.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { DashboardComponent } from './dashboard.component'; 4 | 5 | describe('DashboardComponent', () => { 6 | let component: DashboardComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | imports: [DashboardComponent] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(DashboardComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/pages/auth/auth-layout/auth-layout.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { AuthLayoutComponent } from './auth-layout.component'; 4 | 5 | describe('AuthLayoutComponent', () => { 6 | let component: AuthLayoutComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | imports: [AuthLayoutComponent] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(AuthLayoutComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/pages/admin/admin-layout/admin-layout.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Dashboard 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/app/pages/admin/admin-layout/admin-layout.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { AdminLayoutComponent } from './admin-layout.component'; 4 | 5 | describe('AdminLayoutComponent', () => { 6 | let component: AdminLayoutComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | imports: [AdminLayoutComponent] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(AdminLayoutComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/pages/auth/registration/registration.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { RegistrationComponent } from './registration.component'; 4 | 5 | describe('RegistrationComponent', () => { 6 | let component: RegistrationComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | imports: [RegistrationComponent] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(RegistrationComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/shared/confirm-modal/confirm-modal.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { ConfirmModalComponent } from './confirm-modal.component'; 4 | 5 | describe('ConfirmModalComponent', () => { 6 | let component: ConfirmModalComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | imports: [ConfirmModalComponent] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(ConfirmModalComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://docs.github.com/get-started/getting-started-with-git/ignoring-files for more about ignoring files. 2 | 3 | # Compiled output 4 | /dist 5 | /tmp 6 | /out-tsc 7 | /bazel-out 8 | 9 | # Node 10 | /node_modules 11 | npm-debug.log 12 | yarn-error.log 13 | 14 | # IDEs and editors 15 | .idea/ 16 | .project 17 | .classpath 18 | .c9/ 19 | *.launch 20 | .settings/ 21 | *.sublime-workspace 22 | 23 | # Visual Studio Code 24 | .vscode/* 25 | !.vscode/settings.json 26 | !.vscode/tasks.json 27 | !.vscode/launch.json 28 | !.vscode/extensions.json 29 | .history/* 30 | 31 | # Miscellaneous 32 | /.angular/cache 33 | .sass-cache/ 34 | /connect.lock 35 | /coverage 36 | /libpeerconnection.log 37 | testem.log 38 | /typings 39 | 40 | # System files 41 | .DS_Store 42 | Thumbs.db 43 | 44 | /vendor/ 45 | -------------------------------------------------------------------------------- /src/assets/img/flags/japan.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /src/app/pages/admin/admin-dashboard/admin-dashboard.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { AdminDashboardComponent } from './admin-dashboard.component'; 4 | 5 | describe('AdminDashboardComponent', () => { 6 | let component: AdminDashboardComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | imports: [AdminDashboardComponent] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(AdminDashboardComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/pages/project-employee/project-employee.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { ProjectEmployeeComponent } from './project-employee.component'; 4 | 5 | describe('ProjectEmployeeComponent', () => { 6 | let component: ProjectEmployeeComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | imports: [ProjectEmployeeComponent] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(ProjectEmployeeComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/pages/auth/auth-layout/auth-layout.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | HRMS 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /src/app/service/master.service.ts: -------------------------------------------------------------------------------- 1 | import { HttpClient } from '@angular/common/http'; 2 | import { Injectable } from '@angular/core'; 3 | import { IApiResponse } from '../model/interface/master'; 4 | import { Observable } from 'rxjs'; 5 | import { environment } from '../environments/environment'; 6 | 7 | @Injectable({ 8 | providedIn: 'root' 9 | }) 10 | export class MasterService { 11 | 12 | private apiUrl = `${environment.apiUrl}`; 13 | 14 | constructor(private http: HttpClient) { } 15 | 16 | getAllDept(): Observable { 17 | return this.http.get(`${this.apiUrl}/departments`); 18 | } 19 | 20 | getAllChildDeptBy(deptId : number): Observable { 21 | return this.http.get( 22 | `${this.apiUrl}/subDepartment?deptId=${deptId}`, 23 | ); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/assets/img/flags/indonesia.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /src/assets/img/flags/ukraine.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /src/assets/img/flags/republic-of-poland.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /src/app/shared/confirm-modal/confirm-modal.component.ts: -------------------------------------------------------------------------------- 1 | import { CommonModule } from '@angular/common'; 2 | import { Component, EventEmitter, Input, Output } from '@angular/core'; 3 | 4 | @Component({ 5 | selector: 'app-confirm-modal', 6 | imports: [CommonModule], 7 | templateUrl: './confirm-modal.component.html', 8 | styleUrl: './confirm-modal.component.css' 9 | }) 10 | export class ConfirmModalComponent { 11 | @Input() title = 'Confirm'; 12 | @Input() message = 'Are you sure?'; 13 | @Input() confirmText = 'Yes'; 14 | @Input() cancelText = 'Cancel'; 15 | @Input() show = false; 16 | 17 | @Output() confirmed = new EventEmitter(); 18 | @Output() cancelled = new EventEmitter(); 19 | 20 | onConfirm() { 21 | this.confirmed.emit(); 22 | } 23 | 24 | onCancel() { 25 | this.cancelled.emit(); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/app/shared/confirm-modal/confirm-modal.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {{ title }} 6 | 7 | 8 | 9 | {{ message }} 10 | 11 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/assets/img/flags/vietnam.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /src/assets/img/brand/dark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 9 | 10 | 13 | 14 | -------------------------------------------------------------------------------- /src/assets/img/flags/switzerland.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /src/assets/img/flags/france.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /src/assets/img/flags/ireland.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /src/assets/img/flags/italy.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /src/assets/img/flags/luxembourg.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /src/assets/img/flags/netherlands.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /src/assets/img/flags/latvia.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /src/assets/img/flags/peru.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /src/assets/img/flags/nigeria.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | /* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ 2 | /* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ 3 | { 4 | "compileOnSave": false, 5 | "compilerOptions": { 6 | "outDir": "./dist/out-tsc", 7 | "strict": true, 8 | "noImplicitOverride": true, 9 | "noPropertyAccessFromIndexSignature": true, 10 | "noImplicitReturns": true, 11 | "noFallthroughCasesInSwitch": true, 12 | "skipLibCheck": true, 13 | "isolatedModules": true, 14 | "esModuleInterop": true, 15 | "experimentalDecorators": true, 16 | "moduleResolution": "bundler", 17 | "importHelpers": true, 18 | "target": "ES2022", 19 | "module": "ES2022" 20 | }, 21 | "angularCompilerOptions": { 22 | "enableI18nLegacyMessageIdFormat": false, 23 | "strictInjectionParameters": true, 24 | "strictInputAccessModifiers": true, 25 | "strictTemplates": true 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/assets/img/favicon/favicon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /src/assets/img/flags/bahrain.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /src/assets/img/flags/colombia.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /src/app/app.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing'; 2 | import { AppComponent } from './app.component'; 3 | 4 | describe('AppComponent', () => { 5 | beforeEach(async () => { 6 | await TestBed.configureTestingModule({ 7 | imports: [AppComponent], 8 | }).compileComponents(); 9 | }); 10 | 11 | it('should create the app', () => { 12 | const fixture = TestBed.createComponent(AppComponent); 13 | const app = fixture.componentInstance; 14 | expect(app).toBeTruthy(); 15 | }); 16 | 17 | it(`should have the 'employee' title`, () => { 18 | const fixture = TestBed.createComponent(AppComponent); 19 | const app = fixture.componentInstance; 20 | expect(app.title).toEqual('employee'); 21 | }); 22 | 23 | it('should render title', () => { 24 | const fixture = TestBed.createComponent(AppComponent); 25 | fixture.detectChanges(); 26 | const compiled = fixture.nativeElement as HTMLElement; 27 | expect(compiled.querySelector('h1')?.textContent).toContain('Hello, employee'); 28 | }); 29 | }); 30 | -------------------------------------------------------------------------------- /src/assets/img/flags/czech-republic.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 8 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /src/assets/img/flags/russia.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /src/assets/img/flags/finland.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /src/assets/img/icons/google-tag-manager.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 10 | 11 | 12 | 14 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/assets/img/technologies/bootstrap-5-logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/app/pages/not-found/not-found.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Page Not Found 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | Oops! 12 | 404 Not Found 13 | 14 | Sorry, an error has occurred, Requested page not found! 15 | 16 | 17 | 18 | 19 | Take Me Home 20 | 21 | 22 | 23 | Contact Support 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | // For more information, visit: https://go.microsoft.com/fwlink/?LinkId=733558 3 | "version": "2.0.0", 4 | "tasks": [ 5 | { 6 | "type": "npm", 7 | "script": "start", 8 | "isBackground": true, 9 | "problemMatcher": { 10 | "owner": "typescript", 11 | "pattern": "$tsc", 12 | "background": { 13 | "activeOnStart": true, 14 | "beginsPattern": { 15 | "regexp": "(.*?)" 16 | }, 17 | "endsPattern": { 18 | "regexp": "bundle generation complete" 19 | } 20 | } 21 | } 22 | }, 23 | { 24 | "type": "npm", 25 | "script": "test", 26 | "isBackground": true, 27 | "problemMatcher": { 28 | "owner": "typescript", 29 | "pattern": "$tsc", 30 | "background": { 31 | "activeOnStart": true, 32 | "beginsPattern": { 33 | "regexp": "(.*?)" 34 | }, 35 | "endsPattern": { 36 | "regexp": "bundle generation complete" 37 | } 38 | } 39 | } 40 | } 41 | ] 42 | } 43 | -------------------------------------------------------------------------------- /src/assets/img/flags/belgium.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /src/assets/img/flags/estonia.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /src/assets/img/flags/germany.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 8 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /src/assets/img/flags/armenia.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /src/assets/img/flags/bolivia.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /src/assets/img/flags/hungary.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /src/assets/img/flags/united-arab-emirates.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /src/assets/img/flags/bulgaria.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /src/assets/img/flags/ivory-coast.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /src/assets/img/flags/lithuania.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /src/assets/img/flags/spain.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /src/assets/img/flags/chile.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /src/assets/img/flags/austria.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /src/assets/img/technologies/react-logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/img/technologies/react-logo-primary.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/img/flags/costa-rica.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /src/assets/img/flags/thailand.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /src/assets/img/flags/romania.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 10 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /src/app/pages/auth/forgot-password/forgot-password.component.css: -------------------------------------------------------------------------------- 1 | .forgot-password-container { 2 | min-height: 100vh; 3 | background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); 4 | position: relative; 5 | overflow: hidden; 6 | } 7 | 8 | .forgot-password-container::before { 9 | content: ''; 10 | position: absolute; 11 | top: 0; 12 | left: 0; 13 | right: 0; 14 | bottom: 0; 15 | background: url('data:image/svg+xml,') repeat; 16 | opacity: 0.3; 17 | } 18 | 19 | .login-card { 20 | position: relative; 21 | z-index: 1; 22 | animation: slideInUp 0.6s ease-out; 23 | } 24 | 25 | .login-card .bg-white { 26 | backdrop-filter: blur(10px); 27 | background: rgba(255, 255, 255, 0.95) !important; 28 | border: 1px solid rgba(255, 255, 255, 0.2); 29 | } 30 | 31 | .icon-xl { 32 | width: 3rem; 33 | height: 3rem; 34 | } 35 | 36 | .form-control { 37 | border: 1px solid #e5e7eb; 38 | transition: all 0.2s ease-in-out; 39 | } -------------------------------------------------------------------------------- /src/assets/img/flags/kuwait.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /src/assets/img/flags/liechtenstein.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /src/assets/img/flags/slovenia.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 8 | 9 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /src/assets/img/flags/turkey.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 9 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /src/assets/img/flags/denmark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 9 | 10 | 12 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /src/assets/img/flags/india.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /src/assets/img/flags/sweden.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 9 | 10 | 12 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "employee", 3 | "version": "0.0.0", 4 | "scripts": { 5 | "ng": "ng", 6 | "start": "ng serve", 7 | "build": "ng build", 8 | "watch": "ng build --watch --configuration development", 9 | "test": "ng test" 10 | }, 11 | "private": true, 12 | "dependencies": { 13 | "@angular/animations": "^19.0.5", 14 | "@angular/common": "^19.2.14", 15 | "@angular/compiler": "^19.0.5", 16 | "@angular/core": "^19.2.14", 17 | "@angular/forms": "^19.0.5", 18 | "@angular/platform-browser": "^19.2.14", 19 | "@angular/platform-browser-dynamic": "^19.0.5", 20 | "@angular/router": "^19.0.5", 21 | "bootstrap": "^5.3.3", 22 | "font-awesome": "^4.7.0", 23 | "ng-select2-component": "^16.0.0", 24 | "ngx-toastr": "^19.0.0", 25 | "rxjs": "~7.8.0", 26 | "tslib": "^2.3.0", 27 | "zone.js": "~0.15.0" 28 | }, 29 | "devDependencies": { 30 | "@angular-devkit/build-angular": "^19.0.5", 31 | "@angular/cli": "^19.0.5", 32 | "@angular/compiler-cli": "^19.0.5", 33 | "@types/jasmine": "~5.1.0", 34 | "jasmine-core": "~5.4.0", 35 | "karma": "~6.4.0", 36 | "karma-chrome-launcher": "~3.2.0", 37 | "karma-coverage": "~2.2.0", 38 | "karma-jasmine": "~5.1.0", 39 | "karma-jasmine-html-reporter": "~2.1.0", 40 | "typescript": "~5.6.2" 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/app/shared/custom-alert/custom-alert.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | {{ options.title }} 9 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | {{ options.message }} 22 | 23 | 24 | 25 | 40 | 41 | -------------------------------------------------------------------------------- /src/assets/img/flags/china.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 9 | 10 | 11 | 13 | 15 | 17 | 19 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/assets/img/flags/argentina.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /src/assets/img/flags/egypt.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /src/assets/img/flags/cameroon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /src/assets/img/flags/canada.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /src/assets/img/flags/panama.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 10 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /src/assets/img/flags/tunisia.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 10 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /src/assets/img/flags/brazil.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 11 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /src/assets/img/flags/portugal.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 9 | 10 | 12 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /src/assets/img/flags/haiti.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /src/assets/img/flags/nauru.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /src/assets/img/flags/botswana.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 10 | 11 | 13 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /src/assets/img/flags/algeria.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 10 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /src/assets/img/flags/albania.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /src/assets/img/flags/cyprus.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 10 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /src/assets/img/flags/greece.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 10 | 11 | 13 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /src/assets/img/flags/cambodia.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 8 | 9 | 10 | 11 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /src/assets/img/flags/mexico.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 11 | 12 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /src/assets/img/flags/puerto-rico.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 11 | 12 | 14 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /src/assets/img/flags/kazakhstan.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 9 | 11 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /src/assets/img/flags/paraguay.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 12 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /src/assets/img/flags/taiwan.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 8 | 11 | 12 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /src/assets/img/flags/iceland.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 10 | 12 | 13 | 14 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /src/assets/img/flags/nicaragua.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /src/assets/img/flags/norway.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 10 | 12 | 13 | 14 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /src/assets/img/flags/south-africa.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 9 | 12 | 14 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /src/assets/img/flags/israel.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 12 | 14 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /src/assets/img/flags/pakistan.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 11 | 12 | 16 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /src/assets/img/flags/ecuador.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 8 | 9 | 10 | 12 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /src/assets/img/flags/iraq.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 13 | 15 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /src/assets/img/flags/american-samoa.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 9 | 11 | 12 | 14 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /src/assets/img/flags/cuba.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 10 | 12 | 14 | 15 | 17 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /src/assets/img/flags/ethiopia.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 11 | 12 | 14 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /src/assets/img/flags/iran.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 10 | 13 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /src/assets/img/flags/uruguay.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 8 | 9 | 11 | 12 | 13 | 14 | 16 | 17 | 18 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /src/assets/img/flags/belarus.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 13 | 15 | 16 | 18 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /src/assets/img/flags/azerbaijan.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 8 | 9 | 10 | 13 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /src/assets/img/flags/republic-of-macedonia.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /src/assets/img/flags/mongolia.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /src/assets/img/flags/aland-islands.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 12 | 14 | 15 | 16 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /src/assets/img/flags/hong-kong.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 10 | 13 | 15 | 17 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /src/assets/img/flags/sri-lanka.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 9 | 11 | 12 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /src/app/pages/auth/forgot-password/forgot-password.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms'; 3 | import { Router, RouterLink } from '@angular/router'; 4 | import { AuthService } from '../service/auth.service'; 5 | import { CommonModule } from '@angular/common'; 6 | import { ToastrService } from 'ngx-toastr'; 7 | 8 | @Component({ 9 | selector: 'app-forgot-password', 10 | standalone: true, 11 | imports: [ReactiveFormsModule, CommonModule, RouterLink], 12 | templateUrl: './forgot-password.component.html', 13 | styleUrls: ['./forgot-password.component.css'] 14 | }) 15 | export class ForgotPasswordComponent { 16 | errorMessage: string = ''; 17 | successMessage: string = ''; 18 | 19 | constructor( 20 | private authService: AuthService, 21 | private router: Router, 22 | private toastr: ToastrService 23 | ) {} 24 | 25 | forgotPasswordForm: FormGroup = new FormGroup({ 26 | email: new FormControl('', [ 27 | Validators.required, 28 | Validators.email, 29 | Validators.pattern(/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/) 30 | ]) 31 | }); 32 | 33 | onForgotPassword() { 34 | if (this.forgotPasswordForm.invalid) { 35 | this.errorMessage = 'Please enter a valid email address.'; 36 | this.toastr.error(this.errorMessage, 'Error'); 37 | return; 38 | } 39 | 40 | const { email } = this.forgotPasswordForm.value; 41 | this.authService.forgotPassword(email).subscribe({ 42 | next: (response) => { 43 | this.successMessage = response.message; 44 | this.toastr.success(response.message, 'Success'); 45 | this.router.navigateByUrl('/reset-password'); 46 | }, 47 | error: (error) => { 48 | this.errorMessage = error.error?.message || 'Failed to send password reset email.'; 49 | this.toastr.error(this.errorMessage, 'Error'); 50 | } 51 | }); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/assets/img/flags/malaysia.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 12 | 13 | 14 | 15 | 18 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /src/assets/img/flags/philippines.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 8 | 10 | 11 | 14 | 16 | 18 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /src/app/settings/settings.component.css: -------------------------------------------------------------------------------- 1 | .profile-picture-container { 2 | position: relative; 3 | } 4 | 5 | /* Profile image responsive styling */ 6 | .profile-img { 7 | width: 120px; 8 | height: 120px; 9 | object-fit: cover; 10 | border: 2px solid #ddd; 11 | transition: all 0.3s ease; 12 | } 13 | 14 | /* Placeholder for when no profile picture exists */ 15 | .placeholder-img { 16 | background-color: #f8f9fa; 17 | border: 2px dashed #ddd; 18 | cursor: pointer; 19 | transition: all 0.3s ease; 20 | } 21 | 22 | .placeholder-img:hover { 23 | background-color: #e9ecef; 24 | border-color: #ffc107; 25 | } 26 | 27 | /* Mobile responsiveness */ 28 | @media (max-width: 575.98px) { 29 | .profile-img { 30 | width: 100px; 31 | height: 100px; 32 | } 33 | 34 | .placeholder-img .fas { 35 | font-size: 1.5rem !important; 36 | } 37 | 38 | .container-fluid { 39 | padding-left: 15px; 40 | padding-right: 15px; 41 | } 42 | 43 | h4 { 44 | font-size: 1.25rem; 45 | } 46 | } 47 | 48 | /* Tablet responsiveness */ 49 | @media (min-width: 576px) and (max-width: 991.98px) { 50 | .profile-img { 51 | width: 140px; 52 | height: 140px; 53 | } 54 | 55 | .placeholder-img .fas { 56 | font-size: 2.2rem !important; 57 | } 58 | } 59 | 60 | /* Large screens */ 61 | @media (min-width: 992px) { 62 | .profile-img { 63 | width: 120px; 64 | height: 120px; 65 | } 66 | 67 | .placeholder-img .fas { 68 | font-size: 2rem !important; 69 | } 70 | } 71 | 72 | /* Form enhancements */ 73 | .form-control:focus { 74 | border-color: #ffc107; 75 | box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.25); 76 | } 77 | 78 | .btn-warning:hover { 79 | background-color: #e0a800; 80 | border-color: #d39e00; 81 | } 82 | 83 | /* Center the form content */ 84 | .row.justify-content-center { 85 | max-width: 100%; 86 | } 87 | 88 | /* Ensure proper spacing on all devices */ 89 | .g-3 > * { 90 | margin-bottom: 1rem; 91 | } 92 | 93 | @media (min-width: 768px) { 94 | .g-md-4 > * { 95 | margin-bottom: 1.5rem; 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /src/assets/img/flags/montenegro.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 8 | 9 | 11 | 18 | 19 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /src/assets/img/flags/georgia.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 11 | 13 | 15 | 17 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /src/assets/img/flags/slovakia.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 8 | 9 | 11 | 13 | 16 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /src/assets/img/flags/singapore.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 11 | 13 | 15 | 17 | 19 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /src/assets/img/flags/serbia.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 8 | 9 | 10 | 12 | 13 | 14 | 16 | 18 | 19 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /src/assets/img/themesberg.svg: -------------------------------------------------------------------------------- 1 | logo -------------------------------------------------------------------------------- /src/assets/img/flags/bosnia-and-herzegovina.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 8 | 9 | 10 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /src/app/model/interface/master.ts: -------------------------------------------------------------------------------- 1 | export interface IApiResponse { 2 | message: string; 3 | result: boolean; 4 | data: any; 5 | } 6 | 7 | export interface IParentDept { 8 | name: any; 9 | _id: any; 10 | departmentId: number; 11 | departmentName: string; 12 | departmentLogo: string; 13 | } 14 | 15 | export interface IChildDept { 16 | _id: any; 17 | childDeptId: number; 18 | parentDeptId: number; 19 | departmentName: string; 20 | } 21 | 22 | export interface IUser { 23 | _id: string; 24 | username: string; 25 | email: string; 26 | role: 'superadmin' | 'admin' | 'user' | 'employee'; 27 | verified: boolean; 28 | createdAt: string; 29 | updatedAt: string; 30 | } 31 | 32 | export interface IEmployee { 33 | _id: string; 34 | user_id: string; 35 | employeeName: string; 36 | contactNo: string; 37 | email: string; 38 | gender: 'Male' | 'Female' | 'Other'; 39 | department: string; 40 | subDepartment: string; 41 | createdAt: string; 42 | updatedAt: string; 43 | user?: IUser; // Populated user data 44 | } 45 | 46 | export interface IProject { 47 | _id: string; 48 | projectName: string; 49 | projectDescription: string; 50 | deliveryManager: string; 51 | manager: string; 52 | lead: string; 53 | developers: string[]; 54 | status: 'planning' | 'in-progress' | 'on-hold' | 'completed' | 'cancelled'; 55 | startDate?: string; 56 | endDate?: string; 57 | priority: 'low' | 'medium' | 'high' | 'critical'; 58 | budget?: number; 59 | createdBy: string; 60 | createdAt: string; 61 | updatedAt: string; 62 | teamSize?: number; 63 | // Populated user details 64 | deliveryManagerDetails?: IUser; 65 | managerDetails?: IUser; 66 | leadDetails?: IUser; 67 | developerDetails?: IUser[]; 68 | createdByDetails?: IUser; 69 | } 70 | 71 | export interface IEmployeeCreateRequest { 72 | employeeName: string; 73 | contactNo: string; 74 | email: string; 75 | gender: 'Male' | 'Female' | 'Other'; 76 | department: string; 77 | subDepartment: string; 78 | password: string; 79 | username?: string; // Optional, will be auto-generated if not provided 80 | } 81 | 82 | export interface IEmployeeCreateResponse { 83 | success: boolean; 84 | message: string; 85 | employee: IEmployee; 86 | userCreated: boolean; 87 | } 88 | 89 | -------------------------------------------------------------------------------- /src/assets/img/flags/united-states.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 12 | 13 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /src/assets/img/flags/united-states-of-america.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 12 | 13 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /src/app/pages/dashboard/dashboard.component.css: -------------------------------------------------------------------------------- 1 | /* Dashboard Card Enhancements */ 2 | .card { 3 | transition: all 0.3s ease; 4 | border-radius: 8px; 5 | overflow: hidden; 6 | box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05); 7 | border: none; 8 | } 9 | 10 | .card:hover { 11 | transform: translateY(-5px); 12 | box-shadow: 0 8px 15px rgba(0, 0, 0, 0.1); 13 | } 14 | 15 | .card-header { 16 | font-weight: 600; 17 | border-bottom: 1px solid rgba(0, 0, 0, 0.1); 18 | } 19 | 20 | .card-body { 21 | padding: 1.5rem; 22 | } 23 | 24 | .card-text { 25 | font-size: 2.5rem; 26 | font-weight: 700; 27 | text-align: center; 28 | margin-bottom: 0; 29 | transition: all 0.3s ease; 30 | } 31 | 32 | .card:hover .card-text { 33 | transform: scale(1.05); 34 | } 35 | 36 | /* List Group Styling */ 37 | .list-group-item { 38 | transition: all 0.3s ease; 39 | border-left: none; 40 | border-right: none; 41 | } 42 | 43 | .list-group-item:hover { 44 | background-color: rgba(0, 0, 0, 0.02); 45 | transform: translateX(5px); 46 | } 47 | 48 | /* Dark Mode Enhancements */ 49 | .dark-mode .card { 50 | box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2); 51 | background-color: #2c2c40; 52 | border: 1px solid rgba(255, 255, 255, 0.05); 53 | } 54 | 55 | .dark-mode .card:hover { 56 | box-shadow: 0 8px 20px rgba(0, 0, 0, 0.3); 57 | } 58 | 59 | .dark-mode .card-header { 60 | border-bottom: 1px solid rgba(255, 255, 255, 0.1); 61 | background-color: rgba(255, 255, 255, 0.05); 62 | } 63 | 64 | .dark-mode .list-group-item { 65 | background-color: #2c2c40; 66 | border-color: rgba(255, 255, 255, 0.1); 67 | } 68 | 69 | .dark-mode .list-group-item:hover { 70 | background-color: rgba(255, 255, 255, 0.05); 71 | } 72 | 73 | /* Section Headers */ 74 | h3 { 75 | position: relative; 76 | margin-bottom: 1.5rem; 77 | padding-bottom: 0.5rem; 78 | } 79 | 80 | h3::after { 81 | content: ''; 82 | position: absolute; 83 | bottom: 0; 84 | left: 0; 85 | width: 50px; 86 | height: 3px; 87 | background: #4361ee; 88 | border-radius: 3px; 89 | } 90 | 91 | /* Fade-in Animation */ 92 | @keyframes fadeIn { 93 | from { 94 | opacity: 0; 95 | transform: translateY(10px); 96 | } 97 | to { 98 | opacity: 1; 99 | transform: translateY(0); 100 | } 101 | } 102 | 103 | .row { 104 | animation: fadeIn 0.5s ease forwards; 105 | } 106 | 107 | .row:nth-child(2) { 108 | animation-delay: 0.2s; 109 | } -------------------------------------------------------------------------------- /src/assets/img/favicon/safari-pinned-tab.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | Created by potrace 1.11, written by Peter Selinger 2001-2013 9 | 10 | 12 | 24 | 31 | 38 | 39 | 40 | --------------------------------------------------------------------------------
{{ message }}
{{ options.message }}