<template>
  <div class="grid-view__head">
    <div
      v-for="groupBy in includeGroupBy ? activeGroupBys : []"
      :key="'field-group-' + groupBy.field"
      class="grid-view__head-group"
      :style="{ width: groupBy.width + 'px' }"
      :set="(field = $options.methods.getField(allFieldsInTable, groupBy))"
    >
      <div class="grid-view__group-cell">
        <div class="grid-view__group-name">
          {{ field.name }}
        </div>
      </div>
    </div>
    <div
      v-if="includeRowDetails"
      class="grid-view__column grid-view__column--no-border-right"
      :style="{ width: gridViewRowDetailsWidth + 'px' }"
    >
      <GridViewRowIdentifierDropdown
        v-if="
          !readOnly &&
          $hasPermission(
            'database.table.view.update',
            view,
            database.workspace.id
          )
        "
        :row-identifier-type-selected="view.row_identifier_type"
        @change="onChangeIdentifierDropdown"
      ></GridViewRowIdentifierDropdown>
    </div>
    <GridViewFieldType
      v-for="field in visibleFields"
      :key="'field-type-' + field.id"
      :database="database"
      :table="table"
      :view="view"
      :field="field"
      :all-fields-in-table="allFieldsInTable"
      :filters="view.filters"
      :include-field-width-handles="includeFieldWidthHandles"
      :read-only="readOnly"
      :store-prefix="storePrefix"
      @refresh="$emit('refresh', $event)"
      @dragging="$emit('dragging', $event)"
      @field-created="$emit('field-created', $event)"
      @move-field="moveField"
    ></GridViewFieldType>
    <div
      v-if="
        includeAddField &&
        !readOnly &&
        $hasPermission(
          'database.table.create_field',
          table,
          database.workspace.id
        )
      "
      class="grid-view__column"
      :style="{ width: 100 + 'px' }"
    >
      <a
        ref="createFieldContextLink"
        class="grid-view__add-column"
        @click="$refs.createFieldContext.toggle($refs.createFieldContextLink)"
      >
        <i class="grid-view__add-column-icon iconoir-plus"></i>
      </a>
      <CreateFieldContext
        ref="createFieldContext"
        :table="table"
        :view="view"
        :all-fields-in-table="allFieldsInTable"
        :database="database"
        @field-created="$emit('field-created', $event)"
        @field-created-callback-done="afterFieldCreatedUpdateFieldOptions"
        @shown="onShownCreateFieldContext"
      ></CreateFieldContext>
    </div>
  </div>
</template>

<script>
import { notifyIf } from '@baserow/modules/core/utils/error'
import CreateFieldContext from '@baserow/modules/database/components/field/CreateFieldContext'
import GridViewFieldType from '@baserow/modules/database/components/view/grid/GridViewFieldType'
import gridViewHelpers from '@baserow/modules/database/mixins/gridViewHelpers'
import viewHelpers from '@baserow/modules/database/mixins/viewHelpers'
import GridViewRowIdentifierDropdown from '@baserow/modules/database/components/view/grid/GridViewRowIdentifierDropdown'

export default {
  name: 'GridViewHead',
  components: {
    GridViewRowIdentifierDropdown,
    GridViewFieldType,
    CreateFieldContext,
  },
  mixins: [gridViewHelpers, viewHelpers],
  props: {
    visibleFields: {
      type: Array,
      required: true,
    },
    database: {
      type: Object,
      required: true,
    },
    table: {
      type: Object,
      required: true,
    },
    view: {
      type: Object,
      required: true,
    },
    allFieldsInTable: {
      type: Array,
      required: true,
    },
    includeFieldWidthHandles: {
      type: Boolean,
      required: false,
      default: () => false,
    },
    includeRowDetails: {
      type: Boolean,
      required: false,
      default: () => false,
    },
    includeGroupBy: {
      type: Boolean,
      required: false,
      default: () => false,
    },
    includeAddField: {
      type: Boolean,
      required: false,
      default: () => false,
    },
    includeGridViewIdentifierDropdown: {
      type: Boolean,
      required: false,
      default: () => false,
    },
    readOnly: {
      type: Boolean,
      required: true,
    },
  },
  methods: {
    /**
     * After newField is created pressing "insert left" or "insert right" button,
     * we need to move the newField into the correct order position.
     * Also necessary when we duplicate a field.
     * This function move the field thanks to the store.
     **/
    async moveField({
      position,
      newField,
      fromField,
      undoRedoActionGroupId = null,
    }) {
      try {
        await this.$store.dispatch(
          `${this.storePrefix}view/grid/updateSingleFieldOptionOrder`,
          {
            fieldToMove: newField,
            position,
            fromField,
            undoRedoActionGroupId,
            readOnly: this.readOnly,
          }
        )
      } catch (error) {
        notifyIf(error, 'view')
      }
    },
    async onChangeIdentifierDropdown(rowIdentifierType) {
      try {
        await this.$store.dispatch('view/update', {
          view: this.view,
          values: { row_identifier_type: rowIdentifierType },
        })
      } catch (error) {
        notifyIf(error, 'view')
      }
    },
    onShownCreateFieldContext() {
      this.$refs.createFieldContext.showFieldTypesDropdown(this.$el)
    },
    getField(allFieldsInTable, groupBy) {
      const field = allFieldsInTable.find((f) => f.id === groupBy.field)
      return field
    },
  },
}
</script>