index.tsx 5.62 KB
import QxIcon from '@/packages/qx-icon';
import { Button, Tabs, Tooltip } from 'antd';
import React, { useEffect, useState } from 'react';
import './index.less';

interface QxRelationProps {
  relationTag?: any[];
  onChange?: any;
  value: string;
  filter: string;
}
// scroll状态
export enum SCROLL {
  start,
  middle,
  end,
}

const RelationList: React.FC<QxRelationProps> = (props) => {
  const { relationTag = [], onChange = () => {}, value, filter } = props;
  const [tabsIcon, setTabsIcon] = useState<boolean>(false);
  const [scroll, setScroll] = useState<SCROLL>(SCROLL.start);

  const getQuickSearchScroll = () => {
    const length =
      document?.getElementById('listRelation')?.children?.[0].children?.length;
    if (tabsIcon && length == 4) {
      const listWidth =
        document?.getElementById('listRelation')?.children?.[0].children?.[1]
          .children?.[0];
      const contentWidth =
        document?.getElementById('listRelation')?.children?.[0].children?.[1];
      if (contentWidth?.clientWidth && listWidth?.clientWidth) {
        if (contentWidth?.clientWidth - listWidth?.clientWidth > 0) {
          setTabsIcon(false);
        }
      }
      const translate =
        document?.getElementById('listRelation')?.children?.[0].children?.[1]
          ?.children?.[0]?.style?.transform;
      if (translate && listWidth?.clientWidth && contentWidth?.clientWidth) {
        const px = translate.split('(').pop().split('p').shift();
        if (Number(px) == 0) {
          setScroll(SCROLL.start);
        }
        if (
          Math.abs(Number(px)) > 0 &&
          Math.abs(Number(px)) < listWidth.clientWidth
        ) {
          setScroll(SCROLL.middle);
        }
        if (
          Math.abs(Number(px)) ==
          listWidth.clientWidth - contentWidth?.clientWidth
        ) {
          setScroll(SCROLL.end);
        }
      }
    } else if (!tabsIcon && length === 2) {
      const listWidth =
        document?.getElementById('listRelation')?.children?.[0].children?.[0]
          .children?.[0];
      const contentWidth =
        document?.getElementById('listRelation')?.children?.[0].children?.[0];
      if (contentWidth?.clientWidth && listWidth?.clientWidth) {
        if (contentWidth?.clientWidth - listWidth?.clientWidth < 0) {
          setTabsIcon(true);
        }
      }
    }
  };
  useEffect(() => {
    if (!relationTag || !relationTag.length) {
      return;
    }
    getQuickSearchScroll();
  }, [relationTag]);
  const OperationsSlot = {
    left: tabsIcon && (
      <Button
        style={{ width: 24, opacity: scroll == SCROLL.start ? 0.5 : 1 }}
        type="text"
        icon={
          <QxIcon
            type={'icon-tag-left-translate'}
            style={{ color: '#333', fontSize: 10 }}
          />
        }
        onClick={() => {
          // 左移一位
          // const tabList = document?.getElementById('listRelation')?.children?.[0].children?.[1].children?.[0];
          // const tabsNav = document?.getElementById('listRelation')?.children?.[0];
          // if(tabList.clientWidth > tabsNav.clientWidth){
          //   const translateX = Number(tabList.style.cssText.split('px')[0].split('(')[1]) + 100;
          //   if(Math.abs(translateX) < (tabList.clientWidth - tabsNav.clientWidth) && translateX < 0){
          //     tabList.style.cssText = 'transform: translate(' + translateX +'px, 0px);'
          //   }else{
          //     tabList.style.cssText = 'transform: translate(' + 0 +'px, 0px);'
          //   }
          // }
          const a =
            document?.getElementById('listRelation')?.children?.[0]
              .children?.[1].children?.[0];
          a.style.cssText = 'transform: translate(0px, 0px);';
          setScroll(SCROLL.start);
        }}
      />
    ),
    right: tabsIcon && (
      <Button
        style={{ width: 24, opacity: scroll == SCROLL.end ? 0.5 : 1 }}
        type="text"
        icon={
          <QxIcon
            type={'icon-tag-right-translate'}
            style={{ color: '#333', fontSize: 10 }}
          />
        }
        onClick={() => {
          const a =
            document?.getElementById('listRelation')?.children?.[0]
              .children?.[1].children?.[0];
          const b =
            document?.getElementById('listRelation')?.children?.[0]
              .children?.[1];
          const widget = b?.clientWidth - a?.clientWidth;
          if (widget < 0) {
            a.style.cssText = 'transform: translate(' + widget + 'px,0px);';
            setScroll(SCROLL.end);
          }
        }}
      />
    ),
  };
  return (
    <div className={'qx-list-top-relation'}>
      <Tabs
        id="listRelation"
        tabBarGutter={8}
        tabBarExtraContent={OperationsSlot}
        activeKey={value}
        onTabScroll={() => {
          getQuickSearchScroll();
        }}
        onChange={(e) => onChange(e)}
      >
        {relationTag.map((pane: any) => (
          <>
            {!(
              pane.fieldKey === 'sys_role' &&
              (filter.includes('_default_admin') ||
                filter.includes('_app_admin'))
            ) && (
              <>
                {!(
                  pane.fieldKey !== 'sys_role' &&
                  filter.includes('default_user')
                ) && (
                  <Tabs.TabPane
                    tab={
                      <span style={{ padding: '0 20px' }}>
                        <Tooltip title={pane.title}>{pane.title}</Tooltip>
                      </span>
                    }
                    key={pane.fieldKey}
                  />
                )}
              </>
            )}
          </>
        ))}
      </Tabs>
    </div>
  );
};
export default RelationList;