Code Monkey home page Code Monkey logo

angular-modal-service's People

Contributors

ajoslin103 avatar akang avatar arthurxavierx avatar atefbb avatar cointilt avatar decherneyge avatar dougkeller avatar dryflyryan avatar dwmkerr avatar frknbasaran avatar greenkeeper[bot] avatar guardrails[bot] avatar joshvillbrandt avatar lexi-lambda avatar mattdesl avatar matteobarone avatar matuella avatar maxdow avatar nakamurabh avatar poporul avatar rumkin avatar samwx avatar smalbs avatar stormpooper avatar swbanks avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

angular-modal-service's Issues

Why is my modal dialog leaving shadow behind?

I followed the sample code and it is kind of working, except that the then() function doesn't get called when I dismiss the dialog. I'm not sure if this is related to the fact I'm also using AngularStrap in the project.

Compatibility issue with angular-google-places-autocomplete

Hi, I would like to create a modal view with an input suggesting places from google maps api.
Previously to do that I used the angular-google-places-autocomplete library (https://github.com/kuhnza/angular-google-places-autocomplete/), but now when I try to integrate it with the modal it does not work.

What I did is to modify the angularModularService in this way:

var module = angular.module('angularModalService', ['google.places']);

but it didn't worked.

Controller of the dialog should be called before the template directives' links

Your article clearly show an execution order:

var modalController = $controller(controller, inputs);  
var modalElementTemplate = angular.element(template);  
var linkFn = $compile(modalElementTemplate);  
var modalElement = linkFn(modalScope);  

which is confirmed by other - articles.
So far, so good... The code of your service, up to version 0.2.0, was doing that.

Commit bca78f1 broke that, wanting to allow injecting $element into the controller, so calling the controller after the link of directives in the template have been called.

This is apparently a violation of a fundamental rule of AngularJS, for a minor, not so much used feature... ๐Ÿ˜„

This bites me because I have a directive (from angular-selectize) which takes configuration data at link time, and then creates an instance of Selectize with this configuration. So, it is not a real double-binding and it cannot catch-up the configuration created too late when the controller is ran.

I imagine we can have similar issues with one-time binding (the new 1.3's :: annotation).

Honestly, I have no idea if there is a way to maintain the injection of $element while restoring the proper init order... At worst, you can add an option to the showModal() parameter object, telling $element must be injected, and thus calling the controller later.

Note: I use AngularJS 1.3.15.

Bootstrap dependency?

Hi,

thanks a lot for your this nice utitilty.

One question: What is the reason behind including a dependency to bootstrap in your bower.json? I actually don't see the need for this except the samples. I am using bootstrap-sass and as all bower dependencies get auto injected during the build of my project, I end up with 2 bootstrap versions.

Any suggestions? Much appreciated ;)

Cheers!

Add support for $templateCache

Some build methods preload templates into the template cache. Because of this, templates may never be available directly at their specified URL, so always using $http to get a template might fail.

$templateCache docs

Passing data to the model?

Hi ,

I want to pass the message to display in the model window? Do you have any samples of that? please let me know.

Bootstrap modal templates sometimes cause duplicate modal backdrops

I was using a template for my model that had the following root element:

<div class="modal fade">
 nested content
</div>

If my template included ANYTHING after the closing </div>, including comments, the modal spawned one additional <div class="modal-backdrop in"></div> per element. In testing,

In testing, I tried adding <div></div> after the closing div and TWO of the above extra backdrop classes were added.

The issue with the extra modal-backdrop classes is that they don't get removed from the DOM when the modal is closed, and so the user cannot interact with the UI any longer without refreshing, and of course, if there are any visual styles applied to the backdrop, such as the popular opacity effect, those too remain after closing the modal.

This may not be a problem with the angular-modal-service code, perhaps it is, or perhaps the jQuery selector is overly ambitious? I will look into it further, but post this here in case anyone else runs into this sneaky problem since comments following div tags are commonplace.

Angular 1.3

Currently the bower.json limits this module to the 1.2.x line. I have been testing it on 1.3.0-rc.4 for a while this morning and have not found any compatibility issues.

More of an informational than an issue, but hopefully useful information as this moves forward.

Can't always close modal window

I am getting this message "Scripts may close only the windows that were opened by it.", and I can only use the "Cancel" button to close a window. As far as I can tell I am set up exactly as it is in the sample. Even when I use the cancel button, I get the same message but the window does close. Strange...

scroll vanishes after close

Hi,

I am using a $timeout to automatically close a modal after 1000 milliseconds. But the scroll bar does not come back into action after this. If I close by clicking on the close button (or anywhere other than the modal) then the scroll bar comes back fine. I have tested this on safari and firefox (on OS X).

I am using the following controller:

app.controller('YesNoController', ['$scope', 'title', 'close', '$timeout', function($scope, title, close, $timeout) {

$scope.title = title;

$timeout( function(){ 
    close('yes', 500); // close, but give 500ms for bootstrap to animate
}, 1000);

$scope.close = function(result) {
close(result, 500); // close, but give 500ms for bootstrap to animate
};

}]);

Passing a controller constructor

In the current system, and if i understand it, to use a custom modal, you have to pass a controller already created :

app.controler("SomeController", function($scope, close) {
 $scope.dismissModal = function(result) {
    close(result, 200); 
 };
});
ModalService.showModal({
  templateUrl: "some/template.html",
  controller: "SomeController"
});

I can't find a way to do this without changing the code :

ModalService.showModal({
  templateUrl: "some/template.html",
  controller: function($scope, close) {
      $scope.dismissModal = function(result) {
         close(result, 200); 
      };
  }
});

Do you plan to add this feature ?

Need API to Close Modals

See comment at:

http://www.dwmkerr.com/the-only-angularjs-modal-service-youll-ever-need/#comment-1810738299

It would be useful to have an API such as:

modalService.closeModals();

which simply closes any open modals. A potential use case is in the application router, where changing a URL should not leave the modal open. Even better would be:

modalService.closeModals(someValue);

Which would close all the modals and resolve their close promises with the value someValue. This would allow application developers to decide whether they want to allow consumers of modals to be able to handle the cases where they are closed externally explicitly.

Getting an error: looking up elements via selectors is not supported

prevent close

hi, I want to decide when I close the modal, and that it is only the close button to close the modal, you can .

thank you

Massimo

Doesn't work well when using router

I am calling ModalService from a directive, which works well when on a particular route view. However, when I change the route to other view where the same directive exists, the ModelService fails to open.
Another issue I observed, when using ModalService in another service and called from any controller, again fails to open.

.modal-open still attached to body after modal is closed

Everytime I open a modal, .modal-open is still attached to the body of my page.
The overflow: hiddden property prevent me to slide my page after a modal is opened.

View:

<div class="modal fade">
  <div class="modal-dialog modal-sm">
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" ng-click="close(false)" data-dismiss="modal" aria-hidden="true">&times;</button>
        <h4 class="modal-title">{{params.title || 'Are you sure ?'}}</h4>
      </div>
      <div class="modal-body">
        <p>
          {{params.text || 'Really ?'}}
        </p>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-white" ng-click="close(false)" data-dismiss="modal">Close</button>
        <button type="button" class="btn btn-primary" ng-click="close(true)" data-dismiss="modal">Save changes</button>
      </div>
    </div>
  </div>
</div>

Controller:

angular.module('app')
  .controller('ConfirmModalCtrl', function ($scope, close, params) {
    $scope.params = params;

    $scope.close = function(res) {
      close(res, 200);
    };
  });

Call:

ModalService.showModal({
        templateUrl: 'views/modals/confirm.modal.view.html',
        controller: 'ConfirmModalCtrl',
        inputs: {
          params: {
            title: 'Are you sure ?',
            text: '... bla bla bla'
          }
        }
      }).then(function(modal) {
        modal.element.modal();
        modal.close.then(function(res) {
           console.log(res);
        });
      });

I have seriously no idea where it could come from.
I've already checked all dependencies and they are fine (bootstrap, angular, ModalService)

No examples for using appendElement?

Hi,

I'd like to see an example for using the appendElement in the call to showModal(). Could you add it to the examples? :-)

Cheers,
Allister

updateModal needed for transitions

Take your example:

ModalService.showModal({
  templateUrl: "some/template.html",
  controller: "SomeController"
}).then(function(modal) {
  // only called on success...
}).catch(function(error) {
  // error contains a detailed error message.
  console.log(error);
});

I would be nice to keep the modal open and update it. So, in the error handler, do something like this:

ModalService.showModal({
  templateUrl: "some/template.html",
  controller: "SomeController"
}).then(function(modal) {
  // only called on success...
}).catch(function(error) {
  ModalService.updateModal({
  templateUrl: "error/template.html",
  controller: "errorController"
}).then(function(modal) {
  modal.element.modal()
})
});

Modal $scope

I'm running into an issue with a modal's $scope. It looks like the modal's $scope is set to rootscope. I'm trying to use $emit to send an event from within the modal and the listener in my AppController never receives it. AppController is attached to the body.

What is the best way to handle this?

Associate EnterKey to default button like ok

I have the following form. i want to preceed with Ok action when enter key is pressed, but cannot get it to work. I have tried various option including jquery but non of it works.
How can i associate Enter Key to certain button like OK.

<div id="modalDialog" class="modal-dialog">
<div class="modal-header">
    <h2 style="text-align: center">{{modalOptions.headerText}}</h2>
</div>
<div class="modal-body">
    <p>{{modalOptions.bodyText}}</p>
</div>
<div class="modal-footer">
    <button type="button" class="btn" data-ng-click="modalOptions.close()">     {{modalOptions.closeButtonText}}</button>
    <button type="button" id="OK" class="btn btn-danger" ng-enter="modalOptions.ok();" autofocus data-ng-click="modalOptions.ok();" data-ng-keyup="$event.keycode == 13 && modaloptions.ok()">{{modalOptions.actionButtonText}}</button>
</div>
<script type="text/javascript"> $(document).ready(function () { console.log('Modal Template Loaded'); $('#OK').focus();
       $("#modalDialog").keydown(function (event) {
           console.log("Event mapped")
           if (event.keyCode == 13) {
               $(this).parent()
                      .find("button:eq(0)").trigger("click");
               return false;
           }
       });

   }); //document

</script>`

Proper modal cleanup with Bootstrap

I looked through the examples to see if there was already a documented way of properly cleaning up a modal that is dismissed when clicking outside the modal area. I didn't see anything and noticed there were many ng-click directives used to catch the modal closing.

Instead of attaching ng-click directives to all the elements and faking the animation time for the modal to disappear I used the events generated by bootstrap. I inserted this at the top of my controller to make sure the modal is properly cleaned up regardless of how it is closed and waits for the animation to finish. This handles clicking outside the modal to close, data-dismiss="modal", and $element.modal('hide').

$element.on('hidden.bs.modal', close)

I thought this might be useful documentation in the FAQ.

Is there a Bootstrap version dependency?

I cannot get this to work with the latest bootstrap CSS (v.3.3.4): The modal appears but remains somewhat faded and there is not control over it. It disappears with any click.
On the other hand when using the bootstrap CSS provided in the example code, everything is fine!

Any insight on this behavior?

Optional controller

Why controller option is required for showModal? Maybe make it optional for modals without controllers.

How do I remove the element?

In FAQ "I'm using a Bootstrap Modal and the backdrop doesn't fade away", it mentions: "It will try and make both elements into a modal. This means both elements will get a backdrop. In this case, either remove the extra elements, or find the specific element you need from the provided modal.element property."

I have a scenario where I want to force the user to take an action via a modal dialog. If the user does not take the action and reloads the page, it will open the dialog again with the result that the dialog cannot be closed properly.

How do I find the existing dialog element and remove it?

Publish to npm

@dwmkerr, it'd be really great if you can publish this to npm. Since you already have package.json, it is really easy. Here are the simple steps:

  1. cd to your local repo
  2. npm adduser (and enter your info/creds (don't worry if you don't have an account)... these are the same info/creds that will log you in to npmjs.com)
  3. npm publish

That's it! ๐Ÿ˜„
Demo video: https://docs.npmjs.com/getting-started/publishing-npm-packages

keyboard events are directed to background page

When a modal is open, and the page behind it is obscured

While you cannot click on anything on that page

You can still tab to move the tab-focus around on the page -- and hit spacebar/enter to trigger the highlighted item

How can i set the modal backdrop static?

Hello,

I am testing the modals and I don't know how to set backdrop to static like the boostrap modal.

Ej: ModalService.showModal({
templateUrl: "complex/complex.html",
controller: "ComplexController",
backdrop: 'static', <===================== here
inputs: {
title: "A More Complex Example"
}
}).then(function(modal) {
modal.element.modal();
modal.close.then(function(result) {
$scope.complexResult = "Name: " + result.name + ", age: " + result.age;
});
});

Thanks in advance.

Unknown provider: closeProvider <- close

Oddly enough, I've used angular-modal-service successfully in other projects, but haven't been able to pinpoint why this project is special. I'm not using bootstrap in any of the projects.

I'm getting this error using 0.3-0.5

Controller:

    .controller('SettingsCtrl', ['$scope', 'close', function ($scope, close) {
        $scope.close = function(result) {
            close(true);
        };

        $scope.cancel = function() {
            close();
        };
    }])

Launch point:

angular.module('settings',
    [
        'angularModalService'
    ])
.controller('CoreCtrl', ['$scope', '$window', 'ModalService',  function($scope, $window, ModalService){
        $scope.openSettingsDialog = function() {
            ModalService.showModal({
                templateUrl: 'markup/settings.html',
                controller: 'SettingsCtrl'
            }).then(function(modal){
                modal.close.then(function(result) {

                });
            });
        };
}])

Unit testing

Thank you for this great addition to angular, I love the flexibility and ease of use.

I am trying to write unit tests for a controller I'm using in a modal and cannot figure out how to inject the close provider into my tests since it looks like there's some angular magic going on. Any tips to help?

it('should implement close()', function () {
      inject(function ($controller, $rootScope) {
        var scope;

        scope = $rootScope.$new();
        $controller('TemplateController', { $scope: scope } );

        expect(angular.isFunction(scope.close)).toBeTruthy();
      });
    }); // should implement close()

The controller is as simple as:

TimelineControllers.controller('TemplateController', ['$scope', 'close', function($scope, close) {
    $scope.close = function () {
      close('i was closed');
    };
  }]);

Jquery dependency

Hi Dave,
Excellent tutorial on reusable modal windows.
However I've found some issues in your project.

  1. You said there are no dependencies however if I try to remove JQuery it is showing an error "TypeError: Cannot set property 'display' of undefined" -> How to resolve this?
  2. While displaying custom modal window, styling (CSS) of custom modal window is appearing in background -> Whats happening and how to resolve this?
    custommodalwindow
    It would be great if you could look into this and resolve the same.

modal() is undefined and modal template is appended to body

Code is entered exactly as the example and when the showAModal() function fires the modal template html is appended to the body while the console outputs this:

TypeError: undefined is not a functionwhich points to this line modal.element.modal();

Using Angular 1.3.0
Any insight is appreciated.

Code in the controller

            $scope.showAModal = function () {
                ModalService.showModal({
                    templateUrl: 'partials/cancel-membership.modal.html',
                    controller: 'ModalCtrl'
                }).then(function (modal) {

                    //it's a bootstrap element, use 'modal' to show it
                    modal.element.modal();
                    modal.close.then(function (result) {
                        console.log(result);
                    });
                });
            };

Sample for custom save button

Hi, is it possible to attach a sample with a 'save' button and showing where is the best place to call the save(record) methode and how to react on a cancel to restore the old values?

many thanks

Publish 0.6.6 onto NPM

The latest tag (0.6.6) isn't on NPM which includes the IE8 fix. Could someone publish it there?

Howto test the ModalController ?

Hi can you help me writing unit test for modal controllers ?

I tried but I'm not able to solve these errors:

  • Error: [$injector:unpr] Unknown provider: $elementProvider <- $element <- PartsEditmenudialogctrlCtrl
    Or
  • Error: [$injector:unpr] Unknown provider: closeProvider <- close <- PartsEditmenudialogctrlCtrl

PLease, can you add a controller test to your complexcontroller example ?

My interesting part of the test code is:

beforeEach(inject(function ($controller, $rootScope) {    
    scope = $rootScope.$new();
    PartsEditmenudialogctrlCtrl = $controller('PartsEditmenudialogctrlCtrl', {
      $scope: scope
    });

and for the controller

.controller('PartsEditmenudialogctrlCtrl', [ '$route', '$scope' , '$log', 'growl', 'MainMenuService', '$element', 'close', 'currMainMenuEditData', 
                                               function ($route, $scope, $log, growl, MainMenuService, $element, close, currMainMenuEditData) {

Thanks in advance
Stefano

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.