diff --git a/rsconcept/frontend/src/app/navigation/menu-ai.tsx b/rsconcept/frontend/src/app/navigation/menu-ai.tsx new file mode 100644 index 00000000..9d8b8afb --- /dev/null +++ b/rsconcept/frontend/src/app/navigation/menu-ai.tsx @@ -0,0 +1,58 @@ +import { useAuth } from '@/features/auth/backend/use-auth'; + +import { Dropdown, DropdownButton, useDropdown } from '@/components/dropdown'; +import { IconAssistant, IconChat, IconTemplates } from '@/components/icons'; +import { globalIDs } from '@/utils/constants'; +import { notImplemented } from '@/utils/utils'; + +import { urls } from '../urls'; + +import { NavigationButton } from './navigation-button'; +import { useConceptNavigation } from './navigation-context'; + +export function MenuAI() { + const router = useConceptNavigation(); + const menu = useDropdown(); + const { user } = useAuth(); + + function navigateTemplates(event: React.MouseEvent) { + menu.hide(); + router.push({ path: urls.prompt_templates, newTab: event.ctrlKey || event.metaKey }); + } + + function handleCreatePrompt(event: React.MouseEvent) { + event.preventDefault(); + event.stopPropagation(); + menu.hide(); + notImplemented(); + } + + return ( +
+ } + onClick={menu.toggle} + /> + + + } + onClick={handleCreatePrompt} + /> + } + onClick={navigateTemplates} + disabled={!user?.is_staff} + /> + +
+ ); +} diff --git a/rsconcept/frontend/src/app/navigation/user-menu.tsx b/rsconcept/frontend/src/app/navigation/menu-user.tsx similarity index 91% rename from rsconcept/frontend/src/app/navigation/user-menu.tsx rename to rsconcept/frontend/src/app/navigation/menu-user.tsx index 49db1775..d5c07aeb 100644 --- a/rsconcept/frontend/src/app/navigation/user-menu.tsx +++ b/rsconcept/frontend/src/app/navigation/menu-user.tsx @@ -9,11 +9,11 @@ import { useConceptNavigation } from './navigation-context'; import { UserButton } from './user-button'; import { UserDropdown } from './user-dropdown'; -export function UserMenu() { +export function MenuUser() { const router = useConceptNavigation(); const menu = useDropdown(); return ( -
+
}> router.push({ path: urls.login, force: true })} diff --git a/rsconcept/frontend/src/app/navigation/navigation-button.tsx b/rsconcept/frontend/src/app/navigation/navigation-button.tsx index 572084ae..03eb6cad 100644 --- a/rsconcept/frontend/src/app/navigation/navigation-button.tsx +++ b/rsconcept/frontend/src/app/navigation/navigation-button.tsx @@ -24,7 +24,7 @@ export function NavigationButton({ icon, title, hideTitle, className, style, onC style={style} > {icon ? icon : null} - {text ? {text} : null} + {text ? {text} : null} ); } diff --git a/rsconcept/frontend/src/app/navigation/navigation.tsx b/rsconcept/frontend/src/app/navigation/navigation.tsx index 7acb6a1d..f49f186c 100644 --- a/rsconcept/frontend/src/app/navigation/navigation.tsx +++ b/rsconcept/frontend/src/app/navigation/navigation.tsx @@ -8,10 +8,11 @@ import { useDialogsStore } from '@/stores/dialogs'; import { urls } from '../urls'; import { Logo } from './logo'; +import { MenuAI } from './menu-ai'; +import { MenuUser } from './menu-user'; import { NavigationButton } from './navigation-button'; import { useConceptNavigation } from './navigation-context'; import { ToggleNavigation } from './toggle-navigation'; -import { UserMenu } from './user-menu'; export function Navigation() { const { push } = useConceptNavigation(); @@ -41,11 +42,13 @@ export function Navigation() {
-
+
} onClick={navigateCreateNew} /> } onClick={navigateLibrary} /> } onClick={navigateHelp} /> - + + +
diff --git a/rsconcept/frontend/src/app/urls.ts b/rsconcept/frontend/src/app/urls.ts index d5ce6e11..52452fc7 100644 --- a/rsconcept/frontend/src/app/urls.ts +++ b/rsconcept/frontend/src/app/urls.ts @@ -19,7 +19,8 @@ export const routes = { rsforms: 'rsforms', oss: 'oss', icons: 'icons', - database_schema: 'database-schema' + database_schema: 'database-schema', + prompt_templates: 'prompt-templates' } as const; /** Internal navigation URLs. */ @@ -37,6 +38,7 @@ export const urls = { library: `/${routes.library}`, library_filter: (strategy: string) => `/library?filter=${strategy}`, create_schema: `/${routes.create_schema}`, + prompt_templates: `/${routes.prompt_templates}`, manuals: `/${routes.manuals}`, help_topic: (topic: string) => `/manuals?topic=${topic}`, schema: (id: number | string, version?: number | string) => diff --git a/rsconcept/frontend/src/components/icons.tsx b/rsconcept/frontend/src/components/icons.tsx index 4e8bd635..b19cbcbf 100644 --- a/rsconcept/frontend/src/components/icons.tsx +++ b/rsconcept/frontend/src/components/icons.tsx @@ -63,6 +63,8 @@ export { PiFileCsv as IconCSV } from 'react-icons/pi'; // ==== User status ======= export { LuCircleUserRound as IconUser } from 'react-icons/lu'; +export { FaUserAstronaut as IconAssistant } from 'react-icons/fa6'; +export { IoChatbubblesOutline as IconChat } from 'react-icons/io5'; export { FaCircleUser as IconUser2 } from 'react-icons/fa6'; export { TbUserEdit as IconEditor } from 'react-icons/tb'; export { TbUserSearch as IconUserSearch } from 'react-icons/tb'; diff --git a/rsconcept/frontend/src/utils/constants.ts b/rsconcept/frontend/src/utils/constants.ts index 16b543d0..ca0933f2 100644 --- a/rsconcept/frontend/src/utils/constants.ts +++ b/rsconcept/frontend/src/utils/constants.ts @@ -79,7 +79,8 @@ export const globalIDs = { library_item_editor: 'library_item_editor', constituenta_editor: 'constituenta_editor', graph_schemas: 'graph_schemas_tooltip', - user_dropdown: 'user_dropdown' + user_dropdown: 'user_dropdown', + ai_dropdown: 'ai_dropdown' } as const; /** Prefixes for generating unique keys for lists. */