/** * (c) Copyright by authors of the Tiki Wiki CMS Groupware Project * * All Rights Reserved. See copyright.txt for details and a complete list of authors. * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details. * $Id$ * * Handles wiki plugin edit forms */ (function ($) { /* wikiplugin editor */ window.popupPluginForm = function (area_id, type, index, pageName, pluginArgs, bodyContent, edit_icon, selectedMod) { var $textArea = $("#" + area_id); if ($textArea.length && $textArea[0].createTextRange) { // save selection for IE storeTASelection(area_id); } var container = $('
'); if (!index) { index = 0; } if (!pageName && jqueryTiki.current_object && jqueryTiki.current_object.type === "wiki page") { pageName = jqueryTiki.current_object.object; } var textarea = $textArea[0]; var replaceText = false; if (!pluginArgs && !bodyContent) { pluginArgs = {}; bodyContent = ""; dialogSelectElement(area_id, '{' + type.toUpperCase(), '{' + type.toUpperCase() + '}'); var sel = getTASelection(textarea); if (sel && sel.length > 0) { sel = sel.replace(/^\s\s*/, "").replace(/\s\s*$/g, ""); // trim if (sel.length > 0 && sel.substring(0, 1) === '{') { // whole plugin selected var l = type.length, thisType = sel.match(/\{(\w+)/); thisType = thisType[1].toUpperCase(); if (thisType === type.toUpperCase()) { // same plugin var rx = new RegExp("{" + type + "[\\(]?([\\s\\S^\\)]*?)[\\)]?}([\\s\\S]*){" + type + "}", "mi"); // using \s\S matches all chars including lineends var m = sel.match(rx); if (!m) { rx = new RegExp("{" + type + "[\\(]?([\\s\\S^\\)]*?)[\\)]?}([\\s\\S]*)", "mi"); // no closing tag m = sel.match(rx); } if (m) { var paramStr = m[1]; bodyContent = m[2]; var pm = paramStr.match(/([^=]*)=\"([^\"]*)\"\s?/gi); if (pm) { for (var i = 0; i < pm.length; i++) { var ar = pm[i].split("="); if (ar.length) { // add cleaned vals to params object pluginArgs[ar[0].replace(/^[,\s\"\(\)]*/g, "")] = ar[1].replace(/^[,\s\"\(\)]*/g, "").replace(/[,\s\"\(\)]*$/g, ""); } } } } replaceText = sel; } else if (confirm("Click OK to include the " + thisType + " plugin inside a " + type.toUpperCase() + " plugin. Click Cancel to edit the " + thisType + " plugin.")) { bodyContent = sel; replaceText = true; } else { // different plugin, try again with the selected plugin type window.popupPluginForm(area_id, thisType, index, pageName, null, "", edit_icon, selectedMod); return; } } else { // not (this) plugin if (type === 'mouseover') { // For MOUSEOVER, we want the selected text as label instead of body bodyContent = ''; pluginArgs = {}; pluginArgs['label'] = sel; } else { bodyContent = sel; } replaceText = true; } } else { // no selection replaceText = false; } } var $modal; if (selectedMod) { replaceText = getTASelection(textarea); $modal = $('body > .modal.fade.show').first(); // if selecting a new module then reuse the existing modal } else { $modal = $('body > .modal.fade:not(.show)').first(); } var url = $.service("plugin", "edit", { area_id: area_id, type: type, index: index, page: pageName, pluginArgs: pluginArgs, bodyContent: bodyContent, edit_icon: !!edit_icon ? 1 : 0, selectedMod: selectedMod ? selectedMod : "", modal: 1 }); // START BOOTSTRAP 4 CHANGE // Make the form load into the modal var prepareModal = function () { // Bind remote loaded event // enables conditional display of inputs with a "parentparam" selector handlePluginFieldsHierarchy(); // bind form button events and form validation handleFormSubmit($modal, type, edit_icon, area_id, replaceText); // Trigger jQuery event 'plugin_#type#_ready' (see plugin_code_ready in codemirror_tiki.js for example) $document .trigger({ type: 'plugin_' + type + '_ready', container: container, arguments: arguments, modal: $modal }) .trigger({ type: 'plugin_ready', container: container, arguments: arguments, modal: $modal }); if (jqueryTiki.select2) { $(this).applySelect2(); } if ($modal.is(":visible")) { $modal.trigger("tiki.modal.redraw"); return; } // actually show the modal now $('.modal-dialog', $modal).addClass("modal-lg"); $modal.modal("show"); if ($("form", this).length && edit_icon) { $modal.one("hidden.bs.modal", function () { // unset semaphore on object/page on cancel $.getJSON($.service("semaphore", "unset"), { object_id: pageName }); }); } }; $modal.find(".modal-content").load(url, function () { prepareModal(); }); // END BOOTSTRAP 4 CHANGE }; /* * Hides all children fields in a wiki-plugin form and * add javascript events to display them when the appropriate * values are selected in the parentparam fields. */ function handlePluginFieldsHierarchy() { var $container = $('#plugin_params'); var parents = {}; $("[data-parent_name]", $container).each(function () { var parentName = $(this).data("parent_name"), parentValue = $(this).data("parent_value"); if (parentName) { var $parent = $('[name$="params[' + parentName + ']"]', $container); var $row = $(this).parents(".form-group"); $row.addClass('parent_' + parentName + '_' + parentValue); if ($parent.val() !== parentValue) { if (!$parent.val() && $("input, select", $row).val()) { $parent.val(parentValue); } else { $row.hide(); } } if (!parents[parentName]) { parents[parentName] = { children: [], parentElement: $parent }; } parents[parentName]['children'].push($(this).attr("id")); } }); $.each(parents, function (parentName, parent) { parent.parentElement.change(function () { $.each(parent.children, function (index, id) { $container.find('#' + id).parents(".form-group").hide(); }); $container.find('.parent_' + parentName + '_' + this.value).show(); }) .change().trigger("change.select2"); }); } /** * set up insert/replace button and submit handler in "textarea" edit mode * * @param container * @param type * @param edit_icon * @param area_id * @param replaceText */ function handleFormSubmit(container, type, edit_icon, area_id, replaceText) { var params = [], viewPageMode = !!edit_icon, bodyContent = ""; var $form = $("form", container); $form.submit(function () { if (typeof process_submit === "function" && ! process_submit(this)) { return false; } if (type === "list" && ! viewPageMode && typeof jqueryTiki.plugins.list.saveToTextarea === "function") { jqueryTiki.plugins.list.saveToTextarea(); } $("[name^=params]", $form).each(function () { var name = $(this).attr("name"), matches = name.match(/params\[(.*)\]/), val = $(this).val(); if (!matches) { // it's not a parameter, skip if (name === "content") { bodyContent = $(this).val(); } return; } if (val && ! viewPageMode) { val = val.toString(); val = val.replace(/"/g, '\\"'); // escape double quotes params.push(matches[1] + '="' + val + '"'); } }); var blob, pluginContentTextarea = $("[name=content]", $form), pluginContentTextareaEditor = syntaxHighlighter.get(pluginContentTextarea); if (! viewPageMode) { if (!bodyContent) { bodyContent = (pluginContentTextareaEditor ? pluginContentTextareaEditor.getValue() : pluginContentTextarea.val()); } if (bodyContent) { blob = '{' + type.toUpperCase() + '(' + params.join(' ') + ')}' + bodyContent + '{' + type.toUpperCase() + '}'; } else { blob = '{' + type.toLowerCase() + (params.length ? ' ' : '') + params.join(' ') + '}'; } insertAt(area_id, blob, false, false, replaceText); $form.parents(".modal").modal("hide"); return false; } return true; }); } })(jQuery);