+
} 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/features/ai/backend/types.ts b/rsconcept/frontend/src/features/ai/backend/types.ts
new file mode 100644
index 00000000..1bfda4b9
--- /dev/null
+++ b/rsconcept/frontend/src/features/ai/backend/types.ts
@@ -0,0 +1,8 @@
+/** Represents AI prompt. */
+export interface IPromptTemplate {
+ id: number;
+ owner: number | null;
+ label: string;
+ description: string;
+ text: string;
+}
diff --git a/rsconcept/frontend/src/features/ai/dialogs/dlg-ai-prompt.tsx b/rsconcept/frontend/src/features/ai/dialogs/dlg-ai-prompt.tsx
new file mode 100644
index 00000000..a46ea50d
--- /dev/null
+++ b/rsconcept/frontend/src/features/ai/dialogs/dlg-ai-prompt.tsx
@@ -0,0 +1,74 @@
+import { useState } from 'react';
+
+import { ModalForm } from '@/components/modal';
+
+import { type IPromptTemplate } from '../backend/types';
+
+export interface DlgAIPromptDialogProps {
+ onPromptSelected?: (prompt: IPromptTemplate) => void;
+}
+
+const mockPrompts: IPromptTemplate[] = [
+ {
+ id: 1,
+ owner: null,
+ label: 'Greeting',
+ description: 'A simple greeting prompt.',
+ text: 'Hello, ${name}! How can I assist you today?'
+ },
+ {
+ id: 2,
+ owner: null,
+ label: 'Summary',
+ description: 'Summarize the following text.',
+ text: 'Please summarize the following: ${text}'
+ }
+];
+
+export function DlgAIPromptDialog() {
+ const [selectedPrompt, setSelectedPrompt] = useState