2024-07-03 17:57:10 +08:00
|
|
|
class NewPage {
|
|
|
|
constructor(id) {
|
|
|
|
this.id = id;
|
|
|
|
this.type = 'page';
|
|
|
|
this.children = [];
|
|
|
|
}
|
|
|
|
}
|
2024-05-06 14:24:39 +08:00
|
|
|
|
|
|
|
export default class PageUtils {
|
|
|
|
|
2024-06-07 09:45:05 +08:00
|
|
|
static addPage(navigation, page_id, parentId) {
|
|
|
|
if (!parentId) {
|
2024-07-03 17:57:10 +08:00
|
|
|
navigation.push(new NewPage(page_id));
|
2024-06-07 09:45:05 +08:00
|
|
|
} else {
|
|
|
|
navigation.forEach(item => {
|
|
|
|
this._addPageRecursion(page_id, item, parentId);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
2024-05-06 14:24:39 +08:00
|
|
|
|
2024-06-07 09:45:05 +08:00
|
|
|
static _addPageRecursion(page_id, item, parentId) {
|
|
|
|
if (!Array.isArray(item.children)) {
|
|
|
|
item.children = [];
|
2024-05-06 14:24:39 +08:00
|
|
|
}
|
2024-06-07 09:45:05 +08:00
|
|
|
if (item.id === parentId) {
|
2024-07-03 17:57:10 +08:00
|
|
|
item.children.push(new NewPage(page_id));
|
2024-06-07 09:45:05 +08:00
|
|
|
return true;
|
|
|
|
}
|
2024-07-03 17:57:10 +08:00
|
|
|
item.children && item.children.forEach(item => {
|
2024-06-07 09:45:05 +08:00
|
|
|
this._addPageRecursion(page_id, item, parentId);
|
|
|
|
});
|
|
|
|
}
|
2024-05-06 14:24:39 +08:00
|
|
|
|
2024-06-07 09:45:05 +08:00
|
|
|
static deletePage(navigation, page_id) {
|
|
|
|
const pageIndex = navigation.findIndex(item => item.id === page_id);
|
|
|
|
if (pageIndex > -1) {
|
|
|
|
navigation.splice(pageIndex, 1);
|
|
|
|
return true;
|
2024-05-06 14:24:39 +08:00
|
|
|
}
|
2024-06-07 09:45:05 +08:00
|
|
|
navigation.forEach(item => {
|
|
|
|
this._deletePageRecursion(item, page_id);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
static _deletePageRecursion(item, page_id) {
|
|
|
|
if (!item || !Array.isArray(item.children)) return;
|
|
|
|
let pageIndex = item.children.findIndex(item => item.id === page_id);
|
|
|
|
if (pageIndex > -1) {
|
|
|
|
item.children.splice(pageIndex, 1);
|
|
|
|
return true;
|
|
|
|
}
|
2024-07-03 17:57:10 +08:00
|
|
|
item.children && item.children.forEach(item => {
|
2024-06-07 09:45:05 +08:00
|
|
|
this._deletePageRecursion(item, page_id);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
static getPageById = (pages, page_id) => {
|
|
|
|
if (!page_id || !Array.isArray(pages)) return null;
|
|
|
|
return pages.find((page) => page.id === page_id) || null;
|
2024-05-06 14:24:39 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
static getPageIndexById = (pageId, pages) => {
|
|
|
|
return pages.findIndex(page => page.id === pageId);
|
|
|
|
};
|
|
|
|
|
2024-06-07 09:45:05 +08:00
|
|
|
static insertPage(navigation, page_id, target_page_id, target_id, move_position) {
|
|
|
|
if (!target_id) {
|
2024-05-06 14:24:39 +08:00
|
|
|
let insertIndex = target_page_id ? navigation.findIndex(item => item.id === target_page_id) : -1;
|
|
|
|
if (insertIndex < 0) {
|
2024-06-07 09:45:05 +08:00
|
|
|
this.addPage(navigation, page_id, target_id);
|
2024-05-06 14:24:39 +08:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
if (move_position === 'move_below') {
|
|
|
|
insertIndex++;
|
|
|
|
}
|
2024-07-03 17:57:10 +08:00
|
|
|
navigation.splice(insertIndex, 0, new NewPage(page_id));
|
2024-05-06 14:24:39 +08:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-07-03 17:57:10 +08:00
|
|
|
static movePage(navigation, moved_page_id, target_page_id, move_position) {
|
2024-06-07 09:45:05 +08:00
|
|
|
let movedPage = null;
|
|
|
|
function _cutPageRecursion(item, page_id) {
|
|
|
|
if (!item || !Array.isArray(item.children) || movedPage) return;
|
|
|
|
let pageIndex = item.children.findIndex(item => item.id === page_id);
|
|
|
|
if (pageIndex > -1) {
|
|
|
|
movedPage = item.children.splice(pageIndex, 1)[0];
|
|
|
|
} else {
|
2024-07-03 17:57:10 +08:00
|
|
|
item.children && item.children.forEach(item => {
|
2024-06-07 09:45:05 +08:00
|
|
|
_cutPageRecursion(item, page_id);
|
|
|
|
});
|
|
|
|
}
|
2024-05-06 14:24:39 +08:00
|
|
|
}
|
2024-06-07 09:45:05 +08:00
|
|
|
function _cutPage(navigation, page_id) {
|
|
|
|
const pageIndex = navigation.findIndex(item => item.id === page_id);
|
|
|
|
if (pageIndex > -1) {
|
|
|
|
movedPage = navigation.splice(pageIndex, 1)[0];
|
|
|
|
} else {
|
|
|
|
navigation.forEach(item => {
|
|
|
|
_cutPageRecursion(item, page_id);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function _insertPageRecursion(item, page_id, target_page_id, target_id, move_position) {
|
|
|
|
if (item.id === target_id) {
|
2024-07-15 13:46:05 +08:00
|
|
|
if (item.children) {
|
|
|
|
let insertIndex = target_page_id ? item.children.findIndex(item => item.id === target_page_id) : -1;
|
|
|
|
if (move_position === 'move_below') {
|
|
|
|
insertIndex++;
|
|
|
|
}
|
|
|
|
item.children.splice(insertIndex, 0, movedPage);
|
|
|
|
} else {
|
|
|
|
item.children = [];
|
|
|
|
item.children.push(movedPage);
|
2024-05-06 14:24:39 +08:00
|
|
|
}
|
2024-06-07 09:45:05 +08:00
|
|
|
return;
|
|
|
|
}
|
2024-07-03 17:57:10 +08:00
|
|
|
item.children && item.children.forEach(item => {
|
2024-06-07 09:45:05 +08:00
|
|
|
_insertPageRecursion(item, page_id, target_page_id, target_id, move_position);
|
2024-05-06 14:24:39 +08:00
|
|
|
});
|
|
|
|
}
|
2024-06-07 09:45:05 +08:00
|
|
|
function _insertPage(navigation, page_id, target_page_id, target_id, move_position) {
|
|
|
|
if (!target_id) {
|
|
|
|
let insertIndex = target_page_id ? navigation.findIndex(item => item.id === target_page_id) : -1;
|
|
|
|
if (insertIndex < 0) {
|
|
|
|
navigation.splice(0, 0, movedPage);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (move_position === 'move_below') {
|
|
|
|
insertIndex++;
|
|
|
|
}
|
|
|
|
navigation.splice(insertIndex, 0, movedPage);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
navigation.forEach(item => {
|
|
|
|
_insertPageRecursion(item, page_id, target_page_id, target_id, move_position);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
_cutPage(navigation, moved_page_id);
|
2024-07-03 17:57:10 +08:00
|
|
|
_insertPage(navigation, moved_page_id, target_page_id, target_page_id, move_position);
|
2024-05-06 14:24:39 +08:00
|
|
|
}
|
|
|
|
}
|