@ux-aspects/ux-aspects
Version:
Open source user interface framework for building modern, responsive, mobile big data applications
288 lines (287 loc) • 15.5 kB
TypeScript
import { BooleanInput } from '@angular/cdk/coercion';
import { AfterContentInit, ElementRef, EventEmitter, OnChanges, OnDestroy, QueryList, SimpleChanges, TemplateRef } from '@angular/core';
import { ControlValueAccessor, ValidationErrors, Validator } from '@angular/forms';
import { TypeaheadComponent } from '../typeahead/index';
import { TypeaheadOptionEvent } from '../typeahead/typeahead-event';
import { TagInputEvent } from './tag-input-event';
import * as i0 from "@angular/core";
export declare class TagInputComponent<T = any> implements AfterContentInit, OnChanges, ControlValueAccessor, Validator, OnDestroy {
private readonly _changeDetector;
private readonly _element;
private readonly _typeaheadKeyService;
private readonly _document;
/** Specify a unique Id for the component */
id: string;
/**
* The list of tags appearing in the tag input. This can be an array of strings or custom objects.
* See the `displayProperty` property for details of using a custom object.
*/
get tags(): T | ReadonlyArray<T>;
set tags(value: T | ReadonlyArray<T>);
/** The editable text appearing in the tag input. */
input: string;
/**
* Determines the display value of the `options`, if they are custom objects.
* This may be a function or a string. If a function is provided, it receives
* the option object as an argument, and should return the appropriate display value.
* If the name of a property is provided as a string, that property is used as the display value.
*/
display: TagInputDisplayFunction<T> | string;
/** Controls whether pasting text into the text input area automatically converts that text into one or more tags. */
addOnPaste: boolean;
/** The aria-label to apply to the child `input` element. */
ariaLabel: string;
/** ID of the element which serves as a label for the input element. */
ariaLabelledby: string;
/** Controls the disabled state of the tag input. */
disabled: boolean;
/** Specified if this is a required input. */
required: boolean;
/**
* If set to `true`, the tag input will prevent addition and removal of tags to enforce the minTags and maxTags settings.
* Otherwise, a validation error will be raised.
*/
enforceTagLimits: boolean;
/**
* If `true`, input entered into the text input area can be converted into a tag by pressing enter.
* Otherwise, tags can only be added from the typeahead list or other external means.
* (Note that the `maxTags` and `tagPattern` will prevent invalid inputs regardless of this setting.)
*/
freeInput: boolean;
/** If `true` the input field will be readonly and selection can only occur by using the dropdown. */
readonlyInput: boolean;
/**
* The maximum number of tags permitted in the tag input. If the number of tags is equal to `maxTags` and
* `enforceTagLimits` is `true`, addition of tags will be prevented until a tag is removed
*/
maxTags: number;
/**
* The minimum number of tags permitted in the tag input. If the number of tags is equal to `minTags` and `enforceTagLimits` is
* `true`, removal of tags will be prevented until a new tag is added.
*/
minTags: number;
/** The placeholder text which appears in the text input area when it is empty. */
placeholder: string;
/** Controls whether the typeahead appears when the text input area is clicked. This has no effect if the ux-typeahead component is not configured. */
showTypeaheadOnClick: boolean;
/**
* A string containing the characters which delimit tags.
* Typing one of the characters in `tagDelimiters` will cause the preceding text to be added as a tag,
* and the text input area will be cleared. Pasting a string containing one or more of characters in
* `tagDelimiters` will cause the string to be split into multiple tags.
* Note that the delimiter character will not be part of the tag text.
*/
tagDelimiters: string;
/** The validation expression for tags added via the input text area. Strings which do not match this expression will not be added as tags. */
tagPattern: RegExp;
/**
* A template which will be rendered as the content of each tag. The following context properties are available in the template:
* - `tag: any` - the string or custom object representing the tag.
* - `index: number` - the zero-based index of the tag as it appears in the tag input.
* - `api: TagApi` - provides the functions getTagDisplay, removeTagAt and canRemoveTagAt.
*/
tagTemplate: TemplateRef<TagTemplateContext<T>>;
/**
* A function which returns either a string, string[], or Set<string>, compatible with the NgClass directive. The function receives the following parameters:
* - `tag: any` - the string or custom object representing the tag.
* - `index: number` - the zero-based index of the tag as it appears in the tag input.
* - `selected: boolean` - true if the tag is currently selected.
*/
tagClass: TagClassFunction<T>;
/**
* An object which contains details of validation errors. The following properties will be present if there is a related validation error:
* - `tagRangeError` - present if the number of tags is outside the range specified by minTags and maxTags.
* - `inputPattern` - present if an input has been submitted which does not match the tagPattern.
*/
validationErrors: any;
/** Defines the autocomplete property on the input field which can be used to prevent the browser from displaying autocomplete suggestions. */
autocomplete: string;
/**
* A custom function which is called to create a new tag object.
* This can be used to populate other properties in the tag object.
* If `createTag` is not provided, then an object is created with the `displayProperty` set to the input.
* If `displayProperty` is also not set, then the tag is created as a simple string.
*/
createTagHandler: (value: string) => any;
/** Define a custom icon to be used instead of the chevron */
icon: TemplateRef<void>;
/** Determine if we should show the clear all button */
clearButton: boolean;
/** Determine an aria label for the clear button */
clearButtonAriaLabel: string;
/** Determine if the dropdown panel should close on external click.*/
set autoCloseDropdown(value: boolean);
get autoCloseDropdown(): boolean;
/** Emits when tags is changed. */
tagsChange: EventEmitter<readonly T[]>;
/** Emits when input is changed. */
inputChange: EventEmitter<string>;
/** Raised when a tag is about to be added. The `tag` property of the event contains the tag to be added. Call `preventDefault()` on the event to prevent addition. */
tagAdding: EventEmitter<TagInputEvent>;
/** Raised when a tag has been added. The tag property of the event contains the tag. */
tagAdded: EventEmitter<TagInputEvent>;
/** Raised when a tag has failed validation according to the `tagPattern`. The tag property of the event contains the string which failed validation. */
tagInvalidated: EventEmitter<TagInputEvent>;
/** Raised when a tag is about to be removed. The `tag` property of the event contains the tag to be removed. Call `preventDefault()` on the event to prevent removal. */
tagRemoving: EventEmitter<TagInputEvent>;
/** Raised when a tag has been removed. The tag property of the event contains the tag. */
tagRemoved: EventEmitter<TagInputEvent>;
/** Raised when a tag has been clicked. The `tag` property of the event contains the clicked tag. Call `preventDefault()` on the event to prevent the default behaviour of selecting the tag. */
tagClick: EventEmitter<TagInputEvent>;
inputFocus: EventEmitter<FocusEvent>;
inputBlur: EventEmitter<FocusEvent>;
typeaheadQuery: QueryList<TypeaheadComponent>;
tagInput: ElementRef<HTMLInputElement>;
selectedIndex: number;
tagApi: TagApi<T>;
valid: boolean;
inputValid: boolean;
typeahead: TypeaheadComponent;
highlightedElement: HTMLElement;
get _showClearButton(): boolean;
_tags: ReadonlyArray<T>;
private _onChangeHandler;
private _onTouchedHandler;
private _subscription;
private readonly _onDestroy;
private _autoCloseDropdown;
static ngAcceptInputType_autoCloseDropdown: BooleanInput;
ngAfterContentInit(): void;
ngOnChanges(changes: SimpleChanges): void;
ngOnDestroy(): void;
writeValue(value: T[]): void;
registerOnChange(fn: () => void): void;
registerOnTouched(fn: () => void): void;
setDisabledState(isDisabled: boolean): void;
/**
* Set focus on the input field.
*/
focus(): void;
/**
* Validate the value of the control (tags property).
*/
validate(): ValidationErrors | null;
keyHandler(event: KeyboardEvent): void;
focusOutHandler(): void;
onClick(): void;
tagClickHandler(event: MouseEvent, tag: T, index: number): void;
inputClickHandler(): void;
inputFocusHandler(): void;
inputPasteHandler(event: ClipboardEvent): void;
typeaheadOptionSelectedHandler(event: TypeaheadOptionEvent): void;
/**
* Commit the current input value and clear the input field if successful.
*/
commitInput(): void;
/**
* Commit the given tag object and clear the input if successful.
*/
commitTypeahead(tag: T): void;
/**
* Commit the given string value as one or more tags, if validation passes. Returns true if the tag(s) were created.
*/
commit(input: string): boolean;
/**
* If no tag is selected, select the rightmost tag. If a tag is selected, remove it.
*/
backspace(): void;
/**
* Move the highlighted option forwards or backwards in the list. Wraps at the limits.
* @param delta Value to be added to the selected index, i.e. -1 to move backwards, +1 to move forwards.
*/
moveSelection(delta: number): void;
/**
* Returns a value to display for the given tag. Uses display function/property name if set, otherwise assumes that the tag is a simple string.
*/
getTagDisplay(tag: any): string;
/**
* Returns true if the given index is selected (tag index or input field).
*/
isSelected(index: number): boolean;
/**
* Select the tag at the given index. Does nothing if disabled is true.
*/
selectTagAt(tagIndex: number): void;
/**
* Select the input field, giving it focus. Does nothing if disabled is true.
*/
selectInput(): void;
/**
* Remove the tag at the given index. Does nothing if disabled is true or the minTags property prevents removal.
*/
removeTagAt(tagIndex: number): void;
/**
* Returns true if the tag at the given index can be removed.
*/
canRemoveTagAt(): boolean;
/**
* Returns true if the input field should be available.
*/
isInputVisible(): boolean;
/**
* Returns true if any part of the control has focus.
*/
hasFocus(): boolean;
toggle(): void;
clear(): void;
setInputValue(text: string): void;
setTagsValue(tags: ReadonlyArray<T>): void;
private connectTypeahead;
/**
* Validate the given tagValue with the tagPattern, if set. Update validationErrors on validation failure.
*/
private validateTag;
/**
* Create a tag object for the given tagValue. If createTagHandler is specified, use it; otherwise if displayProperty is specified, create an object with the tagValue as the single named property; otherwise return the tagValue itself.
*/
private createTag;
/**
* Add a tag object, calling the tagAdding and tagAdded events. Returns true if the tag was added to the tags array.
*/
private addTag;
/**
* Returns true if the given tagIndex is a valid tag index.
*/
private isValidTagIndex;
/**
* Returns true if the given index is a valid selection index (tags or input field).
*/
private isValidSelectIndex;
/**
* Returns the character corresponding to the given key event, mainly for IE compatibility.
*/
private getKeyChar;
/**
* Returns an array of strings corresponding to the input string split by the tagDelimiters characters.
*/
private splitTagInput;
static ɵfac: i0.ɵɵFactoryDeclaration<TagInputComponent<any>, never>;
static ɵcmp: i0.ɵɵComponentDeclaration<TagInputComponent<any>, "ux-tag-input", ["ux-tag-input"], { "id": { "alias": "id"; "required": false; }; "tags": { "alias": "tags"; "required": false; }; "input": { "alias": "input"; "required": false; }; "display": { "alias": "display"; "required": false; }; "addOnPaste": { "alias": "addOnPaste"; "required": false; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; }; "ariaLabelledby": { "alias": "ariaLabelledby"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "required": { "alias": "required"; "required": false; }; "enforceTagLimits": { "alias": "enforceTagLimits"; "required": false; }; "freeInput": { "alias": "freeInput"; "required": false; }; "readonlyInput": { "alias": "readonlyInput"; "required": false; }; "maxTags": { "alias": "maxTags"; "required": false; }; "minTags": { "alias": "minTags"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "showTypeaheadOnClick": { "alias": "showTypeaheadOnClick"; "required": false; }; "tagDelimiters": { "alias": "tagDelimiters"; "required": false; }; "tagPattern": { "alias": "tagPattern"; "required": false; }; "tagTemplate": { "alias": "tagTemplate"; "required": false; }; "tagClass": { "alias": "tagClass"; "required": false; }; "validationErrors": { "alias": "validationErrors"; "required": false; }; "autocomplete": { "alias": "autocomplete"; "required": false; }; "createTagHandler": { "alias": "createTag"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; "clearButton": { "alias": "clearButton"; "required": false; }; "clearButtonAriaLabel": { "alias": "clearButtonAriaLabel"; "required": false; }; "autoCloseDropdown": { "alias": "autoCloseDropdown"; "required": false; }; }, { "tagsChange": "tagsChange"; "inputChange": "inputChange"; "tagAdding": "tagAdding"; "tagAdded": "tagAdded"; "tagInvalidated": "tagInvalidated"; "tagRemoving": "tagRemoving"; "tagRemoved": "tagRemoved"; "tagClick": "tagClick"; "inputFocus": "inputFocus"; "inputBlur": "inputBlur"; }, ["typeaheadQuery"], ["*"], false, never>;
}
/**
* The API available to tag templates.
*/
export interface TagApi<T = any> {
/**
* Returns the display value of the given tag, according to the displayProperty property.
*/
getTagDisplay: (tag: T) => string;
/**
* Removes the tag at the given index, if possible.
*/
removeTagAt: (index: number) => void;
/**
* Returns true if the tag at the given index can be removed.
*/
canRemoveTagAt: (index: number) => boolean;
}
/**
* The function used to return custom class information, for use in `ngClass`.
*/
export type TagClassFunction<T = any> = (tag: T, index: number, selected: boolean) => string | string[] | Set<string>;
export type TagInputDisplayFunction<T> = (option: T) => string;
export interface TagTemplateContext<T = string | any> {
tag: T;
index: number;
api: TagApi;
}