@contentful/field-editor-reference 5.8.6 → 5.10.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} +9 -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 -854
  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 -4395
  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 -4369
  198. package/dist/field-editor-reference.esm.js.map +0 -1
  199. package/dist/index.js +0 -8
@@ -0,0 +1,297 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ const _react = _interop_require_wildcard(require("react"));
6
+ require("@testing-library/jest-dom/extend-expect");
7
+ const _react1 = require("@testing-library/react");
8
+ const _EntityStore = require("../common/EntityStore");
9
+ const _MultipleResourceReferenceEditor = require("./MultipleResourceReferenceEditor");
10
+ const _resourceEditorHelpers = require("./testHelpers/resourceEditorHelpers");
11
+ function _getRequireWildcardCache(nodeInterop) {
12
+ if (typeof WeakMap !== "function") return null;
13
+ var cacheBabelInterop = new WeakMap();
14
+ var cacheNodeInterop = new WeakMap();
15
+ return (_getRequireWildcardCache = function(nodeInterop) {
16
+ return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
17
+ })(nodeInterop);
18
+ }
19
+ function _interop_require_wildcard(obj, nodeInterop) {
20
+ if (!nodeInterop && obj && obj.__esModule) {
21
+ return obj;
22
+ }
23
+ if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
24
+ return {
25
+ default: obj
26
+ };
27
+ }
28
+ var cache = _getRequireWildcardCache(nodeInterop);
29
+ if (cache && cache.has(obj)) {
30
+ return cache.get(obj);
31
+ }
32
+ var newObj = {};
33
+ var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
34
+ for(var key in obj){
35
+ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
36
+ var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
37
+ if (desc && (desc.get || desc.set)) {
38
+ Object.defineProperty(newObj, key, desc);
39
+ } else {
40
+ newObj[key] = obj[key];
41
+ }
42
+ }
43
+ }
44
+ newObj.default = obj;
45
+ if (cache) {
46
+ cache.set(obj, newObj);
47
+ }
48
+ return newObj;
49
+ }
50
+ let mockedResources = {};
51
+ jest.mock('../common/EntityStore', ()=>{
52
+ const module = jest.requireActual('../common/EntityStore');
53
+ return {
54
+ ...module,
55
+ useResource: jest.fn((linkType, urn, apiUrl)=>({
56
+ data: mockedResources[`${linkType}.${urn}`],
57
+ status: 'success',
58
+ apiUrl
59
+ }))
60
+ };
61
+ });
62
+ jest.mock('react-intersection-observer', ()=>{
63
+ const module = jest.requireActual('react-intersection-observer');
64
+ return {
65
+ ...module,
66
+ useInView: ()=>({
67
+ inView: true
68
+ })
69
+ };
70
+ });
71
+ const fieldDefinition = {
72
+ type: 'Array',
73
+ items: {
74
+ type: 'ResourceLink'
75
+ },
76
+ id: 'foo',
77
+ name: 'Foo',
78
+ allowedResources: [
79
+ {
80
+ source: 'foo',
81
+ contentTypes: [
82
+ 'bar'
83
+ ]
84
+ }
85
+ ],
86
+ required: true,
87
+ validations: []
88
+ };
89
+ describe('Multiple resource editor', ()=>{
90
+ it('renders the action button when no value is set', async ()=>{
91
+ const sdk = (0, _resourceEditorHelpers.mockSdkForField)(fieldDefinition);
92
+ (0, _react1.render)(_react.createElement(_MultipleResourceReferenceEditor.MultipleResourceReferenceEditor, {
93
+ isInitiallyDisabled: false,
94
+ sdk: sdk,
95
+ hasCardEditActions: true,
96
+ viewType: "card",
97
+ parameters: {}
98
+ }));
99
+ const button = await _react1.screen.findByText('Add existing content');
100
+ expect(button).toBeDefined();
101
+ _react1.fireEvent.click(button);
102
+ const dialogFn = sdk.dialogs.selectMultipleResourceEntries;
103
+ expect(dialogFn).toHaveBeenCalledTimes(1);
104
+ const options = dialogFn.mock.calls[0][0];
105
+ expect(options).toEqual({
106
+ allowedResources: fieldDefinition.allowedResources
107
+ });
108
+ });
109
+ it('renders custom actions when passed', async ()=>{
110
+ const sdk = (0, _resourceEditorHelpers.mockSdkForField)(fieldDefinition);
111
+ (0, _react1.render)(_react.createElement(_MultipleResourceReferenceEditor.MultipleResourceReferenceEditor, {
112
+ isInitiallyDisabled: false,
113
+ sdk: sdk,
114
+ hasCardEditActions: true,
115
+ viewType: "card",
116
+ parameters: {},
117
+ renderCustomActions: ()=>_react.createElement("div", {
118
+ "data-testid": "custom-actions"
119
+ })
120
+ }));
121
+ const customActions = await _react1.screen.findByTestId('custom-actions');
122
+ expect(customActions).toBeDefined();
123
+ });
124
+ describe('with value', ()=>{
125
+ it('renders the cards', async ()=>{
126
+ const { entryLinks , entryInfos } = generateMultipleTestResources();
127
+ mockedResources = {};
128
+ for (const [spaceId, link] of Object.entries(entryLinks)){
129
+ mockedResources[`${link.sys.linkType}.${link.sys.urn}`] = entryInfos[spaceId];
130
+ }
131
+ const sdk = (0, _resourceEditorHelpers.mockSdkForField)(fieldDefinition, Object.values(entryLinks));
132
+ (0, _react1.render)(_react.createElement(_MultipleResourceReferenceEditor.MultipleResourceReferenceEditor, {
133
+ isInitiallyDisabled: false,
134
+ sdk: sdk,
135
+ hasCardEditActions: true,
136
+ viewType: "card",
137
+ apiUrl: "test-contentful",
138
+ getEntryRouteHref: ()=>'',
139
+ parameters: {}
140
+ }));
141
+ expect(_EntityStore.useResource).toHaveBeenCalledTimes(Object.values(entryInfos).length);
142
+ const cards = [];
143
+ const entriesArray = Object.values(entryInfos);
144
+ for (const info of Array.from(entriesArray.values())){
145
+ const entryTitle = info.resource.fields.title[info.defaultLocaleCode];
146
+ const spaceName = info.space.name;
147
+ const card = await expectEntryCard(entryTitle, spaceName);
148
+ cards.push(card);
149
+ }
150
+ });
151
+ describe('card actions', ()=>{
152
+ it('should have a move to top button', async ()=>{
153
+ const { entryLinks , entryInfos } = generateMultipleTestResources();
154
+ mockedResources = {};
155
+ for (const [spaceId, link] of Object.entries(entryLinks)){
156
+ mockedResources[`${link.sys.linkType}.${link.sys.urn}`] = entryInfos[spaceId];
157
+ }
158
+ const sdk = (0, _resourceEditorHelpers.mockSdkForField)(fieldDefinition, Object.values(entryLinks));
159
+ (0, _react1.render)(_react.createElement(_MultipleResourceReferenceEditor.MultipleResourceReferenceEditor, {
160
+ isInitiallyDisabled: false,
161
+ sdk: sdk,
162
+ hasCardEditActions: true,
163
+ viewType: "card",
164
+ apiUrl: "test-contentful",
165
+ getEntryRouteHref: ()=>'',
166
+ parameters: {}
167
+ }));
168
+ const linkExistingBtn = _react1.screen.queryByText('Add existing content');
169
+ expect(linkExistingBtn).toBeInTheDocument();
170
+ const entriesArray = Object.values(entryInfos);
171
+ const firstItem = entriesArray[0];
172
+ await expectToNotHaveMoveButton(firstItem, 'Move to top');
173
+ const allButFirst = entriesArray.slice(1);
174
+ for (const info of allButFirst){
175
+ await expectToHaveMoveButton(info, 'Move to top');
176
+ }
177
+ });
178
+ it('should have a move to bottom button', async ()=>{
179
+ const { entryLinks , entryInfos } = generateMultipleTestResources();
180
+ mockedResources = {};
181
+ for (const [spaceId, link] of Object.entries(entryLinks)){
182
+ mockedResources[`${link.sys.linkType}.${link.sys.urn}`] = entryInfos[spaceId];
183
+ }
184
+ const sdk = (0, _resourceEditorHelpers.mockSdkForField)(fieldDefinition, Object.values(entryLinks));
185
+ (0, _react1.render)(_react.createElement(_MultipleResourceReferenceEditor.MultipleResourceReferenceEditor, {
186
+ isInitiallyDisabled: false,
187
+ sdk: sdk,
188
+ hasCardEditActions: true,
189
+ viewType: "card",
190
+ apiUrl: "test-contentful",
191
+ getEntryRouteHref: ()=>'',
192
+ parameters: {}
193
+ }));
194
+ const linkExistingBtn = _react1.screen.queryByText('Add existing content');
195
+ expect(linkExistingBtn).toBeInTheDocument();
196
+ const entriesArray = Object.values(entryInfos);
197
+ const lastItem = entriesArray[entriesArray.length - 1];
198
+ await expectToNotHaveMoveButton(lastItem, 'Move to bottom');
199
+ const allButLast = entriesArray.slice(0, -1);
200
+ for (const info of allButLast){
201
+ await expectToHaveMoveButton(info, 'Move to bottom');
202
+ }
203
+ });
204
+ it('works when using remove action', async ()=>{
205
+ const { entryLinks , entryInfos } = generateMultipleTestResources();
206
+ mockedResources = {};
207
+ for (const [spaceId, link] of Object.entries(entryLinks)){
208
+ mockedResources[`${link.sys.linkType}.${link.sys.urn}`] = entryInfos[spaceId];
209
+ }
210
+ const sdk = (0, _resourceEditorHelpers.mockSdkForField)(fieldDefinition, Object.values(entryLinks));
211
+ (0, _react1.render)(_react.createElement(_MultipleResourceReferenceEditor.MultipleResourceReferenceEditor, {
212
+ isInitiallyDisabled: false,
213
+ sdk: sdk,
214
+ hasCardEditActions: true,
215
+ viewType: "card",
216
+ apiUrl: "test-contentful",
217
+ getEntryRouteHref: ()=>'',
218
+ parameters: {}
219
+ }));
220
+ const linkExistingBtn = _react1.screen.queryByText('Add existing content');
221
+ expect(linkExistingBtn).toBeInTheDocument();
222
+ const entriesArray = Object.values(entryInfos);
223
+ for (const info of entriesArray){
224
+ await clickCardActionsButton(info);
225
+ const removeBtn = await _react1.screen.findByText('Remove', {
226
+ selector: '[role="menuitem"]'
227
+ });
228
+ _react1.fireEvent.click(removeBtn);
229
+ }
230
+ expect(sdk.field.setValue).toHaveBeenCalledTimes(3);
231
+ expect(sdk.field.setValue).toHaveBeenCalledWith([]);
232
+ });
233
+ });
234
+ });
235
+ });
236
+ async function expectToHaveMoveButton(info, buttonString) {
237
+ await clickCardActionsButton(info);
238
+ await _react1.screen.findByText(buttonString, {
239
+ selector: '[role="menuitem"]'
240
+ });
241
+ }
242
+ async function expectToNotHaveMoveButton(info, buttonString) {
243
+ await clickCardActionsButton(info);
244
+ expect(_react1.screen.queryByText(buttonString, {
245
+ selector: '[role="menuitem"]'
246
+ })).toBeNull();
247
+ }
248
+ async function clickCardActionsButton(info) {
249
+ _react1.fireEvent.click(document.body);
250
+ const entryTitle = info.resource.fields.title[info.defaultLocaleCode];
251
+ const spaceName = info.space.name;
252
+ const card = await expectEntryCard(entryTitle, spaceName);
253
+ const actionsBtn = card.querySelector('[data-test-id="cf-ui-card-actions"]');
254
+ expect(actionsBtn).toBeInTheDocument();
255
+ _react1.fireEvent.click(actionsBtn);
256
+ }
257
+ async function expectEntryCard(entryTitle, spaceName) {
258
+ const title = await _react1.screen.findByText(entryTitle);
259
+ await _react1.screen.findByText(spaceName);
260
+ const theCard = title.closest('[data-test-id="cf-ui-entry-card"]');
261
+ expect(theCard).toBeDefined();
262
+ const actionsBtn = theCard?.querySelector('[data-test-id="cf-ui-card-actions"]');
263
+ expect(actionsBtn).toBeDefined();
264
+ return theCard;
265
+ }
266
+ function generateMultipleTestResources() {
267
+ return [
268
+ 'Space A',
269
+ 'Space B',
270
+ 'Space C'
271
+ ].reduce((acc, spaceName)=>{
272
+ const spaceId = spaceName.toLowerCase().replace(' ', '-');
273
+ const entryInfo = {
274
+ title: `An entry in ${spaceName}`,
275
+ id: `linkedEntryId`
276
+ };
277
+ acc.entryLinks[spaceId] = {
278
+ sys: {
279
+ type: 'ResourceLink',
280
+ linkType: 'Contentful:Entry',
281
+ urn: `crn:test:::content:spaces/${spaceId}/entries/${entryInfo.id}`
282
+ }
283
+ };
284
+ acc.entryInfos[spaceId] = (0, _resourceEditorHelpers.createFakeEntryResource)({
285
+ title: entryInfo.title,
286
+ id: entryInfo.id,
287
+ space: {
288
+ id: spaceId,
289
+ name: spaceName
290
+ }
291
+ });
292
+ return acc;
293
+ }, {
294
+ entryLinks: {},
295
+ entryInfos: {}
296
+ });
297
+ }
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "SingleResourceReferenceEditor", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return SingleResourceReferenceEditor;
9
+ }
10
+ });
11
+ const _react = _interop_require_wildcard(require("react"));
12
+ const _fieldeditorshared = require("@contentful/field-editor-shared");
13
+ const _deepequal = _interop_require_default(require("deep-equal"));
14
+ const _EntityStore = require("../common/EntityStore");
15
+ const _LinkEntityActions = require("../components/LinkActions/LinkEntityActions");
16
+ const _ResourceCard = require("./Cards/ResourceCard");
17
+ const _useResourceLinkActions = require("./useResourceLinkActions");
18
+ function _interop_require_default(obj) {
19
+ return obj && obj.__esModule ? obj : {
20
+ default: obj
21
+ };
22
+ }
23
+ function _getRequireWildcardCache(nodeInterop) {
24
+ if (typeof WeakMap !== "function") return null;
25
+ var cacheBabelInterop = new WeakMap();
26
+ var cacheNodeInterop = new WeakMap();
27
+ return (_getRequireWildcardCache = function(nodeInterop) {
28
+ return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
29
+ })(nodeInterop);
30
+ }
31
+ function _interop_require_wildcard(obj, nodeInterop) {
32
+ if (!nodeInterop && obj && obj.__esModule) {
33
+ return obj;
34
+ }
35
+ if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
36
+ return {
37
+ default: obj
38
+ };
39
+ }
40
+ var cache = _getRequireWildcardCache(nodeInterop);
41
+ if (cache && cache.has(obj)) {
42
+ return cache.get(obj);
43
+ }
44
+ var newObj = {};
45
+ var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
46
+ for(var key in obj){
47
+ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
48
+ var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
49
+ if (desc && (desc.get || desc.set)) {
50
+ Object.defineProperty(newObj, key, desc);
51
+ } else {
52
+ newObj[key] = obj[key];
53
+ }
54
+ }
55
+ }
56
+ newObj.default = obj;
57
+ if (cache) {
58
+ cache.set(obj, newObj);
59
+ }
60
+ return newObj;
61
+ }
62
+ function SingleResourceReferenceEditor(props) {
63
+ const { dialogs , field } = props.sdk;
64
+ const linkActionsProps = (0, _useResourceLinkActions.useResourceLinkActions)({
65
+ dialogs,
66
+ field,
67
+ apiUrl: props.apiUrl
68
+ });
69
+ return _react.createElement(_EntityStore.EntityProvider, {
70
+ sdk: props.sdk
71
+ }, _react.createElement(_fieldeditorshared.FieldConnector, {
72
+ throttle: 0,
73
+ field: props.sdk.field,
74
+ isInitiallyDisabled: props.isInitiallyDisabled,
75
+ isEqualValues: _deepequal.default
76
+ }, ({ value , disabled })=>{
77
+ return value ? _react.createElement(_ResourceCard.ResourceCard, {
78
+ onRemove: ()=>props.sdk.field.removeValue(),
79
+ resourceLink: value,
80
+ isDisabled: disabled,
81
+ getEntryRouteHref: props.getEntryRouteHref
82
+ }) : _react.createElement(_LinkEntityActions.CombinedLinkEntityActions, {
83
+ ...linkActionsProps,
84
+ renderCustomActions: props.renderCustomActions
85
+ });
86
+ }));
87
+ }
@@ -0,0 +1,161 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ const _react = _interop_require_wildcard(require("react"));
6
+ require("@testing-library/jest-dom/extend-expect");
7
+ const _react1 = require("@testing-library/react");
8
+ const _EntityStore = require("../common/EntityStore");
9
+ const _SingleResourceReferenceEditor = require("./SingleResourceReferenceEditor");
10
+ const _resourceEditorHelpers = require("./testHelpers/resourceEditorHelpers");
11
+ function _getRequireWildcardCache(nodeInterop) {
12
+ if (typeof WeakMap !== "function") return null;
13
+ var cacheBabelInterop = new WeakMap();
14
+ var cacheNodeInterop = new WeakMap();
15
+ return (_getRequireWildcardCache = function(nodeInterop) {
16
+ return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
17
+ })(nodeInterop);
18
+ }
19
+ function _interop_require_wildcard(obj, nodeInterop) {
20
+ if (!nodeInterop && obj && obj.__esModule) {
21
+ return obj;
22
+ }
23
+ if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
24
+ return {
25
+ default: obj
26
+ };
27
+ }
28
+ var cache = _getRequireWildcardCache(nodeInterop);
29
+ if (cache && cache.has(obj)) {
30
+ return cache.get(obj);
31
+ }
32
+ var newObj = {};
33
+ var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
34
+ for(var key in obj){
35
+ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
36
+ var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
37
+ if (desc && (desc.get || desc.set)) {
38
+ Object.defineProperty(newObj, key, desc);
39
+ } else {
40
+ newObj[key] = obj[key];
41
+ }
42
+ }
43
+ }
44
+ newObj.default = obj;
45
+ if (cache) {
46
+ cache.set(obj, newObj);
47
+ }
48
+ return newObj;
49
+ }
50
+ const mockedResources = {};
51
+ jest.mock('../common/EntityStore', ()=>{
52
+ const module = jest.requireActual('../common/EntityStore');
53
+ return {
54
+ ...module,
55
+ useResource: jest.fn((linkType, urn)=>({
56
+ data: mockedResources[`${linkType}.${urn}`],
57
+ status: 'success'
58
+ }))
59
+ };
60
+ });
61
+ jest.mock('react-intersection-observer', ()=>{
62
+ const module = jest.requireActual('react-intersection-observer');
63
+ return {
64
+ ...module,
65
+ useInView: ()=>({
66
+ inView: true
67
+ })
68
+ };
69
+ });
70
+ const fieldDefinition = {
71
+ type: 'ResourceLink',
72
+ id: 'foo',
73
+ name: 'Foo',
74
+ allowedResources: [
75
+ {
76
+ source: 'foo',
77
+ contentTypes: [
78
+ 'bar'
79
+ ]
80
+ }
81
+ ],
82
+ required: true,
83
+ validations: []
84
+ };
85
+ describe('Single resource editor', ()=>{
86
+ it('renders the action button when no value is set', async ()=>{
87
+ const sdk = (0, _resourceEditorHelpers.mockSdkForField)(fieldDefinition);
88
+ (0, _react1.render)(_react.createElement(_SingleResourceReferenceEditor.SingleResourceReferenceEditor, {
89
+ isInitiallyDisabled: false,
90
+ sdk: sdk,
91
+ hasCardEditActions: true,
92
+ viewType: "card",
93
+ parameters: {}
94
+ }));
95
+ const button = await _react1.screen.findByText('Add existing content');
96
+ expect(button).toBeDefined();
97
+ _react1.fireEvent.click(button);
98
+ const dialogFn = sdk.dialogs.selectSingleResourceEntry;
99
+ expect(dialogFn).toHaveBeenCalledTimes(1);
100
+ const options = dialogFn.mock.calls[0][0];
101
+ expect(options).toEqual({
102
+ allowedResources: fieldDefinition.allowedResources
103
+ });
104
+ });
105
+ it('renders custom actions when passed', async ()=>{
106
+ const sdk = (0, _resourceEditorHelpers.mockSdkForField)(fieldDefinition);
107
+ (0, _react1.render)(_react.createElement(_SingleResourceReferenceEditor.SingleResourceReferenceEditor, {
108
+ isInitiallyDisabled: false,
109
+ sdk: sdk,
110
+ hasCardEditActions: true,
111
+ viewType: "card",
112
+ parameters: {},
113
+ renderCustomActions: ()=>_react.createElement("div", {
114
+ "data-testid": "custom-actions"
115
+ })
116
+ }));
117
+ const customActions = await _react1.screen.findByTestId('custom-actions');
118
+ expect(customActions).toBeDefined();
119
+ });
120
+ it('renders the card button when the value is set', async ()=>{
121
+ const sdk = (0, _resourceEditorHelpers.mockSdkForField)(fieldDefinition, {
122
+ sys: {
123
+ type: 'Link',
124
+ linkType: 'Contentful:Entry',
125
+ urn: 'crn:test:::content:spaces/x-space/entries/linkedEntryId'
126
+ }
127
+ });
128
+ const info = (0, _resourceEditorHelpers.createFakeEntryResource)({
129
+ title: 'Title of linked entry',
130
+ id: 'linkedEntryId',
131
+ space: {
132
+ id: 'x-space',
133
+ name: 'X Space'
134
+ }
135
+ });
136
+ mockedResources[`Contentful:Entry.crn:test:::content:spaces/x-space/entries/linkedEntryId`] = info;
137
+ (0, _react1.render)(_react.createElement(_SingleResourceReferenceEditor.SingleResourceReferenceEditor, {
138
+ isInitiallyDisabled: false,
139
+ sdk: sdk,
140
+ hasCardEditActions: true,
141
+ viewType: "card",
142
+ apiUrl: "test-contentful",
143
+ getEntryRouteHref: jest.fn(),
144
+ parameters: {}
145
+ }));
146
+ expect(_EntityStore.useResource).toHaveBeenCalled();
147
+ const title = await _react1.screen.findByText('Title of linked entry');
148
+ await _react1.screen.findByText('X Space');
149
+ const theCard = title.closest('[data-test-id="cf-ui-entry-card"]');
150
+ const actionsBtn = theCard?.querySelector('[data-test-id="cf-ui-card-actions"]');
151
+ expect(actionsBtn).toBeDefined();
152
+ _react1.fireEvent.click(actionsBtn);
153
+ const removeBtn = await _react1.screen.findByText('Remove', {
154
+ selector: '[role="menuitem"]'
155
+ });
156
+ _react1.fireEvent.click(removeBtn);
157
+ expect(sdk.field.removeValue).toHaveBeenCalledWith();
158
+ const linkExistingBtn = _react1.screen.queryByText('Add existing content');
159
+ expect(linkExistingBtn).not.toBeInTheDocument();
160
+ });
161
+ });
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ _export_star(require("./MultipleResourceReferenceEditor"), exports);
6
+ _export_star(require("./SingleResourceReferenceEditor"), exports);
7
+ function _export_star(from, to) {
8
+ Object.keys(from).forEach(function(k) {
9
+ if (k !== "default" && !Object.prototype.hasOwnProperty.call(to, k)) {
10
+ Object.defineProperty(to, k, {
11
+ enumerable: true,
12
+ get: function() {
13
+ return from[k];
14
+ }
15
+ });
16
+ }
17
+ });
18
+ return from;
19
+ }
@@ -0,0 +1,121 @@
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
+ mockSdkForField: function() {
13
+ return mockSdkForField;
14
+ },
15
+ createFakeEntryResource: function() {
16
+ return createFakeEntryResource;
17
+ }
18
+ });
19
+ function mockSdkForField(fieldDefinition, fieldValue) {
20
+ return {
21
+ field: {
22
+ getValue: jest.fn(()=>fieldValue),
23
+ setValue: jest.fn(()=>Promise.resolve(undefined)),
24
+ removeValue: jest.fn(),
25
+ onSchemaErrorsChanged: ()=>{},
26
+ onIsDisabledChanged: ()=>{},
27
+ onValueChanged: ()=>{},
28
+ ...fieldDefinition,
29
+ locale: 'en'
30
+ },
31
+ dialogs: {
32
+ selectSingleResourceEntry: jest.fn().mockResolvedValue({
33
+ sys: {
34
+ type: 'Entry',
35
+ id: 'linkedEntryId',
36
+ space: {
37
+ sys: {
38
+ type: 'Link',
39
+ linkType: 'Space',
40
+ id: 'x-space'
41
+ }
42
+ }
43
+ }
44
+ }),
45
+ selectMultipleResourceEntries: jest.fn().mockResolvedValue([
46
+ {
47
+ sys: {
48
+ type: 'Entry',
49
+ id: 'linkedEntryId',
50
+ space: {
51
+ sys: {
52
+ type: 'Link',
53
+ linkType: 'Space',
54
+ id: 'x-space'
55
+ }
56
+ }
57
+ }
58
+ }
59
+ ])
60
+ },
61
+ ids: {
62
+ space: 'myTestSpace',
63
+ environment: 'master',
64
+ organization: 'acme',
65
+ user: 'norris_chuck',
66
+ field: fieldDefinition.id,
67
+ entry: 'testEntry',
68
+ contentType: 'testCT'
69
+ },
70
+ space: {
71
+ onEntityChanged: ()=>{}
72
+ },
73
+ navigator: {
74
+ onSlideInNavigation: ()=>()=>({})
75
+ }
76
+ };
77
+ }
78
+ const createFakeEntryResource = ({ title , id , space })=>{
79
+ const { id: spaceId , name: spaceName } = space;
80
+ return {
81
+ resource: {
82
+ sys: {
83
+ id,
84
+ type: 'Entry',
85
+ space: {
86
+ sys: {
87
+ id: spaceId
88
+ }
89
+ },
90
+ environment: {
91
+ sys: {
92
+ id: `${spaceId}-environment`
93
+ }
94
+ }
95
+ },
96
+ fields: {
97
+ title: {
98
+ en: title
99
+ }
100
+ }
101
+ },
102
+ contentType: {
103
+ sys: {
104
+ id: 'xTestCT'
105
+ },
106
+ displayField: 'title',
107
+ fields: [
108
+ {
109
+ type: 'Symbol',
110
+ id: 'title',
111
+ name: 'The title'
112
+ }
113
+ ]
114
+ },
115
+ localeCode: 'en',
116
+ defaultLocaleCode: 'en',
117
+ space: {
118
+ name: spaceName
119
+ }
120
+ };
121
+ };