kui-vue
Version:
A high quality UI Toolkit built on Vue.js 2.0
83 lines (79 loc) • 2.4 kB
JSX
import { hasProp } from '../_tool/utils'
import Icon from '../icon'
import { Checkmark } from 'kui-icons'
export default {
name: "Checkbox",
props: {
value: [String, Number, Boolean],
disabled: Boolean,
label: { type: [String, Number] },
indeterminate: Boolean,
checked: [Boolean, Number],
size: {
default: 'default',
validator(value) {
return ["small", "large", "default"].indexOf(value) >= 0;
}
},
},
model: {
prop: 'checked',
// event: 'change'
},
inject: {
groupContext: { default: null },
},
data() {
const checked = hasProp(this, 'checked') ? this.checked : (this.checked === true && !this.indeterminate)
return {
isChecked: checked,
}
},
methods: {
change(e) {
let { disabled, value, $slots, label, groupContext } = this
if (disabled) {
return false;
}
const checked = e.target.checked;
this.isChecked = checked;
if (groupContext) {
label = label || $slots.default.text
this.groupContext.change({ label, value })
} else {
this.$emit("input", checked);
this.$emit("change", e);
}
}
},
render() {
let { disabled, change, $slots, size, label, groupContext, value, indeterminate, checked, isChecked } = this
if (groupContext) {
checked = groupContext.value?.indexOf(value) !== -1
disabled = disabled || groupContext.disabled
size = groupContext.size
} else {
if (!hasProp(this, 'checked')) {
checked = isChecked
}
}
const wpclasses = ["k-checkbox", {
["k-checkbox-disabled"]: disabled,
["k-checkbox-checked"]: checked && !indeterminate,
["k-checkbox-indeterminate"]: indeterminate,
["k-checkbox-sm"]: size == 'small',
["k-checkbox-lg"]: size == 'large'
}]
let inner = checked ? <Icon type={Checkmark} strokeWidth={60} /> : null
const labelNode = label || $slots.default
return (
<label class={wpclasses} onClick={e => e.stopPropagation()}>
<span class="k-checkbox-symbol">
<input type="checkbox" class="k-checkbox-input" checked={checked} disabled={disabled} onChange={change} />
<span class="k-checkbox-inner">{inner}</span>
</span>
{labelNode ? <span class="k-checkbox-label">{labelNode}</span> : null}
</label>
)
}
}