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.
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>