From e94e2fb2182a655b4a48ee6a0edd779cda37a14a Mon Sep 17 00:00:00 2001 From: Outsider Date: Fri, 22 Jan 2016 18:27:26 +0900 Subject: [PATCH] release v0.7.1 --- CHANGELOG.md | 11 +++++++++++ README.md | 3 +-- bower.json | 2 +- dist/angular-summernote.js | 33 +++++++++++++++++++++++++++------ dist/angular-summernote.min.js | 4 ++-- gulpfile.js | 2 +- package.json | 2 +- 7 files changed, 44 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ee7852..a5f97cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,14 @@ +# 0.7.1 (2016-01-22) +* Fix a bug that load 2 editor on IE(it is a workaround) + [#98](https://github.com/summernote/angular-summernote/issues/98) +* Fix a bug when content is empty + [#105](https://github.com/summernote/angular-summernote/pull/105) +* Support placeholder, min height and max height options + [#97](https://github.com/summernote/angular-summernote/pull/97), + [#104](https://github.com/summernote/angular-summernote/pull/104) +* Supoort on-media-delete callback + [#92](https://github.com/summernote/angular-summernote/issues/92) + # 0.7.0 (2015-12-11) * Make compatible with summernote v0.7.0 diff --git a/README.md b/README.md index 2080a4f..fa5e9d5 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,6 @@ *** -[![Built with Grunt](https://cdn.gruntjs.com/builtwith.png)](http://gruntjs.com/) [![Build Status](https://travis-ci.org/summernote/angular-summernote.png?branch=master)](https://travis-ci.org/summernote/angular-summernote) [![Dependency Status](https://gemnasium.com/summernote/angular-summernote.png)](https://gemnasium.com/summernote/angular-summernote) [![Coverage Status](https://coveralls.io/repos/summernote/angular-summernote/badge.png)](https://coveralls.io/r/summernote/angular-summernote) @@ -32,7 +31,7 @@ v0.7.2. Angular-summernote will release patch update, such as v0.7.1, if only an ## Demo -See at [JSFiddle](http://jsfiddle.net/outsider/n8dt4/246/embedded/result%2Chtml%2Cjs%2Ccss/) +See at [JSFiddle](http://jsfiddle.net/outsider/n8dt4/271/embedded/result%2Chtml%2Cjs%2Ccss/) or run example in projects(need to run `bower install` before run) ## Installation diff --git a/bower.json b/bower.json index 43f2bac..6db8854 100644 --- a/bower.json +++ b/bower.json @@ -1,7 +1,7 @@ { "name": "angular-summernote", "description": "AngularJS directive to Summernote", - "version": "0.7.0", + "version": "0.7.1", "main": [ "./dist/angular-summernote.js" ], diff --git a/dist/angular-summernote.js b/dist/angular-summernote.js index d0b65e1..dfb426a 100644 --- a/dist/angular-summernote.js +++ b/dist/angular-summernote.js @@ -1,4 +1,4 @@ -/* angular-summernote v0.7.0 | (c) 2014, 2015 JeongHoon Byun | MIT license */ +/* angular-summernote v0.7.1 | (c) 2016 JeongHoon Byun | MIT license */ /* global angular */ angular.module('summernote', []) @@ -8,7 +8,10 @@ angular.module('summernote', []) var currentElement, summernoteConfig = $scope.summernoteConfig || {}; - if (angular.isDefined($attrs.height)) { summernoteConfig.height = $attrs.height; } + if (angular.isDefined($attrs.height)) { summernoteConfig.height = +$attrs.height; } + if (angular.isDefined($attrs.minHeight)) { summernoteConfig.minHeight = +$attrs.minHeight; } + if (angular.isDefined($attrs.maxHeight)) { summernoteConfig.maxHeight = +$attrs.maxHeight; } + if (angular.isDefined($attrs.placeholder)) { summernoteConfig.placeholder = $attrs.placeholder; } if (angular.isDefined($attrs.focus)) { summernoteConfig.focus = true; } if (angular.isDefined($attrs.airmode)) { summernoteConfig.airMode = true; } if (angular.isDefined($attrs.lang)) { @@ -30,6 +33,17 @@ angular.module('summernote', []) $scope.imageUpload({files:files, editable: $scope.editable}); }; } + if (angular.isDefined($attrs.onMediaDelete)) { + callbacks.onMediaDelete = function(target) { + // make new object that has information of target to avoid error:isecdom + var removedMedia = {attrs: {}}; + removedMedia.tagName = target[0].tagName; + angular.forEach(target[0].attributes, function(attr) { + removedMedia.attrs[attr.name] = attr.value; + }); + $scope.mediaDelete({target: removedMedia}); + } + } this.activate = function(scope, element, ngModel) { var updateNgModel = function() { @@ -43,8 +57,10 @@ angular.module('summernote', []) }; callbacks.onChange = function(contents) { - if (element.summernote('isEmpty')) { contents = ''; } - updateNgModel(); + $timeout(function() { + if (element.summernote('isEmpty')) { contents = ''; } + updateNgModel(); + }, 0); $scope.change({contents:contents, editable: $scope.editable}); }; callbacks.onBlur = function(evt) { @@ -79,7 +95,11 @@ angular.module('summernote', []) if (ngModel) { ngModel.$render = function() { - element.summernote('code', ngModel.$viewValue || ''); + if (ngModel.$viewValue) { + element.summernote('code', ngModel.$viewValue); + } else { + element.summernote('empty'); + } }; } @@ -127,7 +147,8 @@ angular.module('summernote', []) keyup: '&onKeyup', keydown: '&onKeydown', change: '&onChange', - imageUpload: '&onImageUpload' + imageUpload: '&onImageUpload', + mediaDelete: '&onMediaDelete' }, template: '
', link: function(scope, element, attrs, ctrls, transclude) { diff --git a/dist/angular-summernote.min.js b/dist/angular-summernote.min.js index e6702de..e4b1859 100644 --- a/dist/angular-summernote.min.js +++ b/dist/angular-summernote.min.js @@ -1,2 +1,2 @@ -/* angular-summernote v0.7.0 | (c) 2014, 2015 JeongHoon Byun | MIT license */ -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}var callbacks={};callbacks.onInit=$scope.init,callbacks.onEnter=function(evt){$scope.enter({evt:evt})},callbacks.onFocus=function(evt){$scope.focus({evt:evt})},callbacks.onPaste=function(evt){$scope.paste({evt:evt})},callbacks.onKeyup=function(evt){$scope.keyup({evt:evt})},callbacks.onKeydown=function(evt){$scope.keydown({evt:evt})},angular.isDefined($attrs.onImageUpload)&&(callbacks.onImageUpload=function(files){$scope.imageUpload({files:files,editable:$scope.editable})}),this.activate=function(scope,element,ngModel){var updateNgModel=function(){var newValue=element.summernote("code");element.summernote("isEmpty")&&(newValue=""),ngModel&&ngModel.$viewValue!==newValue&&$timeout(function(){ngModel.$setViewValue(newValue)},0)};callbacks.onChange=function(contents){element.summernote("isEmpty")&&(contents=""),updateNgModel(),$scope.change({contents:contents,editable:$scope.editable})},callbacks.onBlur=function(evt){!summernoteConfig.airMode&&element.blur(),$scope.blur({evt:evt})},summernoteConfig.callbacks=callbacks,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.summernote("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.summernote("destroy"),$scope.summernoteDestroyed=!0})},$scope.$on("$destroy",function(){$scope.summernoteDestroyed||currentElement.summernote("destroy")})}]).directive("summernote",[function(){"use strict";return{restrict:"EA",transclude:"element",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",imageUpload:"&onImageUpload"},template:'
',link:function(scope,element,attrs,ctrls,transclude){var summernoteController=ctrls[0],ngModel=ctrls[1];transclude(scope,function(clone,scope){element.append(clone.html())}),summernoteController.activate(scope,element,ngModel)}}}]); \ No newline at end of file +/* angular-summernote v0.7.1 | (c) 2016 JeongHoon Byun | MIT license */ +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.minHeight)&&(summernoteConfig.minHeight=+$attrs.minHeight),angular.isDefined($attrs.maxHeight)&&(summernoteConfig.maxHeight=+$attrs.maxHeight),angular.isDefined($attrs.placeholder)&&(summernoteConfig.placeholder=$attrs.placeholder),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}var callbacks={};callbacks.onInit=$scope.init,callbacks.onEnter=function(evt){$scope.enter({evt:evt})},callbacks.onFocus=function(evt){$scope.focus({evt:evt})},callbacks.onPaste=function(evt){$scope.paste({evt:evt})},callbacks.onKeyup=function(evt){$scope.keyup({evt:evt})},callbacks.onKeydown=function(evt){$scope.keydown({evt:evt})},angular.isDefined($attrs.onImageUpload)&&(callbacks.onImageUpload=function(files){$scope.imageUpload({files:files,editable:$scope.editable})}),angular.isDefined($attrs.onMediaDelete)&&(callbacks.onMediaDelete=function(target){var removedMedia={attrs:{}};removedMedia.tagName=target[0].tagName,angular.forEach(target[0].attributes,function(attr){removedMedia.attrs[attr.name]=attr.value}),$scope.mediaDelete({target:removedMedia})}),this.activate=function(scope,element,ngModel){var updateNgModel=function(){var newValue=element.summernote("code");element.summernote("isEmpty")&&(newValue=""),ngModel&&ngModel.$viewValue!==newValue&&$timeout(function(){ngModel.$setViewValue(newValue)},0)};callbacks.onChange=function(contents){$timeout(function(){element.summernote("isEmpty")&&(contents=""),updateNgModel()},0),$scope.change({contents:contents,editable:$scope.editable})},callbacks.onBlur=function(evt){!summernoteConfig.airMode&&element.blur(),$scope.blur({evt:evt})},summernoteConfig.callbacks=callbacks,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(){ngModel.$viewValue?element.summernote("code",ngModel.$viewValue):element.summernote("empty")}),angular.isDefined($attrs.editable)&&($scope.editable=editor$.find(".note-editable")),angular.isDefined($attrs.editor)&&($scope.editor=element),currentElement=element,element.on("$destroy",function(){element.summernote("destroy"),$scope.summernoteDestroyed=!0})},$scope.$on("$destroy",function(){$scope.summernoteDestroyed||currentElement.summernote("destroy")})}]).directive("summernote",[function(){"use strict";return{restrict:"EA",transclude:"element",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",imageUpload:"&onImageUpload",mediaDelete:"&onMediaDelete"},template:'
',link:function(scope,element,attrs,ctrls,transclude){var summernoteController=ctrls[0],ngModel=ctrls[1];transclude(scope,function(clone,scope){element.append(clone.html())}),summernoteController.activate(scope,element,ngModel)}}}]); \ No newline at end of file diff --git a/gulpfile.js b/gulpfile.js index cae5aea..7f2bc74 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -9,7 +9,7 @@ var gulp = require('gulp'), nugetpack = require('gulp-nuget-pack'), pkg = require('./package.json'); -var banner = '/* angular-summernote v<%=pkg.version%> | (c) 2014, 2015 JeongHoon Byun | MIT license */\n'; +var banner = '/* angular-summernote v<%=pkg.version%> | (c) 2016 JeongHoon Byun | MIT license */\n'; var isAngular12 = isAngular13 = false; gulp.task('lint', function() { diff --git a/package.json b/package.json index b0fd78f..262027c 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "angular-summernote", "description": "AngularJS directive to Summernote", - "version": "0.7.0", + "version": "0.7.1", "author": { "name": "\"Outsider\" Jeonghoon Byun", "email": "outsideris@gmail.com",