scinote-web/app/javascript/vue/results/results_toolbar.vue

127 lines
4.1 KiB
Vue
Raw Normal View History

<template>
<div class="result-toolbar p-3 flex justify-between rounded-md bg-sn-white">
<div class="result-toolbar__left">
<button v-if="canCreate" :title="i18n.t('my_modules.results.add_title')" class="btn btn-secondary" @click="$emit('newResult')">
<i class="sn-icon sn-icon-new-task"></i>
{{ i18n.t('my_modules.results.add_label') }}
</button>
</div>
2023-09-21 14:52:41 +08:00
<div class="dropdown view-switch" >
2023-09-18 21:32:53 +08:00
<div class="btn btn-secondary view-switch-button prevent-shrink" id="viewSwitchButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
<span v-if="archived" class="state-view-switch-btn-name">{{ i18n.t('my_modules.results.archived_results') }}</span>
<span v-else class="state-view-switch-btn-name">{{ i18n.t('my_modules.results.active_results') }}</span>
<span class="sn-icon sn-icon-down"></span>
</div>
<ul class="dropdown-menu dropdown-menu-right" aria-labelledby="viewSwitchButton">
2023-09-21 14:52:41 +08:00
<li class="view-switch-active h-34">
<a class="h-34 dropdown-switch-link" :href="active_url" :class="{'form-dropdown-state-item prevent-shrink': !archived}">
{{ i18n.t('my_modules.results.active_results') }}
</a>
</li>
2023-09-21 14:52:41 +08:00
<li class="view-switch-archived h-34">
<a class="h-34 dropdown-switch-link" :href="archived_url" :class="{'form-dropdown-state-item prevent-shrink': archived}">
{{ i18n.t('my_modules.results.archived_results') }}
</a>
</li>
</ul>
</div>
<div class="result-toolbar__right flex items-center" @click="$emit('expandAll')">
<button class="btn btn-secondary mr-3" @click="collapseResults" tabindex="0">
{{ i18n.t('my_modules.results.collapse_label') }}
</button>
<button class="btn btn-secondary mr-3" @click="expandResults" tabindex="0">
{{ i18n.t('my_modules.results.expand_label') }}
</button>
2023-08-23 17:59:21 +08:00
<FilterDropdown :filters="filters" @applyFilters="setFilters" />
<MenuDropdown
:listItems="this.sortMenu"
:btnClasses="'btn btn-light icon-btn'"
:position="'right'"
:btnIcon="'sn-icon sn-icon-sort'"
@sort="setSort"
></MenuDropdown>
</div>
</div>
</template>
<script>
const SORTS = [
'updated_at_asc',
'updated_at_desc',
'created_at_asc',
'created_at_desc',
'name_asc',
'name_desc'
];
2023-08-23 17:59:21 +08:00
import FilterDropdown from '../shared/filters/filter_dropdown.vue';
import MenuDropdown from '../shared/menu_dropdown.vue'
2023-08-23 17:59:21 +08:00
export default {
name: 'ResultsToolbar',
props: {
2023-08-23 17:59:21 +08:00
sort: { type: String, required: true },
canCreate: { type: Boolean, required: true },
archived: { type: Boolean, required: true },
active_url: { type: String, required: true },
archived_url: { type: String, required: true }
},
2023-08-23 17:59:21 +08:00
data() {
return {
filters: null
}
},
components: { FilterDropdown, MenuDropdown },
created() {
2023-08-23 17:59:21 +08:00
this.filters = [
{
key: 'query',
type: 'Text',
label: this.i18n.t('my_modules.results.filters.query.label'),
placeholder: this.i18n.t('my_modules.results.filters.query.placeholder')
},
{
key: 'created_at',
type: 'DateRange',
label: this.i18n.t('my_modules.results.filters.created_at.label')
},
{
key: 'updated_at',
type: 'DateRange',
label: this.i18n.t('my_modules.results.filters.updated_at.label')
}
];
this.sorts = SORTS;
},
computed: {
sortMenu() {
return this.sorts.map(sort => {
return {
text: this.i18n.t(`my_modules.results.sorts.${sort}`),
emit: 'sort',
params: sort
}
})
}
},
methods: {
setSort(sort) {
this.$emit('setSort', sort);
2023-08-23 17:59:21 +08:00
},
setFilters(filters) {
this.$emit('setFilters', filters);
},
collapseResults() {
$('.result-wrapper .collapse').collapse('hide')
},
expandResults() {
$('.result-wrapper .collapse').collapse('show')
}
}
}
</script>