UNPKG

naive-ui

Version:

A Vue 3 Component Library. Fairly Complete, Theme Customizable, Uses TypeScript, Fast

179 lines 5.32 kB
import { computed, defineComponent, h, inject, ref } from 'vue'; import { NScrollbar } from "../../../_internal/index.mjs"; import { useConfig, useRtl } from "../../../_mixins/index.mjs"; import { NButton } from "../../../button/index.mjs"; import { NCheckbox, NCheckboxGroup } from "../../../checkbox/index.mjs"; import { NRadio, NRadioGroup } from "../../../radio/index.mjs"; import { dataTableInjectionKey } from "../interface.mjs"; import { shouldUseArrayInSingleMode } from "../utils.mjs"; export default defineComponent({ name: 'DataTableFilterMenu', props: { column: { type: Object, required: true }, radioGroupName: { type: String, required: true }, multiple: { type: Boolean, required: true }, value: { type: [Array, String, Number], default: null }, options: { type: Array, required: true }, onConfirm: { type: Function, required: true }, onClear: { type: Function, required: true }, onChange: { type: Function, required: true } }, setup(props) { const { mergedClsPrefixRef: mergedClsPrefixRefRtl, mergedRtlRef } = useConfig(props); const rtlEnabledRef = useRtl('DataTable', mergedRtlRef, mergedClsPrefixRefRtl); const { mergedClsPrefixRef, mergedThemeRef, localeRef } = inject(dataTableInjectionKey); // to be compared with changed value // const initialValueRef = ref(props.value) const temporalValueRef = ref(props.value); const checkboxGroupValueRef = computed(() => { const { value: temporalValue } = temporalValueRef; if (!Array.isArray(temporalValue)) return null; return temporalValue; }); const radioGroupValueRef = computed(() => { const { value: temporalValue } = temporalValueRef; if (shouldUseArrayInSingleMode(props.column)) { return Array.isArray(temporalValue) && temporalValue.length && temporalValue[0] || null; } if (!Array.isArray(temporalValue)) return temporalValue; return null; }); function doChange(value) { // May need to check if equal ; props.onChange(value); } function handleChange(value) { if (props.multiple && Array.isArray(value)) { temporalValueRef.value = value; } else if (shouldUseArrayInSingleMode(props.column) && !Array.isArray(value)) { /** this branch is for compatibility */ temporalValueRef.value = [value]; } else { temporalValueRef.value = value; } } function handleConfirmClick() { doChange(temporalValueRef.value); props.onConfirm(); } function handleClearClick() { if (props.multiple || shouldUseArrayInSingleMode(props.column)) { doChange([]); } else { doChange(null); } props.onClear(); } return { mergedClsPrefix: mergedClsPrefixRef, rtlEnabled: rtlEnabledRef, mergedTheme: mergedThemeRef, locale: localeRef, checkboxGroupValue: checkboxGroupValueRef, radioGroupValue: radioGroupValueRef, handleChange, handleConfirmClick, handleClearClick }; }, render() { const { mergedTheme, locale, mergedClsPrefix } = this; return h("div", { class: [`${mergedClsPrefix}-data-table-filter-menu`, this.rtlEnabled && `${mergedClsPrefix}-data-table-filter-menu--rtl`] }, h(NScrollbar, null, { default: () => { const { checkboxGroupValue, handleChange } = this; return this.multiple ? h(NCheckboxGroup, { value: checkboxGroupValue, class: `${mergedClsPrefix}-data-table-filter-menu__group`, onUpdateValue: handleChange }, { default: () => this.options.map(option => { return h(NCheckbox, { key: option.value, theme: mergedTheme.peers.Checkbox, themeOverrides: mergedTheme.peerOverrides.Checkbox, value: option.value }, { default: () => option.label }); }) }) : h(NRadioGroup, { name: this.radioGroupName, class: `${mergedClsPrefix}-data-table-filter-menu__group`, value: this.radioGroupValue, onUpdateValue: this.handleChange }, { default: () => this.options.map(option => h(NRadio, { key: option.value, value: option.value, theme: mergedTheme.peers.Radio, themeOverrides: mergedTheme.peerOverrides.Radio }, { default: () => option.label })) }); } }), h("div", { class: `${mergedClsPrefix}-data-table-filter-menu__action` }, h(NButton, { size: "tiny", theme: mergedTheme.peers.Button, themeOverrides: mergedTheme.peerOverrides.Button, onClick: this.handleClearClick }, { default: () => locale.clear }), h(NButton, { theme: mergedTheme.peers.Button, themeOverrides: mergedTheme.peerOverrides.Button, type: "primary", size: "tiny", onClick: this.handleConfirmClick }, { default: () => locale.confirm }))); } });