- {{ schema().title }}
+
+
+ {{ schema().title || module()?.type }}
close
@@ -17,13 +16,18 @@
-
}
diff --git a/src/app/module/module.component.ts b/src/app/module/module.component.ts
index 7cd9e84..7eb9ba8 100644
--- a/src/app/module/module.component.ts
+++ b/src/app/module/module.component.ts
@@ -1,11 +1,13 @@
import { Component, computed, inject, input, model, output } from '@angular/core';
-import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';
+import { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatIconModule } from '@angular/material/icon';
import { MatMenuModule } from '@angular/material/menu';
import { ModuleConfiguration } from '../../models/config.models';
import { SchemaService } from '../../services/schema.service';
import { ParamsFormComponent } from '../params-form/params-form.component';
+import { JsonPipe } from '@angular/common';
+import { MatTooltipModule } from '@angular/material/tooltip';
@Component({
selector: 'app-module',
@@ -15,6 +17,8 @@ import { ParamsFormComponent } from '../params-form/params-form.component';
ParamsFormComponent,
ReactiveFormsModule,
MatMenuModule,
+ MatTooltipModule,
+ JsonPipe,
],
templateUrl: './module.component.html',
styleUrl: './module.component.css',
@@ -34,7 +38,7 @@ export class ModuleComponent {
});
formGroup: FormGroup = new FormGroup({
- id: new FormControl(''),
+ id: new FormControl('', [Validators.required]),
type: new FormControl(''),
});
diff --git a/src/app/params-form/params-form.component.html b/src/app/params-form/params-form.component.html
index e90b025..3221f44 100644
--- a/src/app/params-form/params-form.component.html
+++ b/src/app/params-form/params-form.component.html
@@ -1,6 +1,7 @@
@if (paramsSchema && paramsFormInfo) {
@if (paramsOptions.length > 1) {
@@ -14,7 +15,7 @@
@for (key of paramKeys(); track key) {
@if (getParamInfo(key); as paramInfo) {
-
+
@switch (paramInfo.type) {
@case ('boolean') {
@@ -24,12 +25,12 @@
} @else {
}
-
123
+
123
}
@case ('integer') {
@if (!paramInfo.options) {
} @else {
}
-
123
+
123
}
@case ('string') {
@if (!paramInfo.options) {
} @else {
}
-
abc
+
abc
}
@case ('array') {
-
data_array
+
data_array
}
@case ('object') {
-
data_object
+
data_object
}
@default {
}
}
+ @if (paramInfo.hint) {
+
+
+ help_outline
+
+
+ }
@if (!paramsFormInfo.formGroup.controls[key].valid) {
{{ paramsFormInfo.formGroup.controls[key].errors | json }}
}
-
-
- help_outline
-
-
}
}
diff --git a/src/app/processor/processor.component.html b/src/app/processor/processor.component.html
index f316abd..533e255 100644
--- a/src/app/processor/processor.component.html
+++ b/src/app/processor/processor.component.html
@@ -2,12 +2,12 @@
-
-
- {{ processor()?.type }}
+
+
+ {{ schema()?.title || processor()?.type }}
close
diff --git a/src/app/route-list.component/route-list.component.css b/src/app/route-list.component/route-list.component.css
new file mode 100644
index 0000000..e69de29
diff --git a/src/app/route-list.component/route-list.component.html b/src/app/route-list.component/route-list.component.html
new file mode 100644
index 0000000..728f11c
--- /dev/null
+++ b/src/app/route-list.component/route-list.component.html
@@ -0,0 +1,25 @@
+
+
+
+ @for (route of routes(); track route; let i = $index) {
+
+ }
+
+
diff --git a/src/app/route-list.component/route-list.component.ts b/src/app/route-list.component/route-list.component.ts
new file mode 100644
index 0000000..2bc9230
--- /dev/null
+++ b/src/app/route-list.component/route-list.component.ts
@@ -0,0 +1,72 @@
+import { Component, inject, input, model } from '@angular/core';
+import { MatSnackBar } from '@angular/material/snack-bar';
+import { ModuleConfiguration, RouteConfiguration } from '../../models/config.models';
+import { SchemaService } from '../../services/schema.service';
+import { RouteComponent } from '../route/route.component';
+import { MatButtonModule } from '@angular/material/button';
+import { MatIconModule } from '@angular/material/icon';
+import { MatMenuModule } from '@angular/material/menu';
+import { MatTooltipModule } from '@angular/material/tooltip';
+
+@Component({
+ selector: 'app-route-list',
+ imports: [
+ RouteComponent,
+ MatMenuModule,
+ MatIconModule,
+ MatButtonModule,
+ MatTooltipModule,
+ ],
+ templateUrl: './route-list.component.html',
+ styleUrl: './route-list.component.css',
+})
+export class RouteListComponent {
+
+ routes = model
();
+ moduleIds = input();
+ public schemaService = inject(SchemaService);
+
+ private snackBar = inject(MatSnackBar);
+
+ deleteRoute(index: number) {
+ this.routes.update((routes) => {
+ if (routes) {
+ routes?.splice(index, 1);
+ return [...routes];
+ }
+ return routes;
+ });
+ this.snackBar.open('Route Removed', 'Dismiss', {
+ duration: 3000,
+ });
+ }
+
+ routeUpdated(index: number, route: RouteConfiguration | undefined) {
+ if (route === undefined) {
+ console.error('route is undefined, not updating');
+ return;
+ }
+ this.routes.update((routes) => {
+ if (routes) {
+ routes[index].input = route.input;
+ routes[index].output = route.output;
+ return [...routes];
+ }
+ return routes;
+ });
+ }
+
+ addRoute() {
+ const routeTemplate = this.schemaService.getSkeletonForRoute();
+ this.routes.update((routes) => {
+ if (!routes) {
+ routes = [];
+ }
+ routes?.push(routeTemplate);
+ return [...routes];
+ });
+ this.snackBar.open('Route Added', 'Dismiss', {
+ duration: 3000,
+ });
+ }
+}
diff --git a/src/app/route/route.component.html b/src/app/route/route.component.html
index 73313fb..02cdb5c 100644
--- a/src/app/route/route.component.html
+++ b/src/app/route/route.component.html
@@ -1,77 +1,76 @@
@if (route()) {
-
-
-
-
- close
-
+
+
+
+
Route {{ index() }}
+
+ close
+
+
+
+
@if (schemaService.processorTypes.length > 0) {
diff --git a/src/app/route/route.component.ts b/src/app/route/route.component.ts
index c863de6..bf70e47 100644
--- a/src/app/route/route.component.ts
+++ b/src/app/route/route.component.ts
@@ -8,6 +8,7 @@ import { SchemaService } from '../../services/schema.service';
import { JsonPipe } from '@angular/common';
import { ProcessorComponent } from '../processor/processor.component';
import { MatSnackBar } from '@angular/material/snack-bar';
+import { MatTooltipModule } from '@angular/material/tooltip';
@Component({
selector: 'app-route',
@@ -18,12 +19,24 @@ import { MatSnackBar } from '@angular/material/snack-bar';
MatMenuModule,
JsonPipe,
ProcessorComponent,
+ MatTooltipModule,
],
templateUrl: './route.component.html',
styleUrl: './route.component.css',
})
export class RouteComponent {
path = input('');
+
+ index = computed(() => {
+ const path = this.path();
+ if (path) {
+ const parts = path.split('/');
+ const lastPart = parts[parts.length - 1];
+ return parseInt(lastPart, 10);
+ }
+ return undefined;
+ });
+
route = model();
moduleIds = input([]);
delete = output();
@@ -85,6 +98,9 @@ export class RouteComponent {
}
return route;
});
+ this.snackBar.open('Processor Added', 'Dismiss', {
+ duration: 3000,
+ });
}
processorUpdated(index: number, processor: ProcessorConfiguration | undefined) {
diff --git a/src/services/schema.service.ts b/src/services/schema.service.ts
index df9c0d8..9f1dda6 100644
--- a/src/services/schema.service.ts
+++ b/src/services/schema.service.ts
@@ -225,12 +225,12 @@ export class SchemaService {
.filter((definition) => definition.properties?.type?.const !== undefined)
.map((definition) => {
return {
- name: definition['title'],
+ name: definition['title'] || definition.properties?.type?.const,
type: definition.properties?.type?.const,
schema: definition,
};
}),
- ['name'],
+ ['type'],
);
}
}
@@ -247,12 +247,12 @@ export class SchemaService {
.filter((definition) => definition.properties?.type?.const !== undefined)
.map((definition) => {
return {
- name: definition['title'],
+ name: definition['title'] || definition.properties?.type?.const,
type: definition.properties?.type?.const,
schema: definition,
};
}),
- ['name'],
+ ['type'],
);
}
}