store.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. import { randomCode } from "../../plugins/utils";
  2. const state = {
  3. cardConfig: {},
  4. curElement: {},
  5. curDragElement: {},
  6. curCopyElement: {},
  7. curPage: {},
  8. curPageNo: 0,
  9. curColumnId: 0,
  10. pages: [],
  11. openElementEditDialog: false
  12. };
  13. const mutations = {
  14. setCardConfig(state, cardConfig) {
  15. state.cardConfig = Object.assign({}, state.cardConfig, cardConfig);
  16. },
  17. setCurElement(state, curElement) {
  18. state.curElement = curElement;
  19. if (!curElement.id) return;
  20. const curColumn = state.curPage.columns.find(
  21. column => !!column.elements.find(elem => elem.id === curElement.id)
  22. );
  23. state.curColumnId = curColumn.id;
  24. },
  25. setCurDragElement(state, curDragElement) {
  26. state.curDragElement = curDragElement;
  27. },
  28. setCurCopyElement(state, curCopyElement) {
  29. state.curCopyElement = curCopyElement;
  30. },
  31. setCurPageNo(state, curPageNo) {
  32. const pageNo = state.pages[curPageNo] ? curPageNo : 0;
  33. state.curPage = state.pages[pageNo];
  34. state.curPageNo = pageNo;
  35. },
  36. setCurPage(state, curPage) {
  37. state.curPage = curPage;
  38. },
  39. setCurColumnId(state, curColumnId) {
  40. state.curColumnId = curColumnId;
  41. },
  42. setPages(state, pages) {
  43. state.pages = pages;
  44. },
  45. setOpenElementEditDialog(state, openElementEditDialog) {
  46. state.openElementEditDialog = openElementEditDialog;
  47. },
  48. initState(state) {
  49. state.curElement = {};
  50. state.curDragElement = {};
  51. state.curCopyElement = {};
  52. state.curPage = {};
  53. state.curPageNo = 0;
  54. state.pages = [];
  55. state.cardConfig = {};
  56. state.openElementEditDialog = false;
  57. }
  58. };
  59. const findElementById = (id, curPage) => {
  60. let curElement = null;
  61. let columnIndex = 0;
  62. let elementIndex = 0;
  63. curPage.columns.forEach((column, cindex) => {
  64. column.elements.forEach((element, eindex) => {
  65. if (curElement) return;
  66. if (element.id === id) {
  67. curElement = element;
  68. columnIndex = cindex;
  69. elementIndex = eindex;
  70. return;
  71. }
  72. });
  73. });
  74. return { curElement, columnIndex, elementIndex };
  75. };
  76. const updateElementsZindex = elements => {
  77. const maxZindex = elements.length + 9 - 1;
  78. elements.forEach((element, index) => {
  79. element.zindex = maxZindex - index;
  80. element.key = randomCode();
  81. });
  82. };
  83. const actions = {
  84. addPage({ state }, page) {
  85. state.pages.push(page);
  86. },
  87. modifyPage({ state, commit }, page) {
  88. const pos = state.pages.findIndex(p => p.id === page.id);
  89. state.pages.splice(pos, 1, page);
  90. commit("setCurPageNo", pos);
  91. },
  92. modifyAllPageShowForbidArea({ state, commit }, showForbidArea) {
  93. state.pages.forEach(page => {
  94. page.showForbidArea = showForbidArea;
  95. });
  96. commit("setCurPageNo", state.curPageNo);
  97. },
  98. removePage({ state, commit }, page) {
  99. const pos = state.pages.findIndex(p => p.id === page.id);
  100. state.pages.splice(pos, 1);
  101. if (pos === state.curPageNo) commit("setCurPageNo", state.curPageNo);
  102. },
  103. actElementById({ state, commit }, id) {
  104. const { curElement } = findElementById(id, state.curPage);
  105. if (!curElement) return;
  106. commit("setCurElement", curElement);
  107. },
  108. addElement({ state, commit }, { columnIndex, element }) {
  109. // 层级大的放最前面,层级自增,即后创建的元素放前面
  110. const elements = state.curPage.columns[columnIndex].elements;
  111. elements.unshift(element);
  112. updateElementsZindex(elements);
  113. commit(
  114. "setCurElement",
  115. elements.find(elem => elem.id === element.id)
  116. );
  117. },
  118. modifyElement({ state, commit }, element) {
  119. const { columnIndex, elementIndex } = findElementById(
  120. element.id,
  121. state.curPage
  122. );
  123. const elements = state.curPage.columns[columnIndex].elements;
  124. elements.splice(elementIndex, 1, element);
  125. commit("setCurElement", element);
  126. },
  127. removeElement({ state }, element) {
  128. const { columnIndex, elementIndex } = findElementById(
  129. element.id,
  130. state.curPage
  131. );
  132. const elements = state.curPage.columns[columnIndex].elements;
  133. elements.splice(elementIndex, 1);
  134. updateElementsZindex(elements);
  135. },
  136. pasteElement({ state, dispatch }, { element, toColumnId }) {
  137. const columnIndex = state.curPage.columns.findIndex(
  138. col => col.id === toColumnId
  139. );
  140. dispatch("addElement", { columnIndex, element });
  141. },
  142. moveElementToElement(
  143. { state, commit },
  144. { curElement, toElementId, curColumnId, isDragDown }
  145. ) {
  146. const columnIndex = state.curPage.columns.findIndex(
  147. col => col.id === curColumnId
  148. );
  149. const elements = state.curPage.columns[columnIndex].elements;
  150. const curPos = elements.findIndex(elem => elem.id === curElement.id);
  151. elements.splice(curPos, 1);
  152. const toPos = elements.findIndex(elem => elem.id === toElementId);
  153. const offset = isDragDown ? 1 : 0;
  154. elements.splice(toPos + offset, 0, curElement);
  155. // console.log(toPos);
  156. updateElementsZindex(elements);
  157. commit(
  158. "setCurElement",
  159. elements.find(elem => elem.id === curElement.id)
  160. );
  161. },
  162. moveElementZindex({ state, commit }, { curElement, pos }) {
  163. let curColumn = null,
  164. curElementPos = null;
  165. state.curPage.columns.forEach(column =>
  166. column.elements.forEach((elem, eindex) => {
  167. if (elem.id === curElement.id) {
  168. curElementPos = eindex;
  169. curColumn = column;
  170. }
  171. })
  172. );
  173. const elements = curColumn.elements;
  174. if (
  175. (curElementPos === elements.length - 1 && pos > 0) ||
  176. (curElementPos === 0 && pos < 0)
  177. )
  178. return;
  179. const toPos = curElementPos + pos;
  180. elements.splice(curElementPos, 1);
  181. elements.splice(toPos, 0, curElement);
  182. updateElementsZindex(elements);
  183. commit(
  184. "setCurElement",
  185. elements.find(elem => elem.id === curElement.id)
  186. );
  187. }
  188. };
  189. export default {
  190. namespaced: true,
  191. state,
  192. mutations,
  193. actions
  194. };