/**
* This file is part of the NocoBase (R) project.
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
* Authors: NocoBase Team.
*
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
* For more information, please refer to: https://www.nocobase.com/agreement.
*/
import { createForm, Form, onFormValuesChange } from '@formily/core';
import { uid } from '@formily/shared';
import {
css,
SchemaComponent,
useAllAccessDesktopRoutes,
useAPIClient,
useCompile,
useRequest,
} from '@nocobase/client';
import { useMemoizedFn } from 'ahooks';
import { Checkbox, message, Table, TableProps } from 'antd';
import { uniq } from 'lodash';
import React, { createContext, FC, useContext, useEffect, useMemo, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { RolesManagerContext } from '../RolesManagerProvider';
interface MenuItem {
title: string;
id: number;
children?: MenuItem[];
parent?: MenuItem;
}
const toItems = (items, parent?: MenuItem): MenuItem[] => {
if (!Array.isArray(items)) {
return [];
}
return items.map((item) => {
const children = toItems(item.children, item);
const hideChildren = children.length === 0;
return {
title: item.title,
id: item.id,
children: hideChildren ? null : children,
hideChildren,
firstTabId: children[0]?.id,
parent,
};
});
};
const getAllChildrenId = (items) => {
if (!Array.isArray(items)) {
return [];
}
const IDList = [];
for (const item of items) {
IDList.push(item.id);
IDList.push(...getAllChildrenId(item.children));
}
return IDList;
};
const style = css`
.ant-table-cell {
> .ant-space-horizontal {
.ant-space-item-split:has(+ .ant-space-item:empty) {
display: none;
}
}
}
`;
const translateTitle = (menus: any[], t, compile) => {
return menus.map((menu) => {
const title =
(menu.title?.match(/^\s*\{\{\s*.+?\s*\}\}\s*$/) ? compile(menu.title) : t(menu.title)) || t('Unnamed');
if (menu.children) {
return {
...menu,
title,
children: translateTitle(menu.children, t, compile),
};
}
return {
...menu,
title,
};
});
};
const DesktopRoutesContext = createContext<{ routeList: any[] }>({ routeList: [] });
const useDesktopRoutes = () => {
return useContext(DesktopRoutesContext);
};
const DesktopRoutesProvider: FC<{
refreshRef?: any;
}> = ({ children, refreshRef }) => {
const api = useAPIClient();
const resource = useMemo(() => api.resource('desktopRoutes'), [api]);
const { data, runAsync: refresh } = useRequest<{ data: any[] }>(
() =>
resource
.list({
tree: true,
sort: 'sort',
paginate: false,
filter: {
hidden: { $ne: true },
},
})
.then((res) => res.data),
{
manual: true,
},
);
if (refreshRef) {
refreshRef.current = refresh;
}
const routeList = useMemo(() => data?.data || [], [data]);
const value = useMemo(() => ({ routeList }), [routeList]);
return