@fundamental-ngx/core 0.35.0-rc.21 → 0.35.0-rc.22

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.
Files changed (102) hide show
  1. package/action-bar/package.json +1 -1
  2. package/action-sheet/package.json +1 -1
  3. package/alert/package.json +1 -1
  4. package/avatar/package.json +1 -1
  5. package/avatar-group/package.json +1 -1
  6. package/bar/package.json +1 -1
  7. package/breadcrumb/package.json +1 -1
  8. package/busy-indicator/package.json +1 -1
  9. package/button/package.json +1 -1
  10. package/calendar/package.json +1 -1
  11. package/card/package.json +1 -1
  12. package/carousel/package.json +1 -1
  13. package/checkbox/package.json +1 -1
  14. package/combobox/package.json +1 -1
  15. package/date-picker/package.json +1 -1
  16. package/datetime/package.json +1 -1
  17. package/datetime-picker/package.json +1 -1
  18. package/dialog/package.json +1 -1
  19. package/dynamic-page/package.json +1 -1
  20. package/dynamic-side-content/package.json +1 -1
  21. package/esm2020/token/tokenizer.component.mjs +18 -52
  22. package/facets/package.json +1 -1
  23. package/feed-input/package.json +1 -1
  24. package/feed-list-item/package.json +1 -1
  25. package/fesm2015/fundamental-ngx-core-token.mjs +17 -51
  26. package/fesm2015/fundamental-ngx-core-token.mjs.map +1 -1
  27. package/fesm2020/fundamental-ngx-core-token.mjs +17 -51
  28. package/fesm2020/fundamental-ngx-core-token.mjs.map +1 -1
  29. package/file-uploader/package.json +1 -1
  30. package/fixed-card-layout/package.json +1 -1
  31. package/flexible-column-layout/package.json +1 -1
  32. package/form/package.json +1 -1
  33. package/formatted-text/package.json +1 -1
  34. package/grid-list/package.json +1 -1
  35. package/icon/package.json +1 -1
  36. package/illustrated-message/package.json +1 -1
  37. package/infinite-scroll/package.json +1 -1
  38. package/info-label/package.json +1 -1
  39. package/inline-help/package.json +1 -1
  40. package/input-group/package.json +1 -1
  41. package/layout-grid/package.json +1 -1
  42. package/layout-panel/package.json +1 -1
  43. package/link/package.json +1 -1
  44. package/list/package.json +1 -1
  45. package/menu/package.json +1 -1
  46. package/message-box/package.json +1 -1
  47. package/message-strip/package.json +1 -1
  48. package/message-toast/package.json +1 -1
  49. package/micro-process-flow/package.json +1 -1
  50. package/mobile-mode/package.json +1 -1
  51. package/multi-input/package.json +1 -1
  52. package/nested-list/package.json +1 -1
  53. package/notification/package.json +1 -1
  54. package/object-identifier/package.json +1 -1
  55. package/object-marker/package.json +1 -1
  56. package/object-number/package.json +1 -1
  57. package/object-status/package.json +1 -1
  58. package/package.json +1 -1
  59. package/pagination/package.json +1 -1
  60. package/panel/package.json +1 -1
  61. package/popover/package.json +1 -1
  62. package/product-switch/package.json +1 -1
  63. package/progress-indicator/package.json +1 -1
  64. package/quick-view/package.json +1 -1
  65. package/radio/package.json +1 -1
  66. package/rating-indicator/package.json +1 -1
  67. package/resizable-card-layout/package.json +1 -1
  68. package/scroll-spy/package.json +1 -1
  69. package/scrollbar/package.json +1 -1
  70. package/segmented-button/package.json +1 -1
  71. package/select/package.json +1 -1
  72. package/shared/package.json +1 -1
  73. package/shellbar/package.json +1 -1
  74. package/side-navigation/package.json +1 -1
  75. package/slider/package.json +1 -1
  76. package/split-button/package.json +1 -1
  77. package/splitter/package.json +1 -1
  78. package/status-indicator/package.json +1 -1
  79. package/step-input/package.json +1 -1
  80. package/switch/package.json +1 -1
  81. package/table/package.json +1 -1
  82. package/tabs/package.json +1 -1
  83. package/text/package.json +1 -1
  84. package/theming/package.json +1 -1
  85. package/tile/package.json +1 -1
  86. package/time/package.json +1 -1
  87. package/time-picker/package.json +1 -1
  88. package/timeline/package.json +1 -1
  89. package/title/package.json +1 -1
  90. package/token/esm2020/tokenizer.component.mjs +18 -52
  91. package/token/fesm2015/fundamental-ngx-core-token.mjs +17 -51
  92. package/token/fesm2015/fundamental-ngx-core-token.mjs.map +1 -1
  93. package/token/fesm2020/fundamental-ngx-core-token.mjs +17 -51
  94. package/token/fesm2020/fundamental-ngx-core-token.mjs.map +1 -1
  95. package/token/package.json +1 -1
  96. package/token/tokenizer.component.d.ts +1 -1
  97. package/toolbar/package.json +1 -1
  98. package/tree/package.json +1 -1
  99. package/upload-collection/package.json +1 -1
  100. package/utils/package.json +1 -1
  101. package/vertical-navigation/package.json +1 -1
  102. package/wizard/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fundamental-ngx/core/feed-list-item",
3
- "version": "0.35.0-rc.21",
3
+ "version": "0.35.0-rc.22",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^13.0.0",
6
6
  "@angular/core": "^13.0.0"
@@ -204,12 +204,12 @@ class TokenizerComponent {
204
204
  this.tokenListChangesSubscription.unsubscribe();
205
205
  }
206
206
  this.tokenListChangesSubscription = this.tokenList.changes.subscribe(() => {
207
- this._cdRef.detectChanges();
208
- this.moreTokensLeft = [];
209
- this.moreTokensRight = [];
210
- this.previousTokenCount > this.tokenList.length ? this._expandTokens() : this._collapseTokens();
211
- this.previousTokenCount = this.tokenList.length;
212
- this.handleTokenClickSubscriptions();
207
+ this._resetTokens();
208
+ });
209
+ this.tokenList.forEach((token) => {
210
+ this.tokenListChangesSubscription.add(token.onCloseClick.subscribe(() => {
211
+ this._resetTokens();
212
+ }));
213
213
  });
214
214
  if (!this.compact && !this.compactCollapse) {
215
215
  this._handleInitCozyTokenCount();
@@ -331,13 +331,7 @@ class TokenizerComponent {
331
331
  onResize() {
332
332
  if (this._elementRef) {
333
333
  const elementWidth = this._elementRef.nativeElement.getBoundingClientRect().width;
334
- // if the element is geting smaller, try collapsing tokens
335
- if (elementWidth <= this.previousElementWidth) {
336
- this._collapseTokens();
337
- }
338
- else {
339
- this._expandTokens(); // if it's getting bigger, try expanding
340
- }
334
+ this._resetTokens();
341
335
  this.previousElementWidth = elementWidth;
342
336
  }
343
337
  }
@@ -481,49 +475,21 @@ class TokenizerComponent {
481
475
  }
482
476
  }
483
477
  /** @hidden */
484
- _expandTokens() {
478
+ _resetTokens() {
479
+ this.moreTokensLeft = [];
480
+ this.moreTokensRight = [];
485
481
  if (this.compact || this.compactCollapse) {
486
- let elementWidth = this._elementRef.nativeElement.getBoundingClientRect().width;
487
- let combinedTokenWidth = this.getCombinedTokenWidth(); // the combined width of all tokens, the "____ more" text, and the input
488
- let breakLoop = false;
489
- let i = this.moreTokensLeft.length - 1 + this.moreTokensRight.length;
490
- while (combinedTokenWidth < elementWidth && i >= 0 && !breakLoop) {
491
- // we want to get the first hidden token and check to see if it can fit in the whole tokenizer
492
- const tokenToCheck = this.tokenList.filter((token) => token.elementRef.nativeElement.style.display === 'none')[i];
493
- /*
494
- set display: 'inline-block' and visibility: 'hidden' - this way, the tokenizer width will
495
- contain the width of the token we might display, without actually making the token visible to the user.
496
- */
497
- tokenToCheck.elementRef.nativeElement.style.display = 'inline-block';
498
- tokenToCheck.elementRef.nativeElement.style.visibility = 'hidden';
499
- elementWidth = this._elementRef.nativeElement.getBoundingClientRect().width;
500
- combinedTokenWidth = this.getCombinedTokenWidth();
501
- /*
502
- if the width of the inner tokenizer component is still smaller than the whole tokenizer component, we'll
503
- make the token visible and reduce the hidden count
504
- */
505
- if (combinedTokenWidth < elementWidth) {
506
- tokenToCheck.elementRef.nativeElement.style.visibility = 'visible';
507
- tokenToCheck._viewContainer.createEmbeddedView(tokenToCheck._content);
508
- if (this.moreTokensLeft.length) {
509
- this.moreTokensLeft.pop();
510
- }
511
- else if (this.moreTokensRight.length) {
512
- this.moreTokensRight.pop();
513
- }
514
- }
515
- else {
516
- // otherwise, stop looping and set the token's display back to 'none'
517
- tokenToCheck.elementRef.nativeElement.style.display = 'none';
518
- breakLoop = true;
519
- }
520
- i--;
521
- this._cdRef.markForCheck();
522
- }
482
+ this.tokenList.forEach((token) => {
483
+ this._makeElementVisible(token.elementRef);
484
+ });
485
+ this._cdRef.markForCheck();
486
+ this._collapseTokens();
523
487
  }
524
488
  else {
525
489
  this._getHiddenCozyTokenCount();
526
490
  }
491
+ this.handleTokenClickSubscriptions();
492
+ this.previousTokenCount = this.tokenList.length;
527
493
  }
528
494
  /** @hidden */
529
495
  _getHiddenCozyTokenCount() {
@@ -1 +1 @@
1
- {"version":3,"file":"fundamental-ngx-core-token.mjs","sources":["../../../../libs/core/src/lib/token/token.component.ts","../../../../libs/core/src/lib/token/token.component.html","../../../../libs/core/src/lib/token/tokenizer.component.ts","../../../../libs/core/src/lib/token/tokenizer.component.html","../../../../libs/core/src/lib/token/token-input.directive.ts","../../../../libs/core/src/lib/token/token.module.ts","../../../../libs/core/src/lib/token/fundamental-ngx-core-token.ts"],"sourcesContent":["import {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Optional,\n Output,\n TemplateRef,\n ViewChild,\n ViewContainerRef,\n ViewEncapsulation\n} from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { ContentDensityService } from '@fundamental-ngx/core/utils';\n\n/**\n * A token is used to represent contextualizing information.\n * They can be useful to show applied filters, selected values for form fields or object metadata.\n */\n@Component({\n selector: 'fd-token',\n templateUrl: './token.component.html',\n styleUrls: ['./token.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class TokenComponent implements OnInit, AfterViewInit, OnDestroy {\n /** Whether the token is disabled. */\n @Input()\n disabled = false;\n\n /** Whether the token is compact. */\n @Input()\n compact?: boolean;\n\n /** @hidden */\n @ViewChild('tokenWrapperElement')\n tokenWrapperElement: ElementRef;\n\n /** @hidden */\n @ViewChild('content')\n readonly _content: TemplateRef<any>;\n\n /** @hidden */\n @ViewChild('viewContainer', { read: ViewContainerRef })\n readonly _viewContainer: ViewContainerRef;\n\n private _selected = false;\n\n private _subscriptions = new Subscription();\n\n /** Whether the token is selected. */\n @Input()\n get selected(): boolean {\n return this._selected;\n }\n\n set selected(val: boolean) {\n if (this._selected !== val) {\n this._cdRef.markForCheck();\n }\n this._selected = val;\n }\n\n /** Whether the token is read-only. */\n @Input()\n readOnly = false;\n\n /** label for close icon */\n @Input()\n deleteButtonLabel = 'Deletable';\n\n /** role description for token */\n @Input()\n ariaRoleDescription = 'token';\n\n /** Emitted when the *x* icon is clicked. Specifically, any pseudo-element. */\n @Output()\n // eslint-disable-next-line @angular-eslint/no-output-on-prefix\n readonly onCloseClick: EventEmitter<MouseEvent> = new EventEmitter<MouseEvent>();\n\n /** Emitted when token should be removed */\n @Output()\n // eslint-disable-next-line @angular-eslint/no-output-on-prefix\n readonly onRemove: EventEmitter<void> = new EventEmitter<void>();\n\n /** Emitted when a token is clicked. */\n @Output()\n // eslint-disable-next-line @angular-eslint/no-output-on-prefix\n onTokenClick: EventEmitter<KeyboardEvent> = new EventEmitter<KeyboardEvent>();\n\n constructor(\n public elementRef: ElementRef,\n private _cdRef: ChangeDetectorRef,\n @Optional() private _contentDensityService: ContentDensityService\n ) {}\n\n /** @hidden */\n /** @hidden */\n ngOnInit(): void {\n if (this.compact === undefined && this._contentDensityService) {\n this._subscriptions.add(\n this._contentDensityService._isCompactDensity.subscribe((isCompact) => {\n this.compact = isCompact;\n this._cdRef.markForCheck();\n })\n );\n }\n }\n\n /** @hidden */\n ngAfterViewInit(): void {\n this._viewContainer.createEmbeddedView(this._content);\n }\n\n /** @hidden */\n ngOnDestroy(): void {\n this._subscriptions.unsubscribe();\n }\n\n /** @hidden */\n closeClickHandler(event?): void {\n if (event) {\n event.stopPropagation();\n if (!this.disabled) {\n this.onCloseClick.emit(event);\n }\n }\n }\n\n /** @hidden */\n tokenClickHandler(event): void {\n this.onTokenClick.emit(event);\n }\n}\n","<span\n #tokenWrapperElement\n class=\"fd-token\"\n role=\"option\"\n [attr.aria-roledescription]=\"ariaRoleDescription\"\n (click)=\"tokenClickHandler($event)\"\n [class.fd-token__disabled]=\"disabled\"\n [class.fd-token--compact]=\"compact\"\n [class.fd-token--selected]=\"selected\"\n [class.fd-token--readonly]=\"readOnly\"\n [attr.aria-selected]=\"selected\"\n [attr.aria-readonly]=\"readOnly\"\n>\n <span class=\"fd-token__text no-text-select\">\n <ng-container #viewContainer></ng-container>\n </span>\n <span\n (click)=\"closeClickHandler($event)\"\n role=\"button\"\n [attr.aria-label]=\"deleteButtonLabel\"\n *ngIf=\"!readOnly\"\n class=\"fd-token__close\"\n tabindex=\"-1\"\n ></span>\n</span>\n\n<ng-template #content>\n <ng-content></ng-content>\n</ng-template>\n","import {\n AfterContentInit,\n AfterViewChecked,\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChild,\n ContentChildren,\n ElementRef,\n EventEmitter,\n forwardRef,\n HostListener,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Optional,\n Output,\n QueryList,\n Renderer2,\n ViewChild,\n ViewChildren,\n ViewContainerRef,\n ViewEncapsulation\n} from '@angular/core';\nimport { A, BACKSPACE, DELETE, ENTER, LEFT_ARROW, RIGHT_ARROW, SPACE } from '@angular/cdk/keycodes';\nimport { fromEvent, Subject, Subscription } from 'rxjs';\nimport { filter, takeUntil, tap } from 'rxjs/operators';\nimport { FormControlComponent } from '@fundamental-ngx/core/form';\nimport {\n ContentDensityService,\n CssClassBuilder,\n applyCssClass,\n RtlService,\n KeyUtil\n} from '@fundamental-ngx/core/utils';\nimport { TokenComponent } from './token.component';\n\n@Component({\n selector: 'fd-tokenizer',\n templateUrl: './tokenizer.component.html',\n styleUrls: ['./tokenizer.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class TokenizerComponent\n implements AfterViewChecked, AfterViewInit, AfterContentInit, OnDestroy, CssClassBuilder, OnInit, OnChanges\n{\n /** user's custom classes */\n @Input()\n class: string;\n\n /** Disables possibility to remove tokens by keyboard */\n @Input()\n disableKeyboardDeletion = false;\n\n /** role description for tokenizer component */\n @Input()\n ariaRoleDescription = 'tokenizer';\n\n /** @hidden */\n @ContentChildren(forwardRef(() => TokenComponent))\n tokenList: QueryList<TokenComponent>;\n\n /** @hidden */\n @ContentChild(forwardRef(() => FormControlComponent))\n input: FormControlComponent;\n\n /** @hidden */\n @ViewChild('tokenizerInner')\n tokenizerInnerEl: ElementRef;\n\n /** @hidden */\n @ViewChild('moreElement')\n moreElement: ElementRef;\n\n /** @hidden */\n @ViewChild('inputGroupAddOn') set content(content: ElementRef) {\n this.inputGroupAddonEl = content;\n }\n\n /** @hidden */\n @ViewChildren('viewContainer', { read: ViewContainerRef })\n readonly _viewContainer: QueryList<ViewContainerRef>;\n\n /** @hidden */\n get _hiddenTokens(): TokenComponent[] {\n return this.tokenList.filter((token) => token.elementRef.nativeElement.style.display === 'none');\n }\n\n /** @hidden */\n inputGroupAddonEl: ElementRef;\n\n /** Whether the tokenizer is compact */\n @Input()\n compact?: boolean;\n\n /** Whether to use cozy visuals but compact collapsing behavior. */\n @Input()\n compactCollapse = false;\n\n /** Whether tokenizer should have fake focus indicator, when input is focused inside*/\n @Input()\n tokenizerFocusable = true;\n\n /** The value for the tokenizer input */\n @Input()\n inputValue: string;\n\n /** Icon of the button on the right of the input field. */\n @Input()\n glyph: string;\n\n /** Word to use for when there are extra tokens. */\n @Input()\n moreTerm = 'more';\n\n /** @hidden */\n @Input()\n open: boolean;\n\n /** Event emitted when the search term changes. Use *$event* to access the new term. */\n @Output()\n readonly moreClickedEvent: EventEmitter<any> = new EventEmitter<any>();\n\n /** @hidden */\n previousElementWidth: number;\n\n /** @hidden */\n moreTokensLeft: Array<TokenComponent> = [];\n\n /** @hidden */\n moreTokensRight: Array<TokenComponent> = [];\n\n /** @hidden */\n previousTokenCount: number;\n\n /** @hidden */\n tokenListChangesSubscription: Subscription;\n\n /** @hidden */\n tokenListClickSubscriptions: Subscription[] = [];\n\n /** @hidden */\n hiddenCozyTokenCount = 0;\n\n /** @hidden Used to add focus to tokenizer element */\n _tokenizerHasFocus = false;\n\n /** @hidden */\n _showOverflowPopover = true;\n\n /** @hidden */\n private _contentDensitySubscription = new Subscription();\n\n /** @hidden */\n /* Variable which will keep the index of the first token pressed in the tokenizer*/\n private _firstElementInSelection: number | null = null;\n\n /** @hidden */\n /* Variable which will keep the index of the last token pressed in the tokenizer*/\n private _lastElementInSelection: number | null = null;\n\n /** @hidden */\n /* Flag which will say if the last keyboard and click operation they used was using control*/\n private _ctrlPrevious: boolean;\n\n /** @hidden */\n /* Flag which will say if they held shift and clicked highlighting elements before or*/\n private _directionShiftIsRight: boolean | null = null;\n\n /** An RxJS Subject that will kill the data stream upon destruction (for unsubscribing) */\n private readonly _onDestroy$: Subject<void> = new Subject<void>();\n\n /** @hidden */\n ngAfterViewInit(): void {\n if (this.input && this.input.elementRef()) {\n this._inputKeydownEvent();\n }\n }\n\n /** @hidden */\n ngAfterViewChecked(): void {\n if (this.tokenList) {\n this.previousTokenCount = this.tokenList.length;\n }\n this.handleTokenClickSubscriptions();\n // watch for changes to the tokenList and attempt to expand/collapse tokens as needed\n if (this.tokenListChangesSubscription) {\n this.tokenListChangesSubscription.unsubscribe();\n }\n this.tokenListChangesSubscription = this.tokenList.changes.subscribe(() => {\n this._cdRef.detectChanges();\n this.moreTokensLeft = [];\n this.moreTokensRight = [];\n this.previousTokenCount > this.tokenList.length ? this._expandTokens() : this._collapseTokens();\n this.previousTokenCount = this.tokenList.length;\n this.handleTokenClickSubscriptions();\n });\n if (!this.compact && !this.compactCollapse) {\n this._handleInitCozyTokenCount();\n }\n }\n\n /** @hidden */\n ngAfterContentInit(): void {\n this._listenElementEvents();\n this.previousElementWidth = this._elementRef.nativeElement.getBoundingClientRect().width;\n this.onResize();\n }\n\n /** @hidden */\n ngOnDestroy(): void {\n if (this.tokenListChangesSubscription) {\n this.tokenListChangesSubscription.unsubscribe();\n }\n this._onDestroy$.next();\n this._onDestroy$.complete();\n this._unsubscribeClicks();\n this._contentDensitySubscription.unsubscribe();\n }\n\n /** @hidden */\n ngOnInit(): void {\n if (this.compact === undefined && this._contentDensityService) {\n this._contentDensitySubscription.add(\n this._contentDensityService._isCompactDensity.subscribe((isCompact) => {\n this.compact = isCompact;\n this._cdRef.markForCheck();\n this.buildComponentCssClass();\n })\n );\n }\n this.buildComponentCssClass();\n }\n\n /** @hidden */\n ngOnChanges(): void {\n this.buildComponentCssClass();\n }\n\n constructor(\n private _elementRef: ElementRef,\n @Optional() private _contentDensityService: ContentDensityService,\n private _cdRef: ChangeDetectorRef,\n @Optional() private _rtlService: RtlService,\n private _renderer: Renderer2\n ) {\n this._renderer.listen('window', 'click', (e: Event) => {\n if (this.elementRef().nativeElement.contains(e.target) === false) {\n this.tokenList.forEach((token) => {\n token.selected = false;\n });\n }\n });\n }\n\n @applyCssClass\n /** CssClassBuilder interface implementation\n * function must return single string\n * function is responsible for order which css classes are applied\n */\n buildComponentCssClass(): string[] {\n return [this.class];\n }\n\n elementRef(): ElementRef {\n return this._elementRef;\n }\n\n /** @hidden */\n handleTokenClickSubscriptions(): void {\n this._unsubscribeClicks();\n this.tokenList.forEach((token, index) => {\n this.tokenListClickSubscriptions.push(\n token.onTokenClick.subscribe((event) => {\n event.stopPropagation();\n this.focusTokenElement(index);\n if (this._isControlKey(event)) {\n this._ctrlSelected(token, index);\n } else if (!event.shiftKey || this._ctrlPrevious) {\n this._basicSelected(token, index);\n } else if (event.shiftKey) {\n this.resetFirstAndLastElement();\n this._shiftSelected(index);\n }\n })\n );\n });\n }\n\n /** @hidden */\n focusTokenElement(newIndex: number): HTMLElement | undefined {\n let elementToFocus: HTMLElement | undefined;\n const tokenListArray: TokenComponent[] = this.tokenList.toArray();\n if (tokenListArray[newIndex]) {\n elementToFocus = tokenListArray[newIndex].tokenWrapperElement.nativeElement;\n // element needs tabindex in order to be focused\n elementToFocus!.setAttribute('tabindex', '0');\n elementToFocus!.focus();\n this.addKeyboardListener(elementToFocus!, newIndex);\n }\n\n return elementToFocus;\n }\n\n /** @hidden */\n addKeyboardListener(element: HTMLElement, newIndex: number): void {\n // function needs to be defined in order to be referenced later by addEventListener/removeEventListener\n const handleFunctionReference = (e): void => {\n if (newIndex || newIndex === 0) {\n this.handleKeyDown(e, newIndex);\n }\n };\n element.addEventListener('keydown', handleFunctionReference);\n element.addEventListener('blur', () => {\n element.setAttribute('tabindex', '-1');\n element.removeEventListener('keydown', handleFunctionReference);\n });\n }\n\n /** @hidden */\n @HostListener('keydown', ['$event'])\n keyDown(keyboardEvent: KeyboardEvent): void {\n if (\n KeyUtil.isKeyCode(keyboardEvent, [DELETE, BACKSPACE]) &&\n (!this._isInputFocused() || this._tokensSelected()) &&\n !this.disableKeyboardDeletion\n ) {\n const selectedElements = this._getActiveTokens();\n const focusedTokenIndex = this._getFocusedTokenIndex();\n selectedElements.forEach((element) => element.onCloseClick.emit());\n if (selectedElements.length > 0) {\n if (KeyUtil.isKeyCode(keyboardEvent, DELETE)) {\n this._focusInput();\n } else {\n this.focusTokenElement(focusedTokenIndex - 1);\n }\n }\n }\n\n if (\n KeyUtil.isKeyCode(keyboardEvent, BACKSPACE) &&\n this._isInputFocused() &&\n !this._getInputValue() &&\n !this.disableKeyboardDeletion\n ) {\n this.focusTokenElement(this.tokenList.length - 1);\n }\n }\n\n /** @hidden */\n @HostListener('window:resize', [])\n onResize(): void {\n if (this._elementRef) {\n const elementWidth = this._elementRef.nativeElement.getBoundingClientRect().width;\n // if the element is geting smaller, try collapsing tokens\n if (elementWidth <= this.previousElementWidth) {\n this._collapseTokens();\n } else {\n this._expandTokens(); // if it's getting bigger, try expanding\n }\n this.previousElementWidth = elementWidth;\n }\n }\n\n /** @hidden */\n handleKeyDown(event: KeyboardEvent, fromIndex: number): void {\n let newIndex: number | undefined;\n const rtl = this._rtlService && this._rtlService.rtl ? this._rtlService.rtl.getValue() : false;\n if (KeyUtil.isKeyCode(event, SPACE) && !this._isInputFocused()) {\n const token = this.tokenList.find((_, index) => index === fromIndex);\n this.tokenList.forEach((shadowedToken) => {\n if (shadowedToken !== token) {\n shadowedToken.selected = false;\n }\n });\n token && (token.selected = !token.selected);\n event.preventDefault();\n } else if (KeyUtil.isKeyCode(event, ENTER)) {\n this._focusInput();\n } else if ((KeyUtil.isKeyCode(event, LEFT_ARROW) && !rtl) || (KeyUtil.isKeyCode(event, RIGHT_ARROW) && rtl)) {\n this._handleArrowLeft(fromIndex);\n newIndex = fromIndex - 1;\n } else if ((KeyUtil.isKeyCode(event, RIGHT_ARROW) && !rtl) || (KeyUtil.isKeyCode(event, LEFT_ARROW) && rtl)) {\n this._handleArrowRight(fromIndex);\n newIndex = fromIndex + 1;\n } else if (KeyUtil.isKeyCode(event, A) && !this._getInputValue() && this._isControlKey(event)) {\n event.preventDefault();\n this.tokenList.forEach((token) => (token.selected = true));\n }\n if (\n newIndex === this.tokenList.length &&\n ((KeyUtil.isKeyCode(event, RIGHT_ARROW) && !rtl) || (KeyUtil.isKeyCode(event, LEFT_ARROW) && rtl))\n ) {\n this._focusInput();\n } else if (newIndex! > this.tokenList.length - this.moreTokensRight.length && this._isInputFocused()) {\n this.focusTokenElement(newIndex! - this.moreTokensRight.length);\n } else if (newIndex || newIndex === 0) {\n this.focusTokenElement(newIndex);\n }\n }\n\n /** @hidden */\n getCombinedTokenWidth(): number {\n let totalTokenWidth = 0;\n // get the width of each token\n this.tokenList.forEach((token) => {\n totalTokenWidth = totalTokenWidth + token.elementRef.nativeElement.getBoundingClientRect().width;\n });\n // add input width\n if (this.input && this.input.elementRef()) {\n totalTokenWidth = totalTokenWidth + this.input.elementRef().nativeElement.getBoundingClientRect().width;\n }\n // add the width of the \"____ more\" element\n if (this.moreTokensLeft.length > 0 && this.moreElement && this.moreElement.nativeElement) {\n totalTokenWidth = totalTokenWidth + this.moreElement.nativeElement.getBoundingClientRect().width;\n }\n // add the input group addon\n if (this.inputGroupAddonEl && this.inputGroupAddonEl.nativeElement) {\n totalTokenWidth = totalTokenWidth + this.inputGroupAddonEl.nativeElement.getBoundingClientRect().width;\n }\n\n return totalTokenWidth;\n }\n\n /** @hidden */\n moreClicked(): void {\n this.moreClickedEvent.emit();\n }\n\n /** Removes all selected tokens */\n removeSelectedTokens(): void {\n const selectedElements = this._getActiveTokens();\n selectedElements.forEach((element) => element.onRemove.emit());\n }\n\n /** @hidden */\n private _handleArrowLeft(fromIndex: number): void {\n // if the leftmost visible token is selected, and there are moreTokensLeft, need to display a moreTokenLeft\n if (fromIndex === this.moreTokensLeft.length) {\n const poppedToken = this.moreTokensLeft.pop();\n if (poppedToken) {\n this._makeElementVisible(poppedToken.elementRef);\n }\n // and then hide any tokens from the right that no longer fit\n this._collapseTokens('right');\n\n this._cdRef.detectChanges();\n }\n }\n\n /** @hidden */\n private _handleArrowRight(fromIndex: number): void {\n if (fromIndex === this.tokenList.length - this.moreTokensRight.length - 1 && this.moreTokensRight.length) {\n const poppedToken = this.moreTokensRight.pop();\n if (poppedToken) {\n this._makeElementVisible(poppedToken.elementRef);\n }\n // and then hide any tokens from the left that no longer fit\n this._collapseTokens('left');\n\n this._cdRef.detectChanges();\n }\n }\n\n /** @hidden */\n private _collapseTokens(side?: string): void {\n if (this.compact || this.compactCollapse) {\n this._cdRef.detectChanges();\n this._viewContainer.forEach((viewContainer) => viewContainer.clear());\n this.tokenList.forEach((token) => token._viewContainer.createEmbeddedView(token._content));\n\n let elementWidth = this._elementRef.nativeElement.getBoundingClientRect().width;\n let combinedTokenWidth = this.getCombinedTokenWidth(); // the combined width of all tokens, the \"____ more\" text, and the input\n let i = 0;\n /*\n When resizing, we want to collapse the tokens on the left first. However when the user is navigating through\n a group of overflowing tokens using the arrow left key, we may need to hide tokens on the right. So if this\n function has been called with the param 'right' it will collapse tokens from the right side of the list rather\n than the (default) left side.\n */\n if (side === 'right') {\n i = this.tokenList.length - 1;\n }\n while (combinedTokenWidth > elementWidth && (side === 'right' ? i >= 0 : i < this.tokenList.length)) {\n // loop through the tokens and hide them until the combinedTokenWidth fits in the elementWidth\n const token = this.tokenList.find((item, index) => index === i);\n const moreTokens = side === 'right' ? this.moreTokensRight : this.moreTokensLeft;\n\n if (token) {\n if (moreTokens.indexOf(token) === -1) {\n moreTokens.push(token);\n }\n token.elementRef.nativeElement.style.display = 'none';\n }\n // get the new elementWidth and combinedTokenWidth as these will have changed after setting a token display to 'none'\n elementWidth = this._elementRef.nativeElement.getBoundingClientRect().width;\n combinedTokenWidth = this.getCombinedTokenWidth();\n side === 'right' ? i-- : i++;\n }\n\n this._cdRef.detectChanges();\n this._hiddenTokens.forEach((hiddenToken, index) => {\n hiddenToken._viewContainer.clear();\n this._viewContainer.get(index)?.createEmbeddedView(hiddenToken._content);\n });\n } else {\n this._getHiddenCozyTokenCount();\n }\n }\n\n /** @hidden */\n private _expandTokens(): void {\n if (this.compact || this.compactCollapse) {\n let elementWidth = this._elementRef.nativeElement.getBoundingClientRect().width;\n let combinedTokenWidth = this.getCombinedTokenWidth(); // the combined width of all tokens, the \"____ more\" text, and the input\n\n let breakLoop = false;\n let i = this.moreTokensLeft.length - 1 + this.moreTokensRight.length;\n while (combinedTokenWidth < elementWidth && i >= 0 && !breakLoop) {\n // we want to get the first hidden token and check to see if it can fit in the whole tokenizer\n const tokenToCheck = this.tokenList.filter(\n (token) => token.elementRef.nativeElement.style.display === 'none'\n )[i];\n /*\n set display: 'inline-block' and visibility: 'hidden' - this way, the tokenizer width will\n contain the width of the token we might display, without actually making the token visible to the user.\n */\n tokenToCheck.elementRef.nativeElement.style.display = 'inline-block';\n tokenToCheck.elementRef.nativeElement.style.visibility = 'hidden';\n elementWidth = this._elementRef.nativeElement.getBoundingClientRect().width;\n combinedTokenWidth = this.getCombinedTokenWidth();\n /*\n if the width of the inner tokenizer component is still smaller than the whole tokenizer component, we'll\n make the token visible and reduce the hidden count\n */\n if (combinedTokenWidth < elementWidth) {\n tokenToCheck.elementRef.nativeElement.style.visibility = 'visible';\n tokenToCheck._viewContainer.createEmbeddedView(tokenToCheck._content);\n if (this.moreTokensLeft.length) {\n this.moreTokensLeft.pop();\n } else if (this.moreTokensRight.length) {\n this.moreTokensRight.pop();\n }\n } else {\n // otherwise, stop looping and set the token's display back to 'none'\n tokenToCheck.elementRef.nativeElement.style.display = 'none';\n breakLoop = true;\n }\n i--;\n this._cdRef.markForCheck();\n }\n } else {\n this._getHiddenCozyTokenCount();\n }\n }\n\n /** @hidden */\n private _getHiddenCozyTokenCount(): void {\n const elementLeft = this._elementRef.nativeElement.getBoundingClientRect().left;\n this.hiddenCozyTokenCount = 0;\n this.tokenList.forEach((token) => {\n if (\n token.tokenWrapperElement &&\n token.tokenWrapperElement.nativeElement.getBoundingClientRect().right < elementLeft\n ) {\n this.hiddenCozyTokenCount += 1;\n }\n });\n\n this._cdRef.detectChanges();\n }\n\n /** @hidden */\n private _handleInitCozyTokenCount(): void {\n // because justify-content breaks scrollbar, it cannot be used on cozy screens, so use JS to scroll to the end\n this.tokenizerInnerEl.nativeElement.scrollLeft = this.tokenizerInnerEl.nativeElement.scrollWidth;\n this._getHiddenCozyTokenCount();\n if (this.hiddenCozyTokenCount > 0) {\n // need to do this again in case \"____ more\" text was added\n this.tokenizerInnerEl.nativeElement.scrollLeft = this.tokenizerInnerEl.nativeElement.scrollWidth;\n this._getHiddenCozyTokenCount();\n }\n }\n\n /** @hidden */\n private _makeElementVisible(elementRef: ElementRef): void {\n elementRef.nativeElement.style.display = 'inline-block';\n elementRef.nativeElement.style.visibility = 'visible';\n }\n\n private _unsubscribeClicks(): void {\n if (this.tokenListClickSubscriptions && this.tokenListClickSubscriptions.length) {\n this.tokenListClickSubscriptions.forEach((subscription) => {\n subscription.unsubscribe();\n });\n }\n }\n\n private _inputKeydownEvent(): void {\n this.input.elementRef().nativeElement.addEventListener('keydown', (event) => {\n this.handleKeyDown(event, this.tokenList.length);\n });\n }\n\n /** @hidden Method which handles what happens to token when it is clicked and no key is being held down.*/\n private _basicSelected(token, index): void {\n this.tokenList.forEach((shadowedToken) => {\n if (shadowedToken !== token) {\n shadowedToken.selected = false;\n }\n });\n this._firstElementInSelection = index;\n this._lastElementInSelection = index;\n token.selected = true;\n this._ctrlPrevious = false;\n }\n\n /** @hidden Restart first and last elements for shift selection.*/\n private resetFirstAndLastElement(): void {\n const reset = !this.tokenList.some((token) => token.selected);\n if (reset) {\n this._firstElementInSelection = null;\n this._lastElementInSelection = null;\n }\n }\n /** @hidden Method which handles what happens to token when it is clicked and the shift key is being held down.*/\n private _shiftSelected(index): void {\n if (!this._firstElementInSelection && !this._lastElementInSelection) {\n this._firstElementInSelection = index;\n this._lastElementInSelection = index;\n this._directionShiftIsRight = null;\n } else {\n if (this._firstElementInSelection && index < this._firstElementInSelection) {\n if (this._directionShiftIsRight) {\n this._lastElementInSelection = this._firstElementInSelection;\n }\n this._directionShiftIsRight = false;\n this._firstElementInSelection = index;\n } else if (this._lastElementInSelection && index > this._lastElementInSelection) {\n if (!this._directionShiftIsRight) {\n this._firstElementInSelection = this._lastElementInSelection;\n }\n this._directionShiftIsRight = true;\n this._lastElementInSelection = index;\n }\n if (!this._directionShiftIsRight) {\n this._firstElementInSelection = index;\n } else if (this._directionShiftIsRight) {\n this._lastElementInSelection = index;\n }\n }\n\n this.tokenList.forEach((token, indexOfToken) => {\n token.selected =\n this._firstElementInSelection != null &&\n this._lastElementInSelection != null &&\n indexOfToken >= this._firstElementInSelection &&\n indexOfToken <= this._lastElementInSelection;\n });\n this._ctrlPrevious = false;\n }\n\n /** @hidden Method which handles what happens to token when it is clicked and the control or meta key is being held down.*/\n private _ctrlSelected(token, index): void {\n this._firstElementInSelection = null;\n this._lastElementInSelection = null;\n const selected = token.selected;\n token.selected = true;\n if (selected) {\n token.selected = false;\n this.tokenList.forEach((element, indexOfToken) => {\n if (!this._firstElementInSelection) {\n if (element.selected) {\n this._firstElementInSelection = indexOfToken;\n }\n } else {\n this._lastElementInSelection = indexOfToken;\n }\n });\n if (index === this._lastElementInSelection) {\n this._lastElementInSelection = this._lastElementInSelection! - 1;\n }\n if (index === this._firstElementInSelection) {\n this._firstElementInSelection = this._firstElementInSelection! - 1;\n }\n }\n this._ctrlPrevious = true;\n }\n\n /** Get selected and focused tokens */\n private _getActiveTokens(): TokenComponent[] {\n return this.tokenList.filter((item) => item.selected || this._isTokenFocused(item));\n }\n\n /** @hidden */\n private _getFocusedTokenIndex(): number {\n return this.tokenList.toArray().findIndex((token) => this._isTokenFocused(token));\n }\n\n /** @hidden */\n private _isTokenFocused(token: TokenComponent): boolean {\n return token.tokenWrapperElement.nativeElement === document.activeElement;\n }\n\n /** @hidden */\n private _isInputFocused(): boolean {\n return document.activeElement === this.input.elementRef().nativeElement;\n }\n\n /** @hidden */\n private _tokensSelected(): boolean {\n return this.tokenList.some((t) => t.selected);\n }\n\n /** @hidden */\n private _getInputValue(): string {\n return this.input.elementRef().nativeElement.value;\n }\n\n /** @hidden */\n private _focusInput(): void {\n this.input.elementRef().nativeElement.focus();\n }\n\n /** @hidden */\n private _isControlKey(keyboardEvent: KeyboardEvent): boolean {\n return keyboardEvent.ctrlKey || keyboardEvent.metaKey;\n }\n\n /** @hidden */\n private _listenElementEvents(): void {\n fromEvent<Event>(this.elementRef().nativeElement, 'focus', { capture: true })\n .pipe(\n filter((event) => (event['target'] as any)?.tagName === 'INPUT' && this.tokenizerFocusable),\n tap(() => {\n this._tokenizerHasFocus = true;\n this._cdRef.markForCheck();\n }),\n takeUntil(this._onDestroy$)\n )\n .subscribe();\n fromEvent(this.elementRef().nativeElement, 'blur', { capture: true })\n .pipe(\n tap(() => {\n this._tokenizerHasFocus = false;\n this._cdRef.markForCheck();\n }),\n takeUntil(this._onDestroy$)\n )\n .subscribe();\n }\n}\n","<div\n class=\"fd-tokenizer fd-tokenizer--scrollable\"\n [class.is-focus]=\"_tokenizerHasFocus\"\n [class.fd-tokenizer--compact]=\"compact\"\n>\n <div class=\"fd-tokenizer__inner\" #tokenizerInner>\n <ng-content select=\"fd-token\"></ng-content>\n\n <ng-container *ngIf=\"_showOverflowPopover && (compact || compactCollapse); else moreElement\">\n <ng-container *ngTemplateOutlet=\"tokensOverflow\"></ng-container>\n </ng-container>\n\n <ng-content select=\"[fd-form-control]\"></ng-content>\n </div>\n <span fd-input-group-addon *ngIf=\"glyph\" #inputGroupAddOn [compact]=\"compact\" [button]=\"true\" placement=\"after\">\n <button\n fd-button\n [class]=\"compact ? 'fd-tokenizer-addon--compact' : 'fd-tokenizer-addon'\"\n fdType=\"transparent\"\n [compact]=\"compact\"\n [glyph]=\"glyph\"\n type=\"button\"\n ></button>\n </span>\n</div>\n\n<ng-template #tokensOverflow>\n <fd-popover placement=\"bottom-start\" title=\"\" [noArrow]=\"false\" [focusTrapped]=\"true\" [focusAutoCapture]=\"true\">\n <fd-popover-control>\n <ng-container *ngTemplateOutlet=\"moreElement\"></ng-container>\n </fd-popover-control>\n\n <fd-popover-body>\n <ul fd-list class=\"fd-tokenizer__overflow-list\">\n <li fd-list-item class=\"fd-tokenizer__overflow-list-item\" *ngFor=\"let token of _hiddenTokens\">\n <ng-container #viewContainer></ng-container>\n\n <span\n *ngIf=\"!token.readOnly\"\n class=\"fd-token__close\"\n role=\"button\"\n tabindex=\"-1\"\n [attr.aria-label]=\"token.deleteButtonLabel\"\n (click)=\"token.closeClickHandler($event)\"\n ></span>\n </li>\n </ul>\n </fd-popover-body>\n </fd-popover>\n</ng-template>\n\n<ng-template #moreElement>\n <span\n (click)=\"moreClicked()\"\n *ngIf=\"\n (moreTokensLeft.length > 0 || moreTokensRight.length > 0 || hiddenCozyTokenCount > 0) &&\n !open &&\n !_tokenizerHasFocus\n \"\n class=\"fd-tokenizer-more\"\n #moreElement\n >\n <ng-container *ngIf=\"compact || compactCollapse\"\n >{{ moreTokensLeft.length + moreTokensRight.length }} {{ moreTerm }}</ng-container\n >\n <ng-container *ngIf=\"!compact && !compactCollapse\">{{ hiddenCozyTokenCount }} {{ moreTerm }}</ng-container>\n </span>\n</ng-template>\n","import { Directive, ElementRef, Input, OnChanges, OnInit } from '@angular/core';\nimport { applyCssClass } from '@fundamental-ngx/core/utils';\nimport { CssClassBuilder } from '@fundamental-ngx/core/utils';\n\n@Directive({\n // TODO to be discussed\n // eslint-disable-next-line @angular-eslint/directive-selector\n selector: '[fd-tokenizer-input]'\n})\nexport class TokenizerInputDirective implements OnInit, OnChanges, CssClassBuilder {\n /** user's custom classes */\n @Input()\n class: string;\n\n @applyCssClass\n /** CssClassBuilder interface implementation\n * function must return single string\n * function is responsible for order which css classes are applied\n */\n buildComponentCssClass(): string[] {\n return ['fd-tokenizer__input', this.class];\n }\n\n /** @hidden */\n constructor(private _elementRef: ElementRef) {}\n\n /** @hidden */\n ngOnInit(): void {\n this.buildComponentCssClass();\n }\n\n /** @hidden */\n ngOnChanges(): void {\n this.buildComponentCssClass();\n }\n\n /** @hidden */\n elementRef(): ElementRef<any> {\n return this._elementRef;\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TokenComponent } from './token.component';\nimport { TokenizerComponent } from './tokenizer.component';\nimport { TokenizerInputDirective } from './token-input.directive';\nimport { InputGroupModule } from '@fundamental-ngx/core/input-group';\nimport { ButtonModule } from '@fundamental-ngx/core/button';\nimport { PopoverModule } from '@fundamental-ngx/core/popover';\nimport { ListModule } from '@fundamental-ngx/core/list';\n\n@NgModule({\n declarations: [TokenComponent, TokenizerComponent, TokenizerInputDirective],\n imports: [CommonModule, InputGroupModule, ButtonModule, PopoverModule, ListModule],\n exports: [TokenComponent, TokenizerComponent, TokenizerInputDirective]\n})\nexport class TokenModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fundamental-ngx-core-token.mjs","sources":["../../../../libs/core/src/lib/token/token.component.ts","../../../../libs/core/src/lib/token/token.component.html","../../../../libs/core/src/lib/token/tokenizer.component.ts","../../../../libs/core/src/lib/token/tokenizer.component.html","../../../../libs/core/src/lib/token/token-input.directive.ts","../../../../libs/core/src/lib/token/token.module.ts","../../../../libs/core/src/lib/token/fundamental-ngx-core-token.ts"],"sourcesContent":["import {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Optional,\n Output,\n TemplateRef,\n ViewChild,\n ViewContainerRef,\n ViewEncapsulation\n} from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { ContentDensityService } from '@fundamental-ngx/core/utils';\n\n/**\n * A token is used to represent contextualizing information.\n * They can be useful to show applied filters, selected values for form fields or object metadata.\n */\n@Component({\n selector: 'fd-token',\n templateUrl: './token.component.html',\n styleUrls: ['./token.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class TokenComponent implements OnInit, AfterViewInit, OnDestroy {\n /** Whether the token is disabled. */\n @Input()\n disabled = false;\n\n /** Whether the token is compact. */\n @Input()\n compact?: boolean;\n\n /** @hidden */\n @ViewChild('tokenWrapperElement')\n tokenWrapperElement: ElementRef;\n\n /** @hidden */\n @ViewChild('content')\n readonly _content: TemplateRef<any>;\n\n /** @hidden */\n @ViewChild('viewContainer', { read: ViewContainerRef })\n readonly _viewContainer: ViewContainerRef;\n\n private _selected = false;\n\n private _subscriptions = new Subscription();\n\n /** Whether the token is selected. */\n @Input()\n get selected(): boolean {\n return this._selected;\n }\n\n set selected(val: boolean) {\n if (this._selected !== val) {\n this._cdRef.markForCheck();\n }\n this._selected = val;\n }\n\n /** Whether the token is read-only. */\n @Input()\n readOnly = false;\n\n /** label for close icon */\n @Input()\n deleteButtonLabel = 'Deletable';\n\n /** role description for token */\n @Input()\n ariaRoleDescription = 'token';\n\n /** Emitted when the *x* icon is clicked. Specifically, any pseudo-element. */\n @Output()\n // eslint-disable-next-line @angular-eslint/no-output-on-prefix\n readonly onCloseClick: EventEmitter<MouseEvent> = new EventEmitter<MouseEvent>();\n\n /** Emitted when token should be removed */\n @Output()\n // eslint-disable-next-line @angular-eslint/no-output-on-prefix\n readonly onRemove: EventEmitter<void> = new EventEmitter<void>();\n\n /** Emitted when a token is clicked. */\n @Output()\n // eslint-disable-next-line @angular-eslint/no-output-on-prefix\n onTokenClick: EventEmitter<KeyboardEvent> = new EventEmitter<KeyboardEvent>();\n\n constructor(\n public elementRef: ElementRef,\n private _cdRef: ChangeDetectorRef,\n @Optional() private _contentDensityService: ContentDensityService\n ) {}\n\n /** @hidden */\n /** @hidden */\n ngOnInit(): void {\n if (this.compact === undefined && this._contentDensityService) {\n this._subscriptions.add(\n this._contentDensityService._isCompactDensity.subscribe((isCompact) => {\n this.compact = isCompact;\n this._cdRef.markForCheck();\n })\n );\n }\n }\n\n /** @hidden */\n ngAfterViewInit(): void {\n this._viewContainer.createEmbeddedView(this._content);\n }\n\n /** @hidden */\n ngOnDestroy(): void {\n this._subscriptions.unsubscribe();\n }\n\n /** @hidden */\n closeClickHandler(event?): void {\n if (event) {\n event.stopPropagation();\n if (!this.disabled) {\n this.onCloseClick.emit(event);\n }\n }\n }\n\n /** @hidden */\n tokenClickHandler(event): void {\n this.onTokenClick.emit(event);\n }\n}\n","<span\n #tokenWrapperElement\n class=\"fd-token\"\n role=\"option\"\n [attr.aria-roledescription]=\"ariaRoleDescription\"\n (click)=\"tokenClickHandler($event)\"\n [class.fd-token__disabled]=\"disabled\"\n [class.fd-token--compact]=\"compact\"\n [class.fd-token--selected]=\"selected\"\n [class.fd-token--readonly]=\"readOnly\"\n [attr.aria-selected]=\"selected\"\n [attr.aria-readonly]=\"readOnly\"\n>\n <span class=\"fd-token__text no-text-select\">\n <ng-container #viewContainer></ng-container>\n </span>\n <span\n (click)=\"closeClickHandler($event)\"\n role=\"button\"\n [attr.aria-label]=\"deleteButtonLabel\"\n *ngIf=\"!readOnly\"\n class=\"fd-token__close\"\n tabindex=\"-1\"\n ></span>\n</span>\n\n<ng-template #content>\n <ng-content></ng-content>\n</ng-template>\n","import {\n AfterContentInit,\n AfterViewChecked,\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChild,\n ContentChildren,\n ElementRef,\n EventEmitter,\n forwardRef,\n HostListener,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Optional,\n Output,\n QueryList,\n Renderer2,\n ViewChild,\n ViewChildren,\n ViewContainerRef,\n ViewEncapsulation\n} from '@angular/core';\nimport { A, BACKSPACE, DELETE, ENTER, LEFT_ARROW, RIGHT_ARROW, SPACE } from '@angular/cdk/keycodes';\nimport { fromEvent, Subject, Subscription } from 'rxjs';\nimport { filter, takeUntil, tap } from 'rxjs/operators';\nimport { FormControlComponent } from '@fundamental-ngx/core/form';\nimport {\n ContentDensityService,\n CssClassBuilder,\n applyCssClass,\n RtlService,\n KeyUtil\n} from '@fundamental-ngx/core/utils';\nimport { TokenComponent } from './token.component';\n\n@Component({\n selector: 'fd-tokenizer',\n templateUrl: './tokenizer.component.html',\n styleUrls: ['./tokenizer.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class TokenizerComponent\n implements AfterViewChecked, AfterViewInit, AfterContentInit, OnDestroy, CssClassBuilder, OnInit, OnChanges\n{\n /** user's custom classes */\n @Input()\n class: string;\n\n /** Disables possibility to remove tokens by keyboard */\n @Input()\n disableKeyboardDeletion = false;\n\n /** role description for tokenizer component */\n @Input()\n ariaRoleDescription = 'tokenizer';\n\n /** @hidden */\n @ContentChildren(forwardRef(() => TokenComponent))\n tokenList: QueryList<TokenComponent>;\n\n /** @hidden */\n @ContentChild(forwardRef(() => FormControlComponent))\n input: FormControlComponent;\n\n /** @hidden */\n @ViewChild('tokenizerInner')\n tokenizerInnerEl: ElementRef;\n\n /** @hidden */\n @ViewChild('moreElement')\n moreElement: ElementRef;\n\n /** @hidden */\n @ViewChild('inputGroupAddOn') set content(content: ElementRef) {\n this.inputGroupAddonEl = content;\n }\n\n /** @hidden */\n @ViewChildren('viewContainer', { read: ViewContainerRef })\n readonly _viewContainer: QueryList<ViewContainerRef>;\n\n /** @hidden */\n get _hiddenTokens(): TokenComponent[] {\n return this.tokenList.filter((token) => token.elementRef.nativeElement.style.display === 'none');\n }\n\n /** @hidden */\n inputGroupAddonEl: ElementRef;\n\n /** Whether the tokenizer is compact */\n @Input()\n compact?: boolean;\n\n /** Whether to use cozy visuals but compact collapsing behavior. */\n @Input()\n compactCollapse = false;\n\n /** Whether tokenizer should have fake focus indicator, when input is focused inside*/\n @Input()\n tokenizerFocusable = true;\n\n /** The value for the tokenizer input */\n @Input()\n inputValue: string;\n\n /** Icon of the button on the right of the input field. */\n @Input()\n glyph: string;\n\n /** Word to use for when there are extra tokens. */\n @Input()\n moreTerm = 'more';\n\n /** @hidden */\n @Input()\n open: boolean;\n\n /** Event emitted when the search term changes. Use *$event* to access the new term. */\n @Output()\n readonly moreClickedEvent: EventEmitter<any> = new EventEmitter<any>();\n\n /** @hidden */\n previousElementWidth: number;\n\n /** @hidden */\n moreTokensLeft: Array<TokenComponent> = [];\n\n /** @hidden */\n moreTokensRight: Array<TokenComponent> = [];\n\n /** @hidden */\n previousTokenCount: number;\n\n /** @hidden */\n tokenListChangesSubscription: Subscription;\n\n /** @hidden */\n tokenListClickSubscriptions: Subscription[] = [];\n\n /** @hidden */\n hiddenCozyTokenCount = 0;\n\n /** @hidden Used to add focus to tokenizer element */\n _tokenizerHasFocus = false;\n\n /** @hidden */\n _showOverflowPopover = true;\n\n /** @hidden */\n private _contentDensitySubscription = new Subscription();\n\n /** @hidden */\n /* Variable which will keep the index of the first token pressed in the tokenizer*/\n private _firstElementInSelection: number | null = null;\n\n /** @hidden */\n /* Variable which will keep the index of the last token pressed in the tokenizer*/\n private _lastElementInSelection: number | null = null;\n\n /** @hidden */\n /* Flag which will say if the last keyboard and click operation they used was using control*/\n private _ctrlPrevious: boolean;\n\n /** @hidden */\n /* Flag which will say if they held shift and clicked highlighting elements before or*/\n private _directionShiftIsRight: boolean | null = null;\n\n /** An RxJS Subject that will kill the data stream upon destruction (for unsubscribing) */\n private readonly _onDestroy$: Subject<void> = new Subject<void>();\n\n /** @hidden */\n ngAfterViewInit(): void {\n if (this.input && this.input.elementRef()) {\n this._inputKeydownEvent();\n }\n }\n\n /** @hidden */\n ngAfterViewChecked(): void {\n if (this.tokenList) {\n this.previousTokenCount = this.tokenList.length;\n }\n this.handleTokenClickSubscriptions();\n // watch for changes to the tokenList and attempt to expand/collapse tokens as needed\n if (this.tokenListChangesSubscription) {\n this.tokenListChangesSubscription.unsubscribe();\n }\n this.tokenListChangesSubscription = this.tokenList.changes.subscribe(() => {\n this._resetTokens();\n });\n this.tokenList.forEach((token) => {\n this.tokenListChangesSubscription.add(\n token.onCloseClick.subscribe(() => {\n this._resetTokens();\n })\n );\n });\n if (!this.compact && !this.compactCollapse) {\n this._handleInitCozyTokenCount();\n }\n }\n\n /** @hidden */\n ngAfterContentInit(): void {\n this._listenElementEvents();\n this.previousElementWidth = this._elementRef.nativeElement.getBoundingClientRect().width;\n this.onResize();\n }\n\n /** @hidden */\n ngOnDestroy(): void {\n if (this.tokenListChangesSubscription) {\n this.tokenListChangesSubscription.unsubscribe();\n }\n this._onDestroy$.next();\n this._onDestroy$.complete();\n this._unsubscribeClicks();\n this._contentDensitySubscription.unsubscribe();\n }\n\n /** @hidden */\n ngOnInit(): void {\n if (this.compact === undefined && this._contentDensityService) {\n this._contentDensitySubscription.add(\n this._contentDensityService._isCompactDensity.subscribe((isCompact) => {\n this.compact = isCompact;\n this._cdRef.markForCheck();\n this.buildComponentCssClass();\n })\n );\n }\n this.buildComponentCssClass();\n }\n\n /** @hidden */\n ngOnChanges(): void {\n this.buildComponentCssClass();\n }\n\n constructor(\n private _elementRef: ElementRef,\n @Optional() private _contentDensityService: ContentDensityService,\n private _cdRef: ChangeDetectorRef,\n @Optional() private _rtlService: RtlService,\n private _renderer: Renderer2\n ) {\n this._renderer.listen('window', 'click', (e: Event) => {\n if (this.elementRef().nativeElement.contains(e.target) === false) {\n this.tokenList.forEach((token) => {\n token.selected = false;\n });\n }\n });\n }\n\n @applyCssClass\n /** CssClassBuilder interface implementation\n * function must return single string\n * function is responsible for order which css classes are applied\n */\n buildComponentCssClass(): string[] {\n return [this.class];\n }\n\n elementRef(): ElementRef {\n return this._elementRef;\n }\n\n /** @hidden */\n handleTokenClickSubscriptions(): void {\n this._unsubscribeClicks();\n this.tokenList.forEach((token, index) => {\n this.tokenListClickSubscriptions.push(\n token.onTokenClick.subscribe((event) => {\n event.stopPropagation();\n this.focusTokenElement(index);\n if (this._isControlKey(event)) {\n this._ctrlSelected(token, index);\n } else if (!event.shiftKey || this._ctrlPrevious) {\n this._basicSelected(token, index);\n } else if (event.shiftKey) {\n this.resetFirstAndLastElement();\n this._shiftSelected(index);\n }\n })\n );\n });\n }\n\n /** @hidden */\n focusTokenElement(newIndex: number): HTMLElement | undefined {\n let elementToFocus: HTMLElement | undefined;\n const tokenListArray: TokenComponent[] = this.tokenList.toArray();\n if (tokenListArray[newIndex]) {\n elementToFocus = tokenListArray[newIndex].tokenWrapperElement.nativeElement;\n // element needs tabindex in order to be focused\n elementToFocus!.setAttribute('tabindex', '0');\n elementToFocus!.focus();\n this.addKeyboardListener(elementToFocus!, newIndex);\n }\n\n return elementToFocus;\n }\n\n /** @hidden */\n addKeyboardListener(element: HTMLElement, newIndex: number): void {\n // function needs to be defined in order to be referenced later by addEventListener/removeEventListener\n const handleFunctionReference = (e): void => {\n if (newIndex || newIndex === 0) {\n this.handleKeyDown(e, newIndex);\n }\n };\n element.addEventListener('keydown', handleFunctionReference);\n element.addEventListener('blur', () => {\n element.setAttribute('tabindex', '-1');\n element.removeEventListener('keydown', handleFunctionReference);\n });\n }\n\n /** @hidden */\n @HostListener('keydown', ['$event'])\n keyDown(keyboardEvent: KeyboardEvent): void {\n if (\n KeyUtil.isKeyCode(keyboardEvent, [DELETE, BACKSPACE]) &&\n (!this._isInputFocused() || this._tokensSelected()) &&\n !this.disableKeyboardDeletion\n ) {\n const selectedElements = this._getActiveTokens();\n const focusedTokenIndex = this._getFocusedTokenIndex();\n selectedElements.forEach((element) => element.onCloseClick.emit());\n if (selectedElements.length > 0) {\n if (KeyUtil.isKeyCode(keyboardEvent, DELETE)) {\n this._focusInput();\n } else {\n this.focusTokenElement(focusedTokenIndex - 1);\n }\n }\n }\n\n if (\n KeyUtil.isKeyCode(keyboardEvent, BACKSPACE) &&\n this._isInputFocused() &&\n !this._getInputValue() &&\n !this.disableKeyboardDeletion\n ) {\n this.focusTokenElement(this.tokenList.length - 1);\n }\n }\n\n /** @hidden */\n @HostListener('window:resize', [])\n onResize(): void {\n if (this._elementRef) {\n const elementWidth = this._elementRef.nativeElement.getBoundingClientRect().width;\n this._resetTokens();\n this.previousElementWidth = elementWidth;\n }\n }\n\n /** @hidden */\n handleKeyDown(event: KeyboardEvent, fromIndex: number): void {\n let newIndex: number | undefined;\n const rtl = this._rtlService && this._rtlService.rtl ? this._rtlService.rtl.getValue() : false;\n if (KeyUtil.isKeyCode(event, SPACE) && !this._isInputFocused()) {\n const token = this.tokenList.find((_, index) => index === fromIndex);\n this.tokenList.forEach((shadowedToken) => {\n if (shadowedToken !== token) {\n shadowedToken.selected = false;\n }\n });\n token && (token.selected = !token.selected);\n event.preventDefault();\n } else if (KeyUtil.isKeyCode(event, ENTER)) {\n this._focusInput();\n } else if ((KeyUtil.isKeyCode(event, LEFT_ARROW) && !rtl) || (KeyUtil.isKeyCode(event, RIGHT_ARROW) && rtl)) {\n this._handleArrowLeft(fromIndex);\n newIndex = fromIndex - 1;\n } else if ((KeyUtil.isKeyCode(event, RIGHT_ARROW) && !rtl) || (KeyUtil.isKeyCode(event, LEFT_ARROW) && rtl)) {\n this._handleArrowRight(fromIndex);\n newIndex = fromIndex + 1;\n } else if (KeyUtil.isKeyCode(event, A) && !this._getInputValue() && this._isControlKey(event)) {\n event.preventDefault();\n this.tokenList.forEach((token) => (token.selected = true));\n }\n if (\n newIndex === this.tokenList.length &&\n ((KeyUtil.isKeyCode(event, RIGHT_ARROW) && !rtl) || (KeyUtil.isKeyCode(event, LEFT_ARROW) && rtl))\n ) {\n this._focusInput();\n } else if (newIndex! > this.tokenList.length - this.moreTokensRight.length && this._isInputFocused()) {\n this.focusTokenElement(newIndex! - this.moreTokensRight.length);\n } else if (newIndex || newIndex === 0) {\n this.focusTokenElement(newIndex);\n }\n }\n\n /** @hidden */\n getCombinedTokenWidth(): number {\n let totalTokenWidth = 0;\n // get the width of each token\n this.tokenList.forEach((token) => {\n totalTokenWidth = totalTokenWidth + token.elementRef.nativeElement.getBoundingClientRect().width;\n });\n // add input width\n if (this.input && this.input.elementRef()) {\n totalTokenWidth = totalTokenWidth + this.input.elementRef().nativeElement.getBoundingClientRect().width;\n }\n // add the width of the \"____ more\" element\n if (this.moreTokensLeft.length > 0 && this.moreElement && this.moreElement.nativeElement) {\n totalTokenWidth = totalTokenWidth + this.moreElement.nativeElement.getBoundingClientRect().width;\n }\n // add the input group addon\n if (this.inputGroupAddonEl && this.inputGroupAddonEl.nativeElement) {\n totalTokenWidth = totalTokenWidth + this.inputGroupAddonEl.nativeElement.getBoundingClientRect().width;\n }\n\n return totalTokenWidth;\n }\n\n /** @hidden */\n moreClicked(): void {\n this.moreClickedEvent.emit();\n }\n\n /** Removes all selected tokens */\n removeSelectedTokens(): void {\n const selectedElements = this._getActiveTokens();\n selectedElements.forEach((element) => element.onRemove.emit());\n }\n\n /** @hidden */\n private _handleArrowLeft(fromIndex: number): void {\n // if the leftmost visible token is selected, and there are moreTokensLeft, need to display a moreTokenLeft\n if (fromIndex === this.moreTokensLeft.length) {\n const poppedToken = this.moreTokensLeft.pop();\n if (poppedToken) {\n this._makeElementVisible(poppedToken.elementRef);\n }\n // and then hide any tokens from the right that no longer fit\n this._collapseTokens('right');\n\n this._cdRef.detectChanges();\n }\n }\n\n /** @hidden */\n private _handleArrowRight(fromIndex: number): void {\n if (fromIndex === this.tokenList.length - this.moreTokensRight.length - 1 && this.moreTokensRight.length) {\n const poppedToken = this.moreTokensRight.pop();\n if (poppedToken) {\n this._makeElementVisible(poppedToken.elementRef);\n }\n // and then hide any tokens from the left that no longer fit\n this._collapseTokens('left');\n\n this._cdRef.detectChanges();\n }\n }\n\n /** @hidden */\n private _collapseTokens(side?: string): void {\n if (this.compact || this.compactCollapse) {\n this._cdRef.detectChanges();\n this._viewContainer.forEach((viewContainer) => viewContainer.clear());\n this.tokenList.forEach((token) => token._viewContainer.createEmbeddedView(token._content));\n\n let elementWidth = this._elementRef.nativeElement.getBoundingClientRect().width;\n let combinedTokenWidth = this.getCombinedTokenWidth(); // the combined width of all tokens, the \"____ more\" text, and the input\n let i = 0;\n /*\n When resizing, we want to collapse the tokens on the left first. However when the user is navigating through\n a group of overflowing tokens using the arrow left key, we may need to hide tokens on the right. So if this\n function has been called with the param 'right' it will collapse tokens from the right side of the list rather\n than the (default) left side.\n */\n if (side === 'right') {\n i = this.tokenList.length - 1;\n }\n while (combinedTokenWidth > elementWidth && (side === 'right' ? i >= 0 : i < this.tokenList.length)) {\n // loop through the tokens and hide them until the combinedTokenWidth fits in the elementWidth\n const token = this.tokenList.find((item, index) => index === i);\n const moreTokens = side === 'right' ? this.moreTokensRight : this.moreTokensLeft;\n\n if (token) {\n if (moreTokens.indexOf(token) === -1) {\n moreTokens.push(token);\n }\n token.elementRef.nativeElement.style.display = 'none';\n }\n // get the new elementWidth and combinedTokenWidth as these will have changed after setting a token display to 'none'\n elementWidth = this._elementRef.nativeElement.getBoundingClientRect().width;\n combinedTokenWidth = this.getCombinedTokenWidth();\n side === 'right' ? i-- : i++;\n }\n\n this._cdRef.detectChanges();\n this._hiddenTokens.forEach((hiddenToken, index) => {\n hiddenToken._viewContainer.clear();\n this._viewContainer.get(index)?.createEmbeddedView(hiddenToken._content);\n });\n } else {\n this._getHiddenCozyTokenCount();\n }\n }\n\n /** @hidden */\n private _resetTokens(): void {\n this.moreTokensLeft = [];\n this.moreTokensRight = [];\n if (this.compact || this.compactCollapse) {\n this.tokenList.forEach((token) => {\n this._makeElementVisible(token.elementRef);\n });\n this._cdRef.markForCheck();\n this._collapseTokens();\n } else {\n this._getHiddenCozyTokenCount();\n }\n this.handleTokenClickSubscriptions();\n this.previousTokenCount = this.tokenList.length;\n }\n\n /** @hidden */\n private _getHiddenCozyTokenCount(): void {\n const elementLeft = this._elementRef.nativeElement.getBoundingClientRect().left;\n this.hiddenCozyTokenCount = 0;\n this.tokenList.forEach((token) => {\n if (\n token.tokenWrapperElement &&\n token.tokenWrapperElement.nativeElement.getBoundingClientRect().right < elementLeft\n ) {\n this.hiddenCozyTokenCount += 1;\n }\n });\n\n this._cdRef.detectChanges();\n }\n\n /** @hidden */\n private _handleInitCozyTokenCount(): void {\n // because justify-content breaks scrollbar, it cannot be used on cozy screens, so use JS to scroll to the end\n this.tokenizerInnerEl.nativeElement.scrollLeft = this.tokenizerInnerEl.nativeElement.scrollWidth;\n this._getHiddenCozyTokenCount();\n if (this.hiddenCozyTokenCount > 0) {\n // need to do this again in case \"____ more\" text was added\n this.tokenizerInnerEl.nativeElement.scrollLeft = this.tokenizerInnerEl.nativeElement.scrollWidth;\n this._getHiddenCozyTokenCount();\n }\n }\n\n /** @hidden */\n private _makeElementVisible(elementRef: ElementRef): void {\n elementRef.nativeElement.style.display = 'inline-block';\n elementRef.nativeElement.style.visibility = 'visible';\n }\n\n private _unsubscribeClicks(): void {\n if (this.tokenListClickSubscriptions && this.tokenListClickSubscriptions.length) {\n this.tokenListClickSubscriptions.forEach((subscription) => {\n subscription.unsubscribe();\n });\n }\n }\n\n private _inputKeydownEvent(): void {\n this.input.elementRef().nativeElement.addEventListener('keydown', (event) => {\n this.handleKeyDown(event, this.tokenList.length);\n });\n }\n\n /** @hidden Method which handles what happens to token when it is clicked and no key is being held down.*/\n private _basicSelected(token, index): void {\n this.tokenList.forEach((shadowedToken) => {\n if (shadowedToken !== token) {\n shadowedToken.selected = false;\n }\n });\n this._firstElementInSelection = index;\n this._lastElementInSelection = index;\n token.selected = true;\n this._ctrlPrevious = false;\n }\n\n /** @hidden Restart first and last elements for shift selection.*/\n private resetFirstAndLastElement(): void {\n const reset = !this.tokenList.some((token) => token.selected);\n if (reset) {\n this._firstElementInSelection = null;\n this._lastElementInSelection = null;\n }\n }\n /** @hidden Method which handles what happens to token when it is clicked and the shift key is being held down.*/\n private _shiftSelected(index): void {\n if (!this._firstElementInSelection && !this._lastElementInSelection) {\n this._firstElementInSelection = index;\n this._lastElementInSelection = index;\n this._directionShiftIsRight = null;\n } else {\n if (this._firstElementInSelection && index < this._firstElementInSelection) {\n if (this._directionShiftIsRight) {\n this._lastElementInSelection = this._firstElementInSelection;\n }\n this._directionShiftIsRight = false;\n this._firstElementInSelection = index;\n } else if (this._lastElementInSelection && index > this._lastElementInSelection) {\n if (!this._directionShiftIsRight) {\n this._firstElementInSelection = this._lastElementInSelection;\n }\n this._directionShiftIsRight = true;\n this._lastElementInSelection = index;\n }\n if (!this._directionShiftIsRight) {\n this._firstElementInSelection = index;\n } else if (this._directionShiftIsRight) {\n this._lastElementInSelection = index;\n }\n }\n\n this.tokenList.forEach((token, indexOfToken) => {\n token.selected =\n this._firstElementInSelection != null &&\n this._lastElementInSelection != null &&\n indexOfToken >= this._firstElementInSelection &&\n indexOfToken <= this._lastElementInSelection;\n });\n this._ctrlPrevious = false;\n }\n\n /** @hidden Method which handles what happens to token when it is clicked and the control or meta key is being held down.*/\n private _ctrlSelected(token, index): void {\n this._firstElementInSelection = null;\n this._lastElementInSelection = null;\n const selected = token.selected;\n token.selected = true;\n if (selected) {\n token.selected = false;\n this.tokenList.forEach((element, indexOfToken) => {\n if (!this._firstElementInSelection) {\n if (element.selected) {\n this._firstElementInSelection = indexOfToken;\n }\n } else {\n this._lastElementInSelection = indexOfToken;\n }\n });\n if (index === this._lastElementInSelection) {\n this._lastElementInSelection = this._lastElementInSelection! - 1;\n }\n if (index === this._firstElementInSelection) {\n this._firstElementInSelection = this._firstElementInSelection! - 1;\n }\n }\n this._ctrlPrevious = true;\n }\n\n /** Get selected and focused tokens */\n private _getActiveTokens(): TokenComponent[] {\n return this.tokenList.filter((item) => item.selected || this._isTokenFocused(item));\n }\n\n /** @hidden */\n private _getFocusedTokenIndex(): number {\n return this.tokenList.toArray().findIndex((token) => this._isTokenFocused(token));\n }\n\n /** @hidden */\n private _isTokenFocused(token: TokenComponent): boolean {\n return token.tokenWrapperElement.nativeElement === document.activeElement;\n }\n\n /** @hidden */\n private _isInputFocused(): boolean {\n return document.activeElement === this.input.elementRef().nativeElement;\n }\n\n /** @hidden */\n private _tokensSelected(): boolean {\n return this.tokenList.some((t) => t.selected);\n }\n\n /** @hidden */\n private _getInputValue(): string {\n return this.input.elementRef().nativeElement.value;\n }\n\n /** @hidden */\n private _focusInput(): void {\n this.input.elementRef().nativeElement.focus();\n }\n\n /** @hidden */\n private _isControlKey(keyboardEvent: KeyboardEvent): boolean {\n return keyboardEvent.ctrlKey || keyboardEvent.metaKey;\n }\n\n /** @hidden */\n private _listenElementEvents(): void {\n fromEvent<Event>(this.elementRef().nativeElement, 'focus', { capture: true })\n .pipe(\n filter((event) => (event['target'] as any)?.tagName === 'INPUT' && this.tokenizerFocusable),\n tap(() => {\n this._tokenizerHasFocus = true;\n this._cdRef.markForCheck();\n }),\n takeUntil(this._onDestroy$)\n )\n .subscribe();\n fromEvent(this.elementRef().nativeElement, 'blur', { capture: true })\n .pipe(\n tap(() => {\n this._tokenizerHasFocus = false;\n this._cdRef.markForCheck();\n }),\n takeUntil(this._onDestroy$)\n )\n .subscribe();\n }\n}\n","<div\n class=\"fd-tokenizer fd-tokenizer--scrollable\"\n [class.is-focus]=\"_tokenizerHasFocus\"\n [class.fd-tokenizer--compact]=\"compact\"\n>\n <div class=\"fd-tokenizer__inner\" #tokenizerInner>\n <ng-content select=\"fd-token\"></ng-content>\n\n <ng-container *ngIf=\"_showOverflowPopover && (compact || compactCollapse); else moreElement\">\n <ng-container *ngTemplateOutlet=\"tokensOverflow\"></ng-container>\n </ng-container>\n\n <ng-content select=\"[fd-form-control]\"></ng-content>\n </div>\n <span fd-input-group-addon *ngIf=\"glyph\" #inputGroupAddOn [compact]=\"compact\" [button]=\"true\" placement=\"after\">\n <button\n fd-button\n [class]=\"compact ? 'fd-tokenizer-addon--compact' : 'fd-tokenizer-addon'\"\n fdType=\"transparent\"\n [compact]=\"compact\"\n [glyph]=\"glyph\"\n type=\"button\"\n ></button>\n </span>\n</div>\n\n<ng-template #tokensOverflow>\n <fd-popover placement=\"bottom-start\" title=\"\" [noArrow]=\"false\" [focusTrapped]=\"true\" [focusAutoCapture]=\"true\">\n <fd-popover-control>\n <ng-container *ngTemplateOutlet=\"moreElement\"></ng-container>\n </fd-popover-control>\n\n <fd-popover-body>\n <ul fd-list class=\"fd-tokenizer__overflow-list\">\n <li fd-list-item class=\"fd-tokenizer__overflow-list-item\" *ngFor=\"let token of _hiddenTokens\">\n <ng-container #viewContainer></ng-container>\n\n <span\n *ngIf=\"!token.readOnly\"\n class=\"fd-token__close\"\n role=\"button\"\n tabindex=\"-1\"\n [attr.aria-label]=\"token.deleteButtonLabel\"\n (click)=\"token.closeClickHandler($event)\"\n ></span>\n </li>\n </ul>\n </fd-popover-body>\n </fd-popover>\n</ng-template>\n\n<ng-template #moreElement>\n <span\n (click)=\"moreClicked()\"\n *ngIf=\"\n (moreTokensLeft.length > 0 || moreTokensRight.length > 0 || hiddenCozyTokenCount > 0) &&\n !open &&\n !_tokenizerHasFocus\n \"\n class=\"fd-tokenizer-more\"\n #moreElement\n >\n <ng-container *ngIf=\"compact || compactCollapse\"\n >{{ moreTokensLeft.length + moreTokensRight.length }} {{ moreTerm }}</ng-container\n >\n <ng-container *ngIf=\"!compact && !compactCollapse\">{{ hiddenCozyTokenCount }} {{ moreTerm }}</ng-container>\n </span>\n</ng-template>\n","import { Directive, ElementRef, Input, OnChanges, OnInit } from '@angular/core';\nimport { applyCssClass } from '@fundamental-ngx/core/utils';\nimport { CssClassBuilder } from '@fundamental-ngx/core/utils';\n\n@Directive({\n // TODO to be discussed\n // eslint-disable-next-line @angular-eslint/directive-selector\n selector: '[fd-tokenizer-input]'\n})\nexport class TokenizerInputDirective implements OnInit, OnChanges, CssClassBuilder {\n /** user's custom classes */\n @Input()\n class: string;\n\n @applyCssClass\n /** CssClassBuilder interface implementation\n * function must return single string\n * function is responsible for order which css classes are applied\n */\n buildComponentCssClass(): string[] {\n return ['fd-tokenizer__input', this.class];\n }\n\n /** @hidden */\n constructor(private _elementRef: ElementRef) {}\n\n /** @hidden */\n ngOnInit(): void {\n this.buildComponentCssClass();\n }\n\n /** @hidden */\n ngOnChanges(): void {\n this.buildComponentCssClass();\n }\n\n /** @hidden */\n elementRef(): ElementRef<any> {\n return this._elementRef;\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TokenComponent } from './token.component';\nimport { TokenizerComponent } from './tokenizer.component';\nimport { TokenizerInputDirective } from './token-input.directive';\nimport { InputGroupModule } from '@fundamental-ngx/core/input-group';\nimport { ButtonModule } from '@fundamental-ngx/core/button';\nimport { PopoverModule } from '@fundamental-ngx/core/popover';\nimport { ListModule } from '@fundamental-ngx/core/list';\n\n@NgModule({\n declarations: [TokenComponent, TokenizerComponent, TokenizerInputDirective],\n imports: [CommonModule, InputGroupModule, ButtonModule, PopoverModule, ListModule],\n exports: [TokenComponent, TokenizerComponent, TokenizerInputDirective]\n})\nexport class TokenModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
@@ -202,12 +202,12 @@ class TokenizerComponent {
202
202
  this.tokenListChangesSubscription.unsubscribe();
203
203
  }
204
204
  this.tokenListChangesSubscription = this.tokenList.changes.subscribe(() => {
205
- this._cdRef.detectChanges();
206
- this.moreTokensLeft = [];
207
- this.moreTokensRight = [];
208
- this.previousTokenCount > this.tokenList.length ? this._expandTokens() : this._collapseTokens();
209
- this.previousTokenCount = this.tokenList.length;
210
- this.handleTokenClickSubscriptions();
205
+ this._resetTokens();
206
+ });
207
+ this.tokenList.forEach((token) => {
208
+ this.tokenListChangesSubscription.add(token.onCloseClick.subscribe(() => {
209
+ this._resetTokens();
210
+ }));
211
211
  });
212
212
  if (!this.compact && !this.compactCollapse) {
213
213
  this._handleInitCozyTokenCount();
@@ -329,13 +329,7 @@ class TokenizerComponent {
329
329
  onResize() {
330
330
  if (this._elementRef) {
331
331
  const elementWidth = this._elementRef.nativeElement.getBoundingClientRect().width;
332
- // if the element is geting smaller, try collapsing tokens
333
- if (elementWidth <= this.previousElementWidth) {
334
- this._collapseTokens();
335
- }
336
- else {
337
- this._expandTokens(); // if it's getting bigger, try expanding
338
- }
332
+ this._resetTokens();
339
333
  this.previousElementWidth = elementWidth;
340
334
  }
341
335
  }
@@ -478,49 +472,21 @@ class TokenizerComponent {
478
472
  }
479
473
  }
480
474
  /** @hidden */
481
- _expandTokens() {
475
+ _resetTokens() {
476
+ this.moreTokensLeft = [];
477
+ this.moreTokensRight = [];
482
478
  if (this.compact || this.compactCollapse) {
483
- let elementWidth = this._elementRef.nativeElement.getBoundingClientRect().width;
484
- let combinedTokenWidth = this.getCombinedTokenWidth(); // the combined width of all tokens, the "____ more" text, and the input
485
- let breakLoop = false;
486
- let i = this.moreTokensLeft.length - 1 + this.moreTokensRight.length;
487
- while (combinedTokenWidth < elementWidth && i >= 0 && !breakLoop) {
488
- // we want to get the first hidden token and check to see if it can fit in the whole tokenizer
489
- const tokenToCheck = this.tokenList.filter((token) => token.elementRef.nativeElement.style.display === 'none')[i];
490
- /*
491
- set display: 'inline-block' and visibility: 'hidden' - this way, the tokenizer width will
492
- contain the width of the token we might display, without actually making the token visible to the user.
493
- */
494
- tokenToCheck.elementRef.nativeElement.style.display = 'inline-block';
495
- tokenToCheck.elementRef.nativeElement.style.visibility = 'hidden';
496
- elementWidth = this._elementRef.nativeElement.getBoundingClientRect().width;
497
- combinedTokenWidth = this.getCombinedTokenWidth();
498
- /*
499
- if the width of the inner tokenizer component is still smaller than the whole tokenizer component, we'll
500
- make the token visible and reduce the hidden count
501
- */
502
- if (combinedTokenWidth < elementWidth) {
503
- tokenToCheck.elementRef.nativeElement.style.visibility = 'visible';
504
- tokenToCheck._viewContainer.createEmbeddedView(tokenToCheck._content);
505
- if (this.moreTokensLeft.length) {
506
- this.moreTokensLeft.pop();
507
- }
508
- else if (this.moreTokensRight.length) {
509
- this.moreTokensRight.pop();
510
- }
511
- }
512
- else {
513
- // otherwise, stop looping and set the token's display back to 'none'
514
- tokenToCheck.elementRef.nativeElement.style.display = 'none';
515
- breakLoop = true;
516
- }
517
- i--;
518
- this._cdRef.markForCheck();
519
- }
479
+ this.tokenList.forEach((token) => {
480
+ this._makeElementVisible(token.elementRef);
481
+ });
482
+ this._cdRef.markForCheck();
483
+ this._collapseTokens();
520
484
  }
521
485
  else {
522
486
  this._getHiddenCozyTokenCount();
523
487
  }
488
+ this.handleTokenClickSubscriptions();
489
+ this.previousTokenCount = this.tokenList.length;
524
490
  }
525
491
  /** @hidden */
526
492
  _getHiddenCozyTokenCount() {