Revert "Updates sidebar on dashboard"

This reverts commit 6186d14593.
This commit is contained in:
Sojan 2020-02-11 19:34:42 +05:30
parent 6186d14593
commit 2023d5d42b
20 changed files with 112 additions and 394 deletions

View file

@ -10,8 +10,8 @@ class ConversationApi extends ApiClient {
return axios.get(`${this.url}/${conversationID}/labels`); return axios.get(`${this.url}/${conversationID}/labels`);
} }
updateLabels(conversationID, labels) { createLabels(conversationID) {
return axios.post(`${this.url}/${conversationID}/labels`, { labels }); return axios.get(`${this.url}/${conversationID}/labels`);
} }
} }

View file

@ -1,5 +1,3 @@
@import '~widget/assets/scss/mixins';
//borders //borders
@mixin border-nil() { @mixin border-nil() {
border-color: transparent; border-color: transparent;
@ -141,7 +139,7 @@
} }
@mixin elegent-shadow() { @mixin elegent-shadow() {
box-shadow: 0 10px 25px 0 rgba(49, 49, 93, 0.15); box-shadow: 0 10px 25px 0 rgba(49,49,93,0.15);
} }
@mixin elegant-card() { @mixin elegant-card() {
@ -183,55 +181,41 @@
// .element{ // .element{
// @include arrow(top, #000, 50px); // @include arrow(top, #000, 50px);
// } // }
@mixin arrow($direction, $color, $size) { @mixin arrow($direction, $color, $size){
display: block; display: block;
height: 0; height: 0;
width: 0; width: 0;
content: ''; content: '';
@if $direction=='top' { @if $direction == 'top' {
border-left: $size solid transparent; border-left: $size solid transparent;
border-right: $size solid transparent; border-right: $size solid transparent;
border-bottom: $size solid $color; border-bottom: $size solid $color;
} } @else if $direction == 'right' {
border-top: $size solid transparent;
@else if $direction=='right' { border-bottom: $size solid transparent;
border-top: $size solid transparent; border-left: $size solid $color;
border-bottom: $size solid transparent; } @else if $direction == 'bottom' {
border-left: $size solid $color; border-top: $size solid $color;
} border-right: $size solid transparent;
border-left: $size solid transparent;
@else if $direction=='bottom' { } @else if $direction == 'left' {
border-top: $size solid $color; border-top: $size solid transparent;
border-right: $size solid transparent; border-right: $size solid $color;
border-left: $size solid transparent; border-bottom: $size solid transparent;
} } @else if $direction == 'top-left' {
border-top: $size solid $color;
@else if $direction=='left' { border-right: $size solid transparent;
border-top: $size solid transparent; } @else if $direction == 'top-right' {
border-right: $size solid $color; border-top: $size solid $color;
border-bottom: $size solid transparent; border-left: $size solid transparent;
} } @else if $direction == 'bottom-left' {
border-bottom: $size solid $color;
@else if $direction=='top-left' { border-right: $size solid transparent;
border-top: $size solid $color; } @else if $direction == 'bottom-right' {
border-right: $size solid transparent; border-bottom: $size solid $color;
} border-left: $size solid transparent;
}
@else if $direction=='top-right' {
border-top: $size solid $color;
border-left: $size solid transparent;
}
@else if $direction=='bottom-left' {
border-bottom: $size solid $color;
border-right: $size solid transparent;
}
@else if $direction=='bottom-right' {
border-bottom: $size solid $color;
border-left: $size solid transparent;
}
} }
@mixin text-ellipsis { @mixin text-ellipsis {

View file

@ -53,16 +53,6 @@ $color-body: #3C4858;
$color-heading: #1F2D3D; $color-heading: #1F2D3D;
$color-extra-light-blue: #F5F7F9; $color-extra-light-blue: #F5F7F9;
$primary-color: $color-woot;
$secondary-color: #FF5216;
$success-color: #13ce66;
$warning-color: #ffc82c;
$alert-color: #ff4949;
// Color-palettes
$color-primary-dark: darken($color-woot, 20%);
// Thumbnail // Thumbnail
$thumbnail-radius: 4rem; $thumbnail-radius: 4rem;
@ -91,6 +81,3 @@ $swift-ease-out: all $swift-ease-out-duration $swift-ease-out-timing-function !d
// Ionicons // Ionicons
$ionicons-font-path: '~ionicons/fonts'; $ionicons-font-path: '~ionicons/fonts';
// Transitions
$transition-ease-in: all 0.250s ease-in;

View file

@ -2,13 +2,7 @@
margin-bottom: $space-normal; margin-bottom: $space-normal;
min-height: 38px; min-height: 38px;
&.multiselect--active { > .multiselect__tags {
>.multiselect__tags {
border-color: $color-woot;
}
}
>.multiselect__tags {
@include margin(0); @include margin(0);
border: 1px solid $color-border; border: 1px solid $color-border;
min-height: 44px; min-height: 44px;
@ -19,34 +13,12 @@
} }
.multiselect__tag { .multiselect__tag {
$vertical-space: $space-smaller+$space-micro;
margin-top: $space-one; margin-top: $space-one;
background: $color-background;
color: $color-heading;
padding: $vertical-space $space-medium $vertical-space $space-one;
}
.multiselect__tag-icon {
line-height: $space-medium + $space-micro;
&:after {
color: $color-primary-dark;
}
&:hover {
background: $color-background;
&:after {
color: $color-woot;
}
}
} }
.multiselect__input { .multiselect__input {
@include ghost-input; @include ghost-input;
@include padding($zero); @include padding($zero);
font-size: $font-size-small;
margin-bottom: $zero; margin-bottom: $zero;
} }
@ -69,50 +41,4 @@
top: 60%; top: 60%;
} }
} }
.multiselect__content .multiselect__option {
font-size: $font-size-small;
font-weight: $font-weight-normal;
&.multiselect__option--highlight {
font-weight: $font-weight-medium;
}
}
}
.sidebar-labels-wrap {
&.has-edited,
&:hover {
.multiselect {
cursor: pointer;
margin-top: $space-small;
>.multiselect__tags {
border-color: $color-border;
}
>.multiselect__select {
visibility: visible;
}
}
}
.multiselect {
>.multiselect__select {
visibility: hidden;
}
>.multiselect__tags {
border-color: transparent;
}
&.multiselect--active {
>.multiselect__tags {
border-color: $color-woot;
}
}
}
} }

View file

@ -24,18 +24,9 @@
} }
} }
>.icon { > .icon {
font-size: $font-size-default; font-size: $font-size-default;
} }
&.tiny {
font-size: $font-size-mini;
padding: $space-small $space-slab;
}
&.round {
border-radius: $space-larger;
}
} }
.button--fixed-right-top { .button--fixed-right-top {

View file

@ -5,7 +5,6 @@
@include flex; @include flex;
@include flex-align($x: justify, $y: middle); @include flex-align($x: justify, $y: middle);
@include border-normal-bottom; @include border-normal-bottom;
// Resolve Button // Resolve Button
.button { .button {
@include margin(0); @include margin(0);
@ -45,7 +44,6 @@
.user--name { .user--name {
@include margin(0); @include margin(0);
font-size: $font-size-medium; font-size: $font-size-medium;
text-transform: capitalize;
} }
.user--profile__meta { .user--profile__meta {
@ -66,7 +64,7 @@
} }
.button.resolve--button { .button.resolve--button {
>.icon { > .icon {
padding-right: $space-small; padding-right: $space-small;
font-size: $font-size-default; font-size: $font-size-default;
} }

View file

@ -47,19 +47,16 @@
@include background-gray; @include background-gray;
@include margin(0); @include margin(0);
@include border-normal-left; @include border-normal-left;
.current-chat { .current-chat {
@include flex; @include flex;
@include full-height; @include full-height;
flex-direction: column; flex-direction: column;
@include flex-align(center, middle); @include flex-align(center, middle);
div { div {
@include flex; @include flex;
@include full-height; @include full-height;
flex-direction: column; flex-direction: column;
@include flex-align(center, middle); @include flex-align(center, middle);
img { img {
@include margin($space-normal); @include margin($space-normal);
width: 10rem; width: 10rem;
@ -90,7 +87,7 @@
height: 100%; height: 100%;
overflow-y: scroll; overflow-y: scroll;
>li { > li {
@include flex; @include flex;
@include flex-shrink; @include flex-shrink;
@include margin($zero $zero $space-smaller); @include margin($zero $zero $space-smaller);
@ -150,7 +147,7 @@
@include flex-align(right, null); @include flex-align(right, null);
.wrap { .wrap {
margin-right: $space-normal; margin-right: $space-small;
text-align: right; text-align: right;
} }

View file

@ -13,7 +13,6 @@
.tabs-title { .tabs-title {
a { a {
font-size: $font-size-default; font-size: $font-size-default;
font-weight: $font-weight-medium;
padding-bottom: $space-slab; padding-bottom: $space-slab;
padding-top: $space-slab; padding-top: $space-slab;
} }

View file

@ -23,7 +23,7 @@
src="~dashboard/assets/images/fb-badge.png" src="~dashboard/assets/images/fb-badge.png"
/> />
<div <div
v-else-if="status === 'online'" v-else-if="badge === 'Channel::WebWidget' && status === 'online'"
class="source-badge user--online" class="source-badge user--online"
:style="statusStyle" :style="statusStyle"
></div> ></div>

View file

@ -8,7 +8,7 @@
:username="chat.meta.sender.name" :username="chat.meta.sender.name"
/> />
<div class="user--profile__meta"> <div class="user--profile__meta">
<h3 class="user--name text-truncate"> <h3 v-if="!isContactPanelOpen" class="user--name text-truncate">
{{ chat.meta.sender.name }} {{ chat.meta.sender.name }}
</h3> </h3>
<button <button
@ -93,9 +93,7 @@ export default {
]; ];
}, },
viewProfileButtonLabel() { viewProfileButtonLabel() {
return `${ return `${this.isContactPanelOpen ? 'Hide' : 'View'} Profile`;
this.isContactPanelOpen ? 'Close' : 'Open'
} Conversation Details`;
}, },
}, },

View file

@ -1,6 +1,5 @@
{ {
"CONTACT_PANEL": { "CONTACT_PANEL": {
"CONVERSATION_TITLE": "Conversation Details",
"BROWSER": "Browser", "BROWSER": "Browser",
"OS": "Operating System", "OS": "Operating System",
"INITIATED_FROM": "Initiated from", "INITIATED_FROM": "Initiated from",
@ -11,10 +10,7 @@
}, },
"LABELS": { "LABELS": {
"NO_RECORDS_FOUND": "There are no labels associated to this conversation.", "NO_RECORDS_FOUND": "There are no labels associated to this conversation.",
"TITLE": "Conversation Labels", "TITLE": "Labels"
"UPDATE_BUTTON": "Update Labels",
"ADD_BUTTON": "Add Labels",
"UPDATE_ERROR": "Couldn't update labels, try Again 🧐"
} }
} }
} }

View file

@ -1,10 +1,13 @@
<template> <template>
<div class="contact-conversation--panel"> <div class="contact-conversation--panel">
<contact-details-item :title="$t('CONTACT_PANEL.CONVERSATIONS.TITLE')" /> <contact-details-item
icon="ion-chatbubbles"
:title="$t('CONTACT_PANEL.CONVERSATIONS.TITLE')"
/>
<div v-if="!uiFlags.isFetching"> <div v-if="!uiFlags.isFetching">
<p v-if="!previousConversations.length" class="no-results"> <i v-if="!previousConversations.length">
{{ $t('CONTACT_PANEL.CONVERSATIONS.NO_RECORDS_FOUND') }} {{ $t('CONTACT_PANEL.CONVERSATIONS.NO_RECORDS_FOUND') }}
</p> </i>
<div v-else class="contact-conversation--list"> <div v-else class="contact-conversation--list">
<conversation-card <conversation-card
v-for="conversation in previousConversations" v-for="conversation in previousConversations"
@ -75,17 +78,11 @@ export default {
@import '~dashboard/assets/scss/mixins'; @import '~dashboard/assets/scss/mixins';
.contact-conversation--panel { .contact-conversation--panel {
padding: $space-normal; @include border-normal-top;
padding-top: 0; padding: $space-medium;
} }
.contact-conversation--list { .contact-conversation--list {
margin-top: $space-normal; margin-top: -$space-normal;
}
.no-results {
margin: 0;
color: $color-gray;
padding: 0 $space-small;
} }
</style> </style>

View file

@ -1,9 +1,9 @@
<template> <template>
<div class="conv-details--item"> <div class="conv-details--item">
<h4 class="conv-details--item__label"> <div class="conv-details--item__label">
<i :class="icon" class="conv-details--item__icon"></i> <i :class="icon" class="conv-details--item__icon"></i>
{{ title }} {{ title }}
</h4> </div>
<div v-if="value" class="conv-details--item__value"> <div v-if="value" class="conv-details--item__value">
{{ value }} {{ value }}
</div> </div>
@ -14,7 +14,7 @@
export default { export default {
props: { props: {
title: { type: String, required: true }, title: { type: String, required: true },
icon: { type: String, default: '' }, icon: { type: String, required: true },
value: { type: [String, Number], default: '' }, value: { type: [String, Number], default: '' },
}, },
}; };
@ -32,18 +32,16 @@ export default {
} }
.conv-details--item__icon { .conv-details--item__icon {
padding-right: $space-smaller; padding-right: $space-micro;
} }
.conv-details--item__label { .conv-details--item__label {
font-weight: $font-weight-medium; font-weight: $font-weight-medium;
margin-bottom: $space-micro; margin-bottom: $space-micro;
font-size: $font-size-small;
} }
.conv-details--item__value { .conv-details--item__value {
word-break: break-all; word-break: break-all;
margin-top: $space-slab;
} }
} }
</style> </style>

View file

@ -48,12 +48,6 @@
{{ contact.additional_attributes.description }} {{ contact.additional_attributes.description }}
</div> </div>
</div> </div>
<conversation-labels :conversation-id="conversationId" />
<contact-conversations
v-if="contact.id"
:contact-id="contact.id"
:conversation-id="conversationId"
/>
<div v-if="browser" class="conversation--details"> <div v-if="browser" class="conversation--details">
<contact-details-item <contact-details-item
v-if="browser.browser_name" v-if="browser.browser_name"
@ -80,6 +74,13 @@
icon="ion-clock" icon="ion-clock"
/> />
</div> </div>
<contact-conversations
v-if="contact.id"
:contact-id="contact.id"
:conversation-id="conversationId"
/>
<conversation-labels :conversation-id="conversationId" />
</div> </div>
</template> </template>
@ -168,11 +169,9 @@ export default {
} }
.contact--profile { .contact--profile {
padding: $space-normal; width: 100%;
padding: $space-normal $space-medium $zero;
align-items: center; align-items: center;
margin: $space-medium $space-normal 0;
@include elegant-card;
@include light-shadow;
.user-thumbnail-box { .user-thumbnail-box {
margin-right: $space-normal; margin-right: $space-normal;
@ -192,10 +191,9 @@ export default {
.contact--name { .contact--name {
@include text-ellipsis; @include text-ellipsis;
text-transform: capitalize;
font-weight: $font-weight-bold; font-weight: $font-weight-bold;
font-size: $font-size-medium; font-size: $font-size-default;
} }
.contact--email { .contact--email {
@ -212,7 +210,8 @@ export default {
} }
.conversation--details { .conversation--details {
padding: $space-two $space-normal; padding: $space-medium;
width: 100%;
} }
.conversation--labels { .conversation--labels {

View file

@ -1,51 +1,21 @@
<template> <template>
<div <div class="contact-conversation--panel">
class="contact-conversation--panel sidebar-labels-wrap" <contact-details-item
:class="hasEditedClass" icon="ion-pricetags"
> :title="$t('CONTACT_PANEL.LABELS.TITLE')"
<div v-if="!conversationUiFlags.isFetching" class="wrap"> />
<div class="contact-conversation--list"> <div v-if="!uiFlags.isFetching">
<label class="select-tags"> <i v-if="!labels.length">
{{ $t('CONTACT_PANEL.LABELS.TITLE') }} {{ $t('CONTACT_PANEL.LABELS.NO_RECORDS_FOUND') }}
<p v-if="!savedLabels.length && !showLabelInput" class="no-results"> </i>
{{ $t('CONTACT_PANEL.LABELS.NO_RECORDS_FOUND') }} <div v-else class="contact-conversation--list">
<button <span
type="button success" v-for="label in labels"
class="button nice tiny" :key="label"
@click="showLabelBox" class="conversation--label label primary"
> >
{{ $t('CONTACT_PANEL.LABELS.ADD_BUTTON') }} {{ label }}
</button> </span>
</p>
<multiselect
v-if="showLabelInput || savedLabels.length"
v-model="selectedLabels"
:options="savedLabels"
tag-placeholder="Add this as new tag"
placeholder="Search or add a tag"
:multiple="true"
:taggable="true"
@tag="addLabel"
/>
</label>
<div class="row align-middle align-justify">
<span v-if="labelUiFlags.isError" class="error">{{
$t('CONTACT_PANEL.LABELS.UPDATE_ERROR')
}}</span>
<button
v-if="hasEdited"
type="button"
class="button nice tiny"
@click="onUpdateLabels"
>
<spinner v-if="labelUiFlags.isUpdating" size="tiny" />
{{
labelUiFlags.isUpdating
? 'saving...'
: $t('CONTACT_PANEL.LABELS.UPDATE_BUTTON')
}}
</button>
</div>
</div> </div>
</div> </div>
<spinner v-else></spinner> <spinner v-else></spinner>
@ -54,11 +24,12 @@
<script> <script>
import { mapGetters } from 'vuex'; import { mapGetters } from 'vuex';
import Spinner from 'shared/components/Spinner'; import Spinner from 'shared/components/Spinner.vue';
import ConversationAPI from '../../../api/conversations'; import ContactDetailsItem from './ContactDetailsItem.vue';
export default { export default {
components: { components: {
ContactDetailsItem,
Spinner, Spinner,
}, },
props: { props: {
@ -67,75 +38,25 @@ export default {
required: true, required: true,
}, },
}, },
data() {
return {
isSearching: false,
selectedLabels: [],
showLabelInput: false,
};
},
computed: { computed: {
hasEdited() { labels() {
if (this.selectedLabels.length !== this.savedLabels.length) { return this.$store.getters['conversationLabels/getConversationLabels'](
return true; this.conversationId
}
const isSame = this.selectedLabels.every(label =>
this.savedLabels.includes(label)
); );
return !isSame;
},
savedLabels() {
const saved = this.$store.getters[
'conversationLabels/getConversationLabels'
](this.conversationId);
return saved;
},
hasEditedClass() {
return this.hasEdited ? 'has-edited' : '';
}, },
...mapGetters({ ...mapGetters({
conversationUiFlags: 'contactConversations/getUIFlags', uiFlags: 'contactConversations/getUIFlags',
labelUiFlags: 'conversationLabels/getUIFlags',
}), }),
}, },
watch: { watch: {
conversationId(newConversationId, prevConversationId) { conversationId(newConversationId, prevConversationId) {
if (newConversationId && newConversationId !== prevConversationId) { if (newConversationId && newConversationId !== prevConversationId) {
this.$store this.$store.dispatch('conversationLabels/get', newConversationId);
.dispatch('conversationLabels/get', newConversationId)
.then(() => {
this.selectedLabels = [...this.savedLabels];
});
} }
}, },
}, },
mounted() { mounted() {
this.$store this.$store.dispatch('conversationLabels/get', this.conversationId);
.dispatch('conversationLabels/get', this.conversationId)
.then(() => {
this.selectedLabels = [...this.savedLabels];
});
},
methods: {
addLabel(label) {
this.selectedLabels = [...this.selectedLabels, label];
},
asyncSearchLabels(query) {
this.isSearching = true;
ConversationAPI(query).then(response => {
this.countries = response;
this.isLoading = false;
});
},
onUpdateLabels() {
this.$store.dispatch('conversationLabels/update', {
conversationId: this.conversationId,
labels: this.selectedLabels,
});
},
showLabelBox() {
this.showLabelInput = true;
},
}, },
}; };
</script> </script>
@ -145,7 +66,12 @@ export default {
@import '~dashboard/assets/scss/mixins'; @import '~dashboard/assets/scss/mixins';
.contact-conversation--panel { .contact-conversation--panel {
padding: $space-normal; @include border-normal-top;
padding: $space-medium;
}
.contact-conversation--list {
margin-top: -$space-normal;
} }
.conversation--label { .conversation--label {
@ -154,36 +80,4 @@ export default {
font-size: $font-size-small; font-size: $font-size-small;
padding: $space-smaller; padding: $space-smaller;
} }
.wrap {
margin-top: $space-slab;
}
.select-tags {
margin-top: $space-small;
.multiselect {
&:hover {
cursor: pointer;
}
transition: $transition-ease-in;
margin-bottom: 0;
}
}
.button {
margin-top: $space-small;
margin-left: auto;
}
.no-results {
margin: $space-normal 0 0 0;
color: $color-gray;
padding: 0 $space-small;
font-weight: $font-weight-normal;
}
.error {
color: $alert-color;
font-size: $font-size-mini;
font-weight: $font-weight-medium;
}
</style> </style>

View file

@ -6,8 +6,6 @@ const state = {
records: {}, records: {},
uiFlags: { uiFlags: {
isFetching: false, isFetching: false,
isUpdating: false,
isError: false,
}, },
}; };
@ -40,30 +38,6 @@ export const actions = {
}); });
} }
}, },
update: async ({ commit }, { conversationId, labels }) => {
commit(types.default.SET_CONVERSATION_LABELS_UI_FLAG, {
isUpdating: true,
});
try {
const response = await ConversationAPI.updateLabels(
conversationId,
labels
);
commit(types.default.SET_CONVERSATION_LABELS, {
id: conversationId,
data: response.data.payload,
});
commit(types.default.SET_CONVERSATION_LABELS_UI_FLAG, {
isUpdating: false,
isError: false,
});
} catch (error) {
commit(types.default.SET_CONVERSATION_LABELS_UI_FLAG, {
isUpdating: false,
isError: true,
});
}
},
}; };
export const mutations = { export const mutations = {

View file

@ -1,16 +1,7 @@
<template> <template>
<span class="spinner" :class="size"></span> <span class="spinner small"></span>
</template> </template>
<script>
export default {
props: {
size: {
type: String,
default: 'small',
},
},
};
</script>
<style scoped lang="scss"> <style scoped lang="scss">
@import '~widget/assets/scss/variables'; @import '~widget/assets/scss/variables';
@ -48,7 +39,7 @@ export default {
vertical-align: middle; vertical-align: middle;
&.message { &.message {
padding: $space-one; padding: $space-normal;
top: 0; top: 0;
left: 0; left: 0;
margin: 0 auto; margin: 0 auto;
@ -72,17 +63,5 @@ export default {
margin-top: -$space-small; margin-top: -$space-small;
} }
} }
&.tiny {
width: $space-one;
height: $space-one;
padding: 0 $space-smaller;
&:before {
width: $space-one;
height: $space-one;
margin-top: -$space-small + $space-micro;
}
}
} }
</style> </style>

View file

@ -1,5 +1,5 @@
// scss-lint:disable PseudoElement SpaceBeforeBrace VendorPrefix // scss-lint:disable PseudoElement SpaceBeforeBrace VendorPrefix
$shadow-color-1: rgba(50, 50, 93, 0.08); $shadow-color-1: rgba(50, 50, 93, 0.2);
$shadow-color-2: rgba(0, 0, 0, 0.07); $shadow-color-2: rgba(0, 0, 0, 0.07);
$shadow-color-3: rgba(50, 50, 93, .08); $shadow-color-3: rgba(50, 50, 93, .08);
$shadow-color-4: rgba(0, 0, 0, .05); $shadow-color-4: rgba(0, 0, 0, .05);

View file

@ -101,10 +101,10 @@ export const SDK_CSS = ` .woot-widget-holder {
width: 400px !important; width: 400px !important;
min-height: 250px !important; min-height: 250px !important;
max-height: 590px !important; max-height: 590px !important;
-o-border-radius: 16px !important; -o-border-radius: 8px !important;
-moz-border-radius: 16px !important; -moz-border-radius: 8px !important;
-webkit-border-radius: 16px !important; -webkit-border-radius: 8px !important;
border-radius: 16px !important; border-radius: 8px !important;
} }
} }

View file

@ -4,6 +4,7 @@
<Thumbnail <Thumbnail
size="24px" size="24px"
:username="user.name" :username="user.name"
status="online"
:src="user.avatar" :src="user.avatar"
has-border has-border
/> />