gw-admin 0.1.0 → 0.2.1
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 +23 -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/dist/rich-text/admin-rich-text-editor.d.ts.map +1 -1
- package/dist/rich-text/admin-rich-text-editor.js +19 -37
- package/dist/rich-text/admin-rich-text-editor.js.map +1 -1
- package/package.json +7 -3
- package/styles.css +6 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,29 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project are documented in this file.
|
|
4
4
|
|
|
5
|
+
## 0.2.1 - 2026-08-27
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
|
|
9
|
+
- Migrated the rich-text editor integration to the `gw-rich-text-editor` 0.2
|
|
10
|
+
command and file-attachment APIs.
|
|
11
|
+
|
|
12
|
+
## 0.2.0 - 2026-08-06
|
|
13
|
+
|
|
14
|
+
### Added
|
|
15
|
+
|
|
16
|
+
- Application-owned form primitives through the new `gw-admin/form` entry point.
|
|
17
|
+
- Breadcrumb and additional header-action slots for CRUD list pages.
|
|
18
|
+
- Custom row-action rendering for CRUD list pages.
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
|
|
22
|
+
- `AdminCrudForm` now composes the same public form primitives available to consumers.
|
|
23
|
+
|
|
24
|
+
### Fixed
|
|
25
|
+
|
|
26
|
+
- CRUD search controls remain aligned when a consumer applies global margins to labels.
|
|
27
|
+
|
|
5
28
|
## 0.1.0 - 2026-07-31
|
|
6
29
|
|
|
7
30
|
### 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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-rich-text-editor.d.ts","sourceRoot":"","sources":["../../src/rich-text/admin-rich-text-editor.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,
|
|
1
|
+
{"version":3,"file":"admin-rich-text-editor.d.ts","sourceRoot":"","sources":["../../src/rich-text/admin-rich-text-editor.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAaL,KAAK,eAAe,EACpB,KAAK,aAAa,EACnB,MAAM,8BAA8B,CAAC;AActC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,MAAM,kBAAkB,GAC1B,YAAY,GACZ,MAAM,GACN,QAAQ,GACR,WAAW,GACX,SAAS,GACT,YAAY,GACZ,aAAa,GACb,MAAM,GACN,MAAM,GACN,MAAM,CAAC;AAEX,MAAM,MAAM,wBAAwB,GAAG;IACrC,OAAO,EAAE,kBAAkB,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,QAAQ,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,wBAAwB,CAAC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI;IAC7E,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,KAAK,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,SAAS,wBAAwB,EAAE,GAAG,KAAK,CAAC;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AA+BF;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAC1E,KAAK,EACL,IAAI,EACJ,WAA4B,EAC5B,OAAe,EACf,WAAW,EACX,MAAM,EACN,KAAK,EACL,KAAK,EACL,OAAwB,EACxB,SAAS,GACV,EAAE,wBAAwB,CAAC,MAAM,CAAC,+BAmHlC"}
|
|
@@ -1,9 +1,20 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { useRef, useState } from "react";
|
|
4
|
-
import {
|
|
4
|
+
import { RichTextEditor, attachFiles, link, redo, toggleBold, toggleBulletList, toggleHeading, toggleItalic, toggleOrderedList, toggleUnderline, undo, } from "gw-rich-text-editor/unstyled";
|
|
5
5
|
import { useStoreController } from "react-store-input";
|
|
6
6
|
import { MdFormatBold, MdFormatItalic, MdFormatListBulleted, MdFormatListNumbered, MdFormatUnderlined, MdLink, MdPhoto, MdRedo, MdTitle, MdUndo, } from "react-icons/md";
|
|
7
|
+
const editorCommands = {
|
|
8
|
+
bold: toggleBold,
|
|
9
|
+
italic: toggleItalic,
|
|
10
|
+
underline: toggleUnderline,
|
|
11
|
+
heading: toggleHeading(2),
|
|
12
|
+
bulletList: toggleBulletList,
|
|
13
|
+
orderedList: toggleOrderedList,
|
|
14
|
+
link: link(),
|
|
15
|
+
undo,
|
|
16
|
+
redo,
|
|
17
|
+
};
|
|
7
18
|
const defaultToolbar = [
|
|
8
19
|
{ command: "attachFile", label: "파일 첨부", icon: MdPhoto },
|
|
9
20
|
{ command: "bold", label: "굵게", icon: MdFormatBold },
|
|
@@ -48,48 +59,16 @@ export function AdminRichTextEditor({ store, name, placeholder = "내용을 입
|
|
|
48
59
|
fileInputRef.current?.click();
|
|
49
60
|
return;
|
|
50
61
|
}
|
|
51
|
-
|
|
52
|
-
if (!commands) {
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
switch (command) {
|
|
56
|
-
case "bold":
|
|
57
|
-
commands.bold();
|
|
58
|
-
break;
|
|
59
|
-
case "italic":
|
|
60
|
-
commands.italic();
|
|
61
|
-
break;
|
|
62
|
-
case "underline":
|
|
63
|
-
commands.underline();
|
|
64
|
-
break;
|
|
65
|
-
case "heading":
|
|
66
|
-
commands.heading(2);
|
|
67
|
-
break;
|
|
68
|
-
case "bulletList":
|
|
69
|
-
commands.bulletList();
|
|
70
|
-
break;
|
|
71
|
-
case "orderedList":
|
|
72
|
-
commands.orderedList();
|
|
73
|
-
break;
|
|
74
|
-
case "link":
|
|
75
|
-
commands.link();
|
|
76
|
-
break;
|
|
77
|
-
case "undo":
|
|
78
|
-
commands.undo();
|
|
79
|
-
break;
|
|
80
|
-
case "redo":
|
|
81
|
-
commands.redo();
|
|
82
|
-
break;
|
|
83
|
-
}
|
|
62
|
+
editorRef.current?.execute(editorCommands[command]);
|
|
84
63
|
};
|
|
85
|
-
const handleFilesSelected =
|
|
64
|
+
const handleFilesSelected = (event) => {
|
|
86
65
|
const files = Array.from(event.currentTarget.files ?? []);
|
|
87
66
|
event.currentTarget.value = "";
|
|
88
67
|
if (files.length === 0 || !editorRef.current) {
|
|
89
68
|
return;
|
|
90
69
|
}
|
|
91
70
|
setUploadError("");
|
|
92
|
-
|
|
71
|
+
editorRef.current.execute(attachFiles(files));
|
|
93
72
|
};
|
|
94
73
|
const visibleToolbar = toolbar === false
|
|
95
74
|
? []
|
|
@@ -97,6 +76,9 @@ export function AdminRichTextEditor({ store, name, placeholder = "내용을 입
|
|
|
97
76
|
return (_jsxs("div", { className: className, children: [_jsxs("div", { className: "gw-admin-rich-text-editor", "aria-invalid": invalid, "aria-describedby": describedBy, children: [visibleToolbar.length > 0 && (_jsx("div", { className: "gw-admin-rich-text-editor__toolbar", role: "toolbar", "aria-label": "\uBCF8\uBB38 \uC11C\uC2DD", children: visibleToolbar.map((item) => {
|
|
98
77
|
const Icon = item.icon;
|
|
99
78
|
return (_jsx("button", { type: "button", "aria-label": item.label, title: item.label, onClick: () => runCommand(item.command), className: "gw-admin-rich-text-editor__tool", children: Icon ? _jsx(Icon, { "aria-hidden": "true" }) : _jsx("span", { children: item.label }) }, item.command));
|
|
100
|
-
}) })), _jsx(
|
|
79
|
+
}) })), _jsx(RichTextEditor, { ref: editorRef, defaultValue: typeof store.state[name] === "string" ? store.state[name] : "", placeholder: placeholder, ...(nodes ? { nodes } : {}), ...(marks ? { marks } : {}), fileAttachments: {
|
|
80
|
+
...(upload ? { upload } : {}),
|
|
81
|
+
onError: (_error, file) => setUploadError(`${file.name} 업로드에 실패했습니다.`),
|
|
82
|
+
}, onChange: dispatch, className: "gw-admin-rich-text-editor__surface" }), upload && (_jsx("input", { ref: fileInputRef, type: "file", multiple: true, className: "gw-admin-visually-hidden", tabIndex: -1, onChange: handleFilesSelected }))] }), uploadError && (_jsx("p", { role: "alert", className: "gw-admin-field-error", children: uploadError }))] }));
|
|
101
83
|
}
|
|
102
84
|
//# sourceMappingURL=admin-rich-text-editor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-rich-text-editor.js","sourceRoot":"","sources":["../../src/rich-text/admin-rich-text-editor.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAoB,MAAM,OAAO,CAAC;AAE3D,OAAO,EACL,UAAU,
|
|
1
|
+
{"version":3,"file":"admin-rich-text-editor.js","sourceRoot":"","sources":["../../src/rich-text/admin-rich-text-editor.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gw-admin",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.2.1",
|
|
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"
|
|
@@ -115,7 +119,7 @@
|
|
|
115
119
|
},
|
|
116
120
|
"peerDependencies": {
|
|
117
121
|
"gw-react-file-input": "^0.1.0",
|
|
118
|
-
"gw-rich-text-editor": "^0.1
|
|
122
|
+
"gw-rich-text-editor": "^0.2.1",
|
|
119
123
|
"gw-store": "^0.1.1",
|
|
120
124
|
"next": ">=15.0.0",
|
|
121
125
|
"next-headless-crud": "^0.1.0",
|
|
@@ -145,7 +149,7 @@
|
|
|
145
149
|
"@types/react": "^19.2.1",
|
|
146
150
|
"@types/react-dom": "^19.2.1",
|
|
147
151
|
"gw-react-file-input": "^0.1.0",
|
|
148
|
-
"gw-rich-text-editor": "^0.1
|
|
152
|
+
"gw-rich-text-editor": "^0.2.1",
|
|
149
153
|
"gw-store": "^0.1.1",
|
|
150
154
|
"next": "^16.2.12",
|
|
151
155
|
"next-headless-crud": "^0.1.0",
|
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;
|