refinerycms-page-images 2.0.1 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.travis.yml +20 -9
- data/Gemfile +22 -51
- data/Rakefile +2 -0
- data/app/assets/javascripts/refinery/page-image-picker.js.erb +173 -150
- data/app/assets/stylesheets/refinery/page-image-picker.css.scss +6 -0
- data/app/views/refinery/admin/pages/tabs/_images.html.erb +2 -1
- data/app/views/refinery/admin/pages/tabs/_images_field.html.erb +15 -3
- data/config/locales/bg.yml +1 -0
- data/config/locales/cs.yml +1 -0
- data/config/locales/de.yml +3 -1
- data/config/locales/en.yml +2 -0
- data/config/locales/es.yml +19 -0
- data/config/locales/fr.yml +1 -0
- data/config/locales/ja.yml +18 -0
- data/config/locales/nl.yml +1 -0
- data/config/locales/pt-BR.yml +1 -0
- data/config/locales/ru.yml +1 -0
- data/config/locales/sk.yml +1 -0
- data/lib/generators/refinery/templates/config/initializers/refinery/page_images.rb.erb +2 -0
- data/lib/refinery/page_images.rb +15 -2
- data/lib/refinery/page_images/configuration.rb +25 -1
- data/lib/refinery/page_images/engine.rb +17 -19
- data/lib/refinery/page_images/extension.rb +2 -2
- data/readme.md +48 -2
- data/refinerycms-page-images.gemspec +7 -8
- data/spec/factories/page-images.rb +2 -2
- data/spec/features/attach_page_images_spec.rb +58 -0
- data/spec/lib/refinery/initializer_spec.rb +42 -0
- data/spec/models/refinery/blog_spec.rb +3 -3
- data/spec/models/refinery/page_spec.rb +26 -16
- data/spec/spec_helper.rb +21 -46
- metadata +43 -82
- data/spec/requests/attach_page_images_spec.rb +0 -29
- data/spec/support/database_cleaner.rb +0 -17
- data/spec/support/devise.rb +0 -8
- data/spec/support/refinery.rb +0 -6
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d734dccd4a97c7c04d9752e6cfd85cb2b6266997
|
4
|
+
data.tar.gz: beeee224e8b42b0425e26a3e3e8a49c09aba4e3e
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 515f2c187884f0a6157d5a05fdadf9f2a88c83b77216cafb8091fab7eceb090e12a3f1402c2e56e0eb8ad270ab321c70f8b7af1fd0e399dedf282e1deac74819
|
7
|
+
data.tar.gz: 3a35eaefb138d3104354a442ac6df63c5313a46ba56ec7fc981edf9c9a0e9552daf35a8bf302fa056a5b95852fd527894b5f964c0b6dded04c5f508415952864
|
data/.travis.yml
CHANGED
@@ -1,16 +1,27 @@
|
|
1
|
+
language: ruby
|
2
|
+
bundler_args: --without development
|
1
3
|
before_script:
|
2
|
-
- "
|
3
|
-
|
4
|
+
- "sh -e /etc/init.d/xvfb start"
|
5
|
+
- "bundle exec rake refinery:testing:dummy_app"
|
6
|
+
script:
|
7
|
+
- "DISPLAY=:99.0 bundle exec rspec spec"
|
4
8
|
notifications:
|
5
|
-
email:
|
6
|
-
|
7
|
-
|
9
|
+
email: true
|
10
|
+
irc:
|
11
|
+
use_notice: true
|
12
|
+
skip_join: true
|
13
|
+
channels:
|
14
|
+
- "irc.freenode.org#refinerycms"
|
15
|
+
campfire:
|
16
|
+
on_success: always
|
17
|
+
on_failure: always
|
18
|
+
rooms:
|
19
|
+
- secure: "X5X39BTgXacSdc32F8mIjJKPqm5dZzmgZfJ14qYpJeMETTdA5JfByt2uCfU8\njJkkxT+XGWta0bSSlRIHQJO6pK26U94A95VYDX0jNuneKEnsoAsqJ6U0VY6v\nH5oxXMAZ2perP/FH9ZsPNR+ulyFfbMQCeGPJw5AXKZQqzf6qPOI="
|
8
20
|
env:
|
9
21
|
- DB=postgresql
|
10
22
|
- DB=mysql
|
11
23
|
rvm:
|
12
|
-
-
|
13
|
-
- 1.9.2
|
24
|
+
- 2.0.0
|
14
25
|
- 1.9.3
|
15
|
-
- rbx
|
16
|
-
- jruby
|
26
|
+
- rbx-19mode
|
27
|
+
- jruby-19mode
|
data/Gemfile
CHANGED
@@ -2,62 +2,30 @@ source "http://rubygems.org"
|
|
2
2
|
|
3
3
|
gemspec
|
4
4
|
|
5
|
-
gem 'refinerycms', '~> 2.0
|
5
|
+
gem 'refinerycms', '~> 2.1.0'
|
6
|
+
gem 'refinerycms-testing', '~> 2.1.0', :group => :test
|
6
7
|
|
7
|
-
|
8
|
-
|
8
|
+
# Database Configuration
|
9
|
+
unless ENV['TRAVIS']
|
10
|
+
gem 'activerecord-jdbcsqlite3-adapter', :platform => :jruby
|
11
|
+
gem 'sqlite3', :platform => :ruby
|
9
12
|
end
|
10
13
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
gem 'activerecord-jdbcmysql-adapter'
|
17
|
-
gem 'activerecord-jdbcpostgresql-adapter'
|
18
|
-
gem 'jruby-openssl'
|
19
|
-
end
|
20
|
-
|
21
|
-
unless defined?(JRUBY_VERSION)
|
22
|
-
gem 'sqlite3'
|
23
|
-
gem 'mysql2'
|
24
|
-
gem 'pg'
|
25
|
-
end
|
26
|
-
|
27
|
-
platforms :mswin, :mingw do
|
28
|
-
gem 'win32console'
|
29
|
-
gem 'rb-fchange', '~> 0.0.5'
|
30
|
-
gem 'rb-notifu', '~> 0.0.4'
|
31
|
-
end
|
14
|
+
if !ENV['TRAVIS'] || ENV['DB'] == 'mysql'
|
15
|
+
gem 'activerecord-jdbcmysql-adapter', :platform => :jruby
|
16
|
+
gem 'jdbc-mysql', '= 5.1.13', :platform => :jruby
|
17
|
+
gem 'mysql2', :platform => :ruby
|
18
|
+
end
|
32
19
|
|
33
|
-
|
34
|
-
|
35
|
-
|
20
|
+
if !ENV['TRAVIS'] || ENV['DB'] == 'postgresql'
|
21
|
+
gem 'activerecord-jdbcpostgresql-adapter', :platform => :jruby
|
22
|
+
gem 'pg', :platform => :ruby
|
23
|
+
end
|
36
24
|
|
37
|
-
|
38
|
-
if RbConfig::CONFIG['target_os'] =~ /darwin/i
|
39
|
-
gem 'rb-fsevent', '>= 0.3.9'
|
40
|
-
gem 'growl', '~> 1.0.3'
|
41
|
-
end
|
42
|
-
if RbConfig::CONFIG['target_os'] =~ /linux/i
|
43
|
-
gem 'rb-inotify', '>= 0.5.1'
|
44
|
-
gem 'libnotify', '~> 0.1.3'
|
45
|
-
gem 'therubyracer', '~> 0.9.9'
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
25
|
+
gem 'jruby-openssl', :platform => :jruby
|
49
26
|
|
50
|
-
|
51
|
-
|
52
|
-
if RbConfig::CONFIG['target_os'] =~ /darwin/i
|
53
|
-
gem 'growl', '~> 1.0.3'
|
54
|
-
end
|
55
|
-
if RbConfig::CONFIG['target_os'] =~ /linux/i
|
56
|
-
gem 'rb-inotify', '>= 0.5.1'
|
57
|
-
gem 'libnotify', '~> 0.1.3'
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
27
|
+
group :test do
|
28
|
+
gem 'poltergeist'
|
61
29
|
end
|
62
30
|
|
63
31
|
# Refinery/rails should pull in the proper versions of these
|
@@ -67,4 +35,7 @@ group :assets do
|
|
67
35
|
gem 'uglifier'
|
68
36
|
end
|
69
37
|
|
70
|
-
|
38
|
+
# Load local gems according to Refinery developer preference.
|
39
|
+
if File.exist? local_gemfile = File.expand_path('../.gemfile', __FILE__)
|
40
|
+
eval File.read(local_gemfile)
|
41
|
+
end
|
data/Rakefile
CHANGED
@@ -1,167 +1,190 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
1
|
+
<%# encoding: utf-8 %>
|
2
|
+
var image_added; // Global callback
|
3
|
+
(function($) {
|
4
|
+
var reset_functionality, open_image_caption, reindex_images,
|
5
|
+
template_li, wysiwyg_enabled, input_type;
|
6
|
+
$(document).ready(function(){
|
7
|
+
var picker = $('#page_image_picker');
|
8
|
+
input_type = picker.data('input-type');
|
9
|
+
wysiwyg_enabled = input_type == 'wym';
|
10
|
+
|
11
|
+
$('#custom_images_tab a').click(function(){
|
12
|
+
if (!picker.data('size-applied') && wysiwyg_enabled){
|
13
|
+
var wym_box = $('.page_part:first .wym_box'),
|
14
|
+
iframe = $('.page_part:first iframe');
|
15
|
+
picker.css({
|
16
|
+
height: wym_box.height()
|
17
|
+
, width: wym_box.width()
|
18
|
+
}).data('size-applied', true).corner('tr 5px').corner('bottom 5px').find('.wym_box').css({
|
19
|
+
backgroundColor: 'white'
|
20
|
+
, height: iframe.height() + $('.page_part:first .wym_area_top').height() - parseInt($('.wym_area_top .label_inline_with_link a').css('lineHeight'))
|
21
|
+
, width: iframe.width() - 20
|
22
|
+
, 'border-color': iframe.css('border-top-color')
|
23
|
+
, 'border-style': iframe.css('border-top-style')
|
24
|
+
, 'border-width': iframe.css('border-top-width')
|
25
|
+
, padding: '0px 10px 0px 10px'
|
26
|
+
});
|
27
|
+
}
|
28
|
+
});
|
20
29
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
30
|
+
// Webkit browsers don't like the textarea being moved around the DOM,
|
31
|
+
// they ignore the new contents. This is fixed below by adding a hidden
|
32
|
+
// field that stays in place.
|
33
|
+
$('#page_images li textarea:hidden').each(function(index) {
|
34
|
+
var old_name = $(this).attr('name'),
|
35
|
+
$this = $(this);
|
36
|
+
$this.attr('data-old-id', $this.attr('id'));
|
37
|
+
$this.attr('name', 'ignore_me_' + index);
|
38
|
+
$this.attr('id', 'ignore_me_' + index);
|
39
|
+
|
40
|
+
var hidden = $('<input>')
|
41
|
+
.addClass('caption')
|
42
|
+
.attr('type', 'hidden')
|
43
|
+
.attr('name', old_name)
|
44
|
+
.attr('id', $this.attr('data-old-id'))
|
45
|
+
.val($this.val());
|
46
|
+
|
47
|
+
$this.parents('li').first().append(hidden);
|
48
|
+
});
|
39
49
|
|
40
|
-
|
41
|
-
});
|
50
|
+
reset_functionality();
|
42
51
|
|
43
|
-
reset_functionality = function() {
|
44
|
-
WYMeditor.onload_functions.push(function(){
|
45
|
-
$('.wym_box').css({'width':null});
|
46
|
-
});
|
47
52
|
|
48
|
-
|
49
|
-
'
|
50
|
-
|
51
|
-
, 'cursor': 'drag'
|
52
|
-
, 'items': 'li'
|
53
|
-
, stop: reindex_images
|
53
|
+
// Once the plugin has init'd everything, remove the template UI
|
54
|
+
$('.page-images-caption-modal').hide();
|
55
|
+
template_li = $('#page_images .js-page-images-template').detach();
|
54
56
|
});
|
55
57
|
|
56
|
-
|
57
|
-
if
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
58
|
+
reset_functionality = function() {
|
59
|
+
if(wysiwyg_enabled) {
|
60
|
+
WYMeditor.onload_functions.push(function(){
|
61
|
+
$('.wym_box').css({'width':null});
|
62
|
+
});
|
63
|
+
}
|
64
|
+
|
65
|
+
$("#page_images").sortable({
|
66
|
+
'tolerance': 'pointer'
|
67
|
+
, 'placeholder': 'placeholder'
|
68
|
+
, 'cursor': 'drag'
|
69
|
+
, 'items': 'li'
|
70
|
+
, stop: reindex_images
|
71
|
+
});
|
66
72
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
image_actions
|
73
|
+
$('#page_images').on('mouseenter mouseleave', 'li', function(e) {
|
74
|
+
var $this = $(this),
|
75
|
+
image_actions = $this.find('.image_actions');
|
76
|
+
if (e.type == 'mouseenter') {
|
77
|
+
if (image_actions.length == 0) {
|
78
|
+
image_actions = $("<div class='image_actions'></div>");
|
79
|
+
var img_delete = $("<img src='<%= image_path('refinery/icons/delete.png') %>' width='16' height='16' />");
|
80
|
+
img_delete.appendTo(image_actions);
|
81
|
+
img_delete.click(function() {
|
82
|
+
$(this).parents('li').first().remove();
|
83
|
+
reindex_images();
|
84
|
+
});
|
85
|
+
|
86
|
+
if ($this.find('textarea.page_caption').length > 0) {
|
87
|
+
var img_caption = $("<img src='<%= image_path('refinery/icons/user_comment.png') %>' width='16' height='16' class='caption' />");
|
88
|
+
img_caption.appendTo(image_actions);
|
89
|
+
img_caption.click(open_image_caption);
|
90
|
+
} else {
|
91
|
+
image_actions.addClass('no_captions');
|
92
|
+
}
|
93
|
+
|
94
|
+
image_actions.appendTo($this);
|
73
95
|
}
|
74
96
|
|
75
|
-
image_actions.
|
97
|
+
image_actions.show();
|
98
|
+
} else if (e.type == 'mouseleave') {
|
99
|
+
image_actions.hide();
|
76
100
|
}
|
101
|
+
});
|
102
|
+
|
103
|
+
reindex_images();
|
104
|
+
};
|
105
|
+
|
106
|
+
image_added = function(image) {
|
107
|
+
var current_list_item = template_li.clone(),
|
108
|
+
image_id = $(image).attr('id').replace('image_', '');
|
109
|
+
current_list_item.find('input:hidden:first').val(image_id);
|
110
|
+
|
111
|
+
$("<img />").attr({
|
112
|
+
title: $(image).attr('title')
|
113
|
+
, alt: $(image).attr('alt')
|
114
|
+
, src: $(image).attr('data-grid') // use 'grid' size that is built into Refinery CMS (135x135#c).
|
115
|
+
}).appendTo(current_list_item);
|
116
|
+
|
117
|
+
current_list_item.attr('id', 'image_' + image_id).removeClass('empty');
|
118
|
+
|
119
|
+
current_list_item.appendTo($('#page_images'));
|
120
|
+
reset_functionality();
|
121
|
+
};
|
122
|
+
|
123
|
+
open_image_caption = function(e) {
|
124
|
+
var list_item = $(this).closest('li'),
|
125
|
+
textarea = list_item.find('.page-images-caption-modal > textarea'),
|
126
|
+
textarea_wrapper = textarea.parent(),
|
127
|
+
modal_size = {
|
128
|
+
textarea: { width: 400, height: 'auto' },
|
129
|
+
wym: { width: 928, height: 530 }
|
130
|
+
};
|
131
|
+
|
132
|
+
textarea_wrapper.find('.js-page-images-done').on('click', function() {
|
133
|
+
textarea_wrapper.dialog("close");
|
134
|
+
});
|
135
|
+
|
136
|
+
var close_handler = function() {
|
137
|
+
if(wysiwyg_enabled) {
|
138
|
+
textarea.data('wymeditor').update();
|
139
|
+
}
|
140
|
+
|
141
|
+
$('li.current_caption_list_item').removeClass('current_caption_list_item');
|
142
|
+
$('#' + textarea.attr('data-old-id')).val(textarea.val());
|
143
|
+
textarea_wrapper.dialog('destroy');
|
144
|
+
};
|
145
|
+
|
146
|
+
// move the textarea out of the list item, and then move the textarea back into it when we click done.
|
147
|
+
list_item.addClass('current_caption_list_item');
|
148
|
+
textarea_wrapper.dialog({
|
149
|
+
title: "<%= I18n.t('refinery.js.admin.page_images.add_caption') %>"
|
150
|
+
, modal: true
|
151
|
+
, resizable: false
|
152
|
+
, autoOpen: true
|
153
|
+
, width: modal_size[input_type].width
|
154
|
+
, height: modal_size[input_type].height
|
155
|
+
, close: close_handler
|
156
|
+
});
|
77
157
|
|
78
|
-
|
79
|
-
|
80
|
-
$(this).find('.image_actions').hide();
|
158
|
+
if(wysiwyg_enabled) {
|
159
|
+
textarea.addClass('wymeditor active_rotator_wymeditor widest').wymeditor(wymeditor_boot_options);
|
81
160
|
}
|
82
|
-
|
161
|
+
else {
|
162
|
+
textarea.show();
|
163
|
+
}
|
164
|
+
};
|
83
165
|
|
84
|
-
reindex_images()
|
85
|
-
|
86
|
-
|
87
|
-
image_added = function(image) {
|
88
|
-
new_list_item = (current_list_item = $('li.empty')).clone();
|
89
|
-
image_id = $(image).attr('id').replace('image_', '');
|
90
|
-
current_list_item.find('input:hidden:first').val(image_id);
|
91
|
-
|
92
|
-
$("<img />").attr({
|
93
|
-
title: $(image).attr('title')
|
94
|
-
, alt: $(image).attr('alt')
|
95
|
-
, src: $(image).attr('data-grid') // use 'grid' size that is built into Refinery CMS (135x135#c).
|
96
|
-
}).appendTo(current_list_item);
|
97
|
-
|
98
|
-
current_list_item.attr('id', 'image_' + image_id).removeClass('empty');
|
99
|
-
|
100
|
-
new_list_item.appendTo($('#page_images'));
|
101
|
-
reset_functionality();
|
102
|
-
}
|
103
|
-
|
104
|
-
open_image_caption = function(e) {
|
105
|
-
// move the textarea out of the list item, and then move the textarea back into it when we click done.
|
106
|
-
(list_item = $(this).parents('li').first()).addClass('current_caption_list_item');
|
107
|
-
textarea = list_item.find('.textarea_wrapper_for_wym > textarea');
|
108
|
-
|
109
|
-
textarea.after($("<div class='form-actions'><div class='form-actions-left'><a class='button'><%= I18n.t('refinery.js.admin.page_images.done') %></a></div></div>"));
|
110
|
-
textarea.parent().dialog({
|
111
|
-
title: "<%= I18n.t('refinery.js.admin.page_images.add_caption') %>"
|
112
|
-
, modal: true
|
113
|
-
, resizable: false
|
114
|
-
, autoOpen: true
|
115
|
-
, width: 928
|
116
|
-
, height: 530
|
117
|
-
});
|
118
|
-
|
119
|
-
$('.ui-dialog:visible .ui-dialog-titlebar-close, .ui-dialog:visible .form-actions a.button')
|
120
|
-
.on('click',
|
121
|
-
$.proxy(function(e) {
|
122
|
-
// first, update the editor because we're blocking event bubbling (third argument to bind set to false).
|
123
|
-
$(this).data('wymeditor').update();
|
124
|
-
$(this).removeClass('wymeditor')
|
125
|
-
.removeClass('active_rotator_wymeditor');
|
126
|
-
|
127
|
-
$this_parent = $(this).parent();
|
128
|
-
$this_parent.appendTo('li.current_caption_list_item').dialog('close').data('dialog', null);
|
129
|
-
$this_parent.find('.form-actions').remove();
|
130
|
-
$this_parent.find('.wym_box').remove();
|
131
|
-
$this_parent.css('height', 'auto');
|
132
|
-
$this_parent.removeClass('ui-dialog-content').removeClass('ui-widget-content');
|
133
|
-
|
134
|
-
$('li.current_caption_list_item').removeClass('current_caption_list_item');
|
135
|
-
|
136
|
-
$('.ui-dialog, .ui-widget-overlay:visible').remove();
|
137
|
-
|
138
|
-
$('#' + $(this).attr('data-old-id')).val($(this).val());
|
139
|
-
}, textarea)
|
140
|
-
);
|
141
|
-
|
142
|
-
textarea.addClass('wymeditor active_rotator_wymeditor widest').wymeditor(wymeditor_boot_options);
|
143
|
-
}
|
144
|
-
|
145
|
-
reindex_images = function() {
|
146
|
-
$('#page_images li textarea:hidden').each(function(i, input){
|
147
|
-
// make the image's name consistent with its position.
|
148
|
-
parts = $(input).attr('name').split('_');
|
149
|
-
parts[2] = ('' + i);
|
150
|
-
$(input).attr('name', parts.join('_'));
|
151
|
-
|
152
|
-
// make the image's id consistent with its position.
|
153
|
-
$(input).attr('id', $(input).attr('id').replace(/_\d/, '_' + i));
|
154
|
-
$(input).attr('data-old-id', $(input).attr('data-old-id').replace(/_\d_/, '_'+i+'_').replace(/_\d/, '_' + i));
|
155
|
-
});
|
156
|
-
$('#page_images li').each(function(i, li){
|
157
|
-
$('input:hidden', li).each(function() {
|
166
|
+
reindex_images = function() {
|
167
|
+
$('#page_images li textarea:hidden').each(function(i, input){
|
158
168
|
// make the image's name consistent with its position.
|
159
|
-
parts = $(
|
160
|
-
parts[
|
161
|
-
$(
|
169
|
+
var parts = $(input).attr('name').split('_');
|
170
|
+
parts[2] = ('' + i);
|
171
|
+
$(input).attr('name', parts.join('_'));
|
162
172
|
|
163
173
|
// make the image's id consistent with its position.
|
164
|
-
$(
|
174
|
+
$(input).attr('id', $(input).attr('id').replace(/_\d/, '_' + i));
|
175
|
+
$(input).attr('data-old-id', $(input).attr('data-old-id').replace(/_\d_/, '_'+i+'_').replace(/_\d/, '_' + i));
|
165
176
|
});
|
166
|
-
|
167
|
-
|
177
|
+
$('#page_images li').each(function(i, li){
|
178
|
+
$('input:hidden', li).each(function() {
|
179
|
+
var $this = $(this);
|
180
|
+
// make the image's name consistent with its position.
|
181
|
+
var parts = $this.attr('name').split(']');
|
182
|
+
parts[1] = ('[' + i);
|
183
|
+
$this.attr('name', parts.join(']'));
|
184
|
+
|
185
|
+
// make the image's id consistent with its position.
|
186
|
+
$this.attr('id', $this.attr('id').replace(/_\d_/, '_'+i+'_').replace(/_\d/, '_'+i));
|
187
|
+
});
|
188
|
+
});
|
189
|
+
}
|
190
|
+
})(jQuery);
|