Tableaux, calendriers et chronologies
Quatre composants prennent les mêmes enregistrements qu'afficherait une table et les organisent autrement que par ordre de lignes — par carte, par colonne, par date, par intervalle. Les quatre se lient via le module partagé dataSource.
gallery
Une grille de cartes responsive.
| Propriété | Description |
|---|---|
dataSource |
Liaison de table. |
gridColumns |
Nombre de colonnes par point de rupture — { mobile, sm, md, lg, xl }, de 1 à 6. |
galleryCard |
Configuration de la carte (voir ci-dessous). |
layout |
grid (lignes uniformes) ou masonry (hauteurs variables). |
emptyMessage |
Affiché quand rien ne correspond. |
Propriété de galleryCard |
Description |
|---|---|
coverImage |
URL de l'image de couverture, généralement une référence $record.*. |
aspectRatio |
Rapport de la couverture, p. ex. 4:3, 16:9, 1:1. |
children |
Composants rendus dans le corps de la carte. |
hoverOverlay |
{ children } rendus par-dessus la carte au survol. |
onClick |
Action invoquée au clic sur la carte. |
- type: gallery
dataSource: { table: products }
gridColumns: { mobile: 1, md: 2, lg: 3 }
layout: masonry
galleryCard:
coverImage: '$record.photo'
aspectRatio: '4:3'
children:
- { type: text, element: h3, content: '$record.name' }kanban
Un tableau regroupant les enregistrements en colonnes selon la valeur d'un champ, avec glisser-déposer entre elles.
| Propriété | Description |
|---|---|
dataSource |
Liaison de table. |
kanbanGroupBy |
{ field } — le champ dont les valeurs deviennent les colonnes. |
card |
Configuration de la carte (voir ci-dessous). |
drag |
{ enabled, persistAction } — si les cartes se déplacent, et ce qui enregistre le déplacement. persistAction doit être une action crud ({ type: crud, operation: update, table }) ; c'est le seul type qu'un dépôt exécute. |
colorField |
Sans effet — acceptée puis ignorée. Le tableau lit card.colorField. |
emptyColumnMessage |
Affiché dans une colonne sans carte. |
Propriété de card |
Description |
|---|---|
children |
Composants rendus dans le corps de la carte. |
coverImage |
URL de l'image de couverture de la carte. |
colorField |
Champ dont les couleurs d'options déclarées remplissent la carte. Voir Colorer les enregistrements selon un champ. |
footer |
Entrées { field, format } du pied de carte. format vaut relative-date, short-date, avatar, badge ou text. |
onClick |
Action invoquée au clic sur la carte. |
- type: kanban
dataSource: { table: tasks }
kanbanGroupBy: { field: status }
drag: { enabled: true }
card:
children: [{ type: text, content: '$record.title' }]
footer: [{ field: assignee, format: avatar }, { field: due_date, format: short-date }]calendar
Un calendrier mensuel, hebdomadaire ou journalier d'enregistrements datés. Les correspondances de champs se situent au premier niveau — seule la gestion des clics vit sous calendarEvent et calendarInteraction.
| Propriété | Description |
|---|---|
dataSource |
Liaison de table. |
dateField |
Champ fournissant le début de chaque événement. |
endDateField |
Champ fournissant sa fin, pour les événements qui durent. |
labelField |
Champ rendu comme libellé de l'événement. |
colorField |
Champ colorant l'événement. Un événement coloré est rendu comme un bloc — voir ci-dessous. |
defaultView |
month, week ou day. |
maxEventsPerDay |
Plafond avant qu'une cellule ne se replie en « +N autres ». |
calendarEvent.onEventClick |
Action invoquée au clic sur un événement. |
calendarInteraction.onDateClick |
Action invoquée au clic sur une date ou un créneau vide. |
calendarInteraction.timeSlotInterval |
Durée d'un créneau en minutes pour les vues semaine et jour. |
calendarInteraction.showCurrentTimeIndicator |
Trace un trait à l'heure courante. |
- type: calendar
dataSource: { table: bookings }
dateField: starts_at
endDateField: ends_at
labelField: customer_name
defaultView: week
calendarInteraction: { timeSlotInterval: 30, showCurrentTimeIndicator: true }data-timeline
Une vue de type Gantt pour les enregistrements qui occupent un intervalle plutôt qu'un instant. Son schéma est délibérément minimal — dataSource plus props — et les correspondances de champs se lisent dans props :
Clé de props |
Description |
|---|---|
startField |
Obligatoire au rendu. Champ fournissant le début de chaque barre. |
endField |
Champ fournissant sa fin. |
labelField |
Champ rendu comme libellé de la barre. |
groupBy |
Champ dont les valeurs deviennent les lignes de la chronologie. |
colorField |
Champ dont la valeur fixe la couleur de la barre. |
defaultZoom |
day, week, month, quarter ou year. |
- type: data-timeline
dataSource: { table: phases }
props:
startField: starts_on
endField: ends_on
labelField: name
groupBy: workstream
defaultZoom: monthCes clés de props ne sont pas validées par le schéma. Un startFeild mal orthographié passe la validation et le composant affiche son état d'erreur au lieu d'une chronologie. Vérifiez l'orthographe ici plus attentivement qu'ailleurs.
Notez que data-timeline est l'îlot Gantt lié aux données ; le timeline simple des composants d'affichage est une liste structurelle statique avec un rail, et n'accepte aucune source de données.
Colorer les enregistrements selon un champ
kanban, calendar et data-timeline acceptent chacun un colorField désignant le champ dont la valeur colore la carte, l'événement ou la barre. Les trois l'écrivent différemment, car la clé se place là où chaque composant range déjà sa configuration d'affichage :
| Composant | Clé |
|---|---|
kanban |
card.colorField |
calendar |
colorField |
data-timeline |
props.colorField |
La couleur provient des couleurs d'options déclarées sur ce champ. Seuls single-select, multi-select et status portent des déclarations d'options : eux seuls peuvent donc en fournir une.
tables:
- name: tasks
fields:
- name: priority
type: single-select
options:
- { value: urgent, color: '#DC2626' }
- { value: normal, color: '#2563EB' }- type: kanban
dataSource: { table: tasks }
kanbanGroupBy: { field: status }
card:
colorField: priority # les cartes urgent se remplissent en #DC2626, normal en #2563EBLe texte n'est pas laissé au hasard : chaque surface dérive un premier plan à partir du remplissage — celui du noir ou du blanc qui contraste le plus — afin qu'un libellé reste lisible sur n'importe quelle teinte choisie.
Un multi-select ne se résout que tant qu'un enregistrement porte exactement une option. Une cellule qui en porte deux ou plus ne correspond à aucune déclaration unique et emprunte le chemin « sans couleur » décrit ci-dessous.
Les couleurs déclarées l'emportent désormais : l'apparence des tableaux existants change. colorField ignorait jusqu'ici ce que le champ déclarait et attribuait à la place une couleur issue d'une palette intégrée. Il lit maintenant les déclarations. Une application qui pointe déjà colorField vers un champ aux couleurs d'options déclarées affichera ces couleurs après mise à jour, à la place des teintes de palette précédentes.
Lorsqu'une valeur ne déclare aucune couleur
Le repli diffère selon la surface, et cette différence est délibérée plutôt qu'un oubli :
| Surface | Valeur sans couleur déclarée |
|---|---|
calendar, data-timeline |
Reçoit une teinte issue d'une palette intégrée. Ces deux surfaces peignaient déjà une teinte par valeur : elles continuent. |
kanban |
Ne reçoit rien — la carte reste monochrome. Une carte kanban n'a jamais inventé de teinte, et la couleur reste un choix explicite. |
Là où une teinte de palette est utilisée, elle dérive désormais de la valeur elle-même : une valeur donnée dessine toujours la même teinte. Une chronologie attribuait auparavant les teintes dans l'ordre de première apparition, si bien qu'une barre changeait de couleur au fil de la pagination ou du filtrage des enregistrements autour d'elle.
Le repli s'applique par valeur, pas par champ : un champ qui déclare des couleurs sur certaines options et en laisse d'autres nues n'envoie que les nues sur ce chemin.
Calendrier : un événement coloré est un bloc, pas une pastille
En vue mensuelle, un calendrier rend par défaut un événement horodaté sous forme de petite pastille. Une pastille est surtout du vide : une couleur qui lui est appliquée y est donc presque invisible. Un événement porteur d'une couleur est par conséquent rendu comme un bloc plein ; un événement sans couleur conserve la pastille par défaut.
Il faut s'attendre à un changement de mise en page visible sur tout calendrier mensuel qui définit colorField — les cellules de jour qui alignaient des pastilles alignent désormais des blocs pleins.
colorField n'est pas validé. Un nom de champ mal orthographié, ou un type de champ dépourvu d'options, ne constitue pas une erreur. La surface emprunte simplement son chemin « sans couleur » : un tableau kanban reste monochrome ; un calendrier ou une chronologie retombe sur les teintes de palette calculées à partir de la valeur brute. Rien ne signale la faute de frappe. Le rowColorField de la grille fait exception — sovrium validate vérifie celui-là.
Pages connexes
- Tables et listes —
data-table,list,data-form. - Graphiques et KPI — les visualisations agrégées.
- Liaison de données —
dataSource, filtres, pagination. - Interactions et sauvegarde automatique — les actions invoquées par ces composants.
- Composants d'affichage — le
timelinenon lié aux données.
Dernière mise à jour 1 septembre 2026
Cette documentation a été rédigée avec de l'IA : des erreurs ou du contenu obsolète sont donc possibles. Sovrium est en bêta. Les contributions et corrections sont les bienvenues.