ClassificationQueryPanel.vue 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315
  1. <template>
  2. <div class="data-filter-wrap">
  3. <el-button
  4. type="primary"
  5. class="inline-large-button mb10"
  6. icon="el-icon-plus"
  7. size="mini"
  8. @click="addCondition">
  9. 添加
  10. </el-button>
  11. <el-table :data="tableData" style="width: 100%">
  12. <el-table-column align="center" label="序号" type="index" width="50"/>
  13. <el-table-column align="center" prop="conditionName" label="条件名称">
  14. <template slot-scope="scope">
  15. <el-input
  16. v-model="scope.row.conditionName"
  17. size="normal"
  18. clearable
  19. ></el-input>
  20. </template>
  21. </el-table-column>
  22. <el-table-column
  23. align="center"
  24. prop="conditionField"
  25. label="条件字段">
  26. <template slot-scope="scope">
  27. <el-select v-model="scope.row.conditionField" placeholder="请选择条件字段" filterable>
  28. <el-option
  29. v-for="item in fieldList"
  30. :key="item.fieldName"
  31. :label="item.fieldDescription"
  32. :value="item.tableName + '.' + item.fieldName">
  33. <span class="discribe" style="float: left">{{
  34. item.fieldDescription
  35. }}</span>
  36. <span style="float: right; color: #8492a6; font-size: 13px">{{
  37. item.fieldName
  38. }}</span>
  39. </el-option>
  40. </el-select>
  41. </template>
  42. </el-table-column>
  43. <el-table-column align="center" prop="conditionType" label="条件类型">
  44. <template slot-scope="scope">
  45. <el-select v-model="scope.row.conditionType" filterable>
  46. <el-option v-for="item in conditionTypeOptions" :key="item.value" :label="item.label" :value="item.value">
  47. </el-option>
  48. </el-select>
  49. </template>
  50. </el-table-column>
  51. <el-table-column align="center" prop="conditionDefaultValue" label="默认条件值">
  52. <template slot-scope="scope">
  53. <el-input v-model="scope.row.conditionDefaultValue"
  54. :disabled="scope.row.conditionType!='button' && scope.row.conditionType!='radio'"></el-input>
  55. </template>
  56. </el-table-column>
  57. <el-table-column align="center" prop="sort" label="渲染顺序" width="80">
  58. <template slot-scope="scope">
  59. <el-input v-model="scope.row.sort"></el-input>
  60. </template>
  61. </el-table-column>
  62. <el-table-column label="操作">
  63. <template slot-scope="scope">
  64. <el-button
  65. size="mini"
  66. type="text"
  67. @click="openHandler(scope)"
  68. >更多
  69. </el-button>
  70. <el-button
  71. size="mini"
  72. type="text"
  73. @click="delHandler(scope.$index)"
  74. >删除
  75. </el-button>
  76. </template>
  77. </el-table-column>
  78. </el-table>
  79. <!-- 查询条件更多设置弹窗 -->
  80. <el-dialog :title="settings.title" :visible.sync="settings.open" width="500px" append-to-body>
  81. <!-- 下拉框数据来源(字典、表数据)设置label、value -->
  82. <!-- 时间范围(选择到年、月、日 时、分、秒) -->
  83. <el-form label-width="100px" v-if="tableData.length!=0">
  84. <el-form-item label="显示类型">
  85. <el-select v-model="tableData[settings.dataIndex].componentType" clearable filterable>
  86. <el-option v-for="item in componentTypeOptions" :key="item.value" :label="item.label"
  87. :value="item.value"/>
  88. </el-select>
  89. </el-form-item>
  90. <el-form-item label="显示尺寸">
  91. <el-select v-model="tableData[settings.dataIndex].componentSize" clearable filterable>
  92. <el-option v-for="item in componentSizeOptions" :key="item.value" :label="item.label" :value="item.value"/>
  93. </el-select>
  94. </el-form-item>
  95. <el-form-item label="显示图标">
  96. <el-popover placement="bottom-start" width="460" trigger="click" @show="$refs['iconSelect'].reset()">
  97. <IconSelect ref="iconSelect" @selected="(name) => selected(name, settings.row)"
  98. :active-icon="tableData[settings.dataIndex].componentIcon"/>
  99. <el-input slot="reference" v-model="tableData[settings.dataIndex].componentIcon"
  100. placeholder="点击选择图标" readonly>
  101. <svg-icon v-if="tableData[settings.dataIndex].componentIcon" slot="prefix"
  102. :icon-class="tableData[settings.dataIndex].componentIcon"
  103. style="width: 25px"/>
  104. <i v-else slot="prefix" class="el-icon-search el-input__icon"/>
  105. </el-input>
  106. </el-popover>
  107. </el-form-item>
  108. <el-form-item label="条件描述">
  109. <el-input v-model="tableData[settings.dataIndex].conditionNotes" type="text"
  110. placeholder="描述例句(请输入姓名、请输入编号...)"/>
  111. </el-form-item>
  112. <el-form-item label="下拉sql" v-show="tableData[settings.dataIndex].conditionType=='select'">
  113. <el-input v-model="tableData[settings.dataIndex].conditionDatasource" type="textarea" :rows="8"
  114. placeholder="请输入当前下拉框数据来源sql语句,例如:SELECT custom_name AS `label`, custom_no AS `value`, id AS id FROM {DBNAME}.customer"/>
  115. </el-form-item>
  116. </el-form>
  117. </el-dialog>
  118. </div>
  119. </template>
  120. <script>
  121. import IconSelect from "@/components/IconSelect";
  122. // mysql 语法校验插件
  123. // import 'codemirror/theme/ambiance.css'
  124. // import 'codemirror/lib/codemirror.css'
  125. // import 'codemirror/addon/hint/show-hint.css'
  126. export default {
  127. name: "ClassificationQueryPanel",
  128. props: ["tableFieldList", "classificationDataEcho"],
  129. components: {IconSelect},
  130. data() {
  131. return {
  132. settings: {
  133. row: {},
  134. title: "",
  135. open: false,
  136. dataIndex: 0,
  137. },
  138. tableData: [],
  139. fieldList: [],
  140. conditionList: [
  141. {
  142. value: 1,
  143. label: ">",
  144. },
  145. {
  146. value: 2,
  147. label: "<",
  148. },
  149. {
  150. value: 3,
  151. label: "=",
  152. },
  153. {
  154. value: 4,
  155. label: ">=",
  156. },
  157. {
  158. value: 5,
  159. label: "<=",
  160. },
  161. ],
  162. conditionTypeOptions: [
  163. {
  164. label: "文本",
  165. value: "input",
  166. },
  167. {
  168. label: "按钮",
  169. value: "button",
  170. },
  171. {
  172. label: "下拉",
  173. value: "select",
  174. },
  175. {
  176. label: "单选",
  177. value: "radio",
  178. },
  179. {
  180. label: "时间范围",
  181. value: "datetimerange",
  182. },
  183. ],
  184. componentTypeOptions: [
  185. {
  186. label: "主要",
  187. value: "primary",
  188. },
  189. {
  190. label: "成功",
  191. value: "success",
  192. },
  193. {
  194. label: "警告",
  195. value: "warning",
  196. },
  197. {
  198. label: "危险",
  199. value: "danger",
  200. },
  201. {
  202. label: "信息",
  203. value: "info",
  204. },
  205. {
  206. label: "文本",
  207. value: "text",
  208. },
  209. ],
  210. componentSizeOptions: [
  211. {value: "small", label: "较小"},
  212. {value: "default", label: "默认"},
  213. {value: "large", label: "较大"},
  214. ],
  215. };
  216. },
  217. watch: {
  218. myTableFieldList: {
  219. handler(nval) {
  220. this.fieldList = nval;
  221. },
  222. deep: true,
  223. immediate: true,
  224. },
  225. myFilterDataEcho: {
  226. handler(val) {
  227. if (val) {
  228. this.tableData = val;
  229. }
  230. },
  231. deep: true,
  232. immediate: true,
  233. },
  234. },
  235. computed: {
  236. myTableFieldList() {
  237. return this.tableFieldList;
  238. },
  239. myFilterDataEcho() {
  240. return this.classificationDataEcho;
  241. },
  242. },
  243. methods: {
  244. // 联合查询按钮配置
  245. openHandler(scope) {
  246. // console.log(scope.$index)
  247. // 设置当前选择查询条件的sql语句
  248. this.settings.dataIndex = scope.$index;
  249. this.settings.row = scope.row;
  250. this.settings.open = true
  251. this.settings.title = "设置条件-" + scope.row.conditionName
  252. },
  253. // 处理联合查询,默认值输入框禁用逻辑
  254. handleDisabled(row) {
  255. // 如果是文本类型则禁用默认值输入框
  256. if (row.componentType == 'input') {
  257. return 'disabled';
  258. }
  259. return false;
  260. },
  261. // 选择图标
  262. selected(name, row) {
  263. row.componentIcon = name;
  264. },
  265. // 新增条件回调
  266. addCondition() {
  267. this.tableData.push({
  268. conditionName: "", // 名称
  269. conditionNotes: "", // 描述信息
  270. conditionField: "", //条件字段
  271. // condition: "",
  272. conditionType: "input", //类型
  273. conditionDefaultValue: "", //按钮值
  274. sort: this.tableData.length + 1, //排序
  275. componentType: "primary", //显示类型
  276. componentSize: "default", //尺寸
  277. componentIcon: "", //图标
  278. });
  279. },
  280. // 编辑条件回调
  281. editHandler() {
  282. },
  283. // 删除条件回调
  284. delHandler(index) {
  285. this.tableData.splice(index, 1);
  286. },
  287. // 获取数据筛选条件
  288. getConditions() {
  289. return this.tableData;
  290. },
  291. // 获取回显数据
  292. getEchoData() {
  293. return JSON.stringify(this.tableData);
  294. },
  295. },
  296. mounted() {
  297. },
  298. };
  299. </script>
  300. <style scoped lang="scss">
  301. .discribe {
  302. display: block;
  303. max-width: 200px;
  304. white-space: nowrap;
  305. overflow: hidden;
  306. text-overflow: ellipsis;
  307. }
  308. </style>