Skip to content

Commit

Permalink
Supporting uploads in pages
Browse files Browse the repository at this point in the history
Alter backend to support uploads in pages
Implement page uploads
JS actions for page uploads
  • Loading branch information
jamesu authored and Pablo Villalba committed Jan 28, 2010
1 parent 009a552 commit 006a9dc
Show file tree
Hide file tree
Showing 29 changed files with 326 additions and 28 deletions.
16 changes: 14 additions & 2 deletions app/controllers/uploads_controller.rb
@@ -1,5 +1,6 @@
class UploadsController < ApplicationController
before_filter :find_upload, :only => [:destroy,:update,:thumbnail,:show]
before_filter :load_page, :only => [:new, :create, :destroy]
skip_before_filter :load_project, :only => [:download]
SEND_FILE_METHOD = :default

Expand Down Expand Up @@ -50,6 +51,7 @@ def edit

def new
@comment = load_comment
calculate_position if @page
@upload = @current_project.uploads.new(:user_id => current_user.id)
if is_iframe?
respond_to { |f| f.html { render :layout => 'upload_iframe' }}
Expand All @@ -61,18 +63,22 @@ def new
def create
@upload = @current_project.uploads.new(params[:upload])
@upload.user = current_user
@upload.page = @page
calculate_position if @page

if is_iframe? # uploads attached to a comment
@upload.save
@comment = load_comment
save_slot(@upload) if @page
@comment = load_comment unless @page
@upload.reload
respond_to do |f|
f.html { render :template => 'uploads/create', :layout => 'upload_iframe' }
f.html { render :template => @page.nil? ? 'uploads/create' : 'uploads/create_page', :layout => 'upload_iframe' }
end
else
respond_to do |f|
if @upload.save
@current_project.log_activity(@upload,'create')
save_slot(@upload) if @page
f.html { redirect_to(project_uploads_path(@current_project)) }
else
@uploads = @current_project.uploads
Expand Down Expand Up @@ -124,6 +130,12 @@ def load_comment
end
end

def load_page
if params[:page_id]
@page = @current_project.pages.find(params[:page_id])
end
end

def find_upload
if params[:id].match /^\d+$/
@upload = @current_project.uploads.find(params[:id])
Expand Down
26 changes: 20 additions & 6 deletions app/helpers/page_upload_helper.rb
@@ -1,10 +1,24 @@
module PageUploadHelper

def new_page_upload_link(project,page)
link_to_remote "<span>#{t('.new_upload')}</span>",
:url => new_project_page_upload_path(project,page),
:method => :get,
:html => { :class => 'add_button' }
end
def new_page_upload_link(project,page,in_bar)
link_to_function "<span>#{t('.new_upload')}</span>", show_page_upload_form(in_bar), :class => 'add_button'
end

def cancel_page_upload_link
link_to t('common.cancel'), '#', :class => 'cancel'
end

def show_page_upload_form(in_bar)
update_page do |page|
unless in_bar
page.call "InsertionMarker.set", nil, true
page.call "InsertionBar.place"
end

page.call "InsertionMarker.setEnabled", true
page.call "InsertionBar.clearWidgetForm"
page.call "InsertionBar.insertTempForm", (render :partial => 'uploads/page_upload')
page.reload_javascript_events
end
end
end
4 changes: 2 additions & 2 deletions app/helpers/pages_helper.rb
Expand Up @@ -72,8 +72,8 @@ def page_action_links(project,page)
:page => page }
end

def page_slot_fields(formName)
render :partial => 'pages/slot_fields', :locals => {:formName => formName}
def page_slot_fields(formName=nil, slot=0, before=0)
render :partial => 'pages/slot_fields', :locals => {:formName => formName, :pos_slot => slot, :pos_before => before}
end

def drag_widget_handle(widget)
Expand Down
30 changes: 30 additions & 0 deletions app/helpers/uploads_helper.rb
Expand Up @@ -95,13 +95,34 @@ def upload_form_url_for(comment)
end
end

def page_upload_form_url_for(page)
project_page_uploads_url(page.project, page)
end

def upload_url_for(comment)
if comment.new_record?
new_project_upload_url(comment.project)
else
new_project_comment_upload_url(comment.project,comment)
end
end

def page_upload_url_for(page)
new_project_page_upload_path(page.project, page)
end

def page_upload_actions_link(page, upload)
return unless upload.editable?(current_user)
render :partial => 'uploads/slot_actions',
:locals => { :upload => upload, :page => page }
end

def delete_page_upload_loading_action(upload)
update_page do |page|
page.insert_html :after, "delete_upload_#{upload.id}_link", loading_action_image("upload_#{upload.id}")
page["delete_upload_#{upload.id}_link"].hide
end
end

def list_uploads_edit(uploads,target)
render :partial => 'uploads/upload_edit', :collection => uploads, :as => :upload, :locals => { :target => target }
Expand Down Expand Up @@ -149,6 +170,15 @@ def destroy_upload_link(project,upload)
:confirm => t('confirm.delete_upload'),
:html => { :class => 'remove' }
end

def destroy_page_upload_link(page, upload)
link_to_remote trash_image,
:url => project_page_upload_url(page.project,page,upload),
:loading => delete_page_upload_loading_action(upload),
:method => :delete,
:confirm => t('confirm.delete_upload'),
:html => { :id => "delete_upload_#{upload.id}_link" }
end

def upload_form_params(comment)
render :partial => 'uploads/iframe_upload', :locals => { :comment => comment, :upload => Upload.new }
Expand Down
2 changes: 1 addition & 1 deletion app/javascripts/application.js
Expand Up @@ -74,7 +74,7 @@ Element.addMethods({
var field;
if (field = element.down(".focus")) { (function() { try { field.select() } catch (e) { } }).defer(); }
return element;
}
}
});

Project = {
Expand Down
59 changes: 59 additions & 0 deletions app/javascripts/pages.js
Expand Up @@ -19,6 +19,20 @@ Event.addBehavior({
e.hide();
});
},
".pageSlot .upload:mouseover": function(e){
$(this).select('p.slotActions').each(function(e) {
e.show();
});
},
".pageSlot .upload:mouseout": function(e){
$$(".pageSlot .upload p.slotActions").each(function(e){
e.hide();
});
},
".pageForm a.cancel:click": function(e){
e.element().up('.pageForm').remove();
return false;
},
"#pageInsert:click": function(e) {
if (InsertionBar.current_form) {
InsertionBar.place();
Expand Down Expand Up @@ -48,6 +62,7 @@ var Page = {
this.READONLY = readonly;
this.url = url;
this.auth = auth;
document.currentPage = this;
if (!readonly) {
InsertionMarker.init();
InsertionBar.init();
Expand All @@ -71,6 +86,31 @@ var Page = {
});
}
});
},

refreshEvents: function() {
Event.addBehavior.reload();
},

removeIFrameForm: function(frameDoc) {
$$('iframe').each(function(element) {
if (Page.uploaderDocument(element) == frameDoc) {
$(element).up('.pageForm').remove();
throw $break;
}
});
},

uploaderDocument: function(iframe) {
var doc = iframe.contentDocument;
if (!doc) {
var wnd = iframe.contentWindow;
doc = wnd ? wnd.document : null;
}
if (!doc) {
return iframe.document
}
return doc;
}
}

Expand Down Expand Up @@ -124,6 +164,25 @@ var InsertionBar = {
this.revealForm();
},

insertTempForm: function(template) {
var el = null;
var before = Page.insert_before ? '1' : '0';
var slot = Page.insert_element ? Page.insert_element.readAttribute('slot') : '-1';
var content = template.replace(/\{POS\}/, 'position[slot]=' + slot + '&position[before]=' + before);

if (Page.insert_element == null) {
el = $('slots').insert({bottom: content}).next();
} else if (Page.insert_before) {
el = Page.insert_element.insert({before: content}).previous();
} else {
el = Page.insert_element.insert({after: content}).next();
}

this.hide();
el.auto_focus();
return el;
},

clearWidgetForm: function() {
if (!this.current_form)
return;
Expand Down
4 changes: 4 additions & 0 deletions app/models/divider.rb
Expand Up @@ -12,4 +12,8 @@ class Divider < RoleRecord
def clear_slot
page_slot.update_attributes(:page_id => nil)
end

def slot_view
'dividers/divider'
end
end
4 changes: 4 additions & 0 deletions app/models/note.rb
Expand Up @@ -15,6 +15,10 @@ def clear_slot
page_slot.update_attributes(:page_id => nil)
end

def slot_view
'notes/note'
end

def to_s
name
end
Expand Down
2 changes: 1 addition & 1 deletion app/models/page.rb
@@ -1,7 +1,7 @@
class Page < RoleRecord
has_many :notes, :order => 'position'
has_many :dividers, :order => 'position'
has_many :page_uploads, :order => 'position'
has_many :uploads, :order => 'position'

has_many :slots, :class_name => 'PageSlot', :order => 'position ASC'

Expand Down
11 changes: 11 additions & 0 deletions app/models/upload.rb
Expand Up @@ -5,6 +5,9 @@ class Upload < RoleRecord
belongs_to :user
belongs_to :comment
belongs_to :project
belongs_to :page
has_one :page_slot, :as => :rel_object
before_destroy :clear_slot

default_scope :order => 'created_at DESC'

Expand Down Expand Up @@ -36,6 +39,14 @@ def size
asset_file_size
end

def clear_slot
page_slot.update_attributes(:page_id => nil) if page and page_slot
end

def slot_view
'uploads/upload_slot'
end

def to_s
file_name
end
Expand Down
11 changes: 9 additions & 2 deletions app/views/dividers/create.js.rjs
@@ -1,7 +1,14 @@
if @insert_element.nil?
page.insert_html(:bottom, 'slots', :partial => 'pages/slot', :object => @divider.page_slot)
page.insert_html(:bottom, 'slots',
:partial => 'pages/slot',
:object => @divider.page_slot,
:locals => {:page => @page, :project => @current_project})
else
page.insert_html((@insert_before ? :before : :after), @insert_element, :partial => 'pages/slot', :object => @divider.page_slot)
page.insert_html((@insert_before ? :before : :after),
@insert_element,
:partial => 'pages/slot',
:object => @divider.page_slot,
:locals => {:page => @page, :project => @current_project})
end
page.hide_divider_form
page["divider_#{@divider.id}"].highlight
Expand Down
11 changes: 9 additions & 2 deletions app/views/notes/create.js.rjs
@@ -1,7 +1,14 @@
if @insert_element.nil?
page.insert_html(:bottom, 'slots', :partial => 'pages/slot', :object => @note.page_slot)
page.insert_html(:bottom, 'slots',
:partial => 'pages/slot',
:object => @note.page_slot,
:locals => {:page => @page, :project => @current_project})
else
page.insert_html((@insert_before ? :before : :after), @insert_element, :partial => 'pages/slot', :object => @note.page_slot)
page.insert_html((@insert_before ? :before : :after),
@insert_element,
:partial => 'pages/slot',
:object => @note.page_slot,
:locals => {:page => @page, :project => @current_project})
end
page.hide_note_form
page["note_#{@note.id}"].highlight
Expand Down
2 changes: 1 addition & 1 deletion app/views/pages/_buttons.haml
Expand Up @@ -2,5 +2,5 @@
= new_page_note_link(project,page,in_bar)
= new_page_divider_link(project,page,in_bar)
= #new_page_task_list_link(project,page,in_bar)
= #new_page_upload_link(project,page,in_bar)
= new_page_upload_link(project,page,in_bar)
.clear
4 changes: 1 addition & 3 deletions app/views/pages/_slot.haml
@@ -1,4 +1,2 @@
- cname = slot.rel_object.class.to_s.downcase

.pageSlot{:id => "page_slot_#{slot.id}", :slot => slot.id}
= render :partial => "#{cname.pluralize}/#{cname}", :locals => {:object => slot.rel_object}
= render :partial => "#{slot.rel_object.slot_view}", :locals => {:object => slot.rel_object, :page => page, :project => project}
4 changes: 2 additions & 2 deletions app/views/pages/_slot_fields.haml
@@ -1,2 +1,2 @@
%input{:id => "#{formName}Before", :type => 'hidden', :name => "position[before]", :value => '0'}/
%input{:id => "#{formName}Slot", :type => 'hidden', :name => "position[slot]", :value => '0'}/
%input{:id => formName.nil? ? nil : "#{formName}Before", :type => 'hidden', :name => "position[before]", :value => pos_before}/
%input{:id => formName.nil? ? nil : "#{formName}Slot", :type => 'hidden', :name => "position[slot]", :value => pos_slot}/
2 changes: 1 addition & 1 deletion app/views/pages/show.haml
Expand Up @@ -27,6 +27,6 @@
= new_divider_form(@current_project,@page)

#slots
= render :partial => 'slot', :collection => @page.slots
= render :partial => 'slot', :collection => @page.slots, :locals => {:page => @page, :project => @current_project}

.pageSlot.pageFooter#page_slot_footer{:slot => -1}
4 changes: 3 additions & 1 deletion app/views/uploads/_new.haml
@@ -1,7 +1,9 @@
#new_upload_iframe
= error_messages_for :upload
- form_for upload, :url => upload_form_url_for(comment), :html => { :multipart => true, :method => :post } do |f|
- form_for upload, :url => page.nil? ? upload_form_url_for(comment) : page_upload_form_url_for(page), :html => { :multipart => true, :method => :post } do |f|
= hidden_field_tag 'iframe', 'true'
- if page
= page_slot_fields(nil, @insert_id, @insert_before ? '1' : '0')
.file
= t('.select_a_file')
= f.file_field :asset, :size => 25, :id => 'upload_file'
Expand Down
7 changes: 7 additions & 0 deletions app/views/uploads/_page_upload.haml
@@ -0,0 +1,7 @@
.pageForm
.upload_area{}
= cancel_page_upload_link
%h3#upload_header
Upload
%iframe.upload_form#upload_form{:src => page_upload_url_for(@page) + "?iframe=true&{POS}", :scrolling => 'no', :frameborder => 0}
&nbsp;
7 changes: 7 additions & 0 deletions app/views/uploads/_slot_actions.haml
@@ -0,0 +1,7 @@
%div.actionContainer
%p.slotActions{ :style => "display: none" }
%span
= destroy_page_upload_link(upload.page, upload)
%p.slotActions.handle{ :style => "display: none;" }
%span
= drag_widget_handle(upload)

0 comments on commit 006a9dc

Please sign in to comment.