redditor 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +27 -0
- data/.rspec +1 -0
- data/.travis.yml +8 -0
- data/Gemfile +23 -0
- data/Guardfile +24 -0
- data/MIT-LICENSE +20 -0
- data/README.md +16 -0
- data/Rakefile +23 -0
- data/app/assets/images/redditor/.keep +0 -0
- data/app/assets/images/redditor/add_photo.png +0 -0
- data/app/assets/images/redditor/add_photo_big.png +0 -0
- data/app/assets/images/redditor/add_slider.png +0 -0
- data/app/assets/images/redditor/add_slider_big.png +0 -0
- data/app/assets/images/redditor/add_txt.png +0 -0
- data/app/assets/images/redditor/add_txt_big.png +0 -0
- data/app/assets/images/redditor/add_video.png +0 -0
- data/app/assets/images/redditor/add_video_big.png +0 -0
- data/app/assets/images/redditor/destroy_block_text.png +0 -0
- data/app/assets/images/redditor/move_handler.png +0 -0
- data/app/assets/images/redditor/no_format_text.png +0 -0
- data/app/assets/images/redditor/trash.png +0 -0
- data/app/assets/javascripts/fileapi/FileAPI.exif.js +59 -0
- 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 +67 -0
- data/app/assets/javascripts/fileapi/FileAPI.min.js +73 -0
- data/app/assets/javascripts/fileapi/fileapi.js.coffee.erb +12 -0
- data/app/assets/javascripts/fileapi/tmpl.js +35 -0
- data/app/assets/javascripts/fileapi/uploader.coffee +139 -0
- data/app/assets/javascripts/jquery-ui.min.js +12 -0
- data/app/assets/javascripts/redditor/application.js +14 -0
- data/app/assets/javascripts/redditor/fileapi/FileAPI.exif.js +59 -0
- data/app/assets/javascripts/redditor/fileapi/FileAPI.flash.image.swf +0 -0
- data/app/assets/javascripts/redditor/fileapi/FileAPI.flash.swf +0 -0
- data/app/assets/javascripts/redditor/fileapi/FileAPI.id3.js +67 -0
- data/app/assets/javascripts/redditor/fileapi/FileAPI.min.js +72 -0
- data/app/assets/javascripts/redditor/fileapi/README.md +724 -0
- data/app/assets/javascripts/redditor/fileapi/config.js.coffee.erb +5 -0
- data/app/assets/javascripts/redditor/fileapi/crossdomain.xml +19 -0
- data/app/assets/javascripts/redditor/fileapi/example.userpic.html +212 -0
- data/app/assets/javascripts/redditor/fileapi/index.html +548 -0
- data/app/assets/javascripts/redditor/fileapi/mailru.js +6 -0
- data/app/assets/javascripts/redditor/fileapi/mailru_front.js.coffee +143 -0
- data/app/assets/javascripts/redditor/fileapi/tmpl.js +35 -0
- data/app/assets/javascripts/redditor/fileapi/uploader.coffee +139 -0
- data/app/assets/javascripts/redditor/redditor.coffee +148 -0
- data/app/assets/stylesheets/redditor/application.css.scss +47 -0
- data/app/assets/stylesheets/redditor/fileapi/fileapi.css.scss +174 -0
- data/app/assets/stylesheets/redditor/fileapi/fileapi_front.css.scss +175 -0
- data/app/assets/stylesheets/redditor/redditor.css.scss +108 -0
- data/app/controllers/redditor/admin/base_controller.rb +18 -0
- data/app/controllers/redditor/admin/image_blocks_controller.rb +37 -0
- data/app/controllers/redditor/admin/images_controller.rb +33 -0
- data/app/controllers/redditor/admin/pages_controller.rb +15 -0
- data/app/controllers/redditor/admin/slider_blocks_controller.rb +32 -0
- data/app/controllers/redditor/admin/text_blocks_controller.rb +31 -0
- data/app/controllers/redditor/admin/video_blocks_controller.rb +31 -0
- data/app/controllers/redditor/application_controller.rb +4 -0
- data/app/helpers/redditor/application_helper.rb +4 -0
- data/app/helpers/redditor/fileapi_helper.rb +17 -0
- data/app/helpers/redditor/pages_helper.rb +24 -0
- data/app/models/redditor/content_block.rb +24 -0
- data/app/models/redditor/image.rb +29 -0
- data/app/models/redditor/page.rb +28 -0
- data/app/models/redditor/slider_block.rb +17 -0
- data/app/models/redditor/text_block.rb +20 -0
- data/app/models/redditor/video_block.rb +27 -0
- data/app/uploaders/redditor_uploader.rb +57 -0
- data/app/views/layouts/redditor/application.html.erb +15 -0
- data/app/views/redditor/admin/pages/_content_block.haml +16 -0
- data/app/views/redditor/admin/pages/_fileapi.erb +199 -0
- data/app/views/redditor/admin/pages/_image.haml +18 -0
- data/app/views/redditor/admin/pages/_page.haml +13 -0
- data/app/views/redditor/admin/pages/_slider_block.haml +16 -0
- data/app/views/redditor/admin/pages/_slider_block_image.haml +3 -0
- data/app/views/redditor/admin/pages/_text_block.haml +5 -0
- data/app/views/redditor/admin/pages/_validate.haml +4 -0
- data/app/views/redditor/admin/pages/_video_block.haml +19 -0
- data/app/views/redditor/admin/pages/_wrap_dd.haml +1 -0
- data/app/views/redditor/admin/pages/_wrapper.haml +3 -0
- data/app/views/redditor/admin/pages/new.js.coffee +7 -0
- data/app/views/redditor/admin/pages/new.js.erb +7 -0
- data/app/views/redditor/admin/pages/slider_block_image.js.coffee +2 -0
- data/app/views/redditor/admin/pages/wrapper.js.coffee +6 -0
- data/app/views/redditor/pages/_page.html.haml +1 -0
- data/app/views/redditor/slider_blocks/_slider_block.html.haml +2 -0
- data/app/views/redditor/slider_blocks/_slider_block_image.html.erb +3 -0
- data/app/views/redditor/text_blocks/_text_block.html.haml +1 -0
- data/app/views/redditor/video_blocks/_video_block.html.haml +2 -0
- data/bin/rails +8 -0
- data/config/locales/redditor.en.yml +20 -0
- data/config/locales/redditor.ru.yml +20 -0
- data/config/routes.rb +17 -0
- data/db/migrate/20130916155124_create_redditor_images.rb +15 -0
- data/db/migrate/20130916155156_create_redditor_pages.rb +12 -0
- data/db/migrate/20130916155219_create_redditor_slider_blocks.rb +11 -0
- data/db/migrate/20130916155239_create_redditor_text_blocks.rb +12 -0
- data/db/migrate/20130916155301_create_redditor_video_blocks.rb +14 -0
- data/lib/generators/redditor/views/views_generator.rb +17 -0
- data/lib/redditor/engine.rb +12 -0
- data/lib/redditor/has_redditor.rb +17 -0
- data/lib/redditor/version.rb +3 -0
- data/lib/redditor.rb +9 -0
- data/lib/tasks/redditor_tasks.rake +4 -0
- data/redditor.gemspec +38 -0
- data/spec/dummy/.rspec +1 -0
- data/spec/dummy/README.rdoc +28 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/images/.keep +0 -0
- data/spec/dummy/app/assets/javascripts/application.js +17 -0
- data/spec/dummy/app/assets/stylesheets/application.css +13 -0
- data/spec/dummy/app/controllers/admin/articles_controller.rb +23 -0
- data/spec/dummy/app/controllers/admin/base_controller.rb +6 -0
- data/spec/dummy/app/controllers/application_controller.rb +5 -0
- data/spec/dummy/app/controllers/concerns/.keep +0 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/mailers/.keep +0 -0
- data/spec/dummy/app/models/.keep +0 -0
- data/spec/dummy/app/models/article.rb +7 -0
- data/spec/dummy/app/models/concerns/.keep +0 -0
- data/spec/dummy/app/views/admin/articles/edit.html.haml +15 -0
- data/spec/dummy/app/views/articles/show.html.haml +2 -0
- data/spec/dummy/app/views/layouts/application.html.erb +15 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/config/application.rb +31 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +29 -0
- data/spec/dummy/config/environments/production.rb +80 -0
- data/spec/dummy/config/environments/test.rb +36 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +12 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +10 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/db/migrate/20130908123351_create_articles.rb +9 -0
- data/spec/dummy/db/schema.rb +76 -0
- data/spec/dummy/lib/assets/.keep +0 -0
- data/spec/dummy/log/.keep +0 -0
- data/spec/dummy/public/404.html +58 -0
- data/spec/dummy/public/422.html +58 -0
- data/spec/dummy/public/500.html +57 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/factories/articles_factory.rb +27 -0
- data/spec/factories/redditor/images_factory.rb +9 -0
- data/spec/factories/redditor/pages_factory.rb +37 -0
- data/spec/factories/redditor/sliders_factory.rb +9 -0
- data/spec/factories/redditor/texts_factory.rb +5 -0
- data/spec/factories/redditor/videos_factories.rb +7 -0
- data/spec/features/text_spec.rb +52 -0
- data/spec/features/video_spec.rb +52 -0
- data/spec/fixtures/test.jpg +0 -0
- data/spec/generators/views_generator_spec.rb +20 -0
- data/spec/models/article_spec.rb +40 -0
- data/spec/spec_helper.rb +67 -0
- data/spec/views/article/show_spec.rb +22 -0
- metadata +480 -0
@@ -0,0 +1,175 @@
|
|
1
|
+
@import "compass";
|
2
|
+
|
3
|
+
#oooops {
|
4
|
+
// уведомления о том что ничего не поддерживается кроме фрейма
|
5
|
+
display: none;
|
6
|
+
border-radius: 4px;
|
7
|
+
padding: 10px;
|
8
|
+
margin: 10px 0; border: 2px solid #f60;
|
9
|
+
}
|
10
|
+
|
11
|
+
#buttons-panel {
|
12
|
+
font-size: 15px;
|
13
|
+
font-family: "Helvetica Neue";
|
14
|
+
margin-top: 7%;
|
15
|
+
}
|
16
|
+
|
17
|
+
.b-button {
|
18
|
+
position: relative;
|
19
|
+
overflow: hidden;
|
20
|
+
cursor: pointer;
|
21
|
+
color: rgb(62, 112, 141);
|
22
|
+
border-bottom: 1px dashed #000080;
|
23
|
+
-webkit-user-select: none;
|
24
|
+
-moz-user-select: none;
|
25
|
+
user-select: none;
|
26
|
+
margin-left: 8%;
|
27
|
+
display: inline-block;
|
28
|
+
font: 16px myfont;
|
29
|
+
&:hover {
|
30
|
+
text-decoration: underline;
|
31
|
+
border-bottom-color: transparent;
|
32
|
+
};
|
33
|
+
.b-button__input {
|
34
|
+
cursor: pointer;
|
35
|
+
@include opacity(0);
|
36
|
+
top: -10px;
|
37
|
+
right: -40px;
|
38
|
+
font-size: 50px;
|
39
|
+
position: absolute;
|
40
|
+
padding: 50px;
|
41
|
+
}
|
42
|
+
}
|
43
|
+
|
44
|
+
|
45
|
+
|
46
|
+
|
47
|
+
#preview {
|
48
|
+
box-shadow: 0 1px 3px rgba(0,0,0,.4);
|
49
|
+
border-radius: 3px;
|
50
|
+
}
|
51
|
+
|
52
|
+
.b-file {
|
53
|
+
padding: 5px;
|
54
|
+
position: relative;
|
55
|
+
overflow: hidden;
|
56
|
+
border-radius: 3px;
|
57
|
+
background-color: #fcfcfc;
|
58
|
+
background: -webkit-linear-gradient(top, #fcfcfc 0%, #f6f6f6 100%);
|
59
|
+
background: -moz-linear-gradient(top, #fcfcfc 0%, #f6f6f6 100%);
|
60
|
+
background: -o-linear-gradient(top, #fcfcfc 0%, #f6f6f6 100%);
|
61
|
+
background: linear-gradient(to bottom, #fcfcfc 0%, #f6f6f6 100%);
|
62
|
+
clear: both;
|
63
|
+
}
|
64
|
+
.b-file__left {
|
65
|
+
float: left;
|
66
|
+
margin: 1px 0 0 2px;
|
67
|
+
line-height: 0;
|
68
|
+
}
|
69
|
+
.b-file__left_border {
|
70
|
+
border: 2px solid #fff;
|
71
|
+
border-radius: 4px;
|
72
|
+
}
|
73
|
+
|
74
|
+
.b-file__right {
|
75
|
+
margin-left: 45px;
|
76
|
+
}
|
77
|
+
|
78
|
+
.b-file__name {
|
79
|
+
color: #36c;
|
80
|
+
}
|
81
|
+
|
82
|
+
.b-file__info {
|
83
|
+
color: #666;
|
84
|
+
position: relative;
|
85
|
+
font-size: 12px;
|
86
|
+
margin-top: 3px;
|
87
|
+
}
|
88
|
+
|
89
|
+
.b-file__bar {
|
90
|
+
padding-top: 4px;
|
91
|
+
}
|
92
|
+
|
93
|
+
.b-file__error {
|
94
|
+
color: #c00;
|
95
|
+
}
|
96
|
+
.b-file__done {
|
97
|
+
color: #458383;
|
98
|
+
}
|
99
|
+
.b-file__abort {
|
100
|
+
top: 10px;
|
101
|
+
right: 20px;
|
102
|
+
width: 15px;
|
103
|
+
height: 15px;
|
104
|
+
position: absolute;
|
105
|
+
color: #c00;
|
106
|
+
cursor: pointer;
|
107
|
+
font-size: 20px;
|
108
|
+
display: none;
|
109
|
+
font-style: italic;
|
110
|
+
border-bottom: none !important;
|
111
|
+
text-decoration: none !important;
|
112
|
+
}
|
113
|
+
.b-file_upload .b-file__abort { display: block; }
|
114
|
+
|
115
|
+
.b-progress {
|
116
|
+
max-width: 200px;
|
117
|
+
clear: both;
|
118
|
+
height: 10px;
|
119
|
+
border: 2px solid #E2E4E2;
|
120
|
+
border-radius: 10px;
|
121
|
+
box-shadow: inset 0 1px 1px rgba(0,0,0,.2);
|
122
|
+
background-color: #d3d3d3;
|
123
|
+
position: relative;
|
124
|
+
}
|
125
|
+
.b-progress__bar {
|
126
|
+
width: 0;
|
127
|
+
height: 10px;
|
128
|
+
border-radius: 10px;
|
129
|
+
background-color: #2D9DD7;
|
130
|
+
@include background(linear-gradient(top, #2D9DD7 0%, #1C81C7 100%));
|
131
|
+
-webkit-transition: width .5s ease-out;
|
132
|
+
-moz-transition: width .5s ease-out;
|
133
|
+
-ms-transition: width .5s ease-out;
|
134
|
+
transition: width .5s ease-out;
|
135
|
+
}
|
136
|
+
|
137
|
+
.b-dropzone {
|
138
|
+
position: relative;
|
139
|
+
border: 1px dashed #babbbf;
|
140
|
+
margin: 2% 0 7%;
|
141
|
+
&.active {
|
142
|
+
}
|
143
|
+
}
|
144
|
+
|
145
|
+
.b-dropzone__bg, .b-dropzone__txt {
|
146
|
+
position: absolute;
|
147
|
+
.b-dropzone.active & {display: block;}
|
148
|
+
}
|
149
|
+
|
150
|
+
.b-dropzone__bg {
|
151
|
+
top: 0;
|
152
|
+
left: 0;
|
153
|
+
right: 0;
|
154
|
+
bottom: 0;
|
155
|
+
z-index: 30000;
|
156
|
+
opacity: .2;
|
157
|
+
// background:#EEDA7C;
|
158
|
+
.active & {
|
159
|
+
background-color: #2D9DD7;
|
160
|
+
|
161
|
+
}
|
162
|
+
}
|
163
|
+
|
164
|
+
.b-dropzone__txt {
|
165
|
+
// color: rgb(168, 162, 94);
|
166
|
+
.active & {color: #1C81C7;}
|
167
|
+
text-align: center;
|
168
|
+
width: 500px;
|
169
|
+
top: 50%;
|
170
|
+
left: 50%;
|
171
|
+
margin: -50px 0 0 -250px;
|
172
|
+
z-index: 30001;
|
173
|
+
line-height: 100px;
|
174
|
+
font-size: 13px;
|
175
|
+
}
|
@@ -0,0 +1,108 @@
|
|
1
|
+
@import "compass";
|
2
|
+
dl.redditor {
|
3
|
+
dd {
|
4
|
+
/*нельзя задавать position-relative, иначе глючит сортировка в хроме*/
|
5
|
+
margin: 10px -10px; padding:10px; background:#efefef;
|
6
|
+
border: 1px solid #e8e8e8;
|
7
|
+
.handle {
|
8
|
+
width:20px; height: 20px; float: left;
|
9
|
+
background: image-url('redditor/move_handler.png') center no-repeat;
|
10
|
+
cursor: move;
|
11
|
+
}
|
12
|
+
}
|
13
|
+
&.now-sortable dd {
|
14
|
+
height: 50px !important; overflow: hidden;
|
15
|
+
.tit-form {display: block;}
|
16
|
+
}
|
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
|
+
.ui-sortable-helper, .ui-sortable-placeholder {
|
23
|
+
/*max-height: 200px !important; overflow: hidden;*/
|
24
|
+
}
|
25
|
+
.upload-area {
|
26
|
+
overflow: hidden; margin-top: 10px;
|
27
|
+
}
|
28
|
+
}
|
29
|
+
|
30
|
+
ul.slider-block-images {
|
31
|
+
overflow: hidden;
|
32
|
+
li {
|
33
|
+
margin: 0 5px 5px 0; list-style: none;
|
34
|
+
float: left; position: relative;
|
35
|
+
border: 1px solid #e8e8e8;
|
36
|
+
background: #fff;
|
37
|
+
img {display: block;}
|
38
|
+
}
|
39
|
+
}
|
40
|
+
|
41
|
+
div.redditor-add-blocks {
|
42
|
+
margin:10px -10px; padding:10px;
|
43
|
+
> p {
|
44
|
+
overflow: hidden;
|
45
|
+
}
|
46
|
+
}
|
47
|
+
.control-data {float: right;}
|
48
|
+
.delete-data, .update-data {
|
49
|
+
text-decoration: none;
|
50
|
+
display: inline-block;
|
51
|
+
text-align: center; min-width: 10px; padding: 0 5px;
|
52
|
+
font-size: 10px; line-height: 20px;
|
53
|
+
border: 1px solid #C2C2C2; border-radius: 15px;
|
54
|
+
background: #F8F8F8;
|
55
|
+
}
|
56
|
+
.delete-data { color: #A72522;}
|
57
|
+
.update-data { color: green;}
|
58
|
+
|
59
|
+
.form-name {
|
60
|
+
margin-top: 25px;
|
61
|
+
}
|
62
|
+
.tit-form {
|
63
|
+
display: none; margin-top: -25px; text-align: center; font-size: 18px;
|
64
|
+
line-height: 30px; vertical-align: middle;
|
65
|
+
img { width: 30px; display: inline-block; vertical-align: middle;}
|
66
|
+
}
|
67
|
+
.line-form {
|
68
|
+
display: inline-block; margin-right: 5px;
|
69
|
+
}
|
70
|
+
.del-item {
|
71
|
+
text-decoration: none; position: absolute; right: 1px; bottom: 1px;
|
72
|
+
width: 22px; height: 22px;
|
73
|
+
background: #eee image-url('redditor/trash.png') center no-repeat;
|
74
|
+
border-radius: 15px; border: 1px solid #aaa;
|
75
|
+
}
|
76
|
+
.full-width {
|
77
|
+
width: 100%; box-sizing: border-box;
|
78
|
+
}
|
79
|
+
.add-txt, .add-video, .add-photo, .add-slider {
|
80
|
+
text-decoration: none; color: #222; float: left; padding: 4px 10px 4px 25px;
|
81
|
+
border-radius: 3px; border: 1px solid #ccc; font-size: 11px; margin-right: 3px;
|
82
|
+
}
|
83
|
+
.add-txt {
|
84
|
+
@include background(image-url('redditor/add_txt.png') 3px center no-repeat, linear-gradient(top, #fff 0%, #f5f5f5 49%, #ececec 50%, #eee 100%));
|
85
|
+
}
|
86
|
+
.add-video {
|
87
|
+
@include background(image-url('redditor/add_video.png') 3px center no-repeat, linear-gradient(top, #fff 0%, #f5f5f5 49%, #ececec 50%, #eee 100%));
|
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%));
|
91
|
+
}
|
92
|
+
.add-slider {
|
93
|
+
@include background(image-url('redditor/add_slider.png') 3px center no-repeat, linear-gradient(top, #fff 0%, #f5f5f5 49%, #ececec 50%, #eee 100%));
|
94
|
+
}
|
95
|
+
a.redactor_btn_format {
|
96
|
+
background: image-url('redditor/no_format_text.png') center no-repeat !important;
|
97
|
+
}
|
98
|
+
a.redactor_btn_divide {
|
99
|
+
background: image-url('redditor/destroy_block_text.png') center no-repeat !important;
|
100
|
+
}
|
101
|
+
// dl.redditor dd:before {
|
102
|
+
// content: "class: " attr(class); display: block; padding: 2px; background: #fcc;
|
103
|
+
// }
|
104
|
+
|
105
|
+
// dl.redditor div.form-name:before {
|
106
|
+
// content: "object-name: " attr(data-object-name) "\A id: " attr(id); display: block; padding: 2px; background: #ffc;
|
107
|
+
// white-space: pre;
|
108
|
+
// }
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
class Redditor::Admin::BaseController < ActionController::Base
|
4
|
+
layout false
|
5
|
+
|
6
|
+
before_filter :get_page
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
def get_page
|
11
|
+
@page = Redditor::Page.find(params[:page_id] || params[:id])
|
12
|
+
end
|
13
|
+
|
14
|
+
def content_block_params
|
15
|
+
params.require(:content_block).permit!
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
class Redditor::Admin::ImageBlocksController < Redditor::Admin::BaseController
|
4
|
+
|
5
|
+
def new
|
6
|
+
@content_block = @page.images.build(content_block_params)
|
7
|
+
render "redditor/admin/pages/new"
|
8
|
+
end
|
9
|
+
|
10
|
+
def update
|
11
|
+
@content_block = @page.images.find(params[:id])
|
12
|
+
@content_block.update_attributes(content_block_params)
|
13
|
+
render "redditor/admin/pages/wrapper"
|
14
|
+
end
|
15
|
+
|
16
|
+
def create
|
17
|
+
@content_block = @page.images.build(content_block_params)
|
18
|
+
@content_block.update_attributes(src: params[:file])
|
19
|
+
render "redditor/admin/pages/wrapper"
|
20
|
+
end
|
21
|
+
|
22
|
+
def destroy
|
23
|
+
@content_block = @page.images.find(params[:id])
|
24
|
+
if @content_block.destroy
|
25
|
+
render :js => "$('#image_#{@content_block.id}').closest('dd').remove();"
|
26
|
+
else
|
27
|
+
render :js => "alert('Контент-блок не удален');"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def update_post
|
32
|
+
@content_block = @page.images.find(params[:id])
|
33
|
+
@content_block.update_attributes(src: params[:file])
|
34
|
+
render "redditor/admin/pages/wrapper"
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
class Redditor::Admin::ImagesController < Redditor::Admin::BaseController
|
4
|
+
|
5
|
+
layout false
|
6
|
+
|
7
|
+
def sort
|
8
|
+
params[:slider_block_image].each_with_index do |id, idx|
|
9
|
+
p = Redditor::Image.find(id)
|
10
|
+
p.position = idx
|
11
|
+
p.save
|
12
|
+
end
|
13
|
+
render :nothing => true
|
14
|
+
end
|
15
|
+
|
16
|
+
def create
|
17
|
+
@slider_block = @page.slider_blocks.find(params[:slider_block_id])
|
18
|
+
@image = @slider_block.images.build(src: params[:file])
|
19
|
+
if @image.save
|
20
|
+
render "redditor/admin/pages/slider_block_image"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def destroy
|
25
|
+
@image = Redditor::Image.find(params[:id])
|
26
|
+
if @image.destroy
|
27
|
+
render :js => "$('#slider_block_image_#{@image.id}').remove()"
|
28
|
+
else
|
29
|
+
render :js => 'Ошибка! Изображение не было удалено.'
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
class Redditor::Admin::PagesController < Redditor::Admin::BaseController
|
4
|
+
layout false
|
5
|
+
|
6
|
+
def sort
|
7
|
+
params[:sort].each do |k, v|
|
8
|
+
v.each do |klass, info|
|
9
|
+
klass.camelcase.constantize.find_by_id(info[:index]).update_attributes(position: info[:position]) rescue nil
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
render :nothing => true
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
class Redditor::Admin::SliderBlocksController < Redditor::Admin::BaseController
|
4
|
+
|
5
|
+
def new
|
6
|
+
@content_block = @page.slider_blocks.build(content_block_params)
|
7
|
+
render "redditor/admin/pages/new"
|
8
|
+
end
|
9
|
+
|
10
|
+
def update
|
11
|
+
@content_block = @page.slider_blocks.find(params[:id])
|
12
|
+
@content_block.update_attributes(content_block_params)
|
13
|
+
render "redditor/admin/pages/wrapper"
|
14
|
+
end
|
15
|
+
|
16
|
+
def create
|
17
|
+
temp_last_postion = @page.try(:content_blocks).try(:last).try(:position).to_i + 1
|
18
|
+
@content_block = @page.slider_blocks.build(content_block_params)
|
19
|
+
@content_block.update_attributes(position: temp_last_postion)
|
20
|
+
render "redditor/admin/pages/new"
|
21
|
+
end
|
22
|
+
|
23
|
+
def destroy
|
24
|
+
@content_block = @page.slider_blocks.find(params[:id])
|
25
|
+
if @content_block.destroy
|
26
|
+
render :js => "$('#slider_block_#{@content_block.id}').closest('dd').remove();"
|
27
|
+
else
|
28
|
+
render :js => "alert('Контент-блок не удален');"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
#coding: utf-8
|
2
|
+
|
3
|
+
class Redditor::Admin::TextBlocksController < Redditor::Admin::BaseController
|
4
|
+
|
5
|
+
def new
|
6
|
+
@content_block = @page.text_blocks.build(content_block_params)
|
7
|
+
render "redditor/admin/pages/new"
|
8
|
+
end
|
9
|
+
|
10
|
+
def update
|
11
|
+
@content_block = @page.text_blocks.find(params[:id])
|
12
|
+
@content_block.update_attributes(content_block_params)
|
13
|
+
render "redditor/admin/pages/wrapper"
|
14
|
+
end
|
15
|
+
|
16
|
+
def create
|
17
|
+
@content_block = @page.text_blocks.build(content_block_params)
|
18
|
+
@content_block.save
|
19
|
+
render "redditor/admin/pages/wrapper"
|
20
|
+
end
|
21
|
+
|
22
|
+
def destroy
|
23
|
+
@content_block = @page.text_blocks.find(params[:id])
|
24
|
+
if @content_block.destroy
|
25
|
+
render :js => "$('#text_block_#{@content_block.id}').closest('dd').remove();"
|
26
|
+
else
|
27
|
+
render :js => "alert('Контент-блок не удален');"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
#coding: utf-8
|
2
|
+
|
3
|
+
class Redditor::Admin::VideoBlocksController < Redditor::Admin::BaseController
|
4
|
+
|
5
|
+
def new
|
6
|
+
@content_block = @page.video_blocks.build(content_block_params)
|
7
|
+
render "redditor/admin/pages/new"
|
8
|
+
end
|
9
|
+
|
10
|
+
def update
|
11
|
+
@content_block = @page.video_blocks.find(params[:id])
|
12
|
+
@content_block.update_attributes(content_block_params)
|
13
|
+
render "redditor/admin/pages/wrapper"
|
14
|
+
end
|
15
|
+
|
16
|
+
def create
|
17
|
+
@content_block = @page.video_blocks.build(content_block_params)
|
18
|
+
@content_block.save
|
19
|
+
render "redditor/admin/pages/wrapper"
|
20
|
+
end
|
21
|
+
|
22
|
+
def destroy
|
23
|
+
@content_block = @page.video_blocks.find(params[:id])
|
24
|
+
if @content_block.destroy
|
25
|
+
render :js => "$('#video_block_#{@content_block.id}').closest('dd').remove();"
|
26
|
+
else
|
27
|
+
render :js => "alert('Контент-блок не удален');"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
#coding: utf-8
|
2
|
+
module Redditor
|
3
|
+
module FileapiHelper
|
4
|
+
|
5
|
+
def fileapi url=nil
|
6
|
+
html = stylesheet_link_tag "redditor/fileapi/fileapi"
|
7
|
+
html += javascript_include_tag "redditor/fileapi/mailru"
|
8
|
+
if url.present?
|
9
|
+
html += javascript_tag do
|
10
|
+
%Q{FU.config.uploadUrl = "#{url}"}.html_safe
|
11
|
+
end
|
12
|
+
end
|
13
|
+
content_for(:js, html)
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module Redditor
|
4
|
+
module PagesHelper
|
5
|
+
def button_tag_add_fields(name, f, association)
|
6
|
+
new_object = f.object.send(association).klass.new
|
7
|
+
id = new_object.object_id
|
8
|
+
fields = f.fields_for(association, new_object, child_index: id) do |builder|
|
9
|
+
content_tag(:dd, :id => "#{association.to_s.singularize}_#{id}") do
|
10
|
+
tag(:div, class: "handle") +
|
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: "update-data", remote: true, data: {disable_with: "Обновляется"}) + "\s" +
|
13
|
+
render("admin/pages/" + association.to_s.singularize, f: builder)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
button_tag(name, class: "add_fields", type: "button", data: {id: id, fields: fields.gsub("\n", "")})
|
18
|
+
end
|
19
|
+
|
20
|
+
def redditor_validate f
|
21
|
+
render "redditor/admin/pages/validate", {f: f}
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
module Redditor
|
3
|
+
class ContentBlock < ActiveRecord::Base
|
4
|
+
|
5
|
+
def self.find_by_position_and_type(position, type, page_id)
|
6
|
+
type.to_s.sub("s_attributes", "").camelcase.constantize.where(page_id: page_id, position: position).first
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.init_by_type(type, params)
|
10
|
+
res = type.to_s.sub("s_attributes", "").camelcase.constantize.new(params)
|
11
|
+
res.valid?
|
12
|
+
res
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.check_by_position_and_type position, type, page_id
|
16
|
+
type.to_s.sub("s_attributes", "").camelcase.constantize.where(page_id: page_id, position: position).any?
|
17
|
+
end
|
18
|
+
|
19
|
+
# def self.model_name
|
20
|
+
# ActiveModel::Name.new(self, nil, self.class.name.gsub("Redditor::", ''))
|
21
|
+
# end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module Redditor
|
4
|
+
class Image < ActiveRecord::Base
|
5
|
+
self.table_name = "redditor_images"
|
6
|
+
|
7
|
+
after_initialize :default_values # чтобы файл загружался, пока через html5 не передаем позицию
|
8
|
+
|
9
|
+
# attr_accessible :descr, :imageable_id, :imageable_type, :position, :src, :temp_id
|
10
|
+
attr_accessor :temp_id
|
11
|
+
|
12
|
+
mount_uploader :src, RedditorUploader
|
13
|
+
|
14
|
+
validates :src, :presence => true
|
15
|
+
|
16
|
+
belongs_to :imageable, :polymorphic => true
|
17
|
+
|
18
|
+
default_scope -> { order(:position) }
|
19
|
+
|
20
|
+
def self.model_name
|
21
|
+
ActiveModel::Name.new(self, nil, 'Image')
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
def default_values
|
26
|
+
self.position ||= 1000
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module Redditor
|
4
|
+
class Page < ActiveRecord::Base
|
5
|
+
self.table_name = "redditor_pages"
|
6
|
+
|
7
|
+
# attr_accessible :pageable_id, :pageable_type, :metakey, :metadesc, :text_blocks_attributes, :video_blocks_attributes, :images_attributes, :slider_blocks_attributes
|
8
|
+
|
9
|
+
belongs_to :pageable, :polymorphic => true
|
10
|
+
has_many :text_blocks, :class_name => "Redditor::TextBlock"
|
11
|
+
has_many :video_blocks, :class_name => "Redditor::VideoBlock"
|
12
|
+
has_many :images, :as => :imageable
|
13
|
+
has_many :slider_blocks, :class_name => "Redditor::SliderBlock"
|
14
|
+
|
15
|
+
accepts_nested_attributes_for :text_blocks, :allow_destroy => true
|
16
|
+
accepts_nested_attributes_for :video_blocks, :allow_destroy => true
|
17
|
+
accepts_nested_attributes_for :slider_blocks, :allow_destroy => true
|
18
|
+
accepts_nested_attributes_for :images, :allow_destroy => true
|
19
|
+
|
20
|
+
def self.model_name
|
21
|
+
ActiveModel::Name.new(self, nil, 'Page')
|
22
|
+
end
|
23
|
+
|
24
|
+
def content_blocks
|
25
|
+
(self.text_blocks + self.video_blocks + self.images + self.slider_blocks).sort {|x, y| x.position <=> y.position}
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module Redditor
|
4
|
+
class SliderBlock < ActiveRecord::Base
|
5
|
+
self.table_name = "redditor_slider_blocks"
|
6
|
+
|
7
|
+
# attr_accessible :page_id, :position, :temp_id
|
8
|
+
attr_accessor :temp_id
|
9
|
+
|
10
|
+
belongs_to :page, :class_name => "Redditor::Page"
|
11
|
+
has_many :images, :as => :imageable, :dependent => :destroy
|
12
|
+
|
13
|
+
def self.model_name
|
14
|
+
ActiveModel::Name.new(self, nil, 'SliderBlock')
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module Redditor
|
4
|
+
class TextBlock < ActiveRecord::Base
|
5
|
+
self.table_name = "redditor_text_blocks"
|
6
|
+
|
7
|
+
# attr_accessible :body, :page_id, :position, :temp_id, :translations_attributes
|
8
|
+
attr_accessor :temp_id
|
9
|
+
|
10
|
+
belongs_to :page, :class_name => "Redditor::Page"
|
11
|
+
|
12
|
+
default_scope -> { order(:position) }
|
13
|
+
|
14
|
+
validates :position, :body, :presence => true
|
15
|
+
|
16
|
+
def self.model_name
|
17
|
+
ActiveModel::Name.new(self, nil, 'TextBlock')
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
#coding: utf-8
|
2
|
+
|
3
|
+
class YoutubeValidator < ActiveModel::EachValidator
|
4
|
+
def validate_each(record, attribute, value)
|
5
|
+
if value =~ /[^A-z0-9_-]/
|
6
|
+
record.errors[attribute] << (options[:message] || "- используются недопустимые символы")
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
|
12
|
+
module Redditor
|
13
|
+
class VideoBlock < ActiveRecord::Base
|
14
|
+
self.table_name = "redditor_video_blocks"
|
15
|
+
|
16
|
+
# attr_accessible :height, :page_id, :position, :width, :youtube, :temp_id
|
17
|
+
attr_accessor :temp_id
|
18
|
+
|
19
|
+
validates :youtube, :length => { :is => 11 }, :youtube => true
|
20
|
+
|
21
|
+
belongs_to :page, :class_name => "Redditor::Page"
|
22
|
+
|
23
|
+
def self.model_name
|
24
|
+
ActiveModel::Name.new(self, nil, 'VideoBlock')
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|