189 lines
5.8 KiB
JavaScript
189 lines
5.8 KiB
JavaScript
import {
|
|
apiDelete,
|
|
apiGet,
|
|
apiPost,
|
|
apiPut,
|
|
isAuthRedirectError,
|
|
} from '../api.js';
|
|
import { guard } from '../core/auth-guard.js';
|
|
import {
|
|
collectExtrasFromMachineForm,
|
|
extrasTableHtml,
|
|
} from '../core/machine-extras.js';
|
|
import { extrasName } from '../core/utils.js';
|
|
|
|
const UUID =
|
|
/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
|
|
const loadingEl = document.getElementById('page-loading');
|
|
const badIdEl = document.getElementById('machine-bad-id');
|
|
const errEl = document.getElementById('page-error');
|
|
const mainEl = document.getElementById('page-main');
|
|
const panelView = document.getElementById('panel-machine-view');
|
|
const formM = document.getElementById('form-m');
|
|
|
|
function showError(msg) {
|
|
loadingEl.hidden = true;
|
|
badIdEl.hidden = true;
|
|
mainEl.hidden = true;
|
|
errEl.hidden = false;
|
|
errEl.textContent = msg;
|
|
}
|
|
|
|
function fillView(m) {
|
|
document.getElementById('machine-title').textContent = m.name;
|
|
document.getElementById('m-typ').textContent = m.typ;
|
|
document.getElementById('m-serial').textContent = m.seriennummer;
|
|
document.getElementById('m-standort').textContent = m.standort;
|
|
const ort = extrasName(m);
|
|
const row = document.getElementById('m-extras-name-row');
|
|
if (ort) {
|
|
row.hidden = false;
|
|
document.getElementById('m-extras-name').textContent = ort;
|
|
} else {
|
|
row.hidden = true;
|
|
}
|
|
const tid = `/tickets.html?machineId=${encodeURIComponent(m.id)}`;
|
|
document.getElementById('m-link-tickets').href = tid;
|
|
document.getElementById('m-link-tickets-edit').href = tid;
|
|
document.getElementById('machine-extras-view').innerHTML = extrasTableHtml(m.extras);
|
|
}
|
|
|
|
function fillEdit(m) {
|
|
document.getElementById('input-m-name').value = m.name;
|
|
document.getElementById('input-m-typ').value = m.typ;
|
|
document.getElementById('input-m-serial').value = m.seriennummer;
|
|
document.getElementById('input-m-standort').value = m.standort;
|
|
document.getElementById('input-m-list-status').value = m.listStatus || '';
|
|
document.getElementById('machine-extras-edit').innerHTML = extrasTableHtml(m.extras, {
|
|
editable: true,
|
|
});
|
|
}
|
|
|
|
function showViewMode() {
|
|
panelView.hidden = false;
|
|
formM.hidden = true;
|
|
}
|
|
|
|
function showEditMode() {
|
|
panelView.hidden = true;
|
|
formM.hidden = false;
|
|
}
|
|
|
|
async function viewMachineDetail(id, options = {}) {
|
|
const { startInEditMode = false, canEdit = true } = options;
|
|
const m = await apiGet(`/machines/${id}`);
|
|
|
|
const btnEdit = document.getElementById('btn-m-edit');
|
|
const btnDup = document.getElementById('btn-m-dup');
|
|
const btnDel = document.getElementById('btn-m-del');
|
|
const btnDelEdit = document.getElementById('btn-m-del-edit');
|
|
if (!canEdit) {
|
|
btnEdit.hidden = true;
|
|
btnDup.hidden = true;
|
|
btnDel.hidden = true;
|
|
btnDelEdit.hidden = true;
|
|
document.getElementById('machine-extras-edit').innerHTML = '';
|
|
fillView(m);
|
|
showViewMode();
|
|
return;
|
|
}
|
|
|
|
fillView(m);
|
|
if (startInEditMode) {
|
|
fillEdit(m);
|
|
showEditMode();
|
|
} else {
|
|
document.getElementById('machine-extras-edit').innerHTML = '';
|
|
showViewMode();
|
|
}
|
|
|
|
document.getElementById('btn-m-del').onclick = async () => {
|
|
if (!confirm('Maschine wirklich löschen?')) return;
|
|
await apiDelete(`/machines/${id}`);
|
|
location.href = '/machines.html';
|
|
};
|
|
|
|
document.getElementById('btn-m-edit').onclick = () => {
|
|
fillEdit(m);
|
|
showEditMode();
|
|
};
|
|
|
|
document.getElementById('btn-m-dup').onclick = async () => {
|
|
const body = {
|
|
name: `${m.name} (Kopie)`,
|
|
typ: m.typ,
|
|
seriennummer: `${m.seriennummer} - Kopie`,
|
|
standort: m.standort,
|
|
listStatus: m.listStatus || '',
|
|
};
|
|
if (m.extras && typeof m.extras === 'object') {
|
|
body.extras = JSON.parse(JSON.stringify(m.extras));
|
|
}
|
|
try {
|
|
const created = await apiPost('/machines', body);
|
|
location.href = `/machine.html?id=${encodeURIComponent(created.id)}&edit=1`;
|
|
} catch (err) {
|
|
alert(err.message || 'Duplizieren fehlgeschlagen.');
|
|
}
|
|
};
|
|
|
|
formM.onsubmit = async (e) => {
|
|
e.preventDefault();
|
|
const body = {
|
|
name: formM.elements.name.value,
|
|
typ: formM.elements.typ.value,
|
|
seriennummer: formM.elements.seriennummer.value,
|
|
standort: formM.elements.standort.value,
|
|
listStatus: formM.elements.listStatus.value || '',
|
|
extras: collectExtrasFromMachineForm(formM, m),
|
|
};
|
|
await apiPut(`/machines/${id}`, body);
|
|
location.reload();
|
|
};
|
|
|
|
document.getElementById('m-cancel').onclick = () => {
|
|
fillView(m);
|
|
document.getElementById('machine-extras-edit').innerHTML = '';
|
|
showViewMode();
|
|
};
|
|
|
|
document.getElementById('btn-m-del-edit').onclick = async () => {
|
|
if (!confirm('Maschine wirklich löschen?')) return;
|
|
await apiDelete(`/machines/${id}`);
|
|
location.href = '/machines.html';
|
|
};
|
|
}
|
|
|
|
async function init() {
|
|
const st = await guard({ activeNav: 'machines' });
|
|
if (!st) return;
|
|
const canEdit = st.user?.canEditCrm === true;
|
|
|
|
const params = new URLSearchParams(location.search);
|
|
const id = params.get('id');
|
|
const startInEditMode = canEdit && params.get('edit') === '1';
|
|
if (!id || !UUID.test(id)) {
|
|
loadingEl.hidden = true;
|
|
badIdEl.hidden = false;
|
|
return;
|
|
}
|
|
|
|
loadingEl.hidden = true;
|
|
mainEl.hidden = false;
|
|
|
|
try {
|
|
await viewMachineDetail(id, { startInEditMode, canEdit });
|
|
if (!canEdit && params.get('edit') === '1') {
|
|
history.replaceState(null, '', `/machine.html?id=${encodeURIComponent(id)}`);
|
|
} else if (startInEditMode) {
|
|
history.replaceState(null, '', `/machine.html?id=${encodeURIComponent(id)}`);
|
|
}
|
|
} catch (e) {
|
|
if (isAuthRedirectError(e)) return;
|
|
showError(e.message || 'Fehler');
|
|
}
|
|
}
|
|
|
|
init();
|