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,35 @@
|
|
1
|
+
// Simple JavaScript Templating
|
2
|
+
// John Resig - http://ejohn.org/ - MIT Licensed
|
3
|
+
(function (){
|
4
|
+
var cache = {};
|
5
|
+
|
6
|
+
this.tmpl = function tmpl(str, data){
|
7
|
+
// Figure out if we're getting a template, or if we need to
|
8
|
+
// load the template - and be sure to cache the result.
|
9
|
+
var fn = !/\W/.test(str) ?
|
10
|
+
cache[str] = cache[str] ||
|
11
|
+
tmpl(document.getElementById(str).innerHTML) :
|
12
|
+
|
13
|
+
// Generate a reusable function that will serve as a template
|
14
|
+
// generator (and which will be cached).
|
15
|
+
new Function("obj",
|
16
|
+
"var p=[],print=function(){p.push.apply(p,arguments);};" +
|
17
|
+
|
18
|
+
// Introduce the data as local variables using with(){}
|
19
|
+
"with(obj){p.push('" +
|
20
|
+
|
21
|
+
// Convert the template into pure JavaScript
|
22
|
+
str
|
23
|
+
.replace(/[\r\t\n]/g, " ")
|
24
|
+
.split("<%").join("\t")
|
25
|
+
.replace(/((^|%>)[^\t]*)'/g, "$1\r")
|
26
|
+
.replace(/\t=(.*?)%>/g, "',$1,'")
|
27
|
+
.split("\t").join("');")
|
28
|
+
.split("%>").join("p.push('")
|
29
|
+
.split("\r").join("\\'")
|
30
|
+
+ "');}return p.join('');");
|
31
|
+
|
32
|
+
// Provide some basic currying to the user
|
33
|
+
return data ? fn(data) : fn;
|
34
|
+
};
|
35
|
+
})();
|
@@ -0,0 +1,139 @@
|
|
1
|
+
window.FU =
|
2
|
+
config:
|
3
|
+
maxFileSizeMB: 10
|
4
|
+
messages:
|
5
|
+
error: "Ошибка"
|
6
|
+
done: "Загружено"
|
7
|
+
data: ->
|
8
|
+
icon:
|
9
|
+
image: "//cdn1.iconfinder.com/data/icons/humano2/32x32/apps/synfig_icon.png"
|
10
|
+
|
11
|
+
files: []
|
12
|
+
index: 0
|
13
|
+
active: false
|
14
|
+
|
15
|
+
add: (file) ->
|
16
|
+
FU.files.push file
|
17
|
+
if /^image/.test(file.type)
|
18
|
+
FileAPI.Image(file).preview(35).rotate("auto").get (err, img) ->
|
19
|
+
FU._getEl(file, ".js-left").addClass("b-file__left_border").html img unless err
|
20
|
+
|
21
|
+
getFileById: (id) ->
|
22
|
+
i = FU.files.length
|
23
|
+
return FU.files[i] if FileAPI.uid(FU.files[i]) is id while i--
|
24
|
+
|
25
|
+
start: ->
|
26
|
+
FU._upload FU.files[FU.index] if not FU.active and (FU.active = FU.files.length > FU.index)
|
27
|
+
|
28
|
+
abort: (id) ->
|
29
|
+
file = @getFileById(id)
|
30
|
+
file.xhr.abort() if file.xhr
|
31
|
+
|
32
|
+
_getEl: (file, sel) ->
|
33
|
+
$el = $("#file-" + FileAPI.uid(file))
|
34
|
+
(if sel then $el.find(sel) else $el)
|
35
|
+
|
36
|
+
_upload: (file) ->
|
37
|
+
if file
|
38
|
+
FileAPI.upload(
|
39
|
+
url: FU.config.uploadUrl+"?authenticity_token=#{encodeURIComponent($("meta[name=\"csrf-token\"]").attr("content"))}"
|
40
|
+
data: FU.config.data()
|
41
|
+
dataType: "script"
|
42
|
+
|
43
|
+
files:
|
44
|
+
file: file
|
45
|
+
|
46
|
+
upload: ->
|
47
|
+
FU._getEl(file).addClass "b-file_upload"
|
48
|
+
FU._getEl(file, ".js-progress").css(opacity: 0).show().animate
|
49
|
+
opacity: 1
|
50
|
+
, 100
|
51
|
+
|
52
|
+
progress: (evt) ->
|
53
|
+
FU._getEl(file, ".js-bar").css "width", evt.loaded / evt.total * 100 + "%"
|
54
|
+
|
55
|
+
complete: (err, xhr) ->
|
56
|
+
setTimeout(xhr.responseText, 10)
|
57
|
+
|
58
|
+
state = (if err then "error" else "done")
|
59
|
+
FU._getEl(file).removeClass "b-file_upload"
|
60
|
+
FU._getEl(file, ".js-progress").animate
|
61
|
+
opacity: 0
|
62
|
+
, 200, ->
|
63
|
+
$(@).hide().closest("div.js-file").delay(1000).fadeOut 200, ->
|
64
|
+
$(@).remove()
|
65
|
+
|
66
|
+
FU._getEl(file, ".js-info").append ", <b class=\"b-file__" + state + "\">" + ((if err then (xhr.statusText or err) else FU.config.messages[state])) + "</b>"
|
67
|
+
FU.index++
|
68
|
+
FU.active = false
|
69
|
+
FU.start()
|
70
|
+
)
|
71
|
+
|
72
|
+
template: '<div id="file-<%=FileAPI.uid(file)%>" class="js-file b-file b-file_<%=file.type.split("/")[0]%>">
|
73
|
+
<div class="js-left b-file__left">
|
74
|
+
<img src="<%=icon[file.type.split("/")[0]]||icon.def%>" width="32" height="32" style="margin: 2px 0 0 3px"/>
|
75
|
+
</div>
|
76
|
+
<div class="b-file__right">
|
77
|
+
<div class="js-name b-file__name"><%=file.name%></div>
|
78
|
+
<div class="js-info b-file__info">Размер: <%=(file.size/FileAPI.KB).toFixed(2)%> KB</div>
|
79
|
+
<div class="js-progress b-file__bar" style="display: none">
|
80
|
+
<div class="b-progress"><div class="js-bar b-progress__bar"></div></div>
|
81
|
+
</div>
|
82
|
+
</div>
|
83
|
+
<i class="js-abort b-file__abort" title="abort">×</i>
|
84
|
+
</div>'
|
85
|
+
|
86
|
+
|
87
|
+
window.onFiles = (files, context) ->
|
88
|
+
$context = $(context)
|
89
|
+
if uploadUrl = $context.data("upload-url")
|
90
|
+
FU.config.uploadUrl = uploadUrl
|
91
|
+
|
92
|
+
if contentBlockId = $context.data("content-block-id")
|
93
|
+
FU.config.data = ->
|
94
|
+
REDDE.redditor.parameterizationForm $context.closest("dd")
|
95
|
+
else
|
96
|
+
FU.config.data = ->
|
97
|
+
|
98
|
+
FileAPI.each files, (file) ->
|
99
|
+
if file.size >= FU.config.maxFileSizeMB * FileAPI.MB
|
100
|
+
alert "Sorrow.\nMax size #{FU.config.maxFileSizeMB}MB"
|
101
|
+
else if file.size is undefined
|
102
|
+
$("#oooops").show()
|
103
|
+
$("#buttons-panel").hide()
|
104
|
+
else
|
105
|
+
$("#preview").append tmpl(window.FU.template,
|
106
|
+
file: file
|
107
|
+
icon: FU.icon
|
108
|
+
)
|
109
|
+
FU.add file
|
110
|
+
FU.start()
|
111
|
+
|
112
|
+
$ ->
|
113
|
+
unless FileAPI.support.cors or FileAPI.support.flash
|
114
|
+
$("<div />",
|
115
|
+
class: "alert"
|
116
|
+
html: "Увы, ваш браузер не поддерживает html5 и flash, поэтому смотреть тут нечего, а iframe не даёт всей красоты :]"
|
117
|
+
).insertAfter "#page-header" # если загрузка не поддерживается, то выводим сообщение
|
118
|
+
$('#buttons-panel').hide()
|
119
|
+
|
120
|
+
|
121
|
+
if FileAPI.support.dnd
|
122
|
+
$('#drag-n-drop').show() #выводим текст с сообщение что работает dnd
|
123
|
+
$(document).dnd (over) ->
|
124
|
+
$('#drop-zone').toggleClass "active", over #Если кто-то перетащил файлы в браузер подсвечиваем область в которую их можно бросить
|
125
|
+
return
|
126
|
+
, ->
|
127
|
+
$('#drop-zone').dnd (over) ->
|
128
|
+
return
|
129
|
+
, (files) ->
|
130
|
+
onFiles files, this
|
131
|
+
return
|
132
|
+
|
133
|
+
$(document).on 'change', 'input[type="file"][name="files"]', (evt) ->
|
134
|
+
files = FileAPI.getFiles(evt)
|
135
|
+
onFiles(files, this)
|
136
|
+
FileAPI.reset(evt.currentTarget)
|
137
|
+
return
|
138
|
+
|
139
|
+
return
|
@@ -0,0 +1,148 @@
|
|
1
|
+
window.REDDE = {redditor: {}}
|
2
|
+
REDDE.redditor.sliderBlockImagesSortableParams =
|
3
|
+
scroll: false
|
4
|
+
dropOnEmpty: false
|
5
|
+
cursor: "crosshair"
|
6
|
+
opacity: 0.75
|
7
|
+
items: "li"
|
8
|
+
update: ->
|
9
|
+
self = $(@)
|
10
|
+
$.ajax
|
11
|
+
data: self.sortable('serialize') + '&authenticity_token=#{u(form_authenticity_token)}'
|
12
|
+
dataType: 'script'
|
13
|
+
url: self.data("sortable-url")
|
14
|
+
.done ->
|
15
|
+
# console.log
|
16
|
+
return
|
17
|
+
.error ->
|
18
|
+
alert "Ошибка, данные не сохранены"
|
19
|
+
|
20
|
+
REDDE.redditor.parameterizationForm = (box) ->
|
21
|
+
form = box.serializeForm()
|
22
|
+
formName = box.find("div.form-name").data("object-name")
|
23
|
+
firstProperty = formName.replace(/^(.*?)\[.*/,"$1")
|
24
|
+
nextProperties = formName.match(/\[(.*?)\]/g)
|
25
|
+
nextProperties = $.map nextProperties, (n)->
|
26
|
+
n.replace(/\[(.*)\]/,"$1")
|
27
|
+
params = form[firstProperty]
|
28
|
+
for i in nextProperties
|
29
|
+
params = params[i]
|
30
|
+
params = "content_block": params
|
31
|
+
|
32
|
+
|
33
|
+
REDDE.redditor.setPositions = ->
|
34
|
+
$el = REDDE.redditor.$el
|
35
|
+
$el.find($el.sortable("option", "items")).each (i) ->
|
36
|
+
$(this).find("input.js-position").val i # временное решение с input type=number
|
37
|
+
|
38
|
+
REDDE.redditor.sortList = ->
|
39
|
+
sortArray = $.map REDDE.redditor.$el.find("dd"), (n) ->
|
40
|
+
key = $(n).attr("class")
|
41
|
+
input = $(n).find("input[type=hidden][name='#{$(n).find("div.form-name").data("object-name")}[id]']")
|
42
|
+
value = input.val()
|
43
|
+
# console.log input, value
|
44
|
+
if value?
|
45
|
+
obj = {}
|
46
|
+
obj[key] =
|
47
|
+
index: value
|
48
|
+
position: $(n).index()
|
49
|
+
obj
|
50
|
+
else
|
51
|
+
null
|
52
|
+
|
53
|
+
# console.log sortArray
|
54
|
+
|
55
|
+
if sortArray.length
|
56
|
+
$.ajax
|
57
|
+
type: "post"
|
58
|
+
# data: self.sortable('serialize') + '&authenticity_token=<%= u(form_authenticity_token) %>',
|
59
|
+
data: {sort: sortArray}
|
60
|
+
dataType: "script"
|
61
|
+
url: REDDE.redditor.$el.data("sort-url")
|
62
|
+
.done(REDDE.redditor.setPositions)
|
63
|
+
else
|
64
|
+
REDDE.redditor.setPositions()
|
65
|
+
|
66
|
+
$ ->
|
67
|
+
REDDE.redditor.$el = $("dl.redditor").first()
|
68
|
+
|
69
|
+
$(".add_fields").click ->
|
70
|
+
time = new Date().getTime()
|
71
|
+
regexp = new RegExp($(this).data("id"), "g")
|
72
|
+
self = REDDE.redditor.$el.append($(this).data("fields").replace(regexp, time))
|
73
|
+
REDDE.redditor.setPositions()
|
74
|
+
|
75
|
+
REDDE.redditor.$el.sortable
|
76
|
+
dropOnEmpty: false
|
77
|
+
cursor: "crosshair"
|
78
|
+
opacity: 0.75
|
79
|
+
handle: ".handle"
|
80
|
+
axis: "y"
|
81
|
+
items: "dd"
|
82
|
+
scroll: false
|
83
|
+
update: REDDE.redditor.sortList
|
84
|
+
start: ->
|
85
|
+
# необходимо обновить, чтобы сортировака работала корректно, тк меняем высоту блоков
|
86
|
+
$(@).addClass("now-sortable").sortable( "refresh" )
|
87
|
+
return
|
88
|
+
stop: ->
|
89
|
+
$(@).removeClass("now-sortable")
|
90
|
+
return
|
91
|
+
|
92
|
+
.on "ajax:beforeSend", "a.update-data", (event, xhr, status) ->
|
93
|
+
box = $(@).closest "dd"
|
94
|
+
params = REDDE.redditor.parameterizationForm(box)
|
95
|
+
status.url += "?" + $.param(params)
|
96
|
+
|
97
|
+
$("ul.slider-block-images").sortable REDDE.redditor.sliderBlockImagesSortableParams
|
98
|
+
|
99
|
+
$('div.redditor-add-blocks').on "ajax:beforeSend", "a.new-block", (event, xhr, status) ->
|
100
|
+
status.url += "?" + $.param(content_block: {temp_id: new Date().getTime()}) # generate uniq id
|
101
|
+
|
102
|
+
#! jquery-serializeForm - Make an object out of form elements - v1.1.1 - 2013-01-21
|
103
|
+
#* https://github.com/danheberden/jquery-serializeForm
|
104
|
+
#* Copyright (c) 2013 Dan Heberden; Licensed MIT
|
105
|
+
(($) ->
|
106
|
+
$.fn.serializeForm = ->
|
107
|
+
|
108
|
+
# don't do anything if we didn't get any elements
|
109
|
+
return false if @length < 1
|
110
|
+
data = {}
|
111
|
+
lookup = data #current reference of data
|
112
|
+
selector = ":input[type!=\"checkbox\"][type!=\"radio\"], input:checked"
|
113
|
+
parse = ->
|
114
|
+
|
115
|
+
# data[a][b] becomes [ data, a, b ]
|
116
|
+
named = @name.replace(/\[([^\]]+)?\]/g, ",$1").split(",")
|
117
|
+
cap = named.length - 1
|
118
|
+
$el = $(this)
|
119
|
+
|
120
|
+
# Ensure that only elements with valid `name` properties will be serialized
|
121
|
+
if named[0]
|
122
|
+
i = 0
|
123
|
+
|
124
|
+
while i < cap
|
125
|
+
|
126
|
+
# move down the tree - create objects or array if necessary
|
127
|
+
lookup = lookup[named[i]] = lookup[named[i]] or ((if named[i + 1] is "" then [] else {}))
|
128
|
+
i++
|
129
|
+
|
130
|
+
# at the end, push or assign the value
|
131
|
+
if lookup.length isnt `undefined`
|
132
|
+
lookup.push $el.val()
|
133
|
+
else
|
134
|
+
lookup[named[cap]] = $el.val()
|
135
|
+
|
136
|
+
# assign the reference back to root
|
137
|
+
lookup = data
|
138
|
+
|
139
|
+
|
140
|
+
# first, check for elements passed into this function
|
141
|
+
@filter(selector).each parse
|
142
|
+
|
143
|
+
# then parse possible child elements
|
144
|
+
@find(selector).each parse
|
145
|
+
|
146
|
+
# return data
|
147
|
+
data
|
148
|
+
) jQuery
|
@@ -0,0 +1,47 @@
|
|
1
|
+
/*
|
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
|
+
|
14
|
+
@import "compass";
|
15
|
+
|
16
|
+
html {
|
17
|
+
font: 12px "Lucida Grande", "Lucida Sans Unicode", helvetica, arial, verdana, sans-serif;
|
18
|
+
}
|
19
|
+
|
20
|
+
form.edit_article {
|
21
|
+
margin:0 10px;
|
22
|
+
}
|
23
|
+
|
24
|
+
.text-block-input {
|
25
|
+
width: 100%;
|
26
|
+
@include box-sizing(border-box);
|
27
|
+
}
|
28
|
+
|
29
|
+
input[type=submit] {
|
30
|
+
font-size: 2em;
|
31
|
+
padding: 0.25em 1.5em;
|
32
|
+
display: inline-block;
|
33
|
+
background:#ccc;
|
34
|
+
cursor: pointer;
|
35
|
+
@include background(linear-gradient(#fff, #ccc));
|
36
|
+
border-radius: 3px;
|
37
|
+
box-shadow: 1px 1px 2px #ccc;
|
38
|
+
border: 1px solid #999;
|
39
|
+
text-transform: lowercase;
|
40
|
+
outline: none;
|
41
|
+
&:hover {
|
42
|
+
@include background(linear-gradient(rgba(#fff, 0.8), rgba(#ccc, 0.8)));
|
43
|
+
}
|
44
|
+
&:active {
|
45
|
+
@include transform(translateY(1px));
|
46
|
+
}
|
47
|
+
}
|
@@ -0,0 +1,174 @@
|
|
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
|
+
}
|
15
|
+
|
16
|
+
.b-button {
|
17
|
+
display: inline-block;
|
18
|
+
*display: inline;
|
19
|
+
*zoom: 1;
|
20
|
+
position: relative;
|
21
|
+
overflow: hidden;
|
22
|
+
cursor: pointer;
|
23
|
+
padding: 4px 15px;
|
24
|
+
vertical-align: middle;
|
25
|
+
border: 1px solid #ccc;
|
26
|
+
border-radius: 3px;
|
27
|
+
background-color: #f5f5f5;
|
28
|
+
@include background(linear-gradient(top, #fff 0%, #f5f5f5 49%, #ececec 50%, #eee 100%));
|
29
|
+
-webkit-user-select: none;
|
30
|
+
-moz-user-select: none;
|
31
|
+
user-select: none;
|
32
|
+
&:hover {
|
33
|
+
border-color: #fa0;
|
34
|
+
box-shadow: 0 0 2px #fa0;
|
35
|
+
};
|
36
|
+
.b-button__input {
|
37
|
+
cursor: pointer;
|
38
|
+
@include opacity(0);
|
39
|
+
top: -10px;
|
40
|
+
right: -40px;
|
41
|
+
font-size: 50px;
|
42
|
+
position: absolute;
|
43
|
+
padding: 50px;
|
44
|
+
}
|
45
|
+
}
|
46
|
+
|
47
|
+
|
48
|
+
|
49
|
+
|
50
|
+
#preview {
|
51
|
+
box-shadow: 0 1px 3px rgba(0,0,0,.4);
|
52
|
+
border-radius: 3px;
|
53
|
+
}
|
54
|
+
|
55
|
+
.b-file {
|
56
|
+
padding: 5px;
|
57
|
+
position: relative;
|
58
|
+
overflow: hidden;
|
59
|
+
border-radius: 3px;
|
60
|
+
background-color: #fcfcfc;
|
61
|
+
background: -webkit-linear-gradient(top, #fcfcfc 0%, #f6f6f6 100%);
|
62
|
+
background: -moz-linear-gradient(top, #fcfcfc 0%, #f6f6f6 100%);
|
63
|
+
background: -o-linear-gradient(top, #fcfcfc 0%, #f6f6f6 100%);
|
64
|
+
background: linear-gradient(to bottom, #fcfcfc 0%, #f6f6f6 100%);
|
65
|
+
clear: both;
|
66
|
+
}
|
67
|
+
.b-file__left {
|
68
|
+
float: left;
|
69
|
+
margin: 1px 0 0 2px;
|
70
|
+
line-height: 0;
|
71
|
+
}
|
72
|
+
.b-file__left_border {
|
73
|
+
border: 2px solid #fff;
|
74
|
+
border-radius: 4px;
|
75
|
+
}
|
76
|
+
|
77
|
+
.b-file__right {
|
78
|
+
margin-left: 45px;
|
79
|
+
}
|
80
|
+
|
81
|
+
.b-file__name {
|
82
|
+
color: #36c;
|
83
|
+
}
|
84
|
+
|
85
|
+
.b-file__info {
|
86
|
+
color: #666;
|
87
|
+
position: relative;
|
88
|
+
font-size: 12px;
|
89
|
+
margin-top: 3px;
|
90
|
+
}
|
91
|
+
|
92
|
+
.b-file__bar {
|
93
|
+
padding-top: 4px;
|
94
|
+
}
|
95
|
+
|
96
|
+
.b-file__error {
|
97
|
+
color: #c00;
|
98
|
+
}
|
99
|
+
.b-file__done {
|
100
|
+
color: #458383;
|
101
|
+
}
|
102
|
+
.b-file__abort {
|
103
|
+
top: 10px;
|
104
|
+
right: 20px;
|
105
|
+
width: 15px;
|
106
|
+
height: 15px;
|
107
|
+
position: absolute;
|
108
|
+
color: #c00;
|
109
|
+
cursor: pointer;
|
110
|
+
font-size: 20px;
|
111
|
+
display: none;
|
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; margin-bottom: 10px;
|
139
|
+
&.active {
|
140
|
+
}
|
141
|
+
}
|
142
|
+
|
143
|
+
.b-dropzone__bg, .b-dropzone__txt {
|
144
|
+
position: absolute;
|
145
|
+
.b-dropzone.active & {display: block;}
|
146
|
+
}
|
147
|
+
|
148
|
+
.b-dropzone__bg {
|
149
|
+
top: 0;
|
150
|
+
left: 0;
|
151
|
+
right: 0;
|
152
|
+
bottom: 0;
|
153
|
+
z-index: 30000;
|
154
|
+
opacity: .2;
|
155
|
+
background:#EEDA7C;
|
156
|
+
.active & {
|
157
|
+
background-color: #2D9DD7;
|
158
|
+
|
159
|
+
}
|
160
|
+
}
|
161
|
+
|
162
|
+
.b-dropzone__txt {
|
163
|
+
color: rgb(168, 162, 94);
|
164
|
+
.active & {color: #1C81C7;}
|
165
|
+
font-size: 16px;
|
166
|
+
font-weight: bold;
|
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
|
+
}
|