@contentful/field-editor-rich-text 2.0.0-next.20 → 2.0.0-next.21

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.
@@ -2277,15 +2277,7 @@ function FetchingWrappedInlineEntryCard(props) {
2277
2277
  return /*#__PURE__*/React__default.createElement(f36Components.InlineEntryCard, {
2278
2278
  testId: Contentful.INLINES.EMBEDDED_ENTRY,
2279
2279
  isSelected: props.isSelected,
2280
- title: /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement("span", null, contentTypeName, " ", title), /*#__PURE__*/React__default.createElement(fieldEditorReference.ScheduledIconWithTooltip, {
2281
- getEntityScheduledActions: loadEntityScheduledActions,
2282
- entityType: "Entry",
2283
- entityId: entry.sys.id
2284
- }, /*#__PURE__*/React__default.createElement(f36Icons.ClockIcon, {
2285
- className: styles$5.scheduledIcon,
2286
- variant: "muted",
2287
- testId: "scheduled-icon"
2288
- }))),
2280
+ title: contentTypeName + ": " + title,
2289
2281
  status: status,
2290
2282
  actions: [/*#__PURE__*/React__default.createElement(f36Components.MenuItem, {
2291
2283
  key: "edit",
@@ -2297,7 +2289,15 @@ function FetchingWrappedInlineEntryCard(props) {
2297
2289
  disabled: props.isDisabled,
2298
2290
  testId: "card-action-remove"
2299
2291
  }, "Remove")]
2300
- });
2292
+ }, /*#__PURE__*/React__default.createElement(fieldEditorReference.ScheduledIconWithTooltip, {
2293
+ getEntityScheduledActions: loadEntityScheduledActions,
2294
+ entityType: "Entry",
2295
+ entityId: entry.sys.id
2296
+ }, /*#__PURE__*/React__default.createElement(f36Icons.ClockIcon, {
2297
+ className: styles$5.scheduledIcon,
2298
+ variant: "muted",
2299
+ testId: "scheduled-icon"
2300
+ })), /*#__PURE__*/React__default.createElement(f36Components.Text, null, title));
2301
2301
  }
2302
2302
 
2303
2303
  function createInlineEntryNode(id) {
@@ -2979,159 +2979,6 @@ var createHrPlugin = function createHrPlugin() {
2979
2979
  };
2980
2980
  };
2981
2981
 
2982
- function truncate(str, length) {
2983
- if (typeof str === 'string' && str.length > length) {
2984
- return str && str.substr(0, length + 1) // +1 to look ahead and be replaced below.
2985
- // Get rid of orphan letters but not one letter words (I, a, 2).
2986
- // Try to not have “.” as last character to avoid awkward “....”.
2987
- .replace(/(\s+\S(?=\S)|\s*)\.?.$/, '…');
2988
- }
2989
-
2990
- return str;
2991
- }
2992
-
2993
- function getEntityInfo(_ref) {
2994
- var entityTitle = _ref.entityTitle,
2995
- entityStatus = _ref.entityStatus,
2996
- contentTypeName = _ref.contentTypeName;
2997
- var title = truncate(entityTitle, 60) || 'Untitled';
2998
- return (contentTypeName || 'Asset') + " \"" + title + "\", " + entityStatus;
2999
- }
3000
-
3001
- function EntryAssetTooltip(_ref2) {
3002
- var id = _ref2.id,
3003
- type = _ref2.type,
3004
- sdk = _ref2.sdk;
3005
-
3006
- var _React$useState = React.useState(''),
3007
- entityTitle = _React$useState[0],
3008
- setEntityTitle = _React$useState[1];
3009
-
3010
- var _React$useState2 = React.useState(''),
3011
- entityStatus = _React$useState2[0],
3012
- setEntityStatus = _React$useState2[1];
3013
-
3014
- var _React$useState3 = React.useState([]),
3015
- jobs = _React$useState3[0],
3016
- setJobs = _React$useState3[1];
3017
-
3018
- var _React$useState4 = React.useState(true),
3019
- isLoading = _React$useState4[0],
3020
- setIsLoading = _React$useState4[1];
3021
-
3022
- var _React$useState5 = React.useState(false),
3023
- hasError = _React$useState5[0],
3024
- setHasError = _React$useState5[1];
3025
-
3026
- React.useEffect(function () {
3027
- function loadContent() {
3028
- return _loadContent.apply(this, arguments);
3029
- }
3030
-
3031
- function _loadContent() {
3032
- _loadContent = _asyncToGenerator( /*#__PURE__*/runtime_1.mark(function _callee() {
3033
- var actions, contentType, entity, contentTypeId, contentTypes, _entityTitle, _jobs, _entityStatus;
3034
-
3035
- return runtime_1.wrap(function _callee$(_context) {
3036
- while (1) {
3037
- switch (_context.prev = _context.next) {
3038
- case 0:
3039
- _context.prev = 0;
3040
- setIsLoading(true);
3041
- setHasError(false);
3042
- actions = {
3043
- Asset: {
3044
- getEntity: sdk.space.getAsset,
3045
- getEntityTitle: function getEntityTitle(args) {
3046
- return fieldEditorShared.entityHelpers.getAssetTitle(_extends({}, args, {
3047
- asset: args.entity
3048
- }));
3049
- }
3050
- },
3051
- Entry: {
3052
- getEntity: sdk.space.getEntry,
3053
- getEntityTitle: function getEntityTitle(args) {
3054
- return fieldEditorShared.entityHelpers.getEntryTitle(_extends({}, args, {
3055
- entry: args.entity
3056
- }));
3057
- }
3058
- }
3059
- };
3060
- _context.next = 6;
3061
- return actions[type].getEntity(id);
3062
-
3063
- case 6:
3064
- entity = _context.sent;
3065
-
3066
- if (entity.sys.contentType) {
3067
- contentTypeId = entity.sys.contentType.sys.id;
3068
- contentTypes = sdk.space.getCachedContentTypes();
3069
- contentType = contentTypes.find(function (ct) {
3070
- return ct.sys.id === contentTypeId;
3071
- });
3072
- }
3073
-
3074
- _entityTitle = actions[type].getEntityTitle({
3075
- entity: entity,
3076
- contentType: contentType,
3077
- localeCode: sdk.field.locale,
3078
- defaultLocaleCode: sdk.locales["default"],
3079
- entityType: type
3080
- });
3081
- _context.next = 11;
3082
- return sdk.space.getEntityScheduledActions(type, id);
3083
-
3084
- case 11:
3085
- _jobs = _context.sent;
3086
- _entityStatus = fieldEditorShared.entityHelpers.getEntryStatus(entity.sys);
3087
- setEntityTitle(_entityTitle);
3088
- setEntityStatus(_entityStatus);
3089
- setJobs(_jobs);
3090
- _context.next = 22;
3091
- break;
3092
-
3093
- case 18:
3094
- _context.prev = 18;
3095
- _context.t0 = _context["catch"](0);
3096
- console.log(_context.t0);
3097
- setHasError(true);
3098
-
3099
- case 22:
3100
- _context.prev = 22;
3101
- setIsLoading(false);
3102
- return _context.finish(22);
3103
-
3104
- case 25:
3105
- case "end":
3106
- return _context.stop();
3107
- }
3108
- }
3109
- }, _callee, null, [[0, 18, 22, 25]]);
3110
- }));
3111
- return _loadContent.apply(this, arguments);
3112
- }
3113
-
3114
- loadContent();
3115
- }, [id, type, sdk]);
3116
-
3117
- if (isLoading) {
3118
- return /*#__PURE__*/React.createElement(React.Fragment, null, "Loading " + type.toLowerCase() + "...");
3119
- }
3120
-
3121
- if (hasError) {
3122
- return /*#__PURE__*/React.createElement(React.Fragment, null, type + " missing or inaccessible");
3123
- }
3124
-
3125
- return /*#__PURE__*/React.createElement(React.Fragment, null, getEntityInfo({
3126
- entityTitle: entityTitle,
3127
- contentTypeName: type,
3128
- entityStatus: entityStatus
3129
- }), ' ', jobs.length > 0 ? fieldEditorReference.getScheduleTooltipContent({
3130
- job: jobs[0],
3131
- jobsCount: jobs.length
3132
- }) : '');
3133
- }
3134
-
3135
2982
  var _templateObject$3, _SYS_LINK_TYPES, _LINK_TYPE_SELECTION_;
3136
2983
  var styles$b = {
3137
2984
  removeSelectionLabel: /*#__PURE__*/emotion.css(_templateObject$3 || (_templateObject$3 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n margin-left: ", ";\n "])), tokens.spacingS)
@@ -3443,11 +3290,213 @@ function _addOrEditLink() {
3443
3290
  return _addOrEditLink.apply(this, arguments);
3444
3291
  }
3445
3292
 
3293
+ function ToolbarHyperlinkButton(props) {
3294
+ var editor = useContentfulEditor();
3295
+ var isActive = !!(editor && isLinkActive(editor));
3296
+ var sdk = useSdkContext();
3297
+
3298
+ function handleClick() {
3299
+ return _handleClick.apply(this, arguments);
3300
+ }
3301
+
3302
+ function _handleClick() {
3303
+ _handleClick = _asyncToGenerator( /*#__PURE__*/runtime_1.mark(function _callee() {
3304
+ return runtime_1.wrap(function _callee$(_context) {
3305
+ while (1) {
3306
+ switch (_context.prev = _context.next) {
3307
+ case 0:
3308
+ if (editor) {
3309
+ _context.next = 2;
3310
+ break;
3311
+ }
3312
+
3313
+ return _context.abrupt("return");
3314
+
3315
+ case 2:
3316
+ if (isActive) {
3317
+ unwrapLink(editor);
3318
+ editor.tracking.onToolbarAction('unlinkHyperlinks');
3319
+ } else {
3320
+ addOrEditLink(editor, sdk, editor.tracking.onToolbarAction);
3321
+ }
3322
+
3323
+ case 3:
3324
+ case "end":
3325
+ return _context.stop();
3326
+ }
3327
+ }
3328
+ }, _callee);
3329
+ }));
3330
+ return _handleClick.apply(this, arguments);
3331
+ }
3332
+
3333
+ if (!editor) return null;
3334
+ return /*#__PURE__*/React.createElement(ToolbarButton, {
3335
+ title: "Hyperlink",
3336
+ testId: "hyperlink-toolbar-button",
3337
+ onClick: handleClick,
3338
+ isActive: isActive,
3339
+ isDisabled: props.isDisabled
3340
+ }, /*#__PURE__*/React.createElement(f36Icons.LinkIcon, null));
3341
+ }
3342
+
3446
3343
  var hasText = function hasText(editor, entry) {
3447
3344
  var node = entry[0];
3448
3345
  return !plateCore.isAncestorEmpty(editor, node) && slate.Node.string(node).trim() !== '';
3449
3346
  };
3450
3347
 
3348
+ function truncate(str, length) {
3349
+ if (typeof str === 'string' && str.length > length) {
3350
+ return str && str.substr(0, length + 1) // +1 to look ahead and be replaced below.
3351
+ // Get rid of orphan letters but not one letter words (I, a, 2).
3352
+ // Try to not have “.” as last character to avoid awkward “....”.
3353
+ .replace(/(\s+\S(?=\S)|\s*)\.?.$/, '…');
3354
+ }
3355
+
3356
+ return str;
3357
+ }
3358
+
3359
+ function getEntityInfo(data) {
3360
+ if (!data) {
3361
+ return '';
3362
+ }
3363
+
3364
+ var entityTitle = data.entityTitle,
3365
+ contentTypeName = data.contentTypeName,
3366
+ entityStatus = data.entityStatus,
3367
+ jobs = data.jobs;
3368
+ var title = truncate(entityTitle, 60) || 'Untitled';
3369
+ var scheduledActions = jobs.length > 0 ? fieldEditorReference.getScheduleTooltipContent({
3370
+ job: jobs[0],
3371
+ jobsCount: jobs.length
3372
+ }) : '';
3373
+ return (contentTypeName || 'Asset') + " \"" + title + "\", " + entityStatus + " " + scheduledActions;
3374
+ }
3375
+
3376
+ function fetchAllData(_x) {
3377
+ return _fetchAllData.apply(this, arguments);
3378
+ }
3379
+
3380
+ function _fetchAllData() {
3381
+ _fetchAllData = _asyncToGenerator( /*#__PURE__*/runtime_1.mark(function _callee(_ref) {
3382
+ var sdk, entityId, entityType, localeCode, defaultLocaleCode, contentType, getEntity, entity, contentTypeId, entityTitle, entityDescription, jobs, entityStatus;
3383
+ return runtime_1.wrap(function _callee$(_context) {
3384
+ while (1) {
3385
+ switch (_context.prev = _context.next) {
3386
+ case 0:
3387
+ sdk = _ref.sdk, entityId = _ref.entityId, entityType = _ref.entityType, localeCode = _ref.localeCode, defaultLocaleCode = _ref.defaultLocaleCode;
3388
+ getEntity = entityType === 'Entry' ? sdk.space.getEntry : sdk.space.getAsset;
3389
+ _context.next = 4;
3390
+ return getEntity(entityId);
3391
+
3392
+ case 4:
3393
+ entity = _context.sent;
3394
+
3395
+ if (entity.sys.contentType) {
3396
+ contentTypeId = entity.sys.contentType.sys.id;
3397
+ contentType = sdk.space.getCachedContentTypes().find(function (ct) {
3398
+ return ct.sys.id === contentTypeId;
3399
+ });
3400
+ }
3401
+
3402
+ entityTitle = entityType === 'Entry' ? fieldEditorShared.entityHelpers.getEntryTitle({
3403
+ entry: entity,
3404
+ contentType: contentType,
3405
+ localeCode: localeCode,
3406
+ defaultLocaleCode: defaultLocaleCode,
3407
+ defaultTitle: 'Untitled'
3408
+ }) : fieldEditorShared.entityHelpers.getAssetTitle({
3409
+ asset: entity,
3410
+ localeCode: localeCode,
3411
+ defaultLocaleCode: defaultLocaleCode,
3412
+ defaultTitle: 'Untitled'
3413
+ });
3414
+ entityDescription = fieldEditorShared.entityHelpers.getEntityDescription({
3415
+ entity: entity,
3416
+ contentType: contentType,
3417
+ localeCode: localeCode,
3418
+ defaultLocaleCode: defaultLocaleCode
3419
+ });
3420
+ _context.next = 10;
3421
+ return sdk.space.getEntityScheduledActions(entityType, entityId);
3422
+
3423
+ case 10:
3424
+ jobs = _context.sent;
3425
+ entityStatus = fieldEditorShared.entityHelpers.getEntryStatus(entity.sys);
3426
+ return _context.abrupt("return", {
3427
+ jobs: jobs,
3428
+ entity: entity,
3429
+ entityTitle: entityTitle,
3430
+ entityDescription: entityDescription,
3431
+ entityStatus: entityStatus,
3432
+ contentTypeName: contentType ? contentType.name : ''
3433
+ });
3434
+
3435
+ case 13:
3436
+ case "end":
3437
+ return _context.stop();
3438
+ }
3439
+ }
3440
+ }, _callee);
3441
+ }));
3442
+ return _fetchAllData.apply(this, arguments);
3443
+ }
3444
+
3445
+ function useRequestStatus(_ref2) {
3446
+ var sdk = _ref2.sdk,
3447
+ target = _ref2.target,
3448
+ onEntityFetchComplete = _ref2.onEntityFetchComplete;
3449
+
3450
+ var _useState = React.useState({
3451
+ type: 'loading'
3452
+ }),
3453
+ requestStatus = _useState[0],
3454
+ setRequestStatus = _useState[1];
3455
+
3456
+ React.useEffect(function () {
3457
+ if (target) {
3458
+ var _target$sys, _target$sys2;
3459
+
3460
+ fetchAllData({
3461
+ sdk: sdk,
3462
+ entityId: target == null ? void 0 : (_target$sys = target.sys) == null ? void 0 : _target$sys.id,
3463
+ entityType: target == null ? void 0 : (_target$sys2 = target.sys) == null ? void 0 : _target$sys2.linkType,
3464
+ localeCode: sdk.field.locale,
3465
+ defaultLocaleCode: sdk.locales["default"]
3466
+ }).then(function (entityInfo) {
3467
+ setRequestStatus({
3468
+ type: 'success',
3469
+ data: entityInfo
3470
+ });
3471
+ })["catch"](function (e) {
3472
+ console.log(e);
3473
+ setRequestStatus({
3474
+ type: 'error',
3475
+ error: e
3476
+ });
3477
+ })["finally"](function () {
3478
+ onEntityFetchComplete == null ? void 0 : onEntityFetchComplete();
3479
+ });
3480
+ }
3481
+ }, [sdk, target, onEntityFetchComplete]);
3482
+ return requestStatus;
3483
+ }
3484
+
3485
+ function useEntityInfo(props) {
3486
+ var status = useRequestStatus(props);
3487
+ var linkType = props.target.sys.linkType;
3488
+
3489
+ if (status.type === 'loading') {
3490
+ return "Loading " + linkType.toLowerCase() + "...";
3491
+ }
3492
+
3493
+ if (status.type === 'error') {
3494
+ return linkType + " missing or inaccessible";
3495
+ }
3496
+
3497
+ return getEntityInfo(status.data);
3498
+ }
3499
+
3451
3500
  var styles$c = {
3452
3501
  hyperlinkWrapper: /*#__PURE__*/emotion.css({
3453
3502
  display: 'inline',
@@ -3465,33 +3514,21 @@ var styles$c = {
3465
3514
  '&:focus': {
3466
3515
  fill: tokens.gray900
3467
3516
  }
3468
- }),
3469
- hyperlinkIEFallback: /*#__PURE__*/emotion.css({
3470
- color: '#1683d0',
3471
- textDecoration: 'underline'
3472
- }),
3473
- // TODO: use these styles once we can use the icon
3474
- hyperlinkIcon: /*#__PURE__*/emotion.css({
3475
- position: 'relative',
3476
- top: '4px',
3477
- height: '14px',
3478
- margin: '0 -2px 0 -1px',
3479
- webkitTransition: 'fill 100ms ease-in-out',
3480
- transition: 'fill 100ms ease-in-out',
3481
- '&:hover': {
3482
- fill: tokens.gray900
3483
- },
3484
- '&:focus': {
3485
- fill: tokens.gray900
3486
- }
3487
3517
  })
3488
3518
  };
3489
3519
 
3490
- function UrlHyperlink(props) {
3520
+ function EntityHyperlink(props) {
3491
3521
  var editor = useContentfulEditor();
3492
3522
  var isReadOnly = Slate.useReadOnly();
3493
3523
  var sdk = useSdkContext();
3494
- var uri = props.element.data.uri;
3524
+ var target = props.element.data.target;
3525
+ var onEntityFetchComplete = props.onEntityFetchComplete;
3526
+ var tooltipContent = useEntityInfo({
3527
+ target: target,
3528
+ sdk: sdk,
3529
+ onEntityFetchComplete: onEntityFetchComplete
3530
+ });
3531
+ if (!target) return null;
3495
3532
 
3496
3533
  function handleClick(event) {
3497
3534
  event.preventDefault();
@@ -3501,33 +3538,25 @@ function UrlHyperlink(props) {
3501
3538
  }
3502
3539
 
3503
3540
  return /*#__PURE__*/React.createElement(f36Components.Tooltip, {
3504
- content: uri,
3541
+ content: tooltipContent,
3505
3542
  targetWrapperClassName: styles$c.hyperlinkWrapper,
3506
3543
  placement: "bottom",
3507
3544
  maxWidth: "auto"
3508
3545
  }, /*#__PURE__*/React.createElement(f36Components.TextLink, {
3509
3546
  as: "a",
3510
- href: uri,
3511
- rel: "noopener noreferrer",
3512
3547
  onClick: handleClick,
3513
3548
  isDisabled: isReadOnly,
3514
- className: styles$c.hyperlink
3549
+ className: styles$c.hyperlink,
3550
+ "data-link-type": target.sys.linkType,
3551
+ "data-link-id": target.sys.id
3515
3552
  }, props.children));
3516
3553
  }
3517
3554
 
3518
- function EntityHyperlink(props) {
3555
+ function UrlHyperlink(props) {
3519
3556
  var editor = useContentfulEditor();
3520
3557
  var isReadOnly = Slate.useReadOnly();
3521
3558
  var sdk = useSdkContext();
3522
- var target = props.element.data.target;
3523
- var onEntityFetchComplete = props.onEntityFetchComplete;
3524
- React.useEffect(function () {
3525
- // The real entity loading happens in the tooltip
3526
- // Since that is deferred the link is considered rendered as soon
3527
- // the component mounts (link text displayed)
3528
- onEntityFetchComplete == null ? void 0 : onEntityFetchComplete();
3529
- }, [onEntityFetchComplete]);
3530
- if (!target) return null;
3559
+ var uri = props.element.data.uri;
3531
3560
 
3532
3561
  function handleClick(event) {
3533
3562
  event.preventDefault();
@@ -3537,74 +3566,20 @@ function EntityHyperlink(props) {
3537
3566
  }
3538
3567
 
3539
3568
  return /*#__PURE__*/React.createElement(f36Components.Tooltip, {
3540
- content: /*#__PURE__*/React.createElement(EntryAssetTooltip, {
3541
- id: target.sys.id,
3542
- type: target.sys.linkType,
3543
- sdk: sdk
3544
- }),
3569
+ content: uri,
3545
3570
  targetWrapperClassName: styles$c.hyperlinkWrapper,
3546
3571
  placement: "bottom",
3547
3572
  maxWidth: "auto"
3548
3573
  }, /*#__PURE__*/React.createElement(f36Components.TextLink, {
3549
3574
  as: "a",
3575
+ href: uri,
3576
+ rel: "noopener noreferrer",
3550
3577
  onClick: handleClick,
3551
3578
  isDisabled: isReadOnly,
3552
- className: styles$c.hyperlink,
3553
- "data-link-type": target.sys.linkType,
3554
- "data-link-id": target.sys.id
3579
+ className: styles$c.hyperlink
3555
3580
  }, props.children));
3556
3581
  }
3557
3582
 
3558
- function ToolbarHyperlinkButton(props) {
3559
- var editor = useContentfulEditor();
3560
- var isActive = !!(editor && isLinkActive(editor));
3561
- var sdk = useSdkContext();
3562
-
3563
- function handleClick() {
3564
- return _handleClick.apply(this, arguments);
3565
- }
3566
-
3567
- function _handleClick() {
3568
- _handleClick = _asyncToGenerator( /*#__PURE__*/runtime_1.mark(function _callee() {
3569
- return runtime_1.wrap(function _callee$(_context) {
3570
- while (1) {
3571
- switch (_context.prev = _context.next) {
3572
- case 0:
3573
- if (editor) {
3574
- _context.next = 2;
3575
- break;
3576
- }
3577
-
3578
- return _context.abrupt("return");
3579
-
3580
- case 2:
3581
- if (isActive) {
3582
- unwrapLink(editor);
3583
- editor.tracking.onToolbarAction('unlinkHyperlinks');
3584
- } else {
3585
- addOrEditLink(editor, sdk, editor.tracking.onToolbarAction);
3586
- }
3587
-
3588
- case 3:
3589
- case "end":
3590
- return _context.stop();
3591
- }
3592
- }
3593
- }, _callee);
3594
- }));
3595
- return _handleClick.apply(this, arguments);
3596
- }
3597
-
3598
- if (!editor) return null;
3599
- return /*#__PURE__*/React.createElement(ToolbarButton, {
3600
- title: "Hyperlink",
3601
- testId: "hyperlink-toolbar-button",
3602
- onClick: handleClick,
3603
- isActive: isActive,
3604
- isDisabled: props.isDisabled
3605
- }, /*#__PURE__*/React.createElement(f36Icons.LinkIcon, null));
3606
- }
3607
-
3608
3583
  var isAnchor = function isAnchor(element) {
3609
3584
  return element.nodeName === 'A' && !!element.getAttribute('href') && element.getAttribute('href') !== '#';
3610
3585
  };