@contentful/field-editor-reference 6.12.1 → 6.13.1

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.
Files changed (27) hide show
  1. package/dist/cjs/__fixtures__/FakeSdk.js +6 -6
  2. package/dist/cjs/assets/WrappedAssetCard/FetchingWrappedAssetCard.js +9 -15
  3. package/dist/cjs/assets/WrappedAssetCard/WrappedAssetCard.js +3 -4
  4. package/dist/cjs/assets/WrappedAssetCard/WrappedAssetLink.js +2 -3
  5. package/dist/cjs/common/EntityStore.js +96 -32
  6. package/dist/cjs/components/EntityStatusBadge/EntityStatusBadge.js +5 -6
  7. package/dist/cjs/components/LinkActions/CombinedLinkActions.js +2 -2
  8. package/dist/cjs/entries/WrappedEntryCard/FetchingWrappedEntryCard.js +10 -22
  9. package/dist/cjs/entries/WrappedEntryCard/WrappedEntryCard.js +3 -4
  10. package/dist/cjs/resources/Cards/ResourceCard.spec.js +14 -11
  11. package/dist/esm/__fixtures__/FakeSdk.js +7 -7
  12. package/dist/esm/assets/WrappedAssetCard/FetchingWrappedAssetCard.js +10 -16
  13. package/dist/esm/assets/WrappedAssetCard/WrappedAssetCard.js +3 -4
  14. package/dist/esm/assets/WrappedAssetCard/WrappedAssetLink.js +2 -3
  15. package/dist/esm/common/EntityStore.js +97 -33
  16. package/dist/esm/components/EntityStatusBadge/EntityStatusBadge.js +5 -6
  17. package/dist/esm/components/LinkActions/CombinedLinkActions.js +2 -2
  18. package/dist/esm/entries/WrappedEntryCard/FetchingWrappedEntryCard.js +11 -18
  19. package/dist/esm/entries/WrappedEntryCard/WrappedEntryCard.js +3 -4
  20. package/dist/esm/resources/Cards/ResourceCard.spec.js +14 -11
  21. package/dist/types/assets/WrappedAssetCard/WrappedAssetCard.d.ts +4 -5
  22. package/dist/types/assets/WrappedAssetCard/WrappedAssetLink.d.ts +3 -4
  23. package/dist/types/common/EntityStore.d.ts +7 -2
  24. package/dist/types/common/customCardTypes.d.ts +7 -8
  25. package/dist/types/components/EntityStatusBadge/EntityStatusBadge.d.ts +4 -5
  26. package/dist/types/entries/WrappedEntryCard/WrappedEntryCard.d.ts +4 -5
  27. package/package.json +5 -5
@@ -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, releaseLocalesStatusMap, isReleasesLoading, activeRelease })=>{
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
- releaseLocalesStatusMap: releaseLocalesStatusMap,
67
- isReleasesLoading: isReleasesLoading,
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
- releaseLocalesStatusMap: props.releaseLocalesStatusMap,
39
- isReleasesLoading: props.isReleasesLoading,
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 { createClient, fetchAll } from 'contentful-management';
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,11 +153,13 @@ async function fetchExternalResource({ urn, fetch, options, spaceId, environment
153
153
  'resource-types',
154
154
  spaceId,
155
155
  environmentId
156
- ], ({ cmaClient })=>fetchAll(({ query })=>cmaClient.resourceType.getForEnvironment({
156
+ ], ({ cmaClient })=>{
157
+ return fetchAll(({ query })=>cmaClient.resourceType.getForEnvironment({
157
158
  spaceId,
158
159
  environmentId,
159
160
  query
160
- }), {}))
161
+ }), {});
162
+ })
161
163
  ]);
162
164
  const resourceTypeEntity = resourceTypes.find((rt)=>rt.sys.id === resourceType);
163
165
  if (!resourceTypeEntity) {
@@ -177,6 +179,7 @@ async function fetchExternalResource({ urn, fetch, options, spaceId, environment
177
179
  const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = constate(function useInitServices(props) {
178
180
  const currentSpaceId = props.sdk.ids.space;
179
181
  const currentEnvironmentId = props.sdk.ids.environmentAlias ?? props.sdk.ids.environment;
182
+ const releaseId = props.sdk.ids.release;
180
183
  const environmentIds = useMemo(()=>[
181
184
  props.sdk.ids.environmentAlias,
182
185
  props.sdk.ids.environment
@@ -187,13 +190,7 @@ const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = cons
187
190
  const queryClient = useQueryClient();
188
191
  const queryCache = queryClient.getQueryCache();
189
192
  const entityChangeUnsubscribers = useRef({});
190
- const cmaClient = useMemo(()=>createClient({
191
- apiAdapter: props.sdk.cmaAdapter
192
- }, {
193
- type: 'plain'
194
- }), [
195
- props.sdk.cmaAdapter
196
- ]);
193
+ const cmaClient = props.sdk.cma;
197
194
  const queryQueue = useMemo(()=>{
198
195
  if (props.queryConcurrency) {
199
196
  return new PQueue({
@@ -216,38 +213,92 @@ const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = cons
216
213
  queryQueue,
217
214
  cmaClient
218
215
  ]);
219
- const getEntity = useCallback(function getEntity(entityType, entityId, options) {
216
+ const isReleaseRequestError = useCallback(function isReleaseRequestError(error, spaceId, environmentId) {
217
+ return !!releaseId && (!spaceId || spaceId === currentSpaceId) && (!environmentId || environmentId === currentEnvironmentId) && error instanceof Error && 'status' in error && error.status === 404;
218
+ }, [
219
+ releaseId,
220
+ currentSpaceId,
221
+ currentEnvironmentId
222
+ ]);
223
+ const getEntity = useCallback(function getEntity(entityType, entityId, releaseId, options) {
220
224
  const spaceId = options?.spaceId ?? currentSpaceId;
221
225
  const environmentId = options?.environmentId ?? currentEnvironmentId;
222
226
  const queryKey = [
223
227
  entityType,
224
228
  entityId,
225
229
  spaceId,
226
- environmentId
230
+ environmentId,
231
+ releaseId
227
232
  ];
228
- return fetch(queryKey, ({ cmaClient })=>{
233
+ return fetch(queryKey, async ({ cmaClient })=>{
229
234
  if (entityType === 'Entry') {
230
- return cmaClient.entry.get({
231
- entryId: entityId,
232
- spaceId,
233
- environmentId
234
- });
235
+ try {
236
+ return cmaClient.entry.get({
237
+ entryId: entityId,
238
+ spaceId,
239
+ environmentId,
240
+ releaseId
241
+ });
242
+ } catch (error) {
243
+ if (isReleaseRequestError(error, spaceId, environmentId)) {
244
+ const currentEntry = await cmaClient.entry.get({
245
+ entryId: entityId,
246
+ spaceId,
247
+ environmentId,
248
+ releaseId: undefined
249
+ });
250
+ currentEntry.sys.release = {
251
+ sys: {
252
+ type: 'Link',
253
+ linkType: 'Release',
254
+ id: releaseId
255
+ }
256
+ };
257
+ return currentEntry;
258
+ }
259
+ throw error;
260
+ }
235
261
  }
236
262
  if (entityType === 'Asset') {
237
- return cmaClient.asset.get({
238
- assetId: entityId,
239
- spaceId,
240
- environmentId
241
- });
263
+ try {
264
+ return cmaClient.asset.get({
265
+ assetId: entityId,
266
+ spaceId,
267
+ environmentId,
268
+ releaseId
269
+ });
270
+ } catch (error) {
271
+ if (isReleaseRequestError(error, spaceId, environmentId)) {
272
+ const currentAsset = cmaClient.asset.get({
273
+ assetId: entityId,
274
+ spaceId,
275
+ environmentId,
276
+ releaseId: undefined
277
+ });
278
+ currentAsset.sys.release = {
279
+ sys: {
280
+ type: 'Link',
281
+ linkType: 'Release',
282
+ id: releaseId
283
+ }
284
+ };
285
+ return currentAsset;
286
+ }
287
+ throw error;
288
+ }
242
289
  }
243
290
  throw new UnsupportedError('Unsupported entity type');
244
291
  }, options);
245
292
  }, [
246
293
  fetch,
247
294
  currentSpaceId,
248
- currentEnvironmentId
295
+ currentEnvironmentId,
296
+ isReleaseRequestError
249
297
  ]);
250
298
  const getEntityScheduledActions = useCallback(function getEntityScheduledActions(entityType, entityId, options) {
299
+ if (releaseId) {
300
+ return new Promise((resolve)=>resolve([]));
301
+ }
251
302
  const fixedEntityCacheId = 'scheduledActionEntityId';
252
303
  const maxScheduledActions = 500;
253
304
  const spaceId = options?.spaceId ?? currentSpaceId;
@@ -257,7 +308,8 @@ const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = cons
257
308
  entityType,
258
309
  fixedEntityCacheId,
259
310
  spaceId,
260
- environmentId
311
+ environmentId,
312
+ releaseId
261
313
  ];
262
314
  return fetch(queryKey, async ({ cmaClient })=>{
263
315
  const response = await cmaClient.scheduledActions.getMany({
@@ -274,7 +326,8 @@ const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = cons
274
326
  }, [
275
327
  fetch,
276
328
  currentSpaceId,
277
- currentEnvironmentId
329
+ currentEnvironmentId,
330
+ releaseId
278
331
  ]);
279
332
  const getResource = useCallback(function getResource(resourceType, urn, options) {
280
333
  const queryKey = [
@@ -402,23 +455,34 @@ const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = cons
402
455
  getResourceProvider
403
456
  }), ({ ids })=>({
404
457
  environment: ids.environmentAlias ?? ids.environment,
405
- space: ids.space
458
+ space: ids.space,
459
+ releaseId: ids.release
406
460
  }));
407
461
  export function useEntity(entityType, entityId, options) {
408
- const { space, environment } = useCurrentIds();
462
+ const { space, environment, releaseId } = useCurrentIds();
409
463
  const { getEntity } = useEntityLoader();
410
- const queryKey = [
464
+ const { status, data } = useQuery([
411
465
  entityType,
412
466
  entityId,
413
467
  options?.spaceId ?? space,
414
- options?.environmentId ?? environment
415
- ];
416
- const { status, data } = useQuery(queryKey, ()=>getEntity(entityType, entityId, options), {
468
+ options?.environmentId ?? environment,
469
+ releaseId
470
+ ], ()=>getEntity(entityType, entityId, releaseId, options), {
417
471
  enabled: options?.enabled
418
472
  });
473
+ const { data: currentEntity } = useQuery([
474
+ entityType,
475
+ entityId,
476
+ options?.spaceId ?? space,
477
+ options?.environmentId ?? environment,
478
+ undefined
479
+ ], ()=>getEntity(entityType, entityId, undefined, options), {
480
+ enabled: options?.enabled && !!releaseId
481
+ });
419
482
  return {
420
483
  status,
421
- data
484
+ data,
485
+ currentEntity
422
486
  };
423
487
  }
424
488
  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, releaseLocalesStatusMap, isReleasesLoading, releaseAction, activeRelease, ...props }) {
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 (activeRelease && releaseLocalesStatusMap && useLocalizedEntityStatus && activeLocales) {
12
+ if (release && releaseStatusMap && useLocalizedEntityStatus && activeLocales) {
13
13
  return /*#__PURE__*/ React.createElement(ReleaseEntityStatusPopover, {
14
- releaseLocalesStatusMap: releaseLocalesStatusMap,
15
- activeLocales: activeLocales,
16
- isLoading: isReleasesLoading
14
+ releaseStatusMap: releaseStatusMap,
15
+ activeLocales: activeLocales
17
16
  });
18
17
  }
19
- if (activeRelease && releaseAction) {
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, null, /*#__PURE__*/ React.createElement(Menu.Item, {
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")) : undefined
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 { parseReleaseParams, useLocalePublishStatus, useActiveReleaseLocalesStatuses, getEntityReleaseStatus } from '@contentful/field-editor-shared';
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 { releaseVersionMap, locales, activeRelease, releases, isActiveReleaseLoading } = parseReleaseParams(props.sdk.parameters.instance.release);
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 { releaseLocalesStatusMap } = useActiveReleaseLocalesStatuses({
37
- currentEntityDraft: entry,
38
- entityId: props.entryId,
39
- entityType: 'Entry',
40
- releaseVersionMap,
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: get(entry, 'sys.contentType.sys.id'),
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: get(entry, 'sys.contentType.sys.id')
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
- releaseLocalesStatusMap,
124
- isReleasesLoading: isActiveReleaseLoading,
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, releaseLocalesStatusMap, isReleasesLoading, activeRelease }) {
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
- releaseLocalesStatusMap: releaseLocalesStatusMap,
82
- isReleasesLoading: isReleasesLoading,
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
- cmaAdapter: createFakeCMAAdapter({
31
- ContentType: {
29
+ cma: {
30
+ contentType: {
32
31
  get: jest.fn().mockReturnValue(publishedCT)
33
32
  },
34
- Entry: {
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
- Locale: {
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
- Resource: {
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
- ResourceType: {
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
- ScheduledAction: {
93
+ scheduledActions: {
91
94
  getMany: jest.fn().mockResolvedValue({
92
95
  items: [],
93
96
  total: 0
94
97
  })
95
98
  },
96
- Space: {
99
+ space: {
97
100
  get: jest.fn().mockResolvedValue(space)
98
101
  },
99
- ResourceProvider: {
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 ReleaseLocalesStatusMap, type ReleaseV2Props } from '@contentful/field-editor-shared';
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
- releaseLocalesStatusMap?: ReleaseLocalesStatusMap;
25
- isReleasesLoading?: boolean;
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, releaseLocalesStatusMap, isReleasesLoading, activeRelease, }: WrappedAssetCardProps): React.JSX.Element;
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 ReleaseLocalesStatusMap, type ReleaseV2Props, type SpaceAPI } from '@contentful/field-editor-shared';
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
- releaseLocalesStatusMap?: ReleaseLocalesStatusMap;
22
- isReleasesLoading?: boolean;
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, type ReleaseAction, type ReleaseLocalesStatusMap, type ReleaseV2Props } from '@contentful/field-editor-shared';
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
- releaseLocalesStatusMap?: ReleaseLocalesStatusMap;
36
- isReleasesLoading?: boolean;
35
+ releaseStatusMap?: ReleaseStatusMap;
37
36
  releaseAction?: ReleaseAction;
38
- activeRelease?: ReleaseV2Props;
37
+ release?: ReleaseV2Props;
39
38
  } & Partial<WrappedAssetCardProps>;
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import { type EntityStatus } from '@contentful/f36-components';
3
- import { LocalePublishStatusMap, type ReleaseAction, type ReleaseLocalesStatusMap, type ReleaseV2Props } from '@contentful/field-editor-shared';
3
+ import { LocalePublishStatusMap, type ReleaseAction, type ReleaseStatusMap, type ReleaseV2Props } from '@contentful/field-editor-shared';
4
4
  import { EntryProps, LocaleProps, AssetProps } from 'contentful-management';
5
5
  import { type UseScheduledActionsProps } from '../ScheduledIconWithTooltip/ScheduledIconWithTooltip';
6
6
  type EntityStatusBadgeProps = Omit<UseScheduledActionsProps, 'entityId'> & {
@@ -9,10 +9,9 @@ type EntityStatusBadgeProps = Omit<UseScheduledActionsProps, 'entityId'> & {
9
9
  useLocalizedEntityStatus?: boolean;
10
10
  localesStatusMap?: LocalePublishStatusMap;
11
11
  activeLocales?: Pick<LocaleProps, 'code'>[];
12
- releaseLocalesStatusMap?: ReleaseLocalesStatusMap;
13
- isReleasesLoading?: boolean;
12
+ releaseStatusMap?: ReleaseStatusMap;
14
13
  releaseAction?: ReleaseAction;
15
- activeRelease?: ReleaseV2Props;
14
+ release?: ReleaseV2Props;
16
15
  };
17
- export declare function EntityStatusBadge({ entityType, getEntityScheduledActions, status, useLocalizedEntityStatus, localesStatusMap, activeLocales, entity, releaseLocalesStatusMap, isReleasesLoading, releaseAction, activeRelease, ...props }: EntityStatusBadgeProps): React.JSX.Element;
16
+ export declare function EntityStatusBadge({ entityType, getEntityScheduledActions, status, useLocalizedEntityStatus, localesStatusMap, activeLocales, entity, releaseStatusMap, releaseAction, release, ...props }: EntityStatusBadgeProps): React.JSX.Element;
18
17
  export {};
@@ -1,6 +1,6 @@
1
1
  import * as React from 'react';
2
2
  import { SpaceAPI } from '@contentful/app-sdk';
3
- import { LocalePublishStatusMap, type ReleaseAction, type ReleaseLocalesStatusMap, type ReleaseV2Props } from '@contentful/field-editor-shared';
3
+ import { LocalePublishStatusMap, type ReleaseAction, type ReleaseStatusMap, type ReleaseV2Props } from '@contentful/field-editor-shared';
4
4
  import { LocaleProps } from 'contentful-management';
5
5
  import { ContentType, Entry, RenderDragFn } from '../../types';
6
6
  export interface WrappedEntryCardProps {
@@ -29,11 +29,10 @@ export interface WrappedEntryCardProps {
29
29
  localesStatusMap?: LocalePublishStatusMap;
30
30
  activeLocales?: Pick<LocaleProps, 'code'>[];
31
31
  releaseAction?: ReleaseAction;
32
- releaseLocalesStatusMap?: ReleaseLocalesStatusMap;
33
- isReleasesLoading?: boolean;
34
- activeRelease?: ReleaseV2Props;
32
+ releaseStatusMap?: ReleaseStatusMap;
33
+ release?: ReleaseV2Props;
35
34
  }
36
- export declare 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, releaseLocalesStatusMap, isReleasesLoading, activeRelease, }: WrappedEntryCardProps): React.JSX.Element;
35
+ export declare 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, }: WrappedEntryCardProps): React.JSX.Element;
37
36
  export declare namespace WrappedEntryCard {
38
37
  var defaultProps: {
39
38
  isClickable: boolean;