File size: 2,478 Bytes
4d70170
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
<script lang="ts">
import type { PropType } from 'vue'
import { computed, defineComponent, useAttrs } from 'vue'
import { useDisabledChild } from '../composables/useDisabled'

export default defineComponent({
  props: {
    iconLeft: {
      type: String,
      default: '',
    },
    iconRight: {
      type: String,
      default: '',
    },
    label: {
      type: String,
      default: '',
    },
    loading: Boolean,
    loadingSecondary: Boolean,
    type: {
      type: String as PropType<'button' | 'submit' | 'reset'>,
      default: 'button',
    },
    tag: {
      type: [String, Number],
      default: null,
    },
    disabled: {
      type: Boolean,
      default: false,
    },
  },
  emits: ['click'],
  setup(props, { emit }) {
    const attrs = useAttrs()
    const { finalDisabled } = useDisabledChild(props)
    const component = computed(() => {
      if (attrs.to) {
        return 'router-link'
      }
      else if (attrs.href) {
        return 'a'
      }
      else {
        return 'button'
      }
    })
    const ghost = computed(() => {
      return finalDisabled.value || props.loading || props.loadingSecondary
    })
    const handleClick = (event: MouseEvent) => {
      if (ghost.value) {
        event.preventDefault()
        event.stopPropagation()
        event.stopImmediatePropagation()
      }
      else {
        emit('click', event)
      }
    }
    return {
      attrs,
      component,
      ghost,
      handleClick,
    }
  },
})
</script>

<template>
  <component
    :is="component"
    class="vue-ui-button"
    :class="[
      component,
      {
        loading,
        ghost,
      },
    ]"
    :type="type"
    :tabindex="ghost ? -1 : 0"
    role="button"
    :aria-disabled="ghost ? true : null"
    @click.capture="handleClick"
  >
    <VueLoadingIndicator v-if="loading" />

    <span class="content">
      <VueLoadingIndicator
        v-if="loadingSecondary"
        class="inline small loading-secondary"
      />
      <VueIcon
        v-else-if="iconLeft"
        :icon="iconLeft"
        class="button-icon left"
      />

      <span class="default-slot">
        <slot>
          {{ label }}
        </slot>
      </span>

      <div
        v-if="tag != null"
        class="tag-wrapper"
      >
        <div class="tag">{{ tag }}</div>
      </div>

      <VueIcon
        v-if="iconRight"
        :icon="iconRight"
        class="button-icon right"
      />
    </span>
  </component>
</template>