Newer
Older
TelosDB / src / frontend / index.html
<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>TelosDB - Database Browser</title>
    <link rel="stylesheet" href="index.css">
</head>

<body>
    <div class="sidebar">
        <div class="sidebar-header">
            <h1>TelosDB</h1>
        </div>

        <div class="sidebar-section">
            <div class="sidebar-section-title">Status</div>
            <ul class="status-list">
                <li class="status-item">
                    <span>MCP Server</span>
                    <span id="mcp-status" class="tag tag-orange">Loading</span>
                </li>
                <li class="status-item">
                    <span>LLM Engine</span>
                    <span id="sidecar-status" class="tag tag-orange">Checking</span>
                </li>
            </ul>
        </div>

        <div class="sidebar-section">
            <div class="sidebar-section-title">Database Browser</div>
            <ul id="table-list" class="table-list">
                <!-- Tables loaded here -->
            </ul>
        </div>

        <div class="sidebar-section" style="margin-top: auto;">
            <button class="btn btn-outline" style="width: 100%; border-radius: 8px;" onclick="loadMcpConfig()">
                MCP Config
            </button>
        </div>
    </div>

    <div class="main-content">
        <div class="main-header">
            <h2 id="current-title">Welcome to TelosDB</h2>
            <div id="loading-indicator" style="display: none;">
                <div class="spinner" style="width: 24px; height: 24px; border-width: 3px;"></div>
            </div>
        </div>

        <div id="main-tabs" class="tabs" style="display: none;">
            <div id="tab-data" class="tab active" onclick="switchTab('data')">Data Explorer</div>
            <div id="tab-schema" class="tab" onclick="switchTab('schema')">Schema</div>
            <div id="tab-vector" class="tab" onclick="switchTab('vector')">Vector Search</div>
        </div>

        <div class="view-container">
            <!-- Empty View -->
            <div id="view-empty" class="empty-state">
                <div class="empty-state-icon">📁</div>
                <h3>データベースを選択してください</h3>
                <p>左側のリストからテーブルを選択してデータを閲覧するか、<br>ベクトル検索タブでAI機能を利用できます。</p>
            </div>

            <!-- Data Explorer View -->
            <div id="view-data" class="view">
                <div class="search-container">
                    <div class="input-group">
                        <input type="text" id="table-search" placeholder="ID or Contentで部分一致検索..."
                            onkeyup="if(event.key==='Enter') searchTable()">
                    </div>
                    <button class="btn" onclick="searchTable()">Search</button>
                </div>

                <div class="table-wrapper">
                    <table id="data-table">
                        <thead id="data-head"></thead>
                        <tbody id="data-body"></tbody>
                    </table>
                </div>

                <div class="pagination">
                    <span id="pagination-info">Showing 0-0 of 0</span>
                    <div style="display: flex; gap: 10px;">
                        <button id="prev-btn" class="btn btn-outline" onclick="changePage(-1)">Previous</button>
                        <button id="next-btn" class="btn btn-outline" onclick="changePage(1)">Next</button>
                    </div>
                </div>
            </div>

            <!-- Schema View -->
            <div id="view-schema" class="view">
                <div class="table-wrapper">
                    <table>
                        <thead>
                            <tr>
                                <th>Name</th>
                                <th>Type</th>
                                <th>Nullable</th>
                                <th>PK</th>
                                <th>Default</th>
                            </tr>
                        </thead>
                        <tbody id="schema-body"></tbody>
                    </table>
                </div>
            </div>

            <!-- Vector Search View -->
            <div id="view-vector" class="view">
                <div class="search-container" style="flex-direction: column;">
                    <textarea id="vector-input" rows="3" placeholder="文章を入力してください。AIが意味の近い内容を検索します..."></textarea>
                    <div style="display: flex; justify-content: flex-end; margin-top: 12px; gap: 12px;">
                        <div
                            style="display: flex; align-items: center; gap: 8px; font-size: 0.8rem; color: var(--text-secondary);">
                            Limit: <input type="number" id="vector-limit" value="5" min="1" max="50"
                                style="width: 60px; padding: 4px 8px;">
                        </div>
                        <button class="btn" onclick="executeVectorSearch()">
                            <span>Launch Vector Search</span>
                        </button>
                    </div>
                </div>

                <div id="vector-results">
                    <!-- Results populated here -->
                </div>
            </div>

            <!-- MCP Config View -->
            <div id="view-mcp" class="view">
                <div class="json-block">
                    <div
                        style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 12px;">
                        <h4 style="color: var(--accent-color);">mcp.json Configuration</h4>
                        <button class="btn btn-outline" style="padding: 4px 12px; font-size: 0.75rem;"
                            onclick="copyConfig()">Copy JSON</button>
                    </div>
                    <pre id="mcp-json"
                        style="max-height: 500px; overflow: auto; background: rgba(0,0,0,0.3); padding: 16px; border-radius: 8px; border: 1px solid var(--border-color); font-size: 0.8rem;"></pre>
                </div>
            </div>
        </div>
    </div>

    <script type="module" src="index.js"></script>
</body>

</html>