diff options
Diffstat (limited to 'webclient/app-directive.js')
-rw-r--r-- | webclient/app-directive.js | 50 |
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); } - }; } -]);; +}); |