Wysiwyg js optimizations
authorColeman Watts <coleman@civicrm.org>
Tue, 6 Dec 2016 23:19:14 +0000 (18:19 -0500)
committerColeman Watts <coleman@civicrm.org>
Tue, 6 Dec 2016 23:19:14 +0000 (18:19 -0500)
CRM/Core/Resources.php
js/Common.js
js/wysiwyg/crm.ckeditor.js
js/wysiwyg/crm.wysiwyg.js

index d998717d43612a7bd4fcf40a4eb860fcc988b35b..847ae601d2291ad9b0a7478bd281c8f8fe1d7404 100644 (file)
@@ -727,9 +727,13 @@ class CRM_Core_Resources {
     // add wysiwyg editor
     $editor = Civi::settings()->get('editor_id');
     if ($editor == "CKEditor") {
-      $items[] = "js/wysiwyg/crm.ckeditor.js";
       CRM_Admin_Page_CKEditorConfig::setConfigDefault();
-      $items[] = array('config' => array('CKEditorCustomConfig' => CRM_Admin_Page_CKEditorConfig::getConfigUrl()));
+      $items[] = array(
+        'config' => array(
+          'wysisygScriptLocation' => Civi::paths()->getUrl("[civicrm.root]/js/wysiwyg/crm.ckeditor.js"),
+          'CKEditorCustomConfig' => CRM_Admin_Page_CKEditorConfig::getConfigUrl(),
+        ),
+      );
     }
 
     // These scripts are only needed by back-office users
index 5969aa270ed8565f5603512b6484487aeccc3523..43383ddf86e980767eb1ef8f37f6ce2081009a90 100644 (file)
@@ -237,6 +237,20 @@ if (!CRM.vars) CRM.vars = {};
     }
   };
 
+  var scriptsLoaded = {};
+  CRM.loadScript = function(url) {
+    if (!scriptsLoaded[url]) {
+      var script = document.createElement('script');
+      scriptsLoaded[url] = $.Deferred();
+      script.onload = function () {
+        scriptsLoaded[url].resolve();
+      };
+      script.src = url;
+      document.getElementsByTagName("head")[0].appendChild(script);
+    }
+    return scriptsLoaded[url];
+  };
+
   /**
    * Populate a select list, overwriting the existing options except for the placeholder.
    * @param select jquery selector - 1 or more select elements
index 422ee5711aee0da603b4436815b73e3a3da95175..21446ee482c9a99a175ba1456c0b28890958875e 100644 (file)
@@ -1,6 +1,5 @@
 // https://civicrm.org/licensing
 (function($, _) {
-  var scriptLoaded = false;
 
   function getInstance(item) {
     var name = $(item).attr("name"),
     }
   }
 
-  function loadScript(url) {
-    var deferred = $.Deferred(),
-      script = document.createElement('script');
-    script.onload = function() {deferred.resolve();};
-    script.src = url;
-    document.getElementsByTagName("head")[0].appendChild(script);
-    return deferred;
-  }
-
   CRM.wysiwyg.supportsFileUploads =  true;
 
-  CRM.wysiwyg.create = function(item) {
+  CRM.wysiwyg._create = function(item) {
     var deferred = $.Deferred();
 
     function onReady() {
       if (window.CKEDITOR) {
         initialize();
       } else {
-        if (scriptLoaded === false) {
-          scriptLoaded = loadScript(CRM.config.resourceBase + 'bower_components/ckeditor/ckeditor.js');
-        }
-        scriptLoaded.done(initialize);
+        CRM.loadScript(CRM.config.resourceBase + 'bower_components/ckeditor/ckeditor.js').done(initialize);
       }
     } else {
       deferred.reject();
index 54c86e81454c1e0a633413fcf5931f8ac6ba7278..d61bcdea82e44f93356c89aaf42e594a624de7c7 100644 (file)
@@ -3,9 +3,20 @@
   // This defines an interface which by default only handles plain textareas
   // A wysiwyg implementation can extend this by overriding as many of these functions as needed
   CRM.wysiwyg = {
-    supportsFileUploads: false,
-    create: function() {
-      return $.Deferred().resolve();
+    supportsFileUploads: !!CRM.config.wysisygScriptLocation,
+    create: function(item) {
+      var ret = $.Deferred();
+      // Lazy-load the wysiwyg js
+      if (CRM.config.wysisygScriptLocation) {
+        CRM.loadScript(CRM.config.wysisygScriptLocation).done(function() {
+          CRM.wysiwyg._create(item).done(function() {
+            ret.resolve();
+          });
+        });
+      } else {
+        ret.resolve();
+      }
+      return ret;
     },
     destroy: _.noop,
     updateElement: _.noop,