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 }} |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ 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 {