@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
|
@@ -22,17 +22,13 @@ function mockSdkForField(fieldDefinition, fieldValue) {
|
|
|
22
22
|
getValue: jest.fn(()=>fieldValue),
|
|
23
23
|
setValue: jest.fn(()=>Promise.resolve(undefined)),
|
|
24
24
|
removeValue: jest.fn(),
|
|
25
|
-
// eslint-disable-next-line -- test helper
|
|
26
25
|
onSchemaErrorsChanged: ()=>{},
|
|
27
|
-
// eslint-disable-next-line -- test helper
|
|
28
26
|
onIsDisabledChanged: ()=>{},
|
|
29
|
-
// eslint-disable-next-line -- test helper
|
|
30
27
|
onValueChanged: ()=>{},
|
|
31
28
|
...fieldDefinition,
|
|
32
29
|
locale: 'en'
|
|
33
30
|
},
|
|
34
31
|
dialogs: {
|
|
35
|
-
// @ts-expect-error wait app-sdk version update
|
|
36
32
|
selectSingleResourceEntry: jest.fn().mockResolvedValue({
|
|
37
33
|
sys: {
|
|
38
34
|
type: 'Entry',
|
|
@@ -72,11 +68,8 @@ function mockSdkForField(fieldDefinition, fieldValue) {
|
|
|
72
68
|
contentType: 'testCT'
|
|
73
69
|
},
|
|
74
70
|
space: {
|
|
75
|
-
// @ts-expect-error wait app-sdk version update
|
|
76
|
-
// eslint-disable-next-line -- test helper
|
|
77
71
|
onEntityChanged: ()=>{}
|
|
78
72
|
},
|
|
79
|
-
// @ts-expect-error
|
|
80
73
|
navigator: {
|
|
81
74
|
onSlideInNavigation: ()=>()=>({})
|
|
82
75
|
}
|
|
@@ -51,14 +51,10 @@ function useResourceLinkActions({ dialogs, field, onAfterLink, apiUrl }) {
|
|
|
51
51
|
]);
|
|
52
52
|
const multiple = field.type === 'Array';
|
|
53
53
|
const onLinkExisting = (0, _react.useMemo)(()=>{
|
|
54
|
-
const promptSelection = multiple ? async ()
|
|
55
|
-
await dialogs.selectMultipleResourceEntries({
|
|
56
|
-
// @ts-expect-error wait for update of app-sdk version
|
|
54
|
+
const promptSelection = multiple ? async ()=>await dialogs.selectMultipleResourceEntries({
|
|
57
55
|
allowedResources: field.allowedResources
|
|
58
56
|
}) : async ()=>[
|
|
59
|
-
// @ts-expect-error wait for update of app-sdk version
|
|
60
57
|
await dialogs.selectSingleResourceEntry({
|
|
61
|
-
// @ts-expect-error wait for update of app-sdk version
|
|
62
58
|
allowedResources: field.allowedResources
|
|
63
59
|
})
|
|
64
60
|
];
|
|
@@ -69,7 +65,6 @@ function useResourceLinkActions({ dialogs, field, onAfterLink, apiUrl }) {
|
|
|
69
65
|
}
|
|
70
66
|
onLinkedExisting(res);
|
|
71
67
|
};
|
|
72
|
-
// @ts-expect-error wait for update of app-sdk version
|
|
73
68
|
}, [
|
|
74
69
|
dialogs,
|
|
75
70
|
field.allowedResources,
|
|
@@ -78,9 +73,7 @@ function useResourceLinkActions({ dialogs, field, onAfterLink, apiUrl }) {
|
|
|
78
73
|
]);
|
|
79
74
|
return {
|
|
80
75
|
onLinkExisting,
|
|
81
|
-
// @ts-expect-error
|
|
82
76
|
onLinkedExisting,
|
|
83
|
-
// hardcoded values to match interface for standard reference field actions
|
|
84
77
|
entityType: 'Entry',
|
|
85
78
|
contentTypes: [],
|
|
86
79
|
canCreateEntity: false,
|
|
@@ -89,9 +82,7 @@ function useResourceLinkActions({ dialogs, field, onAfterLink, apiUrl }) {
|
|
|
89
82
|
isDisabled: false,
|
|
90
83
|
isEmpty: false,
|
|
91
84
|
isFull: false,
|
|
92
|
-
// eslint-disable-next-line -- hardcoded values to match interface for standard reference field actions
|
|
93
85
|
onCreate: async ()=>{},
|
|
94
|
-
// eslint-disable-next-line -- hardcoded values to match interface for standard reference field actions
|
|
95
86
|
onCreated: ()=>{}
|
|
96
87
|
};
|
|
97
88
|
}
|
|
@@ -8,14 +8,13 @@ Object.defineProperty(exports, "fromFieldValidations", {
|
|
|
8
8
|
return fromFieldValidations;
|
|
9
9
|
}
|
|
10
10
|
});
|
|
11
|
-
const _isNumber =
|
|
11
|
+
const _isNumber = _interop_require_default(require("lodash/isNumber"));
|
|
12
12
|
function _interop_require_default(obj) {
|
|
13
13
|
return obj && obj.__esModule ? obj : {
|
|
14
14
|
default: obj
|
|
15
15
|
};
|
|
16
16
|
}
|
|
17
17
|
function fromFieldValidations(field) {
|
|
18
|
-
// eslint-disable-next-line -- TODO: describe this disable @typescript-eslint/no-explicit-any
|
|
19
18
|
const validations = [
|
|
20
19
|
...field.validations,
|
|
21
20
|
...field.type === 'Array' ? field.items?.validations ?? [] : []
|
|
@@ -8,7 +8,7 @@ Object.defineProperty(exports, "useSortIDs", {
|
|
|
8
8
|
return useSortIDs;
|
|
9
9
|
}
|
|
10
10
|
});
|
|
11
|
-
const _react =
|
|
11
|
+
const _react = _interop_require_wildcard(require("react"));
|
|
12
12
|
const _sortable = require("@dnd-kit/sortable");
|
|
13
13
|
function _getRequireWildcardCache(nodeInterop) {
|
|
14
14
|
if (typeof WeakMap !== "function") return null;
|
|
@@ -12,16 +12,16 @@ const styles = {
|
|
|
12
12
|
})
|
|
13
13
|
};
|
|
14
14
|
export function MultipleMediaEditor(props) {
|
|
15
|
-
return
|
|
15
|
+
return React.createElement(MultipleReferenceEditor, {
|
|
16
16
|
...props,
|
|
17
17
|
entityType: "Asset"
|
|
18
|
-
}, (childrenProps)
|
|
18
|
+
}, (childrenProps)=>React.createElement(SortableLinkList, {
|
|
19
19
|
...childrenProps,
|
|
20
20
|
sortingStrategy: childrenProps.viewType === 'card' ? rectSortingStrategy : verticalListSortingStrategy,
|
|
21
21
|
className: cx({
|
|
22
22
|
[styles.gridContainer]: childrenProps.viewType === 'card'
|
|
23
23
|
})
|
|
24
|
-
}, ({ items, item, index, isDisabled, DragHandle })
|
|
24
|
+
}, ({ items, item, index, isDisabled, DragHandle })=>React.createElement(FetchingWrappedAssetCard, {
|
|
25
25
|
...childrenProps,
|
|
26
26
|
isDisabled: isDisabled,
|
|
27
27
|
key: `${item.sys.id}-${index}`,
|
|
@@ -2,10 +2,10 @@ import * as React from 'react';
|
|
|
2
2
|
import { SingleReferenceEditor } from '../common/SingleReferenceEditor';
|
|
3
3
|
import { FetchingWrappedAssetCard } from './WrappedAssetCard/FetchingWrappedAssetCard';
|
|
4
4
|
export function SingleMediaEditor(props) {
|
|
5
|
-
return
|
|
5
|
+
return React.createElement(SingleReferenceEditor, {
|
|
6
6
|
...props,
|
|
7
7
|
entityType: "Asset"
|
|
8
|
-
}, ({ entityId, isDisabled, setValue })
|
|
8
|
+
}, ({ entityId, isDisabled, setValue })=>React.createElement(FetchingWrappedAssetCard, {
|
|
9
9
|
...props,
|
|
10
10
|
viewType: "big_card",
|
|
11
11
|
assetId: entityId,
|
|
@@ -48,36 +48,36 @@ export function renderAssetInfo(props) {
|
|
|
48
48
|
const fileSize = get(entityFile, 'details.size');
|
|
49
49
|
const image = get(entityFile, 'details.image');
|
|
50
50
|
return [
|
|
51
|
-
|
|
51
|
+
React.createElement(Menu.SectionTitle, {
|
|
52
52
|
key: "file-section"
|
|
53
53
|
}, "File info"),
|
|
54
|
-
|
|
54
|
+
React.createElement(Menu.Item, {
|
|
55
55
|
key: "file-information",
|
|
56
56
|
className: styles.fileInformation.menuItem,
|
|
57
57
|
isDisabled: true
|
|
58
|
-
},
|
|
58
|
+
}, React.createElement("dl", {
|
|
59
59
|
className: styles.fileInformation.dl
|
|
60
|
-
}, fileName &&
|
|
60
|
+
}, fileName && React.createElement(React.Fragment, null, React.createElement("dt", null, "File Name:"), React.createElement(Text, {
|
|
61
61
|
as: "dd",
|
|
62
62
|
isTruncated: true
|
|
63
|
-
}, fileName)), mimeType &&
|
|
63
|
+
}, fileName)), mimeType && React.createElement(React.Fragment, null, React.createElement("dt", null, "File Type:"), React.createElement(Text, {
|
|
64
64
|
as: "dd",
|
|
65
65
|
isTruncated: true
|
|
66
|
-
}, mimeType)), fileSize &&
|
|
66
|
+
}, mimeType)), fileSize && React.createElement(React.Fragment, null, React.createElement("dt", null, "Size:"), React.createElement("dd", null, shortenStorageUnit(fileSize, 'B'))), image && React.createElement(React.Fragment, null, React.createElement("dt", null, "Dimensions:"), React.createElement("dd", null, `${image.width} × ${image.height}`))))
|
|
67
67
|
];
|
|
68
68
|
}
|
|
69
69
|
export function renderActions(props) {
|
|
70
70
|
const { entityFile, isDisabled, onEdit, onRemove } = props;
|
|
71
71
|
return [
|
|
72
|
-
|
|
72
|
+
React.createElement(Menu.SectionTitle, {
|
|
73
73
|
key: "section-title"
|
|
74
74
|
}, "Actions"),
|
|
75
|
-
onEdit ?
|
|
75
|
+
onEdit ? React.createElement(Menu.Item, {
|
|
76
76
|
key: "edit",
|
|
77
77
|
onClick: onEdit,
|
|
78
78
|
testId: "card-action-edit"
|
|
79
79
|
}, "Edit") : null,
|
|
80
|
-
entityFile ?
|
|
80
|
+
entityFile ? React.createElement(Menu.Item, {
|
|
81
81
|
key: "download",
|
|
82
82
|
onClick: ()=>{
|
|
83
83
|
if (typeof entityFile.url === 'string') {
|
|
@@ -86,7 +86,7 @@ export function renderActions(props) {
|
|
|
86
86
|
},
|
|
87
87
|
testId: "card-action-download"
|
|
88
88
|
}, "Download") : null,
|
|
89
|
-
onRemove ?
|
|
89
|
+
onRemove ? React.createElement(Menu.Item, {
|
|
90
90
|
key: "remove",
|
|
91
91
|
disabled: isDisabled,
|
|
92
92
|
onClick: onRemove,
|
|
@@ -18,7 +18,6 @@ export function FetchingWrappedAssetCard(props) {
|
|
|
18
18
|
entity: 'Asset'
|
|
19
19
|
});
|
|
20
20
|
}
|
|
21
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps -- TODO: Evaluate the dependencies
|
|
22
21
|
}, [
|
|
23
22
|
asset
|
|
24
23
|
]);
|
|
@@ -45,7 +44,7 @@ export function FetchingWrappedAssetCard(props) {
|
|
|
45
44
|
};
|
|
46
45
|
return React.useMemo(()=>{
|
|
47
46
|
if (status === 'error') {
|
|
48
|
-
const card =
|
|
47
|
+
const card = React.createElement(MissingEntityCard, {
|
|
49
48
|
entityType: "Asset",
|
|
50
49
|
asSquare: props.viewType !== 'link',
|
|
51
50
|
isDisabled: props.isDisabled,
|
|
@@ -77,48 +76,44 @@ export function FetchingWrappedAssetCard(props) {
|
|
|
77
76
|
};
|
|
78
77
|
if (props.viewType === 'link') {
|
|
79
78
|
if (status === 'loading') {
|
|
80
|
-
return
|
|
79
|
+
return React.createElement(EntryCard, {
|
|
81
80
|
size: "small",
|
|
82
81
|
isLoading: true
|
|
83
82
|
});
|
|
84
83
|
}
|
|
85
|
-
return
|
|
84
|
+
return React.createElement(WrappedAssetLink, {
|
|
86
85
|
...commonProps,
|
|
87
86
|
href: commonProps.entityUrl,
|
|
88
87
|
getEntityScheduledActions: loadEntityScheduledActions
|
|
89
88
|
});
|
|
90
89
|
}
|
|
91
90
|
if (status === 'loading') {
|
|
92
|
-
return
|
|
91
|
+
return React.createElement(AssetCard, {
|
|
93
92
|
size: size,
|
|
94
93
|
isLoading: true
|
|
95
94
|
});
|
|
96
95
|
}
|
|
97
96
|
function renderDefaultCard(props) {
|
|
98
|
-
// isClickable has a default value, so omit it from the props
|
|
99
97
|
const builtinCardProps = {
|
|
100
98
|
...commonProps,
|
|
101
99
|
...props,
|
|
102
100
|
getEntityScheduledActions: loadEntityScheduledActions,
|
|
103
|
-
asset:
|
|
101
|
+
asset: props?.entity || commonProps.asset,
|
|
104
102
|
getAssetUrl: getEntityUrl
|
|
105
103
|
};
|
|
106
|
-
return
|
|
104
|
+
return React.createElement(WrappedAssetCard, builtinCardProps);
|
|
107
105
|
}
|
|
108
106
|
if (props.renderCustomCard) {
|
|
109
107
|
const customProps = {
|
|
110
108
|
...commonProps,
|
|
111
109
|
entity: commonProps.asset
|
|
112
110
|
};
|
|
113
|
-
// LinkActionsProps are injected higher SingleReferenceEditor/MultipleReferenceEditor
|
|
114
111
|
const renderedCustomCard = props.renderCustomCard(customProps, {}, renderDefaultCard);
|
|
115
|
-
// Only `false` indicates to render the original card. E.g. `null` would result in no card.
|
|
116
112
|
if (renderedCustomCard !== false) {
|
|
117
113
|
return renderedCustomCard;
|
|
118
114
|
}
|
|
119
115
|
}
|
|
120
116
|
return renderDefaultCard();
|
|
121
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps -- TODO: Evaluate the dependencies
|
|
122
117
|
}, [
|
|
123
118
|
props,
|
|
124
119
|
status,
|
|
@@ -3,7 +3,6 @@ import { AssetCard } from '@contentful/f36-components';
|
|
|
3
3
|
import { ClockIcon } from '@contentful/f36-icons';
|
|
4
4
|
import tokens from '@contentful/f36-tokens';
|
|
5
5
|
import { entityHelpers } from '@contentful/field-editor-shared';
|
|
6
|
-
// @ts-expect-error
|
|
7
6
|
import mimetype from '@contentful/mimetype';
|
|
8
7
|
import { css } from 'emotion';
|
|
9
8
|
import { MissingEntityCard, ScheduledIconWithTooltip } from '../../components';
|
|
@@ -29,7 +28,6 @@ const styles = {
|
|
|
29
28
|
const defaultProps = {
|
|
30
29
|
isClickable: true
|
|
31
30
|
};
|
|
32
|
-
// eslint-disable-next-line -- TODO: describe this disable @typescript-eslint/no-explicit-any
|
|
33
31
|
function getFileType(file) {
|
|
34
32
|
if (!file) {
|
|
35
33
|
return 'archive';
|
|
@@ -42,10 +40,9 @@ function getFileType(file) {
|
|
|
42
40
|
}
|
|
43
41
|
export const WrappedAssetCard = (props)=>{
|
|
44
42
|
const { className, onEdit, getAssetUrl, onRemove, size, isDisabled, isSelected, isClickable } = props;
|
|
45
|
-
// @ts-expect-error
|
|
46
43
|
const status = entityHelpers.getEntryStatus(props.asset.sys);
|
|
47
44
|
if (status === 'deleted') {
|
|
48
|
-
return
|
|
45
|
+
return React.createElement(MissingEntityCard, {
|
|
49
46
|
entityType: "Asset",
|
|
50
47
|
asSquare: true,
|
|
51
48
|
isDisabled: props.isDisabled,
|
|
@@ -60,7 +57,7 @@ export const WrappedAssetCard = (props)=>{
|
|
|
60
57
|
});
|
|
61
58
|
const entityFile = props.asset.fields.file ? props.asset.fields.file[props.localeCode] || props.asset.fields.file[props.defaultLocaleCode] : undefined;
|
|
62
59
|
const href = getAssetUrl ? getAssetUrl(props.asset.sys.id) : undefined;
|
|
63
|
-
return
|
|
60
|
+
return React.createElement(AssetCard, {
|
|
64
61
|
as: href ? 'a' : 'article',
|
|
65
62
|
type: getFileType(entityFile),
|
|
66
63
|
title: entityTitle,
|
|
@@ -68,27 +65,22 @@ export const WrappedAssetCard = (props)=>{
|
|
|
68
65
|
isSelected: isSelected,
|
|
69
66
|
href: href,
|
|
70
67
|
status: status,
|
|
71
|
-
icon:
|
|
68
|
+
icon: React.createElement(ScheduledIconWithTooltip, {
|
|
72
69
|
getEntityScheduledActions: props.getEntityScheduledActions,
|
|
73
70
|
entityType: "Asset",
|
|
74
71
|
entityId: props.asset.sys.id
|
|
75
|
-
},
|
|
72
|
+
}, React.createElement(ClockIcon, {
|
|
76
73
|
className: styles.scheduleIcon,
|
|
77
74
|
size: "small",
|
|
78
75
|
variant: "muted",
|
|
79
76
|
testId: "schedule-icon"
|
|
80
77
|
})),
|
|
81
78
|
src: entityFile && entityFile.url ? size === 'small' ? `${entityFile.url}?w=150&h=150&fit=thumb` : `${entityFile.url}?h=300` : '',
|
|
82
|
-
onClick:
|
|
83
|
-
// features e.g. pressing ENTER on a card to add a new paragraph
|
|
84
|
-
// underneath. It's crucial not to pass a custom handler when
|
|
85
|
-
// isClickable is disabled which in the case of RT it's.
|
|
86
|
-
isClickable ? (e)=>{
|
|
79
|
+
onClick: isClickable ? (e)=>{
|
|
87
80
|
e.preventDefault();
|
|
88
81
|
onEdit && onEdit();
|
|
89
82
|
} : undefined,
|
|
90
|
-
|
|
91
|
-
// @ts-expect-error */ onKeyDown: isClickable ? (e)=>{
|
|
83
|
+
onKeyDown: isClickable ? (e)=>{
|
|
92
84
|
if (e.key === 'Enter' && onEdit) {
|
|
93
85
|
e.preventDefault();
|
|
94
86
|
onEdit();
|
|
@@ -13,10 +13,9 @@ const styles = {
|
|
|
13
13
|
};
|
|
14
14
|
export const WrappedAssetLink = (props)=>{
|
|
15
15
|
const { className, href, onEdit, onRemove, isDisabled } = props;
|
|
16
|
-
// @ts-expect-error
|
|
17
16
|
const status = entityHelpers.getEntryStatus(props.asset.sys);
|
|
18
17
|
if (status === 'deleted') {
|
|
19
|
-
return
|
|
18
|
+
return React.createElement(MissingEntityCard, {
|
|
20
19
|
entityType: "Asset",
|
|
21
20
|
isDisabled: props.isDisabled,
|
|
22
21
|
onRemove: props.onRemove
|
|
@@ -29,7 +28,7 @@ export const WrappedAssetLink = (props)=>{
|
|
|
29
28
|
defaultTitle: 'Untitled'
|
|
30
29
|
});
|
|
31
30
|
const entityFile = props.asset.fields.file ? props.asset.fields.file[props.localeCode] || props.asset.fields.file[props.defaultLocaleCode] : undefined;
|
|
32
|
-
return
|
|
31
|
+
return React.createElement(EntryCard, {
|
|
33
32
|
as: href ? 'a' : 'article',
|
|
34
33
|
contentType: "Asset",
|
|
35
34
|
title: entityTitle,
|
|
@@ -37,14 +36,14 @@ export const WrappedAssetLink = (props)=>{
|
|
|
37
36
|
href: href,
|
|
38
37
|
size: "small",
|
|
39
38
|
status: status,
|
|
40
|
-
thumbnailElement: entityFile && isValidImage(entityFile) ?
|
|
39
|
+
thumbnailElement: entityFile && isValidImage(entityFile) ? React.createElement(AssetThumbnail, {
|
|
41
40
|
file: entityFile
|
|
42
41
|
}) : undefined,
|
|
43
|
-
icon:
|
|
42
|
+
icon: React.createElement(ScheduledIconWithTooltip, {
|
|
44
43
|
getEntityScheduledActions: props.getEntityScheduledActions,
|
|
45
44
|
entityType: "Asset",
|
|
46
45
|
entityId: props.asset.sys.id
|
|
47
|
-
},
|
|
46
|
+
}, React.createElement(ClockIcon, {
|
|
48
47
|
className: styles.scheduleIcon,
|
|
49
48
|
size: "small",
|
|
50
49
|
variant: "muted",
|
|
@@ -16,7 +16,6 @@ import constate from 'constate';
|
|
|
16
16
|
import { createClient } from 'contentful-management';
|
|
17
17
|
import PQueue from 'p-queue';
|
|
18
18
|
import { SharedQueryClientProvider, useQuery, useQueryClient } from './queryClient';
|
|
19
|
-
// global queue for all requests, the actual number is picked without scientific research
|
|
20
19
|
const globalQueue = new PQueue({
|
|
21
20
|
concurrency: 50
|
|
22
21
|
});
|
|
@@ -35,7 +34,6 @@ const isEntityQueryKey = (queryKey)=>{
|
|
|
35
34
|
};
|
|
36
35
|
async function fetchContentfulEntry(params) {
|
|
37
36
|
const { urn, fetch, options } = params;
|
|
38
|
-
// TODO use resource-names package EntryResourceName `fromString` method instead when the package becomes public
|
|
39
37
|
const resourceId = urn.split(':', 6)[5];
|
|
40
38
|
const ENTITY_RESOURCE_ID_REGEX = RegExp("^spaces\\/(?<spaceId>[^/]+)(?:\\/environments\\/(?<environmentId>[^/]+))?\\/entries\\/(?<entityId>[^/]+)$");
|
|
41
39
|
const resourceIdMatch = resourceId.match(ENTITY_RESOURCE_ID_REGEX);
|
|
@@ -149,8 +147,7 @@ const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = cons
|
|
|
149
147
|
spaceId,
|
|
150
148
|
environmentId
|
|
151
149
|
];
|
|
152
|
-
return fetch(queryKey,
|
|
153
|
-
({ cmaClient })=>{
|
|
150
|
+
return fetch(queryKey, ({ cmaClient })=>{
|
|
154
151
|
if (entityType === 'Entry') {
|
|
155
152
|
return cmaClient.entry.get({
|
|
156
153
|
entryId: entityId,
|
|
@@ -172,18 +169,8 @@ const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = cons
|
|
|
172
169
|
currentSpaceId,
|
|
173
170
|
currentEnvironmentId
|
|
174
171
|
]);
|
|
175
|
-
|
|
176
|
-
* Fetch all scheduled actions for a given entity.
|
|
177
|
-
* This function fetches all schedules for all entries and then returns
|
|
178
|
-
* a filtered result based on the entityID provided.
|
|
179
|
-
*
|
|
180
|
-
* The result is then reused/cached for subsequent calls to this function.
|
|
181
|
-
*/ const getEntityScheduledActions = useCallback(function getEntityScheduledActions(entityType, entityId, options) {
|
|
182
|
-
// This is fixed to force the cache to reuse previous results
|
|
172
|
+
const getEntityScheduledActions = useCallback(function getEntityScheduledActions(entityType, entityId, options) {
|
|
183
173
|
const fixedEntityCacheId = 'scheduledActionEntityId';
|
|
184
|
-
// A space+environment combo can only have up to 500 scheduled actions
|
|
185
|
-
// With this request we fetch all schedules and can reuse the results.
|
|
186
|
-
// See https://www.contentful.com/developers/docs/references/content-management-api/#/reference/scheduled-actions/limitations
|
|
187
174
|
const maxScheduledActions = 500;
|
|
188
175
|
const spaceId = options?.spaceId ?? currentSpaceId;
|
|
189
176
|
const environmentId = options?.environmentId ?? currentEnvironmentId;
|
|
@@ -194,7 +181,6 @@ const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = cons
|
|
|
194
181
|
spaceId,
|
|
195
182
|
environmentId
|
|
196
183
|
];
|
|
197
|
-
// Fetch + Filter by entity ID in the end
|
|
198
184
|
return fetch(queryKey, async ({ cmaClient })=>{
|
|
199
185
|
const response = await cmaClient.scheduledActions.getMany({
|
|
200
186
|
spaceId,
|
|
@@ -239,7 +225,6 @@ const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = cons
|
|
|
239
225
|
currentSpaceId,
|
|
240
226
|
environmentIds
|
|
241
227
|
]);
|
|
242
|
-
// @ts-expect-error ...
|
|
243
228
|
const onEntityChanged = props.sdk.space.onEntityChanged;
|
|
244
229
|
const onSlideInNavigation = props.sdk.navigator.onSlideInNavigation;
|
|
245
230
|
useEffect(()=>{
|
|
@@ -253,7 +238,6 @@ const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = cons
|
|
|
253
238
|
return onSlideInNavigation(({ oldSlideLevel, newSlideLevel })=>{
|
|
254
239
|
if (oldSlideLevel > newSlideLevel) {
|
|
255
240
|
findSameSpaceQueries().forEach((query)=>{
|
|
256
|
-
// automatically refetches the query
|
|
257
241
|
void queryClient.invalidateQueries(query.queryKey);
|
|
258
242
|
});
|
|
259
243
|
}
|
|
@@ -279,7 +263,6 @@ const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = cons
|
|
|
279
263
|
subscribeQuery(query);
|
|
280
264
|
}
|
|
281
265
|
if (type === 'removed') {
|
|
282
|
-
// calling unsubscribe
|
|
283
266
|
entityChangeUnsubscribers.current[queryHash]?.();
|
|
284
267
|
}
|
|
285
268
|
});
|
|
@@ -346,6 +329,6 @@ export function useResource(resourceType, urn, options) {
|
|
|
346
329
|
};
|
|
347
330
|
}
|
|
348
331
|
function EntityProvider({ children, ...props }) {
|
|
349
|
-
return
|
|
332
|
+
return React.createElement(SharedQueryClientProvider, null, React.createElement(InternalServiceProvider, props, children));
|
|
350
333
|
}
|
|
351
334
|
export { EntityProvider, useEntityLoader };
|
|
@@ -28,11 +28,7 @@ function Editor(props) {
|
|
|
28
28
|
const { setValue, entityType, onSortingEnd, setIndexToUpdate } = props;
|
|
29
29
|
const editorPermissions = useEditorPermissions(props);
|
|
30
30
|
const items = React.useMemo(()=>{
|
|
31
|
-
return (props.items || [])
|
|
32
|
-
// value for the multiref field, replace them with an object
|
|
33
|
-
// that has the shape of a Link to make the missing entry/asset
|
|
34
|
-
// card render
|
|
35
|
-
.map((link)=>link || nullableValue);
|
|
31
|
+
return (props.items || []).map((link)=>link || nullableValue);
|
|
36
32
|
}, [
|
|
37
33
|
props.items
|
|
38
34
|
]);
|
|
@@ -41,8 +37,6 @@ function Editor(props) {
|
|
|
41
37
|
document.body.classList.add('grabbing');
|
|
42
38
|
}, []);
|
|
43
39
|
const onSortEnd = useCallback(({ oldIndex, newIndex })=>{
|
|
44
|
-
// custom callback that is invoked *before* we sort the array
|
|
45
|
-
// e.g. in Compose we want to sort the references in the referenceMap before re-rendering drag and drop
|
|
46
40
|
onSortingEnd && onSortingEnd({
|
|
47
41
|
oldIndex,
|
|
48
42
|
newIndex
|
|
@@ -86,25 +80,24 @@ function Editor(props) {
|
|
|
86
80
|
onLink,
|
|
87
81
|
itemsLength: items.length
|
|
88
82
|
});
|
|
89
|
-
const customCardRenderer = useCallback((cardProps, _, renderDefaultCard)=>props.renderCustomCard ? props.renderCustomCard(cardProps, linkActionsProps, renderDefaultCard) : false,
|
|
90
|
-
[
|
|
83
|
+
const customCardRenderer = useCallback((cardProps, _, renderDefaultCard)=>props.renderCustomCard ? props.renderCustomCard(cardProps, linkActionsProps, renderDefaultCard) : false, [
|
|
91
84
|
linkActionsProps
|
|
92
85
|
]);
|
|
93
|
-
return
|
|
86
|
+
return React.createElement(React.Fragment, null, props.children({
|
|
94
87
|
...props,
|
|
95
88
|
onSortStart,
|
|
96
89
|
onSortEnd,
|
|
97
90
|
onMove,
|
|
98
91
|
renderCustomCard: props.renderCustomCard && customCardRenderer
|
|
99
|
-
}),
|
|
92
|
+
}), React.createElement(LinkEntityActions, {
|
|
100
93
|
renderCustomActions: props.renderCustomActions,
|
|
101
94
|
...linkActionsProps
|
|
102
95
|
}));
|
|
103
96
|
}
|
|
104
97
|
export function MultipleReferenceEditor(props) {
|
|
105
98
|
const allContentTypes = props.sdk.space.getCachedContentTypes();
|
|
106
|
-
return
|
|
107
|
-
return
|
|
99
|
+
return React.createElement(ReferenceEditor, props, ({ value, disabled, setValue, externalReset })=>{
|
|
100
|
+
return React.createElement(Editor, {
|
|
108
101
|
...props,
|
|
109
102
|
items: value || emptyArray,
|
|
110
103
|
isDisabled: disabled,
|
|
@@ -3,9 +3,9 @@ import { FieldConnector } from '@contentful/field-editor-shared';
|
|
|
3
3
|
import deepEqual from 'deep-equal';
|
|
4
4
|
import { EntityProvider } from './EntityStore';
|
|
5
5
|
export function ReferenceEditor(props) {
|
|
6
|
-
return
|
|
6
|
+
return React.createElement(EntityProvider, {
|
|
7
7
|
sdk: props.sdk
|
|
8
|
-
},
|
|
8
|
+
}, React.createElement(FieldConnector, {
|
|
9
9
|
debounce: 0,
|
|
10
10
|
field: props.sdk.field,
|
|
11
11
|
isInitiallyDisabled: props.isInitiallyDisabled,
|
|
@@ -37,13 +37,11 @@ function Editor(props) {
|
|
|
37
37
|
onCreate,
|
|
38
38
|
onLink
|
|
39
39
|
});
|
|
40
|
-
|
|
41
|
-
const customCardRenderer = useCallback((cardProps, _, renderDefaultCard)=>props.renderCustomCard ? props.renderCustomCard(cardProps, linkActionsProps, renderDefaultCard) : false, // eslint-disable-next-line react-hooks/exhaustive-deps -- TODO: Evaluate the dependencies
|
|
42
|
-
[
|
|
40
|
+
const customCardRenderer = useCallback((cardProps, _, renderDefaultCard)=>props.renderCustomCard ? props.renderCustomCard(cardProps, linkActionsProps, renderDefaultCard) : false, [
|
|
43
41
|
linkActionsProps
|
|
44
42
|
]);
|
|
45
43
|
if (!props.entityId) {
|
|
46
|
-
return
|
|
44
|
+
return React.createElement(LinkEntityActions, {
|
|
47
45
|
renderCustomActions: props.renderCustomActions,
|
|
48
46
|
...linkActionsProps
|
|
49
47
|
});
|
|
@@ -55,8 +53,8 @@ function Editor(props) {
|
|
|
55
53
|
}
|
|
56
54
|
export function SingleReferenceEditor(props) {
|
|
57
55
|
const allContentTypes = props.sdk.space.getCachedContentTypes();
|
|
58
|
-
return
|
|
59
|
-
return
|
|
56
|
+
return React.createElement(ReferenceEditor, props, ({ value, setValue, disabled, externalReset })=>{
|
|
57
|
+
return React.createElement(Editor, {
|
|
60
58
|
...props,
|
|
61
59
|
key: `${externalReset}-reference`,
|
|
62
60
|
entityId: value ? value.sys.id : '',
|
|
@@ -34,16 +34,16 @@ const SortableLink = ({ id, items, item, isDisabled = false, index, children })=
|
|
|
34
34
|
};
|
|
35
35
|
const DragHandle = React.useCallback((props)=>{
|
|
36
36
|
const SortableDragHandle = ()=>props.drag;
|
|
37
|
-
return
|
|
37
|
+
return React.createElement("div", {
|
|
38
38
|
ref: setActivatorNodeRef,
|
|
39
39
|
className: styles.dragHandle,
|
|
40
40
|
...listeners
|
|
41
|
-
},
|
|
41
|
+
}, React.createElement(SortableDragHandle, null));
|
|
42
42
|
}, [
|
|
43
43
|
listeners,
|
|
44
44
|
setActivatorNodeRef
|
|
45
45
|
]);
|
|
46
|
-
return
|
|
46
|
+
return React.createElement("div", {
|
|
47
47
|
ref: setNodeRef,
|
|
48
48
|
style: style,
|
|
49
49
|
className: cx(styles.item, {
|
|
@@ -86,17 +86,17 @@ export const SortableLinkList = ({ items, isDisabled, className, children, onSor
|
|
|
86
86
|
sortIDs,
|
|
87
87
|
rearrangeSortIDs
|
|
88
88
|
]);
|
|
89
|
-
return
|
|
89
|
+
return React.createElement(DndContext, {
|
|
90
90
|
onDragStart: onSortStartHandler,
|
|
91
91
|
onDragEnd: onSortEndHandler
|
|
92
|
-
},
|
|
92
|
+
}, React.createElement(SortableContext, {
|
|
93
93
|
items: sortIDs,
|
|
94
94
|
strategy: sortingStrategy
|
|
95
|
-
},
|
|
95
|
+
}, React.createElement("div", {
|
|
96
96
|
className: cx(styles.container, className)
|
|
97
97
|
}, items.map((item, index)=>{
|
|
98
98
|
const id = sortIDs[index]?.id;
|
|
99
|
-
return
|
|
99
|
+
return React.createElement(SortableLink, {
|
|
100
100
|
key: id,
|
|
101
101
|
id: id,
|
|
102
102
|
items: items,
|
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { QueryClient, useQuery as useRQ } from '@tanstack/react-query';
|
|
3
|
-
|
|
4
|
-
* A custom client context ensures zero conflict with host apps also using
|
|
5
|
-
* React Query.
|
|
6
|
-
*/ const clientContext = /*#__PURE__*/ React.createContext(undefined);
|
|
3
|
+
const clientContext = React.createContext(undefined);
|
|
7
4
|
export function useQueryClient() {
|
|
8
5
|
const client = React.useContext(clientContext);
|
|
9
6
|
return React.useMemo(()=>{
|
|
@@ -26,19 +23,15 @@ export function useQueryClient() {
|
|
|
26
23
|
client
|
|
27
24
|
]);
|
|
28
25
|
}
|
|
29
|
-
// @ts-expect-error
|
|
30
26
|
export const useQuery = (key, fn, opt)=>{
|
|
31
27
|
return useRQ(key, fn, {
|
|
32
28
|
...opt,
|
|
33
29
|
context: clientContext
|
|
34
30
|
});
|
|
35
31
|
};
|
|
36
|
-
|
|
37
|
-
* Provides access to a query client either by sharing an existing client or
|
|
38
|
-
* creating a new one.
|
|
39
|
-
*/ export function SharedQueryClientProvider({ children }) {
|
|
32
|
+
export function SharedQueryClientProvider({ children }) {
|
|
40
33
|
const client = useQueryClient();
|
|
41
|
-
return
|
|
34
|
+
return React.createElement(clientContext.Provider, {
|
|
42
35
|
value: client
|
|
43
36
|
}, children);
|
|
44
37
|
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { useEffect, useMemo, useState } from 'react';
|
|
2
2
|
import { useAccessApi } from './useAccessApi';
|
|
3
3
|
async function filter(arr, predicate) {
|
|
4
|
-
// intentionally parallel as we assume it's cached in the implementation of the access api
|
|
5
4
|
const fail = Symbol();
|
|
6
5
|
const results = await Promise.all(arr.map(async (item)=>await predicate(item) ? item : fail));
|
|
7
6
|
return results.filter((x)=>x !== fail);
|
|
@@ -31,7 +30,6 @@ export function useContentTypePermissions(props) {
|
|
|
31
30
|
setCreatableContentTypes(creatable);
|
|
32
31
|
}
|
|
33
32
|
void checkContentTypeAccess();
|
|
34
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps -- TODO: Evaluate the dependencies
|
|
35
33
|
}, [
|
|
36
34
|
availableContentTypes
|
|
37
35
|
]);
|