127 lines
4.1 KiB
JavaScript
127 lines
4.1 KiB
JavaScript
import { mergeProps as _mergeProps, resolveDirective as _resolveDirective, Fragment as _Fragment, createVNode as _createVNode } from "vue";
|
|
// Components
|
|
import { VDataTableGroupHeaderRow } from "./VDataTableGroupHeaderRow.mjs";
|
|
import { VDataTableRow } from "./VDataTableRow.mjs"; // Composables
|
|
import { useExpanded } from "./composables/expand.mjs";
|
|
import { useGroupBy } from "./composables/group.mjs";
|
|
import { useHeaders } from "./composables/headers.mjs";
|
|
import { useSelection } from "./composables/select.mjs";
|
|
import { useLocale } from "../../composables/locale.mjs"; // Utilities
|
|
import { Fragment, mergeProps } from 'vue';
|
|
import { genericComponent, getPrefixedEventHandlers, propsFactory, useRender } from "../../util/index.mjs"; // Types
|
|
export const makeVDataTableRowsProps = propsFactory({
|
|
loading: [Boolean, String],
|
|
loadingText: {
|
|
type: String,
|
|
default: '$vuetify.dataIterator.loadingText'
|
|
},
|
|
hideNoData: Boolean,
|
|
items: {
|
|
type: Array,
|
|
default: () => []
|
|
},
|
|
noDataText: {
|
|
type: String,
|
|
default: '$vuetify.noDataText'
|
|
},
|
|
rowProps: [Object, Function],
|
|
cellProps: [Object, Function]
|
|
}, 'VDataTableRows');
|
|
export const VDataTableRows = genericComponent()({
|
|
name: 'VDataTableRows',
|
|
inheritAttrs: false,
|
|
props: makeVDataTableRowsProps(),
|
|
setup(props, _ref) {
|
|
let {
|
|
attrs,
|
|
slots
|
|
} = _ref;
|
|
const {
|
|
columns
|
|
} = useHeaders();
|
|
const {
|
|
expandOnClick,
|
|
toggleExpand,
|
|
isExpanded
|
|
} = useExpanded();
|
|
const {
|
|
isSelected,
|
|
toggleSelect
|
|
} = useSelection();
|
|
const {
|
|
toggleGroup,
|
|
isGroupOpen
|
|
} = useGroupBy();
|
|
const {
|
|
t
|
|
} = useLocale();
|
|
useRender(() => {
|
|
if (props.loading && (!props.items.length || slots.loading)) {
|
|
return _createVNode("tr", {
|
|
"class": "v-data-table-rows-loading",
|
|
"key": "loading"
|
|
}, [_createVNode("td", {
|
|
"colspan": columns.value.length
|
|
}, [slots.loading?.() ?? t(props.loadingText)])]);
|
|
}
|
|
if (!props.loading && !props.items.length && !props.hideNoData) {
|
|
return _createVNode("tr", {
|
|
"class": "v-data-table-rows-no-data",
|
|
"key": "no-data"
|
|
}, [_createVNode("td", {
|
|
"colspan": columns.value.length
|
|
}, [slots['no-data']?.() ?? t(props.noDataText)])]);
|
|
}
|
|
return _createVNode(_Fragment, null, [props.items.map((item, index) => {
|
|
if (item.type === 'group') {
|
|
const slotProps = {
|
|
index,
|
|
item,
|
|
columns: columns.value,
|
|
isExpanded,
|
|
toggleExpand,
|
|
isSelected,
|
|
toggleSelect,
|
|
toggleGroup,
|
|
isGroupOpen
|
|
};
|
|
return slots['group-header'] ? slots['group-header'](slotProps) : _createVNode(VDataTableGroupHeaderRow, _mergeProps({
|
|
"key": `group-header_${item.id}`,
|
|
"item": item
|
|
}, getPrefixedEventHandlers(attrs, ':group-header', () => slotProps)), slots);
|
|
}
|
|
const slotProps = {
|
|
index,
|
|
item: item.raw,
|
|
internalItem: item,
|
|
columns: columns.value,
|
|
isExpanded,
|
|
toggleExpand,
|
|
isSelected,
|
|
toggleSelect
|
|
};
|
|
const itemSlotProps = {
|
|
...slotProps,
|
|
props: mergeProps({
|
|
key: `item_${item.key ?? item.index}`,
|
|
onClick: expandOnClick.value ? () => {
|
|
toggleExpand(item);
|
|
} : undefined,
|
|
index,
|
|
item,
|
|
cellProps: props.cellProps
|
|
}, getPrefixedEventHandlers(attrs, ':row', () => slotProps), typeof props.rowProps === 'function' ? props.rowProps({
|
|
item: slotProps.item,
|
|
index: slotProps.index,
|
|
internalItem: slotProps.internalItem
|
|
}) : props.rowProps)
|
|
};
|
|
return _createVNode(_Fragment, {
|
|
"key": itemSlotProps.props.key
|
|
}, [slots.item ? slots.item(itemSlotProps) : _createVNode(VDataTableRow, itemSlotProps.props, slots), isExpanded(item) && slots['expanded-row']?.(slotProps)]);
|
|
})]);
|
|
});
|
|
return {};
|
|
}
|
|
});
|
|
//# sourceMappingURL=VDataTableRows.mjs.map
|