index.vue 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. <template>
  2. <transition name="el-fade-in">
  3. <div class="table-com-search">
  4. <el-form @keyup.enter="onComSearch" label-position="top" :model="baTable.comSearch.form">
  5. <el-row>
  6. <template v-for="(item, idx) in baTable.table.column" :key="idx">
  7. <template v-if="item.operator !== false">
  8. <el-col v-if="item.render == 'datetime' && (item.operator == 'RANGE' || item.operator == 'NOT RANGE')"
  9. :span="8">
  10. <div class="com-search-col mt-20 flex justify-flex-start">
  11. <div class="com-search-col-label ">{{ item.label }}:</div>
  12. <div class="com-search-col-input-range">
  13. <el-date-picker
  14. class="datetime-picker"
  15. v-model="baTable.comSearch.form[item.prop!]"
  16. :default-value="baTable.comSearch.form[item.prop! + '-default'] ? baTable.comSearch.form[item.prop! + '-default']:[new Date(), new Date()]"
  17. type="datetimerange"
  18. range-separator="至"
  19. start-placeholder="开始日期"
  20. end-placeholder="结束日期"
  21. value-format="YYYY-MM-DD HH:mm:ss"
  22. />
  23. </div>
  24. </div>
  25. </el-col>
  26. <el-col
  27. v-else-if="item.render == 'dateType' && (item.operator == 'RANGE' || item.operator == 'NOT RANGE')"
  28. :span="8">
  29. <div class="com-search-col mt-20 flex justify-flex-start">
  30. <div class="com-search-col-label ">{{ item.label }}:</div>
  31. <div class="com-search-col-input-range">
  32. <el-date-picker
  33. class="datetime-picker"
  34. v-model="baTable.comSearch.form[item.prop!]"
  35. :default-value="baTable.comSearch.form[item.prop! + '-default'] ? baTable.comSearch.form[item.prop! + '-default']:[new Date(), new Date()]"
  36. type="daterange"
  37. range-separator="至"
  38. start-placeholder="开始日期"
  39. end-placeholder="结束日期"
  40. value-format="YYYY-MM-DD"
  41. />
  42. </div>
  43. </div>
  44. </el-col>
  45. <el-col v-else :span="8">
  46. <div class="com-search-col mt-20 flex justify-flex-start">
  47. <div class="com-search-col-label">{{ item.label }}:</div>
  48. <div v-if="item.operator == 'RANGE' || item.operator == 'NOT RANGE'"
  49. class="com-search-col-input-range">
  50. <el-input
  51. :placeholder="item.operatorPlaceholder"
  52. type="string"
  53. v-model="baTable.comSearch.form[item.prop! + '-start']"
  54. ></el-input>
  55. <div class="range-separator">{{ $t("to") }}</div>
  56. <el-input
  57. :placeholder="item.operatorPlaceholder"
  58. type="string"
  59. v-model="baTable.comSearch.form[item.prop! + '-end']"
  60. ></el-input>
  61. </div>
  62. <div v-else-if="item.operator == 'NULL' || item.operator == 'NOT NULL'" class="com-search-col-input">
  63. <el-checkbox v-model="baTable.comSearch.form[item.prop!]" :label="item.operator"
  64. size="large"></el-checkbox>
  65. </div>
  66. <div v-else-if="item.operator" class="com-search-col-input">
  67. <el-date-picker
  68. class="datetime-picker"
  69. v-if="item.render == 'datetime'"
  70. v-model="baTable.comSearch.form[item.prop!]"
  71. type="datetime"
  72. value-format="YYYY-MM-DD HH:mm:ss"
  73. :placeholder="item.operatorPlaceholder"
  74. :default-value="baTable.comSearch.form[item.prop! + '-default'] ? baTable.comSearch.form[item.prop! + '-default']:new Date()"
  75. ></el-date-picker>
  76. <el-select
  77. :placeholder="item.operatorPlaceholder"
  78. v-else-if="item.render == 'tag'"
  79. v-model="baTable.comSearch.form[item.prop!]"
  80. :clearable="true"
  81. class="w100"
  82. >
  83. <el-option v-for="(opt, okey) in item.replaceValue" :key="item.prop! + okey" :label="opt"
  84. :value="okey" />
  85. </el-select>
  86. <el-input
  87. :placeholder="item.operatorPlaceholder"
  88. v-else
  89. type="string"
  90. v-model="baTable.comSearch.form[item.prop!]"
  91. ></el-input>
  92. </div>
  93. </div>
  94. </el-col>
  95. </template>
  96. </template>
  97. </el-row>
  98. <el-row>
  99. <el-col :span="24">
  100. <div class="com-search-col pl-20 mt-20 mr-20 flex justify-flex-end">
  101. <div class="box">
  102. <el-button v-blur @click="onComSearch" type="primary">搜索</el-button>
  103. <el-button @click="onResetForm()">重置</el-button>
  104. </div>
  105. </div>
  106. </el-col>
  107. </el-row>
  108. </el-form>
  109. </div>
  110. </transition>
  111. </template>
  112. <script setup lang="ts">
  113. import { inject } from "vue";
  114. import useCurrentInstance from "/@/utils/useCurrentInstance";
  115. import type baTableClass from "/@/utils/baTable";
  116. const { proxy } = useCurrentInstance();
  117. const baTable = inject("baTable") as baTableClass;
  118. const onComSearch = () => {
  119. let comSearchData: comSearchData[] = [];
  120. for (const key in baTable.comSearch.form) {
  121. if (!baTable.comSearch.fieldData.has(key)) {
  122. continue;
  123. }
  124. let val = "";
  125. let fieldDataTemp = baTable.comSearch.fieldData.get(key);
  126. if ((fieldDataTemp.render == "datetime" || fieldDataTemp.render == "dateType") && (fieldDataTemp.operator == "RANGE" || fieldDataTemp.operator == "NOT RANGE")) {
  127. // 时间范围组件返回的是时间数组
  128. if (baTable.comSearch.form[key] && baTable.comSearch.form[key].length >= 2) {
  129. // 数组转字符串,以实现通过url参数传递预设搜索值
  130. val = baTable.comSearch.form[key][0] + "," + baTable.comSearch.form[key][1];
  131. }
  132. } else if (fieldDataTemp.operator == "RANGE" || fieldDataTemp.operator == "NOT RANGE") {
  133. // 普通的范围筛选,baTable在初始化时已准备好start和end字段
  134. if (!baTable.comSearch.form[key + "-start"] && !baTable.comSearch.form[key + "-end"]) {
  135. continue;
  136. }
  137. val = baTable.comSearch.form[key + "-start"] + "," + baTable.comSearch.form[key + "-end"];
  138. } else if (baTable.comSearch.form[key]) {
  139. val = baTable.comSearch.form[key];
  140. }
  141. if (val) {
  142. comSearchData.push({
  143. field: key,
  144. val: val,
  145. operator: fieldDataTemp.operator,
  146. render: fieldDataTemp.render
  147. });
  148. }
  149. }
  150. proxy.eventBus.emit("onTableComSearch", comSearchData);
  151. };
  152. const onResetForm = () => {
  153. // 封装好的onResetForm在此处不能使用
  154. for (const key in baTable.comSearch.form) {
  155. baTable.comSearch.form[key] = "";
  156. }
  157. };
  158. </script>
  159. <style scoped lang="scss">
  160. .table-com-search {
  161. overflow: hidden;
  162. box-sizing: border-box;
  163. width: 100%;
  164. max-width: 100%;
  165. background-color: #ffffff;
  166. border: 1px solid #f6f6f6;
  167. border-bottom: none;
  168. padding: 13px 15px;
  169. font-size: 14px;
  170. .com-search-col {
  171. display: flex;
  172. align-items: center;
  173. padding-top: 8px;
  174. color: var(--color-regular);
  175. font-size: 13px;
  176. }
  177. .com-search-col-label {
  178. width: 20%;
  179. padding: 0 15px;
  180. text-align: right;
  181. overflow: hidden;
  182. white-space: nowrap;
  183. }
  184. .com-search-col-input {
  185. padding: 0 15px;
  186. width: 80%;
  187. }
  188. .com-search-col-input-range {
  189. display: flex;
  190. align-items: center;
  191. padding: 0 15px;
  192. width: 80%;
  193. .range-separator {
  194. padding: 0 5px;
  195. }
  196. }
  197. }
  198. :deep(.datetime-picker) {
  199. width: 100%;
  200. }
  201. .w16 {
  202. width: 16.5% !important;
  203. }
  204. .w83 {
  205. width: 83.5% !important;
  206. }
  207. </style>