TabbycatDebate/tabbycat

View on GitHub
tabbycat/templates/allocations/DragAndDropActions.vue

Summary

Maintainability
Test Coverage
<template>

    <nav class="navbar navbar-default navbar-light fixed-top px-2">

      <div class="btn-toolbar" role="toolbar" aria-label="Toolbar with button groups">
        <div class="btn-group btn-group-sm">
          <a :href="extra.backUrl" class="btn btn-outline-primary"
             data-toggle="tooltip" data-placement="bottom" :title="extra.backLabel">
            <i data-feather="chevron-left"></i>
          </a>
          <auto-save-counter></auto-save-counter>
          <slot name="extra-actions"></slot>
          <button v-if="prioritise" @click="$emit('show-prioritise')"
                  :class="['btn btn-outline-primary', count > 0 ? '' : 'disabled btn-no-hover']"
                  v-text="gettext('Prioritise')"></button>
          <button v-if="allocate" @click="$emit('show-allocate')"
                  :class="['btn btn-outline-primary', count > 0 ? '' : 'disabled btn-no-hover']"
                  v-text="gettext('Allocate')"></button>
          <button v-if="shard" @click="$emit('show-shard')"
                  :class="['btn ', count > 0 ? '' : 'disabled btn-no-hover',
                                   shardingEnabled ? 'btn-primary' : 'btn-outline-primary']" >
            <i data-feather="server"></i>
          </button>
        </div>
        <div class="dropdown">
          <button class="btn btn-sm ml-2 btn-outline-primary dropdown-toggle"
                  data-toggle="dropdown" id="dropdownMenuOffset" title="Sort the draw">
            <i data-feather="list"></i>
          </button>
          <div class="dropdown-menu" aria-labelledby="dropdownMenuOffset">
            <a class="dropdown-item" href="#" @click="setSorting('room_rank')">
              <span v-if="isElimination" >Sort by Break Rank</span>
              <span v-if="!isElimination" >Sort by Room Rank</span>
            </a>
            <a v-if="!isElimination" class="dropdown-item" href="#" @click="setSorting('bracket')">
              Sort by Bracket
            </a>
            <a class="dropdown-item" href="#" @click="setSorting('importance')">
              Sort by Importance
            </a>
            <a v-if="!isElimination" class="dropdown-item" href="#" @click="setSorting('liveness')">
              Sort by Liveness
            </a>
          </div>
        </div>
      </div>

      <div class="btn-group btn-group-sm">
        <button class="btn btn-outline-secondary disabled d-xl-inline d-none"
                data-toggle="tooltip" :title="('Key for the color highlights.')">
          <i data-feather="help-circle"></i>
        </button>
        <template v-if="!currentHighlightKey">
          <slot name="default-highlights"></slot>
          <button class="btn btn-dark" v-text="gettext('Unavailable')" data-toggle="tooltip"
                :title="('Has not been marked as available for this round or has been allocated twice.')"></button>
        </template>
        <template v-else>
          <button v-for="option in highlights[currentHighlightKey].options"
                  :class="['btn btn-primary border-0', currentHighlightKey + '-display', option.css]">
            {{ option.fields.name }}
          </button>
        </template>
      </div>

      <div class="btn-group btn-group-sm">
        <button v-for="(highlight, highlightKey) in highlights"
                @click="toggleHighlight(highlightKey)"
                :class="['btn btn-outline-primary', highlight.active ? 'btn-primary active' : '']">
          <span :class="highlight.active ? 'd-none' : ''"><i data-feather="eye"></i></span>
          <span :class="highlight.active ? '' : 'd-none'"><i data-feather="eye-off"></i></span>
          <span class="pl-1" v-text="gettext(titleCase(highlightKey))"></span>
        </button>
      </div>

    </nav>

</template>

<script>
import { mapMutations, mapState } from 'vuex'

import AutoSaveCounter from './AutoSaveCounter.vue'

export default {
  components: { AutoSaveCounter },
  props: ['prioritise', 'allocate', 'shard', 'count'],
  methods: {
    titleCase: function (title) {
      return title.charAt(0).toUpperCase() + title.substr(1)
    },
    ...mapMutations(['toggleHighlight', 'setSorting']),
  },
  computed: {
    isElimination: function () {
      return this.$store.state.round.stage === 'E'
    },
    currentHighlightKey: function () {
      const currentKey = Object.keys(this.highlights).filter(key => this.highlights[key].active)
      if (currentKey.length > 0) {
        return currentKey[0]
      }
      return false
    },
    shardingEnabled: function () {
      return this.$store.state.sharding.index !== null
    },
    ...mapState(['highlights', 'extra']),
  },
}
</script>