Skip to content
This repository was archived by the owner on Oct 2, 2019. It is now read-only.

Commit 6e81746

Browse files
committed
Merge pull request #684 from angular-ui/refactor-split-code
chore(refactor): split code into multiple files
2 parents 7443524 + 8d7706f commit 6e81746

11 files changed

+1538
-1526
lines changed

gulpfile.js

+8-3
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ var karma = require('karma').server;
44
var concat = require('gulp-concat');
55
var jshint = require('gulp-jshint');
66
var header = require('gulp-header');
7+
var footer = require('gulp-footer');
78
var rename = require('gulp-rename');
89
var es = require('event-stream');
910
var del = require('del');
@@ -50,10 +51,13 @@ gulp.task('scripts', ['clean'], function() {
5051
};
5152

5253
var buildLib = function(){
53-
return gulp.src('src/select.js')
54+
return gulp.src(['src/common.js','src/*.js'])
5455
.pipe(plumber({
5556
errorHandler: handleError
5657
}))
58+
.pipe(concat('select_without_templates.js'))
59+
.pipe(header('(function () { \n"use strict";\n'))
60+
.pipe(footer('\n}());'))
5761
.pipe(jshint())
5862
.pipe(jshint.reporter('jshint-stylish'))
5963
.pipe(jshint.reporter('fail'));
@@ -76,10 +80,11 @@ gulp.task('scripts', ['clean'], function() {
7680

7781
gulp.task('styles', ['clean'], function() {
7882

79-
return gulp.src('src/select.css')
83+
return gulp.src('src/common.css')
8084
.pipe(header(config.banner, {
8185
timestamp: (new Date()).toISOString(), pkg: config.pkg
8286
}))
87+
.pipe(rename('select.css'))
8388
.pipe(gulp.dest('dist'))
8489
.pipe(minifyCSS())
8590
.pipe(rename({ext:'.min.css'}))
@@ -98,4 +103,4 @@ gulp.task('karma-watch', ['build'], function() {
98103
var handleError = function (err) {
99104
console.log(err.toString());
100105
this.emit('end');
101-
};
106+
};

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
"gulp-angular-templatecache": "~1.2.1",
1616
"gulp-concat": "~2.1.7",
1717
"gulp-header": "~1.0.2",
18+
"gulp-footer": "~1.0.5",
1819
"gulp-jshint": "1.6.4",
1920
"gulp-minify-css": "~0.3.6",
2021
"gulp-minify-html": "~0.1.0",

src/RepeatParserService.js

+50
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/**
2+
* Parses "repeat" attribute.
3+
*
4+
* Taken from AngularJS ngRepeat source code
5+
* See https://github.com/angular/angular.js/blob/v1.2.15/src/ng/directive/ngRepeat.js#L211
6+
*
7+
* Original discussion about parsing "repeat" attribute instead of fully relying on ng-repeat:
8+
* https://github.com/angular-ui/ui-select/commit/5dd63ad#commitcomment-5504697
9+
*/
10+
11+
uis.service('RepeatParser', ['uiSelectMinErr','$parse', function(uiSelectMinErr, $parse) {
12+
var self = this;
13+
14+
/**
15+
* Example:
16+
* expression = "address in addresses | filter: {street: $select.search} track by $index"
17+
* itemName = "address",
18+
* source = "addresses | filter: {street: $select.search}",
19+
* trackByExp = "$index",
20+
*/
21+
self.parse = function(expression) {
22+
23+
var match = expression.match(/^\s*(?:([\s\S]+?)\s+as\s+)?([\S]+?)\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?\s*$/);
24+
25+
if (!match) {
26+
throw uiSelectMinErr('iexp', "Expected expression in form of '_item_ in _collection_[ track by _id_]' but got '{0}'.",
27+
expression);
28+
}
29+
30+
return {
31+
itemName: match[2], // (lhs) Left-hand side,
32+
source: $parse(match[3]),
33+
trackByExp: match[4],
34+
modelMapper: $parse(match[1] || match[2])
35+
};
36+
37+
};
38+
39+
self.getGroupNgRepeatExpression = function() {
40+
return '$group in $select.groups';
41+
};
42+
43+
self.getNgRepeatExpression = function(itemName, source, trackByExp, grouped) {
44+
var expression = itemName + ' in ' + (grouped ? '$group.items' : source);
45+
if (trackByExp) {
46+
expression += ' track by ' + trackByExp;
47+
}
48+
return expression;
49+
};
50+
}]);

src/select.css renamed to src/common.css

+15-5
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
/*!
2+
* ui-select
3+
* http://github.com/angular-ui/ui-select
4+
* Version: 0.9.5 - 2014-12-12T16:07:20.859Z
5+
* License: MIT
6+
*/
7+
8+
19
/* Style when highlighting a search. */
210
.ui-select-highlight {
311
font-weight: bold;
@@ -74,14 +82,11 @@
7482

7583
.ui-select-bootstrap .ui-select-toggle {
7684
position: relative;
77-
78-
/* Instead of center because of .btn */
79-
text-align: left;
8085
}
8186

8287
.ui-select-bootstrap .ui-select-toggle > .caret {
8388
position: absolute;
84-
height: 10px;
89+
height: 100%;
8590
top: 50%;
8691
right: 10px;
8792
margin-top: -2px;
@@ -99,6 +104,11 @@
99104
border-bottom-right-radius: 0;
100105
}
101106

107+
.ui-select-bootstrap > .ui-select-match {
108+
/* Instead of center because of .btn */
109+
text-align: left;
110+
}
111+
102112
.ui-select-bootstrap > .ui-select-match > .caret {
103113
position: absolute;
104114
top: 45%;
@@ -200,4 +210,4 @@
200210
/* Mark invalid Bootstrap */
201211
.ui-select-bootstrap.ng-dirty.ng-invalid > button.btn.ui-select-match {
202212
border-color: #D44950;
203-
}
213+
}

src/common.js

+137
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
2+
var KEY = {
3+
TAB: 9,
4+
ENTER: 13,
5+
ESC: 27,
6+
SPACE: 32,
7+
LEFT: 37,
8+
UP: 38,
9+
RIGHT: 39,
10+
DOWN: 40,
11+
SHIFT: 16,
12+
CTRL: 17,
13+
ALT: 18,
14+
PAGE_UP: 33,
15+
PAGE_DOWN: 34,
16+
HOME: 36,
17+
END: 35,
18+
BACKSPACE: 8,
19+
DELETE: 46,
20+
COMMAND: 91,
21+
22+
MAP: { 91 : "COMMAND", 8 : "BACKSPACE" , 9 : "TAB" , 13 : "ENTER" , 16 : "SHIFT" , 17 : "CTRL" , 18 : "ALT" , 19 : "PAUSEBREAK" , 20 : "CAPSLOCK" , 27 : "ESC" , 32 : "SPACE" , 33 : "PAGE_UP", 34 : "PAGE_DOWN" , 35 : "END" , 36 : "HOME" , 37 : "LEFT" , 38 : "UP" , 39 : "RIGHT" , 40 : "DOWN" , 43 : "+" , 44 : "PRINTSCREEN" , 45 : "INSERT" , 46 : "DELETE", 48 : "0" , 49 : "1" , 50 : "2" , 51 : "3" , 52 : "4" , 53 : "5" , 54 : "6" , 55 : "7" , 56 : "8" , 57 : "9" , 59 : ";", 61 : "=" , 65 : "A" , 66 : "B" , 67 : "C" , 68 : "D" , 69 : "E" , 70 : "F" , 71 : "G" , 72 : "H" , 73 : "I" , 74 : "J" , 75 : "K" , 76 : "L", 77 : "M" , 78 : "N" , 79 : "O" , 80 : "P" , 81 : "Q" , 82 : "R" , 83 : "S" , 84 : "T" , 85 : "U" , 86 : "V" , 87 : "W" , 88 : "X" , 89 : "Y" , 90 : "Z", 96 : "0" , 97 : "1" , 98 : "2" , 99 : "3" , 100 : "4" , 101 : "5" , 102 : "6" , 103 : "7" , 104 : "8" , 105 : "9", 106 : "*" , 107 : "+" , 109 : "-" , 110 : "." , 111 : "/", 112 : "F1" , 113 : "F2" , 114 : "F3" , 115 : "F4" , 116 : "F5" , 117 : "F6" , 118 : "F7" , 119 : "F8" , 120 : "F9" , 121 : "F10" , 122 : "F11" , 123 : "F12", 144 : "NUMLOCK" , 145 : "SCROLLLOCK" , 186 : ";" , 187 : "=" , 188 : "," , 189 : "-" , 190 : "." , 191 : "/" , 192 : "`" , 219 : "[" , 220 : "\\" , 221 : "]" , 222 : "'"
23+
},
24+
25+
isControl: function (e) {
26+
var k = e.which;
27+
switch (k) {
28+
case KEY.COMMAND:
29+
case KEY.SHIFT:
30+
case KEY.CTRL:
31+
case KEY.ALT:
32+
return true;
33+
}
34+
35+
if (e.metaKey) return true;
36+
37+
return false;
38+
},
39+
isFunctionKey: function (k) {
40+
k = k.which ? k.which : k;
41+
return k >= 112 && k <= 123;
42+
},
43+
isVerticalMovement: function (k){
44+
return ~[KEY.UP, KEY.DOWN].indexOf(k);
45+
},
46+
isHorizontalMovement: function (k){
47+
return ~[KEY.LEFT,KEY.RIGHT,KEY.BACKSPACE,KEY.DELETE].indexOf(k);
48+
}
49+
};
50+
51+
/**
52+
* Add querySelectorAll() to jqLite.
53+
*
54+
* jqLite find() is limited to lookups by tag name.
55+
* TODO This will change with future versions of AngularJS, to be removed when this happens
56+
*
57+
* See jqLite.find - why not use querySelectorAll? https://github.com/angular/angular.js/issues/3586
58+
* See feat(jqLite): use querySelectorAll instead of getElementsByTagName in jqLite.find https://github.com/angular/angular.js/pull/3598
59+
*/
60+
if (angular.element.prototype.querySelectorAll === undefined) {
61+
angular.element.prototype.querySelectorAll = function(selector) {
62+
return angular.element(this[0].querySelectorAll(selector));
63+
};
64+
}
65+
66+
/**
67+
* Add closest() to jqLite.
68+
*/
69+
if (angular.element.prototype.closest === undefined) {
70+
angular.element.prototype.closest = function( selector) {
71+
var elem = this[0];
72+
var matchesSelector = elem.matches || elem.webkitMatchesSelector || elem.mozMatchesSelector || elem.msMatchesSelector;
73+
74+
while (elem) {
75+
if (matchesSelector.bind(elem)(selector)) {
76+
return elem;
77+
} else {
78+
elem = elem.parentElement;
79+
}
80+
}
81+
return false;
82+
};
83+
}
84+
85+
var latestId = 0;
86+
87+
var uis = angular.module('ui.select', [])
88+
89+
.constant('uiSelectConfig', {
90+
theme: 'bootstrap',
91+
searchEnabled: true,
92+
sortable: false,
93+
placeholder: '', // Empty by default, like HTML tag <select>
94+
refreshDelay: 1000, // In milliseconds
95+
closeOnSelect: true,
96+
generateId: function() {
97+
return latestId++;
98+
}
99+
})
100+
101+
// See Rename minErr and make it accessible from outside https://github.com/angular/angular.js/issues/6913
102+
.service('uiSelectMinErr', function() {
103+
var minErr = angular.$$minErr('ui.select');
104+
return function() {
105+
var error = minErr.apply(this, arguments);
106+
var message = error.message.replace(new RegExp('\nhttp://errors.angularjs.org/.*'), '');
107+
return new Error(message);
108+
};
109+
})
110+
111+
// Recreates old behavior of ng-transclude. Used internally.
112+
.directive('uisTranscludeAppend', function () {
113+
return {
114+
link: function (scope, element, attrs, ctrl, transclude) {
115+
transclude(scope, function (clone) {
116+
element.append(clone);
117+
});
118+
}
119+
};
120+
})
121+
122+
/**
123+
* Highlights text that matches $select.search.
124+
*
125+
* Taken from AngularUI Bootstrap Typeahead
126+
* See https://github.com/angular-ui/bootstrap/blob/0.10.0/src/typeahead/typeahead.js#L340
127+
*/
128+
.filter('highlight', function() {
129+
function escapeRegexp(queryToEscape) {
130+
return queryToEscape.replace(/([.?*+^$[\]\\(){}|-])/g, '\\$1');
131+
}
132+
133+
return function(matchItem, query) {
134+
return query && matchItem ? matchItem.replace(new RegExp(escapeRegexp(query), 'gi'), '<span class="ui-select-highlight">$&</span>') : matchItem;
135+
};
136+
});
137+

0 commit comments

Comments
 (0)