Couleur de progress bar en fonction de la valeur

Bonjour,

On m’a demandé de colorer différemment les progress bar en fonction de leur avancement (rouge jusqu’à 75, orange jusqu’à 95, vert sinon)
Comme j’ai fait tout stackoverflow sans trouver de solution, je poste mon bricolage au cas où ça servirait à d’autres. Ce n’est peut-être pas une solution optimale d’ailleurs, mais ça m’a évité de faire du JS qui tend à faire bouger l’écran au chargement.

L’idée est d’utiliser une couleur de type gradient avec les 3 couleurs qui vont de 0% à X% de la barre. X est calculé en fonction de la progression, il vaut soit 0 soit 100.

:root {
  --red: #F15B5E;
  --orange: #F79151;
  --green: #89C73E;
  --purple: #6B4D93;
  --blue: #1982C4
}

div.progress-bar {
	background:
	   linear-gradient(to right,
	     var(--red) 0% calc(100% * sign(max(0, calc((attr(aria-valuenow type(<number>)) - 74) * -1)))),
	     var(--orange) 0% calc(100% * sign(max(0, calc((attr(aria-valuenow type(<number>)) - 95) * -1)))),
	     var(--green) 0% calc(100% * sign(max(0, calc((95 - attr(aria-valuenow type(<number>))) * -1))))
	   );
}

td[data-field="cdpPdtCompletion"] .progress-bar{
	background:
	   linear-gradient(to right,
	     var(--red) 0% calc(100% * sign(max(0, calc((attr(aria-valuenow type(<number>)) - 74) * -1)))),
	     var(--orange) 0% calc(100% * sign(max(0, calc((attr(aria-valuenow type(<number>)) - 95) * -1)))),
	     var(--green) 0% calc(100% * sign(max(0, calc((95 - attr(aria-valuenow type(<number>))) * -1))))
	   );
}

image

Bonne journée !
Emmanuelle

Bonjour Emmanuelle,

Merci pour ta contribution.

On pourrait effectivement ajouter au rendering de progress-bar un paramétrage de plage/couleur, par exemple :

red < 50
orange < 95
green <= 100

Ce genre de plage de valeurs peut se paramétrer dans les “Field styles”.
Il faudrait adapter le runtime pour l’interpréter dans le cadre d’une progress bar.

Après analyse, le besoin est plus général pour appliquer dynamiquement un style à un champ dès qu’on change de valeur en front. A date, seule la valeur du style à l’affichage est appliquée, ensuite il faut un “save” pour réappliquer le nouveau style.

Besoin :

  • Nouveau service front BusinessObject.getStyle(field, value) qui demande au back le style à appliquer = hook ObjectDB.getStyle en Java qui retourne par défaut le paramétrage du Field styles (la classe CSS par valeur ou plage de valeurs).
  • UIField : si le champ a un style défini, ajout d’un “change” automatique pour modifier le style d’après ce que lui répond le back (la classe du style est remplacée au niveau du .form-group du field)
  • et avec un nouveau trigger/event ui.field.style pour permettre de faire d’autres choses. Ainsi UIFieldInt/UIFieldFloat pourra s’y abonner et changer l’affichage du rendering BAR = progress bar.

Rien de bien complexe, ce sera fait en V7.