@igstack/app-catalog-frontend-core 0.2.0 → 0.3.1-alpha-20260305175850

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