• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

geosolutions-it / MapStore2 / 14217089396

02 Apr 2025 10:11AM UTC coverage: 92.673% (+15.7%) from 76.984%
14217089396

push

github

web-flow
Fix #10819 Manager menu is merged into Login/user menu and Manager menu is now deprecated  (#10963)

245 of 385 branches covered (63.64%)

66 of 77 new or added lines in 3 files covered. (85.71%)

18 existing lines in 5 files now uncovered.

2011 of 2170 relevant lines covered (92.67%)

825.05 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

76.92
/web/client/plugins/login/index.js
1
/**
2
* Copyright 2016, GeoSolutions Sas.
3
* All rights reserved.
4
*
5
* This source code is licensed under the BSD-style license found in the
6
* LICENSE file in the root directory of this source tree.
7
*/
8
import React from 'react';
9
import { changePassword, login, loginFail, logout } from '../../actions/security';
10
import {onShowLogin, closeLogin, onLogout, openIDLogin} from '../../actions/login';
11

12

13
import { setControlProperty } from '../../actions/controls';
14

15
import { checkPendingChanges } from '../../actions/pendingChanges';
16
import LoginModalComp from '../../components/security/modals/LoginModal';
17
import PasswordResetModalComp from '../../components/security/modals/PasswordResetModal';
18
import UserDetailsModalComp from '../../components/security/modals/UserDetailsModal';
19
import UserMenuComp from '../../components/security/UserMenu';
20
import ConfigUtils from '../../utils/ConfigUtils';
21
import { connect } from '../../utils/PluginsUtils';
22
import { userSelector, authProviderSelector } from '../../selectors/security';
23
import { itemSelected } from '../../actions/manager';
24
import { unsavedMapSelector, unsavedMapSourceSelector } from '../../selectors/controls';
25

26

27
const checkUnsavedMapChanges = (action) => {
1✔
28
    return dispatch => {
×
29
        dispatch(checkPendingChanges(action, 'logout'));
×
30
    };
31
};
32

33

34
const userMenuConnect = connect((state, props) => ({
60✔
35
    currentProvider: authProviderSelector(state),
36
    title: userSelector(state)?.name,
37
    user: props.user,
38
    hidden: props.hidden,
39
    isAdmin: props.isAdmin,
40
    providers: ConfigUtils.getConfigProp("authenticationProviders"),
41
    className: props.className || "square-button",
102✔
42
    renderUnsavedMapChangesDialog: ConfigUtils.getConfigProp('unsavedMapChangesDialog') ?? true,
120✔
43
    displayUnsavedDialog: unsavedMapSelector(state)
70✔
44
        && unsavedMapSourceSelector(state) === 'logout'
45
}), {
46
    onShowLoggedin: onShowLogin,
47
    onShowAccountInfo: setControlProperty.bind(null, "AccountInfo", "enabled", true, true),
48
    onShowChangePassword: setControlProperty.bind(null, "ResetPassword", "enabled", true, true),
49
    onLoggedout: onLogout,
50
    onItemSelected: itemSelected,
51
    onCheckMapChanges: checkUnsavedMapChanges,
52
    onCloseUnsavedDialog: setControlProperty.bind(null, "unsavedMap", "enabled", false),
53
    onLogoutConfirm: logout.bind(null, undefined)
54
}, (stateProps = {}, dispatchProps = {}, ownProps = {}) => {
×
55
    const {currentProvider, providers = []} = stateProps;
58✔
56
    const {type, showAccountInfo = false, showPasswordChange = false} =
108✔
57
        (providers ?? []).find(({provider}) => provider === currentProvider) || {};
58!
58
    const isOpenID = type === "openID";
58✔
59
    const isNormalLDAPUser = ownProps.isUsingLDAP && !ownProps.isAdmin;
58✔
60

61
    return {
58✔
62
        ...ownProps,
63
        ...stateProps,
64
        ...dispatchProps,
65
        showAccountInfo: isOpenID ? showAccountInfo : ownProps.showAccountInfo,
58✔
66
        showPasswordChange: isOpenID ? showPasswordChange : isNormalLDAPUser ? false : ownProps.showPasswordChange
100✔
67
    };
68
});
69

70
export const UserDetails = connect((state) => ({
10✔
71
    user: userSelector(state),
72
    show: state.controls.AccountInfo && state.controls.AccountInfo.enabled}
10!
73
), {
74
    onClose: setControlProperty.bind(null, "AccountInfo", "enabled", false, false)
75
})(UserDetailsModalComp);
76

77
export const  UserDetailsMenuItem = userMenuConnect(({itemComponent, showAccountInfo = true, onShowAccountInfo}) => {
1✔
78
    const Menuitem = itemComponent;
12✔
79
    if (Menuitem && showAccountInfo) {
12✔
80
        return (<><Menuitem glyph="user" msgId= "user.info" onClick={onShowAccountInfo}/><UserDetails/></>);
10✔
81
    }
82
    return null;
2✔
83
});
84

85
export const PasswordReset = connect((state) => ({
7✔
86
    user: userSelector(state),
87
    show: state.controls.ResetPassword && state.controls.ResetPassword.enabled,
7!
88
    changed: state.security && state.security.passwordChanged && true || false,
21!
89
    error: state.security && state.security.passwordError,
14✔
90
    loading: state.security && state.security.changePasswordLoading || false
21✔
91
}), {
92
    onPasswordChange: (user, pass) => { return changePassword(user, pass); },
×
93
    onClose: setControlProperty.bind(null, "ResetPassword", "enabled", false, false)
94
})(PasswordResetModalComp);
95

96
export const PasswordResetMenuItem = userMenuConnect(({itemComponent, showPasswordChange = true, onShowChangePassword}) => {
1!
97
    const Menuitem = itemComponent;
12✔
98
    if (Menuitem && showPasswordChange) {
12✔
99
        return (<><Menuitem glyph="asterisk" msgId= "user.changePwd" onClick={onShowChangePassword}/><PasswordReset/></>);
7✔
100
    }
101
    return null;
5✔
102
});
103

104
export const Login = connect((state) => ({
18✔
105
    providers: ConfigUtils.getConfigProp("authenticationProviders"),
106
    show: state.controls.LoginForm && state.controls.LoginForm.enabled,
29✔
107
    user: userSelector(state),
108
    loginError: state.security && state.security.loginError
36✔
109
}), {
110
    onLoginSuccess: setControlProperty.bind(null, 'LoginForm', 'enabled', false, false),
111
    openIDLogin,
112
    onClose: closeLogin,
113
    onSubmit: login,
114
    onError: loginFail
115
})(LoginModalComp);
116

117
export const LoginMenuItem = userMenuConnect(({itemComponent, showLogin = true, onShowLoggedin}) => {
1✔
118
    const Menuitem = itemComponent;
5✔
119
    if (Menuitem && showLogin) {
5!
120
        return (<Menuitem glyph="log-in" msgId= "user.login" onClick={onShowLoggedin}/>);
5✔
121
    }
NEW
122
    return null;
×
123
});
124

125
export const LogoutMenuItem = userMenuConnect(({itemComponent, showLogout = true, renderUnsavedMapChangesDialog, onCheckMapChanges, onLoggedout, onCloseUnsavedDialog}) => {
1✔
126
    const Menuitem = itemComponent;
12✔
127
    const checkUnsavedChanges = () => {
12✔
NEW
128
        if (renderUnsavedMapChangesDialog) {
×
NEW
129
            onCheckMapChanges(onLoggedout);
×
130
        } else {
NEW
131
            onCloseUnsavedDialog();
×
NEW
132
            onLoggedout();
×
133
        }
134
    };
135
    if (Menuitem && showLogout) {
12!
136
        return (<><Menuitem glyph="log-out" msgId= "user.logout" onClick={()=> checkUnsavedChanges()} /></>);
12✔
137
    }
NEW
138
    return null;
×
139
});
140

141
export const UserMenu = userMenuConnect(UserMenuComp);
1✔
142

143
export default {
144
    UserDetails,
145
    PasswordReset,
146
    Login,
147
    UserMenu,
148
    UserDetailsMenuItem,
149
    PasswordResetMenuItem,
150
    LoginMenuItem,
151
    LogoutMenuItem
152
};
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc