summary refs log tree commit diff
path: root/webclient/app-directive.js
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--webclient/app-directive.js50
1 files changed, 38 insertions, 12 deletions
diff --git a/webclient/app-directive.js b/webclient/app-directive.js
index d788475f46..c1ba0af3a9 100644
--- a/webclient/app-directive.js
+++ b/webclient/app-directive.js
@@ -41,18 +41,44 @@ angular.module('matrixWebClient')
         }
     };
 }])
-.directive('elastic', [ // http://stackoverflow.com/questions/17772260/textarea-auto-height
-    '$timeout',
-    function($timeout) {
-      return {
+.directive('asjson', function() {
+    return {
         restrict: 'A',
-        link: function($scope, element) {
-          var resize = function() {
-            return element[0].style.height = "" + element[0].scrollHeight + "px";
-          };
-          element.on("blur keyup change", resize);
-          $timeout(resize, 10);
+        require: 'ngModel',
+        link: function (scope, element, attrs, ngModelCtrl) {
+            function isValidJson(model) {
+                var flag = true;
+                try {
+                    angular.fromJson(model);
+                } catch (err) {
+                    flag = false;
+                }
+                return flag;
+            };
+
+            function string2JSON(text) {
+                try {
+                    var j = angular.fromJson(text);
+                    ngModelCtrl.$setValidity('json', true);
+                    return j;
+                } catch (err) {
+                    //returning undefined results in a parser error as of angular-1.3-rc.0, and will not go through $validators
+                    //return undefined
+                    ngModelCtrl.$setValidity('json', false);
+                    return text;
+                }
+            };
+
+            function JSON2String(object) {
+                return angular.toJson(object, true);
+            };
+
+            //$validators is an object, where key is the error
+            //ngModelCtrl.$validators.json = isValidJson;
+
+            //array pipelines
+            ngModelCtrl.$parsers.push(string2JSON);
+            ngModelCtrl.$formatters.push(JSON2String);
         }
-      };
     }
-]);;
+});