1
0
mirror of git://f0xx.org/ac/ac-be-issues synced 2026-07-29 03:38:19 +03:00
Files
ac-be-issues/public/assets/js/ticket_create.js
Anton Afanasyeu d5b8c54b5b initial
2026-06-23 12:29:35 +02:00

133 lines
4.4 KiB
JavaScript

/**
* Create ticket/issue dialog — Issues toolbar uses "issue" type tag; Tickets uses "ticket".
*/
(function () {
const META = {
ticket: { id: 'ticket', label: 'ticket', bg: '#6366f1' },
issue: { id: 'issue', label: 'issue', bg: '#0d9488' },
};
function basePath() {
return document.body.getAttribute('data-base-path') || '';
}
function t(key) {
if (window.CrashI18n && window.CrashI18n.t) {
return window.CrashI18n.t(key);
}
return key;
}
function openDialog(kind) {
const dialog = document.getElementById('ticket-create-dialog');
const form = document.getElementById('ticket-create-form');
const status = document.getElementById('ticket-create-status');
const heading = document.getElementById('ticket-create-heading');
if (!dialog || !form) return;
const createKind = kind === 'issue' ? 'issue' : 'ticket';
form.dataset.createKind = createKind;
if (heading) {
heading.textContent = t(createKind === 'issue' ? 'issues.new' : 'tickets.new');
}
if (status) status.textContent = '';
form.reset();
if (typeof dialog.showModal === 'function') {
dialog.showModal();
}
}
function init() {
const dialog = document.getElementById('ticket-create-dialog');
const form = document.getElementById('ticket-create-form');
const cancelBtn = document.getElementById('ticket-create-cancel');
const closeBtn = document.getElementById('ticket-create-close');
const status = document.getElementById('ticket-create-status');
if (!dialog || !form) return;
document.querySelectorAll('.js-new-issue-btn').forEach((btn) => {
btn.addEventListener('click', (ev) => {
ev.preventDefault();
openDialog('issue');
});
});
document.querySelectorAll('.js-new-ticket-btn').forEach((btn) => {
btn.addEventListener('click', (ev) => {
ev.preventDefault();
openDialog('ticket');
});
});
function closeDialog() {
dialog.close();
}
if (cancelBtn) cancelBtn.addEventListener('click', closeDialog);
if (closeBtn) closeBtn.addEventListener('click', closeDialog);
dialog.addEventListener('click', (ev) => {
if (ev.target === dialog) closeDialog();
});
form.addEventListener('submit', (ev) => {
ev.preventDefault();
const titleEl = document.getElementById('ticket-create-title');
const briefEl = document.getElementById('ticket-create-brief');
const bodyEl = document.getElementById('ticket-create-body');
const kind = form.dataset.createKind === 'issue' ? 'issue' : 'ticket';
const meta = META[kind] || META.ticket;
const payload = {
title: titleEl && titleEl.value ? titleEl.value.trim() : '',
brief: briefEl && briefEl.value ? briefEl.value.trim() : '',
body: bodyEl && bodyEl.value ? bodyEl.value.trim() : '',
tags: [
meta,
{ id: 'open', label: 'open', bg: '#22c55e' },
],
};
if (!payload.title) return;
if (status) status.textContent = 'Creating…';
const xhr = new XMLHttpRequest();
xhr.open('POST', basePath() + '/api/ticket_create.php', true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.onload = function () {
let data = null;
try {
data = JSON.parse(xhr.responseText);
} catch {
if (status) status.textContent = 'Invalid response';
return;
}
if (!data || !data.ok) {
if (status) status.textContent = (data && data.error) || 'Create failed';
return;
}
dialog.close();
const view = document.body.getAttribute('data-view') || '';
if (view === 'tickets' && typeof window.__ticketsReload === 'function') {
window.__ticketsReload();
} else if (data.id) {
window.location.href = basePath() + '/?view=ticket&id=' + encodeURIComponent(String(data.id));
} else {
window.location.href = basePath() + '/?view=tickets';
}
};
xhr.onerror = function () {
if (status) status.textContent = 'Network error';
};
xhr.send(JSON.stringify(payload));
});
}
function onReady(fn) {
if (window.CrashI18n && window.CrashI18n.ready) {
window.CrashI18n.ready.then(fn);
} else {
fn();
}
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', () => onReady(init));
} else {
onReady(init);
}
})();