elementModel.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. /* eslint-disable no-unused-vars */
  2. import { deepCopy, getNumList } from "./plugins/utils";
  3. import { getModel as getCardHeadModel } from "./elements/card-head/model";
  4. import { getModel as getTopicHeadModel } from "./elements/topic-head/model";
  5. // element
  6. import { getModel as createLines } from "./elements/lines/model";
  7. import { getModel as createLine } from "./elements/line/model";
  8. import { getModel as createText } from "./elements/text/model";
  9. import { getModel as createImage } from "./elements/image/model";
  10. import { getModel as createGrids } from "./elements/grids/model";
  11. import {
  12. getModel as createComposition,
  13. getFullModel as getCompositionElements,
  14. } from "./elements/composition/model";
  15. import {
  16. getModel as createFillQuestion,
  17. getFullModel as getFillQuesitonElements,
  18. } from "./elements/fill-question/model";
  19. import {
  20. getModel as createFillLine,
  21. getFullModel as getFillLineElements,
  22. } from "./elements/fill-line/model";
  23. import {
  24. getModel as createExplain,
  25. getFullModel as getExplainElements,
  26. } from "./elements/explain/model";
  27. // page relate ------------------- >
  28. // 页面
  29. const PAGE = {
  30. type: "PAGE",
  31. columnGap: 20,
  32. locators: [],
  33. globals: [],
  34. columns: [],
  35. };
  36. // 可编辑栏
  37. const COLUMN = {
  38. type: "COLUMN",
  39. x: "",
  40. y: "",
  41. w: "",
  42. h: "",
  43. isFull: false, // 是否已经填满元素
  44. elements: [],
  45. };
  46. // 定位点
  47. const LOCATOR = {
  48. type: "LOCATOR",
  49. x: "",
  50. y: "",
  51. w: "",
  52. h: "",
  53. };
  54. // available infos
  55. const EDITABLE_ELEMENT = [
  56. "LINE_HORIZONTAL",
  57. "LINE_VERTICAL",
  58. "LINES",
  59. "TEXT",
  60. "IMAGE",
  61. "GRIDS",
  62. ];
  63. const EDITABLE_TOPIC = ["FILL_QUESTION", "FILL_LINE", "EXPLAIN", "COMPOSITION"];
  64. const ELEMENT_INFOS = {
  65. CARD_HEAD: {
  66. name: "",
  67. getModel: getCardHeadModel,
  68. },
  69. LINES: {
  70. name: "多横线",
  71. getModel: createLines,
  72. },
  73. LINE_HORIZONTAL: {
  74. name: "横线",
  75. getModel: () => createLine("HORIZONTAL"),
  76. },
  77. LINE_VERTICAL: {
  78. name: "竖线",
  79. getModel: () => createLine("VERTICAL"),
  80. },
  81. TEXT: {
  82. name: "文本",
  83. getModel: createText,
  84. },
  85. IMAGE: {
  86. name: "图片",
  87. getModel: createImage,
  88. },
  89. GRIDS: {
  90. name: "网格",
  91. getModel: createGrids,
  92. },
  93. FILL_QUESTION: {
  94. name: "选择题",
  95. getModel: createFillQuestion,
  96. },
  97. FILL_LINE: {
  98. name: "填空题",
  99. getModel: createFillLine,
  100. },
  101. EXPLAIN: {
  102. name: "解答题",
  103. getModel: createExplain,
  104. },
  105. COMPOSITION: {
  106. name: "作文题",
  107. getModel: createComposition,
  108. },
  109. };
  110. const ELEMENT_LIST = EDITABLE_ELEMENT.map((type) => {
  111. return {
  112. ...ELEMENT_INFOS[type],
  113. type,
  114. };
  115. });
  116. const TOPIC_LIST = EDITABLE_TOPIC.map((type) => {
  117. return {
  118. ...ELEMENT_INFOS[type],
  119. type,
  120. };
  121. });
  122. // 获取元件默认数据结构
  123. const getElementModel = (type, optionData = {}) => {
  124. return ELEMENT_INFOS[type].getModel(optionData);
  125. };
  126. const getElementName = (type) => {
  127. return ELEMENT_INFOS[type].name;
  128. };
  129. // 创建新页面
  130. const getNewPage = (pageNo, { pageSize, columnNumber }) => {
  131. let npage = deepCopy(PAGE);
  132. if (
  133. (pageSize === "A3" && columnNumber === 4) ||
  134. (pageSize === "A4" && columnNumber === 2)
  135. ) {
  136. npage.columnGap = 10;
  137. }
  138. const num = pageSize === "A3" ? 3 : 2;
  139. npage.locators = getNumList(num).map((item, index) => {
  140. return [
  141. {
  142. ...LOCATOR,
  143. id: `locator-${pageNo}-${index}0`,
  144. },
  145. {
  146. ...LOCATOR,
  147. id: `locator-${pageNo}-${index}1`,
  148. },
  149. ];
  150. });
  151. npage.columns = getNumList(columnNumber).map((item, index) => {
  152. return deepCopy(COLUMN);
  153. });
  154. return npage;
  155. };
  156. export {
  157. getElementModel,
  158. getElementName,
  159. getNewPage,
  160. getCardHeadModel,
  161. getTopicHeadModel,
  162. getFillQuesitonElements,
  163. getFillLineElements,
  164. getExplainElements,
  165. getCompositionElements,
  166. ELEMENT_LIST,
  167. TOPIC_LIST,
  168. };