diff --git a/console/deploy/console.yaml b/console/deploy/console.yaml
index 9d7c815..03fb133 100644
--- a/console/deploy/console.yaml
+++ b/console/deploy/console.yaml
@@ -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
diff --git a/console/ui/index.html b/console/ui/index.html
index ad7ea03..22a5c30 100644
--- a/console/ui/index.html
+++ b/console/ui/index.html
@@ -102,7 +102,7 @@
NUBES
FISSION CONSOLE
- v1.3.67
+ v1.3.68
@@ -485,7 +485,7 @@
- v1.3.67
+ v1.3.68
diff --git a/console/ui/js/modals.js b/console/ui/js/modals.js
index 3b1673e..f3e28b4 100644
--- a/console/ui/js/modals.js
+++ b/console/ui/js/modals.js
@@ -193,33 +193,54 @@ function openInfo(name, btn) {
return;
}
+ // copyBtn — кнопка копирования конкретного значения в буфер.
function copyBtn(val) {
- return val && val !== '-'
- ? ' '
- : '';
+ if (!val || val === '-') return '';
+ var safe = val.replace(/\\/g, '\\\\').replace(/'/g, "\\'");
+ return ' ';
}
- 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 '' + h(val || '-') + ' | ';
+ }
- var html = rows.map(function(r) {
- var val = r[1] || '-';
- return '' +
- '| ' + h(r[0]) + ' | ' +
- '' + h(val) + copyBtn(val) + ' | ' +
- '
';
- }).join('');
+ // Строки с кнопкой копирования (Имя, Пакет, Маршрут — генерируемые или идентификаторы).
+ function withCopy(val) {
+ return '' + h(val || '-') + copyBtn(val) + ' | ';
+ }
+
+ function labelTd(label) {
+ return '' + h(label) + ' | ';
+ }
+
+ // 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 = [
+ '' + labelTd('Имя') + withCopy(info.name) + '
',
+ '' + labelTd('Окружение') + plain(info.env) + '
',
+ '' + labelTd('Пакет') + withCopy(info.pkg) + '
',
+ '' + labelTd('Entrypoint') + plain(info.entrypoint) + '
',
+ '' + labelTd('Таймаут') + plain(info.timeout ? info.timeout + ' сек' : '-') + '
',
+ '' + labelTd('Тип источника') + plain(info.sourceType === 'archive' ? '📦 archive' : '📝 code') + '
',
+ '' + labelTd('Маршрут') + withCopy(info.route) + '
',
+ '' + labelTd('Методы') + plain(Array.isArray(info.methods) && info.methods.length ? info.methods.join(', ') : '-') + '
',
+ '' + labelTd('Cron') + plain(info.cron || '-') + '
',
+ '' + labelTd('Создана') + plain(info.createdAt) + '
',
+ '' + labelTd('Изменена') + plain(info.updatedAt) + '
',
+ '' + labelTd('curl') +
+ '| ' +
+ h(curlDisplay) +
+ ' ' +
+ ' |
',
+ ].join('');
document.getElementById('info-title').textContent = 'Информация: ' + name;
document.getElementById('info-rows').innerHTML = html;