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
@@ -0,0 +1,162 @@
1
+ import { computed, ref, watch } from 'vue'
2
+
3
+ let moneyUnitConstants = [
4
+ { value: 1, label: '元' },
5
+ { value: 1000, label: '千元' },
6
+ { value: 10000, label: '万元' }
7
+ ]
8
+ let cnGroups = [
9
+ { shortText: '兆', fullText: '兆', value: '' },
10
+ { shortText: '千', fullText: '千亿', value: '' },
11
+ { shortText: '百', fullText: '百亿', value: '' },
12
+ { shortText: '十', fullText: '十亿', value: '' },
13
+ { shortText: '亿', fullText: '亿', value: '' },
14
+ { shortText: '千', fullText: '千万', value: '' },
15
+ { shortText: '百', fullText: '百万', value: '' },
16
+ { shortText: '十', fullText: '十万', value: '' },
17
+ { shortText: '万', fullText: '万', value: '' },
18
+ { shortText: '千', fullText: '千', value: '' },
19
+ { shortText: '百', fullText: '百', value: '' },
20
+ { shortText: '十', fullText: '十', value: '' },
21
+ { shortText: '元', fullText: '元', value: '' },
22
+ { shortText: '角', fullText: '角', value: '' },
23
+ { shortText: '分', fullText: '分', value: '' },
24
+ { shortText: '毫', fullText: '毫', value: '' },
25
+ { shortText: '厘', fullText: '厘', value: '' }
26
+ ]
27
+
28
+ export default function (props, context, proxy) {
29
+ const { $vUtils } = proxy
30
+
31
+ const renderValue = ref(null)
32
+ const renderText = ref('')
33
+
34
+ const rsize = computed(() => props.rprops.size || props.rparams.$table?.props?.size || props.rparams.$form?.props?.size)
35
+ const rform = computed(() => !!props.rparams.$form)
36
+ const reditmode = computed(() => props.rparams.$table?.props?.editConfig?.mode)
37
+ const isEditAll = computed(() => !rform.value && reditmode.value === 'all')
38
+ const moneyUnitText = computed(() => {
39
+ let moneyConstant = moneyUnitConstants.find(item => item.value === props.rprops.moneyUnit)
40
+ return moneyConstant && moneyConstant.label
41
+ })
42
+ const billGroups = computed(() => {
43
+ let { billStart = '分', billEnd = '亿' } = props.rprops
44
+ let startIndex = cnGroups.findIndex(cn => cn.fullText === billEnd)
45
+ let endIndex = cnGroups.findIndex(cn => cn.fullText === billStart)
46
+ return cnGroups.slice(startIndex, endIndex)
47
+ })
48
+
49
+ // 初始化数据
50
+ const initData = () => {
51
+ let keyValue = $vUtils.get(props.rdata, props.rkey)
52
+ formatValueFun(keyValue)
53
+ }
54
+
55
+ // 输入框变化
56
+ const vxeInputChange = async ({ value, $event }) => {}
57
+ // 输入框变化回调
58
+ const vxeChangeCallBack = async ({ value, $event }) => {
59
+ setRenderValue(value)
60
+ }
61
+ // radio 变化回调
62
+ const vxeRadioCallBack = async ({ label, $event }) => {
63
+ setRenderValue(label)
64
+ }
65
+ // check变化回调
66
+ const vxeCheckCallBack = async ({ checklist, checked, label, $event }) => {
67
+ setRenderValue(checklist)
68
+ }
69
+ // 输入框失去焦点回调
70
+ const vxeBlurCallback = async ({ value, $event }) => {
71
+ setRenderValue(value)
72
+ }
73
+ // 回调赋值
74
+ const setRenderValue = (value, isCall) => {
75
+ let cellValue = value || renderValue.value
76
+ if (!isCall) {
77
+ if (['$vMoney'].includes(props.rname) && cellValue !== '') cellValue = $vUtils.multiply(cellValue, props.rprops.moneyUnit || 1)
78
+ let { rvalue, rtext } = formatValueFun(cellValue, true)
79
+ cellValue = rvalue
80
+ }
81
+ if (rform.value) {
82
+ let { $form } = props.rparams
83
+ $form.context.emit('edit-closed', props.rparams)
84
+ }
85
+ $vUtils.set(props.rdata, props.rkey, cellValue)
86
+ }
87
+ // 格式化值formatValue
88
+ const formatValueFun = (value, editable) => {
89
+ let formatObj = $vUtils.formatRender(value, props.rkey, props.rdata, props.rname, props.rprops, proxy, editable)
90
+ renderValue.value = ['$vMoney'].includes(props.rname) ? formatObj.rtext : formatObj.rvalue
91
+ renderText.value = formatObj.rtext
92
+ return formatObj
93
+ }
94
+ // 格式化底部值
95
+ const getFooterData = (qianfen = true) => {
96
+ let { $table, items, itemIndex, column } = props.rparams
97
+ let tableData = $table.internalData.afterFullData
98
+ let { rname, rprops, rfooter, property } = column
99
+ let { digits, moneyUnit, commafy, type, calculate } = rprops
100
+ let footerValue = items[itemIndex]
101
+ if (rfooter) {
102
+ let caculateObj = rfooter[items[rfooter.index || 0]]
103
+ if (caculateObj && (rname === '$vMoney' || (['number', 'float', 'integer'].includes(type) && calculate))) {
104
+ let tableColumnData = $vUtils.mapTree(tableData, row => row[property])
105
+ let { computeType, result, typeObj } = caculateObj
106
+ switch (computeType) {
107
+ case 'subTotal':
108
+ footerValue = $vUtils.sum(tableColumnData)
109
+ break
110
+ case 'allTotal':
111
+ footerValue = typeObj[property] || result
112
+ break
113
+ case 'mean':
114
+ footerValue = $vUtils.mean(tableColumnData)
115
+ break
116
+ default:
117
+ footerValue = result
118
+ break
119
+ }
120
+ if (rname === '$vMoney') footerValue = $vUtils.truncate($vUtils.divide(footerValue, moneyUnit), digits)
121
+ if (qianfen && commafy) footerValue = $vUtils.commafy(footerValue, { digits })
122
+ }
123
+ }
124
+ return footerValue
125
+ }
126
+ const getBillClass = bil => {
127
+ return { basic: bil.fullText === '元', commafy: ['千', '百万', '十亿', '兆'].includes(bil.fullText) }
128
+ }
129
+ // 获取单据值
130
+ const getBillValue = (index, total = false) => {
131
+ let value = total ? getFooterData(false) : renderValue.value
132
+ if (!value) return ''
133
+ let fullValue = $vUtils.formatMoneyPad(value)
134
+ let fullList = fullValue.replace('.', '').split('')
135
+ return fullList[index]
136
+ }
137
+
138
+ watch(
139
+ () => props.rdata,
140
+ () => initData(),
141
+ { deep: true, immediate: true }
142
+ )
143
+
144
+ return {
145
+ renderValue,
146
+ renderText,
147
+ rsize,
148
+ rform,
149
+ isEditAll,
150
+ moneyUnitText,
151
+ billGroups,
152
+ vxeInputChange,
153
+ vxeChangeCallBack,
154
+ vxeRadioCallBack,
155
+ vxeCheckCallBack,
156
+ vxeBlurCallback,
157
+ getFooterData,
158
+ getBillClass,
159
+ getBillValue,
160
+ setRenderValue
161
+ }
162
+ }
@@ -0,0 +1,23 @@
1
+ export default {
2
+ redit: { type: Boolean },
3
+ rkey: { type: String },
4
+ rname: { type: String },
5
+ rdata: {
6
+ type: Object,
7
+ default() {
8
+ return {}
9
+ }
10
+ },
11
+ rprops: {
12
+ type: Object,
13
+ default() {
14
+ return {}
15
+ }
16
+ },
17
+ rparams: {
18
+ type: Object,
19
+ default() {
20
+ return {}
21
+ }
22
+ }
23
+ }
@@ -0,0 +1,28 @@
1
+ import { computed, onBeforeMount, ref, watch } from 'vue'
2
+
3
+ export default function (props, context, proxy) {
4
+ const { $vUtils } = proxy
5
+ const renderValue = ref({})
6
+
7
+ // 初始化
8
+ const initData = () => {
9
+ const { column, $panel } = props.rparams
10
+ const option = column.filters[0]
11
+ renderValue.value = option
12
+ $panel.changeOption(null, Boolean(renderValue.value.data), option)
13
+ }
14
+ // 过滤回调
15
+ const vxeFilterCallback = ({ value, $event }) => {
16
+ const { $panel } = props.rparams
17
+ $panel.changeOption(null, Boolean(renderValue.value.data), renderValue.value)
18
+ }
19
+
20
+ onBeforeMount(() => {
21
+ initData()
22
+ })
23
+
24
+ return {
25
+ renderValue,
26
+ vxeFilterCallback
27
+ }
28
+ }
@@ -1,25 +0,0 @@
1
- <template>
2
- <vxe-form-gather v-bind="parentItem">
3
- <template v-for="(childItem, childItemIndex) in parentItem.children">
4
- <formItem v-if="childItem.children" :key="childItemIndex" :parent-item="childItem"></formItem>
5
- <vxe-form-item v-else v-bind="childItem" :key="childItemIndex"></vxe-form-item>
6
- </template>
7
- </vxe-form-gather>
8
- </template>
9
-
10
- <script>
11
- export default {
12
- name: 'FormItem',
13
- props: {
14
- parentItem: {
15
- type: Object,
16
- default() {
17
- return {}
18
- }
19
- }
20
- },
21
- created() {}
22
- }
23
- </script>
24
-
25
- <style scoped></style>
@@ -1,55 +0,0 @@
1
- .sh-vxe-form{
2
- position: relative;
3
- &.readonly {
4
- .vxe-form{
5
- .vxe-input--inner[disabled], .vxe-textarea--inner[disabled]{
6
- cursor: auto;
7
- color: #333;
8
- background-color: var(--vxe-table-body-background-color);
9
- border-color: var(--vxe-primary-lighten-color);
10
- }
11
- .vxe-checkbox.is--disabled{
12
- cursor: auto;
13
- color: #333;
14
- & > input + .vxe-checkbox--icon{
15
- background-color: var(--vxe-table-body-background-color);
16
- border-color: var(--vxe-primary-lighten-color);
17
- }
18
- & > input + .vxe-checkbox--icon:before{
19
- border-color: var(--vxe-primary-color);
20
- }
21
- & > input + .vxe-checkbox--icon + .vxe-checkbox--label{
22
- color: #333;
23
- }
24
- }
25
- .vxe-input.is--disabled .vxe-input--date-picker-suffix,
26
- .vxe-input.is--disabled .vxe-input--number-suffix,
27
- .vxe-input.is--disabled .vxe-input--password-suffix,
28
- .vxe-input.is--disabled .vxe-input--search-suffix,
29
- .vxe-input.is--disabled .vxe-input--suffix{
30
- cursor: auto;
31
- }
32
- }
33
- }
34
- .vxe-form{
35
- .vxe-form--gather.shFormTitleItem{
36
- border: 1px solid var(--vxe-table-border-color);
37
- }
38
- .vxe-form--item{
39
- &.shFormTitleItem{
40
- padding: 0.2em 0.8em;
41
- border-left: 5px solid var(--vxe-primary-color);
42
- margin-bottom: 0.5em;
43
- .vxe-form--item-inner{
44
- min-height: auto;
45
- .vxe-form--item-title{
46
- max-width: 100%;
47
- .vxe-form--item-title-postfix{
48
- display: none;
49
- }
50
- }
51
- }
52
- }
53
- }
54
- }
55
- }
@@ -1,114 +0,0 @@
1
- <template>
2
- <div class="sh-vxe-form" :class="{ readonly: readonly, disabled: disabled }">
3
- <vxe-form
4
- ref="vxeForm"
5
- :key="renderKey"
6
- :items="formItems"
7
- :data="data"
8
- :loading="loading"
9
- :size="size"
10
- :span="myFormConfig.span"
11
- :align="myFormConfig.align"
12
- :title-align="myFormConfig.titleAlign"
13
- :title-width="myFormConfig.titleWidth"
14
- :title-colon="myFormConfig.titleColon"
15
- :title-asterisk="myFormConfig.titleAsterisk"
16
- :title-overflow="myFormConfig.titleOverflow"
17
- :class-name="myFormConfig.className"
18
- :custom-layout="myFormConfig.customLayout"
19
- :rules="formRules"
20
- :prevent-submit="myFormConfig.preventSubmit"
21
- :valid-config="validConfig"
22
- @submit="onFormSubmit"
23
- @submit-invalid="onFormSubmitInvalid"
24
- @reset="onFormReset"
25
- @collapse="onFormCollapse"
26
- @edit-closed="onFormEditClosed"
27
- @prefix-click="onPrefixClick"
28
- @suffix-click="onSuffixClick">
29
- <div v-if="footer" class="sh-common-footer">
30
- <div class="sh-common-footer-left">
31
- <slot name="formLeft"></slot>
32
- </div>
33
- <div class="sh-common-footer-right">
34
- <slot name="formRight"></slot>
35
- <vxe-button v-ripple type="submit" status="primary" :size="size" :disabled="disabled || loading">确认</vxe-button>
36
- <vxe-button v-ripple type="reset" :size="size">重置</vxe-button>
37
- </div>
38
- </div>
39
- <template v-for="slot in Object.keys($slots)" #[slot]="scope">
40
- <!-- 以之前的名字命名插槽,同时把数据原样绑定 -->
41
- <slot :name="slot" v-bind="scope"></slot>
42
- </template>
43
- </vxe-form>
44
- </div>
45
- </template>
46
-
47
- <script>
48
- import defaultData from './mixin/defaultData'
49
- import props from './js/props'
50
- import methods from './js/methods'
51
- export default {
52
- name: 'ShForm',
53
- components: {},
54
- mixins: [defaultData],
55
- props: {
56
- ...props
57
- },
58
- emits: ['submit', 'reset', 'edit-closed', 'submit-invalid', 'collapse', 'prefix-click', 'suffix-click'],
59
- data() {
60
- return {
61
- renderKey: 1,
62
- formItems: [],
63
- formRules: {}
64
- }
65
- },
66
- computed: {
67
- myFormConfig() {
68
- return Object.assign({}, this.formConfigDefault, this.formConfig)
69
- }
70
- },
71
- watch: {
72
- readonly(newvalue, oldValue) {
73
- this.initFormItems()
74
- },
75
- data: {
76
- handler(newvalue, oldValue) {
77
- this.initFormData()
78
- },
79
- immediate: true
80
- },
81
- items: {
82
- handler(newvalue, oldValue) {
83
- this.initFormItems(newvalue)
84
- },
85
- deep: true
86
- },
87
- rules: {
88
- handler(newvalue, oldValue) {
89
- this.initEditRules(newvalue)
90
- },
91
- deep: true,
92
- immediate: true
93
- }
94
- },
95
- created() {
96
- this.initCreated()
97
- },
98
- mounted() {},
99
- methods: {
100
- formRef() {
101
- return this.$refs.vxeForm
102
- },
103
- // 重新渲染表单
104
- refreshRender() {
105
- this.renderKey++
106
- },
107
- ...methods
108
- }
109
- }
110
- </script>
111
-
112
- <style lang="scss">
113
- @import './css/index.scss';
114
- </style>
@@ -1,146 +0,0 @@
1
- const vxeEvents = {
2
- // -------- 表单
3
- // 表单提交
4
- onFormSubmit(params) {
5
- this.$emit('submit', params)
6
- },
7
- // 表单重置
8
- onFormReset(params) {
9
- this.initFormItems()
10
- this.$vUtils.clear(this.data, null)
11
- this.$emit('reset', params)
12
- },
13
- // 表单项编辑回调
14
- async onFormEditClosed(obj, renderbox) {
15
- let { property, data } = obj
16
- if (this.formRules[property]) {
17
- let valerr = await this.formRef().validateField(property)
18
- if (!valerr) {
19
- this.formRef().clearValidate(property)
20
- }
21
- }
22
- this.$emit('edit-closed', obj, renderbox, this)
23
- Object.assign(this.data, data)
24
- },
25
- // 表单校验不通过
26
- onFormSubmitInvalid(params) {
27
- this.$emit('submit-invalid', params)
28
- },
29
- // 表单折叠按钮被手动点击时会触发该事件
30
- onFormCollapse(params) {
31
- this.$emit('collapse', params)
32
- },
33
- // 前缀点击事件
34
- onPrefixClick(params, render) {
35
- this.$emit('prefix-click', params, render)
36
- },
37
- // 后缀点击事件
38
- onSuffixClick(params, render) {
39
- this.$emit('suffix-click', params, render)
40
- }
41
- }
42
-
43
- const vxeMethods = {
44
- // 表单验证方法
45
- validate(callback) {
46
- return this.formRef().validate(callback)
47
- }
48
- }
49
-
50
- const shMethods = {
51
- // 初始化
52
- initCreated() {
53
- this.initFormItems()
54
- },
55
- // 初始化表单字段
56
- initFormData() {
57
- const { items, data, $vUtils } = this
58
- $vUtils.eachTree(items, item => {
59
- let renderProps = item.renderProps || item.itemRender?.props || {}
60
- if (!$vUtils.isNone(renderProps?.defaultValue) && $vUtils.isNone($vUtils.get(data, item.field))) {
61
- $vUtils.set(data, item.field, renderProps.defaultValue)
62
- }
63
- })
64
- },
65
- // 初始化表单项
66
- initFormItems(items) {
67
- let originItems = items || this.items
68
- let { formItemsArr, rules } = this.generateFormItem(originItems)
69
- this.initEditRules(rules)
70
- this.formItems = formItemsArr
71
- this.initFormData()
72
- },
73
- // 初始化验证规则
74
- initEditRules(rules) {
75
- const { $vUtils } = this
76
- if (rules && $vUtils.isPlainObject(rules)) {
77
- Object.keys(rules).forEach(key => {
78
- if (this.formRules[key]) {
79
- this.formRules[key] = Array.from(new Set(this.formRules[key].concat(rules[key])))
80
- } else {
81
- this.formRules[key] = rules[key]
82
- }
83
- })
84
- }
85
- },
86
- // 获取默认验证信息
87
- getDefaultMessage(renderType, title) {
88
- let message = ''
89
- const selectRenders = ['$vSelect', '$vTree', '$vTime', '$vSwitch', '$vCheckbox', '$vCheckgroup', '$vRadio', '$vRadiogroup', '$vUpload']
90
- if (selectRenders.includes(renderType)) {
91
- message = '请选择' + title
92
- } else {
93
- message = '请输入' + title
94
- }
95
- return message
96
- },
97
- // 判断为true
98
- isTrue(value) {
99
- return String(value) === '1' || String(value).toLowerCase() === 'true'
100
- },
101
- // 自动生成表单渲染项
102
- generateFormItem(items = []) {
103
- const { itemConfigDefault, isItemTitle, titleConfigDefault, readonly, disabled, isTrue, getDefaultMessage, $vUtils } = this
104
- let rules = {}
105
- // 表单不支持编辑渲染过滤
106
- let notRenderName = ['seq', 'checkbox', 'radio', '$vImg', '$vHref', '$vGlobalOption']
107
- let renderItems = $vUtils.searchTree(items, item => !((item.renderName && notRenderName.includes(item.renderName)) || notRenderName.includes(item.type)))
108
- let formItemsArr = $vUtils.mapTree(renderItems, ori => {
109
- let tar = Object.assign({}, itemConfigDefault, ori)
110
- if (ori.children && ori.children.length > 0) {
111
- if (isItemTitle) Object.assign(tar, titleConfigDefault)
112
- return tar
113
- }
114
- let renderConfig = {
115
- name: ori.renderName || '$vInput',
116
- props: Object.assign({}, ori.renderProps || {})
117
- }
118
- if (readonly || disabled) {
119
- renderConfig.props.disabled = true
120
- }
121
- tar.itemRender = Object.assign({}, renderConfig, ori.itemRender || {})
122
- // 首先提取校验配置
123
- if (isTrue(ori['renderRequire'])) {
124
- // 若配置了校验参数则走校验参数,没配置则给默认校验条件
125
- if (ori['requireProps'] && Array.isArray(ori['requireProps']) && ori['requireProps'].length > 0) {
126
- rules[ori['field']] = ori['requireProps']
127
- } else {
128
- let dataType = 'string'
129
- let arrayType = ['$vCheckgroup', '$vUpload', '$vTable']
130
- if (arrayType.includes(ori['renderName']) || ((ori['renderName'] === '$vSelect' || ori['renderName'] === '$vTree') && isTrue(renderConfig.props.multiple))) {
131
- dataType = 'array'
132
- }
133
- rules[ori['field']] = [{ required: true, message: getDefaultMessage(ori['renderName'], ori['title']), type: dataType }]
134
- }
135
- }
136
- return tar
137
- })
138
- return { formItemsArr, rules }
139
- }
140
- }
141
-
142
- export default {
143
- ...vxeEvents,
144
- ...vxeMethods,
145
- ...shMethods
146
- }
@@ -1,32 +0,0 @@
1
- export default {
2
- data() {
3
- return {
4
- // 表单默认配置
5
- formConfigDefault: {
6
- span: 8,
7
- align: 'left',
8
- titleAlign: 'right',
9
- titleWidth: 100,
10
- titleColon: true,
11
- titleAsterisk: true,
12
- titleOverflow: false,
13
- className: '',
14
- preventSubmit: false
15
- },
16
- // 表单项默认配置
17
- itemConfigDefault: {},
18
- // 标题项默认配置
19
- titleConfigDefault: {
20
- align: 'left',
21
- titleAlign: 'left',
22
- titleWidth: '100%',
23
- titleOverflow: false,
24
- className: 'shFormTitleItem'
25
- }
26
- }
27
- },
28
- computed: {},
29
- methods: {},
30
- created() {},
31
- activated() {}
32
- }
@@ -1,27 +0,0 @@
1
- @font-face {
2
- font-family: 'Ionicons';
3
- src: url("./fonts/ionicons.woff2") format("woff2"),
4
- url("./fonts/ionicons.woff") format("woff"),
5
- url("./fonts/ionicons.ttf") format("truetype"),
6
- url("./fonts/ionicons.svg") format("svg");
7
- font-weight: normal;
8
- font-style: normal;
9
- }
10
-
11
- .sh-icon {
12
- display: inline-block;
13
- font-family: 'Ionicons';
14
- speak: none;
15
- font-style: normal;
16
- font-weight: normal;
17
- font-variant: normal;
18
- text-transform: none;
19
- text-rendering: optimizeLegibility;
20
- line-height: 1;
21
- -webkit-font-smoothing: antialiased;
22
- -moz-osx-font-smoothing: grayscale;
23
- vertical-align: -0.125em;
24
- text-align: center;
25
- }
26
-
27
- @import "icons";
@@ -1,16 +0,0 @@
1
- @font-face {
2
- font-family: "iconfont"; /* Project id 3613109 */
3
- src: url('./fonts/iconfont.woff2?t=1661513291946') format('woff2'),
4
- url('./fonts/iconfont.woff?t=1661513291946') format('woff'),
5
- url('./fonts/iconfont.ttf?t=1661513291946') format('truetype');
6
- }
7
-
8
- .iconfont {
9
- font-family: "iconfont" !important;
10
- font-size: 16px;
11
- font-style: normal;
12
- -webkit-font-smoothing: antialiased;
13
- -moz-osx-font-smoothing: grayscale;
14
- }
15
-
16
- @import "icons";
@@ -1,32 +0,0 @@
1
- <template>
2
- <i :class="`sh-icon ${type}`" :style="styles"></i>
3
- </template>
4
-
5
- <script>
6
- import './css/default/index.scss'
7
- export default {
8
- name: 'IcondefaultIcons',
9
- props: {
10
- type: {
11
- type: String,
12
- required: true
13
- },
14
- color: {
15
- type: String
16
- },
17
- size: {
18
- type: [Number, String]
19
- }
20
- },
21
- computed: {
22
- styles() {
23
- return {
24
- fontSize: `${this.size}px`,
25
- color: this.color
26
- }
27
- }
28
- }
29
- }
30
- </script>
31
-
32
- <style></style>