Init
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
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();
|
||||
Reference in New Issue
Block a user