angular-summernote
Advanced tools
Comparing version
{ | ||
"name": "angular-summernote", | ||
"description": "AngularJS directive to Summernote", | ||
"version": "0.3.2", | ||
"version": "0.4.0", | ||
"main": [ | ||
@@ -36,3 +36,3 @@ "./dist/angular-summernote.js" | ||
"dependencies": { | ||
"summernote": "~0.6.0", | ||
"summernote": "~0.6.4", | ||
"angular": "~1.3.0" | ||
@@ -42,3 +42,3 @@ }, | ||
"angular-1.2": "https://raw.githubusercontent.com/angular/bower-angular/v1.2.26/angular.min.js", | ||
"chai": "~1.10.0", | ||
"chai": "~2.3.0", | ||
"angular-mocks": "~1.3.0", | ||
@@ -45,0 +45,0 @@ "angular-mocks-1.2": "https://raw.githubusercontent.com/angular/bower-angular-mocks/v1.2.26/angular-mocks.js" |
@@ -0,1 +1,11 @@ | ||
# 0.4.0 (2015-05-25) | ||
## Breaking changes | ||
* Support Summernote v0.6.4+. It's not compatible with the version under v0.6.4. | ||
If you use summernote v0.6.3-, use angular-summernote v0.3.2. | ||
* Now, editor object exposed via `editor` attribute. | ||
## Features | ||
* Support `ngModelOptions` | ||
* Support `onToolbarClick` event | ||
* Publish in npm registry | ||
# 0.3.2 (2015-02-13) | ||
@@ -2,0 +12,0 @@ * bug fixes |
@@ -25,12 +25,11 @@ /** | ||
summernoteConfig.oninit = $scope.init; | ||
summernoteConfig.onenter = function(evt) { $scope.enter({evt:evt}); }; | ||
summernoteConfig.onfocus = function(evt) { $scope.focus({evt:evt}); }; | ||
summernoteConfig.onblur = function(evt) { $scope.blur({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}); }; | ||
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}); }; | ||
if (angular.isDefined($attrs.onImageUpload)) { | ||
summernoteConfig.onImageUpload = function(files, editor) { | ||
$scope.imageUpload({files:files, editor:editor, editable: $scope.editable}); | ||
summernoteConfig.onImageUpload = function(files) { | ||
$scope.imageUpload({files:files, editable: $scope.editable}); | ||
}; | ||
@@ -40,10 +39,8 @@ } | ||
this.activate = function(scope, element, ngModel) { | ||
var promise; | ||
var updateNgModel = function() { | ||
var newValue = element.code(); | ||
if (ngModel && ngModel.$viewValue !== newValue) { | ||
if (promise) { $timeout.cancel(promise); } | ||
var promise = $timeout(function() { | ||
$timeout(function() { | ||
ngModel.$setViewValue(newValue); | ||
}, 400); | ||
}, 0); | ||
} | ||
@@ -56,2 +53,11 @@ }; | ||
}; | ||
summernoteConfig.onBlur = function(evt) { | ||
element.blur(); | ||
$scope.blur({evt:evt}); | ||
}; | ||
if (angular.isDefined($attrs.onToolbarClick)) { | ||
element.on('summernote.toolbar.click', function (evt) { | ||
$scope.toolbarClick({evt: evt}); | ||
}); | ||
} | ||
@@ -93,2 +99,5 @@ element.summernote(summernoteConfig); | ||
} | ||
if (angular.isDefined($attrs.editor)) { | ||
$scope.editor = element; | ||
} | ||
@@ -122,2 +131,3 @@ currentElement = element; | ||
editable: '=', | ||
editor: '=', | ||
init: '&onInit', | ||
@@ -131,2 +141,3 @@ enter: '&onEnter', | ||
change: '&onChange', | ||
toolbarClick: '&onToolbarClick', | ||
imageUpload: '&onImageUpload' | ||
@@ -133,0 +144,0 @@ }, |
/* | ||
angular-summernote v0.3.2 | ||
angular-summernote v0.4.0 | ||
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.onblur=function(evt){$scope.blur({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,editor){$scope.imageUpload({files:files,editor:editor,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})},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")),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:"=",init:"&onInit",enter:"&onEnter",focus:"&onFocus",blur:"&onBlur",paste:"&onPaste",keyup:"&onKeyup",keydown:"&onKeydown",change:"&onChange",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();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)}}}]); |
{ | ||
"name": "angular-summernote", | ||
"description": "AngularJS directive to Summernote", | ||
"version": "0.3.2", | ||
"version": "0.4.0", | ||
"author": { | ||
@@ -6,0 +6,0 @@ "name": "\"Outsider\" Jeonghoon Byun", |
@@ -28,3 +28,3 @@ # angular-summernote - [AngularJS](http://angularjs.org/) directive to [Summernote](http://summernote.org/) | ||
See at [JSFiddle](http://jsfiddle.net/outsider/n8dt4/158/embedded/result%2Chtml%2Cjs%2Ccss/) | ||
See at [JSFiddle](http://jsfiddle.net/outsider/n8dt4/198/embedded/result%2Chtml%2Cjs%2Ccss/) | ||
or run example in projects(need to run `bower install` before run) | ||
@@ -162,4 +162,4 @@ | ||
$scope.keydown = function(e) { console.log('Key is pressed:', e.keyCode); } | ||
$scope.imageUpload = function(files, editor) { | ||
console.log('image upload:', files, editor); | ||
$scope.imageUpload = function(files) { | ||
console.log('image upload:', files); | ||
console.log('image upload\'s editable:', $scope.editable); | ||
@@ -174,3 +174,4 @@ } | ||
on-keydown="keydown(evt)" on-change="change(contents)" | ||
on-image-upload="imageUpload(files, editor)" editable="editable"> | ||
on-toolbar-click="toolbarClick(evt)" | ||
on-image-upload="imageUpload(files)" editable="editable" editor="editor"> | ||
</summernote> | ||
@@ -181,5 +182,10 @@ ``` | ||
(see [summernote's callback](http://summernote.org/#/features#callbacks)), | ||
you should defined `editable` attribute and use it in `$scope`. | ||
you should define `editable` attribute and use it in `$scope`. | ||
(Because [AngularJS 1.3.x restricts access to DOM nodes from within expressions](https://docs.angularjs.org/error/$parse/isecdom)) | ||
Since summernote v0.6.4, APIs have been changed. So, If you use the verions, | ||
`onImageUpload` is not return `editor` object anymore. If you want to user | ||
`editor` object, you should define `editor` attribute and use it in `$scope`. | ||
Futhermore, you can use summernote's APIs via the `editor` object. | ||
### i18n Support | ||
@@ -186,0 +192,0 @@ |
@@ -25,11 +25,11 @@ /** | ||
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}); }; | ||
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}); }; | ||
if (angular.isDefined($attrs.onImageUpload)) { | ||
summernoteConfig.onImageUpload = function(files, editor) { | ||
$scope.imageUpload({files:files, editor:editor, editable: $scope.editable}); | ||
summernoteConfig.onImageUpload = function(files) { | ||
$scope.imageUpload({files:files, editable: $scope.editable}); | ||
}; | ||
@@ -52,6 +52,11 @@ } | ||
}; | ||
summernoteConfig.onblur = function(evt) { | ||
summernoteConfig.onBlur = function(evt) { | ||
element.blur(); | ||
$scope.blur({evt:evt}); | ||
}; | ||
if (angular.isDefined($attrs.onToolbarClick)) { | ||
element.on('summernote.toolbar.click', function (evt) { | ||
$scope.toolbarClick({evt: evt}); | ||
}); | ||
} | ||
@@ -93,2 +98,5 @@ element.summernote(summernoteConfig); | ||
} | ||
if (angular.isDefined($attrs.editor)) { | ||
$scope.editor = element; | ||
} | ||
@@ -122,2 +130,3 @@ currentElement = element; | ||
editable: '=', | ||
editor: '=', | ||
init: '&onInit', | ||
@@ -131,2 +140,3 @@ enter: '&onEnter', | ||
change: '&onChange', | ||
toolbarClick: '&onToolbarClick', | ||
imageUpload: '&onImageUpload' | ||
@@ -133,0 +143,0 @@ }, |
@@ -340,3 +340,2 @@ /** | ||
var timer = setInterval(function() { | ||
$timeout.flush(); | ||
if (element.code() !== text) { | ||
@@ -364,3 +363,3 @@ expect(element.code()).to.match(/gravatar/); | ||
it('oninit should be invoked', function(done) { | ||
it('onInit should be invoked', function(done) { | ||
scope.init = function() { | ||
@@ -374,3 +373,3 @@ expect(true).to.be.true; | ||
it('onenter should be invoked', function(done) { | ||
it('onEnter should be invoked', function(done) { | ||
scope.enter = function() { | ||
@@ -386,4 +385,4 @@ // then | ||
// when | ||
var e= jQuery.Event('keypress'); | ||
// e.keyCode = 13; // Enter key | ||
var e= jQuery.Event('keydown'); | ||
e.keyCode = 13; // Enter key | ||
element.next().find('.note-editable').trigger(e); | ||
@@ -396,3 +395,3 @@ scope.$digest(); | ||
it('onfocus should be invoked', function(done) { | ||
it('onFocus should be invoked', function(done) { | ||
scope.focus = function(e) { | ||
@@ -415,3 +414,3 @@ // then | ||
it('onblur should be invoked', function(done) { | ||
it('onBlur should be invoked', function(done) { | ||
scope.blur = function(e) { | ||
@@ -434,3 +433,3 @@ // then | ||
it('onpaste should be invoked', function(done) { | ||
it('onPaste should be invoked', function(done) { | ||
scope.paste = function() { | ||
@@ -456,3 +455,3 @@ // then | ||
it('onkeyup should be invoked', function(done) { | ||
it('onKeyup should be invoked', function(done) { | ||
scope.keyup = function(e) { | ||
@@ -475,3 +474,3 @@ // then | ||
it('onkeydown should be invoked', function(done) { | ||
it('onKeydown should be invoked', function(done) { | ||
scope.keydown = function(e) { | ||
@@ -532,2 +531,20 @@ // then | ||
it('onToolbarClick should be invoked', function(done) { | ||
scope.click = function(e) { | ||
// then | ||
expect(e).to.be.exist; | ||
done(); | ||
}; | ||
// given | ||
var el = $('<summernote on-toolbar-click="click(evt)"></summernote>').appendTo(document.body); | ||
var element = $compile(el)(scope); | ||
scope.$digest(); | ||
// when | ||
element.next().find('.note-toolbar').click(); | ||
scope.$digest(); | ||
// tear down | ||
el.next().remove(); | ||
el.remove(); | ||
}); | ||
// TODO: add tests for onImageUpload | ||
@@ -555,2 +572,21 @@ }); | ||
describe('"editor" attribute', function() { | ||
var scope; | ||
beforeEach(function() { | ||
scope = $rootScope.$new(); | ||
}); | ||
it('should be assigned as editor object', function () { | ||
var el = $('<summernote editor="snote"></summernote>'); | ||
var element = $compile(el)(scope); | ||
scope.$digest(); | ||
expect(element.get(0)).to.be.equal(scope.snote.get(0)); | ||
el.next().remove(); | ||
el.remove(); | ||
}); | ||
}); | ||
}); |
Sorry, the diff of this file is not supported yet
227
2.71%60164
-51.46%25
-16.67%1095
-1.79%