X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=ang%2FcrmUi.js;h=20ee8b1a8f10af7da538e118becc24499a43b7ee;hb=a02c849585aba900804a0a2a25d9b736237dbd91;hp=87d15f7f6070d875dd053fb0f838836e5a7a4348;hpb=4e279c705117b7cb6f71e89a0605a0938885862b;p=civicrm-core.git diff --git a/ang/crmUi.js b/ang/crmUi.js index 87d15f7f60..20ee8b1a8f 100644 --- a/ang/crmUi.js +++ b/ang/crmUi.js @@ -1083,13 +1083,60 @@ }; }) + // Editable text using ngModel & html5 contenteditable + // Usage: {{ my.data }} + .directive("crmUiEditable", function() { + return { + restrict: "A", + require: "ngModel", + scope: { + defaultValue: '=' + }, + link: function(scope, element, attrs, ngModel) { + var ts = CRM.ts(); + + function read() { + var htmlVal = element.html(); + if (!htmlVal) { + htmlVal = scope.defaultValue || ''; + element.text(htmlVal); + } + ngModel.$setViewValue(htmlVal); + } + + ngModel.$render = function() { + element.text(ngModel.$viewValue || scope.defaultValue || ''); + }; + + // Special handling for enter and escape keys + element.on('keydown', function(e) { + // Enter: prevent line break and save + if (e.which === 13) { + e.preventDefault(); + element.blur(); + } + // Escape: undo + if (e.which === 27) { + element.text(ngModel.$viewValue || scope.defaultValue || ''); + element.blur(); + } + }); + + element.on("blur change", function() { + scope.$apply(read); + }); + + element.attr('contenteditable', 'true').addClass('crm-editable-enabled'); + } + }; + }) + .run(function($rootScope, $location) { /// Example: $rootScope.goto = function(path) { $location.path(path); }; // useful for debugging: $rootScope.log = console.log || function() {}; - }) - ; + }); })(angular, CRM.$, CRM._);