PaperTemplateView.vue 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. <template>
  2. <div class="paper-template-view card-view paper-page">
  3. <template v-for="(page, pageNo) in pages">
  4. <div
  5. :key="pageNo"
  6. :class="[
  7. 'page-box',
  8. `page-box-${page.pageSize}`,
  9. `page-box-${pageTypeType(page.pageType)}`,
  10. ]"
  11. >
  12. <!-- inner edit area -->
  13. <div
  14. :class="[
  15. 'page-main-inner',
  16. {
  17. 'page-main-noside': !page.showSide || page.pageType === 'cover',
  18. },
  19. ]"
  20. >
  21. <div
  22. :class="['page-main', `page-main-${page.columns.length}`]"
  23. :style="{ margin: `0 -${page.columnGap / 2}px` }"
  24. >
  25. <div
  26. v-for="(column, columnNo) in page.columns"
  27. :key="columnNo"
  28. class="page-column"
  29. :style="{ padding: `0 ${page.columnGap / 2}px` }"
  30. >
  31. <div
  32. :id="[`column-${pageNo}-${columnNo}`]"
  33. class="page-column-main"
  34. >
  35. <div class="page-column-body">
  36. <topic-element-preview
  37. v-for="element in column.elements"
  38. :key="element.id"
  39. class="page-column-element"
  40. :data="element"
  41. ></topic-element-preview>
  42. <!-- paper question info -->
  43. <template v-if="column.texts && column.texts.length">
  44. <elem-rich-text
  45. v-for="elem in column.texts"
  46. :id="`rich-text-${elem.id}`"
  47. :key="elem.id"
  48. :data="elem"
  49. ></elem-rich-text>
  50. </template>
  51. </div>
  52. </div>
  53. <page-number
  54. v-if="page.showPageNo && page.pageType !== 'cover'"
  55. type="text"
  56. :total="getTotalPage()"
  57. :current="getPageNumber(pageNo, columnNo)"
  58. ></page-number>
  59. </div>
  60. </div>
  61. </div>
  62. <!-- side edit erea -->
  63. <div
  64. v-if="page.showSide && page.pageType !== 'cover'"
  65. class="page-column-side"
  66. >
  67. <div class="column-side-body">
  68. <box-element-preview
  69. v-for="element in page.sides"
  70. :key="element.id"
  71. class="page-side-element"
  72. :data="element"
  73. ></box-element-preview>
  74. </div>
  75. </div>
  76. </div>
  77. </template>
  78. </div>
  79. </template>
  80. <script>
  81. import TopicElementPreview from "./TopicElementPreview";
  82. import BoxElementPreview from "./BoxElementPreview.vue";
  83. import PageNumber from "./PageNumber";
  84. import ElemRichText from "../elements/rich-text/ElemRichText.vue";
  85. export default {
  86. name: "PaperTemplateView",
  87. components: {
  88. TopicElementPreview,
  89. BoxElementPreview,
  90. PageNumber,
  91. ElemRichText,
  92. },
  93. props: {
  94. pages: {
  95. type: Array,
  96. default() {
  97. return [];
  98. },
  99. },
  100. pageConfig: {
  101. type: Object,
  102. default() {
  103. return {};
  104. },
  105. },
  106. },
  107. data() {
  108. return {};
  109. },
  110. methods: {
  111. pageTypeType(pageType) {
  112. const types = {
  113. cover: 0,
  114. front: 0,
  115. back: 1,
  116. };
  117. return types[pageType];
  118. },
  119. getPageNumber(curPageNo, columnNo) {
  120. const coverPageCount = this.pages.filter(
  121. (p) => p.pageType === "cover"
  122. ).length;
  123. let pageNo = this.pageConfig.showCover
  124. ? curPageNo - coverPageCount
  125. : curPageNo;
  126. return pageNo * this.pageConfig.columnNumber + columnNo + 1;
  127. },
  128. getTotalPage() {
  129. const pageCount = this.pages.filter((p) => p.pageType !== "cover").length;
  130. return pageCount * this.pageConfig.columnNumber;
  131. },
  132. },
  133. };
  134. </script>