foucui 1.0.1 → 1.0.2

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 (234) hide show
  1. package/dist/components/QiuCanvasKit/QiuCanvasEditor.vue.d.ts +3 -1
  2. package/dist/components/QiuCanvasKit/components/DataModulesPanel.vue.d.ts +1 -0
  3. package/dist/components/QiuTable/index.vue.d.ts +12 -12
  4. package/dist/foucui.css +1 -1
  5. package/dist/foucui.js +7476 -7373
  6. package/dist/foucui.umd.cjs +19 -19
  7. package/package.json +23 -13
  8. package/components/QiuAffix/index.vue +0 -186
  9. package/components/QiuAlert/index.vue +0 -208
  10. package/components/QiuAnchor/context.ts +0 -18
  11. package/components/QiuAnchor/index.vue +0 -180
  12. package/components/QiuAnchorLink/index.vue +0 -67
  13. package/components/QiuApp/index.vue +0 -9
  14. package/components/QiuAutocomplete/index.vue +0 -408
  15. package/components/QiuAvatar/index.vue +0 -140
  16. package/components/QiuBacktop/index.vue +0 -121
  17. package/components/QiuBadge/api/index.ts +0 -389
  18. package/components/QiuBadge/components/BadgeImagePickerDialog.vue +0 -243
  19. package/components/QiuBadge/components/BadgeLibraryManagerDialog.vue +0 -30
  20. package/components/QiuBadge/components/BadgeLibraryPanel.vue +0 -182
  21. package/components/QiuBadge/composables/useTableHostHeight.ts +0 -53
  22. package/components/QiuBadge/index.ts +0 -18
  23. package/components/QiuBadge/shared/BadgeTemplateRenderer.vue +0 -32
  24. package/components/QiuBadge/shared/assetUrl.ts +0 -26
  25. package/components/QiuBadge/shared/badgeTemplate.ts +0 -309
  26. package/components/QiuBadge/utils/chinaAreaData.ts +0 -44
  27. package/components/QiuBadge/utils/hostRegion.ts +0 -22
  28. package/components/QiuBadge/utils/pca-code.json +0 -1
  29. package/components/QiuBadge/utils/pdfFromElement.ts +0 -348
  30. package/components/QiuBadge/views/BadgeLibraryView.vue +0 -32
  31. package/components/QiuBadge/views/BadgeManageView.vue +0 -1364
  32. package/components/QiuBadge/views/BadgeTemplateEditorView.vue +0 -10
  33. package/components/QiuBadge/views/BadgeTemplateListView.vue +0 -229
  34. package/components/QiuBadge/views/DeskLabelTemplateListView.vue +0 -227
  35. package/components/QiuBadge/views/DeskLabelView.vue +0 -683
  36. package/components/QiuBadgeDot/index.vue +0 -87
  37. package/components/QiuButton/index.vue +0 -247
  38. package/components/QiuButtonGroup/index.vue +0 -63
  39. package/components/QiuCanvasKit/QiuCanvasEditor.vue +0 -5503
  40. package/components/QiuCanvasKit/QiuCanvasRenderer.vue +0 -348
  41. package/components/QiuCanvasKit/assetUrl.ts +0 -11
  42. package/components/QiuCanvasKit/components/DataModulesPanel.vue +0 -352
  43. package/components/QiuCanvasKit/export/html.ts +0 -132
  44. package/components/QiuCanvasKit/export/pdf.ts +0 -48
  45. package/components/QiuCanvasKit/export/png.ts +0 -50
  46. package/components/QiuCanvasKit/index.ts +0 -20
  47. package/components/QiuCanvasKit/modules/badgeCompat.ts +0 -84
  48. package/components/QiuCanvasKit/modules/dataRegistry.ts +0 -207
  49. package/components/QiuCanvasKit/modules/merge.ts +0 -71
  50. package/components/QiuCanvasKit/presets/badge.ts +0 -67
  51. package/components/QiuCanvasKit/presets/banner.ts +0 -79
  52. package/components/QiuCanvasKit/types.ts +0 -138
  53. package/components/QiuCard/index.vue +0 -104
  54. package/components/QiuCarousel/context.ts +0 -16
  55. package/components/QiuCarousel/index.vue +0 -343
  56. package/components/QiuCarouselItem/index.vue +0 -47
  57. package/components/QiuCascader/index.vue +0 -879
  58. package/components/QiuCascader/types.ts +0 -48
  59. package/components/QiuCheckbox/QiuCheckboxGroup.vue +0 -78
  60. package/components/QiuCheckbox/index.vue +0 -231
  61. package/components/QiuCheckbox/types.ts +0 -8
  62. package/components/QiuCode/index.vue +0 -64
  63. package/components/QiuCol/col.scss +0 -55
  64. package/components/QiuCol/index.vue +0 -64
  65. package/components/QiuCollapse/context.ts +0 -10
  66. package/components/QiuCollapse/index.vue +0 -70
  67. package/components/QiuCollapseItem/index.vue +0 -167
  68. package/components/QiuColorField/index.vue +0 -296
  69. package/components/QiuColorPicker/README.md +0 -118
  70. package/components/QiuColorPicker/index.vue +0 -60
  71. package/components/QiuColorfulCard/index.vue +0 -101
  72. package/components/QiuCombobox/index.vue +0 -277
  73. package/components/QiuConfigProvider/index.vue +0 -31
  74. package/components/QiuContextMenu/index.vue +0 -209
  75. package/components/QiuDate/index.vue +0 -1134
  76. package/components/QiuDescriptions/context.ts +0 -20
  77. package/components/QiuDescriptions/index.vue +0 -115
  78. package/components/QiuDescriptionsItem/index.vue +0 -103
  79. package/components/QiuDialog/index.vue +0 -828
  80. package/components/QiuDigitalCard/index.vue +0 -159
  81. package/components/QiuDivider/index.vue +0 -185
  82. package/components/QiuDot/index.vue +0 -83
  83. package/components/QiuDrawer/index.vue +0 -350
  84. package/components/QiuDropdown/QiuDropdownItem.vue +0 -74
  85. package/components/QiuDropdown/QiuDropdownMenu.vue +0 -22
  86. package/components/QiuDropdown/context.ts +0 -9
  87. package/components/QiuDropdown/index.vue +0 -189
  88. package/components/QiuEmpty/index.vue +0 -73
  89. package/components/QiuForm/index.vue +0 -172
  90. package/components/QiuForm/types.ts +0 -39
  91. package/components/QiuFormItem/index.vue +0 -276
  92. package/components/QiuFullscreen/index.vue +0 -11
  93. package/components/QiuGrid/index.vue +0 -408
  94. package/components/QiuHoverCard/index.vue +0 -192
  95. package/components/QiuIcon/index.vue +0 -117
  96. package/components/QiuIconPicker/iconify.libraries.ts +0 -182
  97. package/components/QiuIconPicker/icons.catalog.ts +0 -3072
  98. package/components/QiuIconPicker/index.vue +0 -488
  99. package/components/QiuImage/index.vue +0 -177
  100. package/components/QiuInput/index.vue +0 -328
  101. package/components/QiuInputNumber/index.vue +0 -295
  102. package/components/QiuInputOtp/index.vue +0 -190
  103. package/components/QiuKbd/index.vue +0 -57
  104. package/components/QiuLayoutContainer/index.vue +0 -50
  105. package/components/QiuLinkPreview/index.vue +0 -224
  106. package/components/QiuLoading/index.ts +0 -176
  107. package/components/QiuLoading/spinner.vue +0 -820
  108. package/components/QiuLoading/types.ts +0 -44
  109. package/components/QiuMention/index.vue +0 -299
  110. package/components/QiuMenu/QiuMenuRoot.vue +0 -241
  111. package/components/QiuMenu/components/QiuMenuItem.vue +0 -340
  112. package/components/QiuMenu/components/QiuSubMenu.vue +0 -504
  113. package/components/QiuMenu/context.ts +0 -21
  114. package/components/QiuMenu/index.vue +0 -43
  115. package/components/QiuMenuNav/QiuMenuNavItem.vue +0 -100
  116. package/components/QiuMenuNav/QiuMenuNavSub.vue +0 -120
  117. package/components/QiuMenuNav/context.ts +0 -14
  118. package/components/QiuMenuNav/index.vue +0 -148
  119. package/components/QiuMsg/QiuMsgItem.vue +0 -180
  120. package/components/QiuMsg/index.ts +0 -158
  121. package/components/QiuMsg/types.ts +0 -23
  122. package/components/QiuMsgBox/index.ts +0 -147
  123. package/components/QiuNotification/QiuNotificationItem.vue +0 -168
  124. package/components/QiuNotification/index.ts +0 -155
  125. package/components/QiuNotification/types.ts +0 -14
  126. package/components/QiuPage/index.vue +0 -12
  127. package/components/QiuPageHeader/index.vue +0 -115
  128. package/components/QiuPageMain/index.vue +0 -78
  129. package/components/QiuPagination/index.vue +0 -421
  130. package/components/QiuPasswordStrength/index.vue +0 -101
  131. package/components/QiuPopconfirm/index.vue +0 -196
  132. package/components/QiuPopover/index.vue +0 -277
  133. package/components/QiuProgress/index.vue +0 -235
  134. package/components/QiuQrcode/index.vue +0 -302
  135. package/components/QiuQueryForm/components/QiuQueryFormBottomPanel.vue +0 -13
  136. package/components/QiuQueryForm/components/QiuQueryFormLeftPanel.vue +0 -37
  137. package/components/QiuQueryForm/components/QiuQueryFormRightPanel.vue +0 -37
  138. package/components/QiuQueryForm/components/QiuQueryFormTopPanel.vue +0 -13
  139. package/components/QiuQueryForm/index.vue +0 -117
  140. package/components/QiuRadio/QiuRadioGroup.vue +0 -75
  141. package/components/QiuRadio/index.vue +0 -191
  142. package/components/QiuRadio/types.ts +0 -9
  143. package/components/QiuRate/index.vue +0 -184
  144. package/components/QiuRefresh/index.vue +0 -32
  145. package/components/QiuResult/index.vue +0 -103
  146. package/components/QiuRow/index.vue +0 -60
  147. package/components/QiuRow/types.ts +0 -5
  148. package/components/QiuScrollbar/index.vue +0 -107
  149. package/components/QiuSearchBar/index.vue +0 -154
  150. package/components/QiuSegmented/index.vue +0 -120
  151. package/components/QiuSelect/QiuOption.vue +0 -93
  152. package/components/QiuSelect/index.vue +0 -452
  153. package/components/QiuSelect/types.ts +0 -15
  154. package/components/QiuSkeleton/index.vue +0 -78
  155. package/components/QiuSlider/index.vue +0 -266
  156. package/components/QiuSpace/index.vue +0 -95
  157. package/components/QiuSparkline/index.vue +0 -92
  158. package/components/QiuStatistic/index.vue +0 -4
  159. package/components/QiuStatistics/index.vue +0 -123
  160. package/components/QiuStep/index.vue +0 -220
  161. package/components/QiuSteps/context.ts +0 -25
  162. package/components/QiuSteps/index.vue +0 -84
  163. package/components/QiuSwitch/index.vue +0 -145
  164. package/components/QiuTabBar/index.vue +0 -218
  165. package/components/QiuTabBar/types.ts +0 -19
  166. package/components/QiuTabPane/index.vue +0 -82
  167. package/components/QiuTable/columns.ts +0 -16
  168. package/components/QiuTable/export.ts +0 -102
  169. package/components/QiuTable/index.ts +0 -24
  170. package/components/QiuTable/index.vue +0 -3503
  171. package/components/QiuTable/registry.ts +0 -75
  172. package/components/QiuTable/styles/table.scss +0 -1230
  173. package/components/QiuTable/types.ts +0 -413
  174. package/components/QiuTable/useArea.ts +0 -202
  175. package/components/QiuTable/useColumns.ts +0 -325
  176. package/components/QiuTable/useEdit.ts +0 -136
  177. package/components/QiuTable/useExtras.ts +0 -115
  178. package/components/QiuTable/useHistory.ts +0 -77
  179. package/components/QiuTable/useMerge.ts +0 -105
  180. package/components/QiuTable/useResize.ts +0 -86
  181. package/components/QiuTable/useScrollSync.ts +0 -152
  182. package/components/QiuTable/useVirtual.ts +0 -97
  183. package/components/QiuTable/utils.ts +0 -165
  184. package/components/QiuTableColumn/index.vue +0 -101
  185. package/components/QiuTag/index.vue +0 -143
  186. package/components/QiuText/index.vue +0 -99
  187. package/components/QiuTime/index.vue +0 -548
  188. package/components/QiuTimeAgo/index.vue +0 -103
  189. package/components/QiuTimeline/index.vue +0 -54
  190. package/components/QiuTimelineItem/index.vue +0 -140
  191. package/components/QiuTips/index.vue +0 -323
  192. package/components/QiuTooltip/index.vue +0 -237
  193. package/components/QiuTransfer/index.vue +0 -277
  194. package/components/QiuTree/QiuTreeNode.vue +0 -146
  195. package/components/QiuTree/index.vue +0 -143
  196. package/components/QiuTree/types.ts +0 -30
  197. package/components/QiuTreeSelect/index.vue +0 -259
  198. package/components/QiuTrend/index.vue +0 -92
  199. package/components/QiuUpload/index.vue +0 -628
  200. package/components/QiuUploadCrop/index.vue +0 -1267
  201. package/components/QiuWatermark/index.vue +0 -121
  202. package/components/useBodyScrollLock.ts +0 -28
  203. package/dist/components/QiuBadge/utils/pca-code.json.d.ts +0 -3
  204. package/plugins/qiu.ts +0 -83
  205. package/plugins/shortcuts.ts +0 -69
  206. package/src/bridge/@/api/media.ts +0 -8
  207. package/src/bridge/@/api/notice.ts +0 -5
  208. package/src/bridge/@/config/index.ts +0 -38
  209. package/src/bridge/@/config/media.config.ts +0 -37
  210. package/src/bridge/@/config/security.config.ts +0 -8
  211. package/src/bridge/@/i18n/index.ts +0 -6
  212. package/src/bridge/@/store/modules/bing.ts +0 -9
  213. package/src/bridge/@/store/modules/errorLog.ts +0 -9
  214. package/src/bridge/@/store/modules/media.ts +0 -10
  215. package/src/bridge/@/store/modules/routes.ts +0 -10
  216. package/src/bridge/@/store/modules/settings.ts +0 -9
  217. package/src/bridge/@/store/modules/tabs.ts +0 -9
  218. package/src/bridge/@/store/modules/user.ts +0 -9
  219. package/src/bridge/@/utils/convertToCamelCase.ts +0 -11
  220. package/src/bridge/@/utils/index.ts +0 -9
  221. package/src/bridge/@/utils/pageTitle.ts +0 -4
  222. package/src/bridge/@/utils/routes.ts +0 -14
  223. package/src/bridge/@/utils/validate.ts +0 -17
  224. package/src/bridge/@qiu/plugins/shortcuts.ts +0 -3
  225. package/src/i18n.ts +0 -8
  226. package/src/icons/qiu-logo.svg +0 -1
  227. package/styles/dark.scss +0 -194
  228. package/styles/normalize.css +0 -349
  229. package/styles/plain.scss +0 -423
  230. package/styles/qiu-tokens.scss +0 -40
  231. package/styles/qiu.scss +0 -1149
  232. package/styles/technology.scss +0 -452
  233. package/styles/var.scss +0 -382
  234. package/styles/variables.scss +0 -77
@@ -1,172 +0,0 @@
1
- <template>
2
- <form
3
- class="qiu-form"
4
- :class="[
5
- `qiu-form--label-${labelPosition}`,
6
- { 'qiu-form--inline': inline },
7
- ]"
8
- :style="formStyle"
9
- @submit.prevent
10
- >
11
- <slot />
12
- </form>
13
- </template>
14
-
15
- <script lang="ts" setup>
16
- import type { QiuFormContext, QiuFormItemContext, QiuFormRules } from './types'
17
- import { QIU_FORM_KEY } from './types'
18
-
19
- defineOptions({ name: 'QiuForm' })
20
-
21
- const props = withDefaults(
22
- defineProps<{
23
- model?: Record<string, any>
24
- rules?: QiuFormRules
25
- labelWidth?: string | number
26
- labelPosition?: 'left' | 'right' | 'top'
27
- inline?: boolean
28
- disabled?: boolean
29
- hideRequiredAsterisk?: boolean
30
- requireAsteriskPosition?: 'left' | 'right'
31
- validateOnRuleChange?: boolean
32
- }>(),
33
- {
34
- labelWidth: '',
35
- labelPosition: 'right',
36
- inline: false,
37
- disabled: false,
38
- hideRequiredAsterisk: false,
39
- requireAsteriskPosition: 'left',
40
- validateOnRuleChange: true,
41
- }
42
- )
43
-
44
- const emit = defineEmits<{
45
- validate: [prop: string, isValid: boolean, message: string]
46
- }>()
47
-
48
- const normalizedLabelWidth = computed(() => {
49
- if (!props.labelWidth && props.labelWidth !== 0) return ''
50
- return typeof props.labelWidth === 'number' ? `${props.labelWidth}px` : props.labelWidth
51
- })
52
-
53
- const formStyle = computed(() => {
54
- if (!normalizedLabelWidth.value) return undefined
55
- return { '--qiu-form-label-width': normalizedLabelWidth.value }
56
- })
57
-
58
- const fields = ref<QiuFormItemContext[]>([])
59
-
60
- const addField = (field: QiuFormItemContext) => {
61
- if (!fields.value.find((f) => f.uid === field.uid)) fields.value.push(field)
62
- }
63
-
64
- const removeField = (field: QiuFormItemContext) => {
65
- fields.value = fields.value.filter((f) => f.uid !== field.uid)
66
- }
67
-
68
- const validate = (callback?: (valid: boolean) => void): Promise<boolean> => {
69
- const list = fields.value.filter((f) => f.prop)
70
- return Promise.all(list.map((f) => f.validate('')))
71
- .then((results) => {
72
- const valid = results.every(Boolean)
73
- callback?.(valid)
74
- return valid
75
- })
76
- .catch(() => {
77
- callback?.(false)
78
- return false
79
- })
80
- }
81
-
82
- const validateField = async (propsOrProp: string | string[]) => {
83
- const propsList = Array.isArray(propsOrProp) ? propsOrProp : [propsOrProp]
84
- const list = fields.value.filter((f) => f.prop && propsList.includes(f.prop))
85
- const results = await Promise.all(list.map((f) => f.validate('')))
86
- return results.every(Boolean)
87
- }
88
-
89
- const resetFields = () => {
90
- fields.value.forEach((f) => f.resetField())
91
- }
92
-
93
- const clearValidate = (propsOrProp?: string | string[]) => {
94
- const propsList = propsOrProp
95
- ? Array.isArray(propsOrProp)
96
- ? propsOrProp
97
- : [propsOrProp]
98
- : null
99
- fields.value.forEach((f) => {
100
- if (!propsList || (f.prop && propsList.includes(f.prop))) f.clearValidate()
101
- })
102
- }
103
-
104
- const formCtx: QiuFormContext = {
105
- model: computed(() => props.model),
106
- rules: computed(() => props.rules),
107
- labelWidth: normalizedLabelWidth,
108
- labelPosition: computed(() => props.labelPosition),
109
- disabled: computed(() => props.disabled),
110
- hideRequiredAsterisk: computed(() => props.hideRequiredAsterisk),
111
- addField,
112
- removeField,
113
- emitValidate: (prop, isValid, message) => emit('validate', prop, isValid, message),
114
- }
115
-
116
- provide(QIU_FORM_KEY, formCtx)
117
- provide('qiuFormLabelWidth', normalizedLabelWidth)
118
- provide('qiuFormLabelPosition', computed(() => props.labelPosition))
119
-
120
- watch(
121
- () => props.rules,
122
- () => {
123
- if (props.validateOnRuleChange) void validate()
124
- },
125
- { deep: true }
126
- )
127
-
128
- defineExpose({
129
- validate,
130
- validateField,
131
- resetFields,
132
- clearValidate,
133
- })
134
- </script>
135
-
136
- <style lang="scss" scoped>
137
- .qiu-form {
138
- --qiu-form-label-width: auto;
139
-
140
- &--inline {
141
- display: flex;
142
- flex-wrap: wrap;
143
- gap: 0 16px;
144
- align-items: flex-start;
145
- }
146
-
147
- &--label-top {
148
- :deep(.qiu-form-item) {
149
- flex-direction: column;
150
- align-items: flex-start;
151
- }
152
-
153
- :deep(.qiu-form-item__label) {
154
- justify-content: flex-start;
155
- width: auto;
156
- padding-bottom: 4px;
157
- }
158
- }
159
-
160
- &--label-left {
161
- :deep(.qiu-form-item__label) {
162
- justify-content: flex-start;
163
- }
164
- }
165
-
166
- &--label-right {
167
- :deep(.qiu-form-item__label) {
168
- justify-content: flex-end;
169
- }
170
- }
171
- }
172
- </style>
@@ -1,39 +0,0 @@
1
- export const QIU_FORM_KEY = Symbol('qiuForm')
2
- export const QIU_FORM_ITEM_KEY = Symbol('qiuFormItem')
3
-
4
- export type QiuFormRule = {
5
- required?: boolean
6
- message?: string
7
- min?: number
8
- max?: number
9
- pattern?: RegExp
10
- type?: string
11
- trigger?: 'blur' | 'change' | Array<'blur' | 'change'>
12
- validator?: (
13
- rule: QiuFormRule,
14
- value: any,
15
- callback: (error?: string | Error) => void
16
- ) => void
17
- }
18
-
19
- export type QiuFormRules = Record<string, QiuFormRule | QiuFormRule[]>
20
-
21
- export interface QiuFormItemContext {
22
- uid: number
23
- prop?: string
24
- validate: (trigger: string) => Promise<boolean>
25
- resetField: () => void
26
- clearValidate: () => void
27
- }
28
-
29
- export interface QiuFormContext {
30
- model: import('vue').ComputedRef<Record<string, any> | undefined>
31
- rules: import('vue').ComputedRef<QiuFormRules | undefined>
32
- labelWidth: import('vue').ComputedRef<string>
33
- labelPosition: import('vue').ComputedRef<'left' | 'right' | 'top'>
34
- disabled: import('vue').ComputedRef<boolean>
35
- hideRequiredAsterisk: import('vue').ComputedRef<boolean>
36
- addField: (field: QiuFormItemContext) => void
37
- removeField: (field: QiuFormItemContext) => void
38
- emitValidate: (prop: string, isValid: boolean, message: string) => void
39
- }
@@ -1,276 +0,0 @@
1
- <template>
2
- <div
3
- class="qiu-form-item"
4
- :class="{
5
- 'is-required': isRequired,
6
- 'is-error': validateState === 'error',
7
- }"
8
- >
9
- <label
10
- v-if="label || $slots.label"
11
- class="qiu-form-item__label"
12
- :style="labelStyle"
13
- >
14
- <slot name="label">{{ label }}</slot>
15
- </label>
16
- <div class="qiu-form-item__content">
17
- <slot />
18
- <div v-if="validateMessage && validateState === 'error'" class="qiu-form-item__error">
19
- {{ validateMessage }}
20
- </div>
21
- </div>
22
- </div>
23
- </template>
24
-
25
- <script lang="ts" setup>
26
- import type { QiuFormContext, QiuFormItemContext, QiuFormRule } from '../QiuForm/types'
27
- import { QIU_FORM_ITEM_KEY, QIU_FORM_KEY } from '../QiuForm/types'
28
-
29
- defineOptions({ name: 'QiuFormItem' })
30
-
31
- const props = withDefaults(
32
- defineProps<{
33
- label?: string
34
- labelWidth?: string | number
35
- required?: boolean
36
- prop?: string
37
- error?: string
38
- rules?: QiuFormRule | QiuFormRule[]
39
- }>(),
40
- {
41
- required: undefined,
42
- }
43
- )
44
-
45
- const form = inject<QiuFormContext | null>(QIU_FORM_KEY, null)
46
- const formLabelWidth = inject<Ref<string>>('qiuFormLabelWidth', ref(''))
47
- const formLabelPosition = inject<Ref<'left' | 'right' | 'top'>>(
48
- 'qiuFormLabelPosition',
49
- ref('right')
50
- )
51
-
52
- const uid = getCurrentInstance()?.uid ?? Math.random()
53
- const validateState = ref<'' | 'error' | 'success' | 'validating'>('')
54
- const validateMessage = ref('')
55
- const initialValue = ref<any>(undefined)
56
-
57
- const resolvedLabelWidth = computed(() => {
58
- if (props.labelWidth !== undefined && props.labelWidth !== '') {
59
- return typeof props.labelWidth === 'number' ? `${props.labelWidth}px` : props.labelWidth
60
- }
61
- return form?.labelWidth.value || formLabelWidth.value
62
- })
63
-
64
- const labelStyle = computed(() => {
65
- if ((form?.labelPosition.value || formLabelPosition.value) === 'top') return undefined
66
- if (!resolvedLabelWidth.value) return undefined
67
- return { width: resolvedLabelWidth.value }
68
- })
69
-
70
- const fieldValue = computed(() => {
71
- if (!props.prop || !form?.model.value) return undefined
72
- return form.model.value[props.prop]
73
- })
74
-
75
- const normalizedRules = computed((): QiuFormRule[] => {
76
- const list: QiuFormRule[] = []
77
- if (props.rules) list.push(...(Array.isArray(props.rules) ? props.rules : [props.rules]))
78
- if (props.prop && form?.rules.value?.[props.prop]) {
79
- const r = form.rules.value[props.prop]
80
- list.push(...(Array.isArray(r) ? r : [r]))
81
- }
82
- return list
83
- })
84
-
85
- const isRequired = computed(() => {
86
- if (form?.hideRequiredAsterisk.value) return false
87
- if (props.required === true) return true
88
- if (props.required === false) return false
89
- return normalizedRules.value.some((r) => r.required)
90
- })
91
-
92
- const runRule = (rule: QiuFormRule, value: any): Promise<string> =>
93
- new Promise((resolve) => {
94
- if (rule.required) {
95
- const empty =
96
- value === undefined ||
97
- value === null ||
98
- value === '' ||
99
- (Array.isArray(value) && !value.length)
100
- if (empty) {
101
- resolve(rule.message || '必填项')
102
- return
103
- }
104
- }
105
- if (rule.min != null || rule.max != null) {
106
- const len = typeof value === 'number' ? value : String(value ?? '').length
107
- if (rule.min != null && len < rule.min) {
108
- resolve(rule.message || `长度不能少于 ${rule.min}`)
109
- return
110
- }
111
- if (rule.max != null && len > rule.max) {
112
- resolve(rule.message || `长度不能超过 ${rule.max}`)
113
- return
114
- }
115
- }
116
- if (rule.pattern && value != null && value !== '' && !rule.pattern.test(String(value))) {
117
- resolve(rule.message || '格式不正确')
118
- return
119
- }
120
- if (rule.validator) {
121
- rule.validator(rule, value, (err?: string | Error) => {
122
- if (!err) resolve('')
123
- else resolve(typeof err === 'string' ? err : err.message || '校验失败')
124
- })
125
- return
126
- }
127
- resolve('')
128
- })
129
-
130
- const validate = async (trigger: string): Promise<boolean> => {
131
- if (props.error) {
132
- validateState.value = 'error'
133
- validateMessage.value = props.error
134
- return false
135
- }
136
- const rules = normalizedRules.value.filter((r) => {
137
- if (!trigger) return true
138
- const t = r.trigger
139
- if (!t) return true
140
- const arr = Array.isArray(t) ? t : [t]
141
- return arr.includes(trigger as 'blur' | 'change')
142
- })
143
- if (!rules.length && !trigger) {
144
- // full validate uses all rules
145
- }
146
- const useRules = trigger ? rules : normalizedRules.value
147
- if (!useRules.length) {
148
- validateState.value = ''
149
- validateMessage.value = ''
150
- return true
151
- }
152
-
153
- validateState.value = 'validating'
154
- for (const rule of useRules) {
155
- const msg = await runRule(rule, fieldValue.value)
156
- if (msg) {
157
- validateState.value = 'error'
158
- validateMessage.value = msg
159
- if (props.prop) form?.emitValidate(props.prop, false, msg)
160
- return false
161
- }
162
- }
163
- validateState.value = 'success'
164
- validateMessage.value = ''
165
- if (props.prop) form?.emitValidate(props.prop, true, '')
166
- return true
167
- }
168
-
169
- const resetField = () => {
170
- if (props.prop && form?.model.value) {
171
- form.model.value[props.prop] = initialValue.value
172
- }
173
- clearValidate()
174
- }
175
-
176
- const clearValidate = () => {
177
- validateState.value = ''
178
- validateMessage.value = ''
179
- }
180
-
181
- const fieldCtx: QiuFormItemContext = {
182
- uid,
183
- prop: props.prop,
184
- validate,
185
- resetField,
186
- clearValidate,
187
- }
188
-
189
- provide(QIU_FORM_ITEM_KEY, {
190
- validate,
191
- prop: computed(() => props.prop),
192
- })
193
-
194
- onMounted(() => {
195
- initialValue.value = fieldValue.value
196
- form?.addField(fieldCtx)
197
- })
198
-
199
- onBeforeUnmount(() => {
200
- form?.removeField(fieldCtx)
201
- })
202
-
203
- watch(
204
- () => props.error,
205
- (err) => {
206
- if (err) {
207
- validateState.value = 'error'
208
- validateMessage.value = err
209
- }
210
- }
211
- )
212
-
213
- watch(fieldValue, () => {
214
- if (validateState.value === 'error' || normalizedRules.value.some((r) => {
215
- const t = r.trigger
216
- if (!t) return true
217
- const arr = Array.isArray(t) ? t : [t]
218
- return arr.includes('change')
219
- })) {
220
- void validate('change')
221
- }
222
- })
223
-
224
- defineExpose({ validate, resetField, clearValidate, validateState, validateMessage })
225
- </script>
226
-
227
- <style lang="scss" scoped>
228
- .qiu-form-item {
229
- display: flex;
230
- align-items: flex-start;
231
- margin-bottom: 18px;
232
-
233
- &.is-required .qiu-form-item__label::before {
234
- margin-right: 4px;
235
- color: var(--qiu-color-danger, var(--qiu-color-danger, #f56c6c));
236
- content: '*';
237
- }
238
-
239
- &.is-error {
240
- :deep(.qiu-input),
241
- :deep(.qiu-select),
242
- :deep(.qiu-input-number) {
243
- border-color: var(--qiu-color-danger, var(--qiu-color-danger, #f56c6c));
244
- }
245
- }
246
- }
247
-
248
- .qiu-form-item__label {
249
- box-sizing: border-box;
250
- display: inline-flex;
251
- flex-shrink: 0;
252
- align-items: center;
253
- height: 32px;
254
- padding-right: 12px;
255
- font-size: 14px;
256
- line-height: 32px;
257
- color: var(--qiu-text-color-regular, var(--qiu-text-color-regular, #606266));
258
- }
259
-
260
- .qiu-form-item__content {
261
- position: relative;
262
- flex: 1;
263
- min-width: 0;
264
- line-height: 32px;
265
- }
266
-
267
- .qiu-form-item__error {
268
- position: absolute;
269
- top: 100%;
270
- left: 0;
271
- padding-top: 2px;
272
- font-size: 12px;
273
- line-height: 1;
274
- color: var(--qiu-color-danger, var(--qiu-color-danger, #f56c6c));
275
- }
276
- </style>
@@ -1,11 +0,0 @@
1
- <template>
2
- <qiu-icon class="qiu-fullscreen" :icon="isFullscreen ? 'fullscreen-exit-fill' : 'fullscreen-fill'" @click="toggle" />
3
- </template>
4
-
5
- <script lang="ts" setup>
6
- defineOptions({
7
- name: 'QiuFullscreen',
8
- })
9
-
10
- const { isFullscreen, toggle } = useFullscreen()
11
- </script>