setter.vue 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. <script lang="ts" setup>
  2. import Condition from '@/nodes/_base/condition/index.vue'
  3. import LoopVar from './components/LoopVar.vue'
  4. import { IconButton } from '@repo/ui'
  5. import { useSetterModel } from '../_shared/useSetterModel'
  6. import type { LoopData } from './index'
  7. import type { ConditionType } from '@/nodes/Interface'
  8. const props = defineProps<{
  9. data: LoopData
  10. }>()
  11. const emit = defineEmits<{
  12. update: [data: LoopData]
  13. }>()
  14. const formData = useSetterModel<LoopData>(props, emit)
  15. const handleAddLoopVar = () => {
  16. formData.value.variables.push({
  17. name: '',
  18. describe: '',
  19. type: 'string',
  20. value: ''
  21. })
  22. }
  23. const handleRemoveLoopVar = (index: number) => {
  24. formData.value.variables.splice(index, 1)
  25. }
  26. const onUpdateConditions = (conditions: ConditionType[]) => {
  27. formData.value.break_conditions = conditions
  28. }
  29. const onUpdateOperator = (operator: 'and' | 'or') => {
  30. formData.value.logical_operator = operator
  31. }
  32. </script>
  33. <template>
  34. <el-scrollbar class="w-full box-border p-12px">
  35. <el-form label-width="50px">
  36. <el-form-item label="" label-position="top">
  37. <div class="w-full flex items-center justify-between beautify">
  38. <label class="text-14px font-bold text-gray-700">循环变量</label>
  39. <IconButton icon="lucide:plus" link @click="handleAddLoopVar" />
  40. </div>
  41. <div
  42. v-for="(variable, index) in formData.variables"
  43. :key="variable.name"
  44. class="w-full mt-12px"
  45. >
  46. <div class="w-full flex items-start gap-12px">
  47. <LoopVar class="flex-1" :variable="variable" />
  48. <IconButton icon="lucide:trash-2" link @click="handleRemoveLoopVar(index)" />
  49. </div>
  50. </div>
  51. </el-form-item>
  52. <el-form-item label="" label-position="top">
  53. <div class="w-full flex items-center justify-between beautify">
  54. <label class="text-14px font-bold text-gray-700">过滤条件</label>
  55. </div>
  56. <Condition
  57. :conditions="formData.break_conditions"
  58. :operator="formData.logical_operator"
  59. @update:conditions="onUpdateConditions"
  60. @update:operator="onUpdateOperator"
  61. />
  62. </el-form-item>
  63. <el-form-item label="" label-position="top">
  64. <div class="w-full flex items-center justify-between beautify">
  65. <label class="text-14px font-bold text-gray-700">最大循环次数</label>
  66. </div>
  67. <div class="w-full flex gap-12px">
  68. <el-input-number v-model="formData.loop_count" :min="1" :max="100" />
  69. <div class="flex-2/3">
  70. <el-slider v-model="formData.loop_count" :min="1" :max="100" />
  71. </div>
  72. </div>
  73. </el-form-item>
  74. </el-form>
  75. </el-scrollbar>
  76. </template>