@igstack/app-catalog-frontend-core 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/api/infra/trpc.d.ts +0 -1491
- package/dist/esm/modules/appCatalog/context/AppCatalogContext.js +1 -0
- package/dist/esm/modules/appCatalog/context/AppCatalogContext.js.map +1 -1
- package/dist/esm/modules/appCatalog/ui/filters/FilterBar.js +23 -11
- package/dist/esm/modules/appCatalog/ui/filters/FilterBar.js.map +1 -1
- package/dist/esm/modules/appCatalog/ui/grid/AppCatalogGrid.d.ts +5 -1
- package/dist/esm/modules/appCatalog/ui/grid/AppCatalogGrid.js +146 -56
- package/dist/esm/modules/appCatalog/ui/grid/AppCatalogGrid.js.map +1 -1
- package/dist/esm/modules/appCatalog/ui/pages/AppCatalogPage.js +20 -1
- package/dist/esm/modules/appCatalog/ui/pages/AppCatalogPage.js.map +1 -1
- package/dist/esm/modules/auth/AuthContext.js +1 -1
- package/dist/esm/modules/auth/AuthModalContext.js +1 -1
- package/dist/esm/modules/auth/authClient.d.ts +2 -2
- package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/classic/schemas.js +4 -37
- package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/classic/schemas.js.map +1 -1
- package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/core/api.js +2 -10
- package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/core/api.js.map +1 -1
- package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/core/checks.js +1 -1
- package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/core/json-schema-processors.js +0 -44
- package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/core/json-schema-processors.js.map +1 -1
- package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/core/parse.js +0 -4
- package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/core/parse.js.map +1 -1
- package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/core/regexes.js +0 -2
- package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/core/regexes.js.map +1 -1
- package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/core/schemas.js +4 -49
- package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/core/schemas.js.map +1 -1
- package/dist/esm/routeTree.gen.d.ts +3 -164
- package/dist/esm/routeTree.gen.js +8 -80
- package/dist/esm/routeTree.gen.js.map +1 -1
- package/dist/esm/ui/button.d.ts +1 -1
- package/dist/esm/ui/card.js +1 -48
- package/dist/esm/ui/card.js.map +1 -1
- package/dist/esm/ui/command.js +1 -15
- package/dist/esm/ui/command.js.map +1 -1
- package/dist/esm/ui/components/header/Header.js +2 -11
- package/dist/esm/ui/components/header/Header.js.map +1 -1
- package/dist/esm/ui/input-group.js +125 -0
- package/dist/esm/ui/input-group.js.map +1 -0
- package/package.json +3 -3
- package/src/modules/appCatalog/ui/components/AppDetailModal.tsx +2 -21
- package/src/routeTree.gen.ts +2 -220
- package/src/ui/components/header/Header.tsx +2 -12
- package/dist/esm/components/IconPickerDialog.d.ts +0 -8
- package/dist/esm/components/IconPickerDialog.js +0 -98
- package/dist/esm/components/IconPickerDialog.js.map +0 -1
- package/dist/esm/components/IconPickerField.d.ts +0 -9
- package/dist/esm/components/IconPickerField.js +0 -76
- package/dist/esm/components/IconPickerField.js.map +0 -1
- package/dist/esm/modules/admin-base/components/AdminChat.d.ts +0 -1
- package/dist/esm/modules/admin-base/components/AdminChat.js +0 -82
- package/dist/esm/modules/admin-base/components/AdminChat.js.map +0 -1
- package/dist/esm/modules/admin-base/components/AdminLayout.d.ts +0 -5
- package/dist/esm/modules/admin-base/components/AdminLayout.js +0 -83
- package/dist/esm/modules/admin-base/components/AdminLayout.js.map +0 -1
- package/dist/esm/modules/admin-base/components/AdminWelcome.d.ts +0 -1
- package/dist/esm/modules/admin-base/components/AdminWelcome.js +0 -37
- package/dist/esm/modules/admin-base/components/AdminWelcome.js.map +0 -1
- package/dist/esm/modules/admin-base/context/AdminConfigContext.d.ts +0 -8
- package/dist/esm/modules/admin-base/context/AdminConfigContext.js +0 -27
- package/dist/esm/modules/admin-base/context/AdminConfigContext.js.map +0 -1
- package/dist/esm/modules/admin-base/index.d.ts +0 -5
- package/dist/esm/modules/admin-base/types/adminTypes.d.ts +0 -10
- package/dist/esm/modules/appCatalog/AppCatalogAdminPage.d.ts +0 -1
- package/dist/esm/modules/appCatalog/AppCatalogAdminPage.js +0 -196
- package/dist/esm/modules/appCatalog/AppCatalogAdminPage.js.map +0 -1
- package/dist/esm/modules/appCatalog/ScreenshotItem.js +0 -57
- package/dist/esm/modules/appCatalog/ScreenshotItem.js.map +0 -1
- package/dist/esm/modules/appCatalog/ScreenshotManager.js +0 -155
- package/dist/esm/modules/appCatalog/ScreenshotManager.js.map +0 -1
- package/dist/esm/modules/approvalMethod/AccessRequestFormFields.d.ts +0 -7
- package/dist/esm/modules/approvalMethod/AccessRequestFormFields.js +0 -323
- package/dist/esm/modules/approvalMethod/AccessRequestFormFields.js.map +0 -1
- package/dist/esm/modules/approvalMethod/ApprovalMethodForm.d.ts +0 -14
- package/dist/esm/modules/approvalMethod/ApprovalMethodForm.js +0 -227
- package/dist/esm/modules/approvalMethod/ApprovalMethodForm.js.map +0 -1
- package/dist/esm/modules/approvalMethod/ApprovalMethodSelector.d.ts +0 -7
- package/dist/esm/modules/approvalMethod/ApprovalMethodSelector.js +0 -124
- package/dist/esm/modules/approvalMethod/ApprovalMethodSelector.js.map +0 -1
- package/dist/esm/modules/approvalMethod/api/ApiQueryMagazineApprovalMethod.d.ts +0 -381
- package/dist/esm/modules/approvalMethod/api/ApiQueryMagazineApprovalMethod.js +0 -26
- package/dist/esm/modules/approvalMethod/api/ApiQueryMagazineApprovalMethod.js.map +0 -1
- package/dist/esm/modules/auth/authUtils.js +0 -25
- package/dist/esm/modules/auth/authUtils.js.map +0 -1
- package/dist/esm/modules/icons/IconManagementPage.d.ts +0 -1
- package/dist/esm/modules/icons/IconManagementPage.js +0 -177
- package/dist/esm/modules/icons/IconManagementPage.js.map +0 -1
- package/dist/esm/node_modules/.pnpm/@dnd-kit_accessibility@3.1.1_react@19.1.2/node_modules/@dnd-kit/accessibility/dist/accessibility.esm.js +0 -60
- package/dist/esm/node_modules/.pnpm/@dnd-kit_accessibility@3.1.1_react@19.1.2/node_modules/@dnd-kit/accessibility/dist/accessibility.esm.js.map +0 -1
- package/dist/esm/node_modules/.pnpm/@dnd-kit_core@6.3.1_react-dom@19.1.2_react@19.1.2__react@19.1.2/node_modules/@dnd-kit/core/dist/core.esm.js +0 -3055
- package/dist/esm/node_modules/.pnpm/@dnd-kit_core@6.3.1_react-dom@19.1.2_react@19.1.2__react@19.1.2/node_modules/@dnd-kit/core/dist/core.esm.js.map +0 -1
- package/dist/esm/node_modules/.pnpm/@dnd-kit_sortable@10.0.0_@dnd-kit_core@6.3.1_react-dom@19.1.2_react@19.1.2__react@19.1.2__react@19.1.2/node_modules/@dnd-kit/sortable/dist/sortable.esm.js +0 -593
- package/dist/esm/node_modules/.pnpm/@dnd-kit_sortable@10.0.0_@dnd-kit_core@6.3.1_react-dom@19.1.2_react@19.1.2__react@19.1.2__react@19.1.2/node_modules/@dnd-kit/sortable/dist/sortable.esm.js.map +0 -1
- package/dist/esm/node_modules/.pnpm/@dnd-kit_utilities@3.2.2_react@19.1.2/node_modules/@dnd-kit/utilities/dist/utilities.esm.js +0 -302
- package/dist/esm/node_modules/.pnpm/@dnd-kit_utilities@3.2.2_react@19.1.2/node_modules/@dnd-kit/utilities/dist/utilities.esm.js.map +0 -1
- package/dist/esm/node_modules/.pnpm/@hookform_resolvers@5.2.2_react-hook-form@7.71.1_react@19.1.2_/node_modules/@hookform/resolvers/dist/resolvers.js +0 -34
- package/dist/esm/node_modules/.pnpm/@hookform_resolvers@5.2.2_react-hook-form@7.71.1_react@19.1.2_/node_modules/@hookform/resolvers/dist/resolvers.js.map +0 -1
- package/dist/esm/node_modules/.pnpm/@hookform_resolvers@5.2.2_react-hook-form@7.71.1_react@19.1.2_/node_modules/@hookform/resolvers/zod/dist/zod.js +0 -94
- package/dist/esm/node_modules/.pnpm/@hookform_resolvers@5.2.2_react-hook-form@7.71.1_react@19.1.2_/node_modules/@hookform/resolvers/zod/dist/zod.js.map +0 -1
- package/dist/esm/node_modules/.pnpm/react-hook-form@7.71.1_react@19.1.2/node_modules/react-hook-form/dist/index.esm.js +0 -1894
- package/dist/esm/node_modules/.pnpm/react-hook-form@7.71.1_react@19.1.2/node_modules/react-hook-form/dist/index.esm.js.map +0 -1
- package/dist/esm/routes/admin/app-for-catalog/$id.d.ts +0 -5
- package/dist/esm/routes/admin/app-for-catalog/_id.js +0 -67
- package/dist/esm/routes/admin/app-for-catalog/_id.js.map +0 -1
- package/dist/esm/routes/admin/app-for-catalog/_id2.js +0 -321
- package/dist/esm/routes/admin/app-for-catalog/_id2.js.map +0 -1
- package/dist/esm/routes/admin/app-for-catalog/index.d.ts +0 -1
- package/dist/esm/routes/admin/app-for-catalog/index.js +0 -9
- package/dist/esm/routes/admin/app-for-catalog/index.js.map +0 -1
- package/dist/esm/routes/admin/app-for-catalog/index2.js +0 -12
- package/dist/esm/routes/admin/app-for-catalog/index2.js.map +0 -1
- package/dist/esm/routes/admin/app-for-catalog.d.ts +0 -1
- package/dist/esm/routes/admin/app-for-catalog.js +0 -14
- package/dist/esm/routes/admin/app-for-catalog.js.map +0 -1
- package/dist/esm/routes/admin/app-for-catalog2.js +0 -9
- package/dist/esm/routes/admin/app-for-catalog2.js.map +0 -1
- package/dist/esm/routes/admin/approval-methods/index.d.ts +0 -32
- package/dist/esm/routes/admin/approval-methods/index.js +0 -24
- package/dist/esm/routes/admin/approval-methods/index.js.map +0 -1
- package/dist/esm/routes/admin/approval-methods/index2.js +0 -100
- package/dist/esm/routes/admin/approval-methods/index2.js.map +0 -1
- package/dist/esm/routes/admin/approval-methods.d.ts +0 -1
- package/dist/esm/routes/admin/approval-methods.js +0 -14
- package/dist/esm/routes/admin/approval-methods.js.map +0 -1
- package/dist/esm/routes/admin/approval-methods2.js +0 -7
- package/dist/esm/routes/admin/approval-methods2.js.map +0 -1
- package/dist/esm/routes/admin/chat.d.ts +0 -1
- package/dist/esm/routes/admin/chat.js +0 -14
- package/dist/esm/routes/admin/chat.js.map +0 -1
- package/dist/esm/routes/admin/chat2.js +0 -9
- package/dist/esm/routes/admin/chat2.js.map +0 -1
- package/dist/esm/routes/admin/icons.d.ts +0 -1
- package/dist/esm/routes/admin/icons.js +0 -14
- package/dist/esm/routes/admin/icons.js.map +0 -1
- package/dist/esm/routes/admin/icons2.js +0 -12
- package/dist/esm/routes/admin/icons2.js.map +0 -1
- package/dist/esm/routes/admin/index.d.ts +0 -1
- package/dist/esm/routes/admin/index.js +0 -9
- package/dist/esm/routes/admin/index.js.map +0 -1
- package/dist/esm/routes/admin/index2.js +0 -9
- package/dist/esm/routes/admin/index2.js.map +0 -1
- package/dist/esm/routes/admin.d.ts +0 -1
- package/dist/esm/routes/admin.js +0 -37
- package/dist/esm/routes/admin.js.map +0 -1
- package/dist/esm/routes/admin2.js +0 -18
- package/dist/esm/routes/admin2.js.map +0 -1
- package/dist/esm/ui/alert-dialog.js +0 -141
- package/dist/esm/ui/alert-dialog.js.map +0 -1
- package/dist/esm/ui/breadcrumb.js +0 -84
- package/dist/esm/ui/breadcrumb.js.map +0 -1
- package/dist/esm/ui/components/Breadcrumbs.js +0 -36
- package/dist/esm/ui/components/Breadcrumbs.js.map +0 -1
- package/dist/esm/ui/crud-list/CrudList.js +0 -189
- package/dist/esm/ui/crud-list/CrudList.js.map +0 -1
- package/dist/esm/ui/editable-list/EditableListField.js +0 -130
- package/dist/esm/ui/editable-list/EditableListField.js.map +0 -1
- package/dist/esm/ui/form.js +0 -134
- package/dist/esm/ui/form.js.map +0 -1
- package/dist/esm/ui/linkExternal.js +0 -26
- package/dist/esm/ui/linkExternal.js.map +0 -1
- package/dist/esm/ui/markdown-editor/MarkdownEditor.js +0 -116
- package/dist/esm/ui/markdown-editor/MarkdownEditor.js.map +0 -1
- package/dist/esm/ui/markdown-editor/MarkdownToolbar.js +0 -99
- package/dist/esm/ui/markdown-editor/MarkdownToolbar.js.map +0 -1
- package/dist/esm/ui/scroll-area.js +0 -62
- package/dist/esm/ui/scroll-area.js.map +0 -1
- package/dist/esm/ui/select.js +0 -138
- package/dist/esm/ui/select.js.map +0 -1
- package/dist/esm/ui/textarea.js +0 -19
- package/dist/esm/ui/textarea.js.map +0 -1
- package/src/components/IconPickerDialog.tsx +0 -136
- package/src/components/IconPickerField.tsx +0 -88
- package/src/modules/admin-base/components/AdminChat.tsx +0 -122
- package/src/modules/admin-base/components/AdminLayout.tsx +0 -111
- package/src/modules/admin-base/components/AdminWelcome.tsx +0 -52
- package/src/modules/admin-base/context/AdminConfigContext.tsx +0 -36
- package/src/modules/admin-base/index.ts +0 -16
- package/src/modules/admin-base/types/adminTypes.ts +0 -11
- package/src/modules/appCatalog/AppCatalogAdminPage.tsx +0 -274
- package/src/modules/approvalMethod/AccessRequestFormFields.tsx +0 -393
- package/src/modules/approvalMethod/ApprovalMethodForm.tsx +0 -323
- package/src/modules/approvalMethod/ApprovalMethodSelector.tsx +0 -150
- package/src/modules/approvalMethod/api/ApiQueryMagazineApprovalMethod.ts +0 -34
- package/src/modules/icons/IconManagementPage.tsx +0 -245
- package/src/routes/admin/app-for-catalog/$id.tsx +0 -571
- package/src/routes/admin/app-for-catalog/index.tsx +0 -19
- package/src/routes/admin/app-for-catalog.tsx +0 -12
- package/src/routes/admin/approval-methods/index.tsx +0 -161
- package/src/routes/admin/approval-methods.tsx +0 -10
- package/src/routes/admin/chat.tsx +0 -13
- package/src/routes/admin/icons.tsx +0 -22
- package/src/routes/admin/index.tsx +0 -9
- package/src/routes/admin.tsx +0 -60
|
@@ -1,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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"}
|
package/dist/esm/ui/form.js
DELETED
|
@@ -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
|
package/dist/esm/ui/form.js.map
DELETED
|
@@ -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;"}
|