fix(web): 手动排序模式才允许调 sort_order, 新排序依据下拉为准, 防覆盖策展顺序

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VCShKevM5prWZhp1kk1iGh
This commit is contained in:
zty 2026-07-10 04:25:07 -04:00
parent 8c82d18117
commit c7134f4332
1 changed files with 18 additions and 10 deletions

View File

@ -46,8 +46,17 @@ const MaterialCard: React.FC<{
(cert?.type === ADMIN_TYPE.SUPER_ADMIN ||
(cert?.type === ADMIN_TYPE.ADMIN && cert?.authz_mtrl_mgmt === 1))
const pageDataRef = useRef<Material[]>([])
// 仅在「手动排序」视图下启用排序控件(避免在按其他字段排序时破坏 sort_order 语义)
const canSort = !modal && tab === DATA_TYPE.PUBLIC && isAdmin && (!filterConditions?.sort || filterConditions?.sort === 'sort_order')
// 仅在「手动排序」视图下启用排序控件(避免在按其他字段排序时破坏 sort_order 语义)。
// 顶部「排序依据」Select 才是实际决定请求排序字段的来源(见下方 request
// 因此这里额外要求 sortKey === 'sort_order' 且未开启分组,避免在 Ypt/污染物排序或分组视图下
// 误开放拖动排序、把当前展示顺序(非 sort_order 顺序)误当成 sort_order 持久化覆盖策展顺序
const canSort =
!modal &&
tab === DATA_TYPE.PUBLIC &&
isAdmin &&
(!filterConditions?.sort || filterConditions?.sort === 'sort_order') &&
sortKey === 'sort_order' &&
!groupByTier
// pageDataRef.current 为全部材料(按 sort_order 升序)。输入目标全局序号(1-based)直接定位:
// 把材料移到目标位置后,对全部材料按新顺序连续重编号(0,1,2,...),保证全局顺序一致、不跨页错乱
const moveSortTo = async (material_id: string, targetPos: number) => {
@ -261,6 +270,7 @@ const MaterialCard: React.FC<{
tableRef.current?.reload()
}}
options={[
{ value: 'sort_order', label: '手动排序' },
{ value: 'ypt', label: '综合 Ypt' },
{ value: 'methanal_be_area', label: '甲醛 Yp' },
{ value: 'tvoc_be_area', label: 'TVOC Yp' },
@ -544,6 +554,10 @@ const MaterialCard: React.FC<{
request={async ({ type, conditions, sortKey: skParam, groupByTier: gbtParam, ...other }) => {
// 弹窗与独立页面统一:都按当前 tab(type) 分别查公共库或自建库
try {
// 旧筛选区「排序」下拉已被顶部「排序依据」Select 取代:
// 从 conditions 里剔除 sort不让它随 otherConditions 传给后端,
// 也不再把它转成 searchParams() 的第三个参数(那会覆盖 query.sort_key/sort_val
// 导致新 Select 选的排序字段被静默忽略)。'category' 仍保留为纯前端排序(见下方 data.sort
const { sort, ...otherConditions } = conditions ?? {}
const sortByCategory = sort === 'category'
const data = await api.material.search(
@ -554,18 +568,12 @@ const MaterialCard: React.FC<{
...other,
display: 1,
with_cltrs: 1,
// 顶部「排序依据」控件的默认值(如 ypt 升序);若下方筛选区的「排序」被管理员显式选中,
// 下面的第三个参数会覆盖此处的 sort_key/sort_val
// 顶部「排序依据」Select 始终是排序字段的唯一来源,不会被旧筛选区排序覆盖
sort_key: skParam,
sort_val: 'asc',
group_by_tier: gbtParam ? 1 : 0
},
false,
!sortByCategory && sort
? {
[sort]: sort !== 'updated_at' ? 'ascend' : 'descend'
}
: undefined
false
)
)
pageDataRef.current = data