element-plus
Version:
A Component Library for Vue 3
1 lines • 9.44 kB
Source Map (JSON)
{"version":3,"file":"useCheckbox.mjs","sources":["../../../../../../packages/components/checkbox/src/useCheckbox.ts"],"sourcesContent":["import { ref, computed, inject, getCurrentInstance, watch } from 'vue'\nimport { toTypeString } from '@vue/shared'\nimport { UPDATE_MODEL_EVENT } from '@element-plus/utils/constants'\nimport { useGlobalConfig } from '@element-plus/utils/util'\nimport { elFormKey, elFormItemKey } from '@element-plus/tokens'\n\nimport type { ExtractPropTypes } from 'vue'\nimport type { ElFormContext, ElFormItemContext } from '@element-plus/tokens'\nimport type { PartialReturnType } from '@element-plus/utils/types'\nimport type { ICheckboxGroupInstance } from './checkbox.type'\n\nexport const useCheckboxProps = {\n modelValue: {\n type: [Boolean, Number, String],\n default: () => undefined,\n },\n label: {\n type: [String, Boolean, Number, Object],\n },\n indeterminate: Boolean,\n disabled: Boolean,\n checked: Boolean,\n name: {\n type: String,\n default: undefined,\n },\n trueLabel: {\n type: [String, Number],\n default: undefined,\n },\n falseLabel: {\n type: [String, Number],\n default: undefined,\n },\n tabindex: [String, Number],\n size: String,\n}\n\nexport type IUseCheckboxProps = ExtractPropTypes<typeof useCheckboxProps>\n\nexport const useCheckboxGroup = () => {\n const ELEMENT = useGlobalConfig()\n const elForm = inject(elFormKey, {} as ElFormContext)\n const elFormItem = inject(elFormItemKey, {} as ElFormItemContext)\n const checkboxGroup = inject<ICheckboxGroupInstance>('CheckboxGroup', {})\n const isGroup = computed(\n () => checkboxGroup && checkboxGroup?.name === 'ElCheckboxGroup'\n )\n const elFormItemSize = computed(() => {\n return elFormItem.size\n })\n return {\n isGroup,\n checkboxGroup,\n elForm,\n ELEMENT,\n elFormItemSize,\n elFormItem,\n }\n}\n\nconst useModel = (props: IUseCheckboxProps) => {\n const selfModel = ref(false)\n const { emit } = getCurrentInstance()\n const { isGroup, checkboxGroup } = useCheckboxGroup()\n const isLimitExceeded = ref(false)\n const store = computed(() =>\n checkboxGroup ? checkboxGroup.modelValue?.value : props.modelValue\n )\n const model = computed({\n get() {\n return isGroup.value ? store.value : props.modelValue ?? selfModel.value\n },\n\n set(val: unknown) {\n if (isGroup.value && Array.isArray(val)) {\n isLimitExceeded.value =\n checkboxGroup.max !== undefined &&\n val.length > checkboxGroup.max.value\n isLimitExceeded.value === false && checkboxGroup?.changeEvent?.(val)\n } else {\n emit(UPDATE_MODEL_EVENT, val)\n selfModel.value = val as boolean\n }\n },\n })\n\n return {\n model,\n isLimitExceeded,\n }\n}\n\nconst useCheckboxStatus = (\n props: IUseCheckboxProps,\n { model }: PartialReturnType<typeof useModel>\n) => {\n const { isGroup, checkboxGroup, elFormItemSize, ELEMENT } = useCheckboxGroup()\n const focus = ref(false)\n const size = computed<string | undefined>(\n () =>\n checkboxGroup?.checkboxGroupSize?.value ||\n elFormItemSize.value ||\n ELEMENT.size\n )\n const isChecked = computed<boolean>(() => {\n const value = model.value\n if (toTypeString(value) === '[object Boolean]') {\n return value\n } else if (Array.isArray(value)) {\n return value.includes(props.label)\n } else if (value !== null && value !== undefined) {\n return value === props.trueLabel\n } else {\n return !!value\n }\n })\n const checkboxSize = computed(() => {\n const temCheckboxSize = props.size || elFormItemSize.value || ELEMENT.size\n return isGroup.value\n ? checkboxGroup?.checkboxGroupSize?.value || temCheckboxSize\n : temCheckboxSize\n })\n\n return {\n isChecked,\n focus,\n size,\n checkboxSize,\n }\n}\n\nconst useDisabled = (\n props: IUseCheckboxProps,\n {\n model,\n isChecked,\n }: PartialReturnType<typeof useModel> &\n PartialReturnType<typeof useCheckboxStatus>\n) => {\n const { elForm, isGroup, checkboxGroup } = useCheckboxGroup()\n const isLimitDisabled = computed(() => {\n const max = checkboxGroup.max?.value\n const min = checkboxGroup.min?.value\n return (\n (!!(max || min) && model.value.length >= max && !isChecked.value) ||\n (model.value.length <= min && isChecked.value)\n )\n })\n const isDisabled = computed(() => {\n const disabled = props.disabled || elForm.disabled\n return isGroup.value\n ? checkboxGroup.disabled?.value || disabled || isLimitDisabled.value\n : props.disabled || elForm.disabled\n })\n\n return {\n isDisabled,\n isLimitDisabled,\n }\n}\n\nconst setStoreValue = (\n props: IUseCheckboxProps,\n { model }: PartialReturnType<typeof useModel>\n) => {\n function addToStore() {\n if (Array.isArray(model.value) && !model.value.includes(props.label)) {\n model.value.push(props.label)\n } else {\n model.value = props.trueLabel || true\n }\n }\n props.checked && addToStore()\n}\n\nconst useEvent = (\n props: IUseCheckboxProps,\n { isLimitExceeded }: PartialReturnType<typeof useModel>\n) => {\n const { elFormItem } = useCheckboxGroup()\n const { emit } = getCurrentInstance()\n function handleChange(e: InputEvent) {\n if (isLimitExceeded.value) return\n const target = e.target as HTMLInputElement\n const value = target.checked\n ? props.trueLabel ?? true\n : props.falseLabel ?? false\n\n emit('change', value, e)\n }\n\n watch(\n () => props.modelValue,\n () => {\n elFormItem.validate?.('change')\n }\n )\n\n return {\n handleChange,\n }\n}\n\nexport const useCheckbox = (props: IUseCheckboxProps) => {\n const { model, isLimitExceeded } = useModel(props)\n const { focus, size, isChecked, checkboxSize } = useCheckboxStatus(props, {\n model,\n })\n const { isDisabled } = useDisabled(props, { model, isChecked })\n const { handleChange } = useEvent(props, { isLimitExceeded })\n\n setStoreValue(props, { model })\n\n return {\n isChecked,\n isDisabled,\n checkboxSize,\n model,\n handleChange,\n focus,\n size,\n }\n}\n"],"names":[],"mappings":"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"}