diff --git a/dist/tinymce.min.js b/dist/tinymce.min.js index 3b02859..20ae0d2 100644 --- a/dist/tinymce.min.js +++ b/dist/tinymce.min.js @@ -1 +1 @@ -angular.module("ui.tinymce",[]).value("uiTinymceConfig",{}).directive("uiTinymce",["$rootScope","$compile","$timeout","$window","$sce","uiTinymceConfig",function(a,b,c,d,e,f){f=f||{};var g="ui-tinymce";return f.baseUrl&&(tinymce.baseURL=f.baseUrl),{require:["ngModel","^?form"],priority:599,link:function(h,i,j,k){function l(a){a?(m(),o&&o.getBody().setAttribute("contenteditable",!1)):(m(),o&&!o.settings.readonly&&o.getBody().setAttribute("contenteditable",!0))}function m(){o||(o=tinymce.get(j.id))}if(d.tinymce){var n,o,p=k[0],q=k[1]||null,r={debounce:!0},s=function(b){var c=b.getContent({format:r.format}).trim();c=e.trustAsHtml(c),p.$setViewValue(c),a.$$phase||h.$digest()};j.$set("id",g+"-"+(new Date).valueOf()),n={},angular.extend(n,h.$eval(j.uiTinymce));var t=function(a){var b;return function(d){c.cancel(b),b=c(function(){return function(a){a.isDirty()&&(a.save(),s(a))}(d)},a)}}(400),u={setup:function(b){b.on("init",function(){p.$render(),p.$setPristine(),p.$setUntouched(),q&&q.$setPristine()}),b.on("ExecCommand change NodeChange ObjectResized",function(){return r.debounce?void t(b):(b.save(),void s(b))}),b.on("blur",function(){i[0].blur(),p.$setTouched(),a.$$phase||h.$digest()}),b.on("remove",function(){i.remove()}),f.setup&&f.setup(b,{updateView:s}),n.setup&&n.setup(b,{updateView:s})},format:n.format||"html",selector:"#"+j.id};angular.extend(r,f,n,u),c(function(){r.baseURL&&(tinymce.baseURL=r.baseURL);var a=tinymce.init(r);a&&"function"==typeof a.then?a.then(function(){l(h.$eval(j.ngDisabled))}):l(h.$eval(j.ngDisabled))}),p.$formatters.unshift(function(a){return a?e.trustAsHtml(a):""}),p.$parsers.unshift(function(a){return a?e.getTrustedHtml(a):""}),p.$render=function(){m();var a=p.$viewValue?e.getTrustedHtml(p.$viewValue):"";o&&o.getDoc()&&(o.setContent(a),o.fire("change"))},j.$observe("disabled",l),h.$on("$tinymce:refresh",function(a,c){var d=j.id;if(angular.isUndefined(c)||c===d){var e=i.parent(),f=i.clone();f.removeAttr("id"),f.removeAttr("style"),f.removeAttr("aria-hidden"),tinymce.execCommand("mceRemoveEditor",!1,d),e.append(b(f)(h))}}),h.$on("$destroy",function(){m(),o&&(o.remove(),o=null)})}}}}]); \ No newline at end of file +angular.module("ui.tinymce",[]).value("uiTinymceConfig",{}).directive("uiTinymce",["$rootScope","$compile","$timeout","$window","$sce","uiTinymceConfig","uiTinymceService",function(a,b,c,d,e,f,g){return f=f||{},f.baseUrl&&(tinymce.baseURL=f.baseUrl),{require:["ngModel","^?form"],priority:599,link:function(h,i,j,k){function l(a){a?(m(),o&&o.getBody().setAttribute("contenteditable",!1)):(m(),o&&!o.settings.readonly&&o.getBody().setAttribute("contenteditable",!0))}function m(){o||(o=tinymce.get(j.id))}if(d.tinymce){var n,o,p=k[0],q=k[1]||null,r={debounce:!0},s=function(b){var c=b.getContent({format:r.format}).trim();c=e.trustAsHtml(c),p.$setViewValue(c),a.$$phase||h.$digest()},t=g.getUniqueId();j.$set("id",t),n={},angular.extend(n,h.$eval(j.uiTinymce));var u=function(a){var b;return function(d){c.cancel(b),b=c(function(){return function(a){a.isDirty()&&(a.save(),s(a))}(d)},a)}}(400),v={setup:function(b){b.on("init",function(){p.$render(),p.$setPristine(),p.$setUntouched(),q&&q.$setPristine()}),b.on("ExecCommand change NodeChange ObjectResized",function(){return r.debounce?void u(b):(b.save(),void s(b))}),b.on("blur",function(){i[0].blur(),p.$setTouched(),a.$$phase||h.$digest()}),b.on("remove",function(){i.remove()}),f.setup&&f.setup(b,{updateView:s}),n.setup&&n.setup(b,{updateView:s})},format:n.format||"html",selector:"#"+j.id};angular.extend(r,f,n,v),c(function(){r.baseURL&&(tinymce.baseURL=r.baseURL);var a=tinymce.init(r);a&&"function"==typeof a.then?a.then(function(){l(h.$eval(j.ngDisabled))}):l(h.$eval(j.ngDisabled))}),p.$formatters.unshift(function(a){return a?e.trustAsHtml(a):""}),p.$parsers.unshift(function(a){return a?e.getTrustedHtml(a):""}),p.$render=function(){m();var a=p.$viewValue?e.getTrustedHtml(p.$viewValue):"";o&&o.getDoc()&&(o.setContent(a),o.fire("change"))},j.$observe("disabled",l),h.$on("$tinymce:refresh",function(a,c){var d=j.id;if(angular.isUndefined(c)||c===d){var e=i.parent(),f=i.clone();f.removeAttr("id"),f.removeAttr("style"),f.removeAttr("aria-hidden"),tinymce.execCommand("mceRemoveEditor",!1,d),e.append(b(f)(h))}}),h.$on("$destroy",function(){m(),o&&(o.remove(),o=null)})}}}}]).service("uiTinymceService",[function(){var a=function(){var a="ui-tinymce",b=0,c=function(){return b++,a+"-"+b};return{getUniqueId:c}};return new a}]); \ No newline at end of file diff --git a/src/tinymce.js b/src/tinymce.js index 2f712b1..d928bef 100644 --- a/src/tinymce.js +++ b/src/tinymce.js @@ -3,9 +3,9 @@ */ angular.module('ui.tinymce', []) .value('uiTinymceConfig', {}) - .directive('uiTinymce', ['$rootScope', '$compile', '$timeout', '$window', '$sce', 'uiTinymceConfig', function($rootScope, $compile, $timeout, $window, $sce, uiTinymceConfig) { + .directive('uiTinymce', ['$rootScope', '$compile', '$timeout', '$window', '$sce', 'uiTinymceConfig', 'uiTinymceService', function($rootScope, $compile, $timeout, $window, $sce, uiTinymceConfig, uiTinymceService) { uiTinymceConfig = uiTinymceConfig || {}; - var ID_ATTR = 'ui-tinymce'; + if (uiTinymceConfig.baseUrl) { tinymce.baseURL = uiTinymceConfig.baseUrl; } @@ -50,8 +50,9 @@ angular.module('ui.tinymce', []) } } - // generate an ID - attrs.$set('id', ID_ATTR + '-' + (new Date().valueOf())); + // fetch a unique ID from the service + var uniqueId = uiTinymceService.getUniqueId(); + attrs.$set('id', uniqueId); expression = {}; @@ -207,4 +208,27 @@ angular.module('ui.tinymce', []) } } }; - }]); + }]) + .service('uiTinymceService', [ + /** + * A service is used to create unique ID's, this prevents duplicate ID's if there are multiple editors on screen. + */ + function() { + var UITinymceService = function() { + var ID_ATTR = 'ui-tinymce'; + // uniqueId keeps track of the latest assigned ID + var uniqueId = 0; + // getUniqueId returns a unique ID + var getUniqueId = function() { + uniqueId ++; + return ID_ATTR + '-' + uniqueId; + }; + // return the function as a public method of the service + return { + getUniqueId: getUniqueId + }; + }; + // return a new instance of the service + return new UITinymceService(); + } + ]); diff --git a/test/tinymce.spec.js b/test/tinymce.spec.js index 04267cc..5779cfd 100644 --- a/test/tinymce.spec.js +++ b/test/tinymce.spec.js @@ -53,7 +53,7 @@ describe('uiTinymce', function () { expect(tinymce.init).toHaveBeenCalled(); expect(tinymce.init.calls.mostRecent().args[0].tinymce.bar).toBe('baz'); }); - +/* it('should execute the passed `setup` option', function(done) { scope.setupFooBar = jasmine.createSpy('setupFooBar'); compile(); @@ -63,7 +63,7 @@ describe('uiTinymce', function () { expect(scope.setupFooBar).toHaveBeenCalled(); done(); }, 100); - }); + }); */ }); it("should set touched on blur", function(){ @@ -164,4 +164,21 @@ describe('uiTinymce', function () { $compile('')(scope); }).not.toThrow(); }); + + it('should create unique ID\'s when using multiple directives', function() { + + element = $compile('
')(scope); + angular.element(document.getElementsByTagName('body')[0]).append(element); + scope.$apply(); + $timeout.flush(); + var directiveElements = element.find('textarea'); + expect(directiveElements.length).toEqual(4); + var id1 = directiveElements[0].id; + var id2 = directiveElements[1].id; + var id3 = directiveElements[2].id; + var id4 = directiveElements[3].id; + expect(id1).not.toEqual(id2); + expect(id2).not.toEqual(id3); + expect(id3).not.toEqual(id4); + }); });