Skip to content
This repository was archived by the owner on Sep 5, 2024. It is now read-only.

Commit eb10b56

Browse files
Ignigenajelbourn
authored andcommitted
feat(contactChips): add basic support for md-separator-keys (#8142)
Add basic support for md-separator-keys. The ENTER and TAB keys trigger separation by default through md-autocomplete regardless of what additional key codes are user defined.
1 parent 6972119 commit eb10b56

File tree

5 files changed

+72
-4
lines changed

5 files changed

+72
-4
lines changed

src/components/chips/contact-chips.spec.js

+52-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ describe('<md-contact-chips>', function() {
1616

1717
beforeEach(module('material.components.chips'));
1818

19-
beforeEach(inject(function($rootScope) {
19+
beforeEach(inject(function($rootScope, $mdConstant) {
2020
scope = $rootScope.$new(false);
2121
var img = 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';
2222
scope.allContacts = [
@@ -35,6 +35,7 @@ describe('<md-contact-chips>', function() {
3535
}
3636
];
3737
scope.contacts = [];
38+
scope.keys = [$mdConstant.KEY_CODE.COMMA]
3839

3940
scope.highlightFlags = 'i';
4041
}));
@@ -144,6 +145,7 @@ describe('<md-contact-chips>', function() {
144145

145146
element.scope().$apply(function() {
146147
autocompleteCtrl.scope.searchText = 'NAME';
148+
autocompleteCtrl.focus();
147149
autocompleteCtrl.keydown({});
148150
});
149151

@@ -173,6 +175,46 @@ describe('<md-contact-chips>', function() {
173175
}));*/
174176
});
175177

178+
describe('custom separator keys', function() {
179+
var CONTACT_CHIPS_TEMPLATE_SEPARATOR = '\
180+
<md-contact-chips\
181+
ng-model="contacts"\
182+
md-contacts="querySearch($query)"\
183+
md-contact-name="name"\
184+
md-contact-image="image"\
185+
md-contact-email="email"\
186+
md-highlight-flags="i"\
187+
md-separator-keys="keys"\
188+
placeholder="To">\
189+
</md-contact-chips>';
190+
191+
it('should add a chip when a separator key is pressed', inject(function($mdConstant, $timeout) {
192+
scope.querySearch = jasmine.createSpy('querySearch').and.callFake(function(q) {
193+
return scope.allContacts;
194+
});
195+
196+
var element = buildChips(CONTACT_CHIPS_TEMPLATE_SEPARATOR);
197+
var ctrl = element.controller('mdContactChips');
198+
var chipsCtrl = angular.element(element[0].querySelector('md-chips')).controller('mdChips');
199+
200+
var autocompleteElement = element.find('md-autocomplete');
201+
var autocompleteCtrl = autocompleteElement.controller('mdAutocomplete');
202+
203+
element.scope().$apply(function() {
204+
autocompleteCtrl.scope.searchText = 'NAME';
205+
autocompleteCtrl.keydown({});
206+
});
207+
208+
autocompleteCtrl.keydown(keydownEvent($mdConstant.KEY_CODE.DOWN_ARROW));
209+
ctrl.inputKeydown(keydownEvent($mdConstant.KEY_CODE.COMMA, autocompleteElement));
210+
$timeout.flush();
211+
212+
var chips = angular.element(element[0].querySelectorAll('md-chip'));
213+
expect(chips.length).toBe(1);
214+
expect(chips[0].innerHTML).toContain('NAME2');
215+
}));
216+
});
217+
176218
});
177219

178220
// *******************************
@@ -201,4 +243,13 @@ describe('<md-contact-chips>', function() {
201243
});
202244
ctrl.inputKeydown(event);
203245
}
246+
247+
function keydownEvent(keyCode, target) {
248+
return {
249+
keyCode: keyCode,
250+
stopPropagation: angular.noop,
251+
preventDefault: angular.noop,
252+
target: target
253+
};
254+
}
204255
});

src/components/chips/demoContactChips/index.html

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
md-contact-image="image"
1010
md-contact-email="email"
1111
md-require-match="true"
12+
md-separator-keys="ctrl.keys"
1213
md-highlight-flags="i"
1314
placeholder="To">
1415
</md-contact-chips>

src/components/chips/demoContactChips/script.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,15 @@
1313
.module('contactChipsDemo', ['ngMaterial'])
1414
.controller('ContactChipDemoCtrl', DemoCtrl);
1515

16-
function DemoCtrl ($q, $timeout, $log) {
16+
function DemoCtrl ($q, $timeout, $log, $mdConstant) {
1717
var self = this;
1818
var pendingSearch, cancelSearch = angular.noop;
1919
var lastSearch;
2020

2121
self.allContacts = loadContacts();
2222
self.contacts = [self.allContacts[0]];
2323
self.asyncContacts = [];
24+
self.keys = [$mdConstant.KEY_CODE.COMMA];
2425

2526
self.querySearch = querySearch;
2627
self.delayedQuerySearch = delayedQuerySearch;

src/components/chips/js/contactChipsController.js

+12
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,18 @@ MdContactChipsCtrl.prototype.queryContact = function(searchText) {
1818
return this.contactQuery({'$query': searchText});
1919
};
2020

21+
MdContactChipsCtrl.prototype.inputKeydown = function(event) {
22+
if (!this.separatorKeys || this.separatorKeys.indexOf(event.keyCode) < 0) {
23+
return;
24+
}
25+
26+
event.stopPropagation();
27+
event.preventDefault();
28+
29+
var autocompleteCtrl = angular.element(event.target).controller('mdAutocomplete');
30+
autocompleteCtrl.select(autocompleteCtrl.index);
31+
};
32+
2133
MdContactChipsCtrl.prototype.itemName = function(item) {
2234
return item[this.contactName];
2335
};

src/components/chips/js/contactChipsDirective.js

+5-2
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,8 @@ var MD_CONTACT_CHIPS_TEMPLATE = '\
5757
ng-model="$mdContactChipsCtrl.contacts"\
5858
ng-change="$mdContactChipsCtrl.ngChange($mdContactChipsCtrl.contacts)"\
5959
md-require-match="$mdContactChipsCtrl.requireMatch"\
60-
md-chip-append-delay="{{$mdContactChipsCtrl.chipAppendDelay}}" \
60+
md-chip-append-delay="{{$mdContactChipsCtrl.chipAppendDelay}}"\
61+
md-separator-keys="$mdContactChipsCtrl.separatorKeys"\
6162
md-autocomplete-snap>\
6263
<md-autocomplete\
6364
md-menu-class="md-contact-chips-suggestions"\
@@ -68,6 +69,7 @@ var MD_CONTACT_CHIPS_TEMPLATE = '\
6869
md-no-cache="true"\
6970
md-min-length="$mdContactChipsCtrl.minLength"\
7071
md-autoselect\
72+
ng-keydown="$mdContactChipsCtrl.inputKeydown($event)"\
7173
placeholder="{{$mdContactChipsCtrl.contacts.length == 0 ?\
7274
$mdContactChipsCtrl.placeholder : $mdContactChipsCtrl.secondaryPlaceholder}}">\
7375
<div class="md-contact-suggestion">\
@@ -125,7 +127,8 @@ function MdContactChips($mdTheming, $mdUtil) {
125127
requireMatch: '=?mdRequireMatch',
126128
minLength: '=?mdMinLength',
127129
highlightFlags: '@?mdHighlightFlags',
128-
chipAppendDelay: '@?mdChipAppendDelay'
130+
chipAppendDelay: '@?mdChipAppendDelay',
131+
separatorKeys: '=?mdSeparatorKeys',
129132
}
130133
};
131134

0 commit comments

Comments
 (0)