mirror of
https://github.com/soybeanjs/soybean-admin.git
synced 2025-09-23 03:56:37 +08:00
optimize(projects): optimize example antv
This commit is contained in:
parent
0c0d606ae5
commit
a2178d3405
@ -1,7 +1,7 @@
|
|||||||
import type { CustomGraphData } from './modules/antv-g6-flow';
|
import type { CustomGraphData } from './modules/types';
|
||||||
|
|
||||||
// 日期可以自己随便设置,就是字符串展示,也可以修改为业务需要的字段
|
// 日期可以自己随便设置,就是字符串展示,也可以修改为业务需要的字段
|
||||||
export function getFlowDatas(): CustomGraphData {
|
export function getFlowData(): CustomGraphData {
|
||||||
return {
|
return {
|
||||||
nodes: [
|
nodes: [
|
||||||
{
|
{
|
||||||
|
@ -1,55 +1,63 @@
|
|||||||
<script setup lang="tsx">
|
<script setup lang="tsx">
|
||||||
import { computed, onMounted, ref } from 'vue';
|
import { computed, onMounted, ref, useTemplateRef } from 'vue';
|
||||||
import type { IPointerEvent } from '@antv/g6';
|
import type { Ref } from 'vue';
|
||||||
|
import type { CustomBehaviorOption, IPointerEvent } from '@antv/g6';
|
||||||
import AntvFlow from './modules/antv-flow.vue';
|
import AntvFlow from './modules/antv-flow.vue';
|
||||||
import { getFlowDatas } from './data';
|
import type { CustomGraphData } from './modules/types';
|
||||||
|
import { getFlowData } from './data';
|
||||||
|
|
||||||
const antvFlowRef = ref();
|
const antvFlowRef = useTemplateRef('antvFlowRef');
|
||||||
const flowDatas = ref<any>({});
|
|
||||||
const seletedNode = ref<string | undefined>('N2');
|
const flowData = ref({
|
||||||
const behaviors = [
|
nodes: [],
|
||||||
|
edges: []
|
||||||
|
}) as Ref<CustomGraphData>;
|
||||||
|
|
||||||
|
const selectedNode = ref<string | undefined>('N2');
|
||||||
|
|
||||||
|
const behaviors: CustomBehaviorOption[] = [
|
||||||
{
|
{
|
||||||
type: 'click-select',
|
type: 'click-select',
|
||||||
enable: (event: IPointerEvent) => event.targetType === 'node',
|
enable: (event: IPointerEvent) => event.targetType === 'node',
|
||||||
onClick: (event: IPointerEvent) => {
|
onClick: (event: IPointerEvent) => {
|
||||||
const node = event.target as any;
|
const node = event.target as unknown as HTMLElement;
|
||||||
const nodeData = flowDatas.value.nodes?.find((item: any) => item.id === node.id);
|
const nodeData = flowData.value.nodes.find(item => item.id === node.id);
|
||||||
seletedNode.value = nodeData?.id;
|
selectedNode.value = nodeData?.id;
|
||||||
window.$message?.success(`选中节点:[${node?.id}]${nodeData?.name}`);
|
window.$message?.success(`选中节点:[${node.id}]${nodeData?.name}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
const hasNodeN = computed(() => flowDatas.value.nodes?.some((node: any) => node.id === 'NN'));
|
const hasNodeN = computed(() => flowData.value.nodes.some(node => node.id === 'NN'));
|
||||||
|
|
||||||
function addNode() {
|
function addNode() {
|
||||||
const { nodes, edges } = flowDatas.value;
|
const { nodes, edges } = flowData.value;
|
||||||
|
|
||||||
nodes.push({ id: 'NN', name: 'New node', status: 'NOT_STARTED' });
|
nodes.push({ id: 'NN', name: 'New node', status: 'NOT_STARTED' });
|
||||||
edges.push({ id: 'EN', source: 'N5', target: 'NN' });
|
edges.push({ id: 'EN', source: 'N5', target: 'NN' });
|
||||||
flowDatas.value = { nodes, edges };
|
flowData.value = { nodes, edges };
|
||||||
}
|
}
|
||||||
|
|
||||||
function removeNode(id: string) {
|
function removeNode(id: string) {
|
||||||
const { nodes, edges } = flowDatas.value;
|
const { nodes, edges } = flowData.value;
|
||||||
// 删除node的同时,也需要删除包含NX的edge
|
// 删除node的同时,也需要删除包含NX的edge
|
||||||
flowDatas.value = {
|
flowData.value = {
|
||||||
nodes: nodes.filter((node: any) => node.id !== id),
|
nodes: nodes.filter(node => node.id !== id),
|
||||||
edges: edges.filter((edge: any) => edge.source !== id && edge.target !== id)
|
edges: edges.filter(edge => edge.source !== id && edge.target !== id)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
flowDatas.value = getFlowDatas();
|
flowData.value = getFlowData();
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="h-full">
|
<div class="h-full">
|
||||||
<NCard title="AntV G6 Next" :bordered="false" class="h-full card-wrapper">
|
<NCard title="AntV G6 Next" :bordered="false" class="h-full card-wrapper">
|
||||||
<AntvFlow ref="antvFlowRef" :data="flowDatas" :selected="seletedNode" :behaviors="behaviors" />
|
<AntvFlow ref="antvFlowRef" :data="flowData" :selected="selectedNode" :behaviors="behaviors" />
|
||||||
<NDivider />
|
<NDivider />
|
||||||
<NFlex>
|
<NFlex>
|
||||||
<NButton @click="seletedNode = 'N5'">选中节点N5(需要自行处理选中事件,不会触发元素点击)</NButton>
|
<NButton @click="selectedNode = 'N5'">选中节点N5(需要自行处理选中事件,不会触发元素点击)</NButton>
|
||||||
<NButton v-if="!hasNodeN" @click="addNode">添加节点并与Node5连线</NButton>
|
<NButton v-if="!hasNodeN" @click="addNode">添加节点并与Node5连线</NButton>
|
||||||
<NButton v-else @click="() => removeNode('NN')">删除新添加的节点</NButton>
|
<NButton v-else @click="() => removeNode('NN')">删除新添加的节点</NButton>
|
||||||
<NButton @click="() => removeNode('NX')">删除NodeX</NButton>
|
<NButton @click="() => removeNode('NX')">删除NodeX</NButton>
|
||||||
|
@ -1,15 +1,14 @@
|
|||||||
<script setup lang="tsx">
|
<script setup lang="tsx">
|
||||||
import { shallowRef, watch } from 'vue';
|
import { shallowRef, useTemplateRef, watch } from 'vue';
|
||||||
import { vResizeObserver } from '@vueuse/components';
|
|
||||||
import { useDebounceFn } from '@vueuse/core';
|
import { useDebounceFn } from '@vueuse/core';
|
||||||
import type { CustomBehaviorOption } from '@antv/g6';
|
import { vResizeObserver } from '@vueuse/components';
|
||||||
import type { CustomGraphData } from './antv-g6-flow';
|
import type { CustomBehaviorOption, Graph } from '@antv/g6';
|
||||||
import { useAntFlow } from './antv-g6-flow';
|
import { useAntFlow } from './antv-g6-flow';
|
||||||
import { nodeStatus } from './status';
|
import { nodeStatus } from './status';
|
||||||
|
import type { CustomGraphData } from './types';
|
||||||
|
|
||||||
defineOptions({
|
defineOptions({
|
||||||
name: 'AntvFLow',
|
name: 'AntvFLow'
|
||||||
inheritAttrs: false
|
|
||||||
});
|
});
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
@ -22,8 +21,8 @@ interface Props {
|
|||||||
|
|
||||||
const props = defineProps<Props>();
|
const props = defineProps<Props>();
|
||||||
|
|
||||||
const containerRef = shallowRef();
|
const containerRef = useTemplateRef('containerRef');
|
||||||
const graphRef = shallowRef();
|
const graphRef = shallowRef<Graph | null>(null);
|
||||||
|
|
||||||
// 监听容器尺寸变化,调整画布大小为图容器大小
|
// 监听容器尺寸变化,调整画布大小为图容器大小
|
||||||
const onContainerResize = useDebounceFn(() => {
|
const onContainerResize = useDebounceFn(() => {
|
||||||
@ -54,6 +53,24 @@ async function selectNode() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function zoomOut() {
|
||||||
|
graphRef.value?.zoomBy(0.9);
|
||||||
|
}
|
||||||
|
|
||||||
|
function zoomIn() {
|
||||||
|
graphRef.value?.zoomBy(1.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
function resetZoom() {
|
||||||
|
graphRef.value?.zoomTo(1);
|
||||||
|
graphRef.value?.fitCenter();
|
||||||
|
}
|
||||||
|
|
||||||
|
function fitZoom() {
|
||||||
|
graphRef.value?.fitView();
|
||||||
|
graphRef.value?.fitCenter();
|
||||||
|
}
|
||||||
|
|
||||||
watch(
|
watch(
|
||||||
[() => props.data, () => props.selected],
|
[() => props.data, () => props.selected],
|
||||||
() => {
|
() => {
|
||||||
@ -70,30 +87,16 @@ defineExpose({ selectNode, graph: graphRef });
|
|||||||
<!-- 画布操作栏 -->
|
<!-- 画布操作栏 -->
|
||||||
<div class="absolute left-0 right-0 z-1 flex items-center items-stretch justify-between">
|
<div class="absolute left-0 right-0 z-1 flex items-center items-stretch justify-between">
|
||||||
<NButtonGroup size="small" class="bg-white!">
|
<NButtonGroup size="small" class="bg-white!">
|
||||||
<NButton @click="graphRef.zoomBy(0.9)">
|
<NButton @click="zoomOut">
|
||||||
<icon-mingcute:zoom-out-line />
|
<icon-mingcute:zoom-out-line />
|
||||||
</NButton>
|
</NButton>
|
||||||
<NButton @click="graphRef.zoomBy(1.1)">
|
<NButton @click="zoomIn">
|
||||||
<icon-mingcute:zoom-in-line />
|
<icon-mingcute:zoom-in-line />
|
||||||
</NButton>
|
</NButton>
|
||||||
<NButton
|
<NButton @click="resetZoom">
|
||||||
@click="
|
|
||||||
() => {
|
|
||||||
graphRef.zoomTo(1);
|
|
||||||
graphRef.fitCenter();
|
|
||||||
}
|
|
||||||
"
|
|
||||||
>
|
|
||||||
<icon-icon-park-outline:equal-ratio />
|
<icon-icon-park-outline:equal-ratio />
|
||||||
</NButton>
|
</NButton>
|
||||||
<NButton
|
<NButton @click="fitZoom">
|
||||||
@click="
|
|
||||||
() => {
|
|
||||||
graphRef.fitView();
|
|
||||||
graphRef.fitCenter();
|
|
||||||
}
|
|
||||||
"
|
|
||||||
>
|
|
||||||
<icon-gg:ratio />
|
<icon-gg:ratio />
|
||||||
</NButton>
|
</NButton>
|
||||||
</NButtonGroup>
|
</NButtonGroup>
|
||||||
@ -107,13 +110,13 @@ defineExpose({ selectNode, graph: graphRef });
|
|||||||
<div class="flex-col gap-8px">
|
<div class="flex-col gap-8px">
|
||||||
<div span="2" class="text-12px font-bold">节点图例</div>
|
<div span="2" class="text-12px font-bold">节点图例</div>
|
||||||
<NGrid :cols="2" :y-gap="8" class="w-180px!">
|
<NGrid :cols="2" :y-gap="8" class="w-180px!">
|
||||||
<NGi v-for="[key, value] in Object.entries(nodeStatus)" :key="key" class="flex-center">
|
<NGi v-for="(config, status) in nodeStatus" :key="status" class="flex-center">
|
||||||
<NTag size="small" round :bordered="false">
|
<NTag size="small" round :bordered="false">
|
||||||
<template #icon>
|
<template #icon>
|
||||||
<icon-f7:flag-circle-fill v-if="key === 'MILESTONE'" :style="{ color: value.color }" />
|
<icon-f7:flag-circle-fill v-if="status === 'MILESTONE'" :style="{ color: config.color }" />
|
||||||
<icon-f7:circle-fill v-else :style="{ color: value.color }" />
|
<icon-f7:circle-fill v-else :style="{ color: config.color }" />
|
||||||
</template>
|
</template>
|
||||||
{{ value.type }}
|
{{ config.type }}
|
||||||
</NTag>
|
</NTag>
|
||||||
</NGi>
|
</NGi>
|
||||||
</NGrid>
|
</NGrid>
|
||||||
|
@ -1,49 +1,35 @@
|
|||||||
import type { CustomBehaviorOption, EdgeData, GraphData, NodeData } from '@antv/g6';
|
|
||||||
import { Graph } from '@antv/g6';
|
import { Graph } from '@antv/g6';
|
||||||
|
import type { CustomBehaviorOption, IPointerEvent } from '@antv/g6';
|
||||||
import type { Canvas } from '@antv/g6/lib/runtime/canvas';
|
import type { Canvas } from '@antv/g6/lib/runtime/canvas';
|
||||||
import { useThemeStore } from '@/store/modules/theme';
|
import { useThemeStore } from '@/store/modules/theme';
|
||||||
import { getNodeIcon, nodeStatus } from './status';
|
import { getNodeIcon, nodeStatus } from './status';
|
||||||
|
import type { CustomEdgeData, CustomGraphData, CustomNodeData } from './types';
|
||||||
|
|
||||||
const baseColor = 'rgb(158 163 171)';
|
interface AntFlowConfig {
|
||||||
|
|
||||||
export interface CustomNodeData extends NodeData {
|
|
||||||
isDelayed?: boolean;
|
|
||||||
isDeleted?: boolean;
|
|
||||||
milestone?: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface CustomEdgeData extends EdgeData {
|
|
||||||
isDelayed?: boolean;
|
|
||||||
isDeleted?: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface CustomGraphData extends GraphData {
|
|
||||||
nodes?: CustomNodeData[];
|
|
||||||
edges?: CustomEdgeData[];
|
|
||||||
}
|
|
||||||
|
|
||||||
interface AntFlow {
|
|
||||||
container: string | HTMLElement | Canvas;
|
container: string | HTMLElement | Canvas;
|
||||||
data: CustomGraphData;
|
data: CustomGraphData;
|
||||||
behaviors?: CustomBehaviorOption[];
|
behaviors?: CustomBehaviorOption[];
|
||||||
autoFit?: 'view' | 'center';
|
autoFit?: 'view' | 'center';
|
||||||
}
|
}
|
||||||
|
|
||||||
export function useAntFlow(property: AntFlow) {
|
export function useAntFlow(config: AntFlowConfig) {
|
||||||
const themeStore = useThemeStore();
|
const themeStore = useThemeStore();
|
||||||
const otherBehaviors = property.behaviors ? property.behaviors : [];
|
|
||||||
|
const baseColor = 'rgb(158 163 171)';
|
||||||
|
|
||||||
|
const { container, autoFit = 'center', data, behaviors = [] } = config;
|
||||||
|
|
||||||
const graph = new Graph({
|
const graph = new Graph({
|
||||||
container: property.container,
|
container,
|
||||||
animation: false,
|
animation: false,
|
||||||
padding: 16,
|
padding: 16,
|
||||||
theme: 'light',
|
theme: 'light',
|
||||||
autoFit: property.autoFit || 'center',
|
autoFit,
|
||||||
data: property.data as GraphData,
|
data,
|
||||||
node: {
|
node: {
|
||||||
type: 'rect',
|
type: 'rect',
|
||||||
|
|
||||||
style: (node: any) => {
|
style: (node: CustomNodeData) => {
|
||||||
const iconS = getNodeIcon(node);
|
const iconS = getNodeIcon(node);
|
||||||
let labelFill = '#000000';
|
let labelFill = '#000000';
|
||||||
if (node.taskState === 'NOT_STARTED') {
|
if (node.taskState === 'NOT_STARTED') {
|
||||||
@ -51,7 +37,7 @@ export function useAntFlow(property: AntFlow) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
labelText: node.name,
|
labelText: node.name as string,
|
||||||
size: [120, 26],
|
size: [120, 26],
|
||||||
radius: 99,
|
radius: 99,
|
||||||
fill: '#FFFFFF',
|
fill: '#FFFFFF',
|
||||||
@ -91,7 +77,7 @@ export function useAntFlow(property: AntFlow) {
|
|||||||
haloStroke: themeStore.themeColor,
|
haloStroke: themeStore.themeColor,
|
||||||
haloLineWidth: 6
|
haloLineWidth: 6
|
||||||
},
|
},
|
||||||
active: (node: any) => ({
|
active: (node: CustomNodeData) => ({
|
||||||
halo: true,
|
halo: true,
|
||||||
haloStroke: node.isDeleted ? themeStore.otherColor.error : themeStore.themeColor,
|
haloStroke: node.isDeleted ? themeStore.otherColor.error : themeStore.themeColor,
|
||||||
haloLineWidth: 6,
|
haloLineWidth: 6,
|
||||||
@ -101,14 +87,14 @@ export function useAntFlow(property: AntFlow) {
|
|||||||
},
|
},
|
||||||
edge: {
|
edge: {
|
||||||
type: 'cubic-horizontal',
|
type: 'cubic-horizontal',
|
||||||
style: (node: any) => ({
|
style: (node: CustomEdgeData) => ({
|
||||||
curveOffset: 10,
|
curveOffset: 10,
|
||||||
curvePosition: 0.5,
|
curvePosition: 0.5,
|
||||||
stroke: node.isDeleted ? themeStore.otherColor.error : baseColor,
|
stroke: node.isDeleted ? themeStore.otherColor.error : baseColor,
|
||||||
lineDash: node.isDeleted ? 4 : 0
|
lineDash: node.isDeleted ? 4 : 0
|
||||||
}),
|
}),
|
||||||
state: {
|
state: {
|
||||||
active: (node: any) => ({
|
active: (node: CustomEdgeData) => ({
|
||||||
lineWidth: 2,
|
lineWidth: 2,
|
||||||
stroke: node.isDeleted ? themeStore.otherColor.error : themeStore.themeColor,
|
stroke: node.isDeleted ? themeStore.otherColor.error : themeStore.themeColor,
|
||||||
halo: true,
|
halo: true,
|
||||||
@ -133,17 +119,17 @@ export function useAntFlow(property: AntFlow) {
|
|||||||
direction: 'both'
|
direction: 'both'
|
||||||
},
|
},
|
||||||
'drag-canvas',
|
'drag-canvas',
|
||||||
...otherBehaviors
|
...behaviors
|
||||||
],
|
],
|
||||||
plugins: [
|
plugins: [
|
||||||
{
|
{
|
||||||
type: 'tooltip',
|
type: 'tooltip',
|
||||||
enable: (event: any) => event.targetType === 'node',
|
enable: (event: IPointerEvent) => event.targetType === 'node',
|
||||||
getContent: (_event: any, items: any) => {
|
getContent: (_event: IPointerEvent, items?: CustomNodeData[]) => {
|
||||||
let result = '<div style="display: flex; flex-direction: column; gap: 8px;">';
|
let result = '<div style="display: flex; flex-direction: column; gap: 8px;">';
|
||||||
|
|
||||||
// 弹出提示可以自定义各种内容,但是这里很奇怪,有的class不跟随uniocss的样式
|
// 弹出提示可以自定义各种内容,但是这里很奇怪,有的class不跟随unocss的样式
|
||||||
items?.forEach((item: any) => {
|
items?.forEach(item => {
|
||||||
result += `<h3 style="display: flex; align-items: center; gap: 8px;">${item.name}</h3>`;
|
result += `<h3 style="display: flex; align-items: center; gap: 8px;">${item.name}</h3>`;
|
||||||
result += `<div style="display: flex;"><b>状态:</b><div style="display: flex; gap: 4px;"><img src="${getNodeIcon(item)}" /><span style="font-weight: 400 !important;">${nodeStatus[item.status as keyof typeof nodeStatus].type}</span></div></div>`;
|
result += `<div style="display: flex;"><b>状态:</b><div style="display: flex; gap: 4px;"><img src="${getNodeIcon(item)}" /><span style="font-weight: 400 !important;">${nodeStatus[item.status as keyof typeof nodeStatus].type}</span></div></div>`;
|
||||||
|
|
||||||
|
@ -1,8 +1,17 @@
|
|||||||
import { h } from 'vue';
|
import { h } from 'vue';
|
||||||
import type { TagProps } from 'naive-ui';
|
|
||||||
import { NTag } from 'naive-ui';
|
import { NTag } from 'naive-ui';
|
||||||
|
import type { TagProps } from 'naive-ui';
|
||||||
|
import type { CustomNodeData, NodeStatus } from './types';
|
||||||
|
|
||||||
export const nodeStatus = {
|
interface NodeStatusConfig {
|
||||||
|
type: string;
|
||||||
|
color: string;
|
||||||
|
textColor: string;
|
||||||
|
base64: string;
|
||||||
|
flag64: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const nodeStatus: Record<NodeStatus, NodeStatusConfig> = {
|
||||||
MILESTONE: {
|
MILESTONE: {
|
||||||
type: '里程碑',
|
type: '里程碑',
|
||||||
color: '#5b5b5b',
|
color: '#5b5b5b',
|
||||||
@ -14,86 +23,74 @@ export const nodeStatus = {
|
|||||||
type: '未开始',
|
type: '未开始',
|
||||||
color: '#CCCDD0',
|
color: '#CCCDD0',
|
||||||
textColor: '#5b5b5b',
|
textColor: '#5b5b5b',
|
||||||
base64:
|
base64: `data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgNTYgNTYiPjxwYXRoIGZpbGw9IiNDQ0NERDAiIGQ9Ik0yOCA1MS45MDZjMTMuMDU1IDAgMjMuOTA2LTEwLjgyOCAyMy45MDYtMjMuOTA2YzAtMTMuMDU1LTEwLjg3NS0yMy45MDYtMjMuOTMtMjMuOTA2QzE0Ljg5OSA0LjA5NCA0LjA5NSAxNC45NDUgNC4wOTUgMjhjMCAxMy4wNzggMTAuODI4IDIzLjkwNiAyMy45MDYgMjMuOTA2Ii8+PC9zdmc+`,
|
||||||
'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgNTYgNTYiPjxwYXRoIGZpbGw9IiNDQ0NERDAiIGQ9Ik0yOCA1MS45MDZjMTMuMDU1IDAgMjMuOTA2LTEwLjgyOCAyMy45MDYtMjMuOTA2YzAtMTMuMDU1LTEwLjg3NS0yMy45MDYtMjMuOTMtMjMuOTA2QzE0Ljg5OSA0LjA5NCA0LjA5NSAxNC45NDUgNC4wOTUgMjhjMCAxMy4wNzggMTAuODI4IDIzLjkwNiAyMy45MDYgMjMuOTA2Ii8+PC9zdmc+',
|
flag64: `data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgNTYgNTYiPjxwYXRoIGZpbGw9IiNDQ0NERDAiIGQ9Ik0yOCA1MS45MDZjMTMuMDU1IDAgMjMuOTA2LTEwLjg1MSAyMy45MDYtMjMuOTA2YzAtMTMuMDc4LTEwLjg3NS0yMy45MDYtMjMuOTMtMjMuOTA2QzE0Ljg5OSA0LjA5NCA0LjA5NSAxNC45MjIgNC4wOTUgMjhjMCAxMy4wNTUgMTAuODI4IDIzLjkwNiAyMy45MDYgMjMuOTA2bS05LjA3LTExLjExYy0uNTg2IDAtMS4xMDItLjUxNS0xLjEwMi0xLjA3N1YxOS44MmMwLTEuMDA4LjQ5Mi0xLjc1OCAxLjQ1My0yLjE4Yy44NDQtLjM3NCAxLjU3LS41ODUgMy4zNzUtLjU4NWM0LjI0MiAwIDYuODkgMi4wODYgMTAuODc1IDIuMDg2YzEuOTIyIDAgMi45My0uNDkzIDMuNTQtLjQ5M2MuNzk2IDAgMS40MDYuNDkzIDEuNDA2IDEuMTcydjExLjU1NWMwIDEuMDU1LS40NDYgMS43MzQtMS40NTQgMi4xOGMtLjg2Ny4zOTgtMS42MTcuNjA5LTMuMzc1LjYwOWMtNC4wNzggMC02LjY4LTIuMDYyLTEwLjg3NS0yLjA2MmMtMS40MyAwLTIuMzY3LjI4LTIuNzg5LjQ2OHY3LjE0OWMwIC41ODYtLjQ0NSAxLjA3OC0xLjA1NCAxLjA3OCIvPjwvc3ZnPg==`
|
||||||
flag64:
|
|
||||||
'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgNTYgNTYiPjxwYXRoIGZpbGw9IiNDQ0NERDAiIGQ9Ik0yOCA1MS45MDZjMTMuMDU1IDAgMjMuOTA2LTEwLjg1MSAyMy45MDYtMjMuOTA2YzAtMTMuMDc4LTEwLjg3NS0yMy45MDYtMjMuOTMtMjMuOTA2QzE0Ljg5OSA0LjA5NCA0LjA5NSAxNC45MjIgNC4wOTUgMjhjMCAxMy4wNTUgMTAuODI4IDIzLjkwNiAyMy45MDYgMjMuOTA2bS05LjA3LTExLjExYy0uNTg2IDAtMS4xMDItLjUxNS0xLjEwMi0xLjA3N1YxOS44MmMwLTEuMDA4LjQ5Mi0xLjc1OCAxLjQ1My0yLjE4Yy44NDQtLjM3NCAxLjU3LS41ODUgMy4zNzUtLjU4NWM0LjI0MiAwIDYuODkgMi4wODYgMTAuODc1IDIuMDg2YzEuOTIyIDAgMi45My0uNDkzIDMuNTQtLjQ5M2MuNzk2IDAgMS40MDYuNDkzIDEuNDA2IDEuMTcydjExLjU1NWMwIDEuMDU1LS40NDYgMS43MzQtMS40NTQgMi4xOGMtLjg2Ny4zOTgtMS42MTcuNjA5LTMuMzc1LjYwOWMtNC4wNzggMC02LjY4LTIuMDYyLTEwLjg3NS0yLjA2MmMtMS40MyAwLTIuMzY3LjI4LTIuNzg5LjQ2OHY3LjE0OWMwIC41ODYtLjQ0NSAxLjA3OC0xLjA1NCAxLjA3OCIvPjwvc3ZnPg=='
|
|
||||||
},
|
},
|
||||||
DELAYED: {
|
DELAYED: {
|
||||||
type: '已延期',
|
type: '已延期',
|
||||||
color: '#B81111',
|
color: '#B81111',
|
||||||
textColor: '#dccbcb',
|
textColor: '#dccbcb',
|
||||||
base64:
|
base64: `data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgNTYgNTYiPjxwYXRoIGZpbGw9IiNCODExMTEiIGQ9Ik0yOCA1MS45MDZjMTMuMDU1IDAgMjMuOTA2LTEwLjgyOCAyMy45MDYtMjMuOTA2YzAtMTMuMDU1LTEwLjg3NS0yMy45MDYtMjMuOTMtMjMuOTA2QzE0Ljg5OSA0LjA5NCA0LjA5NSAxNC45NDUgNC4wOTUgMjhjMCAxMy4wNzggMTAuODI4IDIzLjkwNiAyMy45MDYgMjMuOTA2Ii8+PC9zdmc+`,
|
||||||
'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgNTYgNTYiPjxwYXRoIGZpbGw9IiNCODExMTEiIGQ9Ik0yOCA1MS45MDZjMTMuMDU1IDAgMjMuOTA2LTEwLjgyOCAyMy45MDYtMjMuOTA2YzAtMTMuMDU1LTEwLjg3NS0yMy45MDYtMjMuOTMtMjMuOTA2QzE0Ljg5OSA0LjA5NCA0LjA5NSAxNC45NDUgNC4wOTUgMjhjMCAxMy4wNzggMTAuODI4IDIzLjkwNiAyMy45MDYgMjMuOTA2Ii8+PC9zdmc+',
|
flag64: `data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgNTYgNTYiPjxwYXRoIGZpbGw9IiNCODExMTEiIGQ9Ik0yOCA1MS45MDZjMTMuMDU1IDAgMjMuOTA2LTEwLjg1MSAyMy45MDYtMjMuOTA2YzAtMTMuMDc4LTEwLjg3NS0yMy45MDYtMjMuOTMtMjMuOTA2QzE0Ljg5OSA0LjA5NCA0LjA5NSAxNC45MjIgNC4wOTUgMjhjMCAxMy4wNTUgMTAuODI4IDIzLjkwNiAyMy45MDYgMjMuOTA2bS05LjA3LTExLjExYy0uNTg2IDAtMS4xMDItLjUxNS0xLjEwMi0xLjA3N1YxOS44MmMwLTEuMDA4LjQ5Mi0xLjc1OCAxLjQ1My0yLjE4Yy44NDQtLjM3NCAxLjU3LS41ODUgMy4zNzUtLjU4NWM0LjI0MiAwIDYuODkgMi4wODYgMTAuODc1IDIuMDg2YzEuOTIyIDAgMi45My0uNDkzIDMuNTQtLjQ5M2MuNzk2IDAgMS40MDYuNDkzIDEuNDA2IDEuMTcydjExLjU1NWMwIDEuMDU1LS40NDYgMS43MzQtMS40NTQgMi4xOGMtLjg2Ny4zOTgtMS42MTcuNjA5LTMuMzc1LjYwOWMtNC4wNzggMC02LjY4LTIuMDYyLTEwLjg3NS0yLjA2MmMtMS40MyAwLTIuMzY3LjI4LTIuNzg5LjQ2OHY3LjE0OWMwIC41ODYtLjQ0NSAxLjA3OC0xLjA1NCAxLjA3OCIvPjwvc3ZnPg==`
|
||||||
flag64:
|
|
||||||
'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgNTYgNTYiPjxwYXRoIGZpbGw9IiNCODExMTEiIGQ9Ik0yOCA1MS45MDZjMTMuMDU1IDAgMjMuOTA2LTEwLjg1MSAyMy45MDYtMjMuOTA2YzAtMTMuMDc4LTEwLjg3NS0yMy45MDYtMjMuOTMtMjMuOTA2QzE0Ljg5OSA0LjA5NCA0LjA5NSAxNC45MjIgNC4wOTUgMjhjMCAxMy4wNTUgMTAuODI4IDIzLjkwNiAyMy45MDYgMjMuOTA2bS05LjA3LTExLjExYy0uNTg2IDAtMS4xMDItLjUxNS0xLjEwMi0xLjA3N1YxOS44MmMwLTEuMDA4LjQ5Mi0xLjc1OCAxLjQ1My0yLjE4Yy44NDQtLjM3NCAxLjU3LS41ODUgMy4zNzUtLjU4NWM0LjI0MiAwIDYuODkgMi4wODYgMTAuODc1IDIuMDg2YzEuOTIyIDAgMi45My0uNDkzIDMuNTQtLjQ5M2MuNzk2IDAgMS40MDYuNDkzIDEuNDA2IDEuMTcydjExLjU1NWMwIDEuMDU1LS40NDYgMS43MzQtMS40NTQgMi4xOGMtLjg2Ny4zOTgtMS42MTcuNjA5LTMuMzc1LjYwOWMtNC4wNzggMC02LjY4LTIuMDYyLTEwLjg3NS0yLjA2MmMtMS40MyAwLTIuMzY3LjI4LTIuNzg5LjQ2OHY3LjE0OWMwIC41ODYtLjQ0NSAxLjA3OC0xLjA1NCAxLjA3OCIvPjwvc3ZnPg=='
|
|
||||||
},
|
},
|
||||||
PAUSED: {
|
PAUSED: {
|
||||||
type: '已暂停',
|
type: '已暂停',
|
||||||
color: '#0E42D2',
|
color: '#0E42D2',
|
||||||
textColor: '#dae0f0',
|
textColor: '#dae0f0',
|
||||||
base64:
|
base64: `data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgNTYgNTYiPjxwYXRoIGZpbGw9IiMwRTQyRDIiIGQ9Ik0yOCA1MS45MDZjMTMuMDU1IDAgMjMuOTA2LTEwLjgyOCAyMy45MDYtMjMuOTA2YzAtMTMuMDU1LTEwLjg3NS0yMy45MDYtMjMuOTMtMjMuOTA2QzE0Ljg5OSA0LjA5NCA0LjA5NSAxNC45NDUgNC4wOTUgMjhjMCAxMy4wNzggMTAuODI4IDIzLjkwNiAyMy45MDYgMjMuOTA2Ii8+PC9zdmc+`,
|
||||||
'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgNTYgNTYiPjxwYXRoIGZpbGw9IiMwRTQyRDIiIGQ9Ik0yOCA1MS45MDZjMTMuMDU1IDAgMjMuOTA2LTEwLjgyOCAyMy45MDYtMjMuOTA2YzAtMTMuMDU1LTEwLjg3NS0yMy45MDYtMjMuOTMtMjMuOTA2QzE0Ljg5OSA0LjA5NCA0LjA5NSAxNC45NDUgNC4wOTUgMjhjMCAxMy4wNzggMTAuODI4IDIzLjkwNiAyMy45MDYgMjMuOTA2Ii8+PC9zdmc+',
|
flag64: `data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgNTYgNTYiPjxwYXRoIGZpbGw9IiMwRTQyRDIiIGQ9Ik0yOCA1MS45MDZjMTMuMDU1IDAgMjMuOTA2LTEwLjg1MSAyMy45MDYtMjMuOTA2YzAtMTMuMDc4LTEwLjg3NS0yMy45MDYtMjMuOTMtMjMuOTA2QzE0Ljg5OSA0LjA5NCA0LjA5NSAxNC45MjIgNC4wOTUgMjhjMCAxMy4wNTUgMTAuODI4IDIzLjkwNiAyMy45MDYgMjMuOTA2bS05LjA3LTExLjExYy0uNTg2IDAtMS4xMDItLjUxNS0xLjEwMi0xLjA3N1YxOS44MmMwLTEuMDA4LjQ5Mi0xLjc1OCAxLjQ1My0yLjE4Yy44NDQtLjM3NCAxLjU3LS41ODUgMy4zNzUtLjU4NWM0LjI0MiAwIDYuODkgMi4wODYgMTAuODc1IDIuMDg2YzEuOTIyIDAgMi45My0uNDkzIDMuNTQtLjQ5M2MuNzk2IDAgMS40MDYuNDkzIDEuNDA2IDEuMTcydjExLjU1NWMwIDEuMDU1LS40NDYgMS43MzQtMS40NTQgMi4xOGMtLjg2Ny4zOTgtMS42MTcuNjA5LTMuMzc1LjYwOWMtNC4wNzggMC02LjY4LTIuMDYyLTEwLjg3NS0yLjA2MmMtMS40MyAwLTIuMzY3LjI4LTIuNzg5LjQ2OHY3LjE0OWMwIC41ODYtLjQ0NSAxLjA3OC0xLjA1NCAxLjA3OCIvPjwvc3ZnPg==`
|
||||||
flag64:
|
|
||||||
'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgNTYgNTYiPjxwYXRoIGZpbGw9IiMwRTQyRDIiIGQ9Ik0yOCA1MS45MDZjMTMuMDU1IDAgMjMuOTA2LTEwLjg1MSAyMy45MDYtMjMuOTA2YzAtMTMuMDc4LTEwLjg3NS0yMy45MDYtMjMuOTMtMjMuOTA2QzE0Ljg5OSA0LjA5NCA0LjA5NSAxNC45MjIgNC4wOTUgMjhjMCAxMy4wNTUgMTAuODI4IDIzLjkwNiAyMy45MDYgMjMuOTA2bS05LjA3LTExLjExYy0uNTg2IDAtMS4xMDItLjUxNS0xLjEwMi0xLjA3N1YxOS44MmMwLTEuMDA4LjQ5Mi0xLjc1OCAxLjQ1My0yLjE4Yy44NDQtLjM3NCAxLjU3LS41ODUgMy4zNzUtLjU4NWM0LjI0MiAwIDYuODkgMi4wODYgMTAuODc1IDIuMDg2YzEuOTIyIDAgMi45My0uNDkzIDMuNTQtLjQ5M2MuNzk2IDAgMS40MDYuNDkzIDEuNDA2IDEuMTcydjExLjU1NWMwIDEuMDU1LS40NDYgMS43MzQtMS40NTQgMi4xOGMtLjg2Ny4zOTgtMS42MTcuNjA5LTMuMzc1LjYwOWMtNC4wNzggMC02LjY4LTIuMDYyLTEwLjg3NS0yLjA2MmMtMS40MyAwLTIuMzY3LjI4LTIuNzg5LjQ2OHY3LjE0OWMwIC41ODYtLjQ0NSAxLjA3OC0xLjA1NCAxLjA3OCIvPjwvc3ZnPg=='
|
|
||||||
},
|
},
|
||||||
IN_PROGRESS: {
|
IN_PROGRESS: {
|
||||||
type: '进行中',
|
type: '进行中',
|
||||||
color: '#E1BE0D',
|
color: '#E1BE0D',
|
||||||
textColor: '#4f4304',
|
textColor: '#4f4304',
|
||||||
base64:
|
base64: `data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgNTYgNTYiPjxwYXRoIGZpbGw9IiNFMUJFMEQiIGQ9Ik0yOCA1MS45MDZjMTMuMDU1IDAgMjMuOTA2LTEwLjgyOCAyMy45MDYtMjMuOTA2YzAtMTMuMDU1LTEwLjg3NS0yMy45MDYtMjMuOTMtMjMuOTA2QzE0Ljg5OSA0LjA5NCA0LjA5NSAxNC45NDUgNC4wOTUgMjhjMCAxMy4wNzggMTAuODI4IDIzLjkwNiAyMy45MDYgMjMuOTA2Ii8+PC9zdmc+`,
|
||||||
'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgNTYgNTYiPjxwYXRoIGZpbGw9IiNFMUJFMEQiIGQ9Ik0yOCA1MS45MDZjMTMuMDU1IDAgMjMuOTA2LTEwLjgyOCAyMy45MDYtMjMuOTA2YzAtMTMuMDU1LTEwLjg3NS0yMy45MDYtMjMuOTMtMjMuOTA2QzE0Ljg5OSA0LjA5NCA0LjA5NSAxNC45NDUgNC4wOTUgMjhjMCAxMy4wNzggMTAuODI4IDIzLjkwNiAyMy45MDYgMjMuOTA2Ii8+PC9zdmc+',
|
flag64: `data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgNTYgNTYiPjxwYXRoIGZpbGw9IiNFMUJFMEQiIGQ9Ik0yOCA1MS45MDZjMTMuMDU1IDAgMjMuOTA2LTEwLjg1MSAyMy45MDYtMjMuOTA2YzAtMTMuMDc4LTEwLjg3NS0yMy45MDYtMjMuOTMtMjMuOTA2QzE0Ljg5OSA0LjA5NCA0LjA5NSAxNC45MjIgNC4wOTUgMjhjMCAxMy4wNTUgMTAuODI4IDIzLjkwNiAyMy45MDYgMjMuOTA2bS05LjA3LTExLjExYy0uNTg2IDAtMS4xMDItLjUxNS0xLjEwMi0xLjA3N1YxOS44MmMwLTEuMDA4LjQ5Mi0xLjc1OCAxLjQ1My0yLjE4Yy44NDQtLjM3NCAxLjU3LS41ODUgMy4zNzUtLjU4NWM0LjI0MiAwIDYuODkgMi4wODYgMTAuODc1IDIuMDg2YzEuOTIyIDAgMi45My0uNDkzIDMuNTQtLjQ5M2MuNzk2IDAgMS40MDYuNDkzIDEuNDA2IDEuMTcydjExLjU1NWMwIDEuMDU1LS40NDYgMS43MzQtMS40NTQgMi4xOGMtLjg2Ny4zOTgtMS42MTcuNjA5LTMuMzc1LjYwOWMtNC4wNzggMC02LjY4LTIuMDYyLTEwLjg3NS0yLjA2MmMtMS40MyAwLTIuMzY3LjI4LTIuNzg5LjQ2OHY3LjE0OWMwIC41ODYtLjQ0NSAxLjA3OC0xLjA1NCAxLjA3OCIvPjwvc3ZnPg==`
|
||||||
flag64:
|
|
||||||
'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgNTYgNTYiPjxwYXRoIGZpbGw9IiNFMUJFMEQiIGQ9Ik0yOCA1MS45MDZjMTMuMDU1IDAgMjMuOTA2LTEwLjg1MSAyMy45MDYtMjMuOTA2YzAtMTMuMDc4LTEwLjg3NS0yMy45MDYtMjMuOTMtMjMuOTA2QzE0Ljg5OSA0LjA5NCA0LjA5NSAxNC45MjIgNC4wOTUgMjhjMCAxMy4wNTUgMTAuODI4IDIzLjkwNiAyMy45MDYgMjMuOTA2bS05LjA3LTExLjExYy0uNTg2IDAtMS4xMDItLjUxNS0xLjEwMi0xLjA3N1YxOS44MmMwLTEuMDA4LjQ5Mi0xLjc1OCAxLjQ1My0yLjE4Yy44NDQtLjM3NCAxLjU3LS41ODUgMy4zNzUtLjU4NWM0LjI0MiAwIDYuODkgMi4wODYgMTAuODc1IDIuMDg2YzEuOTIyIDAgMi45My0uNDkzIDMuNTQtLjQ5M2MuNzk2IDAgMS40MDYuNDkzIDEuNDA2IDEuMTcydjExLjU1NWMwIDEuMDU1LS40NDYgMS43MzQtMS40NTQgMi4xOGMtLjg2Ny4zOTgtMS42MTcuNjA5LTMuMzc1LjYwOWMtNC4wNzggMC02LjY4LTIuMDYyLTEwLjg3NS0yLjA2MmMtMS40MyAwLTIuMzY3LjI4LTIuNzg5LjQ2OHY3LjE0OWMwIC41ODYtLjQ0NSAxLjA3OC0xLjA1NCAxLjA3OCIvPjwvc3ZnPg=='
|
|
||||||
},
|
},
|
||||||
COMPLETED: {
|
COMPLETED: {
|
||||||
type: '已完成',
|
type: '已完成',
|
||||||
color: '#33C73D',
|
color: '#33C73D',
|
||||||
textColor: '#084e0c',
|
textColor: '#084e0c',
|
||||||
base64:
|
base64: `data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgNTYgNTYiPjxwYXRoIGZpbGw9IiMzM0M3M0QiIGQ9Ik0yOCA1MS45MDZjMTMuMDU1IDAgMjMuOTA2LTEwLjgyOCAyMy45MDYtMjMuOTA2YzAtMTMuMDU1LTEwLjg3NS0yMy45MDYtMjMuOTMtMjMuOTA2QzE0Ljg5OSA0LjA5NCA0LjA5NSAxNC45NDUgNC4wOTUgMjhjMCAxMy4wNzggMTAuODI4IDIzLjkwNiAyMy45MDYgMjMuOTA2Ii8+PC9zdmc+`,
|
||||||
'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgNTYgNTYiPjxwYXRoIGZpbGw9IiMzM0M3M0QiIGQ9Ik0yOCA1MS45MDZjMTMuMDU1IDAgMjMuOTA2LTEwLjgyOCAyMy45MDYtMjMuOTA2YzAtMTMuMDU1LTEwLjg3NS0yMy45MDYtMjMuOTMtMjMuOTA2QzE0Ljg5OSA0LjA5NCA0LjA5NSAxNC45NDUgNC4wOTUgMjhjMCAxMy4wNzggMTAuODI4IDIzLjkwNiAyMy45MDYgMjMuOTA2Ii8+PC9zdmc+',
|
flag64: `data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgNTYgNTYiPjxwYXRoIGZpbGw9IiMzM0M3M0QiIGQ9Ik0yOCA1MS45MDZjMTMuMDU1IDAgMjMuOTA2LTEwLjg1MSAyMy45MDYtMjMuOTA2YzAtMTMuMDc4LTEwLjg3NS0yMy45MDYtMjMuOTMtMjMuOTA2QzE0Ljg5OSA0LjA5NCA0LjA5NSAxNC45MjIgNC4wOTUgMjhjMCAxMy4wNTUgMTAuODI4IDIzLjkwNiAyMy45MDYgMjMuOTA2bS05LjA3LTExLjExYy0uNTg2IDAtMS4xMDItLjUxNS0xLjEwMi0xLjA3N1YxOS44MmMwLTEuMDA4LjQ5Mi0xLjc1OCAxLjQ1My0yLjE4Yy44NDQtLjM3NCAxLjU3LS41ODUgMy4zNzUtLjU4NWM0LjI0MiAwIDYuODkgMi4wODYgMTAuODc1IDIuMDg2YzEuOTIyIDAgMi45My0uNDkzIDMuNTQtLjQ5M2MuNzk2IDAgMS40MDYuNDkzIDEuNDA2IDEuMTcydjExLjU1NWMwIDEuMDU1LS40NDYgMS43MzQtMS40NTQgMi4xOGMtLjg2Ny4zOTgtMS42MTcuNjA5LTMuMzc1LjYwOWMtNC4wNzggMC02LjY4LTIuMDYyLTEwLjg3NS0yLjA2MmMtMS40MyAwLTIuMzY3LjI4LTIuNzg5LjQ2OHY3LjE0OWMwIC41ODYtLjQ0NSAxLjA3OC0xLjA1NCAxLjA3OCIvPjwvc3ZnPg==`
|
||||||
flag64:
|
|
||||||
'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgNTYgNTYiPjxwYXRoIGZpbGw9IiMzM0M3M0QiIGQ9Ik0yOCA1MS45MDZjMTMuMDU1IDAgMjMuOTA2LTEwLjg1MSAyMy45MDYtMjMuOTA2YzAtMTMuMDc4LTEwLjg3NS0yMy45MDYtMjMuOTMtMjMuOTA2QzE0Ljg5OSA0LjA5NCA0LjA5NSAxNC45MjIgNC4wOTUgMjhjMCAxMy4wNTUgMTAuODI4IDIzLjkwNiAyMy45MDYgMjMuOTA2bS05LjA3LTExLjExYy0uNTg2IDAtMS4xMDItLjUxNS0xLjEwMi0xLjA3N1YxOS44MmMwLTEuMDA4LjQ5Mi0xLjc1OCAxLjQ1My0yLjE4Yy44NDQtLjM3NCAxLjU3LS41ODUgMy4zNzUtLjU4NWM0LjI0MiAwIDYuODkgMi4wODYgMTAuODc1IDIuMDg2YzEuOTIyIDAgMi45My0uNDkzIDMuNTQtLjQ5M2MuNzk2IDAgMS40MDYuNDkzIDEuNDA2IDEuMTcydjExLjU1NWMwIDEuMDU1LS40NDYgMS43MzQtMS40NTQgMi4xOGMtLjg2Ny4zOTgtMS42MTcuNjA5LTMuMzc1LjYwOWMtNC4wNzggMC02LjY4LTIuMDYyLTEwLjg3NS0yLjA2MmMtMS40MyAwLTIuMzY3LjI4LTIuNzg5LjQ2OHY3LjE0OWMwIC41ODYtLjQ0NSAxLjA3OC0xLjA1NCAxLjA3OCIvPjwvc3ZnPg=='
|
|
||||||
},
|
},
|
||||||
COMPLETED_EARLY: {
|
COMPLETED_EARLY: {
|
||||||
type: '提前完成',
|
type: '提前完成',
|
||||||
color: '#CCFF99',
|
color: '#CCFF99',
|
||||||
textColor: '#42681d',
|
textColor: '#42681d',
|
||||||
base64:
|
base64: `data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgNTYgNTYiPjxwYXRoIGZpbGw9IiNDQ0ZGOTkiIGQ9Ik0yOCA1MS45MDZjMTMuMDU1IDAgMjMuOTA2LTEwLjgyOCAyMy45MDYtMjMuOTA2YzAtMTMuMDU1LTEwLjg3NS0yMy45MDYtMjMuOTMtMjMuOTA2QzE0Ljg5OSA0LjA5NCA0LjA5NSAxNC45NDUgNC4wOTUgMjhjMCAxMy4wNzggMTAuODI4IDIzLjkwNiAyMy45MDYgMjMuOTA2Ii8+PC9zdmc+`,
|
||||||
'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgNTYgNTYiPjxwYXRoIGZpbGw9IiNDQ0ZGOTkiIGQ9Ik0yOCA1MS45MDZjMTMuMDU1IDAgMjMuOTA2LTEwLjgyOCAyMy45MDYtMjMuOTA2YzAtMTMuMDU1LTEwLjg3NS0yMy45MDYtMjMuOTMtMjMuOTA2QzE0Ljg5OSA0LjA5NCA0LjA5NSAxNC45NDUgNC4wOTUgMjhjMCAxMy4wNzggMTAuODI4IDIzLjkwNiAyMy45MDYgMjMuOTA2Ii8+PC9zdmc+',
|
flag64: `data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgNTYgNTYiPjxwYXRoIGZpbGw9IiNDQ0ZGOTkiIGQ9Ik0yOCA1MS45MDZjMTMuMDU1IDAgMjMuOTA2LTEwLjg1MSAyMy45MDYtMjMuOTA2YzAtMTMuMDc4LTEwLjg3NS0yMy45MDYtMjMuOTMtMjMuOTA2QzE0Ljg5OSA0LjA5NCA0LjA5NSAxNC45MjIgNC4wOTUgMjhjMCAxMy4wNTUgMTAuODI4IDIzLjkwNiAyMy45MDYgMjMuOTA2bS05LjA3LTExLjExYy0uNTg2IDAtMS4xMDItLjUxNS0xLjEwMi0xLjA3N1YxOS44MmMwLTEuMDA4LjQ5Mi0xLjc1OCAxLjQ1My0yLjE4Yy44NDQtLjM3NCAxLjU3LS41ODUgMy4zNzUtLjU4NWM0LjI0MiAwIDYuODkgMi4wODYgMTAuODc1IDIuMDg2YzEuOTIyIDAgMi45My0uNDkzIDMuNTQtLjQ5M2MuNzk2IDAgMS40MDYuNDkzIDEuNDA2IDEuMTcydjExLjU1NWMwIDEuMDU1LS40NDYgMS43MzQtMS40NTQgMi4xOGMtLjg2Ny4zOTgtMS42MTcuNjA5LTMuMzc1LjYwOWMtNC4wNzggMC02LjY4LTIuMDYyLTEwLjg3NS0yLjA2MmMtMS40MyAwLTIuMzY3LjI4LTIuNzg5LjQ2OHY3LjE0OWMwIC41ODYtLjQ0NSAxLjA3OC0xLjA1NCAxLjA3OCIvPjwvc3ZnPg==`
|
||||||
flag64:
|
|
||||||
'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgNTYgNTYiPjxwYXRoIGZpbGw9IiNDQ0ZGOTkiIGQ9Ik0yOCA1MS45MDZjMTMuMDU1IDAgMjMuOTA2LTEwLjg1MSAyMy45MDYtMjMuOTA2YzAtMTMuMDc4LTEwLjg3NS0yMy45MDYtMjMuOTMtMjMuOTA2QzE0Ljg5OSA0LjA5NCA0LjA5NSAxNC45MjIgNC4wOTUgMjhjMCAxMy4wNTUgMTAuODI4IDIzLjkwNiAyMy45MDYgMjMuOTA2bS05LjA3LTExLjExYy0uNTg2IDAtMS4xMDItLjUxNS0xLjEwMi0xLjA3N1YxOS44MmMwLTEuMDA4LjQ5Mi0xLjc1OCAxLjQ1My0yLjE4Yy44NDQtLjM3NCAxLjU3LS41ODUgMy4zNzUtLjU4NWM0LjI0MiAwIDYuODkgMi4wODYgMTAuODc1IDIuMDg2YzEuOTIyIDAgMi45My0uNDkzIDMuNTQtLjQ5M2MuNzk2IDAgMS40MDYuNDkzIDEuNDA2IDEuMTcydjExLjU1NWMwIDEuMDU1LS40NDYgMS43MzQtMS40NTQgMi4xOGMtLjg2Ny4zOTgtMS42MTcuNjA5LTMuMzc1LjYwOWMtNC4wNzggMC02LjY4LTIuMDYyLTEwLjg3NS0yLjA2MmMtMS40MyAwLTIuMzY3LjI4LTIuNzg5LjQ2OHY3LjE0OWMwIC41ODYtLjQ0NSAxLjA3OC0xLjA1NCAxLjA3OCIvPjwvc3ZnPg=='
|
|
||||||
},
|
},
|
||||||
COMPLETED_LATE: {
|
COMPLETED_LATE: {
|
||||||
type: '延期完成',
|
type: '延期完成',
|
||||||
color: '#CC6699',
|
color: '#CC6699',
|
||||||
textColor: '#4b092a',
|
textColor: '#4b092a',
|
||||||
base64:
|
base64: `data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgNTYgNTYiPjxwYXRoIGZpbGw9IiNDQzY2OTkiIGQ9Ik0yOCA1MS45MDZjMTMuMDU1IDAgMjMuOTA2LTEwLjgyOCAyMy45MDYtMjMuOTA2YzAtMTMuMDU1LTEwLjg3NS0yMy45MDYtMjMuOTMtMjMuOTA2QzE0Ljg5OSA0LjA5NCA0LjA5NSAxNC45NDUgNC4wOTUgMjhjMCAxMy4wNzggMTAuODI4IDIzLjkwNiAyMy45MDYgMjMuOTA2Ii8+PC9zdmc+`,
|
||||||
'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgNTYgNTYiPjxwYXRoIGZpbGw9IiNDQzY2OTkiIGQ9Ik0yOCA1MS45MDZjMTMuMDU1IDAgMjMuOTA2LTEwLjgyOCAyMy45MDYtMjMuOTA2YzAtMTMuMDU1LTEwLjg3NS0yMy45MDYtMjMuOTMtMjMuOTA2QzE0Ljg5OSA0LjA5NCA0LjA5NSAxNC45NDUgNC4wOTUgMjhjMCAxMy4wNzggMTAuODI4IDIzLjkwNiAyMy45MDYgMjMuOTA2Ii8+PC9zdmc+',
|
flag64: `data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgNTYgNTYiPjxwYXRoIGZpbGw9IiNDQzY2OTkiIGQ9Ik0yOCA1MS45MDZjMTMuMDU1IDAgMjMuOTA2LTEwLjg1MSAyMy45MDYtMjMuOTA2YzAtMTMuMDc4LTEwLjg3NS0yMy45MDYtMjMuOTMtMjMuOTA2QzE0Ljg5OSA0LjA5NCA0LjA5NSAxNC45MjIgNC4wOTUgMjhjMCAxMy4wNTUgMTAuODI4IDIzLjkwNiAyMy45MDYgMjMuOTA2bS05LjA3LTExLjExYy0uNTg2IDAtMS4xMDItLjUxNS0xLjEwMi0xLjA3N1YxOS44MmMwLTEuMDA4LjQ5Mi0xLjc1OCAxLjQ1My0yLjE4Yy44NDQtLjM3NCAxLjU3LS41ODUgMy4zNzUtLjU4NWM0LjI0MiAwIDYuODkgMi4wODYgMTAuODc1IDIuMDg2YzEuOTIyIDAgMi45My0uNDkzIDMuNTQtLjQ5M2MuNzk2IDAgMS40MDYuNDkzIDEuNDA2IDEuMTcydjExLjU1NWMwIDEuMDU1LS40NDYgMS43MzQtMS40NTQgMi4xOGMtLjg2Ny4zOTgtMS42MTcuNjA5LTMuMzc1LjYwOWMtNC4wNzggMC02LjY4LTIuMDYyLTEwLjg3NS0yLjA2MmMtMS40MyAwLTIuMzY3LjI4LTIuNzg5LjQ2OHY3LjE0OWMwIC41ODYtLjQ0NSAxLjA3OC0xLjA1NCAxLjA3OCIvPjwvc3ZnPg==`
|
||||||
flag64:
|
|
||||||
'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgNTYgNTYiPjxwYXRoIGZpbGw9IiNDQzY2OTkiIGQ9Ik0yOCA1MS45MDZjMTMuMDU1IDAgMjMuOTA2LTEwLjg1MSAyMy45MDYtMjMuOTA2YzAtMTMuMDc4LTEwLjg3NS0yMy45MDYtMjMuOTMtMjMuOTA2QzE0Ljg5OSA0LjA5NCA0LjA5NSAxNC45MjIgNC4wOTUgMjhjMCAxMy4wNTUgMTAuODI4IDIzLjkwNiAyMy45MDYgMjMuOTA2bS05LjA3LTExLjExYy0uNTg2IDAtMS4xMDItLjUxNS0xLjEwMi0xLjA3N1YxOS44MmMwLTEuMDA4LjQ5Mi0xLjc1OCAxLjQ1My0yLjE4Yy44NDQtLjM3NCAxLjU3LS41ODUgMy4zNzUtLjU4NWM0LjI0MiAwIDYuODkgMi4wODYgMTAuODc1IDIuMDg2YzEuOTIyIDAgMi45My0uNDkzIDMuNTQtLjQ5M2MuNzk2IDAgMS40MDYuNDkzIDEuNDA2IDEuMTcydjExLjU1NWMwIDEuMDU1LS40NDYgMS43MzQtMS40NTQgMi4xOGMtLjg2Ny4zOTgtMS42MTcuNjA5LTMuMzc1LjYwOWMtNC4wNzggMC02LjY4LTIuMDYyLTEwLjg3NS0yLjA2MmMtMS40MyAwLTIuMzY3LjI4LTIuNzg5LjQ2OHY3LjE0OWMwIC41ODYtLjQ0NSAxLjA3OC0xLjA1NCAxLjA3OCIvPjwvc3ZnPg=='
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
export function getNodeIcon(node: any) {
|
export function getNodeIcon(node: CustomNodeData) {
|
||||||
|
if (!node.status) return '';
|
||||||
|
|
||||||
const type = node.milestone ? 'flag64' : 'base64';
|
const type = node.milestone ? 'flag64' : 'base64';
|
||||||
if (node.status) {
|
|
||||||
return nodeStatus[node.status as keyof typeof nodeStatus][type];
|
return nodeStatus[node.status][type];
|
||||||
}
|
|
||||||
return '';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getNodeStatusTag(state: keyof typeof nodeStatus, tagProperty?: TagProps) {
|
export function getNodeStatusTag(state: NodeStatus, tagProperty?: TagProps) {
|
||||||
|
const { textColor, color, type } = nodeStatus[state] || {};
|
||||||
|
|
||||||
return h(
|
return h(
|
||||||
NTag,
|
NTag,
|
||||||
{
|
{
|
||||||
color: { textColor: nodeStatus[state]?.textColor, color: nodeStatus[state]?.color },
|
color: { textColor, color },
|
||||||
bordered: false,
|
bordered: false,
|
||||||
size: 'small',
|
size: 'small',
|
||||||
...tagProperty
|
...tagProperty
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
default: () => nodeStatus[state]?.type
|
default: () => type
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
28
src/views/plugin/charts/antv/modules/types.ts
Normal file
28
src/views/plugin/charts/antv/modules/types.ts
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
import type { EdgeData, GraphData, NodeData } from '@antv/g6';
|
||||||
|
|
||||||
|
export type NodeStatus =
|
||||||
|
| 'MILESTONE'
|
||||||
|
| 'NOT_STARTED'
|
||||||
|
| 'DELAYED'
|
||||||
|
| 'PAUSED'
|
||||||
|
| 'IN_PROGRESS'
|
||||||
|
| 'COMPLETED'
|
||||||
|
| 'COMPLETED_EARLY'
|
||||||
|
| 'COMPLETED_LATE';
|
||||||
|
|
||||||
|
export interface CustomNodeData extends NodeData {
|
||||||
|
isDelayed?: boolean;
|
||||||
|
isDeleted?: boolean;
|
||||||
|
milestone?: boolean;
|
||||||
|
status?: NodeStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CustomEdgeData extends EdgeData {
|
||||||
|
isDelayed?: boolean;
|
||||||
|
isDeleted?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CustomGraphData extends GraphData {
|
||||||
|
nodes: CustomNodeData[];
|
||||||
|
edges: CustomEdgeData[];
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user