VDataTableRow.mjs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. import { mergeProps as _mergeProps, Fragment as _Fragment, 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 { useExpanded } from "./composables/expand.mjs";
  7. import { useHeaders } from "./composables/headers.mjs";
  8. import { useSelection } from "./composables/select.mjs";
  9. import { useSort } from "./composables/sort.mjs";
  10. import { makeDisplayProps, useDisplay } from "../../composables/display.mjs"; // Utilities
  11. import { toDisplayString, withModifiers } from 'vue';
  12. import { EventProp, genericComponent, getObjectValueByPath, propsFactory, useRender } from "../../util/index.mjs"; // Types
  13. export const makeVDataTableRowProps = propsFactory({
  14. index: Number,
  15. item: Object,
  16. cellProps: [Object, Function],
  17. onClick: EventProp(),
  18. onContextmenu: EventProp(),
  19. onDblclick: EventProp(),
  20. ...makeDisplayProps()
  21. }, 'VDataTableRow');
  22. export const VDataTableRow = genericComponent()({
  23. name: 'VDataTableRow',
  24. props: makeVDataTableRowProps(),
  25. setup(props, _ref) {
  26. let {
  27. slots
  28. } = _ref;
  29. const {
  30. displayClasses,
  31. mobile
  32. } = useDisplay(props, 'v-data-table__tr');
  33. const {
  34. isSelected,
  35. toggleSelect,
  36. someSelected,
  37. allSelected,
  38. selectAll
  39. } = useSelection();
  40. const {
  41. isExpanded,
  42. toggleExpand
  43. } = useExpanded();
  44. const {
  45. toggleSort,
  46. sortBy,
  47. isSorted
  48. } = useSort();
  49. const {
  50. columns
  51. } = useHeaders();
  52. useRender(() => _createVNode("tr", {
  53. "class": ['v-data-table__tr', {
  54. 'v-data-table__tr--clickable': !!(props.onClick || props.onContextmenu || props.onDblclick)
  55. }, displayClasses.value],
  56. "onClick": props.onClick,
  57. "onContextmenu": props.onContextmenu,
  58. "onDblclick": props.onDblclick
  59. }, [props.item && columns.value.map((column, i) => {
  60. const item = props.item;
  61. const slotName = `item.${column.key}`;
  62. const headerSlotName = `header.${column.key}`;
  63. const slotProps = {
  64. index: props.index,
  65. item: item.raw,
  66. internalItem: item,
  67. value: getObjectValueByPath(item.columns, column.key),
  68. column,
  69. isSelected,
  70. toggleSelect,
  71. isExpanded,
  72. toggleExpand
  73. };
  74. const columnSlotProps = {
  75. column,
  76. selectAll,
  77. isSorted,
  78. toggleSort,
  79. sortBy: sortBy.value,
  80. someSelected: someSelected.value,
  81. allSelected: allSelected.value,
  82. getSortIcon: () => ''
  83. };
  84. const cellProps = typeof props.cellProps === 'function' ? props.cellProps({
  85. index: slotProps.index,
  86. item: slotProps.item,
  87. internalItem: slotProps.internalItem,
  88. value: slotProps.value,
  89. column
  90. }) : props.cellProps;
  91. const columnCellProps = typeof column.cellProps === 'function' ? column.cellProps({
  92. index: slotProps.index,
  93. item: slotProps.item,
  94. internalItem: slotProps.internalItem,
  95. value: slotProps.value
  96. }) : column.cellProps;
  97. return _createVNode(VDataTableColumn, _mergeProps({
  98. "align": column.align,
  99. "class": {
  100. 'v-data-table__td--expanded-row': column.key === 'data-table-expand',
  101. 'v-data-table__td--select-row': column.key === 'data-table-select'
  102. },
  103. "fixed": column.fixed,
  104. "fixedOffset": column.fixedOffset,
  105. "lastFixed": column.lastFixed,
  106. "maxWidth": !mobile.value ? column.maxWidth : undefined,
  107. "noPadding": column.key === 'data-table-select' || column.key === 'data-table-expand',
  108. "nowrap": column.nowrap,
  109. "width": !mobile.value ? column.width : undefined
  110. }, cellProps, columnCellProps), {
  111. default: () => {
  112. if (slots[slotName] && !mobile.value) return slots[slotName]?.(slotProps);
  113. if (column.key === 'data-table-select') {
  114. return slots['item.data-table-select']?.(slotProps) ?? _createVNode(VCheckboxBtn, {
  115. "disabled": !item.selectable,
  116. "modelValue": isSelected([item]),
  117. "onClick": withModifiers(() => toggleSelect(item), ['stop'])
  118. }, null);
  119. }
  120. if (column.key === 'data-table-expand') {
  121. return slots['item.data-table-expand']?.(slotProps) ?? _createVNode(VBtn, {
  122. "icon": isExpanded(item) ? '$collapse' : '$expand',
  123. "size": "small",
  124. "variant": "text",
  125. "onClick": withModifiers(() => toggleExpand(item), ['stop'])
  126. }, null);
  127. }
  128. const displayValue = toDisplayString(slotProps.value);
  129. return !mobile.value ? displayValue : _createVNode(_Fragment, null, [_createVNode("div", {
  130. "class": "v-data-table__td-title"
  131. }, [slots[headerSlotName]?.(columnSlotProps) ?? column.title]), _createVNode("div", {
  132. "class": "v-data-table__td-value"
  133. }, [slots[slotName]?.(slotProps) ?? displayValue])]);
  134. }
  135. });
  136. })]));
  137. }
  138. });
  139. //# sourceMappingURL=VDataTableRow.mjs.map