imatrix-ui 0.2.0-up → 0.2.2-up

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (213) hide show
  1. package/README.md +7 -7
  2. package/index.html +13 -13
  3. package/lib/super-ui.css +1 -1
  4. package/lib/super-ui.js +787 -366
  5. package/lib/super-ui.umd.cjs +18 -18
  6. package/package.json +34 -34
  7. package/packages/IntervalSelection/index.js +6 -6
  8. package/packages/IntervalSelection/src/quarterScope.vue +405 -405
  9. package/packages/IntervalSelection/src/sectionDate.vue +475 -475
  10. package/packages/breadcrumb/index.js +6 -6
  11. package/packages/breadcrumb/src/breadcrumb.vue +81 -81
  12. package/packages/department-tree/index.js +6 -6
  13. package/packages/department-tree/src/department-tree.vue +113 -113
  14. package/packages/department-tree-inline/index.js +6 -6
  15. package/packages/department-tree-inline/src/department-multi-tree-inline.vue +472 -472
  16. package/packages/department-tree-inline/src/department-single-tree-inline.vue +340 -340
  17. package/packages/department-tree-inline/src/department-tree-inline.vue +86 -86
  18. package/packages/department-tree-inline/src/department-tree-service.js +344 -344
  19. package/packages/department-tree-inline/src/search-result.vue +235 -235
  20. package/packages/department-user-tree/index.js +6 -6
  21. package/packages/department-user-tree/src/department-user-multiple-tree.vue +129 -129
  22. package/packages/department-user-tree/src/department-user-single-tree.vue +94 -94
  23. package/packages/department-user-tree/src/department-user-tree.vue +114 -114
  24. package/packages/department-user-tree-inline/index.js +9 -9
  25. package/packages/department-user-tree-inline/src/department-user-multiple-tree-inline.vue +731 -731
  26. package/packages/department-user-tree-inline/src/department-user-single-tree-inline.vue +334 -334
  27. package/packages/department-user-tree-inline/src/department-user-tree-inline.vue +87 -87
  28. package/packages/department-user-tree-inline/src/department-user-tree-multi-service.js +309 -309
  29. package/packages/department-user-tree-inline/src/department-user-tree-single-service.js +179 -179
  30. package/packages/department-user-tree-inline/src/search-result.vue +273 -273
  31. package/packages/directives/prevent-reclick.js +22 -22
  32. package/packages/dynamic-source-select/index.js +6 -6
  33. package/packages/dynamic-source-select/src/dynamic-source-select-service.js +106 -106
  34. package/packages/dynamic-source-select/src/dynamic-source-select.vue +675 -675
  35. package/packages/dynamic-source-select/src/events.js +78 -78
  36. package/packages/fs-preview/index.js +6 -6
  37. package/packages/fs-preview/src/fs-preview.vue +287 -287
  38. package/packages/fs-upload/index.js +6 -6
  39. package/packages/fs-upload/src/fs-upload-multi.vue +443 -443
  40. package/packages/fs-upload/src/fs-upload-single.vue +350 -350
  41. package/packages/fs-upload/src/fs-upload.vue +191 -191
  42. package/packages/fs-upload/src/see-big-picture.vue +67 -67
  43. package/packages/fs-upload-list/index.js +6 -6
  44. package/packages/fs-upload-list/src/fs-upload-list.vue +372 -372
  45. package/packages/hamburger/index.js +6 -6
  46. package/packages/hamburger/src/hamburger.vue +40 -40
  47. package/packages/index.js +125 -123
  48. package/packages/multipart-upload/index.js +6 -6
  49. package/packages/multipart-upload/src/index.vue +66 -66
  50. package/packages/multipart-upload/src/multipart-upload-form.vue +377 -377
  51. package/packages/multipart-upload/src/multipart-upload-list.vue +517 -517
  52. package/packages/organization-input/index.js +6 -6
  53. package/packages/organization-input/src/organization-input.vue +583 -587
  54. package/packages/plugins/export-data-new.js +623 -623
  55. package/packages/plugins/export-data.js +431 -431
  56. package/packages/plugins/index.js +15 -15
  57. package/packages/plugins/public-method.js +47 -47
  58. package/packages/remove-department/index.js +6 -6
  59. package/packages/remove-department/src/remove-department.vue +200 -200
  60. package/packages/remove-department/src/remove-dept-service.js +31 -31
  61. package/packages/remove-user/index.js +6 -6
  62. package/packages/remove-user/src/remove-user-service.js +31 -31
  63. package/packages/remove-user/src/remove-user.vue +226 -226
  64. package/packages/remove-workgroup/index.js +6 -6
  65. package/packages/remove-workgroup/src/remove-workgroup-service.js +31 -31
  66. package/packages/remove-workgroup/src/remove-workgroup.vue +183 -183
  67. package/packages/rich-editor/index.js +7 -7
  68. package/packages/rich-editor/index.vue +297 -297
  69. package/packages/rich-editor/langs/zh-Hans.js +438 -438
  70. package/packages/rich-editor/viewer.vue +105 -105
  71. package/packages/scan-code-input/index.js +6 -6
  72. package/packages/scan-code-input/src/events.js +34 -34
  73. package/packages/scan-code-input/src/scan-code-input-colse.vue +140 -140
  74. package/packages/scan-code-input/src/scan-code-input.vue +132 -132
  75. package/packages/secret-info/index.js +7 -7
  76. package/packages/secret-info/index.vue +100 -100
  77. package/packages/super-grid/index.js +7 -7
  78. package/packages/super-grid/src/apis.js +1092 -1092
  79. package/packages/super-grid/src/columns-config.vue +427 -427
  80. package/packages/super-grid/src/custom-formatter.js +388 -388
  81. package/packages/super-grid/src/eventBus.js +2 -2
  82. package/packages/super-grid/src/events.js +56 -56
  83. package/packages/super-grid/src/formValidatorUtil.js +300 -300
  84. package/packages/super-grid/src/formatter.js +196 -196
  85. package/packages/super-grid/src/group-column.vue +99 -99
  86. package/packages/super-grid/src/header-context-menu.vue +82 -82
  87. package/packages/super-grid/src/index-column.vue +69 -69
  88. package/packages/super-grid/src/normal-column.vue +1221 -1221
  89. package/packages/super-grid/src/public-methods.js +30 -30
  90. package/packages/super-grid/src/row-operation.vue +193 -193
  91. package/packages/super-grid/src/search-button.vue +74 -74
  92. package/packages/super-grid/src/search-condition-input.vue +73 -73
  93. package/packages/super-grid/src/search-condition-list.vue +68 -68
  94. package/packages/super-grid/src/search-form-advancedQuery.vue +819 -826
  95. package/packages/super-grid/src/search-form-dialog.vue +77 -77
  96. package/packages/super-grid/src/search-form-item.vue +495 -495
  97. package/packages/super-grid/src/search-form-number.vue +111 -111
  98. package/packages/super-grid/src/search-form-open.vue +167 -159
  99. package/packages/super-grid/src/search-form-ordinarySearch.vue +239 -233
  100. package/packages/super-grid/src/search-form.vue +762 -765
  101. package/packages/super-grid/src/search-methods.js +592 -592
  102. package/packages/super-grid/src/selection-column.vue +46 -46
  103. package/packages/super-grid/src/super-grid-service.js +728 -728
  104. package/packages/super-grid/src/super-grid.vue +3009 -3009
  105. package/packages/super-grid/src/utils.js +880 -880
  106. package/packages/super-grid/src/view-image-dialog.vue +176 -176
  107. package/packages/super-nine-grid/index.js +7 -7
  108. package/packages/super-nine-grid/src/apis.js +108 -108
  109. package/packages/super-nine-grid/src/custom-formatter.js +73 -73
  110. package/packages/super-nine-grid/src/formatter.js +134 -134
  111. package/packages/super-nine-grid/src/search-form-number.vue +35 -35
  112. package/packages/super-nine-grid/src/search-form.vue +700 -703
  113. package/packages/super-nine-grid/src/search-methods.js +151 -151
  114. package/packages/super-nine-grid/src/super-grid-service.js +107 -107
  115. package/packages/super-nine-grid/src/super-nine-grid.vue +1164 -1164
  116. package/packages/super-nine-grid/src/utils.js +264 -264
  117. package/packages/svg-icon/index.js +6 -6
  118. package/packages/svg-icon/src/svg-icon.vue +43 -43
  119. package/packages/utils/date-util.js +292 -292
  120. package/packages/utils/dom.js +227 -227
  121. package/packages/utils/gogocodeTransfer.js +59 -59
  122. package/packages/utils/memory-cache-utils.js +117 -117
  123. package/packages/utils/utils.js +180 -180
  124. package/packages/utils/value-set.js +97 -97
  125. package/packages/valid-code/index.js +7 -7
  126. package/packages/valid-code/src/valid-code.vue +104 -104
  127. package/packages/workflow-button/index.js +6 -6
  128. package/packages/workflow-button/src/workflow-button.vue +550 -550
  129. package/packages/workflow-history-list/index.js +6 -6
  130. package/packages/workflow-history-list/src/api.js +7 -7
  131. package/packages/workflow-history-list/src/workflow-history-list.vue +291 -291
  132. package/packages/workgroup-tree/index.js +6 -6
  133. package/packages/workgroup-tree/src/workgroup-tree.vue +86 -86
  134. package/packages/workgroup-tree-inline/index.js +6 -6
  135. package/packages/workgroup-tree-inline/src/search-result.vue +222 -222
  136. package/packages/workgroup-tree-inline/src/workgroup-tree-inline.vue +516 -516
  137. package/packages/workgroup-tree-inline/src/workgroup-tree-service.js +93 -93
  138. package/packages/workgroup-user-tree/index.js +6 -6
  139. package/packages/workgroup-user-tree/src/workgroup-user-tree.vue +103 -103
  140. package/packages/workgroup-user-tree-inline/index.js +9 -9
  141. package/packages/workgroup-user-tree-inline/src/search-result.vue +266 -266
  142. package/packages/workgroup-user-tree-inline/src/workgroup-tree-inline-service.js +239 -239
  143. package/packages/workgroup-user-tree-inline/src/workgroup-user-tree-inline.vue +657 -657
  144. package/packages/year-range-picker/index.js +6 -6
  145. package/packages/year-range-picker/src/year-range-picker.vue +53 -53
  146. package/src/api/sso-service.js +172 -172
  147. package/src/api/tab.js +36 -36
  148. package/src/api/user-service.js +11 -11
  149. package/src/directives/permission/index.js +13 -13
  150. package/src/directives/permission/permission.js +20 -20
  151. package/src/i18n/langs/cn.js +259 -259
  152. package/src/i18n/langs/en.js +269 -269
  153. package/src/index.js +93 -93
  154. package/src/permission.js +160 -158
  155. package/src/plugins.js +18 -18
  156. package/src/router/index.js +110 -116
  157. package/src/store/getters.js +15 -15
  158. package/src/store/index.js +19 -19
  159. package/src/store/modules/app.js +54 -54
  160. package/src/store/modules/permission.js +145 -145
  161. package/src/store/modules/tab-content.js +36 -36
  162. package/src/store/modules/user.js +285 -285
  163. package/src/utils/auth-api.js +159 -159
  164. package/src/utils/calculator/calculator-factory-wf.js +558 -558
  165. package/src/utils/calculator/calculator-factory.js +145 -145
  166. package/src/utils/calculator/calculator-util.js +166 -166
  167. package/src/utils/eventBus.js +2 -2
  168. package/src/utils/iconUtils.js +28 -28
  169. package/src/utils/index.js +102 -102
  170. package/src/utils/jump-page-utils.js +824 -824
  171. package/src/utils/local-storage.js +7 -7
  172. package/src/utils/permission.js +31 -31
  173. package/src/utils/permissionAuth.js +96 -96
  174. package/src/utils/range-selector.js +188 -188
  175. package/src/utils/request.js +269 -269
  176. package/src/utils/restful-interface-utils.js +57 -57
  177. package/src/utils/util.js +698 -698
  178. package/src/utils/validate.js +34 -34
  179. package/src/utils/watermark.js +108 -108
  180. package/src/utils/workflow-util.js +93 -93
  181. package/src/views/404.vue +248 -248
  182. package/src/views/dsc-component/Sidebar/Item.vue +84 -84
  183. package/src/views/dsc-component/Sidebar/Link.vue +38 -38
  184. package/src/views/dsc-component/Sidebar/SidebarItem.vue +198 -198
  185. package/src/views/dsc-component/Sidebar/index.vue +228 -228
  186. package/src/views/dsc-component/tabs/tab-content.vue +203 -203
  187. package/src/views/error-page/401.vue +106 -106
  188. package/src/views/error-page/404.vue +248 -248
  189. package/src/views/layout/EmptyLayout.vue +3 -3
  190. package/src/views/layout/Layout.vue +81 -81
  191. package/src/views/layout/NewLayout.vue +18 -18
  192. package/src/views/layout/components/AppMain.vue +39 -39
  193. package/src/views/layout/components/Breadcrumb/index.vue +156 -156
  194. package/src/views/layout/components/Menubar/Item.vue +79 -79
  195. package/src/views/layout/components/Menubar/Link.vue +38 -38
  196. package/src/views/layout/components/Menubar/SidebarItem.vue +164 -164
  197. package/src/views/layout/components/Menubar/index.vue +210 -210
  198. package/src/views/layout/components/Sidebar/Item.vue +53 -53
  199. package/src/views/layout/components/Sidebar/Link.vue +38 -38
  200. package/src/views/layout/components/Sidebar/SidebarItem.vue +135 -135
  201. package/src/views/layout/components/Sidebar/index.vue +141 -141
  202. package/src/views/layout/components/iframe-page.vue +38 -38
  203. package/src/views/layout/components/index.js +4 -4
  204. package/src/views/layout/components/tabs/tab-content.vue +207 -207
  205. package/src/views/layout/mixin/ResizeHandler.js +41 -41
  206. package/src/views/layout/tab-content-iframe-index.vue +38 -38
  207. package/src/views/layout/tab-content-index.vue +93 -93
  208. package/src/views/login/authredirect.vue +10 -10
  209. package/src/views/login/index.vue +296 -296
  210. package/src/views/login/update-password.vue +243 -243
  211. package/src/views/redirect/index.vue +14 -14
  212. package/src/views/wf-history/tache-subprocess-history.vue +45 -45
  213. package/.vscode/extensions.json +0 -3
@@ -1,405 +1,405 @@
1
- <template>
2
- <el-popover
3
- v-model="pickerVisible"
4
- trigger="focus"
5
- popper-class="lervor-quarter-popover"
6
- :disabled="disabled"
7
- >
8
- <template v-if="endQuarterDate" v-slot:reference>
9
- <el-input
10
- ref="reference"
11
- class="el-date-editor"
12
- readonly
13
- :disabled="disabled"
14
- :size="size"
15
- :placeholder="placeholder"
16
- :model-value="endValue"
17
- :validate-event="false"
18
- style="width: 100%"
19
- @mouseenter="handleMouseEnter"
20
- @mouseleave="showClose = false"
21
- >
22
- <template v-slot:prefix>
23
- <i class="el-input__icon" :class="triggerClass" />
24
- </template>
25
- <template v-slot:suffix>
26
- <i
27
- class="el-input__icon"
28
- :class="[showClose ? '' + clearIcon : '']"
29
- @click="handleClickIcon"
30
- @mousedown="handleMousedownIcon"
31
- />
32
- </template>
33
- </el-input>
34
- </template>
35
- <template v-else v-slot:reference>
36
- <el-input
37
- ref="reference"
38
- class="el-date-editor"
39
- readonly
40
- :disabled="disabled"
41
- :size="size"
42
- :placeholder="placeholder"
43
- :model-value="displayValue"
44
- :validate-event="false"
45
- style="width: 100%"
46
- @mouseenter="handleMouseEnter"
47
- @mouseleave="showClose = false"
48
- >
49
- <template v-slot:prefix>
50
- <i class="el-input__icon" :class="triggerClass" />
51
- </template>
52
- <template v-slot:suffix>
53
- <i
54
- class="el-input__icon"
55
- :class="[showClose ? '' + clearIcon : '']"
56
- @click="handleClickIcon"
57
- @mousedown="handleMousedownIcon"
58
- />
59
- </template>
60
- </el-input>
61
- </template>
62
- <div class="lervor-quarter-picker">
63
- <div class="el-date-picker__header el-date-picker__header--bordered">
64
- <button
65
- type="button"
66
- aria-label="前一年"
67
- class="el-picker-panel__icon-btn el-date-picker__prev-btn el-icon-d-arrow-left"
68
- @click="prevYear"
69
- />
70
- <span role="button" class="el-date-picker__header-label">{{
71
- yearLabel
72
- }}</span>
73
- <button
74
- type="button"
75
- aria-label="后一年"
76
- class="el-picker-panel__icon-btn el-date-picker__next-btn el-icon-d-arrow-right"
77
- @click="nextYear"
78
- />
79
- </div>
80
- <div
81
- class="el-picker-panel__content"
82
- style="width: 100%; margin: 10px 15px"
83
- >
84
- <table class="lervor-quarter-table" @click="handleTableClick">
85
- <tbody>
86
- <tr>
87
- <td class="available" :class="getCellStyle(0)">
88
- <a class="cell">Q1</a>
89
- </td>
90
- <td class="available" :class="getCellStyle(1)">
91
- <a class="cell">Q2</a>
92
- </td>
93
- </tr>
94
- <tr>
95
- <td class="available" :class="getCellStyle(2)">
96
- <a class="cell">Q3</a>
97
- </td>
98
- <td class="available" :class="getCellStyle(3)">
99
- <a class="cell">Q4</a>
100
- </td>
101
- </tr>
102
- </tbody>
103
- </table>
104
- </div>
105
- </div>
106
- </el-popover>
107
- </template>
108
-
109
- <script>
110
- import { $on, $off, $once, $emit } from '../../utils/gogocodeTransfer'
111
- import {
112
- formatDate,
113
- prevYear,
114
- nextYear,
115
- range,
116
- nextDate,
117
- isDateObject,
118
- parseDate,
119
- } from '../../utils/date-util'
120
- import { hasClass } from 'element-plus/lib/utils/index'
121
-
122
- // 获取指定年份和季度的所有日期
123
- const datesInYearAndQuarter = (year, quarter) => {
124
- const numOfDays = getDayCountOfQuarter(year, quarter)
125
- const firstDay = new Date(year, quarter * 3, 1)
126
- return range(numOfDays).map((n) => nextDate(firstDay, n))
127
- }
128
-
129
- // 获取指定年份和季度总天数
130
- const getDayCountOfQuarter = (year, quarter) => {
131
- switch (quarter) {
132
- case 0: // 第一季度包含二月,需要对是否闰年进行判断处理
133
- if ((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0) {
134
- return 91
135
- } else {
136
- return 90
137
- }
138
- case 1:
139
- return 91
140
- default:
141
- return 92
142
- }
143
- }
144
-
145
- export default {
146
- name: 'QuarterPicker',
147
- props: {
148
- size: {
149
- type: String,
150
- default: 'medium',
151
- },
152
- format: String, // 显示在输入框中的格式,引入季度:q(阿拉伯数字)、Q(中文数字)
153
- valueFormat: String,
154
- placeholder: String,
155
- prefixIcon: String,
156
- clearIcon: {
157
- type: String,
158
- default: 'el-icon-circle-close',
159
- },
160
- disabled: Boolean,
161
- clearable: {
162
- type: Boolean,
163
- default: true,
164
- },
165
- width: {
166
- // 组件宽度
167
- type: String,
168
- default: '',
169
- },
170
- disabledDate: {}, // 不可用的日期
171
- value: null,
172
- endQuarterDate: {
173
- type: Boolean,
174
- default: false,
175
- },
176
- },
177
- data() {
178
- return {
179
- showClose: false,
180
- pickerVisible: false,
181
- date: new Date(),
182
- quarterText: ['一', '二', '三', '四'],
183
- }
184
- },
185
- computed: {
186
- triggerClass() {
187
- return this.prefixIcon || 'el-icon-date'
188
- },
189
- displayValue() {
190
- if (!this.value) {
191
- return null
192
- } else if (typeof this.value === 'number') {
193
- const num = this.getQuarter(this.value)
194
- const yearNum = new Date(this.value).getFullYear()
195
- return yearNum + '年Q' + num
196
- } else {
197
- // 季度,从0开始
198
- const quarter = parseInt(this.parsedValue.getMonth() / 3)
199
- $emit(this, 'change', this.date)
200
- return (
201
- new Date(this.parsedValue).getFullYear() +
202
- this.$t('IntervalSelection.year') +
203
- 'Q' +
204
- (quarter + 1)
205
- )
206
- }
207
- },
208
- endValue() {
209
- if (!this.value) {
210
- return null
211
- } else if (typeof this.value === 'number') {
212
- const num = this.getQuarter(this.value)
213
- const yearNum = new Date(this.value).getFullYear()
214
- return yearNum + this.$t('IntervalSelection.year') + 'Q' + num
215
- } else {
216
- console.log(this.value)
217
- const month = this.date.getMonth() + 1
218
- const year = this.date.getFullYear()
219
- let addYear = ''
220
- if (month == 1) {
221
- if ((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0) {
222
- // 是闰年
223
- addYear = 90 * 24 * 60 * 60 * 1000
224
- } else {
225
- // 不是闰年
226
- addYear = 89 * 24 * 60 * 60 * 1000
227
- }
228
- } else if (month == 4) {
229
- addYear = 90 * 24 * 60 * 60 * 1000
230
- } else if (month == 7) {
231
- addYear = 91 * 24 * 60 * 60 * 1000
232
- } else {
233
- addYear = 91 * 24 * 60 * 60 * 1000
234
- }
235
- const NewDate = new Date(new Date(this.date).getTime() + addYear)
236
- $emit(this, 'change', NewDate)
237
- // 季度,从0开始
238
- let quarter = ''
239
- if (month > 0 && month < 4) {
240
- quarter = 1
241
- } else if (month > 3 && month < 7) {
242
- quarter = 2
243
- } else if (month > 6 && month < 10) {
244
- quarter = 3
245
- } else {
246
- quarter = 4
247
- }
248
- const fDate =
249
- NewDate.getFullYear() +
250
- this.$t('IntervalSelection.year') +
251
- 'Q' +
252
- quarter
253
- return fDate
254
- }
255
- },
256
- year() {
257
- return this.date.getFullYear()
258
- },
259
- yearLabel() {
260
- return this.year + this.$t('IntervalSelection.year')
261
- },
262
- parsedValue() {
263
- if (!this.value) {
264
- return this.value
265
- }
266
- if (isDateObject(this.value)) {
267
- return this.value
268
- }
269
- // 非时间格式且设置了valueFormat,进行时间转换
270
- if (this.valueFormat) {
271
- return parseDate(this.value, this.valueFormat)
272
- }
273
- // 非时间格式且未设置valueFormat,再尝试转换时间
274
- return new Date(this.value)
275
- },
276
- },
277
- watch: {
278
- value(value) {
279
- this.date = value ? this.parsedValue : new Date()
280
- },
281
- },
282
- methods: {
283
- getQuarter(date) {
284
- var month = new Date(date).getMonth()
285
- if (month < 3) {
286
- return 1
287
- } else if (month > 2 && month < 6) {
288
- return 2
289
- } else if (month > 5 && month < 9) {
290
- return 3
291
- } else if (month > 8 && month < 11) {
292
- return 4
293
- }
294
- },
295
- handleMouseEnter() {
296
- if (this.disabled) return
297
- if (this.value && this.clearable) {
298
- this.showClose = true
299
- }
300
- },
301
- handleClickIcon(event) {
302
- if (this.disabled) return
303
- if (this.showClose) {
304
- $emit(this, 'update:value', null)
305
- $emit(this, 'change', null)
306
- this.showClose = false
307
- this.pickerVisible = false
308
- this.$refs.reference.blur()
309
- }
310
- },
311
- handleMousedownIcon(event) {
312
- // 阻止鼠标按下清空按钮,防止清空数据时季度选择面板闪现
313
- event.preventDefault()
314
- },
315
- handleTableClick(event) {
316
- let target = event.target
317
- if (target.tagName === 'A') {
318
- target = target.parentNode
319
- }
320
- if (target.tagName !== 'TD') return
321
- if (hasClass(target, 'disabled')) return
322
- const column = target.cellIndex
323
- const row = target.parentNode.rowIndex
324
- // 季度,从0开始
325
- const quarter = row * 2 + column
326
- // 季度开始月份,从0开始
327
- const month = quarter * 3
328
- let newDate = new Date(this.year, month, 1)
329
- if (this.valueFormat) {
330
- newDate = formatDate(newDate, this.valueFormat)
331
- }
332
- this.pickerVisible = false
333
- $emit(this, 'update:value', newDate)
334
- $emit(this, 'change', newDate)
335
- },
336
- prevYear() {
337
- this.date = prevYear(this.date)
338
- },
339
- nextYear() {
340
- this.date = nextYear(this.date)
341
- },
342
- getCellStyle(quarter) {
343
- const style = {}
344
- const today = new Date()
345
- const date = this.parsedValue ? this.parsedValue : today
346
- style.disabled =
347
- typeof this.disabledDate === 'function'
348
- ? datesInYearAndQuarter(this.year, quarter).every(this.disabledDate)
349
- : false
350
- // 当前选中的季度样式
351
- style.current =
352
- date.getFullYear() === this.year &&
353
- parseInt(date.getMonth() / 3) === quarter
354
- // 今日所在季度样式
355
- style.quarter =
356
- today.getFullYear() === this.year &&
357
- parseInt(today.getMonth() / 3) === quarter
358
- return style
359
- },
360
- },
361
- emits: ['change', 'update:value', , 'update:value'],
362
- }
363
- </script>
364
-
365
- <style>
366
- .lervor-quarter-picker {
367
- line-height: 30px;
368
- }
369
- .lervor-quarter-popover {
370
- padding: 0;
371
- }
372
- .lervor-quarter-table {
373
- font-size: 12px;
374
- margin: -1px;
375
- border-collapse: collapse;
376
- width: 100%;
377
- }
378
- .lervor-quarter-table td {
379
- text-align: center;
380
- padding: 10px 3px;
381
- cursor: pointer;
382
- }
383
- .lervor-quarter-table td .cell {
384
- height: 32px;
385
- display: block;
386
- line-height: 32px;
387
- color: #606266;
388
- margin: 0 auto;
389
- }
390
- .lervor-quarter-table td .cell:hover {
391
- color: #1890ff;
392
- }
393
- .lervor-quarter-table td.current:not(.disabled) .cell {
394
- color: #409eff;
395
- }
396
- .lervor-quarter-table td.quarter .cell {
397
- color: #409eff;
398
- font-weight: 700;
399
- }
400
- .lervor-quarter-table td.disabled .cell {
401
- background-color: #f5f7fa;
402
- cursor: not-allowed;
403
- color: #c0c4cc;
404
- }
405
- </style>
1
+ <template>
2
+ <el-popover
3
+ v-model="pickerVisible"
4
+ trigger="focus"
5
+ popper-class="lervor-quarter-popover"
6
+ :disabled="disabled"
7
+ >
8
+ <template v-if="endQuarterDate" v-slot:reference>
9
+ <el-input
10
+ ref="reference"
11
+ class="el-date-editor"
12
+ readonly
13
+ :disabled="disabled"
14
+ :size="size"
15
+ :placeholder="placeholder"
16
+ :model-value="endValue"
17
+ :validate-event="false"
18
+ style="width: 100%"
19
+ @mouseenter="handleMouseEnter"
20
+ @mouseleave="showClose = false"
21
+ >
22
+ <template v-slot:prefix>
23
+ <i class="el-input__icon" :class="triggerClass" />
24
+ </template>
25
+ <template v-slot:suffix>
26
+ <i
27
+ class="el-input__icon"
28
+ :class="[showClose ? '' + clearIcon : '']"
29
+ @click="handleClickIcon"
30
+ @mousedown="handleMousedownIcon"
31
+ />
32
+ </template>
33
+ </el-input>
34
+ </template>
35
+ <template v-else v-slot:reference>
36
+ <el-input
37
+ ref="reference"
38
+ class="el-date-editor"
39
+ readonly
40
+ :disabled="disabled"
41
+ :size="size"
42
+ :placeholder="placeholder"
43
+ :model-value="displayValue"
44
+ :validate-event="false"
45
+ style="width: 100%"
46
+ @mouseenter="handleMouseEnter"
47
+ @mouseleave="showClose = false"
48
+ >
49
+ <template v-slot:prefix>
50
+ <i class="el-input__icon" :class="triggerClass" />
51
+ </template>
52
+ <template v-slot:suffix>
53
+ <i
54
+ class="el-input__icon"
55
+ :class="[showClose ? '' + clearIcon : '']"
56
+ @click="handleClickIcon"
57
+ @mousedown="handleMousedownIcon"
58
+ />
59
+ </template>
60
+ </el-input>
61
+ </template>
62
+ <div class="lervor-quarter-picker">
63
+ <div class="el-date-picker__header el-date-picker__header--bordered">
64
+ <button
65
+ type="button"
66
+ aria-label="前一年"
67
+ class="el-picker-panel__icon-btn el-date-picker__prev-btn el-icon-d-arrow-left"
68
+ @click="prevYear"
69
+ />
70
+ <span role="button" class="el-date-picker__header-label">{{
71
+ yearLabel
72
+ }}</span>
73
+ <button
74
+ type="button"
75
+ aria-label="后一年"
76
+ class="el-picker-panel__icon-btn el-date-picker__next-btn el-icon-d-arrow-right"
77
+ @click="nextYear"
78
+ />
79
+ </div>
80
+ <div
81
+ class="el-picker-panel__content"
82
+ style="width: 100%; margin: 10px 15px"
83
+ >
84
+ <table class="lervor-quarter-table" @click="handleTableClick">
85
+ <tbody>
86
+ <tr>
87
+ <td class="available" :class="getCellStyle(0)">
88
+ <a class="cell">Q1</a>
89
+ </td>
90
+ <td class="available" :class="getCellStyle(1)">
91
+ <a class="cell">Q2</a>
92
+ </td>
93
+ </tr>
94
+ <tr>
95
+ <td class="available" :class="getCellStyle(2)">
96
+ <a class="cell">Q3</a>
97
+ </td>
98
+ <td class="available" :class="getCellStyle(3)">
99
+ <a class="cell">Q4</a>
100
+ </td>
101
+ </tr>
102
+ </tbody>
103
+ </table>
104
+ </div>
105
+ </div>
106
+ </el-popover>
107
+ </template>
108
+
109
+ <script>
110
+ import { $on, $off, $once, $emit } from '../../utils/gogocodeTransfer'
111
+ import {
112
+ formatDate,
113
+ prevYear,
114
+ nextYear,
115
+ range,
116
+ nextDate,
117
+ isDateObject,
118
+ parseDate,
119
+ } from '../../utils/date-util'
120
+ import { hasClass } from 'element-plus/lib/utils/index'
121
+
122
+ // 获取指定年份和季度的所有日期
123
+ const datesInYearAndQuarter = (year, quarter) => {
124
+ const numOfDays = getDayCountOfQuarter(year, quarter)
125
+ const firstDay = new Date(year, quarter * 3, 1)
126
+ return range(numOfDays).map((n) => nextDate(firstDay, n))
127
+ }
128
+
129
+ // 获取指定年份和季度总天数
130
+ const getDayCountOfQuarter = (year, quarter) => {
131
+ switch (quarter) {
132
+ case 0: // 第一季度包含二月,需要对是否闰年进行判断处理
133
+ if ((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0) {
134
+ return 91
135
+ } else {
136
+ return 90
137
+ }
138
+ case 1:
139
+ return 91
140
+ default:
141
+ return 92
142
+ }
143
+ }
144
+
145
+ export default {
146
+ name: 'QuarterPicker',
147
+ props: {
148
+ size: {
149
+ type: String,
150
+ default: 'medium',
151
+ },
152
+ format: String, // 显示在输入框中的格式,引入季度:q(阿拉伯数字)、Q(中文数字)
153
+ valueFormat: String,
154
+ placeholder: String,
155
+ prefixIcon: String,
156
+ clearIcon: {
157
+ type: String,
158
+ default: 'el-icon-circle-close',
159
+ },
160
+ disabled: Boolean,
161
+ clearable: {
162
+ type: Boolean,
163
+ default: true,
164
+ },
165
+ width: {
166
+ // 组件宽度
167
+ type: String,
168
+ default: '',
169
+ },
170
+ disabledDate: {}, // 不可用的日期
171
+ value: null,
172
+ endQuarterDate: {
173
+ type: Boolean,
174
+ default: false,
175
+ },
176
+ },
177
+ data() {
178
+ return {
179
+ showClose: false,
180
+ pickerVisible: false,
181
+ date: new Date(),
182
+ quarterText: ['一', '二', '三', '四'],
183
+ }
184
+ },
185
+ computed: {
186
+ triggerClass() {
187
+ return this.prefixIcon || 'el-icon-date'
188
+ },
189
+ displayValue() {
190
+ if (!this.value) {
191
+ return null
192
+ } else if (typeof this.value === 'number') {
193
+ const num = this.getQuarter(this.value)
194
+ const yearNum = new Date(this.value).getFullYear()
195
+ return yearNum + '年Q' + num
196
+ } else {
197
+ // 季度,从0开始
198
+ const quarter = parseInt(this.parsedValue.getMonth() / 3)
199
+ $emit(this, 'change', this.date)
200
+ return (
201
+ new Date(this.parsedValue).getFullYear() +
202
+ this.$t('IntervalSelection.year') +
203
+ 'Q' +
204
+ (quarter + 1)
205
+ )
206
+ }
207
+ },
208
+ endValue() {
209
+ if (!this.value) {
210
+ return null
211
+ } else if (typeof this.value === 'number') {
212
+ const num = this.getQuarter(this.value)
213
+ const yearNum = new Date(this.value).getFullYear()
214
+ return yearNum + this.$t('IntervalSelection.year') + 'Q' + num
215
+ } else {
216
+ console.log(this.value)
217
+ const month = this.date.getMonth() + 1
218
+ const year = this.date.getFullYear()
219
+ let addYear = ''
220
+ if (month == 1) {
221
+ if ((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0) {
222
+ // 是闰年
223
+ addYear = 90 * 24 * 60 * 60 * 1000
224
+ } else {
225
+ // 不是闰年
226
+ addYear = 89 * 24 * 60 * 60 * 1000
227
+ }
228
+ } else if (month == 4) {
229
+ addYear = 90 * 24 * 60 * 60 * 1000
230
+ } else if (month == 7) {
231
+ addYear = 91 * 24 * 60 * 60 * 1000
232
+ } else {
233
+ addYear = 91 * 24 * 60 * 60 * 1000
234
+ }
235
+ const NewDate = new Date(new Date(this.date).getTime() + addYear)
236
+ $emit(this, 'change', NewDate)
237
+ // 季度,从0开始
238
+ let quarter = ''
239
+ if (month > 0 && month < 4) {
240
+ quarter = 1
241
+ } else if (month > 3 && month < 7) {
242
+ quarter = 2
243
+ } else if (month > 6 && month < 10) {
244
+ quarter = 3
245
+ } else {
246
+ quarter = 4
247
+ }
248
+ const fDate =
249
+ NewDate.getFullYear() +
250
+ this.$t('IntervalSelection.year') +
251
+ 'Q' +
252
+ quarter
253
+ return fDate
254
+ }
255
+ },
256
+ year() {
257
+ return this.date.getFullYear()
258
+ },
259
+ yearLabel() {
260
+ return this.year + this.$t('IntervalSelection.year')
261
+ },
262
+ parsedValue() {
263
+ if (!this.value) {
264
+ return this.value
265
+ }
266
+ if (isDateObject(this.value)) {
267
+ return this.value
268
+ }
269
+ // 非时间格式且设置了valueFormat,进行时间转换
270
+ if (this.valueFormat) {
271
+ return parseDate(this.value, this.valueFormat)
272
+ }
273
+ // 非时间格式且未设置valueFormat,再尝试转换时间
274
+ return new Date(this.value)
275
+ },
276
+ },
277
+ watch: {
278
+ value(value) {
279
+ this.date = value ? this.parsedValue : new Date()
280
+ },
281
+ },
282
+ methods: {
283
+ getQuarter(date) {
284
+ var month = new Date(date).getMonth()
285
+ if (month < 3) {
286
+ return 1
287
+ } else if (month > 2 && month < 6) {
288
+ return 2
289
+ } else if (month > 5 && month < 9) {
290
+ return 3
291
+ } else if (month > 8 && month < 11) {
292
+ return 4
293
+ }
294
+ },
295
+ handleMouseEnter() {
296
+ if (this.disabled) return
297
+ if (this.value && this.clearable) {
298
+ this.showClose = true
299
+ }
300
+ },
301
+ handleClickIcon(event) {
302
+ if (this.disabled) return
303
+ if (this.showClose) {
304
+ $emit(this, 'update:value', null)
305
+ $emit(this, 'change', null)
306
+ this.showClose = false
307
+ this.pickerVisible = false
308
+ this.$refs.reference.blur()
309
+ }
310
+ },
311
+ handleMousedownIcon(event) {
312
+ // 阻止鼠标按下清空按钮,防止清空数据时季度选择面板闪现
313
+ event.preventDefault()
314
+ },
315
+ handleTableClick(event) {
316
+ let target = event.target
317
+ if (target.tagName === 'A') {
318
+ target = target.parentNode
319
+ }
320
+ if (target.tagName !== 'TD') return
321
+ if (hasClass(target, 'disabled')) return
322
+ const column = target.cellIndex
323
+ const row = target.parentNode.rowIndex
324
+ // 季度,从0开始
325
+ const quarter = row * 2 + column
326
+ // 季度开始月份,从0开始
327
+ const month = quarter * 3
328
+ let newDate = new Date(this.year, month, 1)
329
+ if (this.valueFormat) {
330
+ newDate = formatDate(newDate, this.valueFormat)
331
+ }
332
+ this.pickerVisible = false
333
+ $emit(this, 'update:value', newDate)
334
+ $emit(this, 'change', newDate)
335
+ },
336
+ prevYear() {
337
+ this.date = prevYear(this.date)
338
+ },
339
+ nextYear() {
340
+ this.date = nextYear(this.date)
341
+ },
342
+ getCellStyle(quarter) {
343
+ const style = {}
344
+ const today = new Date()
345
+ const date = this.parsedValue ? this.parsedValue : today
346
+ style.disabled =
347
+ typeof this.disabledDate === 'function'
348
+ ? datesInYearAndQuarter(this.year, quarter).every(this.disabledDate)
349
+ : false
350
+ // 当前选中的季度样式
351
+ style.current =
352
+ date.getFullYear() === this.year &&
353
+ parseInt(date.getMonth() / 3) === quarter
354
+ // 今日所在季度样式
355
+ style.quarter =
356
+ today.getFullYear() === this.year &&
357
+ parseInt(today.getMonth() / 3) === quarter
358
+ return style
359
+ },
360
+ },
361
+ emits: ['change', 'update:value', , 'update:value'],
362
+ }
363
+ </script>
364
+
365
+ <style>
366
+ .lervor-quarter-picker {
367
+ line-height: 30px;
368
+ }
369
+ .lervor-quarter-popover {
370
+ padding: 0;
371
+ }
372
+ .lervor-quarter-table {
373
+ font-size: 12px;
374
+ margin: -1px;
375
+ border-collapse: collapse;
376
+ width: 100%;
377
+ }
378
+ .lervor-quarter-table td {
379
+ text-align: center;
380
+ padding: 10px 3px;
381
+ cursor: pointer;
382
+ }
383
+ .lervor-quarter-table td .cell {
384
+ height: 32px;
385
+ display: block;
386
+ line-height: 32px;
387
+ color: #606266;
388
+ margin: 0 auto;
389
+ }
390
+ .lervor-quarter-table td .cell:hover {
391
+ color: #1890ff;
392
+ }
393
+ .lervor-quarter-table td.current:not(.disabled) .cell {
394
+ color: #409eff;
395
+ }
396
+ .lervor-quarter-table td.quarter .cell {
397
+ color: #409eff;
398
+ font-weight: 700;
399
+ }
400
+ .lervor-quarter-table td.disabled .cell {
401
+ background-color: #f5f7fa;
402
+ cursor: not-allowed;
403
+ color: #c0c4cc;
404
+ }
405
+ </style>