import { message } from 'antd';
import { OptsItemProps, FieldsProps } from '@/components/Adad/advForm';
import moment from 'moment';
import { getLs, setLs } from './common';
const reg = /(((^https?:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+(?::\d+)?|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)$/;
const isUrl = (path: string): boolean => reg.test(path);
export const isEmpty = (value: any) =>
value === null ||
value === undefined ||
value === '' ||
value === {} ||
value === [] ||
value.length === 0;
export const isNotEmpty = (value: any) => !isEmpty(value);
const isAntDesignPro = (): boolean => {
if (ANT_DESIGN_PRO_ONLY_DO_NOT_USE_IN_YOUR_PRODUCTION === 'site') {
return true;
}
return window.location.hostname === 'preview.pro.ant.design';
};
export const setJsonArray = (data: any[], nodeKey: string = 'subMenu') => {
let result: any[] = [];
data.forEach(json => {
if (json) {
if (isNotEmpty(json[nodeKey])) {
result = result.concat(setJsonArray(json[nodeKey]));
}
result.push(json);
}
});
return result;
};
const findRootParentIds = (data: any[], levelParam: string) => {
const rootParentIds: string[] = [];
let minLevel: number = -1;
let isFirst = true;
for (const item of data) {
const levelData = parseInt(item[levelParam]);
if (isNaN(levelData)) {
} else if (isFirst) {
minLevel = levelData;
isFirst = false;
} else if (minLevel > levelData) {
minLevel = levelData;
}
}
if (isNotEmpty(minLevel)) {
const dataByMinLevel = data.filter(
item => item[levelParam] && parseInt(item[levelParam]) === minLevel,
);
for (const dataItem of dataByMinLevel) {
const { parentId } = dataItem;
if (parentId && !rootParentIds.includes(parentId)) {
rootParentIds.push(parentId);
}
}
}
return rootParentIds;
};
export const setCommonJsonArrayNest = (
data: any[],
parentId: string = '0',
subParam: string = 'subMenu',
dataId: string = 'menuId',
): any[] => {
const result: any[] = [];
let temp;
if (data) {
data.forEach(json => {
if (json.parentId === parentId) {
temp = setCommonJsonArrayNest(data, json[dataId], subParam, dataId);
if (isNotEmpty(temp)) {
json[subParam] = temp;
}
result.push(json);
}
});
}
return result;
};
export const convertListToTreeJson = (
data: any[],
parentId: string = '0',
subParam: string = 'subMenu',
dataId: string = 'menuId',
levelParam: string = 'menuLevel',
) => {
const result = [];
if (data) {
const rootParentIds = findRootParentIds(data, levelParam);
if (rootParentIds.length > 0) {
for (const rootParentId of rootParentIds) {
const tempResultArray = setCommonJsonArrayNest(data, rootParentId, subParam, dataId);
for (const tempResult of tempResultArray) {
result.push(tempResult);
}
}
}
}
return result;
};
export const getSession = (key: string) => sessionStorage.getItem(key);
export const setSession = (key: string, value: string, check = false) => {
if (check) {
if (isEmpty(getSession(key))) {
sessionStorage.setItem(key, value);
}
} else {
sessionStorage.setItem(key, value);
}
};
export const removeSession = (key: string) => sessionStorage.removeItem(key);
export const setDocumentTitle = (title: string) => {
document.title = title;
};
export const setAppTitle = (sysName: string, sysVersion: string) => {
let title;
const whitespace = ' ';
if (sysName.includes('V') || sysName.includes('v')) {
title = sysName;
} else if (sysVersion.includes('V') || sysVersion.includes('v')) {
title = `${sysName}${whitespace}${sysVersion}`;
} else {
title = `${sysName}${whitespace}v${sysVersion}`;
}
setDocumentTitle(title);
};
export function loadScript(src: string) {
return new Promise((resolve, reject) => {
const script = document.createElement('script');
script.type = 'text/javascript';
script.src = src;
script.onload = resolve;
script.onerror = reject;
if (document.head) {
document.head.appendChild(script);
}
});
}
let lessNodesAppended = false;
export const setThemes = (obj: object, func: Function, set: boolean = true) => {
if (!obj) {
return;
}
function buildIt() {
if (!window.less) {
return;
}
setTimeout(() => {
window.less
.modifyVars(obj)
.then(() => {
if (set) {
message.destroy();
message.success('预览主题成功.');
if (func) {
func();
}
}
})
.catch(() => {
message.error('编译失败!');
});
}, 200);
}
if (!lessNodesAppended) {
const lessStyleNode = document.createElement('link');
const lessConfigNode = document.createElement('script');
const lessScriptNode = document.createElement('script');
lessStyleNode.setAttribute('rel', 'stylesheet/less');
lessStyleNode.setAttribute('href', '/color.less');
lessConfigNode.innerHTML = `
window.less = {
async: true,
env: 'production',
javascriptEnabled: true
};
`;
lessScriptNode.src = 'https://gw.alipayobjects.com/os/lib/less.js/3.8.1/less.min.js';
lessScriptNode.async = true;
lessScriptNode.onload = () => {
buildIt();
lessScriptNode.onload = null;
};
document.body.appendChild(lessStyleNode);
document.body.appendChild(lessConfigNode);
document.body.appendChild(lessScriptNode);
lessNodesAppended = true;
} else {
buildIt();
}
};
export const parseThemes = (str: string) => {
let obj = {};
if (isNotEmpty(str)) {
try {
obj = JSON.parse(
str
.replace('@header', '@head-back-color')
.replace('@sider', '@sider-back-color')
.replace('@font', '@sider-select-color')
.replace('@button', '@select-color')
.replace('@table', '@table-header-color'),
);
} catch (e) { }
}
return obj;
};
export const getNodeHandle = (): ((json: any[], nodeId: string) => object) => {
let parentNode: any[] = [];
let node: any = null;
const getNode = (json: any[], nodeId: string): object => {
for (let i = 0; i < json.length; i++) {
if (node) {
break;
}
const obj = json[i];
if (!obj || !obj.menuId) {
continue;
}
if (obj.menuId === nodeId) {
node = obj;
break;
} else {
if (obj.subMenu) {
parentNode.push(obj);
getNode(obj.subMenu, nodeId);
}
}
}
if (!node) {
parentNode = [];
}
let path = '';
parentNode.map(item => {
path += `${item.menuName}/`;
});
if (node) {
path += `${node.menuName}`;
}
return {
...node,
path,
};
};
return getNode;
};
export const getTabPaneData = ({
key,
title,
content,
path,
isWebDefault = false,
closable = false,
isMenu = true,
refKey = '',
isExternal = false,
url,
}: any) => {
if (url) {
return {
paneKey: key,
name: title,
menuUrl: url,
path: path || `/app/modules/${key}`,
isWebDefault,
closable,
isMenu,
refKey,
isExternal,
};
}
return {
paneKey: key,
name: title,
content,
path: path || `/app/${key}`,
isWebDefault,
closable,
isMenu,
refKey,
isExternal,
};
};
export const dateFormat = (inputTime: string, fmt: string) => {
if (!inputTime) return "";
let date = new Date(inputTime);
let o = {
'M+': date.getMonth() + 1,
'd+': date.getDate(),
'h+': date.getHours(),
'm+': date.getMinutes(),
's+': date.getSeconds(),
'q+': Math.floor((date.getMonth() + 3) / 3),
S: date.getMilliseconds(),
};
if (/(y+)/.test(fmt))
fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));
for (let k in o)
if (new RegExp('(' + k + ')').test(fmt))
fmt = fmt.replace(
RegExp.$1,
RegExp.$1.length == 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length),
);
return fmt;
};
export declare interface RTreeDataItem {
id?: string | number;
treeId: string | number;
key?: string | number;
value?: string | number;
title?: string;
children?: Array<RTreeDataItem>;
}
export const rTreeDataFormat = (treeData: Array<RTreeDataItem>): Array<RTreeDataItem> => {
return treeData.map(v => ({ ...v, value: v.treeId, key: v.treeId, children: rTreeDataFormat(v.children || []) }))
}
export const getNameById = (id: any, arr: Array<OptsItemProps>): string => {
const filterArr = arr.filter(v => v.id == id);
return filterArr.length > 0 ? filterArr[0].name : "";
}
export const initFieldsList = (fieldsList: FieldsProps[]): FieldsProps[] => {
return fieldsList.map(v => {
v.value = v.originValue;
return v;
})
}
export const bindFormValues = (record: any = {}, fieldsList: FieldsProps[]) => {
return fieldsList.map(v => {
if (v.editor === 'datePicker') {
v.value = record[v.name] ? moment.utc(record[v.name]) : null;
} else {
v.value = record[v.name];
}
return v;
});
}
declare interface treeItemProps {
children?: Array<treeItemProps>
[propName: string]: any;
}
export const treeToList = (treeData: treeItemProps[], resultData: treeItemProps[] = []) => {
treeData.map(v => {
resultData.push({
...v, children: undefined
});
if (v.children && v.children.length > 0) {
treeToList(v.children, resultData)
}
});
return resultData;
}
export const getObjectById = (id = "", treeData: treeItemProps[]) => {
const filterArr = treeToList(treeData).filter(v => v.id === id);
if (filterArr.length > 0) {
return filterArr[0]
} else {
return {}
}
}
export const activeMenuItem = (record: any = {}) => {
const currentActiveMenu = getLs("currentActiveMenu", true) || [];
const _currentActiveMenu = currentActiveMenu.filter((v: any) => v.url !== record.url);
const resultArr: Array<any> = [record];
_currentActiveMenu.map((item: any, index: number) => {
if (_currentActiveMenu.length - 9 <= index) resultArr.push(item)
})
setLs("currentActiveMenu", [...resultArr], true);
}
export { isAntDesignPro, isUrl };