@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,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "CreateEntryLinkButton", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return CreateEntryLinkButton;
9
+ }
10
+ });
11
+ const _react = _interop_require_wildcard(require("react"));
12
+ const _f36components = require("@contentful/f36-components");
13
+ const _f36icons = require("@contentful/f36-icons");
14
+ const _f36tokens = _interop_require_default(require("@contentful/f36-tokens"));
15
+ const _emotion = require("emotion");
16
+ const _get = _interop_require_default(require("lodash/get"));
17
+ const _CreateEntryMenuTrigger = require("./CreateEntryMenuTrigger");
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
+ const standardStyles = {
63
+ spinnerMargin: (0, _emotion.css)({
64
+ marginRight: _f36tokens.default.spacingXs
65
+ }),
66
+ action: undefined
67
+ };
68
+ const redesignStyles = {
69
+ ...standardStyles,
70
+ action: (0, _emotion.css)({
71
+ textDecoration: 'none',
72
+ fontWeight: 'bold',
73
+ maxWidth: '300px'
74
+ })
75
+ };
76
+ const CreateEntryLinkButton = ({ contentTypes , onSelect , customDropdownItems , text , testId , hasPlusIcon =false , useExperimentalStyles , suggestedContentTypeId , dropdownSettings , disabled =false })=>{
77
+ contentTypes = contentTypes.sort((a, b)=>a.name.localeCompare(b.name));
78
+ const suggestedContentType = contentTypes.find((ct)=>ct.sys.id === suggestedContentTypeId);
79
+ const buttonText = text || `Add ${(0, _get.default)(suggestedContentType || (contentTypes.length === 1 ? contentTypes[0] : {}), 'name', 'entry')}`;
80
+ const hasDropdown = contentTypes.length > 1 || customDropdownItems;
81
+ const plusIcon = hasPlusIcon ? _react.createElement(_f36icons.PlusIcon, null) : undefined;
82
+ const contentTypesLabel = useExperimentalStyles ? 'New content' : undefined;
83
+ const styles = useExperimentalStyles ? redesignStyles : standardStyles;
84
+ return _react.createElement(_CreateEntryMenuTrigger.CreateEntryMenuTrigger, {
85
+ contentTypes: contentTypes,
86
+ suggestedContentTypeId: suggestedContentTypeId,
87
+ contentTypesLabel: contentTypesLabel,
88
+ onSelect: onSelect,
89
+ testId: testId,
90
+ dropdownSettings: dropdownSettings,
91
+ customDropdownItems: customDropdownItems
92
+ }, ({ isSelecting })=>_react.createElement(_f36components.Button, {
93
+ endIcon: hasDropdown ? _react.createElement(_f36icons.ChevronDownIcon, null) : undefined,
94
+ variant: "secondary",
95
+ className: styles.action,
96
+ isDisabled: disabled || isSelecting,
97
+ startIcon: isSelecting ? undefined : plusIcon,
98
+ size: "small",
99
+ testId: "create-entry-link-button",
100
+ isLoading: isSelecting
101
+ }, buttonText));
102
+ };
@@ -0,0 +1,254 @@
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");
7
+ const _react1 = require("@testing-library/react");
8
+ const _noop = _interop_require_default(require("lodash/noop"));
9
+ const _CreateEntryLinkButton = require("./CreateEntryLinkButton");
10
+ function _interop_require_default(obj) {
11
+ return obj && obj.__esModule ? obj : {
12
+ default: obj
13
+ };
14
+ }
15
+ function _getRequireWildcardCache(nodeInterop) {
16
+ if (typeof WeakMap !== "function") return null;
17
+ var cacheBabelInterop = new WeakMap();
18
+ var cacheNodeInterop = new WeakMap();
19
+ return (_getRequireWildcardCache = function(nodeInterop) {
20
+ return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
21
+ })(nodeInterop);
22
+ }
23
+ function _interop_require_wildcard(obj, nodeInterop) {
24
+ if (!nodeInterop && obj && obj.__esModule) {
25
+ return obj;
26
+ }
27
+ if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
28
+ return {
29
+ default: obj
30
+ };
31
+ }
32
+ var cache = _getRequireWildcardCache(nodeInterop);
33
+ if (cache && cache.has(obj)) {
34
+ return cache.get(obj);
35
+ }
36
+ var newObj = {};
37
+ var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
38
+ for(var key in obj){
39
+ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
40
+ var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
41
+ if (desc && (desc.get || desc.set)) {
42
+ Object.defineProperty(newObj, key, desc);
43
+ } else {
44
+ newObj[key] = obj[key];
45
+ }
46
+ }
47
+ }
48
+ newObj.default = obj;
49
+ if (cache) {
50
+ cache.set(obj, newObj);
51
+ }
52
+ return newObj;
53
+ }
54
+ (0, _react1.configure)({
55
+ testIdAttribute: 'data-test-id'
56
+ });
57
+ const CONTENT_TYPE_1 = {
58
+ name: 'name-1',
59
+ sys: {
60
+ id: 'ID_1'
61
+ }
62
+ };
63
+ const CONTENT_TYPE_2 = {
64
+ name: 'name-2',
65
+ sys: {
66
+ id: 'ID_2'
67
+ }
68
+ };
69
+ const CONTENT_TYPE_3 = {
70
+ name: 'name-3',
71
+ sys: {
72
+ id: 'ID_3'
73
+ }
74
+ };
75
+ const findButton = (getByTestId)=>getByTestId('create-entry-link-button');
76
+ describe('CreateEntryLinkButton general', ()=>{
77
+ const props = {
78
+ contentTypes: [
79
+ CONTENT_TYPE_1,
80
+ CONTENT_TYPE_2,
81
+ CONTENT_TYPE_3
82
+ ],
83
+ onSelect: ()=>{
84
+ return Promise.resolve();
85
+ }
86
+ };
87
+ it('renders with multiple content types as list', ()=>{
88
+ const { getByTestId } = (0, _react1.render)(_react.createElement(_CreateEntryLinkButton.CreateEntryLinkButton, props));
89
+ expect(getByTestId('create-entry-button-menu-trigger')).toBeDefined();
90
+ const link = findButton(getByTestId);
91
+ expect(link).toBeDefined();
92
+ expect(link.textContent).toBe('Add entry');
93
+ });
94
+ it('renders dropdown menu on click when with multiple content types', ()=>{
95
+ const { getByTestId } = (0, _react1.render)(_react.createElement(_CreateEntryLinkButton.CreateEntryLinkButton, props));
96
+ _react1.fireEvent.click(findButton(getByTestId));
97
+ const menu = getByTestId('add-entry-menu');
98
+ expect(menu).toBeDefined();
99
+ const menuItems = menu.querySelectorAll('[data-test-id="contentType"]');
100
+ expect(menuItems).toHaveLength(props.contentTypes.length);
101
+ menuItems.forEach((item, index)=>expect(item.textContent).toBe(props.contentTypes[index].name));
102
+ });
103
+ it('renders suggestedContentType as text when given', ()=>{
104
+ const suggestedContentTypeId = 'ID_2';
105
+ const { getByTestId } = (0, _react1.render)(_react.createElement(_CreateEntryLinkButton.CreateEntryLinkButton, {
106
+ ...props,
107
+ suggestedContentTypeId: suggestedContentTypeId
108
+ }));
109
+ expect(getByTestId('create-entry-button-menu-trigger')).toBeDefined();
110
+ const button = findButton(getByTestId);
111
+ expect(button).toBeDefined();
112
+ expect(button.textContent).toBe(`Add ${CONTENT_TYPE_2.name}`);
113
+ });
114
+ it('renders the name of the content type as part of the text if only 1 content type is given', ()=>{
115
+ const { getByTestId } = (0, _react1.render)(_react.createElement(_CreateEntryLinkButton.CreateEntryLinkButton, {
116
+ onSelect: props.onSelect,
117
+ contentTypes: [
118
+ CONTENT_TYPE_1
119
+ ]
120
+ }));
121
+ expect(getByTestId('create-entry-button-menu-trigger')).toBeDefined();
122
+ const button = findButton(getByTestId);
123
+ expect(button).toBeDefined();
124
+ expect(button.textContent).toBe(`Add ${CONTENT_TYPE_1.name}`);
125
+ });
126
+ it('renders custom text, icon', ()=>{
127
+ const propsOverrides = {
128
+ text: 'CUSTOM_TEXT',
129
+ hasPlusIcon: true
130
+ };
131
+ const { getByTestId } = (0, _react1.render)(_react.createElement(_CreateEntryLinkButton.CreateEntryLinkButton, {
132
+ ...props,
133
+ ...propsOverrides
134
+ }));
135
+ const link = findButton(getByTestId);
136
+ expect(link.textContent).toBe(propsOverrides.text);
137
+ expect(link.querySelectorAll('svg')).toHaveLength(2);
138
+ });
139
+ });
140
+ describe('CreateEntryLinkButton with multiple entries', ()=>{
141
+ const props = {
142
+ contentTypes: [
143
+ CONTENT_TYPE_1,
144
+ CONTENT_TYPE_2,
145
+ CONTENT_TYPE_3
146
+ ],
147
+ onSelect: ()=>{
148
+ return Promise.resolve();
149
+ }
150
+ };
151
+ it('should render dropdown items for each content type', ()=>{
152
+ const { getByTestId , getAllByTestId } = (0, _react1.render)(_react.createElement(_CreateEntryLinkButton.CreateEntryLinkButton, props));
153
+ _react1.fireEvent.click(findButton(getByTestId));
154
+ expect(getAllByTestId('contentType')).toHaveLength(props.contentTypes.length);
155
+ });
156
+ it('calls onSelect after click on menu item', ()=>{
157
+ const selectSpy = jest.fn();
158
+ const { getByTestId , getAllByTestId } = (0, _react1.render)(_react.createElement(_CreateEntryLinkButton.CreateEntryLinkButton, {
159
+ ...props,
160
+ onSelect: selectSpy
161
+ }));
162
+ _react1.fireEvent.click(findButton(getByTestId));
163
+ _react1.fireEvent.click(getAllByTestId('contentType')[1]);
164
+ expect(selectSpy).toHaveBeenCalledWith(CONTENT_TYPE_2.sys.id);
165
+ });
166
+ });
167
+ describe('CreateEntryLinkButton with a single entry', ()=>{
168
+ const props = {
169
+ contentTypes: [
170
+ CONTENT_TYPE_1
171
+ ],
172
+ onSelect: ()=>{
173
+ return Promise.resolve();
174
+ }
175
+ };
176
+ it('should fire the onSelect function when clicked', ()=>{
177
+ const onSelectStub = jest.fn();
178
+ const { getByTestId } = (0, _react1.render)(_react.createElement(_CreateEntryLinkButton.CreateEntryLinkButton, {
179
+ ...props,
180
+ onSelect: onSelectStub
181
+ }));
182
+ _react1.fireEvent.click(findButton(getByTestId));
183
+ expect(onSelectStub).toHaveBeenCalledWith(props.contentTypes[0].sys.id);
184
+ expect(()=>getByTestId('cf-ui-spinner')).toThrow('Unable to find an element by: [data-test-id="cf-ui-spinner"]');
185
+ });
186
+ });
187
+ describe('CreateEntryLinkButton common', ()=>{
188
+ it('should render a spinner if onSelect returns a promise', async ()=>{
189
+ const onSelect = jest.fn(()=>new Promise((resolve)=>setTimeout(resolve, 1000)));
190
+ const { getByTestId , container } = (0, _react1.render)(_react.createElement(_CreateEntryLinkButton.CreateEntryLinkButton, {
191
+ contentTypes: [
192
+ CONTENT_TYPE_1
193
+ ],
194
+ onSelect: onSelect
195
+ }));
196
+ _react1.fireEvent.click(findButton(getByTestId));
197
+ expect(onSelect).toHaveBeenCalled();
198
+ const spinner = await (0, _react1.waitFor)(()=>getByTestId('cf-ui-spinner'), {
199
+ container
200
+ });
201
+ expect(spinner).toBeDefined();
202
+ expect(spinner.textContent).toMatch(/Loading/g);
203
+ });
204
+ it('should hide a spinner after the promise from onSelect resolves', async ()=>{
205
+ const onSelect = jest.fn(()=>new Promise((resolve)=>setTimeout(resolve, 500)));
206
+ const { getByTestId , container } = (0, _react1.render)(_react.createElement(_CreateEntryLinkButton.CreateEntryLinkButton, {
207
+ contentTypes: [
208
+ CONTENT_TYPE_1
209
+ ],
210
+ onSelect: onSelect
211
+ }));
212
+ _react1.fireEvent.click(findButton(getByTestId));
213
+ const getSpinner = ()=>getByTestId('cf-ui-spinner');
214
+ const spinner = await (0, _react1.waitFor)(getSpinner, {
215
+ container
216
+ });
217
+ expect(spinner).toBeDefined();
218
+ await (0, _react1.waitForElementToBeRemoved)(()=>document.querySelector('[data-test-id="cf-ui-spinner"]'));
219
+ expect(getSpinner).toThrow('Unable to find an element by: [data-test-id="cf-ui-spinner"]');
220
+ });
221
+ it('does not emit onSelect on subsequent click before the promise from onSelect resolves', async ()=>{
222
+ const onSelect = jest.fn(()=>new Promise((resolve)=>setTimeout(()=>resolve(undefined), 200)));
223
+ const { getByTestId } = (0, _react1.render)(_react.createElement(_CreateEntryLinkButton.CreateEntryLinkButton, {
224
+ contentTypes: [
225
+ CONTENT_TYPE_1
226
+ ],
227
+ onSelect: onSelect
228
+ }));
229
+ _react1.fireEvent.click(findButton(getByTestId));
230
+ _react1.fireEvent.click(findButton(getByTestId));
231
+ _react1.fireEvent.click(findButton(getByTestId));
232
+ await (0, _react1.waitFor)(_noop.default, {
233
+ timeout: 1000
234
+ });
235
+ expect(onSelect).toHaveBeenCalledTimes(1);
236
+ });
237
+ it('emits onSelect on subsequent click after the promise from onSelect resolves', async ()=>{
238
+ const onSelect = jest.fn(()=>Promise.resolve());
239
+ const { getByTestId } = (0, _react1.render)(_react.createElement(_CreateEntryLinkButton.CreateEntryLinkButton, {
240
+ contentTypes: [
241
+ CONTENT_TYPE_1
242
+ ],
243
+ onSelect: onSelect
244
+ }));
245
+ await (0, _react1.act)(async ()=>{
246
+ _react1.fireEvent.click(findButton(getByTestId));
247
+ await (0, _react1.waitFor)(_noop.default, {
248
+ timeout: 100
249
+ });
250
+ _react1.fireEvent.click(findButton(getByTestId));
251
+ });
252
+ expect(onSelect).toHaveBeenCalledTimes(2);
253
+ });
254
+ });
@@ -0,0 +1,199 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "CreateEntryMenuTrigger", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return CreateEntryMenuTrigger;
9
+ }
10
+ });
11
+ const _react = _interop_require_wildcard(require("react"));
12
+ const _f36components = require("@contentful/f36-components");
13
+ const _f36icons = require("@contentful/f36-icons");
14
+ const _f36tokens = _interop_require_default(require("@contentful/f36-tokens"));
15
+ const _emotion = require("emotion");
16
+ const _get = _interop_require_default(require("lodash/get"));
17
+ function _interop_require_default(obj) {
18
+ return obj && obj.__esModule ? obj : {
19
+ default: obj
20
+ };
21
+ }
22
+ function _getRequireWildcardCache(nodeInterop) {
23
+ if (typeof WeakMap !== "function") return null;
24
+ var cacheBabelInterop = new WeakMap();
25
+ var cacheNodeInterop = new WeakMap();
26
+ return (_getRequireWildcardCache = function(nodeInterop) {
27
+ return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
28
+ })(nodeInterop);
29
+ }
30
+ function _interop_require_wildcard(obj, nodeInterop) {
31
+ if (!nodeInterop && obj && obj.__esModule) {
32
+ return obj;
33
+ }
34
+ if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
35
+ return {
36
+ default: obj
37
+ };
38
+ }
39
+ var cache = _getRequireWildcardCache(nodeInterop);
40
+ if (cache && cache.has(obj)) {
41
+ return cache.get(obj);
42
+ }
43
+ var newObj = {};
44
+ var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
45
+ for(var key in obj){
46
+ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
47
+ var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
48
+ if (desc && (desc.get || desc.set)) {
49
+ Object.defineProperty(newObj, key, desc);
50
+ } else {
51
+ newObj[key] = obj[key];
52
+ }
53
+ }
54
+ }
55
+ newObj.default = obj;
56
+ if (cache) {
57
+ cache.set(obj, newObj);
58
+ }
59
+ return newObj;
60
+ }
61
+ const MAX_ITEMS_WITHOUT_SEARCH = 5;
62
+ const menuPlacementMap = {
63
+ 'bottom-left': 'bottom-start',
64
+ 'bottom-right': 'bottom-end'
65
+ };
66
+ const styles = {
67
+ wrapper: (0, _emotion.css)({
68
+ position: 'relative'
69
+ }),
70
+ inputWrapper: (0, _emotion.css)({
71
+ position: 'relative',
72
+ padding: `0 ${_f36tokens.default.spacing2Xs}`
73
+ }),
74
+ searchInput: (0, _emotion.css)({
75
+ paddingRight: _f36tokens.default.spacingXl,
76
+ textOverflow: 'ellipsis'
77
+ }),
78
+ searchIcon: (0, _emotion.css)({
79
+ position: 'absolute',
80
+ right: _f36tokens.default.spacingM,
81
+ top: _f36tokens.default.spacingS,
82
+ zIndex: Number(_f36tokens.default.zIndexDefault),
83
+ fill: _f36tokens.default.gray600
84
+ }),
85
+ separator: (0, _emotion.css)({
86
+ background: _f36tokens.default.gray200,
87
+ margin: '10px 0'
88
+ }),
89
+ dropdownList: (0, _emotion.css)({
90
+ borderColor: _f36tokens.default.gray200
91
+ })
92
+ };
93
+ const CreateEntryMenuTrigger = ({ contentTypes , suggestedContentTypeId , contentTypesLabel , onSelect , testId , dropdownSettings ={
94
+ position: 'bottom-left'
95
+ } , customDropdownItems , children })=>{
96
+ const [isOpen, setOpen] = (0, _react.useState)(false);
97
+ const [isSelecting, setSelecting] = (0, _react.useState)(false);
98
+ const [searchInput, setSearchInput] = (0, _react.useState)('');
99
+ const wrapper = (0, _react.useRef)(null);
100
+ const textField = (0, _react.useRef)(null);
101
+ const menuListRef = (0, _react.useRef)(null);
102
+ const [dropdownWidth, setDropdownWidth] = (0, _react.useState)();
103
+ const hasDropdown = contentTypes.length > 1 || !!customDropdownItems;
104
+ const closeMenu = ()=>setOpen(false);
105
+ (0, _react.useEffect)(()=>{
106
+ if (isOpen) {
107
+ setTimeout(()=>{
108
+ textField.current?.querySelector('input')?.focus({
109
+ preventScroll: true
110
+ });
111
+ }, 200);
112
+ }
113
+ }, [
114
+ isOpen
115
+ ]);
116
+ (0, _react.useEffect)(()=>{
117
+ if (isOpen && !dropdownWidth) {
118
+ setDropdownWidth(menuListRef.current?.clientWidth);
119
+ }
120
+ }, [
121
+ isOpen,
122
+ dropdownWidth
123
+ ]);
124
+ const handleSelect = (item)=>{
125
+ closeMenu();
126
+ const res = onSelect(item.sys.id);
127
+ if (res && typeof res.then === 'function') {
128
+ setSelecting(true);
129
+ res.then(()=>setSelecting(false), ()=>setSelecting(false));
130
+ }
131
+ };
132
+ const handleMenuOpen = ()=>{
133
+ if (hasDropdown) {
134
+ setOpen(true);
135
+ } else {
136
+ handleSelect(contentTypes[0]);
137
+ }
138
+ };
139
+ (0, _react.useEffect)(()=>{
140
+ if (!isOpen) {
141
+ setSearchInput('');
142
+ }
143
+ }, [
144
+ isOpen
145
+ ]);
146
+ const renderSearchResultsCount = (resultsLength)=>resultsLength ? _react.default.createElement(_f36components.Menu.SectionTitle, {
147
+ testId: "add-entru-menu-search-results"
148
+ }, resultsLength, " result", resultsLength > 1 ? 's' : '') : null;
149
+ const isSearchable = contentTypes.length > MAX_ITEMS_WITHOUT_SEARCH;
150
+ const maxDropdownHeight = suggestedContentTypeId ? 300 : 250;
151
+ const suggestedContentType = contentTypes.find((ct)=>ct.sys.id === suggestedContentTypeId);
152
+ const filteredContentTypes = contentTypes.filter((ct)=>!searchInput || (0, _get.default)(ct, 'name', 'Untitled').toLowerCase().includes(searchInput.toLowerCase()));
153
+ return _react.default.createElement("span", {
154
+ className: styles.wrapper,
155
+ ref: wrapper,
156
+ "data-test-id": testId
157
+ }, _react.default.createElement(_f36components.Menu, {
158
+ placement: menuPlacementMap[dropdownSettings.position],
159
+ isAutoalignmentEnabled: dropdownSettings.isAutoalignmentEnabled,
160
+ isOpen: isOpen,
161
+ onClose: closeMenu,
162
+ onOpen: handleMenuOpen
163
+ }, _react.default.createElement(_f36components.Menu.Trigger, null, children({
164
+ isOpen,
165
+ isSelecting
166
+ })), isOpen && _react.default.createElement(_f36components.Menu.List, {
167
+ className: styles.dropdownList,
168
+ style: {
169
+ width: dropdownWidth != undefined ? `${dropdownWidth}px` : undefined,
170
+ maxHeight: `${maxDropdownHeight}px`
171
+ },
172
+ ref: menuListRef,
173
+ testId: "add-entry-menu"
174
+ }, Boolean(customDropdownItems) && _react.default.createElement(_react.default.Fragment, null, customDropdownItems, _react.default.createElement(_f36components.Menu.Divider, null)), isSearchable && _react.default.createElement(_react.default.Fragment, null, _react.default.createElement("div", {
175
+ ref: textField,
176
+ className: styles.inputWrapper
177
+ }, _react.default.createElement(_f36components.TextInput, {
178
+ className: styles.searchInput,
179
+ placeholder: "Search all content types",
180
+ testId: "add-entry-menu-search",
181
+ value: searchInput,
182
+ onChange: (e)=>setSearchInput(e.target.value)
183
+ }), _react.default.createElement(_f36icons.SearchIcon, {
184
+ className: styles.searchIcon
185
+ })), _react.default.createElement(_f36components.Menu.Divider, null)), searchInput && renderSearchResultsCount(filteredContentTypes.length), suggestedContentType && !searchInput && _react.default.createElement(_react.default.Fragment, null, _react.default.createElement(_f36components.Menu.SectionTitle, null, "Suggested Content Type"), _react.default.createElement(_f36components.Menu.Item, {
186
+ testId: "suggested",
187
+ onClick: ()=>handleSelect(suggestedContentType)
188
+ }, (0, _get.default)(suggestedContentType, 'name')), _react.default.createElement(_f36components.Menu.Divider, null)), !searchInput && _react.default.createElement(_f36components.Menu.SectionTitle, null, contentTypesLabel), filteredContentTypes.length ? filteredContentTypes.map((contentType, i)=>_react.default.createElement(_f36components.Menu.Item, {
189
+ testId: "contentType",
190
+ key: `${(0, _get.default)(contentType, 'name')}-${i}`,
191
+ onClick: ()=>handleSelect(contentType)
192
+ }, (0, _get.default)(contentType, 'name', 'Untitled'))) : _react.default.createElement(_f36components.Menu.Item, {
193
+ testId: "add-entru-menu-search-results"
194
+ }, "No results found"))));
195
+ };
196
+ CreateEntryMenuTrigger.defaultProps = {
197
+ testId: 'create-entry-button-menu-trigger',
198
+ contentTypesLabel: 'All Content Types'
199
+ };