import React, { useState, useMemo } from "react"; const SCHEMA = { alerts: { group: "Notifications", description: "Alertes système générées pour les utilisateurs", columns: [ { name: "id", type: "INTEGER", pk: true, fk: null, nullable: false, default: null }, { name: "user_id", type: "INTEGER", pk: false, fk: "users.id", nullable: true, default: null }, { name: "category", type: "VARCHAR(50)", pk: false, fk: null, nullable: false, default: null }, { name: "level", type: "VARCHAR(20)", pk: false, fk: null, nullable: true, default: null }, { name: "title", type: "VARCHAR(255)", pk: false, fk: null, nullable: true, default: null }, { name: "message", type: "TEXT", pk: false, fk: null, nullable: false, default: null }, { name: "source", type: "VARCHAR(50)", pk: false, fk: null, nullable: true, default: null }, { name: "details", type: "JSON", pk: false, fk: null, nullable: true, default: null }, { name: "read_at", type: "DATETIME", pk: false, fk: null, nullable: true, default: null }, { name: "created_at", type: "DATETIME", pk: false, fk: null, nullable: false, default: "now()" }, ] }, app_settings: { group: "Système", description: "Paramètres globaux de l'application", columns: [ { name: "key", type: "VARCHAR(100)", pk: true, fk: null, nullable: false, default: null }, { name: "value", type: "TEXT", pk: false, fk: null, nullable: true, default: null }, { name: "created_at", type: "DATETIME", pk: false, fk: null, nullable: false, default: "now()" }, { name: "updated_at", type: "DATETIME", pk: false, fk: null, nullable: false, default: "now()" }, ] }, bootstrap_status: { group: "Hôtes", description: "État du bootstrapping Ansible par hôte", columns: [ { name: "id", type: "INTEGER", pk: true, fk: null, nullable: false, default: null }, { name: "host_id", type: "VARCHAR(50)", pk: false, fk: "hosts.id", nullable: false, default: null }, { name: "status", type: "VARCHAR(50)", pk: false, fk: null, nullable: false, default: null }, { name: "automation_user", type: "VARCHAR(50)", pk: false, fk: null, nullable: true, default: null }, { name: "last_attempt", type: "DATETIME", pk: false, fk: null, nullable: true, default: null }, { name: "error_message", type: "TEXT", pk: false, fk: null, nullable: true, default: null }, { name: "created_at", type: "DATETIME", pk: false, fk: null, nullable: false, default: "now()" }, ] }, container_customizations: { group: "Docker", description: "Personnalisations visuelles de conteneurs par utilisateur", columns: [ { name: "id", type: "INTEGER", pk: true, fk: null, nullable: false, default: null }, { name: "user_id", type: "INTEGER", pk: false, fk: "users.id", nullable: true, default: null }, { name: "host_id", type: "VARCHAR(50)", pk: false, fk: "hosts.id", nullable: false, default: null }, { name: "container_id", type: "VARCHAR(64)", pk: false, fk: null, nullable: false, default: null }, { name: "icon_key", type: "VARCHAR(100)", pk: false, fk: null, nullable: true, default: null }, { name: "icon_color", type: "VARCHAR(20)", pk: false, fk: null, nullable: true, default: null }, { name: "bg_color", type: "VARCHAR(20)", pk: false, fk: null, nullable: true, default: null }, { name: "created_at", type: "DATETIME", pk: false, fk: null, nullable: false, default: "now()" }, { name: "updated_at", type: "DATETIME", pk: false, fk: null, nullable: false, default: "now()" }, ] }, docker_alerts: { group: "Docker", description: "Alertes liées aux conteneurs Docker", columns: [ { name: "id", type: "INTEGER", pk: true, fk: null, nullable: false, default: null }, { name: "host_id", type: "VARCHAR(50)", pk: false, fk: "hosts.id", nullable: false, default: null }, { name: "container_name", type: "VARCHAR(255)", pk: false, fk: null, nullable: false, default: null }, { name: "severity", type: "VARCHAR(20)", pk: false, fk: null, nullable: false, default: "warning" }, { name: "state", type: "VARCHAR(20)", pk: false, fk: null, nullable: false, default: "open" }, { name: "message", type: "TEXT", pk: false, fk: null, nullable: true, default: null }, { name: "opened_at", type: "DATETIME", pk: false, fk: null, nullable: false, default: "now()" }, { name: "closed_at", type: "DATETIME", pk: false, fk: null, nullable: true, default: null }, { name: "acknowledged_at", type: "DATETIME", pk: false, fk: null, nullable: true, default: null }, { name: "acknowledged_by", type: "VARCHAR(100)", pk: false, fk: null, nullable: true, default: null }, { name: "last_notified_at", type: "DATETIME", pk: false, fk: null, nullable: true, default: null }, ] }, docker_containers: { group: "Docker", description: "Inventaire des conteneurs Docker par hôte", columns: [ { name: "id", type: "INTEGER", pk: true, fk: null, nullable: false, default: null }, { name: "host_id", type: "VARCHAR(50)", pk: false, fk: "hosts.id", nullable: false, default: null }, { name: "container_id", type: "VARCHAR(64)", pk: false, fk: null, nullable: false, default: null }, { name: "name", type: "VARCHAR(255)", pk: false, fk: null, nullable: false, default: null }, { name: "image", type: "VARCHAR(255)", pk: false, fk: null, nullable: true, default: null }, { name: "state", type: "VARCHAR(20)", pk: false, fk: null, nullable: false, default: "unknown" }, { name: "status", type: "VARCHAR(255)", pk: false, fk: null, nullable: true, default: null }, { name: "health", type: "VARCHAR(20)", pk: false, fk: null, nullable: true, default: null }, { name: "created_at", type: "DATETIME", pk: false, fk: null, nullable: true, default: null }, { name: "ports", type: "JSON", pk: false, fk: null, nullable: true, default: null }, { name: "labels", type: "JSON", pk: false, fk: null, nullable: true, default: null }, { name: "compose_project", type: "VARCHAR(255)", pk: false, fk: null, nullable: true, default: null }, { name: "last_update_at", type: "DATETIME", pk: false, fk: null, nullable: false, default: "now()" }, ] }, docker_images: { group: "Docker", description: "Images Docker disponibles sur les hôtes", columns: [ { name: "id", type: "INTEGER", pk: true, fk: null, nullable: false, default: null }, { name: "host_id", type: "VARCHAR(50)", pk: false, fk: "hosts.id", nullable: false, default: null }, { name: "image_id", type: "VARCHAR(64)", pk: false, fk: null, nullable: false, default: null }, { name: "repo_tags", type: "JSON", pk: false, fk: null, nullable: true, default: null }, { name: "size", type: "BIGINT", pk: false, fk: null, nullable: true, default: null }, { name: "created", type: "DATETIME", pk: false, fk: null, nullable: true, default: null }, { name: "last_update_at", type: "DATETIME", pk: false, fk: null, nullable: false, default: "now()" }, ] }, docker_volumes: { group: "Docker", description: "Volumes Docker par hôte", columns: [ { name: "id", type: "INTEGER", pk: true, fk: null, nullable: false, default: null }, { name: "host_id", type: "VARCHAR(50)", pk: false, fk: "hosts.id", nullable: false, default: null }, { name: "name", type: "VARCHAR(255)", pk: false, fk: null, nullable: false, default: null }, { name: "driver", type: "VARCHAR(50)", pk: false, fk: null, nullable: true, default: null }, { name: "mountpoint", type: "TEXT", pk: false, fk: null, nullable: true, default: null }, { name: "scope", type: "VARCHAR(20)", pk: false, fk: null, nullable: true, default: null }, { name: "last_update_at", type: "DATETIME", pk: false, fk: null, nullable: false, default: "now()" }, ] }, favorite_containers: { group: "Utilisateurs", description: "Conteneurs favoris par utilisateur et groupe", columns: [ { name: "id", type: "INTEGER", pk: true, fk: null, nullable: false, default: null }, { name: "user_id", type: "INTEGER", pk: false, fk: "users.id", nullable: true, default: null }, { name: "docker_container_id", type: "INTEGER", pk: false, fk: "docker_containers.id", nullable: false, default: null }, { name: "group_id", type: "INTEGER", pk: false, fk: "favorite_groups.id", nullable: true, default: null }, { name: "created_at", type: "DATETIME", pk: false, fk: null, nullable: false, default: "now()" }, ] }, favorite_groups: { group: "Utilisateurs", description: "Groupes de favoris définis par l'utilisateur", columns: [ { name: "id", type: "INTEGER", pk: true, fk: null, nullable: false, default: null }, { name: "user_id", type: "INTEGER", pk: false, fk: "users.id", nullable: true, default: null }, { name: "name", type: "VARCHAR(100)", pk: false, fk: null, nullable: false, default: null }, { name: "sort_order", type: "INTEGER", pk: false, fk: null, nullable: false, default: "0" }, { name: "color", type: "VARCHAR(20)", pk: false, fk: null, nullable: true, default: null }, { name: "icon_key", type: "VARCHAR(100)", pk: false, fk: null, nullable: true, default: null }, { name: "created_at", type: "DATETIME", pk: false, fk: null, nullable: false, default: "now()" }, { name: "updated_at", type: "DATETIME", pk: false, fk: null, nullable: false, default: "now()" }, ] }, host_metrics: { group: "Hôtes", description: "Métriques système collectées par hôte (CPU, RAM, disque, réseau…)", columns: [ { name: "id", type: "INTEGER", pk: true, fk: null, nullable: false, default: null }, { name: "host_id", type: "VARCHAR(50)", pk: false, fk: "hosts.id", nullable: false, default: null }, { name: "metric_type", type: "VARCHAR(50)", pk: false, fk: null, nullable: false, default: null }, { name: "cpu_count", type: "INTEGER", pk: false, fk: null, nullable: true, default: null }, { name: "cpu_model", type: "VARCHAR(200)", pk: false, fk: null, nullable: true, default: null }, { name: "cpu_cores", type: "INTEGER", pk: false, fk: null, nullable: true, default: null }, { name: "cpu_threads", type: "INTEGER", pk: false, fk: null, nullable: true, default: null }, { name: "cpu_threads_per_core", type: "INTEGER", pk: false, fk: null, nullable: true, default: null }, { name: "cpu_sockets", type: "INTEGER", pk: false, fk: null, nullable: true, default: null }, { name: "cpu_mhz", type: "FLOAT", pk: false, fk: null, nullable: true, default: null }, { name: "cpu_max_mhz", type: "FLOAT", pk: false, fk: null, nullable: true, default: null }, { name: "cpu_min_mhz", type: "FLOAT", pk: false, fk: null, nullable: true, default: null }, { name: "cpu_load_1m", type: "FLOAT", pk: false, fk: null, nullable: true, default: null }, { name: "cpu_load_5m", type: "FLOAT", pk: false, fk: null, nullable: true, default: null }, { name: "cpu_load_15m", type: "FLOAT", pk: false, fk: null, nullable: true, default: null }, { name: "cpu_usage_percent", type: "FLOAT", pk: false, fk: null, nullable: true, default: null }, { name: "cpu_temperature", type: "FLOAT", pk: false, fk: null, nullable: true, default: null }, { name: "memory_total_mb", type: "INTEGER", pk: false, fk: null, nullable: true, default: null }, { name: "memory_used_mb", type: "INTEGER", pk: false, fk: null, nullable: true, default: null }, { name: "memory_free_mb", type: "INTEGER", pk: false, fk: null, nullable: true, default: null }, { name: "memory_usage_percent", type: "FLOAT", pk: false, fk: null, nullable: true, default: null }, { name: "swap_total_mb", type: "INTEGER", pk: false, fk: null, nullable: true, default: null }, { name: "swap_used_mb", type: "INTEGER", pk: false, fk: null, nullable: true, default: null }, { name: "swap_usage_percent", type: "FLOAT", pk: false, fk: null, nullable: true, default: null }, { name: "disk_info", type: "JSON", pk: false, fk: null, nullable: true, default: null }, { name: "disk_devices", type: "JSON", pk: false, fk: null, nullable: false, default: null }, { name: "disk_root_total_gb", type: "FLOAT", pk: false, fk: null, nullable: true, default: null }, { name: "disk_root_used_gb", type: "FLOAT", pk: false, fk: null, nullable: true, default: null }, { name: "disk_root_usage_percent", type: "FLOAT", pk: false, fk: null, nullable: true, default: null }, { name: "lvm_info", type: "JSON", pk: false, fk: null, nullable: true, default: null }, { name: "zfs_info", type: "JSON", pk: false, fk: null, nullable: true, default: null }, { name: "storage_details", type: "JSON", pk: false, fk: null, nullable: true, default: null }, { name: "os_name", type: "VARCHAR(100)", pk: false, fk: null, nullable: true, default: null }, { name: "os_version", type: "VARCHAR(100)", pk: false, fk: null, nullable: true, default: null }, { name: "kernel_version", type: "VARCHAR(100)", pk: false, fk: null, nullable: true, default: null }, { name: "hostname", type: "VARCHAR(200)", pk: false, fk: null, nullable: true, default: null }, { name: "uptime_seconds", type: "INTEGER", pk: false, fk: null, nullable: true, default: null }, { name: "uptime_human", type: "VARCHAR(100)", pk: false, fk: null, nullable: true, default: null }, { name: "network_info", type: "JSON", pk: false, fk: null, nullable: true, default: null }, { name: "raw_data", type: "JSON", pk: false, fk: null, nullable: true, default: null }, { name: "collection_source", type: "VARCHAR(100)", pk: false, fk: null, nullable: true, default: null }, { name: "collection_duration_ms", type: "INTEGER", pk: false, fk: null, nullable: true, default: null }, { name: "error_message", type: "TEXT", pk: false, fk: null, nullable: true, default: null }, { name: "collected_at", type: "DATETIME", pk: false, fk: null, nullable: false, default: "now()" }, { name: "created_at", type: "DATETIME", pk: false, fk: null, nullable: false, default: "now()" }, ] }, hosts: { group: "Hôtes", description: "Inventaire des serveurs/hôtes gérés", columns: [ { name: "id", type: "VARCHAR(50)", pk: true, fk: null, nullable: false, default: null }, { name: "name", type: "VARCHAR(255)", pk: false, fk: null, nullable: false, default: null }, { name: "ip_address", type: "VARCHAR(50)", pk: false, fk: null, nullable: false, default: null }, { name: "status", type: "VARCHAR(50)", pk: false, fk: null, nullable: false, default: "'unknown'" }, { name: "ansible_group", type: "VARCHAR(50)", pk: false, fk: null, nullable: true, default: null }, { name: "last_seen", type: "DATETIME", pk: false, fk: null, nullable: true, default: null }, { name: "reachable", type: "BOOLEAN", pk: false, fk: null, nullable: false, default: "0" }, { name: "created_at", type: "DATETIME", pk: false, fk: null, nullable: false, default: "now()" }, { name: "updated_at", type: "DATETIME", pk: false, fk: null, nullable: false, default: "now()" }, { name: "deleted_at", type: "DATETIME", pk: false, fk: null, nullable: true, default: null }, { name: "docker_enabled", type: "BOOLEAN", pk: false, fk: null, nullable: false, default: "0" }, { name: "docker_version", type: "VARCHAR(50)", pk: false, fk: null, nullable: true, default: null }, { name: "docker_status", type: "VARCHAR(20)", pk: false, fk: null, nullable: true, default: null }, { name: "docker_last_collect_at", type: "DATETIME", pk: false, fk: null, nullable: true, default: null }, ] }, logs: { group: "Système", description: "Journal applicatif général", columns: [ { name: "id", type: "INTEGER", pk: true, fk: null, nullable: false, default: null }, { name: "level", type: "VARCHAR(50)", pk: false, fk: null, nullable: false, default: null }, { name: "source", type: "VARCHAR(255)", pk: false, fk: null, nullable: true, default: null }, { name: "message", type: "TEXT", pk: false, fk: null, nullable: false, default: null }, { name: "details", type: "JSON", pk: false, fk: null, nullable: true, default: null }, { name: "host_id", type: "VARCHAR(50)", pk: false, fk: null, nullable: true, default: null }, { name: "task_id", type: "VARCHAR(50)", pk: false, fk: null, nullable: true, default: null }, { name: "schedule_id", type: "VARCHAR(50)", pk: false, fk: null, nullable: true, default: null }, { name: "created_at", type: "DATETIME", pk: false, fk: null, nullable: false, default: "now()" }, ] }, playbook_lint_results: { group: "Ansible", description: "Résultats d'analyse de qualité des playbooks Ansible", columns: [ { name: "id", type: "INTEGER", pk: true, fk: null, nullable: false, default: null }, { name: "filename", type: "VARCHAR(255)", pk: false, fk: null, nullable: false, default: null }, { name: "quality_score", type: "INTEGER", pk: false, fk: null, nullable: false, default: "100" }, { name: "total_issues", type: "INTEGER", pk: false, fk: null, nullable: false, default: "0" }, { name: "errors_count", type: "INTEGER", pk: false, fk: null, nullable: false, default: "0" }, { name: "warnings_count", type: "INTEGER", pk: false, fk: null, nullable: false, default: "0" }, { name: "execution_time_ms", type: "INTEGER", pk: false, fk: null, nullable: false, default: "0" }, { name: "issues_json", type: "TEXT", pk: false, fk: null, nullable: true, default: null }, { name: "raw_output", type: "TEXT", pk: false, fk: null, nullable: true, default: null }, { name: "created_at", type: "DATETIME", pk: false, fk: null, nullable: false, default: "auto" }, { name: "updated_at", type: "DATETIME", pk: false, fk: null, nullable: false, default: "auto" }, ] }, schedule_runs: { group: "Ansible", description: "Historique des exécutions de planifications", columns: [ { name: "id", type: "INTEGER", pk: true, fk: null, nullable: false, default: null }, { name: "schedule_id", type: "VARCHAR(50)", pk: false, fk: "schedules.id", nullable: false, default: null }, { name: "task_id", type: "VARCHAR(50)", pk: false, fk: "tasks.id", nullable: true, default: null }, { name: "status", type: "VARCHAR(50)", pk: false, fk: null, nullable: false, default: null }, { name: "started_at", type: "DATETIME", pk: false, fk: null, nullable: false, default: null }, { name: "completed_at", type: "DATETIME", pk: false, fk: null, nullable: true, default: null }, { name: "duration", type: "FLOAT", pk: false, fk: null, nullable: true, default: null }, { name: "hosts_impacted", type: "INTEGER", pk: false, fk: null, nullable: true, default: "0" }, { name: "error_message", type: "TEXT", pk: false, fk: null, nullable: true, default: null }, { name: "output", type: "TEXT", pk: false, fk: null, nullable: true, default: null }, { name: "created_at", type: "DATETIME", pk: false, fk: null, nullable: false, default: "now()" }, ] }, schedules: { group: "Ansible", description: "Planifications d'exécution de playbooks", columns: [ { name: "id", type: "VARCHAR(50)", pk: true, fk: null, nullable: false, default: null }, { name: "name", type: "VARCHAR(255)", pk: false, fk: null, nullable: false, default: null }, { name: "description", type: "TEXT", pk: false, fk: null, nullable: true, default: null }, { name: "playbook", type: "VARCHAR(255)", pk: false, fk: null, nullable: false, default: null }, { name: "target_type", type: "VARCHAR(50)", pk: false, fk: null, nullable: true, default: "group" }, { name: "target", type: "VARCHAR(255)", pk: false, fk: null, nullable: false, default: null }, { name: "extra_vars", type: "JSON", pk: false, fk: null, nullable: true, default: null }, { name: "schedule_type", type: "VARCHAR(50)", pk: false, fk: null, nullable: false, default: null }, { name: "schedule_time", type: "DATETIME", pk: false, fk: null, nullable: true, default: null }, { name: "recurrence_type", type: "VARCHAR(50)", pk: false, fk: null, nullable: true, default: null }, { name: "recurrence_time", type: "VARCHAR(50)", pk: false, fk: null, nullable: true, default: null }, { name: "recurrence_days", type: "TEXT", pk: false, fk: null, nullable: true, default: null }, { name: "cron_expression", type: "VARCHAR(100)", pk: false, fk: null, nullable: true, default: null }, { name: "timezone", type: "VARCHAR(100)", pk: false, fk: null, nullable: true, default: "America/Montreal" }, { name: "start_at", type: "DATETIME", pk: false, fk: null, nullable: true, default: null }, { name: "end_at", type: "DATETIME", pk: false, fk: null, nullable: true, default: null }, { name: "enabled", type: "BOOLEAN", pk: false, fk: null, nullable: false, default: "True" }, { name: "tags", type: "TEXT", pk: false, fk: null, nullable: true, default: null }, { name: "next_run", type: "DATETIME", pk: false, fk: null, nullable: true, default: null }, { name: "last_run", type: "DATETIME", pk: false, fk: null, nullable: true, default: null }, { name: "last_status", type: "VARCHAR(50)", pk: false, fk: null, nullable: true, default: "never" }, { name: "retry_on_failure", type: "INTEGER", pk: false, fk: null, nullable: true, default: "0" }, { name: "timeout", type: "INTEGER", pk: false, fk: null, nullable: true, default: "3600" }, { name: "notification_type", type: "VARCHAR(50)", pk: false, fk: null, nullable: true, default: "all" }, { name: "run_count", type: "INTEGER", pk: false, fk: null, nullable: true, default: "0" }, { name: "success_count", type: "INTEGER", pk: false, fk: null, nullable: true, default: "0" }, { name: "failure_count", type: "INTEGER", pk: false, fk: null, nullable: true, default: "0" }, { name: "created_at", type: "DATETIME", pk: false, fk: null, nullable: false, default: "now()" }, { name: "updated_at", type: "DATETIME", pk: false, fk: null, nullable: false, default: "now()" }, { name: "deleted_at", type: "DATETIME", pk: false, fk: null, nullable: true, default: null }, ] }, tasks: { group: "Ansible", description: "Tâches Ansible déclenchées manuellement ou via planification", columns: [ { name: "id", type: "VARCHAR(50)", pk: true, fk: null, nullable: false, default: null }, { name: "action", type: "VARCHAR(100)", pk: false, fk: null, nullable: false, default: null }, { name: "target", type: "VARCHAR(255)", pk: false, fk: null, nullable: false, default: null }, { name: "status", type: "VARCHAR(50)", pk: false, fk: null, nullable: false, default: "'pending'" }, { name: "playbook", type: "VARCHAR(255)", pk: false, fk: null, nullable: true, default: null }, { name: "started_at", type: "DATETIME", pk: false, fk: null, nullable: true, default: null }, { name: "completed_at", type: "DATETIME", pk: false, fk: null, nullable: true, default: null }, { name: "error_message", type: "TEXT", pk: false, fk: null, nullable: true, default: null }, { name: "result_data", type: "JSON", pk: false, fk: null, nullable: true, default: null }, { name: "created_at", type: "DATETIME", pk: false, fk: null, nullable: false, default: "now()" }, ] }, terminal_command_logs: { group: "Terminal", description: "Journal des commandes exécutées dans le terminal", columns: [ { name: "id", type: "INTEGER", pk: true, fk: null, nullable: false, default: null }, { name: "created_at", type: "DATETIME", pk: false, fk: null, nullable: false, default: "now()" }, { name: "host_id", type: "VARCHAR(50)", pk: false, fk: "hosts.id", nullable: false, default: null }, { name: "user_id", type: "INTEGER", pk: false, fk: "users.id", nullable: true, default: null }, { name: "terminal_session_id", type: "VARCHAR(64)", pk: false, fk: null, nullable: true, default: null }, { name: "command", type: "TEXT", pk: false, fk: null, nullable: false, default: null }, { name: "command_hash", type: "VARCHAR(64)", pk: false, fk: null, nullable: false, default: null }, { name: "source", type: "VARCHAR(20)", pk: false, fk: null, nullable: false, default: "'terminal'" }, { name: "is_pinned", type: "BOOLEAN", pk: false, fk: null, nullable: false, default: "0" }, { name: "is_blocked", type: "BOOLEAN", pk: false, fk: null, nullable: false, default: "0" }, { name: "blocked_reason", type: "VARCHAR(255)", pk: false, fk: null, nullable: true, default: null }, { name: "username", type: "VARCHAR(100)", pk: false, fk: null, nullable: true, default: null }, { name: "host_name", type: "VARCHAR(100)", pk: false, fk: null, nullable: true, default: null }, ] }, terminal_sessions: { group: "Terminal", description: "Sessions de terminal actives ou fermées", columns: [ { name: "id", type: "VARCHAR(50)", pk: true, fk: null, nullable: false, default: null }, { name: "host_id", type: "VARCHAR(50)", pk: false, fk: null, nullable: false, default: null }, { name: "host_name", type: "VARCHAR(255)", pk: false, fk: null, nullable: false, default: null }, { name: "host_ip", type: "VARCHAR(50)", pk: false, fk: null, nullable: false, default: null }, { name: "user_id", type: "INTEGER", pk: false, fk: null, nullable: true, default: null }, { name: "username", type: "VARCHAR(50)", pk: false, fk: null, nullable: true, default: null }, { name: "token_hash", type: "VARCHAR(128)", pk: false, fk: null, nullable: false, default: null }, { name: "ttyd_port", type: "INTEGER", pk: false, fk: null, nullable: false, default: null }, { name: "ttyd_pid", type: "INTEGER", pk: false, fk: null, nullable: true, default: null }, { name: "mode", type: "VARCHAR(20)", pk: false, fk: null, nullable: false, default: "'embedded'" }, { name: "status", type: "VARCHAR(20)", pk: false, fk: null, nullable: false, default: "'active'" }, { name: "reason_closed", type: "VARCHAR(30)", pk: false, fk: null, nullable: true, default: null }, { name: "created_at", type: "DATETIME", pk: false, fk: null, nullable: false, default: "now()" }, { name: "last_seen_at", type: "DATETIME", pk: false, fk: null, nullable: false, default: "now()" }, { name: "expires_at", type: "DATETIME", pk: false, fk: null, nullable: false, default: null }, { name: "closed_at", type: "DATETIME", pk: false, fk: null, nullable: true, default: null }, ] }, users: { group: "Utilisateurs", description: "Comptes utilisateurs de l'application", columns: [ { name: "id", type: "INTEGER", pk: true, fk: null, nullable: false, default: null }, { name: "username", type: "VARCHAR(50)", pk: false, fk: null, nullable: false, default: null }, { name: "email", type: "VARCHAR(255)", pk: false, fk: null, nullable: true, default: null }, { name: "hashed_password", type: "VARCHAR(255)", pk: false, fk: null, nullable: false, default: null }, { name: "role", type: "VARCHAR(20)", pk: false, fk: null, nullable: false, default: "'admin'" }, { name: "is_active", type: "BOOLEAN", pk: false, fk: null, nullable: false, default: "1" }, { name: "is_superuser", type: "BOOLEAN", pk: false, fk: null, nullable: false, default: "0" }, { name: "display_name", type: "VARCHAR(100)", pk: false, fk: null, nullable: true, default: null }, { name: "created_at", type: "DATETIME", pk: false, fk: null, nullable: false, default: "now()" }, { name: "updated_at", type: "DATETIME", pk: false, fk: null, nullable: false, default: "now()" }, { name: "last_login", type: "DATETIME", pk: false, fk: null, nullable: true, default: null }, { name: "password_changed_at", type: "DATETIME", pk: false, fk: null, nullable: true, default: null }, { name: "deleted_at", type: "DATETIME", pk: false, fk: null, nullable: true, default: null }, ] }, }; const GROUP_COLORS = { "Hôtes": { bg: "#0f172a", accent: "#38bdf8", badge: "#0369a1", badgeText: "#e0f2fe" }, "Docker": { bg: "#0a1628", accent: "#22d3ee", badge: "#0e7490", badgeText: "#cffafe" }, "Ansible": { bg: "#1a0a2e", accent: "#a78bfa", badge: "#6d28d9", badgeText: "#ede9fe" }, "Utilisateurs": { bg: "#0f1f0f", accent: "#4ade80", badge: "#15803d", badgeText: "#dcfce7" }, "Terminal": { bg: "#1a1400", accent: "#fbbf24", badge: "#b45309", badgeText: "#fef3c7" }, "Notifications": { bg: "#1a0a0a", accent: "#f87171", badge: "#b91c1c", badgeText: "#fee2e2" }, "Système": { bg: "#111827", accent: "#94a3b8", badge: "#475569", badgeText: "#f1f5f9" }, }; const TYPE_COLOR = (t) => { if (t.startsWith("VARCHAR") || t === "TEXT") return "#7dd3fc"; if (t === "INTEGER" || t === "BIGINT" || t === "FLOAT") return "#86efac"; if (t === "DATETIME") return "#fcd34d"; if (t === "BOOLEAN") return "#f9a8d4"; if (t === "JSON") return "#c4b5fd"; return "#e2e8f0"; }; const GROUPS = [...new Set(Object.values(SCHEMA).map(t => t.group))]; export default function App() { const [search, setSearch] = useState(""); const [activeGroup, setActiveGroup] = useState("Tous"); const [selectedTable, setSelectedTable] = useState(null); const [colSearch, setColSearch] = useState(""); const tableNames = useMemo(() => Object.keys(SCHEMA).sort(), []); const filtered = useMemo(() => { return tableNames.filter(name => { const matchGroup = activeGroup === "Tous" || SCHEMA[name].group === activeGroup; const matchSearch = name.toLowerCase().includes(search.toLowerCase()) || SCHEMA[name].description.toLowerCase().includes(search.toLowerCase()); return matchGroup && matchSearch; }); }, [tableNames, search, activeGroup]); const tableData = selectedTable ? SCHEMA[selectedTable] : null; const groupColor = tableData ? GROUP_COLORS[tableData.group] : null; const filteredCols = useMemo(() => { if (!tableData) return []; return tableData.columns.filter(c => c.name.toLowerCase().includes(colSearch.toLowerCase()) || c.type.toLowerCase().includes(colSearch.toLowerCase()) ); }, [tableData, colSearch]); const grouped = useMemo(() => { const g = {}; GROUPS.forEach(grp => { const tables = filtered.filter(n => SCHEMA[n].group === grp); if (tables.length) g[grp] = tables; }); return g; }, [filtered]); return (
{tableData.description}
{/* Stats row */}| {h} | ))}|||
|---|---|---|---|
|
{col.pk && 🔑}
{col.fk && !col.pk && 🔗}
{!col.pk && !col.fk && ·}
{col.name}
{col.fk && (
→ {col.fk}
)}
|
{col.type} |
{!col.nullable && (
NOT NULL
)}
{col.nullable && (
NULL
)}
|
{col.default ? (
{col.default}
) : (
—
)}
|
Sélectionnez une table dans le panneau de gauche