@contentful/field-editor-reference 5.21.2 → 5.21.5
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.
- package/dist/cjs/__fixtures__/asset/index.js +5 -5
- package/dist/cjs/__fixtures__/content-type/index.js +1 -1
- package/dist/cjs/__fixtures__/entry/index.js +4 -4
- package/dist/cjs/__fixtures__/fixtures.js +5 -5
- package/dist/cjs/__fixtures__/locale/index.js +2 -2
- package/dist/cjs/__fixtures__/space/index.js +1 -1
- package/dist/cjs/assets/MultipleMediaEditor.js +4 -4
- package/dist/cjs/assets/SingleMediaEditor.js +3 -3
- package/dist/cjs/assets/WrappedAssetCard/AssetCardActions.js +13 -13
- package/dist/cjs/assets/WrappedAssetCard/FetchingWrappedAssetCard.js +7 -12
- package/dist/cjs/assets/WrappedAssetCard/WrappedAssetCard.js +9 -16
- package/dist/cjs/assets/WrappedAssetCard/WrappedAssetLink.js +7 -8
- package/dist/cjs/common/EntityStore.js +6 -23
- package/dist/cjs/common/MultipleReferenceEditor.js +7 -14
- package/dist/cjs/common/ReferenceEditor.js +4 -4
- package/dist/cjs/common/SingleReferenceEditor.js +5 -7
- package/dist/cjs/common/SortableLinkList.js +9 -9
- package/dist/cjs/common/customCardTypes.js +1 -1
- package/dist/cjs/common/queryClient.js +3 -6
- package/dist/cjs/common/useContentTypePermissions.js +0 -2
- package/dist/cjs/common/useEditorPermissions.js +0 -12
- package/dist/cjs/common/useEditorPermissions.spec.js +0 -1
- package/dist/cjs/components/AssetThumbnail/AssetThumbnail.js +2 -2
- package/dist/cjs/components/CreateEntryLinkButton/CreateEntryLinkButton.js +7 -9
- package/dist/cjs/components/CreateEntryLinkButton/CreateEntryLinkButton.spec.js +14 -14
- package/dist/cjs/components/CreateEntryLinkButton/CreateEntryMenuTrigger.js +16 -24
- package/dist/cjs/components/CreateEntryLinkButton/CreateEntryMenuTrigger.spec.js +11 -11
- package/dist/cjs/components/LinkActions/CombinedLinkActions.js +20 -25
- package/dist/cjs/components/LinkActions/LinkActions.js +11 -11
- package/dist/cjs/components/LinkActions/LinkEntityActions.js +8 -15
- package/dist/cjs/components/LinkActions/NoLinkPermissionsInfo.js +2 -2
- package/dist/cjs/components/LinkActions/helpers.js +0 -9
- package/dist/cjs/components/LinkActions/redesignStyles.js +1 -1
- package/dist/cjs/components/LinkActions/styles.js +1 -1
- package/dist/cjs/components/MissingEntityCard/MissingEntityCard.js +8 -8
- package/dist/cjs/components/ResourceEntityErrorCard/ResourceEntityErrorCard.js +3 -3
- package/dist/cjs/components/ResourceEntityErrorCard/UnsupportedEntityCard.js +3 -3
- package/dist/cjs/components/ScheduledIconWithTooltip/ScheduleTooltip.js +2 -2
- package/dist/cjs/components/ScheduledIconWithTooltip/ScheduledIconWithTooltip.js +2 -5
- package/dist/cjs/components/ScheduledIconWithTooltip/formatDateAndTime.js +1 -2
- package/dist/cjs/components/SpaceName/SpaceName.js +6 -6
- package/dist/cjs/entries/MultipleEntryReferenceEditor.js +4 -4
- package/dist/cjs/entries/SingleEntryReferenceEditor.js +3 -3
- package/dist/cjs/entries/WrappedEntryCard/FetchingWrappedEntryCard.js +7 -14
- package/dist/cjs/entries/WrappedEntryCard/WrappedEntryCard.js +14 -18
- package/dist/cjs/resources/Cards/ContentfulEntryCard.js +2 -9
- package/dist/cjs/resources/Cards/ResourceCard.js +8 -10
- package/dist/cjs/resources/Cards/ResourceCard.spec.js +7 -8
- package/dist/cjs/resources/MultipleResourceReferenceEditor.js +11 -12
- package/dist/cjs/resources/MultipleResourceReferenceEditor.spec.js +8 -27
- package/dist/cjs/resources/SingleResourceReferenceEditor.js +6 -6
- package/dist/cjs/resources/SingleResourceReferenceEditor.spec.js +5 -10
- package/dist/cjs/resources/testHelpers/resourceEditorHelpers.js +0 -7
- package/dist/cjs/resources/useResourceLinkActions.js +1 -10
- package/dist/cjs/utils/fromFieldValidations.js +1 -2
- package/dist/cjs/utils/useSortIDs.js +1 -1
- package/dist/esm/assets/MultipleMediaEditor.js +3 -3
- package/dist/esm/assets/SingleMediaEditor.js +2 -2
- package/dist/esm/assets/WrappedAssetCard/AssetCardActions.js +10 -10
- package/dist/esm/assets/WrappedAssetCard/FetchingWrappedAssetCard.js +6 -11
- package/dist/esm/assets/WrappedAssetCard/WrappedAssetCard.js +6 -14
- package/dist/esm/assets/WrappedAssetCard/WrappedAssetLink.js +5 -6
- package/dist/esm/common/EntityStore.js +3 -20
- package/dist/esm/common/MultipleReferenceEditor.js +6 -13
- package/dist/esm/common/ReferenceEditor.js +2 -2
- package/dist/esm/common/SingleReferenceEditor.js +4 -6
- package/dist/esm/common/SortableLinkList.js +7 -7
- package/dist/esm/common/queryClient.js +3 -10
- package/dist/esm/common/useContentTypePermissions.js +0 -2
- package/dist/esm/common/useEditorPermissions.js +0 -12
- package/dist/esm/common/useEditorPermissions.spec.js +0 -1
- package/dist/esm/components/AssetThumbnail/AssetThumbnail.js +1 -1
- package/dist/esm/components/CreateEntryLinkButton/CreateEntryLinkButton.js +4 -6
- package/dist/esm/components/CreateEntryLinkButton/CreateEntryLinkButton.spec.js +12 -12
- package/dist/esm/components/CreateEntryLinkButton/CreateEntryMenuTrigger.js +13 -21
- package/dist/esm/components/CreateEntryLinkButton/CreateEntryMenuTrigger.spec.js +8 -9
- package/dist/esm/components/LinkActions/CombinedLinkActions.js +19 -30
- package/dist/esm/components/LinkActions/LinkActions.js +9 -9
- package/dist/esm/components/LinkActions/LinkEntityActions.js +7 -14
- package/dist/esm/components/LinkActions/NoLinkPermissionsInfo.js +1 -1
- package/dist/esm/components/LinkActions/helpers.js +0 -9
- package/dist/esm/components/MissingEntityCard/MissingEntityCard.js +6 -6
- package/dist/esm/components/ResourceEntityErrorCard/ResourceEntityErrorCard.js +2 -2
- package/dist/esm/components/ResourceEntityErrorCard/UnsupportedEntityCard.js +2 -2
- package/dist/esm/components/ScheduledIconWithTooltip/ScheduleTooltip.js +1 -1
- package/dist/esm/components/ScheduledIconWithTooltip/ScheduledIconWithTooltip.js +1 -4
- package/dist/esm/components/ScheduledIconWithTooltip/formatDateAndTime.js +2 -11
- package/dist/esm/components/SpaceName/SpaceName.js +4 -4
- package/dist/esm/entries/MultipleEntryReferenceEditor.js +3 -3
- package/dist/esm/entries/SingleEntryReferenceEditor.js +2 -2
- package/dist/esm/entries/WrappedEntryCard/FetchingWrappedEntryCard.js +5 -12
- package/dist/esm/entries/WrappedEntryCard/WrappedEntryCard.js +12 -16
- package/dist/esm/resources/Cards/ContentfulEntryCard.js +1 -8
- package/dist/esm/resources/Cards/ResourceCard.js +7 -9
- package/dist/esm/resources/Cards/ResourceCard.spec.js +2 -3
- package/dist/esm/resources/MultipleResourceReferenceEditor.js +8 -9
- package/dist/esm/resources/MultipleResourceReferenceEditor.spec.js +7 -26
- package/dist/esm/resources/SingleResourceReferenceEditor.js +4 -4
- package/dist/esm/resources/SingleResourceReferenceEditor.spec.js +4 -9
- package/dist/esm/resources/testHelpers/resourceEditorHelpers.js +0 -7
- package/dist/esm/resources/useResourceLinkActions.js +1 -10
- package/dist/esm/utils/fromFieldValidations.js +0 -1
- package/dist/types/assets/MultipleMediaEditor.d.ts +2 -2
- package/dist/types/assets/SingleMediaEditor.d.ts +2 -2
- package/dist/types/assets/WrappedAssetCard/AssetCardActions.d.ts +3 -3
- package/dist/types/assets/WrappedAssetCard/FetchingWrappedAssetCard.d.ts +2 -2
- package/dist/types/assets/WrappedAssetCard/WrappedAssetCard.d.ts +2 -2
- package/dist/types/assets/WrappedAssetCard/WrappedAssetLink.d.ts +2 -2
- package/dist/types/common/EntityStore.d.ts +1 -1
- package/dist/types/common/MultipleReferenceEditor.d.ts +1 -1
- package/dist/types/common/ReferenceEditor.d.ts +1 -1
- package/dist/types/common/SingleReferenceEditor.d.ts +1 -1
- package/dist/types/common/SortableLinkList.d.ts +1 -1
- package/dist/types/common/queryClient.d.ts +1 -1
- package/dist/types/components/AssetThumbnail/AssetThumbnail.d.ts +2 -2
- package/dist/types/components/CreateEntryLinkButton/CreateEntryLinkButton.d.ts +1 -1
- package/dist/types/components/CreateEntryLinkButton/CreateEntryMenuTrigger.d.ts +1 -1
- package/dist/types/components/LinkActions/CombinedLinkActions.d.ts +2 -2
- package/dist/types/components/LinkActions/LinkActions.d.ts +1 -1
- package/dist/types/components/LinkActions/LinkEntityActions.d.ts +2 -2
- package/dist/types/components/LinkActions/NoLinkPermissionsInfo.d.ts +2 -2
- package/dist/types/components/MissingEntityCard/MissingEntityCard.d.ts +2 -2
- package/dist/types/components/ResourceEntityErrorCard/ResourceEntityErrorCard.d.ts +2 -2
- package/dist/types/components/ResourceEntityErrorCard/UnsupportedEntityCard.d.ts +2 -2
- package/dist/types/components/ScheduledIconWithTooltip/ScheduleTooltip.d.ts +1 -1
- package/dist/types/components/ScheduledIconWithTooltip/ScheduledIconWithTooltip.d.ts +1 -1
- package/dist/types/components/SpaceName/SpaceName.d.ts +2 -2
- package/dist/types/entries/MultipleEntryReferenceEditor.d.ts +2 -2
- package/dist/types/entries/SingleEntryReferenceEditor.d.ts +2 -2
- package/dist/types/entries/WrappedEntryCard/FetchingWrappedEntryCard.d.ts +2 -2
- package/dist/types/entries/WrappedEntryCard/WrappedEntryCard.d.ts +1 -1
- package/dist/types/resources/Cards/ContentfulEntryCard.d.ts +2 -2
- package/dist/types/resources/Cards/ResourceCard.d.ts +2 -2
- package/dist/types/resources/MultipleResourceReferenceEditor.d.ts +2 -2
- package/dist/types/resources/SingleResourceReferenceEditor.d.ts +2 -2
- package/package.json +8 -5
|
@@ -8,8 +8,8 @@ Object.defineProperty(exports, "SortableLinkList", {
|
|
|
8
8
|
return SortableLinkList;
|
|
9
9
|
}
|
|
10
10
|
});
|
|
11
|
-
const _react =
|
|
12
|
-
const _f36tokens =
|
|
11
|
+
const _react = _interop_require_default(require("react"));
|
|
12
|
+
const _f36tokens = _interop_require_default(require("@contentful/f36-tokens"));
|
|
13
13
|
const _core = require("@dnd-kit/core");
|
|
14
14
|
const _sortable = require("@dnd-kit/sortable");
|
|
15
15
|
const _utilities = require("@dnd-kit/utilities");
|
|
@@ -49,16 +49,16 @@ const SortableLink = ({ id, items, item, isDisabled = false, index, children })=
|
|
|
49
49
|
};
|
|
50
50
|
const DragHandle = _react.default.useCallback((props)=>{
|
|
51
51
|
const SortableDragHandle = ()=>props.drag;
|
|
52
|
-
return
|
|
52
|
+
return _react.default.createElement("div", {
|
|
53
53
|
ref: setActivatorNodeRef,
|
|
54
54
|
className: styles.dragHandle,
|
|
55
55
|
...listeners
|
|
56
|
-
},
|
|
56
|
+
}, _react.default.createElement(SortableDragHandle, null));
|
|
57
57
|
}, [
|
|
58
58
|
listeners,
|
|
59
59
|
setActivatorNodeRef
|
|
60
60
|
]);
|
|
61
|
-
return
|
|
61
|
+
return _react.default.createElement("div", {
|
|
62
62
|
ref: setNodeRef,
|
|
63
63
|
style: style,
|
|
64
64
|
className: (0, _emotion.cx)(styles.item, {
|
|
@@ -101,17 +101,17 @@ const SortableLinkList = ({ items, isDisabled, className, children, onSortStart,
|
|
|
101
101
|
sortIDs,
|
|
102
102
|
rearrangeSortIDs
|
|
103
103
|
]);
|
|
104
|
-
return
|
|
104
|
+
return _react.default.createElement(_core.DndContext, {
|
|
105
105
|
onDragStart: onSortStartHandler,
|
|
106
106
|
onDragEnd: onSortEndHandler
|
|
107
|
-
},
|
|
107
|
+
}, _react.default.createElement(_sortable.SortableContext, {
|
|
108
108
|
items: sortIDs,
|
|
109
109
|
strategy: sortingStrategy
|
|
110
|
-
},
|
|
110
|
+
}, _react.default.createElement("div", {
|
|
111
111
|
className: (0, _emotion.cx)(styles.container, className)
|
|
112
112
|
}, items.map((item, index)=>{
|
|
113
113
|
const id = sortIDs[index]?.id;
|
|
114
|
-
return
|
|
114
|
+
return _react.default.createElement(SortableLink, {
|
|
115
115
|
key: id,
|
|
116
116
|
id: id,
|
|
117
117
|
items: items,
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", {
|
|
3
3
|
value: true
|
|
4
4
|
});
|
|
5
|
-
const _react =
|
|
5
|
+
const _react = _interop_require_wildcard(require("react"));
|
|
6
6
|
function _getRequireWildcardCache(nodeInterop) {
|
|
7
7
|
if (typeof WeakMap !== "function") return null;
|
|
8
8
|
var cacheBabelInterop = new WeakMap();
|
|
@@ -19,7 +19,7 @@ _export(exports, {
|
|
|
19
19
|
return useQueryClient;
|
|
20
20
|
}
|
|
21
21
|
});
|
|
22
|
-
const _react =
|
|
22
|
+
const _react = _interop_require_wildcard(require("react"));
|
|
23
23
|
const _reactquery = require("@tanstack/react-query");
|
|
24
24
|
function _getRequireWildcardCache(nodeInterop) {
|
|
25
25
|
if (typeof WeakMap !== "function") return null;
|
|
@@ -62,10 +62,7 @@ function _interop_require_wildcard(obj, nodeInterop) {
|
|
|
62
62
|
}
|
|
63
63
|
return newObj;
|
|
64
64
|
}
|
|
65
|
-
|
|
66
|
-
* A custom client context ensures zero conflict with host apps also using
|
|
67
|
-
* React Query.
|
|
68
|
-
*/ const clientContext = /*#__PURE__*/ _react.createContext(undefined);
|
|
65
|
+
const clientContext = _react.createContext(undefined);
|
|
69
66
|
function useQueryClient() {
|
|
70
67
|
const client = _react.useContext(clientContext);
|
|
71
68
|
return _react.useMemo(()=>{
|
|
@@ -96,7 +93,7 @@ const useQuery = (key, fn, opt)=>{
|
|
|
96
93
|
};
|
|
97
94
|
function SharedQueryClientProvider({ children }) {
|
|
98
95
|
const client = useQueryClient();
|
|
99
|
-
return
|
|
96
|
+
return _react.createElement(clientContext.Provider, {
|
|
100
97
|
value: client
|
|
101
98
|
}, children);
|
|
102
99
|
}
|
|
@@ -11,7 +11,6 @@ Object.defineProperty(exports, "useContentTypePermissions", {
|
|
|
11
11
|
const _react = require("react");
|
|
12
12
|
const _useAccessApi = require("./useAccessApi");
|
|
13
13
|
async function filter(arr, predicate) {
|
|
14
|
-
// intentionally parallel as we assume it's cached in the implementation of the access api
|
|
15
14
|
const fail = Symbol();
|
|
16
15
|
const results = await Promise.all(arr.map(async (item)=>await predicate(item) ? item : fail));
|
|
17
16
|
return results.filter((x)=>x !== fail);
|
|
@@ -41,7 +40,6 @@ function useContentTypePermissions(props) {
|
|
|
41
40
|
setCreatableContentTypes(creatable);
|
|
42
41
|
}
|
|
43
42
|
void checkContentTypeAccess();
|
|
44
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps -- TODO: Evaluate the dependencies
|
|
45
43
|
}, [
|
|
46
44
|
availableContentTypes
|
|
47
45
|
]);
|
|
@@ -31,20 +31,15 @@ function useEditorPermissions(props) {
|
|
|
31
31
|
}
|
|
32
32
|
async function checkCreateAccess() {
|
|
33
33
|
if (entityType === 'Asset') {
|
|
34
|
-
// Hardcoded `true` value following https://contentful.atlassian.net/browse/DANTE-486
|
|
35
|
-
// TODO: refine permissions check in order to account for tags in rules
|
|
36
34
|
const canCreate = await canPerformAction('create', 'Asset') || true;
|
|
37
35
|
setCanCreateEntity(canCreate);
|
|
38
36
|
}
|
|
39
37
|
if (entityType === 'Entry') {
|
|
40
|
-
// Hardcoded `true` value following https://contentful.atlassian.net/browse/DANTE-486
|
|
41
|
-
// TODO: refine permissions check in order to account for tags in rules
|
|
42
38
|
const canCreate = creatableContentTypes.length > 0 || true;
|
|
43
39
|
setCanCreateEntity(canCreate);
|
|
44
40
|
}
|
|
45
41
|
}
|
|
46
42
|
void checkCreateAccess();
|
|
47
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps -- TODO: Evaluate the dependencies
|
|
48
43
|
}, [
|
|
49
44
|
entityType,
|
|
50
45
|
parameters.instance,
|
|
@@ -57,22 +52,15 @@ function useEditorPermissions(props) {
|
|
|
57
52
|
}
|
|
58
53
|
async function checkLinkAccess() {
|
|
59
54
|
if (entityType === 'Asset') {
|
|
60
|
-
// Hardcoded `true` value following https://contentful.atlassian.net/browse/DANTE-486
|
|
61
|
-
// TODO: refine permissions check in order to account for tags in rules
|
|
62
55
|
const canRead = await canPerformAction('read', 'Asset') || true;
|
|
63
56
|
setCanLinkEntity(canRead);
|
|
64
57
|
}
|
|
65
58
|
if (entityType === 'Entry') {
|
|
66
|
-
// Hardcoded `true` value following https://contentful.atlassian.net/browse/DANTE-486
|
|
67
|
-
// TODO: refine permissions check in order to account for tags in rules
|
|
68
|
-
// TODO: always show every content type (it's just a filter) to avoid people not seeing
|
|
69
|
-
// their (partly limited) content types
|
|
70
59
|
const canRead = true;
|
|
71
60
|
setCanLinkEntity(canRead);
|
|
72
61
|
}
|
|
73
62
|
}
|
|
74
63
|
void checkLinkAccess();
|
|
75
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps -- TODO: Evaluate the dependencies
|
|
76
64
|
}, [
|
|
77
65
|
entityType,
|
|
78
66
|
parameters.instance
|
|
@@ -134,7 +134,6 @@ describe('useEditorPermissions', ()=>{
|
|
|
134
134
|
});
|
|
135
135
|
expect(result.current.canLinkEntity).toBe(true);
|
|
136
136
|
});
|
|
137
|
-
// eslint-disable-next-line -- TODO: describe this disable jest/no-test-prefixes
|
|
138
137
|
it.skip(`denies creation when no content-type can be read`, async ()=>{
|
|
139
138
|
const allContentTypes = [
|
|
140
139
|
makeContentType('one'),
|
|
@@ -8,7 +8,7 @@ Object.defineProperty(exports, "AssetThumbnail", {
|
|
|
8
8
|
return AssetThumbnail;
|
|
9
9
|
}
|
|
10
10
|
});
|
|
11
|
-
const _react =
|
|
11
|
+
const _react = _interop_require_wildcard(require("react"));
|
|
12
12
|
function _getRequireWildcardCache(nodeInterop) {
|
|
13
13
|
if (typeof WeakMap !== "function") return null;
|
|
14
14
|
var cacheBabelInterop = new WeakMap();
|
|
@@ -55,7 +55,7 @@ const dimensions = {
|
|
|
55
55
|
height: 70
|
|
56
56
|
};
|
|
57
57
|
function AssetThumbnail(props) {
|
|
58
|
-
return
|
|
58
|
+
return _react.createElement("img", {
|
|
59
59
|
alt: props.file.fileName,
|
|
60
60
|
src: `${props.file.url}?w=${dimensions.width}&h=${dimensions.height}&fit=thumb`,
|
|
61
61
|
height: dimensions.height,
|
|
@@ -8,12 +8,12 @@ Object.defineProperty(exports, "CreateEntryLinkButton", {
|
|
|
8
8
|
return CreateEntryLinkButton;
|
|
9
9
|
}
|
|
10
10
|
});
|
|
11
|
-
const _react =
|
|
11
|
+
const _react = _interop_require_wildcard(require("react"));
|
|
12
12
|
const _f36components = require("@contentful/f36-components");
|
|
13
13
|
const _f36icons = require("@contentful/f36-icons");
|
|
14
|
-
const _f36tokens =
|
|
14
|
+
const _f36tokens = _interop_require_default(require("@contentful/f36-tokens"));
|
|
15
15
|
const _emotion = require("emotion");
|
|
16
|
-
const _get =
|
|
16
|
+
const _get = _interop_require_default(require("lodash/get"));
|
|
17
17
|
const _CreateEntryMenuTrigger = require("./CreateEntryMenuTrigger");
|
|
18
18
|
function _interop_require_default(obj) {
|
|
19
19
|
return obj && obj.__esModule ? obj : {
|
|
@@ -80,12 +80,10 @@ const CreateEntryLinkButton = ({ contentTypes, onSelect, customDropdownItems, te
|
|
|
80
80
|
const suggestedContentType = contentTypes.find((ct)=>ct.sys.id === suggestedContentTypeId);
|
|
81
81
|
const buttonText = text || `Add ${(0, _get.default)(suggestedContentType || (contentTypes.length === 1 ? contentTypes[0] : {}), 'name', 'entry')}`;
|
|
82
82
|
const hasDropdown = contentTypes.length > 1 || customDropdownItems;
|
|
83
|
-
|
|
84
|
-
const plusIcon = hasPlusIcon ? /*#__PURE__*/ _react.createElement(_f36icons.PlusIcon, null) : undefined;
|
|
85
|
-
// TODO: Always use "New content" here if we fully switch to new layout.
|
|
83
|
+
const plusIcon = hasPlusIcon ? _react.createElement(_f36icons.PlusIcon, null) : undefined;
|
|
86
84
|
const contentTypesLabel = useExperimentalStyles ? 'New content' : undefined;
|
|
87
85
|
const styles = useExperimentalStyles ? redesignStyles : standardStyles;
|
|
88
|
-
return
|
|
86
|
+
return _react.createElement(_CreateEntryMenuTrigger.CreateEntryMenuTrigger, {
|
|
89
87
|
contentTypes: contentTypes,
|
|
90
88
|
suggestedContentTypeId: suggestedContentTypeId,
|
|
91
89
|
contentTypesLabel: contentTypesLabel,
|
|
@@ -93,8 +91,8 @@ const CreateEntryLinkButton = ({ contentTypes, onSelect, customDropdownItems, te
|
|
|
93
91
|
testId: testId,
|
|
94
92
|
dropdownSettings: dropdownSettings,
|
|
95
93
|
customDropdownItems: customDropdownItems
|
|
96
|
-
}, ({ isSelecting })
|
|
97
|
-
endIcon: hasDropdown ?
|
|
94
|
+
}, ({ isSelecting })=>_react.createElement(_f36components.Button, {
|
|
95
|
+
endIcon: hasDropdown ? _react.createElement(_f36icons.ChevronDownIcon, null) : undefined,
|
|
98
96
|
variant: "secondary",
|
|
99
97
|
className: styles.action,
|
|
100
98
|
isDisabled: disabled || isSelecting,
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", {
|
|
3
3
|
value: true
|
|
4
4
|
});
|
|
5
|
-
const _react =
|
|
5
|
+
const _react = _interop_require_wildcard(require("react"));
|
|
6
6
|
require("@testing-library/jest-dom");
|
|
7
7
|
const _react1 = require("@testing-library/react");
|
|
8
|
-
const _noop =
|
|
8
|
+
const _noop = _interop_require_default(require("lodash/noop"));
|
|
9
9
|
const _CreateEntryLinkButton = require("./CreateEntryLinkButton");
|
|
10
10
|
function _interop_require_default(obj) {
|
|
11
11
|
return obj && obj.__esModule ? obj : {
|
|
@@ -87,14 +87,14 @@ describe('CreateEntryLinkButton general', ()=>{
|
|
|
87
87
|
}
|
|
88
88
|
};
|
|
89
89
|
it('renders with multiple content types as list', ()=>{
|
|
90
|
-
const { getByTestId } = (0, _react1.render)(
|
|
90
|
+
const { getByTestId } = (0, _react1.render)(_react.createElement(_CreateEntryLinkButton.CreateEntryLinkButton, props));
|
|
91
91
|
expect(getByTestId('create-entry-button-menu-trigger')).toBeDefined();
|
|
92
92
|
const link = findButton(getByTestId);
|
|
93
93
|
expect(link).toBeDefined();
|
|
94
94
|
expect(link.textContent).toBe('Add entry');
|
|
95
95
|
});
|
|
96
96
|
it('renders dropdown menu on click when with multiple content types', ()=>{
|
|
97
|
-
const { getByTestId } = (0, _react1.render)(
|
|
97
|
+
const { getByTestId } = (0, _react1.render)(_react.createElement(_CreateEntryLinkButton.CreateEntryLinkButton, props));
|
|
98
98
|
_react1.fireEvent.click(findButton(getByTestId));
|
|
99
99
|
const menu = getByTestId('add-entry-menu');
|
|
100
100
|
expect(menu).toBeDefined();
|
|
@@ -104,7 +104,7 @@ describe('CreateEntryLinkButton general', ()=>{
|
|
|
104
104
|
});
|
|
105
105
|
it('renders suggestedContentType as text when given', ()=>{
|
|
106
106
|
const suggestedContentTypeId = 'ID_2';
|
|
107
|
-
const { getByTestId } = (0, _react1.render)(
|
|
107
|
+
const { getByTestId } = (0, _react1.render)(_react.createElement(_CreateEntryLinkButton.CreateEntryLinkButton, {
|
|
108
108
|
...props,
|
|
109
109
|
suggestedContentTypeId: suggestedContentTypeId
|
|
110
110
|
}));
|
|
@@ -114,7 +114,7 @@ describe('CreateEntryLinkButton general', ()=>{
|
|
|
114
114
|
expect(button.textContent).toBe(`Add ${CONTENT_TYPE_2.name}`);
|
|
115
115
|
});
|
|
116
116
|
it('renders the name of the content type as part of the text if only 1 content type is given', ()=>{
|
|
117
|
-
const { getByTestId } = (0, _react1.render)(
|
|
117
|
+
const { getByTestId } = (0, _react1.render)(_react.createElement(_CreateEntryLinkButton.CreateEntryLinkButton, {
|
|
118
118
|
onSelect: props.onSelect,
|
|
119
119
|
contentTypes: [
|
|
120
120
|
CONTENT_TYPE_1
|
|
@@ -130,7 +130,7 @@ describe('CreateEntryLinkButton general', ()=>{
|
|
|
130
130
|
text: 'CUSTOM_TEXT',
|
|
131
131
|
hasPlusIcon: true
|
|
132
132
|
};
|
|
133
|
-
const { getByTestId } = (0, _react1.render)(
|
|
133
|
+
const { getByTestId } = (0, _react1.render)(_react.createElement(_CreateEntryLinkButton.CreateEntryLinkButton, {
|
|
134
134
|
...props,
|
|
135
135
|
...propsOverrides
|
|
136
136
|
}));
|
|
@@ -151,13 +151,13 @@ describe('CreateEntryLinkButton with multiple entries', ()=>{
|
|
|
151
151
|
}
|
|
152
152
|
};
|
|
153
153
|
it('should render dropdown items for each content type', ()=>{
|
|
154
|
-
const { getByTestId, getAllByTestId } = (0, _react1.render)(
|
|
154
|
+
const { getByTestId, getAllByTestId } = (0, _react1.render)(_react.createElement(_CreateEntryLinkButton.CreateEntryLinkButton, props));
|
|
155
155
|
_react1.fireEvent.click(findButton(getByTestId));
|
|
156
156
|
expect(getAllByTestId('contentType')).toHaveLength(props.contentTypes.length);
|
|
157
157
|
});
|
|
158
158
|
it('calls onSelect after click on menu item', ()=>{
|
|
159
159
|
const selectSpy = jest.fn();
|
|
160
|
-
const { getByTestId, getAllByTestId } = (0, _react1.render)(
|
|
160
|
+
const { getByTestId, getAllByTestId } = (0, _react1.render)(_react.createElement(_CreateEntryLinkButton.CreateEntryLinkButton, {
|
|
161
161
|
...props,
|
|
162
162
|
onSelect: selectSpy
|
|
163
163
|
}));
|
|
@@ -177,7 +177,7 @@ describe('CreateEntryLinkButton with a single entry', ()=>{
|
|
|
177
177
|
};
|
|
178
178
|
it('should fire the onSelect function when clicked', ()=>{
|
|
179
179
|
const onSelectStub = jest.fn();
|
|
180
|
-
const { getByTestId } = (0, _react1.render)(
|
|
180
|
+
const { getByTestId } = (0, _react1.render)(_react.createElement(_CreateEntryLinkButton.CreateEntryLinkButton, {
|
|
181
181
|
...props,
|
|
182
182
|
onSelect: onSelectStub
|
|
183
183
|
}));
|
|
@@ -189,7 +189,7 @@ describe('CreateEntryLinkButton with a single entry', ()=>{
|
|
|
189
189
|
describe('CreateEntryLinkButton common', ()=>{
|
|
190
190
|
it('should render a spinner if onSelect returns a promise', async ()=>{
|
|
191
191
|
const onSelect = jest.fn(()=>new Promise((resolve)=>setTimeout(resolve, 1000)));
|
|
192
|
-
const { getByTestId, container } = (0, _react1.render)(
|
|
192
|
+
const { getByTestId, container } = (0, _react1.render)(_react.createElement(_CreateEntryLinkButton.CreateEntryLinkButton, {
|
|
193
193
|
contentTypes: [
|
|
194
194
|
CONTENT_TYPE_1
|
|
195
195
|
],
|
|
@@ -205,7 +205,7 @@ describe('CreateEntryLinkButton common', ()=>{
|
|
|
205
205
|
});
|
|
206
206
|
it('should hide a spinner after the promise from onSelect resolves', async ()=>{
|
|
207
207
|
const onSelect = jest.fn(()=>new Promise((resolve)=>setTimeout(resolve, 500)));
|
|
208
|
-
const { getByTestId, container } = (0, _react1.render)(
|
|
208
|
+
const { getByTestId, container } = (0, _react1.render)(_react.createElement(_CreateEntryLinkButton.CreateEntryLinkButton, {
|
|
209
209
|
contentTypes: [
|
|
210
210
|
CONTENT_TYPE_1
|
|
211
211
|
],
|
|
@@ -222,7 +222,7 @@ describe('CreateEntryLinkButton common', ()=>{
|
|
|
222
222
|
});
|
|
223
223
|
it('does not emit onSelect on subsequent click before the promise from onSelect resolves', async ()=>{
|
|
224
224
|
const onSelect = jest.fn(()=>new Promise((resolve)=>setTimeout(()=>resolve(undefined), 200)));
|
|
225
|
-
const { getByTestId } = (0, _react1.render)(
|
|
225
|
+
const { getByTestId } = (0, _react1.render)(_react.createElement(_CreateEntryLinkButton.CreateEntryLinkButton, {
|
|
226
226
|
contentTypes: [
|
|
227
227
|
CONTENT_TYPE_1
|
|
228
228
|
],
|
|
@@ -238,7 +238,7 @@ describe('CreateEntryLinkButton common', ()=>{
|
|
|
238
238
|
});
|
|
239
239
|
it('emits onSelect on subsequent click after the promise from onSelect resolves', async ()=>{
|
|
240
240
|
const onSelect = jest.fn(()=>Promise.resolve());
|
|
241
|
-
const { getByTestId } = (0, _react1.render)(
|
|
241
|
+
const { getByTestId } = (0, _react1.render)(_react.createElement(_CreateEntryLinkButton.CreateEntryLinkButton, {
|
|
242
242
|
contentTypes: [
|
|
243
243
|
CONTENT_TYPE_1
|
|
244
244
|
],
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", {
|
|
3
3
|
value: true
|
|
4
4
|
});
|
|
@@ -8,12 +8,12 @@ Object.defineProperty(exports, "CreateEntryMenuTrigger", {
|
|
|
8
8
|
return CreateEntryMenuTrigger;
|
|
9
9
|
}
|
|
10
10
|
});
|
|
11
|
-
const _react =
|
|
11
|
+
const _react = _interop_require_wildcard(require("react"));
|
|
12
12
|
const _f36components = require("@contentful/f36-components");
|
|
13
13
|
const _f36icons = require("@contentful/f36-icons");
|
|
14
|
-
const _f36tokens =
|
|
14
|
+
const _f36tokens = _interop_require_default(require("@contentful/f36-tokens"));
|
|
15
15
|
const _emotion = require("emotion");
|
|
16
|
-
const _get =
|
|
16
|
+
const _get = _interop_require_default(require("lodash/get"));
|
|
17
17
|
function _interop_require_default(obj) {
|
|
18
18
|
return obj && obj.__esModule ? obj : {
|
|
19
19
|
default: obj
|
|
@@ -101,14 +101,7 @@ const CreateEntryMenuTrigger = ({ contentTypes, suggestedContentTypeId, contentT
|
|
|
101
101
|
const wrapper = (0, _react.useRef)(null);
|
|
102
102
|
const textField = (0, _react.useRef)(null);
|
|
103
103
|
const menuListRef = (0, _react.useRef)(null);
|
|
104
|
-
|
|
105
|
-
By default, dropdown wraps it's content, so it's width = the width of the widest item
|
|
106
|
-
During search, menu items change, and so the widest menu item can change
|
|
107
|
-
This leads to menu always changing it's width
|
|
108
|
-
To prevent this, we get the width of the menu item after the first mount of a dropdown (when all the content is displayed)
|
|
109
|
-
And hardcode it through the class name. This way we ensure that even during search the menu will keep that max width
|
|
110
|
-
That it had on initial mount and that fits any menu item in has
|
|
111
|
-
*/ const [dropdownWidth, setDropdownWidth] = (0, _react.useState)();
|
|
104
|
+
const [dropdownWidth, setDropdownWidth] = (0, _react.useState)();
|
|
112
105
|
const hasDropdown = contentTypes.length > 1 || !!customDropdownItems;
|
|
113
106
|
const closeMenu = ()=>setOpen(false);
|
|
114
107
|
(0, _react.useEffect)(()=>{
|
|
@@ -133,7 +126,6 @@ const CreateEntryMenuTrigger = ({ contentTypes, suggestedContentTypeId, contentT
|
|
|
133
126
|
const handleSelect = (item)=>{
|
|
134
127
|
closeMenu();
|
|
135
128
|
const res = onSelect(item.sys.id);
|
|
136
|
-
// TODO: Convert to controllable component.
|
|
137
129
|
if (res && typeof res.then === 'function') {
|
|
138
130
|
setSelecting(true);
|
|
139
131
|
res.then(()=>setSelecting(false), ()=>setSelecting(false));
|
|
@@ -153,28 +145,28 @@ const CreateEntryMenuTrigger = ({ contentTypes, suggestedContentTypeId, contentT
|
|
|
153
145
|
}, [
|
|
154
146
|
isOpen
|
|
155
147
|
]);
|
|
156
|
-
const renderSearchResultsCount = (resultsLength)=>resultsLength ?
|
|
148
|
+
const renderSearchResultsCount = (resultsLength)=>resultsLength ? _react.default.createElement(_f36components.Menu.SectionTitle, {
|
|
157
149
|
testId: "add-entru-menu-search-results"
|
|
158
150
|
}, resultsLength, " result", resultsLength > 1 ? 's' : '') : null;
|
|
159
151
|
const isSearchable = contentTypes.length > MAX_ITEMS_WITHOUT_SEARCH;
|
|
160
152
|
const maxDropdownHeight = suggestedContentTypeId ? 300 : 250;
|
|
161
153
|
const suggestedContentType = contentTypes.find((ct)=>ct.sys.id === suggestedContentTypeId);
|
|
162
154
|
const filteredContentTypes = contentTypes.filter((ct)=>!searchInput || (0, _get.default)(ct, 'name', 'Untitled').toLowerCase().includes(searchInput.toLowerCase()));
|
|
163
|
-
return
|
|
155
|
+
return _react.default.createElement("span", {
|
|
164
156
|
className: styles.wrapper,
|
|
165
157
|
ref: wrapper,
|
|
166
158
|
"data-test-id": testId
|
|
167
|
-
},
|
|
159
|
+
}, _react.default.createElement(_f36components.Menu, {
|
|
168
160
|
placement: menuPlacementMap[dropdownSettings.position],
|
|
169
161
|
isAutoalignmentEnabled: dropdownSettings.isAutoalignmentEnabled,
|
|
170
162
|
isOpen: isOpen,
|
|
171
163
|
onClose: closeMenu,
|
|
172
164
|
onOpen: handleMenuOpen,
|
|
173
165
|
...menuProps
|
|
174
|
-
},
|
|
166
|
+
}, _react.default.createElement(_f36components.Menu.Trigger, null, children({
|
|
175
167
|
isOpen,
|
|
176
168
|
isSelecting
|
|
177
|
-
})), isOpen &&
|
|
169
|
+
})), isOpen && _react.default.createElement(_f36components.Menu.List, {
|
|
178
170
|
className: styles.dropdownList,
|
|
179
171
|
style: {
|
|
180
172
|
width: dropdownWidth != undefined ? `${dropdownWidth}px` : undefined,
|
|
@@ -182,25 +174,25 @@ const CreateEntryMenuTrigger = ({ contentTypes, suggestedContentTypeId, contentT
|
|
|
182
174
|
},
|
|
183
175
|
ref: menuListRef,
|
|
184
176
|
testId: "add-entry-menu"
|
|
185
|
-
}, Boolean(customDropdownItems) &&
|
|
177
|
+
}, 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", {
|
|
186
178
|
ref: textField,
|
|
187
179
|
className: styles.inputWrapper
|
|
188
|
-
},
|
|
180
|
+
}, _react.default.createElement(_f36components.TextInput, {
|
|
189
181
|
className: styles.searchInput,
|
|
190
182
|
placeholder: "Search all content types",
|
|
191
183
|
testId: "add-entry-menu-search",
|
|
192
184
|
value: searchInput,
|
|
193
185
|
onChange: (e)=>setSearchInput(e.target.value)
|
|
194
|
-
}),
|
|
186
|
+
}), _react.default.createElement(_f36icons.SearchIcon, {
|
|
195
187
|
className: styles.searchIcon
|
|
196
|
-
})),
|
|
188
|
+
})), _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, {
|
|
197
189
|
testId: "suggested",
|
|
198
190
|
onClick: ()=>handleSelect(suggestedContentType)
|
|
199
|
-
}, (0, _get.default)(suggestedContentType, 'name')),
|
|
191
|
+
}, (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, {
|
|
200
192
|
testId: "contentType",
|
|
201
193
|
key: `${(0, _get.default)(contentType, 'name')}-${i}`,
|
|
202
194
|
onClick: ()=>handleSelect(contentType)
|
|
203
|
-
}, (0, _get.default)(contentType, 'name', 'Untitled'))) :
|
|
195
|
+
}, (0, _get.default)(contentType, 'name', 'Untitled'))) : _react.default.createElement(_f36components.Menu.Item, {
|
|
204
196
|
testId: "add-entru-menu-search-results"
|
|
205
197
|
}, "No results found"))));
|
|
206
198
|
};
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", {
|
|
3
3
|
value: true
|
|
4
4
|
});
|
|
5
|
-
const _react =
|
|
5
|
+
const _react = _interop_require_wildcard(require("react"));
|
|
6
6
|
const _f36components = require("@contentful/f36-components");
|
|
7
7
|
require("@testing-library/jest-dom/extend-expect");
|
|
8
8
|
const _react1 = require("@testing-library/react");
|
|
9
|
-
const _noop =
|
|
10
|
-
const _fill =
|
|
9
|
+
const _noop = _interop_require_default(require("lodash/noop"));
|
|
10
|
+
const _fill = _interop_require_default(require("lodash/fill"));
|
|
11
11
|
const _CreateEntryMenuTrigger = require("./CreateEntryMenuTrigger");
|
|
12
12
|
function _interop_require_default(obj) {
|
|
13
13
|
return obj && obj.__esModule ? obj : {
|
|
@@ -89,7 +89,7 @@ describe('CreateEntryMenuTrigger general', ()=>{
|
|
|
89
89
|
};
|
|
90
90
|
let stub = jest.fn();
|
|
91
91
|
beforeEach(()=>{
|
|
92
|
-
stub = jest.fn().mockImplementation(()
|
|
92
|
+
stub = jest.fn().mockImplementation(()=>_react.createElement(_f36components.Button, {
|
|
93
93
|
testId: "menu-trigger"
|
|
94
94
|
}));
|
|
95
95
|
});
|
|
@@ -97,13 +97,13 @@ describe('CreateEntryMenuTrigger general', ()=>{
|
|
|
97
97
|
const stub = (api)=>{
|
|
98
98
|
expect(api.isOpen).toBe(false);
|
|
99
99
|
expect(api.isSelecting).toBe(false);
|
|
100
|
-
return
|
|
100
|
+
return _react.createElement("span", null);
|
|
101
101
|
};
|
|
102
|
-
(0, _react1.render)(
|
|
102
|
+
(0, _react1.render)(_react.createElement(_CreateEntryMenuTrigger.CreateEntryMenuTrigger, props, stub));
|
|
103
103
|
});
|
|
104
104
|
it('should set isSelecting to true in case onSelect returns a promise', async ()=>{
|
|
105
105
|
const selectStub = jest.fn(()=>new Promise((resolve)=>setTimeout(resolve, 1000)));
|
|
106
|
-
const { getAllByTestId, getByTestId } = (0, _react1.render)(
|
|
106
|
+
const { getAllByTestId, getByTestId } = (0, _react1.render)(_react.createElement(_CreateEntryMenuTrigger.CreateEntryMenuTrigger, {
|
|
107
107
|
...props,
|
|
108
108
|
onSelect: selectStub
|
|
109
109
|
}, stub));
|
|
@@ -117,7 +117,7 @@ describe('CreateEntryMenuTrigger general', ()=>{
|
|
|
117
117
|
});
|
|
118
118
|
it('should not set isSelecting to true in case onSelect is sync', async ()=>{
|
|
119
119
|
const selectStub = jest.fn();
|
|
120
|
-
const { getAllByTestId, getByTestId } = (0, _react1.render)(
|
|
120
|
+
const { getAllByTestId, getByTestId } = (0, _react1.render)(_react.createElement(_CreateEntryMenuTrigger.CreateEntryMenuTrigger, {
|
|
121
121
|
...props,
|
|
122
122
|
onSelect: selectStub
|
|
123
123
|
}, stub));
|
|
@@ -134,7 +134,7 @@ describe('CreateEntryMenuTrigger general', ()=>{
|
|
|
134
134
|
expect(selectStub).toHaveBeenCalled();
|
|
135
135
|
});
|
|
136
136
|
it('renders text input if contentTypes.length > 20', ()=>{
|
|
137
|
-
const { getByTestId } = (0, _react1.render)(
|
|
137
|
+
const { getByTestId } = (0, _react1.render)(_react.createElement(_CreateEntryMenuTrigger.CreateEntryMenuTrigger, {
|
|
138
138
|
...props,
|
|
139
139
|
contentTypes: (0, _fill.default)(Array(21), CONTENT_TYPE_3)
|
|
140
140
|
}, stub));
|
|
@@ -145,7 +145,7 @@ describe('CreateEntryMenuTrigger general', ()=>{
|
|
|
145
145
|
});
|
|
146
146
|
it('shows the search results if typed in input', ()=>{
|
|
147
147
|
const contentTypes = (0, _fill.default)((0, _fill.default)((0, _fill.default)(Array(21), CONTENT_TYPE_1, 0, 10), CONTENT_TYPE_2, 10, 20), CONTENT_TYPE_3, 20);
|
|
148
|
-
const { getByTestId, getAllByTestId } = (0, _react1.render)(
|
|
148
|
+
const { getByTestId, getAllByTestId } = (0, _react1.render)(_react.createElement(_CreateEntryMenuTrigger.CreateEntryMenuTrigger, {
|
|
149
149
|
...props,
|
|
150
150
|
contentTypes: contentTypes
|
|
151
151
|
}, stub));
|
|
@@ -178,7 +178,7 @@ describe('CreateEntryMenuTrigger general', ()=>{
|
|
|
178
178
|
expect(getByTestId('add-entru-menu-search-results').textContent).toBe('No results found');
|
|
179
179
|
});
|
|
180
180
|
it('shows suggestedContentType in the list', ()=>{
|
|
181
|
-
const { getByTestId } = (0, _react1.render)(
|
|
181
|
+
const { getByTestId } = (0, _react1.render)(_react.createElement(_CreateEntryMenuTrigger.CreateEntryMenuTrigger, {
|
|
182
182
|
...props,
|
|
183
183
|
suggestedContentTypeId: props.contentTypes[0].sys.id
|
|
184
184
|
}, stub));
|