This commit is contained in:
Daniil Senkiv 2019-11-05 10:36:29 +03:00
commit 7e7af6a1cf
7 changed files with 220 additions and 70 deletions

View File

@ -121,20 +121,26 @@ class PureAccessRights extends Component {
}
componentDidMount() {
const { getListAdmins, getListUsers, getUserById, ownerId } = this.props;
const {
getListAdmins,
getListUsers,
getUserById,
ownerId,
productId
} = this.props;
getUserById(ownerId).catch(error => {
toastr.error("accessRights getUserById", error);
toastr.error(error);
//console.log("accessRights getUserById", error);
});
getListUsers().catch(error => {
toastr.error("accessRights getListAdmins", error);
toastr.error(error);
//console.log("accessRights getListAdmins", error);
});
getListAdmins().catch(error => {
toastr.error("accessRights getListAdmins", error);
getListAdmins(productId).catch(error => {
toastr.error(error);
//console.log("accessRights getListAdmins", error);
});
}
@ -176,6 +182,12 @@ class PureAccessRights extends Component {
const { showSelector, advancedOptions } = this.state;
const OwnerOpportunities = t("AccessRightsOwnerOpportunities").split("|");
const countItems = [
{ key: 25, label: t("CountPerPage", { count: 25 }) },
{ key: 50, label: t("CountPerPage", { count: 50 }) },
{ key: 100, label: t("CountPerPage", { count: 100 }) }
];
return (
<MainContainer>
<HeaderContainer>
@ -196,9 +208,12 @@ class PureAccessRights extends Component {
<Text.Body className="avatar_text" fontSize={16} isBold={true}>
{owner.displayName}
</Text.Body>
<Text.Body className="avatar_text" fontSize={12}>
{owner.department}
</Text.Body>
{owner.groups &&
owner.groups.map(group => (
<Link fontSize={12} key={group.id} href={owner.profileUrl}>
{group.name}
</Link>
))}
</div>
</AvatarContainer>
<ProjectsBody>
@ -233,7 +248,6 @@ class PureAccessRights extends Component {
isOpen={showSelector}
placeholder="placeholder"
options={advancedOptions}
//options={this.AdvancedSelectorFunction(users)}
onSearchChanged={this.onSearchUsers}
//groups={groups}
isMultiSelect={true}
@ -252,8 +266,8 @@ class PureAccessRights extends Component {
<Avatar
size="small"
role="admin"
userName={user.userName}
source={user.avatar}
userName={user.displayName}
source={user.avatarSmall}
/>
);
const nameColor =
@ -270,13 +284,13 @@ class PureAccessRights extends Component {
<Link
containerWidth="120px"
type="page"
title={user.userName}
title={user.displayName}
isBold={true}
fontSize={15}
color={nameColor}
href={user.profileUrl}
>
{user.userName}
{user.displayName}
</Link>
<div style={{ maxWidth: 120 }} />
@ -303,15 +317,20 @@ class PureAccessRights extends Component {
{admins.length > 25 ? (
<div className="wrapper">
<Paging
previousLabel="Previous"
nextLabel="Next"
previousLabel={t("PreviousPage")}
nextLabel={t("NextPage")}
openDirection="top"
displayItems={false}
countItems={countItems}
selectedPageItem={{ label: "1 of 1" }}
selectedCountItem={{ label: "25 per page" }}
previousAction={() => console.log("Prev")}
nextAction={() => console.log("Next")}
openDirection="bottom"
previousAction={() => console.log("previousAction")}
nextAction={() => console.log("nextAction")}
onSelectPage={a => console.log(a)}
onSelectCount={a => console.log(a)}
//pageItems={pageItems}
//disablePrevious={!filter.hasPrev()}
//disableNext={!filter.hasNext()}
/>
</div>
) : null}
@ -377,12 +396,22 @@ const AccessRights = props => {
);
};
const filterOwner = (users, ownerId) =>
const filterUsers = (users, ownerId) =>
filter(users, function(f) {
return f.id !== ownerId;
});
const filterAdminUsers = users => {
return users.filter(user => user.listAdminModules === undefined);
const newArray = [];
users.map(user => {
if (user.listAdminModules !== undefined) {
if (!user.listAdminModules.includes("people")) {
newArray.push(user);
}
} else {
newArray.push(user);
}
});
return newArray.filter(user => !user.isVisitor);
};
const AdvancedSelectorFunction = users =>
@ -396,12 +425,12 @@ const AdvancedSelectorFunction = users =>
function mapStateToProps(state) {
const { ownerId } = state.auth.settings;
const { admins, users } = state.settings;
const arrayUsers = filterOwner(users, ownerId);
const arrayUsers = filterUsers(users, ownerId);
const filterArrayUsers = filterAdminUsers(arrayUsers);
return {
users: filterArrayUsers,
admins: filterOwner(admins, ownerId),
admins: filterUsers(admins, ownerId),
productId: state.auth.modules[0].id,
owner: state.settings.owner,
ownerId,
@ -414,7 +443,8 @@ AccessRights.defaultProps = {
admins: [],
productId: "",
ownerId: "",
owner: {}
owner: {},
advancedOptions: []
};
AccessRights.propTypes = {
@ -422,7 +452,8 @@ AccessRights.propTypes = {
admins: PropTypes.arrayOf(PropTypes.object),
productId: PropTypes.string,
ownerId: PropTypes.string,
owner: PropTypes.object
owner: PropTypes.object,
advancedOptions: PropTypes.arrayOf(PropTypes.object)
};
export default connect(

View File

@ -23,6 +23,8 @@
"SuccessfullySaveSettingsMessage": "Settings have been successfully updated",
"NotFoundLanguage": "In case you cannot find your language in the list of the available ones, feel free to write to us at <1>{{supportEmail}}</1> to take part in the translation and get up to 1 year free of charge.",
"Settings": "Settings",
"PreviousPage": "Previous",
"NextPage": "Next",
@ -59,5 +61,6 @@
"Settings_integration": "Integration",
"Settings_third-party-services": "Third-Party Services",
"Settings_smtp-settings": "SMTP Settings",
"Settings_statistics": "Statistics"
"Settings_statistics": "Statistics",
"CountPerPage": "{{count}} per page"
}

View File

@ -22,6 +22,8 @@
"SuccessfullySaveSettingsMessage": "Настройки успешно обновлены",
"NotFoundLanguage": "Если Вы не можете найти свой язык в списке доступных, Вы всегда можете написать нам по адресу <1>{{supportEmail}}</1>, чтобы принять участие в переводе и получить до 1 года бесплатного использования.",
"Settings": "Настройки",
"PreviousPage": "Предыдущая",
"NextPage": "Следующая",
@ -58,5 +60,6 @@
"Settings_integration": "Интеграция",
"Settings_third-party-services": "Сторонние сервисы",
"Settings_smtp-settings": "Настройки SMTP",
"Settings_statistics": "Статистика"
"Settings_statistics": "Статистика",
"CountPerPage": "{{count}} на странице"
}

View File

@ -83,6 +83,10 @@
],
"PeopleResource": [
"Settings"
],
"UserControlsCommonResource": [
"NextPage",
"PreviousPage"
]
}
},

View File

@ -149,15 +149,17 @@ export function getPortalTimezones() {
});
}
export function getUserList(role) {
let params = "";
if(role === "admin") {
params = "/filter?isAdministrator=true";
}
export function getUserList() {
return request({
method: "get",
url: `/people${params}`
url: `/people`
});
}
export function getProductAdminsList(productId) {
return request({
method: "get",
url: `/settings/security/administrator/${productId}`
});
}

View File

@ -31,18 +31,20 @@ export function getListUsers() {
};
}
export function getListAdmins() {
export function getListAdmins(productId) {
return dispatch => {
return api.getUserList("admin").then(admins => dispatch(setAdmins(admins)));
return api
.getProductAdminsList(productId)
.then(admins => dispatch(setAdmins(admins)));
};
}
export function changeAdmins(userId, productId, isAdmin) {
return dispatch => {
return api
.changeProductAdmin(userId, productId, isAdmin)
.then(() => dispatch(getListUsers()))
.then(() => dispatch(getListAdmins()));
return api.changeProductAdmin(userId, productId, isAdmin).then(() => {
dispatch(getListUsers());
dispatch(getListAdmins(productId));
});
};
}

View File

@ -1,40 +1,145 @@
import React from 'react';
import { mount } from 'enzyme';
import { mount, shallow } from 'enzyme';
import GroupButtonsMenu from '.';
import DropDownItem from '../drop-down-item';
const defaultMenuItems = [
{
label: 'Select',
isDropdown: true,
isSeparator: true,
isSelect: true,
fontWeight: 'bold',
children: [
<DropDownItem key='aaa' label='aaa' />,
<DropDownItem key='bbb' label='bbb' />,
<DropDownItem key='ccc' label='ccc' />,
],
onSelect: () => { }
},
{
label: 'Menu item 1',
disabled: false,
onClick: () => { }
},
{
label: 'Menu item 2',
disabled: true,
onClick: () => { }
}
];
const baseProps = {
checked: false,
menuItems: defaultMenuItems,
visible: true,
moreLabel: 'More',
closeTitle: 'Close'
}
describe('<GroupButtonsMenu />', () => {
it('renders without error', () => {
const menuItems = [
{
label: 'Select',
isDropdown: true,
isSeparator: true,
isSelect: true,
fontWeight: 'bold',
children: [
<DropDownItem key='aaa' label='aaa' />,
<DropDownItem key='bbb' label='bbb' />,
<DropDownItem key='ccc' label='ccc' />,
],
onSelect: () => {}
},
{
label: 'Menu item 1',
disabled: false,
onClick: () => {}
},
{
label: 'Menu item 2',
disabled: true,
onClick: () => {}
}
];
it('renders without error', () => {
const wrapper = mount(<GroupButtonsMenu {...baseProps} />);
const wrapper = mount(
<GroupButtonsMenu checked={false} menuItems={menuItems} visible={true} moreLabel='More' closeTitle='Close' />
);
expect(wrapper).toExist();
});
expect(wrapper).toExist();
it('applies checked prop', () => {
const wrapper = mount(<GroupButtonsMenu {...baseProps} checked={true} />);
expect(wrapper.prop('checked')).toEqual(true);
});
it('applies visible prop', () => {
const wrapper = mount(<GroupButtonsMenu {...baseProps} visible={true} />);
expect(wrapper.prop('visible')).toEqual(true);
});
it('causes function closeMenu()', () => {
const onClose = jest.fn();
const wrapper = mount(<GroupButtonsMenu {...baseProps} onClose={onClose} />);
const instance = wrapper.instance();
instance.closeMenu(new Event('click'));
expect(wrapper.state('visible')).toBe(false);
expect(onClose).toBeCalled();
});
it('causes function groupButtonClick()', () => {
const onClick = jest.fn();
const item = {
label: 'Menu item 1',
disabled: false,
onClick: onClick
};
const wrapper = mount(<GroupButtonsMenu {...baseProps} />);
const instance = wrapper.instance();
instance.groupButtonClick(item);
expect(wrapper.state('visible')).toBe(false);
expect(onClick).toBeCalled();
});
it('causes function countMenuItems()', () => {
const wrapper = mount(<GroupButtonsMenu {...baseProps} />);
const instance = wrapper.instance();
instance.countMenuItems([], 2, 1);
instance.countMenuItems([1, 2], 200, 2);
instance.countMenuItems([1,2,3,4], 1, 2);
expect(wrapper.state('visible')).toBe(true);
});
it('causes function groupButtonClick() if disabled', () => {
const onClick = jest.fn();
const item = {
label: 'Menu item 1',
disabled: true,
onClick: onClick
};
const wrapper = mount(<GroupButtonsMenu {...baseProps} />);
const instance = wrapper.instance();
instance.groupButtonClick(item);
expect(wrapper.state('visible')).toBe(true);
expect(onClick).toBeCalledTimes(0);
});
it('componentDidUpdate() props lifecycle test', () => {
const wrapper = shallow(<GroupButtonsMenu {...baseProps} visible={false} />);
const instance = wrapper.instance();
instance.componentDidUpdate({ visible: true, menuItems: defaultMenuItems }, wrapper.state());
expect(wrapper.props()).toBe(wrapper.props());
});
it('componentWillUnmount() props lifecycle test', () => {
const wrapper = shallow(<GroupButtonsMenu {...baseProps} />);
const instance = wrapper.instance();
instance.componentWillUnmount();
expect(wrapper).toExist(false);
});
it('filled state moreItems', () => {
const wrapper = shallow(<GroupButtonsMenu {...baseProps} />);
wrapper.setState({
moreItems: [{
label: 'Menu item 1',
disabled: false,
onClick: jest.fn()
}]
});
expect(wrapper).toExist(false);
});
});