sh-view 2.8.1 → 2.8.3

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 (91) hide show
  1. package/.eslintrc.js +25 -20
  2. package/other.js +8 -8
  3. package/package.json +9 -6
  4. package/packages/components/index.js +91 -91
  5. package/packages/components/sh-alert/alert.ts +30 -0
  6. package/packages/components/sh-alert/index.vue +143 -168
  7. package/packages/components/sh-badge/index.vue +242 -242
  8. package/packages/components/sh-calendar/index.vue +650 -650
  9. package/packages/components/sh-card/index.vue +148 -148
  10. package/packages/components/sh-code-editor/index.vue +19 -19
  11. package/packages/components/sh-col/index.vue +92 -92
  12. package/packages/components/sh-corner/index.vue +230 -230
  13. package/packages/components/sh-count-to/index.vue +131 -131
  14. package/packages/components/sh-date/index.vue +301 -301
  15. package/packages/components/sh-drawer/index.vue +579 -579
  16. package/packages/components/sh-drawer/scrollbar.js +78 -78
  17. package/packages/components/sh-empty/index.vue +42 -42
  18. package/packages/components/sh-form/js/props.js +76 -76
  19. package/packages/components/sh-form/js/useForm.js +229 -229
  20. package/packages/components/sh-header/index.vue +261 -260
  21. package/packages/components/sh-icon/css/default/ionicons.svg +869 -869
  22. package/packages/components/sh-icon/css/font/iconfont.json +247 -247
  23. package/packages/components/sh-icon/index.vue +41 -41
  24. package/packages/components/sh-image/index.vue +133 -133
  25. package/packages/components/sh-list/index.vue +146 -146
  26. package/packages/components/sh-loading/index.vue +53 -53
  27. package/packages/components/sh-modal/index.vue +188 -188
  28. package/packages/components/sh-noticebar/index.vue +215 -215
  29. package/packages/components/sh-poptip/index.vue +597 -597
  30. package/packages/components/sh-progress/index.vue +276 -276
  31. package/packages/components/sh-pull-refresh/index.vue +289 -289
  32. package/packages/components/sh-result/index.vue +114 -114
  33. package/packages/components/sh-row/index.vue +66 -66
  34. package/packages/components/sh-split/components/trigger.vue +33 -33
  35. package/packages/components/sh-split/index.vue +342 -342
  36. package/packages/components/sh-table/components/importModal.vue +363 -363
  37. package/packages/components/sh-table/components/sh-column.vue +68 -68
  38. package/packages/components/sh-table/js/excel_to_json.js +313 -313
  39. package/packages/components/sh-table/js/props.js +305 -305
  40. package/packages/components/sh-table/js/tableMethods.js +167 -167
  41. package/packages/components/sh-table/js/useTable.js +636 -636
  42. package/packages/components/sh-table/table.vue +217 -217
  43. package/packages/components/sh-tabs/index.vue +426 -426
  44. package/packages/components/sh-tag/index.vue +168 -168
  45. package/packages/components/sh-toolbar/index.vue +182 -182
  46. package/packages/components/sh-tree/components/table-tree.vue +289 -289
  47. package/packages/components/sh-tree/mixin/treeProps.js +122 -122
  48. package/packages/components/sh-upload/index.vue +535 -535
  49. package/packages/components/sh-water-fall/index.vue +80 -80
  50. package/packages/components/sh-water-mark/index.vue +96 -96
  51. package/packages/css/index.js +4 -4
  52. package/packages/directive/index.js +19 -19
  53. package/packages/directive/module/click-out.js +14 -14
  54. package/packages/directive/module/draggable.js +42 -42
  55. package/packages/directive/module/line-clamp.js +22 -22
  56. package/packages/directive/module/prevent-click.js +18 -18
  57. package/packages/directive/module/resize.js +14 -14
  58. package/packages/directive/module/ripple.js +166 -166
  59. package/packages/index.js +39 -39
  60. package/packages/mixin/index.js +86 -86
  61. package/packages/other/sh-cron-modal/components/cron-content.vue +294 -294
  62. package/packages/other/sh-cron-modal/index.vue +81 -81
  63. package/packages/other/sh-cron-modal/mixin/cron-emits.js +1 -1
  64. package/packages/other/sh-cron-modal/mixin/cron-props.js +9 -9
  65. package/packages/other/sh-cron-modal/tabs/cron-week-box.vue +126 -126
  66. package/packages/other/sh-menu/index.vue +326 -326
  67. package/packages/other/sh-menu/menu-group-content.vue +136 -136
  68. package/packages/other/sh-menu/menu-item-content.vue +71 -71
  69. package/packages/other/sh-menu-card/index.vue +250 -250
  70. package/packages/other/sh-menu-card/menu-box.vue +87 -87
  71. package/packages/other/sh-preview/components/sh-excel.vue +163 -163
  72. package/packages/other/sh-preview/js/data-hook.js +41 -41
  73. package/packages/other/sh-preview/js/data-props.js +15 -15
  74. package/packages/other/sh-system-tip/index.vue +115 -115
  75. package/packages/utils/resize.js +69 -70
  76. package/packages/utils/transfer-queue.js +12 -12
  77. package/packages/vxeTable/index.js +193 -184
  78. package/packages/vxeTable/plugins/export.js +450 -450
  79. package/packages/vxeTable/render/cell/vxe-render-img.vue +27 -27
  80. package/packages/vxeTable/render/cell/vxe-render-table.vue +51 -51
  81. package/packages/vxeTable/render/cell/vxe-render-time.vue +44 -44
  82. package/packages/vxeTable/render/cell/vxe-render-tree.vue +70 -70
  83. package/packages/vxeTable/render/filters/vxe-filter-input.vue +26 -26
  84. package/packages/vxeTable/render/filters/vxe-filter-time.vue +26 -26
  85. package/packages/vxeTable/render/globalRenders.jsx +514 -514
  86. package/packages/vxeTable/render/mixin/cell-hooks.js +198 -198
  87. package/packages/vxeTable/render/mixin/cell-props.js +23 -23
  88. package/packages/vxeTable/render/mixin/filter-hooks.js +46 -46
  89. package/tsconfig.json +25 -0
  90. package/types/component.d.ts +1 -0
  91. package/types/index.ts +0 -0
@@ -1,250 +1,250 @@
1
- <template>
2
- <sh-row :gutter="10">
3
- <template v-for="(menuitem, menuindex) in resetRenderList(list)" :key="menuindex">
4
- <sh-col v-bind="colsConfig">
5
- <sh-card :icon="menuitem.icon" size="small" :title="menuitem?.meta?.title" :icon-size="18" :color="getMenuColor(menuindex)" :padding="8" class="menuCard">
6
- <div :ref="`cardBtnsWrap${menuindex}`" class="cardBtnsWrap">
7
- <template v-for="cardBtn in menuitem.buttons" :key="cardBtn.value">
8
- <template v-if="menuitem.children && menuitem.children.length > 0">
9
- <sh-poptip
10
- v-model="cardBtn.visible"
11
- transfer
12
- :title="cardBtn.name"
13
- :width="poptipWidth"
14
- :height="poptipHeight"
15
- :placement="cardBtn.placement"
16
- @popper-show="handleFocusBtn(cardBtn, menuindex)"
17
- @popper-hide="handleBlurBtn(cardBtn, menuindex)">
18
- <div class="cardBtn" :style="getCardStyle(menuindex, cardActive === cardBtn.value + menuindex)" @click="handleCardBtn($event, cardBtn, menuitem, menuindex)">
19
- <sh-icon :type="cardBtn.icon" :size="16" class="mr-2" :color="getMenuColor(menuindex, cardActive === cardBtn.value + menuindex)" />
20
- <span>{{ cardBtn.name }}</span>
21
- <sh-corner v-if="getBudgeNum(menuitem, cardBtn)" v-bind="btnCornerConfig(cardBtn, menuitem, menuindex)"></sh-corner>
22
- </div>
23
- <template #content>
24
- <menuBox v-if="cardActive.startsWith('menus')" :menu="menuitem" first></menuBox>
25
- <sh-empty v-else></sh-empty>
26
- </template>
27
- </sh-poptip>
28
- </template>
29
- <template v-else>
30
- <div class="cardBtn" :style="getCardStyle(menuindex, cardActive === cardBtn.value + menuindex)" @click="handleCardBtn($event, cardBtn, menuitem, menuindex)">
31
- <sh-icon :type="cardBtn.icon" :size="16" class="mr-2" :color="getMenuColor(menuindex, cardActive === cardBtn.value + menuindex)" />
32
- <span>{{ cardBtn.name }}</span>
33
- <sh-corner v-if="getBudgeNum(menuitem, cardBtn)" v-bind="btnCornerConfig(cardBtn, menuitem, menuindex)"></sh-corner>
34
- </div>
35
- </template>
36
- </template>
37
- </div>
38
- </sh-card>
39
- </sh-col>
40
- </template>
41
- </sh-row>
42
- </template>
43
-
44
- <script>
45
- import { defineComponent, computed, provide, getCurrentInstance, ref, reactive, onMounted } from 'vue'
46
- import menuBox from './menu-box.vue'
47
- export default defineComponent({
48
- name: 'MenuCard',
49
- components: {
50
- menuBox
51
- },
52
- props: {
53
- list: {
54
- type: Array,
55
- default() {
56
- return []
57
- }
58
- },
59
- menuColors: {
60
- type: Array,
61
- default() {
62
- return [
63
- { default: '#e7f1ff', active: '#1890ff' },
64
- { default: '#FFEFEB', active: '#FF652E' },
65
- { default: '#F4F1FF', active: '#997BFF' },
66
- { default: '#E6F6F2', active: '#01A883' },
67
- { default: '#FFF6E8', active: '#FFA522' },
68
- { default: '#ffe5e5', active: '#e62340' },
69
- { default: '#dbffff', active: '#13C2C2' },
70
- { default: '#e2f1ff', active: '#003366' },
71
- { default: '#e6cdff', active: '#722ED1' },
72
- { default: '#ffccd6', active: '#ff5d7a' }
73
- ]
74
- }
75
- },
76
- cardBtns: {
77
- type: Array,
78
- default() {
79
- return [
80
- { name: '功能菜单', value: 'menus', icon: 'ios-apps' },
81
- { name: '操作指南', value: 'guides', icon: 'ios-navigate', placement: 'bottom-end' },
82
- { name: '待办事项', value: 'todo', icon: 'md-calendar' },
83
- { name: '已办事项', value: 'untodo', icon: 'ios-calendar', placement: 'bottom-end' }
84
- ]
85
- }
86
- },
87
- labelField: {
88
- type: String,
89
- default: 'label'
90
- },
91
- labelFormat: {
92
- type: Function
93
- }
94
- },
95
- emits: ['select'],
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
-
109
- // 重新生成卡片列表
110
- const resetRenderList = list => {
111
- return $vUtils.mapTree(list, item => {
112
- return {
113
- buttons: props.cardBtns.map(btn => {
114
- return {
115
- visible: false,
116
- placement: 'bottom-start',
117
- ...btn
118
- }
119
- }),
120
- ...item
121
- }
122
- })
123
- }
124
- // 动态角标配置
125
- const btnCornerConfig = (cardBtn, menuitem, menuindex) => {
126
- return {
127
- title: getBudgeNum(menuitem, cardBtn),
128
- dark: true,
129
- width: '30',
130
- height: '30',
131
- color: getMenuColor(menuindex)
132
- }
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']
140
- let color = active ? '#fff' : ''
141
- return { backgroundColor, color }
142
- }
143
- const getBudgeNum = (menu, card) => {
144
- switch (card.value) {
145
- case 'menus':
146
- return $vUtils.toTreeArray(menu.children || []).length
147
- default:
148
- return ''
149
- }
150
- }
151
- const handleCardBtn = ($event, cardBtn, menu, menuIndex) => {
152
- if (!menu.children || menu.children.length < 1) {
153
- cardBtn.visible = false
154
- onMenuSelect(menu)
155
- return
156
- }
157
- let windowWidth = window.document.body.clientWidth
158
- let selfOffsetRight = windowWidth - $event.pageX
159
- cardBtn.placement = selfOffsetRight < poptipWidth ? 'bottom-end' : 'bottom-start'
160
- cardBtn.visible = true
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(
173
- 'MenuCardInstance',
174
- reactive({
175
- props,
176
- onMenuSelect
177
- })
178
- )
179
-
180
- return {
181
- cardActive,
182
- poptipWidth,
183
- poptipHeight,
184
- colsConfig,
185
- resetRenderList,
186
- btnCornerConfig,
187
- getMenuColor,
188
- getCardStyle,
189
- getBudgeNum,
190
- handleFocusBtn,
191
- handleBlurBtn,
192
- handleCardBtn
193
- }
194
- }
195
- })
196
- </script>
197
-
198
- <style lang="scss">
199
- .menuCard {
200
- margin-bottom: 10px;
201
- }
202
- .cardBtnsWrap {
203
- position: relative;
204
- display: flex;
205
- justify-content: space-between;
206
- align-items: center;
207
- flex-wrap: wrap;
208
- width: 100%;
209
- > div {
210
- width: 47%;
211
- display: inline-flex;
212
- align-items: center;
213
- margin: 1.5%;
214
- > .ivu-poptip-rel,
215
- > .ivu-tooltip-rel,
216
- > .ivu-dropdown-rel {
217
- width: 100%;
218
- display: block;
219
- }
220
- }
221
- .cardBtn {
222
- display: flex;
223
- align-items: center;
224
- background-color: #eee;
225
- font-size: 1.1em;
226
- padding: 10px;
227
- box-sizing: border-box;
228
- cursor: pointer;
229
- position: relative;
230
- &:hover {
231
- opacity: 0.8;
232
- }
233
- }
234
- }
235
- .menuBoxWrap {
236
- padding-left: 2em;
237
- position: relative;
238
- &.first {
239
- padding-left: 0;
240
- }
241
- .menuBoxFilter {
242
- margin-bottom: 5px;
243
- }
244
- .menuBoxTitle {
245
- display: block;
246
- padding: 5px 0;
247
- cursor: pointer;
248
- }
249
- }
250
- </style>
1
+ <template>
2
+ <sh-row :gutter="10">
3
+ <template v-for="(menuitem, menuindex) in resetRenderList(list)" :key="menuindex">
4
+ <sh-col v-bind="colsConfig">
5
+ <sh-card :icon="menuitem.icon" size="small" :title="menuitem?.meta?.title" :icon-size="18" :color="getMenuColor(menuindex)" :padding="8" class="menuCard">
6
+ <div :ref="`cardBtnsWrap${menuindex}`" class="cardBtnsWrap">
7
+ <template v-for="cardBtn in menuitem.buttons" :key="cardBtn.value">
8
+ <template v-if="menuitem.children && menuitem.children.length > 0">
9
+ <sh-poptip
10
+ v-model="cardBtn.visible"
11
+ transfer
12
+ :title="cardBtn.name"
13
+ :width="poptipWidth"
14
+ :height="poptipHeight"
15
+ :placement="cardBtn.placement"
16
+ @popper-show="handleFocusBtn(cardBtn, menuindex)"
17
+ @popper-hide="handleBlurBtn(cardBtn, menuindex)">
18
+ <div class="cardBtn" :style="getCardStyle(menuindex, cardActive === cardBtn.value + menuindex)" @click="handleCardBtn($event, cardBtn, menuitem, menuindex)">
19
+ <sh-icon :type="cardBtn.icon" :size="16" class="mr-2" :color="getMenuColor(menuindex, cardActive === cardBtn.value + menuindex)" />
20
+ <span>{{ cardBtn.name }}</span>
21
+ <sh-corner v-if="getBudgeNum(menuitem, cardBtn)" v-bind="btnCornerConfig(cardBtn, menuitem, menuindex)"></sh-corner>
22
+ </div>
23
+ <template #content>
24
+ <menuBox v-if="cardActive.startsWith('menus')" :menu="menuitem" first></menuBox>
25
+ <sh-empty v-else></sh-empty>
26
+ </template>
27
+ </sh-poptip>
28
+ </template>
29
+ <template v-else>
30
+ <div class="cardBtn" :style="getCardStyle(menuindex, cardActive === cardBtn.value + menuindex)" @click="handleCardBtn($event, cardBtn, menuitem, menuindex)">
31
+ <sh-icon :type="cardBtn.icon" :size="16" class="mr-2" :color="getMenuColor(menuindex, cardActive === cardBtn.value + menuindex)" />
32
+ <span>{{ cardBtn.name }}</span>
33
+ <sh-corner v-if="getBudgeNum(menuitem, cardBtn)" v-bind="btnCornerConfig(cardBtn, menuitem, menuindex)"></sh-corner>
34
+ </div>
35
+ </template>
36
+ </template>
37
+ </div>
38
+ </sh-card>
39
+ </sh-col>
40
+ </template>
41
+ </sh-row>
42
+ </template>
43
+
44
+ <script>
45
+ import { defineComponent, computed, provide, getCurrentInstance, ref, reactive, onMounted } from 'vue'
46
+ import menuBox from './menu-box.vue'
47
+ export default defineComponent({
48
+ name: 'MenuCard',
49
+ components: {
50
+ menuBox
51
+ },
52
+ props: {
53
+ list: {
54
+ type: Array,
55
+ default() {
56
+ return []
57
+ }
58
+ },
59
+ menuColors: {
60
+ type: Array,
61
+ default() {
62
+ return [
63
+ { default: '#e7f1ff', active: '#1890ff' },
64
+ { default: '#FFEFEB', active: '#FF652E' },
65
+ { default: '#F4F1FF', active: '#997BFF' },
66
+ { default: '#E6F6F2', active: '#01A883' },
67
+ { default: '#FFF6E8', active: '#FFA522' },
68
+ { default: '#ffe5e5', active: '#e62340' },
69
+ { default: '#dbffff', active: '#13C2C2' },
70
+ { default: '#e2f1ff', active: '#003366' },
71
+ { default: '#e6cdff', active: '#722ED1' },
72
+ { default: '#ffccd6', active: '#ff5d7a' }
73
+ ]
74
+ }
75
+ },
76
+ cardBtns: {
77
+ type: Array,
78
+ default() {
79
+ return [
80
+ { name: '功能菜单', value: 'menus', icon: 'ios-apps' },
81
+ { name: '操作指南', value: 'guides', icon: 'ios-navigate', placement: 'bottom-end' },
82
+ { name: '待办事项', value: 'todo', icon: 'md-calendar' },
83
+ { name: '已办事项', value: 'untodo', icon: 'ios-calendar', placement: 'bottom-end' }
84
+ ]
85
+ }
86
+ },
87
+ labelField: {
88
+ type: String,
89
+ default: 'label'
90
+ },
91
+ labelFormat: {
92
+ type: Function
93
+ }
94
+ },
95
+ emits: ['select'],
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
+
109
+ // 重新生成卡片列表
110
+ const resetRenderList = list => {
111
+ return $vUtils.mapTree(list, item => {
112
+ return {
113
+ buttons: props.cardBtns.map(btn => {
114
+ return {
115
+ visible: false,
116
+ placement: 'bottom-start',
117
+ ...btn
118
+ }
119
+ }),
120
+ ...item
121
+ }
122
+ })
123
+ }
124
+ // 动态角标配置
125
+ const btnCornerConfig = (cardBtn, menuitem, menuindex) => {
126
+ return {
127
+ title: getBudgeNum(menuitem, cardBtn),
128
+ dark: true,
129
+ width: '30',
130
+ height: '30',
131
+ color: getMenuColor(menuindex)
132
+ }
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']
140
+ let color = active ? '#fff' : ''
141
+ return { backgroundColor, color }
142
+ }
143
+ const getBudgeNum = (menu, card) => {
144
+ switch (card.value) {
145
+ case 'menus':
146
+ return $vUtils.toTreeArray(menu.children || []).length
147
+ default:
148
+ return ''
149
+ }
150
+ }
151
+ const handleCardBtn = ($event, cardBtn, menu, menuIndex) => {
152
+ if (!menu.children || menu.children.length < 1) {
153
+ cardBtn.visible = false
154
+ onMenuSelect(menu)
155
+ return
156
+ }
157
+ let windowWidth = window.document.body.clientWidth
158
+ let selfOffsetRight = windowWidth - $event.pageX
159
+ cardBtn.placement = selfOffsetRight < poptipWidth ? 'bottom-end' : 'bottom-start'
160
+ cardBtn.visible = true
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(
173
+ 'MenuCardInstance',
174
+ reactive({
175
+ props,
176
+ onMenuSelect
177
+ })
178
+ )
179
+
180
+ return {
181
+ cardActive,
182
+ poptipWidth,
183
+ poptipHeight,
184
+ colsConfig,
185
+ resetRenderList,
186
+ btnCornerConfig,
187
+ getMenuColor,
188
+ getCardStyle,
189
+ getBudgeNum,
190
+ handleFocusBtn,
191
+ handleBlurBtn,
192
+ handleCardBtn
193
+ }
194
+ }
195
+ })
196
+ </script>
197
+
198
+ <style lang="scss">
199
+ .menuCard {
200
+ margin-bottom: 10px;
201
+ }
202
+ .cardBtnsWrap {
203
+ position: relative;
204
+ display: flex;
205
+ justify-content: space-between;
206
+ align-items: center;
207
+ flex-wrap: wrap;
208
+ width: 100%;
209
+ > div {
210
+ width: 47%;
211
+ display: inline-flex;
212
+ align-items: center;
213
+ margin: 1.5%;
214
+ > .ivu-poptip-rel,
215
+ > .ivu-tooltip-rel,
216
+ > .ivu-dropdown-rel {
217
+ width: 100%;
218
+ display: block;
219
+ }
220
+ }
221
+ .cardBtn {
222
+ display: flex;
223
+ align-items: center;
224
+ background-color: #eee;
225
+ font-size: 1.1em;
226
+ padding: 10px;
227
+ box-sizing: border-box;
228
+ cursor: pointer;
229
+ position: relative;
230
+ &:hover {
231
+ opacity: 0.8;
232
+ }
233
+ }
234
+ }
235
+ .menuBoxWrap {
236
+ padding-left: 2em;
237
+ position: relative;
238
+ &.first {
239
+ padding-left: 0;
240
+ }
241
+ .menuBoxFilter {
242
+ margin-bottom: 5px;
243
+ }
244
+ .menuBoxTitle {
245
+ display: block;
246
+ padding: 5px 0;
247
+ cursor: pointer;
248
+ }
249
+ }
250
+ </style>
@@ -1,87 +1,87 @@
1
- <template>
2
- <div class="menuBoxWrap" :class="{ first }">
3
- <template v-if="menusList.length > 0">
4
- <div v-if="first" class="menuBoxFilter">
5
- <vxe-input v-model="filterText" size="mini" class="w-100" clearable placeholder="请输入关键词" prefix-icon="vxe-icon-search"></vxe-input>
6
- </div>
7
- <template v-for="(item, itemindex) in menuBoxList" :key="itemindex">
8
- <a class="menuBoxTitle" @click="handleMenuClick(item)">{{ getItemTitle(item) }}</a>
9
- <menuBox v-if="hasChildren(item)" :menu="item"></menuBox>
10
- </template>
11
- </template>
12
- <sh-empty v-else></sh-empty>
13
- </div>
14
- </template>
15
-
16
- <script>
17
- import { defineComponent, computed, getCurrentInstance, watch, ref, inject } from 'vue'
18
- export default defineComponent({
19
- name: 'MenuBox',
20
- props: {
21
- menu: {
22
- type: [Object, Array],
23
- default() {
24
- return {}
25
- }
26
- },
27
- first: {
28
- type: Boolean
29
- }
30
- },
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
49
- }
50
- const getItemTitle = menu => {
51
- const { labelField, labelFormat } = MenuCardInstance.props
52
- return labelFormat ? labelFormat(menu) : $vUtils.get(menu, labelField) || ''
53
- }
54
- const handleMenuClick = item => {
55
- MenuCardInstance.onMenuSelect(item)
56
- }
57
- // 全局搜索过滤事件
58
- const handleMenuFilter = text => {
59
- let filterText = $vUtils.toValueString(text).trim().toLowerCase()
60
- let searchData = null
61
- if (filterText) {
62
- searchData = $vUtils.searchTree(menusList.value, menu => getItemTitle(menu).indexOf(filterText) > -1)
63
- }
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
84
- }
85
- }
86
- })
87
- </script>
1
+ <template>
2
+ <div class="menuBoxWrap" :class="{ first }">
3
+ <template v-if="menusList.length > 0">
4
+ <div v-if="first" class="menuBoxFilter">
5
+ <vxe-input v-model="filterText" size="mini" class="w-100" clearable placeholder="请输入关键词" prefix-icon="vxe-icon-search"></vxe-input>
6
+ </div>
7
+ <template v-for="(item, itemindex) in menuBoxList" :key="itemindex">
8
+ <a class="menuBoxTitle" @click="handleMenuClick(item)">{{ getItemTitle(item) }}</a>
9
+ <menuBox v-if="hasChildren(item)" :menu="item"></menuBox>
10
+ </template>
11
+ </template>
12
+ <sh-empty v-else></sh-empty>
13
+ </div>
14
+ </template>
15
+
16
+ <script>
17
+ import { defineComponent, computed, getCurrentInstance, watch, ref, inject } from 'vue'
18
+ export default defineComponent({
19
+ name: 'MenuBox',
20
+ props: {
21
+ menu: {
22
+ type: [Object, Array],
23
+ default() {
24
+ return {}
25
+ }
26
+ },
27
+ first: {
28
+ type: Boolean
29
+ }
30
+ },
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
49
+ }
50
+ const getItemTitle = menu => {
51
+ const { labelField, labelFormat } = MenuCardInstance.props
52
+ return labelFormat ? labelFormat(menu) : $vUtils.get(menu, labelField) || ''
53
+ }
54
+ const handleMenuClick = item => {
55
+ MenuCardInstance.onMenuSelect(item)
56
+ }
57
+ // 全局搜索过滤事件
58
+ const handleMenuFilter = text => {
59
+ let filterText = $vUtils.toValueString(text).trim().toLowerCase()
60
+ let searchData = null
61
+ if (filterText) {
62
+ searchData = $vUtils.searchTree(menusList.value, menu => getItemTitle(menu).indexOf(filterText) > -1)
63
+ }
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
84
+ }
85
+ }
86
+ })
87
+ </script>