promethee 0.1.6 → 0.1.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascripts/promethee-editor.js +2 -0
- data/app/assets/stylesheets/promethee-editor.sass +1 -0
- data/app/views/promethee/_edit.html.erb +18 -18
- data/app/views/promethee/_localize.html.erb +49 -0
- data/app/views/promethee/_show.html.erb +2 -2
- data/app/views/promethee/components/_text_edit.html.erb +12 -8
- data/app/views/promethee/partials/_page.html.erb +1 -1
- data/lib/promethee/core_ext/form_builder.rb +4 -0
- data/lib/promethee/core_ext/form_helper.rb +4 -0
- data/lib/promethee/core_ext/tags.rb +9 -0
- data/lib/promethee/rails/engine.rb +0 -1
- data/lib/promethee/rails/version.rb +1 -1
- data/vendor/assets/fonts/summernote.eot +0 -0
- data/vendor/assets/fonts/summernote.ttf +0 -0
- data/vendor/assets/fonts/summernote.woff +0 -0
- data/vendor/assets/javascripts/angular-summernote.js +207 -0
- data/vendor/assets/javascripts/summernote/index.js +1 -0
- data/vendor/assets/javascripts/summernote/locales/ar-AR.js +104 -0
- data/vendor/assets/javascripts/summernote/locales/bg-BG.js +99 -0
- data/vendor/assets/javascripts/summernote/locales/ca-ES.js +147 -0
- data/vendor/assets/javascripts/summernote/locales/cs-CZ.js +103 -0
- data/vendor/assets/javascripts/summernote/locales/da-DK.js +114 -0
- data/vendor/assets/javascripts/summernote/locales/de-DE.js +110 -0
- data/vendor/assets/javascripts/summernote/locales/el-GR.js +147 -0
- data/vendor/assets/javascripts/summernote/locales/es-ES.js +147 -0
- data/vendor/assets/javascripts/summernote/locales/es-EU.js +103 -0
- data/vendor/assets/javascripts/summernote/locales/fa-IR.js +105 -0
- data/vendor/assets/javascripts/summernote/locales/fi-FI.js +104 -0
- data/vendor/assets/javascripts/summernote/locales/fr-FR.js +154 -0
- data/vendor/assets/javascripts/summernote/locales/gl-ES.js +147 -0
- data/vendor/assets/javascripts/summernote/locales/he-IL.js +107 -0
- data/vendor/assets/javascripts/summernote/locales/hr-HR.js +104 -0
- data/vendor/assets/javascripts/summernote/locales/hu-HU.js +135 -0
- data/vendor/assets/javascripts/summernote/locales/id-ID.js +103 -0
- data/vendor/assets/javascripts/summernote/locales/index.js +1 -0
- data/vendor/assets/javascripts/summernote/locales/it-IT.js +104 -0
- data/vendor/assets/javascripts/summernote/locales/ja-JP.js +133 -0
- data/vendor/assets/javascripts/summernote/locales/ko-KR.js +115 -0
- data/vendor/assets/javascripts/summernote/locales/lt-LT.js +107 -0
- data/vendor/assets/javascripts/summernote/locales/lt-LV.js +135 -0
- data/vendor/assets/javascripts/summernote/locales/mn-MN.js +118 -0
- data/vendor/assets/javascripts/summernote/locales/nb-NO.js +104 -0
- data/vendor/assets/javascripts/summernote/locales/nl-NL.js +104 -0
- data/vendor/assets/javascripts/summernote/locales/pl-PL.js +112 -0
- data/vendor/assets/javascripts/summernote/locales/pt-BR.js +138 -0
- data/vendor/assets/javascripts/summernote/locales/pt-PT.js +103 -0
- data/vendor/assets/javascripts/summernote/locales/ro-RO.js +102 -0
- data/vendor/assets/javascripts/summernote/locales/ru-RU.js +112 -0
- data/vendor/assets/javascripts/summernote/locales/sk-SK.js +102 -0
- data/vendor/assets/javascripts/summernote/locales/sl-SI.js +106 -0
- data/vendor/assets/javascripts/summernote/locales/sr-RS-Latin.js +104 -0
- data/vendor/assets/javascripts/summernote/locales/sr-RS.js +104 -0
- data/vendor/assets/javascripts/summernote/locales/sv-SE.js +104 -0
- data/vendor/assets/javascripts/summernote/locales/ta-IN.js +113 -0
- data/vendor/assets/javascripts/summernote/locales/th-TH.js +106 -0
- data/vendor/assets/javascripts/summernote/locales/tr-TR.js +154 -0
- data/vendor/assets/javascripts/summernote/locales/uk-UA.js +111 -0
- data/vendor/assets/javascripts/summernote/locales/vi-VN.js +104 -0
- data/vendor/assets/javascripts/summernote/locales/zh-CN.js +142 -0
- data/vendor/assets/javascripts/summernote/locales/zh-TW.js +113 -0
- data/vendor/assets/javascripts/summernote/plugin/databasic/summernote-ext-databasic.css +16 -0
- data/vendor/assets/javascripts/summernote/plugin/databasic/summernote-ext-databasic.js +303 -0
- data/vendor/assets/javascripts/summernote/plugin/hello/summernote-ext-hello.js +82 -0
- data/vendor/assets/javascripts/summernote/plugin/specialchars/summernote-ext-specialchars.js +315 -0
- data/vendor/assets/javascripts/summernote/summernote-bs4.js +7990 -0
- data/vendor/assets/javascripts/summernote/summernote-lite.js +8598 -0
- data/vendor/assets/javascripts/summernote/summernote.js +7987 -0
- data/vendor/assets/stylesheets/summernote-bs4.css +1 -0
- data/vendor/assets/stylesheets/summernote-lite.css +1 -0
- data/vendor/assets/stylesheets/summernote.scss +1 -0
- metadata +60 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: edbf8c8f6f4faf5e23d93c3989cbab31908c2469
|
4
|
+
data.tar.gz: d35e771e4690ad8f9d07f20b1a14c59c0a7775f1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 67dfd501d49e2cf8d8c3cb142c884743a342859b6e330ec179ddba123f1a28f20808e861fe856d751f324aab0230c420cf3713d37dc61a1919bc249e9065d026
|
7
|
+
data.tar.gz: 5e8ea6705e07e64e62eed6df26b40c473f918bfb7c566ae20c98bdff021f766f0ceba70b78375f8b3a2159ab48500004dce52db035b694fe4fba3b6486241386
|
@@ -2,9 +2,26 @@
|
|
2
2
|
data = data.to_json unless data.is_a? String
|
3
3
|
%>
|
4
4
|
|
5
|
+
<div id="promethee"
|
6
|
+
class="promethee-editor"
|
7
|
+
ng-app="Promethee"
|
8
|
+
ng-controller="PrometheeController as prometheeController"
|
9
|
+
ng-class="{
|
10
|
+
'promethee-editor--fullscreen': fullscreen,
|
11
|
+
'promethee-editor--move': move,
|
12
|
+
'promethee-editor--preview': preview
|
13
|
+
}">
|
14
|
+
<input type="hidden" name="page[data]" id="page_data" value="{{data}}" />
|
15
|
+
<%= render 'promethee/partials/include_components' %>
|
16
|
+
<%= render 'promethee/partials/navbar' %>
|
17
|
+
<%= render 'promethee/partials/preview' %>
|
18
|
+
<%= render 'promethee/partials/mover' %>
|
19
|
+
<%= render 'promethee/partials/page' %>
|
20
|
+
</div>
|
21
|
+
|
5
22
|
<script>
|
6
23
|
var promethee = angular
|
7
|
-
.module('Promethee', ['
|
24
|
+
.module('Promethee', ['summernote', 'ngAnimate'])
|
8
25
|
.value('data', <%= data.html_safe %>)
|
9
26
|
.value('definitions', [])
|
10
27
|
.filter('htmlSafe', ['$sce', function($sce) {
|
@@ -81,20 +98,3 @@ data = data.to_json unless data.is_a? String
|
|
81
98
|
}]);
|
82
99
|
|
83
100
|
</script>
|
84
|
-
|
85
|
-
<div id="promethee"
|
86
|
-
class="promethee-editor"
|
87
|
-
ng-app="Promethee"
|
88
|
-
ng-controller="PrometheeController as prometheeController"
|
89
|
-
ng-class="{
|
90
|
-
'promethee-editor--fullscreen': fullscreen,
|
91
|
-
'promethee-editor--move': move,
|
92
|
-
'promethee-editor--preview': preview
|
93
|
-
}">
|
94
|
-
<input type="hidden" name="page[data]" id="page_data" value="{{data}}" />
|
95
|
-
<%= render 'promethee/partials/include_components' %>
|
96
|
-
<%= render 'promethee/partials/navbar' %>
|
97
|
-
<%= render 'promethee/partials/preview' %>
|
98
|
-
<%= render 'promethee/partials/mover' %>
|
99
|
-
<%= render 'promethee/partials/page' %>
|
100
|
-
</div>
|
@@ -0,0 +1,49 @@
|
|
1
|
+
<%
|
2
|
+
data = data.to_json unless data.is_a? String
|
3
|
+
master = master.to_json unless master.is_a? String
|
4
|
+
%>
|
5
|
+
|
6
|
+
<div id="prometheeLocalizer"
|
7
|
+
class="promethee-localizer"
|
8
|
+
ng-app="PrometheeLocalizer"
|
9
|
+
ng-controller="PrometheeLocalizerController as prometheeLocalizerController">
|
10
|
+
<input type="hidden" name="page[data]" id="page_data" value="{{data}}" />
|
11
|
+
<%= render 'promethee/partials/include_components' %>
|
12
|
+
<div ng-repeat="component in data.components">
|
13
|
+
<ng-include src="'promethee/components/' + component.type + '/localize'"></ng-include>
|
14
|
+
</div>
|
15
|
+
</div>
|
16
|
+
|
17
|
+
<script>
|
18
|
+
var prometheeLocalizer = angular
|
19
|
+
.module('PrometheeLocalizer', ['summernote'])
|
20
|
+
.value('data', <%= data.html_safe %>)
|
21
|
+
.value('master', <%= master.html_safe %>);
|
22
|
+
|
23
|
+
prometheeLocalizer.controller('PrometheeLocalizerController', ['data', 'master', '$scope', '$http', function(data, master, $scope, $http) {
|
24
|
+
|
25
|
+
if (data === null || data === '') {
|
26
|
+
data = {
|
27
|
+
locale: '',
|
28
|
+
components: []
|
29
|
+
};
|
30
|
+
}
|
31
|
+
$scope.data = data;
|
32
|
+
$scope.master = master;
|
33
|
+
|
34
|
+
$scope.options = {
|
35
|
+
toolbar: [
|
36
|
+
['headline', ['style']],
|
37
|
+
['style', ['bold', 'italic']],
|
38
|
+
['alignment', ['ul', 'ol', 'paragraph']],
|
39
|
+
['code', ['codeview']]
|
40
|
+
]
|
41
|
+
};
|
42
|
+
|
43
|
+
}]);
|
44
|
+
|
45
|
+
angular.element(function() {
|
46
|
+
angular.bootstrap(document.getElementById('prometheeLocalizer'), ['PrometheeLocalizer']);
|
47
|
+
});
|
48
|
+
|
49
|
+
</script>
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<%
|
2
|
-
|
2
|
+
data = Promethee::Data.prepare data
|
3
3
|
l = Promethee::Data.prepare l
|
4
|
-
Promethee::Localization.localize!
|
4
|
+
Promethee::Localization.localize! data, l unless l.nil?
|
5
5
|
%>
|
6
6
|
<div class="promethee">
|
7
7
|
<%= render 'promethee/components/page', page: data %>
|
@@ -6,7 +6,7 @@
|
|
6
6
|
<%= render 'promethee/partials/toolbar_buttons' %>
|
7
7
|
</div>
|
8
8
|
<div ng-show="editing">
|
9
|
-
<
|
9
|
+
<summernote config="options" ng-model="component.attributes.body"></summernote>
|
10
10
|
</div>
|
11
11
|
<div ng-hide="editing">
|
12
12
|
<div class="promethee-editor__wrapper" ng-bind-html="component.attributes.body | htmlSafe" ng-click="edit()"></div>
|
@@ -18,6 +18,10 @@
|
|
18
18
|
<div ng-bind-html="component.attributes.body | htmlSafe"></div>
|
19
19
|
</script>
|
20
20
|
|
21
|
+
<script type="text/ng-template" id="promethee/components/text/localize">
|
22
|
+
<summernote config="options" ng-model="component.attributes.body"></summernote>
|
23
|
+
</script>
|
24
|
+
|
21
25
|
<script>
|
22
26
|
angular.injector(['ng', 'Promethee']).get('definitions').push({
|
23
27
|
name: 'Text',
|
@@ -42,13 +46,13 @@
|
|
42
46
|
this.editing = false;
|
43
47
|
};
|
44
48
|
|
45
|
-
$scope.
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
49
|
+
$scope.options = {
|
50
|
+
toolbar: [
|
51
|
+
['headline', ['style']],
|
52
|
+
['style', ['bold', 'italic']],
|
53
|
+
['alignment', ['ul', 'ol', 'paragraph']],
|
54
|
+
['code', ['codeview']]
|
55
|
+
]
|
52
56
|
};
|
53
57
|
|
54
58
|
}]);
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<div class="promethee-editor__page" ng-hide="preview || move">
|
2
|
-
<div ng-class="{ 'container
|
2
|
+
<div ng-class="{ 'container': fullscreen }">
|
3
3
|
<ng-include src="'promethee/components/page'"></ng-include>
|
4
4
|
</div>
|
5
5
|
<%= render 'promethee/partials/adder' %>
|
@@ -3,4 +3,8 @@ ActionView::Helpers::FormBuilder.class_eval do
|
|
3
3
|
def promethee(method, options = {})
|
4
4
|
@template.promethee_editor(@object_name, method, objectify_options(options))
|
5
5
|
end
|
6
|
+
|
7
|
+
def promethee_localizer(method, options = {})
|
8
|
+
@template.promethee_localizer(@object_name, method, objectify_options(options))
|
9
|
+
end
|
6
10
|
end
|
@@ -3,4 +3,8 @@ ActionView::Helpers::FormHelper.class_eval do
|
|
3
3
|
def promethee_editor(object_name, method, options = {})
|
4
4
|
ActionView::Helpers::Tags::PrometheeEditor.new(object_name, method, self, options).render
|
5
5
|
end
|
6
|
+
|
7
|
+
def promethee_localizer(object_name, method, options = {})
|
8
|
+
ActionView::Helpers::Tags::PrometheeLocalizer.new(object_name, method, self, options).render
|
9
|
+
end
|
6
10
|
end
|
@@ -11,6 +11,15 @@ module ActionView
|
|
11
11
|
ApplicationController.renderer.render partial: 'promethee/edit', locals: { data: data }
|
12
12
|
end
|
13
13
|
end
|
14
|
+
|
15
|
+
class PrometheeLocalizer < Base
|
16
|
+
def render
|
17
|
+
data = object.send @method_name unless object.nil?
|
18
|
+
data = @options[:value] if @options.include? :value
|
19
|
+
master = @options[:master]
|
20
|
+
ApplicationController.renderer.render partial: 'promethee/localize', locals: { data: data, master: master }
|
21
|
+
end
|
22
|
+
end
|
14
23
|
end
|
15
24
|
end
|
16
25
|
end
|
@@ -6,6 +6,5 @@ class Promethee::Rails::Engine < ::Rails::Engine
|
|
6
6
|
end
|
7
7
|
initializer 'assets' do |app|
|
8
8
|
Rails.application.config.assets.precompile += %w( logo-promethee-vertical.svg logo-promethee-horizontal.svg icon-promethee.png )
|
9
|
-
# Rails.application.config.assets.paths << Rails.root.join('vendor')
|
10
9
|
end
|
11
10
|
end
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,207 @@
|
|
1
|
+
/* angular-summernote v0.8.1 | (c) 2016 JeongHoon Byun | MIT license */
|
2
|
+
/* global angular */
|
3
|
+
angular.module('summernote', [])
|
4
|
+
|
5
|
+
.controller('SummernoteController', ['$scope', '$attrs', '$timeout', function($scope, $attrs, $timeout) {
|
6
|
+
'use strict';
|
7
|
+
|
8
|
+
var currentElement,
|
9
|
+
summernoteConfig = angular.copy($scope.summernoteConfig) || {};
|
10
|
+
|
11
|
+
if (angular.isDefined($attrs.height)) { summernoteConfig.height = +$attrs.height; }
|
12
|
+
if (angular.isDefined($attrs.minHeight)) { summernoteConfig.minHeight = +$attrs.minHeight; }
|
13
|
+
if (angular.isDefined($attrs.maxHeight)) { summernoteConfig.maxHeight = +$attrs.maxHeight; }
|
14
|
+
if (angular.isDefined($attrs.placeholder)) { summernoteConfig.placeholder = $attrs.placeholder; }
|
15
|
+
if (angular.isDefined($attrs.focus)) { summernoteConfig.focus = true; }
|
16
|
+
if (angular.isDefined($attrs.airmode)) { summernoteConfig.airMode = true; }
|
17
|
+
if (angular.isDefined($attrs.dialogsinbody)) { summernoteConfig.dialogsInBody = true; }
|
18
|
+
if (angular.isDefined($attrs.lang)) {
|
19
|
+
if (!angular.isDefined($.summernote.lang[$attrs.lang])) {
|
20
|
+
throw new Error('"' + $attrs.lang + '" lang file must be exist.');
|
21
|
+
}
|
22
|
+
summernoteConfig.lang = $attrs.lang;
|
23
|
+
}
|
24
|
+
|
25
|
+
summernoteConfig.callbacks = summernoteConfig.callbacks || {};
|
26
|
+
|
27
|
+
if (angular.isDefined($attrs.onInit)) {
|
28
|
+
summernoteConfig.callbacks.onInit = function(evt) {
|
29
|
+
$scope.init({evt:evt});
|
30
|
+
};
|
31
|
+
}
|
32
|
+
if (angular.isDefined($attrs.onEnter)) {
|
33
|
+
summernoteConfig.callbacks.onEnter = function(evt) {
|
34
|
+
$scope.enter({evt:evt});
|
35
|
+
};
|
36
|
+
}
|
37
|
+
if (angular.isDefined($attrs.onFocus)) {
|
38
|
+
summernoteConfig.callbacks.onFocus = function(evt) {
|
39
|
+
$scope.focus({evt:evt});
|
40
|
+
};
|
41
|
+
}
|
42
|
+
if (angular.isDefined($attrs.onPaste)) {
|
43
|
+
summernoteConfig.callbacks.onPaste = function(evt) {
|
44
|
+
$scope.paste({evt:evt});
|
45
|
+
};
|
46
|
+
}
|
47
|
+
if (angular.isDefined($attrs.onKeyup)) {
|
48
|
+
summernoteConfig.callbacks.onKeyup = function(evt) {
|
49
|
+
$scope.keyup({evt:evt});
|
50
|
+
};
|
51
|
+
}
|
52
|
+
if (angular.isDefined($attrs.onKeydown)) {
|
53
|
+
summernoteConfig.callbacks.onKeydown = function(evt) {
|
54
|
+
$scope.keydown({evt:evt});
|
55
|
+
};
|
56
|
+
}
|
57
|
+
if (angular.isDefined($attrs.onImageUpload)) {
|
58
|
+
summernoteConfig.callbacks.onImageUpload = function(files) {
|
59
|
+
$scope.imageUpload({files:files, editable: $scope.editable});
|
60
|
+
};
|
61
|
+
}
|
62
|
+
if (angular.isDefined($attrs.onMediaDelete)) {
|
63
|
+
summernoteConfig.callbacks.onMediaDelete = function(target) {
|
64
|
+
// make new object that has information of target to avoid error:isecdom
|
65
|
+
var removedMedia = {attrs: {}};
|
66
|
+
removedMedia.tagName = target[0].tagName;
|
67
|
+
angular.forEach(target[0].attributes, function(attr) {
|
68
|
+
removedMedia.attrs[attr.name] = attr.value;
|
69
|
+
});
|
70
|
+
$scope.mediaDelete({target: removedMedia});
|
71
|
+
};
|
72
|
+
}
|
73
|
+
|
74
|
+
this.activate = function(scope, element, ngModel) {
|
75
|
+
var updateNgModel = function() {
|
76
|
+
var newValue = element.summernote('code');
|
77
|
+
if (element.summernote('isEmpty')) { newValue = ''; }
|
78
|
+
if (ngModel && ngModel.$viewValue !== newValue) {
|
79
|
+
$timeout(function() {
|
80
|
+
ngModel.$setViewValue(newValue);
|
81
|
+
}, 0);
|
82
|
+
}
|
83
|
+
};
|
84
|
+
|
85
|
+
var originalOnChange = summernoteConfig.callbacks.onChange;
|
86
|
+
summernoteConfig.callbacks.onChange = function (contents) {
|
87
|
+
$timeout(function () {
|
88
|
+
if (element.summernote('isEmpty')) {
|
89
|
+
contents = '';
|
90
|
+
}
|
91
|
+
updateNgModel();
|
92
|
+
}, 0);
|
93
|
+
if (angular.isDefined($attrs.onChange)) {
|
94
|
+
$scope.change({contents: contents, editable: $scope.editable});
|
95
|
+
} else if (angular.isFunction(originalOnChange)) {
|
96
|
+
originalOnChange.apply(this, arguments);
|
97
|
+
}
|
98
|
+
};
|
99
|
+
if (angular.isDefined($attrs.onBlur)) {
|
100
|
+
summernoteConfig.callbacks.onBlur = function (evt) {
|
101
|
+
(!summernoteConfig.airMode) && element.blur();
|
102
|
+
$scope.blur({evt: evt});
|
103
|
+
};
|
104
|
+
}
|
105
|
+
element.summernote(summernoteConfig);
|
106
|
+
|
107
|
+
var editor$ = element.next('.note-editor'),
|
108
|
+
unwatchNgModel;
|
109
|
+
editor$.find('.note-toolbar').click(function() {
|
110
|
+
updateNgModel();
|
111
|
+
|
112
|
+
// sync ngModel in codeview mode
|
113
|
+
if (editor$.hasClass('codeview')) {
|
114
|
+
editor$.on('keyup', updateNgModel);
|
115
|
+
if (ngModel) {
|
116
|
+
unwatchNgModel = scope.$watch(function () {
|
117
|
+
return ngModel.$modelValue;
|
118
|
+
}, function(newValue) {
|
119
|
+
editor$.find('.note-codable').val(newValue);
|
120
|
+
});
|
121
|
+
}
|
122
|
+
} else {
|
123
|
+
editor$.off('keyup', updateNgModel);
|
124
|
+
if (angular.isFunction(unwatchNgModel)) {
|
125
|
+
unwatchNgModel();
|
126
|
+
}
|
127
|
+
}
|
128
|
+
});
|
129
|
+
|
130
|
+
if (ngModel) {
|
131
|
+
ngModel.$render = function() {
|
132
|
+
if (ngModel.$viewValue) {
|
133
|
+
element.summernote('code', ngModel.$viewValue);
|
134
|
+
} else {
|
135
|
+
element.summernote('empty');
|
136
|
+
}
|
137
|
+
};
|
138
|
+
}
|
139
|
+
|
140
|
+
// set editable to avoid error:isecdom since Angular v1.3
|
141
|
+
if (angular.isDefined($attrs.editable)) {
|
142
|
+
$scope.editable = editor$.find('.note-editable');
|
143
|
+
}
|
144
|
+
if (angular.isDefined($attrs.editor)) {
|
145
|
+
$scope.editor = element;
|
146
|
+
}
|
147
|
+
|
148
|
+
currentElement = element;
|
149
|
+
// use jquery Event binding instead $on('$destroy') to preserve options data of DOM
|
150
|
+
element.on('$destroy', function() {
|
151
|
+
element.summernote('destroy');
|
152
|
+
$scope.summernoteDestroyed = true;
|
153
|
+
});
|
154
|
+
};
|
155
|
+
|
156
|
+
$scope.$on('$destroy', function () {
|
157
|
+
// when destroying scope directly
|
158
|
+
if (!$scope.summernoteDestroyed) {
|
159
|
+
currentElement.summernote('destroy');
|
160
|
+
}
|
161
|
+
});
|
162
|
+
}])
|
163
|
+
.directive('summernote', [function() {
|
164
|
+
'use strict';
|
165
|
+
|
166
|
+
return {
|
167
|
+
restrict: 'EA',
|
168
|
+
transclude: 'element',
|
169
|
+
replace: true,
|
170
|
+
require: ['summernote', '?ngModel'],
|
171
|
+
controller: 'SummernoteController',
|
172
|
+
scope: {
|
173
|
+
summernoteConfig: '=config',
|
174
|
+
editable: '=',
|
175
|
+
editor: '=',
|
176
|
+
init: '&onInit',
|
177
|
+
enter: '&onEnter',
|
178
|
+
focus: '&onFocus',
|
179
|
+
blur: '&onBlur',
|
180
|
+
paste: '&onPaste',
|
181
|
+
keyup: '&onKeyup',
|
182
|
+
keydown: '&onKeydown',
|
183
|
+
change: '&onChange',
|
184
|
+
imageUpload: '&onImageUpload',
|
185
|
+
mediaDelete: '&onMediaDelete'
|
186
|
+
},
|
187
|
+
template: '<div class="summernote"></div>',
|
188
|
+
link: function(scope, element, attrs, ctrls, transclude) {
|
189
|
+
var summernoteController = ctrls[0],
|
190
|
+
ngModel = ctrls[1];
|
191
|
+
|
192
|
+
if (!ngModel) {
|
193
|
+
transclude(scope, function(clone, scope) {
|
194
|
+
// to prevent binding to angular scope (It require `tranclude: 'element'`)
|
195
|
+
element.append(clone.html());
|
196
|
+
});
|
197
|
+
summernoteController.activate(scope, element, ngModel);
|
198
|
+
} else {
|
199
|
+
var clearWatch = scope.$watch(function() { return ngModel.$viewValue; }, function(value) {
|
200
|
+
clearWatch();
|
201
|
+
element.append(value);
|
202
|
+
summernoteController.activate(scope, element, ngModel);
|
203
|
+
}, true);
|
204
|
+
}
|
205
|
+
}
|
206
|
+
};
|
207
|
+
}]);
|