87 lines
2.9 KiB
JavaScript
87 lines
2.9 KiB
JavaScript
|
import { createTextVNode as _createTextVNode, createVNode as _createVNode } from "vue";
|
||
|
// Components
|
||
|
import { VDataTableColumn } from "./VDataTableColumn.mjs";
|
||
|
import { VBtn } from "../VBtn/index.mjs";
|
||
|
import { VCheckboxBtn } from "../VCheckbox/index.mjs"; // Composables
|
||
|
import { useGroupBy } from "./composables/group.mjs";
|
||
|
import { useHeaders } from "./composables/headers.mjs";
|
||
|
import { useSelection } from "./composables/select.mjs"; // Utilities
|
||
|
import { computed } from 'vue';
|
||
|
import { genericComponent, propsFactory } from "../../util/index.mjs"; // Types
|
||
|
export const makeVDataTableGroupHeaderRowProps = propsFactory({
|
||
|
item: {
|
||
|
type: Object,
|
||
|
required: true
|
||
|
}
|
||
|
}, 'VDataTableGroupHeaderRow');
|
||
|
export const VDataTableGroupHeaderRow = genericComponent()({
|
||
|
name: 'VDataTableGroupHeaderRow',
|
||
|
props: makeVDataTableGroupHeaderRowProps(),
|
||
|
setup(props, _ref) {
|
||
|
let {
|
||
|
slots
|
||
|
} = _ref;
|
||
|
const {
|
||
|
isGroupOpen,
|
||
|
toggleGroup,
|
||
|
extractRows
|
||
|
} = useGroupBy();
|
||
|
const {
|
||
|
isSelected,
|
||
|
isSomeSelected,
|
||
|
select
|
||
|
} = useSelection();
|
||
|
const {
|
||
|
columns
|
||
|
} = useHeaders();
|
||
|
const rows = computed(() => {
|
||
|
return extractRows([props.item]);
|
||
|
});
|
||
|
return () => _createVNode("tr", {
|
||
|
"class": "v-data-table-group-header-row",
|
||
|
"style": {
|
||
|
'--v-data-table-group-header-row-depth': props.item.depth
|
||
|
}
|
||
|
}, [columns.value.map(column => {
|
||
|
if (column.key === 'data-table-group') {
|
||
|
const icon = isGroupOpen(props.item) ? '$expand' : '$next';
|
||
|
const onClick = () => toggleGroup(props.item);
|
||
|
return slots['data-table-group']?.({
|
||
|
item: props.item,
|
||
|
count: rows.value.length,
|
||
|
props: {
|
||
|
icon,
|
||
|
onClick
|
||
|
}
|
||
|
}) ?? _createVNode(VDataTableColumn, {
|
||
|
"class": "v-data-table-group-header-row__column"
|
||
|
}, {
|
||
|
default: () => [_createVNode(VBtn, {
|
||
|
"size": "small",
|
||
|
"variant": "text",
|
||
|
"icon": icon,
|
||
|
"onClick": onClick
|
||
|
}, null), _createVNode("span", null, [props.item.value]), _createVNode("span", null, [_createTextVNode("("), rows.value.length, _createTextVNode(")")])]
|
||
|
});
|
||
|
}
|
||
|
if (column.key === 'data-table-select') {
|
||
|
const modelValue = isSelected(rows.value);
|
||
|
const indeterminate = isSomeSelected(rows.value) && !modelValue;
|
||
|
const selectGroup = v => select(rows.value, v);
|
||
|
return slots['data-table-select']?.({
|
||
|
props: {
|
||
|
modelValue,
|
||
|
indeterminate,
|
||
|
'onUpdate:modelValue': selectGroup
|
||
|
}
|
||
|
}) ?? _createVNode("td", null, [_createVNode(VCheckboxBtn, {
|
||
|
"modelValue": modelValue,
|
||
|
"indeterminate": indeterminate,
|
||
|
"onUpdate:modelValue": selectGroup
|
||
|
}, null)]);
|
||
|
}
|
||
|
return _createVNode("td", null, null);
|
||
|
})]);
|
||
|
}
|
||
|
});
|
||
|
//# sourceMappingURL=VDataTableGroupHeaderRow.mjs.map
|