setter.vue 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. <template>
  2. <div class="w-full p-4 pt-0 box-border flex flex-col gap-2">
  3. <div
  4. v-for="(caseItem, index) in cases"
  5. :key="caseItem.id"
  6. class="border border-b-0.5px border-b-solid border-gray-200 relative"
  7. :style="{ paddingLeft: cases[index]!.conditions?.length < 2 ? '60px' : '0' }"
  8. >
  9. <div class="absolute text-16px font-bold top-0 left-0">{{ index === 0 ? 'IF' : 'ELIF' }}</div>
  10. <Condition
  11. :conditions="cases[index]!.conditions"
  12. :operator="cases[index]!.logical_operator"
  13. @update:conditions="onUpdateConditions(index, $event)"
  14. @update:operator="onUpdateOperator(index, $event)"
  15. />
  16. <div class="absolute right-0 bottom-8px">
  17. <el-button link @click="removeCase(index)">
  18. <Icon icon="lucide:trash-2" />
  19. <span>删除</span>
  20. </el-button>
  21. </div>
  22. </div>
  23. <el-button class="w-full" @click="addCase">+ ELIF</el-button>
  24. <div class="border border-0.5px border-y-solid border-gray-200 py-2">
  25. <div class="text-16px font-bold">ELSE</div>
  26. <div class="text-12px text-gray-500 pl-12px">用于定义当所有条件都不满足时的处理逻辑</div>
  27. </div>
  28. </div>
  29. </template>
  30. <script setup lang="ts">
  31. import { computed } from 'vue'
  32. import Condition from '../../_base/condition/index.vue'
  33. import { Icon } from '@repo/ui'
  34. import type { ConditionData } from './index'
  35. import type { ConditionType } from '../../Interface'
  36. interface Emits {
  37. (e: 'update', value: ConditionData): void
  38. }
  39. const props = defineProps<{
  40. data: ConditionData
  41. }>()
  42. const emit = defineEmits<Emits>()
  43. const cases = computed<ConditionData['cases']>(() => props.data.cases)
  44. const addCase = () => {
  45. emit('update', {
  46. ...props.data,
  47. cases: [
  48. ...cases.value,
  49. {
  50. id: '',
  51. conditions: [],
  52. logical_operator: 'and'
  53. }
  54. ]
  55. })
  56. }
  57. const removeCase = (index: number) => {
  58. emit('update', {
  59. ...props.data,
  60. cases: cases.value.filter((_, i) => i !== index)
  61. })
  62. }
  63. const onUpdateConditions = (index: number, conditions: ConditionType[]) => {
  64. emit('update', {
  65. ...props.data,
  66. cases: cases.value.map((caseItem, i) => (i === index ? { ...caseItem, conditions } : caseItem))
  67. })
  68. }
  69. const onUpdateOperator = (index: number, operator: 'and' | 'or') => {
  70. emit('update', {
  71. ...props.data,
  72. cases: cases.value.map((caseItem, i) =>
  73. i === index ? { ...caseItem, logical_operator: operator } : caseItem
  74. )
  75. })
  76. }
  77. </script>