ant-design-vue/components/vc-select2/SelectTrigger.tsx

157 lines
4.4 KiB
TypeScript
Raw Normal View History

2020-09-30 16:21:04 +08:00
import Trigger from '../vc-trigger';
import PropTypes from '../_util/vue-types';
import { getSlot } from '../_util/props-util';
import classNames from '../_util/classNames';
import createRef from '../_util/createRef';
2020-10-03 15:54:52 +08:00
import { CSSProperties, defineComponent, VNodeChild } from 'vue';
import { RenderDOMFunc } from './interface';
2020-09-30 16:21:04 +08:00
2020-10-03 15:54:52 +08:00
const getBuiltInPlacements = (dropdownMatchSelectWidth: number | boolean) => {
2020-09-30 16:21:04 +08:00
// Enable horizontal overflow auto-adjustment when a custom dropdown width is provided
const adjustX = typeof dropdownMatchSelectWidth !== 'number' ? 0 : 1;
return {
bottomLeft: {
points: ['tl', 'bl'],
offset: [0, 4],
overflow: {
adjustX,
adjustY: 1,
},
},
bottomRight: {
points: ['tr', 'br'],
offset: [0, 4],
overflow: {
adjustX,
adjustY: 1,
},
},
topLeft: {
points: ['bl', 'tl'],
offset: [0, -4],
overflow: {
adjustX,
adjustY: 1,
},
},
topRight: {
points: ['br', 'tr'],
offset: [0, -4],
overflow: {
adjustX,
adjustY: 1,
},
},
};
};
2020-10-03 15:54:52 +08:00
export interface SelectTriggerProps {
prefixCls: string;
disabled: boolean;
visible: boolean;
2020-10-07 22:49:01 +08:00
popupElement: VNodeChild | JSX.Element;
2020-10-03 15:54:52 +08:00
animation?: string;
transitionName?: string;
containerWidth: number;
dropdownStyle: CSSProperties;
dropdownClassName: string;
direction: string;
dropdownMatchSelectWidth?: boolean | number;
dropdownRender?: (menu: VNodeChild) => VNodeChild;
getPopupContainer?: RenderDOMFunc;
dropdownAlign: object;
empty: boolean;
2020-10-07 22:49:01 +08:00
getTriggerDOMNode: () => any;
2020-10-03 15:54:52 +08:00
}
const SelectTrigger = defineComponent<SelectTriggerProps>({
2020-09-30 16:21:04 +08:00
name: 'SelectTrigger',
inheritAttrs: false,
created() {
this.popupRef = createRef();
},
methods: {
getPopupElement() {
return this.popupRef.current;
},
},
render() {
2020-10-03 15:54:52 +08:00
const { empty = false, ...props } = { ...this.$props, ...this.$attrs };
2020-09-30 16:21:04 +08:00
const {
visible,
dropdownAlign,
prefixCls,
popupElement,
dropdownClassName,
dropdownStyle,
dropdownMatchSelectWidth,
containerWidth,
dropdownRender,
2020-10-08 22:51:09 +08:00
animation,
transitionName,
2020-10-10 13:57:37 +08:00
} = props as SelectTriggerProps;
2020-09-30 16:21:04 +08:00
const dropdownPrefixCls = `${prefixCls}-dropdown`;
let popupNode = popupElement;
if (dropdownRender) {
popupNode = dropdownRender({ menuNode: popupElement, props });
}
const builtInPlacements = getBuiltInPlacements(dropdownMatchSelectWidth);
2020-10-08 22:51:09 +08:00
const mergedTransitionName = animation ? `${dropdownPrefixCls}-${animation}` : transitionName;
2020-09-30 16:21:04 +08:00
const popupStyle = { minWidth: containerWidth, ...dropdownStyle };
if (typeof dropdownMatchSelectWidth === 'number') {
popupStyle.width = `${dropdownMatchSelectWidth}px`;
} else if (dropdownMatchSelectWidth) {
popupStyle.width = `${containerWidth}px`;
}
return (
<Trigger
{...props}
showAction={[]}
hideAction={[]}
popupPlacement={this.direction === 'rtl' ? 'bottomRight' : 'bottomLeft'}
builtinPlacements={builtInPlacements}
prefixCls={dropdownPrefixCls}
2020-10-08 22:51:09 +08:00
popupTransitionName={mergedTransitionName}
2020-09-30 16:21:04 +08:00
onPopupVisibleChange={props.onDropdownVisibleChange}
popup={<div ref={this.popupRef}>{popupNode}</div>}
popupAlign={dropdownAlign}
popupVisible={visible}
getPopupContainer={props.getPopupContainer}
popupClassName={classNames(dropdownClassName, {
[`${dropdownPrefixCls}-empty`]: empty,
})}
popupStyle={popupStyle}
getTriggerDOMNode={this.getTriggerDOMNode}
>
{getSlot(this)[0]}
</Trigger>
);
},
2020-10-03 15:54:52 +08:00
});
SelectTrigger.props = {
dropdownAlign: PropTypes.object,
2020-10-08 22:51:09 +08:00
visible: { type: Boolean, default: undefined },
disabled: { type: Boolean, default: undefined },
2020-10-03 15:54:52 +08:00
dropdownClassName: PropTypes.string,
dropdownStyle: PropTypes.object,
2020-10-08 22:51:09 +08:00
empty: { type: Boolean, default: undefined },
2020-10-03 15:54:52 +08:00
prefixCls: PropTypes.string,
popupClassName: PropTypes.string,
animation: PropTypes.string,
transitionName: PropTypes.string,
getPopupContainer: PropTypes.func,
dropdownRender: PropTypes.func,
containerWidth: PropTypes.number,
dropdownMatchSelectWidth: PropTypes.oneOfType([Number, Boolean]).def(true),
popupElement: PropTypes.any,
direction: PropTypes.string,
getTriggerDOMNode: PropTypes.func,
2020-09-30 16:21:04 +08:00
};
2020-10-03 15:54:52 +08:00
export default SelectTrigger;