Init Contact Panel (#206)
This commit is contained in:
parent
b985085786
commit
88fc4d894a
7 changed files with 138 additions and 11 deletions
|
@ -44,8 +44,22 @@
|
||||||
.user--name {
|
.user--name {
|
||||||
@include margin(0);
|
@include margin(0);
|
||||||
font-size: $font-size-medium;
|
font-size: $font-size-medium;
|
||||||
|
}
|
||||||
|
|
||||||
|
.user--profile__meta {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: flex-start;
|
||||||
|
justify-content: center;
|
||||||
margin-left: $space-slab;
|
margin-left: $space-slab;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.user--profile__button {
|
||||||
|
color: $color-woot;
|
||||||
|
font-size: $font-size-mini;
|
||||||
|
margin-top: $space-micro;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,8 @@
|
||||||
|
|
||||||
.user-thumbnail {
|
.user-thumbnail {
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.source-badge {
|
.source-badge {
|
||||||
|
|
|
@ -13,12 +13,14 @@
|
||||||
class="user-thumbnail"
|
class="user-thumbnail"
|
||||||
background-color="#1f93ff"
|
background-color="#1f93ff"
|
||||||
color="white"
|
color="white"
|
||||||
|
:size="avatarSize"
|
||||||
>
|
>
|
||||||
</Avatar>
|
</Avatar>
|
||||||
<img
|
<img
|
||||||
v-if="badge === 'Facebook'"
|
v-if="badge === 'Facebook'"
|
||||||
id="badge"
|
id="badge"
|
||||||
class="source-badge"
|
class="source-badge"
|
||||||
|
:style="badgeStyle"
|
||||||
src="~dashboard/assets/images/fb-badge.png"
|
src="~dashboard/assets/images/fb-badge.png"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
@ -58,6 +60,15 @@ export default {
|
||||||
imgError: false,
|
imgError: false,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
computed: {
|
||||||
|
avatarSize() {
|
||||||
|
return Number(this.size.replace(/\D+/g, ''));
|
||||||
|
},
|
||||||
|
badgeStyle() {
|
||||||
|
const badgeSize = `${this.avatarSize / 3}px`;
|
||||||
|
return { width: badgeSize, height: badgeSize };
|
||||||
|
},
|
||||||
|
},
|
||||||
methods: {
|
methods: {
|
||||||
onImgError() {
|
onImgError() {
|
||||||
this.imgError = true;
|
this.imgError = true;
|
||||||
|
|
|
@ -1,7 +1,11 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="medium-8 columns conversation-wrap">
|
<div :class="conversationClass">
|
||||||
<div v-if="currentChat.id !== null" class="view-box columns">
|
<div v-if="currentChat.id !== null" class="view-box columns">
|
||||||
<conversation-header :chat="currentChat" />
|
<conversation-header
|
||||||
|
:chat="currentChat"
|
||||||
|
:is-contact-panel-open="isContactPanelOpen"
|
||||||
|
@contactPanelToggle="onToggleContactPanel"
|
||||||
|
/>
|
||||||
<ul class="conversation-panel">
|
<ul class="conversation-panel">
|
||||||
<transition name="slide-up">
|
<transition name="slide-up">
|
||||||
<li>
|
<li>
|
||||||
|
@ -104,6 +108,10 @@ export default {
|
||||||
type: [Number, String],
|
type: [Number, String],
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
|
isContactPanelOpen: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
data() {
|
data() {
|
||||||
|
@ -124,6 +132,11 @@ export default {
|
||||||
fetchingInboxes: 'getInboxLoadingStatus',
|
fetchingInboxes: 'getInboxLoadingStatus',
|
||||||
loadingChatList: 'getChatListLoadingStatus',
|
loadingChatList: 'getChatListLoadingStatus',
|
||||||
}),
|
}),
|
||||||
|
conversationClass() {
|
||||||
|
return `medium-${
|
||||||
|
this.isContactPanelOpen ? '5' : '8'
|
||||||
|
} columns conversation-wrap`;
|
||||||
|
},
|
||||||
// Loading indicator
|
// Loading indicator
|
||||||
// Returns corresponding loading message
|
// Returns corresponding loading message
|
||||||
loadingIndicatorMessage() {
|
loadingIndicatorMessage() {
|
||||||
|
@ -193,6 +206,10 @@ export default {
|
||||||
}, 0);
|
}, 0);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
onToggleContactPanel() {
|
||||||
|
this.$emit('contactPanelToggle');
|
||||||
|
},
|
||||||
|
|
||||||
attachListner() {
|
attachListner() {
|
||||||
this.conversationPanel = this.$el.querySelector('.conversation-panel');
|
this.conversationPanel = this.$el.querySelector('.conversation-panel');
|
||||||
this.heightBeforeLoad =
|
this.heightBeforeLoad =
|
||||||
|
|
|
@ -7,9 +7,17 @@
|
||||||
:badge="chat.meta.sender.channel"
|
:badge="chat.meta.sender.channel"
|
||||||
:username="chat.meta.sender.name"
|
:username="chat.meta.sender.name"
|
||||||
/>
|
/>
|
||||||
|
<div class="user--profile__meta">
|
||||||
<h3 class="user--name">
|
<h3 class="user--name">
|
||||||
{{ chat.meta.sender.name }}
|
{{ chat.meta.sender.name }}
|
||||||
</h3>
|
</h3>
|
||||||
|
<button
|
||||||
|
class="user--profile__button"
|
||||||
|
@click="$emit('contactPanelToggle')"
|
||||||
|
>
|
||||||
|
{{ viewProfileButtonLabel }}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex-container">
|
<div class="flex-container">
|
||||||
<div class="multiselect-box ion-headphone">
|
<div class="multiselect-box ion-headphone">
|
||||||
|
@ -49,7 +57,16 @@ export default {
|
||||||
ResolveButton,
|
ResolveButton,
|
||||||
},
|
},
|
||||||
|
|
||||||
props: ['chat'],
|
props: {
|
||||||
|
chat: {
|
||||||
|
type: Object,
|
||||||
|
default: () => {},
|
||||||
|
},
|
||||||
|
isContactPanelOpen: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
@ -75,6 +92,9 @@ export default {
|
||||||
...this.agents,
|
...this.agents,
|
||||||
];
|
];
|
||||||
},
|
},
|
||||||
|
viewProfileButtonLabel() {
|
||||||
|
return `${this.isContactPanelOpen ? 'Hide' : 'View'} Profile`;
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
|
@ -89,9 +109,7 @@ export default {
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
removeAgent(agent) {
|
removeAgent() {},
|
||||||
console.log(agent.email);
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -0,0 +1,49 @@
|
||||||
|
<template>
|
||||||
|
<div class="medium-3 bg-white contact--panel">
|
||||||
|
<thumbnail
|
||||||
|
:src="contactImage"
|
||||||
|
size="80px"
|
||||||
|
:badge="contact.channel"
|
||||||
|
:username="contact.name"
|
||||||
|
/>
|
||||||
|
<h4>
|
||||||
|
{{ contact.name }}
|
||||||
|
</h4>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { mapGetters } from 'vuex';
|
||||||
|
import Thumbnail from 'dashboard/components/widgets/Thumbnail.vue';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
components: {
|
||||||
|
Thumbnail,
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
...mapGetters({
|
||||||
|
currentChat: 'getSelectedChat',
|
||||||
|
}),
|
||||||
|
contact() {
|
||||||
|
const { meta: { sender = {} } = {} } = this.currentChat || {};
|
||||||
|
return sender;
|
||||||
|
},
|
||||||
|
contactImage() {
|
||||||
|
return `/uploads/avatar/contact/${this.contact.id}/profilepic.jpeg`;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
@import '~dashboard/assets/scss/variables';
|
||||||
|
@import '~dashboard/assets/scss/mixins';
|
||||||
|
|
||||||
|
.contact--panel {
|
||||||
|
@include border-normal-left;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
padding: $space-large $space-normal $space-normal;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -1,7 +1,17 @@
|
||||||
<template>
|
<template>
|
||||||
<section class="app-content columns">
|
<section class="app-content columns">
|
||||||
<chat-list :conversationInbox="inboxId" :pageTitle="$t('CHAT_LIST.TAB_HEADING')" ></chat-list>
|
<chat-list
|
||||||
<conversation-box :inbox-id="inboxId"></conversation-box>
|
:conversation-inbox="inboxId"
|
||||||
|
:page-title="$t('CHAT_LIST.TAB_HEADING')"
|
||||||
|
>
|
||||||
|
</chat-list>
|
||||||
|
<conversation-box
|
||||||
|
:inbox-id="inboxId"
|
||||||
|
:is-contact-panel-open="isContactPanelOpen"
|
||||||
|
@contactPanelToggle="onToggleContactPanel"
|
||||||
|
>
|
||||||
|
</conversation-box>
|
||||||
|
<contact-panel v-if="isContactPanelOpen"></contact-panel>
|
||||||
</section>
|
</section>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@ -11,17 +21,20 @@
|
||||||
import { mapGetters } from 'vuex';
|
import { mapGetters } from 'vuex';
|
||||||
|
|
||||||
import ChatList from '../../../components/ChatList';
|
import ChatList from '../../../components/ChatList';
|
||||||
|
import ContactPanel from './ContactPanel';
|
||||||
import ConversationBox from '../../../components/widgets/conversation/ConversationBox';
|
import ConversationBox from '../../../components/widgets/conversation/ConversationBox';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
ChatList,
|
ChatList,
|
||||||
|
ContactPanel,
|
||||||
ConversationBox,
|
ConversationBox,
|
||||||
},
|
},
|
||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
pageTitle: this.$state,
|
pageTitle: this.$state,
|
||||||
|
isContactPanelOpen: false,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
|
@ -62,6 +75,9 @@ export default {
|
||||||
bus.$emit('scrollToMessage');
|
bus.$emit('scrollToMessage');
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
onToggleContactPanel() {
|
||||||
|
this.isContactPanelOpen = !this.isContactPanelOpen;
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
Loading…
Reference in a new issue