Files
Goa-gel-fullstack/frontend/src/app/features/admin/admin.component.ts
Mahi 6ec8d3236d feat: Rebrand to License Authority with Govt of Goa branding
- Replace TLAS with License Authority throughout documentation
- Add Government of Goa emblem/logo (Ashoka Chakra style)
- Update frontend branding to match documentation
- Add configurable Swagger API link via VITE_API_BASE_URL env var
- Fix Docker build for VitePress (git dependency, .dockerignore)
- Fix helmet security headers for HTTP deployments
- Add CORS support for VM deployment

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-10 00:46:25 -04:00

291 lines
8.1 KiB
TypeScript

import { Component, OnInit } from '@angular/core';
import { CommonModule } from '@angular/common';
import { RouterModule } from '@angular/router';
import { MatTabsModule } from '@angular/material/tabs';
import { MatCardModule } from '@angular/material/card';
import { MatIconModule } from '@angular/material/icon';
import { MatButtonModule } from '@angular/material/button';
import { MatDividerModule } from '@angular/material/divider';
import { DepartmentOnboardingComponent } from './department-onboarding/department-onboarding.component';
import { DepartmentListComponent } from './department-list/department-list.component';
import { UserListComponent } from './user-list/user-list.component';
import { TransactionDashboardComponent } from './transaction-dashboard/transaction-dashboard.component';
import { EventDashboardComponent } from './event-dashboard/event-dashboard.component';
import { LogsViewerComponent } from './logs-viewer/logs-viewer.component';
import { AdminStatsComponent } from './admin-stats/admin-stats.component';
import { BlockchainExplorerMiniComponent } from '../../shared/components';
@Component({
selector: 'app-admin',
standalone: true,
imports: [
CommonModule,
RouterModule,
MatTabsModule,
MatCardModule,
MatIconModule,
MatButtonModule,
MatDividerModule,
DepartmentOnboardingComponent,
DepartmentListComponent,
UserListComponent,
TransactionDashboardComponent,
EventDashboardComponent,
LogsViewerComponent,
AdminStatsComponent,
BlockchainExplorerMiniComponent,
],
template: `
<div class="admin-container">
<header class="admin-header">
<div class="header-content">
<div class="header-icon-container">
<mat-icon class="header-icon">admin_panel_settings</mat-icon>
</div>
<div class="header-text">
<h1>Admin Portal</h1>
<p class="subtitle">Manage the License Authority Platform</p>
</div>
</div>
</header>
<div class="admin-content">
<!-- Platform Statistics -->
<app-admin-stats></app-admin-stats>
<!-- Main Tabs -->
<mat-card class="tabs-card">
<mat-tab-group animationDuration="300ms">
<!-- Dashboard Tab -->
<mat-tab>
<ng-template mat-tab-label>
<mat-icon class="tab-icon">dashboard</mat-icon>
Dashboard
</ng-template>
<div class="tab-content">
<div class="dashboard-grid">
<div class="dashboard-main">
<app-transaction-dashboard></app-transaction-dashboard>
</div>
<div class="dashboard-sidebar">
<app-blockchain-explorer-mini [showViewAll]="false"></app-blockchain-explorer-mini>
</div>
</div>
</div>
</mat-tab>
<!-- Departments Tab -->
<mat-tab>
<ng-template mat-tab-label>
<mat-icon class="tab-icon">business</mat-icon>
Departments
</ng-template>
<div class="tab-content">
<app-department-onboarding></app-department-onboarding>
<mat-divider class="section-divider"></mat-divider>
<app-department-list></app-department-list>
</div>
</mat-tab>
<!-- Users Tab -->
<mat-tab>
<ng-template mat-tab-label>
<mat-icon class="tab-icon">people</mat-icon>
Users
</ng-template>
<div class="tab-content">
<app-user-list></app-user-list>
</div>
</mat-tab>
<!-- Transactions Tab -->
<mat-tab>
<ng-template mat-tab-label>
<mat-icon class="tab-icon">receipt_long</mat-icon>
Transactions
</ng-template>
<div class="tab-content">
<app-transaction-dashboard></app-transaction-dashboard>
</div>
</mat-tab>
<!-- Events Tab -->
<mat-tab>
<ng-template mat-tab-label>
<mat-icon class="tab-icon">event_note</mat-icon>
Events
</ng-template>
<div class="tab-content">
<app-event-dashboard></app-event-dashboard>
</div>
</mat-tab>
<!-- Logs Tab -->
<mat-tab>
<ng-template mat-tab-label>
<mat-icon class="tab-icon">description</mat-icon>
Logs
</ng-template>
<div class="tab-content">
<app-logs-viewer></app-logs-viewer>
</div>
</mat-tab>
</mat-tab-group>
</mat-card>
</div>
</div>
`,
styles: [
`
.admin-container {
min-height: 100vh;
background-color: var(--dbim-linen);
}
.admin-header {
background: linear-gradient(135deg, #1D0A69 0%, #2563EB 100%);
color: white;
padding: 32px;
box-shadow: 0 4px 20px rgba(29, 10, 105, 0.15);
position: relative;
overflow: hidden;
border-radius: 0 0 16px 16px;
}
.header-content {
display: flex;
align-items: center;
gap: 20px;
max-width: 1400px;
margin: 0 auto;
position: relative;
z-index: 1;
}
.header-icon-container {
width: 64px;
height: 64px;
border-radius: 16px;
background: rgba(255, 255, 255, 0.2);
display: flex;
align-items: center;
justify-content: center;
backdrop-filter: blur(10px);
}
.header-icon {
font-size: 32px !important;
width: 32px !important;
height: 32px !important;
color: white !important;
}
.header-text h1 {
margin: 0;
font-size: 28px;
font-weight: 700;
letter-spacing: -0.02em;
color: white !important;
}
.header-text .subtitle {
margin: 4px 0 0;
color: rgba(255, 255, 255, 0.9) !important;
font-size: 14px;
font-weight: 400;
}
.admin-content {
max-width: 1400px;
margin: 0 auto;
padding: 24px;
background: transparent;
}
.tabs-card {
margin-top: 24px;
border-radius: 0 !important;
box-shadow: none !important;
background: transparent !important;
overflow: visible;
}
:host ::ng-deep .tabs-card .mat-mdc-card {
box-shadow: none !important;
background: transparent !important;
}
:host ::ng-deep .mat-mdc-tab-header {
background: white;
border-radius: 12px 12px 0 0;
padding: 8px 8px 0 8px;
border-bottom: 1px solid rgba(0, 0, 0, 0.08);
}
:host ::ng-deep .mat-mdc-tab {
min-width: 120px;
padding: 0 24px;
height: 48px;
opacity: 0.7;
}
:host ::ng-deep .mat-mdc-tab.mdc-tab--active {
opacity: 1;
}
:host ::ng-deep .mat-mdc-tab-labels {
gap: 4px;
}
:host ::ng-deep .mdc-tab__text-label {
color: #1D0A69 !important;
font-weight: 500;
}
:host ::ng-deep .mdc-tab-indicator__content--underline {
border-color: #1D0A69 !important;
border-width: 3px !important;
border-radius: 3px 3px 0 0;
}
.tab-icon {
margin-right: 8px;
font-size: 20px;
width: 20px;
height: 20px;
color: #1D0A69;
}
.tab-content {
padding: 24px;
background: white;
border-radius: 0 0 12px 12px;
min-height: 400px;
}
.section-divider {
margin: 32px 0;
}
.dashboard-grid {
display: grid;
grid-template-columns: 1fr 400px;
gap: 24px;
}
.dashboard-main {
min-width: 0;
}
.dashboard-sidebar {
min-width: 0;
}
`,
],
})
export class AdminComponent implements OnInit {
ngOnInit(): void {
// Initialize admin dashboard
}
}