aboutsummaryrefslogtreecommitdiff
path: root/src/components/tab_switcher/tab_switcher.js
blob: e0d4572ca7365ded6e33d33c1bf4ab26a1f05404 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import Vue from 'vue'

import './tab_switcher.scss'

export default Vue.component('tab-switcher', {
  name: 'TabSwitcher',
  props: ['renderOnlyFocused', 'onSwitch', 'customActive'],
  data () {
    return {
      active: this.$slots.default.findIndex(_ => _.tag)
    }
  },
  beforeUpdate () {
    const currentSlot = this.$slots.default[this.active]
    if (!currentSlot.tag) {
      this.active = this.$slots.default.findIndex(_ => _.tag)
    }
  },
  methods: {
    activateTab (index) {
      return () => {
        if (typeof this.onSwitch === 'function') {
          this.onSwitch.call(null, this.$slots.default[index].key)
        }
        this.active = index
      }
    },
    isActiveTab (index) {
      const customActiveIndex = this.$slots.default.findIndex(slot => {
        const dataFilter = slot.data && slot.data.attrs && slot.data.attrs['data-filter']
        return this.customActive && this.customActive === dataFilter
      })

      return customActiveIndex > -1 ? customActiveIndex === index : index === this.active
    }
  },
  render (h) {
    const tabs = this.$slots.default
      .map((slot, index) => {
        if (!slot.tag) return
        const classesTab = ['tab']
        const classesWrapper = ['tab-wrapper']

        if (this.isActiveTab(index)) {
          classesTab.push('active')
          classesWrapper.push('active')
        }
        if (slot.data.attrs.image) {
          return (
            <div class={ classesWrapper.join(' ')}>
              <button
                disabled={slot.data.attrs.disabled}
                onClick={this.activateTab(index)}
                class={classesTab.join(' ')}>
                <img src={slot.data.attrs.image} title={slot.data.attrs['image-tooltip']}/>
                {slot.data.attrs.label ? '' : slot.data.attrs.label}
              </button>
            </div>
          )
        }
        return (
          <div class={ classesWrapper.join(' ')}>
            <button
              disabled={slot.data.attrs.disabled}
              onClick={this.activateTab(index)}
              class={classesTab.join(' ')}>
              {slot.data.attrs.label}</button>
          </div>
        )
      })

    const contents = this.$slots.default.map((slot, index) => {
      if (!slot.tag) return
      const active = index === this.active
      if (this.renderOnlyFocused) {
        return active
          ? <div class="active">{slot}</div>
          : <div class="hidden"></div>
      }
      return <div class={active ? 'active' : 'hidden' }>{slot}</div>
    })

    return (
      <div class="tab-switcher">
        <div class="tabs">
          {tabs}
        </div>
        <div class="contents">
          {contents}
        </div>
      </div>
    )
  }
})