summaryrefslogtreecommitdiff
path: root/frontend/components/prism/SensitivityTable.tsx
blob: ef86e9bad99e715bb91fe04418c34542eca6d4bc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
"use client";

import { fmtCurrency, fmtPct } from "@/lib/format";
import type { SensitivityMatrix } from "@/types/api";

type Props = {
  matrix: SensitivityMatrix;
  centerWacc?: number;
  centerTerminalGrowth?: number;
  currency: string;
};

export function SensitivityTable({ matrix, centerWacc, centerTerminalGrowth, currency }: Props) {
  const { wacc, terminal_growth, implied_prices } = matrix;
  const centerRow =
    centerWacc != null ? wacc.findIndex((v) => Math.abs(v - centerWacc) < 1e-9) : -1;
  const centerCol =
    centerTerminalGrowth != null
      ? terminal_growth.findIndex((v) => Math.abs(v - centerTerminalGrowth) < 1e-9)
      : -1;

  return (
    <div className="psm-val-sensitivity">
      <div className="psm-val-sensitivity-head">
        <span className="psm-val-sensitivity-title">Implied Price Sensitivity</span>
        <span className="psm-val-sensitivity-subtitle">WACC × Terminal Growth</span>
      </div>
      <table className="psm-val-sensitivity-table">
        <thead>
          <tr>
            <th className="psm-val-sensitivity-corner">WACC \ g</th>
            {terminal_growth.map((g, i) => (
              <th
                key={i}
                className={`psm-val-sensitivity-col-header${
                  i === centerCol ? " is-center" : ""
                }`}
              >
                {fmtPct(g)}
              </th>
            ))}
          </tr>
        </thead>
        <tbody>
          {wacc.map((w, rowIdx) => (
            <tr key={rowIdx}>
              <th
                className={`psm-val-sensitivity-row-header${
                  rowIdx === centerRow ? " is-center" : ""
                }`}
              >
                {fmtPct(w)}
              </th>
              {implied_prices[rowIdx]?.map((price, colIdx) => {
                const isCenter = rowIdx === centerRow && colIdx === centerCol;
                const isNegative = price != null && price < 0;
                return (
                  <td
                    key={colIdx}
                    className={`psm-val-sensitivity-cell${isCenter ? " is-center" : ""}${isNegative ? " negative" : ""}`}
                  >
                    {price != null && !isNegative ? fmtCurrency(price, 2, currency) : "—"}
                  </td>
                );
              })}
            </tr>
          ))}
        </tbody>
      </table>
    </div>
  );
}