watcher.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445
  1. 'use strict';
  2. Object.defineProperty(exports, '__esModule', { value: true });
  3. var vue = require('vue');
  4. require('../../../../utils/index.js');
  5. var util = require('../util.js');
  6. var expand = require('./expand.js');
  7. var current = require('./current.js');
  8. var tree = require('./tree.js');
  9. var shared = require('@vue/shared');
  10. const sortData = (data, states) => {
  11. const sortingColumn = states.sortingColumn;
  12. if (!sortingColumn || typeof sortingColumn.sortable === "string") {
  13. return data;
  14. }
  15. return util.orderBy(data, states.sortProp, states.sortOrder, sortingColumn.sortMethod, sortingColumn.sortBy);
  16. };
  17. const doFlattenColumns = (columns) => {
  18. const result = [];
  19. columns.forEach((column) => {
  20. if (column.children) {
  21. result.push.apply(result, doFlattenColumns(column.children));
  22. } else {
  23. result.push(column);
  24. }
  25. });
  26. return result;
  27. };
  28. function useWatcher() {
  29. var _a;
  30. const instance = vue.getCurrentInstance();
  31. const { size: tableSize } = vue.toRefs((_a = instance.proxy) == null ? void 0 : _a.$props);
  32. const rowKey = vue.ref(null);
  33. const data = vue.ref([]);
  34. const _data = vue.ref([]);
  35. const isComplex = vue.ref(false);
  36. const _columns = vue.ref([]);
  37. const originColumns = vue.ref([]);
  38. const columns = vue.ref([]);
  39. const fixedColumns = vue.ref([]);
  40. const rightFixedColumns = vue.ref([]);
  41. const leafColumns = vue.ref([]);
  42. const fixedLeafColumns = vue.ref([]);
  43. const rightFixedLeafColumns = vue.ref([]);
  44. const leafColumnsLength = vue.ref(0);
  45. const fixedLeafColumnsLength = vue.ref(0);
  46. const rightFixedLeafColumnsLength = vue.ref(0);
  47. const isAllSelected = vue.ref(false);
  48. const selection = vue.ref([]);
  49. const reserveSelection = vue.ref(false);
  50. const selectOnIndeterminate = vue.ref(false);
  51. const selectable = vue.ref(null);
  52. const filters = vue.ref({});
  53. const filteredData = vue.ref(null);
  54. const sortingColumn = vue.ref(null);
  55. const sortProp = vue.ref(null);
  56. const sortOrder = vue.ref(null);
  57. const hoverRow = vue.ref(null);
  58. vue.watch(data, () => instance.state && scheduleLayout(false), {
  59. deep: true
  60. });
  61. const assertRowKey = () => {
  62. if (!rowKey.value)
  63. throw new Error("[ElTable] prop row-key is required");
  64. };
  65. const updateChildFixed = (column) => {
  66. var _a2;
  67. (_a2 = column.children) == null ? void 0 : _a2.forEach((childColumn) => {
  68. childColumn.fixed = column.fixed;
  69. updateChildFixed(childColumn);
  70. });
  71. };
  72. const updateColumns = () => {
  73. _columns.value.forEach((column) => {
  74. updateChildFixed(column);
  75. });
  76. fixedColumns.value = _columns.value.filter((column) => column.fixed === true || column.fixed === "left");
  77. rightFixedColumns.value = _columns.value.filter((column) => column.fixed === "right");
  78. if (fixedColumns.value.length > 0 && _columns.value[0] && _columns.value[0].type === "selection" && !_columns.value[0].fixed) {
  79. _columns.value[0].fixed = true;
  80. fixedColumns.value.unshift(_columns.value[0]);
  81. }
  82. const notFixedColumns = _columns.value.filter((column) => !column.fixed);
  83. originColumns.value = [].concat(fixedColumns.value).concat(notFixedColumns).concat(rightFixedColumns.value);
  84. const leafColumns2 = doFlattenColumns(notFixedColumns);
  85. const fixedLeafColumns2 = doFlattenColumns(fixedColumns.value);
  86. const rightFixedLeafColumns2 = doFlattenColumns(rightFixedColumns.value);
  87. leafColumnsLength.value = leafColumns2.length;
  88. fixedLeafColumnsLength.value = fixedLeafColumns2.length;
  89. rightFixedLeafColumnsLength.value = rightFixedLeafColumns2.length;
  90. columns.value = [].concat(fixedLeafColumns2).concat(leafColumns2).concat(rightFixedLeafColumns2);
  91. isComplex.value = fixedColumns.value.length > 0 || rightFixedColumns.value.length > 0;
  92. };
  93. const scheduleLayout = (needUpdateColumns, immediate = false) => {
  94. if (needUpdateColumns) {
  95. updateColumns();
  96. }
  97. if (immediate) {
  98. instance.state.doLayout();
  99. } else {
  100. instance.state.debouncedUpdateLayout();
  101. }
  102. };
  103. const isSelected = (row) => {
  104. return selection.value.includes(row);
  105. };
  106. const clearSelection = () => {
  107. isAllSelected.value = false;
  108. const oldSelection = selection.value;
  109. if (oldSelection.length) {
  110. selection.value = [];
  111. instance.emit("selection-change", []);
  112. }
  113. };
  114. const cleanSelection = () => {
  115. let deleted;
  116. if (rowKey.value) {
  117. deleted = [];
  118. const selectedMap = util.getKeysMap(selection.value, rowKey.value);
  119. const dataMap = util.getKeysMap(data.value, rowKey.value);
  120. for (const key in selectedMap) {
  121. if (shared.hasOwn(selectedMap, key) && !dataMap[key]) {
  122. deleted.push(selectedMap[key].row);
  123. }
  124. }
  125. } else {
  126. deleted = selection.value.filter((item) => !data.value.includes(item));
  127. }
  128. if (deleted.length) {
  129. const newSelection = selection.value.filter((item) => !deleted.includes(item));
  130. selection.value = newSelection;
  131. instance.emit("selection-change", newSelection.slice());
  132. }
  133. };
  134. const getSelectionRows = () => {
  135. return (selection.value || []).slice();
  136. };
  137. const toggleRowSelection = (row, selected = void 0, emitChange = true) => {
  138. const changed = util.toggleRowStatus(selection.value, row, selected);
  139. if (changed) {
  140. const newSelection = (selection.value || []).slice();
  141. if (emitChange) {
  142. instance.emit("select", newSelection, row);
  143. }
  144. instance.emit("selection-change", newSelection);
  145. }
  146. };
  147. const _toggleAllSelection = () => {
  148. var _a2, _b;
  149. const value = selectOnIndeterminate.value ? !isAllSelected.value : !(isAllSelected.value || selection.value.length);
  150. isAllSelected.value = value;
  151. let selectionChanged = false;
  152. let childrenCount = 0;
  153. const rowKey2 = (_b = (_a2 = instance == null ? void 0 : instance.store) == null ? void 0 : _a2.states) == null ? void 0 : _b.rowKey.value;
  154. data.value.forEach((row, index) => {
  155. const rowIndex = index + childrenCount;
  156. if (selectable.value) {
  157. if (selectable.value.call(null, row, rowIndex) && util.toggleRowStatus(selection.value, row, value)) {
  158. selectionChanged = true;
  159. }
  160. } else {
  161. if (util.toggleRowStatus(selection.value, row, value)) {
  162. selectionChanged = true;
  163. }
  164. }
  165. childrenCount += getChildrenCount(util.getRowIdentity(row, rowKey2));
  166. });
  167. if (selectionChanged) {
  168. instance.emit("selection-change", selection.value ? selection.value.slice() : []);
  169. }
  170. instance.emit("select-all", selection.value);
  171. };
  172. const updateSelectionByRowKey = () => {
  173. const selectedMap = util.getKeysMap(selection.value, rowKey.value);
  174. data.value.forEach((row) => {
  175. const rowId = util.getRowIdentity(row, rowKey.value);
  176. const rowInfo = selectedMap[rowId];
  177. if (rowInfo) {
  178. selection.value[rowInfo.index] = row;
  179. }
  180. });
  181. };
  182. const updateAllSelected = () => {
  183. var _a2, _b, _c;
  184. if (((_a2 = data.value) == null ? void 0 : _a2.length) === 0) {
  185. isAllSelected.value = false;
  186. return;
  187. }
  188. let selectedMap;
  189. if (rowKey.value) {
  190. selectedMap = util.getKeysMap(selection.value, rowKey.value);
  191. }
  192. const isSelected2 = function(row) {
  193. if (selectedMap) {
  194. return !!selectedMap[util.getRowIdentity(row, rowKey.value)];
  195. } else {
  196. return selection.value.includes(row);
  197. }
  198. };
  199. let isAllSelected_ = true;
  200. let selectedCount = 0;
  201. let childrenCount = 0;
  202. for (let i = 0, j = (data.value || []).length; i < j; i++) {
  203. const keyProp = (_c = (_b = instance == null ? void 0 : instance.store) == null ? void 0 : _b.states) == null ? void 0 : _c.rowKey.value;
  204. const rowIndex = i + childrenCount;
  205. const item = data.value[i];
  206. const isRowSelectable = selectable.value && selectable.value.call(null, item, rowIndex);
  207. if (!isSelected2(item)) {
  208. if (!selectable.value || isRowSelectable) {
  209. isAllSelected_ = false;
  210. break;
  211. }
  212. } else {
  213. selectedCount++;
  214. }
  215. childrenCount += getChildrenCount(util.getRowIdentity(item, keyProp));
  216. }
  217. if (selectedCount === 0)
  218. isAllSelected_ = false;
  219. isAllSelected.value = isAllSelected_;
  220. };
  221. const getChildrenCount = (rowKey2) => {
  222. var _a2;
  223. if (!instance || !instance.store)
  224. return 0;
  225. const { treeData } = instance.store.states;
  226. let count = 0;
  227. const children = (_a2 = treeData.value[rowKey2]) == null ? void 0 : _a2.children;
  228. if (children) {
  229. count += children.length;
  230. children.forEach((childKey) => {
  231. count += getChildrenCount(childKey);
  232. });
  233. }
  234. return count;
  235. };
  236. const updateFilters = (columns2, values) => {
  237. if (!Array.isArray(columns2)) {
  238. columns2 = [columns2];
  239. }
  240. const filters_ = {};
  241. columns2.forEach((col) => {
  242. filters.value[col.id] = values;
  243. filters_[col.columnKey || col.id] = values;
  244. });
  245. return filters_;
  246. };
  247. const updateSort = (column, prop, order) => {
  248. if (sortingColumn.value && sortingColumn.value !== column) {
  249. sortingColumn.value.order = null;
  250. }
  251. sortingColumn.value = column;
  252. sortProp.value = prop;
  253. sortOrder.value = order;
  254. };
  255. const execFilter = () => {
  256. let sourceData = vue.unref(_data);
  257. Object.keys(filters.value).forEach((columnId) => {
  258. const values = filters.value[columnId];
  259. if (!values || values.length === 0)
  260. return;
  261. const column = util.getColumnById({
  262. columns: columns.value
  263. }, columnId);
  264. if (column && column.filterMethod) {
  265. sourceData = sourceData.filter((row) => {
  266. return values.some((value) => column.filterMethod.call(null, value, row, column));
  267. });
  268. }
  269. });
  270. filteredData.value = sourceData;
  271. };
  272. const execSort = () => {
  273. data.value = sortData(filteredData.value, {
  274. sortingColumn: sortingColumn.value,
  275. sortProp: sortProp.value,
  276. sortOrder: sortOrder.value
  277. });
  278. };
  279. const execQuery = (ignore = void 0) => {
  280. if (!(ignore && ignore.filter)) {
  281. execFilter();
  282. }
  283. execSort();
  284. };
  285. const clearFilter = (columnKeys) => {
  286. const { tableHeaderRef } = instance.refs;
  287. if (!tableHeaderRef)
  288. return;
  289. const panels = Object.assign({}, tableHeaderRef.filterPanels);
  290. const keys = Object.keys(panels);
  291. if (!keys.length)
  292. return;
  293. if (typeof columnKeys === "string") {
  294. columnKeys = [columnKeys];
  295. }
  296. if (Array.isArray(columnKeys)) {
  297. const columns_ = columnKeys.map((key) => util.getColumnByKey({
  298. columns: columns.value
  299. }, key));
  300. keys.forEach((key) => {
  301. const column = columns_.find((col) => col.id === key);
  302. if (column) {
  303. column.filteredValue = [];
  304. }
  305. });
  306. instance.store.commit("filterChange", {
  307. column: columns_,
  308. values: [],
  309. silent: true,
  310. multi: true
  311. });
  312. } else {
  313. keys.forEach((key) => {
  314. const column = columns.value.find((col) => col.id === key);
  315. if (column) {
  316. column.filteredValue = [];
  317. }
  318. });
  319. filters.value = {};
  320. instance.store.commit("filterChange", {
  321. column: {},
  322. values: [],
  323. silent: true
  324. });
  325. }
  326. };
  327. const clearSort = () => {
  328. if (!sortingColumn.value)
  329. return;
  330. updateSort(null, null, null);
  331. instance.store.commit("changeSortCondition", {
  332. silent: true
  333. });
  334. };
  335. const {
  336. setExpandRowKeys,
  337. toggleRowExpansion,
  338. updateExpandRows,
  339. states: expandStates,
  340. isRowExpanded
  341. } = expand["default"]({
  342. data,
  343. rowKey
  344. });
  345. const {
  346. updateTreeExpandKeys,
  347. toggleTreeExpansion,
  348. updateTreeData,
  349. loadOrToggle,
  350. states: treeStates
  351. } = tree["default"]({
  352. data,
  353. rowKey
  354. });
  355. const {
  356. updateCurrentRowData,
  357. updateCurrentRow,
  358. setCurrentRowKey,
  359. states: currentData
  360. } = current["default"]({
  361. data,
  362. rowKey
  363. });
  364. const setExpandRowKeysAdapter = (val) => {
  365. setExpandRowKeys(val);
  366. updateTreeExpandKeys(val);
  367. };
  368. const toggleRowExpansionAdapter = (row, expanded) => {
  369. const hasExpandColumn = columns.value.some(({ type }) => type === "expand");
  370. if (hasExpandColumn) {
  371. toggleRowExpansion(row, expanded);
  372. } else {
  373. toggleTreeExpansion(row, expanded);
  374. }
  375. };
  376. return {
  377. assertRowKey,
  378. updateColumns,
  379. scheduleLayout,
  380. isSelected,
  381. clearSelection,
  382. cleanSelection,
  383. getSelectionRows,
  384. toggleRowSelection,
  385. _toggleAllSelection,
  386. toggleAllSelection: null,
  387. updateSelectionByRowKey,
  388. updateAllSelected,
  389. updateFilters,
  390. updateCurrentRow,
  391. updateSort,
  392. execFilter,
  393. execSort,
  394. execQuery,
  395. clearFilter,
  396. clearSort,
  397. toggleRowExpansion,
  398. setExpandRowKeysAdapter,
  399. setCurrentRowKey,
  400. toggleRowExpansionAdapter,
  401. isRowExpanded,
  402. updateExpandRows,
  403. updateCurrentRowData,
  404. loadOrToggle,
  405. updateTreeData,
  406. states: {
  407. tableSize,
  408. rowKey,
  409. data,
  410. _data,
  411. isComplex,
  412. _columns,
  413. originColumns,
  414. columns,
  415. fixedColumns,
  416. rightFixedColumns,
  417. leafColumns,
  418. fixedLeafColumns,
  419. rightFixedLeafColumns,
  420. leafColumnsLength,
  421. fixedLeafColumnsLength,
  422. rightFixedLeafColumnsLength,
  423. isAllSelected,
  424. selection,
  425. reserveSelection,
  426. selectOnIndeterminate,
  427. selectable,
  428. filters,
  429. filteredData,
  430. sortingColumn,
  431. sortProp,
  432. sortOrder,
  433. hoverRow,
  434. ...expandStates,
  435. ...treeStates,
  436. ...currentData
  437. }
  438. };
  439. }
  440. exports["default"] = useWatcher;
  441. //# sourceMappingURL=watcher.js.map