ngx-promise-buttons is a simple module that let's you add a loading indicator to a button of your choice. Check out the demo!
Bug-reports or feature request as well as any other kind of feedback is highly welcome!
Install it via npm:
npm install ngx-promise-buttons -S
Add it to your app using bootstrapApplication:
bootstrapApplication(AppComponent, {
providers: [
provideNgxPromiseButtons({ handleCurrentBtnOnly: true }),
],
});Using the buttons is easy. Just pass a promise to the directive:
<button (click)="someAction()"
[promiseBtn]="promiseSetBySomeAction">Click me to spin!</button>export class SomeComponent {
// some example async action, but this works with any promise
someAction(){
this.promiseSetBySomeAction = new Promise((resolve, reject) => {
setTimeout(resolve, 2000);
});
}
}To give you maximum flexibility there are no base styles coming with the directive, but it is easy to fix that! There are lots of free css-spinners out there. Just find one of your liking and add the css to your global stylesheet.
Ressources:
There are selectors you can use to style. There is the .is-loading class on the button, which is set, when the promise is pending and there is the <span class="btn-spinner"></span> element inside the button.
You can pass a config object to provideNgxPromiseButtons:
provideNgxPromiseButtons({
spinnerTpl: '<span class="btn-spinner"></span>',
disableBtn: true,
btnLoadingClass: 'is-loading',
handleCurrentBtnOnly: false,
});When you're using the module with observables make sure to pass a subscription to the directive rather than an observable directly.
const FAKE_FACTORY = {
initObservable: (): Observable<number> => {
return new Observable(observer => {
setTimeout(() => {
observer.complete();
}, 4000);
});
}
};
// DO:
const observable = FAKE_FACTORY.initObservable();
this.passedToDirective = observable.subscribe(
// ...
);
// DON'T DO:
const observable = FAKE_FACTORY.initObservable();
this.passedToDirective = observable;Is now also possible.
<button (click)="someAction()"
[promiseBtn]="isShowBoolean">Click!</button>Contribution guidelines: CONTRIBUTING.md
