sh-view 2.7.7 → 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.
Files changed (118) hide show
  1. package/README.md +13 -13
  2. package/other.js +8 -0
  3. package/package.json +4 -3
  4. package/packages/components/index.js +35 -35
  5. package/packages/components/{global-components/sh-alert → sh-alert}/index.vue +8 -15
  6. package/packages/components/{global-components/sh-badge → sh-badge}/index.vue +6 -5
  7. package/packages/components/{global-components/sh-drawer → sh-drawer}/index.vue +49 -27
  8. package/packages/components/{global-components/sh-form → sh-form}/js/useForm.js +2 -2
  9. package/packages/components/sh-header/index.vue +260 -0
  10. package/packages/components/{global-components/sh-poptip → sh-poptip}/index.vue +1 -1
  11. package/packages/components/{global-components/sh-progress → sh-progress}/index.vue +2 -18
  12. package/packages/components/{global-components/sh-table → sh-table}/css/index.scss +18 -0
  13. package/packages/components/{global-components/sh-table → sh-table}/js/useTable.js +4 -6
  14. package/packages/components/{global-components/sh-table → sh-table}/table.vue +217 -218
  15. package/packages/components/{global-components/sh-tabs → sh-tabs}/index.vue +97 -34
  16. package/packages/components/{global-components/sh-tree → sh-tree}/components/table-tree.vue +1 -1
  17. package/packages/components/{global-components/sh-tree → sh-tree}/css/index.scss +1 -0
  18. package/packages/components/{global-components/sh-tree → sh-tree}/index.vue +16 -5
  19. package/packages/components/{global-components/sh-tree → sh-tree}/mixin/treeProps.js +1 -1
  20. package/packages/index.js +39 -39
  21. package/packages/{components/other-components → other}/sh-cron-modal/tabs/cron-week-box.vue +126 -126
  22. package/packages/{components/other-components → other}/sh-menu/index.vue +3 -0
  23. package/packages/{components/other-components → other}/sh-menu/menu-item-content.vue +3 -3
  24. package/packages/other/sh-preview/components/sh-excel.vue +163 -0
  25. package/packages/{components/other-components → other}/sh-preview/index.vue +92 -80
  26. package/packages/vxeTable/css/index.scss +1 -2
  27. package/packages/vxeTable/index.js +1 -1
  28. package/packages/vxeTable/render/cell/vxe-render-tree.vue +70 -63
  29. package/packages/components/global-components/sh-header/index.vue +0 -278
  30. package/packages/components/other-components/sh-preview/components/sh-excel.vue +0 -929
  31. /package/packages/components/{global-components/sh-calendar → sh-calendar}/index.vue +0 -0
  32. /package/packages/components/{global-components/sh-card → sh-card}/index.vue +0 -0
  33. /package/packages/components/{global-components/sh-code-editor → sh-code-editor}/index.vue +0 -0
  34. /package/packages/components/{global-components/sh-code-editor → sh-code-editor}/themes/dark.js +0 -0
  35. /package/packages/components/{global-components/sh-code-editor → sh-code-editor}/themes/dracula.js +0 -0
  36. /package/packages/components/{global-components/sh-code-editor → sh-code-editor}/themes/index.js +0 -0
  37. /package/packages/components/{global-components/sh-col → sh-col}/css/index.scss +0 -0
  38. /package/packages/components/{global-components/sh-col → sh-col}/index.vue +0 -0
  39. /package/packages/components/{global-components/sh-corner → sh-corner}/index.vue +0 -0
  40. /package/packages/components/{global-components/sh-count-to → sh-count-to}/index.vue +0 -0
  41. /package/packages/components/{global-components/sh-date → sh-date}/index.vue +0 -0
  42. /package/packages/components/{global-components/sh-drawer → sh-drawer}/scrollbar.js +0 -0
  43. /package/packages/components/{global-components/sh-empty → sh-empty}/index.vue +0 -0
  44. /package/packages/components/{global-components/sh-form → sh-form}/form.vue +0 -0
  45. /package/packages/components/{global-components/sh-form → sh-form}/js/props.js +0 -0
  46. /package/packages/components/{global-components/sh-form → sh-form}/query.vue +0 -0
  47. /package/packages/components/{global-components/sh-icon → sh-icon}/css/default/icons.scss +0 -0
  48. /package/packages/components/{global-components/sh-icon → sh-icon}/css/default/ionicons.svg +0 -0
  49. /package/packages/components/{global-components/sh-icon → sh-icon}/css/default/ionicons.ttf +0 -0
  50. /package/packages/components/{global-components/sh-icon → sh-icon}/css/default/ionicons.woff +0 -0
  51. /package/packages/components/{global-components/sh-icon → sh-icon}/css/default/ionicons.woff2 +0 -0
  52. /package/packages/components/{global-components/sh-icon → sh-icon}/css/font/iconfont.js +0 -0
  53. /package/packages/components/{global-components/sh-icon → sh-icon}/css/font/iconfont.json +0 -0
  54. /package/packages/components/{global-components/sh-icon → sh-icon}/css/font/iconfont.ttf +0 -0
  55. /package/packages/components/{global-components/sh-icon → sh-icon}/css/font/iconfont.woff +0 -0
  56. /package/packages/components/{global-components/sh-icon → sh-icon}/css/font/iconfont.woff2 +0 -0
  57. /package/packages/components/{global-components/sh-icon → sh-icon}/css/font/icons.scss +0 -0
  58. /package/packages/components/{global-components/sh-icon → sh-icon}/css/index.scss +0 -0
  59. /package/packages/components/{global-components/sh-icon → sh-icon}/index.vue +0 -0
  60. /package/packages/components/{global-components/sh-image → sh-image}/index.vue +0 -0
  61. /package/packages/components/{global-components/sh-list → sh-list}/index.vue +0 -0
  62. /package/packages/components/{global-components/sh-loading → sh-loading}/index.vue +0 -0
  63. /package/packages/components/{global-components/sh-modal → sh-modal}/index.vue +0 -0
  64. /package/packages/components/{global-components/sh-noticebar → sh-noticebar}/index.vue +0 -0
  65. /package/packages/components/{global-components/sh-pull-refresh → sh-pull-refresh}/index.vue +0 -0
  66. /package/packages/components/{global-components/sh-result → sh-result}/index.vue +0 -0
  67. /package/packages/components/{global-components/sh-row → sh-row}/css/index.scss +0 -0
  68. /package/packages/components/{global-components/sh-row → sh-row}/index.vue +0 -0
  69. /package/packages/components/{global-components/sh-split → sh-split}/components/trigger.vue +0 -0
  70. /package/packages/components/{global-components/sh-split → sh-split}/index.vue +0 -0
  71. /package/packages/components/{global-components/sh-table → sh-table}/components/importModal.vue +0 -0
  72. /package/packages/components/{global-components/sh-table → sh-table}/components/sh-column.vue +0 -0
  73. /package/packages/components/{global-components/sh-table → sh-table}/grid.vue +0 -0
  74. /package/packages/components/{global-components/sh-table → sh-table}/js/excel_to_json.js +0 -0
  75. /package/packages/components/{global-components/sh-table → sh-table}/js/props.js +0 -0
  76. /package/packages/components/{global-components/sh-table → sh-table}/js/tableMethods.js +0 -0
  77. /package/packages/components/{global-components/sh-tag → sh-tag}/index.vue +0 -0
  78. /package/packages/components/{global-components/sh-toolbar → sh-toolbar}/index.vue +0 -0
  79. /package/packages/components/{global-components/sh-upload → sh-upload}/index.vue +0 -0
  80. /package/packages/components/{global-components/sh-upload → sh-upload}/js/ajax.js +0 -0
  81. /package/packages/components/{global-components/sh-water-fall → sh-water-fall}/index.vue +0 -0
  82. /package/packages/components/{global-components/sh-water-mark → sh-water-mark}/index.vue +0 -0
  83. /package/packages/{components/other-components → other}/sh-cron-modal/components/cron-content.vue +0 -0
  84. /package/packages/{components/other-components → other}/sh-cron-modal/css/index.scss +0 -0
  85. /package/packages/{components/other-components → other}/sh-cron-modal/index.vue +0 -0
  86. /package/packages/{components/other-components → other}/sh-cron-modal/mixin/cron-emits.js +0 -0
  87. /package/packages/{components/other-components → other}/sh-cron-modal/mixin/cron-hooks.js +0 -0
  88. /package/packages/{components/other-components → other}/sh-cron-modal/mixin/cron-props.js +0 -0
  89. /package/packages/{components/other-components → other}/sh-cron-modal/tabs/cron-day-box.vue +0 -0
  90. /package/packages/{components/other-components → other}/sh-cron-modal/tabs/cron-hour-box.vue +0 -0
  91. /package/packages/{components/other-components → other}/sh-cron-modal/tabs/cron-minute-box.vue +0 -0
  92. /package/packages/{components/other-components → other}/sh-cron-modal/tabs/cron-month-box.vue +0 -0
  93. /package/packages/{components/other-components → other}/sh-cron-modal/tabs/cron-second-box.vue +0 -0
  94. /package/packages/{components/other-components → other}/sh-cron-modal/tabs/cron-year-box.vue +0 -0
  95. /package/packages/{components/other-components → other}/sh-cron-modal/utils/index.js +0 -0
  96. /package/packages/{components/other-components → other}/sh-markdown/index.vue +0 -0
  97. /package/packages/{components/other-components → other}/sh-markdown/tinymce/langs/zh-Hans.js +0 -0
  98. /package/packages/{components/other-components → other}/sh-markdown/tinymce/skins/content/default/content.css +0 -0
  99. /package/packages/{components/other-components → other}/sh-markdown/tinymce/skins/ui/oxide/content.css +0 -0
  100. /package/packages/{components/other-components → other}/sh-markdown/tinymce/skins/ui/oxide/content.inline.css +0 -0
  101. /package/packages/{components/other-components → other}/sh-markdown/tinymce/skins/ui/oxide/content.inline.min.css +0 -0
  102. /package/packages/{components/other-components → other}/sh-markdown/tinymce/skins/ui/oxide/content.min.css +0 -0
  103. /package/packages/{components/other-components → other}/sh-markdown/tinymce/skins/ui/oxide/content.mobile.css +0 -0
  104. /package/packages/{components/other-components → other}/sh-markdown/tinymce/skins/ui/oxide/content.mobile.min.css +0 -0
  105. /package/packages/{components/other-components → other}/sh-markdown/tinymce/skins/ui/oxide/fonts/tinymce-mobile.woff +0 -0
  106. /package/packages/{components/other-components → other}/sh-markdown/tinymce/skins/ui/oxide/skin.css +0 -0
  107. /package/packages/{components/other-components → other}/sh-markdown/tinymce/skins/ui/oxide/skin.min.css +0 -0
  108. /package/packages/{components/other-components → other}/sh-markdown/tinymce/skins/ui/oxide/skin.mobile.css +0 -0
  109. /package/packages/{components/other-components → other}/sh-markdown/tinymce/skins/ui/oxide/skin.mobile.min.css +0 -0
  110. /package/packages/{components/other-components → other}/sh-markdown/tinymce/skins/ui/oxide/skin.shadowdom.css +0 -0
  111. /package/packages/{components/other-components → other}/sh-markdown/tinymce/skins/ui/oxide/skin.shadowdom.min.css +0 -0
  112. /package/packages/{components/other-components → other}/sh-menu/menu-group-content.vue +0 -0
  113. /package/packages/{components/other-components → other}/sh-menu-card/index.vue +0 -0
  114. /package/packages/{components/other-components → other}/sh-menu-card/menu-box.vue +0 -0
  115. /package/packages/{components/other-components → other}/sh-preview/components/sh-word.vue +0 -0
  116. /package/packages/{components/other-components → other}/sh-preview/js/data-hook.js +0 -0
  117. /package/packages/{components/other-components → other}/sh-preview/js/data-props.js +0 -0
  118. /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="{ 'sh-tabs-card': type === 'card' }">
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"><sh-icon type="ios-arrow-back"></sh-icon></span>
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"><sh-icon type="ios-arrow-forward"></sh-icon></span>
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
- <template v-for="(tab, tabIndex) in tabList" :key="tabIndex">
30
- <div class="sh-tabs-content-item">
31
- <slot :name="tab[labelKey]" v-bind="tab">{{ tab[labelField] }}</slot>
32
- </div>
33
- </template>
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 containerWidth = navScrollRef.value.offsetWidth
132
+ const navScrollOffset = isHorizontal.value ? navScrollRef.value.offsetHeight : navScrollRef.value.offsetWidth
115
133
  const currentOffset = getCurrentScrollOffset()
116
134
  if (!currentOffset) return
117
- let newOffset = currentOffset > containerWidth ? currentOffset - containerWidth : 0
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 navWidth = navRef.value.offsetWidth
122
- const containerWidth = navScrollRef.value.offsetWidth
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 (navWidth - currentOffset <= containerWidth) return
125
- let newOffset = navWidth - currentOffset > containerWidth * 2 ? currentOffset + containerWidth : navWidth - containerWidth
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
- navStyle.value.transform = `translateX(-${value}px)`
150
+ const direction = isHorizontal.value ? 'Y' : 'X'
151
+ navStyle.value.transform = `translate${direction}(-${value}px)`
130
152
  }
131
153
  const getCurrentScrollOffset = () => {
132
- return navStyle.value.transform ? Number(navStyle.value.transform.match(/translateX\(-(\d+(\.\d+)*)px\)/)[1]) : 0
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
- return {
139
- marginLeft: tabIndex ? `${props.gutter}px` : 0
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 navWidth = navRef.value.offsetWidth
144
- const containerWidth = navScrollRef.value.offsetWidth
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 (containerWidth < navWidth) {
177
+ if (containerOffset < navOffset) {
147
178
  scrollable.value = true
148
- if (navWidth - currentOffset < containerWidth) {
149
- setOffset(navWidth - containerWidth)
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 navWidth = navRef.value.offsetWidth
177
- const containerWidth = navScrollRef.value.offsetWidth
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].offsetWidth) + props.gutter
216
+ offset += parseFloat(prevTabs[i][offsetName]) + props.gutter
185
217
  }
186
218
  barOffset = offset
187
219
  }
188
- let navOffset = navWidth - barOffset < containerWidth ? navWidth - containerWidth : barOffset
189
- setOffset(navOffset)
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 8px #999;
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
- width: fit-content;
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 ? '230px' : props.height,
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,
@@ -34,6 +34,7 @@
34
34
  }
35
35
 
36
36
  .sh-tree-select-dropdown {
37
+ height: 230px
37
38
  }
38
39
 
39
40
  .sh-vxe-tree-table{
@@ -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-content">
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(props.modelValue)
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.endsWith('Id') ? String(field).replace('Id', '') : 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
- selectedKeys.value = value
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
 
@@ -1,6 +1,6 @@
1
1
  export default {
2
2
  modelValue: {
3
- type: Array,
3
+ type: [Array, String],
4
4
  default() {
5
5
  return []
6
6
  }
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 globalComponents 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(globalComponents, 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
+ 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
- emits: cronEmits,
40
- import cronHooks from '../mixin/cron-hooks'
41
- import cronEmits from '../mixin/cron-emits'
42
- const WEEK_MAP_EN = {
43
- 1: 'SUN',
44
- 2: 'MON',
45
- 3: 'TUE',
46
- 4: 'WED',
47
- 5: 'THU',
48
- 6: 'FRI',
49
- 7: 'SAT'
50
- }
51
- const WEEK_MAP_CN = {
52
- 1: '周日',
53
- 2: '周一',
54
- 3: '周二',
55
- 4: '周三',
56
- 5: '周四',
57
- 6: '周五',
58
- 7: '周六'
59
- }
60
- export default defineComponent({
61
- name: 'CronWeekBox',
62
- props: {
63
- ...cronProps,
64
- day: {
65
- type: String,
66
- default: '*'
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>