Skip to content

Conversation

camdecoster
Copy link
Contributor

@camdecoster camdecoster commented Oct 9, 2025

Description

Add template string fallback attributes.

Closes #7564
Closes #7565

Changes

  • Lints/formats files updated in this PR
  • Adds hovertemplatefallback and texttemplatefallback attributes
  • Adds helper functions to include these attributes
  • Updates templateFormatString (and derived functions) to pass fallback value in, use in case of missing variable
  • Updates tests, baseline images per above changes

Demo video or screenshots

Before After
image image

Testing

  • Be on master
  • Load the following mock using plotly.js DevTools:
    {
      "data": [
        {
        "hovertemplate": "Time: %{x}<br>User: %{y}<br>Usage: $%{z:.2f}<extra></extra>",
        "hovertemplatefallback": "Citra Hops",
        "showscale": true,
        "z": {
          "dtype": "f8",
          "bdata": "fDCpKCrK3z8qBd4FpbLBv2heJFDdueQ/K6oBjlRe+D9AplffvPjNvzvbcCYz+M2/CHRAqHRE+T/z1/BG047oP4ueeUveC96/AAAAAAAA+H9wG8Guoqjdv+fvFiuEzt2/cPmepZ74zj++Ne6+y5z+vwAAAAAAAPh/YzyhakL+4b95UaNnjjTwvx+GFtigHNQ/+QOLgYgO7b/HExTEy5j2v0ENnx9Mc/c/2Zhm4TzmzL/GNbFGh0mxP2InDcHEy/a/KPrKUZVr4b81BjE/bGW8PxX1zj14avK/6N19s28L2D/SOz2hbjjjvwAAAAAAAPh/p/2pOS5B479X9hhz7qL9P4aDsNZupIu/AAAAAAAA+H83Lh+1SVLqPxx64lmTiPO/tWnv0gq8yj/DMFAPz1r/v/9asANAQPW/QDr0vL8yyT++nUiqhKHnPwwupFVl78U/XzGyNiCbvb/hr1BvSEXTvwa4sKwGqPe/J6aouPYI578AAAAAAAD4f2LC1/746fA/iEEAkdf91T9OFQ2YaTX8vwAAAAAAAPh/QA8qJjCl2L9NOahTWKnlv/nsCSfakuM/1Pz0Wvl+8D8enOD2C83tP1MVD7Xe2uq/zylztCLK07+KTA+JazPVPwBoGGqqN+8/VWYobMqq3r8AAAAAAAD4fzBuPE2Ms/G/9PWajqkj87+w1UonNgDqP/3Ng74os/U/+iMrXUFvsr9qgA6DeA7wP0KkKG0LJdc/rwoBL9Kk5L+P6aQIGyHXPwAAAAAAAPh/UhmlZMpXor8AAAAAAAD4f19fz+s89QTAv1gZewZN6j8hrkt3t0i2P8Dt4LnvItO/OIpGXqJ9tz/iHOwPFc3/v8FsDls1Hsy/04nor+7a1j8AAAAAAAD4fwAAAAAAAPh/S3Lu+S3f6b+hdpfJZA7gvwAAAAAAAPh/gMUgGEIK1T/02ryry/PgvwNc6tKvbOA/AAAAAAAA+H9TvHjHI//uP3hIyAw4d+a/l5Lxpmr41L8apYzLTBjZvxD0dqaOave/IzBrdqLz0j8UgR0sIbXQPw06yBDZ8XQ/hE70gPMGzr8EJo3KW6X2v3SGH1za69q/CzQW3gjv1b98MTRhQazpv8BzdZwCpcS/Mxz8H/jb2T8bAn5E0S3+P5EnXNaQWMY/AAAAAAAA+H9gVYk14w6zv+1yI3JJs/6/OEbHD3Qmm78AAAAAAAD4f7gI2ke4tANA5IZhukifyL9yMGE5jUzTPwgyV7e9xaG/zxHyveey8r9cb1eTAEnyP1Z/Bd3VD+g/",
          "shape": "10, 12"
        },
        "type": "heatmap"
        }
      ]
    }
  • Hover over a blank square and note that the 'Usage' line contains the format specifier
  • Switch to this branch
  • Reload the same mock
  • Hover over a blank square and note that the 'Usage' line contains the fallback value

Notes

  • The default fallback value is an empty string: ''
  • The linting/formatting changes make it hard to review this PR. I'd suggest looking at individual commits. For the most part, these touch different files.

TODO

  • Add draftlog
  • Add/update tests for fallback value

@gvwilson gvwilson requested a review from emilykl October 9, 2025 12:15
@gvwilson gvwilson added feature something new P1 needed for current cycle labels Oct 9, 2025
@camdecoster camdecoster marked this pull request as ready for review October 9, 2025 15:36
@camdecoster
Copy link
Contributor Author

FYI @alexshoe.

@emilykl
Copy link
Contributor

emilykl commented Oct 9, 2025

@camdecoster A couple high-level comments before I dig into the gritty details:

  • I'm starting to feel that - might be a better default fallback value than empty string, because it indicates that it's a placeholder for something, which looks less awkward when you're using the templated value as part of a sentence. To take an example from the Jasmine tests, '- of -' looks less awkward than ' of '.

  • We've discussed that there are two separate scenarios where a value may end up as undefined: (1) is where the attribute named in the template simply doesn't exist, and (2) is where the attribute exists, but some individual data values happen to be undefined. I do think these two cases should be handled differently. The first is an error on the chart developer's part, and they should be alerted to it so they can fix it; the second is a normal quirk of the data and should be handled seamlessly. Open to discussing further but at the moment my suggestion is:

    • If the attribute named in the hovertemplate does not exist (e.g. dev has provided hovertemplate 'value: %{foo:.2f}' but trace.foo is not an existing attribute): Maintain existing behavior -- raw template string is rendered in hover tooltip
    • If attribute named in hovertemplate does exist, but the individual data value happens to be undefined (e.g. dev has provided hovertemplate 'value: %{foo:.2f}' and trace.foo is [1, undefined, 2]: Template string is replaced with hovertemplatefallback, AND no warning is emitted. So basically the behavior implemented in this PR, but without the warning. My feeling is that the dev has not done anything wrong and doesn't need to change anything, so a warning is just log noise at that point.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feature something new P1 needed for current cycle

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FEATURE]: Make templateFormatString fallback value configurable [BUG]: Template string builder returns format specifier when value is undefined

3 participants