<template>
  <div class="control">
    <label class="control__label">
      <a
        :class="{ 'row-modal__field-item-handle': sortable }"
        data-field-handle
      ></a>
      <i class="control__label-icon" :class="field._.type.iconClass"></i>
      {{ field.name }}
      <span v-if="field.description" class="margin-left-1">
        <HelpIcon
          :tooltip="descriptionText"
          :tooltip-duration="3"
          :tooltip-content-type="'html'"
          :tooltip-content-classes="'tooltip__content--expandable'"
          :icon="'info-empty'"
        />
      </span>
      <i
        v-if="!readOnly && canModifyFields"
        ref="contextLink"
        class="control__context baserow-icon-more-vertical"
        @click="$refs.context.toggle($refs.contextLink, 'bottom', 'left', 0)"
      ></i>
    </label>
    <FieldContext
      ref="context"
      :database="database"
      :table="table"
      :view="view"
      :field="field"
      :all-fields-in-table="allFieldsInTable"
      @update="$emit('field-updated', $event)"
      @delete="$emit('field-deleted')"
    >
      <li v-if="canBeHidden" class="context__menu-item">
        <a
          class="context__menu-item-link"
          @click="$emit('toggle-field-visibility', { field })"
        >
          <i
            class="context__menu-item-icon"
            :class="[hidden ? 'iconoir-eye-empty' : 'iconoir-eye-off']"
          ></i>
          {{ $t(hidden ? 'fieldContext.showField' : 'fieldContext.hideField') }}
        </a>
      </li>
    </FieldContext>
    <component
      :is="getFieldComponent(field.type)"
      ref="field"
      :workspace-id="database.workspace.id"
      :field="field"
      :value="row['field_' + field.id]"
      :read-only="readOnly"
      :row-is-created="!!row.id"
      @update="update"
      @refresh-row="$emit('refresh-row', row)"
    />
  </div>
</template>

<script>
import FieldContext from '@baserow/modules/database/components/field/FieldContext'

export default {
  name: 'RowEditModalField',
  components: { FieldContext },
  props: {
    database: {
      type: Object,
      required: true,
    },
    table: {
      type: Object,
      required: true,
    },
    view: {
      type: [Object, null],
      required: false,
      default: null,
    },
    field: {
      type: Object,
      required: true,
    },
    sortable: {
      type: Boolean,
      default: false,
    },
    canModifyFields: {
      type: Boolean,
      required: false,
      default: true,
    },
    canBeHidden: {
      type: Boolean,
      required: false,
      default: true,
    },
    hidden: {
      type: Boolean,
      required: false,
      default: false,
    },
    row: {
      type: Object,
      required: true,
    },
    readOnly: {
      type: Boolean,
      required: true,
    },
    allFieldsInTable: {
      type: Array,
      required: true,
    },
    rowIsCreated: {
      type: Boolean,
      required: false,
      default: () => true,
    },
  },
  computed: {
    descriptionText() {
      return (this.field.description || '').replaceAll('\n', '<br/>')
    },
  },
  methods: {
    getFieldComponent(type) {
      return this.$registry
        .get('field', type)
        .getRowEditFieldComponent(this.field)
    },
    update(value, oldValue) {
      this.$emit('update', {
        row: this.row,
        field: this.field,
        value,
        oldValue,
      })
    },
  },
}
</script>