UNPKG

element-plus

Version:

A Component Library for Vue 3

1 lines 9.13 kB
{"version":3,"file":"switch2.mjs","sources":["../../../../../../packages/components/switch/src/switch.vue"],"sourcesContent":["<template>\n <div\n :class=\"switchKls\"\n role=\"switch\"\n :aria-checked=\"checked\"\n :aria-disabled=\"switchDisabled\"\n @click.prevent=\"switchValue\"\n >\n <input\n :id=\"id\"\n ref=\"input\"\n :class=\"ns.e('input')\"\n type=\"checkbox\"\n :name=\"name\"\n :true-value=\"activeValue\"\n :false-value=\"inactiveValue\"\n :disabled=\"switchDisabled\"\n @change=\"handleChange\"\n @keydown.enter=\"switchValue\"\n />\n <span\n v-if=\"!inlinePrompt && (inactiveIcon || inactiveText)\"\n :class=\"[\n ns.e('label'),\n ns.em('label', 'left'),\n ns.is('active', !checked),\n ]\"\n >\n <el-icon v-if=\"inactiveIcon\"><component :is=\"inactiveIcon\" /></el-icon>\n <span v-if=\"!inactiveIcon && inactiveText\" :aria-hidden=\"checked\">{{\n inactiveText\n }}</span>\n </span>\n <span\n ref=\"core\"\n :class=\"ns.e('core')\"\n :style=\"{ width: (width || 40) + 'px' }\"\n >\n <div v-if=\"inlinePrompt\" :class=\"ns.e('inner')\">\n <template v-if=\"activeIcon || inactiveIcon\">\n <el-icon\n v-if=\"activeIcon\"\n :class=\"[ns.is('icon'), checked ? ns.is('show') : ns.is('hide')]\"\n >\n <component :is=\"activeIcon\" />\n </el-icon>\n <el-icon\n v-if=\"inactiveIcon\"\n :class=\"[ns.is('icon'), !checked ? ns.is('show') : ns.is('hide')]\"\n >\n <component :is=\"inactiveIcon\" />\n </el-icon>\n </template>\n <template v-else-if=\"activeText || inactiveIcon\">\n <span\n v-if=\"activeText\"\n :class=\"[ns.is('text'), checked ? ns.is('show') : ns.is('hide')]\"\n :aria-hidden=\"!checked\"\n >\n {{ activeText.substr(0, 1) }}\n </span>\n <span\n v-if=\"inactiveText\"\n :class=\"[ns.is('text'), !checked ? ns.is('show') : ns.is('hide')]\"\n :aria-hidden=\"checked\"\n >\n {{ inactiveText.substr(0, 1) }}\n </span>\n </template>\n </div>\n <div :class=\"ns.e('action')\">\n <el-icon v-if=\"loading\" :class=\"ns.is('loading')\"><loading /></el-icon>\n </div>\n </span>\n <span\n v-if=\"!inlinePrompt && (activeIcon || activeText)\"\n :class=\"[\n ns.e('label'),\n ns.em('label', 'right'),\n ns.is('active', checked),\n ]\"\n >\n <el-icon v-if=\"activeIcon\"><component :is=\"activeIcon\" /></el-icon>\n <span v-if=\"!activeIcon && activeText\" :aria-hidden=\"!checked\">{{\n activeText\n }}</span>\n </span>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, computed, onMounted, ref, nextTick, watch } from 'vue'\nimport { isPromise } from '@vue/shared'\nimport { isBoolean, throwError, debugWarn } from '@element-plus/utils'\nimport ElIcon from '@element-plus/components/icon'\nimport { Loading } from '@element-plus/icons-vue'\nimport {\n UPDATE_MODEL_EVENT,\n CHANGE_EVENT,\n INPUT_EVENT,\n} from '@element-plus/constants'\nimport {\n useDisabled,\n useFormItem,\n useNamespace,\n useSize,\n} from '@element-plus/hooks'\nimport { switchProps, switchEmits } from './switch'\n\nconst COMPONENT_NAME = 'ElSwitch'\n\nexport default defineComponent({\n name: COMPONENT_NAME,\n components: { ElIcon, Loading },\n\n props: switchProps,\n emits: switchEmits,\n\n setup(props, { emit }) {\n const { formItem } = useFormItem()\n const switchDisabled = useDisabled(computed(() => props.loading))\n const ns = useNamespace('switch')\n\n const switchSize = useSize()\n const isModelValue = ref(props.modelValue !== false)\n const input = ref<HTMLInputElement>()\n const core = ref<HTMLSpanElement>()\n\n const switchKls = computed(() => [\n ns.b(),\n ns.m(switchSize.value),\n ns.is('disabled', switchDisabled.value),\n ns.is('checked', checked.value),\n ])\n\n watch(\n () => props.modelValue,\n () => {\n isModelValue.value = true\n }\n )\n\n watch(\n () => props.value,\n () => {\n isModelValue.value = false\n }\n )\n\n const actualValue = computed(() => {\n return isModelValue.value ? props.modelValue : props.value\n })\n\n const checked = computed(() => actualValue.value === props.activeValue)\n\n if (![props.activeValue, props.inactiveValue].includes(actualValue.value)) {\n emit(UPDATE_MODEL_EVENT, props.inactiveValue)\n emit(CHANGE_EVENT, props.inactiveValue)\n emit(INPUT_EVENT, props.inactiveValue)\n }\n\n watch(checked, () => {\n input.value!.checked = checked.value\n\n if (props.activeColor || props.inactiveColor) {\n setBackgroundColor()\n }\n\n if (props.validateEvent) {\n formItem?.validate?.('change')\n }\n })\n\n const handleChange = (): void => {\n const val = checked.value ? props.inactiveValue : props.activeValue\n emit(UPDATE_MODEL_EVENT, val)\n emit(CHANGE_EVENT, val)\n emit(INPUT_EVENT, val)\n nextTick(() => {\n input.value!.checked = checked.value\n })\n }\n\n const switchValue = (): void => {\n if (switchDisabled.value) return\n\n const { beforeChange } = props\n if (!beforeChange) {\n handleChange()\n return\n }\n\n const shouldChange = beforeChange()\n\n const isExpectType = [\n isPromise(shouldChange),\n isBoolean(shouldChange),\n ].some((i) => i)\n if (!isExpectType) {\n throwError(\n COMPONENT_NAME,\n 'beforeChange must return type `Promise<boolean>` or `boolean`'\n )\n }\n\n if (isPromise(shouldChange)) {\n shouldChange\n .then((result) => {\n if (result) {\n handleChange()\n }\n })\n .catch((e) => {\n debugWarn(COMPONENT_NAME, `some error occurred: ${e}`)\n })\n } else if (shouldChange) {\n handleChange()\n }\n }\n\n const setBackgroundColor = (): void => {\n const newColor = checked.value ? props.activeColor : props.inactiveColor\n const coreEl = core.value\n if (props.borderColor) coreEl!.style.borderColor = props.borderColor\n else if (!props.borderColor) coreEl!.style.borderColor = newColor\n coreEl!.style.backgroundColor = newColor\n ;(coreEl!.children[0] as HTMLDivElement).style.color = newColor\n }\n\n const focus = (): void => {\n input.value?.focus?.()\n }\n\n onMounted(() => {\n if (props.activeColor || props.inactiveColor || props.borderColor) {\n setBackgroundColor()\n }\n\n input.value!.checked = checked.value\n })\n\n return {\n ns,\n input,\n core,\n switchDisabled,\n checked,\n switchKls,\n handleChange,\n switchValue,\n focus,\n }\n },\n})\n</script>\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AA6GA,MAAM,iBAAiB;AAEvB,MAAK,YAAa,gBAAa;AAAA,EAC7B,MAAM;AAAA,EACN,YAAY,EAAE,QAAQ;AAAA,EAEtB,OAAO;AAAA,EACP,OAAO;AAAA,EAEP,MAAM,OAAO,EAAE,QAAQ;AACrB,UAAM,EAAE,aAAa;AACrB,UAAM,iBAAiB,YAAY,SAAS,MAAM,MAAM;AACxD,UAAM,KAAK,aAAa;AAExB,UAAM,aAAa;AACnB,UAAM,eAAe,IAAI,MAAM,eAAe;AAC9C,UAAM,QAAQ;AACd,UAAM,OAAO;AAEb,UAAM,YAAY,SAAS,MAAM;AAAA,MAC/B,GAAG;AAAA,MACH,GAAG,EAAE,WAAW;AAAA,MAChB,GAAG,GAAG,YAAY,eAAe;AAAA,MACjC,GAAG,GAAG,WAAW,QAAQ;AAAA;AAG3B,UACE,MAAM,MAAM,YACZ,MAAM;AACJ,mBAAa,QAAQ;AAAA;AAIzB,UACE,MAAM,MAAM,OACZ,MAAM;AACJ,mBAAa,QAAQ;AAAA;AAIzB,UAAM,cAAc,SAAS,MAAM;AACjC,aAAO,aAAa,QAAQ,MAAM,aAAa,MAAM;AAAA;AAGvD,UAAM,UAAU,SAAS,MAAM,YAAY,UAAU,MAAM;AAE3D,QAAI,CAAC,CAAC,MAAM,aAAa,MAAM,eAAe,SAAS,YAAY,QAAQ;AACzE,WAAK,oBAAoB,MAAM;AAC/B,WAAK,cAAc,MAAM;AACzB,WAAK,aAAa,MAAM;AAAA;AAG1B,UAAM,SAAS,MAAM;AACnB,YAAM;AAEN;AACE;AAAA;AAGF;AACE,6BAAqB;AAAA;AAAA;AAIzB;AACE;AACA,+BAAyB;AACzB,WAAK;AACL,WAAK;AACL;AACE,cAAM;AAAyB;AAAA;AAInC;AACE,UAAI;AAAsB;AAE1B;AACA;AACE;AACA;AAAA;AAGF;AAEA,YAAM,eAAe;AAAA;AACT,QACV,UAAU;AAAA,QACV;AACF;AACE;AAEE;AAIJ;AACE;AAEI;AACE;AAAA;AAAA,WAGH;AACC;AAAkD;AAAA;AAGtD;AAAA;AAAA;AAIJ;AACE,+BAAyB;AACzB,YAAM;AACN;AAAuB,eAAQ;AAA0B,eAChD;AAAoB,eAAQ,MAAM;AAC3C;AACC,MAAC,OAAQ;AAA6C;AAGzD;AACE;AAAa;AAGf;AACE;AACE;AAAA;AAGF,4BAAuB;AAAQ;AAGjC,WAAO;AAAA,MACL;AAAA;AACA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA;AAAA;;;;;;;;;;;AAxPe;AACJ;AACZ,IACA;AAAe,IACf;AAAK;;AAEN;AACS;AACH;AACE,MACN;AAAe,MACd;AAAM,MACN;AAAA,MACA;AAAa,MACb,eAAU;AAAA,MACV;AAAM,MACN;AAAe;;AAGwB,0BAD1C;WAEQ;AAAA;AAAgB;AAAwB;AAAgC;;;AAM/D;AAA8C;AAAhC;;;;AACA;QAAe;AAAA,4BAC1C;AAAA;;AA2CG;AAvCK;AACJ;AACY;;AAEP;;AAAoB;;AACb;AAEI;YACf;AAAK;;;AAEN;;;;AAGkB;iBACZ;AAAA;;;AAEN;;;;;AAKgB;;AACV,wCACgB;AAAA;AAEnB,mGAGe;AAAA;;AACZ,wCACe;AAAA;AAElB;;kCAMH;AAAA;AAFO;;AACI;;AAAe;;;AAA+B;;;;;;AAIxD;;AACD;AAAgB;AAAwB;AAAiC;;;AAMhE;AAA0C;AAA9B;;;;AACA;QAAa;AAAA;AACtC;;;;;;;;;;"}