Commit 4431c2c8d85175f546d6785d9343da9227725477
1 parent
9cd8fd0b88
Exists in
master
Cambios según codereview.
Showing
1 changed file
with
23 additions
and
14 deletions
Show diff stats
src/js/angular-on-screen-keyboard-directive.js
1 | angular.module('onScreenKeyboard', ['ngSanitize']) | 1 | angular.module('onScreenKeyboard', ['ngSanitize']) |
2 | .directive('onScreenKeyboard', ['$timeout', '$document', function($timeout, $document) { | 2 | .directive('onScreenKeyboard', ['$timeout', '$document', function($timeout, $document) { |
3 | return { | 3 | return { |
4 | restrict: 'E', | 4 | restrict: 'E', |
5 | bindToController: true, | 5 | bindToController: true, |
6 | controllerAs: 'ctrl', | 6 | controllerAs: 'ctrl', |
7 | scope: { | 7 | scope: { |
8 | rows : '=?', | 8 | rows : '=?', |
9 | uppercaseAllWords : '@', | 9 | uppercaseAllWords : '@', |
10 | alfanumeric : '=?', | 10 | alfanumeric : '=?', |
11 | numeric : '=?' | 11 | numeric : '=?' |
12 | }, | 12 | }, |
13 | controller: ['$sce', '$scope', function($sce, $scope) { | 13 | controller: ['$sce', '$scope', function($sce, $scope) { |
14 | var ctrl = this; | 14 | var ctrl = this; |
15 | 15 | ||
16 | if (!ctrl.rows) { | 16 | if (!ctrl.rows) { |
17 | ctrl.rows = [ | 17 | ctrl.rows = [ |
18 | ['1', '2', '3','4','5','6','7','8', '9', '0', { | 18 | ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0', { |
19 | type: 'erase', colspan: 2, text: '⇐' | 19 | type: 'erase', colspan: 2, text: '⇐' |
20 | }], | 20 | }], |
21 | ['q','w','e','r','t','y','u','i','o','p','@'], | 21 | ['q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '@'], |
22 | ['a','s','d','f','g','h','j','k','l','-','_', {type: 'margin'}], | 22 | ['a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', '-', '_', {type: 'margin'}], |
23 | [ | 23 | [ |
24 | {type: 'shift', upperCase: '⇓', lowerCase: '⇑'}, | 24 | {type: 'shift', upperCase: '⇓', lowerCase: '⇑'}, |
25 | 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', | 25 | 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', |
26 | {type: 'shift', upperCase: '⇓', lowerCase: '⇑'} | 26 | {type: 'shift', upperCase: '⇓', lowerCase: '⇑'} |
27 | ], | 27 | ], |
28 | [{type: 'margin'}, {type: 'space', colspan: 9, text: ' '}] | 28 | [{type: 'margin'}, {type: 'space', colspan: 9, text: ' '}] |
29 | ]; | 29 | ]; |
30 | } | 30 | } |
31 | 31 | ||
32 | ctrl.getText = function(key) { | 32 | ctrl.getText = function(key) { |
33 | if (key.type === 'margin') | 33 | if (key.type === 'margin') { |
34 | return ''; | 34 | return ''; |
35 | } | ||
35 | 36 | ||
36 | var val = ''; | 37 | var val = ''; |
37 | 38 | ||
38 | if (key.text) | 39 | if (key.text) { |
39 | val = key.text; | 40 | val = key.text; |
40 | else if (key.lowerCase && !ctrl.isUpperCase) | 41 | } |
42 | else if (key.lowerCase && !ctrl.isUpperCase) { | ||
41 | val = key.lowerCase; | 43 | val = key.lowerCase; |
42 | else if (key.upperCase && ctrl.isUpperCase) | 44 | } |
45 | else if (key.upperCase && ctrl.isUpperCase) { | ||
43 | val = key.upperCase; | 46 | val = key.upperCase; |
47 | } | ||
44 | else { | 48 | else { |
45 | val = ctrl.isUpperCase ? key.toUpperCase() : key.toLowerCase(); | 49 | val = ctrl.isUpperCase ? key.toUpperCase() : key.toLowerCase(); |
46 | } | 50 | } |
47 | 51 | ||
48 | if (val && val.indexOf('&') > -1) | 52 | if (val && val.indexOf('&') > -1) { |
49 | return $sce.trustAsHtml(val); | 53 | return $sce.trustAsHtml(val); |
54 | } | ||
50 | 55 | ||
51 | return val; | 56 | return val; |
52 | }; | 57 | }; |
53 | $scope.fondo = function() { | 58 | $scope.fondo = function() { |
54 | $timeout(function() { | 59 | $timeout(function() { |
55 | ctrl.lastInputCtrl.focus(); | 60 | ctrl.lastInputCtrl.focus(); |
56 | $scope.$emit('focus'); | 61 | $scope.$emit('focus'); |
57 | }); | 62 | }); |
58 | }; | 63 | }; |
59 | }], | 64 | }], |
60 | link: function(scope, element, attr) { | 65 | link: function(scope, element, attr) { |
61 | var ctrl = scope.ctrl; | 66 | var ctrl = scope.ctrl; |
62 | ctrl.isUpperCase = false; | 67 | ctrl.isUpperCase = false; |
63 | ctrl.lastInputCtrl = null; | 68 | ctrl.lastInputCtrl = null; |
64 | ctrl.startPos = null; | 69 | ctrl.startPos = null; |
65 | ctrl.endPos = null; | 70 | ctrl.endPos = null; |
66 | 71 | ||
67 | ctrl.printKeyStroke = function(key, event) { | 72 | ctrl.printKeyStroke = function(key, event) { |
68 | 73 | ||
69 | if (!ctrl.lastInputCtrl) | 74 | if (!ctrl.lastInputCtrl) { |
70 | return; | 75 | return; |
76 | } | ||
71 | 77 | ||
72 | ctrl.startPos = ctrl.lastInputCtrl.selectionStart; | 78 | ctrl.startPos = ctrl.lastInputCtrl.selectionStart; |
73 | ctrl.endPos = ctrl.lastInputCtrl.selectionEnd; | 79 | ctrl.endPos = ctrl.lastInputCtrl.selectionEnd; |
74 | 80 | ||
75 | if (key.type === 'erase') { | 81 | if (key.type === 'erase') { |
76 | ctrl.eraseKeyStroke(); | 82 | ctrl.eraseKeyStroke(); |
77 | return; | 83 | return; |
78 | } else if (key.type === 'shift') { | 84 | } else if (key.type === 'shift') { |
79 | ctrl.isUpperCase = !ctrl.isUpperCase; | 85 | ctrl.isUpperCase = !ctrl.isUpperCase; |
80 | return; | 86 | return; |
81 | } | 87 | } |
82 | 88 | ||
83 | var htmlKeyVal = angular.element(event.target || event.srcElement).text(); | 89 | var htmlKeyVal = angular.element(event.target || event.srcElement).text(); |
84 | var lastInputCtrl = angular.element(ctrl.lastInputCtrl); | 90 | var lastInputCtrl = angular.element(ctrl.lastInputCtrl); |
85 | var val = lastInputCtrl.val(); | 91 | var val = lastInputCtrl.val(); |
86 | var pre = val.substring(0, ctrl.startPos); | 92 | var pre = val.substring(0, ctrl.startPos); |
87 | var post = val.substring(ctrl.endPos, val.length); | 93 | var post = val.substring(ctrl.endPos, val.length); |
88 | lastInputCtrl.val(pre + htmlKeyVal + post); | 94 | lastInputCtrl.val(pre + htmlKeyVal + post); |
89 | lastInputCtrl.triggerHandler('change'); | 95 | lastInputCtrl.triggerHandler('change'); |
90 | 96 | ||
91 | ctrl.startPos += htmlKeyVal.length; | 97 | ctrl.startPos += htmlKeyVal.length; |
92 | ctrl.endPos += htmlKeyVal.length; | 98 | ctrl.endPos += htmlKeyVal.length; |
93 | ctrl.lastInputCtrl.selectionStart = ctrl.startPos; | 99 | ctrl.lastInputCtrl.selectionStart = ctrl.startPos; |
94 | ctrl.lastInputCtrl.selectionEnd = ctrl.startPos; | 100 | ctrl.lastInputCtrl.selectionEnd = ctrl.startPos; |
95 | ctrl.setKeyboardLayout(); | 101 | ctrl.setKeyboardLayout(); |
96 | ctrl.refocus(); | 102 | ctrl.refocus(); |
97 | }; | 103 | }; |
98 | 104 | ||
99 | ctrl.refocus = function() { | 105 | ctrl.refocus = function() { |
100 | ctrl.lastInputCtrl.focus(); | 106 | ctrl.lastInputCtrl.focus(); |
101 | }; | 107 | }; |
102 | 108 | ||
103 | ctrl.eraseKeyStroke = function() { | 109 | ctrl.eraseKeyStroke = function() { |
104 | if (!ctrl.lastInputCtrl) | 110 | if (!ctrl.lastInputCtrl) { |
105 | return; | 111 | return; |
112 | } | ||
106 | 113 | ||
107 | var hasSel = ctrl.startPos !== ctrl.endPos; | 114 | var hasSel = ctrl.startPos !== ctrl.endPos; |
108 | 115 | ||
109 | var lastInputCtrl = angular.element(ctrl.lastInputCtrl); | 116 | var lastInputCtrl = angular.element(ctrl.lastInputCtrl); |
110 | var val = lastInputCtrl.val(); | 117 | var val = lastInputCtrl.val(); |
111 | var pre = val.substring(0, hasSel ? ctrl.startPos : ctrl.startPos - 1); | 118 | var pre = val.substring(0, hasSel ? ctrl.startPos : ctrl.startPos - 1); |
112 | var post = val.substring(ctrl.endPos, val.length); | 119 | var post = val.substring(ctrl.endPos, val.length); |
113 | 120 | ||
114 | lastInputCtrl.val(pre + post); | 121 | lastInputCtrl.val(pre + post); |
115 | lastInputCtrl.triggerHandler('change'); | 122 | lastInputCtrl.triggerHandler('change'); |
116 | 123 | ||
117 | if (hasSel) { | 124 | if (hasSel) { |
118 | ctrl.endPos = ctrl.startPos; | 125 | ctrl.endPos = ctrl.startPos; |
119 | } | 126 | } |
120 | else { | 127 | else { |
121 | ctrl.startPos--; | 128 | ctrl.startPos--; |
122 | ctrl.endPos--; | 129 | ctrl.endPos--; |
123 | } | 130 | } |
124 | ctrl.lastInputCtrl.selectionStart = ctrl.startPos; | 131 | ctrl.lastInputCtrl.selectionStart = ctrl.startPos; |
125 | ctrl.lastInputCtrl.selectionEnd = ctrl.startPos; | 132 | ctrl.lastInputCtrl.selectionEnd = ctrl.startPos; |
126 | ctrl.setKeyboardLayout(); | 133 | ctrl.setKeyboardLayout(); |
127 | ctrl.refocus(); | 134 | ctrl.refocus(); |
128 | }; | 135 | }; |
129 | 136 | ||
130 | ctrl.setKeyboardLayout = function() { | 137 | ctrl.setKeyboardLayout = function() { |
131 | if (!ctrl.lastInputCtrl) { | 138 | if (!ctrl.lastInputCtrl) { |
132 | ctrl.isUpperCase = true; | 139 | ctrl.isUpperCase = true; |
133 | return; | 140 | return; |
134 | } | 141 | } |
135 | else if (ctrl.lastInputCtrl.className && ctrl.isUpperCase) | 142 | else if (ctrl.lastInputCtrl.className && ctrl.isUpperCase) { |
136 | ctrl.isUpperCase = true; | 143 | ctrl.isUpperCase = true; |
144 | } | ||
137 | else if (angular.element(ctrl.lastInputCtrl).val().length === 0) { | 145 | else if (angular.element(ctrl.lastInputCtrl).val().length === 0) { |
138 | ctrl.isUpperCase = true; | 146 | ctrl.isUpperCase = true; |
139 | } | 147 | } |
140 | else if ( | 148 | else if ( |
141 | angular.element(ctrl.lastInputCtrl).val().slice(-1) === ' ' && | 149 | angular.element(ctrl.lastInputCtrl).val().slice(-1) === ' ' && |
142 | !ctrl.isUpperCase && attr.uppercaseAllWords !== undefined | 150 | !ctrl.isUpperCase && attr.uppercaseAllWords !== undefined |
143 | ) | 151 | ) { |
144 | ctrl.isUpperCase = true; | 152 | ctrl.isUpperCase = true; |
153 | } | ||
145 | else{ | 154 | else{ |
146 | ctrl.isUpperCase = true; | 155 | ctrl.isUpperCase = true; |
147 | } | 156 | } |
148 | }; | 157 | }; |
149 | 158 | ||
150 | var focusin = function(event) { | 159 | var focusin = function(event) { |
151 | var e = event.target || event.srcElement; | 160 | var e = event.target || event.srcElement; |
152 | 161 | ||
153 | if (e.tagName === 'INPUT' || e.tagName === 'TEXTAREA') { | 162 | if (e.tagName === 'INPUT' || e.tagName === 'TEXTAREA') { |
154 | ctrl.lastInputCtrl = e; | 163 | ctrl.lastInputCtrl = e; |
155 | ctrl.setKeyboardLayout(); | 164 | ctrl.setKeyboardLayout(); |
156 | } | 165 | } |
157 | }; | 166 | }; |
158 | 167 | ||
159 | var keyup = function() { | 168 | var keyup = function() { |
160 | if (!ctrl.lastInputCtrl) { | 169 | if (!ctrl.lastInputCtrl) { |
161 | return; | 170 | return; |
162 | } | 171 | } |
163 | 172 | ||
164 | ctrl.startPos = ctrl.lastInputCtrl.selectionStart; | 173 | ctrl.startPos = ctrl.lastInputCtrl.selectionStart; |
165 | ctrl.endPos = ctrl.lastInputCtrl.selectionEnd; | 174 | ctrl.endPos = ctrl.lastInputCtrl.selectionEnd; |
166 | 175 | ||
167 | ctrl.setKeyboardLayout(); | 176 | ctrl.setKeyboardLayout(); |
168 | scope.$digest(); | 177 | scope.$digest(); |
169 | }; | 178 | }; |
170 | 179 | ||
171 | $document.bind('focusin', focusin); | 180 | $document.bind('focusin', focusin); |
172 | $document.bind('keyup', keyup); | 181 | $document.bind('keyup', keyup); |
173 | 182 | ||
174 | scope.$on("$destroy", function() { | 183 | scope.$on("$destroy", function() { |
175 | $document.unbind('focusin', focusin); | 184 | $document.unbind('focusin', focusin); |
176 | $document.unbind('keyup', keyup); | 185 | $document.unbind('keyup', keyup); |
177 | }); | 186 | }); |
178 | 187 | ||
179 | element.bind('contextmenu', function(event) { | 188 | element.bind('contextmenu', function(event) { |
180 | event.preventDefault(); | 189 | event.preventDefault(); |
181 | return false; | 190 | return false; |
182 | }); | 191 | }); |
183 | 192 | ||
184 | $timeout(function() { | 193 | $timeout(function() { |
185 | ctrl.isUpperCase = true; | 194 | ctrl.isUpperCase = true; |
186 | },0); | 195 | }, 0); |
187 | }, | 196 | }, |
188 | templateUrl: 'src/views/angular-on-screen-keyboard.html' | 197 | templateUrl: 'src/views/angular-on-screen-keyboard.html' |
189 | }; | 198 | }; |
190 | }]); | ||
199 | }]); |