Skip to content

Commit f9da84b

Browse files
committed
Merge remote-tracking branch 'refs/remotes/origin/dev' into stable
2 parents ddc0012 + 5f712dd commit f9da84b

File tree

11 files changed

+159
-33
lines changed

11 files changed

+159
-33
lines changed

packages/api-headless-cms/__tests__/contentAPI/mocks/contentModels.ts

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,109 @@ const models: CmsModel[] = [
253253
tenant: "root",
254254
webinyVersion
255255
},
256+
// category
257+
{
258+
createdOn: new Date().toISOString(),
259+
savedOn: new Date().toISOString(),
260+
locale: "en-US",
261+
titleFieldId: "title",
262+
lockedFields: [],
263+
name: "Category Singleton",
264+
description: "Product category Singleton",
265+
modelId: "categorySingleton",
266+
singularApiName: "CategoryApiNameWhichIsABitDifferentThanModelIdSingleton",
267+
pluralApiName: "CategoriesApiModelSingleton",
268+
group: {
269+
id: contentModelGroup.id,
270+
name: contentModelGroup.name
271+
},
272+
layout: [[ids.field11], [ids.field12]],
273+
fields: [
274+
{
275+
id: ids.field11,
276+
multipleValues: false,
277+
helpText: "",
278+
label: "Title",
279+
type: "text",
280+
storageId: "text@titleStorageId",
281+
fieldId: "title",
282+
validation: [
283+
{
284+
name: "required",
285+
message: "This field is required"
286+
},
287+
{
288+
name: "minLength",
289+
message: "Enter at least 3 characters",
290+
settings: {
291+
min: 3.0
292+
}
293+
}
294+
],
295+
listValidation: [],
296+
placeholderText: "placeholder text",
297+
predefinedValues: {
298+
enabled: false,
299+
values: []
300+
},
301+
renderer: {
302+
name: "renderer"
303+
}
304+
},
305+
{
306+
id: ids.field12,
307+
multipleValues: false,
308+
helpText: "",
309+
label: "Slug",
310+
type: "text",
311+
storageId: "text@slugStorageId",
312+
fieldId: "slug",
313+
validation: [
314+
{
315+
name: "required",
316+
message: "This field is required"
317+
}
318+
],
319+
listValidation: [],
320+
placeholderText: "placeholder text",
321+
predefinedValues: {
322+
enabled: false,
323+
values: []
324+
},
325+
renderer: {
326+
name: "renderer"
327+
}
328+
},
329+
{
330+
id: ids.field34,
331+
multipleValues: false,
332+
helpText: "",
333+
label: "Category",
334+
type: "ref",
335+
storageId: "ref@categoryRef",
336+
fieldId: "categoryRef",
337+
validation: [],
338+
listValidation: [],
339+
placeholderText: "placeholder text",
340+
settings: {
341+
models: [
342+
{
343+
modelId: "categorySingleton"
344+
}
345+
]
346+
},
347+
predefinedValues: {
348+
enabled: false,
349+
values: []
350+
},
351+
renderer: {
352+
name: "renderer"
353+
}
354+
}
355+
],
356+
tenant: "root",
357+
webinyVersion
358+
},
256359
// product
257360
{
258361
createdOn: new Date().toISOString(),

packages/api-headless-cms/__tests__/contentAPI/singletonContentEntry.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { CMS_MODEL_SINGLETON_TAG } from "~/constants";
55

66
describe("singleton model content entries", () => {
77
const plugins = createPluginFromCmsModel({
8-
...getCmsModel("category"),
8+
...getCmsModel("categorySingleton"),
99
tags: [CMS_MODEL_SINGLETON_TAG]
1010
});
1111

packages/api-headless-cms/__tests__/testHelpers/useSingletonCategoryHandler.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ const updateCategoryMutation = (model: CmsModel) => {
6666
};
6767

6868
export const useSingletonCategoryHandler = (params: GraphQLHandlerParams) => {
69-
const model = getCmsModel("category");
69+
const model = getCmsModel("categorySingleton");
7070
const contentHandler = useGraphQLHandler(params);
7171

7272
return {

packages/api-headless-cms/src/graphql/schema/createSingularResolvers.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ export const createSingularResolvers: CreateSingularResolvers = ({
3131
}
3232

3333
const createFieldResolvers = createFieldResolversFactory({
34-
endpointType: "manage",
34+
endpointType: type,
3535
models,
3636
model,
3737
fieldTypePlugins

packages/api-headless-cms/src/graphql/schema/createSingularSDL.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ export const createSingularSDL: CreateSingularSDL = ({
3434
models,
3535
model,
3636
fields: model.fields,
37-
type: "manage",
37+
type,
3838
fieldTypePlugins
3939
});
4040

packages/api-headless-cms/src/utils/getSchemaFromFieldPlugins.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,15 @@ interface Params {
3434
export const createGraphQLSchemaPluginFromFieldPlugins = (params: Params) => {
3535
const { models, fieldTypePlugins, type, createPlugin = defaultCreatePlugin } = params;
3636

37+
const apiType = TYPE_MAP[type];
38+
3739
const plugins: ICmsGraphQLSchemaPlugin[] = [];
3840
for (const key in fieldTypePlugins) {
3941
const fieldTypePlugin = fieldTypePlugins[key];
40-
if (!TYPE_MAP[type] || !fieldTypePlugin[TYPE_MAP[type]]) {
42+
if (!apiType || !fieldTypePlugin[apiType]) {
4143
continue;
4244
}
43-
const createSchema = fieldTypePlugin[TYPE_MAP[type]].createSchema;
45+
const createSchema = fieldTypePlugin[apiType].createSchema;
4446
// Render gql types generated by field type plugins
4547
if (!createSchema) {
4648
continue;

packages/app-aco/src/contexts/app.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ interface CreateAppParams {
6060
getFields?: () => AcoModelField[];
6161
}
6262

63-
const createApp = (data: CreateAppParams): AcoApp => {
63+
export const createAppFromModel = (data: CreateAppParams): AcoApp => {
6464
return {
6565
...data,
6666
getFields:
@@ -138,7 +138,7 @@ export const AcoAppProvider = ({
138138
...prev,
139139
loading: false,
140140
model: inputModel,
141-
app: createApp({
141+
app: createAppFromModel({
142142
id,
143143
model: inputModel,
144144
getFields

packages/app-headless-cms/src/admin/plugins/fieldRenderers/ref/components/NewReferencedEntryDialog.tsx

Lines changed: 41 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,19 @@ import {
1717
import { useCms } from "~/admin/hooks";
1818
import { FullWidthDialog } from "./dialog/Dialog";
1919
import { NavigateFolderProvider as AbstractNavigateFolderProvider } from "@webiny/app-aco/contexts/navigateFolder";
20+
import { SearchRecordsProvider } from "@webiny/app-aco/contexts/records";
2021
import { FolderTree, useNavigateFolder } from "@webiny/app-aco";
2122
import styled from "@emotion/styled";
2223
import { Elevation } from "@webiny/ui/Elevation";
2324
import { SplitView, LeftPanel, RightPanel } from "@webiny/app-admin/components/SplitView";
2425
import { CircularProgress } from "@webiny/ui/Progress";
2526
import { usePersistEntry } from "~/admin/hooks/usePersistEntry";
27+
import {
28+
AcoAppContext,
29+
AcoAppProviderContext,
30+
createAppFromModel
31+
} from "@webiny/app-aco/contexts/app";
32+
import { DialogsProvider } from "@webiny/app-admin";
2633

2734
const t = i18n.ns("app-headless-cms/admin/fields/ref");
2835

@@ -159,22 +166,46 @@ export const NewReferencedEntryDialog = ({
159166
},
160167
[onChange, model]
161168
);
169+
162170
if (!model) {
163171
return null;
164172
}
165173

174+
const acoAppContext: AcoAppProviderContext = {
175+
app: createAppFromModel({
176+
model,
177+
id: `cms:${model.modelId}`
178+
}),
179+
mode: "cms",
180+
client: apolloClient,
181+
model,
182+
folderIdPath: "wbyAco_location.folderId",
183+
folderIdInPath: "wbyAco_location.folderId_in",
184+
loading: false
185+
};
186+
166187
return (
167-
<ContentEntriesProvider contentModel={model} key={model.modelId} insideDialog={true}>
168-
<FoldersProvider type={`cms:${model.modelId}`}>
169-
<NavigateFolderProvider modelId={model.modelId}>
170-
<ContentEntryProviderWithCurrentFolderId
171-
model={model}
172-
onClose={onClose}
173-
onCreate={onCreate}
174-
/>
175-
</NavigateFolderProvider>
188+
<AcoAppContext.Provider value={acoAppContext}>
189+
<FoldersProvider>
190+
<SearchRecordsProvider>
191+
<NavigateFolderProvider modelId={model.modelId}>
192+
<DialogsProvider>
193+
<ContentEntriesProvider
194+
contentModel={model}
195+
key={model.modelId}
196+
insideDialog={true}
197+
>
198+
<ContentEntryProviderWithCurrentFolderId
199+
model={model}
200+
onClose={onClose}
201+
onCreate={onCreate}
202+
/>
203+
</ContentEntriesProvider>
204+
</DialogsProvider>
205+
</NavigateFolderProvider>
206+
</SearchRecordsProvider>
176207
</FoldersProvider>
177-
</ContentEntriesProvider>
208+
</AcoAppContext.Provider>
178209
);
179210
};
180211

packages/app-headless-cms/src/admin/views/contentModels/NewContentModelDialog.tsx

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -164,13 +164,7 @@ const NewContentModelDialog = ({ open, onClose }: NewContentModelDialogProps) =>
164164
return (
165165
<Dialog open={open} onClose={onClose} data-testid="cms-new-content-model-modal">
166166
{open && (
167-
<Form<CmsModelData>
168-
data={{ group, singleton: false }}
169-
onSubmit={data => {
170-
console.log("submitting", data);
171-
onSubmit(data);
172-
}}
173-
>
167+
<Form<CmsModelData> data={{ group, singleton: false }} onSubmit={onSubmit}>
174168
{({ Bind, submit, data }) => {
175169
return (
176170
<>
@@ -288,12 +282,7 @@ const NewContentModelDialog = ({ open, onClose }: NewContentModelDialogProps) =>
288282
</Grid>
289283
</UID.DialogContent>
290284
<UID.DialogActions>
291-
<ButtonPrimary
292-
onClick={ev => {
293-
console.log("submitting click", data);
294-
submit(ev);
295-
}}
296-
>
285+
<ButtonPrimary onClick={submit}>
297286
+ {t`Create Model`}
298287
</ButtonPrimary>
299288
</UID.DialogActions>

packages/ui/src/DelayedOnChange/DelayedOnChange.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ const emptyFunction = (): undefined => {
88
export interface ApplyValueCb<TValue> {
99
(value: TValue): void;
1010
}
11+
1112
/**
1213
* This component is used to wrap Input and Textarea components to optimize form re-render.
1314
* These 2 are the only components that trigger form model change on each character input.
@@ -145,7 +146,7 @@ export const DelayedOnChange = <TValue = any>({
145146
if (ev.key === "Tab") {
146147
applyValue((ev.target as HTMLInputElement).value as any as TValue);
147148
realOnKeyDown(ev);
148-
} else if (ev.key === "Enter" && props["data-on-enter"]) {
149+
} else if (ev.key === "Enter") {
149150
applyValue((ev.target as HTMLInputElement).value as any as TValue);
150151
realOnKeyDown(ev);
151152
} else {

0 commit comments

Comments
 (0)