From 12ce89328ad6c5bac06c93f31257a4e3fedc4dcb Mon Sep 17 00:00:00 2001
From: Henning Leutz <leutz@pcsg.de>
Date: Tue, 11 May 2021 17:10:13 +0200
Subject: [PATCH] feat: quiqqer/package-bricks#124

---
 bin/Editor.js                                 |  34 ++--
 plugins/quiqqer/quiqqerBricks/images/icon.jpg | Bin 0 -> 3263 bytes
 plugins/quiqqer/quiqqerBricks/lang/de.js      |   3 +
 plugins/quiqqer/quiqqerBricks/lang/en.js      |   3 +
 plugins/quiqqer/quiqqerBricks/plugin.js       | 149 ++++++++++++++++++
 5 files changed, 172 insertions(+), 17 deletions(-)
 create mode 100644 plugins/quiqqer/quiqqerBricks/images/icon.jpg
 create mode 100644 plugins/quiqqer/quiqqerBricks/lang/de.js
 create mode 100644 plugins/quiqqer/quiqqerBricks/lang/en.js
 create mode 100644 plugins/quiqqer/quiqqerBricks/plugin.js

diff --git a/bin/Editor.js b/bin/Editor.js
index c5fb9d3..f4d6990 100644
--- a/bin/Editor.js
+++ b/bin/Editor.js
@@ -247,23 +247,23 @@ define('package/quiqqer/ckeditor4/bin/Editor', [
                 }
 
                 window.CKEDITOR.replace(instance, {
-                    skinName                 : 'moono-lisa',
-                    customConfig             : '',
-                    language                 : Locale.getCurrent(),
-                    baseHref                 : URL_DIR,
-                    basePath                 : URL_DIR,
-                    height                   : height,
-                    width                    : width,
-                    toolbar                  : toolbar,
-                    allowedContent           : true,
-                    extraAllowedContent      : 'iframe(*)[*]{*}; img(*)[*]{*}; script(*)[*]{*}; ins(*)[*]{*}',
-                    protectedSource          : [/<ins[\s|\S]+?<\/ins>/g],
-                    stylesSet                : styles,
-                    contentsCss              : data.cssFiles || [],
-                    bodyClass                : data.bodyClass,
+                    skinName           : 'moono-lisa',
+                    customConfig       : '',
+                    language           : Locale.getCurrent(),
+                    baseHref           : URL_DIR,
+                    basePath           : URL_DIR,
+                    height             : height,
+                    width              : width,
+                    toolbar            : toolbar,
+                    allowedContent     : true,
+                    extraAllowedContent: 'iframe(*)[*]{*}; img(*)[*]{*}; script(*)[*]{*}; ins(*)[*]{*}',
+                    protectedSource    : [/<ins[\s|\S]+?<\/ins>/g],
+                    stylesSet          : styles,
+                    contentsCss        : data.cssFiles || [],
+                    bodyClass          : data.bodyClass,
                     // templates_files : [URL_OPT_DIR +'base/bin/pcsgEditorPlugins/templates.php'],
-                    baseFloatZIndex          : zIndex,
-                    extraPlugins             : extraPlugins,
+                    baseFloatZIndex: zIndex,
+                    extraPlugins   : extraPlugins,
                     //removePlugins            : 'scayt',
                     disableNativeSpellChecker: config.disableNativeSpellChecker,
                     autoGrow_onStartup       : false,
@@ -484,7 +484,7 @@ define('package/quiqqer/ckeditor4/bin/Editor', [
             var extra      = [],
                 buttonList = [];
 
-            if (typeOf(toolbar) == 'array') {
+            if (typeOf(toolbar) === 'array') {
                 buttonList = toolbar.flatten();
             }
 
diff --git a/plugins/quiqqer/quiqqerBricks/images/icon.jpg b/plugins/quiqqer/quiqqerBricks/images/icon.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..514edafb04edd14b7926738c66ebef4a2a5d6bc0
GIT binary patch
literal 3263
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

literal 0
HcmV?d00001

diff --git a/plugins/quiqqer/quiqqerBricks/lang/de.js b/plugins/quiqqer/quiqqerBricks/lang/de.js
new file mode 100644
index 0000000..8f879f9
--- /dev/null
+++ b/plugins/quiqqer/quiqqerBricks/lang/de.js
@@ -0,0 +1,3 @@
+CKEDITOR.plugins.setLang('quiqqerBricks', 'de', {
+    button: 'QUIQQER Bausteine'
+});
diff --git a/plugins/quiqqer/quiqqerBricks/lang/en.js b/plugins/quiqqer/quiqqerBricks/lang/en.js
new file mode 100644
index 0000000..10dcdb9
--- /dev/null
+++ b/plugins/quiqqer/quiqqerBricks/lang/en.js
@@ -0,0 +1,3 @@
+CKEDITOR.plugins.setLang('quiqqerBricks', 'en', {
+    button: 'QUIQQER Bricks'
+});
diff --git a/plugins/quiqqer/quiqqerBricks/plugin.js b/plugins/quiqqer/quiqqerBricks/plugin.js
new file mode 100644
index 0000000..d610860
--- /dev/null
+++ b/plugins/quiqqer/quiqqerBricks/plugin.js
@@ -0,0 +1,149 @@
+(function () {
+    "use strict";
+
+    CKEDITOR.plugins.add('quiqqerBricks', {
+        icons: "icon",
+        lang : ['en', 'de'],
+
+        onLoad: function () {
+            // Register styles for placeholder widget frame.
+            CKEDITOR.addCss(
+                '.quiqqer_bricks_placeholder{' +
+                '   display: inline-block;' +
+                '   background-color:#dedede;' +
+                '   height: 200px;' +
+                '   margin-bottom: 10px;' +
+                '   width: 100%;' +
+                '}'
+            );
+        },
+
+        init: function (editor) {
+            var self = this;
+
+            this.$Editor = editor;
+
+            editor.ui.addButton('QuiqqerBricks', {
+                label  : editor.lang.quiqqerBricks.button,
+                toolbar: 'insert',
+                command: 'insert-quiqqer-brick',
+                icon   : this.path + 'images/icon.jpg'
+            });
+
+            editor.on('getData', function (evt) {
+                var Ghost = new Element('div', {
+                    html: evt.data.dataValue
+                });
+
+                var placeholders = Ghost.getElements('.quiqqer_bricks_placeholder');
+                var lang, project, brickid, textNode, PH;
+
+                for (var i = 0, len = placeholders.length; i < len; i++) {
+                    PH      = placeholders[i];
+                    brickid = PH.get('data-brickid');
+
+                    if (!brickid) {
+                        continue;
+                    }
+
+                    textNode = document.createTextNode("{{brick id=" + brickid + "}}");
+
+                    PH.parentNode.insertBefore(textNode, PH);
+                    PH.parentNode.removeChild(PH);
+                }
+
+                evt.data.dataValue = Ghost.get('html');
+            });
+
+
+            editor.on('setData', function (evt) {
+                var result;
+                var data = evt.data.dataValue;
+
+                if (data.indexOf('{{brick ') === -1) {
+                    return;
+                }
+
+                result = data.replace(
+                    /{{brick ([^}}]*)}}/g,
+                    function (match, contents, offset, input_string) {
+                        match = match.replace('{{brick ', '')
+                        match = match.replace('}}', '');
+                        match = match.trim();
+                        match = match.split(' ');
+
+                        var parts;
+                        var attributes = [];
+
+                        for (var m = 0, len = match.length; m < len; m++) {
+                            parts = match[m].trim().split('=');
+
+                            attributes[parts[0]] = parts[1];
+                        }
+
+                        if ("id" in attributes) {
+                            return '<div class="quiqqer_bricks_placeholder" ' +
+                                'data-brickid="' + attributes.id + '"' +
+                                '>&nbsp;</div>';
+                        }
+
+                        return "";
+                    }
+                );
+
+                evt.data.dataValue = result;
+            });
+
+
+            editor.addCommand('insert-quiqqer-brick', {
+                exec: function (editor) {
+                    require([
+                        'package/quiqqer/bricks/bin/Controls/backend/BrickSelectWindow'
+                    ], function (BrickSelectWindow) {
+                        // get project, if editor is in panel
+                        var Node    = editor.ui.contentsElement.$;
+                        var project = '';
+                        var lang    = '';
+
+                        if (Node.getParent('.qui-panel')) {
+                            var Panel = QUI.Controls.getById(
+                                Node.getParent('.qui-panel').get('data-quiid')
+                            );
+
+                            if (Panel && Panel.getType() === 'controls/projects/project/site/Panel') {
+                                var Site = Panel.getSite();
+
+                                project = Site.getProject().getName();
+                                lang    = Site.getProject().getLang();
+                            }
+                        }
+
+                        new BrickSelectWindow({
+                            project : project,
+                            lang    : lang,
+                            area    : 'content',
+                            multiple: false,
+                            events  : {
+                                onSubmit: function (Instance, bricks) {
+                                    self.insertBrick(
+                                        bricks[0].id,
+                                        bricks[0].project,
+                                        bricks[0].lang
+                                    );
+                                }
+                            }
+                        }).open();
+                    });
+                }
+            });
+        },
+
+        insertBrick: function (brickId, project, lang) {
+            this.$Editor.insertHtml(
+                '<div class="quiqqer_bricks_placeholder" ' +
+                '   data-brickid="' + brickId + '"' +
+                '>&nbsp;</div>'
+            );
+        }
+    });
+})();
-- 
GitLab