| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- import { InputNumber, Typography } from 'antd'
- import { getConfigDisplayLabel } from '../api/configCodes'
- import {
- BOOST_MAX,
- BOOST_MIN,
- getDefaultBoostForCode,
- type RankingParams,
- } from '../utils/scoring'
- const { Text } = Typography
- interface Props {
- boostCodes: string[]
- configCodes: Record<string, string>
- rankingParams: RankingParams
- onChange: (next: RankingParams) => void
- }
- export default function DimensionBoostRow({
- boostCodes,
- configCodes,
- rankingParams,
- onChange,
- }: Props) {
- if (boostCodes.length === 0) return null
- return (
- <div style={{ display: 'flex', gap: 8, flexWrap: 'wrap', alignItems: 'center', marginTop: 10 }}>
- <Text style={{ fontSize: 12, color: '#666', whiteSpace: 'nowrap' }}>维度 Boost</Text>
- {boostCodes.map((code) => {
- const defaultVal = getDefaultBoostForCode(code)
- const val = rankingParams.boostsByCode?.[code] ?? defaultVal
- const isCustom = code in (rankingParams.boostsByCode ?? {})
- return (
- <div key={code} style={{ display: 'flex', alignItems: 'center', gap: 2 }}>
- <Text style={{ fontSize: 11, color: isCustom ? '#1677ff' : undefined, whiteSpace: 'nowrap' }}>
- {getConfigDisplayLabel(code, configCodes)}
- </Text>
- <InputNumber
- size="small"
- min={BOOST_MIN}
- max={BOOST_MAX}
- step={0.05}
- value={val}
- onChange={(v) => {
- const next = { ...rankingParams.boostsByCode }
- if (typeof v === 'number' && v !== defaultVal) {
- next[code] = v
- } else {
- delete next[code]
- }
- onChange({ ...rankingParams, boostsByCode: next })
- }}
- style={{ width: 68 }}
- />
- </div>
- )
- })}
- </div>
- )
- }
|