@skyux/lookup 5.6.2 → 5.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -37,7 +37,7 @@
37
37
  /**
38
38
  * NOTICE: DO NOT MODIFY THIS FILE!
39
39
  * The contents of this file were automatically generated by
40
- * the 'ng generate @skyux/i18n:lib-resources-module modules/shared/sky-lookup' schematic.
40
+ * the 'ng generate @skyux/i18n:lib-resources-module lib/modules/shared/sky-lookup' schematic.
41
41
  * To update this file, simply rerun the command.
42
42
  */
43
43
  var RESOURCES = {
@@ -1275,7 +1275,9 @@
1275
1275
  this.currentSearchSub = this.performSearch()
1276
1276
  .pipe(operators.take(1))
1277
1277
  .subscribe(function (result) {
1278
- var items = result.items;
1278
+ var items = result.items.filter(function (item) {
1279
+ return item && _this.descriptorProperty in item;
1280
+ });
1279
1281
  _this.isSearchingAsync = false;
1280
1282
  _this._searchResults = items.map(function (r, i) {
1281
1283
  var result = {
@@ -1348,7 +1350,12 @@
1348
1350
  * Returns the text to highlight based on exact matches, case-insensitive matches, and matches for corresponding diacritical characters (a will match à).
1349
1351
  */
1350
1352
  SkyAutocompleteComponent.prototype.getHighlightText = function (searchText) {
1351
- var normalizedSearchText = normalizeDiacritics(this.searchText).toLocaleUpperCase();
1353
+ var normalizedSearchText = normalizeDiacritics(searchText)
1354
+ .toLocaleUpperCase()
1355
+ .trim();
1356
+ if (!normalizedSearchText) {
1357
+ return [];
1358
+ }
1352
1359
  var matchesToHighlight = [];
1353
1360
  for (var i = 0, n = this._searchResults.length; i < n; i++) {
1354
1361
  var value = this._searchResults[i].data[this.descriptorProperty]
@@ -9452,7 +9452,7 @@
9452
9452
  {
9453
9453
  "fileName": "lookup-custom-picker-demo.module.ts",
9454
9454
  "filePath": "/projects/lookup/documentation/code-examples/lookup/custom-picker/lookup-custom-picker-demo.module.ts",
9455
- "rawContents": "import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { SkyIdModule } from '@skyux/core';\nimport { SkyCheckboxModule, SkyInputBoxModule } from '@skyux/forms';\nimport { SkyLookupModule } from '@skyux/lookup';\nimport { SkyModalModule } from '@skyux/modals';\n\nimport { LookupCustomPickerDemoModalComponent } from './lookup-custom-picker-demo-modal.component';\nimport { LookupCustomPickerDemoComponent } from './lookup-custom-picker-demo.component';\n\n@NgModule({\n imports: [\n CommonModule,\n ReactiveFormsModule,\n SkyCheckboxModule,\n SkyIdModule,\n SkyInputBoxModule,\n SkyLookupModule,\n SkyModalModule,\n ],\n declarations: [\n LookupCustomPickerDemoComponent,\n LookupCustomPickerDemoModalComponent,\n ],\n exports: [LookupCustomPickerDemoComponent],\n entryComponents: [LookupCustomPickerDemoModalComponent],\n})\nexport class LookupCustomPickerDemoModule {}\n"
9455
+ "rawContents": "import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { SkyIdModule } from '@skyux/core';\nimport { SkyCheckboxModule, SkyInputBoxModule } from '@skyux/forms';\nimport { SkyLookupModule } from '@skyux/lookup';\nimport { SkyModalModule } from '@skyux/modals';\n\nimport { LookupCustomPickerDemoModalComponent } from './lookup-custom-picker-demo-modal.component';\nimport { LookupCustomPickerDemoComponent } from './lookup-custom-picker-demo.component';\n\n@NgModule({\n imports: [\n CommonModule,\n ReactiveFormsModule,\n SkyCheckboxModule,\n SkyIdModule,\n SkyInputBoxModule,\n SkyLookupModule,\n SkyModalModule,\n ],\n declarations: [\n LookupCustomPickerDemoComponent,\n LookupCustomPickerDemoModalComponent,\n ],\n exports: [LookupCustomPickerDemoComponent],\n})\nexport class LookupCustomPickerDemoModule {}\n"
9456
9456
  },
9457
9457
  {
9458
9458
  "fileName": "lookup-multiple-demo.component.html",
@@ -407,7 +407,9 @@ export class SkyAutocompleteComponent {
407
407
  this.currentSearchSub = this.performSearch()
408
408
  .pipe(take(1))
409
409
  .subscribe((result) => {
410
- const items = result.items;
410
+ const items = result.items.filter((item) => {
411
+ return item && this.descriptorProperty in item;
412
+ });
411
413
  this.isSearchingAsync = false;
412
414
  this._searchResults = items.map((r, i) => {
413
415
  const result = {
@@ -480,7 +482,12 @@ export class SkyAutocompleteComponent {
480
482
  * Returns the text to highlight based on exact matches, case-insensitive matches, and matches for corresponding diacritical characters (a will match à).
481
483
  */
482
484
  getHighlightText(searchText) {
483
- const normalizedSearchText = normalizeDiacritics(this.searchText).toLocaleUpperCase();
485
+ const normalizedSearchText = normalizeDiacritics(searchText)
486
+ .toLocaleUpperCase()
487
+ .trim();
488
+ if (!normalizedSearchText) {
489
+ return [];
490
+ }
484
491
  let matchesToHighlight = [];
485
492
  for (let i = 0, n = this._searchResults.length; i < n; i++) {
486
493
  const value = this._searchResults[i].data[this.descriptorProperty]
@@ -1 +1 @@
1
- {"version":3,"file":"autocomplete.component.js","sourceRoot":"","sources":["../../../../../../../../libs/components/lookup/src/lib/modules/autocomplete/autocomplete.component.ts","../../../../../../../../libs/components/lookup/src/lib/modules/autocomplete/autocomplete.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n AfterContentInit,\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChild,\n ElementRef,\n EventEmitter,\n Input,\n OnDestroy,\n Optional,\n Output,\n TemplateRef,\n ViewChild,\n} from '@angular/core';\nimport {\n SkyAffixAutoFitContext,\n SkyAffixService,\n SkyAffixer,\n SkyOverlayInstance,\n SkyOverlayService,\n} from '@skyux/core';\nimport { SkyInputBoxHostService } from '@skyux/forms';\n\nimport {\n Observable,\n Subject,\n Subscription,\n from,\n fromEvent as observableFromEvent,\n of,\n} from 'rxjs';\nimport { debounceTime, map, switchMap, take, takeUntil } from 'rxjs/operators';\n\nimport { normalizeDiacritics } from '../shared/sky-lookup-string-utils';\n\nimport { SkyAutocompleteAdapterService } from './autocomplete-adapter.service';\nimport { skyAutocompleteDefaultSearchFunction } from './autocomplete-default-search-function';\nimport { SkyAutocompleteInputDirective } from './autocomplete-input.directive';\nimport { SkyAutocompleteMessage } from './types/autocomplete-message';\nimport { SkyAutocompleteMessageType } from './types/autocomplete-message-type';\nimport { SkyAutocompleteSearchAsyncArgs } from './types/autocomplete-search-async-args';\nimport { SkyAutocompleteSearchAsyncResult } from './types/autocomplete-search-async-result';\nimport { SkyAutocompleteSearchFunction } from './types/autocomplete-search-function';\nimport { SkyAutocompleteSearchFunctionFilter } from './types/autocomplete-search-function-filter';\nimport { SkyAutocompleteSelectionChange } from './types/autocomplete-selection-change';\nimport { SkyAutocompleteShowMoreArgs } from './types/autocomplete-show-more-args';\n\n/**\n * @internal\n */\ninterface SkyAutocompleteSearchResult {\n elementId: string;\n data: any;\n}\n\nlet uniqueId = 0;\n\n@Component({\n selector: 'sky-autocomplete',\n templateUrl: './autocomplete.component.html',\n styleUrls: ['./autocomplete.component.scss'],\n providers: [SkyAutocompleteAdapterService],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SkyAutocompleteComponent\n implements OnDestroy, AfterContentInit, AfterViewInit\n{\n //#region public_api\n\n /**\n * Specifies the HTML element ID (without the leading `#`) of the element that labels\n * the autocomplete text input. This sets the input's `aria-labelledby` attribute\n * [to support accessibility](https://developer.blackbaud.com/skyux/learn/accessibility).\n */\n @Input()\n public ariaLabelledBy: string;\n\n /**\n * Specifies a static data source for the autocomplete component to search\n * when users enter text. For a dynamic data source such as an array that\n * changes due to server calls, use `search` or `searchAsync` instead.\n */\n @Input()\n public set data(value: any[]) {\n this._data = value;\n }\n\n public get data(): any[] {\n return this._data || [];\n }\n\n /**\n * Specifies how many milliseconds to wait before searching while users\n * enter text in the autocomplete field.\n * @default 0\n */\n @Input()\n public set debounceTime(value: number) {\n this._debounceTime = value;\n }\n\n public get debounceTime(): number {\n return this._debounceTime || 0;\n }\n\n /**\n * Specifies an object property to display in the text input after users\n * select an item in the dropdown list.\n * @default \"name\"\n */\n @Input()\n public set descriptorProperty(value: string) {\n this._descriptorProperty = value;\n }\n\n public get descriptorProperty(): string {\n return this._descriptorProperty || 'name';\n }\n\n /**\n * @internal\n * Indicates whether to display a button in the dropdown that opens a picker where users can view all options.\n */\n @Input()\n public enableShowMore = false;\n\n /**\n * Specifies an observable of `SkyAutocompleteMessage` that can close the dropdown.\n * @internal\n */\n @Input()\n public set messageStream(value: Subject<SkyAutocompleteMessage>) {\n this._messageStream = value;\n this.initMessageStream();\n }\n\n public get messageStream(): Subject<SkyAutocompleteMessage> {\n return this._messageStream;\n }\n\n /**\n * @internal\n */\n @Input()\n public wrapperClass?: string;\n\n /**\n * Specifies the object properties to search.\n * @default [\"name\"]\n */\n @Input()\n public set propertiesToSearch(value: string[]) {\n this._propertiesToSearch = value;\n }\n\n public get propertiesToSearch(): string[] {\n return this._propertiesToSearch || ['name'];\n }\n\n /**\n * Specifies a function to dynamically manage the data source when users\n * change the text in the autocomplete field. The search function must return\n * an array or a promise of an array. The `search` property is particularly\n * useful when the data source does not live in the source code. If the\n * search requires calling a remote data source, use `searchAsync` instead of\n * `search`.\n */\n @Input()\n public set search(value: SkyAutocompleteSearchFunction) {\n this._search = value;\n }\n\n public get search(): SkyAutocompleteSearchFunction {\n return (\n this._search ||\n skyAutocompleteDefaultSearchFunction({\n propertiesToSearch: this.propertiesToSearch,\n searchFilters: this.searchFilters,\n })\n );\n }\n\n /**\n * Specifies a template to format each search result in the dropdown list.\n * The autocomplete component injects search result values into the template\n * as `item` variables that reference all of the object properties of the search results.\n */\n @Input()\n public set searchResultTemplate(value: TemplateRef<any>) {\n this._searchResultTemplate = value;\n }\n\n public get searchResultTemplate(): TemplateRef<any> {\n return this._searchResultTemplate || this.defaultSearchResultTemplate;\n }\n\n /**\n * Specifies the minimum number of characters that users must enter before\n * the autocomplete component searches the data source and displays search\n * results in the dropdown list.\n * @default 1\n */\n @Input()\n public set searchTextMinimumCharacters(value: number) {\n this._searchTextMinimumCharacters = value;\n }\n\n public get searchTextMinimumCharacters(): number {\n return this._searchTextMinimumCharacters > 0\n ? this._searchTextMinimumCharacters\n : 1;\n }\n\n /**\n * Specifies an array of functions to call against each search result in order\n * to filter the search results when using the default search function. When\n * using the `search` property to specify a custom search function, you must\n * manually apply filters inside that function. The function must return `true`\n * or `false` for each result to indicate whether to display it in the dropdown list.\n */\n @Input()\n public searchFilters: SkyAutocompleteSearchFunctionFilter[];\n\n /**\n * Specifies the maximum number of search results to display in the dropdown list.\n * By default, the component displays all matching results.\n */\n @Input()\n public set searchResultsLimit(value: number) {\n this._searchResultsLimit = value;\n }\n\n public get searchResultsLimit(): number {\n if (this._searchResultsLimit) {\n return this._searchResultsLimit;\n } else {\n return this.enableShowMore ? 5 : this._searchResultsLimit;\n }\n }\n\n /**\n * @internal\n * Indicates whether to display a button that lets users add options to the data source.\n */\n @Input()\n public showAddButton = false;\n\n /**\n * Specifies the text to display when no search results are found.\n * @default \"No matches found\"\n */\n @Input()\n public noResultsFoundText: string;\n\n /**\n * @internal\n * Allows async search to be disabled even when a listener is specified for\n * the `searchAsync` output.\n */\n @Input()\n public searchAsyncDisabled = false;\n\n /**\n * @internal\n * Fires when users select the button to add options to the data source.\n */\n @Output()\n public addClick: EventEmitter<void> = new EventEmitter();\n\n /**\n * @internal\n * Fires when users select the button to view all options.\n */\n @Output()\n public showMoreClick: EventEmitter<SkyAutocompleteShowMoreArgs> = new EventEmitter();\n\n /**\n * Fires when users select items in the dropdown list.\n */\n @Output()\n public get selectionChange(): EventEmitter<SkyAutocompleteSelectionChange> {\n return this._selectionChange;\n }\n\n /**\n * Fires when users enter new search information and allows results to be\n * returned via an observable.\n */\n @Output()\n public searchAsync = new EventEmitter<SkyAutocompleteSearchAsyncArgs>();\n\n //#endregion\n\n //#region template_properties\n\n public get searchResults(): SkyAutocompleteSearchResult[] {\n return this._searchResults || [];\n }\n\n public get highlightText(): string[] {\n return this._highlightText || [];\n }\n\n public isOpen = false;\n\n public resultsListId: string;\n\n public resultsWrapperId: string;\n\n public searchText: string;\n\n public get showActionsArea(): boolean {\n return this.showAddButton || this.enableShowMore;\n }\n\n public isSearchingAsync = false;\n\n public searchResultsCount: number | undefined;\n\n //#endregion\n\n @ViewChild('defaultSearchResultTemplate', {\n read: TemplateRef,\n static: false,\n })\n private defaultSearchResultTemplate: TemplateRef<any>;\n\n @ContentChild(SkyAutocompleteInputDirective)\n private set inputDirective(directive: SkyAutocompleteInputDirective) {\n if (this._inputDirective !== directive) {\n if (!directive) {\n throw Error(\n [\n 'The SkyAutocompleteComponent requires a ContentChild input or',\n 'textarea bound with the SkyAutocomplete directive. For example:',\n '`<input type=\"text\" skyAutocomplete>`.',\n ].join(' ')\n );\n }\n\n // Unsubscribe from old subscriptions on any previous input directive\n this.inputDirectiveUnsubscribe.next();\n\n this._inputDirective = directive;\n\n this._inputDirective.displayWith = this.descriptorProperty;\n\n this._inputDirective.textChanges\n .pipe(\n takeUntil(this.inputDirectiveUnsubscribe),\n debounceTime(this.debounceTime),\n switchMap((change) => {\n this.isSearchingAsync = true;\n return of(change);\n })\n )\n .subscribe((change) => {\n this.searchTextChanged(change.value);\n });\n\n this._inputDirective.blur\n .pipe(takeUntil(this.inputDirectiveUnsubscribe))\n .subscribe(() => {\n this.inputDirective.onTouched();\n });\n\n this._inputDirective.focus\n .pipe(takeUntil(this.inputDirectiveUnsubscribe))\n .subscribe(() => {\n if (this.showActionsArea) {\n this.openDropdown();\n }\n });\n }\n }\n\n private get inputDirective(): SkyAutocompleteInputDirective {\n return this._inputDirective;\n }\n\n @ViewChild('resultsTemplateRef', {\n read: TemplateRef,\n })\n private resultsTemplateRef: TemplateRef<any>;\n\n @ViewChild('resultsRef', {\n read: ElementRef,\n })\n private set resultsRef(value: ElementRef) {\n if (value) {\n this._resultsRef = value;\n this.destroyAffixer();\n this.createAffixer();\n }\n }\n\n private get resultsRef(): ElementRef {\n return this._resultsRef;\n }\n\n /**\n * Index that indicates which descendant of the overlay currently has focus.\n */\n private activeElementIndex = -1;\n\n private affixer: SkyAffixer;\n\n private inputDirectiveUnsubscribe = new Subject();\n\n private messageStreamSub: Subscription;\n\n private ngUnsubscribe = new Subject();\n\n private overlay: SkyOverlayInstance;\n\n /**\n * Elements within the autocomplete dropdown that are focusable.\n * These are typically the search results and action buttons, but could also be\n * elements provided in the consumer's own template.\n */\n private overlayFocusableElements: HTMLElement[] = [];\n\n private currentSearchSub: Subscription;\n\n private _data: any[];\n private _debounceTime: number;\n private _descriptorProperty: string;\n private _highlightText: string[];\n private _inputDirective: SkyAutocompleteInputDirective;\n private _messageStream: Subject<SkyAutocompleteMessage>;\n private _propertiesToSearch: string[];\n private _resultsRef: ElementRef;\n private _search: SkyAutocompleteSearchFunction;\n private _searchResults: SkyAutocompleteSearchResult[];\n private _searchResultTemplate: TemplateRef<any>;\n private _searchResultsLimit: number;\n private _searchTextMinimumCharacters: number;\n private _selectionChange = new EventEmitter<SkyAutocompleteSelectionChange>();\n\n constructor(\n private changeDetector: ChangeDetectorRef,\n private elementRef: ElementRef,\n private affixService: SkyAffixService,\n private adapterService: SkyAutocompleteAdapterService,\n private overlayService: SkyOverlayService,\n @Optional() private inputBoxHostSvc?: SkyInputBoxHostService\n ) {\n const id = ++uniqueId;\n this.resultsListId = `sky-autocomplete-list-${id}`;\n this.resultsWrapperId = `sky-autocomplete-wrapper-${id}`;\n }\n\n public ngAfterContentInit(): void {\n if (!this.inputDirective) {\n throw Error(\n [\n 'The SkyAutocompleteComponent requires a ContentChild input or',\n 'textarea bound with the SkyAutocomplete directive. For example:',\n '`<input type=\"text\" skyAutocomplete>`.',\n ].join(' ')\n );\n }\n }\n\n public ngAfterViewInit(): void {\n this.addInputEventListeners();\n }\n\n public ngOnDestroy(): void {\n this.cancelCurrentSearch();\n this.inputDirectiveUnsubscribe.next();\n this.inputDirectiveUnsubscribe.complete();\n this.ngUnsubscribe.next();\n this.ngUnsubscribe.complete();\n this.destroyAffixer();\n this.destroyOverlay();\n }\n\n public addButtonClicked(): void {\n this.addClick.emit();\n this.inputDirective.restoreInputTextValueToPreviousState();\n this.closeDropdown();\n }\n\n public handleKeydown(event: KeyboardEvent): void {\n /* Sanity check */\n /* istanbul ignore else */\n if (event.key) {\n const key = event.key.toLowerCase();\n const activeElement = this.getActiveElement();\n const activeElementId = activeElement?.id;\n const targetIsSearchResult = this.searchResults.find(\n (r) => r.elementId === activeElementId\n );\n\n /* tslint:disable-next-line:switch-default */\n switch (key) {\n case 'enter':\n if (targetIsSearchResult) {\n this.selectSearchResultById(activeElementId);\n\n if (!this.showActionsArea) {\n this.closeDropdown();\n } else {\n this.resetSearch();\n }\n } else {\n if (activeElement) {\n activeElement.click();\n }\n }\n\n event.preventDefault();\n event.stopPropagation();\n break;\n\n case 'tab':\n if (targetIsSearchResult) {\n this.selectSearchResultById(activeElementId);\n } else {\n this.inputDirective.restoreInputTextValueToPreviousState();\n }\n\n this.closeDropdown();\n break;\n\n case 'escape':\n this.closeDropdown();\n break;\n\n case 'arrowdown':\n case 'down':\n this.removeFocusedClass();\n if (\n this.activeElementIndex ===\n this.overlayFocusableElements.length - 1 ||\n this.activeElementIndex === -1\n ) {\n this.activeElementIndex = 0;\n } else {\n this.activeElementIndex = this.activeElementIndex + 1;\n }\n this.addFocusedClass();\n this.changeDetector.markForCheck();\n event.preventDefault();\n event.stopPropagation();\n break;\n\n case 'arrowup':\n case 'up':\n this.removeFocusedClass();\n if (this.activeElementIndex <= 0) {\n this.activeElementIndex = this.overlayFocusableElements.length - 1;\n } else {\n this.activeElementIndex = this.activeElementIndex - 1;\n }\n this.addFocusedClass();\n this.changeDetector.markForCheck();\n event.preventDefault();\n event.stopPropagation();\n break;\n }\n }\n }\n\n public moreButtonClicked(): void {\n this.showMoreClick.emit({ inputValue: this.searchText });\n this.inputDirective.restoreInputTextValueToPreviousState();\n this.closeDropdown();\n }\n\n public onResultMouseDown(id: string, event: MouseEvent): void {\n this.selectSearchResultById(id);\n\n if (!this.showActionsArea) {\n this.closeDropdown();\n } else {\n this.resetSearch();\n }\n\n event.preventDefault();\n event.stopPropagation();\n }\n\n public onResultMouseMove(id: number): void {\n if (id !== this.activeElementIndex) {\n this.removeFocusedClass();\n this.activeElementIndex = id;\n this.addFocusedClass();\n this.changeDetector.markForCheck();\n }\n }\n\n public isElementFocused(ref: HTMLElement): boolean {\n return ref === this.overlayFocusableElements[this.activeElementIndex];\n }\n\n private searchTextChanged(searchText: string): void {\n const isEmpty =\n !searchText || !searchText.trim() || searchText.match(/^\\s+$/);\n\n if (isEmpty) {\n // Emit selectionChange if value has been cleared.\n if (this.inputDirective.value) {\n this.inputDirective.value = undefined;\n this.selectionChange.emit({\n selectedItem: undefined,\n });\n }\n\n if (!this.showActionsArea) {\n this.closeDropdown();\n } else {\n this.resetSearch();\n }\n\n this.isSearchingAsync = false;\n this.changeDetector.markForCheck();\n\n return;\n }\n\n const isLongEnough = searchText.length >= this.searchTextMinimumCharacters;\n const isDifferent = searchText !== this.searchText;\n\n this.searchText = searchText.trim();\n\n if (isLongEnough && isDifferent) {\n this.cancelCurrentSearch();\n\n this.currentSearchSub = this.performSearch()\n .pipe(take(1))\n .subscribe((result) => {\n const items = result.items;\n\n this.isSearchingAsync = false;\n\n this._searchResults = items.map((r, i) => {\n const result: SkyAutocompleteSearchResult = {\n elementId: `${this.resultsListId}-item-${i}`,\n data: r,\n };\n return result;\n });\n\n this.searchResultsCount = result.totalCount;\n\n this._highlightText = this.getHighlightText(this.searchText);\n this.removeFocusedClass();\n this.removeActiveDescendant();\n if (this.searchResults.length > 0) {\n this.activeElementIndex = 0;\n } else {\n this.activeElementIndex = -1;\n }\n\n this.changeDetector.markForCheck();\n\n if (this.isOpen) {\n // Let the results populate in the DOM before recalculating placement.\n setTimeout(() => {\n this.affixer.reaffix();\n this.changeDetector.detectChanges();\n this.initOverlayFocusableElements();\n });\n } else {\n this.openDropdown();\n this.changeDetector.markForCheck();\n }\n });\n } else {\n this.isSearchingAsync = false;\n this.changeDetector.markForCheck();\n }\n }\n\n private performSearch(): Observable<SkyAutocompleteSearchAsyncResult> {\n if (!this.searchAsyncDisabled && this.searchAsync.observers.length > 0) {\n const searchAsyncArgs: SkyAutocompleteSearchAsyncArgs = {\n displayType: 'popover',\n offset: 0,\n searchText: this.searchText,\n };\n\n this.searchAsync.emit(searchAsyncArgs);\n\n return searchAsyncArgs.result;\n }\n\n const result = this.search(this.searchText, this.data);\n\n if (result instanceof Array) {\n return of({\n items: result,\n totalCount: result.length,\n });\n }\n\n return from(result).pipe(\n map((items) => {\n return {\n items,\n totalCount: items.length,\n };\n })\n );\n }\n\n private cancelCurrentSearch(): void {\n if (this.currentSearchSub) {\n this.currentSearchSub.unsubscribe();\n this.currentSearchSub = undefined;\n }\n }\n\n /**\n * Returns the text to highlight based on exact matches, case-insensitive matches, and matches for corresponding diacritical characters (a will match à).\n */\n private getHighlightText(searchText: string): string[] {\n const normalizedSearchText = normalizeDiacritics(\n this.searchText\n ).toLocaleUpperCase();\n\n let matchesToHighlight: string[] = [];\n for (let i = 0, n = this._searchResults.length; i < n; i++) {\n const value = this._searchResults[i].data[this.descriptorProperty]\n .toString()\n .toLocaleUpperCase() as string;\n const normalizedDataValue = normalizeDiacritics(value);\n\n let offset = 0;\n let index: number;\n while (\n (index = normalizedDataValue.indexOf(normalizedSearchText, offset)) > -1\n ) {\n const matchedString = value.slice(index, index + searchText.length);\n offset = index + searchText.length;\n matchesToHighlight = matchesToHighlight.concat(matchedString);\n }\n }\n\n // Remove any duplicates from the array.\n return [...new Set(matchesToHighlight)];\n }\n\n private selectSearchResultById(id: string): void {\n const result = this.searchResults.find((r) => r.elementId === id).data;\n /* Sanity check */\n /* istanbul ignore else */\n if (result) {\n this.searchText = result[this.descriptorProperty];\n this.inputDirective.value = result;\n this.selectionChange.emit({\n selectedItem: result,\n });\n }\n }\n\n private openDropdown(): void {\n if (!this.overlay) {\n const overlay = this.overlayService.create({\n enableClose: false,\n enablePointerEvents: true,\n wrapperClass: this.wrapperClass,\n });\n\n overlay.attachTemplate(this.resultsTemplateRef);\n\n this.overlay = overlay;\n this.isOpen = true;\n this.changeDetector.markForCheck();\n this.initOverlayFocusableElements();\n\n overlay.backdropClick\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(() => {\n /* Sanity check as you should not be able to active the directive from the backdrop */\n /* istanbul ignore else */\n if (document.activeElement !== this.inputDirective.inputElement) {\n this.inputDirective.restoreInputTextValueToPreviousState();\n this.closeDropdown();\n }\n });\n }\n }\n\n private closeDropdown(): void {\n this.resetSearch();\n this.isOpen = false;\n this.destroyOverlay();\n this.removeActiveDescendant();\n this.changeDetector.markForCheck();\n }\n\n private setActiveDescendant(): void {\n const activeElement =\n this.overlayFocusableElements[this.activeElementIndex];\n /* Sanity check */\n /* istanbul ignore else */\n if (activeElement) {\n this.inputDirective.setActiveDescendant(activeElement.id);\n }\n }\n\n private removeActiveDescendant(): void {\n /* tslint:disable-next-line:no-null-keyword */\n this.inputDirective.setActiveDescendant(null);\n }\n\n private resetSearch(): void {\n this._searchResults = [];\n this.searchText = '';\n this._highlightText = [];\n this.activeElementIndex = -1;\n this.searchResultsCount = undefined;\n this.removeActiveDescendant();\n this.initOverlayFocusableElements();\n this.changeDetector.markForCheck();\n }\n\n private addInputEventListeners(): void {\n const element = this.elementRef.nativeElement;\n\n observableFromEvent(element, 'keydown')\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe((event: KeyboardEvent) => {\n this.handleKeydown(event);\n });\n\n observableFromEvent(window, 'resize')\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(() => {\n /* istanbul ignore else */\n if (this.isOpen) {\n this.adapterService.setDropdownWidth(\n this.elementRef,\n this.resultsRef,\n !!this.inputBoxHostSvc\n );\n }\n });\n }\n\n private destroyOverlay(): void {\n if (this.overlay) {\n this.overlayService.close(this.overlay);\n this.overlay = undefined;\n }\n }\n\n private createAffixer(): void {\n /* Sanity check */\n /* istanbul ignore else */\n if (!this.affixer) {\n const affixer = this.affixService.createAffixer(this.resultsRef);\n\n this.adapterService.setDropdownWidth(\n this.elementRef,\n this.resultsRef,\n !!this.inputBoxHostSvc\n );\n\n affixer.affixTo(this.elementRef.nativeElement, {\n autoFitContext: SkyAffixAutoFitContext.Viewport,\n enableAutoFit: true,\n isSticky: true,\n placement: 'below',\n horizontalAlignment: 'left',\n });\n\n this.affixer = affixer;\n }\n }\n\n private destroyAffixer(): void {\n if (this.affixer) {\n this.affixer.destroy();\n this.affixer = undefined;\n }\n }\n\n private initMessageStream(): void {\n /* istanbul ignore if */\n if (this.messageStreamSub) {\n this.messageStreamSub.unsubscribe();\n }\n\n if (this.messageStream) {\n this.messageStreamSub = this.messageStream\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe((message: SkyAutocompleteMessage) => {\n /* tslint:disable-next-line:switch-default */\n switch (message.type) {\n case SkyAutocompleteMessageType.CloseDropdown:\n this.closeDropdown();\n break;\n case SkyAutocompleteMessageType.RepositionDropdown:\n // Settimeout waits for changes in DOM (e.g., tokens being removed)\n setTimeout(() => {\n /* istanbul ignore else */\n if (this.affixer) {\n this.affixer.reaffix();\n }\n });\n break;\n }\n });\n }\n }\n\n private initOverlayFocusableElements(): void {\n // Wait for dropdown elements to render.\n setTimeout(() => {\n if (this.overlay) {\n this.overlayFocusableElements =\n this.adapterService.getOverlayFocusableElements(this.overlay);\n this.overlayFocusableElements.forEach((el) => {\n this.adapterService.setTabIndex(el, -1);\n });\n this.addFocusedClass();\n }\n });\n }\n\n private getActiveElement(): HTMLElement {\n return this.overlayFocusableElements[this.activeElementIndex];\n }\n\n private removeFocusedClass(): void {\n if (this.activeElementIndex > -1) {\n this.adapterService.removeCSSClass(\n this.overlayFocusableElements[this.activeElementIndex],\n 'sky-autocomplete-descendant-focus'\n );\n }\n }\n\n private addFocusedClass(): void {\n if (this.activeElementIndex > -1) {\n this.adapterService.addCSSClass(\n this.overlayFocusableElements[this.activeElementIndex],\n 'sky-autocomplete-descendant-focus'\n );\n this.setActiveDescendant();\n }\n }\n}\n","<div\n aria-autocomplete=\"list\"\n aria-haspopup=\"listbox\"\n class=\"sky-autocomplete\"\n role=\"combobox\"\n [attr.aria-expanded]=\"isOpen && searchText\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.aria-owns]=\"isOpen ? resultsListId : null\"\n [attr.id]=\"resultsWrapperId\"\n>\n <ng-content></ng-content>\n</div>\n\n<ng-template #resultsTemplateRef>\n <div\n class=\"sky-autocomplete-results-container\"\n [skyThemeClass]=\"{\n 'sky-shadow': 'default',\n 'sky-elevation-4': 'modern'\n }\"\n (keydown)=\"handleKeydown($event)\"\n #resultsRef\n >\n <div\n *ngIf=\"isSearchingAsync; else resultControlsTemplateRef\"\n class=\"sky-autocomplete-results-waiting\"\n >\n <sky-wait [isWaiting]=\"true\"></sky-wait>\n </div>\n </div>\n</ng-template>\n\n<ng-template #resultControlsTemplateRef>\n <div\n *ngIf=\"searchText && (!showActionsArea || searchResults.length > 0)\"\n class=\"sky-autocomplete-results\"\n role=\"listbox\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.id]=\"resultsListId\"\n >\n <ng-container *ngFor=\"let result of searchResults; let i = index\">\n <div\n *ngIf=\"!searchResultsLimit || i < searchResultsLimit\"\n class=\"sky-autocomplete-result\"\n role=\"option\"\n tabindex=\"0\"\n [attr.aria-selected]=\"isElementFocused(searchResultEl)\"\n [attr.id]=\"result.elementId\"\n [skyHighlight]=\"highlightText\"\n (mousedown)=\"onResultMouseDown(result.elementId, $event)\"\n (mousemove)=\"onResultMouseMove(i)\"\n #searchResultEl\n >\n <ng-container\n *ngTemplateOutlet=\"\n searchResultTemplate;\n context: { item: result.data }\n \"\n >\n </ng-container>\n </div>\n </ng-container>\n <div\n *ngIf=\"searchResults.length === 0\"\n class=\"sky-deemphasized sky-padding-squish-default\"\n >\n {{\n noResultsFoundText ||\n ('skyux_autocomplete_no_results' | skyLibResources)\n }}\n </div>\n </div>\n <div *ngIf=\"showActionsArea\" class=\"sky-autocomplete-actions\">\n <button\n *ngIf=\"enableShowMore && (!searchText || searchResults.length > 0)\"\n class=\"\n sky-autocomplete-action\n sky-autocomplete-action-more\n sky-btn\n sky-btn-link\n \"\n type=\"button\"\n (click)=\"moreButtonClicked()\"\n >\n <ng-container\n *ngIf=\"\n !(\n searchAsync\n | skyAutocompleteSearchAsyncDisabled: searchAsyncDisabled\n ) &&\n searchResults.length === 0 &&\n !searchText\n \"\n >\n {{ 'skyux_autocomplete_show_all' | skyLibResources }}\n </ng-container>\n <ng-container\n *ngIf=\"\n (searchAsync\n | skyAutocompleteSearchAsyncDisabled: searchAsyncDisabled) &&\n !searchText\n \"\n >\n {{\n 'skyux_autocomplete_show_all_count'\n | skyLibResources: (data.length | skyNumeric: { truncate: false })\n }}\n </ng-container>\n <ng-container *ngIf=\"searchText\">\n {{\n 'skyux_autocomplete_show_matches_count'\n | skyLibResources\n : (searchResultsCount === undefined\n ? data.length\n : (searchResultsCount | skyNumeric: { truncate: false }))\n }}\n </ng-container>\n </button>\n <div\n *ngIf=\"searchText && searchResults.length === 0\"\n class=\"sky-font-deemphasized sky-autocomplete-actions-no-results\"\n >\n {{\n noResultsFoundText ||\n ('skyux_autocomplete_no_results' | skyLibResources)\n }}\n </div>\n <button\n *ngIf=\"showAddButton\"\n class=\"\n sky-autocomplete-action sky-autocomplete-action-add sky-btn sky-btn-link\n \"\n tabindex=\"0\"\n type=\"button\"\n [class.focused]=\"isElementFocused(addButtonEl)\"\n (click)=\"addButtonClicked()\"\n #addButtonEl\n >\n <sky-icon *skyThemeIf=\"'modern'\" icon=\"add\" iconType=\"skyux\"></sky-icon>\n <sky-icon *skyThemeIf=\"'default'\" icon=\"plus-circle\"></sky-icon>\n {{ 'skyux_autocomplete_add' | skyLibResources }}\n </button>\n </div>\n</ng-template>\n\n<ng-template let-item=\"item\" #defaultSearchResultTemplate>\n {{ item[descriptorProperty] }}\n</ng-template>\n"]}
1
+ {"version":3,"file":"autocomplete.component.js","sourceRoot":"","sources":["../../../../../../../../libs/components/lookup/src/lib/modules/autocomplete/autocomplete.component.ts","../../../../../../../../libs/components/lookup/src/lib/modules/autocomplete/autocomplete.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n AfterContentInit,\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChild,\n ElementRef,\n EventEmitter,\n Input,\n OnDestroy,\n Optional,\n Output,\n TemplateRef,\n ViewChild,\n} from '@angular/core';\nimport {\n SkyAffixAutoFitContext,\n SkyAffixService,\n SkyAffixer,\n SkyOverlayInstance,\n SkyOverlayService,\n} from '@skyux/core';\nimport { SkyInputBoxHostService } from '@skyux/forms';\n\nimport {\n Observable,\n Subject,\n Subscription,\n from,\n fromEvent as observableFromEvent,\n of,\n} from 'rxjs';\nimport { debounceTime, map, switchMap, take, takeUntil } from 'rxjs/operators';\n\nimport { normalizeDiacritics } from '../shared/sky-lookup-string-utils';\n\nimport { SkyAutocompleteAdapterService } from './autocomplete-adapter.service';\nimport { skyAutocompleteDefaultSearchFunction } from './autocomplete-default-search-function';\nimport { SkyAutocompleteInputDirective } from './autocomplete-input.directive';\nimport { SkyAutocompleteMessage } from './types/autocomplete-message';\nimport { SkyAutocompleteMessageType } from './types/autocomplete-message-type';\nimport { SkyAutocompleteSearchAsyncArgs } from './types/autocomplete-search-async-args';\nimport { SkyAutocompleteSearchAsyncResult } from './types/autocomplete-search-async-result';\nimport { SkyAutocompleteSearchFunction } from './types/autocomplete-search-function';\nimport { SkyAutocompleteSearchFunctionFilter } from './types/autocomplete-search-function-filter';\nimport { SkyAutocompleteSelectionChange } from './types/autocomplete-selection-change';\nimport { SkyAutocompleteShowMoreArgs } from './types/autocomplete-show-more-args';\n\n/**\n * @internal\n */\ninterface SkyAutocompleteSearchResult {\n elementId: string;\n data: any;\n}\n\nlet uniqueId = 0;\n\n@Component({\n selector: 'sky-autocomplete',\n templateUrl: './autocomplete.component.html',\n styleUrls: ['./autocomplete.component.scss'],\n providers: [SkyAutocompleteAdapterService],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SkyAutocompleteComponent\n implements OnDestroy, AfterContentInit, AfterViewInit\n{\n //#region public_api\n\n /**\n * Specifies the HTML element ID (without the leading `#`) of the element that labels\n * the autocomplete text input. This sets the input's `aria-labelledby` attribute\n * [to support accessibility](https://developer.blackbaud.com/skyux/learn/accessibility).\n */\n @Input()\n public ariaLabelledBy: string;\n\n /**\n * Specifies a static data source for the autocomplete component to search\n * when users enter text. For a dynamic data source such as an array that\n * changes due to server calls, use `search` or `searchAsync` instead.\n */\n @Input()\n public set data(value: any[]) {\n this._data = value;\n }\n\n public get data(): any[] {\n return this._data || [];\n }\n\n /**\n * Specifies how many milliseconds to wait before searching while users\n * enter text in the autocomplete field.\n * @default 0\n */\n @Input()\n public set debounceTime(value: number) {\n this._debounceTime = value;\n }\n\n public get debounceTime(): number {\n return this._debounceTime || 0;\n }\n\n /**\n * Specifies an object property to display in the text input after users\n * select an item in the dropdown list.\n * @default \"name\"\n */\n @Input()\n public set descriptorProperty(value: string) {\n this._descriptorProperty = value;\n }\n\n public get descriptorProperty(): string {\n return this._descriptorProperty || 'name';\n }\n\n /**\n * @internal\n * Indicates whether to display a button in the dropdown that opens a picker where users can view all options.\n */\n @Input()\n public enableShowMore = false;\n\n /**\n * Specifies an observable of `SkyAutocompleteMessage` that can close the dropdown.\n * @internal\n */\n @Input()\n public set messageStream(value: Subject<SkyAutocompleteMessage>) {\n this._messageStream = value;\n this.initMessageStream();\n }\n\n public get messageStream(): Subject<SkyAutocompleteMessage> {\n return this._messageStream;\n }\n\n /**\n * @internal\n */\n @Input()\n public wrapperClass?: string;\n\n /**\n * Specifies the object properties to search.\n * @default [\"name\"]\n */\n @Input()\n public set propertiesToSearch(value: string[]) {\n this._propertiesToSearch = value;\n }\n\n public get propertiesToSearch(): string[] {\n return this._propertiesToSearch || ['name'];\n }\n\n /**\n * Specifies a function to dynamically manage the data source when users\n * change the text in the autocomplete field. The search function must return\n * an array or a promise of an array. The `search` property is particularly\n * useful when the data source does not live in the source code. If the\n * search requires calling a remote data source, use `searchAsync` instead of\n * `search`.\n */\n @Input()\n public set search(value: SkyAutocompleteSearchFunction) {\n this._search = value;\n }\n\n public get search(): SkyAutocompleteSearchFunction {\n return (\n this._search ||\n skyAutocompleteDefaultSearchFunction({\n propertiesToSearch: this.propertiesToSearch,\n searchFilters: this.searchFilters,\n })\n );\n }\n\n /**\n * Specifies a template to format each search result in the dropdown list.\n * The autocomplete component injects search result values into the template\n * as `item` variables that reference all of the object properties of the search results.\n */\n @Input()\n public set searchResultTemplate(value: TemplateRef<any>) {\n this._searchResultTemplate = value;\n }\n\n public get searchResultTemplate(): TemplateRef<any> {\n return this._searchResultTemplate || this.defaultSearchResultTemplate;\n }\n\n /**\n * Specifies the minimum number of characters that users must enter before\n * the autocomplete component searches the data source and displays search\n * results in the dropdown list.\n * @default 1\n */\n @Input()\n public set searchTextMinimumCharacters(value: number) {\n this._searchTextMinimumCharacters = value;\n }\n\n public get searchTextMinimumCharacters(): number {\n return this._searchTextMinimumCharacters > 0\n ? this._searchTextMinimumCharacters\n : 1;\n }\n\n /**\n * Specifies an array of functions to call against each search result in order\n * to filter the search results when using the default search function. When\n * using the `search` property to specify a custom search function, you must\n * manually apply filters inside that function. The function must return `true`\n * or `false` for each result to indicate whether to display it in the dropdown list.\n */\n @Input()\n public searchFilters: SkyAutocompleteSearchFunctionFilter[];\n\n /**\n * Specifies the maximum number of search results to display in the dropdown list.\n * By default, the component displays all matching results.\n */\n @Input()\n public set searchResultsLimit(value: number) {\n this._searchResultsLimit = value;\n }\n\n public get searchResultsLimit(): number {\n if (this._searchResultsLimit) {\n return this._searchResultsLimit;\n } else {\n return this.enableShowMore ? 5 : this._searchResultsLimit;\n }\n }\n\n /**\n * @internal\n * Indicates whether to display a button that lets users add options to the data source.\n */\n @Input()\n public showAddButton = false;\n\n /**\n * Specifies the text to display when no search results are found.\n * @default \"No matches found\"\n */\n @Input()\n public noResultsFoundText: string;\n\n /**\n * @internal\n * Allows async search to be disabled even when a listener is specified for\n * the `searchAsync` output.\n */\n @Input()\n public searchAsyncDisabled = false;\n\n /**\n * @internal\n * Fires when users select the button to add options to the data source.\n */\n @Output()\n public addClick: EventEmitter<void> = new EventEmitter();\n\n /**\n * @internal\n * Fires when users select the button to view all options.\n */\n @Output()\n public showMoreClick: EventEmitter<SkyAutocompleteShowMoreArgs> = new EventEmitter();\n\n /**\n * Fires when users select items in the dropdown list.\n */\n @Output()\n public get selectionChange(): EventEmitter<SkyAutocompleteSelectionChange> {\n return this._selectionChange;\n }\n\n /**\n * Fires when users enter new search information and allows results to be\n * returned via an observable.\n */\n @Output()\n public searchAsync = new EventEmitter<SkyAutocompleteSearchAsyncArgs>();\n\n //#endregion\n\n //#region template_properties\n\n public get searchResults(): SkyAutocompleteSearchResult[] {\n return this._searchResults || [];\n }\n\n public get highlightText(): string[] {\n return this._highlightText || [];\n }\n\n public isOpen = false;\n\n public resultsListId: string;\n\n public resultsWrapperId: string;\n\n public searchText: string;\n\n public get showActionsArea(): boolean {\n return this.showAddButton || this.enableShowMore;\n }\n\n public isSearchingAsync = false;\n\n public searchResultsCount: number | undefined;\n\n //#endregion\n\n @ViewChild('defaultSearchResultTemplate', {\n read: TemplateRef,\n static: false,\n })\n private defaultSearchResultTemplate: TemplateRef<any>;\n\n @ContentChild(SkyAutocompleteInputDirective)\n private set inputDirective(directive: SkyAutocompleteInputDirective) {\n if (this._inputDirective !== directive) {\n if (!directive) {\n throw Error(\n [\n 'The SkyAutocompleteComponent requires a ContentChild input or',\n 'textarea bound with the SkyAutocomplete directive. For example:',\n '`<input type=\"text\" skyAutocomplete>`.',\n ].join(' ')\n );\n }\n\n // Unsubscribe from old subscriptions on any previous input directive\n this.inputDirectiveUnsubscribe.next();\n\n this._inputDirective = directive;\n\n this._inputDirective.displayWith = this.descriptorProperty;\n\n this._inputDirective.textChanges\n .pipe(\n takeUntil(this.inputDirectiveUnsubscribe),\n debounceTime(this.debounceTime),\n switchMap((change) => {\n this.isSearchingAsync = true;\n return of(change);\n })\n )\n .subscribe((change) => {\n this.searchTextChanged(change.value);\n });\n\n this._inputDirective.blur\n .pipe(takeUntil(this.inputDirectiveUnsubscribe))\n .subscribe(() => {\n this.inputDirective.onTouched();\n });\n\n this._inputDirective.focus\n .pipe(takeUntil(this.inputDirectiveUnsubscribe))\n .subscribe(() => {\n if (this.showActionsArea) {\n this.openDropdown();\n }\n });\n }\n }\n\n private get inputDirective(): SkyAutocompleteInputDirective {\n return this._inputDirective;\n }\n\n @ViewChild('resultsTemplateRef', {\n read: TemplateRef,\n })\n private resultsTemplateRef: TemplateRef<any>;\n\n @ViewChild('resultsRef', {\n read: ElementRef,\n })\n private set resultsRef(value: ElementRef) {\n if (value) {\n this._resultsRef = value;\n this.destroyAffixer();\n this.createAffixer();\n }\n }\n\n private get resultsRef(): ElementRef {\n return this._resultsRef;\n }\n\n /**\n * Index that indicates which descendant of the overlay currently has focus.\n */\n private activeElementIndex = -1;\n\n private affixer: SkyAffixer;\n\n private inputDirectiveUnsubscribe = new Subject();\n\n private messageStreamSub: Subscription;\n\n private ngUnsubscribe = new Subject();\n\n private overlay: SkyOverlayInstance;\n\n /**\n * Elements within the autocomplete dropdown that are focusable.\n * These are typically the search results and action buttons, but could also be\n * elements provided in the consumer's own template.\n */\n private overlayFocusableElements: HTMLElement[] = [];\n\n private currentSearchSub: Subscription;\n\n private _data: any[];\n private _debounceTime: number;\n private _descriptorProperty: string;\n private _highlightText: string[];\n private _inputDirective: SkyAutocompleteInputDirective;\n private _messageStream: Subject<SkyAutocompleteMessage>;\n private _propertiesToSearch: string[];\n private _resultsRef: ElementRef;\n private _search: SkyAutocompleteSearchFunction;\n private _searchResults: SkyAutocompleteSearchResult[];\n private _searchResultTemplate: TemplateRef<any>;\n private _searchResultsLimit: number;\n private _searchTextMinimumCharacters: number;\n private _selectionChange = new EventEmitter<SkyAutocompleteSelectionChange>();\n\n constructor(\n private changeDetector: ChangeDetectorRef,\n private elementRef: ElementRef,\n private affixService: SkyAffixService,\n private adapterService: SkyAutocompleteAdapterService,\n private overlayService: SkyOverlayService,\n @Optional() private inputBoxHostSvc?: SkyInputBoxHostService\n ) {\n const id = ++uniqueId;\n this.resultsListId = `sky-autocomplete-list-${id}`;\n this.resultsWrapperId = `sky-autocomplete-wrapper-${id}`;\n }\n\n public ngAfterContentInit(): void {\n if (!this.inputDirective) {\n throw Error(\n [\n 'The SkyAutocompleteComponent requires a ContentChild input or',\n 'textarea bound with the SkyAutocomplete directive. For example:',\n '`<input type=\"text\" skyAutocomplete>`.',\n ].join(' ')\n );\n }\n }\n\n public ngAfterViewInit(): void {\n this.addInputEventListeners();\n }\n\n public ngOnDestroy(): void {\n this.cancelCurrentSearch();\n this.inputDirectiveUnsubscribe.next();\n this.inputDirectiveUnsubscribe.complete();\n this.ngUnsubscribe.next();\n this.ngUnsubscribe.complete();\n this.destroyAffixer();\n this.destroyOverlay();\n }\n\n public addButtonClicked(): void {\n this.addClick.emit();\n this.inputDirective.restoreInputTextValueToPreviousState();\n this.closeDropdown();\n }\n\n public handleKeydown(event: KeyboardEvent): void {\n /* Sanity check */\n /* istanbul ignore else */\n if (event.key) {\n const key = event.key.toLowerCase();\n const activeElement = this.getActiveElement();\n const activeElementId = activeElement?.id;\n const targetIsSearchResult = this.searchResults.find(\n (r) => r.elementId === activeElementId\n );\n\n /* tslint:disable-next-line:switch-default */\n switch (key) {\n case 'enter':\n if (targetIsSearchResult) {\n this.selectSearchResultById(activeElementId);\n\n if (!this.showActionsArea) {\n this.closeDropdown();\n } else {\n this.resetSearch();\n }\n } else {\n if (activeElement) {\n activeElement.click();\n }\n }\n\n event.preventDefault();\n event.stopPropagation();\n break;\n\n case 'tab':\n if (targetIsSearchResult) {\n this.selectSearchResultById(activeElementId);\n } else {\n this.inputDirective.restoreInputTextValueToPreviousState();\n }\n\n this.closeDropdown();\n break;\n\n case 'escape':\n this.closeDropdown();\n break;\n\n case 'arrowdown':\n case 'down':\n this.removeFocusedClass();\n if (\n this.activeElementIndex ===\n this.overlayFocusableElements.length - 1 ||\n this.activeElementIndex === -1\n ) {\n this.activeElementIndex = 0;\n } else {\n this.activeElementIndex = this.activeElementIndex + 1;\n }\n this.addFocusedClass();\n this.changeDetector.markForCheck();\n event.preventDefault();\n event.stopPropagation();\n break;\n\n case 'arrowup':\n case 'up':\n this.removeFocusedClass();\n if (this.activeElementIndex <= 0) {\n this.activeElementIndex = this.overlayFocusableElements.length - 1;\n } else {\n this.activeElementIndex = this.activeElementIndex - 1;\n }\n this.addFocusedClass();\n this.changeDetector.markForCheck();\n event.preventDefault();\n event.stopPropagation();\n break;\n }\n }\n }\n\n public moreButtonClicked(): void {\n this.showMoreClick.emit({ inputValue: this.searchText });\n this.inputDirective.restoreInputTextValueToPreviousState();\n this.closeDropdown();\n }\n\n public onResultMouseDown(id: string, event: MouseEvent): void {\n this.selectSearchResultById(id);\n\n if (!this.showActionsArea) {\n this.closeDropdown();\n } else {\n this.resetSearch();\n }\n\n event.preventDefault();\n event.stopPropagation();\n }\n\n public onResultMouseMove(id: number): void {\n if (id !== this.activeElementIndex) {\n this.removeFocusedClass();\n this.activeElementIndex = id;\n this.addFocusedClass();\n this.changeDetector.markForCheck();\n }\n }\n\n public isElementFocused(ref: HTMLElement): boolean {\n return ref === this.overlayFocusableElements[this.activeElementIndex];\n }\n\n private searchTextChanged(searchText: string): void {\n const isEmpty =\n !searchText || !searchText.trim() || searchText.match(/^\\s+$/);\n\n if (isEmpty) {\n // Emit selectionChange if value has been cleared.\n if (this.inputDirective.value) {\n this.inputDirective.value = undefined;\n this.selectionChange.emit({\n selectedItem: undefined,\n });\n }\n\n if (!this.showActionsArea) {\n this.closeDropdown();\n } else {\n this.resetSearch();\n }\n\n this.isSearchingAsync = false;\n this.changeDetector.markForCheck();\n\n return;\n }\n\n const isLongEnough = searchText.length >= this.searchTextMinimumCharacters;\n const isDifferent = searchText !== this.searchText;\n\n this.searchText = searchText.trim();\n\n if (isLongEnough && isDifferent) {\n this.cancelCurrentSearch();\n\n this.currentSearchSub = this.performSearch()\n .pipe(take(1))\n .subscribe((result) => {\n const items = result.items.filter((item: never) => {\n return item && this.descriptorProperty in item;\n });\n\n this.isSearchingAsync = false;\n\n this._searchResults = items.map((r, i) => {\n const result: SkyAutocompleteSearchResult = {\n elementId: `${this.resultsListId}-item-${i}`,\n data: r,\n };\n return result;\n });\n\n this.searchResultsCount = result.totalCount;\n\n this._highlightText = this.getHighlightText(this.searchText);\n this.removeFocusedClass();\n this.removeActiveDescendant();\n if (this.searchResults.length > 0) {\n this.activeElementIndex = 0;\n } else {\n this.activeElementIndex = -1;\n }\n\n this.changeDetector.markForCheck();\n\n if (this.isOpen) {\n // Let the results populate in the DOM before recalculating placement.\n setTimeout(() => {\n this.affixer.reaffix();\n this.changeDetector.detectChanges();\n this.initOverlayFocusableElements();\n });\n } else {\n this.openDropdown();\n this.changeDetector.markForCheck();\n }\n });\n } else {\n this.isSearchingAsync = false;\n this.changeDetector.markForCheck();\n }\n }\n\n private performSearch(): Observable<SkyAutocompleteSearchAsyncResult> {\n if (!this.searchAsyncDisabled && this.searchAsync.observers.length > 0) {\n const searchAsyncArgs: SkyAutocompleteSearchAsyncArgs = {\n displayType: 'popover',\n offset: 0,\n searchText: this.searchText,\n };\n\n this.searchAsync.emit(searchAsyncArgs);\n\n return searchAsyncArgs.result;\n }\n\n const result = this.search(this.searchText, this.data);\n\n if (result instanceof Array) {\n return of({\n items: result,\n totalCount: result.length,\n });\n }\n\n return from(result).pipe(\n map((items) => {\n return {\n items,\n totalCount: items.length,\n };\n })\n );\n }\n\n private cancelCurrentSearch(): void {\n if (this.currentSearchSub) {\n this.currentSearchSub.unsubscribe();\n this.currentSearchSub = undefined;\n }\n }\n\n /**\n * Returns the text to highlight based on exact matches, case-insensitive matches, and matches for corresponding diacritical characters (a will match à).\n */\n private getHighlightText(searchText: string): string[] {\n const normalizedSearchText = normalizeDiacritics(searchText)\n .toLocaleUpperCase()\n .trim();\n if (!normalizedSearchText) {\n return [];\n }\n\n let matchesToHighlight: string[] = [];\n for (let i = 0, n = this._searchResults.length; i < n; i++) {\n const value = this._searchResults[i].data[this.descriptorProperty]\n .toString()\n .toLocaleUpperCase() as string;\n const normalizedDataValue = normalizeDiacritics(value);\n\n let offset = 0;\n let index: number;\n while (\n (index = normalizedDataValue.indexOf(normalizedSearchText, offset)) > -1\n ) {\n const matchedString = value.slice(index, index + searchText.length);\n offset = index + searchText.length;\n matchesToHighlight = matchesToHighlight.concat(matchedString);\n }\n }\n\n // Remove any duplicates from the array.\n return [...new Set(matchesToHighlight)];\n }\n\n private selectSearchResultById(id: string): void {\n const result = this.searchResults.find((r) => r.elementId === id).data;\n /* Sanity check */\n /* istanbul ignore else */\n if (result) {\n this.searchText = result[this.descriptorProperty];\n this.inputDirective.value = result;\n this.selectionChange.emit({\n selectedItem: result,\n });\n }\n }\n\n private openDropdown(): void {\n if (!this.overlay) {\n const overlay = this.overlayService.create({\n enableClose: false,\n enablePointerEvents: true,\n wrapperClass: this.wrapperClass,\n });\n\n overlay.attachTemplate(this.resultsTemplateRef);\n\n this.overlay = overlay;\n this.isOpen = true;\n this.changeDetector.markForCheck();\n this.initOverlayFocusableElements();\n\n overlay.backdropClick\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(() => {\n /* Sanity check as you should not be able to active the directive from the backdrop */\n /* istanbul ignore else */\n if (document.activeElement !== this.inputDirective.inputElement) {\n this.inputDirective.restoreInputTextValueToPreviousState();\n this.closeDropdown();\n }\n });\n }\n }\n\n private closeDropdown(): void {\n this.resetSearch();\n this.isOpen = false;\n this.destroyOverlay();\n this.removeActiveDescendant();\n this.changeDetector.markForCheck();\n }\n\n private setActiveDescendant(): void {\n const activeElement =\n this.overlayFocusableElements[this.activeElementIndex];\n /* Sanity check */\n /* istanbul ignore else */\n if (activeElement) {\n this.inputDirective.setActiveDescendant(activeElement.id);\n }\n }\n\n private removeActiveDescendant(): void {\n /* tslint:disable-next-line:no-null-keyword */\n this.inputDirective.setActiveDescendant(null);\n }\n\n private resetSearch(): void {\n this._searchResults = [];\n this.searchText = '';\n this._highlightText = [];\n this.activeElementIndex = -1;\n this.searchResultsCount = undefined;\n this.removeActiveDescendant();\n this.initOverlayFocusableElements();\n this.changeDetector.markForCheck();\n }\n\n private addInputEventListeners(): void {\n const element = this.elementRef.nativeElement;\n\n observableFromEvent(element, 'keydown')\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe((event: KeyboardEvent) => {\n this.handleKeydown(event);\n });\n\n observableFromEvent(window, 'resize')\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(() => {\n /* istanbul ignore else */\n if (this.isOpen) {\n this.adapterService.setDropdownWidth(\n this.elementRef,\n this.resultsRef,\n !!this.inputBoxHostSvc\n );\n }\n });\n }\n\n private destroyOverlay(): void {\n if (this.overlay) {\n this.overlayService.close(this.overlay);\n this.overlay = undefined;\n }\n }\n\n private createAffixer(): void {\n /* Sanity check */\n /* istanbul ignore else */\n if (!this.affixer) {\n const affixer = this.affixService.createAffixer(this.resultsRef);\n\n this.adapterService.setDropdownWidth(\n this.elementRef,\n this.resultsRef,\n !!this.inputBoxHostSvc\n );\n\n affixer.affixTo(this.elementRef.nativeElement, {\n autoFitContext: SkyAffixAutoFitContext.Viewport,\n enableAutoFit: true,\n isSticky: true,\n placement: 'below',\n horizontalAlignment: 'left',\n });\n\n this.affixer = affixer;\n }\n }\n\n private destroyAffixer(): void {\n if (this.affixer) {\n this.affixer.destroy();\n this.affixer = undefined;\n }\n }\n\n private initMessageStream(): void {\n /* istanbul ignore if */\n if (this.messageStreamSub) {\n this.messageStreamSub.unsubscribe();\n }\n\n if (this.messageStream) {\n this.messageStreamSub = this.messageStream\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe((message: SkyAutocompleteMessage) => {\n /* tslint:disable-next-line:switch-default */\n switch (message.type) {\n case SkyAutocompleteMessageType.CloseDropdown:\n this.closeDropdown();\n break;\n case SkyAutocompleteMessageType.RepositionDropdown:\n // Settimeout waits for changes in DOM (e.g., tokens being removed)\n setTimeout(() => {\n /* istanbul ignore else */\n if (this.affixer) {\n this.affixer.reaffix();\n }\n });\n break;\n }\n });\n }\n }\n\n private initOverlayFocusableElements(): void {\n // Wait for dropdown elements to render.\n setTimeout(() => {\n if (this.overlay) {\n this.overlayFocusableElements =\n this.adapterService.getOverlayFocusableElements(this.overlay);\n this.overlayFocusableElements.forEach((el) => {\n this.adapterService.setTabIndex(el, -1);\n });\n this.addFocusedClass();\n }\n });\n }\n\n private getActiveElement(): HTMLElement {\n return this.overlayFocusableElements[this.activeElementIndex];\n }\n\n private removeFocusedClass(): void {\n if (this.activeElementIndex > -1) {\n this.adapterService.removeCSSClass(\n this.overlayFocusableElements[this.activeElementIndex],\n 'sky-autocomplete-descendant-focus'\n );\n }\n }\n\n private addFocusedClass(): void {\n if (this.activeElementIndex > -1) {\n this.adapterService.addCSSClass(\n this.overlayFocusableElements[this.activeElementIndex],\n 'sky-autocomplete-descendant-focus'\n );\n this.setActiveDescendant();\n }\n }\n}\n","<div\n aria-autocomplete=\"list\"\n aria-haspopup=\"listbox\"\n class=\"sky-autocomplete\"\n role=\"combobox\"\n [attr.aria-expanded]=\"isOpen && searchText\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.aria-owns]=\"isOpen ? resultsListId : null\"\n [attr.id]=\"resultsWrapperId\"\n>\n <ng-content></ng-content>\n</div>\n\n<ng-template #resultsTemplateRef>\n <div\n class=\"sky-autocomplete-results-container\"\n [skyThemeClass]=\"{\n 'sky-shadow': 'default',\n 'sky-elevation-4': 'modern'\n }\"\n (keydown)=\"handleKeydown($event)\"\n #resultsRef\n >\n <div\n *ngIf=\"isSearchingAsync; else resultControlsTemplateRef\"\n class=\"sky-autocomplete-results-waiting\"\n >\n <sky-wait [isWaiting]=\"true\"></sky-wait>\n </div>\n </div>\n</ng-template>\n\n<ng-template #resultControlsTemplateRef>\n <div\n *ngIf=\"searchText && (!showActionsArea || searchResults.length > 0)\"\n class=\"sky-autocomplete-results\"\n role=\"listbox\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.id]=\"resultsListId\"\n >\n <ng-container *ngFor=\"let result of searchResults; let i = index\">\n <div\n *ngIf=\"!searchResultsLimit || i < searchResultsLimit\"\n class=\"sky-autocomplete-result\"\n role=\"option\"\n tabindex=\"0\"\n [attr.aria-selected]=\"isElementFocused(searchResultEl)\"\n [attr.id]=\"result.elementId\"\n [skyHighlight]=\"highlightText\"\n (mousedown)=\"onResultMouseDown(result.elementId, $event)\"\n (mousemove)=\"onResultMouseMove(i)\"\n #searchResultEl\n >\n <ng-container\n *ngTemplateOutlet=\"\n searchResultTemplate;\n context: { item: result.data }\n \"\n >\n </ng-container>\n </div>\n </ng-container>\n <div\n *ngIf=\"searchResults.length === 0\"\n class=\"sky-deemphasized sky-padding-squish-default\"\n >\n {{\n noResultsFoundText ||\n ('skyux_autocomplete_no_results' | skyLibResources)\n }}\n </div>\n </div>\n <div *ngIf=\"showActionsArea\" class=\"sky-autocomplete-actions\">\n <button\n *ngIf=\"enableShowMore && (!searchText || searchResults.length > 0)\"\n class=\"\n sky-autocomplete-action\n sky-autocomplete-action-more\n sky-btn\n sky-btn-link\n \"\n type=\"button\"\n (click)=\"moreButtonClicked()\"\n >\n <ng-container\n *ngIf=\"\n !(\n searchAsync\n | skyAutocompleteSearchAsyncDisabled: searchAsyncDisabled\n ) &&\n searchResults.length === 0 &&\n !searchText\n \"\n >\n {{ 'skyux_autocomplete_show_all' | skyLibResources }}\n </ng-container>\n <ng-container\n *ngIf=\"\n (searchAsync\n | skyAutocompleteSearchAsyncDisabled: searchAsyncDisabled) &&\n !searchText\n \"\n >\n {{\n 'skyux_autocomplete_show_all_count'\n | skyLibResources: (data.length | skyNumeric: { truncate: false })\n }}\n </ng-container>\n <ng-container *ngIf=\"searchText\">\n {{\n 'skyux_autocomplete_show_matches_count'\n | skyLibResources\n : (searchResultsCount === undefined\n ? data.length\n : (searchResultsCount | skyNumeric: { truncate: false }))\n }}\n </ng-container>\n </button>\n <div\n *ngIf=\"searchText && searchResults.length === 0\"\n class=\"sky-font-deemphasized sky-autocomplete-actions-no-results\"\n >\n {{\n noResultsFoundText ||\n ('skyux_autocomplete_no_results' | skyLibResources)\n }}\n </div>\n <button\n *ngIf=\"showAddButton\"\n class=\"\n sky-autocomplete-action sky-autocomplete-action-add sky-btn sky-btn-link\n \"\n tabindex=\"0\"\n type=\"button\"\n [class.focused]=\"isElementFocused(addButtonEl)\"\n (click)=\"addButtonClicked()\"\n #addButtonEl\n >\n <sky-icon *skyThemeIf=\"'modern'\" icon=\"add\" iconType=\"skyux\"></sky-icon>\n <sky-icon *skyThemeIf=\"'default'\" icon=\"plus-circle\"></sky-icon>\n {{ 'skyux_autocomplete_add' | skyLibResources }}\n </button>\n </div>\n</ng-template>\n\n<ng-template let-item=\"item\" #defaultSearchResultTemplate>\n {{ item[descriptorProperty] }}\n</ng-template>\n"]}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * NOTICE: DO NOT MODIFY THIS FILE!
3
3
  * The contents of this file were automatically generated by
4
- * the 'ng generate @skyux/i18n:lib-resources-module modules/shared/sky-lookup' schematic.
4
+ * the 'ng generate @skyux/i18n:lib-resources-module lib/modules/shared/sky-lookup' schematic.
5
5
  * To update this file, simply rerun the command.
6
6
  */
7
7
  import { NgModule } from '@angular/core';
@@ -1 +1 @@
1
- {"version":3,"file":"sky-lookup-resources.module.js","sourceRoot":"","sources":["../../../../../../../../libs/components/lookup/src/lib/modules/shared/sky-lookup-resources.module.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EACL,2BAA2B,EAE3B,aAAa,EAGb,qBAAqB,GACtB,MAAM,aAAa,CAAC;;AAErB,MAAM,SAAS,GAA0C;IACvD,OAAO,EAAE;QACP,sBAAsB,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;QAC1C,6BAA6B,EAAE,EAAE,OAAO,EAAE,kBAAkB,EAAE;QAC9D,2BAA2B,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE;QACpD,iCAAiC,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE;QAC9D,qCAAqC,EAAE,EAAE,OAAO,EAAE,oBAAoB,EAAE;QACxE,sCAAsC,EAAE,EAAE,OAAO,EAAE,sBAAsB,EAAE;QAC3E,wBAAwB,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE;QAC/C,oCAAoC,EAAE;YACpC,OAAO,EAAE,yBAAyB;SACnC;QACD,0BAA0B,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;QAC9C,8CAA8C,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE;QACzE,6CAA6C,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE;QACvE,iDAAiD,EAAE;YACjD,OAAO,EAAE,0BAA0B;SACpC;QACD,6BAA6B,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE;QACpD,yCAAyC,EAAE,EAAE,OAAO,EAAE,kBAAkB,EAAE;QAC1E,2CAA2C,EAAE,EAAE,OAAO,EAAE,gBAAgB,EAAE;QAC1E,iCAAiC,EAAE,EAAE,OAAO,EAAE,kBAAkB,EAAE;QAClE,6BAA6B,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE;QACpD,2BAA2B,EAAE,EAAE,OAAO,EAAE,oBAAoB,EAAE;QAC9D,oBAAoB,EAAE,EAAE,OAAO,EAAE,gBAAgB,EAAE;QACnD,kBAAkB,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE;QAC/C,iBAAiB,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE;QAC7C,wBAAwB,EAAE,EAAE,OAAO,EAAE,mBAAmB,EAAE;KAC3D;CACF,CAAC;AAEF,MAAM,OAAO,0BAA0B;IAC9B,SAAS,CAAC,UAA4B,EAAE,IAAY;QACzD,OAAO,qBAAqB,CAAC,SAAS,EAAE,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACnE,CAAC;CACF;AAED;;GAEG;AAWH,MAAM,OAAO,wBAAwB;;sHAAxB,wBAAwB;uHAAxB,wBAAwB,YATzB,aAAa;uHASZ,wBAAwB,aARxB;QACT;YACE,OAAO,EAAE,2BAA2B;YACpC,QAAQ,EAAE,0BAA0B;YACpC,KAAK,EAAE,IAAI;SACZ;KACF,YAPS,aAAa;4FASZ,wBAAwB;kBAVpC,QAAQ;mBAAC;oBACR,OAAO,EAAE,CAAC,aAAa,CAAC;oBACxB,SAAS,EAAE;wBACT;4BACE,OAAO,EAAE,2BAA2B;4BACpC,QAAQ,EAAE,0BAA0B;4BACpC,KAAK,EAAE,IAAI;yBACZ;qBACF;iBACF","sourcesContent":["/**\n * NOTICE: DO NOT MODIFY THIS FILE!\n * The contents of this file were automatically generated by\n * the 'ng generate @skyux/i18n:lib-resources-module modules/shared/sky-lookup' schematic.\n * To update this file, simply rerun the command.\n */\nimport { NgModule } from '@angular/core';\nimport {\n SKY_LIB_RESOURCES_PROVIDERS,\n SkyAppLocaleInfo,\n SkyI18nModule,\n SkyLibResources,\n SkyLibResourcesProvider,\n getLibStringForLocale,\n} from '@skyux/i18n';\n\nconst RESOURCES: { [locale: string]: SkyLibResources } = {\n 'EN-US': {\n skyux_autocomplete_add: { message: 'New' },\n skyux_autocomplete_no_results: { message: 'No matches found' },\n skyux_autocomplete_show_all: { message: 'Show all' },\n skyux_autocomplete_show_all_count: { message: 'Show all {0}' },\n skyux_autocomplete_show_matches_count: { message: 'Show matches ({0})' },\n skyux_country_field_search_placeholder: { message: 'Search for a country' },\n skyux_lookup_search_icon: { message: 'Search' },\n skyux_lookup_search_button_show_more: {\n message: 'Show all search results',\n },\n skyux_lookup_show_more_add: { message: 'New' },\n skyux_lookup_show_more_select_all_button_title: { message: 'Select all' },\n skyux_lookup_show_more_clear_all_button_title: { message: 'Clear all' },\n skyux_lookup_show_more_show_selected_option_title: {\n message: 'Show only selected items',\n },\n skyux_lookup_show_more_cancel: { message: 'Cancel' },\n skyux_lookup_show_more_modal_title_single: { message: 'Select an option' },\n skyux_lookup_show_more_modal_title_multiple: { message: 'Select options' },\n skyux_lookup_show_more_no_results: { message: 'No matches found' },\n skyux_lookup_show_more_select: { message: 'Select' },\n skyux_lookup_tokens_summary: { message: '{0} items selected' },\n skyux_search_dismiss: { message: 'Dismiss search' },\n skyux_search_label: { message: 'Search items' },\n skyux_search_open: { message: 'Open search' },\n skyux_search_placeholder: { message: 'Find in this list' },\n },\n};\n\nexport class SkyLookupResourcesProvider implements SkyLibResourcesProvider {\n public getString(localeInfo: SkyAppLocaleInfo, name: string): string {\n return getLibStringForLocale(RESOURCES, localeInfo.locale, name);\n }\n}\n\n/**\n * Import into any component library module that needs to use resource strings.\n */\n@NgModule({\n exports: [SkyI18nModule],\n providers: [\n {\n provide: SKY_LIB_RESOURCES_PROVIDERS,\n useClass: SkyLookupResourcesProvider,\n multi: true,\n },\n ],\n})\nexport class SkyLookupResourcesModule {}\n"]}
1
+ {"version":3,"file":"sky-lookup-resources.module.js","sourceRoot":"","sources":["../../../../../../../../libs/components/lookup/src/lib/modules/shared/sky-lookup-resources.module.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EACL,2BAA2B,EAE3B,aAAa,EAGb,qBAAqB,GACtB,MAAM,aAAa,CAAC;;AAErB,MAAM,SAAS,GAA0C;IACvD,OAAO,EAAE;QACP,sBAAsB,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;QAC1C,6BAA6B,EAAE,EAAE,OAAO,EAAE,kBAAkB,EAAE;QAC9D,2BAA2B,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE;QACpD,iCAAiC,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE;QAC9D,qCAAqC,EAAE,EAAE,OAAO,EAAE,oBAAoB,EAAE;QACxE,sCAAsC,EAAE,EAAE,OAAO,EAAE,sBAAsB,EAAE;QAC3E,wBAAwB,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE;QAC/C,oCAAoC,EAAE;YACpC,OAAO,EAAE,yBAAyB;SACnC;QACD,0BAA0B,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;QAC9C,8CAA8C,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE;QACzE,6CAA6C,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE;QACvE,iDAAiD,EAAE;YACjD,OAAO,EAAE,0BAA0B;SACpC;QACD,6BAA6B,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE;QACpD,yCAAyC,EAAE,EAAE,OAAO,EAAE,kBAAkB,EAAE;QAC1E,2CAA2C,EAAE,EAAE,OAAO,EAAE,gBAAgB,EAAE;QAC1E,iCAAiC,EAAE,EAAE,OAAO,EAAE,kBAAkB,EAAE;QAClE,6BAA6B,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE;QACpD,2BAA2B,EAAE,EAAE,OAAO,EAAE,oBAAoB,EAAE;QAC9D,oBAAoB,EAAE,EAAE,OAAO,EAAE,gBAAgB,EAAE;QACnD,kBAAkB,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE;QAC/C,iBAAiB,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE;QAC7C,wBAAwB,EAAE,EAAE,OAAO,EAAE,mBAAmB,EAAE;KAC3D;CACF,CAAC;AAEF,MAAM,OAAO,0BAA0B;IAC9B,SAAS,CACd,UAA4B,EAC5B,IAAY;QAEZ,OAAO,qBAAqB,CAAC,SAAS,EAAE,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACnE,CAAC;CACF;AAED;;GAEG;AAWH,MAAM,OAAO,wBAAwB;;sHAAxB,wBAAwB;uHAAxB,wBAAwB,YATzB,aAAa;uHASZ,wBAAwB,aARxB;QACT;YACE,OAAO,EAAE,2BAA2B;YACpC,QAAQ,EAAE,0BAA0B;YACpC,KAAK,EAAE,IAAI;SACZ;KACF,YAPS,aAAa;4FASZ,wBAAwB;kBAVpC,QAAQ;mBAAC;oBACR,OAAO,EAAE,CAAC,aAAa,CAAC;oBACxB,SAAS,EAAE;wBACT;4BACE,OAAO,EAAE,2BAA2B;4BACpC,QAAQ,EAAE,0BAA0B;4BACpC,KAAK,EAAE,IAAI;yBACZ;qBACF;iBACF","sourcesContent":["/**\n * NOTICE: DO NOT MODIFY THIS FILE!\n * The contents of this file were automatically generated by\n * the 'ng generate @skyux/i18n:lib-resources-module lib/modules/shared/sky-lookup' schematic.\n * To update this file, simply rerun the command.\n */\nimport { NgModule } from '@angular/core';\nimport {\n SKY_LIB_RESOURCES_PROVIDERS,\n SkyAppLocaleInfo,\n SkyI18nModule,\n SkyLibResources,\n SkyLibResourcesProvider,\n getLibStringForLocale,\n} from '@skyux/i18n';\n\nconst RESOURCES: { [locale: string]: SkyLibResources } = {\n 'EN-US': {\n skyux_autocomplete_add: { message: 'New' },\n skyux_autocomplete_no_results: { message: 'No matches found' },\n skyux_autocomplete_show_all: { message: 'Show all' },\n skyux_autocomplete_show_all_count: { message: 'Show all {0}' },\n skyux_autocomplete_show_matches_count: { message: 'Show matches ({0})' },\n skyux_country_field_search_placeholder: { message: 'Search for a country' },\n skyux_lookup_search_icon: { message: 'Search' },\n skyux_lookup_search_button_show_more: {\n message: 'Show all search results',\n },\n skyux_lookup_show_more_add: { message: 'New' },\n skyux_lookup_show_more_select_all_button_title: { message: 'Select all' },\n skyux_lookup_show_more_clear_all_button_title: { message: 'Clear all' },\n skyux_lookup_show_more_show_selected_option_title: {\n message: 'Show only selected items',\n },\n skyux_lookup_show_more_cancel: { message: 'Cancel' },\n skyux_lookup_show_more_modal_title_single: { message: 'Select an option' },\n skyux_lookup_show_more_modal_title_multiple: { message: 'Select options' },\n skyux_lookup_show_more_no_results: { message: 'No matches found' },\n skyux_lookup_show_more_select: { message: 'Select' },\n skyux_lookup_tokens_summary: { message: '{0} items selected' },\n skyux_search_dismiss: { message: 'Dismiss search' },\n skyux_search_label: { message: 'Search items' },\n skyux_search_open: { message: 'Open search' },\n skyux_search_placeholder: { message: 'Find in this list' },\n },\n};\n\nexport class SkyLookupResourcesProvider implements SkyLibResourcesProvider {\n public getString(\n localeInfo: SkyAppLocaleInfo,\n name: string\n ): string | undefined {\n return getLibStringForLocale(RESOURCES, localeInfo.locale, name);\n }\n}\n\n/**\n * Import into any component library module that needs to use resource strings.\n */\n@NgModule({\n exports: [SkyI18nModule],\n providers: [\n {\n provide: SKY_LIB_RESOURCES_PROVIDERS,\n useClass: SkyLookupResourcesProvider,\n multi: true,\n },\n ],\n})\nexport class SkyLookupResourcesModule {}\n"]}
@@ -28,7 +28,7 @@ import { trigger, state, style, transition, animate } from '@angular/animations'
28
28
  /**
29
29
  * NOTICE: DO NOT MODIFY THIS FILE!
30
30
  * The contents of this file were automatically generated by
31
- * the 'ng generate @skyux/i18n:lib-resources-module modules/shared/sky-lookup' schematic.
31
+ * the 'ng generate @skyux/i18n:lib-resources-module lib/modules/shared/sky-lookup' schematic.
32
32
  * To update this file, simply rerun the command.
33
33
  */
34
34
  const RESOURCES = {
@@ -835,7 +835,9 @@ class SkyAutocompleteComponent {
835
835
  this.currentSearchSub = this.performSearch()
836
836
  .pipe(take(1))
837
837
  .subscribe((result) => {
838
- const items = result.items;
838
+ const items = result.items.filter((item) => {
839
+ return item && this.descriptorProperty in item;
840
+ });
839
841
  this.isSearchingAsync = false;
840
842
  this._searchResults = items.map((r, i) => {
841
843
  const result = {
@@ -908,7 +910,12 @@ class SkyAutocompleteComponent {
908
910
  * Returns the text to highlight based on exact matches, case-insensitive matches, and matches for corresponding diacritical characters (a will match à).
909
911
  */
910
912
  getHighlightText(searchText) {
911
- const normalizedSearchText = normalizeDiacritics(this.searchText).toLocaleUpperCase();
913
+ const normalizedSearchText = normalizeDiacritics(searchText)
914
+ .toLocaleUpperCase()
915
+ .trim();
916
+ if (!normalizedSearchText) {
917
+ return [];
918
+ }
912
919
  let matchesToHighlight = [];
913
920
  for (let i = 0, n = this._searchResults.length; i < n; i++) {
914
921
  const value = this._searchResults[i].data[this.descriptorProperty]