BaseWidgetHeader.vue 2.92 KB
<script lang="ts" setup>
  import { MoreOutlined } from '@ant-design/icons-vue';
  import { DropMenu } from '/@/components/Dropdown';
  import Dropdown from '/@/components/Dropdown/src/Dropdown.vue';
  import { Tooltip } from 'ant-design-vue';
  import SvgIcon from '/@/components/Icon/src/SvgIcon.vue';
  import { isBataBoardSharePage, MoreActionEvent } from '../../config/config';
  import { computed } from '@vue/reactivity';
  import { usePermission } from '/@/hooks/web/usePermission';
  import { DataSource } from '/@/api/dataBoard/model';
  import { useRoute } from 'vue-router';

  const emit = defineEmits(['action']);
  const props = defineProps<{
    id: string;
    record: DataSource[];
  }>();
  const { hasPermission } = usePermission();
  const dropMenuList = computed<DropMenu[]>(() => {
    const basicMenu: DropMenu[] = [];
    const hasUpdatePermission = hasPermission('api:yt:data_component:update:update');
    const hasDeletePermission = hasPermission('api:yt:data_component:delete');
    const hasCopyPermission = hasPermission('api:yt:dataBoardDetail:copy');
    if (hasUpdatePermission)
      basicMenu.push({
        text: '编辑组件',
        event: MoreActionEvent.EDIT,
        icon: 'ant-design:edit-outlined',
      });
    if (hasDeletePermission)
      basicMenu.push({
        text: '删除组件',
        event: MoreActionEvent.DELETE,
        icon: 'ant-design:delete-outlined',
      });
    if (hasCopyPermission)
      basicMenu.push({
        text: '复制组件',
        event: MoreActionEvent.COPY,
        icon: 'ant-design:copy-outlined',
      });
    return basicMenu;
  });

  const ROUTE = useRoute();

  const getIsSharePage = computed(() => {
    return isBataBoardSharePage(ROUTE.path);
  });

  const handleMenuEvent = (event: DropMenu) => {
    emit('action', event, props.id);
  };
</script>

<template>
  <div class="flex justify-between w-full p-5">
    <div class="flex" :style="{ width: `calc(100% - 60px)` }">
      <div
        v-for="(item, index) in props.record"
        class="box-border truncate"
        :style="{ width: `${100 / props.record.length}%` }"
        :key="index"
      >
        <Tooltip :title="item.deviceName" placement="topLeft">
          <div class="flex p-1">
            <!-- <SvgIcon name="" prefix="iconfont" class="!fill-emerald-400" /> -->
            <div class="truncate font-bold">{{ item.deviceRename || item.deviceName }}</div>
          </div>
        </Tooltip>
      </div>
    </div>
    <div class="flex items-center gap-5">
      <slot name="moreAction"></slot>
      <Dropdown
        v-if="dropMenuList.length"
        :drop-menu-list="dropMenuList"
        :trigger="['click']"
        @menu-event="handleMenuEvent"
      >
        <Tooltip title="更多">
          <MoreOutlined
            v-if="!getIsSharePage"
            class="transform rotate-90 cursor-pointer w-4.5 h-4.5 text-lg"
          />
        </Tooltip>
      </Dropdown>
    </div>
  </div>
</template>