$(function() { // $('.selectpicker').selectpicker(); $('[data-toggle="tooltip"]').tooltip(); }); function update_modal_data_load(e, $ele) { var ele = $ele, url = ele.data("url"), data = { data: ele.data("data"), target: ele.data("target") }, contentType = "application/x-www-form-urlencoded; charset=UTF-8"; console.log(data); console.log(url); $.ajax({ url: url, data: data, type: "POST", dataType: "json", cache: false, contentType: contentType, encode: true, headers: { "X-CSRF-TOKEN": $('meta[name="csrf-token"]').attr("content"), }, success: function(data) { // do what ever you want here. add content to
if it was not 1 . $(data.target) .find(".modal-content") .html(data.response); // $('.selectpicker').selectpicker(["refresh"]); // $('.input-daterange').datepicker({toggleActive: true,format: 'dd.mm.yyyy'}); $(data.target).modal("show"); }, error: function(xhr, status, errorThrown) { console.log(xhr); console.log(xhr.responseText); console.log(status); console.log("Sorry, there was a problem!"); }, }); return false; } jQuery(document).ready(function() { $(".update_modal_data_load").on("click", function(e) { e.preventDefault(); update_modal_data_load(e, $(this)); }); if ($(".datepicker-base").length > 0) { $(".datepicker-base").datepicker({ orientation: "auto right", calendarWeeks: true, todayBtn: "linked", //daysOfWeekDisabled: '1', todayHighlight: true, multidate: false, daysOfWeekHighlighted: "0,6", autoclose: true, format: "dd.mm.yyyy", language: "de", clearBtn: true, }); } if ($(".datepicker-birthday").length > 0) { $(".datepicker-birthday").datepicker({ todayBtn: "linked", // daysOfWeekDisabled: '1', multidate: false, daysOfWeekHighlighted: "0,6", autoclose: true, format: "dd.mm.yyyy", language: "de", clearBtn: true, startView: 2, }); } if ($(".b-material-datetime-picker").length > 0) { $(".b-material-datetime-picker").bootstrapMaterialDatePicker({ weekStart: 1, format: "DD.MM.YYYY HH:mm", shortTime: false, nowButton: true, clearButton: true, lang: "de", //currentDate: '' }); } $(".form-prevent-multiple-submits").on("submit", function() { $(".button-prevent-multiple-submits").attr("disabled", true); $(this) .find(".spinner") .show(); }); // Summernote CustomList Plugin definieren - ZUERST definieren // Prüfen, ob Summernote verfügbar ist if (typeof $.summernote !== "undefined" && $.summernote.plugins) { $.extend($.summernote.plugins, { customList: function(context) { var self = this; var ui = $.summernote.ui; // Button erstellen context.memo("button.customList", function() { // Button erstellen mit Summernote UI var button = ui.button({ contents: '', tooltip: "Benutzerdefinierte Liste mit Icons", container: context.options.container, click: function() { // --- Logik zum Einfügen der Liste --- var listContent = ""; var range = context.invoke("editor.createRange"); console.log(range); // Den HTML-Inhalt direkt aus dem Editor holen var editorSelection = window.getSelection(); var selectedHTML = ""; if (editorSelection.rangeCount > 0) { // Es gibt eine Auswahl var selectedRange = editorSelection.getRangeAt(0); var selectedContent = selectedRange.cloneContents(); var tempDiv = document.createElement("div"); tempDiv.appendChild(selectedContent); selectedHTML = tempDiv.innerHTML; console.log("Ausgewählter HTML-Inhalt:", selectedHTML); } if (selectedHTML) { // HTML-Inhalt verarbeiten processHTMLContent(selectedHTML); } else { // Wenn keine Auswahl, versuchen den umgebenden Absatz zu holen var selectedNode = range.sc; var parentElement = $(selectedNode).closest("p, div"); if (parentElement.length > 0) { selectedHTML = parentElement.html(); if (selectedHTML) { processHTMLContent(selectedHTML); } else { insertEmptyList(); } } else { insertEmptyList(); } } // Fokus zurück in den Editor context.invoke("editor.focus"); // Nach dem Einfügen der Liste den Enter-Handler hinzufügen setupEnterHandler(); // Funktion zum Verarbeiten des HTML-Inhalts function processHTMLContent(htmlContent) { // HTML in DOM-Element parsen, um es besser verarbeiten zu können var tempDiv = document.createElement("div"); tempDiv.innerHTML = htmlContent; // Text mit HTML-Tags in Zeilen aufteilen // Ersetze
durch Zeilenumbrüche im DOM var brs = tempDiv.querySelectorAll("br"); for (var i = 0; i < brs.length; i++) { brs[i].parentNode.replaceChild( document.createTextNode("\n"), brs[i] ); } // Jetzt den Text mit Zeilenumbrüchen holen var textWithLinebreaks = tempDiv.textContent || tempDiv.innerText; // Zeilenumbrüche normalisieren var normalizedText = textWithLinebreaks .replace(/\r\n/g, "\n") .replace(/\r/g, "\n"); // Text in Zeilen aufteilen var lines = normalizedText.split("\n"); // Listenelemente erstellen listContent = ""; lines.forEach(function(line) { if (line.trim() !== "") { listContent += '
  • ' + line.trim() + "
  • "; } }); if (listContent) { // Vor dem Einfügen der Liste den ausgewählten Text löschen if (range) { context.invoke("editor.deleteRange", range); } // Liste einfügen var listHtml = '"; context.invoke("editor.pasteHTML", listHtml); } else { // Fallback: Leere Liste einfügen insertEmptyList(); } } // Funktion zum Einfügen einer leeren Liste function insertEmptyList() { var listHtml = ''; context.invoke("editor.pasteHTML", listHtml); } }, }); return button.render(); }); // Funktion zum Einrichten des Enter-Handlers function setupEnterHandler() { // Wir verwenden setTimeout, um sicherzustellen, dass die Liste bereits im DOM ist setTimeout(function() { var $editor = $(context.layoutInfo.editor); var $editable = $(context.layoutInfo.editable); // Event-Handler für die Enter-Taste innerhalb der Liste $editable .off("keydown.customList") .on("keydown.customList", function(e) { if (e.keyCode === 13) { // Enter-Taste var range = context.invoke("editor.createRange"); var $currentNode = $(range.sc); // Prüfen, ob wir uns in einer Liste befinden var $listItem = $currentNode.closest( "ul.list-unstyled.list-icons > li" ); if ($listItem.length > 0) { e.preventDefault(); // Neuen Listenpunkt erstellen var newItem = '
  • '; // Position bestimmen - nach dem aktuellen Listenpunkt einfügen $listItem.after(newItem); // Cursor in den neuen Listenpunkt setzen var $newItem = $listItem.next("li"); var textNode = $newItem.contents().filter(function() { return this.nodeType === 3; // Text-Node })[0]; if (textNode) { var newRange = document.createRange(); newRange.setStart(textNode, 1); // Nach dem Leerzeichen positionieren newRange.collapse(true); var selection = window.getSelection(); selection.removeAllRanges(); selection.addRange(newRange); } return false; } } }); }, 100); } // Plugin-Initialisierung self.initialize = function() { // Nichts zu tun bei der Initialisierung console.log("CustomList Plugin initialisiert"); }; // Plugin-Zerstörung (Cleanup) self.destroy = function() { // Event-Handler entfernen $(context.layoutInfo.editable).off("keydown.customList"); }; }, }); } // Prüfen, ob Summernote bereits in der Blade-Datei initialisiert wurde // Wir prüfen, ob die Summernote-Instanz bereits existiert, indem wir nach der data-summernote Eigenschaft suchen if ( typeof $.summernote !== "undefined" && $(".summernote").length > 0 && !$(".summernote").data("summernote") ) { // DANACH die Editoren initialisieren, nur wenn sie nicht bereits initialisiert wurden $(".summernote").summernote({ height: 140, lang: "de-DE", container: "body", styleTags: ["p", "blockquote", "pre", "h1", "h2", "h3", "h4", "h5", "h6"], prettifyHtml: false, toolbar: [ // [groupName, [list of button]] ["style", ["style"]], ["style", ["bold", "italic", "underline", "clear"]], ["fontsize", ["fontsize"]], ["color", ["color"]], ["para", ["ul", "ol", "paragraph"]], ["insert", ["customList", "link", "picture", "video"]], ["height", ["height"]], ["view", ["fullscreen", "codeview", "help"]], ], cleaner: { action: "both", // both|button|paste 'button' only cleans via toolbar button, 'paste' only clean when pasting content, both does both options. newline: "
    ", // Summernote's default is to use '


    ' notStyle: "position:absolute;top:0;left:0;right:0", // Position of Notification icon: '[Your Button]', keepHtml: true, // Keep all Html formats keepOnlyTags: [ "

    ", "
    ", "