@webiny/app-headless-cms 6.0.0-rc.4 → 6.0.0-rc.5
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/CmsModelFieldRenderer.d.ts +4 -0
- package/admin/components/CmsModelFieldRenderer.js +14 -0
- package/admin/components/CmsModelFieldRenderer.js.map +1 -0
- package/admin/components/CmsModelFieldType.d.ts +4 -0
- package/admin/components/CmsModelFieldType.js +14 -0
- package/admin/components/CmsModelFieldType.js.map +1 -0
- package/admin/components/CmsModelLayoutFieldRenderer.d.ts +13 -0
- package/admin/components/CmsModelLayoutFieldRenderer.js +15 -0
- package/admin/components/CmsModelLayoutFieldRenderer.js.map +1 -0
- package/admin/components/CmsModelLayoutFieldType.d.ts +2 -0
- package/admin/components/CmsModelLayoutFieldType.js +14 -0
- package/admin/components/CmsModelLayoutFieldType.js.map +1 -0
- package/admin/components/ContentModelEditor/ContentModelEditorProvider.js.map +1 -1
- package/admin/components/ContentModelEditor/FieldsSidebar.js.map +1 -1
- package/admin/components/FieldEditor/EditFieldDialog/getValidators.d.ts +3 -3
- package/admin/components/FieldEditor/EditFieldDialog/getValidators.js.map +1 -1
- package/admin/components/FieldEditor/FieldEditor.js +10 -10
- package/admin/components/FieldEditor/FieldEditor.js.map +1 -1
- package/admin/components/FieldEditor/FieldEditorContext.d.ts +11 -11
- package/admin/components/FieldEditor/FieldEditorContext.js +41 -41
- package/admin/components/FieldEditor/FieldEditorContext.js.map +1 -1
- package/admin/components/FieldEditor/LayoutCell.d.ts +3 -3
- package/admin/components/FieldEditor/LayoutCell.js +6 -6
- package/admin/components/FieldEditor/LayoutCell.js.map +1 -1
- package/admin/plugins/fieldRenderers/boolean/booleanSwitch.js +2 -2
- package/admin/plugins/fieldRenderers/boolean/booleanSwitch.js.map +1 -1
- package/admin/plugins/fieldRenderers/checkboxes.js +2 -2
- package/admin/plugins/fieldRenderers/checkboxes.js.map +1 -1
- package/admin/plugins/fieldRenderers/dateTime/Input.js +2 -2
- package/admin/plugins/fieldRenderers/dateTime/Input.js.map +1 -1
- package/admin/plugins/fieldRenderers/dateTime/Select.js +2 -2
- package/admin/plugins/fieldRenderers/dateTime/Select.js.map +1 -1
- package/admin/plugins/fieldRenderers/dynamicZone/MultiValueDynamicZone.js +2 -2
- package/admin/plugins/fieldRenderers/dynamicZone/MultiValueDynamicZone.js.map +1 -1
- package/admin/plugins/fieldRenderers/dynamicZone/SingleValueDynamicZone.js +2 -2
- package/admin/plugins/fieldRenderers/dynamicZone/SingleValueDynamicZone.js.map +1 -1
- package/admin/plugins/fieldRenderers/lexicalText/lexicalTextInput.js +2 -2
- package/admin/plugins/fieldRenderers/lexicalText/lexicalTextInput.js.map +1 -1
- package/admin/plugins/fieldRenderers/lexicalText/lexicalTextInputs.js +2 -2
- package/admin/plugins/fieldRenderers/lexicalText/lexicalTextInputs.js.map +1 -1
- package/admin/plugins/fieldRenderers/longText/longText.js +2 -2
- package/admin/plugins/fieldRenderers/longText/longText.js.map +1 -1
- package/admin/plugins/fieldRenderers/longText/longTexts.js +2 -2
- package/admin/plugins/fieldRenderers/longText/longTexts.js.map +1 -1
- package/admin/plugins/fieldRenderers/number/numberInput.js +2 -2
- package/admin/plugins/fieldRenderers/number/numberInput.js.map +1 -1
- package/admin/plugins/fieldRenderers/number/numberInputs.js +2 -2
- package/admin/plugins/fieldRenderers/number/numberInputs.js.map +1 -1
- package/admin/plugins/fieldRenderers/object/MultiValueContainer.js +2 -2
- package/admin/plugins/fieldRenderers/object/MultiValueContainer.js.map +1 -1
- package/admin/plugins/fieldRenderers/radioButtons.js +2 -2
- package/admin/plugins/fieldRenderers/radioButtons.js.map +1 -1
- package/admin/plugins/fieldRenderers/ref/advanced/components/AdvancedMultipleReferenceField.js +2 -2
- package/admin/plugins/fieldRenderers/ref/advanced/components/AdvancedMultipleReferenceField.js.map +1 -1
- package/admin/plugins/fieldRenderers/ref/advanced/components/AdvancedSingleReferenceField.js +2 -2
- package/admin/plugins/fieldRenderers/ref/advanced/components/AdvancedSingleReferenceField.js.map +1 -1
- package/admin/plugins/fieldRenderers/ref/components/ContentEntriesAutocomplete.js +2 -2
- package/admin/plugins/fieldRenderers/ref/components/ContentEntriesAutocomplete.js.map +1 -1
- package/admin/plugins/fieldRenderers/ref/components/ContentEntriesMultiAutoComplete.js +2 -2
- package/admin/plugins/fieldRenderers/ref/components/ContentEntriesMultiAutoComplete.js.map +1 -1
- package/admin/plugins/fieldRenderers/ref/simple/components/SimpleMultipleRenderer.js +2 -2
- package/admin/plugins/fieldRenderers/ref/simple/components/SimpleMultipleRenderer.js.map +1 -1
- package/admin/plugins/fieldRenderers/ref/simple/components/SimpleSingleRenderer.js +2 -2
- package/admin/plugins/fieldRenderers/ref/simple/components/SimpleSingleRenderer.js.map +1 -1
- package/admin/plugins/fieldRenderers/select.js +2 -2
- package/admin/plugins/fieldRenderers/select.js.map +1 -1
- package/admin/plugins/fieldRenderers/text/tags.js +2 -2
- package/admin/plugins/fieldRenderers/text/tags.js.map +1 -1
- package/admin/plugins/fieldRenderers/text/textInput.js +2 -2
- package/admin/plugins/fieldRenderers/text/textInput.js.map +1 -1
- package/admin/plugins/fieldRenderers/text/textInputs.js +2 -2
- package/admin/plugins/fieldRenderers/text/textInputs.js.map +1 -1
- package/admin/plugins/fields/ui/TabsLayoutEditor.d.ts +4 -4
- package/admin/plugins/fields/ui/TabsLayoutEditor.js +44 -44
- package/admin/plugins/fields/ui/TabsLayoutEditor.js.map +1 -1
- package/admin/plugins/fields/ui/alert.d.ts +2 -2
- package/admin/plugins/fields/ui/alert.js +11 -11
- package/admin/plugins/fields/ui/alert.js.map +1 -1
- package/admin/plugins/fields/ui/separator.d.ts +2 -2
- package/admin/plugins/fields/ui/separator.js +10 -10
- package/admin/plugins/fields/ui/separator.js.map +1 -1
- package/admin/plugins/fields/ui/tabs.d.ts +2 -2
- package/admin/plugins/fields/ui/tabs.js +10 -10
- package/admin/plugins/fields/ui/tabs.js.map +1 -1
- package/allPlugins.d.ts +1 -1
- package/exports/admin/cms.d.ts +4 -0
- package/exports/admin/cms.js +4 -0
- package/exports/admin/cms.js.map +1 -1
- package/package.json +23 -23
- package/types.d.ts +1 -1
- package/types.js +1 -1
- package/types.js.map +1 -1
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CmsModelFieldRendererPlugin } from "@webiny/app-headless-cms-common/types/index.js";
|
|
2
|
+
type CmsModelFieldRendererProps = CmsModelFieldRendererPlugin["renderer"];
|
|
3
|
+
export declare const CmsModelFieldRenderer: (props: CmsModelFieldRendererProps) => null;
|
|
4
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { useEffect } from "react";
|
|
2
|
+
import { plugins } from "@webiny/plugins";
|
|
3
|
+
export const CmsModelFieldRenderer = props => {
|
|
4
|
+
useEffect(() => {
|
|
5
|
+
plugins.register({
|
|
6
|
+
type: "cms-editor-field-renderer",
|
|
7
|
+
name: `cms-editor-field-renderer-${props.rendererName}`,
|
|
8
|
+
renderer: props
|
|
9
|
+
});
|
|
10
|
+
}, []);
|
|
11
|
+
return null;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
//# sourceMappingURL=CmsModelFieldRenderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useEffect","plugins","CmsModelFieldRenderer","props","register","type","name","rendererName","renderer"],"sources":["CmsModelFieldRenderer.tsx"],"sourcesContent":["import { useEffect } from \"react\";\nimport { plugins } from \"@webiny/plugins\";\nimport type { CmsModelFieldRendererPlugin } from \"@webiny/app-headless-cms-common/types/index.js\";\n\ntype CmsModelFieldRendererProps = CmsModelFieldRendererPlugin[\"renderer\"];\n\nexport const CmsModelFieldRenderer = (props: CmsModelFieldRendererProps) => {\n useEffect(() => {\n plugins.register({\n type: \"cms-editor-field-renderer\",\n name: `cms-editor-field-renderer-${props.rendererName}`,\n renderer: props\n } satisfies CmsModelFieldRendererPlugin);\n }, []);\n return null;\n};\n"],"mappings":"AAAA,SAASA,SAAS,QAAQ,OAAO;AACjC,SAASC,OAAO,QAAQ,iBAAiB;AAKzC,OAAO,MAAMC,qBAAqB,GAAIC,KAAiC,IAAK;EACxEH,SAAS,CAAC,MAAM;IACZC,OAAO,CAACG,QAAQ,CAAC;MACbC,IAAI,EAAE,2BAA2B;MACjCC,IAAI,EAAE,6BAA6BH,KAAK,CAACI,YAAY,EAAE;MACvDC,QAAQ,EAAEL;IACd,CAAuC,CAAC;EAC5C,CAAC,EAAE,EAAE,CAAC;EACN,OAAO,IAAI;AACf,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { useEffect } from "react";
|
|
2
|
+
import { plugins } from "@webiny/plugins";
|
|
3
|
+
export const CmsModelFieldType = props => {
|
|
4
|
+
useEffect(() => {
|
|
5
|
+
plugins.register({
|
|
6
|
+
type: "cms-editor-field-type",
|
|
7
|
+
name: `cms-editor-field-type-${props.type}`,
|
|
8
|
+
field: props
|
|
9
|
+
});
|
|
10
|
+
}, []);
|
|
11
|
+
return null;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
//# sourceMappingURL=CmsModelFieldType.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useEffect","plugins","CmsModelFieldType","props","register","type","name","field"],"sources":["CmsModelFieldType.tsx"],"sourcesContent":["import { useEffect } from \"react\";\nimport { plugins } from \"@webiny/plugins\";\nimport type { CmsModelFieldTypePlugin } from \"@webiny/app-headless-cms-common/types/index.js\";\n\ntype CmsModelFieldTypeProps = CmsModelFieldTypePlugin[\"field\"];\n\nexport const CmsModelFieldType = (props: CmsModelFieldTypeProps) => {\n useEffect(() => {\n plugins.register({\n type: \"cms-editor-field-type\",\n name: `cms-editor-field-type-${props.type}`,\n field: props\n } satisfies CmsModelFieldTypePlugin);\n }, []);\n return null;\n};\n"],"mappings":"AAAA,SAASA,SAAS,QAAQ,OAAO;AACjC,SAASC,OAAO,QAAQ,iBAAiB;AAKzC,OAAO,MAAMC,iBAAiB,GAAIC,KAA6B,IAAK;EAChEH,SAAS,CAAC,MAAM;IACZC,OAAO,CAACG,QAAQ,CAAC;MACbC,IAAI,EAAE,uBAAuB;MAC7BC,IAAI,EAAE,yBAAyBH,KAAK,CAACE,IAAI,EAAE;MAC3CE,KAAK,EAAEJ;IACX,CAAmC,CAAC;EACxC,CAAC,EAAE,EAAE,CAAC;EACN,OAAO,IAAI;AACf,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { BindComponent, CmsModelLayoutField, CmsModel, CmsModelField } from "@webiny/app-headless-cms-common/types/index.js";
|
|
3
|
+
export interface CmsModelLayoutFieldRendererProps<T extends CmsModelLayoutField = CmsModelLayoutField> {
|
|
4
|
+
fieldType: string;
|
|
5
|
+
render(props: {
|
|
6
|
+
field: T;
|
|
7
|
+
Bind: BindComponent;
|
|
8
|
+
fields: CmsModelField[];
|
|
9
|
+
contentModel: CmsModel;
|
|
10
|
+
gridClassName?: string;
|
|
11
|
+
}): React.ReactElement | null;
|
|
12
|
+
}
|
|
13
|
+
export declare const CmsModelLayoutFieldRenderer: <T extends CmsModelLayoutField = CmsModelLayoutField>(props: CmsModelLayoutFieldRendererProps<T>) => null;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { useEffect } from "react";
|
|
2
|
+
import { plugins } from "@webiny/plugins";
|
|
3
|
+
export const CmsModelLayoutFieldRenderer = props => {
|
|
4
|
+
useEffect(() => {
|
|
5
|
+
plugins.register({
|
|
6
|
+
type: "cms-layout-field-renderer",
|
|
7
|
+
name: `cms-layout-field-renderer-${props.fieldType}`,
|
|
8
|
+
fieldType: props.fieldType,
|
|
9
|
+
render: props.render
|
|
10
|
+
});
|
|
11
|
+
}, []);
|
|
12
|
+
return null;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
//# sourceMappingURL=CmsModelLayoutFieldRenderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useEffect","plugins","CmsModelLayoutFieldRenderer","props","register","type","name","fieldType","render"],"sources":["CmsModelLayoutFieldRenderer.tsx"],"sourcesContent":["import React from \"react\";\nimport { useEffect } from \"react\";\nimport { plugins } from \"@webiny/plugins\";\nimport type {\n BindComponent,\n CmsModelLayoutField,\n CmsModel,\n CmsModelField,\n CmsModelLayoutFieldRendererPlugin\n} from \"@webiny/app-headless-cms-common/types/index.js\";\n\nexport interface CmsModelLayoutFieldRendererProps<\n T extends CmsModelLayoutField = CmsModelLayoutField\n> {\n fieldType: string;\n render(props: {\n field: T;\n Bind: BindComponent;\n fields: CmsModelField[];\n contentModel: CmsModel;\n gridClassName?: string;\n }): React.ReactElement | null;\n}\n\nexport const CmsModelLayoutFieldRenderer = <T extends CmsModelLayoutField = CmsModelLayoutField>(\n props: CmsModelLayoutFieldRendererProps<T>\n) => {\n useEffect(() => {\n plugins.register({\n type: \"cms-layout-field-renderer\",\n name: `cms-layout-field-renderer-${props.fieldType}`,\n fieldType: props.fieldType,\n render: props.render\n } as CmsModelLayoutFieldRendererPlugin);\n }, []);\n return null;\n};\n"],"mappings":"AACA,SAASA,SAAS,QAAQ,OAAO;AACjC,SAASC,OAAO,QAAQ,iBAAiB;AAsBzC,OAAO,MAAMC,2BAA2B,GACpCC,KAA0C,IACzC;EACDH,SAAS,CAAC,MAAM;IACZC,OAAO,CAACG,QAAQ,CAAC;MACbC,IAAI,EAAE,2BAA2B;MACjCC,IAAI,EAAE,6BAA6BH,KAAK,CAACI,SAAS,EAAE;MACpDA,SAAS,EAAEJ,KAAK,CAACI,SAAS;MAC1BC,MAAM,EAAEL,KAAK,CAACK;IAClB,CAAsC,CAAC;EAC3C,CAAC,EAAE,EAAE,CAAC;EACN,OAAO,IAAI;AACf,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { useEffect } from "react";
|
|
2
|
+
import { plugins } from "@webiny/plugins";
|
|
3
|
+
export const CmsModelLayoutFieldType = props => {
|
|
4
|
+
useEffect(() => {
|
|
5
|
+
plugins.register({
|
|
6
|
+
type: "cms-editor-layout-field-type",
|
|
7
|
+
name: `cms-editor-layout-field-type-${props.type}`,
|
|
8
|
+
field: props
|
|
9
|
+
});
|
|
10
|
+
}, []);
|
|
11
|
+
return null;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
//# sourceMappingURL=CmsModelLayoutFieldType.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useEffect","plugins","CmsModelLayoutFieldType","props","register","type","name","field"],"sources":["CmsModelLayoutFieldType.tsx"],"sourcesContent":["import { useEffect } from \"react\";\nimport { plugins } from \"@webiny/plugins\";\nimport type {\n CmsLayoutField,\n CmsModelLayoutFieldTypePlugin\n} from \"@webiny/app-headless-cms-common/types/index.js\";\n\nexport const CmsModelLayoutFieldType = <T extends CmsLayoutField = CmsLayoutField>(\n props: CmsModelLayoutFieldTypePlugin<T>[\"field\"]\n) => {\n useEffect(() => {\n plugins.register({\n type: \"cms-editor-layout-field-type\",\n name: `cms-editor-layout-field-type-${props.type}`,\n field: props as unknown as CmsModelLayoutFieldTypePlugin[\"field\"]\n } satisfies CmsModelLayoutFieldTypePlugin);\n }, []);\n return null;\n};\n"],"mappings":"AAAA,SAASA,SAAS,QAAQ,OAAO;AACjC,SAASC,OAAO,QAAQ,iBAAiB;AAMzC,OAAO,MAAMC,uBAAuB,GAChCC,KAAgD,IAC/C;EACDH,SAAS,CAAC,MAAM;IACZC,OAAO,CAACG,QAAQ,CAAC;MACbC,IAAI,EAAE,8BAA8B;MACpCC,IAAI,EAAE,gCAAgCH,KAAK,CAACE,IAAI,EAAE;MAClDE,KAAK,EAAEJ;IACX,CAAyC,CAAC;EAC9C,CAAC,EAAE,EAAE,CAAC;EACN,OAAO,IAAI;AACf,CAAC","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useCallback","useEffect","useMemo","useReducer","get","pick","useSnackbar","useRouter","GET_CONTENT_MODEL","UPDATE_CONTENT_MODEL","LIST_MENU_CONTENT_GROUPS_MODELS","ModelProvider","createHashing","Routes","buildFieldOptions","buildFieldLabelPrefixes","plugins","contentModelEditorContext","createContext","undefined","contentModelEditorReducer","prev","action","data","type","hashModel","cleanupModelDataFields","fields","map","field","predefinedValues","enabled","values","label","value","selected","String","cleanupModelData","createDefaultState","modelId","isPristine","activeTabIndex","ContentModelEditorProvider","children","apolloClient","state","dispatch","goToRoute","showSnackbar","setPristine","flag","saveContentModel","modelData","response","mutate","mutation","variables","refetchQueries","query","updateContentModel","error","setActiveTabIndex","setData","setter","saveModel","existingHash","newHash","getContentModel","Error","message","catch","ContentModels","List","layoutFieldPlugins","byType","fieldOptions","model","prefixes","layout","contentModel","Provider","createElement"],"sources":["ContentModelEditorProvider.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useReducer } from \"react\";\nimport get from \"lodash/get.js\";\nimport pick from \"lodash/pick.js\";\nimport type { ApolloClient } from \"apollo-client\";\nimport { useSnackbar, useRouter } from \"@webiny/app-admin\";\nimport type {\n GetCmsModelQueryResponse,\n GetCmsModelQueryVariables,\n UpdateCmsModelMutationResponse,\n UpdateCmsModelMutationVariables\n} from \"~/admin/graphql/contentModels.js\";\nimport { GET_CONTENT_MODEL, UPDATE_CONTENT_MODEL } from \"~/admin/graphql/contentModels.js\";\nimport { LIST_MENU_CONTENT_GROUPS_MODELS } from \"~/admin/viewsGraphql.js\";\nimport type { CmsModel, CmsModelField } from \"~/types.js\";\nimport type { CmsLayoutFieldTypePlugin } from \"@webiny/app-headless-cms-common/types/index.js\";\nimport type { FetchResult } from \"apollo-link\";\nimport { ModelProvider } from \"~/admin/components/ModelProvider/index.js\";\nimport { createHashing } from \"@webiny/app/utils/index.js\";\nimport { Routes } from \"~/routes.js\";\nimport type { FieldOption } from \"@webiny/app-headless-cms-common/Fields/fieldOptions.js\";\nimport {\n buildFieldOptions,\n buildFieldLabelPrefixes\n} from \"@webiny/app-headless-cms-common/Fields/fieldOptions.js\";\nimport { plugins } from \"@webiny/plugins\";\n\nexport interface ContentModelEditorProviderContext {\n apolloClient: ApolloClient<any>;\n data: CmsModel;\n contentModel: CmsModel;\n isPristine: boolean;\n getContentModel: (modelId: string) => Promise<FetchResult<GetCmsModelQueryResponse>>;\n saveContentModel: (\n data?: CmsModel\n ) => Promise<UpdateCmsModelMutationResponse[\"updateContentModel\"]>;\n setData: (setter: (model: CmsModel) => void, saveContentModel?: boolean) => Promise<any>;\n activeTabIndex: number;\n setActiveTabIndex: (index: number) => void;\n fieldOptions: FieldOption[];\n}\n\nexport const contentModelEditorContext = React.createContext<\n ContentModelEditorProviderContext | undefined\n>(undefined);\n\ntype PickedCmsModel = Pick<\n CmsModel,\n \"layout\" | \"fields\" | \"name\" | \"settings\" | \"description\" | \"titleFieldId\" | \"group\"\n>;\ninterface State {\n modelId: string | null;\n isPristine: boolean;\n data: CmsModel;\n activeTabIndex: number;\n}\ninterface Action {\n data: Partial<State> | Partial<CmsModel>;\n type: \"state\" | \"data\";\n}\ninterface Reducer {\n (prev: State, action: Action): State;\n}\nexport const contentModelEditorReducer: Reducer = (prev: State, action: Action): State => {\n const { data, type } = action;\n switch (type) {\n case \"state\":\n return { ...prev, ...data };\n\n case \"data\":\n return { ...prev, data: data as CmsModel };\n default:\n return prev;\n }\n};\n\nconst hashModel = createHashing(\"SHA-256\");\n\n/**\n * Cleanup is required because backend always expects string value in predefined values entries\n */\nconst cleanupModelDataFields = (fields: CmsModelField[]): CmsModelField[] => {\n return fields.map(field => {\n const { predefinedValues } = field;\n const { enabled = false, values = [] } = predefinedValues || {};\n return {\n ...field,\n predefinedValues: {\n enabled,\n values: values.map(({ label, value, selected }) => {\n return {\n label,\n selected: selected || false,\n value: String(value)\n };\n })\n }\n };\n });\n};\n\nconst cleanupModelData = (data: PickedCmsModel): PickedCmsModel => {\n return {\n ...data,\n fields: cleanupModelDataFields(data.fields)\n };\n};\n\ninterface ContentModelEditorProviderProps {\n apolloClient: ApolloClient<any>;\n modelId?: string;\n children: React.ReactElement;\n}\n\nconst createDefaultState = (modelId?: string): State => {\n return {\n modelId: modelId || null,\n isPristine: true,\n data: null as unknown as CmsModel,\n activeTabIndex: 0\n };\n};\n\nexport const ContentModelEditorProvider = ({\n children,\n apolloClient,\n modelId\n}: ContentModelEditorProviderProps) => {\n const [state, dispatch] = useReducer(contentModelEditorReducer, createDefaultState(modelId));\n\n const { goToRoute } = useRouter();\n const { showSnackbar } = useSnackbar();\n\n const setPristine = (flag: boolean): void => {\n dispatch({ type: \"state\", data: { isPristine: flag } });\n };\n\n const saveContentModel = async (\n data?: CmsModel\n ): Promise<UpdateCmsModelMutationResponse[\"updateContentModel\"]> => {\n if (!data) {\n data = state.data;\n }\n const modelData: PickedCmsModel = pick(data, [\n \"group\",\n \"layout\",\n \"fields\",\n \"tags\",\n \"name\",\n \"settings\",\n \"description\",\n \"titleFieldId\",\n \"descriptionFieldId\",\n \"imageFieldId\",\n \"icon\"\n ]);\n const response = await apolloClient.mutate<\n UpdateCmsModelMutationResponse,\n UpdateCmsModelMutationVariables\n >({\n mutation: UPDATE_CONTENT_MODEL,\n variables: {\n modelId: data.modelId,\n data: cleanupModelData(modelData)\n },\n refetchQueries: [\n {\n query: LIST_MENU_CONTENT_GROUPS_MODELS\n }\n ]\n });\n\n setPristine(true);\n\n if (!response.data || !response.data.updateContentModel) {\n return {\n data: null,\n error: null\n };\n }\n\n return response.data.updateContentModel;\n };\n\n const setActiveTabIndex = useCallback((activeTabIndex: number) => {\n dispatch({ type: \"state\", data: { activeTabIndex } });\n }, []);\n\n /**\n * Set form data by providing a callback, which receives a fresh copy of data on which you can work on.\n * Return new data once finished.\n */\n const setData = async (setter: (value: any) => any, saveModel = false): Promise<void> => {\n const data = setter(state.data);\n const existingHash = await hashModel(state.data);\n const newHash = await hashModel(data);\n if (existingHash === newHash) {\n return;\n }\n setPristine(false);\n dispatch({ type: \"data\", data });\n if (!saveModel) {\n return;\n }\n await saveContentModel(data);\n };\n\n const getContentModel = async (\n modelId: string\n ): Promise<FetchResult<GetCmsModelQueryResponse>> => {\n const response = await apolloClient.query<\n GetCmsModelQueryResponse,\n GetCmsModelQueryVariables\n >({\n query: GET_CONTENT_MODEL,\n variables: {\n modelId\n }\n });\n\n const { data, error } = get(response, \"data.getContentModel\");\n if (error) {\n throw new Error(error.message);\n }\n\n await setData(() => data, false);\n\n setPristine(true);\n return response;\n };\n\n useEffect(() => {\n if (!modelId) {\n return;\n }\n getContentModel(modelId).catch(() => {\n goToRoute(Routes.ContentModels.List);\n showSnackbar(`Could not load content model with given ID.`);\n });\n }, [modelId]);\n\n const layoutFieldPlugins = plugins.byType<CmsLayoutFieldTypePlugin>(\n \"cms-editor-layout-field-type\"\n );\n\n const fieldOptions = useMemo(() => {\n const model = state.data;\n if (!model) {\n return [];\n }\n const prefixes = model.layout\n ? buildFieldLabelPrefixes(model.layout, layoutFieldPlugins)\n : undefined;\n return buildFieldOptions(model.fields ?? [], \"\", \"\", prefixes, layoutFieldPlugins);\n }, [state.data?.fields, state.data?.layout]);\n\n const value = useMemo<ContentModelEditorProviderContext>(\n () => ({\n // Keeping `data` for compatibility\n data: state.data,\n contentModel: state.data,\n modelId,\n apolloClient,\n dispatch,\n isPristine: state.isPristine,\n getContentModel,\n saveContentModel,\n setData,\n activeTabIndex: state.activeTabIndex,\n setActiveTabIndex,\n fieldOptions\n }),\n [state, apolloClient, fieldOptions]\n );\n\n const { Provider } = contentModelEditorContext;\n\n return (\n <Provider value={value}>\n <ModelProvider model={value.contentModel}>{children}</ModelProvider>\n </Provider>\n );\n};\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["React","useCallback","useEffect","useMemo","useReducer","get","pick","useSnackbar","useRouter","GET_CONTENT_MODEL","UPDATE_CONTENT_MODEL","LIST_MENU_CONTENT_GROUPS_MODELS","ModelProvider","createHashing","Routes","buildFieldOptions","buildFieldLabelPrefixes","plugins","contentModelEditorContext","createContext","undefined","contentModelEditorReducer","prev","action","data","type","hashModel","cleanupModelDataFields","fields","map","field","predefinedValues","enabled","values","label","value","selected","String","cleanupModelData","createDefaultState","modelId","isPristine","activeTabIndex","ContentModelEditorProvider","children","apolloClient","state","dispatch","goToRoute","showSnackbar","setPristine","flag","saveContentModel","modelData","response","mutate","mutation","variables","refetchQueries","query","updateContentModel","error","setActiveTabIndex","setData","setter","saveModel","existingHash","newHash","getContentModel","Error","message","catch","ContentModels","List","layoutFieldPlugins","byType","fieldOptions","model","prefixes","layout","contentModel","Provider","createElement"],"sources":["ContentModelEditorProvider.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useReducer } from \"react\";\nimport get from \"lodash/get.js\";\nimport pick from \"lodash/pick.js\";\nimport type { ApolloClient } from \"apollo-client\";\nimport { useSnackbar, useRouter } from \"@webiny/app-admin\";\nimport type {\n GetCmsModelQueryResponse,\n GetCmsModelQueryVariables,\n UpdateCmsModelMutationResponse,\n UpdateCmsModelMutationVariables\n} from \"~/admin/graphql/contentModels.js\";\nimport { GET_CONTENT_MODEL, UPDATE_CONTENT_MODEL } from \"~/admin/graphql/contentModels.js\";\nimport { LIST_MENU_CONTENT_GROUPS_MODELS } from \"~/admin/viewsGraphql.js\";\nimport type { CmsModel, CmsModelField } from \"~/types.js\";\nimport type { CmsModelLayoutFieldTypePlugin } from \"@webiny/app-headless-cms-common/types/index.js\";\nimport type { FetchResult } from \"apollo-link\";\nimport { ModelProvider } from \"~/admin/components/ModelProvider/index.js\";\nimport { createHashing } from \"@webiny/app/utils/index.js\";\nimport { Routes } from \"~/routes.js\";\nimport type { FieldOption } from \"@webiny/app-headless-cms-common/Fields/fieldOptions.js\";\nimport {\n buildFieldOptions,\n buildFieldLabelPrefixes\n} from \"@webiny/app-headless-cms-common/Fields/fieldOptions.js\";\nimport { plugins } from \"@webiny/plugins\";\n\nexport interface ContentModelEditorProviderContext {\n apolloClient: ApolloClient<any>;\n data: CmsModel;\n contentModel: CmsModel;\n isPristine: boolean;\n getContentModel: (modelId: string) => Promise<FetchResult<GetCmsModelQueryResponse>>;\n saveContentModel: (\n data?: CmsModel\n ) => Promise<UpdateCmsModelMutationResponse[\"updateContentModel\"]>;\n setData: (setter: (model: CmsModel) => void, saveContentModel?: boolean) => Promise<any>;\n activeTabIndex: number;\n setActiveTabIndex: (index: number) => void;\n fieldOptions: FieldOption[];\n}\n\nexport const contentModelEditorContext = React.createContext<\n ContentModelEditorProviderContext | undefined\n>(undefined);\n\ntype PickedCmsModel = Pick<\n CmsModel,\n \"layout\" | \"fields\" | \"name\" | \"settings\" | \"description\" | \"titleFieldId\" | \"group\"\n>;\ninterface State {\n modelId: string | null;\n isPristine: boolean;\n data: CmsModel;\n activeTabIndex: number;\n}\ninterface Action {\n data: Partial<State> | Partial<CmsModel>;\n type: \"state\" | \"data\";\n}\ninterface Reducer {\n (prev: State, action: Action): State;\n}\nexport const contentModelEditorReducer: Reducer = (prev: State, action: Action): State => {\n const { data, type } = action;\n switch (type) {\n case \"state\":\n return { ...prev, ...data };\n\n case \"data\":\n return { ...prev, data: data as CmsModel };\n default:\n return prev;\n }\n};\n\nconst hashModel = createHashing(\"SHA-256\");\n\n/**\n * Cleanup is required because backend always expects string value in predefined values entries\n */\nconst cleanupModelDataFields = (fields: CmsModelField[]): CmsModelField[] => {\n return fields.map(field => {\n const { predefinedValues } = field;\n const { enabled = false, values = [] } = predefinedValues || {};\n return {\n ...field,\n predefinedValues: {\n enabled,\n values: values.map(({ label, value, selected }) => {\n return {\n label,\n selected: selected || false,\n value: String(value)\n };\n })\n }\n };\n });\n};\n\nconst cleanupModelData = (data: PickedCmsModel): PickedCmsModel => {\n return {\n ...data,\n fields: cleanupModelDataFields(data.fields)\n };\n};\n\ninterface ContentModelEditorProviderProps {\n apolloClient: ApolloClient<any>;\n modelId?: string;\n children: React.ReactElement;\n}\n\nconst createDefaultState = (modelId?: string): State => {\n return {\n modelId: modelId || null,\n isPristine: true,\n data: null as unknown as CmsModel,\n activeTabIndex: 0\n };\n};\n\nexport const ContentModelEditorProvider = ({\n children,\n apolloClient,\n modelId\n}: ContentModelEditorProviderProps) => {\n const [state, dispatch] = useReducer(contentModelEditorReducer, createDefaultState(modelId));\n\n const { goToRoute } = useRouter();\n const { showSnackbar } = useSnackbar();\n\n const setPristine = (flag: boolean): void => {\n dispatch({ type: \"state\", data: { isPristine: flag } });\n };\n\n const saveContentModel = async (\n data?: CmsModel\n ): Promise<UpdateCmsModelMutationResponse[\"updateContentModel\"]> => {\n if (!data) {\n data = state.data;\n }\n const modelData: PickedCmsModel = pick(data, [\n \"group\",\n \"layout\",\n \"fields\",\n \"tags\",\n \"name\",\n \"settings\",\n \"description\",\n \"titleFieldId\",\n \"descriptionFieldId\",\n \"imageFieldId\",\n \"icon\"\n ]);\n const response = await apolloClient.mutate<\n UpdateCmsModelMutationResponse,\n UpdateCmsModelMutationVariables\n >({\n mutation: UPDATE_CONTENT_MODEL,\n variables: {\n modelId: data.modelId,\n data: cleanupModelData(modelData)\n },\n refetchQueries: [\n {\n query: LIST_MENU_CONTENT_GROUPS_MODELS\n }\n ]\n });\n\n setPristine(true);\n\n if (!response.data || !response.data.updateContentModel) {\n return {\n data: null,\n error: null\n };\n }\n\n return response.data.updateContentModel;\n };\n\n const setActiveTabIndex = useCallback((activeTabIndex: number) => {\n dispatch({ type: \"state\", data: { activeTabIndex } });\n }, []);\n\n /**\n * Set form data by providing a callback, which receives a fresh copy of data on which you can work on.\n * Return new data once finished.\n */\n const setData = async (setter: (value: any) => any, saveModel = false): Promise<void> => {\n const data = setter(state.data);\n const existingHash = await hashModel(state.data);\n const newHash = await hashModel(data);\n if (existingHash === newHash) {\n return;\n }\n setPristine(false);\n dispatch({ type: \"data\", data });\n if (!saveModel) {\n return;\n }\n await saveContentModel(data);\n };\n\n const getContentModel = async (\n modelId: string\n ): Promise<FetchResult<GetCmsModelQueryResponse>> => {\n const response = await apolloClient.query<\n GetCmsModelQueryResponse,\n GetCmsModelQueryVariables\n >({\n query: GET_CONTENT_MODEL,\n variables: {\n modelId\n }\n });\n\n const { data, error } = get(response, \"data.getContentModel\");\n if (error) {\n throw new Error(error.message);\n }\n\n await setData(() => data, false);\n\n setPristine(true);\n return response;\n };\n\n useEffect(() => {\n if (!modelId) {\n return;\n }\n getContentModel(modelId).catch(() => {\n goToRoute(Routes.ContentModels.List);\n showSnackbar(`Could not load content model with given ID.`);\n });\n }, [modelId]);\n\n const layoutFieldPlugins = plugins.byType<CmsModelLayoutFieldTypePlugin>(\n \"cms-editor-layout-field-type\"\n );\n\n const fieldOptions = useMemo(() => {\n const model = state.data;\n if (!model) {\n return [];\n }\n const prefixes = model.layout\n ? buildFieldLabelPrefixes(model.layout, layoutFieldPlugins)\n : undefined;\n return buildFieldOptions(model.fields ?? [], \"\", \"\", prefixes, layoutFieldPlugins);\n }, [state.data?.fields, state.data?.layout]);\n\n const value = useMemo<ContentModelEditorProviderContext>(\n () => ({\n // Keeping `data` for compatibility\n data: state.data,\n contentModel: state.data,\n modelId,\n apolloClient,\n dispatch,\n isPristine: state.isPristine,\n getContentModel,\n saveContentModel,\n setData,\n activeTabIndex: state.activeTabIndex,\n setActiveTabIndex,\n fieldOptions\n }),\n [state, apolloClient, fieldOptions]\n );\n\n const { Provider } = contentModelEditorContext;\n\n return (\n <Provider value={value}>\n <ModelProvider model={value.contentModel}>{children}</ModelProvider>\n </Provider>\n );\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","plugins","Draggable","Heading","Icon","Text","Field","props","onFieldDragStart","fieldType","type","label","icon","description","createElement","beginDrag","drag","ref","onDragStart","className","size","color","level","LayoutFieldItem","layoutField","layoutFieldType","FieldsSidebar","fieldTypePlugin","byType","filter","p","field","hideInAdmin","layoutFieldPlugins","Fragment","as","map","fieldPlugin","key","length","lp"],"sources":["FieldsSidebar.tsx"],"sourcesContent":["import type { DragEventHandler } from \"react\";\nimport React from \"react\";\nimport { plugins } from \"@webiny/plugins\";\nimport Draggable from \"../Draggable.js\";\nimport type { CmsModelFieldTypePlugin,
|
|
1
|
+
{"version":3,"names":["React","plugins","Draggable","Heading","Icon","Text","Field","props","onFieldDragStart","fieldType","type","label","icon","description","createElement","beginDrag","drag","ref","onDragStart","className","size","color","level","LayoutFieldItem","layoutField","layoutFieldType","FieldsSidebar","fieldTypePlugin","byType","filter","p","field","hideInAdmin","layoutFieldPlugins","Fragment","as","map","fieldPlugin","key","length","lp"],"sources":["FieldsSidebar.tsx"],"sourcesContent":["import type { DragEventHandler } from \"react\";\nimport React from \"react\";\nimport { plugins } from \"@webiny/plugins\";\nimport Draggable from \"../Draggable.js\";\nimport type { CmsModelFieldTypePlugin, CmsModelLayoutFieldTypePlugin } from \"~/types.js\";\nimport { Heading, Icon, Text } from \"@webiny/admin-ui\";\n\ninterface FieldProps {\n onFieldDragStart: DragEventHandler;\n fieldType: CmsModelFieldTypePlugin[\"field\"];\n}\n\nconst Field = (props: FieldProps) => {\n const {\n onFieldDragStart,\n fieldType: { type, label, icon, description }\n } = props;\n return (\n <Draggable beginDrag={{ type: \"newField\", fieldType: type }}>\n {({ drag }) => (\n <div\n ref={drag}\n data-testid={`cms-editor-fields-field-${type}`}\n onDragStart={onFieldDragStart}\n className={\n \"bg-neutral-base rounded-sm mb-sm py-sm px-md cursor-grab last-of-type:mb-none hover:opacity-80 transition-opacity\"\n }\n >\n <div className={\"flex items-center gap-md\"}>\n <div>\n <Icon\n icon={icon as React.ReactElement}\n label={label}\n size={\"md\"}\n color={\"neutral-light\"}\n />\n </div>\n <div>\n <Heading level={6}>{label}</Heading>\n <Text size={\"sm\"} className={\"text-neutral-strong\"}>\n {description}\n </Text>\n </div>\n </div>\n </div>\n )}\n </Draggable>\n );\n};\n\ninterface LayoutFieldItemProps {\n onFieldDragStart: DragEventHandler;\n layoutField: CmsModelLayoutFieldTypePlugin[\"field\"];\n}\n\nconst LayoutFieldItem = (props: LayoutFieldItemProps) => {\n const {\n onFieldDragStart,\n layoutField: { type, label, icon, description }\n } = props;\n return (\n <Draggable beginDrag={{ type: \"newLayoutField\", layoutFieldType: type }}>\n {({ drag }) => (\n <div\n ref={drag}\n data-testid={`cms-editor-fields-layout-field-${type}`}\n onDragStart={onFieldDragStart}\n className={\n \"bg-neutral-base rounded-sm mb-sm py-sm px-md cursor-grab last-of-type:mb-none hover:opacity-80 transition-opacity\"\n }\n >\n <div className={\"flex items-center gap-md\"}>\n <div>\n <Icon icon={icon} label={label} size={\"md\"} color={\"neutral-light\"} />\n </div>\n <div>\n <Heading level={6}>{label}</Heading>\n <Text size={\"sm\"} className={\"text-neutral-strong\"}>\n {description}\n </Text>\n </div>\n </div>\n </div>\n )}\n </Draggable>\n );\n};\n\ninterface FieldsSidebarProps {\n onFieldDragStart: DragEventHandler;\n}\n\nexport const FieldsSidebar = ({ onFieldDragStart }: FieldsSidebarProps) => {\n const fieldTypePlugin = plugins\n .byType<CmsModelFieldTypePlugin>(\"cms-editor-field-type\")\n .filter(p => !p.field.hideInAdmin);\n\n const layoutFieldPlugins = plugins.byType<CmsModelLayoutFieldTypePlugin>(\n \"cms-editor-layout-field-type\"\n );\n\n return (\n <>\n <Text\n as=\"div\"\n size={\"md\"}\n className={\"text-neutral-strong uppercase mt-0 mb-md font-semibold\"}\n >\n Fields\n </Text>\n {fieldTypePlugin.map(fieldPlugin => (\n <Field\n key={fieldPlugin.field.type}\n fieldType={fieldPlugin.field}\n onFieldDragStart={onFieldDragStart}\n />\n ))}\n {layoutFieldPlugins.length > 0 && (\n <>\n <Text\n as=\"div\"\n size={\"md\"}\n className={\"text-neutral-strong uppercase my-md font-semibold\"}\n >\n Layout\n </Text>\n {layoutFieldPlugins.map(lp => (\n <LayoutFieldItem\n key={lp.field.type}\n layoutField={lp.field}\n onFieldDragStart={onFieldDragStart}\n />\n ))}\n </>\n )}\n </>\n );\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { CmsModelField,
|
|
1
|
+
import type { CmsModelField, CmsModelFieldTypePlugin, CmsModelFieldValidatorPlugin } from "../../../../types.js";
|
|
2
2
|
import { CmsModelFieldValidatorConfigAdapter } from "../../../../utils/CmsModelFieldValidatorConfigAdapter.js";
|
|
3
3
|
export interface Validator {
|
|
4
4
|
optional: boolean;
|
|
@@ -9,5 +9,5 @@ export interface ValidationSection {
|
|
|
9
9
|
description?: string;
|
|
10
10
|
validators: CmsModelFieldValidatorConfigAdapter[];
|
|
11
11
|
}
|
|
12
|
-
export declare const getListValidators: (field: CmsModelField, fieldPlugin:
|
|
13
|
-
export declare const getFieldValidators: (field: CmsModelField, fieldPlugin:
|
|
12
|
+
export declare const getListValidators: (field: CmsModelField, fieldPlugin: CmsModelFieldTypePlugin) => ValidationSection;
|
|
13
|
+
export declare const getFieldValidators: (field: CmsModelField, fieldPlugin: CmsModelFieldTypePlugin) => ValidationSection;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["plugins","CmsModelFieldValidatorConfigAdapter","isValidatorDefinition","obj","Array","isArray","isValidatorDefinitionFactory","getValidatorPlugin","name","plugin","byType","find","validator","Error","getValidatorConfigs","field","validators","configs","resolvedValidator","push","getValidators","fieldPlugin","key","defaultValidators","title","description","fieldValidators","resolvedValidators","getListValidators","getFieldValidators"],"sources":["getValidators.ts"],"sourcesContent":["import { plugins } from \"@webiny/plugins\";\nimport type {\n CmsModelField,\n
|
|
1
|
+
{"version":3,"names":["plugins","CmsModelFieldValidatorConfigAdapter","isValidatorDefinition","obj","Array","isArray","isValidatorDefinitionFactory","getValidatorPlugin","name","plugin","byType","find","validator","Error","getValidatorConfigs","field","validators","configs","resolvedValidator","push","getValidators","fieldPlugin","key","defaultValidators","title","description","fieldValidators","resolvedValidators","getListValidators","getFieldValidators"],"sources":["getValidators.ts"],"sourcesContent":["import { plugins } from \"@webiny/plugins\";\nimport type {\n CmsModelField,\n CmsModelFieldTypePlugin,\n CmsModelFieldValidatorPlugin,\n CmsModelFieldValidatorsGroup,\n CmsModelFieldValidatorConfig,\n CmsModelFieldValidatorsFactory\n} from \"~/types.js\";\nimport { CmsModelFieldValidatorConfigAdapter } from \"~/utils/CmsModelFieldValidatorConfigAdapter.js\";\n\nexport interface Validator {\n optional: boolean;\n validator: CmsModelFieldValidatorPlugin[\"validator\"];\n}\n\nconst isValidatorDefinition = (obj: unknown): obj is CmsModelFieldValidatorsGroup => {\n return obj ? !Array.isArray(obj) : false;\n};\n\nconst isValidatorDefinitionFactory = (obj: unknown): obj is CmsModelFieldValidatorsFactory => {\n return typeof obj === \"function\";\n};\n\ninterface GetValidatorsParams {\n field: CmsModelField;\n fieldPlugin: CmsModelFieldTypePlugin;\n key: \"validators\" | \"listValidators\";\n defaultValidators: string[];\n}\n\nexport interface ValidationSection {\n title?: string;\n description?: string;\n validators: CmsModelFieldValidatorConfigAdapter[];\n}\n\nconst getValidatorPlugin = (name: string) => {\n const plugin = plugins\n .byType<CmsModelFieldValidatorPlugin>(\"cms-model-field-validator\")\n .find(plugin => plugin.validator.name === name);\n\n if (!plugin) {\n throw new Error(`Missing CMS field validator plugin \"${name}\"!`);\n }\n\n return plugin.validator as CmsModelFieldValidatorConfig;\n};\n\nconst getValidatorConfigs = (\n field: CmsModelField,\n validators: Array<CmsModelFieldValidatorConfig | string>\n) => {\n const configs: CmsModelFieldValidatorConfigAdapter[] = [];\n\n for (const validator of validators) {\n let resolvedValidator;\n if (typeof validator === \"string\") {\n resolvedValidator = getValidatorPlugin(validator);\n } else {\n resolvedValidator = validator;\n }\n\n configs.push(new CmsModelFieldValidatorConfigAdapter(field, resolvedValidator));\n }\n\n return configs;\n};\n\nconst getValidators = ({\n field,\n fieldPlugin,\n key,\n defaultValidators\n}: GetValidatorsParams): ValidationSection => {\n let title = \"\";\n let description = \"\";\n let fieldValidators = fieldPlugin.field[key];\n\n if (isValidatorDefinitionFactory(fieldValidators)) {\n fieldValidators = fieldValidators(field);\n }\n\n let resolvedValidators: (string | CmsModelFieldValidatorConfig)[] | undefined;\n if (isValidatorDefinition(fieldValidators)) {\n title = fieldValidators.title || \"\";\n description = fieldValidators.description || \"\";\n resolvedValidators = fieldValidators.validators;\n } else {\n resolvedValidators = fieldValidators;\n }\n\n const validators = getValidatorConfigs(field, resolvedValidators || defaultValidators);\n\n return {\n title,\n description,\n validators\n };\n};\n\nexport const getListValidators = (field: CmsModelField, fieldPlugin: CmsModelFieldTypePlugin) => {\n return getValidators({\n field,\n fieldPlugin,\n key: \"listValidators\",\n defaultValidators: [\"minLength\", \"maxLength\"]\n });\n};\n\nexport const getFieldValidators = (field: CmsModelField, fieldPlugin: CmsModelFieldTypePlugin) => {\n return getValidators({\n field,\n fieldPlugin,\n key: \"validators\",\n defaultValidators: []\n });\n};\n"],"mappings":"AAAA,SAASA,OAAO,QAAQ,iBAAiB;AASzC,SAASC,mCAAmC;AAO5C,MAAMC,qBAAqB,GAAIC,GAAY,IAA0C;EACjF,OAAOA,GAAG,GAAG,CAACC,KAAK,CAACC,OAAO,CAACF,GAAG,CAAC,GAAG,KAAK;AAC5C,CAAC;AAED,MAAMG,4BAA4B,GAAIH,GAAY,IAA4C;EAC1F,OAAO,OAAOA,GAAG,KAAK,UAAU;AACpC,CAAC;AAeD,MAAMI,kBAAkB,GAAIC,IAAY,IAAK;EACzC,MAAMC,MAAM,GAAGT,OAAO,CACjBU,MAAM,CAA+B,2BAA2B,CAAC,CACjEC,IAAI,CAACF,MAAM,IAAIA,MAAM,CAACG,SAAS,CAACJ,IAAI,KAAKA,IAAI,CAAC;EAEnD,IAAI,CAACC,MAAM,EAAE;IACT,MAAM,IAAII,KAAK,CAAC,uCAAuCL,IAAI,IAAI,CAAC;EACpE;EAEA,OAAOC,MAAM,CAACG,SAAS;AAC3B,CAAC;AAED,MAAME,mBAAmB,GAAGA,CACxBC,KAAoB,EACpBC,UAAwD,KACvD;EACD,MAAMC,OAA8C,GAAG,EAAE;EAEzD,KAAK,MAAML,SAAS,IAAII,UAAU,EAAE;IAChC,IAAIE,iBAAiB;IACrB,IAAI,OAAON,SAAS,KAAK,QAAQ,EAAE;MAC/BM,iBAAiB,GAAGX,kBAAkB,CAACK,SAAS,CAAC;IACrD,CAAC,MAAM;MACHM,iBAAiB,GAAGN,SAAS;IACjC;IAEAK,OAAO,CAACE,IAAI,CAAC,IAAIlB,mCAAmC,CAACc,KAAK,EAAEG,iBAAiB,CAAC,CAAC;EACnF;EAEA,OAAOD,OAAO;AAClB,CAAC;AAED,MAAMG,aAAa,GAAGA,CAAC;EACnBL,KAAK;EACLM,WAAW;EACXC,GAAG;EACHC;AACiB,CAAC,KAAwB;EAC1C,IAAIC,KAAK,GAAG,EAAE;EACd,IAAIC,WAAW,GAAG,EAAE;EACpB,IAAIC,eAAe,GAAGL,WAAW,CAACN,KAAK,CAACO,GAAG,CAAC;EAE5C,IAAIhB,4BAA4B,CAACoB,eAAe,CAAC,EAAE;IAC/CA,eAAe,GAAGA,eAAe,CAACX,KAAK,CAAC;EAC5C;EAEA,IAAIY,kBAAyE;EAC7E,IAAIzB,qBAAqB,CAACwB,eAAe,CAAC,EAAE;IACxCF,KAAK,GAAGE,eAAe,CAACF,KAAK,IAAI,EAAE;IACnCC,WAAW,GAAGC,eAAe,CAACD,WAAW,IAAI,EAAE;IAC/CE,kBAAkB,GAAGD,eAAe,CAACV,UAAU;EACnD,CAAC,MAAM;IACHW,kBAAkB,GAAGD,eAAe;EACxC;EAEA,MAAMV,UAAU,GAAGF,mBAAmB,CAACC,KAAK,EAAEY,kBAAkB,IAAIJ,iBAAiB,CAAC;EAEtF,OAAO;IACHC,KAAK;IACLC,WAAW;IACXT;EACJ,CAAC;AACL,CAAC;AAED,OAAO,MAAMY,iBAAiB,GAAGA,CAACb,KAAoB,EAAEM,WAAoC,KAAK;EAC7F,OAAOD,aAAa,CAAC;IACjBL,KAAK;IACLM,WAAW;IACXC,GAAG,EAAE,gBAAgB;IACrBC,iBAAiB,EAAE,CAAC,WAAW,EAAE,WAAW;EAChD,CAAC,CAAC;AACN,CAAC;AAED,OAAO,MAAMM,kBAAkB,GAAGA,CAACd,KAAoB,EAAEM,WAAoC,KAAK;EAC9F,OAAOD,aAAa,CAAC;IACjBL,KAAK;IACLM,WAAW;IACXC,GAAG,EAAE,YAAY;IACjBC,iBAAiB,EAAE;EACvB,CAAC,CAAC;AACN,CAAC","ignoreList":[]}
|
|
@@ -9,7 +9,7 @@ import Field from "./Field.js";
|
|
|
9
9
|
import { LayoutCell } from "./LayoutCell.js";
|
|
10
10
|
import { useModelFieldEditor } from "./useModelFieldEditor.js";
|
|
11
11
|
import { FieldEditorProvider } from "./FieldEditorContext.js";
|
|
12
|
-
import {
|
|
12
|
+
import { isLayoutField } from "@webiny/app-headless-cms-common/types/model.js";
|
|
13
13
|
import { ModelFieldProvider } from "../ModelFieldProvider/index.js";
|
|
14
14
|
import { cn, Icon } from "@webiny/admin-ui";
|
|
15
15
|
const t = i18n.namespace("app-headless-cms/admin/components/editor");
|
|
@@ -37,13 +37,13 @@ const Editor = () => {
|
|
|
37
37
|
* Collect all data fields referenced inside a layout descriptor (e.g. fields inside tabs).
|
|
38
38
|
* Delegates to the layout field plugin's `collectFields` method if available.
|
|
39
39
|
*/
|
|
40
|
-
const
|
|
41
|
-
const plugin = getLayoutFieldPlugin(
|
|
40
|
+
const collectLayoutFieldFields = layoutField => {
|
|
41
|
+
const plugin = getLayoutFieldPlugin(layoutField.type);
|
|
42
42
|
if (!plugin?.field.collectFields) {
|
|
43
43
|
return [];
|
|
44
44
|
}
|
|
45
45
|
return plugin.field.collectFields({
|
|
46
|
-
|
|
46
|
+
field: layoutField,
|
|
47
47
|
getField: id => getField({
|
|
48
48
|
id
|
|
49
49
|
})
|
|
@@ -101,12 +101,12 @@ const Editor = () => {
|
|
|
101
101
|
})
|
|
102
102
|
}, t`Drop your first field here`), fields.map((row, index) => {
|
|
103
103
|
// Build a stable key for the row
|
|
104
|
-
const rowKey = row.map(cell =>
|
|
104
|
+
const rowKey = row.map(cell => isLayoutField(cell) ? cell.id : cell.fieldId).join(".");
|
|
105
105
|
return /*#__PURE__*/React.createElement(Draggable, {
|
|
106
106
|
beginDrag: {
|
|
107
107
|
parent: parent ? parent.fieldId : null,
|
|
108
108
|
type: "row",
|
|
109
|
-
fields: row.filter(cell => !
|
|
109
|
+
fields: row.filter(cell => !isLayoutField(cell)),
|
|
110
110
|
pos: {
|
|
111
111
|
row: index
|
|
112
112
|
}
|
|
@@ -137,14 +137,14 @@ const Editor = () => {
|
|
|
137
137
|
className: cn(["w-full flex justify-between", "pl-xl pr-sm py-sm"]),
|
|
138
138
|
"data-testid": "cms.editor.field-row"
|
|
139
139
|
}, row.map((cell, fieldIndex) => {
|
|
140
|
-
if (
|
|
140
|
+
if (isLayoutField(cell)) {
|
|
141
141
|
return /*#__PURE__*/React.createElement(Draggable, {
|
|
142
142
|
key: cell.id,
|
|
143
143
|
beginDrag: {
|
|
144
144
|
parent: parent ? parent.fieldId : null,
|
|
145
145
|
type: "layoutField",
|
|
146
|
-
|
|
147
|
-
fields:
|
|
146
|
+
layoutField: cell,
|
|
147
|
+
fields: collectLayoutFieldFields(cell)
|
|
148
148
|
},
|
|
149
149
|
endDrag: onEndDrag
|
|
150
150
|
}, ({
|
|
@@ -155,7 +155,7 @@ const Editor = () => {
|
|
|
155
155
|
}, /*#__PURE__*/React.createElement("div", {
|
|
156
156
|
className: "cursor-grab bg-neutral-base p-md shadow-sm rounded-xs"
|
|
157
157
|
}, /*#__PURE__*/React.createElement(LayoutCell, {
|
|
158
|
-
|
|
158
|
+
field: cell,
|
|
159
159
|
rowIndex: index,
|
|
160
160
|
cellIndex: fieldIndex
|
|
161
161
|
}))));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","Fragment","get","i18n","ReactComponent","DragIcon","Center","Horizontal","Vertical","Draggable","EditFieldDialog","Field","LayoutCell","useModelFieldEditor","FieldEditorProvider","isLayoutDescriptor","ModelFieldProvider","cn","Icon","t","namespace","fieldTypes","Editor","parent","depth","insertField","updateField","deleteField","fields","noConflict","editField","onFieldDrop","onEndDrag","field","dropTarget","getFieldPlugin","getLayoutFieldPlugin","getField","collectDescriptorFields","descriptor","plugin","type","collectFields","id","canDropIntoField","draggable","fieldPlugin","canAccept","isVerticalDropzoneVisible","cb","item","allowLayout","isHorizontalDropzoneVisible","createElement","length","isDroppable","onDrop","row","index","map","rowKey","cell","fieldId","join","beginDrag","filter","pos","endDrag","key","drag","isDragging","className","ref","icon","label","color","size","isVisible","fieldIndex","rowIndex","cellIndex","includes","onEdit","onDelete","last","onClose","onSubmit","position","FieldEditor","props"],"sources":["FieldEditor.tsx"],"sourcesContent":["import React, { Fragment } from \"react\";\nimport get from \"lodash/get.js\";\nimport { i18n } from \"@webiny/app/i18n/index.js\";\nimport { ReactComponent as DragIcon } from \"@webiny/icons/drag_indicator.svg\";\nimport { Center, Horizontal, Vertical } from \"../DropZone/index.js\";\nimport Draggable from \"../Draggable.js\";\nimport EditFieldDialog from \"./EditFieldDialog.js\";\nimport Field from \"./Field.js\";\nimport { LayoutCell } from \"./LayoutCell.js\";\nimport { useModelFieldEditor } from \"./useModelFieldEditor.js\";\nimport type { IsVisibleCallable } from \"./FieldEditorContext.js\";\nimport { FieldEditorProvider } from \"./FieldEditorContext.js\";\nimport type { CmsEditorFieldsLayout, CmsModelField, DragSource } from \"~/types.js\";\nimport type { CmsLayoutDescriptor } from \"@webiny/app-headless-cms-common/types/model.js\";\nimport { isLayoutDescriptor } from \"@webiny/app-headless-cms-common/types/model.js\";\nimport { ModelFieldProvider } from \"~/admin/components/ModelFieldProvider/index.js\";\nimport { cn, Icon } from \"@webiny/admin-ui\";\n\nconst t = i18n.namespace(\"app-headless-cms/admin/components/editor\");\n\nconst fieldTypes: string[] = [\"field\", \"newField\"];\n\nconst Editor = () => {\n const {\n parent,\n depth,\n insertField,\n updateField,\n deleteField,\n fields,\n noConflict,\n editField,\n onFieldDrop,\n onEndDrag,\n field,\n dropTarget,\n getFieldPlugin,\n getLayoutFieldPlugin,\n getField\n } = useModelFieldEditor();\n\n /**\n * Collect all data fields referenced inside a layout descriptor (e.g. fields inside tabs).\n * Delegates to the layout field plugin's `collectFields` method if available.\n */\n const collectDescriptorFields = (descriptor: CmsLayoutDescriptor): CmsModelField[] => {\n const plugin = getLayoutFieldPlugin(descriptor.type);\n if (!plugin?.field.collectFields) {\n return [];\n }\n return plugin.field.collectFields({\n descriptor,\n getField: (id: string) => getField({ id })\n });\n };\n\n const canDropIntoField = (field: CmsModelField, draggable: DragSource) => {\n const fieldPlugin = getFieldPlugin(field.type);\n if (!fieldPlugin) {\n return true;\n }\n const canAccept = fieldPlugin.field.canAccept;\n if (typeof canAccept === \"function\" && !canAccept(field, draggable)) {\n return false;\n }\n\n return true;\n };\n\n const isVerticalDropzoneVisible = (cb: IsVisibleCallable) => {\n return (item: DragSource) => {\n // Layout fields always occupy full row — no side-by-side layout\n if (item.type === \"newLayoutField\" || item.type === \"layoutField\") {\n return false;\n }\n\n if (!parent) {\n return cb(item);\n }\n\n const fieldPlugin = getFieldPlugin(parent.type);\n if (fieldPlugin) {\n const allowLayout = fieldPlugin.field.allowLayout ?? true;\n if (!allowLayout) {\n return false;\n }\n }\n\n if (!canDropIntoField(parent, item)) {\n return false;\n }\n\n return cb(item);\n };\n };\n\n const isHorizontalDropzoneVisible = (cb: IsVisibleCallable) => {\n return (item: DragSource) => {\n if (!parent) {\n return cb(item);\n }\n\n if (!canDropIntoField(parent, item)) {\n return false;\n }\n\n return cb(item);\n };\n };\n\n return (\n <Fragment>\n {fields.length === 0 && (\n <Center\n isDroppable={isHorizontalDropzoneVisible(() => true)}\n onDrop={item =>\n onFieldDrop(item, {\n row: 0,\n index: 0\n })\n }\n >\n {t`Drop your first field here`}\n </Center>\n )}\n\n {fields.map((row, index) => {\n // Build a stable key for the row\n const rowKey = row\n .map(cell =>\n isLayoutDescriptor(cell) ? cell.id : (cell as CmsModelField).fieldId\n )\n .join(\".\");\n\n return (\n <Draggable\n beginDrag={{\n parent: parent ? parent.fieldId : null,\n type: \"row\",\n fields: row.filter(\n cell => !isLayoutDescriptor(cell)\n ) as CmsModelField[],\n pos: { row: index }\n }}\n endDrag={onEndDrag}\n key={rowKey}\n >\n {(\n {\n drag,\n isDragging\n } /* RowContainer start - includes drag handle, drop zones and the Row itself. */\n ) => (\n <div\n className={cn([\n \"flex flex-column\",\n \"relative\",\n \"mb-md last-of-type:mb-none\",\n \"bg-neutral-dimmed\",\n isDragging ? \"opacity-30\" : \"opacity-100\"\n ])}\n >\n <div\n className={cn([\n \"cursor-grab\",\n \"absolute left-sm-plus top-sm-plus z-10\"\n ])}\n ref={drag}\n >\n <Icon\n icon={<DragIcon />}\n label={\"Drag to move this row\"}\n color={\"neutral-light\"}\n size={\"sm\"}\n />\n </div>\n <Horizontal\n isVisible={isHorizontalDropzoneVisible(noConflict())}\n data-testid={`cms-editor-row-droppable-top-${index}`}\n onDrop={item => onFieldDrop(item, { row: index, index: null })}\n />\n {/* Row start - includes field drop zones and fields */}\n <div\n className={cn([\n \"w-full flex justify-between\",\n \"pl-xl pr-sm py-sm\"\n ])}\n data-testid={\"cms.editor.field-row\"}\n >\n {row.map((cell, fieldIndex) => {\n if (isLayoutDescriptor(cell)) {\n return (\n <Draggable\n key={cell.id}\n beginDrag={{\n parent: parent ? parent.fieldId : null,\n type: \"layoutField\",\n descriptor: cell,\n fields: collectDescriptorFields(cell)\n }}\n endDrag={onEndDrag}\n >\n {({ drag }) => (\n <div\n ref={drag}\n className={cn([\n \"relative\",\n \"flex-1 basis-full\",\n \"mx-sm\"\n ])}\n >\n <div\n className={\n \"cursor-grab bg-neutral-base p-md shadow-sm rounded-xs\"\n }\n >\n <LayoutCell\n descriptor={cell}\n rowIndex={index}\n cellIndex={fieldIndex}\n />\n </div>\n </div>\n )}\n </Draggable>\n );\n }\n\n const field = cell as CmsModelField;\n return (\n <ModelFieldProvider field={field} key={field.fieldId}>\n <Draggable\n beginDrag={{\n parent: parent ? parent.fieldId : null,\n type: \"field\",\n field,\n pos: {\n row: index,\n index: fieldIndex\n }\n }}\n endDrag={onEndDrag}\n >\n {({ drag }) => (\n <div\n className={cn([\n \"relative\",\n \"flex-1 basis-full\",\n \"mx-sm\"\n ])}\n ref={drag}\n >\n <Vertical\n depth={depth}\n onDrop={item =>\n onFieldDrop(item, {\n row: index,\n index: fieldIndex\n })\n }\n isVisible={isVerticalDropzoneVisible(\n noConflict(\n item =>\n fieldTypes.includes(\n item.type\n ) &&\n (row.length < 4 ||\n get(\n item,\n \"pos.row\"\n ) === index)\n )\n )}\n />\n\n <div\n className={\n \"cursor-grab bg-neutral-base p-md shadow-sm rounded-xs\"\n }\n >\n <Field\n parent={parent}\n field={field}\n onEdit={editField}\n onDelete={deleteField}\n />\n </div>\n\n {/* Field end */}\n {fieldIndex === row.length - 1 && (\n <Vertical\n last\n depth={depth}\n isVisible={isVerticalDropzoneVisible(\n noConflict(item => {\n return (\n fieldTypes.includes(\n item.type\n ) &&\n (row.length < 4 ||\n get(\n item,\n \"pos.row\"\n ) === index)\n );\n })\n )}\n onDrop={item =>\n onFieldDrop(item, {\n row: index,\n index: fieldIndex + 1\n })\n }\n />\n )}\n </div>\n )}\n </Draggable>\n </ModelFieldProvider>\n );\n })}\n </div>\n {/* Row end */}\n {index === fields.length - 1 ? (\n <Horizontal\n data-testid={`cms-editor-row-droppable-bottom-${index}`}\n last\n isVisible={isHorizontalDropzoneVisible(noConflict())}\n onDrop={item =>\n onFieldDrop(item, {\n row: index + 1,\n index: null\n })\n }\n />\n ) : null}\n </div>\n )}\n </Draggable>\n );\n })}\n\n {field ? (\n <ModelFieldProvider field={field}>\n <EditFieldDialog\n onClose={() => editField(null)}\n onSubmit={field => {\n if (field.id) {\n updateField(field);\n editField(null);\n return;\n }\n insertField({ field, position: dropTarget });\n\n editField(null);\n }}\n />\n </ModelFieldProvider>\n ) : null}\n </Fragment>\n );\n};\n\nexport interface FieldEditorProps {\n parent?: CmsModelField;\n layout: CmsEditorFieldsLayout;\n fields: CmsModelField[];\n onChange: (params: { fields: CmsModelField[]; layout: CmsEditorFieldsLayout }) => void;\n}\n\nexport const FieldEditor = (props: FieldEditorProps) => {\n return (\n <FieldEditorProvider {...props}>\n <Editor />\n </FieldEditorProvider>\n );\n};\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,QAAQ,QAAQ,OAAO;AACvC,OAAOC,GAAG,MAAM,eAAe;AAC/B,SAASC,IAAI,QAAQ,2BAA2B;AAChD,SAASC,cAAc,IAAIC,QAAQ,QAAQ,kCAAkC;AAC7E,SAASC,MAAM,EAAEC,UAAU,EAAEC,QAAQ;AACrC,OAAOC,SAAS;AAChB,OAAOC,eAAe;AACtB,OAAOC,KAAK;AACZ,SAASC,UAAU;AACnB,SAASC,mBAAmB;AAE5B,SAASC,mBAAmB;AAG5B,SAASC,kBAAkB,QAAQ,gDAAgD;AACnF,SAASC,kBAAkB;AAC3B,SAASC,EAAE,EAAEC,IAAI,QAAQ,kBAAkB;AAE3C,MAAMC,CAAC,GAAGhB,IAAI,CAACiB,SAAS,CAAC,0CAA0C,CAAC;AAEpE,MAAMC,UAAoB,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC;AAElD,MAAMC,MAAM,GAAGA,CAAA,KAAM;EACjB,MAAM;IACFC,MAAM;IACNC,KAAK;IACLC,WAAW;IACXC,WAAW;IACXC,WAAW;IACXC,MAAM;IACNC,UAAU;IACVC,SAAS;IACTC,WAAW;IACXC,SAAS;IACTC,KAAK;IACLC,UAAU;IACVC,cAAc;IACdC,oBAAoB;IACpBC;EACJ,CAAC,GAAGxB,mBAAmB,CAAC,CAAC;;EAEzB;AACJ;AACA;AACA;EACI,MAAMyB,uBAAuB,GAAIC,UAA+B,IAAsB;IAClF,MAAMC,MAAM,GAAGJ,oBAAoB,CAACG,UAAU,CAACE,IAAI,CAAC;IACpD,IAAI,CAACD,MAAM,EAAEP,KAAK,CAACS,aAAa,EAAE;MAC9B,OAAO,EAAE;IACb;IACA,OAAOF,MAAM,CAACP,KAAK,CAACS,aAAa,CAAC;MAC9BH,UAAU;MACVF,QAAQ,EAAGM,EAAU,IAAKN,QAAQ,CAAC;QAAEM;MAAG,CAAC;IAC7C,CAAC,CAAC;EACN,CAAC;EAED,MAAMC,gBAAgB,GAAGA,CAACX,KAAoB,EAAEY,SAAqB,KAAK;IACtE,MAAMC,WAAW,GAAGX,cAAc,CAACF,KAAK,CAACQ,IAAI,CAAC;IAC9C,IAAI,CAACK,WAAW,EAAE;MACd,OAAO,IAAI;IACf;IACA,MAAMC,SAAS,GAAGD,WAAW,CAACb,KAAK,CAACc,SAAS;IAC7C,IAAI,OAAOA,SAAS,KAAK,UAAU,IAAI,CAACA,SAAS,CAACd,KAAK,EAAEY,SAAS,CAAC,EAAE;MACjE,OAAO,KAAK;IAChB;IAEA,OAAO,IAAI;EACf,CAAC;EAED,MAAMG,yBAAyB,GAAIC,EAAqB,IAAK;IACzD,OAAQC,IAAgB,IAAK;MACzB;MACA,IAAIA,IAAI,CAACT,IAAI,KAAK,gBAAgB,IAAIS,IAAI,CAACT,IAAI,KAAK,aAAa,EAAE;QAC/D,OAAO,KAAK;MAChB;MAEA,IAAI,CAAClB,MAAM,EAAE;QACT,OAAO0B,EAAE,CAACC,IAAI,CAAC;MACnB;MAEA,MAAMJ,WAAW,GAAGX,cAAc,CAACZ,MAAM,CAACkB,IAAI,CAAC;MAC/C,IAAIK,WAAW,EAAE;QACb,MAAMK,WAAW,GAAGL,WAAW,CAACb,KAAK,CAACkB,WAAW,IAAI,IAAI;QACzD,IAAI,CAACA,WAAW,EAAE;UACd,OAAO,KAAK;QAChB;MACJ;MAEA,IAAI,CAACP,gBAAgB,CAACrB,MAAM,EAAE2B,IAAI,CAAC,EAAE;QACjC,OAAO,KAAK;MAChB;MAEA,OAAOD,EAAE,CAACC,IAAI,CAAC;IACnB,CAAC;EACL,CAAC;EAED,MAAME,2BAA2B,GAAIH,EAAqB,IAAK;IAC3D,OAAQC,IAAgB,IAAK;MACzB,IAAI,CAAC3B,MAAM,EAAE;QACT,OAAO0B,EAAE,CAACC,IAAI,CAAC;MACnB;MAEA,IAAI,CAACN,gBAAgB,CAACrB,MAAM,EAAE2B,IAAI,CAAC,EAAE;QACjC,OAAO,KAAK;MAChB;MAEA,OAAOD,EAAE,CAACC,IAAI,CAAC;IACnB,CAAC;EACL,CAAC;EAED,oBACIlD,KAAA,CAAAqD,aAAA,CAACpD,QAAQ,QACJ2B,MAAM,CAAC0B,MAAM,KAAK,CAAC,iBAChBtD,KAAA,CAAAqD,aAAA,CAAC/C,MAAM;IACHiD,WAAW,EAAEH,2BAA2B,CAAC,MAAM,IAAI,CAAE;IACrDI,MAAM,EAAEN,IAAI,IACRnB,WAAW,CAACmB,IAAI,EAAE;MACdO,GAAG,EAAE,CAAC;MACNC,KAAK,EAAE;IACX,CAAC;EACJ,GAEAvC,CAAC,4BACE,CACX,EAEAS,MAAM,CAAC+B,GAAG,CAAC,CAACF,GAAG,EAAEC,KAAK,KAAK;IACxB;IACA,MAAME,MAAM,GAAGH,GAAG,CACbE,GAAG,CAACE,IAAI,IACL9C,kBAAkB,CAAC8C,IAAI,CAAC,GAAGA,IAAI,CAAClB,EAAE,GAAIkB,IAAI,CAAmBC,OACjE,CAAC,CACAC,IAAI,CAAC,GAAG,CAAC;IAEd,oBACI/D,KAAA,CAAAqD,aAAA,CAAC5C,SAAS;MACNuD,SAAS,EAAE;QACPzC,MAAM,EAAEA,MAAM,GAAGA,MAAM,CAACuC,OAAO,GAAG,IAAI;QACtCrB,IAAI,EAAE,KAAK;QACXb,MAAM,EAAE6B,GAAG,CAACQ,MAAM,CACdJ,IAAI,IAAI,CAAC9C,kBAAkB,CAAC8C,IAAI,CACpC,CAAoB;QACpBK,GAAG,EAAE;UAAET,GAAG,EAAEC;QAAM;MACtB,CAAE;MACFS,OAAO,EAAEnC,SAAU;MACnBoC,GAAG,EAAER;IAAO,GAEX,CACG;MACIS,IAAI;MACJC;IACJ,CAAC,CAAC,iGAEFtE,KAAA,CAAAqD,aAAA;MACIkB,SAAS,EAAEtD,EAAE,CAAC,CACV,kBAAkB,EAClB,UAAU,EACV,4BAA4B,EAC5B,mBAAmB,EACnBqD,UAAU,GAAG,YAAY,GAAG,aAAa,CAC5C;IAAE,gBAEHtE,KAAA,CAAAqD,aAAA;MACIkB,SAAS,EAAEtD,EAAE,CAAC,CACV,aAAa,EACb,wCAAwC,CAC3C,CAAE;MACHuD,GAAG,EAAEH;IAAK,gBAEVrE,KAAA,CAAAqD,aAAA,CAACnC,IAAI;MACDuD,IAAI,eAAEzE,KAAA,CAAAqD,aAAA,CAAChD,QAAQ,MAAE,CAAE;MACnBqE,KAAK,EAAE,uBAAwB;MAC/BC,KAAK,EAAE,eAAgB;MACvBC,IAAI,EAAE;IAAK,CACd,CACA,CAAC,eACN5E,KAAA,CAAAqD,aAAA,CAAC9C,UAAU;MACPsE,SAAS,EAAEzB,2BAA2B,CAACvB,UAAU,CAAC,CAAC,CAAE;MACrD,eAAa,gCAAgC6B,KAAK,EAAG;MACrDF,MAAM,EAAEN,IAAI,IAAInB,WAAW,CAACmB,IAAI,EAAE;QAAEO,GAAG,EAAEC,KAAK;QAAEA,KAAK,EAAE;MAAK,CAAC;IAAE,CAClE,CAAC,eAEF1D,KAAA,CAAAqD,aAAA;MACIkB,SAAS,EAAEtD,EAAE,CAAC,CACV,6BAA6B,EAC7B,mBAAmB,CACtB,CAAE;MACH,eAAa;IAAuB,GAEnCwC,GAAG,CAACE,GAAG,CAAC,CAACE,IAAI,EAAEiB,UAAU,KAAK;MAC3B,IAAI/D,kBAAkB,CAAC8C,IAAI,CAAC,EAAE;QAC1B,oBACI7D,KAAA,CAAAqD,aAAA,CAAC5C,SAAS;UACN2D,GAAG,EAAEP,IAAI,CAAClB,EAAG;UACbqB,SAAS,EAAE;YACPzC,MAAM,EAAEA,MAAM,GAAGA,MAAM,CAACuC,OAAO,GAAG,IAAI;YACtCrB,IAAI,EAAE,aAAa;YACnBF,UAAU,EAAEsB,IAAI;YAChBjC,MAAM,EAAEU,uBAAuB,CAACuB,IAAI;UACxC,CAAE;UACFM,OAAO,EAAEnC;QAAU,GAElB,CAAC;UAAEqC;QAAK,CAAC,kBACNrE,KAAA,CAAAqD,aAAA;UACImB,GAAG,EAAEH,IAAK;UACVE,SAAS,EAAEtD,EAAE,CAAC,CACV,UAAU,EACV,mBAAmB,EACnB,OAAO,CACV;QAAE,gBAEHjB,KAAA,CAAAqD,aAAA;UACIkB,SAAS,EACL;QACH,gBAEDvE,KAAA,CAAAqD,aAAA,CAACzC,UAAU;UACP2B,UAAU,EAAEsB,IAAK;UACjBkB,QAAQ,EAAErB,KAAM;UAChBsB,SAAS,EAAEF;QAAW,CACzB,CACA,CACJ,CAEF,CAAC;MAEpB;MAEA,MAAM7C,KAAK,GAAG4B,IAAqB;MACnC,oBACI7D,KAAA,CAAAqD,aAAA,CAACrC,kBAAkB;QAACiB,KAAK,EAAEA,KAAM;QAACmC,GAAG,EAAEnC,KAAK,CAAC6B;MAAQ,gBACjD9D,KAAA,CAAAqD,aAAA,CAAC5C,SAAS;QACNuD,SAAS,EAAE;UACPzC,MAAM,EAAEA,MAAM,GAAGA,MAAM,CAACuC,OAAO,GAAG,IAAI;UACtCrB,IAAI,EAAE,OAAO;UACbR,KAAK;UACLiC,GAAG,EAAE;YACDT,GAAG,EAAEC,KAAK;YACVA,KAAK,EAAEoB;UACX;QACJ,CAAE;QACFX,OAAO,EAAEnC;MAAU,GAElB,CAAC;QAAEqC;MAAK,CAAC,kBACNrE,KAAA,CAAAqD,aAAA;QACIkB,SAAS,EAAEtD,EAAE,CAAC,CACV,UAAU,EACV,mBAAmB,EACnB,OAAO,CACV,CAAE;QACHuD,GAAG,EAAEH;MAAK,gBAEVrE,KAAA,CAAAqD,aAAA,CAAC7C,QAAQ;QACLgB,KAAK,EAAEA,KAAM;QACbgC,MAAM,EAAEN,IAAI,IACRnB,WAAW,CAACmB,IAAI,EAAE;UACdO,GAAG,EAAEC,KAAK;UACVA,KAAK,EAAEoB;QACX,CAAC,CACJ;QACDD,SAAS,EAAE7B,yBAAyB,CAChCnB,UAAU,CACNqB,IAAI,IACA7B,UAAU,CAAC4D,QAAQ,CACf/B,IAAI,CAACT,IACT,CAAC,KACAgB,GAAG,CAACH,MAAM,GAAG,CAAC,IACXpD,GAAG,CACCgD,IAAI,EACJ,SACJ,CAAC,KAAKQ,KAAK,CACvB,CACJ;MAAE,CACL,CAAC,eAEF1D,KAAA,CAAAqD,aAAA;QACIkB,SAAS,EACL;MACH,gBAEDvE,KAAA,CAAAqD,aAAA,CAAC1C,KAAK;QACFY,MAAM,EAAEA,MAAO;QACfU,KAAK,EAAEA,KAAM;QACbiD,MAAM,EAAEpD,SAAU;QAClBqD,QAAQ,EAAExD;MAAY,CACzB,CACA,CAAC,EAGLmD,UAAU,KAAKrB,GAAG,CAACH,MAAM,GAAG,CAAC,iBAC1BtD,KAAA,CAAAqD,aAAA,CAAC7C,QAAQ;QACL4E,IAAI;QACJ5D,KAAK,EAAEA,KAAM;QACbqD,SAAS,EAAE7B,yBAAyB,CAChCnB,UAAU,CAACqB,IAAI,IAAI;UACf,OACI7B,UAAU,CAAC4D,QAAQ,CACf/B,IAAI,CAACT,IACT,CAAC,KACAgB,GAAG,CAACH,MAAM,GAAG,CAAC,IACXpD,GAAG,CACCgD,IAAI,EACJ,SACJ,CAAC,KAAKQ,KAAK,CAAC;QAExB,CAAC,CACL,CAAE;QACFF,MAAM,EAAEN,IAAI,IACRnB,WAAW,CAACmB,IAAI,EAAE;UACdO,GAAG,EAAEC,KAAK;UACVA,KAAK,EAAEoB,UAAU,GAAG;QACxB,CAAC;MACJ,CACJ,CAEJ,CAEF,CACK,CAAC;IAE7B,CAAC,CACA,CAAC,EAELpB,KAAK,KAAK9B,MAAM,CAAC0B,MAAM,GAAG,CAAC,gBACxBtD,KAAA,CAAAqD,aAAA,CAAC9C,UAAU;MACP,eAAa,mCAAmCmD,KAAK,EAAG;MACxD0B,IAAI;MACJP,SAAS,EAAEzB,2BAA2B,CAACvB,UAAU,CAAC,CAAC,CAAE;MACrD2B,MAAM,EAAEN,IAAI,IACRnB,WAAW,CAACmB,IAAI,EAAE;QACdO,GAAG,EAAEC,KAAK,GAAG,CAAC;QACdA,KAAK,EAAE;MACX,CAAC;IACJ,CACJ,CAAC,GACF,IACH,CAEF,CAAC;EAEpB,CAAC,CAAC,EAEDzB,KAAK,gBACFjC,KAAA,CAAAqD,aAAA,CAACrC,kBAAkB;IAACiB,KAAK,EAAEA;EAAM,gBAC7BjC,KAAA,CAAAqD,aAAA,CAAC3C,eAAe;IACZ2E,OAAO,EAAEA,CAAA,KAAMvD,SAAS,CAAC,IAAI,CAAE;IAC/BwD,QAAQ,EAAErD,KAAK,IAAI;MACf,IAAIA,KAAK,CAACU,EAAE,EAAE;QACVjB,WAAW,CAACO,KAAK,CAAC;QAClBH,SAAS,CAAC,IAAI,CAAC;QACf;MACJ;MACAL,WAAW,CAAC;QAAEQ,KAAK;QAAEsD,QAAQ,EAAErD;MAAW,CAAC,CAAC;MAE5CJ,SAAS,CAAC,IAAI,CAAC;IACnB;EAAE,CACL,CACe,CAAC,GACrB,IACE,CAAC;AAEnB,CAAC;AASD,OAAO,MAAM0D,WAAW,GAAIC,KAAuB,IAAK;EACpD,oBACIzF,KAAA,CAAAqD,aAAA,CAACvC,mBAAmB,EAAK2E,KAAK,eAC1BzF,KAAA,CAAAqD,aAAA,CAAC/B,MAAM,MAAE,CACQ,CAAC;AAE9B,CAAC","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["React","Fragment","get","i18n","ReactComponent","DragIcon","Center","Horizontal","Vertical","Draggable","EditFieldDialog","Field","LayoutCell","useModelFieldEditor","FieldEditorProvider","isLayoutField","ModelFieldProvider","cn","Icon","t","namespace","fieldTypes","Editor","parent","depth","insertField","updateField","deleteField","fields","noConflict","editField","onFieldDrop","onEndDrag","field","dropTarget","getFieldPlugin","getLayoutFieldPlugin","getField","collectLayoutFieldFields","layoutField","plugin","type","collectFields","id","canDropIntoField","draggable","fieldPlugin","canAccept","isVerticalDropzoneVisible","cb","item","allowLayout","isHorizontalDropzoneVisible","createElement","length","isDroppable","onDrop","row","index","map","rowKey","cell","fieldId","join","beginDrag","filter","pos","endDrag","key","drag","isDragging","className","ref","icon","label","color","size","isVisible","fieldIndex","rowIndex","cellIndex","includes","onEdit","onDelete","last","onClose","onSubmit","position","FieldEditor","props"],"sources":["FieldEditor.tsx"],"sourcesContent":["import React, { Fragment } from \"react\";\nimport get from \"lodash/get.js\";\nimport { i18n } from \"@webiny/app/i18n/index.js\";\nimport { ReactComponent as DragIcon } from \"@webiny/icons/drag_indicator.svg\";\nimport { Center, Horizontal, Vertical } from \"../DropZone/index.js\";\nimport Draggable from \"../Draggable.js\";\nimport EditFieldDialog from \"./EditFieldDialog.js\";\nimport Field from \"./Field.js\";\nimport { LayoutCell } from \"./LayoutCell.js\";\nimport { useModelFieldEditor } from \"./useModelFieldEditor.js\";\nimport type { IsVisibleCallable } from \"./FieldEditorContext.js\";\nimport { FieldEditorProvider } from \"./FieldEditorContext.js\";\nimport type { CmsEditorFieldsLayout, CmsModelField, DragSource } from \"~/types.js\";\nimport type { CmsLayoutField } from \"@webiny/app-headless-cms-common/types/model.js\";\nimport { isLayoutField } from \"@webiny/app-headless-cms-common/types/model.js\";\nimport { ModelFieldProvider } from \"~/admin/components/ModelFieldProvider/index.js\";\nimport { cn, Icon } from \"@webiny/admin-ui\";\n\nconst t = i18n.namespace(\"app-headless-cms/admin/components/editor\");\n\nconst fieldTypes: string[] = [\"field\", \"newField\"];\n\nconst Editor = () => {\n const {\n parent,\n depth,\n insertField,\n updateField,\n deleteField,\n fields,\n noConflict,\n editField,\n onFieldDrop,\n onEndDrag,\n field,\n dropTarget,\n getFieldPlugin,\n getLayoutFieldPlugin,\n getField\n } = useModelFieldEditor();\n\n /**\n * Collect all data fields referenced inside a layout descriptor (e.g. fields inside tabs).\n * Delegates to the layout field plugin's `collectFields` method if available.\n */\n const collectLayoutFieldFields = (layoutField: CmsLayoutField): CmsModelField[] => {\n const plugin = getLayoutFieldPlugin(layoutField.type);\n if (!plugin?.field.collectFields) {\n return [];\n }\n return plugin.field.collectFields({\n field: layoutField,\n getField: (id: string) => getField({ id })\n });\n };\n\n const canDropIntoField = (field: CmsModelField, draggable: DragSource) => {\n const fieldPlugin = getFieldPlugin(field.type);\n if (!fieldPlugin) {\n return true;\n }\n const canAccept = fieldPlugin.field.canAccept;\n if (typeof canAccept === \"function\" && !canAccept(field, draggable)) {\n return false;\n }\n\n return true;\n };\n\n const isVerticalDropzoneVisible = (cb: IsVisibleCallable) => {\n return (item: DragSource) => {\n // Layout fields always occupy full row — no side-by-side layout\n if (item.type === \"newLayoutField\" || item.type === \"layoutField\") {\n return false;\n }\n\n if (!parent) {\n return cb(item);\n }\n\n const fieldPlugin = getFieldPlugin(parent.type);\n if (fieldPlugin) {\n const allowLayout = fieldPlugin.field.allowLayout ?? true;\n if (!allowLayout) {\n return false;\n }\n }\n\n if (!canDropIntoField(parent, item)) {\n return false;\n }\n\n return cb(item);\n };\n };\n\n const isHorizontalDropzoneVisible = (cb: IsVisibleCallable) => {\n return (item: DragSource) => {\n if (!parent) {\n return cb(item);\n }\n\n if (!canDropIntoField(parent, item)) {\n return false;\n }\n\n return cb(item);\n };\n };\n\n return (\n <Fragment>\n {fields.length === 0 && (\n <Center\n isDroppable={isHorizontalDropzoneVisible(() => true)}\n onDrop={item =>\n onFieldDrop(item, {\n row: 0,\n index: 0\n })\n }\n >\n {t`Drop your first field here`}\n </Center>\n )}\n\n {fields.map((row, index) => {\n // Build a stable key for the row\n const rowKey = row\n .map(cell => (isLayoutField(cell) ? cell.id : (cell as CmsModelField).fieldId))\n .join(\".\");\n\n return (\n <Draggable\n beginDrag={{\n parent: parent ? parent.fieldId : null,\n type: \"row\",\n fields: row.filter(cell => !isLayoutField(cell)) as CmsModelField[],\n pos: { row: index }\n }}\n endDrag={onEndDrag}\n key={rowKey}\n >\n {(\n {\n drag,\n isDragging\n } /* RowContainer start - includes drag handle, drop zones and the Row itself. */\n ) => (\n <div\n className={cn([\n \"flex flex-column\",\n \"relative\",\n \"mb-md last-of-type:mb-none\",\n \"bg-neutral-dimmed\",\n isDragging ? \"opacity-30\" : \"opacity-100\"\n ])}\n >\n <div\n className={cn([\n \"cursor-grab\",\n \"absolute left-sm-plus top-sm-plus z-10\"\n ])}\n ref={drag}\n >\n <Icon\n icon={<DragIcon />}\n label={\"Drag to move this row\"}\n color={\"neutral-light\"}\n size={\"sm\"}\n />\n </div>\n <Horizontal\n isVisible={isHorizontalDropzoneVisible(noConflict())}\n data-testid={`cms-editor-row-droppable-top-${index}`}\n onDrop={item => onFieldDrop(item, { row: index, index: null })}\n />\n {/* Row start - includes field drop zones and fields */}\n <div\n className={cn([\n \"w-full flex justify-between\",\n \"pl-xl pr-sm py-sm\"\n ])}\n data-testid={\"cms.editor.field-row\"}\n >\n {row.map((cell, fieldIndex) => {\n if (isLayoutField(cell)) {\n return (\n <Draggable\n key={cell.id}\n beginDrag={{\n parent: parent ? parent.fieldId : null,\n type: \"layoutField\",\n layoutField: cell,\n fields: collectLayoutFieldFields(cell)\n }}\n endDrag={onEndDrag}\n >\n {({ drag }) => (\n <div\n ref={drag}\n className={cn([\n \"relative\",\n \"flex-1 basis-full\",\n \"mx-sm\"\n ])}\n >\n <div\n className={\n \"cursor-grab bg-neutral-base p-md shadow-sm rounded-xs\"\n }\n >\n <LayoutCell\n field={cell}\n rowIndex={index}\n cellIndex={fieldIndex}\n />\n </div>\n </div>\n )}\n </Draggable>\n );\n }\n\n const field = cell as CmsModelField;\n return (\n <ModelFieldProvider field={field} key={field.fieldId}>\n <Draggable\n beginDrag={{\n parent: parent ? parent.fieldId : null,\n type: \"field\",\n field,\n pos: {\n row: index,\n index: fieldIndex\n }\n }}\n endDrag={onEndDrag}\n >\n {({ drag }) => (\n <div\n className={cn([\n \"relative\",\n \"flex-1 basis-full\",\n \"mx-sm\"\n ])}\n ref={drag}\n >\n <Vertical\n depth={depth}\n onDrop={item =>\n onFieldDrop(item, {\n row: index,\n index: fieldIndex\n })\n }\n isVisible={isVerticalDropzoneVisible(\n noConflict(\n item =>\n fieldTypes.includes(\n item.type\n ) &&\n (row.length < 4 ||\n get(\n item,\n \"pos.row\"\n ) === index)\n )\n )}\n />\n\n <div\n className={\n \"cursor-grab bg-neutral-base p-md shadow-sm rounded-xs\"\n }\n >\n <Field\n parent={parent}\n field={field}\n onEdit={editField}\n onDelete={deleteField}\n />\n </div>\n\n {/* Field end */}\n {fieldIndex === row.length - 1 && (\n <Vertical\n last\n depth={depth}\n isVisible={isVerticalDropzoneVisible(\n noConflict(item => {\n return (\n fieldTypes.includes(\n item.type\n ) &&\n (row.length < 4 ||\n get(\n item,\n \"pos.row\"\n ) === index)\n );\n })\n )}\n onDrop={item =>\n onFieldDrop(item, {\n row: index,\n index: fieldIndex + 1\n })\n }\n />\n )}\n </div>\n )}\n </Draggable>\n </ModelFieldProvider>\n );\n })}\n </div>\n {/* Row end */}\n {index === fields.length - 1 ? (\n <Horizontal\n data-testid={`cms-editor-row-droppable-bottom-${index}`}\n last\n isVisible={isHorizontalDropzoneVisible(noConflict())}\n onDrop={item =>\n onFieldDrop(item, {\n row: index + 1,\n index: null\n })\n }\n />\n ) : null}\n </div>\n )}\n </Draggable>\n );\n })}\n\n {field ? (\n <ModelFieldProvider field={field}>\n <EditFieldDialog\n onClose={() => editField(null)}\n onSubmit={field => {\n if (field.id) {\n updateField(field);\n editField(null);\n return;\n }\n insertField({ field, position: dropTarget });\n\n editField(null);\n }}\n />\n </ModelFieldProvider>\n ) : null}\n </Fragment>\n );\n};\n\nexport interface FieldEditorProps {\n parent?: CmsModelField;\n layout: CmsEditorFieldsLayout;\n fields: CmsModelField[];\n onChange: (params: { fields: CmsModelField[]; layout: CmsEditorFieldsLayout }) => void;\n}\n\nexport const FieldEditor = (props: FieldEditorProps) => {\n return (\n <FieldEditorProvider {...props}>\n <Editor />\n </FieldEditorProvider>\n );\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import type { CmsEditorFieldId,
|
|
3
|
-
import type {
|
|
2
|
+
import type { CmsEditorFieldId, CmsModelFieldRendererPlugin, CmsEditorFieldsLayout, CmsModelFieldTypePlugin, CmsModelLayoutFieldTypePlugin, CmsModelField, DragSource, FieldLayoutPosition } from "../../../types.js";
|
|
3
|
+
import type { CmsLayoutField } from "@webiny/app-headless-cms-common/types/model.js";
|
|
4
4
|
import type { FieldEditorProps } from "./FieldEditor.js";
|
|
5
5
|
import type { DragSourceMonitor } from "react-dnd";
|
|
6
6
|
interface DropTarget {
|
|
@@ -29,31 +29,31 @@ interface MoveFieldParams {
|
|
|
29
29
|
position: FieldLayoutPosition;
|
|
30
30
|
}
|
|
31
31
|
interface GetFieldsInLayoutCallable {
|
|
32
|
-
(): (CmsModelField |
|
|
32
|
+
(): (CmsModelField | CmsLayoutField)[][];
|
|
33
33
|
}
|
|
34
34
|
interface InsertLayoutCellCallable {
|
|
35
|
-
(
|
|
35
|
+
(field: Omit<CmsLayoutField, "id"> | CmsLayoutField, position: FieldLayoutPosition): void;
|
|
36
36
|
}
|
|
37
37
|
interface UpdateLayoutCellCallable {
|
|
38
|
-
(
|
|
38
|
+
(fieldId: string, field: CmsLayoutField): void;
|
|
39
39
|
}
|
|
40
40
|
interface DeleteLayoutCellCallable {
|
|
41
|
-
(
|
|
41
|
+
(fieldId: string): void;
|
|
42
42
|
}
|
|
43
43
|
interface MoveLayoutCellCallable {
|
|
44
|
-
(
|
|
44
|
+
(fieldId: string, position: FieldLayoutPosition): void;
|
|
45
45
|
}
|
|
46
46
|
interface GetLayoutFieldPluginCallable {
|
|
47
|
-
(type: string):
|
|
47
|
+
(type: string): CmsModelLayoutFieldTypePlugin | undefined;
|
|
48
48
|
}
|
|
49
49
|
interface GetFieldPluginCallable {
|
|
50
|
-
(type: string):
|
|
50
|
+
(type: string): CmsModelFieldTypePlugin | undefined;
|
|
51
51
|
}
|
|
52
52
|
interface GetFieldCallable {
|
|
53
53
|
(query: GetFieldParams): CmsModelField | undefined;
|
|
54
54
|
}
|
|
55
55
|
interface GetFieldRendererCallable {
|
|
56
|
-
(rendererName: string):
|
|
56
|
+
(rendererName: string): CmsModelFieldRendererPlugin | undefined;
|
|
57
57
|
}
|
|
58
58
|
interface OnFieldDropCallable {
|
|
59
59
|
(source: Partial<DragSource>, target: DropTarget): void;
|
|
@@ -83,7 +83,7 @@ interface NoConflictCallable {
|
|
|
83
83
|
(cb?: IsVisibleCallable): (item: DragSource) => boolean;
|
|
84
84
|
}
|
|
85
85
|
export interface FieldEditorContext {
|
|
86
|
-
fields: (CmsModelField |
|
|
86
|
+
fields: (CmsModelField | CmsLayoutField)[][];
|
|
87
87
|
noConflict: NoConflictCallable;
|
|
88
88
|
layout: CmsEditorFieldsLayout;
|
|
89
89
|
onChange?: (data: any) => void;
|