BasicHelp.vue 2.8 KB
Newer Older
V
vben 已提交
1
<script lang="tsx">
V
vben 已提交
2
  import type { CSSProperties, PropType } from 'vue';
V
Vben 已提交
3
  import { defineComponent, computed, unref } from 'vue';
V
vben 已提交
4 5 6 7 8
  import { Tooltip } from 'ant-design-vue';
  import { InfoCircleOutlined } from '@ant-design/icons-vue';
  import { getPopupContainer } from '/@/utils';
  import { isString, isArray } from '/@/utils/is';
  import { getSlot } from '/@/utils/helper/tsxHelper';
V
vben 已提交
9
  import { useDesign } from '/@/hooks/web/useDesign';
V
vben 已提交
10

11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
  const props = {
    /**
     * Help text max-width
     * @default: 600px
     */
    maxWidth: { type: String, default: '600px' },
    /**
     * Whether to display the serial number
     * @default: false
     */
    showIndex: { type: Boolean },
    /**
     * Help text font color
     * @default: #ffffff
     */
    color: { type: String, default: '#ffffff' },
    /**
     * Help text font size
     * @default: 14px
     */
    fontSize: { type: String, default: '14px' },
    /**
     * Help text list
     */
    placement: { type: String, default: 'right' },
    /**
     * Help text list
     */
    text: { type: [Array, String] as PropType<string[] | string> },
  };

V
vben 已提交
42
  export default defineComponent({
V
vben 已提交
43
    name: 'BasicHelp',
V
vben 已提交
44
    components: { Tooltip },
45
    props,
V
vben 已提交
46
    setup(props, { slots }) {
V
vben 已提交
47 48
      const { prefixCls } = useDesign('basic-help');

49
      const getTooltipStyle = computed(
V
vben 已提交
50
        (): CSSProperties => ({ color: props.color, fontSize: props.fontSize }),
V
vben 已提交
51
      );
V
vben 已提交
52

53
      const getOverlayStyle = computed((): CSSProperties => ({ maxWidth: props.maxWidth }));
V
vben 已提交
54

55 56
      function renderTitle() {
        const textList = props.text;
V
vben 已提交
57

58 59
        if (isString(textList)) {
          return <p>{textList}</p>;
V
vben 已提交
60
        }
V
vben 已提交
61

62 63
        if (isArray(textList)) {
          return textList.map((text, index) => {
V
vben 已提交
64
            return (
65
              <p key={text}>
V
vben 已提交
66 67
                <>
                  {props.showIndex ? `${index + 1}. ` : ''}
68
                  {text}
V
vben 已提交
69 70 71
                </>
              </p>
            );
V
vben 已提交
72 73 74
          });
        }
        return null;
75
      }
V
vben 已提交
76

V
vben 已提交
77
      return () => {
V
vben 已提交
78 79 80
        return (
          <Tooltip
            overlayClassName={`${prefixCls}__wrap`}
81
            title={<div style={unref(getTooltipStyle)}>{renderTitle()}</div>}
V
vben 已提交
82 83
            autoAdjustOverflow={true}
            overlayStyle={unref(getOverlayStyle)}
84
            placement={props.placement as 'right'}
V
vben 已提交
85 86
            getPopupContainer={() => getPopupContainer()}
          >
87
            <span class={prefixCls}>{getSlot(slots) || <InfoCircleOutlined />}</span>
V
vben 已提交
88
          </Tooltip>
V
vben 已提交
89 90 91 92 93 94
        );
      };
    },
  });
</script>
<style lang="less">
V
vben 已提交
95
  @prefix-cls: ~'@{namespace}-basic-help';
V
vben 已提交
96

V
vben 已提交
97
  .@{prefix-cls} {
V
vben 已提交
98 99 100
    display: inline-block;
    margin-left: 6px;
    color: @text-color-help-dark;
V
vben 已提交
101
    font-size: 14px;
V
vben 已提交
102 103 104 105 106 107 108 109 110 111 112 113 114
    cursor: pointer;

    &:hover {
      color: @primary-color;
    }

    &__wrap {
      p {
        margin-bottom: 0;
      }
    }
  }
</style>