Thesaurus: Aktuelle Aenderungen nach Fehlerkorrektur einspielen

This commit is contained in:
root 2026-03-04 09:55:50 +01:00
parent 53a0522417
commit cafae05d0d
21 changed files with 1048 additions and 125 deletions

14
.gitignore vendored
View File

@ -1,14 +0,0 @@
# Datenbankverbindung (enthält Passwörter)
ajax/db_connection.php
# Logdateien
*.log
# Backup-Dateien
*.bak
# Datenbankdumps
*.sql
# Versionierte Backup-Dateien
*.20*

View File

@ -1,22 +0,0 @@
# Thesaurus
Webbasierte Thesaurus-Verwaltung für Schlagwörter, Personen, Körperschaften, Verlage und Klassifikationen.
## Voraussetzungen
- PHP 7.4 oder höher
- MySQL/MariaDB
- Apache Webserver
## Installation
1. Repository klonen
2. `ajax/db_connection.php.example` kopieren und umbenennen:
```bash
cp ajax/db_connection.php.example ajax/db_connection.php
```
3. Zugangsdaten in `ajax/db_connection.php` eintragen
4. Abhängigkeiten installieren:
```bash
bash setup-libs.sh
```

90
Statistics.php Normal file
View File

@ -0,0 +1,90 @@
<?php
include "templates/Header.html";
?>
<script type="text/javascript" src="js/script.js"></script>
<!-- Spracheinstellung für Bootstrap Table -->
<input type="hidden" id="locale" value="de-DE">
<!-- Globale Variablen -->
<input type="hidden" id="ID" value="" />
<input type="hidden" id="authType" value="Subject" />
<?php include "templates/Menu.html"; ?>
<div class="container-fluid mt-3">
<div class="row justify-content-center">
<div class="col-md-10">
<!-- Fehlermeldung -->
<div class="alert d-none" id="errorStatistics" role="alert"></div>
<!-- Formular -->
<div class="card mb-4">
<div class="card-header">
<h5 class="mb-0">Normdaten Statistik</h5>
</div>
<div class="card-body">
<form id="statisticsForm">
<div class="row mb-3">
<label for="startPeriod" class="col-sm-2 col-form-label">Starttermin</label>
<div class="col-sm-3">
<input type="date" class="form-control" id="startPeriod">
</div>
</div>
<div class="row mb-3">
<label for="endPeriod" class="col-sm-2 col-form-label">Endtermin</label>
<div class="col-sm-3">
<input type="date" class="form-control" id="endPeriod">
</div>
</div>
<div class="row">
<div class="col-sm-3 offset-sm-2">
<button type="button" class="btn btn-primary" onclick="generateStatistics()">
<i class="bi bi-bar-chart-fill me-1"></i>Statistik erstellen
</button>
</div>
</div>
</form>
</div>
</div>
<!-- Ergebnisbereich: Tabellengerüst fest im DOM, nur tbody/tfoot werden befüllt -->
<div id="records_content" style="display:none">
<div class="card border-0 shadow-sm">
<div class="card-header border-0 py-2 px-3" style="background-color:#1a3a5c">
<span class="text-white fw-semibold">Statistik Normdatenbearbeitung</span>
<span id="statisticsZeitraum" class="text-white opacity-75 small ms-3"></span>
</div>
<div class="card-body p-0">
<table class="table table-hover table-striped mb-0">
<thead>
<tr style="border-top:2px solid #fff">
<th class="text-white text-center py-2" style="width:60px;background-color:#1a3a5c">#</th>
<th class="text-white py-2" style="background-color:#1a3a5c">Normdatei</th>
<th class="text-white text-end pe-4 py-2" style="width:180px;background-color:#1a3a5c">Aufnahmen</th>
<th class="text-white text-end pe-4 py-2" style="width:180px;background-color:#1a3a5c">Korrekturen</th>
</tr>
</thead>
<tbody id="statisticsBody"></tbody>
<tfoot id="statisticsFoot"></tfoot>
</table>
</div>
</div>
<div class="mt-3 mb-2 text-end">
<button class="btn btn-sm px-3"
style="background-color:#1a3a5c;color:#fff;border:none"
onmouseover="this.style.backgroundColor='#15304d'"
onmouseout="this.style.backgroundColor='#1a3a5c'"
onclick="RecordContentHide()">
<i class="bi bi-x-circle me-1"></i>Schließen
</button>
</div>
</div>
</div>
</div>
</div>
</body>
</html>

152
TSData.sql Normal file
View File

@ -0,0 +1,152 @@
/*M!999999\- enable the sandbox mode */
-- MariaDB dump 10.19 Distrib 10.5.29-MariaDB, for debian-linux-gnu (x86_64)
--
-- Host: localhost Database: TSData
-- ------------------------------------------------------
-- Server version 10.5.29-MariaDB-0+deb11u1
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `Anchor`
--
DROP TABLE IF EXISTS `Anchor`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8mb4 */;
CREATE TABLE `Anchor` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Text` varchar(255) NOT NULL,
`DetailType` varchar(64) NOT NULL,
`Type` varchar(32) DEFAULT NULL,
`Classification` varchar(255) DEFAULT NULL,
`Formprinted` varchar(255) DEFAULT NULL,
`Place` varchar(255) DEFAULT NULL,
PRIMARY KEY (`ID`),
KEY `Type` (`DetailType`),
KEY `Text` (`Text`)
) ENGINE=InnoDB AUTO_INCREMENT=101001 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `Entry`
--
DROP TABLE IF EXISTS `Entry`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8mb4 */;
CREATE TABLE `Entry` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Text` varchar(255) NOT NULL,
`Comment` text DEFAULT NULL,
`Language` varchar(3) NOT NULL DEFAULT 'de',
`CompleteText` text DEFAULT NULL,
`DateCreated` timestamp NOT NULL DEFAULT current_timestamp(),
`DateModified` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
PRIMARY KEY (`ID`),
KEY `Text` (`Text`)
) ENGINE=InnoDB AUTO_INCREMENT=101001 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `EntryNew`
--
DROP TABLE IF EXISTS `EntryNew`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8mb4 */;
CREATE TABLE `EntryNew` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Text` varchar(255) NOT NULL,
`Comment` text DEFAULT NULL,
`Language` varchar(3) NOT NULL DEFAULT 'de',
`CompleteText` text DEFAULT NULL,
PRIMARY KEY (`ID`),
KEY `Text` (`Text`)
) ENGINE=InnoDB AUTO_INCREMENT=9919 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `IDSynonym`
--
DROP TABLE IF EXISTS `IDSynonym`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8mb4 */;
CREATE TABLE `IDSynonym` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1131 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `Linking`
--
DROP TABLE IF EXISTS `Linking`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8mb4 */;
CREATE TABLE `Linking` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`IDAnchor` int(11) NOT NULL,
`IDEntry` int(11) NOT NULL,
`Relationtype` varchar(32) NOT NULL,
PRIMARY KEY (`ID`),
KEY `IDConcept` (`IDAnchor`),
KEY `IDRelated` (`IDEntry`),
KEY `Relationtype` (`Relationtype`)
) ENGINE=InnoDB AUTO_INCREMENT=30474 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `Synonyms`
--
DROP TABLE IF EXISTS `Synonyms`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8mb4 */;
CREATE TABLE `Synonyms` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`IDLinking` int(11) DEFAULT NULL,
`Text` varchar(255) NOT NULL,
`Descriptor` varchar(255) DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=2875 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `Treeview`
--
DROP TABLE IF EXISTS `Treeview`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8mb4 */;
CREATE TABLE `Treeview` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(200) NOT NULL,
`text` varchar(200) NOT NULL,
`link` varchar(200) NOT NULL,
`parent_id` varchar(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=98579 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2026-02-20 7:34:40

0
ajax/TSData.sql Normal file
View File

View File

@ -1,15 +1,18 @@
<?php
/**
* Datenbankverbindung für BIBB Thesaurus
* Kopiere diese Datei als db_connection.php und trage deine Zugangsdaten ein.
*/
// Datenbankverbindungskonstanten
define('HOST', 'localhost');
define('USER', 'DEIN_DATENBANKBENUTZER');
define('PASSWORD', 'DEIN_PASSWORT');
define('USER', 'root');
define('PASSWORD', 'Ala%40Din');
define('DATABASE', 'TSData');
define('CHARSET', 'utf8');
/**
* Singleton PDO-Verbindung für CRUD-Klasse
*/
function DB()
{
static $instance;

0
ajax/error.log Normal file
View File

View File

@ -44,6 +44,10 @@ if (!in_array($authType, $allowedTypes)) {
$authType = 'Subject';
}
if ($authType === 'Classification' && !empty($search) && substr($search, 0, 1) !== '*') {
$search = '*' . $search;
}
// Basis-SQL
$baseSql = "FROM Anchor a
LEFT JOIN Entry e ON a.ID = e.ID

56
ajax/getStatistics.php Normal file
View File

@ -0,0 +1,56 @@
<?php
$dateStart = isset($_GET['dateStart']) ? $_GET['dateStart'] : "2022-01-01 00:00:00";
$dateEnd = isset($_GET['dateEnd']) ? $_GET['dateEnd'] : "2022-02-28 23:59:59";
include "db_connection.php";
require_once "libAuthorities.php";
$object = new CRUD();
$Results = $object->getStatistics($dateStart, $dateEnd);
$typeLabels = [
'Subject' => 'Schlagworte',
'Person' => 'Personennamen',
'Corporate' => 'Körperschaften',
'Publisher' => 'Verlage',
'Classification' => 'Klassifikationen',
];
$sumCreated = 0;
$sumModified = 0;
$rows = '';
$rank = 1;
foreach ($Results as $type => $result) {
$sumCreated += $result['DateCreated'];
$sumModified += $result['DateModified'];
$label = $typeLabels[$type] ?? $type;
$created = number_format($result['DateCreated'], 0, ',', '.');
$modified = number_format($result['DateModified'], 0, ',', '.');
$rows .= "<tr>"
. "<td class='text-center' style='width:60px;color:#1a3a5c;font-weight:600'>{$rank}</td>"
. "<td>{$label}</td>"
. "<td class='text-end pe-4' style='width:180px'>{$created}</td>"
. "<td class='text-end pe-4' style='width:180px'>{$modified}</td>"
. "</tr>";
$rank++;
}
$totalCreated = number_format($sumCreated, 0, ',', '.');
$totalModified = number_format($sumModified, 0, ',', '.');
$foot = "<tr style='background-color:#e8eef4;font-weight:700;color:#1a3a5c'>"
. "<td colspan='2' class='ps-3'>Summen</td>"
. "<td class='text-end pe-4'>{$totalCreated}</td>"
. "<td class='text-end pe-4'>{$totalModified}</td>"
. "</tr>";
$von = date('d.m.Y', strtotime($dateStart));
$bis = date('d.m.Y', strtotime($dateEnd));
echo json_encode([
"status" => 200,
"rows" => $rows,
"foot" => $foot,
"zeitraum" => "Zeitraum: {$von} {$bis}"
]);

View File

@ -135,8 +135,8 @@ class CRUD
JOIN Entry ON (Anchor.ID = Entry.ID)
WHERE Type = :authType";
if (strlen($search) > 0 && $sharp == false) {
$query .= " AND LOWER(Entry.CompleteText) LIKE LOWER(:search)";
if (strlen($search) > 0 && $sharp == false) {
//$query .= " AND LOWER(Entry.CompleteText) LIKE LOWER(:search)";
$params[':search'] = $this->buildSearchPattern($search);
}
if (strlen($search) > 0 && $sharp == true) {
@ -211,7 +211,7 @@ class CRUD
WHERE Type = :authType";
if (strlen($search) > 0) {
$query .= " AND LOWER(Entry.CompleteText) LIKE LOWER(:search)";
//$query .= " AND LOWER(Entry.CompleteText) LIKE LOWER(:search)";
$params[':search'] = $this->buildSearchPattern($search);
}
if ($id > 0) {

View File

@ -0,0 +1,362 @@
<?php
class CRUD
{
protected $db;
function __construct()
{
$this->db = DB();
}
function __destruct()
{
$this->db = null;
}
public function readAuthorityNumbersOfRecords($authType, $search, $id, $sharp)
{
$query = "SELECT COUNT(*) as count, Anchor.ID FROM Anchor ";
$query .= "JOIN Entry ON (Anchor.ID = Entry.ID) WHERE Type = '" .$authType ."' ";
if (strlen ($search) > 0 && $sharp == false) $query .= " AND LOWER(Entry.CompleteText) LIKE LOWER('" .$search ."%') ";
if (strlen ($search) > 0 && $sharp == true) $query .= " AND LOWER(Entry.Text) = LOWER('" .$search ."') ";
if ($id > 0)
$query .= "AND Entry.ID = " .$id;
// echo $query ."\n";
$query = $this->db->prepare($query);
$query->execute();
$num = 0;
while($rec = ($query->fetch(PDO::FETCH_ASSOC))) {
// print_r($rec);
$num = $rec['count'] ;
}
return $num;
}
public function readAuthorityEntriesByID($authType, $id)
{
$query = "SELECT Anchor.ID AS ID, Anchor.DetailType AS DetailType, Anchor.Type AS Type, Anchor.Classification AS Classification, Entry.Text as Text, Entry.Comment as Scopenote from Anchor ";
$query .= "JOIN Entry ON (Anchor.ID = Entry.ID) WHERE Anchor.ID = $id AND Type = '" .$authType ."' ";
// echo $query ."\n"; exit;
$query = $this->db->prepare($query);
$query->execute();
$count = $query->rowCount();
$ret = array();
while($rec = ($query->fetch(PDO::FETCH_ASSOC))) {
// print_r($rec);
$relations = $this->getRelations($authType,$rec['ID']);
$ret[] = array("ID" => $rec['ID'], "Descriptor" => $relations['Descriptor'], "Text" => $rec['Text'], "DetailType" => $rec['DetailType'], "Type" => $rec['Type'], "Scopenote" => $rec['Scopenote'], "Relations" => $relations['Data'], "Classification" => $rec['Classification']) ;
}
return (array("COUNT" => $count, "RECORDS" => $ret));
}
public function readAuthorityEntries($authType, $offset, $search, $id, $sort, $max)
{
$limit = " limit " .$offset ."," .$max ;
$sort = " order by " .$sort;
$query = "SELECT Anchor.ID AS ID, Anchor.DetailType AS DetailType, Anchor.Type AS Type, Anchor.Classification AS Classification, Entry.Text as Text, Entry.Comment as Scopenote from Anchor ";
$query .= "JOIN Entry ON (Anchor.ID = Entry.ID) WHERE Type = '" .$authType ."' ";
if (strlen ($search) > 0)
$query .= "AND LOWER(Entry.CompleteText) LIKE LOWER('" .$search ."%') ";
if ($id > 0)
$query .= "AND Entry.ID = " .$id;
$query .= $sort .$limit;
// echo $query ."\n"; exit;
$query = $this->db->prepare($query);
//$query->bindParam("authType", $authType, PDO::PARAM_STR);
$query->execute();
$count = $query->rowCount();
$ret = array();
while($rec = ($query->fetch(PDO::FETCH_ASSOC))) {
// print_r($rec);
$relations = $this->getRelations($authType, $rec['ID']);
if (strcmp($authType,'Subject') == 0) {
$synonyms = $this->getSynonyms($rec['Text']);
// print_r($synonyms);
$ret[] = array("ID" => $rec['ID'], "Descriptor" => $relations['Descriptor'], "Text" => $rec['Text'], "DetailType" => $rec['DetailType'], "Type" => $rec['Type'], "Scopenote" => $rec['Scopenote'], "Relations" => $relations['Data'], "Classification" => $rec['Classification'], "Synonyms" => $synonyms['Synonyms'], "Search" => $synonyms['Search']) ;
} else {
$ret[] = array("ID" => $rec['ID'], "Descriptor" => $relations['Descriptor'], "Text" => $rec['Text'], "DetailType" => $rec['DetailType'], "Type" => $rec['Type'], "Scopenote" => $rec['Scopenote'], "Relations" => $relations['Data'], "Classification" => $rec['Classification']) ;
}
}
return (array("COUNT" => $count, "RECORDS" => $ret));
}
public function getRelations($authType,$id)
{
// $query = "SELECT Linking.ID as LinkingID, IDEntry, Entry.Text, Entry.Comment, Relationtype, DetailType FROM Linking JOIN Entry ON (Linking.IDEntry = Entry.ID) WHERE IDAnchor=" .$id ." AND Relationtype != '' order by Relationtype";
$query = "SELECT Linking.ID as LinkingID, IDEntry, Entry.Text, Entry.Comment, Relationtype, DetailType FROM Linking JOIN Entry ON (Linking.IDEntry = Entry.ID) join Anchor on (IDAnchor = Anchor.ID) WHERE IDAnchor=" .$id ." AND Anchor.Type='" .$authType ."' AND Relationtype != '' order by Relationtype";
$query = $this->db->prepare($query);
$query->execute();
$descriptor = true;
$ret = array();
while($rec = ($query->fetch(PDO::FETCH_ASSOC))) {
// print_r($rec);
if (strcmp(strtolower($rec['Relationtype']), "use") == 0) $descriptor = false;
$ret[] = array("IDLinking" => $rec['LinkingID'], "IDEntry" => $rec['IDEntry'], "IDRelation" => $rec['IDEntry'], "Detailtype" => $rec['DetailType'], "TextRelation" => $rec['Text'], "CommentRelation" => $rec['Comment'], "Relationtype" => $rec['Relationtype']);
}
return array("Descriptor" => $descriptor, "Data" => $ret) ;
}
public function getSynonyms($input)
{
$desc = $this->prepare_desc($input);
$query = "SELECT IDLinking from Synonyms where Descriptor = '" .$desc ."'";
$query = $this->db->prepare($query);
$query->execute();
$ret = '' ;
$retsearch = "topic:'" .$input ."' OR ";
while($rec = ($query->fetch(PDO::FETCH_ASSOC))) {
// print_r($rec);
$idSearch = $rec['IDLinking'] ;
$query = "SELECT Text from Synonyms where IDLinking = " .$idSearch ;
$query = $this->db->prepare($query);
$query->execute();
while($rec = ($query->fetch(PDO::FETCH_ASSOC))) {
if (strcmp($rec['Text'], $input) == 0) continue;
$ret .= $rec['Text'] .", " ;
$retsearch .= "topic:'" .$rec['Text'] ."'" ." OR ";
}
}
if(strlen($ret) == 0) {
return array("Synonyms" => '', "Search" => '');
} else {
$synonyms = trim(substr($ret, 0, strlen($ret) - strlen(", ")));
$search = trim(substr($retsearch, 0, strlen($retsearch) - strlen(" OR ")));
return (array("Synonyms" => $synonyms, "Search" => $search)) ;
}
}
public function getEntryText($authType,$Request)
{
$query = "SELECT Anchor.ID AS AnchorID, Entry.Text as Text FROM Anchor JOIN Entry on (Anchor.ID = Entry.ID) WHERE Anchor.Text LIKE LOWER('%" .$Request ."%') AND Anchor.Type='" .$authType ."' order by Entry.Text";
$query = $this->db->prepare($query);
$query->execute();
$ret = array();
while($rec = ($query->fetch(PDO::FETCH_ASSOC))) {
// print_r($rec);
$ret[] = array("Text" => $rec['Text'], "ID" => $rec['AnchorID']);
}
return($ret);
}
public function insertNewTerm($authType, $term, $desc, $detailtype, $classification, $scopenote, $completetext)
{
$query = $this->db->prepare("INSERT INTO Anchor(ID, Text, DetailType, Type, Classification) VALUES (:ID, :Text, :DetailType, :Type, :Classification)");
$id = NULL;
$query->bindParam("ID", $id, PDO::PARAM_INT);
$query->bindParam("Text", $desc, PDO::PARAM_STR);
$query->bindParam("DetailType", $detailtype, PDO::PARAM_STR);
$query->bindParam("Type", $authType, PDO::PARAM_STR);
$query->bindParam("Classification", $classification, PDO::PARAM_STR);
$query->execute();
$IDAnchor = $this->db->lastInsertId();
$query = $this->db->prepare("INSERT INTO Entry(ID, Text, Comment, Language, CompleteText, DateCreated, DateModified) VALUES (:ID, :Text, :Comment, :Language, :CompleteText, :DateCreated,:DateModified)");
$id = NULL;
$language = "de";
$query->bindParam("ID", $id, PDO::PARAM_INT);
$query->bindParam("Text", $term, PDO::PARAM_STR);
$query->bindParam("Comment", $scopenote, PDO::PARAM_STR);
$query->bindParam("Language", $language, PDO::PARAM_STR);
$query->bindParam("CompleteText", $completetext, PDO::PARAM_STR);
$date = date('Y-m-d H:i:s');
$query->bindParam("DateCreated", $date, PDO::PARAM_STR);
$date = '0000-00-00 00:00:00' ;
$query->bindParam("DateModified",$date, PDO::PARAM_STR);
$query->execute();
$IDEntry = $this->db->lastInsertId();
$query = $this->db->prepare("INSERT INTO Linking(ID, IDAnchor, IDEntry, Relationtype) VALUES (:ID, :IDAnchor, :IDEntry, :Relationtype)");
$id = NULL;
$relationtype = "";
$query->bindParam("ID", $id, PDO::PARAM_INT);
$query->bindParam("IDAnchor", $IDAnchor, PDO::PARAM_INT);
$query->bindParam("IDEntry", $IDEntry, PDO::PARAM_INT);
$query->bindParam("Relationtype", $relationtype, PDO::PARAM_STR);
$query->execute();
$IDLinking = $this->db->lastInsertId();
return(array("IDAnchor" => $IDAnchor, "IDEntry" => $IDEntry, "IDLinking" => $IDLinking));
}
public function writeNewRelation($anchorID, $relationType, $relationID)
{
$query = $this->db->prepare("INSERT INTO Linking (ID, IDAnchor, IDEntry, Relationtype) VALUES (:ID, :IDAnchor, :IDEntry, :Relationtype)");
$id = NULL;
$query->bindParam("ID", $id, PDO::PARAM_INT);
$query->bindParam("IDAnchor", $anchorID, PDO::PARAM_STR);
$query->bindParam("IDEntry", $relationID, PDO::PARAM_STR);
$query->bindParam("Relationtype", $relationType, PDO::PARAM_STR);
$query->execute();
$IDLinking = $this->db->lastInsertId();
return ($IDLinking);
}
public function deleteRelation($AnchorID, $LinkingID)
{
// $query = "DELETE FROM Linking where ID = " .$LinkingID;
// echo $query ."\n";
$query = $this->db->prepare("DELETE FROM Linking where ID = " .$LinkingID);
// $query->bindParam("ID", $LinkingID, PDO::PARAM_INT);
$query->execute();
return ($LinkingID);
}
public function deleteTerm($AnchorID)
{
$ret = array();
$ret[] = 'DELETE FROM Linking where IDAnchor = ' .$AnchorID;
$query = $this->db->prepare("DELETE FROM Linking where IDAnchor = " .$AnchorID);
$query->execute();
$ret[] = $this->db->errorInfo();
$ret[] = 'DELETE FROM Entry where ID = ' .$AnchorID;
$query = $this->db->prepare("DELETE FROM Entry where ID = " .$AnchorID);
$query->execute();
$ret[] = $this->db->errorInfo();
$ret[] = 'DELETE FROM Anchor where ID = ' .$AnchorID;
$query = $this->db->prepare("DELETE FROM Anchor where ID = " .$AnchorID);
$query->execute();
$ret[] = $this->db->errorInfo();
return($ret);
}
public function updateTerm($AnchorID, $authType, $desc, $term, $type, $detailtype, $classification, $scopenote, $completetext)
{
$r = array();
$q = "UPDATE Anchor set Text = '" .$desc ."', Type ='" .$authType ."' , DetailType = '" .$detailtype ."' , Classification = '" .$classification ."' where ID = " .$AnchorID;
$r[] = $q;
$query = $this->db->prepare($q);
/* $query->bindParam("ID", $AnchorID, PDO::PARAM_INT);
$query->bindParam("Text", $term, PDO::PARAM_STR);
$query->bindParam("Type", $Type, PDO::PARAM_STR);
$query->bindParam("DetailType", $DetailType, PDO::PARAM_STR);
$query->bindParam("Classification", $Classification, PDO::PARAM_STR);
*/
$query->execute();
$r[] = $this->db->errorCode();
$r[] = $this->db->errorInfo();
$q = "UPDATE Entry set Text = :Text, Comment = :Comment, Language = :Language, CompleteText = :CompleteText, DateModified = :DateModified where ID = :ID";
$r[] = $q;
$query = $this->db->prepare($q);
$Language = "de";
$query->bindParam("ID", $AnchorID, PDO::PARAM_INT);
$query->bindParam("Text", $term, PDO::PARAM_STR);
$query->bindParam("Language", $Language, PDO::PARAM_STR);
$query->bindParam("Comment", $scopenote, PDO::PARAM_STR);
$query->bindParam("CompleteText", $completetext, PDO::PARAM_STR);
$date = date('Y-m-d H:i:s');
$query->bindParam("DateModified",($date), PDO::PARAM_STR);
$r[] = $q;
$query->execute();
$r[] = $this->db->errorCode();
$r[] = $this->db->errorInfo();
return("OK");
}
public function getStatistics($dateStart, $dateEnd)
{
$r = array();
$Types = array("Subject", "Person", "Corporate", "Publisher", "Classification");
$DateTypes = array("DateCreated", "DateModified");
foreach($Types as $Type) {
foreach ($DateTypes as $DateType) {
$q = "SELECT COUNT(*) AS COUNT FROM Anchor JOIN Entry ON (Anchor.ID = Entry.ID) ";
$q.= "WHERE Type = '" .$Type ."' AND " .$DateType ." BETWEEN '" .$dateStart ."' AND '" .$dateEnd ."'" ;
$query = $this->db->prepare($q);
$query->execute();
while($rec = ($query->fetch(PDO::FETCH_ASSOC))) {
// print_r($rec);
$r[$Type][$DateType] = $rec['COUNT'];
}
}
}
return ($r);
}
public function prepare_desc($text) {
$desc = is_array($text)? $text[0] : $text;
$text = strtolower ($desc);
$desc = str_replace(' ', '_', $text) ;
$search = array('ü', 'ä', 'ö', 'ß', '.', ',', 'Ö', 'Ü', 'Ä', '[', ']', '<' , '>' , '""');
$replace = array('ue','ae','oe','ss', '', '', 'oe',"ue", 'ae', '_', '_', '&lt;', '&gt;', '"' );
$desc = str_replace($search, $replace, $desc);
return ($desc);
}
}
?>

View File

@ -109,15 +109,14 @@ try {
// Hinweis: wenn Parent nicht gefunden → landet im Root (parent_id = 0)
}
}
// text = vollständiger Term (für jsTree-Anzeige), name = reines Label (für Suche)
$label = !empty($classification) ? trim(substr($term, strlen($classification))) : $term;
$textEscaped = mysqli_real_escape_string($conn, $term);
$nameEscaped = mysqli_real_escape_string($conn, $label);
$insertSql = "INSERT INTO Treeview (name, text, link, parent_id)
VALUES ('$nameEscaped', '$textEscaped', '#', '$parentId')";
// name und text = vollständiger Term (Notation + Bezeichnung), link = '#'
$nameEscaped = mysqli_real_escape_string($conn, $term);
$insertSql = "INSERT INTO Treeview (name, text, link, parent_id)
VALUES ('$nameEscaped', '$nameEscaped', '#', '$parentId')";
mysqli_query($conn, $insertSql);
$treeviewId = mysqli_insert_id($conn);
mysqli_close($conn);
}
}
echo json_encode([
'status' => 200,

View File

@ -51,7 +51,7 @@ $pattern = ($leftTrunc ? '%' : '') .
$sql = "SELECT id, name, text, parent_id
FROM Treeview
WHERE LOWER(text) LIKE LOWER('$pattern') OR LOWER(name) LIKE LOWER('$pattern')
WHERE LOWER(name) LIKE LOWER('$pattern')
ORDER BY text
LIMIT 50";

0
error.log Normal file
View File

View File

@ -423,7 +423,7 @@ function DeleteTerm(AnchorID)
function ModifyTerm(AnchorID)
{
// Name-Feld deaktivieren (darf nicht geändert werden)
document.getElementById("new_term").disabled = true;
// document.getElementById("new_term").disabled = true;
// Andere Felder aktivieren
document.getElementById("new_type").disabled = false;

View File

@ -419,7 +419,7 @@ function DeleteTerm(AnchorID)
function ModifyPerson(AnchorID)
{
// Name-Feld deaktivieren (darf nicht geändert werden)
document.getElementById("new_term").disabled = true;
// document.getElementById("new_term").disabled = true;
// Andere Felder aktivieren
document.getElementById("new_scopenote").disabled = false;

View File

@ -423,7 +423,7 @@ function DeleteTerm(AnchorID)
function ModifyTerm(AnchorID)
{
// Name-Feld deaktivieren (darf nicht geändert werden)
document.getElementById("new_term").disabled = true;
// document.getElementById("new_term").disabled = true;
// Andere Felder aktivieren
document.getElementById("new_type").disabled = false;

View File

@ -623,7 +623,7 @@ function DeleteTerm(AnchorID)
function ModifyTerm(AnchorID)
{
// Schlagwort-Feld deaktivieren (darf nicht geändert werden)
document.getElementById("new_term").disabled = true;
// document.getElementById("new_term").disabled = true;
// Andere Felder aktivieren
document.getElementById("new_type").disabled = false;

330
js/script.js Normal file
View File

@ -0,0 +1,330 @@
/**
* script.js BIBB-Thesaurus Normdatenverwaltung
* Erstellt: 2021/07/01 (Roland)
* Überarbeitet: 2026/02 Bugfixes, Bereinigung, Fehlertoleranz
*/
// ============================================================
// HILFSFUNKTIONEN
// ============================================================
/**
* Zeigt eine Fehlermeldung in einem Alert-Element an.
* @param {string} elementId ID des Alert-Divs
* @param {string} msg Anzuzeigende Nachricht
* @param {string} level Bootstrap-Level: 'danger' | 'warning' | 'success'
*/
function showAlert(elementId, msg, level) {
const a = document.getElementById(elementId);
if (!a) return;
a.className = 'alert alert-' + (level || 'danger');
a.textContent = msg;
a.style.display = 'block';
}
function hideAlert(elementId) {
const a = document.getElementById(elementId);
if (!a) return;
a.className = 'alert';
a.textContent = '';
a.style.display = 'none';
}
function setFieldsDisabled(fields, disabled) {
fields.forEach(id => {
const el = document.getElementById(id);
if (el) el.disabled = disabled;
});
}
// ============================================================
// SUCHE
// ============================================================
function Search() {
const search_string = $("#search_text").val().trim();
if (search_string === "") {
alert('Bitte Suchkriterien eingeben!');
return;
}
$.post("ajax/search.php", { search_string }, function(data) {
$(".records_content").html(data);
$("#search_text").val("");
}).fail(function() {
alert('Fehler bei der Suche. Bitte erneut versuchen.');
});
}
// ============================================================
// NEUES SCHLAGWORT
// ============================================================
function newSubjectShow() {
const editableFields = ["new_term", "new_type", "new_detailtype", "new_classification", "new_scopenote"];
document.getElementById("newSubjectSave").style.display = 'inline';
document.getElementById("newSubjectDismiss").style.display = 'inline';
document.getElementById("SubjectModifySave").style.display = 'none';
document.getElementById("new_relation_label").style.display = 'none';
document.getElementById("newRelationSubjectDismiss").style.display = 'none';
document.getElementById("relation_table").style.display = 'none';
setFieldsDisabled(editableFields, false);
hideAlert("errorNewSubject");
$("#new_term").val("");
$("#new_classification").val("");
$("#new_scopenote").val("");
showRelations(0, 0, 0);
$("#NewSubjectModal").modal("show");
}
function CreateNewEntry() {
const term = $("#new_term").val().trim();
const type = $("#new_type").val().trim();
const detailtype = $("#new_detailtype").val().trim();
const classification = $("#new_classification").val().trim();
const scopenote = $("#new_scopenote").val().trim();
if (term.length === 0) {
showAlert("errorNewSubject", "Bitte Schlagwort eingeben!", "danger");
return;
}
hideAlert("errorNewSubject");
$.post("ajax/newSubject.php", { term, type, detailtype, classification, scopenote },
function(data) {
const dt = JSON.parse(data);
if (dt.status === 200) {
const editableFields = ["new_term", "new_type", "new_detailtype", "new_classification", "new_scopenote"];
setFieldsDisabled(editableFields, true);
document.getElementById("newSubjectSave").style.display = 'none';
document.getElementById("newSubjectDismiss").style.display = 'none';
document.getElementById("new_relation_label").style.display = 'block';
document.getElementById("newRelationSubjectDismiss").style.display = 'inline';
showAlert("errorNewSubject", "Neues Schlagwort aufgenommen", "success");
showRelations(dt.Anchor, dt.Entry, dt.Linking);
} else {
showAlert("errorNewSubject", dt.message || "Unbekannter Fehler", "danger");
}
}
).fail(function() {
showAlert("errorNewSubject", "Serverfehler beim Anlegen des Eintrags.", "danger");
});
}
// ============================================================
// RELATIONEN
// ============================================================
function showRelations(Anchor, Entry, Linking) {
$.get("ajax/getRelations.php", { anchorID: Anchor },
function(data, status) {
if (status === "success") {
$(".new_modal_content").html(JSON.parse(data));
document.getElementById("relation_table").style.display = 'block';
$("#NewSubjectModal").modal("show");
}
}
).fail(function() {
console.error("Fehler beim Laden der Relationen für AnchorID:", Anchor);
});
}
function CreateNewRelation(AnchorID) {
const relationType = document.getElementById("new_relationtype").value;
const relationText = document.getElementById("search_relation").value;
const relationID = relationText.substring(
relationText.lastIndexOf(":") + 2,
relationText.lastIndexOf(")")
).trim();
if (!relationID) {
showAlert("errorNewSubject", "Kein gültiger Relationseintrag ausgewählt.", "warning");
return;
}
$.post("ajax/writeNewRelation.php", { AnchorID, relationType, relationID },
function(data, status) {
if (status === "success") {
showAlert("errorNewSubject", "Neue Relation aufgenommen", "success");
showRelations(AnchorID, 0, 0);
}
}
).fail(function() {
showAlert("errorNewSubject", "Fehler beim Speichern der Relation.", "danger");
});
}
function DeleteRelation(AnchorID, LinkingID) {
$.post("ajax/deleteRelation.php", { AnchorID, LinkingID },
function(data, status) {
if (status === "success") {
showAlert("errorNewSubject", "Relation gelöscht", "success");
showRelations(AnchorID, 0, 0);
}
}
).fail(function() {
showAlert("errorNewSubject", "Fehler beim Löschen der Relation.", "danger");
});
}
// ============================================================
// EINTRAG BEARBEITEN / LÖSCHEN
// ============================================================
function DeleteTerm(AnchorID) {
$.post("ajax/deleteTerm.php", { AnchorID: AnchorID[0] },
function(data, status) {
if (status !== "success") {
alert(JSON.parse(data));
}
}
).fail(function() {
alert("Fehler beim Löschen des Eintrags.");
});
}
function ModifyTerm(AnchorID) {
$("#ID").val(AnchorID[0]);
$.get("ajax/getAuthorityDataRaw.php", { id: AnchorID[0] },
function(data, status) {
if (status === "success") {
const dt = JSON.parse(data).rows[0];
if (!dt) return;
$("#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);
}
}
);
$.get("ajax/getRelations.php", { anchorID: AnchorID[0] },
function(data, status) {
if (status === "success") {
$(".new_modal_content").html(JSON.parse(data));
document.getElementById("relation_table").style.display = 'block';
document.getElementById("newSubjectSave").style.display = 'none';
document.getElementById("newSubjectDismiss").style.display = 'inline';
document.getElementById("SubjectModifySave").style.display = 'inline';
document.getElementById("newRelationSubjectDismiss").style.display = 'none';
$("#NewSubjectModalHeadline").val("Schlagwort ändern");
$("#NewSubjectModal").modal("show");
}
}
);
}
function UpdateEntry(authType) {
const AnchorID = $("#ID").val();
const term = $("#new_term").val().trim();
const type = $("#new_type").val().trim();
const detailtype = $("#new_detailtype").val().trim();
const classification = $("#new_classification").val().trim();
const scopenote = $("#new_scopenote").val().trim();
if (term.length === 0) {
showAlert("errorNewSubject", "Bitte Schlagwort eingeben!", "danger");
return;
}
hideAlert("errorNewSubject");
$.post("ajax/UpdateTerm.php", { AnchorID, authType, term, type, detailtype, classification, 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';
showAlert("errorNewSubject", "Schlagwort geändert", "success");
$("#NewSubjectModalHeadline").val("Schlagwort ändern");
$("#NewSubjectModal").modal("show");
}
}
).fail(function() {
showAlert("errorNewSubject", "Fehler beim Speichern des Eintrags.", "danger");
});
}
// ============================================================
// STATISTIK
// ============================================================
function generateStatistics() {
const startVal = document.getElementById("startPeriod").value;
const endVal = document.getElementById("endPeriod").value;
if (!startVal || !endVal) {
showAlert("errorStatistics", "Bitte Start- und Endtermin angeben.", "warning");
return;
}
if (startVal > endVal) {
showAlert("errorStatistics", "Starttermin darf nicht nach dem Endtermin liegen.", "warning");
return;
}
hideAlert("errorStatistics");
const content = $("#records_content");
// Spinner oberhalb des Ergebnisbereichs anzeigen, records_content NICHT anfassen
$("#statisticsSpinner").remove();
$("#records_content").before(
'<div id="statisticsSpinner" class="text-center my-3">'
+ '<div class="spinner-border text-primary" role="status">'
+ '<span class="visually-hidden">Lädt...</span></div></div>'
);
$("#records_content").hide();
$.ajax({
url: "ajax/getStatistics.php",
method: "GET",
dataType: "json",
data: {
dateStart: (startVal + " 00:00:00").trim(),
dateEnd: (endVal + " 23:59:59").trim()
},
success: function(data) {
$("#statisticsSpinner").remove();
if (data.status === 200) {
document.getElementById("statisticsBody").innerHTML = data.rows;
document.getElementById("statisticsFoot").innerHTML = data.foot;
document.getElementById("statisticsZeitraum").textContent = data.zeitraum;
content.show();
} else {
showAlert("errorStatistics", data.message || "Unbekannter Fehler.", "warning");
}
},
error: function(xhr, status, error) {
$("#statisticsSpinner").remove();
showAlert("errorStatistics", "Serverfehler: " + (error || status), "danger");
}
});
}
// ============================================================
// HILFSFUNKTIONEN UI
// ============================================================
function RecordContentHide() {
const el = document.getElementById("records_content");
el.style.display = 'none';
el.textContent = '';
}
function DisplayEnterDateSelection() {
document.getElementById("QueryStatistics").style.display = 'block';
}

View File

@ -32,6 +32,16 @@
</div>
</div>
</div>
<div class="row mt-2" id="relations_modal_extra_row" style="display: none;">
<div class="col-md-4" id="relations_modal_classification_col" style="display: none;">
<label class="form-label fw-bold">Klassifikation</label>
<input type="text" id="relations_modal_classification" class="form-control" disabled />
</div>
<div class="col-md-8" id="relations_modal_scopenote_col" style="display: none;">
<label class="form-label fw-bold">Scopenote</label>
<textarea id="relations_modal_scopenote" class="form-control" rows="2" disabled></textarea>
</div>
</div>
</div>
<!-- Lade-Anzeige -->
@ -62,23 +72,6 @@
<i class="fas fa-info-circle me-1"></i> Keine Relationen vorhanden.
</div>
<!-- Synonyme-Bereich (nur bei Subjects) -->
<div id="relations_modal_synonyms" style="display: none; margin-top: 15px;">
<h6 class="mb-2"><i class="fas fa-equals me-1" style="color: #e91e63;"></i> Synonyme</h6>
<div class="table-responsive" style="border: 1px solid #dee2e6; border-radius: 0.375rem; overflow: hidden;">
<table class="table table-sm table-hover table-bordered mb-0">
<thead class="table-light">
<tr>
<th style="width: 120px;">Typ</th>
<th>Begriff</th>
</tr>
</thead>
<tbody id="relations_modal_synonyms_body">
</tbody>
</table>
</div>
</div>
</div>
<div class="modal-footer">
@ -104,11 +97,6 @@
min-width: 42px;
}
#RelationsModal .badge.bg-syn {
background-color: #e91e63;
color: #ffffff;
}
#RelationsModal .relation-link {
color: var(--primary-color, #1a3a5c);
text-decoration: none;
@ -137,11 +125,14 @@ function ShowRelationsModal(id, authType) {
$('#relations_modal_term').val('');
$('#relations_modal_id').val(id);
$('#relations_modal_descriptor').val('');
$('#relations_modal_classification').val('');
$('#relations_modal_scopenote').val('');
$('#relations_modal_classification_col').hide();
$('#relations_modal_scopenote_col').hide();
$('#relations_modal_extra_row').hide();
$('#relations_modal_body').html('');
$('#relations_modal_synonyms_body').html('');
$('#relations_modal_content').hide();
$('#relations_modal_empty').hide();
$('#relations_modal_synonyms').hide();
$('#relations_modal_loading').show();
$('#RelationsModalHeadline').html('<i class="fas fa-table"></i> Relationen');
@ -172,6 +163,21 @@ function ShowRelationsModal(id, authType) {
$('#relations_modal_term').val(entry.Text || '');
$('#relations_modal_id').val(entry.ID || id);
$('#relations_modal_descriptor').val(entry.Descriptor === false ? 'Nein' : 'Ja');
$('#relations_modal_classification').val(entry.Classification || '');
$('#relations_modal_scopenote').val(entry.Scopenote || '');
var hasClassification = entry.Classification && entry.Classification.trim().length > 0;
var hasScopenote = entry.Scopenote && entry.Scopenote.trim().length > 0;
if (hasClassification) {
$('#relations_modal_classification_col').show();
}
if (hasScopenote) {
$('#relations_modal_scopenote_col').show();
}
if (hasClassification || hasScopenote) {
$('#relations_modal_extra_row').show();
}
// DSpace-Count laden (nur bei Subject/Person und Deskriptor)
var $dspaceField = $('#relations_modal_dspace');
@ -232,7 +238,6 @@ function ShowRelationsModal(id, authType) {
var relType = rel.Relationtype || 'RT';
var badge = badgeConfig[relType] || { css: 'bg-secondary', title: relType };
var relText = _escRelModal(rel.TextRelation || '');
var relId = rel.IDRelation || '';
html += '<tr>';
html += '<td><span class="badge ' + badge.css + '" title="' + badge.title + '">' + relType + '</span></td>';
@ -251,29 +256,6 @@ function ShowRelationsModal(id, authType) {
$('#relations_modal_empty').show();
}
// Synonyme (nur bei Subjects)
if (authType === 'Subject') {
var synonyms = entry.Synonyms || '';
// Falls leer, separat laden
if (!synonyms || synonyms.trim() === '') {
$.ajax({
url: "/Thesaurus/ajax/getSynonyms.php",
type: "GET",
data: { text: entry.Text },
dataType: "json",
success: function(synResponse) {
if (synResponse.success && synResponse.synonyms && synResponse.synonyms.length > 0) {
synonyms = synResponse.synonyms.map(function(s) { return s.text; }).join(', ');
_renderSynonymsInModal(synonyms, badgeConfig);
}
}
});
} else {
_renderSynonymsInModal(synonyms, badgeConfig);
}
}
$('#relations_modal_loading').hide();
}
}).fail(function() {
@ -282,26 +264,6 @@ function ShowRelationsModal(id, authType) {
});
}
function _renderSynonymsInModal(synonyms, badgeConfig) {
if (!synonyms || synonyms.trim() === '') return;
var synArray = synonyms.split(',').map(function(s) { return s.trim(); }).filter(function(s) { return s.length > 0; });
if (synArray.length === 0) return;
var badge = badgeConfig['SYN'];
var html = '';
synArray.forEach(function(synText) {
html += '<tr>';
html += '<td><span class="badge ' + badge.css + '" title="' + badge.title + '">SYN</span></td>';
html += '<td>' + _escRelModal(synText) + '</td>';
html += '</tr>';
});
$('#relations_modal_synonyms_body').html(html);
$('#relations_modal_synonyms').show();
}
function _escRelModal(text) {
if (!text) return '';
var div = document.createElement('div');

View File

@ -114,7 +114,7 @@
</div>
</div>
<!-- Synonyme-Bereich -->
<!-- Synonyme-Bereich
<div id="synonyms_section" style="display: none; margin-top: 20px;">
<hr>
<h6><i class="fas fa-equals me-1" style="color: #e91e63;"></i> Synonyme</h6>
@ -128,11 +128,12 @@
</tr>
</thead>
<tbody id="synonyms_body">
<!-- Synonyme werden hier per AJAX eingefügt -->
!-- Synonyme werden hier per AJAX eingefügt --
</tbody>
</table>
</div>
</div>
-->
</div>
</div>