mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-16 22:27:26 +01:00
Client: party members in header (#8804)
* wip party members in header * wip * add inbox routes back * polishing
This commit is contained in:
@@ -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();
|
||||||
|
|||||||
@@ -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') }}
|
||||||
|
|||||||
@@ -52,6 +52,7 @@
|
|||||||
height: 147px;
|
height: 147px;
|
||||||
image-rendering: pixelated;
|
image-rendering: pixelated;
|
||||||
position: relative;
|
position: relative;
|
||||||
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
.character-sprites {
|
.character-sprites {
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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,7 +80,11 @@ 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: '/user',
|
||||||
|
component: ParentPage,
|
||||||
|
children: [
|
||||||
|
{ name: 'avatar', path: 'avatar', component: Page },
|
||||||
{
|
{
|
||||||
path: 'inbox',
|
path: 'inbox',
|
||||||
component: EmptyView,
|
component: EmptyView,
|
||||||
@@ -96,12 +100,7 @@ export default new VueRouter({
|
|||||||
component: InboxConversationPage,
|
component: InboxConversationPage,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
}, */
|
},
|
||||||
{
|
|
||||||
path: '/user',
|
|
||||||
component: ParentPage,
|
|
||||||
children: [
|
|
||||||
{ name: 'avatar', path: 'avatar', component: Page },
|
|
||||||
{ 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 },
|
||||||
|
|||||||
@@ -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.",
|
||||||
|
|||||||
Reference in New Issue
Block a user