@cosmicdrift/kumiko-headless 0.34.1 → 0.35.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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cosmicdrift/kumiko-headless",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.35.0",
|
|
4
4
|
"description": "Headless UI logic for Kumiko — Dispatcher contract, Form-Controller, View-Model, Nav-Resolver. Plattform- und React-frei; jeder Renderer (renderer, renderer-web, renderer-native, …) komponiert darauf.",
|
|
5
5
|
"license": "BUSL-1.1",
|
|
6
6
|
"author": "Marc Frost <marc@cosmicdriftgamestudio.com>",
|
package/src/index.ts
CHANGED
|
@@ -57,7 +57,7 @@ describe("computeListViewModel", () => {
|
|
|
57
57
|
});
|
|
58
58
|
|
|
59
59
|
test("object-form column carries renderer through to the view model", () => {
|
|
60
|
-
const fmt =
|
|
60
|
+
const fmt = { format: "currency" as const, symbol: "€" };
|
|
61
61
|
const vm = computeListViewModel({
|
|
62
62
|
screen: listScreen([{ field: "title", renderer: fmt }]),
|
|
63
63
|
entity: taskEntity,
|
|
@@ -66,7 +66,7 @@ describe("computeListViewModel", () => {
|
|
|
66
66
|
featureName: "tasks",
|
|
67
67
|
});
|
|
68
68
|
|
|
69
|
-
expect(vm.columns[0]?.renderer).
|
|
69
|
+
expect(vm.columns[0]?.renderer).toEqual(fmt);
|
|
70
70
|
});
|
|
71
71
|
|
|
72
72
|
test("rows map to { id, values } with id pulled from the row", () => {
|
package/src/view-model/index.ts
CHANGED
package/src/view-model/types.ts
CHANGED
|
@@ -7,6 +7,11 @@ import type {
|
|
|
7
7
|
ScreenSlots,
|
|
8
8
|
} from "@cosmicdrift/kumiko-framework/ui-types";
|
|
9
9
|
|
|
10
|
+
// Runtime-only renderer — function form allowed here because the renderer
|
|
11
|
+
// layer (render-list) injects reference-column lookup closures at mount time.
|
|
12
|
+
// Never serialized to JSON.
|
|
13
|
+
export type RuntimeRenderer = (value: unknown, row?: Readonly<Record<string, unknown>>) => string;
|
|
14
|
+
|
|
10
15
|
// View-Models — plain data structures produced by computeListViewModel and
|
|
11
16
|
// computeEditViewModel. They flatten the combined [screen-def + entity-def
|
|
12
17
|
// + row-data + user] inputs into a shape the renderer draws directly,
|
|
@@ -29,12 +34,13 @@ import type {
|
|
|
29
34
|
// One column, fully resolved. `label` is the localized string the
|
|
30
35
|
// renderer puts in the column header; view-model builder runs it through
|
|
31
36
|
// LocaleResolver.translate() from the i18nKey wired onto the field.
|
|
32
|
-
// `renderer` passes through ScreenDefinition's FieldRenderer verbatim
|
|
37
|
+
// `renderer` passes through ScreenDefinition's FieldRenderer verbatim; the
|
|
38
|
+
// renderer layer may also inject a RuntimeRenderer closure (reference lookups).
|
|
33
39
|
export type ListColumnViewModel = {
|
|
34
40
|
readonly field: string;
|
|
35
41
|
readonly label: string;
|
|
36
42
|
readonly type: string; // field-type ("text", "number", "money", ...)
|
|
37
|
-
readonly renderer?: FieldRenderer;
|
|
43
|
+
readonly renderer?: FieldRenderer | RuntimeRenderer;
|
|
38
44
|
readonly sortable: boolean;
|
|
39
45
|
/** Nur bei `type: "select"` — translated Option-Labels keyed nach raw
|
|
40
46
|
* value. Renderer rendert `optionLabels[value]` statt humanizeSlug
|