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 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/account/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,iBAAiB,EACjB,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,GACxB,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/account/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EACL,iBAAiB,GAIlB,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import type { AdminUploadedFile } from "./types.js";
|
|
3
|
+
export type AdminAttachmentListProps = {
|
|
4
|
+
files: readonly AdminUploadedFile[];
|
|
5
|
+
empty?: ReactNode;
|
|
6
|
+
download?: boolean;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Renders uploaded files as explicit download links.
|
|
10
|
+
*/
|
|
11
|
+
export declare function AdminAttachmentList({ files, empty, download, }: AdminAttachmentListProps): import("react").JSX.Element;
|
|
12
|
+
//# sourceMappingURL=admin-attachment-list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-attachment-list.d.ts","sourceRoot":"","sources":["../../src/attachments/admin-attachment-list.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,MAAM,wBAAwB,GAAG;IACrC,KAAK,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACpC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,KAAK,EACL,KAAuB,EACvB,QAAe,GAChB,EAAE,wBAAwB,+BAuB1B"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Renders uploaded files as explicit download links.
|
|
4
|
+
*/
|
|
5
|
+
export function AdminAttachmentList({ files, empty = "첨부된 파일이 없습니다.", download = true, }) {
|
|
6
|
+
if (files.length === 0) {
|
|
7
|
+
return _jsx("span", { className: "gw-admin-attachment-list__empty", children: empty });
|
|
8
|
+
}
|
|
9
|
+
return (_jsx("ul", { className: "gw-admin-attachment-list", children: files.map((file) => (_jsx("li", { className: "gw-admin-attachment-list__item", children: _jsxs("a", { href: file.url, target: "_blank", rel: "noreferrer", download: download ? file.name : undefined, className: "gw-admin-attachment-list__link", children: [_jsx("span", { "aria-hidden": "true", children: "\u2193" }), _jsx("span", { children: file.name })] }) }, file.id))) }));
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=admin-attachment-list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-attachment-list.js","sourceRoot":"","sources":["../../src/attachments/admin-attachment-list.tsx"],"names":[],"mappings":";AASA;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,EAClC,KAAK,EACL,KAAK,GAAG,eAAe,EACvB,QAAQ,GAAG,IAAI,GACU;IACzB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,eAAM,SAAS,EAAC,iCAAiC,YAAE,KAAK,GAAQ,CAAC;IAC1E,CAAC;IAED,OAAO,CACL,aAAI,SAAS,EAAC,0BAA0B,YACrC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACnB,aAAkB,SAAS,EAAC,gCAAgC,YAC1D,aACE,IAAI,EAAE,IAAI,CAAC,GAAG,EACd,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,YAAY,EAChB,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAC1C,SAAS,EAAC,gCAAgC,aAE1C,8BAAkB,MAAM,uBAAS,EACjC,yBAAO,IAAI,CAAC,IAAI,GAAQ,IACtB,IAVG,IAAI,CAAC,EAAE,CAWX,CACN,CAAC,GACC,CACN,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { Store } from "gw-store";
|
|
2
|
+
import type { AdminFileUploader, AdminUploadedFile } from "./types.js";
|
|
3
|
+
export type AdminFileAttachmentLabels = {
|
|
4
|
+
choose: string;
|
|
5
|
+
drop: string;
|
|
6
|
+
empty: string;
|
|
7
|
+
uploading: string;
|
|
8
|
+
uploadFailed: string;
|
|
9
|
+
retry: string;
|
|
10
|
+
remove: string;
|
|
11
|
+
countRejected: (maxFiles: number) => string;
|
|
12
|
+
sizeRejected: (file: File) => string;
|
|
13
|
+
typeRejected: (file: File) => string;
|
|
14
|
+
};
|
|
15
|
+
export type AdminFileAttachmentsProps<TState extends Record<string, unknown>> = {
|
|
16
|
+
store: Store<TState>;
|
|
17
|
+
name: string;
|
|
18
|
+
uploader: AdminFileUploader;
|
|
19
|
+
initialFiles?: readonly AdminUploadedFile[];
|
|
20
|
+
error?: readonly string[];
|
|
21
|
+
onUploadingChange?: (uploading: boolean) => void;
|
|
22
|
+
maxFiles?: number;
|
|
23
|
+
maxFileSize?: number;
|
|
24
|
+
accept?: string;
|
|
25
|
+
concurrency?: number;
|
|
26
|
+
labels?: Partial<AdminFileAttachmentLabels>;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Connects the file-input package to a gw-store field through an injected
|
|
30
|
+
* uploader. No API endpoint or CDN convention is assumed.
|
|
31
|
+
*/
|
|
32
|
+
export declare function AdminFileAttachments<TState extends Record<string, unknown>>({ store, name, uploader, initialFiles, error, onUploadingChange, maxFiles, maxFileSize, accept, concurrency, labels: labelOverrides, }: AdminFileAttachmentsProps<TState>): import("react").JSX.Element;
|
|
33
|
+
//# sourceMappingURL=admin-file-attachments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-file-attachments.d.ts","sourceRoot":"","sources":["../../src/attachments/admin-file-attachments.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAQtC,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEvE,MAAM,MAAM,yBAAyB,GAAG;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;IAC5C,YAAY,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC;IACrC,YAAY,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,yBAAyB,CAAC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI;IAC9E,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,YAAY,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC5C,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;IACjD,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;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAC3E,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,YAAiB,EACjB,KAAK,EACL,iBAAiB,EACjB,QAAa,EACb,WAAW,EACX,MAAM,EACN,WAAe,EACf,MAAM,EAAE,cAAc,GACvB,EAAE,yBAAyB,CAAC,MAAM,CAAC,+BA2GnC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect, useMemo, useState } from "react";
|
|
4
|
+
import { FileInputArea, FilePreviewList, useFileInputController, useFileSnapshots, useIsDragOver, } from "gw-react-file-input";
|
|
5
|
+
const defaultLabels = {
|
|
6
|
+
choose: "파일을 클릭해서 선택하거나 여기로 끌어다 놓으세요.",
|
|
7
|
+
drop: "여기에 파일을 놓아주세요.",
|
|
8
|
+
empty: "첨부된 파일이 없습니다.",
|
|
9
|
+
uploading: "업로드 중...",
|
|
10
|
+
uploadFailed: "업로드에 실패했습니다.",
|
|
11
|
+
retry: "다시 시도",
|
|
12
|
+
remove: "삭제",
|
|
13
|
+
countRejected: (maxFiles) => `첨부파일은 최대 ${maxFiles}개까지 등록할 수 있습니다.`,
|
|
14
|
+
sizeRejected: (file) => `${file.name}은(는) 첨부할 수 있는 최대 용량을 초과했습니다.`,
|
|
15
|
+
typeRejected: (file) => `${file.name}은(는) 첨부할 수 없는 파일입니다.`,
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Connects the file-input package to a gw-store field through an injected
|
|
19
|
+
* uploader. No API endpoint or CDN convention is assumed.
|
|
20
|
+
*/
|
|
21
|
+
export function AdminFileAttachments({ store, name, uploader, initialFiles = [], error, onUploadingChange, maxFiles = 10, maxFileSize, accept, concurrency = 3, labels: labelOverrides, }) {
|
|
22
|
+
const labels = { ...defaultLabels, ...labelOverrides };
|
|
23
|
+
const [uploadError, setUploadError] = useState("");
|
|
24
|
+
const controller = useFileInputController({
|
|
25
|
+
defaultValue: initialFiles.map((file) => ({
|
|
26
|
+
file,
|
|
27
|
+
name: file.name,
|
|
28
|
+
...(file.type ? { type: file.type } : {}),
|
|
29
|
+
...(typeof file.size === "number" ? { size: file.size } : {}),
|
|
30
|
+
...(file.type?.startsWith("image/") ? { thumbnail: file.url } : {}),
|
|
31
|
+
})),
|
|
32
|
+
multiple: true,
|
|
33
|
+
concurrency,
|
|
34
|
+
uploader,
|
|
35
|
+
maxFiles,
|
|
36
|
+
...(typeof maxFileSize === "number" ? { maxFileSize } : {}),
|
|
37
|
+
...(accept ? { accept } : {}),
|
|
38
|
+
onUploaded: () => setUploadError(""),
|
|
39
|
+
onUploadError: ({ file }) => setUploadError(`${file.name} ${labels.uploadFailed}`),
|
|
40
|
+
onRejected: (rejections) => {
|
|
41
|
+
const first = rejections[0];
|
|
42
|
+
if (!first) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const message = first.code === "file-size"
|
|
46
|
+
? labels.sizeRejected(first.file)
|
|
47
|
+
: first.code === "file-count"
|
|
48
|
+
? labels.countRejected(maxFiles)
|
|
49
|
+
: labels.typeRejected(first.file);
|
|
50
|
+
setUploadError(message);
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
const snapshots = useFileSnapshots(controller);
|
|
54
|
+
const isDragOver = useIsDragOver(controller);
|
|
55
|
+
const uploading = snapshots.some((snapshot) => snapshot.status === "preparing" || snapshot.status === "uploading");
|
|
56
|
+
const uploadedFiles = useMemo(() => snapshots.flatMap((snapshot) => (snapshot.status === "uploaded" ? [snapshot.file] : [])), [snapshots]);
|
|
57
|
+
const uploadedFileIds = uploadedFiles.map((file) => file.id);
|
|
58
|
+
const uploadedFileIdsKey = uploadedFileIds.join("\u0000");
|
|
59
|
+
useEffect(() => {
|
|
60
|
+
onUploadingChange?.(uploading);
|
|
61
|
+
}, [onUploadingChange, uploading]);
|
|
62
|
+
useEffect(() => {
|
|
63
|
+
store.dispatch((state) => {
|
|
64
|
+
state[name] = uploadedFileIds;
|
|
65
|
+
});
|
|
66
|
+
}, [name, store, uploadedFileIdsKey]);
|
|
67
|
+
return (_jsxs("div", { className: "gw-admin-file-input", children: [_jsx(FileInputArea, { controller: controller, "aria-label": "\uCCA8\uBD80\uD30C\uC77C \uC120\uD0DD", className: `gw-admin-file-input__dropzone ${isDragOver ? "is-drag-over" : ""}`, children: _jsx("p", { children: isDragOver ? labels.drop : labels.choose }) }), _jsx(FilePreviewList, { controller: controller, empty: _jsx("p", { className: "gw-admin-file-input__empty", children: labels.empty }), className: "gw-admin-file-input__previews", previewProps: {
|
|
68
|
+
className: "gw-admin-file-preview",
|
|
69
|
+
pending: labels.uploading,
|
|
70
|
+
error: labels.uploadFailed,
|
|
71
|
+
labels: {
|
|
72
|
+
retry: labels.retry,
|
|
73
|
+
remove: labels.remove,
|
|
74
|
+
},
|
|
75
|
+
slotProps: {
|
|
76
|
+
thumbnail: {
|
|
77
|
+
className: "gw-admin-file-preview__thumbnail",
|
|
78
|
+
},
|
|
79
|
+
progress: {
|
|
80
|
+
className: "gw-admin-file-preview__progress",
|
|
81
|
+
},
|
|
82
|
+
actions: {
|
|
83
|
+
className: "gw-admin-file-preview__actions",
|
|
84
|
+
},
|
|
85
|
+
retryButton: {
|
|
86
|
+
className: "gw-admin-link-button",
|
|
87
|
+
},
|
|
88
|
+
removeButton: {
|
|
89
|
+
className: "gw-admin-link-button gw-admin-link-button--danger",
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
} }), (uploadError || error?.length) && (_jsx("p", { role: "alert", className: "gw-admin-field-error", children: uploadError || error?.join(" ") }))] }));
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=admin-file-attachments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-file-attachments.js","sourceRoot":"","sources":["../../src/attachments/admin-file-attachments.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { AdminAttachmentList, type AdminAttachmentListProps, } from "./admin-attachment-list.js";
|
|
2
|
+
export { AdminFileAttachments, type AdminFileAttachmentLabels, type AdminFileAttachmentsProps, } from "./admin-file-attachments.js";
|
|
3
|
+
export type { AdminFileUploader, AdminUploadedFile } from "./types.js";
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/attachments/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,KAAK,wBAAwB,GAC9B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,oBAAoB,EACpB,KAAK,yBAAyB,EAC9B,KAAK,yBAAyB,GAC/B,MAAM,6BAA6B,CAAC;AACrC,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/attachments/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,GAEpB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,oBAAoB,GAGrB,MAAM,6BAA6B,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { FileUploader } from "gw-react-file-input";
|
|
2
|
+
export type AdminUploadedFile = {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
type?: string | null;
|
|
6
|
+
size?: number | null;
|
|
7
|
+
key?: string;
|
|
8
|
+
url: string;
|
|
9
|
+
metadata?: Record<string, unknown>;
|
|
10
|
+
};
|
|
11
|
+
export type AdminFileUploader = FileUploader<AdminUploadedFile>;
|
|
12
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/attachments/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,YAAY,CAAC,iBAAiB,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/attachments/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
import { type Store } from "gw-store";
|
|
3
|
+
import type { CrudAction, FormPageModel } from "next-headless-crud/core";
|
|
4
|
+
import { type AdminBreadcrumb } from "../../header/admin-page-header.js";
|
|
5
|
+
import { type AdminCrudFieldMode, type AdminCrudFormState } from "./form-state.js";
|
|
6
|
+
type AdminFormField = FormPageModel["fields"][number];
|
|
7
|
+
export type AdminCrudFieldRenderContext = {
|
|
8
|
+
field: AdminFormField;
|
|
9
|
+
store: Store<AdminCrudFormState>;
|
|
10
|
+
error: readonly string[] | undefined;
|
|
11
|
+
errorId: string;
|
|
12
|
+
setUploading: (uploading: boolean) => void;
|
|
13
|
+
};
|
|
14
|
+
export type AdminCrudFormLabels = {
|
|
15
|
+
cancel: string;
|
|
16
|
+
save: string;
|
|
17
|
+
saving: string;
|
|
18
|
+
uploading: string;
|
|
19
|
+
optionalSelect: string;
|
|
20
|
+
checkbox: string;
|
|
21
|
+
};
|
|
22
|
+
export type AdminCrudFormProps = {
|
|
23
|
+
title: ReactNode;
|
|
24
|
+
breadcrumbs?: readonly AdminBreadcrumb[];
|
|
25
|
+
model: FormPageModel;
|
|
26
|
+
action: CrudAction;
|
|
27
|
+
initialValues?: AdminCrudFormState;
|
|
28
|
+
fieldModes?: Readonly<Record<string, AdminCrudFieldMode>>;
|
|
29
|
+
renderField?: (context: AdminCrudFieldRenderContext) => ReactNode | undefined;
|
|
30
|
+
labels?: Partial<AdminCrudFormLabels>;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Renders standard headless CRUD fields without a native form submit event.
|
|
34
|
+
*
|
|
35
|
+
* A consumer-side Client Component can provide `renderField` to compose rich
|
|
36
|
+
* text, attachments, or any service-specific field without changing this
|
|
37
|
+
* package.
|
|
38
|
+
*/
|
|
39
|
+
export declare function AdminCrudForm({ title, breadcrumbs, model, action, initialValues, fieldModes, renderField, labels: labelOverrides, }: AdminCrudFormProps): import("react").JSX.Element;
|
|
40
|
+
export {};
|
|
41
|
+
//# sourceMappingURL=admin-crud-form.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-crud-form.d.ts","sourceRoot":"","sources":["../../../src/crud/form/admin-crud-form.tsx"],"names":[],"mappings":"AAGA,OAAO,EAKL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,EAAY,KAAK,KAAK,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAEzE,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAGL,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACxB,MAAM,iBAAiB,CAAC;AAEzB,KAAK,cAAc,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC;AAEtD,MAAM,MAAM,2BAA2B,GAAG;IACxC,KAAK,EAAE,cAAc,CAAC;IACtB,KAAK,EAAE,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACjC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;CAC5C,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IACzC,KAAK,EAAE,aAAa,CAAC;IACrB,MAAM,EAAE,UAAU,CAAC;IACnB,aAAa,CAAC,EAAE,kBAAkB,CAAC;IACnC,UAAU,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAC1D,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,2BAA2B,KAAK,SAAS,GAAG,SAAS,CAAC;IAC9E,MAAM,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACvC,CAAC;AAWF;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,WAAW,EACX,KAAK,EACL,MAAM,EACN,aAAa,EACb,UAAe,EACf,WAAW,EACX,MAAM,EAAE,cAAc,GACvB,EAAE,kBAAkB,+BA8IpB"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import Link from "next/link";
|
|
4
|
+
import { startTransition, useActionState, useCallback, useState, } from "react";
|
|
5
|
+
import { useStore } from "gw-store";
|
|
6
|
+
import { Input, Select, Textarea } from "react-store-input";
|
|
7
|
+
import { AdminPageHeader, } from "../../header/admin-page-header.js";
|
|
8
|
+
import { createAdminActionFormData, createAdminCrudFormState, } from "./form-state.js";
|
|
9
|
+
const defaultLabels = {
|
|
10
|
+
cancel: "취소",
|
|
11
|
+
save: "저장",
|
|
12
|
+
saving: "저장 중...",
|
|
13
|
+
uploading: "파일 업로드 중...",
|
|
14
|
+
optionalSelect: "선택 안 함",
|
|
15
|
+
checkbox: "사용",
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Renders standard headless CRUD fields without a native form submit event.
|
|
19
|
+
*
|
|
20
|
+
* A consumer-side Client Component can provide `renderField` to compose rich
|
|
21
|
+
* text, attachments, or any service-specific field without changing this
|
|
22
|
+
* package.
|
|
23
|
+
*/
|
|
24
|
+
export function AdminCrudForm({ title, breadcrumbs, model, action, initialValues, fieldModes = {}, renderField, labels: labelOverrides, }) {
|
|
25
|
+
const labels = { ...defaultLabels, ...labelOverrides };
|
|
26
|
+
const store = useStore(createAdminCrudFormState(model, initialValues));
|
|
27
|
+
const [state, formAction, pending] = useActionState(action, undefined);
|
|
28
|
+
const [uploading, setUploading] = useState(false);
|
|
29
|
+
const errors = state && !state.success ? state.error.fieldErrors : undefined;
|
|
30
|
+
const updateUploading = useCallback((nextUploading) => {
|
|
31
|
+
setUploading(nextUploading);
|
|
32
|
+
}, []);
|
|
33
|
+
const save = useCallback(() => {
|
|
34
|
+
startTransition(() => {
|
|
35
|
+
formAction(createAdminActionFormData(store.state));
|
|
36
|
+
});
|
|
37
|
+
}, [formAction, store]);
|
|
38
|
+
return (_jsxs("div", { className: "gw-admin-crud-form", children: [_jsx(AdminPageHeader, { title: title, ...(breadcrumbs ? { breadcrumbs } : {}), actions: _jsxs(_Fragment, { children: [_jsx(Link, { href: model.basePath, className: "gw-admin-button gw-admin-button--secondary", children: labels.cancel }), _jsx("button", { type: "button", onClick: save, disabled: pending || uploading, className: "gw-admin-button gw-admin-button--primary", children: uploading ? labels.uploading : pending ? labels.saving : labels.save })] }) }), _jsxs("div", { className: "gw-admin-crud-form__fields", children: [state && !state.success && (_jsx("div", { role: "alert", className: "gw-admin-alert gw-admin-alert--error", children: state.error.message })), model.fields.map((field) => {
|
|
39
|
+
const { name, definition, values } = field;
|
|
40
|
+
const mode = fieldModes[name] ?? "input";
|
|
41
|
+
if (mode === "hidden") {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
const error = errors?.[name];
|
|
45
|
+
const errorId = `${name}-error`;
|
|
46
|
+
const customField = renderField?.({
|
|
47
|
+
field,
|
|
48
|
+
store,
|
|
49
|
+
error,
|
|
50
|
+
errorId,
|
|
51
|
+
setUploading: updateUploading,
|
|
52
|
+
});
|
|
53
|
+
return (_jsxs("div", { className: "gw-admin-field", children: [_jsxs("label", { htmlFor: name, className: "gw-admin-field__label", children: [definition.label, definition.required && (_jsx("span", { className: "gw-admin-field__required", "aria-label": "\uD544\uC218", children: "*" }))] }), customField !== undefined ? (customField) : definition.inputType === "checkbox" ? (_jsxs("span", { className: "gw-admin-checkbox", children: [_jsx(Input, { store: store, id: name, type: "checkbox", name: name, "aria-invalid": Boolean(error), "aria-describedby": error ? errorId : undefined, className: "gw-admin-checkbox__input" }), _jsx("span", { children: labels.checkbox })] })) : definition.inputType === "select" ? (_jsxs(Select, { store: store, id: name, name: name, required: definition.required, "aria-invalid": Boolean(error), "aria-describedby": error ? errorId : undefined, className: "gw-admin-input", children: [!definition.required && _jsx("option", { value: "", children: labels.optionalSelect }), values?.map((option) => (_jsx("option", { value: String(option.value), children: option.label }, String(option.value))))] })) : mode === "textarea" ? (_jsx(Textarea, { store: store, id: name, name: name, required: definition.required, "aria-invalid": Boolean(error), "aria-describedby": error ? errorId : undefined, className: "gw-admin-input gw-admin-textarea" })) : (_jsx(Input, { store: store, id: name, type: definition.inputType, name: name, required: definition.required, "aria-invalid": Boolean(error), "aria-describedby": error ? errorId : undefined, className: "gw-admin-input" })), definition.description && (_jsx("span", { className: "gw-admin-field__description", children: definition.description })), error && (_jsx("span", { id: errorId, className: "gw-admin-field-error", children: error.join(" ") }))] }, name));
|
|
54
|
+
})] })] }));
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=admin-crud-form.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-crud-form.js","sourceRoot":"","sources":["../../../src/crud/form/admin-crud-form.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { FormPageModel } from "next-headless-crud/core";
|
|
2
|
+
export type AdminCrudFormState = Record<string, unknown>;
|
|
3
|
+
export type AdminCrudFieldMode = "input" | "textarea" | "hidden";
|
|
4
|
+
/**
|
|
5
|
+
* Creates serializable form state from a headless CRUD form model.
|
|
6
|
+
*/
|
|
7
|
+
export declare function createAdminCrudFormState(model: FormPageModel, initialValues?: AdminCrudFormState): AdminCrudFormState;
|
|
8
|
+
/**
|
|
9
|
+
* Converts gw-store state into the FormData expected by CRUD Server Actions.
|
|
10
|
+
*/
|
|
11
|
+
export declare function createAdminActionFormData(state: AdminCrudFormState): FormData;
|
|
12
|
+
//# sourceMappingURL=form-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form-state.d.ts","sourceRoot":"","sources":["../../../src/crud/form/form-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE7D,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEzD,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,UAAU,GAAG,QAAQ,CAAC;AAEjE;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,aAAa,EACpB,aAAa,GAAE,kBAAuB,sBAsBvC;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,kBAAkB,YAkBlE"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Creates serializable form state from a headless CRUD form model.
|
|
3
|
+
*/
|
|
4
|
+
export function createAdminCrudFormState(model, initialValues = {}) {
|
|
5
|
+
const state = {};
|
|
6
|
+
for (const { name, definition, values } of model.fields) {
|
|
7
|
+
if (Object.hasOwn(initialValues, name)) {
|
|
8
|
+
state[name] = initialValues[name];
|
|
9
|
+
continue;
|
|
10
|
+
}
|
|
11
|
+
const value = model.row?.[name];
|
|
12
|
+
if (definition.inputType === "checkbox") {
|
|
13
|
+
state[name] = Boolean(value);
|
|
14
|
+
}
|
|
15
|
+
else if (definition.inputType === "select") {
|
|
16
|
+
state[name] = value ?? values?.[0]?.value ?? "";
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
state[name] = value ?? "";
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return state;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Converts gw-store state into the FormData expected by CRUD Server Actions.
|
|
26
|
+
*/
|
|
27
|
+
export function createAdminActionFormData(state) {
|
|
28
|
+
const formData = new FormData();
|
|
29
|
+
for (const [name, value] of Object.entries(state)) {
|
|
30
|
+
if (Array.isArray(value)) {
|
|
31
|
+
formData.set(name, JSON.stringify(value));
|
|
32
|
+
}
|
|
33
|
+
else if (value instanceof Date) {
|
|
34
|
+
formData.set(name, Number.isNaN(value.valueOf()) ? "" : value.toISOString());
|
|
35
|
+
}
|
|
36
|
+
else if (value instanceof Blob) {
|
|
37
|
+
formData.set(name, value);
|
|
38
|
+
}
|
|
39
|
+
else if (value === null || value === undefined) {
|
|
40
|
+
formData.set(name, "");
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
formData.set(name, String(value));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return formData;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=form-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form-state.js","sourceRoot":"","sources":["../../../src/crud/form/form-state.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,MAAM,UAAU,wBAAwB,CACtC,KAAoB,EACpB,gBAAoC,EAAE;IAEtC,MAAM,KAAK,GAAuB,EAAE,CAAC;IAErC,KAAK,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACxD,IAAI,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,IAAI,CAAC,EAAE,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;YAClC,SAAS;QACX,CAAC;QAED,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAEhC,IAAI,UAAU,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;YACxC,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;aAAM,IAAI,UAAU,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;YAC7C,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;QAClD,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,KAAyB;IACjE,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;IAEhC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAClD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5C,CAAC;aAAM,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;YACjC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QAC/E,CAAC;aAAM,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;YACjC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC5B,CAAC;aAAM,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACjD,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { AdminCrudForm, type AdminCrudFieldRenderContext, type AdminCrudFormLabels, type AdminCrudFormProps, } from "./admin-crud-form.js";
|
|
2
|
+
export { createAdminActionFormData, createAdminCrudFormState, type AdminCrudFieldMode, type AdminCrudFormState, } from "./form-state.js";
|
|
3
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/crud/form/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,KAAK,2BAA2B,EAChC,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,GACxB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,yBAAyB,EACzB,wBAAwB,EACxB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,GACxB,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/crud/form/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,GAId,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,yBAAyB,EACzB,wBAAwB,GAGzB,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/crud/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/crud/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import type { CrudResource, DetailPageModel } from "next-headless-crud/core";
|
|
3
|
+
import type { CrudRouteDetailPageProps } from "next-headless-crud/next";
|
|
4
|
+
type AdminDetailField = DetailPageModel["fields"][number];
|
|
5
|
+
export type AdminCrudDetailFieldContext = {
|
|
6
|
+
field: AdminDetailField;
|
|
7
|
+
value: unknown;
|
|
8
|
+
row: Record<string, unknown>;
|
|
9
|
+
};
|
|
10
|
+
export type AdminCrudDetailActionContext = {
|
|
11
|
+
model: DetailPageModel;
|
|
12
|
+
id: string;
|
|
13
|
+
deleteAction: CrudRouteDetailPageProps["action"];
|
|
14
|
+
};
|
|
15
|
+
export type AdminCrudDetailPageProps<TResource extends CrudResource = CrudResource> = CrudRouteDetailPageProps<TResource> & {
|
|
16
|
+
title?: ReactNode;
|
|
17
|
+
hiddenFields?: readonly string[];
|
|
18
|
+
longTextFields?: readonly string[];
|
|
19
|
+
renderField?: (context: AdminCrudDetailFieldContext) => ReactNode | Promise<ReactNode | undefined> | undefined;
|
|
20
|
+
renderActions?: (context: AdminCrudDetailActionContext) => ReactNode | Promise<ReactNode>;
|
|
21
|
+
formatValue?: (value: unknown, field: string) => ReactNode;
|
|
22
|
+
labels?: {
|
|
23
|
+
edit?: string;
|
|
24
|
+
list?: string;
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Renders a detail page while leaving field values and header actions open to
|
|
29
|
+
* per-resource replacement.
|
|
30
|
+
*/
|
|
31
|
+
export declare function AdminCrudDetailPage<TResource extends CrudResource = CrudResource>({ resource, id, action, title, hiddenFields, longTextFields, renderField, renderActions, formatValue, labels: labelOverrides, }: AdminCrudDetailPageProps<TResource>): Promise<import("react").JSX.Element>;
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=admin-crud-detail-page.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-crud-detail-page.d.ts","sourceRoot":"","sources":["../../../src/crud/pages/admin-crud-detail-page.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC7E,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAKxE,KAAK,gBAAgB,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC;AAE1D,MAAM,MAAM,2BAA2B,GAAG;IACxC,KAAK,EAAE,gBAAgB,CAAC;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IACzC,KAAK,EAAE,eAAe,CAAC;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,wBAAwB,CAAC,QAAQ,CAAC,CAAC;CAClD,CAAC;AAEF,MAAM,MAAM,wBAAwB,CAAC,SAAS,SAAS,YAAY,GAAG,YAAY,IAChF,wBAAwB,CAAC,SAAS,CAAC,GAAG;IACpC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,WAAW,CAAC,EAAE,CACZ,OAAO,EAAE,2BAA2B,KACjC,SAAS,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC;IAC5D,aAAa,CAAC,EAAE,CACd,OAAO,EAAE,4BAA4B,KAClC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IACpC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,KAAK,SAAS,CAAC;IAC3D,MAAM,CAAC,EAAE;QACP,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACH,CAAC;AAEJ;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,SAAS,SAAS,YAAY,GAAG,YAAY,EAAE,EACvF,QAAQ,EACR,EAAE,EACF,MAAM,EACN,KAAe,EACf,YAAiB,EACjB,cAAmB,EACnB,WAAW,EACX,aAAa,EACb,WAAgD,EAChD,MAAM,EAAE,cAAc,GACvB,EAAE,wBAAwB,CAAC,SAAS,CAAC,wCAqErC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import Link from "next/link";
|
|
3
|
+
import { notFound } from "next/navigation";
|
|
4
|
+
import { AdminPageHeader } from "../../header/admin-page-header.js";
|
|
5
|
+
import { AdminDeleteForm } from "./admin-delete-form.js";
|
|
6
|
+
import { formatAdminValue } from "./format-admin-value.js";
|
|
7
|
+
/**
|
|
8
|
+
* Renders a detail page while leaving field values and header actions open to
|
|
9
|
+
* per-resource replacement.
|
|
10
|
+
*/
|
|
11
|
+
export async function AdminCrudDetailPage({ resource, id, action, title = "상세 보기", hiddenFields = [], longTextFields = [], renderField, renderActions, formatValue = (value) => formatAdminValue(value), labels: labelOverrides, }) {
|
|
12
|
+
const labels = { edit: "수정", list: "목록", ...labelOverrides };
|
|
13
|
+
const model = await resource.getDetail(id);
|
|
14
|
+
if (!model) {
|
|
15
|
+
notFound();
|
|
16
|
+
}
|
|
17
|
+
const hidden = new Set(hiddenFields);
|
|
18
|
+
const longText = new Set(longTextFields);
|
|
19
|
+
const fields = await Promise.all(model.fields
|
|
20
|
+
.filter(({ name }) => !hidden.has(name))
|
|
21
|
+
.map(async (field) => {
|
|
22
|
+
const value = model.row[field.name];
|
|
23
|
+
const customValue = await renderField?.({
|
|
24
|
+
field,
|
|
25
|
+
value,
|
|
26
|
+
row: model.row,
|
|
27
|
+
});
|
|
28
|
+
return {
|
|
29
|
+
field,
|
|
30
|
+
value: customValue === undefined ? formatValue(value, field.name) : customValue,
|
|
31
|
+
};
|
|
32
|
+
}));
|
|
33
|
+
const defaultActions = (_jsxs(_Fragment, { children: [_jsx(Link, { href: `${model.basePath}/${encodeURIComponent(String(id))}/edit`, className: "gw-admin-button gw-admin-button--primary", children: labels.edit }), _jsx(AdminDeleteForm, { action: action })] }));
|
|
34
|
+
const actions = renderActions
|
|
35
|
+
? await renderActions({ model, id, deleteAction: action })
|
|
36
|
+
: defaultActions;
|
|
37
|
+
return (_jsxs("main", { className: "gw-admin-page gw-admin-page--detail", children: [_jsx(AdminPageHeader, { title: title, breadcrumbs: [{ label: resource.label, href: model.basePath }], actions: actions }), _jsx("dl", { className: "gw-admin-detail", children: fields.map(({ field, value }) => (_jsxs("div", { className: `gw-admin-detail__row ${longText.has(field.name) ? "is-long" : ""}`, children: [_jsx("dt", { children: field.definition.label }), _jsx("dd", { children: value })] }, field.name))) }), _jsx("div", { className: "gw-admin-page__footer-action", children: _jsx(Link, { href: model.basePath, className: "gw-admin-button gw-admin-button--secondary", children: labels.list }) })] }));
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=admin-crud-detail-page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-crud-detail-page.js","sourceRoot":"","sources":["../../../src/crud/pages/admin-crud-detail-page.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import type { CrudRouteCreatePageProps, CrudRouteUpdatePageProps } from "next-headless-crud/next";
|
|
3
|
+
import { type AdminCrudFormProps } from "../form/admin-crud-form.js";
|
|
4
|
+
import type { AdminCrudFormState } from "../form/form-state.js";
|
|
5
|
+
export type AdminCrudFormPageRenderProps = Pick<AdminCrudFormProps, "title" | "breadcrumbs" | "model" | "action" | "initialValues">;
|
|
6
|
+
export type AdminCrudFormRenderer = (props: AdminCrudFormPageRenderProps) => ReactNode | Promise<ReactNode>;
|
|
7
|
+
export type AdminCrudCreatePageOptions = CrudRouteCreatePageProps & {
|
|
8
|
+
title?: ReactNode;
|
|
9
|
+
initialValues?: AdminCrudFormState;
|
|
10
|
+
renderForm?: AdminCrudFormRenderer;
|
|
11
|
+
};
|
|
12
|
+
export type AdminCrudUpdatePageOptions = CrudRouteUpdatePageProps & {
|
|
13
|
+
title?: ReactNode;
|
|
14
|
+
initialValues?: AdminCrudFormState;
|
|
15
|
+
renderForm?: AdminCrudFormRenderer;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Loads a create model and delegates the actual form to an optional
|
|
19
|
+
* resource-specific renderer.
|
|
20
|
+
*/
|
|
21
|
+
export declare function AdminCrudCreatePage({ resource, action, title, initialValues, renderForm, }: AdminCrudCreatePageOptions): Promise<import("react").JSX.Element>;
|
|
22
|
+
/**
|
|
23
|
+
* Loads an update model and delegates the actual form to an optional
|
|
24
|
+
* resource-specific renderer.
|
|
25
|
+
*/
|
|
26
|
+
export declare function AdminCrudUpdatePage({ resource, id, action, title, initialValues, renderForm, }: AdminCrudUpdatePageOptions): Promise<import("react").JSX.Element>;
|
|
27
|
+
//# sourceMappingURL=admin-crud-form-pages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-crud-form-pages.d.ts","sourceRoot":"","sources":["../../../src/crud/pages/admin-crud-form-pages.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EACV,wBAAwB,EACxB,wBAAwB,EACzB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,MAAM,MAAM,4BAA4B,GAAG,IAAI,CAC7C,kBAAkB,EAClB,OAAO,GAAG,aAAa,GAAG,OAAO,GAAG,QAAQ,GAAG,eAAe,CAC/D,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,CAClC,KAAK,EAAE,4BAA4B,KAChC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;AAEpC,MAAM,MAAM,0BAA0B,GAAG,wBAAwB,GAAG;IAClE,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,aAAa,CAAC,EAAE,kBAAkB,CAAC;IACnC,UAAU,CAAC,EAAE,qBAAqB,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG,wBAAwB,GAAG;IAClE,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,aAAa,CAAC,EAAE,kBAAkB,CAAC;IACnC,UAAU,CAAC,EAAE,qBAAqB,CAAC;CACpC,CAAC;AASF;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,EACxC,QAAQ,EACR,MAAM,EACN,KAAgB,EAChB,aAAkB,EAClB,UAAU,GACX,EAAE,0BAA0B,wCAiB5B;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,EACxC,QAAQ,EACR,EAAE,EACF,MAAM,EACN,KAAe,EACf,aAAkB,EAClB,UAAU,GACX,EAAE,0BAA0B,wCA2B5B"}
|