gw-admin 0.1.0 → 0.2.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 +16 -0
- package/README.md +21 -0
- package/dist/crud/form/admin-crud-form.d.ts +1 -0
- package/dist/crud/form/admin-crud-form.d.ts.map +1 -1
- package/dist/crud/form/admin-crud-form.js +3 -2
- package/dist/crud/form/admin-crud-form.js.map +1 -1
- package/dist/crud/pages/admin-crud-list-page.d.ts +6 -2
- package/dist/crud/pages/admin-crud-list-page.d.ts.map +1 -1
- package/dist/crud/pages/admin-crud-list-page.js +5 -5
- package/dist/crud/pages/admin-crud-list-page.js.map +1 -1
- package/dist/form/admin-form.d.ts +24 -0
- package/dist/form/admin-form.d.ts.map +1 -0
- package/dist/form/admin-form.js +19 -0
- package/dist/form/admin-form.js.map +1 -0
- package/dist/form/index.d.ts +2 -0
- package/dist/form/index.d.ts.map +1 -0
- package/dist/form/index.js +2 -0
- package/dist/form/index.js.map +1 -0
- package/package.json +5 -1
- package/styles.css +6 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,22 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project are documented in this file.
|
|
4
4
|
|
|
5
|
+
## 0.2.0 - 2026-08-06
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- Application-owned form primitives through the new `gw-admin/form` entry point.
|
|
10
|
+
- Breadcrumb and additional header-action slots for CRUD list pages.
|
|
11
|
+
- Custom row-action rendering for CRUD list pages.
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
|
|
15
|
+
- `AdminCrudForm` now composes the same public form primitives available to consumers.
|
|
16
|
+
|
|
17
|
+
### Fixed
|
|
18
|
+
|
|
19
|
+
- CRUD search controls remain aligned when a consumer applies global margins to labels.
|
|
20
|
+
|
|
5
21
|
## 0.1.0 - 2026-07-31
|
|
6
22
|
|
|
7
23
|
### Added
|
package/README.md
CHANGED
|
@@ -178,6 +178,7 @@ back to the preset.
|
|
|
178
178
|
| `gw-admin/layout` | Shell and desktop sidebar |
|
|
179
179
|
| `gw-admin/layout/mobile` | Optional client-side mobile header and drawer |
|
|
180
180
|
| `gw-admin/header` | Breadcrumb page header |
|
|
181
|
+
| `gw-admin/form` | Application-owned form field, field-group, and alert primitives |
|
|
181
182
|
| `gw-admin/navigation` | Application-owned navigation rendering |
|
|
182
183
|
| `gw-admin/account` | Configurable logout button |
|
|
183
184
|
| `gw-admin/pages` | Dashboard and account pages |
|
|
@@ -190,6 +191,26 @@ back to the preset.
|
|
|
190
191
|
| `gw-admin/styles.css` | Optional admin UI theme |
|
|
191
192
|
| `gw-admin/rich-text.css` | Optional rich-editor behavioral baseline |
|
|
192
193
|
|
|
194
|
+
## Application-owned forms
|
|
195
|
+
|
|
196
|
+
Use the lower-level form primitives when a resource does not fit a flat CRUD
|
|
197
|
+
model, such as an editor that owns nested rows in a separate table:
|
|
198
|
+
|
|
199
|
+
```tsx
|
|
200
|
+
import { AdminFormAlert, AdminFormField, AdminFormFields } from "gw-admin/form";
|
|
201
|
+
|
|
202
|
+
<AdminFormFields>
|
|
203
|
+
{message && <AdminFormAlert tone="error">{message}</AdminFormAlert>}
|
|
204
|
+
<AdminFormField label="제목" htmlFor="title" required>
|
|
205
|
+
<input id="title" className="gw-admin-input" />
|
|
206
|
+
</AdminFormField>
|
|
207
|
+
</AdminFormFields>;
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
`AdminCrudForm` uses these same primitives internally. CRUD list pages also
|
|
211
|
+
accept `breadcrumbs`, `headerActions`, and `renderRowActions` for
|
|
212
|
+
resource-specific page composition.
|
|
213
|
+
|
|
193
214
|
Import focused subpaths in shared libraries and large applications. This keeps
|
|
194
215
|
optional feature dependencies outside bundles that do not use them.
|
|
195
216
|
|
|
@@ -2,6 +2,7 @@ import { type ReactNode } from "react";
|
|
|
2
2
|
import { type Store } from "gw-store";
|
|
3
3
|
import type { CrudAction, FormPageModel } from "next-headless-crud/core";
|
|
4
4
|
import { type AdminBreadcrumb } from "../../header/admin-page-header.js";
|
|
5
|
+
import { AdminFormField } from "../../form/admin-form.js";
|
|
5
6
|
import { type AdminCrudFieldMode, type AdminCrudFormState } from "./form-state.js";
|
|
6
7
|
type AdminFormField = FormPageModel["fields"][number];
|
|
7
8
|
export type AdminCrudFieldRenderContext = {
|
|
@@ -1 +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,+
|
|
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,EAAkB,cAAc,EAAmB,MAAM,0BAA0B,CAAC;AAC3F,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,+BAiIpB"}
|
|
@@ -5,6 +5,7 @@ import { startTransition, useActionState, useCallback, useState, } from "react";
|
|
|
5
5
|
import { useStore } from "gw-store";
|
|
6
6
|
import { Input, Select, Textarea } from "react-store-input";
|
|
7
7
|
import { AdminPageHeader, } from "../../header/admin-page-header.js";
|
|
8
|
+
import { AdminFormAlert, AdminFormField, AdminFormFields } from "../../form/admin-form.js";
|
|
8
9
|
import { createAdminActionFormData, createAdminCrudFormState, } from "./form-state.js";
|
|
9
10
|
const defaultLabels = {
|
|
10
11
|
cancel: "취소",
|
|
@@ -35,7 +36,7 @@ export function AdminCrudForm({ title, breadcrumbs, model, action, initialValues
|
|
|
35
36
|
formAction(createAdminActionFormData(store.state));
|
|
36
37
|
});
|
|
37
38
|
}, [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(
|
|
39
|
+
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(AdminFormFields, { className: "gw-admin-crud-form__fields", children: [state && !state.success && (_jsx(AdminFormAlert, { tone: "error", children: state.error.message })), model.fields.map((field) => {
|
|
39
40
|
const { name, definition, values } = field;
|
|
40
41
|
const mode = fieldModes[name] ?? "input";
|
|
41
42
|
if (mode === "hidden") {
|
|
@@ -50,7 +51,7 @@ export function AdminCrudForm({ title, breadcrumbs, model, action, initialValues
|
|
|
50
51
|
errorId,
|
|
51
52
|
setUploading: updateUploading,
|
|
52
53
|
});
|
|
53
|
-
return (
|
|
54
|
+
return (_jsx(AdminFormField, { label: definition.label, htmlFor: name, required: definition.required, ...(definition.description ? { description: definition.description } : {}), ...(error ? { error, errorId } : {}), 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" })) }, name));
|
|
54
55
|
})] })] }));
|
|
55
56
|
}
|
|
56
57
|
//# sourceMappingURL=admin-crud-form.js.map
|
|
@@ -1 +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,
|
|
1
|
+
{"version":3,"file":"admin-crud-form.js","sourceRoot":"","sources":["../../../src/crud/form/admin-crud-form.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { ReactNode } from "react";
|
|
2
|
-
import type { CrudResource } from "next-headless-crud/core";
|
|
2
|
+
import type { CrudResource, ListPageModel, ListRowModel } from "next-headless-crud/core";
|
|
3
3
|
import type { CrudRouteListPageProps } from "next-headless-crud/next";
|
|
4
|
+
import { type AdminBreadcrumb } from "../../header/admin-page-header.js";
|
|
4
5
|
export type AdminCrudListLabels = {
|
|
5
6
|
create: string;
|
|
6
7
|
search: string;
|
|
@@ -18,10 +19,13 @@ export type AdminCrudListLabels = {
|
|
|
18
19
|
};
|
|
19
20
|
export type AdminCrudListPageProps<TResource extends CrudResource = CrudResource> = CrudRouteListPageProps<TResource> & {
|
|
20
21
|
labels?: Partial<AdminCrudListLabels>;
|
|
22
|
+
breadcrumbs?: readonly AdminBreadcrumb[];
|
|
23
|
+
headerActions?: ReactNode;
|
|
21
24
|
renderValue?: (value: unknown, field: string) => ReactNode;
|
|
25
|
+
renderRowActions?: (row: ListRowModel, model: ListPageModel) => ReactNode;
|
|
22
26
|
};
|
|
23
27
|
/**
|
|
24
28
|
* Renders a complete list page from a next-headless-crud list model.
|
|
25
29
|
*/
|
|
26
|
-
export declare function AdminCrudListPage<TResource extends CrudResource = CrudResource>({ resource, searchParams, labels: labelOverrides, renderValue, }: AdminCrudListPageProps<TResource>): Promise<import("react").JSX.Element>;
|
|
30
|
+
export declare function AdminCrudListPage<TResource extends CrudResource = CrudResource>({ resource, searchParams, labels: labelOverrides, breadcrumbs, headerActions, renderValue, renderRowActions, }: AdminCrudListPageProps<TResource>): Promise<import("react").JSX.Element>;
|
|
27
31
|
//# sourceMappingURL=admin-crud-list-page.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-crud-list-page.d.ts","sourceRoot":"","sources":["../../../src/crud/pages/admin-crud-list-page.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"admin-crud-list-page.d.ts","sourceRoot":"","sources":["../../../src/crud/pages/admin-crud-list-page.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACzF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEtE,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,mCAAmC,CAAC;AAG3C,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,CAAC;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC;IACvE,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,sBAAsB,CAAC,SAAS,SAAS,YAAY,GAAG,YAAY,IAC9E,sBAAsB,CAAC,SAAS,CAAC,GAAG;IAClC,MAAM,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACtC,WAAW,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IACzC,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,KAAK,SAAS,CAAC;IAC3D,gBAAgB,CAAC,EAAE,CAAC,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,KAAK,SAAS,CAAC;CAC3E,CAAC;AAmBJ;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,SAAS,SAAS,YAAY,GAAG,YAAY,EAAE,EACrF,QAAQ,EACR,YAAY,EACZ,MAAM,EAAE,cAAc,EACtB,WAAW,EACX,aAAa,EACb,WAAgD,EAChD,gBAAgB,GACjB,EAAE,sBAAsB,CAAC,SAAS,CAAC,wCAgKnC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import Link from "next/link";
|
|
3
3
|
import { tableHref } from "next-headless-crud/query";
|
|
4
|
-
import { AdminPageHeader } from "../../header/admin-page-header.js";
|
|
4
|
+
import { AdminPageHeader, } from "../../header/admin-page-header.js";
|
|
5
5
|
import { formatAdminValue } from "./format-admin-value.js";
|
|
6
6
|
const defaultLabels = {
|
|
7
7
|
create: "새 글 등록",
|
|
@@ -21,13 +21,13 @@ const defaultLabels = {
|
|
|
21
21
|
/**
|
|
22
22
|
* Renders a complete list page from a next-headless-crud list model.
|
|
23
23
|
*/
|
|
24
|
-
export async function AdminCrudListPage({ resource, searchParams, labels: labelOverrides, renderValue = (value) => formatAdminValue(value), }) {
|
|
24
|
+
export async function AdminCrudListPage({ resource, searchParams, labels: labelOverrides, breadcrumbs, headerActions, renderValue = (value) => formatAdminValue(value), renderRowActions, }) {
|
|
25
25
|
const labels = { ...defaultLabels, ...labelOverrides };
|
|
26
26
|
const model = await resource.list(await searchParams);
|
|
27
|
-
return (_jsxs("main", { className: "gw-admin-page", children: [_jsx(AdminPageHeader, { title: model.resource.label, actions: _jsx(Link, { href: `${model.basePath}/new`, className: "gw-admin-button gw-admin-button--primary", children: labels.create }) }), _jsxs("form", { action: model.basePath, method: "get", className: "gw-admin-search", children: [_jsxs("label", { className: "gw-admin-search__query", children: [_jsx("span", { className: "gw-admin-field__label", children: labels.search }), _jsx("input", { type: "search", name: "q", defaultValue: model.query.search, placeholder: labels.searchPlaceholder, className: "gw-admin-input" })] }), Object.values(model.filters).map((filter) => (_jsxs("label", { className: "gw-admin-search__filter", children: [_jsx("span", { className: "gw-admin-field__label", children: filter.label }), _jsxs("select", { name: filter.name, defaultValue: String(model.query.filters[filter.field] ?? ""), className: "gw-admin-input", children: [_jsx("option", { value: "", children: labels.all }), filter.values.map((option) => (_jsx("option", { value: String(option.value), children: option.label }, String(option.value))))] })] }, filter.field))), _jsx("input", { type: "hidden", name: "pageSize", value: model.query.pageSize }), _jsx("button", { type: "submit", className: "gw-admin-button gw-admin-button--muted", children: labels.submit }), _jsx(Link, { href: model.basePath, className: "gw-admin-button gw-admin-button--secondary", children: labels.reset })] }), _jsx("div", { className: "gw-admin-table-wrap", children: _jsxs("table", { className: "gw-admin-table", children: [_jsx("thead", { children: _jsxs("tr", { children: [model.columns.map((column) => (_jsx("th", { children: column.sort ? (_jsxs(Link, { href: column.sort.href, className: "gw-admin-table__sort", children: [column.label, _jsx("span", { "aria-hidden": "true", children: column.sort.direction === "asc"
|
|
27
|
+
return (_jsxs("main", { className: "gw-admin-page", children: [_jsx(AdminPageHeader, { title: model.resource.label, ...(breadcrumbs ? { breadcrumbs } : {}), actions: _jsxs(_Fragment, { children: [headerActions, _jsx(Link, { href: `${model.basePath}/new`, className: "gw-admin-button gw-admin-button--primary", children: labels.create })] }) }), _jsxs("form", { action: model.basePath, method: "get", className: "gw-admin-search", children: [_jsxs("label", { className: "gw-admin-search__query", children: [_jsx("span", { className: "gw-admin-field__label", children: labels.search }), _jsx("input", { type: "search", name: "q", defaultValue: model.query.search, placeholder: labels.searchPlaceholder, className: "gw-admin-input" })] }), Object.values(model.filters).map((filter) => (_jsxs("label", { className: "gw-admin-search__filter", children: [_jsx("span", { className: "gw-admin-field__label", children: filter.label }), _jsxs("select", { name: filter.name, defaultValue: String(model.query.filters[filter.field] ?? ""), className: "gw-admin-input", children: [_jsx("option", { value: "", children: labels.all }), filter.values.map((option) => (_jsx("option", { value: String(option.value), children: option.label }, String(option.value))))] })] }, filter.field))), _jsx("input", { type: "hidden", name: "pageSize", value: model.query.pageSize }), _jsx("button", { type: "submit", className: "gw-admin-button gw-admin-button--muted", children: labels.submit }), _jsx(Link, { href: model.basePath, className: "gw-admin-button gw-admin-button--secondary", children: labels.reset })] }), _jsx("div", { className: "gw-admin-table-wrap", children: _jsxs("table", { className: "gw-admin-table", children: [_jsx("thead", { children: _jsxs("tr", { children: [model.columns.map((column) => (_jsx("th", { children: column.sort ? (_jsxs(Link, { href: column.sort.href, className: "gw-admin-table__sort", children: [column.label, _jsx("span", { "aria-hidden": "true", children: column.sort.direction === "asc"
|
|
28
28
|
? "↑"
|
|
29
29
|
: column.sort.direction === "desc"
|
|
30
30
|
? "↓"
|
|
31
|
-
: "↕" })] })) : (column.label) }, column.name))), _jsx("th", { children: labels.actions })] }) }), _jsxs("tbody", { children: [model.rows.map((row) => (_jsxs("tr", { children: [model.columns.map((column, columnIndex) => (_jsx("td", { children: columnIndex === 0 ? (_jsx(Link, { href: row.href, className: "gw-admin-table__primary-link", children: renderValue(row.data[column.name], column.name) })) : (_jsx("span", { className: "gw-admin-table__value", children: renderValue(row.data[column.name], column.name) })) }, column.name))), _jsx("td", { children:
|
|
31
|
+
: "↕" })] })) : (column.label) }, column.name))), _jsx("th", { children: labels.actions })] }) }), _jsxs("tbody", { children: [model.rows.map((row) => (_jsxs("tr", { children: [model.columns.map((column, columnIndex) => (_jsx("td", { children: columnIndex === 0 ? (_jsx(Link, { href: row.href, className: "gw-admin-table__primary-link", children: renderValue(row.data[column.name], column.name) })) : (_jsx("span", { className: "gw-admin-table__value", children: renderValue(row.data[column.name], column.name) })) }, column.name))), _jsx("td", { children: _jsx("div", { className: "gw-admin-table__actions", children: renderRowActions ? (renderRowActions(row, model)) : (_jsxs(_Fragment, { children: [_jsx(Link, { href: row.href, children: labels.view }), _jsx(Link, { href: row.editHref, children: labels.edit })] })) }) })] }, row.id))), model.rows.length === 0 && (_jsx("tr", { children: _jsx("td", { colSpan: model.columns.length + 1, className: "gw-admin-table__empty", children: labels.empty }) }))] })] }) }), _jsxs("footer", { className: "gw-admin-pagination", children: [_jsx("p", { children: labels.total(model.pagination.totalCount, model.pagination.page, model.pagination.pageCount) }), _jsxs("nav", { className: "gw-admin-pagination__navigation", "aria-label": "\uAC8C\uC2DC\uD310 \uD398\uC774\uC9C0 \uC774\uB3D9", children: [model.pagination.hasPreviousPage ? (_jsx(Link, { href: tableHref(model, { page: model.query.page - 1 }), className: "gw-admin-button gw-admin-button--secondary", children: labels.previous })) : (_jsx("span", { className: "gw-admin-button gw-admin-button--disabled", children: labels.previous })), model.pagination.hasNextPage ? (_jsx(Link, { href: tableHref(model, { page: model.query.page + 1 }), className: "gw-admin-button gw-admin-button--secondary", children: labels.next })) : (_jsx("span", { className: "gw-admin-button gw-admin-button--disabled", children: labels.next }))] })] })] }));
|
|
32
32
|
}
|
|
33
33
|
//# sourceMappingURL=admin-crud-list-page.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-crud-list-page.js","sourceRoot":"","sources":["../../../src/crud/pages/admin-crud-list-page.tsx"],"names":[],"mappings":";AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,
|
|
1
|
+
{"version":3,"file":"admin-crud-list-page.js","sourceRoot":"","sources":["../../../src/crud/pages/admin-crud-list-page.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { HTMLAttributes, ReactNode } from "react";
|
|
2
|
+
export type AdminFormFieldsProps = HTMLAttributes<HTMLDivElement>;
|
|
3
|
+
/** Groups application-owned form fields with the standard admin spacing. */
|
|
4
|
+
export declare function AdminFormFields({ className, ...props }: AdminFormFieldsProps): import("react").JSX.Element;
|
|
5
|
+
export type AdminFormFieldProps = Omit<HTMLAttributes<HTMLDivElement>, "children"> & {
|
|
6
|
+
label: ReactNode;
|
|
7
|
+
htmlFor?: string;
|
|
8
|
+
required?: boolean;
|
|
9
|
+
description?: ReactNode;
|
|
10
|
+
error?: readonly string[];
|
|
11
|
+
errorId?: string;
|
|
12
|
+
children: ReactNode;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Renders the shared label, description, and validation treatment around an
|
|
16
|
+
* application-owned input.
|
|
17
|
+
*/
|
|
18
|
+
export declare function AdminFormField({ label, htmlFor, required, description, error, errorId, children, className, ...props }: AdminFormFieldProps): import("react").JSX.Element;
|
|
19
|
+
export type AdminFormAlertProps = HTMLAttributes<HTMLDivElement> & {
|
|
20
|
+
tone?: "error";
|
|
21
|
+
};
|
|
22
|
+
/** Renders a form-level status message using the shared admin alert styles. */
|
|
23
|
+
export declare function AdminFormAlert({ tone, className, role, ...props }: AdminFormAlertProps): import("react").JSX.Element;
|
|
24
|
+
//# sourceMappingURL=admin-form.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-form.d.ts","sourceRoot":"","sources":["../../src/form/admin-form.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvD,MAAM,MAAM,oBAAoB,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;AAElE,4EAA4E;AAC5E,wBAAgB,eAAe,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,oBAAoB,+BAE5E;AAED,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,GAAG;IACnF,KAAK,EAAE,SAAS,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,SAAS,CAAC;CACrB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,OAAO,EACP,QAAgB,EAChB,WAAW,EACX,KAAK,EACL,OAAO,EACP,QAAQ,EACR,SAAS,EACT,GAAG,KAAK,EACT,EAAE,mBAAmB,+BA8BrB;AAED,MAAM,MAAM,mBAAmB,GAAG,cAAc,CAAC,cAAc,CAAC,GAAG;IACjE,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,EAC7B,IAAI,EACJ,SAAS,EACT,IAA6C,EAC7C,GAAG,KAAK,EACT,EAAE,mBAAmB,+BAQrB"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { classNames } from "../internal/class-names.js";
|
|
3
|
+
/** Groups application-owned form fields with the standard admin spacing. */
|
|
4
|
+
export function AdminFormFields({ className, ...props }) {
|
|
5
|
+
return _jsx("div", { className: classNames("gw-admin-form-fields", className), ...props });
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Renders the shared label, description, and validation treatment around an
|
|
9
|
+
* application-owned input.
|
|
10
|
+
*/
|
|
11
|
+
export function AdminFormField({ label, htmlFor, required = false, description, error, errorId, children, className, ...props }) {
|
|
12
|
+
const labelContent = (_jsxs(_Fragment, { children: [label, required && (_jsx("span", { className: "gw-admin-field__required", "aria-label": "\uD544\uC218", children: "*" }))] }));
|
|
13
|
+
return (_jsxs("div", { className: classNames("gw-admin-field", className), ...props, children: [htmlFor ? (_jsx("label", { htmlFor: htmlFor, className: "gw-admin-field__label", children: labelContent })) : (_jsx("div", { className: "gw-admin-field__label", children: labelContent })), children, description && _jsx("span", { className: "gw-admin-field__description", children: description }), error?.length ? (_jsx("span", { id: errorId, className: "gw-admin-field-error", children: error.join(" ") })) : null] }));
|
|
14
|
+
}
|
|
15
|
+
/** Renders a form-level status message using the shared admin alert styles. */
|
|
16
|
+
export function AdminFormAlert({ tone, className, role = tone === "error" ? "alert" : undefined, ...props }) {
|
|
17
|
+
return (_jsx("div", { role: role, className: classNames("gw-admin-alert", tone === "error" && "gw-admin-alert--error", className), ...props }));
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=admin-form.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-form.js","sourceRoot":"","sources":["../../src/form/admin-form.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAIxD,4EAA4E;AAC5E,MAAM,UAAU,eAAe,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAwB;IAC3E,OAAO,cAAK,SAAS,EAAE,UAAU,CAAC,sBAAsB,EAAE,SAAS,CAAC,KAAM,KAAK,GAAI,CAAC;AACtF,CAAC;AAYD;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,EAC7B,KAAK,EACL,OAAO,EACP,QAAQ,GAAG,KAAK,EAChB,WAAW,EACX,KAAK,EACL,OAAO,EACP,QAAQ,EACR,SAAS,EACT,GAAG,KAAK,EACY;IACpB,MAAM,YAAY,GAAG,CACnB,8BACG,KAAK,EACL,QAAQ,IAAI,CACX,eAAM,SAAS,EAAC,0BAA0B,gBAAY,cAAI,kBAEnD,CACR,IACA,CACJ,CAAC;IAEF,OAAO,CACL,eAAK,SAAS,EAAE,UAAU,CAAC,gBAAgB,EAAE,SAAS,CAAC,KAAM,KAAK,aAC/D,OAAO,CAAC,CAAC,CAAC,CACT,gBAAO,OAAO,EAAE,OAAO,EAAE,SAAS,EAAC,uBAAuB,YACvD,YAAY,GACP,CACT,CAAC,CAAC,CAAC,CACF,cAAK,SAAS,EAAC,uBAAuB,YAAE,YAAY,GAAO,CAC5D,EACA,QAAQ,EACR,WAAW,IAAI,eAAM,SAAS,EAAC,6BAA6B,YAAE,WAAW,GAAQ,EACjF,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CACf,eAAM,EAAE,EAAE,OAAO,EAAE,SAAS,EAAC,sBAAsB,YAChD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GACX,CACR,CAAC,CAAC,CAAC,IAAI,IACJ,CACP,CAAC;AACJ,CAAC;AAMD,+EAA+E;AAC/E,MAAM,UAAU,cAAc,CAAC,EAC7B,IAAI,EACJ,SAAS,EACT,IAAI,GAAG,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAC7C,GAAG,KAAK,EACY;IACpB,OAAO,CACL,cACE,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,UAAU,CAAC,gBAAgB,EAAE,IAAI,KAAK,OAAO,IAAI,uBAAuB,EAAE,SAAS,CAAC,KAC3F,KAAK,GACT,CACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/form/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,cAAc,EACd,eAAe,EACf,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,GAC1B,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/form/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,cAAc,EACd,eAAe,GAIhB,MAAM,iBAAiB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gw-admin",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Composable administration UI for the Next.js App Router and next-headless-crud.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -34,6 +34,10 @@
|
|
|
34
34
|
"types": "./dist/header/index.d.ts",
|
|
35
35
|
"import": "./dist/header/index.js"
|
|
36
36
|
},
|
|
37
|
+
"./form": {
|
|
38
|
+
"types": "./dist/form/index.d.ts",
|
|
39
|
+
"import": "./dist/form/index.js"
|
|
40
|
+
},
|
|
37
41
|
"./navigation": {
|
|
38
42
|
"types": "./dist/navigation/index.d.ts",
|
|
39
43
|
"import": "./dist/navigation/index.js"
|
package/styles.css
CHANGED
|
@@ -403,6 +403,11 @@
|
|
|
403
403
|
flex: 1;
|
|
404
404
|
}
|
|
405
405
|
|
|
406
|
+
.gw-admin-search__query,
|
|
407
|
+
.gw-admin-search__filter {
|
|
408
|
+
margin: 0;
|
|
409
|
+
}
|
|
410
|
+
|
|
406
411
|
.gw-admin-search__filter {
|
|
407
412
|
min-width: min(100%, 10rem);
|
|
408
413
|
}
|
|
@@ -580,6 +585,7 @@
|
|
|
580
585
|
margin-top: 2rem;
|
|
581
586
|
}
|
|
582
587
|
|
|
588
|
+
.gw-admin-form-fields,
|
|
583
589
|
.gw-admin-crud-form__fields {
|
|
584
590
|
display: grid;
|
|
585
591
|
gap: 1.5rem;
|