Merge pull request #6500 from LevityNL/master
[civicrm-core.git] / ang / crmUi.js
index cd61238787bcc711f0d24e3f9acb906915047aa1..f80ce39f18b6e6eafe391e89f4fb119d7e2f13d8 100644 (file)
 
     // Display an HTML blurb inside an IFRAME.
     // example: <iframe crm-ui-iframe="getHtmlContent()"></iframe>
+    // example:  <iframe crm-ui-iframe crm-ui-iframe-src="getUrl()"></iframe>
     .directive('crmUiIframe', function ($parse) {
       return {
         scope: {
-          crmUiIframe: '@' // expression which evalutes to HTML content
+          crmUiIframeSrc: '@', // expression which evaluates to a URL
+          crmUiIframe: '@' // expression which evaluates to HTML content
         },
         link: function (scope, elm, attrs) {
           var iframe = $(elm)[0];
           iframe.setAttribute('frameborder', '0');
 
           var refresh = function () {
-            // var iframeHtml = '<html><head><base target="_blank"></head><body onload="parent.document.getElementById(\'' + iframe.id + '\').style.height=document.body.scrollHeight + \'px\'"><scr' + 'ipt type="text/javascript" src="https://gist.github.com/' + iframeId + '.js"></sc' + 'ript></body></html>';
-            var iframeHtml = scope.$parent.$eval(attrs.crmUiIframe);
-
-            var doc = iframe.document;
-            if (iframe.contentDocument) {
-              doc = iframe.contentDocument;
-            }
-            else if (iframe.contentWindow) {
-              doc = iframe.contentWindow.document;
+            if (attrs.crmUiIframeSrc) {
+              iframe.setAttribute('src', scope.$parent.$eval(attrs.crmUiIframeSrc));
             }
+            else {
+              var iframeHtml = scope.$parent.$eval(attrs.crmUiIframe);
 
-            doc.open();
-            doc.writeln(iframeHtml);
-            doc.close();
+              var doc = iframe.document;
+              if (iframe.contentDocument) {
+                doc = iframe.contentDocument;
+              }
+              else if (iframe.contentWindow) {
+                doc = iframe.contentWindow.document;
+              }
+
+              doc.open();
+              doc.writeln(iframeHtml);
+              doc.close();
+            }
           };
 
           // If the iframe is in a dialog, respond to resize events
             });
           }
 
-          $(elm).on('paste change keypress', function() {
-            scope.$apply(function() {
-              ngModel.$setViewValue(CRM.wysiwyg.getVal(elm));
+          // CRM-16445 - When one inserts an image, none of these events seem to fire at the right time:
+          // afterCommandExec, afterInsertHtml, afterPaste, afterSetData, change, insertElement,
+          // insertHtml, insertText, pasteState. It seems that 'pasteState' is the general equivalent of
+          // what 'change' should be, except (in the case of image insertion) it fires too soon.
+          // The 'key' event is needed to detect changes in "Source" mode.
+          var debounce = null;
+          angular.forEach(['key', 'pasteState'], function(evName){
+            ck.on(evName, function(evt) {
+              $timeout.cancel(debounce);
+              debounce = $timeout(function() {
+                ngModel.$setViewValue(ck.getData());
+              }, 50);
             });
           });