sh-view 2.1.0 → 2.3.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 +62 -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 +266 -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,260 +1,250 @@
1
- <template>
2
- <div class="sh-code-editor" :style="shStyles">
3
- <div ref="codeMirror" class="sh-code-content" />
4
- <div v-if="error" class="sh-code-error" v-html="error"></div>
5
- </div>
6
- </template>
7
-
8
- <script>
9
- import { basicSetup } from 'codemirror'
10
- import { keymap, placeholder, drawSelection, lineNumbers, EditorView } from '@codemirror/view'
11
- import { Compartment, EditorState, StateEffect } from '@codemirror/state'
12
- import { defaultKeymap, indentWithTab, historyKeymap, history } from '@codemirror/commands'
13
- import themes from './themes'
14
- import { javascript } from '@codemirror/lang-javascript'
15
- import { sql } from '@codemirror/lang-sql'
16
- import { json } from '@codemirror/lang-json'
17
- const tabSize = new Compartment()
18
- export default {
19
- name: 'ShCodeEditor',
20
- props: {
21
- modelValue: {
22
- type: [String, Object],
23
- default: ''
24
- },
25
- option: {
26
- type: Object,
27
- default() {
28
- return {}
29
- }
30
- },
31
- mode: {
32
- type: String,
33
- default: 'javascript'
34
- },
35
- theme: {
36
- type: String,
37
- default: ''
38
- },
39
- placeholder: {
40
- type: String,
41
- default: ''
42
- },
43
- disabled: {
44
- type: Boolean
45
- },
46
- border: {
47
- type: Boolean
48
- },
49
- indent: {
50
- type: Number,
51
- default: 4
52
- },
53
- wrap: {
54
- type: Boolean
55
- },
56
- tab: {
57
- type: Boolean
58
- },
59
- multipleSelection: {
60
- type: Boolean,
61
- default: true
62
- },
63
- extensions: {
64
- type: Array,
65
- default() {
66
- return []
67
- }
68
- },
69
- width: {
70
- type: [String, Number],
71
- default: '100%'
72
- },
73
- height: {
74
- type: [String, Number],
75
- default: 'auto'
76
- }
77
- },
78
- emits: ['update:modelValue', 'change', 'loaded', 'focus', 'blur', 'destroy'],
79
- data() {
80
- return {
81
- codeEditor: null,
82
- codeLength: 0,
83
- error: null
84
- }
85
- },
86
- computed: {
87
- shStyles() {
88
- return {
89
- width: this.width,
90
- height: this.height,
91
- border: this.border ? '1px solid var(--vxe-table-border-color)' : 'none'
92
- }
93
- },
94
- codeExtensions() {
95
- const { mode, disabled, multipleSelection, indent, theme, tab, wrap, extensions } = this
96
- let defaultExtensions = [basicSetup, history(), drawSelection(), lineNumbers(), placeholder(this.placeholder), keymap.of([...defaultKeymap, ...historyKeymap])]
97
- if (['javascript', 'js'].includes(mode.toLowerCase())) {
98
- defaultExtensions.push(javascript())
99
- } else if (['mysql', 'sql'].includes(mode.toLowerCase())) {
100
- defaultExtensions.push(sql())
101
- } else if (['json'].includes(mode.toLowerCase())) {
102
- defaultExtensions.push(json())
103
- }
104
- return [
105
- ...defaultExtensions,
106
- EditorView.updateListener.of(this.updateListener),
107
- EditorView.focusChangeEffect.of(this.focusListener),
108
- EditorView.editable.of(!disabled),
109
- EditorState.allowMultipleSelections.of(multipleSelection),
110
- tabSize.of(EditorState.tabSize.of(indent)),
111
- theme && themes[theme] ? themes[theme] : undefined,
112
- tab ? keymap.of([indentWithTab]) : undefined,
113
- wrap ? EditorView.lineWrapping : undefined,
114
- ...extensions
115
- ].filter(item => !!item)
116
- }
117
- },
118
- watch: {
119
- modelValue(value) {
120
- if (this.codeEditor && !this.codeEditor.composing) {
121
- let docLength = this.codeEditor.state.doc.length
122
- let docValue = this.getTransformValue(value)
123
- this.codeEditor.dispatch({
124
- changes: { from: 0, to: docLength, insert: docValue },
125
- selection: this.codeEditor.state.selection,
126
- scrollIntoView: true
127
- })
128
- this.codeLength = docLength
129
- }
130
- },
131
- codeExtensions: {
132
- handler(exts) {
133
- this.codeEditor?.dispatch({
134
- effects: StateEffect.reconfigure.of(exts)
135
- })
136
- },
137
- immediate: true
138
- }
139
- },
140
- mounted() {
141
- this.codeRender()
142
- },
143
- unmounted() {
144
- if (this.codeEditor) this.codeEditor.destroy()
145
- this.emitDestroy()
146
- },
147
- methods: {
148
- codeRef() {
149
- return this.$refs.codeMirror
150
- },
151
- async codeRender() {
152
- const { codeRef, codeExtensions, modelValue, emitLoaded } = this
153
- let docValue = this.getTransformValue(modelValue)
154
- let codeState = EditorState.create({
155
- doc: docValue,
156
- extensions: codeExtensions
157
- })
158
- this.codeEditor = new EditorView({
159
- parent: codeRef(),
160
- state: codeState
161
- })
162
- await this.$nextTick()
163
- emitLoaded()
164
- },
165
- focusListener(state, focusing) {
166
- let valueStr = state.doc.toString()
167
- if (focusing) {
168
- this.emitFocus(valueStr)
169
- } else {
170
- this.emitValue(valueStr)
171
- this.emitBlur(valueStr)
172
- }
173
- },
174
- async updateListener({ state, changes, docChanged }) {
175
- if (changes.empty || !docChanged) {
176
- return
177
- }
178
- let valueStr = state.doc.toString()
179
- // if (props.linter) {
180
- // // Linter process
181
- // if (props.forceLinting) {
182
- // // If forceLinting enabled, first liting.
183
- // forceLinting(view.value);
184
- // }
185
- // // Count diagnostics.
186
- // diagnosticCount.value = (
187
- // props.linter(view.value) as readonly Diagnostic[]
188
- // ).length;
189
- // }
190
- this.emitChange(valueStr)
191
- },
192
- focus() {
193
- this.codeEditor && this.codeEditor.focus()
194
- },
195
- getTransformValue(value, out) {
196
- const { modelValue, indent } = this
197
- let result = '',
198
- error = null
199
- try {
200
- if (typeof modelValue === 'object' && value) {
201
- result = out ? JSON.parse(value, null, indent) : JSON.stringify(value, null, indent)
202
- } else {
203
- result = value
204
- }
205
- } catch (e) {
206
- error = e
207
- }
208
- this.error = error
209
- return result
210
- },
211
- emitValue(value) {
212
- let outValue = this.getTransformValue(value, true)
213
- if (this.error) return
214
- this.$emit('update:modelValue', outValue)
215
- },
216
- emitChange(value) {
217
- this.$emit('change', { value, $event: this.codeEditor })
218
- },
219
- emitFocus(value) {
220
- let outValue = this.getTransformValue(value, true)
221
- if (this.error) return
222
- this.$emit('focus', { value: outValue, $event: this.codeEditor })
223
- },
224
- emitBlur(value) {
225
- let outValue = this.getTransformValue(value, true)
226
- if (this.error) return
227
- this.$emit('blur', { value: outValue, $event: this.codeEditor })
228
- },
229
- emitLoaded() {
230
- this.$emit('loaded', { value: this.modelValue, $event: this.codeEditor })
231
- },
232
- emitDestroy() {
233
- this.$emit('destroy', { value: this.modelValue, $event: this.codeEditor })
234
- }
235
- }
236
- }
237
- </script>
238
-
239
- <style lang="scss" scoped>
240
- .sh-code-editor {
241
- display: flex;
242
- position: relative;
243
- overflow: auto;
244
- border-radius: var(--vxe-border-radius);
245
- .sh-code-content {
246
- flex: 1;
247
- display: block;
248
- }
249
- .sh-code-error {
250
- position: absolute;
251
- left: 0;
252
- right: 0;
253
- bottom: 0;
254
- background-color: var(--vxe-danger-color);
255
- color: #fff;
256
- padding: 0 5px;
257
- font-size: 12px;
258
- }
259
- }
260
- </style>
1
+ <template>
2
+ <div class="sh-code-editor" :style="styles">
3
+ <div ref="codeRef" class="sh-code-content" />
4
+ <div v-if="codeError" class="sh-code-error" v-html="codeError"></div>
5
+ </div>
6
+ </template>
7
+
8
+ <script>
9
+ import { defineComponent, ref, computed, watch, onMounted, onUnmounted, nextTick } from 'vue'
10
+ import { basicSetup } from 'codemirror'
11
+ import { keymap, placeholder, drawSelection, lineNumbers, EditorView } from '@codemirror/view'
12
+ import { Compartment, EditorState, StateEffect } from '@codemirror/state'
13
+ import { defaultKeymap, indentWithTab, historyKeymap, history } from '@codemirror/commands'
14
+ import themes from './themes'
15
+ import { javascript } from '@codemirror/lang-javascript'
16
+ import { sql } from '@codemirror/lang-sql'
17
+ import { json } from '@codemirror/lang-json'
18
+ const tabSize = new Compartment()
19
+ export default defineComponent({
20
+ name: 'ShCodeEditor',
21
+ props: {
22
+ modelValue: {
23
+ type: [String, Object],
24
+ default: ''
25
+ },
26
+ option: {
27
+ type: Object,
28
+ default() {
29
+ return {}
30
+ }
31
+ },
32
+ mode: {
33
+ type: String,
34
+ default: 'javascript'
35
+ },
36
+ theme: {
37
+ type: String,
38
+ default: ''
39
+ },
40
+ placeholder: {
41
+ type: String,
42
+ default: ''
43
+ },
44
+ disabled: {
45
+ type: Boolean
46
+ },
47
+ border: {
48
+ type: Boolean
49
+ },
50
+ indent: {
51
+ type: Number,
52
+ default: 4
53
+ },
54
+ wrap: {
55
+ type: Boolean
56
+ },
57
+ tab: {
58
+ type: Boolean
59
+ },
60
+ multipleSelection: {
61
+ type: Boolean,
62
+ default: true
63
+ },
64
+ extensions: {
65
+ type: Array,
66
+ default() {
67
+ return []
68
+ }
69
+ },
70
+ width: {
71
+ type: [String, Number],
72
+ default: '100%'
73
+ },
74
+ height: {
75
+ type: [String, Number],
76
+ default: 'auto'
77
+ }
78
+ },
79
+ emits: ['update:modelValue', 'change', 'loaded', 'focus', 'blur', 'destroy'],
80
+ setup(props, context) {
81
+ const { emit } = context
82
+
83
+ const codeEditor = ref(null)
84
+ const codeLength = ref(0)
85
+ const codeError = ref(null)
86
+ const codeRef = ref()
87
+
88
+ const styles = computed(() => {
89
+ return {
90
+ width: props.width,
91
+ height: props.height,
92
+ border: props.border ? '1px solid var(--vxe-table-border-color)' : 'none'
93
+ }
94
+ })
95
+ const codeExtensions = computed(() => {
96
+ const { mode, disabled, multipleSelection, indent, theme, tab, wrap, extensions } = props
97
+ let defaultExtensions = [basicSetup, history(), drawSelection(), lineNumbers(), placeholder(props.placeholder), keymap.of([...defaultKeymap, ...historyKeymap])]
98
+ if (['javascript', 'js'].includes(mode.toLowerCase())) {
99
+ defaultExtensions.push(javascript())
100
+ } else if (['mysql', 'sql'].includes(mode.toLowerCase())) {
101
+ defaultExtensions.push(sql())
102
+ } else if (['json'].includes(mode.toLowerCase())) {
103
+ defaultExtensions.push(json())
104
+ }
105
+ return [
106
+ ...defaultExtensions,
107
+ EditorView.updateListener.of(updateListener),
108
+ EditorView.focusChangeEffect.of(focusListener),
109
+ EditorView.editable.of(!disabled),
110
+ EditorState.allowMultipleSelections.of(multipleSelection),
111
+ tabSize.of(EditorState.tabSize.of(indent)),
112
+ theme && themes[theme] ? themes[theme] : undefined,
113
+ tab ? keymap.of([indentWithTab]) : undefined,
114
+ wrap ? EditorView.lineWrapping : undefined,
115
+ ...extensions
116
+ ].filter(item => !!item)
117
+ })
118
+
119
+ watch(
120
+ () => props.modelValue,
121
+ value => {
122
+ if (codeEditor.value && !codeEditor.value.composing) {
123
+ let docLength = codeEditor.value.state.doc.length
124
+ let docValue = getTransformValue(value)
125
+ codeEditor.value.dispatch({
126
+ changes: { from: 0, to: docLength, insert: docValue },
127
+ selection: codeEditor.value.state.selection,
128
+ scrollIntoView: true
129
+ })
130
+ codeLength.value = docLength
131
+ }
132
+ }
133
+ )
134
+ watch(
135
+ () => props.codeExtensions,
136
+ value => {
137
+ codeEditor.value?.dispatch({
138
+ effects: StateEffect.reconfigure.of(value)
139
+ })
140
+ },
141
+ {
142
+ immediate: true
143
+ }
144
+ )
145
+
146
+ const codeRender = async () => {
147
+ let docValue = getTransformValue(props.modelValue)
148
+ let codeState = new EditorState.create({
149
+ doc: docValue,
150
+ extensions: codeExtensions.value
151
+ })
152
+ codeEditor.value = new EditorView({
153
+ parent: codeRef.value,
154
+ state: codeState
155
+ })
156
+ await nextTick()
157
+ dispatchEvent('loaded', props.modelValue)
158
+ }
159
+
160
+ const focusListener = (state, focusing) => {
161
+ let valueStr = state.doc.toString()
162
+ if (focusing) {
163
+ dispatchEvent('focus', valueStr)
164
+ } else {
165
+ dispatchValue(valueStr)
166
+ dispatchEvent('blur', valueStr)
167
+ }
168
+ }
169
+
170
+ const updateListener = async ({ state, changes, docChanged }) => {
171
+ if (changes.empty || !docChanged) return
172
+ let valueStr = state.doc.toString()
173
+ dispatchEvent('change', valueStr)
174
+ }
175
+
176
+ const focus = () => {
177
+ codeEditor.value && codeEditor.value.focus()
178
+ }
179
+
180
+ const getTransformValue = (value, out) => {
181
+ const { modelValue, indent } = props
182
+ let result = '',
183
+ error = null
184
+ try {
185
+ if (typeof modelValue === 'object' && value) {
186
+ result = out ? JSON.parse(value, null, indent) : JSON.stringify(value, null, indent)
187
+ } else {
188
+ result = value
189
+ }
190
+ } catch (e) {
191
+ error = e
192
+ }
193
+ codeError.value = error
194
+ return result
195
+ }
196
+
197
+ const dispatchValue = value => {
198
+ let outValue = getTransformValue(value, true)
199
+ if (codeError.value) return
200
+ emit('update:modelValue', outValue)
201
+ }
202
+
203
+ const dispatchEvent = (type, value) => {
204
+ let outValue = null
205
+ if (['focus', 'blur'].includes(type)) {
206
+ outValue = getTransformValue(value, true)
207
+ if (codeError.value) return
208
+ }
209
+ emit(type, { $event: codeEditor.value, value: outValue || value })
210
+ }
211
+
212
+ onMounted(() => {
213
+ codeRender()
214
+ })
215
+ onUnmounted(() => {
216
+ if (codeEditor.value) codeEditor.value.destroy()
217
+ dispatchEvent('destroy', props.modelValue)
218
+ })
219
+
220
+ return {
221
+ codeRef,
222
+ styles,
223
+ codeError
224
+ }
225
+ }
226
+ })
227
+ </script>
228
+
229
+ <style lang="scss" scoped>
230
+ .sh-code-editor {
231
+ display: flex;
232
+ position: relative;
233
+ overflow: auto;
234
+ border-radius: var(--vxe-border-radius);
235
+ .sh-code-content {
236
+ flex: 1;
237
+ display: block;
238
+ }
239
+ .sh-code-error {
240
+ position: absolute;
241
+ left: 0;
242
+ right: 0;
243
+ bottom: 0;
244
+ background-color: var(--vxe-danger-color);
245
+ color: #fff;
246
+ padding: 0 5px;
247
+ font-size: 12px;
248
+ }
249
+ }
250
+ </style>
@@ -5,20 +5,10 @@
5
5
  </template>
6
6
 
7
7
  <script>
8
+ import { defineComponent, computed, inject } from 'vue'
8
9
  import './css/index.scss'
9
- const prefixCls = 'sh-col'
10
- function parseFlex(flex) {
11
- if (typeof flex === 'number') {
12
- return `${flex} ${flex} auto`
13
- }
14
- if (/^\d+(\.\d+)?(px|em|rem|%)$/.test(flex)) {
15
- return `0 0 ${flex}`
16
- }
17
- return flex
18
- }
19
- export default {
10
+ export default defineComponent({
20
11
  name: 'ShCol',
21
- inject: ['RowInstance'],
22
12
  props: {
23
13
  span: [Number, String],
24
14
  order: [Number, String],
@@ -36,49 +26,67 @@ export default {
36
26
  default: ''
37
27
  }
38
28
  },
39
- computed: {
40
- gutter() {
41
- return this.RowInstance?.gutter || 0
42
- },
43
- classes() {
29
+ setup(props, context) {
30
+ const prefixCls = 'sh-col'
31
+ const RowInstance = inject('RowInstance')
32
+
33
+ const gutter = computed(() => {
34
+ return RowInstance?.gutter || 0
35
+ })
36
+ const classes = computed(() => {
44
37
  let classList = [
45
38
  `${prefixCls}`,
46
39
  {
47
- [`${prefixCls}-span-${this.span}`]: this.span,
48
- [`${prefixCls}-order-${this.order}`]: this.order,
49
- [`${prefixCls}-offset-${this.offset}`]: this.offset,
50
- [`${prefixCls}-push-${this.push}`]: this.push,
51
- [`${prefixCls}-pull-${this.pull}`]: this.pull
40
+ [`${prefixCls}-span-${props.span}`]: props.span,
41
+ [`${prefixCls}-order-${props.order}`]: props.order,
42
+ [`${prefixCls}-offset-${props.offset}`]: props.offset,
43
+ [`${prefixCls}-push-${props.push}`]: props.push,
44
+ [`${prefixCls}-pull-${props.pull}`]: props.pull
52
45
  }
53
46
  ]
54
47
  let sizeList = ['xs', 'sm', 'md', 'lg', 'xl', 'xxl']
55
48
  sizeList.forEach(size => {
56
- if (typeof this[size] === 'number') {
57
- classList.push(`${prefixCls}-span-${size}-${this[size]}`)
58
- } else if (typeof this[size] === 'object') {
59
- let props = this[size]
60
- Object.keys(props).forEach(prop => {
61
- classList.push(`${prefixCls}-${size}-${prop}-${props[prop]}`)
49
+ if (typeof props[size] === 'number') {
50
+ classList.push(`${prefixCls}-span-${size}-${props[size]}`)
51
+ } else if (typeof props[size] === 'object') {
52
+ let sizeProps = props[size]
53
+ Object.keys(sizeProps).forEach(sizeprop => {
54
+ classList.push(`${prefixCls}-${size}-${sizeprop}-${sizeProps[sizeprop]}`)
62
55
  })
63
56
  }
64
57
  })
65
58
  return classList
66
- },
67
- styles() {
59
+ })
60
+ const styles = computed(() => {
68
61
  let style = {}
69
- if (this.gutter !== 0) {
62
+ if (gutter.value !== 0) {
70
63
  style = {
71
- paddingLeft: this.gutter / 2 + 'px',
72
- paddingRight: this.gutter / 2 + 'px'
64
+ paddingLeft: gutter.value / 2 + 'px',
65
+ paddingRight: gutter.value / 2 + 'px'
73
66
  }
74
67
  }
75
- if (this.flex) {
76
- style.flex = parseFlex(this.flex)
68
+ if (props.flex) {
69
+ style.flex = parseFlex(props.flex)
77
70
  }
78
71
  return style
72
+ })
73
+
74
+ const parseFlex = flex => {
75
+ if (typeof flex === 'number') {
76
+ return `${flex} ${flex} auto`
77
+ }
78
+ if (/^\d+(\.\d+)?(px|em|rem|%)$/.test(flex)) {
79
+ return `0 0 ${flex}`
80
+ }
81
+ return flex
82
+ }
83
+
84
+ return {
85
+ classes,
86
+ styles
79
87
  }
80
88
  }
81
- }
89
+ })
82
90
  </script>
83
91
 
84
92
  <style scoped lang="scss"></style>