imagine_cms 5.2.0 → 5.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Dockerfile +16 -42
- data/README.md +28 -11
- data/app/assets/javascripts/dojo/dojo.js +1 -1
- data/app/assets/javascripts/dojo/src/widget/templates/richtextframe.html +3 -0
- data/app/assets/javascripts/imagine_cms/core.js +31 -40
- data/app/assets/stylesheets/imagine_cms.css.scss +15 -7
- data/app/assets/stylesheets/imagine_controls.css.scss +45 -2
- data/app/controllers/cms/content_controller.rb +2 -2
- data/app/controllers/manage/cms_pages_controller.rb +34 -25
- data/app/helpers/cms_application_helper.rb +27 -27
- data/app/helpers/cms_custom_helper.rb +13 -0
- data/app/mailers/imagine_cms_mailer.rb +1 -1
- data/app/views/imagine_cms/_dialogs.html.erb +3 -3
- data/app/views/imagine_cms/_header.html.erb +8 -8
- data/app/views/imagine_cms_mailer/request_review.text.erb +0 -2
- data/app/views/layouts/management.html.erb +5 -4
- data/app/views/manage/cms_pages/_create_file_link.html.erb +16 -3
- data/app/views/manage/cms_pages/_crop_feature_image.html.erb +1 -1
- data/app/views/manage/cms_pages/_crop_image.html.erb +31 -29
- data/app/views/manage/cms_pages/_crop_thumb.html.erb +1 -1
- data/app/views/manage/cms_pages/_edit_page.html.erb +18 -4
- data/app/views/manage/cms_pages/_list_page.html.erb +28 -7
- data/app/views/manage/cms_pages/_list_page_select.html.erb +17 -7
- data/app/views/manage/cms_pages/_list_pages.html.erb +1 -1
- data/app/views/manage/cms_pages/_list_pages_select.html.erb +1 -1
- data/app/views/manage/cms_pages/_page_list.html.erb +5 -5
- data/app/views/manage/cms_pages/_page_list_source_tag.html.erb +6 -2
- data/app/views/manage/cms_pages/_upload_feature_image.html.erb +51 -11
- data/app/views/manage/cms_pages/_upload_file.html.erb +2 -2
- data/app/views/manage/cms_pages/_upload_image.html.erb +95 -23
- data/app/views/manage/cms_pages/_upload_thumb.html.erb +51 -11
- data/app/views/manage/cms_pages/gallery_management.html.erb +1 -1
- data/app/views/manage/cms_pages/index.html.erb +36 -35
- data/app/views/manage/cms_pages/select_page.html.erb +39 -39
- data/app/views/manage/cms_pages/toolbar_preview.html.erb +1 -1
- data/app/views/management/users/index.html.erb +1 -1
- data/docker-compose.override.yml.example +6 -19
- data/docker-compose.yml +5 -7
- data/docker/conf/{nginx-vhost.conf → nginx-vhost.conf.template} +3 -3
- data/docker/services/{memcached.sh → memcached} +0 -0
- data/docker/services/{sidekiq.sh → sidekiq} +0 -0
- data/docker/services/{webpack.sh → webpack} +0 -0
- data/lib/extensions/action_controller_extensions.rb +18 -17
- data/lib/imagine_cms/engine.rb +1 -0
- data/lib/imagine_cms/version.rb +1 -1
- data/lib/upload_progress/lib/multipart_progress.rb +1 -1
- metadata +11 -11
@@ -448,10 +448,10 @@ class Manage::CmsPagesController < Manage::ApplicationController
|
|
448
448
|
logger.error(e)
|
449
449
|
end
|
450
450
|
end
|
451
|
-
|
452
|
-
render
|
451
|
+
|
452
|
+
render plain: 'success'
|
453
453
|
end
|
454
|
-
|
454
|
+
|
455
455
|
#
|
456
456
|
# helpers
|
457
457
|
#
|
@@ -475,12 +475,21 @@ class Manage::CmsPagesController < Manage::ApplicationController
|
|
475
475
|
focusOnLoad = !defined?(@cms_text_editor_placed)
|
476
476
|
@cms_text_editor_placed = true
|
477
477
|
content = ''.html_safe
|
478
|
-
content << text_area(:page_objects, key,
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
content <<
|
483
|
-
|
478
|
+
content << text_area(:page_objects, key,
|
479
|
+
{ dojoType: 'Editor2', toolbarGroup: 'main', isToolbarGroupLeader: 'false',
|
480
|
+
focusOnLoad: focusOnLoad.to_s, style: 'border: 2px dashed gray; padding: 5px',
|
481
|
+
minHeight: '100px' }.update(html_options))
|
482
|
+
content << content_tag(:div, '', id: "page_object_config_#{key}")
|
483
|
+
script_tag = <<-EOT
|
484
|
+
<script type="text/javascript">
|
485
|
+
window.addEventListener('load', (event) => {
|
486
|
+
setInterval(function() {
|
487
|
+
scanForPageObjects(#{@pg.id}, '#{key}', #{@pg.version});
|
488
|
+
}, 1000);
|
489
|
+
});
|
490
|
+
</script>
|
491
|
+
EOT
|
492
|
+
content << script_tag.html_safe
|
484
493
|
content
|
485
494
|
when :page_list
|
486
495
|
# set defaults unless values are present in template
|
@@ -574,7 +583,7 @@ class Manage::CmsPagesController < Manage::ApplicationController
|
|
574
583
|
FileUtils.cp(data.path(), localfile)
|
575
584
|
end
|
576
585
|
|
577
|
-
|
586
|
+
render json: { filename: File.basename(localfile) }.to_json
|
578
587
|
end
|
579
588
|
|
580
589
|
def crop_image
|
@@ -1275,35 +1284,35 @@ class Manage::CmsPagesController < Manage::ApplicationController
|
|
1275
1284
|
protected
|
1276
1285
|
|
1277
1286
|
def check_permissions
|
1278
|
-
|
1279
|
-
render '/imagine_cms/errors/permission_denied', :
|
1287
|
+
unless user_has_permission?(:manage_cms)
|
1288
|
+
render '/imagine_cms/errors/permission_denied', layout: false
|
1280
1289
|
return false
|
1281
1290
|
end
|
1282
1291
|
end
|
1283
1292
|
|
1284
1293
|
def validate_user_access
|
1285
|
-
unless @user.cms_allowed_sections.to_s.strip.blank?
|
1286
|
-
|
1294
|
+
unless (allowed_sections_str = @user.cms_allowed_sections.to_s.strip).blank?
|
1295
|
+
allowed = false
|
1296
|
+
allowed_sections = allowed_sections_str.split(',').map(&:strip).reject(&:blank?)
|
1287
1297
|
if @pg
|
1288
1298
|
path = '/' + @pg.path
|
1299
|
+
allowed_sections.each { |s| allowed ||= (path =~ /^#{s}/) }
|
1289
1300
|
else
|
1290
|
-
parent = CmsPage.find_by_id(params[:parent_id] || params[:pg][:parent_id]) rescue nil
|
1291
|
-
|
1292
|
-
|
1301
|
+
if (parent = CmsPage.find_by_id(params[:parent_id] || params[:pg][:parent_id]) rescue nil)
|
1302
|
+
path = '/' + parent.path
|
1303
|
+
allowed_sections.each { |s| allowed ||= (path =~ /^#{s}/) }
|
1304
|
+
end
|
1293
1305
|
end
|
1294
|
-
|
1295
|
-
allowed
|
1296
|
-
allowed_sections.each { |s| allowed ||= (path =~ /^#{s}/) }
|
1297
|
-
|
1298
|
-
if !allowed
|
1306
|
+
|
1307
|
+
unless allowed
|
1299
1308
|
respond_to do |wants|
|
1300
|
-
wants.js { render :
|
1301
|
-
wants.html { redirect_to "/#{@pg.path}#{@pg.path == '' ? '' : '/'}version/#{@pg.version}"
|
1309
|
+
wants.js { render plain: 'Sorry, you don\'t have permission to edit this page.' }
|
1310
|
+
wants.html { redirect_to "/#{@pg.path}#{@pg.path == '' ? '' : '/'}version/#{@pg.version}" }
|
1302
1311
|
end
|
1303
1312
|
return false
|
1304
1313
|
end
|
1305
1314
|
end
|
1306
|
-
|
1315
|
+
|
1307
1316
|
true
|
1308
1317
|
end
|
1309
1318
|
|
@@ -548,19 +548,7 @@ module CmsApplicationHelper
|
|
548
548
|
|
549
549
|
temp.html_safe
|
550
550
|
end
|
551
|
-
|
552
|
-
# override this method to do your own custom subtitutions
|
553
|
-
def substitute_placeholders_custom(temp, page)
|
554
|
-
# an example:
|
555
|
-
# begin
|
556
|
-
# temp.gsub!(/<#\s*upcoming_event_date\s*#>/, page.article_date.strftime("<span class=\"month\">%b</span><span class=\"day\">%d</span>"))
|
557
|
-
# rescue
|
558
|
-
# end
|
559
|
-
|
560
|
-
# remember to return your modified copy of temp
|
561
|
-
temp
|
562
|
-
end
|
563
|
-
|
551
|
+
|
564
552
|
|
565
553
|
def template_option(name, type = :string)
|
566
554
|
return nil unless @pg
|
@@ -813,17 +801,19 @@ module CmsApplicationHelper
|
|
813
801
|
default_value = Time.parse(default_value) if default_value.is_a?(String)
|
814
802
|
default_value ||= start_date
|
815
803
|
|
816
|
-
draw_calendar =
|
817
|
-
|
818
|
-
|
819
|
-
|
820
|
-
|
821
|
-
|
822
|
-
|
823
|
-
|
824
|
-
|
825
|
-
|
826
|
-
|
804
|
+
draw_calendar = <<-EOT
|
805
|
+
new Ajax.Updater('date_picker_#{object}_#{method_prefix}_days',
|
806
|
+
'#{date_picker_url}?month=' + $('#{object}_#{method_prefix}_month_sel').value +
|
807
|
+
'&year=' + $('#{object}_#{method_prefix}_year_sel').value +
|
808
|
+
'&min_time=' + #{start_date.to_i} +
|
809
|
+
'&max_time=' + #{end_date.to_i} +
|
810
|
+
'&exclude_days=#{exclude_days.join(',')}' +
|
811
|
+
'&onchange=#{escape_javascript(options[:onchange])}' +
|
812
|
+
'&object=#{object}' +
|
813
|
+
'&method_prefix=#{method_prefix}', {method:'get', asynchronous:true, evalScripts:true});
|
814
|
+
EOT
|
815
|
+
|
816
|
+
ret = <<-EOT
|
827
817
|
<span><a href="#" onclick="showDatePicker('#{object}', '#{method_prefix}'); return false;"><span id="date_picker_#{object}_#{method_prefix}_value" style="font-weight: normal;">#{default_value.strftime('%a %m/%d/%y')}</span></a></span>
|
828
818
|
<span id="date_picker_#{object}_#{method_prefix}icon"><a href="#" onclick="showDatePicker('#{object}', '#{method_prefix}'); return false;"><img src="/assets/management/icon_time.gif" style="float: none" alt="date picker" /></a></span>
|
829
819
|
<div id="date_picker_#{object}_#{method_prefix}main" style="display: none; background-color: white; border: 1px solid gray; padding: 3px; z-index: 101;" class="date-picker-main">
|
@@ -847,8 +837,18 @@ module CmsApplicationHelper
|
|
847
837
|
<a href="#" onclick="hideDatePicker('#{object}', '#{method_prefix}'); return false;">Close</a>
|
848
838
|
</div>
|
849
839
|
</div>
|
850
|
-
|
851
|
-
ret +=
|
840
|
+
EOT
|
841
|
+
ret += <<-EOT
|
842
|
+
<script type="text/javascript">
|
843
|
+
if (typeof(Ajax) == 'undefined') {
|
844
|
+
window.addEventListener('DOMContentLoaded', (event) => {
|
845
|
+
#{draw_calendar}
|
846
|
+
});
|
847
|
+
} else {
|
848
|
+
#{draw_calendar}
|
849
|
+
}
|
850
|
+
</script>
|
851
|
+
EOT
|
852
852
|
ret.html_safe
|
853
853
|
end
|
854
854
|
|
@@ -1050,7 +1050,7 @@ EOF
|
|
1050
1050
|
|
1051
1051
|
|
1052
1052
|
def cropper_image_tag(options)
|
1053
|
-
ret = "<img id=\"testImage\" src=\"/assets/#{options[:url]}\" />".html_safe
|
1053
|
+
ret = "<img id=\"testImage\" src=\"/assets/#{options[:url]}\" style=\"display: block; position: relative;\" />".html_safe
|
1054
1054
|
ret += javascript_tag("cropper = new Cropper.Img('testImage', { minWidth: 0, minHeight: 0, captureKeys: false, onEndCrop: onEndCrop });")
|
1055
1055
|
end
|
1056
1056
|
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module CmsCustomHelper
|
2
|
+
# override this method to do your own custom subtitutions
|
3
|
+
def substitute_placeholders_custom(temp, _page)
|
4
|
+
# an example:
|
5
|
+
# begin
|
6
|
+
# temp.gsub!(/<#\s*upcoming_event_date\s*#>/, page.article_date.strftime("<span class=\"month\">%b</span><span class=\"day\">%d</span>"))
|
7
|
+
# rescue
|
8
|
+
# end
|
9
|
+
|
10
|
+
# remember to return your modified copy of temp
|
11
|
+
temp
|
12
|
+
end
|
13
|
+
end
|
@@ -6,7 +6,7 @@ class ImagineCmsMailer < ActionMailer::Base
|
|
6
6
|
@page_version = page_version
|
7
7
|
@recipient = recipient
|
8
8
|
@sender = sender
|
9
|
-
@change_description = change_description
|
9
|
+
@change_description = change_description # not currently used
|
10
10
|
|
11
11
|
mail(to: recipient.email_address, reply_to: (sender.email_address.blank? ? nil : sender.email_address),
|
12
12
|
from: "#{sender.first_name} #{sender.last_name} <#{CmsRequestReviewEmailSender}>",
|
@@ -5,11 +5,11 @@
|
|
5
5
|
</div>
|
6
6
|
|
7
7
|
<div dojoType="ModalFloatingPane" id="page_browser_dialog" title="Select Page"
|
8
|
-
hasShadow="true" resizable="true" followScroll="false" displayCloseAction="true" style="width:
|
8
|
+
hasShadow="true" resizable="true" followScroll="false" displayCloseAction="true" style="width: 620px; height: 426px;">
|
9
9
|
<div>
|
10
|
-
<div id="page_browser" style="height:
|
10
|
+
<div id="page_browser" style="height: 345px; padding-top: 0px; margin-bottom: 8px;">Loading...</div>
|
11
11
|
|
12
|
-
<input id="page_browser_selection" type="text" class="form" style="width:
|
12
|
+
<input id="page_browser_selection" type="text" class="form" style="width: 516px; padding: 2px;" />
|
13
13
|
<button onclick="closePageBrowser(); return false;" class="form" style="width: 70px">Select</button>
|
14
14
|
</div>
|
15
15
|
</div>
|
@@ -1,11 +1,6 @@
|
|
1
1
|
<%#= javascript_tag 'var djConfig = { isDebug: true };' %>
|
2
2
|
|
3
|
-
<script
|
4
|
-
var load_dojo = false;
|
5
|
-
if (<%= @load_dojo || 'false' %>) {
|
6
|
-
load_dojo = true;
|
7
|
-
}
|
8
|
-
|
3
|
+
<script>
|
9
4
|
function readCookie(name) {
|
10
5
|
var ca = document.cookie.split(';');
|
11
6
|
for (var i=0; i < ca.length; i++) {
|
@@ -19,13 +14,18 @@
|
|
19
14
|
function loggedIn() {
|
20
15
|
return readCookie('user_auth_status') == 'authenticated';
|
21
16
|
}
|
22
|
-
|
17
|
+
</script>
|
18
|
+
<script type="text/javascript">
|
19
|
+
var load_dojo = false;
|
20
|
+
if (<%= @load_dojo || 'false' %>) {
|
21
|
+
load_dojo = true;
|
22
|
+
}
|
23
|
+
|
23
24
|
if (loggedIn() || load_dojo) {
|
24
25
|
document.writeln('<scr' + 'ipt src="/assets/dojo/dojo.js" type="text/javascript"></scr' + 'ipt>');
|
25
26
|
document.writeln('<link href="/assets/imagine_controls.css" media="screen" rel="stylesheet" type="text/css" />')
|
26
27
|
}
|
27
28
|
</script>
|
28
|
-
|
29
29
|
<script type="text/javascript">
|
30
30
|
if (loggedIn()) {
|
31
31
|
dojo.require("dojo.widget.Editor2");
|
@@ -47,13 +47,14 @@
|
|
47
47
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
|
48
48
|
|
49
49
|
<title><%= controller.controller_path.split('/').concat([ params[:action] ]).map { |s| s.titlecase }.join(' > ') %></title>
|
50
|
-
<%- if is_logged_in_user? -%>
|
51
|
-
<script src="/assets/dojo/dojo.js" type="text/javascript"></script>
|
52
|
-
<%- end -%>
|
53
50
|
<%= stylesheet_link_tag "application", media: "all" %>
|
54
51
|
<%= stylesheet_link_tag "management", media: "all" %>
|
55
52
|
<%= javascript_include_tag "application" %>
|
56
|
-
|
53
|
+
|
54
|
+
<%- if is_logged_in_user? -%>
|
55
|
+
<script src="/assets/dojo/dojo.js" type="text/javascript"></script>
|
56
|
+
<%- end -%>
|
57
|
+
|
57
58
|
<%= csrf_meta_tag %>
|
58
59
|
</head>
|
59
60
|
|
@@ -4,17 +4,30 @@
|
|
4
4
|
-%>
|
5
5
|
<%= javascript_tag <<-EOF
|
6
6
|
var curInst = dojo.widget.Editor2Manager.getCurrentInstance();
|
7
|
-
linkNode = dojo.withGlobal(curInst.window, "getAncestorElement", dojo.html.selection, ['a']);
|
7
|
+
var linkNode = dojo.withGlobal(curInst.window, "getAncestorElement", dojo.html.selection, ['a']);
|
8
|
+
var html = '';
|
8
9
|
|
9
10
|
curInst.restoreSelection();
|
10
11
|
|
12
|
+
var removeInvalidTags = function(html) {
|
13
|
+
var el = document.createElement('div');
|
14
|
+
el.innerHTML = html;
|
15
|
+
['script', 'title'].forEach(function(tag) {
|
16
|
+
el.querySelectorAll(tag).forEach(function(del) { del.remove(); });
|
17
|
+
});
|
18
|
+
return el.innerHTML;
|
19
|
+
};
|
20
|
+
|
11
21
|
if (!linkNode) {
|
12
|
-
|
22
|
+
html = dojo.withGlobal(curInst.window, 'getSelectedHtml', dojo.html.selection);
|
13
23
|
} else {
|
14
|
-
|
24
|
+
html = linkNode.innerHTML;
|
15
25
|
dojo.withGlobal(curInst.window, 'selectElement', dojo.html.selection, [linkNode]);
|
16
26
|
}
|
17
27
|
|
28
|
+
html = removeInvalidTags(html).trim();
|
29
|
+
if (html === '') html = "Link Text";
|
30
|
+
|
18
31
|
curInst.execCommand('inserthtml', '<a href=\"#{page_file_path(@pg, @filename)}\" class=\"file-#{ext}\" target=\"_blank\">'+html+'</a>');
|
19
32
|
cancelInsertFile();
|
20
33
|
EOF
|
@@ -197,7 +197,7 @@ Pressing "Save Feature Image" will crop the image and set it as the new feature
|
|
197
197
|
</tr>
|
198
198
|
</table>
|
199
199
|
|
200
|
-
<%= submit_tag 'Save Feature Image', :class => 'form_button', :
|
200
|
+
<%= submit_tag 'Save Feature Image', :class => 'form_button', data: { disable_with: 'Saving...' } %>
|
201
201
|
<%= link_to_function "Cancel", "cancelSelectThumbnail()" %>
|
202
202
|
<%- end -%>
|
203
203
|
</center>
|
@@ -1,25 +1,27 @@
|
|
1
1
|
<script type="text/javascript">
|
2
|
+
window.scrollTo(0,0);
|
3
|
+
|
2
4
|
var resize_ratio = 1.0;
|
3
5
|
var aspect_ratio = <%= @width %>.0 / <%= @height %>;
|
4
6
|
var imageSizeLocked = false;
|
5
|
-
|
7
|
+
|
6
8
|
try {
|
7
9
|
if (cropper) cropper.remove();
|
8
10
|
} catch (e) {}
|
9
|
-
|
11
|
+
|
10
12
|
deselectAllPresets = function() {
|
11
13
|
jQuery('input[type=radio].image-size-preset').attr('checked', false);
|
12
14
|
}
|
13
|
-
|
15
|
+
|
14
16
|
onEndCrop = function (coords, dimensions) {
|
15
17
|
if (dimensions.width > 0 && dimensions.height > 0) {
|
16
18
|
var size_changed = false;
|
17
|
-
|
19
|
+
|
18
20
|
$('image_x1').value = coords.x1;
|
19
21
|
$('image_y1').value = coords.y1;
|
20
22
|
$('image_x2').value = coords.x2;
|
21
23
|
$('image_y2').value = coords.y2;
|
22
|
-
|
24
|
+
|
23
25
|
if (dimensions.width != $('image_width').value) {
|
24
26
|
$('image_width').value = dimensions.width;
|
25
27
|
size_changed = true;
|
@@ -28,14 +30,14 @@
|
|
28
30
|
$('image_height').value = dimensions.height;
|
29
31
|
size_changed = true;
|
30
32
|
}
|
31
|
-
|
33
|
+
|
32
34
|
if (size_changed) {
|
33
35
|
setResizeRatio();
|
34
36
|
aspect_ratio = 1.0 * dimensions.width / dimensions.height;
|
35
|
-
|
37
|
+
|
36
38
|
$('selection_x2').value = dimensions.width;
|
37
39
|
$('selection_y2').value = dimensions.height;
|
38
|
-
|
40
|
+
|
39
41
|
if (!imageSizeLocked) {
|
40
42
|
if (resize_ratio) {
|
41
43
|
$('image_max_width').value = Math.round(dimensions.width * resize_ratio);
|
@@ -45,12 +47,12 @@
|
|
45
47
|
$('image_max_height').value = dimensions.height;
|
46
48
|
}
|
47
49
|
}
|
48
|
-
|
50
|
+
|
49
51
|
$('aspect_ratio').innerHTML = setPrecision(dimensions.width/dimensions.height, 3);
|
50
52
|
}
|
51
53
|
}
|
52
54
|
}
|
53
|
-
|
55
|
+
|
54
56
|
resizeCropper = function () {
|
55
57
|
width = $('selection_x2').value;
|
56
58
|
height = $('selection_y2').value;
|
@@ -63,10 +65,10 @@
|
|
63
65
|
cropper.selArea.show();
|
64
66
|
cropper.drawArea();
|
65
67
|
cropper.endCrop();
|
66
|
-
|
68
|
+
|
67
69
|
setResizeRatio();
|
68
70
|
}
|
69
|
-
|
71
|
+
|
70
72
|
resizeCropperScaled = function () {
|
71
73
|
if (imageSizeLocked) {
|
72
74
|
width = parseInt($('image_max_width').value);
|
@@ -81,37 +83,37 @@
|
|
81
83
|
resizeCropper();
|
82
84
|
}
|
83
85
|
}
|
84
|
-
|
86
|
+
|
85
87
|
setResizeRatio = function () {
|
86
88
|
crop_width = parseInt($('image_max_width').value);
|
87
89
|
selection_width = parseInt($('selection_x2').value); // this is correct... x2 is the sel width
|
88
|
-
|
90
|
+
|
89
91
|
if (crop_width > 10 && selection_width > 10) {
|
90
92
|
resize_ratio = 1.0 * $('image_max_width').value / $('selection_x2').value;
|
91
93
|
} else {
|
92
94
|
resize_ratio = 1.0;
|
93
95
|
}
|
94
96
|
}
|
95
|
-
|
97
|
+
|
96
98
|
lockImageSize = function () {
|
97
99
|
imageSizeLocked = true;
|
98
100
|
cropper.options.ratioDim = { x: parseInt($('image_max_width').value),
|
99
101
|
y: parseInt($('image_max_height').value) };
|
100
102
|
reloadCropper();
|
101
|
-
|
103
|
+
|
102
104
|
$('icon_unlocked').hide();
|
103
105
|
$('icon_locked').show();
|
104
106
|
}
|
105
|
-
|
107
|
+
|
106
108
|
unlockImageSize = function () {
|
107
109
|
imageSizeLocked = false;
|
108
110
|
cropper.options.ratioDim = { x: 0, y: 0 };
|
109
111
|
reloadCropper();
|
110
|
-
|
112
|
+
|
111
113
|
$('icon_locked').hide();
|
112
114
|
$('icon_unlocked').show();
|
113
115
|
}
|
114
|
-
|
116
|
+
|
115
117
|
reloadCropper = function () {
|
116
118
|
oldOptions = cropper.options;
|
117
119
|
oldOptions.displayOnInit = 1;
|
@@ -126,13 +128,13 @@
|
|
126
128
|
cropper.remove();
|
127
129
|
cropper = new Cropper.Img('testImage', oldOptions);
|
128
130
|
}
|
129
|
-
|
131
|
+
|
130
132
|
recalculateWidth = function () {
|
131
133
|
if (imageSizeLocked) {
|
132
134
|
$('image_max_width').value = Math.round(parseInt($('image_max_height').value) / aspect_ratio);
|
133
135
|
}
|
134
136
|
}
|
135
|
-
|
137
|
+
|
136
138
|
recalculateHeight = function () {
|
137
139
|
if (imageSizeLocked) {
|
138
140
|
$('image_max_height').value = Math.round(parseInt($('image_max_width').value) / aspect_ratio);
|
@@ -161,10 +163,10 @@ Pressing "Save Image" will crop the image and insert it into the page.
|
|
161
163
|
<legend>Adjust Crop:</legend>
|
162
164
|
<%= text_field :selection, :x2, :size => 3, :onkeyup => "resizeCropper();" %> x <%= text_field :selection, :y2, :size => 3, :onkeyup => "resizeCropper();" %>
|
163
165
|
</fieldset>
|
164
|
-
|
166
|
+
|
165
167
|
<fieldset style="padding: 10px 15px; text-align: center;">
|
166
168
|
<legend>Output Image Dimensions</legend>
|
167
|
-
|
169
|
+
|
168
170
|
<%- if defined?(CmsImageCropPresets) -%>
|
169
171
|
<div style="text-align: left; margin-bottom: 20px;">
|
170
172
|
<strong>Presets:</strong><br>
|
@@ -174,17 +176,17 @@ Pressing "Save Image" will crop the image and insert it into the page.
|
|
174
176
|
<%- end -%>
|
175
177
|
</div>
|
176
178
|
<%- end -%>
|
177
|
-
|
179
|
+
|
178
180
|
<%= text_field :image, :max_width, :size => 3, :value => @width, :onchange => "deselectAllPresets(); recalculateHeight();" %>
|
179
181
|
x <%= text_field :image, :max_height, :size => 3, :value => @height, :onchange => "deselectAllPresets(); recalculateWidth();" %>
|
180
182
|
<%= javascript_tag "$('image_max_width').onkeydown = disableEnterKey; $('image_max_height').onkeydown = disableEnterKey;" %>
|
181
|
-
|
183
|
+
|
182
184
|
<%= image_tag('management/icon_unlocked.png', :id => 'icon_unlocked', :onclick => "deselectAllPresets(); lockImageSize();") %>
|
183
185
|
<%= image_tag('management/icon_locked.png', :id => 'icon_locked', :onclick => "deselectAllPresets(); unlockImageSize();", :style => 'display: none;') %>
|
184
|
-
|
186
|
+
|
185
187
|
<%= link_to_function "Apply", "resizeCropperScaled();" %> |
|
186
188
|
<%= link_to_function "Reset", "cropper.reset(); resize_ratio = 1.0;" %>
|
187
|
-
|
189
|
+
|
188
190
|
<span id="aspect_ratio" style="display: none;"><%= sprintf("%.3f", @aspect_ratio) %></span><br/>
|
189
191
|
<%= text_field :image, :x1, :style => "display: none" %>
|
190
192
|
<%= text_field :image, :y1, :style => "display: none" %>
|
@@ -196,8 +198,8 @@ Pressing "Save Image" will crop the image and insert it into the page.
|
|
196
198
|
</td>
|
197
199
|
</tr>
|
198
200
|
</table>
|
199
|
-
|
200
|
-
<%= submit_tag 'Save Image', :
|
201
|
+
|
202
|
+
<%= submit_tag 'Save Image', class: 'form_button', style: 'width: 90px;', data: { disable_with: 'Saving...' } %>
|
201
203
|
<%= link_to_function "Cancel", "cancelInsertImage();" %>
|
202
204
|
<%- end -%>
|
203
205
|
</center>
|