TopicElementEdit.vue 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. <template>
  2. <div class="topic-element-edit">
  3. <element-resize
  4. v-model="elemData"
  5. :class="{ 'element-resize-act': curElement.id === data.id }"
  6. :active="['b']"
  7. :move="false"
  8. :min-height="data.minHeight"
  9. :fit-parent="['h']"
  10. @on-click="activeCurElement"
  11. @resize-over="resizeOver"
  12. @change="sizeChange"
  13. >
  14. <div :id="data.id" :class="classes" :data-type="data.type">
  15. <component :is="compName" :data="data"></component>
  16. </div>
  17. <!-- topic-number -->
  18. <topic-number
  19. title="点击选中当前编辑框"
  20. @click="activeCurElement"
  21. ></topic-number>
  22. </element-resize>
  23. </div>
  24. </template>
  25. <script>
  26. import { mapState, mapMutations, mapActions } from "vuex";
  27. import { objAssign } from "../../card/plugins/utils";
  28. import { checkElementisCovered } from "../store";
  29. import EditPaneBox from "../elements/pane-box/ElemPaneBoxEdit.vue";
  30. import EditPaperStruct from "../elements/paper-struct/ElemPaperStruct";
  31. import ElementResize from "../../card/components/common/ElementResize";
  32. import TopicNumber from "../../card/components/common/TopicNumber";
  33. export default {
  34. name: "TopicElementEdit",
  35. components: {
  36. EditPaneBox,
  37. EditPaperStruct,
  38. ElementResize,
  39. TopicNumber,
  40. },
  41. props: {
  42. data: {
  43. type: Object,
  44. default() {
  45. return {};
  46. },
  47. },
  48. },
  49. data() {
  50. return {
  51. elemData: {
  52. x: 0,
  53. y: 0,
  54. w: 0,
  55. h: 0,
  56. init: false,
  57. isCovered: false,
  58. },
  59. };
  60. },
  61. computed: {
  62. ...mapState("paper-export", ["curElement"]),
  63. elementName() {
  64. return this.data.type.toLowerCase().replace("_", "-");
  65. },
  66. compName() {
  67. return `edit-${this.elementName}`;
  68. },
  69. classes() {
  70. return [
  71. "topic-design",
  72. "element-item",
  73. `element-item-${this.elementName}`,
  74. {
  75. "element-item-error": this.elemData.isCovered,
  76. },
  77. ];
  78. },
  79. },
  80. created() {
  81. this.init();
  82. },
  83. methods: {
  84. ...mapMutations("paper-export", ["setCurElement"]),
  85. ...mapActions("paper-export", ["modifyElement", "rebuildPages"]),
  86. init() {
  87. this.elemData = objAssign(this.elemData, this.data);
  88. },
  89. activeCurElement() {
  90. this.setCurElement(this.data);
  91. },
  92. sizeChange() {
  93. this.elemData.isCovered = checkElementisCovered(
  94. this.data.id,
  95. this.data.type
  96. );
  97. this.modifyElement(Object.assign({}, this.curElement, this.elemData));
  98. },
  99. resizeOver() {
  100. this.modifyElement(Object.assign({}, this.curElement, this.elemData));
  101. // 注意:当前组件并没有实时更新元件的尺寸信息,只是在rebuildPages时统一更新。
  102. this.$nextTick(() => {
  103. this.rebuildPages();
  104. });
  105. },
  106. },
  107. };
  108. </script>