|
|
@@ -10,165 +10,190 @@ export default () => {
|
|
|
|
|
|
const { addHistorySnapshot } = useHistorySnapshot()
|
|
|
|
|
|
- // 获取组合元素层级范围(组合成员中的最大层级和最小层级)
|
|
|
- const getCombineElementIndexRange = (elementList: PPTElement[], combineElementList: PPTElement[]) => {
|
|
|
- const minIndex = elementList.findIndex(_element => _element.id === combineElementList[0].id)
|
|
|
- const maxIndex = elementList.findIndex(_element => _element.id === combineElementList[combineElementList.length - 1].id)
|
|
|
- return { minIndex, maxIndex }
|
|
|
+ /**
|
|
|
+ * 获取组合元素层级范围
|
|
|
+ * @param elementList 本页所有元素列表
|
|
|
+ * @param combineElementList 组合元素列表
|
|
|
+ */
|
|
|
+ const getCombineElementLevelRange = (elementList: PPTElement[], combineElementList: PPTElement[]) => {
|
|
|
+ return {
|
|
|
+ minLevel: elementList.findIndex(_element => _element.id === combineElementList[0].id),
|
|
|
+ maxLevel: elementList.findIndex(_element => _element.id === combineElementList[combineElementList.length - 1].id),
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- // 上移一层,返回移动后新的元素列表(下移一层逻辑类似)
|
|
|
+ /**
|
|
|
+ * 上移一层
|
|
|
+ * @param elementList 本页所有元素列表
|
|
|
+ * @param element 当前操作的元素
|
|
|
+ */
|
|
|
const moveUpElement = (elementList: PPTElement[], element: PPTElement) => {
|
|
|
const copyOfElementList: PPTElement[] = JSON.parse(JSON.stringify(elementList))
|
|
|
|
|
|
- // 被操作的元素是组合元素成员
|
|
|
+ // 如果被操作的元素是组合元素成员,需要将该组合全部成员一起进行移动
|
|
|
if (element.groupId) {
|
|
|
|
|
|
- // 获取该组合元素全部成员,以及组合元素层级范围
|
|
|
+ // 获取到该组合全部成员,以及所有成员的层级范围
|
|
|
const combineElementList = copyOfElementList.filter(_element => _element.groupId === element.groupId)
|
|
|
- const { minIndex, maxIndex } = getCombineElementIndexRange(elementList, combineElementList)
|
|
|
-
|
|
|
- // 无法移动(已经处在顶层)
|
|
|
- if (maxIndex === elementList.length - 1) return null
|
|
|
+ const { minLevel, maxLevel } = getCombineElementLevelRange(elementList, combineElementList)
|
|
|
|
|
|
- // 该组合元素上一层的元素,以下简称为【元素next】
|
|
|
- const nextElement = copyOfElementList[maxIndex + 1]
|
|
|
+ // 已经处在顶层,无法继续移动
|
|
|
+ if (maxLevel === elementList.length - 1) return
|
|
|
|
|
|
- // 从元素列表中移除该组合元素全部成员
|
|
|
- const movedElementList = copyOfElementList.splice(minIndex, combineElementList.length)
|
|
|
+ // 通过组合成员范围的最大值,获取到该组合上一层的元素,然后将该组合元素从元素列表中移除(并缓存被移除的元素列表)
|
|
|
+ // 若上层元素处在另一个组合中,则将上述被移除的组合元素插入到该上层组合上方
|
|
|
+ // 若上层元素不处于任何分组中,则将上述被移除的组合元素插入到该上层元素上方
|
|
|
+ const nextElement = copyOfElementList[maxLevel + 1]
|
|
|
+ const movedElementList = copyOfElementList.splice(minLevel, combineElementList.length)
|
|
|
|
|
|
- // 如果【元素next】也是组合元素成员(另一个组合,不是上面被移除的那一组,以下简称为【组合next】)
|
|
|
- // 需要获取【组合next】全部成员的长度,将上面移除的组合元素全部成员添加到【组合next】全部成员的上方
|
|
|
if (nextElement.groupId) {
|
|
|
const nextCombineElementList = copyOfElementList.filter(_element => _element.groupId === nextElement.groupId)
|
|
|
- copyOfElementList.splice(minIndex + nextCombineElementList.length, 0, ...movedElementList)
|
|
|
+ copyOfElementList.splice(minLevel + nextCombineElementList.length, 0, ...movedElementList)
|
|
|
}
|
|
|
-
|
|
|
- // 如果【元素next】是单独的元素(非组合成员),将上面移除的组合元素全部成员添加到【元素next】上方
|
|
|
- else copyOfElementList.splice(minIndex + 1, 0, ...movedElementList)
|
|
|
+ else copyOfElementList.splice(minLevel + 1, 0, ...movedElementList)
|
|
|
}
|
|
|
|
|
|
- // 被操作的元素是单独的元素(非组合成员)
|
|
|
+ // 如果被操作的元素不是组合元素成员
|
|
|
else {
|
|
|
|
|
|
- // 元素在元素列表中的层级
|
|
|
- const elementIndex = elementList.findIndex(item => item.id === element.id)
|
|
|
+ // 获取该元素在列表中的层级
|
|
|
+ const level = elementList.findIndex(item => item.id === element.id)
|
|
|
|
|
|
- // 无法移动(已经处在顶层)
|
|
|
- if (elementIndex === elementList.length - 1) return null
|
|
|
+ // 已经处在顶层,无法继续移动
|
|
|
+ if (level === elementList.length - 1) return
|
|
|
|
|
|
- // 上一层的元素,以下简称为【元素next】
|
|
|
- const nextElement = copyOfElementList[elementIndex + 1]
|
|
|
+ // 获取到该组合上一层的元素,然后将该组合元素从元素列表中移除(并缓存被移除的元素列表)
|
|
|
+ const nextElement = copyOfElementList[level + 1]
|
|
|
+ const movedElement = copyOfElementList.splice(level, 1)[0]
|
|
|
|
|
|
- // 从元素列表中移除被操作的元素
|
|
|
- const movedElement = copyOfElementList.splice(elementIndex, 1)[0]
|
|
|
-
|
|
|
- // 如果【元素next】是组合元素成员
|
|
|
- // 需要获取该组合全部成员的长度,将上面移除的元素添加到该组合全部成员的上方
|
|
|
+ // 通过组合成员范围的最大值,获取到该组合上一层的元素,然后将该组合元素从元素列表中移除(并缓存被移除的元素列表)
|
|
|
+ // 若上层元素处在另一个组合中,则将上述被移除的组合元素插入到该上层组合上方
|
|
|
+ // 若上层元素不处于任何分组中,则将上述被移除的组合元素插入到该上层元素上方
|
|
|
if (nextElement.groupId) {
|
|
|
const combineElementList = copyOfElementList.filter(_element => _element.groupId === nextElement.groupId)
|
|
|
- copyOfElementList.splice(elementIndex + combineElementList.length, 0, movedElement)
|
|
|
+ copyOfElementList.splice(level + combineElementList.length, 0, movedElement)
|
|
|
}
|
|
|
-
|
|
|
- // 如果【元素next】是单独的元素(非组合成员),将上面移除的元素添加到【元素next】上方
|
|
|
- else copyOfElementList.splice(elementIndex + 1, 0, movedElement)
|
|
|
+ else copyOfElementList.splice(level + 1, 0, movedElement)
|
|
|
}
|
|
|
|
|
|
return copyOfElementList
|
|
|
}
|
|
|
|
|
|
- // 下移一层
|
|
|
+ /**
|
|
|
+ * 下移一层,操作方式同上移
|
|
|
+ * @param elementList 本页所有元素列表
|
|
|
+ * @param element 当前操作的元素
|
|
|
+ */
|
|
|
const moveDownElement = (elementList: PPTElement[], element: PPTElement) => {
|
|
|
const copyOfElementList: PPTElement[] = JSON.parse(JSON.stringify(elementList))
|
|
|
|
|
|
if (element.groupId) {
|
|
|
const combineElementList = copyOfElementList.filter(_element => _element.groupId === element.groupId)
|
|
|
- const { minIndex } = getCombineElementIndexRange(elementList, combineElementList)
|
|
|
- if (minIndex === 0) return null
|
|
|
- const prevElement = copyOfElementList[minIndex - 1]
|
|
|
- const movedElementList = copyOfElementList.splice(minIndex, combineElementList.length)
|
|
|
+ const { minLevel } = getCombineElementLevelRange(elementList, combineElementList)
|
|
|
+ if (minLevel === 0) return
|
|
|
+
|
|
|
+ const prevElement = copyOfElementList[minLevel - 1]
|
|
|
+ const movedElementList = copyOfElementList.splice(minLevel, combineElementList.length)
|
|
|
+
|
|
|
if (prevElement.groupId) {
|
|
|
const prevCombineElementList = copyOfElementList.filter(_element => _element.groupId === prevElement.groupId)
|
|
|
- copyOfElementList.splice(minIndex - prevCombineElementList.length, 0, ...movedElementList)
|
|
|
+ copyOfElementList.splice(minLevel - prevCombineElementList.length, 0, ...movedElementList)
|
|
|
}
|
|
|
- else copyOfElementList.splice(minIndex - 1, 0, ...movedElementList)
|
|
|
+ else copyOfElementList.splice(minLevel - 1, 0, ...movedElementList)
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
- const elementIndex = elementList.findIndex(item => item.id === element.id)
|
|
|
- if (elementIndex === 0) return null
|
|
|
- const prevElement = copyOfElementList[elementIndex - 1]
|
|
|
- const movedElement = copyOfElementList.splice(elementIndex, 1)[0]
|
|
|
+ const level = elementList.findIndex(item => item.id === element.id)
|
|
|
+ if (level === 0) return
|
|
|
+
|
|
|
+ const prevElement = copyOfElementList[level - 1]
|
|
|
+ const movedElement = copyOfElementList.splice(level, 1)[0]
|
|
|
+
|
|
|
if (prevElement.groupId) {
|
|
|
const combineElementList = copyOfElementList.filter(_element => _element.groupId === prevElement.groupId)
|
|
|
- copyOfElementList.splice(elementIndex - combineElementList.length, 0, movedElement)
|
|
|
+ copyOfElementList.splice(level - combineElementList.length, 0, movedElement)
|
|
|
}
|
|
|
- else copyOfElementList.splice(elementIndex - 1, 0, movedElement)
|
|
|
+ else copyOfElementList.splice(level - 1, 0, movedElement)
|
|
|
}
|
|
|
|
|
|
return copyOfElementList
|
|
|
}
|
|
|
|
|
|
- // 置顶层,返回移动后新的元素列表(置底层逻辑类似)
|
|
|
+ /**
|
|
|
+ * 置顶层
|
|
|
+ * @param elementList 本页所有元素列表
|
|
|
+ * @param element 当前操作的元素
|
|
|
+ */
|
|
|
const moveTopElement = (elementList: PPTElement[], element: PPTElement) => {
|
|
|
const copyOfElementList: PPTElement[] = JSON.parse(JSON.stringify(elementList))
|
|
|
|
|
|
- // 被操作的元素是组合元素成员
|
|
|
+ // 如果被操作的元素是组合元素成员,需要将该组合全部成员一起进行移动
|
|
|
if (element.groupId) {
|
|
|
|
|
|
- // 获取该组合元素全部成员,以及组合元素层级范围
|
|
|
+ // 获取到该组合全部成员,以及所有成员的层级范围
|
|
|
const combineElementList = copyOfElementList.filter(_element => _element.groupId === element.groupId)
|
|
|
- const { minIndex, maxIndex } = getCombineElementIndexRange(elementList, combineElementList)
|
|
|
+ const { minLevel, maxLevel } = getCombineElementLevelRange(elementList, combineElementList)
|
|
|
|
|
|
- // 无法移动(已经处在顶层)
|
|
|
- if (maxIndex === elementList.length - 1) return null
|
|
|
+ // 已经处在顶层,无法继续移动
|
|
|
+ if (maxLevel === elementList.length - 1) return null
|
|
|
|
|
|
- // 从元素列表中移除该组合元素全部成员,然后添加到元素列表最上方
|
|
|
- const movedElementList = copyOfElementList.splice(minIndex, combineElementList.length)
|
|
|
+ // 将该组合元素从元素列表中移除,然后将被移除的元素添加到元素列表顶部
|
|
|
+ const movedElementList = copyOfElementList.splice(minLevel, combineElementList.length)
|
|
|
copyOfElementList.push(...movedElementList)
|
|
|
}
|
|
|
|
|
|
- // 被操作的元素是单独的元素(非组合成员)
|
|
|
+ // 如果被操作的元素不是组合元素成员
|
|
|
else {
|
|
|
|
|
|
- // 元素在元素列表中的层级
|
|
|
- const elementIndex = elementList.findIndex(item => item.id === element.id)
|
|
|
+ // 获取该元素在列表中的层级
|
|
|
+ const level = elementList.findIndex(item => item.id === element.id)
|
|
|
|
|
|
- // 无法移动(已经处在顶层)
|
|
|
- if (elementIndex === elementList.length - 1) return null
|
|
|
+ // 已经处在顶层,无法继续移动
|
|
|
+ if (level === elementList.length - 1) return null
|
|
|
|
|
|
- // 从元素列表中移除该元素,然后添加到元素列表最上方
|
|
|
- copyOfElementList.splice(elementIndex, 1)
|
|
|
+ // 将该组合元素从元素列表中移除,然后将被移除的元素添加到元素列表底部
|
|
|
+ copyOfElementList.splice(level, 1)
|
|
|
copyOfElementList.push(element)
|
|
|
}
|
|
|
|
|
|
return copyOfElementList
|
|
|
}
|
|
|
|
|
|
- // 置底层
|
|
|
+ /**
|
|
|
+ * 置底层,操作方式同置顶
|
|
|
+ * @param elementList 本页所有元素列表
|
|
|
+ * @param element 当前操作的元素
|
|
|
+ */
|
|
|
const moveBottomElement = (elementList: PPTElement[], element: PPTElement) => {
|
|
|
const copyOfElementList: PPTElement[] = JSON.parse(JSON.stringify(elementList))
|
|
|
|
|
|
if (element.groupId) {
|
|
|
const combineElementList = copyOfElementList.filter(_element => _element.groupId === element.groupId)
|
|
|
- const { minIndex } = getCombineElementIndexRange(elementList, combineElementList)
|
|
|
- if (minIndex === 0) return null
|
|
|
- const movedElementList = copyOfElementList.splice(minIndex, combineElementList.length)
|
|
|
+ const { minLevel } = getCombineElementLevelRange(elementList, combineElementList)
|
|
|
+ if (minLevel === 0) return
|
|
|
+
|
|
|
+ const movedElementList = copyOfElementList.splice(minLevel, combineElementList.length)
|
|
|
copyOfElementList.unshift(...movedElementList)
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
- const elementIndex = elementList.findIndex(item => item.id === element.id)
|
|
|
- if (elementIndex === 0) return null
|
|
|
- copyOfElementList.splice(elementIndex, 1)
|
|
|
+ const level = elementList.findIndex(item => item.id === element.id)
|
|
|
+ if (level === 0) return
|
|
|
+
|
|
|
+ copyOfElementList.splice(level, 1)
|
|
|
copyOfElementList.unshift(element)
|
|
|
}
|
|
|
|
|
|
return copyOfElementList
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 调整元素层级
|
|
|
+ * @param element 需要调整层级的元素
|
|
|
+ * @param command 调整命令:上移、下移、置顶、置底
|
|
|
+ */
|
|
|
const orderElement = (element: PPTElement, command: ElementOrderCommand) => {
|
|
|
- let newElementList = null
|
|
|
+ let newElementList
|
|
|
|
|
|
if (command === ElementOrderCommands.UP) newElementList = moveUpElement(currentSlide.value.elements, element)
|
|
|
else if (command === ElementOrderCommands.DOWN) newElementList = moveDownElement(currentSlide.value.elements, element)
|