sh-view 2.0.8 → 2.2.0

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 (129) hide show
  1. package/package.json +9 -13
  2. package/packages/components/global-components/sh-alert/index.vue +175 -173
  3. package/packages/components/global-components/sh-badge/index.vue +57 -43
  4. package/packages/components/global-components/sh-card/index.vue +24 -16
  5. package/packages/components/global-components/sh-code-editor/index.vue +250 -260
  6. package/packages/components/global-components/sh-col/index.vue +44 -36
  7. package/packages/components/global-components/sh-corner/index.vue +230 -228
  8. package/packages/components/global-components/sh-count-to/index.vue +60 -51
  9. package/packages/components/global-components/sh-drawer/index.vue +216 -183
  10. package/packages/components/global-components/sh-drawer/scrollbar.js +44 -42
  11. package/packages/components/global-components/sh-empty/index.vue +0 -1
  12. package/packages/components/global-components/sh-form/form.vue +110 -0
  13. package/packages/components/global-components/sh-form/js/props.js +76 -63
  14. package/packages/components/global-components/sh-form/js/useForm.js +236 -0
  15. package/packages/components/global-components/sh-form/query.vue +70 -0
  16. package/packages/components/global-components/sh-header/index.vue +35 -50
  17. package/packages/components/global-components/sh-icon/css/index.scss +44 -0
  18. package/packages/components/global-components/sh-icon/index.vue +24 -11
  19. package/packages/components/global-components/sh-image/index.vue +47 -38
  20. package/packages/components/global-components/sh-list/index.vue +42 -37
  21. package/packages/components/global-components/sh-loading/index.vue +12 -8
  22. package/packages/components/global-components/sh-modal/index.vue +49 -40
  23. package/packages/components/global-components/sh-noticebar/index.vue +68 -54
  24. package/packages/components/global-components/sh-poptip/index.vue +247 -130
  25. package/packages/components/global-components/sh-progress/index.vue +71 -69
  26. package/packages/components/global-components/sh-pull-refresh/index.vue +156 -157
  27. package/packages/components/global-components/sh-result/index.vue +37 -28
  28. package/packages/components/global-components/sh-row/index.vue +21 -18
  29. package/packages/components/global-components/sh-split/index.vue +115 -109
  30. package/packages/components/global-components/sh-table/components/importModal.vue +95 -86
  31. package/packages/components/global-components/sh-table/components/sh-column.vue +54 -0
  32. package/packages/components/global-components/sh-table/{index.vue → grid.vue} +34 -145
  33. package/packages/components/global-components/sh-table/js/tableMethods.js +175 -0
  34. package/packages/components/global-components/sh-table/js/useTable.js +592 -0
  35. package/packages/components/global-components/sh-table/table.vue +269 -0
  36. package/packages/components/global-components/sh-tabs/index.vue +118 -93
  37. package/packages/components/global-components/sh-tag/index.vue +52 -51
  38. package/packages/components/global-components/sh-toolbar/index.vue +53 -47
  39. package/packages/components/global-components/sh-tree/components/table-tree.vue +152 -139
  40. package/packages/components/global-components/sh-tree/index.vue +218 -195
  41. package/packages/components/global-components/sh-tree/mixin/treeProps.js +118 -120
  42. package/packages/components/global-components/sh-upload/index.vue +308 -51
  43. package/packages/components/global-components/sh-water-fall/index.vue +4 -11
  44. package/packages/components/index.js +5 -3
  45. package/packages/components/other-components/sh-cron-modal/components/cron-content.vue +294 -287
  46. package/packages/components/other-components/sh-cron-modal/css/index.scss +0 -5
  47. package/packages/components/other-components/sh-cron-modal/index.vue +81 -67
  48. package/packages/components/other-components/sh-cron-modal/mixin/cron-emits.js +1 -0
  49. package/packages/components/other-components/sh-cron-modal/mixin/cron-hooks.js +179 -0
  50. package/packages/components/other-components/sh-cron-modal/mixin/cron-props.js +9 -0
  51. package/packages/components/other-components/sh-cron-modal/tabs/cron-day-box.vue +101 -92
  52. package/packages/components/other-components/sh-cron-modal/tabs/cron-hour-box.vue +68 -56
  53. package/packages/components/other-components/sh-cron-modal/tabs/cron-minute-box.vue +68 -56
  54. package/packages/components/other-components/sh-cron-modal/tabs/cron-month-box.vue +68 -56
  55. package/packages/components/other-components/sh-cron-modal/tabs/cron-second-box.vue +68 -56
  56. package/packages/components/other-components/sh-cron-modal/tabs/cron-week-box.vue +126 -115
  57. package/packages/components/other-components/sh-cron-modal/tabs/cron-year-box.vue +59 -46
  58. package/packages/components/other-components/sh-menu/index.vue +75 -60
  59. package/packages/components/other-components/sh-menu/menu-group-content.vue +71 -59
  60. package/packages/components/other-components/sh-menu/menu-item-content.vue +71 -61
  61. package/packages/components/other-components/sh-menu-card/index.vue +81 -59
  62. package/packages/components/other-components/sh-menu-card/menu-box.vue +87 -68
  63. package/packages/components/other-components/sh-preview/components/sh-excel.vue +182 -0
  64. package/packages/components/other-components/sh-preview/components/sh-word.vue +73 -0
  65. package/packages/components/other-components/sh-preview/index.vue +86 -85
  66. package/packages/components/other-components/sh-preview/js/data-hook.js +37 -0
  67. package/packages/components/other-components/sh-preview/js/data-props.js +11 -0
  68. package/packages/components/other-components/sh-system-tip/index.vue +115 -113
  69. package/packages/css/index.js +4 -4
  70. package/packages/{assets/css → css}/main.scss +2 -50
  71. package/packages/{assets/css → css}/theme.scss +35 -16
  72. package/packages/directive/module/prevent-click.js +1 -1
  73. package/packages/directive/module/resize.js +11 -154
  74. package/packages/index.js +39 -39
  75. package/packages/mixin/index.js +86 -87
  76. package/packages/vxeTable/css/index.scss +3 -0
  77. package/packages/vxeTable/render/cell/vxe-render-checkbox.vue +14 -5
  78. package/packages/vxeTable/render/cell/vxe-render-checkgroup.vue +43 -36
  79. package/packages/vxeTable/render/cell/vxe-render-code.vue +14 -5
  80. package/packages/vxeTable/render/cell/vxe-render-goption.vue +34 -24
  81. package/packages/vxeTable/render/cell/vxe-render-href.vue +21 -11
  82. package/packages/vxeTable/render/cell/vxe-render-img.vue +16 -10
  83. package/packages/vxeTable/render/cell/vxe-render-input.vue +83 -67
  84. package/packages/vxeTable/render/cell/vxe-render-money.vue +14 -6
  85. package/packages/vxeTable/render/cell/vxe-render-progress.vue +28 -19
  86. package/packages/vxeTable/render/cell/vxe-render-radio.vue +14 -5
  87. package/packages/vxeTable/render/cell/vxe-render-radiogroup.vue +43 -36
  88. package/packages/vxeTable/render/cell/vxe-render-select.vue +44 -36
  89. package/packages/vxeTable/render/cell/vxe-render-switch.vue +14 -5
  90. package/packages/vxeTable/render/cell/vxe-render-table.vue +51 -78
  91. package/packages/vxeTable/render/cell/vxe-render-textarea.vue +14 -5
  92. package/packages/vxeTable/render/cell/vxe-render-time.vue +23 -13
  93. package/packages/vxeTable/render/cell/vxe-render-tree.vue +23 -27
  94. package/packages/vxeTable/render/cell/vxe-render-upload.vue +11 -7
  95. package/packages/vxeTable/render/filters/vxe-filter-input.vue +25 -43
  96. package/packages/vxeTable/render/footer/vxe-footer-input.vue +23 -13
  97. package/packages/vxeTable/render/footer/vxe-footer-money.vue +30 -20
  98. package/packages/vxeTable/render/globalRenders.jsx +1 -1
  99. package/packages/vxeTable/render/header/vxe-header-money.vue +31 -21
  100. package/packages/vxeTable/render/mixin/cell-hooks.js +162 -0
  101. package/packages/vxeTable/render/mixin/cell-props.js +23 -0
  102. package/packages/vxeTable/render/mixin/filter-hooks.js +28 -0
  103. package/packages/components/global-components/sh-form/components/form-item.vue +0 -25
  104. package/packages/components/global-components/sh-form/css/index.scss +0 -55
  105. package/packages/components/global-components/sh-form/index.vue +0 -114
  106. package/packages/components/global-components/sh-form/js/methods.js +0 -146
  107. package/packages/components/global-components/sh-form/mixin/defaultData.js +0 -32
  108. package/packages/components/global-components/sh-icon/css/default/index.scss +0 -27
  109. package/packages/components/global-components/sh-icon/css/font/index.scss +0 -16
  110. package/packages/components/global-components/sh-icon/icon-default.vue +0 -32
  111. package/packages/components/global-components/sh-icon/icon-font.vue +0 -32
  112. package/packages/components/global-components/sh-poptip/popper.js +0 -115
  113. package/packages/components/global-components/sh-query/index.vue +0 -317
  114. package/packages/components/global-components/sh-table/js/methods.js +0 -549
  115. package/packages/components/global-components/sh-table/mixin/defaultData.js +0 -94
  116. package/packages/components/global-components/sh-upload/js/mixin.js +0 -257
  117. package/packages/components/other-components/sh-cron-modal/mixin/cron-box.js +0 -169
  118. package/packages/vxeTable/render/mixin/cell-mixin.js +0 -206
  119. /package/packages/components/global-components/sh-icon/css/default/{fonts/ionicons.svg → ionicons.svg} +0 -0
  120. /package/packages/components/global-components/sh-icon/css/default/{fonts/ionicons.ttf → ionicons.ttf} +0 -0
  121. /package/packages/components/global-components/sh-icon/css/default/{fonts/ionicons.woff → ionicons.woff} +0 -0
  122. /package/packages/components/global-components/sh-icon/css/default/{fonts/ionicons.woff2 → ionicons.woff2} +0 -0
  123. /package/packages/components/global-components/sh-icon/css/font/{fonts/iconfont.js → iconfont.js} +0 -0
  124. /package/packages/components/global-components/sh-icon/css/font/{fonts/iconfont.json → iconfont.json} +0 -0
  125. /package/packages/components/global-components/sh-icon/css/font/{fonts/iconfont.ttf → iconfont.ttf} +0 -0
  126. /package/packages/components/global-components/sh-icon/css/font/{fonts/iconfont.woff → iconfont.woff} +0 -0
  127. /package/packages/components/global-components/sh-icon/css/font/{fonts/iconfont.woff2 → iconfont.woff2} +0 -0
  128. /package/packages/{assets/css → css}/animated.scss +0 -0
  129. /package/packages/{assets/css → css}/loader.scss +0 -0
@@ -1,287 +1,294 @@
1
- <template>
2
- <div class="sh-cron-content">
3
- <Tabs v-model="activeKey" :size="`small`">
4
- <template v-for="tab in cronTabList" :key="tab.name">
5
- <TabPane v-bind="tab"></TabPane>
6
- </template>
7
- </Tabs>
8
- <template v-if="activeKey === 'second'">
9
- <cronSecondBox v-model="second" :disabled="disabled" />
10
- </template>
11
- <template v-else-if="activeKey === 'minute'">
12
- <cronMinuteBox v-model="minute" :disabled="disabled" />
13
- </template>
14
- <template v-else-if="activeKey === 'hour'">
15
- <cronHourBox v-model="hour" :disabled="disabled" />
16
- </template>
17
- <template v-else-if="activeKey === 'day'">
18
- <cronDayBox v-model="day" :week="week" :disabled="disabled" />
19
- </template>
20
- <template v-else-if="activeKey === 'month'">
21
- <cronMonthBox v-model="month" :disabled="disabled" />
22
- </template>
23
- <template v-else-if="activeKey === 'week'">
24
- <cronWeekBox v-model="week" :day="day" :disabled="disabled" />
25
- </template>
26
- <template v-else-if="activeKey === 'year'">
27
- <cronYearBox v-model="year" :disabled="disabled" />
28
- </template>
29
- <!-- 执行时间预览 -->
30
- <vxe-grid v-bind="tableConfig" @edit-closed="onTableEditClosed" @header-cell-click="onTableHeaderClick">
31
- <template #bottom>
32
- <!-- cron错误提示 -->
33
- <Alert v-if="errMessage" type="error" show-icon>
34
- <span>表达式错误,请检查</span>
35
- <template #desc>{{ errMessage }}</template>
36
- </Alert>
37
- <template v-else>
38
- <div class="cron-title">近十次执行时间(不含年)</div>
39
- <vxe-textarea v-model="preTimeList" :rows="5" disabled />
40
- </template>
41
- </template>
42
- </vxe-grid>
43
- </div>
44
- </template>
45
-
46
- <script>
47
- import cronSecondBox from '../tabs/cron-second-box.vue'
48
- import cronMinuteBox from '../tabs/cron-minute-box.vue'
49
- import cronHourBox from '../tabs/cron-hour-box.vue'
50
- import cronDayBox from '../tabs/cron-day-box.vue'
51
- import cronMonthBox from '../tabs/cron-month-box.vue'
52
- import cronWeekBox from '../tabs/cron-week-box.vue'
53
- import cronYearBox from '../tabs/cron-year-box.vue'
54
- import cronUtils from '../utils'
55
- export default {
56
- name: 'CronContent',
57
- components: {
58
- cronSecondBox,
59
- cronMinuteBox,
60
- cronHourBox,
61
- cronDayBox,
62
- cronMonthBox,
63
- cronWeekBox,
64
- cronYearBox
65
- },
66
- props: {
67
- modelValue: {
68
- type: String,
69
- default: ''
70
- },
71
- disabled: {
72
- type: Boolean
73
- },
74
- hideSecond: {
75
- type: Boolean
76
- },
77
- hideYear: {
78
- type: Boolean
79
- },
80
- remote: {
81
- type: Function
82
- }
83
- },
84
- emits: ['update:modelValue', 'change'],
85
- data() {
86
- return {
87
- activeKey: this.hideSecond ? 'minute' : 'second',
88
- second: '*',
89
- minute: '*',
90
- hour: '*',
91
- day: '*',
92
- month: '*',
93
- week: '?',
94
- year: '*',
95
- tableConfig: {
96
- align: 'center',
97
- columns: [
98
- { title: '秒', field: 'second', editRender: { name: '$input' } },
99
- { title: '分', field: 'minute', editRender: { name: '$input' } },
100
- { title: '时', field: 'hour', editRender: { name: '$input' } },
101
- { title: '日', field: 'day', editRender: { name: '$input' } },
102
- { title: '月', field: 'month', editRender: { name: '$input' } },
103
- { title: '周', field: 'week', editRender: { name: '$input' } },
104
- { title: '年', field: 'year', editRender: { name: '$input' } }
105
- ],
106
- data: [],
107
- editConfig: {
108
- enable: !this.disabled
109
- }
110
- },
111
- preTimeList: '执行预览,会忽略年份参数。',
112
- errMessage: '',
113
- calTriggerList: this.$vUtils.debounce(this.calTriggerListInner, 500)
114
- }
115
- },
116
- computed: {
117
- cronTabList() {
118
- let list = [
119
- { name: 'second', label: '' },
120
- { name: 'minute', label: '' },
121
- { name: 'hour', label: '' },
122
- { name: 'day', label: '' },
123
- { name: 'month', label: '月' },
124
- { name: 'week', label: '周' },
125
- { name: 'year', label: '' }
126
- ]
127
- if (this.hideSecond) {
128
- list = list.filter(item => !['second', 'year'].includes(item.name))
129
- } else if (this.hideYear) {
130
- list = list.filter(item => !['year'].includes(item.name))
131
- }
132
- return list
133
- },
134
- cronValueInner() {
135
- let { hideSecond, hideYear, second, minute, hour, day, month, week, year } = this
136
- let result = []
137
- if (!hideSecond) {
138
- result.push(second ? second : '*')
139
- }
140
- result.push(minute ? minute : '*')
141
- result.push(hour ? hour : '*')
142
- result.push(day ? day : '*')
143
- result.push(month ? month : '*')
144
- result.push(week ? week : '?')
145
- if (!hideYear && !hideSecond) result.push(year ? year : '*')
146
- return result.join(' ')
147
- },
148
- cronValueNoYear() {
149
- const v = this.cronValueInner
150
- if (this.hideYear || this.hideSecond) return v
151
- const vs = v.split(' ')
152
- if (vs.length >= 6) {
153
- // 转成 Quartz 的规则
154
- vs[5] = this.convertWeekToQuartz(vs[5])
155
- }
156
- return vs.slice(0, vs.length - 1).join(' ')
157
- }
158
- },
159
- watch: {
160
- modelValue(nv) {
161
- if (nv === this.cronValueInner) {
162
- return
163
- }
164
- this.formatValue()
165
- },
166
- cronValueInner(nv) {
167
- this.calTriggerList()
168
- this.emitValue(nv)
169
- this.assignTable()
170
- }
171
- },
172
- created() {
173
- this.assignTable()
174
- this.formatValue()
175
- this.calTriggerListInner()
176
- },
177
- methods: {
178
- formatValue() {
179
- let { modelValue, hideSecond } = this
180
- if (!modelValue) return
181
- const values = modelValue.split(' ').filter(item => !!item)
182
- if (!values || values.length <= 0) return
183
- let i = 0
184
- if (!hideSecond) this.second = values[i++]
185
- if (values.length > i) this.minute = values[i++]
186
- if (values.length > i) this.hour = values[i++]
187
- if (values.length > i) this.day = values[i++]
188
- if (values.length > i) this.month = values[i++]
189
- if (values.length > i) this.week = values[i++]
190
- if (values.length > i) this.year = values[i]
191
- this.assignTable()
192
- },
193
- assignTable() {
194
- this.tableConfig.data = [
195
- {
196
- second: this.second,
197
- minute: this.minute,
198
- hour: this.hour,
199
- day: this.day,
200
- month: this.month,
201
- week: this.week,
202
- year: this.year
203
- }
204
- ]
205
- },
206
- calTriggerListInner() {
207
- this.errMessage = ''
208
- // 设置了回调函数
209
- if (this.remote) {
210
- this.remote(this.cronValueInner, +new Date(), v => {
211
- this.preTimeList = v
212
- })
213
- return
214
- }
215
- try {
216
- const format = 'yyyy-MM-dd hh:mm:ss'
217
- const options = {
218
- currentDate: this.$vUtils.toDateString(new Date(), format)
219
- }
220
- const iter = cronUtils.parse(this.cronValueNoYear, options)
221
- const result = []
222
- for (let i = 1; i <= 10; i++) {
223
- result.push(this.$vUtils.toDateString(new Date(iter.next()), format))
224
- }
225
- this.preTimeList = result.length > 0 ? result.join('\n') : '无执行时间'
226
- } catch (e) {
227
- this.errMessage = e
228
- }
229
- },
230
- // Quartz 的规则:
231
- // 1 = 周日,2 = 周一,3 = 周二,4 = 周三,5 = 周四,6 = 周五,7 = 周六
232
- convertWeekToQuartz(week) {
233
- let convert = v => {
234
- if (v === '0') {
235
- return '1'
236
- }
237
- if (v === '1') {
238
- return '0'
239
- }
240
- return (Number.parseInt(v) - 1).toString()
241
- }
242
- // 匹配示例 1-7 or 1/7
243
- let patten1 = /^([0-7])([-/])([0-7])$/
244
- // 匹配示例 1,4,7
245
- let patten2 = /^([0-7])(,[0-7])+$/
246
- if (/^[0-7]$/.test(week)) {
247
- return convert(week)
248
- } else if (patten1.test(week)) {
249
- return week.replace(patten1, ($0, before, separator, after) => {
250
- if (separator === '/') {
251
- return convert(before) + separator + after
252
- } else {
253
- return convert(before) + separator + convert(after)
254
- }
255
- })
256
- } else if (patten2.test(week)) {
257
- return week
258
- .split(',')
259
- .map(v => convert(v))
260
- .join(',')
261
- }
262
- return week
263
- },
264
- onTableHeaderClick({ column }) {
265
- this.activeKey = column.property
266
- },
267
- onTableEditClosed({ row, column }) {
268
- this.second = row.second
269
- this.minute = row.minute
270
- this.hour = row.hour
271
- this.day = row.day
272
- this.month = row.month
273
- this.week = row.week
274
- this.year = row.year
275
- },
276
- onInputCronBlur(event) {
277
- this.emitValue(event.target.value)
278
- },
279
- emitValue(value) {
280
- this.$emit('change', value)
281
- this.$emit('update:modelValue', value)
282
- }
283
- }
284
- }
285
- </script>
286
-
287
- <style scoped></style>
1
+ <template>
2
+ <div class="sh-cron-content">
3
+ <sh-tabs v-model="activeKey" size="small" :options="cronTabList" :is-content="false"></sh-tabs>
4
+ <template v-if="activeKey === 'second'">
5
+ <cronSecondBox v-model="second" :disabled="disabled" />
6
+ </template>
7
+ <template v-else-if="activeKey === 'minute'">
8
+ <cronMinuteBox v-model="minute" :disabled="disabled" />
9
+ </template>
10
+ <template v-else-if="activeKey === 'hour'">
11
+ <cronHourBox v-model="hour" :disabled="disabled" />
12
+ </template>
13
+ <template v-else-if="activeKey === 'day'">
14
+ <cronDayBox v-model="day" :week="week" :disabled="disabled" />
15
+ </template>
16
+ <template v-else-if="activeKey === 'month'">
17
+ <cronMonthBox v-model="month" :disabled="disabled" />
18
+ </template>
19
+ <template v-else-if="activeKey === 'week'">
20
+ <cronWeekBox v-model="week" :day="day" :disabled="disabled" />
21
+ </template>
22
+ <template v-else-if="activeKey === 'year'">
23
+ <cronYearBox v-model="year" :disabled="disabled" />
24
+ </template>
25
+ <!-- 执行时间预览 -->
26
+ <vxe-grid v-bind="tableConfig" @edit-closed="onTableEditClosed" @header-cell-click="onTableHeaderClick">
27
+ <template #bottom>
28
+ <!-- cron错误提示 -->
29
+ <sh-alert v-if="errMessage" type="error" show-icon>
30
+ <span>表达式错误,请检查</span>
31
+ <template #desc>{{ errMessage }}</template>
32
+ </sh-alert>
33
+ <template v-else>
34
+ <div class="cron-title">近十次执行时间(不含年)</div>
35
+ <vxe-textarea v-model="preTimeList" :rows="5" disabled />
36
+ </template>
37
+ </template>
38
+ </vxe-grid>
39
+ </div>
40
+ </template>
41
+
42
+ <script>
43
+ import { defineComponent, computed, getCurrentInstance, ref, reactive, watch, onBeforeMount } from 'vue'
44
+ import cronSecondBox from '../tabs/cron-second-box.vue'
45
+ import cronMinuteBox from '../tabs/cron-minute-box.vue'
46
+ import cronHourBox from '../tabs/cron-hour-box.vue'
47
+ import cronDayBox from '../tabs/cron-day-box.vue'
48
+ import cronMonthBox from '../tabs/cron-month-box.vue'
49
+ import cronWeekBox from '../tabs/cron-week-box.vue'
50
+ import cronYearBox from '../tabs/cron-year-box.vue'
51
+ import cronUtils from '../utils'
52
+ export default defineComponent({
53
+ name: 'CronContent',
54
+ components: {
55
+ cronSecondBox,
56
+ cronMinuteBox,
57
+ cronHourBox,
58
+ cronDayBox,
59
+ cronMonthBox,
60
+ cronWeekBox,
61
+ cronYearBox
62
+ },
63
+ props: {
64
+ modelValue: {
65
+ type: String,
66
+ default: ''
67
+ },
68
+ disabled: {
69
+ type: Boolean
70
+ },
71
+ hideSecond: {
72
+ type: Boolean
73
+ },
74
+ hideYear: {
75
+ type: Boolean
76
+ },
77
+ remote: {
78
+ type: Function
79
+ }
80
+ },
81
+ emits: ['update:modelValue', 'change'],
82
+ setup(props, context) {
83
+ const { proxy } = getCurrentInstance()
84
+ const { $vUtils } = proxy
85
+ const { emit, slots } = context
86
+
87
+ const activeKey = ref(props.hideSecond ? 'minute' : 'second')
88
+ const second = ref('*')
89
+ const minute = ref('*')
90
+ const hour = ref('*')
91
+ const day = ref('*')
92
+ const month = ref('*')
93
+ const week = ref('*')
94
+ const year = ref('*')
95
+ const tableConfig = reactive({
96
+ align: 'center',
97
+ columns: [
98
+ { title: '秒', field: 'second', editRender: { name: '$input' } },
99
+ { title: '分', field: 'minute', editRender: { name: '$input' } },
100
+ { title: '时', field: 'hour', editRender: { name: '$input' } },
101
+ { title: '日', field: 'day', editRender: { name: '$input' } },
102
+ { title: '月', field: 'month', editRender: { name: '$input' } },
103
+ { title: '周', field: 'week', editRender: { name: '$input' } },
104
+ { title: '年', field: 'year', editRender: { name: '$input' } }
105
+ ],
106
+ data: [],
107
+ editConfig: {
108
+ enable: !props.disabled
109
+ }
110
+ })
111
+ const preTimeList = ref('执行预览,会忽略年份参数。')
112
+ const errMessage = ref('')
113
+
114
+ const cronTabList = computed(() => {
115
+ let list = [
116
+ { value: 'second', label: '秒' },
117
+ { value: 'minute', label: '分' },
118
+ { value: 'hour', label: '时' },
119
+ { value: 'day', label: '' },
120
+ { value: 'month', label: '' },
121
+ { value: 'week', label: '' },
122
+ { value: 'year', label: '' }
123
+ ]
124
+ if (props.hideSecond) {
125
+ list = list.filter(item => !['second', 'year'].includes(item.value))
126
+ } else if (props.hideYear) {
127
+ list = list.filter(item => !['year'].includes(item.value))
128
+ }
129
+ return list
130
+ })
131
+ const cronValueInner = computed(() => {
132
+ let result = []
133
+ if (!props.hideSecond) {
134
+ result.push(second.value || '*')
135
+ }
136
+ result.push(minute.value || '*')
137
+ result.push(hour.value || '*')
138
+ result.push(day.value || '*')
139
+ result.push(month.value || '*')
140
+ result.push(week.value || '?')
141
+ if (!props.hideYear && !props.hideSecond) result.push(year.value || '*')
142
+ return result.join(' ')
143
+ })
144
+ const cronValueNoYear = computed(() => {
145
+ const v = cronValueInner.value
146
+ if (props.hideYear || props.hideSecond) return v
147
+ const vs = v.split(' ')
148
+ if (vs.length >= 6) {
149
+ // 转成 Quartz 的规则
150
+ vs[5] = convertWeekToQuartz(vs[5])
151
+ }
152
+ return vs.slice(0, vs.length - 1).join(' ')
153
+ })
154
+
155
+ const formatValue = () => {
156
+ let { modelValue, hideSecond } = props
157
+ if (!modelValue) return
158
+ const values = modelValue.split(' ').filter(item => !!item)
159
+ if (!values || values.length <= 0) return
160
+ let i = 0
161
+ if (!hideSecond) second.value = values[i++]
162
+ if (values.length > i) minute.value = values[i++]
163
+ if (values.length > i) hour.value = values[i++]
164
+ if (values.length > i) day.value = values[i++]
165
+ if (values.length > i) month.value = values[i++]
166
+ if (values.length > i) week.value = values[i++]
167
+ if (values.length > i) year.value = values[i]
168
+ assignTable()
169
+ }
170
+ const assignTable = () => {
171
+ tableConfig.data = [{ second: second.value, minute: minute.value, hour: hour.value, day: day.value, month: month.value, week: week.value, year: year.value }]
172
+ }
173
+ const calTriggerListInner = () => {
174
+ errMessage.value = ''
175
+ // 设置了回调函数
176
+ if (props.remote) {
177
+ props.remote(cronValueInner.value, +new Date(), v => {
178
+ preTimeList.value = v
179
+ })
180
+ return
181
+ }
182
+ try {
183
+ const format = 'yyyy-MM-dd hh:mm:ss'
184
+ const options = {
185
+ currentDate: $vUtils.toDateString(new Date(), format)
186
+ }
187
+ const iter = cronUtils.parse(cronValueNoYear.value, options)
188
+ const result = []
189
+ for (let i = 1; i <= 10; i++) {
190
+ result.push($vUtils.toDateString(new Date(iter.next()), format))
191
+ }
192
+ preTimeList.value = result.length > 0 ? result.join('\n') : '无执行时间'
193
+ } catch (e) {
194
+ errMessage.value = e
195
+ }
196
+ }
197
+ // Quartz 的规则:
198
+ // 1 = 周日,2 = 周一,3 = 周二,4 = 周三,5 = 周四,6 = 周五,7 = 周六
199
+ const convertWeekToQuartz = week => {
200
+ let convert = v => {
201
+ if (v === '0') {
202
+ return '1'
203
+ }
204
+ if (v === '1') {
205
+ return '0'
206
+ }
207
+ return (Number.parseInt(v) - 1).toString()
208
+ }
209
+ // 匹配示例 1-7 or 1/7
210
+ let patten1 = /^([0-7])([-/])([0-7])$/
211
+ // 匹配示例 1,4,7
212
+ let patten2 = /^([0-7])(,[0-7])+$/
213
+ if (/^[0-7]$/.test(week)) {
214
+ return convert(week)
215
+ } else if (patten1.test(week)) {
216
+ return week.replace(patten1, ($0, before, separator, after) => {
217
+ if (separator === '/') {
218
+ return convert(before) + separator + after
219
+ } else {
220
+ return convert(before) + separator + convert(after)
221
+ }
222
+ })
223
+ } else if (patten2.test(week)) {
224
+ return week
225
+ .split(',')
226
+ .map(v => convert(v))
227
+ .join(',')
228
+ }
229
+ return week
230
+ }
231
+ const onTableHeaderClick = ({ column }) => {
232
+ activeKey.value = column.property
233
+ }
234
+ const onTableEditClosed = ({ row, column }) => {
235
+ second.value = row.second
236
+ minute.value = row.minute
237
+ hour.value = row.hour
238
+ day.value = row.day
239
+ month.value = row.month
240
+ week.value = row.week
241
+ year.value = row.year
242
+ }
243
+ const emitValue = value => {
244
+ emit('change', value)
245
+ emit('update:modelValue', value)
246
+ }
247
+
248
+ const calTriggerList = $vUtils.debounce(calTriggerListInner, 500)
249
+
250
+ watch(
251
+ () => props.modelValue,
252
+ nv => {
253
+ if (nv === cronValueInner.value) {
254
+ return
255
+ }
256
+ formatValue()
257
+ }
258
+ )
259
+ watch(
260
+ () => cronValueInner.value,
261
+ nv => {
262
+ calTriggerList()
263
+ emitValue(nv)
264
+ assignTable()
265
+ }
266
+ )
267
+
268
+ onBeforeMount(() => {
269
+ assignTable()
270
+ formatValue()
271
+ calTriggerListInner()
272
+ })
273
+
274
+ return {
275
+ activeKey,
276
+ cronTabList,
277
+ second,
278
+ minute,
279
+ hour,
280
+ day,
281
+ month,
282
+ week,
283
+ year,
284
+ tableConfig,
285
+ errMessage,
286
+ preTimeList,
287
+ onTableEditClosed,
288
+ onTableHeaderClick
289
+ }
290
+ }
291
+ })
292
+ </script>
293
+
294
+ <style scoped></style>
@@ -1,9 +1,4 @@
1
1
  .sh-cron-content {
2
- .ivu-tabs{
3
- .ivu-tabs-bar{
4
- margin-bottom: 5px;
5
- }
6
- }
7
2
  .sh-cron-config-list{
8
3
  text-align: left;
9
4
  margin: 0 10px 10px 10px;