angular-dirty-check

0.1.3 • Public • Published

angular-dirty-check

Prompt user on navigation if there are unsaved form changes. Works with ngRoute and ui-router.

See it

Here

Get it

from npm

npm install --save angular-dirty-check

from bower

bower install --save angular-dirty-check

and add it to your html file

<script src="/dist/angular-dirty-check.min.js"></script>

Use it

Add angular-dirty-check as dependency

var module = angular.module('yourApp', [
    'angularDirtyCheck'
]);
 

and make any <form> being watched for unsaved changes on navigation by adding the dirty-check directive

<form dirty-check class="well">
    <div class="form-group">
        <label for="magicnumber">Magic number</label>
        <input type="number" class="form-control" id="magicnumber" placeholder="Magic number" ng-model="model.magicnumber">
    </div>
    <a class="btn btn-default" href="#form1/testParam">Go to form 1 with params</a>
</form>

Customize it

By default a simple confirm(dirtyMsg) is shown to the user asking Changes you made may not be saved. Leave anyway?.

You can change the message with dirtyCheckServiceProvider.setDirtyMessage() like

 module.config(config);
 
config.$inject = ['dirtyCheckServiceProvider'];
function config(dirtyCheckServiceProvider) {
    dirtyCheckServiceProvider.setDirtyMessage('Wanna leave?');
}

or change the entire dialog being shown providing your own dirtyCheckDialog service that offers a show() function returning a thenable object. If the promise is fulfilled the navigation is executed, otherwise it's not and the user stays where he is.

Example using ngDialog (openConfirm() returns a promise)

var module = angular.module('yourApp', [
    'angularDirtyCheck',
    'ngDialog'
]);
 
module.service('dirtyCheckDialog', dirtyCheckDialog);
 
dirtyCheckDialog.$inject = ['ngDialog'];
function dirtyCheckDialog(ngDialog) {
    return {
        show: function () {
            return ngDialog.openConfirm({
                template: 'dialog.tpl.html'
            });
        }
    };
}

or $mdDialog from Angular Material ($mdDialog.show()returns a promise)

var module = angular.module('yourApp', [
    'angularDirtyCheck',
    'ngMaterial'
]);
 
module.service('dirtyCheckDialog', dirtyCheckDialog);
 
dirtyCheckDialog.$inject = ['$mdDialog'];
function dirtyCheckDialog($mdDialog) {
    return {
        show: function () {
            return $mdDialog.show({
                   templateUrl: 'dialog.tpl.html',
                   controller: ['$scope', '$mdDialog', function($scope, $mdDialog) {
                       $scope.stay = function () {
                           $mdDialog.cancel();
                       };
                       $scope.leave = function () {
                           $mdDialog.hide();
                       };
                   }]
            });
        }
    };
}

Build it

Get a clone and run

npm install
gulp build

The built file is located under ./dist.

To run the demo locally run

gulp demo

and navigate your browser to http://localhost:8080/dev_index.html. Source changes will trigger a refresh.

Package Sidebar

Install

npm i angular-dirty-check

Weekly Downloads

18

Version

0.1.3

License

MIT

Last publish

Collaborators

  • jonaszuberbuehler