searchForm.vue 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. <template>
  2. <div class="searchForm">
  3. <div v-for="l in data" :key="l.key" class="Layout" style="display: inline-flex;padding-left: 15px; width:270px;" :style="l.styles">
  4. <div class="name" :style="l.nameStyles">{{ l.name }}</div>
  5. <el-select
  6. v-if="l.type === 'select'"
  7. v-model="l.value"
  8. size="small"
  9. :multiple="l.multiple"
  10. clearable
  11. filterable
  12. :placeholder="l.placeholder"
  13. class="chooseItem"
  14. @change="(e) => $emit('change', l.key, e)"
  15. >
  16. <el-option v-for="o in l.option" :key="o.value" :label="o.label" :value="o.value" />
  17. </el-select>
  18. <el-select
  19. v-else-if="l.type === 'remoteSelect'"
  20. v-model="l.value"
  21. filterable
  22. remote
  23. clearable
  24. :placeholder="l.placeholder"
  25. :remote-method="(q) => $emit('getOption', l.key, q, l.utilName)"
  26. :loading="loading"
  27. size="small"
  28. class="chooseItem"
  29. @change="(e) => $emit('change', l.key, e)"
  30. >
  31. <!-- <slot v-if="hasSlot" name="option" /> -->
  32. <div v-if="l.hasSlot">
  33. <el-option v-for="o in l.option" :key="o.idap" :label="o.name" :value="o.idap">
  34. <div class="item-style">
  35. <div class="item-detail">{{ o.deptName }}</div>
  36. <div style="min-width:80px">{{ o.name }}</div>
  37. <div class="item-detail">{{ o.idap }}</div>
  38. </div>
  39. </el-option>
  40. </div>
  41. <el-option v-for="o in l.option" v-else :key="o.value" :label="o.label" :value="o.value" />
  42. </el-select>
  43. <el-select
  44. v-else-if="l.type === 'selectGroup'"
  45. v-model="l.value"
  46. placeholder="请选择"
  47. size="small"
  48. clearable
  49. filterable
  50. multiple
  51. >
  52. <el-option-group
  53. v-for="group in l.option"
  54. :key="group.label"
  55. :label="group.label"
  56. >
  57. <el-option
  58. v-for="item in group.options"
  59. :key="item.teamId"
  60. :label="item.teamName"
  61. :value="item.teamId"
  62. />
  63. </el-option-group>
  64. </el-select>
  65. <div v-else-if="l.type === 'showItemDataPicker'" class="showItemDataPicker">
  66. <div class="inlineBlock item">
  67. <span
  68. v-for="item in dateSelect"
  69. :key="item.key"
  70. :value="item.key"
  71. :class="item.key === showItemDataPickerItem && 'active'"
  72. @click="setDate(item.key, l.type)"
  73. >{{ item.label }}</span>
  74. </div>
  75. <el-date-picker
  76. v-model="l.value"
  77. type="daterange"
  78. align="right"
  79. unlink-panels
  80. range-separator="至"
  81. start-placeholder="开始日期"
  82. end-placeholder="结束日期"
  83. size="small"
  84. value-format="yyyy-MM-dd HH:mm:ss"
  85. :default-time="['00:00:00','23:59:59']"
  86. @change="(e) => $emit('change', l.key, e)"
  87. />
  88. </div>
  89. <el-date-picker
  90. v-else-if="l.type === 'dateStartAndEnd'"
  91. v-model="l.value"
  92. type="daterange"
  93. align="right"
  94. unlink-panels
  95. range-separator="至"
  96. start-placeholder="开始日期"
  97. end-placeholder="结束日期"
  98. size="small"
  99. class="chooseItem"
  100. value-format="yyyy-MM-dd HH:mm:ss"
  101. :default-time="['00:00:00','23:59:59']"
  102. :picker-options="pickerOptions"
  103. @change="(e) => $emit('change', l.key, e)"
  104. />
  105. <!-- <el-cascader
  106. v-else-if="l.type === 'cascader'"
  107. v-model="l.value"
  108. :options="l.option"
  109. size="small"
  110. @change="(e) => $emit('change', l.key, e)"
  111. /> -->
  112. <a-tree-select
  113. v-else-if="l.type === 'cascader'"
  114. v-model="l.value"
  115. show-search
  116. allow-clear
  117. style="width: 100%"
  118. :dropdown-style="{ maxHeight: '400px', overflow: 'auto' }"
  119. placeholder="请选择"
  120. tree-node-filter-prop="title"
  121. tree-default-expand-all
  122. :tree-data="l.option"
  123. @change="(e) => test(l, e)"
  124. />
  125. <el-input
  126. v-else
  127. v-model="l.value"
  128. style="width: 100% !important"
  129. size="small"
  130. class="chooseItem"
  131. clearable
  132. :placeholder="l.placeholder"
  133. @change="(e) => $emit('change', l.key, e)"
  134. />
  135. </div>
  136. </div>
  137. </template>
  138. <script>
  139. import moment from 'moment'
  140. moment.locale('zh-cn')
  141. export default {
  142. props: {
  143. data: {
  144. type: Array,
  145. required: false,
  146. default: () => []
  147. },
  148. loading: {
  149. type: Boolean,
  150. default: false,
  151. required: true
  152. },
  153. styles: {
  154. type: Object,
  155. default: () => {},
  156. required: false
  157. }
  158. },
  159. data() {
  160. return {
  161. pickerOptions: {
  162. shortcuts: [{
  163. text: '最近一周',
  164. onClick(picker) {
  165. const end = new Date()
  166. const start = new Date()
  167. start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
  168. picker.$emit('pick', [start, end])
  169. }
  170. }, {
  171. text: '最近一个月',
  172. onClick(picker) {
  173. const end = new Date()
  174. const start = new Date()
  175. start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
  176. picker.$emit('pick', [start, end])
  177. }
  178. }, {
  179. text: '最近三个月',
  180. onClick(picker) {
  181. const end = new Date()
  182. const start = new Date()
  183. start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)
  184. picker.$emit('pick', [start, end])
  185. }
  186. }]
  187. },
  188. dateSelect: [
  189. {
  190. key: 'week',
  191. label: '本周'
  192. },
  193. {
  194. key: 'month',
  195. label: '本月'
  196. },
  197. {
  198. key: 'year',
  199. label: '本年'
  200. }
  201. ],
  202. showItemDataPickerItem: 'week'
  203. }
  204. },
  205. mounted() {
  206. console.log()
  207. this.setDate(this.showItemDataPickerItem, 'showItemDataPicker')
  208. },
  209. methods: {
  210. test(l, v) {
  211. console.log(v || '')
  212. this.$emit('change', l.key, v || '')
  213. },
  214. setDate(type, key) { // 日期筛选
  215. let startDate = null
  216. let endDate = null
  217. switch (type) {
  218. case 'week':
  219. startDate = moment().startOf('week').format('YYYY-MM-DD HH:mm:ss')
  220. endDate = moment().endOf('week').format('YYYY-MM-DD HH:mm:ss')
  221. // this.bugCountTimeType = this.timeTypeList[0].code
  222. break
  223. case 'month':
  224. startDate = moment().startOf('month').format('YYYY-MM-DD HH:mm:ss')
  225. endDate = moment().endOf('month').format('YYYY-MM-DD HH:mm:ss')
  226. // this.bugCountTimeType = this.timeTypeList[1].code
  227. break
  228. case 'year':
  229. startDate = moment().startOf('year').format('YYYY-MM-DD HH:mm:ss')
  230. endDate = moment().endOf('year').format('YYYY-MM-DD HH:mm:ss')
  231. // this.bugCountTimeType = this.timeTypeList[2].code
  232. break
  233. }
  234. console.log(startDate, endDate)
  235. this.showItemDataPickerItem = type
  236. this.data.map(g => {
  237. // data[g.key] = g.value
  238. if (g.type === key) g.value = [startDate, endDate]
  239. })
  240. console.log(startDate, endDate)
  241. this.showItemDataPickerStratAndEnd = [startDate, endDate]
  242. this.$emit('change', key, [startDate, endDate])
  243. }
  244. }
  245. }
  246. </script>
  247. <style scoped lang="less">
  248. .searchForm {
  249. .name {
  250. min-width: 80px;
  251. }
  252. .chooseItem {
  253. flex: 1;
  254. /deep/.el-range-separator {
  255. width: auto;
  256. }
  257. }
  258. .showItemDataPicker {
  259. .item {
  260. span {
  261. color: #666;
  262. background: #fff;
  263. display: inline-block;
  264. width: 40px;
  265. text-align: center;
  266. cursor: pointer;
  267. border-radius: 2px;
  268. margin-right: 5px;
  269. }
  270. .active {
  271. background: #409EFF;
  272. color: #fff;
  273. }
  274. }
  275. }
  276. }
  277. .item-style {
  278. display: flex;
  279. justify-content: flex-start;
  280. .item-detail {
  281. min-width:100px;
  282. color: #8492a6;
  283. font-size: 13px;
  284. overflow:hidden
  285. }
  286. }
  287. </style>