resolver-egretimp-plus 0.1.113 → 0.1.115

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 (219) hide show
  1. package/dist/h5/index.js +1 -1
  2. package/dist/theme/element/index.css +1 -1
  3. package/dist/theme/element/src/components/common.scss +4 -0
  4. package/dist/theme/element/src/components/text.scss +17 -0
  5. package/dist/web/index.js +2 -2
  6. package/package.json +1 -1
  7. package/src/analysisComponent.jsx +2 -1
  8. package/src/components/helper/table.jsx +26 -23
  9. package/src/components/packages-H5/CustomComponentCollapseH5.vue +6 -2
  10. package/src/components/packages-web/ElText.jsx +0 -1
  11. package/src/theme/element/components/common.scss +4 -0
  12. package/src/theme/element/components/text.scss +17 -0
  13. package/src-bak/analysisComponent.jsx +343 -0
  14. package/src-bak/api/builtIn.js +10 -0
  15. package/src-bak/bpm/bpmInstance.js +388 -0
  16. package/src-bak/bpm/udc-sdk-esm/cjs/impl/application.js +8 -0
  17. package/src-bak/bpm/udc-sdk-esm/cjs/impl/component.js +97 -0
  18. package/src-bak/bpm/udc-sdk-esm/cjs/impl/datasource.js +88 -0
  19. package/src-bak/bpm/udc-sdk-esm/cjs/impl/iframe/index.js +3 -0
  20. package/src-bak/bpm/udc-sdk-esm/cjs/impl/iframe/udcSdkForIframe/UdcComponent.js +76 -0
  21. package/src-bak/bpm/udc-sdk-esm/cjs/impl/iframe/udcSdkForIframe/index.js +201 -0
  22. package/src-bak/bpm/udc-sdk-esm/cjs/impl/index.js +69 -0
  23. package/src-bak/bpm/udc-sdk-esm/cjs/impl/page.js +56 -0
  24. package/src-bak/bpm/udc-sdk-esm/cjs/impl/utils.js +76 -0
  25. package/src-bak/bpm/udc-sdk-esm/cjs/index.js +46 -0
  26. package/src-bak/bpm/udc-sdk-esm/cjs/utils.js +21 -0
  27. package/src-bak/components/childDialog/index.js +39 -0
  28. package/src-bak/components/childDialog/src/index.vue +185 -0
  29. package/src-bak/components/cmiFormItem/index.js +1 -0
  30. package/src-bak/components/cmiFormItem/src/index.vue +112 -0
  31. package/src-bak/components/confirmInstance-H5/index.js +53 -0
  32. package/src-bak/components/confirmInstance-H5/src/index.vue +54 -0
  33. package/src-bak/components/helper/FormPolyfill.jsx +25 -0
  34. package/src-bak/components/helper/calcTooltip.jsx +134 -0
  35. package/src-bak/components/helper/dock.js +141 -0
  36. package/src-bak/components/helper/eventOrchestration.js +763 -0
  37. package/src-bak/components/helper/resolver.js +163 -0
  38. package/src-bak/components/helper/table.jsx +103 -0
  39. package/src-bak/components/icons/date.vue +33 -0
  40. package/src-bak/components/icons/info.vue +62 -0
  41. package/src-bak/components/icons/loading.vue +19 -0
  42. package/src-bak/components/icons/question-filled.vue +8 -0
  43. package/src-bak/components/loading/index.js +6 -0
  44. package/src-bak/components/loading/loading.js +98 -0
  45. package/src-bak/components/loading/loading.scss +74 -0
  46. package/src-bak/components/loading/loading.vue +89 -0
  47. package/src-bak/components/loadingComponent/LoadingComponent.vue +33 -0
  48. package/src-bak/components/modal/index.js +9 -0
  49. package/src-bak/components/modal/modal.scss +195 -0
  50. package/src-bak/components/modal/modal.vue +201 -0
  51. package/src-bak/components/options/OptionsDefault.vue +47 -0
  52. package/src-bak/components/packages-H5/CmiButton.vue +120 -0
  53. package/src-bak/components/packages-H5/CmiCalendar.vue +152 -0
  54. package/src-bak/components/packages-H5/CmiCell.vue +87 -0
  55. package/src-bak/components/packages-H5/CmiCheckbox.vue +82 -0
  56. package/src-bak/components/packages-H5/CmiDatetimePicker.vue +98 -0
  57. package/src-bak/components/packages-H5/CmiDivider.vue +30 -0
  58. package/src-bak/components/packages-H5/CmiDropdownMenu.vue +58 -0
  59. package/src-bak/components/packages-H5/CmiInput.vue +69 -0
  60. package/src-bak/components/packages-H5/CmiLink.vue +28 -0
  61. package/src-bak/components/packages-H5/CmiPicker.vue +229 -0
  62. package/src-bak/components/packages-H5/CmiRadio.vue +29 -0
  63. package/src-bak/components/packages-H5/CmiSearch.vue +39 -0
  64. package/src-bak/components/packages-H5/CmiSelect.vue +84 -0
  65. package/src-bak/components/packages-H5/CustomComponentCardH5.vue +129 -0
  66. package/src-bak/components/packages-H5/CustomComponentColH5.vue +8 -0
  67. package/src-bak/components/packages-H5/CustomComponentCollapseH5.vue +137 -0
  68. package/src-bak/components/packages-H5/CustomComponentFormLayoutH5.vue +54 -0
  69. package/src-bak/components/packages-H5/CustomComponentTabPaneH5.vue +38 -0
  70. package/src-bak/components/packages-H5/CustomComponentTableH5.vue +352 -0
  71. package/src-bak/components/packages-H5/CustomComponentTabsH5.vue +170 -0
  72. package/src-bak/components/packages-web/CustomComponentCard.vue +40 -0
  73. package/src-bak/components/packages-web/CustomComponentCol.vue +66 -0
  74. package/src-bak/components/packages-web/CustomComponentCollapse.vue +164 -0
  75. package/src-bak/components/packages-web/CustomComponentCycle.vue +95 -0
  76. package/src-bak/components/packages-web/CustomComponentCycleTabPane.vue +155 -0
  77. package/src-bak/components/packages-web/CustomComponentDialog.vue +192 -0
  78. package/src-bak/components/packages-web/CustomComponentEditor.vue +50 -0
  79. package/src-bak/components/packages-web/CustomComponentFileExport.vue +60 -0
  80. package/src-bak/components/packages-web/CustomComponentFileImport.vue +60 -0
  81. package/src-bak/components/packages-web/CustomComponentFormLayout.vue +65 -0
  82. package/src-bak/components/packages-web/CustomComponentGrid.vue +29 -0
  83. package/src-bak/components/packages-web/CustomComponentGridCol.vue +29 -0
  84. package/src-bak/components/packages-web/CustomComponentInputDialog.vue +144 -0
  85. package/src-bak/components/packages-web/CustomComponentNativeTabPane.vue +84 -0
  86. package/src-bak/components/packages-web/CustomComponentPlain.vue +243 -0
  87. package/src-bak/components/packages-web/CustomComponentRow.vue +83 -0
  88. package/src-bak/components/packages-web/CustomComponentSelectEmployees.vue +203 -0
  89. package/src-bak/components/packages-web/CustomComponentSendMail.vue +62 -0
  90. package/src-bak/components/packages-web/CustomComponentSteps.vue +41 -0
  91. package/src-bak/components/packages-web/CustomComponentTabPane.vue +20 -0
  92. package/src-bak/components/packages-web/CustomComponentTable.jsx +813 -0
  93. package/src-bak/components/packages-web/CustomComponentTabs.vue +126 -0
  94. package/src-bak/components/packages-web/CustomComponentTree.vue +28 -0
  95. package/src-bak/components/packages-web/ElButton.vue +146 -0
  96. package/src-bak/components/packages-web/ElCheckbox.vue +97 -0
  97. package/src-bak/components/packages-web/ElDatePicker.vue +93 -0
  98. package/src-bak/components/packages-web/ElInput copy.jsx +393 -0
  99. package/src-bak/components/packages-web/ElInput.jsx +312 -0
  100. package/src-bak/components/packages-web/ElInputNumber.vue +81 -0
  101. package/src-bak/components/packages-web/ElPagination.vue +61 -0
  102. package/src-bak/components/packages-web/ElRadio.vue +47 -0
  103. package/src-bak/components/packages-web/ElSelect.jsx +249 -0
  104. package/src-bak/components/packages-web/ElSelect_bak.vue +155 -0
  105. package/src-bak/components/packages-web/ElText.jsx +187 -0
  106. package/src-bak/components/packages-web/ElTextaa.vue +169 -0
  107. package/src-bak/components/packages-web/ElTimePicker.vue +39 -0
  108. package/src-bak/components/patchComponents-H5.js +46 -0
  109. package/src-bak/components/patchComponents-web.js +46 -0
  110. package/src-bak/components/simpleFormItemPc/index.js +1 -0
  111. package/src-bak/components/simpleFormItemPc/src/index.vue +94 -0
  112. package/src-bak/components/table/index.ts +29 -0
  113. package/src-bak/components/table/src/composables/use-scrollbar.ts +30 -0
  114. package/src-bak/components/table/src/config.ts +256 -0
  115. package/src-bak/components/table/src/filter-panel.vue +260 -0
  116. package/src-bak/components/table/src/h-helper.ts +34 -0
  117. package/src-bak/components/table/src/layout-observer.ts +78 -0
  118. package/src-bak/components/table/src/store/current.ts +85 -0
  119. package/src-bak/components/table/src/store/expand.ts +76 -0
  120. package/src-bak/components/table/src/store/helper.ts +74 -0
  121. package/src-bak/components/table/src/store/index.ts +246 -0
  122. package/src-bak/components/table/src/store/tree.ts +230 -0
  123. package/src-bak/components/table/src/store/watcher.ts +543 -0
  124. package/src-bak/components/table/src/table/defaults.ts +402 -0
  125. package/src-bak/components/table/src/table/key-render-helper.ts +27 -0
  126. package/src-bak/components/table/src/table/style-helper.ts +378 -0
  127. package/src-bak/components/table/src/table/utils-helper.ts +47 -0
  128. package/src-bak/components/table/src/table-body/defaults.ts +52 -0
  129. package/src-bak/components/table/src/table-body/events-helper.ts +203 -0
  130. package/src-bak/components/table/src/table-body/index.ts +119 -0
  131. package/src-bak/components/table/src/table-body/render-helper.ts +283 -0
  132. package/src-bak/components/table/src/table-body/styles-helper.ts +164 -0
  133. package/src-bak/components/table/src/table-column/defaults.ts +237 -0
  134. package/src-bak/components/table/src/table-column/index.ts +202 -0
  135. package/src-bak/components/table/src/table-column/render-helper.ts +214 -0
  136. package/src-bak/components/table/src/table-column/watcher-helper.ts +88 -0
  137. package/src-bak/components/table/src/table-footer/index.ts +128 -0
  138. package/src-bak/components/table/src/table-footer/mapState-helper.ts +33 -0
  139. package/src-bak/components/table/src/table-footer/style-helper.ts +51 -0
  140. package/src-bak/components/table/src/table-header/event-helper.ts +213 -0
  141. package/src-bak/components/table/src/table-header/index.ts +244 -0
  142. package/src-bak/components/table/src/table-header/style.helper.ts +119 -0
  143. package/src-bak/components/table/src/table-header/utils-helper.ts +94 -0
  144. package/src-bak/components/table/src/table-layout.ts +259 -0
  145. package/src-bak/components/table/src/table.vue +389 -0
  146. package/src-bak/components/table/src/tableColumn.ts +3 -0
  147. package/src-bak/components/table/src/tokens.ts +5 -0
  148. package/src-bak/components/table/src/util.ts +521 -0
  149. package/src-bak/components/table/style/css.ts +5 -0
  150. package/src-bak/components/table/style/index.ts +5 -0
  151. package/src-bak/components/tabs/index.js +8 -0
  152. package/src-bak/components/tabs/src/constants.js +23 -0
  153. package/src-bak/components/tabs/src/tab-bar.js +8 -0
  154. package/src-bak/components/tabs/src/tab-bar.vue +92 -0
  155. package/src-bak/components/tabs/src/tab-nav.jsx +424 -0
  156. package/src-bak/components/tabs/src/tab-pane.js +16 -0
  157. package/src-bak/components/tabs/src/tab-pane.vue +80 -0
  158. package/src-bak/components/tabs/src/tabs.jsx +223 -0
  159. package/src-bak/components/tabs/style/css.js +2 -0
  160. package/src-bak/components/tabs/style/index.js +2 -0
  161. package/src-bak/components/thirdPartyFrame/index.js +32 -0
  162. package/src-bak/components/thirdPartyFrame/src/ThirdPartyFrame.vue +125 -0
  163. package/src-bak/enums/index.js +16 -0
  164. package/src-bak/hooks/configLoad.js +45 -0
  165. package/src-bak/hooks/index.js +189 -0
  166. package/src-bak/hooks/mock.js +6960 -0
  167. package/src-bak/hooks/pageConfig.js +127 -0
  168. package/src-bak/index.jsx +440 -0
  169. package/src-bak/renderer.jsx +77 -0
  170. package/src-bak/resolver-H5.vue +88 -0
  171. package/src-bak/resolver-common.vue +129 -0
  172. package/src-bak/resolver-web.vue +91 -0
  173. package/src-bak/rules/eventsSupplement.js +573 -0
  174. package/src-bak/rules/parseCondition.js +378 -0
  175. package/src-bak/rules/ruleUtils.js +273 -0
  176. package/src-bak/rules/rulesDriver.js +118 -0
  177. package/src-bak/rulesImp/events.js +588 -0
  178. package/src-bak/rulesImp/index.js +33 -0
  179. package/src-bak/rulesImp/ruleInstance.js +231 -0
  180. package/src-bak/rulesImp/ruleUtils.js +124 -0
  181. package/src-bak/theme/element/components/button.scss +122 -0
  182. package/src-bak/theme/element/components/card.scss +8 -0
  183. package/src-bak/theme/element/components/checkbox.scss +19 -0
  184. package/src-bak/theme/element/components/collapse.scss +174 -0
  185. package/src-bak/theme/element/components/common.scss +30 -0
  186. package/src-bak/theme/element/components/cycle.scss +0 -0
  187. package/src-bak/theme/element/components/date.scss +13 -0
  188. package/src-bak/theme/element/components/dialog.scss +44 -0
  189. package/src-bak/theme/element/components/form.scss +104 -0
  190. package/src-bak/theme/element/components/index.scss +55 -0
  191. package/src-bak/theme/element/components/input.scss +36 -0
  192. package/src-bak/theme/element/components/message.scss +48 -0
  193. package/src-bak/theme/element/components/pagination.scss +47 -0
  194. package/src-bak/theme/element/components/popper.scss +3 -0
  195. package/src-bak/theme/element/components/radio.scss +40 -0
  196. package/src-bak/theme/element/components/scrollbar.scss +14 -0
  197. package/src-bak/theme/element/components/select.scss +82 -0
  198. package/src-bak/theme/element/components/steps.scss +6 -0
  199. package/{src/components/styles/CustomComponenTable.scss → src-bak/theme/element/components/table.scss} +90 -13
  200. package/src-bak/theme/element/components/tabs.scss +128 -0
  201. package/src-bak/theme/element/components/tag.scss +6 -0
  202. package/{src/components/styles → src-bak/theme/element/components}/text.scss +3 -3
  203. package/src-bak/theme/element/components/textarea.scss +3 -0
  204. package/src-bak/theme/element/components/tree.scss +0 -0
  205. package/src-bak/theme/element/index.scss +55 -0
  206. package/src-bak/utils/cipher.js +141 -0
  207. package/src-bak/utils/common.js +664 -0
  208. package/src-bak/utils/const.js +259 -0
  209. package/src-bak/utils/defaultVal.js +92 -0
  210. package/src-bak/utils/dom.js +36 -0
  211. package/src-bak/utils/format.js +19 -0
  212. package/src-bak/utils/index.js +4 -0
  213. package/src-bak/utils/is.js +74 -0
  214. package/src-bak/utils/loadModule.js +75 -0
  215. package/src-bak/utils/preserveFunc.js +33 -0
  216. package/src-bak/utils/render.jsx +1138 -0
  217. package/src-bak/utils/request.js +136 -0
  218. package/src-bak/utils/respone.js +70 -0
  219. package/src-bak/utils/valid.js +89 -0
@@ -0,0 +1,424 @@
1
+ import {
2
+ computed,
3
+ defineComponent,
4
+ getCurrentInstance,
5
+ inject,
6
+ nextTick,
7
+ onMounted,
8
+ onUpdated,
9
+ ref,
10
+ watch,
11
+ } from 'vue'
12
+ import {
13
+ useDocumentVisibility,
14
+ useResizeObserver,
15
+ useWindowFocus,
16
+ } from '@vueuse/core'
17
+ import {
18
+ buildProps,
19
+ capitalize,
20
+ definePropType,
21
+ mutable,
22
+ throwError,
23
+ } from 'element-plus/es/utils/index.mjs'
24
+ import { EVENT_CODE } from 'element-plus/es/constants/index.mjs'
25
+ import { ElIcon } from 'element-plus/es/components/icon/index.mjs'
26
+ import { ArrowLeft, ArrowRight, Close } from '@element-plus/icons-vue'
27
+ import { useNamespace } from 'element-plus/es/hooks/index.mjs'
28
+ import TabBar from './tab-bar.vue'
29
+ import { tabsRootContextKey } from './constants.js'
30
+
31
+ // import type { CSSProperties, ExtractPropTypes } from 'vue'
32
+ // import type { TabsPaneContext } from './constants'
33
+ // import type { TabPaneName } from './tabs'
34
+
35
+ // interface Scrollable {
36
+ // next?: boolean
37
+ // prev?: number
38
+ // }
39
+
40
+ export const tabNavProps = buildProps({
41
+ panes: {
42
+ type: definePropType(Array),
43
+ default: () => mutable([]),
44
+ },
45
+ currentName: {
46
+ type: [String, Number],
47
+ default: '',
48
+ },
49
+ editable: Boolean,
50
+ type: {
51
+ type: String,
52
+ values: ['card', 'border-card', ''],
53
+ default: '',
54
+ },
55
+ showBar: {
56
+ type: Boolean,
57
+ default: true
58
+ },
59
+ stretch: Boolean,
60
+ })
61
+
62
+ export const tabNavEmits = {
63
+ tabClick: (tab, tabName, ev) =>
64
+ ev instanceof Event,
65
+ tabRemove: (tab, ev) => ev instanceof Event,
66
+ }
67
+
68
+ // export type TabNavProps = ExtractPropTypes<typeof tabNavProps>
69
+ // export type TabNavEmits = typeof tabNavEmits
70
+
71
+ const COMPONENT_NAME = 'ElTabNav'
72
+ const TabNav = defineComponent({
73
+ name: COMPONENT_NAME,
74
+ props: tabNavProps,
75
+ emits: tabNavEmits,
76
+ setup(props, { expose, emit }) {
77
+ const vm = getCurrentInstance()
78
+
79
+ const rootTabs = inject(tabsRootContextKey)
80
+ if (!rootTabs) throwError(COMPONENT_NAME, `<el-tabs><tab-nav /></el-tabs>`)
81
+
82
+ const ns = useNamespace('tabs')
83
+ const visibility = useDocumentVisibility()
84
+ const focused = useWindowFocus()
85
+
86
+ const navScroll$ = ref()
87
+ const nav$ = ref()
88
+ const el$ = ref()
89
+
90
+ const tabBarRef = ref()
91
+
92
+ const scrollable = ref(false)
93
+ const navOffset = ref(0)
94
+ const isFocus = ref(false)
95
+ const focusable = ref(true)
96
+
97
+ const sizeName = computed(() =>
98
+ ['top', 'bottom'].includes(rootTabs.props.tabPosition)
99
+ ? 'width'
100
+ : 'height'
101
+ )
102
+ const navStyle = computed(() => {
103
+ const dir = sizeName.value === 'width' ? 'X' : 'Y'
104
+ return {
105
+ transform: `translate${dir}(-${navOffset.value}px)`,
106
+ }
107
+ })
108
+
109
+ const scrollPrev = () => {
110
+ if (!navScroll$.value) return
111
+
112
+ const containerSize =
113
+ navScroll$.value[`offset${capitalize(sizeName.value)}`]
114
+ const currentOffset = navOffset.value
115
+
116
+ if (!currentOffset) return
117
+
118
+ const newOffset =
119
+ currentOffset > containerSize ? currentOffset - containerSize : 0
120
+
121
+ navOffset.value = newOffset
122
+ }
123
+
124
+ const scrollNext = () => {
125
+ if (!navScroll$.value || !nav$.value) return
126
+
127
+ const navSize = nav$.value[`offset${capitalize(sizeName.value)}`]
128
+ const containerSize =
129
+ navScroll$.value[`offset${capitalize(sizeName.value)}`]
130
+ const currentOffset = navOffset.value
131
+
132
+ if (navSize - currentOffset <= containerSize) return
133
+
134
+ const newOffset =
135
+ navSize - currentOffset > containerSize * 2
136
+ ? currentOffset + containerSize
137
+ : navSize - containerSize
138
+
139
+ navOffset.value = newOffset
140
+ }
141
+
142
+ const scrollToActiveTab = async () => {
143
+ const nav = nav$.value
144
+ if (!scrollable.value || !el$.value || !navScroll$.value || !nav) return
145
+
146
+ await nextTick()
147
+
148
+ const activeTab = el$.value.querySelector('.is-active')
149
+ if (!activeTab) return
150
+
151
+ const navScroll = navScroll$.value
152
+ const isHorizontal = ['top', 'bottom'].includes(
153
+ rootTabs.props.tabPosition
154
+ )
155
+ const activeTabBounding = activeTab.getBoundingClientRect()
156
+ const navScrollBounding = navScroll.getBoundingClientRect()
157
+ const maxOffset = isHorizontal
158
+ ? nav.offsetWidth - navScrollBounding.width
159
+ : nav.offsetHeight - navScrollBounding.height
160
+ const currentOffset = navOffset.value
161
+ let newOffset = currentOffset
162
+
163
+ if (isHorizontal) {
164
+ if (activeTabBounding.left < navScrollBounding.left) {
165
+ newOffset =
166
+ currentOffset - (navScrollBounding.left - activeTabBounding.left)
167
+ }
168
+ if (activeTabBounding.right > navScrollBounding.right) {
169
+ newOffset =
170
+ currentOffset + activeTabBounding.right - navScrollBounding.right
171
+ }
172
+ } else {
173
+ if (activeTabBounding.top < navScrollBounding.top) {
174
+ newOffset =
175
+ currentOffset - (navScrollBounding.top - activeTabBounding.top)
176
+ }
177
+ if (activeTabBounding.bottom > navScrollBounding.bottom) {
178
+ newOffset =
179
+ currentOffset +
180
+ (activeTabBounding.bottom - navScrollBounding.bottom)
181
+ }
182
+ }
183
+ newOffset = Math.max(newOffset, 0)
184
+ navOffset.value = Math.min(newOffset, maxOffset)
185
+ }
186
+
187
+ const update = () => {
188
+ if (!nav$.value || !navScroll$.value) return
189
+
190
+ props.stretch && tabBarRef.value?.update()
191
+
192
+ const navSize = nav$.value[`offset${capitalize(sizeName.value)}`]
193
+ const containerSize =
194
+ navScroll$.value[`offset${capitalize(sizeName.value)}`]
195
+ const currentOffset = navOffset.value
196
+
197
+ if (containerSize < navSize) {
198
+ scrollable.value = scrollable.value || {}
199
+ scrollable.value.prev = currentOffset
200
+ scrollable.value.next = currentOffset + containerSize < navSize
201
+ if (navSize - currentOffset < containerSize) {
202
+ navOffset.value = navSize - containerSize
203
+ }
204
+ } else {
205
+ scrollable.value = false
206
+ if (currentOffset > 0) {
207
+ navOffset.value = 0
208
+ }
209
+ }
210
+ }
211
+
212
+ const changeTab = (e) => {
213
+ const code = e.code
214
+
215
+ const { up, down, left, right } = EVENT_CODE
216
+ if (![up, down, left, right].includes(code)) return
217
+
218
+ // 左右上下键更换tab
219
+ const tabList = Array.from(
220
+ (e.currentTarget).querySelectorAll<HTMLDivElement>(
221
+ '[role=tab]:not(.is-disabled)'
222
+ )
223
+ )
224
+ const currentIndex = tabList.indexOf(e.target)
225
+
226
+ let nextIndex
227
+ if (code === left || code === up) {
228
+ // left
229
+ if (currentIndex === 0) {
230
+ // first
231
+ nextIndex = tabList.length - 1
232
+ } else {
233
+ nextIndex = currentIndex - 1
234
+ }
235
+ } else {
236
+ // right
237
+ if (currentIndex < tabList.length - 1) {
238
+ // not last
239
+ nextIndex = currentIndex + 1
240
+ } else {
241
+ nextIndex = 0
242
+ }
243
+ }
244
+ tabList[nextIndex].focus({ preventScroll: true }) // 改变焦点元素
245
+ tabList[nextIndex].click() // 选中下一个tab
246
+ setFocus()
247
+ }
248
+
249
+ const setFocus = () => {
250
+ if (focusable.value) isFocus.value = true
251
+ }
252
+ const removeFocus = () => (isFocus.value = false)
253
+
254
+ watch(visibility, (visibility) => {
255
+ if (visibility === 'hidden') {
256
+ focusable.value = false
257
+ } else if (visibility === 'visible') {
258
+ setTimeout(() => (focusable.value = true), 50)
259
+ }
260
+ })
261
+ watch(focused, (focused) => {
262
+ if (focused) {
263
+ setTimeout(() => (focusable.value = true), 50)
264
+ } else {
265
+ focusable.value = false
266
+ }
267
+ })
268
+
269
+ useResizeObserver(el$, update)
270
+
271
+ onMounted(() => setTimeout(() => scrollToActiveTab(), 0))
272
+ onUpdated(() => update())
273
+
274
+ expose({
275
+ scrollToActiveTab,
276
+ removeFocus,
277
+ })
278
+
279
+ watch(
280
+ () => props.panes,
281
+ () => vm.update(),
282
+ { flush: 'post', deep: true }
283
+ )
284
+
285
+ return () => {
286
+ const scrollBtn = scrollable.value
287
+ ? [
288
+ <span
289
+ class={[
290
+ ns.e('nav-prev'),
291
+ ns.is('disabled', !scrollable.value.prev),
292
+ ]}
293
+ onClick={scrollPrev}
294
+ >
295
+ <ElIcon>
296
+ <ArrowLeft />
297
+ </ElIcon>
298
+ </span>,
299
+ <span
300
+ class={[
301
+ ns.e('nav-next'),
302
+ ns.is('disabled', !scrollable.value.next),
303
+ ]}
304
+ onClick={scrollNext}
305
+ >
306
+ <ElIcon>
307
+ <ArrowRight />
308
+ </ElIcon>
309
+ </span>,
310
+ ]
311
+ : null
312
+
313
+ const tabs = props.panes.map((pane, index) => {
314
+ const uid = pane.uid
315
+ const disabled = pane.props.disabled
316
+ const tabName = pane.props.name ?? pane.index ?? `${index}`
317
+ const closable = !disabled && (pane.isClosable || props.editable)
318
+ const hidden = pane.props.hidden
319
+ pane.index = `${index}`
320
+
321
+ const btnClose = closable ? (
322
+ <ElIcon
323
+ class="is-icon-close"
324
+ // `onClick` not exist when generate dts
325
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
326
+ // @ts-ignore
327
+ onClick={(ev) => emit('tabRemove', pane, ev)}
328
+ >
329
+ <Close />
330
+ </ElIcon>
331
+ ) : null
332
+
333
+ const tabLabelContent = pane.slots.label?.() || pane.props.label
334
+ const tabindex = !disabled && pane.active ? 0 : -1
335
+ if (hidden) {
336
+ return null
337
+ }
338
+ return (
339
+ <div
340
+ ref={`tab-${uid}`}
341
+ class={[
342
+ ns.e('item'),
343
+ ns.is(rootTabs.props.tabPosition),
344
+ ns.is('active', pane.active),
345
+ ns.is('disabled', disabled),
346
+ ns.is('closable', closable),
347
+ ns.is('focus', isFocus.value),
348
+ ]}
349
+ style={ hidden ? {display: 'none'}: {}}
350
+ id={`tab-${tabName}`}
351
+ key={`tab-${uid}`}
352
+ aria-controls={`pane-${tabName}`}
353
+ role="tab"
354
+ aria-selected={pane.active}
355
+ tabindex={tabindex}
356
+ onFocus={() => setFocus()}
357
+ onBlur={() => removeFocus()}
358
+ onClick={(ev) => {
359
+ removeFocus()
360
+ emit('tabClick', pane, tabName, ev)
361
+ }}
362
+ onKeydown={(ev) => {
363
+ if (
364
+ closable &&
365
+ (ev.code === EVENT_CODE.delete ||
366
+ ev.code === EVENT_CODE.backspace)
367
+ ) {
368
+ emit('tabRemove', pane, ev)
369
+ }
370
+ }}
371
+ >
372
+ <div title={tabLabelContent} class='tabs__item-wrap'>
373
+ {...[tabLabelContent, btnClose]}
374
+ </div>
375
+ </div>
376
+ )
377
+ })
378
+
379
+ return (
380
+ <div
381
+ ref={el$}
382
+ class={[
383
+ ns.e('nav-wrap'),
384
+ ns.is('scrollable', !!scrollable.value),
385
+ ns.is(rootTabs.props.tabPosition),
386
+ !props.showBar ? 'hidden-bar' : ''
387
+ ]}
388
+ >
389
+ {scrollBtn}
390
+ <div class={[ns.e('nav-scroll')]} ref={navScroll$}>
391
+ <div
392
+ class={[
393
+ ns.e('nav'),
394
+ ns.is(rootTabs.props.tabPosition),
395
+ ns.is(
396
+ 'stretch',
397
+ props.stretch &&
398
+ ['top', 'bottom'].includes(rootTabs.props.tabPosition)
399
+ ),
400
+ ]}
401
+ ref={nav$}
402
+ style={navStyle.value}
403
+ role="tablist"
404
+ onKeydown={changeTab}
405
+ >
406
+ {...[
407
+ !props.type && props.showBar ? (
408
+ <TabBar ref={tabBarRef} tabs={[...props.panes]} />
409
+ ) : null,
410
+ tabs,
411
+ ]}
412
+ </div>
413
+ </div>
414
+ </div>
415
+ )
416
+ }
417
+ },
418
+ })
419
+
420
+ // export type TabNavInstance = InstanceType<typeof TabNav> & {
421
+ // scrollToActiveTab: () => Promise<void>
422
+ // removeFocus: () => void
423
+ // }
424
+ export default TabNav
@@ -0,0 +1,16 @@
1
+ import { buildProps } from 'element-plus/es/utils/index.mjs'
2
+
3
+ export const tabPaneProps = buildProps({
4
+ label: {
5
+ type: String,
6
+ default: '',
7
+ },
8
+ name: {
9
+ type: [String, Number],
10
+ },
11
+ closable: Boolean,
12
+ disabled: Boolean,
13
+ lazy: Boolean,
14
+ hidden: Boolean,
15
+ })
16
+
@@ -0,0 +1,80 @@
1
+ <template>
2
+ <div
3
+ v-if="shouldBeRender"
4
+ v-show="active"
5
+ :id="`pane-${paneName}`"
6
+ :class="ns.b()"
7
+ role="tabpanel"
8
+ :aria-hidden="!active"
9
+ :aria-labelledby="`tab-${paneName}`"
10
+ >
11
+ <slot />
12
+ </div>
13
+ </template>
14
+
15
+ <script setup>
16
+ import {
17
+ computed,
18
+ getCurrentInstance,
19
+ inject,
20
+ onMounted,
21
+ onUnmounted,
22
+ reactive,
23
+ ref,
24
+ useSlots,
25
+ watch,
26
+ } from 'vue'
27
+ import { eagerComputed } from '@vueuse/core'
28
+ import { throwError } from 'element-plus/es/utils/index.mjs'
29
+ import { useNamespace } from 'element-plus/es/hooks/index.mjs'
30
+ import { tabsRootContextKey } from './constants.js'
31
+ import { tabPaneProps } from './tab-pane'
32
+
33
+ const COMPONENT_NAME = 'ElTabPane'
34
+ defineOptions({
35
+ name: COMPONENT_NAME,
36
+ })
37
+ const props = defineProps(tabPaneProps)
38
+
39
+ const instance = getCurrentInstance()
40
+ const slots = useSlots()
41
+
42
+ const tabsRoot = inject(tabsRootContextKey)
43
+ if (!tabsRoot)
44
+ throwError(COMPONENT_NAME, 'usage: <el-tabs><el-tab-pane /></el-tabs/>')
45
+
46
+ const ns = useNamespace('tab-pane')
47
+
48
+ const index = ref()
49
+ const isClosable = computed(() => props.closable || tabsRoot.props.closable)
50
+ const active = eagerComputed(
51
+ () => tabsRoot.currentName.value === (props.name ?? index.value)
52
+ )
53
+ const loaded = ref(active.value)
54
+ const paneName = computed(() => props.name ?? index.value)
55
+ const shouldBeRender = eagerComputed(
56
+ () => !props.lazy || loaded.value || active.value
57
+ )
58
+
59
+ watch(active, (val) => {
60
+ if (val) loaded.value = true
61
+ })
62
+
63
+ const pane = reactive({
64
+ uid: instance.uid,
65
+ slots,
66
+ props,
67
+ paneName,
68
+ active,
69
+ index,
70
+ isClosable,
71
+ })
72
+
73
+ onMounted(() => {
74
+ tabsRoot.registerPane(pane)
75
+ })
76
+
77
+ onUnmounted(() => {
78
+ tabsRoot.unregisterPane(pane.uid)
79
+ })
80
+ </script>