@scenetechnology/cj_iview_table 0.0.68 → 0.0.70

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,12 +61,14 @@ cj_iview_table 是一个功能强大的表格组件,支持筛选、排序、
61
61
  | height | String | - | 表格高度 |
62
62
  | maxHeight | String | - | 最大高度 |
63
63
  | toolBar | Array/Boolean | true | 工具栏配置 |
64
- | defaultSize | Number | - | 默认分页大小 |
64
+ | defaultSize | Number | - | 默认分页大小 |
65
65
  | rowKey | String/Boolean | id | 开启跨分页保留选中时使用的唯一键,支持如 `id`、`user.id` |
66
+ | selectedRowKeys | Array | [] | 外部传入的已选 rowKey 列表,可用于页面返回后恢复勾选 |
67
+ | selectedRows | Array | [] | 外部传入的已选完整行数据,用于页面返回后直接恢复完整提交数据 |
66
68
  | reserveSelection | Boolean | false | 是否保留跨分页、跨筛选/搜索的多选结果 |
67
- | filterGridSpan | Number | 6 | 筛选栏栅格跨度 |
68
- | filterLabelWidth | Number | 80 | 筛选标签宽度 |
69
- | fields | Array | [] | 导出数据时需要包含的属性名 |
69
+ | filterGridSpan | Number | 6 | 筛选栏栅格跨度 |
70
+ | filterLabelWidth | Number | 80 | 筛选标签宽度 |
71
+ | fields | Array | [] | 导出数据时需要包含的属性名 |
70
72
 
71
73
  ### 列配置项
72
74
  每个column支持以下属性:
@@ -83,11 +85,12 @@ cj_iview_table 是一个功能强大的表格组件,支持筛选、排序、
83
85
  | slot | Boolean | 是否使用自定义插槽 |
84
86
 
85
87
  ## 事件
86
- | 事件名 | 说明 | 回调参数 |
87
- |--------|------|----------|
88
- | on-change | 分页、排序等变化时触发 | (pagination, filters, sorter) |
89
- | on-selection-change | 当前页选中项变化时触发 | (selection) |
90
- | on-reserve-selection-change | 开启 `reserveSelection` 后,所有已保留选中项变化时触发 | (selection) |
88
+ | 事件名 | 说明 | 回调参数 |
89
+ |--------|------|----------|
90
+ | on-change | 分页、排序等变化时触发 | (pagination, filters, sorter) |
91
+ | on-selection-change | 当前页选中项变化时触发 | (selection) |
92
+ | on-reserve-selection-change | 开启 `reserveSelection` 后,所有已保留选中项变化时触发 | (selection) |
93
+ | on-reserve-selection-keys-change | 开启 `reserveSelection` 后,所有已保留选中的 rowKey 列表变化时触发 | (selectedRowKeys) |
91
94
 
92
95
  ## 插槽
93
96
  | 插槽名 | 说明 |
@@ -109,28 +112,72 @@ cj_iview_table 是一个功能强大的表格组件,支持筛选、排序、
109
112
  - 列排序
110
113
  - 列固定
111
114
 
112
- ### 3. 数据请求
113
- 支持两种数据加载方式:
114
- - 通过data属性直接传入数据
115
- - 通过request函数异步加载数据
116
-
117
- ### 4. 跨分页保留选中
118
- 当表格包含 `type: 'selection'` 列时,可通过 `reserveSelection` 开启跨分页、跨搜索/筛选保留勾选。
119
-
120
- ```vue
115
+ ### 3. 数据请求
116
+ 支持两种数据加载方式:
117
+ - 通过data属性直接传入数据
118
+ - 通过request函数异步加载数据
119
+
120
+ ### 4. 跨分页保留选中
121
+ 当表格包含 `type: 'selection'` 列时,可通过 `reserveSelection` 开启跨分页、跨搜索/筛选保留勾选。
122
+
123
+ ```vue
124
+ <cj_iview_table
125
+ :columns="columns"
126
+ :request="loadData"
127
+ row-key="id"
128
+ :reserveSelection="true"
129
+ @on-reserve-selection-change="handleSelectionChange"
130
+ />
131
+ ```
132
+
133
+ 说明:
134
+ - `rowKey` 必须能唯一标识一行数据,支持多级路径,例如 `user.id`
135
+ - `on-selection-change` 返回的是当前页选中项
136
+ - `on-reserve-selection-change` 返回的是所有分页/筛选范围内累计保留的选中项
137
+
138
+ ### 5. 跨页面返回后恢复勾选
139
+ 如果你会在离开列表页后再回来,需要由父页面自己保存已选 rowKey 列表,并在重新进入时通过 `selectedRowKeys` 传回组件。
140
+
141
+ ```vue
121
142
  <cj_iview_table
122
143
  :columns="columns"
123
144
  :request="loadData"
124
145
  row-key="id"
125
146
  :reserveSelection="true"
126
- @on-reserve-selection-change="handleSelectionChange"
147
+ :selectedRowKeys="savedSelectedRowKeys"
148
+ :selectedRows="savedSelectedRows"
149
+ @on-reserve-selection-change="handleReserveSelectionChange"
150
+ @on-reserve-selection-keys-change="handleReserveSelectionKeysChange"
127
151
  />
128
- ```
129
-
152
+ ```
153
+
154
+ ```js
155
+ export default {
156
+ data () {
157
+ return {
158
+ savedSelectedRowKeys: JSON.parse(sessionStorage.getItem('table-selected-row-keys') || '[]'),
159
+ savedSelectedRows: JSON.parse(sessionStorage.getItem('table-selected-rows') || '[]')
160
+ }
161
+ },
162
+ methods: {
163
+ handleReserveSelectionChange (selectedRows) {
164
+ this.savedSelectedRows = selectedRows
165
+ sessionStorage.setItem('table-selected-rows', JSON.stringify(selectedRows))
166
+ },
167
+ handleReserveSelectionKeysChange (selectedRowKeys) {
168
+ this.savedSelectedRowKeys = selectedRowKeys
169
+ sessionStorage.setItem('table-selected-row-keys', JSON.stringify(selectedRowKeys))
170
+ }
171
+ }
172
+ }
173
+ ```
174
+
130
175
  说明:
131
- - `rowKey` 必须能唯一标识一行数据,支持多级路径,例如 `user.id`
132
- - `on-selection-change` 返回的是当前页选中项
133
- - `on-reserve-selection-change` 返回的是所有分页/筛选范围内累计保留的选中项
176
+ - `selectedRowKeys` 传的是 rowKey 数组,不是整行数据
177
+ - `selectedRows` 传的是之前保存下来的完整行数据,组件会优先用它恢复完整提交数据
178
+ - 组件会在数据重新加载后自动按这些 key 回显勾选
179
+ - 如果某些 key 在当前数据集中不存在,会被自动忽略
180
+ - 如果你希望“进入页面不翻页也能直接提交全部已选数据”,需要同时传 `selectedRowKeys` 和 `selectedRows`
134
181
 
135
182
  ## 使用示例
136
183
 
@@ -25799,7 +25799,7 @@ if (typeof window !== 'undefined') {
25799
25799
  // Indicate to webpack that this file can be concatenated
25800
25800
  /* harmony default export */ var setPublicPath = (null);
25801
25801
 
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
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=a2ad3720&scoped=true
25803
25803
  var render = function render() {
25804
25804
  var _vm = this,
25805
25805
  _c = _vm._self._c;
@@ -36510,6 +36510,14 @@ var vue_treeselect_cjs_default = /*#__PURE__*/__webpack_require__.n(vue_treesele
36510
36510
  type: [String, Boolean],
36511
36511
  default: 'id'
36512
36512
  },
36513
+ selectedRowKeys: {
36514
+ type: Array,
36515
+ default: () => []
36516
+ },
36517
+ selectedRows: {
36518
+ type: Array,
36519
+ default: () => []
36520
+ },
36513
36521
  reserveSelection: {
36514
36522
  type: Boolean,
36515
36523
  default: false
@@ -36551,6 +36559,7 @@ var vue_treeselect_cjs_default = /*#__PURE__*/__webpack_require__.n(vue_treesele
36551
36559
  // 选中的数据
36552
36560
  selectionItems: [],
36553
36561
  reserveSelectionMap: {},
36562
+ reserveSelectionKeys: [],
36554
36563
  isRestoringSelection: false,
36555
36564
  defToolBar: [{
36556
36565
  text: '新增',
@@ -36991,11 +37000,32 @@ var vue_treeselect_cjs_default = /*#__PURE__*/__webpack_require__.n(vue_treesele
36991
37000
  this.queueRestoreSelection();
36992
37001
  }
36993
37002
  },
37003
+ selectedRowKeys: {
37004
+ immediate: true,
37005
+ deep: true,
37006
+ handler() {
37007
+ if (this.shouldReserveSelection()) {
37008
+ this.applyExternalSelection();
37009
+ }
37010
+ }
37011
+ },
37012
+ selectedRows: {
37013
+ immediate: true,
37014
+ deep: true,
37015
+ handler() {
37016
+ if (this.shouldReserveSelection()) {
37017
+ this.applyExternalSelection();
37018
+ }
37019
+ }
37020
+ },
36994
37021
  requestParams() {
36995
37022
  this.reload();
36996
37023
  }
36997
37024
  },
36998
37025
  methods: {
37026
+ normalizeRowKeyValue(value) {
37027
+ return this.hasValidRowKey(value) ? String(value) : '';
37028
+ },
36999
37029
  hasValidRowKey(value) {
37000
37030
  return value !== undefined && value !== null && value !== '';
37001
37031
  },
@@ -37010,9 +37040,57 @@ var vue_treeselect_cjs_default = /*#__PURE__*/__webpack_require__.n(vue_treesele
37010
37040
  shouldReserveSelection() {
37011
37041
  return this.reserveSelection && this.columns.some(item => item.type === 'selection') && typeof this.rowKey === 'string' && this.rowKey !== '';
37012
37042
  },
37013
- setReserveSelectionMap(nextMap) {
37014
- this.reserveSelectionMap = nextMap;
37015
- this.selectionItems = Object.values(nextMap);
37043
+ normalizeSelectedRowKeys(selectedRowKeys = []) {
37044
+ if (!Array.isArray(selectedRowKeys)) {
37045
+ return [];
37046
+ }
37047
+ return Array.from(new Set(selectedRowKeys.map(item => this.normalizeRowKeyValue(item)).filter(Boolean)));
37048
+ },
37049
+ createReserveSelectionMapFromRows(rows = []) {
37050
+ if (!Array.isArray(rows)) {
37051
+ return {};
37052
+ }
37053
+ return rows.reduce((result, row) => {
37054
+ const rowKey = this.normalizeRowKeyValue(this.getRowIdentity(row));
37055
+ if (rowKey) {
37056
+ result[rowKey] = row;
37057
+ }
37058
+ return result;
37059
+ }, {});
37060
+ },
37061
+ setReserveSelectionState(nextMap = {}, nextKeys = []) {
37062
+ const normalizedKeys = this.normalizeSelectedRowKeys(nextKeys);
37063
+ const normalizedMap = normalizedKeys.reduce((result, key) => {
37064
+ if (nextMap[key]) {
37065
+ result[key] = nextMap[key];
37066
+ }
37067
+ return result;
37068
+ }, {});
37069
+ this.reserveSelectionMap = normalizedMap;
37070
+ this.reserveSelectionKeys = normalizedKeys;
37071
+ this.selectionItems = normalizedKeys.map(key => normalizedMap[key]).filter(Boolean);
37072
+ },
37073
+ applyExternalSelection() {
37074
+ if (!this.shouldReserveSelection()) {
37075
+ return;
37076
+ }
37077
+ const normalizedKeys = this.normalizeSelectedRowKeys(this.selectedRowKeys);
37078
+ const selectedKeySet = new Set(normalizedKeys);
37079
+ const nextMap = {
37080
+ ...this.reserveSelectionMap,
37081
+ ...this.createReserveSelectionMapFromRows(this.selectedRows)
37082
+ };
37083
+ this.dataSource.forEach(row => {
37084
+ const rowKey = this.normalizeRowKeyValue(this.getRowIdentity(row));
37085
+ if (rowKey && selectedKeySet.has(rowKey)) {
37086
+ nextMap[rowKey] = row;
37087
+ }
37088
+ });
37089
+ this.setReserveSelectionState(nextMap, normalizedKeys);
37090
+ this.queueRestoreSelection();
37091
+ },
37092
+ getReserveSelectionKeys() {
37093
+ return [...this.reserveSelectionKeys];
37016
37094
  },
37017
37095
  syncReserveSelection(selectionItems = []) {
37018
37096
  if (!this.shouldReserveSelection()) {
@@ -37022,23 +37100,26 @@ var vue_treeselect_cjs_default = /*#__PURE__*/__webpack_require__.n(vue_treesele
37022
37100
  const nextMap = {
37023
37101
  ...this.reserveSelectionMap
37024
37102
  };
37103
+ const nextKeys = new Set(this.reserveSelectionKeys);
37025
37104
  const pageKeys = [];
37026
37105
  this.dataSource.forEach(row => {
37027
- const rowKey = this.getRowIdentity(row);
37028
- if (this.hasValidRowKey(rowKey)) {
37029
- pageKeys.push(String(rowKey));
37106
+ const rowKey = this.normalizeRowKeyValue(this.getRowIdentity(row));
37107
+ if (rowKey) {
37108
+ pageKeys.push(rowKey);
37030
37109
  }
37031
37110
  });
37032
37111
  pageKeys.forEach(key => {
37033
37112
  delete nextMap[key];
37113
+ nextKeys.delete(key);
37034
37114
  });
37035
37115
  selectionItems.forEach(row => {
37036
- const rowKey = this.getRowIdentity(row);
37037
- if (this.hasValidRowKey(rowKey)) {
37038
- nextMap[String(rowKey)] = row;
37116
+ const rowKey = this.normalizeRowKeyValue(this.getRowIdentity(row));
37117
+ if (rowKey) {
37118
+ nextMap[rowKey] = row;
37119
+ nextKeys.add(rowKey);
37039
37120
  }
37040
37121
  });
37041
- this.setReserveSelectionMap(nextMap);
37122
+ this.setReserveSelectionState(nextMap, Array.from(nextKeys));
37042
37123
  },
37043
37124
  getCurrentTableSelection() {
37044
37125
  const tableRef = this.$refs.selection;
@@ -37060,19 +37141,16 @@ var vue_treeselect_cjs_default = /*#__PURE__*/__webpack_require__.n(vue_treesele
37060
37141
  if (!tableRef || typeof tableRef.toggleSelect !== 'function') {
37061
37142
  return;
37062
37143
  }
37063
- const selectedKeys = new Set(Object.keys(this.reserveSelectionMap));
37064
- if (selectedKeys.size === 0) {
37065
- return;
37066
- }
37144
+ const selectedKeys = new Set(this.reserveSelectionKeys);
37067
37145
  const currentSelection = this.getCurrentTableSelection();
37068
- const currentSelectionKeys = new Set(currentSelection.map(row => this.getRowIdentity(row)).filter(rowKey => this.hasValidRowKey(rowKey)).map(rowKey => String(rowKey)));
37146
+ const currentSelectionKeys = new Set(currentSelection.map(row => this.getRowIdentity(row)).map(rowKey => this.normalizeRowKeyValue(rowKey)).filter(Boolean));
37069
37147
  this.isRestoringSelection = true;
37070
37148
  this.dataSource.forEach((row, index) => {
37071
37149
  const rowKey = this.getRowIdentity(row);
37072
- if (!this.hasValidRowKey(rowKey)) {
37150
+ const normalizedKey = this.normalizeRowKeyValue(rowKey);
37151
+ if (!normalizedKey) {
37073
37152
  return;
37074
37153
  }
37075
- const normalizedKey = String(rowKey);
37076
37154
  const shouldBeSelected = selectedKeys.has(normalizedKey);
37077
37155
  const isSelected = currentSelectionKeys.has(normalizedKey);
37078
37156
  if (shouldBeSelected !== isSelected) {
@@ -37084,14 +37162,17 @@ var vue_treeselect_cjs_default = /*#__PURE__*/__webpack_require__.n(vue_treesele
37084
37162
  });
37085
37163
  },
37086
37164
  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)));
37165
+ this.setReserveSelectionState({}, []);
37166
+ const selectedRowKeys = new Set(this.getCurrentTableSelection().map(row => this.getRowIdentity(row)).map(rowKey => this.normalizeRowKeyValue(rowKey)).filter(Boolean));
37089
37167
  this.dataSource.forEach((row, index) => {
37090
37168
  const rowKey = this.getRowIdentity(row);
37091
- if (this.hasValidRowKey(rowKey) && selectedRowKeys.has(String(rowKey)) && this.$refs.selection && typeof this.$refs.selection.toggleSelect === 'function') {
37169
+ const normalizedKey = this.normalizeRowKeyValue(rowKey);
37170
+ if (normalizedKey && selectedRowKeys.has(normalizedKey) && this.$refs.selection && typeof this.$refs.selection.toggleSelect === 'function') {
37092
37171
  this.$refs.selection.toggleSelect(index, rowKey);
37093
37172
  }
37094
37173
  });
37174
+ this.$emit('on-reserve-selection-change', []);
37175
+ this.$emit('on-reserve-selection-keys-change', []);
37095
37176
  },
37096
37177
  isJsonString(str) {
37097
37178
  if (typeof str !== 'string') return false;
@@ -37425,6 +37506,7 @@ var vue_treeselect_cjs_default = /*#__PURE__*/__webpack_require__.n(vue_treesele
37425
37506
  return;
37426
37507
  }
37427
37508
  this.$emit('on-reserve-selection-change', this.selectionItems);
37509
+ this.$emit('on-reserve-selection-keys-change', this.getReserveSelectionKeys());
37428
37510
  } else {
37429
37511
  this.selectionItems = selectionItems;
37430
37512
  }
@@ -38097,15 +38179,15 @@ var vue_treeselect_cjs_default = /*#__PURE__*/__webpack_require__.n(vue_treesele
38097
38179
  });
38098
38180
  ;// ./packages/components/index.vue?vue&type=script&lang=js
38099
38181
  /* harmony default export */ var packages_componentsvue_type_script_lang_js = (componentsvue_type_script_lang_js);
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
38182
+ ;// ./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=a2ad3720&prod&scoped=true&lang=less
38101
38183
  // extracted by mini-css-extract-plugin
38102
38184
 
38103
- ;// ./packages/components/index.vue?vue&type=style&index=0&id=514a3b03&prod&scoped=true&lang=less
38185
+ ;// ./packages/components/index.vue?vue&type=style&index=0&id=a2ad3720&prod&scoped=true&lang=less
38104
38186
 
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
38187
+ ;// ./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=a2ad3720&prod&lang=css
38106
38188
  // extracted by mini-css-extract-plugin
38107
38189
 
38108
- ;// ./packages/components/index.vue?vue&type=style&index=1&id=514a3b03&prod&lang=css
38190
+ ;// ./packages/components/index.vue?vue&type=style&index=1&id=a2ad3720&prod&lang=css
38109
38191
 
38110
38192
  ;// ./packages/components/index.vue
38111
38193
 
@@ -38123,7 +38205,7 @@ var components_component = normalizeComponent(
38123
38205
  staticRenderFns,
38124
38206
  false,
38125
38207
  null,
38126
- "514a3b03",
38208
+ "a2ad3720",
38127
38209
  null
38128
38210
 
38129
38211
  )