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.
Files changed (166) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/LICENSE +21 -0
  3. package/README.md +569 -0
  4. package/dist/account/admin-logout-button.d.ts +21 -0
  5. package/dist/account/admin-logout-button.d.ts.map +1 -0
  6. package/dist/account/admin-logout-button.js +57 -0
  7. package/dist/account/admin-logout-button.js.map +1 -0
  8. package/dist/account/index.d.ts +2 -0
  9. package/dist/account/index.d.ts.map +1 -0
  10. package/dist/account/index.js +3 -0
  11. package/dist/account/index.js.map +1 -0
  12. package/dist/attachments/admin-attachment-list.d.ts +12 -0
  13. package/dist/attachments/admin-attachment-list.d.ts.map +1 -0
  14. package/dist/attachments/admin-attachment-list.js +11 -0
  15. package/dist/attachments/admin-attachment-list.js.map +1 -0
  16. package/dist/attachments/admin-file-attachments.d.ts +33 -0
  17. package/dist/attachments/admin-file-attachments.d.ts.map +1 -0
  18. package/dist/attachments/admin-file-attachments.js +94 -0
  19. package/dist/attachments/admin-file-attachments.js.map +1 -0
  20. package/dist/attachments/index.d.ts +4 -0
  21. package/dist/attachments/index.d.ts.map +1 -0
  22. package/dist/attachments/index.js +3 -0
  23. package/dist/attachments/index.js.map +1 -0
  24. package/dist/attachments/types.d.ts +12 -0
  25. package/dist/attachments/types.d.ts.map +1 -0
  26. package/dist/attachments/types.js +2 -0
  27. package/dist/attachments/types.js.map +1 -0
  28. package/dist/crud/form/admin-crud-form.d.ts +41 -0
  29. package/dist/crud/form/admin-crud-form.d.ts.map +1 -0
  30. package/dist/crud/form/admin-crud-form.js +56 -0
  31. package/dist/crud/form/admin-crud-form.js.map +1 -0
  32. package/dist/crud/form/form-state.d.ts +12 -0
  33. package/dist/crud/form/form-state.d.ts.map +1 -0
  34. package/dist/crud/form/form-state.js +48 -0
  35. package/dist/crud/form/form-state.js.map +1 -0
  36. package/dist/crud/form/index.d.ts +3 -0
  37. package/dist/crud/form/index.d.ts.map +1 -0
  38. package/dist/crud/form/index.js +3 -0
  39. package/dist/crud/form/index.js.map +1 -0
  40. package/dist/crud/index.d.ts +3 -0
  41. package/dist/crud/index.d.ts.map +1 -0
  42. package/dist/crud/index.js +3 -0
  43. package/dist/crud/index.js.map +1 -0
  44. package/dist/crud/pages/admin-crud-detail-page.d.ts +33 -0
  45. package/dist/crud/pages/admin-crud-detail-page.d.ts.map +1 -0
  46. package/dist/crud/pages/admin-crud-detail-page.js +39 -0
  47. package/dist/crud/pages/admin-crud-detail-page.js.map +1 -0
  48. package/dist/crud/pages/admin-crud-form-pages.d.ts +27 -0
  49. package/dist/crud/pages/admin-crud-form-pages.d.ts.map +1 -0
  50. package/dist/crud/pages/admin-crud-form-pages.js +44 -0
  51. package/dist/crud/pages/admin-crud-form-pages.js.map +1 -0
  52. package/dist/crud/pages/admin-crud-list-page.d.ts +27 -0
  53. package/dist/crud/pages/admin-crud-list-page.d.ts.map +1 -0
  54. package/dist/crud/pages/admin-crud-list-page.js +33 -0
  55. package/dist/crud/pages/admin-crud-list-page.js.map +1 -0
  56. package/dist/crud/pages/admin-delete-form.d.ts +12 -0
  57. package/dist/crud/pages/admin-delete-form.d.ts.map +1 -0
  58. package/dist/crud/pages/admin-delete-form.js +15 -0
  59. package/dist/crud/pages/admin-delete-form.js.map +1 -0
  60. package/dist/crud/pages/format-admin-value.d.ts +5 -0
  61. package/dist/crud/pages/format-admin-value.d.ts.map +1 -0
  62. package/dist/crud/pages/format-admin-value.js +38 -0
  63. package/dist/crud/pages/format-admin-value.js.map +1 -0
  64. package/dist/crud/pages/index.d.ts +6 -0
  65. package/dist/crud/pages/index.d.ts.map +1 -0
  66. package/dist/crud/pages/index.js +6 -0
  67. package/dist/crud/pages/index.js.map +1 -0
  68. package/dist/crud/preset/client.d.ts +2 -0
  69. package/dist/crud/preset/client.d.ts.map +1 -0
  70. package/dist/crud/preset/client.js +3 -0
  71. package/dist/crud/preset/client.js.map +1 -0
  72. package/dist/crud/preset/create-admin-crud-form.d.ts +41 -0
  73. package/dist/crud/preset/create-admin-crud-form.d.ts.map +1 -0
  74. package/dist/crud/preset/create-admin-crud-form.js +68 -0
  75. package/dist/crud/preset/create-admin-crud-form.js.map +1 -0
  76. package/dist/crud/preset/create-admin-crud-pages.d.ts +29 -0
  77. package/dist/crud/preset/create-admin-crud-pages.d.ts.map +1 -0
  78. package/dist/crud/preset/create-admin-crud-pages.js +46 -0
  79. package/dist/crud/preset/create-admin-crud-pages.js.map +1 -0
  80. package/dist/crud/preset/create-admin-crud-route-page.d.ts +18 -0
  81. package/dist/crud/preset/create-admin-crud-route-page.d.ts.map +1 -0
  82. package/dist/crud/preset/create-admin-crud-route-page.js +26 -0
  83. package/dist/crud/preset/create-admin-crud-route-page.js.map +1 -0
  84. package/dist/crud/preset/index.d.ts +3 -0
  85. package/dist/crud/preset/index.d.ts.map +1 -0
  86. package/dist/crud/preset/index.js +3 -0
  87. package/dist/crud/preset/index.js.map +1 -0
  88. package/dist/header/admin-page-header.d.ts +15 -0
  89. package/dist/header/admin-page-header.d.ts.map +1 -0
  90. package/dist/header/admin-page-header.js +10 -0
  91. package/dist/header/admin-page-header.js.map +1 -0
  92. package/dist/header/index.d.ts +2 -0
  93. package/dist/header/index.d.ts.map +1 -0
  94. package/dist/header/index.js +2 -0
  95. package/dist/header/index.js.map +1 -0
  96. package/dist/index.d.ts +7 -0
  97. package/dist/index.d.ts.map +1 -0
  98. package/dist/index.js +7 -0
  99. package/dist/index.js.map +1 -0
  100. package/dist/internal/class-names.d.ts +5 -0
  101. package/dist/internal/class-names.d.ts.map +1 -0
  102. package/dist/internal/class-names.js +7 -0
  103. package/dist/internal/class-names.js.map +1 -0
  104. package/dist/layout/admin-layout.d.ts +16 -0
  105. package/dist/layout/admin-layout.d.ts.map +1 -0
  106. package/dist/layout/admin-layout.js +17 -0
  107. package/dist/layout/admin-layout.js.map +1 -0
  108. package/dist/layout/admin-shell.d.ts +12 -0
  109. package/dist/layout/admin-shell.d.ts.map +1 -0
  110. package/dist/layout/admin-shell.js +10 -0
  111. package/dist/layout/admin-shell.js.map +1 -0
  112. package/dist/layout/admin-sidebar.d.ts +11 -0
  113. package/dist/layout/admin-sidebar.d.ts.map +1 -0
  114. package/dist/layout/admin-sidebar.js +10 -0
  115. package/dist/layout/admin-sidebar.js.map +1 -0
  116. package/dist/layout/index.d.ts +4 -0
  117. package/dist/layout/index.d.ts.map +1 -0
  118. package/dist/layout/index.js +4 -0
  119. package/dist/layout/index.js.map +1 -0
  120. package/dist/layout/mobile.d.ts +15 -0
  121. package/dist/layout/mobile.d.ts.map +1 -0
  122. package/dist/layout/mobile.js +32 -0
  123. package/dist/layout/mobile.js.map +1 -0
  124. package/dist/navigation/admin-navigation.d.ts +21 -0
  125. package/dist/navigation/admin-navigation.d.ts.map +1 -0
  126. package/dist/navigation/admin-navigation.js +22 -0
  127. package/dist/navigation/admin-navigation.js.map +1 -0
  128. package/dist/navigation/index.d.ts +2 -0
  129. package/dist/navigation/index.d.ts.map +1 -0
  130. package/dist/navigation/index.js +2 -0
  131. package/dist/navigation/index.js.map +1 -0
  132. package/dist/pages/admin-account-page.d.ts +13 -0
  133. package/dist/pages/admin-account-page.d.ts.map +1 -0
  134. package/dist/pages/admin-account-page.js +11 -0
  135. package/dist/pages/admin-account-page.js.map +1 -0
  136. package/dist/pages/admin-dashboard-page.d.ts +15 -0
  137. package/dist/pages/admin-dashboard-page.d.ts.map +1 -0
  138. package/dist/pages/admin-dashboard-page.js +8 -0
  139. package/dist/pages/admin-dashboard-page.js.map +1 -0
  140. package/dist/pages/index.d.ts +3 -0
  141. package/dist/pages/index.d.ts.map +1 -0
  142. package/dist/pages/index.js +3 -0
  143. package/dist/pages/index.js.map +1 -0
  144. package/dist/rich-text/admin-rich-text-editor.d.ts +27 -0
  145. package/dist/rich-text/admin-rich-text-editor.d.ts.map +1 -0
  146. package/dist/rich-text/admin-rich-text-editor.js +102 -0
  147. package/dist/rich-text/admin-rich-text-editor.js.map +1 -0
  148. package/dist/rich-text/admin-rich-text-file.d.ts +24 -0
  149. package/dist/rich-text/admin-rich-text-file.d.ts.map +1 -0
  150. package/dist/rich-text/admin-rich-text-file.js +80 -0
  151. package/dist/rich-text/admin-rich-text-file.js.map +1 -0
  152. package/dist/rich-text/admin-rich-text-view.d.ts +9 -0
  153. package/dist/rich-text/admin-rich-text-view.d.ts.map +1 -0
  154. package/dist/rich-text/admin-rich-text-view.js +9 -0
  155. package/dist/rich-text/admin-rich-text-view.js.map +1 -0
  156. package/dist/rich-text/index.d.ts +5 -0
  157. package/dist/rich-text/index.d.ts.map +1 -0
  158. package/dist/rich-text/index.js +5 -0
  159. package/dist/rich-text/index.js.map +1 -0
  160. package/dist/rich-text/plain-text.d.ts +9 -0
  161. package/dist/rich-text/plain-text.d.ts.map +1 -0
  162. package/dist/rich-text/plain-text.js +24 -0
  163. package/dist/rich-text/plain-text.js.map +1 -0
  164. package/package.json +163 -0
  165. package/rich-text.css +1 -0
  166. 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,3 @@
1
+ "use client";
2
+ export { AdminLogoutButton, } from "./admin-logout-button.js";
3
+ //# sourceMappingURL=index.js.map
@@ -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":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAErD,OAAO,EACL,aAAa,EACb,eAAe,EACf,sBAAsB,EACtB,gBAAgB,EAChB,aAAa,GACd,MAAM,qBAAqB,CAAC;AA8B7B,MAAM,aAAa,GAA8B;IAC/C,MAAM,EAAE,8BAA8B;IACtC,IAAI,EAAE,gBAAgB;IACtB,KAAK,EAAE,eAAe;IACtB,SAAS,EAAE,UAAU;IACrB,YAAY,EAAE,cAAc;IAC5B,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,IAAI;IACZ,aAAa,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,YAAY,QAAQ,iBAAiB;IAClE,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,8BAA8B;IAClE,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,sBAAsB;CAC3D,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAyC,EAC3E,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,YAAY,GAAG,EAAE,EACjB,KAAK,EACL,iBAAiB,EACjB,QAAQ,GAAG,EAAE,EACb,WAAW,EACX,MAAM,EACN,WAAW,GAAG,CAAC,EACf,MAAM,EAAE,cAAc,GACY;IAClC,MAAM,MAAM,GAAG,EAAE,GAAG,aAAa,EAAE,GAAG,cAAc,EAAE,CAAC;IACvD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,sBAAsB,CAAoB;QAC3D,YAAY,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACxC,IAAI;YACJ,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzC,GAAG,CAAC,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACpE,CAAC,CAAC;QACH,QAAQ,EAAE,IAAI;QACd,WAAW;QACX,QAAQ;QACR,QAAQ;QACR,GAAG,CAAC,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,UAAU,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC;QACpC,aAAa,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QAClF,UAAU,EAAE,CAAC,UAAU,EAAE,EAAE;YACzB,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAE5B,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO;YACT,CAAC;YAED,MAAM,OAAO,GACX,KAAK,CAAC,IAAI,KAAK,WAAW;gBACxB,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC;gBACjC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,YAAY;oBAC3B,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC;oBAChC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAExC,cAAc,CAAC,OAAO,CAAC,CAAC;QAC1B,CAAC;KACF,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAC9B,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,KAAK,WAAW,IAAI,QAAQ,CAAC,MAAM,KAAK,WAAW,CACjF,CAAC;IACF,MAAM,aAAa,GAAG,OAAO,CAC3B,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAC9F,CAAC,SAAS,CAAC,CACZ,CAAC;IACF,MAAM,eAAe,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7D,MAAM,kBAAkB,GAAG,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAE1D,SAAS,CAAC,GAAG,EAAE;QACb,iBAAiB,EAAE,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC,EAAE,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC,CAAC;IAEnC,SAAS,CAAC,GAAG,EAAE;QACb,KAAK,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE;YACtB,KAAiC,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC;QAC7D,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAEtC,OAAO,CACL,eAAK,SAAS,EAAC,qBAAqB,aAClC,KAAC,aAAa,IACZ,UAAU,EAAE,UAAU,gBACX,uCAAS,EACpB,SAAS,EAAE,iCAAiC,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,YAE9E,sBAAI,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,GAAK,GACnC,EAEhB,KAAC,eAAe,IACd,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,YAAG,SAAS,EAAC,4BAA4B,YAAE,MAAM,CAAC,KAAK,GAAK,EACnE,SAAS,EAAC,+BAA+B,EACzC,YAAY,EAAE;oBACZ,SAAS,EAAE,uBAAuB;oBAClC,OAAO,EAAE,MAAM,CAAC,SAAS;oBACzB,KAAK,EAAE,MAAM,CAAC,YAAY;oBAC1B,MAAM,EAAE;wBACN,KAAK,EAAE,MAAM,CAAC,KAAK;wBACnB,MAAM,EAAE,MAAM,CAAC,MAAM;qBACtB;oBACD,SAAS,EAAE;wBACT,SAAS,EAAE;4BACT,SAAS,EAAE,kCAAkC;yBAC9C;wBACD,QAAQ,EAAE;4BACR,SAAS,EAAE,iCAAiC;yBAC7C;wBACD,OAAO,EAAE;4BACP,SAAS,EAAE,gCAAgC;yBAC5C;wBACD,WAAW,EAAE;4BACX,SAAS,EAAE,sBAAsB;yBAClC;wBACD,YAAY,EAAE;4BACZ,SAAS,EAAE,mDAAmD;yBAC/D;qBACF;iBACF,GACD,EAED,CAAC,WAAW,IAAI,KAAK,EAAE,MAAM,CAAC,IAAI,CACjC,YAAG,IAAI,EAAC,OAAO,EAAC,SAAS,EAAC,sBAAsB,YAC7C,WAAW,IAAI,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,GAC9B,CACL,IACG,CACP,CAAC;AACJ,CAAC"}
@@ -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,3 @@
1
+ export { AdminAttachmentList, } from "./admin-attachment-list.js";
2
+ export { AdminFileAttachments, } from "./admin-file-attachments.js";
3
+ //# sourceMappingURL=index.js.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -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":"AAAA,YAAY,CAAC;;AAEb,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,eAAe,EACf,cAAc,EACd,WAAW,EACX,QAAQ,GAET,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,QAAQ,EAAc,MAAM,UAAU,CAAC;AAEhD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EACL,eAAe,GAEhB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,yBAAyB,EACzB,wBAAwB,GAGzB,MAAM,iBAAiB,CAAC;AAgCzB,MAAM,aAAa,GAAwB;IACzC,MAAM,EAAE,IAAI;IACZ,IAAI,EAAE,IAAI;IACV,MAAM,EAAE,SAAS;IACjB,SAAS,EAAE,aAAa;IACxB,cAAc,EAAE,QAAQ;IACxB,QAAQ,EAAE,IAAI;CACf,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,EAC5B,KAAK,EACL,WAAW,EACX,KAAK,EACL,MAAM,EACN,aAAa,EACb,UAAU,GAAG,EAAE,EACf,WAAW,EACX,MAAM,EAAE,cAAc,GACH;IACnB,MAAM,MAAM,GAAG,EAAE,GAAG,aAAa,EAAE,GAAG,cAAc,EAAE,CAAC;IACvD,MAAM,KAAK,GAAG,QAAQ,CAAC,wBAAwB,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC;IACvE,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACvE,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7E,MAAM,eAAe,GAAG,WAAW,CAAC,CAAC,aAAsB,EAAE,EAAE;QAC7D,YAAY,CAAC,aAAa,CAAC,CAAC;IAC9B,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE;QAC5B,eAAe,CAAC,GAAG,EAAE;YACnB,UAAU,CAAC,yBAAyB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;IAExB,OAAO,CACL,eAAK,SAAS,EAAC,oBAAoB,aACjC,KAAC,eAAe,IACd,KAAK,EAAE,KAAK,KACR,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EACxC,OAAO,EACL,8BACE,KAAC,IAAI,IAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE,SAAS,EAAC,4CAA4C,YAC/E,MAAM,CAAC,MAAM,GACT,EACP,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,IAAI,EACb,QAAQ,EAAE,OAAO,IAAI,SAAS,EAC9B,SAAS,EAAC,0CAA0C,YAEnD,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,GAC9D,IACR,GAEL,EAEF,eAAK,SAAS,EAAC,4BAA4B,aACxC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAC1B,cAAK,IAAI,EAAC,OAAO,EAAC,SAAS,EAAC,sCAAsC,YAC/D,KAAK,CAAC,KAAK,CAAC,OAAO,GAChB,CACP,EAEA,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;wBAC1B,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;wBAC3C,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC;wBAEzC,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;4BACtB,OAAO,IAAI,CAAC;wBACd,CAAC;wBAED,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;wBAC7B,MAAM,OAAO,GAAG,GAAG,IAAI,QAAQ,CAAC;wBAChC,MAAM,WAAW,GAAG,WAAW,EAAE,CAAC;4BAChC,KAAK;4BACL,KAAK;4BACL,KAAK;4BACL,OAAO;4BACP,YAAY,EAAE,eAAe;yBAC9B,CAAC,CAAC;wBAEH,OAAO,CACL,eAAgB,SAAS,EAAC,gBAAgB,aACxC,iBAAO,OAAO,EAAE,IAAI,EAAE,SAAS,EAAC,uBAAuB,aACpD,UAAU,CAAC,KAAK,EAChB,UAAU,CAAC,QAAQ,IAAI,CACtB,eAAM,SAAS,EAAC,0BAA0B,gBAAY,cAAI,kBAEnD,CACR,IACK,EAEP,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,CAC3B,WAAW,CACZ,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,KAAK,UAAU,CAAC,CAAC,CAAC,CACxC,gBAAM,SAAS,EAAC,mBAAmB,aACjC,KAAC,KAAK,IACJ,KAAK,EAAE,KAAK,EACZ,EAAE,EAAE,IAAI,EACR,IAAI,EAAC,UAAU,EACf,IAAI,EAAE,IAAI,kBACI,OAAO,CAAC,KAAK,CAAC,sBACV,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAC7C,SAAS,EAAC,0BAA0B,GACpC,EACF,yBAAO,MAAM,CAAC,QAAQ,GAAQ,IACzB,CACR,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,CACtC,MAAC,MAAM,IACL,KAAK,EAAE,KAAK,EACZ,EAAE,EAAE,IAAI,EACR,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,UAAU,CAAC,QAAQ,kBACf,OAAO,CAAC,KAAK,CAAC,sBACV,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAC7C,SAAS,EAAC,gBAAgB,aAEzB,CAAC,UAAU,CAAC,QAAQ,IAAI,iBAAQ,KAAK,EAAC,EAAE,YAAE,MAAM,CAAC,cAAc,GAAU,EACzE,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CACvB,iBAAmC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,YAC3D,MAAM,CAAC,KAAK,IADF,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAExB,CACV,CAAC,IACK,CACV,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,CACxB,KAAC,QAAQ,IACP,KAAK,EAAE,KAAK,EACZ,EAAE,EAAE,IAAI,EACR,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,UAAU,CAAC,QAAQ,kBACf,OAAO,CAAC,KAAK,CAAC,sBACV,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAC7C,SAAS,EAAC,kCAAkC,GAC5C,CACH,CAAC,CAAC,CAAC,CACF,KAAC,KAAK,IACJ,KAAK,EAAE,KAAK,EACZ,EAAE,EAAE,IAAI,EACR,IAAI,EAAE,UAAU,CAAC,SAAS,EAC1B,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,UAAU,CAAC,QAAQ,kBACf,OAAO,CAAC,KAAK,CAAC,sBACV,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAC7C,SAAS,EAAC,gBAAgB,GAC1B,CACH,EAEA,UAAU,CAAC,WAAW,IAAI,CACzB,eAAM,SAAS,EAAC,6BAA6B,YAAE,UAAU,CAAC,WAAW,GAAQ,CAC9E,EACA,KAAK,IAAI,CACR,eAAM,EAAE,EAAE,OAAO,EAAE,SAAS,EAAC,sBAAsB,YAChD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GACX,CACR,KAxEO,IAAI,CAyER,CACP,CAAC;oBACJ,CAAC,CAAC,IACE,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -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,3 @@
1
+ export { AdminCrudForm, } from "./admin-crud-form.js";
2
+ export { createAdminActionFormData, createAdminCrudFormState, } from "./form-state.js";
3
+ //# sourceMappingURL=index.js.map
@@ -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,3 @@
1
+ export * from "./pages/index.js";
2
+ export * from "./form/index.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,3 @@
1
+ export * from "./pages/index.js";
2
+ export * from "./form/index.js";
3
+ //# sourceMappingURL=index.js.map
@@ -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"}