redditor 0.1.5 → 0.1.6
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/Gemfile +2 -1
- data/app/assets/javascripts/redditor/application.js +1 -2
- data/app/assets/javascripts/redditor/redditor.coffee +6 -3
- data/app/assets/stylesheets/redditor/application.css.scss +28 -22
- data/app/assets/stylesheets/redditor/redditor.css.scss +60 -31
- data/app/controllers/redditor/admin/pages_controller.rb +1 -1
- data/app/helpers/redditor/pages_helper.rb +1 -1
- data/app/views/redditor/admin/pages/_content_block.haml +28 -7
- data/app/views/redditor/admin/pages/_page.haml +5 -5
- data/config/locales/redditor.en.yml +2 -2
- data/config/locales/redditor.ru.yml +2 -2
- data/lib/redditor/version.rb +1 -1
- data/spec/features/text_spec.rb +4 -3
- data/spec/features/video_spec.rb +2 -2
- data/spec/spec_helper.rb +1 -1
- metadata +2 -12
- data/app/assets/javascripts/fileapi/FileAPI.exif.js +0 -59
- data/app/assets/javascripts/fileapi/FileAPI.flash.image.swf +0 -0
- data/app/assets/javascripts/fileapi/FileAPI.flash.swf +0 -0
- data/app/assets/javascripts/fileapi/FileAPI.id3.js +0 -67
- data/app/assets/javascripts/fileapi/FileAPI.min.js +0 -73
- data/app/assets/javascripts/fileapi/fileapi.js.coffee.erb +0 -12
- data/app/assets/javascripts/fileapi/tmpl.js +0 -35
- data/app/assets/stylesheets/redditor/fileapi/fileapi.css.scss +0 -174
- data/app/assets/stylesheets/redditor/fileapi/fileapi_front.css.scss +0 -175
- data/app/views/redditor/admin/pages/_fileapi.erb +0 -199
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a898a45dff55b68a00cbf7bdc623a09c2d30d4ec
|
4
|
+
data.tar.gz: 0e44dca1197cae9e47efce1db64ee3ccd4fe522e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8893850c838ec8f61e41a08b2c9dfca45fff6cc3ba3fe615c92d5da5f91b661ab7738703cf2a0b3efc7fc23008fb935acb75525b31eecc3d942cece6701a69bc
|
7
|
+
data.tar.gz: e8f741718461b281c7531087df09402de04a7a8ff22007fc1cd24e860f0150a3a1a41c50af453a15934d5fcceae35bd73aafa72fc74f816382da137149942c00
|
data/Gemfile
CHANGED
@@ -8,7 +8,8 @@ gem 'haml'
|
|
8
8
|
gem 'coffee-rails'
|
9
9
|
gem 'jquery-rails'
|
10
10
|
gem 'sass-rails'
|
11
|
-
gem '
|
11
|
+
gem 'fileapi', git: 'git@github.com:redde/fileapi.git'
|
12
|
+
|
12
13
|
# Declare your gem's dependencies in redditor.gemspec.
|
13
14
|
# Bundler will treat runtime dependencies like base dependencies, and
|
14
15
|
# development dependencies will be added by default to the :development group.
|
@@ -1,3 +1,6 @@
|
|
1
|
+
#= require fileapi
|
2
|
+
#= require fileapi/uploader
|
3
|
+
|
1
4
|
window.REDDE = {redditor: {}}
|
2
5
|
REDDE.redditor.sliderBlockImagesSortableParams =
|
3
6
|
scroll: false
|
@@ -33,7 +36,7 @@ REDDE.redditor.parameterizationForm = (box) ->
|
|
33
36
|
REDDE.redditor.setPositions = ->
|
34
37
|
$el = REDDE.redditor.$el
|
35
38
|
$el.find($el.sortable("option", "items")).each (i) ->
|
36
|
-
$(
|
39
|
+
$(@).find("input.redditor__position").val i
|
37
40
|
|
38
41
|
REDDE.redditor.sortList = ->
|
39
42
|
sortArray = $.map REDDE.redditor.$el.find("dd"), (n) ->
|
@@ -89,14 +92,14 @@ $ ->
|
|
89
92
|
$(@).removeClass("now-sortable")
|
90
93
|
return
|
91
94
|
|
92
|
-
.on "ajax:beforeSend", "a.
|
95
|
+
.on "ajax:beforeSend", "a.redditor__update", (event, xhr, status) ->
|
93
96
|
box = $(@).closest "dd"
|
94
97
|
params = REDDE.redditor.parameterizationForm(box)
|
95
98
|
status.url += "?" + $.param(params)
|
96
99
|
|
97
100
|
$("ul.slider-block-images").sortable REDDE.redditor.sliderBlockImagesSortableParams
|
98
101
|
|
99
|
-
$('div.
|
102
|
+
$('div.redditor__add-blocks').on "ajax:beforeSend", "a.redditor__add", (event, xhr, status) ->
|
100
103
|
status.url += "?" + $.param(content_block: {temp_id: new Date().getTime()}) # generate uniq id
|
101
104
|
|
102
105
|
#! jquery-serializeForm - Make an object out of form elements - v1.1.1 - 2013-01-21
|
@@ -1,29 +1,29 @@
|
|
1
1
|
/*
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
2
|
+
* This is a manifest file that'll be compiled into application.css, which will include all the files
|
3
|
+
* listed below.
|
4
|
+
*
|
5
|
+
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
|
6
|
+
* or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
|
7
|
+
*
|
8
|
+
* You're free to add application-wide styles to this file and they'll appear at the top of the
|
9
|
+
* compiled file, but it's generally better to create a new file per style scope.
|
10
|
+
*
|
11
|
+
*= require redditor/redditor
|
12
|
+
*/
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
html {
|
14
|
+
html {
|
17
15
|
font: 12px "Lucida Grande", "Lucida Sans Unicode", helvetica, arial, verdana, sans-serif;
|
18
|
-
|
16
|
+
}
|
19
17
|
|
20
|
-
|
18
|
+
form.edit_article {
|
21
19
|
margin:0 10px;
|
22
|
-
|
20
|
+
}
|
23
21
|
|
24
|
-
|
22
|
+
.text-block-input {
|
25
23
|
width: 100%;
|
26
|
-
|
24
|
+
-webkit-box-sizing: border-box;
|
25
|
+
-moz-box-sizing: border-box;
|
26
|
+
box-sizing: border-box;
|
27
27
|
}
|
28
28
|
|
29
29
|
input[type=submit] {
|
@@ -32,16 +32,22 @@ input[type=submit] {
|
|
32
32
|
display: inline-block;
|
33
33
|
background:#ccc;
|
34
34
|
cursor: pointer;
|
35
|
-
|
35
|
+
background:-webkit-linear-gradient(top, #fff, #ccc);
|
36
|
+
background:-moz-linear-gradient(top, #fff, #ccc);
|
37
|
+
background:-o-linear-gradient(top, #fff, #ccc);
|
38
|
+
background:linear-gradient(to bottom, #fff, #ccc);
|
36
39
|
border-radius: 3px;
|
37
40
|
box-shadow: 1px 1px 2px #ccc;
|
38
41
|
border: 1px solid #999;
|
39
42
|
text-transform: lowercase;
|
40
43
|
outline: none;
|
41
44
|
&:hover {
|
42
|
-
|
45
|
+
background: -webkit-linear-gradient(top, rgba(#fff, 0.8), rgba(#ccc, 0.8));
|
46
|
+
background: -moz-linear-gradient(top, rgba(#fff, 0.8), rgba(#ccc, 0.8));
|
47
|
+
background: -o-linear-gradient(top, rgba(#fff, 0.8), rgba(#ccc, 0.8));
|
48
|
+
background: linear-gradient(to bottom, rgba(#fff, 0.8), rgba(#ccc, 0.8));
|
43
49
|
}
|
44
50
|
&:active {
|
45
|
-
|
51
|
+
transform: translateY(1px);
|
46
52
|
}
|
47
53
|
}
|
@@ -1,4 +1,5 @@
|
|
1
|
-
|
1
|
+
//= require fileapi
|
2
|
+
|
2
3
|
dl.redditor {
|
3
4
|
dd {
|
4
5
|
/*нельзя задавать position-relative, иначе глючит сортировка в хроме*/
|
@@ -14,21 +15,14 @@ dl.redditor {
|
|
14
15
|
height: 50px !important; overflow: hidden;
|
15
16
|
.tit-form {display: block;}
|
16
17
|
}
|
17
|
-
label.delete {
|
18
|
-
position: absolute; left:100%; bottom: 100%; white-space:nowrap;
|
19
|
-
@include transform(rotate(90deg));
|
20
|
-
@include transform-origin(0, 100%);
|
21
|
-
}
|
22
18
|
.ui-sortable-helper, .ui-sortable-placeholder {
|
23
19
|
/*max-height: 200px !important; overflow: hidden;*/
|
24
20
|
}
|
25
|
-
.upload-area {
|
26
|
-
overflow: hidden; margin-top: 10px;
|
27
|
-
}
|
28
21
|
}
|
29
22
|
|
30
23
|
ul.slider-block-images {
|
31
24
|
overflow: hidden;
|
25
|
+
padding: 0;
|
32
26
|
li {
|
33
27
|
margin: 0 5px 5px 0; list-style: none;
|
34
28
|
float: left; position: relative;
|
@@ -38,14 +32,12 @@ ul.slider-block-images {
|
|
38
32
|
}
|
39
33
|
}
|
40
34
|
|
41
|
-
|
35
|
+
.redditor__add-blocks {
|
42
36
|
margin:10px -10px; padding:10px;
|
43
|
-
> p {
|
44
|
-
overflow: hidden;
|
45
|
-
}
|
46
37
|
}
|
47
|
-
|
48
|
-
.
|
38
|
+
|
39
|
+
.redditor__control {float: right;}
|
40
|
+
.redditor__delete, .redditor__update {
|
49
41
|
text-decoration: none;
|
50
42
|
display: inline-block;
|
51
43
|
text-align: center; min-width: 10px; padding: 0 5px;
|
@@ -53,51 +45,88 @@ div.redditor-add-blocks {
|
|
53
45
|
border: 1px solid #C2C2C2; border-radius: 15px;
|
54
46
|
background: #F8F8F8;
|
55
47
|
}
|
56
|
-
|
57
|
-
.
|
48
|
+
|
49
|
+
.redditor__delete {
|
50
|
+
color: #A72522;
|
51
|
+
&:before {content: '✘'}
|
52
|
+
}
|
53
|
+
.redditor__update {
|
54
|
+
color: green;
|
55
|
+
&:before {content: '✔'}
|
56
|
+
}
|
58
57
|
|
59
58
|
.form-name {
|
60
59
|
margin-top: 25px;
|
61
60
|
}
|
61
|
+
|
62
62
|
.tit-form {
|
63
63
|
display: none; margin-top: -25px; text-align: center; font-size: 18px;
|
64
64
|
line-height: 30px; vertical-align: middle;
|
65
65
|
img { width: 30px; display: inline-block; vertical-align: middle;}
|
66
66
|
}
|
67
|
+
|
67
68
|
.line-form {
|
68
69
|
display: inline-block; margin-right: 5px;
|
69
70
|
}
|
71
|
+
|
70
72
|
.del-item {
|
71
73
|
text-decoration: none; position: absolute; right: 1px; bottom: 1px;
|
72
74
|
width: 22px; height: 22px;
|
73
75
|
background: #eee image-url('redditor/trash.png') center no-repeat;
|
74
76
|
border-radius: 15px; border: 1px solid #aaa;
|
75
77
|
}
|
78
|
+
|
76
79
|
.full-width {
|
77
80
|
width: 100%; box-sizing: border-box;
|
78
81
|
}
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
}
|
89
|
-
.add-photo {
|
90
|
-
@include background(image-url('redditor/add_photo.png') 3px center no-repeat, linear-gradient(top, #fff 0%, #f5f5f5 49%, #ececec 50%, #eee 100%));
|
82
|
+
|
83
|
+
.redditor__add {
|
84
|
+
text-decoration: none;
|
85
|
+
color: #222;
|
86
|
+
display: inline-block;
|
87
|
+
padding: 4px 10px 4px 25px;
|
88
|
+
border-radius: 3px;
|
89
|
+
border: 1px solid #ccc;
|
90
|
+
font-size: 11px; margin-right: 3px;
|
91
91
|
}
|
92
|
-
|
93
|
-
|
92
|
+
|
93
|
+
.redditor__add_txt {
|
94
|
+
background:#f5f5f5 image-url('redditor/add_txt.png') 3px center no-repeat;
|
95
|
+
background: image-url('redditor/add_txt.png') 3px center no-repeat, -webkit-linear-gradient(top, #fff 0%, #f5f5f5 49%, #ececec 50%, #eee 100%);
|
96
|
+
background: image-url('redditor/add_txt.png') 3px center no-repeat, -moz-gradient(top, #fff 0%, #f5f5f5 49%, #ececec 50%, #eee 100%);
|
97
|
+
background: image-url('redditor/add_txt.png') 3px center no-repeat, -o-gradient(top, #fff 0%, #f5f5f5 49%, #ececec 50%, #eee 100%);
|
98
|
+
background: image-url('redditor/add_txt.png') 3px center no-repeat, linear-gradient(to bottom, #fff 0%, #f5f5f5 49%, #ececec 50%, #eee 100%);
|
99
|
+
}
|
100
|
+
.redditor__add_video {
|
101
|
+
background:#f5f5f5 image-url('redditor/add_video.png') 3px center no-repeat;
|
102
|
+
background: image-url('redditor/add_video.png') 3px center no-repeat, -webkit-linear-gradient(top, #fff 0%, #f5f5f5 49%, #ececec 50%, #eee 100%);
|
103
|
+
background: image-url('redditor/add_video.png') 3px center no-repeat, -moz-linear-gradient(top, #fff 0%, #f5f5f5 49%, #ececec 50%, #eee 100%);
|
104
|
+
background: image-url('redditor/add_video.png') 3px center no-repeat, -o-linear-gradient(top, #fff 0%, #f5f5f5 49%, #ececec 50%, #eee 100%);
|
105
|
+
background: image-url('redditor/add_video.png') 3px center no-repeat, linear-gradient(to bottom, #fff 0%, #f5f5f5 49%, #ececec 50%, #eee 100%);
|
106
|
+
}
|
107
|
+
.redditor__add_photo {
|
108
|
+
background:#f5f5f5 image-url('redditor/add_photo.png') 3px center no-repeat;
|
109
|
+
background: image-url('redditor/add_photo.png') 3px center no-repeat, -webkit-linear-gradient(top, #fff 0%, #f5f5f5 49%, #ececec 50%, #eee 100%);
|
110
|
+
background: image-url('redditor/add_photo.png') 3px center no-repeat, -moz-linear-gradient(top, #fff 0%, #f5f5f5 49%, #ececec 50%, #eee 100%);
|
111
|
+
background: image-url('redditor/add_photo.png') 3px center no-repeat, -o-linear-gradient(top, #fff 0%, #f5f5f5 49%, #ececec 50%, #eee 100%);
|
112
|
+
background: image-url('redditor/add_photo.png') 3px center no-repeat, linear-gradient(to bottom, #fff 0%, #f5f5f5 49%, #ececec 50%, #eee 100%);
|
113
|
+
}
|
114
|
+
.redditor__add_slider {
|
115
|
+
background:#f5f5f5 image-url('redditor/add_slider.png') 3px center no-repeat;
|
116
|
+
background: image-url('redditor/add_slider.png') 3px center no-repeat, -webkit-linear-gradient(top, #fff 0%, #f5f5f5 49%, #ececec 50%, #eee 100%);
|
117
|
+
background: image-url('redditor/add_slider.png') 3px center no-repeat, -moz-linear-gradient(top, #fff 0%, #f5f5f5 49%, #ececec 50%, #eee 100%);
|
118
|
+
background: image-url('redditor/add_slider.png') 3px center no-repeat, -o-linear-gradient(top, #fff 0%, #f5f5f5 49%, #ececec 50%, #eee 100%);
|
119
|
+
background: image-url('redditor/add_slider.png') 3px center no-repeat, linear-gradient(to bottom, #fff 0%, #f5f5f5 49%, #ececec 50%, #eee 100%);
|
94
120
|
}
|
121
|
+
|
95
122
|
a.redactor_btn_format {
|
96
123
|
background: image-url('redditor/no_format_text.png') center no-repeat !important;
|
97
124
|
}
|
98
125
|
a.redactor_btn_divide {
|
99
126
|
background: image-url('redditor/destroy_block_text.png') center no-repeat !important;
|
100
127
|
}
|
128
|
+
|
129
|
+
// стили для тестирования
|
101
130
|
// dl.redditor dd:before {
|
102
131
|
// content: "class: " attr(class); display: block; padding: 2px; background: #fcc;
|
103
132
|
// }
|
@@ -6,7 +6,7 @@ class Redditor::Admin::PagesController < Redditor::Admin::BaseController
|
|
6
6
|
def sort
|
7
7
|
params[:sort].each do |k, v|
|
8
8
|
v.each do |klass, info|
|
9
|
-
klass.camelcase.constantize.find_by_id(info[:index]).update_attributes(position: info[:position]) rescue nil
|
9
|
+
"Redditor::#{klass.camelcase}".constantize.find_by_id(info[:index]).update_attributes(position: info[:position]) rescue nil
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
@@ -9,7 +9,7 @@ module Redditor
|
|
9
9
|
content_tag(:dd, :id => "#{association.to_s.singularize}_#{id}") do
|
10
10
|
tag(:div, class: "handle") +
|
11
11
|
link_to("Удалить", "javascript:void(0);", onclick: "if (confirm('dfasdsa')) $(this).closest('dd').remove();") + "\s" +
|
12
|
-
link_to("Обновить", [:admin, @article.page, association], method: "post", class: "
|
12
|
+
link_to("Обновить", [:admin, @article.page, association], method: "post", class: "redditor__update", remote: true, data: {disable_with: "Обновляется"}) + "\s" +
|
13
13
|
render("admin/pages/" + association.to_s.singularize, f: builder)
|
14
14
|
end
|
15
15
|
end
|
@@ -1,16 +1,37 @@
|
|
1
1
|
.handle
|
2
2
|
|
3
3
|
- if content_block.new_record?
|
4
|
-
.
|
5
|
-
= link_to "
|
6
|
-
|
4
|
+
.redditor__control
|
5
|
+
= link_to "",
|
6
|
+
"javascript:void(0);",
|
7
|
+
class: "redditor__delete",
|
8
|
+
onclick: "if (confirm('#{t "redditor.remove?"}')) $(this).closest('dd').remove();"
|
9
|
+
|
10
|
+
= link_to "",
|
11
|
+
[redditor, :admin, p.object, content_block],
|
12
|
+
method: "post",
|
13
|
+
class: "redditor__update",
|
14
|
+
remote: true,
|
15
|
+
data: {:disable_with => t("redditor.saving")}
|
16
|
+
|
7
17
|
- else
|
8
|
-
.
|
9
|
-
= link_to "
|
10
|
-
|
18
|
+
.redditor__control
|
19
|
+
= link_to "",
|
20
|
+
[redditor, :admin, p.object, content_block],
|
21
|
+
class: "redditor__delete",
|
22
|
+
:method => :delete,
|
23
|
+
remote: true,
|
24
|
+
data: {confirm: "Вы, действительно, хотите удалить контент-блок?", disable_with: t("redditor.deleting")}
|
25
|
+
|
26
|
+
= link_to "",
|
27
|
+
[redditor, :admin, p.object, content_block],
|
28
|
+
class: "redditor__update",
|
29
|
+
remote: true,
|
30
|
+
method: "put",
|
31
|
+
data: {disable_with: t("redditor.saving")}
|
11
32
|
|
12
33
|
= p.fields_for content_block.class.name.underscore.sub('redditor/', '').pluralize.to_sym, content_block do |f|
|
13
34
|
%div.form-name{data: {"object-name" => f.object.temp_id.present? ? f.object_name.sub!(/\[\d*\]/, "[#{f.object.temp_id}]") : f.object_name}, id: "#{content_block.class.name.underscore.sub(/\Aredditor\//, '')}_#{content_block.id.nil? ? f.object.temp_id : content_block.id}"}
|
14
|
-
= f.text_field :position, class: '
|
35
|
+
= f.text_field :position, class: 'redditor__position', hidden: true
|
15
36
|
= render :partial => "redditor/admin/pages/#{content_block.class.name.underscore.sub('redditor/', '')}", locals: {f: f}
|
16
37
|
= f.hidden_field :temp_id
|
@@ -5,9 +5,9 @@
|
|
5
5
|
- p.object.content_blocks.each do |content_block|
|
6
6
|
= render partial: "redditor/admin/pages/content_block", locals: {p: p, page: p.object, content_block: content_block}, :layout => "redditor/admin/pages/wrap_dd"
|
7
7
|
|
8
|
-
%div.
|
8
|
+
%div.redditor__add-blocks
|
9
9
|
%p
|
10
|
-
= link_to t('redditor.add.text_block'), redditor.new_admin_page_text_block_path(f.object.page), remote: true, class: "
|
11
|
-
= link_to t('redditor.add.video_block'), redditor.new_admin_page_video_block_path(f.object.page), remote: true, class: "
|
12
|
-
= link_to t('redditor.add.image_block'), redditor.new_admin_page_image_block_path(f.object.page), remote: true, class: "
|
13
|
-
= link_to t('redditor.add.slider_block'), redditor.admin_page_slider_blocks_path(f.object.page), remote: true, method: 'POST', class: "
|
10
|
+
= link_to t('redditor.add.text_block'), redditor.new_admin_page_text_block_path(f.object.page), remote: true, class: "redditor__add redditor__add_txt"
|
11
|
+
= link_to t('redditor.add.video_block'), redditor.new_admin_page_video_block_path(f.object.page), remote: true, class: "redditor__add redditor__add_video"
|
12
|
+
= link_to t('redditor.add.image_block'), redditor.new_admin_page_image_block_path(f.object.page), remote: true, class: "redditor__add redditor__add_photo"
|
13
|
+
= link_to t('redditor.add.slider_block'), redditor.admin_page_slider_blocks_path(f.object.page), remote: true, method: 'POST', class: "redditor__add redditor__add_slider"
|
@@ -11,8 +11,8 @@ ru:
|
|
11
11
|
delete_image: "Удалить изображение?"
|
12
12
|
description: "Описание"
|
13
13
|
remove?: "Вы, действительно, хотите удалить контент-блок?"
|
14
|
-
deleting: Удаление...
|
15
|
-
saving: Сохранение...
|
14
|
+
deleting: ' Удаление...'
|
15
|
+
saving: ' Сохранение...'
|
16
16
|
title:
|
17
17
|
image: Изображение
|
18
18
|
video: Видео
|
data/lib/redditor/version.rb
CHANGED
data/spec/features/text_spec.rb
CHANGED
@@ -13,8 +13,8 @@ describe "Text block" do
|
|
13
13
|
def visit_article() visit "/admin/articles/#{article.id}/edit"; end
|
14
14
|
def add_block() find_link(I18n.t("redditor.add.text_block")).click; end
|
15
15
|
def submit() find_button("Submit").click; end
|
16
|
-
def save_block()
|
17
|
-
def delete_block()
|
16
|
+
def save_block() find("a.redditor__update").click; end
|
17
|
+
def delete_block() find("a.redditor__delete").click; end
|
18
18
|
|
19
19
|
it "Saves text block to article", type: :feature, js: true do
|
20
20
|
add_block
|
@@ -26,12 +26,13 @@ describe "Text block" do
|
|
26
26
|
it "Shows validation error if text block content is empty", type: :feature, js: true do
|
27
27
|
add_block
|
28
28
|
submit
|
29
|
-
expect(page
|
29
|
+
expect(page).to have_content "can't be blank"
|
30
30
|
end
|
31
31
|
|
32
32
|
it "Deletes text block", type: :feature, js: true do
|
33
33
|
article.page.text_blocks.build(body: "123", position: 1).save
|
34
34
|
visit_article
|
35
|
+
save_page
|
35
36
|
delete_block
|
36
37
|
visit_article
|
37
38
|
text_value = begin
|
data/spec/features/video_spec.rb
CHANGED
@@ -13,8 +13,8 @@ describe "Video block" do
|
|
13
13
|
def visit_article() visit "/admin/articles/#{article.id}/edit"; end
|
14
14
|
def add_block() find_link(I18n.t("redditor.add.video_block")).click; end
|
15
15
|
def submit() find_button("Submit").click; end
|
16
|
-
def save_block()
|
17
|
-
def delete_block()
|
16
|
+
def save_block() find("a.redditor__update").click; end
|
17
|
+
def delete_block() find("a.redditor__delete").click; end
|
18
18
|
|
19
19
|
it "Saves video block to article", type: :feature, js: true do
|
20
20
|
add_block
|
data/spec/spec_helper.rb
CHANGED
@@ -15,7 +15,7 @@ require 'capybara/rspec'
|
|
15
15
|
require 'capybara/poltergeist'
|
16
16
|
|
17
17
|
Capybara.javascript_driver = :poltergeist
|
18
|
-
Capybara.default_wait_time = 10
|
18
|
+
# Capybara.default_wait_time = 10
|
19
19
|
|
20
20
|
# Requires supporting ruby files with custom matchers and macros, etc,
|
21
21
|
# in spec/support/ and its subdirectories.
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redditor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Oleg Bovykin
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-11-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -251,20 +251,11 @@ files:
|
|
251
251
|
- app/assets/images/redditor/move_handler.png
|
252
252
|
- app/assets/images/redditor/no_format_text.png
|
253
253
|
- app/assets/images/redditor/trash.png
|
254
|
-
- app/assets/javascripts/fileapi/FileAPI.exif.js
|
255
|
-
- app/assets/javascripts/fileapi/FileAPI.flash.image.swf
|
256
|
-
- app/assets/javascripts/fileapi/FileAPI.flash.swf
|
257
|
-
- app/assets/javascripts/fileapi/FileAPI.id3.js
|
258
|
-
- app/assets/javascripts/fileapi/FileAPI.min.js
|
259
|
-
- app/assets/javascripts/fileapi/fileapi.js.coffee.erb
|
260
|
-
- app/assets/javascripts/fileapi/tmpl.js
|
261
254
|
- app/assets/javascripts/fileapi/uploader.coffee
|
262
255
|
- app/assets/javascripts/jquery-ui.min.js
|
263
256
|
- app/assets/javascripts/redditor/application.js
|
264
257
|
- app/assets/javascripts/redditor/redditor.coffee
|
265
258
|
- app/assets/stylesheets/redditor/application.css.scss
|
266
|
-
- app/assets/stylesheets/redditor/fileapi/fileapi.css.scss
|
267
|
-
- app/assets/stylesheets/redditor/fileapi/fileapi_front.css.scss
|
268
259
|
- app/assets/stylesheets/redditor/redditor.css.scss
|
269
260
|
- app/controllers/redditor/admin/base_controller.rb
|
270
261
|
- app/controllers/redditor/admin/image_blocks_controller.rb
|
@@ -286,7 +277,6 @@ files:
|
|
286
277
|
- app/uploaders/redditor_uploader.rb
|
287
278
|
- app/views/layouts/redditor/application.html.erb
|
288
279
|
- app/views/redditor/admin/pages/_content_block.haml
|
289
|
-
- app/views/redditor/admin/pages/_fileapi.erb
|
290
280
|
- app/views/redditor/admin/pages/_image.haml
|
291
281
|
- app/views/redditor/admin/pages/_page.haml
|
292
282
|
- app/views/redditor/admin/pages/_slider_block.haml
|
@@ -1,59 +0,0 @@
|
|
1
|
-
(function (){
|
2
|
-
/**!
|
3
|
-
* Binary Ajax 0.1.10
|
4
|
-
* Copyright (c) 2008 Jacob Seidelin, cupboy@gmail.com, http://blog.nihilogic.dk/
|
5
|
-
* Licensed under the MPL License [http://www.nihilogic.dk/licenses/mpl-license.txt]
|
6
|
-
*
|
7
|
-
*
|
8
|
-
* Javascript EXIF Reader 0.1.4
|
9
|
-
* Copyright (c) 2008 Jacob Seidelin, cupboy@gmail.com, http://blog.nihilogic.dk/
|
10
|
-
* Licensed under the MPL License [http://www.nihilogic.dk/licenses/mpl-license.txt]
|
11
|
-
*/
|
12
|
-
|
13
|
-
|
14
|
-
var BinaryFile=function(j,k,l){var h=j,i=k||0,b=0;this.getRawData=function(){return h};"string"==typeof j&&(b=l||h.length,this.getByteAt=function(a){return h.charCodeAt(a+i)&255},this.getBytesAt=function(a,b){for(var c=[],f=0;f<b;f++)c[f]=h.charCodeAt(a+f+i)&255;return c});this.getLength=function(){return b};this.getSByteAt=function(a){a=this.getByteAt(a);return 127<a?a-256:a};this.getShortAt=function(a,b){var c=b?(this.getByteAt(a)<<8)+this.getByteAt(a+1):(this.getByteAt(a+1)<<8)+this.getByteAt(a);
|
15
|
-
0>c&&(c+=65536);return c};this.getSShortAt=function(a,b){var c=this.getShortAt(a,b);return 32767<c?c-65536:c};this.getLongAt=function(a,b){var c=this.getByteAt(a),f=this.getByteAt(a+1),e=this.getByteAt(a+2),g=this.getByteAt(a+3),c=b?(((c<<8)+f<<8)+e<<8)+g:(((g<<8)+e<<8)+f<<8)+c;0>c&&(c+=4294967296);return c};this.getSLongAt=function(a,b){var c=this.getLongAt(a,b);return 2147483647<c?c-4294967296:c};this.getStringAt=function(a,b){for(var c=[],f=this.getBytesAt(a,b),e=0;e<b;e++)c[e]=String.fromCharCode(f[e]);
|
16
|
-
return c.join("")};this.getCharAt=function(a){return String.fromCharCode(this.getByteAt(a))};this.toBase64=function(){return window.btoa(h)};this.fromBase64=function(a){h=window.atob(a)}},EXIF={};
|
17
|
-
(function(){function j(b){if(255!=b.getByteAt(0)||216!=b.getByteAt(1))return!1;for(var a=2,d=b.getLength();a<d;){if(255!=b.getByteAt(a))return i&&console.log("Not a valid marker at offset "+a+", found: "+b.getByteAt(a)),!1;var c=b.getByteAt(a+1);if(22400==c||225==c)return i&&console.log("Found 0xFFE1 marker"),h(b,a+4,b.getShortAt(a+2,!0)-2);a+=2+b.getShortAt(a+2,!0)}}function k(b,a,d,c,f){for(var e=b.getShortAt(d,f),g={},h=0;h<e;h++){var j=d+12*h+2,k=c[b.getShortAt(j,f)];!k&&i&&console.log("Unknown tag: "+
|
18
|
-
b.getShortAt(j,f));g[k]=l(b,j,a,d,f)}return g}function l(b,a,d,c,f){var e=b.getShortAt(a+2,f),c=b.getLongAt(a+4,f),d=b.getLongAt(a+8,f)+d;switch(e){case 1:case 7:if(1==c)return b.getByteAt(a+8,f);d=4<c?d:a+8;a=[];for(e=0;e<c;e++)a[e]=b.getByteAt(d+e);return a;case 2:return b.getStringAt(4<c?d:a+8,c-1);case 3:if(1==c)return b.getShortAt(a+8,f);d=2<c?d:a+8;a=[];for(e=0;e<c;e++)a[e]=b.getShortAt(d+2*e,f);return a;case 4:if(1==c)return b.getLongAt(a+8,f);a=[];for(e=0;e<c;e++)a[e]=b.getLongAt(d+4*e,f);
|
19
|
-
return a;case 5:if(1==c)return b.getLongAt(d,f)/b.getLongAt(d+4,f);a=[];for(e=0;e<c;e++)a[e]=b.getLongAt(d+8*e,f)/b.getLongAt(d+4+8*e,f);return a;case 9:if(1==c)return b.getSLongAt(a+8,f);a=[];for(e=0;e<c;e++)a[e]=b.getSLongAt(d+4*e,f);return a;case 10:if(1==c)return b.getSLongAt(d,f)/b.getSLongAt(d+4,f);a=[];for(e=0;e<c;e++)a[e]=b.getSLongAt(d+8*e,f)/b.getSLongAt(d+4+8*e,f);return a}}function h(b,a){if("Exif"!=b.getStringAt(a,4))return i&&console.log("Not valid EXIF data! "+b.getStringAt(a,4)),!1;
|
20
|
-
var d,c=a+6;if(18761==b.getShortAt(c))d=!1;else if(19789==b.getShortAt(c))d=!0;else return i&&console.log("Not valid TIFF data! (no 0x4949 or 0x4D4D)"),!1;if(42!=b.getShortAt(c+2,d))return i&&console.log("Not valid TIFF data! (no 0x002A)"),!1;if(8!=b.getLongAt(c+4,d))return i&&console.log("Not valid TIFF data! (First offset not 8)",b.getShortAt(c+4,d)),!1;var f=k(b,c,c+8,EXIF.TiffTags,d);if(f.ExifIFDPointer){var e=k(b,c,c+f.ExifIFDPointer,EXIF.Tags,d),g;for(g in e){switch(g){case "LightSource":case "Flash":case "MeteringMode":case "ExposureProgram":case "SensingMethod":case "SceneCaptureType":case "SceneType":case "CustomRendered":case "WhiteBalance":case "GainControl":case "Contrast":case "Saturation":case "Sharpness":case "SubjectDistanceRange":case "FileSource":e[g]=
|
21
|
-
EXIF.StringValues[g][e[g]];break;case "ExifVersion":case "FlashpixVersion":e[g]=String.fromCharCode(e[g][0],e[g][1],e[g][2],e[g][3]);break;case "ComponentsConfiguration":e[g]=EXIF.StringValues.Components[e[g][0]]+EXIF.StringValues.Components[e[g][1]]+EXIF.StringValues.Components[e[g][2]]+EXIF.StringValues.Components[e[g][3]]}f[g]=e[g]}}if(f.GPSInfoIFDPointer)for(g in d=k(b,c,c+f.GPSInfoIFDPointer,EXIF.GPSTags,d),d){switch(g){case "GPSVersionID":d[g]=d[g][0]+"."+d[g][1]+"."+d[g][2]+"."+d[g][3]}f[g]=
|
22
|
-
d[g]}return f}var i=!1;EXIF.Tags={36864:"ExifVersion",40960:"FlashpixVersion",40961:"ColorSpace",40962:"PixelXDimension",40963:"PixelYDimension",37121:"ComponentsConfiguration",37122:"CompressedBitsPerPixel",37500:"MakerNote",37510:"UserComment",40964:"RelatedSoundFile",36867:"DateTimeOriginal",36868:"DateTimeDigitized",37520:"SubsecTime",37521:"SubsecTimeOriginal",37522:"SubsecTimeDigitized",33434:"ExposureTime",33437:"FNumber",34850:"ExposureProgram",34852:"SpectralSensitivity",34855:"ISOSpeedRatings",
|
23
|
-
34856:"OECF",37377:"ShutterSpeedValue",37378:"ApertureValue",37379:"BrightnessValue",37380:"ExposureBias",37381:"MaxApertureValue",37382:"SubjectDistance",37383:"MeteringMode",37384:"LightSource",37385:"Flash",37396:"SubjectArea",37386:"FocalLength",41483:"FlashEnergy",41484:"SpatialFrequencyResponse",41486:"FocalPlaneXResolution",41487:"FocalPlaneYResolution",41488:"FocalPlaneResolutionUnit",41492:"SubjectLocation",41493:"ExposureIndex",41495:"SensingMethod",41728:"FileSource",41729:"SceneType",
|
24
|
-
41730:"CFAPattern",41985:"CustomRendered",41986:"ExposureMode",41987:"WhiteBalance",41988:"DigitalZoomRation",41989:"FocalLengthIn35mmFilm",41990:"SceneCaptureType",41991:"GainControl",41992:"Contrast",41993:"Saturation",41994:"Sharpness",41995:"DeviceSettingDescription",41996:"SubjectDistanceRange",40965:"InteroperabilityIFDPointer",42016:"ImageUniqueID"};EXIF.TiffTags={256:"ImageWidth",257:"ImageHeight",34665:"ExifIFDPointer",34853:"GPSInfoIFDPointer",40965:"InteroperabilityIFDPointer",258:"BitsPerSample",
|
25
|
-
259:"Compression",262:"PhotometricInterpretation",274:"Orientation",277:"SamplesPerPixel",284:"PlanarConfiguration",530:"YCbCrSubSampling",531:"YCbCrPositioning",282:"XResolution",283:"YResolution",296:"ResolutionUnit",273:"StripOffsets",278:"RowsPerStrip",279:"StripByteCounts",513:"JPEGInterchangeFormat",514:"JPEGInterchangeFormatLength",301:"TransferFunction",318:"WhitePoint",319:"PrimaryChromaticities",529:"YCbCrCoefficients",532:"ReferenceBlackWhite",306:"DateTime",270:"ImageDescription",271:"Make",
|
26
|
-
272:"Model",305:"Software",315:"Artist",33432:"Copyright"};EXIF.GPSTags={"0":"GPSVersionID",1:"GPSLatitudeRef",2:"GPSLatitude",3:"GPSLongitudeRef",4:"GPSLongitude",5:"GPSAltitudeRef",6:"GPSAltitude",7:"GPSTimeStamp",8:"GPSSatellites",9:"GPSStatus",10:"GPSMeasureMode",11:"GPSDOP",12:"GPSSpeedRef",13:"GPSSpeed",14:"GPSTrackRef",15:"GPSTrack",16:"GPSImgDirectionRef",17:"GPSImgDirection",18:"GPSMapDatum",19:"GPSDestLatitudeRef",20:"GPSDestLatitude",21:"GPSDestLongitudeRef",22:"GPSDestLongitude",23:"GPSDestBearingRef",
|
27
|
-
24:"GPSDestBearing",25:"GPSDestDistanceRef",26:"GPSDestDistance",27:"GPSProcessingMethod",28:"GPSAreaInformation",29:"GPSDateStamp",30:"GPSDifferential"};EXIF.StringValues={ExposureProgram:{"0":"Not defined",1:"Manual",2:"Normal program",3:"Aperture priority",4:"Shutter priority",5:"Creative program",6:"Action program",7:"Portrait mode",8:"Landscape mode"},MeteringMode:{"0":"Unknown",1:"Average",2:"CenterWeightedAverage",3:"Spot",4:"MultiSpot",5:"Pattern",6:"Partial",255:"Other"},LightSource:{"0":"Unknown",
|
28
|
-
1:"Daylight",2:"Fluorescent",3:"Tungsten (incandescent light)",4:"Flash",9:"Fine weather",10:"Cloudy weather",11:"Shade",12:"Daylight fluorescent (D 5700 - 7100K)",13:"Day white fluorescent (N 4600 - 5400K)",14:"Cool white fluorescent (W 3900 - 4500K)",15:"White fluorescent (WW 3200 - 3700K)",17:"Standard light A",18:"Standard light B",19:"Standard light C",20:"D55",21:"D65",22:"D75",23:"D50",24:"ISO studio tungsten",255:"Other"},Flash:{"0":"Flash did not fire",1:"Flash fired",5:"Strobe return light not detected",
|
29
|
-
7:"Strobe return light detected",9:"Flash fired, compulsory flash mode",13:"Flash fired, compulsory flash mode, return light not detected",15:"Flash fired, compulsory flash mode, return light detected",16:"Flash did not fire, compulsory flash mode",24:"Flash did not fire, auto mode",25:"Flash fired, auto mode",29:"Flash fired, auto mode, return light not detected",31:"Flash fired, auto mode, return light detected",32:"No flash function",65:"Flash fired, red-eye reduction mode",69:"Flash fired, red-eye reduction mode, return light not detected",
|
30
|
-
71:"Flash fired, red-eye reduction mode, return light detected",73:"Flash fired, compulsory flash mode, red-eye reduction mode",77:"Flash fired, compulsory flash mode, red-eye reduction mode, return light not detected",79:"Flash fired, compulsory flash mode, red-eye reduction mode, return light detected",89:"Flash fired, auto mode, red-eye reduction mode",93:"Flash fired, auto mode, return light not detected, red-eye reduction mode",95:"Flash fired, auto mode, return light detected, red-eye reduction mode"},
|
31
|
-
SensingMethod:{1:"Not defined",2:"One-chip color area sensor",3:"Two-chip color area sensor",4:"Three-chip color area sensor",5:"Color sequential area sensor",7:"Trilinear sensor",8:"Color sequential linear sensor"},SceneCaptureType:{"0":"Standard",1:"Landscape",2:"Portrait",3:"Night scene"},SceneType:{1:"Directly photographed"},CustomRendered:{"0":"Normal process",1:"Custom process"},WhiteBalance:{"0":"Auto white balance",1:"Manual white balance"},GainControl:{"0":"None",1:"Low gain up",2:"High gain up",
|
32
|
-
3:"Low gain down",4:"High gain down"},Contrast:{"0":"Normal",1:"Soft",2:"Hard"},Saturation:{"0":"Normal",1:"Low saturation",2:"High saturation"},Sharpness:{"0":"Normal",1:"Soft",2:"Hard"},SubjectDistanceRange:{"0":"Unknown",1:"Macro",2:"Close view",3:"Distant view"},FileSource:{3:"DSC"},Components:{"0":"",1:"Y",2:"Cb",3:"Cr",4:"R",5:"G",6:"B"}};EXIF.getData=function(b,a){if(!b.complete)return!1;b.exifdata?a&&a():BinaryAjax(b.src,function(d){d=j(d.binaryResponse);b.exifdata=d||{};a&&a()});return!0};
|
33
|
-
EXIF.getTag=function(b,a){if(b.exifdata)return b.exifdata[a]};EXIF.getAllTags=function(b){if(!b.exifdata)return{};var b=b.exifdata,a={},d;for(d in b)b.hasOwnProperty(d)&&(a[d]=b[d]);return a};EXIF.pretty=function(b){if(!b.exifdata)return"";var b=b.exifdata,a="",d;for(d in b)b.hasOwnProperty(d)&&(a="object"==typeof b[d]?a+(d+" : ["+b[d].length+" values]\r\n"):a+(d+" : "+b[d]+"\r\n"));return a};EXIF.readFromBinaryFile=function(b){return j(b)}})();
|
34
|
-
|
35
|
-
|
36
|
-
FileAPI.support.exif = true;
|
37
|
-
|
38
|
-
|
39
|
-
FileAPI.addInfoReader(/^image/, function (file/**File*/, callback/**Function*/){
|
40
|
-
if( !file.__exif ){
|
41
|
-
var defer = file.__exif = FileAPI.defer();
|
42
|
-
|
43
|
-
FileAPI.readAsBinaryString(file, function (evt){
|
44
|
-
if( evt.type == 'load' ){
|
45
|
-
var binaryString = evt.result;
|
46
|
-
var oFile = new BinaryFile(binaryString, 0, file.size);
|
47
|
-
var exif = EXIF.readFromBinaryFile(oFile);
|
48
|
-
|
49
|
-
defer.resolve(false, { 'exif': exif || {} });
|
50
|
-
}
|
51
|
-
else if( evt.type == 'error' ){
|
52
|
-
defer.resolve('read_as_binary_string_exif');
|
53
|
-
}
|
54
|
-
});
|
55
|
-
}
|
56
|
-
|
57
|
-
file.__exif.then(callback);
|
58
|
-
});
|
59
|
-
})();
|
Binary file
|
Binary file
|