vxe-pc-ui 4.1.19 → 4.1.21

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 (259) hide show
  1. package/README.md +83 -2
  2. package/es/anchor/src/anchor-link.js +1 -1
  3. package/es/anchor/src/anchor.js +1 -1
  4. package/es/breadcrumb/src/breadcrumb.js +1 -1
  5. package/es/button/src/button-group.js +4 -1
  6. package/es/button/src/button.js +2 -1
  7. package/es/calendar/src/calendar.js +64 -32
  8. package/es/card/src/card.js +4 -3
  9. package/es/carousel/src/carousel-item.js +13 -3
  10. package/es/carousel/src/carousel.js +16 -8
  11. package/es/checkbox/src/checkbox.js +30 -14
  12. package/es/checkbox/src/group.js +17 -8
  13. package/es/collapse-pane/index.js +1 -1
  14. package/es/countdown/src/countdown.js +17 -8
  15. package/es/date-picker/src/date-picker.js +148 -69
  16. package/es/drawer/src/drawer.js +86 -46
  17. package/es/form/render/index.js +1 -2
  18. package/es/form/src/form-config-item.js +4 -3
  19. package/es/form/src/form-gather.js +5 -3
  20. package/es/form/src/form-item.js +15 -10
  21. package/es/form/src/form.js +11 -8
  22. package/es/form/src/render.js +2 -1
  23. package/es/form/src/util.js +2 -1
  24. package/es/icon/src/icon.js +3 -0
  25. package/es/icon/style.css +1 -1
  26. package/es/icon-picker/src/icon-picker.js +24 -11
  27. package/es/image/src/group.js +4 -1
  28. package/es/image/src/preview.js +1 -1
  29. package/es/input/src/input.js +131 -66
  30. package/es/layout-aside/src/layout-aside.js +1 -1
  31. package/es/list/src/list.js +7 -5
  32. package/es/list-design/src/list-design.js +1 -1
  33. package/es/list-design/src/list-view.js +1 -1
  34. package/es/loading/src/loading.js +4 -1
  35. package/es/menu/src/menu.js +4 -3
  36. package/es/number-input/src/number-input.js +100 -77
  37. package/es/pager/src/pager.js +85 -45
  38. package/es/password-input/src/password-input.js +2 -2
  39. package/es/print/src/page-break.js +11 -2
  40. package/es/print/src/print.js +6 -4
  41. package/es/pulldown/src/pulldown.js +19 -13
  42. package/es/radio/src/button.js +2 -2
  43. package/es/radio/src/group.js +8 -4
  44. package/es/row/src/row.js +1 -1
  45. package/es/select/src/optgroup.js +19 -10
  46. package/es/select/src/option.js +17 -9
  47. package/es/select/src/select.js +64 -41
  48. package/es/select/src/util.js +2 -2
  49. package/es/style.css +1 -1
  50. package/es/style.min.css +1 -1
  51. package/es/tabs/src/tab-pane.js +13 -3
  52. package/es/tabs/src/tabs.js +57 -47
  53. package/es/textarea/src/textarea.js +28 -10
  54. package/es/tooltip/src/tooltip.js +107 -78
  55. package/es/tree/src/tree.js +6 -3
  56. package/es/tree-select/src/tree-select.js +18 -10
  57. package/es/ui/index.js +1 -7
  58. package/es/ui/src/log.js +1 -1
  59. package/es/upload/src/upload.js +5 -5
  60. package/lib/anchor/src/anchor-link.js +1 -1
  61. package/lib/anchor/src/anchor-link.min.js +1 -1
  62. package/lib/anchor/src/anchor.js +1 -1
  63. package/lib/anchor/src/anchor.min.js +1 -1
  64. package/lib/breadcrumb/src/breadcrumb.js +1 -1
  65. package/lib/breadcrumb/src/breadcrumb.min.js +1 -1
  66. package/lib/button/src/button-group.js +4 -1
  67. package/lib/button/src/button-group.min.js +1 -1
  68. package/lib/button/src/button.js +2 -1
  69. package/lib/button/src/button.min.js +1 -1
  70. package/lib/calendar/src/calendar.js +42 -24
  71. package/lib/calendar/src/calendar.min.js +1 -1
  72. package/lib/card/src/card.js +6 -5
  73. package/lib/card/src/card.min.js +1 -1
  74. package/lib/carousel/src/carousel-item.js +16 -3
  75. package/lib/carousel/src/carousel-item.min.js +1 -1
  76. package/lib/carousel/src/carousel.js +18 -8
  77. package/lib/carousel/src/carousel.min.js +1 -1
  78. package/lib/checkbox/src/checkbox.js +16 -12
  79. package/lib/checkbox/src/checkbox.min.js +1 -1
  80. package/lib/checkbox/src/group.js +10 -7
  81. package/lib/checkbox/src/group.min.js +1 -1
  82. package/lib/collapse-pane/index.js +1 -1
  83. package/lib/collapse-pane/index.min.js +1 -1
  84. package/lib/countdown/src/countdown.js +15 -7
  85. package/lib/countdown/src/countdown.min.js +1 -1
  86. package/lib/date-picker/src/date-picker.js +124 -62
  87. package/lib/date-picker/src/date-picker.min.js +1 -1
  88. package/lib/drawer/src/drawer.js +15 -30
  89. package/lib/drawer/src/drawer.min.js +1 -1
  90. package/lib/form/render/index.js +1 -4
  91. package/lib/form/render/index.min.js +1 -1
  92. package/lib/form/src/form-config-item.js +4 -5
  93. package/lib/form/src/form-config-item.min.js +1 -1
  94. package/lib/form/src/form-gather.js +11 -9
  95. package/lib/form/src/form-gather.min.js +1 -1
  96. package/lib/form/src/form-item.js +11 -12
  97. package/lib/form/src/form-item.min.js +1 -1
  98. package/lib/form/src/form.js +7 -7
  99. package/lib/form/src/form.min.js +1 -1
  100. package/lib/form/src/render.js +2 -1
  101. package/lib/form/src/util.js +2 -1
  102. package/lib/icon/src/icon.js +3 -0
  103. package/lib/icon/src/icon.min.js +1 -1
  104. package/lib/icon/style/style.css +1 -1
  105. package/lib/icon/style/style.min.css +1 -1
  106. package/lib/icon-picker/src/icon-picker.js +22 -12
  107. package/lib/icon-picker/src/icon-picker.min.js +1 -1
  108. package/lib/image/src/group.js +4 -1
  109. package/lib/image/src/group.min.js +1 -1
  110. package/lib/image/src/preview.js +1 -1
  111. package/lib/image/src/preview.min.js +1 -1
  112. package/lib/index.umd.js +884 -649
  113. package/lib/index.umd.min.js +1 -1
  114. package/lib/input/src/input.js +79 -51
  115. package/lib/input/src/input.min.js +1 -1
  116. package/lib/layout-aside/src/layout-aside.js +1 -1
  117. package/lib/layout-aside/src/layout-aside.min.js +1 -1
  118. package/lib/list/src/list.js +9 -5
  119. package/lib/list/src/list.min.js +1 -1
  120. package/lib/list-design/src/list-design.js +1 -1
  121. package/lib/list-design/src/list-design.min.js +1 -1
  122. package/lib/list-design/src/list-view.js +1 -1
  123. package/lib/list-design/src/list-view.min.js +1 -1
  124. package/lib/loading/src/loading.js +4 -1
  125. package/lib/loading/src/loading.min.js +1 -1
  126. package/lib/menu/src/menu.js +4 -3
  127. package/lib/menu/src/menu.min.js +1 -1
  128. package/lib/number-input/src/number-input.js +67 -69
  129. package/lib/number-input/src/number-input.min.js +1 -1
  130. package/lib/pager/src/pager.js +40 -39
  131. package/lib/pager/src/pager.min.js +1 -1
  132. package/lib/password-input/src/password-input.js +2 -2
  133. package/lib/print/src/page-break.js +14 -2
  134. package/lib/print/src/page-break.min.js +1 -1
  135. package/lib/print/src/print.js +8 -6
  136. package/lib/print/src/print.min.js +1 -1
  137. package/lib/pulldown/src/pulldown.js +19 -13
  138. package/lib/pulldown/src/pulldown.min.js +1 -1
  139. package/lib/radio/src/button.js +2 -2
  140. package/lib/radio/src/group.js +8 -4
  141. package/lib/radio/src/group.min.js +1 -1
  142. package/lib/row/src/row.js +1 -1
  143. package/lib/row/src/row.min.js +1 -1
  144. package/lib/select/src/optgroup.js +12 -9
  145. package/lib/select/src/optgroup.min.js +1 -1
  146. package/lib/select/src/option.js +9 -7
  147. package/lib/select/src/option.min.js +1 -1
  148. package/lib/select/src/select.js +52 -41
  149. package/lib/select/src/select.min.js +1 -1
  150. package/lib/select/src/util.js +2 -2
  151. package/lib/select/src/util.min.js +1 -1
  152. package/lib/style.css +1 -1
  153. package/lib/style.min.css +1 -1
  154. package/lib/tabs/src/tab-pane.js +16 -3
  155. package/lib/tabs/src/tab-pane.min.js +1 -1
  156. package/lib/tabs/src/tabs.js +62 -50
  157. package/lib/tabs/src/tabs.min.js +1 -1
  158. package/lib/textarea/src/textarea.js +4 -4
  159. package/lib/tooltip/src/tooltip.js +96 -88
  160. package/lib/tooltip/src/tooltip.min.js +1 -1
  161. package/lib/tree/src/tree.js +2 -2
  162. package/lib/tree/src/tree.min.js +1 -1
  163. package/lib/tree-select/src/tree-select.js +13 -8
  164. package/lib/tree-select/src/tree-select.min.js +1 -1
  165. package/lib/ui/index.js +3 -10
  166. package/lib/ui/index.min.js +1 -1
  167. package/lib/ui/src/log.js +1 -1
  168. package/lib/ui/src/log.min.js +1 -1
  169. package/lib/upload/src/upload.js +5 -5
  170. package/lib/upload/src/upload.min.js +1 -1
  171. package/package.json +2 -2
  172. package/packages/anchor/src/anchor-link.ts +2 -2
  173. package/packages/anchor/src/anchor.ts +2 -2
  174. package/packages/breadcrumb/src/breadcrumb.ts +2 -2
  175. package/packages/button/src/button-group.ts +4 -1
  176. package/packages/button/src/button.ts +6 -5
  177. package/packages/calendar/src/calendar.ts +67 -35
  178. package/packages/card/src/card.ts +6 -4
  179. package/packages/carousel/src/carousel-item.ts +19 -4
  180. package/packages/carousel/src/carousel.ts +19 -11
  181. package/packages/checkbox/src/checkbox.ts +34 -15
  182. package/packages/checkbox/src/group.ts +22 -10
  183. package/packages/collapse-pane/index.ts +1 -1
  184. package/packages/countdown/src/countdown.ts +20 -11
  185. package/packages/date-picker/src/date-picker.ts +160 -80
  186. package/packages/drawer/src/drawer.ts +91 -50
  187. package/packages/form/render/index.ts +1 -3
  188. package/packages/form/src/form-config-item.ts +4 -3
  189. package/packages/form/src/form-gather.ts +5 -3
  190. package/packages/form/src/form-item.ts +15 -10
  191. package/packages/form/src/form.ts +12 -10
  192. package/packages/form/src/render.ts +2 -1
  193. package/packages/form/src/util.ts +2 -1
  194. package/packages/icon/src/icon.ts +3 -0
  195. package/packages/icon-picker/src/icon-picker.ts +31 -17
  196. package/packages/image/src/group.ts +4 -1
  197. package/packages/image/src/preview.ts +2 -2
  198. package/packages/input/src/input.ts +138 -75
  199. package/packages/layout-aside/src/layout-aside.ts +2 -2
  200. package/packages/list/src/list.ts +12 -11
  201. package/packages/list-design/src/list-design.ts +2 -2
  202. package/packages/list-design/src/list-view.ts +2 -2
  203. package/packages/loading/src/loading.ts +5 -2
  204. package/packages/menu/src/menu.ts +5 -4
  205. package/packages/number-input/src/number-input.ts +102 -79
  206. package/packages/pager/src/pager.ts +91 -50
  207. package/packages/password-input/src/password-input.ts +2 -2
  208. package/packages/print/src/page-break.ts +18 -4
  209. package/packages/print/src/print.ts +10 -5
  210. package/packages/pulldown/src/pulldown.ts +28 -22
  211. package/packages/radio/src/button.ts +2 -2
  212. package/packages/radio/src/group.ts +9 -5
  213. package/packages/row/src/row.ts +2 -2
  214. package/packages/select/src/optgroup.ts +22 -13
  215. package/packages/select/src/option.ts +18 -10
  216. package/packages/select/src/select.ts +79 -52
  217. package/packages/select/src/util.ts +3 -3
  218. package/packages/tabs/src/tab-pane.ts +20 -5
  219. package/packages/tabs/src/tabs.ts +59 -49
  220. package/packages/textarea/src/textarea.ts +28 -10
  221. package/packages/tooltip/src/tooltip.ts +118 -84
  222. package/packages/tree/src/tree.ts +7 -4
  223. package/packages/tree-select/src/tree-select.ts +25 -16
  224. package/packages/ui/index.ts +0 -7
  225. package/packages/upload/src/upload.ts +6 -6
  226. package/types/components/calendar.d.ts +6 -0
  227. package/types/components/carousel.d.ts +5 -0
  228. package/types/components/countdown.d.ts +4 -0
  229. package/types/components/date-picker.d.ts +23 -5
  230. package/types/components/drawer.d.ts +0 -1
  231. package/types/components/form.d.ts +4 -2
  232. package/types/components/icon-picker.d.ts +4 -0
  233. package/types/components/input.d.ts +9 -1
  234. package/types/components/list.d.ts +1 -0
  235. package/types/components/number-input.d.ts +6 -2
  236. package/types/components/optgroup.d.ts +10 -4
  237. package/types/components/pulldown.d.ts +5 -1
  238. package/types/components/select.d.ts +4 -0
  239. package/types/components/tabs.d.ts +4 -0
  240. package/types/components/toolbar.d.ts +5 -0
  241. package/types/components/tooltip.d.ts +4 -0
  242. package/types/components/tree-select.d.ts +4 -0
  243. package/types/ui/index.d.ts +0 -22
  244. /package/es/{collapse-pane → collapse}/src/collapse-pane.js +0 -0
  245. /package/es/icon/style/{iconfont.1725597808239.ttf → iconfont.1725941866604.ttf} +0 -0
  246. /package/es/icon/style/{iconfont.1725597808239.woff → iconfont.1725941866604.woff} +0 -0
  247. /package/es/icon/style/{iconfont.1725597808239.woff2 → iconfont.1725941866604.woff2} +0 -0
  248. /package/es/{iconfont.1725597808239.ttf → iconfont.1725941866604.ttf} +0 -0
  249. /package/es/{iconfont.1725597808239.woff → iconfont.1725941866604.woff} +0 -0
  250. /package/es/{iconfont.1725597808239.woff2 → iconfont.1725941866604.woff2} +0 -0
  251. /package/lib/{collapse-pane → collapse}/src/collapse-pane.js +0 -0
  252. /package/lib/{collapse-pane → collapse}/src/collapse-pane.min.js +0 -0
  253. /package/lib/icon/style/{iconfont.1725597808239.ttf → iconfont.1725941866604.ttf} +0 -0
  254. /package/lib/icon/style/{iconfont.1725597808239.woff → iconfont.1725941866604.woff} +0 -0
  255. /package/lib/icon/style/{iconfont.1725597808239.woff2 → iconfont.1725941866604.woff2} +0 -0
  256. /package/lib/{iconfont.1725597808239.ttf → iconfont.1725941866604.ttf} +0 -0
  257. /package/lib/{iconfont.1725597808239.woff → iconfont.1725941866604.woff} +0 -0
  258. /package/lib/{iconfont.1725597808239.woff2 → iconfont.1725941866604.woff2} +0 -0
  259. /package/packages/{collapse-pane → collapse}/src/collapse-pane.ts +0 -0
@@ -135,14 +135,17 @@ export default defineComponent({
135
135
  ])
136
136
  }
137
137
 
138
- $xeLoading.renderVN = renderVN
139
-
140
138
  watch(() => props.modelValue, () => {
141
139
  handleInit()
142
140
  })
143
141
 
144
142
  handleInit()
145
143
 
144
+ $xeLoading.renderVN = renderVN
145
+
146
146
  return $xeLoading
147
+ },
148
+ render () {
149
+ return this.renderVN()
147
150
  }
148
151
  })
@@ -157,8 +157,9 @@ export default defineComponent({
157
157
  const handleClickMenu = (evnt: KeyboardEvent, item: VxeMenuDefines.MenuItem) => {
158
158
  const { routerLink, hasChild } = item
159
159
  if (routerLink) {
160
- reactData.activeName = item.itemKey
161
- emit('update:modelValue', item.itemKey)
160
+ const value = item.itemKey
161
+ reactData.activeName = value
162
+ emit('update:modelValue', value)
162
163
  } else {
163
164
  if (hasChild) {
164
165
  handleClickIconCollapse(evnt, item)
@@ -282,8 +283,6 @@ export default defineComponent({
282
283
  ])
283
284
  }
284
285
 
285
- $xeMenu.renderVN = renderVN
286
-
287
286
  const optFlag = ref(0)
288
287
  watch(() => props.options ? props.options.length : -1, () => {
289
288
  optFlag.value++
@@ -313,6 +312,8 @@ export default defineComponent({
313
312
  updateMenuConfig()
314
313
  updateActiveMenu(true)
315
314
 
315
+ $xeMenu.renderVN = renderVN
316
+
316
317
  return $xeMenu
317
318
  },
318
319
  render () {
@@ -6,16 +6,25 @@ import { hasClass, getEventTargetNode } from '../../ui/src/dom'
6
6
  import { getSlotVNs } from '../..//ui/src/vn'
7
7
  import { handleNumber, toFloatValueFixed } from './util'
8
8
 
9
- import type { VxeNumberInputConstructor, VxeNumberInputEmits, NumberInputReactData, NumberInputMethods, VxeNumberInputPropTypes, InputPrivateRef, VxeFormConstructor, VxeFormPrivateMethods, VxeFormDefines } from '../../../types'
9
+ import type { VxeNumberInputConstructor, NumberInputInternalData, VxeNumberInputEmits, NumberInputReactData, NumberInputMethods, VxeNumberInputPropTypes, InputPrivateRef, VxeFormConstructor, VxeFormPrivateMethods, VxeFormDefines, ValueOf } from '../../../types'
10
10
 
11
11
  export default defineComponent({
12
12
  name: 'VxeNumberInput',
13
13
  props: {
14
14
  modelValue: [String, Number] as PropType<VxeNumberInputPropTypes.ModelValue>,
15
- immediate: { type: Boolean as PropType<VxeNumberInputPropTypes.Immediate>, default: true },
15
+ immediate: {
16
+ type: Boolean as PropType<VxeNumberInputPropTypes.Immediate>,
17
+ default: true
18
+ },
16
19
  name: String as PropType<VxeNumberInputPropTypes.Name>,
17
- type: { type: String as PropType<VxeNumberInputPropTypes.Type>, default: 'number' },
18
- clearable: { type: Boolean as PropType<VxeNumberInputPropTypes.Clearable>, default: () => getConfig().numberInput.clearable },
20
+ type: {
21
+ type: String as PropType<VxeNumberInputPropTypes.Type>,
22
+ default: 'number'
23
+ },
24
+ clearable: {
25
+ type: Boolean as PropType<VxeNumberInputPropTypes.Clearable>,
26
+ default: () => getConfig().numberInput.clearable
27
+ },
19
28
  readonly: {
20
29
  type: Boolean as PropType<VxeNumberInputPropTypes.Readonly>,
21
30
  default: null
@@ -33,20 +42,38 @@ export default defineComponent({
33
42
  align: String as PropType<VxeNumberInputPropTypes.Align>,
34
43
  form: String as PropType<VxeNumberInputPropTypes.Form>,
35
44
  className: String as PropType<VxeNumberInputPropTypes.ClassName>,
36
- size: { type: String as PropType<VxeNumberInputPropTypes.Size>, default: () => getConfig().numberInput.size || getConfig().size },
45
+ size: {
46
+ type: String as PropType<VxeNumberInputPropTypes.Size>,
47
+ default: () => getConfig().numberInput.size || getConfig().size
48
+ },
37
49
  multiple: Boolean as PropType<VxeNumberInputPropTypes.Multiple>,
38
50
 
39
51
  // number、integer、float
40
- min: { type: [String, Number] as PropType<VxeNumberInputPropTypes.Min>, default: null },
41
- max: { type: [String, Number] as PropType<VxeNumberInputPropTypes.Max>, default: null },
52
+ min: {
53
+ type: [String, Number] as PropType<VxeNumberInputPropTypes.Min>,
54
+ default: null
55
+ },
56
+ max: {
57
+ type: [String, Number] as PropType<VxeNumberInputPropTypes.Max>,
58
+ default: null
59
+ },
42
60
  step: [String, Number] as PropType<VxeNumberInputPropTypes.Step>,
43
- exponential: { type: Boolean as PropType<VxeNumberInputPropTypes.Exponential>, default: () => getConfig().numberInput.exponential },
61
+ exponential: {
62
+ type: Boolean as PropType<VxeNumberInputPropTypes.Exponential>,
63
+ default: () => getConfig().numberInput.exponential
64
+ },
44
65
 
45
66
  // number、integer、float
46
- controls: { type: Boolean as PropType<VxeNumberInputPropTypes.Controls>, default: () => getConfig().numberInput.controls },
67
+ controls: {
68
+ type: Boolean as PropType<VxeNumberInputPropTypes.Controls>,
69
+ default: () => getConfig().numberInput.controls
70
+ },
47
71
 
48
72
  // float
49
- digits: { type: [String, Number] as PropType<VxeNumberInputPropTypes.Digits>, default: () => getConfig().numberInput.digits },
73
+ digits: {
74
+ type: [String, Number] as PropType<VxeNumberInputPropTypes.Digits>,
75
+ default: () => getConfig().numberInput.digits
76
+ },
50
77
 
51
78
  prefixIcon: String as PropType<VxeNumberInputPropTypes.PrefixIcon>,
52
79
  suffixIcon: String as PropType<VxeNumberInputPropTypes.SuffixIcon>,
@@ -87,6 +114,10 @@ export default defineComponent({
87
114
  inputValue: props.modelValue
88
115
  })
89
116
 
117
+ const internalData: NumberInputInternalData = {
118
+ dnTimeout: undefined
119
+ }
120
+
90
121
  const refElem = ref() as Ref<HTMLDivElement>
91
122
  const refInputTarget = ref() as Ref<HTMLInputElement>
92
123
  const refInputPanel = ref() as Ref<HTMLDivElement>
@@ -101,10 +132,11 @@ export default defineComponent({
101
132
  props,
102
133
  context,
103
134
  reactData,
135
+ internalData,
104
136
  getRefMaps: () => refMaps
105
137
  } as unknown as VxeNumberInputConstructor
106
138
 
107
- let inputMethods = {} as NumberInputMethods
139
+ let numberInputMethods = {} as NumberInputMethods
108
140
 
109
141
  const computeFormReadonly = computed(() => {
110
142
  const { readonly } = props
@@ -128,10 +160,6 @@ export default defineComponent({
128
160
  return disabled
129
161
  })
130
162
 
131
- const computeIsNumType = computed(() => {
132
- return true
133
- })
134
-
135
163
  const computeDigitsValue = computed(() => {
136
164
  return XEUtils.toInteger(props.digits) || 1
137
165
  })
@@ -170,7 +198,7 @@ export default defineComponent({
170
198
  return getI18n('vxe.base.pleaseInput')
171
199
  })
172
200
 
173
- const computeInpMaxlength = computed(() => {
201
+ const computeInpMaxLength = computed(() => {
174
202
  const { maxLength, maxlength } = props
175
203
  // 数值最大长度限制 16 位,包含小数
176
204
  return XEUtils.toNumber(maxLength || maxlength) || 16
@@ -184,11 +212,7 @@ export default defineComponent({
184
212
  const computeNumValue = computed(() => {
185
213
  const { type } = props
186
214
  const { inputValue } = reactData
187
- const isNumType = computeIsNumType.value
188
- if (isNumType) {
189
- return type === 'integer' ? XEUtils.toInteger(handleNumber(inputValue)) : XEUtils.toNumber(handleNumber(inputValue))
190
- }
191
- return 0
215
+ return type === 'integer' ? XEUtils.toInteger(handleNumber(inputValue)) : XEUtils.toNumber(handleNumber(inputValue))
192
216
  })
193
217
 
194
218
  const computeNumLabel = computed(() => {
@@ -199,10 +223,9 @@ export default defineComponent({
199
223
  const computeIsDisabledSubtractNumber = computed(() => {
200
224
  const { min } = props
201
225
  const { inputValue } = reactData
202
- const isNumType = computeIsNumType.value
203
226
  const numValue = computeNumValue.value
204
227
  // 当有值时再进行判断
205
- if ((inputValue || inputValue === 0) && isNumType && min !== null) {
228
+ if ((inputValue || inputValue === 0) && min !== null) {
206
229
  return numValue <= XEUtils.toNumber(min)
207
230
  }
208
231
  return false
@@ -211,10 +234,9 @@ export default defineComponent({
211
234
  const computeIsDisabledAddNumber = computed(() => {
212
235
  const { max } = props
213
236
  const { inputValue } = reactData
214
- const isNumType = computeIsNumType.value
215
237
  const numValue = computeNumValue.value
216
238
  // 当有值时再进行判断
217
- if ((inputValue || inputValue === 0) && isNumType && max !== null) {
239
+ if ((inputValue || inputValue === 0) && max !== null) {
218
240
  return numValue >= XEUtils.toNumber(max)
219
241
  }
220
242
  return false
@@ -222,29 +244,30 @@ export default defineComponent({
222
244
 
223
245
  const getNumberValue = (val: any) => {
224
246
  const { type, exponential } = props
225
- const inpMaxlength = computeInpMaxlength.value
247
+ const inpMaxLength = computeInpMaxLength.value
226
248
  const digitsValue = computeDigitsValue.value
227
249
  const restVal = (type === 'float' ? toFloatValueFixed(val, digitsValue) : XEUtils.toValueString(val))
228
250
  if (exponential && (val === restVal || XEUtils.toValueString(val).toLowerCase() === XEUtils.toNumber(restVal).toExponential())) {
229
251
  return val
230
252
  }
231
- return restVal.slice(0, inpMaxlength)
253
+ return restVal.slice(0, inpMaxLength)
232
254
  }
233
255
 
234
256
  const triggerEvent = (evnt: Event & { type: 'input' | 'change' | 'keydown' | 'keyup' | 'wheel' | 'click' | 'focus' | 'blur' }) => {
235
257
  const { inputValue } = reactData
236
- inputMethods.dispatchEvent(evnt.type, { value: inputValue }, evnt)
258
+ numberInputMethods.dispatchEvent(evnt.type, { value: inputValue }, evnt)
237
259
  }
238
260
 
239
- const emitModel = (value: number | null, inputValue: string, evnt: Event | { type: string }) => {
261
+ const handleChange = (val: number | null, inputValue: string, evnt: Event | { type: string }) => {
262
+ const value = val ? Number(val) : null
240
263
  const isChange = Number(value) !== props.modelValue
241
264
  if (isChange) {
242
265
  reactData.inputValue = inputValue || ''
243
- emit('update:modelValue', value ? Number(value) : null)
266
+ emit('update:modelValue', value)
244
267
  }
245
- inputMethods.dispatchEvent('input', { value }, evnt as Event)
268
+ numberInputMethods.dispatchEvent('input', { value }, evnt as Event)
246
269
  if (isChange) {
247
- inputMethods.dispatchEvent('change', { value }, evnt as Event)
270
+ numberInputMethods.dispatchEvent('change', { value }, evnt as Event)
248
271
  // 自动更新校验状态
249
272
  if ($xeForm && formItemInfo) {
250
273
  $xeForm.triggerItemEvent(evnt, formItemInfo.itemConfig.field, value)
@@ -257,9 +280,9 @@ export default defineComponent({
257
280
  const value = inputValue ? XEUtils.toNumber(inputValue) : null
258
281
  reactData.inputValue = inputValue
259
282
  if (inpImmediate) {
260
- emitModel(value, inputValue, evnt)
283
+ handleChange(value, inputValue, evnt)
261
284
  } else {
262
- inputMethods.dispatchEvent('input', { value }, evnt)
285
+ numberInputMethods.dispatchEvent('input', { value }, evnt)
263
286
  }
264
287
  }
265
288
 
@@ -285,21 +308,21 @@ export default defineComponent({
285
308
  const isDisabled = computeIsDisabled.value
286
309
  if (!isDisabled) {
287
310
  const { inputValue } = reactData
288
- inputMethods.dispatchEvent('prefix-click', { value: inputValue }, evnt)
311
+ numberInputMethods.dispatchEvent('prefix-click', { value: inputValue }, evnt)
289
312
  }
290
313
  }
291
314
 
292
315
  const clearValueEvent = (evnt: Event, value: VxeNumberInputPropTypes.ModelValue) => {
293
316
  focus()
294
- emitModel(null, '', evnt)
295
- inputMethods.dispatchEvent('clear', { value }, evnt)
317
+ handleChange(null, '', evnt)
318
+ numberInputMethods.dispatchEvent('clear', { value }, evnt)
296
319
  }
297
320
 
298
321
  const clickSuffixEvent = (evnt: Event) => {
299
322
  const isDisabled = computeIsDisabled.value
300
323
  if (!isDisabled) {
301
324
  const { inputValue } = reactData
302
- inputMethods.dispatchEvent('suffix-click', { value: inputValue }, evnt)
325
+ numberInputMethods.dispatchEvent('suffix-click', { value: inputValue }, evnt)
303
326
  }
304
327
  }
305
328
 
@@ -319,7 +342,7 @@ export default defineComponent({
319
342
  validValue = Number(textValue)
320
343
  }
321
344
  if (inputValue !== validValue) {
322
- emitModel(validValue, textValue, { type: 'init' })
345
+ handleChange(validValue, textValue, { type: 'init' })
323
346
  }
324
347
  }
325
348
  }
@@ -352,7 +375,7 @@ export default defineComponent({
352
375
  }
353
376
  }
354
377
  const inpValue = getNumberValue(inpNumVal)
355
- emitModel(inpValue === null ? null : Number(inpValue), inpValue, { type: 'check' })
378
+ handleChange(inpValue === null ? null : Number(inpValue), inpValue, { type: 'check' })
356
379
  }
357
380
  }
358
381
  }
@@ -362,11 +385,11 @@ export default defineComponent({
362
385
  const inpImmediate = computeInpImmediate.value
363
386
  const value = inputValue ? Number(inputValue) : null
364
387
  if (!inpImmediate) {
365
- emitModel(value, `${inputValue || ''}`, evnt)
388
+ handleChange(value, `${inputValue || ''}`, evnt)
366
389
  }
367
390
  afterCheckValue()
368
391
  reactData.isActivated = false
369
- inputMethods.dispatchEvent('blur', { value }, evnt)
392
+ numberInputMethods.dispatchEvent('blur', { value }, evnt)
370
393
  }
371
394
 
372
395
  // 数值
@@ -387,21 +410,19 @@ export default defineComponent({
387
410
  emitInputEvent(getNumberValue(restNum), evnt as (Event & { type: 'input' }))
388
411
  }
389
412
 
390
- let downbumTimeout: number
391
-
392
413
  const numberNextEvent = (evnt: Event) => {
393
414
  const isDisabled = computeIsDisabled.value
394
415
  const formReadonly = computeFormReadonly.value
395
416
  const isDisabledSubtractNumber = computeIsDisabledSubtractNumber.value
396
- clearTimeout(downbumTimeout)
417
+ numberStopDown()
397
418
  if (!isDisabled && !formReadonly && !isDisabledSubtractNumber) {
398
419
  numberChange(false, evnt)
399
420
  }
400
- inputMethods.dispatchEvent('next-number', {}, evnt)
421
+ numberInputMethods.dispatchEvent('next-number', {}, evnt)
401
422
  }
402
423
 
403
424
  const numberDownNextEvent = (evnt: Event) => {
404
- downbumTimeout = window.setTimeout(() => {
425
+ internalData.dnTimeout = window.setTimeout(() => {
405
426
  numberNextEvent(evnt)
406
427
  numberDownNextEvent(evnt)
407
428
  }, 60)
@@ -411,11 +432,11 @@ export default defineComponent({
411
432
  const isDisabled = computeIsDisabled.value
412
433
  const formReadonly = computeFormReadonly.value
413
434
  const isDisabledAddNumber = computeIsDisabledAddNumber.value
414
- clearTimeout(downbumTimeout)
435
+ numberStopDown()
415
436
  if (!isDisabled && !formReadonly && !isDisabledAddNumber) {
416
437
  numberChange(true, evnt)
417
438
  }
418
- inputMethods.dispatchEvent('prev-number', {}, evnt)
439
+ numberInputMethods.dispatchEvent('prev-number', {}, evnt)
419
440
  }
420
441
 
421
442
  const numberKeydownEvent = (evnt: KeyboardEvent) => {
@@ -433,24 +454,21 @@ export default defineComponent({
433
454
 
434
455
  const keydownEvent = (evnt: KeyboardEvent & { type: 'keydown' }) => {
435
456
  const { exponential, controls } = props
436
- const isNumType = computeIsNumType.value
437
- if (isNumType) {
438
- const isCtrlKey = evnt.ctrlKey
439
- const isShiftKey = evnt.shiftKey
440
- const isAltKey = evnt.altKey
441
- const keyCode = evnt.keyCode
442
- const isEsc = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ESCAPE)
443
- const isUpArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_UP)
444
- const isDwArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_DOWN)
445
- if (!isCtrlKey && !isShiftKey && !isAltKey && (globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.SPACEBAR) || ((!exponential || keyCode !== 69) && (keyCode >= 65 && keyCode <= 90)) || (keyCode >= 186 && keyCode <= 188) || keyCode >= 191)) {
446
- evnt.preventDefault()
447
- }
448
- if (isEsc) {
449
- afterCheckValue()
450
- } else if (isUpArrow || isDwArrow) {
451
- if (controls) {
452
- numberKeydownEvent(evnt)
453
- }
457
+ const isCtrlKey = evnt.ctrlKey
458
+ const isShiftKey = evnt.shiftKey
459
+ const isAltKey = evnt.altKey
460
+ const keyCode = evnt.keyCode
461
+ const isEsc = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ESCAPE)
462
+ const isUpArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_UP)
463
+ const isDwArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_DOWN)
464
+ if (!isCtrlKey && !isShiftKey && !isAltKey && (globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.SPACEBAR) || ((!exponential || keyCode !== 69) && (keyCode >= 65 && keyCode <= 90)) || (keyCode >= 186 && keyCode <= 188) || keyCode >= 191)) {
465
+ evnt.preventDefault()
466
+ }
467
+ if (isEsc) {
468
+ afterCheckValue()
469
+ } else if (isUpArrow || isDwArrow) {
470
+ if (controls) {
471
+ numberKeydownEvent(evnt)
454
472
  }
455
473
  }
456
474
  triggerEvent(evnt)
@@ -463,11 +481,15 @@ export default defineComponent({
463
481
  // 数值
464
482
 
465
483
  const numberStopDown = () => {
466
- clearTimeout(downbumTimeout)
484
+ const { dnTimeout } = internalData
485
+ if (dnTimeout) {
486
+ clearTimeout(dnTimeout)
487
+ internalData.dnTimeout = undefined
488
+ }
467
489
  }
468
490
 
469
491
  const numberDownPrevEvent = (evnt: Event) => {
470
- downbumTimeout = window.setTimeout(() => {
492
+ internalData.dnTimeout = window.setTimeout(() => {
471
493
  numberPrevEvent(evnt)
472
494
  numberDownPrevEvent(evnt)
473
495
  }, 60)
@@ -482,7 +504,7 @@ export default defineComponent({
482
504
  } else {
483
505
  numberNextEvent(evnt)
484
506
  }
485
- downbumTimeout = window.setTimeout(() => {
507
+ internalData.dnTimeout = window.setTimeout(() => {
486
508
  if (isPrevNumber) {
487
509
  numberDownPrevEvent(evnt)
488
510
  } else {
@@ -496,8 +518,7 @@ export default defineComponent({
496
518
  type: 'wheel';
497
519
  wheelDelta: number;
498
520
  }) => {
499
- const isNumType = computeIsNumType.value
500
- if (isNumType && props.controls) {
521
+ if (props.controls) {
501
522
  if (reactData.isActivated) {
502
523
  const delta = evnt.deltaY
503
524
  if (delta > 0) {
@@ -661,10 +682,12 @@ export default defineComponent({
661
682
  return createCommentVNode()
662
683
  }
663
684
 
664
- inputMethods = {
665
- dispatchEvent (type, params, evnt) {
666
- emit(type, createEvent(evnt, { $input: $xeNumberInput }, params))
667
- },
685
+ const dispatchEvent = (type: ValueOf<VxeNumberInputEmits>, params: Record<string, any>, evnt: Event | null) => {
686
+ emit(type, createEvent(evnt, { $numberInput: $xeNumberInput }, params))
687
+ }
688
+
689
+ numberInputMethods = {
690
+ dispatchEvent,
668
691
 
669
692
  focus () {
670
693
  const inputElem = refInputTarget.value
@@ -686,7 +709,7 @@ export default defineComponent({
686
709
  }
687
710
  }
688
711
 
689
- Object.assign($xeNumberInput, inputMethods)
712
+ Object.assign($xeNumberInput, numberInputMethods)
690
713
 
691
714
  const renderVN = () => {
692
715
  const { className, controls, type, align, name, autocomplete, autoComplete } = props
@@ -702,7 +725,7 @@ export default defineComponent({
702
725
  }, numLabel)
703
726
  }
704
727
  const inputReadonly = computeInputReadonly.value
705
- const inpMaxlength = computeInpMaxlength.value
728
+ const inpMaxLength = computeInpMaxLength.value
706
729
  const inpPlaceholder = computeInpPlaceholder.value
707
730
  const isClearable = computeIsClearable.value
708
731
  const prefix = renderPrefixIcon()
@@ -732,7 +755,7 @@ export default defineComponent({
732
755
  name,
733
756
  type: 'text',
734
757
  placeholder: inpPlaceholder,
735
- maxlength: inpMaxlength,
758
+ maxlength: inpMaxLength,
736
759
  readonly: inputReadonly,
737
760
  disabled: isDisabled,
738
761
  autocomplete: autoComplete || autocomplete,
@@ -5,39 +5,78 @@ import { errLog } from '../../ui/src/log'
5
5
  import VxeSelectComponent from '../../select/src/select'
6
6
  import VxeInputComponent from '../../input/src/input'
7
7
 
8
- import type { VxePagerPropTypes, VxePagerConstructor, VxePagerEmits, VxeSelectEvents, PagerPrivateRef, PagerMethods, PagerPrivateMethods, VxePagerPrivateMethods, PagerReactData, VxeGridConstructor, VxeGridPrivateMethods, VxeInputEvents } from '../../../types'
8
+ import type { VxePagerPropTypes, VxePagerConstructor, VxePagerEmits, VxeSelectEvents, ValueOf, PagerPrivateRef, PagerMethods, PagerPrivateMethods, VxePagerPrivateMethods, PagerReactData, VxeGridConstructor, VxeGridPrivateMethods, VxeInputEvents } from '../../../types'
9
9
 
10
10
  export default defineComponent({
11
11
  name: 'VxePager',
12
12
  props: {
13
- size: { type: String as PropType<VxePagerPropTypes.Size>, default: () => getConfig().pager.size || getConfig().size },
13
+ size: {
14
+ type: String as PropType<VxePagerPropTypes.Size>,
15
+ default: () => getConfig().pager.size || getConfig().size
16
+ },
14
17
  // 自定义布局
15
- layouts: { type: Array as PropType<VxePagerPropTypes.Layouts>, default: () => getConfig().pager.layouts || ['PrevJump', 'PrevPage', 'Jump', 'PageCount', 'NextPage', 'NextJump', 'Sizes', 'Total'] },
18
+ layouts: {
19
+ type: Array as PropType<VxePagerPropTypes.Layouts>,
20
+ default: () => getConfig().pager.layouts || ['PrevJump', 'PrevPage', 'Jump', 'PageCount', 'NextPage', 'NextJump', 'Sizes', 'Total']
21
+ },
16
22
  // 当前页
17
- currentPage: { type: Number as PropType<VxePagerPropTypes.CurrentPage>, default: 1 },
23
+ currentPage: {
24
+ type: Number as PropType<VxePagerPropTypes.CurrentPage>,
25
+ default: 1
26
+ },
18
27
  // 加载中
19
28
  loading: Boolean as PropType<VxePagerPropTypes.Loading>,
20
29
  // 每页大小
21
- pageSize: { type: Number as PropType<VxePagerPropTypes.PageSize>, default: () => getConfig().pager.pageSize || 10 },
30
+ pageSize: {
31
+ type: Number as PropType<VxePagerPropTypes.PageSize>,
32
+ default: () => getConfig().pager.pageSize || 10
33
+ },
22
34
  // 总条数
23
35
  total: { type: Number as PropType<VxePagerPropTypes.Total>, default: 0 },
24
36
  // 显示页码按钮的数量
25
- pagerCount: { type: Number as PropType<VxePagerPropTypes.PagerCount>, default: () => getConfig().pager.pagerCount || 7 },
37
+ pagerCount: {
38
+ type: Number as PropType<VxePagerPropTypes.PagerCount>,
39
+ default: () => getConfig().pager.pagerCount || 7
40
+ },
26
41
  // 每页大小选项列表
27
- pageSizes: { type: Array as PropType<VxePagerPropTypes.PageSizes>, default: () => getConfig().pager.pageSizes || [10, 15, 20, 50, 100] },
42
+ pageSizes: {
43
+ type: Array as PropType<VxePagerPropTypes.PageSizes>,
44
+ default: () => getConfig().pager.pageSizes || [10, 15, 20, 50, 100]
45
+ },
28
46
  // 列对其方式
29
- align: { type: String as PropType<VxePagerPropTypes.Align>, default: () => getConfig().pager.align },
47
+ align: {
48
+ type: String as PropType<VxePagerPropTypes.Align>,
49
+ default: () => getConfig().pager.align
50
+ },
30
51
  // 带边框
31
- border: { type: Boolean as PropType<VxePagerPropTypes.Border>, default: () => getConfig().pager.border },
52
+ border: {
53
+ type: Boolean as PropType<VxePagerPropTypes.Border>,
54
+ default: () => getConfig().pager.border
55
+ },
32
56
  // 带背景颜色
33
- background: { type: Boolean as PropType<VxePagerPropTypes.Background>, default: () => getConfig().pager.background },
57
+ background: {
58
+ type: Boolean as PropType<VxePagerPropTypes.Background>,
59
+ default: () => getConfig().pager.background
60
+ },
34
61
  // 配套的样式
35
- perfect: { type: Boolean as PropType<VxePagerPropTypes.Perfect>, default: () => getConfig().pager.perfect },
62
+ perfect: {
63
+ type: Boolean as PropType<VxePagerPropTypes.Perfect>,
64
+ default: () => getConfig().pager.perfect
65
+ },
36
66
  // 当只有一页时隐藏
37
- autoHidden: { type: Boolean as PropType<VxePagerPropTypes.AutoHidden>, default: () => getConfig().pager.autoHidden },
38
- transfer: { type: Boolean as PropType<VxePagerPropTypes.Transfer>, default: () => getConfig().pager.transfer },
67
+ autoHidden: {
68
+ type: Boolean as PropType<VxePagerPropTypes.AutoHidden>,
69
+ default: () => getConfig().pager.autoHidden
70
+ },
71
+ transfer: {
72
+ type: Boolean as PropType<VxePagerPropTypes.Transfer>,
73
+ default: () => getConfig().pager.transfer
74
+ },
39
75
  className: [String, Function] as PropType<VxePagerPropTypes.ClassName>,
40
- pageSizePlacement: { type: String as PropType<VxePagerPropTypes.PageSizePlacement>, default: () => getConfig().pager.pageSizePlacement },
76
+ pageSizePlacement: {
77
+ type: String as PropType<VxePagerPropTypes.PageSizePlacement>,
78
+ default: () => getConfig().pager.pageSizePlacement
79
+ },
41
80
  // 自定义图标
42
81
  iconPrevPage: String as PropType<VxePagerPropTypes.IconPrevPage>,
43
82
  iconJumpPrev: String as PropType<VxePagerPropTypes.IconJumpPrev>,
@@ -71,6 +110,37 @@ export default defineComponent({
71
110
  refElem
72
111
  }
73
112
 
113
+ const computePageCount = computed(() => {
114
+ return getPageCount(props.total, props.pageSize)
115
+ })
116
+
117
+ const computeNumList = computed(() => {
118
+ const { pagerCount } = props
119
+ const pageCount = computePageCount.value
120
+ const len = pageCount > pagerCount ? pagerCount - 2 : pagerCount
121
+ const rest = []
122
+ for (let index = 0; index < len; index++) {
123
+ rest.push(index)
124
+ }
125
+ return rest
126
+ })
127
+
128
+ const computeOffsetNumber = computed(() => {
129
+ return Math.floor((props.pagerCount - 2) / 2)
130
+ })
131
+
132
+ const computeSizeList = computed(() => {
133
+ return props.pageSizes.map((item) => {
134
+ if (XEUtils.isNumber(item)) {
135
+ return {
136
+ value: item,
137
+ label: `${getI18n('vxe.pager.pagesize', [item])}`
138
+ }
139
+ }
140
+ return { value: '', label: '', ...item }
141
+ })
142
+ })
143
+
74
144
  const $xePager = {
75
145
  xID,
76
146
  props,
@@ -85,10 +155,6 @@ export default defineComponent({
85
155
  return Math.max(Math.ceil(total / size), 1)
86
156
  }
87
157
 
88
- const computePageCount = computed(() => {
89
- return getPageCount(props.total, props.pageSize)
90
- })
91
-
92
158
  const jumpPageEvent = (evnt: Event, currentPage: number) => {
93
159
  emit('update:currentPage', currentPage)
94
160
  if (evnt && currentPage !== props.currentPage) {
@@ -115,33 +181,6 @@ export default defineComponent({
115
181
  changeCurrentPage(current, $event)
116
182
  }
117
183
 
118
- const computeNumList = computed(() => {
119
- const { pagerCount } = props
120
- const pageCount = computePageCount.value
121
- const len = pageCount > pagerCount ? pagerCount - 2 : pagerCount
122
- const rest = []
123
- for (let index = 0; index < len; index++) {
124
- rest.push(index)
125
- }
126
- return rest
127
- })
128
-
129
- const computeOffsetNumber = computed(() => {
130
- return Math.floor((props.pagerCount - 2) / 2)
131
- })
132
-
133
- const computeSizeList = computed(() => {
134
- return props.pageSizes.map((item) => {
135
- if (XEUtils.isNumber(item)) {
136
- return {
137
- value: item,
138
- label: `${getI18n('vxe.pager.pagesize', [item])}`
139
- }
140
- }
141
- return { value: '', label: '', ...item }
142
- })
143
- })
144
-
145
184
  const handleHomePage = (evnt?: Event) => {
146
185
  const { currentPage } = props
147
186
  if (currentPage > 1) {
@@ -345,7 +384,7 @@ export default defineComponent({
345
384
  class: 'vxe-pager--num-btn',
346
385
  type: 'button',
347
386
  onClick: (evnt: Event) => jumpPageEvent(evnt, 1)
348
- }, 1),
387
+ }, '1'),
349
388
  renderPrevJump('span')
350
389
  )
351
390
  }
@@ -360,7 +399,7 @@ export default defineComponent({
360
399
  }],
361
400
  type: 'button',
362
401
  onClick: (evnt: Event) => jumpPageEvent(evnt, number)
363
- }, number)
402
+ }, `${number}`)
364
403
  )
365
404
  }
366
405
  })
@@ -456,10 +495,12 @@ export default defineComponent({
456
495
  }, getI18n('vxe.pager.total', [props.total]))
457
496
  }
458
497
 
498
+ const dispatchEvent = (type: ValueOf<VxePagerEmits>, params: Record<string, any>, evnt: Event | null) => {
499
+ emit(type, createEvent(evnt, { $pager: $xePager }, params))
500
+ }
501
+
459
502
  pagerMethods = {
460
- dispatchEvent (type, params, evnt) {
461
- emit(type, createEvent(evnt, { $pager: $xePager }, params))
462
- },
503
+ dispatchEvent,
463
504
  homePage () {
464
505
  handleHomePage()
465
506
  return nextTick()