@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,36 +0,0 @@
1
- import { jsx, jsxs } from "react/jsx-runtime";
2
- import { useMatches, Link } from "@tanstack/react-router";
3
- import { ChevronRight, Home } from "lucide-react";
4
- import * as React from "react";
5
- import { Breadcrumb, BreadcrumbList, BreadcrumbSeparator, BreadcrumbItem, BreadcrumbPage, BreadcrumbLink } from "../breadcrumb.js";
6
- function Breadcrumbs() {
7
- var _a;
8
- const matches = useMatches();
9
- const breadcrumbs = [];
10
- breadcrumbs.push({ title: "Home", href: "/" });
11
- for (const match of matches) {
12
- const staticData = match.staticData;
13
- if (staticData == null ? void 0 : staticData.breadcrumb) {
14
- const loaderData = match.loaderData;
15
- const dynamicTitle = (_a = loaderData == null ? void 0 : loaderData.app) == null ? void 0 : _a.displayName;
16
- breadcrumbs.push({
17
- title: dynamicTitle || staticData.breadcrumb.title,
18
- href: staticData.breadcrumb.href ?? match.pathname
19
- });
20
- }
21
- }
22
- if (breadcrumbs.length <= 1) {
23
- return null;
24
- }
25
- return /* @__PURE__ */ jsx(Breadcrumb, { className: "pb-4", children: /* @__PURE__ */ jsx(BreadcrumbList, { children: breadcrumbs.map((crumb, index) => {
26
- const isLast = index === breadcrumbs.length - 1;
27
- return /* @__PURE__ */ jsxs(React.Fragment, { children: [
28
- index > 0 && /* @__PURE__ */ jsx(BreadcrumbSeparator, { children: /* @__PURE__ */ jsx(ChevronRight, { className: "h-4 w-4" }) }),
29
- /* @__PURE__ */ jsx(BreadcrumbItem, { children: isLast ? /* @__PURE__ */ jsx(BreadcrumbPage, { children: crumb.title }) : crumb.href ? /* @__PURE__ */ jsx(BreadcrumbLink, { asChild: true, children: /* @__PURE__ */ jsx(Link, { to: crumb.href, className: "text-primary font-medium hover:text-foreground transition-colors", children: index === 0 ? /* @__PURE__ */ jsx(Home, { className: "h-4 w-4" }) : crumb.title }) }) : /* @__PURE__ */ jsx(BreadcrumbPage, { children: crumb.title }) })
30
- ] }, crumb.href ?? crumb.title);
31
- }) }) });
32
- }
33
- export {
34
- Breadcrumbs
35
- };
36
- //# sourceMappingURL=Breadcrumbs.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Breadcrumbs.js","sources":["../../../../src/ui/components/Breadcrumbs.tsx"],"sourcesContent":["import { Link, useMatches } from '@tanstack/react-router'\nimport { ChevronRight, Home } from 'lucide-react'\nimport * as React from 'react'\nimport {\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from '~/ui/breadcrumb'\n\nexport interface BreadcrumbMeta {\n title: string\n href?: string\n}\n\n/**\n * Universal breadcrumb component that reads from route staticData\n * Routes can define breadcrumbs via the `staticData` property:\n * \n * @example\n * ```tsx\n * export const Route = createFileRoute('/admin/chat')({\n * component: ChatPage,\n * staticData: {\n * breadcrumb: { title: 'Chat' }\n * }\n * })\n * ```\n */\nexport function Breadcrumbs() {\n const matches = useMatches()\n\n // Build breadcrumb trail from route matches\n const breadcrumbs: Array<{ title: string; href?: string }> = []\n\n // Always add home\n breadcrumbs.push({ title: 'Home', href: '/' })\n\n // Process each route match\n for (const match of matches) {\n const staticData = match.staticData as { breadcrumb?: BreadcrumbMeta } | undefined\n if (staticData?.breadcrumb) {\n // Check if this match has loaderData with app info for dynamic title\n const loaderData = match.loaderData as { app?: { displayName: string } | null } | undefined\n const dynamicTitle = loaderData?.app?.displayName\n \n breadcrumbs.push({\n title: dynamicTitle || staticData.breadcrumb.title,\n href: staticData.breadcrumb.href ?? match.pathname,\n })\n }\n }\n\n // Don't show breadcrumbs if only home\n if (breadcrumbs.length <= 1) {\n return null\n }\n\n return (\n <Breadcrumb className=\"pb-4\">\n <BreadcrumbList>\n {breadcrumbs.map((crumb, index) => {\n const isLast = index === breadcrumbs.length - 1\n\n return (\n <React.Fragment key={crumb.href ?? crumb.title}>\n {index > 0 && (\n <BreadcrumbSeparator>\n <ChevronRight className=\"h-4 w-4\" />\n </BreadcrumbSeparator>\n )}\n <BreadcrumbItem>\n {isLast ? (\n <BreadcrumbPage>{crumb.title}</BreadcrumbPage>\n ) : crumb.href ? (\n <BreadcrumbLink asChild>\n <Link to={crumb.href} className=\"text-primary font-medium hover:text-foreground transition-colors\">\n {index === 0 ? (\n <Home className=\"h-4 w-4\" />\n ) : (\n crumb.title\n )}\n </Link>\n </BreadcrumbLink>\n ) : (\n <BreadcrumbPage>{crumb.title}</BreadcrumbPage>\n )}\n </BreadcrumbItem>\n </React.Fragment>\n )\n })}\n </BreadcrumbList>\n </Breadcrumb>\n )\n}\n"],"names":[],"mappings":";;;;;AA+BO,SAAS,cAAc;;AAC5B,QAAM,UAAU,WAAA;AAGhB,QAAM,cAAuD,CAAA;AAG7D,cAAY,KAAK,EAAE,OAAO,QAAQ,MAAM,KAAK;AAG7C,aAAW,SAAS,SAAS;AAC3B,UAAM,aAAa,MAAM;AACzB,QAAI,yCAAY,YAAY;AAExB,YAAM,aAAa,MAAM;AACzB,YAAM,gBAAe,8CAAY,QAAZ,mBAAiB;AAExC,kBAAY,KAAK;AAAA,QACb,OAAO,gBAAgB,WAAW,WAAW;AAAA,QAC/C,MAAM,WAAW,WAAW,QAAQ,MAAM;AAAA,MAAA,CAC3C;AAAA,IACH;AAAA,EACF;AAGA,MAAI,YAAY,UAAU,GAAG;AAC3B,WAAO;AAAA,EACT;AAEA,SACE,oBAAC,YAAA,EAAW,WAAU,QACpB,UAAA,oBAAC,kBACE,UAAA,YAAY,IAAI,CAAC,OAAO,UAAU;AACjC,UAAM,SAAS,UAAU,YAAY,SAAS;AAE9C,WACE,qBAAC,MAAM,UAAN,EACE,UAAA;AAAA,MAAA,QAAQ,KACP,oBAAC,qBAAA,EACC,8BAAC,cAAA,EAAa,WAAU,WAAU,EAAA,CACpC;AAAA,0BAED,gBAAA,EACE,UAAA,SACC,oBAAC,gBAAA,EAAgB,gBAAM,MAAA,CAAM,IAC3B,MAAM,2BACP,gBAAA,EAAe,SAAO,MACrB,UAAA,oBAAC,QAAK,IAAI,MAAM,MAAM,WAAU,oEAC7B,UAAA,UAAU,IACT,oBAAC,MAAA,EAAK,WAAU,UAAA,CAAU,IAE1B,MAAM,MAAA,CAEV,GACF,IAEA,oBAAC,gBAAA,EAAgB,UAAA,MAAM,OAAM,EAAA,CAEjC;AAAA,IAAA,EAAA,GAtBmB,MAAM,QAAQ,MAAM,KAuBzC;AAAA,EAEJ,CAAC,GACH,GACF;AAEJ;"}
@@ -1,189 +0,0 @@
1
- import { jsxs, jsx } from "react/jsx-runtime";
2
- import { useState, useCallback } from "react";
3
- import { useReactTable, getCoreRowModel, flexRender } from "@tanstack/react-table";
4
- import { Pencil, Trash2, Plus } from "lucide-react";
5
- import { Button } from "../button.js";
6
- import { Table, TableHeader, TableRow, TableHead, TableBody, TableCell } from "../table.js";
7
- import { Dialog, DialogContent, DialogHeader, DialogTitle } from "../dialog.js";
8
- import { AlertDialog, AlertDialogContent, AlertDialogHeader, AlertDialogTitle, AlertDialogDescription, AlertDialogFooter, AlertDialogCancel, AlertDialogAction } from "../alert-dialog.js";
9
- import { Skeleton } from "../skeleton.js";
10
- function CrudList({
11
- data,
12
- isLoading = false,
13
- columns,
14
- getRowId,
15
- renderForm,
16
- onCreate,
17
- onUpdate,
18
- onDelete,
19
- title,
20
- createButtonLabel = "Add",
21
- emptyMessage = "No items found",
22
- canCreate = true,
23
- canEdit = true,
24
- canDelete = true
25
- }) {
26
- const [dialogState, setDialogState] = useState({
27
- open: false
28
- });
29
- const [deleteItem, setDeleteItem] = useState(null);
30
- const [isPending, setIsPending] = useState(false);
31
- const columnsWithActions = [
32
- ...columns,
33
- {
34
- id: "actions",
35
- header: "",
36
- cell: ({ row }) => {
37
- const item = row.original;
38
- const showEdit = typeof canEdit === "function" ? canEdit(item) : canEdit;
39
- const showDelete = typeof canDelete === "function" ? canDelete(item) : canDelete;
40
- return /* @__PURE__ */ jsxs("div", { className: "flex justify-end gap-1", children: [
41
- showEdit && /* @__PURE__ */ jsx(
42
- Button,
43
- {
44
- variant: "ghost",
45
- size: "sm",
46
- onClick: () => setDialogState({ open: true, mode: "edit", item }),
47
- children: /* @__PURE__ */ jsx(Pencil, { className: "h-4 w-4" })
48
- }
49
- ),
50
- showDelete && /* @__PURE__ */ jsx(
51
- Button,
52
- {
53
- variant: "ghost",
54
- size: "sm",
55
- onClick: () => setDeleteItem(item),
56
- children: /* @__PURE__ */ jsx(Trash2, { className: "h-4 w-4 text-destructive" })
57
- }
58
- )
59
- ] });
60
- },
61
- size: 80
62
- }
63
- ];
64
- const table = useReactTable({
65
- data,
66
- columns: columnsWithActions,
67
- getCoreRowModel: getCoreRowModel(),
68
- getRowId
69
- });
70
- const handleSubmit = useCallback(
71
- async (formData) => {
72
- if (!dialogState.open) return;
73
- setIsPending(true);
74
- try {
75
- if (dialogState.mode === "create") {
76
- await onCreate(formData);
77
- } else {
78
- await onUpdate(formData);
79
- }
80
- setDialogState({ open: false });
81
- } finally {
82
- setIsPending(false);
83
- }
84
- },
85
- [dialogState, onCreate, onUpdate]
86
- );
87
- const handleDelete = useCallback(async () => {
88
- if (!deleteItem) return;
89
- setIsPending(true);
90
- try {
91
- await onDelete(deleteItem);
92
- setDeleteItem(null);
93
- } finally {
94
- setIsPending(false);
95
- }
96
- }, [deleteItem, onDelete]);
97
- return /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
98
- /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
99
- title && /* @__PURE__ */ jsx("h3", { className: "text-lg font-medium", children: title }),
100
- canCreate && /* @__PURE__ */ jsxs(
101
- Button,
102
- {
103
- onClick: () => setDialogState({ open: true, mode: "create", item: null }),
104
- size: "sm",
105
- children: [
106
- /* @__PURE__ */ jsx(Plus, { className: "h-4 w-4 mr-1" }),
107
- createButtonLabel
108
- ]
109
- }
110
- )
111
- ] }),
112
- /* @__PURE__ */ jsx("div", { className: "border rounded-md", children: /* @__PURE__ */ jsxs(Table, { children: [
113
- /* @__PURE__ */ jsx(TableHeader, { children: table.getHeaderGroups().map((headerGroup) => /* @__PURE__ */ jsx(TableRow, { children: headerGroup.headers.map((header) => /* @__PURE__ */ jsx(TableHead, { children: header.isPlaceholder ? null : flexRender(
114
- header.column.columnDef.header,
115
- header.getContext()
116
- ) }, header.id)) }, headerGroup.id)) }),
117
- /* @__PURE__ */ jsx(TableBody, { children: isLoading ? Array.from({ length: 3 }).map((_item, i) => /* @__PURE__ */ jsxs(TableRow, { children: [
118
- columns.map((_col, j) => /* @__PURE__ */ jsx(TableCell, { children: /* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-full" }) }, j)),
119
- /* @__PURE__ */ jsx(TableCell, { children: /* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-16" }) })
120
- ] }, i)) : table.getRowModel().rows.length === 0 ? /* @__PURE__ */ jsx(TableRow, { children: /* @__PURE__ */ jsx(
121
- TableCell,
122
- {
123
- colSpan: columnsWithActions.length,
124
- className: "text-center text-muted-foreground py-8",
125
- children: emptyMessage
126
- }
127
- ) }) : table.getRowModel().rows.map((row) => /* @__PURE__ */ jsx(
128
- TableRow,
129
- {
130
- className: "cursor-pointer hover:bg-muted/50",
131
- onClick: (e) => {
132
- if (e.target.closest("button")) return;
133
- const showEdit = typeof canEdit === "function" ? canEdit(row.original) : canEdit;
134
- if (showEdit) {
135
- setDialogState({
136
- open: true,
137
- mode: "edit",
138
- item: row.original
139
- });
140
- }
141
- },
142
- children: row.getVisibleCells().map((cell) => /* @__PURE__ */ jsx(TableCell, { children: flexRender(
143
- cell.column.columnDef.cell,
144
- cell.getContext()
145
- ) }, cell.id))
146
- },
147
- row.id
148
- )) })
149
- ] }) }),
150
- /* @__PURE__ */ jsx(
151
- Dialog,
152
- {
153
- open: dialogState.open,
154
- onOpenChange: (open) => !open && setDialogState({ open: false }),
155
- children: /* @__PURE__ */ jsxs(DialogContent, { children: [
156
- /* @__PURE__ */ jsx(DialogHeader, { children: /* @__PURE__ */ jsx(DialogTitle, { children: dialogState.open && dialogState.mode === "create" ? "Create" : "Edit" }) }),
157
- dialogState.open && renderForm({
158
- mode: dialogState.mode,
159
- item: dialogState.mode === "edit" ? dialogState.item : null,
160
- onSubmit: handleSubmit,
161
- onCancel: () => setDialogState({ open: false }),
162
- isPending
163
- })
164
- ] })
165
- }
166
- ),
167
- /* @__PURE__ */ jsx(
168
- AlertDialog,
169
- {
170
- open: !!deleteItem,
171
- onOpenChange: (open) => !open && setDeleteItem(null),
172
- children: /* @__PURE__ */ jsxs(AlertDialogContent, { children: [
173
- /* @__PURE__ */ jsxs(AlertDialogHeader, { children: [
174
- /* @__PURE__ */ jsx(AlertDialogTitle, { children: "Delete Item" }),
175
- /* @__PURE__ */ jsx(AlertDialogDescription, { children: "Are you sure you want to delete this item? This action cannot be undone." })
176
- ] }),
177
- /* @__PURE__ */ jsxs(AlertDialogFooter, { children: [
178
- /* @__PURE__ */ jsx(AlertDialogCancel, { children: "Cancel" }),
179
- /* @__PURE__ */ jsx(AlertDialogAction, { onClick: handleDelete, disabled: isPending, children: isPending ? "Deleting..." : "Delete" })
180
- ] })
181
- ] })
182
- }
183
- )
184
- ] });
185
- }
186
- export {
187
- CrudList
188
- };
189
- //# sourceMappingURL=CrudList.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CrudList.js","sources":["../../../../src/ui/crud-list/CrudList.tsx"],"sourcesContent":["import { useCallback, useState } from 'react'\nimport {\n flexRender,\n getCoreRowModel,\n useReactTable,\n} from '@tanstack/react-table'\nimport { Pencil, Plus, Trash2 } from 'lucide-react'\nimport { Button } from '~/ui/button'\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '~/ui/table'\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '~/ui/dialog'\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from '~/ui/alert-dialog'\nimport { Skeleton } from '~/ui/skeleton'\nimport type { CrudDialogState, CrudListProps } from './types'\n\nexport function CrudList<TData, TCreateInput, TUpdateInput>({\n data,\n isLoading = false,\n columns,\n getRowId,\n renderForm,\n onCreate,\n onUpdate,\n onDelete,\n title,\n createButtonLabel = 'Add',\n emptyMessage = 'No items found',\n canCreate = true,\n canEdit = true,\n canDelete = true,\n}: CrudListProps<TData, TCreateInput, TUpdateInput>) {\n const [dialogState, setDialogState] = useState<CrudDialogState<TData>>({\n open: false,\n })\n const [deleteItem, setDeleteItem] = useState<TData | null>(null)\n const [isPending, setIsPending] = useState(false)\n\n // Add action column\n const columnsWithActions = [\n ...columns,\n {\n id: 'actions',\n header: '',\n cell: ({ row }: { row: { original: TData } }) => {\n const item = row.original\n const showEdit = typeof canEdit === 'function' ? canEdit(item) : canEdit\n const showDelete =\n typeof canDelete === 'function' ? canDelete(item) : canDelete\n\n return (\n <div className=\"flex justify-end gap-1\">\n {showEdit && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() =>\n setDialogState({ open: true, mode: 'edit', item })\n }\n >\n <Pencil className=\"h-4 w-4\" />\n </Button>\n )}\n {showDelete && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setDeleteItem(item)}\n >\n <Trash2 className=\"h-4 w-4 text-destructive\" />\n </Button>\n )}\n </div>\n )\n },\n size: 80,\n },\n ]\n\n const table = useReactTable({\n data,\n columns: columnsWithActions,\n getCoreRowModel: getCoreRowModel(),\n getRowId,\n })\n\n const handleSubmit = useCallback(\n async (formData: TCreateInput | TUpdateInput) => {\n if (!dialogState.open) return\n\n setIsPending(true)\n try {\n if (dialogState.mode === 'create') {\n await onCreate(formData as TCreateInput)\n } else {\n await onUpdate(formData as TUpdateInput)\n }\n setDialogState({ open: false })\n } finally {\n setIsPending(false)\n }\n },\n [dialogState, onCreate, onUpdate],\n )\n\n const handleDelete = useCallback(async () => {\n if (!deleteItem) return\n setIsPending(true)\n try {\n await onDelete(deleteItem)\n setDeleteItem(null)\n } finally {\n setIsPending(false)\n }\n }, [deleteItem, onDelete])\n\n return (\n <div className=\"space-y-4\">\n {/* Header */}\n <div className=\"flex items-center justify-between\">\n {title && <h3 className=\"text-lg font-medium\">{title}</h3>}\n {canCreate && (\n <Button\n onClick={() =>\n setDialogState({ open: true, mode: 'create', item: null })\n }\n size=\"sm\"\n >\n <Plus className=\"h-4 w-4 mr-1\" />\n {createButtonLabel}\n </Button>\n )}\n </div>\n\n {/* Table */}\n <div className=\"border rounded-md\">\n <Table>\n <TableHeader>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow key={headerGroup.id}>\n {headerGroup.headers.map((header) => (\n <TableHead key={header.id}>\n {header.isPlaceholder\n ? null\n : flexRender(\n header.column.columnDef.header,\n header.getContext(),\n )}\n </TableHead>\n ))}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody>\n {isLoading ? (\n Array.from({ length: 3 }).map((_item, i) => (\n <TableRow key={i}>\n {columns.map((_col, j) => (\n <TableCell key={j}>\n <Skeleton className=\"h-4 w-full\" />\n </TableCell>\n ))}\n <TableCell>\n <Skeleton className=\"h-4 w-16\" />\n </TableCell>\n </TableRow>\n ))\n ) : table.getRowModel().rows.length === 0 ? (\n <TableRow>\n <TableCell\n colSpan={columnsWithActions.length}\n className=\"text-center text-muted-foreground py-8\"\n >\n {emptyMessage}\n </TableCell>\n </TableRow>\n ) : (\n table.getRowModel().rows.map((row) => (\n <TableRow\n key={row.id}\n className=\"cursor-pointer hover:bg-muted/50\"\n onClick={(e) => {\n // Don't open if clicking on action buttons\n if ((e.target as HTMLElement).closest('button')) return\n const showEdit =\n typeof canEdit === 'function'\n ? canEdit(row.original)\n : canEdit\n if (showEdit) {\n setDialogState({\n open: true,\n mode: 'edit',\n item: row.original,\n })\n }\n }}\n >\n {row.getVisibleCells().map((cell) => (\n <TableCell key={cell.id}>\n {flexRender(\n cell.column.columnDef.cell,\n cell.getContext(),\n )}\n </TableCell>\n ))}\n </TableRow>\n ))\n )}\n </TableBody>\n </Table>\n </div>\n\n {/* Create/Edit Dialog */}\n <Dialog\n open={dialogState.open}\n onOpenChange={(open) => !open && setDialogState({ open: false })}\n >\n <DialogContent>\n <DialogHeader>\n <DialogTitle>\n {dialogState.open && dialogState.mode === 'create'\n ? 'Create'\n : 'Edit'}\n </DialogTitle>\n </DialogHeader>\n {dialogState.open &&\n renderForm({\n mode: dialogState.mode,\n item: dialogState.mode === 'edit' ? dialogState.item : null,\n onSubmit: handleSubmit,\n onCancel: () => setDialogState({ open: false }),\n isPending,\n })}\n </DialogContent>\n </Dialog>\n\n {/* Delete Confirmation */}\n <AlertDialog\n open={!!deleteItem}\n onOpenChange={(open) => !open && setDeleteItem(null)}\n >\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Delete Item</AlertDialogTitle>\n <AlertDialogDescription>\n Are you sure you want to delete this item? This action cannot be\n undone.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancel</AlertDialogCancel>\n <AlertDialogAction onClick={handleDelete} disabled={isPending}>\n {isPending ? 'Deleting...' : 'Delete'}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </div>\n )\n}\n"],"names":[],"mappings":"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"}
@@ -1,130 +0,0 @@
1
- import { jsxs, jsx } from "react/jsx-runtime";
2
- import { useState, useCallback } from "react";
3
- import { useReactTable, getCoreRowModel, flexRender } from "@tanstack/react-table";
4
- import { Pencil, Trash2, Plus } from "lucide-react";
5
- import { Button } from "../button.js";
6
- import { Table, TableHeader, TableRow, TableHead, TableBody, TableCell } from "../table.js";
7
- import { Dialog, DialogContent, DialogHeader, DialogTitle } from "../dialog.js";
8
- import { Label } from "../label.js";
9
- function EditableListField({
10
- value,
11
- onChange,
12
- columns,
13
- renderForm,
14
- createEmpty,
15
- getItemKey,
16
- label,
17
- addButtonLabel = "Add",
18
- emptyMessage = "No items",
19
- disabled = false
20
- }) {
21
- const [dialogState, setDialogState] = useState({
22
- open: false
23
- });
24
- const columnsWithActions = [
25
- ...columns,
26
- {
27
- id: "actions",
28
- header: "",
29
- cell: ({ row }) => /* @__PURE__ */ jsxs("div", { className: "flex justify-end gap-1", children: [
30
- /* @__PURE__ */ jsx(
31
- Button,
32
- {
33
- type: "button",
34
- variant: "ghost",
35
- size: "sm",
36
- onClick: () => setDialogState({
37
- open: true,
38
- mode: "edit",
39
- index: row.index,
40
- item: row.original
41
- }),
42
- disabled,
43
- children: /* @__PURE__ */ jsx(Pencil, { className: "h-3 w-3" })
44
- }
45
- ),
46
- /* @__PURE__ */ jsx(
47
- Button,
48
- {
49
- type: "button",
50
- variant: "ghost",
51
- size: "sm",
52
- onClick: () => {
53
- const newValue = value.filter((_, i) => i !== row.index);
54
- onChange(newValue);
55
- },
56
- disabled,
57
- children: /* @__PURE__ */ jsx(Trash2, { className: "h-3 w-3 text-destructive" })
58
- }
59
- )
60
- ] }),
61
- size: 60
62
- }
63
- ];
64
- const table = useReactTable({
65
- data: value,
66
- columns: columnsWithActions,
67
- getCoreRowModel: getCoreRowModel(),
68
- getRowId: (row, index) => getItemKey(row, index)
69
- });
70
- const handleSave = useCallback(
71
- (item) => {
72
- if (!dialogState.open) return;
73
- if (dialogState.mode === "create") {
74
- onChange([...value, item]);
75
- } else {
76
- const newValue = [...value];
77
- newValue[dialogState.index] = item;
78
- onChange(newValue);
79
- }
80
- setDialogState({ open: false });
81
- },
82
- [dialogState, value, onChange]
83
- );
84
- return /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
85
- label && /* @__PURE__ */ jsx(Label, { children: label }),
86
- /* @__PURE__ */ jsx("div", { className: "border rounded-md", children: value.length === 0 ? /* @__PURE__ */ jsx("div", { className: "p-4 text-center text-sm text-muted-foreground", children: emptyMessage }) : /* @__PURE__ */ jsxs(Table, { children: [
87
- /* @__PURE__ */ jsx(TableHeader, { children: table.getHeaderGroups().map((headerGroup) => /* @__PURE__ */ jsx(TableRow, { children: headerGroup.headers.map((header) => /* @__PURE__ */ jsx(TableHead, { className: "h-8 text-xs", children: header.isPlaceholder ? null : flexRender(
88
- header.column.columnDef.header,
89
- header.getContext()
90
- ) }, header.id)) }, headerGroup.id)) }),
91
- /* @__PURE__ */ jsx(TableBody, { children: table.getRowModel().rows.map((row) => /* @__PURE__ */ jsx(TableRow, { children: row.getVisibleCells().map((cell) => /* @__PURE__ */ jsx(TableCell, { className: "py-1 text-sm", children: flexRender(
92
- cell.column.columnDef.cell,
93
- cell.getContext()
94
- ) }, cell.id)) }, row.id)) })
95
- ] }) }),
96
- /* @__PURE__ */ jsxs(
97
- Button,
98
- {
99
- type: "button",
100
- variant: "outline",
101
- size: "sm",
102
- onClick: () => setDialogState({ open: true, mode: "create", index: null }),
103
- disabled,
104
- children: [
105
- /* @__PURE__ */ jsx(Plus, { className: "h-3 w-3 mr-1" }),
106
- addButtonLabel
107
- ]
108
- }
109
- ),
110
- /* @__PURE__ */ jsx(
111
- Dialog,
112
- {
113
- open: dialogState.open,
114
- onOpenChange: (open) => !open && setDialogState({ open: false }),
115
- children: /* @__PURE__ */ jsxs(DialogContent, { children: [
116
- /* @__PURE__ */ jsx(DialogHeader, { children: /* @__PURE__ */ jsx(DialogTitle, { children: dialogState.open && dialogState.mode === "create" ? "Add Item" : "Edit Item" }) }),
117
- dialogState.open && renderForm({
118
- item: dialogState.mode === "edit" ? dialogState.item : createEmpty(),
119
- onSave: handleSave,
120
- onCancel: () => setDialogState({ open: false })
121
- })
122
- ] })
123
- }
124
- )
125
- ] });
126
- }
127
- export {
128
- EditableListField
129
- };
130
- //# sourceMappingURL=EditableListField.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"EditableListField.js","sources":["../../../../src/ui/editable-list/EditableListField.tsx"],"sourcesContent":["import { useCallback, useState } from 'react'\nimport {\n flexRender,\n getCoreRowModel,\n useReactTable,\n} from '@tanstack/react-table'\nimport { Pencil, Plus, Trash2 } from 'lucide-react'\nimport { Button } from '~/ui/button'\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '~/ui/table'\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '~/ui/dialog'\nimport { Label } from '~/ui/label'\nimport type { EditableListFieldProps } from './types'\n\ntype DialogState<T> =\n | { open: false }\n | { open: true; mode: 'create'; index: null }\n | { open: true; mode: 'edit'; index: number; item: T }\n\nexport function EditableListField<T>({\n value,\n onChange,\n columns,\n renderForm,\n createEmpty,\n getItemKey,\n label,\n addButtonLabel = 'Add',\n emptyMessage = 'No items',\n disabled = false,\n}: EditableListFieldProps<T>) {\n const [dialogState, setDialogState] = useState<DialogState<T>>({\n open: false,\n })\n\n // Add action column\n const columnsWithActions = [\n ...columns,\n {\n id: 'actions',\n header: '',\n cell: ({ row }: { row: { original: T; index: number } }) => (\n <div className=\"flex justify-end gap-1\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() =>\n setDialogState({\n open: true,\n mode: 'edit',\n index: row.index,\n item: row.original,\n })\n }\n disabled={disabled}\n >\n <Pencil className=\"h-3 w-3\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => {\n const newValue = value.filter((_, i) => i !== row.index)\n onChange(newValue)\n }}\n disabled={disabled}\n >\n <Trash2 className=\"h-3 w-3 text-destructive\" />\n </Button>\n </div>\n ),\n size: 60,\n },\n ]\n\n const table = useReactTable({\n data: value,\n columns: columnsWithActions,\n getCoreRowModel: getCoreRowModel(),\n getRowId: (row, index) => getItemKey(row, index),\n })\n\n const handleSave = useCallback(\n (item: T) => {\n if (!dialogState.open) return\n\n if (dialogState.mode === 'create') {\n onChange([...value, item])\n } else {\n const newValue = [...value]\n newValue[dialogState.index] = item\n onChange(newValue)\n }\n setDialogState({ open: false })\n },\n [dialogState, value, onChange],\n )\n\n return (\n <div className=\"space-y-2\">\n {label && <Label>{label}</Label>}\n\n <div className=\"border rounded-md\">\n {value.length === 0 ? (\n <div className=\"p-4 text-center text-sm text-muted-foreground\">\n {emptyMessage}\n </div>\n ) : (\n <Table>\n <TableHeader>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow key={headerGroup.id}>\n {headerGroup.headers.map((header) => (\n <TableHead key={header.id} className=\"h-8 text-xs\">\n {header.isPlaceholder\n ? null\n : flexRender(\n header.column.columnDef.header,\n header.getContext(),\n )}\n </TableHead>\n ))}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody>\n {table.getRowModel().rows.map((row) => (\n <TableRow key={row.id}>\n {row.getVisibleCells().map((cell) => (\n <TableCell key={cell.id} className=\"py-1 text-sm\">\n {flexRender(\n cell.column.columnDef.cell,\n cell.getContext(),\n )}\n </TableCell>\n ))}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n )}\n </div>\n\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() =>\n setDialogState({ open: true, mode: 'create', index: null })\n }\n disabled={disabled}\n >\n <Plus className=\"h-3 w-3 mr-1\" />\n {addButtonLabel}\n </Button>\n\n <Dialog\n open={dialogState.open}\n onOpenChange={(open) => !open && setDialogState({ open: false })}\n >\n <DialogContent>\n <DialogHeader>\n <DialogTitle>\n {dialogState.open && dialogState.mode === 'create'\n ? 'Add Item'\n : 'Edit Item'}\n </DialogTitle>\n </DialogHeader>\n {dialogState.open &&\n renderForm({\n item:\n dialogState.mode === 'edit' ? dialogState.item : createEmpty(),\n onSave: handleSave,\n onCancel: () => setDialogState({ open: false }),\n })}\n </DialogContent>\n </Dialog>\n </div>\n )\n}\n"],"names":[],"mappings":"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"}
@@ -1,134 +0,0 @@
1
- import { jsx } from "react/jsx-runtime";
2
- import { Slot } from "@radix-ui/react-slot";
3
- import * as React from "react";
4
- import { use } from "react";
5
- import { FormProvider, Controller, useFormContext } from "../node_modules/.pnpm/react-hook-form@7.71.1_react@19.1.2/node_modules/react-hook-form/dist/index.esm.js";
6
- import { cn } from "../lib/utils.js";
7
- import { Label } from "./label.js";
8
- const Form = FormProvider;
9
- const FormFieldContext = React.createContext(
10
- {}
11
- );
12
- const FormField = ({
13
- ref: _ref,
14
- ...props
15
- }) => {
16
- const fieldContextValue = React.useMemo(
17
- () => ({ name: props.name }),
18
- [props.name]
19
- );
20
- return /* @__PURE__ */ jsx(FormFieldContext, { value: fieldContextValue, children: /* @__PURE__ */ jsx(Controller, { ...props }) });
21
- };
22
- FormField.displayName = "FormField";
23
- const useFormField = () => {
24
- const fieldContext = use(FormFieldContext);
25
- const itemContext = use(FormItemContext);
26
- const { getFieldState, formState } = useFormContext();
27
- const fieldState = getFieldState(fieldContext.name, formState);
28
- const { id } = itemContext;
29
- return {
30
- id,
31
- name: fieldContext.name,
32
- formItemId: `${id}-form-item`,
33
- formDescriptionId: `${id}-form-item-description`,
34
- formMessageId: `${id}-form-item-message`,
35
- ...fieldState
36
- };
37
- };
38
- const FormItemContext = React.createContext(
39
- {}
40
- );
41
- const FormItem = ({
42
- ref,
43
- className,
44
- ...props
45
- }) => {
46
- const id = React.useId();
47
- const formItemValue = React.useMemo(() => ({ id }), [id]);
48
- return /* @__PURE__ */ jsx(FormItemContext, { value: formItemValue, children: /* @__PURE__ */ jsx("div", { ref, className: cn("space-y-2", className), ...props }) });
49
- };
50
- FormItem.displayName = "FormItem";
51
- const FormLabel = ({
52
- ref,
53
- className,
54
- ...props
55
- }) => {
56
- const { error, formItemId } = useFormField();
57
- return /* @__PURE__ */ jsx(
58
- Label,
59
- {
60
- ref,
61
- htmlFor: formItemId,
62
- className: cn(error && "text-destructive", className),
63
- ...props
64
- }
65
- );
66
- };
67
- FormLabel.displayName = "FormLabel";
68
- const FormControl = ({
69
- ref,
70
- ...props
71
- }) => {
72
- const { error, formItemId, formDescriptionId, formMessageId } = useFormField();
73
- return /* @__PURE__ */ jsx(
74
- Slot,
75
- {
76
- ref,
77
- id: formItemId,
78
- "aria-describedby": !error ? `${formDescriptionId}` : `${formDescriptionId} ${formMessageId}`,
79
- "aria-invalid": !!error,
80
- ...props
81
- }
82
- );
83
- };
84
- FormControl.displayName = "FormControl";
85
- const FormDescription = ({
86
- ref,
87
- className,
88
- ...props
89
- }) => {
90
- const { formDescriptionId } = useFormField();
91
- return /* @__PURE__ */ jsx(
92
- "p",
93
- {
94
- ref,
95
- id: formDescriptionId,
96
- className: cn("text-sm text-muted-foreground", className),
97
- ...props
98
- }
99
- );
100
- };
101
- FormDescription.displayName = "FormDescription";
102
- const FormMessage = ({
103
- ref,
104
- className,
105
- ...props
106
- }) => {
107
- const { error, formMessageId } = useFormField();
108
- const body = error ? String(error.message) : "";
109
- if (!error) {
110
- return null;
111
- }
112
- return /* @__PURE__ */ jsx(
113
- "p",
114
- {
115
- ref,
116
- id: formMessageId,
117
- className: cn("text-sm font-medium text-destructive", className),
118
- ...props,
119
- children: body
120
- }
121
- );
122
- };
123
- FormMessage.displayName = "FormMessage";
124
- export {
125
- Form,
126
- FormControl,
127
- FormDescription,
128
- FormField,
129
- FormItem,
130
- FormLabel,
131
- FormMessage,
132
- useFormField
133
- };
134
- //# sourceMappingURL=form.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"form.js","sources":["../../../src/ui/form.tsx"],"sourcesContent":["import type * as LabelPrimitive from '@radix-ui/react-label'\nimport { Slot } from '@radix-ui/react-slot'\nimport * as React from 'react'\nimport { use } from 'react'\nimport type { FieldPath, FieldValues } from 'react-hook-form'\nimport { Controller, FormProvider, useFormContext } from 'react-hook-form'\n\nimport { cn } from '~/lib/utils'\nimport { Label } from '~/ui/label'\n\nconst Form = FormProvider\n\ninterface FormFieldContextValue<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> {\n name: TName\n}\n\nconst FormFieldContext = React.createContext<FormFieldContextValue>(\n {} as FormFieldContextValue,\n)\n\nconst FormField = ({\n ref: _ref,\n ...props\n}: React.ComponentPropsWithoutRef<typeof Controller> & {\n name: any\n} & { ref?: React.RefObject<React.ElementRef<typeof Controller> | null> }) => {\n const fieldContextValue = React.useMemo(\n () => ({ name: props.name }),\n [props.name],\n )\n\n return (\n <FormFieldContext value={fieldContextValue}>\n <Controller {...props} />\n </FormFieldContext>\n )\n}\nFormField.displayName = 'FormField'\n\nconst useFormField = () => {\n const fieldContext = use(FormFieldContext)\n const itemContext = use(FormItemContext)\n const { getFieldState, formState } = useFormContext()\n\n const fieldState = getFieldState(fieldContext.name, formState)\n\n const { id } = itemContext\n\n return {\n id,\n name: fieldContext.name,\n formItemId: `${id}-form-item`,\n formDescriptionId: `${id}-form-item-description`,\n formMessageId: `${id}-form-item-message`,\n ...fieldState,\n }\n}\n\ninterface FormItemContextValue {\n id: string\n}\n\nconst FormItemContext = React.createContext<FormItemContextValue>(\n {} as FormItemContextValue,\n)\n\nconst FormItem = ({\n ref,\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement> & {\n ref?: React.RefObject<HTMLDivElement | null>\n}) => {\n const id = React.useId()\n const formItemValue = React.useMemo(() => ({ id }), [id])\n\n return (\n <FormItemContext value={formItemValue}>\n <div ref={ref} className={cn('space-y-2', className)} {...props} />\n </FormItemContext>\n )\n}\nFormItem.displayName = 'FormItem'\n\nconst FormLabel = ({\n ref,\n className,\n ...props\n}: React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> & {\n ref?: React.RefObject<React.ElementRef<typeof LabelPrimitive.Root> | null>\n}) => {\n const { error, formItemId } = useFormField()\n\n return (\n <Label\n ref={ref}\n htmlFor={formItemId}\n className={cn(error && 'text-destructive', className)}\n {...props}\n />\n )\n}\nFormLabel.displayName = 'FormLabel'\n\nconst FormControl = ({\n ref,\n ...props\n}: React.ComponentPropsWithoutRef<typeof Slot> & {\n ref?: React.RefObject<React.ElementRef<typeof Slot> | null>\n}) => {\n const { error, formItemId, formDescriptionId, formMessageId } = useFormField()\n\n return (\n <Slot\n ref={ref}\n id={formItemId}\n aria-describedby={\n !error\n ? `${formDescriptionId}`\n : `${formDescriptionId} ${formMessageId}`\n }\n aria-invalid={!!error}\n {...props}\n />\n )\n}\nFormControl.displayName = 'FormControl'\n\nconst FormDescription = ({\n ref,\n className,\n ...props\n}: React.HTMLAttributes<HTMLParagraphElement> & {\n ref?: React.RefObject<HTMLParagraphElement | null>\n}) => {\n const { formDescriptionId } = useFormField()\n\n return (\n <p\n ref={ref}\n id={formDescriptionId}\n className={cn('text-sm text-muted-foreground', className)}\n {...props}\n />\n )\n}\nFormDescription.displayName = 'FormDescription'\n\nconst FormMessage = ({\n ref,\n className,\n ...props\n}: React.HTMLAttributes<HTMLParagraphElement> & {\n ref?: React.RefObject<HTMLParagraphElement | null>\n}) => {\n const { error, formMessageId } = useFormField()\n const body = error ? String(error.message) : ''\n\n if (!error) {\n return null\n }\n\n return (\n <p\n ref={ref}\n id={formMessageId}\n className={cn('text-sm font-medium text-destructive', className)}\n {...props}\n >\n {body}\n </p>\n )\n}\nFormMessage.displayName = 'FormMessage'\n\nexport {\n Form,\n FormControl,\n FormDescription,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n useFormField,\n}\n"],"names":[],"mappings":"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"}
@@ -1,26 +0,0 @@
1
- import { jsx } from "react/jsx-runtime";
2
- import { cn } from "../lib/utils.js";
3
- const LinkExternal = ({
4
- ref,
5
- href,
6
- className,
7
- ...props
8
- }) => {
9
- return /* @__PURE__ */ jsx(
10
- "a",
11
- {
12
- ref,
13
- href,
14
- target: "_blank",
15
- ...props,
16
- className: cn(
17
- "text-primary hover:text-primary/80 transition-colors font-medium",
18
- className
19
- )
20
- }
21
- );
22
- };
23
- export {
24
- LinkExternal
25
- };
26
- //# sourceMappingURL=linkExternal.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"linkExternal.js","sources":["../../../src/ui/linkExternal.tsx"],"sourcesContent":["import * as React from 'react'\nimport { cn } from '~/lib/utils'\n\ninterface BasicLinkProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {\n className?: string\n}\n\nexport const LinkExternal = ({\n ref,\n href,\n className,\n ...props\n}: BasicLinkProps & { ref?: React.RefObject<HTMLAnchorElement | null> }) => {\n return (\n <a\n ref={ref}\n href={href}\n target=\"_blank\"\n {...props}\n className={cn(\n 'text-primary hover:text-primary/80 transition-colors font-medium',\n className,\n )}\n />\n )\n}\n"],"names":[],"mappings":";;AAOO,MAAM,eAAe,CAAC;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAA4E;AAC1E,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,QAAO;AAAA,MACN,GAAG;AAAA,MACJ,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MAAA;AAAA,IACF;AAAA,EAAA;AAGN;"}