diff --git a/app/assets/javascripts/admin/filemanager.js b/app/assets/javascripts/admin/filemanager.js new file mode 100644 index 0000000..1e2e9e8 --- /dev/null +++ b/app/assets/javascripts/admin/filemanager.js @@ -0,0 +1,141 @@ +!function ($) { + $.fn.checkListLength = function (param){ + _defaultSettings = { + onlyOne: null, + }; + _set = $.extend(_defaultSettings, param); + $this = this; + $li = this.children('li'); + $dropzone = $('#dropzone'); + if(($li.length - _set.onlyOne) == 0) { + $('#dropzone').fadeIn(300); + } else { + $('#dropzone').fadeOut(300); + }; + $('#file-list').nanoScroller({ scrollTop: 0, iOSNativeScrolling: true }); + } +}(window.jQuery); +$(function () { + 'use strict'; + // Initialize the jQuery File Upload widget: + $('#fileupload').fileupload({ + maxFileSize: 5000000, + acceptFileTypes: /(\.|\/)(gif|jpe?g|png|pdf|doc|docx|ppt|pptx|xls|xlsx)$/i, + dropZone: $('#dropzone'), + headers:{ + 'X-CSRF-Token': $('meta[name="csrf-token"]').attr("content") + } + }).bind('fileuploadstop', function (e, data) { + window.location.reload(); + }); +}); +$(document).ready(function(){ + var insertBtn = $("#insert_btn"), + deleteBtn = $("#delete_btn"), + url = null; + + var showPreview = function(elem){ + var type = $("#ext_" + elem.val()).val(), + imgexp = new RegExp(/(\.|\/)(gif|jpe?g|png)$/i), + otherexp = new RegExp(/(\.|\/)(pdf|doc|docx|ppt|pptx|xls|xlsx)$/i) + img = $(""), + preview = $( ".preview-area" ); + preview.text("Preview is loading..."); + if( imgexp.test(type) ){ + var url = $("#url_" + elem.val()).val(); + img.attr("src",url).load(function(){ + var ratio = this.width / this.height, + targetWidth = targetHeight = 200; + if( ratio < 1 ){ + targetWidth = targetHeight * ratio; + }else{ + targetHeight = targetWidth / ratio; + } + img.height(targetHeight).width(targetWidth); + preview.html(img); + }) + }else if( otherexp.test(type) ) { + var t = type.replace(".",""), + url = "/assets/ft-icons/" + t + "/" + t + "-128_32.png"; + img.attr('src', url).load(function(){ + preview.html(img); + }); + }else{ + preview.html("Preview not available."); + } + } + + $("#asset_sort_list").on(clickEvent,"input[type=checkbox]",function(){ + if($("#asset_sort_list input[type=checkbox]:checked").length == 1){ + url = window.location.protocol + "//" + window.location.host + $("#url_" + $("input[type=checkbox]:checked").val()).val(); + insertBtn.show(); + showPreview($("input[type=checkbox]:checked")) + }else{ + insertBtn.hide(); + url = null; + $( ".preview-area" ).empty(); + } + if($("#asset_sort_list input[type=checkbox]:checked").length) + deleteBtn.show(); + else + deleteBtn.hide(); + }) + insertBtn.bind(clickEvent,function(){ + var alt_text = $("#"+language+"_desc_"+$("input[type=checkbox]:checked").val()).val(); + alt_text = (alt_text ? alt_text : "This is an image"); + if(url){ + window.opener.CKEDITOR.tools.callFunction( funcNum, url, function() { + var element, + dialog = this.getDialog(); + if ( dialog.getName() == 'image' ) { + element = dialog.getContentElement( 'info', 'txtAlt' ); + if ( element ) + element.setValue( alt_text ); + } + }); + window.close(); + } + }) + deleteBtn.bind( clickEvent,function(){ + var items_to_delete = [], + type = getUrlParam("type"); + $("input[type=checkbox]:checked").each(function(){ + items_to_delete.push($(this).val()); + }) + $.post("/admin/assets/delete_files",{"files":items_to_delete,"type":type},function(){ + deleteBtn.hide(); + }) + }) + var currentEdit = null; + $(document).on("ajax:success","form[data-remote=true]",function(evt, data, xhr){ + if(currentEdit){ + currentEdit.replaceWith($(data)); + $("#editform").modal("hide"); + } + }) + + $("#asset_sort_list").on(clickEvent,".editform",function(){ + currentEdit = $(this).parent().parent(); + $.get($(this).attr("href"),function(data){ + $("#editform").html(data).modal("show"); + }) + return false; + }) + + $("#editform").on("hidden",function(){ + currentEdit = null; + }) + + function getUrlParam( paramName ) { + var reParam = new RegExp( '(?:[\?&]|&)' + paramName + '=([^&]+)', 'i' ) ; + var match = window.location.search.match(reParam) ; + + return ( match && match.length > 1 ) ? match[ 1 ] : null ; + } + var funcNum = getUrlParam( 'CKEditorFuncNum' ), + t = getUrlParam('CKEditor').split("_"), + language = t[t.length-1]; + + language = (language == "tw" ? "zh_tw" : language); + +}) \ No newline at end of file diff --git a/app/assets/javascripts/ckeditor/config.js.erb b/app/assets/javascripts/ckeditor/config.js.erb index 1fe6b38..3c23e9e 100644 --- a/app/assets/javascripts/ckeditor/config.js.erb +++ b/app/assets/javascripts/ckeditor/config.js.erb @@ -25,10 +25,9 @@ CKEDITOR.editorConfig = function( config ) { // config.filebrowserBrowseUrl = '/browser/browse.php'; // config.filebrowserImageBrowseUrl = '/browser/browse.php?type=Images'; // config.filebrowserUploadUrl = '/uploader/upload.php'; - - config.filebrowserBrowseUrl = "<%= Rails.application.routes.url_helpers.admin_assets_path(:module_app_id=>ModuleApp.where(:key=>'asset').first.id) rescue '' %>"; - config.filebrowserImageBrowseUrl = "<%= Rails.application.routes.url_helpers.admin_assets_path(:type=>'image',:module_app_id=>ModuleApp.where(:key=>'asset').first.id) rescue '' %>"; - // config.filebrowserUploadUrl = "<%#= Rails.application.routes.url_helpers.file_upload_admin_assets_path %>"; + + config.filebrowserBrowseUrl = "<%= Rails.application.routes.url_helpers.admin_assets_path %>"; + config.filebrowserImageBrowseUrl = "<%= Rails.application.routes.url_helpers.admin_assets_path %>"; // config.contentsCss = '/orbit_4.0.1/assets/javascripts/lib/ckeditor/plugins/stylesheetparser/samples/assets/sample.css'; diff --git a/app/assets/stylesheets/lib/filemanager.css b/app/assets/stylesheets/lib/filemanager.css index 1240e4d..a3bd1c2 100644 --- a/app/assets/stylesheets/lib/filemanager.css +++ b/app/assets/stylesheets/lib/filemanager.css @@ -2,7 +2,7 @@ body > section { padding: 20px; } #panel_l { - width: 80%; + width: 75%; } #panel_l .control-label { margin-right: 10px; @@ -11,7 +11,7 @@ body > section { margin-left: 0; } #panel_r { - width: 18%; + width: 23%; padding-left: 2%; } #panel_r .control-label { @@ -30,7 +30,7 @@ body > section { width: auto; } #filemanager .preview-area { - margin-bottom: 0; + margin-bottom: 40px; text-align: center; } #editform .edit_asset { diff --git a/app/controllers/admin/assets_controller.rb b/app/controllers/admin/assets_controller.rb new file mode 100644 index 0000000..7b3f632 --- /dev/null +++ b/app/controllers/admin/assets_controller.rb @@ -0,0 +1,66 @@ +class Admin::AssetsController < OrbitAdminController + + def index + @assets = current_user.assets + @assets = @assets.page(params[:page]).per(10) + render :layout => "assets" + end + + def new + + end + + def create + + end + + def edit + @asset = Asset.find(params[:id]) + render layout: false + end + + def update + @asset = Asset.find(params[:id]) + @asset.update_attributes(asset_params) + if asset_params['data'].blank? + render layout: false + else + redirect_to admin_assets_path + end + end + + def destroy + + end + + def delete + + end + + def delete_files + Asset.where(:id.in=>params[:files]).destroy + @assets = current_user.assets.page(params[:page]).per(10) + end + + def file_upload + @files = params['files'] + a = Array.new + @files.each do |file| + @asset = current_user.assets.new + @asset.data = file + @asset.title_translations = {:en => file.original_filename, :zh_tw => file.original_filename} + @asset.save! + a << {"url"=>@asset.data.url} + end + render :json=>{"files"=>a}.to_json + end + + def file_select + + end + + def asset_params + params.require(:asset).permit! unless params[:asset].blank? + end + +end \ No newline at end of file diff --git a/app/helpers/orbit_backend_helper.rb b/app/helpers/orbit_backend_helper.rb index 66ad114..a73884b 100644 --- a/app/helpers/orbit_backend_helper.rb +++ b/app/helpers/orbit_backend_helper.rb @@ -118,7 +118,7 @@ module OrbitBackendHelper visits = Impression.where( created_at: { '$gte' => Time.now.beginning_of_day-i.days, '$lte' => Time.now.end_of_day-i.days} - ).count + ).distinct(:request_hash).count result.push([ Time.now.beginning_of_day-i.days, visits]) end diff --git a/app/models/asset.rb b/app/models/asset.rb new file mode 100644 index 0000000..2a1c18e --- /dev/null +++ b/app/models/asset.rb @@ -0,0 +1,24 @@ +class Asset + include Mongoid::Document + include Mongoid::Timestamps + + mount_uploader :data, AssetUploader + + field :filename + field :description, localize: true + field :title, localize: true + + delegate :url, :current_path, :size, :content_type, :filename, :to => :data + + belongs_to :user + + validates_presence_of :data + + def content_type + data.file.content_type + end + + def file_size + data.file.size + end +end diff --git a/app/models/ckeditor/asset.rb b/app/models/ckeditor/asset.rb deleted file mode 100644 index 74f193e..0000000 --- a/app/models/ckeditor/asset.rb +++ /dev/null @@ -1,7 +0,0 @@ -class Ckeditor::Asset - include Ckeditor::Orm::Mongoid::AssetBase - - delegate :url, :current_path, :size, :content_type, :filename, :to => :data - - validates_presence_of :data -end diff --git a/app/models/ckeditor/attachment_file.rb b/app/models/ckeditor/attachment_file.rb deleted file mode 100644 index 43a3872..0000000 --- a/app/models/ckeditor/attachment_file.rb +++ /dev/null @@ -1,7 +0,0 @@ -class Ckeditor::AttachmentFile < Ckeditor::Asset - mount_uploader :data, CkeditorAttachmentFileUploader, :mount_on => :data_file_name - - def url_thumb - @url_thumb ||= Ckeditor::Utils.filethumb(filename) - end -end diff --git a/app/models/ckeditor/picture.rb b/app/models/ckeditor/picture.rb deleted file mode 100644 index 74f6da4..0000000 --- a/app/models/ckeditor/picture.rb +++ /dev/null @@ -1,7 +0,0 @@ -class Ckeditor::Picture < Ckeditor::Asset - mount_uploader :data, CkeditorPictureUploader, :mount_on => :data_file_name - - def url_content - url(:content) - end -end diff --git a/app/models/user.rb b/app/models/user.rb index 8ed34c4..0a8e9d5 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -9,6 +9,7 @@ class User field :password_digest, type: String field :confirmation_token, type: String field :reset_token, type: String + has_many :assets index({ confirmation_token: 1}, { unique: true }) diff --git a/app/views/admin/assets/_asset.html.erb b/app/views/admin/assets/_asset.html.erb new file mode 100644 index 0000000..36f1819 --- /dev/null +++ b/app/views/admin/assets/_asset.html.erb @@ -0,0 +1,17 @@ + + + <%= check_box_tag 'files[]', asset.id, false, :class => "checkbox_in_list" %> + + <% @current_site.in_use_locales.each_with_index do |locale, i| %> + + + <% end %> + + + <%= asset.title_translations[I18n.locale.to_s] rescue nil %> + <%= number_to_human_size(asset.data.file.size) rescue nil %> + <%= asset.description rescue nil %> + + <%= t(:edit) %> + + \ No newline at end of file diff --git a/app/views/admin/assets/delete_files.js.erb b/app/views/admin/assets/delete_files.js.erb new file mode 100644 index 0000000..2be7f19 --- /dev/null +++ b/app/views/admin/assets/delete_files.js.erb @@ -0,0 +1,2 @@ +$("#tbody_assets").html("<%= j render :partial => 'asset', :collection => @assets %>"); +$("#asset_pagination").html("<%= j paginate @assets, :params => {:direction => params[:direction], :sort => params[:sort], :filter => @filter, :new_filter => nil} %>"); \ No newline at end of file diff --git a/app/views/admin/assets/edit.html.erb b/app/views/admin/assets/edit.html.erb new file mode 100644 index 0000000..8f7fbef --- /dev/null +++ b/app/views/admin/assets/edit.html.erb @@ -0,0 +1,55 @@ + +<%= form_for @asset, :url => admin_asset_path(@asset), :remote => true do |f| %> + <%= token_tag form_authenticity_token %> + + +<% end %> \ No newline at end of file diff --git a/app/views/admin/assets/index.html.erb b/app/views/admin/assets/index.html.erb new file mode 100644 index 0000000..e63423e --- /dev/null +++ b/app/views/admin/assets/index.html.erb @@ -0,0 +1,400 @@ + +<%= stylesheet_link_tag "lib/filemanager"%> +<%= stylesheet_link_tag "lib/main-forms"%> +
+
+ +
+
+
+
+
+
+ +
+ +
+
+
+ + + + + + + + + + + + <%= render :partial => 'asset', :collection => @assets %> + +
<%= t(:filename) %><%= t(:size) %><%= t(:description) %>
+ +
+
+
+ +
+
+
+
+
+
+ + +
+
+
+
+
+ + +
+ + +
+ +
+
+
+ +
+
+
+ +
+
+ <%= t(:drop_the_files_here) %> +
+ +
+ +
+
+ +
+
+
+
+
+
+
+
+ + +<% content_for :page_specific_javascript do %> + <%= javascript_include_tag "file-upload/vendor/jquery.ui.widget.js" %> + <%= javascript_include_tag "file-upload/tmpl.min.js" %> + <%= javascript_include_tag "file-upload/load-image.min.js" %> + <%= javascript_include_tag "file-upload/canvas-to-blob.min.js" %> + <%= javascript_include_tag "file-upload/jquery.iframe-transport.js" %> + <%= javascript_include_tag "file-upload/jquery.fileupload.js" %> + <%= javascript_include_tag "file-upload/jquery.fileupload-fp.js" %> + <%= javascript_include_tag "file-upload/jquery.fileupload-ui.js" %> + <%= javascript_include_tag "file-upload/drop-zone.js" %> + <%= javascript_include_tag "admin/filemanager.js" %> +<% end %> + + + + \ No newline at end of file diff --git a/app/views/admin/assets/update.html.erb b/app/views/admin/assets/update.html.erb new file mode 100644 index 0000000..9154b69 --- /dev/null +++ b/app/views/admin/assets/update.html.erb @@ -0,0 +1 @@ +<%= render :partial => 'asset', :object => @asset %> \ No newline at end of file diff --git a/app/views/layouts/assets.html.erb b/app/views/layouts/assets.html.erb new file mode 100644 index 0000000..dc6447f --- /dev/null +++ b/app/views/layouts/assets.html.erb @@ -0,0 +1,18 @@ + + + + <%= @title %> + <%= render 'shared/google_font' %> + <%= stylesheet_link_tag "back_end" %> + <%= yield :page_specific_css %> + <%= render 'shared/ie_html5_fix' %> + <%= javascript_include_tag "back_end" %> + <%= yield :page_specific_javascript %> + <%= csrf_meta_tag %> + + +
+ <%= yield %> +
+ + diff --git a/config/application.rb b/config/application.rb index 6a504a8..b69975d 100644 --- a/config/application.rb +++ b/config/application.rb @@ -28,9 +28,6 @@ module Orbit config.assets.paths << "#{path}/assets/fonts" end - # Ckeditor - config.autoload_paths += %W(#{config.root}/app/models/ckeditor) - # tell the I18n library where to find your translations I18n.load_path += Dir[Rails.root.join('lib', 'locale', '*.{rb,yml}')] diff --git a/config/locales/en.yml b/config/locales/en.yml index 06720a0..31b089a 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -231,6 +231,7 @@ en: type: File type upload: File upload file_: File + filename: File name file_type: File Type followers: Followers forgot_password: Forgot your password? diff --git a/config/locales/zh_tw.yml b/config/locales/zh_tw.yml index c9656af..249d337 100644 --- a/config/locales/zh_tw.yml +++ b/config/locales/zh_tw.yml @@ -83,6 +83,17 @@ zh_tw: all_content: 所有內容 quantity: 數量 hits: 點擊次數 + insert: 插入 + search_files: 搜尋檔案 + filename: 檔案名稱 + filemanager: 檔案管理員 + upload: 上傳 + start_upload: 開始上傳 + cancel_upload: 取消上傳 + add_files: 新增檔案 + size: 大小 + edit_file: 編輯檔案 + site: system_preference: 系統狀態 diff --git a/config/routes.rb b/config/routes.rb index 72aaf50..4eb3a97 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -83,6 +83,14 @@ Orbit::Application.routes.draw do end end + resources :assets do + collection do + post 'file_upload' + get 'delete' + post 'delete_files' + end + end + get 'authorizations(/:module(/:type(/:id)))' => 'authorizations#index', :as => :authorizations resources :authorizations