index.js 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. const _Http = getApp().globalData.http;
  2. import {
  3. getHeight
  4. } from "../../utils/getHeight";
  5. import {
  6. formatTime
  7. } from "../../utils/getTime"
  8. Component({
  9. options: {
  10. multipleSlots: true
  11. },
  12. properties: {
  13. list: {
  14. type: {
  15. type: Array
  16. },
  17. value: [{
  18. label: "筛选1",
  19. index: null,
  20. showName: "name", //显示字段
  21. valueKey: "name", //返回Key
  22. selectKey: "id", //传参 代表选着字段 不传参返回整个选择对象
  23. value: "", //选中值
  24. default: "", //默认索引
  25. list: [{
  26. name: "a1",
  27. id: 0
  28. }, {
  29. name: "a2",
  30. id: 1
  31. }]
  32. }]
  33. },
  34. show: {
  35. type: Boolean
  36. },
  37. handle: {
  38. type: Function
  39. }, //按钮回调函数
  40. dateRange: {
  41. type: Boolean
  42. }, //是否开启日期范围筛选
  43. dateRangeName: {
  44. type: String,
  45. value: "日期范围"
  46. },
  47. dateRange1: {
  48. type: Boolean
  49. }, //是否开启日期范围筛选
  50. zIndex: {
  51. type: String,
  52. value: 99999,
  53. },
  54. interrupt: {
  55. type: Function
  56. },
  57. isReset: {
  58. type: Boolean,
  59. value: true
  60. },
  61. minus: {
  62. type: [Number, String],
  63. value: 80
  64. }
  65. },
  66. data: {
  67. startdate: "", //开始时间
  68. enddate: "", //结束时间
  69. periodstart: "",
  70. periodend: "",
  71. },
  72. observers: {
  73. "show"(newVal) {
  74. if (newVal) getHeight('.head', this).then(res => this.setData({
  75. listHeight: res - this.data.minus
  76. }));
  77. }
  78. },
  79. methods: {
  80. /* 选择 */
  81. onSelect(e) {
  82. const {
  83. item, //被选项
  84. index, //列表下标
  85. i //被选项下标
  86. } = e.currentTarget.dataset;
  87. if (this.data.list[index].index == i) {
  88. this.setData({
  89. [`list[${index}].value`]: "",
  90. [`list[${index}].index`]: null
  91. });
  92. } else {
  93. this.setData({
  94. [`list[${index}].value`]: this.data.list[index].selectKey ? item[this.data.list[index].selectKey] : item,
  95. [`list[${index}].index`]: i
  96. });
  97. };
  98. if (this.data.list[index].interrupt) this.triggerEvent("interrupt", {
  99. item,
  100. index,
  101. name: this.data.list[index].selectKey,
  102. data: this.data.list[index],
  103. list: this.data.list
  104. })
  105. },
  106. onSelectCheckbox(e) {
  107. const {
  108. item, //被选项
  109. index, //列表下标
  110. i //被选项下标
  111. } = e.currentTarget.dataset,
  112. list = this.data.list;
  113. if (list[index].index == "" || list[index].index == null) {
  114. list[index].index = [];
  115. list[index].value = [];
  116. }
  117. let arrIndex = list[index].index.indexOf(i)
  118. if (arrIndex == -1) {
  119. list[index].index.push(i)
  120. list[index].value.push(list[index].selectKey ? item[list[index].selectKey] : item)
  121. } else {
  122. list[index].index.splice(arrIndex, 1)
  123. list[index].value.splice(arrIndex, 1)
  124. };
  125. this.setData({
  126. list
  127. })
  128. if (this.data.list[index].interrupt) this.triggerEvent("interrupt", {
  129. item,
  130. index,
  131. name: this.data.list[index].selectKey,
  132. list
  133. })
  134. },
  135. /* 点击按钮 */
  136. onClick(e) {
  137. const {
  138. name
  139. } = e.target.dataset;
  140. if (name == 'reset') {
  141. this.setData({
  142. startdate: '',
  143. enddate: ''
  144. })
  145. this.setData({
  146. list: this.data.list.map(v => {
  147. let value = "",
  148. index = null;
  149. try {
  150. if ((v.default+'').length) {
  151. index = v.default;
  152. value = v.selectKey ? v.list[v.default][v.selectKey] : v.list[v.default]
  153. }
  154. } catch (error) {
  155. }
  156. v.value = value;
  157. v.index = index;
  158. if (index != null && v.relevance == 'dateRange') this.queryMonths(v.list[index].queryMonths)
  159. return v;
  160. })
  161. })
  162. let MultilevelClass = this.selectComponent("#MultilevelClass");
  163. if (MultilevelClass) MultilevelClass.clearChild()
  164. };
  165. let obj = {};
  166. this.data.list.forEach(v => {
  167. if (v.type == 'multilevelClass') {
  168. obj[v.valueKey] = getApp().globalData.temporaryId;
  169. delete(getApp().globalData.temporaryId);
  170. } else if (v.type == 'checkbox') {
  171. obj[v.valueKey] = v.value || [];
  172. } else {
  173. obj[v.valueKey] = v.value;
  174. }
  175. });
  176. if (this.data.dateRange) {
  177. obj.startdate = this.data.startdate;
  178. obj.enddate = this.data.enddate;
  179. };
  180. if (this.data.dateRange1) {
  181. obj.periodstart = this.data.periodstart;
  182. obj.periodend = this.data.periodend;
  183. };
  184. obj.name = name;
  185. this.triggerEvent("handle", obj);
  186. this.onClose();
  187. },
  188. /* 筛选日期范围 */
  189. changeDate(e) {
  190. const name = e.currentTarget.dataset.name,
  191. value = e.detail.value;
  192. let data = this.data.list.find(v => v.relevance == "dateRange")
  193. if (data) {
  194. data.index = null;
  195. this.setData({
  196. list: this.data.list
  197. })
  198. }
  199. this.setData({
  200. [name]: value
  201. })
  202. },
  203. setTimeCycle(startdate = "", enddate = "") {
  204. this.setData({
  205. startdate,
  206. enddate,
  207. })
  208. },
  209. queryDays(num) {
  210. let now = new Date().getTime(),
  211. end = now,
  212. beg = end - (num * 86400000);
  213. this.setTimeCycle(formatTime(new Date(beg), '-').split(' ')[0], formatTime(new Date(end), '-').split(' ')[0])
  214. },
  215. queryMonths(period) {
  216. let startdate = formatTime(new Date(), '-').split(' ')[0],
  217. enddate = formatTime(new Date(), '-').split(' ')[0].split('-');
  218. for (let i = period; i != 0; i--) {
  219. enddate[1] = Number(enddate[1]) - 1;
  220. if (enddate[1] == 0) {
  221. enddate[1] = 12;
  222. enddate[0] = enddate[0] - 1;
  223. }
  224. if (i == 1 && enddate[1] < 10) enddate[1] = "0" + enddate[1]
  225. }
  226. let lastDay = new Date(enddate[0], enddate[1], 0).getDate();
  227. if (enddate[2] > lastDay) enddate[2] = lastDay;
  228. this.setTimeCycle(enddate.join("-"), startdate)
  229. },
  230. onClose() {
  231. this.setData({
  232. show: false
  233. })
  234. }
  235. }
  236. })