@contentful/field-editor-reference 5.19.0 → 5.20.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.
Files changed (115) hide show
  1. package/dist/cjs/__fixtures__/FakeSdk.js +3 -3
  2. package/dist/cjs/__fixtures__/asset/index.js +10 -10
  3. package/dist/cjs/__fixtures__/content-type/index.js +1 -1
  4. package/dist/cjs/__fixtures__/entry/index.js +7 -7
  5. package/dist/cjs/__fixtures__/fixtures.js +8 -6
  6. package/dist/cjs/__fixtures__/locale/index.js +2 -2
  7. package/dist/cjs/__fixtures__/space/index.js +1 -1
  8. package/dist/cjs/assets/MultipleMediaEditor.js +7 -5
  9. package/dist/cjs/assets/SingleMediaEditor.js +6 -4
  10. package/dist/cjs/assets/WrappedAssetCard/AssetCardActions.js +21 -19
  11. package/dist/cjs/assets/WrappedAssetCard/FetchingWrappedAssetCard.js +18 -11
  12. package/dist/cjs/assets/WrappedAssetCard/WrappedAssetCard.js +20 -11
  13. package/dist/cjs/assets/WrappedAssetCard/WrappedAssetLink.js +12 -9
  14. package/dist/cjs/assets/index.js +3 -3
  15. package/dist/cjs/common/EntityStore.js +53 -53
  16. package/dist/cjs/common/MultipleReferenceEditor.js +20 -11
  17. package/dist/cjs/common/ReferenceEditor.js +7 -5
  18. package/dist/cjs/common/SingleReferenceEditor.js +11 -7
  19. package/dist/cjs/common/SortableLinkList.js +14 -14
  20. package/dist/cjs/common/customCardTypes.js +4 -2
  21. package/dist/cjs/common/queryClient.js +102 -0
  22. package/dist/cjs/common/useContentTypePermissions.js +3 -1
  23. package/dist/cjs/common/useEditorPermissions.js +15 -3
  24. package/dist/cjs/common/useEditorPermissions.spec.js +13 -12
  25. package/dist/cjs/components/AssetThumbnail/AssetThumbnail.js +5 -3
  26. package/dist/cjs/components/CreateEntryLinkButton/CreateEntryLinkButton.js +13 -9
  27. package/dist/cjs/components/CreateEntryLinkButton/CreateEntryLinkButton.spec.js +17 -15
  28. package/dist/cjs/components/CreateEntryLinkButton/CreateEntryMenuTrigger.js +29 -19
  29. package/dist/cjs/components/CreateEntryLinkButton/CreateEntryMenuTrigger.spec.js +14 -12
  30. package/dist/cjs/components/LinkActions/CombinedLinkActions.js +28 -21
  31. package/dist/cjs/components/LinkActions/LinkActions.js +17 -15
  32. package/dist/cjs/components/LinkActions/LinkEntityActions.js +26 -17
  33. package/dist/cjs/components/LinkActions/NoLinkPermissionsInfo.js +5 -3
  34. package/dist/cjs/components/LinkActions/helpers.js +10 -5
  35. package/dist/cjs/components/LinkActions/redesignStyles.js +4 -4
  36. package/dist/cjs/components/LinkActions/styles.js +1 -1
  37. package/dist/cjs/components/MissingEntityCard/MissingEntityCard.js +11 -9
  38. package/dist/cjs/components/ResourceEntityErrorCard/ResourceEntityErrorCard.js +6 -4
  39. package/dist/cjs/components/ResourceEntityErrorCard/UnsupportedEntityCard.js +6 -4
  40. package/dist/cjs/components/ScheduledIconWithTooltip/ScheduleTooltip.js +10 -8
  41. package/dist/cjs/components/ScheduledIconWithTooltip/ScheduledIconWithTooltip.js +9 -4
  42. package/dist/cjs/components/ScheduledIconWithTooltip/formatDateAndTime.js +5 -4
  43. package/dist/cjs/components/SpaceName/SpaceName.js +9 -7
  44. package/dist/cjs/components/index.js +12 -12
  45. package/dist/cjs/entries/MultipleEntryReferenceEditor.js +9 -7
  46. package/dist/cjs/entries/SingleEntryReferenceEditor.js +7 -5
  47. package/dist/cjs/entries/WrappedEntryCard/FetchingWrappedEntryCard.js +20 -11
  48. package/dist/cjs/entries/WrappedEntryCard/WrappedEntryCard.js +23 -17
  49. package/dist/cjs/entries/index.js +3 -3
  50. package/dist/cjs/index.js +38 -34
  51. package/dist/cjs/resources/Cards/ContentfulEntryCard.js +13 -4
  52. package/dist/cjs/resources/Cards/ResourceCard.js +16 -12
  53. package/dist/cjs/resources/Cards/ResourceCard.spec.js +20 -17
  54. package/dist/cjs/resources/MultipleResourceReferenceEditor.js +20 -17
  55. package/dist/cjs/resources/MultipleResourceReferenceEditor.spec.js +34 -13
  56. package/dist/cjs/resources/SingleResourceReferenceEditor.js +11 -9
  57. package/dist/cjs/resources/SingleResourceReferenceEditor.spec.js +13 -6
  58. package/dist/cjs/resources/testHelpers/resourceEditorHelpers.js +12 -5
  59. package/dist/cjs/resources/useResourceLinkActions.js +11 -2
  60. package/dist/cjs/types.js +3 -3
  61. package/dist/cjs/utils/fromFieldValidations.js +2 -1
  62. package/dist/cjs/utils/useSortIDs.js +6 -4
  63. package/dist/esm/__fixtures__/FakeSdk.js +3 -3
  64. package/dist/esm/assets/MultipleMediaEditor.js +3 -3
  65. package/dist/esm/assets/SingleMediaEditor.js +2 -2
  66. package/dist/esm/assets/WrappedAssetCard/AssetCardActions.js +12 -12
  67. package/dist/esm/assets/WrappedAssetCard/FetchingWrappedAssetCard.js +14 -9
  68. package/dist/esm/assets/WrappedAssetCard/WrappedAssetCard.js +15 -7
  69. package/dist/esm/assets/WrappedAssetCard/WrappedAssetLink.js +7 -6
  70. package/dist/esm/common/EntityStore.js +40 -42
  71. package/dist/esm/common/MultipleReferenceEditor.js +16 -9
  72. package/dist/esm/common/ReferenceEditor.js +2 -2
  73. package/dist/esm/common/SingleReferenceEditor.js +7 -5
  74. package/dist/esm/common/SortableLinkList.js +12 -12
  75. package/dist/esm/common/queryClient.js +44 -0
  76. package/dist/esm/common/useContentTypePermissions.js +3 -1
  77. package/dist/esm/common/useEditorPermissions.js +15 -3
  78. package/dist/esm/common/useEditorPermissions.spec.js +13 -12
  79. package/dist/esm/components/AssetThumbnail/AssetThumbnail.js +1 -1
  80. package/dist/esm/components/CreateEntryLinkButton/CreateEntryLinkButton.js +7 -5
  81. package/dist/esm/components/CreateEntryLinkButton/CreateEntryLinkButton.spec.js +12 -12
  82. package/dist/esm/components/CreateEntryLinkButton/CreateEntryMenuTrigger.js +23 -15
  83. package/dist/esm/components/CreateEntryLinkButton/CreateEntryMenuTrigger.spec.js +9 -8
  84. package/dist/esm/components/LinkActions/CombinedLinkActions.js +30 -19
  85. package/dist/esm/components/LinkActions/LinkActions.js +9 -9
  86. package/dist/esm/components/LinkActions/LinkEntityActions.js +18 -11
  87. package/dist/esm/components/LinkActions/NoLinkPermissionsInfo.js +1 -1
  88. package/dist/esm/components/LinkActions/helpers.js +7 -2
  89. package/dist/esm/components/MissingEntityCard/MissingEntityCard.js +6 -6
  90. package/dist/esm/components/ResourceEntityErrorCard/ResourceEntityErrorCard.js +2 -2
  91. package/dist/esm/components/ResourceEntityErrorCard/UnsupportedEntityCard.js +2 -2
  92. package/dist/esm/components/ScheduledIconWithTooltip/ScheduleTooltip.js +3 -3
  93. package/dist/esm/components/ScheduledIconWithTooltip/ScheduledIconWithTooltip.js +5 -2
  94. package/dist/esm/components/ScheduledIconWithTooltip/formatDateAndTime.js +11 -2
  95. package/dist/esm/components/SpaceName/SpaceName.js +4 -4
  96. package/dist/esm/entries/MultipleEntryReferenceEditor.js +5 -5
  97. package/dist/esm/entries/SingleEntryReferenceEditor.js +3 -3
  98. package/dist/esm/entries/WrappedEntryCard/FetchingWrappedEntryCard.js +15 -8
  99. package/dist/esm/entries/WrappedEntryCard/WrappedEntryCard.js +18 -14
  100. package/dist/esm/index.js +1 -0
  101. package/dist/esm/resources/Cards/ContentfulEntryCard.js +9 -2
  102. package/dist/esm/resources/Cards/ResourceCard.js +12 -10
  103. package/dist/esm/resources/Cards/ResourceCard.spec.js +12 -11
  104. package/dist/esm/resources/MultipleResourceReferenceEditor.js +14 -13
  105. package/dist/esm/resources/MultipleResourceReferenceEditor.spec.js +30 -11
  106. package/dist/esm/resources/SingleResourceReferenceEditor.js +6 -6
  107. package/dist/esm/resources/SingleResourceReferenceEditor.spec.js +9 -4
  108. package/dist/esm/resources/testHelpers/resourceEditorHelpers.js +9 -2
  109. package/dist/esm/resources/useResourceLinkActions.js +11 -2
  110. package/dist/esm/utils/fromFieldValidations.js +1 -0
  111. package/dist/esm/utils/useSortIDs.js +2 -2
  112. package/dist/types/common/EntityStore.d.ts +1 -1
  113. package/dist/types/common/queryClient.d.ts +9 -0
  114. package/dist/types/index.d.ts +1 -0
  115. package/package.json +2 -2
@@ -9,6 +9,9 @@ function _export(target, all) {
9
9
  });
10
10
  }
11
11
  _export(exports, {
12
+ EntityProvider: function() {
13
+ return EntityProvider;
14
+ },
12
15
  UnsupportedError: function() {
13
16
  return UnsupportedError;
14
17
  },
@@ -18,21 +21,18 @@ _export(exports, {
18
21
  useEntity: function() {
19
22
  return useEntity;
20
23
  },
21
- useResource: function() {
22
- return useResource;
23
- },
24
- EntityProvider: function() {
25
- return EntityProvider;
26
- },
27
24
  useEntityLoader: function() {
28
25
  return useEntityLoader;
26
+ },
27
+ useResource: function() {
28
+ return useResource;
29
29
  }
30
30
  });
31
- const _react = _interop_require_wildcard(require("react"));
32
- const _reactquery = require("@tanstack/react-query");
33
- const _constate = _interop_require_default(require("constate"));
31
+ const _react = /*#__PURE__*/ _interop_require_wildcard(require("react"));
32
+ const _constate = /*#__PURE__*/ _interop_require_default(require("constate"));
34
33
  const _contentfulmanagement = require("contentful-management");
35
- const _pqueue = _interop_require_default(require("p-queue"));
34
+ const _pqueue = /*#__PURE__*/ _interop_require_default(require("p-queue"));
35
+ const _queryClient = require("./queryClient");
36
36
  function _define_property(obj, key, value) {
37
37
  if (key in obj) {
38
38
  Object.defineProperty(obj, key, {
@@ -72,7 +72,9 @@ function _interop_require_wildcard(obj, nodeInterop) {
72
72
  if (cache && cache.has(obj)) {
73
73
  return cache.get(obj);
74
74
  }
75
- var newObj = {};
75
+ var newObj = {
76
+ __proto__: null
77
+ };
76
78
  var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
77
79
  for(var key in obj){
78
80
  if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
@@ -90,6 +92,7 @@ function _interop_require_wildcard(obj, nodeInterop) {
90
92
  }
91
93
  return newObj;
92
94
  }
95
+ // global queue for all requests, the actual number is picked without scientific research
93
96
  const globalQueue = new _pqueue.default({
94
97
  concurrency: 50
95
98
  });
@@ -107,7 +110,8 @@ const isEntityQueryKey = (queryKey)=>{
107
110
  return Array.isArray(queryKey) && (queryKey[0] === 'Entry' || queryKey[0] === 'Asset') && queryKey.length === 4;
108
111
  };
109
112
  async function fetchContentfulEntry(params) {
110
- const { urn , fetch , options } = params;
113
+ const { urn, fetch, options } = params;
114
+ // TODO use resource-names package EntryResourceName `fromString` method instead when the package becomes public
111
115
  const resourceId = urn.split(':', 6)[5];
112
116
  const ENTITY_RESOURCE_ID_REGEX = RegExp("^spaces\\/(?<spaceId>[^/]+)(?:\\/environments\\/(?<environmentId>[^/]+))?\\/entries\\/(?<entityId>[^/]+)$");
113
117
  const resourceIdMatch = resourceId.match(ENTITY_RESOURCE_ID_REGEX);
@@ -121,7 +125,7 @@ async function fetchContentfulEntry(params) {
121
125
  fetch([
122
126
  'space',
123
127
  spaceId
124
- ], ({ cmaClient })=>cmaClient.space.get({
128
+ ], ({ cmaClient })=>cmaClient.space.get({
125
129
  spaceId
126
130
  }), options),
127
131
  fetch([
@@ -129,7 +133,7 @@ async function fetchContentfulEntry(params) {
129
133
  spaceId,
130
134
  environmentId,
131
135
  entryId
132
- ], ({ cmaClient })=>cmaClient.entry.get({
136
+ ], ({ cmaClient })=>cmaClient.entry.get({
133
137
  spaceId,
134
138
  environmentId,
135
139
  entryId
@@ -142,7 +146,7 @@ async function fetchContentfulEntry(params) {
142
146
  spaceId,
143
147
  environmentId,
144
148
  contentTypeId
145
- ], ({ cmaClient })=>cmaClient.contentType.get({
149
+ ], ({ cmaClient })=>cmaClient.contentType.get({
146
150
  contentTypeId,
147
151
  spaceId,
148
152
  environmentId
@@ -151,7 +155,7 @@ async function fetchContentfulEntry(params) {
151
155
  'defaultLocale',
152
156
  spaceId,
153
157
  environmentId
154
- ], async ({ cmaClient })=>{
158
+ ], async ({ cmaClient })=>{
155
159
  const locales = await cmaClient.locale.getMany({
156
160
  spaceId,
157
161
  environmentId,
@@ -180,7 +184,7 @@ const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = (0,
180
184
  props.sdk.ids.environmentAlias,
181
185
  props.sdk.ids.environment
182
186
  ]);
183
- const queryClient = (0, _reactquery.useQueryClient)();
187
+ const queryClient = (0, _queryClient.useQueryClient)();
184
188
  const queryCache = queryClient.getQueryCache();
185
189
  const entityChangeUnsubscribers = (0, _react.useRef)({});
186
190
  const cmaClient = (0, _react.useMemo)(()=>(0, _contentfulmanagement.createClient)({
@@ -201,7 +205,7 @@ const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = (0,
201
205
  props.queryConcurrency
202
206
  ]);
203
207
  const fetch = (0, _react.useCallback)(function fetch(queryKey, fn, options = {}) {
204
- const { priority , ...queryOptions } = options;
208
+ const { priority, ...queryOptions } = options;
205
209
  return queryClient.fetchQuery(queryKey, ()=>queryQueue.add(()=>fn({
206
210
  cmaClient
207
211
  }), {
@@ -221,7 +225,8 @@ const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = (0,
221
225
  spaceId,
222
226
  environmentId
223
227
  ];
224
- return fetch(queryKey, ({ cmaClient })=>{
228
+ return fetch(queryKey, // @ts-expect-error
229
+ ({ cmaClient })=>{
225
230
  if (entityType === 'Entry') {
226
231
  return cmaClient.entry.get({
227
232
  entryId: entityId,
@@ -243,8 +248,18 @@ const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = (0,
243
248
  currentSpaceId,
244
249
  currentEnvironmentId
245
250
  ]);
246
- const getEntityScheduledActions = (0, _react.useCallback)(function getEntityScheduledActions(entityType, entityId, options) {
251
+ /**
252
+ * Fetch all scheduled actions for a given entity.
253
+ * This function fetches all schedules for all entries and then returns
254
+ * a filtered result based on the entityID provided.
255
+ *
256
+ * The result is then reused/cached for subsequent calls to this function.
257
+ */ const getEntityScheduledActions = (0, _react.useCallback)(function getEntityScheduledActions(entityType, entityId, options) {
258
+ // This is fixed to force the cache to reuse previous results
247
259
  const fixedEntityCacheId = 'scheduledActionEntityId';
260
+ // A space+environment combo can only have up to 500 scheduled actions
261
+ // With this request we fetch all schedules and can reuse the results.
262
+ // See https://www.contentful.com/developers/docs/references/content-management-api/#/reference/scheduled-actions/limitations
248
263
  const maxScheduledActions = 500;
249
264
  const spaceId = options?.spaceId ?? currentSpaceId;
250
265
  const environmentId = options?.environmentId ?? currentEnvironmentId;
@@ -255,7 +270,8 @@ const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = (0,
255
270
  spaceId,
256
271
  environmentId
257
272
  ];
258
- return fetch(queryKey, async ({ cmaClient })=>{
273
+ // Fetch + Filter by entity ID in the end
274
+ return fetch(queryKey, async ({ cmaClient })=>{
259
275
  const response = await cmaClient.scheduledActions.getMany({
260
276
  spaceId,
261
277
  query: {
@@ -299,6 +315,7 @@ const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = (0,
299
315
  currentSpaceId,
300
316
  environmentIds
301
317
  ]);
318
+ // @ts-expect-error ...
302
319
  const onEntityChanged = props.sdk.space.onEntityChanged;
303
320
  const onSlideInNavigation = props.sdk.navigator.onSlideInNavigation;
304
321
  (0, _react.useEffect)(()=>{
@@ -309,15 +326,16 @@ const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = (0,
309
326
  });
310
327
  }
311
328
  if (typeof onEntityChanged !== 'function') {
312
- return onSlideInNavigation(({ oldSlideLevel , newSlideLevel })=>{
329
+ return onSlideInNavigation(({ oldSlideLevel, newSlideLevel })=>{
313
330
  if (oldSlideLevel > newSlideLevel) {
314
331
  findSameSpaceQueries().forEach((query)=>{
332
+ // automatically refetches the query
315
333
  void queryClient.invalidateQueries(query.queryKey);
316
334
  });
317
335
  }
318
336
  });
319
337
  }
320
- const subscribeQuery = ({ queryKey , queryHash })=>{
338
+ const subscribeQuery = ({ queryKey, queryHash })=>{
321
339
  const [entityType, entityId] = queryKey;
322
340
  entityChangeUnsubscribers.current[queryHash] = onEntityChanged(entityType, entityId, (data)=>{
323
341
  queryClient.setQueryData(queryKey, data);
@@ -328,8 +346,8 @@ const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = (0,
328
346
  if (!event) {
329
347
  return;
330
348
  }
331
- const { type , query } = event;
332
- const { queryKey , queryHash } = query;
349
+ const { type, query } = event;
350
+ const { queryKey, queryHash } = query;
333
351
  if (!isSameSpaceEntityQueryKey(queryKey)) {
334
352
  return;
335
353
  }
@@ -337,6 +355,7 @@ const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = (0,
337
355
  subscribeQuery(query);
338
356
  }
339
357
  if (type === 'removed') {
358
+ // calling unsubscribe
340
359
  entityChangeUnsubscribers.current[queryHash]?.();
341
360
  }
342
361
  });
@@ -361,24 +380,24 @@ const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = (0,
361
380
  getEntity,
362
381
  getEntityScheduledActions
363
382
  };
364
- }, ({ fetch })=>fetch, ({ getResource , getEntity , getEntityScheduledActions })=>({
383
+ }, ({ fetch })=>fetch, ({ getResource, getEntity, getEntityScheduledActions })=>({
365
384
  getResource,
366
385
  getEntity,
367
386
  getEntityScheduledActions
368
- }), ({ ids })=>({
387
+ }), ({ ids })=>({
369
388
  environment: ids.environmentAlias ?? ids.environment,
370
389
  space: ids.space
371
390
  }));
372
391
  function useEntity(entityType, entityId, options) {
373
- const { space , environment } = useCurrentIds();
374
- const { getEntity } = useEntityLoader();
392
+ const { space, environment } = useCurrentIds();
393
+ const { getEntity } = useEntityLoader();
375
394
  const queryKey = [
376
395
  entityType,
377
396
  entityId,
378
397
  options?.spaceId ?? space,
379
398
  options?.environmentId ?? environment
380
399
  ];
381
- const { status , data } = (0, _reactquery.useQuery)(queryKey, ()=>getEntity(entityType, entityId, options), {
400
+ const { status, data } = (0, _queryClient.useQuery)(queryKey, ()=>getEntity(entityType, entityId, options), {
382
401
  enabled: options?.enabled
383
402
  });
384
403
  return {
@@ -392,8 +411,8 @@ function useResource(resourceType, urn, options) {
392
411
  resourceType,
393
412
  urn
394
413
  ];
395
- const { getResource } = useEntityLoader();
396
- const { status , data , error } = (0, _reactquery.useQuery)(queryKey, ()=>getResource(resourceType, urn, options), {
414
+ const { getResource } = useEntityLoader();
415
+ const { status, data, error } = (0, _queryClient.useQuery)(queryKey, ()=>getResource(resourceType, urn, options), {
397
416
  enabled: options?.enabled
398
417
  });
399
418
  return {
@@ -402,25 +421,6 @@ function useResource(resourceType, urn, options) {
402
421
  error
403
422
  };
404
423
  }
405
- function EntityProvider({ children , ...props }) {
406
- const reactQueryClient = (0, _react.useMemo)(()=>{
407
- const queryCache = new _reactquery.QueryCache();
408
- const queryClient = new _reactquery.QueryClient({
409
- queryCache,
410
- defaultOptions: {
411
- queries: {
412
- useErrorBoundary: false,
413
- refetchOnWindowFocus: false,
414
- refetchOnReconnect: true,
415
- refetchOnMount: false,
416
- staleTime: Infinity,
417
- retry: false
418
- }
419
- }
420
- });
421
- return queryClient;
422
- }, []);
423
- return _react.default.createElement(_reactquery.QueryClientProvider, {
424
- client: reactQueryClient
425
- }, _react.default.createElement(InternalServiceProvider, props, children));
424
+ function EntityProvider({ children, ...props }) {
425
+ return /*#__PURE__*/ _react.default.createElement(_queryClient.SharedQueryClientProvider, null, /*#__PURE__*/ _react.default.createElement(InternalServiceProvider, props, children));
426
426
  }
@@ -8,7 +8,7 @@ Object.defineProperty(exports, "MultipleReferenceEditor", {
8
8
  return MultipleReferenceEditor;
9
9
  }
10
10
  });
11
- const _react = _interop_require_wildcard(require("react"));
11
+ const _react = /*#__PURE__*/ _interop_require_wildcard(require("react"));
12
12
  const _sortable = require("@dnd-kit/sortable");
13
13
  const _components = require("../components");
14
14
  const _LinkEntityActions = require("../components/LinkActions/LinkEntityActions");
@@ -36,7 +36,9 @@ function _interop_require_wildcard(obj, nodeInterop) {
36
36
  if (cache && cache.has(obj)) {
37
37
  return cache.get(obj);
38
38
  }
39
- var newObj = {};
39
+ var newObj = {
40
+ __proto__: null
41
+ };
40
42
  var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
41
43
  for(var key in obj){
42
44
  if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
@@ -73,18 +75,24 @@ const nullableValue = {
73
75
  }
74
76
  };
75
77
  function Editor(props) {
76
- const { setValue , entityType , onSortingEnd , setIndexToUpdate } = props;
78
+ const { setValue, entityType, onSortingEnd, setIndexToUpdate } = props;
77
79
  const editorPermissions = (0, _useEditorPermissions.useEditorPermissions)(props);
78
80
  const items = _react.useMemo(()=>{
79
- return (props.items || []).map((link)=>link || nullableValue);
81
+ return (props.items || [])// If null values have found their way into the persisted
82
+ // value for the multiref field, replace them with an object
83
+ // that has the shape of a Link to make the missing entry/asset
84
+ // card render
85
+ .map((link)=>link || nullableValue);
80
86
  }, [
81
87
  props.items
82
88
  ]);
83
- const { rearrangeSortIDs } = (0, _useSortIDs.useSortIDs)(items);
89
+ const { rearrangeSortIDs } = (0, _useSortIDs.useSortIDs)(items);
84
90
  const onSortStart = (0, _react.useCallback)(()=>{
85
91
  document.body.classList.add('grabbing');
86
92
  }, []);
87
- const onSortEnd = (0, _react.useCallback)(({ oldIndex , newIndex })=>{
93
+ const onSortEnd = (0, _react.useCallback)(({ oldIndex, newIndex })=>{
94
+ // custom callback that is invoked *before* we sort the array
95
+ // e.g. in Compose we want to sort the references in the referenceMap before re-rendering drag and drop
88
96
  onSortingEnd && onSortingEnd({
89
97
  oldIndex,
90
98
  newIndex
@@ -128,24 +136,25 @@ function Editor(props) {
128
136
  onLink,
129
137
  itemsLength: items.length
130
138
  });
131
- const customCardRenderer = (0, _react.useCallback)((cardProps, _, renderDefaultCard)=>props.renderCustomCard ? props.renderCustomCard(cardProps, linkActionsProps, renderDefaultCard) : false, [
139
+ const customCardRenderer = (0, _react.useCallback)((cardProps, _, renderDefaultCard)=>props.renderCustomCard ? props.renderCustomCard(cardProps, linkActionsProps, renderDefaultCard) : false, // eslint-disable-next-line react-hooks/exhaustive-deps -- TODO: Evaluate the dependencies
140
+ [
132
141
  linkActionsProps
133
142
  ]);
134
- return _react.createElement(_react.Fragment, null, props.children({
143
+ return /*#__PURE__*/ _react.createElement(_react.Fragment, null, props.children({
135
144
  ...props,
136
145
  onSortStart,
137
146
  onSortEnd,
138
147
  onMove,
139
148
  renderCustomCard: props.renderCustomCard && customCardRenderer
140
- }), _react.createElement(_components.LinkEntityActions, {
149
+ }), /*#__PURE__*/ _react.createElement(_components.LinkEntityActions, {
141
150
  renderCustomActions: props.renderCustomActions,
142
151
  ...linkActionsProps
143
152
  }));
144
153
  }
145
154
  function MultipleReferenceEditor(props) {
146
155
  const allContentTypes = props.sdk.space.getCachedContentTypes();
147
- return _react.createElement(_ReferenceEditor.ReferenceEditor, props, ({ value , disabled , setValue , externalReset })=>{
148
- return _react.createElement(Editor, {
156
+ return /*#__PURE__*/ _react.createElement(_ReferenceEditor.ReferenceEditor, props, ({ value, disabled, setValue, externalReset })=>{
157
+ return /*#__PURE__*/ _react.createElement(Editor, {
149
158
  ...props,
150
159
  items: value || emptyArray,
151
160
  isDisabled: disabled,
@@ -8,9 +8,9 @@ Object.defineProperty(exports, "ReferenceEditor", {
8
8
  return ReferenceEditor;
9
9
  }
10
10
  });
11
- const _react = _interop_require_wildcard(require("react"));
11
+ const _react = /*#__PURE__*/ _interop_require_wildcard(require("react"));
12
12
  const _fieldeditorshared = require("@contentful/field-editor-shared");
13
- const _deepequal = _interop_require_default(require("deep-equal"));
13
+ const _deepequal = /*#__PURE__*/ _interop_require_default(require("deep-equal"));
14
14
  const _EntityStore = require("./EntityStore");
15
15
  function _interop_require_default(obj) {
16
16
  return obj && obj.__esModule ? obj : {
@@ -38,7 +38,9 @@ function _interop_require_wildcard(obj, nodeInterop) {
38
38
  if (cache && cache.has(obj)) {
39
39
  return cache.get(obj);
40
40
  }
41
- var newObj = {};
41
+ var newObj = {
42
+ __proto__: null
43
+ };
42
44
  var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
43
45
  for(var key in obj){
44
46
  if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
@@ -57,9 +59,9 @@ function _interop_require_wildcard(obj, nodeInterop) {
57
59
  return newObj;
58
60
  }
59
61
  function ReferenceEditor(props) {
60
- return _react.createElement(_EntityStore.EntityProvider, {
62
+ return /*#__PURE__*/ _react.createElement(_EntityStore.EntityProvider, {
61
63
  sdk: props.sdk
62
- }, _react.createElement(_fieldeditorshared.FieldConnector, {
64
+ }, /*#__PURE__*/ _react.createElement(_fieldeditorshared.FieldConnector, {
63
65
  debounce: 0,
64
66
  field: props.sdk.field,
65
67
  isInitiallyDisabled: props.isInitiallyDisabled,
@@ -8,7 +8,7 @@ Object.defineProperty(exports, "SingleReferenceEditor", {
8
8
  return SingleReferenceEditor;
9
9
  }
10
10
  });
11
- const _react = _interop_require_wildcard(require("react"));
11
+ const _react = /*#__PURE__*/ _interop_require_wildcard(require("react"));
12
12
  const _components = require("../components");
13
13
  const _LinkEntityActions = require("../components/LinkActions/LinkEntityActions");
14
14
  const _ReferenceEditor = require("./ReferenceEditor");
@@ -34,7 +34,9 @@ function _interop_require_wildcard(obj, nodeInterop) {
34
34
  if (cache && cache.has(obj)) {
35
35
  return cache.get(obj);
36
36
  }
37
- var newObj = {};
37
+ var newObj = {
38
+ __proto__: null
39
+ };
38
40
  var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
39
41
  for(var key in obj){
40
42
  if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
@@ -53,7 +55,7 @@ function _interop_require_wildcard(obj, nodeInterop) {
53
55
  return newObj;
54
56
  }
55
57
  function Editor(props) {
56
- const { setValue , entityType } = props;
58
+ const { setValue, entityType } = props;
57
59
  const editorPermissions = (0, _useEditorPermissions.useEditorPermissions)(props);
58
60
  const onCreate = (0, _react.useCallback)((id)=>void setValue({
59
61
  sys: {
@@ -85,11 +87,13 @@ function Editor(props) {
85
87
  onCreate,
86
88
  onLink
87
89
  });
88
- const customCardRenderer = (0, _react.useCallback)((cardProps, _, renderDefaultCard)=>props.renderCustomCard ? props.renderCustomCard(cardProps, linkActionsProps, renderDefaultCard) : false, [
90
+ // Inject card actions props into the given custom card renderer
91
+ const customCardRenderer = (0, _react.useCallback)((cardProps, _, renderDefaultCard)=>props.renderCustomCard ? props.renderCustomCard(cardProps, linkActionsProps, renderDefaultCard) : false, // eslint-disable-next-line react-hooks/exhaustive-deps -- TODO: Evaluate the dependencies
92
+ [
89
93
  linkActionsProps
90
94
  ]);
91
95
  if (!props.entityId) {
92
- return _react.createElement(_components.LinkEntityActions, {
96
+ return /*#__PURE__*/ _react.createElement(_components.LinkEntityActions, {
93
97
  renderCustomActions: props.renderCustomActions,
94
98
  ...linkActionsProps
95
99
  });
@@ -101,8 +105,8 @@ function Editor(props) {
101
105
  }
102
106
  function SingleReferenceEditor(props) {
103
107
  const allContentTypes = props.sdk.space.getCachedContentTypes();
104
- return _react.createElement(_ReferenceEditor.ReferenceEditor, props, ({ value , setValue , disabled , externalReset })=>{
105
- return _react.createElement(Editor, {
108
+ return /*#__PURE__*/ _react.createElement(_ReferenceEditor.ReferenceEditor, props, ({ value, setValue, disabled, externalReset })=>{
109
+ return /*#__PURE__*/ _react.createElement(Editor, {
106
110
  ...props,
107
111
  key: `${externalReset}-reference`,
108
112
  entityId: value ? value.sys.id : '',
@@ -8,8 +8,8 @@ Object.defineProperty(exports, "SortableLinkList", {
8
8
  return SortableLinkList;
9
9
  }
10
10
  });
11
- const _react = _interop_require_default(require("react"));
12
- const _f36tokens = _interop_require_default(require("@contentful/f36-tokens"));
11
+ const _react = /*#__PURE__*/ _interop_require_default(require("react"));
12
+ const _f36tokens = /*#__PURE__*/ _interop_require_default(require("@contentful/f36-tokens"));
13
13
  const _core = require("@dnd-kit/core");
14
14
  const _sortable = require("@dnd-kit/sortable");
15
15
  const _utilities = require("@dnd-kit/utilities");
@@ -35,8 +35,8 @@ const styles = {
35
35
  display: 'flex'
36
36
  })
37
37
  };
38
- const SortableLink = ({ id , items , item , isDisabled =false , index , children })=>{
39
- const { listeners , setNodeRef , setActivatorNodeRef , transform , transition , isDragging } = (0, _sortable.useSortable)({
38
+ const SortableLink = ({ id, items, item, isDisabled = false, index, children })=>{
39
+ const { listeners, setNodeRef, setActivatorNodeRef, transform, transition, isDragging } = (0, _sortable.useSortable)({
40
40
  id
41
41
  });
42
42
  const style = {
@@ -49,16 +49,16 @@ const SortableLink = ({ id , items , item , isDisabled =false , index , children
49
49
  };
50
50
  const DragHandle = _react.default.useCallback((props)=>{
51
51
  const SortableDragHandle = ()=>props.drag;
52
- return _react.default.createElement("div", {
52
+ return /*#__PURE__*/ _react.default.createElement("div", {
53
53
  ref: setActivatorNodeRef,
54
54
  className: styles.dragHandle,
55
55
  ...listeners
56
- }, _react.default.createElement(SortableDragHandle, null));
56
+ }, /*#__PURE__*/ _react.default.createElement(SortableDragHandle, null));
57
57
  }, [
58
58
  listeners,
59
59
  setActivatorNodeRef
60
60
  ]);
61
- return _react.default.createElement("div", {
61
+ return /*#__PURE__*/ _react.default.createElement("div", {
62
62
  ref: setNodeRef,
63
63
  style: style,
64
64
  className: (0, _emotion.cx)(styles.item, {
@@ -72,8 +72,8 @@ const SortableLink = ({ id , items , item , isDisabled =false , index , children
72
72
  DragHandle: isDisabled ? undefined : DragHandle
73
73
  }));
74
74
  };
75
- const SortableLinkList = ({ items , isDisabled , className , children , onSortStart , onSortEnd , updateBeforeSortStart , sortingStrategy })=>{
76
- const { sortIDs , rearrangeSortIDs } = (0, _useSortIDs.useSortIDs)(items);
75
+ const SortableLinkList = ({ items, isDisabled, className, children, onSortStart, onSortEnd, updateBeforeSortStart, sortingStrategy })=>{
76
+ const { sortIDs, rearrangeSortIDs } = (0, _useSortIDs.useSortIDs)(items);
77
77
  const onSortStartHandler = _react.default.useCallback((event)=>{
78
78
  const index = sortIDs.findIndex((item)=>item.id === event.active.id);
79
79
  updateBeforeSortStart?.({
@@ -86,7 +86,7 @@ const SortableLinkList = ({ items , isDisabled , className , children , onSortSt
86
86
  sortIDs
87
87
  ]);
88
88
  const onSortEndHandler = _react.default.useCallback((event)=>{
89
- const { active , over } = event;
89
+ const { active, over } = event;
90
90
  if (active && over && active.id !== over.id) {
91
91
  const oldIndex = sortIDs.findIndex((item)=>item.id === active.id);
92
92
  const newIndex = sortIDs.findIndex((item)=>item.id === over.id);
@@ -101,17 +101,17 @@ const SortableLinkList = ({ items , isDisabled , className , children , onSortSt
101
101
  sortIDs,
102
102
  rearrangeSortIDs
103
103
  ]);
104
- return _react.default.createElement(_core.DndContext, {
104
+ return /*#__PURE__*/ _react.default.createElement(_core.DndContext, {
105
105
  onDragStart: onSortStartHandler,
106
106
  onDragEnd: onSortEndHandler
107
- }, _react.default.createElement(_sortable.SortableContext, {
107
+ }, /*#__PURE__*/ _react.default.createElement(_sortable.SortableContext, {
108
108
  items: sortIDs,
109
109
  strategy: sortingStrategy
110
- }, _react.default.createElement("div", {
110
+ }, /*#__PURE__*/ _react.default.createElement("div", {
111
111
  className: (0, _emotion.cx)(styles.container, className)
112
112
  }, items.map((item, index)=>{
113
113
  const id = sortIDs[index]?.id;
114
- return _react.default.createElement(SortableLink, {
114
+ return /*#__PURE__*/ _react.default.createElement(SortableLink, {
115
115
  key: id,
116
116
  id: id,
117
117
  items: items,
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
5
- const _react = _interop_require_wildcard(require("react"));
5
+ const _react = /*#__PURE__*/ _interop_require_wildcard(require("react"));
6
6
  function _getRequireWildcardCache(nodeInterop) {
7
7
  if (typeof WeakMap !== "function") return null;
8
8
  var cacheBabelInterop = new WeakMap();
@@ -24,7 +24,9 @@ function _interop_require_wildcard(obj, nodeInterop) {
24
24
  if (cache && cache.has(obj)) {
25
25
  return cache.get(obj);
26
26
  }
27
- var newObj = {};
27
+ var newObj = {
28
+ __proto__: null
29
+ };
28
30
  var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
29
31
  for(var key in obj){
30
32
  if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: all[name]
9
+ });
10
+ }
11
+ _export(exports, {
12
+ SharedQueryClientProvider: function() {
13
+ return SharedQueryClientProvider;
14
+ },
15
+ useQuery: function() {
16
+ return useQuery;
17
+ },
18
+ useQueryClient: function() {
19
+ return useQueryClient;
20
+ }
21
+ });
22
+ const _react = /*#__PURE__*/ _interop_require_wildcard(require("react"));
23
+ const _reactquery = require("@tanstack/react-query");
24
+ function _getRequireWildcardCache(nodeInterop) {
25
+ if (typeof WeakMap !== "function") return null;
26
+ var cacheBabelInterop = new WeakMap();
27
+ var cacheNodeInterop = new WeakMap();
28
+ return (_getRequireWildcardCache = function(nodeInterop) {
29
+ return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
30
+ })(nodeInterop);
31
+ }
32
+ function _interop_require_wildcard(obj, nodeInterop) {
33
+ if (!nodeInterop && obj && obj.__esModule) {
34
+ return obj;
35
+ }
36
+ if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
37
+ return {
38
+ default: obj
39
+ };
40
+ }
41
+ var cache = _getRequireWildcardCache(nodeInterop);
42
+ if (cache && cache.has(obj)) {
43
+ return cache.get(obj);
44
+ }
45
+ var newObj = {
46
+ __proto__: null
47
+ };
48
+ var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
49
+ for(var key in obj){
50
+ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
51
+ var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
52
+ if (desc && (desc.get || desc.set)) {
53
+ Object.defineProperty(newObj, key, desc);
54
+ } else {
55
+ newObj[key] = obj[key];
56
+ }
57
+ }
58
+ }
59
+ newObj.default = obj;
60
+ if (cache) {
61
+ cache.set(obj, newObj);
62
+ }
63
+ return newObj;
64
+ }
65
+ /**
66
+ * A custom client context ensures zero conflict with host apps also using
67
+ * React Query.
68
+ */ const clientContext = /*#__PURE__*/ _react.createContext(undefined);
69
+ function useQueryClient() {
70
+ const client = _react.useContext(clientContext);
71
+ return _react.useMemo(()=>{
72
+ if (client) {
73
+ return client;
74
+ }
75
+ return new _reactquery.QueryClient({
76
+ defaultOptions: {
77
+ queries: {
78
+ useErrorBoundary: false,
79
+ refetchOnWindowFocus: false,
80
+ refetchOnReconnect: true,
81
+ refetchOnMount: false,
82
+ staleTime: Infinity,
83
+ retry: false
84
+ }
85
+ }
86
+ });
87
+ }, [
88
+ client
89
+ ]);
90
+ }
91
+ const useQuery = (key, fn, opt)=>{
92
+ return (0, _reactquery.useQuery)(key, fn, {
93
+ ...opt,
94
+ context: clientContext
95
+ });
96
+ };
97
+ function SharedQueryClientProvider({ children }) {
98
+ const client = useQueryClient();
99
+ return /*#__PURE__*/ _react.createElement(clientContext.Provider, {
100
+ value: client
101
+ }, children);
102
+ }
@@ -11,6 +11,7 @@ Object.defineProperty(exports, "useContentTypePermissions", {
11
11
  const _react = require("react");
12
12
  const _useAccessApi = require("./useAccessApi");
13
13
  async function filter(arr, predicate) {
14
+ // intentionally parallel as we assume it's cached in the implementation of the access api
14
15
  const fail = Symbol();
15
16
  const results = await Promise.all(arr.map(async (item)=>await predicate(item) ? item : fail));
16
17
  return results.filter((x)=>x !== fail);
@@ -31,7 +32,7 @@ function useContentTypePermissions(props) {
31
32
  ]);
32
33
  const [creatableContentTypes, setCreatableContentTypes] = (0, _react.useState)(availableContentTypes);
33
34
  const [readableContentTypes, setReadableContentTypes] = (0, _react.useState)(availableContentTypes);
34
- const { canPerformActionOnEntryOfType } = (0, _useAccessApi.useAccessApi)(props.sdk.access);
35
+ const { canPerformActionOnEntryOfType } = (0, _useAccessApi.useAccessApi)(props.sdk.access);
35
36
  (0, _react.useEffect)(()=>{
36
37
  function getContentTypes(action) {
37
38
  return filter(availableContentTypes, (ct)=>canPerformActionOnEntryOfType(action, ct.sys.id));
@@ -43,6 +44,7 @@ function useContentTypePermissions(props) {
43
44
  setReadableContentTypes(readable);
44
45
  }
45
46
  void checkContentTypeAccess();
47
+ // eslint-disable-next-line react-hooks/exhaustive-deps -- TODO: Evaluate the dependencies
46
48
  }, [
47
49
  availableContentTypes
48
50
  ]);