1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-09 10:50:24 +00:00
Files
seahub/frontend/src/pages/wiki2/utils/index.js
2024-12-16 09:43:40 +08:00

146 lines
3.4 KiB
JavaScript

import { serviceURL, mediaUrl } from '../../../utils/constants';
const generatorBase64Code = (keyLength = 4) => {
let possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz0123456789';
let key = '';
for (let i = 0; i < keyLength; i++) {
key += possible.charAt(Math.floor(Math.random() * possible.length));
}
return key;
};
const generateUniqueId = (navigation = [], length = 4) => {
let idMap = {};
function recurseItem(item) {
if (!item) return;
idMap[item.id] = true;
if (Array.isArray(item.children)) {
item.children.forEach(item => {
recurseItem(item);
});
}
}
navigation.forEach(item => recurseItem(item));
let _id = generatorBase64Code(length);
while (idMap[_id]) {
_id = generatorBase64Code(length);
}
return _id;
};
const isObjectNotEmpty = (obj) => {
return obj && Object.keys(obj).length > 0;
};
const getIconURL = (repoId, fileName) => {
if (!fileName) {
return null;
}
if (fileName === 'default') {
return `${mediaUrl}img/wiki/default.png`;
}
return serviceURL + '/lib/' + repoId + '/file/_Internal/Wiki/Icon/' + fileName + '?raw=1';
};
const getCurrentPageConfig = (pages, pageId) => {
return pages.filter(page => page.id === pageId)[0];
};
const getWikPageLink = (pageId) => {
const { origin, pathname } = window.location;
return `${origin}${pathname}?page_id=${pageId}`;
};
const throttle = (fn, delay) => {
let timer;
return function () {
let _this = this;
let args = arguments;
if (timer) {
return;
}
timer = setTimeout(function () {
fn.apply(_this, args);
timer = null;
}, delay);
};
};
// Find the path array from the root to the leaf based on the currentPageId (leaf)
const getPaths = (navigation, currentPageId, pages, isGetPathStr) => {
let idPageMap = {};
pages.forEach(page => idPageMap[page.id] = page);
navigation.forEach(item => {
if (!idPageMap[item.id]) {
idPageMap[item.id] = item;
}
});
let pathStr = null;
let curNode = null;
function runNode(node) {
const newPath = node._path ? (node._path + '-' + node.id) : node.id;
if (node.id === currentPageId) {
pathStr = newPath;
curNode = node;
return;
}
if (node.children) {
node.children.forEach(child => {
if (child) {
child._path = newPath;
runNode(child);
}
});
}
}
let root = {};
root.id = '';
root._path = '';
root.children = navigation;
runNode(root);
if (!pathStr) return [];
if (isGetPathStr) return {
paths: pathStr,
curNode
};
return pathStr.split('-').map(id => idPageMap[id]);
};
const getNamePaths = (config, pageId) => {
const { navigation, pages } = config;
const { paths, curNode } = getPaths(navigation, pageId, pages, true);
if (!paths || !curNode) {
return { path: null, isDir: false };
}
const pathArr = paths.split('-');
const nameArr = [];
if (pathArr.length > 1) {
pathArr.forEach(pid => {
const page = pages.find((item) => item.id === pid);
if (page) {
const { name } = page;
nameArr.push(name);
}
});
}
return {
path: nameArr.length === 0 ? '' : nameArr.slice(0, -1).join(' / '),
isDir: curNode?.children?.length ? true : false
};
};
export {
generatorBase64Code,
generateUniqueId,
isObjectNotEmpty,
getIconURL,
getCurrentPageConfig,
getWikPageLink,
throttle,
getPaths,
getNamePaths
};