<template>
  <div
    class="grid-view__rows"
    :style="{
      transform: `translateY(${rowsTop}px) translateX(${leftOffset}px)`,
    }"
  >
    <GridViewRow
      v-for="row in rows"
      :key="`row-${row.id}`"
      :row="row"
      :fields="fields"
      :all-fields="allFields"
      :field-widths="fieldWidths"
      :include-row-details="includeRowDetails"
      :decorations="augmentedDecorations"
      :read-only="readOnly"
      :can-drag="view.sortings.length === 0"
      :store-prefix="storePrefix"
      v-on="$listeners"
    />
  </div>
</template>

<script>
import { mapGetters } from 'vuex'

import GridViewRow from '@baserow/modules/database/components/view/grid/GridViewRow'
import gridViewHelpers from '@baserow/modules/database/mixins/gridViewHelpers'

export default {
  name: 'GridViewRows',
  components: { GridViewRow },
  mixins: [gridViewHelpers],
  props: {
    fields: {
      type: Array,
      required: true,
    },
    allFields: {
      type: Array,
      required: true,
    },
    leftOffset: {
      type: Number,
      required: false,
      default: 0,
    },
    view: {
      type: Object,
      required: true,
    },
    includeRowDetails: {
      type: Boolean,
      required: false,
      default: () => false,
    },
    readOnly: {
      type: Boolean,
      required: true,
    },
  },
  computed: {
    fieldWidths() {
      const fieldWidths = {}
      this.allFields.forEach((field) => {
        fieldWidths[field.id] = this.getFieldWidth(field.id)
      })
      return fieldWidths
    },
    augmentedDecorations() {
      return this.view.decorations
        .filter(({ value_provider: valPro }) => valPro)
        .map((decoration) => {
          const deco = { decoration }

          deco.decorationType = this.$registry.get(
            'viewDecorator',
            decoration.type
          )

          deco.component = deco.decorationType.getComponent()
          deco.place = deco.decorationType.getPlace()

          deco.valueProviderType = this.$registry.get(
            'decoratorValueProvider',
            decoration.value_provider
          )
          deco.propsFn = (row) => {
            return {
              value: deco.valueProviderType.getValue({
                row,
                fields: this.allFields,
                options: decoration.value_provider_conf,
              }),
            }
          }

          return deco
        })
        .filter(
          ({ decorationType }) =>
            !decorationType.isDeactivated({ view: this.view })
        )
    },
  },
  beforeCreate() {
    this.$options.computed = {
      ...(this.$options.computed || {}),
      ...mapGetters({
        rows: this.$options.propsData.storePrefix + 'view/grid/getRows',
        rowsTop: this.$options.propsData.storePrefix + 'view/grid/getRowsTop',
      }),
    }
  },
}
</script>