FlowChartToolbar.vue 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. <template>
  2. <div :class="`${prefixCls}-toolbar`" class="flex items-center px-2 py-1">
  3. <template v-for="item in toolbarItemList" :key="item.type">
  4. <Tooltip placement="bottom" v-bind="item.disabled ? { visible: false } : {}">
  5. <template #title>{{ item.tooltip }}</template>
  6. <span :class="`${prefixCls}-toolbar__icon`" v-if="item.icon" @click="onControl(item)">
  7. <Icon
  8. :icon="item.icon"
  9. :class="item.disabled ? 'cursor-not-allowed disabeld' : 'cursor-pointer'"
  10. />
  11. </span>
  12. </Tooltip>
  13. <Divider v-if="item.separate" type="vertical" />
  14. </template>
  15. </div>
  16. </template>
  17. <script lang="ts">
  18. import type { ToolbarConfig } from './types';
  19. import { defineComponent, ref, onUnmounted, unref, nextTick, watchEffect } from 'vue';
  20. import { Divider, Tooltip } from 'ant-design-vue';
  21. import { Icon } from '/@/components/Icon';
  22. import { useFlowChartContext } from './useFlowContext';
  23. import { ToolbarTypeEnum } from './enum';
  24. export default defineComponent({
  25. name: 'FlowChartToolbar',
  26. components: { Icon, Divider, Tooltip },
  27. props: {
  28. prefixCls: String,
  29. },
  30. emits: ['view-data'],
  31. setup(_, { emit }) {
  32. const toolbarItemList = ref<ToolbarConfig[]>([
  33. {
  34. type: ToolbarTypeEnum.ZOOM_IN,
  35. icon: 'codicon:zoom-out',
  36. tooltip: '缩小',
  37. },
  38. {
  39. type: ToolbarTypeEnum.ZOOM_OUT,
  40. icon: 'codicon:zoom-in',
  41. tooltip: '放大',
  42. },
  43. {
  44. type: ToolbarTypeEnum.RESET_ZOOM,
  45. icon: 'codicon:screen-normal',
  46. tooltip: '重置比例',
  47. },
  48. { separate: true },
  49. {
  50. type: ToolbarTypeEnum.UNDO,
  51. icon: 'ion:arrow-undo-outline',
  52. tooltip: '后退',
  53. disabled: true,
  54. },
  55. {
  56. type: ToolbarTypeEnum.REDO,
  57. icon: 'ion:arrow-redo-outline',
  58. tooltip: '前进',
  59. disabled: true,
  60. },
  61. { separate: true },
  62. {
  63. type: ToolbarTypeEnum.SNAPSHOT,
  64. icon: 'ion:download-outline',
  65. tooltip: '下载',
  66. },
  67. {
  68. type: ToolbarTypeEnum.VIEW_DATA,
  69. icon: 'carbon:document-view',
  70. tooltip: '查看数据',
  71. },
  72. ]);
  73. const { logicFlow } = useFlowChartContext();
  74. function onHistoryChange({ data: { undoAble, redoAble } }) {
  75. const itemsList = unref(toolbarItemList);
  76. const undoIndex = itemsList.findIndex((item) => item.type === ToolbarTypeEnum.UNDO);
  77. const redoIndex = itemsList.findIndex((item) => item.type === ToolbarTypeEnum.REDO);
  78. if (undoIndex !== -1) {
  79. unref(toolbarItemList)[undoIndex].disabled = !undoAble;
  80. }
  81. if (redoIndex !== -1) {
  82. unref(toolbarItemList)[redoIndex].disabled = !redoAble;
  83. }
  84. }
  85. const onControl = (item) => {
  86. const lf = unref(logicFlow);
  87. if (!lf) {
  88. return;
  89. }
  90. switch (item.type) {
  91. case ToolbarTypeEnum.ZOOM_IN:
  92. lf.zoom();
  93. break;
  94. case ToolbarTypeEnum.ZOOM_OUT:
  95. lf.zoom(true);
  96. break;
  97. case ToolbarTypeEnum.RESET_ZOOM:
  98. lf.resetZoom();
  99. break;
  100. case ToolbarTypeEnum.UNDO:
  101. lf.undo();
  102. break;
  103. case ToolbarTypeEnum.REDO:
  104. lf.redo();
  105. break;
  106. case ToolbarTypeEnum.SNAPSHOT:
  107. lf.getSnapshot();
  108. break;
  109. case ToolbarTypeEnum.VIEW_DATA:
  110. emit('view-data');
  111. break;
  112. }
  113. };
  114. watchEffect(async () => {
  115. if (unref(logicFlow)) {
  116. await nextTick();
  117. unref(logicFlow)?.on('history:change', onHistoryChange);
  118. }
  119. });
  120. onUnmounted(() => {
  121. unref(logicFlow)?.off('history:change', onHistoryChange);
  122. });
  123. return { toolbarItemList, onControl };
  124. },
  125. });
  126. </script>
  127. <style lang="less">
  128. @prefix-cls: ~'@{namespace}-flow-chart-toolbar';
  129. html[data-theme='dark'] {
  130. .lf-dnd {
  131. background: #080808;
  132. }
  133. }
  134. .@{prefix-cls} {
  135. height: 36px;
  136. background-color: @app-content-background;
  137. border-bottom: 1px solid @border-color-base;
  138. .disabeld {
  139. color: @disabled-color;
  140. }
  141. &__icon {
  142. display: inline-block;
  143. padding: 2px 4px;
  144. margin-right: 10px;
  145. &:hover {
  146. color: @primary-color;
  147. }
  148. }
  149. }
  150. </style>