Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b0ac6dfdb9 | ||
|
|
7f06606300 | ||
|
|
985af3a294 |
+22
-1
@@ -6,7 +6,7 @@ Format basé sur [Keep a Changelog](https://keepachangelog.com/fr/1.1.0/),
|
|||||||
et [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
et [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
> **En cours de développement** : les changements à venir sont listés dans la section
|
> **En cours de développement** : les changements à venir sont listés dans la section
|
||||||
> [Unreleased](#unreleased). La dernière version livrée est **2.76.1**.
|
> [Unreleased](#unreleased). La dernière version livrée est **2.77.0**.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -14,6 +14,27 @@ et [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## [2.77.0] — 2026-10-23
|
||||||
|
|
||||||
|
### Modifié
|
||||||
|
|
||||||
|
- **Panneau Spark V3 : la console en surimpression pleine page
|
||||||
|
(#222, Fusion)** — le bouton « Console ⤢ » du panneau Spark
|
||||||
|
(asset vendangé, octet-identique dans les 4 apps) n'ouvre plus
|
||||||
|
la console web du service d'agents en nouvel onglet (#221) :
|
||||||
|
elle s'ouvre **dans la même page**, en surimpression née à la
|
||||||
|
largeur du panneau et étendue à toute la fenêtre par
|
||||||
|
transition, avec le lien profond conservé (`?disc=<id>` et
|
||||||
|
`?app=obsigate`). Sa barre offre les deux sorties : « Mode
|
||||||
|
sidebar » (retour à l'agent en barre latérale) et « Fermer
|
||||||
|
l'agent ». Les styles sont injectés par le panneau lui-même ;
|
||||||
|
côté service (0.20.0), la console autorise l'encadrement par
|
||||||
|
les 4 applications. Même livraison dans TikTak 0.60.0,
|
||||||
|
Flowdeck 7.81.0 et Kanbante 0.29.0. Redéploiement Docker
|
||||||
|
requis pour l'activer côté ObsiGate.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## [2.76.1] — 2026-10-22
|
## [2.76.1] — 2026-10-22
|
||||||
|
|
||||||
### Ajouté
|
### Ajouté
|
||||||
|
|||||||
+3
-3
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
**Porte d'entrée web ultra-léger pour vos vaults Obsidian** — Accédez, naviguez et recherchez dans toutes vos notes Obsidian depuis n'importe quel appareil via une interface web moderne et responsive.
|
**Porte d'entrée web ultra-léger pour vos vaults Obsidian** — Accédez, naviguez et recherchez dans toutes vos notes Obsidian depuis n'importe quel appareil via une interface web moderne et responsive.
|
||||||
|
|
||||||
[]()
|
[]()
|
||||||
[](https://opensource.org/licenses/MIT)
|
[](https://opensource.org/licenses/MIT)
|
||||||
[](https://www.docker.com/)
|
[](https://www.docker.com/)
|
||||||
[](https://www.python.org/)
|
[](https://www.python.org/)
|
||||||
@@ -977,8 +977,8 @@ Ce projet est sous licence **MIT** — voir le fichier [LICENSE](LICENSE) pour l
|
|||||||
|
|
||||||
## 📝 Changelog
|
## 📝 Changelog
|
||||||
|
|
||||||
Consultez le [CHANGELOG.md](./CHANGELOG.md) pour l'historique complet de toutes les versions (v1.0.0 → v2.76.1).
|
Consultez le [CHANGELOG.md](./CHANGELOG.md) pour l'historique complet de toutes les versions (v1.0.0 → v2.77.0).
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
*Projet : ObsiGate | Version : 2.76.1 | Dernière mise à jour : Septembre 2026*
|
*Projet : ObsiGate | Version : 2.77.0 | Dernière mise à jour : Septembre 2026*
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
**Ultra-light web gateway for your Obsidian vaults** — Access, browse, and search all your Obsidian notes from any device via a modern, responsive web interface.
|
**Ultra-light web gateway for your Obsidian vaults** — Access, browse, and search all your Obsidian notes from any device via a modern, responsive web interface.
|
||||||
|
|
||||||
[]()
|
[]()
|
||||||
[](https://opensource.org/licenses/MIT)
|
[](https://opensource.org/licenses/MIT)
|
||||||
[](https://www.docker.com/)
|
[](https://www.docker.com/)
|
||||||
[](https://www.python.org/)
|
[](https://www.python.org/)
|
||||||
@@ -1152,8 +1152,8 @@ This project is licensed under the **MIT License** - see the [LICENSE](LICENSE)
|
|||||||
|
|
||||||
## 📝 Changelog
|
## 📝 Changelog
|
||||||
|
|
||||||
See [CHANGELOG.md](./CHANGELOG.md) for the complete version history (v1.0.0 → v2.76.1).
|
See [CHANGELOG.md](./CHANGELOG.md) for the complete version history (v1.0.0 → v2.77.0).
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
*Project: ObsiGate | Version: 2.76.1 | Last updated: September 2026*
|
*Project: ObsiGate | Version: 2.77.0 | Last updated: September 2026*
|
||||||
|
|||||||
Generated
+1
-1
@@ -2626,7 +2626,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "obsigate-desktop"
|
name = "obsigate-desktop"
|
||||||
version = "2.76.1"
|
version = "2.77.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"chrono",
|
"chrono",
|
||||||
"env_logger",
|
"env_logger",
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "obsigate-desktop"
|
name = "obsigate-desktop"
|
||||||
version = "2.76.1"
|
version = "2.77.0"
|
||||||
description = "ObsiGate Desktop — Porte d'entrée native pour vos vaults Obsidian"
|
description = "ObsiGate Desktop — Porte d'entrée native pour vos vaults Obsidian"
|
||||||
authors = ["Bruno Charest"]
|
authors = ["Bruno Charest"]
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"$schema": "https://raw.githubusercontent.com/nicedoc/obsigate/main/desktop/tauri.conf.schema.json",
|
"$schema": "https://raw.githubusercontent.com/nicedoc/obsigate/main/desktop/tauri.conf.schema.json",
|
||||||
"productName": "ObsiGate",
|
"productName": "ObsiGate",
|
||||||
"version": "2.76.1",
|
"version": "2.77.0",
|
||||||
"identifier": "com.obsigate.desktop",
|
"identifier": "com.obsigate.desktop",
|
||||||
"build": {
|
"build": {
|
||||||
"frontendDist": "../frontend",
|
"frontendDist": "../frontend",
|
||||||
|
|||||||
+26
-3
@@ -1,6 +1,6 @@
|
|||||||
# ObsiGate — Roadmap
|
# ObsiGate — Roadmap
|
||||||
|
|
||||||
> **Version :** 2.76.1 | **Dernière mise à jour :** 2026-10-22
|
> **Version :** 2.77.0 | **Dernière mise à jour :** 2026-10-23
|
||||||
> **Ce fichier ne contient que le travail à venir** (🔵 En cours + ⚪ Backlog) et un index compact
|
> **Ce fichier ne contient que le travail à venir** (🔵 En cours + ⚪ Backlog) et un index compact
|
||||||
> vers les fonctionnalités livrées.
|
> vers les fonctionnalités livrées.
|
||||||
> - **Méthode de livraison à appliquer pour toute tâche : [DELIVERY_WORKFLOW.md](./DELIVERY_WORKFLOW.md)**
|
> - **Méthode de livraison à appliquer pour toute tâche : [DELIVERY_WORKFLOW.md](./DELIVERY_WORKFLOW.md)**
|
||||||
@@ -30,9 +30,32 @@
|
|||||||
|
|
||||||
## 🔵 En cours
|
## 🔵 En cours
|
||||||
|
|
||||||
|
### 222. Fusion — panneau Spark V3 : la console en surimpression pleine page
|
||||||
|
|
||||||
|
- **Effort :** ~0,1 jour | **Impact :** 🟢 | **Ouvert :** 2026-10-23 | **Statut :** ✅ livré le 2026-10-23 (2.77.0, redéploiement Docker en attente)
|
||||||
|
- **Fiche :** [features/fusion-panneau-console-surimpression-222.md](./features/fusion-panneau-console-surimpression-222.md)
|
||||||
|
- **Description :** le panneau Spark (asset vendangé `frontend/draco-panneau.js`,
|
||||||
|
octet-identique dans les 4 apps) passe en V3 (demande de Bruno,
|
||||||
|
2026-10-22) : le bouton « Console ⤢ » n'ouvre plus la console du
|
||||||
|
service d'agents en nouvel onglet (#221) mais en **surimpression
|
||||||
|
pleine page dans la même page** — montée à la largeur du panneau,
|
||||||
|
étendue à toute la fenêtre par transition, iframe gardant le lien
|
||||||
|
profond (`?disc=` / `?app=`), et deux sorties dans sa barre :
|
||||||
|
« Mode sidebar » (rétraction vers le panneau) et « Fermer l'agent ».
|
||||||
|
Styles injectés par le panneau ; côté service, la console autorise
|
||||||
|
l'encadrement par les 4 apps (0.20.0). Même livraison : TikTak
|
||||||
|
0.60.0, Flowdeck 7.81.0, Kanbante 0.29.0.
|
||||||
|
- **Sous-tâches :**
|
||||||
|
- [x] Surimpression + barre « Mode sidebar » / « Fermer l'agent »
|
||||||
|
dans le panneau canonique (TikTak), recopié octet-identique
|
||||||
|
dans les 4 apps
|
||||||
|
- [x] Test `tests/test_draco_barre.py::test_panneau_console_surimpression_222`
|
||||||
|
(et révision du test #221 : le nouvel onglet disparaît)
|
||||||
|
- [x] Release v2.77.0 publiée — CI à constater, redéploiement Docker (geste de Bruno)
|
||||||
|
|
||||||
### 221. Fusion — panneau Spark : bouton « Console ↗ » vers la console du service
|
### 221. Fusion — panneau Spark : bouton « Console ↗ » vers la console du service
|
||||||
|
|
||||||
- **Effort :** ~0,1 jour | **Impact :** 🟢 | **Ouvert :** 2026-10-22 | **Statut :** 🔵 en cours
|
- **Effort :** ~0,1 jour | **Impact :** 🟢 | **Ouvert :** 2026-10-22 | **Statut :** ✅ livré le 2026-10-22 (2.76.1, redéploiement Docker en attente)
|
||||||
- **Fiche :** [features/fusion-panneau-console-221.md](./features/fusion-panneau-console-221.md)
|
- **Fiche :** [features/fusion-panneau-console-221.md](./features/fusion-panneau-console-221.md)
|
||||||
- **Description :** le panneau Spark (asset vendangé `frontend/draco-panneau.js`,
|
- **Description :** le panneau Spark (asset vendangé `frontend/draco-panneau.js`,
|
||||||
octet-identique dans les 4 apps) gagne un bouton « Console ↗ » dans sa barre
|
octet-identique dans les 4 apps) gagne un bouton « Console ↗ » dans sa barre
|
||||||
@@ -47,7 +70,7 @@
|
|||||||
- [x] Bouton + `ouvrirConsole()` / `appHote()` dans le panneau canonique
|
- [x] Bouton + `ouvrirConsole()` / `appHote()` dans le panneau canonique
|
||||||
(TikTak), recopié octet-identique dans les 4 apps
|
(TikTak), recopié octet-identique dans les 4 apps
|
||||||
- [x] Test `tests/test_draco_barre.py::test_panneau_bouton_console_221`
|
- [x] Test `tests/test_draco_barre.py::test_panneau_bouton_console_221`
|
||||||
- [ ] CI verte + redéploiement Docker (geste de Bruno)
|
- [x] Release v2.76.1 publiée — CI à constater, redéploiement Docker (geste de Bruno)
|
||||||
|
|
||||||
### 220. Fusion — émission d'événements vers le journal du service d'agents (Lot 2, vague 5)
|
### 220. Fusion — émission d'événements vers le journal du service d'agents (Lot 2, vague 5)
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,52 @@
|
|||||||
|
# #222 — Fusion : panneau Spark V3, la console en surimpression pleine page
|
||||||
|
|
||||||
|
**Contexte.** Le bouton « Console ↗ » du panneau Spark (#221) ouvrait
|
||||||
|
la console web du service d'agents (https://agent.dracodev.net/)
|
||||||
|
dans un nouvel onglet : on quittait l'application en cours pour un
|
||||||
|
autre onglet. Demande de Bruno (2026-10-22) : rester dans la même
|
||||||
|
page — la console s'ouvre par-dessus l'application, avec une
|
||||||
|
animation comme celle de la barre latérale mais qui recouvre la
|
||||||
|
page au complet, et deux sorties explicites : revenir en mode
|
||||||
|
sidebar, ou fermer l'agent.
|
||||||
|
|
||||||
|
**Changement.** Dans `frontend/draco-panneau.js` — asset **vendangé**,
|
||||||
|
maintenu en canonique dans TikTak et recopié **octet-identique** dans
|
||||||
|
les 4 applications (TikTak, Flowdeck, Kanbante, ObsiGate) :
|
||||||
|
|
||||||
|
- le bouton devient « Console ⤢ » (même emplacement, barre des
|
||||||
|
discussions) et `ouvrirConsole()` n'ouvre plus d'onglet : il
|
||||||
|
monte une **surimpression** `.draco-console-sur` ancrée à droite,
|
||||||
|
née à la largeur du panneau, qui **s'étend à 100 % de la fenêtre**
|
||||||
|
par transition CSS (double `requestAnimationFrame` pour laisser
|
||||||
|
peindre la géométrie de départ) ;
|
||||||
|
- la console est chargée dans une **iframe** dont l'URL reste
|
||||||
|
construite au premier clic par `urlConsole()` : discussion
|
||||||
|
affichée (`?disc=<id>`) et app d'origine (`?app=obsigate`, déduite
|
||||||
|
du sous-domaine `og`) — le lien profond de #221 est conservé ;
|
||||||
|
- la barre de la surimpression (« ✦ Console Spark ») porte les deux
|
||||||
|
sorties demandées : **« ◧ Mode sidebar »** (`retrecirConsole()` :
|
||||||
|
l'overlay se rétracte à la largeur du panneau puis se masque,
|
||||||
|
l'iframe reste chargée) et **« ✕ Fermer l'agent »** (`fermer()` +
|
||||||
|
rétraction : panneau et console fermés) ;
|
||||||
|
- les styles de la surimpression sont **injectés par le panneau
|
||||||
|
lui-même** (`<style id="draco-console-styles">`, variables du
|
||||||
|
thème du panneau) : aucun fichier CSS à toucher côté hôte, et la
|
||||||
|
surimpression suit le thème de l'app comme le panneau.
|
||||||
|
|
||||||
|
Côté service d'agents (0.20.0) : la console autorise désormais
|
||||||
|
l'encadrement par les 4 applications (`frame-ancestors` restreint
|
||||||
|
aux sous-domaines `dracodev.net` des apps) — sans quoi l'iframe
|
||||||
|
resterait blanche.
|
||||||
|
|
||||||
|
**Vérifications.** Syntaxe JS (`node --check`) ; test
|
||||||
|
`tests/test_draco_barre.py::test_panneau_console_surimpression_222`
|
||||||
|
(marqueurs de la surimpression, des deux sorties et de l'animation
|
||||||
|
dans l'asset) ; le test #221 est révisé en conséquence (le lien
|
||||||
|
profond `?disc=` / `?app=` subsiste, l'ouverture en nouvel onglet
|
||||||
|
disparaît) ; somme md5 commune des copies :
|
||||||
|
`93026ffa14bc8ee896349e3858e12edf`.
|
||||||
|
|
||||||
|
**Versions.** ObsiGate 2.77.0 (cette livraison) ; TikTak 0.60.0 et
|
||||||
|
Flowdeck 7.81.0 déployées automatiquement sur release ; Kanbante
|
||||||
|
0.29.0 publiée. **Activation côté ObsiGate : redéploiement Docker
|
||||||
|
par Bruno.**
|
||||||
+124
-10
@@ -18,10 +18,16 @@
|
|||||||
* Panneau v2 (Lot 1) : rendu Markdown, largeur réglable à la souris
|
* Panneau v2 (Lot 1) : rendu Markdown, largeur réglable à la souris
|
||||||
* (persistée), thème clair/sombre aligné sur l'app hôte
|
* (persistée), thème clair/sombre aligné sur l'app hôte
|
||||||
* (html[data-theme], repli prefers-color-scheme, suivi en direct).
|
* (html[data-theme], repli prefers-color-scheme, suivi en direct).
|
||||||
* Bouton « Console ↗ » (barre des discussions) : ouvre la console web
|
* Bouton « Console » (barre des discussions) : ouvre la console web
|
||||||
* du même service (agent.dracodev.net) dans un nouvel onglet, sur la
|
* du même service (agent.dracodev.net) DANS la page, en surimpression
|
||||||
* discussion courante (?disc=) et avec l'app d'origine (?app=),
|
* pleine page (iframe) qui naît à la géométrie du panneau puis
|
||||||
* déduite du sous-domaine de l'hôte.
|
* s'étend à toute la fenêtre ; l'URL profonde (?disc= discussion
|
||||||
|
* courante, ?app= app d'origine déduite du sous-domaine) est celle
|
||||||
|
* du premier chargement — l'iframe est créé paresseusement et
|
||||||
|
* conservé, la console garde son état entre ouvertures. La barre
|
||||||
|
* d'outils de la surimpression offre « Mode sidebar » (retour au
|
||||||
|
* panneau seul, animation inverse) et « Fermer l'agent » (referme
|
||||||
|
* surimpression et panneau).
|
||||||
* États honnêtes : service injoignable / session non reconnue / LLM non
|
* États honnêtes : service injoignable / session non reconnue / LLM non
|
||||||
* configuré / exécuteur non configuré sont affichés tels quels. */
|
* configuré / exécuteur non configuré sont affichés tels quels. */
|
||||||
(function () {
|
(function () {
|
||||||
@@ -48,23 +54,124 @@
|
|||||||
catch (e) { return null; }
|
catch (e) { return null; }
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ── Console web (même service, nouvel onglet) ─────────────── */
|
/* ── Console web (même service, surimpression pleine page) ─── */
|
||||||
function appHote() {
|
function appHote() {
|
||||||
var h = (window.location.hostname || "").split(".")[0];
|
var h = (window.location.hostname || "").split(".")[0];
|
||||||
var correspondance = { tiktak: "tiktak", flowdeck: "flowdeck",
|
var correspondance = { tiktak: "tiktak", flowdeck: "flowdeck",
|
||||||
kanbante: "kanbante", og: "obsigate" };
|
kanbante: "kanbante", og: "obsigate" };
|
||||||
return correspondance[h] || null;
|
return correspondance[h] || null;
|
||||||
}
|
}
|
||||||
function ouvrirConsole() {
|
function urlConsole() {
|
||||||
var params = [];
|
var params = [];
|
||||||
var id = convId || convStockee();
|
var id = convId || convStockee();
|
||||||
if (id) params.push("disc=" + encodeURIComponent(id));
|
if (id) params.push("disc=" + encodeURIComponent(id));
|
||||||
var app = appHote();
|
var app = appHote();
|
||||||
if (app) params.push("app=" + encodeURIComponent(app));
|
if (app) params.push("app=" + encodeURIComponent(app));
|
||||||
window.open(API + "/" + (params.length ? "?" + params.join("&") : ""),
|
return API + "/" + (params.length ? "?" + params.join("&") : "");
|
||||||
"_blank", "noopener");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* La surimpression vit entièrement dans ce fichier (DOM + styles
|
||||||
|
* injectés) : les apps hôtes n'ont que ce fichier à recopier. Son
|
||||||
|
* thème suit celui du panneau (data-draco-theme synchronisé par
|
||||||
|
* appliquerTheme) et sa palette reprend les mêmes valeurs que
|
||||||
|
* draco-panneau.css. L'iframe est créé au premier clic puis
|
||||||
|
* conservé : rouvrir la console ne le recharge pas. */
|
||||||
|
var surEl = null, surCadre = null, surOuverte = false;
|
||||||
|
var STYLES_CONSOLE =
|
||||||
|
".draco-console-sur{" +
|
||||||
|
"--p-fond:#fbfbfa;--p-surface:#ffffff;--p-bord:#e4e5e0;--p-texte:#242624;" +
|
||||||
|
"--p-chip:#f4f5f1;--p-chip-bord:#d6d8d1;--p-chip-survol:#e9ebe4;--p-accent:#7c5cd6;" +
|
||||||
|
"position:fixed;top:0;right:0;height:100dvh;width:388px;max-width:100vw;z-index:1000;" +
|
||||||
|
"background:var(--p-fond);color:var(--p-texte);" +
|
||||||
|
"box-shadow:-12px 0 36px rgb(0 0 0 / .22);" +
|
||||||
|
"display:flex;flex-direction:column;transition:width .3s ease;" +
|
||||||
|
"font:14px/1.5 system-ui,\"Segoe UI\",sans-serif}" +
|
||||||
|
".draco-console-sur[data-draco-theme=\"dark\"]{" +
|
||||||
|
"--p-fond:#17181a;--p-surface:#1f2023;--p-bord:#33353a;--p-texte:#eceeeb;" +
|
||||||
|
"--p-chip:#26272b;--p-chip-bord:#3a3c41;--p-chip-survol:#2e3036}" +
|
||||||
|
".draco-console-sur[hidden]{display:none}" +
|
||||||
|
".draco-console-barre{display:flex;align-items:center;gap:9px;flex:none;" +
|
||||||
|
"padding:9px 12px;border-bottom:1px solid var(--p-bord);background:var(--p-surface)}" +
|
||||||
|
".draco-console-barre .dc-titre{font-weight:700;font-size:14px;" +
|
||||||
|
"display:flex;align-items:center;gap:8px;white-space:nowrap}" +
|
||||||
|
".draco-console-barre .dc-etoile{color:var(--p-accent);font-size:17px}" +
|
||||||
|
".draco-console-barre .dc-actions{margin-left:auto;display:flex;gap:7px}" +
|
||||||
|
".draco-console-barre button{border:1px solid var(--p-chip-bord);" +
|
||||||
|
"background:var(--p-chip);color:var(--p-texte);border-radius:999px;" +
|
||||||
|
"padding:5px 12px;font:600 12.5px system-ui;cursor:pointer;white-space:nowrap}" +
|
||||||
|
".draco-console-barre button:hover{background:var(--p-chip-survol)}" +
|
||||||
|
".draco-console-cadre{flex:1;width:100%;border:0;display:block;background:var(--p-fond)}";
|
||||||
|
|
||||||
|
function assurerSurimpression() {
|
||||||
|
if (surEl) return;
|
||||||
|
if (!document.getElementById("draco-console-styles")) {
|
||||||
|
var st = document.createElement("style");
|
||||||
|
st.id = "draco-console-styles";
|
||||||
|
st.textContent = STYLES_CONSOLE;
|
||||||
|
document.head.appendChild(st);
|
||||||
|
}
|
||||||
|
surEl = document.createElement("div");
|
||||||
|
surEl.className = "draco-console-sur";
|
||||||
|
surEl.setAttribute("aria-label", "Console Spark");
|
||||||
|
surEl.hidden = true;
|
||||||
|
surEl.innerHTML =
|
||||||
|
'<div class="draco-console-barre">' +
|
||||||
|
' <span class="dc-titre"><span class="dc-etoile">✦</span> Console Spark</span>' +
|
||||||
|
' <span class="dc-actions">' +
|
||||||
|
' <button type="button" data-dc="sidebar" title="Réduire la console et revenir au panneau latéral">◧ Mode sidebar</button>' +
|
||||||
|
' <button type="button" data-dc="fermer" title="Fermer la console et le panneau Spark">✕ Fermer l\'agent</button>' +
|
||||||
|
' </span></div>' +
|
||||||
|
'<iframe class="draco-console-cadre" title="Console Spark" allow="microphone"></iframe>';
|
||||||
|
document.body.appendChild(surEl);
|
||||||
|
surCadre = surEl.querySelector("iframe");
|
||||||
|
surEl.querySelector('[data-dc="sidebar"]')
|
||||||
|
.addEventListener("click", modeSidebarConsole);
|
||||||
|
surEl.querySelector('[data-dc="fermer"]')
|
||||||
|
.addEventListener("click", fermerAgentConsole);
|
||||||
|
appliquerTheme();
|
||||||
|
}
|
||||||
|
|
||||||
|
function largeurPanneau() {
|
||||||
|
if (root) {
|
||||||
|
var w = root.getBoundingClientRect().width;
|
||||||
|
if (w > 0) return Math.round(w);
|
||||||
|
}
|
||||||
|
return 388;
|
||||||
|
}
|
||||||
|
|
||||||
|
function ouvrirConsole() {
|
||||||
|
assurerSurimpression();
|
||||||
|
if (!surCadre.getAttribute("src")) surCadre.src = urlConsole();
|
||||||
|
if (surOuverte) return;
|
||||||
|
surOuverte = true;
|
||||||
|
/* Naissance à la géométrie du panneau (ancrée à droite), puis
|
||||||
|
* extension à toute la page ; le double rAF laisse le temps de
|
||||||
|
* peindre la largeur de départ, sinon la transition ne joue pas. */
|
||||||
|
surEl.style.width = largeurPanneau() + "px";
|
||||||
|
surEl.hidden = false;
|
||||||
|
requestAnimationFrame(function () {
|
||||||
|
requestAnimationFrame(function () { surEl.style.width = "100%"; });
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function retrecirConsole() {
|
||||||
|
if (!surEl || !surOuverte) return;
|
||||||
|
surOuverte = false;
|
||||||
|
var fini = false;
|
||||||
|
function terminer() {
|
||||||
|
if (fini) return;
|
||||||
|
fini = true;
|
||||||
|
surEl.removeEventListener("transitionend", surFin);
|
||||||
|
surEl.hidden = true; // l'iframe reste chargé, juste masqué
|
||||||
|
}
|
||||||
|
function surFin(ev) { if (ev.propertyName === "width") terminer(); }
|
||||||
|
surEl.addEventListener("transitionend", surFin);
|
||||||
|
setTimeout(terminer, 380); // filet si transitionend ne vient pas
|
||||||
|
surEl.style.width = largeurPanneau() + "px";
|
||||||
|
}
|
||||||
|
function modeSidebarConsole() { retrecirConsole(); }
|
||||||
|
function fermerAgentConsole() { fermer(); retrecirConsole(); }
|
||||||
|
|
||||||
/* ── Thème : suivre l'app hôte ─────────────────────────────── */
|
/* ── Thème : suivre l'app hôte ─────────────────────────────── */
|
||||||
function themeHote() {
|
function themeHote() {
|
||||||
var t = document.documentElement.getAttribute("data-theme");
|
var t = document.documentElement.getAttribute("data-theme");
|
||||||
@@ -78,6 +185,7 @@
|
|||||||
}
|
}
|
||||||
function appliquerTheme() {
|
function appliquerTheme() {
|
||||||
if (root) root.setAttribute("data-draco-theme", themeHote());
|
if (root) root.setAttribute("data-draco-theme", themeHote());
|
||||||
|
if (surEl) surEl.setAttribute("data-draco-theme", themeHote());
|
||||||
}
|
}
|
||||||
function surveillerTheme() {
|
function surveillerTheme() {
|
||||||
try {
|
try {
|
||||||
@@ -143,7 +251,7 @@
|
|||||||
' <span class="d-titre">Discussion principale</span>' +
|
' <span class="d-titre">Discussion principale</span>' +
|
||||||
' <button type="button" class="d-btn" data-disc="liste">☰ Discussions</button>' +
|
' <button type="button" class="d-btn" data-disc="liste">☰ Discussions</button>' +
|
||||||
' <button type="button" class="d-btn" data-disc="nouvelle">+ Nouvelle</button>' +
|
' <button type="button" class="d-btn" data-disc="nouvelle">+ Nouvelle</button>' +
|
||||||
' <button type="button" class="d-btn" data-disc="console" title="Ouvrir la console Spark (agent.dracodev.net) dans un nouvel onglet, sur cette discussion">Console ↗</button>' +
|
' <button type="button" class="d-btn" data-disc="console" title="Ouvrir la console Spark (agent.dracodev.net) en pleine page par-dessus l\'application, sur cette discussion">Console ⤢</button>' +
|
||||||
'</div>' +
|
'</div>' +
|
||||||
'<div class="draco-discussions" hidden></div>' +
|
'<div class="draco-discussions" hidden></div>' +
|
||||||
'<div class="draco-panneau-outils">' +
|
'<div class="draco-panneau-outils">' +
|
||||||
@@ -178,7 +286,13 @@
|
|||||||
appliquerLargeur();
|
appliquerLargeur();
|
||||||
window.addEventListener("resize", appliquerLargeur);
|
window.addEventListener("resize", appliquerLargeur);
|
||||||
document.addEventListener("keydown", function (ev) {
|
document.addEventListener("keydown", function (ev) {
|
||||||
if (ev.key === "Escape" && root.classList.contains("open")) fermer();
|
if (ev.key !== "Escape") return;
|
||||||
|
/* Surimpression ouverte : Échap = retour au panneau seul
|
||||||
|
* (« Mode sidebar »). Quand le focus est dans l'iframe de la
|
||||||
|
* console (autre origine), l'événement ne remonte pas
|
||||||
|
* jusqu'ici : il ne peut donc pas fermer par surprise. */
|
||||||
|
if (surOuverte) { modeSidebarConsole(); return; }
|
||||||
|
if (root.classList.contains("open")) fermer();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "obsigate",
|
"name": "obsigate",
|
||||||
"version": "2.76.1",
|
"version": "2.77.0",
|
||||||
"description": "**Porte d'entrée web ultra-léger pour vos vaults Obsidian** — Accédez, naviguez et recherchez dans toutes vos notes Obsidian depuis n'importe quel appareil via une interface web moderne et responsive.",
|
"description": "**Porte d'entrée web ultra-léger pour vos vaults Obsidian** — Accédez, naviguez et recherchez dans toutes vos notes Obsidian depuis n'importe quel appareil via une interface web moderne et responsive.",
|
||||||
"main": "patch.js",
|
"main": "patch.js",
|
||||||
"directories": {
|
"directories": {
|
||||||
|
|||||||
@@ -60,19 +60,41 @@ def test_panneau_spark_integre_218():
|
|||||||
|
|
||||||
def test_panneau_bouton_console_221():
|
def test_panneau_bouton_console_221():
|
||||||
# #221 : le panneau Spark (asset vendangé, octet-identique dans
|
# #221 : le panneau Spark (asset vendangé, octet-identique dans
|
||||||
# les 4 apps) porte un bouton « Console ↗ » qui ouvre la console
|
# les 4 apps) porte un bouton « Console » qui mène à la console
|
||||||
# web du service dans un nouvel onglet, sur la discussion
|
# web du service, sur la discussion courante (?disc=) et avec
|
||||||
# courante (?disc=) et avec l'app d'origine (?app= déduite du
|
# l'app d'origine (?app= déduite du sous-domaine : og → obsigate).
|
||||||
# sous-domaine : og → obsigate).
|
# Révisé par #222 : l'ouverture en nouvel onglet a disparu (la
|
||||||
|
# console s'ouvre en surimpression, voir le test #222) ; le lien
|
||||||
|
# profond, lui, subsiste via urlConsole().
|
||||||
panneau = (FRONTEND / "draco-panneau.js").read_text(encoding="utf-8")
|
panneau = (FRONTEND / "draco-panneau.js").read_text(encoding="utf-8")
|
||||||
assert 'data-disc="console"' in panneau
|
assert 'data-disc="console"' in panneau
|
||||||
assert "Console ↗" in panneau
|
|
||||||
assert "ouvrirConsole" in panneau
|
assert "ouvrirConsole" in panneau
|
||||||
|
assert "urlConsole" in panneau
|
||||||
assert '"disc=" + encodeURIComponent(id)' in panneau
|
assert '"disc=" + encodeURIComponent(id)' in panneau
|
||||||
assert '"app=" + encodeURIComponent(app)' in panneau
|
assert '"app=" + encodeURIComponent(app)' in panneau
|
||||||
assert 'og: "obsigate"' in panneau
|
assert 'og: "obsigate"' in panneau
|
||||||
assert 'window.open(API + "/"' in panneau
|
assert 'window.open(' not in panneau
|
||||||
assert '"_blank", "noopener"' in panneau
|
|
||||||
|
|
||||||
|
def test_panneau_console_surimpression_222():
|
||||||
|
# #222 : le bouton « Console ⤢ » ouvre la console dans la même
|
||||||
|
# page, en surimpression née à la largeur du panneau et étendue
|
||||||
|
# à toute la fenêtre (transition sur la largeur), avec deux
|
||||||
|
# sorties : « Mode sidebar » et « Fermer l'agent ». L'URL de
|
||||||
|
# l'iframe garde le lien profond de #221 (urlConsole()).
|
||||||
|
panneau = (FRONTEND / "draco-panneau.js").read_text(encoding="utf-8")
|
||||||
|
assert "Console ⤢" in panneau
|
||||||
|
assert "draco-console-sur" in panneau
|
||||||
|
assert "assurerSurimpression" in panneau
|
||||||
|
assert "draco-console-styles" in panneau
|
||||||
|
assert 'surCadre.src = urlConsole()' in panneau
|
||||||
|
assert 'surEl.style.width = "100%"' in panneau
|
||||||
|
assert 'data-dc="sidebar"' in panneau
|
||||||
|
assert "Mode sidebar" in panneau
|
||||||
|
assert "modeSidebarConsole" in panneau
|
||||||
|
assert 'data-dc="fermer"' in panneau
|
||||||
|
assert "Fermer l'agent" in panneau
|
||||||
|
assert "fermerAgentConsole" in panneau
|
||||||
|
|
||||||
|
|
||||||
def test_csp_ouvre_le_service_d_agents_218():
|
def test_csp_ouvre_le_service_d_agents_218():
|
||||||
|
|||||||
Reference in New Issue
Block a user