File size: 6,269 Bytes
1e37ab5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0aabf7d
 
 
 
 
 
 
80cb4b2
 
 
 
 
 
0aabf7d
 
 
 
 
 
 
 
 
5be709f
0aabf7d
5be709f
 
 
 
 
 
 
 
 
 
 
 
 
0aabf7d
a4ac627
5be709f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7eff197
 
 
 
 
 
5be709f
 
7eff197
5be709f
 
80cb4b2
 
 
 
a4ac627
 
7eff197
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3e76749
7eff197
80cb4b2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
/**

 * control.js - UIコントロールとイベント管理

 * 

 * 主な機能:

 * - サイドバーの制御(表示/非表示、リサイズ)

 * - キーボードショートカット

 * - ローカルストレージのクリア

 * - レイアウトの自動調整

 * - モデルリストの更新

 * 

 * 重要な関数:

 * - initSidebarResize(): サイドバーのリサイズ機能を初期化

 * - resizeMain(): メインコンテンツのサイズを調整

 * - updateModelList(): 利用可能なモデルリストを更新

 */

updateHistoryList();
loadFromUserStorage();
setInterval(() => {
    saveToUserStorage();
}, 60000);
// 入力フォームの内容を保存する
document.querySelectorAll('input, textarea').forEach(input => {
    input.addEventListener('input', () => {
        saveToUserStorage();
        if (input.id === "apiKey") {
            updateModelList();
        }
    });
});
// Ctrl+Enterでプロンプト生成を実行する
document.addEventListener('keydown', function (event) {
    if (event.ctrlKey && event.key === 'Enter') {
        event.preventDefault(); // デフォルトの動作を防ぐ
        generatePrompt(); // プロンプト生成関数を呼び出す
    }
});

// サイドバーの切り替え機能を修正
document.getElementById('sidebarToggle').addEventListener('click', function () {
    const sidebarContainer = document.getElementById('sidebar-container');
    const content = document.getElementById('content');
    const isActive = sidebarContainer.classList.toggle('active');
    
    if (isActive) {
        // サイドバーを開く
        sidebarContainer.style.width = '250px';
        content.style.marginLeft = '250px';
    } else {
        // サイドバーを閉じる
        sidebarContainer.style.width = '0';
        content.style.marginLeft = '0';
    }
});

// サイドバーのリサイズ機能を修正
function initSidebarResize() {
    const sidebarContainer = document.getElementById('sidebar-container');
    const content = document.getElementById('content');
    const resizer = document.getElementById('sidebar-resizer');
    let isResizing = false;

    resizer.addEventListener('mousedown', (e) => {
        isResizing = true;
        document.addEventListener('mousemove', resize);
        document.addEventListener('mouseup', stopResize);
    });

    function resize(e) {
        if (!isResizing) return;
        const newWidth = e.clientX;
        const minWidth = 250;
        const maxWidth = 500;
        const sidebarWidth = Math.min(Math.max(minWidth, newWidth), maxWidth);
        
        sidebarContainer.style.width = `${sidebarWidth}px`;
        content.style.marginLeft = `${sidebarWidth}px`;
        sidebarContainer.classList.add('active'); // サイドバーを開いた状態にする
    }

    function stopResize() {
        isResizing = false;
        document.removeEventListener('mousemove', resize);
        document.removeEventListener('mouseup', stopResize);
    }
}

// localStorageをクリアする機能を追加
function initClearStorageButton() {
    const clearStorageButton = document.getElementById('clearStorageButton');
    clearStorageButton.addEventListener('click', () => {
        const userInput = prompt('全てのデータを削除します。よろしければ「YES」と入力してください。');
        if (userInput === 'YES') {
            localStorage.clear();
            alert('全てのデータが削除されました。ページを再読み込みします。');
            location.reload();
        } else {
            alert('削除がキャンセルされました。');
        }
    });
}

function resizeMain() {
    if (window.innerWidth >= 768) {
        document.querySelector("main").style.height = `calc(100vh - ${document.querySelector("main").offsetTop}px)`
    }
}

// DOMContentLoadedイベントリスナーを更新
document.addEventListener('DOMContentLoaded', function () {
    resizeMain();
    initSidebarResize();
    initClearStorageButton();
    updateModelList();
    
    // APIキーの設定状態をチェック
    checkApiKeySettings();
});

window.addEventListener("resize", resizeMain);

async function updateModelList() {
    try {
        const models = await getModelList();
        const endpointSelect = document.getElementById('endpointSelect');
        const currentOptions = Array.from(endpointSelect.options).map(option => option.value);

        models.forEach(model => {
            const modelPath = `models/${model.name.split('/').pop()}`;
            if (!currentOptions.includes(modelPath)) {
                const option = document.createElement('option');
                option.value = modelPath;
                option.textContent = model.name.split('/').pop();
                endpointSelect.appendChild(option);
            }
        });
    } catch (error) {
        console.error('モデルリストの更新中にエラーが発生しました:', error);
    }
    loadFromUserStorage();
}

/**

 * APIキーの設定状態をチェックし、未設定の場合はユーザーに入力を促す

 */
function checkApiKeySettings() {
    const apiKeyInput = document.getElementById('apiKey');
    const sidebarContainer = document.getElementById('sidebar-container');
    const content = document.getElementById('content');
    
    if (!apiKeyInput.value) {
        // サイドバーを開く
        sidebarContainer.style.width = '250px';
        content.style.marginLeft = '250px';
        sidebarContainer.classList.add('active');
        
        // APIキー入力欄を強調表示
        apiKeyInput.classList.add('border', 'border-danger', 'border-3');
        apiKeyInput.focus();
        
        // APIキーが入力されたら強調表示を解除
        apiKeyInput.addEventListener('input', function removeHighlight() {
            if (apiKeyInput.value) {
                apiKeyInput.classList.remove('border', 'border-danger', 'border-3');
                apiKeyInput.removeEventListener('input', removeHighlight);
            }
        });
    }
}