@contentful/field-editor-reference 5.9.0 → 5.11.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 (199) hide show
  1. package/dist/cjs/__fixtures__/FakeSdk.js +183 -0
  2. package/dist/cjs/__fixtures__/asset/index.js +37 -0
  3. package/dist/cjs/__fixtures__/content-type/index.js +16 -0
  4. package/dist/cjs/__fixtures__/entry/index.js +33 -0
  5. package/dist/cjs/__fixtures__/fixtures.js +71 -0
  6. package/dist/cjs/__fixtures__/locale/index.js +40 -0
  7. package/dist/cjs/__fixtures__/space/index.js +16 -0
  8. package/dist/cjs/assets/MultipleMediaEditor.js +86 -0
  9. package/dist/cjs/assets/SingleMediaEditor.js +69 -0
  10. package/dist/cjs/assets/WrappedAssetCard/AssetCardActions.js +125 -0
  11. package/dist/cjs/assets/WrappedAssetCard/FetchingWrappedAssetCard.js +171 -0
  12. package/dist/cjs/assets/WrappedAssetCard/WrappedAssetCard.js +159 -0
  13. package/dist/cjs/assets/WrappedAssetCard/WrappedAssetLink.js +130 -0
  14. package/dist/cjs/assets/index.js +24 -0
  15. package/dist/cjs/common/EntityStore.js +420 -0
  16. package/dist/cjs/common/MultipleReferenceEditor.js +164 -0
  17. package/dist/cjs/common/ReferenceEditor.js +74 -0
  18. package/dist/cjs/common/SingleReferenceEditor.js +118 -0
  19. package/dist/cjs/common/SortableLinkList.js +95 -0
  20. package/dist/cjs/common/customCardTypes.js +44 -0
  21. package/dist/cjs/common/useAccessApi.js +19 -0
  22. package/dist/cjs/common/useContentTypePermissions.js +54 -0
  23. package/dist/cjs/common/useEditorPermissions.js +77 -0
  24. package/dist/cjs/common/useEditorPermissions.spec.js +205 -0
  25. package/dist/cjs/components/AssetThumbnail/AssetThumbnail.js +62 -0
  26. package/dist/cjs/components/CreateEntryLinkButton/CreateEntryLinkButton.js +102 -0
  27. package/dist/cjs/components/CreateEntryLinkButton/CreateEntryLinkButton.spec.js +254 -0
  28. package/dist/cjs/components/CreateEntryLinkButton/CreateEntryMenuTrigger.js +199 -0
  29. package/dist/cjs/components/CreateEntryLinkButton/CreateEntryMenuTrigger.spec.js +190 -0
  30. package/dist/cjs/components/CreateEntryLinkButton/useGlobalMouseUp.js +19 -0
  31. package/dist/cjs/components/LinkActions/CombinedLinkActions.js +167 -0
  32. package/dist/cjs/components/LinkActions/LinkActions.js +123 -0
  33. package/dist/cjs/components/LinkActions/LinkEntityActions.js +186 -0
  34. package/dist/cjs/components/LinkActions/NoLinkPermissionsInfo.js +54 -0
  35. package/dist/cjs/components/LinkActions/helpers.js +78 -0
  36. package/dist/cjs/components/LinkActions/redesignStyles.js +44 -0
  37. package/dist/cjs/components/LinkActions/styles.js +33 -0
  38. package/dist/cjs/components/MissingEntityCard/MissingEntityCard.js +75 -0
  39. package/dist/cjs/components/MissingEntityCard/styles.js +29 -0
  40. package/dist/cjs/components/ScheduledIconWithTooltip/ScheduleTooltip.js +75 -0
  41. package/dist/cjs/components/ScheduledIconWithTooltip/ScheduledIconWithTooltip.js +81 -0
  42. package/dist/cjs/components/ScheduledIconWithTooltip/formatDateAndTime.js +45 -0
  43. package/dist/cjs/components/SpaceName/SpaceName.js +91 -0
  44. package/dist/cjs/components/index.js +44 -0
  45. package/dist/cjs/entries/MultipleEntryReferenceEditor.js +86 -0
  46. package/dist/cjs/entries/SingleEntryReferenceEditor.js +74 -0
  47. package/dist/cjs/entries/WrappedEntryCard/FetchingWrappedEntryCard.js +189 -0
  48. package/dist/cjs/entries/WrappedEntryCard/WrappedEntryCard.js +181 -0
  49. package/dist/cjs/entries/index.js +24 -0
  50. package/dist/cjs/index.js +92 -0
  51. package/dist/cjs/resources/Cards/ContentfulEntryCard.js +87 -0
  52. package/dist/cjs/resources/Cards/ResourceCard.js +111 -0
  53. package/dist/cjs/resources/Cards/UnsupportedEntityCard.js +64 -0
  54. package/dist/cjs/resources/MultipleResourceReferenceEditor.js +157 -0
  55. package/dist/cjs/resources/MultipleResourceReferenceEditor.spec.js +297 -0
  56. package/dist/cjs/resources/SingleResourceReferenceEditor.js +87 -0
  57. package/dist/cjs/resources/SingleResourceReferenceEditor.spec.js +161 -0
  58. package/dist/cjs/resources/index.js +19 -0
  59. package/dist/cjs/resources/testHelpers/resourceEditorHelpers.js +121 -0
  60. package/dist/cjs/resources/useResourceLinkActions.js +88 -0
  61. package/dist/cjs/types.js +22 -0
  62. package/dist/cjs/utils/fromFieldValidations.js +54 -0
  63. package/dist/esm/__fixtures__/FakeSdk.js +173 -0
  64. package/dist/esm/__fixtures__/asset/index.js +6 -0
  65. package/dist/esm/__fixtures__/content-type/index.js +2 -0
  66. package/dist/esm/__fixtures__/entry/index.js +5 -0
  67. package/dist/esm/__fixtures__/fixtures.js +6 -0
  68. package/dist/esm/__fixtures__/locale/index.js +15 -0
  69. package/dist/esm/__fixtures__/space/index.js +2 -0
  70. package/dist/esm/assets/MultipleMediaEditor.js +37 -0
  71. package/dist/esm/assets/SingleMediaEditor.js +20 -0
  72. package/dist/esm/assets/WrappedAssetCard/AssetCardActions.js +63 -0
  73. package/dist/esm/assets/WrappedAssetCard/FetchingWrappedAssetCard.js +122 -0
  74. package/dist/esm/assets/WrappedAssetCard/WrappedAssetCard.js +105 -0
  75. package/dist/esm/assets/WrappedAssetCard/WrappedAssetLink.js +76 -0
  76. package/dist/esm/assets/index.js +3 -0
  77. package/dist/esm/common/EntityStore.js +347 -0
  78. package/dist/esm/common/MultipleReferenceEditor.js +111 -0
  79. package/dist/esm/common/ReferenceEditor.js +20 -0
  80. package/dist/esm/common/SingleReferenceEditor.js +70 -0
  81. package/dist/esm/common/SortableLinkList.js +41 -0
  82. package/dist/esm/common/customCardTypes.js +1 -0
  83. package/dist/esm/common/useAccessApi.js +9 -0
  84. package/dist/esm/common/useContentTypePermissions.js +44 -0
  85. package/dist/esm/common/useEditorPermissions.js +67 -0
  86. package/dist/esm/common/useEditorPermissions.spec.js +201 -0
  87. package/dist/esm/components/AssetThumbnail/AssetThumbnail.js +13 -0
  88. package/dist/esm/components/CreateEntryLinkButton/CreateEntryLinkButton.js +48 -0
  89. package/dist/esm/components/CreateEntryLinkButton/CreateEntryLinkButton.spec.js +206 -0
  90. package/dist/esm/components/CreateEntryLinkButton/CreateEntryMenuTrigger.js +145 -0
  91. package/dist/esm/components/CreateEntryLinkButton/CreateEntryMenuTrigger.spec.js +142 -0
  92. package/dist/esm/components/CreateEntryLinkButton/useGlobalMouseUp.js +9 -0
  93. package/dist/esm/components/LinkActions/CombinedLinkActions.js +118 -0
  94. package/dist/esm/components/LinkActions/LinkActions.js +66 -0
  95. package/dist/esm/components/LinkActions/LinkEntityActions.js +127 -0
  96. package/dist/esm/components/LinkActions/NoLinkPermissionsInfo.js +5 -0
  97. package/dist/esm/components/LinkActions/helpers.js +57 -0
  98. package/dist/esm/components/LinkActions/redesignStyles.js +18 -0
  99. package/dist/esm/components/LinkActions/styles.js +10 -0
  100. package/dist/esm/components/MissingEntityCard/MissingEntityCard.js +26 -0
  101. package/dist/esm/components/MissingEntityCard/styles.js +11 -0
  102. package/dist/esm/components/ScheduledIconWithTooltip/ScheduleTooltip.js +18 -0
  103. package/dist/esm/components/ScheduledIconWithTooltip/ScheduledIconWithTooltip.js +32 -0
  104. package/dist/esm/components/ScheduledIconWithTooltip/formatDateAndTime.js +19 -0
  105. package/dist/esm/components/SpaceName/SpaceName.js +37 -0
  106. package/dist/esm/components/index.js +8 -0
  107. package/dist/esm/entries/MultipleEntryReferenceEditor.js +37 -0
  108. package/dist/esm/entries/SingleEntryReferenceEditor.js +25 -0
  109. package/dist/esm/entries/WrappedEntryCard/FetchingWrappedEntryCard.js +135 -0
  110. package/dist/esm/entries/WrappedEntryCard/WrappedEntryCard.js +127 -0
  111. package/dist/esm/entries/index.js +3 -0
  112. package/dist/esm/index.js +7 -0
  113. package/dist/esm/resources/Cards/ContentfulEntryCard.js +38 -0
  114. package/dist/esm/resources/Cards/ResourceCard.js +62 -0
  115. package/dist/esm/resources/Cards/UnsupportedEntityCard.js +15 -0
  116. package/dist/esm/resources/MultipleResourceReferenceEditor.js +104 -0
  117. package/dist/esm/resources/MultipleResourceReferenceEditor.spec.js +254 -0
  118. package/dist/esm/resources/SingleResourceReferenceEditor.js +33 -0
  119. package/dist/esm/resources/SingleResourceReferenceEditor.spec.js +118 -0
  120. package/dist/esm/resources/index.js +2 -0
  121. package/dist/esm/resources/testHelpers/resourceEditorHelpers.js +103 -0
  122. package/dist/esm/resources/useResourceLinkActions.js +78 -0
  123. package/dist/esm/types.js +1 -0
  124. package/dist/esm/utils/fromFieldValidations.js +39 -0
  125. package/dist/{__fixtures__ → types/__fixtures__}/FakeSdk.d.ts +8 -8
  126. package/dist/{__fixtures__ → types/__fixtures__}/asset/index.d.ts +6 -6
  127. package/dist/{__fixtures__ → types/__fixtures__}/content-type/index.d.ts +2 -2
  128. package/dist/{__fixtures__ → types/__fixtures__}/entry/index.d.ts +5 -5
  129. package/dist/{__fixtures__ → types/__fixtures__}/fixtures.d.ts +6 -6
  130. package/dist/{__fixtures__ → types/__fixtures__}/locale/index.d.ts +42 -42
  131. package/dist/{__fixtures__ → types/__fixtures__}/space/index.d.ts +2 -2
  132. package/dist/{assets → types/assets}/MultipleMediaEditor.d.ts +10 -10
  133. package/dist/types/assets/SingleMediaEditor.d.ts +10 -0
  134. package/dist/{assets → types/assets}/WrappedAssetCard/AssetCardActions.d.ts +11 -11
  135. package/dist/{assets → types/assets}/WrappedAssetCard/FetchingWrappedAssetCard.d.ts +17 -17
  136. package/dist/{assets → types/assets}/WrappedAssetCard/WrappedAssetCard.d.ts +24 -24
  137. package/dist/{assets → types/assets}/WrappedAssetCard/WrappedAssetLink.d.ts +16 -16
  138. package/dist/{assets → types/assets}/index.d.ts +3 -3
  139. package/dist/{common → types/common}/EntityStore.d.ts +62 -62
  140. package/dist/{common → types/common}/MultipleReferenceEditor.d.ts +25 -25
  141. package/dist/{common → types/common}/ReferenceEditor.d.ts +46 -46
  142. package/dist/{common → types/common}/SingleReferenceEditor.d.ts +24 -24
  143. package/dist/{common → types/common}/SortableLinkList.d.ts +19 -19
  144. package/dist/{common → types/common}/customCardTypes.d.ts +29 -29
  145. package/dist/types/common/useAccessApi.d.ts +16 -0
  146. package/dist/{common → types/common}/useContentTypePermissions.d.ts +17 -17
  147. package/dist/{common → types/common}/useEditorPermissions.d.ts +17 -17
  148. package/dist/types/common/useEditorPermissions.spec.d.ts +1 -0
  149. package/dist/{components → types/components}/AssetThumbnail/AssetThumbnail.d.ts +7 -7
  150. package/dist/{components → types/components}/CreateEntryLinkButton/CreateEntryLinkButton.d.ts +19 -19
  151. package/dist/types/components/CreateEntryLinkButton/CreateEntryLinkButton.spec.d.ts +1 -0
  152. package/dist/{components → types/components}/CreateEntryLinkButton/CreateEntryMenuTrigger.d.ts +31 -31
  153. package/dist/types/components/CreateEntryLinkButton/CreateEntryMenuTrigger.spec.d.ts +1 -0
  154. package/dist/{components → types/components}/CreateEntryLinkButton/useGlobalMouseUp.d.ts +1 -1
  155. package/dist/{components → types/components}/LinkActions/CombinedLinkActions.d.ts +10 -10
  156. package/dist/{components → types/components}/LinkActions/LinkActions.d.ts +26 -26
  157. package/dist/{components → types/components}/LinkActions/LinkEntityActions.d.ts +24 -24
  158. package/dist/types/components/LinkActions/NoLinkPermissionsInfo.d.ts +2 -0
  159. package/dist/{components → types/components}/LinkActions/helpers.d.ts +26 -26
  160. package/dist/{components → types/components}/LinkActions/redesignStyles.d.ts +3 -3
  161. package/dist/{components → types/components}/LinkActions/styles.d.ts +2 -2
  162. package/dist/{components → types/components}/MissingEntityCard/MissingEntityCard.d.ts +8 -8
  163. package/dist/{components → types/components}/MissingEntityCard/styles.d.ts +2 -2
  164. package/dist/{components → types/components}/ScheduledIconWithTooltip/ScheduleTooltip.d.ts +11 -11
  165. package/dist/{components → types/components}/ScheduledIconWithTooltip/ScheduledIconWithTooltip.d.ts +10 -10
  166. package/dist/{components → types/components}/ScheduledIconWithTooltip/formatDateAndTime.d.ts +15 -15
  167. package/dist/types/components/SpaceName/SpaceName.d.ts +6 -0
  168. package/dist/{components → types/components}/index.d.ts +9 -9
  169. package/dist/{entries → types/entries}/MultipleEntryReferenceEditor.d.ts +3 -3
  170. package/dist/{entries → types/entries}/SingleEntryReferenceEditor.d.ts +8 -8
  171. package/dist/{entries → types/entries}/WrappedEntryCard/FetchingWrappedEntryCard.d.ts +18 -18
  172. package/dist/{entries → types/entries}/WrappedEntryCard/WrappedEntryCard.d.ts +35 -35
  173. package/dist/{entries → types/entries}/index.d.ts +3 -3
  174. package/dist/{index.d.ts → types/index.d.ts} +10 -8
  175. package/dist/{resources → types/resources}/Cards/ContentfulEntryCard.d.ts +21 -21
  176. package/dist/{resources → types/resources}/Cards/ResourceCard.d.ts +12 -12
  177. package/dist/{resources → types/resources}/Cards/UnsupportedEntityCard.d.ts +4 -4
  178. package/dist/{resources → types/resources}/MultipleResourceReferenceEditor.d.ts +7 -7
  179. package/dist/types/resources/MultipleResourceReferenceEditor.spec.d.ts +1 -0
  180. package/dist/{resources → types/resources}/SingleResourceReferenceEditor.d.ts +7 -7
  181. package/dist/types/resources/SingleResourceReferenceEditor.spec.d.ts +1 -0
  182. package/dist/{resources → types/resources}/index.d.ts +2 -2
  183. package/dist/{resources → types/resources}/testHelpers/resourceEditorHelpers.d.ts +50 -50
  184. package/dist/{resources → types/resources}/useResourceLinkActions.d.ts +7 -7
  185. package/dist/{types.d.ts → types/types.d.ts} +104 -104
  186. package/dist/{utils → types/utils}/fromFieldValidations.d.ts +21 -21
  187. package/package.json +25 -11
  188. package/CHANGELOG.md +0 -860
  189. package/dist/assets/SingleMediaEditor.d.ts +0 -10
  190. package/dist/common/useAccessApi.d.ts +0 -16
  191. package/dist/components/LinkActions/NoLinkPermissionsInfo.d.ts +0 -2
  192. package/dist/components/SpaceName/SpaceName.d.ts +0 -6
  193. package/dist/field-editor-reference.cjs.development.js +0 -2753
  194. package/dist/field-editor-reference.cjs.development.js.map +0 -1
  195. package/dist/field-editor-reference.cjs.production.min.js +0 -2
  196. package/dist/field-editor-reference.cjs.production.min.js.map +0 -1
  197. package/dist/field-editor-reference.esm.js +0 -2727
  198. package/dist/field-editor-reference.esm.js.map +0 -1
  199. package/dist/index.js +0 -8
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "useResourceLinkActions", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return useResourceLinkActions;
9
+ }
10
+ });
11
+ const _react = require("react");
12
+ const toLinkItem = (entry, apiUrl)=>({
13
+ sys: {
14
+ type: 'ResourceLink',
15
+ linkType: 'Contentful:Entry',
16
+ urn: entry.sys.urn ?? `crn:${apiUrl}:::content:spaces/${entry.sys.space.sys.id}/entries/${entry.sys.id}`
17
+ }
18
+ });
19
+ const getUpdatedValue = (field, entries, apiUrl)=>{
20
+ const multiple = field.type === 'Array';
21
+ if (multiple) {
22
+ const linkItems = entries.map((entry)=>toLinkItem(entry, apiUrl));
23
+ const prevValue = field.getValue() || [];
24
+ return [
25
+ ...prevValue,
26
+ ...linkItems
27
+ ];
28
+ } else {
29
+ return toLinkItem(entries[0], apiUrl);
30
+ }
31
+ };
32
+ function useResourceLinkActions({ dialogs , field , onAfterLink , apiUrl }) {
33
+ const handleAfterLink = (0, _react.useCallback)((entries)=>{
34
+ if (!onAfterLink) {
35
+ return;
36
+ }
37
+ entries.forEach(onAfterLink);
38
+ }, [
39
+ onAfterLink
40
+ ]);
41
+ const onLinkedExisting = (0, _react.useMemo)(()=>{
42
+ return (entries)=>{
43
+ const updatedValue = getUpdatedValue(field, entries, apiUrl);
44
+ field.setValue(updatedValue);
45
+ handleAfterLink(entries);
46
+ };
47
+ }, [
48
+ field,
49
+ handleAfterLink,
50
+ apiUrl
51
+ ]);
52
+ const multiple = field.type === 'Array';
53
+ const onLinkExisting = (0, _react.useMemo)(()=>{
54
+ const promptSelection = multiple ? async ()=>await dialogs.selectMultipleResourceEntries({
55
+ allowedResources: field.allowedResources
56
+ }) : async ()=>[
57
+ await dialogs.selectSingleResourceEntry({
58
+ allowedResources: field.allowedResources
59
+ })
60
+ ];
61
+ return async ()=>{
62
+ const res = await promptSelection();
63
+ if (!res) {
64
+ return;
65
+ }
66
+ onLinkedExisting(res);
67
+ };
68
+ }, [
69
+ dialogs,
70
+ field.allowedResources,
71
+ multiple,
72
+ onLinkedExisting
73
+ ]);
74
+ return {
75
+ onLinkExisting,
76
+ onLinkedExisting,
77
+ entityType: 'Entry',
78
+ contentTypes: [],
79
+ canCreateEntity: false,
80
+ canLinkMultiple: multiple,
81
+ canLinkEntity: true,
82
+ isDisabled: false,
83
+ isEmpty: false,
84
+ isFull: false,
85
+ onCreate: async ()=>{},
86
+ onCreated: ()=>{}
87
+ };
88
+ }
@@ -0,0 +1,22 @@
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
+ Entry: function() {
13
+ return _fieldeditorshared.Entry;
14
+ },
15
+ File: function() {
16
+ return _fieldeditorshared.File;
17
+ },
18
+ Asset: function() {
19
+ return _fieldeditorshared.Asset;
20
+ }
21
+ });
22
+ const _fieldeditorshared = require("@contentful/field-editor-shared");
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "fromFieldValidations", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return fromFieldValidations;
9
+ }
10
+ });
11
+ const _isNumber = _interop_require_default(require("lodash/isNumber"));
12
+ function _interop_require_default(obj) {
13
+ return obj && obj.__esModule ? obj : {
14
+ default: obj
15
+ };
16
+ }
17
+ function fromFieldValidations(field) {
18
+ const validations = [
19
+ ...field.validations,
20
+ ...field.items?.validations ?? []
21
+ ];
22
+ const linkContentTypeValidations = validations.find((v)=>'linkContentType' in v);
23
+ const linkMimetypeGroupValidations = validations.find((v)=>'linkMimetypeGroup' in v);
24
+ const sizeValidations = validations.find((v)=>'size' in v);
25
+ const size = sizeValidations && sizeValidations.size || {};
26
+ const min = size.min;
27
+ const max = size.max;
28
+ let numberOfLinks = undefined;
29
+ if ((0, _isNumber.default)(min) && (0, _isNumber.default)(max)) {
30
+ numberOfLinks = {
31
+ type: 'min-max',
32
+ min,
33
+ max
34
+ };
35
+ } else if ((0, _isNumber.default)(min)) {
36
+ numberOfLinks = {
37
+ type: 'min',
38
+ min,
39
+ max: undefined
40
+ };
41
+ } else if ((0, _isNumber.default)(max)) {
42
+ numberOfLinks = {
43
+ type: 'max',
44
+ max,
45
+ min: undefined
46
+ };
47
+ }
48
+ const result = {
49
+ contentTypes: linkContentTypeValidations?.linkContentType ?? undefined,
50
+ mimetypeGroups: linkMimetypeGroupValidations?.linkMimetypeGroup ?? undefined,
51
+ numberOfLinks
52
+ };
53
+ return result;
54
+ }
@@ -0,0 +1,173 @@
1
+ import { createFakeCMAAdapter, createFakeFieldAPI, createFakeLocalesAPI, createFakeSpaceAPI } from '@contentful/field-editor-test-utils';
2
+ import { assets, contentTypes, entries, locales as localesFixtures, spaces } from './fixtures';
3
+ const newLink = (linkType, id)=>({
4
+ sys: {
5
+ id,
6
+ linkType,
7
+ type: 'Link'
8
+ }
9
+ });
10
+ export function newReferenceEditorFakeSdk(props) {
11
+ const rawInitialValue = window.localStorage.getItem('initialValue');
12
+ const initialValue = rawInitialValue ? JSON.parse(rawInitialValue) : props?.initialValue;
13
+ const rawValidations = window.localStorage.getItem('fieldValidations');
14
+ const validations = rawValidations ? JSON.parse(rawValidations) : props?.validations;
15
+ const customizeMock = (field)=>{
16
+ return validations ? {
17
+ ...field,
18
+ validations
19
+ } : field;
20
+ };
21
+ const [field, mitt] = createFakeFieldAPI(customizeMock, initialValue);
22
+ const space = createFakeSpaceAPI();
23
+ const locales = createFakeLocalesAPI();
24
+ const entryLinks = [
25
+ newLink('Entry', entries.published.sys.id),
26
+ newLink('Entry', entries.changed.sys.id),
27
+ newLink('Entry', entries.empty.sys.id)
28
+ ];
29
+ const assetLinks = [
30
+ newLink('Asset', assets.published.sys.id),
31
+ newLink('Asset', assets.changed.sys.id),
32
+ newLink('Asset', assets.empty.sys.id)
33
+ ];
34
+ let selectorCounter = 0;
35
+ const delay = (ms)=>{
36
+ return new Promise((resolve)=>setTimeout(resolve, ms));
37
+ };
38
+ const localizeContentTypes = (contentTypes)=>{
39
+ return contentTypes.map((contentType)=>({
40
+ ...contentType,
41
+ fields: contentType.fields.map((field)=>({
42
+ ...field,
43
+ localized: true
44
+ }))
45
+ }));
46
+ };
47
+ const sdk = {
48
+ field,
49
+ locales,
50
+ cmaAdapter: createFakeCMAAdapter({
51
+ Entry: {
52
+ get: async ({ entryId })=>{
53
+ if (props?.fetchDelay) {
54
+ await delay(props.fetchDelay);
55
+ }
56
+ if (entryId === entries.empty.sys.id) {
57
+ return entries.empty;
58
+ }
59
+ if (entryId === entries.published.sys.id) {
60
+ return entries.published;
61
+ }
62
+ if (entryId === entries.changed.sys.id) {
63
+ return entries.changed;
64
+ }
65
+ return Promise.reject({});
66
+ }
67
+ },
68
+ Asset: {
69
+ get: async ({ assetId })=>{
70
+ if (props?.fetchDelay) {
71
+ await delay(props.fetchDelay);
72
+ }
73
+ if (assetId === assets.empty.sys.id) {
74
+ return assets.empty;
75
+ }
76
+ if (assetId === assets.published.sys.id) {
77
+ return assets.published;
78
+ }
79
+ if (assetId === assets.changed.sys.id) {
80
+ return assets.changed;
81
+ }
82
+ return Promise.reject({});
83
+ }
84
+ },
85
+ Space: {
86
+ get: async (params)=>{
87
+ if (params.spaceId === spaces.indifferent.sys.id) {
88
+ return spaces.indifferent;
89
+ }
90
+ return Promise.reject({});
91
+ }
92
+ },
93
+ ContentType: {
94
+ get: async ({ contentTypeId })=>{
95
+ if (contentTypeId === contentTypes.published.sys.id) {
96
+ return contentTypes.published;
97
+ }
98
+ return Promise.reject({});
99
+ }
100
+ },
101
+ Locale: {
102
+ getMany: async ()=>localesFixtures.list
103
+ }
104
+ }),
105
+ space: {
106
+ ...space,
107
+ getCachedContentTypes () {
108
+ return localizeContentTypes(space.getCachedContentTypes());
109
+ },
110
+ getContentTypes () {
111
+ return Promise.resolve(space.getContentTypes().then((response)=>{
112
+ return {
113
+ ...response,
114
+ items: localizeContentTypes(response.items)
115
+ };
116
+ }));
117
+ },
118
+ async getEntityScheduledActions () {
119
+ return [];
120
+ }
121
+ },
122
+ dialogs: {
123
+ selectSingleAsset: async ()=>{
124
+ selectorCounter++;
125
+ return assetLinks[selectorCounter % assetLinks.length];
126
+ },
127
+ selectMultipleAssets: async ()=>{
128
+ selectorCounter++;
129
+ return selectorCounter % 2 ? assetLinks.slice(0, 2) : [
130
+ assetLinks[2]
131
+ ];
132
+ },
133
+ selectSingleEntry: async ()=>{
134
+ selectorCounter++;
135
+ return entryLinks[selectorCounter % entryLinks.length];
136
+ },
137
+ selectMultipleEntries: async ()=>{
138
+ selectorCounter++;
139
+ return selectorCounter % 2 ? entryLinks.slice(0, 2) : [
140
+ entryLinks[2]
141
+ ];
142
+ }
143
+ },
144
+ navigator: {
145
+ openNewAsset: async ()=>({
146
+ entity: newLink('Asset', assets.empty.sys.id)
147
+ }),
148
+ openAsset: async ()=>{
149
+ alert('open Asset in slide in');
150
+ return {};
151
+ },
152
+ openNewEntry: async ()=>({
153
+ entity: newLink('Entry', entries.empty.sys.id)
154
+ }),
155
+ openEntry: async ()=>{
156
+ alert('open entry in slide in');
157
+ return {};
158
+ },
159
+ onSlideInNavigation: ()=>()=>({})
160
+ },
161
+ access: {
162
+ can: async ()=>true
163
+ },
164
+ ids: {
165
+ space: 'space-id',
166
+ environment: 'environment-id'
167
+ }
168
+ };
169
+ return [
170
+ sdk,
171
+ mitt
172
+ ];
173
+ }
@@ -0,0 +1,6 @@
1
+ import changed from './changed_asset.json';
2
+ import created from './created_asset.json';
3
+ import empty from './empty_asset.json';
4
+ import invalid from './invalid_asset.json';
5
+ import published from './published_asset.json';
6
+ export { changed, empty, published, invalid, created };
@@ -0,0 +1,2 @@
1
+ import published from './published_content_type.json';
2
+ export { published };
@@ -0,0 +1,5 @@
1
+ import changed from './changed_entry.json';
2
+ import empty from './empty_entry.json';
3
+ import invalid from './invalid_entry.json';
4
+ import published from './published_entry.json';
5
+ export { changed, empty, published, invalid };
@@ -0,0 +1,6 @@
1
+ import * as assets from './asset';
2
+ import * as contentTypes from './content-type';
3
+ import * as entries from './entry';
4
+ import * as locales from './locale';
5
+ import * as spaces from './space';
6
+ export { assets, contentTypes, entries, locales, spaces };
@@ -0,0 +1,15 @@
1
+ import englishDefault from './english_default_locale.json';
2
+ import german from './german_locale.json';
3
+ const list = {
4
+ sys: {
5
+ type: 'Array'
6
+ },
7
+ total: 2,
8
+ skip: 0,
9
+ limit: 100,
10
+ items: [
11
+ englishDefault,
12
+ german
13
+ ]
14
+ };
15
+ export { englishDefault, german, list };
@@ -0,0 +1,2 @@
1
+ import indifferent from './indifferent_space.json';
2
+ export { indifferent };
@@ -0,0 +1,37 @@
1
+ import * as React from 'react';
2
+ import { css, cx } from 'emotion';
3
+ import { MultipleReferenceEditor } from '../common/MultipleReferenceEditor';
4
+ import { SortableLinkList } from '../common/SortableLinkList';
5
+ import { FetchingWrappedAssetCard } from './WrappedAssetCard/FetchingWrappedAssetCard';
6
+ const styles = {
7
+ gridContainer: css({
8
+ position: 'relative',
9
+ display: 'flex',
10
+ flexWrap: 'wrap'
11
+ })
12
+ };
13
+ export function MultipleMediaEditor(props) {
14
+ return React.createElement(MultipleReferenceEditor, {
15
+ ...props,
16
+ entityType: "Asset"
17
+ }, (childrenProps)=>React.createElement(SortableLinkList, {
18
+ ...childrenProps,
19
+ className: cx({
20
+ [styles.gridContainer]: childrenProps.viewType === 'card'
21
+ }),
22
+ axis: childrenProps.viewType === 'card' ? 'xy' : 'y',
23
+ useDragHandle: true
24
+ }, ({ items , item , index , isDisabled , DragHandle })=>React.createElement(FetchingWrappedAssetCard, {
25
+ ...childrenProps,
26
+ isDisabled: isDisabled,
27
+ key: `${item.sys.id}-${index}`,
28
+ assetId: item.sys.id,
29
+ onRemove: ()=>{
30
+ childrenProps.setValue(items.filter((_value, i)=>i !== index));
31
+ },
32
+ renderDragHandle: DragHandle
33
+ })));
34
+ }
35
+ MultipleMediaEditor.defaultProps = {
36
+ isInitiallyDisabled: true
37
+ };
@@ -0,0 +1,20 @@
1
+ import * as React from 'react';
2
+ import { SingleReferenceEditor } from '../common/SingleReferenceEditor';
3
+ import { FetchingWrappedAssetCard } from './WrappedAssetCard/FetchingWrappedAssetCard';
4
+ export function SingleMediaEditor(props) {
5
+ return React.createElement(SingleReferenceEditor, {
6
+ ...props,
7
+ entityType: "Asset"
8
+ }, ({ entityId , isDisabled , setValue })=>React.createElement(FetchingWrappedAssetCard, {
9
+ ...props,
10
+ viewType: "big_card",
11
+ assetId: entityId,
12
+ isDisabled: isDisabled,
13
+ onRemove: ()=>{
14
+ setValue(null);
15
+ }
16
+ }));
17
+ }
18
+ SingleMediaEditor.defaultProps = {
19
+ isInitiallyDisabled: true
20
+ };
@@ -0,0 +1,63 @@
1
+ import * as React from 'react';
2
+ import { Menu, Text } from '@contentful/f36-components';
3
+ import { shortenStorageUnit } from '@contentful/field-editor-shared';
4
+ import get from 'lodash/get';
5
+ function downloadAsset(url) {
6
+ window.open(url, '_blank', 'noopener,noreferrer');
7
+ }
8
+ export function renderAssetInfo(props) {
9
+ const { entityFile } = props;
10
+ const fileName = get(entityFile, 'fileName');
11
+ const mimeType = get(entityFile, 'contentType');
12
+ const fileSize = get(entityFile, 'details.size');
13
+ const image = get(entityFile, 'details.image');
14
+ return [
15
+ React.createElement(Menu.SectionTitle, {
16
+ key: "file-section"
17
+ }, "File info"),
18
+ fileName && React.createElement(Menu.Item, {
19
+ key: "file-name"
20
+ }, React.createElement(Text, {
21
+ isTruncated: true
22
+ }, fileName)),
23
+ mimeType && React.createElement(Menu.Item, {
24
+ key: "file-type"
25
+ }, React.createElement(Text, {
26
+ isTruncated: true
27
+ }, mimeType)),
28
+ fileSize && React.createElement(Menu.Item, {
29
+ key: "file-size"
30
+ }, shortenStorageUnit(fileSize, 'B')),
31
+ image && React.createElement(Menu.Item, {
32
+ key: "file-dimentions"
33
+ }, `${image.width} × ${image.height}`)
34
+ ].filter((item)=>item);
35
+ }
36
+ export function renderActions(props) {
37
+ const { entityFile , isDisabled , onEdit , onRemove } = props;
38
+ return [
39
+ React.createElement(Menu.SectionTitle, {
40
+ key: "section-title"
41
+ }, "Actions"),
42
+ onEdit ? React.createElement(Menu.Item, {
43
+ key: "edit",
44
+ onClick: onEdit,
45
+ testId: "card-action-edit"
46
+ }, "Edit") : null,
47
+ entityFile ? React.createElement(Menu.Item, {
48
+ key: "download",
49
+ onClick: ()=>{
50
+ if (typeof entityFile.url === 'string') {
51
+ downloadAsset(entityFile.url);
52
+ }
53
+ },
54
+ testId: "card-action-download"
55
+ }, "Download") : null,
56
+ onRemove ? React.createElement(Menu.Item, {
57
+ key: "remove",
58
+ disabled: isDisabled,
59
+ onClick: onRemove,
60
+ testId: "card-action-remove"
61
+ }, "Remove") : null
62
+ ].filter((item)=>item);
63
+ }
@@ -0,0 +1,122 @@
1
+ import * as React from 'react';
2
+ import { AssetCard, EntryCard } from '@contentful/f36-components';
3
+ import { useEntity, useEntityLoader } from '../../common/EntityStore';
4
+ import { MissingEntityCard } from '../../components';
5
+ import { WrappedAssetCard } from './WrappedAssetCard';
6
+ import { WrappedAssetLink } from './WrappedAssetLink';
7
+ export function FetchingWrappedAssetCard(props) {
8
+ const { data: asset , status } = useEntity('Asset', props.assetId);
9
+ const { getEntityScheduledActions } = useEntityLoader();
10
+ const loadEntityScheduledActions = React.useCallback(()=>getEntityScheduledActions('Asset', props.assetId), [
11
+ getEntityScheduledActions,
12
+ props.assetId
13
+ ]);
14
+ React.useEffect(()=>{
15
+ if (asset) {
16
+ props.onAction && props.onAction({
17
+ type: 'rendered',
18
+ entity: 'Asset'
19
+ });
20
+ }
21
+ }, [
22
+ asset
23
+ ]);
24
+ const onEdit = async ()=>{
25
+ const { slide } = await props.sdk.navigator.openAsset(props.assetId, {
26
+ slideIn: true
27
+ });
28
+ props.onAction && props.onAction({
29
+ entity: 'Asset',
30
+ type: 'edit',
31
+ id: props.assetId,
32
+ contentTypeId: '',
33
+ slide
34
+ });
35
+ };
36
+ const onRemove = ()=>{
37
+ props.onRemove();
38
+ props.onAction && props.onAction({
39
+ entity: 'Asset',
40
+ type: 'delete',
41
+ id: props.assetId,
42
+ contentTypeId: ''
43
+ });
44
+ };
45
+ return React.useMemo(()=>{
46
+ if (status === 'error') {
47
+ const card = React.createElement(MissingEntityCard, {
48
+ entityType: "Asset",
49
+ asSquare: props.viewType !== 'link',
50
+ isDisabled: props.isDisabled,
51
+ onRemove: onRemove
52
+ });
53
+ if (props.renderCustomMissingEntityCard) {
54
+ return props.renderCustomMissingEntityCard({
55
+ defaultCard: card,
56
+ entity: {
57
+ id: props.assetId,
58
+ type: 'Asset'
59
+ }
60
+ });
61
+ }
62
+ return card;
63
+ }
64
+ const { getEntityUrl } = props;
65
+ const size = props.viewType === 'big_card' ? 'default' : 'small';
66
+ const commonProps = {
67
+ asset,
68
+ entityUrl: getEntityUrl && getEntityUrl(props.assetId),
69
+ size: size,
70
+ isDisabled: props.isDisabled,
71
+ localeCode: props.sdk.field.locale,
72
+ defaultLocaleCode: props.sdk.locales.default,
73
+ renderDragHandle: props.renderDragHandle,
74
+ onEdit,
75
+ onRemove
76
+ };
77
+ if (props.viewType === 'link') {
78
+ if (status === 'loading') {
79
+ return React.createElement(EntryCard, {
80
+ size: "small",
81
+ isLoading: true
82
+ });
83
+ }
84
+ return React.createElement(WrappedAssetLink, {
85
+ ...commonProps,
86
+ href: commonProps.entityUrl,
87
+ getEntityScheduledActions: loadEntityScheduledActions
88
+ });
89
+ }
90
+ if (status === 'loading') {
91
+ return React.createElement(AssetCard, {
92
+ size: size,
93
+ isLoading: true
94
+ });
95
+ }
96
+ function renderDefaultCard(props) {
97
+ const builtinCardProps = {
98
+ ...commonProps,
99
+ ...props,
100
+ getEntityScheduledActions: loadEntityScheduledActions,
101
+ asset: (props?.entity) || commonProps.asset,
102
+ getAssetUrl: getEntityUrl
103
+ };
104
+ return React.createElement(WrappedAssetCard, builtinCardProps);
105
+ }
106
+ if (props.renderCustomCard) {
107
+ const customProps = {
108
+ ...commonProps,
109
+ entity: commonProps.asset
110
+ };
111
+ const renderedCustomCard = props.renderCustomCard(customProps, {}, renderDefaultCard);
112
+ if (renderedCustomCard !== false) {
113
+ return renderedCustomCard;
114
+ }
115
+ }
116
+ return renderDefaultCard();
117
+ }, [
118
+ props,
119
+ status,
120
+ asset
121
+ ]);
122
+ }