File
Extends
Implements
Index
Properties
|
|
|
Methods
|
|
|
Inputs
|
|
|
Constructor
constructor(formDirective: FormDirective, router: Router | null)
|
|
|
Parameters :
| Name |
Type |
Optional |
| formDirective |
FormDirective
|
No
|
| router |
Router | null
|
No
|
|
|
disableWhileSubmitting
|
Default value : true
|
|
|
Methods
|
Protected
execute
|
execute()
|
|
|
|
|
|
Public
afterSubmit
|
Default value : output<any>()
|
|
|
|
disabled
|
Default value : computed(() => this.disableWhileSubmitting() && this.submitting())
|
|
|
|
disableWhileSubmitting
|
Default value : true
|
|
|
|
Public
navigateAfterSubmit
|
Default value : input<string[]>()
|
|
|
|
resetAfterSubmit
|
Default value : input<boolean | '', boolean>(false, { transform: coerceBoolean })
|
|
|
|
submitting
|
Default value : toSignal(this.formDirective.submitting$, { initialValue: false })
|
|
|
|
Public
type
|
Default value : input<'button' | 'submit' | 'reset'>('button')
|
|
|
import {
computed,
Directive,
Inject,
input,
OnDestroy,
Optional,
output,
} from '@angular/core';
import { toSignal } from '@angular/core/rxjs-interop';
import { Router } from '@angular/router';
import { ConfirmClick } from '@rxap/directives';
import {
clone,
coerceBoolean,
} from '@rxap/utilities';
import { Subscription } from 'rxjs';
import {
take,
tap,
} from 'rxjs/operators';
import { FormDirective } from './form.directive';
@Directive({
selector: '[rxapFormSubmit]',
host: {
'(click)': 'onClick()',
'(confirmed)': 'onConfirm()',
'[disabled]': 'disabled()',
'[type]': 'type()',
},
standalone: true,
exportAs: 'rxapFormSubmit',
})
export class FormSubmitDirective extends ConfirmClick implements OnDestroy {
public type = input<'button' | 'submit' | 'reset'>('button');
resetAfterSubmit = input<boolean | '', boolean>(false, { transform: coerceBoolean });
public navigateAfterSubmit = input<string[]>();
public afterSubmit = output<any>();
disableWhileSubmitting = input(true);
submitting = toSignal(this.formDirective.submitting$, { initialValue: false });
disabled = computed(() => this.disableWhileSubmitting() && this.submitting())
private subscription?: Subscription;
constructor(
@Inject(FormDirective) private readonly formDirective: FormDirective,
@Optional()
@Inject(Router)
private readonly router: Router | null = null,
) {
super();
}
protected execute() {
this.formDirective.form.markAllAsDirty();
this.formDirective.form.markAllAsTouched();
this.formDirective.cdr.markForCheck();
this.subscription = this.formDirective.rxapSubmit.pipe(
take(1),
tap(value => {
const clonedValue = clone(value);
this.afterSubmit.emit(clonedValue);
if (this.resetAfterSubmit()) {
this.formDirective.reset();
}
const navigateAfterSubmit = this.navigateAfterSubmit();
if (Array.isArray(navigateAfterSubmit)) {
if (!this.router) {
throw new Error('Could not resolve the router!');
}
return this.router.navigate(navigateAfterSubmit);
}
return Promise.resolve();
}),
).subscribe();
this.formDirective.onSubmit(new Event('submit'));
}
public ngOnDestroy() {
this.subscription?.unsubscribe();
}
}