<template> <div class="grid-view__placeholder" :style="{ height: placeholderHeight + 'px', width: placeholderWidth + 'px', }" > <div v-if="includeGroupBy" class="grid-view__placeholder-groups" :style="{ width: groupByWidth + 'px' }" ></div> <template v-if="includeRowDetails || visibleFields.length > 0"> <div v-for="(value, index) in placeholderPositions" :key="'placeholder-column-' + index" class="grid-view__placeholder-column" :style="{ left: value - 1 + 'px' }" ></div> </template> </div> </template> <script> import { mapGetters } from 'vuex' import gridViewHelpers from '@baserow/modules/database/mixins/gridViewHelpers' export default { name: 'GridViewPlaceholder', mixins: [gridViewHelpers], props: { visibleFields: { type: Array, required: true, }, view: { type: Object, required: true, }, includeRowDetails: { type: Boolean, required: true, }, includeGroupBy: { type: Boolean, required: false, default: () => false, }, }, computed: { groupByWidth() { return this.includeGroupBy ? this.activeGroupByWidth : 0 }, /** * Calculate the left positions of the placeholder columns. These are the gray * vertical lines that are always visible, even when the data hasn't loaded yet. */ placeholderPositions() { let last = this.groupByWidth last += this.includeRowDetails ? this.gridViewRowDetailsWidth : 0 const placeholderPositions = {} this.visibleFields.forEach((field) => { last += this.getFieldWidth(field.id) placeholderPositions[field.id] = last }) return placeholderPositions }, placeholderWidth() { let width = this.visibleFields.reduce( (value, field) => this.getFieldWidth(field.id) + value, 0 ) width += this.groupByWidth if (this.includeRowDetails) { width += this.gridViewRowDetailsWidth } return width }, }, beforeCreate() { this.$options.computed = { ...(this.$options.computed || {}), ...mapGetters({ placeholderHeight: this.$options.propsData.storePrefix + 'view/grid/getPlaceholderHeight', activeGroupBys: this.$options.propsData.storePrefix + 'view/grid/getActiveGroupBys', }), } }, } </script>