@scenetechnology/cj_iview_table 0.0.67 → 0.0.68

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -61,10 +61,12 @@ cj_iview_table 是一个功能强大的表格组件,支持筛选、排序、
61
61
  | height | String | - | 表格高度 |
62
62
  | maxHeight | String | - | 最大高度 |
63
63
  | toolBar | Array/Boolean | true | 工具栏配置 |
64
- | defaultSize | Number | - | 默认分页大小 |
65
- | filterGridSpan | Number | 6 | 筛选栏栅格跨度 |
66
- | filterLabelWidth | Number | 80 | 筛选标签宽度 |
67
- | fields | Array | [] | 导出数据时需要包含的属性名 |
64
+ | defaultSize | Number | - | 默认分页大小 |
65
+ | rowKey | String/Boolean | id | 开启跨分页保留选中时使用的唯一键,支持如 `id`、`user.id` |
66
+ | reserveSelection | Boolean | false | 是否保留跨分页、跨筛选/搜索的多选结果 |
67
+ | filterGridSpan | Number | 6 | 筛选栏栅格跨度 |
68
+ | filterLabelWidth | Number | 80 | 筛选标签宽度 |
69
+ | fields | Array | [] | 导出数据时需要包含的属性名 |
68
70
 
69
71
  ### 列配置项
70
72
  每个column支持以下属性:
@@ -81,9 +83,11 @@ cj_iview_table 是一个功能强大的表格组件,支持筛选、排序、
81
83
  | slot | Boolean | 是否使用自定义插槽 |
82
84
 
83
85
  ## 事件
84
- | 事件名 | 说明 | 回调参数 |
85
- |--------|------|----------|
86
- | on-change | 分页、排序等变化时触发 | (pagination, filters, sorter) |
86
+ | 事件名 | 说明 | 回调参数 |
87
+ |--------|------|----------|
88
+ | on-change | 分页、排序等变化时触发 | (pagination, filters, sorter) |
89
+ | on-selection-change | 当前页选中项变化时触发 | (selection) |
90
+ | on-reserve-selection-change | 开启 `reserveSelection` 后,所有已保留选中项变化时触发 | (selection) |
87
91
 
88
92
  ## 插槽
89
93
  | 插槽名 | 说明 |
@@ -105,10 +109,28 @@ cj_iview_table 是一个功能强大的表格组件,支持筛选、排序、
105
109
  - 列排序
106
110
  - 列固定
107
111
 
108
- ### 3. 数据请求
109
- 支持两种数据加载方式:
110
- - 通过data属性直接传入数据
111
- - 通过request函数异步加载数据
112
+ ### 3. 数据请求
113
+ 支持两种数据加载方式:
114
+ - 通过data属性直接传入数据
115
+ - 通过request函数异步加载数据
116
+
117
+ ### 4. 跨分页保留选中
118
+ 当表格包含 `type: 'selection'` 列时,可通过 `reserveSelection` 开启跨分页、跨搜索/筛选保留勾选。
119
+
120
+ ```vue
121
+ <cj_iview_table
122
+ :columns="columns"
123
+ :request="loadData"
124
+ row-key="id"
125
+ :reserveSelection="true"
126
+ @on-reserve-selection-change="handleSelectionChange"
127
+ />
128
+ ```
129
+
130
+ 说明:
131
+ - `rowKey` 必须能唯一标识一行数据,支持多级路径,例如 `user.id`
132
+ - `on-selection-change` 返回的是当前页选中项
133
+ - `on-reserve-selection-change` 返回的是所有分页/筛选范围内累计保留的选中项
112
134
 
113
135
  ## 使用示例
114
136
 
@@ -21021,6 +21021,46 @@ module.exports = function (name) {
21021
21021
  };
21022
21022
 
21023
21023
 
21024
+ /***/ }),
21025
+
21026
+ /***/ 8237:
21027
+ /***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {
21028
+
21029
+ "use strict";
21030
+
21031
+ var $ = __webpack_require__(6518);
21032
+ var iterate = __webpack_require__(2652);
21033
+ var aCallable = __webpack_require__(9306);
21034
+ var anObject = __webpack_require__(8551);
21035
+ var getIteratorDirect = __webpack_require__(1767);
21036
+
21037
+ var $TypeError = TypeError;
21038
+
21039
+ // `Iterator.prototype.reduce` method
21040
+ // https://tc39.es/ecma262/#sec-iterator.prototype.reduce
21041
+ $({ target: 'Iterator', proto: true, real: true }, {
21042
+ reduce: function reduce(reducer /* , initialValue */) {
21043
+ anObject(this);
21044
+ aCallable(reducer);
21045
+ var record = getIteratorDirect(this);
21046
+ var noInitial = arguments.length < 2;
21047
+ var accumulator = noInitial ? undefined : arguments[1];
21048
+ var counter = 0;
21049
+ iterate(record, function (value) {
21050
+ if (noInitial) {
21051
+ noInitial = false;
21052
+ accumulator = value;
21053
+ } else {
21054
+ accumulator = reducer(accumulator, value, counter);
21055
+ }
21056
+ counter++;
21057
+ }, { IS_RECORD: true });
21058
+ if (noInitial) throw new $TypeError('Reduce of empty iterator with no initial value');
21059
+ return accumulator;
21060
+ }
21061
+ });
21062
+
21063
+
21024
21064
  /***/ }),
21025
21065
 
21026
21066
  /***/ 8469:
@@ -25759,7 +25799,7 @@ if (typeof window !== 'undefined') {
25759
25799
  // Indicate to webpack that this file can be concatenated
25760
25800
  /* harmony default export */ var setPublicPath = (null);
25761
25801
 
25762
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/babel-loader/lib/index.js!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./packages/components/index.vue?vue&type=template&id=694727b8&scoped=true
25802
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/babel-loader/lib/index.js!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./packages/components/index.vue?vue&type=template&id=514a3b03&scoped=true
25763
25803
  var render = function render() {
25764
25804
  var _vm = this,
25765
25805
  _c = _vm._self._c;
@@ -26151,6 +26191,7 @@ var render = function render() {
26151
26191
  ref: "selection",
26152
26192
  attrs: {
26153
26193
  "border": _vm.border,
26194
+ "row-key": _vm.tableRowKey,
26154
26195
  "columns": _vm.tableColumns,
26155
26196
  "loading": _vm.tableLoading,
26156
26197
  "data": _vm.dataSource,
@@ -26242,6 +26283,8 @@ var es_iterator_find = __webpack_require__(116);
26242
26283
  var es_iterator_for_each = __webpack_require__(7588);
26243
26284
  // EXTERNAL MODULE: ./node_modules/core-js/modules/es.iterator.map.js
26244
26285
  var es_iterator_map = __webpack_require__(1701);
26286
+ // EXTERNAL MODULE: ./node_modules/core-js/modules/es.iterator.reduce.js
26287
+ var es_iterator_reduce = __webpack_require__(8237);
26245
26288
  // EXTERNAL MODULE: ./node_modules/core-js/modules/es.iterator.some.js
26246
26289
  var es_iterator_some = __webpack_require__(3579);
26247
26290
  // EXTERNAL MODULE: ./node_modules/core-js/modules/es.set.difference.v2.js
@@ -36362,6 +36405,8 @@ var vue_treeselect_cjs_default = /*#__PURE__*/__webpack_require__.n(vue_treesele
36362
36405
 
36363
36406
 
36364
36407
 
36408
+
36409
+
36365
36410
 
36366
36411
 
36367
36412
 
@@ -36461,6 +36506,14 @@ var vue_treeselect_cjs_default = /*#__PURE__*/__webpack_require__.n(vue_treesele
36461
36506
  type: Object,
36462
36507
  required: false
36463
36508
  },
36509
+ rowKey: {
36510
+ type: [String, Boolean],
36511
+ default: 'id'
36512
+ },
36513
+ reserveSelection: {
36514
+ type: Boolean,
36515
+ default: false
36516
+ },
36464
36517
  // 请求-获取数据
36465
36518
  request: {
36466
36519
  type: Function,
@@ -36497,6 +36550,8 @@ var vue_treeselect_cjs_default = /*#__PURE__*/__webpack_require__.n(vue_treesele
36497
36550
  filterCount: 0,
36498
36551
  // 选中的数据
36499
36552
  selectionItems: [],
36553
+ reserveSelectionMap: {},
36554
+ isRestoringSelection: false,
36500
36555
  defToolBar: [{
36501
36556
  text: '新增',
36502
36557
  type: 'primary'
@@ -36887,6 +36942,12 @@ var vue_treeselect_cjs_default = /*#__PURE__*/__webpack_require__.n(vue_treesele
36887
36942
  */
36888
36943
  formKey() {
36889
36944
  return item => item.as ? item.as : item.key;
36945
+ },
36946
+ tableRowKey() {
36947
+ if (!this.reserveSelection) {
36948
+ return false;
36949
+ }
36950
+ return this.rowKey || false;
36890
36951
  }
36891
36952
  },
36892
36953
  watch: {
@@ -36925,11 +36986,113 @@ var vue_treeselect_cjs_default = /*#__PURE__*/__webpack_require__.n(vue_treesele
36925
36986
  this.page.total = newVal;
36926
36987
  }
36927
36988
  },
36989
+ dataSource() {
36990
+ if (this.shouldReserveSelection()) {
36991
+ this.queueRestoreSelection();
36992
+ }
36993
+ },
36928
36994
  requestParams() {
36929
36995
  this.reload();
36930
36996
  }
36931
36997
  },
36932
36998
  methods: {
36999
+ hasValidRowKey(value) {
37000
+ return value !== undefined && value !== null && value !== '';
37001
+ },
37002
+ getRowIdentity(row) {
37003
+ if (!row || !this.rowKey || typeof this.rowKey !== 'string') {
37004
+ return undefined;
37005
+ }
37006
+ return this.rowKey.split('.').reduce((result, key) => {
37007
+ return result == null ? undefined : result[key];
37008
+ }, row);
37009
+ },
37010
+ shouldReserveSelection() {
37011
+ return this.reserveSelection && this.columns.some(item => item.type === 'selection') && typeof this.rowKey === 'string' && this.rowKey !== '';
37012
+ },
37013
+ setReserveSelectionMap(nextMap) {
37014
+ this.reserveSelectionMap = nextMap;
37015
+ this.selectionItems = Object.values(nextMap);
37016
+ },
37017
+ syncReserveSelection(selectionItems = []) {
37018
+ if (!this.shouldReserveSelection()) {
37019
+ this.selectionItems = selectionItems;
37020
+ return;
37021
+ }
37022
+ const nextMap = {
37023
+ ...this.reserveSelectionMap
37024
+ };
37025
+ const pageKeys = [];
37026
+ this.dataSource.forEach(row => {
37027
+ const rowKey = this.getRowIdentity(row);
37028
+ if (this.hasValidRowKey(rowKey)) {
37029
+ pageKeys.push(String(rowKey));
37030
+ }
37031
+ });
37032
+ pageKeys.forEach(key => {
37033
+ delete nextMap[key];
37034
+ });
37035
+ selectionItems.forEach(row => {
37036
+ const rowKey = this.getRowIdentity(row);
37037
+ if (this.hasValidRowKey(rowKey)) {
37038
+ nextMap[String(rowKey)] = row;
37039
+ }
37040
+ });
37041
+ this.setReserveSelectionMap(nextMap);
37042
+ },
37043
+ getCurrentTableSelection() {
37044
+ const tableRef = this.$refs.selection;
37045
+ if (tableRef && typeof tableRef.getSelection === 'function') {
37046
+ return tableRef.getSelection();
37047
+ }
37048
+ return [];
37049
+ },
37050
+ queueRestoreSelection() {
37051
+ this.$nextTick(() => {
37052
+ this.restoreSelection();
37053
+ });
37054
+ },
37055
+ restoreSelection() {
37056
+ if (!this.shouldReserveSelection()) {
37057
+ return;
37058
+ }
37059
+ const tableRef = this.$refs.selection;
37060
+ if (!tableRef || typeof tableRef.toggleSelect !== 'function') {
37061
+ return;
37062
+ }
37063
+ const selectedKeys = new Set(Object.keys(this.reserveSelectionMap));
37064
+ if (selectedKeys.size === 0) {
37065
+ return;
37066
+ }
37067
+ const currentSelection = this.getCurrentTableSelection();
37068
+ const currentSelectionKeys = new Set(currentSelection.map(row => this.getRowIdentity(row)).filter(rowKey => this.hasValidRowKey(rowKey)).map(rowKey => String(rowKey)));
37069
+ this.isRestoringSelection = true;
37070
+ this.dataSource.forEach((row, index) => {
37071
+ const rowKey = this.getRowIdentity(row);
37072
+ if (!this.hasValidRowKey(rowKey)) {
37073
+ return;
37074
+ }
37075
+ const normalizedKey = String(rowKey);
37076
+ const shouldBeSelected = selectedKeys.has(normalizedKey);
37077
+ const isSelected = currentSelectionKeys.has(normalizedKey);
37078
+ if (shouldBeSelected !== isSelected) {
37079
+ tableRef.toggleSelect(index, rowKey);
37080
+ }
37081
+ });
37082
+ this.$nextTick(() => {
37083
+ this.isRestoringSelection = false;
37084
+ });
37085
+ },
37086
+ clearReserveSelection() {
37087
+ this.setReserveSelectionMap({});
37088
+ const selectedRowKeys = new Set(this.getCurrentTableSelection().map(row => this.getRowIdentity(row)).filter(rowKey => this.hasValidRowKey(rowKey)).map(rowKey => String(rowKey)));
37089
+ this.dataSource.forEach((row, index) => {
37090
+ const rowKey = this.getRowIdentity(row);
37091
+ if (this.hasValidRowKey(rowKey) && selectedRowKeys.has(String(rowKey)) && this.$refs.selection && typeof this.$refs.selection.toggleSelect === 'function') {
37092
+ this.$refs.selection.toggleSelect(index, rowKey);
37093
+ }
37094
+ });
37095
+ },
36933
37096
  isJsonString(str) {
36934
37097
  if (typeof str !== 'string') return false;
36935
37098
  try {
@@ -37256,7 +37419,15 @@ var vue_treeselect_cjs_default = /*#__PURE__*/__webpack_require__.n(vue_treesele
37256
37419
  * @param {*} selectionItems
37257
37420
  */
37258
37421
  onSelectionChange(selectionItems) {
37259
- this.selectionItems = selectionItems;
37422
+ if (this.shouldReserveSelection()) {
37423
+ this.syncReserveSelection(selectionItems);
37424
+ if (this.isRestoringSelection) {
37425
+ return;
37426
+ }
37427
+ this.$emit('on-reserve-selection-change', this.selectionItems);
37428
+ } else {
37429
+ this.selectionItems = selectionItems;
37430
+ }
37260
37431
  // 向父组件发射选择变化事件
37261
37432
  this.$emit('on-selection-change', selectionItems);
37262
37433
  },
@@ -37372,7 +37543,7 @@ var vue_treeselect_cjs_default = /*#__PURE__*/__webpack_require__.n(vue_treesele
37372
37543
  * 刷新
37373
37544
  */
37374
37545
  reload() {
37375
- if (this.selectionItems.length > 0) {
37546
+ if (!this.shouldReserveSelection() && this.selectionItems.length > 0) {
37376
37547
  this.selectionItems.length = 0;
37377
37548
  }
37378
37549
  this.getDataSource();
@@ -37926,15 +38097,15 @@ var vue_treeselect_cjs_default = /*#__PURE__*/__webpack_require__.n(vue_treesele
37926
38097
  });
37927
38098
  ;// ./packages/components/index.vue?vue&type=script&lang=js
37928
38099
  /* harmony default export */ var packages_componentsvue_type_script_lang_js = (componentsvue_type_script_lang_js);
37929
- ;// ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-32.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-32.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-32.use[2]!./node_modules/less-loader/dist/cjs.js??clonedRuleSet-32.use[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./packages/components/index.vue?vue&type=style&index=0&id=694727b8&prod&scoped=true&lang=less
38100
+ ;// ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-32.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-32.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-32.use[2]!./node_modules/less-loader/dist/cjs.js??clonedRuleSet-32.use[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./packages/components/index.vue?vue&type=style&index=0&id=514a3b03&prod&scoped=true&lang=less
37930
38101
  // extracted by mini-css-extract-plugin
37931
38102
 
37932
- ;// ./packages/components/index.vue?vue&type=style&index=0&id=694727b8&prod&scoped=true&lang=less
38103
+ ;// ./packages/components/index.vue?vue&type=style&index=0&id=514a3b03&prod&scoped=true&lang=less
37933
38104
 
37934
- ;// ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-12.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./packages/components/index.vue?vue&type=style&index=1&id=694727b8&prod&lang=css
38105
+ ;// ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-12.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./packages/components/index.vue?vue&type=style&index=1&id=514a3b03&prod&lang=css
37935
38106
  // extracted by mini-css-extract-plugin
37936
38107
 
37937
- ;// ./packages/components/index.vue?vue&type=style&index=1&id=694727b8&prod&lang=css
38108
+ ;// ./packages/components/index.vue?vue&type=style&index=1&id=514a3b03&prod&lang=css
37938
38109
 
37939
38110
  ;// ./packages/components/index.vue
37940
38111
 
@@ -37952,7 +38123,7 @@ var components_component = normalizeComponent(
37952
38123
  staticRenderFns,
37953
38124
  false,
37954
38125
  null,
37955
- "694727b8",
38126
+ "514a3b03",
37956
38127
  null
37957
38128
 
37958
38129
  )