Files
leadchat/app/javascript/dashboard/routes/dashboard/contacts/components/ContactsTable.vue
2021-05-04 15:21:34 +05:30

281 lines
6.9 KiB
Vue

<template>
<section class="contacts-table-wrap">
<ve-table
:fixed-header="true"
max-height="calc(100vh - 11.4rem)"
scroll-width="187rem"
:columns="columns"
:table-data="tableData"
:border-around="false"
/>
<empty-state
v-if="showSearchEmptyState"
:title="$t('CONTACTS_PAGE.LIST.404')"
/>
<div v-if="isLoading" class="contacts--loader">
<spinner />
<span>{{ $t('CONTACTS_PAGE.LIST.LOADING_MESSAGE') }}</span>
</div>
</section>
</template>
<script>
import { mixin as clickaway } from 'vue-clickaway';
import { VeTable } from 'vue-easytable';
import Spinner from 'shared/components/Spinner.vue';
import Thumbnail from 'dashboard/components/widgets/Thumbnail.vue';
import EmptyState from 'dashboard/components/widgets/EmptyState.vue';
import timeMixin from 'dashboard/mixins/time';
export default {
components: {
EmptyState,
Spinner,
VeTable,
},
mixins: [clickaway, timeMixin],
props: {
contacts: {
type: Array,
default: () => [],
},
showSearchEmptyState: {
type: Boolean,
default: false,
},
onClickContact: {
type: Function,
default: () => {},
},
isLoading: {
type: Boolean,
default: false,
},
activeContactId: {
type: [String, Number],
default: '',
},
},
data() {
return {
columns: [
{
field: 'name',
key: 'name',
title: this.$t('CONTACTS_PAGE.LIST.TABLE_HEADER.NAME'),
fixed: 'left',
align: 'left',
width: 300,
renderBodyCell: ({ row }) => (
<WootButton
variant="clear"
size="expanded"
onClick={() => this.onClickContact(row.id)}
>
<div class="row--user-block">
<Thumbnail
src={row.thumbnail}
size="36px"
username={row.name}
status={row.availability_status}
/>
<div class="user-block">
<h6 class="sub-block-title user-name text-truncate">
{row.name}
</h6>
<span class="button clear small">
{this.$t('CONTACTS_PAGE.LIST.VIEW_DETAILS')}
</span>
</div>
</div>
</WootButton>
),
},
{
field: 'email',
key: 'email',
title: this.$t('CONTACTS_PAGE.LIST.TABLE_HEADER.EMAIL_ADDRESS'),
align: 'left',
width: 240,
renderBodyCell: ({ row }) => {
if (row.email)
return (
<div class="text-truncate">
<a
target="_blank"
rel="noopener noreferrer nofollow"
href={`mailto:${row.email}`}
>
{row.email}
</a>
</div>
);
return '---';
},
},
{
field: 'phone',
key: 'phone',
title: this.$t('CONTACTS_PAGE.LIST.TABLE_HEADER.PHONE_NUMBER'),
align: 'left',
},
{
field: 'company',
key: 'company',
title: this.$t('CONTACTS_PAGE.LIST.TABLE_HEADER.COMPANY'),
align: 'left',
},
{
field: 'city',
key: 'city',
title: this.$t('CONTACTS_PAGE.LIST.TABLE_HEADER.CITY'),
align: 'left',
},
{
field: 'country',
key: 'country',
title: this.$t('CONTACTS_PAGE.LIST.TABLE_HEADER.COUNTRY'),
align: 'left',
},
{
field: 'profiles',
key: 'profiles',
title: this.$t('CONTACTS_PAGE.LIST.TABLE_HEADER.SOCIAL_PROFILES'),
align: 'left',
renderBodyCell: ({ row }) => {
const { profiles } = row;
const items = Object.keys(profiles);
if (!items.length) return '---';
return (
<div class="cell--social-profiles">
{items.map(
profile =>
profiles[profile] && (
<a
target="_blank"
rel="noopener noreferrer nofollow"
href={`https://${profile}.com/${profiles[profile]}`}
>
<i class={`ion-social-${profile}`} />
</a>
)
)}
</div>
);
},
},
{
field: 'lastSeen',
key: 'lastSeen',
title: this.$t('CONTACTS_PAGE.LIST.TABLE_HEADER.LAST_ACTIVITY'),
align: 'left',
},
{
field: 'conversationsCount',
key: 'conversationsCount',
title: this.$t('CONTACTS_PAGE.LIST.TABLE_HEADER.CONVERSATIONS'),
width: 150,
align: 'left',
},
],
};
},
computed: {
tableData() {
if (this.isLoading) {
return [];
}
return this.contacts.map(item => {
const additional = item.additional_attributes || {};
const { last_seen_at: lastSeenAt } = item;
return {
...item,
phone: item.phone_number || '---',
company: additional.company_name || '---',
location: additional.location || '---',
profiles: additional.social_profiles || {},
city: additional.city || '---',
country: additional.country || '---',
conversationsCount: item.conversations_count || '---',
lastSeen: lastSeenAt ? this.dynamicTime(lastSeenAt) : '---',
};
});
},
},
};
</script>
<style lang="scss" scoped>
@import '~dashboard/assets/scss/mixins';
.contacts-table-wrap {
flex: 1 1;
height: 100%;
overflow: hidden;
}
.contacts-table-wrap::v-deep {
.ve-table {
padding-bottom: var(--space-large);
}
.row--user-block {
align-items: center;
display: flex;
text-align: left;
.user-block {
min-width: 0;
}
.user-thumbnail-box {
margin-right: var(--space-small);
}
.user-name {
font-size: var(--font-size-small);
margin: 0;
text-transform: capitalize;
}
.user-email {
margin: 0;
}
}
.ve-table-header-th {
padding: var(--space-small) var(--space-two) !important;
}
.ve-table-body-td {
padding: var(--space-slab) var(--space-two) !important;
}
.ve-table-header-th {
font-size: var(--font-size-mini) !important;
}
}
.contacts--loader {
align-items: center;
display: flex;
font-size: var(--font-size-default);
justify-content: center;
padding: var(--space-big);
}
.cell--social-profiles {
a {
color: var(--s-300);
display: inline-block;
font-size: var(--font-size-medium);
min-width: var(--space-large);
text-align: center;
}
}
</style>