diff --git a/.gitignore b/.gitignore index 7a4a8630..58f8ab12 100644 --- a/.gitignore +++ b/.gitignore @@ -39,3 +39,5 @@ testem.log # System files .DS_Store Thumbs.db + +.config/ diff --git a/environments/environment.ts b/environments/environment.ts index 9990f094..9acd7cd9 100644 --- a/environments/environment.ts +++ b/environments/environment.ts @@ -5,4 +5,4 @@ export const environment = { '36fda24fe5588fa4285ac6c6c2fdfbdb6b6bc9834699774c9bf777f706d05a88', dfFileManagerApiKey: 'b5cb82af7b5d4130f36149f90aa2746782e59a872ac70454ac188743cb55b0ba', -}; +}; diff --git a/src/app/adf-event-scripts/df-manage-scripts/df-manage-scripts.component.html b/src/app/adf-event-scripts/df-manage-scripts/df-manage-scripts.component.html index 9da55379..d6a6c1d8 100644 --- a/src/app/adf-event-scripts/df-manage-scripts/df-manage-scripts.component.html +++ b/src/app/adf-event-scripts/df-manage-scripts/df-manage-scripts.component.html @@ -1,4 +1,6 @@ - + diff --git a/src/app/adf-limits/df-manage-limits/df-manage-limits.component.html b/src/app/adf-limits/df-manage-limits/df-manage-limits.component.html index f8c7bb58..30ac6dea 100644 --- a/src/app/adf-limits/df-manage-limits/df-manage-limits.component.html +++ b/src/app/adf-limits/df-manage-limits/df-manage-limits.component.html @@ -1,4 +1,4 @@ - + diff --git a/src/app/adf-reports/df-manage-service-report/df-manage-service-report.component.html b/src/app/adf-reports/df-manage-service-report/df-manage-service-report.component.html index be87d3e1..ce7fa7f2 100644 --- a/src/app/adf-reports/df-manage-service-report/df-manage-service-report.component.html +++ b/src/app/adf-reports/df-manage-service-report/df-manage-service-report.component.html @@ -1,4 +1,6 @@ - + diff --git a/src/app/adf-scheduler/df-manage-scheduler/df-manage-scheduler.component.html b/src/app/adf-scheduler/df-manage-scheduler/df-manage-scheduler.component.html index dad2f333..a5cc55a6 100644 --- a/src/app/adf-scheduler/df-manage-scheduler/df-manage-scheduler.component.html +++ b/src/app/adf-scheduler/df-manage-scheduler/df-manage-scheduler.component.html @@ -1,4 +1,6 @@ - + diff --git a/src/app/adf-services/df-manage-services/df-manage-services-table.component.ts b/src/app/adf-services/df-manage-services/df-manage-services-table.component.ts index b36f3fb5..e59be6bd 100644 --- a/src/app/adf-services/df-manage-services/df-manage-services-table.component.ts +++ b/src/app/adf-services/df-manage-services/df-manage-services-table.component.ts @@ -124,9 +124,9 @@ export class DfManageServicesTableComponent extends DfManageTableComponent src.name) - .join('","')}"))`; + filter = `${ + filter ? `(${filter}) and ` : '' + }(type in ("${this.serviceTypes.map(src => src.name).join('","')}"))`; } this.serviceService diff --git a/src/app/adf-services/df-manage-services/df-manage-services.component.html b/src/app/adf-services/df-manage-services/df-manage-services.component.html index 9da55379..426e1ea0 100644 --- a/src/app/adf-services/df-manage-services/df-manage-services.component.html +++ b/src/app/adf-services/df-manage-services/df-manage-services.component.html @@ -1,4 +1,6 @@ - + diff --git a/src/app/adf-services/df-service-details/df-service-details.component.html b/src/app/adf-services/df-service-details/df-service-details.component.html index 7ca92eb9..62b448fd 100644 --- a/src/app/adf-services/df-service-details/df-service-details.component.html +++ b/src/app/adf-services/df-service-details/df-service-details.component.html @@ -87,7 +87,10 @@

- @@ -569,7 +572,11 @@

Full Access

{{ 'services.controls.serviceType.label' | transloco }} - + {{ type.label }} @@ -821,4 +828,7 @@

Full Access

- + + diff --git a/src/app/adf-services/df-service-details/df-service-details.component.ts b/src/app/adf-services/df-service-details/df-service-details.component.ts index 9ab190fd..58695482 100644 --- a/src/app/adf-services/df-service-details/df-service-details.component.ts +++ b/src/app/adf-services/df-service-details/df-service-details.component.ts @@ -3,6 +3,7 @@ import { Component, ElementRef, Inject, + Input, OnInit, ViewChild, } from '@angular/core'; @@ -85,6 +86,9 @@ import { MatCardModule } from '@angular/material/card'; import { TitleCasePipe } from '@angular/common'; import { MatDividerModule } from '@angular/material/divider'; import { DfSystemService } from 'src/app/shared/services/df-system.service'; +import { DfUserDataService } from 'src/app/shared/services/df-user-data.service'; +import { DfPaywallService } from 'src/app/shared/services/df-paywall.service'; +import { DfPaywallModal } from 'src/app/shared/components/df-paywall-modal/df-paywall-modal.component'; // Add this interface before the @Component decorator interface ComponentOption { @@ -116,6 +120,14 @@ interface CategorizedField { advanced: ConfigSchema[]; } +interface ServiceResponse { + resource: Array<{ + id: number; + name: string; + [key: string]: any; + }>; +} + @UntilDestroy({ checkProperties: true }) @Component({ selector: 'df-service-details', @@ -167,6 +179,7 @@ export class DfServiceDetailsComponent implements OnInit { serviceForm: FormGroup; faCircleInfo = faCircleInfo; serviceData: Service; + selectedServiceTypeLable: string; configSchema: Array; images: Array; search = ''; @@ -800,8 +813,10 @@ export class DfServiceDetailsComponent implements OnInit { stepper.next(); } - openDialog() { - const dialogRef = this.dialog.open(DfPaywallModal); + openDialog(serviceTypeName: string) { + const dialogRef = this.dialog.open(DfPaywallModal, { + data: { serviceName: serviceTypeName }, + }); dialogRef.afterClosed().subscribe(); } @@ -1189,42 +1204,19 @@ export class DfServiceDetailsComponent implements OnInit { onAccessLevelSelect(level: string) { this.selectedAccessLevel = level; } + + getServiceTypeLabel(value: string): string { + const selectedType = this.serviceTypes.find(type => type.name === value); + return selectedType ? selectedType.label : value; + } + + onServiceTypeSelect(selectedServiceTypeLable: string) { + this.selectedServiceTypeLable = + selectedServiceTypeLable || 'Unknown. Unable to identify Service Type'; + } } interface ImageObject { alt: string; src: string; label: string; } - -@Component({ - selector: 'df-paywall-modal', - templateUrl: 'df-paywall-modal.html', - styleUrls: ['./df-service-details.component.scss'], - standalone: true, - imports: [ - MatDialogModule, - MatButtonModule, - DfPaywallComponent, - TranslocoPipe, - ], -}) -// eslint-disable-next-line @angular-eslint/component-class-suffix -export class DfPaywallModal { - @ViewChild('calendlyWidget') calendlyWidget: ElementRef; - - ngAfterViewInit(): void { - (window as any)['Calendly'].initInlineWidget({ - url: 'https://calendly.com/dreamfactory-platform/unlock-all-features', - parentElement: this.calendlyWidget.nativeElement, - autoLoad: false, - }); - } -} - -interface ServiceResponse { - resource: Array<{ - id: number; - name: string; - [key: string]: any; - }>; -} diff --git a/src/app/ai/ai.component.html b/src/app/ai/ai.component.html new file mode 100644 index 00000000..e381556d --- /dev/null +++ b/src/app/ai/ai.component.html @@ -0,0 +1,62 @@ +
+
+
+

AI Gateway Data Platform

+
+

+ Unlock the power of AI with your data! Our upcoming AI capabilities + will enable you to: +

+
    +
  • + ✨ Secure Dataset Exposure: Safely expose your + datasets to AI clients with full RBAC protections +
  • +
  • + 🔐 Enterprise-Grade Security: Maintain complete + control over data access and permissions +
  • +
  • + 🚀 Seamless Integration: Connect popular AI + platforms and tools directly to your DreamFactory APIs +
  • +
  • + 📊 Intelligent Analytics: Generate insights and + recommendations powered by machine learning +
  • +
+
+

🎯 Ready to Get Started?

+

+ Contact us below to join our exclusive AI beta program and be among + the first to experience these cutting-edge capabilities! +

+
+
+
+
+ +
+ +
+

AI Assistant

+

+ Welcome to the AI section! This is where AI-powered features will be + implemented. +

+
+
+

Smart Analytics

+

AI-powered data insights and analytics

+
+
+

Automated Tasks

+

Intelligent automation and task management

+
+
+

Predictive Modeling

+

Advanced machine learning predictions

+
+
+
+
diff --git a/src/app/ai/ai.component.scss b/src/app/ai/ai.component.scss new file mode 100644 index 00000000..ad745f32 --- /dev/null +++ b/src/app/ai/ai.component.scss @@ -0,0 +1,155 @@ +.ai-paywall-container { + min-height: 100vh; + background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%); +} + +.ai-intro-section { + padding: 3rem 2rem; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + color: white; + position: relative; + overflow: hidden; +} + +.ai-intro-section::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: url('data:image/svg+xml,'); + opacity: 0.3; +} + +.ai-intro-content { + max-width: 800px; + margin: 0 auto; + position: relative; + z-index: 1; +} + +.ai-title { + font-size: 2.5rem; + font-weight: 700; + margin-bottom: 1.5rem; + text-align: center; + color: #000; +} + +@keyframes rainbow-text { + 0%, + 100% { + background-position: 0% 50%; + } + 50% { + background-position: 100% 50%; + } +} + +.lead-text { + font-size: 1.2rem; + font-weight: 500; + margin-bottom: 2rem; + text-align: center; + opacity: 0.95; +} + +.feature-list { + list-style: none; + padding: 0; + margin: 2rem 0; +} + +.feature-list li { + padding: 0.8rem 0; + font-size: 1.1rem; + display: flex; + align-items: center; + border-bottom: 1px solid rgba(255, 255, 255, 0.2); + opacity: 0.9; +} + +.feature-list li:last-child { + border-bottom: none; +} + +.beta-callout { + background: rgba(255, 255, 255, 0.1); + padding: 1.5rem; + border-radius: 12px; + margin-top: 2rem; + text-align: center; + backdrop-filter: blur(10px); + border: 1px solid rgba(255, 255, 255, 0.2); +} + +.beta-callout h3 { + margin-bottom: 0.5rem; + font-size: 1.3rem; + color: #ffd700; +} + +.beta-callout p { + margin: 0; + font-size: 1rem; + opacity: 0.9; +} + +.ai-container { + padding: 2rem; + max-width: 1200px; + margin: 0 auto; +} + +h1 { + color: #333; + margin-bottom: 1rem; + background: linear-gradient( + 45deg, + #dc143c, + #ff4500, + #ffa500, + #32cd32, + #1e90ff, + #8a2be2 + ); + background-size: 300% 300%; + -webkit-background-clip: text; + background-clip: text; + -webkit-text-fill-color: transparent; + animation: rainbow-text 3s ease-in-out infinite; + font-weight: 700; + text-shadow: 0 0 15px rgba(0, 0, 0, 0.2); + filter: drop-shadow(0 0 8px rgba(0, 0, 0, 0.1)); +} + +.ai-content { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + gap: 2rem; + margin-top: 2rem; +} + +.feature-card { + background: #f8f9fa; + padding: 1.5rem; + border-radius: 8px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + transition: transform 0.2s ease; +} + +.feature-card:hover { + transform: translateY(-2px); + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15); +} + +.feature-card h3 { + margin-bottom: 0.5rem; + color: #333; +} + +.feature-card p { + color: #666; + line-height: 1.5; +} diff --git a/src/app/ai/ai.component.ts b/src/app/ai/ai.component.ts new file mode 100644 index 00000000..446d9219 --- /dev/null +++ b/src/app/ai/ai.component.ts @@ -0,0 +1,24 @@ +import { Component } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { ActivatedRoute } from '@angular/router'; +import { DfPaywallComponent } from '../shared/components/df-paywall/df-paywall.component'; +import { NgIf } from '@angular/common'; + +@Component({ + selector: 'app-ai', + standalone: true, + imports: [CommonModule, DfPaywallComponent, NgIf], + templateUrl: './ai.component.html', + styleUrls: ['./ai.component.scss'], +}) +export class AiComponent { + paywall = false; + + constructor(private activatedRoute: ActivatedRoute) { + this.activatedRoute.data.subscribe(({ showPaywall }) => { + if (showPaywall) { + this.paywall = true; + } + }); + } +} diff --git a/src/app/routes.ts b/src/app/routes.ts index ae260047..ad9733f1 100644 --- a/src/app/routes.ts +++ b/src/app/routes.ts @@ -799,6 +799,12 @@ export const routes: Routes = [ ], canActivate: [loggedInGuard, licenseGuard], }, + { + path: ROUTES.AI, + loadComponent: () => import('./ai/ai.component').then(m => m.AiComponent), + canActivate: [loggedInGuard, licenseGuard], + data: { showPaywall: true }, + }, { path: ROUTES.PROFILE, loadComponent: () => diff --git a/src/app/adf-services/df-service-details/df-paywall-modal.html b/src/app/shared/components/df-paywall-modal/df-paywall-modal.component.html similarity index 100% rename from src/app/adf-services/df-service-details/df-paywall-modal.html rename to src/app/shared/components/df-paywall-modal/df-paywall-modal.component.html diff --git a/src/app/shared/components/df-paywall-modal/df-paywall-modal.component.scss b/src/app/shared/components/df-paywall-modal/df-paywall-modal.component.scss new file mode 100644 index 00000000..8b321e56 --- /dev/null +++ b/src/app/shared/components/df-paywall-modal/df-paywall-modal.component.scss @@ -0,0 +1 @@ +/* Styles for DfPaywallModal. Add or move specific styles here if needed. */ diff --git a/src/app/shared/components/df-paywall-modal/df-paywall-modal.component.ts b/src/app/shared/components/df-paywall-modal/df-paywall-modal.component.ts new file mode 100644 index 00000000..16845c1d --- /dev/null +++ b/src/app/shared/components/df-paywall-modal/df-paywall-modal.component.ts @@ -0,0 +1,53 @@ +import { + Component, + ElementRef, + ViewChild, + OnInit, + AfterViewInit, + Inject, +} from '@angular/core'; +import { MatDialogModule, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { MatButtonModule } from '@angular/material/button'; +import { DfPaywallComponent } from '../df-paywall/df-paywall.component'; +import { TranslocoPipe } from '@ngneat/transloco'; +import { DfUserDataService } from '../../services/df-user-data.service'; +import { DfSystemConfigDataService } from '../../services/df-system-config-data.service'; +import { DfPaywallService } from '../../services/df-paywall.service'; + +@Component({ + selector: 'df-paywall-modal', + templateUrl: './df-paywall-modal.component.html', + styleUrls: ['./df-paywall-modal.component.scss'], + standalone: true, + imports: [ + MatDialogModule, + MatButtonModule, + DfPaywallComponent, + TranslocoPipe, + ], +}) +export class DfPaywallModal implements OnInit, AfterViewInit { + @ViewChild('calendlyWidget') calendlyWidget: ElementRef; + + constructor( + private userDataService: DfUserDataService, + private systemConfigService: DfSystemConfigDataService, + private dfPaywallService: DfPaywallService, + @Inject(MAT_DIALOG_DATA) public data: { serviceName: string } + ) {} + + ngOnInit(): void { + const user = this.userDataService.userData; + const email = user?.email; + const ip = this.systemConfigService?.environment?.client?.ipAddress; + this.dfPaywallService.trackPaywallHit(email, ip, this.data.serviceName); + } + + ngAfterViewInit(): void { + (window as any)['Calendly'].initInlineWidget({ + url: 'https://calendly.com/dreamfactory-platform/unlock-all-features', + parentElement: this.calendlyWidget.nativeElement, + autoLoad: false, + }); + } +} diff --git a/src/app/shared/components/df-paywall/df-paywall.component.ts b/src/app/shared/components/df-paywall/df-paywall.component.ts index 4600511a..f87122e0 100644 --- a/src/app/shared/components/df-paywall/df-paywall.component.ts +++ b/src/app/shared/components/df-paywall/df-paywall.component.ts @@ -1,5 +1,15 @@ -import { AfterViewInit, Component, ElementRef, ViewChild } from '@angular/core'; +import { + AfterViewInit, + Component, + ElementRef, + ViewChild, + Input, + OnInit, +} from '@angular/core'; import { TranslocoPipe } from '@ngneat/transloco'; +import { DfUserDataService } from '../../services/df-user-data.service'; +import { DfSystemConfigDataService } from '../../services/df-system-config-data.service'; +import { DfPaywallService } from '../../services/df-paywall.service'; @Component({ selector: 'df-paywall', @@ -8,8 +18,24 @@ import { TranslocoPipe } from '@ngneat/transloco'; standalone: true, imports: [TranslocoPipe], }) -export class DfPaywallComponent implements AfterViewInit { +export class DfPaywallComponent implements AfterViewInit, OnInit { @ViewChild('calendlyWidget') calendlyWidget: ElementRef; + @Input() serviceName: string; + + constructor( + private userDataService: DfUserDataService, + private systemConfigService: DfSystemConfigDataService, + private dfPaywallService: DfPaywallService + ) {} + + ngOnInit(): void { + const user = this.userDataService.userData; + const email = user?.email; + const ip = this.systemConfigService?.environment?.client?.ipAddress; + const serviceName = this.serviceName; + + this.dfPaywallService.trackPaywallHit(email, ip, serviceName); + } ngAfterViewInit(): void { (window as any)['Calendly'].initInlineWidget({ diff --git a/src/app/shared/components/df-side-nav/df-side-nav.component.html b/src/app/shared/components/df-side-nav/df-side-nav.component.html index c8ded1a4..2a1e316e 100644 --- a/src/app/shared/components/df-side-nav/df-side-nav.component.html +++ b/src/app/shared/components/df-side-nav/df-side-nav.component.html @@ -154,6 +154,7 @@

class="nav-item" [class.active]="isActive(item)" [class.commercial-feature]="isFeatureLocked(item.path, licenseType)" + [class.ai-nav-item]="item.path === '/ai'" (click)="handleNavClick(item)"> diff --git a/src/app/shared/components/df-side-nav/df-side-nav.component.scss b/src/app/shared/components/df-side-nav/df-side-nav.component.scss index 3d3ebe4f..7ce4ff17 100644 --- a/src/app/shared/components/df-side-nav/df-side-nav.component.scss +++ b/src/app/shared/components/df-side-nav/df-side-nav.component.scss @@ -159,6 +159,126 @@ $red-palette: mat.define-palette(mat.$red-palette); ::ng-deep .mat-mdc-button-touch-target { background-color: #f6f2fa; } + + // Special styling for AI navigation item + &.ai-nav-item { + position: relative; + overflow: hidden; + + &::before { + content: ''; + position: absolute; + top: 0; + left: -100%; + width: 100%; + height: 100%; + background: linear-gradient( + 90deg, + transparent, + rgba(220, 20, 60, 0.15), + rgba(255, 69, 0, 0.15), + rgba(255, 165, 0, 0.15), + rgba(50, 205, 50, 0.15), + rgba(30, 144, 255, 0.15), + rgba(138, 43, 226, 0.15), + transparent + ); + animation: rainbow-slide 3s ease-in-out infinite; + } + + span { + background: linear-gradient( + 45deg, + #dc143c, + #ff4500, + #ffa500, + #32cd32, + #1e90ff, + #8a2be2 + ); + background-size: 300% 300%; + -webkit-background-clip: text; + background-clip: text; + -webkit-text-fill-color: transparent; + animation: rainbow-text 2s ease-in-out infinite; + font-weight: 700; + text-shadow: 0 0 15px rgba(0, 0, 0, 0.3); + filter: drop-shadow(0 0 8px rgba(0, 0, 0, 0.2)); + } + + img { + filter: hue-rotate(0deg) saturate(2) brightness(0.8) contrast(1.3); + animation: rainbow-icon 4s linear infinite; + drop-shadow: 0 0 6px rgba(0, 0, 0, 0.3); + } + + &:hover { + &::before { + animation-duration: 1s; + } + + span { + animation-duration: 1s; + } + + img { + animation-duration: 2s; + } + } + } + + @keyframes rainbow-slide { + 0% { + left: -100%; + } + 50% { + left: 100%; + } + 100% { + left: -100%; + } + } + + @keyframes rainbow-text { + 0%, + 100% { + background-position: 0% 50%; + } + 50% { + background-position: 100% 50%; + } + } + + @keyframes rainbow-icon { + 0% { + filter: hue-rotate(0deg) saturate(2) brightness(0.8) contrast(1.3) + drop-shadow(0 0 6px rgba(220, 20, 60, 0.4)); + } + 16.66% { + filter: hue-rotate(60deg) saturate(2.2) brightness(0.7) contrast(1.4) + drop-shadow(0 0 6px rgba(255, 69, 0, 0.4)); + } + 33.33% { + filter: hue-rotate(120deg) saturate(2.4) brightness(0.6) contrast(1.5) + drop-shadow(0 0 6px rgba(255, 165, 0, 0.4)); + } + 50% { + filter: hue-rotate(180deg) saturate(2.2) brightness(0.7) contrast(1.4) + drop-shadow(0 0 6px rgba(50, 205, 50, 0.4)); + } + 66.66% { + filter: hue-rotate(240deg) saturate(2) brightness(0.8) contrast(1.3) + drop-shadow(0 0 6px rgba(30, 144, 255, 0.4)); + } + 83.33% { + filter: hue-rotate(300deg) saturate(2.2) brightness(0.7) contrast(1.4) + drop-shadow(0 0 6px rgba(138, 43, 226, 0.4)); + } + 100% { + filter: hue-rotate(360deg) saturate(2) brightness(0.8) contrast(1.3) + drop-shadow(0 0 6px rgba(220, 20, 60, 0.4)); + } + } &.active { ::ng-deep .mat-mdc-button-touch-target { background-color: #e3dfff; diff --git a/src/app/shared/services/df-paywall.service.ts b/src/app/shared/services/df-paywall.service.ts index 802bab81..b814d75c 100644 --- a/src/app/shared/services/df-paywall.service.ts +++ b/src/app/shared/services/df-paywall.service.ts @@ -2,6 +2,7 @@ import { Injectable } from '@angular/core'; import { catchError, map, of, switchMap } from 'rxjs'; import { DfSystemConfigDataService } from './df-system-config-data.service'; import { DfErrorService } from './df-error.service'; +import { HttpClient } from '@angular/common/http'; @Injectable({ providedIn: 'root', @@ -27,7 +28,8 @@ export class DfPaywallService { constructor( private systemConfigDataService: DfSystemConfigDataService, - private errorService: DfErrorService + private errorService: DfErrorService, + private http: HttpClient ) {} activatePaywall(resource?: string | Array) { @@ -60,4 +62,23 @@ export class DfPaywallService { return of(false); } } + + trackPaywallHit( + email: string = 'Unknown. Unable to fetch email', + ip_address: string = 'Unknown. Unable to fetch IP address', + service_name: string = 'Service name is not specified' + ): void { + this.http + .post('https://updates.dreamfactory.com/api/paywall', { + email, + ip_address: ip_address, + service_name: service_name, + }) + .subscribe({ + next: () => {}, + error: err => { + console.error('Paywall tracking failed:', err); + }, + }); + } } diff --git a/src/app/shared/services/df-user-data.service.ts b/src/app/shared/services/df-user-data.service.ts index a6aba456..78ebb037 100644 --- a/src/app/shared/services/df-user-data.service.ts +++ b/src/app/shared/services/df-user-data.service.ts @@ -60,6 +60,10 @@ export class DfUserDataService { this.isLoggedIn = false; } + get userData(): UserSession | null { + return this.userDataSubject.value; + } + set userData(userData: UserSession | null) { this.userDataSubject.next(userData); if (userData) { diff --git a/src/app/shared/types/routes.ts b/src/app/shared/types/routes.ts index 768263d9..3794b4b8 100644 --- a/src/app/shared/types/routes.ts +++ b/src/app/shared/types/routes.ts @@ -16,6 +16,7 @@ export enum ROUTES { QUICKSTART = 'quickstart', RESOURCES = 'resources', DOWNLOAD = 'download', + AI = 'ai', API_CONNECTIONS = 'api-connections', API_TYPES = 'api-types', DATABASE = 'database', diff --git a/src/app/shared/utilities/route.ts b/src/app/shared/utilities/route.ts index 3ea19119..5b04e1c1 100644 --- a/src/app/shared/utilities/route.ts +++ b/src/app/shared/utilities/route.ts @@ -15,6 +15,7 @@ const filteredFromNav = [ const navIcons = [ 'home', + 'ai', 'admin-settings', 'api-connections', 'api-security', @@ -62,7 +63,7 @@ export function accessibleRoutes( navs: Array