feat: update vc-tree-select
parent
4be3da0701
commit
7a2e2e3c3b
|
@ -3,18 +3,18 @@ const getTransitionGroupProps = (transitionName, opt = {}) => {
|
|||
if (process.env.NODE_ENV === 'test') {
|
||||
return { css: false, ...opt };
|
||||
}
|
||||
const transitionProps = {
|
||||
const transitionProps = transitionName ? {
|
||||
appear: true,
|
||||
appearFromClass: `${transitionName}-appear ${transitionName}-appear-prepare`,
|
||||
appearActiveClass: `${transitionName}`,
|
||||
appearToClass: `${transitionName}-appear-active`,
|
||||
appearToClass: `${transitionName}-appear ${transitionName}-appear-active`,
|
||||
enterFromClass: `${transitionName}-appear ${transitionName}-enter ${transitionName}-appear-prepare ${transitionName}-enter-prepare`,
|
||||
enterActiveClass: `${transitionName}`,
|
||||
enterToClass: `${transitionName}-appear-active ${transitionName}-enter-active`,
|
||||
enterToClass: `${transitionName}-enter ${transitionName}-appear ${transitionName}-appear-active ${transitionName}-enter-active`,
|
||||
leaveActiveClass: `${transitionName} ${transitionName}-leave`,
|
||||
leaveToClass: `${transitionName}-leave-active`,
|
||||
...opt,
|
||||
};
|
||||
} : { css: false, ...opt };
|
||||
return transitionProps;
|
||||
};
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@ const getTransitionProps = (transitionName, opt = {}) => {
|
|||
if (process.env.NODE_ENV === 'test') {
|
||||
return { css: false, ...opt };
|
||||
}
|
||||
const transitionProps = {
|
||||
const transitionProps = transitionName ? {
|
||||
appear: true,
|
||||
appearFromClass: `${transitionName}-appear ${transitionName}-appear-prepare`,
|
||||
// appearActiveClass: `antdv-base-transtion`,
|
||||
|
@ -14,7 +14,7 @@ const getTransitionProps = (transitionName, opt = {}) => {
|
|||
leaveActiveClass: `${transitionName}-leave ${transitionName}-leave-active`,
|
||||
leaveToClass: `${transitionName}-leave ${transitionName}-leave-active`,
|
||||
...opt,
|
||||
};
|
||||
}: { css: false, ...opt };
|
||||
return transitionProps;
|
||||
};
|
||||
|
||||
|
|
|
@ -15,6 +15,7 @@ import Tooltip from '../tooltip';
|
|||
import Progress from '../progress';
|
||||
import classNames from '../_util/classNames';
|
||||
import { UploadListProps } from './interface';
|
||||
import getTransitionGroupProps from '../_util/getTransitionGroupProps';
|
||||
|
||||
export default {
|
||||
name: 'AUploadList',
|
||||
|
@ -265,7 +266,7 @@ export default {
|
|||
[`${prefixCls}-list-${listType}`]: true,
|
||||
});
|
||||
const animationDirection = listType === 'picture-card' ? 'animate-inline' : 'animate';
|
||||
const transitionGroupProps = getTransitionProps(`${prefixCls}-${animationDirection}`);
|
||||
const transitionGroupProps = getTransitionGroupProps(`${prefixCls}-${animationDirection}`);
|
||||
return (
|
||||
<TransitionGroup {...transitionGroupProps} tag="div" class={listClassNames}>
|
||||
{list}
|
||||
|
|
|
@ -3,8 +3,8 @@ import PropTypes from '../_util/vue-types';
|
|||
import { getComponent } from '../_util/props-util';
|
||||
import BaseMixin from '../_util/BaseMixin';
|
||||
import createChainedFunction from '../_util/createChainedFunction';
|
||||
import getTransitionProps from '../_util/getTransitionProps';
|
||||
import Notice from './Notice';
|
||||
import getTransitionGroupProps from '../_util/getTransitionGroupProps';
|
||||
|
||||
function noop() {}
|
||||
|
||||
|
@ -75,7 +75,7 @@ const Notification = defineComponent({
|
|||
|
||||
render() {
|
||||
const { prefixCls, notices, remove, getTransitionName, $attrs } = this;
|
||||
const transitionProps = getTransitionProps(getTransitionName());
|
||||
const transitionProps = getTransitionGroupProps(getTransitionName());
|
||||
const noticeNodes = notices.map((notice, index) => {
|
||||
const update = Boolean(index === notices.length - 1 && notice.updateKey);
|
||||
const key = notice.updateKey ? notice.updateKey : notice.key;
|
||||
|
|
|
@ -158,11 +158,9 @@ const SelectSelector = defineComponent<SelectorProps>({
|
|||
: maxTagPlaceholder,
|
||||
});
|
||||
}
|
||||
const transitionProps = choiceTransitionName
|
||||
? getTransitionGroupProps(choiceTransitionName, {
|
||||
appear: motionAppear,
|
||||
})
|
||||
: { css: false };
|
||||
const transitionProps = getTransitionGroupProps(choiceTransitionName, {
|
||||
appear: motionAppear,
|
||||
})
|
||||
selectionNode.value = (
|
||||
<TransitionGroup {...transitionProps}>
|
||||
{...displayValues.map(
|
||||
|
|
|
@ -30,10 +30,12 @@ export const selectorPropTypes = () => ({
|
|||
placeholder: PropTypes.any,
|
||||
disabled: PropTypes.looseBool,
|
||||
focused: PropTypes.looseBool,
|
||||
isMultiple: PropTypes.looseBool,
|
||||
showSearch: PropTypes.looseBool,
|
||||
});
|
||||
|
||||
function noop() {}
|
||||
export default function(modeName) {
|
||||
export default function() {
|
||||
const BaseSelector = {
|
||||
name: 'BaseSelector',
|
||||
inheritAttrs: false,
|
||||
|
@ -101,7 +103,7 @@ export default function(modeName) {
|
|||
}
|
||||
const clearIcon = getComponent(this, 'clearIcon');
|
||||
return (
|
||||
<span key="clear" class={`${prefixCls}-selection__clear`} onClick={onSelectorClear}>
|
||||
<span key="clear" unselectable="on" aria-hidden="true" style="user-select: none;" class={`${prefixCls}-clear`} onClick={onSelectorClear}>
|
||||
{clearIcon}
|
||||
</span>
|
||||
);
|
||||
|
@ -114,7 +116,7 @@ export default function(modeName) {
|
|||
}
|
||||
const inputIcon = getComponent(this, 'inputIcon');
|
||||
return (
|
||||
<span key="arrow" class={`${prefixCls}-arrow`} style={{ outline: 'none' }}>
|
||||
<span key="arrow" class={`${prefixCls}-arrow`} style={{ outline: 'none', userSelect: 'none' }}>
|
||||
{inputIcon}
|
||||
</span>
|
||||
);
|
||||
|
@ -132,6 +134,9 @@ export default function(modeName) {
|
|||
renderSelection,
|
||||
renderPlaceholder,
|
||||
tabindex,
|
||||
isMultiple,
|
||||
showArrow,
|
||||
showSearch,
|
||||
} = this.$props;
|
||||
const { class: className, style, onClick = noop } = this.$attrs;
|
||||
const {
|
||||
|
@ -142,18 +147,21 @@ export default function(modeName) {
|
|||
if (disabled) {
|
||||
myTabIndex = null;
|
||||
}
|
||||
|
||||
const mergedClassName = classNames(prefixCls, className, {
|
||||
[`${prefixCls}-focused`]: open || focused,
|
||||
[`${prefixCls}-multiple`]: isMultiple,
|
||||
[`${prefixCls}-single`]: !isMultiple,
|
||||
[`${prefixCls}-allow-clear`]: allowClear,
|
||||
[`${prefixCls}-show-arrow`]: showArrow,
|
||||
[`${prefixCls}-disabled`]: disabled,
|
||||
[`${prefixCls}-open`]: open,
|
||||
[`${prefixCls}-show-search`]: showSearch,
|
||||
});
|
||||
return (
|
||||
<span
|
||||
<div
|
||||
style={style}
|
||||
onClick={onClick}
|
||||
class={classNames(className, prefixCls, {
|
||||
[`${prefixCls}-open`]: open,
|
||||
[`${prefixCls}-focused`]: open || focused,
|
||||
[`${prefixCls}-disabled`]: disabled,
|
||||
[`${prefixCls}-enabled`]: !disabled,
|
||||
[`${prefixCls}-allow-clear`]: allowClear,
|
||||
})}
|
||||
class={mergedClassName}
|
||||
ref={this.domRef}
|
||||
role="combobox"
|
||||
aria-expanded={open}
|
||||
|
@ -166,17 +174,13 @@ export default function(modeName) {
|
|||
onBlur={this.onBlur}
|
||||
onKeydown={onSelectorKeyDown}
|
||||
>
|
||||
<span
|
||||
key="selection"
|
||||
class={classNames(`${prefixCls}-selection`, `${prefixCls}-selection--${modeName}`)}
|
||||
>
|
||||
<span class={`${prefixCls}-selector`}>
|
||||
{renderSelection()}
|
||||
{this.renderClear()}
|
||||
{this.renderArrow()}
|
||||
|
||||
{renderPlaceholder && renderPlaceholder()}
|
||||
</span>
|
||||
</span>
|
||||
{this.renderArrow()}
|
||||
{this.renderClear()}
|
||||
</div>
|
||||
);
|
||||
},
|
||||
};
|
||||
|
|
|
@ -40,7 +40,7 @@ const SinglePopup = {
|
|||
display: searchValue ? 'none' : 'block',
|
||||
}}
|
||||
onClick={this.onPlaceholderClick}
|
||||
class={`${prefixCls}-search__field__placeholder`}
|
||||
class={`${prefixCls}-selection-placeholder`}
|
||||
>
|
||||
{searchPlaceholder}
|
||||
</span>
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
* - multiple: in the selector
|
||||
* Move the code as a SearchInput for easy management.
|
||||
*/
|
||||
import { inject, withDirectives } from 'vue';
|
||||
import { inject, withDirectives, ref, onMounted, computed, watch } from 'vue';
|
||||
import antInput from '../../_util/antInputDirective';
|
||||
import PropTypes from '../../_util/vue-types';
|
||||
import { createRef } from './util';
|
||||
|
@ -21,8 +21,22 @@ const SearchInput = {
|
|||
needAlign: PropTypes.looseBool,
|
||||
ariaId: PropTypes.string,
|
||||
},
|
||||
setup() {
|
||||
setup(props) {
|
||||
const measureRef = ref();
|
||||
const inputWidth = ref(0);
|
||||
// We measure width and set to the input immediately
|
||||
onMounted(() => {
|
||||
watch(
|
||||
computed(()=>props.searchValue),
|
||||
() => {
|
||||
inputWidth.value = measureRef.value.scrollWidth;
|
||||
},
|
||||
{ flush: 'post' },
|
||||
);
|
||||
});
|
||||
return {
|
||||
measureRef,
|
||||
inputWidth,
|
||||
vcTreeSelect: inject('vcTreeSelect', {}),
|
||||
};
|
||||
},
|
||||
|
@ -38,7 +52,7 @@ const SearchInput = {
|
|||
},
|
||||
created() {
|
||||
this.inputRef = createRef();
|
||||
this.mirrorInputRef = createRef();
|
||||
// this.mirrorInputRef = createRef();
|
||||
this.prevProps = { ...this.$props };
|
||||
},
|
||||
mounted() {
|
||||
|
@ -55,15 +69,15 @@ const SearchInput = {
|
|||
},
|
||||
|
||||
updated() {
|
||||
const { open, searchValue, needAlign } = this.$props;
|
||||
const { open } = this.$props;
|
||||
const { prevProps } = this;
|
||||
this.$nextTick(() => {
|
||||
if (open && prevProps.open !== open) {
|
||||
this.focus();
|
||||
}
|
||||
if (needAlign && searchValue !== prevProps.searchValue) {
|
||||
this.alignInputWidth();
|
||||
}
|
||||
// if (needAlign && searchValue !== prevProps.searchValue) {
|
||||
// this.alignInputWidth();
|
||||
// }
|
||||
this.prevProps = { ...this.$props };
|
||||
});
|
||||
},
|
||||
|
@ -73,10 +87,10 @@ const SearchInput = {
|
|||
* ref: https://github.com/react-component/tree-select/issues/65
|
||||
* clientWidth 0 when mounted in vue. why?
|
||||
*/
|
||||
alignInputWidth() {
|
||||
this.inputRef.current.style.width = `${this.mirrorInputRef.current.clientWidth ||
|
||||
this.mirrorInputRef.current.offsetWidth}px`;
|
||||
},
|
||||
// alignInputWidth() {
|
||||
// this.inputRef.current.style.width = `${this.mirrorInputRef.current.clientWidth ||
|
||||
// this.mirrorInputRef.current.offsetWidth}px`;
|
||||
// },
|
||||
|
||||
/**
|
||||
* Need additional timeout for focus cause parent dom is not ready when didMount trigger
|
||||
|
@ -116,31 +130,34 @@ const SearchInput = {
|
|||
vcTreeSelect: { onSearchInputKeyDown },
|
||||
handleInputChange,
|
||||
mirrorSearchValue,
|
||||
inputWidth,
|
||||
} = this;
|
||||
return (
|
||||
<span class={`${prefixCls}-search__field__wrap`}>
|
||||
{withDirectives(
|
||||
<input
|
||||
type="text"
|
||||
ref={this.inputRef}
|
||||
onInput={handleInputChange}
|
||||
onChange={handleInputChange}
|
||||
onKeydown={onSearchInputKeyDown}
|
||||
value={searchValue}
|
||||
disabled={disabled}
|
||||
class={`${prefixCls}-search__field`}
|
||||
aria-label="filter select"
|
||||
aria-autocomplete="list"
|
||||
aria-controls={open ? ariaId : undefined}
|
||||
aria-multiline="false"
|
||||
/>,
|
||||
[[antInput]],
|
||||
)}
|
||||
<span ref={this.mirrorInputRef} class={`${prefixCls}-search__field__mirror`}>
|
||||
{mirrorSearchValue}
|
||||
<>
|
||||
<span class={`${prefixCls}-selection-search`} style={{ width: inputWidth + 'px' }}>
|
||||
{withDirectives(
|
||||
<input
|
||||
type="text"
|
||||
ref={this.inputRef}
|
||||
onInput={handleInputChange}
|
||||
onChange={handleInputChange}
|
||||
onKeydown={onSearchInputKeyDown}
|
||||
value={searchValue}
|
||||
disabled={disabled}
|
||||
class={`${prefixCls}-selection-search-input`}
|
||||
aria-label="filter select"
|
||||
aria-autocomplete="list"
|
||||
aria-controls={open ? ariaId : undefined}
|
||||
aria-multiline="false"
|
||||
/>,
|
||||
[[antInput]],
|
||||
)}
|
||||
<span ref="measureRef" class={`${prefixCls}-selection-search-mirror`} aria-hidden>
|
||||
{mirrorSearchValue}
|
||||
</span>
|
||||
</span>
|
||||
{renderPlaceholder && !mirrorSearchValue ? renderPlaceholder() : null}
|
||||
</span>
|
||||
</>
|
||||
);
|
||||
},
|
||||
};
|
||||
|
|
|
@ -1096,7 +1096,7 @@ const Select = defineComponent({
|
|||
const $popup = <Popup {...popupProps} __propsSymbol__={[]} />;
|
||||
|
||||
const Selector = isMultiple ? MultipleSelector : SingleSelector;
|
||||
const $selector = <Selector {...passProps} ref={this.selectorRef} />;
|
||||
const $selector = <Selector {...passProps} isMultiple={isMultiple} ref={this.selectorRef} />;
|
||||
const selectTriggerProps = {
|
||||
...passProps,
|
||||
popupElement: $popup,
|
||||
|
|
|
@ -32,20 +32,20 @@ const Selection = {
|
|||
}
|
||||
const { class: className, style, onRemove } = this.$attrs;
|
||||
return (
|
||||
<li
|
||||
<span
|
||||
style={{ ...UNSELECTABLE_STYLE, ...style }}
|
||||
{...UNSELECTABLE_ATTRIBUTE}
|
||||
role="menuitem"
|
||||
class={classNames(`${prefixCls}-selection__choice`, className)}
|
||||
class={classNames(`${prefixCls}-selection-item`, className)}
|
||||
title={toTitle(label)}
|
||||
>
|
||||
<span class={`${prefixCls}-selection-item-content`}>{content}</span>
|
||||
{onRemove && (
|
||||
<span class={`${prefixCls}-selection__choice__remove`} onClick={this.onRemove}>
|
||||
<span class={`${prefixCls}-selection-item-remove`} onClick={this.onRemove}>
|
||||
{getComponent(this, 'removeIcon')}
|
||||
</span>
|
||||
)}
|
||||
<span class={`${prefixCls}-selection__choice__content`}>{content}</span>
|
||||
</li>
|
||||
</span>
|
||||
);
|
||||
},
|
||||
};
|
||||
|
|
|
@ -1,11 +1,10 @@
|
|||
import { inject, TransitionGroup } from 'vue';
|
||||
import { inject } from 'vue';
|
||||
import PropTypes from '../../../../_util/vue-types';
|
||||
import { createRef } from '../../util';
|
||||
import generateSelector, { selectorPropTypes } from '../../Base/BaseSelector';
|
||||
import SearchInput from '../../SearchInput';
|
||||
import Selection from './Selection';
|
||||
import { getComponent, getSlot } from '../../../../_util/props-util';
|
||||
import getTransitionProps from '../../../../_util/getTransitionProps';
|
||||
import BaseMixin from '../../../../_util/BaseMixin';
|
||||
const TREE_SELECT_EMPTY_VALUE_KEY = 'RC_TREE_SELECT_EMPTY_VALUE_KEY';
|
||||
|
||||
|
@ -73,7 +72,7 @@ const MultipleSelector = {
|
|||
display: hidden ? 'none' : 'block',
|
||||
}}
|
||||
onClick={this.onPlaceholderClick}
|
||||
class={`${prefixCls}-search__field__placeholder`}
|
||||
class={`${prefixCls}-selection-placeholder`}
|
||||
>
|
||||
{currentPlaceholder}
|
||||
</span>
|
||||
|
@ -85,8 +84,6 @@ const MultipleSelector = {
|
|||
renderSelection() {
|
||||
const {
|
||||
selectorValueList,
|
||||
choiceTransitionName,
|
||||
prefixCls,
|
||||
labelInValue,
|
||||
maxTagCount,
|
||||
} = this.$props;
|
||||
|
@ -144,7 +141,6 @@ const MultipleSelector = {
|
|||
}
|
||||
|
||||
selectedValueNodes.push(
|
||||
<li class={`${prefixCls}-search ${prefixCls}-search--inline`} key="__input">
|
||||
<SearchInput
|
||||
{...{
|
||||
...this.$props,
|
||||
|
@ -154,26 +150,10 @@ const MultipleSelector = {
|
|||
ref={this.inputRef}
|
||||
>
|
||||
{children}
|
||||
</SearchInput>
|
||||
</li>,
|
||||
);
|
||||
const className = `${prefixCls}-selection__rendered`;
|
||||
if (choiceTransitionName) {
|
||||
const transitionProps = getTransitionProps(choiceTransitionName, {
|
||||
tag: 'ul',
|
||||
onAfterLeave: this.onChoiceAnimationLeave,
|
||||
});
|
||||
return (
|
||||
<TransitionGroup class={className} {...transitionProps}>
|
||||
{selectedValueNodes}
|
||||
</TransitionGroup>
|
||||
);
|
||||
}
|
||||
return (
|
||||
<ul class={className} role="menubar">
|
||||
{selectedValueNodes}
|
||||
</ul>
|
||||
</SearchInput>,
|
||||
);
|
||||
|
||||
return selectedValueNodes;
|
||||
},
|
||||
},
|
||||
|
||||
|
|
|
@ -21,24 +21,20 @@ const SingleSelector = {
|
|||
renderSelection() {
|
||||
const { selectorValueList, placeholder, prefixCls } = this.$props;
|
||||
|
||||
let innerNode;
|
||||
|
||||
if (selectorValueList.length) {
|
||||
const { label, value } = selectorValueList[0];
|
||||
innerNode = (
|
||||
<span key="value" title={toTitle(label)} class={`${prefixCls}-selection-selected-value`}>
|
||||
return (
|
||||
<span key="value" title={toTitle(label)} class={`${prefixCls}-selection-item`}>
|
||||
{label || value}
|
||||
</span>
|
||||
);
|
||||
} else {
|
||||
innerNode = (
|
||||
<span key="placeholder" class={`${prefixCls}-selection__placeholder`}>
|
||||
return (
|
||||
<span key="placeholder" class={`${prefixCls}-selection-placeholder`}>
|
||||
{placeholder}
|
||||
</span>
|
||||
);
|
||||
}
|
||||
|
||||
return <span class={`${prefixCls}-selection__rendered`}>{innerNode}</span>;
|
||||
},
|
||||
},
|
||||
|
||||
|
|
Loading…
Reference in New Issue