web: Fix Layout component

This commit is contained in:
Andrey Savihin 2019-07-09 13:16:50 +03:00
parent 9e84b9f83e
commit ceb600450a
5 changed files with 119 additions and 65 deletions

View File

@ -5,14 +5,21 @@ import { Layout } from 'asc-web-components'
const currentUser = {
id: '00000000-0000-0000-0000-000000000000',
name: 'Jane Doe',
userName: 'Jane Doe',
email: 'janedoe@gmail.com',
role: 'user',
url: '/products/peaople/profile',
smallAvatar: '',
mediumAvatar: ''
isOwner: false,
isAdmin: false,
isVisitor: false,
avatarSmall: '',
avatarMedium: ''
};
const currentUserActions = [
{ key: 'ProfileBtn', label: 'Profile', onClick: () => console.log('ProfileBtn') },
{ key: 'AboutBtn', label: 'About', onClick: () => console.log('AboutBtn') },
{ key: 'LogoutBtn', label: 'Log out', onClick: () => console.log('LogoutBtn') },
];
const availableModules = [
{
seporator: true,
@ -20,7 +27,7 @@ const availableModules = [
},
{
id: '11111111-1111-1111-1111-111111111111',
name: 'Documents',
title: 'Documents',
iconName: 'DocumentsIcon',
notifications: 2,
url: '/products/documents/',
@ -29,16 +36,16 @@ const availableModules = [
},
{
id: '22222222-2222-2222-2222-222222222222',
name: 'Chat',
title: 'Chat',
iconName: 'ChatIcon',
notifications: 3,
url: '/products/chat/',
onClick: (e) => action('ChatIcon Clicked')(e),
onBadgeClick: (e) => action('ChatIconBadge Clicked')(e)
isolateMode: true
},
{
id: '33333333-3333-3333-3333-333333333333',
name: 'Mail',
title: 'Mail',
iconName: 'MailIcon',
notifications: 7,
url: '/products/mail/',
@ -47,10 +54,9 @@ const availableModules = [
},
{
id: '44444444-4444-4444-4444-444444444444',
name: 'Projects',
title: 'Projects',
iconName: 'ProjectsIcon',
notifications: 5,
url: '/products/projects/',
onClick: (e) => action('ProjectsIcon Clicked')(e),
onBadgeClick: (e) => action('ProjectsIconBadge Clicked')(e)
},
@ -60,27 +66,32 @@ const availableModules = [
},
{
id: '55555555-5555-5555-5555-555555555555',
name: 'Calendar',
title: 'Calendar',
iconName: 'CalendarCheckedIcon',
notifications: 0,
url: '/products/calendar/',
onClick: (e) => action('CalendarIcon Clicked')(e),
onBadgeClick: (e) => action('CalendarIconBadge Clicked')(e)
},
{
id: '66666666-6666-6666-6666-666666666666',
title: 'CRM',
iconName: 'CrmIcon',
notifications: 0,
onClick: (e) => action('CrmIcon Clicked')(e),
isolateMode: true
}
];
const currentModuleId = '44444444-4444-4444-4444-444444444444';
const chatModuleId = '22222222-2222-2222-2222-222222222222';
storiesOf('Components|Layout', module)
.add('Layout', () => (
<Layout
isNavigationOpen={false}
currentUser={currentUser}
currentUserActions={currentUserActions}
availableModules={availableModules}
currentModuleId={currentModuleId}
chatModuleId={chatModuleId}
>
<div style={{padding: 40}}>Page Content</div>
</Layout>

View File

@ -59,36 +59,38 @@ class Layout extends React.Component {
constructor(props) {
super(props);
let chatModule = null,
currentModule = null,
let currentModule = null,
isolateModules = [],
mainModules = [],
totalNotifications = 0,
index = props.availableModules.length,
item = null;
while (index) {
index--;
item = props.availableModules[index];
for (let i=0, l=props.availableModules.length; i<l; i++)
{
item = props.availableModules[i];
if(item.seporator) continue;
if(item.id == props.currentModuleId)
if (item.id == props.currentModuleId)
currentModule = item;
if(item.id == props.chatModuleId)
chatModule = item;
else
if (item.isolateMode) {
isolateModules.push(item);
} else {
mainModules.push(item);
if (item.seporator) continue;
totalNotifications+=item.notifications;
}
}
this.state = {
isNavigationHoverEnabled: props.isNavigationHoverEnabled,
isNavigationOpen: props.isNavigationOpen,
currentUser: props.currentUser || null,
availableModules: props.availableModules || [],
currentUserActions: props.currentUserActions || [],
currentModule: currentModule,
currentModuleId: props.currentModuleId,
chatModule: chatModule,
chatModuleId: props.chatModuleId,
availableModules: props.availableModules || [],
isolateModules: isolateModules,
mainModules: mainModules,
totalNotifications: totalNotifications
};
};
@ -118,13 +120,27 @@ class Layout extends React.Component {
<Wrapper>
<Backdrop isNavigationOpen={this.state.isNavigationOpen} onClick={this.toggleTabletNav}/>
<Header isNavigationOpen={this.state.isNavigationOpen}>
<HeaderIcons chatModule={this.state.chatModule} currentUser={this.state.currentUser}/>
<HeaderMenu totalNotifications={this.state.totalNotifications} onClick={this.toggleTabletNav} currentModule={this.state.currentModule}/>
<Navigation isNavigationOpen={this.state.isNavigationOpen} onMouseEnter={this.handleDesctopNavHover} onMouseLeave={this.handleDesctopNavHover}>
<NavLogoItem isNavigationOpen={this.state.isNavigationOpen} onClick={this.toggleDesctopNav}/>
<HeaderIcons
modules={this.state.isolateModules}
user={this.state.currentUser}
userActions={this.state.currentUserActions}
/>
<HeaderMenu
totalNotifications={this.state.totalNotifications}
onClick={this.toggleTabletNav}
currentModule={this.state.currentModule}
/>
<Navigation
isNavigationOpen={this.state.isNavigationOpen}
onMouseEnter={this.handleDesctopNavHover}
onMouseLeave={this.handleDesctopNavHover}
>
<NavLogoItem
isNavigationOpen={this.state.isNavigationOpen}
onClick={this.toggleDesctopNav}
/>
{
this.state.availableModules
.filter(item => item.id != this.state.chatModuleId)
this.state.mainModules
.map(item =>
<NavItem
seporator={!!item.seporator}
@ -136,7 +152,7 @@ class Layout extends React.Component {
onClick={item.onClick}
onBadgeClick={item.onBadgeClick}
>
{item.name}
{item.title}
</NavItem>
)
}
@ -152,9 +168,9 @@ Layout.propTypes = {
isNavigationHoverEnabled: PropTypes.bool,
isNavigationOpen: PropTypes.bool,
currentUser: PropTypes.object,
currentUserActions: PropTypes.array,
availableModules: PropTypes.array,
currentModuleId: PropTypes.string,
chatModuleId: PropTypes.string
currentModuleId: PropTypes.string
}
Layout.defaultProps = {

View File

@ -19,16 +19,20 @@ const Wrapper = styled.div`
const HeaderIcons = props =>
<Wrapper>
{
props.chatModule && <BadgedIcon
key={props.chatModule.id}
iconName={props.chatModule.iconName}
badgeNumber={props.chatModule.notifications}
onClick={props.chatModule.onClick}
onBadgeClick={props.chatModule.onBadgeClick}
/>
{
props.modules.map(module =>
<BadgedIcon
key={module.id}
iconName={module.iconName}
badgeNumber={module.notifications}
onClick={module.onClick}
onBadgeClick={module.onBadgeClick}
/>
)
}
{
props.user && <ProfileActions userActions={props.userActions} user={props.user}/>
}
{ props.currentUser && <ProfileActions {...props.currentUser}/> }
</Wrapper>
export default HeaderIcons;

View File

@ -27,7 +27,7 @@ const HeaderMenu = props =>
badgeNumber={props.totalNotifications}
onClick={props.onClick}
/>
<MenuHeader>{props.currentModule && props.currentModule.name}</MenuHeader>
<MenuHeader>{props.currentModule && props.currentModule.title}</MenuHeader>
</MenuItem>
export default HeaderMenu;

View File

@ -11,29 +11,48 @@ class ProfileActions extends React.Component {
this.state = {
isOpen: props.isOpen,
name: props.name,
email: props.email,
role: props.role,
smallAvatar: props.smallAvatar,
mediumAvatar: props.mediumAvatar
user: props.user,
userActions: props.userActions
};
};
toggle = () => {
console.log(this.state.isOpen);
this.setState({ isOpen: !this.state.isOpen });
console.log(this.state.isOpen);
};
getUserRole = (user) => {
if(user.isOwner) return "owner";
if(user.isAdmin) return "admin";
if(user.isVisitor) return "guest";
return "user";
};
render() {
return (
<div>
<Avatar size="small" role={this.state.role} source={this.state.smallAvatar} userName={this.state.name} onClick={this.toggle}/>
<DropDown isUserPreview withArrow direction='right' isOpen={this.state.isOpen}>
<DropDownItem isUserPreview role={this.state.role} source={this.state.mediumAvatar} userName={this.state.name} label={this.state.email}/>
<DropDownItem label="Profile"/>
<DropDownItem label="About"/>
<DropDownItem label="Log out"/>
<Avatar
size="small"
role={this.getUserRole(this.state.user)}
source={this.state.user.avatarSmall}
userName={this.state.user.userName}
onClick={this.toggle}
/>
<DropDown
isUserPreview
withArrow
direction='right'
isOpen={this.state.isOpen}
>
<DropDownItem
isUserPreview
role={this.getUserRole(this.state.user)}
source={this.state.user.avatarMedium}
userName={this.state.user.userName}
label={this.state.user.email}
/>
{
this.state.userActions.map(action => <DropDownItem {...action}/>)
}
</DropDown>
</div>
);
@ -41,11 +60,15 @@ class ProfileActions extends React.Component {
}
ProfileActions.propTypes = {
isOpen: PropTypes.bool
isOpen: PropTypes.bool,
user: PropTypes.object,
userActions: PropTypes.array
}
ProfileActions.defaultProps = {
isOpen: false
isOpen: false,
user: {},
userActions: []
}
export default ProfileActions