@@ -83,12 +83,65 @@ var fng;
83
83
/*@ngInject */
84
84
function NavCtrl ( $scope , $data , $location , $filter , $controller , routingService , cssFrameworkService ) {
85
85
$scope . items = [ ] ;
86
+ /* isCollapsed and showShortcuts are used to control how the menu is displayed in a responsive environment and whether the shortcut keystrokes help should be displayed */
86
87
$scope . isCollapsed = true ;
88
+ $scope . showShortcuts = false ;
89
+ $scope . shortcuts = [
90
+ { key : '?' , act : 'Show shortcuts' } ,
91
+ { key : '/' , act : 'Jump to search' } ,
92
+ { key : 'Ctrl+Shift+S' , act : 'Save the current record' } ,
93
+ { key : 'Ctrl+Shift+Esc' , act : 'Cancel changes on the current record' } ,
94
+ { key : 'Ctrl+Shift+Ins' , act : 'Create a new record' } ,
95
+ { key : 'Ctrl+Shift+X' , act : 'Delete the current record' }
96
+ ] ;
97
+ $scope . markupShortcut = function ( keys ) {
98
+ return '<span class="key">' + keys . split ( '+' ) . join ( '</span><span class="key">' ) + '</span>' ;
99
+ } ;
87
100
$scope . globalShortcuts = function ( event ) {
88
- if ( event . keyCode === 191 && event . ctrlKey ) {
89
- // Ctrl+/ takes you to global search
90
- document . getElementById ( 'searchinput' ) . focus ( ) ;
91
- event . preventDefault ( ) ;
101
+ function deferredBtnClick ( id ) {
102
+ var btn = document . getElementById ( id ) ;
103
+ if ( btn ) {
104
+ if ( ! btn . disabled ) {
105
+ setTimeout ( function ( ) {
106
+ btn . click ( ) ;
107
+ } ) ;
108
+ }
109
+ event . preventDefault ( ) ;
110
+ }
111
+ }
112
+ function filter ( event ) {
113
+ var tagName = ( event . target || event . srcElement ) . tagName ;
114
+ return ! ( tagName == 'INPUT' || tagName == 'SELECT' || tagName == 'TEXTAREA' ) ;
115
+ }
116
+ //console.log(event.keyCode, event.ctrlKey, event.shiftKey, event.altKey, event.metaKey);
117
+ if ( event . keyCode === 191 && ( filter ( event ) || ( ! event . altKey && ! event . metaKey ) ) ) {
118
+ if ( event . ctrlKey || ! event . shiftKey ) {
119
+ var searchInput = document . getElementById ( 'searchinput' ) ;
120
+ if ( searchInput ) {
121
+ searchInput . focus ( ) ;
122
+ event . preventDefault ( ) ;
123
+ }
124
+ }
125
+ else {
126
+ $scope . showShortcuts = true ;
127
+ }
128
+ }
129
+ else if ( event . keyCode === 83 && event . ctrlKey && event . shiftKey && ! event . altKey && ! event . metaKey ) {
130
+ deferredBtnClick ( 'saveButton' ) ; // Ctrl+Shift+S saves changes
131
+ }
132
+ else if ( event . keyCode === 27 && ( ( event . ctrlKey && event . shiftKey && ! event . altKey && ! event . metaKey ) || $scope . showShortcuts ) ) {
133
+ if ( event . ctrlKey && event . shiftKey && ! event . altKey && ! event . metaKey ) {
134
+ deferredBtnClick ( 'cancelButton' ) ; // Ctrl+Shift+Esc cancels updates
135
+ }
136
+ else {
137
+ $scope . showShortcuts = false ;
138
+ }
139
+ }
140
+ else if ( event . keyCode === 45 && event . ctrlKey && event . shiftKey && ! event . altKey && ! event . metaKey ) {
141
+ deferredBtnClick ( 'newButton' ) ; // Ctrl+Shift+Ins creates New record
142
+ }
143
+ else if ( event . keyCode === 88 && event . ctrlKey && event . shiftKey && event . altKey && ! event . metaKey ) {
144
+ deferredBtnClick ( 'deleteButton' ) ; // Ctrl+Shift+X deletes record
92
145
}
93
146
} ;
94
147
$scope . css = function ( fn , arg ) {
@@ -3677,5 +3730,5 @@ var formsAngular = fng.formsAngular;
3677
3730
angular . module ( "formsAngular" ) . run ( [ "$templateCache" , function ( $templateCache ) { $templateCache . put ( "error-messages.html" , "<div ng-message=\"required\">A value is required for this field</div>\n<div ng-message=\"minlength\">Too few characters entered</div>\n<div ng-message=\"maxlength\">Too many characters entered</div>\n<div ng-message=\"min\">That value is too small</div>\n<div ng-message=\"max\">That value is too large</div>\n<div ng-message=\"email\">You need to enter a valid email address</div>\n<div ng-message=\"pattern\">This field does not match the expected pattern</div>\n" ) ;
3678
3731
$templateCache . put ( "form-button-bs2.html" , "<div class=\"form-btn-grp\">\n <div class=\"btn-group pull-right\">\n <button id=\"saveButton\" class=\"btn btn-mini btn-primary form-btn\" ng-click=\"save()\" ng-disabled=\"isSaveDisabled()\"><i class=\"icon-ok\"></i> Save</button>\n <button id=\"cancelButton\" class=\"btn btn-mini btn-warning form-btn\" ng-click=\"cancel()\" ng-disabled=\"isCancelDisabled()\"><i class=\"icon-remove\"></i> Cancel</button>\n </div>\n <div class=\"btn-group pull-right\">\n <button id=\"newButton\" class=\"btn btn-mini btn-success form-btn\" ng-click=\"newClick()\" ng-disabled=\"isNewDisabled()\"><i class=\"icon-plus\"></i> New</button>\n <button id=\"deleteButton\" class=\"btn btn-mini btn-danger form-btn\" ng-click=\"deleteClick()\" ng-disabled=\"isDeleteDisabled()\"><i class=\"icon-minus\"></i> Delete</button>\n </div>\n</div>\n" ) ;
3679
3732
$templateCache . put ( "form-button-bs3.html" , "<div class=\"form-btn-grp\">\n <div class=\"btn-group pull-right\">\n <button id=\"saveButton\" class=\"btn btn-primary form-btn btn-xs\" ng-click=\"save()\" ng-disabled=\"isSaveDisabled()\"><i class=\"glyphicon glyphicon-ok\"></i> Save</button>\n <button id=\"cancelButton\" class=\"btn btn-warning form-btn btn-xs\" ng-click=\"cancel()\" ng-disabled=\"isCancelDisabled()\"><i class=\"glyphicon glyphicon-remove\"></i> Cancel</button>\n </div>\n <div class=\"btn-group pull-right\">\n <button id=\"newButton\" class=\"btn btn-success form-btn btn-xs\" ng-click=\"newClick()\" ng-disabled=\"isNewDisabled()\"><i class=\"glyphicon glyphicon-plus\"></i> New</button>\n <button id=\"deleteButton\" class=\"btn btn-danger form-btn btn-xs\" ng-click=\"deleteClick()\" ng-disabled=\"isDeleteDisabled()\"><i class=\"glyphicon glyphicon-minus\"></i> Delete</button>\n </div>\n</div>\n" ) ;
3680
- $templateCache . put ( "search-bs2.html" , "<form class=\"navbar-search pull-right\">\n <div id=\"search-cg\" class=\"control-group\" ng-class=\"errorClass\">\n <input type=\"text\" autocomplete=\"off\" id=\"searchinput\" ng-model=\"searchTarget\" class=\"search-query\" placeholder=\"{{searchPlaceholder}}\" ng-keyup=\"handleKey($event)\">\n </div>\n</form>\n<div class=\"results-container\" ng-show=\"results.length >= 1\">\n <div class=\"search-results\">\n <div ng-repeat=\"result in results\">\n <span ng-class=\"resultClass($index)\" ng-click=\"selectResult($index)\">{{result.resourceText}} {{result.text}}</span>\n </div>\n <div ng-show=\"moreCount > 0\">(plus more - continue typing to narrow down search...)\n </div>\n </div>\n</div>\n" ) ;
3681
- $templateCache . put ( "search-bs3.html" , "<form class=\"pull-right navbar-form\">\n <div id=\"search-cg\" class=\"form-group\" ng-class=\"errorClass\">\n <input type=\"text\" autocomplete=\"off\" id=\"searchinput\" ng-model=\"searchTarget\" class=\"search-query form-control\" placeholder=\"{{searchPlaceholder}}\" ng-keyup=\"handleKey($event)\">\n </div>\n</form>\n<div class=\"results-container\" ng-show=\"results.length >= 1\">\n <div class=\"search-results\">\n <div ng-repeat=\"result in results\">\n <span ng-class=\"resultClass($index)\" ng-click=\"selectResult($index)\" title={{result.additional}}>{{result.resourceText}} {{result.text}}</span>\n </div>\n <div ng-show=\"moreCount > 0\">(plus more - continue typing to narrow down search...)\n </div>\n </div>\n</div>\n" ) ; } ] ) ;
3733
+ $templateCache . put ( "search-bs2.html" , "<form class=\"navbar-search pull-right\">\n <div id=\"search-cg\" class=\"control-group\" ng-class=\"errorClass\">\n <input type=\"text\" autocomplete=\"off\" id=\"searchinput\" ng-model=\"searchTarget\" ng-model-options=\"{debounce:250}\" class=\"search-query\" placeholder=\"{{searchPlaceholder}}\" ng-keyup=\"handleKey($event)\">\n </div>\n</form>\n<div class=\"results-container\" ng-show=\"results.length >= 1\">\n <div class=\"search-results\">\n <div ng-repeat=\"result in results\">\n <span ng-class=\"resultClass($index)\" ng-click=\"selectResult($index)\">{{result.resourceText}} {{result.text}}</span>\n </div>\n <div ng-show=\"moreCount > 0\">(plus more - continue typing to narrow down search...)\n </div>\n </div>\n</div>\n" ) ;
3734
+ $templateCache . put ( "search-bs3.html" , "<form class=\"pull-right navbar-form\">\n <div id=\"search-cg\" class=\"form-group\" ng-class=\"errorClass\">\n <input type=\"text\" autocomplete=\"off\" id=\"searchinput\" ng-model=\"searchTarget\" ng-model-options=\"{debounce:250}\" class=\"search-query form-control\" placeholder=\"{{searchPlaceholder}}\" ng-keyup=\"handleKey($event)\">\n </div>\n</form>\n<div class=\"results-container\" ng-show=\"results.length >= 1\">\n <div class=\"search-results\">\n <div ng-repeat=\"result in results\">\n <span ng-class=\"resultClass($index)\" ng-click=\"selectResult($index)\" title={{result.additional}}>{{result.resourceText}} {{result.text}}</span>\n </div>\n <div ng-show=\"moreCount > 0\">(plus more - continue typing to narrow down search...)\n </div>\n </div>\n</div>\n" ) ; } ] ) ;
0 commit comments