new interface with order

This commit is contained in:
Harry Bomrah 2016-02-17 20:37:37 +08:00
parent 64497cbd37
commit a3f14ed9a0
15 changed files with 465 additions and 155 deletions

View File

@ -8,9 +8,6 @@ function slideshow (element, bannerEffect, bannerTime, bannerSpeed) {
}); });
}; };
function setSlideshow(element, data) { function setSlideshow(element, data) {
$("#pageslide .ad_banner_ad_fx").children('option:selected').each(function(index, el) {
$(this).val() == 'flipHorz' || $(this).val() == 'flipVert' ? $('.suckIE').show() : $('.suckIE').hide();
});
slideshow(element, data['fx'], 2000, 1000); slideshow(element, data['fx'], 2000, 1000);
} }
@ -63,7 +60,7 @@ $(function() {
bannerSpeed = null, bannerSpeed = null,
bannerW = null, bannerW = null,
bannerH = null, bannerH = null,
$preview = $('#pageslide .preview'); $preview = $('.main-forms .preview');
$(".ad_banner_ad_fx").change(function () { $(".ad_banner_ad_fx").change(function () {
var suckIE = false; var suckIE = false;
@ -72,9 +69,6 @@ $(function() {
bannerTime = parseInt(bannerTime) || 300; bannerTime = parseInt(bannerTime) || 300;
bannerSpeed = parseInt(bannerSpeed) || 300; bannerSpeed = parseInt(bannerSpeed) || 300;
$(this).children('option:selected').each(function(index, el) {
$(this).val() == 'flipHorz' || $(this).val() == 'flipVert' ? $('.suckIE').show() : $('.suckIE').hide();
});
slideshow($preview, $(this).val(), 2000, 1000); slideshow($preview, $(this).val(), 2000, 1000);
}); });
preview(); preview();

View File

@ -1,6 +1,6 @@
class AdBannersController < ApplicationController class AdBannersController < ApplicationController
def widget def widget
adbanner = Banner.find(OrbitHelper.widget_custom_value) adbanner = Banner.find(OrbitHelper.widget_custom_value)
widget = OrbitHelper.get_current_widget widget = OrbitHelper.get_current_widget
if widget.widget_type == "ad_banner_widget2_video" if widget.widget_type == "ad_banner_widget2_video"
return video_widget(adbanner) return video_widget(adbanner)
@ -13,7 +13,7 @@ class AdBannersController < ApplicationController
def image_widget(adbanner) def image_widget(adbanner)
images = [] images = []
adbanner.ad_images.can_display.desc(:created_at).each_with_index do |b,i| adbanner.ad_images.can_display.asc(:sort_number).each_with_index do |b,i|
if b.language_enabled.include?(I18n.locale.to_s) if b.language_enabled.include?(I18n.locale.to_s)
image_link = OrbitHelper.is_mobile_view ? b.file.mobile.url : b.file.url image_link = OrbitHelper.is_mobile_view ? b.file.mobile.url : b.file.url
klass = i == 0 ? "active" : "" klass = i == 0 ? "active" : ""
@ -52,7 +52,7 @@ class AdBannersController < ApplicationController
def video_widget(adbanner) def video_widget(adbanner)
images = [] images = []
adbanner.ad_images.can_display.each_with_index do |ad_b,i| adbanner.ad_images.can_display.asc(:sort_number).each_with_index do |ad_b,i|
if ad_b.language_enabled.include?(I18n.locale.to_s) if ad_b.language_enabled.include?(I18n.locale.to_s)
image_link = OrbitHelper.is_mobile_view ? ad_b.file.mobile.url : ad_b.file.url image_link = OrbitHelper.is_mobile_view ? ad_b.file.mobile.url : ad_b.file.url
alt_text = (ad_b.title.nil? || ad_b.title == "" ? "ad-banner image" : ad_b.title) alt_text = (ad_b.title.nil? || ad_b.title == "" ? "ad-banner image" : ad_b.title)

View File

@ -2,56 +2,78 @@ class Admin::AdBannersController < OrbitAdminController
before_action ->(module_app = @app_title) { set_variables module_app } before_action ->(module_app = @app_title) { set_variables module_app }
def index def index
@table_fields = ["ad_banner.banner", :title, :category]
@categories = @module_app.categories.enabled
@filter_fields = filter_fields(@categories, [])
@filter_fields.delete(:status)
@filter_fields.delete(:tags)
@banners = Banner.all @banners = Banner.all
@categories = @module_app.categories.enabled.collect{|c|[c.title, c.id]} .order_by(sort)
.with_categories(filters("category"))
@banners = search_data(@banners,[:title]).page(params[:page]).per(6)
if request.xhr?
render :partial => "index_table"
end
end end
def show def show
@ad_banners = Banner.all @banner = Banner.find(params[:id])
@active = Banner.find(params[:id]) if params[:show] == "expired"
render :action => 'index' @images = @banner.ad_images.is_expired.asc(:sort_number).page(params[:page]).per(10)
else
@images = @banner.ad_images.not_expired.asc(:sort_number).page(params[:page]).per(10)
end
@table_fields = [:banner, :title, "ad_banner.duration", :link]
end end
def new def new
user_has_rights = (current_user.is_admin? ? true : (current_user.is_manager?(@module_app) ? true : current_user.is_manager_with_role?(@module_app) ? true : false)) rescue false
@ad_banner = Banner.new @ad_banner = Banner.new
render layout: false render_401 if !user_has_rights
end end
def create def create
@ad_banner = Banner.new(banner_params) ad_banner = Banner.new(banner_params)
if @ad_banner.save ad_banner.save
redirect_to admin_ad_banners_url redirect_to admin_ad_banners_url
else
@ad_banner = Banner.new(params[:ad_banner])
render :new
end
end end
def edit def edit
user_has_rights = (current_user.is_admin? ? true : (current_user.is_manager?(@module_app) ? true : current_user.is_manager_with_role?(@module_app) ? true : false)) rescue false
@ad_banner = Banner.find(params[:id]) @ad_banner = Banner.find(params[:id])
render layout: false render_401 if !user_has_rights
end end
def update def update
@ad_banner = Banner.find(params[:id]) ad_banner = Banner.find(params[:id])
if @ad_banner.update_attributes(banner_params) ad_banner.update_attributes(banner_params)
redirect_to admin_ad_banners_url, :status => 303 redirect_to params[:referer_url]
else
render :edit
end
end end
def destroy def destroy
@ad_banner = Banner.find(params[:id]) ad_banner = Banner.find(params[:id])
@ad_banner.destroy ad_banner.destroy
redirect_to admin_ad_banners_url redirect_to admin_ad_banners_path(:page => params[:page])
end
def save_image_order
ids = params[:ids]
ids.each_with_index do |id,index|
image = AdImage.find(id) rescue nil
if !image.nil?
image.sort_number = index
image.save
end
end
render :json => {"success" => true}.to_json
end end
private private
# Never trust parameters from the scary internet, only allow the white list through. # Never trust parameters from the scary internet, only allow the white list through.
def banner_params def banner_params
params.require(:ad_banner).permit! params.require(:banner).permit!
end end
end end

View File

@ -21,42 +21,34 @@ class Admin::AdImagesController < Admin::AdBannersController
end end
def update def update
@ad_image = AdImage.find(params[:id]) ad_image = AdImage.find(params[:id])
if @ad_image.update_attributes(ad_image_params) ad_image.update_attributes(ad_image_params)
redirect_to params['referer_url'] redirect_to params[:referer_url]
else
@ad_banners = Banner.all
@tags = @module_app.tags || []
render action: :edit
end
end end
def new def new
@ad_image = AdImage.new @ad_image = AdImage.new
@ad_banner = Banner.find(params[:banner_id])
@item = [[t('image'),"1"],[t('video'),"2"]] @item = [[t('image'),"1"],[t('video'),"2"]]
@ad_banner = Banner.find(params[:banner]) if can_edit_or_delete?(@ad_banner)
@tags = @module_app.tags || [] @tags = @module_app.tags || []
@ad_image.postdate = Date.today
@ad_image.postdate = Date.today else
render_401
end
end end
def create def create
@ad_image = AdImage.new(ad_image_params) @ad_image = AdImage.new(ad_image_params)
if @ad_image.save @ad_image.save
redirect_to params['referer_url'] redirect_to params[:referer_url]
else
@ad_banners = Banner.all
@tags = @module_app.tags || []
@ad_image = AdImage.new(ad_image_params)
render action: :new
end
end end
def destroy def destroy
@ad_image = AdImage.find params[:id] ad_image = AdImage.find params[:id]
if @ad_image.destroy banner = ad_image.banner
redirect_to admin_ad_banners_url ad_image.destroy
end redirect_to admin_ad_banner_path(banner.id, :page => params[:page])
end end
private private

View File

@ -14,6 +14,7 @@ class AdImage
field :postdate , :type => DateTime, :default => Time.now field :postdate , :type => DateTime, :default => Time.now
field :deadline , :type => DateTime field :deadline , :type => DateTime
field :youtube , :type => String field :youtube , :type => String
field :sort_number, :type => Integer
field :language_enabled, :type => Array, :default => ["en","zh_tw"] field :language_enabled, :type => Array, :default => ["en","zh_tw"]
field :exchange_item, :default => "1" field :exchange_item, :default => "1"
LINK_OPEN_TYPES = ["local", "new_window"] LINK_OPEN_TYPES = ["local", "new_window"]
@ -26,11 +27,35 @@ class AdImage
# validates :title, presence: true # validates :title, presence: true
scope :can_display, ->{self.and(AdImage.or({:postdate.lte=>Time.now},{:postdate=>nil}).selector,AdImage.or({:deadline.gte=>Time.now},{:deadline=>nil}).selector)} scope :can_display, ->{self.and(AdImage.or({:postdate.lte=>Time.now},{:postdate=>nil}).selector,AdImage.or({:deadline.gte=>Time.now},{:deadline=>nil}).selector)}
scope :is_expired, ->{self.and(AdImage.or({:deadline.lte=>Time.now}).selector)}
scope :not_expired, ->{self.and(AdImage.or({:deadline.gte=>Time.now},{:deadline=>nil}).selector)}
def expired? def expired?
self.deadline<Time.now rescue false self.deadline<Time.now rescue false
end end
def embed_url
uri = URI.parse(self.youtube) rescue nil
if !uri.nil?
params = CGI.parse(uri.query)
v = params['v'].first
return "http://www.youtube.com/embed/#{v}"
else
return ""
end
end
def youtube_thumb
uri = URI.parse(self.youtube) rescue nil
if !uri.nil?
params = CGI.parse(uri.query)
v = params['v'].first
return "http://img.youtube.com/vi/#{v}/0.jpg"
else
return ""
end
end
protected protected
def add_http def add_http

View File

@ -6,18 +6,18 @@ class Banner
field :ad_fx, type: String field :ad_fx, type: String
field :height, type: Integer field :height, type: Integer
field :speed, type: Integer field :speed, type: Integer, default: 500
field :title, type: String field :title, type: String
field :timeout, type: Integer field :timeout, type: Integer, default: 5
field :width, type: Integer field :width, type: Integer
field :base_image, type: Integer, default: 1
has_many :ad_images , dependent: :delete has_many :ad_images , dependent: :delete
validates_uniqueness_of :title validates_uniqueness_of :title
validates :title, :length => { :minimum => 2 } validates :title, :length => { :minimum => 2 }
validates :height, :width, :presence => true
FX_TYPES = %w(fade scrollHorz scrollVert tileSlide tileBlind)
FX_TYPES = %w(fade fadeout flipHorz flipVert scrollHorz scrollVert tileSlide tileBlind)
def size def size
"#{self.width} x #{self.height}" "#{self.width} x #{self.height}"
@ -32,6 +32,6 @@ class Banner
end end
def data_attribute_hash def data_attribute_hash
{'width'=> self.width,'height'=> self.height,'ad_fx'=> self.ad_fx,'name'=>self.title,'timeout'=>self.timeout,'speed'=>self.speed}.to_json {'width'=> self.width,'height'=> self.height,'ad_fx'=> self.ad_fx,'name'=>self.title,'timeout'=>self.timeout,'speed'=>self.speed, 'base_image' => self.base_image}.to_json
end end
end end

View File

@ -1,15 +1,97 @@
<%#= flash_messages %> <% content_for :page_specific_css do %>
<%#= f.error_messages %> <%= stylesheet_link_tag "lib/main-forms" %>
<%= stylesheet_link_tag "lib/fileupload" %>
<% end %>
<% content_for :page_specific_javascript do %>
<%= javascript_include_tag "lib/bootstrap-fileupload" %>
<%= javascript_include_tag "lib/bootstrap-datetimepicker" %>
<%= javascript_include_tag "lib/datetimepicker/datetimepicker.js" %>
<%= javascript_include_tag "lib/module-area" %>
<%= javascript_include_tag "validator" %>
<%= javascript_include_tag "cycle2" %>
<%= javascript_include_tag "ad_banner/banner_preview" %>
<% end %>
<%= f.label :title, t('ad_banner.banner_name') %> <style type="text/css">
<%= f.text_field :title, class: 'input-large', placeholder: t('ad_banner.banner_name'), id: 'name' %> .preview{
<span class="help-block"><%= t('ad_banner.name_only_english') %></span> margin-top: 15px;
}
</style>
<!-- Input Area -->
<div class="input-area">
<div class="nav-name"><strong><%= t(:module) %></strong></div>
<ul class="nav nav-pills module-nav">
<li class="active"><a href="#basic" data-toggle="tab"><%= t(:basic) %></a></li>
</ul>
<!-- Module -->
<div class="tab-content module-area">
<%= f.label :size, t('ad_banner.size') %> <!-- Basic Module -->
<span class="banner_set">W</span> <div class="tab-pane fade in active" id="basic">
<%= f.number_field :width, in: 10..1000, step: 10, class: 'input-mini', onkeypress: "if (event.keyCode < 48 || event.keyCode > 57) event.returnValue = false;", id: 'width' %> <!-- Title-->
<span class="banner_set">H</span> <div class="control-group">
<%= f.number_field :height, in: 10..1000, step: 10, class: 'input-mini', onkeypress: "if (event.keyCode < 48 || event.keyCode > 57) event.returnValue = false;", id: 'height' %> <%= f.label :title, t('ad_banner.banner_name'), :class => "control-label muted" %>
<div class="controls">
<%= f.label :category_id, t('ad_banner.categories') %> <%= f.text_field :title, class: 'input-large', placeholder: t('ad_banner.banner_name') %>
<%= f.select :category_id, @categories, {} %> <span class="help-block"><%= t('ad_banner.name_only_english') %></span>
</div>
</div>
<!-- timeout -->
<div class="control-group">
<%= f.label :timeout, t('ad_banner.transition_interval'), :class => "control-label muted" %>
<div class="controls">
<%= f.number_field :timeout, in: 0..60, step: 1, class: 'input-mini', onkeypress: "if (event.keyCode < 48 || event.keyCode > 57) event.returnValue = false;" %>
<span class="help-block"><%= t('ad_banner.number_seconds') %></span>
</div>
</div>
<!-- transition speed -->
<div class="control-group">
<%= f.label :speed, t('ad_banner.transition_speed'), :class => "control-label muted" %>
<div class="controls">
<%= f.number_field :speed, in: 0..1000, step: 100, class: 'input-mini', onkeypress: "if (event.keyCode < 48 || event.keyCode > 57) event.returnValue = false;" %>
<span class="help-block"><%= t('ad_banner.number_milliseconds') %></span>
</div>
</div>
<!-- size -->
<div class="control-group">
<%= f.label :size, t('ad_banner.size'), :class => "control-label muted" %>
<div class="controls">
<%= f.number_field :base_image, in: 1..(@ad_banner.new_record? ? 1 : (@ad_banner.ad_images.count == 0 ? 1 : @ad_banner.ad_images.count)), class: 'input-mini', onkeypress: "if (event.keyCode < 48 || event.keyCode > 57) event.returnValue = false;" %>
<span class="help-block">Base Image</span>
</div>
</div>
<!-- Category -->
<div class="control-group">
<label class="control-label muted"><%= t(:category) %></label>
<div class="controls">
<%= select_category(f, @module_app) %>
</div>
</div>
<!-- effect -->
<div class="control-group">
<%= f.label :size, t('ad_banner.effect'), :class => "control-label muted" %>
<div class="controls">
<%= f.select :ad_fx, Banner::FX_TYPES, {}, {class: 'ad_banner_ad_fx', id: 'ad_fx'} %>
<p class="suckIE hide"><i class="icons-warning"></i> <%= t('ad_banner.no_ie_10_effect_support') %></p>
<div class="preview">
<%= image_tag "slideshow_preview_A.png", width: "400", height: 80 %>
<%= image_tag "slideshow_preview_B.png", width: "400", height: 80 %>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Form Actions -->
<div class="form-actions">
<%= f.submit t('submit'), class: 'btn btn-primary' %>
<input type="hidden" name="referer_url" value="<%= admin_ad_banners_path(:page => params[:page]) %>">
<%= link_to t('cancel'), admin_ad_banners_path(:page => params[:page]), :class=>"btn" %>
</div>
<script type="text/javascript">
<% if @ad_banner.new_record? %>
slideshow($(".preview"), "fade" , 2000, 1000);
<% else %>
slideshow($(".preview"), "<%= @ad_banner.ad_fx %>" , <%= @ad_banner.timeout * 1000 rescue 2000 %>, <%= @ad_banner.speed %>);
<% end %>
</script>

View File

@ -86,17 +86,6 @@
position: absolute; position: absolute;
opacity: 0.7; opacity: 0.7;
} }
.ad-banner-subtitle{
color: #FFF;
background: #000;
font-size: 1.5em;
padding: 3px 15px;
margin-top: 10px;
z-index: 998;
position: absolute;
opacity: 0.7;
left: 15px;
}
.ad-banner-info{ .ad-banner-info{
display: none; display: none;
width: 100%; width: 100%;
@ -132,8 +121,8 @@
margin: 0px auto 70px auto; margin: 0px auto 70px auto;
} }
.ad-banner-images-wrap-arrow{ .ad-banner-images-wrap-arrow{
width: 0; width: 0;
height: 0; height: 0;
border-left: 5px solid transparent; border-left: 5px solid transparent;
border-right: 5px solid transparent; border-right: 5px solid transparent;
border-bottom: 5px solid #000; border-bottom: 5px solid #000;
@ -164,8 +153,8 @@
.ad-banner-image{ .ad-banner-image{
width: 100%; width: 100%;
height: 120px; height: 120px;
background-size: cover; background-size: cover;
background-position: center; background-position: center;
overflow: hidden; overflow: hidden;
box-shadow: 0 2px 10px #000; box-shadow: 0 2px 10px #000;
} }
@ -185,13 +174,6 @@
margin-top: 94px; margin-top: 94px;
opacity: 0.9; opacity: 0.9;
} }
.ad-image-item{
padding: 2px 20px;
line-height: 22px;
color: #FFF;
background: #000;
opacity: 0.9;
}
.ad-image-new-btn{ .ad-image-new-btn{
padding: 4px 10px; padding: 4px 10px;
border-radius: 3px; border-radius: 3px;
@ -224,7 +206,7 @@
@media all and (max-width: 767px) { @media all and (max-width: 767px) {
.ad-banner-detail{ .ad-banner-detail{
position: relative; position: relative;
margin-bottom: 10px; margin-bottom: 10px;
} }
} }
</style> </style>
@ -235,9 +217,9 @@
<div class="ad-banner-title"><%= banner.title %></div> <div class="ad-banner-title"><%= banner.title %></div>
<div class="cycle-slideshow ad-banner-images " <div class="cycle-slideshow ad-banner-images "
data-cycle-slides=".slide-img" data-cycle-slides=".slide-img"
data-cycle-fx="fade" data-cycle-fx="<%= banner.ad_fx %>"
data-cycle-speed="1" data-cycle-speed="<%= banner.speed %>"
data-cycle-timeout="5000" data-cycle-timeout="<%= banner.timeout.to_i*1000 %>"
> >
<% if !banner.ad_images.can_display.blank? %> <% if !banner.ad_images.can_display.blank? %>
<% banner.ad_images.can_display.desc(:created_at).each do |image| %> <% banner.ad_images.can_display.desc(:created_at).each do |image| %>
@ -256,11 +238,12 @@
<% if can_edit_or_delete?(banner) %> <% if can_edit_or_delete?(banner) %>
<div class="ad-banner-edit"> <div class="ad-banner-edit">
<a data-title="<%= t("ad_banner.setting") %>" <a data-title="<%= t("ad_banner.setting") %>"
data-id="<%= banner.id.to_s %>" data-id="<%= banner.id.to_s %>"
data-fx="<%= banner.ad_fx %>" data-fx="<%= banner.ad_fx %>"
data-form="<%= banner.data_attribute_hash.to_s %>" data-form="<%= banner.data_attribute_hash.to_s %>"
class="open-slide" data-max="<%= (banner.ad_images.blank? ? "1" : banner.ad_images.count) %>"
class="open-slide"
href="#"> href="#">
<div class="ad-banner-edit-btn"> <div class="ad-banner-edit-btn">
<i class="icons-cog"></i> <i class="icons-cog"></i>
@ -289,16 +272,22 @@
<tr> <tr>
<th><%= t("ad_banner.size") %> : </th> <th><%= t("ad_banner.size") %> : </th>
<td><%= banner.size %></td> <td><%= banner.size %></td>
<th><%= t("ad_banner.effect") %> : </th>
<td><%= banner.ad_fx %></td>
<th><%= t("ad_banner.transition_interval") %> : </th>
<td><%= banner.timeout %></td>
<th><%= t("ad_banner.transition_speed") %> : </th>
<td><%= banner.speed %></td>
</tr> </tr>
</table> </table>
</div> </div>
<% if can_edit_or_delete?(banner) %> <% if can_edit_or_delete?(banner) && current_user.is_admin? or current_user.is_manager?(@module_app) or current_user.is_sub_manager?(@module_app) %>
<div id="ad-banner-<%= banner.id.to_s %>" class="ad-banner-detail"> <div id="ad-banner-<%= banner.id.to_s %>" class="ad-banner-detail">
<div class="ad-banner-images-wrap-arrow"></div> <div class="ad-banner-images-wrap-arrow"></div>
<div class="ad-banner-images-wrap"> <div class="ad-banner-images-wrap">
<a href="<%= new_admin_ad_image_path(banner: banner.id.to_s) %>" class="ad-image-new-btn"> <a href="<%= new_admin_ad_image_path(banner: banner.id.to_s) %>" class="ad-image-new-btn">
<i class="icon-plus"></i> <%= t("new_image") %> <i class="icon-plus"></i> <%= t("ad.new_image") %>
</a> </a>
<% banner.ad_images.desc(:created_at).each_with_index do |image,idx| %> <% banner.ad_images.desc(:created_at).each_with_index do |image,idx| %>
<div class="ad-banner-image-wrap"> <div class="ad-banner-image-wrap">

View File

@ -0,0 +1,70 @@
<% content_for :page_specific_css do %>
<style type="text/css">
.slide-img{
width: 100%;
height: 140px;
background-repeat: no-repeat;
}
</style>
<% end %>
<table class="table main-list">
<thead>
<tr class="sort-header">
<% @table_fields.each do |f| %>
<%= thead(f) %>
<% end %>
</tr>
</thead>
<tbody>
<% user_has_rights = (current_user.is_admin? ? true : (current_user.is_manager?(@module_app) ? true : current_user.is_manager_with_role?(@module_app) ? true : false)) rescue false %>
<% @banners.each do |banner| %>
<tr>
<td class="span5">
<div class="cycle-slideshow ad-banner-images "
data-cycle-slides=".slide-img"
data-cycle-fx="<%= banner.ad_fx %>"
data-cycle-speed="<%= banner.speed %>"
data-cycle-timeout="<%= banner.timeout.to_i*1000 %>"
>
<% if !banner.ad_images.can_display.blank? %>
<% banner.ad_images.can_display.desc(:created_at).each do |image| %>
<div class="slide-img" style=" background: url('<%= image.exchange_item == "1" ? image.file.thumb.url : image.youtube_thumb %>'); background-size: cover; background-position: center;"></div>
<% end %>
<% else %>
<div class="slide-img" style="background: url('http://placehold.it/<%= banner.width %>x<%= banner.height %>/888&text=A'); background-size: cover; background-position: center;"></div>
<div class="slide-img" style="background: url('http://placehold.it/<%= banner.width %>x<%= banner.height %>/666&text=B'); background-size: cover; background-position: center;"></div>
<% end %>
</div>
</td>
<td>
<a href="<%= admin_ad_banner_path(banner.id) %>"><%= banner.title rescue "" %> </a>
<div class="quick-edit">
<ul class="nav nav-pills">
<% if can_edit_or_delete?(banner) %>
<li><a href="<%= admin_ad_banner_path(banner.id) %>"><%= t("ad_banner.add") %></a></li>
<% end %>
<% if user_has_rights %>
<li><a href="<%= edit_admin_ad_banner_path(banner.id, :page => params[:page]) %>"><%= t(:edit) %></a></li>
<li><a href="<%= admin_ad_banner_path(banner.id, :page => params[:page]) %>" class="delete text-error" data-method="delete" data-confirm="Are you sure?" ><%= t(:delete_) %></a></li>
<% end %>
</ul>
</div>
</td>
<td>
<%= banner.category.title rescue "" %>
</td>
</tr>
<% end %>
</tbody>
</table>
<div class="bottomnav clearfix" style="left: 81px;">
<% if user_has_rights %>
<div class="action pull-right">
<a class="btn btn-primary" href="<%= new_admin_ad_banner_path %>">
<%= t("ad_banner.new_banner") %>
</a>
</div>
<% end %>
<%= content_tag :div, paginate(@banners), class: "pagination pagination-centered" %>
</div>

View File

@ -0,0 +1,5 @@
<%= form_for @ad_banner, url: admin_ad_banner_path(@ad_banner), html: {class: "form-horizontal main-forms"} do |f| %>
<fieldset>
<%= render partial: 'form', locals: {f: f} %>
</fieldset>
<% end %>

View File

@ -3,44 +3,12 @@
<%= javascript_include_tag "cycle2" %> <%= javascript_include_tag "cycle2" %>
<%= javascript_include_tag "ad_banner/banner_preview" %> <%= javascript_include_tag "ad_banner/banner_preview" %>
<% end %> <% end %>
<%= render_filter @filter_fields, "index_table" %>
<div id="banner_index"> <span id="index_table">
<%= render 'index' %> <%= render 'index_table'%>
</div> </span>
<script type="text/javascript">
<% if current_user.is_admin? or current_user.is_manager?(@module_app) %> $(document).on("ajaxSuccess",function(event, xhr, settings){
<div class="bottomnav clearfix" style="left: 81px;"> $(".cycle-slideshow").cycle();
<div class="action pull-right"> })
<a data-title="<%= t("ad_banner.new_banner") %>" data-id="new" data-fx="fade" class="btn btn-primary open-slide" href="#"> </script>
<i class="icon-plus"></i><%= t("ad_banner.new_banner") %>
</a>
</div>
<div class="pagination pagination-centered"></div>
</div>
<div id="pageslide">
<div class="page-title clearfix">
<a class="pull-right" href="javascript:$.pageslide.close()">
<i class="icons-arrow-left-2"></i>
</a>
<span></span>
</div>
<div class="view-page">
<div class="nano">
<div class="content">
<%= form_for :ad_banner, url: nil, remote: true do |f| %>
<fieldset>
<%= render :partial => "form", :locals => { :f => f } %>
<div class="form-actions">
<a href="javascript:$.pageslide.close()" class="btn btn-small"><%= t(:cancel) %></a>
<%= f.submit t(:submit), class: 'btn btn-primary btn-small' %>
</div>
</fieldset>
<% end %>
</div>
</div>
</div>
</div>
<% end %>
<%= render 'layouts/delete_modal', delete_options: @delete_options %>

View File

@ -0,0 +1,5 @@
<%= form_for @ad_banner, url: admin_ad_banners_path, html: {class: "form-horizontal main-forms"} do |f| %>
<fieldset>
<%= render partial: 'form', locals: {f: f} %>
</fieldset>
<% end %>

View File

@ -0,0 +1,155 @@
<% content_for :page_specific_javascript do %>
<%= javascript_include_tag "lib/jquery-ui-sortable.min" %>
<% end %>
<% content_for :page_specific_css do %>
<style type="text/css">
.banner-image{
height: 140px;
background-repeat: no-repeat;
}
.order-list{
list-style: none;
}
.order-list-image i{
font-size: 20px;
cursor: move;
}
.order-list-image h4{
display: inline-block;
margin-left: 30px;
}
#sort-images-modal .modal-body {
max-height: 60vh;
}
#sort-images-modal .modal-body .order-list-image img {
width: 150px;
margin: 0 0 10px 10px;
}
</style>
<% end %>
<h3>
<%= @banner.title %>
<div class="pull-right btn-group">
<a class="btn btn-small <%= params[:show] == "expired" ? "" : "active" %>" href="<%= admin_ad_banner_path(@banner.id) %>">Not Expired</a>
<a class="btn btn-small <%= params[:show] == "expired" ? "active" : "" %>" href="<%= admin_ad_banner_path(@banner.id, :show => "expired") %>">Expired</a>
</div>
</h3>
<table class="table main-list">
<thead>
<tr class="sort-header">
<% @table_fields.each do |f| %>
<%= thead(f) %>
<% end %>
</tr>
</thead>
<tbody>
<% @images.each do |image| %>
<tr>
<td>
<% if image.exchange_item == "1" %>
<%= image_tag image.file.thumb, :class => "banner-image" %>
<% else %>
<iframe height="140" src="<%= image.embed_url %>"></iframe>
<% end %>
</td>
<td>
<%= image.title rescue "" %>
<% if can_edit_or_delete?(@banner) %>
<div class="quick-edit">
<ul class="nav nav-pills">
<li><a href="<%= edit_admin_ad_image_path(image.id, :page => params[:page]) %>"><%= t(:edit) %></a></li>
<li><a href="<%= admin_ad_image_path(image.id, :page => params[:page]) %>" class="delete text-error" data-method="delete" data-confirm="Are you sure?" ><%= t(:delete_) %></a></li>
</ul>
</div>
<% end %>
</td>
<td class="span3">
<% if !image.postdate.nil? %>
<%= image.postdate.strftime("%Y-%m-%d %H:%M") rescue "" %>
<% if !image.deadline.nil? %>
~ <%= image.deadline.strftime("%Y-%m-%d %H:%M") rescue "" %>
<% if image.expired? %>
<span class="label"><%= t("ad_banner.expired") %></span>
<% end %>
<% end %>
<% end %>
</td>
<td>
<% if image.out_link != "" %>
<a href="<%= image.out_link rescue "#" %>" target="_blank">Link</a>
<% end %>
</td>
</tr>
<% end %>
</tbody>
</table>
<% if can_edit_or_delete?(@banner) %>
<div class="bottomnav clearfix" style="left: 81px;">
<div class="action pull-right">
<a class="btn btn-primary" href="<%= new_admin_ad_image_path(:page => params[:page], :banner_id => @banner.id) %>">
<%= t("ad_banner.add") %>
</a>
<a class="btn btn-info" href="#sort-images-modal" data-toggle="modal">Order</a>
</div>
<%= content_tag :div, paginate(@images), class: "pagination pagination-centered" %>
</div>
<!-- image order modal -->
<div id="sort-images-modal" class="modal hide fade" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h3>Order Images</h3>
</div>
<div class="modal-body">
<ul class="order-list">
<% @banner.ad_images.not_expired.asc(:sort_number).each do |image| %>
<li class="order-list-image" data-image-id="<%= image.id.to_s %>">
<i class="icons-list-2"></i>
<img src="<%= image.exchange_item == "1" ? image.file.thumb.url : image.youtube_thumb %>"/>
<h4><%= image.title %>
</li>
<% end %>
</ul>
</div>
<div class="modal-footer">
<button class="btn" data-dismiss="modal" aria-hidden="true">Close</button>
<button class="btn btn-primary" id="save-image-order-btn">Save changes</button>
</div>
</div>
<% end %>
<script type="text/javascript">
var sortUpdated = false;
$("#sort-images-modal").on("shown",function(){
$(".order-list").sortable({
update : function(){
sortUpdated = true;
}
});
})
$("#save-image-order-btn").on("click",function(){
if(sortUpdated){
var ids = [];
$(".order-list-image").each(function(i,image){
ids.push($(image).data("image-id"));
})
$.ajax({
url : "/admin/ad_banner/save_image_order",
data : {"ids" : ids, "banner_id" : "<%= @banner.id.to_s %>"},
dataType : "json",
type : "post"
}).done(function(){
alert("Order saved. Please refresh the page to see the changes.");
$("#sort-images-modal").modal("hide");
})
}
})
</script>

View File

@ -7,10 +7,11 @@
<%= javascript_include_tag "lib/bootstrap-datetimepicker" %> <%= javascript_include_tag "lib/bootstrap-datetimepicker" %>
<%= javascript_include_tag "lib/datetimepicker/datetimepicker.js" %> <%= javascript_include_tag "lib/datetimepicker/datetimepicker.js" %>
<%= javascript_include_tag "lib/module-area" %> <%= javascript_include_tag "lib/module-area" %>
<%= javascript_include_tag "validator" %>
<% end %> <% end %>
<%#= f.error_messages %> <%#= f.error_messages %>
<!-- Input Area --> <!-- Input Area -->
<div class="input-area"> <div class="input-area">
@ -139,9 +140,9 @@
</div> </div>
</div> </div>
<div id="exchange_item_2" style="display:none"> <!-- <div id="exchange_item_2" style="display:none">
</div> </div> -->
</div> </div>
</div> </div>
@ -159,7 +160,7 @@
<div class="tab-content language-area"> <div class="tab-content language-area">
<% @site_in_use_locales.each_with_index do |locale, i| %> <% @site_in_use_locales.each_with_index do |locale, i| %>
<div class="<%= locale %> tab-pane fade <%= ( i == 0 ) ? "in active" : '' %>"> <div class="<%= locale %> tab-pane fade <%= ( i == 0 ) ? "in active" : '' %>">
<!-- Content --> <!-- Content -->
@ -187,7 +188,6 @@
<input type="hidden" name="referer_url" value="<%= request.referer %>"> <input type="hidden" name="referer_url" value="<%= request.referer %>">
<%= f.submit t('submit'), class: 'btn btn-primary' %> <%= f.submit t('submit'), class: 'btn btn-primary' %>
</div> </div>
<script type="text/javascript"> <script type="text/javascript">
window.onload=chg(document.getElementById("ad_image_exchange_item").value); window.onload=chg(document.getElementById("ad_image_exchange_item").value);
@ -198,7 +198,9 @@
{ {
document.getElementById("exchange_item_"+i).style.display = "none"; document.getElementById("exchange_item_"+i).style.display = "none";
} }
document.getElementById("exchange_item_"+a).style.display = ""; <% if !@ad_image.new_record? %>
document.getElementById("exchange_item_"+<%= @ad_image.exchange_item %>).style.display = "";
<% end %>
} }
function checkSelect() function checkSelect()

View File

@ -6,6 +6,7 @@ locales = Site.find_by(site_active: true).in_use_locales rescue I18n.available_l
scope "(:locale)", locale: Regexp.new(locales.join("|")) do scope "(:locale)", locale: Regexp.new(locales.join("|")) do
namespace :admin do namespace :admin do
post "/ad_banner/save_image_order", to: "ad_banners#save_image_order"
resources :ad_banners resources :ad_banners
resources :ad_images resources :ad_images
end end