@contentful/field-editor-reference 5.31.0 → 5.31.2
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/components/CreateEntryLinkButton/CreateEntryMenuTrigger.js +15 -7
- package/dist/cjs/components/CreateEntryLinkButton/CreateEntryMenuTrigger.spec.js +41 -0
- package/dist/esm/components/CreateEntryLinkButton/CreateEntryMenuTrigger.js +16 -8
- package/dist/esm/components/CreateEntryLinkButton/CreateEntryMenuTrigger.spec.js +41 -0
- package/dist/types/components/CreateEntryLinkButton/CreateEntryMenuTrigger.d.ts +3 -1
- package/package.json +2 -2
|
@@ -94,7 +94,7 @@ const styles = {
|
|
|
94
94
|
};
|
|
95
95
|
const CreateEntryMenuTrigger = ({ contentTypes, suggestedContentTypeId, contentTypesLabel, onSelect, testId, dropdownSettings = {
|
|
96
96
|
position: 'bottom-left'
|
|
97
|
-
}, customDropdownItems, children, menuProps })=>{
|
|
97
|
+
}, customDropdownItems, children, menuProps, filterExperienceTypes = true })=>{
|
|
98
98
|
const [isOpen, setOpen] = (0, _react.useState)(false);
|
|
99
99
|
const [isSelecting, setSelecting] = (0, _react.useState)(false);
|
|
100
100
|
const [searchInput, setSearchInput] = (0, _react.useState)('');
|
|
@@ -102,6 +102,13 @@ const CreateEntryMenuTrigger = ({ contentTypes, suggestedContentTypeId, contentT
|
|
|
102
102
|
const textField = (0, _react.useRef)(null);
|
|
103
103
|
const menuListRef = (0, _react.useRef)(null);
|
|
104
104
|
const [dropdownWidth, setDropdownWidth] = (0, _react.useState)();
|
|
105
|
+
const filteredContentTypes = (0, _react.useMemo)(()=>filterExperienceTypes ? contentTypes.filter((contentType)=>{
|
|
106
|
+
const annotations = (0, _get.default)(contentType, 'metadata.annotations.ContentType', []);
|
|
107
|
+
return !annotations.some((annotation)=>(0, _get.default)(annotation, 'sys.id') === 'Contentful:ExperienceType');
|
|
108
|
+
}) : contentTypes, [
|
|
109
|
+
contentTypes,
|
|
110
|
+
filterExperienceTypes
|
|
111
|
+
]);
|
|
105
112
|
const hasDropdown = contentTypes.length > 1 || !!customDropdownItems;
|
|
106
113
|
const closeMenu = ()=>setOpen(false);
|
|
107
114
|
(0, _react.useEffect)(()=>{
|
|
@@ -148,10 +155,10 @@ const CreateEntryMenuTrigger = ({ contentTypes, suggestedContentTypeId, contentT
|
|
|
148
155
|
const renderSearchResultsCount = (resultsLength)=>resultsLength ? _react.default.createElement(_f36components.Menu.SectionTitle, {
|
|
149
156
|
testId: "add-entru-menu-search-results"
|
|
150
157
|
}, resultsLength, " result", resultsLength > 1 ? 's' : '') : null;
|
|
151
|
-
const isSearchable =
|
|
158
|
+
const isSearchable = filteredContentTypes.length > MAX_ITEMS_WITHOUT_SEARCH;
|
|
152
159
|
const maxDropdownHeight = suggestedContentTypeId ? 300 : 250;
|
|
153
|
-
const suggestedContentType =
|
|
154
|
-
const
|
|
160
|
+
const suggestedContentType = filteredContentTypes.find((ct)=>ct.sys.id === suggestedContentTypeId);
|
|
161
|
+
const searchFilteredContentTypes = filteredContentTypes.filter((ct)=>!searchInput || (0, _get.default)(ct, 'name', 'Untitled').toLowerCase().includes(searchInput.toLowerCase()));
|
|
155
162
|
return _react.default.createElement("span", {
|
|
156
163
|
className: styles.wrapper,
|
|
157
164
|
ref: wrapper,
|
|
@@ -185,10 +192,10 @@ const CreateEntryMenuTrigger = ({ contentTypes, suggestedContentTypeId, contentT
|
|
|
185
192
|
onChange: (e)=>setSearchInput(e.target.value)
|
|
186
193
|
}), _react.default.createElement(_f36icons.SearchIcon, {
|
|
187
194
|
className: styles.searchIcon
|
|
188
|
-
})), _react.default.createElement(_f36components.Menu.Divider, null)), searchInput && renderSearchResultsCount(
|
|
195
|
+
})), _react.default.createElement(_f36components.Menu.Divider, null)), searchInput && renderSearchResultsCount(searchFilteredContentTypes.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, {
|
|
189
196
|
testId: "suggested",
|
|
190
197
|
onClick: ()=>handleSelect(suggestedContentType)
|
|
191
|
-
}, (0, _get.default)(suggestedContentType, 'name')), _react.default.createElement(_f36components.Menu.Divider, null)), !searchInput && _react.default.createElement(_f36components.Menu.SectionTitle, null, contentTypesLabel),
|
|
198
|
+
}, (0, _get.default)(suggestedContentType, 'name')), _react.default.createElement(_f36components.Menu.Divider, null)), !searchInput && _react.default.createElement(_f36components.Menu.SectionTitle, null, contentTypesLabel), searchFilteredContentTypes.length ? searchFilteredContentTypes.map((contentType, i)=>_react.default.createElement(_f36components.Menu.Item, {
|
|
192
199
|
testId: "contentType",
|
|
193
200
|
key: `${(0, _get.default)(contentType, 'name')}-${i}`,
|
|
194
201
|
onClick: ()=>handleSelect(contentType)
|
|
@@ -198,5 +205,6 @@ const CreateEntryMenuTrigger = ({ contentTypes, suggestedContentTypeId, contentT
|
|
|
198
205
|
};
|
|
199
206
|
CreateEntryMenuTrigger.defaultProps = {
|
|
200
207
|
testId: 'create-entry-button-menu-trigger',
|
|
201
|
-
contentTypesLabel: 'All Content Types'
|
|
208
|
+
contentTypesLabel: 'All Content Types',
|
|
209
|
+
filterExperienceTypes: true
|
|
202
210
|
};
|
|
@@ -76,6 +76,25 @@ const CONTENT_TYPE_3 = {
|
|
|
76
76
|
id: 'ID_3'
|
|
77
77
|
}
|
|
78
78
|
};
|
|
79
|
+
const EXPERIENCE_TYPE = {
|
|
80
|
+
name: 'experience-type',
|
|
81
|
+
sys: {
|
|
82
|
+
id: 'ID_4'
|
|
83
|
+
},
|
|
84
|
+
metadata: {
|
|
85
|
+
annotations: {
|
|
86
|
+
ContentType: [
|
|
87
|
+
{
|
|
88
|
+
sys: {
|
|
89
|
+
id: 'Contentful:ExperienceType',
|
|
90
|
+
type: 'Link',
|
|
91
|
+
linkType: 'Annotation'
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
]
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
};
|
|
79
98
|
describe('CreateEntryMenuTrigger general', ()=>{
|
|
80
99
|
const props = {
|
|
81
100
|
contentTypes: [
|
|
@@ -189,4 +208,26 @@ describe('CreateEntryMenuTrigger general', ()=>{
|
|
|
189
208
|
expect(suggestedContentType).toBeDefined();
|
|
190
209
|
expect(suggestedContentType.textContent).toBe(props.contentTypes[0].name);
|
|
191
210
|
});
|
|
211
|
+
it('filters out content types with Contentful:ExperienceType annotation', ()=>{
|
|
212
|
+
const contentTypesWithExperience = [
|
|
213
|
+
CONTENT_TYPE_1,
|
|
214
|
+
CONTENT_TYPE_2,
|
|
215
|
+
CONTENT_TYPE_3,
|
|
216
|
+
EXPERIENCE_TYPE
|
|
217
|
+
];
|
|
218
|
+
const { getByTestId, getAllByTestId } = (0, _react1.render)(_react.createElement(_CreateEntryMenuTrigger.CreateEntryMenuTrigger, {
|
|
219
|
+
...props,
|
|
220
|
+
contentTypes: contentTypesWithExperience
|
|
221
|
+
}, stub));
|
|
222
|
+
(0, _react1.act)(()=>{
|
|
223
|
+
_react1.fireEvent.click(getByTestId('menu-trigger'));
|
|
224
|
+
});
|
|
225
|
+
const contentTypeItems = getAllByTestId('contentType');
|
|
226
|
+
expect(contentTypeItems).toHaveLength(3);
|
|
227
|
+
expect(contentTypeItems[0].textContent).toBe('name-1');
|
|
228
|
+
expect(contentTypeItems[1].textContent).toBe('name-2');
|
|
229
|
+
expect(contentTypeItems[2].textContent).toBe('name-3');
|
|
230
|
+
const experienceTypeItem = contentTypeItems.find((item)=>item.textContent === 'experience-type');
|
|
231
|
+
expect(experienceTypeItem).toBeUndefined();
|
|
232
|
+
});
|
|
192
233
|
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, { useState, useRef, useEffect } from 'react';
|
|
1
|
+
import React, { useState, useRef, useEffect, useMemo } from 'react';
|
|
2
2
|
import { TextInput, Menu } from '@contentful/f36-components';
|
|
3
3
|
import { SearchIcon } from '@contentful/f36-icons';
|
|
4
4
|
import tokens from '@contentful/f36-tokens';
|
|
@@ -38,7 +38,7 @@ const styles = {
|
|
|
38
38
|
};
|
|
39
39
|
export const CreateEntryMenuTrigger = ({ contentTypes, suggestedContentTypeId, contentTypesLabel, onSelect, testId, dropdownSettings = {
|
|
40
40
|
position: 'bottom-left'
|
|
41
|
-
}, customDropdownItems, children, menuProps })=>{
|
|
41
|
+
}, customDropdownItems, children, menuProps, filterExperienceTypes = true })=>{
|
|
42
42
|
const [isOpen, setOpen] = useState(false);
|
|
43
43
|
const [isSelecting, setSelecting] = useState(false);
|
|
44
44
|
const [searchInput, setSearchInput] = useState('');
|
|
@@ -46,6 +46,13 @@ export const CreateEntryMenuTrigger = ({ contentTypes, suggestedContentTypeId, c
|
|
|
46
46
|
const textField = useRef(null);
|
|
47
47
|
const menuListRef = useRef(null);
|
|
48
48
|
const [dropdownWidth, setDropdownWidth] = useState();
|
|
49
|
+
const filteredContentTypes = useMemo(()=>filterExperienceTypes ? contentTypes.filter((contentType)=>{
|
|
50
|
+
const annotations = get(contentType, 'metadata.annotations.ContentType', []);
|
|
51
|
+
return !annotations.some((annotation)=>get(annotation, 'sys.id') === 'Contentful:ExperienceType');
|
|
52
|
+
}) : contentTypes, [
|
|
53
|
+
contentTypes,
|
|
54
|
+
filterExperienceTypes
|
|
55
|
+
]);
|
|
49
56
|
const hasDropdown = contentTypes.length > 1 || !!customDropdownItems;
|
|
50
57
|
const closeMenu = ()=>setOpen(false);
|
|
51
58
|
useEffect(()=>{
|
|
@@ -92,10 +99,10 @@ export const CreateEntryMenuTrigger = ({ contentTypes, suggestedContentTypeId, c
|
|
|
92
99
|
const renderSearchResultsCount = (resultsLength)=>resultsLength ? React.createElement(Menu.SectionTitle, {
|
|
93
100
|
testId: "add-entru-menu-search-results"
|
|
94
101
|
}, resultsLength, " result", resultsLength > 1 ? 's' : '') : null;
|
|
95
|
-
const isSearchable =
|
|
102
|
+
const isSearchable = filteredContentTypes.length > MAX_ITEMS_WITHOUT_SEARCH;
|
|
96
103
|
const maxDropdownHeight = suggestedContentTypeId ? 300 : 250;
|
|
97
|
-
const suggestedContentType =
|
|
98
|
-
const
|
|
104
|
+
const suggestedContentType = filteredContentTypes.find((ct)=>ct.sys.id === suggestedContentTypeId);
|
|
105
|
+
const searchFilteredContentTypes = filteredContentTypes.filter((ct)=>!searchInput || get(ct, 'name', 'Untitled').toLowerCase().includes(searchInput.toLowerCase()));
|
|
99
106
|
return React.createElement("span", {
|
|
100
107
|
className: styles.wrapper,
|
|
101
108
|
ref: wrapper,
|
|
@@ -129,10 +136,10 @@ export const CreateEntryMenuTrigger = ({ contentTypes, suggestedContentTypeId, c
|
|
|
129
136
|
onChange: (e)=>setSearchInput(e.target.value)
|
|
130
137
|
}), React.createElement(SearchIcon, {
|
|
131
138
|
className: styles.searchIcon
|
|
132
|
-
})), React.createElement(Menu.Divider, null)), searchInput && renderSearchResultsCount(
|
|
139
|
+
})), React.createElement(Menu.Divider, null)), searchInput && renderSearchResultsCount(searchFilteredContentTypes.length), suggestedContentType && !searchInput && React.createElement(React.Fragment, null, React.createElement(Menu.SectionTitle, null, "Suggested Content Type"), React.createElement(Menu.Item, {
|
|
133
140
|
testId: "suggested",
|
|
134
141
|
onClick: ()=>handleSelect(suggestedContentType)
|
|
135
|
-
}, get(suggestedContentType, 'name')), React.createElement(Menu.Divider, null)), !searchInput && React.createElement(Menu.SectionTitle, null, contentTypesLabel),
|
|
142
|
+
}, get(suggestedContentType, 'name')), React.createElement(Menu.Divider, null)), !searchInput && React.createElement(Menu.SectionTitle, null, contentTypesLabel), searchFilteredContentTypes.length ? searchFilteredContentTypes.map((contentType, i)=>React.createElement(Menu.Item, {
|
|
136
143
|
testId: "contentType",
|
|
137
144
|
key: `${get(contentType, 'name')}-${i}`,
|
|
138
145
|
onClick: ()=>handleSelect(contentType)
|
|
@@ -142,5 +149,6 @@ export const CreateEntryMenuTrigger = ({ contentTypes, suggestedContentTypeId, c
|
|
|
142
149
|
};
|
|
143
150
|
CreateEntryMenuTrigger.defaultProps = {
|
|
144
151
|
testId: 'create-entry-button-menu-trigger',
|
|
145
|
-
contentTypesLabel: 'All Content Types'
|
|
152
|
+
contentTypesLabel: 'All Content Types',
|
|
153
|
+
filterExperienceTypes: true
|
|
146
154
|
};
|
|
@@ -26,6 +26,25 @@ const CONTENT_TYPE_3 = {
|
|
|
26
26
|
id: 'ID_3'
|
|
27
27
|
}
|
|
28
28
|
};
|
|
29
|
+
const EXPERIENCE_TYPE = {
|
|
30
|
+
name: 'experience-type',
|
|
31
|
+
sys: {
|
|
32
|
+
id: 'ID_4'
|
|
33
|
+
},
|
|
34
|
+
metadata: {
|
|
35
|
+
annotations: {
|
|
36
|
+
ContentType: [
|
|
37
|
+
{
|
|
38
|
+
sys: {
|
|
39
|
+
id: 'Contentful:ExperienceType',
|
|
40
|
+
type: 'Link',
|
|
41
|
+
linkType: 'Annotation'
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
]
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
};
|
|
29
48
|
describe('CreateEntryMenuTrigger general', ()=>{
|
|
30
49
|
const props = {
|
|
31
50
|
contentTypes: [
|
|
@@ -139,4 +158,26 @@ describe('CreateEntryMenuTrigger general', ()=>{
|
|
|
139
158
|
expect(suggestedContentType).toBeDefined();
|
|
140
159
|
expect(suggestedContentType.textContent).toBe(props.contentTypes[0].name);
|
|
141
160
|
});
|
|
161
|
+
it('filters out content types with Contentful:ExperienceType annotation', ()=>{
|
|
162
|
+
const contentTypesWithExperience = [
|
|
163
|
+
CONTENT_TYPE_1,
|
|
164
|
+
CONTENT_TYPE_2,
|
|
165
|
+
CONTENT_TYPE_3,
|
|
166
|
+
EXPERIENCE_TYPE
|
|
167
|
+
];
|
|
168
|
+
const { getByTestId, getAllByTestId } = render(React.createElement(CreateEntryMenuTrigger, {
|
|
169
|
+
...props,
|
|
170
|
+
contentTypes: contentTypesWithExperience
|
|
171
|
+
}, stub));
|
|
172
|
+
act(()=>{
|
|
173
|
+
fireEvent.click(getByTestId('menu-trigger'));
|
|
174
|
+
});
|
|
175
|
+
const contentTypeItems = getAllByTestId('contentType');
|
|
176
|
+
expect(contentTypeItems).toHaveLength(3);
|
|
177
|
+
expect(contentTypeItems[0].textContent).toBe('name-1');
|
|
178
|
+
expect(contentTypeItems[1].textContent).toBe('name-2');
|
|
179
|
+
expect(contentTypeItems[2].textContent).toBe('name-3');
|
|
180
|
+
const experienceTypeItem = contentTypeItems.find((item)=>item.textContent === 'experience-type');
|
|
181
|
+
expect(experienceTypeItem).toBeUndefined();
|
|
182
|
+
});
|
|
142
183
|
});
|
|
@@ -22,12 +22,14 @@ interface CreateEntryMenuTrigger {
|
|
|
22
22
|
customDropdownItems?: React.ReactNode;
|
|
23
23
|
children: CreateEntryMenuTriggerChild;
|
|
24
24
|
menuProps?: Omit<MenuProps, 'children'>;
|
|
25
|
+
filterExperienceTypes?: boolean;
|
|
25
26
|
}
|
|
26
27
|
export declare const CreateEntryMenuTrigger: {
|
|
27
|
-
({ contentTypes, suggestedContentTypeId, contentTypesLabel, onSelect, testId, dropdownSettings, customDropdownItems, children, menuProps, }: CreateEntryMenuTrigger): React.JSX.Element;
|
|
28
|
+
({ contentTypes, suggestedContentTypeId, contentTypesLabel, onSelect, testId, dropdownSettings, customDropdownItems, children, menuProps, filterExperienceTypes, }: CreateEntryMenuTrigger): React.JSX.Element;
|
|
28
29
|
defaultProps: {
|
|
29
30
|
testId: string;
|
|
30
31
|
contentTypesLabel: string;
|
|
32
|
+
filterExperienceTypes: boolean;
|
|
31
33
|
};
|
|
32
34
|
};
|
|
33
35
|
export {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@contentful/field-editor-reference",
|
|
3
|
-
"version": "5.31.
|
|
3
|
+
"version": "5.31.2",
|
|
4
4
|
"main": "dist/cjs/index.js",
|
|
5
5
|
"module": "dist/esm/index.js",
|
|
6
6
|
"types": "dist/types/index.d.ts",
|
|
@@ -64,5 +64,5 @@
|
|
|
64
64
|
"publishConfig": {
|
|
65
65
|
"registry": "https://npm.pkg.github.com/"
|
|
66
66
|
},
|
|
67
|
-
"gitHead": "
|
|
67
|
+
"gitHead": "eb3a6f6fd6b37d1ec6fb83dc8401a55ebfe4ff68"
|
|
68
68
|
}
|