Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
first commit
  • Loading branch information
hemantkumarathavita committed Aug 7, 2025
commit d123a4506edc2d04d629d81e4b12fe8b5158e433
872 changes: 871 additions & 1 deletion package-lock.json

Large diffs are not rendered by default.

12 changes: 12 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,18 @@
"@coreui/icons": "^3.0.1",
"@coreui/icons-angular": "~5.5.5",
"@coreui/utils": "^2.0.2",
"@syncfusion/ej2": "^30.1.42",
"@syncfusion/ej2-angular-base": "^30.1.42",
"@syncfusion/ej2-angular-buttons": "^30.1.37",
"@syncfusion/ej2-angular-calendars": "^30.1.37",
"@syncfusion/ej2-angular-dropdowns": "^30.1.42",
"@syncfusion/ej2-angular-grids": "^30.1.42",
"@syncfusion/ej2-angular-inputs": "^30.1.40",
"@syncfusion/ej2-angular-lists": "^30.1.42",
"@syncfusion/ej2-angular-navigations": "^30.1.42",
"@syncfusion/ej2-angular-popups": "^30.1.42",
"ag-grid-angular": "^34.1.1",
"ag-grid-community": "^34.1.1",
"chart.js": "^4.5.0",
"lodash-es": "^4.17.21",
"ngx-scrollbar": "^13.0.3",
Expand Down
10 changes: 10 additions & 0 deletions src/app/app.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,14 @@ import {
withRouterConfig,
withViewTransitions
} from '@angular/router';
import { provideHttpClient, withInterceptorsFromDi, withInterceptors } from '@angular/common/http';
import { provideClientHydration } from '@angular/platform-browser';
import { provideAnimations } from '@angular/platform-browser/animations';

import { DropdownModule, SidebarModule } from '@coreui/angular';
import { IconSetService } from '@coreui/icons-angular';
import { routes } from './app.routes';
import { authInterceptor } from './services/auth.interceptor';

export const appConfig: ApplicationConfig = {
providers: [
Expand All @@ -27,6 +31,12 @@ export const appConfig: ApplicationConfig = {
withViewTransitions(),
withHashLocation()
),
provideHttpClient(
withInterceptorsFromDi(),
withInterceptors([authInterceptor])
),
provideClientHydration(),
provideAnimations(),
importProvidersFrom(SidebarModule, DropdownModule),
IconSetService,
provideAnimationsAsync()
Expand Down
36 changes: 29 additions & 7 deletions src/app/app.routes.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import { Routes } from '@angular/router';
import { AuthGuard } from './services/auth.guard';
import { LoginGuard } from './services/login.guard';

export const routes: Routes = [
{
Expand All @@ -12,6 +14,7 @@ export const routes: Routes = [
data: {
title: 'Home'
},
canActivate: [AuthGuard],
children: [
{
path: 'dashboard',
Expand Down Expand Up @@ -50,35 +53,54 @@ export const routes: Routes = [
loadChildren: () => import('./views/charts/routes').then((m) => m.routes)
},
{
path: 'pages',
loadChildren: () => import('./views/pages/routes').then((m) => m.routes)
path: 'auth',
loadChildren: () => import('./views/auth/routes').then((m) => m.routes)
},
{
path: 'masters',
loadChildren: () => import('./views/masters/routes').then((m) => m.routes)
},
{
path: 'role-demo',
loadComponent: () => import('./views/role-demo/role-demo.component').then(m => m.RoleDemoComponent),
data: {
title: 'Role Demo'
}
},
{
path: 'acl-demo',
loadComponent: () => import('./views/acl-demo/acl-demo.component').then(m => m.ACLDemoComponent),
data: {
title: 'ACL Demo'
}
}
]
},
{
path: '404',
loadComponent: () => import('./views/pages/page404/page404.component').then(m => m.Page404Component),
loadComponent: () => import('./views/auth/page404/page404.component').then(m => m.Page404Component),
data: {
title: 'Page 404'
}
},
{
path: '500',
loadComponent: () => import('./views/pages/page500/page500.component').then(m => m.Page500Component),
loadComponent: () => import('./views/auth/page500/page500.component').then(m => m.Page500Component),
data: {
title: 'Page 500'
}
},
{
path: 'login',
loadComponent: () => import('./views/pages/login/login.component').then(m => m.LoginComponent),
loadComponent: () => import('./views/auth/login/login.component').then(m => m.LoginComponent),
data: {
title: 'Login Page'
}
},
canActivate: [LoginGuard]
},
{
path: 'register',
loadComponent: () => import('./views/pages/register/register.component').then(m => m.RegisterComponent),
loadComponent: () => import('./views/auth/register/register.component').then(m => m.RegisterComponent),
data: {
title: 'Register Page'
}
Expand Down
221 changes: 221 additions & 0 deletions src/app/config/acl.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,221 @@
export interface ACLPermission {
resource: string;
actions: string[];
conditions?: {
[key: string]: any;
};
}

export interface ACLRole {
name: string;
permissions: ACLPermission[];
inherits?: string[];
}

export interface ACLConfig {
roles: { [roleName: string]: ACLRole };
resources: { [resourceName: string]: string };
actions: { [actionName: string]: string };
}

// Define available resources
export const RESOURCES = {
// Pages
DASHBOARD: 'dashboard',
COUNTRY_MASTER: 'country-master',
STATE_MASTER: 'state-master',
CITY_MASTER: 'city-master',
SYSTEM_SETTINGS: 'system-settings',
USER_MANAGEMENT: 'user-management',
ROLE_DEMO: 'role-demo',

// Functionality
VIEW_DATA: 'view-data',
EXPORT_DATA: 'export-data',
PRINT_DATA: 'print-data',
SEARCH_DATA: 'search-data',
FILTER_DATA: 'filter-data',

// Master Data Operations
CREATE_COUNTRY: 'create-country',
UPDATE_COUNTRY: 'update-country',
DELETE_COUNTRY: 'delete-country',
CREATE_STATE: 'create-state',
UPDATE_STATE: 'update-state',
DELETE_STATE: 'delete-state',
CREATE_CITY: 'create-city',
UPDATE_CITY: 'update-city',
DELETE_CITY: 'delete-city',

// System Operations
MANAGE_USERS: 'manage-users',
MANAGE_ROLES: 'manage-roles',
VIEW_LOGS: 'view-logs',
SYSTEM_CONFIG: 'system-config',

// Profile Operations
VIEW_PROFILE: 'view-profile',
UPDATE_PROFILE: 'update-profile',
CHANGE_PASSWORD: 'change-password'
};

// Define available actions
export const ACTIONS = {
READ: 'read',
WRITE: 'write',
DELETE: 'delete',
CREATE: 'create',
UPDATE: 'update',
EXPORT: 'export',
PRINT: 'print',
SEARCH: 'search',
FILTER: 'filter',
MANAGE: 'manage',
VIEW: 'view'
};

// ACL Configuration
export const ACL_CONFIG: ACLConfig = {
resources: RESOURCES,
actions: ACTIONS,
roles: {
'Admin': {
name: 'Admin',
permissions: [
// Full access to all pages
{ resource: RESOURCES.DASHBOARD, actions: [ACTIONS.READ, ACTIONS.WRITE] },
{ resource: RESOURCES.COUNTRY_MASTER, actions: [ACTIONS.READ, ACTIONS.WRITE, ACTIONS.CREATE, ACTIONS.UPDATE, ACTIONS.DELETE, ACTIONS.EXPORT, ACTIONS.PRINT, ACTIONS.SEARCH, ACTIONS.FILTER] },
{ resource: RESOURCES.STATE_MASTER, actions: [ACTIONS.READ, ACTIONS.WRITE, ACTIONS.CREATE, ACTIONS.UPDATE, ACTIONS.DELETE, ACTIONS.EXPORT, ACTIONS.PRINT, ACTIONS.SEARCH, ACTIONS.FILTER] },
{ resource: RESOURCES.CITY_MASTER, actions: [ACTIONS.READ, ACTIONS.WRITE, ACTIONS.CREATE, ACTIONS.UPDATE, ACTIONS.DELETE, ACTIONS.EXPORT, ACTIONS.PRINT, ACTIONS.SEARCH, ACTIONS.FILTER] },
{ resource: RESOURCES.SYSTEM_SETTINGS, actions: [ACTIONS.READ, ACTIONS.WRITE, ACTIONS.MANAGE] },
{ resource: RESOURCES.USER_MANAGEMENT, actions: [ACTIONS.READ, ACTIONS.WRITE, ACTIONS.CREATE, ACTIONS.UPDATE, ACTIONS.DELETE, ACTIONS.MANAGE] },
{ resource: RESOURCES.ROLE_DEMO, actions: [ACTIONS.READ, ACTIONS.WRITE] },

// Full access to all functionality
{ resource: RESOURCES.VIEW_DATA, actions: [ACTIONS.READ] },
{ resource: RESOURCES.EXPORT_DATA, actions: [ACTIONS.EXPORT] },
{ resource: RESOURCES.PRINT_DATA, actions: [ACTIONS.PRINT] },
{ resource: RESOURCES.SEARCH_DATA, actions: [ACTIONS.SEARCH] },
{ resource: RESOURCES.FILTER_DATA, actions: [ACTIONS.FILTER] },

// Master data operations
{ resource: RESOURCES.CREATE_COUNTRY, actions: [ACTIONS.CREATE] },
{ resource: RESOURCES.UPDATE_COUNTRY, actions: [ACTIONS.UPDATE] },
{ resource: RESOURCES.DELETE_COUNTRY, actions: [ACTIONS.DELETE] },
{ resource: RESOURCES.CREATE_STATE, actions: [ACTIONS.CREATE] },
{ resource: RESOURCES.UPDATE_STATE, actions: [ACTIONS.UPDATE] },
{ resource: RESOURCES.DELETE_STATE, actions: [ACTIONS.DELETE] },
{ resource: RESOURCES.CREATE_CITY, actions: [ACTIONS.CREATE] },
{ resource: RESOURCES.UPDATE_CITY, actions: [ACTIONS.UPDATE] },
{ resource: RESOURCES.DELETE_CITY, actions: [ACTIONS.DELETE] },

// System operations
{ resource: RESOURCES.MANAGE_USERS, actions: [ACTIONS.MANAGE] },
{ resource: RESOURCES.MANAGE_ROLES, actions: [ACTIONS.MANAGE] },
{ resource: RESOURCES.VIEW_LOGS, actions: [ACTIONS.VIEW] },
{ resource: RESOURCES.SYSTEM_CONFIG, actions: [ACTIONS.MANAGE] },

// Profile operations
{ resource: RESOURCES.VIEW_PROFILE, actions: [ACTIONS.VIEW] },
{ resource: RESOURCES.UPDATE_PROFILE, actions: [ACTIONS.UPDATE] },
{ resource: RESOURCES.CHANGE_PASSWORD, actions: [ACTIONS.UPDATE] }
]
},

'Manager': {
name: 'Manager',
permissions: [
// Limited access to pages
{ resource: RESOURCES.DASHBOARD, actions: [ACTIONS.READ] },
{ resource: RESOURCES.COUNTRY_MASTER, actions: [ACTIONS.READ, ACTIONS.SEARCH, ACTIONS.FILTER, ACTIONS.EXPORT, ACTIONS.PRINT] },
{ resource: RESOURCES.STATE_MASTER, actions: [ACTIONS.READ, ACTIONS.SEARCH, ACTIONS.FILTER, ACTIONS.EXPORT, ACTIONS.PRINT] },
{ resource: RESOURCES.CITY_MASTER, actions: [ACTIONS.READ, ACTIONS.SEARCH, ACTIONS.FILTER, ACTIONS.EXPORT, ACTIONS.PRINT] },
{ resource: RESOURCES.ROLE_DEMO, actions: [ACTIONS.READ] },

// Limited functionality
{ resource: RESOURCES.VIEW_DATA, actions: [ACTIONS.READ] },
{ resource: RESOURCES.EXPORT_DATA, actions: [ACTIONS.EXPORT] },
{ resource: RESOURCES.PRINT_DATA, actions: [ACTIONS.PRINT] },
{ resource: RESOURCES.SEARCH_DATA, actions: [ACTIONS.SEARCH] },
{ resource: RESOURCES.FILTER_DATA, actions: [ACTIONS.FILTER] },

// Profile operations
{ resource: RESOURCES.VIEW_PROFILE, actions: [ACTIONS.VIEW] },
{ resource: RESOURCES.UPDATE_PROFILE, actions: [ACTIONS.UPDATE] },
{ resource: RESOURCES.CHANGE_PASSWORD, actions: [ACTIONS.UPDATE] }
]
},

'User': {
name: 'User',
permissions: [
// Very limited access
{ resource: RESOURCES.DASHBOARD, actions: [ACTIONS.READ] },
{ resource: RESOURCES.COUNTRY_MASTER, actions: [ACTIONS.READ, ACTIONS.SEARCH, ACTIONS.FILTER] },
{ resource: RESOURCES.STATE_MASTER, actions: [ACTIONS.READ, ACTIONS.SEARCH, ACTIONS.FILTER] },
{ resource: RESOURCES.CITY_MASTER, actions: [ACTIONS.READ, ACTIONS.SEARCH, ACTIONS.FILTER] },
{ resource: RESOURCES.ROLE_DEMO, actions: [ACTIONS.READ] },

// Basic functionality
{ resource: RESOURCES.VIEW_DATA, actions: [ACTIONS.READ] },
{ resource: RESOURCES.SEARCH_DATA, actions: [ACTIONS.SEARCH] },
{ resource: RESOURCES.FILTER_DATA, actions: [ACTIONS.FILTER] },

// Profile operations
{ resource: RESOURCES.VIEW_PROFILE, actions: [ACTIONS.VIEW] },
{ resource: RESOURCES.UPDATE_PROFILE, actions: [ACTIONS.UPDATE] },
{ resource: RESOURCES.CHANGE_PASSWORD, actions: [ACTIONS.UPDATE] }
]
},

'Guest': {
name: 'Guest',
permissions: [
// Minimal access
{ resource: RESOURCES.DASHBOARD, actions: [ACTIONS.READ] },
{ resource: RESOURCES.COUNTRY_MASTER, actions: [ACTIONS.READ] },
{ resource: RESOURCES.STATE_MASTER, actions: [ACTIONS.READ] },
{ resource: RESOURCES.CITY_MASTER, actions: [ACTIONS.READ] },
{ resource: RESOURCES.ROLE_DEMO, actions: [ACTIONS.READ] },

// Basic functionality
{ resource: RESOURCES.VIEW_DATA, actions: [ACTIONS.READ] },

// Profile operations
{ resource: RESOURCES.VIEW_PROFILE, actions: [ACTIONS.VIEW] }
]
}
}
};

// Route-based permissions mapping
export const ROUTE_PERMISSIONS: { [key: string]: { resource: string; action: string } } = {
'/dashboard': { resource: RESOURCES.DASHBOARD, action: ACTIONS.READ },
'/masters/countrymaster': { resource: RESOURCES.COUNTRY_MASTER, action: ACTIONS.READ },
'/masters/statemaster': { resource: RESOURCES.STATE_MASTER, action: ACTIONS.READ },
'/masters/citymaster': { resource: RESOURCES.CITY_MASTER, action: ACTIONS.READ },
'/system/settings': { resource: RESOURCES.SYSTEM_SETTINGS, action: ACTIONS.READ },
'/system/users': { resource: RESOURCES.USER_MANAGEMENT, action: ACTIONS.READ },
'/role-demo': { resource: RESOURCES.ROLE_DEMO, action: ACTIONS.READ }
};

// Feature-based permissions mapping
export const FEATURE_PERMISSIONS: { [key: string]: { resource: string; action: string } } = {
'export-data': { resource: RESOURCES.EXPORT_DATA, action: ACTIONS.EXPORT },
'print-data': { resource: RESOURCES.PRINT_DATA, action: ACTIONS.PRINT },
'search-data': { resource: RESOURCES.SEARCH_DATA, action: ACTIONS.SEARCH },
'filter-data': { resource: RESOURCES.FILTER_DATA, action: ACTIONS.FILTER },
'create-country': { resource: RESOURCES.CREATE_COUNTRY, action: ACTIONS.CREATE },
'update-country': { resource: RESOURCES.UPDATE_COUNTRY, action: ACTIONS.UPDATE },
'delete-country': { resource: RESOURCES.DELETE_COUNTRY, action: ACTIONS.DELETE },
'create-state': { resource: RESOURCES.CREATE_STATE, action: ACTIONS.CREATE },
'update-state': { resource: RESOURCES.UPDATE_STATE, action: ACTIONS.UPDATE },
'delete-state': { resource: RESOURCES.DELETE_STATE, action: ACTIONS.DELETE },
'create-city': { resource: RESOURCES.CREATE_CITY, action: ACTIONS.CREATE },
'update-city': { resource: RESOURCES.UPDATE_CITY, action: ACTIONS.UPDATE },
'delete-city': { resource: RESOURCES.DELETE_CITY, action: ACTIONS.DELETE },
'manage-users': { resource: RESOURCES.MANAGE_USERS, action: ACTIONS.MANAGE },
'manage-roles': { resource: RESOURCES.MANAGE_ROLES, action: ACTIONS.MANAGE },
'view-logs': { resource: RESOURCES.VIEW_LOGS, action: ACTIONS.VIEW },
'system-config': { resource: RESOURCES.SYSTEM_CONFIG, action: ACTIONS.MANAGE }
};
Loading