sh-view 2.1.0 → 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 (128) 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 +209 -182
  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 +140 -129
  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 +73 -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 +40 -30
  61. package/packages/components/other-components/sh-menu-card/index.vue +70 -64
  62. package/packages/components/other-components/sh-menu-card/menu-box.vue +50 -44
  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 +28 -24
  69. package/packages/css/index.js +4 -4
  70. package/packages/directive/module/prevent-click.js +1 -1
  71. package/packages/directive/module/resize.js +11 -154
  72. package/packages/index.js +39 -39
  73. package/packages/mixin/index.js +86 -87
  74. package/packages/vxeTable/render/cell/vxe-render-checkbox.vue +14 -5
  75. package/packages/vxeTable/render/cell/vxe-render-checkgroup.vue +43 -36
  76. package/packages/vxeTable/render/cell/vxe-render-code.vue +14 -5
  77. package/packages/vxeTable/render/cell/vxe-render-goption.vue +34 -24
  78. package/packages/vxeTable/render/cell/vxe-render-href.vue +21 -11
  79. package/packages/vxeTable/render/cell/vxe-render-img.vue +16 -10
  80. package/packages/vxeTable/render/cell/vxe-render-input.vue +83 -79
  81. package/packages/vxeTable/render/cell/vxe-render-money.vue +14 -6
  82. package/packages/vxeTable/render/cell/vxe-render-progress.vue +28 -19
  83. package/packages/vxeTable/render/cell/vxe-render-radio.vue +14 -5
  84. package/packages/vxeTable/render/cell/vxe-render-radiogroup.vue +43 -36
  85. package/packages/vxeTable/render/cell/vxe-render-select.vue +44 -36
  86. package/packages/vxeTable/render/cell/vxe-render-switch.vue +14 -5
  87. package/packages/vxeTable/render/cell/vxe-render-table.vue +51 -78
  88. package/packages/vxeTable/render/cell/vxe-render-textarea.vue +14 -5
  89. package/packages/vxeTable/render/cell/vxe-render-time.vue +23 -13
  90. package/packages/vxeTable/render/cell/vxe-render-tree.vue +23 -27
  91. package/packages/vxeTable/render/cell/vxe-render-upload.vue +11 -7
  92. package/packages/vxeTable/render/filters/vxe-filter-input.vue +25 -43
  93. package/packages/vxeTable/render/footer/vxe-footer-input.vue +23 -13
  94. package/packages/vxeTable/render/footer/vxe-footer-money.vue +30 -20
  95. package/packages/vxeTable/render/globalRenders.jsx +1 -1
  96. package/packages/vxeTable/render/header/vxe-header-money.vue +31 -21
  97. package/packages/vxeTable/render/mixin/cell-hooks.js +162 -0
  98. package/packages/vxeTable/render/mixin/cell-props.js +23 -0
  99. package/packages/vxeTable/render/mixin/filter-hooks.js +28 -0
  100. package/packages/components/global-components/sh-form/components/form-item.vue +0 -25
  101. package/packages/components/global-components/sh-form/css/index.scss +0 -55
  102. package/packages/components/global-components/sh-form/index.vue +0 -114
  103. package/packages/components/global-components/sh-form/js/methods.js +0 -146
  104. package/packages/components/global-components/sh-form/mixin/defaultData.js +0 -32
  105. package/packages/components/global-components/sh-icon/css/default/index.scss +0 -27
  106. package/packages/components/global-components/sh-icon/css/font/index.scss +0 -16
  107. package/packages/components/global-components/sh-icon/icon-default.vue +0 -32
  108. package/packages/components/global-components/sh-icon/icon-font.vue +0 -32
  109. package/packages/components/global-components/sh-poptip/popper.js +0 -115
  110. package/packages/components/global-components/sh-query/index.vue +0 -317
  111. package/packages/components/global-components/sh-table/js/methods.js +0 -549
  112. package/packages/components/global-components/sh-table/mixin/defaultData.js +0 -94
  113. package/packages/components/global-components/sh-upload/js/mixin.js +0 -257
  114. package/packages/components/other-components/sh-cron-modal/mixin/cron-box.js +0 -169
  115. package/packages/vxeTable/render/mixin/cell-mixin.js +0 -195
  116. /package/packages/components/global-components/sh-icon/css/default/{fonts/ionicons.svg → ionicons.svg} +0 -0
  117. /package/packages/components/global-components/sh-icon/css/default/{fonts/ionicons.ttf → ionicons.ttf} +0 -0
  118. /package/packages/components/global-components/sh-icon/css/default/{fonts/ionicons.woff → ionicons.woff} +0 -0
  119. /package/packages/components/global-components/sh-icon/css/default/{fonts/ionicons.woff2 → ionicons.woff2} +0 -0
  120. /package/packages/components/global-components/sh-icon/css/font/{fonts/iconfont.js → iconfont.js} +0 -0
  121. /package/packages/components/global-components/sh-icon/css/font/{fonts/iconfont.json → iconfont.json} +0 -0
  122. /package/packages/components/global-components/sh-icon/css/font/{fonts/iconfont.ttf → iconfont.ttf} +0 -0
  123. /package/packages/components/global-components/sh-icon/css/font/{fonts/iconfont.woff → iconfont.woff} +0 -0
  124. /package/packages/components/global-components/sh-icon/css/font/{fonts/iconfont.woff2 → iconfont.woff2} +0 -0
  125. /package/packages/{assets/css → css}/animated.scss +0 -0
  126. /package/packages/{assets/css → css}/loader.scss +0 -0
  127. /package/packages/{assets/css → css}/main.scss +0 -0
  128. /package/packages/{assets/css → css}/theme.scss +0 -0
@@ -1,6 +1,6 @@
1
1
  <template>
2
2
  <div v-if="showChildren(menuItem)" class="sh-menu-group" :class="groupClass">
3
- <menuItemContent ref="groupItem" :menu-item="menuItem" :menu-level="menuLevel" :arrow="isArrow" @click="onMenuExpand(!expand)" />
3
+ <menuItemContent ref="groupItemRef" :menu-item="menuItem" :menu-level="menuLevel" :arrow="isArrow" @click="onMenuExpand(!expand)" />
4
4
  <div v-show="expand" ref="groupList" class="sh-menu-group-list" :class="groupListClass" :style="groupListStyle">
5
5
  <template v-for="(item, index) in menuItem.children" :key="`sh-menu-${menuLevel}-${index}`">
6
6
  <menuGroupContent :menu-item="item" :menu-level="menuNextLevel" />
@@ -13,17 +13,13 @@
13
13
  </template>
14
14
 
15
15
  <script>
16
+ import { defineComponent, computed, getCurrentInstance, ref, watch, onMounted, inject } from 'vue'
16
17
  import menuItemContent from './menu-item-content.vue'
17
- export default {
18
+ export default defineComponent({
18
19
  name: 'MenuGroupContent',
19
20
  components: {
20
21
  menuItemContent
21
22
  },
22
- inject: {
23
- MenuInstance: {
24
- default: null
25
- }
26
- },
27
23
  props: {
28
24
  menuLevel: {
29
25
  type: Number,
@@ -36,51 +32,43 @@ export default {
36
32
  }
37
33
  }
38
34
  },
39
- data() {
40
- return {
41
- expand: false,
42
- groupListStyle: {}
43
- }
44
- },
45
- computed: {
46
- menuNextLevel() {
47
- return this.menuLevel + 1
48
- },
49
- isArrow() {
50
- return this.MenuInstance.collapsed ? !!this.menuLevel : true
51
- },
52
- groupClass() {
35
+ setup(props, context) {
36
+ const { proxy } = getCurrentInstance()
37
+ const { $vUtils } = proxy
38
+ const { emit, slots } = context
39
+ const MenuInstance = inject('MenuInstance')
40
+
41
+ const groupItemRef = ref()
42
+ const expand = ref(false)
43
+ const groupListStyle = ref({})
44
+
45
+ const menuNextLevel = computed(() => props.menuLevel + 1)
46
+ const isArrow = computed(() => {
47
+ return MenuInstance.collapsed ? !!props.menuLevel : true
48
+ })
49
+ const groupClass = computed(() => {
53
50
  return {
54
- is__level: !this.menuLevel,
55
- is__active: this.MenuInstance.activeNames.includes(this.menuItem.name),
56
- is__expand: this.expand
51
+ is__level: !props.menuLevel,
52
+ is__active: MenuInstance.activeNames.value.includes(props.menuItem.name),
53
+ is__expand: expand.value
57
54
  }
58
- },
59
- groupListClass() {
60
- const { mode, collapsed } = this.MenuInstance
55
+ })
56
+ const groupListClass = computed(() => {
57
+ const { mode, collapsed } = MenuInstance
61
58
  return {
62
59
  'sh-menu-group-dropdown': mode === 'horizontal',
63
60
  'sh-menu-group-dropright': mode === 'vertical' && collapsed
64
61
  }
65
- }
66
- },
67
- watch: {
68
- 'MenuInstance.openedNames'(names) {
69
- this.setMenuExpand()
70
- }
71
- },
72
- mounted() {
73
- this.setMenuExpand()
74
- },
75
- methods: {
76
- setMenuExpand() {
77
- let names = this.MenuInstance.openedNames
78
- this.expand = names.includes(this.menuItem.name)
79
- const { mode, collapsed } = this.MenuInstance
80
- if (this.expand && this.$refs.groupItem && ((mode === 'vertical' && collapsed) || mode === 'horizontal')) {
81
- this.$nextTick(() => {
82
- const { left, right, top, bottom } = this.$refs.groupItem.$refs?.shMenuItem.getBoundingClientRect()
83
- const { offsetHeight, offsetWidth } = this.$refs.groupList
62
+ })
63
+
64
+ const setMenuExpand = () => {
65
+ const { mode, collapsed, openedNames } = MenuInstance
66
+ let names = openedNames.value
67
+ expand.value = names.includes(props.menuItem.name)
68
+ if (expand.value && groupItemRef.value && ((mode === 'vertical' && collapsed) || mode === 'horizontal')) {
69
+ nextTick(() => {
70
+ const { offsetHeight, offsetWidth, itemRef } = groupItemRef.value
71
+ const { left, right, top, bottom } = itemRef.value.getBoundingClientRect()
84
72
  const winWidth = window.innerWidth
85
73
  const winHeight = window.innerHeight
86
74
  if (mode === 'vertical') {
@@ -93,30 +81,54 @@ export default {
93
81
  } else {
94
82
  groupStyle.top = `${top}px`
95
83
  }
96
- this.groupListStyle = groupStyle
84
+ groupListStyle.value = groupStyle
97
85
  } else {
98
- let groupStyle = { top: `${this.menuLevel ? top : bottom}px` }
86
+ let groupStyle = { top: `${props.menuLevel ? top : bottom}px` }
99
87
  if (right + offsetWidth >= winWidth) {
100
88
  groupStyle.right = '10px'
101
89
  } else {
102
- groupStyle.left = `${this.menuLevel ? right : left}px`
90
+ groupStyle.left = `${props.menuLevel ? right : left}px`
103
91
  }
104
- this.groupListStyle = groupStyle
92
+ groupListStyle.value = groupStyle
105
93
  }
106
94
  })
107
95
  }
108
- },
109
- showChildren(item) {
96
+ }
97
+ const showChildren = item => {
110
98
  return item.children && item.children.length > 0
111
- },
112
- onMenuClick() {
113
- this.MenuInstance.onMenuSelect(this.menuItem)
114
- },
115
- onMenuExpand(value) {
116
- this.MenuInstance.onMenuExpand(value, this.menuItem)
99
+ }
100
+ const onMenuClick = () => {
101
+ MenuInstance.onMenuSelect(props.menuItem)
102
+ }
103
+ const onMenuExpand = value => {
104
+ MenuInstance.onMenuExpand(value, props.menuItem)
105
+ }
106
+
107
+ watch(
108
+ () => MenuInstance.openedNames.value,
109
+ () => {
110
+ setMenuExpand()
111
+ }
112
+ )
113
+
114
+ onMounted(() => {
115
+ setMenuExpand()
116
+ })
117
+
118
+ return {
119
+ groupItemRef,
120
+ groupClass,
121
+ groupListClass,
122
+ groupListStyle,
123
+ isArrow,
124
+ expand,
125
+ menuNextLevel,
126
+ showChildren,
127
+ onMenuExpand,
128
+ onMenuClick
117
129
  }
118
130
  }
119
- }
131
+ })
120
132
  </script>
121
133
 
122
134
  <style scoped></style>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div ref="shMenuItem" class="sh-menu-item" :class="itemClass" :style="itemStyle">
2
+ <div ref="itemRef" class="sh-menu-item" :class="itemClass" :style="itemStyle">
3
3
  <sh-icon v-if="iconType" class="sh-menu-item-icon" :type="iconType"></sh-icon>
4
4
  <span class="sh-menu-item-title">{{ itemTitle }}</span>
5
5
  <sh-icon v-if="arrow" class="sh-menu-item-arrow" type="ios-arrow-forward"></sh-icon>
@@ -7,13 +7,9 @@
7
7
  </template>
8
8
 
9
9
  <script>
10
- export default {
10
+ import { defineComponent, computed, getCurrentInstance, ref, inject } from 'vue'
11
+ export default defineComponent({
11
12
  name: 'MenuItemBox',
12
- inject: {
13
- MenuInstance: {
14
- default: null
15
- }
16
- },
17
13
  props: {
18
14
  arrow: Boolean,
19
15
  menuLevel: {
@@ -26,36 +22,50 @@ export default {
26
22
  }
27
23
  }
28
24
  },
29
- computed: {
30
- defaultIcon() {
31
- if (!this.menuLevel || this.menuLevel < 2) return 'md-folder'
32
- else if (this.menuLevel === 2) return 'md-bookmark'
25
+ setup(props, context) {
26
+ const { proxy } = getCurrentInstance()
27
+ const { $vUtils } = proxy
28
+ const { emit, slots } = context
29
+ const MenuInstance = inject('MenuInstance')
30
+
31
+ const itemRef = ref()
32
+
33
+ const defaultIcon = computed(() => {
34
+ if (!props.menuLevel || props.menuLevel < 1) return 'md-folder'
35
+ else if (props.menuLevel === 1) return 'md-bookmark'
33
36
  else return ''
34
- },
35
- iconType() {
36
- return this.menuItem.meta?.icon || this.menuItem.icon || this.defaultIcon
37
- },
38
- itemClass() {
37
+ })
38
+ const iconType = computed(() => {
39
+ return props.menuItem.meta?.icon || props.menuItem.icon || defaultIcon.value
40
+ })
41
+ const itemClass = computed(() => {
39
42
  return {
40
- 'sh-menu-item-level': !this.menuLevel,
41
- 'sh-menu-item-active': this.MenuInstance.activeName === this.menuItem.name
43
+ 'sh-menu-item-level': !props.menuLevel,
44
+ 'sh-menu-item-active': MenuInstance.activeName.value === props.menuItem.name
42
45
  }
43
- },
44
- itemStyle() {
46
+ })
47
+ const itemStyle = computed(() => {
45
48
  let result = {}
46
- const { mode, collapsed, indent } = this.MenuInstance
47
- if (mode === 'vertical' && !collapsed && this.menuLevel) {
48
- result.paddingLeft = `${indent * this.menuLevel}px`
49
+ const { mode, collapsed, indent } = MenuInstance
50
+ if (mode === 'vertical' && !collapsed && props.menuLevel) {
51
+ result.paddingLeft = `${indent * props.menuLevel}px`
49
52
  }
50
53
  return result
51
- },
52
- itemTitle() {
53
- const { labelField, labelFormat } = this.MenuInstance
54
- return labelFormat ? labelFormat(this.menuItem) : this.$vUtils.get(this.menuItem, labelField)
54
+ })
55
+ const itemTitle = computed(() => {
56
+ const { labelField, labelFormat } = MenuInstance
57
+ return labelFormat ? labelFormat(props.menuItem) : $vUtils.get(props.menuItem, labelField)
58
+ })
59
+
60
+ return {
61
+ itemRef,
62
+ itemClass,
63
+ itemStyle,
64
+ itemTitle,
65
+ iconType
55
66
  }
56
- },
57
- methods: {}
58
- }
67
+ }
68
+ })
59
69
  </script>
60
70
 
61
71
  <style scoped></style>
@@ -11,6 +11,7 @@
11
11
  transfer
12
12
  :title="cardBtn.name"
13
13
  :width="poptipWidth"
14
+ :height="poptipHeight"
14
15
  :placement="cardBtn.placement"
15
16
  @popper-show="handleFocusBtn(cardBtn, menuindex)"
16
17
  @popper-hide="handleBlurBtn(cardBtn, menuindex)">
@@ -20,10 +21,8 @@
20
21
  <sh-corner v-if="getBudgeNum(menuitem, cardBtn)" v-bind="btnCornerConfig(cardBtn, menuitem, menuindex)"></sh-corner>
21
22
  </div>
22
23
  <template #content>
23
- <div class="cardPoptipContent">
24
- <menuBox v-if="cardActive.startsWith('menus')" :menu="menuitem" first></menuBox>
25
- <sh-empty v-else></sh-empty>
26
- </div>
24
+ <menuBox v-if="cardActive.startsWith('menus')" :menu="menuitem" first></menuBox>
25
+ <sh-empty v-else></sh-empty>
27
26
  </template>
28
27
  </sh-poptip>
29
28
  </template>
@@ -43,17 +42,13 @@
43
42
  </template>
44
43
 
45
44
  <script>
45
+ import { defineComponent, computed, provide, getCurrentInstance, ref, onMounted } from 'vue'
46
46
  import menuBox from './menu-box.vue'
47
- export default {
47
+ export default defineComponent({
48
48
  name: 'MenuCard',
49
49
  components: {
50
50
  menuBox
51
51
  },
52
- provide() {
53
- return {
54
- MenuCardInstance: this
55
- }
56
- },
57
52
  props: {
58
53
  list: {
59
54
  type: Array,
@@ -98,30 +93,24 @@ export default {
98
93
  }
99
94
  },
100
95
  emits: ['select'],
101
- data() {
102
- return {
103
- poptipWidth: 320,
104
- cardActive: ''
105
- }
106
- },
107
- computed: {
108
- colsConfig() {
109
- return {
110
- xs: { span: 24 },
111
- sm: { span: 24 },
112
- md: { span: 12 },
113
- lg: { span: 8 },
114
- xl: { span: 8 },
115
- xxl: { span: 6 }
116
- }
117
- }
118
- },
119
- methods: {
96
+ setup(props, context) {
97
+ const { proxy } = getCurrentInstance()
98
+ const { $vUtils } = proxy
99
+ const { emit, slots } = context
100
+
101
+ const poptipWidth = 320
102
+ const poptipHeight = 300
103
+ const cardActive = ref('')
104
+
105
+ const colsConfig = computed(() => {
106
+ return { xs: { span: 24 }, sm: { span: 24 }, md: { span: 12 }, lg: { span: 8 }, xl: { span: 8 }, xxl: { span: 6 } }
107
+ })
108
+
120
109
  // 重新生成卡片列表
121
- resetRenderList(list) {
122
- return this.$vUtils.mapTree(list, item => {
110
+ const resetRenderList = list => {
111
+ return $vUtils.mapTree(list, item => {
123
112
  return {
124
- buttons: this.cardBtns.map(btn => {
113
+ buttons: props.cardBtns.map(btn => {
125
114
  return {
126
115
  visible: false,
127
116
  placement: 'bottom-start',
@@ -131,65 +120,82 @@ export default {
131
120
  ...item
132
121
  }
133
122
  })
134
- },
123
+ }
135
124
  // 动态角标配置
136
- btnCornerConfig(cardBtn, menuitem, menuindex) {
125
+ const btnCornerConfig = (cardBtn, menuitem, menuindex) => {
137
126
  return {
138
- title: this.getBudgeNum(menuitem, cardBtn),
127
+ title: getBudgeNum(menuitem, cardBtn),
139
128
  dark: true,
140
129
  width: '30',
141
130
  height: '30',
142
- color: this.getMenuColor(menuindex)
131
+ color: getMenuColor(menuindex)
143
132
  }
144
- },
145
- getMenuColor(menuindex, active) {
146
- return this.getCardStyle(menuindex, true)[active ? 'color' : 'backgroundColor']
147
- },
148
- getCardStyle(index, active) {
149
- let themeLength = this.menuColors.length
150
- let backgroundColor = this.menuColors[index % themeLength][active ? 'active' : 'default']
133
+ }
134
+ const getMenuColor = (menuindex, active) => {
135
+ return getCardStyle(menuindex, true)[active ? 'color' : 'backgroundColor']
136
+ }
137
+ const getCardStyle = (index, active) => {
138
+ let themeLength = props.menuColors.length
139
+ let backgroundColor = props.menuColors[index % themeLength][active ? 'active' : 'default']
151
140
  let color = active ? '#fff' : ''
152
141
  return { backgroundColor, color }
153
- },
154
- getBudgeNum(menu, card) {
142
+ }
143
+ const getBudgeNum = (menu, card) => {
155
144
  switch (card.value) {
156
145
  case 'menus':
157
- return this.$vUtils.toTreeArray(menu.children || []).length
146
+ return $vUtils.toTreeArray(menu.children || []).length
158
147
  default:
159
148
  return ''
160
149
  }
161
- },
162
- handleCardBtn($event, cardBtn, menu, menuIndex) {
150
+ }
151
+ const handleCardBtn = ($event, cardBtn, menu, menuIndex) => {
163
152
  if (!menu.children || menu.children.length < 1) {
164
153
  cardBtn.visible = false
165
- return this.routerTo(menu)
154
+ onMenuSelect(menu)
155
+ return
166
156
  }
167
157
  let windowWidth = window.document.body.clientWidth
168
158
  let selfOffsetRight = windowWidth - $event.pageX
169
- cardBtn.placement = selfOffsetRight < this.poptipWidth ? 'bottom-end' : 'bottom-start'
159
+ cardBtn.placement = selfOffsetRight < poptipWidth ? 'bottom-end' : 'bottom-start'
170
160
  cardBtn.visible = true
171
- },
172
- handleFocusBtn(card, index) {
173
- this.cardActive = card.value + index
174
- },
175
- handleBlurBtn(card, index) {
176
- if (this.cardActive === card.value + index) this.cardActive = ''
177
- },
178
- onMenuSelect(menu) {
179
- this.$emit('select', menu)
161
+ }
162
+ const handleFocusBtn = (card, index) => {
163
+ cardActive.value = card.value + index
164
+ }
165
+ const handleBlurBtn = (card, index) => {
166
+ if (cardActive.value === card.value + index) cardActive.value = ''
167
+ }
168
+ const onMenuSelect = menu => {
169
+ emit('select', menu)
170
+ }
171
+
172
+ provide('MenuCardInstance', {
173
+ ...props,
174
+ onMenuSelect
175
+ })
176
+
177
+ return {
178
+ cardActive,
179
+ poptipWidth,
180
+ poptipHeight,
181
+ colsConfig,
182
+ resetRenderList,
183
+ btnCornerConfig,
184
+ getMenuColor,
185
+ getCardStyle,
186
+ getBudgeNum,
187
+ handleFocusBtn,
188
+ handleBlurBtn,
189
+ handleCardBtn
180
190
  }
181
191
  }
182
- }
192
+ })
183
193
  </script>
184
194
 
185
195
  <style lang="scss">
186
196
  .menuCard {
187
197
  margin-bottom: 10px;
188
198
  }
189
- .cardPoptipContent {
190
- max-height: 400px;
191
- overflow: auto;
192
- }
193
199
  .cardBtnsWrap {
194
200
  position: relative;
195
201
  display: flex;
@@ -1,6 +1,6 @@
1
1
  <template>
2
2
  <div class="menuBoxWrap" :class="{ first }">
3
- <template v-if="menus.length > 0">
3
+ <template v-if="menusList.length > 0">
4
4
  <div v-if="first" class="menuBoxFilter">
5
5
  <vxe-input v-model="filterText" size="mini" class="w-100" clearable placeholder="请输入关键词" prefix-icon="vxe-icon-search"></vxe-input>
6
6
  </div>
@@ -14,13 +14,9 @@
14
14
  </template>
15
15
 
16
16
  <script>
17
- export default {
17
+ import { defineComponent, computed, getCurrentInstance, watch, ref, inject } from 'vue'
18
+ export default defineComponent({
18
19
  name: 'MenuBox',
19
- inject: {
20
- MenuCardInstance: {
21
- default: null
22
- }
23
- },
24
20
  props: {
25
21
  menu: {
26
22
  type: [Object, Array],
@@ -32,50 +28,60 @@ export default {
32
28
  type: Boolean
33
29
  }
34
30
  },
35
- data() {
36
- return {
37
- filterText: '',
38
- filterData: null,
39
- filterChangeDebounce: this.$vUtils.debounce(this.handleMenuFilter, 500)
31
+ setup(props, context) {
32
+ const { proxy } = getCurrentInstance()
33
+ const { $vUtils } = proxy
34
+ const { emit, slots } = context
35
+ const MenuCardInstance = inject('MenuCardInstance')
36
+
37
+ const filterText = ref('')
38
+ const filterData = ref(null)
39
+
40
+ const menusList = computed(() => {
41
+ return Array.isArray(props.menu) ? props.menu : props.menu?.children || []
42
+ })
43
+ const menuBoxList = computed(() => {
44
+ return filterData.value || menusList.value
45
+ })
46
+
47
+ const hasChildren = menu => {
48
+ return menu && menu.children && Array.isArray(menu.children) && menu.children.length > 0
40
49
  }
41
- },
42
- computed: {
43
- menus() {
44
- return Array.isArray(this.menu) ? this.menu : this.menu?.children || []
45
- },
46
- menuBoxList() {
47
- return this.filterData || this.menus
50
+ const getItemTitle = menu => {
51
+ const { labelField, labelFormat } = MenuCardInstance
52
+ return labelFormat ? labelFormat(menu) : $vUtils.get(menu, labelField) || ''
48
53
  }
49
- },
50
- watch: {
51
- filterText: {
52
- handler(newvalue, oldValue) {
53
- this.filterChangeDebounce(newvalue)
54
- }
54
+ const handleMenuClick = item => {
55
+ MenuCardInstance.onMenuSelect(item)
55
56
  }
56
- },
57
- methods: {
58
- hasChildren(menu) {
59
- return menu && menu.children && Array.isArray(menu.children) && menu.children.length > 0
60
- },
61
- getItemTitle(menu) {
62
- const { labelField, labelFormat } = this.MenuCardInstance
63
- return labelFormat ? labelFormat(menu) : this.$vUtils.get(menu, labelField) || ''
64
- },
65
- handleMenuClick(item) {
66
- this.MenuCardInstance.onMenuSelect(item)
67
- },
68
57
  // 全局搜索过滤事件
69
- handleMenuFilter(text) {
70
- const { menus, $vUtils, getItemTitle } = this
58
+ const handleMenuFilter = text => {
71
59
  let filterText = $vUtils.toValueString(text).trim().toLowerCase()
72
- let filterData = null
60
+ let searchData = null
73
61
  if (filterText) {
74
- filterData = $vUtils.searchTree(menus, menu => getItemTitle(menu).indexOf(filterText) > -1)
62
+ searchData = $vUtils.searchTree(menusList.value, menu => getItemTitle(menu).indexOf(filterText) > -1)
75
63
  }
76
- if (this.filterData === null && !filterText) return
77
- this.filterData = filterData
64
+ if (filterData.value === null && !filterText) return
65
+ filterData.value = searchData
66
+ }
67
+
68
+ const filterChangeDebounce = $vUtils.debounce(handleMenuFilter, 500)
69
+
70
+ watch(
71
+ () => filterText.value,
72
+ nv => {
73
+ filterChangeDebounce(nv)
74
+ }
75
+ )
76
+
77
+ return {
78
+ menusList,
79
+ filterText,
80
+ menuBoxList,
81
+ getItemTitle,
82
+ hasChildren,
83
+ handleMenuClick
78
84
  }
79
85
  }
80
- }
86
+ })
81
87
  </script>