ng-zorro-antd
Version:
An enterprise-class UI components based on Ant Design and Angular
773 lines (760 loc) • 30.8 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('ng-zorro-antd/icon'), require('@angular/forms'), require('@angular/cdk/keycodes'), require('@angular/cdk/overlay'), require('@angular/cdk/portal'), require('@angular/common'), require('@angular/core'), require('rxjs'), require('ng-zorro-antd/core')) :
typeof define === 'function' && define.amd ? define('ng-zorro-antd/mention', ['exports', 'ng-zorro-antd/icon', '@angular/forms', '@angular/cdk/keycodes', '@angular/cdk/overlay', '@angular/cdk/portal', '@angular/common', '@angular/core', 'rxjs', 'ng-zorro-antd/core'], factory) :
(factory((global['ng-zorro-antd'] = global['ng-zorro-antd'] || {}, global['ng-zorro-antd'].mention = {}),global['ng-zorro-antd'].icon,global.ng.forms,global.ng.cdk.keycodes,global.ng.cdk.overlay,global.ng.cdk.portal,global.ng.common,global.ng.core,global.rxjs,global['ng-zorro-antd'].core));
}(this, (function (exports,icon,forms,keycodes,overlay,portal,common,core,rxjs,core$1) { 'use strict';
/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0
THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.
See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */
function __decorate(decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
r = Reflect.decorate(decorators, target, key, desc);
else
for (var i = decorators.length - 1; i >= 0; i--)
if (d = decorators[i])
r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
}
function __metadata(metadataKey, metadataValue) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function")
return Reflect.metadata(metadataKey, metadataValue);
}
function __read(o, n) {
var m = typeof Symbol === "function" && o[Symbol.iterator];
if (!m)
return o;
var i = m.call(o), r, ar = [], e;
try {
while ((n === void 0 || n-- > 0) && !(r = i.next()).done)
ar.push(r.value);
}
catch (error) {
e = { error: error };
}
finally {
try {
if (r && !r.done && (m = i["return"]))
m.call(i);
}
finally {
if (e)
throw e.error;
}
}
return ar;
}
function __spread() {
for (var ar = [], i = 0; i < arguments.length; i++)
ar = ar.concat(__read(arguments[i]));
return ar;
}
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
var NzMentionSuggestionDirective = /** @class */ (function () {
function NzMentionSuggestionDirective() {
}
NzMentionSuggestionDirective.decorators = [
{ type: core.Directive, args: [{
selector: '[nzMentionSuggestion]',
exportAs: 'nzMentionSuggestion'
},] }
];
return NzMentionSuggestionDirective;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/** @type {?} */
var NZ_MENTION_TRIGGER_ACCESSOR = {
provide: forms.NG_VALUE_ACCESSOR,
useExisting: core.forwardRef(( /**
* @return {?}
*/function () { return NzMentionTriggerDirective; })),
multi: true
};
var NzMentionTriggerDirective = /** @class */ (function () {
function NzMentionTriggerDirective(el) {
this.el = el;
this.onFocusin = new core.EventEmitter();
this.onBlur = new core.EventEmitter();
this.onInput = new core.EventEmitter();
this.onKeydown = new core.EventEmitter();
this.onClick = new core.EventEmitter();
}
/**
* @return {?}
*/
NzMentionTriggerDirective.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.completeEvents();
};
/**
* @return {?}
*/
NzMentionTriggerDirective.prototype.completeEvents = /**
* @return {?}
*/
function () {
this.onFocusin.complete();
this.onBlur.complete();
this.onInput.complete();
this.onKeydown.complete();
this.onClick.complete();
};
/**
* @param {?=} caretPos
* @return {?}
*/
NzMentionTriggerDirective.prototype.focus = /**
* @param {?=} caretPos
* @return {?}
*/
function (caretPos) {
this.el.nativeElement.focus();
this.el.nativeElement.setSelectionRange(caretPos, caretPos);
};
/**
* @param {?} mention
* @return {?}
*/
NzMentionTriggerDirective.prototype.insertMention = /**
* @param {?} mention
* @return {?}
*/
function (mention) {
/** @type {?} */
var value = this.el.nativeElement.value;
/** @type {?} */
var insertValue = mention.mention.trim() + ' ';
/** @type {?} */
var newValue = [
value.slice(0, mention.startPos + 1),
insertValue,
value.slice(mention.endPos, value.length)
].join('');
this.el.nativeElement.value = newValue;
this.focus(mention.startPos + insertValue.length + 1);
this.onChange(newValue);
this.value = newValue;
};
/**
* @param {?} value
* @return {?}
*/
NzMentionTriggerDirective.prototype.writeValue = /**
* @param {?} value
* @return {?}
*/
function (value) {
this.value = value;
if (typeof value === 'string') {
this.el.nativeElement.value = value;
}
else {
this.el.nativeElement.value = '';
}
};
/**
* @param {?} fn
* @return {?}
*/
NzMentionTriggerDirective.prototype.registerOnChange = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onChange = fn;
};
/**
* @param {?} fn
* @return {?}
*/
NzMentionTriggerDirective.prototype.registerOnTouched = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onTouched = fn;
};
NzMentionTriggerDirective.decorators = [
{ type: core.Directive, args: [{
selector: 'input[nzMentionTrigger], textarea[nzMentionTrigger]',
exportAs: 'nzMentionTrigger',
providers: [NZ_MENTION_TRIGGER_ACCESSOR],
host: {
autocomplete: 'off',
'(focusin)': 'onFocusin.emit()',
'(blur)': 'onBlur.emit()',
'(input)': 'onInput.emit($event)',
'(keydown)': 'onKeydown.emit($event)',
'(click)': 'onClick.emit($event)'
}
},] }
];
/** @nocollapse */
NzMentionTriggerDirective.ctorParameters = function () {
return [
{ type: core.ElementRef }
];
};
return NzMentionTriggerDirective;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
var NzMentionComponent = /** @class */ (function () {
function NzMentionComponent(ngDocument, // tslint:disable-line:no-any
changeDetectorRef, overlay$$1, viewContainerRef) {
this.ngDocument = ngDocument;
this.changeDetectorRef = changeDetectorRef;
this.overlay = overlay$$1;
this.viewContainerRef = viewContainerRef;
this.nzValueWith = ( /**
* @param {?} value
* @return {?}
*/function (value) { return value; }); // tslint:disable-line:no-any
// tslint:disable-line:no-any
this.nzPrefix = '@';
this.nzLoading = false;
this.nzNotFoundContent = '无匹配结果,轻敲空格完成输入';
this.nzPlacement = 'bottom';
this.nzSuggestions = [];
this.nzOnSelect = new core.EventEmitter();
this.nzOnSearchChange = new core.EventEmitter();
this.isOpen = false;
this.filteredSuggestions = [];
this.suggestionTemplate = null; // tslint:disable-line:no-any
// tslint:disable-line:no-any
this.activeIndex = -1;
this.previousValue = null;
}
Object.defineProperty(NzMentionComponent.prototype, "suggestionChild", {
set: /**
* @param {?} value
* @return {?}
*/ function (value) {
if (value) {
this.suggestionTemplate = value;
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(NzMentionComponent.prototype, "triggerNativeElement", {
get: /**
* @private
* @return {?}
*/ function () {
return this.trigger.el.nativeElement;
},
enumerable: true,
configurable: true
});
/**
* @param {?} changes
* @return {?}
*/
NzMentionComponent.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
if (changes.hasOwnProperty('nzSuggestions')) {
if (this.isOpen) {
this.previousValue = null;
this.activeIndex = -1;
this.resetDropdown(false);
}
}
};
/**
* @return {?}
*/
NzMentionComponent.prototype.ngAfterContentInit = /**
* @return {?}
*/
function () {
this.bindTriggerEvents();
};
/**
* @return {?}
*/
NzMentionComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.closeDropdown();
};
/**
* @return {?}
*/
NzMentionComponent.prototype.closeDropdown = /**
* @return {?}
*/
function () {
if (this.overlayRef && this.overlayRef.hasAttached()) {
this.overlayRef.detach();
this.overlayBackdropClickSubscription.unsubscribe();
this.isOpen = false;
this.changeDetectorRef.markForCheck();
}
};
/**
* @return {?}
*/
NzMentionComponent.prototype.openDropdown = /**
* @return {?}
*/
function () {
this.attachOverlay();
this.isOpen = true;
this.changeDetectorRef.markForCheck();
};
/**
* @return {?}
*/
NzMentionComponent.prototype.getMentions = /**
* @return {?}
*/
function () {
return core$1.getMentions(this.trigger.value, this.nzPrefix);
};
/**
* @param {?} suggestion
* @return {?}
*/
NzMentionComponent.prototype.selectSuggestion = /**
* @param {?} suggestion
* @return {?}
*/
function (suggestion) {
/** @type {?} */
var value = this.nzValueWith(suggestion);
this.trigger.insertMention({
mention: value,
startPos: this.cursorMentionStart,
endPos: this.cursorMentionEnd
});
this.nzOnSelect.emit(suggestion);
this.closeDropdown();
this.activeIndex = -1;
};
/**
* @private
* @param {?} event
* @return {?}
*/
NzMentionComponent.prototype.handleInput = /**
* @private
* @param {?} event
* @return {?}
*/
function (event) {
/** @type {?} */
var target = ( /** @type {?} */(event.target));
this.trigger.onChange(target.value);
this.trigger.value = target.value;
this.resetDropdown();
};
/**
* @private
* @param {?} event
* @return {?}
*/
NzMentionComponent.prototype.handleKeydown = /**
* @private
* @param {?} event
* @return {?}
*/
function (event) {
/** @type {?} */
var keyCode = event.keyCode;
if (this.isOpen && keyCode === keycodes.ENTER && this.activeIndex !== -1 && this.filteredSuggestions.length) {
this.selectSuggestion(this.filteredSuggestions[this.activeIndex]);
event.preventDefault();
}
else if (keyCode === keycodes.LEFT_ARROW || keyCode === keycodes.RIGHT_ARROW) {
this.resetDropdown();
event.stopPropagation();
}
else {
if (this.isOpen && (keyCode === keycodes.TAB || keyCode === keycodes.ESCAPE)) {
this.closeDropdown();
return;
}
if (this.isOpen && keyCode === keycodes.UP_ARROW) {
this.setPreviousItemActive();
event.preventDefault();
event.stopPropagation();
}
if (this.isOpen && keyCode === keycodes.DOWN_ARROW) {
this.setNextItemActive();
event.preventDefault();
event.stopPropagation();
}
}
};
/**
* @private
* @return {?}
*/
NzMentionComponent.prototype.handleClick = /**
* @private
* @return {?}
*/
function () {
this.resetDropdown();
};
/**
* @private
* @return {?}
*/
NzMentionComponent.prototype.bindTriggerEvents = /**
* @private
* @return {?}
*/
function () {
var _this = this;
this.trigger.onInput.subscribe(( /**
* @param {?} e
* @return {?}
*/function (e) { return _this.handleInput(e); }));
this.trigger.onKeydown.subscribe(( /**
* @param {?} e
* @return {?}
*/function (e) { return _this.handleKeydown(e); }));
this.trigger.onClick.subscribe(( /**
* @return {?}
*/function () { return _this.handleClick(); }));
};
/**
* @private
* @param {?} value
* @param {?} emit
* @return {?}
*/
NzMentionComponent.prototype.suggestionsFilter = /**
* @private
* @param {?} value
* @param {?} emit
* @return {?}
*/
function (value, emit) {
var _this = this;
/** @type {?} */
var suggestions = value.substring(1);
if (this.previousValue === value) {
return;
}
this.previousValue = value;
if (emit) {
this.nzOnSearchChange.emit({
value: ( /** @type {?} */(this.cursorMention)).substring(1),
prefix: ( /** @type {?} */(this.cursorMention))[0]
});
}
/** @type {?} */
var searchValue = suggestions.toLowerCase();
this.filteredSuggestions = this.nzSuggestions.filter(( /**
* @param {?} suggestion
* @return {?}
*/function (suggestion) {
return _this.nzValueWith(suggestion)
.toLowerCase()
.includes(searchValue);
}));
};
/**
* @private
* @param {?=} emit
* @return {?}
*/
NzMentionComponent.prototype.resetDropdown = /**
* @private
* @param {?=} emit
* @return {?}
*/
function (emit) {
if (emit === void 0) {
emit = true;
}
this.resetCursorMention();
if (typeof this.cursorMention !== 'string' || !this.canOpen()) {
this.closeDropdown();
return;
}
this.suggestionsFilter(this.cursorMention, emit);
/** @type {?} */
var activeIndex = this.filteredSuggestions.indexOf(this.cursorMention.substring(1));
this.activeIndex = activeIndex >= 0 ? activeIndex : 0;
this.openDropdown();
};
/**
* @private
* @return {?}
*/
NzMentionComponent.prototype.setNextItemActive = /**
* @private
* @return {?}
*/
function () {
this.activeIndex = this.activeIndex + 1 <= this.filteredSuggestions.length - 1 ? this.activeIndex + 1 : 0;
this.changeDetectorRef.markForCheck();
};
/**
* @private
* @return {?}
*/
NzMentionComponent.prototype.setPreviousItemActive = /**
* @private
* @return {?}
*/
function () {
this.activeIndex = this.activeIndex - 1 < 0 ? this.filteredSuggestions.length - 1 : this.activeIndex - 1;
this.changeDetectorRef.markForCheck();
};
/**
* @private
* @return {?}
*/
NzMentionComponent.prototype.canOpen = /**
* @private
* @return {?}
*/
function () {
/** @type {?} */
var element = this.triggerNativeElement;
return !element.readOnly && !element.disabled;
};
/**
* @private
* @return {?}
*/
NzMentionComponent.prototype.resetCursorMention = /**
* @private
* @return {?}
*/
function () {
/** @type {?} */
var value = this.triggerNativeElement.value.replace(/[\r\n]/g, ' ') || '';
/** @type {?} */
var selectionStart = ( /** @type {?} */(this.triggerNativeElement.selectionStart));
/** @type {?} */
var prefix = typeof this.nzPrefix === 'string' ? [this.nzPrefix] : this.nzPrefix;
/** @type {?} */
var i = prefix.length;
while (i >= 0) {
/** @type {?} */
var startPos = value.lastIndexOf(prefix[i], selectionStart);
/** @type {?} */
var endPos = value.indexOf(' ', selectionStart) > -1 ? value.indexOf(' ', selectionStart) : value.length;
/** @type {?} */
var mention = value.substring(startPos, endPos);
if ((startPos > 0 && value[startPos - 1] !== ' ') ||
startPos < 0 ||
mention.includes(prefix[i], 1) ||
mention.includes(' ')) {
this.cursorMention = null;
this.cursorMentionStart = -1;
this.cursorMentionEnd = -1;
}
else {
this.cursorMention = mention;
this.cursorMentionStart = startPos;
this.cursorMentionEnd = endPos;
return;
}
i--;
}
};
/**
* @private
* @return {?}
*/
NzMentionComponent.prototype.updatePositions = /**
* @private
* @return {?}
*/
function () {
/** @type {?} */
var coordinates = core$1.getCaretCoordinates(this.triggerNativeElement, this.cursorMentionStart);
/** @type {?} */
var top = coordinates.top -
this.triggerNativeElement.getBoundingClientRect().height -
this.triggerNativeElement.scrollTop +
(this.nzPlacement === 'bottom' ? coordinates.height : 0);
/** @type {?} */
var left = coordinates.left - this.triggerNativeElement.scrollLeft;
this.positionStrategy.withDefaultOffsetX(left).withDefaultOffsetY(top);
if (this.nzPlacement === 'bottom') {
this.positionStrategy.withPositions([core$1.DEFAULT_MENTION_POSITIONS[0]]);
}
if (this.nzPlacement === 'top') {
this.positionStrategy.withPositions([core$1.DEFAULT_MENTION_POSITIONS[1]]);
}
this.positionStrategy.apply();
};
/**
* @private
* @return {?}
*/
NzMentionComponent.prototype.subscribeOverlayBackdropClick = /**
* @private
* @return {?}
*/
function () {
var _this = this;
return rxjs.merge(rxjs.fromEvent(this.ngDocument, 'click'), rxjs.fromEvent(this.ngDocument, 'touchend')).subscribe(( /**
* @param {?} event
* @return {?}
*/function (event) {
/** @type {?} */
var clickTarget = ( /** @type {?} */(event.target));
if (clickTarget !== _this.trigger.el.nativeElement && _this.isOpen) {
_this.closeDropdown();
}
}));
};
/**
* @private
* @return {?}
*/
NzMentionComponent.prototype.attachOverlay = /**
* @private
* @return {?}
*/
function () {
if (!this.overlayRef) {
this.portal = new portal.TemplatePortal(this.suggestionsTemp, this.viewContainerRef);
this.overlayRef = this.overlay.create(this.getOverlayConfig());
}
if (this.overlayRef && !this.overlayRef.hasAttached()) {
this.overlayRef.attach(this.portal);
this.overlayBackdropClickSubscription = this.subscribeOverlayBackdropClick();
}
this.updatePositions();
};
/**
* @private
* @return {?}
*/
NzMentionComponent.prototype.getOverlayConfig = /**
* @private
* @return {?}
*/
function () {
return new overlay.OverlayConfig({
positionStrategy: this.getOverlayPosition(),
scrollStrategy: this.overlay.scrollStrategies.reposition()
});
};
/**
* @private
* @return {?}
*/
NzMentionComponent.prototype.getOverlayPosition = /**
* @private
* @return {?}
*/
function () {
/** @type {?} */
var positions = [
new overlay.ConnectionPositionPair({ originX: 'start', originY: 'bottom' }, { overlayX: 'start', overlayY: 'top' }),
new overlay.ConnectionPositionPair({ originX: 'start', originY: 'top' }, { overlayX: 'start', overlayY: 'bottom' })
];
this.positionStrategy = this.overlay
.position()
.flexibleConnectedTo(this.trigger.el)
.withPositions(positions)
.withFlexibleDimensions(false)
.withPush(false);
return this.positionStrategy;
};
NzMentionComponent.decorators = [
{ type: core.Component, args: [{
selector: 'nz-mention',
exportAs: 'nzMention',
template: "<ng-content></ng-content>\n<ng-template #suggestions>\n <ul class=\"ant-mention-dropdown\">\n <li class=\"ant-mention-dropdown-item\"\n *ngFor=\"let suggestion of filteredSuggestions; let i = index\"\n [class.focus]=\"i === activeIndex\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"selectSuggestion(suggestion)\">\n <ng-container *ngIf=\"suggestionTemplate else defaultSuggestion\">\n <ng-container *ngTemplateOutlet=\"suggestionTemplate; context: {$implicit: suggestion}\"></ng-container>\n </ng-container>\n <ng-template #defaultSuggestion>{{ nzValueWith(suggestion) }}</ng-template>\n </li>\n <li class=\"ant-mention-dropdown-notfound ant-mention-dropdown-item\"\n *ngIf=\"filteredSuggestions.length === 0\">\n <span *ngIf=\"nzLoading\"><i nz-icon type=\"loading\"></i></span>\n <span *ngIf=\"!nzLoading\">{{ nzNotFoundContent }}</span>\n </li>\n </ul>\n</ng-template>\n",
preserveWhitespaces: false,
changeDetection: core.ChangeDetectionStrategy.OnPush,
styles: ["\n .ant-mention-dropdown {\n top: 100%;\n left: 0;\n position: relative;\n width: 100%;\n margin-top: 4px;\n margin-bottom: 4px;\n }\n "]
}] }
];
/** @nocollapse */
NzMentionComponent.ctorParameters = function () {
return [
{ type: undefined, decorators: [{ type: core.Optional }, { type: core.Inject, args: [common.DOCUMENT,] }] },
{ type: core.ChangeDetectorRef },
{ type: overlay.Overlay },
{ type: core.ViewContainerRef }
];
};
NzMentionComponent.propDecorators = {
nzValueWith: [{ type: core.Input }],
nzPrefix: [{ type: core.Input }],
nzLoading: [{ type: core.Input }],
nzNotFoundContent: [{ type: core.Input }],
nzPlacement: [{ type: core.Input }],
nzSuggestions: [{ type: core.Input }],
nzOnSelect: [{ type: core.Output }],
nzOnSearchChange: [{ type: core.Output }],
trigger: [{ type: core.ContentChild, args: [NzMentionTriggerDirective,] }],
suggestionsTemp: [{ type: core.ViewChild, args: [core.TemplateRef,] }],
suggestionChild: [{ type: core.ContentChild, args: [NzMentionSuggestionDirective, { read: core.TemplateRef },] }]
};
__decorate([
core$1.InputBoolean(),
__metadata("design:type", Object)
], NzMentionComponent.prototype, "nzLoading", void 0);
return NzMentionComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/** @type {?} */
var COMPONENTS = [NzMentionComponent, NzMentionTriggerDirective, NzMentionSuggestionDirective];
var NzMentionModule = /** @class */ (function () {
function NzMentionModule() {
}
NzMentionModule.decorators = [
{ type: core.NgModule, args: [{
imports: [common.CommonModule, forms.FormsModule, overlay.OverlayModule, icon.NzIconModule],
declarations: __spread(COMPONENTS),
exports: __spread(COMPONENTS)
},] }
];
return NzMentionModule;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
exports.NzMentionModule = NzMentionModule;
exports.NzMentionComponent = NzMentionComponent;
exports.NZ_MENTION_TRIGGER_ACCESSOR = NZ_MENTION_TRIGGER_ACCESSOR;
exports.NzMentionTriggerDirective = NzMentionTriggerDirective;
exports.NzMentionSuggestionDirective = NzMentionSuggestionDirective;
Object.defineProperty(exports, '__esModule', { value: true });
})));
//# sourceMappingURL=ng-zorro-antd-mention.umd.js.map