VDataTableVirtual.mjs 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. import { createVNode as _createVNode, mergeProps as _mergeProps, resolveDirective as _resolveDirective } from "vue";
  2. // Components
  3. import { makeDataTableProps } from "./VDataTable.mjs";
  4. import { VDataTableHeaders } from "./VDataTableHeaders.mjs";
  5. import { VDataTableRow } from "./VDataTableRow.mjs";
  6. import { VDataTableRows } from "./VDataTableRows.mjs";
  7. import { VTable } from "../VTable/index.mjs";
  8. import { VVirtualScrollItem } from "../VVirtualScroll/VVirtualScrollItem.mjs"; // Composables
  9. import { provideExpanded } from "./composables/expand.mjs";
  10. import { createGroupBy, makeDataTableGroupProps, provideGroupBy, useGroupedItems } from "./composables/group.mjs";
  11. import { createHeaders } from "./composables/headers.mjs";
  12. import { useDataTableItems } from "./composables/items.mjs";
  13. import { useOptions } from "./composables/options.mjs";
  14. import { provideSelection } from "./composables/select.mjs";
  15. import { createSort, provideSort, useSortedItems } from "./composables/sort.mjs";
  16. import { provideDefaults } from "../../composables/defaults.mjs";
  17. import { makeFilterProps, useFilter } from "../../composables/filter.mjs";
  18. import { makeVirtualProps, useVirtual } from "../../composables/virtual.mjs"; // Utilities
  19. import { computed, shallowRef, toRef, toRefs } from 'vue';
  20. import { convertToUnit, genericComponent, propsFactory, useRender } from "../../util/index.mjs"; // Types
  21. export const makeVDataTableVirtualProps = propsFactory({
  22. ...makeDataTableProps(),
  23. ...makeDataTableGroupProps(),
  24. ...makeVirtualProps(),
  25. ...makeFilterProps()
  26. }, 'VDataTableVirtual');
  27. export const VDataTableVirtual = genericComponent()({
  28. name: 'VDataTableVirtual',
  29. props: makeVDataTableVirtualProps(),
  30. emits: {
  31. 'update:modelValue': value => true,
  32. 'update:sortBy': value => true,
  33. 'update:options': value => true,
  34. 'update:groupBy': value => true,
  35. 'update:expanded': value => true
  36. },
  37. setup(props, _ref) {
  38. let {
  39. attrs,
  40. slots
  41. } = _ref;
  42. const {
  43. groupBy
  44. } = createGroupBy(props);
  45. const {
  46. sortBy,
  47. multiSort,
  48. mustSort
  49. } = createSort(props);
  50. const {
  51. disableSort
  52. } = toRefs(props);
  53. const {
  54. columns,
  55. headers,
  56. filterFunctions,
  57. sortFunctions,
  58. sortRawFunctions
  59. } = createHeaders(props, {
  60. groupBy,
  61. showSelect: toRef(props, 'showSelect'),
  62. showExpand: toRef(props, 'showExpand')
  63. });
  64. const {
  65. items
  66. } = useDataTableItems(props, columns);
  67. const search = toRef(props, 'search');
  68. const {
  69. filteredItems
  70. } = useFilter(props, items, search, {
  71. transform: item => item.columns,
  72. customKeyFilter: filterFunctions
  73. });
  74. const {
  75. toggleSort
  76. } = provideSort({
  77. sortBy,
  78. multiSort,
  79. mustSort
  80. });
  81. const {
  82. sortByWithGroups,
  83. opened,
  84. extractRows,
  85. isGroupOpen,
  86. toggleGroup
  87. } = provideGroupBy({
  88. groupBy,
  89. sortBy,
  90. disableSort
  91. });
  92. const {
  93. sortedItems
  94. } = useSortedItems(props, filteredItems, sortByWithGroups, {
  95. transform: item => ({
  96. ...item.raw,
  97. ...item.columns
  98. }),
  99. sortFunctions,
  100. sortRawFunctions
  101. });
  102. const {
  103. flatItems
  104. } = useGroupedItems(sortedItems, groupBy, opened);
  105. const allItems = computed(() => extractRows(flatItems.value));
  106. const {
  107. isSelected,
  108. select,
  109. selectAll,
  110. toggleSelect,
  111. someSelected,
  112. allSelected
  113. } = provideSelection(props, {
  114. allItems,
  115. currentPage: allItems
  116. });
  117. const {
  118. isExpanded,
  119. toggleExpand
  120. } = provideExpanded(props);
  121. const {
  122. containerRef,
  123. markerRef,
  124. paddingTop,
  125. paddingBottom,
  126. computedItems,
  127. handleItemResize,
  128. handleScroll,
  129. handleScrollend
  130. } = useVirtual(props, flatItems);
  131. const displayItems = computed(() => computedItems.value.map(item => item.raw));
  132. useOptions({
  133. sortBy,
  134. page: shallowRef(1),
  135. itemsPerPage: shallowRef(-1),
  136. groupBy,
  137. search
  138. });
  139. provideDefaults({
  140. VDataTableRows: {
  141. hideNoData: toRef(props, 'hideNoData'),
  142. noDataText: toRef(props, 'noDataText'),
  143. loading: toRef(props, 'loading'),
  144. loadingText: toRef(props, 'loadingText')
  145. }
  146. });
  147. const slotProps = computed(() => ({
  148. sortBy: sortBy.value,
  149. toggleSort,
  150. someSelected: someSelected.value,
  151. allSelected: allSelected.value,
  152. isSelected,
  153. select,
  154. selectAll,
  155. toggleSelect,
  156. isExpanded,
  157. toggleExpand,
  158. isGroupOpen,
  159. toggleGroup,
  160. items: allItems.value.map(item => item.raw),
  161. internalItems: allItems.value,
  162. groupedItems: flatItems.value,
  163. columns: columns.value,
  164. headers: headers.value
  165. }));
  166. useRender(() => {
  167. const dataTableHeadersProps = VDataTableHeaders.filterProps(props);
  168. const dataTableRowsProps = VDataTableRows.filterProps(props);
  169. const tableProps = VTable.filterProps(props);
  170. return _createVNode(VTable, _mergeProps({
  171. "class": ['v-data-table', {
  172. 'v-data-table--loading': props.loading
  173. }, props.class],
  174. "style": props.style
  175. }, tableProps), {
  176. top: () => slots.top?.(slotProps.value),
  177. wrapper: () => _createVNode("div", {
  178. "ref": containerRef,
  179. "onScrollPassive": handleScroll,
  180. "onScrollend": handleScrollend,
  181. "class": "v-table__wrapper",
  182. "style": {
  183. height: convertToUnit(props.height)
  184. }
  185. }, [_createVNode("table", null, [slots.colgroup?.(slotProps.value), !props.hideDefaultHeader && _createVNode("thead", {
  186. "key": "thead"
  187. }, [_createVNode(VDataTableHeaders, _mergeProps(dataTableHeadersProps, {
  188. "sticky": props.fixedHeader
  189. }), slots)]), !props.hideDefaultBody && _createVNode("tbody", null, [_createVNode("tr", {
  190. "ref": markerRef,
  191. "style": {
  192. height: convertToUnit(paddingTop.value),
  193. border: 0
  194. }
  195. }, [_createVNode("td", {
  196. "colspan": columns.value.length,
  197. "style": {
  198. height: 0,
  199. border: 0
  200. }
  201. }, null)]), slots['body.prepend']?.(slotProps.value), _createVNode(VDataTableRows, _mergeProps(attrs, dataTableRowsProps, {
  202. "items": displayItems.value
  203. }), {
  204. ...slots,
  205. item: itemSlotProps => _createVNode(VVirtualScrollItem, {
  206. "key": itemSlotProps.internalItem.index,
  207. "renderless": true,
  208. "onUpdate:height": height => handleItemResize(itemSlotProps.internalItem.index, height)
  209. }, {
  210. default: _ref2 => {
  211. let {
  212. itemRef
  213. } = _ref2;
  214. return slots.item?.({
  215. ...itemSlotProps,
  216. itemRef
  217. }) ?? _createVNode(VDataTableRow, _mergeProps(itemSlotProps.props, {
  218. "ref": itemRef,
  219. "key": itemSlotProps.internalItem.index,
  220. "index": itemSlotProps.internalItem.index
  221. }), slots);
  222. }
  223. })
  224. }), slots['body.append']?.(slotProps.value), _createVNode("tr", {
  225. "style": {
  226. height: convertToUnit(paddingBottom.value),
  227. border: 0
  228. }
  229. }, [_createVNode("td", {
  230. "colspan": columns.value.length,
  231. "style": {
  232. height: 0,
  233. border: 0
  234. }
  235. }, null)])])])]),
  236. bottom: () => slots.bottom?.(slotProps.value)
  237. });
  238. });
  239. }
  240. });
  241. //# sourceMappingURL=VDataTableVirtual.mjs.map