@coreui/vue-pro
Version:
UI Components Library for Vue.js
82 lines (78 loc) • 2.35 kB
JavaScript
var vue = require('vue');
var CButton = require('../button/CButton.js');
var CSpinner = require('../spinner/CSpinner.js');
const CLoadingButton = vue.defineComponent({
name: 'CLoadingButton',
props: {
/**
* Makes button disabled when loading.
*/
disabledOnLoading: Boolean,
/**
* Loading state (set to true to start animation).
*/
loading: {
type: Boolean,
default: false,
required: false,
},
/**
* Sets type of spinner.
*
* @values 'border', 'grow'
* @default 'border'
*/
spinnerType: {
type: String,
default: 'border',
required: false,
validator: (value) => {
return ['border', 'grow'].includes(value);
},
},
/**
* Automatically starts loading animation and stops after a determined amount of milliseconds.
*/
timeout: {
type: Number,
default: undefined,
required: false,
},
...CButton.CButton.props,
},
emits: [
/**
* Event called when the user clicks on a component.
*/
'click',
],
setup(props, { emit, slots }) {
const loading = vue.ref(props.loading);
vue.watch(() => props.loading, () => {
loading.value = props.loading;
});
const handleOnClick = () => {
emit('click');
if (props.timeout) {
loading.value = true;
setTimeout(() => {
loading.value = false;
}, props.timeout);
}
};
return () => vue.h(CButton.CButton, {
...props,
class: ['btn-loading', { ['is-loading']: loading.value }],
...(props.disabledOnLoading && loading.value && { disabled: true }),
onClick: () => handleOnClick(),
}, {
default: () => [
vue.h(CSpinner.CSpinner, { class: 'btn-loading-spinner', size: 'sm', variant: props.spinnerType }),
slots.default && slots.default(),
],
});
},
});
exports.CLoadingButton = CLoadingButton;
//# sourceMappingURL=CLoadingButton.js.map
;