Commit 6a27b875a4703ca0ae36481e6d5cacf24bd928ca
1 parent
f746553b
Exists in
master
and in
29 other branches
File upload working
Showing
5 changed files
with
95 additions
and
18 deletions
Show diff stats
app/controllers/my_profile/cms_controller.rb
@@ -338,7 +338,18 @@ class CmsController < MyProfileController | @@ -338,7 +338,18 @@ class CmsController < MyProfileController | ||
338 | def search | 338 | def search |
339 | query = params[:q] | 339 | query = params[:q] |
340 | results = query.blank? ? [] : profile.articles.published.find_by_contents(query) | 340 | results = query.blank? ? [] : profile.articles.published.find_by_contents(query) |
341 | - render :text => results.map { |item| { 'title' => item.title, 'url' => url_for(item.url), :icon => icon_for_article(item), :content_type => item.mime_type }}.to_json, :content_type => 'application/json' | 341 | + render :text => article_list_to_json(results), :content_type => 'application/json' |
342 | + end | ||
343 | + def media_upload | ||
344 | + files_uploaded = [] | ||
345 | + parent = check_parent(params[:parent_id]) | ||
346 | + files = [:file1,:file2, :file3].map { |f| params[f] } | ||
347 | + if request.post? | ||
348 | + files.each do |file| | ||
349 | + files_uploaded << UploadedFile.create(:uploaded_data => file, :profile => profile, :parent => parent) unless file == '' | ||
350 | + end | ||
351 | + end | ||
352 | + render :text => article_list_to_json(files_uploaded), :content_type => 'application/json' | ||
342 | end | 353 | end |
343 | 354 | ||
344 | protected | 355 | protected |
@@ -386,5 +397,16 @@ class CmsController < MyProfileController | @@ -386,5 +397,16 @@ class CmsController < MyProfileController | ||
386 | @selected_locale = @article.language || FastGettext.locale | 397 | @selected_locale = @article.language || FastGettext.locale |
387 | end | 398 | end |
388 | 399 | ||
400 | + def article_list_to_json(list) | ||
401 | + list.map do |item| | ||
402 | + { | ||
403 | + 'title' => item.title, | ||
404 | + 'url' => url_for(item.url), | ||
405 | + :icon => icon_for_article(item), | ||
406 | + :content_type => item.mime_type | ||
407 | + } | ||
408 | + end.to_json | ||
409 | + end | ||
410 | + | ||
389 | end | 411 | end |
390 | 412 |
app/views/cms/_textile_media.rhtml
@@ -18,31 +18,43 @@ | @@ -18,31 +18,43 @@ | ||
18 | <p><%= _('See also a more complete <a href="%s">Textile Reference</a>') % 'http://redcloth.org/hobix.com/textile/' %></p> | 18 | <p><%= _('See also a more complete <a href="%s">Textile Reference</a>') % 'http://redcloth.org/hobix.com/textile/' %></p> |
19 | </div> | 19 | </div> |
20 | </div> | 20 | </div> |
21 | - <div class='textile-editor-sidebar-box'> | 21 | + <div class='textile-editor-sidebar-box' id='media-upload-box'> |
22 | <p><strong>Media upload</strong></p> | 22 | <p><strong>Media upload</strong></p> |
23 | - <% @folders = profile.folders %> | ||
24 | - <% form_tag({ :action => 'media_upload' }, :multipart => true) do |f| %> | ||
25 | - <%= render :partial => 'upload_file_form', :locals => { :size => 30 } %> | ||
26 | - <% end %> | ||
27 | - <div id='media-upload-results' style='display: none'> | 23 | + <div id='media-upload-form'> |
24 | + <% form_tag({ :action => 'media_upload' }, :multipart => true) do |f| %> | ||
25 | + <div class='formfield'> | ||
26 | + <%# TODO duplicated from partial upload_file_form %> | ||
27 | + <%= labelled_form_field(_('Choose folder to upload files:'), select_tag('parent_id', options_for_select([[profile.identifier, '']] + profile.folders.collect {|f| [ profile.identifier + '/' + f.full_name, f.id ] }))) %> | ||
28 | + </div> | ||
29 | + <p><%= file_field_tag('file1') %></p> | ||
30 | + <p><%= file_field_tag('file2') %></p> | ||
31 | + <p><%= file_field_tag('file3') %></p> | ||
32 | + <% button_bar do %> | ||
33 | + <%= submit_button(:save, _('Upload')) %> | ||
34 | + <% end %> | ||
35 | + <% end %> | ||
36 | + </div> | ||
37 | + <div id='media-upload-results' class='media-list-results' style='display: none'> | ||
28 | <ul> | 38 | <ul> |
29 | </ul> | 39 | </ul> |
30 | <p> | 40 | <p> |
31 | <em><%= _('Drag item names to the text to add their URL') %></em> | 41 | <em><%= _('Drag item names to the text to add their URL') %></em> |
32 | </p> | 42 | </p> |
33 | - <p><%= link_to('#', _('Upload more files'), :id => 'media-upload-more-files') %></p> | 43 | + <p><%= link_to(_('Upload more files ...'), '#', :id => 'media-upload-more-files')%></p> |
34 | </div> | 44 | </div> |
35 | </div> | 45 | </div> |
36 | <div class='textile-editor-sidebar-box'> | 46 | <div class='textile-editor-sidebar-box'> |
37 | <p><strong>Media search</strong></p> | 47 | <p><strong>Media search</strong></p> |
38 | <% form_tag({ :action => 'search' }) do %> | 48 | <% form_tag({ :action => 'search' }) do %> |
39 | - <span class='formfield'> | ||
40 | - <input name='q' type='text' id='media-search-query' style='width: 250px;'/> | ||
41 | - </span> | ||
42 | - <%= submit_button :search, _('Search'), :id => 'media-search-button' %> | 49 | + <% button_bar do %> |
50 | + <span class='formfield'> | ||
51 | + <input name='q' type='text' id='media-search-query' style='width: 250px;'/> | ||
52 | + </span> | ||
53 | + <%= submit_button :search, _('Search'), :id => 'media-search-button' %> | ||
54 | + <% end %> | ||
43 | <% end %> | 55 | <% end %> |
44 | </form> | 56 | </form> |
45 | - <div id='media-search-results' style='display: none'> | 57 | + <div id='media-search-results' class='media-list-results' style='display: none'> |
46 | <ul> | 58 | <ul> |
47 | </ul> | 59 | </ul> |
48 | <p> | 60 | <p> |
public/javascripts/article.js
@@ -39,13 +39,34 @@ jQuery(function($) { | @@ -39,13 +39,34 @@ jQuery(function($) { | ||
39 | var $button = $(this); | 39 | var $button = $(this); |
40 | $button.toggleClass('icon-loading'); | 40 | $button.toggleClass('icon-loading'); |
41 | $.get($(this).parent().attr('action'), { 'q': query }, function(data) { | 41 | $.get($(this).parent().attr('action'), { 'q': query }, function(data) { |
42 | - $button.toggleClass('icon-loading'); | ||
43 | insert_items(data, '#media-search-results ul'); | 42 | insert_items(data, '#media-search-results ul'); |
44 | if (data.length && data.length > 0) { | 43 | if (data.length && data.length > 0) { |
45 | $('#media-search-results').slideDown(); | 44 | $('#media-search-results').slideDown(); |
46 | } | 45 | } |
46 | + $button.toggleClass('icon-loading'); | ||
47 | }); | 47 | }); |
48 | return false; | 48 | return false; |
49 | }); | 49 | }); |
50 | + $('#media-upload-form form').ajaxForm({ | ||
51 | + dataType: 'json', | ||
52 | + resetForm: true, | ||
53 | + beforeSubmit: | ||
54 | + function() { | ||
55 | + $('#media-upload-form').slideUp(); | ||
56 | + $('#media-upload-box').toggleClass('icon-loading'); | ||
57 | + }, | ||
58 | + success: | ||
59 | + function(data) { | ||
60 | + insert_items(data, '#media-upload-results ul'); | ||
61 | + if (data.length && data.length > 0) { | ||
62 | + $('#media-upload-results').slideDown(); | ||
63 | + } | ||
64 | + $('#media-upload-box').toggleClass('icon-loading'); | ||
65 | + } | ||
66 | + }); | ||
67 | + $('#media-upload-more-files').click(function() { | ||
68 | + $('#media-upload-results').hide(); | ||
69 | + $('#media-upload-form').show(); | ||
70 | + }); | ||
50 | 71 | ||
51 | }); | 72 | }); |
public/stylesheets/application.css
@@ -3396,11 +3396,11 @@ div.with_media_panel .formfield input { | @@ -3396,11 +3396,11 @@ div.with_media_panel .formfield input { | ||
3396 | .textile-editor-sidebar .icon-loading { | 3396 | .textile-editor-sidebar .icon-loading { |
3397 | background-image: url(../images/loading-small.gif); | 3397 | background-image: url(../images/loading-small.gif); |
3398 | } | 3398 | } |
3399 | -.textile-editor-sidebar #media-search-results ul { | 3399 | +.textile-editor-sidebar .media-list-results ul { |
3400 | padding: 0px; | 3400 | padding: 0px; |
3401 | list-style: none; | 3401 | list-style: none; |
3402 | } | 3402 | } |
3403 | -.textile-editor-sidebar #media-search-results li { | 3403 | +.textile-editor-sidebar .media-list-results li { |
3404 | background-repeat: no-repeat; | 3404 | background-repeat: no-repeat; |
3405 | background-position: 0px 0px; | 3405 | background-position: 0px 0px; |
3406 | padding-left: 20px; | 3406 | padding-left: 20px; |
@@ -3409,11 +3409,14 @@ div.with_media_panel .formfield input { | @@ -3409,11 +3409,14 @@ div.with_media_panel .formfield input { | ||
3409 | border: none; | 3409 | border: none; |
3410 | margin-bottom: 2px; | 3410 | margin-bottom: 2px; |
3411 | } | 3411 | } |
3412 | -.textile-editor-sidebar #media-search-results li:hover { | 3412 | +.textile-editor-sidebar .media-list-results li:hover { |
3413 | background-color: transparent; | 3413 | background-color: transparent; |
3414 | border: none; | 3414 | border: none; |
3415 | } | 3415 | } |
3416 | - | 3416 | +.textile-editor-sidebar #media-upload-box { |
3417 | + background-repeat: no-repeat; | ||
3418 | + background-position: top right ; | ||
3419 | +} | ||
3417 | 3420 | ||
3418 | /* ==> public/stylesheets/controller_contact.css <== */ | 3421 | /* ==> public/stylesheets/controller_contact.css <== */ |
3419 | /*** SELECT CITY ***/ | 3422 | /*** SELECT CITY ***/ |
test/functional/cms_controller_test.rb
@@ -1631,4 +1631,23 @@ class CmsControllerTest < Test::Unit::TestCase | @@ -1631,4 +1631,23 @@ class CmsControllerTest < Test::Unit::TestCase | ||
1631 | assert_match /text/, data.first['content_type'] | 1631 | assert_match /text/, data.first['content_type'] |
1632 | end | 1632 | end |
1633 | 1633 | ||
1634 | + should 'upload media by AJAX' do | ||
1635 | + post :media_upload, :profile => profile.identifier, :uploaded_files => [fixture_file_upload('/files/test.txt', 'text/plain'), fixture_file_upload('/files/rails.png', 'image/png')] | ||
1636 | + assert_match 'test.txt', @response.body | ||
1637 | + assert_equal 'application/json', @response.content_type | ||
1638 | + | ||
1639 | + data = eval(@response.body.gsub('":', '"=>')) | ||
1640 | + | ||
1641 | + assert_equal 'test.txt', data[0]['title'] | ||
1642 | + assert_match /\/testinguser\/test.txt$/, data[0]['url'] | ||
1643 | + assert_match /text/, data[0]['icon'] | ||
1644 | + assert_match /text/, data[0]['content_type'] | ||
1645 | + | ||
1646 | + assert_equal 'rails.png', data[1]['title'] | ||
1647 | + assert_match /\/testinguser\/rails.png$/, data[1]['url'] | ||
1648 | + assert_match /png$/, data[1]['icon'] | ||
1649 | + assert_match /image/, data[1]['content_type'] | ||
1650 | + | ||
1651 | + end | ||
1652 | + | ||
1634 | end | 1653 | end |