Beide Module wurden aus einem anderen Kundenprojekt kopiert und bereinigt: Knowledgecenter: - Bild-Cache (1.985 Dateien) geleert, Ordnerstruktur mit .gitkeep behalten - Files-Gallery-Lizenzschlüssel entfernt (config.php) - Kundenspezifische Kategorien gelöscht: Teil I/II/III QM-Struktur, nummerierte QM-Kapitel, Gremien (Präsidium/Finanzausschuss/Landesausschuss), Sitzungsservice-Serie, Protokoll-Abteilungen, Testeinträge - 56 generische Kategorien bleiben (Downloads, Onboarding, Personalthemen …) Tasks: - Alle Betriebsdaten gelöscht (114 Tasks, 914 Submissions, 579 Assignments) - Task-Definitionen und Verlinkungen geleert - Kategoriestruktur bleibt (Allgemein, IT, Personal, Buchhaltung …) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
195 lines
10 KiB
PHP
195 lines
10 KiB
PHP
<div class="titlebar_small">
|
||
<h2><?=$translation->get("Diskussion")?></h2>
|
||
<span data-toggle-target="discussion_form" class="toggle post-action-btn-small green">+</span>
|
||
</div>
|
||
<hr>
|
||
<div data-toggle-target="discussion_form" class="toggle_container">
|
||
<form id="newCommentForm">
|
||
<input type="hidden" name="post_id" value="<?php echo $postId; ?>">
|
||
<input type="hidden" name="author_id" value="<?php echo $GLOBALS['main_contact']['id']; ?>">
|
||
<input type="text" class="input_round" name="text" placeholder="Text..." required>
|
||
<button class="send_comment" title="Senden" type="submit">
|
||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-send-fill"
|
||
viewBox="0 0 16 16">
|
||
<path
|
||
d="M15.964.686a.5.5 0 0 0-.65-.65L.767 5.855H.766l-.452.18a.5.5 0 0 0-.082.887l.41.26.001.002 4.995 3.178 3.178 4.995.002.002.26.41a.5.5 0 0 0 .886-.083zm-1.833 1.89L6.637 10.07l-.215-.338a.5.5 0 0 0-.154-.154l-.338-.215 7.494-7.494 1.178-.471z" />
|
||
</svg>
|
||
</button>
|
||
</form>
|
||
<hr>
|
||
</div>
|
||
<div id="commentsContainer">
|
||
</div>
|
||
|
||
|
||
<script>
|
||
var currentUserId = <?php echo json_encode($GLOBALS['main_contact']['id']); ?>;
|
||
|
||
$(document).ready(function () {
|
||
// Funktion zum Anzeigen des Antwortformulars
|
||
$(document).on("click", ".replyCommentBtn", function () {
|
||
var parentId = $(this).data("id");
|
||
var $comment = $(this).closest('.comment');
|
||
// Finde den entsprechenden Reply-Container
|
||
var $replyContainer = $comment.find("div.replies[data-parent-id='" + parentId + "']");
|
||
// Falls der Container nicht existiert, erstelle ihn
|
||
if ($replyContainer.length === 0) {
|
||
$comment.append("<div class='replies' data-parent-id='" + parentId + "'></div>");
|
||
$replyContainer = $comment.find("div.replies[data-parent-id='" + parentId + "']");
|
||
}
|
||
// Prüfen, ob bereits ein Reply-Formular vorhanden ist
|
||
if ($replyContainer.find(".replyCommentForm").length > 0) {
|
||
// Eventuell: Formular toggle ausblenden/anzeigen oder
|
||
// einfach nichts tun, um Mehrfach-Erzeugung zu vermeiden
|
||
return; // Verhindert, dass ein weiteres Formular hinzugefügt wird
|
||
}
|
||
|
||
// Erzeuge das Reply-Formular und füge es ein
|
||
var replyFormHtml = "<form class='replyCommentForm'>" +
|
||
"<input type='hidden' name='parent_id' value='" + parentId + "'>" +
|
||
"<input type='hidden' name='post_id' value='<?php echo $postId; ?>'>" +
|
||
"<input type='hidden' name='author_id' value='<?php echo $GLOBALS['main_contact']['id']; ?>'>" +
|
||
"<input type='hidden' name='action' value='insert_comment'>" +
|
||
"<input type='text' class='input_round' name='text' placeholder='<?=$translation->get("reply_placeholder")?>'>" +
|
||
"<button class='send_comment' type='submit'>↪</button>" +
|
||
"</form>";
|
||
$replyContainer.append(replyFormHtml);
|
||
});
|
||
|
||
|
||
// Absenden des Antwortformulars
|
||
$(document).on("submit", ".replyCommentForm", function (e) {
|
||
e.preventDefault();
|
||
var formData = $(this).serialize();
|
||
$.post("/module/knowledgecenter_update/Ajax/Ajax.php", formData, function (response) {
|
||
if (response.success) {
|
||
// Kommentare neu laden – alternativ kann das neue Reply direkt angezeigt werden
|
||
loadComments();
|
||
} else {
|
||
alert("Fehler: " + response.error);
|
||
}
|
||
}, "json");
|
||
});
|
||
|
||
// Die bestehende loadComments()-Funktion anpassen:
|
||
function loadComments() {
|
||
// $("#overlayLoader").show(); // Zeige den Loader an
|
||
$.post("/module/knowledgecenter_update/Ajax/Ajax.php", {
|
||
action: 'get_post_comments',
|
||
post_id: <?php echo $postId; ?>
|
||
}, function (response) {
|
||
if (response.success) {
|
||
var html = '';
|
||
if (response.comments.length === 0) {
|
||
html = "<div class='no-comments'><?=$translation->get("no_comments")?></div>";
|
||
} else {
|
||
var commentMap = {};
|
||
response.comments.forEach(function (comment) {
|
||
commentMap[comment.id] = comment;
|
||
comment.children = []; // initialisiere ein Array für Antworten
|
||
});
|
||
var roots = [];
|
||
response.comments.forEach(function (comment) {
|
||
if (comment.parent_id && commentMap[comment.parent_id]) {
|
||
commentMap[comment.parent_id].children.push(comment);
|
||
} else {
|
||
roots.push(comment);
|
||
}
|
||
});
|
||
function renderComment(comment, isLast) {
|
||
var d = new Date(comment.created_at);
|
||
var formattedDate = d.toLocaleString("de-DE", {
|
||
day: "2-digit",
|
||
month: "2-digit",
|
||
year: "numeric",
|
||
hour: "2-digit",
|
||
minute: "2-digit"
|
||
});
|
||
|
||
// Füge die Zusatzklasse hinzu, wenn isLast true ist
|
||
var extraClass = isLast ? " last-comment" : "";
|
||
var commentHtml = "<div class='comment" + extraClass + "' data-id='" + comment.id + "'>";
|
||
commentHtml += " <div class='comment-content'>";
|
||
commentHtml += " <div class='comment-header'>";
|
||
commentHtml += " <strong>" + comment.author + "</strong> - <small>" + formattedDate + "</small>";
|
||
commentHtml += " <p>" + comment.text + "</p>";
|
||
commentHtml += " </div>";
|
||
commentHtml += " <div class='comment-toolbar'>";
|
||
commentHtml += " <span class='replyCommentBtn post-action-btn-small green' data-id='" + comment.id + "'>↪</span>";
|
||
if (comment.author_id == currentUserId) {
|
||
commentHtml += " <span class='deleteCommentBtn post-action-btn-small' data-id='" + comment.id + "' title='Kommentar löschen'>✕</span>";
|
||
}
|
||
commentHtml += " </div>";
|
||
commentHtml += " </div>";
|
||
|
||
// Wenn Kinder vorhanden sind, durchlaufe diese
|
||
if (comment.children && comment.children.length > 0) {
|
||
commentHtml += " <div class='replies' data-parent-id='" + comment.id + "'>";
|
||
comment.children.forEach(function (child, index, array) {
|
||
// Bestimme, ob es das letzte Kind im Array ist
|
||
var isLastChild = (index === array.length - 1);
|
||
commentHtml += renderComment(child, isLastChild);
|
||
});
|
||
commentHtml += " </div>";
|
||
}
|
||
commentHtml += "</div>";
|
||
return commentHtml;
|
||
}
|
||
|
||
// Beim Rendern der Wurzeln rufst du renderComment() auf, hier kannst du z. B. false übergeben, da es beim Wurzelelement nicht relevant ist:
|
||
roots.forEach(function (comment) {
|
||
// Wenn du weißt, dass das Wurzelelement möglicherweise auch das letzte im Container ist,
|
||
// kannst du den selben Check machen (z.B. isLast = index === roots.length-1)
|
||
html += renderComment(comment, false);
|
||
});
|
||
|
||
}
|
||
$("#commentsContainer").html(html);
|
||
}
|
||
}, "json").always(function () {
|
||
// $("#overlayLoader").hide(); // Blende den Loader aus, egal ob Erfolg oder Fehler
|
||
});
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
// Lade Kommentare beim Initialisieren
|
||
loadComments();
|
||
|
||
// Bestehender Code für das neue Kommentarformular bleibt erhalten...
|
||
$("#newCommentForm").on("submit", function (e) {
|
||
e.preventDefault();
|
||
var $btn = $(this).find("button[type='submit']");
|
||
$btn.prop("disabled", true);
|
||
|
||
var formData = $(this).serialize() + "&action=insert_comment";
|
||
$.post("/module/knowledgecenter_update/Ajax/Ajax.php", formData, function (response) {
|
||
if (response.success) {
|
||
loadComments();
|
||
$("#newCommentForm input[name='text']").val('');
|
||
} else {
|
||
alert("Fehler: " + response.error);
|
||
}
|
||
$btn.prop("disabled", false); // Reaktivieren nach Abschluss
|
||
}, "json");
|
||
});
|
||
|
||
|
||
// Löschen eines Kommentars (bestehender Code) bleibt grundsätzlich gleich.
|
||
$(document).on("click", ".deleteCommentBtn", function () {
|
||
var commentId = $(this).data("id");
|
||
if (confirm("Kommentar wirklich löschen?")) {
|
||
$.post("/module/knowledgecenter_update/Ajax/Ajax.php", { action: 'delete_comment', comment_id: commentId, main_contact_id: <?php echo $GLOBALS["main_contact"]["id"]; ?> }, function (response) {
|
||
if (response.success) {
|
||
loadComments();
|
||
} else {
|
||
alert("Fehler: " + response.error);
|
||
}
|
||
}, "json");
|
||
}
|
||
});
|
||
});
|
||
|
||
</script>
|