From 4161ed18cd7fda7f307dee5e6189ece5d6be5102 Mon Sep 17 00:00:00 2001
From: Pooja933119
Date: Tue, 23 Dec 2025 22:45:48 +0530
Subject: [PATCH 1/2] First changes Done
---
package-lock.json | 59 +++-
package.json | 5 +
src/app/app.component.ts | 2 +-
src/app/layout/default-layout/_nav.ts | 2 +-
.../default-header.component.html | 37 ++-
.../default-header.component.ts | 39 ++-
.../default-layout.component.html | 5 +-
.../default-layout.component.ts | 7 +-
src/app/model/auth.model.ts | 10 +
src/app/model/product.model.ts | 8 +
src/app/services/auth.service.ts | 78 +++++
src/app/services/product.service.ts | 76 +++++
.../breadcrumbs/breadcrumbs.component.html | 2 +-
src/app/views/base/cards/cards.component.html | 2 +-
.../base/carousels/carousels.component.html | 2 +-
.../base/collapses/collapses.component.html | 2 +-
.../list-groups/list-groups.component.html | 2 +-
src/app/views/base/navs/navs.component.html | 2 +-
src/app/views/base/navs/navs.component.ts | 4 +-
.../paginations/paginations.component.html | 2 +-
.../base/paginations/paginations.component.ts | 4 +-
.../placeholders/placeholders.component.html | 2 +-
.../placeholders/placeholders.component.ts | 4 +-
.../views/dashboard/dashboard.component.ts | 12 +
.../form-controls.component.html | 294 +++++-------------
.../form-controls/form-controls.component.ts | 83 ++++-
.../views/pages/login/login.component.html | 14 +-
src/app/views/pages/login/login.component.ts | 30 +-
.../pages/register/register.component.html | 57 +++-
.../pages/register/register.component.ts | 48 ++-
src/app/views/theme/colors.component.html | 40 +--
src/app/views/theme/colors.component.ts | 16 +-
.../widgets-dropdown.component.html | 148 ++-------
.../widgets-dropdown.component.ts | 62 +++-
src/assets/brand/brandlogo.jpg | Bin 0 -> 5715 bytes
src/assets/images/avatars/noProduct.png | Bin 0 -> 3276 bytes
src/assets/images/avatars/teacher.png | Bin 0 -> 27482 bytes
src/assets/images/avatars/user.png | Bin 0 -> 9509 bytes
src/index.html | 6 +-
tsconfig.json | 5 +-
40 files changed, 723 insertions(+), 448 deletions(-)
create mode 100644 src/app/model/auth.model.ts
create mode 100644 src/app/model/product.model.ts
create mode 100644 src/app/services/auth.service.ts
create mode 100644 src/app/services/product.service.ts
create mode 100644 src/assets/brand/brandlogo.jpg
create mode 100644 src/assets/images/avatars/noProduct.png
create mode 100644 src/assets/images/avatars/teacher.png
create mode 100644 src/assets/images/avatars/user.png
diff --git a/package-lock.json b/package-lock.json
index 786849d93..30233ae16 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -20,6 +20,7 @@
"@angular/platform-browser": "^21.0.6",
"@angular/platform-browser-dynamic": "^21.0.6",
"@angular/router": "^21.0.6",
+ "@auth0/angular-jwt": "^5.2.0",
"@coreui/angular": "~5.6.4",
"@coreui/angular-chartjs": "~5.6.4",
"@coreui/chartjs": "~4.1.0",
@@ -27,8 +28,12 @@
"@coreui/icons": "^3.0.1",
"@coreui/icons-angular": "~5.6.4",
"@coreui/utils": "^2.0.2",
+ "@types/mime-types": "^3.0.1",
"chart.js": "^4.5.1",
+ "jwt-decode": "^4.0.0",
"lodash-es": "^4.17.22",
+ "mime": "^4.1.0",
+ "mime-types": "^3.0.2",
"ngx-scrollbar": "^13.0.3",
"rxjs": "~7.8.2",
"tslib": "^2.8.1",
@@ -701,6 +706,17 @@
"rxjs": "^6.5.3 || ^7.4.0"
}
},
+ "node_modules/@auth0/angular-jwt": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@auth0/angular-jwt/-/angular-jwt-5.2.0.tgz",
+ "integrity": "sha512-9FS2L0QwGNlxA/zgeehCcsR9CZscouyXkoIj1fODM36A8BLfdzg9k9DWAXUQ2Drjk0AypGAFzeNZR4vsLMhdeQ==",
+ "dependencies": {
+ "tslib": "^2.0.0"
+ },
+ "peerDependencies": {
+ "@angular/common": ">=14.0.0"
+ }
+ },
"node_modules/@babel/code-frame": {
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
@@ -4063,6 +4079,11 @@
"@types/lodash": "*"
}
},
+ "node_modules/@types/mime-types": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-3.0.1.tgz",
+ "integrity": "sha512-xRMsfuQbnRq1Ef+C+RKaENOxXX87Ygl38W1vDfPHRku02TgQr+Qd8iivLtAMcR0KF5/29xlnFihkTlbqFrGOVQ=="
+ },
"node_modules/@types/node": {
"version": "24.10.4",
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.4.tgz",
@@ -6465,6 +6486,14 @@
],
"license": "MIT"
},
+ "node_modules/jwt-decode": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz",
+ "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==",
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/karma": {
"version": "6.4.4",
"resolved": "https://registry.npmjs.org/karma/-/karma-6.4.4.tgz",
@@ -6745,6 +6774,18 @@
"node": ">= 0.6"
}
},
+ "node_modules/karma/node_modules/mime": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
+ "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
+ "dev": true,
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
"node_modules/karma/node_modules/mime-db": {
"version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
@@ -7252,23 +7293,23 @@
}
},
"node_modules/mime": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
- "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
- "dev": true,
- "license": "MIT",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-4.1.0.tgz",
+ "integrity": "sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw==",
+ "funding": [
+ "https://github.com/sponsors/broofa"
+ ],
"bin": {
- "mime": "cli.js"
+ "mime": "bin/cli.js"
},
"engines": {
- "node": ">=4.0.0"
+ "node": ">=16"
}
},
"node_modules/mime-db": {
"version": "1.54.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
"integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.6"
@@ -7278,8 +7319,6 @@
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz",
"integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==",
- "dev": true,
- "license": "MIT",
"dependencies": {
"mime-db": "^1.54.0"
},
diff --git a/package.json b/package.json
index a4518dc72..c2d7b5f3c 100644
--- a/package.json
+++ b/package.json
@@ -30,6 +30,7 @@
"@angular/platform-browser": "^21.0.6",
"@angular/platform-browser-dynamic": "^21.0.6",
"@angular/router": "^21.0.6",
+ "@auth0/angular-jwt": "^5.2.0",
"@coreui/angular": "~5.6.4",
"@coreui/angular-chartjs": "~5.6.4",
"@coreui/chartjs": "~4.1.0",
@@ -37,8 +38,12 @@
"@coreui/icons": "^3.0.1",
"@coreui/icons-angular": "~5.6.4",
"@coreui/utils": "^2.0.2",
+ "@types/mime-types": "^3.0.1",
"chart.js": "^4.5.1",
+ "jwt-decode": "^4.0.0",
"lodash-es": "^4.17.22",
+ "mime": "^4.1.0",
+ "mime-types": "^3.0.2",
"ngx-scrollbar": "^13.0.3",
"rxjs": "~7.8.2",
"tslib": "^2.8.1",
diff --git a/src/app/app.component.ts b/src/app/app.component.ts
index 3514d8698..2efa9ff46 100644
--- a/src/app/app.component.ts
+++ b/src/app/app.component.ts
@@ -14,7 +14,7 @@ import { iconSubset } from './icons/icon-subset';
imports: [RouterOutlet]
})
export class AppComponent implements OnInit {
- title = 'CoreUI Angular Admin Template';
+ title = 'Ecomm';
readonly #destroyRef: DestroyRef = inject(DestroyRef);
readonly #activatedRoute: ActivatedRoute = inject(ActivatedRoute);
diff --git a/src/app/layout/default-layout/_nav.ts b/src/app/layout/default-layout/_nav.ts
index db48a851b..8ef53bcfb 100644
--- a/src/app/layout/default-layout/_nav.ts
+++ b/src/app/layout/default-layout/_nav.ts
@@ -15,7 +15,7 @@ export const navItems: INavData[] = [
name: 'Theme'
},
{
- name: 'Colors',
+ name: 'Product Details',
url: '/theme/colors',
iconComponent: { name: 'cil-drop' }
},
diff --git a/src/app/layout/default-layout/default-header/default-header.component.html b/src/app/layout/default-layout/default-header/default-header.component.html
index 34fcecfc2..6a6a08a10 100644
--- a/src/app/layout/default-layout/default-header/default-header.component.html
+++ b/src/app/layout/default-layout/default-header/default-header.component.html
@@ -16,11 +16,21 @@
Dashboard
+
+
+
+
+
@@ -46,12 +56,15 @@
+
-
+
+
+
@@ -59,15 +72,27 @@
+ {{decodedEmail}}
-
@@ -97,7 +122,7 @@ 42
- -
+
-
@@ -150,7 +175,7 @@
+
Logout
diff --git a/src/app/layout/default-layout/default-header/default-header.component.ts b/src/app/layout/default-layout/default-header/default-header.component.ts
index 6f4d6954e..56926c0f6 100644
--- a/src/app/layout/default-layout/default-header/default-header.component.ts
+++ b/src/app/layout/default-layout/default-header/default-header.component.ts
@@ -1,6 +1,6 @@
-import { NgTemplateOutlet } from '@angular/common';
-import { Component, computed, inject, input } from '@angular/core';
-import { RouterLink, RouterLinkActive } from '@angular/router';
+import { CommonModule, NgTemplateOutlet } from '@angular/common';
+import { Component, computed, inject, input, OnInit } from '@angular/core';
+import { Router, RouterLink, RouterLinkActive } from '@angular/router';
import {
AvatarComponent,
@@ -23,17 +23,23 @@ import {
} from '@coreui/angular';
import { IconDirective } from '@coreui/icons-angular';
+import { AuthService } from '../../../services/auth.service';
+import { FormsModule } from '@angular/forms';
+import { ProductService } from '../../../services/product.service';
@Component({
selector: 'app-default-header',
templateUrl: './default-header.component.html',
- imports: [ContainerComponent, HeaderTogglerDirective, SidebarToggleDirective, IconDirective, HeaderNavComponent, NavItemComponent, NavLinkDirective, RouterLink, RouterLinkActive, NgTemplateOutlet, BreadcrumbRouterComponent, DropdownComponent, DropdownToggleDirective, AvatarComponent, DropdownMenuDirective, DropdownHeaderDirective, DropdownItemDirective, BadgeComponent, DropdownDividerDirective]
+ imports: [ContainerComponent,FormsModule, HeaderTogglerDirective, SidebarToggleDirective, IconDirective, HeaderNavComponent, NavItemComponent, NavLinkDirective, RouterLink, RouterLinkActive, NgTemplateOutlet, BreadcrumbRouterComponent, DropdownComponent, DropdownToggleDirective, AvatarComponent, DropdownMenuDirective, DropdownHeaderDirective, DropdownItemDirective, BadgeComponent, DropdownDividerDirective]
})
-export class DefaultHeaderComponent extends HeaderComponent {
+export class DefaultHeaderComponent extends HeaderComponent{
readonly #colorModeService = inject(ColorModeService);
readonly colorMode = this.#colorModeService.colorMode;
-
+ decodedImage:any;
+ decodedEmail:any;
+ decodeToken:any;
+ searchTxt = '';
readonly colorModes = [
{ name: 'light', text: 'Light', icon: 'cilSun' },
{ name: 'dark', text: 'Dark', icon: 'cilMoon' },
@@ -45,10 +51,29 @@ export class DefaultHeaderComponent extends HeaderComponent {
return this.colorModes.find(mode => mode.name === currentMode)?.icon ?? 'cilSun';
});
- constructor() {
+ constructor(private authService:AuthService,
+ private router:Router,private productService:ProductService) {
super();
}
+ ngOnInit() {
+ let email = '';
+ this.decodeToken = this.authService.getDecodeToken();
+ let decodedTxt = JSON.parse(this.decodeToken);
+ this.decodedImage = decodedTxt?.image;
+ this.decodedEmail = decodedTxt?.email;
+ }
+
+ handleLogout(){
+ this.authService.removeToken();
+ this.router.navigateByUrl('/login')
+ }
+
+ //search
+ getSearchProduct(searchTxt:string){
+ return this.productService.getSearchProduct(searchTxt)
+ }
+
sidebarId = input('sidebar1');
public newMessages = [
diff --git a/src/app/layout/default-layout/default-layout.component.html b/src/app/layout/default-layout/default-layout.component.html
index f7ae8e188..bf859773c 100644
--- a/src/app/layout/default-layout/default-layout.component.html
+++ b/src/app/layout/default-layout/default-layout.component.html
@@ -7,10 +7,11 @@
visible
>
-
+
+
diff --git a/src/app/layout/default-layout/default-layout.component.ts b/src/app/layout/default-layout/default-layout.component.ts
index 2e01ea849..4b39ba4c2 100644
--- a/src/app/layout/default-layout/default-layout.component.ts
+++ b/src/app/layout/default-layout/default-layout.component.ts
@@ -1,12 +1,10 @@
import { Component } from '@angular/core';
-import { RouterLink, RouterOutlet } from '@angular/router';
+import { RouterOutlet } from '@angular/router';
import { NgScrollbar } from 'ngx-scrollbar';
-import { IconDirective } from '@coreui/icons-angular';
import {
ContainerComponent,
ShadowOnScrollDirective,
- SidebarBrandComponent,
SidebarComponent,
SidebarFooterComponent,
SidebarHeaderComponent,
@@ -32,7 +30,6 @@ function isOverflown(element: HTMLElement) {
imports: [
SidebarComponent,
SidebarHeaderComponent,
- SidebarBrandComponent,
SidebarNavComponent,
SidebarFooterComponent,
SidebarToggleDirective,
@@ -40,10 +37,8 @@ function isOverflown(element: HTMLElement) {
ContainerComponent,
DefaultFooterComponent,
DefaultHeaderComponent,
- IconDirective,
NgScrollbar,
RouterOutlet,
- RouterLink,
ShadowOnScrollDirective
]
})
diff --git a/src/app/model/auth.model.ts b/src/app/model/auth.model.ts
new file mode 100644
index 000000000..2209c83dc
--- /dev/null
+++ b/src/app/model/auth.model.ts
@@ -0,0 +1,10 @@
+export class UserRegister{
+ username!:string;
+ password!:string;
+ email!:string;
+ image!:string;
+}
+export class UserLogin{
+ email!:string;
+ password!:string;
+}
diff --git a/src/app/model/product.model.ts b/src/app/model/product.model.ts
new file mode 100644
index 000000000..c09828762
--- /dev/null
+++ b/src/app/model/product.model.ts
@@ -0,0 +1,8 @@
+export class Product{
+ title!:string;
+ description!:string;
+ rating!:string;
+ price!:string;
+ image!:string;
+ category!:string;
+}
diff --git a/src/app/services/auth.service.ts b/src/app/services/auth.service.ts
new file mode 100644
index 000000000..da6a83c14
--- /dev/null
+++ b/src/app/services/auth.service.ts
@@ -0,0 +1,78 @@
+import { HttpClient } from '@angular/common/http';
+import { Injectable, OnInit } from '@angular/core';
+import { Router } from '@angular/router';
+import { UserLogin, UserRegister } from '../model/auth.model';
+import { Subject } from 'rxjs';
+import { JwtHelperService } from '@auth0/angular-jwt';
+
+@Injectable({
+ providedIn:'root'
+})
+export class AuthService implements OnInit{
+ private authStatusListener = new Subject();
+ constructor(public http:HttpClient,private router:Router){}
+ token:any;
+ ngOnInit(): void {
+
+ }
+
+ registerUser(username:string,password:string,email:string,image:File){
+ const form = new FormData();
+ form.append('username',username);
+ form.append('password',password);
+ form.append('email',email);
+ form.append('image',image);
+
+ this.http.post<{message:string,userReg:UserRegister}>
+ ('http://localhost:8000/api/auth/register',form)
+ .subscribe(responseData=>{
+ alert("Registration Successfully");
+ this.router.navigateByUrl('/login')
+ },error=>{
+ if(error.status === 400){
+ this.authStatusListener.next(false);
+ console.log(error)
+ alert(error.error.message)
+ }
+
+ })
+ }
+
+ login(email:string,password:string){
+ const form = new FormData();
+ form.append('email',email);
+ form.append('password',password);
+
+ this.http.post<{
+ token: any;message:string,userLogin:UserLogin
+ }>
+ ('http://localhost:8000/api/auth/login',form)
+ .subscribe(responseData=>{
+ this.token = responseData.token;
+ localStorage.setItem('token', responseData.token);
+ const helper = new JwtHelperService();
+ const decodedToken= helper.decodeToken(this.token);
+ localStorage.setItem('userInfo', JSON.stringify(decodedToken));
+ console.log(decodedToken);
+ alert("Login Successfully");
+ this.router.navigateByUrl('/');
+ },error=>{
+ if(error.status === 400){
+ this.authStatusListener.next(false);
+ console.log(error)
+ alert(error.error.message)
+ }
+ })
+ }
+ getAuthenticationToken(){
+ return localStorage.getItem('token');
+ }
+ getDecodeToken(){
+ return localStorage.getItem('userInfo');
+ }
+ // Remove token
+ public removeToken(): void {
+ localStorage.removeItem('token');
+ localStorage.removeItem('userInfo');
+ }
+}
diff --git a/src/app/services/product.service.ts b/src/app/services/product.service.ts
new file mode 100644
index 000000000..2b82a5372
--- /dev/null
+++ b/src/app/services/product.service.ts
@@ -0,0 +1,76 @@
+import { Injectable, signal } from '@angular/core';
+import { HttpClient } from '@angular/common/http';
+import { Router } from '@angular/router';
+import { Product } from '../model/product.model';
+import { BehaviorSubject, map, retry } from 'rxjs';
+@Injectable({
+ providedIn:'root'
+})
+
+export class ProductService {
+ productInfo = signal
-