Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

feat: Add template string fallback attributes#7577

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.

Already on GitHub?Sign in to your account

Conversation

@camdecoster
Copy link
Contributor

@camdecostercamdecoster commentedOct 9, 2025
edited
Loading

Description

Add template string fallback attributes.

Closes#7564
Closes#7565

Changes

  • Lints/formats files updated in this PR
  • Addshovertemplatefallback andtexttemplatefallback attributes
  • Adds helper functions to include these attributes
  • UpdatestemplateFormatString (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

BeforeAfter
imageimage

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
  • Update the mock value forhovertemplatefallback to befalse and reload the mock
  • Hover over a blank square and note that the 'Usage' line contains the format specifier
  • Removehovertemplatefallback from the mock and reload the mock
  • Hover over a blank square and note that the 'Usage' line contains the default fallback value

Notes

  • The default fallback value is a dash:'-'
  • Setting a fallback value offalse will result in the specifier being returned (the current behavior)
  • 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

@gvwilsongvwilson requested a review fromemilyklOctober 9, 2025 12:15
@gvwilsongvwilson added featuresomething new P1needed for current cycle labelsOct 9, 2025
@camdecostercamdecoster marked this pull request as ready for reviewOctober 9, 2025 15:36
@camdecoster
Copy link
ContributorAuthor

FYI@alexshoe.

@emilykl
Copy link
Contributor

emilykl commentedOct 9, 2025
edited
Loading

@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 forsomething, 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 asundefined: (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}' buttrace.foo is not an existing attribute):Maintain existing behavior -- raw template string is rendered in hover tooltip
    • If attribute named in hovertemplatedoes exist, but the individual data value happens to be undefined (e.g. dev has provided hovertemplate'value: %{foo:.2f}' andtrace.foo is[1, undefined, 2]:Template string is replaced withhovertemplatefallback, 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.

].join(' ')
});

exports.templatefallbackAttrs=({ editType='none'}={})=>({
Copy link
Contributor

@emilyklemilyklOct 14, 2025
edited
Loading

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

Need to set the correcteditType here, Ithink it should becalc (or possiblyplot?)

Reference for meaning of differenteditType values

Copy link
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

After reviewing the changes again, I think it should be'none' forhovertemplatefallback,'calc' fortexttemplatefallback, and'arraydraw' for the shape text template fallback. I'll go through and double check all of them.

emilykl reacted with thumbs up emoji
@camdecoster
Copy link
ContributorAuthor

@emilykl in the case of a Studio app showing this, the creator isn't necessarily going to understand what a hover template is and would think that the output is a bug showing garbled data (which is how this issue was found in the first place). Maybe we could use a different default value in the case of a missing key name. Something like'value: foo not found in bar'?

I'm fine with delineating between the two cases, so I'll work on that. Using'-' as the default also seems reasonable as the empty string may not be interpreted as missing data; it could just look wrong.

emilykl reacted with thumbs up emoji

@emilykl
Copy link
Contributor

emilykl commentedOct 16, 2025
edited
Loading

@camdecoster Yeah I do feel strongly about differentiating the two cases (and issuing a warning only in the case where the variable name does not exist) but worth discussing what is the correct string to display in the "variable does not exist" case.

Ideally something that doesn't use English words... what about the variable name surrounded by question marks? So that hovertemplate'value: %{foo:.2f}' would become'value: ?foo?' ?

*@param {array} options.data - Data objects containing substitution values
*@param {string} options.fallback - Fallback value when substitution fails
*@param {object} options.labels - Data object containing fallback text when no formatting is specified, ex.: {yLabel: 'formattedYValue'}
*@param {object} options.locale - D3 locale for formatting
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

nit: IMO this argument should continue to be calledd3locale for clarity

Copy link
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

I'm going to leave it as is since the JSDoc description explains what it is.

@emilykl
Copy link
Contributor

@camdecoster My above comments still stand but I've finished reviewing the code and everything looks great otherwise 👍

if(!SIMPLE_PROPERTY_REGEX.test(key)){
// true here means don't convert null to undefined
value=lib.nestedProperty(obj,key).get(true);
keyIsMissing=false;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

hm this is a tough one, the question is whetherlib.nestedProperty(obj, key).get() provides a way to distinguish between "the value of this key path is undefined" vs. "this key path was not found in the object"

Copy link
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

This is moot since I removed this part of the code.

@camdecoster
Copy link
ContributorAuthor

I looked into providing a different value for missing vs. undefined values but that didn't work. When a value is undefined, the key for that variable might be missing from the data object passed in. So I moved forward with the fallback value getting used all the time when a value is missing. To return the specifier (the current behavior), you must sethovertemplatefallback ortexttemplatefallback tofalse.

Let's see how the community responds (if they do) and we can adjust if necessary.

emilykl reacted with thumbs up emoji

`Variable '${key}' in${name} could not be found!`,
'Please verify that the template is correct.'
'Please verify that the template is correct.',
`Using value: '${fallbackValue}'.`
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

Suggested change
`Using value: '${fallbackValue}'.`
fallback===false ?'' :`Using fallback value: '${fallbackValue}'.`

Copy link
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

As we discussed, I'm going to leave this as is since it clarifies what the variable is being replaced with.

dflt:'-',
editType,
description:"Fallback value that's displayed when a variable referenced in a template has an undefined value."
description:[
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

@camdecoster nit: these should be single-quoted strings – does the Biome formatter enforce that?

Copy link
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

Double quotes are okay in this case because single quotes are used within the strings: that's and 'false'. This way no quotes need to be escaped.

Copy link
Contributor

@emilyklemilykl left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

Nice! 🚀

@camdecostercamdecoster merged commit222a6f5 intomasterOct 27, 2025
6 checks passed
@camdecostercamdecoster deleted the cam/7564/return-empty-string-template-format-function branchOctober 27, 2025 20:28
Sign up for freeto join this conversation on GitHub. Already have an account?Sign in to comment

Reviewers

@emilyklemilyklemilykl approved these changes

Assignees

@camdecostercamdecoster

Labels

featuresomething newP1needed for current cycle

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

[FEATURE]: MaketemplateFormatString fallback value configurable [BUG]: Template string builder returns format specifier when value isundefined

4 participants

@camdecoster@emilykl@gvwilson

[8]ページ先頭

©2009-2025 Movatter.jp