imagine_cms 5.2.0 → 5.2.5
Sign up to get free protection for your applications and to get access to all the features.
- 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>
|