@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.
Files changed (192) hide show
  1. package/dist/esm/api/infra/trpc.d.ts +0 -1491
  2. package/dist/esm/modules/appCatalog/context/AppCatalogContext.js +1 -0
  3. package/dist/esm/modules/appCatalog/context/AppCatalogContext.js.map +1 -1
  4. package/dist/esm/modules/appCatalog/ui/filters/FilterBar.js +23 -11
  5. package/dist/esm/modules/appCatalog/ui/filters/FilterBar.js.map +1 -1
  6. package/dist/esm/modules/appCatalog/ui/grid/AppCatalogGrid.d.ts +5 -1
  7. package/dist/esm/modules/appCatalog/ui/grid/AppCatalogGrid.js +146 -56
  8. package/dist/esm/modules/appCatalog/ui/grid/AppCatalogGrid.js.map +1 -1
  9. package/dist/esm/modules/appCatalog/ui/pages/AppCatalogPage.js +20 -1
  10. package/dist/esm/modules/appCatalog/ui/pages/AppCatalogPage.js.map +1 -1
  11. package/dist/esm/modules/auth/AuthContext.js +1 -1
  12. package/dist/esm/modules/auth/AuthModalContext.js +1 -1
  13. package/dist/esm/modules/auth/authClient.d.ts +2 -2
  14. package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/classic/schemas.js +4 -37
  15. package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/classic/schemas.js.map +1 -1
  16. package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/core/api.js +2 -10
  17. package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/core/api.js.map +1 -1
  18. package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/core/checks.js +1 -1
  19. package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/core/json-schema-processors.js +0 -44
  20. package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/core/json-schema-processors.js.map +1 -1
  21. package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/core/parse.js +0 -4
  22. package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/core/parse.js.map +1 -1
  23. package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/core/regexes.js +0 -2
  24. package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/core/regexes.js.map +1 -1
  25. package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/core/schemas.js +4 -49
  26. package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/core/schemas.js.map +1 -1
  27. package/dist/esm/routeTree.gen.d.ts +3 -164
  28. package/dist/esm/routeTree.gen.js +8 -80
  29. package/dist/esm/routeTree.gen.js.map +1 -1
  30. package/dist/esm/ui/button.d.ts +1 -1
  31. package/dist/esm/ui/card.js +1 -48
  32. package/dist/esm/ui/card.js.map +1 -1
  33. package/dist/esm/ui/command.js +1 -15
  34. package/dist/esm/ui/command.js.map +1 -1
  35. package/dist/esm/ui/components/header/Header.js +2 -11
  36. package/dist/esm/ui/components/header/Header.js.map +1 -1
  37. package/dist/esm/ui/input-group.js +125 -0
  38. package/dist/esm/ui/input-group.js.map +1 -0
  39. package/package.json +3 -3
  40. package/src/modules/appCatalog/ui/components/AppDetailModal.tsx +2 -21
  41. package/src/routeTree.gen.ts +2 -220
  42. package/src/ui/components/header/Header.tsx +2 -12
  43. package/dist/esm/components/IconPickerDialog.d.ts +0 -8
  44. package/dist/esm/components/IconPickerDialog.js +0 -98
  45. package/dist/esm/components/IconPickerDialog.js.map +0 -1
  46. package/dist/esm/components/IconPickerField.d.ts +0 -9
  47. package/dist/esm/components/IconPickerField.js +0 -76
  48. package/dist/esm/components/IconPickerField.js.map +0 -1
  49. package/dist/esm/modules/admin-base/components/AdminChat.d.ts +0 -1
  50. package/dist/esm/modules/admin-base/components/AdminChat.js +0 -82
  51. package/dist/esm/modules/admin-base/components/AdminChat.js.map +0 -1
  52. package/dist/esm/modules/admin-base/components/AdminLayout.d.ts +0 -5
  53. package/dist/esm/modules/admin-base/components/AdminLayout.js +0 -83
  54. package/dist/esm/modules/admin-base/components/AdminLayout.js.map +0 -1
  55. package/dist/esm/modules/admin-base/components/AdminWelcome.d.ts +0 -1
  56. package/dist/esm/modules/admin-base/components/AdminWelcome.js +0 -37
  57. package/dist/esm/modules/admin-base/components/AdminWelcome.js.map +0 -1
  58. package/dist/esm/modules/admin-base/context/AdminConfigContext.d.ts +0 -8
  59. package/dist/esm/modules/admin-base/context/AdminConfigContext.js +0 -27
  60. package/dist/esm/modules/admin-base/context/AdminConfigContext.js.map +0 -1
  61. package/dist/esm/modules/admin-base/index.d.ts +0 -5
  62. package/dist/esm/modules/admin-base/types/adminTypes.d.ts +0 -10
  63. package/dist/esm/modules/appCatalog/AppCatalogAdminPage.d.ts +0 -1
  64. package/dist/esm/modules/appCatalog/AppCatalogAdminPage.js +0 -196
  65. package/dist/esm/modules/appCatalog/AppCatalogAdminPage.js.map +0 -1
  66. package/dist/esm/modules/appCatalog/ScreenshotItem.js +0 -57
  67. package/dist/esm/modules/appCatalog/ScreenshotItem.js.map +0 -1
  68. package/dist/esm/modules/appCatalog/ScreenshotManager.js +0 -155
  69. package/dist/esm/modules/appCatalog/ScreenshotManager.js.map +0 -1
  70. package/dist/esm/modules/approvalMethod/AccessRequestFormFields.d.ts +0 -7
  71. package/dist/esm/modules/approvalMethod/AccessRequestFormFields.js +0 -323
  72. package/dist/esm/modules/approvalMethod/AccessRequestFormFields.js.map +0 -1
  73. package/dist/esm/modules/approvalMethod/ApprovalMethodForm.d.ts +0 -14
  74. package/dist/esm/modules/approvalMethod/ApprovalMethodForm.js +0 -227
  75. package/dist/esm/modules/approvalMethod/ApprovalMethodForm.js.map +0 -1
  76. package/dist/esm/modules/approvalMethod/ApprovalMethodSelector.d.ts +0 -7
  77. package/dist/esm/modules/approvalMethod/ApprovalMethodSelector.js +0 -124
  78. package/dist/esm/modules/approvalMethod/ApprovalMethodSelector.js.map +0 -1
  79. package/dist/esm/modules/approvalMethod/api/ApiQueryMagazineApprovalMethod.d.ts +0 -381
  80. package/dist/esm/modules/approvalMethod/api/ApiQueryMagazineApprovalMethod.js +0 -26
  81. package/dist/esm/modules/approvalMethod/api/ApiQueryMagazineApprovalMethod.js.map +0 -1
  82. package/dist/esm/modules/auth/authUtils.js +0 -25
  83. package/dist/esm/modules/auth/authUtils.js.map +0 -1
  84. package/dist/esm/modules/icons/IconManagementPage.d.ts +0 -1
  85. package/dist/esm/modules/icons/IconManagementPage.js +0 -177
  86. package/dist/esm/modules/icons/IconManagementPage.js.map +0 -1
  87. 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
  88. 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
  89. 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
  90. 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
  91. 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
  92. 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
  93. 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
  94. 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
  95. 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
  96. 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
  97. 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
  98. 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
  99. 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
  100. 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
  101. package/dist/esm/routes/admin/app-for-catalog/$id.d.ts +0 -5
  102. package/dist/esm/routes/admin/app-for-catalog/_id.js +0 -67
  103. package/dist/esm/routes/admin/app-for-catalog/_id.js.map +0 -1
  104. package/dist/esm/routes/admin/app-for-catalog/_id2.js +0 -321
  105. package/dist/esm/routes/admin/app-for-catalog/_id2.js.map +0 -1
  106. package/dist/esm/routes/admin/app-for-catalog/index.d.ts +0 -1
  107. package/dist/esm/routes/admin/app-for-catalog/index.js +0 -9
  108. package/dist/esm/routes/admin/app-for-catalog/index.js.map +0 -1
  109. package/dist/esm/routes/admin/app-for-catalog/index2.js +0 -12
  110. package/dist/esm/routes/admin/app-for-catalog/index2.js.map +0 -1
  111. package/dist/esm/routes/admin/app-for-catalog.d.ts +0 -1
  112. package/dist/esm/routes/admin/app-for-catalog.js +0 -14
  113. package/dist/esm/routes/admin/app-for-catalog.js.map +0 -1
  114. package/dist/esm/routes/admin/app-for-catalog2.js +0 -9
  115. package/dist/esm/routes/admin/app-for-catalog2.js.map +0 -1
  116. package/dist/esm/routes/admin/approval-methods/index.d.ts +0 -32
  117. package/dist/esm/routes/admin/approval-methods/index.js +0 -24
  118. package/dist/esm/routes/admin/approval-methods/index.js.map +0 -1
  119. package/dist/esm/routes/admin/approval-methods/index2.js +0 -100
  120. package/dist/esm/routes/admin/approval-methods/index2.js.map +0 -1
  121. package/dist/esm/routes/admin/approval-methods.d.ts +0 -1
  122. package/dist/esm/routes/admin/approval-methods.js +0 -14
  123. package/dist/esm/routes/admin/approval-methods.js.map +0 -1
  124. package/dist/esm/routes/admin/approval-methods2.js +0 -7
  125. package/dist/esm/routes/admin/approval-methods2.js.map +0 -1
  126. package/dist/esm/routes/admin/chat.d.ts +0 -1
  127. package/dist/esm/routes/admin/chat.js +0 -14
  128. package/dist/esm/routes/admin/chat.js.map +0 -1
  129. package/dist/esm/routes/admin/chat2.js +0 -9
  130. package/dist/esm/routes/admin/chat2.js.map +0 -1
  131. package/dist/esm/routes/admin/icons.d.ts +0 -1
  132. package/dist/esm/routes/admin/icons.js +0 -14
  133. package/dist/esm/routes/admin/icons.js.map +0 -1
  134. package/dist/esm/routes/admin/icons2.js +0 -12
  135. package/dist/esm/routes/admin/icons2.js.map +0 -1
  136. package/dist/esm/routes/admin/index.d.ts +0 -1
  137. package/dist/esm/routes/admin/index.js +0 -9
  138. package/dist/esm/routes/admin/index.js.map +0 -1
  139. package/dist/esm/routes/admin/index2.js +0 -9
  140. package/dist/esm/routes/admin/index2.js.map +0 -1
  141. package/dist/esm/routes/admin.d.ts +0 -1
  142. package/dist/esm/routes/admin.js +0 -37
  143. package/dist/esm/routes/admin.js.map +0 -1
  144. package/dist/esm/routes/admin2.js +0 -18
  145. package/dist/esm/routes/admin2.js.map +0 -1
  146. package/dist/esm/ui/alert-dialog.js +0 -141
  147. package/dist/esm/ui/alert-dialog.js.map +0 -1
  148. package/dist/esm/ui/breadcrumb.js +0 -84
  149. package/dist/esm/ui/breadcrumb.js.map +0 -1
  150. package/dist/esm/ui/components/Breadcrumbs.js +0 -36
  151. package/dist/esm/ui/components/Breadcrumbs.js.map +0 -1
  152. package/dist/esm/ui/crud-list/CrudList.js +0 -189
  153. package/dist/esm/ui/crud-list/CrudList.js.map +0 -1
  154. package/dist/esm/ui/editable-list/EditableListField.js +0 -130
  155. package/dist/esm/ui/editable-list/EditableListField.js.map +0 -1
  156. package/dist/esm/ui/form.js +0 -134
  157. package/dist/esm/ui/form.js.map +0 -1
  158. package/dist/esm/ui/linkExternal.js +0 -26
  159. package/dist/esm/ui/linkExternal.js.map +0 -1
  160. package/dist/esm/ui/markdown-editor/MarkdownEditor.js +0 -116
  161. package/dist/esm/ui/markdown-editor/MarkdownEditor.js.map +0 -1
  162. package/dist/esm/ui/markdown-editor/MarkdownToolbar.js +0 -99
  163. package/dist/esm/ui/markdown-editor/MarkdownToolbar.js.map +0 -1
  164. package/dist/esm/ui/scroll-area.js +0 -62
  165. package/dist/esm/ui/scroll-area.js.map +0 -1
  166. package/dist/esm/ui/select.js +0 -138
  167. package/dist/esm/ui/select.js.map +0 -1
  168. package/dist/esm/ui/textarea.js +0 -19
  169. package/dist/esm/ui/textarea.js.map +0 -1
  170. package/src/components/IconPickerDialog.tsx +0 -136
  171. package/src/components/IconPickerField.tsx +0 -88
  172. package/src/modules/admin-base/components/AdminChat.tsx +0 -122
  173. package/src/modules/admin-base/components/AdminLayout.tsx +0 -111
  174. package/src/modules/admin-base/components/AdminWelcome.tsx +0 -52
  175. package/src/modules/admin-base/context/AdminConfigContext.tsx +0 -36
  176. package/src/modules/admin-base/index.ts +0 -16
  177. package/src/modules/admin-base/types/adminTypes.ts +0 -11
  178. package/src/modules/appCatalog/AppCatalogAdminPage.tsx +0 -274
  179. package/src/modules/approvalMethod/AccessRequestFormFields.tsx +0 -393
  180. package/src/modules/approvalMethod/ApprovalMethodForm.tsx +0 -323
  181. package/src/modules/approvalMethod/ApprovalMethodSelector.tsx +0 -150
  182. package/src/modules/approvalMethod/api/ApiQueryMagazineApprovalMethod.ts +0 -34
  183. package/src/modules/icons/IconManagementPage.tsx +0 -245
  184. package/src/routes/admin/app-for-catalog/$id.tsx +0 -571
  185. package/src/routes/admin/app-for-catalog/index.tsx +0 -19
  186. package/src/routes/admin/app-for-catalog.tsx +0 -12
  187. package/src/routes/admin/approval-methods/index.tsx +0 -161
  188. package/src/routes/admin/approval-methods.tsx +0 -10
  189. package/src/routes/admin/chat.tsx +0 -13
  190. package/src/routes/admin/icons.tsx +0 -22
  191. package/src/routes/admin/index.tsx +0 -9
  192. package/src/routes/admin.tsx +0 -60
@@ -1,5 +1,5 @@
1
- import { Link, useNavigate } from '@tanstack/react-router'
2
- import { LogOut, Settings } from 'lucide-react'
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,5 +0,0 @@
1
- import { ReactNode } from 'react';
2
- export interface AdminLayoutProps {
3
- children: ReactNode;
4
- }
5
- export declare function AdminLayout({ children }: AdminLayoutProps): import("react/jsx-runtime").JSX.Element;
@@ -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,10 +0,0 @@
1
- export interface AdminConfig {
2
- /** API endpoint for chat - defaults to /api/admin/chat */
3
- chatApiUrl?: string;
4
- }
5
- export interface AdminChatMessage {
6
- id: string;
7
- role: 'user' | 'assistant';
8
- content: string;
9
- createdAt?: Date;
10
- }
@@ -1 +0,0 @@
1
- export declare function AppCatalogAdminPage(): import("react/jsx-runtime").JSX.Element;