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

634 lines
23 KiB
JavaScript
Raw Permalink 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
*/
// CORPORATES
// Show blank screen to add new Corporate
function newCorporatesShow() {
var b = document.getElementById("newCorporateSave");
b.style.display='inline';
var c = document.getElementById("newCorporateDismiss");
c.style.display='inline';
document.getElementById("CorporateModifySave").style.display = 'none';
document.getElementById("new_term").disabled = false;
document.getElementById("new_type").disabled = false;
document.getElementById("new_scopenote").disabled = false;
// Relationen-Bereich verstecken bei neuer Körperschaft
document.getElementById("new_relation_label").style.display = 'none';
document.getElementById("newRelationCorporateDismiss").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("errorNewCorporate");
e.style.display = 'none';
$("#new_term").val("");
$("#new_scopenote").val("");
$("#NewCorporateModal").modal("show");
}
// Insert new corporate record
function CreateNewEntry(type) {
// get values
var term = $("#new_term").val();
term = term.trim();
var type = $("#new_type").val();
type = type.trim();
var detailtype = "";
var classification = "";
var scopenote = $("#new_scopenote").val();
scopenote = scopenote.trim();
if (term.length == 0) {
var a = document.getElementById("errorNewCorporate");
a.classList.add('alert-danger');
a.textContent = 'Bitte Körperschaft eingeben!';
a.style.display = 'block';
return;
}
var a = document.getElementById("errorNewCorporate");
a.classList.remove('alert-danger');
a.textContent = '';
a.style.display = 'none';
$.post("ajax/newCorporate.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("errorNewCorporate");
if (dt['status'] == 200)
{
var AnchorID = dt["Anchor"];
var EntryID = dt["Entry"];
var LinkingID = dt["Linking"];
var b = document.getElementById("newCorporateSave");
b.style.display='none';
var c = document.getElementById("newCorporateDismiss");
c.style.display='none';
document.getElementById("new_term").disabled = true;
document.getElementById("new_type").disabled = true;
document.getElementById("new_scopenote").disabled = true;
$table.bootstrapTable('refresh');
e.classList.remove('alert-danger');
e.classList.add('alert-success');
e.textContent = 'Neue Körperschaft 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("newRelationCorporateDismiss").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 corporate record
function showRelations(Anchor,Entry,Linking)
{
$.get("ajax/getRelations.php", {
anchorID:Anchor,
authType:"Corporate"
},
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';
}
}
$("#NewCorporateModal").modal("show");
}
}
);
}
// create new relation for a corporate 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("errorNewCorporate");
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("errorNewCorporate");
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("errorNewCorporate");
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("errorNewCorporate");
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("errorNewCorporate");
if (errorElement) {
errorElement.style.display = 'none';
}
}
function hideAlert() {
var errorElement = document.getElementById("errorNewCorporate");
if (errorElement) {
errorElement.style.display = 'none';
}
}
function fadeOutAlert() {
var errorElement = document.getElementById("errorNewCorporate");
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 = '';
}
$('#corporate-anlegen').removeData('record-id');
$('#corporate-anlegen').removeData('relation-id');
hideAlert();
}
// Delete relation for a corporate
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("errorNewCorporate");
e.classList.add('alert-success');
e.textContent = ' Relation gelöscht';
e.style.display = 'block';
showRelations(AnchorID,0,0)
}
}
);
}
// delete the whole corporate 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 corporate and its relations
function ModifyTerm(AnchorID)
{
// Name-Feld deaktivieren (darf nicht geändert werden)
document.getElementById("new_term").disabled = true;
// Andere Felder aktivieren
document.getElementById("new_type").disabled = false;
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("newCorporateSave").style.display = 'none';
document.getElementById("newCorporateDismiss").style.display = 'inline';
document.getElementById("CorporateModifySave").style.display = 'inline';
document.getElementById("newRelationCorporateDismiss").style.display = 'none';
// Alert verstecken
document.getElementById("errorNewCorporate").style.display = 'none';
$("#NewCorporateModalHeadline").text("Körperschaft ändern");
$.get("/Thesaurus/ajax/getAuthorityDataRaw.php", {
id : AnchorID[0],
authType :"Corporate"
},
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_type").val(dt.Type);
$("#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: "Corporate"
},
function (data, status) {
if (status=="success")
{
$(".new_modal_content").html(data);
$("#NewCorporateModal").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 corporate entry
function UpdateEntry(authType)
{
var AnchorID = $("#ID").val();
var term = $("#new_term").val();
term = term.trim();
var type = $("#new_type").val();
type = type.trim();
var detailtype = '';
var classification = '';
var scopenote = $("#new_scopenote").val();
scopenote = scopenote.trim();
if (term.length == 0) {
var a = document.getElementById("errorNewCorporate");
a.classList.add('alert-danger');
a.textContent = 'Bitte Körperschaft eingeben!';
a.style.display = 'block';
return;
}
var a = document.getElementById("errorNewCorporate");
a.classList.remove('alert-danger');
a.textContent = '';
a.style.display = 'none';
$.post("ajax/UpdateTerm.php", {
AnchorID: AnchorID,
authType: "Corporate",
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("newCorporateSave").style.display = 'none'
document.getElementById("newCorporateDismiss").style.display = 'inline'
document.getElementById("CorporateModifySave").style.display = 'none'
document.getElementById("newRelationCorporateDismiss").style.display = 'none'
var e = document.getElementById("errorNewCorporate");
e.classList.add('alert-success');
e.textContent = ' Körperschaft geändert ';
e.style.display = 'block';
$("#NewCorporateModalHeadline").text("Körperschaft ändern");
$("#NewCorporateModal").modal("show");
}
}
);
$table.bootstrapTable('refresh')
}
function ShowModalDetails(id) {
$.get("/Thesaurus/ajax/getDetailAuthorityData.php", {
authType : 'Corporate',
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);
}