@contentrail/editor 0.2.0 → 0.2.2
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/README.md +14 -4
- package/dist/admin/collection-query.d.ts +23 -0
- package/dist/admin/collection-query.d.ts.map +1 -0
- package/dist/admin/collection-query.js +71 -0
- package/dist/admin/collection-query.js.map +1 -0
- package/dist/admin/mount.d.ts +17 -0
- package/dist/admin/mount.d.ts.map +1 -0
- package/dist/admin/mount.js +43 -0
- package/dist/admin/mount.js.map +1 -0
- package/dist/admin/paginate.d.ts +8 -0
- package/dist/admin/paginate.d.ts.map +1 -0
- package/dist/admin/paginate.js +12 -0
- package/dist/admin/paginate.js.map +1 -0
- package/dist/admin/vite-plugin.d.ts +30 -0
- package/dist/admin/vite-plugin.d.ts.map +1 -0
- package/dist/admin/vite-plugin.js +159 -0
- package/dist/admin/vite-plugin.js.map +1 -0
- package/dist/api/types.d.ts +2 -0
- package/dist/api/types.d.ts.map +1 -1
- package/dist/fields/defaults.d.ts.map +1 -1
- package/dist/fields/defaults.js +22 -2
- package/dist/fields/defaults.js.map +1 -1
- package/dist/fields/types.d.ts +24 -5
- package/dist/fields/types.d.ts.map +1 -1
- package/dist/fields/types.js +3 -2
- package/dist/fields/types.js.map +1 -1
- package/dist/form/FieldControl.js +54 -4
- package/dist/form/FieldControl.js.map +1 -1
- package/dist/import/coerce.d.ts +11 -0
- package/dist/import/coerce.d.ts.map +1 -0
- package/dist/import/coerce.js +71 -0
- package/dist/import/coerce.js.map +1 -0
- package/dist/import/prepare.d.ts +30 -0
- package/dist/import/prepare.d.ts.map +1 -0
- package/dist/import/prepare.js +106 -0
- package/dist/import/prepare.js.map +1 -0
- package/dist/import/tabular.d.ts +6 -0
- package/dist/import/tabular.d.ts.map +1 -1
- package/dist/import/tabular.js +34 -7
- package/dist/import/tabular.js.map +1 -1
- package/dist/index.d.ts +10 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -2
- package/dist/index.js.map +1 -1
- package/dist/schema/create-admin-config.d.ts +21 -0
- package/dist/schema/create-admin-config.d.ts.map +1 -0
- package/dist/schema/create-admin-config.js +50 -0
- package/dist/schema/create-admin-config.js.map +1 -0
- package/dist/schema/from-zod.d.ts +19 -0
- package/dist/schema/from-zod.d.ts.map +1 -0
- package/dist/schema/from-zod.js +194 -0
- package/dist/schema/from-zod.js.map +1 -0
- package/dist/styles.css +103 -7
- package/dist/ui/CollectionImportWizard.d.ts +16 -0
- package/dist/ui/CollectionImportWizard.d.ts.map +1 -0
- package/dist/ui/CollectionImportWizard.js +144 -0
- package/dist/ui/CollectionImportWizard.js.map +1 -0
- package/dist/ui/EditorApp.d.ts +3 -0
- package/dist/ui/EditorApp.d.ts.map +1 -1
- package/dist/ui/EditorApp.js +232 -35
- package/dist/ui/EditorApp.js.map +1 -1
- package/package.json +18 -5
package/README.md
CHANGED
|
@@ -28,10 +28,10 @@ pnpm install
|
|
|
28
28
|
pnpm --filter @contentrail/editor build
|
|
29
29
|
```
|
|
30
30
|
|
|
31
|
-
### From npm (
|
|
31
|
+
### From npm (`0.2.2`)
|
|
32
32
|
|
|
33
33
|
```sh
|
|
34
|
-
pnpm add @contentrail/editor@0.2.
|
|
34
|
+
pnpm add @contentrail/editor@0.2.2 preact@^10.26.0
|
|
35
35
|
```
|
|
36
36
|
|
|
37
37
|
Import styles: `import "@contentrail/editor/styles.css"`.
|
|
@@ -49,14 +49,24 @@ Schemas validated through `@contentrail/core` require Zod **`^4.6.7`**.
|
|
|
49
49
|
| ------------- | -------------------------------------------- |
|
|
50
50
|
| `text` | Single-line string |
|
|
51
51
|
| `textarea` | Multiline string |
|
|
52
|
+
| `url` | URL input |
|
|
53
|
+
| `email` | Email input |
|
|
54
|
+
| `date` | Date input |
|
|
55
|
+
| `datetime` | Local datetime input |
|
|
52
56
|
| `number` | Numeric input |
|
|
53
57
|
| `boolean` | Checkbox |
|
|
54
58
|
| `enum` | Select from `options` |
|
|
59
|
+
| `multiselect` | Multi-select from `options` |
|
|
60
|
+
| `tags` | Comma-separated string list |
|
|
61
|
+
| `media` | Public media URL |
|
|
62
|
+
| `relation` | Entry id in another collection |
|
|
55
63
|
| `object` | Nested field group |
|
|
56
64
|
| `array` | List of item widgets |
|
|
57
65
|
| `unsupported` | Non-editable notice (never silent free text) |
|
|
58
66
|
|
|
59
|
-
Zod remains the server validation source of truth.
|
|
67
|
+
Zod remains the server validation source of truth. `fieldsFromZodSchema` maps public Zod `.shape` / `.def.type` (ADR 026). Supply `fields` or `fieldHints` when the default mapping is not good enough.
|
|
68
|
+
|
|
69
|
+
Self-hosted `/admin`: see `docs/ADMIN.md`. Use `createAdminSiteConfig`, `mountAdmin`, or `@contentrail/editor/vite`.
|
|
60
70
|
|
|
61
71
|
## Minimal usage
|
|
62
72
|
|
|
@@ -118,4 +128,4 @@ Working copies may use in-memory state and `sessionStorage` for the current tab.
|
|
|
118
128
|
|
|
119
129
|
## Example
|
|
120
130
|
|
|
121
|
-
See `
|
|
131
|
+
See `docs/ADMIN.md` for wiring `/admin` into a static site.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export type CollectionSortKey = "id" | "title";
|
|
2
|
+
export type CollectionSortDir = "asc" | "desc";
|
|
3
|
+
export interface CollectionEntry {
|
|
4
|
+
readonly id: string;
|
|
5
|
+
readonly data: Record<string, unknown>;
|
|
6
|
+
}
|
|
7
|
+
export declare function titleOfEntry(data: Record<string, unknown>, titleField: string | undefined, fallback: string): string;
|
|
8
|
+
export declare function queryCollectionEntries(entries: readonly CollectionEntry[], options: {
|
|
9
|
+
readonly filter: string;
|
|
10
|
+
readonly sortKey: CollectionSortKey;
|
|
11
|
+
readonly sortDir: CollectionSortDir;
|
|
12
|
+
readonly titleField?: string;
|
|
13
|
+
readonly page: number;
|
|
14
|
+
readonly pageSize: number;
|
|
15
|
+
}): {
|
|
16
|
+
page: number;
|
|
17
|
+
pageCount: number;
|
|
18
|
+
items: readonly CollectionEntry[];
|
|
19
|
+
filtered: CollectionEntry[];
|
|
20
|
+
};
|
|
21
|
+
export declare function duplicateIds(entries: readonly CollectionEntry[]): Set<string>;
|
|
22
|
+
export declare function entriesToCsv(entries: readonly CollectionEntry[], fieldNames: readonly string[]): string;
|
|
23
|
+
//# sourceMappingURL=collection-query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collection-query.d.ts","sourceRoot":"","sources":["../../src/admin/collection-query.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,iBAAiB,GAAG,IAAI,GAAG,OAAO,CAAC;AAC/C,MAAM,MAAM,iBAAiB,GAAG,KAAK,GAAG,MAAM,CAAC;AAE/C,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACxC;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,QAAQ,EAAE,MAAM,GACf,MAAM,CAMR;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,SAAS,eAAe,EAAE,EACnC,OAAO,EAAE;IACP,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;IACpC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;;;;;EA4BF;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,SAAS,eAAe,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAU7E;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,SAAS,eAAe,EAAE,EACnC,UAAU,EAAE,SAAS,MAAM,EAAE,GAC5B,MAAM,CAWR"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { paginateItems } from "./paginate.js";
|
|
2
|
+
export function titleOfEntry(data, titleField, fallback) {
|
|
3
|
+
if (titleField === undefined) {
|
|
4
|
+
return fallback;
|
|
5
|
+
}
|
|
6
|
+
const value = data[titleField];
|
|
7
|
+
return typeof value === "string" && value.trim() !== "" ? value : fallback;
|
|
8
|
+
}
|
|
9
|
+
export function queryCollectionEntries(entries, options) {
|
|
10
|
+
const q = options.filter.trim().toLowerCase();
|
|
11
|
+
const filtered = q === ""
|
|
12
|
+
? [...entries]
|
|
13
|
+
: entries.filter((entry) => {
|
|
14
|
+
const title = titleOfEntry(entry.data, options.titleField, entry.id).toLowerCase();
|
|
15
|
+
return entry.id.toLowerCase().includes(q) || title.includes(q);
|
|
16
|
+
});
|
|
17
|
+
filtered.sort((a, b) => {
|
|
18
|
+
const left = options.sortKey === "id"
|
|
19
|
+
? a.id
|
|
20
|
+
: titleOfEntry(a.data, options.titleField, a.id);
|
|
21
|
+
const right = options.sortKey === "id"
|
|
22
|
+
? b.id
|
|
23
|
+
: titleOfEntry(b.data, options.titleField, b.id);
|
|
24
|
+
const compared = left.localeCompare(right);
|
|
25
|
+
return options.sortDir === "asc" ? compared : -compared;
|
|
26
|
+
});
|
|
27
|
+
const page = paginateItems(filtered, options.page, options.pageSize);
|
|
28
|
+
return { filtered, ...page };
|
|
29
|
+
}
|
|
30
|
+
export function duplicateIds(entries) {
|
|
31
|
+
const seen = new Set();
|
|
32
|
+
const duplicates = new Set();
|
|
33
|
+
for (const entry of entries) {
|
|
34
|
+
if (seen.has(entry.id)) {
|
|
35
|
+
duplicates.add(entry.id);
|
|
36
|
+
}
|
|
37
|
+
seen.add(entry.id);
|
|
38
|
+
}
|
|
39
|
+
return duplicates;
|
|
40
|
+
}
|
|
41
|
+
export function entriesToCsv(entries, fieldNames) {
|
|
42
|
+
const headers = ["id", ...fieldNames];
|
|
43
|
+
const lines = [headers.join(",")];
|
|
44
|
+
for (const entry of entries) {
|
|
45
|
+
const cells = [
|
|
46
|
+
csvCell(entry.id),
|
|
47
|
+
...fieldNames.map((name) => csvCell(stringifyCell(entry.data[name]))),
|
|
48
|
+
];
|
|
49
|
+
lines.push(cells.join(","));
|
|
50
|
+
}
|
|
51
|
+
return `${lines.join("\n")}\n`;
|
|
52
|
+
}
|
|
53
|
+
function stringifyCell(value) {
|
|
54
|
+
if (value === null || value === undefined) {
|
|
55
|
+
return "";
|
|
56
|
+
}
|
|
57
|
+
if (typeof value === "string") {
|
|
58
|
+
return value;
|
|
59
|
+
}
|
|
60
|
+
if (typeof value === "number" || typeof value === "boolean") {
|
|
61
|
+
return String(value);
|
|
62
|
+
}
|
|
63
|
+
return JSON.stringify(value);
|
|
64
|
+
}
|
|
65
|
+
function csvCell(value) {
|
|
66
|
+
if (/[",\n\r]/.test(value)) {
|
|
67
|
+
return `"${value.replaceAll('"', '""')}"`;
|
|
68
|
+
}
|
|
69
|
+
return value;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=collection-query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collection-query.js","sourceRoot":"","sources":["../../src/admin/collection-query.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type ContentRailApiClient } from "../api/client.js";
|
|
2
|
+
import type { EditorSiteConfig } from "../fields/types.js";
|
|
3
|
+
export interface MountAdminOptions {
|
|
4
|
+
readonly target: HTMLElement;
|
|
5
|
+
readonly sites: readonly EditorSiteConfig[];
|
|
6
|
+
readonly api?: ContentRailApiClient;
|
|
7
|
+
readonly apiBaseUrl?: string;
|
|
8
|
+
readonly title?: string;
|
|
9
|
+
readonly pageSize?: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Mounts the self-hosted admin UI. Never accepts Git/storage credentials.
|
|
13
|
+
*/
|
|
14
|
+
export declare function mountAdmin(options: MountAdminOptions): {
|
|
15
|
+
unmount: () => void;
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=mount.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mount.d.ts","sourceRoot":"","sources":["../../src/admin/mount.tsx"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAG3D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC5C,QAAQ,CAAC,GAAG,CAAC,EAAE,oBAAoB,CAAC;IACpC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG;IACtD,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CA+CA"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { jsx as _jsx } from "preact/jsx-runtime";
|
|
2
|
+
import { render } from "preact";
|
|
3
|
+
import { createContentRailApiClient, } from "../api/client.js";
|
|
4
|
+
import { EditorApp } from "../ui/EditorApp.js";
|
|
5
|
+
/**
|
|
6
|
+
* Mounts the self-hosted admin UI. Never accepts Git/storage credentials.
|
|
7
|
+
*/
|
|
8
|
+
export function mountAdmin(options) {
|
|
9
|
+
if (options.sites.length === 0) {
|
|
10
|
+
options.target.innerHTML =
|
|
11
|
+
'<p role="alert">ContentRail admin: no collections are registered.</p>';
|
|
12
|
+
return {
|
|
13
|
+
unmount: () => {
|
|
14
|
+
options.target.replaceChildren();
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
const api = options.api ??
|
|
19
|
+
(options.apiBaseUrl !== undefined && options.apiBaseUrl !== ""
|
|
20
|
+
? createContentRailApiClient({
|
|
21
|
+
baseUrl: options.apiBaseUrl,
|
|
22
|
+
credentials: "include",
|
|
23
|
+
})
|
|
24
|
+
: null);
|
|
25
|
+
if (api === null) {
|
|
26
|
+
options.target.innerHTML =
|
|
27
|
+
'<p role="alert">ContentRail admin is missing apiBaseUrl. Set the public Worker URL (never a GitHub token) in the admin integration options.</p>';
|
|
28
|
+
return {
|
|
29
|
+
unmount: () => {
|
|
30
|
+
options.target.replaceChildren();
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
render(_jsx(EditorApp, { api: api, sites: options.sites, title: options.title ?? "Content", ...(options.pageSize !== undefined
|
|
35
|
+
? { pageSize: options.pageSize }
|
|
36
|
+
: {}) }), options.target);
|
|
37
|
+
return {
|
|
38
|
+
unmount: () => {
|
|
39
|
+
render(null, options.target);
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=mount.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mount.js","sourceRoot":"","sources":["../../src/admin/mount.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EACL,0BAA0B,GAE3B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAW/C;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,OAA0B;IAGnD,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,MAAM,CAAC,SAAS;YACtB,uEAAuE,CAAC;QAC1E,OAAO;YACL,OAAO,EAAE,GAAG,EAAE;gBACZ,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;YACnC,CAAC;SACF,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GACP,OAAO,CAAC,GAAG;QACX,CAAC,OAAO,CAAC,UAAU,KAAK,SAAS,IAAI,OAAO,CAAC,UAAU,KAAK,EAAE;YAC5D,CAAC,CAAC,0BAA0B,CAAC;gBACzB,OAAO,EAAE,OAAO,CAAC,UAAU;gBAC3B,WAAW,EAAE,SAAS;aACvB,CAAC;YACJ,CAAC,CAAC,IAAI,CAAC,CAAC;IAEZ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,MAAM,CAAC,SAAS;YACtB,iJAAiJ,CAAC;QACpJ,OAAO;YACL,OAAO,EAAE,GAAG,EAAE;gBACZ,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;YACnC,CAAC;SACF,CAAC;IACJ,CAAC;IAED,MAAM,CACJ,KAAC,SAAS,IACR,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,OAAO,CAAC,KAAK,EACpB,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,SAAS,KAC7B,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS;YACjC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE;YAChC,CAAC,CAAC,EAAE,CAAC,GACP,EACF,OAAO,CAAC,MAAM,CACf,CAAC;IAEF,OAAO;QACL,OAAO,EAAE,GAAG,EAAE;YACZ,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface PaginatedSlice<T> {
|
|
2
|
+
readonly page: number;
|
|
3
|
+
readonly pageCount: number;
|
|
4
|
+
readonly items: readonly T[];
|
|
5
|
+
}
|
|
6
|
+
/** Slice a list so collection screens never render every row at once. */
|
|
7
|
+
export declare function paginateItems<T>(items: readonly T[], page: number, pageSize: number): PaginatedSlice<T>;
|
|
8
|
+
//# sourceMappingURL=paginate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paginate.d.ts","sourceRoot":"","sources":["../../src/admin/paginate.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;CAC9B;AAED,yEAAyE;AACzE,wBAAgB,aAAa,CAAC,CAAC,EAC7B,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,cAAc,CAAC,CAAC,CAAC,CASnB"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Slice a list so collection screens never render every row at once. */
|
|
2
|
+
export function paginateItems(items, page, pageSize) {
|
|
3
|
+
const size = pageSize < 1 ? 1 : pageSize;
|
|
4
|
+
const pageCount = Math.max(1, Math.ceil(items.length / size));
|
|
5
|
+
const safePage = Math.min(Math.max(0, page), pageCount - 1);
|
|
6
|
+
return {
|
|
7
|
+
page: safePage,
|
|
8
|
+
pageCount,
|
|
9
|
+
items: items.slice(safePage * size, safePage * size + size),
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=paginate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paginate.js","sourceRoot":"","sources":["../../src/admin/paginate.ts"],"names":[],"mappings":"AAMA,yEAAyE;AACzE,MAAM,UAAU,aAAa,CAC3B,KAAmB,EACnB,IAAY,EACZ,QAAgB;IAEhB,MAAM,IAAI,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IACzC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;IAC5D,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,SAAS;QACT,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,EAAE,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC;KAC5D,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { ContentCollection } from "@contentrail/core";
|
|
2
|
+
import type { Plugin } from "vite";
|
|
3
|
+
import type { EditorSiteConfig } from "../fields/types.js";
|
|
4
|
+
import { type AdminCollectionInput } from "../schema/create-admin-config.js";
|
|
5
|
+
export interface ContentrailAdminOptions {
|
|
6
|
+
readonly siteId: string;
|
|
7
|
+
readonly label?: string;
|
|
8
|
+
/**
|
|
9
|
+
* Public Worker origin, e.g. `https://cms.example.workers.dev`.
|
|
10
|
+
* Never pass GitHub tokens, Access service tokens, or storage keys.
|
|
11
|
+
*/
|
|
12
|
+
readonly apiBaseUrl: string;
|
|
13
|
+
readonly collections: Readonly<Record<string, ContentCollection>>;
|
|
14
|
+
readonly collectionUi?: Readonly<Record<string, Omit<AdminCollectionInput, "collection">>>;
|
|
15
|
+
readonly title?: string;
|
|
16
|
+
readonly pageSize?: number;
|
|
17
|
+
/**
|
|
18
|
+
* When true (default), Vite serves `/admin` HTML and emits `admin/index.html`.
|
|
19
|
+
* Astro sets this to false and injects its own `/admin` page.
|
|
20
|
+
*/
|
|
21
|
+
readonly serveRoute?: boolean;
|
|
22
|
+
}
|
|
23
|
+
export declare function assertContentrailAdminOptions(options: ContentrailAdminOptions): void;
|
|
24
|
+
export declare function serializeAdminSite(options: ContentrailAdminOptions): EditorSiteConfig;
|
|
25
|
+
/**
|
|
26
|
+
* Serves a self-hosted admin UI at `/admin` without changing public routes.
|
|
27
|
+
* Requires `@contentrail/editor` and `preact` in the website project.
|
|
28
|
+
*/
|
|
29
|
+
export declare function contentrailAdmin(options: ContentrailAdminOptions): Plugin;
|
|
30
|
+
//# sourceMappingURL=vite-plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vite-plugin.d.ts","sourceRoot":"","sources":["../../src/admin/vite-plugin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,kCAAkC,CAAC;AAO1C,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAClE,QAAQ,CAAC,YAAY,CAAC,EAAE,QAAQ,CAC9B,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,YAAY,CAAC,CAAC,CACzD,CAAC;IACF,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B;;;OAGG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,uBAAuB,GAC/B,IAAI,CA+BN;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,uBAAuB,GAC/B,gBAAgB,CASlB;AAqCD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,MAAM,CAqFzE"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { createAdminSiteConfig, } from "../schema/create-admin-config.js";
|
|
3
|
+
const ADMIN_ENTRY = "virtual:contentrail-admin-entry";
|
|
4
|
+
const ADMIN_CONFIG = "virtual:contentrail-admin-config";
|
|
5
|
+
const RESOLVED_ENTRY = `\0${ADMIN_ENTRY}`;
|
|
6
|
+
const RESOLVED_CONFIG = `\0${ADMIN_CONFIG}`;
|
|
7
|
+
export function assertContentrailAdminOptions(options) {
|
|
8
|
+
if (options.siteId.trim() === "") {
|
|
9
|
+
throw new Error("contentrailAdmin: siteId is required (Worker site identifier).");
|
|
10
|
+
}
|
|
11
|
+
if (Object.keys(options.collections).length === 0) {
|
|
12
|
+
throw new Error("contentrailAdmin: no collections registered. Pass defineCollection exports in collections.");
|
|
13
|
+
}
|
|
14
|
+
if (options.apiBaseUrl.trim() === "") {
|
|
15
|
+
throw new Error("contentrailAdmin: apiBaseUrl is required. Use the public Worker URL, never a repository token.");
|
|
16
|
+
}
|
|
17
|
+
if (/github_pat_|ghp_|sk-|BEGIN |token=/i.test(options.apiBaseUrl)) {
|
|
18
|
+
throw new Error("contentrailAdmin: apiBaseUrl looks like a secret. Pass only a public HTTPS origin.");
|
|
19
|
+
}
|
|
20
|
+
try {
|
|
21
|
+
const url = new URL(options.apiBaseUrl);
|
|
22
|
+
if (url.protocol !== "https:" && url.protocol !== "http:") {
|
|
23
|
+
throw new Error("unsupported protocol");
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
throw new Error(`contentrailAdmin: apiBaseUrl is not a valid URL: ${options.apiBaseUrl}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export function serializeAdminSite(options) {
|
|
31
|
+
return createAdminSiteConfig({
|
|
32
|
+
siteId: options.siteId,
|
|
33
|
+
label: options.label ?? options.siteId,
|
|
34
|
+
collections: Object.values(options.collections).map((collection) => ({
|
|
35
|
+
collection,
|
|
36
|
+
...options.collectionUi?.[collection.name],
|
|
37
|
+
})),
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
function adminHtml(scriptSrc) {
|
|
41
|
+
return `<!doctype html>
|
|
42
|
+
<html lang="en">
|
|
43
|
+
<head>
|
|
44
|
+
<meta charset="utf-8" />
|
|
45
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
46
|
+
<meta name="robots" content="noindex" />
|
|
47
|
+
<title>ContentRail Admin</title>
|
|
48
|
+
</head>
|
|
49
|
+
<body>
|
|
50
|
+
<div id="contentrail-admin"></div>
|
|
51
|
+
<script type="module" src="${scriptSrc}"></script>
|
|
52
|
+
</body>
|
|
53
|
+
</html>
|
|
54
|
+
`;
|
|
55
|
+
}
|
|
56
|
+
function mergeInput(previous, root) {
|
|
57
|
+
const admin = { contentrailAdmin: ADMIN_ENTRY };
|
|
58
|
+
if (previous === undefined) {
|
|
59
|
+
return { main: path.resolve(root, "index.html"), ...admin };
|
|
60
|
+
}
|
|
61
|
+
if (typeof previous === "string") {
|
|
62
|
+
return { main: previous, ...admin };
|
|
63
|
+
}
|
|
64
|
+
if (Array.isArray(previous)) {
|
|
65
|
+
const named = {};
|
|
66
|
+
previous.forEach((item, index) => {
|
|
67
|
+
named[`input${index}`] = String(item);
|
|
68
|
+
});
|
|
69
|
+
return { ...named, ...admin };
|
|
70
|
+
}
|
|
71
|
+
return { ...previous, ...admin };
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Serves a self-hosted admin UI at `/admin` without changing public routes.
|
|
75
|
+
* Requires `@contentrail/editor` and `preact` in the website project.
|
|
76
|
+
*/
|
|
77
|
+
export function contentrailAdmin(options) {
|
|
78
|
+
assertContentrailAdminOptions(options);
|
|
79
|
+
const site = serializeAdminSite(options);
|
|
80
|
+
const serveRoute = options.serveRoute !== false;
|
|
81
|
+
return {
|
|
82
|
+
name: "contentrail-admin",
|
|
83
|
+
config(userConfig) {
|
|
84
|
+
if (!serveRoute) {
|
|
85
|
+
return undefined;
|
|
86
|
+
}
|
|
87
|
+
const root = userConfig.root ?? process.cwd();
|
|
88
|
+
return {
|
|
89
|
+
build: {
|
|
90
|
+
rollupOptions: {
|
|
91
|
+
input: mergeInput(userConfig.build?.rollupOptions?.input, root),
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
},
|
|
96
|
+
configureServer(server) {
|
|
97
|
+
if (!serveRoute) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
server.middlewares.use((request, response, next) => {
|
|
101
|
+
const url = request.url?.split("?")[0] ?? "";
|
|
102
|
+
if (url !== "/admin" && url !== "/admin/") {
|
|
103
|
+
next();
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
response.setHeader("Content-Type", "text/html; charset=utf-8");
|
|
107
|
+
response.setHeader("X-Robots-Tag", "noindex");
|
|
108
|
+
response.setHeader("Cache-Control", "no-store");
|
|
109
|
+
response.end(adminHtml(`/@id/${ADMIN_ENTRY}`));
|
|
110
|
+
});
|
|
111
|
+
},
|
|
112
|
+
resolveId(id) {
|
|
113
|
+
if (id === ADMIN_ENTRY) {
|
|
114
|
+
return RESOLVED_ENTRY;
|
|
115
|
+
}
|
|
116
|
+
if (id === ADMIN_CONFIG) {
|
|
117
|
+
return RESOLVED_CONFIG;
|
|
118
|
+
}
|
|
119
|
+
return undefined;
|
|
120
|
+
},
|
|
121
|
+
load(id) {
|
|
122
|
+
if (id === RESOLVED_CONFIG) {
|
|
123
|
+
return `export const site = ${JSON.stringify(site)};
|
|
124
|
+
export const apiBaseUrl = ${JSON.stringify(options.apiBaseUrl)};
|
|
125
|
+
export const title = ${JSON.stringify(options.title ?? "Content")};
|
|
126
|
+
export const pageSize = ${JSON.stringify(options.pageSize ?? 25)};
|
|
127
|
+
`;
|
|
128
|
+
}
|
|
129
|
+
if (id === RESOLVED_ENTRY) {
|
|
130
|
+
return `import { mountAdmin } from "@contentrail/editor";
|
|
131
|
+
import "@contentrail/editor/styles.css";
|
|
132
|
+
import { site, apiBaseUrl, title, pageSize } from "${ADMIN_CONFIG}";
|
|
133
|
+
const root = document.getElementById("contentrail-admin");
|
|
134
|
+
if (!(root instanceof HTMLElement)) {
|
|
135
|
+
throw new Error("#contentrail-admin is required");
|
|
136
|
+
}
|
|
137
|
+
mountAdmin({ target: root, sites: [site], apiBaseUrl, title, pageSize });
|
|
138
|
+
`;
|
|
139
|
+
}
|
|
140
|
+
return undefined;
|
|
141
|
+
},
|
|
142
|
+
generateBundle(_output, bundle) {
|
|
143
|
+
if (!serveRoute) {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
const entry = Object.values(bundle).find((item) => item.type === "chunk" &&
|
|
147
|
+
item.isEntry &&
|
|
148
|
+
item.facadeModuleId === RESOLVED_ENTRY);
|
|
149
|
+
const fileName = entry && entry.type === "chunk" ? entry.fileName : null;
|
|
150
|
+
const scriptSrc = fileName === null ? "/admin.js" : `/${fileName}`;
|
|
151
|
+
this.emitFile({
|
|
152
|
+
type: "asset",
|
|
153
|
+
fileName: "admin/index.html",
|
|
154
|
+
source: adminHtml(scriptSrc),
|
|
155
|
+
});
|
|
156
|
+
},
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=vite-plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vite-plugin.js","sourceRoot":"","sources":["../../src/admin/vite-plugin.ts"],"names":[],"mappings":"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"}
|
package/dist/api/types.d.ts
CHANGED
package/dist/api/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/api/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE;QACd,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACxC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACzC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;QAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;IACF,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;CACzC;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CAChE;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;QAC/B,OAAO,EAAE,MAAM,CAAC;QAChB,aAAa,EAAE,MAAM,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/api/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/fields/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,uDAAuD;AACvD,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,eAAe,EAAE,GACjC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAMzB;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,
|
|
1
|
+
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/fields/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,uDAAuD;AACvD,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,eAAe,EAAE,GACjC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAMzB;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAgClE;AAED,wBAAgB,UAAU,CACxB,MAAM,EAAE,SAAS,eAAe,EAAE,GACjC,eAAe,EAAE,CAKnB;AAED,kFAAkF;AAClF,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,eAAe,EAAE,EAClC,IAAI,EAAE,OAAO,EACb,IAAI,GAAE,MAAM,EAAO,GAClB,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CA6C1C"}
|
package/dist/fields/defaults.js
CHANGED
|
@@ -7,7 +7,14 @@ export function emptyValueForFields(fields) {
|
|
|
7
7
|
return result;
|
|
8
8
|
}
|
|
9
9
|
export function emptyValueForField(field) {
|
|
10
|
-
if (field.widget === "text" ||
|
|
10
|
+
if (field.widget === "text" ||
|
|
11
|
+
field.widget === "textarea" ||
|
|
12
|
+
field.widget === "url" ||
|
|
13
|
+
field.widget === "email" ||
|
|
14
|
+
field.widget === "date" ||
|
|
15
|
+
field.widget === "datetime" ||
|
|
16
|
+
field.widget === "media" ||
|
|
17
|
+
field.widget === "relation") {
|
|
11
18
|
return "";
|
|
12
19
|
}
|
|
13
20
|
if (field.widget === "number") {
|
|
@@ -19,6 +26,9 @@ export function emptyValueForField(field) {
|
|
|
19
26
|
if (field.widget === "enum") {
|
|
20
27
|
return field.options[0]?.value ?? "";
|
|
21
28
|
}
|
|
29
|
+
if (field.widget === "multiselect" || field.widget === "tags") {
|
|
30
|
+
return [];
|
|
31
|
+
}
|
|
22
32
|
if (field.widget === "object") {
|
|
23
33
|
return emptyValueForFields(field.fields);
|
|
24
34
|
}
|
|
@@ -80,12 +90,22 @@ function isEmpty(value, field) {
|
|
|
80
90
|
}
|
|
81
91
|
if ((field.widget === "text" ||
|
|
82
92
|
field.widget === "textarea" ||
|
|
93
|
+
field.widget === "url" ||
|
|
94
|
+
field.widget === "email" ||
|
|
95
|
+
field.widget === "date" ||
|
|
96
|
+
field.widget === "datetime" ||
|
|
97
|
+
field.widget === "media" ||
|
|
98
|
+
field.widget === "relation" ||
|
|
83
99
|
field.widget === "enum") &&
|
|
84
100
|
typeof value === "string" &&
|
|
85
101
|
value.trim() === "") {
|
|
86
102
|
return true;
|
|
87
103
|
}
|
|
88
|
-
if (field.widget === "array"
|
|
104
|
+
if ((field.widget === "array" ||
|
|
105
|
+
field.widget === "tags" ||
|
|
106
|
+
field.widget === "multiselect") &&
|
|
107
|
+
Array.isArray(value) &&
|
|
108
|
+
value.length === 0) {
|
|
89
109
|
return true;
|
|
90
110
|
}
|
|
91
111
|
return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/fields/defaults.ts"],"names":[],"mappings":"AAEA,uDAAuD;AACvD,MAAM,UAAU,mBAAmB,CACjC,MAAkC;IAElC,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAsB;IACvD,
|
|
1
|
+
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/fields/defaults.ts"],"names":[],"mappings":"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"}
|
package/dist/fields/types.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* Complements Zod schemas
|
|
2
|
+
* Editor field metadata (ADR 019 / ADR 026).
|
|
3
|
+
* Complements Zod schemas. Automatic mapping uses public Zod `.shape` / `.def.type`
|
|
4
|
+
* only; unsupported structures become non-editable notices.
|
|
4
5
|
*/
|
|
5
|
-
export type EditorWidget = "text" | "textarea" | "number" | "boolean" | "enum" | "object" | "array" | "unsupported";
|
|
6
|
+
export type EditorWidget = "text" | "textarea" | "url" | "email" | "date" | "datetime" | "number" | "boolean" | "enum" | "multiselect" | "tags" | "media" | "relation" | "object" | "array" | "unsupported";
|
|
6
7
|
export interface EditorFieldBase {
|
|
7
8
|
readonly name: string;
|
|
8
9
|
readonly label: string;
|
|
@@ -13,7 +14,7 @@ export interface EditorFieldBase {
|
|
|
13
14
|
readonly order?: number;
|
|
14
15
|
}
|
|
15
16
|
export interface TextFieldSpec extends EditorFieldBase {
|
|
16
|
-
readonly widget: "text" | "textarea";
|
|
17
|
+
readonly widget: "text" | "textarea" | "url" | "email" | "date" | "datetime";
|
|
17
18
|
readonly placeholder?: string;
|
|
18
19
|
}
|
|
19
20
|
export interface NumberFieldSpec extends EditorFieldBase {
|
|
@@ -32,6 +33,24 @@ export interface EnumFieldSpec extends EditorFieldBase {
|
|
|
32
33
|
label: string;
|
|
33
34
|
}>;
|
|
34
35
|
}
|
|
36
|
+
export interface MultiSelectFieldSpec extends EditorFieldBase {
|
|
37
|
+
readonly widget: "multiselect";
|
|
38
|
+
readonly options: ReadonlyArray<{
|
|
39
|
+
value: string;
|
|
40
|
+
label: string;
|
|
41
|
+
}>;
|
|
42
|
+
}
|
|
43
|
+
export interface TagsFieldSpec extends EditorFieldBase {
|
|
44
|
+
readonly widget: "tags";
|
|
45
|
+
}
|
|
46
|
+
export interface MediaFieldSpec extends EditorFieldBase {
|
|
47
|
+
readonly widget: "media";
|
|
48
|
+
readonly placeholder?: string;
|
|
49
|
+
}
|
|
50
|
+
export interface RelationFieldSpec extends EditorFieldBase {
|
|
51
|
+
readonly widget: "relation";
|
|
52
|
+
readonly collection: string;
|
|
53
|
+
}
|
|
35
54
|
export interface ObjectFieldSpec extends EditorFieldBase {
|
|
36
55
|
readonly widget: "object";
|
|
37
56
|
readonly fields: readonly EditorFieldSpec[];
|
|
@@ -45,7 +64,7 @@ export interface UnsupportedFieldSpec extends EditorFieldBase {
|
|
|
45
64
|
readonly widget: "unsupported";
|
|
46
65
|
readonly reason: string;
|
|
47
66
|
}
|
|
48
|
-
export type EditorFieldSpec = TextFieldSpec | NumberFieldSpec | BooleanFieldSpec | EnumFieldSpec | ObjectFieldSpec | ArrayFieldSpec | UnsupportedFieldSpec;
|
|
67
|
+
export type EditorFieldSpec = TextFieldSpec | NumberFieldSpec | BooleanFieldSpec | EnumFieldSpec | MultiSelectFieldSpec | TagsFieldSpec | MediaFieldSpec | RelationFieldSpec | ObjectFieldSpec | ArrayFieldSpec | UnsupportedFieldSpec;
|
|
49
68
|
export interface EditorCollectionConfig {
|
|
50
69
|
readonly name: string;
|
|
51
70
|
readonly label: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/fields/types.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/fields/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,YAAY,GACpB,MAAM,GACN,UAAU,GACV,KAAK,GACL,OAAO,GACP,MAAM,GACN,UAAU,GACV,QAAQ,GACR,SAAS,GACT,MAAM,GACN,aAAa,GACb,MAAM,GACN,OAAO,GACP,UAAU,GACV,QAAQ,GACR,OAAO,GACP,aAAa,CAAC;AAElB,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,8CAA8C;IAC9C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,aAAc,SAAQ,eAAe;IACpD,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,CAAC;IAC7E,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,eAAgB,SAAQ,eAAe;IACtD,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,gBAAiB,SAAQ,eAAe;IACvD,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;CAC5B;AAED,MAAM,WAAW,aAAc,SAAQ,eAAe;IACpD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnE;AAED,MAAM,WAAW,oBAAqB,SAAQ,eAAe;IAC3D,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnE;AAED,MAAM,WAAW,aAAc,SAAQ,eAAe;IACpD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,cAAe,SAAQ,eAAe;IACrD,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,iBAAkB,SAAQ,eAAe;IACxD,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,eAAgB,SAAQ,eAAe;IACtD,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAC;CAC7C;AAED,MAAM,WAAW,cAAe,SAAQ,eAAe;IACrD,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,0DAA0D;IAC1D,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;CAChC;AAED,MAAM,WAAW,oBAAqB,SAAQ,eAAe;IAC3D,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,eAAe,GACvB,aAAa,GACb,eAAe,GACf,gBAAgB,GAChB,aAAa,GACb,oBAAoB,GACpB,aAAa,GACb,cAAc,GACd,iBAAiB,GACjB,eAAe,GACf,cAAc,GACd,oBAAoB,CAAC;AAEzB,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,6DAA6D;IAC7D,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAC;CAC7C;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,SAAS,sBAAsB,EAAE,CAAC;CACzD"}
|