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

883 lines
32 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.
*/
// SUBJECTS
// Show blank screen to add new Subject
function newSubjectShow() {
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_type").disabled = false;
document.getElementById("new_detailtype").disabled = false;
document.getElementById("new_classification").disabled = false;
document.getElementById("new_scopenote").disabled = false;
// Relationen-Bereich verstecken bei neuem Schlagwort
document.getElementById("new_relation_label").style.display = 'none';
document.getElementById("newRelationSubjectDismiss").style.display = 'none';
// Synonyme-Bereich verstecken bei neuem Schlagwort
var synSection = document.getElementById("synonyms_section");
if (synSection) {
synSection.style.display = 'none';
var tbody = document.getElementById("synonyms_body");
if (tbody) tbody.innerHTML = '';
}
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_classification").val("");
$("#new_scopenote").val("");
$("#NewSubjectModal").modal("show");
}
// Insert new subject record
function CreateNewEntry(type) {
// get values
var term = $("#new_term").val();
term = term.trim();
var type = $("#new_type").val();
type = type.trim();
var detailtype = $("#new_detailtype").val();
detailtype = detailtype.trim();
var classification = $("#new_classification").val();
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 Schlagwort eingeben!';
a.style.display = 'block';
return;
}
var a = document.getElementById("errorNewSubject");
a.classList.remove('alert-danger');
a.textContent = '';
a.style.display = 'none';
$.post("ajax/newSubject.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"];
// alert ("ANCHOR: " +AnchorID);
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_type").disabled = true;
document.getElementById("new_detailtype").disabled = true;
document.getElementById("new_classification").disabled = true;
document.getElementById("new_scopenote").disabled = true;
$table.bootstrapTable('refresh');
e.classList.remove('alert-danger');
e.classList.add('alert-success');
e.textContent = 'Neues Schlagwort 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 subect record
function showRelations(Anchor,Entry,Linking)
{
// alert ("showRelations AnchorID : " + Anchor);
$.get("ajax/getRelations.php", {
anchorID:Anchor,
authType: "Subject"
},
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 subject 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!');
// Relations neu laden nach kurzer Verzögerung
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");
// Fallback für alte API (nur ID zurück)
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);
// Loading nur ausblenden wenn kein Erfolg (Success zeigt eigene Meldung)
if (status !== 'success') {
hideLoading();
}
}
});
return false;
} catch (e) {
hideLoading();
console.error("💥 Exception:", e);
showError('<strong>JavaScript-Fehler:</strong><br>' + e.message);
return false;
}
}
// Neue Funktion für Synonyme
function CreateNewSynonym(text1, text2, anchorID, event) {
if (event) {
event.preventDefault();
event.stopPropagation();
}
console.log('🔗 CreateNewSynonym:', { text1, text2 });
try {
// Validierung
if (!text1 || !text2) {
showError('Fehlende Parameter: text1 oder text2');
return false;
}
if (text1.trim() === text2.trim()) {
showError('Ein Begriff kann nicht sein eigenes Synonym sein');
return false;
}
// Loading anzeigen
showLoading();
$.ajax({
url: "/Thesaurus/ajax/saveSynonym.php",
type: "POST",
data: {
text1: text1,
text2: text2,
action: 'add'
},
dataType: "json",
timeout: 10000,
success: function(response) {
console.log("✅ Synonym Success! Response:", response);
if (response.error) {
showError('<strong>Fehler:</strong><br>' + response.error);
return;
}
if (response.success === true) {
showSuccess('Synonym erfolgreich hinzugefügt!');
// Synonyme neu laden
var termText = $('#new_term').val();
if (termText) {
loadSynonyms(termText);
}
// Relations neu laden nach kurzer Verzögerung
if (typeof showRelations === 'function' && anchorID) {
setTimeout(function() {
showRelations(anchorID, 0, 0);
}, 500);
}
resetForm();
} else {
showError('Unerwartete Antwort vom Server');
}
},
error: function(xhr, status, error) {
console.error("❌ AJAX Error:", { status, error, xhr });
var errorMessage = '<strong>Fehler beim Speichern des Synonyms</strong><br><br>';
if (xhr.status === 0) {
errorMessage += '❌ Keine Verbindung zum Server möglich';
} else if (xhr.status === 404) {
errorMessage += '❌ Datei nicht gefunden (404)<br>';
errorMessage += '<small>ajax/saveSynonym.php existiert nicht</small>';
} else if (xhr.status === 500) {
errorMessage += '❌ Interner Serverfehler (500)';
} else {
errorMessage += '❌ ' + status + ' (' + xhr.status + ')';
}
showError(errorMessage);
},
complete: function() {
hideLoading();
}
});
return false;
} catch (e) {
hideLoading();
console.error("💥 Exception:", e);
showError('<strong>JavaScript-Fehler:</strong><br>' + e.message);
return false;
}
}
// Synonyme für einen Begriff laden
function loadSynonyms(text) {
if (!text) return;
console.log('📋 Lade Synonyme für:', text);
$.ajax({
url: "/Thesaurus/ajax/getSynonyms.php",
type: "GET",
data: { text: text },
dataType: "json",
success: function(response) {
console.log('✅ Synonyme geladen:', response);
var section = document.getElementById('synonyms_section');
var tbody = document.getElementById('synonyms_body');
var noSyn = document.getElementById('no_synonyms');
if (response.success && response.count > 0) {
// Synonyme vorhanden - Bereich anzeigen
if (section) section.style.display = 'block';
if (tbody) tbody.innerHTML = response.html;
if (noSyn) noSyn.style.display = 'none';
} else {
// Keine Synonyme - Bereich komplett ausblenden
if (section) section.style.display = 'none';
if (tbody) tbody.innerHTML = '';
}
},
error: function(xhr, status, error) {
console.error('❌ Fehler beim Laden der Synonyme:', error);
}
});
}
// Synonym löschen
function DeleteSynonym(text1, text2) {
if (!confirm('Möchten Sie das Synonym "' + text2 + '" wirklich entfernen?')) {
return;
}
console.log('🗑️ Lösche Synonym:', { text1, text2 });
$.ajax({
url: "/Thesaurus/ajax/saveSynonym.php",
type: "POST",
data: {
text1: text1,
text2: text2,
action: 'remove'
},
dataType: "json",
success: function(response) {
console.log('✅ Synonym gelöscht:', response);
if (response.success) {
showSuccess('Synonym entfernt!');
// Synonyme neu laden
loadSynonyms(text1);
} else {
showError(response.error || 'Fehler beim Löschen');
}
},
error: function(xhr, status, error) {
console.error('❌ Fehler beim Löschen:', error);
showError('Fehler beim Löschen des Synonyms');
}
});
}
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';
// Scroll zum Alert
errorElement.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
// Optional: Auto-Hide nach 8 Sekunden
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';
// Scroll zum Alert
errorElement.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
// Auto-Hide nach 3 Sekunden
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';
// Scroll zum Alert
errorElement.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
// Auto-Hide nach 5 Sekunden
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';
// Scroll zum Alert
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 = '';
}
// Data-Attribute zurücksetzen
$('#subject-anlegen').removeData('record-id');
$('#subject-anlegen').removeData('record-text');
$('#subject-anlegen').removeData('relation-id');
$('#subject-anlegen').removeData('relation-text');
hideAlert();
}
// Delete relation for a subjects
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 subject 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 subject and its relations
function ModifyTerm(AnchorID)
{
// Schlagwort-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_detailtype").disabled = false;
document.getElementById("new_classification").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';
// Synonyme-Bereich sichtbar machen
var synSection = document.getElementById("synonyms_section");
if (synSection) synSection.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("Schlagwort ändern");
$.get("/Thesaurus/ajax/getAuthorityDataRaw.php", {
id : AnchorID[0]
},
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_detailtype").val(dt.DetailType);
$("#new_classification").val(dt.Classification);
$("#new_descriptor").val(dt.Descriptor);
$("#new_type").val(dt.Type);
$("#new_scopenote").val(dt.Scopenote);
console.log('✅ Felder befüllt mit:', dt.Text);
// Synonyme laden
if (typeof loadSynonyms === 'function') {
loadSynonyms(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: "Subject"
},
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 subject 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 = $("#new_detailtype").val();
detailtype = detailtype.trim();
var classification = $("#new_classification").val();
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 Schlagwort 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: authType,
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 = ' Schlagwort geändert ';
e.style.display = 'block';
$("#NewSubjectModalHeadline").text("Schlagwort ändern");
$("#NewSubjectModal").modal("show");
}
}
);
$table.bootstrapTable('refresh')
}
function ShowModalDetails(id) {
$.get("/Thesaurus/ajax/getDetailAuthorityData.php", {
authType : 'Subject',
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_detailtype").val(row[0].Detailtype);
$("#display_classification").val(row[0].Classification);
$("#display_descriptor").val(row[0].Descriptor);
$("#display_type").val(row[0].Type);
$("#display_scopenote").val(row[0].Scopenote);
$("#display_synonyms").val(row[0].Synonyms || '');
// Alte tabellarische Darstellung (versteckt)
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') {
var synonyms = row[0].Synonyms || '';
// Falls keine Synonyme im Response, versuche sie separat zu laden
if (!synonyms || synonyms.trim() === '') {
console.log('📝 Keine Synonyme im Response, lade separat...');
$.ajax({
url: "/Thesaurus/ajax/getSynonyms.php",
type: "GET",
data: { text: row[0].Text },
dataType: "json",
async: false, // Synchron um auf Ergebnis zu warten
success: function(synResponse) {
if (synResponse.success && synResponse.synonyms && synResponse.synonyms.length > 0) {
synonyms = synResponse.synonyms.map(function(s) { return s.text; }).join(', ');
console.log('✅ Synonyme separat geladen:', synonyms);
// Auch das Textfeld aktualisieren
$("#display_synonyms").val(synonyms);
}
}
});
}
createSemanticNetwork(row[0].Text, row[0].ID, row[0].Relations, synonyms);
} else {
console.warn('⚠️ createSemanticNetwork Funktion nicht gefunden');
}
}, 300);
}
}
);
}
function CopyLink(value)
{
var tempInput = document.createElement("input");
tempInput.value = value;
document.body.appendChild(tempInput);
tempInput.select();
document.execCommand("copy");
document.body.removeChild(tempInput);
}
function refreshPage()
{
location.reload();
}