branch.vue 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. <template>
  2. <el-container>
  3. <el-main style="padding: 0 20px 20px 20px">
  4. <div class="top-tips">满足以下条件时进入当前分支</div>
  5. <template v-for="(conditionGroup, conditionGroupIdx) in conditionList">
  6. <div
  7. class="or-branch-link-tip"
  8. v-if="conditionGroupIdx != 0">
  9. 或满足
  10. </div>
  11. <div class="condition-group-editor">
  12. <div class="header">
  13. <span>条件组 {{ conditionGroupIdx + 1 }}</span>
  14. <div @click="deleteConditionGroup(conditionGroupIdx)">
  15. <el-icon class="branch-delete-icon"><ele-Delete /></el-icon>
  16. </div>
  17. </div>
  18. <div class="main-content">
  19. <!-- 单个条件 -->
  20. <div class="condition-content-box cell-box">
  21. <div>描述</div>
  22. <div>条件字段</div>
  23. <div>运算符</div>
  24. <div>值</div>
  25. </div>
  26. <div
  27. class="condition-content"
  28. v-for="(condition, idx) in conditionGroup">
  29. <div class="condition-relation">
  30. <span>{{ idx == 0 ? '当' : '且' }}</span>
  31. <div @click="deleteConditionList(conditionGroup, idx)">
  32. <el-icon class="branch-delete-icon"><ele-Delete /></el-icon>
  33. </div>
  34. </div>
  35. <div class="condition-content">
  36. <div class="condition-content-box">
  37. <el-input
  38. v-model="condition.label"
  39. placeholder="描述" />
  40. <el-input
  41. v-model="condition.field"
  42. placeholder="条件字段" />
  43. <el-select
  44. v-model="condition.operator"
  45. placeholder="请选择">
  46. <el-option
  47. label="等于"
  48. value="=="></el-option>
  49. <el-option
  50. label="不等于"
  51. value="!="></el-option>
  52. <el-option
  53. label="大于"
  54. value=">"></el-option>
  55. <el-option
  56. label="大于等于"
  57. value=">="></el-option>
  58. <el-option
  59. label="小于"
  60. value="<"></el-option>
  61. <el-option
  62. label="小于等于"
  63. value="<="></el-option>
  64. <el-option
  65. label="包含"
  66. value="include"></el-option>
  67. <el-option
  68. label="不包含"
  69. value="notInclude"></el-option>
  70. </el-select>
  71. <el-input
  72. v-model="condition.value"
  73. placeholder="值" />
  74. </div>
  75. </div>
  76. </div>
  77. </div>
  78. <div class="sub-content">
  79. <el-button
  80. link
  81. type="primary"
  82. @click="addConditionList(conditionGroup)">
  83. <el-icon><ele-Plus /></el-icon>
  84. 添加条件
  85. </el-button>
  86. </div>
  87. </div>
  88. </template>
  89. <el-button
  90. style="width: 100%"
  91. type="info"
  92. text
  93. bg
  94. @click="addConditionGroup">
  95. <el-icon><ele-Plus /></el-icon>
  96. 添加条件组
  97. </el-button>
  98. </el-main>
  99. </el-container>
  100. </template>
  101. <script lang="ts" setup>
  102. import {NodeConditionData} from "/@/components/gFlow/propertySetting/model";
  103. import {onMounted, ref, watch} from "vue";
  104. const emit = defineEmits(['setNodeExt'])
  105. const conditionList = ref<Array<NodeConditionData[]>>([])
  106. const initNodeData = (data:Array<NodeConditionData[]>)=>{
  107. conditionList.value = data
  108. }
  109. const addConditionGroup = () => {
  110. addConditionList(conditionList.value[conditionList.value.push([] as never) - 1])
  111. }
  112. const addConditionList = (conditionList:NodeConditionData[]) => {
  113. conditionList.push({
  114. label: '',
  115. field: '',
  116. operator: '',
  117. value: '',
  118. })
  119. }
  120. const deleteConditionGroup = (idx:number) => {
  121. conditionList.value.splice(idx, 1)
  122. }
  123. const deleteConditionList = (conditionList:NodeConditionData[],idx:number) => {
  124. conditionList.splice(idx,1)
  125. }
  126. const setNodeExt = ()=>{
  127. emit('setNodeExt',conditionList.value)
  128. }
  129. defineExpose({initNodeData,setNodeExt})
  130. </script>
  131. <style scoped lang="scss">
  132. .top-tips {
  133. display: flex;
  134. justify-content: space-between;
  135. align-items: center;
  136. margin-bottom: 12px;
  137. color: #646a73;
  138. }
  139. .or-branch-link-tip {
  140. margin: 10px 0;
  141. color: #646a73;
  142. }
  143. .condition-group-editor {
  144. user-select: none;
  145. border-radius: 4px;
  146. border: 1px solid #e4e5e7;
  147. position: relative;
  148. margin-bottom: 16px;
  149. .branch-delete-icon {
  150. font-size: 18px;
  151. }
  152. .header {
  153. background-color: #f4f6f8;
  154. padding: 0 12px;
  155. font-size: 14px;
  156. color: #171e31;
  157. height: 36px;
  158. display: flex;
  159. align-items: center;
  160. span {
  161. flex: 1;
  162. }
  163. }
  164. .main-content {
  165. padding: 0 12px;
  166. .condition-relation {
  167. color: #9ca2a9;
  168. display: flex;
  169. align-items: center;
  170. height: 36px;
  171. display: flex;
  172. justify-content: space-between;
  173. padding: 0 2px;
  174. }
  175. .condition-content-box {
  176. display: flex;
  177. justify-content: space-between;
  178. align-items: center;
  179. div {
  180. width: 100%;
  181. min-width: 120px;
  182. }
  183. div:not(:first-child) {
  184. margin-left: 16px;
  185. }
  186. }
  187. .cell-box {
  188. div {
  189. padding: 16px 0;
  190. width: 100%;
  191. min-width: 120px;
  192. color: #909399;
  193. font-size: 14px;
  194. font-weight: 600;
  195. text-align: center;
  196. }
  197. }
  198. .condition-content {
  199. display: flex;
  200. flex-direction: column;
  201. :deep(.el-input__wrapper) {
  202. border-top-left-radius: 0;
  203. border-bottom-left-radius: 0;
  204. }
  205. .content {
  206. flex: 1;
  207. padding: 0 0 4px 0;
  208. display: flex;
  209. align-items: center;
  210. min-height: 31.6px;
  211. flex-wrap: wrap;
  212. }
  213. }
  214. }
  215. .sub-content {
  216. padding: 12px;
  217. }
  218. }
  219. </style>