Files
leadchat/app/javascript/dashboard/routes/dashboard/contacts/components/Header.vue
Sivin Varghese cd6c9a8fe9 enhancement: Custom views (#3838)
* enhancement: Custom views

* Review fixes
2022-01-27 08:26:12 +05:30

232 lines
5.3 KiB
Vue

<template>
<header class="header">
<div class="table-actions-wrap">
<div class="left-aligned-wrap">
<h1 class="page-title">
{{ headerTitle }}
</h1>
</div>
<div class="right-aligned-wrap">
<div class="search-wrap">
<fluent-icon icon="search" class="search-icon" />
<input
type="text"
:placeholder="$t('CONTACTS_PAGE.SEARCH_INPUT_PLACEHOLDER')"
class="contact-search"
:value="searchQuery"
@keyup.enter="onSearchSubmit"
@input="onInputSearch"
/>
<woot-button
:is-loading="false"
class="clear"
:class-names="searchButtonClass"
@click="onSearchSubmit"
>
{{ $t('CONTACTS_PAGE.SEARCH_BUTTON') }}
</woot-button>
</div>
<woot-button
v-if="hasActiveSegments"
class="margin-right-small clear"
color-scheme="alert"
icon="delete"
@click="onToggleDeleteSegmentsModal"
>
{{ $t('CONTACTS_PAGE.FILTER_CONTACTS_DELETE') }}
</woot-button>
<div v-if="!hasActiveSegments" class="filters__button-wrap">
<div v-if="hasAppliedFilters" class="filters__applied-indicator" />
<woot-button
class="margin-right-small clear"
color-scheme="secondary"
data-testid="create-new-contact"
icon="filter"
@click="onToggleFilter"
>
{{ $t('CONTACTS_PAGE.FILTER_CONTACTS') }}
</woot-button>
</div>
<woot-button
v-if="hasAppliedFilters && !hasActiveSegments"
class="margin-right-small clear"
color-scheme="alert"
variant="clear"
icon="save"
@click="onToggleSegmentsModal"
>
{{ $t('CONTACTS_PAGE.FILTER_CONTACTS_SAVE') }}
</woot-button>
<woot-button
class="margin-right-small clear"
color-scheme="success"
icon="person-add"
data-testid="create-new-contact"
@click="onToggleCreate"
>
{{ $t('CREATE_CONTACT.BUTTON_LABEL') }}
</woot-button>
<woot-button
color-scheme="info"
icon="upload"
class="clear"
@click="onToggleImport"
>
{{ $t('IMPORT_CONTACTS.BUTTON_LABEL') }}
</woot-button>
</div>
</div>
</header>
</template>
<script>
import { mapGetters } from 'vuex';
export default {
props: {
headerTitle: {
type: String,
default: '',
},
searchQuery: {
type: String,
default: '',
},
segmentsId: {
type: [String, Number],
default: 0,
},
onInputSearch: {
type: Function,
default: () => {},
},
onSearchSubmit: {
type: Function,
default: () => {},
},
onToggleCreate: {
type: Function,
default: () => {},
},
onToggleImport: {
type: Function,
default: () => {},
},
onToggleFilter: {
type: Function,
default: () => {},
},
},
data() {
return {
showCreateModal: false,
showImportModal: false,
};
},
computed: {
searchButtonClass() {
return this.searchQuery !== '' ? 'show' : '';
},
...mapGetters({
getAppliedContactFilters: 'contacts/getAppliedContactFilters',
}),
hasAppliedFilters() {
return this.getAppliedContactFilters.length;
},
hasActiveSegments() {
return this.segmentsId !== 0;
},
},
methods: {
onToggleSegmentsModal() {
this.$emit('on-toggle-save-filter');
},
onToggleDeleteSegmentsModal() {
this.$emit('on-toggle-delete-filter');
},
},
};
</script>
<style lang="scss" scoped>
.page-title {
margin: 0;
}
.table-actions-wrap {
display: flex;
justify-content: space-between;
width: 100%;
padding: var(--space-small) var(--space-normal) var(--space-small)
var(--space-normal);
}
.left-aligned-wrap {
display: flex;
align-items: center;
justify-content: center;
}
.right-aligned-wrap {
display: flex;
}
.search-wrap {
width: 400px;
display: flex;
align-items: center;
position: relative;
margin-right: var(--space-small);
.search-icon {
position: absolute;
top: 1px;
left: var(--space-one);
height: 3.8rem;
line-height: 3.6rem;
font-size: var(--font-size-medium);
color: var(--b-700);
}
.contact-search {
margin: 0;
height: 3.8rem;
width: 100%;
padding-left: var(--space-large);
padding-right: 6rem;
border-color: var(--s-100);
}
.button {
margin-left: var(--space-small);
height: 3.2rem;
right: var(--space-smaller);
position: absolute;
padding: 0 var(--space-small);
transition: transform 100ms linear;
opacity: 0;
transform: translateX(-1px);
visibility: hidden;
}
.button.show {
opacity: 1;
transform: translateX(0);
visibility: visible;
}
}
.filters__button-wrap {
position: relative;
.filters__applied-indicator {
position: absolute;
height: var(--space-small);
width: var(--space-small);
top: var(--space-smaller);
right: var(--space-slab);
background-color: var(--s-500);
border-radius: var(--border-radius-rounded);
}
}
</style>