mirror of
https://github.com/crater-invoice/crater.git
synced 2025-10-28 04:01:10 -04:00
196 lines
3.7 KiB
Vue
196 lines
3.7 KiB
Vue
<template>
|
|
<button
|
|
:type="type"
|
|
:class="btnClass"
|
|
:disabled="disabled || loading"
|
|
@click="handleClick"
|
|
>
|
|
<font-awesome-icon
|
|
v-if="icon && !loading && !rightIcon"
|
|
:class="iconClass"
|
|
:icon="icon"
|
|
class="vue-icon icon-left"
|
|
/>
|
|
<font-awesome-icon
|
|
v-if="loading"
|
|
:class="iconClass"
|
|
icon="spinner"
|
|
class="fa-spin"
|
|
/>
|
|
<slot />
|
|
<font-awesome-icon
|
|
v-if="icon && !loading && rightIcon"
|
|
:class="iconClass"
|
|
:icon="icon"
|
|
class="vue-icon icon-right"
|
|
/>
|
|
</button>
|
|
</template>
|
|
|
|
<script>
|
|
|
|
export default {
|
|
props: {
|
|
icon: {
|
|
type: String,
|
|
required: false,
|
|
default: ''
|
|
},
|
|
color: {
|
|
type: String,
|
|
required: false,
|
|
default: ''
|
|
},
|
|
round: {
|
|
type: Boolean,
|
|
required: false,
|
|
default: false
|
|
},
|
|
outline: {
|
|
type: Boolean,
|
|
required: false,
|
|
default: false
|
|
},
|
|
size: {
|
|
type: String,
|
|
required: false,
|
|
default: 'default'
|
|
},
|
|
loading: {
|
|
type: Boolean,
|
|
required: false,
|
|
default: false
|
|
},
|
|
block: {
|
|
type: Boolean,
|
|
required: false,
|
|
default: false
|
|
},
|
|
iconButton: {
|
|
type: Boolean,
|
|
required: false,
|
|
default: false
|
|
},
|
|
disabled: {
|
|
type: Boolean,
|
|
required: false,
|
|
default: false
|
|
},
|
|
rightIcon: {
|
|
type: Boolean,
|
|
required: false,
|
|
default: false
|
|
},
|
|
type: {
|
|
type: String,
|
|
required: false,
|
|
default: 'button'
|
|
}
|
|
},
|
|
computed: {
|
|
btnClass () {
|
|
if (this.isCustomStyle) {
|
|
return ''
|
|
}
|
|
|
|
let btnClass = 'base-button '
|
|
|
|
switch (this.color) {
|
|
case 'success':
|
|
if (this.outline) {
|
|
btnClass += `btn btn-outline-success `
|
|
} else {
|
|
btnClass += `btn btn-success `
|
|
}
|
|
break
|
|
|
|
case 'danger':
|
|
if (this.outline) {
|
|
btnClass += `btn btn-outline-danger `
|
|
} else {
|
|
btnClass += `btn btn-danger `
|
|
}
|
|
break
|
|
|
|
case 'warning':
|
|
if (this.outline) {
|
|
btnClass += `btn btn-outline-warning `
|
|
} else {
|
|
btnClass += `btn btn-warning `
|
|
}
|
|
break
|
|
|
|
case 'info':
|
|
if (this.outline) {
|
|
btnClass += `btn btn-outline-info `
|
|
} else {
|
|
btnClass += `btn btn-info `
|
|
}
|
|
break
|
|
|
|
case 'theme':
|
|
if (this.outline) {
|
|
btnClass += `btn btn-outline-primary `
|
|
} else {
|
|
btnClass += `btn btn-primary `
|
|
}
|
|
break
|
|
|
|
case 'theme-light':
|
|
if (this.outline) {
|
|
btnClass += `btn btn-outline-light `
|
|
} else {
|
|
btnClass += `btn btn-light `
|
|
}
|
|
break
|
|
|
|
default:
|
|
if (this.outline) {
|
|
btnClass += `btn btn-outline-dark `
|
|
} else {
|
|
btnClass += `btn btn-dark `
|
|
}
|
|
break
|
|
}
|
|
|
|
switch (this.size) {
|
|
case 'large':
|
|
btnClass += 'btn-lg '
|
|
break
|
|
|
|
case 'small':
|
|
btnClass += 'btn-sm '
|
|
break
|
|
|
|
default:
|
|
btnClass += 'default-size '
|
|
}
|
|
|
|
if (this.block) {
|
|
btnClass += 'btn-block '
|
|
}
|
|
|
|
if (this.disabled) {
|
|
btnClass += ' btn-cursor-not-allowed'
|
|
}
|
|
|
|
return btnClass
|
|
},
|
|
iconClass () {
|
|
if (this.loading || !this.iconButton) {
|
|
if (this.rightIcon) {
|
|
return 'ml-2'
|
|
}
|
|
return 'mr-2'
|
|
}
|
|
return 'icon-button'
|
|
}
|
|
},
|
|
methods: {
|
|
handleClick (e) {
|
|
this.$emit('click')
|
|
}
|
|
}
|
|
}
|
|
</script>
|