Skip to content

Commit d2797bf

Browse files
committed
feat: use conditional formatting for signal forms
1 parent 245e871 commit d2797bf

4 files changed

Lines changed: 38 additions & 4 deletions

File tree

src/app/app.config.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import {
44
provideAppInitializer,
55
provideBrowserGlobalErrorListeners,
66
} from '@angular/core';
7+
import { provideSignalFormsConfig } from '@angular/forms/signals';
8+
import { NG_STATUS_CLASSES } from '@angular/forms/signals/compat';
79
import { provideRouter, withComponentInputBinding } from '@angular/router';
810
import { provideHashbrown } from '@hashbrownai/angular';
911
import { provideMarkdown } from 'ngx-markdown';
@@ -16,6 +18,16 @@ export const appConfig: ApplicationConfig = {
1618
provideBrowserGlobalErrorListeners(),
1719
provideAppInitializer(() => inject(ConfigService).load()),
1820
// provideHttpClient(withInterceptors([authInterceptor])),
21+
provideSignalFormsConfig({
22+
// classes: {
23+
// 'ng-invalid': (field) => field.state().invalid(),
24+
// 'ng-valid': (field) => field.state().valid(),
25+
// 'ng-dirty': (field) => field.state().dirty(),
26+
// 'ng-pristine': (field) => !field.state().dirty(),
27+
// 'ng-pending': (field) => field.state().pending(),
28+
// },
29+
classes: NG_STATUS_CLASSES,
30+
}),
1931
provideRouter(routes, withComponentInputBinding()),
2032
provideHashbrown({
2133
baseUrl: 'http://localhost:3000/api/chat',

src/app/domains/shared/ui-forms/validation-errors/validation-errors-pane.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,11 @@ import {
44
computed,
55
input,
66
} from '@angular/core';
7-
import { MinValidationError, ValidationError } from '@angular/forms/signals';
7+
import {
8+
MinLengthValidationError,
9+
MinValidationError,
10+
ValidationError,
11+
} from '@angular/forms/signals';
812

913
@Component({
1014
selector: 'app-validation-errors-pane',
@@ -46,6 +50,8 @@ function toMessage(error: ValidationError): string {
4650
return 'Roundtrips are not supported!';
4751
case 'min':
4852
return `Minimum amount: ${(error as MinValidationError).min}`;
53+
case 'minLength':
54+
return `Please enter at least ${(error as MinLengthValidationError).minLength} characters!`;
4955
default:
5056
return error.kind ?? 'Validation Error';
5157
}

src/app/domains/ticketing/data/flight-schema.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ export const flightSchema = schema<Flight>((path) => {
3030
// validateStandardSchema(path, FlightZodSchema);
3131

3232
// disabled(path.delay, (ctx) => !ctx.valueOf(path.delayed));
33-
disabled(path.delay, (ctx) =>
34-
ctx.valueOf(path.delayed) ? false : 'not delayed',
35-
);
33+
disabled(path.delay, {
34+
when: (ctx) => (ctx.valueOf(path.delayed) ? false : 'not delayed'),
35+
});
3636

3737
applyWhenValue(path, (flight) => flight.delayed, delayedFlight);
3838

src/styles.css

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1200,3 +1200,19 @@ td.error-col app-validation-errors-pane {
12001200
transform: rotate(360deg);
12011201
}
12021202
}
1203+
1204+
/* ══════════════════════════════════════════
1205+
6. Signal Forms
1206+
══════════════════════════════════════════ */
1207+
1208+
input.ng-valid {
1209+
border-left: 3px solid darkseagreen;
1210+
}
1211+
1212+
input.ng-invalid.ng-dirty {
1213+
border-left: 3px solid var(--color-error);
1214+
}
1215+
1216+
input.ng-pending {
1217+
border-left: 3px solid var(--color-border);
1218+
}

0 commit comments

Comments
 (0)