update at 2026-02-13 23:03:33

This commit is contained in:
douboer@gmail.com
2026-02-13 23:03:33 +08:00
parent f5f6a42bfa
commit fa492ac3f8
2 changed files with 29 additions and 11 deletions

View File

@@ -203,6 +203,24 @@ function getThemeListScrollTopByIndex(index, totalCount) {
return safeIndex * THEME_ROW_HEIGHT_PX; return safeIndex * THEME_ROW_HEIGHT_PX;
} }
/**
* 将列索引数组归一化为升序数字数组,避免数字/字符串混用导致 UI 判断失效。
*/
function normalizeColumnIndexArray(indices) {
const source = Array.isArray(indices) ? indices : [];
const uniqueMap = {};
source.forEach((item) => {
const numeric = Number(item);
if (!Number.isNaN(numeric) && Number.isFinite(numeric)) {
uniqueMap[numeric] = true;
}
});
return Object.keys(uniqueMap)
.map((item) => Number(item))
.sort((a, b) => a - b);
}
/** /**
* 统一错误文案: * 统一错误文案:
* - xlsx 解析能力缺失时,固定提示用户去“构建 npm” * - xlsx 解析能力缺失时,固定提示用户去“构建 npm”
@@ -957,11 +975,11 @@ Page({
if (Number.isNaN(index)) { if (Number.isNaN(index)) {
return; return;
} }
const current = this.data.sourceDescriptionColumns || []; const current = normalizeColumnIndexArray(this.data.sourceDescriptionColumns);
const exists = current.indexOf(index) >= 0; const exists = current.indexOf(index) >= 0;
const next = exists const next = exists
? current.filter((item) => item !== index) ? current.filter((item) => item !== index)
: current.concat(index).sort((a, b) => a - b); : normalizeColumnIndexArray(current.concat(index));
this.setData( this.setData(
{ {
sourceDescriptionColumns: next sourceDescriptionColumns: next
@@ -977,11 +995,11 @@ Page({
if (Number.isNaN(index)) { if (Number.isNaN(index)) {
return; return;
} }
const current = this.data.targetDescriptionColumns || []; const current = normalizeColumnIndexArray(this.data.targetDescriptionColumns);
const exists = current.indexOf(index) >= 0; const exists = current.indexOf(index) >= 0;
const next = exists const next = exists
? current.filter((item) => item !== index) ? current.filter((item) => item !== index)
: current.concat(index).sort((a, b) => a - b); : normalizeColumnIndexArray(current.concat(index));
this.setData( this.setData(
{ {
targetDescriptionColumns: next targetDescriptionColumns: next
@@ -1021,8 +1039,8 @@ Page({
}, },
{ {
sourceDataColumn: this.data.sourceDataColumn, sourceDataColumn: this.data.sourceDataColumn,
sourceDescriptionColumns: this.data.sourceDescriptionColumns || [], sourceDescriptionColumns: normalizeColumnIndexArray(this.data.sourceDescriptionColumns),
targetDescriptionColumns: this.data.targetDescriptionColumns || [], targetDescriptionColumns: normalizeColumnIndexArray(this.data.targetDescriptionColumns),
delimiter: '-' delimiter: '-'
} }
); );

View File

@@ -106,7 +106,7 @@
</view> </view>
<view class="column-list" wx:if="{{sectionVisibleSourceData}}"> <view class="column-list" wx:if="{{sectionVisibleSourceData}}">
<view class="column-list-line" /> <view class="column-list-line" />
<view class="row" wx:for="{{columnHeaders}}" wx:key="*this" data-index="{{index}}" bindtap="onSelectSourceData"> <view class="row" wx:for="{{columnHeaders}}" wx:key="index" data-index="{{index}}" bindtap="onSelectSourceData">
<view class="row-link" /> <view class="row-link" />
<image src="../../assets/icons/data.svg" mode="aspectFit" /> <image src="../../assets/icons/data.svg" mode="aspectFit" />
<text class="label">{{item}}</text> <text class="label">{{item}}</text>
@@ -128,12 +128,12 @@
</view> </view>
<view class="column-list" wx:if="{{sectionVisibleSourceDesc}}"> <view class="column-list" wx:if="{{sectionVisibleSourceDesc}}">
<view class="column-list-line" /> <view class="column-list-line" />
<view class="row" wx:for="{{columnHeaders}}" wx:key="*this" data-index="{{index}}" bindtap="onToggleSourceDesc"> <view class="row" wx:for="{{columnHeaders}}" wx:key="index" data-index="{{index}}" bindtap="onToggleSourceDesc">
<view class="row-link" /> <view class="row-link" />
<image src="../../assets/icons/description.svg" mode="aspectFit" /> <image src="../../assets/icons/description.svg" mode="aspectFit" />
<text class="label">{{item}}</text> <text class="label">{{item}}</text>
<image <image
src="{{sourceDescriptionColumns.indexOf(index) > -1 ? '../../assets/icons/checkbox.svg' : '../../assets/icons/checkbox-no.svg'}}" src="{{(sourceDescriptionColumns.indexOf(index) > -1 || sourceDescriptionColumns.indexOf(index + '') > -1) ? '../../assets/icons/checkbox.svg' : '../../assets/icons/checkbox-no.svg'}}"
mode="aspectFit" mode="aspectFit"
/> />
</view> </view>
@@ -150,12 +150,12 @@
</view> </view>
<view class="column-list" wx:if="{{sectionVisibleTargetDesc}}"> <view class="column-list" wx:if="{{sectionVisibleTargetDesc}}">
<view class="column-list-line" /> <view class="column-list-line" />
<view class="row" wx:for="{{columnHeaders}}" wx:key="*this" data-index="{{index}}" bindtap="onToggleTargetDesc"> <view class="row" wx:for="{{columnHeaders}}" wx:key="index" data-index="{{index}}" bindtap="onToggleTargetDesc">
<view class="row-link" /> <view class="row-link" />
<image src="../../assets/icons/description.svg" mode="aspectFit" /> <image src="../../assets/icons/description.svg" mode="aspectFit" />
<text class="label">{{item}}</text> <text class="label">{{item}}</text>
<image <image
src="{{targetDescriptionColumns.indexOf(index) > -1 ? '../../assets/icons/checkbox.svg' : '../../assets/icons/checkbox-no.svg'}}" src="{{(targetDescriptionColumns.indexOf(index) > -1 || targetDescriptionColumns.indexOf(index + '') > -1) ? '../../assets/icons/checkbox.svg' : '../../assets/icons/checkbox-no.svg'}}"
mode="aspectFit" mode="aspectFit"
/> />
</view> </view>