Client: party members in header (#8804)

* wip party members in header

* wip

* add inbox routes back

* polishing
This commit is contained in:
Matteo Pagliazzi
2017-06-08 18:24:40 -07:00
committed by GitHub
parent 85644fdc1b
commit 977f9d5174
6 changed files with 127 additions and 38 deletions

View File

@@ -1,18 +1,24 @@
<template lang="pug"> <template lang="pug">
#app-header.row #app-header.row
member-details(:member="user", :expanded="true") member-details(:member="user", @click="$router.push({name: 'avatar'})")
.no-party.d-flex.justify-content-center.text-center(v-if="!user.party._id") .party-members.d-flex(v-if="partyMembers && partyMembers.length > 1")
member-details(
v-for="member in partyMembers",
:key="member._id",
v-if="member._id !== user._id",
:member="member",
condensed=true,
@click="expandMember(member._id)"
:expanded="member._id === expandedMember",
)
button.btn.btn-primary {{ $t('viewParty') }}
.no-party.d-flex.justify-content-center.text-center(v-else)
.align-self-center(v-once) .align-self-center(v-once)
h3 {{ $t('battleWithFriends') }} h3 {{ $t('battleWithFriends') }}
span.small-text(v-html="$t('inviteFriendsParty')") span.small-text(v-html="$t('inviteFriendsParty')")
br br
// TODO link to party creation
button.btn.btn-primary {{ $t('startAParty') }} button.btn.btn-primary {{ $t('startAParty') }}
div(v-else)
member-details(
v-for="member in partyMembers",
:key="member._id",
:member="member",
)
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>
@@ -24,11 +30,18 @@
background: $purple-50; background: $purple-50;
height: 204px; height: 204px;
color: $header-color; color: $header-color;
flex-wrap: nowrap;
}
.no-party, .party-members {
flex-grow: 1;
}
.party-members {
overflow-x: auto;
} }
.no-party { .no-party {
flex-grow: 1;
.small-text { .small-text {
color: $header-color; color: $header-color;
} }
@@ -52,6 +65,11 @@ export default {
components: { components: {
MemberDetails, MemberDetails,
}, },
data () {
return {
expandedMember: null,
};
},
computed: { computed: {
...mapGetters({ ...mapGetters({
user: 'user:data', user: 'user:data',
@@ -62,6 +80,13 @@ export default {
...mapActions({ ...mapActions({
getPartyMembers: 'party:getMembers', getPartyMembers: 'party:getMembers',
}), }),
expandMember (memberId) {
if (this.expandedMember === memberId) {
this.expandedMember = null;
} else {
this.expandedMember = memberId;
}
},
}, },
created () { created () {
this.getPartyMembers(); this.getPartyMembers();

View File

@@ -44,7 +44,7 @@ nav.navbar.navbar-inverse.fixed-top.navbar-toggleable-sm
router-link.dropdown-item.edit-avatar(:to="{name: 'avatar'}") router-link.dropdown-item.edit-avatar(:to="{name: 'avatar'}")
h3 {{ user.profile.name }} h3 {{ user.profile.name }}
span.small-text {{ $t('editAvatar') }} span.small-text {{ $t('editAvatar') }}
//.dropdown-divider router-link.dropdown-item(:to="{name: 'inbox'}") {{ $t('inbox') }}
router-link.dropdown-item(:to="{name: 'stats'}") {{ $t('stats') }} router-link.dropdown-item(:to="{name: 'stats'}") {{ $t('stats') }}
router-link.dropdown-item(:to="{name: 'achievements'}") {{ $t('achievements') }} router-link.dropdown-item(:to="{name: 'achievements'}") {{ $t('achievements') }}
router-link.dropdown-item(:to="{name: 'settings'}") {{ $t('settings') }} router-link.dropdown-item(:to="{name: 'settings'}") {{ $t('settings') }}

View File

@@ -52,6 +52,7 @@
height: 147px; height: 147px;
image-rendering: pixelated; image-rendering: pixelated;
position: relative; position: relative;
cursor: pointer;
} }
.character-sprites { .character-sprites {

View File

@@ -1,7 +1,7 @@
<template lang="pug"> <template lang="pug">
.d-flex .d-flex.member-details(:class="{ condensed, expanded }")
avatar#header-avatar(:member="member") avatar(:member="member", @click.native="$emit('click')",)
div(v-if="expanded") .member-stats
h3.character-name h3.character-name
| {{member.profile.name}} | {{member.profile.name}}
.is-buffed(v-if="isBuffed") .is-buffed(v-if="isBuffed")
@@ -27,12 +27,69 @@
<style lang="scss" scoped> <style lang="scss" scoped>
@import '~client/assets/scss/colors.scss'; @import '~client/assets/scss/colors.scss';
.member-details {
white-space: nowrap;
margin-top: 24px;
margin-bottom: 24px;
transition: all .15s ease;
}
.member-stats {
padding-left: 16px;
padding-right: 24px;
height: auto;
opacity: 1;
transition: all 0.15s ease-out;
}
.member-details.condensed:not(.expanded) .member-stats {
opacity: 0;
height: 0;
padding: 0;
width: 0;
}
// Condensed version
.member-details.condensed.expanded {
background: $header-dark-background;
padding-top: 9px;
margin-top: 15px;
border-radius: 4px;
padding-left: 9px;
box-shadow: 0 2px 2px 0 rgba($black, 0.16), 0 1px 4px 0 rgba($black, 0.12);
.is-buffed {
background-color: $purple-50;
}
.member-stats {
padding-right: 16px;
}
.progress-container > .svg-icon {
width: 19px;
height: 19px;
margin-top: -2px;
}
.progress-container > .progress {
width: 152px;
border-radius: 0px;
height: 10px;
margin-top: 2px;
}
.progress-container > .progress > .progress-bar {
border-radius: 0px;
height: 10px;
}
}
.small-text { .small-text {
color: $header-color; color: $header-color;
} }
.character-name { .character-name {
margin-top: 24px;
margin-bottom: 1px; margin-bottom: 1px;
color: $white; color: $white;
} }
@@ -60,7 +117,6 @@
} }
#header-avatar { #header-avatar {
margin-top: 24px;
margin-right: 16px; margin-right: 16px;
} }
@@ -118,7 +174,14 @@ export default {
type: Object, type: Object,
required: true, required: true,
}, },
expanded: Boolean, condensed: {
type: Boolean,
default: false,
},
expanded: {
type: Boolean,
default: false,
},
}, },
data () { data () {
return { return {

View File

@@ -1,7 +1,8 @@
import Vue from 'vue'; import Vue from 'vue';
import VueRouter from 'vue-router'; import VueRouter from 'vue-router';
// import EmptyView from './components/emptyView'; import EmptyView from './components/emptyView';
// TODO Dummy elements used as placeholder until real components are implemented // TODO Dummy elements used as placeholder until real components are implemented
import ParentPage from './components/parentPage'; import ParentPage from './components/parentPage';
import Page from './components/page'; import Page from './components/page';
@@ -21,9 +22,8 @@ const EquipmentPage = () => import(/* webpackChunkName: "inventory" */'./compone
const StablePage = () => import(/* webpackChunkName: "inventory" */'./components/inventory/stable'); const StablePage = () => import(/* webpackChunkName: "inventory" */'./components/inventory/stable');
// Social // Social
// TODO add inbox back const InboxPage = () => import(/* webpackChunkName: "inbox" */ './components/social/inbox/index');
// import InboxPage from './components/social/inbox/index'; const InboxConversationPage = () => import(/* webpackChunkName: "inbox" */ './components/social/inbox/conversationPage');
// import InboxConversationPage from './components/social/inbox/conversationPage';
// Guilds // Guilds
const GuildIndex = () => import(/* webpackChunkName: "guilds" */ './components/guilds/index'); const GuildIndex = () => import(/* webpackChunkName: "guilds" */ './components/guilds/index');
@@ -80,28 +80,27 @@ export default new VueRouter({
}, },
{ name: 'challenges', path: 'challenges', component: Page }, { name: 'challenges', path: 'challenges', component: Page },
{ name: 'party', path: 'party', component: Page }, { name: 'party', path: 'party', component: Page },
/* TODO add inbox back
{
path: 'inbox',
component: EmptyView,
children: [
{
name: 'inbox',
path: '',
component: InboxPage,
},
{
name: 'conversation',
path: 'conversation/:id',
component: InboxConversationPage,
},
],
}, */
{ {
path: '/user', path: '/user',
component: ParentPage, component: ParentPage,
children: [ children: [
{ name: 'avatar', path: 'avatar', component: Page }, { name: 'avatar', path: 'avatar', component: Page },
{
path: 'inbox',
component: EmptyView,
children: [
{
name: 'inbox',
path: '',
component: InboxPage,
},
{
name: 'conversation',
path: 'conversation/:id',
component: InboxConversationPage,
},
],
},
{ name: 'stats', path: 'stats', component: Page }, { name: 'stats', path: 'stats', component: Page },
{ name: 'achievements', path: 'achievements', component: Page }, { name: 'achievements', path: 'achievements', component: Page },
{ name: 'settings', path: 'settings', component: Page }, { name: 'settings', path: 'settings', component: Page },

View File

@@ -1,4 +1,5 @@
{ {
"viewParty": "View Party",
"shops": "Shops", "shops": "Shops",
"faq": "FAQ", "faq": "FAQ",
"costumePopoverText": "Select \"Use Costume\" to equip items to your avatar without affecting the stats from your Battle Gear! This means that you can dress up your avatar in whatever outfit you like while still having your best Battle Gear equipped.", "costumePopoverText": "Select \"Use Costume\" to equip items to your avatar without affecting the stats from your Battle Gear! This means that you can dress up your avatar in whatever outfit you like while still having your best Battle Gear equipped.",