Browse Source

Merge remote-tracking branch 'origin/master'

master
修宁 6 months ago
parent
commit
142492b832
  1. 8
      src/components/data-form/DataForm.vue
  2. 29
      src/editor/widgets/property/PropertyPanel.vue
  3. 4
      src/editor/widgets/property/PropertyPanelConstant.ts
  4. 2
      src/editor/widgets/property/PropertyView.vue

8
src/components/data-form/DataForm.vue

@ -22,7 +22,7 @@ const emit = defineEmits<{
/** 表单字段变化 */ /** 表单字段变化 */
// fieldsChange: [changedFields: Array<FieldData>, allFields: Array<FieldData>]; // fieldsChange: [changedFields: Array<FieldData>, allFields: Array<FieldData>];
/** 表单值变化 */ /** 表单值变化 */
valuesChange: [changedValues: any, values: any]; dataChange: [newData: any];
}>(); }>();
// //
@ -73,7 +73,11 @@ if (Typeof.isObj(props.columnCount)) {
// //
if (props.autoLoadData && props.dataApi) reload().finally(); if (props.autoLoadData && props.dataApi) reload().finally();
// data // data
watch(() => state.data, newData => dataChange(state.dataFormItems, newData), { immediate: true, deep: true }); watch(() => state.data, newData => {
const firstDataChange = data.firstDataChange;
dataChange(state.dataFormItems, newData);
if (!firstDataChange) emit("dataChange", newData);
}, { immediate: true, deep: true });
// loading // loading
watch(() => state.loading, loading => emit("loadingChange", loading)); watch(() => state.loading, loading => emit("loadingChange", loading));
// ctxData() // ctxData()

29
src/editor/widgets/property/PropertyPanel.vue

@ -1,10 +1,12 @@
<script setup lang="ts"> <script setup lang="ts">
import lodash from "lodash";
import { computed, reactive } from "vue"; import { computed, reactive } from "vue";
import { ElCollapse, ElCollapseItem } from "element-plus"; import { ElCollapse, ElCollapseItem } from "element-plus";
import DataForm from "@/components/data-form/DataForm.vue"; import DataForm from "@/components/data-form/DataForm.vue";
import type { PropertyFlattenSetter, PropertySetterGroup } from "@/core/base/PropertyTypes.ts"; import type { PropertyFlattenSetter, PropertySetterGroup } from "@/core/base/PropertyTypes.ts";
import type { DataFormProps } from "@/components/data-form/DataFormTypes.ts"; import type { DataFormProps } from "@/components/data-form/DataFormTypes.ts";
import { defDataFormProps } from "@/editor/widgets/property/PropertyPanelConstant.ts"; import { defDataFormProps } from "@/editor/widgets/property/PropertyPanelConstant.ts";
import Viewport, { type ViewportState } from "@/core/engine/Viewport.ts";
defineOptions({ defineOptions({
name: 'PropertyPanel', name: 'PropertyPanel',
@ -14,6 +16,10 @@ defineOptions({
interface PropertyPanelProps { interface PropertyPanelProps {
/** 待编辑数据 */ /** 待编辑数据 */
data?: any; data?: any;
/** Viewport */
viewport: Viewport;
/** ViewportState */
viewportState: ViewportState;
/** 默认的DataFormProps */ /** 默认的DataFormProps */
defDataFormProps?: DataFormProps; defDataFormProps?: DataFormProps;
/** 最上面平铺的设置器 */ /** 最上面平铺的设置器 */
@ -27,11 +33,15 @@ const props = withDefaults(defineProps<PropertyPanelProps>(), {});
// State // State
interface PropertyPanelState { interface PropertyPanelState {
/** 待编辑数据 */
data?: any;
/** 已展开的分组 */
expandGroups: Array<string>; expandGroups: Array<string>;
} }
// state // state
const state = reactive<PropertyPanelState>({ const state = reactive<PropertyPanelState>({
data: lodash.cloneDeep(props.data),
expandGroups: [], expandGroups: [],
}); });
@ -62,6 +72,15 @@ function getCollapseItemId(group: PropertySetterGroup, idx: number) {
return `_${idx}_${group.title}`; return `_${idx}_${group.title}`;
} }
function onDataChange(newData: any) {
const viewport = props.viewport;
if (!viewport) return;
viewport.stateManager.beginStateUpdate();
lodash.merge(props.data, newData);
console.log("onDataChange", props.data === newData);
viewport.stateManager.endStateUpdate();
}
interface PropertyPanelExpose { interface PropertyPanelExpose {
state: PropertyPanelState; state: PropertyPanelState;
data: PropertyPanelData; data: PropertyPanelData;
@ -86,8 +105,9 @@ export type {
v-if="props.flatten" v-if="props.flatten"
class="property-panel-form" class="property-panel-form"
v-bind="flattenFormProps" v-bind="flattenFormProps"
:data="props.data" :data="state.data"
:formFields="props.flatten.fields" :formFields="props.flatten.fields"
@dataChange="onDataChange"
/> />
<ElCollapse v-if="props.groups" v-model="state.expandGroups"> <ElCollapse v-if="props.groups" v-model="state.expandGroups">
<ElCollapseItem <ElCollapseItem
@ -99,8 +119,9 @@ export type {
v-if="group" v-if="group"
class="property-panel-form" class="property-panel-form"
v-bind="getDefFormProps(group)" v-bind="getDefFormProps(group)"
:data="props.data" :data="state.data"
:formFields="props.flatten.fields" :formFields="props.flatten.fields"
@dataChange="onDataChange"
/> />
</ElCollapseItem> </ElCollapseItem>
</ElCollapse> </ElCollapse>
@ -108,5 +129,7 @@ export type {
</template> </template>
<style scoped> <style scoped>
.property-panel {
padding: 8px 12px 16px 0;
}
</style> </style>

4
src/editor/widgets/property/PropertyPanelConstant.ts

@ -4,7 +4,7 @@ import type { PropertyFieldSetter } from "@/core/base/PropertyTypes.ts";
const defDataFormProps: DataFormProps = { const defDataFormProps: DataFormProps = {
columnCount: 1, columnCount: 1,
layout: "onlyLabelFixed", layout: "onlyLabelFixed",
labelWidth: "100px", labelWidth: "60px",
size: "small", size: "small",
}; };
@ -20,7 +20,7 @@ const basicFieldsSetter: Array<PropertyFieldSetter> = [
inputProps: {}, inputProps: {},
}, },
{ {
dataPath: 'visible', label: '可见', input: 'Checkbox', dataPath: 'v', label: '可见', input: 'Checkbox',
inputProps: {}, inputProps: {},
}, },
{ {

2
src/editor/widgets/property/PropertyView.vue

@ -61,6 +61,8 @@ export default {
return { return {
key: data.id, key: data.id,
data: data, data: data,
viewport: this.viewport,
viewportState: state,
flatten: selectedObjectSetter.flatten, flatten: selectedObjectSetter.flatten,
groups: selectedObjectSetter.groups, groups: selectedObjectSetter.groups,
}; };

Loading…
Cancel
Save