mirror of
https://github.com/bitwarden/browser
synced 2024-12-29 11:22:30 +01:00
bb4f063fe7
* [EC-556] feat: convert button into component * [EC-556] feat: implement loading state * [EC-556] feat: remove loading from submit button * [EC-556] fix: add missing import * [EC-556] fix: disabling button using regular attribute * [EC-556] feat: implement bitFormButton * [EC-556] feat: use bitFormButton in submit button * [EC-556] fix: missing import * [EC-558] chore: rename file to match class name * [EC-558] feat: allow skipping bitButton on form buttons * [EC-558]: only show spinner on submit button * [EC-558] feat: add new bit async directive * [EC-558] feat: add functionToObservable util * [EC-558] feat: implement bitAction directive * [EC-558] refactor: simplify bitSubmit using functionToObservable * [EC-558] feat: connect bit action with form button * [EC-558] feat: execute function immediately to allow for form validation * [EC-558] feat: disable form on loading * [EC-558] chore: remove duplicate types * [EC-558] feat: move validation service to common * [EC-558] feat: add error handling using validation service * [EC-558] feat: add support for icon button * [EC-558] fix: icon button hover border styles * [EC-558] chore: refactor icon button story to show all styles * [EC-558] fix: better align loading spinner to middle * [EC-558] fix: simplify try catch * [EC-558] chore: reorganize async actions * [EC-558] chore: rename stories * [EC-558] docs: add documentation * [EC-558] feat: decouple buttons and form buttons * [EC-558] chore: rename button like abstraction * [EC-558] chore: remove null check * [EC-558] docs: add jsdocs to directives * [EC-558] fix: switch abs imports to relative * [EC-558] chore: add async actions module to web shared module * [EC-558] chore: remove unecessary null check * [EC-558] chore: apply suggestions from code review Co-authored-by: Oscar Hinton <Hinton@users.noreply.github.com> * [EC-558] fix: whitespaces * [EC-558] feat: dont disable form by default * [EC-558] fix: bug where form could be submit during a previous submit * [EC-558] feat: remove ability to disable form Co-authored-by: Oscar Hinton <Hinton@users.noreply.github.com>
59 lines
1.8 KiB
TypeScript
59 lines
1.8 KiB
TypeScript
import { Directive, Input, OnDestroy, Optional } from "@angular/core";
|
|
import { Subject, takeUntil } from "rxjs";
|
|
|
|
import { ButtonLikeAbstraction } from "../shared/button-like.abstraction";
|
|
|
|
import { BitSubmitDirective } from "./bit-submit.directive";
|
|
|
|
import { BitActionDirective } from ".";
|
|
|
|
/**
|
|
* This directive has two purposes:
|
|
*
|
|
* When attached to a submit button:
|
|
* - Activates the button loading effect while the form is processing an async submit action.
|
|
* - Disables the button while a `bitAction` directive on another button is being processed.
|
|
*
|
|
* When attached to a standalone button with `bitAction` directive:
|
|
* - Disables the form while the `bitAction` directive is processing an async submit action.
|
|
*/
|
|
@Directive({
|
|
selector: "button[bitFormButton]",
|
|
})
|
|
export class BitFormButtonDirective implements OnDestroy {
|
|
private destroy$ = new Subject<void>();
|
|
|
|
@Input() type: string;
|
|
|
|
constructor(
|
|
buttonComponent: ButtonLikeAbstraction,
|
|
@Optional() submitDirective?: BitSubmitDirective,
|
|
@Optional() actionDirective?: BitActionDirective
|
|
) {
|
|
if (submitDirective && buttonComponent) {
|
|
submitDirective.loading$.pipe(takeUntil(this.destroy$)).subscribe((loading) => {
|
|
if (this.type === "submit") {
|
|
buttonComponent.loading = loading;
|
|
} else {
|
|
buttonComponent.disabled = loading;
|
|
}
|
|
});
|
|
|
|
submitDirective.disabled$.pipe(takeUntil(this.destroy$)).subscribe((disabled) => {
|
|
buttonComponent.disabled = disabled;
|
|
});
|
|
}
|
|
|
|
if (submitDirective && actionDirective) {
|
|
actionDirective.loading$.pipe(takeUntil(this.destroy$)).subscribe((disabled) => {
|
|
submitDirective.disabled = disabled;
|
|
});
|
|
}
|
|
}
|
|
|
|
ngOnDestroy(): void {
|
|
this.destroy$.next();
|
|
this.destroy$.complete();
|
|
}
|
|
}
|