gw-admin 0.1.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/CHANGELOG.md +22 -0
- package/LICENSE +21 -0
- package/README.md +569 -0
- package/dist/account/admin-logout-button.d.ts +21 -0
- package/dist/account/admin-logout-button.d.ts.map +1 -0
- package/dist/account/admin-logout-button.js +57 -0
- package/dist/account/admin-logout-button.js.map +1 -0
- package/dist/account/index.d.ts +2 -0
- package/dist/account/index.d.ts.map +1 -0
- package/dist/account/index.js +3 -0
- package/dist/account/index.js.map +1 -0
- package/dist/attachments/admin-attachment-list.d.ts +12 -0
- package/dist/attachments/admin-attachment-list.d.ts.map +1 -0
- package/dist/attachments/admin-attachment-list.js +11 -0
- package/dist/attachments/admin-attachment-list.js.map +1 -0
- package/dist/attachments/admin-file-attachments.d.ts +33 -0
- package/dist/attachments/admin-file-attachments.d.ts.map +1 -0
- package/dist/attachments/admin-file-attachments.js +94 -0
- package/dist/attachments/admin-file-attachments.js.map +1 -0
- package/dist/attachments/index.d.ts +4 -0
- package/dist/attachments/index.d.ts.map +1 -0
- package/dist/attachments/index.js +3 -0
- package/dist/attachments/index.js.map +1 -0
- package/dist/attachments/types.d.ts +12 -0
- package/dist/attachments/types.d.ts.map +1 -0
- package/dist/attachments/types.js +2 -0
- package/dist/attachments/types.js.map +1 -0
- package/dist/crud/form/admin-crud-form.d.ts +41 -0
- package/dist/crud/form/admin-crud-form.d.ts.map +1 -0
- package/dist/crud/form/admin-crud-form.js +56 -0
- package/dist/crud/form/admin-crud-form.js.map +1 -0
- package/dist/crud/form/form-state.d.ts +12 -0
- package/dist/crud/form/form-state.d.ts.map +1 -0
- package/dist/crud/form/form-state.js +48 -0
- package/dist/crud/form/form-state.js.map +1 -0
- package/dist/crud/form/index.d.ts +3 -0
- package/dist/crud/form/index.d.ts.map +1 -0
- package/dist/crud/form/index.js +3 -0
- package/dist/crud/form/index.js.map +1 -0
- package/dist/crud/index.d.ts +3 -0
- package/dist/crud/index.d.ts.map +1 -0
- package/dist/crud/index.js +3 -0
- package/dist/crud/index.js.map +1 -0
- package/dist/crud/pages/admin-crud-detail-page.d.ts +33 -0
- package/dist/crud/pages/admin-crud-detail-page.d.ts.map +1 -0
- package/dist/crud/pages/admin-crud-detail-page.js +39 -0
- package/dist/crud/pages/admin-crud-detail-page.js.map +1 -0
- package/dist/crud/pages/admin-crud-form-pages.d.ts +27 -0
- package/dist/crud/pages/admin-crud-form-pages.d.ts.map +1 -0
- package/dist/crud/pages/admin-crud-form-pages.js +44 -0
- package/dist/crud/pages/admin-crud-form-pages.js.map +1 -0
- package/dist/crud/pages/admin-crud-list-page.d.ts +27 -0
- package/dist/crud/pages/admin-crud-list-page.d.ts.map +1 -0
- package/dist/crud/pages/admin-crud-list-page.js +33 -0
- package/dist/crud/pages/admin-crud-list-page.js.map +1 -0
- package/dist/crud/pages/admin-delete-form.d.ts +12 -0
- package/dist/crud/pages/admin-delete-form.d.ts.map +1 -0
- package/dist/crud/pages/admin-delete-form.js +15 -0
- package/dist/crud/pages/admin-delete-form.js.map +1 -0
- package/dist/crud/pages/format-admin-value.d.ts +5 -0
- package/dist/crud/pages/format-admin-value.d.ts.map +1 -0
- package/dist/crud/pages/format-admin-value.js +38 -0
- package/dist/crud/pages/format-admin-value.js.map +1 -0
- package/dist/crud/pages/index.d.ts +6 -0
- package/dist/crud/pages/index.d.ts.map +1 -0
- package/dist/crud/pages/index.js +6 -0
- package/dist/crud/pages/index.js.map +1 -0
- package/dist/crud/preset/client.d.ts +2 -0
- package/dist/crud/preset/client.d.ts.map +1 -0
- package/dist/crud/preset/client.js +3 -0
- package/dist/crud/preset/client.js.map +1 -0
- package/dist/crud/preset/create-admin-crud-form.d.ts +41 -0
- package/dist/crud/preset/create-admin-crud-form.d.ts.map +1 -0
- package/dist/crud/preset/create-admin-crud-form.js +68 -0
- package/dist/crud/preset/create-admin-crud-form.js.map +1 -0
- package/dist/crud/preset/create-admin-crud-pages.d.ts +29 -0
- package/dist/crud/preset/create-admin-crud-pages.d.ts.map +1 -0
- package/dist/crud/preset/create-admin-crud-pages.js +46 -0
- package/dist/crud/preset/create-admin-crud-pages.js.map +1 -0
- package/dist/crud/preset/create-admin-crud-route-page.d.ts +18 -0
- package/dist/crud/preset/create-admin-crud-route-page.d.ts.map +1 -0
- package/dist/crud/preset/create-admin-crud-route-page.js +26 -0
- package/dist/crud/preset/create-admin-crud-route-page.js.map +1 -0
- package/dist/crud/preset/index.d.ts +3 -0
- package/dist/crud/preset/index.d.ts.map +1 -0
- package/dist/crud/preset/index.js +3 -0
- package/dist/crud/preset/index.js.map +1 -0
- package/dist/header/admin-page-header.d.ts +15 -0
- package/dist/header/admin-page-header.d.ts.map +1 -0
- package/dist/header/admin-page-header.js +10 -0
- package/dist/header/admin-page-header.js.map +1 -0
- package/dist/header/index.d.ts +2 -0
- package/dist/header/index.d.ts.map +1 -0
- package/dist/header/index.js +2 -0
- package/dist/header/index.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/class-names.d.ts +5 -0
- package/dist/internal/class-names.d.ts.map +1 -0
- package/dist/internal/class-names.js +7 -0
- package/dist/internal/class-names.js.map +1 -0
- package/dist/layout/admin-layout.d.ts +16 -0
- package/dist/layout/admin-layout.d.ts.map +1 -0
- package/dist/layout/admin-layout.js +17 -0
- package/dist/layout/admin-layout.js.map +1 -0
- package/dist/layout/admin-shell.d.ts +12 -0
- package/dist/layout/admin-shell.d.ts.map +1 -0
- package/dist/layout/admin-shell.js +10 -0
- package/dist/layout/admin-shell.js.map +1 -0
- package/dist/layout/admin-sidebar.d.ts +11 -0
- package/dist/layout/admin-sidebar.d.ts.map +1 -0
- package/dist/layout/admin-sidebar.js +10 -0
- package/dist/layout/admin-sidebar.js.map +1 -0
- package/dist/layout/index.d.ts +4 -0
- package/dist/layout/index.d.ts.map +1 -0
- package/dist/layout/index.js +4 -0
- package/dist/layout/index.js.map +1 -0
- package/dist/layout/mobile.d.ts +15 -0
- package/dist/layout/mobile.d.ts.map +1 -0
- package/dist/layout/mobile.js +32 -0
- package/dist/layout/mobile.js.map +1 -0
- package/dist/navigation/admin-navigation.d.ts +21 -0
- package/dist/navigation/admin-navigation.d.ts.map +1 -0
- package/dist/navigation/admin-navigation.js +22 -0
- package/dist/navigation/admin-navigation.js.map +1 -0
- package/dist/navigation/index.d.ts +2 -0
- package/dist/navigation/index.d.ts.map +1 -0
- package/dist/navigation/index.js +2 -0
- package/dist/navigation/index.js.map +1 -0
- package/dist/pages/admin-account-page.d.ts +13 -0
- package/dist/pages/admin-account-page.d.ts.map +1 -0
- package/dist/pages/admin-account-page.js +11 -0
- package/dist/pages/admin-account-page.js.map +1 -0
- package/dist/pages/admin-dashboard-page.d.ts +15 -0
- package/dist/pages/admin-dashboard-page.d.ts.map +1 -0
- package/dist/pages/admin-dashboard-page.js +8 -0
- package/dist/pages/admin-dashboard-page.js.map +1 -0
- package/dist/pages/index.d.ts +3 -0
- package/dist/pages/index.d.ts.map +1 -0
- package/dist/pages/index.js +3 -0
- package/dist/pages/index.js.map +1 -0
- package/dist/rich-text/admin-rich-text-editor.d.ts +27 -0
- package/dist/rich-text/admin-rich-text-editor.d.ts.map +1 -0
- package/dist/rich-text/admin-rich-text-editor.js +102 -0
- package/dist/rich-text/admin-rich-text-editor.js.map +1 -0
- package/dist/rich-text/admin-rich-text-file.d.ts +24 -0
- package/dist/rich-text/admin-rich-text-file.d.ts.map +1 -0
- package/dist/rich-text/admin-rich-text-file.js +80 -0
- package/dist/rich-text/admin-rich-text-file.js.map +1 -0
- package/dist/rich-text/admin-rich-text-view.d.ts +9 -0
- package/dist/rich-text/admin-rich-text-view.d.ts.map +1 -0
- package/dist/rich-text/admin-rich-text-view.js +9 -0
- package/dist/rich-text/admin-rich-text-view.js.map +1 -0
- package/dist/rich-text/index.d.ts +5 -0
- package/dist/rich-text/index.d.ts.map +1 -0
- package/dist/rich-text/index.js +5 -0
- package/dist/rich-text/index.js.map +1 -0
- package/dist/rich-text/plain-text.d.ts +9 -0
- package/dist/rich-text/plain-text.d.ts.map +1 -0
- package/dist/rich-text/plain-text.js +24 -0
- package/dist/rich-text/plain-text.js.map +1 -0
- package/package.json +163 -0
- package/rich-text.css +1 -0
- package/styles.css +901 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { notFound } from "next/navigation";
|
|
3
|
+
import { AdminCrudForm, } from "../form/admin-crud-form.js";
|
|
4
|
+
async function renderCrudForm(props, renderForm) {
|
|
5
|
+
return renderForm ? renderForm(props) : _jsx(AdminCrudForm, { ...props });
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Loads a create model and delegates the actual form to an optional
|
|
9
|
+
* resource-specific renderer.
|
|
10
|
+
*/
|
|
11
|
+
export async function AdminCrudCreatePage({ resource, action, title = "새 글 등록", initialValues = {}, renderForm, }) {
|
|
12
|
+
const model = await resource.getCreateForm();
|
|
13
|
+
return (_jsx("main", { className: "gw-admin-page gw-admin-page--form", children: await renderCrudForm({
|
|
14
|
+
title,
|
|
15
|
+
breadcrumbs: [{ label: resource.label, href: model.basePath }],
|
|
16
|
+
model,
|
|
17
|
+
action,
|
|
18
|
+
initialValues,
|
|
19
|
+
}, renderForm) }));
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Loads an update model and delegates the actual form to an optional
|
|
23
|
+
* resource-specific renderer.
|
|
24
|
+
*/
|
|
25
|
+
export async function AdminCrudUpdatePage({ resource, id, action, title = "내용 수정", initialValues = {}, renderForm, }) {
|
|
26
|
+
const model = await resource.getUpdateForm(id);
|
|
27
|
+
if (!model) {
|
|
28
|
+
notFound();
|
|
29
|
+
}
|
|
30
|
+
return (_jsx("main", { className: "gw-admin-page gw-admin-page--form", children: await renderCrudForm({
|
|
31
|
+
title,
|
|
32
|
+
breadcrumbs: [
|
|
33
|
+
{ label: resource.label, href: model.basePath },
|
|
34
|
+
{
|
|
35
|
+
label: "상세 보기",
|
|
36
|
+
href: `${model.basePath}/${encodeURIComponent(String(id))}`,
|
|
37
|
+
},
|
|
38
|
+
],
|
|
39
|
+
model: model,
|
|
40
|
+
action,
|
|
41
|
+
initialValues,
|
|
42
|
+
}, renderForm) }));
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=admin-crud-form-pages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-crud-form-pages.js","sourceRoot":"","sources":["../../../src/crud/pages/admin-crud-form-pages.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAO3C,OAAO,EACL,aAAa,GAEd,MAAM,4BAA4B,CAAC;AAwBpC,KAAK,UAAU,cAAc,CAC3B,KAAmC,EACnC,UAA6C;IAE7C,OAAO,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAC,aAAa,OAAK,KAAK,GAAI,CAAC;AACvE,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,EACxC,QAAQ,EACR,MAAM,EACN,KAAK,GAAG,QAAQ,EAChB,aAAa,GAAG,EAAE,EAClB,UAAU,GACiB;IAC3B,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,aAAa,EAAE,CAAC;IAE7C,OAAO,CACL,eAAM,SAAS,EAAC,mCAAmC,YAChD,MAAM,cAAc,CACnB;YACE,KAAK;YACL,WAAW,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC9D,KAAK;YACL,MAAM;YACN,aAAa;SACd,EACD,UAAU,CACX,GACI,CACR,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,EACxC,QAAQ,EACR,EAAE,EACF,MAAM,EACN,KAAK,GAAG,OAAO,EACf,aAAa,GAAG,EAAE,EAClB,UAAU,GACiB;IAC3B,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IAE/C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,QAAQ,EAAE,CAAC;IACb,CAAC;IAED,OAAO,CACL,eAAM,SAAS,EAAC,mCAAmC,YAChD,MAAM,cAAc,CACnB;YACE,KAAK;YACL,WAAW,EAAE;gBACX,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE;gBAC/C;oBACE,KAAK,EAAE,OAAO;oBACd,IAAI,EAAE,GAAG,KAAK,CAAC,QAAQ,IAAI,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE;iBAC5D;aACF;YACD,KAAK,EAAE,KAAsB;YAC7B,MAAM;YACN,aAAa;SACd,EACD,UAAU,CACX,GACI,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import type { CrudResource } from "next-headless-crud/core";
|
|
3
|
+
import type { CrudRouteListPageProps } from "next-headless-crud/next";
|
|
4
|
+
export type AdminCrudListLabels = {
|
|
5
|
+
create: string;
|
|
6
|
+
search: string;
|
|
7
|
+
searchPlaceholder: string;
|
|
8
|
+
all: string;
|
|
9
|
+
submit: string;
|
|
10
|
+
reset: string;
|
|
11
|
+
actions: string;
|
|
12
|
+
view: string;
|
|
13
|
+
edit: string;
|
|
14
|
+
empty: string;
|
|
15
|
+
total: (totalCount: number, page: number, pageCount: number) => string;
|
|
16
|
+
previous: string;
|
|
17
|
+
next: string;
|
|
18
|
+
};
|
|
19
|
+
export type AdminCrudListPageProps<TResource extends CrudResource = CrudResource> = CrudRouteListPageProps<TResource> & {
|
|
20
|
+
labels?: Partial<AdminCrudListLabels>;
|
|
21
|
+
renderValue?: (value: unknown, field: string) => ReactNode;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Renders a complete list page from a next-headless-crud list model.
|
|
25
|
+
*/
|
|
26
|
+
export declare function AdminCrudListPage<TResource extends CrudResource = CrudResource>({ resource, searchParams, labels: labelOverrides, renderValue, }: AdminCrudListPageProps<TResource>): Promise<import("react").JSX.Element>;
|
|
27
|
+
//# sourceMappingURL=admin-crud-list-page.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-crud-list-page.d.ts","sourceRoot":"","sources":["../../../src/crud/pages/admin-crud-list-page.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAKtE,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,CAAC;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC;IACvE,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,sBAAsB,CAAC,SAAS,SAAS,YAAY,GAAG,YAAY,IAC9E,sBAAsB,CAAC,SAAS,CAAC,GAAG;IAClC,MAAM,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACtC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,KAAK,SAAS,CAAC;CAC5D,CAAC;AAmBJ;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,SAAS,SAAS,YAAY,GAAG,YAAY,EAAE,EACrF,QAAQ,EACR,YAAY,EACZ,MAAM,EAAE,cAAc,EACtB,WAAgD,GACjD,EAAE,sBAAsB,CAAC,SAAS,CAAC,wCAmJnC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import Link from "next/link";
|
|
3
|
+
import { tableHref } from "next-headless-crud/query";
|
|
4
|
+
import { AdminPageHeader } from "../../header/admin-page-header.js";
|
|
5
|
+
import { formatAdminValue } from "./format-admin-value.js";
|
|
6
|
+
const defaultLabels = {
|
|
7
|
+
create: "새 글 등록",
|
|
8
|
+
search: "검색",
|
|
9
|
+
searchPlaceholder: "제목 또는 내용 검색",
|
|
10
|
+
all: "전체",
|
|
11
|
+
submit: "조회",
|
|
12
|
+
reset: "초기화",
|
|
13
|
+
actions: "관리",
|
|
14
|
+
view: "보기",
|
|
15
|
+
edit: "수정",
|
|
16
|
+
empty: "등록된 데이터가 없습니다.",
|
|
17
|
+
total: (totalCount, page, pageCount) => `총 ${totalCount.toLocaleString("ko-KR")}건 · ${page}/${Math.max(pageCount, 1)}페이지`,
|
|
18
|
+
previous: "이전",
|
|
19
|
+
next: "다음",
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Renders a complete list page from a next-headless-crud list model.
|
|
23
|
+
*/
|
|
24
|
+
export async function AdminCrudListPage({ resource, searchParams, labels: labelOverrides, renderValue = (value) => formatAdminValue(value), }) {
|
|
25
|
+
const labels = { ...defaultLabels, ...labelOverrides };
|
|
26
|
+
const model = await resource.list(await searchParams);
|
|
27
|
+
return (_jsxs("main", { className: "gw-admin-page", children: [_jsx(AdminPageHeader, { title: model.resource.label, actions: _jsx(Link, { href: `${model.basePath}/new`, className: "gw-admin-button gw-admin-button--primary", children: labels.create }) }), _jsxs("form", { action: model.basePath, method: "get", className: "gw-admin-search", children: [_jsxs("label", { className: "gw-admin-search__query", children: [_jsx("span", { className: "gw-admin-field__label", children: labels.search }), _jsx("input", { type: "search", name: "q", defaultValue: model.query.search, placeholder: labels.searchPlaceholder, className: "gw-admin-input" })] }), Object.values(model.filters).map((filter) => (_jsxs("label", { className: "gw-admin-search__filter", children: [_jsx("span", { className: "gw-admin-field__label", children: filter.label }), _jsxs("select", { name: filter.name, defaultValue: String(model.query.filters[filter.field] ?? ""), className: "gw-admin-input", children: [_jsx("option", { value: "", children: labels.all }), filter.values.map((option) => (_jsx("option", { value: String(option.value), children: option.label }, String(option.value))))] })] }, filter.field))), _jsx("input", { type: "hidden", name: "pageSize", value: model.query.pageSize }), _jsx("button", { type: "submit", className: "gw-admin-button gw-admin-button--muted", children: labels.submit }), _jsx(Link, { href: model.basePath, className: "gw-admin-button gw-admin-button--secondary", children: labels.reset })] }), _jsx("div", { className: "gw-admin-table-wrap", children: _jsxs("table", { className: "gw-admin-table", children: [_jsx("thead", { children: _jsxs("tr", { children: [model.columns.map((column) => (_jsx("th", { children: column.sort ? (_jsxs(Link, { href: column.sort.href, className: "gw-admin-table__sort", children: [column.label, _jsx("span", { "aria-hidden": "true", children: column.sort.direction === "asc"
|
|
28
|
+
? "↑"
|
|
29
|
+
: column.sort.direction === "desc"
|
|
30
|
+
? "↓"
|
|
31
|
+
: "↕" })] })) : (column.label) }, column.name))), _jsx("th", { children: labels.actions })] }) }), _jsxs("tbody", { children: [model.rows.map((row) => (_jsxs("tr", { children: [model.columns.map((column, columnIndex) => (_jsx("td", { children: columnIndex === 0 ? (_jsx(Link, { href: row.href, className: "gw-admin-table__primary-link", children: renderValue(row.data[column.name], column.name) })) : (_jsx("span", { className: "gw-admin-table__value", children: renderValue(row.data[column.name], column.name) })) }, column.name))), _jsx("td", { children: _jsxs("div", { className: "gw-admin-table__actions", children: [_jsx(Link, { href: row.href, children: labels.view }), _jsx(Link, { href: row.editHref, children: labels.edit })] }) })] }, row.id))), model.rows.length === 0 && (_jsx("tr", { children: _jsx("td", { colSpan: model.columns.length + 1, className: "gw-admin-table__empty", children: labels.empty }) }))] })] }) }), _jsxs("footer", { className: "gw-admin-pagination", children: [_jsx("p", { children: labels.total(model.pagination.totalCount, model.pagination.page, model.pagination.pageCount) }), _jsxs("nav", { className: "gw-admin-pagination__navigation", "aria-label": "\uAC8C\uC2DC\uD310 \uD398\uC774\uC9C0 \uC774\uB3D9", children: [model.pagination.hasPreviousPage ? (_jsx(Link, { href: tableHref(model, { page: model.query.page - 1 }), className: "gw-admin-button gw-admin-button--secondary", children: labels.previous })) : (_jsx("span", { className: "gw-admin-button gw-admin-button--disabled", children: labels.previous })), model.pagination.hasNextPage ? (_jsx(Link, { href: tableHref(model, { page: model.query.page + 1 }), className: "gw-admin-button gw-admin-button--secondary", children: labels.next })) : (_jsx("span", { className: "gw-admin-button gw-admin-button--disabled", children: labels.next }))] })] })] }));
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=admin-crud-list-page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-crud-list-page.js","sourceRoot":"","sources":["../../../src/crud/pages/admin-crud-list-page.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { CrudAction } from "next-headless-crud/core";
|
|
2
|
+
export type AdminDeleteFormProps = {
|
|
3
|
+
action: CrudAction;
|
|
4
|
+
label?: string;
|
|
5
|
+
pendingLabel?: string;
|
|
6
|
+
confirmMessage?: string;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Runs a headless CRUD delete action after explicit confirmation.
|
|
10
|
+
*/
|
|
11
|
+
export declare function AdminDeleteForm({ action, label, pendingLabel, confirmMessage, }: AdminDeleteFormProps): import("react").JSX.Element;
|
|
12
|
+
//# sourceMappingURL=admin-delete-form.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-delete-form.d.ts","sourceRoot":"","sources":["../../../src/crud/pages/admin-delete-form.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE1D,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,KAAY,EACZ,YAAwB,EACxB,cAAmD,GACpD,EAAE,oBAAoB,+BA0BtB"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useActionState } from "react";
|
|
4
|
+
/**
|
|
5
|
+
* Runs a headless CRUD delete action after explicit confirmation.
|
|
6
|
+
*/
|
|
7
|
+
export function AdminDeleteForm({ action, label = "삭제", pendingLabel = "삭제 중...", confirmMessage = "이 데이터를 삭제할까요? 삭제 후에는 복구할 수 없습니다.", }) {
|
|
8
|
+
const [state, formAction, pending] = useActionState(action, undefined);
|
|
9
|
+
return (_jsxs("form", { action: formAction, onSubmit: (event) => {
|
|
10
|
+
if (!window.confirm(confirmMessage)) {
|
|
11
|
+
event.preventDefault();
|
|
12
|
+
}
|
|
13
|
+
}, children: [state && !state.success && (_jsx("p", { role: "alert", className: "gw-admin-field-error", children: state.error.message })), _jsx("button", { type: "submit", disabled: pending, className: "gw-admin-button gw-admin-button--danger", children: pending ? pendingLabel : label })] }));
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=admin-delete-form.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-delete-form.js","sourceRoot":"","sources":["../../../src/crud/pages/admin-delete-form.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAUvC;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,EAC9B,MAAM,EACN,KAAK,GAAG,IAAI,EACZ,YAAY,GAAG,SAAS,EACxB,cAAc,GAAG,kCAAkC,GAC9B;IACrB,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAEvE,OAAO,CACL,gBACE,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;YAClB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;gBACpC,KAAK,CAAC,cAAc,EAAE,CAAC;YACzB,CAAC;QACH,CAAC,aAEA,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAC1B,YAAG,IAAI,EAAC,OAAO,EAAC,SAAS,EAAC,sBAAsB,YAC7C,KAAK,CAAC,KAAK,CAAC,OAAO,GAClB,CACL,EACD,iBACE,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,OAAO,EACjB,SAAS,EAAC,yCAAyC,YAElD,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,GACxB,IACJ,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-admin-value.d.ts","sourceRoot":"","sources":["../../../src/crud/pages/format-admin-value.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,OAAO,EACd,MAAM,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAiB,UAiCzD"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
const defaultLabels = {
|
|
2
|
+
draft: "비공개",
|
|
3
|
+
published: "공개",
|
|
4
|
+
pending: "답변 대기",
|
|
5
|
+
answered: "답변 완료",
|
|
6
|
+
closed: "종결",
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Formats common CRUD values for Korean administration screens.
|
|
10
|
+
*/
|
|
11
|
+
export function formatAdminValue(value, labels = defaultLabels) {
|
|
12
|
+
if (value === null || value === undefined || value === "") {
|
|
13
|
+
return "—";
|
|
14
|
+
}
|
|
15
|
+
if (typeof value === "boolean") {
|
|
16
|
+
return value ? "예" : "아니오";
|
|
17
|
+
}
|
|
18
|
+
if (value instanceof Date) {
|
|
19
|
+
return new Intl.DateTimeFormat("ko-KR", {
|
|
20
|
+
dateStyle: "medium",
|
|
21
|
+
timeStyle: "short",
|
|
22
|
+
}).format(value);
|
|
23
|
+
}
|
|
24
|
+
if (typeof value === "string") {
|
|
25
|
+
if (labels[value]) {
|
|
26
|
+
return labels[value];
|
|
27
|
+
}
|
|
28
|
+
const date = new Date(value);
|
|
29
|
+
if (/^\d{4}-\d{2}-\d{2}T/.test(value) && !Number.isNaN(date.valueOf())) {
|
|
30
|
+
return new Intl.DateTimeFormat("ko-KR", {
|
|
31
|
+
dateStyle: "medium",
|
|
32
|
+
timeStyle: "short",
|
|
33
|
+
}).format(date);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return String(value);
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=format-admin-value.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-admin-value.js","sourceRoot":"","sources":["../../../src/crud/pages/format-admin-value.ts"],"names":[],"mappings":"AAAA,MAAM,aAAa,GAA2B;IAC5C,KAAK,EAAE,KAAK;IACZ,SAAS,EAAE,IAAI;IACf,OAAO,EAAE,OAAO;IAChB,QAAQ,EAAE,OAAO;IACjB,MAAM,EAAE,IAAI;CACb,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,KAAc,EACd,SAA2C,aAAa;IAExD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;QAC1D,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;IAC7B,CAAC;IAED,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;QAC1B,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;YACtC,SAAS,EAAE,QAAQ;YACnB,SAAS,EAAE,OAAO;SACnB,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAClB,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;QAE7B,IAAI,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;YACvE,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;gBACtC,SAAS,EAAE,QAAQ;gBACnB,SAAS,EAAE,OAAO;aACnB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { AdminCrudListPage, type AdminCrudListLabels, type AdminCrudListPageProps, } from "./admin-crud-list-page.js";
|
|
2
|
+
export { AdminCrudDetailPage, type AdminCrudDetailActionContext, type AdminCrudDetailFieldContext, type AdminCrudDetailPageProps, } from "./admin-crud-detail-page.js";
|
|
3
|
+
export { AdminCrudCreatePage, AdminCrudUpdatePage, type AdminCrudCreatePageOptions, type AdminCrudFormPageRenderProps, type AdminCrudFormRenderer, type AdminCrudUpdatePageOptions, } from "./admin-crud-form-pages.js";
|
|
4
|
+
export { AdminDeleteForm, type AdminDeleteFormProps } from "./admin-delete-form.js";
|
|
5
|
+
export { formatAdminValue } from "./format-admin-value.js";
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/crud/pages/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,GAC5B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,mBAAmB,EACnB,KAAK,4BAA4B,EACjC,KAAK,2BAA2B,EAChC,KAAK,wBAAwB,GAC9B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,KAAK,0BAA0B,EAC/B,KAAK,4BAA4B,EACjC,KAAK,qBAAqB,EAC1B,KAAK,0BAA0B,GAChC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACpF,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { AdminCrudListPage, } from "./admin-crud-list-page.js";
|
|
2
|
+
export { AdminCrudDetailPage, } from "./admin-crud-detail-page.js";
|
|
3
|
+
export { AdminCrudCreatePage, AdminCrudUpdatePage, } from "./admin-crud-form-pages.js";
|
|
4
|
+
export { AdminDeleteForm } from "./admin-delete-form.js";
|
|
5
|
+
export { formatAdminValue } from "./format-admin-value.js";
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/crud/pages/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,GAGlB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,mBAAmB,GAIpB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,mBAAmB,EACnB,mBAAmB,GAKpB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,eAAe,EAA6B,MAAM,wBAAwB,CAAC;AACpF,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/crud/preset/client.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,mBAAmB,EACnB,KAAK,yBAAyB,EAC9B,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,0BAA0B,GAChC,MAAM,6BAA6B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/crud/preset/client.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EACL,mBAAmB,GAKpB,MAAM,6BAA6B,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { ComponentType, ReactNode } from "react";
|
|
2
|
+
import { type AdminFileAttachmentLabels, type AdminFileUploader, type AdminUploadedFile } from "../../attachments/index.js";
|
|
3
|
+
import { type AdminRichTextEditorProps } from "../../rich-text/index.js";
|
|
4
|
+
import { type AdminCrudFieldRenderContext, type AdminCrudFormLabels } from "../form/index.js";
|
|
5
|
+
import type { AdminCrudFormPageRenderProps } from "../pages/admin-crud-form-pages.js";
|
|
6
|
+
export type AdminCrudPresetFormProps = AdminCrudFormPageRenderProps & {
|
|
7
|
+
attachments?: readonly AdminUploadedFile[];
|
|
8
|
+
};
|
|
9
|
+
export type AdminCrudAttachmentPreset = {
|
|
10
|
+
field?: string;
|
|
11
|
+
maxFiles?: number;
|
|
12
|
+
maxFileSize?: number;
|
|
13
|
+
accept?: string;
|
|
14
|
+
concurrency?: number;
|
|
15
|
+
labels?: Partial<AdminFileAttachmentLabels>;
|
|
16
|
+
};
|
|
17
|
+
export type AdminCrudRichTextPreset = {
|
|
18
|
+
fields?: readonly string[];
|
|
19
|
+
placeholders?: Readonly<Record<string, string>>;
|
|
20
|
+
nodes?: AdminRichTextEditorProps<Record<string, unknown>>["nodes"];
|
|
21
|
+
marks?: AdminRichTextEditorProps<Record<string, unknown>>["marks"];
|
|
22
|
+
toolbar?: AdminRichTextEditorProps<Record<string, unknown>>["toolbar"];
|
|
23
|
+
};
|
|
24
|
+
export type CreateAdminCrudFormOptions = {
|
|
25
|
+
upload?: AdminFileUploader;
|
|
26
|
+
attachments?: AdminCrudAttachmentPreset | false;
|
|
27
|
+
richText?: AdminCrudRichTextPreset | false;
|
|
28
|
+
hiddenFields?: readonly string[];
|
|
29
|
+
hiddenFieldsByPath?: Readonly<Record<string, readonly string[]>>;
|
|
30
|
+
textareaFields?: readonly string[];
|
|
31
|
+
textareaFieldsByPath?: Readonly<Record<string, readonly string[]>>;
|
|
32
|
+
createDefaults?: Readonly<Record<string, unknown>>;
|
|
33
|
+
labels?: Partial<AdminCrudFormLabels>;
|
|
34
|
+
renderField?: (context: AdminCrudFieldRenderContext) => ReactNode | undefined;
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Creates one reusable Client Component that applies the same field, upload,
|
|
38
|
+
* and editor conventions to every CRUD resource in an application.
|
|
39
|
+
*/
|
|
40
|
+
export declare function createAdminCrudForm(options?: CreateAdminCrudFormOptions): ComponentType<AdminCrudPresetFormProps>;
|
|
41
|
+
//# sourceMappingURL=create-admin-crud-form.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-admin-crud-form.d.ts","sourceRoot":"","sources":["../../../src/crud/preset/create-admin-crud-form.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,EAEL,KAAK,yBAAyB,EAC9B,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACvB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAIL,KAAK,wBAAwB,EAC9B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAGL,KAAK,2BAA2B,EAChC,KAAK,mBAAmB,EACzB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;AAEtF,MAAM,MAAM,wBAAwB,GAAG,4BAA4B,GAAG;IACpE,WAAW,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;CAC5C,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC,yBAAyB,CAAC,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,YAAY,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAChD,KAAK,CAAC,EAAE,wBAAwB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACnE,KAAK,CAAC,EAAE,wBAAwB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACnE,OAAO,CAAC,EAAE,wBAAwB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;CACxE,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,WAAW,CAAC,EAAE,yBAAyB,GAAG,KAAK,CAAC;IAChD,QAAQ,CAAC,EAAE,uBAAuB,GAAG,KAAK,CAAC;IAC3C,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,kBAAkB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC;IACjE,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,oBAAoB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC;IACnE,cAAc,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACnD,MAAM,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACtC,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,2BAA2B,KAAK,SAAS,GAAG,SAAS,CAAC;CAC/E,CAAC;AAcF;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,GAAE,0BAA+B,GACvC,aAAa,CAAC,wBAAwB,CAAC,CA2GzC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { AdminFileAttachments, } from "../../attachments/index.js";
|
|
4
|
+
import { AdminRichTextEditor, adminRichTextNodes, createAdminRichTextUploadAdapter, } from "../../rich-text/index.js";
|
|
5
|
+
import { AdminCrudForm, } from "../form/index.js";
|
|
6
|
+
const defaultRichTextFields = ["content", "replyContent"];
|
|
7
|
+
function addFieldModes(target, fields, mode) {
|
|
8
|
+
for (const field of fields ?? []) {
|
|
9
|
+
target[field] = mode;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Creates one reusable Client Component that applies the same field, upload,
|
|
14
|
+
* and editor conventions to every CRUD resource in an application.
|
|
15
|
+
*/
|
|
16
|
+
export function createAdminCrudForm(options = {}) {
|
|
17
|
+
const attachmentOptions = options.attachments === false ? undefined : options.attachments;
|
|
18
|
+
const attachmentField = attachmentOptions?.field ?? "attachmentFileIds";
|
|
19
|
+
const richTextOptions = options.richText === false ? undefined : options.richText ?? {};
|
|
20
|
+
const richTextFields = new Set(richTextOptions?.fields ?? defaultRichTextFields);
|
|
21
|
+
const editorUpload = options.upload
|
|
22
|
+
? createAdminRichTextUploadAdapter(async (file, context) => options.upload(file, context))
|
|
23
|
+
: undefined;
|
|
24
|
+
return function ConfiguredAdminCrudForm({ title, breadcrumbs, model, action, initialValues = {}, attachments = [], }) {
|
|
25
|
+
const fieldModes = {};
|
|
26
|
+
addFieldModes(fieldModes, options.hiddenFields, "hidden");
|
|
27
|
+
addFieldModes(fieldModes, options.hiddenFieldsByPath?.[model.basePath], "hidden");
|
|
28
|
+
addFieldModes(fieldModes, options.textareaFields, "textarea");
|
|
29
|
+
addFieldModes(fieldModes, options.textareaFieldsByPath?.[model.basePath], "textarea");
|
|
30
|
+
const resolvedInitialValues = { ...initialValues };
|
|
31
|
+
if (!model.row) {
|
|
32
|
+
for (const [name, value] of Object.entries(options.createDefaults ?? {})) {
|
|
33
|
+
if (model.fields.some((field) => field.name === name)) {
|
|
34
|
+
resolvedInitialValues[name] = value;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (model.fields.some(({ name }) => name === attachmentField)) {
|
|
39
|
+
resolvedInitialValues[attachmentField] = attachments.map((file) => file.id);
|
|
40
|
+
}
|
|
41
|
+
const formKey = `${model.basePath}:${model.mode}:${String(model.row?.id ?? "new")}`;
|
|
42
|
+
return (_jsx(AdminCrudForm, { title: title, ...(breadcrumbs ? { breadcrumbs } : {}), model: model, action: action, initialValues: resolvedInitialValues, fieldModes: fieldModes, ...(options.labels ? { labels: options.labels } : {}), renderField: (context) => {
|
|
43
|
+
const customField = options.renderField?.(context);
|
|
44
|
+
if (customField !== undefined) {
|
|
45
|
+
return customField;
|
|
46
|
+
}
|
|
47
|
+
if (context.field.name === attachmentField && options.upload) {
|
|
48
|
+
return (_jsx(AdminFileAttachments, { store: context.store, name: context.field.name, uploader: options.upload, initialFiles: attachments, onUploadingChange: context.setUploading, ...(typeof attachmentOptions?.maxFiles === "number"
|
|
49
|
+
? { maxFiles: attachmentOptions.maxFiles }
|
|
50
|
+
: {}), ...(typeof attachmentOptions?.maxFileSize === "number"
|
|
51
|
+
? { maxFileSize: attachmentOptions.maxFileSize }
|
|
52
|
+
: {}), ...(attachmentOptions?.accept ? { accept: attachmentOptions.accept } : {}), ...(typeof attachmentOptions?.concurrency === "number"
|
|
53
|
+
? { concurrency: attachmentOptions.concurrency }
|
|
54
|
+
: {}), ...(attachmentOptions?.labels ? { labels: attachmentOptions.labels } : {}) }));
|
|
55
|
+
}
|
|
56
|
+
if (richTextOptions && richTextFields.has(context.field.name)) {
|
|
57
|
+
return (_jsx(AdminRichTextEditor, { store: context.store, name: context.field.name, placeholder: richTextOptions.placeholders?.[context.field.name] ??
|
|
58
|
+
(context.field.name === "replyContent"
|
|
59
|
+
? "답변 내용을 입력해 주세요."
|
|
60
|
+
: "내용을 입력해 주세요."), invalid: Boolean(context.error), ...(context.error ? { describedBy: context.errorId } : {}), nodes: richTextOptions.nodes ?? adminRichTextNodes, ...(richTextOptions.marks ? { marks: richTextOptions.marks } : {}), ...(richTextOptions.toolbar !== undefined
|
|
61
|
+
? { toolbar: richTextOptions.toolbar }
|
|
62
|
+
: {}), ...(editorUpload ? { upload: editorUpload } : {}) }));
|
|
63
|
+
}
|
|
64
|
+
return undefined;
|
|
65
|
+
} }, formKey));
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=create-admin-crud-form.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-admin-crud-form.js","sourceRoot":"","sources":["../../../src/crud/preset/create-admin-crud-form.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAGb,OAAO,EACL,oBAAoB,GAIrB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,gCAAgC,GAEjC,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,aAAa,GAId,MAAM,kBAAkB,CAAC;AAqC1B,MAAM,qBAAqB,GAAG,CAAC,SAAS,EAAE,cAAc,CAAU,CAAC;AAEnE,SAAS,aAAa,CACpB,MAA0C,EAC1C,MAAqC,EACrC,IAAwB;IAExB,KAAK,MAAM,KAAK,IAAI,MAAM,IAAI,EAAE,EAAE,CAAC;QACjC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;IACvB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,UAAsC,EAAE;IAExC,MAAM,iBAAiB,GAAG,OAAO,CAAC,WAAW,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;IAC1F,MAAM,eAAe,GAAG,iBAAiB,EAAE,KAAK,IAAI,mBAAmB,CAAC;IACxE,MAAM,eAAe,GAAG,OAAO,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;IACxF,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,eAAe,EAAE,MAAM,IAAI,qBAAqB,CAAC,CAAC;IACjF,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM;QACjC,CAAC,CAAC,gCAAgC,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC3F,CAAC,CAAC,SAAS,CAAC;IAEd,OAAO,SAAS,uBAAuB,CAAC,EACtC,KAAK,EACL,WAAW,EACX,KAAK,EACL,MAAM,EACN,aAAa,GAAG,EAAE,EAClB,WAAW,GAAG,EAAE,GACS;QACzB,MAAM,UAAU,GAAuC,EAAE,CAAC;QAC1D,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QAC1D,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,kBAAkB,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;QAClF,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;QAC9D,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,oBAAoB,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC,CAAC;QAEtF,MAAM,qBAAqB,GAA4B,EAAE,GAAG,aAAa,EAAE,CAAC;QAE5E,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;YACf,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,IAAI,EAAE,CAAC,EAAE,CAAC;gBACzE,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;oBACtD,qBAAqB,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;gBACtC,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,KAAK,eAAe,CAAC,EAAE,CAAC;YAC9D,qBAAqB,CAAC,eAAe,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC9E,CAAC;QAED,MAAM,OAAO,GAAG,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,IAAI,KAAK,CAAC,EAAE,CAAC;QAEpF,OAAO,CACL,KAAC,aAAa,IAEZ,KAAK,EAAE,KAAK,KACR,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EACxC,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,qBAAqB,EACpC,UAAU,EAAE,UAAU,KAClB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EACtD,WAAW,EAAE,CAAC,OAAO,EAAE,EAAE;gBACvB,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,CAAC;gBAEnD,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;oBAC9B,OAAO,WAAW,CAAC;gBACrB,CAAC;gBAED,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,eAAe,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;oBAC7D,OAAO,CACL,KAAC,oBAAoB,IACnB,KAAK,EAAE,OAAO,CAAC,KAAK,EACpB,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,EACxB,QAAQ,EAAE,OAAO,CAAC,MAAM,EACxB,YAAY,EAAE,WAAW,EACzB,iBAAiB,EAAE,OAAO,CAAC,YAAY,KACnC,CAAC,OAAO,iBAAiB,EAAE,QAAQ,KAAK,QAAQ;4BAClD,CAAC,CAAC,EAAE,QAAQ,EAAE,iBAAiB,CAAC,QAAQ,EAAE;4BAC1C,CAAC,CAAC,EAAE,CAAC,KACH,CAAC,OAAO,iBAAiB,EAAE,WAAW,KAAK,QAAQ;4BACrD,CAAC,CAAC,EAAE,WAAW,EAAE,iBAAiB,CAAC,WAAW,EAAE;4BAChD,CAAC,CAAC,EAAE,CAAC,KACH,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,iBAAiB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KACvE,CAAC,OAAO,iBAAiB,EAAE,WAAW,KAAK,QAAQ;4BACrD,CAAC,CAAC,EAAE,WAAW,EAAE,iBAAiB,CAAC,WAAW,EAAE;4BAChD,CAAC,CAAC,EAAE,CAAC,KACH,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,iBAAiB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAC3E,CACH,CAAC;gBACJ,CAAC;gBAED,IAAI,eAAe,IAAI,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC9D,OAAO,CACL,KAAC,mBAAmB,IAClB,KAAK,EAAE,OAAO,CAAC,KAAK,EACpB,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,EACxB,WAAW,EACT,eAAe,CAAC,YAAY,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;4BAClD,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,cAAc;gCACpC,CAAC,CAAC,iBAAiB;gCACnB,CAAC,CAAC,cAAc,CAAC,EAErB,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAC3B,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAC3D,KAAK,EAAE,eAAe,CAAC,KAAK,IAAI,kBAAkB,KAC9C,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAC/D,CAAC,eAAe,CAAC,OAAO,KAAK,SAAS;4BACxC,CAAC,CAAC,EAAE,OAAO,EAAE,eAAe,CAAC,OAAO,EAAE;4BACtC,CAAC,CAAC,EAAE,CAAC,KACH,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAClD,CACH,CAAC;gBACJ,CAAC;gBAED,OAAO,SAAS,CAAC;YACnB,CAAC,IA9DI,OAAO,CA+DZ,CACH,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import "server-only";
|
|
2
|
+
import type { ComponentType, ReactNode } from "react";
|
|
3
|
+
import type { CrudRouteDefinition } from "next-headless-crud/next";
|
|
4
|
+
import { type AdminUploadedFile } from "../../attachments/index.js";
|
|
5
|
+
import type { AdminCrudPresetFormProps } from "./create-admin-crud-form.js";
|
|
6
|
+
type AdminCrudPages = CrudRouteDefinition["pages"];
|
|
7
|
+
export type AdminFileResolver = (value: unknown) => Promise<readonly AdminUploadedFile[]>;
|
|
8
|
+
export type CreateAdminCrudPagesOptions = {
|
|
9
|
+
form: ComponentType<AdminCrudPresetFormProps>;
|
|
10
|
+
resolveFiles?: AdminFileResolver;
|
|
11
|
+
attachmentField?: string;
|
|
12
|
+
richTextFields?: readonly string[];
|
|
13
|
+
longTextFields?: readonly string[];
|
|
14
|
+
hiddenDetailFields?: readonly string[];
|
|
15
|
+
renderDetailField?: (context: {
|
|
16
|
+
field: {
|
|
17
|
+
name: string;
|
|
18
|
+
};
|
|
19
|
+
value: unknown;
|
|
20
|
+
row: Record<string, unknown>;
|
|
21
|
+
}) => ReactNode | Promise<ReactNode | undefined> | undefined;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Creates the conventional list, create, detail, and update page set once.
|
|
25
|
+
* Spread the returned object and replace any page to opt out per resource.
|
|
26
|
+
*/
|
|
27
|
+
export declare function createAdminCrudPages({ form: Form, resolveFiles, attachmentField, richTextFields, longTextFields, hiddenDetailFields, renderDetailField, }: CreateAdminCrudPagesOptions): AdminCrudPages;
|
|
28
|
+
export {};
|
|
29
|
+
//# sourceMappingURL=create-admin-crud-pages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-admin-crud-pages.d.ts","sourceRoot":"","sources":["../../../src/crud/preset/create-admin-crud-pages.tsx"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAC;AAErB,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,KAAK,EAEV,mBAAmB,EAGpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAuB,KAAK,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAEzF,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAQ5E,KAAK,cAAc,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAEnD,MAAM,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,SAAS,iBAAiB,EAAE,CAAC,CAAC;AAE1F,MAAM,MAAM,2BAA2B,GAAG;IACxC,IAAI,EAAE,aAAa,CAAC,wBAAwB,CAAC,CAAC;IAC9C,YAAY,CAAC,EAAE,iBAAiB,CAAC;IACjC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,iBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE;QAC5B,KAAK,EAAE;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC;QACxB,KAAK,EAAE,OAAO,CAAC;QACf,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAC9B,KAAK,SAAS,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC;CAC9D,CAAC;AAKF;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,IAAI,EAAE,IAAI,EACV,YAAY,EACZ,eAAqC,EACrC,cAAsC,EACtC,cAAsC,EACtC,kBAAuB,EACvB,iBAAiB,GAClB,EAAE,2BAA2B,GAAG,cAAc,CA+D9C"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import "server-only";
|
|
3
|
+
import { AdminAttachmentList } from "../../attachments/index.js";
|
|
4
|
+
import { AdminRichTextView } from "../../rich-text/index.js";
|
|
5
|
+
import { AdminCrudDetailPage } from "../pages/admin-crud-detail-page.js";
|
|
6
|
+
import { AdminCrudCreatePage, AdminCrudUpdatePage, } from "../pages/admin-crud-form-pages.js";
|
|
7
|
+
import { AdminCrudListPage } from "../pages/admin-crud-list-page.js";
|
|
8
|
+
const defaultRichTextFields = ["content", "replyContent"];
|
|
9
|
+
const defaultLongTextFields = ["content", "replyContent", "summary", "description"];
|
|
10
|
+
/**
|
|
11
|
+
* Creates the conventional list, create, detail, and update page set once.
|
|
12
|
+
* Spread the returned object and replace any page to opt out per resource.
|
|
13
|
+
*/
|
|
14
|
+
export function createAdminCrudPages({ form: Form, resolveFiles, attachmentField = "attachmentFileIds", richTextFields = defaultRichTextFields, longTextFields = defaultLongTextFields, hiddenDetailFields = [], renderDetailField, }) {
|
|
15
|
+
const richText = new Set(richTextFields);
|
|
16
|
+
function CreatePage(props) {
|
|
17
|
+
return (_jsx(AdminCrudCreatePage, { ...props, renderForm: (formProps) => _jsx(Form, { ...formProps, attachments: [] }) }));
|
|
18
|
+
}
|
|
19
|
+
function UpdatePage(props) {
|
|
20
|
+
return (_jsx(AdminCrudUpdatePage, { ...props, renderForm: async (formProps) => (_jsx(Form, { ...formProps, attachments: resolveFiles
|
|
21
|
+
? await resolveFiles(formProps.model.row?.[attachmentField])
|
|
22
|
+
: [] })) }));
|
|
23
|
+
}
|
|
24
|
+
function DetailPage(props) {
|
|
25
|
+
return (_jsx(AdminCrudDetailPage, { ...props, hiddenFields: hiddenDetailFields, longTextFields: longTextFields, renderField: async (context) => {
|
|
26
|
+
const customValue = await renderDetailField?.(context);
|
|
27
|
+
if (customValue !== undefined) {
|
|
28
|
+
return customValue;
|
|
29
|
+
}
|
|
30
|
+
if (context.field.name === attachmentField && resolveFiles) {
|
|
31
|
+
return _jsx(AdminAttachmentList, { files: await resolveFiles(context.value) });
|
|
32
|
+
}
|
|
33
|
+
if (richText.has(context.field.name) && typeof context.value === "string") {
|
|
34
|
+
return _jsx(AdminRichTextView, { value: context.value });
|
|
35
|
+
}
|
|
36
|
+
return undefined;
|
|
37
|
+
} }));
|
|
38
|
+
}
|
|
39
|
+
return {
|
|
40
|
+
list: AdminCrudListPage,
|
|
41
|
+
create: CreatePage,
|
|
42
|
+
detail: DetailPage,
|
|
43
|
+
update: UpdatePage,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=create-admin-crud-pages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-admin-crud-pages.js","sourceRoot":"","sources":["../../../src/crud/preset/create-admin-crud-pages.tsx"],"names":[],"mappings":";AAAA,OAAO,aAAa,CAAC;AASrB,OAAO,EAAE,mBAAmB,EAA0B,MAAM,4BAA4B,CAAC;AACzF,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EACL,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAoBrE,MAAM,qBAAqB,GAAG,CAAC,SAAS,EAAE,cAAc,CAAU,CAAC;AACnE,MAAM,qBAAqB,GAAG,CAAC,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,aAAa,CAAU,CAAC;AAE7F;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,EACnC,IAAI,EAAE,IAAI,EACV,YAAY,EACZ,eAAe,GAAG,mBAAmB,EACrC,cAAc,GAAG,qBAAqB,EACtC,cAAc,GAAG,qBAAqB,EACtC,kBAAkB,GAAG,EAAE,EACvB,iBAAiB,GACW;IAC5B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,CAAC;IAEzC,SAAS,UAAU,CAAC,KAA+B;QACjD,OAAO,CACL,KAAC,mBAAmB,OACd,KAAK,EACT,UAAU,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,KAAC,IAAI,OAAK,SAAS,EAAE,WAAW,EAAE,EAAE,GAAI,GACnE,CACH,CAAC;IACJ,CAAC;IAED,SAAS,UAAU,CAAC,KAA+B;QACjD,OAAO,CACL,KAAC,mBAAmB,OACd,KAAK,EACT,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,CAC/B,KAAC,IAAI,OACC,SAAS,EACb,WAAW,EACT,YAAY;oBACV,CAAC,CAAC,MAAM,YAAY,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,CAAC;oBAC5D,CAAC,CAAC,EAAE,GAER,CACH,GACD,CACH,CAAC;IACJ,CAAC;IAED,SAAS,UAAU,CAAC,KAA+B;QACjD,OAAO,CACL,KAAC,mBAAmB,OACd,KAAK,EACT,YAAY,EAAE,kBAAkB,EAChC,cAAc,EAAE,cAAc,EAC9B,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;gBAC7B,MAAM,WAAW,GAAG,MAAM,iBAAiB,EAAE,CAAC,OAAO,CAAC,CAAC;gBAEvD,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;oBAC9B,OAAO,WAAW,CAAC;gBACrB,CAAC;gBAED,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,eAAe,IAAI,YAAY,EAAE,CAAC;oBAC3D,OAAO,KAAC,mBAAmB,IAAC,KAAK,EAAE,MAAM,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,GAAI,CAAC;gBAC3E,CAAC;gBAED,IAAI,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;oBAC1E,OAAO,KAAC,iBAAiB,IAAC,KAAK,EAAE,OAAO,CAAC,KAAK,GAAI,CAAC;gBACrD,CAAC;gBAED,OAAO,SAAS,CAAC;YACnB,CAAC,GACD,CACH,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,iBAAiB;QACvB,MAAM,EAAE,UAAU;QAClB,MAAM,EAAE,UAAU;QAClB,MAAM,EAAE,UAAU;KACnB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import "server-only";
|
|
2
|
+
import { type AnyCrudRouteDefinition, type CrudCatchAllPageProps } from "next-headless-crud/next";
|
|
3
|
+
type AdminCrudPages = AnyCrudRouteDefinition["pages"];
|
|
4
|
+
export type AdminCrudRouteInput = Omit<AnyCrudRouteDefinition, "pages"> & {
|
|
5
|
+
pages?: Partial<AdminCrudPages>;
|
|
6
|
+
};
|
|
7
|
+
export type CreateAdminCrudRoutePageOptions = {
|
|
8
|
+
routes: readonly AdminCrudRouteInput[];
|
|
9
|
+
pages: AdminCrudPages;
|
|
10
|
+
pathPrefix?: string | readonly string[];
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Creates a Next.js catch-all page from resource/action pairs and one shared
|
|
14
|
+
* page preset. A route can replace any individual page through `pages`.
|
|
15
|
+
*/
|
|
16
|
+
export declare function createAdminCrudRoutePage({ routes, pages, pathPrefix, }: CreateAdminCrudRoutePageOptions): ({ params, searchParams, }: CrudCatchAllPageProps) => Promise<import("react").FunctionComponentElement<import("next-headless-crud/next").CrudRouteListPageProps<any>> | import("react").FunctionComponentElement<import("next-headless-crud/next").CrudRouteCreatePageProps<any>> | import("react").FunctionComponentElement<import("next-headless-crud/next").CrudRouteDetailPageProps<any>>>;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=create-admin-crud-route-page.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-admin-crud-route-page.d.ts","sourceRoot":"","sources":["../../../src/crud/preset/create-admin-crud-route-page.tsx"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAC;AAErB,OAAO,EAGL,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC3B,MAAM,yBAAyB,CAAC;AAEjC,KAAK,cAAc,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAEtD,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,sBAAsB,EAAE,OAAO,CAAC,GAAG;IACxE,KAAK,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,+BAA+B,GAAG;IAC5C,MAAM,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACvC,KAAK,EAAE,cAAc,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;CACzC,CAAC;AAOF;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,EACvC,MAAM,EACN,KAAK,EACL,UAAU,GACX,EAAE,+BAA+B,IAUY,2BAGzC,qBAAqB,8UAQzB"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import "server-only";
|
|
2
|
+
import { createCrudRoutePage, defineCrudRoute, } from "next-headless-crud/next";
|
|
3
|
+
function normalizePathPrefix(pathPrefix) {
|
|
4
|
+
const values = typeof pathPrefix === "string" ? pathPrefix.split("/") : pathPrefix ?? [];
|
|
5
|
+
return values.filter(Boolean);
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Creates a Next.js catch-all page from resource/action pairs and one shared
|
|
9
|
+
* page preset. A route can replace any individual page through `pages`.
|
|
10
|
+
*/
|
|
11
|
+
export function createAdminCrudRoutePage({ routes, pages, pathPrefix, }) {
|
|
12
|
+
const definitions = routes.map((route) => defineCrudRoute({
|
|
13
|
+
...route,
|
|
14
|
+
pages: { ...pages, ...route.pages },
|
|
15
|
+
}));
|
|
16
|
+
const render = createCrudRoutePage(definitions);
|
|
17
|
+
const prefix = normalizePathPrefix(pathPrefix);
|
|
18
|
+
return async function AdminCrudCatchAllPage({ params, searchParams, }) {
|
|
19
|
+
const { path } = await params;
|
|
20
|
+
return render({
|
|
21
|
+
params: Promise.resolve({ path: [...prefix, ...path] }),
|
|
22
|
+
searchParams,
|
|
23
|
+
});
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=create-admin-crud-route-page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-admin-crud-route-page.js","sourceRoot":"","sources":["../../../src/crud/preset/create-admin-crud-route-page.tsx"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAC;AAErB,OAAO,EACL,mBAAmB,EACnB,eAAe,GAGhB,MAAM,yBAAyB,CAAC;AAcjC,SAAS,mBAAmB,CAAC,UAAkD;IAC7E,MAAM,MAAM,GAAG,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC;IACzF,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,EACvC,MAAM,EACN,KAAK,EACL,UAAU,GACsB;IAChC,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACvC,eAAe,CAAC;QACd,GAAG,KAAK;QACR,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE;KACpC,CAAC,CACH,CAAC;IACF,MAAM,MAAM,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAE/C,OAAO,KAAK,UAAU,qBAAqB,CAAC,EAC1C,MAAM,EACN,YAAY,GACU;QACtB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC;QAE9B,OAAO,MAAM,CAAC;YACZ,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;YACvD,YAAY;SACb,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { createAdminCrudPages, type AdminFileResolver, type CreateAdminCrudPagesOptions, } from "./create-admin-crud-pages.js";
|
|
2
|
+
export { createAdminCrudRoutePage, type AdminCrudRouteInput, type CreateAdminCrudRoutePageOptions, } from "./create-admin-crud-route-page.js";
|
|
3
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/crud/preset/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,KAAK,iBAAiB,EACtB,KAAK,2BAA2B,GACjC,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,wBAAwB,EACxB,KAAK,mBAAmB,EACxB,KAAK,+BAA+B,GACrC,MAAM,mCAAmC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/crud/preset/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,GAGrB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,wBAAwB,GAGzB,MAAM,mCAAmC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
export type AdminBreadcrumb = {
|
|
3
|
+
label: ReactNode;
|
|
4
|
+
href?: string;
|
|
5
|
+
};
|
|
6
|
+
export type AdminPageHeaderProps = {
|
|
7
|
+
title: ReactNode;
|
|
8
|
+
breadcrumbs?: readonly AdminBreadcrumb[];
|
|
9
|
+
actions?: ReactNode;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Renders a page heading, optional breadcrumbs, and page-level actions.
|
|
13
|
+
*/
|
|
14
|
+
export declare function AdminPageHeader({ title, breadcrumbs, actions, }: AdminPageHeaderProps): import("react").JSX.Element;
|
|
15
|
+
//# sourceMappingURL=admin-page-header.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-page-header.d.ts","sourceRoot":"","sources":["../../src/header/admin-page-header.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IACzC,OAAO,CAAC,EAAE,SAAS,CAAC;CACrB,CAAC;AAEF;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,WAAW,EACX,OAAO,GACR,EAAE,oBAAoB,+BAoCtB"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import Link from "next/link";
|
|
3
|
+
/**
|
|
4
|
+
* Renders a page heading, optional breadcrumbs, and page-level actions.
|
|
5
|
+
*/
|
|
6
|
+
export function AdminPageHeader({ title, breadcrumbs, actions, }) {
|
|
7
|
+
const hasBreadcrumbs = Boolean(breadcrumbs?.length);
|
|
8
|
+
return (_jsxs("header", { className: "gw-admin-page-header", children: [_jsxs("div", { className: "gw-admin-page-header__heading", children: [hasBreadcrumbs && (_jsx("nav", { "aria-label": "\uD604\uC7AC \uC704\uCE58", className: "gw-admin-breadcrumbs", children: _jsx("ol", { className: "gw-admin-breadcrumbs__list", children: breadcrumbs?.map((breadcrumb, index) => (_jsxs("li", { className: "gw-admin-breadcrumbs__item", children: [index > 0 && (_jsx("span", { className: "gw-admin-breadcrumbs__separator", "aria-hidden": "true", children: ">" })), breadcrumb.href ? (_jsx(Link, { href: breadcrumb.href, className: "gw-admin-breadcrumbs__link", children: breadcrumb.label })) : (_jsx("span", { "aria-current": "page", children: breadcrumb.label }))] }, `${breadcrumb.href ?? "current"}-${index}`))) }) })), _jsx("h1", { className: "gw-admin-page-header__title", children: title })] }), actions && _jsx("div", { className: "gw-admin-page-header__actions", children: actions })] }));
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=admin-page-header.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-page-header.js","sourceRoot":"","sources":["../../src/header/admin-page-header.tsx"],"names":[],"mappings":";AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAc7B;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,EAC9B,KAAK,EACL,WAAW,EACX,OAAO,GACc;IACrB,MAAM,cAAc,GAAG,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAEpD,OAAO,CACL,kBAAQ,SAAS,EAAC,sBAAsB,aACtC,eAAK,SAAS,EAAC,+BAA+B,aAC3C,cAAc,IAAI,CACjB,4BAAgB,2BAAO,EAAC,SAAS,EAAC,sBAAsB,YACtD,aAAI,SAAS,EAAC,4BAA4B,YACvC,WAAW,EAAE,GAAG,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,CAAC,CACvC,cAEE,SAAS,EAAC,4BAA4B,aAErC,KAAK,GAAG,CAAC,IAAI,CACZ,eAAM,SAAS,EAAC,iCAAiC,iBAAa,MAAM,kBAE7D,CACR,EACA,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CACjB,KAAC,IAAI,IAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,SAAS,EAAC,4BAA4B,YAChE,UAAU,CAAC,KAAK,GACZ,CACR,CAAC,CAAC,CAAC,CACF,+BAAmB,MAAM,YAAE,UAAU,CAAC,KAAK,GAAQ,CACpD,KAdI,GAAG,UAAU,CAAC,IAAI,IAAI,SAAS,IAAI,KAAK,EAAE,CAe5C,CACN,CAAC,GACC,GACD,CACP,EACD,aAAI,SAAS,EAAC,6BAA6B,YAAE,KAAK,GAAM,IACpD,EACL,OAAO,IAAI,cAAK,SAAS,EAAC,+BAA+B,YAAE,OAAO,GAAO,IACnE,CACV,CAAC;AACJ,CAAC"}
|