import type { PropType, VNode } from 'vue' import type { CheckboxGroupContext } from './context' import { computed, defineComponent, inject, ref, watch } from 'vue' import { getPrefixCls } from '../_utils/getPrefixCls' import Icon from '../icon/index' import { checkboxGroupKey } from './context' export default defineComponent({ name: 'Checkbox', props: { modelValue: { type: Boolean, default: undefined, }, checked: { type: Boolean, default: undefined, }, value: { type: [String, Number, Boolean] as PropType, default: true, }, indeterminate: { type: Boolean, default: false, }, defaultChecked: { type: Boolean, default: false, }, disabled: { type: Boolean, default: false, }, type: { type: String as PropType<'default' | 'card' | 'pureCard'>, default: 'default', }, extra: { type: [String, Object, Function] as unknown as () => string | VNode | (() => VNode), default: '', }, class: { type: [String, Array, Object], default: '', }, style: { type: Object, default: () => ({}), }, }, emits: ['update:modelValue', 'update:checked', 'change'], setup(props, { slots, emit }) { const prefixCls = getPrefixCls('checkbox') const checkboxGroupCtx = inject(checkboxGroupKey, undefined) const inGroup = computed(() => !!checkboxGroupCtx) const isDisabled = computed(() => props.disabled || checkboxGroupCtx?.disabled) const _checked = ref(props.defaultChecked) const mergedType = computed(() => props.type || checkboxGroupCtx?.type || 'default', ) const isChecked = computed(() => { if (inGroup.value && checkboxGroupCtx) { const groupValue = checkboxGroupCtx.value if (Array.isArray(groupValue)) { return groupValue.includes(props.value) } return groupValue === props.value } return props.checked ?? props.modelValue ?? _checked.value }) const handleClick = (event: Event) => { if (isDisabled.value) { return } if (inGroup.value && checkboxGroupCtx) { checkboxGroupCtx.handleChange(props.value, event) } else { const newChecked = !isChecked.value if (props.checked === undefined) _checked.value = newChecked emit('update:modelValue', newChecked) emit('update:checked', newChecked) } emit('change', { value: props.value, event }) } watch(() => props.checked, (val) => { if (val !== undefined) { _checked.value = val } }) const renderDefault = () => ( ) const renderCard = () => ( ) const renderPureCard = () => ( ) return () => { switch (mergedType.value) { case 'card': return renderCard() case 'pureCard': return renderPureCard() default: return renderDefault() } } }, })