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