ToolbarContainer.vue 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  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. >
  69. </el-date-picker>
  70. <!-- 追加 -->
  71. <IssueTypeSelect
  72. v-if="field.type === 'issueTypeSelect'"
  73. v-model="form[field.name]"
  74. ></IssueTypeSelect>
  75. </el-form-item>
  76. </el-col>
  77. </el-row>
  78. <div class="f-fe-c pl-40">
  79. <el-button v-if="showSearch" type="primary" @click="handleSubmit"
  80. >查询</el-button
  81. >
  82. <el-button v-if="showReset" @click="handleReset">重置</el-button>
  83. </div>
  84. </div>
  85. </el-form>
  86. </template>
  87. <script>
  88. function isPromise(obj) {
  89. return (
  90. !!obj &&
  91. (typeof obj === 'object' || typeof obj === 'function') &&
  92. typeof obj.then === 'function'
  93. );
  94. }
  95. export default {
  96. name: 'Toolbar',
  97. props: {
  98. fields: {
  99. type: Array,
  100. default: () => []
  101. },
  102. showSearch: {
  103. type: Boolean,
  104. default: true
  105. },
  106. showReset: {
  107. type: Boolean,
  108. default: true
  109. },
  110. firstLoad: {
  111. type: Boolean,
  112. default: true
  113. }
  114. },
  115. data() {
  116. return {
  117. form: {}
  118. };
  119. },
  120. mounted() {
  121. if (this.firstLoad) {
  122. this.handleReset();
  123. } else {
  124. this.initForm();
  125. }
  126. },
  127. methods: {
  128. handleSubmit() {
  129. const filter = this.getFormData();
  130. this.$emit('on-filter', filter);
  131. },
  132. async handleReset() {
  133. await this.initForm();
  134. const filter = this.getFormData();
  135. this.$emit('on-reset', filter);
  136. },
  137. async initForm() {
  138. const form = this.fields.reduce(async (init, current) => {
  139. init = await init;
  140. init[current.name] = current.defaultValue || null;
  141. if (current.options && isPromise(current.options)) {
  142. current.options = await current.options;
  143. }
  144. return init;
  145. }, Promise.resolve({}));
  146. this.form = await form;
  147. },
  148. getFormData() {
  149. const filter =
  150. this.fields.length > 0
  151. ? this.fields.reduce((init, { name, apiName, type, format }) => {
  152. const values = this.form[name];
  153. const key = apiName || name;
  154. let temp = null;
  155. if (type === 'dateArray') {
  156. temp = [];
  157. apiName.forEach((x, i) => {
  158. temp.push(values && values[i]);
  159. });
  160. } else {
  161. temp = values || values === 0 ? values : null;
  162. }
  163. const val = format ? format(values, temp) : temp;
  164. if (typeof key === 'string') {
  165. init[key] = val;
  166. } else {
  167. key.forEach((x, i) => {
  168. init[x] = val[i];
  169. });
  170. }
  171. return init;
  172. }, {})
  173. : [];
  174. return filter;
  175. }
  176. }
  177. };
  178. </script>
  179. <style scoped lang="scss">
  180. .f-1 {
  181. flex: 1;
  182. }
  183. .h-50 {
  184. height: 50px;
  185. }
  186. .el-select {
  187. width: 100%;
  188. }
  189. .el-range-editor.el-input__inner {
  190. width: 100%;
  191. }
  192. </style>