@cimom-ui/standard-ui 1.1.14 → 1.1.16
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 +1 -1
- package/dist/standard-ui.common.js +182 -36
- package/dist/standard-ui.umd.js +182 -36
- package/dist/standard-ui.umd.min.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -92,7 +92,7 @@ export default {
|
|
|
92
92
|
## 注意事项
|
|
93
93
|
|
|
94
94
|
- 先 `Vue.use(ElementUI)`、`Vue.use(VXETable)`,再注册本库。按钮、输入框、下拉、时间选择内部固定 `size="mini"`,页面传 `size` 不会改掉。
|
|
95
|
-
- 全局注册请带上 `moduleCode` 和 `request
|
|
95
|
+
- 全局注册请带上 `moduleCode` 和 `request`。表格渲染从浏览器本地存储 `TableSetting` 读取表头,按「模块编码/页面编码/表格编码」取对应 `CLAYOUT`,不再逐表调用 `GetConfig`。保存和恢复默认仍调用 `/api/Migration/UserTableColumn/SaveConfig`、`ResetConfig`,成功后回写 `TableSetting` 里的对应项。`GetConfig` 不接收模块、页面、表格参数,返回当前用户全部布局,由其它程序调用后写入 `TableSetting`。没传 `request` 时不访问服务端,仍可读已有缓存。同一页面里每个表格的 `table-code` 必须唯一;不传时用组件 `ref`,`ref` 也没有则不读写配置。`page-code` 不传时用当前路由 `name`,没有 `name` 时用去掉查询参数的 `path`。
|
|
96
96
|
- `<standard-filterbar>` 必须接 `@search`,否则校验失败、整块不渲染,并在控制台输出 `[StandardFilterbar]` 错误。筛选值写在传入对象的属性上,运行中不要整体替换 `searchBar` 或 `searchVariable`。
|
|
97
97
|
- 筛选栏默认插槽里只认 `<standard-filterbar-item>`。插槽项排在 `searchCondition` 前面,一个插槽项算一条条件。首行放不下的进「更多」或「高级查询」。`isMain` 可以写在配置里,不再决定谁在首行。
|
|
98
98
|
- `<standard-dialog>` 的 `@confirm` 不关闭弹窗,业务成功后再改 `v-model`。点击遮罩默认不关闭。标题栏默认可拖拽,再次打开回到居中。
|
|
@@ -121522,8 +121522,8 @@ var StandardTimePick_component = normalizeComponent(
|
|
|
121522
121522
|
)
|
|
121523
121523
|
|
|
121524
121524
|
/* harmony default export */ const StandardTimePick = (StandardTimePick_component.exports);
|
|
121525
|
-
;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./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!./src/components/StandardTable/index.vue?vue&type=template&id=
|
|
121526
|
-
var
|
|
121525
|
+
;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./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!./src/components/StandardTable/index.vue?vue&type=template&id=24e29a8b
|
|
121526
|
+
var StandardTablevue_type_template_id_24e29a8b_render = function render() {
|
|
121527
121527
|
var _vm = this,
|
|
121528
121528
|
_c = _vm._self._c;
|
|
121529
121529
|
return _c('section', {
|
|
@@ -121858,7 +121858,7 @@ var StandardTablevue_type_template_id_b1d59d54_render = function render() {
|
|
|
121858
121858
|
}
|
|
121859
121859
|
}) : _vm.getFooterEmptyVisible() ? _c('standard-footer-empty') : _vm._e()], 1);
|
|
121860
121860
|
};
|
|
121861
|
-
var
|
|
121861
|
+
var StandardTablevue_type_template_id_24e29a8b_staticRenderFns = [];
|
|
121862
121862
|
|
|
121863
121863
|
;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/StandardTable/ToolbarEmpty.vue?vue&type=script&lang=js
|
|
121864
121864
|
/**
|
|
@@ -121950,9 +121950,9 @@ var FooterEmpty_component = normalizeComponent(
|
|
|
121950
121950
|
* 表头配置接口。路径固定,请求方法由业务项目注入。
|
|
121951
121951
|
* IP 和端口来自该请求方法自己的 baseURL,组件库不保存主机地址。
|
|
121952
121952
|
*/
|
|
121953
|
-
var GET_CONFIG = '/api/
|
|
121954
|
-
var SAVE_CONFIG = '/api/
|
|
121955
|
-
var RESET_CONFIG = '/api/
|
|
121953
|
+
var GET_CONFIG = '/api/SYS/UserTableColumn/GetUserTableConfig';
|
|
121954
|
+
var SAVE_CONFIG = '/api/SYS/UserTableColumn/SaveUserTableConfig';
|
|
121955
|
+
var RESET_CONFIG = '/api/SYS/UserTableColumn/ResetUserTableConfig';
|
|
121956
121956
|
var columnConfigApi = null;
|
|
121957
121957
|
var columnModuleCode = '';
|
|
121958
121958
|
|
|
@@ -121964,15 +121964,11 @@ function setColumnConfigRequest(request) {
|
|
|
121964
121964
|
return;
|
|
121965
121965
|
}
|
|
121966
121966
|
columnConfigApi = {
|
|
121967
|
-
|
|
121967
|
+
// 一次取当前用户的全部表头。表格渲染不调用它,由业务程序写入本地 TableSetting
|
|
121968
|
+
get: function get() {
|
|
121968
121969
|
return request({
|
|
121969
121970
|
url: GET_CONFIG,
|
|
121970
|
-
method: 'get'
|
|
121971
|
-
params: {
|
|
121972
|
-
moduleCode: moduleCode,
|
|
121973
|
-
pageCode: pageCode,
|
|
121974
|
-
tableCode: tableCode
|
|
121975
|
-
}
|
|
121971
|
+
method: 'get'
|
|
121976
121972
|
});
|
|
121977
121973
|
},
|
|
121978
121974
|
save: function save(moduleCode, pageCode, tableCode, columns) {
|
|
@@ -122027,6 +122023,9 @@ function releaseTableCode(moduleCode, pageCode, tableCode, owner) {
|
|
|
122027
122023
|
if (tableCodeOwners[key] === owner) delete tableCodeOwners[key];
|
|
122028
122024
|
}
|
|
122029
122025
|
;// ./src/components/StandardTable/columnPersist.js
|
|
122026
|
+
function columnPersist_defineProperty(e, r, t) { return (r = columnPersist_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
122027
|
+
function columnPersist_toPropertyKey(t) { var i = columnPersist_toPrimitive(t, "string"); return "symbol" == columnPersist_typeof(i) ? i : i + ""; }
|
|
122028
|
+
function columnPersist_toPrimitive(t, r) { if ("object" != columnPersist_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != columnPersist_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
122030
122029
|
function columnPersist_typeof(o) { "@babel/helpers - typeof"; return columnPersist_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, columnPersist_typeof(o); }
|
|
122031
122030
|
/**
|
|
122032
122031
|
* 表头配置的列主键、合并和提交数据。
|
|
@@ -122252,6 +122251,161 @@ function readColumnConfigDatas(res) {
|
|
|
122252
122251
|
var content = res && res.data && res.data.Content;
|
|
122253
122252
|
throw new Error(content || '表头配置请求失败');
|
|
122254
122253
|
}
|
|
122254
|
+
|
|
122255
|
+
// 其它程序把 GetConfig 的响应写入 localStorage.TableSetting。键为「模块/页面/表格」,值为 CLAYOUT 原文。
|
|
122256
|
+
var TABLE_SETTING_STORE = 'TableSetting';
|
|
122257
|
+
function buildColumnSettingKey(moduleCode, pageCode, tableCode) {
|
|
122258
|
+
return moduleCode + '/' + pageCode + '/' + tableCode;
|
|
122259
|
+
}
|
|
122260
|
+
function readTableSettingRoot() {
|
|
122261
|
+
if (typeof window === 'undefined' || !window.localStorage) return {
|
|
122262
|
+
missing: true
|
|
122263
|
+
};
|
|
122264
|
+
try {
|
|
122265
|
+
var raw = window.localStorage.getItem(TABLE_SETTING_STORE);
|
|
122266
|
+
if (raw == null || raw === '') return {
|
|
122267
|
+
missing: true
|
|
122268
|
+
};
|
|
122269
|
+
var root = JSON.parse(raw);
|
|
122270
|
+
// 个别调用方会把已经 stringify 过的响应再存一次
|
|
122271
|
+
if (typeof root === 'string') root = JSON.parse(root);
|
|
122272
|
+
return {
|
|
122273
|
+
missing: false,
|
|
122274
|
+
root: root
|
|
122275
|
+
};
|
|
122276
|
+
} catch (e) {
|
|
122277
|
+
console.warn('[StandardTable] TableSetting 解析失败');
|
|
122278
|
+
return {
|
|
122279
|
+
invalid: true
|
|
122280
|
+
};
|
|
122281
|
+
}
|
|
122282
|
+
}
|
|
122283
|
+
function writeTableSettingRoot(root) {
|
|
122284
|
+
window.localStorage.setItem(TABLE_SETTING_STORE, JSON.stringify(root));
|
|
122285
|
+
}
|
|
122286
|
+
|
|
122287
|
+
// 响应可能整包存入,也可能只存 Datas。沿 code/data/Datas 找到字典数组。
|
|
122288
|
+
function findLayoutArray(node, depth) {
|
|
122289
|
+
if (depth > 5 || node == null) return null;
|
|
122290
|
+
if (Array.isArray(node)) {
|
|
122291
|
+
if (!node.length || node.every(function (item) {
|
|
122292
|
+
return item && columnPersist_typeof(item) === 'object' && !Array.isArray(item);
|
|
122293
|
+
})) return node;
|
|
122294
|
+
return null;
|
|
122295
|
+
}
|
|
122296
|
+
if (columnPersist_typeof(node) !== 'object') return null;
|
|
122297
|
+
var fields = ['Datas', 'datas', 'data'];
|
|
122298
|
+
for (var i = 0; i < fields.length; i++) {
|
|
122299
|
+
if (!Object.prototype.hasOwnProperty.call(node, fields[i])) continue;
|
|
122300
|
+
var found = findLayoutArray(node[fields[i]], depth + 1);
|
|
122301
|
+
if (found) return found;
|
|
122302
|
+
}
|
|
122303
|
+
return null;
|
|
122304
|
+
}
|
|
122305
|
+
function isFlatLayoutMap(node) {
|
|
122306
|
+
if (!node || columnPersist_typeof(node) !== 'object' || Array.isArray(node)) return false;
|
|
122307
|
+
return Object.keys(node).some(function (key) {
|
|
122308
|
+
return key.indexOf('/') >= 0;
|
|
122309
|
+
});
|
|
122310
|
+
}
|
|
122311
|
+
|
|
122312
|
+
// Datas 为 null 的成功响应,补一个空数组后再写入,避免改掉外层结构
|
|
122313
|
+
function ensureLayoutArray(root) {
|
|
122314
|
+
var list = findLayoutArray(root, 0);
|
|
122315
|
+
if (list) return list;
|
|
122316
|
+
if (!root || columnPersist_typeof(root) !== 'object' || Array.isArray(root)) return null;
|
|
122317
|
+
var holder = root.data && columnPersist_typeof(root.data) === 'object' && !Array.isArray(root.data) && ('Datas' in root.data || 'datas' in root.data || 'Success' in root.data) ? root.data : 'Datas' in root || 'Success' in root ? root : null;
|
|
122318
|
+
if (!holder) return null;
|
|
122319
|
+
var field = 'datas' in holder && !('Datas' in holder) ? 'datas' : 'Datas';
|
|
122320
|
+
holder[field] = [];
|
|
122321
|
+
return holder[field];
|
|
122322
|
+
}
|
|
122323
|
+
|
|
122324
|
+
// CLAYOUT 是列数组的 JSON 字符串。兼容已解析的数组,以及旧的 { Columns } 结构。
|
|
122325
|
+
function parseLayoutColumns(value) {
|
|
122326
|
+
var data = value;
|
|
122327
|
+
for (var i = 0; i < 2 && typeof data === 'string'; i++) {
|
|
122328
|
+
var text = data.trim();
|
|
122329
|
+
if (!text) return null;
|
|
122330
|
+
try {
|
|
122331
|
+
data = JSON.parse(text);
|
|
122332
|
+
} catch (e) {
|
|
122333
|
+
return null;
|
|
122334
|
+
}
|
|
122335
|
+
}
|
|
122336
|
+
if (Array.isArray(data)) return data;
|
|
122337
|
+
if (data && columnPersist_typeof(data) === 'object') {
|
|
122338
|
+
var columns = data.Columns != null ? data.Columns : data.columns;
|
|
122339
|
+
if (Array.isArray(columns)) return columns;
|
|
122340
|
+
}
|
|
122341
|
+
return null;
|
|
122342
|
+
}
|
|
122343
|
+
function layoutJson(columns) {
|
|
122344
|
+
return JSON.stringify(Array.isArray(columns) ? columns : []);
|
|
122345
|
+
}
|
|
122346
|
+
function readCachedColumnLayout(moduleCode, pageCode, tableCode) {
|
|
122347
|
+
var stored = readTableSettingRoot();
|
|
122348
|
+
if (stored.missing || stored.invalid) return null;
|
|
122349
|
+
var key = buildColumnSettingKey(moduleCode, pageCode, tableCode);
|
|
122350
|
+
var list = findLayoutArray(stored.root, 0);
|
|
122351
|
+
if (list) {
|
|
122352
|
+
for (var i = list.length - 1; i >= 0; i--) {
|
|
122353
|
+
var item = list[i];
|
|
122354
|
+
if (item && Object.prototype.hasOwnProperty.call(item, key)) return parseLayoutColumns(item[key]);
|
|
122355
|
+
}
|
|
122356
|
+
return null;
|
|
122357
|
+
}
|
|
122358
|
+
if (isFlatLayoutMap(stored.root) && Object.prototype.hasOwnProperty.call(stored.root, key)) {
|
|
122359
|
+
return parseLayoutColumns(stored.root[key]);
|
|
122360
|
+
}
|
|
122361
|
+
return null;
|
|
122362
|
+
}
|
|
122363
|
+
function updateCachedColumnLayout(moduleCode, pageCode, tableCode, columns) {
|
|
122364
|
+
var key = buildColumnSettingKey(moduleCode, pageCode, tableCode);
|
|
122365
|
+
var value = layoutJson(columns);
|
|
122366
|
+
var stored = readTableSettingRoot();
|
|
122367
|
+
if (stored.invalid) return;
|
|
122368
|
+
if (stored.missing) {
|
|
122369
|
+
writeTableSettingRoot([columnPersist_defineProperty({}, key, value)]);
|
|
122370
|
+
return;
|
|
122371
|
+
}
|
|
122372
|
+
var list = ensureLayoutArray(stored.root);
|
|
122373
|
+
if (list) {
|
|
122374
|
+
var hit = null;
|
|
122375
|
+
for (var i = 0; i < list.length; i++) {
|
|
122376
|
+
if (list[i] && Object.prototype.hasOwnProperty.call(list[i], key)) hit = list[i];
|
|
122377
|
+
}
|
|
122378
|
+
if (hit) hit[key] = value;else list.push(columnPersist_defineProperty({}, key, value));
|
|
122379
|
+
writeTableSettingRoot(stored.root);
|
|
122380
|
+
return;
|
|
122381
|
+
}
|
|
122382
|
+
if (isFlatLayoutMap(stored.root)) {
|
|
122383
|
+
stored.root[key] = value;
|
|
122384
|
+
writeTableSettingRoot(stored.root);
|
|
122385
|
+
return;
|
|
122386
|
+
}
|
|
122387
|
+
console.warn('[StandardTable] TableSetting 结构无法识别,未更新本地表头配置');
|
|
122388
|
+
}
|
|
122389
|
+
function removeCachedColumnLayout(moduleCode, pageCode, tableCode) {
|
|
122390
|
+
var key = buildColumnSettingKey(moduleCode, pageCode, tableCode);
|
|
122391
|
+
var stored = readTableSettingRoot();
|
|
122392
|
+
if (stored.missing || stored.invalid) return;
|
|
122393
|
+
var list = findLayoutArray(stored.root, 0);
|
|
122394
|
+
if (list) {
|
|
122395
|
+
for (var i = list.length - 1; i >= 0; i--) {
|
|
122396
|
+
var item = list[i];
|
|
122397
|
+
if (!item || !Object.prototype.hasOwnProperty.call(item, key)) continue;
|
|
122398
|
+
delete item[key];
|
|
122399
|
+
if (!Object.keys(item).length) list.splice(i, 1);
|
|
122400
|
+
}
|
|
122401
|
+
writeTableSettingRoot(stored.root);
|
|
122402
|
+
return;
|
|
122403
|
+
}
|
|
122404
|
+
if (isFlatLayoutMap(stored.root) && Object.prototype.hasOwnProperty.call(stored.root, key)) {
|
|
122405
|
+
delete stored.root[key];
|
|
122406
|
+
writeTableSettingRoot(stored.root);
|
|
122407
|
+
}
|
|
122408
|
+
}
|
|
122255
122409
|
;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/StandardTable/index.vue?vue&type=script&lang=js
|
|
122256
122410
|
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || StandardTablevue_type_script_lang_js_unsupportedIterableToArray(r, e) || _nonIterableRest(); }
|
|
122257
122411
|
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
@@ -122863,9 +123017,11 @@ var NormalReportSlotView = {
|
|
|
122863
123017
|
clearTimeout(this.columnConfigTimer);
|
|
122864
123018
|
this.columnConfigTimer = null;
|
|
122865
123019
|
}
|
|
123020
|
+
// 直接改表头的保存还在 3 秒防抖里,离开页面时把最后一次调整写回去
|
|
122866
123021
|
if (this.columnConfigSaveTimer) {
|
|
122867
123022
|
clearTimeout(this.columnConfigSaveTimer);
|
|
122868
123023
|
this.columnConfigSaveTimer = null;
|
|
123024
|
+
this.persistColumnConfig();
|
|
122869
123025
|
}
|
|
122870
123026
|
this.releaseColumnConfigClaim();
|
|
122871
123027
|
this.destroyResizeObserver();
|
|
@@ -123790,7 +123946,8 @@ var NormalReportSlotView = {
|
|
|
123790
123946
|
this.columnConfigReady = !!getColumnModuleCode() && !!tableCode && !this.columnConfigDisabled;
|
|
123791
123947
|
this.columnsReady = true;
|
|
123792
123948
|
this.scheduleInitialLayout();
|
|
123793
|
-
|
|
123949
|
+
// 加载完成前已经直接改过表头时,同样等 3 秒再保存,避免和后续拖拽各打一次接口
|
|
123950
|
+
if (this.columnConfigDirty) this.schedulePersistColumnConfig();
|
|
123794
123951
|
},
|
|
123795
123952
|
bootstrapColumnConfig: function bootstrapColumnConfig() {
|
|
123796
123953
|
var _this22 = this;
|
|
@@ -123831,28 +123988,14 @@ var NormalReportSlotView = {
|
|
|
123831
123988
|
this.finishColumnConfigLoad();
|
|
123832
123989
|
return;
|
|
123833
123990
|
}
|
|
123991
|
+
var columns = readCachedColumnLayout(moduleCode, pageCode, tableCode);
|
|
123834
123992
|
var api = getColumnConfigApi();
|
|
123835
|
-
if (!api || typeof api.
|
|
123836
|
-
console.warn('[StandardTable] 未注入 request
|
|
123993
|
+
if (!api || typeof api.save !== 'function') {
|
|
123994
|
+
console.warn('[StandardTable] 未注入 request,表头配置不会保存');
|
|
123837
123995
|
this.columnConfigDisabled = true;
|
|
123838
|
-
this.finishColumnConfigLoad();
|
|
123839
|
-
return;
|
|
123840
123996
|
}
|
|
123841
|
-
this.
|
|
123842
|
-
if (_this22.
|
|
123843
|
-
if (_this22.$message) _this22.$message.warning('表头配置加载超时,已使用默认列');
|
|
123844
|
-
_this22.finishColumnConfigLoad();
|
|
123845
|
-
}, 3000);
|
|
123846
|
-
Promise.resolve(api.get(moduleCode, pageCode, tableCode)).then(function (res) {
|
|
123847
|
-
var datas = readColumnConfigDatas(res);
|
|
123848
|
-
var columns = readSavedColumns(datas);
|
|
123849
|
-
_this22.finishColumnConfigLoad(function () {
|
|
123850
|
-
if (columns && columns.length) _this22.applyMergedColumnConfig(columns);
|
|
123851
|
-
});
|
|
123852
|
-
})["catch"](function (err) {
|
|
123853
|
-
if (_this22.columnConfigSettled) return;
|
|
123854
|
-
if (_this22.$message) _this22.$message.warning(err && err.message || '表头配置加载失败,已使用默认列');
|
|
123855
|
-
_this22.finishColumnConfigLoad();
|
|
123997
|
+
this.finishColumnConfigLoad(function () {
|
|
123998
|
+
if (columns && columns.length) _this22.applyMergedColumnConfig(columns);
|
|
123856
123999
|
});
|
|
123857
124000
|
},
|
|
123858
124001
|
applyMergedColumnConfig: function applyMergedColumnConfig(savedColumns) {
|
|
@@ -123876,6 +124019,8 @@ var NormalReportSlotView = {
|
|
|
123876
124019
|
this.$set(st, 'width', Math.min(width, 2000));
|
|
123877
124020
|
this.schedulePersistColumnConfig();
|
|
123878
124021
|
},
|
|
124022
|
+
// 直接改表头(拖列宽、拖换列、右键改排序或固定)时防抖:停手 3 秒后才保存。
|
|
124023
|
+
// 「调整」弹层点确认走 persistColumnConfigNow,不经过这里。
|
|
123879
124024
|
schedulePersistColumnConfig: function schedulePersistColumnConfig() {
|
|
123880
124025
|
var _this24 = this;
|
|
123881
124026
|
this.columnConfigDirty = true;
|
|
@@ -123884,7 +124029,7 @@ var NormalReportSlotView = {
|
|
|
123884
124029
|
this.columnConfigSaveTimer = setTimeout(function () {
|
|
123885
124030
|
_this24.columnConfigSaveTimer = null;
|
|
123886
124031
|
_this24.persistColumnConfig();
|
|
123887
|
-
},
|
|
124032
|
+
}, 3000);
|
|
123888
124033
|
},
|
|
123889
124034
|
persistColumnConfigNow: function persistColumnConfigNow() {
|
|
123890
124035
|
this.columnConfigDirty = true;
|
|
@@ -123909,6 +124054,7 @@ var NormalReportSlotView = {
|
|
|
123909
124054
|
if (!request) return;
|
|
123910
124055
|
Promise.resolve(request).then(function (res) {
|
|
123911
124056
|
readColumnConfigDatas(res);
|
|
124057
|
+
if (useReset) removeCachedColumnLayout(moduleCode, pageCode, tableCode);else updateCachedColumnLayout(moduleCode, pageCode, tableCode, columns);
|
|
123912
124058
|
var content = res && res.data && res.data.Content || res && res.Content || '表头配置保存成功';
|
|
123913
124059
|
if (_this25.$message) _this25.$message.success(content);
|
|
123914
124060
|
})["catch"](function (err) {
|
|
@@ -123934,8 +124080,8 @@ var StandardTablevue_type_style_index_0_prod_lang_scss_external = __webpack_requ
|
|
|
123934
124080
|
|
|
123935
124081
|
var StandardTable_component = normalizeComponent(
|
|
123936
124082
|
components_StandardTablevue_type_script_lang_js,
|
|
123937
|
-
|
|
123938
|
-
|
|
124083
|
+
StandardTablevue_type_template_id_24e29a8b_render,
|
|
124084
|
+
StandardTablevue_type_template_id_24e29a8b_staticRenderFns,
|
|
123939
124085
|
false,
|
|
123940
124086
|
null,
|
|
123941
124087
|
null,
|
package/dist/standard-ui.umd.js
CHANGED
|
@@ -121532,8 +121532,8 @@ var StandardTimePick_component = normalizeComponent(
|
|
|
121532
121532
|
)
|
|
121533
121533
|
|
|
121534
121534
|
/* harmony default export */ const StandardTimePick = (StandardTimePick_component.exports);
|
|
121535
|
-
;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-82.use[1]!./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!./src/components/StandardTable/index.vue?vue&type=template&id=
|
|
121536
|
-
var
|
|
121535
|
+
;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-82.use[1]!./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!./src/components/StandardTable/index.vue?vue&type=template&id=24e29a8b
|
|
121536
|
+
var StandardTablevue_type_template_id_24e29a8b_render = function render() {
|
|
121537
121537
|
var _vm = this,
|
|
121538
121538
|
_c = _vm._self._c;
|
|
121539
121539
|
return _c('section', {
|
|
@@ -121868,7 +121868,7 @@ var StandardTablevue_type_template_id_b1d59d54_render = function render() {
|
|
|
121868
121868
|
}
|
|
121869
121869
|
}) : _vm.getFooterEmptyVisible() ? _c('standard-footer-empty') : _vm._e()], 1);
|
|
121870
121870
|
};
|
|
121871
|
-
var
|
|
121871
|
+
var StandardTablevue_type_template_id_24e29a8b_staticRenderFns = [];
|
|
121872
121872
|
|
|
121873
121873
|
;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-82.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/StandardTable/ToolbarEmpty.vue?vue&type=script&lang=js
|
|
121874
121874
|
/**
|
|
@@ -121960,9 +121960,9 @@ var FooterEmpty_component = normalizeComponent(
|
|
|
121960
121960
|
* 表头配置接口。路径固定,请求方法由业务项目注入。
|
|
121961
121961
|
* IP 和端口来自该请求方法自己的 baseURL,组件库不保存主机地址。
|
|
121962
121962
|
*/
|
|
121963
|
-
var GET_CONFIG = '/api/
|
|
121964
|
-
var SAVE_CONFIG = '/api/
|
|
121965
|
-
var RESET_CONFIG = '/api/
|
|
121963
|
+
var GET_CONFIG = '/api/SYS/UserTableColumn/GetUserTableConfig';
|
|
121964
|
+
var SAVE_CONFIG = '/api/SYS/UserTableColumn/SaveUserTableConfig';
|
|
121965
|
+
var RESET_CONFIG = '/api/SYS/UserTableColumn/ResetUserTableConfig';
|
|
121966
121966
|
var columnConfigApi = null;
|
|
121967
121967
|
var columnModuleCode = '';
|
|
121968
121968
|
|
|
@@ -121974,15 +121974,11 @@ function setColumnConfigRequest(request) {
|
|
|
121974
121974
|
return;
|
|
121975
121975
|
}
|
|
121976
121976
|
columnConfigApi = {
|
|
121977
|
-
|
|
121977
|
+
// 一次取当前用户的全部表头。表格渲染不调用它,由业务程序写入本地 TableSetting
|
|
121978
|
+
get: function get() {
|
|
121978
121979
|
return request({
|
|
121979
121980
|
url: GET_CONFIG,
|
|
121980
|
-
method: 'get'
|
|
121981
|
-
params: {
|
|
121982
|
-
moduleCode: moduleCode,
|
|
121983
|
-
pageCode: pageCode,
|
|
121984
|
-
tableCode: tableCode
|
|
121985
|
-
}
|
|
121981
|
+
method: 'get'
|
|
121986
121982
|
});
|
|
121987
121983
|
},
|
|
121988
121984
|
save: function save(moduleCode, pageCode, tableCode, columns) {
|
|
@@ -122037,6 +122033,9 @@ function releaseTableCode(moduleCode, pageCode, tableCode, owner) {
|
|
|
122037
122033
|
if (tableCodeOwners[key] === owner) delete tableCodeOwners[key];
|
|
122038
122034
|
}
|
|
122039
122035
|
;// ./src/components/StandardTable/columnPersist.js
|
|
122036
|
+
function columnPersist_defineProperty(e, r, t) { return (r = columnPersist_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
122037
|
+
function columnPersist_toPropertyKey(t) { var i = columnPersist_toPrimitive(t, "string"); return "symbol" == columnPersist_typeof(i) ? i : i + ""; }
|
|
122038
|
+
function columnPersist_toPrimitive(t, r) { if ("object" != columnPersist_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != columnPersist_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
122040
122039
|
function columnPersist_typeof(o) { "@babel/helpers - typeof"; return columnPersist_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, columnPersist_typeof(o); }
|
|
122041
122040
|
/**
|
|
122042
122041
|
* 表头配置的列主键、合并和提交数据。
|
|
@@ -122262,6 +122261,161 @@ function readColumnConfigDatas(res) {
|
|
|
122262
122261
|
var content = res && res.data && res.data.Content;
|
|
122263
122262
|
throw new Error(content || '表头配置请求失败');
|
|
122264
122263
|
}
|
|
122264
|
+
|
|
122265
|
+
// 其它程序把 GetConfig 的响应写入 localStorage.TableSetting。键为「模块/页面/表格」,值为 CLAYOUT 原文。
|
|
122266
|
+
var TABLE_SETTING_STORE = 'TableSetting';
|
|
122267
|
+
function buildColumnSettingKey(moduleCode, pageCode, tableCode) {
|
|
122268
|
+
return moduleCode + '/' + pageCode + '/' + tableCode;
|
|
122269
|
+
}
|
|
122270
|
+
function readTableSettingRoot() {
|
|
122271
|
+
if (typeof window === 'undefined' || !window.localStorage) return {
|
|
122272
|
+
missing: true
|
|
122273
|
+
};
|
|
122274
|
+
try {
|
|
122275
|
+
var raw = window.localStorage.getItem(TABLE_SETTING_STORE);
|
|
122276
|
+
if (raw == null || raw === '') return {
|
|
122277
|
+
missing: true
|
|
122278
|
+
};
|
|
122279
|
+
var root = JSON.parse(raw);
|
|
122280
|
+
// 个别调用方会把已经 stringify 过的响应再存一次
|
|
122281
|
+
if (typeof root === 'string') root = JSON.parse(root);
|
|
122282
|
+
return {
|
|
122283
|
+
missing: false,
|
|
122284
|
+
root: root
|
|
122285
|
+
};
|
|
122286
|
+
} catch (e) {
|
|
122287
|
+
console.warn('[StandardTable] TableSetting 解析失败');
|
|
122288
|
+
return {
|
|
122289
|
+
invalid: true
|
|
122290
|
+
};
|
|
122291
|
+
}
|
|
122292
|
+
}
|
|
122293
|
+
function writeTableSettingRoot(root) {
|
|
122294
|
+
window.localStorage.setItem(TABLE_SETTING_STORE, JSON.stringify(root));
|
|
122295
|
+
}
|
|
122296
|
+
|
|
122297
|
+
// 响应可能整包存入,也可能只存 Datas。沿 code/data/Datas 找到字典数组。
|
|
122298
|
+
function findLayoutArray(node, depth) {
|
|
122299
|
+
if (depth > 5 || node == null) return null;
|
|
122300
|
+
if (Array.isArray(node)) {
|
|
122301
|
+
if (!node.length || node.every(function (item) {
|
|
122302
|
+
return item && columnPersist_typeof(item) === 'object' && !Array.isArray(item);
|
|
122303
|
+
})) return node;
|
|
122304
|
+
return null;
|
|
122305
|
+
}
|
|
122306
|
+
if (columnPersist_typeof(node) !== 'object') return null;
|
|
122307
|
+
var fields = ['Datas', 'datas', 'data'];
|
|
122308
|
+
for (var i = 0; i < fields.length; i++) {
|
|
122309
|
+
if (!Object.prototype.hasOwnProperty.call(node, fields[i])) continue;
|
|
122310
|
+
var found = findLayoutArray(node[fields[i]], depth + 1);
|
|
122311
|
+
if (found) return found;
|
|
122312
|
+
}
|
|
122313
|
+
return null;
|
|
122314
|
+
}
|
|
122315
|
+
function isFlatLayoutMap(node) {
|
|
122316
|
+
if (!node || columnPersist_typeof(node) !== 'object' || Array.isArray(node)) return false;
|
|
122317
|
+
return Object.keys(node).some(function (key) {
|
|
122318
|
+
return key.indexOf('/') >= 0;
|
|
122319
|
+
});
|
|
122320
|
+
}
|
|
122321
|
+
|
|
122322
|
+
// Datas 为 null 的成功响应,补一个空数组后再写入,避免改掉外层结构
|
|
122323
|
+
function ensureLayoutArray(root) {
|
|
122324
|
+
var list = findLayoutArray(root, 0);
|
|
122325
|
+
if (list) return list;
|
|
122326
|
+
if (!root || columnPersist_typeof(root) !== 'object' || Array.isArray(root)) return null;
|
|
122327
|
+
var holder = root.data && columnPersist_typeof(root.data) === 'object' && !Array.isArray(root.data) && ('Datas' in root.data || 'datas' in root.data || 'Success' in root.data) ? root.data : 'Datas' in root || 'Success' in root ? root : null;
|
|
122328
|
+
if (!holder) return null;
|
|
122329
|
+
var field = 'datas' in holder && !('Datas' in holder) ? 'datas' : 'Datas';
|
|
122330
|
+
holder[field] = [];
|
|
122331
|
+
return holder[field];
|
|
122332
|
+
}
|
|
122333
|
+
|
|
122334
|
+
// CLAYOUT 是列数组的 JSON 字符串。兼容已解析的数组,以及旧的 { Columns } 结构。
|
|
122335
|
+
function parseLayoutColumns(value) {
|
|
122336
|
+
var data = value;
|
|
122337
|
+
for (var i = 0; i < 2 && typeof data === 'string'; i++) {
|
|
122338
|
+
var text = data.trim();
|
|
122339
|
+
if (!text) return null;
|
|
122340
|
+
try {
|
|
122341
|
+
data = JSON.parse(text);
|
|
122342
|
+
} catch (e) {
|
|
122343
|
+
return null;
|
|
122344
|
+
}
|
|
122345
|
+
}
|
|
122346
|
+
if (Array.isArray(data)) return data;
|
|
122347
|
+
if (data && columnPersist_typeof(data) === 'object') {
|
|
122348
|
+
var columns = data.Columns != null ? data.Columns : data.columns;
|
|
122349
|
+
if (Array.isArray(columns)) return columns;
|
|
122350
|
+
}
|
|
122351
|
+
return null;
|
|
122352
|
+
}
|
|
122353
|
+
function layoutJson(columns) {
|
|
122354
|
+
return JSON.stringify(Array.isArray(columns) ? columns : []);
|
|
122355
|
+
}
|
|
122356
|
+
function readCachedColumnLayout(moduleCode, pageCode, tableCode) {
|
|
122357
|
+
var stored = readTableSettingRoot();
|
|
122358
|
+
if (stored.missing || stored.invalid) return null;
|
|
122359
|
+
var key = buildColumnSettingKey(moduleCode, pageCode, tableCode);
|
|
122360
|
+
var list = findLayoutArray(stored.root, 0);
|
|
122361
|
+
if (list) {
|
|
122362
|
+
for (var i = list.length - 1; i >= 0; i--) {
|
|
122363
|
+
var item = list[i];
|
|
122364
|
+
if (item && Object.prototype.hasOwnProperty.call(item, key)) return parseLayoutColumns(item[key]);
|
|
122365
|
+
}
|
|
122366
|
+
return null;
|
|
122367
|
+
}
|
|
122368
|
+
if (isFlatLayoutMap(stored.root) && Object.prototype.hasOwnProperty.call(stored.root, key)) {
|
|
122369
|
+
return parseLayoutColumns(stored.root[key]);
|
|
122370
|
+
}
|
|
122371
|
+
return null;
|
|
122372
|
+
}
|
|
122373
|
+
function updateCachedColumnLayout(moduleCode, pageCode, tableCode, columns) {
|
|
122374
|
+
var key = buildColumnSettingKey(moduleCode, pageCode, tableCode);
|
|
122375
|
+
var value = layoutJson(columns);
|
|
122376
|
+
var stored = readTableSettingRoot();
|
|
122377
|
+
if (stored.invalid) return;
|
|
122378
|
+
if (stored.missing) {
|
|
122379
|
+
writeTableSettingRoot([columnPersist_defineProperty({}, key, value)]);
|
|
122380
|
+
return;
|
|
122381
|
+
}
|
|
122382
|
+
var list = ensureLayoutArray(stored.root);
|
|
122383
|
+
if (list) {
|
|
122384
|
+
var hit = null;
|
|
122385
|
+
for (var i = 0; i < list.length; i++) {
|
|
122386
|
+
if (list[i] && Object.prototype.hasOwnProperty.call(list[i], key)) hit = list[i];
|
|
122387
|
+
}
|
|
122388
|
+
if (hit) hit[key] = value;else list.push(columnPersist_defineProperty({}, key, value));
|
|
122389
|
+
writeTableSettingRoot(stored.root);
|
|
122390
|
+
return;
|
|
122391
|
+
}
|
|
122392
|
+
if (isFlatLayoutMap(stored.root)) {
|
|
122393
|
+
stored.root[key] = value;
|
|
122394
|
+
writeTableSettingRoot(stored.root);
|
|
122395
|
+
return;
|
|
122396
|
+
}
|
|
122397
|
+
console.warn('[StandardTable] TableSetting 结构无法识别,未更新本地表头配置');
|
|
122398
|
+
}
|
|
122399
|
+
function removeCachedColumnLayout(moduleCode, pageCode, tableCode) {
|
|
122400
|
+
var key = buildColumnSettingKey(moduleCode, pageCode, tableCode);
|
|
122401
|
+
var stored = readTableSettingRoot();
|
|
122402
|
+
if (stored.missing || stored.invalid) return;
|
|
122403
|
+
var list = findLayoutArray(stored.root, 0);
|
|
122404
|
+
if (list) {
|
|
122405
|
+
for (var i = list.length - 1; i >= 0; i--) {
|
|
122406
|
+
var item = list[i];
|
|
122407
|
+
if (!item || !Object.prototype.hasOwnProperty.call(item, key)) continue;
|
|
122408
|
+
delete item[key];
|
|
122409
|
+
if (!Object.keys(item).length) list.splice(i, 1);
|
|
122410
|
+
}
|
|
122411
|
+
writeTableSettingRoot(stored.root);
|
|
122412
|
+
return;
|
|
122413
|
+
}
|
|
122414
|
+
if (isFlatLayoutMap(stored.root) && Object.prototype.hasOwnProperty.call(stored.root, key)) {
|
|
122415
|
+
delete stored.root[key];
|
|
122416
|
+
writeTableSettingRoot(stored.root);
|
|
122417
|
+
}
|
|
122418
|
+
}
|
|
122265
122419
|
;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-82.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/StandardTable/index.vue?vue&type=script&lang=js
|
|
122266
122420
|
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || StandardTablevue_type_script_lang_js_unsupportedIterableToArray(r, e) || _nonIterableRest(); }
|
|
122267
122421
|
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
@@ -122873,9 +123027,11 @@ var NormalReportSlotView = {
|
|
|
122873
123027
|
clearTimeout(this.columnConfigTimer);
|
|
122874
123028
|
this.columnConfigTimer = null;
|
|
122875
123029
|
}
|
|
123030
|
+
// 直接改表头的保存还在 3 秒防抖里,离开页面时把最后一次调整写回去
|
|
122876
123031
|
if (this.columnConfigSaveTimer) {
|
|
122877
123032
|
clearTimeout(this.columnConfigSaveTimer);
|
|
122878
123033
|
this.columnConfigSaveTimer = null;
|
|
123034
|
+
this.persistColumnConfig();
|
|
122879
123035
|
}
|
|
122880
123036
|
this.releaseColumnConfigClaim();
|
|
122881
123037
|
this.destroyResizeObserver();
|
|
@@ -123800,7 +123956,8 @@ var NormalReportSlotView = {
|
|
|
123800
123956
|
this.columnConfigReady = !!getColumnModuleCode() && !!tableCode && !this.columnConfigDisabled;
|
|
123801
123957
|
this.columnsReady = true;
|
|
123802
123958
|
this.scheduleInitialLayout();
|
|
123803
|
-
|
|
123959
|
+
// 加载完成前已经直接改过表头时,同样等 3 秒再保存,避免和后续拖拽各打一次接口
|
|
123960
|
+
if (this.columnConfigDirty) this.schedulePersistColumnConfig();
|
|
123804
123961
|
},
|
|
123805
123962
|
bootstrapColumnConfig: function bootstrapColumnConfig() {
|
|
123806
123963
|
var _this22 = this;
|
|
@@ -123841,28 +123998,14 @@ var NormalReportSlotView = {
|
|
|
123841
123998
|
this.finishColumnConfigLoad();
|
|
123842
123999
|
return;
|
|
123843
124000
|
}
|
|
124001
|
+
var columns = readCachedColumnLayout(moduleCode, pageCode, tableCode);
|
|
123844
124002
|
var api = getColumnConfigApi();
|
|
123845
|
-
if (!api || typeof api.
|
|
123846
|
-
console.warn('[StandardTable] 未注入 request
|
|
124003
|
+
if (!api || typeof api.save !== 'function') {
|
|
124004
|
+
console.warn('[StandardTable] 未注入 request,表头配置不会保存');
|
|
123847
124005
|
this.columnConfigDisabled = true;
|
|
123848
|
-
this.finishColumnConfigLoad();
|
|
123849
|
-
return;
|
|
123850
124006
|
}
|
|
123851
|
-
this.
|
|
123852
|
-
if (_this22.
|
|
123853
|
-
if (_this22.$message) _this22.$message.warning('表头配置加载超时,已使用默认列');
|
|
123854
|
-
_this22.finishColumnConfigLoad();
|
|
123855
|
-
}, 3000);
|
|
123856
|
-
Promise.resolve(api.get(moduleCode, pageCode, tableCode)).then(function (res) {
|
|
123857
|
-
var datas = readColumnConfigDatas(res);
|
|
123858
|
-
var columns = readSavedColumns(datas);
|
|
123859
|
-
_this22.finishColumnConfigLoad(function () {
|
|
123860
|
-
if (columns && columns.length) _this22.applyMergedColumnConfig(columns);
|
|
123861
|
-
});
|
|
123862
|
-
})["catch"](function (err) {
|
|
123863
|
-
if (_this22.columnConfigSettled) return;
|
|
123864
|
-
if (_this22.$message) _this22.$message.warning(err && err.message || '表头配置加载失败,已使用默认列');
|
|
123865
|
-
_this22.finishColumnConfigLoad();
|
|
124007
|
+
this.finishColumnConfigLoad(function () {
|
|
124008
|
+
if (columns && columns.length) _this22.applyMergedColumnConfig(columns);
|
|
123866
124009
|
});
|
|
123867
124010
|
},
|
|
123868
124011
|
applyMergedColumnConfig: function applyMergedColumnConfig(savedColumns) {
|
|
@@ -123886,6 +124029,8 @@ var NormalReportSlotView = {
|
|
|
123886
124029
|
this.$set(st, 'width', Math.min(width, 2000));
|
|
123887
124030
|
this.schedulePersistColumnConfig();
|
|
123888
124031
|
},
|
|
124032
|
+
// 直接改表头(拖列宽、拖换列、右键改排序或固定)时防抖:停手 3 秒后才保存。
|
|
124033
|
+
// 「调整」弹层点确认走 persistColumnConfigNow,不经过这里。
|
|
123889
124034
|
schedulePersistColumnConfig: function schedulePersistColumnConfig() {
|
|
123890
124035
|
var _this24 = this;
|
|
123891
124036
|
this.columnConfigDirty = true;
|
|
@@ -123894,7 +124039,7 @@ var NormalReportSlotView = {
|
|
|
123894
124039
|
this.columnConfigSaveTimer = setTimeout(function () {
|
|
123895
124040
|
_this24.columnConfigSaveTimer = null;
|
|
123896
124041
|
_this24.persistColumnConfig();
|
|
123897
|
-
},
|
|
124042
|
+
}, 3000);
|
|
123898
124043
|
},
|
|
123899
124044
|
persistColumnConfigNow: function persistColumnConfigNow() {
|
|
123900
124045
|
this.columnConfigDirty = true;
|
|
@@ -123919,6 +124064,7 @@ var NormalReportSlotView = {
|
|
|
123919
124064
|
if (!request) return;
|
|
123920
124065
|
Promise.resolve(request).then(function (res) {
|
|
123921
124066
|
readColumnConfigDatas(res);
|
|
124067
|
+
if (useReset) removeCachedColumnLayout(moduleCode, pageCode, tableCode);else updateCachedColumnLayout(moduleCode, pageCode, tableCode, columns);
|
|
123922
124068
|
var content = res && res.data && res.data.Content || res && res.Content || '表头配置保存成功';
|
|
123923
124069
|
if (_this25.$message) _this25.$message.success(content);
|
|
123924
124070
|
})["catch"](function (err) {
|
|
@@ -123944,8 +124090,8 @@ var StandardTablevue_type_style_index_0_prod_lang_scss_external = __webpack_requ
|
|
|
123944
124090
|
|
|
123945
124091
|
var StandardTable_component = normalizeComponent(
|
|
123946
124092
|
components_StandardTablevue_type_script_lang_js,
|
|
123947
|
-
|
|
123948
|
-
|
|
124093
|
+
StandardTablevue_type_template_id_24e29a8b_render,
|
|
124094
|
+
StandardTablevue_type_template_id_24e29a8b_staticRenderFns,
|
|
123949
124095
|
false,
|
|
123950
124096
|
null,
|
|
123951
124097
|
null,
|