feat: v1.3.68 — Info modal: copy buttons only on name/pkg/route, add curl copy field

This commit is contained in:
“Naeel”
2026-05-08 14:01:55 +04:00
parent 8f4659d2ef
commit c9b5867373
3 changed files with 47 additions and 26 deletions
+1 -1
View File
@@ -55,7 +55,7 @@ spec:
serviceAccountName: fission-console
containers:
- name: console
image: naeel/fission-console:v1.3.67
image: naeel/fission-console:v1.3.68
imagePullPolicy: Always
ports:
- containerPort: 8090
+2 -2
View File
@@ -102,7 +102,7 @@
<div class="nubes">NUBES</div>
<div class="product">FISSION CONSOLE</div>
</div>
<div style="font-size:0.65rem; color:var(--text-secondary); margin-left:10px; align-self:center; opacity:0.7;">v1.3.67</div>
<div style="font-size:0.65rem; color:var(--text-secondary); margin-left:10px; align-self:center; opacity:0.7;">v1.3.68</div>
</div>
<div class="row" style="margin:0;">
<button class="btn ghost" onclick="reloadAll()">Refresh</button>
@@ -485,7 +485,7 @@
</div>
<div class="actions" style="justify-content:space-between; align-items:center;">
<span style="font-size:0.75rem; color:var(--text-secondary);">v1.3.67</span>
<span style="font-size:0.75rem; color:var(--text-secondary);">v1.3.68</span>
<button class="btn ghost" onclick="closeHelp()">Закрыть</button>
</div>
</div>
+44 -23
View File
@@ -193,33 +193,54 @@ function openInfo(name, btn) {
return;
}
// copyBtn — кнопка копирования конкретного значения в буфер.
function copyBtn(val) {
return val && val !== '-'
? ' <button class="btn ghost" style="padding:1px 6px; font-size:11px;" onclick="navigator.clipboard.writeText(\'' + val.replace(/\\/g, '\\\\').replace(/'/g, "\\'") + '\')">📋</button>'
: '';
if (!val || val === '-') return '';
var safe = val.replace(/\\/g, '\\\\').replace(/'/g, "\\'");
return ' <button class="btn ghost" style="padding:1px 6px; font-size:11px;" onclick="navigator.clipboard.writeText(\'' + safe + '\')">📋</button>';
}
var rows = [
['Имя', info.name],
['Окружение', info.env],
['Пакет', info.pkg],
['Entrypoint', info.entrypoint],
['Таймаут', info.timeout ? info.timeout + ' сек' : '-'],
['Тип источника', info.sourceType === 'archive' ? '📦 archive' : '📝 code'],
['Маршрут', info.route],
['Методы', Array.isArray(info.methods) && info.methods.length ? info.methods.join(', ') : '-'],
['Cron', info.cron || '-'],
['Создана', info.createdAt],
['Изменена', info.updatedAt],
];
// Строки без кнопки копирования (только отображение).
function plain(val) {
return '<td class="mono" style="word-break:break-all;padding:4px 0;">' + h(val || '-') + '</td>';
}
var html = rows.map(function(r) {
var val = r[1] || '-';
return '<tr>' +
'<td style="color:var(--text-secondary);padding:4px 10px 4px 0;white-space:nowrap;vertical-align:top;">' + h(r[0]) + '</td>' +
'<td class="mono" style="word-break:break-all;padding:4px 0;">' + h(val) + copyBtn(val) + '</td>' +
'</tr>';
}).join('');
// Строки с кнопкой копирования (Имя, Пакет, Маршрут — генерируемые или идентификаторы).
function withCopy(val) {
return '<td class="mono" style="word-break:break-all;padding:4px 0;">' + h(val || '-') + copyBtn(val) + '</td>';
}
function labelTd(label) {
return '<td style="color:var(--text-secondary);padding:4px 10px 4px 0;white-space:nowrap;vertical-align:top;">' + h(label) + '</td>';
}
// CURL-строка для внешнего вызова (полная, с токеном из localStorage).
var token = localStorage.getItem('auth_token') || '';
var method = (Array.isArray(info.methods) && info.methods.length) ? info.methods[0] : 'GET';
var externalUrl = window.location.origin + '/fn' + (info.route !== '-' ? info.route : '');
var curlFull = 'curl -H "X-Auth-Token: ' + token + '" -X ' + method + ' "' + externalUrl + '"';
// В отображении скрываем токен — показываем только метод и URL.
var curlDisplay = 'curl ... -X ' + method + ' "' + externalUrl + '"';
var curlSafe = curlFull.replace(/\\/g, '\\\\').replace(/'/g, "\\'");
var html = [
'<tr>' + labelTd('Имя') + withCopy(info.name) + '</tr>',
'<tr>' + labelTd('Окружение') + plain(info.env) + '</tr>',
'<tr>' + labelTd('Пакет') + withCopy(info.pkg) + '</tr>',
'<tr>' + labelTd('Entrypoint') + plain(info.entrypoint) + '</tr>',
'<tr>' + labelTd('Таймаут') + plain(info.timeout ? info.timeout + ' сек' : '-') + '</tr>',
'<tr>' + labelTd('Тип источника') + plain(info.sourceType === 'archive' ? '📦 archive' : '📝 code') + '</tr>',
'<tr>' + labelTd('Маршрут') + withCopy(info.route) + '</tr>',
'<tr>' + labelTd('Методы') + plain(Array.isArray(info.methods) && info.methods.length ? info.methods.join(', ') : '-') + '</tr>',
'<tr>' + labelTd('Cron') + plain(info.cron || '-') + '</tr>',
'<tr>' + labelTd('Создана') + plain(info.createdAt) + '</tr>',
'<tr>' + labelTd('Изменена') + plain(info.updatedAt) + '</tr>',
'<tr>' + labelTd('curl') +
'<td class="mono" style="word-break:break-all;padding:4px 0;color:var(--text-secondary);">' +
h(curlDisplay) +
' <button class="btn ghost" style="padding:1px 6px; font-size:11px;" onclick="navigator.clipboard.writeText(\'' + curlSafe + '\')">📋</button>' +
'</td></tr>',
].join('');
document.getElementById('info-title').textContent = 'Информация: ' + name;
document.getElementById('info-rows').innerHTML = html;