elementModel.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  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. import { getModel as createForbidArea } from "./elements/forbid-area/model";
  28. // page relate ------------------- >
  29. // 页面
  30. const PAGE = {
  31. type: "PAGE",
  32. pageSize: "A3",
  33. columnNumber: 2,
  34. columnGap: 20,
  35. locators: [],
  36. globals: [],
  37. columns: [],
  38. };
  39. // 可编辑栏
  40. const COLUMN = {
  41. type: "COLUMN",
  42. x: "",
  43. y: "",
  44. w: "",
  45. h: "",
  46. isFull: false, // 是否已经填满元素
  47. elements: [],
  48. };
  49. // 定位点
  50. const LOCATOR = {
  51. type: "LOCATOR",
  52. x: "",
  53. y: "",
  54. w: "",
  55. h: "",
  56. };
  57. // available infos
  58. const EDITABLE_ELEMENT = [
  59. "LINE_HORIZONTAL",
  60. "LINE_VERTICAL",
  61. "LINES",
  62. "TEXT",
  63. "IMAGE",
  64. "GRIDS",
  65. ];
  66. const OTHER_ELEMENT = ["TOPIC_HEAD", "CARD_HEAD"];
  67. const EDITABLE_TOPIC = [
  68. "FILL_QUESTION_SIMPLE",
  69. "FILL_QUESTION_MULTIPLY",
  70. "FILL_QUESTION_BOOLEAN",
  71. "FILL_LINE",
  72. "EXPLAIN",
  73. "COMPOSITION",
  74. ];
  75. const EDITABLE_NOT_TOPIC = ["FORBID_AREA"];
  76. const ELEMENT_INFOS = {
  77. LINES: {
  78. name: "多横线",
  79. getModel: createLines,
  80. },
  81. LINE_HORIZONTAL: {
  82. name: "横线",
  83. getModel: () => createLine("HORIZONTAL"),
  84. },
  85. LINE_VERTICAL: {
  86. name: "竖线",
  87. getModel: () => createLine("VERTICAL"),
  88. },
  89. TEXT: {
  90. name: "文本",
  91. getModel: createText,
  92. },
  93. IMAGE: {
  94. name: "图片",
  95. getModel: createImage,
  96. },
  97. GRIDS: {
  98. name: "网格",
  99. getModel: createGrids,
  100. },
  101. FILL_QUESTION_SIMPLE: {
  102. name: "单选题",
  103. getModel: createFillQuestion,
  104. },
  105. FILL_QUESTION_MULTIPLY: {
  106. name: "多选题",
  107. getModel: () => createFillQuestion({ isMultiply: true }),
  108. },
  109. FILL_QUESTION_BOOLEAN: {
  110. name: "判断题",
  111. getModel: () => createFillQuestion({ isBoolean: true, optionCount: 2 }),
  112. },
  113. FILL_LINE: {
  114. name: "填空题",
  115. getModel: createFillLine,
  116. },
  117. EXPLAIN: {
  118. name: "解答题",
  119. getModel: createExplain,
  120. },
  121. COMPOSITION: {
  122. name: "作文题",
  123. getModel: createComposition,
  124. },
  125. FORBID_AREA: {
  126. name: "禁答区",
  127. getModel: createForbidArea,
  128. },
  129. };
  130. const ELEMENT_LIST = EDITABLE_ELEMENT.map((type) => {
  131. return {
  132. ...ELEMENT_INFOS[type],
  133. type,
  134. };
  135. });
  136. const TOPIC_LIST = EDITABLE_TOPIC.map((type) => {
  137. return {
  138. ...ELEMENT_INFOS[type],
  139. type,
  140. };
  141. });
  142. const NOT_TOPIC_LIST = EDITABLE_NOT_TOPIC.map((type) => {
  143. return {
  144. ...ELEMENT_INFOS[type],
  145. type,
  146. };
  147. });
  148. // 获取元件默认数据结构
  149. const getElementModel = (type) => {
  150. return ELEMENT_INFOS[type].getModel();
  151. };
  152. const getFillQuestionName = (element) => {
  153. if (element.isBoolean) return "判断题";
  154. if (element.isMultiply) return "多选题";
  155. return "单选题";
  156. };
  157. const getElementName = (type) => {
  158. return ELEMENT_INFOS[type]?.name;
  159. };
  160. const getLocators = (pageNo) => {
  161. return {
  162. top: [
  163. {
  164. id: `locator-${pageNo}-00`,
  165. ...LOCATOR,
  166. },
  167. {
  168. id: `locator-${pageNo}-01`,
  169. ...LOCATOR,
  170. },
  171. ],
  172. bottom: [
  173. {
  174. id: `locator-${pageNo}-10`,
  175. ...LOCATOR,
  176. },
  177. ],
  178. };
  179. };
  180. // 创建新页面
  181. const getNewPage = (pageNo, { pageSize, columnNumber }) => {
  182. let npage = deepCopy(PAGE);
  183. npage.pageSize = pageSize;
  184. npage.columnNumber = columnNumber;
  185. if (
  186. (pageSize === "A3" && columnNumber === 4) ||
  187. (pageSize === "A4" && columnNumber === 2)
  188. ) {
  189. npage.columnGap = 10;
  190. }
  191. npage.locators = getLocators(pageNo);
  192. npage.columns = getNumList(columnNumber).map((item, index) => {
  193. return deepCopy(COLUMN);
  194. });
  195. return npage;
  196. };
  197. export {
  198. getElementModel,
  199. getElementName,
  200. getFillQuestionName,
  201. getNewPage,
  202. getCardHeadModel,
  203. getTopicHeadModel,
  204. getFillQuesitonElements,
  205. getFillLineElements,
  206. getExplainElements,
  207. getCompositionElements,
  208. ELEMENT_LIST,
  209. TOPIC_LIST,
  210. NOT_TOPIC_LIST,
  211. EDITABLE_TOPIC,
  212. EDITABLE_NOT_TOPIC,
  213. OTHER_ELEMENT,
  214. };