@strapi/content-manager 0.0.0-next.0791cd2736057a8f66ee1682f02c46307a4d6e4a → 0.0.0-next.0fc44faf3ab6f94c481a4d426988705776878bb3
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/dist/admin/components/LeftMenu.js +34 -30
- package/dist/admin/components/LeftMenu.js.map +1 -1
- package/dist/admin/components/LeftMenu.mjs +36 -32
- package/dist/admin/components/LeftMenu.mjs.map +1 -1
- package/dist/admin/components/Widgets.js +161 -0
- package/dist/admin/components/Widgets.js.map +1 -0
- package/dist/admin/components/Widgets.mjs +158 -0
- package/dist/admin/components/Widgets.mjs.map +1 -0
- package/dist/admin/hooks/useDocumentActions.js +5 -1
- package/dist/admin/hooks/useDocumentActions.js.map +1 -1
- package/dist/admin/hooks/useDocumentActions.mjs +5 -1
- package/dist/admin/hooks/useDocumentActions.mjs.map +1 -1
- package/dist/admin/hooks/useDocumentContext.js.map +1 -1
- package/dist/admin/hooks/useDocumentContext.mjs.map +1 -1
- package/dist/admin/index.js +42 -5
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +42 -3
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/DocumentActions.js +230 -28
- package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
- package/dist/admin/pages/EditView/components/DocumentActions.mjs +232 -30
- package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js +7 -12
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs +8 -13
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js +19 -33
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs +19 -33
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js +46 -95
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs +48 -78
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +2 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +2 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +128 -55
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs +128 -55
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +89 -50
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +91 -52
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.js +50 -97
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.mjs +51 -79
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormLayout.js +3 -3
- package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormLayout.mjs +3 -3
- package/dist/admin/pages/EditView/components/FormLayout.mjs.map +1 -1
- package/dist/admin/pages/ListView/ListViewPage.js +77 -0
- package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
- package/dist/admin/pages/ListView/ListViewPage.mjs +78 -1
- package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
- package/dist/admin/preview/components/PreviewHeader.js +1 -1
- package/dist/admin/preview/components/PreviewHeader.js.map +1 -1
- package/dist/admin/preview/components/PreviewHeader.mjs +1 -1
- package/dist/admin/preview/components/PreviewHeader.mjs.map +1 -1
- package/dist/admin/services/homepage.js +30 -0
- package/dist/admin/services/homepage.js.map +1 -0
- package/dist/admin/services/homepage.mjs +28 -0
- package/dist/admin/services/homepage.mjs.map +1 -0
- package/dist/admin/src/components/Widgets.d.ts +3 -0
- package/dist/admin/src/hooks/useDocumentContext.d.ts +1 -1
- package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.d.ts +2 -2
- package/dist/admin/src/pages/EditView/components/FormInputs/Relations/RelationModal.d.ts +26 -5
- package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +0 -1
- package/dist/admin/src/services/homepage.d.ts +5 -0
- package/dist/admin/translations/en.json.js +3 -1
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +3 -1
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/admin/translations/ru.json.js +235 -226
- package/dist/admin/translations/ru.json.js.map +1 -1
- package/dist/admin/translations/ru.json.mjs +230 -226
- package/dist/admin/translations/ru.json.mjs.map +1 -1
- package/dist/server/controllers/index.js +3 -1
- package/dist/server/controllers/index.js.map +1 -1
- package/dist/server/controllers/index.mjs +3 -1
- package/dist/server/controllers/index.mjs.map +1 -1
- package/dist/server/history/services/lifecycles.js +3 -0
- package/dist/server/history/services/lifecycles.js.map +1 -1
- package/dist/server/history/services/lifecycles.mjs +3 -0
- package/dist/server/history/services/lifecycles.mjs.map +1 -1
- package/dist/server/homepage/controllers/homepage.js +57 -0
- package/dist/server/homepage/controllers/homepage.js.map +1 -0
- package/dist/server/homepage/controllers/homepage.mjs +36 -0
- package/dist/server/homepage/controllers/homepage.mjs.map +1 -0
- package/dist/server/homepage/controllers/index.js +10 -0
- package/dist/server/homepage/controllers/index.js.map +1 -0
- package/dist/server/homepage/controllers/index.mjs +8 -0
- package/dist/server/homepage/controllers/index.mjs.map +1 -0
- package/dist/server/homepage/index.js +14 -0
- package/dist/server/homepage/index.js.map +1 -0
- package/dist/server/homepage/index.mjs +12 -0
- package/dist/server/homepage/index.mjs.map +1 -0
- package/dist/server/homepage/routes/homepage.js +25 -0
- package/dist/server/homepage/routes/homepage.js.map +1 -0
- package/dist/server/homepage/routes/homepage.mjs +23 -0
- package/dist/server/homepage/routes/homepage.mjs.map +1 -0
- package/dist/server/homepage/routes/index.js +13 -0
- package/dist/server/homepage/routes/index.js.map +1 -0
- package/dist/server/homepage/routes/index.mjs +11 -0
- package/dist/server/homepage/routes/index.mjs.map +1 -0
- package/dist/server/homepage/services/homepage.js +157 -0
- package/dist/server/homepage/services/homepage.js.map +1 -0
- package/dist/server/homepage/services/homepage.mjs +155 -0
- package/dist/server/homepage/services/homepage.mjs.map +1 -0
- package/dist/server/homepage/services/index.js +10 -0
- package/dist/server/homepage/services/index.js.map +1 -0
- package/dist/server/homepage/services/index.mjs +8 -0
- package/dist/server/homepage/services/index.mjs.map +1 -0
- package/dist/server/preview/services/preview.js +0 -1
- package/dist/server/preview/services/preview.js.map +1 -1
- package/dist/server/preview/services/preview.mjs +0 -1
- package/dist/server/preview/services/preview.mjs.map +1 -1
- package/dist/server/routes/index.js +3 -1
- package/dist/server/routes/index.js.map +1 -1
- package/dist/server/routes/index.mjs +3 -1
- package/dist/server/routes/index.mjs.map +1 -1
- package/dist/server/services/index.js +3 -1
- package/dist/server/services/index.js.map +1 -1
- package/dist/server/services/index.mjs +3 -1
- package/dist/server/services/index.mjs.map +1 -1
- package/dist/server/src/controllers/index.d.ts.map +1 -1
- package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
- package/dist/server/src/homepage/controllers/homepage.d.ts +7 -0
- package/dist/server/src/homepage/controllers/homepage.d.ts.map +1 -0
- package/dist/server/src/homepage/controllers/index.d.ts +2 -0
- package/dist/server/src/homepage/controllers/index.d.ts.map +1 -0
- package/dist/server/src/homepage/index.d.ts +16 -0
- package/dist/server/src/homepage/index.d.ts.map +1 -0
- package/dist/server/src/homepage/routes/homepage.d.ts +4 -0
- package/dist/server/src/homepage/routes/homepage.d.ts.map +1 -0
- package/dist/server/src/homepage/routes/index.d.ts +8 -0
- package/dist/server/src/homepage/routes/index.d.ts.map +1 -0
- package/dist/server/src/homepage/services/homepage.d.ts +11 -0
- package/dist/server/src/homepage/services/homepage.d.ts.map +1 -0
- package/dist/server/src/homepage/services/index.d.ts +9 -0
- package/dist/server/src/homepage/services/index.d.ts.map +1 -0
- package/dist/server/src/index.d.ts +8 -0
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/preview/services/preview.d.ts.map +1 -1
- package/dist/server/src/routes/index.d.ts +1 -0
- package/dist/server/src/routes/index.d.ts.map +1 -1
- package/dist/server/src/services/data-mapper.d.ts +1 -0
- package/dist/server/src/services/data-mapper.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +7 -0
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/shared/contracts/homepage.d.ts +25 -0
- package/dist/shared/contracts/homepage.d.ts.map +1 -0
- package/package.json +7 -7
@@ -4,21 +4,57 @@ import { useNotification, useAPIErrorHandler, useQueryParams, useForm } from '@s
|
|
4
4
|
import { Menu, Flex, Button, VisuallyHidden, Dialog, Modal, Typography, Radio } from '@strapi/design-system';
|
5
5
|
import { More, Cross, WarningCircle } from '@strapi/icons';
|
6
6
|
import mapValues from 'lodash/fp/mapValues';
|
7
|
+
import get from 'lodash/get';
|
8
|
+
import merge from 'lodash/merge';
|
9
|
+
import set from 'lodash/set';
|
7
10
|
import { useIntl } from 'react-intl';
|
8
11
|
import { useNavigate, useMatch, useParams } from 'react-router-dom';
|
9
12
|
import { styled } from 'styled-components';
|
10
13
|
import { PUBLISHED_AT_ATTRIBUTE_NAME } from '../../../constants/attributes.mjs';
|
11
14
|
import { SINGLE_TYPES } from '../../../constants/collections.mjs';
|
12
15
|
import { useDocumentRBAC } from '../../../features/DocumentRBAC.mjs';
|
13
|
-
import { useDoc } from '../../../hooks/useDocument.mjs';
|
16
|
+
import { useDocument, useDoc } from '../../../hooks/useDocument.mjs';
|
14
17
|
import { useDocumentActions } from '../../../hooks/useDocumentActions.mjs';
|
15
18
|
import { useDocumentContext } from '../../../hooks/useDocumentContext.mjs';
|
16
19
|
import { usePreviewContext } from '../../../preview/pages/Preview.mjs';
|
17
20
|
import { LIST_PATH, CLONE_PATH } from '../../../router.mjs';
|
18
|
-
import { useGetDraftRelationCountQuery as useLazyGetDraftRelationCountQuery } from '../../../services/documents.mjs';
|
21
|
+
import { useGetDraftRelationCountQuery as useLazyGetDraftRelationCountQuery, useUpdateDocumentMutation } from '../../../services/documents.mjs';
|
19
22
|
import { isBaseQueryError, buildValidParams } from '../../../utils/api.mjs';
|
20
23
|
import { getTranslation } from '../../../utils/translations.mjs';
|
24
|
+
import { useRelationModal } from './FormInputs/Relations/RelationModal.mjs';
|
21
25
|
|
26
|
+
const connectRelationToParent = (parentDataToUpdate, fieldToConnect, data, fieldToConnectUID)=>{
|
27
|
+
/*
|
28
|
+
* Check if the fieldToConnect is already present in the parentDataToUpdate.
|
29
|
+
* This happens in particular when in the parentDocument you have created
|
30
|
+
* a new component without saving.
|
31
|
+
*/ const isFieldPresent = !!get(parentDataToUpdate, fieldToConnect);
|
32
|
+
const fieldToConnectPath = isFieldPresent ? fieldToConnect : fieldToConnect.split('.').slice(0, -1).join('.');
|
33
|
+
const fieldToConnectValue = isFieldPresent ? {
|
34
|
+
connect: [
|
35
|
+
{
|
36
|
+
id: data.documentId,
|
37
|
+
documentId: data.documentId,
|
38
|
+
locale: data.locale
|
39
|
+
}
|
40
|
+
]
|
41
|
+
} : {
|
42
|
+
[fieldToConnect.split('.').pop()]: {
|
43
|
+
connect: [
|
44
|
+
{
|
45
|
+
id: data.documentId,
|
46
|
+
documentId: data.documentId,
|
47
|
+
locale: data.locale
|
48
|
+
}
|
49
|
+
],
|
50
|
+
disconnect: []
|
51
|
+
},
|
52
|
+
// In case the object was not present you need to pass the componentUID of the parent document
|
53
|
+
__component: fieldToConnectUID
|
54
|
+
};
|
55
|
+
const objectToConnect = set({}, fieldToConnectPath, fieldToConnectValue);
|
56
|
+
return merge(parentDataToUpdate, objectToConnect);
|
57
|
+
};
|
22
58
|
const DocumentActions = ({ actions })=>{
|
23
59
|
const { formatMessage } = useIntl();
|
24
60
|
const [primaryAction, secondaryAction, ...restActions] = actions.filter((action)=>{
|
@@ -360,7 +396,10 @@ const transformData = (data)=>{
|
|
360
396
|
const isCloning = useMatch(CLONE_PATH) !== null;
|
361
397
|
const { id } = useParams();
|
362
398
|
const { formatMessage } = useIntl();
|
363
|
-
const canPublish = useDocumentRBAC('PublishAction', ({ canPublish })=>
|
399
|
+
const { canPublish, canReadFields } = useDocumentRBAC('PublishAction', ({ canPublish, canReadFields })=>({
|
400
|
+
canPublish,
|
401
|
+
canReadFields
|
402
|
+
}));
|
364
403
|
const { publish, isLoading } = useDocumentActions();
|
365
404
|
const onPreview = usePreviewContext('UpdateAction', (state)=>state.onPreview, false);
|
366
405
|
const [countDraftRelations, { isLoading: isLoadingDraftRelations, isError: isErrorDraftRelations }] = useLazyGetDraftRelationCountQuery();
|
@@ -374,7 +413,17 @@ const transformData = (data)=>{
|
|
374
413
|
const setErrors = useForm('PublishAction', (state)=>state.setErrors);
|
375
414
|
const formValues = useForm('PublishAction', ({ values })=>values);
|
376
415
|
const resetForm = useForm('PublishAction', ({ resetForm })=>resetForm);
|
416
|
+
// need to discriminate if the publish is coming from a relation modal or in the edit view
|
417
|
+
const relationContext = useRelationModal('PublishAction', ()=>true, false);
|
418
|
+
const fromRelationModal = relationContext != undefined;
|
419
|
+
const dispatch = useRelationModal('PublishAction', (state)=>state.dispatch);
|
420
|
+
const fieldToConnect = useRelationModal('PublishAction', (state)=>state.state.fieldToConnect, false);
|
421
|
+
const fieldToConnectUID = useRelationModal('PublishAction', (state)=>state.state.fieldToConnectUID, false);
|
422
|
+
const documentHistory = useRelationModal('PublishAction', (state)=>state.state.documentHistory, false);
|
423
|
+
const rootDocumentMeta = useRelationModal('PublishAction', (state)=>state.rootDocumentMeta);
|
377
424
|
const { currentDocumentMeta } = useDocumentContext('PublishAction');
|
425
|
+
const [updateDocumentMutation] = useUpdateDocumentMutation();
|
426
|
+
const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();
|
378
427
|
const idToPublish = currentDocumentMeta.documentId || id;
|
379
428
|
React.useEffect(()=>{
|
380
429
|
if (isErrorDraftRelations) {
|
@@ -458,6 +507,16 @@ const transformData = (data)=>{
|
|
458
507
|
model,
|
459
508
|
currentDocumentMeta.params
|
460
509
|
]);
|
510
|
+
const parentDocumentMetaToUpdate = documentHistory?.at(-2) ?? rootDocumentMeta;
|
511
|
+
const parentDocumentData = useDocument({
|
512
|
+
documentId: parentDocumentMetaToUpdate?.documentId,
|
513
|
+
model: parentDocumentMetaToUpdate?.model,
|
514
|
+
collectionType: parentDocumentMetaToUpdate?.collectionType,
|
515
|
+
params: parentDocumentMetaToUpdate?.params
|
516
|
+
}, {
|
517
|
+
skip: !parentDocumentMetaToUpdate
|
518
|
+
});
|
519
|
+
const { getInitialFormValues } = useDoc();
|
461
520
|
const isDocumentPublished = (document?.[PUBLISHED_AT_ATTRIBUTE_NAME] || meta?.availableStatus.some((doc)=>doc[PUBLISHED_AT_ATTRIBUTE_NAME] !== null)) && document?.status !== 'modified';
|
462
521
|
if (!schema?.options?.draftAndPublish) {
|
463
522
|
return null;
|
@@ -469,13 +528,27 @@ const transformData = (data)=>{
|
|
469
528
|
status: 'published'
|
470
529
|
});
|
471
530
|
if (errors) {
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
id: 'content-manager.validation.error',
|
476
|
-
defaultMessage: 'There are validation errors in your document. Please fix them before saving.'
|
477
|
-
})
|
531
|
+
const hasUnreadableRequiredField = Object.keys(schema.attributes).some((fieldName)=>{
|
532
|
+
const attribute = schema.attributes[fieldName];
|
533
|
+
return attribute?.required && !(canReadFields ?? []).includes(fieldName);
|
478
534
|
});
|
535
|
+
if (hasUnreadableRequiredField) {
|
536
|
+
toggleNotification({
|
537
|
+
type: 'danger',
|
538
|
+
message: formatMessage({
|
539
|
+
id: 'content-manager.validation.error.unreadable-required-field',
|
540
|
+
defaultMessage: 'Your current permissions prevent access to certain required fields. Please request access from an administrator to proceed.'
|
541
|
+
})
|
542
|
+
});
|
543
|
+
} else {
|
544
|
+
toggleNotification({
|
545
|
+
type: 'danger',
|
546
|
+
message: formatMessage({
|
547
|
+
id: 'content-manager.validation.error',
|
548
|
+
defaultMessage: 'There are validation errors in your document. Please fix them before saving.'
|
549
|
+
})
|
550
|
+
});
|
551
|
+
}
|
479
552
|
return;
|
480
553
|
}
|
481
554
|
const res = await publish({
|
@@ -491,11 +564,59 @@ const transformData = (data)=>{
|
|
491
564
|
if ('data' in res && collectionType !== SINGLE_TYPES) {
|
492
565
|
/**
|
493
566
|
* TODO: refactor the router so we can just do `../${res.data.documentId}` instead of this.
|
494
|
-
*/ if (idToPublish === 'create') {
|
567
|
+
*/ if (idToPublish === 'create' && !fromRelationModal) {
|
495
568
|
navigate({
|
496
569
|
pathname: `../${collectionType}/${model}/${res.data.documentId}`,
|
497
570
|
search: rawQuery
|
498
571
|
});
|
572
|
+
} else if (fromRelationModal) {
|
573
|
+
const newRelation = {
|
574
|
+
documentId: res.data.documentId,
|
575
|
+
collectionType,
|
576
|
+
model,
|
577
|
+
params: currentDocumentMeta.params
|
578
|
+
};
|
579
|
+
/*
|
580
|
+
* Update, if needed, the parent relation with the newly published document.
|
581
|
+
* Check if in history we have the parent relation otherwise use the
|
582
|
+
* rootDocument
|
583
|
+
*/ if (fieldToConnect && documentHistory && (parentDocumentMetaToUpdate.documentId || parentDocumentMetaToUpdate.collectionType === SINGLE_TYPES)) {
|
584
|
+
const parentDataToUpdate = parentDocumentMetaToUpdate.collectionType === SINGLE_TYPES ? getInitialFormValues() : parentDocumentData.getInitialFormValues();
|
585
|
+
const metaDocumentToUpdate = documentHistory.at(-2) ?? rootDocumentMeta;
|
586
|
+
const dataToUpdate = connectRelationToParent(parentDataToUpdate, fieldToConnect, res.data, fieldToConnectUID);
|
587
|
+
try {
|
588
|
+
const updateRes = await updateDocumentMutation({
|
589
|
+
collectionType: metaDocumentToUpdate.collectionType,
|
590
|
+
model: metaDocumentToUpdate.model,
|
591
|
+
documentId: metaDocumentToUpdate.collectionType !== SINGLE_TYPES ? metaDocumentToUpdate.documentId : undefined,
|
592
|
+
params: metaDocumentToUpdate.params,
|
593
|
+
data: dataToUpdate
|
594
|
+
});
|
595
|
+
if ('error' in updateRes) {
|
596
|
+
toggleNotification({
|
597
|
+
type: 'danger',
|
598
|
+
message: formatAPIError(updateRes.error)
|
599
|
+
});
|
600
|
+
return;
|
601
|
+
}
|
602
|
+
} catch (err) {
|
603
|
+
toggleNotification({
|
604
|
+
type: 'danger',
|
605
|
+
message: formatMessage({
|
606
|
+
id: 'notification.error',
|
607
|
+
defaultMessage: 'An error occurred'
|
608
|
+
})
|
609
|
+
});
|
610
|
+
throw err;
|
611
|
+
}
|
612
|
+
}
|
613
|
+
dispatch({
|
614
|
+
type: 'GO_TO_CREATED_RELATION',
|
615
|
+
payload: {
|
616
|
+
document: newRelation,
|
617
|
+
shouldBypassConfirmation: true
|
618
|
+
}
|
619
|
+
});
|
499
620
|
}
|
500
621
|
} else if ('error' in res && isBaseQueryError(res.error) && res.error.name === 'ValidationError') {
|
501
622
|
setErrors(formatValidationErrors(res.error));
|
@@ -571,14 +692,34 @@ const UpdateAction = ({ activeTab, documentId, model, collectionType })=>{
|
|
571
692
|
const { create, update, clone, isLoading } = useDocumentActions();
|
572
693
|
const [{ rawQuery }] = useQueryParams();
|
573
694
|
const onPreview = usePreviewContext('UpdateAction', (state)=>state.onPreview, false);
|
695
|
+
const { getInitialFormValues } = useDoc();
|
574
696
|
const isSubmitting = useForm('UpdateAction', ({ isSubmitting })=>isSubmitting);
|
575
697
|
const modified = useForm('UpdateAction', ({ modified })=>modified);
|
576
698
|
const setSubmitting = useForm('UpdateAction', ({ setSubmitting })=>setSubmitting);
|
577
699
|
const document = useForm('UpdateAction', ({ values })=>values);
|
578
700
|
const validate = useForm('UpdateAction', (state)=>state.validate);
|
579
701
|
const setErrors = useForm('UpdateAction', (state)=>state.setErrors);
|
580
|
-
const resetForm = useForm('
|
702
|
+
const resetForm = useForm('UpdateAction', ({ resetForm })=>resetForm);
|
703
|
+
const dispatch = useRelationModal('UpdateAction', (state)=>state.dispatch);
|
704
|
+
// need to discriminate if the update is coming from a relation modal or in the edit view
|
705
|
+
const relationContext = useRelationModal('UpdateAction', ()=>true, false);
|
706
|
+
const fieldToConnect = useRelationModal('UpdateAction', (state)=>state.state.fieldToConnect, false);
|
707
|
+
const fieldToConnectUID = useRelationModal('PublishAction', (state)=>state.state.fieldToConnectUID, false);
|
708
|
+
const documentHistory = useRelationModal('UpdateAction', (state)=>state.state.documentHistory, false);
|
709
|
+
const rootDocumentMeta = useRelationModal('UpdateAction', (state)=>state.rootDocumentMeta);
|
710
|
+
const fromRelationModal = relationContext != undefined;
|
581
711
|
const { currentDocumentMeta } = useDocumentContext('UpdateAction');
|
712
|
+
const [updateDocumentMutation] = useUpdateDocumentMutation();
|
713
|
+
const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();
|
714
|
+
const parentDocumentMetaToUpdate = documentHistory?.at(-2) ?? rootDocumentMeta;
|
715
|
+
const parentDocumentData = useDocument({
|
716
|
+
documentId: parentDocumentMetaToUpdate?.documentId,
|
717
|
+
model: parentDocumentMetaToUpdate?.model,
|
718
|
+
collectionType: parentDocumentMetaToUpdate?.collectionType,
|
719
|
+
params: parentDocumentMetaToUpdate?.params
|
720
|
+
}, {
|
721
|
+
skip: !parentDocumentMetaToUpdate
|
722
|
+
});
|
582
723
|
const handleUpdate = React.useCallback(async ()=>{
|
583
724
|
setSubmitting(true);
|
584
725
|
try {
|
@@ -632,13 +773,64 @@ const UpdateAction = ({ activeTab, documentId, model, collectionType })=>{
|
|
632
773
|
params: currentDocumentMeta.params
|
633
774
|
}, transformData(document));
|
634
775
|
if ('data' in res && collectionType !== SINGLE_TYPES) {
|
635
|
-
|
636
|
-
|
637
|
-
|
638
|
-
|
639
|
-
|
640
|
-
|
641
|
-
|
776
|
+
if (fromRelationModal) {
|
777
|
+
const createdRelation = {
|
778
|
+
documentId: res.data.documentId,
|
779
|
+
collectionType,
|
780
|
+
model,
|
781
|
+
params: currentDocumentMeta.params
|
782
|
+
};
|
783
|
+
/*
|
784
|
+
* Update, if needed, the parent relation with the newly published document.
|
785
|
+
* Check if in history we have the parent relation otherwise use the
|
786
|
+
* rootDocument
|
787
|
+
*/ if (fieldToConnect && documentHistory && (parentDocumentMetaToUpdate.documentId || parentDocumentMetaToUpdate.collectionType === SINGLE_TYPES)) {
|
788
|
+
const parentDataToUpdate = parentDocumentMetaToUpdate.collectionType === SINGLE_TYPES ? getInitialFormValues() : parentDocumentData.getInitialFormValues();
|
789
|
+
const dataToUpdate = connectRelationToParent(parentDataToUpdate, fieldToConnect, res.data, fieldToConnectUID);
|
790
|
+
try {
|
791
|
+
const updateRes = await updateDocumentMutation({
|
792
|
+
collectionType: parentDocumentMetaToUpdate.collectionType,
|
793
|
+
model: parentDocumentMetaToUpdate.model,
|
794
|
+
documentId: parentDocumentMetaToUpdate.collectionType !== SINGLE_TYPES ? parentDocumentMetaToUpdate.documentId : undefined,
|
795
|
+
params: parentDocumentMetaToUpdate.params,
|
796
|
+
data: {
|
797
|
+
...dataToUpdate
|
798
|
+
}
|
799
|
+
});
|
800
|
+
if ('error' in updateRes) {
|
801
|
+
toggleNotification({
|
802
|
+
type: 'danger',
|
803
|
+
message: formatAPIError(updateRes.error)
|
804
|
+
});
|
805
|
+
return;
|
806
|
+
}
|
807
|
+
} catch (err) {
|
808
|
+
toggleNotification({
|
809
|
+
type: 'danger',
|
810
|
+
message: formatMessage({
|
811
|
+
id: 'notification.error',
|
812
|
+
defaultMessage: 'An error occurred'
|
813
|
+
})
|
814
|
+
});
|
815
|
+
throw err;
|
816
|
+
}
|
817
|
+
}
|
818
|
+
dispatch({
|
819
|
+
type: 'GO_TO_CREATED_RELATION',
|
820
|
+
payload: {
|
821
|
+
document: createdRelation,
|
822
|
+
shouldBypassConfirmation: true
|
823
|
+
}
|
824
|
+
});
|
825
|
+
} else {
|
826
|
+
navigate({
|
827
|
+
pathname: `../${res.data.documentId}`,
|
828
|
+
search: rawQuery
|
829
|
+
}, {
|
830
|
+
replace: true,
|
831
|
+
relative: 'path'
|
832
|
+
});
|
833
|
+
}
|
642
834
|
} else if ('error' in res && isBaseQueryError(res.error) && res.error.name === 'ValidationError') {
|
643
835
|
setErrors(formatValidationErrors(res.error));
|
644
836
|
}
|
@@ -650,26 +842,36 @@ const UpdateAction = ({ activeTab, documentId, model, collectionType })=>{
|
|
650
842
|
}
|
651
843
|
}
|
652
844
|
}, [
|
845
|
+
setSubmitting,
|
846
|
+
modified,
|
847
|
+
validate,
|
848
|
+
isCloning,
|
849
|
+
documentId,
|
850
|
+
collectionType,
|
851
|
+
toggleNotification,
|
852
|
+
formatMessage,
|
653
853
|
clone,
|
854
|
+
model,
|
654
855
|
cloneMatch?.params.origin,
|
655
|
-
collectionType,
|
656
|
-
create,
|
657
856
|
currentDocumentMeta.params,
|
658
857
|
document,
|
659
|
-
documentId,
|
660
|
-
formatMessage,
|
661
|
-
formatValidationErrors,
|
662
|
-
isCloning,
|
663
|
-
model,
|
664
|
-
modified,
|
665
858
|
navigate,
|
666
859
|
rawQuery,
|
667
|
-
resetForm,
|
668
860
|
setErrors,
|
669
|
-
|
670
|
-
toggleNotification,
|
861
|
+
formatValidationErrors,
|
671
862
|
update,
|
672
|
-
|
863
|
+
resetForm,
|
864
|
+
create,
|
865
|
+
fromRelationModal,
|
866
|
+
fieldToConnect,
|
867
|
+
documentHistory,
|
868
|
+
parentDocumentMetaToUpdate,
|
869
|
+
dispatch,
|
870
|
+
getInitialFormValues,
|
871
|
+
parentDocumentData,
|
872
|
+
fieldToConnectUID,
|
873
|
+
updateDocumentMutation,
|
874
|
+
formatAPIError,
|
673
875
|
onPreview
|
674
876
|
]);
|
675
877
|
// Auto-save on CMD+S or CMD+Enter on macOS, and CTRL+S or CTRL+Enter on Windows/Linux
|