Skip to content

Commit 236a22b

Browse files
authored
Update omnibox and expose source event to package consumer (#80)
* Update package dependencies This addresses 286 vulnerabilities identified by npm. - Update webpack - Update babel and fix configuration - Update istanbul/nyc and fix configuration - Update jsdom and fix usage * Add angular event propagation for onChosen handlers This adds propagation for the angular events that trigger choose() calls Unfortunately the $event name is taken by the custom event wrapper already in use. It's attached to those events under the `sourceEvent` name. Once released this will allow `onChosen()` handlers to have access to the event that triggered it's call
1 parent f38284b commit 236a22b

File tree

9 files changed

+5532
-6022
lines changed

9 files changed

+5532
-6022
lines changed

.babelrc

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
11
{
22
"presets": [
3-
["env", {
3+
["@babel/env", {
44
"targets": {
55
"browsers": ["last 2 versions", "Explorer >= 11"],
66
"node": "current"
7-
},
8-
"nyc": {
9-
"plugins": ["istanbul"]
107
}
118
}]
129
],
1310
"plugins": [
14-
["babel-root-import", {
11+
["babel-plugin-root-import", {
1512
"rootPathSuffix": "src"
16-
}]
13+
}],
14+
"istanbul"
1715
]
1816
}

.nycrc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"extends": "@istanbuljs/nyc-config-babel"
3+
}

package-lock.json

Lines changed: 5471 additions & 5980 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
"description": "A modern, flexible, Angular 1.x autocomplete library with limited assumptions.",
55
"main": "dist/ngc-omnibox.js",
66
"scripts": {
7-
"bundle": "webpack --progress --colors",
8-
"dev": "webpack --progress --colors --watch",
7+
"bundle": "webpack --mode=production --progress --colors",
8+
"dev": "webpack --mode=development --progress --colors --watch",
99
"test": "nyc babel-node node_modules/.bin/jasmine && eslint . && npm run report-coverage",
1010
"report-coverage": "nyc report --reporter=lcov > coverage.lcov",
1111
"prepublish": "npm run bundle",
@@ -22,20 +22,24 @@
2222
},
2323
"homepage": "https://github.com/UrbanCompass/ngc-omnibox#readme",
2424
"devDependencies": {
25-
"babel-cli": "^6.26.0",
26-
"babel-loader": "^6.4.1",
27-
"babel-plugin-istanbul": "^3.1.2",
28-
"babel-preset-env": "^1.6.0",
29-
"babel-root-import": "^4.1.8",
30-
"eslint": "^5.16.0",
31-
"eslint-plugin-import": "^2.7.0",
25+
"@babel/cli": "^7.6.4",
26+
"@babel/core": "^7.6.4",
27+
"@babel/node": "^7.6.3",
28+
"@babel/preset-env": "^7.6.3",
29+
"@istanbuljs/nyc-config-babel": "^2.1.1",
30+
"babel-loader": "^8.0.6",
31+
"babel-plugin-istanbul": "^5.2.0",
32+
"babel-plugin-root-import": "^6.4.1",
33+
"eslint": "^6.6.0",
34+
"eslint-plugin-import": "^2.18.2",
3235
"eslint-plugin-jasmine": "^2.10.1",
33-
"html-loader": "^0.4.5",
34-
"jasmine": "^2.8.0",
35-
"jasmine-node": "^1.14.5",
36-
"jsdom": "^9.12.0",
37-
"nyc": "^10.3.2",
38-
"webpack": "^2.7.0"
36+
"html-loader": "^0.5.5",
37+
"jasmine": "^3.5.0",
38+
"jasmine-node": "^3.0.0",
39+
"jsdom": "^15.2.0",
40+
"nyc": "^14.1.1",
41+
"webpack": "^4.41.2",
42+
"webpack-cli": "^3.3.9"
3943
},
4044
"dependencies": {
4145
"angular": "^1.5.6"

spec/tests/angularComponent/ngcModifySuggestionsTemplateFactorySpec.js

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import jsdom from 'jsdom';
1+
import {JSDOM} from 'jsdom';
22

33
import ngcModifySuggestionsTemplateFactory from '~/angularComponent/ngcModifySuggestionsTemplateFactory.js';
44

@@ -18,7 +18,8 @@ const unCategorizedTemplateOutput = [
1818
'ng-attr-aria-selected="{{suggestionItem.isHighlighted() || undefined}}" ',
1919
'ng-attr-aria-readonly="{{suggestionItem.isSelectable() === false || undefined}}" ',
2020
'ng-mouseenter="suggestionItem.handleMouseEnter()" ',
21-
'ng-mouseleave="suggestionItem.handleMouseLeave()" ng-click="suggestionItem.handleClick()">',
21+
'ng-mouseleave="suggestionItem.handleMouseLeave()" ',
22+
'ng-click="suggestionItem.handleClick($event)">',
2223
'{{suggestion.sample_item_text}}',
2324
'</ngc-omnibox-suggestions-item>'
2425
].join('');
@@ -40,7 +41,7 @@ const categorizedTemplateOutput = [
4041
'ng-attr-aria-readonly="{{suggestionItem.isSelectable() === false || undefined}}" ',
4142
'ng-mouseenter="suggestionItem.handleMouseEnter()" ',
4243
'ng-mouseleave="suggestionItem.handleMouseLeave()" ',
43-
'ng-click="suggestionItem.handleClick()">',
44+
'ng-click="suggestionItem.handleClick($event)">',
4445
'{{suggestion.sample_category_title}}',
4546
'</h5>',
4647
'<div ng-repeat="suggestion in suggestion.children" ng-include="\'category-tmpl\'"></div>',
@@ -50,7 +51,7 @@ const categorizedTemplateOutput = [
5051
'ng-attr-aria-readonly="{{suggestionItem.isSelectable() === false || undefined}}" ',
5152
'ng-mouseenter="suggestionItem.handleMouseEnter()" ',
5253
'ng-mouseleave="suggestionItem.handleMouseLeave()" ',
53-
'ng-click="suggestionItem.handleClick()">',
54+
'ng-click="suggestionItem.handleClick($event)">',
5455
'{{suggestion.sample_item_text}}',
5556
'</ngc-omnibox-suggestions-item>',
5657
'</div>'
@@ -69,7 +70,8 @@ const loadingElTemplateOutput = [
6970
'ng-attr-aria-selected="{{suggestionItem.isHighlighted() || undefined}}" ',
7071
'ng-attr-aria-readonly="{{suggestionItem.isSelectable() === false || undefined}}" ',
7172
'ng-mouseenter="suggestionItem.handleMouseEnter()" ',
72-
'ng-mouseleave="suggestionItem.handleMouseLeave()" ng-click="suggestionItem.handleClick()">',
73+
'ng-mouseleave="suggestionItem.handleMouseLeave()" ',
74+
'ng-click="suggestionItem.handleClick($event)">',
7375
'{{suggestion.sample_item_text}}',
7476
'</ngc-omnibox-suggestions-item>',
7577
'<ngc-omnibox-suggestions-loading role="progressbar" ng-if="omnibox.shouldShowLoadingElement">',
@@ -89,7 +91,8 @@ const noResultsElTemplateOutput = [
8991
'ng-attr-aria-selected="{{suggestionItem.isHighlighted() || undefined}}" ',
9092
'ng-attr-aria-readonly="{{suggestionItem.isSelectable() === false || undefined}}" ',
9193
'ng-mouseenter="suggestionItem.handleMouseEnter()" ',
92-
'ng-mouseleave="suggestionItem.handleMouseLeave()" ng-click="suggestionItem.handleClick()">',
94+
'ng-mouseleave="suggestionItem.handleMouseLeave()" ',
95+
'ng-click="suggestionItem.handleClick($event)">',
9396
'{{suggestion.sample_item_text}}',
9497
'</ngc-omnibox-suggestions-item>',
9598
// vv I think this is a bug in jsdom
@@ -104,7 +107,7 @@ describe('ngcOmnibox.angularComponent.ngcModifySuggestionsTemplateFactory', () =
104107
let ngcModifySuggestionsTemplate;
105108

106109
it('should throw an error if there is no ngc-omnibox-suggestions-item element', () => {
107-
const document = jsdom.jsdom(noItemTemplate).defaultView.document;
110+
const document = new JSDOM(noItemTemplate).window.document;
108111
const element = document.querySelector('ngc-omnibox-suggestions');
109112

110113
ngcModifySuggestionsTemplate = ngcModifySuggestionsTemplateFactory([document], templateCache);
@@ -115,7 +118,7 @@ describe('ngcOmnibox.angularComponent.ngcModifySuggestionsTemplateFactory', () =
115118
it('should modify an un-categorized subcomponent', () => {
116119
const elementTemplate =
117120
`<ngc-omnibox-suggestions>${unCategorizedTemplate}</ngc-omnibox-suggestions>`;
118-
const document = jsdom.jsdom(elementTemplate).defaultView.document;
121+
const document = new JSDOM(elementTemplate).window.document;
119122
const element = document.querySelector('ngc-omnibox-suggestions');
120123

121124
ngcModifySuggestionsTemplate = ngcModifySuggestionsTemplateFactory([document], templateCache);
@@ -125,7 +128,7 @@ describe('ngcOmnibox.angularComponent.ngcModifySuggestionsTemplateFactory', () =
125128
it('should modify a categorized subcomponent', () => {
126129
const elementTemplate =
127130
`<ngc-omnibox-suggestions>${categorizedTemplate}</ngc-omnibox-suggestions>`;
128-
const document = jsdom.jsdom(elementTemplate).defaultView.document;
131+
const document = new JSDOM(elementTemplate).window.document;
129132
const element = document.querySelector('ngc-omnibox-suggestions');
130133

131134
ngcModifySuggestionsTemplate = ngcModifySuggestionsTemplateFactory([document], templateCache);
@@ -135,7 +138,7 @@ describe('ngcOmnibox.angularComponent.ngcModifySuggestionsTemplateFactory', () =
135138
it('should modify a loading subcomponent', () => {
136139
const elementTemplate =
137140
`<ngc-omnibox-suggestions>${loadingElTemplate}</ngc-omnibox-suggestions>`;
138-
const document = jsdom.jsdom(elementTemplate).defaultView.document;
141+
const document = new JSDOM(elementTemplate).window.document;
139142
const element = document.querySelector('ngc-omnibox-suggestions');
140143

141144
ngcModifySuggestionsTemplate = ngcModifySuggestionsTemplateFactory([document], templateCache);
@@ -145,7 +148,7 @@ describe('ngcOmnibox.angularComponent.ngcModifySuggestionsTemplateFactory', () =
145148
it('should modify a no-results subcomponent', () => {
146149
const elementTemplate =
147150
`<ngc-omnibox-suggestions>${noResultsElTemplate}</ngc-omnibox-suggestions>`;
148-
const document = jsdom.jsdom(elementTemplate).defaultView.document;
151+
const document = new JSDOM(elementTemplate).window.document;
149152
const element = document.querySelector('ngc-omnibox-suggestions');
150153

151154
ngcModifySuggestionsTemplate = ngcModifySuggestionsTemplateFactory([document], templateCache);
@@ -159,7 +162,7 @@ describe('ngcOmnibox.angularComponent.ngcModifySuggestionsTemplateFactory', () =
159162
<ngc-omnibox-suggestions-item></ngc-omnibox-suggestions-item>
160163
</ngc-omnibox-suggestions>
161164
`;
162-
const document = jsdom.jsdom(elementTemplate).defaultView.document;
165+
const document = new JSDOM(elementTemplate).window.document;
163166
const element = document.querySelector('ngc-omnibox-suggestions');
164167

165168
ngcModifySuggestionsTemplate = ngcModifySuggestionsTemplateFactory([document], templateCache);

spec/tests/angularComponent/ngcOmniboxControllerSpec.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -425,6 +425,15 @@ describe('ngcOmnibox.angularComponent.ngcOmniboxController', () => {
425425
expect(omniboxController.ngModel).toEqual('three');
426426
});
427427

428+
it('should attach event source data to the event when provided', () => {
429+
omniboxController.onChosen = ({$event}) => {
430+
expect($event.sourceEvent).toEqual({type: 'click'});
431+
432+
};
433+
omniboxController.choose('three', true, {type: 'click'});
434+
expect(omniboxController.ngModel).toEqual('three');
435+
});
436+
428437
it('should set the ngModel to null when unchoosing if multiple is off', () => {
429438
omniboxController.unchoose('one');
430439
expect(omniboxController.ngModel).toEqual(null);

src/angularComponent/ngcModifySuggestionsTemplateFactory.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ export default function ngcModifySuggestionsTemplateFactory($document, $template
5555
'{{suggestionItem.isSelectable() === false || undefined}}');
5656
itemHeader.setAttribute('ng-mouseenter', 'suggestionItem.handleMouseEnter()');
5757
itemHeader.setAttribute('ng-mouseleave', 'suggestionItem.handleMouseLeave()');
58-
itemHeader.setAttribute('ng-click', 'suggestionItem.handleClick()');
58+
itemHeader.setAttribute('ng-click', 'suggestionItem.handleClick($event)');
5959
}
6060

6161
categoryContainer.appendChild(categoryEl);
@@ -68,7 +68,7 @@ export default function ngcModifySuggestionsTemplateFactory($document, $template
6868
'{{suggestionItem.isSelectable() === false || undefined}}');
6969
itemEl.setAttribute('ng-mouseenter', 'suggestionItem.handleMouseEnter()');
7070
itemEl.setAttribute('ng-mouseleave', 'suggestionItem.handleMouseLeave()');
71-
itemEl.setAttribute('ng-click', 'suggestionItem.handleClick()');
71+
itemEl.setAttribute('ng-click', 'suggestionItem.handleClick($event)');
7272

7373
$templateCache.put(templateCacheName, categoryContainer.innerHTML);
7474

@@ -82,7 +82,7 @@ export default function ngcModifySuggestionsTemplateFactory($document, $template
8282
'{{suggestionItem.isSelectable() === false || undefined}}');
8383
itemEl.setAttribute('ng-mouseenter', 'suggestionItem.handleMouseEnter()');
8484
itemEl.setAttribute('ng-mouseleave', 'suggestionItem.handleMouseLeave()');
85-
itemEl.setAttribute('ng-click', 'suggestionItem.handleClick()');
85+
itemEl.setAttribute('ng-click', 'suggestionItem.handleClick($event)');
8686

8787
return element.innerHTML;
8888
}

src/angularComponent/ngcOmniboxController.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -399,8 +399,9 @@ export default class NgcOmniboxController {
399399
*
400400
* @param {Object} item
401401
* @param {Boolean} shouldFocusField -- Whether to focus the input field after choosing
402+
* @param {Object | undefined} sourceEvent -- Original angular event that triggered this choose
402403
*/
403-
choose(item, shouldFocusField = true) {
404+
choose(item, shouldFocusField = true, sourceEvent = undefined) {
404405
if (item && this.isSelectable({suggestion: item, omnibox: this}) !== false) {
405406

406407
const $event = {
@@ -415,7 +416,8 @@ export default class NgcOmniboxController {
415416
} else if (!this.multiple) {
416417
this.ngModel = item;
417418
}
418-
}
419+
},
420+
sourceEvent
419421
};
420422

421423
this.onChosen({choice: item, $event, omnibox: this});
@@ -598,9 +600,9 @@ export default class NgcOmniboxController {
598600
const selection = this._suggestionsUiList[this.highlightedIndex];
599601

600602
if (selection) {
601-
this.choose(selection.data);
603+
this.choose(selection.data, true, event);
602604
} else if (!this.multiple && !this.requireMatch) {
603-
this.choose(this.query);
605+
this.choose(this.query, true, event);
604606
}
605607
}
606608
} else if (keyCode === KEY.DOWN) {

src/angularComponent/ngcOmniboxSuggestionsItemController.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ export default class ngcOmniboxSuggestionsItemController {
88
this.omnibox.highlightNone();
99
}
1010

11-
handleClick() {
12-
this.omnibox.choose(this.suggestion);
11+
handleClick($event) {
12+
this.omnibox.choose(this.suggestion, true, $event);
1313
}
1414

1515
/**

0 commit comments

Comments
 (0)