Skip to content

Commit f771ec9

Browse files
authored
fix(tags): autocomplete create tag (#DS-5172) (#1652)
1 parent 2c83402 commit f771ec9

2 files changed

Lines changed: 67 additions & 0 deletions

File tree

packages/components/tags/tag-input.spec.ts

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { Component, DebugElement, Provider, signal, Type, viewChild } from '@ang
55
import { ComponentFixture, TestBed } from '@angular/core/testing';
66
import { By } from '@angular/platform-browser';
77
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
8+
import { KbqAutocompleteTrigger } from '@koobiq/components/autocomplete';
89
import { COMMA, createKeyboardEvent, ENTER, SEMICOLON, SPACE, TAB } from '@koobiq/components/core';
910
import { KbqFormFieldModule } from '@koobiq/components/form-field';
1011
import { Subject } from 'rxjs';
@@ -366,6 +367,64 @@ describe(KbqTagInput.name, () => {
366367
expect(componentInstance.add).toHaveBeenCalledTimes(1);
367368
expect(componentInstance.add).toHaveBeenCalledWith(expect.objectContaining({ value: 'a,b,c' }));
368369
});
370+
371+
describe('autocomplete interaction', () => {
372+
it('should NOT emit tagEnd on ENTER when autocomplete panel is open with an active option', () => {
373+
const fixture = createComponent(TestTagInputDefaultSeparators);
374+
const directive = fixture.componentInstance.tagInput();
375+
const inputElement = getInputElement(fixture);
376+
377+
inputElement.value = 'some text';
378+
directive.autocompleteTrigger = { panelOpen: true, activeOption: {} } as KbqAutocompleteTrigger;
379+
380+
directive.onKeydown(createKeyboardEvent('keydown', ENTER, inputElement, 'Enter'));
381+
382+
expect(fixture.componentInstance.add).not.toHaveBeenCalled();
383+
});
384+
385+
it('should emit tagEnd on ENTER when autocomplete panel is open but no active option', () => {
386+
const fixture = createComponent(TestTagInputDefaultSeparators);
387+
const directive = fixture.componentInstance.tagInput();
388+
const inputElement = getInputElement(fixture);
389+
390+
inputElement.value = 'some text';
391+
directive.autocompleteTrigger = { panelOpen: true, activeOption: null } as KbqAutocompleteTrigger;
392+
393+
directive.onKeydown(createKeyboardEvent('keydown', ENTER, inputElement, 'Enter'));
394+
395+
expect(fixture.componentInstance.add).toHaveBeenCalledWith(expect.objectContaining({ value: 'some text' }));
396+
});
397+
398+
it('should emit tagEnd on ENTER when autocomplete panel is closed', () => {
399+
const fixture = createComponent(TestTagInputDefaultSeparators);
400+
const directive = fixture.componentInstance.tagInput();
401+
const inputElement = getInputElement(fixture);
402+
403+
inputElement.value = 'some text';
404+
directive.autocompleteTrigger = { panelOpen: false, activeOption: {} } as KbqAutocompleteTrigger;
405+
406+
directive.onKeydown(createKeyboardEvent('keydown', ENTER, inputElement, 'Enter'));
407+
408+
expect(fixture.componentInstance.add).toHaveBeenCalledWith(expect.objectContaining({ value: 'some text' }));
409+
});
410+
411+
it('should emit tagEnd on COMMA when autocomplete panel is open with an active option', () => {
412+
const fixture = createComponent(TestTagInputSeparators);
413+
const { componentInstance } = fixture;
414+
const directive = componentInstance.tagInput();
415+
const inputElement = getInputElement(fixture);
416+
417+
componentInstance.separatorKeyCodes.set([COMMA]);
418+
fixture.detectChanges();
419+
420+
inputElement.value = 'some text';
421+
directive.autocompleteTrigger = { panelOpen: true, activeOption: {} } as KbqAutocompleteTrigger;
422+
423+
directive.onKeydown(createKeyboardEvent('keydown', COMMA, inputElement, ','));
424+
425+
expect(componentInstance.add).toHaveBeenCalledWith(expect.objectContaining({ value: 'some text' }));
426+
});
427+
});
369428
});
370429

371430
describe('KbqTagInput', () => {

packages/components/tags/tag-input.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,14 @@ export class KbqTagInput implements KbqTagTextControl, OnChanges {
198198
}
199199

200200
if (isSeparatorKey) {
201+
if (
202+
event.keyCode === ENTER &&
203+
this.autocompleteTrigger?.panelOpen &&
204+
this.autocompleteTrigger?.activeOption
205+
) {
206+
return;
207+
}
208+
201209
this.emitTagEnd();
202210

203211
event.preventDefault();

0 commit comments

Comments
 (0)