ken_nogi/NodeSrv/apps/app-portal/public/portal.js
Kenichiro NOGI 76700845fe feat: get-voice-mail app-portalキッカー追加、app-portal UIをBootstrap化
get-voice-mailはn8n Webhookへの中継専用アプリ(SCP取得・プリザンター書込はn8n側で実施)。
app-portalはBootstrap 5導入で見た目を刷新(カード/モーダル/トースト化)。
dokploy-webapp SKILLはGitea統合(NodeSrv→ken_nogi)後の設定変更を反映。
2026-09-19 11:06:02 +09:00

44 lines
1.4 KiB
JavaScript

const logModalEl = document.getElementById('logModal');
const logModalBody = document.getElementById('logModalBody');
const logModal = logModalEl ? new bootstrap.Modal(logModalEl) : null;
const toastEl = document.getElementById('actionToast');
const toastBody = document.getElementById('actionToastBody');
const toast = toastEl ? new bootstrap.Toast(toastEl) : null;
function showToast(message, isError) {
if (!toast) {
alert(message);
return;
}
toastBody.textContent = message;
toastEl.classList.toggle('text-bg-danger', Boolean(isError));
toastEl.classList.toggle('text-bg-primary', !isError);
toast.show();
}
document.getElementById('cards').addEventListener('click', async (event) => {
const button = event.target.closest('button[data-action]');
if (!button) return;
const { action, composeId } = button.dataset;
if (action === 'logs') {
const res = await fetch(`/api/compose/${composeId}/logs`);
if (!res.ok) {
showToast(`ログ取得に失敗しました (status: ${res.status})`, true);
return;
}
const data = await res.json();
logModalBody.textContent = data.logs || 'ログなし';
logModal.show();
return;
}
const res = await fetch(`/api/compose/${composeId}/${action}`, { method: 'POST' });
if (res.ok) {
showToast(`${action} を実行しました`, false);
} else {
showToast(`${action} に失敗しました (status: ${res.status})`, true);
}
});