sohelp-eleplus 1.1.26 → 1.1.28

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 (205) hide show
  1. package/components.js +1 -0
  2. package/icons/flag/README.md +2 -2
  3. package/icons/flag/index.js +0 -1
  4. package/package.json +1 -1
  5. package/sohelp-ace-editor/README.md +32 -42
  6. package/sohelp-ace-editor/index.vue +166 -156
  7. package/sohelp-api-doc/README.md +36 -0
  8. package/sohelp-api-doc/index.vue +160 -0
  9. package/sohelp-application-select/README.md +9 -7
  10. package/sohelp-application-select/index.vue +10 -13
  11. package/sohelp-autocode/README.md +14 -26
  12. package/sohelp-calendar-view/README.md +9 -7
  13. package/sohelp-calendar-view/index.vue +10 -9
  14. package/sohelp-card/README.md +15 -17
  15. package/sohelp-card/index.vue +1 -1
  16. package/sohelp-card-view/README.md +9 -7
  17. package/sohelp-card-view/index.vue +10 -9
  18. package/sohelp-condition/README.md +29 -49
  19. package/sohelp-condition/index.vue +2 -1
  20. package/sohelp-country-select/README.md +15 -123
  21. package/sohelp-country-select/index.vue +1 -1
  22. package/sohelp-cry-input/README.md +19 -195
  23. package/sohelp-cry-input/index.vue +6 -2
  24. package/sohelp-date/README.md +12 -15
  25. package/sohelp-datetime/README.md +15 -17
  26. package/sohelp-datetime-picker/README.md +18 -18
  27. package/sohelp-datetime-picker/index.vue +11 -4
  28. package/sohelp-datetime-range/README.md +20 -23
  29. package/sohelp-demo-block/README.md +43 -0
  30. package/sohelp-demo-block/index.vue +229 -0
  31. package/sohelp-dict/README.md +28 -23
  32. package/sohelp-dict/index.vue +17 -17
  33. package/sohelp-drawer/README.md +28 -26
  34. package/sohelp-drop-card/README.md +29 -28
  35. package/sohelp-drop-card/index.vue +0 -1
  36. package/sohelp-dyn-select/README.md +31 -16
  37. package/sohelp-dyn-select/index.vue +65 -67
  38. package/sohelp-dyn-tree/README.md +26 -20
  39. package/sohelp-dyn-tree/index.vue +2 -2
  40. package/sohelp-dyn-tree-select/README.md +28 -19
  41. package/sohelp-dyn-tree-select/index.vue +23 -7
  42. package/sohelp-entity-form/README.md +65 -30
  43. package/sohelp-entity-form/index.vue +3 -2
  44. package/sohelp-entity-grid/README.md +13 -11
  45. package/sohelp-entity-grid/index.vue +1 -1
  46. package/sohelp-file-upload/README.md +25 -27
  47. package/sohelp-file-upload/index.vue +1 -1
  48. package/sohelp-filter-scheme/README.md +34 -30
  49. package/sohelp-filter-scheme/index.vue +2 -2
  50. package/sohelp-grid/README.md +52 -33
  51. package/sohelp-grid/index.vue +41 -39
  52. package/sohelp-grid/js/SohelpGridConfig.js +3 -3
  53. package/sohelp-grid/js/useSohelpGridConfig.js +4 -6
  54. package/sohelp-grid-select/README.md +32 -27
  55. package/sohelp-grid-select/index.vue +6 -5
  56. package/sohelp-grid-view/README.md +51 -22
  57. package/sohelp-grid-view-select/README.md +33 -25
  58. package/sohelp-grid-view-select/index.vue +2 -1
  59. package/sohelp-group-view/README.md +14 -4
  60. package/sohelp-group-view/index.vue +10 -9
  61. package/sohelp-icon-select/README.md +14 -12
  62. package/sohelp-image-upload/README.md +27 -27
  63. package/sohelp-image-upload/index.vue +2 -2
  64. package/sohelp-import/README.md +25 -24
  65. package/sohelp-input/README.md +27 -11
  66. package/sohelp-input/index.vue +15 -2
  67. package/sohelp-input-tag/README.md +53 -0
  68. package/sohelp-input-tag/index.vue +337 -0
  69. package/sohelp-modal/README.md +42 -16
  70. package/sohelp-modal/index.vue +21 -4
  71. package/sohelp-modal-select/README.md +745 -0
  72. package/sohelp-modal-select/index.vue +705 -0
  73. package/sohelp-module/README.md +24 -13
  74. package/sohelp-number-input/README.md +15 -8
  75. package/sohelp-number-input/index.vue +3 -0
  76. package/sohelp-number-range/README.md +22 -12
  77. package/sohelp-number-range/index.vue +3 -11
  78. package/sohelp-org-modal-select/README.md +47 -0
  79. package/sohelp-org-modal-select/index.vue +411 -0
  80. package/sohelp-org-select/README.md +23 -10
  81. package/sohelp-org-select/index.vue +41 -24
  82. package/sohelp-org-tree/README.md +19 -7
  83. package/sohelp-org-tree/index.vue +1 -2
  84. package/sohelp-org-tree-select/README.md +22 -11
  85. package/sohelp-org-tree-select/index.vue +1 -2
  86. package/sohelp-org-user-tree/README.md +19 -7
  87. package/sohelp-org-user-tree/index.vue +1 -2
  88. package/sohelp-org-user-tree-select/README.md +8 -3
  89. package/sohelp-org-user-tree-select/index.vue +8 -7
  90. package/sohelp-page/README.md +20 -11
  91. package/sohelp-page/index.vue +1 -1
  92. package/sohelp-pagination/README.md +14 -6
  93. package/sohelp-pagination/index.vue +1 -1
  94. package/sohelp-power/README.md +34 -19
  95. package/sohelp-power/index.vue +2 -2
  96. package/sohelp-pro-form/README.md +64 -21
  97. package/sohelp-pro-layout/README.md +10 -4
  98. package/sohelp-pro-layout/index.vue +8 -7
  99. package/sohelp-pro-table/README.md +30 -6
  100. package/sohelp-process/README.md +26 -13
  101. package/sohelp-process/index.vue +6 -6
  102. package/sohelp-rate/README.md +24 -12
  103. package/sohelp-rate/index.vue +5 -1
  104. package/sohelp-relation/README.md +10 -4
  105. package/sohelp-relation/index.vue +8 -7
  106. package/sohelp-relation-modal-select/README.md +41 -0
  107. package/sohelp-relation-modal-select/index.vue +70 -0
  108. package/sohelp-rich-text/README.md +29 -11
  109. package/sohelp-rich-text/index.vue +21 -20
  110. package/sohelp-richtext/README.md +12 -2
  111. package/sohelp-richtext/index.vue +8 -6
  112. package/sohelp-role-modal-select/README.md +45 -0
  113. package/sohelp-role-modal-select/index.vue +111 -0
  114. package/sohelp-role-select/README.md +18 -10
  115. package/sohelp-role-select/index.vue +36 -27
  116. package/sohelp-search/README.md +12 -4
  117. package/sohelp-search/index.vue +2 -2
  118. package/sohelp-search-pro-form/README.md +15 -1
  119. package/sohelp-search-pro-form/index.vue +2 -1
  120. package/sohelp-select/README.md +31 -30
  121. package/sohelp-select/index.vue +79 -84
  122. package/sohelp-split-panel/README.md +17 -18
  123. package/sohelp-switch/README.md +21 -19
  124. package/sohelp-switch/index.vue +34 -33
  125. package/sohelp-table/README.md +35 -27
  126. package/sohelp-table/index.vue +110 -109
  127. package/sohelp-table-select/README.md +55 -0
  128. package/sohelp-tenant-select/README.md +19 -18
  129. package/sohelp-tenant-select/index.vue +105 -109
  130. package/sohelp-text/README.md +16 -10
  131. package/sohelp-text/index.vue +5 -5
  132. package/sohelp-textarea-input/README.md +19 -12
  133. package/sohelp-time/README.md +11 -10
  134. package/sohelp-tree/README.md +24 -19
  135. package/sohelp-tree/index.vue +21 -23
  136. package/sohelp-tree-select/README.md +23 -10
  137. package/sohelp-user-modal-select/README.md +739 -0
  138. package/sohelp-user-modal-select/index.vue +87 -0
  139. package/sohelp-user-select/README.md +26 -15
  140. package/sohelp-user-select/index.vue +6 -2
  141. package/sohelp-user-tag/README.md +5 -7
  142. package/sohelp-user-tag/index.vue +8 -8
  143. package/sohelp-user-tree/README.md +5 -8
  144. package/sohelp-user-tree/index.vue +8 -7
  145. package/sohelp-vform-drawer/README.md +36 -18
  146. package/sohelp-vform-drawer/index.vue +2 -2
  147. package/sohelp-vform-eleplus/README.md +33 -31
  148. package/sohelp-vform-eleplus/index.vue +2 -2
  149. package/sohelp-vform-eleplus/tinymce/langs/zh_CN.js +461 -461
  150. package/sohelp-vform-eleplus/tinymce/langs/zh_TW.js +418 -418
  151. package/sohelp-vform-eleplus/tinymce/skins/content/dark/content.css +72 -72
  152. package/sohelp-vform-eleplus/tinymce/skins/content/dark/content.min.css +7 -7
  153. package/sohelp-vform-eleplus/tinymce/skins/content/default/content.css +67 -67
  154. package/sohelp-vform-eleplus/tinymce/skins/content/default/content.min.css +7 -7
  155. package/sohelp-vform-eleplus/tinymce/skins/content/document/content.css +72 -72
  156. package/sohelp-vform-eleplus/tinymce/skins/content/document/content.min.css +7 -7
  157. package/sohelp-vform-eleplus/tinymce/skins/content/writer/content.css +68 -68
  158. package/sohelp-vform-eleplus/tinymce/skins/content/writer/content.min.css +7 -7
  159. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide/content.css +732 -732
  160. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide/content.inline.css +726 -726
  161. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide/content.inline.min.css +7 -7
  162. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide/content.min.css +7 -7
  163. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide/content.mobile.css +29 -29
  164. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide/content.mobile.min.css +7 -7
  165. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide/skin.css +3047 -3047
  166. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide/skin.min.css +7 -7
  167. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide/skin.mobile.css +673 -673
  168. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide/skin.mobile.min.css +7 -7
  169. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide/skin.shadowdom.css +37 -37
  170. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide/skin.shadowdom.min.css +7 -7
  171. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide-dark/content.css +714 -714
  172. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide-dark/content.inline.css +726 -726
  173. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide-dark/content.inline.min.css +7 -7
  174. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide-dark/content.min.css +7 -7
  175. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide-dark/content.mobile.css +29 -29
  176. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide-dark/content.mobile.min.css +7 -7
  177. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide-dark/skin.css +3047 -3047
  178. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide-dark/skin.min.css +7 -7
  179. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide-dark/skin.mobile.css +673 -673
  180. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide-dark/skin.mobile.min.css +7 -7
  181. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide-dark/skin.shadowdom.css +37 -37
  182. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css +7 -7
  183. package/sohelp-vform-modal/README.md +36 -18
  184. package/sohelp-vform-modal/index.vue +2 -2
  185. package/sohelp-vform-select/README.md +9 -7
  186. package/sohelp-vform-select/index.vue +8 -7
  187. package/sohelp-vxe-grid/DefaultGridOptions.js +5 -3
  188. package/sohelp-vxe-grid/DefaultProps.js +0 -1
  189. package/sohelp-vxe-grid/README.md +540 -35
  190. package/sohelp-vxe-grid/SohelpGridConfig.js +8 -6
  191. package/sohelp-vxe-grid/index.vue +141 -94
  192. package/sohelp-vxe-grid-select/README.md +41 -26
  193. package/sohelp-vxe-table/README.md +23 -20
  194. package/sohelp-vxe-table/index.vue +5 -4
  195. package/sohelp-workflow/README.md +21 -17
  196. package/sohelp-workflow/index.vue +25 -22
  197. package/sohelp-workflow-drawer/README.md +41 -28
  198. package/sohelp-workflow-drawer/components/table.vue +7 -1
  199. package/sohelp-workflow-drawer/index.vue +86 -71
  200. package/sohelp-workflow-drawer/js/index.js +15 -13
  201. package/style/index.scss +0 -0
  202. package/utils/safe-eval.js +89 -0
  203. package/sohelp-dyn-select/props.js +0 -67
  204. package/sohelp-user-select/index.vue~ +0 -53
  205. package/sohelp-user-select/props.js +0 -71
@@ -0,0 +1,229 @@
1
+ <template>
2
+ <ele-card :header="title" class="sohelp-demo-block" :bodyStyle="{ padding: '20px' }">
3
+ <!-- 演示内容 -->
4
+ <div class="demo-content">
5
+ <slot></slot>
6
+ </div>
7
+
8
+ <!-- 描述 -->
9
+ <div class="demo-desc" v-if="description">{{ description }}</div>
10
+
11
+ <!-- 底部工具栏 -->
12
+ <div class="demo-toolbar">
13
+ <el-tooltip content="API 文档" placement="top" :show-after="300">
14
+ <el-icon class="toolbar-icon" :class="{ active: showApi }" @click="showApi = !showApi"><Document /></el-icon>
15
+ </el-tooltip>
16
+ <el-tooltip content="查看源码" placement="top" :show-after="300">
17
+ <el-icon class="toolbar-icon" :class="{ active: showCode }" @click="showCode = !showCode"><CodeIcon /></el-icon>
18
+ </el-tooltip>
19
+ <el-tooltip content="复制代码" placement="top" :show-after="300">
20
+ <el-icon class="toolbar-icon" @click="copyCode"><CopyDocument /></el-icon>
21
+ </el-tooltip>
22
+ </div>
23
+
24
+ <!-- API 文档区 -->
25
+ <el-collapse-transition>
26
+ <div v-show="showApi" class="demo-api-section">
27
+ <!-- Props -->
28
+ <div v-if="props?.length" class="api-block">
29
+ <div class="api-title">Props 属性</div>
30
+ <el-table :data="props" border size="small" class="api-table">
31
+ <el-table-column prop="name" label="属性" width="180" />
32
+ <el-table-column prop="type" label="类型" width="150" />
33
+ <el-table-column prop="default" label="默认值" width="130" />
34
+ <el-table-column label="必填" width="55" align="center">
35
+ <template #default="{ row }">
36
+ <el-tag v-if="row.required" type="danger" size="small">是</el-tag>
37
+ </template>
38
+ </el-table-column>
39
+ <el-table-column prop="desc" label="说明" min-width="200" />
40
+ </el-table>
41
+ </div>
42
+ <!-- Events -->
43
+ <div v-if="events?.length" class="api-block">
44
+ <div class="api-title">Events 事件</div>
45
+ <el-table :data="events" border size="small" class="api-table">
46
+ <el-table-column prop="name" label="事件名" width="180" />
47
+ <el-table-column prop="params" label="回调参数" width="250" />
48
+ <el-table-column prop="desc" label="说明" min-width="200" />
49
+ </el-table>
50
+ </div>
51
+ <!-- Methods -->
52
+ <div v-if="methods?.length" class="api-block">
53
+ <div class="api-title">Methods 方法</div>
54
+ <el-table :data="methods" border size="small" class="api-table">
55
+ <el-table-column prop="name" label="方法名" width="180" />
56
+ <el-table-column prop="params" label="参数" width="250" />
57
+ <el-table-column prop="desc" label="说明" min-width="200" />
58
+ </el-table>
59
+ </div>
60
+ <!-- Slots -->
61
+ <div v-if="slots?.length" class="api-block">
62
+ <div class="api-title">Slots 插槽</div>
63
+ <el-table :data="slots" border size="small" class="api-table">
64
+ <el-table-column prop="name" label="插槽名" width="180" />
65
+ <el-table-column prop="params" label="作用域参数" width="250" />
66
+ <el-table-column prop="desc" label="说明" min-width="200" />
67
+ </el-table>
68
+ </div>
69
+ </div>
70
+ </el-collapse-transition>
71
+
72
+ <!-- 源码区 -->
73
+ <el-collapse-transition>
74
+ <div v-show="showCode" class="demo-code-section">
75
+ <pre class="code-block"><code>{{ code }}</code></pre>
76
+ </div>
77
+ </el-collapse-transition>
78
+ </ele-card>
79
+ </template>
80
+
81
+ <script>
82
+ export default { name: 'SohelpDemoBlock' };
83
+ </script>
84
+
85
+ <script setup>
86
+ import { ref } from 'vue';
87
+ import { ElMessage } from 'element-plus';
88
+ import { Document, CopyDocument } from '@element-plus/icons-vue';
89
+
90
+ // <> 图标用 SVG 内联
91
+ const CodeIcon = {
92
+ name: 'CodeIcon',
93
+ render() {
94
+ return h('svg', {
95
+ viewBox: '0 0 1024 1024',
96
+ xmlns: 'http://www.w3.org/2000/svg',
97
+ width: '1em', height: '1em', fill: 'currentColor'
98
+ }, [
99
+ h('path', { d: 'M320 256l-256 256 256 256 64-64-192-192 192-192zM704 256l256 256-256 256-64-64 192-192-192-192z' }),
100
+ h('path', { d: 'M585.2 174.4l59.6 16 -152 568-59.6-16z' })
101
+ ]);
102
+ }
103
+ };
104
+
105
+ import { h } from 'vue';
106
+
107
+ defineProps({
108
+ title: { type: String, default: '' },
109
+ description: { type: String, default: '' },
110
+ code: { type: String, default: '' },
111
+ props: { type: Array, default: () => [] },
112
+ events: { type: Array, default: () => [] },
113
+ methods: { type: Array, default: () => [] },
114
+ slots: { type: Array, default: () => [] }
115
+ });
116
+
117
+ const showCode = ref(false);
118
+ const showApi = ref(false);
119
+
120
+ const copyCode = () => {
121
+ const codeEl = document.querySelector('.sohelp-demo-block .code-block code');
122
+ if (codeEl?.textContent) {
123
+ navigator.clipboard.writeText(codeEl.textContent).then(() => {
124
+ ElMessage.success('代码已复制');
125
+ }).catch(() => {
126
+ ElMessage.warning('复制失败,请手动复制');
127
+ });
128
+ }
129
+ };
130
+ </script>
131
+
132
+ <style lang="scss" scoped>
133
+ .sohelp-demo-block {
134
+ margin-bottom: 16px;
135
+
136
+ .demo-content {
137
+ padding-bottom: 12px;
138
+ }
139
+
140
+ .demo-desc {
141
+ padding: 10px 14px;
142
+ margin-bottom: 12px;
143
+ background: var(--el-color-primary-light-9);
144
+ border-radius: 4px;
145
+ font-size: 13px;
146
+ color: var(--el-text-color-regular);
147
+ line-height: 1.6;
148
+ border-left: 3px solid var(--el-color-primary);
149
+ }
150
+
151
+ .demo-toolbar {
152
+ display: flex;
153
+ justify-content: flex-end;
154
+ align-items: center;
155
+ gap: 2px;
156
+ padding: 8px 0 0;
157
+ border-top: 1px solid var(--el-border-color-lighter);
158
+
159
+ .toolbar-icon {
160
+ padding: 6px;
161
+ font-size: 16px;
162
+ color: var(--el-text-color-secondary);
163
+ cursor: pointer;
164
+ border-radius: 4px;
165
+ transition: all 0.2s;
166
+
167
+ &:hover {
168
+ color: var(--el-color-primary);
169
+ background: var(--el-color-primary-light-9);
170
+ }
171
+
172
+ &.active {
173
+ color: var(--el-color-primary);
174
+ }
175
+ }
176
+ }
177
+
178
+ .demo-api-section {
179
+ padding: 16px 0;
180
+ border-top: 1px dashed var(--el-border-color-lighter);
181
+
182
+ .api-block {
183
+ margin-bottom: 16px;
184
+
185
+ &:last-child {
186
+ margin-bottom: 0;
187
+ }
188
+
189
+ .api-title {
190
+ font-size: 13px;
191
+ font-weight: 600;
192
+ color: var(--el-text-color-primary);
193
+ margin-bottom: 8px;
194
+ padding-left: 8px;
195
+ border-left: 3px solid var(--el-color-primary);
196
+ }
197
+ }
198
+
199
+ .api-table {
200
+ :deep(.el-table__cell) {
201
+ font-size: 12px;
202
+ padding: 5px 0;
203
+ }
204
+ }
205
+ }
206
+
207
+ .demo-code-section {
208
+ border-top: 1px dashed var(--el-border-color-lighter);
209
+
210
+ .code-block {
211
+ margin: 12px 0 0;
212
+ padding: 16px;
213
+ background: #1e1e1e;
214
+ border-radius: 6px;
215
+ overflow-x: auto;
216
+ max-height: 400px;
217
+
218
+ code {
219
+ font-family: 'Fira Code', 'Consolas', 'Courier New', monospace;
220
+ font-size: 13px;
221
+ line-height: 1.6;
222
+ color: #d4d4d4;
223
+ white-space: pre;
224
+ tab-size: 2;
225
+ }
226
+ }
227
+ }
228
+ }
229
+ </style>
@@ -1,37 +1,22 @@
1
- # 字典组件 (Dict)
1
+ # SohelpDict 字典组件
2
2
 
3
- 通用字典组件,支持从缓存中加载字典数据,并以多种形式(下拉、单选、多选、标签、文本)展示。
3
+ 通用字典组件,根据字典编码自动从缓存加载字典数据,支持下拉选择(select)、多选下拉(multipleSelect)、单选(radio)、多选框(checkbox)、标签(tag)和纯文本(text)等多种展示模式。支持字典项自定义颜色和图标。
4
4
 
5
- ## 功能特性
6
-
7
- - **多种展示模式**:支持 Select, Radio, Checkbox, Tag, Text。
8
- - **自动加载**:根据 `code` 自动从字典缓存获取数据。
9
- - **样式定制**:支持字典项配置颜色和图标。
10
-
11
- ## 属性 (Props)
12
-
13
- | 属性名 | 类型 | 默认值 | 说明 |
14
- | :--- | :--- | :--- | :--- |
15
- | modelValue | String/Number/Array | '' | 绑定的值。 |
16
- | code | String | - | 字典编码 (Required)。 |
17
- | type | String | 'select' | 展示类型,可选值:'select', 'radio', 'checkbox', 'tag', 'text', 'multipleSelect'。 |
18
- | disabled | Boolean | false | 是否禁用。 |
19
- | placeholder | String | - | 占位文本。 |
20
- | teleported | Boolean | true | Select 下拉是否插入 body。 |
21
- | autoFocus | Boolean | false | 是否自动获取焦点。 |
22
-
23
- ## 使用示例
5
+ ## 基础用法
24
6
 
25
7
  ```vue
26
8
  <template>
27
- <!-- 下拉选择 -->
9
+ <!-- 下拉选择(默认模式) -->
28
10
  <sohelp-dict v-model="status" code="sys_user_status" />
29
11
 
30
12
  <!-- 单选框 -->
31
13
  <sohelp-dict v-model="gender" code="sys_user_sex" type="radio" />
32
14
 
33
- <!-- 仅展示文本 (用于列表页) -->
15
+ <!-- 纯文本展示(用于列表页) -->
34
16
  <sohelp-dict :modelValue="status" code="sys_user_status" type="text" />
17
+
18
+ <!-- 标签展示 -->
19
+ <sohelp-dict :modelValue="status" code="sys_user_status" type="tag" />
35
20
  </template>
36
21
 
37
22
  <script setup>
@@ -41,3 +26,23 @@ const status = ref('');
41
26
  const gender = ref('');
42
27
  </script>
43
28
  ```
29
+
30
+ ## 属性 (Props)
31
+
32
+ | 属性名 | 类型 | 默认值 | 必填 | 说明 |
33
+ | :--- | :--- | :--- | :--- | :--- |
34
+ | modelValue | String / Number / Array | `''` | 否 | 绑定值(v-model) |
35
+ | code | String | - | 是 | 字典编码,用于从缓存加载对应字典数据 |
36
+ | type | String | - | 否 | 展示类型,可选:`'select'`、`'multipleSelect'`、`'radio'`、`'checkbox'`、`'tag'`、`'text'`;默认为下拉选择 |
37
+ | disabled | Boolean | `false` | 否 | 是否禁用 |
38
+ | placeholder | String | - | 否 | 占位文本 |
39
+ | teleported | Boolean | `true` | 否 | select 下拉菜单是否插入到 body 下 |
40
+ | autoFocus | Boolean | `false` | 否 | 是否自动获取焦点(仅 select 模式生效) |
41
+
42
+ > 同时支持所有 `el-select`、`el-radio-group`、`el-checkbox-group` 等对应模式的原生属性,通过 `v-bind="$attrs"` 透传。
43
+
44
+ ## 事件 (Events)
45
+
46
+ | 事件名 | 回调参数 | 说明 |
47
+ | :--- | :--- | :--- |
48
+ | change | `(value: any)` | 选中值变化时触发(radio、checkbox、select 模式) |
@@ -11,9 +11,9 @@
11
11
  >
12
12
  <div class="sohelp-dict-item">
13
13
  <el-icon v-if="item.icon">
14
- <component :is="ElementPlusIcons[icon]" v-if="ElementPlusIcons[icon]" />
15
- <component :is="EleAdminPlusIcons[icon]" v-else-if="EleAdminPlusIcons[icon]" />
16
- <span :class="icon" v-else></span>
14
+ <component :is="ElementPlusIcons[item.icon]" v-if="ElementPlusIcons[item.icon]" />
15
+ <component :is="EleAdminPlusIcons[item.icon]" v-else-if="EleAdminPlusIcons[item.icon]" />
16
+ <span :class="item.icon" v-else></span>
17
17
  </el-icon>
18
18
 
19
19
  {{ item.label }}</div
@@ -33,9 +33,9 @@
33
33
  >
34
34
  <div class="sohelp-dict-item">
35
35
  <el-icon v-if="item.icon">
36
- <component :is="ElementPlusIcons[icon]" v-if="ElementPlusIcons[icon]" />
37
- <component :is="EleAdminPlusIcons[icon]" v-else-if="EleAdminPlusIcons[icon]" />
38
- <span :class="icon" v-else></span>
36
+ <component :is="ElementPlusIcons[item.icon]" v-if="ElementPlusIcons[item.icon]" />
37
+ <component :is="EleAdminPlusIcons[item.icon]" v-else-if="EleAdminPlusIcons[item.icon]" />
38
+ <span :class="item.icon" v-else></span>
39
39
  </el-icon>
40
40
  {{ item.label }}</div
41
41
  >
@@ -53,9 +53,9 @@
53
53
  <el-radio v-for="item in data.value" :key="item.value" :label="item.value">
54
54
  <div class="sohelp-dict-item">
55
55
  <el-icon v-if="item.icon">
56
- <component :is="ElementPlusIcons[icon]" v-if="ElementPlusIcons[icon]" />
57
- <component :is="EleAdminPlusIcons[icon]" v-else-if="EleAdminPlusIcons[icon]" />
58
- <span :class="icon" v-else></span>
56
+ <component :is="ElementPlusIcons[item.icon]" v-if="ElementPlusIcons[item.icon]" />
57
+ <component :is="EleAdminPlusIcons[item.icon]" v-else-if="EleAdminPlusIcons[item.icon]" />
58
+ <span :class="item.icon" v-else></span>
59
59
  </el-icon>
60
60
  {{ item.label }}</div
61
61
  >
@@ -72,9 +72,9 @@
72
72
  <el-checkbox v-for="item in data.value" :key="item.value" :label="item.value">
73
73
  <div class="sohelp-dict-item">
74
74
  <el-icon v-if="item.icon">
75
- <component :is="ElementPlusIcons[icon]" v-if="ElementPlusIcons[icon]" />
76
- <component :is="EleAdminPlusIcons[icon]" v-else-if="EleAdminPlusIcons[icon]" />
77
- <span :class="icon" v-else></span>
75
+ <component :is="ElementPlusIcons[item.icon]" v-if="ElementPlusIcons[item.icon]" />
76
+ <component :is="EleAdminPlusIcons[item.icon]" v-else-if="EleAdminPlusIcons[item.icon]" />
77
+ <span :class="item.icon" v-else></span>
78
78
  </el-icon>
79
79
  {{ item.label }}</div
80
80
  >
@@ -101,9 +101,9 @@
101
101
  <el-tag v-for="item in valueData" :key="item" :style="getStyle(item)">
102
102
  <div class="sohelp-dict-item">
103
103
  <el-icon v-if="item.icon">
104
- <component :is="ElementPlusIcons[icon]" v-if="ElementPlusIcons[icon]" />
105
- <component :is="EleAdminPlusIcons[icon]" v-else-if="EleAdminPlusIcons[icon]" />
106
- <span :class="icon" v-else></span>
104
+ <component :is="ElementPlusIcons[item.icon]" v-if="ElementPlusIcons[item.icon]" />
105
+ <component :is="EleAdminPlusIcons[item.icon]" v-else-if="EleAdminPlusIcons[item.icon]" />
106
+ <span :class="item.icon" v-else></span>
107
107
  </el-icon>
108
108
 
109
109
  {{ item.label }}</div
@@ -142,7 +142,7 @@
142
142
  type: [String, Number, Array],
143
143
  default: ''
144
144
  });
145
- const emit = defineEmits('change');
145
+ const emit = defineEmits(['change']);
146
146
  const props = defineProps({
147
147
  /** 字典类型 */
148
148
  code: {
@@ -235,7 +235,7 @@
235
235
  const dictValueSet = new Set(dictData.map((d) => d.value));
236
236
  const matchedItems = dictData.filter((d) => values.includes(d.value));
237
237
  const customItems = values.filter((v) => !dictValueSet.has(v)).map((v) => ({ value: v, label: v }));
238
- return [...matchedItems, ...customItems].filter((item) => item.id);
238
+ return [...matchedItems, ...customItems];
239
239
  });
240
240
  </script>
241
241
 
@@ -1,34 +1,13 @@
1
- # 抽屉组件 (Drawer)
1
+ # SohelpDrawer 抽屉
2
2
 
3
- `ele-drawer` 的简单封装,提供便捷的显示/隐藏控制。
3
+ 基于 `ele-drawer` 封装的抽屉组件,提供内容区和底部插槽的统一布局。
4
4
 
5
- ## 属性 (Props)
6
-
7
- | 属性名 | 类型 | 默认值 | 说明 |
8
- | :--- | :--- | :--- | :--- |
9
- | modelValue | Boolean | false | 控制抽屉显示隐藏 (v-model)。 |
10
- | ... | - | - | 支持 `ele-drawer` 的其他属性。 |
11
-
12
- ## 方法 (Exposed Methods)
13
-
14
- | 方法名 | 说明 |
15
- | :--- | :--- |
16
- | show | 显示抽屉。 |
17
- | close | 关闭抽屉。 |
18
-
19
- ## 插槽 (Slots)
20
-
21
- | 插槽名 | 说明 |
22
- | :--- | :--- |
23
- | default | 抽屉主体内容。 |
24
- | footer | 抽屉底部区域。 |
25
-
26
- ## 使用示例
5
+ ## 基础用法
27
6
 
28
7
  ```vue
29
8
  <template>
30
- <sohelp-drawer v-model="visible" title="详情">
31
- <div>内容区域</div>
9
+ <sohelp-drawer v-model="visible" title="抽屉标题" size="40%">
10
+ <p>抽屉内容</p>
32
11
  <template #footer>
33
12
  <el-button @click="visible = false">关闭</el-button>
34
13
  </template>
@@ -40,3 +19,26 @@ import { ref } from 'vue';
40
19
  const visible = ref(false);
41
20
  </script>
42
21
  ```
22
+
23
+ ## 属性 (Props)
24
+
25
+ | 属性名 | 类型 | 默认值 | 必填 | 说明 |
26
+ | --- | --- | --- | --- | --- |
27
+ | modelValue (v-model) | Boolean | `false` | 否 | 控制抽屉显示/隐藏 |
28
+
29
+ > 支持透传 `ele-drawer` 的所有属性,如 `title`、`size`、`direction` 等。
30
+
31
+ ## 插槽 (Slots)
32
+
33
+ | 插槽名 | 说明 |
34
+ | --- | --- |
35
+ | default | 抽屉主内容区域 |
36
+ | footer | 底部操作区域 |
37
+
38
+ ## 公开方法 (Expose)
39
+
40
+ | 方法名 | 说明 |
41
+ | --- | --- |
42
+ | show() | 打开抽屉 |
43
+ | close() | 关闭抽屉 |
44
+ | getValue() | 获取当前抽屉的显示状态 |
@@ -1,37 +1,16 @@
1
- # 下拉卡片 (Drop Card)
1
+ # SohelpDropCard 下拉卡片
2
2
 
3
- 点击按钮后展示下拉卡片的组件,基于 Tooltip 实现,适合用于复杂内容的下拉展示。
3
+ 基于 `ele-tooltip` 封装的下拉卡片组件,点击按钮后弹出包含自定义内容的卡片面板,适用于筛选、操作等场景。
4
4
 
5
- ## 属性 (Props)
6
-
7
- | 属性名 | 类型 | 默认值 | 说明 |
8
- | :--- | :--- | :--- | :--- |
9
- | title | String | - | 按钮显示的标题。 |
10
- | icon | Object/String | - | 按钮图标。 |
11
- | placement | String | 'bottom-end' | 弹出位置。 |
12
- | trigger | String | 'click' | 触发方式。 |
13
- | effect | String | 'light' | Tooltip 主题。 |
14
-
15
- ## 方法 (Exposed Methods)
16
-
17
- | 方法名 | 说明 |
18
- | :--- | :--- |
19
- | close | 关闭下拉卡片。 |
20
-
21
- ## 插槽 (Slots)
22
-
23
- | 插槽名 | 说明 |
24
- | :--- | :--- |
25
- | default | 卡片主体内容。 |
26
- | footer | 卡片底部操作区。 |
27
-
28
- ## 使用示例
5
+ ## 基础用法
29
6
 
30
7
  ```vue
31
8
  <template>
32
- <sohelp-drop-card title="更多筛选" icon="Filter">
9
+ <sohelp-drop-card title="更多筛选" icon="Filter" ref="dropCardRef">
33
10
  <el-form>
34
- <el-form-item label="名称"><el-input /></el-form-item>
11
+ <el-form-item label="名称">
12
+ <el-input />
13
+ </el-form-item>
35
14
  </el-form>
36
15
  <template #footer>
37
16
  <el-button type="primary" size="small">查询</el-button>
@@ -39,3 +18,25 @@
39
18
  </sohelp-drop-card>
40
19
  </template>
41
20
  ```
21
+
22
+ ## 属性 (Props)
23
+
24
+ | 属性名 | 类型 | 默认值 | 必填 | 说明 |
25
+ | --- | --- | --- | --- | --- |
26
+ | title | String | - | 否 | 触发按钮显示的文本 |
27
+ | icon | Object / String | '' | 否 | 触发按钮的图标组件或图标名称 |
28
+ | placement | String | 'bottom-end' | 否 | 弹出卡片的位置,窗口高度不足时自动切换为 'auto' |
29
+ | trigger | String | 'click' | 否 | 触发方式 |
30
+ | effect | String | 'light' | 否 | Tooltip 主题风格 |
31
+ | modelValue | Boolean | - | 否 | 控制显示/隐藏 |
32
+
33
+ ## 插槽 (Slots)
34
+
35
+ | 插槽名 | 说明 |
36
+ | --- | --- |
37
+ | default | 卡片主体内容 |
38
+ | footer | 卡片底部操作区,右对齐显示 |
39
+
40
+ ## 公开方法 (Expose)
41
+
42
+ - `close()` - 关闭下拉卡片
@@ -26,7 +26,6 @@
26
26
  import { computed, ref, onMounted, onBeforeUnmount } from 'vue';
27
27
  const props = defineProps({
28
28
  title: String,
29
- icon: Object,
30
29
  placement: {
31
30
  default: 'bottom-end'
32
31
  },
@@ -1,23 +1,12 @@
1
- # 动态下拉选择 (Dynamic Select)
1
+ # SohelpDynSelect 动态下拉选择器
2
2
 
3
- 支持从 URLPromise 或函数动态加载数据源的下拉选择组件。
3
+ 基于 `sohelp-select` 封装的动态下拉选择组件,支持通过 URL 远程加载数据,也兼容数组、函数、Promise 数据源,并提供只读文本展示模式。
4
4
 
5
- ## 属性 (Props)
6
-
7
- | 属性名 | 类型 | 默认值 | 说明 |
8
- | :--- | :--- | :--- | :--- |
9
- | modelValue | String/Number/Array | - | 绑定的值 (v-model)。 |
10
- | datasource | Array/Function/Promise | - | 数据源 (Required)。 |
11
- | url | String | - | 数据加载 URL (若 datasource 为空时使用)。 |
12
- | labelField | String | - | 显示字段名。 |
13
- | valueField | String | - | 值字段名。 |
14
- | readonly | Boolean | false | 是否只读 (只读模式下显示文本)。 |
15
-
16
- ## 使用示例
5
+ ## 基础用法
17
6
 
18
7
  ```vue
19
8
  <template>
20
- <!-- URL 加载 -->
9
+ <!-- 通过 URL 远程加载 -->
21
10
  <sohelp-dyn-select
22
11
  v-model="userId"
23
12
  url="/api/users"
@@ -25,7 +14,7 @@
25
14
  valueField="id"
26
15
  />
27
16
 
28
- <!-- 从静态数组加载 -->
17
+ <!-- 通过静态数组 -->
29
18
  <sohelp-dyn-select
30
19
  v-model="type"
31
20
  :datasource="[{ label: 'A', value: 1 }, { label: 'B', value: 2 }]"
@@ -33,4 +22,30 @@
33
22
  valueField="value"
34
23
  />
35
24
  </template>
25
+
26
+ <script setup>
27
+ import { ref } from 'vue';
28
+
29
+ const userId = ref('');
30
+ const type = ref('');
31
+ </script>
36
32
  ```
33
+
34
+ ## 属性 (Props)
35
+
36
+ | 属性名 | 类型 | 默认值 | 必填 | 说明 |
37
+ | :--- | :--- | :--- | :--- | :--- |
38
+ | modelValue | String / Number / Array / Object | - | 否 | 绑定值(v-model) |
39
+ | datasource | Array / Function / Promise | `undefined` | 否 | 数据源,优先级高于 url |
40
+ | url | String | `''` | 否 | 远程数据接口地址,当 datasource 未提供时使用 |
41
+ | labelField | String | - | 否 | 选项显示文本对应的字段名 |
42
+ | valueField | String | - | 否 | 选项值对应的字段名 |
43
+ | readonly | Boolean | `false` | 否 | 是否只读模式,只读时仅展示文本 |
44
+
45
+ > 同时支持所有 `sohelp-select` 和 `el-select` 原生属性,通过 `v-bind="$attrs"` 透传。
46
+
47
+ ## 事件 (Events)
48
+
49
+ | 事件名 | 回调参数 | 说明 |
50
+ | :--- | :--- | :--- |
51
+ | update:modelValue | `(value: any)` | 选中值变化时触发 |