@webiny/app-headless-cms 0.0.0-unstable.df7a8bb475 → 0.0.0-unstable.e2758ee1cf
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/HeadlessCMS.js +2 -1
- package/HeadlessCMS.js.map +1 -1
- package/admin/components/ContentEntries/Header/ButtonRefresh/ButtonRefresh.d.ts +2 -0
- package/admin/components/ContentEntries/Header/ButtonRefresh/ButtonRefresh.js +18 -0
- package/admin/components/ContentEntries/Header/ButtonRefresh/ButtonRefresh.js.map +1 -0
- package/admin/components/ContentEntries/Header/ButtonRefresh/index.d.ts +1 -0
- package/admin/components/ContentEntries/Header/ButtonRefresh/index.js +3 -0
- package/admin/components/ContentEntries/Header/ButtonRefresh/index.js.map +1 -0
- package/admin/components/ContentEntries/Header/Header.js +2 -1
- package/admin/components/ContentEntries/Header/Header.js.map +1 -1
- package/admin/components/ContentEntries/Scheduler/adapters/SchedulerPublishGraphQLGateway.js +1 -7
- package/admin/components/ContentEntries/Scheduler/adapters/SchedulerPublishGraphQLGateway.js.map +1 -1
- package/admin/components/ContentEntries/SidebarContent/SidebarContent.js +1 -1
- package/admin/components/ContentEntries/SidebarContent/SidebarContent.js.map +1 -1
- package/admin/components/ContentEntries/SidebarHeader/SidebarHeader.js +1 -1
- package/admin/components/ContentEntries/SidebarHeader/SidebarHeader.js.map +1 -1
- package/admin/components/ContentEntries/Table/Cells/CellLive.d.ts +2 -0
- package/admin/components/ContentEntries/Table/Cells/CellLive.js +26 -0
- package/admin/components/ContentEntries/Table/Cells/CellLive.js.map +1 -0
- package/admin/components/ContentEntries/Table/Cells/index.d.ts +1 -0
- package/admin/components/ContentEntries/Table/Cells/index.js +1 -0
- package/admin/components/ContentEntries/Table/Cells/index.js.map +1 -1
- package/admin/components/ContentModelEditor/ContentModelEditor.js +1 -6
- package/admin/components/ContentModelEditor/ContentModelEditor.js.map +1 -1
- package/admin/components/ContentModelEditor/ContentModelEditorProvider.d.ts +2 -0
- package/admin/components/ContentModelEditor/ContentModelEditorProvider.js +14 -2
- package/admin/components/ContentModelEditor/ContentModelEditorProvider.js.map +1 -1
- package/admin/components/ContentModelEditor/FieldsSidebar.js +51 -2
- package/admin/components/ContentModelEditor/FieldsSidebar.js.map +1 -1
- package/admin/components/Droppable.d.ts +1 -1
- package/admin/components/Droppable.js.map +1 -1
- package/admin/components/FieldEditor/EditFieldDialog/AppearanceTab.js +3 -3
- package/admin/components/FieldEditor/EditFieldDialog/AppearanceTab.js.map +1 -1
- package/admin/components/FieldEditor/EditFieldDialog/FieldSettingsTabs.d.ts +10 -0
- package/admin/components/FieldEditor/EditFieldDialog/FieldSettingsTabs.js +69 -0
- package/admin/components/FieldEditor/EditFieldDialog/FieldSettingsTabs.js.map +1 -0
- package/admin/components/FieldEditor/EditFieldDialog/GeneralTab.js +27 -9
- package/admin/components/FieldEditor/EditFieldDialog/GeneralTab.js.map +1 -1
- package/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/CannotUsePermissions.d.ts +2 -0
- package/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/CannotUsePermissions.js +14 -0
- package/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/CannotUsePermissions.js.map +1 -0
- package/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/FieldPermissionsSelection.d.ts +15 -0
- package/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/FieldPermissionsSelection.js +131 -0
- package/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/FieldPermissionsSelection.js.map +1 -0
- package/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/PermissionsTab.d.ts +4 -0
- package/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/PermissionsTab.js +74 -0
- package/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/PermissionsTab.js.map +1 -0
- package/admin/components/FieldEditor/EditFieldDialog/RulesTab/RulesTab.d.ts +13 -0
- package/admin/components/FieldEditor/EditFieldDialog/RulesTab/RulesTab.js +203 -0
- package/admin/components/FieldEditor/EditFieldDialog/RulesTab/RulesTab.js.map +1 -0
- package/admin/components/FieldEditor/EditFieldDialog/RulesTab/index.d.ts +1 -0
- package/admin/components/FieldEditor/EditFieldDialog/RulesTab/index.js +3 -0
- package/admin/components/FieldEditor/EditFieldDialog/RulesTab/index.js.map +1 -0
- package/admin/components/FieldEditor/EditFieldDialog.js +22 -57
- package/admin/components/FieldEditor/EditFieldDialog.js.map +1 -1
- package/admin/components/FieldEditor/EditFieldDialogContainer.d.ts +12 -0
- package/admin/components/FieldEditor/EditFieldDialogContainer.js +40 -0
- package/admin/components/FieldEditor/EditFieldDialogContainer.js.map +1 -0
- package/admin/components/FieldEditor/EditFieldDrawerContainer.d.ts +12 -0
- package/admin/components/FieldEditor/EditFieldDrawerContainer.js +40 -0
- package/admin/components/FieldEditor/EditFieldDrawerContainer.js.map +1 -0
- package/admin/components/FieldEditor/FieldEditor.d.ts +1 -1
- package/admin/components/FieldEditor/FieldEditor.js +149 -89
- package/admin/components/FieldEditor/FieldEditor.js.map +1 -1
- package/admin/components/FieldEditor/FieldEditorContext.d.ts +33 -3
- package/admin/components/FieldEditor/FieldEditorContext.js +225 -6
- package/admin/components/FieldEditor/FieldEditorContext.js.map +1 -1
- package/admin/components/FieldEditor/LayoutCell.d.ts +9 -0
- package/admin/components/FieldEditor/LayoutCell.js +33 -0
- package/admin/components/FieldEditor/LayoutCell.js.map +1 -0
- package/admin/components/FieldEditor/utils/deleteField.js +12 -4
- package/admin/components/FieldEditor/utils/deleteField.js.map +1 -1
- package/admin/components/FieldEditor/utils/getFieldPosition.js +6 -1
- package/admin/components/FieldEditor/utils/getFieldPosition.js.map +1 -1
- package/admin/graphql/contentModels.d.ts +2 -2
- package/admin/graphql/contentModels.js +7 -0
- package/admin/graphql/contentModels.js.map +1 -1
- package/admin/hooks/useModelFieldGraphqlContext.d.ts +1 -0
- package/admin/hooks/usePermission.d.ts +2 -2
- package/admin/hooks/usePermission.js.map +1 -1
- package/admin/menus/GroupContentModels.d.ts +5 -3
- package/admin/menus/GroupContentModels.js +4 -5
- package/admin/menus/GroupContentModels.js.map +1 -1
- package/admin/menus/GroupMenu.d.ts +5 -3
- package/admin/menus/GroupMenu.js +1 -2
- package/admin/menus/GroupMenu.js.map +1 -1
- package/admin/menus/HasContentEntryPermissions.d.ts +2 -2
- package/admin/menus/HasContentEntryPermissions.js.map +1 -1
- package/admin/plugins/fieldRenderers/DynamicSection.d.ts +2 -1
- package/admin/plugins/fieldRenderers/DynamicSection.js +3 -1
- package/admin/plugins/fieldRenderers/DynamicSection.js.map +1 -1
- package/admin/plugins/fieldRenderers/boolean/booleanSwitch.js +7 -1
- package/admin/plugins/fieldRenderers/boolean/booleanSwitch.js.map +1 -1
- package/admin/plugins/fieldRenderers/checkboxes.js +7 -1
- package/admin/plugins/fieldRenderers/checkboxes.js.map +1 -1
- package/admin/plugins/fieldRenderers/dateTime/Input.js +9 -2
- package/admin/plugins/fieldRenderers/dateTime/Input.js.map +1 -1
- package/admin/plugins/fieldRenderers/dateTime/Select.js +7 -0
- package/admin/plugins/fieldRenderers/dateTime/Select.js.map +1 -1
- package/admin/plugins/fieldRenderers/dynamicZone/MultiValueDynamicZone.d.ts +1 -0
- package/admin/plugins/fieldRenderers/dynamicZone/MultiValueDynamicZone.js +9 -5
- package/admin/plugins/fieldRenderers/dynamicZone/MultiValueDynamicZone.js.map +1 -1
- package/admin/plugins/fieldRenderers/dynamicZone/SingleValueDynamicZone.d.ts +2 -1
- package/admin/plugins/fieldRenderers/dynamicZone/SingleValueDynamicZone.js +18 -10
- package/admin/plugins/fieldRenderers/dynamicZone/SingleValueDynamicZone.js.map +1 -1
- package/admin/plugins/fieldRenderers/lexicalText/lexicalTextInput.js +13 -4
- package/admin/plugins/fieldRenderers/lexicalText/lexicalTextInput.js.map +1 -1
- package/admin/plugins/fieldRenderers/lexicalText/lexicalTextInputs.js +10 -4
- package/admin/plugins/fieldRenderers/lexicalText/lexicalTextInputs.js.map +1 -1
- package/admin/plugins/fieldRenderers/longText/longText.js +7 -1
- package/admin/plugins/fieldRenderers/longText/longText.js.map +1 -1
- package/admin/plugins/fieldRenderers/longText/longTexts.js +12 -3
- package/admin/plugins/fieldRenderers/longText/longTexts.js.map +1 -1
- package/admin/plugins/fieldRenderers/number/numberInput.js +7 -1
- package/admin/plugins/fieldRenderers/number/numberInput.js.map +1 -1
- package/admin/plugins/fieldRenderers/number/numberInputs.js +11 -3
- package/admin/plugins/fieldRenderers/number/numberInputs.js.map +1 -1
- package/admin/plugins/fieldRenderers/object/FieldSettings.d.ts +2 -1
- package/admin/plugins/fieldRenderers/object/MultiValueContainer.js +5 -0
- package/admin/plugins/fieldRenderers/object/MultiValueContainer.js.map +1 -1
- package/admin/plugins/fieldRenderers/object/MultiValueItemContainer.d.ts +1 -0
- package/admin/plugins/fieldRenderers/object/MultiValueItemContainer.js +3 -2
- package/admin/plugins/fieldRenderers/object/MultiValueItemContainer.js.map +1 -1
- package/admin/plugins/fieldRenderers/radioButtons.js +7 -1
- package/admin/plugins/fieldRenderers/radioButtons.js.map +1 -1
- package/admin/plugins/fieldRenderers/ref/advanced/components/AdvancedMultipleReferenceField.js +15 -7
- package/admin/plugins/fieldRenderers/ref/advanced/components/AdvancedMultipleReferenceField.js.map +1 -1
- package/admin/plugins/fieldRenderers/ref/advanced/components/AdvancedSingleReferenceField.js +14 -7
- package/admin/plugins/fieldRenderers/ref/advanced/components/AdvancedSingleReferenceField.js.map +1 -1
- package/admin/plugins/fieldRenderers/ref/advanced/components/Entry.d.ts +3 -1
- package/admin/plugins/fieldRenderers/ref/advanced/components/Entry.js +7 -6
- package/admin/plugins/fieldRenderers/ref/advanced/components/Entry.js.map +1 -1
- package/admin/plugins/fieldRenderers/ref/components/ContentEntriesAutocomplete.d.ts +1 -1
- package/admin/plugins/fieldRenderers/ref/components/ContentEntriesAutocomplete.js +9 -3
- package/admin/plugins/fieldRenderers/ref/components/ContentEntriesAutocomplete.js.map +1 -1
- package/admin/plugins/fieldRenderers/ref/components/ContentEntriesMultiAutoComplete.d.ts +1 -1
- package/admin/plugins/fieldRenderers/ref/components/ContentEntriesMultiAutoComplete.js +9 -3
- package/admin/plugins/fieldRenderers/ref/components/ContentEntriesMultiAutoComplete.js.map +1 -1
- package/admin/plugins/fieldRenderers/ref/simple/components/SimpleMultipleRenderer.js +7 -1
- package/admin/plugins/fieldRenderers/ref/simple/components/SimpleMultipleRenderer.js.map +1 -1
- package/admin/plugins/fieldRenderers/ref/simple/components/SimpleSingleRenderer.js +7 -1
- package/admin/plugins/fieldRenderers/ref/simple/components/SimpleSingleRenderer.js.map +1 -1
- package/admin/plugins/fieldRenderers/ref/simple/simpleSingleRenderer.js +2 -2
- package/admin/plugins/fieldRenderers/ref/simple/simpleSingleRenderer.js.map +1 -1
- package/admin/plugins/fieldRenderers/select.js +7 -1
- package/admin/plugins/fieldRenderers/select.js.map +1 -1
- package/admin/plugins/fieldRenderers/text/tags.js +7 -1
- package/admin/plugins/fieldRenderers/text/tags.js.map +1 -1
- package/admin/plugins/fieldRenderers/text/textInput.js +7 -1
- package/admin/plugins/fieldRenderers/text/textInput.js.map +1 -1
- package/admin/plugins/fieldRenderers/text/textInputs.js +12 -3
- package/admin/plugins/fieldRenderers/text/textInputs.js.map +1 -1
- package/admin/plugins/fieldValidators/dynamicZone.js +2 -2
- package/admin/plugins/fieldValidators/dynamicZone.js.map +1 -1
- package/admin/plugins/fieldValidators/maxLength.js +4 -4
- package/admin/plugins/fieldValidators/maxLength.js.map +1 -1
- package/admin/plugins/fields/ui/TabsLayoutEditor.d.ts +9 -0
- package/admin/plugins/fields/ui/TabsLayoutEditor.js +470 -0
- package/admin/plugins/fields/ui/TabsLayoutEditor.js.map +1 -0
- package/admin/plugins/fields/ui/alert.d.ts +2 -0
- package/admin/plugins/fields/ui/alert.js +160 -0
- package/admin/plugins/fields/ui/alert.js.map +1 -0
- package/admin/plugins/fields/ui/index.d.ts +3 -0
- package/admin/plugins/fields/ui/index.js +5 -0
- package/admin/plugins/fields/ui/index.js.map +1 -0
- package/admin/plugins/fields/ui/separator.d.ts +2 -0
- package/admin/plugins/fields/ui/separator.js +147 -0
- package/admin/plugins/fields/ui/separator.js.map +1 -0
- package/admin/plugins/fields/ui/tabs.d.ts +2 -0
- package/admin/plugins/fields/ui/tabs.js +89 -0
- package/admin/plugins/fields/ui/tabs.js.map +1 -0
- package/admin/plugins/index.d.ts +2 -1
- package/admin/plugins/index.js +1 -2
- package/admin/plugins/index.js.map +1 -1
- package/admin/plugins/permissionRenderer/CmsPermissions.d.ts +1 -10
- package/admin/plugins/permissionRenderer/CmsPermissions.js +9 -13
- package/admin/plugins/permissionRenderer/CmsPermissions.js.map +1 -1
- package/admin/plugins/permissionRenderer/components/ContentEntryPermission.d.ts +1 -2
- package/admin/plugins/permissionRenderer/components/ContentEntryPermission.js.map +1 -1
- package/admin/plugins/permissionRenderer/components/ContentModelGroupPermission.d.ts +1 -2
- package/admin/plugins/permissionRenderer/components/ContentModelGroupPermission.js.map +1 -1
- package/admin/plugins/permissionRenderer/components/ContentModelPermission.d.ts +1 -2
- package/admin/plugins/permissionRenderer/components/ContentModelPermission.js.map +1 -1
- package/admin/plugins/permissionRenderer/index.d.ts +2 -3
- package/admin/plugins/permissionRenderer/index.js +11 -17
- package/admin/plugins/permissionRenderer/index.js.map +1 -1
- package/admin/views/contentEntries/ContentEntriesModule.js +6 -1
- package/admin/views/contentEntries/ContentEntriesModule.js.map +1 -1
- package/admin/views/contentEntries/hooks/useContentEntriesList.d.ts +1 -0
- package/admin/views/contentEntries/hooks/useContentEntriesList.js +8 -4
- package/admin/views/contentEntries/hooks/useContentEntriesList.js.map +1 -1
- package/admin/views/contentModels/importing/graphql.d.ts +2 -2
- package/admin/views/contentModels/importing/graphql.js.map +1 -1
- package/allPlugins.d.ts +3 -2
- package/allPlugins.js +2 -3
- package/allPlugins.js.map +1 -1
- package/exports/admin/cms/{fieldRenderers/dynamicZone.js → field-renderers/dynamic-zone.js} +1 -1
- package/exports/admin/cms/field-renderers/dynamic-zone.js.map +1 -0
- package/exports/admin/cms/model.d.ts +1 -0
- package/exports/admin/cms/model.js +3 -0
- package/exports/admin/cms/model.js.map +1 -0
- package/package.json +26 -26
- package/types.d.ts +1 -0
- package/types.js +5 -1
- package/types.js.map +1 -1
- package/admin/plugins/fieldRenderers/separator/index.d.ts +0 -1
- package/admin/plugins/fieldRenderers/separator/index.js +0 -3
- package/admin/plugins/fieldRenderers/separator/index.js.map +0 -1
- package/admin/plugins/fieldRenderers/separator/separator.d.ts +0 -2
- package/admin/plugins/fieldRenderers/separator/separator.js +0 -31
- package/admin/plugins/fieldRenderers/separator/separator.js.map +0 -1
- package/admin/plugins/fields/separator/separator.d.ts +0 -2
- package/admin/plugins/fields/separator/separator.js +0 -28
- package/admin/plugins/fields/separator/separator.js.map +0 -1
- package/admin/plugins/permissionRenderer/components/PermissionRendererWrapper.d.ts +0 -11
- package/admin/plugins/permissionRenderer/components/PermissionRendererWrapper.js +0 -33
- package/admin/plugins/permissionRenderer/components/PermissionRendererWrapper.js.map +0 -1
- package/exports/admin/cms/fieldRenderers/dynamicZone.js.map +0 -1
- /package/exports/admin/cms/{fieldRenderers/dynamicZone.d.ts → field-renderers/dynamic-zone.d.ts} +0 -0
- /package/exports/admin/cms/{fieldRenderers → field-renderers}/object.d.ts +0 -0
- /package/exports/admin/cms/{fieldRenderers → field-renderers}/object.js +0 -0
- /package/exports/admin/cms/{fieldRenderers → field-renderers}/object.js.map +0 -0
package/HeadlessCMS.js
CHANGED
|
@@ -9,6 +9,7 @@ import allPlugins from "./allPlugins.js";
|
|
|
9
9
|
import { LexicalEditorCmsPlugin } from "./admin/components/LexicalCmsEditor/LexicalEditorCmsPlugin.js";
|
|
10
10
|
import { SingletonContentEntryModule } from "./admin/views/contentEntries/SingletonContentEntryModule.js";
|
|
11
11
|
import { RoutesConfig } from "./admin/RoutesConfig.js";
|
|
12
|
+
import { CmsSecurityPermission } from "./admin/plugins/permissionRenderer/index.js";
|
|
12
13
|
const createHeadlessCMSProvider = createApolloClient => Component => {
|
|
13
14
|
return function HeadlessCMSProvider({
|
|
14
15
|
children
|
|
@@ -39,7 +40,7 @@ const HeadlessCMSExtension = ({
|
|
|
39
40
|
}));
|
|
40
41
|
return /*#__PURE__*/React.createElement(Fragment, null, /*#__PURE__*/React.createElement(RoutesConfig, null), /*#__PURE__*/React.createElement(ContentEntriesModule, null), /*#__PURE__*/React.createElement(SingletonContentEntryModule, null), /*#__PURE__*/React.createElement(Provider, {
|
|
41
42
|
hoc: createHeadlessCMSProvider(createApolloClient)
|
|
42
|
-
}), /*#__PURE__*/React.createElement(LexicalEditorCmsPlugin, null));
|
|
43
|
+
}), /*#__PURE__*/React.createElement(LexicalEditorCmsPlugin, null), /*#__PURE__*/React.createElement(CmsSecurityPermission, null));
|
|
43
44
|
};
|
|
44
45
|
export const HeadlessCMS = /*#__PURE__*/memo(HeadlessCMSExtension);
|
|
45
46
|
|
package/HeadlessCMS.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","Fragment","memo","plugins","Provider","ApolloCacheObjectIdPlugin","CmsProvider","apiInformation","ContentEntriesModule","allPlugins","LexicalEditorCmsPlugin","SingletonContentEntryModule","RoutesConfig","createHeadlessCMSProvider","createApolloClient","Component","HeadlessCMSProvider","children","createElement","attachTypeName","HeadlessCMSExtension","register","obj","__typename","includes","id","undefined","hoc","HeadlessCMS"],"sources":["HeadlessCMS.tsx"],"sourcesContent":["import React, { Fragment, memo } from \"react\";\nimport type { ApolloClient } from \"apollo-client\";\nimport { plugins } from \"@webiny/plugins\";\nimport { Provider } from \"@webiny/app-admin\";\nimport { ApolloCacheObjectIdPlugin } from \"@webiny/app\";\nimport { CmsProvider } from \"~/admin/contexts/Cms/index.js\";\nimport apiInformation from \"~/admin/plugins/apiInformation/index.js\";\nimport { ContentEntriesModule } from \"~/admin/views/contentEntries/ContentEntriesModule.js\";\nimport allPlugins from \"~/allPlugins.js\";\nimport { LexicalEditorCmsPlugin } from \"~/admin/components/LexicalCmsEditor/LexicalEditorCmsPlugin.js\";\nimport { SingletonContentEntryModule } from \"~/admin/views/contentEntries/SingletonContentEntryModule.js\";\nimport { RoutesConfig } from \"./admin/RoutesConfig.js\";\n\ninterface HeadlessCMSProvider {\n children: React.ReactNode;\n}\n\nconst createHeadlessCMSProvider =\n (createApolloClient: CreateApolloClient) =>\n (Component: React.ComponentType<React.PropsWithChildren>) => {\n return function HeadlessCMSProvider({ children }: HeadlessCMSProvider) {\n return (\n <CmsProvider createApolloClient={createApolloClient}>\n <Component>{children}</Component>\n </CmsProvider>\n );\n };\n };\n\ninterface CreateApolloClientParams {\n uri: string;\n}\n\ninterface CreateApolloClient {\n (params: CreateApolloClientParams): ApolloClient<any>;\n}\n\nexport interface HeadlessCMSProps {\n createApolloClient: CreateApolloClient;\n}\n\n/**\n * If there is a problem with some state being reset, it's probably because of this plugin.\n * Check that __typename from the API and the __typename in the state are the same.\n * If not, add it into the attachTypeName array.\n */\nconst attachTypeName = [\"CmsContentEntry\", \"RefField\"];\n\nconst HeadlessCMSExtension = ({ createApolloClient }: HeadlessCMSProps) => {\n plugins.register(apiInformation);\n plugins.register(allPlugins);\n\n plugins.register(\n new ApolloCacheObjectIdPlugin(obj => {\n if (obj.__typename === \"CmsContentModelField\") {\n return null;\n } else if (obj.__typename && attachTypeName.includes(obj.__typename)) {\n return `${obj.__typename}_${obj.id}`;\n }\n\n return undefined;\n })\n );\n\n return (\n <Fragment>\n <RoutesConfig />\n <ContentEntriesModule />\n <SingletonContentEntryModule />\n <Provider hoc={createHeadlessCMSProvider(createApolloClient)} />\n <LexicalEditorCmsPlugin />\n </Fragment>\n );\n};\n\nexport const HeadlessCMS = memo(HeadlessCMSExtension);\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,QAAQ,EAAEC,IAAI,QAAQ,OAAO;AAE7C,SAASC,OAAO,QAAQ,iBAAiB;AACzC,SAASC,QAAQ,QAAQ,mBAAmB;AAC5C,SAASC,yBAAyB,QAAQ,aAAa;AACvD,SAASC,WAAW;AACpB,OAAOC,cAAc;AACrB,SAASC,oBAAoB;AAC7B,OAAOC,UAAU;AACjB,SAASC,sBAAsB;AAC/B,SAASC,2BAA2B;AACpC,SAASC,YAAY;
|
|
1
|
+
{"version":3,"names":["React","Fragment","memo","plugins","Provider","ApolloCacheObjectIdPlugin","CmsProvider","apiInformation","ContentEntriesModule","allPlugins","LexicalEditorCmsPlugin","SingletonContentEntryModule","RoutesConfig","CmsSecurityPermission","createHeadlessCMSProvider","createApolloClient","Component","HeadlessCMSProvider","children","createElement","attachTypeName","HeadlessCMSExtension","register","obj","__typename","includes","id","undefined","hoc","HeadlessCMS"],"sources":["HeadlessCMS.tsx"],"sourcesContent":["import React, { Fragment, memo } from \"react\";\nimport type { ApolloClient } from \"apollo-client\";\nimport { plugins } from \"@webiny/plugins\";\nimport { Provider } from \"@webiny/app-admin\";\nimport { ApolloCacheObjectIdPlugin } from \"@webiny/app\";\nimport { CmsProvider } from \"~/admin/contexts/Cms/index.js\";\nimport apiInformation from \"~/admin/plugins/apiInformation/index.js\";\nimport { ContentEntriesModule } from \"~/admin/views/contentEntries/ContentEntriesModule.js\";\nimport allPlugins from \"~/allPlugins.js\";\nimport { LexicalEditorCmsPlugin } from \"~/admin/components/LexicalCmsEditor/LexicalEditorCmsPlugin.js\";\nimport { SingletonContentEntryModule } from \"~/admin/views/contentEntries/SingletonContentEntryModule.js\";\nimport { RoutesConfig } from \"./admin/RoutesConfig.js\";\nimport { CmsSecurityPermission } from \"~/admin/plugins/permissionRenderer/index.js\";\n\ninterface HeadlessCMSProvider {\n children: React.ReactNode;\n}\n\nconst createHeadlessCMSProvider =\n (createApolloClient: CreateApolloClient) =>\n (Component: React.ComponentType<React.PropsWithChildren>) => {\n return function HeadlessCMSProvider({ children }: HeadlessCMSProvider) {\n return (\n <CmsProvider createApolloClient={createApolloClient}>\n <Component>{children}</Component>\n </CmsProvider>\n );\n };\n };\n\ninterface CreateApolloClientParams {\n uri: string;\n}\n\ninterface CreateApolloClient {\n (params: CreateApolloClientParams): ApolloClient<any>;\n}\n\nexport interface HeadlessCMSProps {\n createApolloClient: CreateApolloClient;\n}\n\n/**\n * If there is a problem with some state being reset, it's probably because of this plugin.\n * Check that __typename from the API and the __typename in the state are the same.\n * If not, add it into the attachTypeName array.\n */\nconst attachTypeName = [\"CmsContentEntry\", \"RefField\"];\n\nconst HeadlessCMSExtension = ({ createApolloClient }: HeadlessCMSProps) => {\n plugins.register(apiInformation);\n plugins.register(allPlugins);\n\n plugins.register(\n new ApolloCacheObjectIdPlugin(obj => {\n if (obj.__typename === \"CmsContentModelField\") {\n return null;\n } else if (obj.__typename && attachTypeName.includes(obj.__typename)) {\n return `${obj.__typename}_${obj.id}`;\n }\n\n return undefined;\n })\n );\n\n return (\n <Fragment>\n <RoutesConfig />\n <ContentEntriesModule />\n <SingletonContentEntryModule />\n <Provider hoc={createHeadlessCMSProvider(createApolloClient)} />\n <LexicalEditorCmsPlugin />\n <CmsSecurityPermission />\n </Fragment>\n );\n};\n\nexport const HeadlessCMS = memo(HeadlessCMSExtension);\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,QAAQ,EAAEC,IAAI,QAAQ,OAAO;AAE7C,SAASC,OAAO,QAAQ,iBAAiB;AACzC,SAASC,QAAQ,QAAQ,mBAAmB;AAC5C,SAASC,yBAAyB,QAAQ,aAAa;AACvD,SAASC,WAAW;AACpB,OAAOC,cAAc;AACrB,SAASC,oBAAoB;AAC7B,OAAOC,UAAU;AACjB,SAASC,sBAAsB;AAC/B,SAASC,2BAA2B;AACpC,SAASC,YAAY;AACrB,SAASC,qBAAqB;AAM9B,MAAMC,yBAAyB,GAC1BC,kBAAsC,IACtCC,SAAuD,IAAK;EACzD,OAAO,SAASC,mBAAmBA,CAAC;IAAEC;EAA8B,CAAC,EAAE;IACnE,oBACIlB,KAAA,CAAAmB,aAAA,CAACb,WAAW;MAACS,kBAAkB,EAAEA;IAAmB,gBAChDf,KAAA,CAAAmB,aAAA,CAACH,SAAS,QAAEE,QAAoB,CACvB,CAAC;EAEtB,CAAC;AACL,CAAC;AAcL;AACA;AACA;AACA;AACA;AACA,MAAME,cAAc,GAAG,CAAC,iBAAiB,EAAE,UAAU,CAAC;AAEtD,MAAMC,oBAAoB,GAAGA,CAAC;EAAEN;AAAqC,CAAC,KAAK;EACvEZ,OAAO,CAACmB,QAAQ,CAACf,cAAc,CAAC;EAChCJ,OAAO,CAACmB,QAAQ,CAACb,UAAU,CAAC;EAE5BN,OAAO,CAACmB,QAAQ,CACZ,IAAIjB,yBAAyB,CAACkB,GAAG,IAAI;IACjC,IAAIA,GAAG,CAACC,UAAU,KAAK,sBAAsB,EAAE;MAC3C,OAAO,IAAI;IACf,CAAC,MAAM,IAAID,GAAG,CAACC,UAAU,IAAIJ,cAAc,CAACK,QAAQ,CAACF,GAAG,CAACC,UAAU,CAAC,EAAE;MAClE,OAAO,GAAGD,GAAG,CAACC,UAAU,IAAID,GAAG,CAACG,EAAE,EAAE;IACxC;IAEA,OAAOC,SAAS;EACpB,CAAC,CACL,CAAC;EAED,oBACI3B,KAAA,CAAAmB,aAAA,CAAClB,QAAQ,qBACLD,KAAA,CAAAmB,aAAA,CAACP,YAAY,MAAE,CAAC,eAChBZ,KAAA,CAAAmB,aAAA,CAACX,oBAAoB,MAAE,CAAC,eACxBR,KAAA,CAAAmB,aAAA,CAACR,2BAA2B,MAAE,CAAC,eAC/BX,KAAA,CAAAmB,aAAA,CAACf,QAAQ;IAACwB,GAAG,EAAEd,yBAAyB,CAACC,kBAAkB;EAAE,CAAE,CAAC,eAChEf,KAAA,CAAAmB,aAAA,CAACT,sBAAsB,MAAE,CAAC,eAC1BV,KAAA,CAAAmB,aAAA,CAACN,qBAAqB,MAAE,CAClB,CAAC;AAEnB,CAAC;AAED,OAAO,MAAMgB,WAAW,gBAAG3B,IAAI,CAACmB,oBAAoB,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { IconButton, Tooltip } from "@webiny/admin-ui";
|
|
3
|
+
import { ReactComponent as RefreshIcon } from "@webiny/icons/autorenew.svg";
|
|
4
|
+
import { useContentEntriesList } from "../../../../views/contentEntries/hooks/index.js";
|
|
5
|
+
export const ButtonRefresh = () => {
|
|
6
|
+
const list = useContentEntriesList();
|
|
7
|
+
return /*#__PURE__*/React.createElement(Tooltip, {
|
|
8
|
+
side: "bottom",
|
|
9
|
+
content: "Refresh list",
|
|
10
|
+
trigger: /*#__PURE__*/React.createElement(IconButton, {
|
|
11
|
+
variant: "ghost",
|
|
12
|
+
icon: /*#__PURE__*/React.createElement(RefreshIcon, null),
|
|
13
|
+
onClick: list.refresh
|
|
14
|
+
})
|
|
15
|
+
});
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
//# sourceMappingURL=ButtonRefresh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","IconButton","Tooltip","ReactComponent","RefreshIcon","useContentEntriesList","ButtonRefresh","list","createElement","side","content","trigger","variant","icon","onClick","refresh"],"sources":["ButtonRefresh.tsx"],"sourcesContent":["import React from \"react\";\nimport { IconButton, Tooltip } from \"@webiny/admin-ui\";\nimport { ReactComponent as RefreshIcon } from \"@webiny/icons/autorenew.svg\";\nimport { useContentEntriesList } from \"~/admin/views/contentEntries/hooks/index.js\";\n\nexport const ButtonRefresh = () => {\n const list = useContentEntriesList();\n\n return (\n <Tooltip\n side={\"bottom\"}\n content={\"Refresh list\"}\n trigger={<IconButton variant={\"ghost\"} icon={<RefreshIcon />} onClick={list.refresh} />}\n />\n );\n};\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,UAAU,EAAEC,OAAO,QAAQ,kBAAkB;AACtD,SAASC,cAAc,IAAIC,WAAW,QAAQ,6BAA6B;AAC3E,SAASC,qBAAqB;AAE9B,OAAO,MAAMC,aAAa,GAAGA,CAAA,KAAM;EAC/B,MAAMC,IAAI,GAAGF,qBAAqB,CAAC,CAAC;EAEpC,oBACIL,KAAA,CAAAQ,aAAA,CAACN,OAAO;IACJO,IAAI,EAAE,QAAS;IACfC,OAAO,EAAE,cAAe;IACxBC,OAAO,eAAEX,KAAA,CAAAQ,aAAA,CAACP,UAAU;MAACW,OAAO,EAAE,OAAQ;MAACC,IAAI,eAAEb,KAAA,CAAAQ,aAAA,CAACJ,WAAW,MAAE,CAAE;MAACU,OAAO,EAAEP,IAAI,CAACQ;IAAQ,CAAE;EAAE,CAC3F,CAAC;AAEV,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./ButtonRefresh.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["index.tsx"],"sourcesContent":["export * from \"./ButtonRefresh.js\";\n"],"mappings":"AAAA","ignoreList":[]}
|
|
@@ -3,6 +3,7 @@ import { Separator } from "@webiny/admin-ui";
|
|
|
3
3
|
import { Search } from "@webiny/app-aco";
|
|
4
4
|
import { ButtonFilters } from "./ButtonFilters/index.js";
|
|
5
5
|
import { ButtonsCreate } from "./ButtonsCreate/index.js";
|
|
6
|
+
import { ButtonRefresh } from "./ButtonRefresh/index.js";
|
|
6
7
|
import { Title } from "./Title/index.js";
|
|
7
8
|
export const Header = props => {
|
|
8
9
|
const {
|
|
@@ -32,7 +33,7 @@ export const Header = props => {
|
|
|
32
33
|
placeholder: searchPlaceholder || "Search entries..."
|
|
33
34
|
})), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
|
|
34
35
|
className: "flex gap-sm"
|
|
35
|
-
}, /*#__PURE__*/React.createElement(ButtonFilters, null), /*#__PURE__*/React.createElement(ButtonsCreate, {
|
|
36
|
+
}, /*#__PURE__*/React.createElement(ButtonRefresh, null), /*#__PURE__*/React.createElement(ButtonFilters, null), /*#__PURE__*/React.createElement(ButtonsCreate, {
|
|
36
37
|
canCreateFolder: canCreateFolder,
|
|
37
38
|
canCreateContent: canCreateContent,
|
|
38
39
|
onCreateFolder: onCreateFolder,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","Separator","Search","ButtonFilters","ButtonsCreate","Title","Header","props","canCreateFolder","canCreateContent","onCreateEntry","onCreateFolder","title","searchValue","searchPlaceholder","onSearchChange","createElement","Fragment","className","isRoot","value","onChange","placeholder"],"sources":["Header.tsx"],"sourcesContent":["import React from \"react\";\nimport { Separator } from \"@webiny/admin-ui\";\nimport { Search } from \"@webiny/app-aco\";\nimport { ButtonFilters } from \"./ButtonFilters/index.js\";\nimport { ButtonsCreate } from \"./ButtonsCreate/index.js\";\nimport { Title } from \"./Title/index.js\";\n\ninterface HeaderProps {\n isRoot: boolean;\n title?: string;\n canCreateFolder: boolean;\n canCreateContent: boolean;\n onCreateEntry: (event?: React.SyntheticEvent) => void;\n onCreateFolder: (event?: React.SyntheticEvent) => void;\n searchValue: string;\n searchPlaceholder: string;\n onSearchChange: (value: string) => void;\n}\n\nexport const Header = (props: HeaderProps) => {\n const {\n canCreateFolder,\n canCreateContent,\n onCreateEntry,\n onCreateFolder,\n title,\n searchValue,\n searchPlaceholder,\n onSearchChange\n } = props;\n\n return (\n <>\n <div className={\"flex flex-col gap-md\"}>\n <Title title={title} isRoot={props.isRoot} />\n <div className={\"px-md pb-sm\"}>\n <div className={\"flex items-center gap-sm w-full\"}>\n <div className={\"flex-1\"}>\n <Search\n value={searchValue}\n onChange={onSearchChange}\n placeholder={searchPlaceholder || \"Search entries...\"}\n />\n </div>\n <div>\n <div className={\"flex gap-sm\"}>\n <ButtonFilters />\n <ButtonsCreate\n canCreateFolder={canCreateFolder}\n canCreateContent={canCreateContent}\n onCreateFolder={onCreateFolder}\n onCreateEntry={onCreateEntry}\n />\n </div>\n </div>\n </div>\n </div>\n </div>\n <Separator />\n </>\n );\n};\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,SAAS,QAAQ,kBAAkB;AAC5C,SAASC,MAAM,QAAQ,iBAAiB;AACxC,SAASC,aAAa;AACtB,SAASC,aAAa;AACtB,SAASC,KAAK;AAcd,OAAO,MAAMC,MAAM,GAAIC,KAAkB,IAAK;EAC1C,MAAM;IACFC,eAAe;IACfC,gBAAgB;IAChBC,aAAa;IACbC,cAAc;IACdC,KAAK;IACLC,WAAW;IACXC,iBAAiB;IACjBC;EACJ,CAAC,GAAGR,KAAK;EAET,
|
|
1
|
+
{"version":3,"names":["React","Separator","Search","ButtonFilters","ButtonsCreate","ButtonRefresh","Title","Header","props","canCreateFolder","canCreateContent","onCreateEntry","onCreateFolder","title","searchValue","searchPlaceholder","onSearchChange","createElement","Fragment","className","isRoot","value","onChange","placeholder"],"sources":["Header.tsx"],"sourcesContent":["import React from \"react\";\nimport { Separator } from \"@webiny/admin-ui\";\nimport { Search } from \"@webiny/app-aco\";\nimport { ButtonFilters } from \"./ButtonFilters/index.js\";\nimport { ButtonsCreate } from \"./ButtonsCreate/index.js\";\nimport { ButtonRefresh } from \"./ButtonRefresh/index.js\";\nimport { Title } from \"./Title/index.js\";\n\ninterface HeaderProps {\n isRoot: boolean;\n title?: string;\n canCreateFolder: boolean;\n canCreateContent: boolean;\n onCreateEntry: (event?: React.SyntheticEvent) => void;\n onCreateFolder: (event?: React.SyntheticEvent) => void;\n searchValue: string;\n searchPlaceholder: string;\n onSearchChange: (value: string) => void;\n}\n\nexport const Header = (props: HeaderProps) => {\n const {\n canCreateFolder,\n canCreateContent,\n onCreateEntry,\n onCreateFolder,\n title,\n searchValue,\n searchPlaceholder,\n onSearchChange\n } = props;\n\n return (\n <>\n <div className={\"flex flex-col gap-md\"}>\n <Title title={title} isRoot={props.isRoot} />\n <div className={\"px-md pb-sm\"}>\n <div className={\"flex items-center gap-sm w-full\"}>\n <div className={\"flex-1\"}>\n <Search\n value={searchValue}\n onChange={onSearchChange}\n placeholder={searchPlaceholder || \"Search entries...\"}\n />\n </div>\n <div>\n <div className={\"flex gap-sm\"}>\n <ButtonRefresh />\n <ButtonFilters />\n <ButtonsCreate\n canCreateFolder={canCreateFolder}\n canCreateContent={canCreateContent}\n onCreateFolder={onCreateFolder}\n onCreateEntry={onCreateEntry}\n />\n </div>\n </div>\n </div>\n </div>\n </div>\n <Separator />\n </>\n );\n};\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,SAAS,QAAQ,kBAAkB;AAC5C,SAASC,MAAM,QAAQ,iBAAiB;AACxC,SAASC,aAAa;AACtB,SAASC,aAAa;AACtB,SAASC,aAAa;AACtB,SAASC,KAAK;AAcd,OAAO,MAAMC,MAAM,GAAIC,KAAkB,IAAK;EAC1C,MAAM;IACFC,eAAe;IACfC,gBAAgB;IAChBC,aAAa;IACbC,cAAc;IACdC,KAAK;IACLC,WAAW;IACXC,iBAAiB;IACjBC;EACJ,CAAC,GAAGR,KAAK;EAET,oBACIR,KAAA,CAAAiB,aAAA,CAAAjB,KAAA,CAAAkB,QAAA,qBACIlB,KAAA,CAAAiB,aAAA;IAAKE,SAAS,EAAE;EAAuB,gBACnCnB,KAAA,CAAAiB,aAAA,CAACX,KAAK;IAACO,KAAK,EAAEA,KAAM;IAACO,MAAM,EAAEZ,KAAK,CAACY;EAAO,CAAE,CAAC,eAC7CpB,KAAA,CAAAiB,aAAA;IAAKE,SAAS,EAAE;EAAc,gBAC1BnB,KAAA,CAAAiB,aAAA;IAAKE,SAAS,EAAE;EAAkC,gBAC9CnB,KAAA,CAAAiB,aAAA;IAAKE,SAAS,EAAE;EAAS,gBACrBnB,KAAA,CAAAiB,aAAA,CAACf,MAAM;IACHmB,KAAK,EAAEP,WAAY;IACnBQ,QAAQ,EAAEN,cAAe;IACzBO,WAAW,EAAER,iBAAiB,IAAI;EAAoB,CACzD,CACA,CAAC,eACNf,KAAA,CAAAiB,aAAA,2BACIjB,KAAA,CAAAiB,aAAA;IAAKE,SAAS,EAAE;EAAc,gBAC1BnB,KAAA,CAAAiB,aAAA,CAACZ,aAAa,MAAE,CAAC,eACjBL,KAAA,CAAAiB,aAAA,CAACd,aAAa,MAAE,CAAC,eACjBH,KAAA,CAAAiB,aAAA,CAACb,aAAa;IACVK,eAAe,EAAEA,eAAgB;IACjCC,gBAAgB,EAAEA,gBAAiB;IACnCE,cAAc,EAAEA,cAAe;IAC/BD,aAAa,EAAEA;EAAc,CAChC,CACA,CACJ,CACJ,CACJ,CACJ,CAAC,eACNX,KAAA,CAAAiB,aAAA,CAAChB,SAAS,MAAE,CACd,CAAC;AAEX,CAAC","ignoreList":[]}
|
package/admin/components/ContentEntries/Scheduler/adapters/SchedulerPublishGraphQLGateway.js
CHANGED
|
@@ -54,13 +54,7 @@ export class SchedulerPublishGraphQLGateway {
|
|
|
54
54
|
}
|
|
55
55
|
const validated = await schema.safeParseAsync(result);
|
|
56
56
|
if (!validated.success) {
|
|
57
|
-
|
|
58
|
-
console.error({
|
|
59
|
-
err,
|
|
60
|
-
errS: JSON.stringify(err),
|
|
61
|
-
error: JSON.stringify(validated.error)
|
|
62
|
-
});
|
|
63
|
-
throw err;
|
|
57
|
+
throw createZodError(validated.error);
|
|
64
58
|
}
|
|
65
59
|
return {
|
|
66
60
|
item: validated.data.data
|
package/admin/components/ContentEntries/Scheduler/adapters/SchedulerPublishGraphQLGateway.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["zod","schedulerEntrySchema","createZodError","gql","ScheduleType","createSchedulerEntryFields","createSchedulerPublishMutation","schema","object","data","SchedulerPublishGraphQLGateway","constructor","client","execute","params","response","errors","mutate","mutation","variables","modelId","id","scheduleFor","scheduleOn","type","publish","fetchPolicy","result","createCmsSchedule","length","console","error","Error","message","validated","safeParseAsync","success","
|
|
1
|
+
{"version":3,"names":["zod","schedulerEntrySchema","createZodError","gql","ScheduleType","createSchedulerEntryFields","createSchedulerPublishMutation","schema","object","data","SchedulerPublishGraphQLGateway","constructor","client","execute","params","response","errors","mutate","mutation","variables","modelId","id","scheduleFor","scheduleOn","type","publish","fetchPolicy","result","createCmsSchedule","length","console","error","Error","message","validated","safeParseAsync","success","item"],"sources":["SchedulerPublishGraphQLGateway.ts"],"sourcesContent":["import type { ApolloClient } from \"apollo-client\";\nimport type { CmsErrorResponse } from \"@webiny/app-headless-cms-common/types/index.js\";\nimport zod from \"zod\";\nimport { schedulerEntrySchema } from \"./schema/schedulerEntry.js\";\nimport { createZodError } from \"@webiny/utils/createZodError.js\";\nimport gql from \"graphql-tag\";\nimport type { SchedulerEntry } from \"@webiny/app-headless-cms-scheduler/types.js\";\nimport { ScheduleType } from \"@webiny/app-headless-cms-scheduler/types.js\";\nimport type {\n ISchedulerPublishExecuteParams,\n ISchedulerPublishGateway,\n ISchedulerPublishGatewayResponse\n} from \"@webiny/app-headless-cms-scheduler\";\nimport { createSchedulerEntryFields } from \"./graphql/fields.js\";\n\nconst createSchedulerPublishMutation = () => {\n return gql`\n mutation SchedulerPublish($modelId: String!, $id: ID!, $scheduleFor: DateTime, $type: CmsScheduleRecordType!) {\n createCmsSchedule(modelId: $modelId, id: $id, scheduleFor: $scheduleFor, type: $type) {\n data {\n ${createSchedulerEntryFields()}\n }\n error {\n message\n code\n data\n stack\n }\n }\n }\n `;\n};\n\ninterface SchedulerPublishGraphQLMutationVariables {\n modelId: string;\n id: string;\n scheduleFor: Date;\n type: ScheduleType.publish;\n}\n\ninterface SchedulerPublishGraphQLMutationResponse {\n createCmsSchedule: {\n data: SchedulerEntry | null;\n error: CmsErrorResponse | null;\n };\n}\n\nconst schema = zod.object({\n data: schedulerEntrySchema\n});\n\nexport class SchedulerPublishGraphQLGateway implements ISchedulerPublishGateway {\n private readonly client: ApolloClient<any>;\n\n public constructor(client: ApolloClient<any>) {\n this.client = client;\n }\n\n public async execute(\n params: ISchedulerPublishExecuteParams\n ): Promise<ISchedulerPublishGatewayResponse> {\n const { data: response, errors } = await this.client.mutate<\n SchedulerPublishGraphQLMutationResponse,\n SchedulerPublishGraphQLMutationVariables\n >({\n mutation: createSchedulerPublishMutation(),\n variables: {\n modelId: params.modelId,\n id: params.id,\n scheduleFor: params.scheduleOn,\n type: ScheduleType.publish\n },\n fetchPolicy: \"no-cache\"\n });\n\n const result = response?.createCmsSchedule;\n if (!result || errors?.length) {\n console.error({\n errors\n });\n throw new Error(\"Network error while creating a schedule.\");\n }\n\n if (!result.data) {\n throw new Error(result.error?.message || \"Could not schedule entry to be published.\");\n }\n\n const validated = await schema.safeParseAsync(result);\n if (!validated.success) {\n throw createZodError(validated.error);\n }\n return {\n item: validated.data.data\n };\n }\n}\n"],"mappings":"AAEA,OAAOA,GAAG,MAAM,KAAK;AACrB,SAASC,oBAAoB;AAC7B,SAASC,cAAc,QAAQ,iCAAiC;AAChE,OAAOC,GAAG,MAAM,aAAa;AAE7B,SAASC,YAAY,QAAQ,6CAA6C;AAM1E,SAASC,0BAA0B;AAEnC,MAAMC,8BAA8B,GAAGA,CAAA,KAAM;EACzC,OAAOH,GAAG;AACd;AACA;AACA;AACA,sBAAsBE,0BAA0B,CAAC,CAAC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,CAAC;AAgBD,MAAME,MAAM,GAAGP,GAAG,CAACQ,MAAM,CAAC;EACtBC,IAAI,EAAER;AACV,CAAC,CAAC;AAEF,OAAO,MAAMS,8BAA8B,CAAqC;EAGrEC,WAAWA,CAACC,MAAyB,EAAE;IAC1C,IAAI,CAACA,MAAM,GAAGA,MAAM;EACxB;EAEA,MAAaC,OAAOA,CAChBC,MAAsC,EACG;IACzC,MAAM;MAAEL,IAAI,EAAEM,QAAQ;MAAEC;IAAO,CAAC,GAAG,MAAM,IAAI,CAACJ,MAAM,CAACK,MAAM,CAGzD;MACEC,QAAQ,EAAEZ,8BAA8B,CAAC,CAAC;MAC1Ca,SAAS,EAAE;QACPC,OAAO,EAAEN,MAAM,CAACM,OAAO;QACvBC,EAAE,EAAEP,MAAM,CAACO,EAAE;QACbC,WAAW,EAAER,MAAM,CAACS,UAAU;QAC9BC,IAAI,EAAEpB,YAAY,CAACqB;MACvB,CAAC;MACDC,WAAW,EAAE;IACjB,CAAC,CAAC;IAEF,MAAMC,MAAM,GAAGZ,QAAQ,EAAEa,iBAAiB;IAC1C,IAAI,CAACD,MAAM,IAAIX,MAAM,EAAEa,MAAM,EAAE;MAC3BC,OAAO,CAACC,KAAK,CAAC;QACVf;MACJ,CAAC,CAAC;MACF,MAAM,IAAIgB,KAAK,CAAC,0CAA0C,CAAC;IAC/D;IAEA,IAAI,CAACL,MAAM,CAAClB,IAAI,EAAE;MACd,MAAM,IAAIuB,KAAK,CAACL,MAAM,CAACI,KAAK,EAAEE,OAAO,IAAI,2CAA2C,CAAC;IACzF;IAEA,MAAMC,SAAS,GAAG,MAAM3B,MAAM,CAAC4B,cAAc,CAACR,MAAM,CAAC;IACrD,IAAI,CAACO,SAAS,CAACE,OAAO,EAAE;MACpB,MAAMlC,cAAc,CAACgC,SAAS,CAACH,KAAK,CAAC;IACzC;IACA,OAAO;MACHM,IAAI,EAAEH,SAAS,CAACzB,IAAI,CAACA;IACzB,CAAC;EACL;AACJ","ignoreList":[]}
|
|
@@ -10,7 +10,7 @@ export const SidebarContent = () => {
|
|
|
10
10
|
currentFolderId
|
|
11
11
|
} = useNavigateFolder();
|
|
12
12
|
return /*#__PURE__*/React.createElement("div", {
|
|
13
|
-
className: "
|
|
13
|
+
className: "flex-1 overflow-y-scroll"
|
|
14
14
|
}, /*#__PURE__*/React.createElement(FolderTree, {
|
|
15
15
|
folderActions: browser.folder.actions,
|
|
16
16
|
focusedFolderId: currentFolderId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","FolderTree","useNavigateFolder","useContentEntryListConfig","SidebarContent","browser","navigateToFolder","currentFolderId","createElement","className","folderActions","folder","actions","focusedFolderId","onFolderClick","data","id","enableActions","enableCreate"],"sources":["SidebarContent.tsx"],"sourcesContent":["import React from \"react\";\nimport { FolderTree, useNavigateFolder } from \"@webiny/app-aco\";\nimport { useContentEntryListConfig } from \"~/admin/config/contentEntries/index.js\";\n\nexport const SidebarContent = () => {\n const { browser } = useContentEntryListConfig();\n const { navigateToFolder, currentFolderId } = useNavigateFolder();\n\n return (\n <div className={\"
|
|
1
|
+
{"version":3,"names":["React","FolderTree","useNavigateFolder","useContentEntryListConfig","SidebarContent","browser","navigateToFolder","currentFolderId","createElement","className","folderActions","folder","actions","focusedFolderId","onFolderClick","data","id","enableActions","enableCreate"],"sources":["SidebarContent.tsx"],"sourcesContent":["import React from \"react\";\nimport { FolderTree, useNavigateFolder } from \"@webiny/app-aco\";\nimport { useContentEntryListConfig } from \"~/admin/config/contentEntries/index.js\";\n\nexport const SidebarContent = () => {\n const { browser } = useContentEntryListConfig();\n const { navigateToFolder, currentFolderId } = useNavigateFolder();\n\n return (\n <div className={\"flex-1 overflow-y-scroll\"}>\n <FolderTree\n folderActions={browser.folder.actions}\n focusedFolderId={currentFolderId}\n onFolderClick={data => navigateToFolder(data.id)}\n enableActions={true}\n enableCreate={true}\n />\n </div>\n );\n};\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,UAAU,EAAEC,iBAAiB,QAAQ,iBAAiB;AAC/D,SAASC,yBAAyB;AAElC,OAAO,MAAMC,cAAc,GAAGA,CAAA,KAAM;EAChC,MAAM;IAAEC;EAAQ,CAAC,GAAGF,yBAAyB,CAAC,CAAC;EAC/C,MAAM;IAAEG,gBAAgB;IAAEC;EAAgB,CAAC,GAAGL,iBAAiB,CAAC,CAAC;EAEjE,oBACIF,KAAA,CAAAQ,aAAA;IAAKC,SAAS,EAAE;EAA2B,gBACvCT,KAAA,CAAAQ,aAAA,CAACP,UAAU;IACPS,aAAa,EAAEL,OAAO,CAACM,MAAM,CAACC,OAAQ;IACtCC,eAAe,EAAEN,eAAgB;IACjCO,aAAa,EAAEC,IAAI,IAAIT,gBAAgB,CAACS,IAAI,CAACC,EAAE,CAAE;IACjDC,aAAa,EAAE,IAAK;IACpBC,YAAY,EAAE;EAAK,CACtB,CACA,CAAC;AAEd,CAAC","ignoreList":[]}
|
|
@@ -7,7 +7,7 @@ export const SidebarHeader = () => {
|
|
|
7
7
|
model
|
|
8
8
|
} = useModel();
|
|
9
9
|
return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
|
|
10
|
-
className: "
|
|
10
|
+
className: "py-sm px-md"
|
|
11
11
|
}, /*#__PURE__*/React.createElement(Heading, {
|
|
12
12
|
level: 5
|
|
13
13
|
}, model.pluralApiName), /*#__PURE__*/React.createElement(IsModelPublishable, null, /*#__PURE__*/React.createElement(Text, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","Heading","Link","Separator","Text","Tooltip","useModel","IsModelPublishable","SidebarHeader","model","createElement","className","level","pluralApiName","size","plugin","side","content","trigger","modelId","to","variant"],"sources":["SidebarHeader.tsx"],"sourcesContent":["import React from \"react\";\nimport { Heading, Link, Separator, Text, Tooltip } from \"@webiny/admin-ui\";\nimport { useModel } from \"@webiny/app-headless-cms-common\";\nimport { IsModelPublishable } from \"~/admin/components/IsModelPublishable.js\";\n\nexport const SidebarHeader = () => {\n const { model } = useModel();\n\n return (\n <div>\n <div className={\"
|
|
1
|
+
{"version":3,"names":["React","Heading","Link","Separator","Text","Tooltip","useModel","IsModelPublishable","SidebarHeader","model","createElement","className","level","pluralApiName","size","plugin","side","content","trigger","modelId","to","variant"],"sources":["SidebarHeader.tsx"],"sourcesContent":["import React from \"react\";\nimport { Heading, Link, Separator, Text, Tooltip } from \"@webiny/admin-ui\";\nimport { useModel } from \"@webiny/app-headless-cms-common\";\nimport { IsModelPublishable } from \"~/admin/components/IsModelPublishable.js\";\n\nexport const SidebarHeader = () => {\n const { model } = useModel();\n\n return (\n <div>\n <div className={\"py-sm px-md\"}>\n <Heading level={5}>{model.pluralApiName}</Heading>\n <IsModelPublishable>\n <Text size={\"sm\"} className={\"text-neutral-muted\"}>\n Model ID:{\" \"}\n {model.plugin ? (\n <Tooltip\n side={\"top\"}\n content={\"Content model is registered via a plugin.\"}\n trigger={model.modelId}\n />\n ) : (\n <Tooltip\n content={\"Edit content model\"}\n side={\"top\"}\n trigger={\n <Link\n to={`/cms/content-models/${model.modelId}`}\n variant={\"secondary\"}\n className={\"text-neutral-muted hover:text-neutral-strong\"}\n >\n {model.modelId}\n </Link>\n }\n />\n )}\n </Text>\n </IsModelPublishable>\n </div>\n <Separator />\n </div>\n );\n};\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,OAAO,EAAEC,IAAI,EAAEC,SAAS,EAAEC,IAAI,EAAEC,OAAO,QAAQ,kBAAkB;AAC1E,SAASC,QAAQ,QAAQ,iCAAiC;AAC1D,SAASC,kBAAkB;AAE3B,OAAO,MAAMC,aAAa,GAAGA,CAAA,KAAM;EAC/B,MAAM;IAAEC;EAAM,CAAC,GAAGH,QAAQ,CAAC,CAAC;EAE5B,oBACIN,KAAA,CAAAU,aAAA,2BACIV,KAAA,CAAAU,aAAA;IAAKC,SAAS,EAAE;EAAc,gBAC1BX,KAAA,CAAAU,aAAA,CAACT,OAAO;IAACW,KAAK,EAAE;EAAE,GAAEH,KAAK,CAACI,aAAuB,CAAC,eAClDb,KAAA,CAAAU,aAAA,CAACH,kBAAkB,qBACfP,KAAA,CAAAU,aAAA,CAACN,IAAI;IAACU,IAAI,EAAE,IAAK;IAACH,SAAS,EAAE;EAAqB,GAAC,WACtC,EAAC,GAAG,EACZF,KAAK,CAACM,MAAM,gBACTf,KAAA,CAAAU,aAAA,CAACL,OAAO;IACJW,IAAI,EAAE,KAAM;IACZC,OAAO,EAAE,2CAA4C;IACrDC,OAAO,EAAET,KAAK,CAACU;EAAQ,CAC1B,CAAC,gBAEFnB,KAAA,CAAAU,aAAA,CAACL,OAAO;IACJY,OAAO,EAAE,oBAAqB;IAC9BD,IAAI,EAAE,KAAM;IACZE,OAAO,eACHlB,KAAA,CAAAU,aAAA,CAACR,IAAI;MACDkB,EAAE,EAAE,uBAAuBX,KAAK,CAACU,OAAO,EAAG;MAC3CE,OAAO,EAAE,WAAY;MACrBV,SAAS,EAAE;IAA+C,GAEzDF,KAAK,CAACU,OACL;EACT,CACJ,CAEH,CACU,CACnB,CAAC,eACNnB,KAAA,CAAAU,aAAA,CAACP,SAAS,MAAE,CACX,CAAC;AAEd,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { ContentEntryListConfig } from "../../../../config/contentEntries/index.js";
|
|
3
|
+
import { Tag } from "@webiny/admin-ui";
|
|
4
|
+
export const CellLive = () => {
|
|
5
|
+
const {
|
|
6
|
+
useTableRow,
|
|
7
|
+
isFolderRow
|
|
8
|
+
} = ContentEntryListConfig.Browser.Table.Column;
|
|
9
|
+
const {
|
|
10
|
+
row
|
|
11
|
+
} = useTableRow();
|
|
12
|
+
if (isFolderRow(row)) {
|
|
13
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, "-");
|
|
14
|
+
}
|
|
15
|
+
const entry = row.data;
|
|
16
|
+
if (!entry.live?.version) {
|
|
17
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, "No");
|
|
18
|
+
}
|
|
19
|
+
return /*#__PURE__*/React.createElement(Tag, {
|
|
20
|
+
swatchColor: "#5AC84C",
|
|
21
|
+
variant: "success-light",
|
|
22
|
+
content: `Live (v${entry.live.version})`
|
|
23
|
+
});
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
//# sourceMappingURL=CellLive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","ContentEntryListConfig","Tag","CellLive","useTableRow","isFolderRow","Browser","Table","Column","row","createElement","Fragment","entry","data","live","version","swatchColor","variant","content"],"sources":["CellLive.tsx"],"sourcesContent":["import React from \"react\";\nimport { ContentEntryListConfig } from \"~/admin/config/contentEntries/index.js\";\nimport { Tag } from \"@webiny/admin-ui\";\n\nexport const CellLive = () => {\n const { useTableRow, isFolderRow } = ContentEntryListConfig.Browser.Table.Column;\n const { row } = useTableRow();\n\n if (isFolderRow(row)) {\n return <>{\"-\"}</>;\n }\n\n const entry = row.data;\n if (!entry.live?.version) {\n return <>No</>;\n }\n\n return (\n <Tag\n swatchColor={\"#5AC84C\"}\n variant={\"success-light\"}\n content={`Live (v${entry.live.version})`}\n />\n );\n};\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,sBAAsB;AAC/B,SAASC,GAAG,QAAQ,kBAAkB;AAEtC,OAAO,MAAMC,QAAQ,GAAGA,CAAA,KAAM;EAC1B,MAAM;IAAEC,WAAW;IAAEC;EAAY,CAAC,GAAGJ,sBAAsB,CAACK,OAAO,CAACC,KAAK,CAACC,MAAM;EAChF,MAAM;IAAEC;EAAI,CAAC,GAAGL,WAAW,CAAC,CAAC;EAE7B,IAAIC,WAAW,CAACI,GAAG,CAAC,EAAE;IAClB,oBAAOT,KAAA,CAAAU,aAAA,CAAAV,KAAA,CAAAW,QAAA,QAAG,GAAM,CAAC;EACrB;EAEA,MAAMC,KAAK,GAAGH,GAAG,CAACI,IAAI;EACtB,IAAI,CAACD,KAAK,CAACE,IAAI,EAAEC,OAAO,EAAE;IACtB,oBAAOf,KAAA,CAAAU,aAAA,CAAAV,KAAA,CAAAW,QAAA,QAAE,IAAI,CAAC;EAClB;EAEA,oBACIX,KAAA,CAAAU,aAAA,CAACR,GAAG;IACAc,WAAW,EAAE,SAAU;IACvBC,OAAO,EAAE,eAAgB;IACzBC,OAAO,EAAE,UAAUN,KAAK,CAACE,IAAI,CAACC,OAAO;EAAI,CAC5C,CAAC;AAEV,CAAC","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["index.ts"],"sourcesContent":["export * from \"./CellActions.js\";\nexport * from \"./CellAuthor.js\";\nexport * from \"./CellCreated.js\";\nexport * from \"./CellModified.js\";\nexport * from \"./CellName.js\";\nexport * from \"./CellStatus.js\";\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["index.ts"],"sourcesContent":["export * from \"./CellActions.js\";\nexport * from \"./CellAuthor.js\";\nexport * from \"./CellCreated.js\";\nexport * from \"./CellLive.js\";\nexport * from \"./CellModified.js\";\nexport * from \"./CellName.js\";\nexport * from \"./CellStatus.js\";\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA","ignoreList":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React, { useState, useEffect } from "react";
|
|
2
2
|
import { makeDecoratable, NavigationPrompt, LeftPanel, RightPanel, SplitView } from "@webiny/app-admin";
|
|
3
3
|
import { i18n } from "@webiny/app/i18n/index.js";
|
|
4
|
-
import { Heading, OverlayLoader,
|
|
4
|
+
import { Heading, OverlayLoader, Tabs, Text, TimeAgo } from "@webiny/admin-ui";
|
|
5
5
|
import { ReactComponent as EditIcon } from "@webiny/icons/edit.svg";
|
|
6
6
|
import { ReactComponent as PreviewIcon } from "@webiny/icons/fullscreen.svg";
|
|
7
7
|
import { FieldsSidebar } from "./FieldsSidebar.js";
|
|
@@ -62,11 +62,6 @@ export const ContentModelEditor = makeDecoratable("ContentModelEditor", () => {
|
|
|
62
62
|
span: 4,
|
|
63
63
|
className: "bg-neutral-light"
|
|
64
64
|
}, /*#__PURE__*/React.createElement("div", {
|
|
65
|
-
className: "px-lg py-md"
|
|
66
|
-
}, /*#__PURE__*/React.createElement(Text, {
|
|
67
|
-
as: "div",
|
|
68
|
-
className: "uppercase font-semibold text-neutral-xstrong"
|
|
69
|
-
}, "Fields")), /*#__PURE__*/React.createElement(Separator, null), /*#__PURE__*/React.createElement("div", {
|
|
70
65
|
className: "px-lg py-md h-[calc(100vh-98px)] overflow-y-scroll"
|
|
71
66
|
}, /*#__PURE__*/React.createElement(FieldsSidebar, {
|
|
72
67
|
onFieldDragStart: () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useState","useEffect","makeDecoratable","NavigationPrompt","LeftPanel","RightPanel","SplitView","i18n","Heading","OverlayLoader","Separator","Tabs","Text","TimeAgo","ReactComponent","EditIcon","PreviewIcon","FieldsSidebar","FieldEditor","PreviewTab","Header","DragPreview","useModelEditor","ContentEntryEditorWithConfig","ContentEntryProvider","ContentEntriesProvider","ModelIsBeingDeletedError","t","ns","prompt","ContentModelEditor","data","setData","isPristine","contentModel","document","body","classList","add","remove","activeTab","setActiveTab","onChange","fields","layout","createElement","text","isBeingDeleted","model","className","when","message","span","as","onFieldDragStart","level","name","size","createdBy","displayName","datetime","savedOn","spacing","separator","value","String","onValueChange","tabs","Tab","key","trigger","icon","content","readonly"],"sources":["ContentModelEditor.tsx"],"sourcesContent":["import React, { useState, useEffect } from \"react\";\nimport {\n makeDecoratable,\n NavigationPrompt,\n LeftPanel,\n RightPanel,\n SplitView\n} from \"@webiny/app-admin\";\nimport { i18n } from \"@webiny/app/i18n/index.js\";\nimport { Heading, OverlayLoader, Separator, Tabs, Text, TimeAgo } from \"@webiny/admin-ui\";\nimport { ReactComponent as EditIcon } from \"@webiny/icons/edit.svg\";\nimport { ReactComponent as PreviewIcon } from \"@webiny/icons/fullscreen.svg\";\nimport { FieldsSidebar } from \"./FieldsSidebar.js\";\nimport { FieldEditor } from \"../FieldEditor/index.js\";\nimport { PreviewTab } from \"./PreviewTab.js\";\nimport Header from \"./Header.js\";\nimport DragPreview from \"../DragPreview.js\";\nimport { useModelEditor } from \"./useModelEditor.js\";\nimport type { CmsEditorFieldsLayout, CmsModelField } from \"~/types.js\";\nimport { ContentEntryEditorWithConfig } from \"~/admin/config/contentEntries/index.js\";\nimport { ContentEntryProvider } from \"~/admin/views/contentEntries/ContentEntry/ContentEntryContext.js\";\nimport { ContentEntriesProvider } from \"~/admin/views/contentEntries/ContentEntriesContext.js\";\nimport { ModelIsBeingDeletedError } from \"~/admin/components/ContentModelEditor/ModelIsBeingDeletedError/index.js\";\n\nconst t = i18n.ns(\"app-headless-cms/admin/editor\");\n\nconst prompt = t`There are some unsaved changes! Are you sure you want to navigate away and discard all changes?`;\n\ninterface OnChangeParams {\n fields: CmsModelField[];\n layout: CmsEditorFieldsLayout;\n}\n\nexport const ContentModelEditor = makeDecoratable(\"ContentModelEditor\", () => {\n const { data, setData, isPristine, contentModel } = useModelEditor();\n\n // Add a class to <body> to trigger global styles while this component is active\n useEffect(() => {\n document.body.classList.add(\"overflow-hidden\");\n\n return () => {\n document.body.classList.remove(\"overflow-hidden\");\n };\n }, []);\n\n const [activeTab, setActiveTab] = useState<string>(\"edit\");\n\n const onChange = ({ fields, layout }: OnChangeParams) => {\n setData(data => ({ ...data, fields, layout }));\n };\n\n if (!data) {\n return <OverlayLoader text={\"Loading content model...\"} />;\n } else if (data.isBeingDeleted) {\n return <ModelIsBeingDeletedError model={data} />;\n }\n\n return (\n <div className={\"content-model-editor flex-1\"}>\n <NavigationPrompt when={!isPristine} message={prompt} />\n <Header />\n <div className={\"w-full overflow-y-auto h-main-content\"}>\n <SplitView>\n <LeftPanel span={4} className={\"bg-neutral-light\"}>\n <div className={\"px-lg py-md\"}>\n <Text\n as={\"div\"}\n className={\"uppercase font-semibold text-neutral-xstrong\"}\n >\n {\"Fields\"}\n </Text>\n </div>\n <Separator />\n <div className={\"px-lg py-md h-[calc(100vh-98px)] overflow-y-scroll\"}>\n <FieldsSidebar\n onFieldDragStart={() => {\n setActiveTab(\"edit\");\n }}\n />\n </div>\n </LeftPanel>\n <RightPanel span={8} className={\"bg-neutral-base\"}>\n <div className={\"h-full overflow-y-scroll\"}>\n {contentModel && (\n <div className={\"px-xl pt-lg pb-md-extra\"}>\n <Heading level={4}>{contentModel.name}</Heading>\n <Text size={\"sm\"} className={\"text-neutral-muted\"}>\n {`Created by ${contentModel.createdBy.displayName}. Last modified: `}\n <TimeAgo datetime={contentModel.savedOn} />.\n </Text>\n </div>\n )}\n <Tabs\n size={\"md\"}\n spacing={\"xl\"}\n separator={true}\n value={String(activeTab)}\n onValueChange={setActiveTab}\n tabs={[\n <Tabs.Tab\n key={\"edit\"}\n value={\"edit\"}\n trigger={\"Edit\"}\n icon={<EditIcon />}\n data-testid={\"cms.editor.tab.edit\"}\n content={\n <div className={\"relative mb-lg\"}>\n <FieldEditor\n fields={data.fields}\n layout={data.layout || []}\n onChange={onChange}\n />\n </div>\n }\n />,\n <Tabs.Tab\n key={\"preview\"}\n value={\"preview\"}\n trigger={\"Preview\"}\n icon={<PreviewIcon />}\n data-testid={\"cms.editor.tab.preview\"}\n content={\n <ContentEntryEditorWithConfig>\n <ContentEntriesProvider contentModel={data}>\n <ContentEntryProvider readonly={true}>\n <PreviewTab\n activeTab={activeTab === \"preview\"}\n />\n </ContentEntryProvider>\n </ContentEntriesProvider>\n </ContentEntryEditorWithConfig>\n }\n />\n ]}\n />\n </div>\n </RightPanel>\n </SplitView>\n <DragPreview />\n </div>\n </div>\n );\n});\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["React","useState","useEffect","makeDecoratable","NavigationPrompt","LeftPanel","RightPanel","SplitView","i18n","Heading","OverlayLoader","Tabs","Text","TimeAgo","ReactComponent","EditIcon","PreviewIcon","FieldsSidebar","FieldEditor","PreviewTab","Header","DragPreview","useModelEditor","ContentEntryEditorWithConfig","ContentEntryProvider","ContentEntriesProvider","ModelIsBeingDeletedError","t","ns","prompt","ContentModelEditor","data","setData","isPristine","contentModel","document","body","classList","add","remove","activeTab","setActiveTab","onChange","fields","layout","createElement","text","isBeingDeleted","model","className","when","message","span","onFieldDragStart","level","name","size","createdBy","displayName","datetime","savedOn","spacing","separator","value","String","onValueChange","tabs","Tab","key","trigger","icon","content","readonly"],"sources":["ContentModelEditor.tsx"],"sourcesContent":["import React, { useState, useEffect } from \"react\";\nimport {\n makeDecoratable,\n NavigationPrompt,\n LeftPanel,\n RightPanel,\n SplitView\n} from \"@webiny/app-admin\";\nimport { i18n } from \"@webiny/app/i18n/index.js\";\nimport { Heading, OverlayLoader, Tabs, Text, TimeAgo } from \"@webiny/admin-ui\";\nimport { ReactComponent as EditIcon } from \"@webiny/icons/edit.svg\";\nimport { ReactComponent as PreviewIcon } from \"@webiny/icons/fullscreen.svg\";\nimport { FieldsSidebar } from \"./FieldsSidebar.js\";\nimport { FieldEditor } from \"../FieldEditor/index.js\";\nimport { PreviewTab } from \"./PreviewTab.js\";\nimport Header from \"./Header.js\";\nimport DragPreview from \"../DragPreview.js\";\nimport { useModelEditor } from \"./useModelEditor.js\";\nimport type { CmsEditorFieldsLayout, CmsModelField } from \"~/types.js\";\nimport { ContentEntryEditorWithConfig } from \"~/admin/config/contentEntries/index.js\";\nimport { ContentEntryProvider } from \"~/admin/views/contentEntries/ContentEntry/ContentEntryContext.js\";\nimport { ContentEntriesProvider } from \"~/admin/views/contentEntries/ContentEntriesContext.js\";\nimport { ModelIsBeingDeletedError } from \"~/admin/components/ContentModelEditor/ModelIsBeingDeletedError/index.js\";\n\nconst t = i18n.ns(\"app-headless-cms/admin/editor\");\n\nconst prompt = t`There are some unsaved changes! Are you sure you want to navigate away and discard all changes?`;\n\ninterface OnChangeParams {\n fields: CmsModelField[];\n layout: CmsEditorFieldsLayout;\n}\n\nexport const ContentModelEditor = makeDecoratable(\"ContentModelEditor\", () => {\n const { data, setData, isPristine, contentModel } = useModelEditor();\n\n // Add a class to <body> to trigger global styles while this component is active\n useEffect(() => {\n document.body.classList.add(\"overflow-hidden\");\n\n return () => {\n document.body.classList.remove(\"overflow-hidden\");\n };\n }, []);\n\n const [activeTab, setActiveTab] = useState<string>(\"edit\");\n\n const onChange = ({ fields, layout }: OnChangeParams) => {\n setData(data => ({ ...data, fields, layout }));\n };\n\n if (!data) {\n return <OverlayLoader text={\"Loading content model...\"} />;\n } else if (data.isBeingDeleted) {\n return <ModelIsBeingDeletedError model={data} />;\n }\n\n return (\n <div className={\"content-model-editor flex-1\"}>\n <NavigationPrompt when={!isPristine} message={prompt} />\n <Header />\n <div className={\"w-full overflow-y-auto h-main-content\"}>\n <SplitView>\n <LeftPanel span={4} className={\"bg-neutral-light\"}>\n <div className={\"px-lg py-md h-[calc(100vh-98px)] overflow-y-scroll\"}>\n <FieldsSidebar\n onFieldDragStart={() => {\n setActiveTab(\"edit\");\n }}\n />\n </div>\n </LeftPanel>\n <RightPanel span={8} className={\"bg-neutral-base\"}>\n <div className={\"h-full overflow-y-scroll\"}>\n {contentModel && (\n <div className={\"px-xl pt-lg pb-md-extra\"}>\n <Heading level={4}>{contentModel.name}</Heading>\n <Text size={\"sm\"} className={\"text-neutral-muted\"}>\n {`Created by ${contentModel.createdBy.displayName}. Last modified: `}\n <TimeAgo datetime={contentModel.savedOn} />.\n </Text>\n </div>\n )}\n <Tabs\n size={\"md\"}\n spacing={\"xl\"}\n separator={true}\n value={String(activeTab)}\n onValueChange={setActiveTab}\n tabs={[\n <Tabs.Tab\n key={\"edit\"}\n value={\"edit\"}\n trigger={\"Edit\"}\n icon={<EditIcon />}\n data-testid={\"cms.editor.tab.edit\"}\n content={\n <div className={\"relative mb-lg\"}>\n <FieldEditor\n fields={data.fields}\n layout={data.layout || []}\n onChange={onChange}\n />\n </div>\n }\n />,\n <Tabs.Tab\n key={\"preview\"}\n value={\"preview\"}\n trigger={\"Preview\"}\n icon={<PreviewIcon />}\n data-testid={\"cms.editor.tab.preview\"}\n content={\n <ContentEntryEditorWithConfig>\n <ContentEntriesProvider contentModel={data}>\n <ContentEntryProvider readonly={true}>\n <PreviewTab\n activeTab={activeTab === \"preview\"}\n />\n </ContentEntryProvider>\n </ContentEntriesProvider>\n </ContentEntryEditorWithConfig>\n }\n />\n ]}\n />\n </div>\n </RightPanel>\n </SplitView>\n <DragPreview />\n </div>\n </div>\n );\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -3,6 +3,7 @@ import type { ApolloClient } from "apollo-client";
|
|
|
3
3
|
import type { GetCmsModelQueryResponse, UpdateCmsModelMutationResponse } from "../../../admin/graphql/contentModels.js";
|
|
4
4
|
import type { CmsModel } from "../../../types.js";
|
|
5
5
|
import type { FetchResult } from "apollo-link";
|
|
6
|
+
import type { FieldOption } from "@webiny/app-headless-cms-common/Fields/fieldOptions.js";
|
|
6
7
|
export interface ContentModelEditorProviderContext {
|
|
7
8
|
apolloClient: ApolloClient<any>;
|
|
8
9
|
data: CmsModel;
|
|
@@ -13,6 +14,7 @@ export interface ContentModelEditorProviderContext {
|
|
|
13
14
|
setData: (setter: (model: CmsModel) => void, saveContentModel?: boolean) => Promise<any>;
|
|
14
15
|
activeTabIndex: number;
|
|
15
16
|
setActiveTabIndex: (index: number) => void;
|
|
17
|
+
fieldOptions: FieldOption[];
|
|
16
18
|
}
|
|
17
19
|
export declare const contentModelEditorContext: React.Context<ContentModelEditorProviderContext | undefined>;
|
|
18
20
|
interface State {
|
|
@@ -7,6 +7,8 @@ import { LIST_MENU_CONTENT_GROUPS_MODELS } from "../../viewsGraphql.js";
|
|
|
7
7
|
import { ModelProvider } from "../ModelProvider/index.js";
|
|
8
8
|
import { createHashing } from "@webiny/app/utils/index.js";
|
|
9
9
|
import { Routes } from "../../../routes.js";
|
|
10
|
+
import { buildFieldOptions, buildFieldLabelPrefixes } from "@webiny/app-headless-cms-common/Fields/fieldOptions.js";
|
|
11
|
+
import { plugins } from "@webiny/plugins";
|
|
10
12
|
export const contentModelEditorContext = /*#__PURE__*/React.createContext(undefined);
|
|
11
13
|
export const contentModelEditorReducer = (prev, action) => {
|
|
12
14
|
const {
|
|
@@ -176,6 +178,15 @@ export const ContentModelEditorProvider = ({
|
|
|
176
178
|
showSnackbar(`Could not load content model with given ID.`);
|
|
177
179
|
});
|
|
178
180
|
}, [modelId]);
|
|
181
|
+
const layoutFieldPlugins = plugins.byType("cms-editor-layout-field-type");
|
|
182
|
+
const fieldOptions = useMemo(() => {
|
|
183
|
+
const model = state.data;
|
|
184
|
+
if (!model) {
|
|
185
|
+
return [];
|
|
186
|
+
}
|
|
187
|
+
const prefixes = model.layout ? buildFieldLabelPrefixes(model.layout, layoutFieldPlugins) : undefined;
|
|
188
|
+
return buildFieldOptions(model.fields ?? [], "", "", prefixes, layoutFieldPlugins);
|
|
189
|
+
}, [state.data?.fields, state.data?.layout]);
|
|
179
190
|
const value = useMemo(() => ({
|
|
180
191
|
// Keeping `data` for compatibility
|
|
181
192
|
data: state.data,
|
|
@@ -188,8 +199,9 @@ export const ContentModelEditorProvider = ({
|
|
|
188
199
|
saveContentModel,
|
|
189
200
|
setData,
|
|
190
201
|
activeTabIndex: state.activeTabIndex,
|
|
191
|
-
setActiveTabIndex
|
|
192
|
-
|
|
202
|
+
setActiveTabIndex,
|
|
203
|
+
fieldOptions
|
|
204
|
+
}), [state, apolloClient, fieldOptions]);
|
|
193
205
|
const {
|
|
194
206
|
Provider
|
|
195
207
|
} = contentModelEditorContext;
|
|
@@ -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","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","contentModel","Provider","createElement","model"],"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 { 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\";\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}\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 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 }),\n [state, apolloClient]\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 { 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":[]}
|
|
@@ -38,15 +38,64 @@ const Field = props => {
|
|
|
38
38
|
className: "text-neutral-strong"
|
|
39
39
|
}, description)))));
|
|
40
40
|
};
|
|
41
|
+
const LayoutFieldItem = props => {
|
|
42
|
+
const {
|
|
43
|
+
onFieldDragStart,
|
|
44
|
+
layoutField: {
|
|
45
|
+
type,
|
|
46
|
+
label,
|
|
47
|
+
icon,
|
|
48
|
+
description
|
|
49
|
+
}
|
|
50
|
+
} = props;
|
|
51
|
+
return /*#__PURE__*/React.createElement(Draggable, {
|
|
52
|
+
beginDrag: {
|
|
53
|
+
type: "newLayoutField",
|
|
54
|
+
layoutFieldType: type
|
|
55
|
+
}
|
|
56
|
+
}, ({
|
|
57
|
+
drag
|
|
58
|
+
}) => /*#__PURE__*/React.createElement("div", {
|
|
59
|
+
ref: drag,
|
|
60
|
+
"data-testid": `cms-editor-fields-layout-field-${type}`,
|
|
61
|
+
onDragStart: onFieldDragStart,
|
|
62
|
+
className: "bg-neutral-base rounded-sm mb-sm py-sm px-md cursor-grab last-of-type:mb-none hover:opacity-80 transition-opacity"
|
|
63
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
64
|
+
className: "flex items-center gap-md"
|
|
65
|
+
}, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(Icon, {
|
|
66
|
+
icon: icon,
|
|
67
|
+
label: label,
|
|
68
|
+
size: "md",
|
|
69
|
+
color: "neutral-light"
|
|
70
|
+
})), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(Heading, {
|
|
71
|
+
level: 6
|
|
72
|
+
}, label), /*#__PURE__*/React.createElement(Text, {
|
|
73
|
+
size: "sm",
|
|
74
|
+
className: "text-neutral-strong"
|
|
75
|
+
}, description)))));
|
|
76
|
+
};
|
|
41
77
|
export const FieldsSidebar = ({
|
|
42
78
|
onFieldDragStart
|
|
43
79
|
}) => {
|
|
44
80
|
const fieldTypePlugin = plugins.byType("cms-editor-field-type").filter(p => !p.field.hideInAdmin);
|
|
45
|
-
|
|
81
|
+
const layoutFieldPlugins = plugins.byType("cms-editor-layout-field-type");
|
|
82
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Text, {
|
|
83
|
+
as: "div",
|
|
84
|
+
size: "md",
|
|
85
|
+
className: "text-neutral-strong uppercase mt-0 mb-md font-semibold"
|
|
86
|
+
}, "Fields"), fieldTypePlugin.map(fieldPlugin => /*#__PURE__*/React.createElement(Field, {
|
|
46
87
|
key: fieldPlugin.field.type,
|
|
47
88
|
fieldType: fieldPlugin.field,
|
|
48
89
|
onFieldDragStart: onFieldDragStart
|
|
49
|
-
}))
|
|
90
|
+
})), layoutFieldPlugins.length > 0 && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Text, {
|
|
91
|
+
as: "div",
|
|
92
|
+
size: "md",
|
|
93
|
+
className: "text-neutral-strong uppercase my-md font-semibold"
|
|
94
|
+
}, "Layout"), layoutFieldPlugins.map(lp => /*#__PURE__*/React.createElement(LayoutFieldItem, {
|
|
95
|
+
key: lp.field.type,
|
|
96
|
+
layoutField: lp.field,
|
|
97
|
+
onFieldDragStart: onFieldDragStart
|
|
98
|
+
}))));
|
|
50
99
|
};
|
|
51
100
|
|
|
52
101
|
//# sourceMappingURL=FieldsSidebar.js.map
|