diff --git a/.cursor/mcp.json b/.cursor/mcp.json index a7731d6a44..700113020f 100644 --- a/.cursor/mcp.json +++ b/.cursor/mcp.json @@ -1,7 +1,3 @@ { - "mcpServers": { - "nx-mcp": { - "url": "http://localhost:9216/sse" - } - } + "mcpServers": {} } \ No newline at end of file diff --git a/frontend/core-ui/src/modules/app/hooks/usePluginsRouter.tsx b/frontend/core-ui/src/modules/app/hooks/usePluginsRouter.tsx index 345b1ad14f..8296e09a21 100644 --- a/frontend/core-ui/src/modules/app/hooks/usePluginsRouter.tsx +++ b/frontend/core-ui/src/modules/app/hooks/usePluginsRouter.tsx @@ -8,23 +8,14 @@ export const getPluginsRoutes = () => { const [pluginsMetaData] = useAtom(pluginsConfigState); const plugins = Object.values(pluginsMetaData || {}); - const allModules = plugins.flatMap((plugin) => - plugin.modules - .filter((module) => !module.settingsOnly) - .map((module) => ({ - ...module, - pluginName: plugin.name, - })), - ); - - return allModules.map((module) => ( + return plugins.map((module) => ( } @@ -36,24 +27,17 @@ export const getPluginsSettingsRoutes = () => { const [pluginsMetaData] = useAtom(pluginsConfigState); const plugins = Object.values(pluginsMetaData || {}); - const settingsModules = plugins.flatMap((plugin) => - plugin.modules - .filter((module) => module.hasSettings || module.settingsOnly) - .map((module) => ({ - ...module, - pluginName: plugin.name, - })), - ); + console.log(plugins); - return settingsModules.map((module) => ( + return plugins.map((plugin) => ( } /> diff --git a/frontend/core-ui/src/modules/navigation/components/NavigationPlugins.tsx b/frontend/core-ui/src/modules/navigation/components/NavigationPlugins.tsx index cfcf771119..54e1e5c5c7 100644 --- a/frontend/core-ui/src/modules/navigation/components/NavigationPlugins.tsx +++ b/frontend/core-ui/src/modules/navigation/components/NavigationPlugins.tsx @@ -1,6 +1,6 @@ import { IconChevronLeft } from '@tabler/icons-react'; import { activePluginState, NavigationMenuGroup, Sidebar } from 'erxes-ui'; -import { usePluginsNavigationGroups } from '../hooks/usePluginsModules'; +import { usePluginsNavigationGroups } from '../hooks/usePlugins'; import { useAtom } from 'jotai'; export const NavigationPluginExitButton = () => { @@ -36,6 +36,7 @@ export const NavigationPlugins = () => { } if (activePlugin && navigationGroups[activePlugin]) { + const subGroups = navigationGroups[activePlugin].subGroups; return ( <> { ))} - {navigationGroups[activePlugin].subGroups.map((SubGroup, index) => ( + {subGroups.map((SubGroup, index) => ( ))} diff --git a/frontend/core-ui/src/modules/navigation/hooks/useFavorites.tsx b/frontend/core-ui/src/modules/navigation/hooks/useFavorites.tsx index fc017686dc..cf17f5318c 100644 --- a/frontend/core-ui/src/modules/navigation/hooks/useFavorites.tsx +++ b/frontend/core-ui/src/modules/navigation/hooks/useFavorites.tsx @@ -1,6 +1,5 @@ import { useQuery } from '@apollo/client'; import { GET_FAVORITES } from '@/navigation/graphql/queries/getFavorites'; -import { usePluginsModules } from '@/navigation/hooks/usePluginsModules'; import { useAtomValue } from 'jotai'; import { currentUserState } from 'ui-modules'; @@ -21,7 +20,6 @@ interface GetFavoritesResponse { } export function useFavorites(): FavoriteModule[] { - const modules = usePluginsModules(); const currentUser = useAtomValue(currentUserState); const { data } = useQuery(GET_FAVORITES, { @@ -30,39 +28,5 @@ export function useFavorites(): FavoriteModule[] { const favorites = data?.getFavoritesByCurrentUser ?? []; - return favorites.reduce((acc, favorite) => { - if (favorite.type === 'module') { - const module = modules.find( - (m) => m.path === favorite.path.replace('/', ''), - ); - - if (module) { - acc.push({ - name: module.name, - icon: module.icon, - path: module.path, - }); - } else { - const moduleWithSubmenu = modules.find( - (m) => m.path === favorite.path.split('/')[1], - ); - - if (moduleWithSubmenu?.submenus) { - const matchingSubmenu = moduleWithSubmenu.submenus.find( - (sub) => sub.path === favorite.path.replace('/', ''), - ); - - if (matchingSubmenu) { - acc.push({ - name: matchingSubmenu.name, - icon: matchingSubmenu.icon || moduleWithSubmenu.icon, - path: matchingSubmenu.path, - }); - } - } - } - } - - return acc; - }, []); + return []; } diff --git a/frontend/core-ui/src/modules/navigation/hooks/usePluginsModules.tsx b/frontend/core-ui/src/modules/navigation/hooks/usePlugins.tsx similarity index 97% rename from frontend/core-ui/src/modules/navigation/hooks/usePluginsModules.tsx rename to frontend/core-ui/src/modules/navigation/hooks/usePlugins.tsx index a9cb4a7a67..5368b4dcbd 100644 --- a/frontend/core-ui/src/modules/navigation/hooks/usePluginsModules.tsx +++ b/frontend/core-ui/src/modules/navigation/hooks/usePlugins.tsx @@ -61,7 +61,7 @@ export const usePluginsNavigationGroups = (): NavigationGroups => { ? [...existingGroup.contents, newContent] : existingGroup.contents; - const newSubGroup = plugin.navigationGroup?.subGroups; + const newSubGroup = plugin.navigationGroup?.subGroup; const updatedSubGroups = newSubGroup ? [...existingGroup.subGroups, newSubGroup] : existingGroup.subGroups; diff --git a/frontend/core-ui/src/modules/settings/components/SettingsSidebar.tsx b/frontend/core-ui/src/modules/settings/components/SettingsSidebar.tsx index a7a012357c..ca058c2e02 100644 --- a/frontend/core-ui/src/modules/settings/components/SettingsSidebar.tsx +++ b/frontend/core-ui/src/modules/settings/components/SettingsSidebar.tsx @@ -80,22 +80,9 @@ export function SettingsSidebar() { ))} - {Array.from(pluginsWithSettingsModules.entries()).map( - ([pluginName, modules]) => ( - - {modules.map((item) => ( - - ))} - - ), + {pluginSettingsNavigations.map( + (SettingsNavigation, index) => + SettingsNavigation && , )} @@ -109,7 +96,6 @@ export const SettingsNavigationGroup = ({ name: string; children: React.ReactNode; }) => { - if (React.Children.count(children) === 0) return null; return ( diff --git a/frontend/core-ui/src/modules/widgets/components/FloatingWidgets.tsx b/frontend/core-ui/src/modules/widgets/components/FloatingWidgets.tsx index 5231db46fd..97d049d226 100644 --- a/frontend/core-ui/src/modules/widgets/components/FloatingWidgets.tsx +++ b/frontend/core-ui/src/modules/widgets/components/FloatingWidgets.tsx @@ -7,7 +7,7 @@ export const FloatingWidgets = () => { return modules.map((module) => ( { const plugins = Object.values(pluginsMetaData); - return plugins.flatMap((plugin) => - plugin.modules - .filter((module) => module.hasFloatingWidget) - .map((module) => ({ - ...module, - pluginName: plugin.name, - })), - ); + return plugins.filter((plugin) => plugin.hasFloatingWidget); }; diff --git a/frontend/core-ui/src/plugins/components/RenderPluginsComponent.tsx b/frontend/core-ui/src/plugins/components/RenderPluginsComponent.tsx index 495a6a53dd..85187e986c 100644 --- a/frontend/core-ui/src/plugins/components/RenderPluginsComponent.tsx +++ b/frontend/core-ui/src/plugins/components/RenderPluginsComponent.tsx @@ -22,6 +22,8 @@ export function RenderPluginsComponent({ const [isLoading, setIsLoading] = useState(true); const [hasError, setHasError] = useState<{ message: string } | null>(null); + console.log(pluginName, remoteModuleName, moduleName); + useEffect(() => { const loadPlugin = async () => { try { diff --git a/frontend/core-ui/src/plugins/constants/core-plugins.constants.ts b/frontend/core-ui/src/plugins/constants/core-plugins.constants.ts index 2e50ce2d1a..84d171475e 100644 --- a/frontend/core-ui/src/plugins/constants/core-plugins.constants.ts +++ b/frontend/core-ui/src/plugins/constants/core-plugins.constants.ts @@ -10,7 +10,6 @@ import { IconSpiral, IconUser, } from '@tabler/icons-react'; -import { IUIConfig } from 'erxes-ui'; export const GET_CORE_MODULES = (version?: boolean): IUIConfig['modules'] => { const MODULES: IUIConfig['modules'] = [ diff --git a/frontend/core-ui/tsconfig.json b/frontend/core-ui/tsconfig.json index 6156a58581..cbd818b66d 100644 --- a/frontend/core-ui/tsconfig.json +++ b/frontend/core-ui/tsconfig.json @@ -10,10 +10,10 @@ "erxes-ui/*": ["frontend/libs/erxes-ui/src/*"], "ui-modules": ["frontend/libs/ui-modules/src"], "ui-modules/*": ["frontend/libs/ui-modules/src/*"], - "@/*": ["frontend/core-ui/src/modules/*"], "@": ["frontend/core-ui/src/modules"], - "~/*": ["frontend/core-ui/src/*"], - "~": ["frontend/core-ui/src"] + "@/*": ["frontend/core-ui/src/modules/*"], + "~": ["frontend/core-ui/src"], + "~/*": ["frontend/core-ui/src/*"] } }, "files": [], diff --git a/frontend/libs/erxes-ui/src/modules/navigation-menu/components/NavigationMenu.tsx b/frontend/libs/erxes-ui/src/modules/navigation-menu/components/NavigationMenu.tsx index 63fe3c8871..54e2eaa77c 100644 --- a/frontend/libs/erxes-ui/src/modules/navigation-menu/components/NavigationMenu.tsx +++ b/frontend/libs/erxes-ui/src/modules/navigation-menu/components/NavigationMenu.tsx @@ -27,7 +27,10 @@ export const NavigationMenuLinkItem = forwardRef< ) => { const { pathname } = useLocation(); const fullPath = pathPrefix ? `${pathPrefix}/${path}` : path; - const isActive = pathname.startsWith(`/${fullPath}`); + + const isActive = pathname.startsWith( + fullPath?.startsWith('/') ? fullPath : `/${fullPath}`, + ); return ( , + React.ComponentProps +>(({ pathPrefix, ...props }, ref) => { + const settingsPathPrefix = + '/settings' + (pathPrefix?.startsWith('/') ? pathPrefix : `/${pathPrefix}`); + return ( + + ); +}); + export const NavigationMenuItem = forwardRef< React.ElementRef, React.ComponentProps & { diff --git a/frontend/libs/erxes-ui/src/types/UIConfig.ts b/frontend/libs/erxes-ui/src/types/UIConfig.ts index 693e447ed2..d9e2f2b89d 100644 --- a/frontend/libs/erxes-ui/src/types/UIConfig.ts +++ b/frontend/libs/erxes-ui/src/types/UIConfig.ts @@ -1,27 +1,14 @@ export type IUIConfig = { name: string; - icon?: React.ElementType; + path: string; + hasFloatingWidget?: boolean; + settingsNavigation?: () => React.ReactNode; navigationGroup?: { name: string; icon: React.ElementType; content: () => React.ReactNode; - subGroups?: () => React.ReactNode; + subGroup?: () => React.ReactNode; }; - modules: { - name: string; - icon?: React.ElementType; - path: string; - hasSettings?: boolean; - hasRelationWidget?: boolean; - hasFloatingWidget?: boolean; - settingsOnly?: boolean; - submenus?: { - name: string; - path: string; - icon: React.ElementType - }[] - }[]; - relationWidgets?: { name: string; icon?: React.ElementType; diff --git a/frontend/plugins/frontline_ui/module-federation.config.ts b/frontend/plugins/frontline_ui/module-federation.config.ts index 0b16565fe6..82b4a6c6af 100644 --- a/frontend/plugins/frontline_ui/module-federation.config.ts +++ b/frontend/plugins/frontline_ui/module-federation.config.ts @@ -16,9 +16,8 @@ const config: ModuleFederationConfig = { name: 'frontline_ui', exposes: { './config': './src/config.tsx', - './frontline': './src/modules/Main.tsx', - './inboxSettings': './src/modules/inbox/Settings.tsx', - './ticketSettings': './src/modules/ticket/Settings.tsx', + './frontline': './src/modules/FrontlineMain.tsx', + './frontlineSettings': './src/modules/FrontlineSettings.tsx', './automationsWidget': './src/widgets/automations/components/AutomationRemoteEntry.tsx', './notificationWidget': diff --git a/frontend/plugins/frontline_ui/src/config.tsx b/frontend/plugins/frontline_ui/src/config.tsx index 7cb1205b9f..9b30566368 100644 --- a/frontend/plugins/frontline_ui/src/config.tsx +++ b/frontend/plugins/frontline_ui/src/config.tsx @@ -1,4 +1,4 @@ -import { IconMail, IconStackFront, IconTicket } from '@tabler/icons-react'; +import { IconStackFront } from '@tabler/icons-react'; import { IUIConfig } from 'erxes-ui'; import { lazy, Suspense } from 'react'; @@ -14,8 +14,21 @@ const FrontlineSubGroups = lazy(() => })), ); +const FrontlineSettingsNavigation = lazy(() => + import('./modules/FrontlineSettingsNavigation').then((module) => ({ + default: module.FrontlineSettingsNavigation, + })), +); + export const CONFIG: IUIConfig = { name: 'frontline', + path: 'frontline', + hasFloatingWidget: true, + settingsNavigation: () => ( + }> + + + ), navigationGroup: { name: 'frontline', icon: IconStackFront, @@ -24,35 +37,10 @@ export const CONFIG: IUIConfig = { ), - subGroups: () => ( + subGroup: () => ( }> ), }, - modules: [ - { - name: 'inbox', - icon: IconMail, - path: 'inbox', - hasSettings: true, - hasRelationWidget: true, - hasFloatingWidget: true, - settingsOnly: true, - }, - { - name: 'ticket', - icon: IconTicket, - path: 'ticket', - hasSettings: true, - hasRelationWidget: true, - settingsOnly: true, - }, - { - name: 'frontline', - icon: IconMail, - path: 'frontline', - hasSettings: false, - }, - ], }; diff --git a/frontend/plugins/frontline_ui/src/modules/FrontlineActions.tsx b/frontend/plugins/frontline_ui/src/modules/FrontlineActions.tsx deleted file mode 100644 index ace866f26e..0000000000 --- a/frontend/plugins/frontline_ui/src/modules/FrontlineActions.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { InboxActions } from '@/inbox/components/InboxActions'; -import { useLocation } from 'react-router-dom'; - -export const FrontlineActions = () => { - const location = useLocation(); - - if (!location.pathname.startsWith('/frontline/inbox')) { - return null; - } - - return ; -}; diff --git a/frontend/plugins/frontline_ui/src/modules/Main.tsx b/frontend/plugins/frontline_ui/src/modules/FrontlineMain.tsx similarity index 100% rename from frontend/plugins/frontline_ui/src/modules/Main.tsx rename to frontend/plugins/frontline_ui/src/modules/FrontlineMain.tsx diff --git a/frontend/plugins/frontline_ui/src/modules/FrontlineSettings.tsx b/frontend/plugins/frontline_ui/src/modules/FrontlineSettings.tsx new file mode 100644 index 0000000000..9ed9531169 --- /dev/null +++ b/frontend/plugins/frontline_ui/src/modules/FrontlineSettings.tsx @@ -0,0 +1,21 @@ +import { FrontlinePaths } from '@/types/FrontlinePaths'; +import { lazy, Suspense } from 'react'; +import { Route, Routes } from 'react-router-dom'; + +const InboxSettings = lazy(() => + import('@/inbox/InboxSettings').then((module) => ({ + default: module.InboxSettings, + })), +); + +const FrontlineSettings = () => { + return ( + }> + + } /> + + + ); +}; + +export default FrontlineSettings; diff --git a/frontend/plugins/frontline_ui/src/modules/FrontlineSettingsNavigation.tsx b/frontend/plugins/frontline_ui/src/modules/FrontlineSettingsNavigation.tsx new file mode 100644 index 0000000000..457adb5cef --- /dev/null +++ b/frontend/plugins/frontline_ui/src/modules/FrontlineSettingsNavigation.tsx @@ -0,0 +1,29 @@ +import { FrontlinePaths } from '@/types/FrontlinePaths'; +import { SettingsNavigationMenuLinkItem, Sidebar } from 'erxes-ui'; + +export const FrontlineSettingsNavigation = () => { + return ( + + Frontline + + + + + + + + + ); +}; diff --git a/frontend/plugins/frontline_ui/src/modules/FrontlineSubGroups.tsx b/frontend/plugins/frontline_ui/src/modules/FrontlineSubGroups.tsx index c45bdc1f92..e3581741af 100644 --- a/frontend/plugins/frontline_ui/src/modules/FrontlineSubGroups.tsx +++ b/frontend/plugins/frontline_ui/src/modules/FrontlineSubGroups.tsx @@ -1,5 +1,5 @@ -import { FrontlineActions } from '@/FrontlineActions'; import { ChooseIntegrationTypeContent } from '@/integrations/components/ChooseIntegrationType'; +import { InboxActions } from '@/inbox/components/InboxActions'; import { NavigationMenuGroup } from 'erxes-ui'; import { useLocation } from 'react-router-dom'; @@ -12,7 +12,7 @@ export const FrontlineSubGroups = () => { return ( <> - + {location.pathname.startsWith('/frontline/inbox') && } diff --git a/frontend/plugins/frontline_ui/src/modules/inbox/InboxSettings.tsx b/frontend/plugins/frontline_ui/src/modules/inbox/InboxSettings.tsx new file mode 100644 index 0000000000..d042281e1e --- /dev/null +++ b/frontend/plugins/frontline_ui/src/modules/inbox/InboxSettings.tsx @@ -0,0 +1,77 @@ +import { lazy, Suspense } from 'react'; +import { Navigate, Outlet, Route, Routes } from 'react-router-dom'; +import { FrontlinePaths } from '@/types/FrontlinePaths'; +import { InboxPageChangeEffect } from '@/inbox/components/InboxPageChangeEffect'; +import { InboxSettingsLayout } from '@/inbox/components/InboxSettingsLayout'; + +export const IntegrationSettingsPage = lazy(() => + import('~/pages/IntegrationSettingsPage').then((module) => ({ + default: module.IntegrationSettingsPage, + })), +); + +export const ChannelsSettingsPage = lazy(() => + import('~/pages/ChannelsSettingsPage').then((module) => ({ + default: module.default, + })), +); + +export const IntegrationDetailPage = lazy(() => + import('~/pages/IntegrationDetailPage').then((module) => ({ + default: module.IntegrationDetailPage, + })), +); + +export const IntegrationConfigPage = lazy(() => + import('~/pages/IntegrationConfigPage').then((module) => ({ + default: module.IntegrationConfigPage, + })), +); + +export const ErxesMessengerPreview = lazy(() => + import('~/pages/ErxesMessengerPreview').then((module) => ({ + default: module.ErxesMessengerPreview, + })), +); + +export const InboxSettings = () => { + return ( + }> + + + + + } + > + } + /> + } + /> + } + /> + } + /> + } + /> + + } + /> + + + + ); +}; diff --git a/frontend/plugins/frontline_ui/src/modules/inbox/Main.tsx b/frontend/plugins/frontline_ui/src/modules/inbox/Main.tsx deleted file mode 100644 index 1f282c0cca..0000000000 --- a/frontend/plugins/frontline_ui/src/modules/inbox/Main.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { lazy, Suspense } from 'react'; -import { Route, Routes } from 'react-router'; -import { InboxPageChangeEffect } from './components/InboxPageChangeEffect'; - -const Inbox = lazy(() => - import('~/pages/InboxIndexPage').then((module) => ({ - default: module.default, - })), -); - -const InboxMain = () => { - return ( - }> - - } /> - - - - ); -}; - -export default InboxMain; diff --git a/frontend/plugins/frontline_ui/src/modules/inbox/Settings.tsx b/frontend/plugins/frontline_ui/src/modules/inbox/Settings.tsx deleted file mode 100644 index 747f20e8bd..0000000000 --- a/frontend/plugins/frontline_ui/src/modules/inbox/Settings.tsx +++ /dev/null @@ -1,114 +0,0 @@ -import { lazy, Suspense, useState } from 'react'; -import { IIntegrationItem } from '../settings/types/integration'; -import { - INTEGRATIONS, - OTHER_INTEGRATIONS, -} from '../settings/constants/integrations'; -import { IntegrationContext } from '../settings/context/IntegrationContext'; -import { Button, PageContainer } from 'erxes-ui'; - -import { InboxSettingsTopbar } from '../settings/components/InboxSettingsTopbar'; -import { InboxSettingsSidebar } from '../settings/components/Sidebar'; -import { Navigate, Outlet, Route, Routes } from 'react-router-dom'; -import { PageHeader, PageHeaderEnd, PageHeaderStart } from 'ui-modules'; -import { IconMailFilled } from '@tabler/icons-react'; -import { FrontlinePaths } from '@/types/FrontlinePaths'; -import { InboxPageChangeEffect } from '@/inbox/components/InboxPageChangeEffect'; - -export const IntegrationSettingsPage = lazy(() => - import('~/pages/IntegrationSettingsPage').then((module) => ({ - default: module.IntegrationSettingsPage, - })), -); - -export const ChannelsSettingsPage = lazy(() => - import('~/pages/ChannelsSettingsPage').then((module) => ({ - default: module.default, - })), -); - -export const IntegrationDetailPage = lazy(() => - import('~/pages/IntegrationDetailPage').then((module) => ({ - default: module.IntegrationDetailPage, - })), -); - -export const IntegrationConfigPage = lazy(() => - import('~/pages/IntegrationConfigPage').then((module) => ({ - default: module.IntegrationConfigPage, - })), -); - -export const ErxesMessengerPreview = lazy(() => - import('~/pages/ErxesMessengerPreview').then((module) => ({ - default: module.ErxesMessengerPreview, - })), -); - -const InboxSettings = () => { - const [integrations, setIntegrations] = - useState>(INTEGRATIONS); - const [otherIntegrations, setOtherIntegrations] = - useState>(OTHER_INTEGRATIONS); - return ( - - }> - - - - - - - - - - - - - - - - } - > - } /> - } - /> - } - /> - } - /> - } - /> - - } - /> - - - - - ); -}; - -export default InboxSettings; diff --git a/frontend/plugins/frontline_ui/src/modules/inbox/components/InboxSettingsLayout.tsx b/frontend/plugins/frontline_ui/src/modules/inbox/components/InboxSettingsLayout.tsx new file mode 100644 index 0000000000..84c93ea270 --- /dev/null +++ b/frontend/plugins/frontline_ui/src/modules/inbox/components/InboxSettingsLayout.tsx @@ -0,0 +1,27 @@ +import { InboxSettingsTopbar } from '@/settings/components/InboxSettingsTopbar'; +import { IconMailFilled } from '@tabler/icons-react'; +import { Button } from 'erxes-ui'; +import { PageHeader, PageHeaderEnd, PageHeaderStart } from 'ui-modules'; + +export const InboxSettingsLayout = ({ + children, +}: { + children: React.ReactNode; +}) => { + return ( +
+ + + + + + + + + {children} +
+ ); +}; diff --git a/frontend/plugins/frontline_ui/src/modules/settings/components/Sidebar.tsx b/frontend/plugins/frontline_ui/src/modules/settings/components/Sidebar.tsx deleted file mode 100644 index ad7416694f..0000000000 --- a/frontend/plugins/frontline_ui/src/modules/settings/components/Sidebar.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import React from 'react'; -import { Link, useLocation } from 'react-router'; -import { Sidebar } from 'erxes-ui'; -import { SETTINGS_ROUTES } from '../constants/settingsRoutes'; -import { FrontlinePaths } from '@/types/FrontlinePaths'; - -export const InboxSettingsSidebar = () => { - const location = useLocation(); - - if ( - location.pathname !== FrontlinePaths.Inbox + FrontlinePaths.Integrations && - !location.pathname.includes( - FrontlinePaths.Inbox + FrontlinePaths.Integrations, - ) - ) { - return null; - } - - return ( - - - - - {Object.entries(SETTINGS_ROUTES).map(([path, label]) => ( - - ))} - - - - - ); -}; - -export const InboxSettingsSidebarItem = ({ - to, - children, -}: { - to: string; - children: React.ReactNode; -}) => { - const isActive = useLocation().pathname === to; - return ( - - - {children} - - - ); -}; diff --git a/frontend/plugins/frontline_ui/src/modules/settings/constants/settingsRoutes.ts b/frontend/plugins/frontline_ui/src/modules/settings/constants/settingsRoutes.ts deleted file mode 100644 index 19ec22dfb2..0000000000 --- a/frontend/plugins/frontline_ui/src/modules/settings/constants/settingsRoutes.ts +++ /dev/null @@ -1,5 +0,0 @@ -export const SETTINGS_ROUTES = { - '/settings/inbox/integrations': 'Integrations', - '/settings/inbox/integrations-config': 'Integrations config', - '/settings/inbox/channels': 'Channels', -}; diff --git a/frontend/plugins/frontline_ui/src/modules/types/FrontlinePaths.ts b/frontend/plugins/frontline_ui/src/modules/types/FrontlinePaths.ts index 4d71f17790..6847a0361e 100644 --- a/frontend/plugins/frontline_ui/src/modules/types/FrontlinePaths.ts +++ b/frontend/plugins/frontline_ui/src/modules/types/FrontlinePaths.ts @@ -1,8 +1,10 @@ export enum FrontlinePaths { - Inbox = '/inbox', - Integrations = '/integrations', - IntegrationDetail = '/integrations/:integrationType', - IntegrationConfig = '/integrations-config', - ErxesMessengerPreview = '/integrations/erxes-messenger-preview', - Channels = '/channels', + Frontline = 'frontline', + InboxAll = 'inbox/*', + Inbox = 'inbox', + Integrations = 'integrations', + IntegrationDetail = 'integrations/:integrationType', + IntegrationConfig = 'integration-configs', + ErxesMessengerPreview = 'integrations/erxes-messenger-preview', + Channels = 'channels', } diff --git a/frontend/plugins/frontline_ui/src/pages/IntegrationSettingsPage.tsx b/frontend/plugins/frontline_ui/src/pages/IntegrationSettingsPage.tsx index 0ec8c1d36e..0da5291ec1 100644 --- a/frontend/plugins/frontline_ui/src/pages/IntegrationSettingsPage.tsx +++ b/frontend/plugins/frontline_ui/src/pages/IntegrationSettingsPage.tsx @@ -2,6 +2,7 @@ import { IntegrationList } from '@/integrations/components/IntegrationList'; import { ScrollArea } from 'erxes-ui'; export const IntegrationSettingsPage = () => { + console.log('IntegrationSettingsPage'); return (
diff --git a/frontend/plugins/operation_ui/module-federation.config.ts b/frontend/plugins/operation_ui/module-federation.config.ts index 40850d2a0e..3775a00137 100644 --- a/frontend/plugins/operation_ui/module-federation.config.ts +++ b/frontend/plugins/operation_ui/module-federation.config.ts @@ -17,7 +17,7 @@ const config: ModuleFederationConfig = { exposes: { './config': './src/config.tsx', './operation': './src/modules/main/Main.tsx', - './teamSettings': './src/modules/team/Settings.tsx', + './operationSettings': './src/modules/OperationSettings.tsx', './relationWidget': './src/widgets/relation/RelationWidgets.tsx', './notificationWidget': './src/widgets/notifications/NotificationsWidgets.tsx', diff --git a/frontend/plugins/operation_ui/src/config.tsx b/frontend/plugins/operation_ui/src/config.tsx index 970e57b9d9..d85539b466 100644 --- a/frontend/plugins/operation_ui/src/config.tsx +++ b/frontend/plugins/operation_ui/src/config.tsx @@ -19,9 +19,20 @@ const TeamsNavigation = lazy(() => })), ); +const OperationSettingsNavigation = lazy(() => + import('./modules/OperationSettingsNavigation').then((module) => ({ + default: module.OperationSettingsNavigation, + })), +); + export const CONFIG: IUIConfig = { name: 'operation', - icon: IconListCheck, + path: 'operation', + settingsNavigation: () => ( + }> + + + ), navigationGroup: { name: 'operation', icon: IconListCheck, @@ -30,28 +41,12 @@ export const CONFIG: IUIConfig = { ), - subGroups: () => ( + subGroup: () => ( }> ), }, - modules: [ - { - name: 'operation', - icon: IconListCheck, - path: 'operation', - hasSettings: false, - hasRelationWidget: true, - hasFloatingWidget: false, - }, - { - name: 'team', - path: 'operation/team', - settingsOnly: true, - }, - ], - relationWidgets: [ { name: 'tasks', diff --git a/frontend/plugins/operation_ui/src/modules/OperationSettings.tsx b/frontend/plugins/operation_ui/src/modules/OperationSettings.tsx new file mode 100644 index 0000000000..9bb5fbb129 --- /dev/null +++ b/frontend/plugins/operation_ui/src/modules/OperationSettings.tsx @@ -0,0 +1,21 @@ +import { lazy, Suspense } from 'react'; +import { Route, Routes } from 'react-router-dom'; +import { OperationPaths } from '~/types/operationPaths'; + +export const TeamSettings = lazy(() => + import('@/team/TeamSettings').then((module) => ({ + default: module.TeamSettings, + })), +); + +const OperationSettings = () => { + return ( + }> + + } /> + + + ); +}; + +export default OperationSettings; diff --git a/frontend/plugins/operation_ui/src/modules/OperationSettingsNavigation.tsx b/frontend/plugins/operation_ui/src/modules/OperationSettingsNavigation.tsx new file mode 100644 index 0000000000..b693f0a13c --- /dev/null +++ b/frontend/plugins/operation_ui/src/modules/OperationSettingsNavigation.tsx @@ -0,0 +1,19 @@ +import { SettingsNavigationMenuLinkItem, Sidebar } from 'erxes-ui'; +import { OperationPaths } from '~/types/operationPaths'; + +export const OperationSettingsNavigation = () => { + return ( + + Operation + + + + + + + ); +}; diff --git a/frontend/plugins/operation_ui/src/modules/team/Settings.tsx b/frontend/plugins/operation_ui/src/modules/team/TeamSettings.tsx similarity index 93% rename from frontend/plugins/operation_ui/src/modules/team/Settings.tsx rename to frontend/plugins/operation_ui/src/modules/team/TeamSettings.tsx index c004cac5ef..ec0983a7f9 100644 --- a/frontend/plugins/operation_ui/src/modules/team/Settings.tsx +++ b/frontend/plugins/operation_ui/src/modules/team/TeamSettings.tsx @@ -7,11 +7,11 @@ import { Outlet } from 'react-router-dom'; import { TeamsSettingsPage } from '~/pages/TeamSettingsIndexPage'; import { TeamDetailPage } from '~/pages/TeamDetailPage'; -import { OperationPaths } from '~/types/paths'; +import { OperationPaths } from '~/types/operationPaths'; import { TeamMembersPage } from '~/pages/TeamMembersPage'; import { TeamStatusPage } from '~/pages/TeamStatusPage'; -const TeamSettings = () => { +export const TeamSettings = () => { return ( }> @@ -48,5 +48,3 @@ const TeamSettings = () => { ); }; - -export default TeamSettings; diff --git a/frontend/plugins/operation_ui/src/types/paths.ts b/frontend/plugins/operation_ui/src/types/operationPaths.ts similarity index 60% rename from frontend/plugins/operation_ui/src/types/paths.ts rename to frontend/plugins/operation_ui/src/types/operationPaths.ts index 93264ef973..11eaa9a332 100644 --- a/frontend/plugins/operation_ui/src/types/paths.ts +++ b/frontend/plugins/operation_ui/src/types/operationPaths.ts @@ -1,5 +1,7 @@ export enum OperationPaths { - TeamList = '/settings/operation/team', + Operation = 'operation', + OperationAll = 'operation/*', + TeamList = 'team', TeamDetail = '/details/:id', TeamMembers = 'members/:id', TeamStatus = 'status/:id', diff --git a/scripts/create-plugin.js b/scripts/create-plugin.js index 42eef95107..c9300b563e 100644 --- a/scripts/create-plugin.js +++ b/scripts/create-plugin.js @@ -157,6 +157,15 @@ import { IUIConfig } from 'erxes-ui/types'; export const CONFIG: IUIConfig = { name: '${kebabCaseName}', icon: IconSandbox, + navigationGroup: { + name: '${kebabCaseName}', + icon: IconSandbox, + content: () => ( + }> + <${kebabCaseModuleName}Navigation /> + + ), + }, modules: [ { name: '${moduleName}',