From 48ffaecfe87c4ba8758e3b98fc07c3bc16153cb7 Mon Sep 17 00:00:00 2001 From: devin Date: Fri, 5 Jan 2024 14:49:25 +0800 Subject: [PATCH 01/20] =?UTF-8?q?style:=20=E5=A2=9E=E5=8A=A0=E4=B8=8A?= =?UTF-8?q?=E4=BC=A0=E5=9B=BE=E7=89=87=E9=BB=98=E8=AE=A4=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../opendesign/src/upload/__demo__/UploadBasic.vue | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/opendesign/src/upload/__demo__/UploadBasic.vue b/packages/opendesign/src/upload/__demo__/UploadBasic.vue index 6f5be72f..0b9257db 100644 --- a/packages/opendesign/src/upload/__demo__/UploadBasic.vue +++ b/packages/opendesign/src/upload/__demo__/UploadBasic.vue @@ -20,6 +20,7 @@ const defaultFileList: UploadFileT[] = [ id: '1', name: 'test.png', status: 'finished', + imgUrl: 'https://www.hiascend.com/p/resource/202309/72a0d66939734783805e01302bb9f53d.png', }, ]; @@ -104,7 +105,14 @@ const onSelect = (f: UploadFileT[]) => {
- +
-- Gitee From d60fefcd7b35ff6cfac0061f5a0224032b3f42a8 Mon Sep 17 00:00:00 2001 From: devin Date: Mon, 15 Jan 2024 15:41:27 +0800 Subject: [PATCH 02/20] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9Eform=EF=BC=8C?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E6=A0=B7=E5=BC=8F=E7=9B=B8=E5=85=B3API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/opendesign/src/form/OForm.vue | 34 ++++++- packages/opendesign/src/form/OFormItem.vue | 48 ++++++++++ .../src/form/__demo__/FormBasic.vue | 89 +++++++++++++++++- .../src/form/__demo__/FormSlots.vue | 53 +++++++++++ .../__demo__/{IndexForm.vue => TheIndex.vue} | 7 +- packages/opendesign/src/form/form.ts | 14 +++ packages/opendesign/src/form/index.ts | 4 +- packages/opendesign/src/form/provide.ts | 9 ++ packages/opendesign/src/form/style/index.scss | 13 +-- packages/opendesign/src/form/style/media.scss | 5 + packages/opendesign/src/form/style/style.scss | 77 ++++++++++++++++ packages/opendesign/src/form/style/var.scss | 13 +++ packages/opendesign/src/form/types.ts | 91 +++++++++++++++++++ packages/portal/src/router.ts | 6 ++ 14 files changed, 443 insertions(+), 20 deletions(-) create mode 100644 packages/opendesign/src/form/OFormItem.vue create mode 100644 packages/opendesign/src/form/__demo__/FormSlots.vue rename packages/opendesign/src/form/__demo__/{IndexForm.vue => TheIndex.vue} (54%) create mode 100644 packages/opendesign/src/form/provide.ts create mode 100644 packages/opendesign/src/form/style/media.scss create mode 100644 packages/opendesign/src/form/style/style.scss create mode 100644 packages/opendesign/src/form/types.ts diff --git a/packages/opendesign/src/form/OForm.vue b/packages/opendesign/src/form/OForm.vue index d288ca86..dde785ae 100644 --- a/packages/opendesign/src/form/OForm.vue +++ b/packages/opendesign/src/form/OForm.vue @@ -1,4 +1,34 @@ - + diff --git a/packages/opendesign/src/form/OFormItem.vue b/packages/opendesign/src/form/OFormItem.vue new file mode 100644 index 00000000..f89f51d5 --- /dev/null +++ b/packages/opendesign/src/form/OFormItem.vue @@ -0,0 +1,48 @@ + + diff --git a/packages/opendesign/src/form/__demo__/FormBasic.vue b/packages/opendesign/src/form/__demo__/FormBasic.vue index af2f495f..b0ea9802 100644 --- a/packages/opendesign/src/form/__demo__/FormBasic.vue +++ b/packages/opendesign/src/form/__demo__/FormBasic.vue @@ -1,5 +1,88 @@ - + - + diff --git a/packages/opendesign/src/form/__demo__/FormSlots.vue b/packages/opendesign/src/form/__demo__/FormSlots.vue new file mode 100644 index 00000000..ec43243a --- /dev/null +++ b/packages/opendesign/src/form/__demo__/FormSlots.vue @@ -0,0 +1,53 @@ + + + diff --git a/packages/opendesign/src/form/__demo__/IndexForm.vue b/packages/opendesign/src/form/__demo__/TheIndex.vue similarity index 54% rename from packages/opendesign/src/form/__demo__/IndexForm.vue rename to packages/opendesign/src/form/__demo__/TheIndex.vue index 8bc968ef..4a51a9e5 100644 --- a/packages/opendesign/src/form/__demo__/IndexForm.vue +++ b/packages/opendesign/src/form/__demo__/TheIndex.vue @@ -1,12 +1,13 @@ diff --git a/packages/opendesign/src/form/form.ts b/packages/opendesign/src/form/form.ts index 66b05bed..b6e3dc07 100644 --- a/packages/opendesign/src/form/form.ts +++ b/packages/opendesign/src/form/form.ts @@ -6,3 +6,17 @@ export function toInputString(val: unknown): string { } return String(val); } + +export function getFlexValue(val?: 'top' | 'center' | 'bottom' | 'left' | 'center' | 'right'): string { + if (!val) { + return ''; + } + if (['top', 'left'].includes(val)) { + return 'flex-start'; + } else if (['bottom', 'right'].includes(val)) { + return 'flex-end'; + } else if ('center' === val) { + return 'center'; + } + return ''; +} diff --git a/packages/opendesign/src/form/index.ts b/packages/opendesign/src/form/index.ts index 02f3334b..97204104 100644 --- a/packages/opendesign/src/form/index.ts +++ b/packages/opendesign/src/form/index.ts @@ -1,9 +1,11 @@ import _OForm from './OForm.vue'; +import OFormItem from './OFormItem.vue'; import type { App } from 'vue'; const OForm = Object.assign(_OForm, { + OFormItem, install(app: App) { app.component(_OForm.name, _OForm); }, }); -export { OForm }; +export { OForm, OFormItem }; diff --git a/packages/opendesign/src/form/provide.ts b/packages/opendesign/src/form/provide.ts new file mode 100644 index 00000000..fb3eb0d8 --- /dev/null +++ b/packages/opendesign/src/form/provide.ts @@ -0,0 +1,9 @@ +import { InjectionKey, ComputedRef } from 'vue'; + +export const formInjectKey: InjectionKey<{ + labelWidth?: ComputedRef; +}> = Symbol('provide-form'); + +export const formItemInjectKey: InjectionKey<{ + labelWidth?: ComputedRef; +}> = Symbol('provide-form-item'); diff --git a/packages/opendesign/src/form/style/index.scss b/packages/opendesign/src/form/style/index.scss index b0631398..504d59c4 100644 --- a/packages/opendesign/src/form/style/index.scss +++ b/packages/opendesign/src/form/style/index.scss @@ -1,11 +1,2 @@ -@use '../../_styles/mixin.scss' as *; -@use './var.scss'; - -.o-form { - cursor: pointer; - color: var(--input-color); - display: inline-flex; - height: var(--input-height); - font-size: var(--input-text-size); - line-height: var(--input-text-height); -} +@use './style.scss' as *; +@use './media.scss' as *; diff --git a/packages/opendesign/src/form/style/media.scss b/packages/opendesign/src/form/style/media.scss new file mode 100644 index 00000000..d7abf91f --- /dev/null +++ b/packages/opendesign/src/form/style/media.scss @@ -0,0 +1,5 @@ +@use '../../_styles/mixin.scss' as *; +@use './var.scss'; + +.o-form { +} diff --git a/packages/opendesign/src/form/style/style.scss b/packages/opendesign/src/form/style/style.scss new file mode 100644 index 00000000..ea15b567 --- /dev/null +++ b/packages/opendesign/src/form/style/style.scss @@ -0,0 +1,77 @@ +@use '../../_styles/mixin.scss' as *; +@use './var.scss'; + +.o-form-layout-inline { + display: flex; + flex-wrap: wrap; + .o-form-item { + margin: 0 var(--form-item-gap) var(--form-item-gap) 0; + } +} +.o-form-layout-h { + &.o-form-has-required { + .o-form-require-symbol { + display: block; + } + } +} + +.o-form-layout-h, +.o-form-layout-v { + .o-form-item + .o-form-item { + margin-top: var(--form-item-gap); + } +} +.o-form-layout-v { + .o-form-item { + display: block; + } +} +.o-form-item { + display: var(--form-item-display, flex); + align-items: var(--form-item-align); +} + +.o-form-item-label { + display: inline-flex; + align-items: center; + max-width: var(--form-label-max-width); + justify-content: var(--form-label-justify); + flex: 0 0 var(--form-label-width); + width: var(--form-label-width); + .o-form-layout-h &, + .o-form-layout-inline & { + margin: var(--form-label-gap-top) 0; + + + .o-form-item-main { + margin-left: var(--form-label-main-gap); + } + } +} + +.o-form-require-symbol { + color: var(--o-color-danger1); + font-size: var(--o-font_size-tip2); + line-height: 1; + margin-right: 4px; + font-family: monospace; + opacity: 0; + transition: opacity var(--o-easing-linear) var(--o-duration-m3); + display: none; + font-weight: bold; + &.visible { + opacity: 1; + display: block; + } +} + +.o-form-item-main { + flex: 1; +} + +.o-form-item-extra { + margin-top: 4px; + font-size: var(--o-font_size-tip2); + line-height: var(--o-line_height-tip2); + color: var(--o-color-info3); +} diff --git a/packages/opendesign/src/form/style/var.scss b/packages/opendesign/src/form/style/var.scss index 447b3517..c9fd2faa 100644 --- a/packages/opendesign/src/form/style/var.scss +++ b/packages/opendesign/src/form/style/var.scss @@ -1,2 +1,15 @@ .o-form { + --form-item-display: flex; + --form-item-gap: 24px; + --form-label-main-gap: 32px; + --form-label-gap-top: 4px; +} +.o-form-layout-h { + --form-label-width: 20%; + --form-label-max-width: 240px; + --form-item-align: flex-start; +} +.o-form-layout-v { + --form-label-width: 100%; + --form-label-justify: flex-start; } diff --git a/packages/opendesign/src/form/types.ts b/packages/opendesign/src/form/types.ts new file mode 100644 index 00000000..69770fa9 --- /dev/null +++ b/packages/opendesign/src/form/types.ts @@ -0,0 +1,91 @@ +import { ExtractPropTypes, PropType } from 'vue'; +import type { SizeT } from '../_utils/types'; + +export const TabVariantTypes = ['solid', 'text'] as const; +export type TabVariantT = (typeof TabVariantTypes)[number]; + +export const formProps = { + /** + * 类型 TabVariantT + */ + variant: { + type: String as PropType, + default: 'text', + }, + /** + * 大小 SizeT + */ + size: { + type: String as PropType, + }, + /** + * 子项是否包含必选,主要用于控制左对齐 + */ + required: { + type: Boolean, + default: false, + }, + /** + * 布局 + */ + layout: { + type: String as PropType<'h' | 'v' | 'inline'>, + default: 'h', + }, + /** + * 表单项文本垂直对齐方式 + */ + labelAlign: { + type: String as PropType<'top' | 'center' | 'bottom'>, + }, + /** + * 表单项文本水平对齐方式 + */ + labelJustify: { + type: String as PropType<'left' | 'center' | 'right'>, + }, + /** + * 表单项文本宽度,全局 + */ + labelWidth: { + type: String, + }, +}; +export type FormPropsT = ExtractPropTypes; + +export const formItemProps = { + /** + * 是否必选 + */ + required: { + type: Boolean, + default: false, + }, + /** + * 表单项文本 + */ + label: { + type: String, + default: undefined, + }, + /** + * 表单项文本垂直对齐方式 + */ + labelAlign: { + type: String as PropType<'top' | 'center' | 'bottom'>, + }, + /** + * 表单项文本水平对齐方式 + */ + labelJustify: { + type: String as PropType<'left' | 'center' | 'right'>, + }, + /** + * 表单项文本宽度 + */ + labelWidth: { + type: String, + }, +}; + +export type FormItemPropsT = ExtractPropTypes; diff --git a/packages/portal/src/router.ts b/packages/portal/src/router.ts index 70f64362..9f5d19d2 100644 --- a/packages/portal/src/router.ts +++ b/packages/portal/src/router.ts @@ -14,6 +14,12 @@ export const routes = [ label: '日期选择器 DatePicker', component: () => import('@components/date-picker/__demo__/TheIndex.vue'), }, + { + path: '/form', + name: 'Form', + label: '表单 Form', + component: () => import('@components/form/__demo__/TheIndex.vue'), + }, { path: '/text', name: 'Text', -- Gitee From 32deee15443ea009ac592ef2ae85dde61c1adf69 Mon Sep 17 00:00:00 2001 From: devin Date: Fri, 19 Jan 2024 15:27:03 +0800 Subject: [PATCH 03/20] =?UTF-8?q?feat:=20form=E6=94=AF=E6=8C=81input?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C=E5=8F=8A=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/opendesign/src/_utils/helper.ts | 13 +++ packages/opendesign/src/_utils/typeHelp.ts | 0 packages/opendesign/src/_utils/types.ts | 1 + packages/opendesign/src/form/OForm.vue | 2 +- packages/opendesign/src/form/OFormItem.vue | 80 +++++++++++-- .../src/form/__demo__/FormBasic.vue | 2 +- .../src/form/__demo__/FormRules.vue | 105 ++++++++++++++++++ .../src/form/__demo__/FormSlots.vue | 4 +- .../opendesign/src/form/__demo__/TheIndex.vue | 2 + packages/opendesign/src/form/form.ts | 36 +++++- packages/opendesign/src/form/provide.ts | 13 ++- packages/opendesign/src/form/style/style.scss | 26 ++++- packages/opendesign/src/form/types.ts | 41 ++++++- packages/opendesign/src/input/OInput.vue | 17 ++- packages/opendesign/src/select/types.ts | 2 +- pnpm-lock.yaml | 15 +-- 16 files changed, 323 insertions(+), 36 deletions(-) create mode 100644 packages/opendesign/src/_utils/typeHelp.ts create mode 100644 packages/opendesign/src/form/__demo__/FormRules.vue diff --git a/packages/opendesign/src/_utils/helper.ts b/packages/opendesign/src/_utils/helper.ts index 119942b0..a10728a8 100644 --- a/packages/opendesign/src/_utils/helper.ts +++ b/packages/opendesign/src/_utils/helper.ts @@ -98,3 +98,16 @@ export function chunk(arr: any[] = [], size = 1) { (v, i) => arr.slice(i * size, i * size + size) ); } + +export async function asyncSome(array: Array, judgeFn: (arrayItem: any) => Promise) { + for (const iterator of array) { + try { + if (await judgeFn(iterator)) { + return true; + } + } catch (error) { + return false; + } + } + return false; +} diff --git a/packages/opendesign/src/_utils/typeHelp.ts b/packages/opendesign/src/_utils/typeHelp.ts new file mode 100644 index 00000000..e69de29b diff --git a/packages/opendesign/src/_utils/types.ts b/packages/opendesign/src/_utils/types.ts index d22b38dc..83eec424 100644 --- a/packages/opendesign/src/_utils/types.ts +++ b/packages/opendesign/src/_utils/types.ts @@ -37,5 +37,6 @@ export type VariantT = (typeof VariantTypes)[number]; export const ColorTypes = ['normal', 'primary', 'success', 'warning', 'danger'] as const; export type ColorT = (typeof ColorTypes)[number]; +// 颜色 表单元素 export const Color2Types = ['normal', 'success', 'warning', 'danger'] as const; export type Color2T = (typeof ColorTypes)[number]; diff --git a/packages/opendesign/src/form/OForm.vue b/packages/opendesign/src/form/OForm.vue index dde785ae..43c61fcc 100644 --- a/packages/opendesign/src/form/OForm.vue +++ b/packages/opendesign/src/form/OForm.vue @@ -18,7 +18,7 @@ provide(formInjectKey, { class="o-form" :class="[ { - 'o-form-has-required': props.required, + 'o-form-has-required': props.hasRequired, }, `o-form-layout-${props.layout}`, ]" diff --git a/packages/opendesign/src/form/OFormItem.vue b/packages/opendesign/src/form/OFormItem.vue index f89f51d5..e75ff1e5 100644 --- a/packages/opendesign/src/form/OFormItem.vue +++ b/packages/opendesign/src/form/OFormItem.vue @@ -1,22 +1,78 @@