@webiny/app-headless-cms 6.5.0-beta.8 → 6.5.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/admin/components/ContentEntries/Filters/RefFieldRenderer.js +1 -0
- package/admin/components/ContentEntries/Filters/RefFieldRenderer.js.map +1 -1
- package/admin/plugins/editor/defaultBar/Name/Name.d.ts +0 -5
- package/admin/plugins/editor/defaultBar/Name/Name.js +0 -2
- package/admin/plugins/editor/defaultBar/Name/Name.js.map +1 -1
- package/features/contentEntry/feature.js +2 -0
- package/features/contentEntry/feature.js.map +1 -1
- package/features/contentEntry/referenceTitles/ReferenceTitles.d.ts +18 -0
- package/features/contentEntry/referenceTitles/ReferenceTitles.js +58 -0
- package/features/contentEntry/referenceTitles/ReferenceTitles.js.map +1 -0
- package/features/contentEntry/referenceTitles/ReferenceTitles.test.d.ts +1 -0
- package/features/contentEntry/referenceTitles/ReferenceTitles.test.js +173 -0
- package/features/contentEntry/referenceTitles/ReferenceTitles.test.js.map +1 -0
- package/features/contentEntry/referenceTitles/RememberTitlesDecorators.d.ts +22 -0
- package/features/contentEntry/referenceTitles/RememberTitlesDecorators.js +40 -0
- package/features/contentEntry/referenceTitles/RememberTitlesDecorators.js.map +1 -0
- package/features/contentEntry/referenceTitles/abstractions.d.ts +16 -0
- package/features/contentEntry/referenceTitles/abstractions.js +5 -0
- package/features/contentEntry/referenceTitles/abstractions.js.map +1 -0
- package/features/contentEntry/referenceTitles/feature.d.ts +3 -0
- package/features/contentEntry/referenceTitles/feature.js +20 -0
- package/features/contentEntry/referenceTitles/feature.js.map +1 -0
- package/features/formModel/CmsRefFieldValueFormatter.d.ts +12 -0
- package/features/formModel/CmsRefFieldValueFormatter.js +29 -0
- package/features/formModel/CmsRefFieldValueFormatter.js.map +1 -0
- package/features/formModel/feature.js +2 -0
- package/features/formModel/feature.js.map +1 -1
- package/package.json +22 -22
- package/presentation/contentEntries/form/ContentEntryFormPresenter.js +30 -30
- package/presentation/contentEntries/form/ContentEntryFormPresenter.js.map +1 -1
- package/presentation/contentEntries/form/ContentEntryFormPresenter.test.js +144 -10
- package/presentation/contentEntries/form/ContentEntryFormPresenter.test.js.map +1 -1
- package/presentation/contentEntries/preview/LivePreviewPresenter.d.ts +12 -1
- package/presentation/contentEntries/preview/LivePreviewPresenter.js +48 -5
- package/presentation/contentEntries/preview/LivePreviewPresenter.js.map +1 -1
- package/presentation/contentEntries/preview/LivePreviewPresenter.test.d.ts +1 -0
- package/presentation/contentEntries/preview/LivePreviewPresenter.test.js +81 -0
- package/presentation/contentEntries/preview/LivePreviewPresenter.test.js.map +1 -0
- package/presentation/contentEntries/preview/ModelEditorComponentDiscovery.js +1 -1
- package/presentation/contentEntries/preview/ModelEditorComponentDiscovery.js.map +1 -1
- package/presentation/contentEntries/preview/PreviewDecorator.js +25 -6
- package/presentation/contentEntries/preview/PreviewDecorator.js.map +1 -1
- package/presentation/contentEntries/preview/PreviewDomainStatus.d.ts +10 -0
- package/presentation/contentEntries/preview/PreviewDomainStatus.js +19 -0
- package/presentation/contentEntries/preview/PreviewDomainStatus.js.map +1 -0
- package/presentation/contentEntries/preview/PreviewPane.d.ts +10 -1
- package/presentation/contentEntries/preview/PreviewPane.js +81 -45
- package/presentation/contentEntries/preview/PreviewPane.js.map +1 -1
- package/presentation/contentEntries/preview/abstractions.d.ts +8 -0
- package/presentation/contentEntries/preview/abstractions.js.map +1 -1
- package/presentation/contentEntries/preview/resolvePreviewUrl.d.ts +21 -0
- package/presentation/contentEntries/preview/resolvePreviewUrl.js +50 -1
- package/presentation/contentEntries/preview/resolvePreviewUrl.js.map +1 -1
- package/presentation/contentEntries/preview/resolvePreviewUrl.test.d.ts +1 -0
- package/presentation/contentEntries/preview/resolvePreviewUrl.test.js +127 -0
- package/presentation/contentEntries/preview/resolvePreviewUrl.test.js.map +1 -0
- package/presentation/contentEntries/views/ContentEntryFormView.js +1 -0
- package/presentation/contentEntries/views/ContentEntryFormView.js.map +1 -1
- package/presentation/fieldRenderers/ref/CmsRefInputRenderer.js +1 -0
- package/presentation/fieldRenderers/ref/CmsRefInputRenderer.js.map +1 -1
- package/presentation/fieldRenderers/ref/CmsRefInputsRenderer.js +1 -0
- package/presentation/fieldRenderers/ref/CmsRefInputsRenderer.js.map +1 -1
- package/presentation/fieldRenderers/ref/autocomplete/BaseAutocompletePresenter.d.ts +1 -0
- package/presentation/fieldRenderers/ref/autocomplete/BaseAutocompletePresenter.js +8 -2
- package/presentation/fieldRenderers/ref/autocomplete/BaseAutocompletePresenter.js.map +1 -1
- package/presentation/fieldRenderers/ref/autocomplete/RefAutocompletePresenters.test.d.ts +1 -0
- package/presentation/fieldRenderers/ref/autocomplete/RefAutocompletePresenters.test.js +185 -0
- package/presentation/fieldRenderers/ref/autocomplete/RefAutocompletePresenters.test.js.map +1 -0
- package/presentation/fieldRenderers/ref/autocomplete/multi/RefMultiAutocompletePresenter.js +1 -1
- package/presentation/fieldRenderers/ref/autocomplete/multi/RefMultiAutocompletePresenter.js.map +1 -1
- package/presentation/fieldRenderers/ref/autocomplete/single/RefSingleAutocompletePresenter.js +1 -1
- package/presentation/fieldRenderers/ref/autocomplete/single/RefSingleAutocompletePresenter.js.map +1 -1
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { Container } from "@webiny/di";
|
|
3
|
+
import { SearchContentEntriesUseCase } from "../../../../features/contentEntry/searchContentEntries/abstractions.js";
|
|
4
|
+
import { GetContentEntriesUseCase } from "../../../../features/contentEntry/getContentEntries/abstractions.js";
|
|
5
|
+
import { RefMultiAutocompletePresenter } from "./multi/abstractions.js";
|
|
6
|
+
import { RefMultiAutocompletePresenter as RefMultiAutocompletePresenter_js_RefMultiAutocompletePresenter } from "./multi/RefMultiAutocompletePresenter.js";
|
|
7
|
+
import { RefSingleAutocompletePresenter } from "./single/abstractions.js";
|
|
8
|
+
import { RefSingleAutocompletePresenter as RefSingleAutocompletePresenter_js_RefSingleAutocompletePresenter } from "./single/RefSingleAutocompletePresenter.js";
|
|
9
|
+
const createEntry = (entryId, title)=>({
|
|
10
|
+
id: `${entryId}#0001`,
|
|
11
|
+
entryId,
|
|
12
|
+
status: "draft",
|
|
13
|
+
title,
|
|
14
|
+
description: null,
|
|
15
|
+
image: null,
|
|
16
|
+
createdOn: "2026-01-01T00:00:00.000Z",
|
|
17
|
+
savedOn: "2026-01-01T00:00:00.000Z",
|
|
18
|
+
createdBy: {
|
|
19
|
+
id: "1",
|
|
20
|
+
type: "admin",
|
|
21
|
+
displayName: "Admin"
|
|
22
|
+
},
|
|
23
|
+
modifiedBy: null,
|
|
24
|
+
model: {
|
|
25
|
+
modelId: "location",
|
|
26
|
+
name: "Location"
|
|
27
|
+
},
|
|
28
|
+
published: null,
|
|
29
|
+
wbyAco_location: null
|
|
30
|
+
});
|
|
31
|
+
const defaultEntry = createEntry("first", "First");
|
|
32
|
+
const searchedEntry = createEntry("second", "Second");
|
|
33
|
+
const createContainer = ()=>{
|
|
34
|
+
const container = new Container();
|
|
35
|
+
container.registerInstance(SearchContentEntriesUseCase, {
|
|
36
|
+
execute: async ({ query })=>({
|
|
37
|
+
data: query ? [
|
|
38
|
+
searchedEntry
|
|
39
|
+
] : [
|
|
40
|
+
defaultEntry
|
|
41
|
+
]
|
|
42
|
+
})
|
|
43
|
+
});
|
|
44
|
+
container.registerInstance(GetContentEntriesUseCase, {
|
|
45
|
+
execute: async ()=>({
|
|
46
|
+
latest: [],
|
|
47
|
+
published: []
|
|
48
|
+
})
|
|
49
|
+
});
|
|
50
|
+
return container;
|
|
51
|
+
};
|
|
52
|
+
describe("RefMultiAutocompletePresenter", ()=>{
|
|
53
|
+
it("keeps an entry picked from the search results", async ()=>{
|
|
54
|
+
const container = createContainer();
|
|
55
|
+
container.register(RefMultiAutocompletePresenter_js_RefMultiAutocompletePresenter);
|
|
56
|
+
const presenter = container.resolve(RefMultiAutocompletePresenter);
|
|
57
|
+
await presenter.init({
|
|
58
|
+
modelIds: [
|
|
59
|
+
"location"
|
|
60
|
+
]
|
|
61
|
+
});
|
|
62
|
+
await presenter.search("sec");
|
|
63
|
+
const refs = presenter.select([
|
|
64
|
+
"second"
|
|
65
|
+
]);
|
|
66
|
+
expect(refs).toEqual([
|
|
67
|
+
{
|
|
68
|
+
id: "second#0001",
|
|
69
|
+
modelId: "location"
|
|
70
|
+
}
|
|
71
|
+
]);
|
|
72
|
+
expect(presenter.vm.values).toEqual([
|
|
73
|
+
"second"
|
|
74
|
+
]);
|
|
75
|
+
expect(presenter.vm.options).toContainEqual({
|
|
76
|
+
label: "Second",
|
|
77
|
+
value: "second"
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
it("keeps earlier picks when another entry is picked from the search results", async ()=>{
|
|
81
|
+
const container = createContainer();
|
|
82
|
+
container.register(RefMultiAutocompletePresenter_js_RefMultiAutocompletePresenter);
|
|
83
|
+
const presenter = container.resolve(RefMultiAutocompletePresenter);
|
|
84
|
+
await presenter.init({
|
|
85
|
+
modelIds: [
|
|
86
|
+
"location"
|
|
87
|
+
]
|
|
88
|
+
});
|
|
89
|
+
presenter.select([
|
|
90
|
+
"first"
|
|
91
|
+
]);
|
|
92
|
+
await presenter.search("sec");
|
|
93
|
+
const refs = presenter.select([
|
|
94
|
+
"first",
|
|
95
|
+
"second"
|
|
96
|
+
]);
|
|
97
|
+
expect(refs).toEqual([
|
|
98
|
+
{
|
|
99
|
+
id: "first#0001",
|
|
100
|
+
modelId: "location"
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
id: "second#0001",
|
|
104
|
+
modelId: "location"
|
|
105
|
+
}
|
|
106
|
+
]);
|
|
107
|
+
expect(presenter.vm.values).toEqual([
|
|
108
|
+
"first",
|
|
109
|
+
"second"
|
|
110
|
+
]);
|
|
111
|
+
});
|
|
112
|
+
it("ignores a search response that arrives after a newer one", async ()=>{
|
|
113
|
+
const boulder = createEntry("boulder", "Boulder");
|
|
114
|
+
const baker = createEntry("baker", "Baker");
|
|
115
|
+
let resolveSlow = ()=>{};
|
|
116
|
+
const slow = new Promise((resolve)=>{
|
|
117
|
+
resolveSlow = resolve;
|
|
118
|
+
});
|
|
119
|
+
const container = new Container();
|
|
120
|
+
container.registerInstance(SearchContentEntriesUseCase, {
|
|
121
|
+
execute: async ({ query })=>{
|
|
122
|
+
if ("B" === query) {
|
|
123
|
+
await slow;
|
|
124
|
+
return {
|
|
125
|
+
data: [
|
|
126
|
+
baker
|
|
127
|
+
]
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
return {
|
|
131
|
+
data: query ? [
|
|
132
|
+
boulder
|
|
133
|
+
] : [
|
|
134
|
+
defaultEntry
|
|
135
|
+
]
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
container.registerInstance(GetContentEntriesUseCase, {
|
|
140
|
+
execute: async ()=>({
|
|
141
|
+
latest: [],
|
|
142
|
+
published: []
|
|
143
|
+
})
|
|
144
|
+
});
|
|
145
|
+
container.register(RefMultiAutocompletePresenter_js_RefMultiAutocompletePresenter);
|
|
146
|
+
const presenter = container.resolve(RefMultiAutocompletePresenter);
|
|
147
|
+
await presenter.init({
|
|
148
|
+
modelIds: [
|
|
149
|
+
"location"
|
|
150
|
+
]
|
|
151
|
+
});
|
|
152
|
+
const first = presenter.search("B");
|
|
153
|
+
await presenter.search("Boulder");
|
|
154
|
+
resolveSlow();
|
|
155
|
+
await first;
|
|
156
|
+
expect(presenter.vm.options).toEqual([
|
|
157
|
+
{
|
|
158
|
+
label: "Boulder",
|
|
159
|
+
value: "boulder"
|
|
160
|
+
}
|
|
161
|
+
]);
|
|
162
|
+
expect(presenter.vm.loading).toBe(false);
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
describe("RefSingleAutocompletePresenter", ()=>{
|
|
166
|
+
it("keeps an entry picked from the search results", async ()=>{
|
|
167
|
+
const container = createContainer();
|
|
168
|
+
container.register(RefSingleAutocompletePresenter_js_RefSingleAutocompletePresenter);
|
|
169
|
+
const presenter = container.resolve(RefSingleAutocompletePresenter);
|
|
170
|
+
await presenter.init({
|
|
171
|
+
modelIds: [
|
|
172
|
+
"location"
|
|
173
|
+
]
|
|
174
|
+
});
|
|
175
|
+
await presenter.search("sec");
|
|
176
|
+
const ref = presenter.select("second");
|
|
177
|
+
expect(ref).toEqual({
|
|
178
|
+
id: "second#0001",
|
|
179
|
+
modelId: "location"
|
|
180
|
+
});
|
|
181
|
+
expect(presenter.vm.value).toBe("second");
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
//# sourceMappingURL=RefAutocompletePresenters.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presentation/fieldRenderers/ref/autocomplete/RefAutocompletePresenters.test.js","sources":["../../../../../src/presentation/fieldRenderers/ref/autocomplete/RefAutocompletePresenters.test.ts"],"sourcesContent":["import { describe, it, expect } from \"vitest\";\nimport { Container } from \"@webiny/di\";\nimport { SearchContentEntriesUseCase } from \"~/features/contentEntry/searchContentEntries/abstractions.js\";\nimport { GetContentEntriesUseCase } from \"~/features/contentEntry/getContentEntries/abstractions.js\";\nimport type { CmsReferenceEntry } from \"~/features/contentEntry/refTypes.js\";\nimport { RefMultiAutocompletePresenter as MultiAbstraction } from \"./multi/abstractions.js\";\nimport { RefMultiAutocompletePresenter } from \"./multi/RefMultiAutocompletePresenter.js\";\nimport { RefSingleAutocompletePresenter as SingleAbstraction } from \"./single/abstractions.js\";\nimport { RefSingleAutocompletePresenter } from \"./single/RefSingleAutocompletePresenter.js\";\n\nconst createEntry = (entryId: string, title: string): CmsReferenceEntry => ({\n id: `${entryId}#0001`,\n entryId,\n status: \"draft\",\n title,\n description: null,\n image: null,\n createdOn: \"2026-01-01T00:00:00.000Z\",\n savedOn: \"2026-01-01T00:00:00.000Z\",\n createdBy: { id: \"1\", type: \"admin\", displayName: \"Admin\" },\n modifiedBy: null,\n model: { modelId: \"location\", name: \"Location\" },\n published: null,\n wbyAco_location: null\n});\n\n// The default list holds only the first entry, so the second one can only be found by searching.\nconst defaultEntry = createEntry(\"first\", \"First\");\nconst searchedEntry = createEntry(\"second\", \"Second\");\n\nconst createContainer = () => {\n const container = new Container();\n container.registerInstance(SearchContentEntriesUseCase, {\n execute: async ({ query }) => ({ data: query ? [searchedEntry] : [defaultEntry] })\n });\n container.registerInstance(GetContentEntriesUseCase, {\n execute: async () => ({ latest: [], published: [] })\n });\n return container;\n};\n\ndescribe(\"RefMultiAutocompletePresenter\", () => {\n it(\"keeps an entry picked from the search results\", async () => {\n const container = createContainer();\n container.register(RefMultiAutocompletePresenter);\n const presenter = container.resolve(MultiAbstraction);\n\n await presenter.init({ modelIds: [\"location\"] });\n await presenter.search(\"sec\");\n\n const refs = presenter.select([\"second\"]);\n\n expect(refs).toEqual([{ id: \"second#0001\", modelId: \"location\" }]);\n expect(presenter.vm.values).toEqual([\"second\"]);\n expect(presenter.vm.options).toContainEqual({ label: \"Second\", value: \"second\" });\n });\n\n it(\"keeps earlier picks when another entry is picked from the search results\", async () => {\n const container = createContainer();\n container.register(RefMultiAutocompletePresenter);\n const presenter = container.resolve(MultiAbstraction);\n\n await presenter.init({ modelIds: [\"location\"] });\n presenter.select([\"first\"]);\n await presenter.search(\"sec\");\n\n const refs = presenter.select([\"first\", \"second\"]);\n\n expect(refs).toEqual([\n { id: \"first#0001\", modelId: \"location\" },\n { id: \"second#0001\", modelId: \"location\" }\n ]);\n expect(presenter.vm.values).toEqual([\"first\", \"second\"]);\n });\n\n it(\"ignores a search response that arrives after a newer one\", async () => {\n const boulder = createEntry(\"boulder\", \"Boulder\");\n const baker = createEntry(\"baker\", \"Baker\");\n // The \"B\" request is slower than the \"Boulder\" one, and its first page does not hold Boulder.\n let resolveSlow: () => void = () => {};\n const slow = new Promise<void>(resolve => {\n resolveSlow = resolve;\n });\n\n const container = new Container();\n container.registerInstance(SearchContentEntriesUseCase, {\n execute: async ({ query }) => {\n if (query === \"B\") {\n await slow;\n return { data: [baker] };\n }\n return { data: query ? [boulder] : [defaultEntry] };\n }\n });\n container.registerInstance(GetContentEntriesUseCase, {\n execute: async () => ({ latest: [], published: [] })\n });\n container.register(RefMultiAutocompletePresenter);\n const presenter = container.resolve(MultiAbstraction);\n\n await presenter.init({ modelIds: [\"location\"] });\n const first = presenter.search(\"B\");\n await presenter.search(\"Boulder\");\n resolveSlow();\n await first;\n\n expect(presenter.vm.options).toEqual([{ label: \"Boulder\", value: \"boulder\" }]);\n expect(presenter.vm.loading).toBe(false);\n });\n});\n\ndescribe(\"RefSingleAutocompletePresenter\", () => {\n it(\"keeps an entry picked from the search results\", async () => {\n const container = createContainer();\n container.register(RefSingleAutocompletePresenter);\n const presenter = container.resolve(SingleAbstraction);\n\n await presenter.init({ modelIds: [\"location\"] });\n await presenter.search(\"sec\");\n\n const ref = presenter.select(\"second\");\n\n expect(ref).toEqual({ id: \"second#0001\", modelId: \"location\" });\n expect(presenter.vm.value).toBe(\"second\");\n });\n});\n"],"names":["createEntry","entryId","title","defaultEntry","searchedEntry","createContainer","container","Container","SearchContentEntriesUseCase","query","GetContentEntriesUseCase","describe","it","RefMultiAutocompletePresenter","presenter","MultiAbstraction","refs","expect","boulder","baker","resolveSlow","slow","Promise","resolve","first","RefSingleAutocompletePresenter","SingleAbstraction","ref"],"mappings":";;;;;;;;AAUA,MAAMA,cAAc,CAACC,SAAiBC,QAAsC;QACxE,IAAI,GAAGD,QAAQ,KAAK,CAAC;QACrBA;QACA,QAAQ;QACRC;QACA,aAAa;QACb,OAAO;QACP,WAAW;QACX,SAAS;QACT,WAAW;YAAE,IAAI;YAAK,MAAM;YAAS,aAAa;QAAQ;QAC1D,YAAY;QACZ,OAAO;YAAE,SAAS;YAAY,MAAM;QAAW;QAC/C,WAAW;QACX,iBAAiB;IACrB;AAGA,MAAMC,eAAeH,YAAY,SAAS;AAC1C,MAAMI,gBAAgBJ,YAAY,UAAU;AAE5C,MAAMK,kBAAkB;IACpB,MAAMC,YAAY,IAAIC;IACtBD,UAAU,gBAAgB,CAACE,6BAA6B;QACpD,SAAS,OAAO,EAAEC,KAAK,EAAE,GAAM;gBAAE,MAAMA,QAAQ;oBAACL;iBAAc,GAAG;oBAACD;iBAAa;YAAC;IACpF;IACAG,UAAU,gBAAgB,CAACI,0BAA0B;QACjD,SAAS,UAAa;gBAAE,QAAQ,EAAE;gBAAE,WAAW,EAAE;YAAC;IACtD;IACA,OAAOJ;AACX;AAEAK,SAAS,iCAAiC;IACtCC,GAAG,iDAAiD;QAChD,MAAMN,YAAYD;QAClBC,UAAU,QAAQ,CAACO;QACnB,MAAMC,YAAYR,UAAU,OAAO,CAACS;QAEpC,MAAMD,UAAU,IAAI,CAAC;YAAE,UAAU;gBAAC;aAAW;QAAC;QAC9C,MAAMA,UAAU,MAAM,CAAC;QAEvB,MAAME,OAAOF,UAAU,MAAM,CAAC;YAAC;SAAS;QAExCG,OAAOD,MAAM,OAAO,CAAC;YAAC;gBAAE,IAAI;gBAAe,SAAS;YAAW;SAAE;QACjEC,OAAOH,UAAU,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;YAAC;SAAS;QAC9CG,OAAOH,UAAU,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC;YAAE,OAAO;YAAU,OAAO;QAAS;IACnF;IAEAF,GAAG,4EAA4E;QAC3E,MAAMN,YAAYD;QAClBC,UAAU,QAAQ,CAACO;QACnB,MAAMC,YAAYR,UAAU,OAAO,CAACS;QAEpC,MAAMD,UAAU,IAAI,CAAC;YAAE,UAAU;gBAAC;aAAW;QAAC;QAC9CA,UAAU,MAAM,CAAC;YAAC;SAAQ;QAC1B,MAAMA,UAAU,MAAM,CAAC;QAEvB,MAAME,OAAOF,UAAU,MAAM,CAAC;YAAC;YAAS;SAAS;QAEjDG,OAAOD,MAAM,OAAO,CAAC;YACjB;gBAAE,IAAI;gBAAc,SAAS;YAAW;YACxC;gBAAE,IAAI;gBAAe,SAAS;YAAW;SAC5C;QACDC,OAAOH,UAAU,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;YAAC;YAAS;SAAS;IAC3D;IAEAF,GAAG,4DAA4D;QAC3D,MAAMM,UAAUlB,YAAY,WAAW;QACvC,MAAMmB,QAAQnB,YAAY,SAAS;QAEnC,IAAIoB,cAA0B,KAAO;QACrC,MAAMC,OAAO,IAAIC,QAAcC,CAAAA;YAC3BH,cAAcG;QAClB;QAEA,MAAMjB,YAAY,IAAIC;QACtBD,UAAU,gBAAgB,CAACE,6BAA6B;YACpD,SAAS,OAAO,EAAEC,KAAK,EAAE;gBACrB,IAAIA,AAAU,QAAVA,OAAe;oBACf,MAAMY;oBACN,OAAO;wBAAE,MAAM;4BAACF;yBAAM;oBAAC;gBAC3B;gBACA,OAAO;oBAAE,MAAMV,QAAQ;wBAACS;qBAAQ,GAAG;wBAACf;qBAAa;gBAAC;YACtD;QACJ;QACAG,UAAU,gBAAgB,CAACI,0BAA0B;YACjD,SAAS,UAAa;oBAAE,QAAQ,EAAE;oBAAE,WAAW,EAAE;gBAAC;QACtD;QACAJ,UAAU,QAAQ,CAACO;QACnB,MAAMC,YAAYR,UAAU,OAAO,CAACS;QAEpC,MAAMD,UAAU,IAAI,CAAC;YAAE,UAAU;gBAAC;aAAW;QAAC;QAC9C,MAAMU,QAAQV,UAAU,MAAM,CAAC;QAC/B,MAAMA,UAAU,MAAM,CAAC;QACvBM;QACA,MAAMI;QAENP,OAAOH,UAAU,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC;YAAC;gBAAE,OAAO;gBAAW,OAAO;YAAU;SAAE;QAC7EG,OAAOH,UAAU,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC;IACtC;AACJ;AAEAH,SAAS,kCAAkC;IACvCC,GAAG,iDAAiD;QAChD,MAAMN,YAAYD;QAClBC,UAAU,QAAQ,CAACmB;QACnB,MAAMX,YAAYR,UAAU,OAAO,CAACoB;QAEpC,MAAMZ,UAAU,IAAI,CAAC;YAAE,UAAU;gBAAC;aAAW;QAAC;QAC9C,MAAMA,UAAU,MAAM,CAAC;QAEvB,MAAMa,MAAMb,UAAU,MAAM,CAAC;QAE7BG,OAAOU,KAAK,OAAO,CAAC;YAAE,IAAI;YAAe,SAAS;QAAW;QAC7DV,OAAOH,UAAU,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC;IACpC;AACJ"}
|
|
@@ -47,9 +47,9 @@ class RefMultiAutocompletePresenterImpl {
|
|
|
47
47
|
await this.base.search(query);
|
|
48
48
|
}
|
|
49
49
|
select(entryIds) {
|
|
50
|
-
this.base.clearSearch();
|
|
51
50
|
const allOptions = this.getAllKnownOptions();
|
|
52
51
|
const selected = entryIds.map((entryId)=>allOptions.find((o)=>o.entryId === entryId)).filter((o)=>null != o);
|
|
52
|
+
this.base.clearSearch();
|
|
53
53
|
this.resolved = selected;
|
|
54
54
|
return selected.map((opt)=>({
|
|
55
55
|
id: opt.id,
|
package/presentation/fieldRenderers/ref/autocomplete/multi/RefMultiAutocompletePresenter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presentation/fieldRenderers/ref/autocomplete/multi/RefMultiAutocompletePresenter.js","sources":["../../../../../../src/presentation/fieldRenderers/ref/autocomplete/multi/RefMultiAutocompletePresenter.ts"],"sourcesContent":["import { computed, makeAutoObservable, runInAction } from \"mobx\";\nimport { SearchContentEntriesUseCase } from \"~/features/contentEntry/searchContentEntries/abstractions.js\";\nimport { GetContentEntriesUseCase } from \"~/features/contentEntry/getContentEntries/abstractions.js\";\nimport type { CmsReferenceValue } from \"~/features/contentEntry/refTypes.js\";\nimport type { IRefEntryOption, IDropdownOption } from \"../abstractions.js\";\nimport { BaseAutocompletePresenter } from \"../BaseAutocompletePresenter.js\";\nimport {\n RefMultiAutocompletePresenter as Abstraction,\n type IRefMultiAutocompleteInitConfig,\n type IRefMultiAutocompleteViewModel\n} from \"./abstractions.js\";\n\nclass RefMultiAutocompletePresenterImpl implements Abstraction.Interface {\n private base: BaseAutocompletePresenter;\n private resolved: IRefEntryOption[] = [];\n\n constructor(\n searchUseCase: SearchContentEntriesUseCase.Interface,\n getEntriesUseCase: GetContentEntriesUseCase.Interface\n ) {\n this.base = new BaseAutocompletePresenter(searchUseCase, getEntriesUseCase);\n makeAutoObservable(this, { vm: computed });\n }\n\n get vm(): IRefMultiAutocompleteViewModel {\n const baseOptions = this.base.activeOptions;\n\n const seen = new Set<string>();\n const merged: IDropdownOption[] = [];\n\n for (const opt of this.resolved) {\n if (!seen.has(opt.entryId)) {\n seen.add(opt.entryId);\n merged.push({ label: opt.name, value: opt.entryId });\n }\n }\n\n for (const opt of baseOptions) {\n if (!seen.has(opt.entryId)) {\n seen.add(opt.entryId);\n merged.push({ label: opt.name, value: opt.entryId });\n }\n }\n\n const values = this.resolved.map(v => v.entryId);\n const ready = this.resolved.length > 0;\n\n return {\n loading: this.base.loading,\n options: merged,\n values: ready ? values : [],\n ready\n };\n }\n\n async init(config: IRefMultiAutocompleteInitConfig): Promise<void> {\n this.base.modelIds = config.modelIds;\n await this.base.loadDefaults();\n\n if (config.values && config.values.length > 0) {\n await this.resolve(config.values);\n }\n }\n\n async search(query: string): Promise<void> {\n await this.base.search(query);\n }\n\n select(entryIds: string[]): CmsReferenceValue[] {\n
|
|
1
|
+
{"version":3,"file":"presentation/fieldRenderers/ref/autocomplete/multi/RefMultiAutocompletePresenter.js","sources":["../../../../../../src/presentation/fieldRenderers/ref/autocomplete/multi/RefMultiAutocompletePresenter.ts"],"sourcesContent":["import { computed, makeAutoObservable, runInAction } from \"mobx\";\nimport { SearchContentEntriesUseCase } from \"~/features/contentEntry/searchContentEntries/abstractions.js\";\nimport { GetContentEntriesUseCase } from \"~/features/contentEntry/getContentEntries/abstractions.js\";\nimport type { CmsReferenceValue } from \"~/features/contentEntry/refTypes.js\";\nimport type { IRefEntryOption, IDropdownOption } from \"../abstractions.js\";\nimport { BaseAutocompletePresenter } from \"../BaseAutocompletePresenter.js\";\nimport {\n RefMultiAutocompletePresenter as Abstraction,\n type IRefMultiAutocompleteInitConfig,\n type IRefMultiAutocompleteViewModel\n} from \"./abstractions.js\";\n\nclass RefMultiAutocompletePresenterImpl implements Abstraction.Interface {\n private base: BaseAutocompletePresenter;\n private resolved: IRefEntryOption[] = [];\n\n constructor(\n searchUseCase: SearchContentEntriesUseCase.Interface,\n getEntriesUseCase: GetContentEntriesUseCase.Interface\n ) {\n this.base = new BaseAutocompletePresenter(searchUseCase, getEntriesUseCase);\n makeAutoObservable(this, { vm: computed });\n }\n\n get vm(): IRefMultiAutocompleteViewModel {\n const baseOptions = this.base.activeOptions;\n\n const seen = new Set<string>();\n const merged: IDropdownOption[] = [];\n\n for (const opt of this.resolved) {\n if (!seen.has(opt.entryId)) {\n seen.add(opt.entryId);\n merged.push({ label: opt.name, value: opt.entryId });\n }\n }\n\n for (const opt of baseOptions) {\n if (!seen.has(opt.entryId)) {\n seen.add(opt.entryId);\n merged.push({ label: opt.name, value: opt.entryId });\n }\n }\n\n const values = this.resolved.map(v => v.entryId);\n const ready = this.resolved.length > 0;\n\n return {\n loading: this.base.loading,\n options: merged,\n values: ready ? values : [],\n ready\n };\n }\n\n async init(config: IRefMultiAutocompleteInitConfig): Promise<void> {\n this.base.modelIds = config.modelIds;\n await this.base.loadDefaults();\n\n if (config.values && config.values.length > 0) {\n await this.resolve(config.values);\n }\n }\n\n async search(query: string): Promise<void> {\n await this.base.search(query);\n }\n\n select(entryIds: string[]): CmsReferenceValue[] {\n // Look the entries up before clearing the search, or one picked from the search results is lost.\n const allOptions = this.getAllKnownOptions();\n const selected = entryIds\n .map(entryId => allOptions.find(o => o.entryId === entryId))\n .filter((o): o is IRefEntryOption => o != null);\n\n this.base.clearSearch();\n this.resolved = selected;\n return selected.map(opt => ({ id: opt.id, modelId: opt.modelId }));\n }\n\n clear(): void {\n this.base.clearSearch();\n this.resolved = [];\n }\n\n dispose(): void {}\n\n private async resolve(values: CmsReferenceValue[]): Promise<void> {\n const options = await this.base.resolveEntries(values);\n runInAction(() => {\n this.resolved = options;\n });\n }\n\n private getAllKnownOptions(): IRefEntryOption[] {\n const seen = new Set<string>();\n const result: IRefEntryOption[] = [];\n\n for (const source of [this.resolved, this.base.searchOptions, this.base.defaultOptions]) {\n for (const opt of source) {\n if (!seen.has(opt.entryId)) {\n seen.add(opt.entryId);\n result.push(opt);\n }\n }\n }\n\n return result;\n }\n}\n\nexport const RefMultiAutocompletePresenter = Abstraction.createImplementation({\n implementation: RefMultiAutocompletePresenterImpl,\n dependencies: [SearchContentEntriesUseCase, GetContentEntriesUseCase]\n});\n"],"names":["RefMultiAutocompletePresenterImpl","searchUseCase","getEntriesUseCase","BaseAutocompletePresenter","makeAutoObservable","computed","baseOptions","seen","Set","merged","opt","values","v","ready","config","query","entryIds","allOptions","selected","entryId","o","options","runInAction","result","source","RefMultiAutocompletePresenter","Abstraction","SearchContentEntriesUseCase","GetContentEntriesUseCase"],"mappings":"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"}
|
package/presentation/fieldRenderers/ref/autocomplete/single/RefSingleAutocompletePresenter.js
CHANGED
|
@@ -45,8 +45,8 @@ class RefSingleAutocompletePresenterImpl {
|
|
|
45
45
|
await this.base.search(query);
|
|
46
46
|
}
|
|
47
47
|
select(entryId) {
|
|
48
|
-
this.base.clearSearch();
|
|
49
48
|
const opt = this.findOption(entryId);
|
|
49
|
+
this.base.clearSearch();
|
|
50
50
|
if (!opt) return null;
|
|
51
51
|
this.resolved = opt;
|
|
52
52
|
return {
|
package/presentation/fieldRenderers/ref/autocomplete/single/RefSingleAutocompletePresenter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presentation/fieldRenderers/ref/autocomplete/single/RefSingleAutocompletePresenter.js","sources":["../../../../../../src/presentation/fieldRenderers/ref/autocomplete/single/RefSingleAutocompletePresenter.ts"],"sourcesContent":["import { computed, makeAutoObservable, runInAction } from \"mobx\";\nimport { SearchContentEntriesUseCase } from \"~/features/contentEntry/searchContentEntries/abstractions.js\";\nimport { GetContentEntriesUseCase } from \"~/features/contentEntry/getContentEntries/abstractions.js\";\nimport type { CmsReferenceValue } from \"~/features/contentEntry/refTypes.js\";\nimport type { IRefEntryOption, IDropdownOption } from \"../abstractions.js\";\nimport { BaseAutocompletePresenter } from \"../BaseAutocompletePresenter.js\";\nimport {\n RefSingleAutocompletePresenter as Abstraction,\n type IRefSingleAutocompleteInitConfig,\n type IRefSingleAutocompleteViewModel\n} from \"./abstractions.js\";\n\nclass RefSingleAutocompletePresenterImpl implements Abstraction.Interface {\n private base: BaseAutocompletePresenter;\n private resolved: IRefEntryOption | null = null;\n\n constructor(\n searchUseCase: SearchContentEntriesUseCase.Interface,\n getEntriesUseCase: GetContentEntriesUseCase.Interface\n ) {\n this.base = new BaseAutocompletePresenter(searchUseCase, getEntriesUseCase);\n makeAutoObservable(this, { vm: computed });\n }\n\n get vm(): IRefSingleAutocompleteViewModel {\n const baseOptions = this.base.activeOptions;\n\n const seen = new Set<string>();\n const merged: IDropdownOption[] = [];\n\n if (this.resolved) {\n seen.add(this.resolved.entryId);\n merged.push({ label: this.resolved.name, value: this.resolved.entryId });\n }\n\n for (const opt of baseOptions) {\n if (!seen.has(opt.entryId)) {\n seen.add(opt.entryId);\n merged.push({ label: opt.name, value: opt.entryId });\n }\n }\n\n return {\n loading: this.base.loading,\n options: merged,\n value: this.resolved ? this.resolved.entryId : undefined,\n canReset: this.resolved !== null\n };\n }\n\n async init(config: IRefSingleAutocompleteInitConfig): Promise<void> {\n this.base.modelIds = config.modelIds;\n await this.base.loadDefaults();\n\n if (config.value) {\n await this.resolve(config.value);\n }\n }\n\n async search(query: string): Promise<void> {\n await this.base.search(query);\n }\n\n select(entryId: string): CmsReferenceValue | null {\n
|
|
1
|
+
{"version":3,"file":"presentation/fieldRenderers/ref/autocomplete/single/RefSingleAutocompletePresenter.js","sources":["../../../../../../src/presentation/fieldRenderers/ref/autocomplete/single/RefSingleAutocompletePresenter.ts"],"sourcesContent":["import { computed, makeAutoObservable, runInAction } from \"mobx\";\nimport { SearchContentEntriesUseCase } from \"~/features/contentEntry/searchContentEntries/abstractions.js\";\nimport { GetContentEntriesUseCase } from \"~/features/contentEntry/getContentEntries/abstractions.js\";\nimport type { CmsReferenceValue } from \"~/features/contentEntry/refTypes.js\";\nimport type { IRefEntryOption, IDropdownOption } from \"../abstractions.js\";\nimport { BaseAutocompletePresenter } from \"../BaseAutocompletePresenter.js\";\nimport {\n RefSingleAutocompletePresenter as Abstraction,\n type IRefSingleAutocompleteInitConfig,\n type IRefSingleAutocompleteViewModel\n} from \"./abstractions.js\";\n\nclass RefSingleAutocompletePresenterImpl implements Abstraction.Interface {\n private base: BaseAutocompletePresenter;\n private resolved: IRefEntryOption | null = null;\n\n constructor(\n searchUseCase: SearchContentEntriesUseCase.Interface,\n getEntriesUseCase: GetContentEntriesUseCase.Interface\n ) {\n this.base = new BaseAutocompletePresenter(searchUseCase, getEntriesUseCase);\n makeAutoObservable(this, { vm: computed });\n }\n\n get vm(): IRefSingleAutocompleteViewModel {\n const baseOptions = this.base.activeOptions;\n\n const seen = new Set<string>();\n const merged: IDropdownOption[] = [];\n\n if (this.resolved) {\n seen.add(this.resolved.entryId);\n merged.push({ label: this.resolved.name, value: this.resolved.entryId });\n }\n\n for (const opt of baseOptions) {\n if (!seen.has(opt.entryId)) {\n seen.add(opt.entryId);\n merged.push({ label: opt.name, value: opt.entryId });\n }\n }\n\n return {\n loading: this.base.loading,\n options: merged,\n value: this.resolved ? this.resolved.entryId : undefined,\n canReset: this.resolved !== null\n };\n }\n\n async init(config: IRefSingleAutocompleteInitConfig): Promise<void> {\n this.base.modelIds = config.modelIds;\n await this.base.loadDefaults();\n\n if (config.value) {\n await this.resolve(config.value);\n }\n }\n\n async search(query: string): Promise<void> {\n await this.base.search(query);\n }\n\n select(entryId: string): CmsReferenceValue | null {\n // Look the entry up before clearing the search, or one picked from the search results is lost.\n const opt = this.findOption(entryId);\n this.base.clearSearch();\n if (!opt) {\n return null;\n }\n this.resolved = opt;\n return { id: opt.id, modelId: opt.modelId };\n }\n\n clear(): void {\n this.base.clearSearch();\n this.resolved = null;\n }\n\n dispose(): void {}\n\n private async resolve(value: CmsReferenceValue): Promise<void> {\n const options = await this.base.resolveEntries([value]);\n runInAction(() => {\n this.resolved = options[0] ?? null;\n });\n }\n\n private findOption(entryId: string): IRefEntryOption | undefined {\n const sources = [\n this.resolved ? [this.resolved] : [],\n this.base.searchOptions,\n this.base.defaultOptions\n ];\n for (const source of sources) {\n const found = source.find(o => o.entryId === entryId);\n if (found) {\n return found;\n }\n }\n return undefined;\n }\n}\n\nexport const RefSingleAutocompletePresenter = Abstraction.createImplementation({\n implementation: RefSingleAutocompletePresenterImpl,\n dependencies: [SearchContentEntriesUseCase, GetContentEntriesUseCase]\n});\n"],"names":["RefSingleAutocompletePresenterImpl","searchUseCase","getEntriesUseCase","BaseAutocompletePresenter","makeAutoObservable","computed","baseOptions","seen","Set","merged","opt","undefined","config","query","entryId","value","options","runInAction","sources","source","found","o","RefSingleAutocompletePresenter","Abstraction","SearchContentEntriesUseCase","GetContentEntriesUseCase"],"mappings":";;;;;AAYA,MAAMA;IAIF,YACIC,aAAoD,EACpDC,iBAAqD,CACvD;aALM,QAAQ,GAA2B;QAMvC,IAAI,CAAC,IAAI,GAAG,IAAIC,0BAA0BF,eAAeC;QACzDE,mBAAmB,IAAI,EAAE;YAAE,IAAIC;QAAS;IAC5C;IAEA,IAAI,KAAsC;QACtC,MAAMC,cAAc,IAAI,CAAC,IAAI,CAAC,aAAa;QAE3C,MAAMC,OAAO,IAAIC;QACjB,MAAMC,SAA4B,EAAE;QAEpC,IAAI,IAAI,CAAC,QAAQ,EAAE;YACfF,KAAK,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO;YAC9BE,OAAO,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI;gBAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO;YAAC;QAC1E;QAEA,KAAK,MAAMC,OAAOJ,YACd,IAAI,CAACC,KAAK,GAAG,CAACG,IAAI,OAAO,GAAG;YACxBH,KAAK,GAAG,CAACG,IAAI,OAAO;YACpBD,OAAO,IAAI,CAAC;gBAAE,OAAOC,IAAI,IAAI;gBAAE,OAAOA,IAAI,OAAO;YAAC;QACtD;QAGJ,OAAO;YACH,SAAS,IAAI,CAAC,IAAI,CAAC,OAAO;YAC1B,SAASD;YACT,OAAO,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,GAAGE;YAC/C,UAAU,AAAkB,SAAlB,IAAI,CAAC,QAAQ;QAC3B;IACJ;IAEA,MAAM,KAAKC,MAAwC,EAAiB;QAChE,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAGA,OAAO,QAAQ;QACpC,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY;QAE5B,IAAIA,OAAO,KAAK,EACZ,MAAM,IAAI,CAAC,OAAO,CAACA,OAAO,KAAK;IAEvC;IAEA,MAAM,OAAOC,KAAa,EAAiB;QACvC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAACA;IAC3B;IAEA,OAAOC,OAAe,EAA4B;QAE9C,MAAMJ,MAAM,IAAI,CAAC,UAAU,CAACI;QAC5B,IAAI,CAAC,IAAI,CAAC,WAAW;QACrB,IAAI,CAACJ,KACD,OAAO;QAEX,IAAI,CAAC,QAAQ,GAAGA;QAChB,OAAO;YAAE,IAAIA,IAAI,EAAE;YAAE,SAASA,IAAI,OAAO;QAAC;IAC9C;IAEA,QAAc;QACV,IAAI,CAAC,IAAI,CAAC,WAAW;QACrB,IAAI,CAAC,QAAQ,GAAG;IACpB;IAEA,UAAgB,CAAC;IAEjB,MAAc,QAAQK,KAAwB,EAAiB;QAC3D,MAAMC,UAAU,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC;YAACD;SAAM;QACtDE,YAAY;YACR,IAAI,CAAC,QAAQ,GAAGD,OAAO,CAAC,EAAE,IAAI;QAClC;IACJ;IAEQ,WAAWF,OAAe,EAA+B;QAC7D,MAAMI,UAAU;YACZ,IAAI,CAAC,QAAQ,GAAG;gBAAC,IAAI,CAAC,QAAQ;aAAC,GAAG,EAAE;YACpC,IAAI,CAAC,IAAI,CAAC,aAAa;YACvB,IAAI,CAAC,IAAI,CAAC,cAAc;SAC3B;QACD,KAAK,MAAMC,UAAUD,QAAS;YAC1B,MAAME,QAAQD,OAAO,IAAI,CAACE,CAAAA,IAAKA,EAAE,OAAO,KAAKP;YAC7C,IAAIM,OACA,OAAOA;QAEf;IAEJ;AACJ;AAEO,MAAME,gEAAiCC,+BAAAA,oBAAgC,CAAC;IAC3E,gBAAgBvB;IAChB,cAAc;QAACwB;QAA6BC;KAAyB;AACzE"}
|