|
|
@ -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> |
|
|
|