groups multifile added and show page working.

This commit is contained in:
Harry Bomrah 2015-04-01 01:02:01 +08:00
parent 60bb2cac1e
commit 15fec35e3f
12 changed files with 2251 additions and 40 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -0,0 +1,388 @@
/*
* The MIT License
* Copyright (c) 2012 Matias Meno <m@tias.me>
*/
@-webkit-keyframes passing-through {
0% {
opacity: 0;
-webkit-transform: translateY(40px);
-moz-transform: translateY(40px);
-ms-transform: translateY(40px);
-o-transform: translateY(40px);
transform: translateY(40px); }
30%, 70% {
opacity: 1;
-webkit-transform: translateY(0px);
-moz-transform: translateY(0px);
-ms-transform: translateY(0px);
-o-transform: translateY(0px);
transform: translateY(0px); }
100% {
opacity: 0;
-webkit-transform: translateY(-40px);
-moz-transform: translateY(-40px);
-ms-transform: translateY(-40px);
-o-transform: translateY(-40px);
transform: translateY(-40px); } }
@-moz-keyframes passing-through {
0% {
opacity: 0;
-webkit-transform: translateY(40px);
-moz-transform: translateY(40px);
-ms-transform: translateY(40px);
-o-transform: translateY(40px);
transform: translateY(40px); }
30%, 70% {
opacity: 1;
-webkit-transform: translateY(0px);
-moz-transform: translateY(0px);
-ms-transform: translateY(0px);
-o-transform: translateY(0px);
transform: translateY(0px); }
100% {
opacity: 0;
-webkit-transform: translateY(-40px);
-moz-transform: translateY(-40px);
-ms-transform: translateY(-40px);
-o-transform: translateY(-40px);
transform: translateY(-40px); } }
@keyframes passing-through {
0% {
opacity: 0;
-webkit-transform: translateY(40px);
-moz-transform: translateY(40px);
-ms-transform: translateY(40px);
-o-transform: translateY(40px);
transform: translateY(40px); }
30%, 70% {
opacity: 1;
-webkit-transform: translateY(0px);
-moz-transform: translateY(0px);
-ms-transform: translateY(0px);
-o-transform: translateY(0px);
transform: translateY(0px); }
100% {
opacity: 0;
-webkit-transform: translateY(-40px);
-moz-transform: translateY(-40px);
-ms-transform: translateY(-40px);
-o-transform: translateY(-40px);
transform: translateY(-40px); } }
@-webkit-keyframes slide-in {
0% {
opacity: 0;
-webkit-transform: translateY(40px);
-moz-transform: translateY(40px);
-ms-transform: translateY(40px);
-o-transform: translateY(40px);
transform: translateY(40px); }
30% {
opacity: 1;
-webkit-transform: translateY(0px);
-moz-transform: translateY(0px);
-ms-transform: translateY(0px);
-o-transform: translateY(0px);
transform: translateY(0px); } }
@-moz-keyframes slide-in {
0% {
opacity: 0;
-webkit-transform: translateY(40px);
-moz-transform: translateY(40px);
-ms-transform: translateY(40px);
-o-transform: translateY(40px);
transform: translateY(40px); }
30% {
opacity: 1;
-webkit-transform: translateY(0px);
-moz-transform: translateY(0px);
-ms-transform: translateY(0px);
-o-transform: translateY(0px);
transform: translateY(0px); } }
@keyframes slide-in {
0% {
opacity: 0;
-webkit-transform: translateY(40px);
-moz-transform: translateY(40px);
-ms-transform: translateY(40px);
-o-transform: translateY(40px);
transform: translateY(40px); }
30% {
opacity: 1;
-webkit-transform: translateY(0px);
-moz-transform: translateY(0px);
-ms-transform: translateY(0px);
-o-transform: translateY(0px);
transform: translateY(0px); } }
@-webkit-keyframes pulse {
0% {
-webkit-transform: scale(1);
-moz-transform: scale(1);
-ms-transform: scale(1);
-o-transform: scale(1);
transform: scale(1); }
10% {
-webkit-transform: scale(1.1);
-moz-transform: scale(1.1);
-ms-transform: scale(1.1);
-o-transform: scale(1.1);
transform: scale(1.1); }
20% {
-webkit-transform: scale(1);
-moz-transform: scale(1);
-ms-transform: scale(1);
-o-transform: scale(1);
transform: scale(1); } }
@-moz-keyframes pulse {
0% {
-webkit-transform: scale(1);
-moz-transform: scale(1);
-ms-transform: scale(1);
-o-transform: scale(1);
transform: scale(1); }
10% {
-webkit-transform: scale(1.1);
-moz-transform: scale(1.1);
-ms-transform: scale(1.1);
-o-transform: scale(1.1);
transform: scale(1.1); }
20% {
-webkit-transform: scale(1);
-moz-transform: scale(1);
-ms-transform: scale(1);
-o-transform: scale(1);
transform: scale(1); } }
@keyframes pulse {
0% {
-webkit-transform: scale(1);
-moz-transform: scale(1);
-ms-transform: scale(1);
-o-transform: scale(1);
transform: scale(1); }
10% {
-webkit-transform: scale(1.1);
-moz-transform: scale(1.1);
-ms-transform: scale(1.1);
-o-transform: scale(1.1);
transform: scale(1.1); }
20% {
-webkit-transform: scale(1);
-moz-transform: scale(1);
-ms-transform: scale(1);
-o-transform: scale(1);
transform: scale(1); } }
.dropzone, .dropzone * {
box-sizing: border-box; }
.dropzone {
min-height: 150px;
border: 2px solid rgba(0, 0, 0, 0.3);
background: white;
padding: 20px 20px; }
.dropzone.dz-clickable {
cursor: pointer; }
.dropzone.dz-clickable * {
cursor: default; }
.dropzone.dz-clickable .dz-message, .dropzone.dz-clickable .dz-message * {
cursor: pointer; }
.dropzone.dz-started .dz-message {
display: none; }
.dropzone.dz-drag-hover {
border-style: solid; }
.dropzone.dz-drag-hover .dz-message {
opacity: 0.5; }
.dropzone .dz-message {
text-align: center;
margin: 2em 0; }
.dropzone .dz-preview {
position: relative;
display: inline-block;
vertical-align: top;
margin: 16px;
min-height: 100px; }
.dropzone .dz-preview:hover {
z-index: 1000; }
.dropzone .dz-preview:hover .dz-details {
opacity: 1; }
.dropzone .dz-preview.dz-file-preview .dz-image {
border-radius: 20px;
background: #999;
background: linear-gradient(to bottom, #eee, #ddd); }
.dropzone .dz-preview.dz-file-preview .dz-details {
opacity: 1; }
.dropzone .dz-preview.dz-image-preview {
background: white; }
.dropzone .dz-preview.dz-image-preview .dz-details {
-webkit-transition: opacity 0.2s linear;
-moz-transition: opacity 0.2s linear;
-ms-transition: opacity 0.2s linear;
-o-transition: opacity 0.2s linear;
transition: opacity 0.2s linear; }
.dropzone .dz-preview .dz-remove {
font-size: 14px;
text-align: center;
display: block;
cursor: pointer;
border: none; }
.dropzone .dz-preview .dz-remove:hover {
text-decoration: underline; }
.dropzone .dz-preview:hover .dz-details {
opacity: 1; }
.dropzone .dz-preview .dz-details {
z-index: 20;
position: absolute;
top: 0;
left: 0;
opacity: 0;
font-size: 13px;
min-width: 100%;
max-width: 100%;
padding: 2em 1em;
text-align: center;
color: rgba(0, 0, 0, 0.9);
line-height: 150%; }
.dropzone .dz-preview .dz-details .dz-size {
margin-bottom: 1em;
font-size: 16px; }
.dropzone .dz-preview .dz-details .dz-filename {
white-space: nowrap; }
.dropzone .dz-preview .dz-details .dz-filename:hover span {
border: 1px solid rgba(200, 200, 200, 0.8);
background-color: rgba(255, 255, 255, 0.8); }
.dropzone .dz-preview .dz-details .dz-filename:not(:hover) {
overflow: hidden;
text-overflow: ellipsis; }
.dropzone .dz-preview .dz-details .dz-filename:not(:hover) span {
border: 1px solid transparent; }
.dropzone .dz-preview .dz-details .dz-filename span, .dropzone .dz-preview .dz-details .dz-size span {
background-color: rgba(255, 255, 255, 0.4);
padding: 0 0.4em;
border-radius: 3px; }
.dropzone .dz-preview:hover .dz-image img {
-webkit-transform: scale(1.05, 1.05);
-moz-transform: scale(1.05, 1.05);
-ms-transform: scale(1.05, 1.05);
-o-transform: scale(1.05, 1.05);
transform: scale(1.05, 1.05);
-webkit-filter: blur(8px);
filter: blur(8px); }
.dropzone .dz-preview .dz-image {
border-radius: 20px;
overflow: hidden;
width: 120px;
height: 120px;
position: relative;
display: block;
z-index: 10; }
.dropzone .dz-preview .dz-image img {
display: block; }
.dropzone .dz-preview.dz-success .dz-success-mark {
-webkit-animation: passing-through 3s cubic-bezier(0.77, 0, 0.175, 1);
-moz-animation: passing-through 3s cubic-bezier(0.77, 0, 0.175, 1);
-ms-animation: passing-through 3s cubic-bezier(0.77, 0, 0.175, 1);
-o-animation: passing-through 3s cubic-bezier(0.77, 0, 0.175, 1);
animation: passing-through 3s cubic-bezier(0.77, 0, 0.175, 1); }
.dropzone .dz-preview.dz-error .dz-error-mark {
opacity: 1;
-webkit-animation: slide-in 3s cubic-bezier(0.77, 0, 0.175, 1);
-moz-animation: slide-in 3s cubic-bezier(0.77, 0, 0.175, 1);
-ms-animation: slide-in 3s cubic-bezier(0.77, 0, 0.175, 1);
-o-animation: slide-in 3s cubic-bezier(0.77, 0, 0.175, 1);
animation: slide-in 3s cubic-bezier(0.77, 0, 0.175, 1); }
.dropzone .dz-preview .dz-success-mark, .dropzone .dz-preview .dz-error-mark {
pointer-events: none;
opacity: 0;
z-index: 500;
position: absolute;
display: block;
top: 50%;
left: 50%;
margin-left: -27px;
margin-top: -27px; }
.dropzone .dz-preview .dz-success-mark svg, .dropzone .dz-preview .dz-error-mark svg {
display: block;
width: 54px;
height: 54px; }
.dropzone .dz-preview.dz-processing .dz-progress {
opacity: 1;
-webkit-transition: all 0.2s linear;
-moz-transition: all 0.2s linear;
-ms-transition: all 0.2s linear;
-o-transition: all 0.2s linear;
transition: all 0.2s linear; }
.dropzone .dz-preview.dz-complete .dz-progress {
opacity: 0;
-webkit-transition: opacity 0.4s ease-in;
-moz-transition: opacity 0.4s ease-in;
-ms-transition: opacity 0.4s ease-in;
-o-transition: opacity 0.4s ease-in;
transition: opacity 0.4s ease-in; }
.dropzone .dz-preview:not(.dz-processing) .dz-progress {
-webkit-animation: pulse 6s ease infinite;
-moz-animation: pulse 6s ease infinite;
-ms-animation: pulse 6s ease infinite;
-o-animation: pulse 6s ease infinite;
animation: pulse 6s ease infinite; }
.dropzone .dz-preview .dz-progress {
opacity: 1;
z-index: 1000;
pointer-events: none;
position: absolute;
height: 16px;
left: 50%;
top: 50%;
margin-top: -8px;
width: 80px;
margin-left: -40px;
background: rgba(255, 255, 255, 0.9);
-webkit-transform: scale(1);
border-radius: 8px;
overflow: hidden; }
.dropzone .dz-preview .dz-progress .dz-upload {
background: #333;
background: linear-gradient(to bottom, #666, #444);
position: absolute;
top: 0;
left: 0;
bottom: 0;
width: 0;
-webkit-transition: width 300ms ease-in-out;
-moz-transition: width 300ms ease-in-out;
-ms-transition: width 300ms ease-in-out;
-o-transition: width 300ms ease-in-out;
transition: width 300ms ease-in-out; }
.dropzone .dz-preview.dz-error .dz-error-message {
display: block; }
.dropzone .dz-preview.dz-error:hover .dz-error-message {
opacity: 1;
pointer-events: auto; }
.dropzone .dz-preview .dz-error-message {
pointer-events: none;
z-index: 1000;
position: absolute;
display: block;
display: none;
opacity: 0;
-webkit-transition: opacity 0.3s ease;
-moz-transition: opacity 0.3s ease;
-ms-transition: opacity 0.3s ease;
-o-transition: opacity 0.3s ease;
transition: opacity 0.3s ease;
border-radius: 8px;
font-size: 13px;
top: 130px;
left: -10px;
width: 140px;
background: #be2626;
background: linear-gradient(to bottom, #be2626, #a92222);
padding: 0.5em 1.2em;
color: white; }
.dropzone .dz-preview .dz-error-message:after {
content: '';
position: absolute;
top: -6px;
left: 64px;
width: 0;
height: 0;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 6px solid #be2626; }

File diff suppressed because it is too large Load Diff

View File

@ -29,7 +29,8 @@ class Admin::GroupsController < OrbitMemberController
end
def showpost
uid = params[:id].split("-").last
@post = GroupPost.find_by(:uid => uid)
end
def show
@ -46,6 +47,12 @@ class Admin::GroupsController < OrbitMemberController
render :partial => "group_categories"
end
def upload_photo
photo = GroupPostImage.new(post_image_params)
photo.save
render :json => {"success" => true,"id" => photo.id.to_s}.to_json
end
def create
group = Group.new(group_params)
group.save
@ -79,9 +86,21 @@ class Admin::GroupsController < OrbitMemberController
def post_params
p = params.require(:group_post).permit!
p["author"] = current_user.id
images = []
p[:group_post_images].each do |id|
gpi = GroupPostImage.find(id) rescue nil
if !gpi.nil?
images << gpi
end
end
p[:group_post_images] = images
p
end
def post_image_params
params.require(:group_post_image).permit!
end
def group_params
p = params.require(:group).permit!
p["user_ids"] << current_user.id.to_s

View File

@ -7,8 +7,8 @@ class GroupPost
field :content
field :read_by, type: Array, default: []
field :author, type: BSON::ObjectId
mount_uploader :image, ImageUploader
belongs_to :group
has_many :group_post_images, :autosave => true, :dependent => :destroy
end

View File

@ -0,0 +1,9 @@
class GroupPostImage
include Mongoid::Document
include Mongoid::Timestamps
mount_uploader :image, ImageUploader
belongs_to :group_post
end

View File

@ -1,10 +1,10 @@
<a href="/admin/posts/<%= post.to_param %>" class="group-page-post-link">
<div class="group-page-post">
<div class="group-page-post-image-wrap">
<% if !post.image.nil? %>
<img class="group-page-post-image" src="<%= post.image.url %>" alt="<%= post.title %>">
<% if !post.group_post_images.blank? %>
<img class="group-page-post-image" src="<%= post.group_post_images.first.image.url %>" alt="<%= post.title %>">
<% else %>
<img class="group-page-post-image" src="/assets/member-pic.png" alt="Post image">
<img class="group-page-post-image" src="/assets/no-image.jpg" alt="Post image">
<% end %>
</div>
<div class="group-page-post-content-wrap">

View File

@ -2,11 +2,13 @@
<%= stylesheet_link_tag "lib/main-forms" %>
<%= stylesheet_link_tag "lib/fileupload" %>
<%= stylesheet_link_tag "lib/main-list" %>
<%= stylesheet_link_tag "lib/dropzone" %>
<% end %>
<% content_for :page_specific_javascript do %>
<%= javascript_include_tag "lib/bootstrap-fileupload" %>
<%= javascript_include_tag "lib/file-type" %>
<%= javascript_include_tag "lib/module-area" %>
<%= javascript_include_tag "lib/module-area" %>
<%= javascript_include_tag "lib/dropzone" %>
<% end %>
<div class="input-area">
@ -21,40 +23,26 @@
<div class="tab-pane fade in active" id="basic">
<!-- group banner image -->
<div class="control-group">
<label class="control-label muted"><%= t(:image) %></label>
<label class="control-label muted"><%= t(:images) %></label>
<div class="controls">
<div class="fileupload fileupload-new clearfix <%= 'fileupload-edit' if @grouppost.image.file %>" data-provides="fileupload">
<div class="fileupload-new thumbnail pull-left">
<% if @grouppost.image.file %>
<%= image_tag @grouppost.image %>
<% else %>
<img src="http://www.placehold.it/50x50/EFEFEF/AAAAAA" />
<% end %>
</div>
<div class="fileupload-preview fileupload-exists thumbnail pull-left"></div>
<span class="btn btn-file">
<span class="fileupload-new"><%= t(:select_image) %></span>
<span class="fileupload-exists"><%= t(:change) %></span>
<%= f.file_field :image %>
</span>
<a href="#" class="btn fileupload-exists" data-dismiss="fileupload"><%= t(:cancel) %></a>
<div class="controls" data-toggle="buttons-checkbox">
<label class="checkbox inline btn btn-danger fileupload-remove">
<%= f.check_box :remove_image %><%= t(:remove) %>
</label>
</div>
<!-- <input name="group_post_images" type="file" multiple > -->
<div class="dropzone" id="group-post-images">
<div class="dropzone-previews" id="group-post-images-container"></div>
</div>
<button class="upload_image_btn">Upload</button>
<button class="remove_image_btn">Remove all images</button>
</div>
<div id="image_ids">
</div>
</div>
</div>
</div>
<!-- Language -->
<div class="tab-content language-area">
<!-- Title-->
<div class="control-group input-title">
<div class="control-group input-title">
<label class="control-label muted"><%= t(:title) %></label>
<div class="controls">
<%= f.text_field :title, class: "input-block-level", placeholder: t(:title), value: (@grouppost.title rescue nil) %>
@ -78,4 +66,12 @@
<div class="form-actions">
<%= f.submit t('submit'), class: 'btn btn-primary' %>
<%= link_to t('cancel'), admin_groups_path, :class=>"btn" %>
</div>
</div>

View File

@ -2,4 +2,63 @@
<fieldset>
<%= render :partial => "post_form", locals: {f: f} %>
</fieldset>
<% end %>
<% end %>
<script type="text/javascript">
Dropzone.autoDiscover = false;
var image_id_panel = $("#image_ids");
var groupImageDropzone = new Dropzone("div#group-post-images", {
url : "/admin/posts/image",
previewsContainer : "#group-post-images-container",
paramName : "group_post_image[image]",
clickable : true,
autoProcessQueue : false,
addRemoveLinks : true,
uploadMultiple : false,
accept: function(file, done) {
var regex = new RegExp(/(\.|\/)(gif|jpe?g|png)$/i)
if(regex.test(file.name)){
done();
}else{
this.removeFile(file);
}
}
})
$(".upload_image_btn").on("click",function(){
$(".dropzone a.dz-remove").remove();
doUpload();
return false;
})
$(".remove_image_btn").on("click",function(){
groupImageDropzone.removeAllFiles();
return false;
})
groupImageDropzone.on("success",function(file,data){
image_id_panel.append("<input type='hidden' name='group_post[group_post_images][]' value='" + data.id + "' />");
})
groupImageDropzone.on("sending",function(file,xhr,obj){
obj.append("authenticity_token",$("form#new_group_post input[name=authenticity_token]").val());
})
var doUpload = function(){
groupImageDropzone.processQueue();
groupImageDropzone.on("complete", function(file) {
var filesCount = groupImageDropzone.getQueuedFiles().length;
if(filesCount > 0){
doUpload();
}
});
}
$("form#new_group_post").submit(function(){
if(groupImageDropzone.getQueuedFiles().length > 0){
alert("Please upload all the files or remove them before submitting a post.");
return false;
}else{
return true;
}
})
</script>

View File

@ -9,18 +9,26 @@
<article class="group-post">
<header class="group-post-meta">
<div class="group-post-heading-wrap clearfix">
<h2 class="group-post-title">My Awesome Post!</h2>
<h2 class="group-post-title"><%= @post.title %></h2>
<div class="group-post-avatar-wrap">
<a class="group-post-avatar-username-toggle tool-tip-parent" href="#">
<img class="group-post-avatar" src="/uploads/group/image/550fa5ba7470004834050000/IMAG1518.jpg" alt="">
<span class="group-post-username tool-tip">Isaac</span>
<%
user = User.find(@post.author) rescue nil
if !user.nil?
author = (user.member_profile.name == "" ? user.user_name : user.member_profile.name rescue "")
avatar = (!user.member_profile.avatar.nil? ? user.member_profile.avatar.url : "/assets/member-piv.png" rescue "/assets/member-piv.png")
end
%>
<img class="group-post-avatar" src="<%= avatar %>" alt="">
<span class="group-post-username tool-tip"><%= author %></span>
</a>
</div>
</div>
<div class="group-post-sub-wrap">
<span class="group-post-postdate">
<i class="group-post-postdate-icon icon-time"></i> 26 March
<% date = DateTime.parse(@post.created_at.to_s).strftime("%d %B") %>
<i class="group-post-postdate-icon icon-time"></i> <%= date %>
</span>
</div>
</header>
@ -32,15 +40,15 @@
data-cycle-fx="fade"
data-cycle-log="false"
>
<li class="group-post-image-item"><img class="group-post-banner-image" src="/uploads/group/image/550fa5ba7470004834050000/IMAG1518.jpg" alt="Post image"></li>
<li class="group-post-image-item"><img class="group-post-banner-image" src="/uploads/group/image/550fa5ba7470004834050000/IMAG1518.jpg" alt="Post image"></li>
<li class="group-post-image-item"><img class="group-post-banner-image" src="/uploads/group/image/550fa5ba7470004834050000/IMAG1518.jpg" alt="Post image"></li>
<% @post.group_post_images.each do |gpi| %>
<li class="group-post-image-item"><img class="group-post-banner-image" src="<%= gpi.image.url %>" alt="<%= @post.title %>"></li>
<% end %>
</ul>
<div class="group-post-cycle-prev cycle-nav"><i class="icon-chevron-left"></i></div>
<div class="group-post-cycle-next cycle-nav"><i class="icon-chevron-right"></i></div>
</section>
<section class="group-post-content">
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Deserunt repellendus quibusdam vel dignissimos, nihil numquam ex impedit error cupiditate reprehenderit mollitia repudiandae, aliquid aut pariatur suscipit porro voluptatem magnam rem obcaecati nam et iste inventore facere. Recusandae unde natus molestias aut odit soluta quibusdam. Quidem dignissimos natus nobis expedita ea ratione quod cupiditate repellat quis iusto, nulla architecto excepturi a qui, dolores molestiae culpa voluptas! Vitae eum alias fugiat eius ab, aliquid possimus, impedit odit eaque ad magnam, molestiae natus ex. Sed placeat consectetur eveniet culpa accusamus tempora earum unde debitis dolor eum fugit minus perspiciatis veniam id quod voluptate alias minima iure ipsam, natus molestiae. Quas dicta fugit nisi aspernatur, fugiat veniam, aut commodi mollitia quam consequatur aperiam vitae odio itaque tempore error iste tempora corporis nostrum nobis accusamus. Delectus dicta, voluptatibus repellendus? Dolor consequuntur minus, mollitia, quod aspernatur suscipit et quae quam omnis obcaecati laudantium dolore nisi ab!</p>
<%= @post.content.html_safe %>
</section>
<div class="group-post-attachment-wrap">
<i class="group-post-attachment-icon icon-paper-clip"></i>

View File

@ -7,6 +7,9 @@ require "action_mailer/railtie"
require "sprockets/railtie"
require "rails/test_unit/railtie"
require "mongoid/railtie"
require "bson"
require "moped"
Moped::BSON = BSON
# Require the gems listed in Gemfile, including any gems

View File

@ -125,6 +125,7 @@ Orbit::Application.routes.draw do
post "groups/create_category" => 'groups#create_category'
get "groups/public" => 'groups#public_groups'
get "posts/:id" => 'groups#showpost'
post "posts/image" => 'groups#upload_photo'
resources :groups do
get "newpost" => 'groups#newpost'