diff --git a/src/services/angular-generator.service.ts b/src/services/angular-generator.service.ts index 59d8430..af29f30 100644 --- a/src/services/angular-generator.service.ts +++ b/src/services/angular-generator.service.ts @@ -37,6 +37,8 @@ export class AngularGeneratorService { await this.generateService(names, featureDir); await this.generateFilterComponent(names, featureDir); await this.generateListComponent(names, featureDir); + // NEW: Generate the details component + await this.generateDetailsComponent(names, featureDir); const listComponentPath = path.join( featureDir, @@ -45,6 +47,17 @@ export class AngularGeneratorService { `${names.singular}-list.component.ts`, ); + const detailsComponentPath = path.join( + featureDir, 'components', `${names.singular}-details`, `${names.singular}-details.component.ts` + ); + + // Add details route FIRST, as it's more specific (`/products/:id`) + await this.moduleUpdaterService.addRouteToAngularApp( + `${names.pascal}DetailsComponent`, + detailsComponentPath, + `${names.plural}/:id` + ); + await this.moduleUpdaterService.addRouteToAngularApp( `${names.pascal}ListComponent`, listComponentPath, @@ -52,13 +65,23 @@ export class AngularGeneratorService { ); console.log(`✅ Angular files for "${tableName}" created successfully in: ${featureDir}`); - console.log('\n✨ app.routes.ts has been updated automatically! ✨'); + console.log('\n✨ app.routes.ts has been updated automatically with list and details routes! ✨'); } catch (error) { console.error(`❌ An error occurred during Angular generation:`, error.message); } } + private async generateDetailsComponent(names: NamingConvention, featureDir: string) { + const compDir = path.join(featureDir, 'components', `${names.singular}-details`); + const tsContent = this.templateService.render('angular/details.component.ts.tpl', names); + const htmlContent = this.templateService.render('angular/details.component.html.tpl', names); + + await fsPromises.mkdir(compDir, { recursive: true }); + fs.writeFileSync(path.join(compDir, `${names.singular}-details.component.ts`), tsContent); + fs.writeFileSync(path.join(compDir, `${names.singular}-details.component.html`), htmlContent); + } + private async generateModel(names: NamingConvention, featureDir: string) { const modelsDir = path.join(featureDir, 'models'); const content = this.templateService.render('angular/model.ts.tpl', names); diff --git a/src/templates/angular/details.component.html.tpl b/src/templates/angular/details.component.html.tpl new file mode 100644 index 0000000..49cec59 --- /dev/null +++ b/src/templates/angular/details.component.html.tpl @@ -0,0 +1,42 @@ + + + +
+ +
+
+

{{title}} Details

+ + +
+ + + + + + + + + + + + + + +
ID{{ {{camel}}.id }}
Name{{ {{camel}}.name }}
+
+ +
+ Back to List + +
+
+
+
+ + +
+ +
+
+
\ No newline at end of file diff --git a/src/templates/angular/details.component.ts.tpl b/src/templates/angular/details.component.ts.tpl new file mode 100644 index 0000000..4d7ae1a --- /dev/null +++ b/src/templates/angular/details.component.ts.tpl @@ -0,0 +1,34 @@ +// dvbooking-cli/src/templates/angular/details.component.ts.tpl + +// Generated by the CLI +import { Component, OnInit } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { ActivatedRoute, RouterModule } from '@angular/router'; +import { Observable } from 'rxjs'; +import { switchMap } from 'rxjs/operators'; +import { {{pascal}} } from '../../models/{{singular}}.model'; +import { {{pascal}}Service } from '../../services/{{singular}}.service'; + +@Component({ + selector: 'app-{{kebab}}-details', + templateUrl: './{{singular}}-details.component.html', + standalone: true, + imports: [CommonModule, RouterModule], +}) +export class {{pascal}}DetailsComponent implements OnInit { + {{camel}}$!: Observable<{{pascal}}>; + + constructor( + private route: ActivatedRoute, + private {{camel}}Service: {{pascal}}Service + ) {} + + ngOnInit(): void { + this.{{camel}}$ = this.route.params.pipe( + switchMap(params => { + const id = params['id']; + return this.{{camel}}Service.findOne(id); + }) + ); + } +} \ No newline at end of file diff --git a/src/templates/angular/list.component.html.tpl b/src/templates/angular/list.component.html.tpl index e92d0ad..89350de 100644 --- a/src/templates/angular/list.component.html.tpl +++ b/src/templates/angular/list.component.html.tpl @@ -23,7 +23,7 @@ {{ item.name }} - + View diff --git a/src/templates/angular/list.component.ts.tpl b/src/templates/angular/list.component.ts.tpl index c01b265..6e805b5 100644 --- a/src/templates/angular/list.component.ts.tpl +++ b/src/templates/angular/list.component.ts.tpl @@ -3,6 +3,7 @@ // Generated by the CLI import { Component, OnInit } from '@angular/core'; import { CommonModule } from '@angular/common'; +import { RouterModule } from '@angular/router'; import { BehaviorSubject, Observable, combineLatest } from 'rxjs'; import { switchMap, startWith } from 'rxjs/operators'; import { {{pascal}}, PaginatedResponse } from '../../models/{{singular}}.model'; @@ -13,7 +14,7 @@ import { {{pascal}}FilterComponent } from '../{{singular}}-filter/{{singular}}-f selector: 'app-{{kebab}}-list', templateUrl: './{{singular}}-list.component.html', standalone: true, - imports: [CommonModule, {{pascal}}FilterComponent], + imports: [CommonModule,RouterModule, {{pascal}}FilterComponent], }) export class {{pascal}}ListComponent implements OnInit {