table.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449
  1. 'use strict';
  2. Object.defineProperty(exports, '__esModule', { value: true });
  3. var vue = require('vue');
  4. var lodashUnified = require('lodash-unified');
  5. var index$4 = require('../../scrollbar/index.js');
  6. var helper = require('./store/helper.js');
  7. var tableLayout = require('./table-layout.js');
  8. var index$1 = require('./table-header/index.js');
  9. var index$2 = require('./table-body/index.js');
  10. var index$3 = require('./table-footer/index.js');
  11. var utilsHelper$1 = require('./table/utils-helper.js');
  12. var utilsHelper = require('./table-header/utils-helper.js');
  13. var styleHelper = require('./table/style-helper.js');
  14. var keyRenderHelper = require('./table/key-render-helper.js');
  15. var defaults = require('./table/defaults.js');
  16. var tokens = require('./tokens.js');
  17. var hHelper = require('./h-helper.js');
  18. var useScrollbar = require('./composables/use-scrollbar.js');
  19. var pluginVue_exportHelper = require('../../../_virtual/plugin-vue_export-helper.js');
  20. var index = require('../../../directives/mousewheel/index.js');
  21. var index$5 = require('../../../hooks/use-locale/index.js');
  22. var index$6 = require('../../../hooks/use-namespace/index.js');
  23. let tableIdSeed = 1;
  24. const _sfc_main = vue.defineComponent({
  25. name: "ElTable",
  26. directives: {
  27. Mousewheel: index["default"]
  28. },
  29. components: {
  30. TableHeader: index$1["default"],
  31. TableBody: index$2["default"],
  32. TableFooter: index$3["default"],
  33. ElScrollbar: index$4.ElScrollbar,
  34. hColgroup: hHelper.hColgroup
  35. },
  36. props: defaults["default"],
  37. emits: [
  38. "select",
  39. "select-all",
  40. "selection-change",
  41. "cell-mouse-enter",
  42. "cell-mouse-leave",
  43. "cell-contextmenu",
  44. "cell-click",
  45. "cell-dblclick",
  46. "row-click",
  47. "row-contextmenu",
  48. "row-dblclick",
  49. "header-click",
  50. "header-contextmenu",
  51. "sort-change",
  52. "filter-change",
  53. "current-change",
  54. "header-dragend",
  55. "expand-change",
  56. "scroll"
  57. ],
  58. setup(props) {
  59. const { t } = index$5.useLocale();
  60. const ns = index$6.useNamespace("table");
  61. const table = vue.getCurrentInstance();
  62. vue.provide(tokens.TABLE_INJECTION_KEY, table);
  63. const store = helper.createStore(table, props);
  64. table.store = store;
  65. const layout = new tableLayout["default"]({
  66. store: table.store,
  67. table,
  68. fit: props.fit,
  69. showHeader: props.showHeader
  70. });
  71. table.layout = layout;
  72. const isEmpty = vue.computed(() => (store.states.data.value || []).length === 0);
  73. const {
  74. setCurrentRow,
  75. getSelectionRows,
  76. toggleRowSelection,
  77. clearSelection,
  78. clearFilter,
  79. toggleAllSelection,
  80. toggleRowExpansion,
  81. clearSort,
  82. sort,
  83. updateKeyChildren
  84. } = utilsHelper$1["default"](store);
  85. const {
  86. isHidden,
  87. renderExpanded,
  88. setDragVisible,
  89. isGroup,
  90. handleMouseLeave,
  91. handleHeaderFooterMousewheel,
  92. tableSize,
  93. emptyBlockStyle,
  94. resizeProxyVisible,
  95. bodyWidth,
  96. resizeState,
  97. doLayout,
  98. tableBodyStyles,
  99. tableLayout: tableLayout$1,
  100. scrollbarViewStyle,
  101. scrollbarStyle
  102. } = styleHelper["default"](props, layout, store, table);
  103. const { scrollBarRef, scrollTo, setScrollLeft, setScrollTop } = useScrollbar.useScrollbar();
  104. const debouncedUpdateLayout = lodashUnified.debounce(doLayout, 50);
  105. const tableId = `${ns.namespace.value}-table_${tableIdSeed++}`;
  106. table.tableId = tableId;
  107. table.state = {
  108. isGroup,
  109. resizeState,
  110. doLayout,
  111. debouncedUpdateLayout
  112. };
  113. const computedSumText = vue.computed(
  114. () => {
  115. var _a;
  116. return (_a = props.sumText) != null ? _a : t("el.table.sumText");
  117. }
  118. );
  119. const computedEmptyText = vue.computed(() => {
  120. var _a;
  121. return (_a = props.emptyText) != null ? _a : t("el.table.emptyText");
  122. });
  123. const columns = vue.computed(() => {
  124. return utilsHelper.convertToRows(store.states.originColumns.value)[0];
  125. });
  126. keyRenderHelper["default"](table);
  127. vue.onBeforeUnmount(() => {
  128. debouncedUpdateLayout.cancel();
  129. });
  130. return {
  131. ns,
  132. layout,
  133. store,
  134. columns,
  135. handleHeaderFooterMousewheel,
  136. handleMouseLeave,
  137. tableId,
  138. tableSize,
  139. isHidden,
  140. isEmpty,
  141. renderExpanded,
  142. resizeProxyVisible,
  143. resizeState,
  144. isGroup,
  145. bodyWidth,
  146. tableBodyStyles,
  147. emptyBlockStyle,
  148. debouncedUpdateLayout,
  149. setCurrentRow,
  150. getSelectionRows,
  151. toggleRowSelection,
  152. clearSelection,
  153. clearFilter,
  154. toggleAllSelection,
  155. toggleRowExpansion,
  156. clearSort,
  157. doLayout,
  158. sort,
  159. updateKeyChildren,
  160. t,
  161. setDragVisible,
  162. context: table,
  163. computedSumText,
  164. computedEmptyText,
  165. tableLayout: tableLayout$1,
  166. scrollbarViewStyle,
  167. scrollbarStyle,
  168. scrollBarRef,
  169. scrollTo,
  170. setScrollLeft,
  171. setScrollTop,
  172. allowDragLastColumn: props.allowDragLastColumn
  173. };
  174. }
  175. });
  176. const _hoisted_1 = ["data-prefix"];
  177. const _hoisted_2 = {
  178. ref: "hiddenColumns",
  179. class: "hidden-columns"
  180. };
  181. function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
  182. const _component_hColgroup = vue.resolveComponent("hColgroup");
  183. const _component_table_header = vue.resolveComponent("table-header");
  184. const _component_table_body = vue.resolveComponent("table-body");
  185. const _component_table_footer = vue.resolveComponent("table-footer");
  186. const _component_el_scrollbar = vue.resolveComponent("el-scrollbar");
  187. const _directive_mousewheel = vue.resolveDirective("mousewheel");
  188. return vue.openBlock(), vue.createElementBlock("div", {
  189. ref: "tableWrapper",
  190. class: vue.normalizeClass([
  191. {
  192. [_ctx.ns.m("fit")]: _ctx.fit,
  193. [_ctx.ns.m("striped")]: _ctx.stripe,
  194. [_ctx.ns.m("border")]: _ctx.border || _ctx.isGroup,
  195. [_ctx.ns.m("hidden")]: _ctx.isHidden,
  196. [_ctx.ns.m("group")]: _ctx.isGroup,
  197. [_ctx.ns.m("fluid-height")]: _ctx.maxHeight,
  198. [_ctx.ns.m("scrollable-x")]: _ctx.layout.scrollX.value,
  199. [_ctx.ns.m("scrollable-y")]: _ctx.layout.scrollY.value,
  200. [_ctx.ns.m("enable-row-hover")]: !_ctx.store.states.isComplex.value,
  201. [_ctx.ns.m("enable-row-transition")]: (_ctx.store.states.data.value || []).length !== 0 && (_ctx.store.states.data.value || []).length < 100,
  202. "has-footer": _ctx.showSummary
  203. },
  204. _ctx.ns.m(_ctx.tableSize),
  205. _ctx.className,
  206. _ctx.ns.b(),
  207. _ctx.ns.m(`layout-${_ctx.tableLayout}`)
  208. ]),
  209. style: vue.normalizeStyle(_ctx.style),
  210. "data-prefix": _ctx.ns.namespace.value,
  211. onMouseleave: _cache[1] || (_cache[1] = (...args) => _ctx.handleMouseLeave && _ctx.handleMouseLeave(...args))
  212. }, [
  213. vue.createElementVNode(
  214. "div",
  215. {
  216. ref: "tableInnerWrapper",
  217. class: vue.normalizeClass(_ctx.ns.e("inner-wrapper"))
  218. },
  219. [
  220. vue.createElementVNode(
  221. "div",
  222. _hoisted_2,
  223. [
  224. vue.renderSlot(_ctx.$slots, "default")
  225. ],
  226. 512
  227. ),
  228. _ctx.showHeader && _ctx.tableLayout === "fixed" ? vue.withDirectives((vue.openBlock(), vue.createElementBlock(
  229. "div",
  230. {
  231. key: 0,
  232. ref: "headerWrapper",
  233. class: vue.normalizeClass(_ctx.ns.e("header-wrapper"))
  234. },
  235. [
  236. vue.createElementVNode(
  237. "table",
  238. {
  239. ref: "tableHeader",
  240. class: vue.normalizeClass(_ctx.ns.e("header")),
  241. style: vue.normalizeStyle(_ctx.tableBodyStyles),
  242. border: "0",
  243. cellpadding: "0",
  244. cellspacing: "0"
  245. },
  246. [
  247. vue.createVNode(_component_hColgroup, {
  248. columns: _ctx.store.states.columns.value,
  249. "table-layout": _ctx.tableLayout
  250. }, null, 8, ["columns", "table-layout"]),
  251. vue.createVNode(_component_table_header, {
  252. ref: "tableHeaderRef",
  253. border: _ctx.border,
  254. "default-sort": _ctx.defaultSort,
  255. store: _ctx.store,
  256. "append-filter-panel-to": _ctx.appendFilterPanelTo,
  257. "allow-drag-last-column": _ctx.allowDragLastColumn,
  258. onSetDragVisible: _ctx.setDragVisible
  259. }, null, 8, ["border", "default-sort", "store", "append-filter-panel-to", "allow-drag-last-column", "onSetDragVisible"])
  260. ],
  261. 6
  262. )
  263. ],
  264. 2
  265. )), [
  266. [_directive_mousewheel, _ctx.handleHeaderFooterMousewheel]
  267. ]) : vue.createCommentVNode("v-if", true),
  268. vue.createElementVNode(
  269. "div",
  270. {
  271. ref: "bodyWrapper",
  272. class: vue.normalizeClass(_ctx.ns.e("body-wrapper"))
  273. },
  274. [
  275. vue.createVNode(_component_el_scrollbar, {
  276. ref: "scrollBarRef",
  277. "view-style": _ctx.scrollbarViewStyle,
  278. "wrap-style": _ctx.scrollbarStyle,
  279. always: _ctx.scrollbarAlwaysOn,
  280. tabindex: _ctx.scrollbarTabindex,
  281. native: _ctx.nativeScrollbar,
  282. onScroll: _cache[0] || (_cache[0] = ($event) => _ctx.$emit("scroll", $event))
  283. }, {
  284. default: vue.withCtx(() => [
  285. vue.createElementVNode(
  286. "table",
  287. {
  288. ref: "tableBody",
  289. class: vue.normalizeClass(_ctx.ns.e("body")),
  290. cellspacing: "0",
  291. cellpadding: "0",
  292. border: "0",
  293. style: vue.normalizeStyle({
  294. width: _ctx.bodyWidth,
  295. tableLayout: _ctx.tableLayout
  296. })
  297. },
  298. [
  299. vue.createVNode(_component_hColgroup, {
  300. columns: _ctx.store.states.columns.value,
  301. "table-layout": _ctx.tableLayout
  302. }, null, 8, ["columns", "table-layout"]),
  303. _ctx.showHeader && _ctx.tableLayout === "auto" ? (vue.openBlock(), vue.createBlock(_component_table_header, {
  304. key: 0,
  305. ref: "tableHeaderRef",
  306. class: vue.normalizeClass(_ctx.ns.e("body-header")),
  307. border: _ctx.border,
  308. "default-sort": _ctx.defaultSort,
  309. store: _ctx.store,
  310. "append-filter-panel-to": _ctx.appendFilterPanelTo,
  311. onSetDragVisible: _ctx.setDragVisible
  312. }, null, 8, ["class", "border", "default-sort", "store", "append-filter-panel-to", "onSetDragVisible"])) : vue.createCommentVNode("v-if", true),
  313. vue.createVNode(_component_table_body, {
  314. context: _ctx.context,
  315. highlight: _ctx.highlightCurrentRow,
  316. "row-class-name": _ctx.rowClassName,
  317. "tooltip-effect": _ctx.tooltipEffect,
  318. "tooltip-options": _ctx.tooltipOptions,
  319. "row-style": _ctx.rowStyle,
  320. store: _ctx.store,
  321. stripe: _ctx.stripe
  322. }, null, 8, ["context", "highlight", "row-class-name", "tooltip-effect", "tooltip-options", "row-style", "store", "stripe"]),
  323. _ctx.showSummary && _ctx.tableLayout === "auto" ? (vue.openBlock(), vue.createBlock(_component_table_footer, {
  324. key: 1,
  325. class: vue.normalizeClass(_ctx.ns.e("body-footer")),
  326. border: _ctx.border,
  327. "default-sort": _ctx.defaultSort,
  328. store: _ctx.store,
  329. "sum-text": _ctx.computedSumText,
  330. "summary-method": _ctx.summaryMethod
  331. }, null, 8, ["class", "border", "default-sort", "store", "sum-text", "summary-method"])) : vue.createCommentVNode("v-if", true)
  332. ],
  333. 6
  334. ),
  335. _ctx.isEmpty ? (vue.openBlock(), vue.createElementBlock(
  336. "div",
  337. {
  338. key: 0,
  339. ref: "emptyBlock",
  340. style: vue.normalizeStyle(_ctx.emptyBlockStyle),
  341. class: vue.normalizeClass(_ctx.ns.e("empty-block"))
  342. },
  343. [
  344. vue.createElementVNode(
  345. "span",
  346. {
  347. class: vue.normalizeClass(_ctx.ns.e("empty-text"))
  348. },
  349. [
  350. vue.renderSlot(_ctx.$slots, "empty", {}, () => [
  351. vue.createTextVNode(
  352. vue.toDisplayString(_ctx.computedEmptyText),
  353. 1
  354. )
  355. ])
  356. ],
  357. 2
  358. )
  359. ],
  360. 6
  361. )) : vue.createCommentVNode("v-if", true),
  362. _ctx.$slots.append ? (vue.openBlock(), vue.createElementBlock(
  363. "div",
  364. {
  365. key: 1,
  366. ref: "appendWrapper",
  367. class: vue.normalizeClass(_ctx.ns.e("append-wrapper"))
  368. },
  369. [
  370. vue.renderSlot(_ctx.$slots, "append")
  371. ],
  372. 2
  373. )) : vue.createCommentVNode("v-if", true)
  374. ]),
  375. _: 3
  376. }, 8, ["view-style", "wrap-style", "always", "tabindex", "native"])
  377. ],
  378. 2
  379. ),
  380. _ctx.showSummary && _ctx.tableLayout === "fixed" ? vue.withDirectives((vue.openBlock(), vue.createElementBlock(
  381. "div",
  382. {
  383. key: 1,
  384. ref: "footerWrapper",
  385. class: vue.normalizeClass(_ctx.ns.e("footer-wrapper"))
  386. },
  387. [
  388. vue.createElementVNode(
  389. "table",
  390. {
  391. class: vue.normalizeClass(_ctx.ns.e("footer")),
  392. cellspacing: "0",
  393. cellpadding: "0",
  394. border: "0",
  395. style: vue.normalizeStyle(_ctx.tableBodyStyles)
  396. },
  397. [
  398. vue.createVNode(_component_hColgroup, {
  399. columns: _ctx.store.states.columns.value,
  400. "table-layout": _ctx.tableLayout
  401. }, null, 8, ["columns", "table-layout"]),
  402. vue.createVNode(_component_table_footer, {
  403. border: _ctx.border,
  404. "default-sort": _ctx.defaultSort,
  405. store: _ctx.store,
  406. "sum-text": _ctx.computedSumText,
  407. "summary-method": _ctx.summaryMethod
  408. }, null, 8, ["border", "default-sort", "store", "sum-text", "summary-method"])
  409. ],
  410. 6
  411. )
  412. ],
  413. 2
  414. )), [
  415. [vue.vShow, !_ctx.isEmpty],
  416. [_directive_mousewheel, _ctx.handleHeaderFooterMousewheel]
  417. ]) : vue.createCommentVNode("v-if", true),
  418. _ctx.border || _ctx.isGroup ? (vue.openBlock(), vue.createElementBlock(
  419. "div",
  420. {
  421. key: 2,
  422. class: vue.normalizeClass(_ctx.ns.e("border-left-patch"))
  423. },
  424. null,
  425. 2
  426. )) : vue.createCommentVNode("v-if", true)
  427. ],
  428. 2
  429. ),
  430. vue.withDirectives(vue.createElementVNode(
  431. "div",
  432. {
  433. ref: "resizeProxy",
  434. class: vue.normalizeClass(_ctx.ns.e("column-resize-proxy"))
  435. },
  436. null,
  437. 2
  438. ), [
  439. [vue.vShow, _ctx.resizeProxyVisible]
  440. ])
  441. ], 46, _hoisted_1);
  442. }
  443. var Table = /* @__PURE__ */ pluginVue_exportHelper["default"](_sfc_main, [["render", _sfc_render], ["__file", "/home/runner/work/element-plus/element-plus/packages/components/table/src/table.vue"]]);
  444. exports["default"] = Table;
  445. //# sourceMappingURL=table.js.map