Newer
Older
TelosDB / src / frontend / components / main-panel.js
class MainPanel extends HTMLElement {
  connectedCallback() {
    if (this._initialized) return;
    this._initialized = true;
    this.className = 'main-panel';
    this.innerHTML = `
      <div id="panel-search" class="panel panel-search">
        <div class="search-container">
          <input type="text" id="query" class="search-input" placeholder="知識を検索..." autocomplete="off">
          <button onclick="search()" class="search-btn">検索</button>
        </div>

        <div id="result" class="results-panel">
          <div class="empty-state">クエリを入力して検索を開始してください</div>
        </div>

        <div class="sidebar-bottom" style="margin-top: auto; border-top: 1px solid var(--border-base);">
          <div class="accordion">
            <button class="accordion-header activity-toggle" aria-expanded="false" style="padding: 12px 16px;">
              MCP ACTIVITY <span id="activity-count" style="font-weight:normal; font-size: 0.65rem; margin-left: 8px;">LISTEN</span>
              <span class="accordion-toggle" style="margin-left: auto;">▸</span>
            </button>
            <div class="accordion-content activity-content" hidden style="padding: 0 16px 16px 16px;">
              <div class="activity-log" style="height: 140px; margin-top: 0; background: rgba(255,255,255,0.02); border-color: var(--border-subtle);">
                <div id="activity-items"></div>
              </div>
            </div>
          </div>
        </div>
      </div>

      <div id="panel-docs" class="panel panel-docs hidden">
        <h2 style="font-family:Outfit; margin-bottom:12px;">文書管理</h2>
        <div class="empty-state">近日実装予定</div>
      </div>

      <div id="panel-settings" class="panel panel-settings hidden">
        <h2 style="font-family:Outfit; margin-bottom:12px;">設定</h2>
        <div class="empty-state">近日実装予定</div>
      </div>
    `;

    // Handle navigation events from sidebar
    document.addEventListener('navigate-panel', (e) => {
      const target = String(e.detail || 'search');
      this.showPanel(target);
    });

    // Expose showPanel as method
    this.showPanel = (panelId) => {
      const panels = this.querySelectorAll('.panel');
      panels.forEach(p => p.classList.add('hidden'));
      switch (panelId) {
        case 'docs':
          this.querySelector('#panel-docs').classList.remove('hidden');
          break;
        case 'settings':
          this.querySelector('#panel-settings').classList.remove('hidden');
          break;
        default:
          this.querySelector('#panel-search').classList.remove('hidden');
      }
    };
    // default show search
    this.showPanel('search');

    // Activity Log accordion behavior
    const activityToggle = this.querySelector('.activity-toggle');
    const activityContent = this.querySelector('.activity-content');
    if (activityToggle && activityContent) {
      activityToggle.addEventListener('click', () => {
        const expanded = activityToggle.getAttribute('aria-expanded') === 'true';
        activityToggle.setAttribute('aria-expanded', String(!expanded));
        if (expanded) {
          activityContent.hidden = true;
          activityToggle.querySelector('.accordion-toggle').textContent = '▸';
        } else {
          activityContent.hidden = false;
          activityToggle.querySelector('.accordion-toggle').textContent = '▾';
        }
      });
    }
  }
}

customElements.define('main-panel', MainPanel);

export { };