# Leçon 9 — Messages typés et fenêtres de dialogue (v0.7.116)

Source : https://docs.berkios.online/studio/messages-et-dialogues/ · Section : Studio · Documentation officielle BERKIOS (https://docs.berkios.online)


La commande `message` reste valable telle quelle : `message "Bonjour"` affiche un bandeau d'information. Depuis la v0.7.116, on peut préciser le **type** du message avec `message.type`, l'afficher dans une **fenêtre de dialogue (modal)** et **réagir à la réponse**.

```text
quand clic
  message.modal "Bienvenue"
```

## Les types

| Commande | Alias | Affichage par défaut | Rôle |
|---|---|---|---|
| `message.info "texte"` | `information`, `infos` | bandeau | Information. |
| `message.succes "texte"` | `succès`, `reussite`, `ok`, `success` | bandeau vert | Opération réussie. |
| `message.avertir "texte"` | `avertissement`, `attention`, `alerte`, `warning` | bandeau orange | Avertissement. |
| `message.erreur "texte"` | `echec`, `échec`, `error` | bandeau rouge | Erreur. |
| `message.modal "texte"` | `modale`, `dialogue`, `dialog`, `fenetre` | **fenêtre** | Information dans une fenêtre. Le script attend sa fermeture. |
| `message.confirmer "question"` | `confirmation`, `confirm`, `question` | **fenêtre** Oui / Non | Pose une question : `$reponse` vaut `oui` ou `non`. |
| `message.demander "question"` | `saisir`, `saisie`, `ask`, `prompt` | **fenêtre** avec un champ | Demande un texte : `$reponse` reçoit la saisie (vide si annulé). |

Un type inconnu est signalé à l'analyse : `Type de message inconnu « message.joyeux » (info, succes, avertir, erreur, modal, confirmer, demander).`

## Options (dans n'importe quel ordre, après le texte)

| Option | Effet |
|---|---|
| `modal` (`dialogue`, `popup`) | Affiche le message dans une fenêtre, même pour `info`, `succes`, `avertir`, `erreur`. |
| `bandeau` (`toast`, `notification`) | Force le bandeau (impossible pour `confirmer` et `demander`). |
| `titre "Titre"` | Titre de la fenêtre (par défaut : Information, Succès, Avertissement, Erreur, Confirmation, Saisie). |
| `bouton "Compris"` / `boutons "Oui" "Non"` | Libellés des boutons (un seul bouton pour un message simple). |
| `danger` | Bouton principal rouge (suppression, action irréversible). |
| `"$cible"` ou `dans "$cible"` | `confirmer` / `demander` : écrit aussi la réponse dans cette cible, en plus de `$reponse`. |
| `alors commande …` | Commande exécutée si la réponse est **Oui** (ou la saisie validée) ; pour un message simple, après sa fermeture. |
| `sinon commande …` | Commande exécutée si la réponse est **Non** (ou la saisie annulée). Seulement avec `confirmer` et `demander`. |

Le texte accepte `{Composant}` et `{$variable}` comme `set` ou `message`.

## Conditions

Deux façons de réagir à une réponse, au choix du plus lisible :

```text
quand clic
  # 1. Branches alors / sinon sur la même ligne
  message.confirmer "Supprimer ce client ?" danger boutons "Supprimer" "Garder" alors effacer "Nom" sinon message.info "Annulé"

  # 2. La réponse est toujours dans $reponse : on peut tester avec « si »
  message.confirmer "Continuer ?"
  si "$reponse" = oui alors message.succes "C'est parti"
```

`oui` / `non` se comparent aussi avec `true` / `false` / `vrai` / `faux` : `si "$reponse" = true …` fonctionne. Un message peut aussi se trouver derrière un `si` :

```text
quand clic
  si "Stock" < 5 alors message.avertir "Stock bas : {Stock}" modal titre "Magasin"
```

## Forme avec parenthèses (facultative)

`message.confirmer("Supprimer ?", "$ok")` équivaut à `message.confirmer "Supprimer ?" "$ok"`.

## Limites

- Après `alors`, **une seule commande** ; une commande de contrôle (`si`, `sauf-si`, `repeter`) y est refusée. Pour enchaîner plusieurs actions, appelez une **fonction** (`alors effacer-nom`, voir la v0.7.115).
- La commande après `alors` ne peut pas contenir elle-même `sinon`.
- Dans l'application Flutter générée, les fenêtres s'ouvrent avec `showDialog` (Material) ; `message.modal` ouvert pendant `quand chargement` s'affiche au premier affichage de l'interface.

Exemple complet : `examples/code-composants/14-messages-types.berkios.json`.

## Le même principe dans le langage `.bk` (v0.7.123)

Dans un fichier `.bk`, l'action d'un bouton `afficher le message` accepte les mêmes types, la fenêtre modale et des lignes `oui :` / `non :` :

```text
bouton supprimer "Supprimer"
  quand on clique : afficher le message confirmation "Supprimer ce client ?" titre "Suppression" boutons "Supprimer" "Garder" danger
    oui : afficher le message succès "Client supprimé"
    non : afficher le message "Suppression annulée"

bouton bienvenue "Bienvenue"
  quand on clique : afficher le message modal "Bienvenue dans BERKIOS !" titre "Bienvenue"

bouton demander "Mon nom"
  quand on clique : afficher le message saisie "Quel est votre nom ?" dans nom
```

| Élément | Français | English | Español | Kiswahili |
|---|---|---|---|---|
| Types | `information`, `succès`, `avertissement`, `erreur`, `confirmation`, `saisie` | `info`, `success`, `warning`, `error`, `confirmation`, `input` | `información`, `éxito`, `advertencia`, `error`, `confirmación`, `entrada` | `taarifa`, `mafanikio`, `onyo`, `hitilafu`, `uthibitisho`, `ingizo` |
| Affichage | `modal`, `bandeau` | `modal`, `banner` | `modal`, `banner` | `dirisha`, `arifa` |
| Options | `titre "…"`, `boutons "OK" "Non"`, `danger`, `dans composant` | `title`, `buttons`, `danger`, `into` | `título`, `botones`, `peligro`, `hacia` | `kichwa`, `vitufe`, `hatari`, `ndani ya` |
| Réponses | `oui :` / `non :` | `yes :` / `no :` | `sí :` / `no :` | `ndiyo :` / `hapana :` |

- `afficher le message "texte"` (sans type) reste un bandeau d'information.
- `confirmation` et `saisie` s'ouvrent toujours dans une fenêtre ; `oui` / `non` n'existent que sous elles. Une saisie écrit son texte dans le composant indiqué après `dans`.
- Une ligne `oui :` / `non :` contient une seule action (ouvrir, fermer, montrer, message simple…). Une nouvelle confirmation ou saisie y est refusée.
- `berkios traduire` convertit ces lignes dans les quatre langues. Exemples : `compiler/examples/messages.fr.bk` et `messages.en.bk`.
- Dans le projet produit, le bouton reçoit `buttonAction` avec `messageKind`, `messageDisplay`, `messageTitle`, `okLabel`, `cancelLabel`, `danger`, `responseTargetWidgetId`, `onYes`, `onNo`.
