@contentful/field-editor-reference 6.12.0 → 6.13.0
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/cjs/__fixtures__/FakeSdk.js +6 -6
- package/dist/cjs/assets/WrappedAssetCard/FetchingWrappedAssetCard.js +9 -15
- package/dist/cjs/assets/WrappedAssetCard/WrappedAssetCard.js +3 -4
- package/dist/cjs/assets/WrappedAssetCard/WrappedAssetLink.js +2 -3
- package/dist/cjs/common/EntityStore.js +102 -32
- package/dist/cjs/components/EntityStatusBadge/EntityStatusBadge.js +5 -6
- package/dist/cjs/components/LinkActions/CombinedLinkActions.js +2 -2
- package/dist/cjs/entries/WrappedEntryCard/FetchingWrappedEntryCard.js +10 -22
- package/dist/cjs/entries/WrappedEntryCard/WrappedEntryCard.js +3 -4
- package/dist/cjs/resources/Cards/ResourceCard.spec.js +14 -11
- package/dist/esm/__fixtures__/FakeSdk.js +7 -7
- package/dist/esm/assets/WrappedAssetCard/FetchingWrappedAssetCard.js +10 -16
- package/dist/esm/assets/WrappedAssetCard/WrappedAssetCard.js +3 -4
- package/dist/esm/assets/WrappedAssetCard/WrappedAssetLink.js +2 -3
- package/dist/esm/common/EntityStore.js +103 -33
- package/dist/esm/components/EntityStatusBadge/EntityStatusBadge.js +5 -6
- package/dist/esm/components/LinkActions/CombinedLinkActions.js +2 -2
- package/dist/esm/entries/WrappedEntryCard/FetchingWrappedEntryCard.js +11 -18
- package/dist/esm/entries/WrappedEntryCard/WrappedEntryCard.js +3 -4
- package/dist/esm/resources/Cards/ResourceCard.spec.js +14 -11
- package/dist/types/assets/WrappedAssetCard/WrappedAssetCard.d.ts +4 -5
- package/dist/types/assets/WrappedAssetCard/WrappedAssetLink.d.ts +3 -4
- package/dist/types/common/EntityStore.d.ts +7 -2
- package/dist/types/common/customCardTypes.d.ts +7 -8
- package/dist/types/components/EntityStatusBadge/EntityStatusBadge.d.ts +4 -5
- package/dist/types/entries/WrappedEntryCard/WrappedEntryCard.d.ts +4 -5
- package/package.json +7 -7
|
@@ -1,30 +1,25 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { AssetCard, EntryCard } from '@contentful/f36-components';
|
|
3
|
-
import { useLocalePublishStatus, useActiveLocales,
|
|
3
|
+
import { useLocalePublishStatus, useActiveLocales, useReleaseStatus } from '@contentful/field-editor-shared';
|
|
4
4
|
import { useEntity, useEntityLoader } from '../../common/EntityStore';
|
|
5
5
|
import { MissingAssetCard } from '../../components';
|
|
6
6
|
import { WrappedAssetCard } from './WrappedAssetCard';
|
|
7
7
|
import { WrappedAssetLink } from './WrappedAssetLink';
|
|
8
8
|
export function FetchingWrappedAssetCard(props) {
|
|
9
|
-
const {
|
|
10
|
-
const { data: asset, status } = useEntity('Asset', props.assetId);
|
|
9
|
+
const { data: asset, status, currentEntity } = useEntity('Asset', props.assetId);
|
|
11
10
|
const { getEntityScheduledActions } = useEntityLoader();
|
|
12
11
|
const loadEntityScheduledActions = React.useCallback(()=>getEntityScheduledActions('Asset', props.assetId), [
|
|
13
12
|
getEntityScheduledActions,
|
|
14
13
|
props.assetId
|
|
15
14
|
]);
|
|
15
|
+
const activeLocales = useActiveLocales(props.sdk);
|
|
16
16
|
const localesStatusMap = useLocalePublishStatus(asset, props.sdk.locales);
|
|
17
|
-
const {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
locales,
|
|
23
|
-
activeRelease,
|
|
24
|
-
releases
|
|
17
|
+
const { releaseStatusMap, releaseAction } = useReleaseStatus({
|
|
18
|
+
entity: asset,
|
|
19
|
+
previousEntityOnTimeline: currentEntity,
|
|
20
|
+
release: props.sdk.release,
|
|
21
|
+
locales: props.sdk.locales
|
|
25
22
|
});
|
|
26
|
-
const { releaseAction } = getEntityReleaseStatus(props.assetId, locales, activeRelease);
|
|
27
|
-
const activeLocales = useActiveLocales(props.sdk);
|
|
28
23
|
React.useEffect(()=>{
|
|
29
24
|
if (asset) {
|
|
30
25
|
props.onAction && props.onAction({
|
|
@@ -89,9 +84,8 @@ export function FetchingWrappedAssetCard(props) {
|
|
|
89
84
|
useLocalizedEntityStatus: props.sdk.parameters.instance.useLocalizedEntityStatus,
|
|
90
85
|
localesStatusMap,
|
|
91
86
|
activeLocales,
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
activeRelease,
|
|
87
|
+
releaseStatusMap,
|
|
88
|
+
release: props.sdk.release,
|
|
95
89
|
releaseAction
|
|
96
90
|
};
|
|
97
91
|
if (status === 'loading') {
|
|
@@ -30,7 +30,7 @@ function getFileType(file) {
|
|
|
30
30
|
});
|
|
31
31
|
return groupToIconMap[groupName] || 'archive';
|
|
32
32
|
}
|
|
33
|
-
export const WrappedAssetCard = ({ asset, className, size, localeCode, defaultLocaleCode, activeLocales, localesStatusMap, isDisabled, isSelected, isClickable, useLocalizedEntityStatus, renderDragHandle, getEntityScheduledActions, onEdit, getAssetUrl, onRemove, releaseAction,
|
|
33
|
+
export const WrappedAssetCard = ({ asset, className, size, localeCode, defaultLocaleCode, activeLocales, localesStatusMap, isDisabled, isSelected, isClickable, useLocalizedEntityStatus, renderDragHandle, getEntityScheduledActions, onEdit, getAssetUrl, onRemove, releaseAction, releaseStatusMap, release })=>{
|
|
34
34
|
const status = entityHelpers.getEntityStatus(asset.sys, useLocalizedEntityStatus ? localeCode : undefined);
|
|
35
35
|
if (status === 'deleted') {
|
|
36
36
|
return /*#__PURE__*/ React.createElement(MissingAssetCard, {
|
|
@@ -63,9 +63,8 @@ export const WrappedAssetCard = ({ asset, className, size, localeCode, defaultLo
|
|
|
63
63
|
localesStatusMap: localesStatusMap,
|
|
64
64
|
activeLocales: activeLocales,
|
|
65
65
|
releaseAction: releaseAction,
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
activeRelease: activeRelease
|
|
66
|
+
releaseStatusMap: releaseStatusMap,
|
|
67
|
+
release: release
|
|
69
68
|
}),
|
|
70
69
|
src: entityFile && entityFile.url ? size === 'small' ? `${entityFile.url}?w=150&h=150&fit=thumb` : `${entityFile.url}?h=300` : '',
|
|
71
70
|
onClick: isClickable ? (e)=>{
|
|
@@ -35,9 +35,8 @@ export const WrappedAssetLink = (props)=>{
|
|
|
35
35
|
localesStatusMap: props.localesStatusMap,
|
|
36
36
|
activeLocales: props.activeLocales,
|
|
37
37
|
releaseAction: props.releaseAction,
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
activeRelease: props.activeRelease
|
|
38
|
+
releaseStatusMap: props.releaseStatusMap,
|
|
39
|
+
release: props.release
|
|
41
40
|
}),
|
|
42
41
|
thumbnailElement: entityFile && isValidImage(entityFile) ? /*#__PURE__*/ React.createElement(AssetThumbnail, {
|
|
43
42
|
file: entityFile
|
|
@@ -13,7 +13,7 @@ function _define_property(obj, key, value) {
|
|
|
13
13
|
}
|
|
14
14
|
import React, { useCallback, useEffect, useMemo, useRef } from 'react';
|
|
15
15
|
import constate from 'constate';
|
|
16
|
-
import {
|
|
16
|
+
import { fetchAll } from 'contentful-management';
|
|
17
17
|
import PQueue from 'p-queue';
|
|
18
18
|
import { SharedQueryClientProvider, useQuery, useQueryClient } from './queryClient';
|
|
19
19
|
export function isContentfulResourceInfo(info) {
|
|
@@ -153,12 +153,20 @@ async function fetchExternalResource({ urn, fetch, options, spaceId, environment
|
|
|
153
153
|
'resource-types',
|
|
154
154
|
spaceId,
|
|
155
155
|
environmentId
|
|
156
|
-
], ({ cmaClient })=>
|
|
156
|
+
], ({ cmaClient })=>{
|
|
157
|
+
console.log('>> fetch resource types', {
|
|
158
|
+
spaceId,
|
|
159
|
+
environmentId
|
|
160
|
+
});
|
|
161
|
+
return fetchAll(({ query })=>cmaClient.resourceType.getForEnvironment({
|
|
157
162
|
spaceId,
|
|
158
163
|
environmentId,
|
|
159
164
|
query
|
|
160
|
-
}), {})
|
|
165
|
+
}), {});
|
|
166
|
+
})
|
|
161
167
|
]);
|
|
168
|
+
console.log('>> resource', resource);
|
|
169
|
+
console.log('>> resourceTypes', resourceTypes);
|
|
162
170
|
const resourceTypeEntity = resourceTypes.find((rt)=>rt.sys.id === resourceType);
|
|
163
171
|
if (!resourceTypeEntity) {
|
|
164
172
|
throw new UnsupportedError('Unsupported resource type');
|
|
@@ -177,6 +185,7 @@ async function fetchExternalResource({ urn, fetch, options, spaceId, environment
|
|
|
177
185
|
const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = constate(function useInitServices(props) {
|
|
178
186
|
const currentSpaceId = props.sdk.ids.space;
|
|
179
187
|
const currentEnvironmentId = props.sdk.ids.environmentAlias ?? props.sdk.ids.environment;
|
|
188
|
+
const releaseId = props.sdk.ids.release;
|
|
180
189
|
const environmentIds = useMemo(()=>[
|
|
181
190
|
props.sdk.ids.environmentAlias,
|
|
182
191
|
props.sdk.ids.environment
|
|
@@ -187,13 +196,7 @@ const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = cons
|
|
|
187
196
|
const queryClient = useQueryClient();
|
|
188
197
|
const queryCache = queryClient.getQueryCache();
|
|
189
198
|
const entityChangeUnsubscribers = useRef({});
|
|
190
|
-
const cmaClient =
|
|
191
|
-
apiAdapter: props.sdk.cmaAdapter
|
|
192
|
-
}, {
|
|
193
|
-
type: 'plain'
|
|
194
|
-
}), [
|
|
195
|
-
props.sdk.cmaAdapter
|
|
196
|
-
]);
|
|
199
|
+
const cmaClient = props.sdk.cma;
|
|
197
200
|
const queryQueue = useMemo(()=>{
|
|
198
201
|
if (props.queryConcurrency) {
|
|
199
202
|
return new PQueue({
|
|
@@ -216,38 +219,92 @@ const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = cons
|
|
|
216
219
|
queryQueue,
|
|
217
220
|
cmaClient
|
|
218
221
|
]);
|
|
219
|
-
const
|
|
222
|
+
const isReleaseRequestError = useCallback(function isReleaseRequestError(error, spaceId, environmentId) {
|
|
223
|
+
return !!releaseId && (!spaceId || spaceId === currentSpaceId) && (!environmentId || environmentId === currentEnvironmentId) && error instanceof Error && 'status' in error && error.status === 404;
|
|
224
|
+
}, [
|
|
225
|
+
releaseId,
|
|
226
|
+
currentSpaceId,
|
|
227
|
+
currentEnvironmentId
|
|
228
|
+
]);
|
|
229
|
+
const getEntity = useCallback(function getEntity(entityType, entityId, releaseId, options) {
|
|
220
230
|
const spaceId = options?.spaceId ?? currentSpaceId;
|
|
221
231
|
const environmentId = options?.environmentId ?? currentEnvironmentId;
|
|
222
232
|
const queryKey = [
|
|
223
233
|
entityType,
|
|
224
234
|
entityId,
|
|
225
235
|
spaceId,
|
|
226
|
-
environmentId
|
|
236
|
+
environmentId,
|
|
237
|
+
releaseId
|
|
227
238
|
];
|
|
228
|
-
return fetch(queryKey, ({ cmaClient })=>{
|
|
239
|
+
return fetch(queryKey, async ({ cmaClient })=>{
|
|
229
240
|
if (entityType === 'Entry') {
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
241
|
+
try {
|
|
242
|
+
return cmaClient.entry.get({
|
|
243
|
+
entryId: entityId,
|
|
244
|
+
spaceId,
|
|
245
|
+
environmentId,
|
|
246
|
+
releaseId
|
|
247
|
+
});
|
|
248
|
+
} catch (error) {
|
|
249
|
+
if (isReleaseRequestError(error, spaceId, environmentId)) {
|
|
250
|
+
const currentEntry = await cmaClient.entry.get({
|
|
251
|
+
entryId: entityId,
|
|
252
|
+
spaceId,
|
|
253
|
+
environmentId,
|
|
254
|
+
releaseId: undefined
|
|
255
|
+
});
|
|
256
|
+
currentEntry.sys.release = {
|
|
257
|
+
sys: {
|
|
258
|
+
type: 'Link',
|
|
259
|
+
linkType: 'Release',
|
|
260
|
+
id: releaseId
|
|
261
|
+
}
|
|
262
|
+
};
|
|
263
|
+
return currentEntry;
|
|
264
|
+
}
|
|
265
|
+
throw error;
|
|
266
|
+
}
|
|
235
267
|
}
|
|
236
268
|
if (entityType === 'Asset') {
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
269
|
+
try {
|
|
270
|
+
return cmaClient.asset.get({
|
|
271
|
+
assetId: entityId,
|
|
272
|
+
spaceId,
|
|
273
|
+
environmentId,
|
|
274
|
+
releaseId
|
|
275
|
+
});
|
|
276
|
+
} catch (error) {
|
|
277
|
+
if (isReleaseRequestError(error, spaceId, environmentId)) {
|
|
278
|
+
const currentAsset = cmaClient.asset.get({
|
|
279
|
+
assetId: entityId,
|
|
280
|
+
spaceId,
|
|
281
|
+
environmentId,
|
|
282
|
+
releaseId: undefined
|
|
283
|
+
});
|
|
284
|
+
currentAsset.sys.release = {
|
|
285
|
+
sys: {
|
|
286
|
+
type: 'Link',
|
|
287
|
+
linkType: 'Release',
|
|
288
|
+
id: releaseId
|
|
289
|
+
}
|
|
290
|
+
};
|
|
291
|
+
return currentAsset;
|
|
292
|
+
}
|
|
293
|
+
throw error;
|
|
294
|
+
}
|
|
242
295
|
}
|
|
243
296
|
throw new UnsupportedError('Unsupported entity type');
|
|
244
297
|
}, options);
|
|
245
298
|
}, [
|
|
246
299
|
fetch,
|
|
247
300
|
currentSpaceId,
|
|
248
|
-
currentEnvironmentId
|
|
301
|
+
currentEnvironmentId,
|
|
302
|
+
isReleaseRequestError
|
|
249
303
|
]);
|
|
250
304
|
const getEntityScheduledActions = useCallback(function getEntityScheduledActions(entityType, entityId, options) {
|
|
305
|
+
if (releaseId) {
|
|
306
|
+
return new Promise((resolve)=>resolve([]));
|
|
307
|
+
}
|
|
251
308
|
const fixedEntityCacheId = 'scheduledActionEntityId';
|
|
252
309
|
const maxScheduledActions = 500;
|
|
253
310
|
const spaceId = options?.spaceId ?? currentSpaceId;
|
|
@@ -257,7 +314,8 @@ const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = cons
|
|
|
257
314
|
entityType,
|
|
258
315
|
fixedEntityCacheId,
|
|
259
316
|
spaceId,
|
|
260
|
-
environmentId
|
|
317
|
+
environmentId,
|
|
318
|
+
releaseId
|
|
261
319
|
];
|
|
262
320
|
return fetch(queryKey, async ({ cmaClient })=>{
|
|
263
321
|
const response = await cmaClient.scheduledActions.getMany({
|
|
@@ -274,7 +332,8 @@ const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = cons
|
|
|
274
332
|
}, [
|
|
275
333
|
fetch,
|
|
276
334
|
currentSpaceId,
|
|
277
|
-
currentEnvironmentId
|
|
335
|
+
currentEnvironmentId,
|
|
336
|
+
releaseId
|
|
278
337
|
]);
|
|
279
338
|
const getResource = useCallback(function getResource(resourceType, urn, options) {
|
|
280
339
|
const queryKey = [
|
|
@@ -402,23 +461,34 @@ const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = cons
|
|
|
402
461
|
getResourceProvider
|
|
403
462
|
}), ({ ids })=>({
|
|
404
463
|
environment: ids.environmentAlias ?? ids.environment,
|
|
405
|
-
space: ids.space
|
|
464
|
+
space: ids.space,
|
|
465
|
+
releaseId: ids.release
|
|
406
466
|
}));
|
|
407
467
|
export function useEntity(entityType, entityId, options) {
|
|
408
|
-
const { space, environment } = useCurrentIds();
|
|
468
|
+
const { space, environment, releaseId } = useCurrentIds();
|
|
409
469
|
const { getEntity } = useEntityLoader();
|
|
410
|
-
const
|
|
470
|
+
const { status, data } = useQuery([
|
|
411
471
|
entityType,
|
|
412
472
|
entityId,
|
|
413
473
|
options?.spaceId ?? space,
|
|
414
|
-
options?.environmentId ?? environment
|
|
415
|
-
|
|
416
|
-
|
|
474
|
+
options?.environmentId ?? environment,
|
|
475
|
+
releaseId
|
|
476
|
+
], ()=>getEntity(entityType, entityId, releaseId, options), {
|
|
417
477
|
enabled: options?.enabled
|
|
418
478
|
});
|
|
479
|
+
const { data: currentEntity } = useQuery([
|
|
480
|
+
entityType,
|
|
481
|
+
entityId,
|
|
482
|
+
options?.spaceId ?? space,
|
|
483
|
+
options?.environmentId ?? environment,
|
|
484
|
+
undefined
|
|
485
|
+
], ()=>getEntity(entityType, entityId, undefined, options), {
|
|
486
|
+
enabled: options?.enabled && !!releaseId
|
|
487
|
+
});
|
|
419
488
|
return {
|
|
420
489
|
status,
|
|
421
|
-
data
|
|
490
|
+
data,
|
|
491
|
+
currentEntity
|
|
422
492
|
};
|
|
423
493
|
}
|
|
424
494
|
export function useResource(resourceType, urn, { locale, ...options } = {}) {
|
|
@@ -3,20 +3,19 @@ import { EntityStatusBadge as StatusBadge } from '@contentful/f36-components';
|
|
|
3
3
|
import { LocalePublishingPopover, ReleaseEntityStatusPopover, ReleaseEntityStatusBadge } from '@contentful/field-editor-shared';
|
|
4
4
|
import { useScheduledActions } from '../ScheduledIconWithTooltip/ScheduledIconWithTooltip';
|
|
5
5
|
import { ScheduleTooltip } from '../ScheduledIconWithTooltip/ScheduleTooltip';
|
|
6
|
-
export function EntityStatusBadge({ entityType, getEntityScheduledActions, status, useLocalizedEntityStatus, localesStatusMap, activeLocales, entity,
|
|
6
|
+
export function EntityStatusBadge({ entityType, getEntityScheduledActions, status, useLocalizedEntityStatus, localesStatusMap, activeLocales, entity, releaseStatusMap, releaseAction, release, ...props }) {
|
|
7
7
|
const { isError, isLoading, jobs } = useScheduledActions({
|
|
8
8
|
entityId: entity.sys.id,
|
|
9
9
|
entityType,
|
|
10
10
|
getEntityScheduledActions
|
|
11
11
|
});
|
|
12
|
-
if (
|
|
12
|
+
if (release && releaseStatusMap && useLocalizedEntityStatus && activeLocales) {
|
|
13
13
|
return /*#__PURE__*/ React.createElement(ReleaseEntityStatusPopover, {
|
|
14
|
-
|
|
15
|
-
activeLocales: activeLocales
|
|
16
|
-
isLoading: isReleasesLoading
|
|
14
|
+
releaseStatusMap: releaseStatusMap,
|
|
15
|
+
activeLocales: activeLocales
|
|
17
16
|
});
|
|
18
17
|
}
|
|
19
|
-
if (
|
|
18
|
+
if (release && releaseAction) {
|
|
20
19
|
return /*#__PURE__*/ React.createElement(ReleaseEntityStatusBadge, {
|
|
21
20
|
action: releaseAction
|
|
22
21
|
});
|
|
@@ -33,12 +33,12 @@ function CombinedEntryLinkActions(props) {
|
|
|
33
33
|
onSelect: (contentTypeId)=>{
|
|
34
34
|
return contentTypeId ? props.onCreate(contentTypeId) : Promise.resolve();
|
|
35
35
|
},
|
|
36
|
-
customDropdownItems: props.canLinkEntity ? /*#__PURE__*/ React.createElement(Menu
|
|
36
|
+
customDropdownItems: props.canLinkEntity ? /*#__PURE__*/ React.createElement(Menu.Item, {
|
|
37
37
|
testId: testIds.linkExisting,
|
|
38
38
|
onClick: ()=>{
|
|
39
39
|
props.onLinkExisting();
|
|
40
40
|
}
|
|
41
|
-
}, "Add existing content")
|
|
41
|
+
}, "Add existing content") : undefined
|
|
42
42
|
});
|
|
43
43
|
} else if (props.canLinkEntity) {
|
|
44
44
|
return /*#__PURE__*/ React.createElement(Button, {
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { EntryCard } from '@contentful/f36-components';
|
|
3
|
-
import {
|
|
4
|
-
import get from 'lodash/get';
|
|
3
|
+
import { useLocalePublishStatus, useReleaseStatus } from '@contentful/field-editor-shared';
|
|
5
4
|
import { useEntity, useEntityLoader } from '../../common/EntityStore';
|
|
6
5
|
import { MissingEntityCard } from '../../components';
|
|
7
6
|
import { WrappedEntryCard } from './WrappedEntryCard';
|
|
@@ -25,24 +24,19 @@ async function openEntry(sdk, entryId, options) {
|
|
|
25
24
|
return slide;
|
|
26
25
|
}
|
|
27
26
|
export function FetchingWrappedEntryCard(props) {
|
|
28
|
-
const {
|
|
29
|
-
const { data: entry, status } = useEntity('Entry', props.entryId);
|
|
27
|
+
const { data: entry, status, currentEntity } = useEntity('Entry', props.entryId);
|
|
30
28
|
const { getEntityScheduledActions } = useEntityLoader();
|
|
31
29
|
const loadEntityScheduledActions = React.useCallback(()=>getEntityScheduledActions('Entry', props.entryId), [
|
|
32
30
|
getEntityScheduledActions,
|
|
33
31
|
props.entryId
|
|
34
32
|
]);
|
|
35
33
|
const localesStatusMap = useLocalePublishStatus(entry, props.sdk.locales);
|
|
36
|
-
const {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
locales,
|
|
42
|
-
activeRelease,
|
|
43
|
-
releases
|
|
34
|
+
const { releaseStatusMap, releaseAction } = useReleaseStatus({
|
|
35
|
+
entity: entry,
|
|
36
|
+
previousEntityOnTimeline: currentEntity,
|
|
37
|
+
release: props.sdk.release,
|
|
38
|
+
locales: props.sdk.locales
|
|
44
39
|
});
|
|
45
|
-
const { releaseAction } = getEntityReleaseStatus(props.entryId, locales, activeRelease);
|
|
46
40
|
const size = props.viewType === 'link' ? 'small' : 'default';
|
|
47
41
|
const { getEntity } = useEntityLoader();
|
|
48
42
|
const getAsset = (assetId)=>getEntity('Asset', assetId);
|
|
@@ -55,7 +49,7 @@ export function FetchingWrappedEntryCard(props) {
|
|
|
55
49
|
entity: 'Entry',
|
|
56
50
|
type: 'edit',
|
|
57
51
|
id: props.entryId,
|
|
58
|
-
contentTypeId:
|
|
52
|
+
contentTypeId: entry.sys.contentType.sys.id,
|
|
59
53
|
slide
|
|
60
54
|
});
|
|
61
55
|
};
|
|
@@ -65,7 +59,7 @@ export function FetchingWrappedEntryCard(props) {
|
|
|
65
59
|
entity: 'Entry',
|
|
66
60
|
type: 'delete',
|
|
67
61
|
id: props.entryId,
|
|
68
|
-
contentTypeId:
|
|
62
|
+
contentTypeId: entry.sys.contentType.sys.id
|
|
69
63
|
});
|
|
70
64
|
};
|
|
71
65
|
React.useEffect(()=>{
|
|
@@ -120,9 +114,8 @@ export function FetchingWrappedEntryCard(props) {
|
|
|
120
114
|
useLocalizedEntityStatus: props.sdk.parameters.instance.useLocalizedEntityStatus,
|
|
121
115
|
localesStatusMap,
|
|
122
116
|
activeLocales: props.activeLocales,
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
activeRelease,
|
|
117
|
+
releaseStatusMap,
|
|
118
|
+
release: props.sdk.release,
|
|
126
119
|
releaseAction
|
|
127
120
|
};
|
|
128
121
|
const { hasCardEditActions, hasCardMoveActions, hasCardRemoveActions } = props;
|
|
@@ -10,7 +10,7 @@ const defaultProps = {
|
|
|
10
10
|
hasCardMoveActions: true,
|
|
11
11
|
hasCardRemoveActions: true
|
|
12
12
|
};
|
|
13
|
-
export function WrappedEntryCard({ entry, entryUrl, contentType, activeLocales, localeCode, defaultLocaleCode, localesStatusMap, useLocalizedEntityStatus, size, spaceName, isClickable, isDisabled, isSelected, hasCardMoveActions, hasCardEditActions, hasCardRemoveActions, renderDragHandle, getAsset, getEntityScheduledActions, onClick, onEdit, onRemove, onMoveTop, onMoveBottom, releaseAction,
|
|
13
|
+
export function WrappedEntryCard({ entry, entryUrl, contentType, activeLocales, localeCode, defaultLocaleCode, localesStatusMap, useLocalizedEntityStatus, size, spaceName, isClickable, isDisabled, isSelected, hasCardMoveActions, hasCardEditActions, hasCardRemoveActions, renderDragHandle, getAsset, getEntityScheduledActions, onClick, onEdit, onRemove, onMoveTop, onMoveBottom, releaseAction, releaseStatusMap, release }) {
|
|
14
14
|
const [file, setFile] = React.useState(null);
|
|
15
15
|
React.useEffect(()=>{
|
|
16
16
|
let mounted = true;
|
|
@@ -78,9 +78,8 @@ export function WrappedEntryCard({ entry, entryUrl, contentType, activeLocales,
|
|
|
78
78
|
localesStatusMap: localesStatusMap,
|
|
79
79
|
activeLocales: activeLocales,
|
|
80
80
|
releaseAction: releaseAction,
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
activeRelease: activeRelease
|
|
81
|
+
releaseStatusMap: releaseStatusMap,
|
|
82
|
+
release: release
|
|
84
83
|
}),
|
|
85
84
|
icon: spaceName ? /*#__PURE__*/ React.createElement(SpaceName, {
|
|
86
85
|
spaceName: spaceName,
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import '@testing-library/jest-dom';
|
|
3
|
-
import { createFakeCMAAdapter } from '@contentful/field-editor-test-utils';
|
|
4
3
|
import { configure, fireEvent, render, waitFor } from '@testing-library/react';
|
|
5
4
|
import publishedCT from '../../__fixtures__/content-type/published_content_type.json';
|
|
6
5
|
import publishedEntryNonMasterEnvironment from '../../__fixtures__/entry/published_entry_non_master.json';
|
|
@@ -27,11 +26,11 @@ const sdk = {
|
|
|
27
26
|
locales: {
|
|
28
27
|
default: 'en-US'
|
|
29
28
|
},
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
cma: {
|
|
30
|
+
contentType: {
|
|
32
31
|
get: jest.fn().mockReturnValue(publishedCT)
|
|
33
32
|
},
|
|
34
|
-
|
|
33
|
+
entry: {
|
|
35
34
|
get: jest.fn().mockImplementation(({ spaceId, environmentId, entryId })=>{
|
|
36
35
|
if (spaceId === 'space-id' && environmentId === 'master' && entryId === 'linked-entry-urn') {
|
|
37
36
|
return Promise.resolve(publishedEntry);
|
|
@@ -42,7 +41,7 @@ const sdk = {
|
|
|
42
41
|
return Promise.reject(new Error());
|
|
43
42
|
})
|
|
44
43
|
},
|
|
45
|
-
|
|
44
|
+
locale: {
|
|
46
45
|
getMany: jest.fn().mockResolvedValue({
|
|
47
46
|
items: [
|
|
48
47
|
{
|
|
@@ -52,7 +51,7 @@ const sdk = {
|
|
|
52
51
|
]
|
|
53
52
|
})
|
|
54
53
|
},
|
|
55
|
-
|
|
54
|
+
resource: {
|
|
56
55
|
getMany: jest.fn().mockImplementation(({ spaceId, environmentId, resourceTypeId, query })=>{
|
|
57
56
|
if (spaceId === 'space-id' && environmentId === 'environment-id' && resourceTypeId === resolvableExternalResourceType && query['sys.urn[in]'] === resolvableExternalEntityUrn) {
|
|
58
57
|
return Promise.resolve({
|
|
@@ -72,8 +71,12 @@ const sdk = {
|
|
|
72
71
|
});
|
|
73
72
|
})
|
|
74
73
|
},
|
|
75
|
-
|
|
74
|
+
resourceType: {
|
|
76
75
|
getForEnvironment: jest.fn().mockImplementation(({ spaceId, environmentId })=>{
|
|
76
|
+
console.log('>> getForEnvironment', {
|
|
77
|
+
spaceId,
|
|
78
|
+
environmentId
|
|
79
|
+
});
|
|
77
80
|
if (spaceId === 'space-id' && environmentId === 'environment-id') {
|
|
78
81
|
return Promise.resolve({
|
|
79
82
|
items: [
|
|
@@ -87,16 +90,16 @@ const sdk = {
|
|
|
87
90
|
});
|
|
88
91
|
})
|
|
89
92
|
},
|
|
90
|
-
|
|
93
|
+
scheduledActions: {
|
|
91
94
|
getMany: jest.fn().mockResolvedValue({
|
|
92
95
|
items: [],
|
|
93
96
|
total: 0
|
|
94
97
|
})
|
|
95
98
|
},
|
|
96
|
-
|
|
99
|
+
space: {
|
|
97
100
|
get: jest.fn().mockResolvedValue(space)
|
|
98
101
|
},
|
|
99
|
-
|
|
102
|
+
resourceProvider: {
|
|
100
103
|
get: jest.fn().mockImplementation(()=>{
|
|
101
104
|
return Promise.resolve({
|
|
102
105
|
function: {
|
|
@@ -107,7 +110,7 @@ const sdk = {
|
|
|
107
110
|
});
|
|
108
111
|
})
|
|
109
112
|
}
|
|
110
|
-
}
|
|
113
|
+
},
|
|
111
114
|
space: {
|
|
112
115
|
onEntityChanged: jest.fn()
|
|
113
116
|
},
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { SpaceAPI } from '@contentful/app-sdk';
|
|
3
|
-
import { type LocalePublishStatusMap, type ReleaseAction, type
|
|
3
|
+
import { type LocalePublishStatusMap, type ReleaseAction, type ReleaseStatusMap, type ReleaseV2Props } from '@contentful/field-editor-shared';
|
|
4
4
|
import { LocaleProps } from 'contentful-management';
|
|
5
5
|
import { Asset, RenderDragFn } from '../../types';
|
|
6
6
|
export interface WrappedAssetCardProps {
|
|
@@ -21,12 +21,11 @@ export interface WrappedAssetCardProps {
|
|
|
21
21
|
localesStatusMap?: LocalePublishStatusMap;
|
|
22
22
|
activeLocales?: Pick<LocaleProps, 'code'>[];
|
|
23
23
|
releaseAction?: ReleaseAction;
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
activeRelease?: ReleaseV2Props;
|
|
24
|
+
releaseStatusMap?: ReleaseStatusMap;
|
|
25
|
+
release?: ReleaseV2Props;
|
|
27
26
|
}
|
|
28
27
|
export declare const WrappedAssetCard: {
|
|
29
|
-
({ asset, className, size, localeCode, defaultLocaleCode, activeLocales, localesStatusMap, isDisabled, isSelected, isClickable, useLocalizedEntityStatus, renderDragHandle, getEntityScheduledActions, onEdit, getAssetUrl, onRemove, releaseAction,
|
|
28
|
+
({ asset, className, size, localeCode, defaultLocaleCode, activeLocales, localesStatusMap, isDisabled, isSelected, isClickable, useLocalizedEntityStatus, renderDragHandle, getEntityScheduledActions, onEdit, getAssetUrl, onRemove, releaseAction, releaseStatusMap, release, }: WrappedAssetCardProps): React.JSX.Element;
|
|
30
29
|
defaultProps: {
|
|
31
30
|
isClickable: boolean;
|
|
32
31
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import { type ReleaseAction, type LocalePublishStatusMap, type
|
|
2
|
+
import { type ReleaseAction, type LocalePublishStatusMap, type ReleaseStatusMap, type ReleaseV2Props, type SpaceAPI } from '@contentful/field-editor-shared';
|
|
3
3
|
import type { LocaleProps } from 'contentful-management';
|
|
4
4
|
import { Asset, RenderDragFn } from '../../types';
|
|
5
5
|
export interface WrappedAssetLinkProps {
|
|
@@ -18,8 +18,7 @@ export interface WrappedAssetLinkProps {
|
|
|
18
18
|
activeLocales?: Pick<LocaleProps, 'code'>[];
|
|
19
19
|
isClickable?: boolean;
|
|
20
20
|
releaseAction?: ReleaseAction;
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
activeRelease?: ReleaseV2Props;
|
|
21
|
+
releaseStatusMap?: ReleaseStatusMap;
|
|
22
|
+
release?: ReleaseV2Props;
|
|
24
23
|
}
|
|
25
24
|
export declare const WrappedAssetLink: (props: WrappedAssetLinkProps) => React.JSX.Element;
|
|
@@ -24,6 +24,7 @@ type GetOptions = {
|
|
|
24
24
|
type GetEntityOptions = GetOptions & {
|
|
25
25
|
spaceId?: string;
|
|
26
26
|
environmentId?: string;
|
|
27
|
+
releaseId?: string;
|
|
27
28
|
};
|
|
28
29
|
type UseEntityOptions = GetEntityOptions & {
|
|
29
30
|
enabled?: boolean;
|
|
@@ -41,15 +42,19 @@ type UseResourceOptions = GetResourceOptions & {
|
|
|
41
42
|
type UseEntityResult<E> = {
|
|
42
43
|
status: 'idle';
|
|
43
44
|
data: never;
|
|
45
|
+
currentEntity: never;
|
|
44
46
|
} | {
|
|
45
47
|
status: 'loading';
|
|
46
48
|
data: never;
|
|
49
|
+
currentEntity: never;
|
|
47
50
|
} | {
|
|
48
51
|
status: 'error';
|
|
49
52
|
data: never;
|
|
53
|
+
currentEntity: never;
|
|
50
54
|
} | {
|
|
51
55
|
status: 'success';
|
|
52
56
|
data: E;
|
|
57
|
+
currentEntity?: E;
|
|
53
58
|
};
|
|
54
59
|
type FetchableEntityType = 'Entry' | 'Asset';
|
|
55
60
|
type FetchableEntity = Entry | Asset;
|
|
@@ -77,11 +82,11 @@ export declare class FunctionInvocationError extends Error {
|
|
|
77
82
|
export declare function isFunctionInvocationError(value: unknown): value is FunctionInvocationError;
|
|
78
83
|
declare const useEntityLoader: () => {
|
|
79
84
|
getResource: <R extends Resource = Resource>(resourceType: string, urn: string, options?: GetResourceOptions) => QueryResourceResult<R>;
|
|
80
|
-
getEntity: <E extends FetchableEntity>(entityType: FetchableEntityType, entityId: string, options?: GetEntityOptions) => QueryEntityResult<E>;
|
|
85
|
+
getEntity: <E extends FetchableEntity>(entityType: FetchableEntityType, entityId: string, releaseId?: string, options?: GetEntityOptions) => QueryEntityResult<E>;
|
|
81
86
|
getEntityScheduledActions: (entityType: FetchableEntityType, entityId: string, options?: GetEntityOptions) => QueryEntityResult<ScheduledAction[]>;
|
|
82
87
|
getResourceProvider: (organizationId: string, appDefinitionId: string) => QueryEntityResult<ResourceProvider>;
|
|
83
88
|
};
|
|
84
|
-
export declare function useEntity<E extends FetchableEntity>(entityType: FetchableEntityType, entityId: string, options?: UseEntityOptions): UseEntityResult<E>;
|
|
89
|
+
export declare function useEntity<E extends FetchableEntity>(entityType: FetchableEntityType, entityId: string, options?: Omit<UseEntityOptions, 'releaseId'>): UseEntityResult<E>;
|
|
85
90
|
export declare function useResource<R extends Resource = Resource>(resourceType: string, urn: string, { locale, ...options }?: UseResourceOptions): {
|
|
86
91
|
status: "error" | "success" | "loading";
|
|
87
92
|
data: ResourceInfo<R> | undefined;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import { LocalePublishStatusMap,
|
|
3
|
-
import { LocaleProps } from 'contentful-management';
|
|
4
|
-
import { WrappedAssetCardProps } from '../assets/WrappedAssetCard/WrappedAssetCard';
|
|
5
|
-
import { Asset, ContentType, Entry, RenderDragFn } from '../types';
|
|
6
|
-
import { CustomActionProps } from './ReferenceEditor';
|
|
2
|
+
import type { LocalePublishStatusMap, ReleaseAction, ReleaseStatusMap, ReleaseV2Props } from '@contentful/field-editor-shared';
|
|
3
|
+
import type { LocaleProps } from 'contentful-management';
|
|
4
|
+
import type { WrappedAssetCardProps } from '../assets/WrappedAssetCard/WrappedAssetCard';
|
|
5
|
+
import type { Asset, ContentType, Entry, RenderDragFn } from '../types';
|
|
6
|
+
import type { CustomActionProps } from './ReferenceEditor';
|
|
7
7
|
export type MissingEntityCardProps = {
|
|
8
8
|
defaultCard: React.ReactElement;
|
|
9
9
|
entity: {
|
|
@@ -32,8 +32,7 @@ export type CustomEntityCardProps = {
|
|
|
32
32
|
useLocalizedEntityStatus?: boolean;
|
|
33
33
|
localesStatusMap?: LocalePublishStatusMap;
|
|
34
34
|
activeLocales?: Pick<LocaleProps, 'code'>[];
|
|
35
|
-
|
|
36
|
-
isReleasesLoading?: boolean;
|
|
35
|
+
releaseStatusMap?: ReleaseStatusMap;
|
|
37
36
|
releaseAction?: ReleaseAction;
|
|
38
|
-
|
|
37
|
+
release?: ReleaseV2Props;
|
|
39
38
|
} & Partial<WrappedAssetCardProps>;
|