diff --git a/frontend/src/components/AccountEditModal.vue b/frontend/src/components/AccountEditModal.vue
new file mode 100644
index 0000000..f86930d
--- /dev/null
+++ b/frontend/src/components/AccountEditModal.vue
@@ -0,0 +1,74 @@
+
+
+
+
+
diff --git a/frontend/src/views/AccountsView.vue b/frontend/src/views/AccountsView.vue
index 09924a4..348d04f 100644
--- a/frontend/src/views/AccountsView.vue
+++ b/frontend/src/views/AccountsView.vue
@@ -4,6 +4,7 @@ import { api, jsonBody } from '../api'
import { fmtTs, fmtIso, fmtDate, fmtClock } from '../utils/format'
import ImportModal from '../components/ImportModal.vue'
import UpstreamModal from '../components/UpstreamModal.vue'
+import AccountEditModal from '../components/AccountEditModal.vue'
import Icon from '../components/Icon.vue'
const rows = ref([])
@@ -13,6 +14,15 @@ const showImport = ref(false)
const showUpstream = ref(false)
const editingUpstream = ref(null)
function editUpstream(a) { editingUpstream.value = a; showUpstream.value = true }
+const editingAccount = ref(null)
+function editAccount(a) { editingAccount.value = a }
+// Reflect the saved values in the table without a full reload.
+function applyEdit(payload) {
+ const row = editingAccount.value
+ if (!row) return
+ if (payload.weight != null) row.weight = payload.weight
+ if (payload.concurrency != null) row.concurrency = payload.concurrency
+}
const typeFilter = ref('') // '' | 'openai' | 'adobe' | 'runway' | 'leonardo'
const statusFilter = ref('') // '' | 'active' | 'quota' | 'disabled'
@@ -101,13 +111,6 @@ const pageNumbers = computed(() => {
let pendingTimer = null
-// Inline-edit an account field (weight / concurrency) → PATCH /tokens/{pool}/{id}.
-async function saveField(row, field, value) {
- const v = Number(value)
- if (Number.isNaN(v)) return
- await api(`/tokens/${row.pool}/${row.id}`, jsonBody('PATCH', { [field]: v }))
-}
-
async function loadAccounts() {
loading.value = true
quotaStatus.value = ''
@@ -463,19 +466,14 @@ onMounted(loadAccounts)
:class="a.remaining > 0 ? 'text-emerald-300' : 'text-rose-300'">{{ a.remaining }}{{ a.type === 'grok' ? '%' : '' }}
—
-
-
-
+
+ |
+ {{ a.weight ?? 0 }}
|
-
-
-
- {{ a.type === 'grok' ? 10 : 1 }}
+
+ |
+ {{ a.concurrency || 1 }}
+ {{ a.type === 'grok' ? 10 : 1 }}
|
@@ -528,6 +526,9 @@ onMounted(loadAccounts)
|
+
@@ -558,6 +559,7 @@ onMounted(loadAccounts)
+
diff --git a/frontend/src/views/LogsView.vue b/frontend/src/views/LogsView.vue
index 88f3253..c9d1212 100644
--- a/frontend/src/views/LogsView.vue
+++ b/frontend/src/views/LogsView.vue
@@ -303,7 +303,6 @@ const sourcePill = (s) => ({
-
{{ e.error }}
|