Skip to content

Koala user defined custom colors#3361

Open
Brett-S-OWB wants to merge 18 commits into
openWB:feature-custom-colorsfrom
Brett-S-OWB:custom-colors-bv
Open

Koala user defined custom colors#3361
Brett-S-OWB wants to merge 18 commits into
openWB:feature-custom-colorsfrom
Brett-S-OWB:custom-colors-bv

Conversation

@Brett-S-OWB
Copy link
Copy Markdown
Contributor

Benutzerdefinierte Farben im Koala Theme implementiert und konsistent über mehrere UI-Komponenten hinweg integriert.

Die Farben können nun individuell für verschiedene Entitäten (z. B. Ladepunkte, Fahrzeuge, Komponenten) definiert werden (in ui-settings project) und werden automatisch in der gesamten Oberfläche verwendet.

Diagramme

  • Unterstützung benutzerdefinierter Farben im:
    • Energy Flow Chart
    • History Chart
    • Daily Totals Chart

Daily Totals Chart

  • Erweiterung der Batterie-Anzeige:
    • Dropdown bei mehreren Batterien
    • Trennlinie zwischen einzelnen Einträgen
  • Erweiterung der Ladepunkt-Anzeige:
    • Trennlinie zwischen einzelnen Einträgen
  • Verbesserung der Darstellung:
    • Ellipsis (Textverkürzung) für lange Namen bei Batterien und Ladepunkten

Karten (Carousel)
Benutzerdefinierte Farben wurden ergänzt für:

  • Charge Point Cards
  • Vehicle Cards
  • Battery Cards

Tabellenansichten

  • Integration der Farben in:
    • Charge Point Tabelle
    • Vehicle Tabelle
  • Darstellung als visuelle Farbmarkierung pro Zeile

Änderungen an BaseTable
Die bisherige Implementierung der Tabelle hatte zwei unterschiedliche Render-Pfade:
(ChargePointInformation.vue)

  • rowExpandable = true (z. B. kleine Screens)
→ BaseTable hat die komplette Tabellenzeile selbst gerendert (#body Slot)
  • rowExpandable = false (z. B. große Screens)
→ QTable hat das Rendering übernommen (Default-Verhalten)
    Gleichzeitig wurden Inhalte über body-cell-* Slots vom Parent bereitgestellt.
  • Ergebnis:
Zwei unterschiedliche Rendering-Mechanismen je nach Screen-Größe, was zu Inkonsistenzen bei Layout, Spacing und Styling geführt hat.

Problem
Für die neue Funktion einer benutzerdefinierten Farbanzeige pro Zeile (farbiger Indikator / Farbstreifen) war ein konsistenter Zugriff auf die gesamte Zeilenstruktur notwendig.
Durch die unterschiedlichen Render-Pfade war es nicht möglich, diesen Farbindikator zuverlässig und einheitlich darzustellen.

Lösung
Die Tabellenstruktur wurde vereinheitlicht:

  • BaseTable rendert jetzt immer die komplette Tabellenzeile (#body Slot wird immer verwendet)
  • wird zentral in BaseTable erzeugt
  • Parent-Komponenten liefern nur noch den Zelleninhalt über Slots (body-cell-*)
    -Klare Trennung:
  • Struktur & Layout → BaseTable
  • Inhalt → Parent

Neue Funktion: Farbindikator pro Zeile
Im Zuge der Umstellung wurde ein benutzerdefinierter Farbstreifen pro Tabellenzeile eingeführt:

  • Farbe wird über rowColor vom Parent geliefert
  • Darstellung erfolgt zentral in BaseTable
  • Umsetzung über ein background-image (Gradient), um:
    • vertikale Zentrierung
    • Abstand oben/unten
    • Abstand zum linken Rand
Bildschirmfoto 2026-05-11 um 15 47 38 Bildschirmfoto 2026-05-11 um 15 47 16 Bildschirmfoto 2026-05-11 um 15 47 29 Bildschirmfoto 2026-05-11 um 15 47 55 Bildschirmfoto 2026-05-11 um 15 48 21 Bildschirmfoto 2026-05-11 um 15 48 54

@Brett-S-OWB Brett-S-OWB requested a review from benderl May 11, 2026 14:17
@benderl benderl self-assigned this May 12, 2026
@benderl benderl added the enhancement New feature or request label May 12, 2026
Comment on lines +2506 to 2513
BLACK = "#000000"
BLUE = "#007bff"
CYAN = "#17a2b8"
GREEN = "#28a745"
RED = "#dc3545"
YELLOW = "#ffc107"

def upgrade_datastore_91(self) -> None:
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Die Zeilen scheinen unbeabsichtigt zu sein. Bitte entfernen.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Warum hast Du das Symbol geändert? Gibt es mit owbBattery.svg ein Problem?

Comment on lines +2 to +13
<svg
class="svg-icon"
viewBox="0 0 1024 1024"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
fill="currentColor"
>
<path
d="M711.253333 170.666667 640 170.666667 640 85.333333 384 85.333333 384 170.666667 312.746667 170.666667C281.6 170.666667 256 196.266667 256 227.413333L256 881.92C256 913.066667 281.6 938.666667 312.746667 938.666667L711.253333 938.666667C742.4 938.666667 768 913.066667 768 881.92L768 227.413333C768 196.266667 742.4 170.666667 711.253333 170.666667Z"
/>
</svg>
</template>
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Stellvertretend für alle "*Icon.vue":
Warum hast Du den Code eines SVG in ein Template gepackt? Wäre es nicht einfacher, in BaseIcon.vue direkt ein SVG zu importieren?

Comment on lines 171 to 178
:deep(.base-icon svg) {
width: 100%;
height: 100%;
fill: currentColor;
vertical-align: middle;
overflow: hidden;
}
.col-title {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Die Definition gehört eigentlich in BaseIcon.vue.

Comment on lines +649 to +654
if (defaultValue !== undefined) {
// expected missing optional value - no error
console.debug('optional path not found', topicObject, path[i]);
return defaultValue;
}
// real error case
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

defaultValue wird bereits in Zeile 656 zurückgegeben und auch vorher eine Meldung geschrieben.

soc?: number;
icon: string;
iconComponent?: Component;
iconColor?: string | null;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Ist das nicht ausreichend?

Suggested change
iconColor?: string | null;
iconColor?: string;

soc: batterySoc.value,
icon: 'icons/owbBattery.svg',
iconComponent: BatteryIcon,
iconColor: 'var(--q-diagram-icon)',
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Warum wird die individuelle Farbe der Batterie nicht verwendet?

Comment on lines 822 to 835
<foreignObject
:x="-svgIconWidth / 2"
:y="-svgIconHeight / 2"
:height="svgIconHeight"
:width="svgIconWidth"
/>
:height="svgIconHeight"
>
<div class="icon-wrapper" :style="{ color: component.iconColor }">
<component
:is="component.iconComponent"
style="width: 100%; height: 100%"
/>
</div>
</foreignObject>
</g>
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Hmm... jetzt haben wir eine Vue Datei, welche im Template ein DIV mit einem SVG enthält. Das SVG hat dann wieder mehrere andere Vue Komponenten, welche auch jeweils ein DIV mit einem SVG enthalten.

Ist das nicht etwas zu verschachtelt?

background: var(--q-charge-point-fill);
border: 0.125rem solid var(--q-charge-point-stroke);
}
.counter.sub-row {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Bezieht sich der Selector auf ein Element oder zwei verschachtelte?
Oder anders gefragt: warum ist es hier beim Counter anders, als bei den anderen Komponenten?

'full-height': props.fullHeight,
}"
}, batteryUserDefinedColor && 'has-custom-color']"
:style="batteryUserDefinedColor && { '--component-color': batteryUserDefinedColor }"
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Bitte verwende nach Möglichkeit keine direkten style Angaben im Template. batteryDefinedColor kann auch direkt im <style> Bereich verwendet werden. Das gilt auch für die anderen Dateien.

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

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants