@plone/volto 17.0.0-alpha.7 → 17.0.0-alpha.8

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 (79) hide show
  1. package/.yarn/install-state.gz +0 -0
  2. package/CHANGELOG.md +51 -0
  3. package/locales/ca/LC_MESSAGES/volto.po +146 -0
  4. package/locales/ca.json +1 -1
  5. package/locales/de/LC_MESSAGES/volto.po +146 -0
  6. package/locales/de.json +1 -1
  7. package/locales/en/LC_MESSAGES/volto.po +146 -0
  8. package/locales/en.json +1 -1
  9. package/locales/es/LC_MESSAGES/volto.po +146 -0
  10. package/locales/es.json +1 -1
  11. package/locales/eu/LC_MESSAGES/volto.po +146 -0
  12. package/locales/eu.json +1 -1
  13. package/locales/fi/LC_MESSAGES/volto.po +4762 -0
  14. package/locales/fi.json +1 -1
  15. package/locales/fr/LC_MESSAGES/volto.po +146 -0
  16. package/locales/fr.json +1 -1
  17. package/locales/it/LC_MESSAGES/volto.po +146 -0
  18. package/locales/it.json +1 -1
  19. package/locales/ja/LC_MESSAGES/volto.po +146 -0
  20. package/locales/ja.json +1 -1
  21. package/locales/nl/LC_MESSAGES/volto.po +801 -643
  22. package/locales/nl.json +1 -1
  23. package/locales/pt/LC_MESSAGES/volto.po +146 -0
  24. package/locales/pt.json +1 -1
  25. package/locales/pt_BR/LC_MESSAGES/volto.po +146 -0
  26. package/locales/pt_BR.json +1 -1
  27. package/locales/ro/LC_MESSAGES/volto.po +146 -0
  28. package/locales/ro.json +1 -1
  29. package/locales/volto.pot +147 -1
  30. package/locales/zh_CN/LC_MESSAGES/volto.po +146 -0
  31. package/locales/zh_CN.json +1 -1
  32. package/package.json +1 -1
  33. package/packages/volto-slate/build/messages/src/blocks/Table/TableBlockEdit.json +1 -1
  34. package/packages/volto-slate/build/messages/src/blocks/Text/DefaultTextBlockEditor.json +1 -1
  35. package/packages/volto-slate/build/messages/src/blocks/Text/DetachedTextBlockEditor.json +1 -1
  36. package/packages/volto-slate/build/messages/src/blocks/Text/SlashMenu.json +1 -1
  37. package/packages/volto-slate/build/messages/src/editor/plugins/AdvancedLink/index.json +1 -1
  38. package/packages/volto-slate/build/messages/src/editor/plugins/Link/index.json +1 -1
  39. package/packages/volto-slate/build/messages/src/editor/plugins/Table/index.json +1 -1
  40. package/packages/volto-slate/build/messages/src/elementEditor/messages.json +1 -1
  41. package/packages/volto-slate/build/messages/src/widgets/HtmlSlateWidget.json +1 -1
  42. package/packages/volto-slate/build/messages/src/widgets/RichTextWidgetView.json +1 -1
  43. package/packages/volto-slate/package.json +1 -1
  44. package/packages/volto-slate/src/blocks/Text/SlashMenu.jsx +4 -3
  45. package/packages/volto-slate/src/editor/deserialize.js +0 -1
  46. package/razzle.config.js +5 -0
  47. package/src/actions/index.js +6 -0
  48. package/src/actions/relations/rebuild.js +25 -0
  49. package/src/actions/relations/relations.js +86 -0
  50. package/src/actions/relations/relations.test.js +15 -0
  51. package/src/components/index.js +1 -0
  52. package/src/components/manage/BlockChooser/BlockChooser.jsx +8 -3
  53. package/src/components/manage/BlockChooser/BlockChooser.test.jsx +5 -0
  54. package/src/components/manage/Contents/Contents.jsx +5 -1
  55. package/src/components/manage/Contents/ContentsItem.jsx +6 -0
  56. package/src/components/manage/Controlpanels/Controlpanels.jsx +9 -0
  57. package/src/components/manage/Controlpanels/Relations/BrokenRelations.jsx +66 -0
  58. package/src/components/manage/Controlpanels/Relations/Relations.jsx +114 -0
  59. package/src/components/manage/Controlpanels/Relations/RelationsListing.jsx +479 -0
  60. package/src/components/manage/Controlpanels/Relations/RelationsMatrix.jsx +531 -0
  61. package/src/components/manage/Controlpanels/Users/UserGroupMembershipControlPanel.jsx +3 -3
  62. package/src/components/manage/Controlpanels/Users/UserGroupMembershipListing.jsx +51 -82
  63. package/src/components/manage/Controlpanels/Users/UserGroupMembershipMatrix.jsx +79 -75
  64. package/src/components/manage/Toast/Toast.jsx +1 -1
  65. package/src/components/theme/Widgets/RelationsWidget.jsx +13 -11
  66. package/src/config/ControlPanels.js +2 -0
  67. package/src/constants/ActionTypes.js +4 -0
  68. package/src/constants/Languages.js +8 -4
  69. package/src/helpers/Html/Html.jsx +3 -1
  70. package/src/helpers/Html/Html.test.jsx +5 -0
  71. package/src/helpers/MessageLabels/MessageLabels.js +72 -0
  72. package/src/reducers/actions/actions.js +1 -1
  73. package/src/reducers/breadcrumbs/breadcrumbs.js +1 -1
  74. package/src/reducers/index.js +2 -0
  75. package/src/reducers/navigation/navigation.js +1 -1
  76. package/src/reducers/relations/relations.js +173 -0
  77. package/src/reducers/types/types.js +1 -1
  78. package/src/routes.js +5 -0
  79. package/theme/themes/pastanaga/extras/userscontrolpanel.less +99 -76
@@ -9,8 +9,6 @@ import { listGroups } from '@plone/volto/actions';
9
9
  import { Icon, Toast } from '@plone/volto/components';
10
10
  import { updateGroup, listUsers } from '@plone/volto/actions';
11
11
 
12
- import add from '@plone/volto/icons/add.svg';
13
- import remove from '@plone/volto/icons/remove.svg';
14
12
  import down_key from '@plone/volto/icons/down-key.svg';
15
13
 
16
14
  const ListingTemplate = ({
@@ -116,7 +114,7 @@ const ListingTemplate = ({
116
114
  }
117
115
  }, [dispatch, query_group, show_matrix_options, groups_filter]);
118
116
 
119
- const onSelectOptionHandler = (item, selectedvalue, checked, singleClick) => {
117
+ const onSelectOptionHandler = (selectedvalue, checked, singleClick) => {
120
118
  singleClick = singleClick ?? false;
121
119
  let group = selectedvalue.y;
122
120
  let username = selectedvalue.x;
@@ -150,17 +148,14 @@ const ListingTemplate = ({
150
148
  });
151
149
  };
152
150
 
153
- const onSelectAllHandler = (mtxoption, checked) => {
154
- let elements = document.querySelectorAll(`div.checkbox_${mtxoption} input`);
155
- let identifier;
151
+ const onSelectAllHandler = (group, items_ids, checked) => {
156
152
  let usersgroupmapping = {};
157
- elements.forEach((element) => {
158
- identifier = element.name.split('_-_');
159
- usersgroupmapping[identifier[1]] = checked ? true : false;
153
+ items_ids.forEach((el) => {
154
+ usersgroupmapping[el] = checked ? true : false;
160
155
  });
161
156
 
162
157
  dispatch(
163
- updateGroup(identifier[2], {
158
+ updateGroup(group, {
164
159
  users: usersgroupmapping,
165
160
  }),
166
161
  )
@@ -188,93 +183,68 @@ const ListingTemplate = ({
188
183
  <div className="administration_matrix">
189
184
  {matrix_options && matrix_options?.length > 0 && (
190
185
  <div className="label-options">
191
- {matrix_options?.map((matrix_option) => (
192
- <div
193
- className="label-options-label inclined"
194
- key={matrix_option.value}
195
- >
196
- <div>
197
- <span className="label">{matrix_option.label}</span>
186
+ <div className="target-labels">
187
+ <div>
188
+ <h3>{items.length} users</h3>
189
+ </div>
190
+ <div>
191
+ {matrix_options?.map((matrix_option) => (
192
+ <div
193
+ className="label-options-label inclined"
194
+ key={matrix_option.value}
195
+ >
196
+ <div>
197
+ <span className="label">{matrix_option.label}</span>
198
+ </div>
199
+ </div>
200
+ ))}
201
+ </div>
202
+ </div>
203
+ <div className="listing-row selectall" key="selectall">
204
+ <div className="listing-item">
205
+ <div />
206
+ <div className="matrix_options">
207
+ {matrix_options?.map((matrix_option) => (
208
+ <div key={matrix_option.value}>
209
+ <Checkbox
210
+ className="toggle-target"
211
+ defaultChecked={false}
212
+ onChange={(event, { checked }) =>
213
+ onSelectAllHandler(
214
+ matrix_option.value,
215
+ items.map((el) => el.id),
216
+ checked,
217
+ )
218
+ }
219
+ />
220
+ </div>
221
+ ))}
198
222
  </div>
199
223
  </div>
200
- ))}
224
+ </div>
201
225
  </div>
202
226
  )}
203
227
 
204
228
  <div className="items">
205
229
  {items.length > 0 ? (
206
230
  <>
207
- <div className="listing-row selectall" key="selectall">
208
- <div className="listing-item">
209
- <div />
210
- <div className="matrix_options">
211
- {matrix_options?.map((matrix_option) => (
212
- <div key={matrix_option.value}>
213
- <Button
214
- icon
215
- basic
216
- onClick={() =>
217
- onSelectAllHandler(matrix_option.value, true)
218
- }
219
- className="add-button"
220
- aria-label={
221
- intl.formatMessage(messages.addUsersToGroup) +
222
- ` ${matrix_option.label}`
223
- }
224
- title={
225
- intl.formatMessage(messages.addUsersToGroup) +
226
- ` ${matrix_option.label}`
227
- }
228
- >
229
- <Icon
230
- name={add}
231
- size="10px"
232
- className="circled"
233
- color="unset"
234
- />
235
- </Button>
236
- <Button
237
- icon
238
- basic
239
- onClick={() =>
240
- onSelectAllHandler(matrix_option.value, false)
241
- }
242
- className="remove-button"
243
- aria-label={
244
- intl.formatMessage(messages.removeUsersFromGroup) +
245
- ` ${matrix_option.label}`
246
- }
247
- title={
248
- intl.formatMessage(messages.removeUsersFromGroup) +
249
- ` ${matrix_option.label}`
250
- }
251
- >
252
- <Icon
253
- name={remove}
254
- size="10px"
255
- className="circled"
256
- color="unset"
257
- />
258
- </Button>
259
- </div>
260
- ))}
261
- </div>
262
- </div>
263
- </div>
264
-
265
- <h3>{items.length} users </h3>
266
231
  {items.map((item) => (
267
- <div className="listing-row" key={item.id}>
232
+ <div
233
+ className="listing-row"
234
+ key={item.id}
235
+ id={`source-row-${item.id}`}
236
+ >
268
237
  <div className="listing-item" key={item['@id']}>
269
238
  <div>
270
- <h4>
271
- {item.fullname} ({item.id})
239
+ <h4 title={`${item.fullname} ${item.id}`}>
240
+ {item.fullname?.length > 25
241
+ ? item.fullname.slice(0, 22) + '...'
242
+ : item.fullname || item.id}
272
243
  </h4>
273
244
  </div>
274
245
  <div className="matrix_options">
275
246
  {matrix_options?.map((matrix_option) => (
276
247
  <Checkbox
277
- name={`member_-_${item.id}_-_${matrix_option.value}`}
278
248
  className={`checkbox_${matrix_option.value}`}
279
249
  key={matrix_option.value}
280
250
  title={matrix_option.title}
@@ -283,7 +253,6 @@ const ListingTemplate = ({
283
253
  .includes(matrix_option.value)}
284
254
  onChange={(event, { checked }) => {
285
255
  onSelectOptionHandler(
286
- item,
287
256
  { y: matrix_option.value, x: item.id },
288
257
  checked,
289
258
  true,
@@ -122,83 +122,87 @@ const UserGroupMembershipMatrix = ({ many_users, many_groups }) => {
122
122
 
123
123
  return (
124
124
  <div className="controlpanel_matrix">
125
- <div className="controlpanel_search_y">
126
- <Form className="search_users" onSubmit={onReset}>
127
- <Form.Field>
128
- <Input
129
- name="SearchUser"
130
- action={{ icon: 'delete' }}
131
- placeholder={intl.formatMessage(messages.searchUsers)}
132
- onChange={onChangeSearchUsers}
133
- onKeyDown={onChangeSearchUsers}
134
- id="user-search-input"
135
- />
136
- </Form.Field>
137
- </Form>
125
+ <div className="controlpanel_search_wrapper">
126
+ <div className="controlpanel_search_y">
127
+ <Form className="search_users" onSubmit={onReset}>
128
+ <Form.Field>
129
+ <Input
130
+ name="SearchUser"
131
+ action={{ icon: 'delete' }}
132
+ placeholder={intl.formatMessage(messages.searchUsers)}
133
+ onChange={onChangeSearchUsers}
134
+ onKeyDown={onChangeSearchUsers}
135
+ id="user-search-input"
136
+ />
137
+ </Form.Field>
138
+ </Form>
139
+ </div>
140
+ <div className="controlpanel_search_x">
141
+ <Form className="search_groups" onSubmit={onReset}>
142
+ <Form.Field>
143
+ <Input
144
+ name="SearchGroup"
145
+ action={{ icon: 'delete' }}
146
+ placeholder={intl.formatMessage(messages.searchGroups)}
147
+ onChange={onChangeSearchGroups}
148
+ onKeyDown={onChangeSearchGroups}
149
+ id="group-search-input"
150
+ />
151
+ </Form.Field>
152
+ <Form.Field>
153
+ <Checkbox
154
+ name="addJoinedGroups"
155
+ label={intl.formatMessage(messages.addJoinedGroups)}
156
+ title={intl.formatMessage(messages.addJoinedGroups)}
157
+ defaultChecked={false}
158
+ onChange={(event, { checked }) => {
159
+ onToggleJoinedGroups(checked);
160
+ }}
161
+ />
162
+ </Form.Field>
163
+ </Form>
164
+ </div>
138
165
  </div>
139
- <div className="controlpanel_search_x">
140
- <Form className="search_groups" onSubmit={onReset}>
141
- <Form.Field>
142
- <Input
143
- name="SearchGroup"
144
- action={{ icon: 'delete' }}
145
- placeholder={intl.formatMessage(messages.searchGroups)}
146
- onChange={onChangeSearchGroups}
147
- onKeyDown={onChangeSearchGroups}
148
- id="group-search-input"
149
- />
150
- </Form.Field>
151
- <Form.Field>
152
- <Checkbox
153
- name="addJoinedGroups"
154
- label={intl.formatMessage(messages.addJoinedGroups)}
155
- title={intl.formatMessage(messages.addJoinedGroups)}
156
- defaultChecked={false}
157
- onChange={(event, { checked }) => {
158
- onToggleJoinedGroups(checked);
159
- }}
160
- />
161
- </Form.Field>
162
- </Form>
166
+ <div className="controlpanel_listing_wrapper">
167
+ <div className="controlpanel_filter">
168
+ <h3>{intl.formatMessage(messages.filterByGroups)}</h3>
169
+ <Form className="search_filter_groups" onSubmit={onReset}>
170
+ <Form.Field>
171
+ <Input
172
+ name="SearchGroupFilter"
173
+ action={{ icon: 'delete' }}
174
+ placeholder={intl.formatMessage(messages.searchGroups)}
175
+ onChange={onChangeSearchGroupsFilter}
176
+ onKeyDown={onChangeSearchGroupsFilter}
177
+ id="groupfilter-search-input"
178
+ />
179
+ </Form.Field>
180
+ </Form>
181
+ {(!many_groups || query_group_filter.length > 1) &&
182
+ filter_options?.map((filter_option) => (
183
+ <Form.Field>
184
+ <Checkbox
185
+ name={`filter_option_${filter_option.value}`}
186
+ key={filter_option.value}
187
+ title={filter_option.label}
188
+ label={filter_option.label}
189
+ defaultChecked={false}
190
+ onChange={(event, { checked }) => {
191
+ onSelectOptionHandler(filter_option, checked);
192
+ }}
193
+ />
194
+ </Form.Field>
195
+ ))}
196
+ </div>
197
+ <UserGroupMembershipListing
198
+ query_user={query_user}
199
+ query_group={query_group}
200
+ groups_filter={groups_filter}
201
+ add_joined_groups={add_joined_groups}
202
+ many_users={many_users}
203
+ many_groups={many_groups}
204
+ />
163
205
  </div>
164
- <div className="controlpanel_filter">
165
- <h3>{intl.formatMessage(messages.filterByGroups)}</h3>
166
-
167
- <Form className="search_filter_groups" onSubmit={onReset}>
168
- <Form.Field>
169
- <Input
170
- name="SearchGroupFilter"
171
- action={{ icon: 'delete' }}
172
- placeholder={intl.formatMessage(messages.searchGroups)}
173
- onChange={onChangeSearchGroupsFilter}
174
- onKeyDown={onChangeSearchGroupsFilter}
175
- id="groupfilter-search-input"
176
- />
177
- </Form.Field>
178
- </Form>
179
-
180
- {(!many_groups || query_group_filter.length > 1) &&
181
- filter_options?.map((filter_option) => (
182
- <Checkbox
183
- name={`filter_option_${filter_option.value}`}
184
- key={filter_option.value}
185
- title={filter_option.label}
186
- label={filter_option.label}
187
- defaultChecked={false}
188
- onChange={(event, { checked }) => {
189
- onSelectOptionHandler(filter_option, checked);
190
- }}
191
- />
192
- ))}
193
- </div>
194
- <UserGroupMembershipListing
195
- query_user={query_user}
196
- query_group={query_group}
197
- groups_filter={groups_filter}
198
- add_joined_groups={add_joined_groups}
199
- many_users={many_users}
200
- many_groups={many_groups}
201
- />
202
206
  </div>
203
207
  );
204
208
  };
@@ -15,7 +15,7 @@ const Toast = (props) => {
15
15
  return successSVG;
16
16
  } else if (props.error) {
17
17
  return errorSVG;
18
- } else if (props.error) {
18
+ } else if (props.warning) {
19
19
  return warningSVG;
20
20
  } else {
21
21
  return successSVG;
@@ -5,17 +5,19 @@ import RelationWidget from './RelationWidget';
5
5
  const RelationsWidget = ({ value, children, className }) =>
6
6
  value ? (
7
7
  <ul className={cx(className, 'relations', 'widget')}>
8
- {value.map((item, key) => (
9
- <li key={key}>
10
- <RelationWidget
11
- value={item}
12
- className={className}
13
- key={item.token || item.title || item}
14
- >
15
- {children}
16
- </RelationWidget>
17
- </li>
18
- ))}
8
+ {value.map((item, key) => {
9
+ return item ? (
10
+ <li key={key}>
11
+ <RelationWidget
12
+ value={item || `relation target not found '${key}'`}
13
+ className={className}
14
+ key={item.token || item.title || item}
15
+ >
16
+ {children}
17
+ </RelationWidget>
18
+ </li>
19
+ ) : null;
20
+ })}
19
21
  </ul>
20
22
  ) : (
21
23
  ''
@@ -18,6 +18,7 @@ import settingsSVG from '@plone/volto/icons/settings.svg';
18
18
  import rulesSVG from '@plone/volto/icons/content-existing.svg';
19
19
  import undoControlPanelSVG from '@plone/volto/icons/undo-control-panel.svg';
20
20
  import linkSVG from '@plone/volto/icons/link.svg';
21
+ import relationsSVG from '@plone/volto/icons/ahead.svg';
21
22
 
22
23
  export const controlPanelsIcons = {
23
24
  default: settingsSVG,
@@ -40,6 +41,7 @@ export const controlPanelsIcons = {
40
41
  rules: rulesSVG,
41
42
  undo: undoControlPanelSVG,
42
43
  aliases: linkSVG,
44
+ relations: relationsSVG,
43
45
  };
44
46
 
45
47
  export const filterControlPanels = (controlpanels) => {
@@ -36,6 +36,10 @@ export const GET_NAVIGATION = 'GET_NAVIGATION';
36
36
  export const GET_PRINCIPALS = 'GET_PRINCIPALS';
37
37
  export const GET_QUERYSTRING = 'GET_QUERYSTRING';
38
38
  export const GET_QUERYSTRING_RESULTS = 'GET_QUERYSTRING_RESULTS';
39
+ export const CREATE_RELATIONS = 'CREATE_RELATIONS';
40
+ export const DELETE_RELATIONS = 'DELETE_RELATIONS';
41
+ export const LIST_RELATIONS = 'LIST_RELATIONS';
42
+ export const REBUILD_RELATIONS = 'REBUILD_RELATIONS';
39
43
  export const GET_SCHEMA = 'GET_SCHEMA';
40
44
  export const POST_SCHEMA = 'POST_SCHEMA';
41
45
  export const PUT_SCHEMA = 'PUT_SCHEMA';
@@ -4,14 +4,18 @@
4
4
  */
5
5
 
6
6
  module.exports = {
7
- en: 'English',
7
+ ca: 'Català',
8
8
  de: 'Deutsch',
9
+ en: 'English',
10
+ es: 'Español',
11
+ eu: 'Euskara',
12
+ fi: 'Suomi',
13
+ fr: 'Français',
14
+ it: 'Italiano',
9
15
  nl: 'Nederlands',
10
16
  ro: 'Română',
11
17
  ja: '日本語',
12
18
  pt: 'Português',
13
19
  pt_BR: 'Português (Brasil)',
14
- es: 'Spanish',
15
- it: 'Italian',
16
- eu: 'Euskara',
20
+ zh_CN: '中文',
17
21
  };
@@ -97,8 +97,10 @@ class Html extends Component {
97
97
  } = this.props;
98
98
  const head = Helmet.rewind();
99
99
  const bodyClass = join(BodyClass.rewind(), ' ');
100
+ const htmlAttributes = head.htmlAttributes.toComponent();
101
+
100
102
  return (
101
- <html lang="en">
103
+ <html lang={htmlAttributes.lang}>
102
104
  <head>
103
105
  <meta charSet="utf-8" />
104
106
  {head.base.toComponent()}
@@ -20,6 +20,11 @@ jest.mock('../Helmet/Helmet', () => ({
20
20
  script: {
21
21
  toComponent: () => '',
22
22
  },
23
+ htmlAttributes: {
24
+ toComponent: () => ({
25
+ lang: 'en',
26
+ }),
27
+ },
23
28
  }),
24
29
  }));
25
30
 
@@ -260,4 +260,76 @@ export const messages = defineMessages({
260
260
  id: 'Show groups of users below',
261
261
  defaultMessage: 'Show groups of users below',
262
262
  },
263
+ inspectRelations: {
264
+ id: 'Inspect relations',
265
+ defaultMessage: 'Inspect relations',
266
+ },
267
+ relations: {
268
+ id: 'Relations',
269
+ defaultMessage: 'Relations',
270
+ },
271
+ fixRelations: {
272
+ id: 'Fix relations',
273
+ defaultMessage: 'Fix relations',
274
+ },
275
+ searchRelationSource: {
276
+ id: 'Search sources by title or path',
277
+ defaultMessage: 'Search sources by title or path',
278
+ },
279
+ searchRelationTarget: {
280
+ id: 'Search targets by title or path',
281
+ defaultMessage: 'Search targets by title or path',
282
+ },
283
+ createOrDeleteRelationsToTarget: {
284
+ id: 'Create or delete relations to target',
285
+ defaultMessage: 'Create or delete relations to target',
286
+ },
287
+ relationName: {
288
+ id: 'Relation name',
289
+ defaultMessage: 'relation',
290
+ },
291
+ selectRelation: {
292
+ id: 'Select relation',
293
+ defaultMessage: 'Select relation',
294
+ },
295
+ norelationfound: {
296
+ id: 'No relation found',
297
+ defaultMessage: 'No relation found',
298
+ },
299
+ toomanyrelationsfound: {
300
+ id: 'Many relations found. Please search.',
301
+ defaultMessage: 'Many relations found. Please search.',
302
+ },
303
+ rebuildRelations: {
304
+ id: 'rebuild relations',
305
+ defaultMessage: 'rebuild relations',
306
+ },
307
+ flushAndRebuildRelations: {
308
+ id: 'flush intIds and rebuild relations',
309
+ defaultMessage: 'flush intIds and rebuild relations',
310
+ },
311
+ addPotentialTargetsPath: {
312
+ id: 'target path',
313
+ defaultMessage: 'target path',
314
+ },
315
+ addPotentialSourcesPath: {
316
+ id: 'sources path',
317
+ defaultMessage: 'sources path',
318
+ },
319
+ relationsUpdated: {
320
+ id: 'Relations updated',
321
+ defaultMessage: 'Relations updated',
322
+ },
323
+ select: {
324
+ id: 'Select',
325
+ defaultMessage: 'Select',
326
+ },
327
+ selected: {
328
+ id: 'Selected',
329
+ defaultMessage: 'Selected',
330
+ },
331
+ filter: {
332
+ id: 'Filter',
333
+ defaultMessage: 'Filter',
334
+ },
263
335
  });
@@ -46,7 +46,7 @@ export default function actions(state = initialState, action = {}) {
46
46
  'actions',
47
47
  getBaseUrl(flattenToAppURL(action.result['@id'])),
48
48
  );
49
- if (hasExpander) {
49
+ if (hasExpander && !action.subrequest) {
50
50
  return {
51
51
  ...state,
52
52
  error: null,
@@ -45,7 +45,7 @@ export default function breadcrumbs(state = initialState, action = {}) {
45
45
  'breadcrumbs',
46
46
  getBaseUrl(flattenToAppURL(action.result['@id'])),
47
47
  );
48
- if (hasExpander) {
48
+ if (hasExpander && !action.subrequest) {
49
49
  return {
50
50
  ...state,
51
51
  error: null,
@@ -25,6 +25,7 @@ import messages from '@plone/volto/reducers/messages/messages';
25
25
  import navigation from '@plone/volto/reducers/navigation/navigation';
26
26
  import querystring from '@plone/volto/reducers/querystring/querystring';
27
27
  import querystringsearch from '@plone/volto/reducers/querystringsearch/querystringsearch';
28
+ import relations from '@plone/volto/reducers/relations/relations';
28
29
  import roles from '@plone/volto/reducers/roles/roles';
29
30
  import rules from '@plone/volto/reducers/rules/rules';
30
31
  import controlpanelrule from '@plone/volto/reducers/controlPanelRule/controlPanelRule';
@@ -80,6 +81,7 @@ const reducers = {
80
81
  navigation,
81
82
  querystring,
82
83
  querystringsearch,
84
+ relations,
83
85
  roles,
84
86
  rules,
85
87
  controlpanelrule,
@@ -60,7 +60,7 @@ export default function navigation(state = initialState, action = {}) {
60
60
  'navigation',
61
61
  getBaseUrl(flattenToAppURL(action.result['@id'])),
62
62
  );
63
- if (hasExpander) {
63
+ if (hasExpander && !action.subrequest) {
64
64
  return {
65
65
  ...state,
66
66
  error: null,