angular-summernote
Advanced tools
Comparing version
{ | ||
"name": "angular-summernote", | ||
"description": "AngularJS directive to Summernote", | ||
"version": "0.4.0", | ||
"version": "0.4.1", | ||
"main": [ | ||
@@ -6,0 +6,0 @@ "./dist/angular-summernote.js" |
@@ -0,1 +1,8 @@ | ||
# 0.4.1 (2015-08-17) | ||
* bug fixes | ||
* fix "Maximum call stack size exceeded" error in airmode | ||
[#62](https://github.com/summernote/angular-summernote/issues/62) | ||
* clean ngModel when content is empty | ||
[#53](https://github.com/summernote/angular-summernote/issues/53) | ||
# 0.4.0 (2015-05-25) | ||
@@ -6,2 +13,3 @@ ## Breaking changes | ||
* Now, editor object exposed via `editor` attribute. | ||
## Features | ||
@@ -8,0 +16,0 @@ * Support `ngModelOptions` |
@@ -40,2 +40,3 @@ /** | ||
var newValue = element.code(); | ||
if (element.summernote('isEmpty')) { newValue = ''; } | ||
if (ngModel && ngModel.$viewValue !== newValue) { | ||
@@ -49,2 +50,3 @@ $timeout(function() { | ||
summernoteConfig.onChange = function(contents) { | ||
if (element.summernote('isEmpty')) { contents = ''; } | ||
updateNgModel(); | ||
@@ -54,3 +56,3 @@ $scope.change({contents:contents, editable: $scope.editable}); | ||
summernoteConfig.onBlur = function(evt) { | ||
element.blur(); | ||
(!summernoteConfig.airMode) && element.blur(); | ||
$scope.blur({evt:evt}); | ||
@@ -57,0 +59,0 @@ }; |
/* | ||
angular-summernote v0.4.0 | ||
angular-summernote v0.4.1 | ||
Copyright 2014 Jeonghoon Byun | ||
License: MIT | ||
*/ | ||
angular.module("summernote",[]).controller("SummernoteController",["$scope","$attrs","$timeout",function($scope,$attrs,$timeout){"use strict";var currentElement,summernoteConfig=$scope.summernoteConfig||{};if(angular.isDefined($attrs.height)&&(summernoteConfig.height=$attrs.height),angular.isDefined($attrs.focus)&&(summernoteConfig.focus=!0),angular.isDefined($attrs.airmode)&&(summernoteConfig.airMode=!0),angular.isDefined($attrs.lang)){if(!angular.isDefined($.summernote.lang[$attrs.lang]))throw new Error('"'+$attrs.lang+'" lang file must be exist.');summernoteConfig.lang=$attrs.lang}summernoteConfig.onInit=$scope.init,summernoteConfig.onEnter=function(evt){$scope.enter({evt:evt})},summernoteConfig.onFocus=function(evt){$scope.focus({evt:evt})},summernoteConfig.onPaste=function(evt){$scope.paste({evt:evt})},summernoteConfig.onKeyup=function(evt){$scope.keyup({evt:evt})},summernoteConfig.onKeydown=function(evt){$scope.keydown({evt:evt})},angular.isDefined($attrs.onImageUpload)&&(summernoteConfig.onImageUpload=function(files){$scope.imageUpload({files:files,editable:$scope.editable})}),this.activate=function(scope,element,ngModel){var updateNgModel=function(){var newValue=element.code();ngModel&&ngModel.$viewValue!==newValue&&$timeout(function(){ngModel.$setViewValue(newValue)},0)};summernoteConfig.onChange=function(contents){updateNgModel(),$scope.change({contents:contents,editable:$scope.editable})},summernoteConfig.onBlur=function(evt){element.blur(),$scope.blur({evt:evt})},angular.isDefined($attrs.onToolbarClick)&&element.on("summernote.toolbar.click",function(evt){$scope.toolbarClick({evt:evt})}),element.summernote(summernoteConfig);var unwatchNgModel,editor$=element.next(".note-editor");editor$.find(".note-toolbar").click(function(){updateNgModel(),editor$.hasClass("codeview")?(editor$.on("keyup",updateNgModel),ngModel&&(unwatchNgModel=scope.$watch(function(){return ngModel.$modelValue},function(newValue){editor$.find(".note-codable").val(newValue)}))):(editor$.off("keyup",updateNgModel),angular.isFunction(unwatchNgModel)&&unwatchNgModel())}),ngModel&&(ngModel.$render=function(){element.code(ngModel.$viewValue||"")}),angular.isDefined($attrs.editable)&&($scope.editable=editor$.find(".note-editable")),angular.isDefined($attrs.editor)&&($scope.editor=element),currentElement=element,element.on("$destroy",function(){element.destroy(),$scope.summernoteDestroyed=!0})},$scope.$on("$destroy",function(){$scope.summernoteDestroyed||currentElement.destroy()})}]).directive("summernote",[function(){"use strict";return{restrict:"EA",transclude:!0,replace:!0,require:["summernote","^?ngModel"],controller:"SummernoteController",scope:{summernoteConfig:"=config",editable:"=",editor:"=",init:"&onInit",enter:"&onEnter",focus:"&onFocus",blur:"&onBlur",paste:"&onPaste",keyup:"&onKeyup",keydown:"&onKeydown",change:"&onChange",toolbarClick:"&onToolbarClick",imageUpload:"&onImageUpload"},template:'<div class="summernote"></div>',link:function(scope,element,attrs,ctrls){var summernoteController=ctrls[0],ngModel=ctrls[1];summernoteController.activate(scope,element,ngModel)}}}]); | ||
angular.module("summernote",[]).controller("SummernoteController",["$scope","$attrs","$timeout",function($scope,$attrs,$timeout){"use strict";var currentElement,summernoteConfig=$scope.summernoteConfig||{};if(angular.isDefined($attrs.height)&&(summernoteConfig.height=$attrs.height),angular.isDefined($attrs.focus)&&(summernoteConfig.focus=!0),angular.isDefined($attrs.airmode)&&(summernoteConfig.airMode=!0),angular.isDefined($attrs.lang)){if(!angular.isDefined($.summernote.lang[$attrs.lang]))throw new Error('"'+$attrs.lang+'" lang file must be exist.');summernoteConfig.lang=$attrs.lang}summernoteConfig.onInit=$scope.init,summernoteConfig.onEnter=function(evt){$scope.enter({evt:evt})},summernoteConfig.onFocus=function(evt){$scope.focus({evt:evt})},summernoteConfig.onPaste=function(evt){$scope.paste({evt:evt})},summernoteConfig.onKeyup=function(evt){$scope.keyup({evt:evt})},summernoteConfig.onKeydown=function(evt){$scope.keydown({evt:evt})},angular.isDefined($attrs.onImageUpload)&&(summernoteConfig.onImageUpload=function(files){$scope.imageUpload({files:files,editable:$scope.editable})}),this.activate=function(scope,element,ngModel){var updateNgModel=function(){var newValue=element.code();element.summernote("isEmpty")&&(newValue=""),ngModel&&ngModel.$viewValue!==newValue&&$timeout(function(){ngModel.$setViewValue(newValue)},0)};summernoteConfig.onChange=function(contents){element.summernote("isEmpty")&&(contents=""),updateNgModel(),$scope.change({contents:contents,editable:$scope.editable})},summernoteConfig.onBlur=function(evt){!summernoteConfig.airMode&&element.blur(),$scope.blur({evt:evt})},angular.isDefined($attrs.onToolbarClick)&&element.on("summernote.toolbar.click",function(evt){$scope.toolbarClick({evt:evt})}),element.summernote(summernoteConfig);var unwatchNgModel,editor$=element.next(".note-editor");editor$.find(".note-toolbar").click(function(){updateNgModel(),editor$.hasClass("codeview")?(editor$.on("keyup",updateNgModel),ngModel&&(unwatchNgModel=scope.$watch(function(){return ngModel.$modelValue},function(newValue){editor$.find(".note-codable").val(newValue)}))):(editor$.off("keyup",updateNgModel),angular.isFunction(unwatchNgModel)&&unwatchNgModel())}),ngModel&&(ngModel.$render=function(){element.code(ngModel.$viewValue||"")}),angular.isDefined($attrs.editable)&&($scope.editable=editor$.find(".note-editable")),angular.isDefined($attrs.editor)&&($scope.editor=element),currentElement=element,element.on("$destroy",function(){element.destroy(),$scope.summernoteDestroyed=!0})},$scope.$on("$destroy",function(){$scope.summernoteDestroyed||currentElement.destroy()})}]).directive("summernote",[function(){"use strict";return{restrict:"EA",transclude:!0,replace:!0,require:["summernote","^?ngModel"],controller:"SummernoteController",scope:{summernoteConfig:"=config",editable:"=",editor:"=",init:"&onInit",enter:"&onEnter",focus:"&onFocus",blur:"&onBlur",paste:"&onPaste",keyup:"&onKeyup",keydown:"&onKeydown",change:"&onChange",toolbarClick:"&onToolbarClick",imageUpload:"&onImageUpload"},template:'<div class="summernote"></div>',link:function(scope,element,attrs,ctrls){var summernoteController=ctrls[0],ngModel=ctrls[1];summernoteController.activate(scope,element,ngModel)}}}]); |
{ | ||
"name": "angular-summernote", | ||
"description": "AngularJS directive to Summernote", | ||
"version": "0.4.0", | ||
"version": "0.4.1", | ||
"author": { | ||
@@ -6,0 +6,0 @@ "name": "\"Outsider\" Jeonghoon Byun", |
@@ -40,2 +40,3 @@ /** | ||
var newValue = element.code(); | ||
if (element.summernote('isEmpty')) { newValue = ''; } | ||
if (ngModel && ngModel.$viewValue !== newValue) { | ||
@@ -49,2 +50,3 @@ $timeout(function() { | ||
summernoteConfig.onChange = function(contents) { | ||
if (element.summernote('isEmpty')) { contents = ''; } | ||
updateNgModel(); | ||
@@ -54,3 +56,3 @@ $scope.change({contents:contents, editable: $scope.editable}); | ||
summernoteConfig.onBlur = function(evt) { | ||
element.blur(); | ||
(!summernoteConfig.airMode) && element.blur(); | ||
$scope.blur({evt:evt}); | ||
@@ -57,0 +59,0 @@ }; |
@@ -330,3 +330,3 @@ /** | ||
$(element.next().find('.note-insert').eq(1).find('button').eq(1)).click(); // image | ||
$(element.next().find('.note-insert').eq(0).find('button').eq(1)).click(); // image | ||
@@ -403,3 +403,4 @@ expect(element.next().find('.note-image-dialog')).to.length(1); | ||
// when | ||
element.next().find('.note-editable').focus(); | ||
// TODO: check the reason why it need triggering focus twice | ||
element.next().find('.note-editable').focus().focus(); | ||
scope.$digest(); | ||
@@ -406,0 +407,0 @@ // tear down |
129993
116.06%32
28%1171
6.94%