@webiny/app-headless-cms 6.6.0-alpha.0 → 6.6.0-alpha.2
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/ContentEntriesModule.js +3 -3
- package/ContentEntriesModule.js.map +1 -1
- package/HeadlessCMS.js +7 -2
- package/HeadlessCMS.js.map +1 -1
- package/admin/RoutesConfig.js +14 -1
- package/admin/RoutesConfig.js.map +1 -1
- package/admin/components/ContentEntries/BulkActions/ActionDelete.d.ts +2 -2
- package/admin/components/ContentEntries/BulkActions/ActionDelete.js.map +1 -1
- package/admin/components/ContentEntries/BulkActions/ActionMove.d.ts +2 -2
- package/admin/components/ContentEntries/BulkActions/ActionMove.js.map +1 -1
- package/admin/components/ContentEntries/BulkActions/ActionPublish.d.ts +2 -2
- package/admin/components/ContentEntries/BulkActions/ActionPublish.js.map +1 -1
- package/admin/components/ContentEntries/BulkActions/ActionUnpublish.d.ts +2 -2
- package/admin/components/ContentEntries/BulkActions/ActionUnpublish.js.map +1 -1
- package/admin/components/ContentModelEditor/ContentModelEditorProvider.js +1 -0
- package/admin/components/ContentModelEditor/ContentModelEditorProvider.js.map +1 -1
- package/admin/components/ContentModelEditor/FieldsSidebar.js +12 -2
- package/admin/components/ContentModelEditor/FieldsSidebar.js.map +1 -1
- package/admin/components/ContentModelEditor/evaluateExpression.js +4 -0
- package/admin/components/ContentModelEditor/evaluateExpression.js.map +1 -1
- package/admin/components/Dialogs/PublishEntryConfirmDialog.d.ts +26 -1
- package/admin/components/Dialogs/PublishEntryConfirmDialog.js +4 -3
- package/admin/components/Dialogs/PublishEntryConfirmDialog.js.map +1 -1
- package/admin/components/Dialogs/UnpublishEntryConfirmDialog.d.ts +26 -1
- package/admin/components/Dialogs/UnpublishEntryConfirmDialog.js +4 -3
- package/admin/components/Dialogs/UnpublishEntryConfirmDialog.js.map +1 -1
- package/admin/components/FieldEditor/EditFieldDialog/PermissionsEditor/PermissionsEditor.js +3 -3
- package/admin/components/FieldEditor/EditFieldDialog/PermissionsEditor/PermissionsEditor.js.map +1 -1
- package/admin/components/FieldEditor/EditFieldDialog.d.ts +2 -2
- package/admin/components/FieldEditor/EditFieldDialog.js +5 -2
- package/admin/components/FieldEditor/EditFieldDialog.js.map +1 -1
- package/admin/components/FieldEditor/Field.js +1 -1
- package/admin/components/FieldEditor/Field.js.map +1 -1
- package/admin/components/FieldEditor/FieldEditor.js +2 -2
- package/admin/components/FieldEditor/FieldEditor.js.map +1 -1
- package/admin/components/FieldEditor/FieldEditorContext.d.ts +1 -1
- package/admin/components/FieldEditor/FieldEditorContext.js +6 -1
- package/admin/components/FieldEditor/FieldEditorContext.js.map +1 -1
- package/admin/components/LexicalCmsEditor/LexicalEditor.js +10 -6
- package/admin/components/LexicalCmsEditor/LexicalEditor.js.map +1 -1
- package/admin/components/LexicalCmsEditor/TypographyDropDown.js +3 -2
- package/admin/components/LexicalCmsEditor/TypographyDropDown.js.map +1 -1
- package/admin/config/contentEntries/editor/ContentEntryEditorConfig.d.ts +60 -2
- package/admin/config/contentEntries/editor/ContentEntryEditorConfig.js +18 -5
- package/admin/config/contentEntries/editor/ContentEntryEditorConfig.js.map +1 -1
- package/admin/config/contentEntries/editor/NewEntryWizard.d.ts +8 -1
- package/admin/config/contentEntries/editor/NewEntryWizard.js +20 -5
- package/admin/config/contentEntries/editor/NewEntryWizard.js.map +1 -1
- package/admin/config/contentEntries/list/Browser/BreadcrumbRoot.d.ts +38 -0
- package/admin/config/contentEntries/list/Browser/BreadcrumbRoot.js +23 -0
- package/admin/config/contentEntries/list/Browser/BreadcrumbRoot.js.map +1 -0
- package/admin/config/contentEntries/list/Browser/index.d.ts +21 -0
- package/admin/config/contentEntries/list/Browser/index.js +2 -0
- package/admin/config/contentEntries/list/Browser/index.js.map +1 -1
- package/admin/config/contentEntries/list/ContentEntryListConfig.d.ts +39 -0
- package/admin/config/contentEntries/list/ContentEntryListConfig.js +2 -1
- package/admin/config/contentEntries/list/ContentEntryListConfig.js.map +1 -1
- package/admin/graphql/contentModels.d.ts +1 -1
- package/admin/graphql/contentModels.js +2 -1
- package/admin/graphql/contentModels.js.map +1 -1
- package/admin/plugins/editor/formSettings/components/GeneralSettings.js +24 -1
- package/admin/plugins/editor/formSettings/components/GeneralSettings.js.map +1 -1
- package/exports/admin/cms/entry/editor.d.ts +1 -0
- package/exports/admin/cms/entry/editor.js +1 -0
- package/exports/admin/cms/entry/list.d.ts +2 -0
- package/exports/admin/cms/entry/list.js +2 -0
- package/exports/admin/cms.d.ts +2 -0
- package/exports/admin/cms.js +2 -0
- package/features/contentEntry/EntryGraphQLFields.js +1 -1
- package/features/contentEntry/EntryGraphQLFields.js.map +1 -1
- package/features/contentEntry/createEntry/CreateEntryRepository.d.ts +3 -1
- package/features/contentEntry/createEntry/CreateEntryRepository.js +10 -2
- package/features/contentEntry/createEntry/CreateEntryRepository.js.map +1 -1
- package/features/contentEntry/deleteEntry/DeleteEntryRepository.d.ts +3 -1
- package/features/contentEntry/deleteEntry/DeleteEntryRepository.js +12 -2
- package/features/contentEntry/deleteEntry/DeleteEntryRepository.js.map +1 -1
- package/features/contentEntry/refTypes.d.ts +7 -0
- package/features/contentEntry/refTypes.js.map +1 -1
- package/features/contentEntry/updateEntry/UpdateEntryRepository.d.ts +3 -1
- package/features/contentEntry/updateEntry/UpdateEntryRepository.js +10 -2
- package/features/contentEntry/updateEntry/UpdateEntryRepository.js.map +1 -1
- package/features/formModel/mappers/AssetFieldMapper.d.ts +12 -0
- package/features/formModel/mappers/AssetFieldMapper.js +13 -0
- package/features/formModel/mappers/AssetFieldMapper.js.map +1 -0
- package/features/formModel/mappers/index.js +2 -0
- package/features/formModel/mappers/index.js.map +1 -1
- package/features/model/updateModel/UpdateModelGateway.js +1 -0
- package/features/model/updateModel/UpdateModelGateway.js.map +1 -1
- package/index.d.ts +1 -1
- package/index.js +1 -1
- package/package.json +24 -24
- package/presentation/contentEntries/list/ContentEntriesPresenter.test.js +4 -0
- package/presentation/contentEntries/list/ContentEntriesPresenter.test.js.map +1 -1
- package/presentation/contentEntries/preview/ComponentDiscoveryIframe.d.ts +6 -0
- package/presentation/contentEntries/preview/ComponentDiscoveryIframe.js +47 -0
- package/presentation/contentEntries/preview/ComponentDiscoveryIframe.js.map +1 -0
- package/presentation/contentEntries/preview/LivePreviewPresenter.d.ts +14 -0
- package/presentation/contentEntries/preview/LivePreviewPresenter.js +33 -0
- package/presentation/contentEntries/preview/LivePreviewPresenter.js.map +1 -0
- package/presentation/contentEntries/preview/ModelEditorComponentDiscovery.d.ts +2 -0
- package/presentation/contentEntries/preview/ModelEditorComponentDiscovery.js +27 -0
- package/presentation/contentEntries/preview/ModelEditorComponentDiscovery.js.map +1 -0
- package/presentation/contentEntries/preview/PreviewComponentsContext.d.ts +15 -0
- package/presentation/contentEntries/preview/PreviewComponentsContext.js +43 -0
- package/presentation/contentEntries/preview/PreviewComponentsContext.js.map +1 -0
- package/presentation/contentEntries/preview/PreviewDecorator.d.ts +2 -0
- package/presentation/contentEntries/preview/PreviewDecorator.js +48 -0
- package/presentation/contentEntries/preview/PreviewDecorator.js.map +1 -0
- package/presentation/contentEntries/preview/PreviewPane.d.ts +9 -0
- package/presentation/contentEntries/preview/PreviewPane.js +181 -0
- package/presentation/contentEntries/preview/PreviewPane.js.map +1 -0
- package/presentation/contentEntries/preview/abstractions.d.ts +16 -0
- package/presentation/contentEntries/preview/abstractions.js +5 -0
- package/presentation/contentEntries/preview/abstractions.js.map +1 -0
- package/presentation/contentEntries/preview/feature.d.ts +3 -0
- package/presentation/contentEntries/preview/feature.js +17 -0
- package/presentation/contentEntries/preview/feature.js.map +1 -0
- package/presentation/contentEntries/preview/resolvePreviewUrl.d.ts +5 -0
- package/presentation/contentEntries/preview/resolvePreviewUrl.js +29 -0
- package/presentation/contentEntries/preview/resolvePreviewUrl.js.map +1 -0
- package/presentation/contentEntries/preview/useLivePreviewPresenter.d.ts +1 -0
- package/presentation/contentEntries/preview/useLivePreviewPresenter.js +8 -0
- package/presentation/contentEntries/preview/useLivePreviewPresenter.js.map +1 -0
- package/presentation/contentEntries/trashBin/CmsTrashBin.d.ts +2 -2
- package/presentation/contentEntries/views/CmsAdvancedSearch.d.ts +2 -2
- package/presentation/contentEntries/views/ContentEntriesBreadcrumbs.d.ts +13 -0
- package/presentation/contentEntries/views/ContentEntriesBreadcrumbs.js +54 -0
- package/presentation/contentEntries/views/ContentEntriesBreadcrumbs.js.map +1 -0
- package/presentation/contentEntries/views/ContentEntriesListLayout.d.ts +2 -2
- package/presentation/contentEntries/views/ContentEntriesListLayout.js +3 -2
- package/presentation/contentEntries/views/ContentEntriesListLayout.js.map +1 -1
- package/presentation/contentEntries/views/ContentEntryFormView.d.ts +2 -2
- package/presentation/contentEntries/views/ContentEntryFormView.js +5 -6
- package/presentation/contentEntries/views/ContentEntryFormView.js.map +1 -1
- package/presentation/contentEntries/views/RevisionDrawer.d.ts +2 -2
- package/presentation/contentEntries/views/RevisionsList.d.ts +2 -2
- package/presentation/contentEntries/views/SingleEntryLayout.d.ts +2 -2
- package/presentation/contentEntries/views/Table/Table.d.ts +2 -2
- package/presentation/contentEntries/views/actions/CreateNewRevisionButton.d.ts +2 -2
- package/presentation/contentEntries/views/actions/DeleteEntryMenuItem.d.ts +2 -2
- package/presentation/contentEntries/views/actions/PublishOnlyButton.d.ts +2 -2
- package/presentation/contentEntries/views/actions/RevisionSelector.d.ts +2 -2
- package/presentation/contentEntries/views/actions/SaveAndPublishButton.d.ts +2 -2
- package/presentation/contentEntries/views/actions/SaveContentButton.d.ts +2 -2
- package/presentation/contentEntries/views/actions/ShowRevisionListMenuItem.d.ts +2 -2
- package/presentation/contentEntries/views/layout/ContentEntryForm.d.ts +12 -12
- package/presentation/contentEntries/views/layout/ContentEntryFormContent.d.ts +10 -6
- package/presentation/contentEntries/views/layout/ContentEntryFormContent.js +7 -2
- package/presentation/contentEntries/views/layout/ContentEntryFormContent.js.map +1 -1
- package/presentation/contentModels/components/CloneContentModelDialog.d.ts +2 -2
- package/presentation/contentModels/components/ContentModels.d.ts +2 -2
- package/presentation/contentModels/components/ContentModelsDataList.d.ts +2 -2
- package/presentation/contentModels/components/NewContentModelDialog.d.ts +2 -2
- package/presentation/contentModels/components/fullDelete/types.js.map +1 -1
- package/presentation/fieldEditor/FieldEditorPresenter.js +1 -1
- package/presentation/fieldEditor/FieldEditorPresenter.js.map +1 -1
- package/presentation/fieldEditor/groups/ValidationsGroup.js +1 -1
- package/presentation/fieldEditor/groups/ValidationsGroup.js.map +1 -1
- package/presentation/fieldEditor/renderers/CmsAccessControlRulesRenderer.js +3 -3
- package/presentation/fieldEditor/renderers/CmsAccessControlRulesRenderer.js.map +1 -1
- package/presentation/fieldRenderers/ref/CmsRefDetailedMultipleRenderer.js +8 -0
- package/presentation/fieldRenderers/ref/CmsRefDetailedMultipleRenderer.js.map +1 -1
- package/presentation/fieldRenderers/ref/CmsRefDetailedSingleRenderer.js +8 -0
- package/presentation/fieldRenderers/ref/CmsRefDetailedSingleRenderer.js.map +1 -1
- package/presentation/fieldRenderers/ref/components/EditEntryDrawer.d.ts +10 -0
- package/presentation/fieldRenderers/ref/components/EditEntryDrawer.js +94 -0
- package/presentation/fieldRenderers/ref/components/EditEntryDrawer.js.map +1 -0
- package/presentation/fieldRenderers/ref/components/EntryCard.d.ts +2 -0
- package/presentation/fieldRenderers/ref/components/EntryCard.js +13 -3
- package/presentation/fieldRenderers/ref/components/EntryCard.js.map +1 -1
- package/presentation/fieldRenderers/ref/components/RefFieldOptions.d.ts +2 -2
- package/presentation/fieldRenderers/ref/detailed/RefDetailedPresenter.d.ts +2 -1
- package/presentation/fieldRenderers/ref/detailed/RefDetailedPresenter.js +6 -0
- package/presentation/fieldRenderers/ref/detailed/RefDetailedPresenter.js.map +1 -1
- package/presentation/fieldRenderers/ref/detailed/abstractions.d.ts +2 -1
- package/presentation/fieldRenderers/ref/detailed/abstractions.js.map +1 -1
- package/presentation/fieldRenderers/ref/editEntry/EditEntryPresenter.d.ts +13 -0
- package/presentation/fieldRenderers/ref/editEntry/EditEntryPresenter.js +25 -0
- package/presentation/fieldRenderers/ref/editEntry/EditEntryPresenter.js.map +1 -0
- package/presentation/fieldRenderers/ref/editEntry/abstractions.d.ts +10 -0
- package/presentation/fieldRenderers/ref/editEntry/abstractions.js +5 -0
- package/presentation/fieldRenderers/ref/editEntry/abstractions.js.map +1 -0
- package/presentation/fieldRenderers/ref/editEntry/feature.d.ts +3 -0
- package/presentation/fieldRenderers/ref/editEntry/feature.js +17 -0
- package/presentation/fieldRenderers/ref/editEntry/feature.js.map +1 -0
- package/presentation/fieldTypes/abstractions.d.ts +12 -0
- package/presentation/fieldTypes/abstractions.js.map +1 -1
- package/presentation/fieldTypes/renderers/common/SelectBoxRenderer.js +1 -1
- package/presentation/fieldTypes/renderers/common/SelectBoxRenderer.js.map +1 -1
- package/presentation/fieldTypes/renderers/dynamicZone/DynamicZoneRenderer.js +6 -2
- package/presentation/fieldTypes/renderers/dynamicZone/DynamicZoneRenderer.js.map +1 -1
- package/presentation/fieldTypes/renderers/object/ObjectAccordionRenderer.js +2 -0
- package/presentation/fieldTypes/renderers/object/ObjectAccordionRenderer.js.map +1 -1
- package/presentation/fieldTypes/renderers/object/ObjectsAccordionRenderer.js +6 -0
- package/presentation/fieldTypes/renderers/object/ObjectsAccordionRenderer.js.map +1 -1
- package/presentation/fieldTypes/types/DynamicZoneFieldType.d.ts +3 -6
- package/presentation/fieldTypes/types/DynamicZoneFieldType.js +2 -12
- package/presentation/fieldTypes/types/DynamicZoneFieldType.js.map +1 -1
- package/presentation/fieldTypes/types/dynamicZone/TemplateDialog.js +25 -3
- package/presentation/fieldTypes/types/dynamicZone/TemplateDialog.js.map +1 -1
- package/presentation/importContentModels/ImportContentModelsDialog.d.ts +2 -2
- package/presentation/importContentModels/components/DataList.d.ts +2 -2
- package/presentation/importContentModels/components/FileUpload.d.ts +2 -2
- package/presentation/importContentModels/components/Model/DataListModels.d.ts +2 -2
- package/presentation/menus/ContentGroupsMenuItems.d.ts +2 -2
- package/presentation/modelGroup/ModelGroupPresenter.d.ts +3 -1
- package/presentation/modelGroup/ModelGroupPresenter.js +7 -9
- package/presentation/modelGroup/ModelGroupPresenter.js.map +1 -1
- package/presentation/modelGroup/components/ContentModelGroups.d.ts +2 -2
- package/presentation/modelGroup/components/ContentModelGroupsDataList.d.ts +6 -2
- package/presentation/modelGroup/components/ContentModelGroupsForm.d.ts +8 -2
|
@@ -8,6 +8,7 @@ import { EntryCard } from "./components/EntryCard.js";
|
|
|
8
8
|
import { RefFieldOptions } from "./components/RefFieldOptions.js";
|
|
9
9
|
import { ReferencesDialog } from "./components/ReferencesDialog.js";
|
|
10
10
|
import { NewEntryDrawer } from "./components/NewEntryDrawer.js";
|
|
11
|
+
import { EditEntryDrawer } from "./components/EditEntryDrawer.js";
|
|
11
12
|
const CmsRefDetailedSingleRenderer = createFieldRenderer(({ field })=>{
|
|
12
13
|
const parentContainer = useContainer();
|
|
13
14
|
const scopedContainer = useMemo(()=>{
|
|
@@ -25,6 +26,7 @@ const RefDetailedSingleInner = observer(({ field })=>{
|
|
|
25
26
|
const { presenter } = useFeature(RefDetailedPresenterFeature);
|
|
26
27
|
const [selectDialogModel, setSelectDialogModel] = useState(null);
|
|
27
28
|
const [newEntryModelId, setNewEntryModelId] = useState(null);
|
|
29
|
+
const [editEntry, setEditEntry] = useState(null);
|
|
28
30
|
const settings = field.rendererSettings;
|
|
29
31
|
const modelIds = (settings.models || []).map((m)=>m.modelId);
|
|
30
32
|
useEffect(()=>{
|
|
@@ -84,6 +86,7 @@ const RefDetailedSingleInner = observer(({ field })=>{
|
|
|
84
86
|
index: 0,
|
|
85
87
|
entry: entry,
|
|
86
88
|
onRemove: onRemove,
|
|
89
|
+
onEdit: setEditEntry,
|
|
87
90
|
disabled: disabled
|
|
88
91
|
})), /*#__PURE__*/ react.createElement(FormComponentErrorMessage, {
|
|
89
92
|
text: validation.message,
|
|
@@ -110,6 +113,11 @@ const RefDetailedSingleInner = observer(({ field })=>{
|
|
|
110
113
|
field.onChange(ref);
|
|
111
114
|
setNewEntryModelId(null);
|
|
112
115
|
}
|
|
116
|
+
}), editEntry && /*#__PURE__*/ react.createElement(EditEntryDrawer, {
|
|
117
|
+
modelId: editEntry.model.modelId,
|
|
118
|
+
entryId: editEntry.id,
|
|
119
|
+
onClose: ()=>setEditEntry(null),
|
|
120
|
+
onSaved: (patch)=>presenter.patchEntry(patch)
|
|
113
121
|
}));
|
|
114
122
|
});
|
|
115
123
|
export { CmsRefDetailedSingleRenderer };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presentation/fieldRenderers/ref/CmsRefDetailedSingleRenderer.js","sources":["../../../../src/presentation/fieldRenderers/ref/CmsRefDetailedSingleRenderer.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport { createFieldRenderer } from \"@webiny/app-admin/features/formModel/createFieldRenderer.js\";\nimport type { IFieldVM } from \"@webiny/app-admin/features/formModel/abstractions.js\";\nimport { DiContainerProvider, useContainer, useFeature } from \"@webiny/app\";\nimport { FormComponentErrorMessage, FormComponentLabel, OverlayLoader } from \"@webiny/admin-ui\";\nimport type { CmsModel } from \"~/types.js\";\nimport type { CmsReferenceEntry, CmsReferenceValue } from \"~/features/contentEntry/refTypes.js\";\nimport type { RefFieldRendererSettings } from \"./types.js\";\nimport { RefDetailedPresenterFeature } from \"./detailed/feature.js\";\nimport { EntryCard } from \"./components/EntryCard.js\";\nimport { RefFieldOptions } from \"./components/RefFieldOptions.js\";\nimport { ReferencesDialog } from \"./components/ReferencesDialog.js\";\nimport { NewEntryDrawer } from \"./components/NewEntryDrawer.js\";\n\ndeclare module \"@webiny/app-admin/features/formModel/abstractions.js\" {\n interface IFieldRendererRegistry {\n refDetailedSingle: { fieldType: \"ref\"; settings: RefFieldRendererSettings };\n }\n}\n\nexport const CmsRefDetailedSingleRenderer = createFieldRenderer<\"refDetailedSingle\">(\n ({ field }) => {\n const parentContainer = useContainer();\n\n const scopedContainer = useMemo(() => {\n const child = parentContainer.createChildContainer();\n RefDetailedPresenterFeature.register(child);\n return child;\n }, []);\n\n return (\n <DiContainerProvider container={scopedContainer}>\n <RefDetailedSingleInner field={field} />\n </DiContainerProvider>\n );\n }\n);\n\ninterface InnerFieldProps {\n field: IFieldVM & { rendererSettings: RefFieldRendererSettings };\n}\n\nconst RefDetailedSingleInner = observer(({ field }: InnerFieldProps) => {\n const { presenter } = useFeature(RefDetailedPresenterFeature);\n\n const [selectDialogModel, setSelectDialogModel] = useState<CmsModel | null>(null);\n const [newEntryModelId, setNewEntryModelId] = useState<string | null>(null);\n\n const settings = field.rendererSettings;\n const modelIds = (settings.models || []).map(m => m.modelId);\n\n useEffect(() => {\n presenter.init({ modelIds, multiSelect: false });\n }, []);\n\n const value = field.value as CmsReferenceValue | null;\n\n useEffect(() => {\n if (value) {\n presenter.resolveValues([value]);\n } else {\n presenter.resolveValues([]);\n }\n }, [value?.id]);\n\n const onRemove = useCallback(() => {\n field.onChange(null);\n }, []);\n\n const onNewRecord = useCallback((modelId: string) => {\n setNewEntryModelId(modelId);\n }, []);\n\n const onExistingRecord = useCallback(\n (modelId: string) => {\n const model = presenter.vm.models.find(m => m.modelId === modelId);\n if (model) {\n setSelectDialogModel(model);\n }\n },\n [presenter.vm.models]\n );\n\n const onDialogSave = useCallback(\n (values: CmsReferenceValue[], entries: CmsReferenceEntry[]) => {\n presenter.addEntries(entries);\n if (values.length === 0) {\n field.onChange(null);\n } else {\n field.onChange(values[0]);\n }\n },\n []\n );\n\n const { validation } = field;\n const invalid = validation.isValid === false;\n const disabled = field.disabled;\n const entry = presenter.vm.entries[0];\n const models = presenter.vm.models;\n\n return (\n <div className={\"@container\"}>\n <FormComponentLabel\n text={field.label}\n hint={field.help}\n invalid={invalid}\n disabled={disabled}\n />\n <div className={\"webiny_ref-field-container\"}>\n {presenter.vm.loading && <OverlayLoader size={\"md\"} />}\n {entry && (\n <EntryCard\n model={\n presenter.vm.models.find(m => m.modelId === entry.model.modelId) ||\n ({\n modelId: entry.model.modelId,\n name: entry.model.name\n } as CmsModel)\n }\n placement=\"singleRefField\"\n index={0}\n entry={entry}\n onRemove={onRemove}\n disabled={disabled}\n />\n )}\n </div>\n <FormComponentErrorMessage\n text={validation.message}\n invalid={invalid}\n disabled={disabled}\n />\n {entry && <div className=\"mb-md\" />}\n {!disabled && (\n <RefFieldOptions\n models={models}\n onNewRecord={onNewRecord}\n onLinkExistingRecord={onExistingRecord}\n />\n )}\n {selectDialogModel && (\n <ReferencesDialog\n model={selectDialogModel}\n values={value ? [value] : []}\n multiple={false}\n onSave={onDialogSave}\n onClose={() => setSelectDialogModel(null)}\n />\n )}\n {newEntryModelId && (\n <NewEntryDrawer\n modelId={newEntryModelId}\n onClose={() => setNewEntryModelId(null)}\n onChange={ref => {\n field.onChange(ref);\n setNewEntryModelId(null);\n }}\n />\n )}\n </div>\n );\n});\n"],"names":["CmsRefDetailedSingleRenderer","createFieldRenderer","field","parentContainer","useContainer","scopedContainer","useMemo","child","RefDetailedPresenterFeature","DiContainerProvider","RefDetailedSingleInner","observer","presenter","useFeature","selectDialogModel","setSelectDialogModel","useState","newEntryModelId","setNewEntryModelId","settings","modelIds","m","useEffect","value","onRemove","useCallback","onNewRecord","modelId","onExistingRecord","model","onDialogSave","values","entries","validation","invalid","disabled","entry","models","FormComponentLabel","OverlayLoader","EntryCard","FormComponentErrorMessage","RefFieldOptions","ReferencesDialog","NewEntryDrawer","ref"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"presentation/fieldRenderers/ref/CmsRefDetailedSingleRenderer.js","sources":["../../../../src/presentation/fieldRenderers/ref/CmsRefDetailedSingleRenderer.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport { createFieldRenderer } from \"@webiny/app-admin/features/formModel/createFieldRenderer.js\";\nimport type { IFieldVM } from \"@webiny/app-admin/features/formModel/abstractions.js\";\nimport { DiContainerProvider, useContainer, useFeature } from \"@webiny/app\";\nimport { FormComponentErrorMessage, FormComponentLabel, OverlayLoader } from \"@webiny/admin-ui\";\nimport type { CmsModel } from \"~/types.js\";\nimport type { CmsReferenceEntry, CmsReferenceValue } from \"~/features/contentEntry/refTypes.js\";\nimport type { RefFieldRendererSettings } from \"./types.js\";\nimport { RefDetailedPresenterFeature } from \"./detailed/feature.js\";\nimport { EntryCard } from \"./components/EntryCard.js\";\nimport { RefFieldOptions } from \"./components/RefFieldOptions.js\";\nimport { ReferencesDialog } from \"./components/ReferencesDialog.js\";\nimport { NewEntryDrawer } from \"./components/NewEntryDrawer.js\";\nimport { EditEntryDrawer } from \"./components/EditEntryDrawer.js\";\n\ndeclare module \"@webiny/app-admin/features/formModel/abstractions.js\" {\n interface IFieldRendererRegistry {\n refDetailedSingle: { fieldType: \"ref\"; settings: RefFieldRendererSettings };\n }\n}\n\nexport const CmsRefDetailedSingleRenderer = createFieldRenderer<\"refDetailedSingle\">(\n ({ field }) => {\n const parentContainer = useContainer();\n\n const scopedContainer = useMemo(() => {\n const child = parentContainer.createChildContainer();\n RefDetailedPresenterFeature.register(child);\n return child;\n }, []);\n\n return (\n <DiContainerProvider container={scopedContainer}>\n <RefDetailedSingleInner field={field} />\n </DiContainerProvider>\n );\n }\n);\n\ninterface InnerFieldProps {\n field: IFieldVM & { rendererSettings: RefFieldRendererSettings };\n}\n\nconst RefDetailedSingleInner = observer(({ field }: InnerFieldProps) => {\n const { presenter } = useFeature(RefDetailedPresenterFeature);\n\n const [selectDialogModel, setSelectDialogModel] = useState<CmsModel | null>(null);\n const [newEntryModelId, setNewEntryModelId] = useState<string | null>(null);\n const [editEntry, setEditEntry] = useState<CmsReferenceEntry | null>(null);\n\n const settings = field.rendererSettings;\n const modelIds = (settings.models || []).map(m => m.modelId);\n\n useEffect(() => {\n presenter.init({ modelIds, multiSelect: false });\n }, []);\n\n const value = field.value as CmsReferenceValue | null;\n\n useEffect(() => {\n if (value) {\n presenter.resolveValues([value]);\n } else {\n presenter.resolveValues([]);\n }\n }, [value?.id]);\n\n const onRemove = useCallback(() => {\n field.onChange(null);\n }, []);\n\n const onNewRecord = useCallback((modelId: string) => {\n setNewEntryModelId(modelId);\n }, []);\n\n const onExistingRecord = useCallback(\n (modelId: string) => {\n const model = presenter.vm.models.find(m => m.modelId === modelId);\n if (model) {\n setSelectDialogModel(model);\n }\n },\n [presenter.vm.models]\n );\n\n const onDialogSave = useCallback(\n (values: CmsReferenceValue[], entries: CmsReferenceEntry[]) => {\n presenter.addEntries(entries);\n if (values.length === 0) {\n field.onChange(null);\n } else {\n field.onChange(values[0]);\n }\n },\n []\n );\n\n const { validation } = field;\n const invalid = validation.isValid === false;\n const disabled = field.disabled;\n const entry = presenter.vm.entries[0];\n const models = presenter.vm.models;\n\n return (\n <div className={\"@container\"}>\n <FormComponentLabel\n text={field.label}\n hint={field.help}\n invalid={invalid}\n disabled={disabled}\n />\n <div className={\"webiny_ref-field-container\"}>\n {presenter.vm.loading && <OverlayLoader size={\"md\"} />}\n {entry && (\n <EntryCard\n model={\n presenter.vm.models.find(m => m.modelId === entry.model.modelId) ||\n ({\n modelId: entry.model.modelId,\n name: entry.model.name\n } as CmsModel)\n }\n placement=\"singleRefField\"\n index={0}\n entry={entry}\n onRemove={onRemove}\n onEdit={setEditEntry}\n disabled={disabled}\n />\n )}\n </div>\n <FormComponentErrorMessage\n text={validation.message}\n invalid={invalid}\n disabled={disabled}\n />\n {entry && <div className=\"mb-md\" />}\n {!disabled && (\n <RefFieldOptions\n models={models}\n onNewRecord={onNewRecord}\n onLinkExistingRecord={onExistingRecord}\n />\n )}\n {selectDialogModel && (\n <ReferencesDialog\n model={selectDialogModel}\n values={value ? [value] : []}\n multiple={false}\n onSave={onDialogSave}\n onClose={() => setSelectDialogModel(null)}\n />\n )}\n {newEntryModelId && (\n <NewEntryDrawer\n modelId={newEntryModelId}\n onClose={() => setNewEntryModelId(null)}\n onChange={ref => {\n field.onChange(ref);\n setNewEntryModelId(null);\n }}\n />\n )}\n {editEntry && (\n <EditEntryDrawer\n modelId={editEntry.model.modelId}\n entryId={editEntry.id}\n onClose={() => setEditEntry(null)}\n onSaved={patch => presenter.patchEntry(patch)}\n />\n )}\n </div>\n );\n});\n"],"names":["CmsRefDetailedSingleRenderer","createFieldRenderer","field","parentContainer","useContainer","scopedContainer","useMemo","child","RefDetailedPresenterFeature","DiContainerProvider","RefDetailedSingleInner","observer","presenter","useFeature","selectDialogModel","setSelectDialogModel","useState","newEntryModelId","setNewEntryModelId","editEntry","setEditEntry","settings","modelIds","m","useEffect","value","onRemove","useCallback","onNewRecord","modelId","onExistingRecord","model","onDialogSave","values","entries","validation","invalid","disabled","entry","models","FormComponentLabel","OverlayLoader","EntryCard","FormComponentErrorMessage","RefFieldOptions","ReferencesDialog","NewEntryDrawer","ref","EditEntryDrawer","patch"],"mappings":";;;;;;;;;;;AAsBO,MAAMA,+BAA+BC,oBACxC,CAAC,EAAEC,KAAK,EAAE;IACN,MAAMC,kBAAkBC;IAExB,MAAMC,kBAAkBC,QAAQ;QAC5B,MAAMC,QAAQJ,gBAAgB,oBAAoB;QAClDK,4BAA4B,QAAQ,CAACD;QACrC,OAAOA;IACX,GAAG,EAAE;IAEL,OAAO,WAAP,GACI,oBAACE,qBAAmBA;QAAC,WAAWJ;qBAC5B,oBAACK,wBAAsBA;QAAC,OAAOR;;AAG3C;AAOJ,MAAMQ,yBAAyBC,SAAS,CAAC,EAAET,KAAK,EAAmB;IAC/D,MAAM,EAAEU,SAAS,EAAE,GAAGC,WAAWL;IAEjC,MAAM,CAACM,mBAAmBC,qBAAqB,GAAGC,SAA0B;IAC5E,MAAM,CAACC,iBAAiBC,mBAAmB,GAAGF,SAAwB;IACtE,MAAM,CAACG,WAAWC,aAAa,GAAGJ,SAAmC;IAErE,MAAMK,WAAWnB,MAAM,gBAAgB;IACvC,MAAMoB,WAAYD,AAAAA,CAAAA,SAAS,MAAM,IAAI,EAAC,EAAG,GAAG,CAACE,CAAAA,IAAKA,EAAE,OAAO;IAE3DC,UAAU;QACNZ,UAAU,IAAI,CAAC;YAAEU;YAAU,aAAa;QAAM;IAClD,GAAG,EAAE;IAEL,MAAMG,QAAQvB,MAAM,KAAK;IAEzBsB,UAAU;QACN,IAAIC,OACAb,UAAU,aAAa,CAAC;YAACa;SAAM;aAE/Bb,UAAU,aAAa,CAAC,EAAE;IAElC,GAAG;QAACa,OAAO;KAAG;IAEd,MAAMC,WAAWC,YAAY;QACzBzB,MAAM,QAAQ,CAAC;IACnB,GAAG,EAAE;IAEL,MAAM0B,cAAcD,YAAY,CAACE;QAC7BX,mBAAmBW;IACvB,GAAG,EAAE;IAEL,MAAMC,mBAAmBH,YACrB,CAACE;QACG,MAAME,QAAQnB,UAAU,EAAE,CAAC,MAAM,CAAC,IAAI,CAACW,CAAAA,IAAKA,EAAE,OAAO,KAAKM;QAC1D,IAAIE,OACAhB,qBAAqBgB;IAE7B,GACA;QAACnB,UAAU,EAAE,CAAC,MAAM;KAAC;IAGzB,MAAMoB,eAAeL,YACjB,CAACM,QAA6BC;QAC1BtB,UAAU,UAAU,CAACsB;QACrB,IAAID,AAAkB,MAAlBA,OAAO,MAAM,EACb/B,MAAM,QAAQ,CAAC;aAEfA,MAAM,QAAQ,CAAC+B,MAAM,CAAC,EAAE;IAEhC,GACA,EAAE;IAGN,MAAM,EAAEE,UAAU,EAAE,GAAGjC;IACvB,MAAMkC,UAAUD,AAAuB,UAAvBA,WAAW,OAAO;IAClC,MAAME,WAAWnC,MAAM,QAAQ;IAC/B,MAAMoC,QAAQ1B,UAAU,EAAE,CAAC,OAAO,CAAC,EAAE;IACrC,MAAM2B,SAAS3B,UAAU,EAAE,CAAC,MAAM;IAElC,OAAO,WAAP,GACI,oBAAC;QAAI,WAAW;qBACZ,oBAAC4B,oBAAkBA;QACf,MAAMtC,MAAM,KAAK;QACjB,MAAMA,MAAM,IAAI;QAChB,SAASkC;QACT,UAAUC;sBAEd,oBAAC;QAAI,WAAW;OACXzB,UAAU,EAAE,CAAC,OAAO,IAAI,WAAJ,GAAI,oBAAC6B,eAAaA;QAAC,MAAM;QAC7CH,SAAS,WAATA,GACG,oBAACI,WAASA;QACN,OACI9B,UAAU,EAAE,CAAC,MAAM,CAAC,IAAI,CAACW,CAAAA,IAAKA,EAAE,OAAO,KAAKe,MAAM,KAAK,CAAC,OAAO,KAC9D;YACG,SAASA,MAAM,KAAK,CAAC,OAAO;YAC5B,MAAMA,MAAM,KAAK,CAAC,IAAI;QAC1B;QAEJ,WAAU;QACV,OAAO;QACP,OAAOA;QACP,UAAUZ;QACV,QAAQN;QACR,UAAUiB;uBAItB,oBAACM,2BAAyBA;QACtB,MAAMR,WAAW,OAAO;QACxB,SAASC;QACT,UAAUC;QAEbC,SAAS,WAATA,GAAS,oBAAC;QAAI,WAAU;QACxB,CAACD,YAAY,WAAZA,GACE,oBAACO,iBAAeA;QACZ,QAAQL;QACR,aAAaX;QACb,sBAAsBE;QAG7BhB,qBAAqB,WAArBA,GACG,oBAAC+B,kBAAgBA;QACb,OAAO/B;QACP,QAAQW,QAAQ;YAACA;SAAM,GAAG,EAAE;QAC5B,UAAU;QACV,QAAQO;QACR,SAAS,IAAMjB,qBAAqB;QAG3CE,mBAAmB,WAAnBA,GACG,oBAAC6B,gBAAcA;QACX,SAAS7B;QACT,SAAS,IAAMC,mBAAmB;QAClC,UAAU6B,CAAAA;YACN7C,MAAM,QAAQ,CAAC6C;YACf7B,mBAAmB;QACvB;QAGPC,aAAa,WAAbA,GACG,oBAAC6B,iBAAeA;QACZ,SAAS7B,UAAU,KAAK,CAAC,OAAO;QAChC,SAASA,UAAU,EAAE;QACrB,SAAS,IAAMC,aAAa;QAC5B,SAAS6B,CAAAA,QAASrC,UAAU,UAAU,CAACqC;;AAK3D"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { CmsReferenceEntryPatch } from "../../../../features/contentEntry/refTypes.js";
|
|
3
|
+
interface EditEntryDrawerProps {
|
|
4
|
+
modelId: string;
|
|
5
|
+
entryId: string;
|
|
6
|
+
onClose: () => void;
|
|
7
|
+
onSaved: (patch: CmsReferenceEntryPatch) => void;
|
|
8
|
+
}
|
|
9
|
+
export declare const EditEntryDrawer: ({ modelId, entryId, onClose, onSaved }: EditEntryDrawerProps) => React.JSX.Element;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import react, { useCallback, useEffect, useMemo } from "react";
|
|
2
|
+
import { observer } from "mobx-react-lite";
|
|
3
|
+
import { DiContainerProvider, useContainer, useFeature } from "@webiny/app";
|
|
4
|
+
import { Drawer, OverlayLoader, useToast } from "@webiny/admin-ui";
|
|
5
|
+
import { DialogsProvider } from "@webiny/app-admin";
|
|
6
|
+
import { FormView } from "@webiny/app-admin/features/formModel/FormView.js";
|
|
7
|
+
import { ContentEntryFeature } from "../../../../features/contentEntry/feature.js";
|
|
8
|
+
import { CmsModelContext } from "../../../../features/contentEntry/CmsModelContext.js";
|
|
9
|
+
import { ContentEntryFormPresenterFeature } from "../../../contentEntries/form/feature.js";
|
|
10
|
+
import { EditEntryPresenterFeature } from "../editEntry/feature.js";
|
|
11
|
+
import { GenericModelLoader } from "../../../contentEntries/views/GenericModelLoader.js";
|
|
12
|
+
const toReferenceEntryPatch = (entry)=>({
|
|
13
|
+
entryId: entry.entryId,
|
|
14
|
+
id: entry.id,
|
|
15
|
+
status: entry.meta.status,
|
|
16
|
+
title: entry.meta.title,
|
|
17
|
+
description: entry.meta.description ?? null,
|
|
18
|
+
image: entry.meta.image ?? null,
|
|
19
|
+
savedOn: entry.savedOn,
|
|
20
|
+
modifiedBy: entry.modifiedBy
|
|
21
|
+
});
|
|
22
|
+
const EditEntryDrawer = ({ modelId, entryId, onClose, onSaved })=>{
|
|
23
|
+
const parentContainer = useContainer();
|
|
24
|
+
const dialogContainer = useMemo(()=>{
|
|
25
|
+
const child = parentContainer.createChildContainer();
|
|
26
|
+
ContentEntryFeature.register(child);
|
|
27
|
+
child.register(CmsModelContext).inSingletonScope();
|
|
28
|
+
ContentEntryFormPresenterFeature.register(child);
|
|
29
|
+
EditEntryPresenterFeature.register(child);
|
|
30
|
+
return child;
|
|
31
|
+
}, [
|
|
32
|
+
modelId
|
|
33
|
+
]);
|
|
34
|
+
return /*#__PURE__*/ react.createElement(DiContainerProvider, {
|
|
35
|
+
container: dialogContainer
|
|
36
|
+
}, /*#__PURE__*/ react.createElement(DialogsProvider, null, /*#__PURE__*/ react.createElement(GenericModelLoader, {
|
|
37
|
+
modelId: modelId
|
|
38
|
+
}, (model)=>/*#__PURE__*/ react.createElement(EditEntryDrawerContent, {
|
|
39
|
+
model: model,
|
|
40
|
+
entryId: entryId,
|
|
41
|
+
onClose: onClose,
|
|
42
|
+
onSaved: onSaved
|
|
43
|
+
}))));
|
|
44
|
+
};
|
|
45
|
+
const EditEntryDrawerContent = observer(({ model, entryId, onClose, onSaved })=>{
|
|
46
|
+
const { presenter } = useFeature(EditEntryPresenterFeature);
|
|
47
|
+
const { showSuccessToast } = useToast();
|
|
48
|
+
useEffect(()=>{
|
|
49
|
+
presenter.init(entryId);
|
|
50
|
+
return ()=>presenter.dispose();
|
|
51
|
+
}, [
|
|
52
|
+
entryId
|
|
53
|
+
]);
|
|
54
|
+
const onSave = useCallback(async ()=>{
|
|
55
|
+
const saved = await presenter.form.saveRevision({
|
|
56
|
+
skipValidation: false
|
|
57
|
+
});
|
|
58
|
+
const savedEntry = presenter.form.vm.entry;
|
|
59
|
+
if (saved && savedEntry) {
|
|
60
|
+
onSaved(toReferenceEntryPatch(savedEntry));
|
|
61
|
+
showSuccessToast({
|
|
62
|
+
title: `"${savedEntry.meta.title}" saved successfully.`
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}, [
|
|
66
|
+
onSaved,
|
|
67
|
+
showSuccessToast
|
|
68
|
+
]);
|
|
69
|
+
const vm = presenter.form.vm;
|
|
70
|
+
return /*#__PURE__*/ react.createElement(Drawer, {
|
|
71
|
+
open: true,
|
|
72
|
+
onClose: onClose,
|
|
73
|
+
width: 1000,
|
|
74
|
+
modal: true,
|
|
75
|
+
headerSeparator: true,
|
|
76
|
+
footerSeparator: true,
|
|
77
|
+
bodyPadding: false,
|
|
78
|
+
title: vm.entry?.meta?.title || `Edit ${model.name} Entry`,
|
|
79
|
+
actions: /*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement(Drawer.CancelButton, null), /*#__PURE__*/ react.createElement(Drawer.ConfirmButton, {
|
|
80
|
+
onClick: onSave,
|
|
81
|
+
text: "Save"
|
|
82
|
+
}))
|
|
83
|
+
}, /*#__PURE__*/ react.createElement("div", {
|
|
84
|
+
className: "p-md relative h-full min-h-[60vh]"
|
|
85
|
+
}, vm.loading ? /*#__PURE__*/ react.createElement(OverlayLoader, {
|
|
86
|
+
text: "Loading entry..."
|
|
87
|
+
}) : null, vm.form ? /*#__PURE__*/ react.createElement(FormView, {
|
|
88
|
+
name: "EditRefEntryForm",
|
|
89
|
+
form: vm.form
|
|
90
|
+
}) : null));
|
|
91
|
+
});
|
|
92
|
+
export { EditEntryDrawer };
|
|
93
|
+
|
|
94
|
+
//# sourceMappingURL=EditEntryDrawer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presentation/fieldRenderers/ref/components/EditEntryDrawer.js","sources":["../../../../../src/presentation/fieldRenderers/ref/components/EditEntryDrawer.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo } from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport { DiContainerProvider, useContainer, useFeature } from \"@webiny/app\";\nimport { Drawer, OverlayLoader, useToast } from \"@webiny/admin-ui\";\nimport { DialogsProvider } from \"@webiny/app-admin\";\nimport { FormView } from \"@webiny/app-admin/features/formModel/FormView.js\";\nimport { ContentEntryFeature } from \"~/features/contentEntry/feature.js\";\nimport { CmsModelContext } from \"~/features/contentEntry/CmsModelContext.js\";\nimport { ContentEntryFormPresenterFeature } from \"~/presentation/contentEntries/form/feature.js\";\nimport { EditEntryPresenterFeature } from \"../editEntry/feature.js\";\nimport { GenericModelLoader } from \"~/presentation/contentEntries/views/GenericModelLoader.js\";\nimport type { CmsContentEntry, CmsModel } from \"~/types.js\";\nimport type { CmsReferenceEntryPatch } from \"~/features/contentEntry/refTypes.js\";\n\ninterface EditEntryDrawerProps {\n modelId: string;\n entryId: string;\n onClose: () => void;\n onSaved: (patch: CmsReferenceEntryPatch) => void;\n}\n\n/**\n * Maps a saved content entry to a partial reference-entry patch, so the parent card can be\n * updated in memory (title, status, revision, ...) without refetching from the API.\n */\nconst toReferenceEntryPatch = (entry: CmsContentEntry): CmsReferenceEntryPatch => ({\n entryId: entry.entryId,\n id: entry.id,\n status: entry.meta.status,\n title: entry.meta.title,\n description: entry.meta.description ?? null,\n image: entry.meta.image ?? null,\n savedOn: entry.savedOn,\n modifiedBy: entry.modifiedBy\n});\n\nexport const EditEntryDrawer = ({ modelId, entryId, onClose, onSaved }: EditEntryDrawerProps) => {\n const parentContainer = useContainer();\n\n const dialogContainer = useMemo(() => {\n const child = parentContainer.createChildContainer();\n ContentEntryFeature.register(child);\n child.register(CmsModelContext).inSingletonScope();\n ContentEntryFormPresenterFeature.register(child);\n EditEntryPresenterFeature.register(child);\n return child;\n }, [modelId]);\n\n return (\n <DiContainerProvider container={dialogContainer}>\n <DialogsProvider>\n <GenericModelLoader modelId={modelId}>\n {model => (\n <EditEntryDrawerContent\n model={model}\n entryId={entryId}\n onClose={onClose}\n onSaved={onSaved}\n />\n )}\n </GenericModelLoader>\n </DialogsProvider>\n </DiContainerProvider>\n );\n};\n\ninterface EditEntryDrawerContentProps {\n model: CmsModel;\n entryId: string;\n onClose: () => void;\n onSaved: (patch: CmsReferenceEntryPatch) => void;\n}\n\nconst EditEntryDrawerContent = observer(\n ({ model, entryId, onClose, onSaved }: EditEntryDrawerContentProps) => {\n const { presenter } = useFeature(EditEntryPresenterFeature);\n const { showSuccessToast } = useToast();\n\n useEffect(() => {\n presenter.init(entryId);\n return () => presenter.dispose();\n }, [entryId]);\n\n const onSave = useCallback(async () => {\n const saved = await presenter.form.saveRevision({ skipValidation: false });\n const savedEntry = presenter.form.vm.entry;\n if (saved && savedEntry) {\n // Patch the parent card in memory from the saved entry (no refetch). This is a\n // pure MobX state update — it does not flip any loading flag, so there is no\n // overlay flash behind the still-open drawer. The drawer stays open so the\n // editor can keep editing.\n onSaved(toReferenceEntryPatch(savedEntry));\n showSuccessToast({ title: `\"${savedEntry.meta.title}\" saved successfully.` });\n }\n }, [onSaved, showSuccessToast]);\n\n const vm = presenter.form.vm;\n\n return (\n <Drawer\n open={true}\n onClose={onClose}\n width={1000}\n modal={true}\n headerSeparator={true}\n footerSeparator={true}\n bodyPadding={false}\n title={vm.entry?.meta?.title || `Edit ${model.name} Entry`}\n actions={\n <>\n <Drawer.CancelButton />\n <Drawer.ConfirmButton onClick={onSave} text=\"Save\" />\n </>\n }\n >\n <div className={\"p-md relative h-full min-h-[60vh]\"}>\n {vm.loading ? <OverlayLoader text={\"Loading entry...\"} /> : null}\n {vm.form ? <FormView name=\"EditRefEntryForm\" form={vm.form} /> : null}\n </div>\n </Drawer>\n );\n }\n);\n"],"names":["toReferenceEntryPatch","entry","EditEntryDrawer","modelId","entryId","onClose","onSaved","parentContainer","useContainer","dialogContainer","useMemo","child","ContentEntryFeature","CmsModelContext","ContentEntryFormPresenterFeature","EditEntryPresenterFeature","DiContainerProvider","DialogsProvider","GenericModelLoader","model","EditEntryDrawerContent","observer","presenter","useFeature","showSuccessToast","useToast","useEffect","onSave","useCallback","saved","savedEntry","vm","Drawer","OverlayLoader","FormView"],"mappings":";;;;;;;;;;;AAyBA,MAAMA,wBAAwB,CAACC,QAAoD;QAC/E,SAASA,MAAM,OAAO;QACtB,IAAIA,MAAM,EAAE;QACZ,QAAQA,MAAM,IAAI,CAAC,MAAM;QACzB,OAAOA,MAAM,IAAI,CAAC,KAAK;QACvB,aAAaA,MAAM,IAAI,CAAC,WAAW,IAAI;QACvC,OAAOA,MAAM,IAAI,CAAC,KAAK,IAAI;QAC3B,SAASA,MAAM,OAAO;QACtB,YAAYA,MAAM,UAAU;IAChC;AAEO,MAAMC,kBAAkB,CAAC,EAAEC,OAAO,EAAEC,OAAO,EAAEC,OAAO,EAAEC,OAAO,EAAwB;IACxF,MAAMC,kBAAkBC;IAExB,MAAMC,kBAAkBC,QAAQ;QAC5B,MAAMC,QAAQJ,gBAAgB,oBAAoB;QAClDK,oBAAoB,QAAQ,CAACD;QAC7BA,MAAM,QAAQ,CAACE,iBAAiB,gBAAgB;QAChDC,iCAAiC,QAAQ,CAACH;QAC1CI,0BAA0B,QAAQ,CAACJ;QACnC,OAAOA;IACX,GAAG;QAACR;KAAQ;IAEZ,OAAO,WAAP,GACI,oBAACa,qBAAmBA;QAAC,WAAWP;qBAC5B,oBAACQ,iBAAeA,MAAAA,WAAAA,GACZ,oBAACC,oBAAkBA;QAAC,SAASf;OACxBgB,CAAAA,QAAAA,WAAAA,GACG,oBAACC,wBAAsBA;YACnB,OAAOD;YACP,SAASf;YACT,SAASC;YACT,SAASC;;AAOrC;AASA,MAAMc,yBAAyBC,SAC3B,CAAC,EAAEF,KAAK,EAAEf,OAAO,EAAEC,OAAO,EAAEC,OAAO,EAA+B;IAC9D,MAAM,EAAEgB,SAAS,EAAE,GAAGC,WAAWR;IACjC,MAAM,EAAES,gBAAgB,EAAE,GAAGC;IAE7BC,UAAU;QACNJ,UAAU,IAAI,CAAClB;QACf,OAAO,IAAMkB,UAAU,OAAO;IAClC,GAAG;QAAClB;KAAQ;IAEZ,MAAMuB,SAASC,YAAY;QACvB,MAAMC,QAAQ,MAAMP,UAAU,IAAI,CAAC,YAAY,CAAC;YAAE,gBAAgB;QAAM;QACxE,MAAMQ,aAAaR,UAAU,IAAI,CAAC,EAAE,CAAC,KAAK;QAC1C,IAAIO,SAASC,YAAY;YAKrBxB,QAAQN,sBAAsB8B;YAC9BN,iBAAiB;gBAAE,OAAO,CAAC,CAAC,EAAEM,WAAW,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC;YAAC;QAC/E;IACJ,GAAG;QAACxB;QAASkB;KAAiB;IAE9B,MAAMO,KAAKT,UAAU,IAAI,CAAC,EAAE;IAE5B,OAAO,WAAP,GACI,oBAACU,QAAMA;QACH,MAAM;QACN,SAAS3B;QACT,OAAO;QACP,OAAO;QACP,iBAAiB;QACjB,iBAAiB;QACjB,aAAa;QACb,OAAO0B,GAAG,KAAK,EAAE,MAAM,SAAS,CAAC,KAAK,EAAEZ,MAAM,IAAI,CAAC,MAAM,CAAC;QAC1D,uBACI,wDACI,oBAACa,OAAO,YAAY,uBACpB,oBAACA,OAAO,aAAa;YAAC,SAASL;YAAQ,MAAK;;qBAIpD,oBAAC;QAAI,WAAW;OACXI,GAAG,OAAO,GAAG,WAAH,GAAG,oBAACE,eAAaA;QAAC,MAAM;SAAyB,MAC3DF,GAAG,IAAI,GAAG,WAAH,GAAG,oBAACG,UAAQA;QAAC,MAAK;QAAmB,MAAMH,GAAG,IAAI;SAAO;AAIjF"}
|
|
@@ -12,6 +12,7 @@ interface DialogEntryCardProps {
|
|
|
12
12
|
onMoveDown?: never;
|
|
13
13
|
index?: never;
|
|
14
14
|
placement?: string;
|
|
15
|
+
onEdit?: (entry: CmsReferenceEntry) => void;
|
|
15
16
|
}
|
|
16
17
|
interface FieldEntryCardProps {
|
|
17
18
|
model: CmsModel;
|
|
@@ -24,6 +25,7 @@ interface FieldEntryCardProps {
|
|
|
24
25
|
onChange?: never;
|
|
25
26
|
selected?: never;
|
|
26
27
|
placement?: string;
|
|
28
|
+
onEdit?: (entry: CmsReferenceEntry) => void;
|
|
27
29
|
}
|
|
28
30
|
type EntryCardProps = DialogEntryCardProps | FieldEntryCardProps;
|
|
29
31
|
export declare const EntryCard: (props: EntryCardProps) => React.JSX.Element;
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import react, { useCallback, useMemo } from "react";
|
|
2
2
|
import { EntryImage } from "./EntryImage.js";
|
|
3
|
-
import { Checkbox, DropdownMenu, IconButton, Tag, Text, TimeAgo, cn } from "@webiny/admin-ui";
|
|
3
|
+
import { Checkbox, DropdownMenu, IconButton, Tag, Text, TimeAgo, Tooltip, cn } from "@webiny/admin-ui";
|
|
4
4
|
import { ReactComponent } from "@webiny/icons/more_vert.svg";
|
|
5
5
|
import { ReactComponent as open_in_new_svg_ReactComponent } from "@webiny/icons/open_in_new.svg";
|
|
6
|
+
import { ReactComponent as edit_svg_ReactComponent } from "@webiny/icons/edit.svg";
|
|
6
7
|
import { ReactComponent as close_svg_ReactComponent } from "@webiny/icons/close.svg";
|
|
7
8
|
import { ReactComponent as arrow_upward_svg_ReactComponent } from "@webiny/icons/arrow_upward.svg";
|
|
8
9
|
import { ReactComponent as arrow_downward_svg_ReactComponent } from "@webiny/icons/arrow_downward.svg";
|
|
9
10
|
import { useRouter } from "@webiny/app";
|
|
10
11
|
import { Routes } from "../../../../routes.js";
|
|
11
12
|
const EntryCard = (props)=>{
|
|
12
|
-
const { entry, onChange, onRemove, selected, index, placement, disabled = false } = props;
|
|
13
|
+
const { entry, onChange, onRemove, onEdit, selected, index, placement, disabled = false } = props;
|
|
13
14
|
const onMoveUpClick = props.onMoveUp;
|
|
14
15
|
const onMoveDownClick = props.onMoveDown;
|
|
15
16
|
const { getLink } = useRouter();
|
|
@@ -98,7 +99,16 @@ const EntryCard = (props)=>{
|
|
|
98
99
|
size: "sm",
|
|
99
100
|
icon: /*#__PURE__*/ react.createElement(arrow_downward_svg_ReactComponent, null),
|
|
100
101
|
onClick: onMoveDown
|
|
101
|
-
})), disabled
|
|
102
|
+
})), !disabled && onEdit ? /*#__PURE__*/ react.createElement(Tooltip, {
|
|
103
|
+
content: "Edit",
|
|
104
|
+
trigger: /*#__PURE__*/ react.createElement(IconButton, {
|
|
105
|
+
variant: "ghost",
|
|
106
|
+
size: "sm",
|
|
107
|
+
"aria-label": "Edit",
|
|
108
|
+
icon: /*#__PURE__*/ react.createElement(edit_svg_ReactComponent, null),
|
|
109
|
+
onClick: ()=>onEdit(entry)
|
|
110
|
+
})
|
|
111
|
+
}) : null, disabled ? null : /*#__PURE__*/ react.createElement(DropdownMenu, {
|
|
102
112
|
trigger: /*#__PURE__*/ react.createElement(IconButton, {
|
|
103
113
|
variant: "ghost",
|
|
104
114
|
size: "sm",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presentation/fieldRenderers/ref/components/EntryCard.js","sources":["../../../../../src/presentation/fieldRenderers/ref/components/EntryCard.tsx"],"sourcesContent":["import React, { useCallback, useMemo } from \"react\";\nimport type { CmsReferenceEntry, CmsReferenceValue } from \"~/features/contentEntry/refTypes.js\";\nimport type { CmsModel } from \"~/types.js\";\nimport { EntryImage } from \"./EntryImage.js\";\nimport { Tag, TimeAgo, Text, DropdownMenu, IconButton, Checkbox, cn } from \"@webiny/admin-ui\";\nimport { ReactComponent as MoreVertIcon } from \"@webiny/icons/more_vert.svg\";\nimport { ReactComponent as OpenInNewIcon } from \"@webiny/icons/open_in_new.svg\";\nimport { ReactComponent as RemoveIcon } from \"@webiny/icons/close.svg\";\nimport { ReactComponent as ArrowUp } from \"@webiny/icons/arrow_upward.svg\";\nimport { ReactComponent as ArrowDown } from \"@webiny/icons/arrow_downward.svg\";\nimport { useRouter } from \"@webiny/app\";\nimport { Routes } from \"~/routes.js\";\n\ninterface DialogEntryCardProps {\n model: CmsModel;\n entry: CmsReferenceEntry;\n selected: boolean;\n disabled?: boolean;\n onChange: (value: CmsReferenceValue) => void;\n onRemove?: never;\n onMoveUp?: never;\n onMoveDown?: never;\n index?: never;\n placement?: string;\n}\n\ninterface FieldEntryCardProps {\n model: CmsModel;\n entry: CmsReferenceEntry;\n disabled?: boolean;\n onRemove: (entryId: string) => void;\n index: number;\n onMoveUp?: (index: number, toTop: boolean) => void;\n onMoveDown?: (index: number, toBottom: boolean) => void;\n onChange?: never;\n selected?: never;\n placement?: string;\n}\n\ntype EntryCardProps = DialogEntryCardProps | FieldEntryCardProps;\n\nexport const EntryCard = (props: EntryCardProps) => {\n const { entry, onChange, onRemove, selected, index, placement, disabled = false } = props;\n const onMoveUpClick = props.onMoveUp;\n const onMoveDownClick = props.onMoveDown;\n const { getLink } = useRouter();\n\n const onSelect = useCallback(() => {\n if (onChange) {\n onChange({ id: entry.id, modelId: entry.model.modelId });\n }\n }, [onChange, entry.id, entry.model.modelId]);\n\n const onMoveUp = useCallback(\n (ev: React.MouseEvent) => {\n if (onMoveUpClick && index != null) {\n onMoveUpClick(index, ev.shiftKey);\n }\n },\n [onMoveUpClick, index]\n );\n\n const onMoveDown = useCallback(\n (ev: React.MouseEvent) => {\n if (onMoveDownClick && index != null) {\n onMoveDownClick(index, ev.shiftKey);\n }\n },\n [onMoveDownClick, index]\n );\n\n const entryStatusLabel = entry.status.charAt(0).toUpperCase() + entry.status.slice(1);\n\n const entryRevision = useMemo(() => {\n const extractedRevision = entry.id.split(\"#\")[1] || \"0001\";\n return \"v\" + Number(extractedRevision).toString();\n }, [entry.id]);\n\n const folderId = entry.wbyAco_location?.folderId || \"\";\n\n const link = getLink(Routes.ContentEntries.List, {\n id: entry.id,\n modelId: entry.model.modelId,\n folderId\n });\n\n return (\n <div\n data-selected={selected}\n onClick={onSelect}\n data-role=\"ref-field-entry\"\n className={cn(\n \"flex items-center justify-between gap-md w-full rounded-md bg-neutral-light p-sm-extra pr-lg hover:bg-neutral-dimmed border-md border-transparent data-[selected=true]:border-accent-dimmed\",\n { \"hover:cursor-pointer\": !!onChange }\n )}\n >\n {onChange && !disabled ? (\n <div>\n <Checkbox checked={selected} onChange={() => {}} />\n </div>\n ) : null}\n <div\n className={\n \"grid grid-cols-[auto_1fr] items-start @lg:items-center gap-lg text-sm text-neutral-muted w-full min-w-0\"\n }\n >\n <EntryImage title={entry.title} src={entry.image} />\n <div\n className={\n \"flex flex-col @lg:flex-row @lg:items-center @lg:justify-between gap-sm min-w-0\"\n }\n >\n <div className={\"min-w-0\"}>\n <div className={\"truncate\"}>{entry.model.name}</div>\n <div\n title={entry.title}\n className={\n \"text-md text-neutral-primary font-semibold mb-sm text-ellipsis overflow-hidden whitespace-nowrap block\"\n }\n >\n {entry.title}\n </div>\n <div>\n <span className={\"w-[60px] inline-block\"}>Created:</span>\n <span>\n {entry.createdBy.displayName},{\" \"}\n <TimeAgo datetime={entry.createdOn} />\n </span>\n </div>\n </div>\n <div className={\"flex items-center gap-sm shrink-0\"}>\n <Tag\n content={\n <>\n {entryStatusLabel} \n <Text size={\"sm\"} className={\"text-neutral-muted\"}>\n ({entryRevision})\n </Text>\n </>\n }\n variant={\"neutral-base-outline\"}\n />\n {!disabled && placement === \"multiRef\" ? (\n <div className={\"flex gap-xs\"}>\n <IconButton\n disabled={!onMoveUpClick}\n variant={\"ghost\"}\n size={\"sm\"}\n icon={<ArrowUp />}\n onClick={onMoveUp}\n />\n <IconButton\n disabled={!onMoveDownClick}\n variant={\"ghost\"}\n size={\"sm\"}\n icon={<ArrowDown />}\n onClick={onMoveDown}\n />\n </div>\n ) : null}\n {!disabled ? (\n <DropdownMenu\n trigger={\n <IconButton\n variant={\"ghost\"}\n size={\"sm\"}\n icon={<MoreVertIcon />}\n />\n }\n >\n <DropdownMenu.Link\n icon={<OpenInNewIcon />}\n text={\"Open in new tab\"}\n to={link}\n target={\"_blank\"}\n />\n {onRemove && (\n <DropdownMenu.Item\n icon={<RemoveIcon />}\n text={\n placement === \"multiRef\" ? \"Remove from list\" : \"Remove\"\n }\n onClick={() => onRemove(entry.id)}\n />\n )}\n </DropdownMenu>\n ) : null}\n </div>\n </div>\n </div>\n </div>\n );\n};\n"],"names":["EntryCard","props","entry","onChange","onRemove","selected","index","placement","disabled","onMoveUpClick","onMoveDownClick","getLink","useRouter","onSelect","useCallback","onMoveUp","ev","onMoveDown","entryStatusLabel","entryRevision","useMemo","extractedRevision","Number","folderId","link","Routes","cn","Checkbox","EntryImage","TimeAgo","Tag","Text","IconButton","ArrowUp","ArrowDown","DropdownMenu","MoreVertIcon","OpenInNewIcon","RemoveIcon"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"presentation/fieldRenderers/ref/components/EntryCard.js","sources":["../../../../../src/presentation/fieldRenderers/ref/components/EntryCard.tsx"],"sourcesContent":["import React, { useCallback, useMemo } from \"react\";\nimport type { CmsReferenceEntry, CmsReferenceValue } from \"~/features/contentEntry/refTypes.js\";\nimport type { CmsModel } from \"~/types.js\";\nimport { EntryImage } from \"./EntryImage.js\";\nimport {\n Tag,\n TimeAgo,\n Text,\n DropdownMenu,\n IconButton,\n Checkbox,\n Tooltip,\n cn\n} from \"@webiny/admin-ui\";\nimport { ReactComponent as MoreVertIcon } from \"@webiny/icons/more_vert.svg\";\nimport { ReactComponent as OpenInNewIcon } from \"@webiny/icons/open_in_new.svg\";\nimport { ReactComponent as EditIcon } from \"@webiny/icons/edit.svg\";\nimport { ReactComponent as RemoveIcon } from \"@webiny/icons/close.svg\";\nimport { ReactComponent as ArrowUp } from \"@webiny/icons/arrow_upward.svg\";\nimport { ReactComponent as ArrowDown } from \"@webiny/icons/arrow_downward.svg\";\nimport { useRouter } from \"@webiny/app\";\nimport { Routes } from \"~/routes.js\";\n\ninterface DialogEntryCardProps {\n model: CmsModel;\n entry: CmsReferenceEntry;\n selected: boolean;\n disabled?: boolean;\n onChange: (value: CmsReferenceValue) => void;\n onRemove?: never;\n onMoveUp?: never;\n onMoveDown?: never;\n index?: never;\n placement?: string;\n onEdit?: (entry: CmsReferenceEntry) => void;\n}\n\ninterface FieldEntryCardProps {\n model: CmsModel;\n entry: CmsReferenceEntry;\n disabled?: boolean;\n onRemove: (entryId: string) => void;\n index: number;\n onMoveUp?: (index: number, toTop: boolean) => void;\n onMoveDown?: (index: number, toBottom: boolean) => void;\n onChange?: never;\n selected?: never;\n placement?: string;\n onEdit?: (entry: CmsReferenceEntry) => void;\n}\n\ntype EntryCardProps = DialogEntryCardProps | FieldEntryCardProps;\n\nexport const EntryCard = (props: EntryCardProps) => {\n const {\n entry,\n onChange,\n onRemove,\n onEdit,\n selected,\n index,\n placement,\n disabled = false\n } = props;\n const onMoveUpClick = props.onMoveUp;\n const onMoveDownClick = props.onMoveDown;\n const { getLink } = useRouter();\n\n const onSelect = useCallback(() => {\n if (onChange) {\n onChange({ id: entry.id, modelId: entry.model.modelId });\n }\n }, [onChange, entry.id, entry.model.modelId]);\n\n const onMoveUp = useCallback(\n (ev: React.MouseEvent) => {\n if (onMoveUpClick && index != null) {\n onMoveUpClick(index, ev.shiftKey);\n }\n },\n [onMoveUpClick, index]\n );\n\n const onMoveDown = useCallback(\n (ev: React.MouseEvent) => {\n if (onMoveDownClick && index != null) {\n onMoveDownClick(index, ev.shiftKey);\n }\n },\n [onMoveDownClick, index]\n );\n\n const entryStatusLabel = entry.status.charAt(0).toUpperCase() + entry.status.slice(1);\n\n const entryRevision = useMemo(() => {\n const extractedRevision = entry.id.split(\"#\")[1] || \"0001\";\n return \"v\" + Number(extractedRevision).toString();\n }, [entry.id]);\n\n const folderId = entry.wbyAco_location?.folderId || \"\";\n\n const link = getLink(Routes.ContentEntries.List, {\n id: entry.id,\n modelId: entry.model.modelId,\n folderId\n });\n\n return (\n <div\n data-selected={selected}\n onClick={onSelect}\n data-role=\"ref-field-entry\"\n className={cn(\n \"flex items-center justify-between gap-md w-full rounded-md bg-neutral-light p-sm-extra pr-lg hover:bg-neutral-dimmed border-md border-transparent data-[selected=true]:border-accent-dimmed\",\n { \"hover:cursor-pointer\": !!onChange }\n )}\n >\n {onChange && !disabled ? (\n <div>\n <Checkbox checked={selected} onChange={() => {}} />\n </div>\n ) : null}\n <div\n className={\n \"grid grid-cols-[auto_1fr] items-start @lg:items-center gap-lg text-sm text-neutral-muted w-full min-w-0\"\n }\n >\n <EntryImage title={entry.title} src={entry.image} />\n <div\n className={\n \"flex flex-col @lg:flex-row @lg:items-center @lg:justify-between gap-sm min-w-0\"\n }\n >\n <div className={\"min-w-0\"}>\n <div className={\"truncate\"}>{entry.model.name}</div>\n <div\n title={entry.title}\n className={\n \"text-md text-neutral-primary font-semibold mb-sm text-ellipsis overflow-hidden whitespace-nowrap block\"\n }\n >\n {entry.title}\n </div>\n <div>\n <span className={\"w-[60px] inline-block\"}>Created:</span>\n <span>\n {entry.createdBy.displayName},{\" \"}\n <TimeAgo datetime={entry.createdOn} />\n </span>\n </div>\n </div>\n <div className={\"flex items-center gap-sm shrink-0\"}>\n <Tag\n content={\n <>\n {entryStatusLabel} \n <Text size={\"sm\"} className={\"text-neutral-muted\"}>\n ({entryRevision})\n </Text>\n </>\n }\n variant={\"neutral-base-outline\"}\n />\n {!disabled && placement === \"multiRef\" ? (\n <div className={\"flex gap-xs\"}>\n <IconButton\n disabled={!onMoveUpClick}\n variant={\"ghost\"}\n size={\"sm\"}\n icon={<ArrowUp />}\n onClick={onMoveUp}\n />\n <IconButton\n disabled={!onMoveDownClick}\n variant={\"ghost\"}\n size={\"sm\"}\n icon={<ArrowDown />}\n onClick={onMoveDown}\n />\n </div>\n ) : null}\n {!disabled && onEdit ? (\n <Tooltip\n content={\"Edit\"}\n trigger={\n <IconButton\n variant={\"ghost\"}\n size={\"sm\"}\n aria-label={\"Edit\"}\n icon={<EditIcon />}\n onClick={() => onEdit(entry)}\n />\n }\n />\n ) : null}\n {!disabled ? (\n <DropdownMenu\n trigger={\n <IconButton\n variant={\"ghost\"}\n size={\"sm\"}\n icon={<MoreVertIcon />}\n />\n }\n >\n <DropdownMenu.Link\n icon={<OpenInNewIcon />}\n text={\"Open in new tab\"}\n to={link}\n target={\"_blank\"}\n />\n {onRemove && (\n <DropdownMenu.Item\n icon={<RemoveIcon />}\n text={\n placement === \"multiRef\" ? \"Remove from list\" : \"Remove\"\n }\n onClick={() => onRemove(entry.id)}\n />\n )}\n </DropdownMenu>\n ) : null}\n </div>\n </div>\n </div>\n </div>\n );\n};\n"],"names":["EntryCard","props","entry","onChange","onRemove","onEdit","selected","index","placement","disabled","onMoveUpClick","onMoveDownClick","getLink","useRouter","onSelect","useCallback","onMoveUp","ev","onMoveDown","entryStatusLabel","entryRevision","useMemo","extractedRevision","Number","folderId","link","Routes","cn","Checkbox","EntryImage","TimeAgo","Tag","Text","IconButton","ArrowUp","ArrowDown","Tooltip","EditIcon","DropdownMenu","MoreVertIcon","OpenInNewIcon","RemoveIcon"],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@ interface RefFieldOptionsProps {
|
|
|
5
5
|
onNewRecord: (modelId: string) => void;
|
|
6
6
|
onLinkExistingRecord: (modelId: string) => void;
|
|
7
7
|
}
|
|
8
|
-
export declare const RefFieldOptions: (({ models, onNewRecord, onLinkExistingRecord }: RefFieldOptionsProps) => React.JSX.Element) & {
|
|
9
|
-
|
|
8
|
+
export declare const RefFieldOptions: (({ models, onNewRecord, onLinkExistingRecord }: RefFieldOptionsProps) => React.JSX.Element) & React.NamedExoticComponent<RefFieldOptionsProps> & {
|
|
9
|
+
readonly type: ({ models, onNewRecord, onLinkExistingRecord }: RefFieldOptionsProps) => React.JSX.Element;
|
|
10
10
|
};
|
|
11
11
|
export {};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { GetContentEntriesUseCase } from "../../../../features/contentEntry/getContentEntries/abstractions.js";
|
|
2
2
|
import { ListModelsUseCase } from "../../../../features/model/listModels/abstractions.js";
|
|
3
|
-
import type { CmsReferenceEntry, CmsReferenceValue } from "../../../../features/contentEntry/refTypes.js";
|
|
3
|
+
import type { CmsReferenceEntry, CmsReferenceEntryPatch, CmsReferenceValue } from "../../../../features/contentEntry/refTypes.js";
|
|
4
4
|
import { RefDetailedPresenter as Abstraction, type IRefDetailedPresenterInitConfig, type IRefDetailedViewModel } from "./abstractions.js";
|
|
5
5
|
declare class RefDetailedPresenterImpl implements Abstraction.Interface {
|
|
6
6
|
private getContentEntriesUseCase;
|
|
@@ -16,6 +16,7 @@ declare class RefDetailedPresenterImpl implements Abstraction.Interface {
|
|
|
16
16
|
init(config: IRefDetailedPresenterInitConfig): Promise<void>;
|
|
17
17
|
resolveValues(values: CmsReferenceValue[]): Promise<void>;
|
|
18
18
|
addEntries(entries: CmsReferenceEntry[]): void;
|
|
19
|
+
patchEntry(patch: CmsReferenceEntryPatch): void;
|
|
19
20
|
removeEntry(entryId: string): void;
|
|
20
21
|
loadMore(): void;
|
|
21
22
|
dispose(): void;
|
|
@@ -51,6 +51,12 @@ class RefDetailedPresenterImpl {
|
|
|
51
51
|
...newEntries
|
|
52
52
|
];
|
|
53
53
|
}
|
|
54
|
+
patchEntry(patch) {
|
|
55
|
+
this.entries = this.entries.map((e)=>e.entryId === patch.entryId ? {
|
|
56
|
+
...e,
|
|
57
|
+
...patch
|
|
58
|
+
} : e);
|
|
59
|
+
}
|
|
54
60
|
removeEntry(entryId) {
|
|
55
61
|
this.entries = this.entries.filter((e)=>e.entryId !== entryId);
|
|
56
62
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presentation/fieldRenderers/ref/detailed/RefDetailedPresenter.js","sources":["../../../../../src/presentation/fieldRenderers/ref/detailed/RefDetailedPresenter.ts"],"sourcesContent":["import { computed, makeAutoObservable, runInAction } from \"mobx\";\nimport { GetContentEntriesUseCase } from \"~/features/contentEntry/getContentEntries/abstractions.js\";\nimport { ListModelsUseCase } from \"~/features/model/listModels/abstractions.js\";\nimport type { CmsModel } from \"~/types.js\";\nimport type {
|
|
1
|
+
{"version":3,"file":"presentation/fieldRenderers/ref/detailed/RefDetailedPresenter.js","sources":["../../../../../src/presentation/fieldRenderers/ref/detailed/RefDetailedPresenter.ts"],"sourcesContent":["import { computed, makeAutoObservable, runInAction } from \"mobx\";\nimport { GetContentEntriesUseCase } from \"~/features/contentEntry/getContentEntries/abstractions.js\";\nimport { ListModelsUseCase } from \"~/features/model/listModels/abstractions.js\";\nimport type { CmsModel } from \"~/types.js\";\nimport type {\n CmsReferenceEntry,\n CmsReferenceEntryPatch,\n CmsReferenceValue\n} from \"~/features/contentEntry/refTypes.js\";\nimport {\n RefDetailedPresenter as Abstraction,\n type IRefDetailedPresenterInitConfig,\n type IRefDetailedViewModel\n} from \"./abstractions.js\";\n\nconst PER_PAGE = 10;\n\nclass RefDetailedPresenterImpl implements Abstraction.Interface {\n private loading = false;\n private entries: CmsReferenceEntry[] = [];\n private models: CmsModel[] = [];\n private multiSelect = false;\n private currentPage = 0;\n private allValues: CmsReferenceValue[] = [];\n\n constructor(\n private getContentEntriesUseCase: GetContentEntriesUseCase.Interface,\n private listModelsUseCase: ListModelsUseCase.Interface\n ) {\n makeAutoObservable<\n RefDetailedPresenterImpl,\n \"getContentEntriesUseCase\" | \"listModelsUseCase\"\n >(this, {\n getContentEntriesUseCase: false,\n listModelsUseCase: false,\n vm: computed\n });\n }\n\n get vm(): IRefDetailedViewModel {\n return {\n loading: this.loading,\n entries: this.entries,\n models: this.models,\n multiSelect: this.multiSelect\n };\n }\n\n async init(config: IRefDetailedPresenterInitConfig): Promise<void> {\n this.multiSelect = config.multiSelect;\n\n const allModels = await this.listModelsUseCase.execute();\n runInAction(() => {\n this.models = allModels.filter(m => config.modelIds.includes(m.modelId));\n });\n }\n\n async resolveValues(values: CmsReferenceValue[]): Promise<void> {\n this.allValues = values;\n this.currentPage = 0;\n\n if (values.length === 0) {\n this.entries = [];\n return;\n }\n\n await this.loadPage(0);\n }\n\n addEntries(entries: CmsReferenceEntry[]): void {\n const existingIds = new Set(this.entries.map(e => e.entryId));\n const newEntries = entries.filter(e => !existingIds.has(e.entryId));\n this.entries = [...this.entries, ...newEntries];\n }\n\n patchEntry(patch: CmsReferenceEntryPatch): void {\n this.entries = this.entries.map(e =>\n e.entryId === patch.entryId ? { ...e, ...patch } : e\n );\n }\n\n removeEntry(entryId: string): void {\n this.entries = this.entries.filter(e => e.entryId !== entryId);\n }\n\n loadMore(): void {\n const nextPage = this.currentPage + 1;\n const start = nextPage * PER_PAGE;\n if (start >= this.allValues.length) {\n return;\n }\n this.loadPage(nextPage);\n }\n\n dispose(): void {\n // Cleanup if needed\n }\n\n private async loadPage(page: number): Promise<void> {\n const start = page * PER_PAGE;\n const chunk = this.allValues.slice(start, start + PER_PAGE);\n\n if (chunk.length === 0) {\n return;\n }\n\n this.loading = true;\n\n try {\n const result = await this.getContentEntriesUseCase.execute({\n entries: chunk.map(v => ({ id: v.id, modelId: v.modelId }))\n });\n\n runInAction(() => {\n this.currentPage = page;\n\n const entryMap = new Map<string, CmsReferenceEntry>();\n for (const entry of result.latest) {\n entryMap.set(entry.entryId, entry);\n }\n\n for (const entry of result.published) {\n const existing = entryMap.get(entry.entryId);\n if (existing) {\n existing.published = {\n id: entry.id,\n entryId: entry.entryId,\n title: entry.title\n };\n }\n }\n\n const resolved = chunk\n .map(v => {\n const entryId = v.id.split(\"#\")[0];\n return entryMap.get(entryId);\n })\n .filter((e): e is CmsReferenceEntry => e != null);\n\n if (page === 0) {\n this.entries = resolved;\n } else {\n this.entries = [...this.entries, ...resolved];\n }\n });\n } finally {\n runInAction(() => {\n this.loading = false;\n });\n }\n }\n}\n\nexport const RefDetailedPresenter = Abstraction.createImplementation({\n implementation: RefDetailedPresenterImpl,\n dependencies: [GetContentEntriesUseCase, ListModelsUseCase]\n});\n"],"names":["PER_PAGE","RefDetailedPresenterImpl","getContentEntriesUseCase","listModelsUseCase","makeAutoObservable","computed","config","allModels","runInAction","m","values","entries","existingIds","Set","e","newEntries","patch","entryId","nextPage","start","page","chunk","result","v","entryMap","Map","entry","existing","resolved","RefDetailedPresenter","Abstraction","GetContentEntriesUseCase","ListModelsUseCase"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { CmsModel } from "../../../../types.js";
|
|
2
|
-
import type { CmsReferenceEntry, CmsReferenceValue } from "../../../../features/contentEntry/refTypes.js";
|
|
2
|
+
import type { CmsReferenceEntry, CmsReferenceEntryPatch, CmsReferenceValue } from "../../../../features/contentEntry/refTypes.js";
|
|
3
3
|
export interface IRefDetailedPresenterInitConfig {
|
|
4
4
|
modelIds: string[];
|
|
5
5
|
multiSelect: boolean;
|
|
@@ -15,6 +15,7 @@ export interface IRefDetailedPresenter {
|
|
|
15
15
|
init(config: IRefDetailedPresenterInitConfig): Promise<void>;
|
|
16
16
|
resolveValues(values: CmsReferenceValue[]): Promise<void>;
|
|
17
17
|
addEntries(entries: CmsReferenceEntry[]): void;
|
|
18
|
+
patchEntry(patch: CmsReferenceEntryPatch): void;
|
|
18
19
|
removeEntry(entryId: string): void;
|
|
19
20
|
loadMore(): void;
|
|
20
21
|
dispose(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presentation/fieldRenderers/ref/detailed/abstractions.js","sources":["../../../../../src/presentation/fieldRenderers/ref/detailed/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/admin\";\nimport type { CmsModel } from \"~/types.js\";\nimport type {
|
|
1
|
+
{"version":3,"file":"presentation/fieldRenderers/ref/detailed/abstractions.js","sources":["../../../../../src/presentation/fieldRenderers/ref/detailed/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/admin\";\nimport type { CmsModel } from \"~/types.js\";\nimport type {\n CmsReferenceEntry,\n CmsReferenceEntryPatch,\n CmsReferenceValue\n} from \"~/features/contentEntry/refTypes.js\";\n\nexport interface IRefDetailedPresenterInitConfig {\n modelIds: string[];\n multiSelect: boolean;\n}\n\nexport interface IRefDetailedViewModel {\n loading: boolean;\n entries: CmsReferenceEntry[];\n models: CmsModel[];\n multiSelect: boolean;\n}\n\nexport interface IRefDetailedPresenter {\n readonly vm: IRefDetailedViewModel;\n init(config: IRefDetailedPresenterInitConfig): Promise<void>;\n resolveValues(values: CmsReferenceValue[]): Promise<void>;\n addEntries(entries: CmsReferenceEntry[]): void;\n patchEntry(patch: CmsReferenceEntryPatch): void;\n removeEntry(entryId: string): void;\n loadMore(): void;\n dispose(): void;\n}\n\nexport const RefDetailedPresenter =\n createAbstraction<IRefDetailedPresenter>(\"RefDetailedPresenter\");\n\nexport namespace RefDetailedPresenter {\n export type Interface = IRefDetailedPresenter;\n export type InitConfig = IRefDetailedPresenterInitConfig;\n export type ViewModel = IRefDetailedViewModel;\n}\n"],"names":["RefDetailedPresenter","createAbstraction"],"mappings":";AA+BO,MAAMA,uBACTC,kBAAyC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ContentEntryFormPresenter } from "../../../../presentation/contentEntries/form/abstractions.js";
|
|
2
|
+
import { EditEntryPresenter as Abstraction } from "./abstractions.js";
|
|
3
|
+
declare class EditEntryPresenterImpl implements Abstraction.Interface {
|
|
4
|
+
private formPresenter;
|
|
5
|
+
constructor(formPresenter: ContentEntryFormPresenter.Interface);
|
|
6
|
+
get form(): ContentEntryFormPresenter.Interface;
|
|
7
|
+
init(entryId: string): void;
|
|
8
|
+
dispose(): void;
|
|
9
|
+
}
|
|
10
|
+
export declare const EditEntryPresenter: typeof EditEntryPresenterImpl & {
|
|
11
|
+
__abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").IEditEntryPresenter>;
|
|
12
|
+
};
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { ContentEntryFormPresenter } from "../../../contentEntries/form/abstractions.js";
|
|
2
|
+
import { EditEntryPresenter } from "./abstractions.js";
|
|
3
|
+
class EditEntryPresenterImpl {
|
|
4
|
+
constructor(formPresenter){
|
|
5
|
+
this.formPresenter = formPresenter;
|
|
6
|
+
}
|
|
7
|
+
get form() {
|
|
8
|
+
return this.formPresenter;
|
|
9
|
+
}
|
|
10
|
+
init(entryId) {
|
|
11
|
+
this.formPresenter.loadRevision(entryId);
|
|
12
|
+
}
|
|
13
|
+
dispose() {
|
|
14
|
+
this.formPresenter.reset();
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
const EditEntryPresenter_EditEntryPresenter = EditEntryPresenter.createImplementation({
|
|
18
|
+
implementation: EditEntryPresenterImpl,
|
|
19
|
+
dependencies: [
|
|
20
|
+
ContentEntryFormPresenter
|
|
21
|
+
]
|
|
22
|
+
});
|
|
23
|
+
export { EditEntryPresenter_EditEntryPresenter as EditEntryPresenter };
|
|
24
|
+
|
|
25
|
+
//# sourceMappingURL=EditEntryPresenter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presentation/fieldRenderers/ref/editEntry/EditEntryPresenter.js","sources":["../../../../../src/presentation/fieldRenderers/ref/editEntry/EditEntryPresenter.ts"],"sourcesContent":["import { ContentEntryFormPresenter } from \"~/presentation/contentEntries/form/abstractions.js\";\nimport { EditEntryPresenter as Abstraction } from \"./abstractions.js\";\n\nclass EditEntryPresenterImpl implements Abstraction.Interface {\n constructor(private formPresenter: ContentEntryFormPresenter.Interface) {}\n\n get form(): ContentEntryFormPresenter.Interface {\n return this.formPresenter;\n }\n\n init(entryId: string): void {\n this.formPresenter.loadRevision(entryId);\n }\n\n dispose(): void {\n this.formPresenter.reset();\n }\n}\n\nexport const EditEntryPresenter = Abstraction.createImplementation({\n implementation: EditEntryPresenterImpl,\n dependencies: [ContentEntryFormPresenter]\n});\n"],"names":["EditEntryPresenterImpl","formPresenter","entryId","EditEntryPresenter","Abstraction","ContentEntryFormPresenter"],"mappings":";;AAGA,MAAMA;IACF,YAAoBC,aAAkD,CAAE;aAApDA,aAAa,GAAbA;IAAqD;IAEzE,IAAI,OAA4C;QAC5C,OAAO,IAAI,CAAC,aAAa;IAC7B;IAEA,KAAKC,OAAe,EAAQ;QACxB,IAAI,CAAC,aAAa,CAAC,YAAY,CAACA;IACpC;IAEA,UAAgB;QACZ,IAAI,CAAC,aAAa,CAAC,KAAK;IAC5B;AACJ;AAEO,MAAMC,wCAAqBC,mBAAAA,oBAAgC,CAAC;IAC/D,gBAAgBJ;IAChB,cAAc;QAACK;KAA0B;AAC7C"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ContentEntryFormPresenter } from "../../../../presentation/contentEntries/form/abstractions.js";
|
|
2
|
+
export interface IEditEntryPresenter {
|
|
3
|
+
readonly form: ContentEntryFormPresenter.Interface;
|
|
4
|
+
init(entryId: string): void;
|
|
5
|
+
dispose(): void;
|
|
6
|
+
}
|
|
7
|
+
export declare const EditEntryPresenter: import("@webiny/di").Abstraction<IEditEntryPresenter>;
|
|
8
|
+
export declare namespace EditEntryPresenter {
|
|
9
|
+
type Interface = IEditEntryPresenter;
|
|
10
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presentation/fieldRenderers/ref/editEntry/abstractions.js","sources":["../../../../../src/presentation/fieldRenderers/ref/editEntry/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/admin\";\nimport type { ContentEntryFormPresenter } from \"~/presentation/contentEntries/form/abstractions.js\";\n\nexport interface IEditEntryPresenter {\n readonly form: ContentEntryFormPresenter.Interface;\n init(entryId: string): void;\n dispose(): void;\n}\n\nexport const EditEntryPresenter = createAbstraction<IEditEntryPresenter>(\"EditEntryPresenter\");\n\nexport namespace EditEntryPresenter {\n export type Interface = IEditEntryPresenter;\n}\n"],"names":["EditEntryPresenter","createAbstraction"],"mappings":";AASO,MAAMA,qBAAqBC,kBAAuC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { createFeature } from "@webiny/feature/admin";
|
|
2
|
+
import { EditEntryPresenter } from "./abstractions.js";
|
|
3
|
+
import { EditEntryPresenter as external_EditEntryPresenter_js_EditEntryPresenter } from "./EditEntryPresenter.js";
|
|
4
|
+
const EditEntryPresenterFeature = createFeature({
|
|
5
|
+
name: "CmsRefField/EditEntryPresenter",
|
|
6
|
+
register (container) {
|
|
7
|
+
container.register(external_EditEntryPresenter_js_EditEntryPresenter).inSingletonScope();
|
|
8
|
+
},
|
|
9
|
+
resolve (container) {
|
|
10
|
+
return {
|
|
11
|
+
presenter: container.resolve(EditEntryPresenter)
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
export { EditEntryPresenterFeature };
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=feature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presentation/fieldRenderers/ref/editEntry/feature.js","sources":["../../../../../src/presentation/fieldRenderers/ref/editEntry/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/admin\";\nimport { EditEntryPresenter as Abstraction } from \"./abstractions.js\";\nimport { EditEntryPresenter } from \"./EditEntryPresenter.js\";\n\nexport const EditEntryPresenterFeature = createFeature({\n name: \"CmsRefField/EditEntryPresenter\",\n register(container) {\n container.register(EditEntryPresenter).inSingletonScope();\n },\n resolve(container) {\n return {\n presenter: container.resolve(Abstraction)\n };\n }\n});\n"],"names":["EditEntryPresenterFeature","createFeature","container","EditEntryPresenter","Abstraction"],"mappings":";;;AAIO,MAAMA,4BAA4BC,cAAc;IACnD,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC,mDAAoB,gBAAgB;IAC3D;IACA,SAAQD,SAAS;QACb,OAAO;YACH,WAAWA,UAAU,OAAO,CAACE;QACjC;IACJ;AACJ"}
|
|
@@ -34,6 +34,18 @@ export interface ICmsFieldType {
|
|
|
34
34
|
readonly tags?: string[];
|
|
35
35
|
readonly canEditSettings?: boolean;
|
|
36
36
|
readonly allowLayout?: boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Deprecated field types stay usable but are hidden from the "add field"
|
|
39
|
+
* palette unless the current model already contains a field of this type.
|
|
40
|
+
*/
|
|
41
|
+
readonly deprecated?: boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Optional override for resolving this descriptor for a given field, used when
|
|
44
|
+
* a field's stored `type` is not enough to pick the right descriptor (e.g. the
|
|
45
|
+
* Asset field is stored as `object` but must resolve to the Asset descriptor).
|
|
46
|
+
* Checked before the default `ft.type === field.type` match.
|
|
47
|
+
*/
|
|
48
|
+
matches?(field: CmsModelField): boolean;
|
|
37
49
|
canAccept?(field: CmsModelField, draggable: DragSource): boolean;
|
|
38
50
|
renderInfo?(params: {
|
|
39
51
|
field: CmsModelField;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presentation/fieldTypes/abstractions.js","sources":["../../../src/presentation/fieldTypes/abstractions.ts"],"sourcesContent":["import React from \"react\";\nimport { createAbstraction } from \"@webiny/feature/admin\";\nimport type { CmsModel, CmsModelField, CmsLayoutField, DragSource } from \"~/types.js\";\n\nexport interface CmsModelFieldValidatorConfig {\n name: string;\n required?: boolean;\n label?: string;\n description?: string;\n defaultMessage?: string;\n defaultSettings?: Record<string, any>;\n variables?: { name: string; description: string }[];\n}\n\nexport interface CmsModelFieldValidatorsGroup {\n validators: (string | CmsModelFieldValidatorConfig)[];\n title?: string;\n description?: string;\n}\n\nexport interface CmsModelFieldValidatorsFactory {\n (field: CmsModelField): string[] | CmsModelFieldValidatorsGroup;\n}\n\nexport interface ICmsFieldType {\n readonly type: string;\n readonly label: string;\n readonly description: string;\n readonly icon: React.ReactElement;\n\n readonly allowList: boolean;\n readonly listLabel?: string;\n readonly allowPredefinedValues: boolean;\n\n readonly validators?: string[] | CmsModelFieldValidatorsGroup | CmsModelFieldValidatorsFactory;\n readonly listValidators?:\n | string[]\n | CmsModelFieldValidatorsGroup\n | CmsModelFieldValidatorsFactory;\n\n readonly hideInAdmin?: boolean;\n readonly tags?: string[];\n readonly canEditSettings?: boolean;\n readonly allowLayout?: boolean;\n\n canAccept?(field: CmsModelField, draggable: DragSource): boolean;\n\n renderInfo?(params: { field: CmsModelField; model: CmsModel }): React.ReactNode;\n renderEditor?(params: { field: CmsModelField; model: CmsModel }): React.ReactNode;\n\n createField(): Pick<CmsModelField, \"type\" | \"validation\" | \"renderer\" | \"settings\">;\n}\n\nexport const CmsFieldType = createAbstraction<ICmsFieldType>(\"CmsFieldType\");\n\nexport namespace CmsFieldType {\n export type Interface = ICmsFieldType;\n}\n\nexport interface ICmsLayoutFieldType {\n readonly type: string;\n readonly label: string;\n readonly description: string;\n readonly icon: React.ReactElement;\n readonly canEditSettings?: boolean;\n\n createField(): Omit<CmsLayoutField, \"id\">;\n\n collectFields?(params: {\n field: CmsLayoutField;\n getField: (id: string) => CmsModelField | undefined;\n }): CmsModelField[];\n\n getFieldLabelPrefixes?(params: { field: CmsLayoutField }): Record<string, string>;\n\n render(params: {\n field: CmsLayoutField;\n onUpdate: (d: CmsLayoutField) => void;\n onDelete: () => void;\n }): React.ReactElement;\n}\n\nexport const CmsLayoutFieldType = createAbstraction<ICmsLayoutFieldType>(\"CmsLayoutFieldType\");\n\nexport namespace CmsLayoutFieldType {\n export type Interface = ICmsLayoutFieldType;\n}\n"],"names":["CmsFieldType","createAbstraction","CmsLayoutFieldType"],"mappings":";
|
|
1
|
+
{"version":3,"file":"presentation/fieldTypes/abstractions.js","sources":["../../../src/presentation/fieldTypes/abstractions.ts"],"sourcesContent":["import React from \"react\";\nimport { createAbstraction } from \"@webiny/feature/admin\";\nimport type { CmsModel, CmsModelField, CmsLayoutField, DragSource } from \"~/types.js\";\n\nexport interface CmsModelFieldValidatorConfig {\n name: string;\n required?: boolean;\n label?: string;\n description?: string;\n defaultMessage?: string;\n defaultSettings?: Record<string, any>;\n variables?: { name: string; description: string }[];\n}\n\nexport interface CmsModelFieldValidatorsGroup {\n validators: (string | CmsModelFieldValidatorConfig)[];\n title?: string;\n description?: string;\n}\n\nexport interface CmsModelFieldValidatorsFactory {\n (field: CmsModelField): string[] | CmsModelFieldValidatorsGroup;\n}\n\nexport interface ICmsFieldType {\n readonly type: string;\n readonly label: string;\n readonly description: string;\n readonly icon: React.ReactElement;\n\n readonly allowList: boolean;\n readonly listLabel?: string;\n readonly allowPredefinedValues: boolean;\n\n readonly validators?: string[] | CmsModelFieldValidatorsGroup | CmsModelFieldValidatorsFactory;\n readonly listValidators?:\n | string[]\n | CmsModelFieldValidatorsGroup\n | CmsModelFieldValidatorsFactory;\n\n readonly hideInAdmin?: boolean;\n readonly tags?: string[];\n readonly canEditSettings?: boolean;\n readonly allowLayout?: boolean;\n\n /**\n * Deprecated field types stay usable but are hidden from the \"add field\"\n * palette unless the current model already contains a field of this type.\n */\n readonly deprecated?: boolean;\n\n /**\n * Optional override for resolving this descriptor for a given field, used when\n * a field's stored `type` is not enough to pick the right descriptor (e.g. the\n * Asset field is stored as `object` but must resolve to the Asset descriptor).\n * Checked before the default `ft.type === field.type` match.\n */\n matches?(field: CmsModelField): boolean;\n\n canAccept?(field: CmsModelField, draggable: DragSource): boolean;\n\n renderInfo?(params: { field: CmsModelField; model: CmsModel }): React.ReactNode;\n renderEditor?(params: { field: CmsModelField; model: CmsModel }): React.ReactNode;\n\n createField(): Pick<CmsModelField, \"type\" | \"validation\" | \"renderer\" | \"settings\">;\n}\n\nexport const CmsFieldType = createAbstraction<ICmsFieldType>(\"CmsFieldType\");\n\nexport namespace CmsFieldType {\n export type Interface = ICmsFieldType;\n}\n\nexport interface ICmsLayoutFieldType {\n readonly type: string;\n readonly label: string;\n readonly description: string;\n readonly icon: React.ReactElement;\n readonly canEditSettings?: boolean;\n\n createField(): Omit<CmsLayoutField, \"id\">;\n\n collectFields?(params: {\n field: CmsLayoutField;\n getField: (id: string) => CmsModelField | undefined;\n }): CmsModelField[];\n\n getFieldLabelPrefixes?(params: { field: CmsLayoutField }): Record<string, string>;\n\n render(params: {\n field: CmsLayoutField;\n onUpdate: (d: CmsLayoutField) => void;\n onDelete: () => void;\n }): React.ReactElement;\n}\n\nexport const CmsLayoutFieldType = createAbstraction<ICmsLayoutFieldType>(\"CmsLayoutFieldType\");\n\nexport namespace CmsLayoutFieldType {\n export type Interface = ICmsLayoutFieldType;\n}\n"],"names":["CmsFieldType","createAbstraction","CmsLayoutFieldType"],"mappings":";AAmEO,MAAMA,eAAeC,kBAAiC;AA6BtD,MAAMC,qBAAqBD,kBAAuC"}
|
|
@@ -5,7 +5,7 @@ class SelectBoxRendererImpl {
|
|
|
5
5
|
}
|
|
6
6
|
constructor(){
|
|
7
7
|
this.rendererName = "select-box";
|
|
8
|
-
this.formRenderer = "
|
|
8
|
+
this.formRenderer = "select";
|
|
9
9
|
this.name = "Select Box";
|
|
10
10
|
this.description = "Renders a select box, allowing selection of a single value.";
|
|
11
11
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presentation/fieldTypes/renderers/common/SelectBoxRenderer.js","sources":["../../../../../src/presentation/fieldTypes/renderers/common/SelectBoxRenderer.ts"],"sourcesContent":["import { CmsFieldRenderer } from \"~/presentation/fieldRenderers/abstractions.js\";\nimport type { CmsModelField } from \"~/types.js\";\n\nclass SelectBoxRendererImpl implements CmsFieldRenderer.Interface {\n rendererName = \"select-box\";\n formRenderer = \"
|
|
1
|
+
{"version":3,"file":"presentation/fieldTypes/renderers/common/SelectBoxRenderer.js","sources":["../../../../../src/presentation/fieldTypes/renderers/common/SelectBoxRenderer.ts"],"sourcesContent":["import { CmsFieldRenderer } from \"~/presentation/fieldRenderers/abstractions.js\";\nimport type { CmsModelField } from \"~/types.js\";\n\nclass SelectBoxRendererImpl implements CmsFieldRenderer.Interface {\n rendererName = \"select-box\";\n formRenderer = \"select\";\n name = \"Select Box\";\n description = \"Renders a select box, allowing selection of a single value.\";\n\n canUse({ field }: { field: CmsModelField }) {\n return !field.list && !!field.predefinedValues?.enabled;\n }\n}\n\nexport const SelectBoxRenderer = CmsFieldRenderer.createImplementation({\n implementation: SelectBoxRendererImpl,\n dependencies: []\n});\n"],"names":["SelectBoxRendererImpl","field","SelectBoxRenderer","CmsFieldRenderer"],"mappings":";AAGA,MAAMA;IAMF,OAAO,EAAEC,KAAK,EAA4B,EAAE;QACxC,OAAO,CAACA,MAAM,IAAI,IAAI,CAAC,CAACA,MAAM,gBAAgB,EAAE;IACpD;;aAPA,YAAY,GAAG;aACf,YAAY,GAAG;aACf,IAAI,GAAG;aACP,WAAW,GAAG;;AAKlB;AAEO,MAAMC,oBAAoBC,iBAAiB,oBAAoB,CAAC;IACnE,gBAAgBH;IAChB,cAAc,EAAE;AACpB"}
|