cloud-web-corejs 1.0.54-dev.807 → 1.0.54-dev.808

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.
@@ -0,0 +1,77 @@
1
+ /**
2
+ * 自研区域选取的高亮样式。
3
+ *
4
+ * 高亮是把 class 直接打在 td 上(见同目录 index.js),而不是画绝对定位的遮罩:
5
+ * 业务表常配 row-config.height: auto + autosize 的 textarea,行高会在输入过程中变化,
6
+ * 遮罩会漂移;而且有固定列时同一个单元格在 left/main/right 三个 wrapper 里各有一份,
7
+ * 打 class 一次就能全覆盖。
8
+ *
9
+ * 边框走 ::after 伪元素而不是 border,避免占用盒模型把单元格内容挤动。
10
+ */
11
+ $vxe-cell-area-color: #409eff !default;
12
+ $vxe-cell-area-background-color: rgba(64, 158, 255, 0.12) !default;
13
+ $vxe-cell-area-border-width: 2px !default;
14
+
15
+ .vxe-table {
16
+ // 框选过程中禁掉文字选中,否则拖拽会连带选中单元格文本
17
+ &.drag--range {
18
+ .vxe-table--main-wrapper,
19
+ .vxe-table--fixed-left-wrapper,
20
+ .vxe-table--fixed-right-wrapper {
21
+ user-select: none;
22
+
23
+ * {
24
+ user-select: none;
25
+ }
26
+ }
27
+ }
28
+
29
+ .vxe-body--column {
30
+ &.col--area,
31
+ &.col--copy-area {
32
+ position: relative;
33
+
34
+ &::after {
35
+ content: "";
36
+ position: absolute;
37
+ top: 0;
38
+ right: 0;
39
+ bottom: 0;
40
+ left: 0;
41
+ pointer-events: none;
42
+ z-index: 1;
43
+ }
44
+ }
45
+
46
+ &.col--area {
47
+ background-color: $vxe-cell-area-background-color;
48
+ }
49
+
50
+ // 只有落在选区边界上的单元格画对应那条边,四条拼起来就是完整矩形
51
+ &.col--area-t::after {
52
+ border-top: $vxe-cell-area-border-width solid $vxe-cell-area-color;
53
+ }
54
+
55
+ &.col--area-b::after {
56
+ border-bottom: $vxe-cell-area-border-width solid $vxe-cell-area-color;
57
+ }
58
+
59
+ &.col--area-l::after {
60
+ border-left: $vxe-cell-area-border-width solid $vxe-cell-area-color;
61
+ }
62
+
63
+ &.col--area-r::after {
64
+ border-right: $vxe-cell-area-border-width solid $vxe-cell-area-color;
65
+ }
66
+
67
+ // 锚点格:shift 扩选与方向键移动的基准,不铺底色以示区别
68
+ &.col--area-active {
69
+ background-color: transparent;
70
+ }
71
+
72
+ // 复制源:虚线框,粘贴或取消后清除
73
+ &.col--copy-area::after {
74
+ border: 1px dashed $vxe-cell-area-color;
75
+ }
76
+ }
77
+ }
@@ -0,0 +1,224 @@
1
+ /**
2
+ * 区域选取插件的纯函数部分:可选列/行的口径、矩形运算、剪贴板 TSV 编解码。
3
+ * 抽出来是为了能脱离 vxe 实例单测,index.js 只负责跟 vxe 的钩子对接。
4
+ */
5
+
6
+ // 这些列没有业务值(复选框/单选/序号/展开),不参与区域选取与复制粘贴
7
+ const NOT_AREA_COLUMN_TYPES = ["checkbox", "radio", "seq", "expand"];
8
+
9
+ /**
10
+ * 参与区域选取的列。索引空间以本函数返回的数组为准,
11
+ * 复制粘贴的列对齐、方向键移动都按这个下标算。
12
+ */
13
+ export function getAreaColumns(columns, excludeFields) {
14
+ let excludes = excludeFields || [];
15
+ return (columns || []).filter((column) => {
16
+ if (!column) return false;
17
+ let field = column.property || column.field;
18
+ if (!field) return false;
19
+ if (NOT_AREA_COLUMN_TYPES.includes(column.type)) return false;
20
+ return !excludes.includes(field);
21
+ });
22
+ }
23
+
24
+ export function getColumnField(column) {
25
+ return column ? column.property || column.field : null;
26
+ }
27
+
28
+ /**
29
+ * 下标钳制到 [0, size - 1],size 为 0 时返回 -1 表示无可用格。
30
+ *
31
+ * 只接受**算术下标**(锚点 ± 偏移,越界钳回边界是对的,比如在第 0 行按 ↑ 得到 -1 应该停在 0)。
32
+ * **不要拿 indexOf 的结果喂它** —— 那里的 -1 是"找不到",钳成 0 会把查找失败
33
+ * 静默变成"第 0 行",选区反向铺开。
34
+ */
35
+ export function clampIndex(index, size) {
36
+ if (!size || size < 1) return -1;
37
+ if (index < 0) return 0;
38
+ if (index > size - 1) return size - 1;
39
+ return index;
40
+ }
41
+
42
+ /**
43
+ * 由锚点与焦点格构造矩形。锚点是 shift 扩选与方向键移动的基准,
44
+ * 始终保留在区域里,不随 start/end 归一化而丢失。
45
+ */
46
+ export function buildArea(anchorRow, anchorCol, focusRow, focusCol) {
47
+ return {
48
+ anchorRow: anchorRow,
49
+ anchorCol: anchorCol,
50
+ focusRow: focusRow,
51
+ focusCol: focusCol,
52
+ startRow: Math.min(anchorRow, focusRow),
53
+ endRow: Math.max(anchorRow, focusRow),
54
+ startCol: Math.min(anchorCol, focusCol),
55
+ endCol: Math.max(anchorCol, focusCol),
56
+ };
57
+ }
58
+
59
+ /** 折叠成单格 */
60
+ export function buildCellArea(rowIndex, colIndex) {
61
+ return buildArea(rowIndex, colIndex, rowIndex, colIndex);
62
+ }
63
+
64
+ /** 以现有锚点扩选到目标格;没有区域时退化为单格 */
65
+ export function extendArea(area, focusRow, focusCol) {
66
+ if (!area) return buildCellArea(focusRow, focusCol);
67
+ return buildArea(area.anchorRow, area.anchorCol, focusRow, focusCol);
68
+ }
69
+
70
+ /**
71
+ * 方向键移动。extend 为真时移动焦点边(Shift+方向键),
72
+ * 否则整体折叠成单格移动到新位置。
73
+ */
74
+ export function moveArea(area, offsetRow, offsetCol, rowSize, colSize, extend) {
75
+ if (!area) return null;
76
+ if (extend) {
77
+ let focusRow = clampIndex(area.focusRow + offsetRow, rowSize);
78
+ let focusCol = clampIndex(area.focusCol + offsetCol, colSize);
79
+ return buildArea(area.anchorRow, area.anchorCol, focusRow, focusCol);
80
+ }
81
+ let rowIndex = clampIndex(area.anchorRow + offsetRow, rowSize);
82
+ let colIndex = clampIndex(area.anchorCol + offsetCol, colSize);
83
+ return buildCellArea(rowIndex, colIndex);
84
+ }
85
+
86
+ /**
87
+ * Tab/Enter 的顺序移动:列走到头换行。越界则停在原地。
88
+ */
89
+ export function moveNextCell(area, isRowFirst, isBack, rowSize, colSize) {
90
+ if (!area) return null;
91
+ let rowIndex = area.anchorRow;
92
+ let colIndex = area.anchorCol;
93
+ let step = isBack ? -1 : 1;
94
+ if (isRowFirst) {
95
+ colIndex += step;
96
+ if (colIndex > colSize - 1) {
97
+ colIndex = 0;
98
+ rowIndex += 1;
99
+ } else if (colIndex < 0) {
100
+ colIndex = colSize - 1;
101
+ rowIndex -= 1;
102
+ }
103
+ } else {
104
+ rowIndex += step;
105
+ }
106
+ if (rowIndex < 0 || rowIndex > rowSize - 1) {
107
+ return area;
108
+ }
109
+ return buildCellArea(rowIndex, clampIndex(colIndex, colSize));
110
+ }
111
+
112
+ /**
113
+ * 粘贴时需要补几行:从 startRowIndex 起放下 pasteRowSize 行,超出当前行数的部分。
114
+ */
115
+ export function getIncrementRowSize(startRowIndex, pasteRowSize, rowSize) {
116
+ let need = startRowIndex + pasteRowSize - rowSize;
117
+ return need > 0 ? need : 0;
118
+ }
119
+
120
+ const NEED_QUOTE_RE = /[\t\r\n"]/;
121
+
122
+ /** 单元格文本 -> 剪贴板片段,按 Excel 约定转义 */
123
+ export function encodeClipCell(value) {
124
+ let text = value === null || value === undefined ? "" : "" + value;
125
+ if (NEED_QUOTE_RE.test(text)) {
126
+ return '"' + text.replace(/"/g, '""') + '"';
127
+ }
128
+ return text;
129
+ }
130
+
131
+ /** 二维数组 -> TSV 文本 */
132
+ export function encodeClipText(matrix) {
133
+ return (matrix || [])
134
+ .map((row) => (row || []).map(encodeClipCell).join("\t"))
135
+ .join("\n");
136
+ }
137
+
138
+ const HTML_ESCAPE_MAP = {
139
+ "&": "&amp;",
140
+ "<": "&lt;",
141
+ ">": "&gt;",
142
+ '"': "&quot;",
143
+ };
144
+
145
+ export function escapeClipHtml(value) {
146
+ let text = value === null || value === undefined ? "" : "" + value;
147
+ return text.replace(/[&<>"]/g, function (ch) {
148
+ return HTML_ESCAPE_MAP[ch];
149
+ });
150
+ }
151
+
152
+ /**
153
+ * 二维数组 -> HTML 表格片段。
154
+ * 官方 copyCellArea() 的返回值是 { text, html },只写 text/plain 的话
155
+ * 粘进 Word / 邮件 / 富文本编辑器会丢掉表格结构,塌成一行文本。
156
+ */
157
+ export function encodeClipHtml(matrix) {
158
+ let trList = (matrix || []).map(function (row) {
159
+ let tdList = (row || []).map(function (cell) {
160
+ // 格内换行要转 <br>,否则富文本里同样会被挤成一行
161
+ return "<td>" + escapeClipHtml(cell).replace(/\r?\n/g, "<br>") + "</td>";
162
+ });
163
+ return "<tr>" + tdList.join("") + "</tr>";
164
+ });
165
+ return "<table><tbody>" + trList.join("") + "</tbody></table>";
166
+ }
167
+
168
+ /**
169
+ * TSV 文本 -> 二维数组。走状态机而不是 split,
170
+ * 因为 Excel 会把含换行/制表符的单元格用引号包起来。
171
+ */
172
+ export function decodeClipText(text) {
173
+ let source = text === null || text === undefined ? "" : "" + text;
174
+ if (!source) return [];
175
+ let rows = [];
176
+ let row = [];
177
+ let cell = "";
178
+ let inQuote = false;
179
+ let cellStart = true; // 只有单元格开头的引号才算包裹符
180
+ for (let i = 0; i < source.length; i++) {
181
+ let ch = source[i];
182
+ if (inQuote) {
183
+ if (ch === '"') {
184
+ if (source[i + 1] === '"') {
185
+ cell += '"';
186
+ i++;
187
+ } else {
188
+ inQuote = false;
189
+ }
190
+ } else {
191
+ cell += ch;
192
+ }
193
+ continue;
194
+ }
195
+ if (ch === '"' && cellStart) {
196
+ inQuote = true;
197
+ cellStart = false;
198
+ continue;
199
+ }
200
+ if (ch === "\t") {
201
+ row.push(cell);
202
+ cell = "";
203
+ cellStart = true;
204
+ continue;
205
+ }
206
+ if (ch === "\n" || ch === "\r") {
207
+ if (ch === "\r" && source[i + 1] === "\n") i++;
208
+ row.push(cell);
209
+ rows.push(row);
210
+ row = [];
211
+ cell = "";
212
+ cellStart = true;
213
+ continue;
214
+ }
215
+ cell += ch;
216
+ cellStart = false;
217
+ }
218
+ // 末尾没有换行时收尾;有换行时不要多造一个空行
219
+ if (cell !== "" || row.length || inQuote) {
220
+ row.push(cell);
221
+ rows.push(row);
222
+ }
223
+ return rows;
224
+ }
@@ -103,6 +103,8 @@ export default {
103
103
  targetRef: this.field.options.tableRef || null,
104
104
  pageSize: this.field.options.exportPageSize || null,
105
105
  showImageAtTable: this.field.options.showImageAtTable || null,
106
+ // 按钮上单独维护了导出列就以按钮为准,留空则沿用数据表格属性上那套
107
+ exportItemColumns: this.field.options.exportItemColumns || null,
106
108
  };
107
109
  let tableExportParam = this.handleCustomEvent(this.field.options.tableExportParam);
108
110
  let options = { ...opt, ...tableExportParam, type: type };
@@ -353,7 +353,13 @@ export default {
353
353
  return;
354
354
  }
355
355
  }
356
- this.optionModel.exportItemColumns = this.$baseLodash.cloneDeep(this.tableData);
356
+ // 用 $set:导出按钮是后加的宿主,历史表单 JSON 里没有 exportItemColumns 这个键,
357
+ // 直接赋值不会触发「已维护」文案更新
358
+ this.$set(
359
+ this.optionModel,
360
+ "exportItemColumns",
361
+ this.$baseLodash.cloneDeep(this.tableData)
362
+ );
357
363
  this.closeHandle();
358
364
  },
359
365
  generateRow() {
@@ -34,16 +34,46 @@
34
34
  <i class="el-icon-edit"></i>
35
35
  </a>
36
36
  </el-form-item>
37
+ <el-form-item label="明细导出列维护">
38
+ <a
39
+ href="javascript:void(0);"
40
+ class="a-link link-oneLind"
41
+ @click="showExportItemColumnsDialog = true"
42
+ >
43
+ <span>{{
44
+ optionModel.exportItemColumns && optionModel.exportItemColumns.length
45
+ ? "已维护"
46
+ : null
47
+ }}</span>
48
+ <i class="el-icon-edit"></i>
49
+ </a>
50
+ </el-form-item>
51
+ <el-form-item label-width="0">
52
+ <div class="export-item-columns-tip">
53
+ 不维护则按数据表格属性上的明细导出列导出;维护后本按钮只导出这里配的列。
54
+ </div>
55
+ </el-form-item>
56
+ <exportItemColumnsDialog
57
+ v-if="showExportItemColumnsDialog"
58
+ :visiable.sync="showExportItemColumnsDialog"
59
+ :designer="designer"
60
+ :selectedWidget="selectedWidget"
61
+ :optionModel="optionModel"
62
+ />
37
63
  </div>
38
64
  </template>
39
65
 
40
66
  <script>
41
67
  import i18n from "../../../../utils/i18n";
42
68
  import eventMixin from "../event-handler/eventMixin";
69
+ import exportItemColumnsDialog from "../container-data-table/exportItemColumns-dialog.vue";
43
70
 
44
71
  export default {
45
72
  name: "select-export-item-button-editor",
46
73
  mixins: [i18n, eventMixin],
74
+ components: {
75
+ exportItemColumnsDialog,
76
+ },
47
77
  props: {
48
78
  designer: Object,
49
79
  selectedWidget: Object,
@@ -52,6 +82,7 @@ export default {
52
82
  data() {
53
83
  return {
54
84
  eventParams: [],
85
+ showExportItemColumnsDialog: false,
55
86
  };
56
87
  },
57
88
  methods: {
@@ -71,4 +102,9 @@ export default {
71
102
  ::v-deep.export-divider .el-divider__text.is-center {
72
103
  width: 162px;
73
104
  }
105
+ .export-item-columns-tip {
106
+ line-height: 18px;
107
+ color: #909399;
108
+ font-size: 12px;
109
+ }
74
110
  </style>
@@ -3318,6 +3318,8 @@ export const advancedFields = [
3318
3318
  showImageAtTable: false,
3319
3319
  selectExportItemFlag: 1,
3320
3320
  exportItemConditionEnabled: !1,
3321
+ // 按钮级明细导出列:留空时沿用数据表格属性上维护的那套
3322
+ exportItemColumns: [],
3321
3323
 
3322
3324
  onCreated: "",
3323
3325
  onMounted: "",
@@ -2442,76 +2442,9 @@ modules = {
2442
2442
  };
2443
2443
  }
2444
2444
 
2445
- let exportItemConfig = null;
2446
- if (
2447
- this.widget.options.exportItemColumns &&
2448
- this.widget.options.exportItemColumns.length > 0
2449
- ) {
2450
- let formatKeys = [
2451
- "d1",
2452
- "d2",
2453
- "d3",
2454
- "d4",
2455
- "d5",
2456
- "n1",
2457
- "n2",
2458
- "n3",
2459
- "n4",
2460
- "n5",
2461
- "n6",
2462
- "n7",
2463
- ];
2464
- let exportItemColumns = this.widget.options.exportItemColumns.map(
2465
- (item) => {
2466
- let columnSlots = null;
2467
- let columnParams = {};
2468
- if (item.formatS === "render") {
2469
- let r = item.render
2470
- ? new Function("params", "h", item.render)
2471
- : null;
2472
- columnSlots = {
2473
- default: (params, h) => {
2474
- return r ? r.call(this, params, h) : "";
2475
- },
2476
- };
2477
- } else if (formatKeys.includes(item.formatS)) {
2478
- columnSlots = {
2479
- default: (params, h) => {
2480
- let cellValue = params.row[params.column.field];
2481
- return this.getFormatterValue(
2482
- cellValue,
2483
- item.formatS,
2484
- item.utcTransformEnabled
2485
- );
2486
- },
2487
- };
2488
- }
2489
- if (item.exportType) {
2490
- columnParams.exportType = item.exportType;
2491
- }
2492
- return {
2493
- id: item.id,
2494
- title: item.title,
2495
- field: item.field,
2496
- params: columnParams,
2497
- slots: columnSlots,
2498
- };
2499
- }
2500
- );
2501
- exportItemConfig = {
2502
- scriptCode:
2503
- this.widget.options.exportItemScriptCode ||
2504
- this.widget.options.formScriptCode,
2505
- columns: exportItemColumns,
2506
- param: () => {
2507
- if (this.widget.options.exportItemParam) {
2508
- return this.handleCustomParam(
2509
- this.widget.options.exportItemParam
2510
- );
2511
- }
2512
- },
2513
- };
2514
- }
2445
+ let exportItemConfig = this.buildExportItemConfig(
2446
+ this.widget.options.exportItemColumns
2447
+ );
2515
2448
  let rowConfig = {};
2516
2449
  if (this.widget.options.tableRowHeight) {
2517
2450
  rowConfig.height = this.widget.options.tableRowHeight;
@@ -3228,7 +3161,9 @@ modules = {
3228
3161
  if (isItemExport(exportType)) {
3229
3162
  let $grid = this.getGridTable();
3230
3163
  let originOption = $grid.params.originOption;
3231
- let exportItemConfig = originOption.exportItemConfig || {};
3164
+ // 导出按钮上单独维护了明细列时,配置随导出参数下发,优先于表格属性那套
3165
+ let btnConfig = customParam?.exportParam?.exportItemConfig;
3166
+ let exportItemConfig = btnConfig || originOption.exportItemConfig || {};
3232
3167
  if (exportItemConfig.scriptCode) {
3233
3168
  scriptCode = exportItemConfig.scriptCode;
3234
3169
  }
@@ -3339,30 +3274,112 @@ modules = {
3339
3274
  let tableRef = this.widget.id;
3340
3275
  return tableRef;
3341
3276
  },
3342
- /** 导出前按脱敏规则剔除列,实现见 textMaskUtil.markMaskedExportColumns。 */
3343
- markMaskedColumnsForExport() {
3277
+ /**
3278
+ * 导出前按脱敏规则剔除列,实现见 textMaskUtil.markMaskedExportColumns。
3279
+ * @param {Array} [exportItemColumns] 本次明细导出实际使用的列;不传则取表格属性上配的那套。
3280
+ */
3281
+ markMaskedColumnsForExport(exportItemColumns) {
3344
3282
  markMaskedExportColumns(
3345
3283
  this.getGridTable(),
3346
3284
  buildTextMaskContext(
3347
3285
  this.getFormRef(),
3348
3286
  this.$store.getters.companyCode
3349
- )
3287
+ ),
3288
+ exportItemColumns
3350
3289
  );
3351
3290
  },
3291
+ /**
3292
+ * 明细导出列配置 → vxe 列:formatS/render 转成渲染插槽,exportType 落到 params。
3293
+ * @param {Array} rawColumns 设计器维护的明细导出列。
3294
+ * @returns {Array} vxe 列定义。
3295
+ */
3296
+ buildExportItemColumns(rawColumns) {
3297
+ let formatKeys = [
3298
+ "d1",
3299
+ "d2",
3300
+ "d3",
3301
+ "d4",
3302
+ "d5",
3303
+ "n1",
3304
+ "n2",
3305
+ "n3",
3306
+ "n4",
3307
+ "n5",
3308
+ "n6",
3309
+ "n7",
3310
+ ];
3311
+ return rawColumns.map((item) => {
3312
+ let columnSlots = null;
3313
+ let columnParams = {};
3314
+ if (item.formatS === "render") {
3315
+ let r = item.render ? new Function("params", "h", item.render) : null;
3316
+ columnSlots = {
3317
+ default: (params, h) => {
3318
+ return r ? r.call(this, params, h) : "";
3319
+ },
3320
+ };
3321
+ } else if (formatKeys.includes(item.formatS)) {
3322
+ columnSlots = {
3323
+ default: (params, h) => {
3324
+ let cellValue = params.row[params.column.field];
3325
+ return this.getFormatterValue(
3326
+ cellValue,
3327
+ item.formatS,
3328
+ item.utcTransformEnabled
3329
+ );
3330
+ },
3331
+ };
3332
+ }
3333
+ if (item.exportType) {
3334
+ columnParams.exportType = item.exportType;
3335
+ }
3336
+ return {
3337
+ id: item.id,
3338
+ title: item.title,
3339
+ field: item.field,
3340
+ params: columnParams,
3341
+ slots: columnSlots,
3342
+ };
3343
+ });
3344
+ },
3345
+ /**
3346
+ * 组装一份明细导出配置。列既可能来自表格属性,也可能来自导出按钮自身的配置(按钮优先),
3347
+ * 但脚本编码与自定义参数始终取表格属性:按钮只决定导出哪些列,不另开取数通道。
3348
+ * @param {Array} rawColumns 明细导出列。
3349
+ * @returns {Object|null} 未维护列时返回 null。
3350
+ */
3351
+ buildExportItemConfig(rawColumns) {
3352
+ if (!rawColumns || !rawColumns.length) return null;
3353
+ let options = this.widget.options;
3354
+ return {
3355
+ scriptCode: options.exportItemScriptCode || options.formScriptCode,
3356
+ columns: this.buildExportItemColumns(rawColumns),
3357
+ param: () => {
3358
+ if (options.exportItemParam) {
3359
+ return this.handleCustomParam(options.exportItemParam);
3360
+ }
3361
+ },
3362
+ };
3363
+ },
3352
3364
  /**
3353
3365
  * 使用统一 Excel 导出器导出当前表格。
3354
3366
  * @param {Object} option 导出参数;prefix 为空时自动使用当前服务前缀。
3367
+ * option.exportItemColumns 为按钮上维护的明细导出列,传了就以它为准(同一张表格可以挂
3368
+ * 多个明细导出按钮、各导各自的列),组装成 exportItemConfig 随导出参数下发,
3369
+ * 下游(字段选择弹框 / 分页取数 / 脱敏剔除)一律优先读它,读不到才回落表格属性那套。
3355
3370
  */
3356
3371
  exportData(option) {
3357
- this.markMaskedColumnsForExport();
3372
+ let exportOption = { ...option };
3373
+ let itemColumns = exportOption.exportItemColumns;
3374
+ delete exportOption.exportItemColumns;
3375
+ if (isItemExport(exportOption.type) && itemColumns?.length) {
3376
+ exportOption.exportItemConfig = this.buildExportItemConfig(itemColumns);
3377
+ }
3378
+ this.markMaskedColumnsForExport(exportOption.exportItemConfig?.columns);
3358
3379
  let tableRef = this.getTableRef();
3359
3380
  let serviceName = this.getFormRef().reportTemplate.serviceName;
3360
- option.prefix = option.prefix || "/" + serviceName;
3361
- let exportTableTarget = this.$refs.exportTable;
3362
- let getExportTableRef = () => {
3363
- return exportTableTarget;
3364
- };
3365
- this.$excelExport({ targetRef: tableRef, ...option });
3381
+ exportOption.prefix = exportOption.prefix || "/" + serviceName;
3382
+ this.$excelExport({ targetRef: tableRef, ...exportOption });
3366
3383
  },
3367
3384
  async deleteRow(row, rowIndex) {
3368
3385
  let isTreeTable = this.widget.options.isTreeTable;
@@ -124,8 +124,10 @@ export function resolveTextMaskFlag(widgetOptions, ctx) {
124
124
  *
125
125
  * @param {Object} $grid vxe-grid 实例。
126
126
  * @param {Object} ctx 判定上下文,由 buildTextMaskContext 生成。
127
+ * @param {Array} [exportItemColumns] 本次明细导出实际使用的列(导出按钮上单独维护时由调用方
128
+ * 传入);不传则回落到表格属性上配的那套。
127
129
  */
128
- export function markMaskedExportColumns($grid, ctx) {
130
+ export function markMaskedExportColumns($grid, ctx, exportItemColumns) {
129
131
  if (!$grid || typeof $grid.getTableColumn !== "function") return;
130
132
 
131
133
  /** 打标记。列本就被其它规则(isNonDataExportColumn)剔除时不接管,避免撤销时误删。 */
@@ -174,6 +176,7 @@ export function markMaskedExportColumns($grid, ctx) {
174
176
  }
175
177
  };
176
178
  let originOption = $grid.params?.originOption;
177
- let exportItemColumns = originOption?.exportItemConfig?.columns || [];
178
- exportItemColumns.forEach(markItemColumn);
179
+ let tableItemColumns = originOption?.exportItemConfig?.columns;
180
+ let itemColumns = exportItemColumns || tableItemColumns || [];
181
+ itemColumns.forEach(markItemColumn);
179
182
  }
package/src/index.js CHANGED
@@ -28,7 +28,12 @@ Vue.component("BaseKeepAlive", BaseKeepAlive);
28
28
  import VXETable from "vxe-table";
29
29
  import "vxe-table/lib/style.css";
30
30
 
31
- // 引入扩展插件
31
+ // 区域选取/复制粘贴:自研实现,通过 window.VXETableMixin 挂载,
32
+ // 必须在下面的 Vue.use(VXETable) 之前求值(core 在 install 时读取一次并 delete)
33
+ import "@base/components/table/plugins/cell-area/index.js";
34
+ import "@base/components/table/plugins/cell-area/index.scss";
35
+
36
+ // 引入扩展插件(官方付费插件,已由上面的自研 cell-area 替代,保留仅作回退参考)
32
37
  // import "@base/components/table/plugins/extend-cell-area/vxe-table-extend-cell-area.es6.min.js";
33
38
  // import "@base/components/table/plugins/extend-cell-area/vxe-table-extend-cell-area.min.css";
34
39