refactor: popconfirm
							parent
							
								
									0ade597b55
								
							
						
					
					
						commit
						783fb2c8a9
					
				| 
						 | 
				
			
			@ -7,3 +7,5 @@ date 相关组件: dayjs, UI 变动
 | 
			
		|||
steps: add responsive、percent
 | 
			
		||||
 | 
			
		||||
collapse: add ghost、collapsible
 | 
			
		||||
 | 
			
		||||
popconfirm: add cancelButton、okButton、esc 隐藏
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -153,6 +153,13 @@ const collapseMotion = (style: Ref<CSSProperties>, className: Ref<string>): CSSM
 | 
			
		|||
  };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export { Transition, TransitionGroup, collapseMotion };
 | 
			
		||||
const getTransitionName = (rootPrefixCls: string, motion: string, transitionName?: string) => {
 | 
			
		||||
  if (transitionName !== undefined) {
 | 
			
		||||
    return transitionName;
 | 
			
		||||
  }
 | 
			
		||||
  return `${rootPrefixCls}-${motion}`;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export { Transition, TransitionGroup, collapseMotion, getTransitionName };
 | 
			
		||||
 | 
			
		||||
export default Transition;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,7 +5,7 @@ exports[`Popconfirm should show overlay when trigger is clicked 1`] = `
 | 
			
		|||
  <div class="ant-popover-arrow"><span class="ant-popover-arrow-content"></span></div>
 | 
			
		||||
  <div class="ant-popover-inner" role="tooltip">
 | 
			
		||||
    <div class="ant-popover-inner-content">
 | 
			
		||||
      <div class="ant-popover-message"><span role="img" aria-label="exclamation-circle" class="anticon anticon-exclamation-circle"><svg class="" data-icon="exclamation-circle" width="1em" height="1em" fill="currentColor" aria-hidden="true" viewBox="64 64 896 896" focusable="false"><path d="M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm-32 232c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v272c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V296zm32 440a48.01 48.01 0 010-96 48.01 48.01 0 010 96z"></path></svg></span>
 | 
			
		||||
      <div class="ant-popover-message"><span role="img" aria-label="exclamation-circle" class="anticon anticon-exclamation-circle"><svg focusable="false" class="" data-icon="exclamation-circle" width="1em" height="1em" fill="currentColor" aria-hidden="true" viewBox="64 64 896 896"><path d="M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm-32 232c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v272c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V296zm32 440a48.01 48.01 0 010-96 48.01 48.01 0 010 96z"></path></svg></span>
 | 
			
		||||
        <div class="ant-popover-message-title">code</div>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="ant-popover-buttons"><button class="ant-btn ant-btn-sm" type="button">
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -68,12 +68,11 @@ describe('Popconfirm', () => {
 | 
			
		|||
    await asyncExpect(() => {
 | 
			
		||||
      const popup = popconfirm.vm.$refs.popconfirm.getPopupDomNode();
 | 
			
		||||
      expect(popup).not.toBe(null);
 | 
			
		||||
      expect(popup.className).toContain('ant-popover-placement-top');
 | 
			
		||||
      expect(popup.innerHTML).toMatchSnapshot();
 | 
			
		||||
    }, 1000);
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  fit('should not open in disabled', async () => {
 | 
			
		||||
  it('should not open in disabled', async () => {
 | 
			
		||||
    const popconfirm = mount(
 | 
			
		||||
      {
 | 
			
		||||
        render() {
 | 
			
		||||
| 
						 | 
				
			
			@ -87,7 +86,6 @@ describe('Popconfirm', () => {
 | 
			
		|||
      { sync: false },
 | 
			
		||||
    );
 | 
			
		||||
    popconfirm.find('span').trigger('click');
 | 
			
		||||
    popconfirm.vm.$refs.popconfirm.$forceUpdate();
 | 
			
		||||
    const popup = popconfirm.vm.$refs.popconfirm.getPopupDomNode();
 | 
			
		||||
    expect(popup).toBeFalsy();
 | 
			
		||||
  });
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,159 +1,201 @@
 | 
			
		|||
import omit from 'omit.js';
 | 
			
		||||
import type { PropType } from 'vue';
 | 
			
		||||
import { defineComponent, inject } from 'vue';
 | 
			
		||||
import { computed, ExtractPropTypes, onMounted, PropType, ref, toRef } from 'vue';
 | 
			
		||||
import { defineComponent } from 'vue';
 | 
			
		||||
import Tooltip from '../tooltip';
 | 
			
		||||
import abstractTooltipProps from '../tooltip/abstractTooltipProps';
 | 
			
		||||
import PropTypes from '../_util/vue-types';
 | 
			
		||||
import { getOptionProps, hasProp, getComponent, mergeProps } from '../_util/props-util';
 | 
			
		||||
import { initDefaultProps } from '../_util/props-util';
 | 
			
		||||
import BaseMixin from '../_util/BaseMixin';
 | 
			
		||||
import type { LegacyButtonType } from '../button/buttonTypes';
 | 
			
		||||
import type { ButtonProps, LegacyButtonType } from '../button/buttonTypes';
 | 
			
		||||
import { convertLegacyProps } from '../button/buttonTypes';
 | 
			
		||||
import ExclamationCircleFilled from '@ant-design/icons-vue/ExclamationCircleFilled';
 | 
			
		||||
import Button from '../button';
 | 
			
		||||
import LocaleReceiver from '../locale-provider/LocaleReceiver';
 | 
			
		||||
import { useLocaleReceiver } from '../locale-provider/LocaleReceiver';
 | 
			
		||||
import defaultLocale from '../locale-provider/default';
 | 
			
		||||
import { defaultConfigProvider } from '../config-provider';
 | 
			
		||||
import { withInstall } from '../_util/type';
 | 
			
		||||
import useMergedState from '../_util/hooks/useMergedState';
 | 
			
		||||
import devWarning from '../vc-util/devWarning';
 | 
			
		||||
import KeyCode from '../_util/KeyCode';
 | 
			
		||||
import useConfigInject from '../_util/hooks/useConfigInject';
 | 
			
		||||
import classNames from '../_util/classNames';
 | 
			
		||||
import { getTransitionName } from '../_util/transition';
 | 
			
		||||
import { cloneVNodes } from '../_util/vnode';
 | 
			
		||||
 | 
			
		||||
const tooltipProps = abstractTooltipProps();
 | 
			
		||||
export const popconfirmProps = () => ({
 | 
			
		||||
  ...abstractTooltipProps(),
 | 
			
		||||
  prefixCls: PropTypes.string,
 | 
			
		||||
  content: PropTypes.any,
 | 
			
		||||
  title: PropTypes.any,
 | 
			
		||||
  okType: {
 | 
			
		||||
    type: String as PropType<LegacyButtonType>,
 | 
			
		||||
    default: 'primary',
 | 
			
		||||
  },
 | 
			
		||||
  disabled: PropTypes.looseBool.def(false),
 | 
			
		||||
  okText: PropTypes.any,
 | 
			
		||||
  cancelText: PropTypes.any,
 | 
			
		||||
  icon: PropTypes.any,
 | 
			
		||||
  okButtonProps: PropTypes.object,
 | 
			
		||||
  cancelButtonProps: PropTypes.object,
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
export type PopconfirmProps = Partial<ExtractPropTypes<ReturnType<typeof popconfirmProps>>>;
 | 
			
		||||
 | 
			
		||||
export interface PopconfirmLocale {
 | 
			
		||||
  okText: string;
 | 
			
		||||
  cancelText: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const Popconfirm = defineComponent({
 | 
			
		||||
  name: 'APopconfirm',
 | 
			
		||||
  mixins: [BaseMixin],
 | 
			
		||||
  props: {
 | 
			
		||||
    ...tooltipProps,
 | 
			
		||||
    prefixCls: PropTypes.string,
 | 
			
		||||
    transitionName: PropTypes.string.def('zoom-big'),
 | 
			
		||||
    content: PropTypes.any,
 | 
			
		||||
    title: PropTypes.any,
 | 
			
		||||
    trigger: tooltipProps.trigger.def('click'),
 | 
			
		||||
    okType: {
 | 
			
		||||
      type: String as PropType<LegacyButtonType>,
 | 
			
		||||
      default: 'primary',
 | 
			
		||||
    },
 | 
			
		||||
    disabled: PropTypes.looseBool.def(false),
 | 
			
		||||
    okText: PropTypes.any,
 | 
			
		||||
    cancelText: PropTypes.any,
 | 
			
		||||
    icon: PropTypes.any,
 | 
			
		||||
    okButtonProps: PropTypes.object,
 | 
			
		||||
    cancelButtonProps: PropTypes.object,
 | 
			
		||||
    onConfirm: PropTypes.func,
 | 
			
		||||
    onCancel: PropTypes.func,
 | 
			
		||||
    onVisibleChange: PropTypes.func,
 | 
			
		||||
  },
 | 
			
		||||
  props: initDefaultProps(popconfirmProps(), {
 | 
			
		||||
    trigger: 'click',
 | 
			
		||||
    transitionName: 'zoom-big',
 | 
			
		||||
    align: () => ({}),
 | 
			
		||||
    placement: 'top',
 | 
			
		||||
    mouseEnterDelay: 0.1,
 | 
			
		||||
    mouseLeaveDelay: 0.1,
 | 
			
		||||
    arrowPointAtCenter: false,
 | 
			
		||||
    autoAdjustOverflow: true,
 | 
			
		||||
    okType: 'primary',
 | 
			
		||||
    disabled: false,
 | 
			
		||||
  }),
 | 
			
		||||
  slots: ['title', 'content', 'okText', 'icon', 'cancelText', 'cancelButton', 'okButton'],
 | 
			
		||||
  emits: ['update:visible', 'confirm', 'cancel', 'visibleChange'],
 | 
			
		||||
  setup() {
 | 
			
		||||
    return {
 | 
			
		||||
      configProvider: inject('configProvider', defaultConfigProvider),
 | 
			
		||||
  setup(props: PopconfirmProps, { slots, emit, expose }) {
 | 
			
		||||
    onMounted(() => {
 | 
			
		||||
      devWarning(
 | 
			
		||||
        props.defaultVisible === undefined,
 | 
			
		||||
        'Popconfirm',
 | 
			
		||||
        `'defaultVisible' is deprecated, please use 'v-model:visible'`,
 | 
			
		||||
      );
 | 
			
		||||
    });
 | 
			
		||||
    const tooltipRef = ref();
 | 
			
		||||
 | 
			
		||||
    expose({
 | 
			
		||||
      getPopupDomNode: () => {
 | 
			
		||||
        return tooltipRef.value?.getPopupDomNode?.();
 | 
			
		||||
      },
 | 
			
		||||
    });
 | 
			
		||||
    const [visible, setVisible] = useMergedState(false, {
 | 
			
		||||
      value: toRef(props, 'visible'),
 | 
			
		||||
      defaultValue: props.defaultVisible,
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    const settingVisible = (value: boolean, e?: MouseEvent | KeyboardEvent) => {
 | 
			
		||||
      if (props.visible === undefined) {
 | 
			
		||||
        setVisible(value);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      emit('update:visible', value);
 | 
			
		||||
      emit('visibleChange', value, e);
 | 
			
		||||
    };
 | 
			
		||||
  },
 | 
			
		||||
  data() {
 | 
			
		||||
    const props = getOptionProps(this) as any;
 | 
			
		||||
    const state = { sVisible: false };
 | 
			
		||||
    if ('visible' in props) {
 | 
			
		||||
      state.sVisible = props.visible;
 | 
			
		||||
    }
 | 
			
		||||
    if ('defaultVisible' in props) {
 | 
			
		||||
      state.sVisible = props.defaultVisible;
 | 
			
		||||
    }
 | 
			
		||||
    return state;
 | 
			
		||||
  },
 | 
			
		||||
  watch: {
 | 
			
		||||
    visible(val) {
 | 
			
		||||
      this.sVisible = val;
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
  methods: {
 | 
			
		||||
    onConfirmHandle(e: Event) {
 | 
			
		||||
      this.setVisible(false, e);
 | 
			
		||||
      this.$emit('confirm', e);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    onCancelHandle(e: Event) {
 | 
			
		||||
      this.setVisible(false, e);
 | 
			
		||||
      this.$emit('cancel', e);
 | 
			
		||||
    },
 | 
			
		||||
    const onConfirm = (e: MouseEvent) => {
 | 
			
		||||
      settingVisible(false, e);
 | 
			
		||||
      emit('confirm', e);
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    onVisibleChangeHandle(sVisible: boolean) {
 | 
			
		||||
      const { disabled } = this.$props;
 | 
			
		||||
    const onCancel = (e: MouseEvent) => {
 | 
			
		||||
      settingVisible(false, e);
 | 
			
		||||
      emit('cancel', e);
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    const onKeyDown = (e: KeyboardEvent) => {
 | 
			
		||||
      if (e.keyCode === KeyCode.ESC && visible) {
 | 
			
		||||
        settingVisible(false, e);
 | 
			
		||||
      }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    const onVisibleChange = (value: boolean) => {
 | 
			
		||||
      const { disabled } = props;
 | 
			
		||||
      if (disabled) {
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
      this.setVisible(sVisible);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    setVisible(sVisible: boolean, e?: Event) {
 | 
			
		||||
      if (!hasProp(this, 'visible')) {
 | 
			
		||||
        this.setState({ sVisible });
 | 
			
		||||
      }
 | 
			
		||||
      this.$emit('update:visible', sVisible);
 | 
			
		||||
      this.$emit('visibleChange', sVisible, e);
 | 
			
		||||
    },
 | 
			
		||||
    getPopupDomNode() {
 | 
			
		||||
      return (this.$refs.tooltip as any).getPopupDomNode();
 | 
			
		||||
    },
 | 
			
		||||
    renderOverlay(prefixCls: string, popconfirmLocale) {
 | 
			
		||||
      const { okType, okButtonProps, cancelButtonProps } = this;
 | 
			
		||||
      const icon = getComponent(this, 'icon') || <ExclamationCircleFilled />;
 | 
			
		||||
      const cancelBtnProps = mergeProps({
 | 
			
		||||
      settingVisible(value);
 | 
			
		||||
    };
 | 
			
		||||
    const { prefixCls: prefixClsConfirm, configProvider } = useConfigInject('popconfirm', props);
 | 
			
		||||
    const rootPrefixCls = computed(() => configProvider.getPrefixCls());
 | 
			
		||||
    const popoverPrefixCls = computed(() => configProvider.getPrefixCls('popover'));
 | 
			
		||||
    const [popconfirmLocale] = useLocaleReceiver('Popconfirm', defaultLocale.Popconfirm);
 | 
			
		||||
    const renderOverlay = () => {
 | 
			
		||||
      const {
 | 
			
		||||
        okButtonProps,
 | 
			
		||||
        cancelButtonProps,
 | 
			
		||||
        title = slots.title?.(),
 | 
			
		||||
        cancelText = slots.cancel?.(),
 | 
			
		||||
        okText = slots.okText?.(),
 | 
			
		||||
        okType,
 | 
			
		||||
        icon = slots.icon?.(),
 | 
			
		||||
      } = props;
 | 
			
		||||
      const { cancelButton, okButton } = slots;
 | 
			
		||||
      const cancelProps: ButtonProps = {
 | 
			
		||||
        onClick: onCancel,
 | 
			
		||||
        size: 'small',
 | 
			
		||||
        onClick: this.onCancelHandle,
 | 
			
		||||
        ...cancelButtonProps,
 | 
			
		||||
      });
 | 
			
		||||
      const okBtnProps = mergeProps({
 | 
			
		||||
      };
 | 
			
		||||
      const okProps: ButtonProps = {
 | 
			
		||||
        onClick: onConfirm,
 | 
			
		||||
        ...convertLegacyProps(okType),
 | 
			
		||||
        size: 'small',
 | 
			
		||||
        onClick: this.onConfirmHandle,
 | 
			
		||||
        ...okButtonProps,
 | 
			
		||||
      });
 | 
			
		||||
      };
 | 
			
		||||
      return (
 | 
			
		||||
        <div class={`${prefixCls}-inner-content`}>
 | 
			
		||||
          <div class={`${prefixCls}-message`}>
 | 
			
		||||
            {icon}
 | 
			
		||||
            <div class={`${prefixCls}-message-title`}>{getComponent(this, 'title')}</div>
 | 
			
		||||
        <div class={`${popoverPrefixCls.value}-inner-content`}>
 | 
			
		||||
          <div class={`${popoverPrefixCls.value}-message`}>
 | 
			
		||||
            {icon || <ExclamationCircleFilled />}
 | 
			
		||||
            <div class={`${popoverPrefixCls.value}-message-title`}>{title}</div>
 | 
			
		||||
          </div>
 | 
			
		||||
          <div class={`${prefixCls}-buttons`}>
 | 
			
		||||
            <Button {...cancelBtnProps}>
 | 
			
		||||
              {getComponent(this, 'cancelText') || popconfirmLocale.cancelText}
 | 
			
		||||
            </Button>
 | 
			
		||||
            <Button {...okBtnProps}>
 | 
			
		||||
              {getComponent(this, 'okText') || popconfirmLocale.okText}
 | 
			
		||||
            </Button>
 | 
			
		||||
          <div class={`${popoverPrefixCls.value}-buttons`}>
 | 
			
		||||
            {cancelButton ? (
 | 
			
		||||
              cancelButton(cancelProps)
 | 
			
		||||
            ) : (
 | 
			
		||||
              <Button {...cancelProps}>{cancelText || popconfirmLocale.value.cancelText}</Button>
 | 
			
		||||
            )}
 | 
			
		||||
            {okButton ? (
 | 
			
		||||
              okButton(okProps)
 | 
			
		||||
            ) : (
 | 
			
		||||
              <Button {...okProps}>{okText || popconfirmLocale.value.okText}</Button>
 | 
			
		||||
            )}
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
      );
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
  render() {
 | 
			
		||||
    const props = getOptionProps(this);
 | 
			
		||||
    const { prefixCls: customizePrefixCls } = props;
 | 
			
		||||
    const { getPrefixCls } = this.configProvider;
 | 
			
		||||
    const prefixCls = getPrefixCls('popover', customizePrefixCls);
 | 
			
		||||
 | 
			
		||||
    const otherProps = omit(props, [
 | 
			
		||||
      'title',
 | 
			
		||||
      'content',
 | 
			
		||||
      'cancelText',
 | 
			
		||||
      'okText',
 | 
			
		||||
      'onUpdate:visible',
 | 
			
		||||
    ]);
 | 
			
		||||
    const overlay = (
 | 
			
		||||
      <LocaleReceiver
 | 
			
		||||
        componentName="Popconfirm"
 | 
			
		||||
        defaultLocale={defaultLocale.Popconfirm}
 | 
			
		||||
        children={popconfirmLocale => this.renderOverlay(prefixCls, popconfirmLocale)}
 | 
			
		||||
      />
 | 
			
		||||
    );
 | 
			
		||||
    const tooltipProps = {
 | 
			
		||||
      ...otherProps,
 | 
			
		||||
      title: overlay,
 | 
			
		||||
      prefixCls,
 | 
			
		||||
      visible: this.sVisible,
 | 
			
		||||
      ref: 'tooltip',
 | 
			
		||||
      onVisibleChange: this.onVisibleChangeHandle,
 | 
			
		||||
    };
 | 
			
		||||
    return <Tooltip {...tooltipProps}>{this.$slots?.default()}</Tooltip>;
 | 
			
		||||
 | 
			
		||||
    return () => {
 | 
			
		||||
      const { placement, overlayClassName, ...restProps } = props;
 | 
			
		||||
      const otherProps = omit(restProps, [
 | 
			
		||||
        'title',
 | 
			
		||||
        'content',
 | 
			
		||||
        'cancelText',
 | 
			
		||||
        'okText',
 | 
			
		||||
        'onUpdate:visible',
 | 
			
		||||
      ]);
 | 
			
		||||
      const overlayClassNames = classNames(prefixClsConfirm.value, overlayClassName);
 | 
			
		||||
      return (
 | 
			
		||||
        <Tooltip
 | 
			
		||||
          {...otherProps}
 | 
			
		||||
          prefixCls={popoverPrefixCls.value}
 | 
			
		||||
          placement={placement}
 | 
			
		||||
          onVisibleChange={onVisibleChange}
 | 
			
		||||
          visible={visible.value}
 | 
			
		||||
          overlayClassName={overlayClassNames}
 | 
			
		||||
          transitionName={getTransitionName(rootPrefixCls.value, 'zoom-big', props.transitionName)}
 | 
			
		||||
          v-slots={{ title: renderOverlay }}
 | 
			
		||||
          ref={tooltipRef}
 | 
			
		||||
        >
 | 
			
		||||
          {cloneVNodes(
 | 
			
		||||
            slots.default?.() || [],
 | 
			
		||||
            {
 | 
			
		||||
              onKeydown: (e: KeyboardEvent) => {
 | 
			
		||||
                onKeyDown(e);
 | 
			
		||||
              },
 | 
			
		||||
            },
 | 
			
		||||
            false,
 | 
			
		||||
          )}
 | 
			
		||||
        </Tooltip>
 | 
			
		||||
      );
 | 
			
		||||
    };
 | 
			
		||||
  },
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
export default withInstall(Popconfirm);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,8 @@
 | 
			
		|||
@import '../../style/themes/index';
 | 
			
		||||
@import '../../style/mixins/index';
 | 
			
		||||
 | 
			
		||||
@popconfirm-prefix-cls: ~'@{ant-prefix}-popconfirm';
 | 
			
		||||
 | 
			
		||||
.@{popconfirm-prefix-cls} {
 | 
			
		||||
  z-index: @zindex-popoconfirm;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -4,3 +4,5 @@ import '../../style/index.less';
 | 
			
		|||
// deps-lint-skip: tooltip, popover
 | 
			
		||||
import '../../popover/style';
 | 
			
		||||
import '../../button/style';
 | 
			
		||||
 | 
			
		||||
import './index.less';
 | 
			
		||||
| 
						 | 
				
			
			@ -323,8 +323,8 @@
 | 
			
		|||
@layout-trigger-color-light: @text-color;
 | 
			
		||||
 | 
			
		||||
// z-index list, order by `z-index`
 | 
			
		||||
@zindex-badge: 1;
 | 
			
		||||
@zindex-table-fixed: 1;
 | 
			
		||||
@zindex-badge: auto;
 | 
			
		||||
@zindex-table-fixed: 2;
 | 
			
		||||
@zindex-affix: 10;
 | 
			
		||||
@zindex-back-top: 10;
 | 
			
		||||
@zindex-picker-panel: 10;
 | 
			
		||||
| 
						 | 
				
			
			@ -336,7 +336,8 @@
 | 
			
		|||
@zindex-popover: 1030;
 | 
			
		||||
@zindex-dropdown: 1050;
 | 
			
		||||
@zindex-picker: 1050;
 | 
			
		||||
@zindex-tooltip: 1060;
 | 
			
		||||
@zindex-popoconfirm: 1060;
 | 
			
		||||
@zindex-tooltip: 1070;
 | 
			
		||||
@zindex-image: 1080;
 | 
			
		||||
 | 
			
		||||
// Animation
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,12 +6,13 @@ import classNames from '../_util/classNames';
 | 
			
		|||
import PropTypes from '../_util/vue-types';
 | 
			
		||||
import { PresetColorTypes } from '../_util/colors';
 | 
			
		||||
import warning from '../_util/warning';
 | 
			
		||||
import { getPropsSlot, getStyle, filterEmpty, isValidElement } from '../_util/props-util';
 | 
			
		||||
import { getStyle, filterEmpty, isValidElement, initDefaultProps } from '../_util/props-util';
 | 
			
		||||
import { cloneElement } from '../_util/vnode';
 | 
			
		||||
import type { triggerTypes, placementTypes } from './abstractTooltipProps';
 | 
			
		||||
import abstractTooltipProps from './abstractTooltipProps';
 | 
			
		||||
import useConfigInject from '../_util/hooks/useConfigInject';
 | 
			
		||||
import getPlacements, { AdjustOverflow, PlacementsConfig } from './placements';
 | 
			
		||||
import firstNotUndefined from '../_util/firstNotUndefined';
 | 
			
		||||
 | 
			
		||||
export { AdjustOverflow, PlacementsConfig };
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -40,36 +41,45 @@ const splitObject = (obj: any, keys: string[]) => {
 | 
			
		|||
  });
 | 
			
		||||
  return { picked, omitted };
 | 
			
		||||
};
 | 
			
		||||
const props = abstractTooltipProps();
 | 
			
		||||
 | 
			
		||||
const PresetColorRegex = new RegExp(`^(${PresetColorTypes.join('|')})(-inverse)?$`);
 | 
			
		||||
 | 
			
		||||
export const tooltipProps = {
 | 
			
		||||
  ...props,
 | 
			
		||||
  title: PropTypes.VNodeChild,
 | 
			
		||||
};
 | 
			
		||||
export const tooltipProps = () => ({
 | 
			
		||||
  ...abstractTooltipProps(),
 | 
			
		||||
  title: PropTypes.any,
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
export type TriggerTypes = typeof triggerTypes[number];
 | 
			
		||||
 | 
			
		||||
export type PlacementTypes = typeof placementTypes[number];
 | 
			
		||||
 | 
			
		||||
export type TooltipProps = Partial<ExtractPropTypes<typeof tooltipProps>>;
 | 
			
		||||
export type TooltipProps = Partial<ExtractPropTypes<ReturnType<typeof tooltipProps>>>;
 | 
			
		||||
 | 
			
		||||
export default defineComponent({
 | 
			
		||||
  name: 'ATooltip',
 | 
			
		||||
  inheritAttrs: false,
 | 
			
		||||
  props: tooltipProps,
 | 
			
		||||
  props: initDefaultProps(tooltipProps(), {
 | 
			
		||||
    trigger: 'hover',
 | 
			
		||||
    transitionName: 'zoom-big-fast',
 | 
			
		||||
    align: () => ({}),
 | 
			
		||||
    placement: 'top',
 | 
			
		||||
    mouseEnterDelay: 0.1,
 | 
			
		||||
    mouseLeaveDelay: 0.1,
 | 
			
		||||
    arrowPointAtCenter: false,
 | 
			
		||||
    autoAdjustOverflow: true,
 | 
			
		||||
  }),
 | 
			
		||||
  slots: ['title'],
 | 
			
		||||
  emits: ['update:visible', 'visibleChange'],
 | 
			
		||||
  setup(props, { slots, emit, attrs, expose }) {
 | 
			
		||||
    const { prefixCls, getTargetContainer } = useConfigInject('tooltip', props);
 | 
			
		||||
 | 
			
		||||
    const visible = ref(false);
 | 
			
		||||
    const visible = ref(firstNotUndefined([props.visible, props.defaultVisible]));
 | 
			
		||||
 | 
			
		||||
    const tooltip = ref();
 | 
			
		||||
 | 
			
		||||
    onMounted(() => {
 | 
			
		||||
      warning(
 | 
			
		||||
        !('default-visible' in attrs) || !('defaultVisible' in attrs),
 | 
			
		||||
        props.defaultVisible === undefined,
 | 
			
		||||
        'Tooltip',
 | 
			
		||||
        `'defaultVisible' is deprecated, please use 'v-model:visible'`,
 | 
			
		||||
      );
 | 
			
		||||
| 
						 | 
				
			
			@ -79,11 +89,10 @@ export default defineComponent({
 | 
			
		|||
      val => {
 | 
			
		||||
        visible.value = !!val;
 | 
			
		||||
      },
 | 
			
		||||
      { immediate: true },
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    const isNoTitle = () => {
 | 
			
		||||
      const title = getPropsSlot(slots, props, 'title');
 | 
			
		||||
      const title = props.title ?? slots.title;
 | 
			
		||||
      return !title && title !== 0;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -164,8 +173,7 @@ export default defineComponent({
 | 
			
		|||
    };
 | 
			
		||||
 | 
			
		||||
    const getOverlay = () => {
 | 
			
		||||
      const title = getPropsSlot(slots, props, 'title');
 | 
			
		||||
      return title ?? '';
 | 
			
		||||
      return props.title ?? slots.title?.();
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    const onPopupAlign = (domNode: HTMLElement, align: any) => {
 | 
			
		||||
| 
						 | 
				
			
			@ -234,7 +242,6 @@ export default defineComponent({
 | 
			
		|||
        prefixCls: prefixCls.value,
 | 
			
		||||
        getTooltipContainer: getPopupContainer || getTargetContainer.value,
 | 
			
		||||
        builtinPlacements: tooltipPlacements.value,
 | 
			
		||||
        overlay: getOverlay(),
 | 
			
		||||
        visible: tempVisible,
 | 
			
		||||
        ref: tooltip,
 | 
			
		||||
        overlayClassName: customOverlayClassName,
 | 
			
		||||
| 
						 | 
				
			
			@ -249,6 +256,7 @@ export default defineComponent({
 | 
			
		|||
            arrowContent: () => (
 | 
			
		||||
              <span class={`${prefixCls.value}-arrow-content`} style={arrowContentStyle}></span>
 | 
			
		||||
            ),
 | 
			
		||||
            overlay: getOverlay,
 | 
			
		||||
          }}
 | 
			
		||||
        >
 | 
			
		||||
          {visible.value ? cloneElement(child, { class: childCls }) : child}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -21,23 +21,23 @@ export default () => ({
 | 
			
		|||
  trigger: PropTypes.oneOfType([
 | 
			
		||||
    PropTypes.oneOf(triggerTypes),
 | 
			
		||||
    PropTypes.arrayOf(PropTypes.oneOf(triggerTypes)),
 | 
			
		||||
  ]).def('hover'),
 | 
			
		||||
  ]),
 | 
			
		||||
  visible: PropTypes.looseBool,
 | 
			
		||||
  // defaultVisible: PropTypes.looseBool,
 | 
			
		||||
  placement: PropTypes.oneOf(placementTypes).def('top'),
 | 
			
		||||
  defaultVisible: PropTypes.looseBool,
 | 
			
		||||
  placement: PropTypes.oneOf(placementTypes),
 | 
			
		||||
  color: PropTypes.string,
 | 
			
		||||
  transitionName: PropTypes.string.def('zoom-big-fast'),
 | 
			
		||||
  overlayStyle: PropTypes.object.def(() => ({})),
 | 
			
		||||
  transitionName: PropTypes.string,
 | 
			
		||||
  overlayStyle: PropTypes.style,
 | 
			
		||||
  overlayClassName: PropTypes.string,
 | 
			
		||||
  openClassName: PropTypes.string,
 | 
			
		||||
  prefixCls: PropTypes.string,
 | 
			
		||||
  mouseEnterDelay: PropTypes.number.def(0.1),
 | 
			
		||||
  mouseLeaveDelay: PropTypes.number.def(0.1),
 | 
			
		||||
  mouseEnterDelay: PropTypes.number,
 | 
			
		||||
  mouseLeaveDelay: PropTypes.number,
 | 
			
		||||
  getPopupContainer: PropTypes.func,
 | 
			
		||||
  arrowPointAtCenter: PropTypes.looseBool.def(false),
 | 
			
		||||
  autoAdjustOverflow: PropTypes.oneOfType([PropTypes.looseBool, PropTypes.object]).def(true),
 | 
			
		||||
  destroyTooltipOnHide: PropTypes.looseBool.def(false),
 | 
			
		||||
  align: PropTypes.object.def(() => ({})),
 | 
			
		||||
  arrowPointAtCenter: PropTypes.looseBool,
 | 
			
		||||
  autoAdjustOverflow: PropTypes.oneOfType([PropTypes.looseBool, PropTypes.object]),
 | 
			
		||||
  destroyTooltipOnHide: PropTypes.looseBool,
 | 
			
		||||
  align: PropTypes.object,
 | 
			
		||||
  builtinPlacements: PropTypes.object,
 | 
			
		||||
  children: PropTypes.array,
 | 
			
		||||
  onVisibleChange: PropTypes.func,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,7 +22,7 @@ export default defineComponent({
 | 
			
		|||
    openClassName: PropTypes.string,
 | 
			
		||||
    animation: PropTypes.any,
 | 
			
		||||
    align: PropTypes.object,
 | 
			
		||||
    overlayStyle: PropTypes.object.def(() => ({})),
 | 
			
		||||
    overlayStyle: PropTypes.style,
 | 
			
		||||
    placement: PropTypes.string.def('bottomLeft'),
 | 
			
		||||
    overlay: PropTypes.any,
 | 
			
		||||
    trigger: PropTypes.oneOfType([PropTypes.string, PropTypes.arrayOf(PropTypes.string)]).def(
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,7 +4,6 @@ import PropTypes from '../../_util/vue-types';
 | 
			
		|||
 | 
			
		||||
const tooltipContentProps = {
 | 
			
		||||
  prefixCls: PropTypes.string,
 | 
			
		||||
  overlay: PropTypes.any,
 | 
			
		||||
  id: PropTypes.string,
 | 
			
		||||
  overlayInnerStyle: PropTypes.any,
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			@ -14,7 +13,8 @@ export type TooltipContentProps = Partial<ExtractPropTypes<typeof tooltipContent
 | 
			
		|||
export default defineComponent({
 | 
			
		||||
  name: 'Content',
 | 
			
		||||
  props: tooltipContentProps,
 | 
			
		||||
  setup(props: TooltipContentProps) {
 | 
			
		||||
  slots: ['overlay'],
 | 
			
		||||
  setup(props: TooltipContentProps, { slots }) {
 | 
			
		||||
    return () => (
 | 
			
		||||
      <div
 | 
			
		||||
        class={`${props.prefixCls}-inner`}
 | 
			
		||||
| 
						 | 
				
			
			@ -22,7 +22,7 @@ export default defineComponent({
 | 
			
		|||
        role="tooltip"
 | 
			
		||||
        style={props.overlayInnerStyle}
 | 
			
		||||
      >
 | 
			
		||||
        {typeof props.overlay === 'function' ? props.overlay() : props.overlay}
 | 
			
		||||
        {slots.overlay?.()}
 | 
			
		||||
      </div>
 | 
			
		||||
    );
 | 
			
		||||
  },
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,8 +16,7 @@ export default defineComponent({
 | 
			
		|||
    transitionName: PropTypes.string,
 | 
			
		||||
    animation: PropTypes.any,
 | 
			
		||||
    afterVisibleChange: PropTypes.func.def(() => {}),
 | 
			
		||||
    overlay: PropTypes.any,
 | 
			
		||||
    overlayStyle: PropTypes.object,
 | 
			
		||||
    overlayStyle: PropTypes.style,
 | 
			
		||||
    overlayClassName: PropTypes.string,
 | 
			
		||||
    prefixCls: PropTypes.string.def('rc-tooltip'),
 | 
			
		||||
    mouseEnterDelay: PropTypes.number.def(0.1),
 | 
			
		||||
| 
						 | 
				
			
			@ -47,8 +46,8 @@ export default defineComponent({
 | 
			
		|||
          key="content"
 | 
			
		||||
          prefixCls={prefixCls}
 | 
			
		||||
          id={tipId}
 | 
			
		||||
          overlay={getPropsSlot(slots, props, 'overlay')}
 | 
			
		||||
          overlayInnerStyle={overlayInnerStyle}
 | 
			
		||||
          v-slots={{ overlay: slots.overlay }}
 | 
			
		||||
        />,
 | 
			
		||||
      ];
 | 
			
		||||
    };
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -55,7 +55,7 @@ export default defineComponent({
 | 
			
		|||
    onPopupVisibleChange: PropTypes.func.def(noop),
 | 
			
		||||
    afterPopupVisibleChange: PropTypes.func.def(noop),
 | 
			
		||||
    popup: PropTypes.any,
 | 
			
		||||
    popupStyle: PropTypes.object.def(() => ({})),
 | 
			
		||||
    popupStyle: PropTypes.style,
 | 
			
		||||
    prefixCls: PropTypes.string.def('rc-trigger-popup'),
 | 
			
		||||
    popupClassName: PropTypes.string.def(''),
 | 
			
		||||
    popupPlacement: PropTypes.string,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,7 +5,7 @@
 | 
			
		|||
</template>
 | 
			
		||||
<script>
 | 
			
		||||
import { defineComponent } from 'vue';
 | 
			
		||||
import demo from '../v2-doc/src/docs/collapse/demo/index.vue';
 | 
			
		||||
import demo from '../v2-doc/src/docs/popconfirm/demo/index.vue';
 | 
			
		||||
// import Affix from '../components/affix';
 | 
			
		||||
export default defineComponent({
 | 
			
		||||
  components: {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue