@kovalenko/has-unsaved-data
TypeScript icon, indicating that this package has built-in type declarations

5.0.0 • Public • Published

HasUnsavedData

Provides a router guard preventing route deactivation, if the component`s method decorated with @CheckUnsavedData() returns true. Also it prevents the window to be unloaded.

Installation

npm i @kovalenko/has-unsaved-data

First, import the HasUnsavedDataModule to your module:

import {NgModule} from '@angular/core';
import {BrowserModule} from '@angular/platform-browser';
import {HasUnsavedDataModule, HasUnsavedDataConfirmService, UnsavedDataConfig, UNSAVED_DATA_CONFIG} from '@kovalenko/has-unsaved-data';
import {platformBrowserDynamic} from '@angular/platform-browser-dynamic';
import {AppComponent} from './app';

@NgModule({
  imports: [
    BrowserModule,
    HasUnsavedDataModule.config({
      confirmService: {
        provide: HasUnsavedDataConfirmService,
        useExisting: ConfirmService, // your favorite confirm service 
      },
      title: 'Default confirm title', // optional
      message: 'Default message', // optional
      ok: 'Default ok button', // optional
      cancel: 'Default cancel button', // optional
    })
  ],
  declarations: [AppComponent],
  bootstrap: [AppComponent],
})
export class AppModule {
  // Optionally change default UnsavedDataConfig in runtime
  constructor(
    @Inject(UNSAVED_DATA_CONFIG) private config: UnsavedDataConfig
  ) {
    setTimeout(() => {
      config.cancel = 'CANCEL';
      config.ok = 'OKAY';
    }, 1000);
  }
}

platformBrowserDynamic().bootstrapModule(AppModule);

Then, import HasUnsavedDataGuard to your routing module:

import {NgModule} from '@angular/core';
import {Routes, RouterModule} from '@angular/router';
import {ProfilePageComponent} from './profile-page/profile-page.component';
import {hasUnsavedDataGuard} from '@kovalenko/has-unsaved-data';


const routes: Routes = [
  {
    path: 'profile',
    component: ProfilePageComponent,
    canDeactivate: [hasUnsavedDataGuard]
  },
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class ProfileRoutingModule { }

Finally, decorate your component`s method with @CheckUnsavedData():

import {CheckUnsavedData} from '@kovalenko/has-unsaved-data';
import {ViewChild} from '@angular/core';
import {NgForm} from '@angular/forms';

@Component({
  selector: 'app',
  template: `
    <form #form="ngForm">
    </form>
  `,
  styleUrls: ['./profile-page.component.scss']
})
export class ProfilePageComponent {
  @ViewChild('form') form: NgForm;

  @CheckUnsavedData()
  hasUnsavedData(): boolean {
    return this.form.dirty;
  }
}

Optionally override defaults:

import {CheckUnsavedData} from '@kovalenko/has-unsaved-data';
import {ViewChild} from '@angular/core';
import {NgForm} from '@angular/forms';
import {TranslateService} from '@ngx-translate/core';

@Component({
  selector: 'app',
  template: `
    <form #form="ngForm">
    </form>
  `,
  styleUrls: ['./profile-page.component.scss']
})
export class ProfilePageComponent {
  @ViewChild('form') form: NgForm;

  constructor(private translate: TranslateService) { }

  @CheckUnsavedData<ProfilePageComponent>(o => ({
    message: o.translate.instant('Custom confirmation message')
  }))
  hasUnsavedData(): boolean {
    return this.form.dirty;
  }

}

License

MIT

Readme

Keywords

Package Sidebar

Install

npm i @kovalenko/has-unsaved-data

Weekly Downloads

1

Version

5.0.0

License

MIT

Unpacked Size

46.7 kB

Total Files

24

Last publish

Collaborators

  • kovalenko