element-plus
Version:
A Component Library for Vue 3
217 lines (214 loc) • 6.3 kB
JavaScript
import { defineComponent, getCurrentInstance, ref, computed } from 'vue';
import { ElCheckboxGroup, ElCheckbox } from '../../checkbox/index.mjs';
import { ElIcon } from '../../icon/index.mjs';
import { ArrowUp, ArrowDown } from '@element-plus/icons-vue';
import { ElTooltip } from '../../tooltip/index.mjs';
import { ElScrollbar } from '../../scrollbar/index.mjs';
import { useTooltipContentProps } from '../../tooltip/src/content.mjs';
import { useLocale } from '../../../hooks/use-locale/index.mjs';
import { useNamespace } from '../../../hooks/use-namespace/index.mjs';
import { isPropAbsent } from '../../../utils/types.mjs';
import { getEventCode } from '../../../utils/dom/event.mjs';
import { EVENT_CODE } from '../../../constants/aria.mjs';
var _sfc_main = defineComponent({
name: "ElTableFilterPanel",
components: {
ElCheckbox,
ElCheckboxGroup,
ElScrollbar,
ElTooltip,
ElIcon,
ArrowDown,
ArrowUp
},
props: {
placement: {
type: String,
default: "bottom-start"
},
store: {
type: Object
},
column: {
type: Object
},
upDataColumn: {
type: Function
},
appendTo: useTooltipContentProps.appendTo
},
setup(props) {
const instance = getCurrentInstance();
const { t } = useLocale();
const ns = useNamespace("table-filter");
const parent = instance == null ? void 0 : instance.parent;
if (props.column && !parent.filterPanels.value[props.column.id]) {
parent.filterPanels.value[props.column.id] = instance;
}
const tooltipRef = ref(null);
const rootRef = ref(null);
const checkedIndex = ref(0);
const filters = computed(() => {
return props.column && props.column.filters;
});
const filterClassName = computed(() => {
if (props.column && props.column.filterClassName) {
return `${ns.b()} ${props.column.filterClassName}`;
}
return ns.b();
});
const filterValue = computed({
get: () => {
var _a;
return (((_a = props.column) == null ? void 0 : _a.filteredValue) || [])[0];
},
set: (value) => {
if (filteredValue.value) {
if (!isPropAbsent(value)) {
filteredValue.value.splice(0, 1, value);
} else {
filteredValue.value.splice(0, 1);
}
}
}
});
const filteredValue = computed({
get() {
if (props.column) {
return props.column.filteredValue || [];
}
return [];
},
set(value) {
var _a;
if (props.column) {
(_a = props.upDataColumn) == null ? void 0 : _a.call(props, "filteredValue", value);
}
}
});
const multiple = computed(() => {
if (props.column) {
return props.column.filterMultiple;
}
return true;
});
const isActive = (filter) => {
return filter.value === filterValue.value;
};
const hidden = () => {
var _a;
(_a = tooltipRef.value) == null ? void 0 : _a.onClose();
};
const handleConfirm = () => {
confirmFilter(filteredValue.value);
hidden();
};
const handleReset = () => {
filteredValue.value = [];
confirmFilter(filteredValue.value);
hidden();
};
const handleSelect = (_filterValue, index) => {
filterValue.value = _filterValue;
checkedIndex.value = index;
if (!isPropAbsent(_filterValue)) {
confirmFilter(filteredValue.value);
} else {
confirmFilter([]);
}
hidden();
};
const confirmFilter = (filteredValue2) => {
var _a, _b;
(_a = props.store) == null ? void 0 : _a.commit("filterChange", {
column: props.column,
values: filteredValue2
});
(_b = props.store) == null ? void 0 : _b.updateAllSelected();
};
const handleShowTooltip = () => {
var _a, _b;
(_a = rootRef.value) == null ? void 0 : _a.focus();
!multiple.value && initCheckedIndex();
if (props.column) {
(_b = props.upDataColumn) == null ? void 0 : _b.call(props, "filterOpened", true);
}
};
const handleHideTooltip = () => {
var _a;
if (props.column) {
(_a = props.upDataColumn) == null ? void 0 : _a.call(props, "filterOpened", false);
}
};
const initCheckedIndex = () => {
if (isPropAbsent(filterValue)) {
checkedIndex.value = 0;
return;
}
const idx = (filters.value || []).findIndex((item) => {
return item.value === filterValue.value;
});
checkedIndex.value = idx >= 0 ? idx + 1 : 0;
};
const handleKeydown = (event) => {
var _a, _b;
const code = getEventCode(event);
const len = (filters.value ? filters.value.length : 0) + 1;
let index = checkedIndex.value;
let isPreventDefault = true;
switch (code) {
case EVENT_CODE.down:
case EVENT_CODE.right:
index = (index + 1) % len;
break;
case EVENT_CODE.up:
case EVENT_CODE.left:
index = (index - 1 + len) % len;
break;
case EVENT_CODE.tab:
hidden();
isPreventDefault = false;
break;
case EVENT_CODE.enter:
case EVENT_CODE.space:
if (index === 0) {
handleSelect(null, 0);
} else {
const item = (filters.value || [])[index - 1];
item.value && handleSelect(item.value, index);
}
break;
default:
isPreventDefault = false;
break;
}
isPreventDefault && event.preventDefault();
checkedIndex.value = index;
(_b = (_a = rootRef.value) == null ? void 0 : _a.querySelector(
`.${ns.e("list-item")}:nth-child(${index + 1})`
)) == null ? void 0 : _b.focus();
};
return {
multiple,
filterClassName,
filteredValue,
filterValue,
filters,
handleConfirm,
handleReset,
handleSelect,
isPropAbsent,
isActive,
t,
ns,
tooltipRef,
rootRef,
checkedIndex,
handleShowTooltip,
handleHideTooltip,
handleKeydown
};
}
});
export { _sfc_main as default };
//# sourceMappingURL=filter-panel.vue2.mjs.map