@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,5 +1,5 @@
|
|
|
1
|
-
import { Link
|
|
2
|
-
import { LogOut
|
|
1
|
+
import { Link } from '@tanstack/react-router'
|
|
2
|
+
import { LogOut } from 'lucide-react'
|
|
3
3
|
import type React from 'react'
|
|
4
4
|
import AppCatalogLogo from '~/assets/app-catalog.svg?react'
|
|
5
5
|
import { ThemeSwitcher } from '~/components/ThemeSwitcher'
|
|
@@ -30,7 +30,6 @@ export function Header({ middle }: HeaderProps) {
|
|
|
30
30
|
const isAuthenticated = useIsAuthenticated()
|
|
31
31
|
const user = useUser()
|
|
32
32
|
const { logout } = useAuthActions()
|
|
33
|
-
const navigate = useNavigate()
|
|
34
33
|
const { open: openLoginModal } = useAuthModal()
|
|
35
34
|
const { appVersion } = useAppCatalogContext()
|
|
36
35
|
|
|
@@ -42,10 +41,6 @@ export function Header({ middle }: HeaderProps) {
|
|
|
42
41
|
}
|
|
43
42
|
}
|
|
44
43
|
|
|
45
|
-
const handleAdminClick = () => {
|
|
46
|
-
navigate({ to: '/admin' })
|
|
47
|
-
}
|
|
48
|
-
|
|
49
44
|
const handleLoginClick = () => {
|
|
50
45
|
// Preserve the current URL for redirect after login
|
|
51
46
|
const currentUrl = window.location.pathname + window.location.search
|
|
@@ -135,11 +130,6 @@ export function Header({ middle }: HeaderProps) {
|
|
|
135
130
|
</div>
|
|
136
131
|
</div>
|
|
137
132
|
<DropdownMenuSeparator />
|
|
138
|
-
<DropdownMenuItem onClick={handleAdminClick}>
|
|
139
|
-
<Settings className="h-4 w-4 mr-2" />
|
|
140
|
-
<span>Admin</span>
|
|
141
|
-
</DropdownMenuItem>
|
|
142
|
-
<DropdownMenuSeparator />
|
|
143
133
|
<DropdownMenuItem onClick={handleLogout}>
|
|
144
134
|
<LogOut className="h-4 w-4 mr-2" />
|
|
145
135
|
<span>Sign out</span>
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
interface IconPickerDialogProps {
|
|
2
|
-
open: boolean;
|
|
3
|
-
onOpenChange: (open: boolean) => void;
|
|
4
|
-
onSelect: (iconName: string) => void;
|
|
5
|
-
selectedIconName?: string;
|
|
6
|
-
}
|
|
7
|
-
export declare function IconPickerDialog({ open, onOpenChange, onSelect, selectedIconName, }: IconPickerDialogProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
-
export {};
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { useQuery } from "@tanstack/react-query";
|
|
3
|
-
import { Search } from "lucide-react";
|
|
4
|
-
import { useState } from "react";
|
|
5
|
-
import { useTRPC } from "../api/infra/trpc.js";
|
|
6
|
-
import { Button } from "../ui/button.js";
|
|
7
|
-
import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription } from "../ui/dialog.js";
|
|
8
|
-
import { Input } from "../ui/input.js";
|
|
9
|
-
import { ScrollArea } from "../ui/scroll-area.js";
|
|
10
|
-
function IconPickerDialog({
|
|
11
|
-
open,
|
|
12
|
-
onOpenChange,
|
|
13
|
-
onSelect,
|
|
14
|
-
selectedIconName
|
|
15
|
-
}) {
|
|
16
|
-
const [search, setSearch] = useState("");
|
|
17
|
-
const trpc = useTRPC();
|
|
18
|
-
const queryOptions = trpc.icon.list.queryOptions();
|
|
19
|
-
const { data: icons = [], isLoading } = useQuery({
|
|
20
|
-
...queryOptions,
|
|
21
|
-
enabled: open
|
|
22
|
-
});
|
|
23
|
-
const filteredIcons = icons.filter(
|
|
24
|
-
(icon) => icon.name.toLowerCase().includes(search.toLowerCase())
|
|
25
|
-
);
|
|
26
|
-
const handleSelect = (iconName) => {
|
|
27
|
-
onSelect(iconName);
|
|
28
|
-
onOpenChange(false);
|
|
29
|
-
};
|
|
30
|
-
return /* @__PURE__ */ jsx(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs(DialogContent, { className: "max-w-3xl max-h-[80vh] flex flex-col", children: [
|
|
31
|
-
/* @__PURE__ */ jsxs(DialogHeader, { children: [
|
|
32
|
-
/* @__PURE__ */ jsx(DialogTitle, { children: "Select Icon" }),
|
|
33
|
-
/* @__PURE__ */ jsx(DialogDescription, { children: "Search and select an icon from the available icons" })
|
|
34
|
-
] }),
|
|
35
|
-
/* @__PURE__ */ jsxs("div", { className: "relative", children: [
|
|
36
|
-
/* @__PURE__ */ jsx(Search, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground" }),
|
|
37
|
-
/* @__PURE__ */ jsx(
|
|
38
|
-
Input,
|
|
39
|
-
{
|
|
40
|
-
placeholder: "Search icons by name...",
|
|
41
|
-
value: search,
|
|
42
|
-
onChange: (e) => setSearch(e.target.value),
|
|
43
|
-
className: "pl-10"
|
|
44
|
-
}
|
|
45
|
-
)
|
|
46
|
-
] }),
|
|
47
|
-
/* @__PURE__ */ jsx(ScrollArea, { className: "flex-1 pr-4", children: isLoading ? /* @__PURE__ */ jsx("div", { className: "text-center py-8 text-muted-foreground", children: "Loading icons..." }) : filteredIcons.length === 0 ? /* @__PURE__ */ jsx("div", { className: "text-center py-8 text-muted-foreground", children: search ? `No icons found matching "${search}"` : "No icons available" }) : /* @__PURE__ */ jsx("div", { className: "grid grid-cols-4 sm:grid-cols-6 md:grid-cols-8 gap-3 pb-4", children: filteredIcons.map((icon) => {
|
|
48
|
-
const isSelected = icon.name === selectedIconName;
|
|
49
|
-
return /* @__PURE__ */ jsxs(
|
|
50
|
-
"button",
|
|
51
|
-
{
|
|
52
|
-
type: "button",
|
|
53
|
-
onClick: () => handleSelect(icon.name),
|
|
54
|
-
className: `group relative flex flex-col items-center gap-2 p-3 rounded-lg border-2 transition-all hover:border-primary hover:shadow-md ${isSelected ? "border-primary bg-primary/5" : "border-border bg-background"}`,
|
|
55
|
-
title: icon.name,
|
|
56
|
-
children: [
|
|
57
|
-
/* @__PURE__ */ jsx("div", { className: "w-12 h-12 flex items-center justify-center", children: /* @__PURE__ */ jsx(
|
|
58
|
-
"img",
|
|
59
|
-
{
|
|
60
|
-
src: `/api/assets/${icon.id}?w=64`,
|
|
61
|
-
alt: icon.name,
|
|
62
|
-
className: "max-w-full max-h-full object-contain"
|
|
63
|
-
}
|
|
64
|
-
) }),
|
|
65
|
-
/* @__PURE__ */ jsx("span", { className: "text-xs text-center line-clamp-2 w-full wrap-break-word", children: icon.name }),
|
|
66
|
-
isSelected && /* @__PURE__ */ jsx("div", { className: "absolute top-1 right-1 bg-primary text-primary-foreground rounded-full p-0.5", children: /* @__PURE__ */ jsx(
|
|
67
|
-
"svg",
|
|
68
|
-
{
|
|
69
|
-
className: "w-3 h-3",
|
|
70
|
-
fill: "none",
|
|
71
|
-
strokeLinecap: "round",
|
|
72
|
-
strokeLinejoin: "round",
|
|
73
|
-
strokeWidth: "2",
|
|
74
|
-
viewBox: "0 0 24 24",
|
|
75
|
-
stroke: "currentColor",
|
|
76
|
-
children: /* @__PURE__ */ jsx("path", { d: "M5 13l4 4L19 7" })
|
|
77
|
-
}
|
|
78
|
-
) })
|
|
79
|
-
]
|
|
80
|
-
},
|
|
81
|
-
icon.id
|
|
82
|
-
);
|
|
83
|
-
}) }) }),
|
|
84
|
-
/* @__PURE__ */ jsxs("div", { className: "flex justify-between items-center pt-2 border-t", children: [
|
|
85
|
-
/* @__PURE__ */ jsxs("span", { className: "text-sm text-muted-foreground", children: [
|
|
86
|
-
filteredIcons.length,
|
|
87
|
-
" icon",
|
|
88
|
-
filteredIcons.length !== 1 ? "s" : "",
|
|
89
|
-
search && ` matching "${search}"`
|
|
90
|
-
] }),
|
|
91
|
-
/* @__PURE__ */ jsx(Button, { variant: "outline", onClick: () => onOpenChange(false), children: "Cancel" })
|
|
92
|
-
] })
|
|
93
|
-
] }) });
|
|
94
|
-
}
|
|
95
|
-
export {
|
|
96
|
-
IconPickerDialog
|
|
97
|
-
};
|
|
98
|
-
//# sourceMappingURL=IconPickerDialog.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"IconPickerDialog.js","sources":["../../../src/components/IconPickerDialog.tsx"],"sourcesContent":["import { useQuery } from '@tanstack/react-query'\nimport { Search } from 'lucide-react'\nimport { useState } from 'react'\nimport { useTRPC } from '~/api/infra/trpc'\nimport { Button } from '~/ui/button'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from '~/ui/dialog'\nimport { Input } from '~/ui/input'\nimport { ScrollArea } from '~/ui/scroll-area'\n\ninterface IconPickerDialogProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n onSelect: (iconName: string) => void\n selectedIconName?: string\n}\n\nexport function IconPickerDialog({\n open,\n onOpenChange,\n onSelect,\n selectedIconName,\n}: IconPickerDialogProps) {\n const [search, setSearch] = useState('')\n const trpc = useTRPC()\n\n const queryOptions = trpc.icon.list.queryOptions()\n const { data: icons = [], isLoading } = useQuery({\n ...queryOptions,\n enabled: open,\n })\n\n type IconData = (typeof icons)[number]\n\n const filteredIcons = icons.filter((icon: IconData) =>\n icon.name.toLowerCase().includes(search.toLowerCase()),\n )\n\n const handleSelect = (iconName: string) => {\n onSelect(iconName)\n onOpenChange(false)\n }\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"max-w-3xl max-h-[80vh] flex flex-col\">\n <DialogHeader>\n <DialogTitle>Select Icon</DialogTitle>\n <DialogDescription>\n Search and select an icon from the available icons\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"relative\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground\" />\n <Input\n placeholder=\"Search icons by name...\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"pl-10\"\n />\n </div>\n\n <ScrollArea className=\"flex-1 pr-4\">\n {isLoading ? (\n <div className=\"text-center py-8 text-muted-foreground\">Loading icons...</div>\n ) : filteredIcons.length === 0 ? (\n <div className=\"text-center py-8 text-muted-foreground\">\n {search ? `No icons found matching \"${search}\"` : 'No icons available'}\n </div>\n ) : (\n <div className=\"grid grid-cols-4 sm:grid-cols-6 md:grid-cols-8 gap-3 pb-4\">\n {filteredIcons.map((icon: IconData) => {\n const isSelected = icon.name === selectedIconName\n return (\n <button\n key={icon.id}\n type=\"button\"\n onClick={() => handleSelect(icon.name)}\n className={`group relative flex flex-col items-center gap-2 p-3 rounded-lg border-2 transition-all hover:border-primary hover:shadow-md ${\n isSelected\n ? 'border-primary bg-primary/5'\n : 'border-border bg-background'\n }`}\n title={icon.name}\n >\n <div className=\"w-12 h-12 flex items-center justify-center\">\n <img\n src={`/api/assets/${icon.id}?w=64`}\n alt={icon.name}\n className=\"max-w-full max-h-full object-contain\"\n />\n </div>\n <span className=\"text-xs text-center line-clamp-2 w-full wrap-break-word\">\n {icon.name}\n </span>\n {isSelected && (\n <div className=\"absolute top-1 right-1 bg-primary text-primary-foreground rounded-full p-0.5\">\n <svg\n className=\"w-3 h-3\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path d=\"M5 13l4 4L19 7\" />\n </svg>\n </div>\n )}\n </button>\n )\n })}\n </div>\n )}\n </ScrollArea>\n\n <div className=\"flex justify-between items-center pt-2 border-t\">\n <span className=\"text-sm text-muted-foreground\">\n {filteredIcons.length} icon{filteredIcons.length !== 1 ? 's' : ''}\n {search && ` matching \"${search}\"`}\n </span>\n <Button variant=\"outline\" onClick={() => onOpenChange(false)}>\n Cancel\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n"],"names":[],"mappings":";;;;;;;;;AAsBO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA0B;AACxB,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,EAAE;AACvC,QAAM,OAAO,QAAA;AAEb,QAAM,eAAe,KAAK,KAAK,KAAK,aAAA;AACpC,QAAM,EAAE,MAAM,QAAQ,CAAA,GAAI,UAAA,IAAc,SAAS;AAAA,IAC/C,GAAG;AAAA,IACH,SAAS;AAAA,EAAA,CACV;AAID,QAAM,gBAAgB,MAAM;AAAA,IAAO,CAAC,SAClC,KAAK,KAAK,cAAc,SAAS,OAAO,YAAA,CAAa;AAAA,EAAA;AAGvD,QAAM,eAAe,CAAC,aAAqB;AACzC,aAAS,QAAQ;AACjB,iBAAa,KAAK;AAAA,EACpB;AAEA,6BACG,QAAA,EAAO,MAAY,cAClB,UAAA,qBAAC,eAAA,EAAc,WAAU,wCACvB,UAAA;AAAA,IAAA,qBAAC,cAAA,EACC,UAAA;AAAA,MAAA,oBAAC,eAAY,UAAA,cAAA,CAAW;AAAA,MACxB,oBAAC,qBAAkB,UAAA,qDAAA,CAEnB;AAAA,IAAA,GACF;AAAA,IAEA,qBAAC,OAAA,EAAI,WAAU,YACb,UAAA;AAAA,MAAA,oBAAC,QAAA,EAAO,WAAU,yEAAA,CAAyE;AAAA,MAC3F;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,aAAY;AAAA,UACZ,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,UAAU,EAAE,OAAO,KAAK;AAAA,UACzC,WAAU;AAAA,QAAA;AAAA,MAAA;AAAA,IACZ,GACF;AAAA,IAEA,oBAAC,YAAA,EAAW,WAAU,eACnB,UAAA,YACC,oBAAC,OAAA,EAAI,WAAU,0CAAyC,UAAA,oBAAgB,IACtE,cAAc,WAAW,IAC3B,oBAAC,OAAA,EAAI,WAAU,0CACZ,UAAA,SAAS,4BAA4B,MAAM,MAAM,qBAAA,CACpD,IAEA,oBAAC,OAAA,EAAI,WAAU,6DACZ,UAAA,cAAc,IAAI,CAAC,SAAmB;AACrC,YAAM,aAAa,KAAK,SAAS;AACjC,aACE;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,MAAK;AAAA,UACL,SAAS,MAAM,aAAa,KAAK,IAAI;AAAA,UACrC,WAAW,+HACT,aACI,gCACA,6BACN;AAAA,UACA,OAAO,KAAK;AAAA,UAEZ,UAAA;AAAA,YAAA,oBAAC,OAAA,EAAI,WAAU,8CACb,UAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,KAAK,eAAe,KAAK,EAAE;AAAA,gBAC3B,KAAK,KAAK;AAAA,gBACV,WAAU;AAAA,cAAA;AAAA,YAAA,GAEd;AAAA,YACA,oBAAC,QAAA,EAAK,WAAU,2DACb,eAAK,MACR;AAAA,YACC,cACC,oBAAC,OAAA,EAAI,WAAU,gFACb,UAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAU;AAAA,gBACV,MAAK;AAAA,gBACL,eAAc;AAAA,gBACd,gBAAe;AAAA,gBACf,aAAY;AAAA,gBACZ,SAAQ;AAAA,gBACR,QAAO;AAAA,gBAEP,UAAA,oBAAC,QAAA,EAAK,GAAE,iBAAA,CAAiB;AAAA,cAAA;AAAA,YAAA,EAC3B,CACF;AAAA,UAAA;AAAA,QAAA;AAAA,QAjCG,KAAK;AAAA,MAAA;AAAA,IAqChB,CAAC,GACH,GAEJ;AAAA,IAEA,qBAAC,OAAA,EAAI,WAAU,mDACb,UAAA;AAAA,MAAA,qBAAC,QAAA,EAAK,WAAU,iCACb,UAAA;AAAA,QAAA,cAAc;AAAA,QAAO;AAAA,QAAM,cAAc,WAAW,IAAI,MAAM;AAAA,QAC9D,UAAU,cAAc,MAAM;AAAA,MAAA,GACjC;AAAA,MACA,oBAAC,UAAO,SAAQ,WAAU,SAAS,MAAM,aAAa,KAAK,GAAG,UAAA,SAAA,CAE9D;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,EAAA,CACF,EAAA,CACF;AAEJ;"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
interface IconPickerFieldProps {
|
|
2
|
-
label?: string;
|
|
3
|
-
value?: string;
|
|
4
|
-
onChange: (iconName: string | undefined) => void;
|
|
5
|
-
placeholder?: string;
|
|
6
|
-
required?: boolean;
|
|
7
|
-
}
|
|
8
|
-
export declare function IconPickerField({ label, value, onChange, placeholder, required, }: IconPickerFieldProps): import("react/jsx-runtime").JSX.Element;
|
|
9
|
-
export {};
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
-
import { Image, X } from "lucide-react";
|
|
3
|
-
import { useState } from "react";
|
|
4
|
-
import { Button } from "../ui/button.js";
|
|
5
|
-
import { Label } from "../ui/label.js";
|
|
6
|
-
import { IconPickerDialog } from "./IconPickerDialog.js";
|
|
7
|
-
function IconPickerField({
|
|
8
|
-
label = "Icon",
|
|
9
|
-
value,
|
|
10
|
-
onChange,
|
|
11
|
-
placeholder = "No icon selected",
|
|
12
|
-
required = false
|
|
13
|
-
}) {
|
|
14
|
-
const [dialogOpen, setDialogOpen] = useState(false);
|
|
15
|
-
const handleClear = () => {
|
|
16
|
-
onChange(void 0);
|
|
17
|
-
};
|
|
18
|
-
return /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
19
|
-
label && /* @__PURE__ */ jsxs(Label, { children: [
|
|
20
|
-
label,
|
|
21
|
-
required && /* @__PURE__ */ jsx("span", { className: "text-destructive ml-1", children: "*" })
|
|
22
|
-
] }),
|
|
23
|
-
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
24
|
-
/* @__PURE__ */ jsx(
|
|
25
|
-
Button,
|
|
26
|
-
{
|
|
27
|
-
type: "button",
|
|
28
|
-
variant: "outline",
|
|
29
|
-
onClick: () => setDialogOpen(true),
|
|
30
|
-
className: "flex-1 justify-start",
|
|
31
|
-
children: value ? /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
32
|
-
/* @__PURE__ */ jsx("div", { className: "w-6 h-6 flex items-center justify-center", children: /* @__PURE__ */ jsx(
|
|
33
|
-
"img",
|
|
34
|
-
{
|
|
35
|
-
src: `/api/icons/${value}`,
|
|
36
|
-
alt: value,
|
|
37
|
-
className: "max-w-full max-h-full object-contain",
|
|
38
|
-
onError: (e) => {
|
|
39
|
-
e.currentTarget.style.display = "none";
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
) }),
|
|
43
|
-
/* @__PURE__ */ jsx("span", { className: "truncate", children: value })
|
|
44
|
-
] }) : /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-muted-foreground", children: [
|
|
45
|
-
/* @__PURE__ */ jsx(Image, { className: "h-4 w-4" }),
|
|
46
|
-
/* @__PURE__ */ jsx("span", { children: placeholder })
|
|
47
|
-
] })
|
|
48
|
-
}
|
|
49
|
-
),
|
|
50
|
-
value && /* @__PURE__ */ jsx(
|
|
51
|
-
Button,
|
|
52
|
-
{
|
|
53
|
-
type: "button",
|
|
54
|
-
variant: "ghost",
|
|
55
|
-
size: "icon",
|
|
56
|
-
onClick: handleClear,
|
|
57
|
-
title: "Clear icon",
|
|
58
|
-
children: /* @__PURE__ */ jsx(X, { className: "h-4 w-4" })
|
|
59
|
-
}
|
|
60
|
-
)
|
|
61
|
-
] }),
|
|
62
|
-
/* @__PURE__ */ jsx(
|
|
63
|
-
IconPickerDialog,
|
|
64
|
-
{
|
|
65
|
-
open: dialogOpen,
|
|
66
|
-
onOpenChange: setDialogOpen,
|
|
67
|
-
onSelect: onChange,
|
|
68
|
-
selectedIconName: value
|
|
69
|
-
}
|
|
70
|
-
)
|
|
71
|
-
] });
|
|
72
|
-
}
|
|
73
|
-
export {
|
|
74
|
-
IconPickerField
|
|
75
|
-
};
|
|
76
|
-
//# sourceMappingURL=IconPickerField.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"IconPickerField.js","sources":["../../../src/components/IconPickerField.tsx"],"sourcesContent":["import { Image, X } from 'lucide-react'\nimport { useState } from 'react'\nimport { Button } from '~/ui/button'\nimport { Label } from '~/ui/label'\nimport { IconPickerDialog } from './IconPickerDialog'\n\ninterface IconPickerFieldProps {\n label?: string\n value?: string\n onChange: (iconName: string | undefined) => void\n placeholder?: string\n required?: boolean\n}\n\nexport function IconPickerField({\n label = 'Icon',\n value,\n onChange,\n placeholder = 'No icon selected',\n required = false,\n}: IconPickerFieldProps) {\n const [dialogOpen, setDialogOpen] = useState(false)\n\n const handleClear = () => {\n onChange(undefined)\n }\n\n return (\n <div className=\"space-y-2\">\n {label && (\n <Label>\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </Label>\n )}\n\n <div className=\"flex items-center gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setDialogOpen(true)}\n className=\"flex-1 justify-start\"\n >\n {value ? (\n <div className=\"flex items-center gap-2\">\n <div className=\"w-6 h-6 flex items-center justify-center\">\n <img\n src={`/api/icons/${value}`}\n alt={value}\n className=\"max-w-full max-h-full object-contain\"\n onError={(e) => {\n // Fallback if icon not found\n e.currentTarget.style.display = 'none'\n }}\n />\n </div>\n <span className=\"truncate\">{value}</span>\n </div>\n ) : (\n <div className=\"flex items-center gap-2 text-muted-foreground\">\n <Image className=\"h-4 w-4\" />\n <span>{placeholder}</span>\n </div>\n )}\n </Button>\n\n {value && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n onClick={handleClear}\n title=\"Clear icon\"\n >\n <X className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n\n <IconPickerDialog\n open={dialogOpen}\n onOpenChange={setDialogOpen}\n onSelect={onChange}\n selectedIconName={value}\n />\n </div>\n )\n}\n"],"names":[],"mappings":";;;;;;AAcO,SAAS,gBAAgB;AAAA,EAC9B,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,WAAW;AACb,GAAyB;AACvB,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,KAAK;AAElD,QAAM,cAAc,MAAM;AACxB,aAAS,MAAS;AAAA,EACpB;AAEA,SACE,qBAAC,OAAA,EAAI,WAAU,aACZ,UAAA;AAAA,IAAA,8BACE,OAAA,EACE,UAAA;AAAA,MAAA;AAAA,MACA,YAAY,oBAAC,QAAA,EAAK,WAAU,yBAAwB,UAAA,IAAA,CAAC;AAAA,IAAA,GACxD;AAAA,IAGF,qBAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,MAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAQ;AAAA,UACR,SAAS,MAAM,cAAc,IAAI;AAAA,UACjC,WAAU;AAAA,UAET,UAAA,QACC,qBAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,YAAA,oBAAC,OAAA,EAAI,WAAU,4CACb,UAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,KAAK,cAAc,KAAK;AAAA,gBACxB,KAAK;AAAA,gBACL,WAAU;AAAA,gBACV,SAAS,CAAC,MAAM;AAEd,oBAAE,cAAc,MAAM,UAAU;AAAA,gBAClC;AAAA,cAAA;AAAA,YAAA,GAEJ;AAAA,YACA,oBAAC,QAAA,EAAK,WAAU,YAAY,UAAA,MAAA,CAAM;AAAA,UAAA,EAAA,CACpC,IAEA,qBAAC,OAAA,EAAI,WAAU,iDACb,UAAA;AAAA,YAAA,oBAAC,OAAA,EAAM,WAAU,UAAA,CAAU;AAAA,YAC3B,oBAAC,UAAM,UAAA,YAAA,CAAY;AAAA,UAAA,EAAA,CACrB;AAAA,QAAA;AAAA,MAAA;AAAA,MAIH,SACC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,SAAS;AAAA,UACT,OAAM;AAAA,UAEN,UAAA,oBAAC,GAAA,EAAE,WAAU,UAAA,CAAU;AAAA,QAAA;AAAA,MAAA;AAAA,IACzB,GAEJ;AAAA,IAEA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAM;AAAA,QACN,cAAc;AAAA,QACd,UAAU;AAAA,QACV,kBAAkB;AAAA,MAAA;AAAA,IAAA;AAAA,EACpB,GACF;AAEJ;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function AdminChat(): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
-
import { useChat } from "@ai-sdk/react";
|
|
3
|
-
import { DefaultChatTransport } from "ai";
|
|
4
|
-
import { Send } from "lucide-react";
|
|
5
|
-
import { useRef, useState, useMemo, useEffect } from "react";
|
|
6
|
-
import { Button } from "../../../ui/button.js";
|
|
7
|
-
import { Input } from "../../../ui/input.js";
|
|
8
|
-
import { useAdminConfig } from "../context/AdminConfigContext.js";
|
|
9
|
-
import { AdminWelcome } from "./AdminWelcome.js";
|
|
10
|
-
function AdminChat() {
|
|
11
|
-
const config = useAdminConfig();
|
|
12
|
-
const messagesEndRef = useRef(null);
|
|
13
|
-
const [input, setInput] = useState("");
|
|
14
|
-
const transport = useMemo(
|
|
15
|
-
() => new DefaultChatTransport({ api: config.chatApiUrl }),
|
|
16
|
-
[config.chatApiUrl]
|
|
17
|
-
);
|
|
18
|
-
const { messages, sendMessage, status, error } = useChat({
|
|
19
|
-
transport
|
|
20
|
-
});
|
|
21
|
-
const isLoading = status === "streaming" || status === "submitted";
|
|
22
|
-
useEffect(() => {
|
|
23
|
-
var _a;
|
|
24
|
-
(_a = messagesEndRef.current) == null ? void 0 : _a.scrollIntoView({ behavior: "smooth" });
|
|
25
|
-
}, [messages]);
|
|
26
|
-
const handleSubmit = (e) => {
|
|
27
|
-
e.preventDefault();
|
|
28
|
-
if (!input.trim() || isLoading) {
|
|
29
|
-
return;
|
|
30
|
-
}
|
|
31
|
-
sendMessage({ text: input });
|
|
32
|
-
setInput("");
|
|
33
|
-
};
|
|
34
|
-
const getMessageContent = (message) => {
|
|
35
|
-
return message.parts.filter((part) => part.type === "text").map((part) => part.text).join("");
|
|
36
|
-
};
|
|
37
|
-
return /* @__PURE__ */ jsxs("div", { className: "flex flex-col flex-1", children: [
|
|
38
|
-
/* @__PURE__ */ jsx("div", { className: "flex-1 overflow-y-auto", children: messages.length === 0 ? /* @__PURE__ */ jsx(AdminWelcome, {}) : /* @__PURE__ */ jsxs("div", { className: "max-w-3xl mx-auto space-y-4 py-4", children: [
|
|
39
|
-
messages.map((message) => /* @__PURE__ */ jsx(
|
|
40
|
-
"div",
|
|
41
|
-
{
|
|
42
|
-
className: `flex ${message.role === "user" ? "justify-end" : "justify-start"}`,
|
|
43
|
-
children: /* @__PURE__ */ jsx(
|
|
44
|
-
"div",
|
|
45
|
-
{
|
|
46
|
-
className: `max-w-[80%] rounded-lg px-4 py-2 ${message.role === "user" ? "bg-primary text-primary-foreground" : "bg-muted text-foreground"}`,
|
|
47
|
-
children: /* @__PURE__ */ jsx("pre", { className: "whitespace-pre-wrap font-sans text-sm", children: getMessageContent(message) })
|
|
48
|
-
}
|
|
49
|
-
)
|
|
50
|
-
},
|
|
51
|
-
message.id
|
|
52
|
-
)),
|
|
53
|
-
isLoading && /* @__PURE__ */ jsx("div", { className: "flex justify-start", children: /* @__PURE__ */ jsx("div", { className: "bg-muted rounded-lg px-4 py-2", children: /* @__PURE__ */ jsx("span", { className: "text-muted-foreground text-sm", children: "Thinking..." }) }) }),
|
|
54
|
-
/* @__PURE__ */ jsx("div", { ref: messagesEndRef })
|
|
55
|
-
] }) }),
|
|
56
|
-
error && /* @__PURE__ */ jsx("div", { className: "px-4 py-2 bg-destructive/10 border-t border-destructive/20", children: /* @__PURE__ */ jsxs("p", { className: "text-destructive text-sm", children: [
|
|
57
|
-
"Error: ",
|
|
58
|
-
error.message
|
|
59
|
-
] }) }),
|
|
60
|
-
/* @__PURE__ */ jsx("div", { className: "border-t border-border p-4", children: /* @__PURE__ */ jsx("form", { onSubmit: handleSubmit, className: "max-w-3xl mx-auto", children: /* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
|
|
61
|
-
/* @__PURE__ */ jsx(
|
|
62
|
-
Input,
|
|
63
|
-
{
|
|
64
|
-
type: "text",
|
|
65
|
-
value: input,
|
|
66
|
-
onChange: (e) => setInput(e.target.value),
|
|
67
|
-
placeholder: "Type your message...",
|
|
68
|
-
disabled: isLoading,
|
|
69
|
-
className: "flex-1"
|
|
70
|
-
}
|
|
71
|
-
),
|
|
72
|
-
/* @__PURE__ */ jsxs(Button, { type: "submit", disabled: isLoading || !input.trim(), children: [
|
|
73
|
-
/* @__PURE__ */ jsx(Send, { className: "h-4 w-4" }),
|
|
74
|
-
/* @__PURE__ */ jsx("span", { className: "sr-only", children: "Send" })
|
|
75
|
-
] })
|
|
76
|
-
] }) }) })
|
|
77
|
-
] });
|
|
78
|
-
}
|
|
79
|
-
export {
|
|
80
|
-
AdminChat
|
|
81
|
-
};
|
|
82
|
-
//# sourceMappingURL=AdminChat.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AdminChat.js","sources":["../../../../../src/modules/admin-base/components/AdminChat.tsx"],"sourcesContent":["import { useChat } from '@ai-sdk/react'\nimport { DefaultChatTransport } from 'ai'\nimport { Send } from 'lucide-react'\nimport type { FormEvent } from 'react'\nimport { useEffect, useMemo, useRef, useState } from 'react'\n\nimport { Button } from '~/ui/button'\nimport { Input } from '~/ui/input'\n\nimport { useAdminConfig } from '../context/AdminConfigContext'\nimport { AdminWelcome } from './AdminWelcome'\n\nexport function AdminChat() {\n const config = useAdminConfig()\n const messagesEndRef = useRef<HTMLDivElement>(null)\n const [input, setInput] = useState('')\n\n // Use DefaultChatTransport which handles UI message stream format (tool calls, etc.)\n const transport = useMemo(\n () => new DefaultChatTransport({ api: config.chatApiUrl }),\n [config.chatApiUrl],\n )\n\n const { messages, sendMessage, status, error } = useChat({\n transport,\n })\n\n const isLoading = status === 'streaming' || status === 'submitted'\n\n // Auto-scroll to bottom when new messages arrive\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' })\n }, [messages])\n\n const handleSubmit = (e: FormEvent) => {\n e.preventDefault()\n if (!input.trim() || isLoading) {\n return\n }\n sendMessage({ text: input })\n setInput('')\n }\n\n // Extract text content from message parts\n const getMessageContent = (message: (typeof messages)[0]): string => {\n return message.parts\n .filter((part) => part.type === 'text')\n .map((part) => part.text)\n .join('')\n }\n\n return (\n <div className=\"flex flex-col flex-1\">\n {/* Messages area */}\n <div className=\"flex-1 overflow-y-auto\">\n {messages.length === 0 ? (\n <AdminWelcome />\n ) : (\n <div className=\"max-w-3xl mx-auto space-y-4 py-4\">\n {messages.map((message) => (\n <div\n key={message.id}\n className={`flex ${\n message.role === 'user' ? 'justify-end' : 'justify-start'\n }`}\n >\n <div\n className={`max-w-[80%] rounded-lg px-4 py-2 ${\n message.role === 'user'\n ? 'bg-primary text-primary-foreground'\n : 'bg-muted text-foreground'\n }`}\n >\n <pre className=\"whitespace-pre-wrap font-sans text-sm\">\n {getMessageContent(message)}\n </pre>\n </div>\n </div>\n ))}\n {isLoading && (\n <div className=\"flex justify-start\">\n <div className=\"bg-muted rounded-lg px-4 py-2\">\n <span className=\"text-muted-foreground text-sm\">\n Thinking...\n </span>\n </div>\n </div>\n )}\n <div ref={messagesEndRef} />\n </div>\n )}\n </div>\n\n {/* Error display */}\n {error && (\n <div className=\"px-4 py-2 bg-destructive/10 border-t border-destructive/20\">\n <p className=\"text-destructive text-sm\">Error: {error.message}</p>\n </div>\n )}\n\n {/* Input area */}\n <div className=\"border-t border-border p-4\">\n <form onSubmit={handleSubmit} className=\"max-w-3xl mx-auto\">\n <div className=\"flex gap-2\">\n <Input\n type=\"text\"\n value={input}\n onChange={(e) => setInput(e.target.value)}\n placeholder=\"Type your message...\"\n disabled={isLoading}\n className=\"flex-1\"\n />\n <Button type=\"submit\" disabled={isLoading || !input.trim()}>\n <Send className=\"h-4 w-4\" />\n <span className=\"sr-only\">Send</span>\n </Button>\n </div>\n </form>\n </div>\n </div>\n )\n}\n"],"names":[],"mappings":";;;;;;;;;AAYO,SAAS,YAAY;AAC1B,QAAM,SAAS,eAAA;AACf,QAAM,iBAAiB,OAAuB,IAAI;AAClD,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,EAAE;AAGrC,QAAM,YAAY;AAAA,IAChB,MAAM,IAAI,qBAAqB,EAAE,KAAK,OAAO,YAAY;AAAA,IACzD,CAAC,OAAO,UAAU;AAAA,EAAA;AAGpB,QAAM,EAAE,UAAU,aAAa,QAAQ,MAAA,IAAU,QAAQ;AAAA,IACvD;AAAA,EAAA,CACD;AAED,QAAM,YAAY,WAAW,eAAe,WAAW;AAGvD,YAAU,MAAM;;AACd,yBAAe,YAAf,mBAAwB,eAAe,EAAE,UAAU;EACrD,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,eAAe,CAAC,MAAiB;AACrC,MAAE,eAAA;AACF,QAAI,CAAC,MAAM,KAAA,KAAU,WAAW;AAC9B;AAAA,IACF;AACA,gBAAY,EAAE,MAAM,OAAO;AAC3B,aAAS,EAAE;AAAA,EACb;AAGA,QAAM,oBAAoB,CAAC,YAA0C;AACnE,WAAO,QAAQ,MACZ,OAAO,CAAC,SAAS,KAAK,SAAS,MAAM,EACrC,IAAI,CAAC,SAAS,KAAK,IAAI,EACvB,KAAK,EAAE;AAAA,EACZ;AAEA,SACE,qBAAC,OAAA,EAAI,WAAU,wBAEb,UAAA;AAAA,IAAA,oBAAC,OAAA,EAAI,WAAU,0BACZ,UAAA,SAAS,WAAW,IACnB,oBAAC,cAAA,CAAA,CAAa,IAEd,qBAAC,OAAA,EAAI,WAAU,oCACZ,UAAA;AAAA,MAAA,SAAS,IAAI,CAAC,YACb;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,WAAW,QACT,QAAQ,SAAS,SAAS,gBAAgB,eAC5C;AAAA,UAEA,UAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAW,oCACT,QAAQ,SAAS,SACb,uCACA,0BACN;AAAA,cAEA,8BAAC,OAAA,EAAI,WAAU,yCACZ,UAAA,kBAAkB,OAAO,EAAA,CAC5B;AAAA,YAAA;AAAA,UAAA;AAAA,QACF;AAAA,QAfK,QAAQ;AAAA,MAAA,CAiBhB;AAAA,MACA,aACC,oBAAC,OAAA,EAAI,WAAU,sBACb,UAAA,oBAAC,OAAA,EAAI,WAAU,iCACb,8BAAC,QAAA,EAAK,WAAU,iCAAgC,UAAA,cAAA,CAEhD,GACF,GACF;AAAA,MAEF,oBAAC,OAAA,EAAI,KAAK,eAAA,CAAgB;AAAA,IAAA,EAAA,CAC5B,EAAA,CAEJ;AAAA,IAGC,6BACE,OAAA,EAAI,WAAU,8DACb,UAAA,qBAAC,KAAA,EAAE,WAAU,4BAA2B,UAAA;AAAA,MAAA;AAAA,MAAQ,MAAM;AAAA,IAAA,EAAA,CAAQ,EAAA,CAChE;AAAA,IAIF,oBAAC,OAAA,EAAI,WAAU,8BACb,UAAA,oBAAC,QAAA,EAAK,UAAU,cAAc,WAAU,qBACtC,UAAA,qBAAC,OAAA,EAAI,WAAU,cACb,UAAA;AAAA,MAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,UACxC,aAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAU;AAAA,QAAA;AAAA,MAAA;AAAA,MAEZ,qBAAC,UAAO,MAAK,UAAS,UAAU,aAAa,CAAC,MAAM,KAAA,GAClD,UAAA;AAAA,QAAA,oBAAC,MAAA,EAAK,WAAU,UAAA,CAAU;AAAA,QAC1B,oBAAC,QAAA,EAAK,WAAU,WAAU,UAAA,OAAA,CAAI;AAAA,MAAA,EAAA,CAChC;AAAA,IAAA,EAAA,CACF,GACF,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;"}
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { Link } from "@tanstack/react-router";
|
|
3
|
-
import { ChevronRight, ChevronLeft, MessageSquare, ImageIcon, LayoutDashboard, CheckSquare } from "lucide-react";
|
|
4
|
-
import { useState } from "react";
|
|
5
|
-
import { cn } from "../../../lib/utils.js";
|
|
6
|
-
import { Button } from "../../../ui/button.js";
|
|
7
|
-
import { Breadcrumbs } from "../../../ui/components/Breadcrumbs.js";
|
|
8
|
-
import { MainLayout } from "../../../ui/layout/MainLayout.js";
|
|
9
|
-
const navItems = [
|
|
10
|
-
{
|
|
11
|
-
name: "Chat",
|
|
12
|
-
path: "/admin/chat",
|
|
13
|
-
icon: MessageSquare
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
name: "Icons",
|
|
17
|
-
path: "/admin/icons",
|
|
18
|
-
icon: ImageIcon
|
|
19
|
-
},
|
|
20
|
-
{
|
|
21
|
-
name: "App For Catalog",
|
|
22
|
-
path: "/admin/app-for-catalog",
|
|
23
|
-
icon: LayoutDashboard
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
name: "Approval Methods",
|
|
27
|
-
path: "/admin/approval-methods",
|
|
28
|
-
icon: CheckSquare
|
|
29
|
-
}
|
|
30
|
-
];
|
|
31
|
-
function AdminLayout({ children }) {
|
|
32
|
-
const [isCollapsed, setIsCollapsed] = useState(false);
|
|
33
|
-
return /* @__PURE__ */ jsx(MainLayout, { breadcrumbs: /* @__PURE__ */ jsx(Breadcrumbs, {}), children: /* @__PURE__ */ jsxs("div", { className: "flex gap-6 -mx-6 -my-6 flex-1", children: [
|
|
34
|
-
/* @__PURE__ */ jsxs(
|
|
35
|
-
"aside",
|
|
36
|
-
{
|
|
37
|
-
className: cn(
|
|
38
|
-
"flex flex-col transition-all duration-300",
|
|
39
|
-
isCollapsed ? "w-16" : "w-64"
|
|
40
|
-
),
|
|
41
|
-
children: [
|
|
42
|
-
/* @__PURE__ */ jsxs("div", { className: "p-4 flex items-center justify-between", children: [
|
|
43
|
-
!isCollapsed && /* @__PURE__ */ jsx("h1", { className: "text-2xl font-bold", children: "Admin" }),
|
|
44
|
-
/* @__PURE__ */ jsx(
|
|
45
|
-
Button,
|
|
46
|
-
{
|
|
47
|
-
variant: "ghost",
|
|
48
|
-
size: "icon",
|
|
49
|
-
onClick: () => setIsCollapsed(!isCollapsed),
|
|
50
|
-
className: cn("h-8 w-8", isCollapsed && "mx-auto"),
|
|
51
|
-
children: isCollapsed ? /* @__PURE__ */ jsx(ChevronRight, { className: "h-4 w-4" }) : /* @__PURE__ */ jsx(ChevronLeft, { className: "h-4 w-4" })
|
|
52
|
-
}
|
|
53
|
-
)
|
|
54
|
-
] }),
|
|
55
|
-
/* @__PURE__ */ jsx("nav", { className: "flex-1 p-4 space-y-2", children: navItems.map((item) => {
|
|
56
|
-
const Icon = item.icon;
|
|
57
|
-
return /* @__PURE__ */ jsx(Link, { to: item.path, className: "block", children: ({ isActive }) => /* @__PURE__ */ jsxs(
|
|
58
|
-
Button,
|
|
59
|
-
{
|
|
60
|
-
variant: "ghost",
|
|
61
|
-
className: cn(
|
|
62
|
-
"w-full",
|
|
63
|
-
isCollapsed ? "justify-center px-2" : "justify-start",
|
|
64
|
-
isActive && "bg-primary text-primary-foreground hover:bg-primary/90"
|
|
65
|
-
),
|
|
66
|
-
title: isCollapsed ? item.name : void 0,
|
|
67
|
-
children: [
|
|
68
|
-
/* @__PURE__ */ jsx(Icon, { className: cn("w-4 h-4", !isCollapsed && "mr-2") }),
|
|
69
|
-
!isCollapsed && /* @__PURE__ */ jsx("span", { children: item.name })
|
|
70
|
-
]
|
|
71
|
-
}
|
|
72
|
-
) }, item.path);
|
|
73
|
-
}) })
|
|
74
|
-
]
|
|
75
|
-
}
|
|
76
|
-
),
|
|
77
|
-
/* @__PURE__ */ jsx("main", { className: "flex-1 flex flex-col overflow-hidden min-w-0", children })
|
|
78
|
-
] }) });
|
|
79
|
-
}
|
|
80
|
-
export {
|
|
81
|
-
AdminLayout
|
|
82
|
-
};
|
|
83
|
-
//# sourceMappingURL=AdminLayout.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AdminLayout.js","sources":["../../../../../src/modules/admin-base/components/AdminLayout.tsx"],"sourcesContent":["import { Link } from '@tanstack/react-router'\nimport {\n CheckSquare,\n ChevronLeft,\n ChevronRight,\n ImageIcon,\n LayoutDashboard,\n MessageSquare,\n} from 'lucide-react'\nimport type { ReactNode } from 'react'\nimport { useState } from 'react'\nimport { cn } from '~/lib/utils'\nimport { Button } from '~/ui/button'\nimport { Breadcrumbs } from '~/ui/components/Breadcrumbs'\nimport { MainLayout } from '~/ui/layout/MainLayout'\n\nexport interface AdminLayoutProps {\n children: ReactNode\n}\n\ninterface NavItem {\n name: string\n path: string\n icon: typeof MessageSquare\n}\n\nconst navItems: Array<NavItem> = [\n {\n name: 'Chat',\n path: '/admin/chat',\n icon: MessageSquare,\n },\n {\n name: 'Icons',\n path: '/admin/icons',\n icon: ImageIcon,\n },\n {\n name: 'App For Catalog',\n path: '/admin/app-for-catalog',\n icon: LayoutDashboard,\n },\n {\n name: 'Approval Methods',\n path: '/admin/approval-methods',\n icon: CheckSquare,\n },\n]\n\nexport function AdminLayout({ children }: AdminLayoutProps) {\n const [isCollapsed, setIsCollapsed] = useState(false)\n\n return (\n <MainLayout breadcrumbs={<Breadcrumbs />}>\n <div className=\"flex gap-6 -mx-6 -my-6 flex-1\">\n {/* Left sidebar */}\n <aside\n className={cn(\n 'flex flex-col transition-all duration-300',\n isCollapsed ? 'w-16' : 'w-64',\n )}\n >\n <div className=\"p-4 flex items-center justify-between\">\n {!isCollapsed && <h1 className=\"text-2xl font-bold\">Admin</h1>}\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => setIsCollapsed(!isCollapsed)}\n className={cn('h-8 w-8', isCollapsed && 'mx-auto')}\n >\n {isCollapsed ? (\n <ChevronRight className=\"h-4 w-4\" />\n ) : (\n <ChevronLeft className=\"h-4 w-4\" />\n )}\n </Button>\n </div>\n <nav className=\"flex-1 p-4 space-y-2\">\n {navItems.map((item) => {\n const Icon = item.icon\n return (\n <Link key={item.path} to={item.path} className=\"block\">\n {({ isActive }: { isActive: boolean }) => (\n <Button\n variant=\"ghost\"\n className={cn(\n 'w-full',\n isCollapsed ? 'justify-center px-2' : 'justify-start',\n isActive &&\n 'bg-primary text-primary-foreground hover:bg-primary/90',\n )}\n title={isCollapsed ? item.name : undefined}\n >\n <Icon className={cn('w-4 h-4', !isCollapsed && 'mr-2')} />\n {!isCollapsed && <span>{item.name}</span>}\n </Button>\n )}\n </Link>\n )\n })}\n </nav>\n </aside>\n\n {/* Main content */}\n <main className=\"flex-1 flex flex-col overflow-hidden min-w-0\">\n {children}\n </main>\n </div>\n </MainLayout>\n )\n}\n"],"names":[],"mappings":";;;;;;;;AA0BA,MAAM,WAA2B;AAAA,EAC/B;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAEV;AAEO,SAAS,YAAY,EAAE,YAA8B;AAC1D,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,KAAK;AAEpD,SACE,oBAAC,cAAW,aAAa,oBAAC,eAAY,GACpC,UAAA,qBAAC,OAAA,EAAI,WAAU,iCAEb,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA,cAAc,SAAS;AAAA,QAAA;AAAA,QAGzB,UAAA;AAAA,UAAA,qBAAC,OAAA,EAAI,WAAU,yCACZ,UAAA;AAAA,YAAA,CAAC,eAAe,oBAAC,MAAA,EAAG,WAAU,sBAAqB,UAAA,SAAK;AAAA,YACzD;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,SAAS,MAAM,eAAe,CAAC,WAAW;AAAA,gBAC1C,WAAW,GAAG,WAAW,eAAe,SAAS;AAAA,gBAEhD,UAAA,kCACE,cAAA,EAAa,WAAU,WAAU,IAElC,oBAAC,aAAA,EAAY,WAAU,UAAA,CAAU;AAAA,cAAA;AAAA,YAAA;AAAA,UAErC,GACF;AAAA,8BACC,OAAA,EAAI,WAAU,wBACZ,UAAA,SAAS,IAAI,CAAC,SAAS;AACtB,kBAAM,OAAO,KAAK;AAClB,mBACE,oBAAC,MAAA,EAAqB,IAAI,KAAK,MAAM,WAAU,SAC5C,UAAA,CAAC,EAAE,SAAA,MACF;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,WAAW;AAAA,kBACT;AAAA,kBACA,cAAc,wBAAwB;AAAA,kBACtC,YACE;AAAA,gBAAA;AAAA,gBAEJ,OAAO,cAAc,KAAK,OAAO;AAAA,gBAEjC,UAAA;AAAA,kBAAA,oBAAC,QAAK,WAAW,GAAG,WAAW,CAAC,eAAe,MAAM,GAAG;AAAA,kBACvD,CAAC,eAAe,oBAAC,QAAA,EAAM,eAAK,KAAA,CAAK;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA,EACpC,GAdO,KAAK,IAgBhB;AAAA,UAEJ,CAAC,EAAA,CACH;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAIF,oBAAC,QAAA,EAAK,WAAU,gDACb,SAAA,CACH;AAAA,EAAA,EAAA,CACF,EAAA,CACF;AAEJ;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function AdminWelcome(): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
-
import { Card, CardHeader, CardTitle, CardDescription, CardContent } from "../../../ui/card.js";
|
|
3
|
-
function AdminWelcome() {
|
|
4
|
-
return /* @__PURE__ */ jsxs("div", { className: "p-6 max-w-2xl mx-auto", children: [
|
|
5
|
-
/* @__PURE__ */ jsx("h1", { className: "text-2xl font-bold mb-4", children: "Admin Assistant" }),
|
|
6
|
-
/* @__PURE__ */ jsx("p", { className: "text-muted-foreground mb-6", children: "Welcome to the AI-powered admin interface. You can use natural language to manage your application." }),
|
|
7
|
-
/* @__PURE__ */ jsxs(Card, { className: "mb-6", children: [
|
|
8
|
-
/* @__PURE__ */ jsxs(CardHeader, { children: [
|
|
9
|
-
/* @__PURE__ */ jsx(CardTitle, { children: "What you can do" }),
|
|
10
|
-
/* @__PURE__ */ jsx(CardDescription, { children: "Try these example commands to get started" })
|
|
11
|
-
] }),
|
|
12
|
-
/* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsxs("ul", { className: "space-y-2 text-sm", children: [
|
|
13
|
-
/* @__PURE__ */ jsxs("li", { className: "flex items-start gap-2", children: [
|
|
14
|
-
/* @__PURE__ */ jsx("span", { className: "text-primary", children: "•" }),
|
|
15
|
-
/* @__PURE__ */ jsx("span", { children: "Show me contents of the Apps table in DB" })
|
|
16
|
-
] }),
|
|
17
|
-
/* @__PURE__ */ jsxs("li", { className: "flex items-start gap-2", children: [
|
|
18
|
-
/* @__PURE__ */ jsx("span", { className: "text-primary", children: "•" }),
|
|
19
|
-
/* @__PURE__ */ jsx("span", { children: 'Add a new app called "Portal" with icon "portal"' })
|
|
20
|
-
] }),
|
|
21
|
-
/* @__PURE__ */ jsxs("li", { className: "flex items-start gap-2", children: [
|
|
22
|
-
/* @__PURE__ */ jsx("span", { className: "text-primary", children: "•" }),
|
|
23
|
-
/* @__PURE__ */ jsx("span", { children: "List all configured data sources" })
|
|
24
|
-
] }),
|
|
25
|
-
/* @__PURE__ */ jsxs("li", { className: "flex items-start gap-2", children: [
|
|
26
|
-
/* @__PURE__ */ jsx("span", { className: "text-primary", children: "•" }),
|
|
27
|
-
/* @__PURE__ */ jsx("span", { children: "Configure a new MCP server" })
|
|
28
|
-
] })
|
|
29
|
-
] }) })
|
|
30
|
-
] }),
|
|
31
|
-
/* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: "Type your request in the chat below to get started." })
|
|
32
|
-
] });
|
|
33
|
-
}
|
|
34
|
-
export {
|
|
35
|
-
AdminWelcome
|
|
36
|
-
};
|
|
37
|
-
//# sourceMappingURL=AdminWelcome.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AdminWelcome.js","sources":["../../../../../src/modules/admin-base/components/AdminWelcome.tsx"],"sourcesContent":["import {\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from '~/ui/card'\n\nexport function AdminWelcome() {\n return (\n <div className=\"p-6 max-w-2xl mx-auto\">\n <h1 className=\"text-2xl font-bold mb-4\">Admin Assistant</h1>\n <p className=\"text-muted-foreground mb-6\">\n Welcome to the AI-powered admin interface. You can use natural language\n to manage your application.\n </p>\n\n <Card className=\"mb-6\">\n <CardHeader>\n <CardTitle>What you can do</CardTitle>\n <CardDescription>\n Try these example commands to get started\n </CardDescription>\n </CardHeader>\n <CardContent>\n <ul className=\"space-y-2 text-sm\">\n <li className=\"flex items-start gap-2\">\n <span className=\"text-primary\">•</span>\n <span>Show me contents of the Apps table in DB</span>\n </li>\n <li className=\"flex items-start gap-2\">\n <span className=\"text-primary\">•</span>\n <span>Add a new app called \"Portal\" with icon \"portal\"</span>\n </li>\n <li className=\"flex items-start gap-2\">\n <span className=\"text-primary\">•</span>\n <span>List all configured data sources</span>\n </li>\n <li className=\"flex items-start gap-2\">\n <span className=\"text-primary\">•</span>\n <span>Configure a new MCP server</span>\n </li>\n </ul>\n </CardContent>\n </Card>\n\n <p className=\"text-sm text-muted-foreground\">\n Type your request in the chat below to get started.\n </p>\n </div>\n )\n}\n"],"names":[],"mappings":";;AAQO,SAAS,eAAe;AAC7B,SACE,qBAAC,OAAA,EAAI,WAAU,yBACb,UAAA;AAAA,IAAA,oBAAC,MAAA,EAAG,WAAU,2BAA0B,UAAA,mBAAe;AAAA,IACvD,oBAAC,KAAA,EAAE,WAAU,8BAA6B,UAAA,uGAG1C;AAAA,IAEA,qBAAC,MAAA,EAAK,WAAU,QACd,UAAA;AAAA,MAAA,qBAAC,YAAA,EACC,UAAA;AAAA,QAAA,oBAAC,aAAU,UAAA,kBAAA,CAAe;AAAA,QAC1B,oBAAC,mBAAgB,UAAA,4CAAA,CAEjB;AAAA,MAAA,GACF;AAAA,MACA,oBAAC,aAAA,EACC,UAAA,qBAAC,MAAA,EAAG,WAAU,qBACZ,UAAA;AAAA,QAAA,qBAAC,MAAA,EAAG,WAAU,0BACZ,UAAA;AAAA,UAAA,oBAAC,QAAA,EAAK,WAAU,gBAAe,UAAA,KAAC;AAAA,UAChC,oBAAC,UAAK,UAAA,2CAAA,CAAwC;AAAA,QAAA,GAChD;AAAA,QACA,qBAAC,MAAA,EAAG,WAAU,0BACZ,UAAA;AAAA,UAAA,oBAAC,QAAA,EAAK,WAAU,gBAAe,UAAA,KAAC;AAAA,UAChC,oBAAC,UAAK,UAAA,mDAAA,CAAgD;AAAA,QAAA,GACxD;AAAA,QACA,qBAAC,MAAA,EAAG,WAAU,0BACZ,UAAA;AAAA,UAAA,oBAAC,QAAA,EAAK,WAAU,gBAAe,UAAA,KAAC;AAAA,UAChC,oBAAC,UAAK,UAAA,mCAAA,CAAgC;AAAA,QAAA,GACxC;AAAA,QACA,qBAAC,MAAA,EAAG,WAAU,0BACZ,UAAA;AAAA,UAAA,oBAAC,QAAA,EAAK,WAAU,gBAAe,UAAA,KAAC;AAAA,UAChC,oBAAC,UAAK,UAAA,6BAAA,CAA0B;AAAA,QAAA,EAAA,CAClC;AAAA,MAAA,EAAA,CACF,EAAA,CACF;AAAA,IAAA,GACF;AAAA,IAEA,oBAAC,KAAA,EAAE,WAAU,iCAAgC,UAAA,sDAAA,CAE7C;AAAA,EAAA,GACF;AAEJ;"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { ReactNode } from 'react';
|
|
2
|
-
import { AdminConfig } from '../types/adminTypes.js';
|
|
3
|
-
export interface AdminConfigProviderProps {
|
|
4
|
-
config?: Partial<AdminConfig>;
|
|
5
|
-
children: ReactNode;
|
|
6
|
-
}
|
|
7
|
-
export declare function AdminConfigProvider({ config, children, }: AdminConfigProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
-
export declare function useAdminConfig(): AdminConfig;
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { jsx } from "react/jsx-runtime";
|
|
2
|
-
import { useMemo, createContext, use } from "react";
|
|
3
|
-
const defaultConfig = {
|
|
4
|
-
chatApiUrl: "/api/admin/chat"
|
|
5
|
-
};
|
|
6
|
-
const AdminConfigContext = createContext(defaultConfig);
|
|
7
|
-
function AdminConfigProvider({
|
|
8
|
-
config,
|
|
9
|
-
children
|
|
10
|
-
}) {
|
|
11
|
-
const mergedConfig = useMemo(
|
|
12
|
-
() => ({
|
|
13
|
-
...defaultConfig,
|
|
14
|
-
...config
|
|
15
|
-
}),
|
|
16
|
-
[config]
|
|
17
|
-
);
|
|
18
|
-
return /* @__PURE__ */ jsx(AdminConfigContext, { value: mergedConfig, children });
|
|
19
|
-
}
|
|
20
|
-
function useAdminConfig() {
|
|
21
|
-
return use(AdminConfigContext);
|
|
22
|
-
}
|
|
23
|
-
export {
|
|
24
|
-
AdminConfigProvider,
|
|
25
|
-
useAdminConfig
|
|
26
|
-
};
|
|
27
|
-
//# sourceMappingURL=AdminConfigContext.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AdminConfigContext.js","sources":["../../../../../src/modules/admin-base/context/AdminConfigContext.tsx"],"sourcesContent":["import type { ReactNode } from 'react'\nimport { createContext, use, useMemo } from 'react'\n\nimport type { AdminConfig } from '../types/adminTypes'\n\nconst defaultConfig: AdminConfig = {\n chatApiUrl: '/api/admin/chat',\n}\n\nconst AdminConfigContext = createContext<AdminConfig>(defaultConfig)\n\nexport interface AdminConfigProviderProps {\n config?: Partial<AdminConfig>\n children: ReactNode\n}\n\nexport function AdminConfigProvider({\n config,\n children,\n}: AdminConfigProviderProps) {\n const mergedConfig: AdminConfig = useMemo(\n () => ({\n ...defaultConfig,\n ...config,\n }),\n [config],\n )\n\n return (\n <AdminConfigContext value={mergedConfig}>{children}</AdminConfigContext>\n )\n}\n\nexport function useAdminConfig(): AdminConfig {\n return use(AdminConfigContext)\n}\n"],"names":[],"mappings":";;AAKA,MAAM,gBAA6B;AAAA,EACjC,YAAY;AACd;AAEA,MAAM,qBAAqB,cAA2B,aAAa;AAO5D,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AACF,GAA6B;AAC3B,QAAM,eAA4B;AAAA,IAChC,OAAO;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,IAAA;AAAA,IAEL,CAAC,MAAM;AAAA,EAAA;AAGT,SACE,oBAAC,oBAAA,EAAmB,OAAO,cAAe,SAAA,CAAS;AAEvD;AAEO,SAAS,iBAA8B;AAC5C,SAAO,IAAI,kBAAkB;AAC/B;"}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
export { AdminChat } from './components/AdminChat.js';
|
|
2
|
-
export { AdminLayout } from './components/AdminLayout.js';
|
|
3
|
-
export { AdminWelcome } from './components/AdminWelcome.js';
|
|
4
|
-
export { AdminConfigProvider, useAdminConfig, type AdminConfigProviderProps } from './context/AdminConfigContext.js';
|
|
5
|
-
export type { AdminChatMessage, AdminConfig } from './types/adminTypes.js';
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function AppCatalogAdminPage(): import("react/jsx-runtime").JSX.Element;
|