ActionNode.vue 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. <template>
  2. <div class="min-h-32px bg-#4EB2BF rounded-4px flex items-center pr-4px">
  3. <div class="w-160px text-#fff grid place-items-center shrink-0">
  4. {{ node.name }}
  5. </div>
  6. <div>
  7. <!-- 自定义代码 -->
  8. <div v-if="node.name === 'custom_code'" class="w-120px">
  9. <el-select style="width: 120px" v-model="value" size="small">
  10. <el-option
  11. v-for="item in projectStore.project?.methods || []"
  12. :key="item.id"
  13. :label="item.name"
  14. :value="item.id"
  15. />
  16. </el-select>
  17. </div>
  18. <!-- 字符串 -->
  19. <div v-if="node?.config?.data?.valueType === 'string'">
  20. <el-input v-model="value" size="small" />
  21. </div>
  22. <!-- 数字 -->
  23. <div v-if="node?.config?.data?.valueType === 'number'">
  24. <el-input-number
  25. v-model="value"
  26. :min="node.config.data?.min"
  27. :max="node.config.data?.max"
  28. size="small"
  29. />
  30. </div>
  31. <!-- 布尔 -->
  32. <div v-if="node?.config?.data?.valueType === 'boolean'">
  33. <el-switch v-model="value" size="small" />
  34. </div>
  35. <!-- 枚举 -->
  36. <div v-if="node?.config?.data?.valueType === 'select'">
  37. <el-select
  38. style="width: 160px"
  39. v-model="value"
  40. size="small"
  41. placeholder="please select"
  42. :multiple="node.config.data?.multiple"
  43. collapse-tags
  44. collapse-tags-tooltip
  45. >
  46. <el-option
  47. v-for="item in optionMap?.[node.name] || []"
  48. :key="item.value"
  49. :label="item.label"
  50. :value="item.value"
  51. />
  52. </el-select>
  53. </div>
  54. <!-- 颜色 -->
  55. <div v-if="node?.config?.data?.valueType === 'color'">
  56. <el-color-picker v-model="value" size="small" />
  57. </div>
  58. <!-- 动画 -->
  59. <div
  60. v-if="node?.config?.data?.valueType === 'animation'"
  61. class="py-4px flex flex-col gap-4px"
  62. >
  63. <div>
  64. <span class="inline-block w-80px">动画:</span>
  65. <el-select
  66. style="width: 160px"
  67. v-model="value.animation"
  68. size="small"
  69. placeholder="select animation"
  70. >
  71. <el-option
  72. v-for="item in projectStore.project?.animations || []"
  73. :key="item.name"
  74. :label="item.name"
  75. :value="item.name"
  76. />
  77. </el-select>
  78. </div>
  79. <div>
  80. <span class="inline-block w-80px">动画前事件:</span>
  81. <el-select
  82. style="width: 160px"
  83. v-model="value.before"
  84. size="small"
  85. placeholder="before event"
  86. clearable
  87. >
  88. <el-option
  89. v-for="item in projectStore.project?.methods || []"
  90. :key="item.id"
  91. :label="item.name"
  92. :value="item.id"
  93. />
  94. </el-select>
  95. </div>
  96. <div>
  97. <span class="inline-block w-80px">动画后事件:</span>
  98. <el-select
  99. style="width: 160px"
  100. v-model="value.after"
  101. size="small"
  102. placeholder="after event"
  103. clearable
  104. >
  105. <el-option
  106. v-for="item in projectStore.project?.methods || []"
  107. :key="item.id"
  108. :label="item.name"
  109. :value="item.id"
  110. />
  111. </el-select>
  112. </div>
  113. </div>
  114. <!-- 旋转 -->
  115. <div v-if="node?.config?.data?.valueType === 'rotate'" class="py-4px flex flex-col gap-4px">
  116. <div>
  117. <span class="inline-block w-40px">X:</span>
  118. <el-input-number
  119. v-model="value.x"
  120. :min="node.config.data?.min"
  121. :max="node.config.data?.max"
  122. size="small"
  123. />
  124. </div>
  125. <div>
  126. <span class="inline-block w-40px">Y:</span>
  127. <el-input-number
  128. v-model="value.y"
  129. :min="node.config.data?.min"
  130. :max="node.config.data?.max"
  131. size="small"
  132. />
  133. </div>
  134. <div>
  135. <span class="inline-block w-40px">度数:</span>
  136. <el-input-number
  137. v-model="value.angle"
  138. :min="node.config.data?.min"
  139. :max="node.config.data?.max"
  140. size="small"
  141. />
  142. </div>
  143. </div>
  144. </div>
  145. <!-- 删除按钮 -->
  146. <div
  147. v-if="node.name !== 'custom_code'"
  148. class="mx-4px p-2px cursor-pointer"
  149. @click="emit('delete', node.id)"
  150. >
  151. <LuTrash2 size="12px" class="text-accent-red" />
  152. </div>
  153. </div>
  154. </template>
  155. <script setup lang="ts">
  156. import type { NodeItemType } from './type'
  157. import { ref, watch } from 'vue'
  158. import { LuTrash2 } from 'vue-icons-plus/lu'
  159. import { useProjectStore } from '@/store/modules/project'
  160. import { optionMap } from './config'
  161. const emit = defineEmits<{
  162. (e: 'delete', id: string): void
  163. (e: 'update', node: NodeItemType): void
  164. }>()
  165. const props = defineProps<{
  166. node: NodeItemType
  167. }>()
  168. const projectStore = useProjectStore()
  169. const value = ref(props.node.value)
  170. watch(
  171. () => value.value,
  172. (val) => {
  173. emit('update', { ...props.node, value: val })
  174. },
  175. {
  176. deep: true
  177. }
  178. )
  179. </script>
  180. <style scoped></style>