87 lines
3.1 KiB
JavaScript
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();
|