SenY commited on
Commit
3e76749
·
1 Parent(s): 7eff197

管理方法変更

Browse files
Files changed (5) hide show
  1. control.js +1 -0
  2. history.js +54 -4
  3. index.html +1 -1
  4. prompt.js +2 -2
  5. storage.js +0 -4
control.js CHANGED
@@ -113,4 +113,5 @@ async function updateModelList() {
113
  } catch (error) {
114
  console.error('モデルリストの更新中にエラーが発生しました:', error);
115
  }
 
116
  }
 
113
  } catch (error) {
114
  console.error('モデルリストの更新中にエラーが発生しました:', error);
115
  }
116
+ loadFromUserStorage();
117
  }
history.js CHANGED
@@ -35,9 +35,38 @@ function updateHistoryList() {
35
  noHistoryMessage.classList.add('d-none');
36
  historyList.classList.remove('d-none');
37
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
38
  history.forEach((item, index) => {
39
  const li = document.createElement('li');
40
  li.className = 'list-group-item list-group-item-action d-flex justify-content-between align-items-start';
 
41
 
42
  const contentDiv = document.createElement('div');
43
  contentDiv.className = 'ms-2 me-auto';
@@ -83,10 +112,14 @@ function updateHistoryList() {
83
 
84
  contentDiv.style.width = `calc(100% - ${buttonsContainer.offsetWidth}px)`;
85
  });
 
 
 
 
86
  }
87
  }
88
  function deleteHistoryItem(index) {
89
- if (confirm('この履歴項目を削除してもよろしいですか?')) {
90
  let history = JSON.parse(localStorage.getItem('gemini_prompt_history') || '[]');
91
  history.splice(index, 1);
92
  localStorage.setItem('gemini_prompt_history', JSON.stringify(history));
@@ -106,7 +139,7 @@ function loadHistoryItem(index) {
106
  }
107
 
108
  function clearHistory() {
109
- if (confirm('本当に履歴をすべて削除してもよろしいですか?')) {
110
  localStorage.removeItem('gemini_prompt_history');
111
  updateHistoryList();
112
  }
@@ -137,7 +170,7 @@ function createHistoryItem(item, index) {
137
  deleteButton.className = 'btn btn-sm btn-danger';
138
  deleteButton.innerHTML = '<i class="fas fa-trash"></i>';
139
  deleteButton.onclick = () => {
140
- if (confirm('この履歴項目を削除してもよろしいですか?')) {
141
  deleteHistoryItem(index);
142
  }
143
  };
@@ -155,7 +188,7 @@ function editHistoryItemTitle(index, titleDiv) {
155
  const item = history[index];
156
  const currentTitle = item.title || item.query.slice(0, 10);
157
 
158
- const newTitle = prompt('新しいタイトルを入力してください:', currentTitle);
159
  if (newTitle !== null && newTitle.trim() !== '') {
160
  item.title = newTitle.trim();
161
  history[index] = item;
@@ -163,3 +196,20 @@ function editHistoryItemTitle(index, titleDiv) {
163
  titleDiv.textContent = newTitle.trim();
164
  }
165
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35
  noHistoryMessage.classList.add('d-none');
36
  historyList.classList.remove('d-none');
37
 
38
+ // 容量プログレスバーを追加
39
+ const storageUsage = JSON.stringify(history).length;
40
+ const storageLimit = 3 * 1024 * 1024; // 3MB
41
+ const usagePercentage = (storageUsage / storageLimit) * 100;
42
+
43
+ const progressBarContainer = document.createElement('div');
44
+ progressBarContainer.className = 'mb-3';
45
+ progressBarContainer.innerHTML = `
46
+ <div class="progress" style="height: 24px; border: 1px solid #dee2e6; position: relative;">
47
+ <div class="progress-bar ${usagePercentage > 90 ? 'bg-danger' : 'bg-primary'}" role="progressbar"
48
+ style="width: ${usagePercentage}%;" aria-valuenow="${usagePercentage}" aria-valuemin="0" aria-valuemax="100"></div>
49
+ <div class="position-absolute w-100 h-100 d-flex align-items-center justify-content-center" style="top: 0; left: 0;">
50
+ <span style="color: white; text-shadow: -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 1px 1px 0 #000;">
51
+ ${(storageUsage / 1024 / 1024).toFixed(2)}MB / ${storageLimit / 1024 / 1024}MB
52
+ </span>
53
+ </div>
54
+ </div>
55
+ `;
56
+ historyList.appendChild(progressBarContainer);
57
+
58
+ // 検索フォームを追加
59
+ const searchForm = document.createElement('div');
60
+ searchForm.className = 'mb-3';
61
+ searchForm.innerHTML = `
62
+ <input type="text" class="form-control" id="historySearchInput" placeholder="履歴を検索...">
63
+ `;
64
+ historyList.appendChild(searchForm);
65
+
66
  history.forEach((item, index) => {
67
  const li = document.createElement('li');
68
  li.className = 'list-group-item list-group-item-action d-flex justify-content-between align-items-start';
69
+ li.dataset.item = JSON.stringify(item);
70
 
71
  const contentDiv = document.createElement('div');
72
  contentDiv.className = 'ms-2 me-auto';
 
112
 
113
  contentDiv.style.width = `calc(100% - ${buttonsContainer.offsetWidth}px)`;
114
  });
115
+
116
+ // 検索機能を追加
117
+ const searchInput = document.getElementById('historySearchInput');
118
+ searchInput.addEventListener('input', filterHistory);
119
  }
120
  }
121
  function deleteHistoryItem(index) {
122
+ if (confirm('Are you sure you want to delete this history item?')) {
123
  let history = JSON.parse(localStorage.getItem('gemini_prompt_history') || '[]');
124
  history.splice(index, 1);
125
  localStorage.setItem('gemini_prompt_history', JSON.stringify(history));
 
139
  }
140
 
141
  function clearHistory() {
142
+ if (confirm('Are you sure you want to delete all history items?')) {
143
  localStorage.removeItem('gemini_prompt_history');
144
  updateHistoryList();
145
  }
 
170
  deleteButton.className = 'btn btn-sm btn-danger';
171
  deleteButton.innerHTML = '<i class="fas fa-trash"></i>';
172
  deleteButton.onclick = () => {
173
+ if (confirm('Are you sure you want to delete this history item?')) {
174
  deleteHistoryItem(index);
175
  }
176
  };
 
188
  const item = history[index];
189
  const currentTitle = item.title || item.query.slice(0, 10);
190
 
191
+ const newTitle = prompt('New title:', currentTitle);
192
  if (newTitle !== null && newTitle.trim() !== '') {
193
  item.title = newTitle.trim();
194
  history[index] = item;
 
196
  titleDiv.textContent = newTitle.trim();
197
  }
198
  }
199
+
200
+ function filterHistory() {
201
+ const searchInput = document.getElementById('historySearchInput');
202
+ const searchTerm = searchInput.value.toLowerCase();
203
+ const historyItems = document.querySelectorAll('#historyList li[data-item]');
204
+
205
+ historyItems.forEach(item => {
206
+ const itemData = JSON.parse(item.dataset.item);
207
+ const searchableText = `${itemData.title} ${itemData.query} ${itemData.promptEn} ${itemData.promptMyLanguage} ${itemData.danbooruTags}`.toLowerCase();
208
+
209
+ if (searchableText.includes(searchTerm)) {
210
+ item.classList.remove('d-none');
211
+ } else {
212
+ item.classList.add('d-none');
213
+ }
214
+ });
215
+ }
index.html CHANGED
@@ -168,7 +168,7 @@
168
  <!-- 新しいボタンを追加 -->
169
  <div class="mt-4">
170
  <button id="clearStorageButton" class="btn btn-danger w-100">
171
- 全データを削除
172
  </button>
173
  </div>
174
  </div>
 
168
  <!-- 新しいボタンを追加 -->
169
  <div class="mt-4">
170
  <button id="clearStorageButton" class="btn btn-danger w-100">
171
+ Clear All Settings
172
  </button>
173
  </div>
174
  </div>
prompt.js CHANGED
@@ -12,7 +12,7 @@ async function getModelList() {
12
 
13
  function generatePrompt() {
14
  if (!document.getElementById('apiKey').value) {
15
- alert("APIキーを入力してください");
16
  return;
17
  }
18
  let query = document.getElementById('query').value;
@@ -79,7 +79,7 @@ function generatePrompt() {
79
  safetySettings: [
80
  {
81
  category: "HARM_CATEGORY_SEXUALLY_EXPLICIT",
82
- threshold: "BLOCK_NONE"
83
  }
84
  ]
85
  };
 
12
 
13
  function generatePrompt() {
14
  if (!document.getElementById('apiKey').value) {
15
+ alert("Please enter your API key.");
16
  return;
17
  }
18
  let query = document.getElementById('query').value;
 
79
  safetySettings: [
80
  {
81
  category: "HARM_CATEGORY_SEXUALLY_EXPLICIT",
82
+ threshold: "OFF"
83
  }
84
  ]
85
  };
storage.js CHANGED
@@ -23,8 +23,4 @@ function loadFromUserStorage() {
23
  input.value = v;
24
  }
25
  });
26
- // エンドポイントが保存されていない場合、デフォルト値を設定
27
- if (!data.endpointSelect) {
28
- document.getElementById('endpointSelect').value = "gemini-1.5-pro-exp-0827";
29
- }
30
  }
 
23
  input.value = v;
24
  }
25
  });
 
 
 
 
26
  }