Files

87 lines
3.1 KiB
JavaScript

const $ = (id) => document.getElementById(id);
const urlInput = $('server-url');
const tokenInput = $('api-token');
const jUrl = $('jira-url');
const jEmail = $('jira-email');
const jToken = $('jira-token');
const jBoards = $('jira-boards');
const feedback = $('feedback');
const stripUrl = (v) => (v || '').trim().replace(/\/+$/, '');
function originPattern(url) {
try { return `${new URL(url).origin}/*`; } catch { return null; }
}
function show(state, text) {
feedback.dataset.state = state;
feedback.textContent = text;
}
function parseBoards(v) {
return (v || '').split(',').map(s => s.trim()).filter(Boolean);
}
async function load() {
const { serverUrl, token, jira } = await chrome.storage.local.get(['serverUrl', 'token', 'jira']);
if (serverUrl) urlInput.value = serverUrl;
if (token) tokenInput.value = token;
if (jira) {
if (jira.baseUrl) jUrl.value = jira.baseUrl;
if (jira.email) jEmail.value = jira.email;
if (jira.apiToken) jToken.value = jira.apiToken;
if (Array.isArray(jira.boardIds)) jBoards.value = jira.boardIds.join(', ');
}
}
async function ensurePermission(pattern) {
try { return await chrome.permissions.request({ origins: [pattern] }); }
catch { return false; }
}
async function save(e) {
e.preventDefault();
const serverUrl = stripUrl(urlInput.value);
const token = tokenInput.value.trim();
const pattern = originPattern(serverUrl);
if (!pattern) return show('error', 'Enter a valid server URL, e.g. https://forge.mycloud.dp.ua');
if (!token) return show('error', 'Paste a sync token (starts with fg_).');
if (!(await ensurePermission(pattern))) return show('error', 'Permission for the FORGE origin was denied.');
// Jira is optional; only persist + request permission when a base URL is given.
const jiraBase = stripUrl(jUrl.value);
let jira = null;
if (jiraBase) {
const jPattern = originPattern(jiraBase);
if (!jPattern) return show('error', 'Enter a valid Jira base URL, e.g. https://support.dataart.com');
if (!(await ensurePermission(jPattern))) return show('error', 'Permission for the Jira origin was denied.');
jira = {
baseUrl: jiraBase,
email: jEmail.value.trim(),
apiToken: jToken.value.trim(),
boardIds: parseBoards(jBoards.value),
jql: '',
};
}
await chrome.storage.local.set({ serverUrl, token, jira });
show('ok', jira && jira.boardIds.length
? 'Saved. Sync from the popup — SNOW then Jira.'
: 'Saved. You can sync from the toolbar popup now.');
}
async function test() {
const serverUrl = stripUrl(urlInput.value);
const pattern = originPattern(serverUrl);
if (!pattern) return show('error', 'Enter a valid server URL first.');
if (!(await ensurePermission(pattern))) return show('error', 'Permission for that origin was denied.');
try {
const res = await fetch(`${serverUrl}/healthz`);
if (res.ok) show('ok', 'FORGE server reachable ✓');
else show('error', `Server responded ${res.status}.`);
} catch {
show('error', 'Could not reach the server.');
}
}
$('form').addEventListener('submit', save);
$('test').addEventListener('click', test);
load();