-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathEntityTokenField.js
More file actions
52 lines (43 loc) · 1.5 KB
/
Copy pathEntityTokenField.js
File metadata and controls
52 lines (43 loc) · 1.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
// Modified snippet: https://gist.github.com/florianbrinkmann/167939b3e0a8c33a5ae3f1c0dc561859
// WordPress dependencies.
const { FormTokenField } = wp.components;
const { useContext } = wp.element;
const { withSelect } = wp.data;
const EntityTokenField = ({ entity, items, value, onChange, ...restProps }) => {
const selectedItems = value ?? [];
let suggestions = [];
let internalValue = [];
const getDisplayValue = (item) => {
switch (entity) {
case 'postType':
return item.title.rendered;
case 'taxonomy':
return item.name;
}
};
if (items) {
suggestions = items.map((item) => getDisplayValue(item));
internalValue = selectedItems.map((itemId) => {
let matchedPost = items.find((item) => item.id === itemId);
return matchedPost ? getDisplayValue(matchedPost) : false;
});
}
const internalOnChange = (selectedItems) => {
let selectedItemsArray = [];
selectedItems.map((itemName) => {
const matchingItem = items.find((item) => getDisplayValue(item) === itemName);
if (matchingItem) {
selectedItemsArray.push(matchingItem.id);
}
});
onChange(selectedItemsArray);
};
return <FormTokenField
{ ...restProps }
value={ internalValue }
suggestions={ suggestions }
maxSuggestions={ 20 }
onChange={ internalOnChange }
/>;
};
export default withSelect((select, { entity, type, args = {} }) => ({ items: select('core').getEntityRecords(entity, type, { per_page: -1, ...args }) }))(EntityTokenField);