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.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/Dockerfile +16 -42
  3. data/README.md +28 -11
  4. data/app/assets/javascripts/dojo/dojo.js +1 -1
  5. data/app/assets/javascripts/dojo/src/widget/templates/richtextframe.html +3 -0
  6. data/app/assets/javascripts/imagine_cms/core.js +31 -40
  7. data/app/assets/stylesheets/imagine_cms.css.scss +15 -7
  8. data/app/assets/stylesheets/imagine_controls.css.scss +45 -2
  9. data/app/controllers/cms/content_controller.rb +2 -2
  10. data/app/controllers/manage/cms_pages_controller.rb +34 -25
  11. data/app/helpers/cms_application_helper.rb +27 -27
  12. data/app/helpers/cms_custom_helper.rb +13 -0
  13. data/app/mailers/imagine_cms_mailer.rb +1 -1
  14. data/app/views/imagine_cms/_dialogs.html.erb +3 -3
  15. data/app/views/imagine_cms/_header.html.erb +8 -8
  16. data/app/views/imagine_cms_mailer/request_review.text.erb +0 -2
  17. data/app/views/layouts/management.html.erb +5 -4
  18. data/app/views/manage/cms_pages/_create_file_link.html.erb +16 -3
  19. data/app/views/manage/cms_pages/_crop_feature_image.html.erb +1 -1
  20. data/app/views/manage/cms_pages/_crop_image.html.erb +31 -29
  21. data/app/views/manage/cms_pages/_crop_thumb.html.erb +1 -1
  22. data/app/views/manage/cms_pages/_edit_page.html.erb +18 -4
  23. data/app/views/manage/cms_pages/_list_page.html.erb +28 -7
  24. data/app/views/manage/cms_pages/_list_page_select.html.erb +17 -7
  25. data/app/views/manage/cms_pages/_list_pages.html.erb +1 -1
  26. data/app/views/manage/cms_pages/_list_pages_select.html.erb +1 -1
  27. data/app/views/manage/cms_pages/_page_list.html.erb +5 -5
  28. data/app/views/manage/cms_pages/_page_list_source_tag.html.erb +6 -2
  29. data/app/views/manage/cms_pages/_upload_feature_image.html.erb +51 -11
  30. data/app/views/manage/cms_pages/_upload_file.html.erb +2 -2
  31. data/app/views/manage/cms_pages/_upload_image.html.erb +95 -23
  32. data/app/views/manage/cms_pages/_upload_thumb.html.erb +51 -11
  33. data/app/views/manage/cms_pages/gallery_management.html.erb +1 -1
  34. data/app/views/manage/cms_pages/index.html.erb +36 -35
  35. data/app/views/manage/cms_pages/select_page.html.erb +39 -39
  36. data/app/views/manage/cms_pages/toolbar_preview.html.erb +1 -1
  37. data/app/views/management/users/index.html.erb +1 -1
  38. data/docker-compose.override.yml.example +6 -19
  39. data/docker-compose.yml +5 -7
  40. data/docker/conf/{nginx-vhost.conf → nginx-vhost.conf.template} +3 -3
  41. data/docker/services/{memcached.sh → memcached} +0 -0
  42. data/docker/services/{sidekiq.sh → sidekiq} +0 -0
  43. data/docker/services/{webpack.sh → webpack} +0 -0
  44. data/lib/extensions/action_controller_extensions.rb +18 -17
  45. data/lib/imagine_cms/engine.rb +1 -0
  46. data/lib/imagine_cms/version.rb +1 -1
  47. data/lib/upload_progress/lib/multipart_progress.rb +1 -1
  48. 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 nothing: true
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, { :dojoType => 'Editor2', :toolbarGroup => 'main', :isToolbarGroupLeader => 'false',
479
- :focusOnLoad => focusOnLoad.to_s, :style => 'border: 2px dashed gray; padding: 5px',
480
- :minHeight => '100px' }.update(html_options))
481
- content << content_tag(:div, ''.html_safe, :id => "page_object_config_#{key}")
482
- content << javascript_tag("jQuery(document).ready(function () { scanForPageObjects(#{@pg.id}, '#{key}', #{@pg.version}); });")
483
- content << observe_field("page_objects_#{key}", :function => "scanForPageObjects(#{@pg.id}, '#{key}', #{@pg.version});", :frequency => 2)
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
- finish_upload_status "'#{File.basename(localfile)}'"
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
- if !user_has_permission?(:manage_cms)
1279
- render '/imagine_cms/errors/permission_denied', :layout => false
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
- allowed_sections = @user.cms_allowed_sections.split(',').map { |s| s.strip }.reject { |s| s.blank? }
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
- return false if !parent
1292
- path = '/' + parent.path
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 = false
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 :text => "Sorry, you don't have permission to edit this page." }
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 = "new Ajax.Updater('date_picker_#{object}_#{method_prefix}_days', '" + date_picker_url + "?" +
817
- "month=' + $('#{object}_#{method_prefix}_month_sel').value + " +
818
- "'&year=' + $('#{object}_#{method_prefix}_year_sel').value + " +
819
- "'&min_time=' + #{start_date.to_i} + " +
820
- "'&max_time=' + #{end_date.to_i} + " +
821
- "'&exclude_days=#{exclude_days.join(',')}' + " +
822
- "'&onchange=#{escape_javascript(options[:onchange])}' + " +
823
- "'&object=#{object}' + " +
824
- "'&method_prefix=#{method_prefix}', {method:'get', asynchronous:true, evalScripts:true})"
825
-
826
- ret = <<EOF
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
- EOF
851
- ret += javascript_tag(draw_calendar)
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: 520px; height: 326px;">
8
+ hasShadow="true" resizable="true" followScroll="false" displayCloseAction="true" style="width: 620px; height: 426px;">
9
9
  <div>
10
- <div id="page_browser" style="height: 220px; padding-top: 10px; margin-bottom: 8px;">Loading...</div>
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: 416px; padding: 2px;" />
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 type="text/javascript">
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");
@@ -3,8 +3,6 @@
3
3
  Title: <%= @page_title %>
4
4
  URL: <%= @page_url %>
5
5
  Version: <%= @page_version %>
6
- Description of change:
7
- <%= @change_description %>
8
6
 
9
7
  View/approve this change:
10
8
  <%= @page_url %>/version/<%= @page_version %>
@@ -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
- var html = dojo.withGlobal(curInst.window, 'getSelectedHtml', dojo.html.selection);
22
+ html = dojo.withGlobal(curInst.window, 'getSelectedHtml', dojo.html.selection);
13
23
  } else {
14
- var html = linkNode.innerHTML;
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', :onclick => 'cropper.remove(); this.disabled = true; this.value = "Saving...";' %>
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', :class => 'form_button', :style => 'width: 90px;', :onclick => 'cropper.remove(); this.disabled = true; this.value = "Saving...";' %>
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>