ToolbarContainer.vue 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. <template>
  2. <el-form
  3. :class="fields.length > 0 ? 'm-10 p-20 br-10 bg-w' : ''"
  4. label-position="right"
  5. label-width="0"
  6. :model="form"
  7. >
  8. <div class="f-sb-fs">
  9. <el-row class="f-1" :gutter="20">
  10. <el-col
  11. v-for="field in fields"
  12. :key="field.name"
  13. :span="field.col || 8"
  14. class="h-50"
  15. >
  16. <el-form-item
  17. :label="field.label"
  18. :label-width="
  19. field.labelWidth ? field.labelWidth : field.label && '80px'
  20. "
  21. >
  22. <!-- 输入文本 -->
  23. <el-input
  24. v-if="field.type === 'text'"
  25. v-model="form[field.name]"
  26. :clearable="true"
  27. :placeholder="'请输入' + field.label"
  28. />
  29. <!-- 单选 -->
  30. <el-select
  31. v-if="field.type === 'select'"
  32. v-model="form[field.name]"
  33. :clearable="true"
  34. :placeholder="'请选择' + field.label"
  35. >
  36. <el-option
  37. v-for="item in field.options"
  38. :key="item.value"
  39. :label="item.label"
  40. :value="item.value"
  41. >
  42. </el-option>
  43. </el-select>
  44. <!-- 多选 -->
  45. <el-select
  46. v-if="field.type === 'multipleSelect'"
  47. v-model="form[field.name]"
  48. multiple
  49. collapse-tags
  50. :clearable="true"
  51. :placeholder="'请选择' + field.label"
  52. >
  53. <el-option
  54. v-for="item in field.options"
  55. :key="item.value"
  56. :label="item.label"
  57. :value="item.value"
  58. >
  59. </el-option>
  60. </el-select>
  61. <!-- 时间选择器 -->
  62. <el-date-picker
  63. v-if="field.type === 'dateArray'"
  64. v-model="form[field.name]"
  65. type="datetimerange"
  66. start-placeholder="开始日期"
  67. end-placeholder="结束日期"
  68. value-format="yyyy-MM-dd HH:mm:ss"
  69. >
  70. </el-date-picker>
  71. <!-- 追加 -->
  72. <IssueTypeSelect
  73. v-if="field.type === 'issueTypeSelect'"
  74. v-model="form[field.name]"
  75. :props="{ checkStrictly: true }"
  76. ></IssueTypeSelect>
  77. <SceneSelect
  78. v-if="field.type === 'SceneSelect'"
  79. v-model="form[field.name]"
  80. ></SceneSelect>
  81. <DataSelect
  82. v-if="field.type === 'DataSelect'"
  83. v-model="form[field.name]"
  84. :params="field.params"
  85. :props="field.props"
  86. :valueKay="field.valueKay"
  87. :clearable="true"
  88. ></DataSelect>
  89. <ActivitySelect
  90. v-if="field.type === 'ActivitySelect'"
  91. v-model="form[field.name]"
  92. :params="field.params"
  93. :clearable="true"
  94. ></ActivitySelect>
  95. <AddressSelect
  96. v-if="field.type === 'AddressSelect'"
  97. v-model="form[field.name]"
  98. :params="field.params"
  99. :clearable="true"
  100. />
  101. </el-form-item>
  102. </el-col>
  103. </el-row>
  104. <div class="f-fe-c pl-40">
  105. <el-button v-if="showSearch" type="primary" @click="handleSubmit"
  106. >查询</el-button
  107. >
  108. <el-button v-if="showReset" @click="handleReset">重置</el-button>
  109. </div>
  110. </div>
  111. </el-form>
  112. </template>
  113. <script>
  114. function isPromise(obj) {
  115. return (
  116. !!obj &&
  117. (typeof obj === 'object' || typeof obj === 'function') &&
  118. typeof obj.then === 'function'
  119. );
  120. }
  121. export default {
  122. name: 'Toolbar',
  123. props: {
  124. fields: {
  125. type: Array,
  126. default: () => []
  127. },
  128. showSearch: {
  129. type: Boolean,
  130. default: true
  131. },
  132. showReset: {
  133. type: Boolean,
  134. default: true
  135. },
  136. firstLoad: {
  137. type: Boolean,
  138. default: true
  139. }
  140. },
  141. data() {
  142. return {
  143. form: {}
  144. };
  145. },
  146. mounted() {
  147. if (this.firstLoad) {
  148. this.handleReset();
  149. } else {
  150. this.initForm();
  151. }
  152. },
  153. methods: {
  154. handleSubmit() {
  155. const filter = this.getFormData();
  156. this.$emit('on-filter', filter);
  157. },
  158. async handleReset() {
  159. await this.initForm();
  160. const filter = this.getFormData();
  161. this.$emit('on-reset', filter);
  162. },
  163. async initForm() {
  164. const form = this.fields.reduce(async (init, current) => {
  165. init = await init;
  166. init[current.name] =
  167. current.defaultValue !== undefined ? current.defaultValue : null;
  168. if (current.options && isPromise(current.options)) {
  169. current.options = await current.options;
  170. }
  171. return init;
  172. }, Promise.resolve({}));
  173. this.form = await form;
  174. },
  175. getFormData() {
  176. const filter =
  177. this.fields.length > 0
  178. ? this.fields.reduce((init, { name, apiName, type, format }) => {
  179. const values = this.form[name];
  180. const key = apiName || name;
  181. let temp = null;
  182. if (type === 'dateArray') {
  183. temp = [];
  184. apiName.forEach((x, i) => {
  185. temp.push(values && values[i]);
  186. });
  187. } else {
  188. temp = values || values === 0 ? values : null;
  189. }
  190. const val = format ? format(values, temp) : temp;
  191. if (typeof key === 'string') {
  192. init[key] = val;
  193. } else {
  194. key.forEach((x, i) => {
  195. init[x] = val[i];
  196. });
  197. }
  198. return init;
  199. }, {})
  200. : [];
  201. return filter;
  202. }
  203. }
  204. };
  205. </script>
  206. <style scoped lang="scss">
  207. .f-1 {
  208. flex: 1;
  209. }
  210. .h-50 {
  211. height: 50px;
  212. }
  213. .el-select {
  214. width: 100%;
  215. }
  216. .el-range-editor.el-input__inner {
  217. width: 100%;
  218. }
  219. </style>