VDataTableGroupHeaderRow.mjs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import { createTextVNode as _createTextVNode, createVNode as _createVNode } from "vue";
  2. // Components
  3. import { VDataTableColumn } from "./VDataTableColumn.mjs";
  4. import { VBtn } from "../VBtn/index.mjs";
  5. import { VCheckboxBtn } from "../VCheckbox/index.mjs"; // Composables
  6. import { useGroupBy } from "./composables/group.mjs";
  7. import { useHeaders } from "./composables/headers.mjs";
  8. import { useSelection } from "./composables/select.mjs"; // Utilities
  9. import { computed } from 'vue';
  10. import { genericComponent, propsFactory } from "../../util/index.mjs"; // Types
  11. export const makeVDataTableGroupHeaderRowProps = propsFactory({
  12. item: {
  13. type: Object,
  14. required: true
  15. }
  16. }, 'VDataTableGroupHeaderRow');
  17. export const VDataTableGroupHeaderRow = genericComponent()({
  18. name: 'VDataTableGroupHeaderRow',
  19. props: makeVDataTableGroupHeaderRowProps(),
  20. setup(props, _ref) {
  21. let {
  22. slots
  23. } = _ref;
  24. const {
  25. isGroupOpen,
  26. toggleGroup,
  27. extractRows
  28. } = useGroupBy();
  29. const {
  30. isSelected,
  31. isSomeSelected,
  32. select
  33. } = useSelection();
  34. const {
  35. columns
  36. } = useHeaders();
  37. const rows = computed(() => {
  38. return extractRows([props.item]);
  39. });
  40. return () => _createVNode("tr", {
  41. "class": "v-data-table-group-header-row",
  42. "style": {
  43. '--v-data-table-group-header-row-depth': props.item.depth
  44. }
  45. }, [columns.value.map(column => {
  46. if (column.key === 'data-table-group') {
  47. const icon = isGroupOpen(props.item) ? '$expand' : '$next';
  48. const onClick = () => toggleGroup(props.item);
  49. return slots['data-table-group']?.({
  50. item: props.item,
  51. count: rows.value.length,
  52. props: {
  53. icon,
  54. onClick
  55. }
  56. }) ?? _createVNode(VDataTableColumn, {
  57. "class": "v-data-table-group-header-row__column"
  58. }, {
  59. default: () => [_createVNode(VBtn, {
  60. "size": "small",
  61. "variant": "text",
  62. "icon": icon,
  63. "onClick": onClick
  64. }, null), _createVNode("span", null, [props.item.value]), _createVNode("span", null, [_createTextVNode("("), rows.value.length, _createTextVNode(")")])]
  65. });
  66. }
  67. if (column.key === 'data-table-select') {
  68. const modelValue = isSelected(rows.value);
  69. const indeterminate = isSomeSelected(rows.value) && !modelValue;
  70. const selectGroup = v => select(rows.value, v);
  71. return slots['data-table-select']?.({
  72. props: {
  73. modelValue,
  74. indeterminate,
  75. 'onUpdate:modelValue': selectGroup
  76. }
  77. }) ?? _createVNode("td", null, [_createVNode(VCheckboxBtn, {
  78. "modelValue": modelValue,
  79. "indeterminate": indeterminate,
  80. "onUpdate:modelValue": selectGroup
  81. }, null)]);
  82. }
  83. return _createVNode("td", null, null);
  84. })]);
  85. }
  86. });
  87. //# sourceMappingURL=VDataTableGroupHeaderRow.mjs.map