|
@@ -97,7 +97,11 @@ const fetchAllRelateParentElementPositionInfos = (parentElement, pages) => {
|
|
for (let j = 0, jlen = pages[i].columns.length; j < jlen; j++) {
|
|
for (let j = 0, jlen = pages[i].columns.length; j < jlen; j++) {
|
|
pages[i].columns[j].elements.forEach((item, eindex) => {
|
|
pages[i].columns[j].elements.forEach((item, eindex) => {
|
|
if (item["parent"] && item.parent.id === parentElement.id) {
|
|
if (item["parent"] && item.parent.id === parentElement.id) {
|
|
- postionInfos.push({ _pageNo: i, _columnNo: j, _elementNo: eindex });
|
|
|
|
|
|
+ let pos = { _pageNo: i, _columnNo: j, _elementNo: eindex };
|
|
|
|
+ if (parentElement.type === "EXPLAIN") {
|
|
|
|
+ pos.explainNumber = item.explainNumber;
|
|
|
|
+ }
|
|
|
|
+ postionInfos.push(pos);
|
|
}
|
|
}
|
|
});
|
|
});
|
|
}
|
|
}
|
|
@@ -116,6 +120,47 @@ const fetchFirstSubjectiveTopicPositionInfo = pages => {
|
|
}
|
|
}
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+const fetchSameExplainNumberExplainChildernPositionInfo = (
|
|
|
|
+ explainChildernElement,
|
|
|
|
+ pages
|
|
|
|
+) => {
|
|
|
|
+ let postionInfos = [];
|
|
|
|
+ const explainId = explainChildernElement.parent.id;
|
|
|
|
+ const explainNumber = explainChildernElement.explainNumber;
|
|
|
|
+
|
|
|
|
+ for (let i = 0, ilen = pages.length; i < ilen; i++) {
|
|
|
|
+ for (let j = 0, jlen = pages[i].columns.length; j < jlen; j++) {
|
|
|
|
+ pages[i].columns[j].elements.forEach((item, eindex) => {
|
|
|
|
+ if (
|
|
|
|
+ item.parent &&
|
|
|
|
+ item.parent.id === explainId &&
|
|
|
|
+ item.explainNumber === explainNumber
|
|
|
|
+ ) {
|
|
|
|
+ postionInfos.push({
|
|
|
|
+ _pageNo: i,
|
|
|
|
+ _columnNo: j,
|
|
|
|
+ _elementNo: eindex,
|
|
|
|
+ _elementId: item.id
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return postionInfos;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+function groupByParams(datas, paramKey) {
|
|
|
|
+ let elementGroupInfos = [];
|
|
|
|
+ for (let i = 0, len = datas.length; i < len; i++) {
|
|
|
|
+ if (i === 0 || datas[i][paramKey] !== datas[i - 1][paramKey]) {
|
|
|
|
+ elementGroupInfos.push([datas[i]]);
|
|
|
|
+ } else {
|
|
|
|
+ elementGroupInfos[elementGroupInfos.length - 1].push(datas[i]);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return elementGroupInfos;
|
|
|
|
+}
|
|
|
|
+
|
|
const getPageTopicNos = pages => {
|
|
const getPageTopicNos = pages => {
|
|
let topicNos = [];
|
|
let topicNos = [];
|
|
pages.forEach(page => {
|
|
pages.forEach(page => {
|
|
@@ -185,6 +230,53 @@ const actions = {
|
|
} else {
|
|
} else {
|
|
dispatch("addElement", element);
|
|
dispatch("addElement", element);
|
|
}
|
|
}
|
|
|
|
+ } else if (element.type === "EXPLAIN") {
|
|
|
|
+ const positionInfos = fetchAllRelateParentElementPositionInfos(
|
|
|
|
+ element,
|
|
|
|
+ state.pages
|
|
|
|
+ );
|
|
|
|
+ if (positionInfos.length) {
|
|
|
|
+ const elementGroupPosInfos = groupByParams(
|
|
|
|
+ positionInfos,
|
|
|
|
+ "explainNumber"
|
|
|
|
+ );
|
|
|
|
+ const orgElementCount = elementGroupPosInfos.length;
|
|
|
|
+ if (orgElementCount > element.questionsCount) {
|
|
|
|
+ // 原小题数多于新小题数,要删除原多于的小题;
|
|
|
|
+ let needDeleteInfos = elementGroupPosInfos.splice(
|
|
|
|
+ element.questionsCount,
|
|
|
|
+ orgElementCount - element.questionsCount
|
|
|
|
+ );
|
|
|
|
+ needDeleteInfos.reverse().forEach(item => {
|
|
|
|
+ item.reverse().forEach(pos => {
|
|
|
|
+ const elems =
|
|
|
|
+ state.pages[pos._pageNo].columns[pos._columnNo].elements;
|
|
|
|
+ elems.splice(pos._elementNo, 1);
|
|
|
|
+ });
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ const newElements = getExplainChildren(element);
|
|
|
|
+ const lastPos = elementGroupPosInfos.slice(-1)[0].slice(-1)[0];
|
|
|
|
+ for (var i = 0; i < element.questionsCount; i++) {
|
|
|
|
+ if (elementGroupPosInfos[i]) {
|
|
|
|
+ elementGroupPosInfos[i].forEach(pos => {
|
|
|
|
+ let child =
|
|
|
|
+ state.pages[pos._pageNo].columns[pos._columnNo].elements[
|
|
|
|
+ pos._elementNo
|
|
|
|
+ ];
|
|
|
|
+ child.explainNumber = i + element.startNumber;
|
|
|
|
+ child.parent = { ...element };
|
|
|
|
+ });
|
|
|
|
+ } else {
|
|
|
|
+ state.pages[lastPos._pageNo].columns[
|
|
|
|
+ lastPos._columnNo
|
|
|
|
+ ].elements.splice(lastPos._elementNo + 1, 0, newElements[i]);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ dispatch("addElement", element);
|
|
|
|
+ }
|
|
} else {
|
|
} else {
|
|
// 非作文题都是拆分题,即同一个题拆分成多个小题展示
|
|
// 非作文题都是拆分题,即同一个题拆分成多个小题展示
|
|
const positionInfos = fetchAllRelateParentElementPositionInfos(
|
|
const positionInfos = fetchAllRelateParentElementPositionInfos(
|
|
@@ -198,13 +290,13 @@ const actions = {
|
|
pos._elementNo
|
|
pos._elementNo
|
|
].h;
|
|
].h;
|
|
});
|
|
});
|
|
- // 删除所有解答题
|
|
|
|
|
|
+ // 删除所有小题
|
|
positionInfos.reverse().forEach(pos => {
|
|
positionInfos.reverse().forEach(pos => {
|
|
const elems =
|
|
const elems =
|
|
state.pages[pos._pageNo].columns[pos._columnNo].elements;
|
|
state.pages[pos._pageNo].columns[pos._columnNo].elements;
|
|
elems.splice(pos._elementNo, 1);
|
|
elems.splice(pos._elementNo, 1);
|
|
});
|
|
});
|
|
- // 创建新的解答题元素
|
|
|
|
|
|
+ // 创建新的小题元素
|
|
const newElements = createFunc[element.type](element);
|
|
const newElements = createFunc[element.type](element);
|
|
const pos = positionInfos.pop();
|
|
const pos = positionInfos.pop();
|
|
newElements.forEach((newElement, index) => {
|
|
newElements.forEach((newElement, index) => {
|
|
@@ -464,9 +556,50 @@ const actions = {
|
|
if (!curElement) return;
|
|
if (!curElement) return;
|
|
|
|
|
|
commit("setCurElement", curElement);
|
|
commit("setCurElement", curElement);
|
|
|
|
+ },
|
|
|
|
+ copyExplainChildren({ state }, element) {
|
|
|
|
+ let newElement = deepCopy(element);
|
|
|
|
+ newElement.id = getElementId();
|
|
|
|
+ newElement.elements = [];
|
|
|
|
+ newElement.h = 200;
|
|
|
|
+ newElement.showTitle = false;
|
|
|
|
+
|
|
|
|
+ const positionInfos = fetchElementPositionInfos(element, state.pages);
|
|
|
|
+ if (!positionInfos.length) return;
|
|
|
|
+ const pos = positionInfos[0];
|
|
|
|
+ state.pages[pos._pageNo].columns[pos._columnNo].elements.splice(
|
|
|
|
+ pos._elementNo + 1,
|
|
|
|
+ 0,
|
|
|
|
+ newElement
|
|
|
|
+ );
|
|
|
|
+ },
|
|
|
|
+ deleteExplainChildren({ state }, element) {
|
|
|
|
+ const positionInfos = fetchSameExplainNumberExplainChildernPositionInfo(
|
|
|
|
+ element,
|
|
|
|
+ state.pages
|
|
|
|
+ );
|
|
|
|
+ if (positionInfos.length < 2) return;
|
|
|
|
+ const pindex = positionInfos.findIndex(
|
|
|
|
+ item => item._elementId === element.id
|
|
|
|
+ );
|
|
|
|
+ const pos = positionInfos[pindex];
|
|
|
|
+ state.pages[pos._pageNo].columns[pos._columnNo].elements.splice(
|
|
|
|
+ pos._elementNo,
|
|
|
|
+ 1
|
|
|
|
+ );
|
|
|
|
+ // 当删除的是含有标题解答题小题时,则需要将下一个答题区开启显示标题。
|
|
|
|
+ // element.explainNumber === element.parent.startNumber && pindex === 0
|
|
|
|
+ if (element.showTitle) {
|
|
|
|
+ const nextPos = positionInfos[pindex + 1];
|
|
|
|
+ state.pages[nextPos._pageNo].columns[nextPos._columnNo].elements[
|
|
|
|
+ nextPos._elementNo
|
|
|
|
+ ].showTitle = true;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+export { fetchSameExplainNumberExplainChildernPositionInfo };
|
|
|
|
+
|
|
export default {
|
|
export default {
|
|
namespaced: true,
|
|
namespaced: true,
|
|
state,
|
|
state,
|