@igstack/app-catalog-frontend-core 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/api/infra/trpc.d.ts +0 -1491
- package/dist/esm/modules/appCatalog/context/AppCatalogContext.js +1 -0
- package/dist/esm/modules/appCatalog/context/AppCatalogContext.js.map +1 -1
- package/dist/esm/modules/appCatalog/ui/filters/FilterBar.js +23 -11
- package/dist/esm/modules/appCatalog/ui/filters/FilterBar.js.map +1 -1
- package/dist/esm/modules/appCatalog/ui/grid/AppCatalogGrid.d.ts +5 -1
- package/dist/esm/modules/appCatalog/ui/grid/AppCatalogGrid.js +146 -56
- package/dist/esm/modules/appCatalog/ui/grid/AppCatalogGrid.js.map +1 -1
- package/dist/esm/modules/appCatalog/ui/pages/AppCatalogPage.js +20 -1
- package/dist/esm/modules/appCatalog/ui/pages/AppCatalogPage.js.map +1 -1
- package/dist/esm/modules/auth/AuthContext.js +1 -1
- package/dist/esm/modules/auth/AuthModalContext.js +1 -1
- package/dist/esm/modules/auth/authClient.d.ts +2 -2
- package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/classic/schemas.js +4 -37
- package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/classic/schemas.js.map +1 -1
- package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/core/api.js +2 -10
- package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/core/api.js.map +1 -1
- package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/core/checks.js +1 -1
- package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/core/json-schema-processors.js +0 -44
- package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/core/json-schema-processors.js.map +1 -1
- package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/core/parse.js +0 -4
- package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/core/parse.js.map +1 -1
- package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/core/regexes.js +0 -2
- package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/core/regexes.js.map +1 -1
- package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/core/schemas.js +4 -49
- package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/core/schemas.js.map +1 -1
- package/dist/esm/routeTree.gen.d.ts +3 -164
- package/dist/esm/routeTree.gen.js +8 -80
- package/dist/esm/routeTree.gen.js.map +1 -1
- package/dist/esm/ui/button.d.ts +1 -1
- package/dist/esm/ui/card.js +1 -48
- package/dist/esm/ui/card.js.map +1 -1
- package/dist/esm/ui/command.js +1 -15
- package/dist/esm/ui/command.js.map +1 -1
- package/dist/esm/ui/components/header/Header.js +2 -11
- package/dist/esm/ui/components/header/Header.js.map +1 -1
- package/dist/esm/ui/input-group.js +125 -0
- package/dist/esm/ui/input-group.js.map +1 -0
- package/package.json +3 -3
- package/src/modules/appCatalog/ui/components/AppDetailModal.tsx +2 -21
- package/src/routeTree.gen.ts +2 -220
- package/src/ui/components/header/Header.tsx +2 -12
- package/dist/esm/components/IconPickerDialog.d.ts +0 -8
- package/dist/esm/components/IconPickerDialog.js +0 -98
- package/dist/esm/components/IconPickerDialog.js.map +0 -1
- package/dist/esm/components/IconPickerField.d.ts +0 -9
- package/dist/esm/components/IconPickerField.js +0 -76
- package/dist/esm/components/IconPickerField.js.map +0 -1
- package/dist/esm/modules/admin-base/components/AdminChat.d.ts +0 -1
- package/dist/esm/modules/admin-base/components/AdminChat.js +0 -82
- package/dist/esm/modules/admin-base/components/AdminChat.js.map +0 -1
- package/dist/esm/modules/admin-base/components/AdminLayout.d.ts +0 -5
- package/dist/esm/modules/admin-base/components/AdminLayout.js +0 -83
- package/dist/esm/modules/admin-base/components/AdminLayout.js.map +0 -1
- package/dist/esm/modules/admin-base/components/AdminWelcome.d.ts +0 -1
- package/dist/esm/modules/admin-base/components/AdminWelcome.js +0 -37
- package/dist/esm/modules/admin-base/components/AdminWelcome.js.map +0 -1
- package/dist/esm/modules/admin-base/context/AdminConfigContext.d.ts +0 -8
- package/dist/esm/modules/admin-base/context/AdminConfigContext.js +0 -27
- package/dist/esm/modules/admin-base/context/AdminConfigContext.js.map +0 -1
- package/dist/esm/modules/admin-base/index.d.ts +0 -5
- package/dist/esm/modules/admin-base/types/adminTypes.d.ts +0 -10
- package/dist/esm/modules/appCatalog/AppCatalogAdminPage.d.ts +0 -1
- package/dist/esm/modules/appCatalog/AppCatalogAdminPage.js +0 -196
- package/dist/esm/modules/appCatalog/AppCatalogAdminPage.js.map +0 -1
- package/dist/esm/modules/appCatalog/ScreenshotItem.js +0 -57
- package/dist/esm/modules/appCatalog/ScreenshotItem.js.map +0 -1
- package/dist/esm/modules/appCatalog/ScreenshotManager.js +0 -155
- package/dist/esm/modules/appCatalog/ScreenshotManager.js.map +0 -1
- package/dist/esm/modules/approvalMethod/AccessRequestFormFields.d.ts +0 -7
- package/dist/esm/modules/approvalMethod/AccessRequestFormFields.js +0 -323
- package/dist/esm/modules/approvalMethod/AccessRequestFormFields.js.map +0 -1
- package/dist/esm/modules/approvalMethod/ApprovalMethodForm.d.ts +0 -14
- package/dist/esm/modules/approvalMethod/ApprovalMethodForm.js +0 -227
- package/dist/esm/modules/approvalMethod/ApprovalMethodForm.js.map +0 -1
- package/dist/esm/modules/approvalMethod/ApprovalMethodSelector.d.ts +0 -7
- package/dist/esm/modules/approvalMethod/ApprovalMethodSelector.js +0 -124
- package/dist/esm/modules/approvalMethod/ApprovalMethodSelector.js.map +0 -1
- package/dist/esm/modules/approvalMethod/api/ApiQueryMagazineApprovalMethod.d.ts +0 -381
- package/dist/esm/modules/approvalMethod/api/ApiQueryMagazineApprovalMethod.js +0 -26
- package/dist/esm/modules/approvalMethod/api/ApiQueryMagazineApprovalMethod.js.map +0 -1
- package/dist/esm/modules/auth/authUtils.js +0 -25
- package/dist/esm/modules/auth/authUtils.js.map +0 -1
- package/dist/esm/modules/icons/IconManagementPage.d.ts +0 -1
- package/dist/esm/modules/icons/IconManagementPage.js +0 -177
- package/dist/esm/modules/icons/IconManagementPage.js.map +0 -1
- package/dist/esm/node_modules/.pnpm/@dnd-kit_accessibility@3.1.1_react@19.1.2/node_modules/@dnd-kit/accessibility/dist/accessibility.esm.js +0 -60
- package/dist/esm/node_modules/.pnpm/@dnd-kit_accessibility@3.1.1_react@19.1.2/node_modules/@dnd-kit/accessibility/dist/accessibility.esm.js.map +0 -1
- package/dist/esm/node_modules/.pnpm/@dnd-kit_core@6.3.1_react-dom@19.1.2_react@19.1.2__react@19.1.2/node_modules/@dnd-kit/core/dist/core.esm.js +0 -3055
- package/dist/esm/node_modules/.pnpm/@dnd-kit_core@6.3.1_react-dom@19.1.2_react@19.1.2__react@19.1.2/node_modules/@dnd-kit/core/dist/core.esm.js.map +0 -1
- package/dist/esm/node_modules/.pnpm/@dnd-kit_sortable@10.0.0_@dnd-kit_core@6.3.1_react-dom@19.1.2_react@19.1.2__react@19.1.2__react@19.1.2/node_modules/@dnd-kit/sortable/dist/sortable.esm.js +0 -593
- package/dist/esm/node_modules/.pnpm/@dnd-kit_sortable@10.0.0_@dnd-kit_core@6.3.1_react-dom@19.1.2_react@19.1.2__react@19.1.2__react@19.1.2/node_modules/@dnd-kit/sortable/dist/sortable.esm.js.map +0 -1
- package/dist/esm/node_modules/.pnpm/@dnd-kit_utilities@3.2.2_react@19.1.2/node_modules/@dnd-kit/utilities/dist/utilities.esm.js +0 -302
- package/dist/esm/node_modules/.pnpm/@dnd-kit_utilities@3.2.2_react@19.1.2/node_modules/@dnd-kit/utilities/dist/utilities.esm.js.map +0 -1
- package/dist/esm/node_modules/.pnpm/@hookform_resolvers@5.2.2_react-hook-form@7.71.1_react@19.1.2_/node_modules/@hookform/resolvers/dist/resolvers.js +0 -34
- package/dist/esm/node_modules/.pnpm/@hookform_resolvers@5.2.2_react-hook-form@7.71.1_react@19.1.2_/node_modules/@hookform/resolvers/dist/resolvers.js.map +0 -1
- package/dist/esm/node_modules/.pnpm/@hookform_resolvers@5.2.2_react-hook-form@7.71.1_react@19.1.2_/node_modules/@hookform/resolvers/zod/dist/zod.js +0 -94
- package/dist/esm/node_modules/.pnpm/@hookform_resolvers@5.2.2_react-hook-form@7.71.1_react@19.1.2_/node_modules/@hookform/resolvers/zod/dist/zod.js.map +0 -1
- package/dist/esm/node_modules/.pnpm/react-hook-form@7.71.1_react@19.1.2/node_modules/react-hook-form/dist/index.esm.js +0 -1894
- package/dist/esm/node_modules/.pnpm/react-hook-form@7.71.1_react@19.1.2/node_modules/react-hook-form/dist/index.esm.js.map +0 -1
- package/dist/esm/routes/admin/app-for-catalog/$id.d.ts +0 -5
- package/dist/esm/routes/admin/app-for-catalog/_id.js +0 -67
- package/dist/esm/routes/admin/app-for-catalog/_id.js.map +0 -1
- package/dist/esm/routes/admin/app-for-catalog/_id2.js +0 -321
- package/dist/esm/routes/admin/app-for-catalog/_id2.js.map +0 -1
- package/dist/esm/routes/admin/app-for-catalog/index.d.ts +0 -1
- package/dist/esm/routes/admin/app-for-catalog/index.js +0 -9
- package/dist/esm/routes/admin/app-for-catalog/index.js.map +0 -1
- package/dist/esm/routes/admin/app-for-catalog/index2.js +0 -12
- package/dist/esm/routes/admin/app-for-catalog/index2.js.map +0 -1
- package/dist/esm/routes/admin/app-for-catalog.d.ts +0 -1
- package/dist/esm/routes/admin/app-for-catalog.js +0 -14
- package/dist/esm/routes/admin/app-for-catalog.js.map +0 -1
- package/dist/esm/routes/admin/app-for-catalog2.js +0 -9
- package/dist/esm/routes/admin/app-for-catalog2.js.map +0 -1
- package/dist/esm/routes/admin/approval-methods/index.d.ts +0 -32
- package/dist/esm/routes/admin/approval-methods/index.js +0 -24
- package/dist/esm/routes/admin/approval-methods/index.js.map +0 -1
- package/dist/esm/routes/admin/approval-methods/index2.js +0 -100
- package/dist/esm/routes/admin/approval-methods/index2.js.map +0 -1
- package/dist/esm/routes/admin/approval-methods.d.ts +0 -1
- package/dist/esm/routes/admin/approval-methods.js +0 -14
- package/dist/esm/routes/admin/approval-methods.js.map +0 -1
- package/dist/esm/routes/admin/approval-methods2.js +0 -7
- package/dist/esm/routes/admin/approval-methods2.js.map +0 -1
- package/dist/esm/routes/admin/chat.d.ts +0 -1
- package/dist/esm/routes/admin/chat.js +0 -14
- package/dist/esm/routes/admin/chat.js.map +0 -1
- package/dist/esm/routes/admin/chat2.js +0 -9
- package/dist/esm/routes/admin/chat2.js.map +0 -1
- package/dist/esm/routes/admin/icons.d.ts +0 -1
- package/dist/esm/routes/admin/icons.js +0 -14
- package/dist/esm/routes/admin/icons.js.map +0 -1
- package/dist/esm/routes/admin/icons2.js +0 -12
- package/dist/esm/routes/admin/icons2.js.map +0 -1
- package/dist/esm/routes/admin/index.d.ts +0 -1
- package/dist/esm/routes/admin/index.js +0 -9
- package/dist/esm/routes/admin/index.js.map +0 -1
- package/dist/esm/routes/admin/index2.js +0 -9
- package/dist/esm/routes/admin/index2.js.map +0 -1
- package/dist/esm/routes/admin.d.ts +0 -1
- package/dist/esm/routes/admin.js +0 -37
- package/dist/esm/routes/admin.js.map +0 -1
- package/dist/esm/routes/admin2.js +0 -18
- package/dist/esm/routes/admin2.js.map +0 -1
- package/dist/esm/ui/alert-dialog.js +0 -141
- package/dist/esm/ui/alert-dialog.js.map +0 -1
- package/dist/esm/ui/breadcrumb.js +0 -84
- package/dist/esm/ui/breadcrumb.js.map +0 -1
- package/dist/esm/ui/components/Breadcrumbs.js +0 -36
- package/dist/esm/ui/components/Breadcrumbs.js.map +0 -1
- package/dist/esm/ui/crud-list/CrudList.js +0 -189
- package/dist/esm/ui/crud-list/CrudList.js.map +0 -1
- package/dist/esm/ui/editable-list/EditableListField.js +0 -130
- package/dist/esm/ui/editable-list/EditableListField.js.map +0 -1
- package/dist/esm/ui/form.js +0 -134
- package/dist/esm/ui/form.js.map +0 -1
- package/dist/esm/ui/linkExternal.js +0 -26
- package/dist/esm/ui/linkExternal.js.map +0 -1
- package/dist/esm/ui/markdown-editor/MarkdownEditor.js +0 -116
- package/dist/esm/ui/markdown-editor/MarkdownEditor.js.map +0 -1
- package/dist/esm/ui/markdown-editor/MarkdownToolbar.js +0 -99
- package/dist/esm/ui/markdown-editor/MarkdownToolbar.js.map +0 -1
- package/dist/esm/ui/scroll-area.js +0 -62
- package/dist/esm/ui/scroll-area.js.map +0 -1
- package/dist/esm/ui/select.js +0 -138
- package/dist/esm/ui/select.js.map +0 -1
- package/dist/esm/ui/textarea.js +0 -19
- package/dist/esm/ui/textarea.js.map +0 -1
- package/src/components/IconPickerDialog.tsx +0 -136
- package/src/components/IconPickerField.tsx +0 -88
- package/src/modules/admin-base/components/AdminChat.tsx +0 -122
- package/src/modules/admin-base/components/AdminLayout.tsx +0 -111
- package/src/modules/admin-base/components/AdminWelcome.tsx +0 -52
- package/src/modules/admin-base/context/AdminConfigContext.tsx +0 -36
- package/src/modules/admin-base/index.ts +0 -16
- package/src/modules/admin-base/types/adminTypes.ts +0 -11
- package/src/modules/appCatalog/AppCatalogAdminPage.tsx +0 -274
- package/src/modules/approvalMethod/AccessRequestFormFields.tsx +0 -393
- package/src/modules/approvalMethod/ApprovalMethodForm.tsx +0 -323
- package/src/modules/approvalMethod/ApprovalMethodSelector.tsx +0 -150
- package/src/modules/approvalMethod/api/ApiQueryMagazineApprovalMethod.ts +0 -34
- package/src/modules/icons/IconManagementPage.tsx +0 -245
- package/src/routes/admin/app-for-catalog/$id.tsx +0 -571
- package/src/routes/admin/app-for-catalog/index.tsx +0 -19
- package/src/routes/admin/app-for-catalog.tsx +0 -12
- package/src/routes/admin/approval-methods/index.tsx +0 -161
- package/src/routes/admin/approval-methods.tsx +0 -10
- package/src/routes/admin/chat.tsx +0 -13
- package/src/routes/admin/icons.tsx +0 -22
- package/src/routes/admin/index.tsx +0 -9
- package/src/routes/admin.tsx +0 -60
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import { Image, X } from 'lucide-react'
|
|
2
|
-
import { useState } from 'react'
|
|
3
|
-
import { Button } from '~/ui/button'
|
|
4
|
-
import { Label } from '~/ui/label'
|
|
5
|
-
import { IconPickerDialog } from './IconPickerDialog'
|
|
6
|
-
|
|
7
|
-
interface IconPickerFieldProps {
|
|
8
|
-
label?: string
|
|
9
|
-
value?: string
|
|
10
|
-
onChange: (iconName: string | undefined) => void
|
|
11
|
-
placeholder?: string
|
|
12
|
-
required?: boolean
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export function IconPickerField({
|
|
16
|
-
label = 'Icon',
|
|
17
|
-
value,
|
|
18
|
-
onChange,
|
|
19
|
-
placeholder = 'No icon selected',
|
|
20
|
-
required = false,
|
|
21
|
-
}: IconPickerFieldProps) {
|
|
22
|
-
const [dialogOpen, setDialogOpen] = useState(false)
|
|
23
|
-
|
|
24
|
-
const handleClear = () => {
|
|
25
|
-
onChange(undefined)
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
return (
|
|
29
|
-
<div className="space-y-2">
|
|
30
|
-
{label && (
|
|
31
|
-
<Label>
|
|
32
|
-
{label}
|
|
33
|
-
{required && <span className="text-destructive ml-1">*</span>}
|
|
34
|
-
</Label>
|
|
35
|
-
)}
|
|
36
|
-
|
|
37
|
-
<div className="flex items-center gap-2">
|
|
38
|
-
<Button
|
|
39
|
-
type="button"
|
|
40
|
-
variant="outline"
|
|
41
|
-
onClick={() => setDialogOpen(true)}
|
|
42
|
-
className="flex-1 justify-start"
|
|
43
|
-
>
|
|
44
|
-
{value ? (
|
|
45
|
-
<div className="flex items-center gap-2">
|
|
46
|
-
<div className="w-6 h-6 flex items-center justify-center">
|
|
47
|
-
<img
|
|
48
|
-
src={`/api/icons/${value}`}
|
|
49
|
-
alt={value}
|
|
50
|
-
className="max-w-full max-h-full object-contain"
|
|
51
|
-
onError={(e) => {
|
|
52
|
-
// Fallback if icon not found
|
|
53
|
-
e.currentTarget.style.display = 'none'
|
|
54
|
-
}}
|
|
55
|
-
/>
|
|
56
|
-
</div>
|
|
57
|
-
<span className="truncate">{value}</span>
|
|
58
|
-
</div>
|
|
59
|
-
) : (
|
|
60
|
-
<div className="flex items-center gap-2 text-muted-foreground">
|
|
61
|
-
<Image className="h-4 w-4" />
|
|
62
|
-
<span>{placeholder}</span>
|
|
63
|
-
</div>
|
|
64
|
-
)}
|
|
65
|
-
</Button>
|
|
66
|
-
|
|
67
|
-
{value && (
|
|
68
|
-
<Button
|
|
69
|
-
type="button"
|
|
70
|
-
variant="ghost"
|
|
71
|
-
size="icon"
|
|
72
|
-
onClick={handleClear}
|
|
73
|
-
title="Clear icon"
|
|
74
|
-
>
|
|
75
|
-
<X className="h-4 w-4" />
|
|
76
|
-
</Button>
|
|
77
|
-
)}
|
|
78
|
-
</div>
|
|
79
|
-
|
|
80
|
-
<IconPickerDialog
|
|
81
|
-
open={dialogOpen}
|
|
82
|
-
onOpenChange={setDialogOpen}
|
|
83
|
-
onSelect={onChange}
|
|
84
|
-
selectedIconName={value}
|
|
85
|
-
/>
|
|
86
|
-
</div>
|
|
87
|
-
)
|
|
88
|
-
}
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
import { useChat } from '@ai-sdk/react'
|
|
2
|
-
import { DefaultChatTransport } from 'ai'
|
|
3
|
-
import { Send } from 'lucide-react'
|
|
4
|
-
import type { FormEvent } from 'react'
|
|
5
|
-
import { useEffect, useMemo, useRef, useState } from 'react'
|
|
6
|
-
|
|
7
|
-
import { Button } from '~/ui/button'
|
|
8
|
-
import { Input } from '~/ui/input'
|
|
9
|
-
|
|
10
|
-
import { useAdminConfig } from '../context/AdminConfigContext'
|
|
11
|
-
import { AdminWelcome } from './AdminWelcome'
|
|
12
|
-
|
|
13
|
-
export function AdminChat() {
|
|
14
|
-
const config = useAdminConfig()
|
|
15
|
-
const messagesEndRef = useRef<HTMLDivElement>(null)
|
|
16
|
-
const [input, setInput] = useState('')
|
|
17
|
-
|
|
18
|
-
// Use DefaultChatTransport which handles UI message stream format (tool calls, etc.)
|
|
19
|
-
const transport = useMemo(
|
|
20
|
-
() => new DefaultChatTransport({ api: config.chatApiUrl }),
|
|
21
|
-
[config.chatApiUrl],
|
|
22
|
-
)
|
|
23
|
-
|
|
24
|
-
const { messages, sendMessage, status, error } = useChat({
|
|
25
|
-
transport,
|
|
26
|
-
})
|
|
27
|
-
|
|
28
|
-
const isLoading = status === 'streaming' || status === 'submitted'
|
|
29
|
-
|
|
30
|
-
// Auto-scroll to bottom when new messages arrive
|
|
31
|
-
useEffect(() => {
|
|
32
|
-
messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' })
|
|
33
|
-
}, [messages])
|
|
34
|
-
|
|
35
|
-
const handleSubmit = (e: FormEvent) => {
|
|
36
|
-
e.preventDefault()
|
|
37
|
-
if (!input.trim() || isLoading) {
|
|
38
|
-
return
|
|
39
|
-
}
|
|
40
|
-
sendMessage({ text: input })
|
|
41
|
-
setInput('')
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
// Extract text content from message parts
|
|
45
|
-
const getMessageContent = (message: (typeof messages)[0]): string => {
|
|
46
|
-
return message.parts
|
|
47
|
-
.filter((part) => part.type === 'text')
|
|
48
|
-
.map((part) => part.text)
|
|
49
|
-
.join('')
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
return (
|
|
53
|
-
<div className="flex flex-col flex-1">
|
|
54
|
-
{/* Messages area */}
|
|
55
|
-
<div className="flex-1 overflow-y-auto">
|
|
56
|
-
{messages.length === 0 ? (
|
|
57
|
-
<AdminWelcome />
|
|
58
|
-
) : (
|
|
59
|
-
<div className="max-w-3xl mx-auto space-y-4 py-4">
|
|
60
|
-
{messages.map((message) => (
|
|
61
|
-
<div
|
|
62
|
-
key={message.id}
|
|
63
|
-
className={`flex ${
|
|
64
|
-
message.role === 'user' ? 'justify-end' : 'justify-start'
|
|
65
|
-
}`}
|
|
66
|
-
>
|
|
67
|
-
<div
|
|
68
|
-
className={`max-w-[80%] rounded-lg px-4 py-2 ${
|
|
69
|
-
message.role === 'user'
|
|
70
|
-
? 'bg-primary text-primary-foreground'
|
|
71
|
-
: 'bg-muted text-foreground'
|
|
72
|
-
}`}
|
|
73
|
-
>
|
|
74
|
-
<pre className="whitespace-pre-wrap font-sans text-sm">
|
|
75
|
-
{getMessageContent(message)}
|
|
76
|
-
</pre>
|
|
77
|
-
</div>
|
|
78
|
-
</div>
|
|
79
|
-
))}
|
|
80
|
-
{isLoading && (
|
|
81
|
-
<div className="flex justify-start">
|
|
82
|
-
<div className="bg-muted rounded-lg px-4 py-2">
|
|
83
|
-
<span className="text-muted-foreground text-sm">
|
|
84
|
-
Thinking...
|
|
85
|
-
</span>
|
|
86
|
-
</div>
|
|
87
|
-
</div>
|
|
88
|
-
)}
|
|
89
|
-
<div ref={messagesEndRef} />
|
|
90
|
-
</div>
|
|
91
|
-
)}
|
|
92
|
-
</div>
|
|
93
|
-
|
|
94
|
-
{/* Error display */}
|
|
95
|
-
{error && (
|
|
96
|
-
<div className="px-4 py-2 bg-destructive/10 border-t border-destructive/20">
|
|
97
|
-
<p className="text-destructive text-sm">Error: {error.message}</p>
|
|
98
|
-
</div>
|
|
99
|
-
)}
|
|
100
|
-
|
|
101
|
-
{/* Input area */}
|
|
102
|
-
<div className="border-t border-border p-4">
|
|
103
|
-
<form onSubmit={handleSubmit} className="max-w-3xl mx-auto">
|
|
104
|
-
<div className="flex gap-2">
|
|
105
|
-
<Input
|
|
106
|
-
type="text"
|
|
107
|
-
value={input}
|
|
108
|
-
onChange={(e) => setInput(e.target.value)}
|
|
109
|
-
placeholder="Type your message..."
|
|
110
|
-
disabled={isLoading}
|
|
111
|
-
className="flex-1"
|
|
112
|
-
/>
|
|
113
|
-
<Button type="submit" disabled={isLoading || !input.trim()}>
|
|
114
|
-
<Send className="h-4 w-4" />
|
|
115
|
-
<span className="sr-only">Send</span>
|
|
116
|
-
</Button>
|
|
117
|
-
</div>
|
|
118
|
-
</form>
|
|
119
|
-
</div>
|
|
120
|
-
</div>
|
|
121
|
-
)
|
|
122
|
-
}
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
import { Link } from '@tanstack/react-router'
|
|
2
|
-
import {
|
|
3
|
-
CheckSquare,
|
|
4
|
-
ChevronLeft,
|
|
5
|
-
ChevronRight,
|
|
6
|
-
ImageIcon,
|
|
7
|
-
LayoutDashboard,
|
|
8
|
-
MessageSquare,
|
|
9
|
-
} from 'lucide-react'
|
|
10
|
-
import type { ReactNode } from 'react'
|
|
11
|
-
import { useState } from 'react'
|
|
12
|
-
import { cn } from '~/lib/utils'
|
|
13
|
-
import { Button } from '~/ui/button'
|
|
14
|
-
import { Breadcrumbs } from '~/ui/components/Breadcrumbs'
|
|
15
|
-
import { MainLayout } from '~/ui/layout/MainLayout'
|
|
16
|
-
|
|
17
|
-
export interface AdminLayoutProps {
|
|
18
|
-
children: ReactNode
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
interface NavItem {
|
|
22
|
-
name: string
|
|
23
|
-
path: string
|
|
24
|
-
icon: typeof MessageSquare
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
const navItems: Array<NavItem> = [
|
|
28
|
-
{
|
|
29
|
-
name: 'Chat',
|
|
30
|
-
path: '/admin/chat',
|
|
31
|
-
icon: MessageSquare,
|
|
32
|
-
},
|
|
33
|
-
{
|
|
34
|
-
name: 'Icons',
|
|
35
|
-
path: '/admin/icons',
|
|
36
|
-
icon: ImageIcon,
|
|
37
|
-
},
|
|
38
|
-
{
|
|
39
|
-
name: 'App For Catalog',
|
|
40
|
-
path: '/admin/app-for-catalog',
|
|
41
|
-
icon: LayoutDashboard,
|
|
42
|
-
},
|
|
43
|
-
{
|
|
44
|
-
name: 'Approval Methods',
|
|
45
|
-
path: '/admin/approval-methods',
|
|
46
|
-
icon: CheckSquare,
|
|
47
|
-
},
|
|
48
|
-
]
|
|
49
|
-
|
|
50
|
-
export function AdminLayout({ children }: AdminLayoutProps) {
|
|
51
|
-
const [isCollapsed, setIsCollapsed] = useState(false)
|
|
52
|
-
|
|
53
|
-
return (
|
|
54
|
-
<MainLayout breadcrumbs={<Breadcrumbs />}>
|
|
55
|
-
<div className="flex gap-6 -mx-6 -my-6 flex-1">
|
|
56
|
-
{/* Left sidebar */}
|
|
57
|
-
<aside
|
|
58
|
-
className={cn(
|
|
59
|
-
'flex flex-col transition-all duration-300',
|
|
60
|
-
isCollapsed ? 'w-16' : 'w-64',
|
|
61
|
-
)}
|
|
62
|
-
>
|
|
63
|
-
<div className="p-4 flex items-center justify-between">
|
|
64
|
-
{!isCollapsed && <h1 className="text-2xl font-bold">Admin</h1>}
|
|
65
|
-
<Button
|
|
66
|
-
variant="ghost"
|
|
67
|
-
size="icon"
|
|
68
|
-
onClick={() => setIsCollapsed(!isCollapsed)}
|
|
69
|
-
className={cn('h-8 w-8', isCollapsed && 'mx-auto')}
|
|
70
|
-
>
|
|
71
|
-
{isCollapsed ? (
|
|
72
|
-
<ChevronRight className="h-4 w-4" />
|
|
73
|
-
) : (
|
|
74
|
-
<ChevronLeft className="h-4 w-4" />
|
|
75
|
-
)}
|
|
76
|
-
</Button>
|
|
77
|
-
</div>
|
|
78
|
-
<nav className="flex-1 p-4 space-y-2">
|
|
79
|
-
{navItems.map((item) => {
|
|
80
|
-
const Icon = item.icon
|
|
81
|
-
return (
|
|
82
|
-
<Link key={item.path} to={item.path} className="block">
|
|
83
|
-
{({ isActive }: { isActive: boolean }) => (
|
|
84
|
-
<Button
|
|
85
|
-
variant="ghost"
|
|
86
|
-
className={cn(
|
|
87
|
-
'w-full',
|
|
88
|
-
isCollapsed ? 'justify-center px-2' : 'justify-start',
|
|
89
|
-
isActive &&
|
|
90
|
-
'bg-primary text-primary-foreground hover:bg-primary/90',
|
|
91
|
-
)}
|
|
92
|
-
title={isCollapsed ? item.name : undefined}
|
|
93
|
-
>
|
|
94
|
-
<Icon className={cn('w-4 h-4', !isCollapsed && 'mr-2')} />
|
|
95
|
-
{!isCollapsed && <span>{item.name}</span>}
|
|
96
|
-
</Button>
|
|
97
|
-
)}
|
|
98
|
-
</Link>
|
|
99
|
-
)
|
|
100
|
-
})}
|
|
101
|
-
</nav>
|
|
102
|
-
</aside>
|
|
103
|
-
|
|
104
|
-
{/* Main content */}
|
|
105
|
-
<main className="flex-1 flex flex-col overflow-hidden min-w-0">
|
|
106
|
-
{children}
|
|
107
|
-
</main>
|
|
108
|
-
</div>
|
|
109
|
-
</MainLayout>
|
|
110
|
-
)
|
|
111
|
-
}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Card,
|
|
3
|
-
CardContent,
|
|
4
|
-
CardDescription,
|
|
5
|
-
CardHeader,
|
|
6
|
-
CardTitle,
|
|
7
|
-
} from '~/ui/card'
|
|
8
|
-
|
|
9
|
-
export function AdminWelcome() {
|
|
10
|
-
return (
|
|
11
|
-
<div className="p-6 max-w-2xl mx-auto">
|
|
12
|
-
<h1 className="text-2xl font-bold mb-4">Admin Assistant</h1>
|
|
13
|
-
<p className="text-muted-foreground mb-6">
|
|
14
|
-
Welcome to the AI-powered admin interface. You can use natural language
|
|
15
|
-
to manage your application.
|
|
16
|
-
</p>
|
|
17
|
-
|
|
18
|
-
<Card className="mb-6">
|
|
19
|
-
<CardHeader>
|
|
20
|
-
<CardTitle>What you can do</CardTitle>
|
|
21
|
-
<CardDescription>
|
|
22
|
-
Try these example commands to get started
|
|
23
|
-
</CardDescription>
|
|
24
|
-
</CardHeader>
|
|
25
|
-
<CardContent>
|
|
26
|
-
<ul className="space-y-2 text-sm">
|
|
27
|
-
<li className="flex items-start gap-2">
|
|
28
|
-
<span className="text-primary">•</span>
|
|
29
|
-
<span>Show me contents of the Apps table in DB</span>
|
|
30
|
-
</li>
|
|
31
|
-
<li className="flex items-start gap-2">
|
|
32
|
-
<span className="text-primary">•</span>
|
|
33
|
-
<span>Add a new app called "Portal" with icon "portal"</span>
|
|
34
|
-
</li>
|
|
35
|
-
<li className="flex items-start gap-2">
|
|
36
|
-
<span className="text-primary">•</span>
|
|
37
|
-
<span>List all configured data sources</span>
|
|
38
|
-
</li>
|
|
39
|
-
<li className="flex items-start gap-2">
|
|
40
|
-
<span className="text-primary">•</span>
|
|
41
|
-
<span>Configure a new MCP server</span>
|
|
42
|
-
</li>
|
|
43
|
-
</ul>
|
|
44
|
-
</CardContent>
|
|
45
|
-
</Card>
|
|
46
|
-
|
|
47
|
-
<p className="text-sm text-muted-foreground">
|
|
48
|
-
Type your request in the chat below to get started.
|
|
49
|
-
</p>
|
|
50
|
-
</div>
|
|
51
|
-
)
|
|
52
|
-
}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import type { ReactNode } from 'react'
|
|
2
|
-
import { createContext, use, useMemo } from 'react'
|
|
3
|
-
|
|
4
|
-
import type { AdminConfig } from '../types/adminTypes'
|
|
5
|
-
|
|
6
|
-
const defaultConfig: AdminConfig = {
|
|
7
|
-
chatApiUrl: '/api/admin/chat',
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
const AdminConfigContext = createContext<AdminConfig>(defaultConfig)
|
|
11
|
-
|
|
12
|
-
export interface AdminConfigProviderProps {
|
|
13
|
-
config?: Partial<AdminConfig>
|
|
14
|
-
children: ReactNode
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export function AdminConfigProvider({
|
|
18
|
-
config,
|
|
19
|
-
children,
|
|
20
|
-
}: AdminConfigProviderProps) {
|
|
21
|
-
const mergedConfig: AdminConfig = useMemo(
|
|
22
|
-
() => ({
|
|
23
|
-
...defaultConfig,
|
|
24
|
-
...config,
|
|
25
|
-
}),
|
|
26
|
-
[config],
|
|
27
|
-
)
|
|
28
|
-
|
|
29
|
-
return (
|
|
30
|
-
<AdminConfigContext value={mergedConfig}>{children}</AdminConfigContext>
|
|
31
|
-
)
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export function useAdminConfig(): AdminConfig {
|
|
35
|
-
return use(AdminConfigContext)
|
|
36
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
// Components
|
|
2
|
-
export { AdminChat } from './components/AdminChat'
|
|
3
|
-
export { AdminLayout } from './components/AdminLayout'
|
|
4
|
-
export { AdminWelcome } from './components/AdminWelcome'
|
|
5
|
-
|
|
6
|
-
// Context
|
|
7
|
-
export {
|
|
8
|
-
AdminConfigProvider,
|
|
9
|
-
useAdminConfig,
|
|
10
|
-
type AdminConfigProviderProps
|
|
11
|
-
} from './context/AdminConfigContext'
|
|
12
|
-
|
|
13
|
-
// Types
|
|
14
|
-
export type { AdminChatMessage, AdminConfig } from './types/adminTypes'
|
|
15
|
-
|
|
16
|
-
|