diff --git a/webclient/app-directive.js b/webclient/app-directive.js index d788475f4..c1ba0af3a 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); } - }; } -]);; +}); diff --git a/webclient/app.js b/webclient/app.js index 099e2170a..8d9b662ee 100644 --- a/webclient/app.js +++ b/webclient/app.js @@ -31,7 +31,8 @@ var matrixWebClient = angular.module('matrixWebClient', [ 'eventStreamService', 'eventHandlerService', 'infinite-scroll', - 'ui.bootstrap' + 'ui.bootstrap', + 'monospaced.elastic' ]); matrixWebClient.config(['$routeProvider', '$provide', '$httpProvider', diff --git a/webclient/index.html b/webclient/index.html index 35c805129..d8b9c9535 100644 --- a/webclient/index.html +++ b/webclient/index.html @@ -20,6 +20,7 @@ + diff --git a/webclient/room/room-controller.js b/webclient/room/room-controller.js index fcbcd7536..ce513990f 100644 --- a/webclient/room/room-controller.js +++ b/webclient/room/room-controller.js @@ -1018,6 +1018,13 @@ angular.module('RoomController', ['ngSanitize', 'matrixFilter', 'mFileInput']) }; $scope.openRoomInfo = function() { + var stateFilter = $filter("stateEventsFilter"); + var stateEvents = stateFilter($scope.events.rooms[$scope.room_id]); + // The modal dialog will 2-way bind this field, so we MUST make a deep + // copy of the state events else we will be *actually adjusing our view + // of the world* when fiddling with the JSON!! Apparently parse/stringify + // is faster than jQuery's extend when doing deep copies. + $scope.roomInfoStateEvents = JSON.parse(JSON.stringify(stateEvents)); var modalInstance = $modal.open({ templateUrl: 'roomInfoTemplate.html', controller: 'RoomInfoController', @@ -1040,7 +1047,9 @@ angular.module('RoomController', ['ngSanitize', 'matrixFilter', 'mFileInput']) console.log("Displaying room info."); $scope.submit = function(event) { - console.error("submit >>> " + JSON.stringify(event)); + if (event.content) { + console.error("submit >>> " + JSON.stringify(event)); + } }; $scope.dismiss = $modalInstance.dismiss; diff --git a/webclient/room/room.html b/webclient/room/room.html index cc79d6b77..627918223 100644 --- a/webclient/room/room.html +++ b/webclient/room/room.html @@ -16,7 +16,7 @@