123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- import type { ComputedRef } from 'vue';
- import type { BasicTableProps } from '../types/table';
- import { unref } from 'vue';
- import { ROW_KEY } from '../const';
- import { isString, isFunction } from '/@/utils/is';
- interface Options {
- setSelectedRowKeys: (keys: string[]) => void;
- getSelectRowKeys: () => string[];
- clearSelectedRowKeys: () => void;
- emit: EmitType;
- getAutoCreateKey: ComputedRef<boolean | undefined>;
- }
- function getKey(
- record: Recordable,
- rowKey: string | ((record: Record<string, any>) => string) | undefined,
- autoCreateKey?: boolean,
- ) {
- if (!rowKey || autoCreateKey) {
- return record[ROW_KEY];
- }
- if (isString(rowKey)) {
- return record[rowKey];
- }
- if (isFunction(rowKey)) {
- return record[rowKey(record)];
- }
- return null;
- }
- export function useCustomRow(
- propsRef: ComputedRef<BasicTableProps>,
- { setSelectedRowKeys, getSelectRowKeys, getAutoCreateKey, clearSelectedRowKeys, emit }: Options,
- ) {
- const customRow = (record: Recordable, index: number) => {
- return {
- onClick: (e: Event) => {
- e?.stopPropagation();
- function handleClick() {
- const { rowSelection, rowKey, clickToRowSelect } = unref(propsRef);
- if (!rowSelection || !clickToRowSelect) return;
- const keys = getSelectRowKeys() || [];
- const key = getKey(record, rowKey, unref(getAutoCreateKey));
- if (!key) return;
- const isCheckbox = rowSelection.type === 'checkbox';
- if (isCheckbox) {
- // 找到tr
- const tr: HTMLElement = (e as MouseEvent)
- .composedPath?.()
- .find((dom: HTMLElement) => dom.tagName === 'TR') as HTMLElement;
- if (!tr) return;
- // 找到Checkbox,检查是否为disabled
- const checkBox = tr.querySelector('input[type=checkbox]');
- if (!checkBox || checkBox.hasAttribute('disabled')) return;
- if (!keys.includes(key)) {
- setSelectedRowKeys([...keys, key]);
- return;
- }
- const keyIndex = keys.findIndex((item) => item === key);
- keys.splice(keyIndex, 1);
- setSelectedRowKeys(keys);
- return;
- }
- const isRadio = rowSelection.type === 'radio';
- if (isRadio) {
- if (!keys.includes(key)) {
- if (keys.length) {
- clearSelectedRowKeys();
- }
- setSelectedRowKeys([key]);
- return;
- }
- clearSelectedRowKeys();
- }
- }
- handleClick();
- emit('row-click', record, index, e);
- },
- onDblclick: (event: Event) => {
- emit('row-dbClick', record, index, event);
- },
- onContextmenu: (event: Event) => {
- emit('row-contextmenu', record, index, event);
- },
- onMouseenter: (event: Event) => {
- emit('row-mouseenter', record, index, event);
- },
- onMouseleave: (event: Event) => {
- emit('row-mouseleave', record, index, event);
- },
- };
- };
- return {
- customRow,
- };
- }
|