cartodb/lib/assets/javascripts/new-dashboard/pages/Data/Datasets.vue

143 lines
4.3 KiB
Vue
Raw Normal View History

2020-06-15 10:58:47 +08:00
<template>
<section class="datasets-section">
<StickySubheader :is-visible="Boolean(selectedDatasets.length && isScrollPastHeader)">
<h2 class="title is-caption">
{{ $t('BulkActions.selected', {count: selectedDatasets.length}) }}
</h2>
<DatasetBulkActions
:selectedDatasets="selectedDatasets"
:areAllDatasetsSelected="areAllDatasetsSelected"
@selectAll="selectAll"
@deselectAll="deselectAll"></DatasetBulkActions>
</StickySubheader>
<DatasetsList
ref="datasetsList"
class="grid__content"
:hasBulkActions="true"
:canHoverCard="true"
:maxVisibleDatasets="maxVisibleDatasets"
@applyFilter="applyFilter"
@applyOrder="applyOrder"
@selectionChange="updateSelected" />
<Pagination v-if="shouldShowPagination" :page=currentPage :numPages=numPages @pageChange="goToPage"></Pagination>
</section>
</template>
<script>
import { mapState } from 'vuex';
import { checkFilters } from 'new-dashboard/router/hooks/check-navigation';
import Pagination from 'new-dashboard/components/Pagination';
import DatasetBulkActions from 'new-dashboard/components/BulkActions/DatasetBulkActions.vue';
import StickySubheader from '../../components/StickySubheader';
import DatasetsList from 'new-dashboard/components/DatasetsList.vue';
export default {
name: 'DatasetsPage',
components: {
DatasetBulkActions,
StickySubheader,
Pagination,
DatasetsList
},
data () {
return {
isScrollPastHeader: false,
maxVisibleDatasets: 12,
selectedDatasets: []
};
},
beforeMount () {
if (this.$store.getters['user/isViewer']) {
// Redirect to shared datasets page if user is viewer
return this.$router.replace({ name: 'datasets', params: { filter: 'shared' } });
}
},
mounted () {
this.stickyScrollPosition = this.getHeaderBottomPageOffset();
this.$onScrollChange = this.onScrollChange.bind(this);
document.addEventListener('scroll', this.$onScrollChange, { passive: true });
},
beforeDestroy () {
document.removeEventListener('scroll', this.$onScrollChange, { passive: true });
},
beforeRouteUpdate (to, from, next) {
checkFilters('datasets', 'datasets', to, from, next);
},
computed: {
...mapState({
numPages: state => state.datasets.numPages,
currentPage: state => state.datasets.page,
datasets: state => state.datasets.list,
isFetchingDatasets: state => state.datasets.isFetching,
numResults: state => state.datasets.metadata.total_entries
}),
isNotificationVisible () {
return this.$store.getters['user/isNotificationVisible'];
},
areAllDatasetsSelected () {
return Object.keys(this.datasets).length === this.selectedDatasets.length;
},
shouldShowPagination () {
return !this.isFetchingDatasets && this.numResults > 0 && this.numPages > 1;
}
},
methods: {
updateSelected (selected) {
this.selectedDatasets = selected;
},
goToPage (page) {
this.deselectAll();
window.scroll({ top: 0, left: 0 });
this.$router.push({
name: 'datasets',
params: this.$route.params,
query: {...this.$route.query, page}
});
},
applyFilter (filter) {
this.$router.push({ name: 'datasets', params: { filter } });
},
applyOrder (orderParams) {
this.deselectAll();
this.$router.push({
name: 'datasets',
params: this.$route.params,
query: {
...this.$route.query,
page: 1,
order: orderParams.order,
order_direction: orderParams.direction
}
});
},
selectAll () {
this.$refs.datasetsList.selectAll();
},
deselectAll () {
this.$refs.datasetsList.deselectAll();
},
onScrollChange () {
this.isScrollPastHeader = window.pageYOffset > this.stickyScrollPosition;
},
getHeaderBottomPageOffset () {
const headerContainer = this.$refs.datasetsList.getHeaderContainer();
const headerBoundingClientRect = headerContainer.$el.getBoundingClientRect();
const notificationHeight = this.isNotificationVisible ? 60 : 0;
return headerBoundingClientRect.top - notificationHeight;
}
}
};
</script>
<style scoped lang="scss">
@import 'new-dashboard/styles/variables';
.datasets-section {
margin-top: 64px;
}
</style>