Files
Moritz Weinmann a0698d621e feat(wiki): Betriebsrat-Berechtigung (r-wiki-br)
Neue Permission r-wiki-br ermöglicht eingeschränkte Wiki-Bearbeitung:

- Neue Permission in main_permission (ID 30: r-wiki-br)
- Neue Spalte betriebsrat_editable in knowledgecenter_categories_update
- Checkbox "Für Betriebsrat bearbeitbar" in der Kategorie-Verwaltung
  (nur für r-wiki-Redakteure sichtbar und speicherbar)

Berechtigungslogik:
- r-wiki schlägt immer: Wer beide Rechte hat, verhält sich wie Redakteur
- Betriebsrat sieht nur Kategorien mit betriebsrat_editable=1
- "Beitrag erstellen"-Button nur in freigegebenen Kategorien sichtbar
- Neue Posts/Bearbeitungen auf betriebsrat_editable-Kategorien beschränkt
- Settings-Tab und Kategorieverwaltung weiterhin r-wiki-only
- Ajax-Endpoints (save_post_files, delete_post_file, upload_inline_image)
  prüfen Kategorie-Berechtigung serverseitig

File Gallery:
- Betriebsrat ist per kc_lock_path auf den Post-eigenen Ordner beschränkt
- Redakteur kann frei navigieren (kein Lock)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 13:16:36 +02:00

126 lines
4.8 KiB
PHP
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.
<script>
// Redakteur (r-wiki) darf frei navigieren; Betriebsrat ist auf den Post-Ordner beschränkt
var kcUserLockedToPostFolder = <?= (!is_wiki_redakteur() && is_wiki_betriebsrat()) ? 'true' : 'false' ?>;
function buildFileGalleryUrl(target, mode, ajaxFunction, nocache) {
var base = "/module/knowledgecenter_update/Plugins/filesgallery.php?";
var postPath = (typeof window.kcPostGalleryPath === "string")
? window.kcPostGalleryPath.replace(/^\/+|\/+$/g, "")
: "";
// Redakteur: kein Lock (leerer kc_lock_path löscht den Session-Lock)
// Betriebsrat: immer auf Post-Ordner beschränken
var lockPath = kcUserLockedToPostFolder ? postPath : "";
var params = "input_id=" + encodeURIComponent(target) +
"&mode=" + encodeURIComponent(mode) +
"&saveajax=" + encodeURIComponent(ajaxFunction || "") +
"&kc_lock_path=" + encodeURIComponent(lockPath) +
"&nocache=" + nocache;
// Startverzeichnis: bei Betriebsrat immer Post-Ordner, bei Redakteur auch
var startPath = postPath;
if (startPath.length > 0) {
return base + encodeURIComponent(startPath) + "&" + params;
}
return base + params;
}
function showMessage(message, isSuccess) {
var $msg = $("#message");
// Vorherige Animationen stoppen und Opazität zurücksetzen
$msg.stop(true, true).css("opacity", 1);
// Styling je nach Erfolg oder Fehler
if (isSuccess) {
$msg.css({
"color": "green",
"position": "relative",
"background-color": "#d4edda",
"margin-bottom": "10px",
"border": "1px solid green"
});
} else {
$msg.css({
"color": "red",
"position": "relative",
"background-color": "#f8d7da",
"margin-bottom": "10px",
"border": "1px solid red"
});
}
$msg.text(message).show();
setTimeout(function () {
$msg.animate({ opacity: 0 }, 500, function () {
$msg.hide();
});
}, 3000);
}
// Popup-Öffnen für die Files Gallery
$(".openFileGallery").on("click", function () {
var target = $(this).data("target");
// Hole den Funktionsnamen aus data-ajax-function, Standardwert falls nicht definiert:
var ajaxFunction = $(this).data("ajax-function");
var nocache = new Date().getTime(); // Erzeugt einen Zeitstempel
window.open(buildFileGalleryUrl(target, "single", ajaxFunction, nocache),
"FileGallery", "width=1000,height=600");
});
$(".openFileGalleryMulti").on("click", function () {
var target = $(this).data("target");
var ajaxFunction = $(this).data("ajax-function");
var nocache = new Date().getTime(); // Zeitstempel zur Cache-Vermeidung
window.open(buildFileGalleryUrl(target, "multi", ajaxFunction, nocache),
"FileGallery", "width=1000,height=600");
});
// Funktion, die vom Files Gallery Popup im Parent-Fenster aufgerufen wird
window.setFilePath = function (path) {
if (window.fileGalleryTarget) {
$("#" + window.fileGalleryTarget).val(path);
}
};
// Alternative setFilePath-Funktion im globalen Kontext
function setFilePath(path) {
var input = document.getElementById(input_id);
if (input) {
input.value = path;
}
}
// Event-Handler für den Clear-Button
$(document).on("click", ".clearImage", function () {
// Hole den data-target Wert z.B. "image_1"
var targetId = $(this).data("target");
// Leere das versteckte Input-Feld
$("#" + targetId).val("");
// Suche das Vorschaubild innerhalb des Containers (.single_image_group)
$(this).closest('.single_image_group').find('.preview')
.attr("src", "") // Bildquelle entfernen
.css("background-color", "#f3f3f3"); // Standardhintergrund setzen
});
$(document).ready(function () {
$('.toggle').on('click', function (e) {
e.preventDefault();
// Lese das data-toggle-target Attribut des geklickten Elements aus
var target = $(this).data('toggle-target');
if (target) {
// Suche nach allen Elementen mit dem gleichen data-toggle-target,
// schließe aber das geklickte Element (und ggf. weitere Toggle-Elemente) aus.
var $targetElements = $('[data-toggle-target="' + target + '"]').not('.toggle');
if ($targetElements.length) {
$targetElements.slideToggle();
}
}
});
});
</script>