TopicColumnEdit.vue 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. <template>
  2. <div
  3. :class="['topic-column-edit', { 'is-active': curColumnId === data.id }]"
  4. :id="data.id"
  5. @drop.prevent="dropInnerElement($event)"
  6. @dragover.prevent
  7. @dragleave.prevent
  8. @mousedown="columnBodyClick"
  9. >
  10. <div v-if="data.elements.length" class="page-column-body">
  11. <topic-element-edit
  12. v-for="element in data.elements"
  13. :key="element.key"
  14. :data="element"
  15. :transform-fit="rebuildGuides"
  16. @resize-over="elementResizeOver"
  17. ></topic-element-edit>
  18. <!-- guide-lines -->
  19. <div class="element-guide-lines">
  20. <div
  21. class="guide-line guide-line-x"
  22. v-for="line in xLines"
  23. :key="`x-${line.top}`"
  24. :style="line"
  25. ></div>
  26. <div
  27. class="guide-line guide-line-y"
  28. v-for="line in yLines"
  29. :key="`y-${line.left}`"
  30. :style="line"
  31. ></div>
  32. </div>
  33. </div>
  34. <div class="page-column-body" v-else>
  35. <div class="page-column-forbid-area" v-if="curPage.showForbidArea">
  36. <p>该区域严禁作答</p>
  37. </div>
  38. </div>
  39. </div>
  40. </template>
  41. <script>
  42. import { mapState, mapActions, mapMutations } from "vuex";
  43. import guideLinesMixins from "../../../mixins/guideLines";
  44. import TopicElementEdit from "./TopicElementEdit";
  45. import { getElementDesc } from "../elements/model";
  46. export default {
  47. name: "topic-column-edit",
  48. mixins: [guideLinesMixins],
  49. components: { TopicElementEdit },
  50. props: {
  51. data: {
  52. type: Object
  53. }
  54. },
  55. data() {
  56. return {};
  57. },
  58. computed: {
  59. ...mapState("free", ["curDragElement", "curPage", "curColumnId"])
  60. },
  61. methods: {
  62. ...mapMutations("free", [
  63. "setCurDragElement",
  64. "setCurElement",
  65. "setCurColumnId"
  66. ]),
  67. ...mapActions("free", ["addElement", "modifyElement"]),
  68. dropInnerElement(e) {
  69. let { offsetX: x, offsetY: y } = e;
  70. const { offsetLeft, offsetTop } = this.getOffsetInfo(
  71. e.target || e.srcElement
  72. );
  73. const curElement = {
  74. ...this.curDragElement,
  75. x: x + offsetLeft,
  76. y: y + offsetTop,
  77. desc: getElementDesc(this.curDragElement)
  78. };
  79. const columnNo = this.curPage.columns.findIndex(
  80. col => col.id === this.data.id
  81. );
  82. this.clear();
  83. this.setCurDragElement({});
  84. this.addElement({ element: curElement, columnIndex: columnNo });
  85. },
  86. getOffsetInfo(dom, endParentClass = "page-column-body") {
  87. let parentNode = dom;
  88. let offsetTop = 0,
  89. offsetLeft = 0;
  90. while (!parentNode.className.includes(endParentClass)) {
  91. offsetTop += parentNode.offsetTop;
  92. offsetLeft += parentNode.offsetLeft;
  93. parentNode = parentNode.offsetParent;
  94. }
  95. return {
  96. offsetLeft,
  97. offsetTop
  98. };
  99. },
  100. elementResizeOver(element) {
  101. this.clear();
  102. this.modifyElement(element);
  103. },
  104. columnBodyClick() {
  105. console.log(this.data.id);
  106. this.setCurColumnId(this.data.id);
  107. this.setCurElement({});
  108. },
  109. rebuildGuides(element, actionType) {
  110. return this.rebuild(this.data.elements, element, actionType);
  111. }
  112. }
  113. };
  114. </script>