Install jquery-file-upload assets for rails.
This commit is contained in:
1
Gemfile
1
Gemfile
@@ -33,6 +33,7 @@ gem 'omniauth-facebook', '~> 4.0.0'
|
|||||||
gem 'omniauth-google-oauth2', '~> 0.4.0'
|
gem 'omniauth-google-oauth2', '~> 0.4.0'
|
||||||
gem 'omniauth-twitter', '~> 1.4.0'
|
gem 'omniauth-twitter', '~> 1.4.0'
|
||||||
gem 'paperclip', '~> 5.1.0'
|
gem 'paperclip', '~> 5.1.0'
|
||||||
|
gem 'jquery-fileupload-rails'
|
||||||
gem 'paranoia', '~> 2.3.1'
|
gem 'paranoia', '~> 2.3.1'
|
||||||
gem 'pg', '~> 0.20.0'
|
gem 'pg', '~> 0.20.0'
|
||||||
gem 'pg_search', '~> 2.0.1'
|
gem 'pg_search', '~> 2.0.1'
|
||||||
|
|||||||
@@ -200,6 +200,10 @@ GEM
|
|||||||
railties (>= 3.1, < 6.0)
|
railties (>= 3.1, < 6.0)
|
||||||
invisible_captcha (0.9.2)
|
invisible_captcha (0.9.2)
|
||||||
rails (>= 3.2.0)
|
rails (>= 3.2.0)
|
||||||
|
jquery-fileupload-rails (0.4.7)
|
||||||
|
actionpack (>= 3.1)
|
||||||
|
railties (>= 3.1)
|
||||||
|
sass (>= 3.2)
|
||||||
jquery-rails (4.3.1)
|
jquery-rails (4.3.1)
|
||||||
rails-dom-testing (>= 1, < 3)
|
rails-dom-testing (>= 1, < 3)
|
||||||
railties (>= 4.2.0)
|
railties (>= 4.2.0)
|
||||||
@@ -515,6 +519,7 @@ DEPENDENCIES
|
|||||||
i18n-tasks (~> 0.9.15)
|
i18n-tasks (~> 0.9.15)
|
||||||
initialjs-rails (~> 0.2.0.5)
|
initialjs-rails (~> 0.2.0.5)
|
||||||
invisible_captcha (~> 0.9.2)
|
invisible_captcha (~> 0.9.2)
|
||||||
|
jquery-fileupload-rails
|
||||||
jquery-rails (~> 4.3.1)
|
jquery-rails (~> 4.3.1)
|
||||||
jquery-ui-rails (~> 6.0.1)
|
jquery-ui-rails (~> 6.0.1)
|
||||||
kaminari (~> 1.0.1)
|
kaminari (~> 1.0.1)
|
||||||
@@ -559,4 +564,4 @@ DEPENDENCIES
|
|||||||
whenever (~> 0.9.7)
|
whenever (~> 0.9.7)
|
||||||
|
|
||||||
BUNDLED WITH
|
BUNDLED WITH
|
||||||
1.15.1
|
1.15.3
|
||||||
|
|||||||
@@ -14,6 +14,7 @@
|
|||||||
//= require jquery_ujs
|
//= require jquery_ujs
|
||||||
//= require jquery-ui/widgets/datepicker
|
//= require jquery-ui/widgets/datepicker
|
||||||
//= require jquery-ui/i18n/datepicker-es
|
//= require jquery-ui/i18n/datepicker-es
|
||||||
|
//= require jquery-fileupload/basic
|
||||||
//= require foundation
|
//= require foundation
|
||||||
//= require turbolinks
|
//= require turbolinks
|
||||||
//= require ckeditor/loader
|
//= require ckeditor/loader
|
||||||
@@ -59,6 +60,7 @@
|
|||||||
//= require legislation_annotatable
|
//= require legislation_annotatable
|
||||||
//= require watch_form_changes
|
//= require watch_form_changes
|
||||||
//= require followable
|
//= require followable
|
||||||
|
//= require documentable
|
||||||
//= require tree_navigator
|
//= require tree_navigator
|
||||||
//= require custom
|
//= require custom
|
||||||
|
|
||||||
@@ -94,6 +96,7 @@ var initialize_modules = function() {
|
|||||||
App.LegislationAnnotatable.initialize();
|
App.LegislationAnnotatable.initialize();
|
||||||
App.WatchFormChanges.initialize();
|
App.WatchFormChanges.initialize();
|
||||||
App.TreeNavigator.initialize();
|
App.TreeNavigator.initialize();
|
||||||
|
App.Documentable.initialize();
|
||||||
};
|
};
|
||||||
|
|
||||||
$(function(){
|
$(function(){
|
||||||
|
|||||||
64
app/assets/javascripts/documentable.js.coffee
Normal file
64
app/assets/javascripts/documentable.js.coffee
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
App.Documentable =
|
||||||
|
|
||||||
|
initialize: ->
|
||||||
|
$('input#document_attachment[type=file]').fileupload
|
||||||
|
|
||||||
|
add: (e, data) ->
|
||||||
|
data.progressBar = $('<div class="progress-bar"><div class="loading-bar uploading"></div></div>').insertAfter('#progress-bar')
|
||||||
|
options =
|
||||||
|
extension: data.files[0].name.match(/(\.\w+)?$/)[0]
|
||||||
|
_: Date.now()
|
||||||
|
direct_upload_url = $(this).closest('form').data('direct-upload-url')
|
||||||
|
console.log direct_upload_url
|
||||||
|
|
||||||
|
fileData = new FormData();
|
||||||
|
fileData.append('file', data.fileInput[0].files[0]);
|
||||||
|
|
||||||
|
console.log direct_upload_url
|
||||||
|
|
||||||
|
$.getJSON direct_upload_url, options, (result) ->
|
||||||
|
data.formData = result['fields']
|
||||||
|
data.url = result['url']
|
||||||
|
data.paramName = 'file'
|
||||||
|
data.submit()
|
||||||
|
return
|
||||||
|
|
||||||
|
# $.ajax
|
||||||
|
# url: direct_upload_url
|
||||||
|
# type: 'POST'
|
||||||
|
# data: fileData
|
||||||
|
# cache: false
|
||||||
|
# contentType: false
|
||||||
|
# processData: false
|
||||||
|
# xhr: ->
|
||||||
|
# console.log 'Progress init'
|
||||||
|
# myXhr = $.ajaxSettings.xhr()
|
||||||
|
# if myXhr.upload
|
||||||
|
# # For handling the progress of the upload
|
||||||
|
# myXhr.upload.addEventListener 'progress', ((e) ->
|
||||||
|
# console.log 'progress listener called'
|
||||||
|
# ), false
|
||||||
|
#
|
||||||
|
# myXhr.upload.addEventListener 'complete', ((e) ->
|
||||||
|
# console.log 'complete listener called'
|
||||||
|
# return
|
||||||
|
# ), false
|
||||||
|
# myXhr
|
||||||
|
|
||||||
|
progress: (e, data) ->
|
||||||
|
progress = parseInt(data.loaded / data.total * 100, 10)
|
||||||
|
$('.loading-bar').css 'width', progress + '%'
|
||||||
|
return
|
||||||
|
|
||||||
|
done: (e, data) ->
|
||||||
|
$('.loading-bar').removeClass 'uploading'
|
||||||
|
$('.loading-bar').addClass 'complete'
|
||||||
|
image =
|
||||||
|
id: data.formData.key
|
||||||
|
storage: 'cache'
|
||||||
|
metadata:
|
||||||
|
size: data.files[0].size
|
||||||
|
filename: data.files[0].name.match(/[^\/\\]*$/)[0]
|
||||||
|
mime_type: data.files[0].type
|
||||||
|
$('#cached_attachment_data').val JSON.stringify(image)
|
||||||
|
return
|
||||||
@@ -15,3 +15,4 @@
|
|||||||
@import 'annotator_overrides';
|
@import 'annotator_overrides';
|
||||||
@import 'jquery-ui/datepicker';
|
@import 'jquery-ui/datepicker';
|
||||||
@import 'datepicker_overrides';
|
@import 'datepicker_overrides';
|
||||||
|
@import 'documentable';
|
||||||
|
|||||||
29
app/assets/stylesheets/documentable.scss
Normal file
29
app/assets/stylesheets/documentable.scss
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
.progress-bar {
|
||||||
|
background-color: transparent;
|
||||||
|
height: 5px;
|
||||||
|
width: 100%;
|
||||||
|
z-index: 666000555;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loading-bar {
|
||||||
|
height: 5px;
|
||||||
|
min-width: 10px;
|
||||||
|
z-index: 666000666;
|
||||||
|
-webkit-transition:width 500ms ease-out, height 500ms ease-out;
|
||||||
|
-moz-transition:width 500ms ease-out, height 500ms ease-out;
|
||||||
|
-o-transition:width 500ms ease-out, height 500ms ease-out;
|
||||||
|
transition:width 500ms ease-out, height 500ms ease-out;
|
||||||
|
&.uploading{
|
||||||
|
background-color: #f00;
|
||||||
|
}
|
||||||
|
&.complete{
|
||||||
|
background-color: #0f0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.loading-bar.no-transition {
|
||||||
|
-webkit-transition:none;
|
||||||
|
-moz-transition:none;
|
||||||
|
-o-transition:none;
|
||||||
|
transition:none;
|
||||||
|
}
|
||||||
@@ -3,7 +3,13 @@ class DocumentsController < ApplicationController
|
|||||||
before_filter :find_documentable, except: :destroy
|
before_filter :find_documentable, except: :destroy
|
||||||
before_filter :prepare_new_document, only: :new
|
before_filter :prepare_new_document, only: :new
|
||||||
before_filter :prepare_document_for_creation, only: :create
|
before_filter :prepare_document_for_creation, only: :create
|
||||||
load_and_authorize_resource
|
|
||||||
|
before_filter :validate_upload, only: :upload
|
||||||
|
load_and_authorize_resource :except => [:upload]
|
||||||
|
skip_authorization_check :only => [:upload]
|
||||||
|
|
||||||
|
def preload
|
||||||
|
end
|
||||||
|
|
||||||
def new
|
def new
|
||||||
end
|
end
|
||||||
@@ -27,6 +33,19 @@ class DocumentsController < ApplicationController
|
|||||||
redirect_to params[:from]
|
redirect_to params[:from]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def upload
|
||||||
|
document = Document.new(documentable: @documentable, attachment: params[:file].tempfile, title: "faketitle", user: current_user )
|
||||||
|
debugger
|
||||||
|
# We only are intested in attachment validators. We set some fake data to get attachment errors only
|
||||||
|
if document.valid?
|
||||||
|
# TODO: Store file on tmp cache
|
||||||
|
msg = { status: 200, msg: "OK" }
|
||||||
|
else
|
||||||
|
msg = { status: 422, msg: document.errors[:attachment].join(', ') }
|
||||||
|
end
|
||||||
|
render :json => msg
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def find_documentable
|
def find_documentable
|
||||||
@@ -47,4 +66,8 @@ class DocumentsController < ApplicationController
|
|||||||
params.require(:document).permit(:title, :documentable_type, :documentable_id, :attachment)
|
params.require(:document).permit(:title, :documentable_type, :documentable_id, :attachment)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def validate_upload
|
||||||
|
if @documentable.present?
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -4,7 +4,8 @@
|
|||||||
documentable_id: @document.documentable_id,
|
documentable_id: @document.documentable_id,
|
||||||
from: params[:from]
|
from: params[:from]
|
||||||
),
|
),
|
||||||
html: { multipart: true } do |f| %>
|
html: { multipart: true, class: "documentable"},
|
||||||
|
data: { direct_upload_url: upload_documents_url(documentable_type: @document.documentable_type, documentable_id: @document.documentable_id) } do |f| %>
|
||||||
|
|
||||||
<%= render 'shared/errors', resource: @document %>
|
<%= render 'shared/errors', resource: @document %>
|
||||||
|
|
||||||
@@ -15,14 +16,13 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="small-12 column">
|
<div class="small-12 column">
|
||||||
<div class="file-name">
|
|
||||||
<%= f.file_field :attachment,
|
<%= f.file_field :attachment,
|
||||||
accept: accepted_content_types_extensions(@document.documentable),
|
accept: accepted_content_types_extensions(@document.documentable),
|
||||||
label: false, class: 'show-for-sr' %>
|
label: false, class: 'show-for-sr' %>
|
||||||
<%= f.label :attachment, t("documents.form.attachment_label"), class: 'button hollow' %>
|
<%= f.label :attachment, t("documents.form.attachment_label"), class: 'button hollow' %>
|
||||||
|
<div id="progress-bar" class="progress-bar-placeholder"></div>
|
||||||
<p><%= document_attachment_file_name(@document) %></p>
|
<p><%= document_attachment_file_name(@document) %></p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
|
|
||||||
<% if @document.errors.has_key?(:attachment) %>
|
<% if @document.errors.has_key?(:attachment) %>
|
||||||
<div class="small-12 column source-option-file">
|
<div class="small-12 column source-option-file">
|
||||||
|
|||||||
@@ -95,7 +95,10 @@ Rails.application.routes.draw do
|
|||||||
|
|
||||||
resources :follows, only: [:create, :destroy]
|
resources :follows, only: [:create, :destroy]
|
||||||
|
|
||||||
resources :documents, only: [:new, :create, :destroy]
|
resources :documents, only: [:new, :create, :destroy] do
|
||||||
|
collection { post :upload, format: :json}
|
||||||
|
collection { post :progress, format: :json}
|
||||||
|
end
|
||||||
|
|
||||||
resources :stats, only: [:index]
|
resources :stats, only: [:index]
|
||||||
|
|
||||||
|
|||||||
@@ -936,7 +936,7 @@ ActiveRecord::Schema.define(version: 20170720092638) do
|
|||||||
t.boolean "email_digest", default: true
|
t.boolean "email_digest", default: true
|
||||||
t.boolean "email_on_direct_message", default: true
|
t.boolean "email_on_direct_message", default: true
|
||||||
t.boolean "official_position_badge", default: false
|
t.boolean "official_position_badge", default: false
|
||||||
t.datetime "password_changed_at", default: '2017-07-27 22:09:12', null: false
|
t.datetime "password_changed_at", default: '2017-07-31 15:04:53', null: false
|
||||||
t.boolean "created_from_signature", default: false
|
t.boolean "created_from_signature", default: false
|
||||||
t.integer "failed_email_digests_count", default: 0
|
t.integer "failed_email_digests_count", default: 0
|
||||||
t.text "former_users_data_log", default: ""
|
t.text "former_users_data_log", default: ""
|
||||||
|
|||||||
Reference in New Issue
Block a user