@eeacms/volto-eea-website-theme 0.6.14 → 0.6.17

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/CHANGELOG.md CHANGED
@@ -4,8 +4,34 @@ All notable changes to this project will be documented in this file. Dates are d
4
4
 
5
5
  Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
6
6
 
7
+ #### [0.6.17](https://github.com/eea/volto-eea-website-theme/compare/0.6.16...0.6.17)
8
+
9
+ - Set focus on search input field in the popup on click [`#50`](https://github.com/eea/volto-eea-website-theme/pull/50)
10
+
11
+ #### [0.6.16](https://github.com/eea/volto-eea-website-theme/compare/0.6.15...0.6.16)
12
+
13
+ > 1 August 2022
14
+
15
+ - Release [`#49`](https://github.com/eea/volto-eea-website-theme/pull/49)
16
+ - Nonapi breadcrumbs [`#48`](https://github.com/eea/volto-eea-website-theme/pull/48)
17
+ - Make Breadcrumbs behave better with non-content routes [`9407840`](https://github.com/eea/volto-eea-website-theme/commit/94078403458a5a3ea725ce9126fffed9d463097d)
18
+ - change(megamenu): add border for active element of menu [`252efc4`](https://github.com/eea/volto-eea-website-theme/commit/252efc4485961c8d05e3703fee06179a0fdc8da3)
19
+ - change(footer): tweaked size of eionet logo to follow size of eea logo [`fcfa8ee`](https://github.com/eea/volto-eea-website-theme/commit/fcfa8ee00cffbc147eefa0f614b366c94f30945d)
20
+ - feature(theme): added context navigation component [`083b1c2`](https://github.com/eea/volto-eea-website-theme/commit/083b1c272623c720ebfeb4338e59c2cefcb29ecc)
21
+
22
+ #### [0.6.15](https://github.com/eea/volto-eea-website-theme/compare/0.6.14...0.6.15)
23
+
24
+ > 1 July 2022
25
+
26
+ - Release [`#47`](https://github.com/eea/volto-eea-website-theme/pull/47)
27
+ - Moved customized Toolbar to volto-eea-website-policy [`403b06d`](https://github.com/eea/volto-eea-website-theme/commit/403b06dd1225f4f15883d938d47facfe730a3699)
28
+ - change(logo): use a real svg logo for white eea logo [`e2703af`](https://github.com/eea/volto-eea-website-theme/commit/e2703af2bf3779ad3aa21fa673fa5652691a9f25)
29
+
7
30
  #### [0.6.14](https://github.com/eea/volto-eea-website-theme/compare/0.6.13...0.6.14)
8
31
 
32
+ > 30 June 2022
33
+
34
+ - develop [`#46`](https://github.com/eea/volto-eea-website-theme/pull/46)
9
35
  - change(header): show eea information systems on mobile [`abdf181`](https://github.com/eea/volto-eea-website-theme/commit/abdf1819465ba1ca582c2a2d82ec02a137c0cf7f)
10
36
  - change(pageheader): share dropdown appears below the share icon [`10aaafc`](https://github.com/eea/volto-eea-website-theme/commit/10aaafc79d03784972b7cf40639077246340eda9)
11
37
  - change(pageheader): removed blogger, reddit and stumbleupon sharing links [`0f7d887`](https://github.com/eea/volto-eea-website-theme/commit/0f7d88700076704abb04ba1bf806ab669fe085be)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eeacms/volto-eea-website-theme",
3
- "version": "0.6.14",
3
+ "version": "0.6.17",
4
4
  "description": "@eeacms/volto-eea-website-theme: Volto add-on",
5
5
  "main": "src/index.js",
6
6
  "author": "European Environment Agency: IDM2 A-Team",
package/src/config.js CHANGED
@@ -8,7 +8,7 @@ import copernicusLogo from '@eeacms/volto-eea-design-system/../theme/themes/eea/
8
8
  import industryLogo from '@eeacms/volto-eea-design-system/../theme/themes/eea/assets/logo/industry.svg';
9
9
  import marineLogo from '@eeacms/volto-eea-design-system/../theme/themes/eea/assets/logo/marine.svg';
10
10
  import eionetLogo from '@eeacms/volto-eea-design-system/../theme/themes/eea/assets/logo/eionet.svg';
11
- import eeaLogo from '@eeacms/volto-eea-design-system/../theme/themes/eea/assets/logo/eea.svg';
11
+ import eeaLogo from '@eeacms/volto-eea-design-system/../theme/themes/eea/assets/logo/eea-white.svg';
12
12
  import climateLogo from '@eeacms/volto-eea-design-system/../theme/themes/eea/assets/logo/climate-health.svg';
13
13
 
14
14
  // TODO: to be consolidated with headerLinks
@@ -108,7 +108,7 @@ export const footerOpts = {
108
108
  columnSize: {
109
109
  mobile: 6,
110
110
  tablet: 12,
111
- computer: 7,
111
+ computer: 6,
112
112
  },
113
113
  },
114
114
  ],
@@ -3,7 +3,12 @@ import { Container, Input } from 'semantic-ui-react';
3
3
  import { withRouter } from 'react-router-dom';
4
4
  import { useClickOutside } from '@eeacms/volto-eea-design-system/helpers';
5
5
 
6
- function HeaderSearchPopUp({ history, onClose, triggerRefs = [] }) {
6
+ function HeaderSearchPopUp({
7
+ history,
8
+ onClose,
9
+ searchInputRef,
10
+ triggerRefs = [],
11
+ }) {
7
12
  const nodeRef = React.useRef();
8
13
  const [text, setText] = React.useState('');
9
14
 
@@ -30,6 +35,7 @@ function HeaderSearchPopUp({ history, onClose, triggerRefs = [] }) {
30
35
  <Container>
31
36
  <div className="wrapper">
32
37
  <Input
38
+ ref={searchInputRef}
33
39
  className="search"
34
40
  onChange={onChangeText}
35
41
  icon={{
@@ -6,14 +6,35 @@
6
6
  import React, { useEffect } from 'react';
7
7
  import { useDispatch, useSelector } from 'react-redux';
8
8
 
9
+ import { useLocation } from 'react-router';
9
10
  import { getBaseUrl, hasApiExpander } from '@plone/volto/helpers';
10
11
  import { getBreadcrumbs } from '@plone/volto/actions';
12
+ import config from '@plone/volto/registry';
13
+
11
14
  import EEABreadcrumbs from '@eeacms/volto-eea-design-system/ui/Breadcrumbs/Breadcrumbs';
12
15
 
16
+ const isContentRoute = (pathname) => {
17
+ const { settings } = config;
18
+ const normalized_nonContentRoutes = settings.nonContentRoutes.map((item) => {
19
+ if (item.test) {
20
+ return item;
21
+ } else {
22
+ return new RegExp(item + '$');
23
+ }
24
+ });
25
+
26
+ const isNonContentRoute =
27
+ normalized_nonContentRoutes.findIndex((item) => item.test(pathname)) > -1;
28
+
29
+ return !isNonContentRoute;
30
+ };
31
+
13
32
  const Breadcrumbs = (props) => {
14
33
  const dispatch = useDispatch();
15
34
  const { items = [], root = '/' } = useSelector((state) => state?.breadcrumbs);
16
- const { pathname } = props;
35
+ // const pathname = useSelector((state) => state.location.pathname);
36
+ const location = useLocation();
37
+ const { pathname } = location;
17
38
 
18
39
  const sections = items.map((item) => ({
19
40
  title: item.title,
@@ -22,7 +43,10 @@ const Breadcrumbs = (props) => {
22
43
  }));
23
44
 
24
45
  useEffect(() => {
25
- if (!hasApiExpander('breadcrumbs', getBaseUrl(pathname))) {
46
+ if (
47
+ !hasApiExpander('breadcrumbs', getBaseUrl(pathname)) &&
48
+ isContentRoute(pathname)
49
+ ) {
26
50
  dispatch(getBreadcrumbs(getBaseUrl(pathname)));
27
51
  }
28
52
  }, [dispatch, pathname]);
@@ -18,7 +18,7 @@ import { getNavigation } from '@plone/volto/actions';
18
18
  import { Header, Logo } from '@eeacms/volto-eea-design-system/ui';
19
19
  import { usePrevious } from '@eeacms/volto-eea-design-system/helpers';
20
20
  import { find } from 'lodash';
21
- import WhiteLogoImage from '@eeacms/volto-eea-design-system/../theme/themes/eea/assets/logo/eea.svg';
21
+ import WhiteLogoImage from '@eeacms/volto-eea-design-system/../theme/themes/eea/assets/logo/eea-white.svg';
22
22
  import LogoImage from '@eeacms/volto-eea-design-system/../theme/themes/eea/assets/images/Header/eea-logo.svg';
23
23
  import globeIcon from '@eeacms/volto-eea-design-system/../theme/themes/eea/assets/images/Header/global-line.svg';
24
24
  import eeaFlag from '@eeacms/volto-eea-design-system/../theme/themes/eea/assets/images/Header/eea.png';
@@ -27,6 +27,8 @@ import config from '@plone/volto/registry';
27
27
  import { compose } from 'recompose';
28
28
  import { BodyClass } from '@plone/volto/helpers';
29
29
 
30
+ import cx from 'classnames';
31
+
30
32
  /**
31
33
  * EEA Specific Header component.
32
34
  */
@@ -192,9 +194,17 @@ const EEAHeader = ({ pathname, token, items, history }) => {
192
194
  {item.title}
193
195
  </a>
194
196
  )}
195
- renderMenuItem={(item) => (
196
- <UniversalLink href={item.url || '/'} title={item.title}>
197
- <span className={'item'}>{item.title}</span>
197
+ renderMenuItem={(item, options, props) => (
198
+ <UniversalLink
199
+ href={item.url || '/'}
200
+ title={item.title}
201
+ {...(options || {})}
202
+ className={cx(options?.className, {
203
+ active: item.url === router_pathname,
204
+ })}
205
+ >
206
+ {props?.children}
207
+ <span>{item.title}</span>
198
208
  </UniversalLink>
199
209
  )}
200
210
  ></Header.Main>
@@ -86,6 +86,7 @@
86
86
  @tag : 'eea';
87
87
  @tags : 'eea';
88
88
  @tagList : 'eea';
89
+ @contextNavigation : 'eea';
89
90
  @inpageNavigation : 'eea';
90
91
  @avatar : 'eea';
91
92
  @divider : 'eea';
@@ -1,589 +0,0 @@
1
- /**
2
- * Toolbar component.
3
- * @module components/manage/Toolbar/Toolbar
4
- */
5
-
6
- import React, { Component } from 'react';
7
- import { defineMessages, injectIntl } from 'react-intl';
8
- import PropTypes from 'prop-types';
9
- import { Link } from 'react-router-dom';
10
- import jwtDecode from 'jwt-decode';
11
- import { connect } from 'react-redux';
12
- import { compose } from 'redux';
13
- import { doesNodeContainClick } from 'semantic-ui-react/dist/commonjs/lib';
14
- import { withCookies } from 'react-cookie';
15
- import { filter, find } from 'lodash';
16
- import cx from 'classnames';
17
- import config from '@plone/volto/registry';
18
-
19
- import More from '@plone/volto/components/manage/Toolbar/More';
20
- import PersonalTools from '@plone/volto/components/manage/Toolbar/PersonalTools';
21
- import Types from '@plone/volto/components/manage/Toolbar/Types';
22
- import PersonalInformation from '@plone/volto/components/manage/Preferences/PersonalInformation';
23
- import PersonalPreferences from '@plone/volto/components/manage/Preferences/PersonalPreferences';
24
- import StandardWrapper from '@plone/volto/components/manage/Toolbar/StandardWrapper';
25
- import {
26
- getTypes,
27
- listActions,
28
- setExpandedToolbar,
29
- unlockContent,
30
- } from '@plone/volto/actions';
31
- import { Icon } from '@plone/volto/components';
32
- import { BodyClass, getBaseUrl, getCookieOptions } from '@plone/volto/helpers';
33
- import { Pluggable } from '@plone/volto/components/manage/Pluggable';
34
-
35
- import penSVG from '@plone/volto/icons/pen.svg';
36
- import unlockSVG from '@plone/volto/icons/unlock.svg';
37
- import folderSVG from '@plone/volto/icons/folder.svg';
38
- import addSVG from '@plone/volto/icons/add-document.svg';
39
- import moreSVG from '@plone/volto/icons/more.svg';
40
- import userSVG from '@plone/volto/icons/user.svg';
41
- import clearSVG from '@plone/volto/icons/clear.svg';
42
-
43
- const messages = defineMessages({
44
- edit: {
45
- id: 'Edit',
46
- defaultMessage: 'Edit',
47
- },
48
- contents: {
49
- id: 'Contents',
50
- defaultMessage: 'Contents',
51
- },
52
- add: {
53
- id: 'Add',
54
- defaultMessage: 'Add',
55
- },
56
- more: {
57
- id: 'More',
58
- defaultMessage: 'More',
59
- },
60
- personalTools: {
61
- id: 'Personal tools',
62
- defaultMessage: 'Personal tools',
63
- },
64
- shrinkToolbar: {
65
- id: 'Shrink toolbar',
66
- defaultMessage: 'Shrink toolbar',
67
- },
68
- personalInformation: {
69
- id: 'Personal Information',
70
- defaultMessage: 'Personal Information',
71
- },
72
- personalPreferences: {
73
- id: 'Personal Preferences',
74
- defaultMessage: 'Personal Preferences',
75
- },
76
- collection: {
77
- id: 'Collection',
78
- defaultMessage: 'Collection',
79
- },
80
- file: {
81
- id: 'File',
82
- defaultMessage: 'File',
83
- },
84
- link: {
85
- id: 'Link',
86
- defaultMessage: 'Link',
87
- },
88
- newsItem: {
89
- id: 'News Item',
90
- defaultMessage: 'News Item',
91
- },
92
- page: {
93
- id: 'Page',
94
- defaultMessage: 'Page',
95
- },
96
- back: {
97
- id: 'Back',
98
- defaultMessage: 'Back',
99
- },
100
- unlock: {
101
- id: 'Unlock',
102
- defaultMessage: 'Unlock',
103
- },
104
- });
105
-
106
- const toolbarComponents = {
107
- personalTools: { component: PersonalTools, wrapper: null },
108
- more: { component: More, wrapper: null },
109
- types: { component: Types, wrapper: null, contentAsProps: true },
110
- profile: {
111
- component: PersonalInformation,
112
- wrapper: StandardWrapper,
113
- wrapperTitle: messages.personalInformation,
114
- hideToolbarBody: true,
115
- },
116
- preferences: {
117
- component: PersonalPreferences,
118
- wrapper: StandardWrapper,
119
- wrapperTitle: messages.personalPreferences,
120
- hideToolbarBody: true,
121
- },
122
- };
123
-
124
- /**
125
- * Toolbar container class.
126
- * @class Toolbar
127
- * @extends Component
128
- */
129
- class Toolbar extends Component {
130
- /**
131
- * Property types.
132
- * @property {Object} propTypes Property types.
133
- * @static
134
- */
135
- static propTypes = {
136
- actions: PropTypes.shape({
137
- object: PropTypes.arrayOf(PropTypes.object),
138
- object_buttons: PropTypes.arrayOf(PropTypes.object),
139
- user: PropTypes.arrayOf(PropTypes.object),
140
- }),
141
- token: PropTypes.string,
142
- userId: PropTypes.string,
143
- pathname: PropTypes.string.isRequired,
144
- content: PropTypes.shape({
145
- '@type': PropTypes.string,
146
- is_folderish: PropTypes.bool,
147
- review_state: PropTypes.string,
148
- }),
149
- getTypes: PropTypes.func.isRequired,
150
- types: PropTypes.arrayOf(
151
- PropTypes.shape({
152
- '@id': PropTypes.string,
153
- addable: PropTypes.bool,
154
- title: PropTypes.string,
155
- }),
156
- ),
157
- listActions: PropTypes.func.isRequired,
158
- unlockContent: PropTypes.func,
159
- unlockRequest: PropTypes.objectOf(PropTypes.any),
160
- inner: PropTypes.element.isRequired,
161
- hideDefaultViewButtons: PropTypes.bool,
162
- };
163
-
164
- /**
165
- * Default properties.
166
- * @property {Object} defaultProps Default properties.
167
- * @static
168
- */
169
- static defaultProps = {
170
- actions: null,
171
- token: null,
172
- userId: null,
173
- content: null,
174
- hideDefaultViewButtons: false,
175
- types: [],
176
- };
177
-
178
- toolbarWindow = React.createRef();
179
-
180
- constructor(props) {
181
- super(props);
182
- const { cookies } = props;
183
- this.state = {
184
- expanded: cookies.get('toolbar_expanded') !== 'false',
185
- showMenu: false,
186
- menuStyle: {},
187
- menuComponents: [],
188
- loadedComponents: [],
189
- hideToolbarBody: false,
190
- };
191
- }
192
-
193
- /**
194
- * Component will mount
195
- * @method componentDidMount
196
- * @returns {undefined}
197
- */
198
- componentDidMount() {
199
- this.props.listActions(getBaseUrl(this.props.pathname));
200
- this.props.getTypes(getBaseUrl(this.props.pathname));
201
- this.props.setExpandedToolbar(this.state.expanded);
202
- document.addEventListener('mousedown', this.handleClickOutside, false);
203
- }
204
-
205
- /**
206
- * Component will receive props
207
- * @method componentWillReceiveProps
208
- * @param {Object} nextProps Next properties
209
- * @returns {undefined}
210
- */
211
- UNSAFE_componentWillReceiveProps(nextProps) {
212
- if (nextProps.pathname !== this.props.pathname) {
213
- this.props.listActions(getBaseUrl(nextProps.pathname));
214
- this.props.getTypes(getBaseUrl(nextProps.pathname));
215
- }
216
-
217
- // Unlock
218
- if (this.props.unlockRequest.loading && nextProps.unlockRequest.loaded) {
219
- this.props.listActions(getBaseUrl(nextProps.pathname));
220
- }
221
- }
222
-
223
- /**
224
- * Component will receive props
225
- * @method componentWillUnmount
226
- * @returns {undefined}
227
- */
228
- componentWillUnmount() {
229
- document.removeEventListener('mousedown', this.handleClickOutside, false);
230
- }
231
-
232
- handleShrink = () => {
233
- const { cookies } = this.props;
234
- cookies.set('toolbar_expanded', !this.state.expanded, getCookieOptions());
235
- this.setState(
236
- (state) => ({ expanded: !state.expanded }),
237
- () => this.props.setExpandedToolbar(this.state.expanded),
238
- );
239
- };
240
-
241
- closeMenu = () =>
242
- this.setState(() => ({ showMenu: false, loadedComponents: [] }));
243
-
244
- loadComponent = (type) => {
245
- const { loadedComponents } = this.state;
246
- if (!this.state.loadedComponents.includes(type)) {
247
- this.setState({
248
- loadedComponents: [...loadedComponents, type],
249
- hideToolbarBody: toolbarComponents[type].hideToolbarBody || false,
250
- });
251
- }
252
- };
253
-
254
- unloadComponent = () => {
255
- this.setState((state) => ({
256
- loadedComponents: state.loadedComponents.slice(0, -1),
257
- hideToolbarBody:
258
- toolbarComponents[
259
- state.loadedComponents[state.loadedComponents.length - 2]
260
- ].hideToolbarBody || false,
261
- }));
262
- };
263
-
264
- toggleMenu = (e, selector) => {
265
- if (this.state.showMenu) {
266
- this.closeMenu();
267
- return;
268
- }
269
- // PersonalTools always shows at bottom
270
- if (selector === 'personalTools') {
271
- this.setState((state) => ({
272
- showMenu: !state.showMenu,
273
- menuStyle: { bottom: 0 },
274
- }));
275
- } else {
276
- this.setState((state) => ({
277
- showMenu: !state.showMenu,
278
- menuStyle: { top: 0 },
279
- }));
280
- }
281
- this.loadComponent(selector);
282
- };
283
-
284
- handleClickOutside = (e) => {
285
- if (this.pusher && doesNodeContainClick(this.pusher, e)) return;
286
- this.closeMenu();
287
- };
288
-
289
- unlock = (e) => {
290
- this.props.unlockContent(getBaseUrl(this.props.pathname), true);
291
- };
292
-
293
- /**
294
- * Render method.
295
- * @method render
296
- * @returns {string} Markup for the component.
297
- */
298
- render() {
299
- const path = getBaseUrl(this.props.pathname);
300
- const lock = this.props.content?.lock;
301
- const unlockAction =
302
- lock?.locked && lock?.stealable && lock?.creator !== this.props.userId;
303
- const editAction =
304
- !unlockAction && find(this.props.actions.object, { id: 'edit' });
305
- const folderContentsAction = find(this.props.actions.object, {
306
- id: 'folderContents',
307
- });
308
- const { expanded } = this.state;
309
-
310
- return (
311
- this.props.token && (
312
- <>
313
- <BodyClass
314
- className={expanded ? 'has-toolbar' : 'has-toolbar-collapsed'}
315
- />
316
- <div
317
- style={this.state.menuStyle}
318
- className={
319
- this.state.showMenu ? 'toolbar-content show' : 'toolbar-content'
320
- }
321
- ref={this.toolbarWindow}
322
- >
323
- {this.state.showMenu && (
324
- // This sets the scroll locker in the body tag in mobile
325
- <BodyClass className="has-toolbar-menu-open" />
326
- )}
327
- <div
328
- className="pusher-puller"
329
- ref={(node) => (this.pusher = node)}
330
- style={{
331
- transform: this.toolbarWindow.current
332
- ? `translateX(-${
333
- (this.state.loadedComponents.length - 1) *
334
- this.toolbarWindow.current.getBoundingClientRect().width
335
- }px)`
336
- : null,
337
- }}
338
- >
339
- {this.state.loadedComponents.map((component, index) =>
340
- (() => {
341
- const ToolbarComponent =
342
- toolbarComponents[component].component;
343
- const WrapperComponent = toolbarComponents[component].wrapper;
344
- const haveActions =
345
- toolbarComponents[component].hideToolbarBody;
346
- const title =
347
- toolbarComponents[component].wrapperTitle &&
348
- this.props.intl.formatMessage(
349
- toolbarComponents[component].wrapperTitle,
350
- );
351
- if (WrapperComponent) {
352
- return (
353
- <WrapperComponent
354
- componentName={component}
355
- componentTitle={title}
356
- pathname={this.props.pathname}
357
- loadComponent={this.loadComponent}
358
- unloadComponent={this.unloadComponent}
359
- componentIndex={index}
360
- theToolbar={this.toolbarWindow}
361
- key={`personalToolsComponent-${index}`}
362
- closeMenu={this.closeMenu}
363
- hasActions={haveActions}
364
- >
365
- <ToolbarComponent
366
- pathname={this.props.pathname}
367
- loadComponent={this.loadComponent}
368
- unloadComponent={this.unloadComponent}
369
- componentIndex={index}
370
- theToolbar={this.toolbarWindow}
371
- closeMenu={this.closeMenu}
372
- isToolbarEmbedded
373
- />
374
- </WrapperComponent>
375
- );
376
- } else {
377
- return (
378
- <ToolbarComponent
379
- pathname={this.props.pathname}
380
- loadComponent={this.loadComponent}
381
- unloadComponent={this.unloadComponent}
382
- componentIndex={index}
383
- theToolbar={this.toolbarWindow}
384
- key={`personalToolsComponent-${index}`}
385
- closeMenu={this.closeMenu}
386
- content={
387
- toolbarComponents[component].contentAsProps
388
- ? this.props.content
389
- : null
390
- }
391
- />
392
- );
393
- }
394
- })(),
395
- )}
396
- </div>
397
- </div>
398
- <div className={this.state.expanded ? 'toolbar expanded' : 'toolbar'}>
399
- <div className="toolbar-body">
400
- <div className="toolbar-actions">
401
- {this.props.hideDefaultViewButtons && this.props.inner && (
402
- <>{this.props.inner}</>
403
- )}
404
- {!this.props.hideDefaultViewButtons && (
405
- <>
406
- {unlockAction && (
407
- <button
408
- aria-label={this.props.intl.formatMessage(
409
- messages.unlock,
410
- )}
411
- className="unlock"
412
- onClick={(e) => this.unlock(e)}
413
- tabIndex={0}
414
- >
415
- <Icon
416
- name={unlockSVG}
417
- size="30px"
418
- className="unlock"
419
- title={this.props.intl.formatMessage(messages.unlock)}
420
- />
421
- </button>
422
- )}
423
-
424
- {editAction && (
425
- <Link
426
- aria-label={this.props.intl.formatMessage(
427
- messages.edit,
428
- )}
429
- className="edit"
430
- to={`${path}/edit`}
431
- >
432
- <Icon
433
- name={penSVG}
434
- size="30px"
435
- className="circled"
436
- title={this.props.intl.formatMessage(messages.edit)}
437
- />
438
- </Link>
439
- )}
440
- {this.props.content &&
441
- this.props.content.is_folderish &&
442
- folderContentsAction &&
443
- !this.props.pathname.endsWith('/contents') && (
444
- <Link
445
- aria-label={this.props.intl.formatMessage(
446
- messages.contents,
447
- )}
448
- to={`${path}/contents`}
449
- >
450
- <Icon
451
- name={folderSVG}
452
- size="30px"
453
- title={this.props.intl.formatMessage(
454
- messages.contents,
455
- )}
456
- />
457
- </Link>
458
- )}
459
- {this.props.content &&
460
- this.props.content.is_folderish &&
461
- folderContentsAction &&
462
- this.props.pathname.endsWith('/contents') && (
463
- <Link
464
- to={`${path}`}
465
- aria-label={this.props.intl.formatMessage(
466
- messages.back,
467
- )}
468
- >
469
- <Icon
470
- name={clearSVG}
471
- className="contents circled"
472
- size="30px"
473
- title={this.props.intl.formatMessage(messages.back)}
474
- />
475
- </Link>
476
- )}
477
- {this.props.content &&
478
- ((this.props.content.is_folderish &&
479
- this.props.types.length > 0) ||
480
- (config.settings.isMultilingual &&
481
- this.props.content['@components']?.translations)) && (
482
- <button
483
- className="add"
484
- aria-label={this.props.intl.formatMessage(
485
- messages.add,
486
- )}
487
- onClick={(e) => this.toggleMenu(e, 'types')}
488
- tabIndex={0}
489
- id="toolbar-add"
490
- >
491
- <Icon
492
- name={addSVG}
493
- size="30px"
494
- title={this.props.intl.formatMessage(messages.add)}
495
- />
496
- </button>
497
- )}
498
- <div className="toolbar-button-spacer" />
499
- <button
500
- className="more"
501
- aria-label={this.props.intl.formatMessage(messages.more)}
502
- onClick={(e) => this.toggleMenu(e, 'more')}
503
- tabIndex={0}
504
- id="toolbar-more"
505
- >
506
- <Icon
507
- className="mobile hidden"
508
- name={moreSVG}
509
- size="30px"
510
- title={this.props.intl.formatMessage(messages.more)}
511
- />
512
- {this.state.showMenu ? (
513
- <Icon
514
- className="mobile only"
515
- name={clearSVG}
516
- size="30px"
517
- />
518
- ) : (
519
- <Icon
520
- className="mobile only"
521
- name={moreSVG}
522
- size="30px"
523
- />
524
- )}
525
- </button>
526
- </>
527
- )}
528
- </div>
529
- <div className="toolbar-bottom">
530
- <Pluggable name="main.toolbar.bottom" />
531
- {!this.props.hideDefaultViewButtons && (
532
- <button
533
- className="user"
534
- aria-label={this.props.intl.formatMessage(
535
- messages.personalTools,
536
- )}
537
- onClick={(e) => this.toggleMenu(e, 'personalTools')}
538
- tabIndex={0}
539
- id="toolbar-personal"
540
- >
541
- <Icon
542
- name={userSVG}
543
- size="30px"
544
- title={this.props.intl.formatMessage(
545
- messages.personalTools,
546
- )}
547
- />
548
- </button>
549
- )}
550
- </div>
551
- </div>
552
- <div className="toolbar-handler">
553
- <button
554
- aria-label={this.props.intl.formatMessage(
555
- messages.shrinkToolbar,
556
- )}
557
- className={cx({
558
- [this.props.content?.review_state]: this.props.content
559
- ?.review_state,
560
- })}
561
- onClick={this.handleShrink}
562
- />
563
- </div>
564
- </div>
565
- <div className="pusher" />
566
- </>
567
- )
568
- );
569
- }
570
- }
571
-
572
- export default compose(
573
- injectIntl,
574
- withCookies,
575
- connect(
576
- (state, props) => ({
577
- actions: state.actions.actions,
578
- token: state.userSession.token,
579
- userId: state.userSession.token
580
- ? jwtDecode(state.userSession.token).sub
581
- : '',
582
- content: state.content.data,
583
- pathname: props.pathname,
584
- types: filter(state.types.types, 'addable'),
585
- unlockRequest: state.content.unlock,
586
- }),
587
- { getTypes, listActions, setExpandedToolbar, unlockContent },
588
- ),
589
- )(Toolbar);