From bd081d03c76710f688ceef5bb4104c18d754670f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=A7=80=E6=89=8D?= Date: Mon, 25 Aug 2025 16:32:59 +0800 Subject: [PATCH 01/34] =?UTF-8?q?feature:=20lookup=20=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E4=BB=BB=E6=84=8F=E8=BE=93=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lookup/src/composition/use-dialog.ts | 4 +++- .../lookup/src/composition/use-freeinput.ts | 5 ++++- .../lookup/src/composition/use-http.ts | 18 ++++++++++++++++-- .../lookup/src/composition/use-input-change.ts | 8 ++------ .../components/lookup/src/lookup.component.tsx | 10 +++++++++- .../property-config/lookup.property-config.ts | 4 ++-- 6 files changed, 36 insertions(+), 13 deletions(-) diff --git a/packages/ui-vue/components/lookup/src/composition/use-dialog.ts b/packages/ui-vue/components/lookup/src/composition/use-dialog.ts index 17b4ca4c8..fb1eed8d9 100644 --- a/packages/ui-vue/components/lookup/src/composition/use-dialog.ts +++ b/packages/ui-vue/components/lookup/src/composition/use-dialog.ts @@ -198,7 +198,9 @@ export function useDialog( if (emitParams.type === CloseType.cancel || emitParams.type === CloseType.esc) { // 还原 - modelValue.value = props.modelValue; + if (!props.allowFreeInput) { + modelValue.value = props.modelValue; + } } // 保存用户数据 diff --git a/packages/ui-vue/components/lookup/src/composition/use-freeinput.ts b/packages/ui-vue/components/lookup/src/composition/use-freeinput.ts index 3e6042a1d..0ab20d643 100644 --- a/packages/ui-vue/components/lookup/src/composition/use-freeinput.ts +++ b/packages/ui-vue/components/lookup/src/composition/use-freeinput.ts @@ -4,9 +4,12 @@ export function useFreeInput(props: any, context: any, inputValue: string, looku if (!props.editable) { return; } + + const clearParams = { items: null, mappingFields: lookupOptions.mappingFields }; + context.emit('clear', clearParams); context.emit('update:modelValue', inputValue); context.emit('update:idValue', ''); - const clearParams = {mappingFields: lookupOptions.mappingFields}; + // const clearParams = {mappingFields: lookupOptions.mappingFields}; useContext(props, clearParams); } diff --git a/packages/ui-vue/components/lookup/src/composition/use-http.ts b/packages/ui-vue/components/lookup/src/composition/use-http.ts index c455bdd2d..27c5ebd40 100644 --- a/packages/ui-vue/components/lookup/src/composition/use-http.ts +++ b/packages/ui-vue/components/lookup/src/composition/use-http.ts @@ -162,9 +162,23 @@ export function useHttp(props: LookupProps, context: any): UseHttpComposition { searchParam.category = 'navsearch'; } - if (!props.enableMultiFieldSearch && searchParam.searchField === '*') { + if (!props.enableMultiFieldSearch) { + if (isNavigation) { + searchParam.searchType = 'like'; + } + + const searchFieldConditon = searchParam.searchType ==='equal' && searchParam.searchValue ? [{ + filterField: searchParam.searchField, + value: searchParam.searchValue, + lbracket: '', + rbracket: '', + relation: FilterRelation.And, + compare: Compare.Equal, + }] : []; + const searchFields = isNavigation ? navSearchFieldItems.value : searchFieldItems.value; - const conditions = buildConditionsWhenSearchAnyFields(searchFields, value, searchType); + const conditions = searchParam.searchField === '*'? buildConditionsWhenSearchAnyFields(searchFields, value, searchType): searchFieldConditon; + if (conditions && conditions.length) { if (isNavigation) { navSearchConditions = conditions; diff --git a/packages/ui-vue/components/lookup/src/composition/use-input-change.ts b/packages/ui-vue/components/lookup/src/composition/use-input-change.ts index 0b84c531b..02ec76484 100644 --- a/packages/ui-vue/components/lookup/src/composition/use-input-change.ts +++ b/packages/ui-vue/components/lookup/src/composition/use-input-change.ts @@ -22,8 +22,8 @@ export function useInputChange(props: LookupProps, context: any, options: Lookup const changeOnBlur = computed(() => props.textChangeType === 'blur' || props.textChangeType === 'any'); const changeOnEnter = computed(() => props.textChangeType === 'enter' || props.textChangeType === 'any'); - const {beforeOpenDialog, updateModelValue, selectedItems, openDialog, lookupOptions, useHttpComposition, isPopuped} = options; - const {updateSearchFieldTitle} = useHttpComposition; + const { beforeOpenDialog, updateModelValue, selectedItems, openDialog, lookupOptions, useHttpComposition, isPopuped } = options; + const { updateSearchFieldTitle } = useHttpComposition; const { lookupState, queryState, searchValueChanged } = useHttpComposition.lookupStates; const isClear = ref(false); @@ -34,10 +34,6 @@ export function useInputChange(props: LookupProps, context: any, options: Lookup return false; } - if (searchValueChanged.value) { - queryState.value = text; - } - return searchValueChanged.value; } diff --git a/packages/ui-vue/components/lookup/src/lookup.component.tsx b/packages/ui-vue/components/lookup/src/lookup.component.tsx index 55372a5d7..fa3df2bb2 100644 --- a/packages/ui-vue/components/lookup/src/lookup.component.tsx +++ b/packages/ui-vue/components/lookup/src/lookup.component.tsx @@ -62,7 +62,7 @@ export default defineComponent({ }); const lookupLocales = useLookupLocales(props); const useHttpComposition = useHttp(props, context); - const { lookupOptions, selectionState, searchValueChanged } = useHttpComposition.lookupStates; + const { lookupOptions, selectionState, searchValueChanged, queryState } = useHttpComposition.lookupStates; const userDataService = useUserData(props, useHttpComposition); const showSelections = computed(() => { @@ -239,6 +239,14 @@ export default defineComponent({ searchText = searchText.trim(); } searchValueChanged.value = $event.target['_value'] !== searchText; + if (props.allowFreeInput) { + updateIdValue(''); + } else { + if (searchValueChanged.value) { + queryState.value = searchText; + } + } + if (openType.value === 'Popup' && searchValueChanged.value) { handleChangeDebounce($event); } diff --git a/packages/ui-vue/components/lookup/src/property-config/lookup.property-config.ts b/packages/ui-vue/components/lookup/src/property-config/lookup.property-config.ts index 08bed1059..2fc1e4891 100644 --- a/packages/ui-vue/components/lookup/src/property-config/lookup.property-config.ts +++ b/packages/ui-vue/components/lookup/src/property-config/lookup.property-config.ts @@ -70,8 +70,8 @@ export class LookupPropertyConfig extends InputBaseProperty { treeConfig, dialog, pager, - expressions, - searchConfig + searchConfig, + expressions }; if (propertyData.type === 'form-group') { -- Gitee From a1e0194895b64082f8852cd50ce93ea367f50acc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=A7=80=E6=89=8D?= Date: Mon, 25 Aug 2025 16:48:17 +0800 Subject: [PATCH 02/34] =?UTF-8?q?fix:=20loading=20=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=9C=A8=E5=B8=83=E5=B1=80=E5=AE=B9=E5=99=A8=E5=86=85=E5=B1=95?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/ui-vue/components/loading/src/loading.service.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/ui-vue/components/loading/src/loading.service.tsx b/packages/ui-vue/components/loading/src/loading.service.tsx index 565d5b383..eb0e91562 100644 --- a/packages/ui-vue/components/loading/src/loading.service.tsx +++ b/packages/ui-vue/components/loading/src/loading.service.tsx @@ -86,8 +86,8 @@ function createInstanceId() { export default class LoadingService { static show(config?: LoadingProps): Ref> { - const mergedConfig = config ? { ...DefaultLoadingProps, ...config } : { ...DefaultLoadingProps }; - const newConfig = { ...mergedConfig, isActive: true, target: document.body, targetPosition: '' }; + const mergedConfig = { ...DefaultLoadingProps, isActive: true, target: document.body, targetPosition: ''}; + const newConfig = { ...mergedConfig, ...config }; return initInstance(newConfig); } -- Gitee From 00d8478a0b1f9b963b7a83e677ce93307e412ef6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=A7=80=E6=89=8D?= Date: Mon, 25 Aug 2025 19:33:43 +0800 Subject: [PATCH 03/34] =?UTF-8?q?fix:=20=E5=88=97=E8=A1=A8Lookup=E7=BC=96?= =?UTF-8?q?=E8=BE=91=E6=94=AF=E6=8C=81=E4=BB=BB=E6=84=8F=E8=BE=93=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui-vue/components/lookup/src/composition/use-context.ts | 2 +- .../ui-vue/components/lookup/src/composition/use-freeinput.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/ui-vue/components/lookup/src/composition/use-context.ts b/packages/ui-vue/components/lookup/src/composition/use-context.ts index a22fd73cb..cae7006e4 100644 --- a/packages/ui-vue/components/lookup/src/composition/use-context.ts +++ b/packages/ui-vue/components/lookup/src/composition/use-context.ts @@ -1,4 +1,4 @@ -export function useContext(props: any, params?: { items?: any, mappingFields: any}) { +export function useContext(props: any, params?: { items?: any, mappingFields: any, isFreeInput?: boolean }) { if (props.context) { if (!params && props.context.editor) { for(const key in props.context.editor) { diff --git a/packages/ui-vue/components/lookup/src/composition/use-freeinput.ts b/packages/ui-vue/components/lookup/src/composition/use-freeinput.ts index 0ab20d643..8c06852f9 100644 --- a/packages/ui-vue/components/lookup/src/composition/use-freeinput.ts +++ b/packages/ui-vue/components/lookup/src/composition/use-freeinput.ts @@ -5,7 +5,7 @@ export function useFreeInput(props: any, context: any, inputValue: string, looku return; } - const clearParams = { items: null, mappingFields: lookupOptions.mappingFields }; + const clearParams = { items: null, mappingFields: lookupOptions.mappingFields, isFreeInput: true }; context.emit('clear', clearParams); context.emit('update:modelValue', inputValue); context.emit('update:idValue', ''); -- Gitee From 8b09fbc8fcaacceaa79cb507dfd808bdf4a70bf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=A7=80=E6=89=8D?= Date: Tue, 26 Aug 2025 10:27:30 +0800 Subject: [PATCH 04/34] =?UTF-8?q?fix:=20=E6=B6=88=E6=81=AF=E6=8F=90?= =?UTF-8?q?=E7=A4=BA=E5=A4=9A=E8=AF=AD=E8=B5=84=E6=BA=90=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/message-box/src/composition/use-feedback.ts | 5 +++-- .../ui-vue/components/message-box/src/locales/ui/en.json | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/ui-vue/components/message-box/src/composition/use-feedback.ts b/packages/ui-vue/components/message-box/src/composition/use-feedback.ts index 8430e6c62..3072d4e49 100644 --- a/packages/ui-vue/components/message-box/src/composition/use-feedback.ts +++ b/packages/ui-vue/components/message-box/src/composition/use-feedback.ts @@ -10,7 +10,7 @@ export function useFeedfack(): UseFeedback { position: 'absolute', left: '50%', top: '50%', - width: '100px', + 'min-width': '100px', height: '40px', background: '#303C53', 'line-height': '40px', @@ -20,7 +20,8 @@ export function useFeedfack(): UseFeedback { 'border-radius': '10px', 'box-shadow': '0px 2px 8px 0px', color: '#fff', - transition: 'all .3s ease' + transition: 'all .3s ease', + padding: '0 10px' } as Record; styleObject.opacity = toShowFeedback.value ? '0.8' : '0'; styleObject.display = toShowFeedback.value ? '' : 'none'; diff --git a/packages/ui-vue/components/message-box/src/locales/ui/en.json b/packages/ui-vue/components/message-box/src/locales/ui/en.json index 853a333bd..0dfb661a5 100644 --- a/packages/ui-vue/components/message-box/src/locales/ui/en.json +++ b/packages/ui-vue/components/message-box/src/locales/ui/en.json @@ -27,8 +27,8 @@ "happend": "Happened Time", "detail": "Detail", "copy": "Copy Details", - "copySuccess": "Copy Succeeded!", - "copyFailed": "Replication Failed!", + "copySuccess": "Copy Successful.", + "copyFailed": "Replication Failed.", "roger": "OK" } } -- Gitee From 7c95860c4c65bf3446a57c0c15bc2dd0cb84db26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=A7=80=E6=89=8D?= Date: Tue, 26 Aug 2025 10:29:22 +0800 Subject: [PATCH 05/34] =?UTF-8?q?fix:=20=E6=B6=88=E6=81=AF=E6=8F=90?= =?UTF-8?q?=E7=A4=BA=E5=A4=9A=E8=AF=AD=E8=B5=84=E6=BA=90=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/ui-vue/components/message-box/src/locales/ui/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ui-vue/components/message-box/src/locales/ui/en.json b/packages/ui-vue/components/message-box/src/locales/ui/en.json index 0dfb661a5..ba35ac8b4 100644 --- a/packages/ui-vue/components/message-box/src/locales/ui/en.json +++ b/packages/ui-vue/components/message-box/src/locales/ui/en.json @@ -28,7 +28,7 @@ "detail": "Detail", "copy": "Copy Details", "copySuccess": "Copy Successful.", - "copyFailed": "Replication Failed.", + "copyFailed": "Copy Failed.", "roger": "OK" } } -- Gitee From ade820380a0f492cbc7ceb525d36d870fc9751e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=A7=80=E6=89=8D?= Date: Tue, 26 Aug 2025 10:54:23 +0800 Subject: [PATCH 06/34] =?UTF-8?q?fix:=20=E6=97=A5=E6=9C=9F=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E6=A0=B7=E5=BC=8F=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../date-picker/src/components/calendar/calendar.component.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ui-vue/components/date-picker/src/components/calendar/calendar.component.tsx b/packages/ui-vue/components/date-picker/src/components/calendar/calendar.component.tsx index 7a8875ca9..68ca06451 100644 --- a/packages/ui-vue/components/date-picker/src/components/calendar/calendar.component.tsx +++ b/packages/ui-vue/components/date-picker/src/components/calendar/calendar.component.tsx @@ -206,7 +206,7 @@ export default defineComponent({ {showWeekNumber.value && - + {weekTitle.value} } -- Gitee From 2e027842469cc448dcbe51fb068b3a6796bc7a9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=A7=80=E6=89=8D?= Date: Tue, 26 Aug 2025 15:51:55 +0800 Subject: [PATCH 07/34] =?UTF-8?q?fix:=20=E5=88=97=E8=A1=A8Lookup=E4=BA=A4?= =?UTF-8?q?=E4=BA=92=E4=BA=8B=E4=BB=B6=E5=8A=A0=E5=85=A5=E7=A9=BA=E5=88=A4?= =?UTF-8?q?=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/property-config/data-grid-column.property-config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ui-vue/components/data-grid/src/property-config/data-grid-column.property-config.ts b/packages/ui-vue/components/data-grid/src/property-config/data-grid-column.property-config.ts index 4eba1e3cb..8585e0bb7 100644 --- a/packages/ui-vue/components/data-grid/src/property-config/data-grid-column.property-config.ts +++ b/packages/ui-vue/components/data-grid/src/property-config/data-grid-column.property-config.ts @@ -130,7 +130,7 @@ export class DataGriColumnProperty extends BaseControlProperty { ]; // 列编辑器事件 - if (propertyData.editor.type === 'lookup') { + if (propertyData?.editor?.type === 'lookup') { events = [...events, ...LookupEvents]; if (propertyData.editor.openType === 'Popup') { events = events.filter(item => item.label !== 'beforeSelectData'); -- Gitee From 27f902ebdd1bfb64aba807b0a777e61a39f15b13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=A7=80=E6=89=8D?= Date: Wed, 27 Aug 2025 09:13:07 +0800 Subject: [PATCH 08/34] =?UTF-8?q?feature:=20=E8=AE=BE=E8=AE=A1=E6=97=B6?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E8=87=AA=E5=AE=9A=E4=B9=89=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/form-designer/form-designer.component.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/designer/src/components/components/form-designer/form-designer.component.tsx b/packages/designer/src/components/components/form-designer/form-designer.component.tsx index cd493444e..048c845bb 100644 --- a/packages/designer/src/components/components/form-designer/form-designer.component.tsx +++ b/packages/designer/src/components/components/form-designer/form-designer.component.tsx @@ -342,8 +342,8 @@ export default defineComponent({ class={formDesignerViewClass.value}>可视化设计器
onChangeDesignerView('formDesignerCode')} class={formDesignerCodeViewClass.value}>设计时代码
- {/*
onChangeDesignerView('customClassEditor')} - class={customClassEditorClass.value}>自定义样式
*/} +
onChangeDesignerView('customClassEditor')} + class={customClassEditorClass.value}>自定义样式
-- Gitee From 9a653e11aa29c79821a66c451463c505a49fa107 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=A7=80=E6=89=8D?= Date: Wed, 27 Aug 2025 10:31:58 +0800 Subject: [PATCH 09/34] =?UTF-8?q?fix:=20=E6=97=A5=E6=9C=9F=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E8=AE=BE=E8=AE=A1=E6=97=B6=E9=85=8D=E7=BD=AE=E5=90=AF?= =?UTF-8?q?=E7=94=A8=E6=B8=85=E7=A9=BA=E6=8C=89=E9=92=AE=EF=BC=9B=E6=95=B0?= =?UTF-8?q?=E5=AD=97=E7=BB=84=E4=BB=B6=E8=AE=BE=E8=AE=A1=E6=97=B6=E5=90=AF?= =?UTF-8?q?=E7=94=A8=E5=A4=A7=E6=95=B0=E5=AD=97=E6=A0=B9=E6=8D=AE=E5=AE=9E?= =?UTF-8?q?=E4=BD=93=E4=B8=AD=E7=9A=84=E9=85=8D=E7=BD=AE=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E6=88=96=E9=9A=90=E8=97=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/property-config/date-picker.property-config.ts | 5 +++++ .../src/property-config/number-spinner.property-config.ts | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/packages/ui-vue/components/date-picker/src/property-config/date-picker.property-config.ts b/packages/ui-vue/components/date-picker/src/property-config/date-picker.property-config.ts index 5b8f4b351..20d70efd8 100644 --- a/packages/ui-vue/components/date-picker/src/property-config/date-picker.property-config.ts +++ b/packages/ui-vue/components/date-picker/src/property-config/date-picker.property-config.ts @@ -56,6 +56,11 @@ export class DatePickerProperty extends InputBaseProperty { } return this.getComponentConfig(propertyData, { type: "date-picker" }, { + enableClear: { + description: "是否显示清除按钮", + title: "启用清除", + type: "boolean", + }, selectMode:{ description: "", title: "显示类型", diff --git a/packages/ui-vue/components/number-spinner/src/property-config/number-spinner.property-config.ts b/packages/ui-vue/components/number-spinner/src/property-config/number-spinner.property-config.ts index df23253fc..10932f2e4 100644 --- a/packages/ui-vue/components/number-spinner/src/property-config/number-spinner.property-config.ts +++ b/packages/ui-vue/components/number-spinner/src/property-config/number-spinner.property-config.ts @@ -10,12 +10,15 @@ export class NumberSpinnerProperty extends InputBaseProperty { getEditorProperties(propertyData: any) { let maxPrecision; + let isBigNumber = false; if (propertyData?.binding?.type === 'Form') { const fieldInfo = this.schemaService.getFieldByIDAndVMID(propertyData.binding.field, this.viewModelId); if (fieldInfo?.schemaField?.type) { maxPrecision = fieldInfo.schemaField.type.precision; + isBigNumber = fieldInfo.schemaField.type.name === 'BigNumber'; } } + const editorProperties = this.getComponentConfig(propertyData, { "type": "number-spinner" }, { precision: { description: "", @@ -85,6 +88,7 @@ export class NumberSpinnerProperty extends InputBaseProperty { description: "", title: "启用大数字", type: "boolean", + visible: isBigNumber }, showZero: { description: "", -- Gitee From c5fd952342c7e2b4e3aba843ee9dc357fc82733f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=A7=80=E6=89=8D?= Date: Wed, 27 Aug 2025 16:37:16 +0800 Subject: [PATCH 10/34] =?UTF-8?q?fix:=20=E8=A1=A8=E5=8D=95=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E6=97=B6=E6=94=AF=E6=8C=81=E8=AE=BE=E7=BD=AE=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/renderer/src/composition/index.ts | 1 + .../src/composition/use-custom-css.ts | 22 +++++++++++++++++-- packages/renderer/src/page.vue | 5 ++--- .../number-spinner.property-config.ts | 1 + 4 files changed, 24 insertions(+), 5 deletions(-) diff --git a/packages/renderer/src/composition/index.ts b/packages/renderer/src/composition/index.ts index 1ebf74326..1169397fe 100644 --- a/packages/renderer/src/composition/index.ts +++ b/packages/renderer/src/composition/index.ts @@ -24,3 +24,4 @@ export * from './use-html-template-transformer'; export * from './use-component-config-dependency-resolver'; export * from './use-custom-component-renders'; export * from './use-translate'; +export * from './use-custom-css'; diff --git a/packages/renderer/src/composition/use-custom-css.ts b/packages/renderer/src/composition/use-custom-css.ts index 6d0d9f268..c26c9fcbd 100644 --- a/packages/renderer/src/composition/use-custom-css.ts +++ b/packages/renderer/src/composition/use-custom-css.ts @@ -1,6 +1,6 @@ import { Ref } from "vue"; -export function useCustomCss(metadataRef: Ref) { +export function useCustomCss(metadataRef: Ref, isChildComponent: boolean = false) { const hasCustomStyleContent = () => { const {customClass} = metadataRef.value.form.content.module; if (customClass) { @@ -12,6 +12,15 @@ export function useCustomCss(metadataRef: Ref) { return false; }; + const getHrefParam = (key: string) => { + const queryParam = window.location.href.substring(window.location.href.indexOf('?') + 1); + const queryVars = queryParam.split('&'); + for (const queryVar of queryVars) { + const pair = queryVar.split('='); + if (pair[0] === key) { return pair[1]; } + } + }; + function customStyleFilePath() { if (!hasCustomStyleContent()) { return ''; @@ -22,7 +31,16 @@ export function useCustomCss(metadataRef: Ref) { if (replativePath) { const formCode = code.toLowerCase(); const paths = replativePath.split('/'); - return `${paths[0]}/${paths[1]}/web/${projectName}/${formCode}/${formCode}.css`; + + const dim1 = getHrefParam('dim1'); + const dim2 = getHrefParam('dim2'); + + let cssFile = `${formCode}.css`; + if (dim1 && dim2 && !isChildComponent) { + cssFile = `${dim1}/${dim2}/${formCode}.css`; + } + + return `${paths[0]}/${paths[1]}/web/${projectName}/${formCode}/${cssFile}`; } return ''; } diff --git a/packages/renderer/src/page.vue b/packages/renderer/src/page.vue index cb6bd74b1..89167e7b9 100644 --- a/packages/renderer/src/page.vue +++ b/packages/renderer/src/page.vue @@ -6,10 +6,9 @@ import { useEvent, useModuleConfig, useParamPersistence, useComponentProviders, useLookupProvide, useUIBinding, useEventEmitter, useNavigation, usePagination, useFormInjector, useEventHandlers, useModuleCreator, useModelValue, useSession, useComponentConfigDependencyResolver, useHtmlTemplateTransformer, useCallbackHandlerRegistry, - useTranslate + useTranslate, useCustomCss } from './composition/index'; import { useCommunication } from './communications/index'; -import { useCustomCss } from './composition/use-custom-css'; import { ModuleI18nTransformer, GlobalTranslate } from './i18n'; const props = defineProps({ @@ -64,7 +63,7 @@ useEventHandlers(formInjector); useNavigation(formInjector); usePagination(formInjector); useLookupProvide(formInjector, module); -useCustomCss(metadatas); +useCustomCss(metadatas, !!parentContainerId); // 视图层依赖的数据和方法 diff --git a/packages/ui-vue/components/number-spinner/src/property-config/number-spinner.property-config.ts b/packages/ui-vue/components/number-spinner/src/property-config/number-spinner.property-config.ts index 10932f2e4..6450f47b2 100644 --- a/packages/ui-vue/components/number-spinner/src/property-config/number-spinner.property-config.ts +++ b/packages/ui-vue/components/number-spinner/src/property-config/number-spinner.property-config.ts @@ -88,6 +88,7 @@ export class NumberSpinnerProperty extends InputBaseProperty { description: "", title: "启用大数字", type: "boolean", + readonly: true, visible: isBigNumber }, showZero: { -- Gitee From c4fa6c41fe7af747fb83ed96b928ac11a21822c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=A7=80=E6=89=8D?= Date: Thu, 28 Aug 2025 13:45:00 +0800 Subject: [PATCH 11/34] =?UTF-8?q?fix:=20=E8=A1=A8=E5=8D=95=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E6=A0=B7=E5=BC=8F=E5=85=BC=E5=AE=B9=20linux?= =?UTF-8?q?=20=E7=B3=BB=E7=BB=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/composition/use-custom-css.ts | 21 +++++++++++++------ .../form-metadata-data-service.ts | 4 ++-- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/packages/renderer/src/composition/use-custom-css.ts b/packages/renderer/src/composition/use-custom-css.ts index c26c9fcbd..48353ade6 100644 --- a/packages/renderer/src/composition/use-custom-css.ts +++ b/packages/renderer/src/composition/use-custom-css.ts @@ -21,23 +21,32 @@ export function useCustomCss(metadataRef: Ref, isChildComponent: boolean = false } }; + function customStyleFilePath() { if (!hasCustomStyleContent()) { return ''; } - const {code, projectName} = metadataRef.value.form.content.module; + const {code, projectName, dimensionInfo} = metadataRef.value.form.content.module; const replativePath = metadataRef.value.form.relativePath; + if (replativePath) { const formCode = code.toLowerCase(); const paths = replativePath.split('/'); - + const dim1 = getHrefParam('dim1'); const dim2 = getHrefParam('dim2'); - + let cssFile = `${formCode}.css`; - if (dim1 && dim2 && !isChildComponent) { - cssFile = `${dim1}/${dim2}/${formCode}.css`; + if (dim1 && dim2) { + if (!isChildComponent) { + cssFile = `${dim1}/${dim2}/${formCode}.css`; + } else { + const {extented} = metadataRef.value.form; + if (extented && dimensionInfo) { + cssFile = `${dimensionInfo.dim1}/${dimensionInfo.dim2}/${formCode}.css`; + } + } } return `${paths[0]}/${paths[1]}/web/${projectName}/${formCode}/${cssFile}`; @@ -53,7 +62,7 @@ export function useCustomCss(metadataRef: Ref, isChildComponent: boolean = false const link = document.createElement('link'); link.rel = 'stylesheet'; link.type = 'text/css'; - link.href = url; + link.href = url.toLowerCase(); // 添加到 document.head.appendChild(link); diff --git a/packages/renderer/src/metadata/data-service/form-metadata-data-service.ts b/packages/renderer/src/metadata/data-service/form-metadata-data-service.ts index cc197ba76..4c2734932 100644 --- a/packages/renderer/src/metadata/data-service/form-metadata-data-service.ts +++ b/packages/renderer/src/metadata/data-service/form-metadata-data-service.ts @@ -24,10 +24,10 @@ export class FormMetadataDataService { } private createMetadata(response: any) { - const { type, code,nameSpace:namespace } = response; + const { type, code,nameSpace:namespace, extented } = response; const { Contents: content } = JSON.parse(response.content); const refs = JSON.parse(response.refs); - const metadata = { id: response.id, content, refs, relativePath: response.relativePath, type, code,namespace }; + const metadata = { id: response.id, content, refs, relativePath: response.relativePath, type, code,namespace, extented }; return metadata; } } -- Gitee From 642356ceaacfe79fb8204b05f70f6b04f5634f05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=A7=80=E6=89=8D?= Date: Thu, 28 Aug 2025 14:43:10 +0800 Subject: [PATCH 12/34] =?UTF-8?q?fix:=20=E6=B8=85=E9=99=A4=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E6=A0=B7=E5=BC=8F=E7=BC=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/renderer/src/composition/use-custom-css.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/renderer/src/composition/use-custom-css.ts b/packages/renderer/src/composition/use-custom-css.ts index 48353ade6..c9934179e 100644 --- a/packages/renderer/src/composition/use-custom-css.ts +++ b/packages/renderer/src/composition/use-custom-css.ts @@ -49,7 +49,7 @@ export function useCustomCss(metadataRef: Ref, isChildComponent: boolean = false } } - return `${paths[0]}/${paths[1]}/web/${projectName}/${formCode}/${cssFile}`; + return `${paths[0]}/${paths[1]}/web/${projectName}/${formCode}/${cssFile}?version=${Date.now()}`; } return ''; } -- Gitee From 2835dfbfbbc082e21d6ec4b71a6fdb5229ae8ff0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=A7=80=E6=89=8D?= Date: Thu, 28 Aug 2025 16:25:46 +0800 Subject: [PATCH 13/34] =?UTF-8?q?feature:=20lookup=E5=8D=95=E9=80=89?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E6=94=AF=E6=8C=81=E5=8F=8C=E5=87=BB=E9=80=89?= =?UTF-8?q?=E4=B8=AD=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../favorite/lookup-favorite.component.tsx | 23 +++++++++++++++++-- .../components/lookup-container.component.tsx | 2 +- .../lookup/src/composition/use-datagrid.tsx | 8 +++++++ .../lookup/src/composition/use-treegrid.tsx | 11 ++++++++- .../lookup/src/lookup.component.tsx | 11 ++++++++- .../property-config/lookup.property-config.ts | 14 +++++------ 6 files changed, 57 insertions(+), 12 deletions(-) diff --git a/packages/ui-vue/components/lookup/src/components/favorite/lookup-favorite.component.tsx b/packages/ui-vue/components/lookup/src/components/favorite/lookup-favorite.component.tsx index c15dbacd4..d1ad46128 100644 --- a/packages/ui-vue/components/lookup/src/components/favorite/lookup-favorite.component.tsx +++ b/packages/ui-vue/components/lookup/src/components/favorite/lookup-favorite.component.tsx @@ -15,6 +15,7 @@ import { LOOKUP_TREEROW_OPTIONS, useTreeRowOptions } from "../../composition/use export default defineComponent({ name: 'FLookupFavorite', props: lookupFavoriteComponentProps, + emits: ['dblClickRow'], setup(props, context) { const treeRowOptions = inject(LOOKUP_TREEROW_OPTIONS); const {userDataState, getFavoriteData}: any = inject(LOOKUP_USER_DATA_SERVICE); @@ -140,6 +141,21 @@ export default defineComponent({ } } + function onDoubleClickRow(index: number, itemData: any) { + if (!props.multiSelect) { + updateSelections([itemData]); + context.emit("dblClickRow", { items: [itemData] }); + } + } + + function onDblclickNode($event: { $event: MouseEvent, node: Record}) { + const { node } = $event; + if (!props.multiSelect) { + updateSelections([node]); + context.emit("dblClickRow", { items: [node] }); + } + } + function renderTreeGrid() { return ; + onUnSelectItem={onUnSelectItem} + onDblclickNode={onDblclickNode} + >; }; function renderDataGrid() { @@ -168,7 +186,8 @@ export default defineComponent({ fit={true} selection={selectionOption} onSelectionChange={onSelectionChange} - onUnSelectItem={onUnSelectItem}> + onUnSelectItem={onUnSelectItem} + onDoubleClickRow={onDoubleClickRow}> ; } diff --git a/packages/ui-vue/components/lookup/src/components/lookup-container.component.tsx b/packages/ui-vue/components/lookup/src/components/lookup-container.component.tsx index be4158d2c..c0f33808d 100644 --- a/packages/ui-vue/components/lookup/src/components/lookup-container.component.tsx +++ b/packages/ui-vue/components/lookup/src/components/lookup-container.component.tsx @@ -17,7 +17,7 @@ export default defineComponent({ name: "LookupContainer", props: lookupProps, emits: ['update:modelValue', 'search', 'navSelectionsChanged', 'pageIndexChanged', 'pageSizeChanged', - 'changeDialogOptions', 'clearSearch' + 'changeDialogOptions', 'clearSearch', 'dblClickRow' ], setup(props: LookupProps, context) { const currentTab = inject>(LOOKUP_ACTIVE_TAB, ref(LookupTabs.dataList)); diff --git a/packages/ui-vue/components/lookup/src/composition/use-datagrid.tsx b/packages/ui-vue/components/lookup/src/composition/use-datagrid.tsx index faf8e50dd..55686e439 100644 --- a/packages/ui-vue/components/lookup/src/composition/use-datagrid.tsx +++ b/packages/ui-vue/components/lookup/src/composition/use-datagrid.tsx @@ -107,6 +107,13 @@ export function useDatagrid(props: LookupProps, context: SetupContext, navigatio context.emit("selectionsChanged", { items }); } + function onDoubleClickRow(index: number, itemData: any) { + if (!lookupOptions.multiSelect && props.openType === 'Modal') { + updateSelections([itemData]); + context.emit("dblClickRow", { items: [itemData] }); + } + } + function onUnSelectItem(items: any) { updateSelections(items?.raw, false); } @@ -196,6 +203,7 @@ export function useDatagrid(props: LookupProps, context: SetupContext, navigatio onSelectionChange={onSelectionChange} onUnSelectItem={onUnSelectItem} onChanged={onPageInfoChanged} + onDoubleClickRow={onDoubleClickRow} > ; }; diff --git a/packages/ui-vue/components/lookup/src/composition/use-treegrid.tsx b/packages/ui-vue/components/lookup/src/composition/use-treegrid.tsx index a68462624..7057bcc23 100644 --- a/packages/ui-vue/components/lookup/src/composition/use-treegrid.tsx +++ b/packages/ui-vue/components/lookup/src/composition/use-treegrid.tsx @@ -161,6 +161,14 @@ export function useTreegrid(props: LookupProps, context: SetupContext) { }); } + function onDblclickNode($event: { $event: MouseEvent, node: Record}) { + const { node } = $event; + if (!lookupOptions.multiSelect && props.openType === 'Modal') { + updateSelections([node]); + context.emit("dblClickRow", { items: [node] }); + } + } + function renderTreeGrid() { return ; + loadData={loadChildren} + onDblclickNode={onDblclickNode}>; }; return { diff --git a/packages/ui-vue/components/lookup/src/lookup.component.tsx b/packages/ui-vue/components/lookup/src/lookup.component.tsx index 81333640e..dd88acb4b 100644 --- a/packages/ui-vue/components/lookup/src/lookup.component.tsx +++ b/packages/ui-vue/components/lookup/src/lookup.component.tsx @@ -192,7 +192,7 @@ export default defineComponent({ function onCloseModal($event: MouseEvent) { const modalInstance = modalService?.getCurrentModal(); - if (modalInstance) { + if (modalService) { modalInstance.close($event); } } @@ -256,6 +256,13 @@ export default defineComponent({ searchValueChanged.value = false; } + async function onDblClickRow($event) { + const result = await submitDialog(); + if (result) { + modalService?.close(); + } + } + context.expose({ openDialog, updateIdValue, @@ -307,12 +314,14 @@ export default defineComponent({ onPageIndexChanged={onPageIndexChanged} onPageSizeChanged={onPageSizeChanged} onChangeDialogOptions={updateDialogOptions} + onDblClickRow={onDblClickRow} > ), fav: () => ( props.enableFavorite && ) }} diff --git a/packages/ui-vue/components/lookup/src/property-config/lookup.property-config.ts b/packages/ui-vue/components/lookup/src/property-config/lookup.property-config.ts index d97fbb398..6d6df29e7 100644 --- a/packages/ui-vue/components/lookup/src/property-config/lookup.property-config.ts +++ b/packages/ui-vue/components/lookup/src/property-config/lookup.property-config.ts @@ -394,6 +394,13 @@ export class LookupPropertyConfig extends InputBaseProperty { title: "启用搜索栏", type: "boolean" }, + searchAnyField: { + description: "显示所有列", + $converter: lookupDefaultConverter, + title: "允许查询所有列", + type: "boolean", + visible: propertyData.editor.openType !== 'Popup' && propertyData.editor.enableSearchBar == null ? true : !!propertyData.editor.enableSearchBar + }, enableEqualSearch: { $converter: lookupDefaultConverter, description: "是否启用等于搜索", @@ -691,13 +698,6 @@ export class LookupPropertyConfig extends InputBaseProperty { type: "boolean", visible: false }, - searchAnyField: { - description: "显示所有列", - $converter: lookupDefaultConverter, - title: "允许查询所有列", - type: "boolean", - visible: editorOptions.openType !== 'Popup' && editorOptions.enableSearchBar == null ? true : !!editorOptions.enableSearchBar - }, enableFavorite: { description: "启用收藏夹", $converter: lookupDefaultConverter, -- Gitee From 94c82416b1c9ba16284baf328947cd85adb119ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=A7=80=E6=89=8D?= Date: Fri, 29 Aug 2025 11:15:04 +0800 Subject: [PATCH 14/34] =?UTF-8?q?fix:=20datepicker=20=E5=BF=AB=E6=8D=B7?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E5=8A=9F=E8=83=BD=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../date-picker-container.component.tsx | 9 ++++++++- .../src/components/date-range/date-range.props.ts | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/ui-vue/components/date-picker/src/components/date-picker-container/date-picker-container.component.tsx b/packages/ui-vue/components/date-picker/src/components/date-picker-container/date-picker-container.component.tsx index b0dd4f932..8e25d0bff 100644 --- a/packages/ui-vue/components/date-picker/src/components/date-picker-container/date-picker-container.component.tsx +++ b/packages/ui-vue/components/date-picker/src/components/date-picker-container/date-picker-container.component.tsx @@ -1254,7 +1254,14 @@ export default defineComponent({ } const renderQuickSelector = () => { - const items = enablePeriod.value? quickSelectorList.range : quickSelectorList.single; + const items = enablePeriod.value? quickSelectorList.range.filter(item => { + const startDateObject = convertDateToDateObject(item.value[0]); + const endDateObject = convertDateToDateObject(item.value[1]); + return !refDisableDate.isDisabledDate(startDateObject) && !refDisableDate.isDisabledDate(endDateObject); + }) : quickSelectorList.single.filter(item => { + const dateObject = convertDateToDateObject(item.value); + return !refDisableDate.isDisabledDate(dateObject); + }); return
    {items.map((item, index) => { return
  • onQuickSelected(item, $event)}>{item.label}
  • ; diff --git a/packages/ui-vue/components/date-picker/src/components/date-range/date-range.props.ts b/packages/ui-vue/components/date-picker/src/components/date-range/date-range.props.ts index 7cee8c762..70f61dccc 100644 --- a/packages/ui-vue/components/date-picker/src/components/date-range/date-range.props.ts +++ b/packages/ui-vue/components/date-picker/src/components/date-range/date-range.props.ts @@ -1,5 +1,5 @@ import { ExtractPropTypes, PropType } from 'vue'; -import { datePickerProps } from '../../..'; +import { datePickerProps } from '../../date-picker.props'; import { DatePickerLocale } from '../../composition/use-locales'; export const dateRangeProps = { -- Gitee From b17ce76ebc297cf5e7e2f2197e90dccfc61a20b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=A7=80=E6=89=8D?= Date: Fri, 29 Aug 2025 11:41:17 +0800 Subject: [PATCH 15/34] =?UTF-8?q?fix:=20=E6=B8=85=E7=A9=BA=E5=90=8E?= =?UTF-8?q?=E9=9A=90=E8=97=8Flookup=E4=B8=8B=E6=8B=89=E9=9D=A2=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/ui-vue/components/lookup/src/lookup.component.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/ui-vue/components/lookup/src/lookup.component.tsx b/packages/ui-vue/components/lookup/src/lookup.component.tsx index dd88acb4b..40574dbac 100644 --- a/packages/ui-vue/components/lookup/src/lookup.component.tsx +++ b/packages/ui-vue/components/lookup/src/lookup.component.tsx @@ -151,6 +151,10 @@ export default defineComponent({ context.emit('update:modelValue', ''); updateIdValue(''); + if (openType.value === 'Popup') { + isPopuped.value && elementRef.value?.hidePopup(); + } + const clearParams = { items: null, mappingFields: lookupOptions.mappingFields }; context.emit('clear', clearParams); useContext(props, clearParams); -- Gitee From 261c804da342f44ba7a3a37c0215d27b52588411 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=A7=80=E6=89=8D?= Date: Fri, 29 Aug 2025 16:24:41 +0800 Subject: [PATCH 16/34] =?UTF-8?q?fix:=20=E6=97=A5=E6=9C=9F=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E6=98=93=E7=94=A8=E6=80=A7=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../date-picker-container.component.tsx | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/packages/ui-vue/components/date-picker/src/components/date-picker-container/date-picker-container.component.tsx b/packages/ui-vue/components/date-picker/src/components/date-picker-container/date-picker-container.component.tsx index 8e25d0bff..b69266d3b 100644 --- a/packages/ui-vue/components/date-picker/src/components/date-picker-container/date-picker-container.component.tsx +++ b/packages/ui-vue/components/date-picker/src/components/date-picker-container/date-picker-container.component.tsx @@ -189,6 +189,8 @@ export default defineComponent({ displayTextOfYear: `${selectedDateObj.value.year}` }); + const currentActiveMonth = ref(cloneDeep(activeMonth.value)); + selectedMonth.value = { year: selectedDate.value?.year, month: selectedDate.value?.month, @@ -342,6 +344,9 @@ export default defineComponent({ displayTextOfYear: `${previousYear}` }; activeMonth.value = previous; + if (selectingMonth.value) { + selectedMonth.value = {...selectedMonth.value, ...{ year: previous.year, month: previous.month }}; + } } else { const previousYear = secondaryActiveMonth.value.year - (selectingSecondaryYear.value ? 10 : 1); const previous = { @@ -364,6 +369,7 @@ export default defineComponent({ displayTextOfYear: `${previousMonthDate.year}` }; activeMonth.value = previous; + selectedMonth.value = {...selectedMonth.value, ...{ year: previous.year, month: previous.month }}; } else { const previousMonthDate = getPreviousMonth(secondaryActiveMonth.value.month, secondaryActiveMonth.value.year); const previous = { @@ -386,6 +392,7 @@ export default defineComponent({ displayTextOfYear: `${nextMonthDate.year}` }; activeMonth.value = next; + selectedMonth.value = {...selectedMonth.value, ...{ year: next.year, month: next.month }}; } else { const nextMonthDate = getNextMonth(secondaryActiveMonth.value.month, secondaryActiveMonth.value.year); const next = { @@ -411,6 +418,9 @@ export default defineComponent({ displayTextOfYear: `${nextYear}` }; activeMonth.value = next; + if (selectingMonth.value) { + selectedMonth.value = {...selectedMonth.value, ...{ year: next.year, month: next.month }}; + } } else { let nextYear = secondaryActiveMonth.value.year + 1; if (selectingSecondaryYear.value) { @@ -446,6 +456,15 @@ export default defineComponent({ } else { selectingMonth.value = false; } + + if (!enablePeriod.value) { + if (selectingYear.value) { + currentActiveMonth.value = cloneDeep(activeMonth.value); + } else { + activeMonth.value = cloneDeep(currentActiveMonth.value); + } + } + } else { selectingSecondaryYear.value = selectMode.value === 'year' ? true : !selectingSecondaryYear.value; if (selectMode.value === 'month') { @@ -756,6 +775,8 @@ export default defineComponent({ year: currentMonth.year || 1, displayTextOfYear: `${currentMonth.year}` }; + currentActiveMonth.value = cloneDeep(activeMonth.value); + if (selectMode.value === 'month') { if (!enablePeriod.value) { context.emit('datePicked', currentMonth); @@ -827,7 +848,7 @@ export default defineComponent({ enableKeyboadNavigate: enableKeyboadNavigate.value, enableMarkCurrent: enableMarkCurrent.value, enablePeriod: enablePeriod.value, - selected: selectedDate.value, + selected: selectedMonth.value, selectedPeriod: selectedPeriod.value, selectMode: selectMode.value }; @@ -852,6 +873,7 @@ export default defineComponent({ year: currentYear.year || 1, displayTextOfYear: `${currentYear.year}` }; + currentActiveMonth.value = cloneDeep(activeMonth.value); if (selectMode.value === 'year') { if (!enablePeriod.value) { @@ -862,6 +884,7 @@ export default defineComponent({ } else { selectingMonth.value = true; selectingYear.value = false; + selectedMonth.value = Object.assign(selectedMonth.value || {}, { year: currentYear.year }); } } else { -- Gitee From 422febefff0c57bf118e47a33912160bf2402961 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=A7=80=E6=89=8D?= Date: Fri, 29 Aug 2025 18:39:59 +0800 Subject: [PATCH 17/34] =?UTF-8?q?fix:=20=E6=97=A5=E6=9C=9F=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E5=8C=BA=E9=97=B4=E9=80=89=E5=80=BC=E6=A0=B7=E5=BC=8F?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../date-picker-container.component.tsx | 12 ++++++------ .../time-picker/src/components/time.component.tsx | 9 +++++++-- .../time-picker/src/composition/time-holder.ts | 2 +- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/packages/ui-vue/components/date-picker/src/components/date-picker-container/date-picker-container.component.tsx b/packages/ui-vue/components/date-picker/src/components/date-picker-container/date-picker-container.component.tsx index b69266d3b..6412b2de5 100644 --- a/packages/ui-vue/components/date-picker/src/components/date-picker-container/date-picker-container.component.tsx +++ b/packages/ui-vue/components/date-picker/src/components/date-picker-container/date-picker-container.component.tsx @@ -621,7 +621,7 @@ export default defineComponent({ // 区间 if (enablePeriod.value) { const { from, to, emit } = setNewDateRange(selectedPeriod.value, currentDate); - selectedPeriod.value = { from, to }; + selectedPeriod.value = { from: cloneDeep(from), to: cloneDeep(to) }; if (!props.showTime && emit) { context.emit('datePicked', { startDate: from, endDate: to }); } @@ -631,9 +631,6 @@ export default defineComponent({ } else { const { year, month, day } = currentDate; selectedDate.value = Object.assign(selectedDate.value || {}, { year, month, day }); - // selectedDate.value.year = year; - // selectedDate.value.month = month; - // selectedDate.value.day = day; } } @@ -1277,11 +1274,14 @@ export default defineComponent({ } const renderQuickSelector = () => { - const items = enablePeriod.value? quickSelectorList.range.filter(item => { + /** + * .filter(item => { const startDateObject = convertDateToDateObject(item.value[0]); const endDateObject = convertDateToDateObject(item.value[1]); return !refDisableDate.isDisabledDate(startDateObject) && !refDisableDate.isDisabledDate(endDateObject); - }) : quickSelectorList.single.filter(item => { + }) + */ + const items = enablePeriod.value? quickSelectorList.range: quickSelectorList.single.filter(item => { const dateObject = convertDateToDateObject(item.value); return !refDisableDate.isDisabledDate(dateObject); }); diff --git a/packages/ui-vue/components/time-picker/src/components/time.component.tsx b/packages/ui-vue/components/time-picker/src/components/time.component.tsx index 8309fde23..3435a2569 100644 --- a/packages/ui-vue/components/time-picker/src/components/time.component.tsx +++ b/packages/ui-vue/components/time-picker/src/components/time.component.tsx @@ -55,7 +55,7 @@ export default defineComponent({ defaultOpenValue.value = props.defaultOpenValue; // 从TimeHolder获取修改的值 - watch(time.changedValue, (newValue: TimeValueText) => { + watch(() => time.changedValue.value, (newValue: TimeValueText) => { context.emit("valueChange", newValue); }); @@ -118,7 +118,12 @@ export default defineComponent({ if (isNotNull(value)) { time.text = value; const convertedValue = convertToDate(time.text, format.value); - time.setValue(convertedValue, use12Hours.value); + if (convertedValue) { + time.setValue(convertedValue, use12Hours.value); + } else { + time.setValue(new Date(), use12Hours.value); + time.update(); + } buildTimes(); } else { time.setUse12Hours(use12Hours.value); diff --git a/packages/ui-vue/components/time-picker/src/composition/time-holder.ts b/packages/ui-vue/components/time-picker/src/composition/time-holder.ts index dc8de3bd6..81287cf56 100644 --- a/packages/ui-vue/components/time-picker/src/composition/time-holder.ts +++ b/packages/ui-vue/components/time-picker/src/composition/time-holder.ts @@ -264,7 +264,7 @@ export class TimeHolder { } } - private update(): void { + update(): void { if (this.isEmpty) { this.temporaryValue = undefined; } else { -- Gitee From 684a180512330136a9d5851f5dc8f53e4f2a3307 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=A7=80=E6=89=8D?= Date: Sat, 30 Aug 2025 14:59:28 +0800 Subject: [PATCH 18/34] =?UTF-8?q?fix:=20=E6=97=A5=E6=9C=9F=E5=8C=BA?= =?UTF-8?q?=E9=97=B4=E6=93=8D=E4=BD=9C=E6=98=93=E7=94=A8=E6=80=A7=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../calendar-navbar.component.tsx | 9 +++++++ .../date-picker-container.component.tsx | 24 ++++++++++++------- .../src/components/month/month.component.tsx | 8 +++++-- 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/packages/ui-vue/components/date-picker/src/components/calendar-navbar/calendar-navbar.component.tsx b/packages/ui-vue/components/date-picker/src/components/calendar-navbar/calendar-navbar.component.tsx index aa516b6fa..1d266177e 100644 --- a/packages/ui-vue/components/date-picker/src/components/calendar-navbar/calendar-navbar.component.tsx +++ b/packages/ui-vue/components/date-picker/src/components/calendar-navbar/calendar-navbar.component.tsx @@ -161,11 +161,20 @@ export default defineComponent({ $event.stopPropagation(); context.emit('nextPage'); } + + const yearViewButtonStyle = computed(() => { + const style = {} as Record; + if (selectMode.value === 'year') { + style.cursor = 'default'; + } + return style; + }); function renderSelectYearButton() { return ( - ); - } - ) + if (props.footerToolbar?.buttons?.length) { + return renderToolbar(props.footerToolbar.buttons); } - ; + return buttons.value && !!buttons.value.length && buttons.value.map((button: DrawerButton) => { + const isDisabled = ref(button.disabled); + return ( + + ); + }); } function renderFooter() { return context.slots.footerTemplate? context.slots.footerTemplate() : renderFooterButtons(); } + context.expose({ + open: () => { modelValue.value = true; }, + close: () => { modelValue.value = false; } + }); + return () => { return ( -
    + {
    {modelValue.value &&
    { props.allowClickMaskToClose && onClose(e as MouseEvent); }, ['stop'])}>
    }
    -
    - {props.showHeader &&
    + {props.showHeader &&
    {context.slots.headerTemplate ? context.slots.headerTemplate() : props.title}
    + { props.headerToolbar &&
    + { renderToolbar(props.headerToolbar.buttons || [])} +
    } {props.showClose &&
    { @@ -204,13 +194,13 @@ export default defineComponent({
    {context.slots.content?.()}
    - {props.showFooter &&
    -
    +
    } ); }; diff --git a/packages/ui-vue/components/drawer/src/drawer.props.ts b/packages/ui-vue/components/drawer/src/drawer.props.ts index ae3dbc1d0..77886f1ef 100644 --- a/packages/ui-vue/components/drawer/src/drawer.props.ts +++ b/packages/ui-vue/components/drawer/src/drawer.props.ts @@ -27,6 +27,7 @@ export interface DrawerButton { } export const drawerProps = { + id: { type: String, required: true }, /** 背景色 */ backgroundColor: { type: String, default: '#fff' }, /** @@ -67,8 +68,13 @@ export const drawerProps = { host: { type: Object as PropType, default: 'body' }, showHeader: { type: Boolean, default: true }, + headerToolbar:{ type: Object as PropType, default: {} }, + showFooter: { type: Boolean, default: true }, - buttons: { type: Array, default: [] } + footerTemplate: { type: Object as PropType, default: null }, + footerToolbar:{ type: Object as PropType, default: {} }, + footerHeight: { type: Number, default: 60 }, + } as Record; export type DrawerProps = ExtractPropTypes; diff --git a/packages/ui-vue/components/drawer/src/property-config/drawer.property-config.ts b/packages/ui-vue/components/drawer/src/property-config/drawer.property-config.ts index 7a2800654..2577845ac 100644 --- a/packages/ui-vue/components/drawer/src/property-config/drawer.property-config.ts +++ b/packages/ui-vue/components/drawer/src/property-config/drawer.property-config.ts @@ -10,20 +10,28 @@ export class DrawerProperty extends BaseControlProperty { // 外观 this.propertyConfig.categories['appearance'] = this.getAppearanceConfig(propertyData); - this.getBehaviorConfig(); + this.getBehaviorConfig(propertyData); return this.propertyConfig; } - getBehaviorConfig() { + getBehaviorConfig(propertyData) { this.propertyConfig.categories['behavior'] = { title: "行为", description: "Behavior", properties: { + showHeader: { + title: "显示头部", + description: '是否显示头部', + type: 'boolean', + default: true, + refreshPanelAfterChanged: true, + }, title: { title: "标题", description: '标题', - type: 'string' + type: 'string', + visible: propertyData.showHeader !== false }, position: { title: "显示位置", @@ -53,14 +61,53 @@ export class DrawerProperty extends BaseControlProperty { default: true, visible: false }, + showFooter: { title: "显示底部", description: '是否显示底部', type: 'boolean', - default: true + default: true, + refreshPanelAfterChanged: true, + }, + footerHeight:{ + title: "底部高度", + description: '底部高度', + type: 'number', + editor: { + type: "number-spinner", + useThousands: false, + min: 30, + max: 1999 + }, + visible: propertyData.showFooter !== false + }, + footerContentType: { + title: "底部内容类型", + description: '底部内容类型', + type: 'select', + refreshPanelAfterChanged: true, + editor: { + type: 'combo-list', + textField: 'name', + valueField: 'value', + idField: 'value', + editable: false, + data: [{ value: 'toolbar', name: '工具栏'}, { value: 'html', name: '自定义模板' }, ] + }, + visible: propertyData.showFooter !== false + }, + footerTemplate: { + title: "底部模板", + type: 'string', + description: '设置标题HTML模板,替代图标和标题文字区域', + editor: { + type: "code-editor", + language: "html", + }, + visible: propertyData.footerContentType === 'html' && propertyData.showFooter !== false } }, - setPropertyRelates(changeObject, prop) { + setPropertyRelates: (changeObject, prop) => { if (!changeObject) { return; } @@ -69,9 +116,32 @@ export class DrawerProperty extends BaseControlProperty { changeObject.needRefreshControlTree = true; break; } + case 'showFooter': { + prop.footerToolbar ={ id: prop.id + '_footer-toolbar', 'type': 'response-toolbar', 'buttons': [] }; + prop.footerTemplate = ''; + prop.footerContentType = 'toolbar'; + break; + } + case 'footerContentType': { + this.resetFooterContent(prop, changeObject.propertyValue); + break; + } } } }; } + + private resetFooterContent(propertyData,contentType = 'toolbar') { + switch (contentType) { + case 'toolbar': { + propertyData.footerTemplate = ''; + break; + } + case 'html': { + propertyData.footerToolbar = null; + break; + } + } + } } diff --git a/packages/ui-vue/components/drawer/src/schema/drawer.schema.json b/packages/ui-vue/components/drawer/src/schema/drawer.schema.json index f6c1fa8f6..205e5ea95 100644 --- a/packages/ui-vue/components/drawer/src/schema/drawer.schema.json +++ b/packages/ui-vue/components/drawer/src/schema/drawer.schema.json @@ -57,6 +57,41 @@ "type": "boolean", "default": true }, + "headerToolbar": { + "description": "", + "type": "object", + "properties": { + "appearance": { + "description": "", + "type": "object", + "properties": { + "class": { + "type": "string", + "default": "col-3" + } + } + }, + "id": { + "description": "", + "type": "string" + }, + "type": { + "description": "", + "type": "string", + "default": "response-toolbar" + }, + "alignment": { + "description": "The alignment of Response Toolbar Button.", + "type": "string", + "default": "right" + }, + "buttons": { + "description": "The items of Response Toolbar.", + "type": "array", + "default": [] + } + } + }, "showFooter": { "description": "", "type": "boolean", @@ -67,7 +102,7 @@ "type": "boolean", "default": false }, - "toolbar": { + "footerToolbar": { "description": "", "type": "object", "properties": { @@ -106,6 +141,20 @@ "description": "", "type": "array", "default": [] + }, + "footerTemplate": { + "description": "", + "type": "object" + }, + "footerContentType": { + "description": "", + "type": "string", + "default": "toolbar" + }, + "footerHeight": { + "description": "", + "type": "number", + "default": 60 } }, "required": [ diff --git a/packages/ui-vue/components/response-toolbar/index.ts b/packages/ui-vue/components/response-toolbar/index.ts index e4e515aa1..e9f8e03d9 100644 --- a/packages/ui-vue/components/response-toolbar/index.ts +++ b/packages/ui-vue/components/response-toolbar/index.ts @@ -21,5 +21,5 @@ FResponseToolbar.registerDesigner = (componentMap: Record, propsRes componentMap['response-toolbar-item'] = FResponseToolbarItemDesign; propsResolverMap['response-toolbar-item'] = itemPropsResolver; }; -export { FResponseToolbar, ResponseToolbarDropDownItem, ResponseToolbarGroup, ResponseToolbarItem, responseToolbarResolver }; +export { FResponseToolbar, ResponseToolbarDropDownItem, ResponseToolbarGroup, ResponseToolbarItem, responseToolbarResolver , FResponseToolbarDesign}; export default withInstall(FResponseToolbar); -- Gitee From 088af119f727def4b199781cf0cca04d3a3e384b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=A7=80=E6=89=8D?= Date: Wed, 17 Sep 2025 18:49:08 +0800 Subject: [PATCH 33/34] =?UTF-8?q?feature:=20=E8=A1=A8=E5=8D=95=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E6=97=B6=E9=9B=86=E6=88=90=E4=BE=A7=E8=BE=B9=E6=A0=8F?= =?UTF-8?q?=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/designer/drawer.design.component.tsx | 17 +- .../src/designer/drawer.design.props.ts | 1 + .../drawer/src/drawer.component.tsx | 54 +++--- .../ui-vue/components/drawer/src/drawer.css | 24 +++ .../components/drawer/src/drawer.props.ts | 2 +- .../property-config/drawer.property-config.ts | 160 ++++++++++++------ .../drawer/src/schema/drawer.schema.json | 20 ++- 7 files changed, 195 insertions(+), 83 deletions(-) diff --git a/packages/ui-vue/components/drawer/src/designer/drawer.design.component.tsx b/packages/ui-vue/components/drawer/src/designer/drawer.design.component.tsx index 0a28ee6e0..32530dd43 100644 --- a/packages/ui-vue/components/drawer/src/designer/drawer.design.component.tsx +++ b/packages/ui-vue/components/drawer/src/designer/drawer.design.component.tsx @@ -172,17 +172,18 @@ export default defineComponent({ } return (
    -
    + {props.customHeader?
    : + <>
    {context.slots.title ? context.slots.title() : props.title}
    -
    -
    - { renderHeaderToolbar(headerToolbarId,headerToolbars.value, headertoolbarSchema.value)} -
    -
    - {props.showClose && renderDrawerCloseIcon()} -
    +
    + { renderHeaderToolbar(headerToolbarId,headerToolbars.value, headertoolbarSchema.value)} +
    +
    + {props.showClose && renderDrawerCloseIcon()} +
    + }
    ); }; diff --git a/packages/ui-vue/components/drawer/src/designer/drawer.design.props.ts b/packages/ui-vue/components/drawer/src/designer/drawer.design.props.ts index f5c4675d0..43ab16828 100644 --- a/packages/ui-vue/components/drawer/src/designer/drawer.design.props.ts +++ b/packages/ui-vue/components/drawer/src/designer/drawer.design.props.ts @@ -4,5 +4,6 @@ import { drawerProps } from "../drawer.props"; export const drawerPropsDesignerProps = Object.assign({}, drawerProps, { componentId: { type: String, default: '' }, footerContentType: { type: String, default: 'toolbar' }, + customHeader: { type: Boolean, default: false }, }); export type DrawerDesignerProps = ExtractPropTypes; diff --git a/packages/ui-vue/components/drawer/src/drawer.component.tsx b/packages/ui-vue/components/drawer/src/drawer.component.tsx index f6820baa8..5f23911ed 100644 --- a/packages/ui-vue/components/drawer/src/drawer.component.tsx +++ b/packages/ui-vue/components/drawer/src/drawer.component.tsx @@ -15,7 +15,7 @@ * limitations under the License. */ -import { computed, defineComponent, ref, SetupContext, Teleport, Transition, watch, withModifiers } from "vue"; +import { computed, defineComponent, Ref, ref, SetupContext, Teleport, Transition, watch, withModifiers } from "vue"; import FButton from '@farris/ui-vue/components/button'; import FResponseToolbar from '@farris/ui-vue/components/response-toolbar'; @@ -26,7 +26,7 @@ import { useDrawerLocale } from "./locale/locale"; export default defineComponent({ name: 'FDrawer', props: drawerProps, - emits: ['afterClose', 'update:modelValue'] as (string[] & ThisType) | undefined, + emits: ['afterClose', 'update:modelValue', 'click'] as (string[] & ThisType) | undefined, setup(props: DrawerProps, context: SetupContext) { const { drawerLocale } = useDrawerLocale(); const modelValue = ref(props.modelValue); @@ -105,7 +105,7 @@ export default defineComponent({ }); const onClickToolbarItem = (payload: any, itemId: string) => { - context.emit('Click', payload, itemId); + context.emit('click', payload, itemId); }; const buttonClickParams = { @@ -123,16 +123,21 @@ export default defineComponent({ } } - const renderToolbar = (buttons) => { + + const renderToolbar = (buttons, toolbarCustomClass: Record) => { return ; }; function renderFooterButtons() { if (props.footerToolbar?.buttons?.length) { - return renderToolbar(props.footerToolbar.buttons); + const customClass = {'f-utils-fill': true}; + if (props.footerToolbar?.appearance?.class) { + customClass[props.footerToolbar.appearance.class] = true; + } + return renderToolbar(props.footerToolbar.buttons, customClass); } return buttons.value && !!buttons.value.length && buttons.value.map((button: DrawerButton) => { const isDisabled = ref(button.disabled); @@ -154,6 +159,29 @@ export default defineComponent({ return context.slots.footerTemplate? context.slots.footerTemplate() : renderFooterButtons(); } + function renderHeader() { + const customClass = {'f-utils-fill': true}; + if (props.headerToolbar?.appearance?.class) { + customClass[props.headerToolbar.appearance.class] = true; + } + + return context.slots.headerTemplate? context.slots.headerTemplate() : <> +
    + {props.title} +
    + { props.headerToolbar &&
    + { renderToolbar(props.headerToolbar.buttons || [], customClass)} +
    } + {props.showClose && +
    + { + onClose(e as MouseEvent); + }, ['stop'])}> +
    + } + ; + } + context.expose({ open: () => { modelValue.value = true; }, close: () => { modelValue.value = false; } @@ -177,19 +205,7 @@ export default defineComponent({ }} v-show={modelValue.value}>
    {props.showHeader &&
    -
    - {context.slots.headerTemplate ? context.slots.headerTemplate() : props.title} -
    - { props.headerToolbar &&
    - { renderToolbar(props.headerToolbar.buttons || [])} -
    } - {props.showClose && -
    - { - onClose(e as MouseEvent); - }, ['stop'])}> -
    - } + {renderHeader()}
    }
    {context.slots.content?.()} diff --git a/packages/ui-vue/components/drawer/src/drawer.css b/packages/ui-vue/components/drawer/src/drawer.css index 11acd1252..d2235161a 100644 --- a/packages/ui-vue/components/drawer/src/drawer.css +++ b/packages/ui-vue/components/drawer/src/drawer.css @@ -18,8 +18,32 @@ display: flex; padding: 16px 24px; justify-content: space-between; + position: relative; } +.f-drawer-title { + flex: 1 1 auto; + margin: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + color: #000; + font-size: 1.125rem; +} + +.f-drawer-title::before{ + content: ''; + width: .25rem; + height: 1rem; + background: #2A87FF; + border-radius: 2px; + position: absolute; + top: 50%; + left: 10px; + margin-top: -.5rem; +} + + .f-drawer-close:hover { cursor: pointer; } diff --git a/packages/ui-vue/components/drawer/src/drawer.props.ts b/packages/ui-vue/components/drawer/src/drawer.props.ts index 77886f1ef..0e3ffd324 100644 --- a/packages/ui-vue/components/drawer/src/drawer.props.ts +++ b/packages/ui-vue/components/drawer/src/drawer.props.ts @@ -69,7 +69,7 @@ export const drawerProps = { showHeader: { type: Boolean, default: true }, headerToolbar:{ type: Object as PropType, default: {} }, - + headerTemplate:{ type: Object as PropType, default: null }, showFooter: { type: Boolean, default: true }, footerTemplate: { type: Object as PropType, default: null }, footerToolbar:{ type: Object as PropType, default: {} }, diff --git a/packages/ui-vue/components/drawer/src/property-config/drawer.property-config.ts b/packages/ui-vue/components/drawer/src/property-config/drawer.property-config.ts index 2577845ac..076a6ab24 100644 --- a/packages/ui-vue/components/drawer/src/property-config/drawer.property-config.ts +++ b/packages/ui-vue/components/drawer/src/property-config/drawer.property-config.ts @@ -10,68 +10,84 @@ export class DrawerProperty extends BaseControlProperty { // 外观 this.propertyConfig.categories['appearance'] = this.getAppearanceConfig(propertyData); - this.getBehaviorConfig(propertyData); + this.getBehaviorConfig(); + + this.propertyConfig.categories['header'] = this.headerPropertyConfig(propertyData); + this.propertyConfig.categories['footer'] = this.footerPropertyConfig(propertyData); return this.propertyConfig; } - getBehaviorConfig(propertyData) { - this.propertyConfig.categories['behavior'] = { - title: "行为", + private headerPropertyConfig(propertyData) { + return { + title: "页头", description: "Behavior", properties: { - showHeader: { - title: "显示头部", - description: '是否显示头部', + showHeader: { + title: "显示页头", + description: '是否显示页头', + type: 'boolean', + refreshPanelAfterChanged: true, + }, + customHeader:{ + title: "自定义页头", + description: '是否自定义页头', type: 'boolean', - default: true, refreshPanelAfterChanged: true, - }, + visible: propertyData.showHeader !== false + }, + showClose: { + title: "显示关闭按钮", + description: '是否显示关闭按钮', + type: 'boolean', + visible: propertyData.showHeader !== false && !propertyData.customHeader + }, title: { title: "标题", description: '标题', type: 'string', - visible: propertyData.showHeader !== false + visible: propertyData.showHeader !== false && !propertyData.customHeader }, - position: { - title: "显示位置", - description: '抽屉显示位置', - type: 'select', - default: 'right', + headerTemplate: { + title: "页头模板", + type:'string', + description: '设置标题HTML模板,替代整个页头区域', editor: { - type: 'combo-list', - textField: 'name', - valueField: 'value', - editable: false, - data: [ - { value: 'left', name: '左侧' }, - { value: 'right', name: '右侧' }, - ] + type: "code-editor", + language: "html", + }, + visible: propertyData.showHeader !== false && propertyData.customHeader + } + }, + setPropertyRelates: (changeObject, prop) => { + if (!changeObject) { + return; + } + switch (changeObject && changeObject.propertyID) { + case 'title': { + changeObject.needRefreshControlTree = true; + break; } - }, - width: { - title: "宽度", - description: '抽屉宽度', - type: 'number' - }, - showMask: { - title: "显示遮罩", - description: '是否显示遮罩', - type: 'boolean', - default: true, - visible: false - }, - - showFooter: { - title: "显示底部", - description: '是否显示底部', + } + } + }; + } + + private footerPropertyConfig(propertyData) { + return { + title: "页脚", + description: "Behavior", + properties: { + showFooter: { + title: "显示页脚", + description: '是否显示页脚', type: 'boolean', default: true, refreshPanelAfterChanged: true, }, footerHeight:{ - title: "底部高度", - description: '底部高度', + title: "页脚高度", + description: '页脚高度', type: 'number', editor: { type: "number-spinner", @@ -82,8 +98,8 @@ export class DrawerProperty extends BaseControlProperty { visible: propertyData.showFooter !== false }, footerContentType: { - title: "底部内容类型", - description: '底部内容类型', + title: "页脚内容类型", + description: '页脚内容类型', type: 'select', refreshPanelAfterChanged: true, editor: { @@ -97,7 +113,7 @@ export class DrawerProperty extends BaseControlProperty { visible: propertyData.showFooter !== false }, footerTemplate: { - title: "底部模板", + title: "页脚模板", type: 'string', description: '设置标题HTML模板,替代图标和标题文字区域', editor: { @@ -112,12 +128,8 @@ export class DrawerProperty extends BaseControlProperty { return; } switch (changeObject && changeObject.propertyID) { - case 'title': { - changeObject.needRefreshControlTree = true; - break; - } case 'showFooter': { - prop.footerToolbar ={ id: prop.id + '_footer-toolbar', 'type': 'response-toolbar', 'buttons': [] }; + prop.footerToolbar = { id: prop.id + '_footer-toolbar', 'type': 'response-toolbar', 'buttons': [] }; prop.footerTemplate = ''; prop.footerContentType = 'toolbar'; break; @@ -131,15 +143,59 @@ export class DrawerProperty extends BaseControlProperty { }; } + getBehaviorConfig() { + this.propertyConfig.categories['behavior'] = { + title: "行为", + description: "Behavior", + properties: { + + position: { + title: "显示位置", + description: '抽屉显示位置', + type: 'select', + default: 'right', + editor: { + type: 'combo-list', + textField: 'name', + valueField: 'value', + editable: false, + data: [ + { value: 'left', name: '左侧' }, + { value: 'right', name: '右侧' }, + ] + } + }, + width: { + title: "宽度", + description: '抽屉宽度', + type: 'number', + editor: { + type: "number-spinner", + useThousands: false, + min: 30, + max: 1999 + }, + }, + showMask: { + title: "显示遮罩", + description: '是否显示遮罩', + type: 'boolean', + default: true, + visible: false + }, + } + }; + } + - private resetFooterContent(propertyData,contentType = 'toolbar') { + private resetFooterContent(propertyData, contentType = 'toolbar') { switch (contentType) { case 'toolbar': { propertyData.footerTemplate = ''; break; } case 'html': { - propertyData.footerToolbar = null; + propertyData.footerToolbar = { id: propertyData.id + '_footer-toolbar', 'type': 'response-toolbar', 'buttons': [] }; break; } } diff --git a/packages/ui-vue/components/drawer/src/schema/drawer.schema.json b/packages/ui-vue/components/drawer/src/schema/drawer.schema.json index 205e5ea95..10f4cdfd5 100644 --- a/packages/ui-vue/components/drawer/src/schema/drawer.schema.json +++ b/packages/ui-vue/components/drawer/src/schema/drawer.schema.json @@ -45,7 +45,7 @@ "width": { "description": "", "type": "number", - "default": 300 + "default": 500 }, "showMask": { "description": "", @@ -57,6 +57,20 @@ "type": "boolean", "default": true }, + "showClose": { + "description": "", + "type": "boolean", + "default": true + }, + "customHeader": { + "description": "", + "type": "boolean", + "default": false + }, + "headerTemplate": { + "description": "", + "type": "object" + }, "headerToolbar": { "description": "", "type": "object", @@ -67,7 +81,7 @@ "properties": { "class": { "type": "string", - "default": "col-3" + "default": "" } } }, @@ -112,7 +126,7 @@ "properties": { "class": { "type": "string", - "default": "col-3" + "default": "" } } }, -- Gitee From ab109bb46c2e6b5f1efdd602812ca11520e2d8c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=A7=80=E6=89=8D?= Date: Wed, 17 Sep 2025 19:00:58 +0800 Subject: [PATCH 34/34] =?UTF-8?q?fix:=20drawer=E7=BB=84=E4=BB=B6props?= =?UTF-8?q?=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/ui-vue/components/drawer/src/drawer.props.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ui-vue/components/drawer/src/drawer.props.ts b/packages/ui-vue/components/drawer/src/drawer.props.ts index 0e3ffd324..6e16fcb78 100644 --- a/packages/ui-vue/components/drawer/src/drawer.props.ts +++ b/packages/ui-vue/components/drawer/src/drawer.props.ts @@ -74,7 +74,7 @@ export const drawerProps = { footerTemplate: { type: Object as PropType, default: null }, footerToolbar:{ type: Object as PropType, default: {} }, footerHeight: { type: Number, default: 60 }, - + buttons: { type: Array, default: [] } } as Record; export type DrawerProps = ExtractPropTypes; -- Gitee