@plone/volto 17.0.0-alpha.26 → 17.0.0-alpha.28

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.
Files changed (154) hide show
  1. package/.eslintrc +26 -3
  2. package/.yarn/install-state.gz +0 -0
  3. package/.yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs +541 -0
  4. package/.yarn/releases/yarn-3.6.3.cjs +874 -0
  5. package/CHANGELOG.md +60 -0
  6. package/addon-registry.js +10 -1
  7. package/create-addons-loader.js +1 -1
  8. package/locales/ca/LC_MESSAGES/volto.po +57 -31
  9. package/locales/ca.json +1 -1
  10. package/locales/de/LC_MESSAGES/volto.po +58 -32
  11. package/locales/de.json +1 -1
  12. package/locales/en/LC_MESSAGES/volto.po +57 -31
  13. package/locales/en.json +1 -1
  14. package/locales/es/LC_MESSAGES/volto.po +65 -39
  15. package/locales/es.json +1 -1
  16. package/locales/eu/LC_MESSAGES/volto.po +57 -31
  17. package/locales/eu.json +1 -1
  18. package/locales/fi/LC_MESSAGES/volto.po +57 -31
  19. package/locales/fi.json +1 -1
  20. package/locales/fr/LC_MESSAGES/volto.po +57 -31
  21. package/locales/fr.json +1 -1
  22. package/locales/it/LC_MESSAGES/volto.po +57 -31
  23. package/locales/it.json +1 -1
  24. package/locales/ja/LC_MESSAGES/volto.po +57 -31
  25. package/locales/ja.json +1 -1
  26. package/locales/nl/LC_MESSAGES/volto.po +57 -31
  27. package/locales/nl.json +1 -1
  28. package/locales/pt/LC_MESSAGES/volto.po +57 -31
  29. package/locales/pt.json +1 -1
  30. package/locales/pt_BR/LC_MESSAGES/volto.po +57 -31
  31. package/locales/pt_BR.json +1 -1
  32. package/locales/ro/LC_MESSAGES/volto.po +57 -31
  33. package/locales/ro.json +1 -1
  34. package/locales/volto.pot +62 -32
  35. package/locales/zh_CN/LC_MESSAGES/volto.po +57 -31
  36. package/locales/zh_CN.json +1 -1
  37. package/package.json +35 -26
  38. package/packages/volto-slate/package.json +1 -1
  39. package/packages/volto-slate/src/blocks/Text/TextBlockView.jsx +2 -1
  40. package/packages/volto-slate/src/blocks/Text/index.js +0 -5
  41. package/packages/volto-slate/src/editor/plugins/Link/render.jsx +5 -6
  42. package/packages/volto-slate/src/editor/render.jsx +11 -1
  43. package/razzle.config.js +4 -6
  44. package/src/components/index.js +194 -194
  45. package/src/components/manage/Add/Add.jsx +7 -8
  46. package/src/components/manage/Blocks/Block/Settings.test.jsx +17 -15
  47. package/src/components/manage/Blocks/HTML/Edit.jsx +8 -8
  48. package/src/components/manage/Blocks/HeroImageLeft/Edit.jsx +30 -25
  49. package/src/components/manage/Blocks/Listing/ListingBody.jsx +6 -4
  50. package/src/components/manage/Blocks/Maps/Edit.test.jsx +1 -2
  51. package/src/components/manage/Blocks/Maps/View.test.jsx +1 -2
  52. package/src/components/manage/Blocks/Search/components/Facets.jsx +2 -3
  53. package/src/components/manage/Blocks/Search/components/FilterList.jsx +4 -6
  54. package/src/components/manage/Blocks/Search/components/SelectFacet.jsx +2 -9
  55. package/src/components/manage/Blocks/Search/hocs/withQueryString.jsx +3 -0
  56. package/src/components/manage/Blocks/Search/hocs/withSearch.jsx +8 -6
  57. package/src/components/manage/Blocks/Search/schema.js +13 -13
  58. package/src/components/manage/Blocks/Table/Cell.jsx +2 -3
  59. package/src/components/manage/Blocks/Text/Edit.jsx +2 -3
  60. package/src/components/manage/Blocks/Title/View.jsx +4 -37
  61. package/src/components/manage/Blocks/ToC/View.jsx +1 -0
  62. package/src/components/manage/Blocks/ToC/variations/DefaultTocRenderer.jsx +3 -2
  63. package/src/components/manage/Blocks/ToC/variations/HorizontalMenu.jsx +3 -2
  64. package/src/components/manage/Contents/Contents.jsx +252 -114
  65. package/src/components/manage/Contents/ContentsPropertiesModal.jsx +90 -154
  66. package/src/components/manage/Contents/ContentsRenameModal.jsx +88 -139
  67. package/src/components/manage/Contents/ContentsRenameModal.stories.jsx +61 -0
  68. package/src/components/manage/Contents/ContentsTagsModal.jsx +83 -130
  69. package/src/components/manage/Contents/ContentsTagsModal.stories.jsx +68 -0
  70. package/src/components/manage/Contents/ContentsUploadModal.jsx +1 -2
  71. package/src/components/manage/Contents/ContentsWorkflowModal.jsx +87 -154
  72. package/src/components/manage/Controlpanels/Aliases.jsx +4 -12
  73. package/src/components/manage/Controlpanels/Rules/AddRule.jsx +2 -9
  74. package/src/components/manage/Controlpanels/UndoControlpanel.jsx +6 -9
  75. package/src/components/manage/Form/BlockDataForm.test.jsx +17 -15
  76. package/src/components/manage/Form/Form.jsx +2 -3
  77. package/src/components/manage/Form/InlineForm.test.jsx +16 -14
  78. package/src/components/manage/LockingToastsFactory/LockingToastsFactory.jsx +1 -2
  79. package/src/components/manage/Sharing/Sharing.jsx +7 -0
  80. package/src/components/manage/Sidebar/Sidebar.jsx +139 -220
  81. package/src/components/manage/Toolbar/More.jsx +12 -12
  82. package/src/components/manage/Toolbar/PersonalTools.jsx +97 -155
  83. package/src/components/manage/Toolbar/Toolbar.jsx +2 -2
  84. package/src/components/manage/UniversalLink/UniversalLink.test.jsx +2 -1
  85. package/src/components/manage/Widgets/AlignWidget.jsx +2 -4
  86. package/src/components/manage/Widgets/ColorPickerWidget.test.jsx +9 -7
  87. package/src/components/manage/Widgets/DatetimeWidget.jsx +2 -8
  88. package/src/components/manage/Widgets/IdWidget.jsx +1 -2
  89. package/src/components/manage/Widgets/ObjectBrowserWidget.jsx +2 -9
  90. package/src/components/manage/Widgets/RecurrenceWidget/RecurrenceWidget.jsx +2 -9
  91. package/src/components/manage/Widgets/RecurrenceWidget/WeekdayOfTheMonthIndexField.jsx +4 -4
  92. package/src/components/manage/Widgets/SchemaWidget.jsx +6 -9
  93. package/src/components/manage/Widgets/WysiwygWidget.jsx +2 -9
  94. package/src/components/theme/Comments/Comments.jsx +3 -10
  95. package/src/components/theme/ContentMetadataTags/ContentMetadataTags.jsx +4 -0
  96. package/src/components/theme/Login/Login.jsx +1 -2
  97. package/src/components/theme/PasswordReset/PasswordReset.jsx +1 -2
  98. package/src/components/theme/PreviewImage/PreviewImage.jsx +10 -5
  99. package/src/components/theme/PreviewImage/PreviewImage.test.js +17 -0
  100. package/src/components/theme/Register/Register.jsx +2 -4
  101. package/src/components/theme/TsTest/TsTest.test.tsx +11 -0
  102. package/src/components/theme/TsTest/TsTest.tsx +15 -0
  103. package/src/components/theme/View/AlbumView.jsx +3 -2
  104. package/src/components/theme/Widgets/ImageWidget.stories.jsx +1 -2
  105. package/src/config/Loadables.jsx +1 -1
  106. package/src/config/RichTextEditor/Blocks.jsx +2 -3
  107. package/src/config/RichTextEditor/Plugins.jsx +2 -3
  108. package/src/config/RichTextEditor/ToHTML.jsx +12 -10
  109. package/src/config/RichTextEditor/index.js +2 -3
  110. package/src/config/Views.jsx +5 -5
  111. package/src/express-middleware/ok.js +1 -1
  112. package/src/helpers/Blocks/Blocks.js +4 -6
  113. package/src/helpers/Blocks/Blocks.test.js +35 -35
  114. package/src/helpers/Extensions/withBlockSchemaEnhancer.js +48 -50
  115. package/src/helpers/FormValidation/FormValidation.js +7 -6
  116. package/src/helpers/Html/Html.jsx +2 -8
  117. package/src/helpers/Loadable/__mocks__/Loadable.js +18 -18
  118. package/src/helpers/MessageLabels/MessageLabels.js +2 -3
  119. package/src/helpers/Utils/UseDetectClickOutside.stories.jsx +2 -3
  120. package/src/helpers/Utils/Utils.js +10 -0
  121. package/src/helpers/Utils/Utils.test.js +13 -0
  122. package/src/helpers/index.js +1 -0
  123. package/src/hooks/index.js +1 -1
  124. package/src/middleware/api.js +194 -190
  125. package/src/middleware/blacklistRoutes.js +25 -22
  126. package/src/middleware/storeProtectLoadUtils.js +61 -62
  127. package/src/middleware/storeProtectLoadUtils.test.js +47 -43
  128. package/src/reducers/content/content.test.js +4 -4
  129. package/src/reducers/navigation/navigation.js +5 -5
  130. package/src/reducers/navigation/navigation.test.js +30 -0
  131. package/src/registry.js +2 -2
  132. package/src/storybook.jsx +24 -38
  133. package/theme/themes/pastanaga/collections/menu.overrides +3 -2
  134. package/theme/themes/pastanaga/elements/container.overrides +5 -2
  135. package/theme/themes/pastanaga/elements/input.overrides +1 -1
  136. package/theme/themes/pastanaga/elements/step.overrides +2 -1
  137. package/theme/themes/pastanaga/extras/blocks.less +20 -14
  138. package/theme/themes/pastanaga/extras/color-picker-widget.less +1 -1
  139. package/theme/themes/pastanaga/extras/contents.less +5 -1
  140. package/theme/themes/pastanaga/extras/draftjs.less +4 -4
  141. package/theme/themes/pastanaga/extras/grid.less +5 -4
  142. package/theme/themes/pastanaga/extras/main.less +6 -6
  143. package/theme/themes/pastanaga/extras/react-dates-overrides.less +4 -2
  144. package/theme/themes/pastanaga/extras/search.less +2 -2
  145. package/theme/themes/pastanaga/extras/sidebar.less +5 -4
  146. package/theme/themes/pastanaga/extras/time-picker-overrides.less +5 -3
  147. package/theme/themes/pastanaga/extras/toolbar.less +6 -2
  148. package/theme/themes/pastanaga/extras/userscontrolpanel.less +17 -9
  149. package/theme/themes/pastanaga/extras/widgets.less +1 -1
  150. package/theme/themes/pastanaga/modules/rating.overrides +2 -1
  151. package/theme/themes/pastanaga-cms-ui/elements/container.overrides +2 -1
  152. package/theme/themes/pastanaga-cms-ui/extras/cms-ui.elements.container.less +6 -2
  153. package/theme/themes/pastanaga-cms-ui/extras/cms-ui.site.less +2 -2
  154. package/tsconfig.json +33 -0
@@ -35,6 +35,7 @@ import {
35
35
  import move from 'lodash-move';
36
36
  import { FormattedMessage, defineMessages, injectIntl } from 'react-intl';
37
37
  import { asyncConnect } from '@plone/volto/helpers';
38
+ import { flattenToAppURL } from '@plone/volto/helpers';
38
39
 
39
40
  import {
40
41
  searchContent,
@@ -118,9 +119,13 @@ const messages = defineMessages({
118
119
  id: 'Delete',
119
120
  defaultMessage: 'Delete',
120
121
  },
121
- deleteConfirm: {
122
- id: 'Do you really want to delete the following items?',
123
- defaultMessage: 'Do you really want to delete the following items?',
122
+ deleteConfirmSingleItem: {
123
+ id: 'Delete this item?',
124
+ defaultMessage: 'Delete this item?',
125
+ },
126
+ deleteConfirmMultipleItems: {
127
+ id: 'Delete selected items?',
128
+ defaultMessage: 'Delete selected items?',
124
129
  },
125
130
  deleteError: {
126
131
  id: 'The item could not be deleted.',
@@ -270,35 +275,6 @@ const messages = defineMessages({
270
275
  id: 'All',
271
276
  defaultMessage: 'All',
272
277
  },
273
- linkIntegrityMessageHeader: {
274
- id: 'Potential link breakage',
275
- defaultMessage: 'Potential link breakage',
276
- },
277
- linkIntegrityMessageBody: {
278
- id:
279
- 'By deleting this item, you will break ' +
280
- 'links that exist in the items listed below. ' +
281
- 'If this is indeed what you want to do, ' +
282
- 'we recommend that remove these references first.',
283
- defaultMessage:
284
- 'By deleting this item, ' +
285
- 'you will break links that exist in the items ' +
286
- 'listed below. If this is indeed what you ' +
287
- 'want to do, we recommend that remove ' +
288
- 'these references first.',
289
- },
290
- linkIntegrityMessageExtra: {
291
- id: 'This Page is referenced by the following items:',
292
- defaultMessage: 'This Page is referenced by the following items:',
293
- },
294
- deleteItemCountMessage: {
295
- id: 'Total items to be deleted:',
296
- defaultMessage: 'Total items to be deleted:',
297
- },
298
- deleteItemMessage: {
299
- id: 'Items to be deleted:',
300
- defaultMessage: 'Items to be deleted:',
301
- },
302
278
  });
303
279
 
304
280
  /**
@@ -434,6 +410,8 @@ class Contents extends Component {
434
410
  showProperties: false,
435
411
  showWorkflow: false,
436
412
  itemsToDelete: [],
413
+ containedItemsToDelete: [],
414
+ brokenReferences: [],
437
415
  showAllItemsToDelete: true,
438
416
  items: this.props.items,
439
417
  filter: '',
@@ -469,12 +447,23 @@ class Contents extends Component {
469
447
  this.state.itemsToDelete !== prevState.itemsToDelete &&
470
448
  this.state.itemsToDelete.length > 0
471
449
  ) {
450
+ const linkintegrityInfo = await this.props.linkIntegrityCheck(
451
+ map(this.state.itemsToDelete, (item) => this.getFieldById(item, 'UID')),
452
+ );
453
+ let containedItems = 0;
454
+ let brokenReferencesCount = 0;
455
+
456
+ linkintegrityInfo.forEach((item) => {
457
+ containedItems += item.items_total ?? 0;
458
+ brokenReferencesCount += item.breaches.length;
459
+ });
472
460
  this.setState({
473
- linkIntegrityBreakages: await this.props.linkIntegrityCheck(
474
- map(this.state.itemsToDelete, (item) =>
475
- this.getFieldById(item, 'UID'),
476
- ),
477
- ),
461
+ containedItemsToDelete: containedItems,
462
+ brokenReferences: brokenReferencesCount,
463
+ brokenLinksList:
464
+ linkintegrityInfo.length === 1
465
+ ? linkintegrityInfo[0]['@id'] + '/links-to-item'
466
+ : null,
478
467
  showAllItemsToDelete:
479
468
  this.state.itemsToDelete.length < this.deleteItemsToShowThreshold,
480
469
  });
@@ -1200,84 +1189,234 @@ class Contents extends Component {
1200
1189
  <Confirm
1201
1190
  open={this.state.showDelete}
1202
1191
  confirmButton="Delete"
1203
- header={this.props.intl.formatMessage(
1204
- messages.deleteConfirm,
1205
- )}
1192
+ header={
1193
+ this.state.itemsToDelete.length === 1
1194
+ ? this.props.intl.formatMessage(
1195
+ messages.deleteConfirmSingleItem,
1196
+ )
1197
+ : this.props.intl.formatMessage(
1198
+ messages.deleteConfirmMultipleItems,
1199
+ )
1200
+ }
1206
1201
  content={
1207
1202
  <div className="content">
1208
- <h3>
1209
- {this.props.intl.formatMessage(
1210
- messages.deleteItemCountMessage,
1211
- ) + ` ${this.state.itemsToDelete.length}`}
1212
- </h3>
1213
- <ul className="content">
1214
- {map(
1215
- this.state.showAllItemsToDelete
1216
- ? this.state.itemsToDelete
1217
- : this.state.itemsToDelete.slice(
1218
- 0,
1219
- this.deleteItemsToShowThreshold,
1220
- ),
1221
- (item) => (
1222
- <li key={item}>
1223
- {this.getFieldById(item, 'title')}
1224
- </li>
1225
- ),
1226
- )}
1227
- </ul>
1228
- {!this.state.showAllItemsToDelete && (
1229
- <Button
1230
- onClick={() =>
1231
- this.setState({
1232
- showAllItemsToDelete: true,
1233
- })
1234
- }
1235
- >
1236
- Show all items
1237
- </Button>
1238
- )}
1239
- {this.state.linkIntegrityBreakages.reduce(
1240
- (a, b) => a + b.breaches.length,
1241
- 0,
1242
- ) ? (
1243
- <div>
1244
- <h3>
1245
- {this.props.intl.formatMessage(
1246
- messages.linkIntegrityMessageHeader,
1247
- )}
1248
- </h3>
1249
- <p>
1250
- {this.props.intl.formatMessage(
1251
- messages.linkIntegrityMessageBody,
1252
- )}
1253
- </p>
1254
- <ul className="content">
1255
- {map(this.state.linkIntegrityBreakages, (item) =>
1256
- item.breaches.length ? (
1257
- <li key={item['@id']}>
1258
- <a href={item['@id']}>{item.title}</a>
1259
- <p>
1260
- {this.props.intl.formatMessage(
1261
- messages.linkIntegrityMessageExtra,
1203
+ <p>
1204
+ {this.state.itemsToDelete.length > 1 ? (
1205
+ this.state.containedItemsToDelete > 0 ? (
1206
+ <>
1207
+ <FormattedMessage
1208
+ id="Some items are also a folder.
1209
+ By deleting them you will delete {containedItemsToDelete} {variation} inside the folders."
1210
+ defaultMessage="Some items are also a folder.
1211
+ By deleting them you will delete {containedItemsToDelete} {variation} inside the folders."
1212
+ values={{
1213
+ containedItemsToDelete: (
1214
+ <span>
1215
+ {this.state.containedItemsToDelete}
1216
+ </span>
1217
+ ),
1218
+ variation: (
1219
+ <span>
1220
+ {this.state.containedItemsToDelete ===
1221
+ 1 ? (
1222
+ <FormattedMessage
1223
+ id="item"
1224
+ defaultMessage="item"
1225
+ />
1226
+ ) : (
1227
+ <FormattedMessage
1228
+ id="items"
1229
+ defaultMessage="items"
1230
+ />
1231
+ )}
1232
+ </span>
1233
+ ),
1234
+ }}
1235
+ />
1236
+ {this.state.brokenReferences > 0 && (
1237
+ <>
1238
+ <br />
1239
+ <FormattedMessage
1240
+ id="Some items are referenced by other contents. By deleting them {brokenReferences} {variation} will be broken."
1241
+ defaultMessage="Some items are referenced by other contents. By deleting them {brokenReferences} {variation} will be broken."
1242
+ values={{
1243
+ brokenReferences: (
1244
+ <span>
1245
+ {this.state.brokenReferences}
1246
+ </span>
1247
+ ),
1248
+ variation: (
1249
+ <span>
1250
+ {this.state.brokenReferences ===
1251
+ 1 ? (
1252
+ <FormattedMessage
1253
+ id="reference"
1254
+ defaultMessage="reference"
1255
+ />
1256
+ ) : (
1257
+ <FormattedMessage
1258
+ id="references"
1259
+ defaultMessage="references"
1260
+ />
1261
+ )}
1262
+ </span>
1263
+ ),
1264
+ }}
1265
+ />
1266
+ </>
1267
+ )}
1268
+ </>
1269
+ ) : (
1270
+ <>
1271
+ {this.state.brokenReferences > 0 && (
1272
+ <>
1273
+ <FormattedMessage
1274
+ id="Some items are referenced by other contents. By deleting them {brokenReferences} {variation} will be broken."
1275
+ defaultMessage="Some items are referenced by other contents. By deleting them {brokenReferences} {variation} will be broken."
1276
+ values={{
1277
+ brokenReferences: (
1278
+ <span>
1279
+ {this.state.brokenReferences}
1280
+ </span>
1281
+ ),
1282
+ variation: (
1283
+ <span>
1284
+ {this.state.brokenReferences ===
1285
+ 1 ? (
1286
+ <FormattedMessage
1287
+ id="reference"
1288
+ defaultMessage="reference"
1289
+ />
1290
+ ) : (
1291
+ <FormattedMessage
1292
+ id="references"
1293
+ defaultMessage="references"
1294
+ />
1295
+ )}
1296
+ </span>
1297
+ ),
1298
+ }}
1299
+ />
1300
+ </>
1301
+ )}
1302
+ </>
1303
+ )
1304
+ ) : this.state.containedItemsToDelete > 0 ? (
1305
+ <>
1306
+ <FormattedMessage
1307
+ id="This item is also a folder.
1308
+ By deleting it you will delete {containedItemsToDelete} {variation} inside the folder."
1309
+ defaultMessage="This item is also a folder.
1310
+ By deleting it you will delete {containedItemsToDelete} {variation} inside the folder."
1311
+ values={{
1312
+ containedItemsToDelete: (
1313
+ <span>
1314
+ {this.state.containedItemsToDelete}
1315
+ </span>
1316
+ ),
1317
+ variation: (
1318
+ <span>
1319
+ {this.state.containedItemsToDelete ===
1320
+ 1 ? (
1321
+ <FormattedMessage
1322
+ id="item"
1323
+ defaultMessage="item"
1324
+ />
1325
+ ) : (
1326
+ <FormattedMessage
1327
+ id="items"
1328
+ defaultMessage="items"
1329
+ />
1262
1330
  )}
1263
- </p>
1264
- <ul className="content">
1265
- {map(item.breaches, (breach) => (
1266
- <li key={breach['@id']}>
1267
- <a href={breach['@id']}>
1268
- {breach.title}
1269
- </a>
1270
- </li>
1271
- ))}
1272
- </ul>
1273
- </li>
1274
- ) : null,
1331
+ </span>
1332
+ ),
1333
+ }}
1334
+ />
1335
+ {this.state.brokenReferences > 0 && (
1336
+ <>
1337
+ <br />
1338
+ <FormattedMessage
1339
+ id="This item is referenced by other items. By deleting it {brokenReferences} {variation} will be broken."
1340
+ defaultMessage="This item is referenced by other items. By deleting it {brokenReferences} {variation} will be broken."
1341
+ values={{
1342
+ brokenReferences: (
1343
+ <span>
1344
+ {this.state.brokenReferences}
1345
+ </span>
1346
+ ),
1347
+ variation: (
1348
+ <span>
1349
+ {this.state.brokenReferences === 1 ? (
1350
+ <FormattedMessage
1351
+ id="reference"
1352
+ defaultMessage="reference"
1353
+ />
1354
+ ) : (
1355
+ <FormattedMessage
1356
+ id="references"
1357
+ defaultMessage="references"
1358
+ />
1359
+ )}
1360
+ </span>
1361
+ ),
1362
+ }}
1363
+ />
1364
+ <div className="broken-links-list-link-wrapper">
1365
+ <Link
1366
+ to={flattenToAppURL(
1367
+ this.state.brokenLinksList,
1368
+ )}
1369
+ >
1370
+ <FormattedMessage
1371
+ id="View broken links list"
1372
+ defaultMessage="View broken links list"
1373
+ />
1374
+ </Link>
1375
+ </div>
1376
+ </>
1275
1377
  )}
1276
- </ul>
1277
- </div>
1278
- ) : (
1279
- <div></div>
1280
- )}
1378
+ </>
1379
+ ) : this.state.brokenReferences > 0 ? (
1380
+ <>
1381
+ <FormattedMessage
1382
+ id="This item is referenced by other items. By deleting it {brokenReferences} {variation} will be broken."
1383
+ defaultMessage="This item is referenced by other items. By deleting it {brokenReferences} {variation} will be broken."
1384
+ values={{
1385
+ brokenReferences: (
1386
+ <span>{this.state.brokenReferences}</span>
1387
+ ),
1388
+ variation: (
1389
+ <span>
1390
+ {this.state.brokenReferences === 1 ? (
1391
+ <FormattedMessage
1392
+ id="reference"
1393
+ defaultMessage="reference"
1394
+ />
1395
+ ) : (
1396
+ <FormattedMessage
1397
+ id="references"
1398
+ defaultMessage="references"
1399
+ />
1400
+ )}
1401
+ </span>
1402
+ ),
1403
+ }}
1404
+ />
1405
+ <div className="broken-links-list-link-wrapper">
1406
+ <Link
1407
+ to={flattenToAppURL(
1408
+ this.state.brokenLinksList,
1409
+ )}
1410
+ >
1411
+ <FormattedMessage
1412
+ id="View broken links list"
1413
+ defaultMessage="View broken links list"
1414
+ />
1415
+ </Link>
1416
+ </div>
1417
+ </>
1418
+ ) : null}
1419
+ </p>
1281
1420
  </div>
1282
1421
  }
1283
1422
  onCancel={this.onDeleteCancel}
@@ -1656,9 +1795,8 @@ class Contents extends Component {
1656
1795
  {this.props.intl.formatMessage({
1657
1796
  id: this.state.index.values[index]
1658
1797
  .label,
1659
- defaultMessage: this.state.index.values[
1660
- index
1661
- ].label,
1798
+ defaultMessage:
1799
+ this.state.index.values[index].label,
1662
1800
  })}
1663
1801
  </span>
1664
1802
  </Dropdown.Item>