@contentful/field-editor-rich-text 3.6.1 → 3.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -57,18 +57,11 @@ function _interop_require_wildcard(obj, nodeInterop) {
57
57
  return newObj;
58
58
  }
59
59
  const InternalEntryCard = _react.memo((props)=>{
60
- if (props.status === 'loading') {
60
+ if (props.data === undefined || props.status === 'loading') {
61
61
  return _react.createElement(_f36components.EntryCard, {
62
62
  isLoading: true
63
63
  });
64
64
  }
65
- if (!props.data || props.status === 'error') {
66
- return _react.createElement(_fieldeditorreference.MissingEntityCard, {
67
- entityType: "Entry",
68
- isDisabled: props.isDisabled,
69
- onRemove: props.onRemove
70
- });
71
- }
72
65
  const { contentType , resource: entry , space } = props.data;
73
66
  return _react.createElement(_fieldeditorreference.WrappedEntryCard, {
74
67
  size: "default",
@@ -89,7 +82,7 @@ const InternalEntryCard = _react.memo((props)=>{
89
82
  InternalEntryCard.displayName = 'ReferenceCard';
90
83
  const FetchingWrappedResourceCard = (props)=>{
91
84
  const { link , onEntityFetchComplete } = props;
92
- const { data , status } = (0, _fieldeditorreference.useResource)(link.linkType, link.urn);
85
+ const { data , status , error } = (0, _fieldeditorreference.useResource)(link.linkType, link.urn);
93
86
  _react.useEffect(()=>{
94
87
  if (status === 'success') {
95
88
  onEntityFetchComplete?.();
@@ -98,6 +91,15 @@ const FetchingWrappedResourceCard = (props)=>{
98
91
  onEntityFetchComplete,
99
92
  status
100
93
  ]);
94
+ if (status === 'error') {
95
+ return _react.createElement(_fieldeditorreference.ResourceEntityErrorCard, {
96
+ error: error,
97
+ linkType: link.linkType,
98
+ isSelected: props.isSelected,
99
+ isDisabled: props.isDisabled,
100
+ onRemove: props.onRemove
101
+ });
102
+ }
101
103
  return _react.createElement(InternalEntryCard, {
102
104
  data: data,
103
105
  status: status,
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ const _react = _interop_require_wildcard(require("react"));
6
+ require("@testing-library/jest-dom/extend-expect");
7
+ const _fieldeditorreference = require("@contentful/field-editor-reference");
8
+ const _fieldeditortestutils = require("@contentful/field-editor-test-utils");
9
+ const _react1 = require("@testing-library/react");
10
+ const _published_content_typejson = _interop_require_default(require("../__fixtures__/published_content_type.json"));
11
+ const _published_entryjson = _interop_require_default(require("../__fixtures__/published_entry.json"));
12
+ const _spacejson = _interop_require_default(require("../__fixtures__/space.json"));
13
+ const _FetchingWrappedResourceCard = require("../FetchingWrappedResourceCard");
14
+ function _interop_require_default(obj) {
15
+ return obj && obj.__esModule ? obj : {
16
+ default: obj
17
+ };
18
+ }
19
+ function _getRequireWildcardCache(nodeInterop) {
20
+ if (typeof WeakMap !== "function") return null;
21
+ var cacheBabelInterop = new WeakMap();
22
+ var cacheNodeInterop = new WeakMap();
23
+ return (_getRequireWildcardCache = function(nodeInterop) {
24
+ return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
25
+ })(nodeInterop);
26
+ }
27
+ function _interop_require_wildcard(obj, nodeInterop) {
28
+ if (!nodeInterop && obj && obj.__esModule) {
29
+ return obj;
30
+ }
31
+ if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
32
+ return {
33
+ default: obj
34
+ };
35
+ }
36
+ var cache = _getRequireWildcardCache(nodeInterop);
37
+ if (cache && cache.has(obj)) {
38
+ return cache.get(obj);
39
+ }
40
+ var newObj = {};
41
+ var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
42
+ for(var key in obj){
43
+ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
44
+ var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
45
+ if (desc && (desc.get || desc.set)) {
46
+ Object.defineProperty(newObj, key, desc);
47
+ } else {
48
+ newObj[key] = obj[key];
49
+ }
50
+ }
51
+ }
52
+ newObj.default = obj;
53
+ if (cache) {
54
+ cache.set(obj, newObj);
55
+ }
56
+ return newObj;
57
+ }
58
+ (0, _react1.configure)({
59
+ testIdAttribute: 'data-test-id'
60
+ });
61
+ let sdk;
62
+ const resolvableEntryUrn = 'crn:contentful:::content:spaces/space-id/entries/linked-entry-urn';
63
+ const unknownEntryUrn = 'crn:contentful:::content:spaces/space-id/entries/unknown-entry-urn';
64
+ beforeEach(()=>{
65
+ sdk = {
66
+ locales: {
67
+ default: 'en-US'
68
+ },
69
+ cmaAdapter: (0, _fieldeditortestutils.createFakeCMAAdapter)({
70
+ ContentType: {
71
+ get: jest.fn().mockReturnValue(_published_content_typejson.default)
72
+ },
73
+ Entry: {
74
+ get: jest.fn().mockImplementation(({ entryId })=>{
75
+ if (entryId === 'linked-entry-urn') {
76
+ return Promise.resolve(_published_entryjson.default);
77
+ }
78
+ return Promise.reject(new Error());
79
+ })
80
+ },
81
+ Locale: {
82
+ getMany: jest.fn().mockResolvedValue({
83
+ items: [
84
+ {
85
+ default: true,
86
+ code: 'en'
87
+ }
88
+ ]
89
+ })
90
+ },
91
+ ScheduledAction: {
92
+ getMany: jest.fn().mockResolvedValue({
93
+ items: [],
94
+ total: 0
95
+ })
96
+ },
97
+ Space: {
98
+ get: jest.fn().mockResolvedValue(_spacejson.default)
99
+ }
100
+ }),
101
+ space: {
102
+ onEntityChanged: jest.fn()
103
+ },
104
+ navigator: {},
105
+ ids: {
106
+ space: 'space-id',
107
+ environment: 'environment-id'
108
+ }
109
+ };
110
+ });
111
+ function renderResourceCard({ linkType ='Contentful:Entry' , entryUrn =resolvableEntryUrn } = {}) {
112
+ return (0, _react1.render)(_react.createElement(_fieldeditorreference.EntityProvider, {
113
+ sdk: sdk
114
+ }, _react.createElement(_FetchingWrappedResourceCard.FetchingWrappedResourceCard, {
115
+ isDisabled: false,
116
+ isSelected: false,
117
+ sdk: sdk,
118
+ link: {
119
+ type: 'ResourceLink',
120
+ linkType: linkType,
121
+ urn: entryUrn
122
+ }
123
+ })));
124
+ }
125
+ test('renders entry card', async ()=>{
126
+ const { getByTestId , getByText } = renderResourceCard();
127
+ await (0, _react1.waitFor)(()=>expect(getByTestId('cf-ui-entry-card')).toBeDefined());
128
+ expect(getByText(_published_entryjson.default.fields.exField.en)).toBeDefined();
129
+ expect(getByText(_spacejson.default.name)).toBeDefined();
130
+ });
131
+ test('renders skeleton when no data is provided', ()=>{
132
+ const { getByTestId } = renderResourceCard();
133
+ expect(getByTestId('cf-ui-skeleton-form')).toBeDefined();
134
+ });
135
+ test('renders unsupported entity card when unsupported link is passed', async ()=>{
136
+ const { getByText } = renderResourceCard({
137
+ linkType: 'Contentful:UnsupportedLink'
138
+ });
139
+ await (0, _react1.waitFor)(()=>expect(getByText('Resource type Contentful:UnsupportedLink is currently not supported')).toBeDefined());
140
+ });
141
+ test('renders missing entity card when unknown error is returned', async ()=>{
142
+ const { getByTestId } = renderResourceCard({
143
+ entryUrn: unknownEntryUrn
144
+ });
145
+ await (0, _react1.waitFor)(()=>expect(getByTestId('cf-ui-missing-entry-card')).toBeDefined());
146
+ });
@@ -1,20 +1,13 @@
1
1
  import * as React from 'react';
2
2
  import { EntryCard } from '@contentful/f36-components';
3
- import { MissingEntityCard, WrappedEntryCard, useResource } from '@contentful/field-editor-reference';
3
+ import { ResourceEntityErrorCard, WrappedEntryCard, useResource } from '@contentful/field-editor-reference';
4
4
  import areEqual from 'fast-deep-equal';
5
5
  const InternalEntryCard = React.memo((props)=>{
6
- if (props.status === 'loading') {
6
+ if (props.data === undefined || props.status === 'loading') {
7
7
  return React.createElement(EntryCard, {
8
8
  isLoading: true
9
9
  });
10
10
  }
11
- if (!props.data || props.status === 'error') {
12
- return React.createElement(MissingEntityCard, {
13
- entityType: "Entry",
14
- isDisabled: props.isDisabled,
15
- onRemove: props.onRemove
16
- });
17
- }
18
11
  const { contentType , resource: entry , space } = props.data;
19
12
  return React.createElement(WrappedEntryCard, {
20
13
  size: "default",
@@ -35,7 +28,7 @@ const InternalEntryCard = React.memo((props)=>{
35
28
  InternalEntryCard.displayName = 'ReferenceCard';
36
29
  export const FetchingWrappedResourceCard = (props)=>{
37
30
  const { link , onEntityFetchComplete } = props;
38
- const { data , status } = useResource(link.linkType, link.urn);
31
+ const { data , status , error } = useResource(link.linkType, link.urn);
39
32
  React.useEffect(()=>{
40
33
  if (status === 'success') {
41
34
  onEntityFetchComplete?.();
@@ -44,6 +37,15 @@ export const FetchingWrappedResourceCard = (props)=>{
44
37
  onEntityFetchComplete,
45
38
  status
46
39
  ]);
40
+ if (status === 'error') {
41
+ return React.createElement(ResourceEntityErrorCard, {
42
+ error: error,
43
+ linkType: link.linkType,
44
+ isSelected: props.isSelected,
45
+ isDisabled: props.isDisabled,
46
+ onRemove: props.onRemove
47
+ });
48
+ }
47
49
  return React.createElement(InternalEntryCard, {
48
50
  data: data,
49
51
  status: status,
@@ -0,0 +1,98 @@
1
+ import * as React from 'react';
2
+ import '@testing-library/jest-dom/extend-expect';
3
+ import { EntityProvider } from '@contentful/field-editor-reference';
4
+ import { createFakeCMAAdapter } from '@contentful/field-editor-test-utils';
5
+ import { configure, render, waitFor } from '@testing-library/react';
6
+ import publishedCT from '../__fixtures__/published_content_type.json';
7
+ import publishedEntry from '../__fixtures__/published_entry.json';
8
+ import space from '../__fixtures__/space.json';
9
+ import { FetchingWrappedResourceCard } from '../FetchingWrappedResourceCard';
10
+ configure({
11
+ testIdAttribute: 'data-test-id'
12
+ });
13
+ let sdk;
14
+ const resolvableEntryUrn = 'crn:contentful:::content:spaces/space-id/entries/linked-entry-urn';
15
+ const unknownEntryUrn = 'crn:contentful:::content:spaces/space-id/entries/unknown-entry-urn';
16
+ beforeEach(()=>{
17
+ sdk = {
18
+ locales: {
19
+ default: 'en-US'
20
+ },
21
+ cmaAdapter: createFakeCMAAdapter({
22
+ ContentType: {
23
+ get: jest.fn().mockReturnValue(publishedCT)
24
+ },
25
+ Entry: {
26
+ get: jest.fn().mockImplementation(({ entryId })=>{
27
+ if (entryId === 'linked-entry-urn') {
28
+ return Promise.resolve(publishedEntry);
29
+ }
30
+ return Promise.reject(new Error());
31
+ })
32
+ },
33
+ Locale: {
34
+ getMany: jest.fn().mockResolvedValue({
35
+ items: [
36
+ {
37
+ default: true,
38
+ code: 'en'
39
+ }
40
+ ]
41
+ })
42
+ },
43
+ ScheduledAction: {
44
+ getMany: jest.fn().mockResolvedValue({
45
+ items: [],
46
+ total: 0
47
+ })
48
+ },
49
+ Space: {
50
+ get: jest.fn().mockResolvedValue(space)
51
+ }
52
+ }),
53
+ space: {
54
+ onEntityChanged: jest.fn()
55
+ },
56
+ navigator: {},
57
+ ids: {
58
+ space: 'space-id',
59
+ environment: 'environment-id'
60
+ }
61
+ };
62
+ });
63
+ function renderResourceCard({ linkType ='Contentful:Entry' , entryUrn =resolvableEntryUrn } = {}) {
64
+ return render(React.createElement(EntityProvider, {
65
+ sdk: sdk
66
+ }, React.createElement(FetchingWrappedResourceCard, {
67
+ isDisabled: false,
68
+ isSelected: false,
69
+ sdk: sdk,
70
+ link: {
71
+ type: 'ResourceLink',
72
+ linkType: linkType,
73
+ urn: entryUrn
74
+ }
75
+ })));
76
+ }
77
+ test('renders entry card', async ()=>{
78
+ const { getByTestId , getByText } = renderResourceCard();
79
+ await waitFor(()=>expect(getByTestId('cf-ui-entry-card')).toBeDefined());
80
+ expect(getByText(publishedEntry.fields.exField.en)).toBeDefined();
81
+ expect(getByText(space.name)).toBeDefined();
82
+ });
83
+ test('renders skeleton when no data is provided', ()=>{
84
+ const { getByTestId } = renderResourceCard();
85
+ expect(getByTestId('cf-ui-skeleton-form')).toBeDefined();
86
+ });
87
+ test('renders unsupported entity card when unsupported link is passed', async ()=>{
88
+ const { getByText } = renderResourceCard({
89
+ linkType: 'Contentful:UnsupportedLink'
90
+ });
91
+ await waitFor(()=>expect(getByText('Resource type Contentful:UnsupportedLink is currently not supported')).toBeDefined());
92
+ });
93
+ test('renders missing entity card when unknown error is returned', async ()=>{
94
+ const { getByTestId } = renderResourceCard({
95
+ entryUrn: unknownEntryUrn
96
+ });
97
+ await waitFor(()=>expect(getByTestId('cf-ui-missing-entry-card')).toBeDefined());
98
+ });
@@ -0,0 +1 @@
1
+ import '@testing-library/jest-dom/extend-expect';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contentful/field-editor-rich-text",
3
- "version": "3.6.1",
3
+ "version": "3.8.0",
4
4
  "source": "./src/index.tsx",
5
5
  "main": "dist/cjs/index.js",
6
6
  "module": "dist/esm/index.js",
@@ -44,7 +44,7 @@
44
44
  "@contentful/f36-icons": "^4.1.1",
45
45
  "@contentful/f36-tokens": "^4.0.0",
46
46
  "@contentful/f36-utils": "^4.19.0",
47
- "@contentful/field-editor-reference": "^5.11.0",
47
+ "@contentful/field-editor-reference": "^5.12.0",
48
48
  "@contentful/field-editor-shared": "^1.3.0",
49
49
  "@contentful/rich-text-plain-text-renderer": "^16.0.4",
50
50
  "@contentful/rich-text-types": "16.1.0",
@@ -78,7 +78,8 @@
78
78
  "@contentful/rich-text-react-renderer": "^15.16.4",
79
79
  "@types/is-hotkey": "^0.1.6",
80
80
  "@udecode/plate-test-utils": "^3.2.0",
81
+ "prism-react-renderer": "2.0.5",
81
82
  "react": ">=16.14.0"
82
83
  },
83
- "gitHead": "83b651f1638ad6bab53565479e76b8d29b86af3a"
84
+ "gitHead": "3afd8db7ad2323a2f7ad0cb79d28013a541f9537"
84
85
  }