ng-zorro-antd
Version:
An enterprise-class UI components based on Ant Design and Angular
1,689 lines (1,679 loc) • 47.3 kB
JavaScript
import { warnDeprecation } from 'ng-zorro-antd/core/logger';
import { Injectable, InjectionToken } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
/**
* @fileoverview added by tsickle
* Generated from: nz-tree-base-node.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* @record
*/
function FlattenNode() { }
if (false) {
/** @type {?} */
FlattenNode.prototype.parent;
/** @type {?} */
FlattenNode.prototype.children;
/** @type {?} */
FlattenNode.prototype.pos;
/** @type {?} */
FlattenNode.prototype.data;
/** @type {?} */
FlattenNode.prototype.isStart;
/** @type {?} */
FlattenNode.prototype.isEnd;
}
/**
* @record
*/
function NzTreeNodeOptions() { }
if (false) {
/** @type {?} */
NzTreeNodeOptions.prototype.title;
/** @type {?} */
NzTreeNodeOptions.prototype.key;
/** @type {?|undefined} */
NzTreeNodeOptions.prototype.icon;
/** @type {?|undefined} */
NzTreeNodeOptions.prototype.isLeaf;
/** @type {?|undefined} */
NzTreeNodeOptions.prototype.checked;
/** @type {?|undefined} */
NzTreeNodeOptions.prototype.selected;
/** @type {?|undefined} */
NzTreeNodeOptions.prototype.selectable;
/** @type {?|undefined} */
NzTreeNodeOptions.prototype.disabled;
/** @type {?|undefined} */
NzTreeNodeOptions.prototype.disableCheckbox;
/** @type {?|undefined} */
NzTreeNodeOptions.prototype.expanded;
/** @type {?|undefined} */
NzTreeNodeOptions.prototype.children;
/* Skipping unhandled member: [key: string]: NzSafeAny;*/
}
class NzTreeNode {
/**
* Init nzTreeNode
* @param {?} option
* @param {?=} parent
* @param {?=} service
*/
constructor(option, parent = null, service = null) {
this.level = 0;
if (option instanceof NzTreeNode) {
return option;
}
this.service = service || null;
this.origin = option;
this.key = option.key;
this.parentNode = parent;
this._title = option.title || '---';
this._icon = option.icon || '';
this._isLeaf = option.isLeaf || false;
this._children = [];
// option params
this._isChecked = option.checked || false;
this._isSelectable = option.disabled || option.selectable !== false;
this._isDisabled = option.disabled || false;
this._isDisableCheckbox = option.disableCheckbox || false;
this._isExpanded = option.isLeaf ? false : option.expanded || false;
this._isHalfChecked = false;
this._isSelected = (!option.disabled && option.selected) || false;
this._isLoading = false;
this.isMatched = false;
/**
* parent's checked status will affect children while initializing
*/
if (parent) {
this.level = parent.level + 1;
}
else {
this.level = 0;
}
if (typeof option.children !== 'undefined' && option.children !== null) {
option.children.forEach((/**
* @param {?} nodeOptions
* @return {?}
*/
nodeOptions => {
/** @type {?} */
const s = this.treeService;
if (s && !s.isCheckStrictly && option.checked && !option.disabled && !nodeOptions.disabled && !nodeOptions.disableCheckbox) {
nodeOptions.checked = option.checked;
}
this._children.push(new NzTreeNode(nodeOptions, this));
}));
}
}
/**
* @return {?}
*/
get treeService() {
return this.service || (this.parentNode && this.parentNode.treeService);
}
/**
* auto generate
* get
* set
* @return {?}
*/
get title() {
return this._title;
}
/**
* @param {?} value
* @return {?}
*/
set title(value) {
this._title = value;
this.update();
}
/**
* @return {?}
*/
get icon() {
return this._icon;
}
/**
* @param {?} value
* @return {?}
*/
set icon(value) {
this._icon = value;
this.update();
}
/**
* @return {?}
*/
get children() {
return this._children;
}
/**
* @param {?} value
* @return {?}
*/
set children(value) {
this._children = value;
this.update();
}
/**
* @return {?}
*/
get isLeaf() {
return this._isLeaf;
}
/**
* @param {?} value
* @return {?}
*/
set isLeaf(value) {
this._isLeaf = value;
this.update();
}
/**
* @return {?}
*/
get isChecked() {
return this._isChecked;
}
/**
* @param {?} value
* @return {?}
*/
set isChecked(value) {
this._isChecked = value;
this._isAllChecked = value;
this.origin.checked = value;
this.afterValueChange('isChecked');
}
/**
* @return {?}
*/
get isAllChecked() {
return this._isAllChecked;
}
/**
* @deprecated Maybe removed in next major version, use `isChecked` instead.
* @param {?} value
* @return {?}
*/
set isAllChecked(value) {
warnDeprecation(`'isAllChecked' is going to be removed in 9.0.0. Please use 'isChecked' instead.`);
this._isAllChecked = value;
}
/**
* @return {?}
*/
get isHalfChecked() {
return this._isHalfChecked;
}
/**
* @param {?} value
* @return {?}
*/
set isHalfChecked(value) {
this._isHalfChecked = value;
this.afterValueChange('isHalfChecked');
}
/**
* @return {?}
*/
get isSelectable() {
return this._isSelectable;
}
/**
* @param {?} value
* @return {?}
*/
set isSelectable(value) {
this._isSelectable = value;
this.update();
}
/**
* @return {?}
*/
get isDisabled() {
return this._isDisabled;
}
/**
* @param {?} value
* @return {?}
*/
set isDisabled(value) {
this._isDisabled = value;
this.update();
}
/**
* @return {?}
*/
get isDisableCheckbox() {
return this._isDisableCheckbox;
}
/**
* @param {?} value
* @return {?}
*/
set isDisableCheckbox(value) {
this._isDisableCheckbox = value;
this.update();
}
/**
* @return {?}
*/
get isExpanded() {
return this._isExpanded;
}
/**
* @param {?} value
* @return {?}
*/
set isExpanded(value) {
this._isExpanded = value;
this.origin.expanded = value;
this.afterValueChange('isExpanded');
this.afterValueChange('reRender');
}
/**
* @return {?}
*/
get isSelected() {
return this._isSelected;
}
/**
* @param {?} value
* @return {?}
*/
set isSelected(value) {
this._isSelected = value;
this.origin.selected = value;
this.afterValueChange('isSelected');
}
/**
* @return {?}
*/
get isLoading() {
return this._isLoading;
}
/**
* @param {?} value
* @return {?}
*/
set isLoading(value) {
this._isLoading = value;
this.update();
}
/**
* @param {?=} checked
* @param {?=} halfChecked
* @return {?}
*/
setSyncChecked(checked = false, halfChecked = false) {
this.setChecked(checked, halfChecked);
if (this.treeService && !this.treeService.isCheckStrictly) {
this.treeService.conduct(this);
}
}
/**
* @deprecated Maybe removed in next major version, use `isChecked` instead.
* @param {?=} checked
* @param {?=} halfChecked
* @return {?}
*/
setChecked(checked = false, halfChecked = false) {
warnDeprecation(`'setChecked' is going to be removed in 9.0.0. Please use 'isChecked' instead.`);
this.origin.checked = checked;
this.isChecked = checked;
this.isAllChecked = checked;
this.isHalfChecked = halfChecked;
}
/**
* \@not-deprecated Maybe removed in next major version, use `isExpanded` instead.
* We need it until tree refactoring is finished
* @param {?} value
* @return {?}
*/
setExpanded(value) {
this._isExpanded = value;
this.origin.expanded = value;
this.afterValueChange('isExpanded');
}
/**
* @deprecated Maybe removed in next major version, use `isSelected` instead.
* @param {?} value
* @return {?}
*/
setSelected(value) {
warnDeprecation(`'setSelected' is going to be removed in 9.0.0. Please use 'isExpanded' isSelected.`);
if (this.isDisabled) {
return;
}
this.isSelected = value;
}
/**
* @return {?}
*/
getParentNode() {
return this.parentNode;
}
/**
* @return {?}
*/
getChildren() {
return this.children;
}
/**
* Support appending child nodes by position. Leaf node cannot be appended.
* @param {?} children
* @param {?=} childPos
* @return {?}
*/
addChildren(children, childPos = -1) {
if (!this.isLeaf) {
children.forEach((/**
* @param {?} node
* @return {?}
*/
node => {
/** @type {?} */
const refreshLevel = (/**
* @param {?} n
* @return {?}
*/
(n) => {
n.getChildren().forEach((/**
* @param {?} c
* @return {?}
*/
c => {
c.level = (/** @type {?} */ (c.getParentNode())).level + 1;
// flush origin
c.origin.level = c.level;
refreshLevel(c);
}));
});
/** @type {?} */
let child = node;
if (child instanceof NzTreeNode) {
child.parentNode = this;
}
else {
child = new NzTreeNode(node, this);
}
child.level = this.level + 1;
child.origin.level = child.level;
refreshLevel(child);
try {
childPos === -1 ? this.children.push(child) : this.children.splice(childPos, 0, child);
// flush origin
}
catch (e) { }
}));
this.origin.children = this.getChildren().map((/**
* @param {?} v
* @return {?}
*/
v => v.origin));
// remove loading state
this.isLoading = false;
}
this.afterValueChange('addChildren');
this.afterValueChange('reRender');
}
/**
* @return {?}
*/
clearChildren() {
// refresh checked state
this.afterValueChange('clearChildren');
this.children = [];
this.origin.children = [];
this.afterValueChange('reRender');
}
/**
* @return {?}
*/
remove() {
/** @type {?} */
const parentNode = this.getParentNode();
if (parentNode) {
parentNode.children = parentNode.getChildren().filter((/**
* @param {?} v
* @return {?}
*/
v => v.key !== this.key));
parentNode.origin.children = (/** @type {?} */ (parentNode.origin.children)).filter((/**
* @param {?} v
* @return {?}
*/
v => v.key !== this.key));
this.afterValueChange('remove');
this.afterValueChange('reRender');
}
}
/**
* @param {?} key
* @return {?}
*/
afterValueChange(key) {
if (this.treeService) {
switch (key) {
case 'isChecked':
this.treeService.setCheckedNodeList(this);
break;
case 'isHalfChecked':
this.treeService.setHalfCheckedNodeList(this);
break;
case 'isExpanded':
this.treeService.setExpandedNodeList(this);
break;
case 'isSelected':
this.treeService.setNodeActive(this);
break;
case 'clearChildren':
this.treeService.afterRemove(this.getChildren());
break;
case 'remove':
this.treeService.afterRemove([this]);
break;
case 'reRender':
this.treeService.flattenTreeData(this.treeService.rootNodes, this.treeService.getExpandedNodeList().map((/**
* @param {?} v
* @return {?}
*/
v => v.key)));
break;
}
}
this.update();
}
/**
* @return {?}
*/
update() {
if (this.component) {
this.component.markForCheck();
}
}
}
if (false) {
/**
* @type {?}
* @private
*/
NzTreeNode.prototype._title;
/** @type {?} */
NzTreeNode.prototype.key;
/** @type {?} */
NzTreeNode.prototype.level;
/** @type {?} */
NzTreeNode.prototype.origin;
/** @type {?} */
NzTreeNode.prototype.parentNode;
/**
* @type {?}
* @private
*/
NzTreeNode.prototype._icon;
/**
* @type {?}
* @private
*/
NzTreeNode.prototype._children;
/**
* @type {?}
* @private
*/
NzTreeNode.prototype._isLeaf;
/**
* @type {?}
* @private
*/
NzTreeNode.prototype._isChecked;
/**
* @deprecated Maybe removed in next major version, use isChecked instead
* @type {?}
* @private
*/
NzTreeNode.prototype._isAllChecked;
/**
* @type {?}
* @private
*/
NzTreeNode.prototype._isSelectable;
/**
* @type {?}
* @private
*/
NzTreeNode.prototype._isDisabled;
/**
* @type {?}
* @private
*/
NzTreeNode.prototype._isDisableCheckbox;
/**
* @type {?}
* @private
*/
NzTreeNode.prototype._isExpanded;
/**
* @type {?}
* @private
*/
NzTreeNode.prototype._isHalfChecked;
/**
* @type {?}
* @private
*/
NzTreeNode.prototype._isSelected;
/**
* @type {?}
* @private
*/
NzTreeNode.prototype._isLoading;
/** @type {?} */
NzTreeNode.prototype.canHide;
/** @type {?} */
NzTreeNode.prototype.isMatched;
/** @type {?} */
NzTreeNode.prototype.service;
/** @type {?} */
NzTreeNode.prototype.component;
/**
* New added in Tree for easy data access
* @type {?}
*/
NzTreeNode.prototype.isStart;
/** @type {?} */
NzTreeNode.prototype.isEnd;
}
/**
* @fileoverview added by tsickle
* Generated from: nz-tree-base.definitions.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* @license
* Copyright Alibaba.com All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
*/
/**
* @record
*/
function NzFormatEmitEvent() { }
if (false) {
/** @type {?} */
NzFormatEmitEvent.prototype.eventName;
/** @type {?|undefined} */
NzFormatEmitEvent.prototype.node;
/** @type {?|undefined} */
NzFormatEmitEvent.prototype.event;
/** @type {?|undefined} */
NzFormatEmitEvent.prototype.dragNode;
/** @type {?|undefined} */
NzFormatEmitEvent.prototype.selectedKeys;
/** @type {?|undefined} */
NzFormatEmitEvent.prototype.checkedKeys;
/** @type {?|undefined} */
NzFormatEmitEvent.prototype.matchedKeys;
/** @type {?|undefined} */
NzFormatEmitEvent.prototype.nodes;
/** @type {?|undefined} */
NzFormatEmitEvent.prototype.keys;
}
/**
* @record
*/
function NzFormatBeforeDropEvent() { }
if (false) {
/** @type {?} */
NzFormatBeforeDropEvent.prototype.dragNode;
/** @type {?} */
NzFormatBeforeDropEvent.prototype.node;
/** @type {?} */
NzFormatBeforeDropEvent.prototype.pos;
}
/**
* @record
*/
function NzTreeNodeBaseComponent() { }
if (false) {
/**
* @return {?}
*/
NzTreeNodeBaseComponent.prototype.markForCheck = function () { };
}
/**
* @fileoverview added by tsickle
* Generated from: nz-tree-base-util.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* @license
* Copyright Alibaba.com All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
*/
/**
* @param {?} node
* @return {?}
*/
function isCheckDisabled(node) {
const { isDisabled, isDisableCheckbox } = node;
return !!(isDisabled || isDisableCheckbox);
}
/**
* @param {?} needle
* @param {?} haystack
* @return {?}
*/
function isInArray(needle, haystack) {
return haystack.length > 0 && haystack.indexOf(needle) > -1;
}
/**
* @param {?} level
* @param {?} index
* @return {?}
*/
function getPosition(level, index) {
return `${level}-${index}`;
}
/**
* @param {?} key
* @param {?} pos
* @return {?}
*/
function getKey(key, pos) {
if (key !== null && key !== undefined) {
return key;
}
return pos;
}
/**
* Flat nest tree data into flatten list. This is used for virtual list render.
* @param {?=} treeNodeList Origin data node list
* @param {?=} expandedKeys
* need expanded keys, provides `true` means all expanded (used in `rc-tree-select`).
* @return {?}
*/
function flattenTreeData(treeNodeList = [], expandedKeys = []) {
/** @type {?} */
const expandedKeySet = new Set(expandedKeys === true ? [] : expandedKeys);
/** @type {?} */
const flattenList = [];
/**
* @param {?} list
* @param {?=} parent
* @return {?}
*/
function dig(list, parent = null) {
return list.map((/**
* @param {?} treeNode
* @param {?} index
* @return {?}
*/
(treeNode, index) => {
/** @type {?} */
const pos = getPosition(parent ? parent.pos : '0', index);
/** @type {?} */
const mergedKey = getKey(treeNode.key, pos);
treeNode.isStart = [...(parent ? parent.isStart : []), index === 0];
treeNode.isEnd = [...(parent ? parent.isEnd : []), index === list.length - 1];
// Add FlattenDataNode into list
// TODO: only need data here.
/** @type {?} */
const flattenNode = {
parent,
pos,
children: [],
data: treeNode,
isStart: [...(parent ? parent.isStart : []), index === 0],
isEnd: [...(parent ? parent.isEnd : []), index === list.length - 1]
};
flattenList.push(flattenNode);
// Loop treeNode children
if (expandedKeys === true || expandedKeySet.has(mergedKey) || treeNode.isExpanded) {
flattenNode.children = dig(treeNode.children || [], flattenNode);
}
else {
flattenNode.children = [];
}
return flattenNode;
}));
}
dig(treeNodeList);
return flattenList;
}
/**
* @fileoverview added by tsickle
* Generated from: nz-tree-base.service.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
class NzTreeBaseService {
constructor() {
this.DRAG_SIDE_RANGE = 0.25;
this.DRAG_MIN_GAP = 2;
this.isCheckStrictly = false;
this.isMultiple = false;
this.rootNodes = [];
this.flattenNodes$ = new BehaviorSubject([]);
this.selectedNodeList = [];
this.expandedNodeList = [];
this.checkedNodeList = [];
this.halfCheckedNodeList = [];
this.matchedNodeList = [];
}
/**
* reset tree nodes will clear default node list
* @param {?} nzNodes
* @return {?}
*/
initTree(nzNodes) {
this.rootNodes = nzNodes;
this.expandedNodeList = [];
this.selectedNodeList = [];
this.halfCheckedNodeList = [];
this.checkedNodeList = [];
this.matchedNodeList = [];
}
/**
* @param {?} nzNodes
* @param {?=} expandedKeys
* @return {?}
*/
flattenTreeData(nzNodes, expandedKeys = []) {
this.flattenNodes$.next(flattenTreeData(nzNodes, expandedKeys).map((/**
* @param {?} item
* @return {?}
*/
item => item.data)));
}
/**
* @return {?}
*/
getSelectedNode() {
return this.selectedNode;
}
/**
* get some list
* @return {?}
*/
getSelectedNodeList() {
return this.conductNodeState('select');
}
/**
* return checked nodes
* @return {?}
*/
getCheckedNodeList() {
return this.conductNodeState('check');
}
/**
* @return {?}
*/
getHalfCheckedNodeList() {
return this.conductNodeState('halfCheck');
}
/**
* return expanded nodes
* @return {?}
*/
getExpandedNodeList() {
return this.conductNodeState('expand');
}
/**
* return search matched nodes
* @return {?}
*/
getMatchedNodeList() {
return this.conductNodeState('match');
}
/**
* @param {?} value
* @return {?}
*/
isArrayOfNzTreeNode(value) {
return value.every((/**
* @param {?} item
* @return {?}
*/
item => item instanceof NzTreeNode));
}
/**
* set drag node
* @param {?} node
* @return {?}
*/
setSelectedNode(node) {
this.selectedNode = node;
}
/**
* set node selected status
* @param {?} node
* @return {?}
*/
setNodeActive(node) {
if (!this.isMultiple && node.isSelected) {
this.selectedNodeList.forEach((/**
* @param {?} n
* @return {?}
*/
n => {
if (node.key !== n.key) {
// reset other nodes
n.isSelected = false;
}
}));
// single mode: remove pre node
this.selectedNodeList = [];
}
this.setSelectedNodeList(node, this.isMultiple);
}
/**
* add or remove node to selectedNodeList
* @param {?} node
* @param {?=} isMultiple
* @return {?}
*/
setSelectedNodeList(node, isMultiple = false) {
/** @type {?} */
const index = this.getIndexOfArray(this.selectedNodeList, node.key);
if (isMultiple) {
if (node.isSelected && index === -1) {
this.selectedNodeList.push(node);
}
}
else {
if (node.isSelected && index === -1) {
this.selectedNodeList = [node];
}
}
if (!node.isSelected) {
this.selectedNodeList = this.selectedNodeList.filter((/**
* @param {?} n
* @return {?}
*/
n => n.key !== node.key));
}
}
/**
* merge checked nodes
* @param {?} node
* @return {?}
*/
setHalfCheckedNodeList(node) {
/** @type {?} */
const index = this.getIndexOfArray(this.halfCheckedNodeList, node.key);
if (node.isHalfChecked && index === -1) {
this.halfCheckedNodeList.push(node);
}
else if (!node.isHalfChecked && index > -1) {
this.halfCheckedNodeList = this.halfCheckedNodeList.filter((/**
* @param {?} n
* @return {?}
*/
n => node.key !== n.key));
}
}
/**
* @param {?} node
* @return {?}
*/
setCheckedNodeList(node) {
/** @type {?} */
const index = this.getIndexOfArray(this.checkedNodeList, node.key);
if (node.isChecked && index === -1) {
this.checkedNodeList.push(node);
}
else if (!node.isChecked && index > -1) {
this.checkedNodeList = this.checkedNodeList.filter((/**
* @param {?} n
* @return {?}
*/
n => node.key !== n.key));
}
}
/**
* conduct checked/selected/expanded keys
* @param {?=} type
* @return {?}
*/
conductNodeState(type = 'check') {
/** @type {?} */
let resultNodesList = [];
switch (type) {
case 'select':
resultNodesList = this.selectedNodeList;
break;
case 'expand':
resultNodesList = this.expandedNodeList;
break;
case 'match':
resultNodesList = this.matchedNodeList;
break;
case 'check':
resultNodesList = this.checkedNodeList;
/** @type {?} */
const isIgnore = (/**
* @param {?} node
* @return {?}
*/
(node) => {
/** @type {?} */
const parentNode = node.getParentNode();
if (parentNode) {
if (this.checkedNodeList.findIndex((/**
* @param {?} n
* @return {?}
*/
n => n.key === parentNode.key)) > -1) {
return true;
}
else {
return isIgnore(parentNode);
}
}
return false;
});
// merge checked
if (!this.isCheckStrictly) {
resultNodesList = this.checkedNodeList.filter((/**
* @param {?} n
* @return {?}
*/
n => !isIgnore(n)));
}
break;
case 'halfCheck':
if (!this.isCheckStrictly) {
resultNodesList = this.halfCheckedNodeList;
}
break;
}
return resultNodesList;
}
/**
* set expanded nodes
* @param {?} node
* @return {?}
*/
setExpandedNodeList(node) {
if (node.isLeaf) {
return;
}
/** @type {?} */
const index = this.getIndexOfArray(this.expandedNodeList, node.key);
if (node.isExpanded && index === -1) {
this.expandedNodeList.push(node);
}
else if (!node.isExpanded && index > -1) {
this.expandedNodeList.splice(index, 1);
}
}
/**
* @param {?} node
* @return {?}
*/
setMatchedNodeList(node) {
/** @type {?} */
const index = this.getIndexOfArray(this.matchedNodeList, node.key);
if (node.isMatched && index === -1) {
this.matchedNodeList.push(node);
}
else if (!node.isMatched && index > -1) {
this.matchedNodeList.splice(index, 1);
}
}
/**
* check state
* @param {?=} isCheckStrictly
* @return {?}
*/
refreshCheckState(isCheckStrictly = false) {
if (isCheckStrictly) {
return;
}
this.checkedNodeList.forEach((/**
* @param {?} node
* @return {?}
*/
node => {
this.conduct(node);
}));
}
// reset other node checked state based current node
/**
* @param {?} node
* @return {?}
*/
conduct(node) {
/** @type {?} */
const isChecked = node.isChecked;
if (node) {
this.conductUp(node);
this.conductDown(node, isChecked);
}
}
/**
* 1、children half checked
* 2、children all checked, parent checked
* 3、no children checked
* @param {?} node
* @return {?}
*/
conductUp(node) {
/** @type {?} */
const parentNode = node.getParentNode();
if (parentNode) {
if (!isCheckDisabled(parentNode)) {
if (parentNode.children.every((/**
* @param {?} child
* @return {?}
*/
child => isCheckDisabled(child) || (!child.isHalfChecked && child.isChecked)))) {
parentNode.isChecked = true;
parentNode.isHalfChecked = false;
}
else if (parentNode.children.some((/**
* @param {?} child
* @return {?}
*/
child => child.isHalfChecked || child.isChecked))) {
parentNode.isChecked = false;
parentNode.isHalfChecked = true;
}
else {
parentNode.isChecked = false;
parentNode.isHalfChecked = false;
}
}
this.setCheckedNodeList(parentNode);
this.setHalfCheckedNodeList(parentNode);
this.conductUp(parentNode);
}
}
/**
* reset child check state
* @param {?} node
* @param {?} value
* @return {?}
*/
conductDown(node, value) {
if (!isCheckDisabled(node)) {
node.isChecked = value;
node.isHalfChecked = false;
this.setCheckedNodeList(node);
this.setHalfCheckedNodeList(node);
node.children.forEach((/**
* @param {?} n
* @return {?}
*/
n => {
this.conductDown(n, value);
}));
}
}
/**
* flush after delete node
* @param {?} nodes
* @return {?}
*/
afterRemove(nodes) {
// to reset selectedNodeList & expandedNodeList
/** @type {?} */
const loopNode = (/**
* @param {?} node
* @return {?}
*/
(node) => {
// remove selected node
this.selectedNodeList = this.selectedNodeList.filter((/**
* @param {?} n
* @return {?}
*/
n => n.key !== node.key));
// remove expanded node
this.expandedNodeList = this.expandedNodeList.filter((/**
* @param {?} n
* @return {?}
*/
n => n.key !== node.key));
// remove checked node
this.checkedNodeList = this.checkedNodeList.filter((/**
* @param {?} n
* @return {?}
*/
n => n.key !== node.key));
if (node.children) {
node.children.forEach((/**
* @param {?} child
* @return {?}
*/
child => {
loopNode(child);
}));
}
});
nodes.forEach((/**
* @param {?} n
* @return {?}
*/
n => {
loopNode(n);
}));
this.refreshCheckState(this.isCheckStrictly);
}
/**
* drag event
* @param {?} node
* @return {?}
*/
refreshDragNode(node) {
if (node.children.length === 0) {
// until root
this.conductUp(node);
}
else {
node.children.forEach((/**
* @param {?} child
* @return {?}
*/
child => {
this.refreshDragNode(child);
}));
}
}
// reset node level
/**
* @param {?} node
* @return {?}
*/
resetNodeLevel(node) {
/** @type {?} */
const parentNode = node.getParentNode();
if (parentNode) {
node.level = parentNode.level + 1;
}
else {
node.level = 0;
}
for (const child of node.children) {
this.resetNodeLevel(child);
}
}
/**
* @param {?} event
* @return {?}
*/
calcDropPosition(event) {
const { clientY } = event;
// to fix firefox undefined
const { top, bottom, height } = event.srcElement
? ((/** @type {?} */ (event.srcElement))).getBoundingClientRect()
: ((/** @type {?} */ (event.target))).getBoundingClientRect();
/** @type {?} */
const des = Math.max(height * this.DRAG_SIDE_RANGE, this.DRAG_MIN_GAP);
if (clientY <= top + des) {
return -1;
}
else if (clientY >= bottom - des) {
return 1;
}
return 0;
}
/**
* drop
* 0: inner -1: pre 1: next
* @param {?} targetNode
* @param {?=} dragPos
* @return {?}
*/
dropAndApply(targetNode, dragPos = -1) {
if (!targetNode || dragPos > 1) {
return;
}
/** @type {?} */
const treeService = targetNode.treeService;
/** @type {?} */
const targetParent = targetNode.getParentNode();
/** @type {?} */
const isSelectedRootNode = this.selectedNode.getParentNode();
// remove the dragNode
if (isSelectedRootNode) {
isSelectedRootNode.children = isSelectedRootNode.children.filter((/**
* @param {?} n
* @return {?}
*/
n => n.key !== this.selectedNode.key));
}
else {
this.rootNodes = this.rootNodes.filter((/**
* @param {?} n
* @return {?}
*/
n => n.key !== this.selectedNode.key));
}
switch (dragPos) {
case 0:
targetNode.addChildren([this.selectedNode]);
this.resetNodeLevel(targetNode);
break;
case -1:
case 1:
/** @type {?} */
const tIndex = dragPos === 1 ? 1 : 0;
if (targetParent) {
targetParent.addChildren([this.selectedNode], targetParent.children.indexOf(targetNode) + tIndex);
/** @type {?} */
const parentNode = this.selectedNode.getParentNode();
if (parentNode) {
this.resetNodeLevel(parentNode);
}
}
else {
/** @type {?} */
const targetIndex = this.rootNodes.indexOf(targetNode) + tIndex;
// Insert root node.
this.rootNodes.splice(targetIndex, 0, this.selectedNode);
this.rootNodes[targetIndex].parentNode = null;
this.resetNodeLevel(this.rootNodes[targetIndex]);
}
break;
}
// flush all nodes
this.rootNodes.forEach((/**
* @param {?} child
* @return {?}
*/
child => {
if (!child.treeService) {
child.service = treeService;
}
this.refreshDragNode(child);
}));
}
/**
* emit Structure
* eventName
* node
* event: MouseEvent / DragEvent
* dragNode
* @param {?} eventName
* @param {?} node
* @param {?} event
* @return {?}
*/
formatEvent(eventName, node, event) {
/** @type {?} */
const emitStructure = {
eventName: eventName,
node: node,
event: event
};
switch (eventName) {
case 'dragstart':
case 'dragenter':
case 'dragover':
case 'dragleave':
case 'drop':
case 'dragend':
Object.assign(emitStructure, { dragNode: this.getSelectedNode() });
break;
case 'click':
case 'dblclick':
Object.assign(emitStructure, { selectedKeys: this.selectedNodeList });
Object.assign(emitStructure, { nodes: this.selectedNodeList });
Object.assign(emitStructure, { keys: this.selectedNodeList.map((/**
* @param {?} n
* @return {?}
*/
n => n.key)) });
break;
case 'check':
/** @type {?} */
const checkedNodeList = this.getCheckedNodeList();
Object.assign(emitStructure, { checkedKeys: checkedNodeList });
Object.assign(emitStructure, { nodes: checkedNodeList });
Object.assign(emitStructure, { keys: checkedNodeList.map((/**
* @param {?} n
* @return {?}
*/
n => n.key)) });
break;
case 'search':
Object.assign(emitStructure, { matchedKeys: this.getMatchedNodeList() });
Object.assign(emitStructure, { nodes: this.getMatchedNodeList() });
Object.assign(emitStructure, { keys: this.getMatchedNodeList().map((/**
* @param {?} n
* @return {?}
*/
n => n.key)) });
break;
case 'expand':
Object.assign(emitStructure, { nodes: this.expandedNodeList });
Object.assign(emitStructure, { keys: this.expandedNodeList.map((/**
* @param {?} n
* @return {?}
*/
n => n.key)) });
break;
}
return emitStructure;
}
/**
* New functions for flatten nodes
* @param {?} list
* @param {?} key
* @return {?}
*/
getIndexOfArray(list, key) {
return list.findIndex((/**
* @param {?} v
* @return {?}
*/
v => v.key === key));
}
/**
* Render by nzCheckedKeys
* @param {?} keys
* @param {?} checkStrictly
* @return {?}
*/
conductCheck(keys, checkStrictly) {
this.checkedNodeList = [];
this.halfCheckedNodeList = [];
/** @type {?} */
const calc = (/**
* @param {?} nodes
* @return {?}
*/
(nodes) => {
nodes.forEach((/**
* @param {?} node
* @return {?}
*/
node => {
if (isInArray(node.key, keys)) {
node.isChecked = true;
node.isHalfChecked = false;
}
else {
node.isChecked = false;
node.isHalfChecked = false;
}
if (node.children.length > 0) {
calc(node.children);
}
}));
});
calc(this.rootNodes);
this.refreshCheckState(checkStrictly);
}
/**
* @param {?=} keys
* @return {?}
*/
conductExpandedKeys(keys = []) {
/** @type {?} */
const expandedKeySet = new Set(keys === true ? [] : keys);
this.expandedNodeList = [];
/** @type {?} */
const calc = (/**
* @param {?} nodes
* @return {?}
*/
(nodes) => {
nodes.forEach((/**
* @param {?} node
* @return {?}
*/
node => {
node.setExpanded(keys === true || expandedKeySet.has(node.key) || node.isExpanded === true);
if (node.isExpanded) {
this.setExpandedNodeList(node);
}
if (node.children.length > 0) {
calc(node.children);
}
}));
});
calc(this.rootNodes);
}
/**
* @param {?} keys
* @param {?} isMulti
* @return {?}
*/
conductSelectedKeys(keys, isMulti) {
this.selectedNodeList = [];
/** @type {?} */
const calc = (/**
* @param {?} nodes
* @return {?}
*/
(nodes) => {
return nodes.every((/**
* @param {?} node
* @return {?}
*/
node => {
if (isInArray(node.key, keys)) {
node.isSelected = true;
this.setSelectedNodeList(node);
if (!isMulti) {
// if not support multi select
return false;
}
}
else {
node.isSelected = false;
}
if (node.children.length > 0) {
// Recursion
return calc(node.children);
}
return true;
}));
});
calc(this.rootNodes);
}
/**
* Expand parent nodes by child node
* @param {?} node
* @return {?}
*/
expandNodeAllParentBySearch(node) {
/** @type {?} */
const calc = (/**
* @param {?} n
* @return {?}
*/
(n) => {
if (n) {
n.canHide = false;
n.setExpanded(true);
this.setExpandedNodeList(n);
if (n.getParentNode()) {
return calc(n.getParentNode());
}
}
});
calc(node.getParentNode());
}
}
NzTreeBaseService.decorators = [
{ type: Injectable }
];
if (false) {
/** @type {?} */
NzTreeBaseService.prototype.DRAG_SIDE_RANGE;
/** @type {?} */
NzTreeBaseService.prototype.DRAG_MIN_GAP;
/** @type {?} */
NzTreeBaseService.prototype.isCheckStrictly;
/** @type {?} */
NzTreeBaseService.prototype.isMultiple;
/** @type {?} */
NzTreeBaseService.prototype.selectedNode;
/** @type {?} */
NzTreeBaseService.prototype.rootNodes;
/** @type {?} */
NzTreeBaseService.prototype.flattenNodes$;
/** @type {?} */
NzTreeBaseService.prototype.selectedNodeList;
/** @type {?} */
NzTreeBaseService.prototype.expandedNodeList;
/** @type {?} */
NzTreeBaseService.prototype.checkedNodeList;
/** @type {?} */
NzTreeBaseService.prototype.halfCheckedNodeList;
/** @type {?} */
NzTreeBaseService.prototype.matchedNodeList;
}
/**
* @fileoverview added by tsickle
* Generated from: nz-tree-service.resolver.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/** @type {?} */
const NzTreeHigherOrderServiceToken = new InjectionToken('NzTreeHigherOrder');
/**
* @fileoverview added by tsickle
* Generated from: nz-tree-base.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
class NzTreeBase {
/**
* @param {?} nzTreeService
*/
constructor(nzTreeService) {
this.nzTreeService = nzTreeService;
}
/**
* Coerces a value({\@link any[]}) to a TreeNodes({\@link NzTreeNode[]})
* @param {?} value
* @return {?}
*/
coerceTreeNodes(value) {
/** @type {?} */
let nodes = [];
if (!this.nzTreeService.isArrayOfNzTreeNode(value)) {
// has not been new NzTreeNode
nodes = value.map((/**
* @param {?} item
* @return {?}
*/
item => new NzTreeNode(item, null, this.nzTreeService)));
}
else {
nodes = value.map((/**
* @param {?} item
* @return {?}
*/
(item) => {
item.service = this.nzTreeService;
return item;
}));
}
return nodes;
}
/**
* Get all nodes({\@link NzTreeNode})
* @return {?}
*/
getTreeNodes() {
return this.nzTreeService.rootNodes;
}
/**
* Get {\@link NzTreeNode} with key
* @param {?} key
* @return {?}
*/
getTreeNodeByKey(key) {
// flat tree nodes
/** @type {?} */
const nodes = [];
/** @type {?} */
const getNode = (/**
* @param {?} node
* @return {?}
*/
(node) => {
nodes.push(node);
node.getChildren().forEach((/**
* @param {?} n
* @return {?}
*/
n => {
getNode(n);
}));
});
this.getTreeNodes().forEach((/**
* @param {?} n
* @return {?}
*/
n => {
getNode(n);
}));
return nodes.find((/**
* @param {?} n
* @return {?}
*/
n => n.key === key)) || null;
}
/**
* Get checked nodes(merged)
* @return {?}
*/
getCheckedNodeList() {
return this.nzTreeService.getCheckedNodeList();
}
/**
* Get selected nodes
* @return {?}
*/
getSelectedNodeList() {
return this.nzTreeService.getSelectedNodeList();
}
/**
* Get half checked nodes
* @return {?}
*/
getHalfCheckedNodeList() {
return this.nzTreeService.getHalfCheckedNodeList();
}
/**
* Get expanded nodes
* @return {?}
*/
getExpandedNodeList() {
return this.nzTreeService.getExpandedNodeList();
}
/**
* Get matched nodes(if nzSearchValue is not null)
* @return {?}
*/
getMatchedNodeList() {
return this.nzTreeService.getMatchedNodeList();
}
}
if (false) {
/** @type {?} */
NzTreeBase.prototype.nzTreeService;
}
/**
* @fileoverview added by tsickle
* Generated from: public-api.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* @fileoverview added by tsickle
* Generated from: ng-zorro-antd-core-tree.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
export { NzTreeBase, NzTreeBaseService, NzTreeHigherOrderServiceToken, NzTreeNode, flattenTreeData, getKey, getPosition, isCheckDisabled, isInArray };
//# sourceMappingURL=ng-zorro-antd-core-tree.js.map