Thesaurus/js/PersonScript.js
2026-02-23 16:11:35 +01:00

630 lines
22 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* Created by Roland on 2021/07/01.
* Updated for BIBB Layout 2024
*/
// PERSONS
// Show blank screen to add new Person
function newPersonShow() {
var b = document.getElementById("newSubjectSave");
b.style.display='inline';
var c = document.getElementById("newSubjectDismiss");
c.style.display='inline';
document.getElementById("SubjectModifySave").style.display = 'none';
document.getElementById("new_term").disabled = false;
document.getElementById("new_scopenote").disabled = false;
// Relationen-Bereich verstecken bei neuer Person
document.getElementById("new_relation_label").style.display = 'none';
document.getElementById("newRelationSubjectDismiss").style.display = 'none';
showRelations(0,0,0);
var a = document.getElementById("relation_table");
if (a != undefined) {
document.getElementById("relation_table").style.display = 'none';
}
var e = document.getElementById("errorNewSubject");
e.style.display = 'none';
$("#new_term").val("");
$("#new_scopenote").val("");
$("#NewSubjectModal").modal("show");
}
// Insert new person record
function CreateNewEntry(type) {
// get values
var term = $("#new_term").val();
term = term.trim();
var detailtype = '';
var classification = '';
var scopenote = $("#new_scopenote").val();
scopenote = scopenote.trim();
if (term.length == 0) {
var a = document.getElementById("errorNewSubject");
a.classList.add('alert-danger');
a.textContent = 'Bitte Name eingeben!';
a.style.display = 'block';
return;
}
var a = document.getElementById("errorNewSubject");
a.classList.remove('alert-danger');
a.textContent = '';
a.style.display = 'none';
$.post("ajax/newPerson.php", {
term : term,
type : type,
detailtype : detailtype,
classification: classification,
scopenote : scopenote
}, function (data, status) {
var dt = (typeof data === 'string') ? JSON.parse(data) : data;
var e = document.getElementById("errorNewSubject");
if (dt['status'] == 200)
{
var AnchorID = dt["Anchor"];
var EntryID = dt["Entry"];
var LinkingID = dt["Linking"];
var b = document.getElementById("newSubjectSave");
b.style.display='none';
var c = document.getElementById("newSubjectDismiss");
c.style.display='none';
document.getElementById("new_term").disabled = true;
document.getElementById("new_scopenote").disabled = true;
$table.bootstrapTable('refresh');
e.classList.remove('alert-danger');
e.classList.add('alert-success');
e.textContent = 'Neuen Namen aufgenommen';
e.style.display = 'block';
// ID setzen für Relationen
$('#ID').val(AnchorID);
// Relationen-Bereich anzeigen nach Speichern
document.getElementById("new_relation_label").style.display = 'block';
document.getElementById("newRelationSubjectDismiss").style.display = 'inline';
showRelations(AnchorID,EntryID,LinkingID);
} else {
e.classList.remove('alert-success');
e.classList.add('alert-danger');
e.textContent = dt['message'];
e.style.display = 'block';
return;
}
});
}
// Show relations of a person record
function showRelations(Anchor,Entry,Linking)
{
$.get("ajax/getRelations.php", {
anchorID:Anchor,
authType:"Person"
},
function (data, status) {
if (status=="success")
{
$(".new_modal_content").html(data);
// Tabelle nur anzeigen wenn Relationen vorhanden
var relationTable = document.getElementById("relation_table");
if (relationTable) {
if (data && data.trim().length > 0) {
relationTable.style.display = 'block';
} else {
relationTable.style.display = 'none';
}
}
$("#NewSubjectModal").modal("show");
}
}
);
}
// create new relation for a person record
function CreateNewRelation(AnchorID, relationID, event) {
if (event) {
event.preventDefault();
event.stopPropagation();
}
console.log('🚀 CreateNewRelation:', { AnchorID, relationID });
try {
// Validierung
if (!AnchorID || !relationID) {
showError('Fehlende Parameter: AnchorID oder relationID');
return false;
}
var relationTypeElement = document.getElementById("new_relationtype");
if (!relationTypeElement) {
showError('Relationstyp-Element nicht gefunden');
return false;
}
var relationType = relationTypeElement.value;
if (!relationType || relationType.trim() === '') {
showError('Bitte wählen Sie einen Relationstyp aus');
return false;
}
// Loading anzeigen
showLoading();
$.ajax({
url: "ajax/writeNewRelation.php",
type: "POST",
data: {
AnchorID: AnchorID,
relationType: relationType,
relationID: relationID
},
dataType: "text",
timeout: 10000,
success: function(response) {
console.log("✅ Success! Response:", response);
try {
var data = JSON.parse(response);
if (data.error) {
showError('<strong>Serverfehler:</strong><br>' + data.error);
return;
}
if (data.success === true) {
showSuccess('Neue Relation erfolgreich aufgenommen!');
if (typeof showRelations === 'function') {
setTimeout(function() {
showRelations(AnchorID, 0, 0);
}, 500);
}
resetForm();
} else {
showError('Unerwartete Antwort vom Server');
}
} catch (parseError) {
console.log("⚠️ Keine JSON-Antwort, prüfe Plain-Text");
if (response && response.length > 0 && !isNaN(response.trim())) {
showSuccess('Neue Relation erfolgreich aufgenommen! (ID: ' + response.trim() + ')');
if (typeof showRelations === 'function') {
setTimeout(function() {
showRelations(AnchorID, 0, 0);
}, 500);
}
resetForm();
} else {
showError('<strong>Unerwartete Antwort:</strong><br>' +
'<code>' + response.substring(0, 200) + '</code>');
}
}
},
error: function(xhr, status, error) {
console.error("❌ AJAX Error:", { status, error, xhr });
var errorMessage = '<strong>Fehler beim Speichern der Relation</strong><br><br>';
if (xhr.status === 0) {
errorMessage += '❌ Keine Verbindung zum Server möglich<br>';
errorMessage += '<small>Prüfen Sie Ihre Internetverbindung</small>';
} else if (xhr.status === 404) {
errorMessage += '❌ Datei nicht gefunden (404)<br>';
errorMessage += '<small>ajax/writeNewRelation.php existiert nicht</small>';
} else if (xhr.status === 500) {
errorMessage += '❌ Interner Serverfehler (500)<br>';
if (xhr.responseText) {
errorMessage += '<br><details><summary>Details anzeigen</summary><pre>' +
xhr.responseText.substring(0, 500) + '</pre></details>';
}
} else if (status === 'timeout') {
errorMessage += '❌ Zeitüberschreitung<br>';
errorMessage += '<small>Der Server hat nicht rechtzeitig geantwortet</small>';
} else if (status === 'parsererror') {
errorMessage += '❌ Fehler beim Verarbeiten der Server-Antwort<br>';
errorMessage += '<small>Die Server-Antwort war ungültig</small>';
} else {
errorMessage += '❌ ' + status + ' (' + xhr.status + ')';
if (error) {
errorMessage += '<br><small>' + error + '</small>';
}
}
showError(errorMessage);
},
complete: function(xhr, status) {
console.log("🏁 Request abgeschlossen:", status);
if (status !== 'success') {
hideLoading();
}
}
});
return false;
} catch (e) {
hideLoading();
console.error("💥 Exception:", e);
showError('<strong>JavaScript-Fehler:</strong><br>' + e.message);
return false;
}
}
function showError(message) {
var errorElement = document.getElementById("errorNewSubject");
if (errorElement) {
errorElement.className = 'alert alert-danger';
errorElement.innerHTML = '<i class="fas fa-exclamation-circle me-2"></i>' + message.replace(/\n/g, '<br>');
errorElement.style.display = 'block';
errorElement.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
setTimeout(function() {
fadeOutAlert();
}, 8000);
}
}
function showSuccess(message) {
var errorElement = document.getElementById("errorNewSubject");
if (errorElement) {
errorElement.className = 'alert alert-success';
errorElement.innerHTML = '<i class="fas fa-check-circle me-2"></i>' + message;
errorElement.style.display = 'block';
errorElement.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
setTimeout(function() {
fadeOutAlert();
}, 3000);
}
}
function showWarning(message) {
var errorElement = document.getElementById("errorNewSubject");
if (errorElement) {
errorElement.className = 'alert alert-warning';
errorElement.innerHTML = '<i class="fas fa-exclamation-triangle me-2"></i>' + message;
errorElement.style.display = 'block';
errorElement.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
setTimeout(function() {
fadeOutAlert();
}, 5000);
}
}
function showLoading() {
var errorElement = document.getElementById("errorNewSubject");
if (errorElement) {
errorElement.className = 'alert alert-info';
errorElement.innerHTML = '<div class="d-flex align-items-center"><div class="spinner-border spinner-border-sm me-3" role="status"><span class="visually-hidden">Laden...</span></div><div>Speichere Relation...</div></div>';
errorElement.style.display = 'block';
errorElement.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
}
}
function hideLoading() {
var errorElement = document.getElementById("errorNewSubject");
if (errorElement) {
errorElement.style.display = 'none';
}
}
function hideAlert() {
var errorElement = document.getElementById("errorNewSubject");
if (errorElement) {
errorElement.style.display = 'none';
}
}
function fadeOutAlert() {
var errorElement = document.getElementById("errorNewSubject");
if (errorElement && errorElement.style.display !== 'none') {
$(errorElement).fadeOut(500, function() {
errorElement.style.display = 'none';
});
}
}
function resetForm() {
var relationTextElement = document.getElementById("search_relation");
if (relationTextElement) {
relationTextElement.value = '';
}
$('#subject-anlegen').removeData('record-id');
$('#subject-anlegen').removeData('relation-id');
hideAlert();
}
// Delete relation for a person
function DeleteRelation(AnchorID, LinkingID)
{
if (!confirm('Möchten Sie diese Relation wirklich löschen?')) {
return;
}
$.post("ajax/deleteRelation.php", {
AnchorID : AnchorID,
LinkingID : LinkingID
},
function (data, status) {
if (status=="success")
{
var e = document.getElementById("errorNewSubject");
e.classList.add('alert-success');
e.textContent = ' Relation gelöscht';
e.style.display = 'block';
showRelations(AnchorID,0,0)
}
}
);
}
// delete the whole person entry
function DeleteTerm(AnchorID)
{
if (!confirm('Möchten Sie diesen Eintrag wirklich löschen?')) {
return;
}
$.post("ajax/deleteTerm.php", {
AnchorID: AnchorID[0]
},
function (data, status) {
var metadata = (typeof data === 'string') ? JSON.parse(data) : data;
if (status === "success" && metadata.success === true) {
// Tabelle neu laden Zeile ist serverseitig wirklich gelöscht
$table.bootstrapTable('refresh');
} else {
// Serverseitiger Fehler: Zeile wieder einblenden und Meldung anzeigen
$table.bootstrapTable('refresh');
alert('Fehler beim Löschen: ' + (metadata.error || 'Unbekannter Fehler'));
}
}
);
}
// Modify person and its relations
function ModifyPerson(AnchorID)
{
// Name-Feld deaktivieren (darf nicht geändert werden)
document.getElementById("new_term").disabled = true;
// Andere Felder aktivieren
document.getElementById("new_scopenote").disabled = false;
$("#ID").val(AnchorID[0]);
// Relationen-Bereich sofort sichtbar machen bei Bearbeitung!
document.getElementById("new_relation_label").style.display = 'block';
document.getElementById("relation_table").style.display = 'block';
// Buttons konfigurieren
document.getElementById("newSubjectSave").style.display = 'none';
document.getElementById("newSubjectDismiss").style.display = 'inline';
document.getElementById("SubjectModifySave").style.display = 'inline';
document.getElementById("newRelationSubjectDismiss").style.display = 'none';
// Alert verstecken
document.getElementById("errorNewSubject").style.display = 'none';
$("#NewSubjectModalHeadline").text("Person ändern");
$.get("/Thesaurus/ajax/getAuthorityDataRaw.php", {
id : AnchorID[0],
authType :"Person"
},
function (data, status) {
console.log('📥 getAuthorityDataRaw status:', status);
console.log('📥 getAuthorityDataRaw data:', data);
if (status == "success")
{
var metadata = (typeof data === 'string') ? JSON.parse(data) : data;
console.log('📥 metadata:', metadata);
dt = (metadata['rows'][0]);
console.log('📥 dt:', dt);
if (dt) {
$("#new_term").val(dt.Text);
$("#new_id").val(dt.ID);
$("#new_descriptor").val(dt.Descriptor);
$("#new_scopenote").val(dt.Scopenote);
console.log('✅ Felder befüllt mit:', dt.Text);
} else {
console.error('❌ Keine Daten in rows[0]');
}
}
}
).fail(function(xhr, status, error) {
console.error('❌ AJAX Fehler:', status, error);
});
$.get("ajax/getRelations.php", {
anchorID:AnchorID[0],
authType: "Person"
},
function (data, status) {
if (status=="success")
{
$(".new_modal_content").html(data);
$("#NewSubjectModal").modal("show");
// Autocomplete neu initialisieren nach Modal-Öffnung
setTimeout(function() {
if (typeof searchRelation === 'function') {
console.log('🔄 Autocomplete wird neu initialisiert...');
searchRelation();
}
}, 300);
}
}
);
}
// rewrite records after updating a person entry
function UpdateEntry(authType)
{
var AnchorID = $("#ID").val();
var term = $("#new_term").val();
term = term.trim();
var type = 'Person';
type = type.trim();
var detailtype = '';
detailtype = detailtype.trim();
var classification = ''
classification = classification.trim();
var scopenote = $("#new_scopenote").val();
scopenote = scopenote.trim();
if (term.length == 0) {
var a = document.getElementById("errorNewSubject");
a.classList.add('alert-danger');
a.textContent = 'Bitte Name eingeben!';
a.style.display = 'block';
return;
}
var a = document.getElementById("errorNewSubject");
a.classList.remove('alert-danger');
a.textContent = '';
a.style.display = 'none';
$.post("ajax/UpdateTerm.php", {
AnchorID: AnchorID,
authType: "Person",
term: term,
type: type,
detailtype: detailtype,
classification: classification,
scopenote: scopenote
},
function (data, status) {
if (status=="success")
{
document.getElementById("relation_table").style.display = 'block'
document.getElementById("newSubjectSave").style.display = 'none'
document.getElementById("newSubjectDismiss").style.display = 'inline'
document.getElementById("SubjectModifySave").style.display = 'none'
document.getElementById("newRelationSubjectDismiss").style.display = 'none'
var e = document.getElementById("errorNewSubject");
e.classList.add('alert-success');
e.textContent = ' Personenname geändert ';
e.style.display = 'block';
$("#NewSubjectModalHeadline").text("Name ändern");
$("#NewSubjectModal").modal("show");
}
}
);
$table.bootstrapTable('refresh')
}
function ShowModalDetails(id) {
$.get("/Thesaurus/ajax/getDetailAuthorityData.php", {
authType : 'Person',
offset : 0,
id : id,
sort : 'Anchor.Text',
limit : 1
},
function(data, status) {
if (status == "success") {
var metadata = (typeof data === 'string') ? JSON.parse(data) : data;
var row = metadata['rows'];
if (!row || row.length === 0) {
console.error('❌ Keine Daten gefunden für ID:', id);
return;
}
//Assign existing values to the modal popup fields
$("#display_term").val(row[0].Text);
$("#display_id").val(row[0].ID);
$("#display_id_show").val(row[0].ID);
$("#display_descriptor").val(row[0].Descriptor);
$("#display_type").val(row[0].Type);
$("#display_scopenote").val(row[0].Scopenote);
var html = []
var txt = ''
$.each(row[0].Relations, function (key, value) {
txt = txt +'<div class="col-sm-12">';
txt = txt +'<div class="col-sm-2"></div>';
txt = txt + '<div class="col-sm-3"><input type="text" class="form-control" disabled id="display_relationtype_' +key +'" /></div>';
txt = txt + '<div class="col-sm-5"><input type="text" class="form-control" disabled id="display_textrelation_' +key +'" /></div>';
txt = txt + '<div class="col-sm-2"><input type="text" class="form-control" disabled id="display_IDRelation_' +key +'" /></div>';
txt = txt +'</div>';
})
$(".modal_content").html(txt);
$.each(row[0].Relations, function (key, value) {
$("#display_relationtype_" +key).val(value['Relationtype']);
$("#display_textrelation_" +key).val(value['TextRelation']);
$("#display_IDRelation_" +key).val(value['IDRelation']);
})
$("#display_relations").val(txt);
// Modal anzeigen
$("#DetailsModal").modal("show");
// Semantisches Netz erstellen (nach Modal sichtbar)
setTimeout(function() {
if (typeof createSemanticNetwork === 'function') {
createSemanticNetwork(row[0].Text, row[0].ID, row[0].Relations);
}
}, 300);
}
}
);
}
function refreshPage()
{
location.reload();
}
function CopyLink(value)
{
var tempInput = document.createElement("input");
tempInput.value = value;
document.body.appendChild(tempInput);
tempInput.select();
document.execCommand("copy");
document.body.removeChild(tempInput);
}