fix: correct operational statistics and form interactions

This commit is contained in:
hectorzhao
2026-09-09 23:15:42 +08:00
parent 6d63eb5452
commit 5bcdbb2a03
33 changed files with 2920 additions and 829 deletions
+29 -17
View File
@@ -382,8 +382,8 @@ function RetirementHeatmap({
title: string;
}) {
const [pageState, setPageState] = useState({ key: '', page: 1 });
const [keyword, setKeyword] = useState('');
const deferredKeyword = useDeferredValue(keyword.trim().toLocaleLowerCase('zh-CN'));
const [filters, setFilters] = useState({ tenantName: '', applicationName: '', signatureName: '', channelName: '' });
const deferredFilters = useDeferredValue(filters);
const visible = items.filter((item) => item.dimensionType === dimensionType);
const dates = previousDateKeys(date, 30);
const cellMap = new Map(
@@ -394,12 +394,14 @@ function RetirementHeatmap({
);
const rows = dimensions
.filter((item) => item.dimensionType === dimensionType)
.filter(
(item) =>
!deferredKeyword ||
[item.channelName, item.tenantName, item.applicationName, item.signatureName].some((value) =>
value?.toLocaleLowerCase('zh-CN').includes(deferredKeyword),
),
.filter((item) =>
Object.entries(deferredFilters).every(
([key, value]) =>
!value.trim() ||
(item[key as keyof typeof deferredFilters] ?? '')
.toLocaleLowerCase('zh-CN')
.includes(value.trim().toLocaleLowerCase('zh-CN')),
),
)
.map((item) => ({
key: `${item.signatureId}:${item.channelId ?? ''}:${item.carrier}`,
@@ -419,7 +421,7 @@ function RetirementHeatmap({
}))
.sort((left, right) => right.total - left.total || left.signatureName.localeCompare(right.signatureName, 'zh-CN'));
const totalPages = Math.max(1, Math.ceil(rows.length / pageSize));
const paginationKey = JSON.stringify([date, deferredKeyword, dimensionType, dimensions.length, pageSize]);
const paginationKey = JSON.stringify([date, deferredFilters, dimensionType, dimensions.length, pageSize]);
const page = pageState.key === paginationKey ? pageState.page : 1;
const setPage = (value: number) => setPageState({ key: paginationKey, page: value });
const currentPage = Math.min(page, totalPages);
@@ -432,13 +434,23 @@ function RetirementHeatmap({
<h2>{title}</h2>
<p className="muted"></p>
</div>
<div className="signature-retirement-heatmap__actions">
<Input
aria-label={`${title}搜索通道、企业、企业应用或签名`}
onChange={(event) => setKeyword(event.target.value)}
placeholder={dimensionType === 'channel' ? '搜索通道、企业、应用或签名' : '搜索企业应用或签名'}
value={keyword}
/>
<div className="analytics-activity-filters">
{(
[
['tenantName', '企业'],
['applicationName', '企业应用'],
['signatureName', '签名'],
...(dimensionType === 'channel' ? [['channelName', '通道']] : []),
] as Array<[keyof typeof filters, string]>
).map(([key, label]) => (
<Input
key={key}
label={label}
placeholder={`搜索${label}`}
value={filters[key]}
onChange={(event) => setFilters((current) => ({ ...current, [key]: event.target.value }))}
/>
))}
<Tag tone="info">T-1 T-30</Tag>
</div>
</div>
@@ -500,7 +512,7 @@ function RetirementHeatmap({
</>
) : (
<p className="empty-state">
{deferredKeyword
{Object.values(deferredFilters).some((value) => value.trim())
? '没有匹配企业、企业应用或签名的热力图维度。'
: '暂无已确认到运营商的报备事实,尚未形成检测热力图。'}
</p>