@eeacms/volto-eea-website-theme 0.6.13 → 0.6.16
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 +28 -1
- package/package.json +1 -1
- package/src/components/theme/Banner/View.jsx +1 -9
- package/src/config.js +2 -2
- package/src/customizations/volto/components/theme/Breadcrumbs/Breadcrumbs.jsx +26 -2
- package/src/customizations/volto/components/theme/Header/Header.jsx +15 -6
- package/theme/theme.config +1 -0
- package/src/customizations/volto/components/manage/Toolbar/Toolbar.jsx +0 -589
package/CHANGELOG.md
CHANGED
@@ -4,9 +4,36 @@ 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.16](https://github.com/eea/volto-eea-website-theme/compare/0.6.15...0.6.16)
|
8
|
+
|
9
|
+
- Nonapi breadcrumbs [`#48`](https://github.com/eea/volto-eea-website-theme/pull/48)
|
10
|
+
- Make Breadcrumbs behave better with non-content routes [`9407840`](https://github.com/eea/volto-eea-website-theme/commit/94078403458a5a3ea725ce9126fffed9d463097d)
|
11
|
+
- change(megamenu): add border for active element of menu [`252efc4`](https://github.com/eea/volto-eea-website-theme/commit/252efc4485961c8d05e3703fee06179a0fdc8da3)
|
12
|
+
- change(footer): tweaked size of eionet logo to follow size of eea logo [`fcfa8ee`](https://github.com/eea/volto-eea-website-theme/commit/fcfa8ee00cffbc147eefa0f614b366c94f30945d)
|
13
|
+
- feature(theme): added context navigation component [`083b1c2`](https://github.com/eea/volto-eea-website-theme/commit/083b1c272623c720ebfeb4338e59c2cefcb29ecc)
|
14
|
+
|
15
|
+
#### [0.6.15](https://github.com/eea/volto-eea-website-theme/compare/0.6.14...0.6.15)
|
16
|
+
|
17
|
+
> 1 July 2022
|
18
|
+
|
19
|
+
- Release [`#47`](https://github.com/eea/volto-eea-website-theme/pull/47)
|
20
|
+
- Moved customized Toolbar to volto-eea-website-policy [`403b06d`](https://github.com/eea/volto-eea-website-theme/commit/403b06dd1225f4f15883d938d47facfe730a3699)
|
21
|
+
- change(logo): use a real svg logo for white eea logo [`e2703af`](https://github.com/eea/volto-eea-website-theme/commit/e2703af2bf3779ad3aa21fa673fa5652691a9f25)
|
22
|
+
|
23
|
+
#### [0.6.14](https://github.com/eea/volto-eea-website-theme/compare/0.6.13...0.6.14)
|
24
|
+
|
25
|
+
> 30 June 2022
|
26
|
+
|
27
|
+
- develop [`#46`](https://github.com/eea/volto-eea-website-theme/pull/46)
|
28
|
+
- change(header): show eea information systems on mobile [`abdf181`](https://github.com/eea/volto-eea-website-theme/commit/abdf1819465ba1ca582c2a2d82ec02a137c0cf7f)
|
29
|
+
- change(pageheader): share dropdown appears below the share icon [`10aaafc`](https://github.com/eea/volto-eea-website-theme/commit/10aaafc79d03784972b7cf40639077246340eda9)
|
30
|
+
- change(pageheader): removed blogger, reddit and stumbleupon sharing links [`0f7d887`](https://github.com/eea/volto-eea-website-theme/commit/0f7d88700076704abb04ba1bf806ab669fe085be)
|
31
|
+
|
7
32
|
#### [0.6.13](https://github.com/eea/volto-eea-website-theme/compare/0.6.12...0.6.13)
|
8
33
|
|
9
|
-
|
34
|
+
> 23 June 2022
|
35
|
+
|
36
|
+
- Fix double header issue - refs #151713 [`#45`](https://github.com/eea/volto-eea-website-theme/pull/45)
|
10
37
|
- Customize EventView - copied unchanged from @plone/volto 16.0.0-alpha.7 [`346fc87`](https://github.com/eea/volto-eea-website-theme/commit/346fc87c0834627efa70ed1303c5ee98a5a17ae2)
|
11
38
|
|
12
39
|
#### [0.6.12](https://github.com/eea/volto-eea-website-theme/compare/0.6.11...0.6.12)
|
package/package.json
CHANGED
@@ -161,18 +161,10 @@ const View = (props) => {
|
|
161
161
|
sharePage(metadata['@id'], 'linkedin');
|
162
162
|
}}
|
163
163
|
/>
|
164
|
-
<Banner.Action icon="blogger b" />
|
165
|
-
<Banner.Action
|
166
|
-
icon="ri-reddit-line"
|
167
|
-
onClick={() => {
|
168
|
-
sharePage(metadata['@id'], 'reddit');
|
169
|
-
}}
|
170
|
-
/>
|
171
|
-
<Banner.Action icon="stumbleupon circle" />
|
172
164
|
</div>
|
173
165
|
</>
|
174
166
|
)}
|
175
|
-
position="
|
167
|
+
position="bottom center"
|
176
168
|
size="small"
|
177
169
|
trigger={
|
178
170
|
<Banner.Action
|
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:
|
111
|
+
computer: 6,
|
112
112
|
},
|
113
113
|
},
|
114
114
|
],
|
@@ -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
|
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 (
|
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
|
*/
|
@@ -83,7 +85,7 @@ const EEAHeader = ({ pathname, token, items, history }) => {
|
|
83
85
|
<Image src={eeaFlag} alt="eea flag"></Image>
|
84
86
|
<Header.TopDropdownMenu
|
85
87
|
text="An official website of the European Union | How do you Know?"
|
86
|
-
mobileText="
|
88
|
+
mobileText=" "
|
87
89
|
icon="chevron down"
|
88
90
|
aria-label="dropdown"
|
89
91
|
className=""
|
@@ -110,7 +112,6 @@ const EEAHeader = ({ pathname, token, items, history }) => {
|
|
110
112
|
<Header.TopItem>
|
111
113
|
<Header.TopDropdownMenu
|
112
114
|
id="theme-sites"
|
113
|
-
className="tablet or lower hidden"
|
114
115
|
text={eea.globalHeaderPartnerLinks.title}
|
115
116
|
viewportWidth={width}
|
116
117
|
>
|
@@ -193,9 +194,17 @@ const EEAHeader = ({ pathname, token, items, history }) => {
|
|
193
194
|
{item.title}
|
194
195
|
</a>
|
195
196
|
)}
|
196
|
-
renderMenuItem={(item) => (
|
197
|
-
<UniversalLink
|
198
|
-
|
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>
|
199
208
|
</UniversalLink>
|
200
209
|
)}
|
201
210
|
></Header.Main>
|
package/theme/theme.config
CHANGED
@@ -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);
|