<template>
  <li class="tree-sub" :class="{ active: table._.selected }">
    <nuxt-link
      :to="{
        name: 'database-table',
        params: {
          id: database.id,
          tableId: table.id
        }
      }"
      class="tree-sub-link"
    >
      <Editable
        ref="rename"
        :value="table.name"
        @change="renameTable(database, table, $event)"
      ></Editable>
    </nuxt-link>
    <a
      v-show="!database._.loading"
      class="tree-options"
      @click="$refs.context.toggle($event.currentTarget, 'bottom', 'right', 0)"
    >
      <i class="fas fa-ellipsis-v"></i>
    </a>
    <Context ref="context">
      <div class="context-menu-title">{{ table.name }}</div>
      <ul class="context-menu">
        <li>
          <a @click="enableRename()">
            <i class="context-menu-icon fas fa-fw fa-pen"></i>
            Rename
          </a>
        </li>
        <li>
          <a @click="deleteTable(database, table)">
            <i class="context-menu-icon fas fa-fw fa-trash"></i>
            Delete
          </a>
        </li>
      </ul>
    </Context>
  </li>
</template>

<script>
export default {
  name: 'SidebarItem',
  props: {
    database: {
      type: Object,
      required: true
    },
    table: {
      type: Object,
      required: true
    }
  },
  methods: {
    setLoading(database, value) {
      this.$store.dispatch('application/setItemLoading', {
        application: database,
        value
      })
    },
    deleteTable(database, table) {
      this.$refs.context.hide()
      this.setLoading(database, true)

      this.$store.dispatch('table/delete', { database, table }).then(() => {
        this.setLoading(database, false)
      })
    },
    enableRename() {
      this.$refs.context.hide()
      this.$refs.rename.edit()
    },
    renameTable(database, table, event) {
      this.setLoading(database, true)

      this.$store
        .dispatch('table/update', {
          database,
          table,
          values: {
            name: event.value
          }
        })
        .catch(() => {
          // If something is going wrong we will reset the original value.
          this.$refs.rename.set(event.oldValue)
        })
        .then(() => {
          this.setLoading(database, false)
        })
    }
  }
}
</script>