Angular Modal dialogs
We like the ngDialog plugin, which makes nice-looking dialogs, and they're quite easy to do. We have included styling for it in the uicommons module under the default theme (ngdialog-theme-default).
Usage example, for a Confirm dialog:
GSP view using a dialog
<%
ui.includeJavascript("uicommons", "angular.js")
ui.includeJavascript("uicommons", "ngDialog/ngDialog.js")
ui.includeCss("uicommons", "ngDialog/ngDialog.min.css")
// you also need to have included referenceapplication.css or similar, which usually happens globally through the distribution
// also include your page's js
%>
<div id="your-page-app" ng-controller="YourPageCtrl">
<script type="text/ng-template" id="dialogTemplate">
<div class="dialog-header">
<h3>Doing something</h3>
</div>
<div class="dialog-content">
<div>
Why? <input type="text" ng-model="reason"/>
{{ ngDialogData.helperData }}
</div>
<div>
<button class="confirm right" ng-click="confirm(reason)">${ ui.message("uicommons.save") }</button>
<button class="cancel" ng-click="closeThisDialog()">${ ui.message("uicommons.cancel") }</button>
</div>
</div>
</script>
<a ng-click="showDialog()">
<i class="icon-plus-sign"></i>
Show dialog
</a>
</div>
<script type="text/javascript">
// manually bootstrap angular app, in case there are multiple angular apps on a page
angular.bootstrap('#your-page-app', ['yourpageapp']);
</script>
The JavaScript backing this is:
angular.module('yourpageapp', ['ngDialog']). // make sure to declare a dependency on ngDialog in your app
controller('YourPageCtrl', ['$scope', 'ngDialog',
function($scope, ngDialog) {
$scope.showDialog = function() {
ngDialog.openConfirm({
showClose: false,
closeByEscape: true,
closeByDocument: true,
data: angular.toJson({
helperData: "One way to push data into the dialog"
}),
template: 'dialogTemplate' // in this example we defined this inline with <script type="ng-template"> but you can also give a url
}).then(function(reason) {
console.log("They chose reason: " + reason);
}, function() {
console.log("They clicked cancel");
});
};
}]);
Advanced
There are a several different ways to pass data into the dialog from the enclosing controller, each of which you might use at different times:
Using "data"
Pro: Cleaner JavaScript code.
Con: Annoying need to refer to "ngDialogData" in the view. Could be expensive for a huge data model.
Pushing data into the dialog with 'data'
confirmDeleteRelationship = function(rel) {
ngDialog.openConfirm({
data: angular.toJson({
relationship: rel
})
template: "..."
});
}
// in the view you can do something like this:
// {{ ngDialogData.relationship.personA }} is related
// via {{ ngDialogData.relationship.relationshipType.display }}
// to {{ ngDialogData.relationship.personB }}
Using "scope"
Pro: Cleaner view code. More control and power.
Con: Non-obvious boilerplate JavaScript
Pushing data into the dialog with a custom scope
Using a controller
Pro: this is the best (I hadn't tried it yet when I wrote all the above)
It works something like this (I haven't actually tested this code)