indicator-change.js 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. /**
  2. * 指标变化展示规则纯函数
  3. * 规则来源:design.md §8 变化颜色与箭头规则
  4. * 颜色映射:改善=绿 / 恶化=红 / 中性=灰
  5. */
  6. /**
  7. * 由 good_direction × movement 推导展示样式
  8. * @param {string} goodDirection higher_is_better|lower_is_better|in_range_is_better|neutral
  9. * @param {string} movement up|down|flat
  10. * @returns {{trendLabel:string, cssClass:string, arrow:string}}
  11. */
  12. export function resolveChangeStyle(goodDirection, movement) {
  13. var gd = goodDirection || 'neutral'
  14. var mv = movement || 'flat'
  15. if (mv === 'flat') {
  16. return { trendLabel: '中性', cssClass: 'flat', arrow: '→' }
  17. }
  18. // 是否"改善":higher_is_better 升=改善;lower_is_better 降=改善;in_range 视区间判定(此处交给 withRange 变体)
  19. var isImprove = false
  20. if (gd === 'higher_is_better') {
  21. isImprove = mv === 'up'
  22. } else if (gd === 'lower_is_better') {
  23. isImprove = mv === 'down'
  24. } else {
  25. // neutral / in_range_is_better(一期 in_range 的管理端手配方向;区间内移动判定留二期,先按中性展示)
  26. return {
  27. trendLabel: '中性',
  28. cssClass: gd === 'in_range_is_better' ? 'neutral-up' : mv === 'up' ? 'neutral-up' : 'neutral-down',
  29. arrow: mv === 'up' ? '↑' : '↓'
  30. }
  31. }
  32. if (isImprove) {
  33. return { trendLabel: '改善', cssClass: gd === 'higher_is_better' ? 'impr-up' : 'impr-down', arrow: mv === 'up' ? '↑' : '↓' }
  34. }
  35. return { trendLabel: '恶化', cssClass: gd === 'higher_is_better' ? 'worst-down' : 'worst-up', arrow: mv === 'up' ? '↑' : '↓' }
  36. }
  37. /**
  38. * Δ 展示文本 "±x (±x%)"
  39. * @param {number|null} delta
  40. * @param {number|null} deltaPct
  41. * @returns {string}
  42. */
  43. export function formatDelta(delta, deltaPct) {
  44. if (delta === null || delta === undefined || isNaN(delta)) return '--'
  45. var sign = delta > 0 ? '+' : ''
  46. if (deltaPct === null || deltaPct === undefined || isNaN(deltaPct)) {
  47. return sign + delta
  48. }
  49. var pctSign = deltaPct > 0 ? '+' : ''
  50. return sign + delta + ' (' + pctSign + deltaPct + '%)'
  51. }
  52. /**
  53. * CSS 颜色类:改善=green-text 恶化=red-text 中性=gray-text
  54. * @param {string} cssClass resolveChangeStyle 返回的类
  55. * @returns {string}
  56. */
  57. export function colorClassFor(cssClass) {
  58. if (cssClass.indexOf('impr') === 0) return 'green-text'
  59. if (cssClass.indexOf('worst') === 0) return 'red-text'
  60. return 'gray-text'
  61. }