@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 +33 -11
- package/dist/cj_iview_table.common.js +179 -8
- package/dist/cj_iview_table.common.js.map +1 -1
- package/dist/cj_iview_table.css +1 -1
- package/dist/cj_iview_table.umd.js +179 -8
- package/dist/cj_iview_table.umd.js.map +1 -1
- package/dist/cj_iview_table.umd.min.js +4 -4
- package/dist/cj_iview_table.umd.min.js.map +1 -1
- package/package.json +1 -1
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
|
-
|
|
|
66
|
-
|
|
|
67
|
-
|
|
|
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=
|
|
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.
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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
|
-
"
|
|
38126
|
+
"514a3b03",
|
|
37956
38127
|
null
|
|
37957
38128
|
|
|
37958
38129
|
)
|