fix: side peek des bases repasse en vanilla JS + largeur 1100px standard (v7.49.0)
FlowDeck CI / test (push) Failing after 3h13m58s
FlowDeck CI / lint (push) Successful in 2m12s
FlowDeck CI / docker (push) Skipped

- Panneau peek: les bindings Alpine (x-data absent du conteneur) rendaient
  loovverture et le redimensionnement inoperants -> cblage direct sur le document.
- Helper unique window.fdWirePeekResize (app.js): pointer capture, 300px-90vw,
  clic=fermer, largeur persiste fd_peek_width partagee entre les 4 peeks.
- database-table-container margin:0 (tableau colle a gauche, marge Library).
- .lib-container remonte dans app.css (trash etait pleine largeur), .db-index 1100px.
- ObsiGate verifie sans code: creation .xlsx OK (openpyxl, #186).
This commit is contained in:
2026-10-05 22:47:36 -04:00
parent 894004a1f5
commit 1d1cdbd618
63 changed files with 9473 additions and 393 deletions
+353 -18
View File
@@ -2,7 +2,7 @@
"openapi": "3.1.0",
"info": {
"title": "FlowDeck",
"version": "7.45.6"
"version": "7.49.0"
},
"paths": {
"/auth/register": {
@@ -1675,7 +1675,7 @@
"dashboard"
],
"summary": "Local Workspace Page",
"description": "Local workspace page with file/folder tree.\n\nIf ?folder=ID is provided, shows that folder's contents with breadcrumb.",
"description": "Local workspace page with file/folder tree.\n\nIf ?folder=ID is provided, shows that folder's contents with breadcrumb.\nIf ?ws=ID is provided, shows that workspace — c'est ce que fait le bouton\n« Home » de la sidebar (``/local-workspace?ws=<id>``). Le paramètre était\nproduit par le sidebar mais **ignoré** par la route : le contenu affiché\nrestait celui du workspace *actif* (cookie), donc Home pouvait montrer un\nautre workspace que celui annoncé dans l'URL. Un ``ws`` qui n'appartient\npas à l'utilisateur est ignoré (et le workspace actif conservé).",
"operationId": "local_workspace_page_local_workspace_get",
"parameters": [
{
@@ -1686,6 +1686,15 @@
"type": "integer",
"title": "Folder"
}
},
{
"name": "ws",
"in": "query",
"required": false,
"schema": {
"type": "integer",
"title": "Ws"
}
}
],
"responses": {
@@ -2419,7 +2428,7 @@
"dashboard"
],
"summary": "Delete Workspace",
"description": "Delete a workspace and all its pages.",
"description": "Delete a workspace, its pages and its databases.",
"operationId": "delete_workspace_api_workspaces__ws_id__delete",
"parameters": [
{
@@ -7395,13 +7404,163 @@
}
}
},
"/db/task-dbs/api": {
"get": {
"tags": [
"collections"
],
"summary": "List Connected Task Databases",
"description": "Bases de tâches connectées au tableau de bord My Tasks.",
"operationId": "list_connected_task_databases_db_task_dbs_api_get",
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
}
}
}
},
"/db/{collection_id}/task-db/api": {
"get": {
"tags": [
"collections"
],
"summary": "Get Task Db State",
"description": "État de conversion + colonnes candidates pour la modale.",
"operationId": "get_task_db_state_db__collection_id__task_db_api_get",
"parameters": [
{
"name": "collection_id",
"in": "path",
"required": true,
"schema": {
"type": "integer",
"title": "Collection Id"
}
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
},
"post": {
"tags": [
"collections"
],
"summary": "Enable Task Db",
"description": "Convertit la base en base de tâches (mapping explicite des 3 rôles).\n\n``mapping`` : ``{\"assignee\": <prop_id>, \"status\": …, \"due\": …}``.\n``create_missing`` : ``{\"status\": {\"name\": \"Statut\", \"options\": [...]}}``\npour qu'une colonne absente soit créée dans la transaction.",
"operationId": "enable_task_db_db__collection_id__task_db_api_post",
"parameters": [
{
"name": "collection_id",
"in": "path",
"required": true,
"schema": {
"type": "integer",
"title": "Collection Id"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"default": {},
"title": "Body"
}
}
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
},
"delete": {
"tags": [
"collections"
],
"summary": "Disable Task Db",
"description": "Déconnecte la base du tableau de bord (les tâches sont conservées).",
"operationId": "disable_task_db_db__collection_id__task_db_api_delete",
"parameters": [
{
"name": "collection_id",
"in": "path",
"required": true,
"schema": {
"type": "integer",
"title": "Collection Id"
}
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/db": {
"get": {
"tags": [
"collections"
],
"summary": "List Collections",
"description": "Page listing all collections in the workspace.",
"description": "Liste des bases du workspace, dans le layout de l'application.",
"operationId": "list_collections_db_get",
"responses": {
"200": {
@@ -9310,7 +9469,7 @@
"collections"
],
"summary": "Toggle Task",
"description": "API: toggle is_task flag on a collection (Turn into Tasks).",
"description": "API: toggle is_task flag on a collection (Turn into Tasks).\n\nRétrocompatible : l'activation passe désormais par la même conversion que\n``POST /db/{id}/task-db/api``, donc les trois colonnes requises sont liées\n(créées si besoin). Sans cela, cette route laissait une base « connectée »\nmais muette — elle n'émettait aucune tâche faute de mapping.",
"operationId": "toggle_task_db__collection_id__toggle_task_api_put",
"parameters": [
{
@@ -9830,7 +9989,7 @@
"my-tasks"
],
"summary": "My Tasks Dashboard",
"description": "My Tasks — aggregates all pages assigned to the current user across all collections.",
"description": "My Tasks — toutes vos tâches, tous workspaces confondus.",
"operationId": "my_tasks_dashboard_my_tasks_get",
"parameters": [
{
@@ -9839,18 +9998,38 @@
"required": false,
"schema": {
"type": "string",
"default": "all",
"default": "table",
"title": "View"
}
},
{
"name": "days",
"name": "due",
"in": "query",
"required": false,
"schema": {
"type": "integer",
"default": 7,
"title": "Days"
"type": "string",
"default": "all",
"title": "Due"
}
},
{
"name": "sort",
"in": "query",
"required": false,
"schema": {
"type": "string",
"default": "due",
"title": "Sort"
}
},
{
"name": "hide_done",
"in": "query",
"required": false,
"schema": {
"type": "boolean",
"default": false,
"title": "Hide Done"
}
}
],
@@ -9884,7 +10063,7 @@
"my-tasks"
],
"summary": "My Tasks Api",
"description": "API: return my tasks as JSON.",
"description": "API: tâches normalisées + sources connectées (alimente les 3 vues).",
"operationId": "my_tasks_api_my_tasks_api_get",
"parameters": [
{
@@ -9893,18 +10072,38 @@
"required": false,
"schema": {
"type": "string",
"default": "all",
"default": "table",
"title": "View"
}
},
{
"name": "days",
"name": "due",
"in": "query",
"required": false,
"schema": {
"type": "integer",
"default": 7,
"title": "Days"
"type": "string",
"default": "all",
"title": "Due"
}
},
{
"name": "sort",
"in": "query",
"required": false,
"schema": {
"type": "string",
"default": "due",
"title": "Sort"
}
},
{
"name": "hide_done",
"in": "query",
"required": false,
"schema": {
"type": "boolean",
"default": false,
"title": "Hide Done"
}
}
],
@@ -9930,6 +10129,99 @@
}
}
},
"/my-tasks/api/task": {
"post": {
"tags": [
"my-tasks"
],
"summary": "My Tasks Create",
"description": "Création rapide multi-destinations : la tâche part dans la base choisie.\n\nElle est **auto-assignée** : sans colonne « Assigné à » renseignée, une\ntâche nouvelle n'apparaîtrait pas dans « mes tâches », ce qui serait\nillisible pour l'utilisateur qui vient de la créer.",
"operationId": "my_tasks_create_my_tasks_api_task_post",
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"title": "Body",
"default": {}
}
}
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/my-tasks/api/task/{page_id}": {
"put": {
"tags": [
"my-tasks"
],
"summary": "My Tasks Update",
"description": "Édition en direct du statut / de l'échéance / du titre.\n\nL'écriture passe par le **mapping enregistré de la base source** (et non\npar une devinette « première colonne de type X »), puis la tâche est relue\net renvoyée normalisée : le front n'a rien à recalculer.",
"operationId": "my_tasks_update_my_tasks_api_task__page_id__put",
"parameters": [
{
"name": "page_id",
"in": "path",
"required": true,
"schema": {
"type": "integer",
"title": "Page Id"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"default": {},
"title": "Body"
}
}
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/workspace/{ws_id}/members": {
"get": {
"tags": [
@@ -10361,6 +10653,7 @@
"workspace"
],
"summary": "List Favorites",
"description": "List the caller's favorites.\n\nv7.46.0 — aligne sur le schéma v2.2.0 (``app/db.py``) : la table\n``favorites`` n'a plus de colonne ``collection_id`` et ``page_id``\nréférence ``pages(id)``. L'ancienne requête (jointure ``collection_pages``)\nlevait ``sqlite3.OperationalError: no such column: f.collection_id`` → 500.",
"operationId": "list_favorites_workspace_favorites_get",
"responses": {
"200": {
@@ -11579,7 +11872,7 @@
"/workspace/public/{collection_id}": {
"get": {
"tags": [
"workspace"
"workspace-public"
],
"summary": "Public View",
"description": "Simple public read-only view — no auth required.\n\nA18 : les bases ``restricted``/``private`` (``permission_type``) restent\nmasquées (404) et toute interpolation part dans ``html.escape`` (XSS stocké\nsur le titre de la base ou d'une ligne).",
@@ -27600,6 +27893,48 @@
}
}
},
"/api/v2/meetings/upcoming": {
"get": {
"tags": [
"calendar-meetings"
],
"summary": "Upcoming Meetings",
"description": "Upcoming calendar events for the sidebar Meeting tab.\n\nReads every calendar collection linked to the current user, extracts the\ndate property of each linked row and returns the ones falling in the next\n``days`` days (today included), sorted chronologically. Rows imported from\nGoogle/CalDAV carry an ``external_event_id`` and are flagged ``synced``.",
"operationId": "upcoming_meetings_api_v2_meetings_upcoming_get",
"parameters": [
{
"name": "days",
"in": "query",
"required": false,
"schema": {
"type": "integer",
"default": 30,
"title": "Days"
}
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v2/meetings/transcribe": {
"post": {
"tags": [