5.0.0 • Published 12 months ago

@kovalenko/has-unsaved-data v5.0.0

Weekly downloads
-
License
MIT
Repository
github
Last release
12 months ago

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

5.0.0

12 months ago

4.0.1

2 years ago

3.0.2

2 years ago

3.0.1

2 years ago

2.0.3

2 years ago

2.0.2

2 years ago

2.0.5

2 years ago

2.0.4

2 years ago

4.0.0

2 years ago

2.0.6

2 years ago

1.0.6

3 years ago

1.0.2

3 years ago

1.0.1

3 years ago