RelationSetting.vue 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. <!--
  2. * @description: 设置联动的弹窗
  3. * @Date: 2023-01-04 14:57:06
  4. * @Author: xing.heng
  5. * @LastEditors: wujian
  6. * @LastEditTime: 2023-05-23 15:46:03
  7. -->
  8. <template>
  9. <el-dialog
  10. title="组件联动设置"
  11. :visible.sync="settingVisible"
  12. :close-on-click-modal="false"
  13. :before-close="handleClose"
  14. width="800px"
  15. append-to-body
  16. class="bs-dialog-wrap bs-el-dialog"
  17. >
  18. <el-form
  19. ref="form"
  20. label-width="100px"
  21. class="bs-el-form"
  22. >
  23. <el-table
  24. :data="configMapConfig.maps"
  25. class="bs-table bs-el-table"
  26. >
  27. <el-empty />
  28. <el-table-column
  29. label="当前组件映射参数"
  30. align="center"
  31. >
  32. <template #default="scope">
  33. <el-select
  34. v-model="configMapConfig.maps[scope.$index].sourceField"
  35. popper-class="bs-el-select"
  36. class="bs-el-select"
  37. >
  38. <el-option
  39. v-for="sourceField in sourceFieldList"
  40. :key="sourceField.value"
  41. :label="sourceField.label"
  42. :value="sourceField.value"
  43. />
  44. </el-select>
  45. </template>
  46. </el-table-column>
  47. <el-table-column
  48. label="操作符"
  49. align="center"
  50. >
  51. <template #default="scope">
  52. <el-select
  53. v-model="configMapConfig.maps[scope.$index].queryRule"
  54. popper-class="bs-el-select"
  55. class="bs-el-select"
  56. >
  57. <el-option
  58. v-for="operator in operatorList"
  59. :key="operator.value"
  60. :label="operator.label"
  61. :value="operator.value"
  62. />
  63. </el-select>
  64. </template>
  65. </el-table-column>
  66. <el-table-column
  67. label="目标组件接收参数"
  68. align="center"
  69. >
  70. <template #default="scope">
  71. <el-select
  72. v-model="configMapConfig.maps[scope.$index].targetField"
  73. popper-class="bs-el-select"
  74. class="bs-el-select"
  75. >
  76. <el-option
  77. v-for="targetField in targetFieldList"
  78. :key="targetField.value"
  79. :label="targetField.label"
  80. :value="targetField.value"
  81. :disabled="choosedTargetFields.includes(targetField.value)"
  82. />
  83. </el-select>
  84. </template>
  85. </el-table-column>
  86. <el-table-column
  87. label="操作"
  88. align="center"
  89. width="100px"
  90. >
  91. <template slot-scope="scope">
  92. <el-button
  93. type="text"
  94. size="small"
  95. @click="handleDelete(scope.$index)"
  96. >
  97. 删除
  98. </el-button>
  99. </template>
  100. </el-table-column>
  101. </el-table>
  102. </el-form>
  103. <el-button
  104. v-block
  105. type="primary"
  106. @click="addRelatedField"
  107. >
  108. 新增联动字段
  109. </el-button>
  110. <div
  111. slot="footer"
  112. class="dialog-footer"
  113. >
  114. <el-button
  115. class="bs-el-button-default"
  116. @click="handleClose"
  117. >
  118. 取消
  119. </el-button>
  120. <el-button
  121. type="primary"
  122. @click="updateConfig"
  123. >
  124. 确定
  125. </el-button>
  126. </div>
  127. </el-dialog>
  128. </template>
  129. <script>
  130. import { operatorList } from 'packages/js/dict/chartDict'
  131. export default {
  132. name: 'RalationSetting',
  133. components: {
  134. },
  135. directives: {
  136. block: {
  137. bind (el, binding) {
  138. el.style.width = binding.value || '100%'
  139. el.style.margin = '10px auto'
  140. }
  141. }
  142. },
  143. props: {
  144. settingVisible: {
  145. type: Boolean,
  146. default: false
  147. },
  148. configMap: {
  149. type: Object,
  150. default: () => ({})
  151. },
  152. sourceFieldList: {
  153. type: Array,
  154. default: () => []
  155. },
  156. targetFieldList: {
  157. type: Array,
  158. default: () => []
  159. }
  160. },
  161. data () {
  162. return {
  163. operatorList
  164. }
  165. },
  166. computed: {
  167. configMapConfig: {
  168. get () {
  169. return this.configMap || {
  170. componentKey: '',
  171. maps: []
  172. }
  173. },
  174. set () { }
  175. },
  176. choosedTargetFields () {
  177. return this.configMapConfig.maps.map(item => item.targetField)
  178. }
  179. },
  180. mounted () { },
  181. methods: {
  182. /**
  183. * @description: 关闭弹窗
  184. */
  185. handleClose () {
  186. this.$emit('update:settingVisible')
  187. },
  188. /**
  189. * @description: 更新配置
  190. */
  191. updateConfig () {
  192. this.$emit('updateConfig', this.configMapConfig)
  193. this.handleClose()
  194. },
  195. /**
  196. * @description: 新增关联字段
  197. */
  198. addRelatedField () {
  199. this.configMapConfig.maps.push({
  200. targetField: '',
  201. sourceField: '',
  202. queryRule: '='
  203. })
  204. },
  205. handleDelete (index) {
  206. this.configMapConfig.maps.splice(index, 1)
  207. }
  208. }
  209. }
  210. </script>
  211. <style lang="scss" scoped>
  212. @import '~packages/assets/style/bsTheme.scss';
  213. </style>