sh-view 2.7.8 → 2.7.9
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.
- package/other.js +8 -0
- package/package.json +3 -2
- package/packages/components/index.js +35 -35
- package/packages/components/{global-components/sh-alert → sh-alert}/index.vue +8 -15
- package/packages/components/{global-components/sh-badge → sh-badge}/index.vue +6 -5
- package/packages/components/{global-components/sh-drawer → sh-drawer}/index.vue +49 -27
- package/packages/components/{global-components/sh-form → sh-form}/js/useForm.js +2 -2
- package/packages/components/sh-header/index.vue +260 -0
- package/packages/components/{global-components/sh-poptip → sh-poptip}/index.vue +1 -1
- package/packages/components/{global-components/sh-progress → sh-progress}/index.vue +2 -18
- package/packages/components/{global-components/sh-table → sh-table}/css/index.scss +18 -0
- package/packages/components/{global-components/sh-table → sh-table}/js/useTable.js +4 -6
- package/packages/components/{global-components/sh-table → sh-table}/table.vue +217 -218
- package/packages/components/{global-components/sh-tabs → sh-tabs}/index.vue +97 -34
- package/packages/components/{global-components/sh-tree → sh-tree}/components/table-tree.vue +1 -1
- package/packages/components/{global-components/sh-tree → sh-tree}/css/index.scss +1 -0
- package/packages/components/{global-components/sh-tree → sh-tree}/index.vue +16 -5
- package/packages/components/{global-components/sh-tree → sh-tree}/mixin/treeProps.js +1 -1
- package/packages/index.js +39 -39
- package/packages/{components/other-components → other}/sh-cron-modal/tabs/cron-week-box.vue +126 -126
- package/packages/{components/other-components → other}/sh-menu/index.vue +3 -0
- package/packages/{components/other-components → other}/sh-menu/menu-item-content.vue +3 -3
- package/packages/other/sh-preview/components/sh-excel.vue +163 -0
- package/packages/{components/other-components → other}/sh-preview/index.vue +92 -89
- package/packages/vxeTable/css/index.scss +1 -2
- package/packages/vxeTable/render/cell/vxe-render-tree.vue +70 -63
- package/packages/components/global-components/sh-header/index.vue +0 -278
- package/packages/components/other-components/sh-preview/components/sh-excel.vue +0 -929
- /package/packages/components/{global-components/sh-calendar → sh-calendar}/index.vue +0 -0
- /package/packages/components/{global-components/sh-card → sh-card}/index.vue +0 -0
- /package/packages/components/{global-components/sh-code-editor → sh-code-editor}/index.vue +0 -0
- /package/packages/components/{global-components/sh-code-editor → sh-code-editor}/themes/dark.js +0 -0
- /package/packages/components/{global-components/sh-code-editor → sh-code-editor}/themes/dracula.js +0 -0
- /package/packages/components/{global-components/sh-code-editor → sh-code-editor}/themes/index.js +0 -0
- /package/packages/components/{global-components/sh-col → sh-col}/css/index.scss +0 -0
- /package/packages/components/{global-components/sh-col → sh-col}/index.vue +0 -0
- /package/packages/components/{global-components/sh-corner → sh-corner}/index.vue +0 -0
- /package/packages/components/{global-components/sh-count-to → sh-count-to}/index.vue +0 -0
- /package/packages/components/{global-components/sh-date → sh-date}/index.vue +0 -0
- /package/packages/components/{global-components/sh-drawer → sh-drawer}/scrollbar.js +0 -0
- /package/packages/components/{global-components/sh-empty → sh-empty}/index.vue +0 -0
- /package/packages/components/{global-components/sh-form → sh-form}/form.vue +0 -0
- /package/packages/components/{global-components/sh-form → sh-form}/js/props.js +0 -0
- /package/packages/components/{global-components/sh-form → sh-form}/query.vue +0 -0
- /package/packages/components/{global-components/sh-icon → sh-icon}/css/default/icons.scss +0 -0
- /package/packages/components/{global-components/sh-icon → sh-icon}/css/default/ionicons.svg +0 -0
- /package/packages/components/{global-components/sh-icon → sh-icon}/css/default/ionicons.ttf +0 -0
- /package/packages/components/{global-components/sh-icon → sh-icon}/css/default/ionicons.woff +0 -0
- /package/packages/components/{global-components/sh-icon → sh-icon}/css/default/ionicons.woff2 +0 -0
- /package/packages/components/{global-components/sh-icon → sh-icon}/css/font/iconfont.js +0 -0
- /package/packages/components/{global-components/sh-icon → sh-icon}/css/font/iconfont.json +0 -0
- /package/packages/components/{global-components/sh-icon → sh-icon}/css/font/iconfont.ttf +0 -0
- /package/packages/components/{global-components/sh-icon → sh-icon}/css/font/iconfont.woff +0 -0
- /package/packages/components/{global-components/sh-icon → sh-icon}/css/font/iconfont.woff2 +0 -0
- /package/packages/components/{global-components/sh-icon → sh-icon}/css/font/icons.scss +0 -0
- /package/packages/components/{global-components/sh-icon → sh-icon}/css/index.scss +0 -0
- /package/packages/components/{global-components/sh-icon → sh-icon}/index.vue +0 -0
- /package/packages/components/{global-components/sh-image → sh-image}/index.vue +0 -0
- /package/packages/components/{global-components/sh-list → sh-list}/index.vue +0 -0
- /package/packages/components/{global-components/sh-loading → sh-loading}/index.vue +0 -0
- /package/packages/components/{global-components/sh-modal → sh-modal}/index.vue +0 -0
- /package/packages/components/{global-components/sh-noticebar → sh-noticebar}/index.vue +0 -0
- /package/packages/components/{global-components/sh-pull-refresh → sh-pull-refresh}/index.vue +0 -0
- /package/packages/components/{global-components/sh-result → sh-result}/index.vue +0 -0
- /package/packages/components/{global-components/sh-row → sh-row}/css/index.scss +0 -0
- /package/packages/components/{global-components/sh-row → sh-row}/index.vue +0 -0
- /package/packages/components/{global-components/sh-split → sh-split}/components/trigger.vue +0 -0
- /package/packages/components/{global-components/sh-split → sh-split}/index.vue +0 -0
- /package/packages/components/{global-components/sh-table → sh-table}/components/importModal.vue +0 -0
- /package/packages/components/{global-components/sh-table → sh-table}/components/sh-column.vue +0 -0
- /package/packages/components/{global-components/sh-table → sh-table}/grid.vue +0 -0
- /package/packages/components/{global-components/sh-table → sh-table}/js/excel_to_json.js +0 -0
- /package/packages/components/{global-components/sh-table → sh-table}/js/props.js +0 -0
- /package/packages/components/{global-components/sh-table → sh-table}/js/tableMethods.js +0 -0
- /package/packages/components/{global-components/sh-tag → sh-tag}/index.vue +0 -0
- /package/packages/components/{global-components/sh-toolbar → sh-toolbar}/index.vue +0 -0
- /package/packages/components/{global-components/sh-upload → sh-upload}/index.vue +0 -0
- /package/packages/components/{global-components/sh-upload → sh-upload}/js/ajax.js +0 -0
- /package/packages/components/{global-components/sh-water-fall → sh-water-fall}/index.vue +0 -0
- /package/packages/components/{global-components/sh-water-mark → sh-water-mark}/index.vue +0 -0
- /package/packages/{components/other-components → other}/sh-cron-modal/components/cron-content.vue +0 -0
- /package/packages/{components/other-components → other}/sh-cron-modal/css/index.scss +0 -0
- /package/packages/{components/other-components → other}/sh-cron-modal/index.vue +0 -0
- /package/packages/{components/other-components → other}/sh-cron-modal/mixin/cron-emits.js +0 -0
- /package/packages/{components/other-components → other}/sh-cron-modal/mixin/cron-hooks.js +0 -0
- /package/packages/{components/other-components → other}/sh-cron-modal/mixin/cron-props.js +0 -0
- /package/packages/{components/other-components → other}/sh-cron-modal/tabs/cron-day-box.vue +0 -0
- /package/packages/{components/other-components → other}/sh-cron-modal/tabs/cron-hour-box.vue +0 -0
- /package/packages/{components/other-components → other}/sh-cron-modal/tabs/cron-minute-box.vue +0 -0
- /package/packages/{components/other-components → other}/sh-cron-modal/tabs/cron-month-box.vue +0 -0
- /package/packages/{components/other-components → other}/sh-cron-modal/tabs/cron-second-box.vue +0 -0
- /package/packages/{components/other-components → other}/sh-cron-modal/tabs/cron-year-box.vue +0 -0
- /package/packages/{components/other-components → other}/sh-cron-modal/utils/index.js +0 -0
- /package/packages/{components/other-components → other}/sh-markdown/index.vue +0 -0
- /package/packages/{components/other-components → other}/sh-markdown/tinymce/langs/zh-Hans.js +0 -0
- /package/packages/{components/other-components → other}/sh-markdown/tinymce/skins/content/default/content.css +0 -0
- /package/packages/{components/other-components → other}/sh-markdown/tinymce/skins/ui/oxide/content.css +0 -0
- /package/packages/{components/other-components → other}/sh-markdown/tinymce/skins/ui/oxide/content.inline.css +0 -0
- /package/packages/{components/other-components → other}/sh-markdown/tinymce/skins/ui/oxide/content.inline.min.css +0 -0
- /package/packages/{components/other-components → other}/sh-markdown/tinymce/skins/ui/oxide/content.min.css +0 -0
- /package/packages/{components/other-components → other}/sh-markdown/tinymce/skins/ui/oxide/content.mobile.css +0 -0
- /package/packages/{components/other-components → other}/sh-markdown/tinymce/skins/ui/oxide/content.mobile.min.css +0 -0
- /package/packages/{components/other-components → other}/sh-markdown/tinymce/skins/ui/oxide/fonts/tinymce-mobile.woff +0 -0
- /package/packages/{components/other-components → other}/sh-markdown/tinymce/skins/ui/oxide/skin.css +0 -0
- /package/packages/{components/other-components → other}/sh-markdown/tinymce/skins/ui/oxide/skin.min.css +0 -0
- /package/packages/{components/other-components → other}/sh-markdown/tinymce/skins/ui/oxide/skin.mobile.css +0 -0
- /package/packages/{components/other-components → other}/sh-markdown/tinymce/skins/ui/oxide/skin.mobile.min.css +0 -0
- /package/packages/{components/other-components → other}/sh-markdown/tinymce/skins/ui/oxide/skin.shadowdom.css +0 -0
- /package/packages/{components/other-components → other}/sh-markdown/tinymce/skins/ui/oxide/skin.shadowdom.min.css +0 -0
- /package/packages/{components/other-components → other}/sh-menu/menu-group-content.vue +0 -0
- /package/packages/{components/other-components → other}/sh-menu-card/index.vue +0 -0
- /package/packages/{components/other-components → other}/sh-menu-card/menu-box.vue +0 -0
- /package/packages/{components/other-components → other}/sh-preview/components/sh-word.vue +0 -0
- /package/packages/{components/other-components → other}/sh-preview/js/data-hook.js +0 -0
- /package/packages/{components/other-components → other}/sh-preview/js/data-props.js +0 -0
- /package/packages/{components/other-components → other}/sh-system-tip/index.vue +0 -0
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<div class="sh-tabs" :class="
|
|
2
|
+
<div class="sh-tabs" :class="tabClass">
|
|
3
3
|
<div class="sh-tabs-nav">
|
|
4
4
|
<div v-if="slots.left" class="sh-tabs-nav-slot sh-tabs-nav-left"><slot name="left"></slot></div>
|
|
5
5
|
<div ref="navWrapRef" v-resize="handleResize" class="sh-tabs-nav-wrap" :class="{ 'sh-tabs-nav-scrollable': scrollable }">
|
|
6
|
-
<span v-if="scrollable" class="sh-tabs-nav-prev" :class="{ 'sh-tabs-nav-btn-disabled': scrollable }" @click="scrollPrev"
|
|
6
|
+
<span v-if="scrollable" class="sh-tabs-nav-prev" :class="{ 'sh-tabs-nav-btn-disabled': scrollable }" @click="scrollPrev">
|
|
7
|
+
<sh-icon :type="isHorizontal ? 'ios-arrow-up' : 'ios-arrow-back'"></sh-icon>
|
|
8
|
+
</span>
|
|
7
9
|
<div ref="navScrollRef" class="sh-tabs-nav-scroll" @DOMMouseScroll="handleScroll" @mousewheel="handleScroll">
|
|
8
10
|
<div ref="navRef" v-resize="handleResize" class="sh-tabs-nav-inner" :style="navStyle">
|
|
9
11
|
<template v-for="(tab, tabIndex) in tabList" :key="tabIndex">
|
|
@@ -20,17 +22,21 @@
|
|
|
20
22
|
</template>
|
|
21
23
|
</div>
|
|
22
24
|
</div>
|
|
23
|
-
<span v-if="scrollable" class="sh-tabs-nav-next" :class="{ 'sh-tabs-nav-btn-disabled': scrollable }" @click="scrollNext"
|
|
25
|
+
<span v-if="scrollable" class="sh-tabs-nav-next" :class="{ 'sh-tabs-nav-btn-disabled': scrollable }" @click="scrollNext">
|
|
26
|
+
<sh-icon :type="isHorizontal ? 'ios-arrow-down' : 'ios-arrow-forward'"></sh-icon>
|
|
27
|
+
</span>
|
|
24
28
|
</div>
|
|
25
29
|
<div v-if="slots.right" class="sh-tabs-nav-slot sh-tabs-nav-right"><slot name="right"></slot></div>
|
|
26
30
|
</div>
|
|
27
31
|
<div v-if="hasContent" class="sh-tabs-content">
|
|
28
32
|
<div ref="contentWrap" class="sh-tabs-content-wrap" :class="{ 'sh-tabs-content-animated': animated }" :style="contentStyle">
|
|
29
|
-
<
|
|
30
|
-
<
|
|
31
|
-
<
|
|
32
|
-
|
|
33
|
-
|
|
33
|
+
<slot name="tabContent" v-bind="tabList">
|
|
34
|
+
<template v-for="(tab, tabIndex) in tabList" :key="tabIndex">
|
|
35
|
+
<div class="sh-tabs-content-item">
|
|
36
|
+
<slot :name="tab[labelKey]" v-bind="tab">{{ tab[labelField] }}</slot>
|
|
37
|
+
</div>
|
|
38
|
+
</template>
|
|
39
|
+
</slot>
|
|
34
40
|
</div>
|
|
35
41
|
</div>
|
|
36
42
|
</div>
|
|
@@ -81,6 +87,10 @@ export default defineComponent({
|
|
|
81
87
|
gutter: {
|
|
82
88
|
type: Number,
|
|
83
89
|
default: 5
|
|
90
|
+
},
|
|
91
|
+
placement: {
|
|
92
|
+
type: String,
|
|
93
|
+
default: 'top' // 'left', 'right', 'top', 'bottom'
|
|
84
94
|
}
|
|
85
95
|
},
|
|
86
96
|
emits: ['update:modelValue', 'close', 'change'],
|
|
@@ -98,7 +108,15 @@ export default defineComponent({
|
|
|
98
108
|
const closedList = ref([])
|
|
99
109
|
const navStyle = ref({ transform: '' })
|
|
100
110
|
|
|
111
|
+
const isHorizontal = computed(() => ['left', 'right'].includes(props.placement))
|
|
101
112
|
const hasContent = computed(() => props.isContent && activeKey.value && props.options.map(item => item[props.labelKey]).includes(activeKey.value))
|
|
113
|
+
const tabClass = computed(() => {
|
|
114
|
+
return {
|
|
115
|
+
'sh-tabs-card': props.type === 'card',
|
|
116
|
+
'sh-tabs-reverse': ['bottom', 'right'].includes(props.placement),
|
|
117
|
+
[isHorizontal.value ? 'sh-tabs-horizontal' : 'sh-tabs-vertical']: true
|
|
118
|
+
}
|
|
119
|
+
})
|
|
102
120
|
const tabList = computed(() => props.options.filter(tab => !closedList.value.includes(tab[props.labelKey])) || [])
|
|
103
121
|
const contentStyle = computed(() => {
|
|
104
122
|
const x = tabList.value.findIndex(tab => tab[props.labelKey] === activeKey.value)
|
|
@@ -111,42 +129,55 @@ export default defineComponent({
|
|
|
111
129
|
})
|
|
112
130
|
|
|
113
131
|
const scrollPrev = () => {
|
|
114
|
-
const
|
|
132
|
+
const navScrollOffset = isHorizontal.value ? navScrollRef.value.offsetHeight : navScrollRef.value.offsetWidth
|
|
115
133
|
const currentOffset = getCurrentScrollOffset()
|
|
116
134
|
if (!currentOffset) return
|
|
117
|
-
let newOffset =
|
|
135
|
+
let newOffset = 0
|
|
136
|
+
if (currentOffset > navScrollOffset) {
|
|
137
|
+
newOffset = currentOffset - navScrollOffset
|
|
138
|
+
}
|
|
118
139
|
setOffset(newOffset)
|
|
119
140
|
}
|
|
120
141
|
const scrollNext = () => {
|
|
121
|
-
const
|
|
122
|
-
const
|
|
142
|
+
const navOffset = isHorizontal.value ? navRef.value.offsetHeight : navRef.value.offsetWidth
|
|
143
|
+
const containerOffset = isHorizontal.value ? navScrollRef.value.offsetHeight : navScrollRef.value.offsetWidth
|
|
123
144
|
const currentOffset = getCurrentScrollOffset()
|
|
124
|
-
if (
|
|
125
|
-
let newOffset =
|
|
145
|
+
if (navOffset - currentOffset <= containerOffset) return
|
|
146
|
+
let newOffset = navOffset - currentOffset > containerOffset * 2 ? currentOffset + containerOffset : navOffset - containerOffset
|
|
126
147
|
setOffset(newOffset)
|
|
127
148
|
}
|
|
128
149
|
const setOffset = value => {
|
|
129
|
-
|
|
150
|
+
const direction = isHorizontal.value ? 'Y' : 'X'
|
|
151
|
+
navStyle.value.transform = `translate${direction}(-${value}px)`
|
|
130
152
|
}
|
|
131
153
|
const getCurrentScrollOffset = () => {
|
|
132
|
-
|
|
154
|
+
if (navStyle.value.transform && isHorizontal.value) {
|
|
155
|
+
return Number(navStyle.value.transform.match(/translateY\(-(\d+(\.\d+)*)px\)/)[1])
|
|
156
|
+
} else if (navStyle.value.transform) {
|
|
157
|
+
return Number(navStyle.value.transform.match(/translateX\(-(\d+(\.\d+)*)px\)/)[1])
|
|
158
|
+
}
|
|
159
|
+
return 0
|
|
133
160
|
}
|
|
134
161
|
const getTabIsClosable = tab => {
|
|
135
162
|
return props.closable && !tab.disabled && !tab.unClosed
|
|
136
163
|
}
|
|
137
164
|
const getTabItemStyle = (tab, tabIndex) => {
|
|
138
|
-
|
|
139
|
-
|
|
165
|
+
let itemStyle = {}
|
|
166
|
+
if (isHorizontal.value) {
|
|
167
|
+
itemStyle.marginTop = tabIndex ? `${props.gutter}px` : 0
|
|
168
|
+
} else {
|
|
169
|
+
itemStyle.marginLeft = tabIndex ? `${props.gutter}px` : 0
|
|
140
170
|
}
|
|
171
|
+
return itemStyle
|
|
141
172
|
}
|
|
142
173
|
const handleResize = e => {
|
|
143
|
-
const
|
|
144
|
-
const
|
|
174
|
+
const navOffset = isHorizontal.value ? navRef.value.offsetHeight : navRef.value.offsetWidth
|
|
175
|
+
const containerOffset = isHorizontal.value ? navScrollRef.value.offsetHeight : navScrollRef.value.offsetWidth
|
|
145
176
|
const currentOffset = getCurrentScrollOffset()
|
|
146
|
-
if (
|
|
177
|
+
if (containerOffset < navOffset) {
|
|
147
178
|
scrollable.value = true
|
|
148
|
-
if (
|
|
149
|
-
setOffset(
|
|
179
|
+
if (navOffset - currentOffset < containerOffset) {
|
|
180
|
+
setOffset(navOffset - containerOffset)
|
|
150
181
|
}
|
|
151
182
|
} else {
|
|
152
183
|
scrollable.value = false
|
|
@@ -173,20 +204,21 @@ export default defineComponent({
|
|
|
173
204
|
activeKey.value = tab[props.labelKey]
|
|
174
205
|
emit('change', tab)
|
|
175
206
|
if (!scrollable.value) return
|
|
176
|
-
const
|
|
177
|
-
const
|
|
207
|
+
const navOffset = isHorizontal.value ? navRef.value.offsetHeight : navRef.value.offsetWidth
|
|
208
|
+
const containerOffset = isHorizontal.value ? navScrollRef.value.offsetHeight : navScrollRef.value.offsetWidth
|
|
178
209
|
const prevTabs = navRef.value.querySelectorAll('.sh-tab-item')
|
|
179
210
|
const tabIndex = tabList.value.findIndex(tb => tb[props.labelKey] === tab[props.labelKey])
|
|
211
|
+
const offsetName = isHorizontal.value ? 'offsetHeight' : 'offsetWidth'
|
|
180
212
|
let barOffset = 0
|
|
181
213
|
if (tabIndex > 0) {
|
|
182
214
|
let offset = 0
|
|
183
215
|
for (let i = 0; i < tabIndex; i++) {
|
|
184
|
-
offset += parseFloat(prevTabs[i]
|
|
216
|
+
offset += parseFloat(prevTabs[i][offsetName]) + props.gutter
|
|
185
217
|
}
|
|
186
218
|
barOffset = offset
|
|
187
219
|
}
|
|
188
|
-
let
|
|
189
|
-
setOffset(
|
|
220
|
+
let newOffset = navOffset - barOffset < containerOffset ? navOffset - containerOffset : barOffset
|
|
221
|
+
setOffset(newOffset)
|
|
190
222
|
}
|
|
191
223
|
const handleClose = tab => {
|
|
192
224
|
closedList.value.push(tab[props.labelKey])
|
|
@@ -222,8 +254,10 @@ export default defineComponent({
|
|
|
222
254
|
navScrollRef,
|
|
223
255
|
contentWrapRef,
|
|
224
256
|
slots,
|
|
257
|
+
isHorizontal,
|
|
225
258
|
scrollable,
|
|
226
259
|
navStyle,
|
|
260
|
+
tabClass,
|
|
227
261
|
tabList,
|
|
228
262
|
activeKey,
|
|
229
263
|
hasContent,
|
|
@@ -244,8 +278,8 @@ export default defineComponent({
|
|
|
244
278
|
<style scoped lang="scss">
|
|
245
279
|
.sh-tabs {
|
|
246
280
|
width: 100%;
|
|
247
|
-
display: block;
|
|
248
281
|
position: relative;
|
|
282
|
+
display: flex;
|
|
249
283
|
.sh-tab-close {
|
|
250
284
|
display: inline-flex;
|
|
251
285
|
align-items: center;
|
|
@@ -254,6 +288,37 @@ export default defineComponent({
|
|
|
254
288
|
background-color: rgba(0, 0, 0, 0.1);
|
|
255
289
|
}
|
|
256
290
|
}
|
|
291
|
+
&-vertical {
|
|
292
|
+
width: 100%;
|
|
293
|
+
flex-wrap: wrap;
|
|
294
|
+
flex-direction: column;
|
|
295
|
+
&.sh-tabs-reverse {
|
|
296
|
+
flex-direction: column-reverse;
|
|
297
|
+
}
|
|
298
|
+
.sh-tabs-nav {
|
|
299
|
+
width: 100%;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
&-horizontal {
|
|
303
|
+
flex-wrap: nowrap;
|
|
304
|
+
flex-direction: row;
|
|
305
|
+
.sh-tabs-nav {
|
|
306
|
+
width: auto;
|
|
307
|
+
}
|
|
308
|
+
.sh-tabs-nav,
|
|
309
|
+
.sh-tabs-nav-wrap,
|
|
310
|
+
.sh-tabs-nav-inner {
|
|
311
|
+
flex-direction: column;
|
|
312
|
+
}
|
|
313
|
+
.sh-tabs-nav-prev,
|
|
314
|
+
.sh-tabs-nav-next {
|
|
315
|
+
width: 100%;
|
|
316
|
+
height: 26px;
|
|
317
|
+
}
|
|
318
|
+
&.sh-tabs-reverse {
|
|
319
|
+
flex-direction: row-reverse;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
257
322
|
&-nav {
|
|
258
323
|
display: flex;
|
|
259
324
|
&-slot {
|
|
@@ -273,7 +338,7 @@ export default defineComponent({
|
|
|
273
338
|
display: inline-flex;
|
|
274
339
|
align-items: center;
|
|
275
340
|
justify-content: center;
|
|
276
|
-
box-shadow: 0 1px
|
|
341
|
+
box-shadow: 0 1px 5px rgba(0, 0, 0, 0.3);
|
|
277
342
|
position: relative;
|
|
278
343
|
z-index: 10;
|
|
279
344
|
&:hover {
|
|
@@ -301,9 +366,6 @@ export default defineComponent({
|
|
|
301
366
|
&:hover {
|
|
302
367
|
color: var(--vxe-primary-color);
|
|
303
368
|
}
|
|
304
|
-
& + .sh-tab-item {
|
|
305
|
-
margin-left: 5px;
|
|
306
|
-
}
|
|
307
369
|
&.sh-tab-item-active {
|
|
308
370
|
border-bottom: 2px solid var(--vxe-primary-darken-color);
|
|
309
371
|
color: var(--vxe-primary-color) !important;
|
|
@@ -346,8 +408,9 @@ export default defineComponent({
|
|
|
346
408
|
width: 100%;
|
|
347
409
|
&-wrap {
|
|
348
410
|
flex: 1;
|
|
349
|
-
|
|
411
|
+
display: flex;
|
|
350
412
|
white-space: nowrap;
|
|
413
|
+
width: 100%;
|
|
351
414
|
&.sh-tabs-content-animated {
|
|
352
415
|
transition: transform 0.2s ease-in-out;
|
|
353
416
|
}
|
|
@@ -77,7 +77,7 @@ export default defineComponent({
|
|
|
77
77
|
})
|
|
78
78
|
const tableProps = computed(() => {
|
|
79
79
|
return {
|
|
80
|
-
height: props.isSelect ? '
|
|
80
|
+
height: props.isSelect ? '100%' : props.height,
|
|
81
81
|
size: props.size,
|
|
82
82
|
loading: props.loading || treeLoading.value,
|
|
83
83
|
data: filterData.value || treeData.value,
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
<div v-if="filter" class="sh-tree-filter">
|
|
12
12
|
<vxe-input ref="filterInputRef" v-model="filterTextIn" class="sh-tree-filter-input" v-bind="filterInputConfigIn"></vxe-input>
|
|
13
13
|
</div>
|
|
14
|
-
<div class="sh-tree-select-dropdown
|
|
14
|
+
<div class="sh-tree-select-dropdown">
|
|
15
15
|
<table-tree v-if="pulldownDrop" v-bind="tableTreeProps" @datacall="onDataCall" @select="onChange"></table-tree>
|
|
16
16
|
</div>
|
|
17
17
|
</template>
|
|
@@ -52,7 +52,7 @@ export default defineComponent({
|
|
|
52
52
|
const filterInputRef = ref()
|
|
53
53
|
// 公共属性
|
|
54
54
|
const filterTextIn = ref(props.filterText)
|
|
55
|
-
const selectedKeys = ref(
|
|
55
|
+
const selectedKeys = ref([])
|
|
56
56
|
const selectedData = ref([])
|
|
57
57
|
const treeData = ref(props.options)
|
|
58
58
|
// 下拉专属属性
|
|
@@ -66,7 +66,13 @@ export default defineComponent({
|
|
|
66
66
|
let selectRows = getSelectRowsByValue(selectedKeys.value)
|
|
67
67
|
let labelFieldList = selectRows.map(item => $vUtils.get(item, labelField))
|
|
68
68
|
if (format) {
|
|
69
|
-
let prefixKey = field
|
|
69
|
+
let prefixKey = field
|
|
70
|
+
let endStrs = ['Id', '_id']
|
|
71
|
+
endStrs.forEach(end => {
|
|
72
|
+
if (field.endsWith(end)) {
|
|
73
|
+
prefixKey = field.replace(end, '')
|
|
74
|
+
}
|
|
75
|
+
})
|
|
70
76
|
let dataformat = format.replace(/@/gi, prefixKey)
|
|
71
77
|
if (multiple) {
|
|
72
78
|
let formatKeys = $vUtils.getFormatKeys(dataformat)
|
|
@@ -184,10 +190,15 @@ export default defineComponent({
|
|
|
184
190
|
() => props.modelValue,
|
|
185
191
|
value => {
|
|
186
192
|
if (pulldownDrop.value) return
|
|
187
|
-
|
|
193
|
+
if ($vUtils.isNone(value)) {
|
|
194
|
+
selectedKeys.value = []
|
|
195
|
+
} else {
|
|
196
|
+
selectedKeys.value = Array.isArray(value) ? value : [value]
|
|
197
|
+
}
|
|
188
198
|
},
|
|
189
199
|
{
|
|
190
|
-
immediate: true
|
|
200
|
+
immediate: true,
|
|
201
|
+
deep: true
|
|
191
202
|
}
|
|
192
203
|
)
|
|
193
204
|
|
package/packages/index.js
CHANGED
|
@@ -1,39 +1,39 @@
|
|
|
1
|
-
import packageConfig from '../package.json'
|
|
2
|
-
import { utils, notice } from 'sh-tools'
|
|
3
|
-
import { VueMasonryPlugin } from 'vue-masonry'
|
|
4
|
-
import directive from './directive/index'
|
|
5
|
-
import vxeTable from './vxeTable/index'
|
|
6
|
-
import
|
|
7
|
-
import mixin from './mixin/index'
|
|
8
|
-
import './css/index'
|
|
9
|
-
|
|
10
|
-
// 全局公共封装组件
|
|
11
|
-
const install = function (root, option = {}) {
|
|
12
|
-
if (install.installed) return
|
|
13
|
-
root.config.globalProperties.$vUtils = utils
|
|
14
|
-
root.config.globalProperties.$Notice = notice
|
|
15
|
-
root.mixin(mixin)
|
|
16
|
-
root.use(VueMasonryPlugin, option)
|
|
17
|
-
root.use(directive)
|
|
18
|
-
root.use(vxeTable, option)
|
|
19
|
-
root.use(
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
const ShUI = {
|
|
23
|
-
name: packageConfig.name,
|
|
24
|
-
version: packageConfig.version,
|
|
25
|
-
install
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
let consInfo = ''
|
|
29
|
-
let defaultBg = 'padding: 5px; color: #111; background: #f5f7f9; font-weight: bold;'
|
|
30
|
-
let tagBg1 = 'padding: 5px; color: #fff; background: #8e2eff; font-weight: bold;'
|
|
31
|
-
let tagBg2 = 'padding: 5px; color: #333; background: #ffee2e; font-weight: bold;'
|
|
32
|
-
if ((window.navigator.language || window.navigator.browserLanguage).toLowerCase() === 'zh-cn') {
|
|
33
|
-
consInfo = `%c由%c${ShUI.name}%c提供技术支持,版本%c${ShUI.version}%c`
|
|
34
|
-
} else {
|
|
35
|
-
consInfo = `%cPowered by%c${ShUI.name}%c,version%c${ShUI.version}%c`
|
|
36
|
-
}
|
|
37
|
-
console.info(consInfo, defaultBg, tagBg1, defaultBg, tagBg2, defaultBg)
|
|
38
|
-
|
|
39
|
-
export default ShUI
|
|
1
|
+
import packageConfig from '../package.json'
|
|
2
|
+
import { utils, notice } from 'sh-tools'
|
|
3
|
+
import { VueMasonryPlugin } from 'vue-masonry'
|
|
4
|
+
import directive from './directive/index'
|
|
5
|
+
import vxeTable from './vxeTable/index'
|
|
6
|
+
import components from './components/index'
|
|
7
|
+
import mixin from './mixin/index'
|
|
8
|
+
import './css/index'
|
|
9
|
+
|
|
10
|
+
// 全局公共封装组件
|
|
11
|
+
const install = function (root, option = {}) {
|
|
12
|
+
if (install.installed) return
|
|
13
|
+
root.config.globalProperties.$vUtils = utils
|
|
14
|
+
root.config.globalProperties.$Notice = notice
|
|
15
|
+
root.mixin(mixin)
|
|
16
|
+
root.use(VueMasonryPlugin, option)
|
|
17
|
+
root.use(directive)
|
|
18
|
+
root.use(vxeTable, option)
|
|
19
|
+
root.use(components, option)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const ShUI = {
|
|
23
|
+
name: packageConfig.name,
|
|
24
|
+
version: packageConfig.version,
|
|
25
|
+
install
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
let consInfo = ''
|
|
29
|
+
let defaultBg = 'padding: 5px; color: #111; background: #f5f7f9; font-weight: bold;'
|
|
30
|
+
let tagBg1 = 'padding: 5px; color: #fff; background: #8e2eff; font-weight: bold;'
|
|
31
|
+
let tagBg2 = 'padding: 5px; color: #333; background: #ffee2e; font-weight: bold;'
|
|
32
|
+
if ((window.navigator.language || window.navigator.browserLanguage).toLowerCase() === 'zh-cn') {
|
|
33
|
+
consInfo = `%c由%c${ShUI.name}%c提供技术支持,版本%c${ShUI.version}%c`
|
|
34
|
+
} else {
|
|
35
|
+
consInfo = `%cPowered by%c${ShUI.name}%c,version%c${ShUI.version}%c`
|
|
36
|
+
}
|
|
37
|
+
console.info(consInfo, defaultBg, tagBg1, defaultBg, tagBg2, defaultBg)
|
|
38
|
+
|
|
39
|
+
export default ShUI
|
|
@@ -1,126 +1,126 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div class="sh-cron-config-list">
|
|
3
|
-
<vxe-radio-group v-model="type">
|
|
4
|
-
<div class="item">
|
|
5
|
-
<vxe-radio :label="TypeEnum.unset" v-bind="beforeRadioAttrs">不设置</vxe-radio>
|
|
6
|
-
<span class="tip-info">日和周只能设置其中之一</span>
|
|
7
|
-
</div>
|
|
8
|
-
<div class="item">
|
|
9
|
-
<vxe-radio :label="TypeEnum.range" v-bind="beforeRadioAttrs">区间</vxe-radio>
|
|
10
|
-
<span> 从 </span>
|
|
11
|
-
<vxe-select v-model="valueRange.start" :options="weekOptions" v-bind="typeRangeSelectAttrs" />
|
|
12
|
-
<span> 至 </span>
|
|
13
|
-
<vxe-select v-model="valueRange.end" :options="weekOptions" v-bind="typeRangeSelectAttrs" />
|
|
14
|
-
</div>
|
|
15
|
-
<div class="item">
|
|
16
|
-
<vxe-radio :label="TypeEnum.loop" v-bind="beforeRadioAttrs">循环</vxe-radio>
|
|
17
|
-
<span> 从 </span>
|
|
18
|
-
<vxe-select v-model="valueLoop.start" :options="weekOptions" v-bind="typeLoopSelectAttrs" />
|
|
19
|
-
<span> 至 </span>
|
|
20
|
-
<vxe-input v-model="valueLoop.interval" v-bind="typeLoopAttrs" />
|
|
21
|
-
</div>
|
|
22
|
-
<div class="item">
|
|
23
|
-
<vxe-radio :label="TypeEnum.specify" v-bind="beforeRadioAttrs">指定</vxe-radio>
|
|
24
|
-
<div class="list">
|
|
25
|
-
<vxe-checkbox-group v-model="valueList">
|
|
26
|
-
<template v-for="i in specifyRange" :key="i">
|
|
27
|
-
<vxe-checkbox :label="i" v-bind="typeSpecifyAttrs">{{ i }}</vxe-checkbox>
|
|
28
|
-
</template>
|
|
29
|
-
</vxe-checkbox-group>
|
|
30
|
-
</div>
|
|
31
|
-
</div>
|
|
32
|
-
</vxe-radio-group>
|
|
33
|
-
</div>
|
|
34
|
-
</template>
|
|
35
|
-
|
|
36
|
-
<script>
|
|
37
|
-
import { defineComponent, computed, getCurrentInstance, watch } from 'vue'
|
|
38
|
-
import cronProps from '../mixin/cron-props'
|
|
39
|
-
|
|
40
|
-
import
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
setup(props, context) {
|
|
70
|
-
const { proxy } = getCurrentInstance()
|
|
71
|
-
const { $vUtils } = proxy
|
|
72
|
-
const { emit, slots } = context
|
|
73
|
-
|
|
74
|
-
const useCron = cronHooks(props, context, proxy, {
|
|
75
|
-
defaultValue: '*',
|
|
76
|
-
minValue: 1,
|
|
77
|
-
maxValue: 7,
|
|
78
|
-
valueRange: { start: 1, end: 7 },
|
|
79
|
-
valueLoop: { start: 2, interval: 1 }
|
|
80
|
-
})
|
|
81
|
-
|
|
82
|
-
const disabledChoice = computed(() => {
|
|
83
|
-
return (props.day && props.day !== '?') || props.disabled
|
|
84
|
-
})
|
|
85
|
-
const weekOptions = computed(() => {
|
|
86
|
-
let options = []
|
|
87
|
-
for (let weekKey of Object.keys(WEEK_MAP_CN)) {
|
|
88
|
-
let weekName = WEEK_MAP_CN[weekKey]
|
|
89
|
-
options.push({
|
|
90
|
-
value: Number.parseInt(weekKey),
|
|
91
|
-
label: weekName
|
|
92
|
-
})
|
|
93
|
-
}
|
|
94
|
-
return options
|
|
95
|
-
})
|
|
96
|
-
const typeRangeSelectAttrs = computed(() => {
|
|
97
|
-
return {
|
|
98
|
-
class: ['cron-item-input'],
|
|
99
|
-
disabled: useCron.typeRangeAttrs.value.disabled
|
|
100
|
-
}
|
|
101
|
-
})
|
|
102
|
-
const typeLoopSelectAttrs = computed(() => {
|
|
103
|
-
return {
|
|
104
|
-
class: ['cron-item-input'],
|
|
105
|
-
disabled: useCron.typeLoopAttrs.value.disabled
|
|
106
|
-
}
|
|
107
|
-
})
|
|
108
|
-
|
|
109
|
-
watch(
|
|
110
|
-
() => props.day,
|
|
111
|
-
() => {
|
|
112
|
-
useCron.updateValue(disabledChoice.value ? '?' : useCron.computeValue.value)
|
|
113
|
-
}
|
|
114
|
-
)
|
|
115
|
-
|
|
116
|
-
return {
|
|
117
|
-
...useCron,
|
|
118
|
-
weekOptions,
|
|
119
|
-
typeRangeSelectAttrs,
|
|
120
|
-
typeLoopSelectAttrs
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
})
|
|
124
|
-
</script>
|
|
125
|
-
|
|
126
|
-
<style scoped></style>
|
|
1
|
+
<template>
|
|
2
|
+
<div class="sh-cron-config-list">
|
|
3
|
+
<vxe-radio-group v-model="type">
|
|
4
|
+
<div class="item">
|
|
5
|
+
<vxe-radio :label="TypeEnum.unset" v-bind="beforeRadioAttrs">不设置</vxe-radio>
|
|
6
|
+
<span class="tip-info">日和周只能设置其中之一</span>
|
|
7
|
+
</div>
|
|
8
|
+
<div class="item">
|
|
9
|
+
<vxe-radio :label="TypeEnum.range" v-bind="beforeRadioAttrs">区间</vxe-radio>
|
|
10
|
+
<span> 从 </span>
|
|
11
|
+
<vxe-select v-model="valueRange.start" :options="weekOptions" v-bind="typeRangeSelectAttrs" />
|
|
12
|
+
<span> 至 </span>
|
|
13
|
+
<vxe-select v-model="valueRange.end" :options="weekOptions" v-bind="typeRangeSelectAttrs" />
|
|
14
|
+
</div>
|
|
15
|
+
<div class="item">
|
|
16
|
+
<vxe-radio :label="TypeEnum.loop" v-bind="beforeRadioAttrs">循环</vxe-radio>
|
|
17
|
+
<span> 从 </span>
|
|
18
|
+
<vxe-select v-model="valueLoop.start" :options="weekOptions" v-bind="typeLoopSelectAttrs" />
|
|
19
|
+
<span> 至 </span>
|
|
20
|
+
<vxe-input v-model="valueLoop.interval" v-bind="typeLoopAttrs" />
|
|
21
|
+
</div>
|
|
22
|
+
<div class="item">
|
|
23
|
+
<vxe-radio :label="TypeEnum.specify" v-bind="beforeRadioAttrs">指定</vxe-radio>
|
|
24
|
+
<div class="list">
|
|
25
|
+
<vxe-checkbox-group v-model="valueList">
|
|
26
|
+
<template v-for="i in specifyRange" :key="i">
|
|
27
|
+
<vxe-checkbox :label="i" v-bind="typeSpecifyAttrs">{{ i }}</vxe-checkbox>
|
|
28
|
+
</template>
|
|
29
|
+
</vxe-checkbox-group>
|
|
30
|
+
</div>
|
|
31
|
+
</div>
|
|
32
|
+
</vxe-radio-group>
|
|
33
|
+
</div>
|
|
34
|
+
</template>
|
|
35
|
+
|
|
36
|
+
<script>
|
|
37
|
+
import { defineComponent, computed, getCurrentInstance, watch } from 'vue'
|
|
38
|
+
import cronProps from '../mixin/cron-props'
|
|
39
|
+
import cronHooks from '../mixin/cron-hooks'
|
|
40
|
+
import cronEmits from '../mixin/cron-emits'
|
|
41
|
+
const WEEK_MAP_EN = {
|
|
42
|
+
1: 'SUN',
|
|
43
|
+
2: 'MON',
|
|
44
|
+
3: 'TUE',
|
|
45
|
+
4: 'WED',
|
|
46
|
+
5: 'THU',
|
|
47
|
+
6: 'FRI',
|
|
48
|
+
7: 'SAT'
|
|
49
|
+
}
|
|
50
|
+
const WEEK_MAP_CN = {
|
|
51
|
+
1: '周日',
|
|
52
|
+
2: '周一',
|
|
53
|
+
3: '周二',
|
|
54
|
+
4: '周三',
|
|
55
|
+
5: '周四',
|
|
56
|
+
6: '周五',
|
|
57
|
+
7: '周六'
|
|
58
|
+
}
|
|
59
|
+
export default defineComponent({
|
|
60
|
+
name: 'CronWeekBox',
|
|
61
|
+
props: {
|
|
62
|
+
...cronProps,
|
|
63
|
+
day: {
|
|
64
|
+
type: String,
|
|
65
|
+
default: '*'
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
emits: cronEmits,
|
|
69
|
+
setup(props, context) {
|
|
70
|
+
const { proxy } = getCurrentInstance()
|
|
71
|
+
const { $vUtils } = proxy
|
|
72
|
+
const { emit, slots } = context
|
|
73
|
+
|
|
74
|
+
const useCron = cronHooks(props, context, proxy, {
|
|
75
|
+
defaultValue: '*',
|
|
76
|
+
minValue: 1,
|
|
77
|
+
maxValue: 7,
|
|
78
|
+
valueRange: { start: 1, end: 7 },
|
|
79
|
+
valueLoop: { start: 2, interval: 1 }
|
|
80
|
+
})
|
|
81
|
+
|
|
82
|
+
const disabledChoice = computed(() => {
|
|
83
|
+
return (props.day && props.day !== '?') || props.disabled
|
|
84
|
+
})
|
|
85
|
+
const weekOptions = computed(() => {
|
|
86
|
+
let options = []
|
|
87
|
+
for (let weekKey of Object.keys(WEEK_MAP_CN)) {
|
|
88
|
+
let weekName = WEEK_MAP_CN[weekKey]
|
|
89
|
+
options.push({
|
|
90
|
+
value: Number.parseInt(weekKey),
|
|
91
|
+
label: weekName
|
|
92
|
+
})
|
|
93
|
+
}
|
|
94
|
+
return options
|
|
95
|
+
})
|
|
96
|
+
const typeRangeSelectAttrs = computed(() => {
|
|
97
|
+
return {
|
|
98
|
+
class: ['cron-item-input'],
|
|
99
|
+
disabled: useCron.typeRangeAttrs.value.disabled
|
|
100
|
+
}
|
|
101
|
+
})
|
|
102
|
+
const typeLoopSelectAttrs = computed(() => {
|
|
103
|
+
return {
|
|
104
|
+
class: ['cron-item-input'],
|
|
105
|
+
disabled: useCron.typeLoopAttrs.value.disabled
|
|
106
|
+
}
|
|
107
|
+
})
|
|
108
|
+
|
|
109
|
+
watch(
|
|
110
|
+
() => props.day,
|
|
111
|
+
() => {
|
|
112
|
+
useCron.updateValue(disabledChoice.value ? '?' : useCron.computeValue.value)
|
|
113
|
+
}
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
return {
|
|
117
|
+
...useCron,
|
|
118
|
+
weekOptions,
|
|
119
|
+
typeRangeSelectAttrs,
|
|
120
|
+
typeLoopSelectAttrs
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
})
|
|
124
|
+
</script>
|
|
125
|
+
|
|
126
|
+
<style scoped></style>
|