Add valueOnly option to block highlighting feature

Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot]
2025-12-03 23:02:02 +00:00
parent d0fc2bcef8
commit 40fb55ced0
3 changed files with 30 additions and 4 deletions

View File

@@ -159,6 +159,30 @@ Widgets can tint their metric block text automatically based on rules defined al
Supported numeric operators for the `when` property are `gt`, `gte`, `lt`, `lte`, `eq`, `ne`, `between`, and `outside`. String rules support `equals`, `includes`, `startsWith`, `endsWith`, and `regex`. Each rule can be inverted with `negate: true`, and string rules may pass `caseSensitive: true` or custom regex `flags`. The highlight engine does its best to coerce formatted values, but you will get the most reliable results when you pass plain numbers or strings into `<Block>`. Supported numeric operators for the `when` property are `gt`, `gte`, `lt`, `lte`, `eq`, `ne`, `between`, and `outside`. String rules support `equals`, `includes`, `startsWith`, `endsWith`, and `regex`. Each rule can be inverted with `negate: true`, and string rules may pass `caseSensitive: true` or custom regex `flags`. The highlight engine does its best to coerce formatted values, but you will get the most reliable results when you pass plain numbers or strings into `<Block>`.
#### Value Only Display
You can optionally hide the label and show only the value when a block is highlighted by setting `valueOnly: true` on the field configuration. This is useful when you want the highlighted value to stand out without the label text.
```yaml
- Sonarr:
icon: sonarr.png
href: http://sonarr.host.or.ip
widget:
type: sonarr
url: http://sonarr.host.or.ip
key: ${SONARR_API_KEY}
highlight:
queued:
valueOnly: true
numeric:
- level: danger
when: gte
value: 20
- level: warn
when: gte
value: 5
```
## Descriptions ## Descriptions
Services may have descriptions, Services may have descriptions,

View File

@@ -32,6 +32,8 @@ export default function Block({ value, label, field }) {
return getHighlightClass(highlight.level, highlightConfig); return getHighlightClass(highlight.level, highlightConfig);
}, [highlight, highlightConfig]); }, [highlight, highlightConfig]);
const showLabel = !highlight?.valueOnly;
return ( return (
<div <div
className={classNames( className={classNames(
@@ -44,7 +46,7 @@ export default function Block({ value, label, field }) {
data-highlight-source={highlight?.source} data-highlight-source={highlight?.source}
> >
<div className="font-thin text-sm">{value === undefined || value === null ? "-" : value}</div> <div className="font-thin text-sm">{value === undefined || value === null ? "-" : value}</div>
<div className="font-bold text-xs uppercase">{t(label)}</div> {showLabel && <div className="font-bold text-xs uppercase">{t(label)}</div>}
</div> </div>
); );
} }

View File

@@ -200,7 +200,7 @@ const ensureArray = (value) => {
}; };
const findHighlightLevel = (ruleSet, numericValue, stringValue) => { const findHighlightLevel = (ruleSet, numericValue, stringValue) => {
const { numeric, string } = ruleSet; const { numeric, string, valueOnly } = ruleSet;
if (numeric && numericValue !== undefined) { if (numeric && numericValue !== undefined) {
const numericRules = ensureArray(numeric); const numericRules = ensureArray(numeric);
@@ -208,7 +208,7 @@ const findHighlightLevel = (ruleSet, numericValue, stringValue) => {
for (const candidate of numericCandidates) { for (const candidate of numericCandidates) {
for (const rule of numericRules) { for (const rule of numericRules) {
if (rule?.level && evaluateNumericRule(candidate, rule)) { if (rule?.level && evaluateNumericRule(candidate, rule)) {
return { level: rule.level, source: "numeric", rule }; return { level: rule.level, source: "numeric", rule, valueOnly };
} }
} }
} }
@@ -218,7 +218,7 @@ const findHighlightLevel = (ruleSet, numericValue, stringValue) => {
const stringRules = ensureArray(string); const stringRules = ensureArray(string);
for (const rule of stringRules) { for (const rule of stringRules) {
if (rule?.level && evaluateStringRule(stringValue, rule)) { if (rule?.level && evaluateStringRule(stringValue, rule)) {
return { level: rule.level, source: "string", rule }; return { level: rule.level, source: "string", rule, valueOnly };
} }
} }
} }