vuetify
Version:
Vue Material Component Framework
154 lines • 5.84 kB
JavaScript
import { createVNode as _createVNode, Fragment as _Fragment, createElementVNode as _createElementVNode, mergeProps as _mergeProps, normalizeClass as _normalizeClass } from "vue";
// Components
import { VDataTableColumn } from "./VDataTableColumn.js";
import { VBtn } from "../VBtn/index.js";
import { VCheckboxBtn } from "../VCheckbox/index.js"; // Composables
import { useExpanded } from "./composables/expand.js";
import { useHeaders } from "./composables/headers.js";
import { useSelection } from "./composables/select.js";
import { useSort } from "./composables/sort.js";
import { makeDisplayProps, useDisplay } from "../../composables/display.js"; // Utilities
import { toDisplayString, withModifiers } from 'vue';
import { EventProp, genericComponent, getObjectValueByPath, propsFactory, useRender } from "../../util/index.js"; // Types
export const makeVDataTableRowProps = propsFactory({
index: Number,
item: Object,
cellProps: [Object, Function],
onClick: EventProp(),
onContextmenu: EventProp(),
onDblclick: EventProp(),
...makeDisplayProps()
}, 'VDataTableRow');
export const VDataTableRow = genericComponent()({
name: 'VDataTableRow',
props: makeVDataTableRowProps(),
setup(props, _ref) {
let {
slots
} = _ref;
const {
displayClasses,
mobile
} = useDisplay(props, 'v-data-table__tr');
const {
isSelected,
toggleSelect,
someSelected,
allSelected,
selectAll
} = useSelection();
const {
isExpanded,
toggleExpand
} = useExpanded();
const {
toggleSort,
sortBy,
isSorted
} = useSort();
const {
columns
} = useHeaders();
useRender(() => _createElementVNode("tr", {
"class": _normalizeClass(['v-data-table__tr', {
'v-data-table__tr--clickable': !!(props.onClick || props.onContextmenu || props.onDblclick)
}, displayClasses.value]),
"onClick": props.onClick,
"onContextmenu": props.onContextmenu,
"onDblclick": props.onDblclick
}, [props.item && columns.value.map((column, i) => {
const item = props.item;
const slotName = `item.${column.key}`;
const headerSlotName = `header.${column.key}`;
const slotProps = {
index: props.index,
item: item.raw,
internalItem: item,
value: getObjectValueByPath(item.columns, column.key),
column,
isSelected,
toggleSelect,
isExpanded,
toggleExpand
};
const columnSlotProps = {
column,
selectAll,
isSorted,
toggleSort,
sortBy: sortBy.value,
someSelected: someSelected.value,
allSelected: allSelected.value,
getSortIcon: () => ''
};
const cellProps = typeof props.cellProps === 'function' ? props.cellProps({
index: slotProps.index,
item: slotProps.item,
internalItem: slotProps.internalItem,
value: slotProps.value,
column
}) : props.cellProps;
const columnCellProps = typeof column.cellProps === 'function' ? column.cellProps({
index: slotProps.index,
item: slotProps.item,
internalItem: slotProps.internalItem,
value: slotProps.value
}) : column.cellProps;
return _createVNode(VDataTableColumn, _mergeProps({
"align": column.align,
"class": {
'v-data-table__td--expanded-row': column.key === 'data-table-expand',
'v-data-table__td--select-row': column.key === 'data-table-select'
},
"fixed": column.fixed,
"fixedOffset": column.fixedOffset,
"lastFixed": column.lastFixed,
"maxWidth": !mobile.value ? column.maxWidth : undefined,
"noPadding": column.key === 'data-table-select' || column.key === 'data-table-expand',
"nowrap": column.nowrap,
"width": !mobile.value ? column.width : undefined
}, cellProps, columnCellProps), {
default: () => {
if (column.key === 'data-table-select') {
return slots['item.data-table-select']?.({
...slotProps,
props: {
disabled: !item.selectable,
modelValue: isSelected([item]),
onClick: withModifiers(() => toggleSelect(item), ['stop'])
}
}) ?? _createVNode(VCheckboxBtn, {
"disabled": !item.selectable,
"modelValue": isSelected([item]),
"onClick": withModifiers(event => toggleSelect(item, props.index, event), ['stop'])
}, null);
}
if (column.key === 'data-table-expand') {
return slots['item.data-table-expand']?.({
...slotProps,
props: {
icon: isExpanded(item) ? '$collapse' : '$expand',
size: 'small',
variant: 'text',
onClick: withModifiers(() => toggleExpand(item), ['stop'])
}
}) ?? _createVNode(VBtn, {
"icon": isExpanded(item) ? '$collapse' : '$expand',
"size": "small",
"variant": "text",
"onClick": withModifiers(() => toggleExpand(item), ['stop'])
}, null);
}
if (slots[slotName] && !mobile.value) return slots[slotName](slotProps);
const displayValue = toDisplayString(slotProps.value);
return !mobile.value ? displayValue : _createElementVNode(_Fragment, null, [_createElementVNode("div", {
"class": "v-data-table__td-title"
}, [slots[headerSlotName]?.(columnSlotProps) ?? column.title]), _createElementVNode("div", {
"class": "v-data-table__td-value"
}, [slots[slotName]?.(slotProps) ?? displayValue])]);
}
});
})]));
}
});
//# sourceMappingURL=VDataTableRow.js.map