sh-view 2.0.8 → 2.1.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.
@@ -1,61 +1,61 @@
1
- <template>
2
- <div ref="shMenuItem" class="sh-menu-item" :class="itemClass" :style="itemStyle">
3
- <sh-icon v-if="iconType" class="sh-menu-item-icon" :type="iconType"></sh-icon>
4
- <span class="sh-menu-item-title">{{ formatTitle(menuItem) }}</span>
5
- <sh-icon v-if="arrow" class="sh-menu-item-arrow" type="ios-arrow-forward"></sh-icon>
6
- </div>
7
- </template>
8
-
9
- <script>
10
- export default {
11
- name: 'MenuItemBox',
12
- inject: {
13
- MenuInstance: {
14
- default: null
15
- }
16
- },
17
- props: {
18
- arrow: Boolean,
19
- menuLevel: {
20
- type: Number
21
- },
22
- menuItem: {
23
- type: Object,
24
- default() {
25
- return {}
26
- }
27
- }
28
- },
29
- computed: {
30
- defaultIcon() {
31
- if (!this.menuLevel || this.menuLevel < 2) return 'md-folder'
32
- else if (this.menuLevel === 2) return 'md-bookmark'
33
- else return ''
34
- },
35
- iconType() {
36
- return this.menuItem.meta?.icon || this.menuItem.icon || this.defaultIcon
37
- },
38
- itemClass() {
39
- return {
40
- 'sh-menu-item-level': !this.menuLevel,
41
- 'sh-menu-item-active': this.MenuInstance.activeName === this.menuItem.name
42
- }
43
- },
44
- itemStyle() {
45
- let result = {}
46
- const { mode, collapsed, indent } = this.MenuInstance
47
- if (mode === 'vertical' && !collapsed && this.menuLevel) {
48
- result.paddingLeft = `${indent * this.menuLevel}px`
49
- }
50
- return result
51
- },
52
- itemTitle() {
53
- const { labelField, labelFormat } = this.MenuInstance
54
- return labelFormat ? labelFormat(this.menuItem) : this.$vUtils.get(this.menuItem, labelField)
55
- }
56
- },
57
- methods: {}
58
- }
59
- </script>
60
-
61
- <style scoped></style>
1
+ <template>
2
+ <div ref="shMenuItem" class="sh-menu-item" :class="itemClass" :style="itemStyle">
3
+ <sh-icon v-if="iconType" class="sh-menu-item-icon" :type="iconType"></sh-icon>
4
+ <span class="sh-menu-item-title">{{ itemTitle }}</span>
5
+ <sh-icon v-if="arrow" class="sh-menu-item-arrow" type="ios-arrow-forward"></sh-icon>
6
+ </div>
7
+ </template>
8
+
9
+ <script>
10
+ export default {
11
+ name: 'MenuItemBox',
12
+ inject: {
13
+ MenuInstance: {
14
+ default: null
15
+ }
16
+ },
17
+ props: {
18
+ arrow: Boolean,
19
+ menuLevel: {
20
+ type: Number
21
+ },
22
+ menuItem: {
23
+ type: Object,
24
+ default() {
25
+ return {}
26
+ }
27
+ }
28
+ },
29
+ computed: {
30
+ defaultIcon() {
31
+ if (!this.menuLevel || this.menuLevel < 2) return 'md-folder'
32
+ else if (this.menuLevel === 2) return 'md-bookmark'
33
+ else return ''
34
+ },
35
+ iconType() {
36
+ return this.menuItem.meta?.icon || this.menuItem.icon || this.defaultIcon
37
+ },
38
+ itemClass() {
39
+ return {
40
+ 'sh-menu-item-level': !this.menuLevel,
41
+ 'sh-menu-item-active': this.MenuInstance.activeName === this.menuItem.name
42
+ }
43
+ },
44
+ itemStyle() {
45
+ let result = {}
46
+ const { mode, collapsed, indent } = this.MenuInstance
47
+ if (mode === 'vertical' && !collapsed && this.menuLevel) {
48
+ result.paddingLeft = `${indent * this.menuLevel}px`
49
+ }
50
+ return result
51
+ },
52
+ itemTitle() {
53
+ const { labelField, labelFormat } = this.MenuInstance
54
+ return labelFormat ? labelFormat(this.menuItem) : this.$vUtils.get(this.menuItem, labelField)
55
+ }
56
+ },
57
+ methods: {}
58
+ }
59
+ </script>
60
+
61
+ <style scoped></style>
@@ -2,7 +2,7 @@
2
2
  <sh-row :gutter="10">
3
3
  <template v-for="(menuitem, menuindex) in resetRenderList(list)" :key="menuindex">
4
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">
5
+ <sh-card :icon="menuitem.icon" size="small" :title="menuitem?.meta?.title" :icon-size="18" :color="getMenuColor(menuindex)" :padding="8" class="menuCard">
6
6
  <div :ref="`cardBtnsWrap${menuindex}`" class="cardBtnsWrap">
7
7
  <template v-for="cardBtn in menuitem.buttons" :key="cardBtn.value">
8
8
  <template v-if="menuitem.children && menuitem.children.length > 0">
@@ -12,8 +12,8 @@
12
12
  :title="cardBtn.name"
13
13
  :width="poptipWidth"
14
14
  :placement="cardBtn.placement"
15
- @on-popper-show="handleFocusBtn(cardBtn, menuindex)"
16
- @on-popper-hide="handleBlurBtn(cardBtn, menuindex)">
15
+ @popper-show="handleFocusBtn(cardBtn, menuindex)"
16
+ @popper-hide="handleBlurBtn(cardBtn, menuindex)">
17
17
  <div class="cardBtn" :style="getCardStyle(menuindex, cardActive === cardBtn.value + menuindex)" @click="handleCardBtn($event, cardBtn, menuitem, menuindex)">
18
18
  <sh-icon :type="cardBtn.icon" :size="16" class="mr-2" :color="getMenuColor(menuindex, cardActive === cardBtn.value + menuindex)" />
19
19
  <span>{{ cardBtn.name }}</span>
@@ -49,6 +49,11 @@ export default {
49
49
  components: {
50
50
  menuBox
51
51
  },
52
+ provide() {
53
+ return {
54
+ MenuCardInstance: this
55
+ }
56
+ },
52
57
  props: {
53
58
  list: {
54
59
  type: Array,
@@ -83,8 +88,16 @@ export default {
83
88
  { name: '已办事项', value: 'untodo', icon: 'ios-calendar', placement: 'bottom-end' }
84
89
  ]
85
90
  }
91
+ },
92
+ labelField: {
93
+ type: String,
94
+ default: 'label'
95
+ },
96
+ labelFormat: {
97
+ type: Function
86
98
  }
87
99
  },
100
+ emits: ['select'],
88
101
  data() {
89
102
  return {
90
103
  poptipWidth: 320,
@@ -161,6 +174,9 @@ export default {
161
174
  },
162
175
  handleBlurBtn(card, index) {
163
176
  if (this.cardActive === card.value + index) this.cardActive = ''
177
+ },
178
+ onMenuSelect(menu) {
179
+ this.$emit('select', menu)
164
180
  }
165
181
  }
166
182
  }
@@ -1,68 +1,81 @@
1
- <template>
2
- <div class="menuBoxWrap" :class="{ first }">
3
- <template v-if="menus.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="routerTo(item)">{{ formatTitle(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
- export default {
18
- name: 'MenuBox',
19
- props: {
20
- menu: {
21
- type: [Object, Array],
22
- default() {
23
- return {}
24
- }
25
- },
26
- first: {
27
- type: Boolean
28
- }
29
- },
30
- data() {
31
- return {
32
- filterText: '',
33
- filterData: null,
34
- filterChangeDebounce: this.$vUtils.debounce(this.handleMenuFilter, 500)
35
- }
36
- },
37
- computed: {
38
- menus() {
39
- return Array.isArray(this.menu) ? this.menu : this.menu?.children || []
40
- },
41
- menuBoxList() {
42
- return this.filterData || this.menus
43
- }
44
- },
45
- watch: {
46
- filterText: {
47
- handler(newvalue, oldValue) {
48
- this.filterChangeDebounce(newvalue)
49
- }
50
- }
51
- },
52
- methods: {
53
- // 全局搜索过滤事件
54
- handleMenuFilter(text) {
55
- const that = this
56
- let filterText = that.$vUtils.toValueString(text).trim().toLowerCase()
57
- let filterData = null
58
- if (filterText) {
59
- filterData = that.$vUtils.searchTree(that.menus, menu => this.formatTitle(menu).indexOf(filterText) > -1)
60
- }
61
- if (that.filterData === null && !filterText) {
62
- return
63
- }
64
- that.filterData = filterData
65
- }
66
- }
67
- }
68
- </script>
1
+ <template>
2
+ <div class="menuBoxWrap" :class="{ first }">
3
+ <template v-if="menus.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
+ export default {
18
+ name: 'MenuBox',
19
+ inject: {
20
+ MenuCardInstance: {
21
+ default: null
22
+ }
23
+ },
24
+ props: {
25
+ menu: {
26
+ type: [Object, Array],
27
+ default() {
28
+ return {}
29
+ }
30
+ },
31
+ first: {
32
+ type: Boolean
33
+ }
34
+ },
35
+ data() {
36
+ return {
37
+ filterText: '',
38
+ filterData: null,
39
+ filterChangeDebounce: this.$vUtils.debounce(this.handleMenuFilter, 500)
40
+ }
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
48
+ }
49
+ },
50
+ watch: {
51
+ filterText: {
52
+ handler(newvalue, oldValue) {
53
+ this.filterChangeDebounce(newvalue)
54
+ }
55
+ }
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
+ // 全局搜索过滤事件
69
+ handleMenuFilter(text) {
70
+ const { menus, $vUtils, getItemTitle } = this
71
+ let filterText = $vUtils.toValueString(text).trim().toLowerCase()
72
+ let filterData = null
73
+ if (filterText) {
74
+ filterData = $vUtils.searchTree(menus, menu => getItemTitle(menu).indexOf(filterText) > -1)
75
+ }
76
+ if (this.filterData === null && !filterText) return
77
+ this.filterData = filterData
78
+ }
79
+ }
80
+ }
81
+ </script>
@@ -1,113 +1,111 @@
1
- <template>
2
- <sh-header size="large">
3
- <template #title>
4
- <div v-html="headerTitle.title"></div>
5
- </template>
6
- <div>{{ headerTitle.desc }}</div>
7
- </sh-header>
8
- </template>
9
-
10
- <script>
11
- export default {
12
- name: 'SystemTip',
13
- props: {
14
- name: {
15
- type: String,
16
- default: ''
17
- }
18
- },
19
- data() {
20
- return {
21
- nowdate: new Date()
22
- }
23
- },
24
- computed: {
25
- headerDate() {
26
- let hours = this.nowdate.getHours()
27
- let month = this.nowdate.getMonth() + 1
28
- let day = this.nowdate.getDate()
29
- let week = this.nowdate.getDay()
30
- return { date: this.nowdate, hours, month, day, week }
31
- },
32
- headerWeek() {
33
- let { week } = this.headerDate
34
- let tw = ''
35
- switch (week) {
36
- case 0:
37
- tw = '星期天'
38
- break
39
- case 1:
40
- tw = '星期一'
41
- break
42
- case 2:
43
- tw = '星期二'
44
- break
45
- case 3:
46
- tw = '星期三'
47
- break
48
- case 4:
49
- tw = '星期四'
50
- break
51
- case 5:
52
- tw = '星期五'
53
- break
54
- case 6:
55
- tw = '星期六'
56
- break
57
- }
58
- return tw
59
- },
60
- headerTitle() {
61
- let { hours } = this.headerDate
62
- let title = ''
63
- let desc = ''
64
- switch (true) {
65
- case hours === 0 || (hours >= 23 && hours <= 24):
66
- title = '午夜啦,早点休息喔'
67
- desc = '思念不因劳累而改变,问候不因疲惫而变懒,祝福不因休息而变缓,关怀随星星眨眼,牵挂在深夜依然,轻轻道声:祝你晚安!'
68
- break
69
- case hours >= 1 && hours <= 4:
70
- title = '凌晨啦,注意身体喔'
71
- desc = '时间不早啦,记得早点休息,保证睡眠质量!'
72
- break
73
- case hours >= 5 && hours <= 6:
74
- title = '清晨啦,准备迎接新的一天吧'
75
- desc = '睁开眼,缓一缓,快起床,伸懒腰;笑一笑,美好的一天又开始了.早安,祝你今天好心情,工作顺利,生活甜美!'
76
- break
77
- case hours >= 7 && hours <= 8:
78
- title = '早上好,记得吃早餐喔'
79
- desc = '一日之计在于晨,愿我这阳光初露时的小小问候能将快乐带给你,愿你用快乐开启,用微笑结束这美好的一天.'
80
- break
81
- case hours >= 9 && hours <= 10:
82
- title = '上午好,时刻保持好心情呀'
83
- desc = '上午好,一束阳光照在身,祝你天天都开心,财神家中去,梦想变成真,今天中大奖,明天去上任.'
84
- break
85
- case hours >= 11 && hours <= 12:
86
- title = '中午好,午餐时间到啦'
87
- desc = '中午好,到了吃午餐的时间了,吃完午餐记得午睡一小会,保证下午可以有良好的精神状态.'
88
- break
89
- case hours >= 13 && hours <= 16:
90
- title = '下午好,别太辛苦了'
91
- desc = '送各位一杯下午茶:已祝福为叶,叮咛做花,热情为水,包容当杯,喝出你一天好心情和一生的幸福,下午愉快!'
92
- break
93
- case hours >= 17 && hours <= 18:
94
- title = '傍晚啦,看看窗外的风景吧'
95
- desc = '工作是做不完的,身体可是累的垮的!看看外面的天空吧!'
96
- break
97
- case hours >= 19 && hours <= 22:
98
- title = '晚上好,准备好进入梦乡啦'
99
- desc = '睡前请把窗户打开,让"幸福"进来,睡前请把"心情"打开,让"快乐"入驻,睡前请把"思想"放飞,让甜蜜入梦!今晚祝你好梦成真,幸福一生!晚安!'
100
- break
101
- }
102
- return { title: `Hi! <span class="primary">${this.name}</span> ${title}`, desc }
103
- }
104
- },
105
- watch: {},
106
- created() {},
107
- mounted() {},
108
- beforeUnmount() {},
109
- methods: {}
110
- }
111
- </script>
112
-
113
- <style lang="scss" scoped></style>
1
+ <template>
2
+ <sh-header size="large">
3
+ <template #title>
4
+ <div v-html="headerTitle.title"></div>
5
+ </template>
6
+ <div>{{ headerTitle.desc }}</div>
7
+ </sh-header>
8
+ </template>
9
+
10
+ <script>
11
+ export default {
12
+ name: 'SystemTip',
13
+ props: {
14
+ name: {
15
+ type: String,
16
+ default: ''
17
+ }
18
+ },
19
+ data() {
20
+ return {
21
+ nowdate: new Date()
22
+ }
23
+ },
24
+ computed: {
25
+ headerDate() {
26
+ let hours = this.nowdate.getHours()
27
+ let month = this.nowdate.getMonth() + 1
28
+ let day = this.nowdate.getDate()
29
+ let week = this.nowdate.getDay()
30
+ return { date: this.nowdate, hours, month, day, week }
31
+ },
32
+ headerWeek() {
33
+ let { week } = this.headerDate
34
+ let tw = ''
35
+ switch (week) {
36
+ case 0:
37
+ tw = '星期天'
38
+ break
39
+ case 1:
40
+ tw = '星期一'
41
+ break
42
+ case 2:
43
+ tw = '星期二'
44
+ break
45
+ case 3:
46
+ tw = '星期三'
47
+ break
48
+ case 4:
49
+ tw = '星期四'
50
+ break
51
+ case 5:
52
+ tw = '星期五'
53
+ break
54
+ case 6:
55
+ tw = '星期六'
56
+ break
57
+ }
58
+ return tw
59
+ },
60
+ headerTitle() {
61
+ let { hours } = this.headerDate
62
+ let title = ''
63
+ let desc = ''
64
+ switch (true) {
65
+ case hours === 0 || (hours >= 23 && hours <= 24):
66
+ title = '午夜啦,早点休息喔'
67
+ desc = '思念不因劳累而改变,问候不因疲惫而变懒,祝福不因休息而变缓,关怀随星星眨眼,牵挂在深夜依然,轻轻道声:祝你晚安!'
68
+ break
69
+ case hours >= 1 && hours <= 4:
70
+ title = '凌晨啦,注意身体喔'
71
+ desc = '时间不早啦,记得早点休息,保证睡眠质量!'
72
+ break
73
+ case hours >= 5 && hours <= 6:
74
+ title = '清晨啦,准备迎接新的一天吧'
75
+ desc = '睁开眼,缓一缓,快起床,伸懒腰;笑一笑,美好的一天又开始了.早安,祝你今天好心情,工作顺利,生活甜美!'
76
+ break
77
+ case hours >= 7 && hours <= 8:
78
+ title = '早上好,记得吃早餐喔'
79
+ desc = '一日之计在于晨,愿我这阳光初露时的小小问候能将快乐带给你,愿你用快乐开启,用微笑结束这美好的一天.'
80
+ break
81
+ case hours >= 9 && hours <= 10:
82
+ title = '上午好,时刻保持好心情呀'
83
+ desc = '上午好,一束阳光照在身,祝你天天都开心,财神家中去,梦想变成真,今天中大奖,明天去上任.'
84
+ break
85
+ case hours >= 11 && hours <= 12:
86
+ title = '中午好,午餐时间到啦'
87
+ desc = '中午好,到了吃午餐的时间了,吃完午餐记得午睡一小会,保证下午可以有良好的精神状态.'
88
+ break
89
+ case hours >= 13 && hours <= 16:
90
+ title = '下午好,别太辛苦了'
91
+ desc = '送各位一杯下午茶:已祝福为叶,叮咛做花,热情为水,包容当杯,喝出你一天好心情和一生的幸福,下午愉快!'
92
+ break
93
+ case hours >= 17 && hours <= 18:
94
+ title = '傍晚啦,看看窗外的风景吧'
95
+ desc = '工作是做不完的,身体可是累的垮的!看看外面的天空吧!'
96
+ break
97
+ case hours >= 19 && hours <= 22:
98
+ title = '晚上好,准备好进入梦乡啦'
99
+ desc = '睡前请把窗户打开,让"幸福"进来,睡前请把"心情"打开,让"快乐"入驻,睡前请把"思想"放飞,让甜蜜入梦!今晚祝你好梦成真,幸福一生!晚安!'
100
+ break
101
+ }
102
+ return { title: `Hi! <span class="primary">${this.name}</span> ${title}`, desc }
103
+ }
104
+ },
105
+ activated() {
106
+ this.nowdate = new Date()
107
+ }
108
+ }
109
+ </script>
110
+
111
+ <style lang="scss" scoped></style>
@@ -243,6 +243,9 @@ button:focus, .vxe-button.type--button:not(.is--disabled):focus{
243
243
  }
244
244
  }
245
245
  &.td-render{}
246
+ &.flex-render{
247
+ display: inline-flex;
248
+ }
246
249
  .prefix, .suffix{
247
250
  white-space: nowrap;
248
251
  display: inline-flex;
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <span class="vxe-render--inner" :class="{ 'form-render': rform, 'td-render': !rform }">
2
+ <span class="vxe-render--inner" :class="{ 'form-render': rform, 'td-render': !rform, 'flex-render': controlButton }">
3
3
  <template v-if="redit || isEditAll">
4
4
  <span v-if="rprops.prefixText && rform" class="prefix">
5
5
  <vxe-button v-if="prefixButton" v-bind="psButtonConfig" @click="vxeInputPrefixClick">{{ rprops.prefixText }}</vxe-button>
@@ -61,6 +61,18 @@ export default {
61
61
  let { $form } = this.rparams
62
62
  $form.context.emit('suffix-click', this.rparams, this)
63
63
  }
64
+ },
65
+ // 输入框数字加减控制
66
+ vxeControlClick(bol) {
67
+ const { step = 1, min, max } = this.rprops
68
+ let value = bol ? this.$vUtils.add(this.renderValue, step) : this.$vUtils.subtract(this.renderValue, step)
69
+ if ((min !== undefined && value < min) || (max !== undefined && value > max)) return
70
+ this.renderValue = value
71
+ if (this.rform) {
72
+ this.setFormValue(value)
73
+ } else {
74
+ this.setTableValue(value)
75
+ }
64
76
  }
65
77
  }
66
78
  }
@@ -89,17 +89,6 @@ export default {
89
89
  }
90
90
  },
91
91
  methods: {
92
- // 输入框数字加减控制
93
- vxeControlClick(bol) {
94
- const { step = 1, min, max } = this.rprops
95
- let value = bol ? this.$vUtils.add(this.renderValue, step) : this.$vUtils.subtract(this.renderValue, step)
96
- if (value < min || value > max) return
97
- if (this.rform) {
98
- this.setFormValue(value)
99
- } else {
100
- this.setTableValue(value)
101
- }
102
- },
103
92
  // 输入框变化
104
93
  async vxeInputChange({ value, $event }) {
105
94
  if (!this.rform) {