Configurator.vue 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. <template>
  2. <div class="configurator">
  3. <!-- 页面设置 -->
  4. <Tabs v-if="projectStore.selectedElementKeys.length === 0" centered>
  5. <TabPane key="1" tab="页面">
  6. <div class="config-content">
  7. <PageConfig />
  8. </div>
  9. </TabPane>
  10. </Tabs>
  11. <!-- 组件设置 -->
  12. <Tabs centered v-else>
  13. <TabPane key="1" tab="内容">
  14. <div class="config-content">
  15. <component
  16. :is="configComponent"
  17. @change="handleContentConfigChange"
  18. v-bind="currentElementProps"
  19. />
  20. </div>
  21. </TabPane>
  22. <TabPane key="2" tab="事件">
  23. <div class="config-content">事件处理</div>
  24. </TabPane>
  25. <TabPane key="3" tab="动画">
  26. <div class="config-content">动画处理</div>
  27. </TabPane>
  28. <TabPane key="4" tab="组件">
  29. <div class="config-content">
  30. <CusForm :columns="formItems" @change="handleComponentConfigChange" />
  31. </div>
  32. </TabPane>
  33. </Tabs>
  34. </div>
  35. </template>
  36. <script setup lang="ts">
  37. import { shallowRef, watch } from "vue";
  38. import { Tabs, TabPane } from "ant-design-vue";
  39. import { useProjectStore } from "@/store/modules/project";
  40. import PageConfig from "./PageConfig.vue";
  41. import { asyncComponentAll, CusForm } from "shalu-dashboard-ui";
  42. import { set, defaultsDeep, cloneDeep } from "lodash";
  43. import { useComponentConfig } from "./useComponentConfig";
  44. const projectStore = useProjectStore();
  45. const configComponent = shallowRef<null | string>(null);
  46. const currentElementProps = shallowRef<any>({});
  47. const { formItems } = useComponentConfig();
  48. watch(
  49. () => projectStore.currentSelectedElements,
  50. async (val) => {
  51. if (val.length === 1) {
  52. const { Config } = await asyncComponentAll[
  53. val[0].componentType as keyof typeof asyncComponentAll
  54. ]?.();
  55. configComponent.value = Config;
  56. currentElementProps.value = val[0].props;
  57. } else {
  58. configComponent.value = null;
  59. currentElementProps.value = {};
  60. }
  61. },
  62. { immediate: true, deep: true }
  63. );
  64. // 组件内容配置
  65. const handleContentConfigChange = (config: any) => {
  66. const key = projectStore.selectedElementKeys[0];
  67. projectStore.updateElement(key, "props", config);
  68. };
  69. // 组件配置
  70. const handleComponentConfigChange = (config: Record<string, any>) => {
  71. const container: Record<string, any> = {};
  72. const currentContainer = cloneDeep(
  73. projectStore.currentSelectedElements[0].container
  74. );
  75. Object.entries(config).forEach(([key, value]) => {
  76. set(container, key, value);
  77. });
  78. defaultsDeep(container, currentContainer);
  79. const key = projectStore.selectedElementKeys[0];
  80. console.log(container);
  81. projectStore.updateElement(key, "container", container);
  82. projectStore.updateElement(key, "name", container?.name);
  83. };
  84. </script>
  85. <style lang="less" scoped>
  86. .configurator {
  87. width: 300px;
  88. height: 100%;
  89. display: flex;
  90. flex-direction: column;
  91. :deep(.ant-tabs) {
  92. flex: 1;
  93. overflow-y: scroll;
  94. }
  95. :deep(.ant-tabs-nav) {
  96. margin-bottom: 0;
  97. }
  98. :deep(.ant-tabs-content-holder) {
  99. background-color: @bg-color;
  100. padding-top: 12px;
  101. }
  102. :deep(.ant-tabs-content) {
  103. background-color: @bg-color;
  104. }
  105. .config-content {
  106. padding: 12px;
  107. padding-top: 0;
  108. }
  109. }
  110. </style>