init
This commit is contained in:
commit
03a9727745
|
@ -0,0 +1,8 @@
|
|||
.bundle/
|
||||
log/*.log
|
||||
pkg/
|
||||
test/dummy/db/*.sqlite3
|
||||
test/dummy/db/*.sqlite3-journal
|
||||
test/dummy/log/*.log
|
||||
test/dummy/tmp/
|
||||
test/dummy/.sass-cache
|
|
@ -0,0 +1,14 @@
|
|||
source "https://rubygems.org"
|
||||
|
||||
# Declare your gem's dependencies in bulletin_event.gemspec.
|
||||
# Bundler will treat runtime dependencies like base dependencies, and
|
||||
# development dependencies will be added by default to the :development group.
|
||||
gemspec
|
||||
|
||||
# Declare any dependencies that are still in development here instead of in
|
||||
# your gemspec. These might include edge Rails or gems from your path or
|
||||
# Git. Remember to move these dependencies to your gemspec before releasing
|
||||
# your gem to rubygems.org.
|
||||
|
||||
# To use debugger
|
||||
# gem 'debugger'
|
|
@ -0,0 +1,106 @@
|
|||
PATH
|
||||
remote: .
|
||||
specs:
|
||||
event_ann (0.0.1)
|
||||
mongoid (= 4.0.0.beta1)
|
||||
rails (~> 4.1.0.rc2)
|
||||
|
||||
GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
actionmailer (4.1.0.rc2)
|
||||
actionpack (= 4.1.0.rc2)
|
||||
actionview (= 4.1.0.rc2)
|
||||
mail (~> 2.5.4)
|
||||
actionpack (4.1.0.rc2)
|
||||
actionview (= 4.1.0.rc2)
|
||||
activesupport (= 4.1.0.rc2)
|
||||
rack (~> 1.5.2)
|
||||
rack-test (~> 0.6.2)
|
||||
actionview (4.1.0.rc2)
|
||||
activesupport (= 4.1.0.rc2)
|
||||
builder (~> 3.1)
|
||||
erubis (~> 2.7.0)
|
||||
activemodel (4.1.0.rc2)
|
||||
activesupport (= 4.1.0.rc2)
|
||||
builder (~> 3.1)
|
||||
activerecord (4.1.0.rc2)
|
||||
activemodel (= 4.1.0.rc2)
|
||||
activesupport (= 4.1.0.rc2)
|
||||
arel (~> 5.0.0)
|
||||
activesupport (4.1.0.rc2)
|
||||
i18n (~> 0.6, >= 0.6.9)
|
||||
json (~> 1.7, >= 1.7.7)
|
||||
minitest (~> 5.1)
|
||||
thread_safe (~> 0.1)
|
||||
tzinfo (~> 1.1)
|
||||
arel (5.0.0)
|
||||
atomic (1.1.16)
|
||||
bson (2.2.1)
|
||||
builder (3.2.2)
|
||||
connection_pool (2.0.0)
|
||||
erubis (2.7.0)
|
||||
hike (1.2.3)
|
||||
i18n (0.6.9)
|
||||
json (1.8.1)
|
||||
mail (2.5.4)
|
||||
mime-types (~> 1.16)
|
||||
treetop (~> 1.4.8)
|
||||
mime-types (1.25.1)
|
||||
minitest (5.3.1)
|
||||
mongoid (4.0.0.beta1)
|
||||
activemodel (>= 4.0.0)
|
||||
moped (~> 2.0.beta6)
|
||||
origin (~> 2.1)
|
||||
tzinfo (>= 0.3.37)
|
||||
moped (2.0.0.rc1)
|
||||
bson (~> 2.2)
|
||||
connection_pool (~> 2.0)
|
||||
optionable (~> 0.2.0)
|
||||
multi_json (1.9.2)
|
||||
optionable (0.2.0)
|
||||
origin (2.1.1)
|
||||
polyglot (0.3.4)
|
||||
rack (1.5.2)
|
||||
rack-test (0.6.2)
|
||||
rack (>= 1.0)
|
||||
rails (4.1.0.rc2)
|
||||
actionmailer (= 4.1.0.rc2)
|
||||
actionpack (= 4.1.0.rc2)
|
||||
actionview (= 4.1.0.rc2)
|
||||
activemodel (= 4.1.0.rc2)
|
||||
activerecord (= 4.1.0.rc2)
|
||||
activesupport (= 4.1.0.rc2)
|
||||
bundler (>= 1.3.0, < 2.0)
|
||||
railties (= 4.1.0.rc2)
|
||||
sprockets-rails (~> 2.0.0)
|
||||
railties (4.1.0.rc2)
|
||||
actionpack (= 4.1.0.rc2)
|
||||
activesupport (= 4.1.0.rc2)
|
||||
rake (>= 0.8.7)
|
||||
thor (>= 0.18.1, < 2.0)
|
||||
rake (10.2.2)
|
||||
sprockets (2.12.0)
|
||||
hike (~> 1.2)
|
||||
multi_json (~> 1.0)
|
||||
rack (~> 1.0)
|
||||
tilt (~> 1.1, != 1.3.0)
|
||||
sprockets-rails (2.0.1)
|
||||
actionpack (>= 3.0)
|
||||
activesupport (>= 3.0)
|
||||
sprockets (~> 2.8)
|
||||
thor (0.19.1)
|
||||
thread_safe (0.3.1)
|
||||
atomic (>= 1.1.7, < 2)
|
||||
tilt (1.4.1)
|
||||
treetop (1.4.15)
|
||||
polyglot
|
||||
polyglot (>= 0.3.1)
|
||||
tzinfo (1.1.0)
|
||||
thread_safe (~> 0.1)
|
||||
|
||||
PLATFORMS
|
||||
ruby
|
||||
|
||||
DEPENDENCIES
|
||||
event_ann!
|
|
@ -0,0 +1,20 @@
|
|||
Copyright 2014 YOURNAME
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@ -0,0 +1,3 @@
|
|||
= BulletinEvent
|
||||
|
||||
This project rocks and uses MIT-LICENSE.
|
|
@ -0,0 +1,32 @@
|
|||
begin
|
||||
require 'bundler/setup'
|
||||
rescue LoadError
|
||||
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
||||
end
|
||||
|
||||
require 'rdoc/task'
|
||||
|
||||
RDoc::Task.new(:rdoc) do |rdoc|
|
||||
rdoc.rdoc_dir = 'rdoc'
|
||||
rdoc.title = 'EventAnn'
|
||||
rdoc.options << '--line-numbers'
|
||||
rdoc.rdoc_files.include('README.rdoc')
|
||||
rdoc.rdoc_files.include('lib/**/*.rb')
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
Bundler::GemHelper.install_tasks
|
||||
|
||||
require 'rake/testtask'
|
||||
|
||||
Rake::TestTask.new(:test) do |t|
|
||||
t.libs << 'lib'
|
||||
t.libs << 'test'
|
||||
t.pattern = 'test/**/*_test.rb'
|
||||
t.verbose = false
|
||||
end
|
||||
|
||||
|
||||
task default: :test
|
|
@ -0,0 +1,2 @@
|
|||
// Place all the behaviors and hooks related to the matching controller here.
|
||||
// All this logic will automatically be available in application.js.
|
|
@ -0,0 +1,21 @@
|
|||
$(document).ready(function() {
|
||||
var config = {}
|
||||
config.autoGrow_minHeight = 50;
|
||||
config.allowedContent = false;
|
||||
config.disallowedContent = 'img';
|
||||
config.toolbar = [
|
||||
{ name: 'clipboard', items: [ 'Cut', 'Copy', 'Paste', 'PasteText', 'PasteFromWord', '-', 'Undo', 'Redo' ] },
|
||||
{ name: 'editing', items: [ 'Find', 'Replace', '-', 'SelectAll', '-', 'Scayt' ] },
|
||||
|
||||
{ name: 'basicstyles', items: [ 'Bold', 'Italic', 'Underline', 'Strike', 'Subscript', 'Superscript', '-', 'CopyFormatting', 'RemoveFormat' ] },
|
||||
'/',
|
||||
{ name: 'insert', items: [ 'SpecialChar'] },
|
||||
{ name: 'styles', items: [ 'Font' ] },
|
||||
{ name: 'colors', items: [ 'TextColor', 'BGColor' ] }
|
||||
];
|
||||
|
||||
var ckeditor_reduce = $('.ckeditor_reduce')
|
||||
ckeditor_reduce.each(function(i,v){
|
||||
CKEDITOR.replace(v,config);
|
||||
})
|
||||
});
|
|
@ -0,0 +1,7 @@
|
|||
/*
|
||||
Place all the styles related to the matching controller here.
|
||||
They will automatically be included in application.css.
|
||||
*/
|
||||
.table .expired{
|
||||
color: #BE2E2E;
|
||||
}
|
|
@ -0,0 +1,947 @@
|
|||
//
|
||||
// Mixins
|
||||
// --------------------------------------------------
|
||||
|
||||
|
||||
// Utilities
|
||||
// -------------------------
|
||||
|
||||
// Clearfix
|
||||
// Source: http://nicolasgallagher.com/micro-clearfix-hack/
|
||||
//
|
||||
// For modern browsers
|
||||
// 1. The space content is one way to avoid an Opera bug when the
|
||||
// contenteditable attribute is included anywhere else in the document.
|
||||
// Otherwise it causes space to appear at the top and bottom of elements
|
||||
// that are clearfixed.
|
||||
// 2. The use of `table` rather than `block` is only necessary if using
|
||||
// `:before` to contain the top-margins of child elements.
|
||||
@mixin clearfix() {
|
||||
&:before,
|
||||
&:after {
|
||||
content: " "; // 1
|
||||
display: table; // 2
|
||||
}
|
||||
&:after {
|
||||
clear: both;
|
||||
}
|
||||
}
|
||||
|
||||
// WebKit-style focus
|
||||
@mixin tab-focus() {
|
||||
// Default
|
||||
outline: thin dotted;
|
||||
// WebKit
|
||||
outline: 5px auto -webkit-focus-ring-color;
|
||||
outline-offset: -2px;
|
||||
}
|
||||
|
||||
// Center-align a block level element
|
||||
@mixin center-block() {
|
||||
display: block;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
// Sizing shortcuts
|
||||
@mixin size($width, $height) {
|
||||
width: $width;
|
||||
height: $height;
|
||||
}
|
||||
@mixin square($size) {
|
||||
@include size($size, $size);
|
||||
}
|
||||
|
||||
// Placeholder text
|
||||
@mixin placeholder($color: $input-color-placeholder) {
|
||||
&::-moz-placeholder { color: $color; // Firefox
|
||||
opacity: 1; } // See https://github.com/twbs/bootstrap/pull/11526
|
||||
&:-ms-input-placeholder { color: $color; } // Internet Explorer 10+
|
||||
&::-webkit-input-placeholder { color: $color; } // Safari and Chrome
|
||||
}
|
||||
|
||||
// Text overflow
|
||||
// Requires inline-block or block for proper styling
|
||||
@mixin text-overflow() {
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
// CSS image replacement
|
||||
//
|
||||
// Heads up! v3 launched with with only `.hide-text()`, but per our pattern for
|
||||
// mixins being reused as classes with the same name, this doesn't hold up. As
|
||||
// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`. Note
|
||||
// that we cannot chain the mixins together in Less, so they are repeated.
|
||||
//
|
||||
// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757
|
||||
|
||||
// Deprecated as of v3.0.1 (will be removed in v4)
|
||||
@mixin hide-text() {
|
||||
font: #{0/0} a;
|
||||
color: transparent;
|
||||
text-shadow: none;
|
||||
background-color: transparent;
|
||||
border: 0;
|
||||
}
|
||||
// New mixin to use as of v3.0.1
|
||||
@mixin text-hide() {
|
||||
@include hide-text();
|
||||
}
|
||||
|
||||
|
||||
|
||||
// CSS3 PROPERTIES
|
||||
// --------------------------------------------------
|
||||
|
||||
// Single side border-radius
|
||||
@mixin border-top-radius($radius) {
|
||||
border-top-right-radius: $radius;
|
||||
border-top-left-radius: $radius;
|
||||
}
|
||||
@mixin border-right-radius($radius) {
|
||||
border-bottom-right-radius: $radius;
|
||||
border-top-right-radius: $radius;
|
||||
}
|
||||
@mixin border-bottom-radius($radius) {
|
||||
border-bottom-right-radius: $radius;
|
||||
border-bottom-left-radius: $radius;
|
||||
}
|
||||
@mixin border-left-radius($radius) {
|
||||
border-bottom-left-radius: $radius;
|
||||
border-top-left-radius: $radius;
|
||||
}
|
||||
|
||||
// Drop shadows
|
||||
//
|
||||
// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's
|
||||
// supported browsers that have box shadow capabilities now support the
|
||||
// standard `box-shadow` property.
|
||||
@mixin box-shadow($shadow...) {
|
||||
-webkit-box-shadow: $shadow; // iOS <4.3 & Android <4.1
|
||||
box-shadow: $shadow;
|
||||
}
|
||||
|
||||
// Transitions
|
||||
@mixin transition($transition...) {
|
||||
-webkit-transition: $transition;
|
||||
transition: $transition;
|
||||
}
|
||||
@mixin transition-property($transition-property...) {
|
||||
-webkit-transition-property: $transition-property;
|
||||
transition-property: $transition-property;
|
||||
}
|
||||
@mixin transition-delay($transition-delay) {
|
||||
-webkit-transition-delay: $transition-delay;
|
||||
transition-delay: $transition-delay;
|
||||
}
|
||||
@mixin transition-duration($transition-duration...) {
|
||||
-webkit-transition-duration: $transition-duration;
|
||||
transition-duration: $transition-duration;
|
||||
}
|
||||
@mixin transition-transform($transition...) {
|
||||
-webkit-transition: -webkit-transform $transition;
|
||||
-moz-transition: -moz-transform $transition;
|
||||
-o-transition: -o-transform $transition;
|
||||
transition: transform $transition;
|
||||
}
|
||||
|
||||
// Transformations
|
||||
@mixin rotate($degrees) {
|
||||
-webkit-transform: rotate($degrees);
|
||||
-ms-transform: rotate($degrees); // IE9 only
|
||||
transform: rotate($degrees);
|
||||
}
|
||||
@mixin scale($scale-args...) {
|
||||
-webkit-transform: scale($scale-args);
|
||||
-ms-transform: scale($scale-args); // IE9 only
|
||||
transform: scale($scale-args);
|
||||
}
|
||||
@mixin translate($x, $y) {
|
||||
-webkit-transform: translate($x, $y);
|
||||
-ms-transform: translate($x, $y); // IE9 only
|
||||
transform: translate($x, $y);
|
||||
}
|
||||
@mixin skew($x, $y) {
|
||||
-webkit-transform: skew($x, $y);
|
||||
-ms-transform: skewX($x) skewY($y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+
|
||||
transform: skew($x, $y);
|
||||
}
|
||||
@mixin translate3d($x, $y, $z) {
|
||||
-webkit-transform: translate3d($x, $y, $z);
|
||||
transform: translate3d($x, $y, $z);
|
||||
}
|
||||
|
||||
@mixin rotateX($degrees) {
|
||||
-webkit-transform: rotateX($degrees);
|
||||
-ms-transform: rotateX($degrees); // IE9 only
|
||||
transform: rotateX($degrees);
|
||||
}
|
||||
@mixin rotateY($degrees) {
|
||||
-webkit-transform: rotateY($degrees);
|
||||
-ms-transform: rotateY($degrees); // IE9 only
|
||||
transform: rotateY($degrees);
|
||||
}
|
||||
@mixin perspective($perspective) {
|
||||
-webkit-perspective: $perspective;
|
||||
-moz-perspective: $perspective;
|
||||
perspective: $perspective;
|
||||
}
|
||||
@mixin perspective-origin($perspective) {
|
||||
-webkit-perspective-origin: $perspective;
|
||||
-moz-perspective-origin: $perspective;
|
||||
perspective-origin: $perspective;
|
||||
}
|
||||
@mixin transform-origin($origin) {
|
||||
-webkit-transform-origin: $origin;
|
||||
-moz-transform-origin: $origin;
|
||||
-ms-transform-origin: $origin; // IE9 only
|
||||
transform-origin: $origin;
|
||||
}
|
||||
|
||||
// Animations
|
||||
@mixin animation($animation) {
|
||||
-webkit-animation: $animation;
|
||||
animation: $animation;
|
||||
}
|
||||
@mixin animation-name($name) {
|
||||
-webkit-animation-name: $name;
|
||||
animation-name: $name;
|
||||
}
|
||||
@mixin animation-duration($duration) {
|
||||
-webkit-animation-duration: $duration;
|
||||
animation-duration: $duration;
|
||||
}
|
||||
@mixin animation-timing-function($timing-function) {
|
||||
-webkit-animation-timing-function: $timing-function;
|
||||
animation-timing-function: $timing-function;
|
||||
}
|
||||
@mixin animation-delay($delay) {
|
||||
-webkit-animation-delay: $delay;
|
||||
animation-delay: $delay;
|
||||
}
|
||||
@mixin animation-iteration-count($iteration-count) {
|
||||
-webkit-animation-iteration-count: $iteration-count;
|
||||
animation-iteration-count: $iteration-count;
|
||||
}
|
||||
@mixin animation-direction($direction) {
|
||||
-webkit-animation-direction: $direction;
|
||||
animation-direction: $direction;
|
||||
}
|
||||
|
||||
// Backface visibility
|
||||
// Prevent browsers from flickering when using CSS 3D transforms.
|
||||
// Default value is `visible`, but can be changed to `hidden`
|
||||
@mixin backface-visibility($visibility){
|
||||
-webkit-backface-visibility: $visibility;
|
||||
-moz-backface-visibility: $visibility;
|
||||
backface-visibility: $visibility;
|
||||
}
|
||||
|
||||
// Box sizing
|
||||
@mixin box-sizing($boxmodel) {
|
||||
-webkit-box-sizing: $boxmodel;
|
||||
-moz-box-sizing: $boxmodel;
|
||||
box-sizing: $boxmodel;
|
||||
}
|
||||
|
||||
// User select
|
||||
// For selecting text on the page
|
||||
@mixin user-select($select) {
|
||||
-webkit-user-select: $select;
|
||||
-moz-user-select: $select;
|
||||
-ms-user-select: $select; // IE10+
|
||||
user-select: $select;
|
||||
}
|
||||
|
||||
// Resize anything
|
||||
@mixin resizable($direction) {
|
||||
resize: $direction; // Options: horizontal, vertical, both
|
||||
overflow: auto; // Safari fix
|
||||
}
|
||||
|
||||
// CSS3 Content Columns
|
||||
@mixin content-columns($column-count, $column-gap: $grid-gutter-width) {
|
||||
-webkit-column-count: $column-count;
|
||||
-moz-column-count: $column-count;
|
||||
column-count: $column-count;
|
||||
-webkit-column-gap: $column-gap;
|
||||
-moz-column-gap: $column-gap;
|
||||
column-gap: $column-gap;
|
||||
}
|
||||
|
||||
// Optional hyphenation
|
||||
@mixin hyphens($mode: auto) {
|
||||
word-wrap: break-word;
|
||||
-webkit-hyphens: $mode;
|
||||
-moz-hyphens: $mode;
|
||||
-ms-hyphens: $mode; // IE10+
|
||||
-o-hyphens: $mode;
|
||||
hyphens: $mode;
|
||||
}
|
||||
|
||||
// Opacity
|
||||
@mixin opacity($opacity) {
|
||||
opacity: $opacity;
|
||||
// IE8 filter
|
||||
$opacity-ie: ($opacity * 100);
|
||||
filter: #{alpha(opacity=$opacity-ie)};
|
||||
}
|
||||
|
||||
|
||||
|
||||
// GRADIENTS
|
||||
// --------------------------------------------------
|
||||
|
||||
|
||||
|
||||
// Horizontal gradient, from left to right
|
||||
//
|
||||
// Creates two color stops, start and end, by specifying a color and position for each color stop.
|
||||
// Color stops are not available in IE9 and below.
|
||||
@mixin gradient-horizontal($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) {
|
||||
background-image: -webkit-linear-gradient(left, color-stop($start-color $start-percent), color-stop($end-color $end-percent)); // Safari 5.1-6, Chrome 10+
|
||||
background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
|
||||
background-repeat: repeat-x;
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=1); // IE9 and down
|
||||
}
|
||||
|
||||
// Vertical gradient, from top to bottom
|
||||
//
|
||||
// Creates two color stops, start and end, by specifying a color and position for each color stop.
|
||||
// Color stops are not available in IE9 and below.
|
||||
@mixin gradient-vertical($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) {
|
||||
background-image: -webkit-linear-gradient(top, $start-color $start-percent, $end-color $end-percent); // Safari 5.1-6, Chrome 10+
|
||||
background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
|
||||
background-repeat: repeat-x;
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=0); // IE9 and down
|
||||
}
|
||||
|
||||
@mixin gradient-directional($start-color: #555, $end-color: #333, $deg: 45deg) {
|
||||
background-repeat: repeat-x;
|
||||
background-image: -webkit-linear-gradient($deg, $start-color, $end-color); // Safari 5.1-6, Chrome 10+
|
||||
background-image: linear-gradient($deg, $start-color, $end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
|
||||
}
|
||||
@mixin gradient-horizontal-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f) {
|
||||
background-image: -webkit-linear-gradient(left, $start-color, $mid-color $color-stop, $end-color);
|
||||
background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);
|
||||
background-repeat: no-repeat;
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=1); // IE9 and down, gets no color-stop at all for proper fallback
|
||||
}
|
||||
@mixin gradient-vertical-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f) {
|
||||
background-image: -webkit-linear-gradient($start-color, $mid-color $color-stop, $end-color);
|
||||
background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);
|
||||
background-repeat: no-repeat;
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=0); // IE9 and down, gets no color-stop at all for proper fallback
|
||||
}
|
||||
@mixin gradient-radial($inner-color: #555, $outer-color: #333) {
|
||||
background-image: -webkit-radial-gradient(circle, $inner-color, $outer-color);
|
||||
background-image: radial-gradient(circle, $inner-color, $outer-color);
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
@mixin gradient-striped($color: rgba(255,255,255,.15), $angle: 45deg) {
|
||||
background-image: -webkit-linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);
|
||||
background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);
|
||||
}
|
||||
|
||||
// Reset filters for IE
|
||||
//
|
||||
// When you need to remove a gradient background, do not forget to use this to reset
|
||||
// the IE filter for IE9 and below.
|
||||
@mixin reset-filter() {
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Retina images
|
||||
//
|
||||
// Short retina mixin for setting background-image and -size
|
||||
|
||||
@mixin img-retina($file-1x, $file-2x, $width-1x, $height-1x) {
|
||||
background-image: url(if($bootstrap-sass-asset-helper, twbs-image-path("#{$file-1x}"), "#{$file-1x}"));
|
||||
|
||||
@media
|
||||
only screen and (-webkit-min-device-pixel-ratio: 2),
|
||||
only screen and ( min--moz-device-pixel-ratio: 2),
|
||||
only screen and ( -o-min-device-pixel-ratio: 2/1),
|
||||
only screen and ( min-device-pixel-ratio: 2),
|
||||
only screen and ( min-resolution: 192dpi),
|
||||
only screen and ( min-resolution: 2dppx) {
|
||||
background-image: url(if($bootstrap-sass-asset-helper, twbs-image-path("#{$file-2x}"), "#{$file-2x}"));
|
||||
background-size: $width-1x $height-1x;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Responsive image
|
||||
//
|
||||
// Keep images from scaling beyond the width of their parents.
|
||||
|
||||
@mixin img-responsive($display: block) {
|
||||
display: $display;
|
||||
max-width: 100%; // Part 1: Set a maximum relative to the parent
|
||||
height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching
|
||||
}
|
||||
|
||||
|
||||
// COMPONENT MIXINS
|
||||
// --------------------------------------------------
|
||||
|
||||
// Horizontal dividers
|
||||
// -------------------------
|
||||
// Dividers (basically an hr) within dropdowns and nav lists
|
||||
@mixin nav-divider($color: #e5e5e5) {
|
||||
height: 1px;
|
||||
margin: (($line-height-computed / 2) - 1) 0;
|
||||
overflow: hidden;
|
||||
background-color: $color;
|
||||
}
|
||||
|
||||
// Panels
|
||||
// -------------------------
|
||||
@mixin panel-variant($border, $heading-text-color, $heading-bg-color, $heading-border) {
|
||||
border-color: $border;
|
||||
|
||||
& > .panel-heading {
|
||||
color: $heading-text-color;
|
||||
background-color: $heading-bg-color;
|
||||
border-color: $heading-border;
|
||||
|
||||
+ .panel-collapse .panel-body {
|
||||
border-top-color: $border;
|
||||
}
|
||||
}
|
||||
& > .panel-footer {
|
||||
+ .panel-collapse .panel-body {
|
||||
border-bottom-color: $border;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Alerts
|
||||
// -------------------------
|
||||
@mixin alert-variant($background, $border, $text-color) {
|
||||
background-color: $background;
|
||||
border-color: $border;
|
||||
color: $text-color;
|
||||
|
||||
hr {
|
||||
border-top-color: darken($border, 5%);
|
||||
}
|
||||
.alert-link {
|
||||
color: darken($text-color, 10%);
|
||||
}
|
||||
}
|
||||
|
||||
// Tables
|
||||
// -------------------------
|
||||
@mixin table-row-variant($state, $background) {
|
||||
// Exact selectors below required to override `.table-striped` and prevent
|
||||
// inheritance to nested tables.
|
||||
.table > thead > tr,
|
||||
.table > tbody > tr,
|
||||
.table > tfoot > tr {
|
||||
> td.#{$state},
|
||||
> th.#{$state},
|
||||
&.#{$state} > td,
|
||||
&.#{$state} > th {
|
||||
background-color: $background;
|
||||
}
|
||||
}
|
||||
|
||||
// Hover states for `.table-hover`
|
||||
// Note: this is not available for cells or rows within `thead` or `tfoot`.
|
||||
.table-hover > tbody > tr {
|
||||
> td.#{$state}:hover,
|
||||
> th.#{$state}:hover,
|
||||
&.#{$state}:hover > td,
|
||||
&.#{$state}:hover > th {
|
||||
background-color: darken($background, 5%);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// List Groups
|
||||
// -------------------------
|
||||
@mixin list-group-item-variant($state, $background, $color) {
|
||||
.list-group-item-#{$state} {
|
||||
color: $color;
|
||||
background-color: $background;
|
||||
|
||||
// [converter] extracted a& to a.list-group-item-#{$state}
|
||||
}
|
||||
|
||||
a.list-group-item-#{$state} {
|
||||
color: $color;
|
||||
|
||||
.list-group-item-heading { color: inherit; }
|
||||
|
||||
&:hover,
|
||||
&:focus {
|
||||
color: $color;
|
||||
background-color: darken($background, 5%);
|
||||
}
|
||||
&.active,
|
||||
&.active:hover,
|
||||
&.active:focus {
|
||||
color: #fff;
|
||||
background-color: $color;
|
||||
border-color: $color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Button variants
|
||||
// -------------------------
|
||||
// Easily pump out default styles, as well as :hover, :focus, :active,
|
||||
// and disabled options for all buttons
|
||||
@mixin button-variant($color, $background, $border) {
|
||||
color: $color;
|
||||
background-color: $background;
|
||||
border-color: $border;
|
||||
|
||||
&:hover,
|
||||
&:focus,
|
||||
&:active,
|
||||
&.active {
|
||||
color: $color;
|
||||
background-color: darken($background, 8%);
|
||||
border-color: darken($border, 12%);
|
||||
}
|
||||
.open & { &.dropdown-toggle {
|
||||
color: $color;
|
||||
background-color: darken($background, 8%);
|
||||
border-color: darken($border, 12%);
|
||||
} }
|
||||
&:active,
|
||||
&.active {
|
||||
background-image: none;
|
||||
}
|
||||
.open & { &.dropdown-toggle {
|
||||
background-image: none;
|
||||
} }
|
||||
&.disabled,
|
||||
&[disabled],
|
||||
fieldset[disabled] & {
|
||||
&,
|
||||
&:hover,
|
||||
&:focus,
|
||||
&:active,
|
||||
&.active {
|
||||
background-color: $background;
|
||||
border-color: $border;
|
||||
}
|
||||
}
|
||||
|
||||
.badge {
|
||||
color: $background;
|
||||
background-color: $color;
|
||||
}
|
||||
}
|
||||
|
||||
// Button sizes
|
||||
// -------------------------
|
||||
@mixin button-size($padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) {
|
||||
padding: $padding-vertical $padding-horizontal;
|
||||
font-size: $font-size;
|
||||
line-height: $line-height;
|
||||
border-radius: $border-radius;
|
||||
}
|
||||
|
||||
// Pagination
|
||||
// -------------------------
|
||||
@mixin pagination-size($padding-vertical, $padding-horizontal, $font-size, $border-radius) {
|
||||
> li {
|
||||
> a,
|
||||
> span {
|
||||
padding: $padding-vertical $padding-horizontal;
|
||||
font-size: $font-size;
|
||||
}
|
||||
&:first-child {
|
||||
> a,
|
||||
> span {
|
||||
@include border-left-radius($border-radius);
|
||||
}
|
||||
}
|
||||
&:last-child {
|
||||
> a,
|
||||
> span {
|
||||
@include border-right-radius($border-radius);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Labels
|
||||
// -------------------------
|
||||
@mixin label-variant($color) {
|
||||
background-color: $color;
|
||||
&[href] {
|
||||
&:hover,
|
||||
&:focus {
|
||||
background-color: darken($color, 10%);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Contextual backgrounds
|
||||
// -------------------------
|
||||
// [converter] $parent hack
|
||||
@mixin bg-variant($parent, $color) {
|
||||
#{$parent} {
|
||||
background-color: $color;
|
||||
}
|
||||
a#{$parent}:hover {
|
||||
background-color: darken($color, 10%);
|
||||
}
|
||||
}
|
||||
|
||||
// Typography
|
||||
// -------------------------
|
||||
// [converter] $parent hack
|
||||
@mixin text-emphasis-variant($parent, $color) {
|
||||
#{$parent} {
|
||||
color: $color;
|
||||
}
|
||||
a#{$parent}:hover {
|
||||
color: darken($color, 10%);
|
||||
}
|
||||
}
|
||||
|
||||
// Navbar vertical align
|
||||
// -------------------------
|
||||
// Vertically center elements in the navbar.
|
||||
// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.
|
||||
@mixin navbar-vertical-align($element-height) {
|
||||
margin-top: (($navbar-height - $element-height) / 2);
|
||||
margin-bottom: (($navbar-height - $element-height) / 2);
|
||||
}
|
||||
|
||||
// Progress bars
|
||||
// -------------------------
|
||||
@mixin progress-bar-variant($color) {
|
||||
background-color: $color;
|
||||
.progress-striped & {
|
||||
@include gradient-striped();
|
||||
}
|
||||
}
|
||||
|
||||
// Responsive utilities
|
||||
// -------------------------
|
||||
// More easily include all the states for responsive-utilities.less.
|
||||
// [converter] $parent hack
|
||||
@mixin responsive-visibility($parent) {
|
||||
#{$parent} {
|
||||
display: block !important;
|
||||
}
|
||||
table#{$parent} { display: table; }
|
||||
tr#{$parent} { display: table-row !important; }
|
||||
th#{$parent},
|
||||
td#{$parent} { display: table-cell !important; }
|
||||
}
|
||||
|
||||
// [converter] $parent hack
|
||||
@mixin responsive-invisibility($parent) {
|
||||
#{$parent} {
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Grid System
|
||||
// -----------
|
||||
|
||||
// Centered container element
|
||||
@mixin container-fixed() {
|
||||
margin-right: auto;
|
||||
margin-left: auto;
|
||||
padding-left: ($grid-gutter-width / 2);
|
||||
padding-right: ($grid-gutter-width / 2);
|
||||
@include clearfix();
|
||||
}
|
||||
|
||||
// Creates a wrapper for a series of columns
|
||||
@mixin make-row($gutter: $grid-gutter-width) {
|
||||
margin-left: ($gutter / -2);
|
||||
margin-right: ($gutter / -2);
|
||||
@include clearfix();
|
||||
}
|
||||
|
||||
// Generate the extra small columns
|
||||
@mixin make-xs-column($columns, $gutter: $grid-gutter-width) {
|
||||
position: relative;
|
||||
float: left;
|
||||
width: percentage(($columns / $grid-columns));
|
||||
min-height: 1px;
|
||||
padding-left: ($gutter / 2);
|
||||
padding-right: ($gutter / 2);
|
||||
}
|
||||
@mixin make-xs-column-offset($columns) {
|
||||
@media (min-width: $screen-xs-min) {
|
||||
margin-left: percentage(($columns / $grid-columns));
|
||||
}
|
||||
}
|
||||
@mixin make-xs-column-push($columns) {
|
||||
@media (min-width: $screen-xs-min) {
|
||||
left: percentage(($columns / $grid-columns));
|
||||
}
|
||||
}
|
||||
@mixin make-xs-column-pull($columns) {
|
||||
@media (min-width: $screen-xs-min) {
|
||||
right: percentage(($columns / $grid-columns));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Generate the small columns
|
||||
@mixin make-sm-column($columns, $gutter: $grid-gutter-width) {
|
||||
position: relative;
|
||||
min-height: 1px;
|
||||
padding-left: ($gutter / 2);
|
||||
padding-right: ($gutter / 2);
|
||||
|
||||
@media (min-width: $screen-sm-min) {
|
||||
float: left;
|
||||
width: percentage(($columns / $grid-columns));
|
||||
}
|
||||
}
|
||||
@mixin make-sm-column-offset($columns) {
|
||||
@media (min-width: $screen-sm-min) {
|
||||
margin-left: percentage(($columns / $grid-columns));
|
||||
}
|
||||
}
|
||||
@mixin make-sm-column-push($columns) {
|
||||
@media (min-width: $screen-sm-min) {
|
||||
left: percentage(($columns / $grid-columns));
|
||||
}
|
||||
}
|
||||
@mixin make-sm-column-pull($columns) {
|
||||
@media (min-width: $screen-sm-min) {
|
||||
right: percentage(($columns / $grid-columns));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Generate the medium columns
|
||||
@mixin make-md-column($columns, $gutter: $grid-gutter-width) {
|
||||
position: relative;
|
||||
min-height: 1px;
|
||||
padding-left: ($gutter / 2);
|
||||
padding-right: ($gutter / 2);
|
||||
|
||||
@media (min-width: $screen-md-min) {
|
||||
float: left;
|
||||
width: percentage(($columns / $grid-columns));
|
||||
}
|
||||
}
|
||||
@mixin make-md-column-offset($columns) {
|
||||
@media (min-width: $screen-md-min) {
|
||||
margin-left: percentage(($columns / $grid-columns));
|
||||
}
|
||||
}
|
||||
@mixin make-md-column-push($columns) {
|
||||
@media (min-width: $screen-md-min) {
|
||||
left: percentage(($columns / $grid-columns));
|
||||
}
|
||||
}
|
||||
@mixin make-md-column-pull($columns) {
|
||||
@media (min-width: $screen-md-min) {
|
||||
right: percentage(($columns / $grid-columns));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Generate the large columns
|
||||
@mixin make-lg-column($columns, $gutter: $grid-gutter-width) {
|
||||
position: relative;
|
||||
min-height: 1px;
|
||||
padding-left: ($gutter / 2);
|
||||
padding-right: ($gutter / 2);
|
||||
|
||||
@media (min-width: $screen-lg-min) {
|
||||
float: left;
|
||||
width: percentage(($columns / $grid-columns));
|
||||
}
|
||||
}
|
||||
@mixin make-lg-column-offset($columns) {
|
||||
@media (min-width: $screen-lg-min) {
|
||||
margin-left: percentage(($columns / $grid-columns));
|
||||
}
|
||||
}
|
||||
@mixin make-lg-column-push($columns) {
|
||||
@media (min-width: $screen-lg-min) {
|
||||
left: percentage(($columns / $grid-columns));
|
||||
}
|
||||
}
|
||||
@mixin make-lg-column-pull($columns) {
|
||||
@media (min-width: $screen-lg-min) {
|
||||
right: percentage(($columns / $grid-columns));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Framework grid generation
|
||||
//
|
||||
// Used only by Bootstrap to generate the correct number of grid classes given
|
||||
// any value of `$grid-columns`.
|
||||
|
||||
// [converter] This is defined recursively in LESS, but Sass supports real loops
|
||||
@mixin make-grid-columns() {
|
||||
$list: '';
|
||||
$i: 1;
|
||||
$list: ".col-xs-#{$i}, .col-sm-#{$i}, .col-md-#{$i}, .col-lg-#{$i}";
|
||||
@for $i from (1 + 1) through $grid-columns {
|
||||
$list: "#{$list}, .col-xs-#{$i}, .col-sm-#{$i}, .col-md-#{$i}, .col-lg-#{$i}";
|
||||
}
|
||||
#{$list} {
|
||||
position: relative;
|
||||
// Prevent columns from collapsing when empty
|
||||
min-height: 1px;
|
||||
// Inner gutter via padding
|
||||
padding-left: ($grid-gutter-width / 2);
|
||||
padding-right: ($grid-gutter-width / 2);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// [converter] This is defined recursively in LESS, but Sass supports real loops
|
||||
@mixin float-grid-columns($class) {
|
||||
$list: '';
|
||||
$i: 1;
|
||||
$list: ".col-#{$class}-#{$i}";
|
||||
@for $i from (1 + 1) through $grid-columns {
|
||||
$list: "#{$list}, .col-#{$class}-#{$i}";
|
||||
}
|
||||
#{$list} {
|
||||
float: left;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@mixin calc-grid-column($index, $class, $type) {
|
||||
@if ($type == width) and ($index > 0) {
|
||||
.col-#{$class}-#{$index} {
|
||||
width: percentage(($index / $grid-columns));
|
||||
}
|
||||
}
|
||||
@if ($type == push) {
|
||||
.col-#{$class}-push-#{$index} {
|
||||
left: percentage(($index / $grid-columns));
|
||||
}
|
||||
}
|
||||
@if ($type == pull) {
|
||||
.col-#{$class}-pull-#{$index} {
|
||||
right: percentage(($index / $grid-columns));
|
||||
}
|
||||
}
|
||||
@if ($type == offset) {
|
||||
.col-#{$class}-offset-#{$index} {
|
||||
margin-left: percentage(($index / $grid-columns));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// [converter] This is defined recursively in LESS, but Sass supports real loops
|
||||
@mixin loop-grid-columns($columns, $class, $type) {
|
||||
@for $i from 0 through $columns {
|
||||
@include calc-grid-column($i, $class, $type);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Create grid for specific class
|
||||
@mixin make-grid($class) {
|
||||
@include float-grid-columns($class);
|
||||
@include loop-grid-columns($grid-columns, $class, width);
|
||||
@include loop-grid-columns($grid-columns, $class, pull);
|
||||
@include loop-grid-columns($grid-columns, $class, push);
|
||||
@include loop-grid-columns($grid-columns, $class, offset);
|
||||
}
|
||||
|
||||
// Form validation states
|
||||
//
|
||||
// Used in forms.less to generate the form validation CSS for warnings, errors,
|
||||
// and successes.
|
||||
|
||||
@mixin form-control-validation($text-color: #555, $border-color: #ccc, $background-color: #f5f5f5) {
|
||||
// Color the label and help text
|
||||
.help-block,
|
||||
.control-label,
|
||||
.radio,
|
||||
.checkbox,
|
||||
.radio-inline,
|
||||
.checkbox-inline {
|
||||
color: $text-color;
|
||||
}
|
||||
// Set the border and box shadow on specific inputs to match
|
||||
.form-control {
|
||||
border-color: $border-color;
|
||||
@include box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work
|
||||
&:focus {
|
||||
border-color: darken($border-color, 10%);
|
||||
$shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten($border-color, 20%);
|
||||
@include box-shadow($shadow);
|
||||
}
|
||||
}
|
||||
// Set validation states also for addons
|
||||
.input-group-addon {
|
||||
color: $text-color;
|
||||
border-color: $border-color;
|
||||
background-color: $background-color;
|
||||
}
|
||||
// Optional feedback icon
|
||||
.form-control-feedback {
|
||||
color: $text-color;
|
||||
}
|
||||
}
|
||||
|
||||
// Form control focus state
|
||||
//
|
||||
// Generate a customized focus state and for any input with the specified color,
|
||||
// which defaults to the `$input-focus-border` variable.
|
||||
//
|
||||
// We highly encourage you to not customize the default value, but instead use
|
||||
// this to tweak colors on an as-needed basis. This aesthetic change is based on
|
||||
// WebKit's default styles, but applicable to a wider range of browsers. Its
|
||||
// usability and accessibility should be taken into account with any change.
|
||||
//
|
||||
// Example usage: change the default blue border and shadow to white for better
|
||||
// contrast against a dark gray background.
|
||||
|
||||
@mixin form-control-focus($color: $input-border-focus) {
|
||||
$color-rgba: rgba(red($color), green($color), blue($color), .6);
|
||||
&:focus {
|
||||
border-color: $color;
|
||||
outline: 0;
|
||||
@include box-shadow(inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px $color-rgba);
|
||||
}
|
||||
}
|
||||
|
||||
// Form control sizing
|
||||
//
|
||||
// Relative text size, padding, and border-radii changes for form controls. For
|
||||
// horizontal sizing, wrap controls in the predefined grid classes. `<select>`
|
||||
// element gets special love because it's special, and that's a fact!
|
||||
|
||||
// [converter] $parent hack
|
||||
@mixin input-size($parent, $input-height, $padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) {
|
||||
#{$parent} {
|
||||
height: $input-height;
|
||||
padding: $padding-vertical $padding-horizontal;
|
||||
font-size: $font-size;
|
||||
line-height: $line-height;
|
||||
border-radius: $border-radius;
|
||||
}
|
||||
|
||||
select#{$parent} {
|
||||
height: $input-height;
|
||||
line-height: $input-height;
|
||||
}
|
||||
|
||||
textarea#{$parent},
|
||||
select[multiple]#{$parent} {
|
||||
height: auto;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,833 @@
|
|||
// a flag to toggle asset pipeline / compass integration
|
||||
// defaults to true if twbs-font-path function is present (no function => twbs-font-path('') parsed as string == right side)
|
||||
// in Sass 3.3 this can be improved with: function-exists(twbs-font-path)
|
||||
$bootstrap-sass-asset-helper: (twbs-font-path("") != unquote('twbs-font-path("")')) !default;
|
||||
//
|
||||
// Variables
|
||||
// --------------------------------------------------
|
||||
|
||||
|
||||
//== Colors
|
||||
//
|
||||
//## Gray and brand colors for use across Bootstrap.
|
||||
|
||||
$gray-darker: lighten(#000, 13.5%) !default; // #222
|
||||
$gray-dark: lighten(#000, 20%) !default; // #333
|
||||
$gray: lighten(#000, 33.5%) !default; // #555
|
||||
$gray-light: lighten(#000, 60%) !default; // #999
|
||||
$gray-lighter: lighten(#000, 93.5%) !default; // #eee
|
||||
|
||||
$brand-primary: #47bab5 !default;
|
||||
$brand-success: #5cb85c !default;
|
||||
$brand-info: #5bc0de !default;
|
||||
$brand-warning: #f0ad4e !default;
|
||||
$brand-danger: #ed4c43 !default;
|
||||
|
||||
|
||||
//== Scaffolding
|
||||
//
|
||||
// ## Settings for some of the most global styles.
|
||||
|
||||
//** Background color for `<body>`.
|
||||
$body-bg: #fff !default;
|
||||
//** Global text color on `<body>`.
|
||||
$text-color: $gray-dark !default;
|
||||
|
||||
//** Global textual link color.
|
||||
$link-color: $brand-primary !default;
|
||||
//** Link hover color set via `darken()` function.
|
||||
$link-hover-color: darken($link-color, 15%) !default;
|
||||
|
||||
|
||||
//== Typography
|
||||
//
|
||||
//## Font, line-height, and color for body text, headings, and more.
|
||||
|
||||
$font-family-sans-serif: "Helvetica Neue", Helvetica, Arial, sans-serif !default;
|
||||
$font-family-serif: Georgia, "Times New Roman", Times, serif !default;
|
||||
//** Default monospace fonts for `<code>`, `<kbd>`, and `<pre>`.
|
||||
$font-family-monospace: Menlo, Monaco, Consolas, "Courier New", monospace !default;
|
||||
$font-family-base: $font-family-sans-serif !default;
|
||||
|
||||
$font-size-base: 14px !default;
|
||||
$font-size-large: ceil(($font-size-base * 1.25)) !default; // ~18px
|
||||
$font-size-small: ceil(($font-size-base * 0.85)) !default; // ~12px
|
||||
|
||||
$font-size-h1: floor(($font-size-base * 2.6)) !default; // ~36px
|
||||
$font-size-h2: floor(($font-size-base * 2.15)) !default; // ~30px
|
||||
$font-size-h3: ceil(($font-size-base * 1.7)) !default; // ~24px
|
||||
$font-size-h4: ceil(($font-size-base * 1.25)) !default; // ~18px
|
||||
$font-size-h5: $font-size-base !default;
|
||||
$font-size-h6: ceil(($font-size-base * 0.85)) !default; // ~12px
|
||||
|
||||
//** Unit-less `line-height` for use in components like buttons.
|
||||
$line-height-base: 1.428571429 !default; // 20/14
|
||||
//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.
|
||||
$line-height-computed: floor(($font-size-base * $line-height-base)) !default; // ~20px
|
||||
|
||||
//** By default, this inherits from the `<body>`.
|
||||
$headings-font-family: inherit !default;
|
||||
$headings-font-weight: 500 !default;
|
||||
$headings-line-height: 1.1 !default;
|
||||
$headings-color: inherit !default;
|
||||
|
||||
|
||||
//-- Iconography
|
||||
//
|
||||
//## Specify custom locations of the include Glyphicons icon font. Useful for those including Bootstrap via Bower.
|
||||
|
||||
$icon-font-path: "bootstrap/" !default;
|
||||
$icon-font-name: "glyphicons-halflings-regular" !default;
|
||||
$icon-font-svg-id: "glyphicons_halflingsregular" !default;
|
||||
|
||||
//== Components
|
||||
//
|
||||
//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).
|
||||
|
||||
$padding-base-vertical: 6px !default;
|
||||
$padding-base-horizontal: 12px !default;
|
||||
|
||||
$padding-large-vertical: 10px !default;
|
||||
$padding-large-horizontal: 16px !default;
|
||||
|
||||
$padding-small-vertical: 5px !default;
|
||||
$padding-small-horizontal: 10px !default;
|
||||
|
||||
$padding-xs-vertical: 1px !default;
|
||||
$padding-xs-horizontal: 5px !default;
|
||||
|
||||
$line-height-large: 1.33 !default;
|
||||
$line-height-small: 1.5 !default;
|
||||
|
||||
$border-radius-base: 4px !default;
|
||||
$border-radius-large: 6px !default;
|
||||
$border-radius-small: 3px !default;
|
||||
|
||||
//** Global color for active items (e.g., navs or dropdowns).
|
||||
$component-active-color: #fff !default;
|
||||
//** Global background color for active items (e.g., navs or dropdowns).
|
||||
$component-active-bg: $brand-primary !default;
|
||||
|
||||
//** Width of the `border` for generating carets that indicator dropdowns.
|
||||
$caret-width-base: 4px !default;
|
||||
//** Carets increase slightly in size for larger components.
|
||||
$caret-width-large: 5px !default;
|
||||
|
||||
|
||||
//== Tables
|
||||
//
|
||||
//## Customizes the `.table` component with basic values, each used across all table variations.
|
||||
|
||||
//** Padding for `<th>`s and `<td>`s.
|
||||
$table-cell-padding: 8px !default;
|
||||
//** Padding for cells in `.table-condensed`.
|
||||
$table-condensed-cell-padding: 5px !default;
|
||||
|
||||
//** Default background color used for all tables.
|
||||
$table-bg: transparent !default;
|
||||
//** Background color used for `.table-striped`.
|
||||
$table-bg-accent: #f9f9f9 !default;
|
||||
//** Background color used for `.table-hover`.
|
||||
$table-bg-hover: #f5f5f5 !default;
|
||||
$table-bg-active: $table-bg-hover !default;
|
||||
|
||||
//** Border color for table and cell borders.
|
||||
$table-border-color: #ddd !default;
|
||||
|
||||
|
||||
//== Buttons
|
||||
//
|
||||
//## For each of Bootstrap's buttons, define text, background and border color.
|
||||
|
||||
$btn-font-weight: normal !default;
|
||||
|
||||
$btn-default-color: #333 !default;
|
||||
$btn-default-bg: #fff !default;
|
||||
$btn-default-border: #ccc !default;
|
||||
|
||||
$btn-primary-color: #fff !default;
|
||||
$btn-primary-bg: $brand-primary !default;
|
||||
$btn-primary-border: darken($btn-primary-bg, 5%) !default;
|
||||
|
||||
$btn-success-color: #fff !default;
|
||||
$btn-success-bg: $brand-success !default;
|
||||
$btn-success-border: darken($btn-success-bg, 5%) !default;
|
||||
|
||||
$btn-info-color: #fff !default;
|
||||
$btn-info-bg: $brand-info !default;
|
||||
$btn-info-border: darken($btn-info-bg, 5%) !default;
|
||||
|
||||
$btn-warning-color: #fff !default;
|
||||
$btn-warning-bg: $brand-warning !default;
|
||||
$btn-warning-border: darken($btn-warning-bg, 5%) !default;
|
||||
|
||||
$btn-danger-color: #fff !default;
|
||||
$btn-danger-bg: $brand-danger !default;
|
||||
$btn-danger-border: darken($btn-danger-bg, 5%) !default;
|
||||
|
||||
$btn-link-disabled-color: $gray-light !default;
|
||||
|
||||
|
||||
//== Forms
|
||||
//
|
||||
//##
|
||||
|
||||
//** `<input>` background color
|
||||
$input-bg: #fff !default;
|
||||
//** `<input disabled>` background color
|
||||
$input-bg-disabled: $gray-lighter !default;
|
||||
|
||||
//** Text color for `<input>`s
|
||||
$input-color: $gray !default;
|
||||
//** `<input>` border color
|
||||
$input-border: #ccc !default;
|
||||
//** `<input>` border radius
|
||||
$input-border-radius: $border-radius-base !default;
|
||||
//** Border color for inputs on focus
|
||||
$input-border-focus: #66afe9 !default;
|
||||
|
||||
//** Placeholder text color
|
||||
$input-color-placeholder: $gray-light !default;
|
||||
|
||||
//** Default `.form-control` height
|
||||
$input-height-base: ($line-height-computed + ($padding-base-vertical * 2) + 2) !default;
|
||||
//** Large `.form-control` height
|
||||
$input-height-large: (ceil($font-size-large * $line-height-large) + ($padding-large-vertical * 2) + 2) !default;
|
||||
//** Small `.form-control` height
|
||||
$input-height-small: (floor($font-size-small * $line-height-small) + ($padding-small-vertical * 2) + 2) !default;
|
||||
|
||||
$legend-color: $gray-dark !default;
|
||||
$legend-border-color: #e5e5e5 !default;
|
||||
|
||||
//** Background color for textual input addons
|
||||
$input-group-addon-bg: $gray-lighter !default;
|
||||
//** Border color for textual input addons
|
||||
$input-group-addon-border-color: $input-border !default;
|
||||
|
||||
|
||||
//== Dropdowns
|
||||
//
|
||||
//## Dropdown menu container and contents.
|
||||
|
||||
//** Background for the dropdown menu.
|
||||
$dropdown-bg: #fff !default;
|
||||
//** Dropdown menu `border-color`.
|
||||
$dropdown-border: rgba(0,0,0,.15) !default;
|
||||
//** Dropdown menu `border-color` **for IE8**.
|
||||
$dropdown-fallback-border: #ccc !default;
|
||||
//** Divider color for between dropdown items.
|
||||
$dropdown-divider-bg: #e5e5e5 !default;
|
||||
|
||||
//** Dropdown link text color.
|
||||
$dropdown-link-color: $gray-dark !default;
|
||||
//** Hover color for dropdown links.
|
||||
$dropdown-link-hover-color: darken($gray-dark, 5%) !default;
|
||||
//** Hover background for dropdown links.
|
||||
$dropdown-link-hover-bg: #f5f5f5 !default;
|
||||
|
||||
//** Active dropdown menu item text color.
|
||||
$dropdown-link-active-color: $component-active-color !default;
|
||||
//** Active dropdown menu item background color.
|
||||
$dropdown-link-active-bg: $component-active-bg !default;
|
||||
|
||||
//** Disabled dropdown menu item background color.
|
||||
$dropdown-link-disabled-color: $gray-light !default;
|
||||
|
||||
//** Text color for headers within dropdown menus.
|
||||
$dropdown-header-color: $gray-light !default;
|
||||
|
||||
// Note: Deprecated $dropdown-caret-color as of v3.1.0
|
||||
$dropdown-caret-color: #000 !default;
|
||||
|
||||
|
||||
//-- Z-index master list
|
||||
//
|
||||
// Warning: Avoid customizing these values. They're used for a bird's eye view
|
||||
// of components dependent on the z-axis and are designed to all work together.
|
||||
//
|
||||
// Note: These variables are not generated into the Customizer.
|
||||
|
||||
$zindex-navbar: 1000 !default;
|
||||
$zindex-dropdown: 1000 !default;
|
||||
$zindex-popover: 1010 !default;
|
||||
$zindex-tooltip: 1030 !default;
|
||||
$zindex-navbar-fixed: 1030 !default;
|
||||
$zindex-modal-background: 1040 !default;
|
||||
$zindex-modal: 1050 !default;
|
||||
|
||||
|
||||
//== Media queries breakpoints
|
||||
//
|
||||
//## Define the breakpoints at which your layout will change, adapting to different screen sizes.
|
||||
|
||||
// Extra small screen / phone
|
||||
// Note: Deprecated $screen-xs and $screen-phone as of v3.0.1
|
||||
$screen-xs: 480px !default;
|
||||
$screen-xs-min: $screen-xs !default;
|
||||
$screen-phone: $screen-xs-min !default;
|
||||
|
||||
// Small screen / tablet
|
||||
// Note: Deprecated $screen-sm and $screen-tablet as of v3.0.1
|
||||
$screen-sm: 768px !default;
|
||||
$screen-sm-min: $screen-sm !default;
|
||||
$screen-tablet: $screen-sm-min !default;
|
||||
|
||||
// Medium screen / desktop
|
||||
// Note: Deprecated $screen-md and $screen-desktop as of v3.0.1
|
||||
$screen-md: 992px !default;
|
||||
$screen-md-min: $screen-md !default;
|
||||
$screen-desktop: $screen-md-min !default;
|
||||
|
||||
// Large screen / wide desktop
|
||||
// Note: Deprecated $screen-lg and $screen-lg-desktop as of v3.0.1
|
||||
$screen-lg: 1200px !default;
|
||||
$screen-lg-min: $screen-lg !default;
|
||||
$screen-lg-desktop: $screen-lg-min !default;
|
||||
|
||||
// So media queries don't overlap when required, provide a maximum
|
||||
$screen-xs-max: ($screen-sm-min - 1) !default;
|
||||
$screen-sm-max: ($screen-md-min - 1) !default;
|
||||
$screen-md-max: ($screen-lg-min - 1) !default;
|
||||
|
||||
|
||||
//== Grid system
|
||||
//
|
||||
//## Define your custom responsive grid.
|
||||
|
||||
//** Number of columns in the grid.
|
||||
$grid-columns: 12 !default;
|
||||
//** Padding between columns. Gets divided in half for the left and right.
|
||||
$grid-gutter-width: 30px !default;
|
||||
// Navbar collapse
|
||||
//** Point at which the navbar becomes uncollapsed.
|
||||
$grid-float-breakpoint: $screen-sm-min !default;
|
||||
//** Point at which the navbar begins collapsing.
|
||||
$grid-float-breakpoint-max: ($grid-float-breakpoint - 1) !default;
|
||||
|
||||
|
||||
//== Container sizes
|
||||
//
|
||||
//## Define the maximum width of `.container` for different screen sizes.
|
||||
|
||||
// Small screen / tablet
|
||||
$container-tablet: ((720px + $grid-gutter-width)) !default;
|
||||
//** For `$screen-sm-min` and up.
|
||||
$container-sm: $container-tablet !default;
|
||||
|
||||
// Medium screen / desktop
|
||||
$container-desktop: ((940px + $grid-gutter-width)) !default;
|
||||
//** For `$screen-md-min` and up.
|
||||
$container-md: $container-desktop !default;
|
||||
|
||||
// Large screen / wide desktop
|
||||
$container-large-desktop: ((1140px + $grid-gutter-width)) !default;
|
||||
//** For `$screen-lg-min` and up.
|
||||
$container-lg: $container-large-desktop !default;
|
||||
|
||||
|
||||
//== Navbar
|
||||
//
|
||||
//##
|
||||
|
||||
// Basics of a navbar
|
||||
$navbar-height: 50px !default;
|
||||
$navbar-margin-bottom: $line-height-computed !default;
|
||||
$navbar-border-radius: $border-radius-base !default;
|
||||
$navbar-padding-horizontal: floor(($grid-gutter-width / 2)) !default;
|
||||
$navbar-padding-vertical: (($navbar-height - $line-height-computed) / 2) !default;
|
||||
$navbar-collapse-max-height: 340px !default;
|
||||
|
||||
$navbar-default-color: #777 !default;
|
||||
$navbar-default-bg: #f8f8f8 !default;
|
||||
$navbar-default-border: darken($navbar-default-bg, 6.5%) !default;
|
||||
|
||||
// Navbar links
|
||||
$navbar-default-link-color: #777 !default;
|
||||
$navbar-default-link-hover-color: #333 !default;
|
||||
$navbar-default-link-hover-bg: transparent !default;
|
||||
$navbar-default-link-active-color: #555 !default;
|
||||
$navbar-default-link-active-bg: darken($navbar-default-bg, 6.5%) !default;
|
||||
$navbar-default-link-disabled-color: #ccc !default;
|
||||
$navbar-default-link-disabled-bg: transparent !default;
|
||||
|
||||
// Navbar brand label
|
||||
$navbar-default-brand-color: $navbar-default-link-color !default;
|
||||
$navbar-default-brand-hover-color: darken($navbar-default-brand-color, 10%) !default;
|
||||
$navbar-default-brand-hover-bg: transparent !default;
|
||||
|
||||
// Navbar toggle
|
||||
$navbar-default-toggle-hover-bg: #ddd !default;
|
||||
$navbar-default-toggle-icon-bar-bg: #888 !default;
|
||||
$navbar-default-toggle-border-color: #ddd !default;
|
||||
|
||||
|
||||
// Inverted navbar
|
||||
// Reset inverted navbar basics
|
||||
$navbar-inverse-color: $gray-light !default;
|
||||
$navbar-inverse-bg: #222 !default;
|
||||
$navbar-inverse-border: darken($navbar-inverse-bg, 10%) !default;
|
||||
|
||||
// Inverted navbar links
|
||||
$navbar-inverse-link-color: $gray-light !default;
|
||||
$navbar-inverse-link-hover-color: #fff !default;
|
||||
$navbar-inverse-link-hover-bg: transparent !default;
|
||||
$navbar-inverse-link-active-color: $navbar-inverse-link-hover-color !default;
|
||||
$navbar-inverse-link-active-bg: darken($navbar-inverse-bg, 10%) !default;
|
||||
$navbar-inverse-link-disabled-color: #444 !default;
|
||||
$navbar-inverse-link-disabled-bg: transparent !default;
|
||||
|
||||
// Inverted navbar brand label
|
||||
$navbar-inverse-brand-color: $navbar-inverse-link-color !default;
|
||||
$navbar-inverse-brand-hover-color: #fff !default;
|
||||
$navbar-inverse-brand-hover-bg: transparent !default;
|
||||
|
||||
// Inverted navbar toggle
|
||||
$navbar-inverse-toggle-hover-bg: #333 !default;
|
||||
$navbar-inverse-toggle-icon-bar-bg: #fff !default;
|
||||
$navbar-inverse-toggle-border-color: #333 !default;
|
||||
|
||||
|
||||
//== Navs
|
||||
//
|
||||
//##
|
||||
|
||||
//=== Shared nav styles
|
||||
$nav-link-padding: 10px 15px !default;
|
||||
$nav-link-hover-bg: $gray-lighter !default;
|
||||
|
||||
$nav-disabled-link-color: $gray-light !default;
|
||||
$nav-disabled-link-hover-color: $gray-light !default;
|
||||
|
||||
$nav-open-link-hover-color: #fff !default;
|
||||
|
||||
//== Tabs
|
||||
$nav-tabs-border-color: #ddd !default;
|
||||
|
||||
$nav-tabs-link-hover-border-color: $gray-lighter !default;
|
||||
|
||||
$nav-tabs-active-link-hover-bg: $body-bg !default;
|
||||
$nav-tabs-active-link-hover-color: $gray !default;
|
||||
$nav-tabs-active-link-hover-border-color: #ddd !default;
|
||||
|
||||
$nav-tabs-justified-link-border-color: #ddd !default;
|
||||
$nav-tabs-justified-active-link-border-color: $body-bg !default;
|
||||
|
||||
//== Pills
|
||||
$nav-pills-border-radius: $border-radius-base !default;
|
||||
$nav-pills-active-link-hover-bg: $component-active-bg !default;
|
||||
$nav-pills-active-link-hover-color: $component-active-color !default;
|
||||
|
||||
|
||||
//== Pagination
|
||||
//
|
||||
//##
|
||||
|
||||
$pagination-color: $link-color !default;
|
||||
$pagination-bg: #fff !default;
|
||||
$pagination-border: #ddd !default;
|
||||
|
||||
$pagination-hover-color: $link-hover-color !default;
|
||||
$pagination-hover-bg: $gray-lighter !default;
|
||||
$pagination-hover-border: #ddd !default;
|
||||
|
||||
$pagination-active-color: #fff !default;
|
||||
$pagination-active-bg: $brand-primary !default;
|
||||
$pagination-active-border: $brand-primary !default;
|
||||
|
||||
$pagination-disabled-color: $gray-light !default;
|
||||
$pagination-disabled-bg: #fff !default;
|
||||
$pagination-disabled-border: #ddd !default;
|
||||
|
||||
|
||||
//== Pager
|
||||
//
|
||||
//##
|
||||
|
||||
$pager-bg: $pagination-bg !default;
|
||||
$pager-border: $pagination-border !default;
|
||||
$pager-border-radius: 15px !default;
|
||||
|
||||
$pager-hover-bg: $pagination-hover-bg !default;
|
||||
|
||||
$pager-active-bg: $pagination-active-bg !default;
|
||||
$pager-active-color: $pagination-active-color !default;
|
||||
|
||||
$pager-disabled-color: $pagination-disabled-color !default;
|
||||
|
||||
|
||||
//== Jumbotron
|
||||
//
|
||||
//##
|
||||
|
||||
$jumbotron-padding: 30px !default;
|
||||
$jumbotron-color: inherit !default;
|
||||
$jumbotron-bg: $gray-lighter !default;
|
||||
$jumbotron-heading-color: inherit !default;
|
||||
$jumbotron-font-size: ceil(($font-size-base * 1.5)) !default;
|
||||
|
||||
|
||||
//== Form states and alerts
|
||||
//
|
||||
//## Define colors for form feedback states and, by default, alerts.
|
||||
|
||||
$state-success-text: #3c763d !default;
|
||||
$state-success-bg: #dff0d8 !default;
|
||||
$state-success-border: darken(adjust-hue($state-success-bg, -10), 5%) !default;
|
||||
|
||||
$state-info-text: #31708f !default;
|
||||
$state-info-bg: #d9edf7 !default;
|
||||
$state-info-border: darken(adjust-hue($state-info-bg, -10), 7%) !default;
|
||||
|
||||
$state-warning-text: #8a6d3b !default;
|
||||
$state-warning-bg: #fcf8e3 !default;
|
||||
$state-warning-border: darken(adjust-hue($state-warning-bg, -10), 5%) !default;
|
||||
|
||||
$state-danger-text: #a94442 !default;
|
||||
$state-danger-bg: #f2dede !default;
|
||||
$state-danger-border: darken(adjust-hue($state-danger-bg, -10), 5%) !default;
|
||||
|
||||
|
||||
//== Tooltips
|
||||
//
|
||||
//##
|
||||
|
||||
//** Tooltip max width
|
||||
$tooltip-max-width: 200px !default;
|
||||
//** Tooltip text color
|
||||
$tooltip-color: #fff !default;
|
||||
//** Tooltip background color
|
||||
$tooltip-bg: #000 !default;
|
||||
$tooltip-opacity: .9 !default;
|
||||
|
||||
//** Tooltip arrow width
|
||||
$tooltip-arrow-width: 5px !default;
|
||||
//** Tooltip arrow color
|
||||
$tooltip-arrow-color: $tooltip-bg !default;
|
||||
|
||||
|
||||
//== Popovers
|
||||
//
|
||||
//##
|
||||
|
||||
//** Popover body background color
|
||||
$popover-bg: #fff !default;
|
||||
//** Popover maximum width
|
||||
$popover-max-width: 276px !default;
|
||||
//** Popover border color
|
||||
$popover-border-color: rgba(0,0,0,.2) !default;
|
||||
//** Popover fallback border color
|
||||
$popover-fallback-border-color: #ccc !default;
|
||||
|
||||
//** Popover title background color
|
||||
$popover-title-bg: darken($popover-bg, 3%) !default;
|
||||
|
||||
//** Popover arrow width
|
||||
$popover-arrow-width: 10px !default;
|
||||
//** Popover arrow color
|
||||
$popover-arrow-color: #fff !default;
|
||||
|
||||
//** Popover outer arrow width
|
||||
$popover-arrow-outer-width: ($popover-arrow-width + 1) !default;
|
||||
//** Popover outer arrow color
|
||||
$popover-arrow-outer-color: fadein($popover-border-color, 5%) !default;
|
||||
//** Popover outer arrow fallback color
|
||||
$popover-arrow-outer-fallback-color: darken($popover-fallback-border-color, 20%) !default;
|
||||
|
||||
|
||||
//== Labels
|
||||
//
|
||||
//##
|
||||
|
||||
//** Default label background color
|
||||
$label-default-bg: $gray-light !default;
|
||||
//** Primary label background color
|
||||
$label-primary-bg: $brand-primary !default;
|
||||
//** Success label background color
|
||||
$label-success-bg: $brand-success !default;
|
||||
//** Info label background color
|
||||
$label-info-bg: $brand-info !default;
|
||||
//** Warning label background color
|
||||
$label-warning-bg: $brand-warning !default;
|
||||
//** Danger label background color
|
||||
$label-danger-bg: $brand-danger !default;
|
||||
|
||||
//** Default label text color
|
||||
$label-color: #fff !default;
|
||||
//** Default text color of a linked label
|
||||
$label-link-hover-color: #fff !default;
|
||||
|
||||
|
||||
//== Modals
|
||||
//
|
||||
//##
|
||||
|
||||
//** Padding applied to the modal body
|
||||
$modal-inner-padding: 20px !default;
|
||||
|
||||
//** Padding applied to the modal title
|
||||
$modal-title-padding: 15px !default;
|
||||
//** Modal title line-height
|
||||
$modal-title-line-height: $line-height-base !default;
|
||||
|
||||
//** Background color of modal content area
|
||||
$modal-content-bg: #fff !default;
|
||||
//** Modal content border color
|
||||
$modal-content-border-color: rgba(0,0,0,.2) !default;
|
||||
//** Modal content border color **for IE8**
|
||||
$modal-content-fallback-border-color: #999 !default;
|
||||
|
||||
//** Modal backdrop background color
|
||||
$modal-backdrop-bg: #000 !default;
|
||||
//** Modal backdrop opacity
|
||||
$modal-backdrop-opacity: .5 !default;
|
||||
//** Modal header border color
|
||||
$modal-header-border-color: #e5e5e5 !default;
|
||||
//** Modal footer border color
|
||||
$modal-footer-border-color: $modal-header-border-color !default;
|
||||
|
||||
$modal-lg: 900px !default;
|
||||
$modal-md: 600px !default;
|
||||
$modal-sm: 300px !default;
|
||||
|
||||
|
||||
//== Alerts
|
||||
//
|
||||
//## Define alert colors, border radius, and padding.
|
||||
|
||||
$alert-padding: 15px !default;
|
||||
$alert-border-radius: $border-radius-base !default;
|
||||
$alert-link-font-weight: bold !default;
|
||||
|
||||
$alert-success-bg: $state-success-bg !default;
|
||||
$alert-success-text: $state-success-text !default;
|
||||
$alert-success-border: $state-success-border !default;
|
||||
|
||||
$alert-info-bg: $state-info-bg !default;
|
||||
$alert-info-text: $state-info-text !default;
|
||||
$alert-info-border: $state-info-border !default;
|
||||
|
||||
$alert-warning-bg: $state-warning-bg !default;
|
||||
$alert-warning-text: $state-warning-text !default;
|
||||
$alert-warning-border: $state-warning-border !default;
|
||||
|
||||
$alert-danger-bg: $state-danger-bg !default;
|
||||
$alert-danger-text: $state-danger-text !default;
|
||||
$alert-danger-border: $state-danger-border !default;
|
||||
|
||||
|
||||
//== Progress bars
|
||||
//
|
||||
//##
|
||||
|
||||
//** Background color of the whole progress component
|
||||
$progress-bg: #f5f5f5 !default;
|
||||
//** Progress bar text color
|
||||
$progress-bar-color: #fff !default;
|
||||
|
||||
//** Default progress bar color
|
||||
$progress-bar-bg: $brand-primary !default;
|
||||
//** Success progress bar color
|
||||
$progress-bar-success-bg: $brand-success !default;
|
||||
//** Warning progress bar color
|
||||
$progress-bar-warning-bg: $brand-warning !default;
|
||||
//** Danger progress bar color
|
||||
$progress-bar-danger-bg: $brand-danger !default;
|
||||
//** Info progress bar color
|
||||
$progress-bar-info-bg: $brand-info !default;
|
||||
|
||||
|
||||
//== List group
|
||||
//
|
||||
//##
|
||||
|
||||
//** Background color on `.list-group-item`
|
||||
$list-group-bg: #fff !default;
|
||||
//** `.list-group-item` border color
|
||||
$list-group-border: #ddd !default;
|
||||
//** List group border radius
|
||||
$list-group-border-radius: $border-radius-base !default;
|
||||
|
||||
//** Background color of single list elements on hover
|
||||
$list-group-hover-bg: #f5f5f5 !default;
|
||||
//** Text color of active list elements
|
||||
$list-group-active-color: $component-active-color !default;
|
||||
//** Background color of active list elements
|
||||
$list-group-active-bg: $component-active-bg !default;
|
||||
//** Border color of active list elements
|
||||
$list-group-active-border: $list-group-active-bg !default;
|
||||
$list-group-active-text-color: lighten($list-group-active-bg, 40%) !default;
|
||||
|
||||
$list-group-link-color: #555 !default;
|
||||
$list-group-link-heading-color: #333 !default;
|
||||
|
||||
|
||||
//== Panels
|
||||
//
|
||||
//##
|
||||
|
||||
$panel-bg: #fff !default;
|
||||
$panel-body-padding: 15px !default;
|
||||
$panel-border-radius: $border-radius-base !default;
|
||||
|
||||
//** Border color for elements within panels
|
||||
$panel-inner-border: #ddd !default;
|
||||
$panel-footer-bg: #f5f5f5 !default;
|
||||
|
||||
$panel-default-text: $gray-dark !default;
|
||||
$panel-default-border: #ddd !default;
|
||||
$panel-default-heading-bg: #f5f5f5 !default;
|
||||
|
||||
$panel-primary-text: #fff !default;
|
||||
$panel-primary-border: $brand-primary !default;
|
||||
$panel-primary-heading-bg: $brand-primary !default;
|
||||
|
||||
$panel-success-text: $state-success-text !default;
|
||||
$panel-success-border: $state-success-border !default;
|
||||
$panel-success-heading-bg: $state-success-bg !default;
|
||||
|
||||
$panel-info-text: $state-info-text !default;
|
||||
$panel-info-border: $state-info-border !default;
|
||||
$panel-info-heading-bg: $state-info-bg !default;
|
||||
|
||||
$panel-warning-text: $state-warning-text !default;
|
||||
$panel-warning-border: $state-warning-border !default;
|
||||
$panel-warning-heading-bg: $state-warning-bg !default;
|
||||
|
||||
$panel-danger-text: $state-danger-text !default;
|
||||
$panel-danger-border: $state-danger-border !default;
|
||||
$panel-danger-heading-bg: $state-danger-bg !default;
|
||||
|
||||
|
||||
//== Thumbnails
|
||||
//
|
||||
//##
|
||||
|
||||
//** Padding around the thumbnail image
|
||||
$thumbnail-padding: 4px !default;
|
||||
//** Thumbnail background color
|
||||
$thumbnail-bg: $body-bg !default;
|
||||
//** Thumbnail border color
|
||||
$thumbnail-border: #ddd !default;
|
||||
//** Thumbnail border radius
|
||||
$thumbnail-border-radius: $border-radius-base !default;
|
||||
|
||||
//** Custom text color for thumbnail captions
|
||||
$thumbnail-caption-color: $text-color !default;
|
||||
//** Padding around the thumbnail caption
|
||||
$thumbnail-caption-padding: 9px !default;
|
||||
|
||||
|
||||
//== Wells
|
||||
//
|
||||
//##
|
||||
|
||||
$well-bg: #f5f5f5 !default;
|
||||
$well-border: darken($well-bg, 7%) !default;
|
||||
|
||||
|
||||
//== Badges
|
||||
//
|
||||
//##
|
||||
|
||||
$badge-color: #fff !default;
|
||||
//** Linked badge text color on hover
|
||||
$badge-link-hover-color: #fff !default;
|
||||
$badge-bg: $gray-light !default;
|
||||
|
||||
//** Badge text color in active nav link
|
||||
$badge-active-color: $link-color !default;
|
||||
//** Badge background color in active nav link
|
||||
$badge-active-bg: #fff !default;
|
||||
|
||||
$badge-font-weight: bold !default;
|
||||
$badge-line-height: 1 !default;
|
||||
$badge-border-radius: 10px !default;
|
||||
|
||||
|
||||
//== Breadcrumbs
|
||||
//
|
||||
//##
|
||||
|
||||
$breadcrumb-padding-vertical: 8px !default;
|
||||
$breadcrumb-padding-horizontal: 15px !default;
|
||||
//** Breadcrumb background color
|
||||
$breadcrumb-bg: #f5f5f5 !default;
|
||||
//** Breadcrumb text color
|
||||
$breadcrumb-color: #ccc !default;
|
||||
//** Text color of current page in the breadcrumb
|
||||
$breadcrumb-active-color: $gray-light !default;
|
||||
//** Textual separator for between breadcrumb elements
|
||||
$breadcrumb-separator: "/" !default;
|
||||
|
||||
|
||||
//== Carousel
|
||||
//
|
||||
//##
|
||||
|
||||
$carousel-text-shadow: 0 1px 2px rgba(0,0,0,.6) !default;
|
||||
|
||||
$carousel-control-color: #fff !default;
|
||||
$carousel-control-width: 15% !default;
|
||||
$carousel-control-opacity: .5 !default;
|
||||
$carousel-control-font-size: 20px !default;
|
||||
|
||||
$carousel-indicator-active-bg: #fff !default;
|
||||
$carousel-indicator-border-color: #fff !default;
|
||||
|
||||
$carousel-caption-color: #fff !default;
|
||||
|
||||
|
||||
//== Close
|
||||
//
|
||||
//##
|
||||
|
||||
$close-font-weight: bold !default;
|
||||
$close-color: #000 !default;
|
||||
$close-text-shadow: 0 1px 0 #fff !default;
|
||||
|
||||
|
||||
//== Code
|
||||
//
|
||||
//##
|
||||
|
||||
$code-color: #c7254e !default;
|
||||
$code-bg: #f9f2f4 !default;
|
||||
|
||||
$kbd-color: #fff !default;
|
||||
$kbd-bg: #333 !default;
|
||||
|
||||
$pre-bg: #f5f5f5 !default;
|
||||
$pre-color: $gray-dark !default;
|
||||
$pre-border-color: #ccc !default;
|
||||
$pre-scrollable-max-height: 340px !default;
|
||||
|
||||
|
||||
//== Type
|
||||
//
|
||||
//##
|
||||
|
||||
//** Text muted color
|
||||
$text-muted: $gray-light !default;
|
||||
//** Abbreviations and acronyms border color
|
||||
$abbr-border-color: $gray-light !default;
|
||||
//** Headings small color
|
||||
$headings-small-color: $gray-light !default;
|
||||
//** Blockquote small color
|
||||
$blockquote-small-color: $gray-light !default;
|
||||
//** Blockquote font size
|
||||
$blockquote-font-size: ($font-size-base * 1.25) !default;
|
||||
//** Blockquote border color
|
||||
$blockquote-border-color: $gray-lighter !default;
|
||||
//** Page header border color
|
||||
$page-header-border-color: $gray-lighter !default;
|
||||
|
||||
|
||||
//== Miscellaneous
|
||||
//
|
||||
//##
|
||||
|
||||
//** Horizontal line color.
|
||||
$hr-border: $gray-lighter !default;
|
||||
|
||||
//** Horizontal offset for forms and lists.
|
||||
$component-offset-horizontal: 180px !default;
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,7 @@
|
|||
module ActionDispatch
|
||||
class Request
|
||||
def original_url
|
||||
original_fullpath
|
||||
end
|
||||
end
|
||||
end
|
|
@ -0,0 +1,482 @@
|
|||
# encoding: utf-8
|
||||
require 'rubyXL'
|
||||
|
||||
class Admin::EventAnnsController < OrbitAdminController
|
||||
include Admin::EventAnnsHelper
|
||||
before_action ->(module_app = @app_title) { set_variables module_app }
|
||||
before_action :set_bulletin, only: [:edit, :destroy]
|
||||
before_action :load_access_level, :load_settings
|
||||
|
||||
def initialize
|
||||
super
|
||||
@app_title = "event_ann"
|
||||
end
|
||||
|
||||
def index
|
||||
BulletinEvent.remove_expired_status
|
||||
@tags = @module_app.tags
|
||||
@table_fields = [:status, :category, :title,"event_anns.event_date", "event_anns.start_date", "event_anns.end_date", :last_modified]
|
||||
@current_user = current_user
|
||||
if EventAnnSetting.first.is_display_edit_only && !current_user.is_admin? && !current_user.is_manager?(@module_app)
|
||||
current_user_is_sub_manager = !current_user.is_manager?(@module_app) && (current_user.is_sub_manager?(@module_app) || current_user.is_sub_manager_with_role?(@module_app)) rescue false
|
||||
if current_user_is_sub_manager
|
||||
@categories = current_user.approved_categories.select{|c| c.module_app_id == @module_app.id} rescue []
|
||||
@filter_fields = filter_fields(@categories, @tags)
|
||||
@bulletin_events = BulletinEvent.where(:create_user_id=>current_user.id,:title.ne => "",:is_preview.in=>[false,nil])
|
||||
.order_by(sort)
|
||||
.with_categories(filters("category"))
|
||||
.with_tags(filters("tag"))
|
||||
.with_status(filters("status"))
|
||||
else
|
||||
@bulletin_events = BulletinEvent.where(:uid=>nil)
|
||||
@categories = @module_app.categories.enabled
|
||||
@filter_fields = filter_fields(@categories, @tags)
|
||||
end
|
||||
else
|
||||
@categories = @module_app.categories.enabled
|
||||
@filter_fields = filter_fields(@categories, @tags)
|
||||
@bulletin_events = BulletinEvent.where(:title.ne => "",:is_preview.in=>[false,nil])
|
||||
.order_by(sort)
|
||||
.with_categories(filters("category"))
|
||||
.with_tags(filters("tag"))
|
||||
.with_status(filters("status"))
|
||||
end
|
||||
@bulletin_events = search_data(@bulletin_events,[:title]).page(params[:page]).per(10)
|
||||
|
||||
if request.xhr?
|
||||
render :partial => "index"
|
||||
end
|
||||
end
|
||||
|
||||
def feed
|
||||
@table_feed_fields = ["event_ann.feed_name", :tags, "event_ann.rssfeed", "event_ann.jsonfeed"]
|
||||
@feeds = BulletinFeedEvent.all.asc(:created_at)
|
||||
|
||||
end
|
||||
def generate_iframe_url
|
||||
iframe_params = params.require(:iframe).permit!
|
||||
uids = iframe_params['member_ids'].to_a.map{|m_id| MemberProfile.find(m_id).uid rescue nil}.select{|uid| !uid.nil?}
|
||||
url_params = iframe_params.except(:member_ids)
|
||||
url_params['uids'] = uids if uids != []
|
||||
render :text => '/xhr/panel/event_ann/widget/sync_data?'+url_params.to_param
|
||||
end
|
||||
def settings
|
||||
@setting = @event_ann_setting
|
||||
roles = Role.all
|
||||
@sorted_members = roles.inject({}) do |members,role|
|
||||
members_for_role = role.member_profiles.select{|m| (m.user.nil? ? false : m.user.approved)}
|
||||
members[role] = members_for_role
|
||||
members
|
||||
end
|
||||
@sorted_members['no_role'] = MemberProfile.any_in(:role_ids=>[nil,[]]).select{|m| (m.user.nil? ? false : m.user.approved)}
|
||||
@unapproved_members = User.where(:approved => false).map{|u| u.member_profile}
|
||||
end
|
||||
|
||||
def import
|
||||
end
|
||||
|
||||
def excel_format
|
||||
respond_to do |format|
|
||||
format.xlsx {
|
||||
response.headers['Content-Disposition'] = 'attachment; filename="event_ann_import_format.xlsx"'
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
def export_excel
|
||||
@event_anns = BulletinEvent.all.desc(:created_at)
|
||||
respond_to do |format|
|
||||
format.xlsx {
|
||||
response.headers['Content-Disposition'] = 'attachment; filename="event_ann_export.xlsx"'
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
def import_from_xml
|
||||
download_tmp_xml params["import_xml"]
|
||||
import_from_tmp_xml File.read(File.join(Rails.root, "tmp", "ann_cc_ntu.xml"))
|
||||
redirect_to admin_event_anns_path
|
||||
end
|
||||
|
||||
def import
|
||||
end
|
||||
|
||||
|
||||
def import_from_wp
|
||||
import_from_wordpress params["import_xml"].tempfile
|
||||
redirect_to admin_event_anns_path
|
||||
end
|
||||
|
||||
def importeanns
|
||||
workbook = RubyXL::Parser.parse(params["import_file"].tempfile)
|
||||
categories = @module_app.categories.asc(:created_at).to_a
|
||||
tags = @module_app.tags.asc(:created_at).to_a
|
||||
sheet = workbook[0]
|
||||
if sheet.count <= 503
|
||||
sheet.each_with_index do |row, i|
|
||||
next if i < 3
|
||||
v = row.cells.first.value
|
||||
next if v == "" || v.nil?
|
||||
import_this_event_ann(row, categories, tags)
|
||||
end
|
||||
redirect_to admin_event_anns_path
|
||||
else
|
||||
redirect_to admin_event_anns_path(:error => "1")
|
||||
end
|
||||
end
|
||||
|
||||
def createsettings
|
||||
setting = EventAnnSetting.new(settings_params)
|
||||
setting.save
|
||||
redirect_to admin_event_ann_settings_path
|
||||
end
|
||||
|
||||
def updatesettings
|
||||
setting = @event_ann_setting
|
||||
ids = params['event_ann_setting']['event_anns_status_settings'].to_a.collect do |i,v|
|
||||
v['_id']
|
||||
end.compact
|
||||
EventAnnsStatusSetting.where(:id.nin=>ids).destroy
|
||||
setting.update_attributes(settings_params)
|
||||
setting.save
|
||||
redirect_to admin_event_ann_settings_path
|
||||
end
|
||||
|
||||
def feedform
|
||||
if params[:type] == "new"
|
||||
@event_ann_feed = BulletinFeedEvent.new
|
||||
render :partial => "feed_form"
|
||||
else params[:type] == "edit"
|
||||
@event_ann_feed = BulletinFeedEvent.find(params[:id])
|
||||
render :partial => "edit_feed_form"
|
||||
end
|
||||
end
|
||||
|
||||
def createfeed
|
||||
event_ann_feed = BulletinFeedEvent.new(feed_params)
|
||||
event_ann_feed.save
|
||||
feeds = BulletinFeedEvent.all.asc(:created_at)
|
||||
render :partial => "feed", :collection => feeds
|
||||
end
|
||||
|
||||
def updatefeed
|
||||
ann_feed = BulletinFeedEvent.find(params[:id])
|
||||
ann_feed.update_attributes(feed_params)
|
||||
ann_feed.save
|
||||
feeds = BulletinFeedEvent.all.asc(:created_at)
|
||||
render :partial => "feed", :collection => feeds
|
||||
end
|
||||
|
||||
def deletefeed
|
||||
ann_feed = BulletinFeedEvent.find(params[:id])
|
||||
ann_feed.destroy
|
||||
feeds = BulletinFeedEvent.all.asc(:created_at)
|
||||
render :partial => "feed", :collection => feeds
|
||||
end
|
||||
|
||||
def new
|
||||
@tags = @module_app.tags
|
||||
@statuses = []
|
||||
@bulletin_event = BulletinEvent.new
|
||||
@bulletin_event.email_sentdate = Time.now
|
||||
@reach_limit = @bulletin_event.check_status_limit(current_user,true)
|
||||
if defined? Calendar
|
||||
categories = user_authenticated_categories rescue ['all']
|
||||
if categories.first == "all"
|
||||
@calendar_categories = CalendarType.all
|
||||
else
|
||||
@calendar_categories = CalendarType.where(:category_id.in => categories) rescue []
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def create
|
||||
bps = bulletin_params
|
||||
bulletin_event = BulletinEvent.new(bps)
|
||||
if !bps['bulletin_event_links_attributes'].nil?
|
||||
bps['bulletin_event_links_attributes'].each do |idx,link|
|
||||
bps['bulletin_event_links_attributes'].delete(idx.to_s) if link['url'].blank?
|
||||
end
|
||||
end
|
||||
if((!EventAnnSetting.first.only_manager_can_edit_status) || (EventAnnSetting.first.only_manager_can_edit_status && (@current_user.is_admin? || @current_user.is_manager?(@module_app))) )
|
||||
if bps[:is_top] == "1" && !EventAnnSetting.check_limit_for_user(bulletin_event.create_user_id, bulletin_event.id)
|
||||
bps[:is_top] = "0"
|
||||
bps[:top_end_date] = nil
|
||||
end
|
||||
else
|
||||
bps[:is_top] = false
|
||||
bps[:is_hot] = false
|
||||
bps[:is_hidden] = false
|
||||
end
|
||||
|
||||
if !defined?(Calendar).nil?
|
||||
if bps[:add_to_calendar] == '0' && !bps[:event_id].blank?
|
||||
Event.find(bps[:event_id]).destroy rescue nil
|
||||
bps[:event_id] = nil
|
||||
elsif bps[:add_to_calendar] == '1'
|
||||
event = Event.find(bps[:event_id]) rescue Event.new(create_user_id: current_user.id)
|
||||
e_start = bps[:calendar_start_date].blank? ? bps[:postdate] : bps[:calendar_start_date]
|
||||
e_start = Time.now.to_datetime if e_start.blank?
|
||||
e_end = bps[:calendar_end_date].blank? ? bps[:deadline] : bps[:calendar_end_date]
|
||||
e_end = Time.now.to_datetime + 1.year if e_end.blank?
|
||||
e_eventdate = bps[:calendar_end_date].blank? ? bps[:eventdate] : bps[:calendar_event_date]
|
||||
e_eventdate = Time.now.to_datetime + 1.year if e_eventdate.blank?
|
||||
event.update_attributes(bulletin_id: bulletin_event.id,start: e_start,end: e_end,event_date:e_eventdate,update_user_id: current_user.id,all_day: bps[:calendar_all_day],calendar_type_id: bps[:calendar_type_id],title: bps[:title_translations][I18n.locale],note: bps[:subtitle_translations][I18n.locale],speaker: bps[:speaker_translations][I18n.locale],host: bps[:host_translations][I18n.locale],notes: bps[:notes_translations][I18n.locale])
|
||||
bps[:event_id] = event.id
|
||||
end
|
||||
end
|
||||
bulletin_event.create_user_id = current_user.id
|
||||
bulletin_event.update_user_id = current_user.id
|
||||
if EventAnnSetting.is_pro?
|
||||
if user_can_approve?
|
||||
bulletin_event.approved = true
|
||||
else
|
||||
send_notification_mail_to_managers(bulletin_event,"approval",I18n.locale)
|
||||
end
|
||||
else
|
||||
bulletin_event.approved = true
|
||||
end
|
||||
|
||||
bulletin_event.save
|
||||
build_email(bulletin_event,I18n.locale)
|
||||
redirect_to params['referer_url']
|
||||
end
|
||||
|
||||
def approve_bulletin
|
||||
id = params[:id]
|
||||
bulletin_event = BulletinEvent.find(id)
|
||||
if params["approved"] == "true"
|
||||
bulletin_event.approved = true
|
||||
bulletin_event.rejected = false
|
||||
bulletin_event.reapproval = false
|
||||
else
|
||||
bulletin_event.rejected = true
|
||||
bulletin_event.reapproval = false
|
||||
bulletin_event.rejection_reason = params["reason"]
|
||||
send_rejection_email(bulletin_event,I18n.locale)
|
||||
end
|
||||
bulletin_event.save
|
||||
redirect_to admin_event_anns_path
|
||||
end
|
||||
|
||||
def edit
|
||||
if can_edit_or_delete?(@bulletin_event)
|
||||
@reach_limit = @bulletin_event.check_status_limit(current_user,true)
|
||||
@tags = @module_app.tags
|
||||
@categories = @module_app.categories.enabled
|
||||
if defined? Calendar
|
||||
categories = user_authenticated_categories rescue ['all']
|
||||
if categories.first == "all"
|
||||
@calendar_categories = CalendarType.all
|
||||
else
|
||||
@calendar_categories = CalendarType.where(:category_id.in => categories) rescue []
|
||||
end
|
||||
end
|
||||
@statuses = []
|
||||
@bulletin_event.email_sentdate = Time.now if @bulletin_event.email_sent == false
|
||||
else
|
||||
render_401
|
||||
end
|
||||
end
|
||||
|
||||
def update
|
||||
uid = params[:id].split('-').last
|
||||
bulletin_event = BulletinEvent.find_by(:uid=>uid)
|
||||
bps = bulletin_params
|
||||
bps[:tags] = bps[:tags].blank? ? [] : bps[:tags]
|
||||
bps[:email_member_ids] = bps[:email_member_ids].blank? ? [] : bps[:email_member_ids]
|
||||
|
||||
if !bps['bulletin_event_links_attributes'].nil?
|
||||
bps['bulletin_event_links_attributes'].each do |idx,link|
|
||||
bps['bulletin_event_links_attributes'].delete(idx.to_s) if link['url'].blank?
|
||||
end
|
||||
end
|
||||
if((!EventAnnSetting.first.only_manager_can_edit_status) || (EventAnnSetting.first.only_manager_can_edit_status && (@current_user.is_admin? || @current_user.is_manager?(@module_app))) )
|
||||
if bps[:is_top] == "1" && !EventAnnSetting.check_limit_for_user(bulletin_event.create_user_id, bulletin_event.id)
|
||||
bps[:is_top] = "0"
|
||||
bps[:top_end_date] = nil
|
||||
end
|
||||
else
|
||||
bps[:is_top] = bulletin_event.is_top
|
||||
bps[:is_hot] = bulletin_event.is_hot
|
||||
bps[:is_hidden] = bulletin_event.is_hidden
|
||||
end
|
||||
if !defined?(Calendar).nil?
|
||||
if bps[:add_to_calendar] == '0' && !bps[:event_id].blank?
|
||||
Event.find(bps[:event_id]).destroy rescue nil
|
||||
bps[:event_id] = nil
|
||||
elsif bps[:add_to_calendar] == '1'
|
||||
event = Event.find(bps[:event_id]) rescue Event.new(create_user_id: current_user.id)
|
||||
e_start = bps[:calendar_start_date].blank? ? bps[:postdate] : bps[:calendar_start_date]
|
||||
e_start = Time.now.to_datetime if e_start.blank?
|
||||
e_end = bps[:calendar_end_date].blank? ? bps[:deadline] : bps[:calendar_end_date]
|
||||
e_end = Time.now.to_datetime + 1.year if e_end.blank?
|
||||
event.update_attributes(bulletin_id: bulletin_event.id,start: e_start,end: e_end,update_user_id: current_user.id,all_day: bps[:calendar_all_day],calendar_type_id: bps[:calendar_type_id],title: bps[:title_translations][I18n.locale],note: bps[:subtitle_translations][I18n.locale],speaker: bps[:speaker_translations][I18n.locale],host: bps[:host_translations][I18n.locale],notes: bps[:notes_translations][I18n.locale])
|
||||
bps[:event_id] = event.id
|
||||
end
|
||||
end
|
||||
bulletin_event.update_attributes(bps)
|
||||
bulletin_event.update_user_id = current_user.id
|
||||
if bulletin_event.rejected
|
||||
bulletin_event.reapproval = true
|
||||
bulletin_event.save
|
||||
send_notification_mail_to_managers(bulletin_event,"reapproval",I18n.locale)
|
||||
else
|
||||
bulletin_event.save
|
||||
end
|
||||
build_email(bulletin_event,I18n.locale)
|
||||
now_bulletin_page = BulletinEvent.where(:title.ne => "",:is_preview.in=>[false,nil])
|
||||
.order_by(sort).map(&:id).map.with_index.select{|v,i| v==bulletin_event.id}[0][1] rescue nil
|
||||
now_bulletin_page = now_bulletin_page.nil? ? 0 : ((now_bulletin_page+1).to_f/10).ceil
|
||||
redirect_to "/zh_tw/admin/event_anns?page=#{now_bulletin_page}"
|
||||
end
|
||||
|
||||
def destroy
|
||||
@bulletin_event.destroy
|
||||
redirect_to "/admin/event_anns"
|
||||
end
|
||||
|
||||
def delete
|
||||
if params[:ids]
|
||||
BulletinEvent.any_in(:uid => params[:ids]).destroy_all
|
||||
end
|
||||
redirect_to "/admin/event_anns"
|
||||
end
|
||||
|
||||
def preview
|
||||
if params['preview_type'].eql?('edit')
|
||||
bulletin_data = bulletin_params
|
||||
org_bulletin = BulletinEvent.find(params['bulletin_id'])
|
||||
bulletin_event = org_bulletin.clone
|
||||
bulletin_event.generate_uid
|
||||
bulletin_event.bulletin_event_files = []
|
||||
bulletin_event.bulletin_event_links = []
|
||||
if bulletin_data['image'].blank?
|
||||
bulletin_event.image = org_bulletin.image
|
||||
end
|
||||
|
||||
if !bulletin_data['bulletin_event_files_attributes'].blank?
|
||||
bulletin_data['bulletin_event_files_attributes'].each do |key, bulletin_event_file|
|
||||
next if !bulletin_event_file['_destroy'].blank?
|
||||
file = nil
|
||||
if bulletin_event_file['id'].blank?
|
||||
file = BulletinFileEvent.new(bulletin_event_file)
|
||||
file.bulletin_id = bulletin_event.id
|
||||
file.save
|
||||
else
|
||||
org_file = BulletinFileEvent.find(bulletin_event_file['id'])
|
||||
file = org_file.clone
|
||||
file.bulletin_id = bulletin_event.id
|
||||
file.file = org_file.file
|
||||
bulletin_event_file.delete('id')
|
||||
bulletin_event_file.delete('_destroy')
|
||||
file.update_attributes(bulletin_event_file)
|
||||
end
|
||||
|
||||
file.save
|
||||
bulletin_event.bulletin_event_files << file
|
||||
end
|
||||
end
|
||||
|
||||
if !bulletin_data['bulletin_event_links_attributes'].blank?
|
||||
bulletin_data['bulletin_event_links_attributes'].each do |key, bulletin_event_link|
|
||||
next if !bulletin_event_link['_destroy'].blank?
|
||||
|
||||
if bulletin_event_link['id'].blank?
|
||||
link = BulletinLinkEvent.new(bulletin_event_link)
|
||||
link.bulletin_id = bulletin_event.id
|
||||
else
|
||||
link = BulletinLinkEvent.find(bulletin_event_link['id']).clone
|
||||
link.bulletin_id = bulletin_event.id
|
||||
bulletin_event_link.delete('id')
|
||||
bulletin_event_link.delete('_destroy')
|
||||
link.update_attributes(bulletin_event_link)
|
||||
end
|
||||
|
||||
link.save
|
||||
bulletin_event.bulletin_event_links << link
|
||||
end
|
||||
end
|
||||
|
||||
bulletin_data.delete('bulletin_event_files_attributes')
|
||||
bulletin_data.delete('bulletin_event_links_attributes')
|
||||
bulletin_event.update_attributes(bulletin_data)
|
||||
else
|
||||
bulletin_event = BulletinEvent.new(bulletin_params)
|
||||
end
|
||||
|
||||
bulletin_event.is_preview = true
|
||||
bulletin_event.save
|
||||
render :text=>page_for_bulletin(bulletin_event) + "?preview=true"
|
||||
end
|
||||
|
||||
def destroy_preview
|
||||
bulletin_event = BulletinEvent.find_by(:uid=>params['uid'])
|
||||
if bulletin_event.is_preview
|
||||
bulletin_event.destroy
|
||||
end
|
||||
render :json=>{'destroy'=>bulletin_event.id.to_s}
|
||||
end
|
||||
|
||||
def build_email(bulletin_event,locale)
|
||||
if bulletin_event.email_sent and !bulletin_event.email_addresses.blank?
|
||||
if bulletin_event.email.nil?
|
||||
email = Email.new
|
||||
email.save
|
||||
email.deliver rescue nil
|
||||
bulletin_event.email_id = email.id
|
||||
bulletin_event.save
|
||||
end
|
||||
|
||||
is_sent = bulletin_event.email.is_sent
|
||||
is_sent = !params[:resend_mail].eql?("true") if !params[:resend_mail].blank?
|
||||
doc = Nokogiri::HTML(bulletin_event.title_translations[locale])
|
||||
title = doc.text.empty? ? 'no content' : doc.text
|
||||
|
||||
bulletin_event.email.update_attributes(
|
||||
:create_user=>current_user,
|
||||
:mail_sentdate=>bulletin_event.email_sentdate,
|
||||
:module_app=>@module_app,
|
||||
:mail_lang => locale,
|
||||
:mail_to=>bulletin_event.email_addresses,
|
||||
:mail_subject=>title,
|
||||
:template=>'event_anns/email',
|
||||
:template_data=>{
|
||||
"host" => request.host_with_port,
|
||||
"title" => title,
|
||||
"url" => page_for_bulletin(bulletin_event)
|
||||
},
|
||||
:is_sent=>is_sent
|
||||
)
|
||||
bulletin_event.email.deliver
|
||||
else
|
||||
bulletin_event.email.destroy if !bulletin_event.email.nil?
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def load_settings
|
||||
@event_ann_setting = EventAnnSetting.first rescue nil
|
||||
if @event_ann_setting.nil?
|
||||
@event_ann_setting = EventAnnSetting.create
|
||||
end
|
||||
end
|
||||
|
||||
def set_bulletin
|
||||
@bulletin_event = BulletinEvent.find(params[:id])
|
||||
end
|
||||
|
||||
def bulletin_params
|
||||
params[:bulletin_event][:email_sent] = params[:bulletin_event][:email_sent].nil? ? 0 : params[:bulletin_event][:email_sent]
|
||||
params.require(:bulletin_event).permit!
|
||||
end
|
||||
|
||||
def feed_params
|
||||
params.require(:bulletin_feed).permit!
|
||||
end
|
||||
|
||||
def settings_params
|
||||
params.require(:event_ann_setting).permit!
|
||||
end
|
||||
end
|
|
@ -0,0 +1,133 @@
|
|||
# encoding: utf-8
|
||||
class BulletinsEventController < ApplicationController
|
||||
before_filter :set_I18n
|
||||
|
||||
def get_bulletins
|
||||
page = Page.where(:module => "event_ann").first rescue nil
|
||||
|
||||
# 頁次
|
||||
page_num = params[:page_num].blank? ? 0 : params[:page_num].to_i
|
||||
# 每頁顯示的則數
|
||||
per_page = params[:per_page].blank? ? 10 : params[:per_page].to_i
|
||||
per_page = per_page > 0 ? per_page : 10
|
||||
|
||||
I18n.locale = :zh_tw
|
||||
if !params[:keyword].blank?
|
||||
keyword = Regexp.new(".*"+params[:keyword]+".*")
|
||||
bulletin_events = BulletinEvent.any_of({:title=>keyword},{:subtitle=>keyword},{:speaker=>keyword},{:host=>keyword},{:text=>keyword},{:notes=>keyword})
|
||||
else
|
||||
bulletin_events = BulletinEvent.all
|
||||
end
|
||||
|
||||
if !params[:category].blank?
|
||||
module_id = ModuleApp.where(:key=>"event_ann").first.id
|
||||
category = Regexp.new(".*"+params[:category]+".*")
|
||||
category_id = Category.where(:title => category, :module_app_id => module_id).first.id
|
||||
bulletin_events = bulletin_events.where(:category_id => category_id)
|
||||
else
|
||||
bulletin_events = bulletin_events
|
||||
end
|
||||
|
||||
bulletin_events = bulletin_events.where(:is_preview.in=>[false,nil])
|
||||
bulletin_events = bulletin_events.where(:approved.ne => false , :rejected.ne => true)
|
||||
bulletin_events = bulletin_events.where(:postdate.lt=>Time.now)
|
||||
bulletin_events = bulletin_events.desc( :is_top, :postdate).page(page_num).per(per_page)
|
||||
|
||||
bulletin_events = bulletin_events.collect do |b|
|
||||
image = request.protocol + request.host_with_port + b.image.url rescue nil
|
||||
|
||||
links = b.bulletin_event_links.collect do |bl|
|
||||
{
|
||||
"title" => bl.title_translations,
|
||||
"url" => bl.url
|
||||
}
|
||||
end rescue nil
|
||||
|
||||
files = b.bulletin_event_files.collect do |bf|
|
||||
file = request.protocol + request.host_with_port + bf.file.url rescue nil
|
||||
{
|
||||
"title" => bf.title_translations,
|
||||
"description" => bf.description_translations,
|
||||
"file" => file
|
||||
}
|
||||
end rescue nil
|
||||
|
||||
ts = b.tags.collect do |t|
|
||||
{
|
||||
"name" => t.name_translations
|
||||
}
|
||||
end rescue nil
|
||||
|
||||
text = {"en" => "", "zh_tw" => ""}
|
||||
text["en"] = (b.text_translations["en"].nil? ? "" :smart_convertor(b.text_translations["en"]))
|
||||
text["zh_tw"] = (b.text_translations["zh_tw"].nil? ? "" : smart_convertor(b.text_translations["zh_tw"]))
|
||||
|
||||
author = User.find(b.create_user_id).member_profile.name rescue ""
|
||||
|
||||
{
|
||||
"id" => b.id.to_s,
|
||||
"title" => b.title_translations,
|
||||
"subtitle" => b.subtitle_translations,
|
||||
"speaker" => b.speaker,
|
||||
"host" => b.host,
|
||||
"text" => text,
|
||||
"notes" => b.notes
|
||||
"postdate" => b.postdate,
|
||||
"deadline" => b.deadline,
|
||||
"eventdate" => b.eventdate,
|
||||
"category" => b.category.title_translations,
|
||||
"tags" => ts,
|
||||
"image" => image,
|
||||
"links" => links,
|
||||
"files" => files,
|
||||
"author" => author,
|
||||
"url" => "/#{I18n.locale.to_s + page.url}/#{b.to_param}"
|
||||
}
|
||||
|
||||
end
|
||||
|
||||
# 計算總筆數 Start
|
||||
if !params[:keyword].blank?
|
||||
keyword = Regexp.new(".*"+params[:keyword]+".*")
|
||||
bulletin_count = BulletinEvent.any_of({:title=>keyword},{:subtitle=>keyword},{:speaker=>keyword},{:host=>keyword},{:text=>keyword},{:notes=>keyword})
|
||||
else
|
||||
bulletin_count = BulletinEvent.all
|
||||
end
|
||||
bulletin_count = bulletin_count.where(:is_preview.in=>[false,nil])
|
||||
bulletin_count = bulletin_count.where(:approved.ne => false , :rejected.ne => true)
|
||||
bulletin_count = bulletin_count.where(:postdate.lt=>Time.now)
|
||||
total_pages = bulletin_count.count
|
||||
# End
|
||||
|
||||
render :json => {
|
||||
"bulletin_events" => bulletin_events,
|
||||
"bulletins_count" => bulletin_events.count,
|
||||
"page_num" => page_num,
|
||||
"total_pages" => total_pages,
|
||||
}.to_json
|
||||
end
|
||||
|
||||
def smart_convertor(text)
|
||||
html_string = text
|
||||
links = html_string.scan(/img.*?src="(.*?)"/i)
|
||||
links.each do |link|
|
||||
l = link.first
|
||||
new_link = nil
|
||||
if l.starts_with?("/")
|
||||
new_link = request.protocol + request.host_with_port + l
|
||||
elsif l.starts_with?("..")
|
||||
l1 = l.gsub("../","")
|
||||
new_link = request.protocol + request.host_with_port + "/" + l1
|
||||
end
|
||||
html_string = html_string.sub(l,new_link) if !new_link.nil?
|
||||
end
|
||||
return html_string
|
||||
end
|
||||
|
||||
protected
|
||||
|
||||
def set_I18n
|
||||
I18n.locale = params[:lang] if params[:lang].present?
|
||||
end
|
||||
|
||||
end
|
|
@ -0,0 +1,156 @@
|
|||
require "rss"
|
||||
class EventAnnFeedsController < ApplicationController
|
||||
include Admin::EventAnnsHelper
|
||||
def feed
|
||||
uid = params[:uid]
|
||||
eanns = get_event_anns(uid)
|
||||
render :json => eanns.to_json
|
||||
end
|
||||
|
||||
def rssfeed
|
||||
uid = params[:uid]
|
||||
@bf = BulletinFeedEvent.find_by(:uid => uid) rescue nil
|
||||
if !@bf.nil?
|
||||
tags = @bf.tag_ids
|
||||
if !tags.empty?
|
||||
@event_anns = BulletinEvent.can_display_and_sorted.is_approved.filter_by_tags(tags)
|
||||
end
|
||||
end
|
||||
respond_to do |format|
|
||||
format.html {redirect_to "/xhr/event_anns/rssfeed/#{@bf.uid}.rss"}
|
||||
format.rss
|
||||
end
|
||||
end
|
||||
|
||||
def feeds
|
||||
feeds = []
|
||||
BulletinFeedEvent.all.each do |bf|
|
||||
feed = {}
|
||||
feed["title_translations"] = bf.title_translations
|
||||
feed["uid"] = bf.uid
|
||||
feed["url"] = "#{request.base_url}/xhr/event_anns/feed/#{bf.uid}"
|
||||
feed["xml_url"] = "#{request.base_url}/xhr/event_anns/rssfeed/#{bf.uid}.rss"
|
||||
feed["tags"] = []
|
||||
bf.tag_ids.each do |t|
|
||||
tag = Tag.find(t)
|
||||
d = {}
|
||||
d["name_translations"] = tag.name_translations
|
||||
feed["tags"] << d
|
||||
end
|
||||
feeds << feed
|
||||
end
|
||||
render :json => {"feeds" => feeds}.to_json
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def smart_convertor(text)
|
||||
html_string = text
|
||||
links = html_string.scan(/img.*?src="(.*?)"/i)
|
||||
links = links + html_string.scan(/a.*?href="(.*?)"/i)
|
||||
links.uniq!
|
||||
links.each do |link|
|
||||
l = link.first
|
||||
new_link = nil
|
||||
if l.starts_with?("/")
|
||||
new_link = request.protocol + request.host_with_port + l
|
||||
elsif l.starts_with?("..")
|
||||
l1 = l.gsub("../","")
|
||||
new_link = request.protocol + request.host_with_port + "/" + l1
|
||||
end
|
||||
html_string = html_string.gsub(l,new_link) if !new_link.nil?
|
||||
end
|
||||
return html_string
|
||||
end
|
||||
|
||||
def get_event_anns(uid)
|
||||
bf = BulletinFeedEvent.find_by(:uid => uid) rescue nil
|
||||
startdt = params[:start]
|
||||
enddt = params[:end]
|
||||
dt = params[:date]
|
||||
if !bf.nil?
|
||||
tags = bf.tag_ids
|
||||
if !tags.empty?
|
||||
if !dt.nil?
|
||||
dt = DateTime.parse(dt)
|
||||
dtt = dt + 1.day
|
||||
event_anns = BulletinEvent.where(:postdate.gt => dt, :postdate.lt => dtt).can_display_and_sorted.is_approved.filter_by_tags(tags)
|
||||
elsif !startdt.nil? && enddt.nil?
|
||||
startdt = DateTime.parse(startdt)
|
||||
enddt = DateTime.now
|
||||
event_anns = BulletinEvent.where(:postdate.gt => startdt, :postdate.lt => enddt).can_display_and_sorted.is_approved.filter_by_tags(tags)
|
||||
elsif !startdt.nil? && !enddt.nil?
|
||||
startdt = DateTime.parse(startdt)
|
||||
enddt = DateTime.parse(enddt) + 1.day
|
||||
event_anns = BulletinEvent.where(:postdate.gt => startdt, :postdate.lt => enddt).can_display_and_sorted.is_approved.filter_by_tags(tags)
|
||||
else
|
||||
event_anns = BulletinEvent.all.can_display_and_sorted.is_approved.filter_by_tags(tags)
|
||||
end
|
||||
else
|
||||
event_anns = []
|
||||
end
|
||||
end
|
||||
all_eanns = []
|
||||
tag_names = []
|
||||
tag_ids = []
|
||||
event_anns.each do |eanns|
|
||||
user = User.find(eanns.create_user_id) rescue nil
|
||||
if !user.nil?
|
||||
author = user.member_profile && user.member_profile.name == "" ? user.user_name : user.member_profile.name
|
||||
else
|
||||
author = ""
|
||||
end
|
||||
a = {}
|
||||
a["id"] = eanns.uid
|
||||
a["title_translations"] = eanns.title_translations
|
||||
a["subtitle_translations"] = eanns.subtitle_translations
|
||||
a["speaker_translations"] = eanns.speaker_translations
|
||||
a["host_translations"] = eanns.host_translations
|
||||
a["text_translations"] = {}
|
||||
a["text_translations"]["en"] = smart_convertor(eanns.text_translations["en"]) if !eanns.text_translations["en"].blank?
|
||||
a["text_translations"]["zh_tw"] = smart_convertor(eanns.text_translations["zh_tw"]) if !eanns.text_translations["zh_tw"].blank?
|
||||
a["postdate"] = eanns.postdate
|
||||
a["image_description_translations"] = eanns.image_description_translations
|
||||
a["image"] = {}
|
||||
a["image"]["original"] = ("#{request.base_url}" + eanns.image.url rescue "")
|
||||
a["image"]["thumb"] = ("#{request.base_url}" + eanns.image.thumb.url rescue "")
|
||||
a["image"]["mobile"] = ("#{request.base_url}" + eanns.image.mobile.url rescue "")
|
||||
a["tags"] = []
|
||||
a["author"] = author
|
||||
a["params"] = eanns.to_param
|
||||
a["bulletin_event_links"] = []
|
||||
a["bulletin_event_files"] = []
|
||||
eanns.tags.each do |tag|
|
||||
if !tag_ids.include?(tag.id.to_s)
|
||||
tag_ids << tag.id.to_s
|
||||
tag_names << {"name_translations" => tag.name_translations}
|
||||
end
|
||||
a["tags"] << {"name_translations" => tag.name_translations}
|
||||
end
|
||||
eanns.bulletin_event_links.each do |bl|
|
||||
b = {}
|
||||
b["url"] = bl.url
|
||||
b["title_translations"] = bl.title_translations
|
||||
a["bulletin_event_links"] << b
|
||||
end
|
||||
eanns.bulletin_event_files.each do |bf|
|
||||
b = {}
|
||||
b["description_translations"] = bf.description_translations
|
||||
b["title_translations"] = bf.title_translations
|
||||
b["url"] = ("#{request.base_url}" + bf.file.url rescue "")
|
||||
a["bulletin_event_files"] << b
|
||||
end
|
||||
all_eanns << a
|
||||
end
|
||||
{
|
||||
"event_anns" => all_eanns,
|
||||
"tags" => tag_names
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,441 @@
|
|||
class EventAnnsController < ApplicationController
|
||||
include EventAnnsHelper
|
||||
def index
|
||||
BulletinEvent.remove_expired_status
|
||||
sorted,total_pages = get_sorted_event_ann
|
||||
eanns = sorted.collect do |a|
|
||||
if a["source-site"].blank?
|
||||
statuses = a.statuses_with_classname.collect do |status|
|
||||
{
|
||||
"status" => status["name"],
|
||||
"status-class" => "status-#{status['classname']}"
|
||||
}
|
||||
end
|
||||
locale = OrbitHelper.get_site_locale.to_s
|
||||
files = a.bulletin_event_files.map{|file| { "file_url" => file.file.url, "file_title" => (file.title.blank? ? File.basename(file.file.path) : file.title rescue '') } if file.enabled_for?(locale) } rescue []
|
||||
files.delete(nil)
|
||||
links = a.bulletin_event_links.map{|link| { "link_url" => link.url, "link_title" => (link.title.blank? ? link.url : link.title) } } rescue []
|
||||
author = User.find(a.create_user_id).member_profile.name rescue ""
|
||||
desc = a.image_description
|
||||
desc = (desc.blank? ? "event_ann image" : desc)
|
||||
link_to_show = a.is_external_link ? a.external_link : OrbitHelper.url_to_show(a.to_param)
|
||||
target = a.is_external_link ? "_blank" : "_self"
|
||||
doc = Nokogiri::HTML(a.title)
|
||||
title = doc.text.empty? ? 'no content' : doc.text
|
||||
{
|
||||
"department" => author,
|
||||
"bulletin_event_links" => links,
|
||||
"bulletin_event_files" => files,
|
||||
"title" => a.title,
|
||||
"source-site" => "",
|
||||
"source-site-title" => "",
|
||||
"source-site-link" => "",
|
||||
"subtitle" => a.subtitle,
|
||||
"speaker" => a.speaker,
|
||||
"host" => a.host,
|
||||
"statuses" => statuses,
|
||||
"category" => a.category.title,
|
||||
"postdate" => a.postdate,
|
||||
"author" => author,
|
||||
"is_top" => (a.is_top? ? 1 : 0),
|
||||
"link_to_show" => link_to_show+"\" title=\"#{title}\"",
|
||||
"target" => target,
|
||||
"img_src" => a.image.thumb.url || "/assets/event_ann-default.jpg",
|
||||
"img_description" => desc,
|
||||
"more" => t(:more_plus),
|
||||
"view_count" => a.view_count
|
||||
}
|
||||
else
|
||||
a
|
||||
end
|
||||
end
|
||||
#If no data , hide title&table
|
||||
if sorted.count == 0
|
||||
display = "hide"
|
||||
end
|
||||
# eanns = eanns.concat(feeds_anns)
|
||||
# total_pages = event_anns.total_pages
|
||||
|
||||
|
||||
{
|
||||
"event_anns" => eanns,
|
||||
"extras" => {
|
||||
"widget-title" =>t('event_ann.event_ann'),
|
||||
"title-head" => t('event_ann.table.title'),
|
||||
"date-head" => t('event_ann.table.date'),
|
||||
"status-head" => t('event_ann.table.status'),
|
||||
"author-head" => t('event_ann.table.author'),
|
||||
"subtitle-head" => t('event_ann.table.sub_title'),
|
||||
"speaker-head" => t('event_ann.table.speaker'),
|
||||
"host-head" => t('event_ann.table.host'),
|
||||
"category-head" => t('event_ann.table.category'),
|
||||
"link-head" => t('event_ann.table.link'),
|
||||
"file-head" => t('event_ann.table.file'),
|
||||
"view-count-head" => t('event_ann.table.view_count'),
|
||||
"display" => display,
|
||||
"department-head" => t('event_ann.table.department')
|
||||
},
|
||||
"total_pages" => total_pages
|
||||
}
|
||||
|
||||
end
|
||||
|
||||
def random_event_ann_widget
|
||||
pack_data(true)
|
||||
end
|
||||
|
||||
def widget
|
||||
pack_data()
|
||||
end
|
||||
|
||||
def tag_cloud
|
||||
ma = ModuleApp.where(:key => "event_ann").first
|
||||
temp = []
|
||||
ma.tags.each do |tag|
|
||||
t1 = tag.taggings.collect{|t| t.taggable_id.to_s}
|
||||
count = BulletinEvent.where(:id.in => t1).can_display_and_sorted.count
|
||||
temp << {
|
||||
"tag-name" => tag.name,
|
||||
"count" => count,
|
||||
"tag-url" => OrbitHelper.widget_more_url + "?tags[]=" + tag.id.to_s
|
||||
}
|
||||
end
|
||||
max = temp.max_by{|t| t["count"]}["count"]
|
||||
tags = []
|
||||
temp.each do |tag|
|
||||
if tag["count"] > 0
|
||||
percent = (tag["count"] * 100) / max
|
||||
font_size = ((percent / 10).round) + 16
|
||||
tag["font-size"] = font_size
|
||||
tags << tag
|
||||
end
|
||||
end
|
||||
{
|
||||
"tags" => tags,
|
||||
"extras" => {}
|
||||
}
|
||||
end
|
||||
|
||||
def pack_data(is_random=false)
|
||||
tags = OrbitHelper.widget_tags || []
|
||||
cats = OrbitHelper.widget_categories || []
|
||||
subpart = OrbitHelper.get_current_widget
|
||||
eanns_cache = EventAnnsCache.where(parent_id: subpart.id.to_s,locale: I18n.locale.to_s)
|
||||
widget_data_count = OrbitHelper.widget_data_count
|
||||
set_image_version_for_widget()
|
||||
devide_flag = (!(defined? SiteFeed).nil?)
|
||||
if eanns_cache.count != 1 || is_random
|
||||
page = Page.where(:module => "event_ann").first rescue nil
|
||||
BulletinEvent.remove_expired_status
|
||||
uid = OrbitHelper.params[:uid] rescue ""
|
||||
sorted_eanns = BulletinEvent.where(:title.nin => ["",nil],:is_preview.in=>[false,nil], :uid.ne => uid)
|
||||
.can_display_and_sorted.is_approved
|
||||
.filter_by_widget_categories(cats,false).filter_by_tags(tags)
|
||||
if !is_random
|
||||
sorted_eanns = sorted_eanns.limit(widget_data_count)
|
||||
if eanns_cache.count > 1
|
||||
eanns_cache.destroy
|
||||
end
|
||||
if devide_flag
|
||||
now_eanns = sorted_eanns.to_a
|
||||
top_eanns = now_eanns.select{|v| v.is_top}.map{|v| data_to_human_type(v)}
|
||||
not_top_eanns = now_eanns.select{|v| !v.is_top}.map{|v| data_to_human_type(v)}
|
||||
EventAnnsCache.create(parent_id: subpart.id.to_s,locale: I18n.locale.to_s,filter_result: {top: top_eanns,not_top: not_top_eanns})
|
||||
else
|
||||
eanns = sorted_eanns.map{|v| data_to_human_type(v)}
|
||||
EventAnnsCache.create(parent_id: subpart.id.to_s,locale: I18n.locale.to_s,filter_result: eanns)
|
||||
end
|
||||
else
|
||||
if devide_flag
|
||||
eanns = sorted_eanns.sample(widget_data_count)
|
||||
top_eanns = eanns.select{|v| v.is_top}.map{|v| data_to_human_type(v)}
|
||||
not_top_eanns = eanns.select{|v| !v.is_top}.map{|v| data_to_human_type(v)}
|
||||
else
|
||||
eanns = sorted_eanns.sample(widget_data_count).map{|v| data_to_human_type(v)}
|
||||
end
|
||||
end
|
||||
elsif devide_flag
|
||||
now_eanns = enns_cache.first.filter_result
|
||||
top_eanns = now_eanns[:top]
|
||||
not_top_eanns = now_eanns[:not_top]
|
||||
else
|
||||
eanns = eanns_cache.first.filter_result
|
||||
end
|
||||
if devide_flag
|
||||
rest_count = widget_data_count - top_eanns.count
|
||||
if rest_count <= 0
|
||||
eanns = top_eanns
|
||||
else
|
||||
feeds_eanns = get_feed_event_anns("widget")
|
||||
top_eanns = top_eanns + feeds_eanns.select{|v| v['is_top']}
|
||||
top_eanns = top_eanns.sort{|v1,v2| v2["postdate"]<=>v1["postdate"]}
|
||||
rest_all_eanns = feeds_eanns.select{|v| v['is_top'] != true} + not_top_eanns.take(rest_count)
|
||||
rest_eanns = rest_all_eanns.sort{|v1,v2| v2["postdate"]<=>v1["postdate"]}.take(rest_count)
|
||||
eanns = (top_eanns + rest_eanns).take(widget_data_count)
|
||||
end
|
||||
end
|
||||
mp = (eanns[0]["img_src"] rescue "")
|
||||
mpd = (eanns[0]["img_description"] rescue "")
|
||||
{
|
||||
"event_anns" => eanns,
|
||||
"extras" => {
|
||||
"more_url"=>OrbitHelper.widget_more_url,
|
||||
"main_picture" => mp,
|
||||
"main_picture_description" => mpd,
|
||||
"title-head" => t('event_ann.table.title'),
|
||||
"date-head" => t('event_ann.table.date'),
|
||||
"author-head" => t('event_ann.table.author'),
|
||||
"status-head" => t('event_ann.table.status'),
|
||||
"subtitle-head" => t('event_ann.table.sub_title'),
|
||||
"speaker-head" => t('event_ann.table.speaker'),
|
||||
"host-head" => t('event_ann.table.host'),
|
||||
"category-head" => t('event_ann.table.category'),
|
||||
"link-head" => t('event_ann.table.link'),
|
||||
"file-head" => t('event_ann.table.file'),
|
||||
"read_more" => ("/#{I18n.locale.to_s + page.url}" rescue "")
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
def show_local_event_ann(uid, is_preview)
|
||||
locale = OrbitHelper.get_site_locale.to_s
|
||||
if is_preview
|
||||
event_ann = BulletinEvent.where(:uid => uid).first
|
||||
else
|
||||
event_ann = BulletinEvent.can_display_and_sorted.where(:uid => uid).first
|
||||
end
|
||||
event_ann = BulletinEvent.where(:uid => uid).first if event_ann.nil?
|
||||
url_to_edit = OrbitHelper.user_can_edit?(event_ann) ? "/admin/event_anns/#{event_ann.id.to_s}/edit" : ""
|
||||
|
||||
access_level = OrbitHelper.user_access_level?
|
||||
|
||||
if !event_ann.approved && (access_level != "manager" && access_level != "admin")
|
||||
if EventAnnSetting.is_pro?
|
||||
if !(access_level == "sub_manager" && EventAnnSetting.first.approvers.include?(OrbitHelper.current_user.id.to_s))
|
||||
return {}
|
||||
end
|
||||
elsif access_level != "sub_manager"
|
||||
return {}
|
||||
end
|
||||
end
|
||||
|
||||
return {} if event_ann.category.disable
|
||||
|
||||
tags = event_ann.tags.map{|tag| {
|
||||
"tag" => tag.name ,
|
||||
"url" => OrbitHelper.page_for_tag(tag)
|
||||
} } rescue []
|
||||
files = event_ann.bulletin_event_files.map{|file| { "file_url" => file.file.url, "file_title" => (file.title.blank? ? URI.unescape(File.basename(file.file.path)) : file.title rescue '') } if file.enabled_for?(locale) } rescue []
|
||||
files.delete(nil)
|
||||
files.each do |file|
|
||||
if file["file_url"] =="" || file["file_url"] == nil
|
||||
files.delete(file)
|
||||
end
|
||||
end
|
||||
links = event_ann.bulletin_event_links.map{|link| { "link_url" => link.url, "link_title" => (link.title.blank? ? link.url : link.title) } } rescue []
|
||||
update_user = event_ann.update_user.member_profile.name rescue ""
|
||||
desc = event_ann.image_description
|
||||
desc = (desc.nil? || desc == "" ? "event_ann image" : desc)
|
||||
|
||||
request = OrbitHelper.request
|
||||
meta_desc = event_ann.subtitle.nil? || event_ann.subtitle == "" ? event_ann.text[0..200] : event_ann.subtitle
|
||||
OrbitHelper.render_meta_tags([{"property" => "og:title", "content" => event_ann.title},{"property" => "og:site_name", "content" => Site.first.title},{"property" => "og:url", "content" => request.original_url.split("?").first},{"property" => "og:description", "content" => meta_desc},{"property" => "og:image", "content" => "#{request.base_url}#{event_ann.image.url}"},{"property" => "og:type", "content" => "Article"}])
|
||||
|
||||
subtitle_ann = nil
|
||||
img_src = nil
|
||||
img_description = nil
|
||||
subtitle_ann = event_ann.subtitle if event_ann.display_subtitle?
|
||||
img_src = (event_ann.image.thumb.url || "/assets/event_ann-default.jpg") if event_ann.display_img?
|
||||
img_description = event_ann.image_description if (event_ann.image_description.present?) && (event_ann.display_img?)
|
||||
|
||||
{
|
||||
"tags" => tags,
|
||||
"bulletin_event_files" => files,
|
||||
"bulletin_event_links" => links,
|
||||
"data" => {
|
||||
"title" => event_ann.title,
|
||||
"subtitle_ann" => subtitle_ann,
|
||||
"speaker" => event_ann.speaker,
|
||||
"host" => event_ann.host,
|
||||
"update_user" => update_user,
|
||||
"updated_at" => event_ann.postdate.strftime('%Y-%m-%d %H:%M'),
|
||||
"body" =>event_ann.text,
|
||||
"notes" => event_ann.notes,
|
||||
"image" => event_ann.image.url,
|
||||
"img_src" => img_src,
|
||||
"img_description" => img_description,
|
||||
"alt_title" => desc
|
||||
},
|
||||
"impressionist" => (event_ann.is_preview ? nil : event_ann),
|
||||
"url_to_edit"=>url_to_edit
|
||||
}
|
||||
end
|
||||
|
||||
def show_feed_event_ann(uid)
|
||||
event_ann = OrbitHelper.get_from_feed(uid)
|
||||
locale = OrbitHelper.get_site_locale.to_s
|
||||
url_to_edit = "#"
|
||||
return {} if event_ann.blank?
|
||||
tags = []
|
||||
|
||||
event_ann["tags"].each{|tag|
|
||||
t = Tag.where(:name => tag["name_translations"][locale]).first rescue nil
|
||||
if t.nil?
|
||||
I18n.locale = (locale == "en" ? :zh_tw : :en)
|
||||
t = Tag.where(:name => tag["name_translations"][locale]).first rescue nil
|
||||
I18n.locale = locale.to_sym
|
||||
end
|
||||
tags << {
|
||||
"tag" => tag["name_translations"][locale],
|
||||
"url" => (t.nil? ? "#" : OrbitHelper.page_for_tag(t))
|
||||
}
|
||||
}
|
||||
|
||||
files = event_ann["bulletin_event_files"].map{|file| { "file_url" => file["url"], "file_title" => (file["title_translations"][locale] == "" ? URI.unescape(File.basename(file["url"])) : file["title_translations"][locale] rescue '') } } rescue []
|
||||
|
||||
files.each do |file|
|
||||
if file["file_url"] =="" || file["file_url"] == nil
|
||||
files.delete(file)
|
||||
end
|
||||
end
|
||||
links = event_ann["bulletin_event_links"].map{|link| { "link_url" => link["url"], "link_title" => (link["title_translations"][locale] == "" ? link["url"] : link["title_translations"][locale]) } } rescue []
|
||||
|
||||
update_user = event_ann["author"]
|
||||
desc = event_ann["image_description_translations"][locale] rescue ""
|
||||
desc = (desc.nil? || desc == "" ? "event_ann image" : desc)
|
||||
|
||||
request = OrbitHelper.request
|
||||
if event_ann["subtitle_translations"].present?
|
||||
meta_desc = event_ann["subtitle_translations"][locale] != "" ? event_ann["subtitle_translations"][locale] : event_ann["text_translations"][locale][0..200] rescue ""
|
||||
else
|
||||
meta_desc = ""
|
||||
end
|
||||
|
||||
OrbitHelper.render_meta_tags([{"property" => "og:title", "content" => event_ann["title_translations"][locale]},{"property" => "og:site_name", "content" => Site.first.title},{"property" => "og:url", "content" => request.original_url.split("?").first},{"property" => "og:description", "content" => meta_desc},{"property" => "og:image", "content" => event_ann["image"]["original"]},{"property" => "og:type", "content" => "Article"}])
|
||||
|
||||
datetime = DateTime.parse(event_ann["postdate"])
|
||||
|
||||
{
|
||||
"tags" => tags,
|
||||
"bulletin_event_files" => files,
|
||||
"bulletin_event_links" => links,
|
||||
"data" => {
|
||||
"title" => event_ann["title_translations"][locale],
|
||||
"update_user" => update_user,
|
||||
"updated_at" => datetime.strftime('%Y-%m-%d %H:%M'),
|
||||
"body" => event_ann["text_translations"][locale],
|
||||
"image" => event_ann["image"]["original"],
|
||||
"alt_title" => desc
|
||||
},
|
||||
"impressionist" => nil,
|
||||
"url_to_edit" => url_to_edit
|
||||
}
|
||||
end
|
||||
|
||||
def show
|
||||
params = OrbitHelper.params
|
||||
uid = params[:uid]
|
||||
if OrbitHelper.is_object_from_feed?(uid)
|
||||
show_feed_event_ann(uid)
|
||||
else
|
||||
show_local_event_ann(uid, (params["preview"] == "true" ? true : false))
|
||||
end
|
||||
end
|
||||
|
||||
def show_widget
|
||||
@type = "show_widget"
|
||||
@show_page = params[:show_page]
|
||||
if params[:tags].nil?
|
||||
@tags = ['all']
|
||||
else
|
||||
@tags = params[:tags]
|
||||
end
|
||||
if params[:categories].nil?
|
||||
@categories = ['all']
|
||||
else
|
||||
@categories = params[:categories]
|
||||
end
|
||||
OrbitHelper.set_current_widget_module("event_ann")
|
||||
OrbitHelper.set_params(params,current_user)
|
||||
BulletinEvent.remove_expired_status
|
||||
OrbitHelper.set_page_number(params[:page_no].to_i)
|
||||
OrbitHelper.set_page_data_count((params[:data_count].blank? ? 10 : params[:data_count].to_i))
|
||||
sorted,total_pages = get_sorted_event_ann
|
||||
eanns = sorted.collect do |a|
|
||||
if a["source-site"].blank?
|
||||
statuses = a.statuses_with_classname.collect do |status|
|
||||
{
|
||||
"status" => status["name"],
|
||||
"status-class" => "status-#{status['classname']}"
|
||||
}
|
||||
end
|
||||
locale = I18n.locale.to_s
|
||||
files = a.bulletin_event_files.map{|file| { "file_url" => file.file.url, "file_title" => (file.title.blank? ? File.basename(file.file.path) : file.title rescue '') } if file.enabled_for?(locale) } rescue []
|
||||
files.delete(nil)
|
||||
links = a.bulletin_event_links.map{|link| { "link_url" => link.url, "link_title" => (link.title.blank? ? link.url : link.title) } } rescue []
|
||||
author = User.find(a.create_user_id).member_profile.name rescue ""
|
||||
desc = a.image_description
|
||||
desc = (desc.blank? ? "event_ann image" : desc)
|
||||
link_to_show = (a.is_external_link ? a.external_link : OrbitHelper.url_to_show(a.to_param)) rescue ""
|
||||
target = a.is_external_link ? "_blank" : "_self"
|
||||
doc = Nokogiri::HTML(a.title)
|
||||
title = doc.text.empty? ? 'no content' : doc.text
|
||||
{
|
||||
"department" => author,
|
||||
"bulletin_event_links" => links,
|
||||
"bulletin_event_files" => files,
|
||||
"title" => a.title,
|
||||
"source-site" => "",
|
||||
"source-site-title" => "",
|
||||
"source-site-link" => "",
|
||||
"subtitle" => a.subtitle,
|
||||
"speaker" => a.speaker,
|
||||
"host" => a.host,
|
||||
"statuses" => statuses,
|
||||
"category" => a.category.title,
|
||||
"postdate" => a.postdate,
|
||||
"author" => author,
|
||||
"is_top" => (a.is_top? ? 1 : 0),
|
||||
"link_to_show" => link_to_show+"\" title=\"#{title}\"",
|
||||
"target" => target,
|
||||
"img_src" => a.image.thumb.url || "/assets/event_ann-default.jpg",
|
||||
"img_description" => desc,
|
||||
"more" => t(:more_plus),
|
||||
"view_count" => a.view_count
|
||||
}
|
||||
else
|
||||
a
|
||||
end
|
||||
end
|
||||
#If no data , hide title&table
|
||||
if sorted.count == 0
|
||||
display = "hide"
|
||||
end
|
||||
# eanns = eanns.concat(feeds_eanns)
|
||||
# total_pages = event_anns.total_pages
|
||||
|
||||
|
||||
@data = {
|
||||
"event_anns" => eanns,
|
||||
"extras" => {
|
||||
"widget-title" =>t('event_ann.event_ann'),
|
||||
"title-head" => t('event_ann.table.title'),
|
||||
"date-head" => t('event_ann.table.date'),
|
||||
"status-head" => t('event_ann.table.status'),
|
||||
"author-head" => t('event_ann.table.author'),
|
||||
"subtitle-head" => t('event_ann.table.sub_title'),
|
||||
"speaker-head" => t('event_ann.table.speaker'),
|
||||
"host-head" => t('event_ann.table.host'),
|
||||
"category-head" => t('event_ann.table.category'),
|
||||
"link-head" => t('event_ann.table.link'),
|
||||
"file-head" => t('event_ann.table.file'),
|
||||
"view-count-head" => t('event_ann.table.view_count'),
|
||||
"display" => display,
|
||||
"department-head" => t('event_ann.table.department')
|
||||
},
|
||||
"total_pages" => total_pages
|
||||
}
|
||||
render :layout => false
|
||||
end
|
||||
|
||||
end
|
|
@ -0,0 +1,318 @@
|
|||
require "net/http"
|
||||
require "uri"
|
||||
require 'json'
|
||||
|
||||
module Admin::EventAnnsHelper
|
||||
def page_for_bulletin(bulletin_event)
|
||||
ann_page = nil
|
||||
pages = Page.where(:module=>'event_ann')
|
||||
|
||||
pages.each do |page|
|
||||
if page.categories.count ==1
|
||||
if page.categories.include?(bulletin_event.category.id.to_s)
|
||||
ann_page = page
|
||||
end
|
||||
end
|
||||
break if !ann_page.nil?
|
||||
end
|
||||
|
||||
if ann_page.nil?
|
||||
pages.each do |page|
|
||||
if page.categories.include?(bulletin_event.category.id.to_s)
|
||||
ann_page = page
|
||||
end
|
||||
break if !ann_page.nil?
|
||||
end
|
||||
end
|
||||
|
||||
ann_page = pages.first if ann_page.nil?
|
||||
request.protocol+(request.host_with_port+ann_page.url+'/'+bulletin_event.to_param).gsub('//','/') rescue "/"
|
||||
end
|
||||
|
||||
def import_this_event_ann(row,categories,tags)
|
||||
value = {}
|
||||
eanns = BulletinEvent.new
|
||||
row.cells.each_with_index do |cell,index|
|
||||
next if cell.nil?
|
||||
val = cell.value
|
||||
next if val.nil? || val == ""
|
||||
case index
|
||||
when 0
|
||||
eanns.category = categories[val.to_i]
|
||||
when 1
|
||||
new_tags = []
|
||||
if (val.include?(",") rescue false)
|
||||
ts = val.split(",")
|
||||
ts.each do |t|
|
||||
new_tags << tags[t.to_i]
|
||||
end
|
||||
else
|
||||
new_tags << tags[val.to_i]
|
||||
end
|
||||
eanns.tags=new_tags
|
||||
when 2
|
||||
eanns.postdate = val
|
||||
when 3
|
||||
eanns.deadline = val
|
||||
when 4
|
||||
eanns.is_top = (val.to_i == 1 ? true : false)
|
||||
when 5
|
||||
eanns.is_hot = (val.to_i == 1 ? true : false)
|
||||
when 6
|
||||
eanns.is_hidden = (val.to_i == 1 ? true : false)
|
||||
when 7
|
||||
eanns.remote_image_url = val
|
||||
when 8
|
||||
value["en"] = val
|
||||
when 9
|
||||
value["zh_tw"] = val
|
||||
eanns.image_description_translations = value
|
||||
value = {}
|
||||
when 10
|
||||
value["en"] = val
|
||||
when 11
|
||||
value["zh_tw"] = val
|
||||
eanns.title_translations = value
|
||||
value = {}
|
||||
when 12
|
||||
value["en"] = val
|
||||
when 13
|
||||
value["zh_tw"] = val
|
||||
eanns.subtitle_translations = value
|
||||
value = {}
|
||||
when 14
|
||||
value["en"] = val
|
||||
when 15
|
||||
value["zh_tw"] = val
|
||||
eanns.speaker_translations = value
|
||||
value = {}
|
||||
when 16
|
||||
value["en"] = val
|
||||
when 17
|
||||
value["zh_tw"] = val
|
||||
eanns.host_translations = value
|
||||
value = {}
|
||||
when 18
|
||||
value["en"] = val
|
||||
when 19
|
||||
value["zh_tw"] = val
|
||||
eanns.text_translations = value
|
||||
value = {}
|
||||
when 20
|
||||
value["zh_tw"] = val
|
||||
eanns.notes_translations = value
|
||||
value = {}
|
||||
when 21
|
||||
value["en"] = val
|
||||
when 22
|
||||
links = val.split(";") rescue []
|
||||
desc_en = row.cells[23].value.split(";") rescue []
|
||||
desc_zh_tw = row.cells[24].value.split(";") rescue []
|
||||
links.each_with_index do |link,i|
|
||||
bl = BulletinLinkEvent.new
|
||||
bl.url = link.strip
|
||||
bl.title_translations = {"en" => desc_en[i], "zh_tw" => desc_zh_tw[i]}
|
||||
bl.bulletin_id = eanns.id
|
||||
bl.save
|
||||
end
|
||||
when 25
|
||||
files = val.split(";") rescue []
|
||||
desc_en = row.cells[26].value.split(";") rescue []
|
||||
desc_zh_tw = row.cells[27].value.split(";") rescue []
|
||||
alt_en = row.cells[28].value.split(";") rescue []
|
||||
alt_zh_tw = row.cells[29].value.split(";") rescue []
|
||||
files.each_with_index do |file, i|
|
||||
bf = BulletinFileEvent.new
|
||||
bf.remote_file_url = file.strip rescue nil
|
||||
bf.title_translations = {"en" => (desc_en[i] rescue ""), "zh_tw" => (desc_zh_tw[i] rescue "")}
|
||||
bf.description_translations = {"en" => (alt_en[i] rescue ""), "zh_tw" => (alt_zh_tw[i] rescue "")}
|
||||
bf.bulletin_id = eanns.id
|
||||
bf.save
|
||||
end
|
||||
end
|
||||
end
|
||||
eanns.create_user_id = current_user.id.to_s
|
||||
eanns.update_user_id = current_user.id.to_s
|
||||
eanns.approved = true
|
||||
eanns.save
|
||||
end
|
||||
|
||||
def send_rejection_email(event_ann,locale)
|
||||
user = User.find(event_ann.create_user_id) rescue nil
|
||||
if !user.nil?
|
||||
email = user.member_profile.email
|
||||
if !email.nil? && email != ""
|
||||
url = "http://#{request.host_with_port}/admin/event_anns/#{event_ann.id}/edit"
|
||||
datatosend = "<h3>Hello #{user.name},</h3><p>#{current_user.name} #{t("event_ann.rejected_annoucement")} : #{event_ann.rejection_reason} <a href='#{url}'> #{t("event_ann.click_here_to_see")}</a></p>"
|
||||
mail = Email.new(:mail_to => email, :mail_subject => "EventAnn rejected活動與演講公告未通過 : #{event_ann.title_translations[locale]}.", :template => "email/event_ann_email.html.erb", :template_data => {"html" => datatosend})
|
||||
mail.save
|
||||
mail.deliver rescue nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def send_notification_mail_to_managers(event_ann, type, locale)
|
||||
users = []
|
||||
if @event_ann_setting.email_to.include?("managers")
|
||||
authorizations = Authorization.where(:module_app_id => @module_app.id)
|
||||
users = authorizations.collect do |auth|
|
||||
auth.user
|
||||
end
|
||||
end
|
||||
if @event_ann_setting.email_to.include?("admins")
|
||||
wg = Workgroup.where(:key => "admin").first
|
||||
admins = User.where(:workgroup_id => wg.id)
|
||||
users.delete(nil)
|
||||
users = users.concat(admins.to_a)
|
||||
end
|
||||
if @event_ann_setting.email_to.include?("approvers")
|
||||
approvers = User.find(@event_ann_setting.approvers).to_a rescue []
|
||||
auths = Authorization.where(:category_id => event_ann.category_id).collect{|a| a.user}
|
||||
users = users.concat(approvers & auths)
|
||||
end
|
||||
users.each do |user|
|
||||
email = user.member_profile.email
|
||||
if !email.nil? && email != ""
|
||||
send_email(user.name, email, event_ann, type, locale)
|
||||
# sleep(1)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def send_email(name, useremail, event_ann, type, locale)
|
||||
url = "http://#{request.host_with_port}/admin/event_anns?url=#{page_for_bulletin(event_ann).sub("http://" + request.host_with_port, "")}&id=#{event_ann.id}"
|
||||
|
||||
case type
|
||||
when "approval"
|
||||
datatosend = "<h3>#{t("event_ann.approval_mail_hi", :name => name)},</h3><p>#{t("event_ann.submitted_new_event_ann", :poster => current_user.name)}<br /><br />#{t("event_ann.approval_event_ann_title")} : #{event_ann.title_translations[locale]} <br /> #{t("event_ann.click_here_to_see")} : <a href='#{url}'> #{url} </a></p>"
|
||||
when "reapproval"
|
||||
datatosend = "<h3>#{t("event_ann.approval_mail_hi", :name => name)},</h3><p>#{t("event_ann.updated_annoucement", :poster => current_user.name)}<br /><br />#{t("event_ann.approval_event_ann_title")} : #{event_ann.title_translations[locale]} <br /> #{t("event_ann.click_here_to_see")} : <a href='#{url}'> #{url} </a></p>"
|
||||
end
|
||||
email = Email.new(:mail_to => useremail, :mail_subject => " #{t("event_ann.event_ann_subject")} : #{event_ann.title_translations[locale]}.", :template => "email/event_ann_email.html.erb", :template_data => {"html" => datatosend})
|
||||
email.save
|
||||
email.deliver rescue nil
|
||||
end
|
||||
|
||||
def download_tmp_xml(url)
|
||||
xml = File.join(Rails.root, "tmp", "ann_cc_ntu.xml")
|
||||
open(xml, 'wb') do |fo|
|
||||
fo.print open(url).read
|
||||
end
|
||||
end
|
||||
|
||||
def import_from_tmp_xml(file)
|
||||
xml = Nokogiri::XML(file)
|
||||
return if xml.nil?
|
||||
event_anns = []
|
||||
xml.xpath("//channel").xpath("//item").each do |eanns|
|
||||
event_anns << {
|
||||
:title => (eanns>"title").text,
|
||||
:category => (eanns>"category").text,
|
||||
:postdate => (eanns>"pubDate").text,
|
||||
:text => (eanns>"description").text,
|
||||
:rss2_sn => (eanns>"link").text.split("=").last
|
||||
}
|
||||
end
|
||||
event_anns.each do |eanns|
|
||||
ma = ModuleApp.where(:key => "event_ann").first
|
||||
cat = Category.where(:title => eanns[:category]).first rescue nil
|
||||
if cat.nil?
|
||||
cat = Category.create(:title_translations => {"en" => eanns[:category], "zh_tw" => eanns[:category]}, :module_app_id => ma.id)
|
||||
end
|
||||
ann = BulletinEvent.where(:rss2_sn => eanns[:rss2_sn]).first rescue nil
|
||||
if ann.nil?
|
||||
ann = BulletinEvent.new(:title_translations => {"en" => "", "zh_tw" => eanns[:title]}, :postdate => eanns[:postdate], :subtitle_translations => {"en" => "", "zh_tw" => eanns[:title]}, :text_translations => {"en" => "", "zh_tw" => eanns[:text]}, :rss2_sn => eanns[:rss2_sn], :category_id => cat.id, :approved => true, :create_user_id => current_user.id)
|
||||
else
|
||||
ann.update_attributes(:title_translations => {"en" => "", "zh_tw" => eanns[:title]}, :postdate => eanns[:postdate], :subtitle_translations => {"en" => "", "zh_tw" => eanns[:title]}, :text_translations => {"en" => "", "zh_tw" => eanns[:text]})
|
||||
end
|
||||
ann.save
|
||||
end
|
||||
File.delete(file)
|
||||
end
|
||||
|
||||
def import_from_wordpress(xmlfile)
|
||||
xml_file = File.read(xmlfile)
|
||||
doc = Nokogiri::XML.parse(xml_file)
|
||||
|
||||
doc.xpath("//channel").each do|channel_data|
|
||||
channel_data.xpath('//item').each do|itme|
|
||||
|
||||
bu = BulletinEvent.where(:rss2_sn => itme.xpath('wp:post_id').text ).first rescue nil
|
||||
if bu.nil?
|
||||
bu = BulletinEvent.new
|
||||
bu.approved = true
|
||||
bu.rss2_sn = itme.xpath('wp:post_id').text
|
||||
bu.title_translations = {"en" => itme.xpath('title').text, "zh_tw" => itme.xpath('title').text}
|
||||
bu.text_translations = {"en" => itme.xpath('content:encoded').text, "zh_tw" => itme.xpath('content:encoded').text}
|
||||
bu.postdate = itme.xpath('wp:post_date').text
|
||||
|
||||
itme.xpath('category').each do |i_cate|
|
||||
if i_cate["domain"].to_s == "category"
|
||||
|
||||
cat = @module_app.categories.where(:title => i_cate.text.to_s).first rescue nil
|
||||
if cat.nil?
|
||||
cat = Category.new
|
||||
cat.module_app = @module_app
|
||||
cat.title_translations = {"en" => i_cate.text.to_s, "zh_tw" => i_cate.text.to_s}
|
||||
cat.save
|
||||
end
|
||||
bu.category = cat
|
||||
|
||||
elsif i_cate["domain"].to_s == "post_tag"
|
||||
|
||||
tag = Tag.where(:name => i_cate.text.to_s ).first rescue nil
|
||||
if tag.nil?
|
||||
tag = Tag.new
|
||||
tag.name_translations = {"en" => i_cate.text.to_s, "zh_tw" => i_cate.text.to_s}
|
||||
tag.module_app_ids << @module_app.id
|
||||
tag.save
|
||||
end
|
||||
|
||||
bu.tags = tag
|
||||
end
|
||||
end
|
||||
|
||||
bu.save
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
File.delete(xmlfile)
|
||||
end
|
||||
|
||||
def load_access_level
|
||||
if (current_user.is_admin? rescue false)
|
||||
@access_level = "admin"
|
||||
elsif (current_user.is_manager?(@module_app) rescue false)
|
||||
@access_level = "manager"
|
||||
else
|
||||
@access_level = "users"
|
||||
end
|
||||
end
|
||||
|
||||
def user_can_approve?(eanns=nil)
|
||||
can_approve = false
|
||||
setting = EventAnnSetting.first
|
||||
case @access_level
|
||||
when "admin"
|
||||
can_approve = true
|
||||
when "manager"
|
||||
can_approve = true
|
||||
else
|
||||
can_approve = false
|
||||
end
|
||||
if !can_approve
|
||||
if !eanns.nil?
|
||||
if setting.approvers.include?(current_user.id.to_s)
|
||||
if (current_user.approved_categories_for_module(@module_app).include?(eanns.category) rescue false)
|
||||
can_approve = true
|
||||
end
|
||||
end
|
||||
else
|
||||
can_approve = setting.approvers.include?(current_user.id.to_s)
|
||||
end
|
||||
end
|
||||
can_approve
|
||||
end
|
||||
|
||||
end
|
|
@ -0,0 +1,450 @@
|
|||
module EventAnnsHelper
|
||||
def set_image_version_for_widget
|
||||
subpart = OrbitHelper.get_current_widget
|
||||
@image_version = 'thumb'
|
||||
if subpart.methods.include? 'select_options'.to_sym
|
||||
ModuleApp.all.select{|tmp| tmp.key.to_s=='event_ann'}.each do |modile_app|
|
||||
@show_options = modile_app.show_options rescue nil
|
||||
end
|
||||
subpart.select_options.each do |select_option|
|
||||
if !(@show_options.nil?) && select_option.field_name == @show_options.keys.first.to_s
|
||||
value = YAML.load(select_option.value)
|
||||
tmp = value[:en]
|
||||
I18n.with_locale(:en) do
|
||||
if tmp == t('event_ann.small_size')
|
||||
@image_version = 'thumb'
|
||||
elsif tmp == t('event_ann.medium_size')
|
||||
@image_version = 'mobile'
|
||||
elsif tmp == t('event_ann.orignal_size')
|
||||
@image_version = 'orignal'
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
def data_to_human_type(a)
|
||||
statuses = a.statuses_with_classname.collect do |status|
|
||||
{
|
||||
"status" => status["name"],
|
||||
"status-class" => "status-#{status['classname']}"
|
||||
}
|
||||
end
|
||||
files = a.bulletin_event_files.map{|file| { "file_url" => file.file.url, "file_title" => (file.title.blank? ? File.basename(file.file.path) : file.title rescue '') } if file.enabled_for?(locale) } rescue []
|
||||
files.delete(nil)
|
||||
links = a.bulletin_event_links.map{|link| { "link_url" => link.url, "link_title" => (link.title.blank? ? link.url : link.title) } } rescue []
|
||||
author = User.find(a.create_user_id).member_profile.name rescue ""
|
||||
desc = a.image_description
|
||||
desc = (desc.nil? || desc == "" ? "event_ann image" : desc)
|
||||
link_to_show = (a.is_external_link? ? a.external_link : OrbitHelper.widget_item_url(a.to_param)) rescue ""
|
||||
target = a.is_external_link ? "_blank" : "_self"
|
||||
if @image_version == 'thumb'
|
||||
image_url = a.image.thumb.url
|
||||
elsif @image_version == 'mobile'
|
||||
image_url = a.image.mobile.url
|
||||
else
|
||||
image_url = a.image.url
|
||||
end
|
||||
{
|
||||
"bulletin_event_links" => links,
|
||||
"bulletin_event_files" => files,
|
||||
"title" => a.title,
|
||||
"source-site" => "",
|
||||
"source-site-title" => "",
|
||||
"source-site-link" => "",
|
||||
"subtitle" => a.subtitle,
|
||||
"speaker" => a.speaker,
|
||||
"host" => a.host,
|
||||
"statuses" => statuses,
|
||||
"category" => a.category.title,
|
||||
"postdate" => a.postdate,
|
||||
"author" => author,
|
||||
"link_to_show" => link_to_show,
|
||||
"target" => target,
|
||||
"img_src" => image_url || "/assets/event_ann-default.jpg",
|
||||
"img_description" => desc
|
||||
}
|
||||
end
|
||||
def get_feed_event_ann(type,site_source,locale)
|
||||
ma_key = 'event_ann'
|
||||
if type == "index"
|
||||
categories = Array(OrbitHelper.page_categories)
|
||||
elsif type == "widget"
|
||||
categories = Array(OrbitHelper.widget_categories)
|
||||
else
|
||||
categories = []
|
||||
end
|
||||
if categories.include?("all")
|
||||
feeds = SiteFeedAnnc.where(:channel_key => ma_key)
|
||||
else
|
||||
feeds = SiteFeedAnnc.where(:channel_key => ma_key, :merge_with_category.in => categories)
|
||||
end
|
||||
if feeds.count > 0
|
||||
temp_ids = []
|
||||
data = feeds.collect do |feed|
|
||||
feed.all_contents_for_feed(site_source,locale,type=='widget')
|
||||
end.flatten.compact
|
||||
else
|
||||
data = []
|
||||
end
|
||||
data
|
||||
end
|
||||
def get_feed_event_anns(type,site_source=nil)
|
||||
locale = OrbitHelper.get_site_locale.to_s
|
||||
if !(defined? SiteFeedAnnc).nil?
|
||||
fans = get_feed_event_ann(type,site_source,locale)
|
||||
else
|
||||
feed_eanns = OrbitHelper.get_feed_for_module(type)
|
||||
fans = []
|
||||
feed_eanns.each do |fa|
|
||||
next if !site_source.nil? && site_source != fa["source-site-title"]
|
||||
status = {
|
||||
"status" => "<a href='#{fa["source-site"]}' target='_blank' class='feed-source'>#{fa["source-site-title"]}</a>",
|
||||
"status-class" => "status-source"
|
||||
}
|
||||
|
||||
files = fa["bulletin_event_files"].collect{|bf| { "file_url" => bf["url"], "file_title" => (fa["title_translations"][locale].blank? ? File.basename(fa["url"]) : fa["title_translations"][locale] rescue '') }} rescue []
|
||||
links = fa["bulletin_event_links"].map{|link| { "link_url" => link["url"], "link_title" => (link["title_translations"][locale].blank? ? link["url"] : link["title_translations"][locale]) } } rescue []
|
||||
|
||||
x = {
|
||||
"bulletin_event_links" => links,
|
||||
"bulletin_event_files" => files,
|
||||
"title" => fa["title_translations"][locale],
|
||||
"subtitle" => fa["subtitle_translations"][locale],
|
||||
"speaker" => fa["speaker_translations"][locale],
|
||||
"host" => fa["host_translations"][locale],
|
||||
"statuses" => [status],
|
||||
"category" => fa["category"],
|
||||
"postdate" => fa["postdate"],
|
||||
"author" => fa["author"],
|
||||
"source-site" => "<a href='#{fa["source-site"]}' target='_blank' class='feed-source'>#{fa["source-site-title"]}</a>",
|
||||
"source-site-title" => fa["source-site-title"],
|
||||
"source-site-link" => fa["source-site"],
|
||||
"link_to_show" => OrbitHelper.url_to_show(fa["params"]),
|
||||
"target" => "_self",
|
||||
"img_src" => fa["image"]["thumb"] || "/assets/event_ann-default.jpg",
|
||||
"img_description" => fa["image_description_translations"][locale],
|
||||
"more" => t(:more_plus),
|
||||
"view_count" => ""
|
||||
}
|
||||
if (!x["title"].empty? rescue false)
|
||||
fans << x
|
||||
end
|
||||
end
|
||||
end
|
||||
fans
|
||||
end
|
||||
def filter_by_keywords(sorted,keywords,stime,etime)
|
||||
kflag = keywords.blank?
|
||||
sflag = stime.blank?
|
||||
eflag = etime.blank?
|
||||
stime = stime.to_s.split('/')
|
||||
stime = Time.zone.local(*stime) rescue nil
|
||||
etime = etime.to_s.split('/')
|
||||
etime = Time.zone.local(*etime) rescue nil
|
||||
if !kflag || !sflag || !eflag
|
||||
sorted.select{|eanns|
|
||||
if kflag
|
||||
flag = true
|
||||
else
|
||||
if eanns["source-site"].present?
|
||||
title = Nokogiri::HTML(eanns["title"].to_s).text
|
||||
else
|
||||
title = Nokogiri::HTML(eanns.title.to_s).text
|
||||
end
|
||||
flag = title.include?(keywords.to_s)
|
||||
end
|
||||
if sflag && !eflag
|
||||
flag = flag && (eanns.postdate<=etime)
|
||||
elsif !sflag && eflag
|
||||
flag = flag && (eanns.postdate>=stime)
|
||||
elsif !sflag && !eflag
|
||||
flag = flag && (eanns.postdate>=stime) && (eanns.postdate<=etime)
|
||||
end
|
||||
flag
|
||||
}
|
||||
else
|
||||
sorted
|
||||
end
|
||||
end
|
||||
def get_sorted_event_ann(data_count=nil)
|
||||
params = OrbitHelper.params
|
||||
locale = OrbitHelper.get_site_locale.to_s
|
||||
page_number = OrbitHelper.page_number.to_i
|
||||
page_number = 1 if page_number == 0
|
||||
page_data_count = data_count || OrbitHelper.page_data_count.to_i
|
||||
feeds_eanns = []
|
||||
page = Page.where(url:params['url']).first
|
||||
if @type == "show_widget"
|
||||
tags = @tags
|
||||
categories = @categories
|
||||
else
|
||||
tags = page.tags
|
||||
categories = params['category']=='all' ? (page.categories || []) : ([Category.find(params['category'])] rescue (page.categories || []))
|
||||
end
|
||||
if !params["source"].present?
|
||||
if @type == "show_widget"
|
||||
if params[:uids].blank?
|
||||
event_anns = BulletinEvent.where(:title.nin => ["",nil],:is_preview.in=>[false,nil])
|
||||
.can_display_and_sorted.is_approved
|
||||
.filter_by_categories(categories,false).filter_by_tags(tags).to_a
|
||||
else
|
||||
member_prfile = MemberProfile.any_in(:uid=>params[:uids])
|
||||
user_ids = member_prfile.map{|m| m.user.id rescue nil}.select{|id| !id.nil?}
|
||||
event_anns = BulletinEvent.where(:title.nin => ["",nil],:is_preview.in=>[false,nil],:create_user_id.in=>user_ids)
|
||||
.can_display_and_sorted.is_approved
|
||||
.filter_by_categories(categories,false).filter_by_tags(tags).to_a
|
||||
end
|
||||
else
|
||||
event_anns = BulletinEvent.where(:title.nin => ["",nil],:is_preview.in=>[false,nil])
|
||||
.can_display_and_sorted.is_approved
|
||||
.filter_by_categories(categories,false).filter_by_tags(tags).to_a
|
||||
end
|
||||
if !(defined? SiteFeed).nil?
|
||||
if @type != "show_widget"
|
||||
feeds_eanns = get_feed_event_anns("index")
|
||||
else
|
||||
feeds_eanns = []
|
||||
end
|
||||
end
|
||||
else
|
||||
event_anns = []
|
||||
if @type != "show_widget"
|
||||
feeds_eanns = get_feed_event_anns("index",params["source"])
|
||||
else
|
||||
feeds_eanns = []
|
||||
end
|
||||
end
|
||||
if !feeds_eanns.blank?
|
||||
if event_anns.count != 0
|
||||
top_eanns = event_anns.select{|v| v.is_top} + feeds_eanns.select{|v| v['is_top']}
|
||||
rest_all_eanns = feeds_eanns.select{|v| v['is_top'] != true} + event_anns.select{|v| !v.is_top}
|
||||
rest_eanns = rest_all_eanns.sort{|v1,v2| v2["postdate"]<=>v1["postdate"]}
|
||||
all_sorted = top_eanns.sort{|v1,v2| v2["postdate"]<=>v1["postdate"]} + rest_eanns
|
||||
else
|
||||
all_sorted = feeds_eanns.select{|v| v['is_top']}.sort{|v1,v2| v2["postdate"]<=>v1["postdate"]} + feeds_eanns.select{|v| v['is_top'] != true}.sort{|v1,v2| v2["postdate"]<=>v1["postdate"]}
|
||||
end
|
||||
all_filter = filter_by_keywords(all_sorted,params[:keywords],params[:stime],params[:etime])
|
||||
else
|
||||
all_filter = filter_by_keywords(event_anns,params[:keywords],params[:stime],params[:etime])
|
||||
end
|
||||
if page_data_count != 0
|
||||
sorted = all_filter[(page_number-1)*page_data_count...page_number*page_data_count]
|
||||
else
|
||||
sorted = all_filter
|
||||
end
|
||||
event_ann_count = all_filter.count
|
||||
total_pages = page_data_count == 0 ? 1 : (event_ann_count.to_f / page_data_count).ceil
|
||||
[sorted,total_pages]
|
||||
end
|
||||
def render_view_for_event_ann(overridehtml=nil)
|
||||
@key = Site.first.template
|
||||
def render_link_to_edit(html, url_to_edit)
|
||||
if html.scan("{{link_to_edit}}").length == 0
|
||||
html = url_to_edit.blank? ? html : html + "<p class='admin-edit text-right'><a class='btn btn-primary' href='#{url_to_edit}'><i class='icon-edit'></i> #{t(:edit)}</a></p>"
|
||||
else
|
||||
html = url_to_edit.blank? ? html.gsub("{{link_to_edit}}","") : html.gsub("{{link_to_edit}}","<p class='admin-edit text-right'><a class='btn btn-primary' href='#{url_to_edit}'><i class='icon-edit'></i> #{t(:edit)}</a></p>")
|
||||
end
|
||||
return html
|
||||
end
|
||||
|
||||
def parsing_repeats_again(elements,d,level)
|
||||
newhtml = []
|
||||
oldhtml = []
|
||||
elements.each do |el|
|
||||
html_to_render = ""
|
||||
data_name = el.attr("data-list")
|
||||
wrap_elements = el.css("*[data-list][data-level='#{level}']")
|
||||
if d[data_name]
|
||||
d[data_name].each_with_index do |item,i|
|
||||
element = el.inner_html
|
||||
if wrap_elements.count > 0
|
||||
htmls = parsing_repeats_again(wrap_elements,d[data_name][i], level + 1)
|
||||
htmls[0].each_with_index do |html,i|
|
||||
element = element.gsub(html,htmls[1][i])
|
||||
end
|
||||
end
|
||||
item.each do |key,value|
|
||||
if !value.kind_of?(Array)
|
||||
value = value.nil? ? "" : value
|
||||
element = element.gsub("{{#{key}}}",value.to_s.html_safe)
|
||||
element = element.gsub("%7B%7B#{key}%7D%7D",value.to_s.html_safe)
|
||||
element = render_link_to_edit(element, value) if key.eql?("url_to_edit")
|
||||
end
|
||||
end
|
||||
html_to_render = html_to_render + element
|
||||
end
|
||||
temp = el.to_s
|
||||
oldhtml << temp
|
||||
temp = temp.gsub(el.inner_html, html_to_render)
|
||||
newhtml << temp
|
||||
end
|
||||
end
|
||||
[oldhtml,newhtml]
|
||||
end
|
||||
|
||||
|
||||
if @target_action == "index"
|
||||
filename = overridehtml.nil? ? params[:layout_type] : overridehtml
|
||||
f = File.join(Rails.root, 'app', 'templates', "#{@key}", 'modules', 'event_ann', "#{filename}.html.erb")
|
||||
if !File.exists?f
|
||||
f = File.join(Rails.root, 'app', 'templates', "#{@key}", 'modules', 'event_ann', "index.html.erb")
|
||||
if !File.exists?f
|
||||
return "<div class='well'>Maybe the administrator has changed the theme, please select the index page design again from the page settings.</div>".html_safe
|
||||
end
|
||||
end
|
||||
file = File.open(f)
|
||||
doc = Nokogiri::HTML(file, nil, "UTF-8")
|
||||
file.close
|
||||
controller = EventAnnsController.new
|
||||
begin
|
||||
data = @data# rescue nil
|
||||
rescue Exception => e
|
||||
write_debug_file(e,'event_anns',@target_action) if Site::DEBUG
|
||||
end
|
||||
if !data.nil?
|
||||
wrap_elements = doc.css("*[data-list][data-level='0']")
|
||||
htmls = parsing_repeats_again(wrap_elements,data,1)
|
||||
html = doc.to_s
|
||||
htmls[0].each_with_index do |h,i|
|
||||
html = html.gsub(h,htmls[1][i])
|
||||
end
|
||||
extras = data["extras"] || {}
|
||||
extras["page-title"] = Page.find_by(:page_id => params[:page_id]).name rescue "" if !extras["page-title"]
|
||||
extras.each do |key,value|
|
||||
value = value.nil? ? "" : value
|
||||
html = html.gsub("{{#{key}}}",value.to_s.html_safe)
|
||||
html = html.gsub("%7B%7B#{key}%7D%7D",value.to_s.html_safe)
|
||||
end
|
||||
total_pages = data['total_pages'].to_i rescue 1
|
||||
if total_pages > 1
|
||||
html = html.gsub("{{pagination_goes_here}}",create_pagination(total_pages))
|
||||
else
|
||||
html = html.gsub("{{pagination_goes_here}}","");
|
||||
end
|
||||
html.html_safe
|
||||
else
|
||||
return "<div class='well'>No content to show.</div>".html_safe
|
||||
end
|
||||
else
|
||||
filename = overridehtml.nil? ? @target_action : overridehtml
|
||||
f = File.join(Rails.root, 'app', 'templates', "#{@key}", 'modules', 'event_ann', "#{filename}.html.erb")
|
||||
if File.exists?f
|
||||
file = File.open(f)
|
||||
doc = Nokogiri::HTML(file, nil, "UTF-8")
|
||||
file.close
|
||||
controller = EventAnnsController.new
|
||||
begin
|
||||
data = @data# rescue nil
|
||||
rescue Exception => e
|
||||
write_debug_file(e,'event_anns',@target_action) if Site::DEBUG
|
||||
end
|
||||
if data.nil?
|
||||
return "<div class='well'> No content to show. </div>".html_safe
|
||||
end
|
||||
|
||||
if data.blank? || data.empty?
|
||||
file = File.open("#{Rails.root}/app/views/errors/404.html")
|
||||
doc = Nokogiri::HTML(file, nil, "UTF-8")
|
||||
file.close
|
||||
doc.to_html.html_safe
|
||||
else
|
||||
unless data['impressionist'].blank?
|
||||
Thread.new do
|
||||
impression = data['impressionist'].impressions.create
|
||||
impression.user_id = request.session['user_id']
|
||||
impression.controller_name = 'event_anns'
|
||||
impression.action_name = @target_action
|
||||
impression.ip_address = request.remote_ip
|
||||
impression.session_hash = request.session.id
|
||||
impression.request_hash = @impressionist_hash
|
||||
impression.referrer = request.referrer
|
||||
impression.save
|
||||
end
|
||||
data['impressionist'].inc(view_count: 1)
|
||||
data["data"]["view_count"] = data["impressionist"].view_count if data["data"].present?
|
||||
end
|
||||
wrap_elements = doc.css("*[data-list][data-level='0']")
|
||||
if wrap_elements.count == 0
|
||||
wrap_element_html = doc.to_s
|
||||
el = wrap_element_html
|
||||
data.each do |key,value|
|
||||
next if key.eql? 'impressionist'
|
||||
value = value.nil? ? "" : value
|
||||
el = el.gsub("{{#{key}}}",value.to_s.html_safe)
|
||||
el = el.gsub("%7B%7B#{key}%7D%7D",value.to_s.html_safe)
|
||||
end
|
||||
el.html_safe
|
||||
else
|
||||
keys = data.keys
|
||||
not_array_key = nil
|
||||
data.keys.each do |key|
|
||||
not_array_key = key if data["#{key}"].kind_of?(Hash)
|
||||
end
|
||||
htmls = parsing_repeats_again(wrap_elements,data,1)
|
||||
html = doc.to_s
|
||||
htmls[0].each_with_index do |h,i|
|
||||
html = html.gsub(h,htmls[1][i])
|
||||
end
|
||||
extras = data["#{not_array_key}"] || {}
|
||||
extras.each do |key,value|
|
||||
next if key.eql? 'impressionist'
|
||||
value = value.nil? ? "" : value
|
||||
html = html.gsub("{{#{key}}}",value.to_s)
|
||||
html = html.gsub("%7B%7B#{key}%7D%7D",value.to_s)
|
||||
end
|
||||
html = render_link_to_edit(html, data["url_to_edit"]) if !data["url_to_edit"].nil?
|
||||
total_pages = data['total_pages'].to_i rescue 1
|
||||
if @show_page == "false"
|
||||
html = html.gsub("{{pagination_goes_here}}","")
|
||||
else
|
||||
if total_pages > 1
|
||||
html = html.gsub("{{pagination_goes_here}}",create_pagination(total_pages))
|
||||
else
|
||||
html = html.gsub("{{pagination_goes_here}}","")
|
||||
end
|
||||
end
|
||||
html = Nokogiri::HTML.parse(html)
|
||||
html.css('.i-event_ann__page-title').remove
|
||||
dates = html.css("*[date-format]")
|
||||
if !dates.blank?
|
||||
dates.each do |d|
|
||||
format = d.attributes["date-format"].value
|
||||
date = DateTime.parse(d.inner_text)
|
||||
d.inner_html = d.inner_html.gsub(d.inner_text.strip, " " + date.strftime(format))
|
||||
end
|
||||
end
|
||||
html.css("body").to_html.html_safe
|
||||
end
|
||||
end
|
||||
else
|
||||
return "<div class='well'>There is a problem with the design. We will try to fix it as soon as possible. Sorry for the inconvenience!! :(</div>".html_safe
|
||||
end
|
||||
end
|
||||
end
|
||||
def get_layouts(module_app)
|
||||
layout_types = []
|
||||
@key = Site.first.template
|
||||
f = File.join("#{Rails.root}/app/templates/#{@key}/modules/#{module_app}/info.json")
|
||||
if File.exists?f
|
||||
info = File.read(f)
|
||||
hash = JSON.parse(info) rescue {}
|
||||
frontends = hash["frontend"] || []
|
||||
frontends.each do |frontend|
|
||||
frontend["thumbnail"] = "/assets/#{module_app}/thumbs/#{frontend["thumbnail"]}"
|
||||
layout_types << frontend
|
||||
end
|
||||
end
|
||||
if layout_types.empty?
|
||||
Dir.glob("#{Rails.root}/app/templates/#{@key}/modules/#{module_app}/*").each do |w|
|
||||
next if File.ftype(w).eql?("directory")
|
||||
w = File.basename(w, ".*")
|
||||
w = File.basename(w, ".*")
|
||||
if w[0,1] != "_" && w[0,1] != "s" && w != "info"
|
||||
layout_types << w
|
||||
end
|
||||
end
|
||||
end
|
||||
layout_types
|
||||
end
|
||||
end
|
|
@ -0,0 +1,173 @@
|
|||
class BulletinEvent
|
||||
include Mongoid::Document
|
||||
include Mongoid::Timestamps
|
||||
|
||||
include OrbitModel::Status
|
||||
include OrbitModel::Impression
|
||||
# encoding: utf-8
|
||||
include OrbitTag::Taggable
|
||||
include OrbitCategory::Categorizable
|
||||
include Slug
|
||||
require 'event_bulletin_model/cache'
|
||||
include EventBulletinModel::Cache
|
||||
SubPart.class_eval { include EventBulletinModel::Cache }
|
||||
Page.class_eval { include EventBulletinModel::Cache }
|
||||
before_destroy do
|
||||
EventAnnsCache.all.destroy
|
||||
end
|
||||
field :add_to_calendar,type: Boolean,default: false
|
||||
field :calendar_start_date, :type => DateTime
|
||||
field :calendar_end_date, :type => DateTime
|
||||
field :calendar_all_day,type: Boolean,default: false
|
||||
field :calendar_type_id
|
||||
field :event_id
|
||||
|
||||
field :title, type: String, localize: true
|
||||
field :subtitle, localize: true
|
||||
field :speaker, localize: true
|
||||
field :host, localize: true
|
||||
field :text, localize: true
|
||||
field :notes, localize: true
|
||||
field :create_user_id
|
||||
field :update_user_id
|
||||
field :public, :type => Boolean, :default => true
|
||||
field :postdate , :type => DateTime, :default => Time.now
|
||||
field :deadline , :type => DateTime
|
||||
field :eventdate, :type => DateTime
|
||||
field :rss2_sn
|
||||
field :approved, :type => Boolean, :default => false
|
||||
field :is_preview, :type => Boolean, :default => false
|
||||
field :expirable_created_at, type: DateTime
|
||||
field :rejected, :type => Boolean, :default => false
|
||||
field :reapproval, :type => Boolean, :default => false
|
||||
field :rejection_reason
|
||||
field :is_external_link, :type => Boolean, :default => false
|
||||
field :external_link
|
||||
field :display_subtitle, :type => Boolean, :default => false
|
||||
field :display_img, :type => Boolean, :default => false
|
||||
|
||||
field :email_id
|
||||
field :email_sent, :type => Boolean, :default => false
|
||||
field :email_sentdate , :type => DateTime
|
||||
field :email_member_ids
|
||||
field :other_mailaddress
|
||||
field :image_description, localize: true
|
||||
field :top_end_date, :type => DateTime
|
||||
|
||||
mount_uploader :image, ImageUploader
|
||||
|
||||
has_many :bulletin_event_links, :autosave => true, :dependent => :destroy
|
||||
has_many :bulletin_event_files, :autosave => true, :dependent => :destroy
|
||||
|
||||
accepts_nested_attributes_for :bulletin_event_files, :allow_destroy => true
|
||||
accepts_nested_attributes_for :bulletin_event_links, :allow_destroy => true
|
||||
|
||||
before_destroy :destroy_email
|
||||
|
||||
scope :can_display_and_sorted, ->{where(:is_hidden=>false,:is_preview => false).any_of({:postdate.lte=>Time.now, :deadline.gte=>Time.now},{:postdate.lte=>Time.now, :deadline=>nil}).order(is_top: :desc,postdate: :desc,id: :desc)}
|
||||
scope :is_approved, ->{where(:approved => true)}
|
||||
|
||||
before_create :set_expire
|
||||
before_save :check_limit
|
||||
|
||||
def calendar_type
|
||||
CalendarType.where(:category_id.in => self.calendar_type_id)
|
||||
end
|
||||
def event
|
||||
if !self.event_id.nil?
|
||||
Event.where(:id => self.event_id).first
|
||||
else
|
||||
nil
|
||||
end
|
||||
end
|
||||
def check_limit
|
||||
check_status_limit(update_user)
|
||||
end
|
||||
def check_status_limit(user,check_only=false)
|
||||
role_ids = user.member_profile.roles.map(&:id) rescue []
|
||||
status_settings = (role_ids.collect do |role_id|
|
||||
EventAnnSetting.first.event_anns_status_settings.select{|v| v.role_id.to_s == role_id.to_s}
|
||||
end.flatten rescue [])
|
||||
reach_limit = []
|
||||
if status_settings.count != 0
|
||||
reach_limit = status_settings.collect do |status_setting|
|
||||
status = status_setting.status
|
||||
if status_setting.top_limit.to_i <= BulletinEvent.where(:update_user_id.in => Role.find(status_setting.role_id).member_profiles.collect(&:user).flatten.uniq.map{|v| v.id},status => true).count
|
||||
if !check_only
|
||||
if self[status] && !BulletinEvent.where(id:self.id).first[status]
|
||||
self[status] = false
|
||||
nil
|
||||
end
|
||||
else
|
||||
status
|
||||
end
|
||||
else
|
||||
nil
|
||||
end
|
||||
end.compact
|
||||
reach_limit = reach_limit.group_by{|v| v}.collect do |k,v|
|
||||
if v.count >= user.member_profile.roles.count
|
||||
k
|
||||
else
|
||||
nil
|
||||
end
|
||||
end.compact
|
||||
end
|
||||
reach_limit
|
||||
end
|
||||
def slug_title
|
||||
doc = Nokogiri::HTML(self.title)
|
||||
title = doc.text.gsub('/','-')
|
||||
end
|
||||
def set_expire
|
||||
self.expirable_created_at = Time.now if self.is_preview
|
||||
return true
|
||||
end
|
||||
|
||||
def update_user
|
||||
User.find(update_user_id) rescue nil
|
||||
end
|
||||
|
||||
def update_user=(user)
|
||||
self.update_user_id = user.id
|
||||
end
|
||||
|
||||
def email_members
|
||||
MemberProfile.find(self.email_member_ids) rescue []
|
||||
end
|
||||
|
||||
def email_addresses
|
||||
addresses = self.email_members.collect{|member| member.email} rescue []
|
||||
addresses = addresses +[self.other_mailaddress] if !self.other_mailaddress.blank?
|
||||
addresses.flatten
|
||||
end
|
||||
|
||||
def email
|
||||
mail = Email.find(self.email_id) rescue nil
|
||||
end
|
||||
|
||||
def expired?
|
||||
(self.deadline < Time.now) rescue false
|
||||
end
|
||||
|
||||
def destroy_email
|
||||
mail = Email.find(self.email_id) rescue nil
|
||||
mail.destroy if !mail.nil?
|
||||
end
|
||||
|
||||
def self.remove_expired_status
|
||||
self.where(:is_top => true, :top_end_date.ne => nil, :top_end_date.lt => Time.now).each do |b|
|
||||
b.is_top = false
|
||||
b.top_end_date = nil
|
||||
b.save
|
||||
end
|
||||
end
|
||||
|
||||
def display_subtitle?
|
||||
self.display_subtitle rescue false
|
||||
end
|
||||
|
||||
def display_img?
|
||||
self.display_img rescue false
|
||||
end
|
||||
end
|
|
@ -0,0 +1,24 @@
|
|||
# encoding: utf-8
|
||||
class BulletinEventFile
|
||||
|
||||
include Mongoid::Document
|
||||
include Mongoid::Timestamps
|
||||
|
||||
mount_uploader :file, AssetUploader
|
||||
|
||||
field :description, localize: true
|
||||
field :title, localize: true
|
||||
field :choose_lang, :type => Array, :default => ["en","zh_tw"]
|
||||
|
||||
belongs_to :bulletin_event
|
||||
|
||||
|
||||
def enabled_for?(lang)
|
||||
if lang.nil?
|
||||
return true
|
||||
else
|
||||
return self.choose_lang.include?(lang)
|
||||
end
|
||||
end
|
||||
|
||||
end
|
|
@ -0,0 +1,25 @@
|
|||
# encoding: utf-8
|
||||
require 'uri'
|
||||
|
||||
class BulletinEventLink
|
||||
include Mongoid::Document
|
||||
include Mongoid::Timestamps
|
||||
|
||||
field :url
|
||||
field :title, localize: true
|
||||
|
||||
belongs_to :bulletin_event
|
||||
|
||||
before_validation :add_http
|
||||
|
||||
validates :url, :presence => true, :format => /\A(http|https):\/\/(([a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5})|((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))(:[0-9]{1,5})?(\/.*)?\Z/i
|
||||
|
||||
protected
|
||||
|
||||
def add_http
|
||||
unless self.url[/^http:\/\//] || self.url[/^https:\/\//]
|
||||
self.url = 'http://' + self.url
|
||||
end
|
||||
end
|
||||
|
||||
end
|
|
@ -0,0 +1,9 @@
|
|||
class BulletinFeedEvent
|
||||
include Mongoid::Document
|
||||
include Mongoid::Timestamps
|
||||
include Slug
|
||||
|
||||
field :title, as: :slug_title, type: String, localize: true
|
||||
field :tag_ids, type: Array, default: []
|
||||
|
||||
end
|
|
@ -0,0 +1,23 @@
|
|||
class EventAnnSetting
|
||||
include Mongoid::Document
|
||||
include Mongoid::Timestamps
|
||||
|
||||
field :top_limit, type: Integer, :default => 0
|
||||
field :pro_enabled, type: Boolean, :default => false
|
||||
field :approvers, type: Array, :default => []
|
||||
field :email_to, type: Array, :default => ["admins","managers","approvers"]
|
||||
field :is_display_edit_only, type: Boolean, :default => false
|
||||
field :only_manager_can_edit_status, type: Boolean, :default => false
|
||||
has_many :event_anns_status_settings, :autosave => true, :dependent => :destroy
|
||||
accepts_nested_attributes_for :event_anns_status_settings, :allow_destroy => true
|
||||
def self.check_limit_for_user(user_id, b_id = nil)
|
||||
limit = self.first.top_limit rescue 0
|
||||
return true if limit == 0
|
||||
count = BulletinEvent.where(:is_top => true, :create_user_id => user_id, :id.ne => b_id).count
|
||||
return count < limit
|
||||
end
|
||||
|
||||
def self.is_pro?
|
||||
self.first.pro_enabled rescue false
|
||||
end
|
||||
end
|
|
@ -0,0 +1,6 @@
|
|||
class EventAnnsCache
|
||||
include Mongoid::Document
|
||||
field :parent_id
|
||||
field :filter_result
|
||||
field :locale,type: String,default: 'zh_tw'
|
||||
end
|
|
@ -0,0 +1,7 @@
|
|||
class EventAnnsStatusSetting
|
||||
include Mongoid::Document
|
||||
field :role_id
|
||||
field :status
|
||||
field :top_limit
|
||||
belongs_to :event_ann_setting
|
||||
end
|
|
@ -0,0 +1,122 @@
|
|||
<style>
|
||||
#approvalModal {
|
||||
width: 90%;
|
||||
height: 600px;
|
||||
top: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
margin: auto;
|
||||
position: absolute;
|
||||
}
|
||||
#approvalModal .preview-iframe {
|
||||
border: 0;
|
||||
outline: none;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
#approvalModal .modal-body {
|
||||
background-color: #fff;
|
||||
padding: 0;
|
||||
max-height: none;
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
}
|
||||
#approvalModal .modal-left {
|
||||
overflow: auto;
|
||||
float: left;
|
||||
width: 19.8%;
|
||||
border-right: 1px solid #DFDFDF;
|
||||
height: 100%;
|
||||
padding: 1em;
|
||||
margin: 0;
|
||||
-webkit-box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
#approvalModal .modal-right {
|
||||
float: right;
|
||||
width: 80%;
|
||||
height: 100%;
|
||||
}
|
||||
.approvalModal__form {
|
||||
padding: 0 10px;
|
||||
margin: 0;
|
||||
}
|
||||
label.approvalModal__radio {
|
||||
display: inline-block;
|
||||
}
|
||||
label.control-label {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.approvalModal__controls {
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.approvalModal__group {
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
label.approvalModal__label {
|
||||
display: inline-block;
|
||||
margin: 0 4px 0 7px;
|
||||
position: relative;
|
||||
top: -1px;
|
||||
}
|
||||
.approvalModal__controls .approvalModal__privacy {
|
||||
margin: 0 5px;
|
||||
}
|
||||
.approvalModal__controls .approvalModal__large {
|
||||
}
|
||||
#approvalModal .modal-footer {
|
||||
text-align: left;
|
||||
padding: 15px 10px 10px;
|
||||
}
|
||||
.approvalModal__group.confirm {
|
||||
float: right;
|
||||
}
|
||||
</style>
|
||||
<div id="approvalModal" class="modal hide fade" role="dialog">
|
||||
<div class="modal-header">
|
||||
<a class="close" data-dismiss="modal">×</a>
|
||||
<h3>預覽</h3>
|
||||
</div>
|
||||
<div class="modal-body clearfix">
|
||||
<div class="modal-left">
|
||||
<label for="____">寄送對象</label>
|
||||
</div>
|
||||
<div class="modal-right">
|
||||
<iframe class="preview-iframe"></iframe>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<%= form_tag "/admin/event_ann/approve_bulletin", :class=>"approvalModal__form" do %>
|
||||
<div class="approvalModal__group">
|
||||
<label class="control-label" for="bulletin_approval_stat">審核狀態</label>
|
||||
<div class="approvalModal__controls">
|
||||
<label class="approvalModal__radio">
|
||||
<input class="approvalModal__privacy" id="bulletin_is_checked_true" name="approved" type="radio" value="true">已認可
|
||||
</label>
|
||||
<label class="approvalModal__radio">
|
||||
<input checked="checked" class="approvalModal__privacy" id="bulletin_approved_false" name="approved" type="radio" value="false">拒絕
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="approvalModal__group group--reject">
|
||||
<label class="approvalModal__label" for="is_checked_false_拒絕原因">拒絕原因</label>
|
||||
<div class="approvalModal__controls">
|
||||
<input class="approvalModal__large" id="bulletin_not_checked_reason" name="reason" size="30" type="text">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="approvalModal__group confirm">
|
||||
<input class="approvalModal__btn btn btn-primary" name="commit" type="submit" value="送出">
|
||||
<input type="hidden" id="object_id" name="id" />
|
||||
<button class="approvalModal__btn btn" data-dismiss="modal" aria-hidden="true">關閉</button>
|
||||
</div>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
|
@ -0,0 +1,38 @@
|
|||
<%= form_for @event_ann_feed, url: admin_event_ann_updatefeed_path(:id => @event_ann_feed.id), html: {class: "form-horizontal main-forms"} do |f| %>
|
||||
<fieldset>
|
||||
<% @site_in_use_locales.each do |locale| %>
|
||||
<%= f.fields_for :title_translations do |f| %>
|
||||
<div class="control-group">
|
||||
<label class="control-label muted" for="bulletin_feed_title_translations_<%= locale.to_s %>"><%= t(:title) + " (#{t(locale.to_s)})" %></label>
|
||||
<div class="controls">
|
||||
<%= f.text_field locale, data: {"fv-validation" => "required;","fv-messages" => "Cannot be empty.;"}, value: (@event_ann_feed.title_translations[locale.to_s] rescue nil) %>
|
||||
</div>
|
||||
</div>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<hr />
|
||||
<div class="tags">
|
||||
<div id="tags-list">
|
||||
<ul class="tags-groups checkbox-card module-tags">
|
||||
<% @module_app.tags.each do |tag| %>
|
||||
<li class="filter-item module">
|
||||
<p class='card pull-left <%= @event_ann_feed.tag_ids.include?(tag.id.to_s) ? "active" : "" %>'>
|
||||
<input type="checkbox" <%= @event_ann_feed.tag_ids.include?(tag.id.to_s) ? "checked=checked" : "" %> class="tag-checkbox" value="<%= tag.id.to_s %>" name="bulletin_feed[tag_ids][]">
|
||||
</p>
|
||||
<a href="#" onclick="return false;">
|
||||
<% @site_in_use_locales.each_with_index do |locale,index| %>
|
||||
<span class="tag"><%= tag.name_translations[locale] %></span>
|
||||
<% if index < (@site_in_use_locales.count - 1) %>
|
||||
/
|
||||
<% end %>
|
||||
<% end %>
|
||||
</a>
|
||||
</li>
|
||||
<% end %>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
<% end %>
|
||||
|
||||
|
|
@ -0,0 +1,51 @@
|
|||
<tr>
|
||||
<td>
|
||||
<%= feed.title %>
|
||||
<div class="quick-edit">
|
||||
<ul class="nav nav-pills">
|
||||
<% if can_edit_or_delete?(feed) %>
|
||||
<li><a href="#" class="edit-feed" data-feed-id="<%= feed.id.to_s %>"><%= t(:edit) %></a></li>
|
||||
<li><a href="/admin/event_ann/deletefeed?id=<%= feed.id.to_s %>" class="delete-feed text-error" ><%= t(:delete_) %></a></li>
|
||||
<% end %>
|
||||
</ul>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="tags">
|
||||
<div id="tags-list">
|
||||
<ul class="tags-groups checkbox-card module-tags">
|
||||
<% tags_to_remove = [] %>
|
||||
<% feed.tag_ids.each do |t| %>
|
||||
<% tag = Tag.find(t) rescue nil %>
|
||||
<% if !tag.nil? %>
|
||||
<li class="filter-item module">
|
||||
<a href="#" onclick="return false;">
|
||||
<% @site_in_use_locales.each_with_index do |locale,index| %>
|
||||
<span class="tag"><%= tag.name_translations[locale] %></span>
|
||||
<% if index < (@site_in_use_locales.count - 1) %>
|
||||
/
|
||||
<% end %>
|
||||
<% end %>
|
||||
</a>
|
||||
</li>
|
||||
<% else %>
|
||||
<% tags_to_remove << t %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% if !tags_to_remove.blank?
|
||||
tags_to_remove.each do |t|
|
||||
feed.tag_ids.delete(t)
|
||||
end
|
||||
feed.save
|
||||
end %>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<a href="/xhr/event_anns/rssfeed/<%= feed.uid %>.rss" target="_blank">RSS Feed</a>
|
||||
</td>
|
||||
<td>
|
||||
<a href="/xhr/event_anns/feed/<%= feed.uid %>.json" target="_blank">JSON Feed</a>
|
||||
</td>
|
||||
</tr>
|
|
@ -0,0 +1,38 @@
|
|||
<%= form_for @event_ann_feed, url: admin_event_ann_createfeed_path, html: {class: "form-horizontal main-forms"} do |f| %>
|
||||
<fieldset>
|
||||
<% @site_in_use_locales.each do |locale| %>
|
||||
<%= f.fields_for :title_translations do |f| %>
|
||||
<div class="control-group">
|
||||
<label class="control-label muted" for="bulletin_feed_title_translations_<%= locale.to_s %>"><%= t(:title) + " (#{t(locale.to_s)})" %></label>
|
||||
<div class="controls">
|
||||
<%= f.text_field locale, data: {"fv-validation" => "required;","fv-messages" => "Cannot be empty.;"}, value: (@event_ann_feed.title_translations[locale.to_s] rescue nil) %>
|
||||
</div>
|
||||
</div>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<hr />
|
||||
<div class="tags">
|
||||
<div id="tags-list">
|
||||
<ul class="tags-groups checkbox-card module-tags">
|
||||
<% @module_app.tags.each do |tag| %>
|
||||
<li class="filter-item module">
|
||||
<p class="card pull-left">
|
||||
<input type="checkbox" class="tag-checkbox" value="<%= tag.id.to_s %>" name="bulletin_feed[tag_ids][]">
|
||||
</p>
|
||||
<a href="#" onclick="return false;">
|
||||
<% @site_in_use_locales.each_with_index do |locale,index| %>
|
||||
<span class="tag"><%= tag.name_translations[locale] %></span>
|
||||
<% if index < (@site_in_use_locales.count - 1) %>
|
||||
/
|
||||
<% end %>
|
||||
<% end %>
|
||||
</a>
|
||||
</li>
|
||||
<% end %>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
<% end %>
|
||||
|
||||
|
|
@ -0,0 +1,619 @@
|
|||
<% content_for :page_specific_css do %>
|
||||
<%= stylesheet_link_tag "lib/main-forms" %>
|
||||
<%= stylesheet_link_tag "lib/fileupload" %>
|
||||
<%= stylesheet_link_tag "lib/main-list" %>
|
||||
<% end %>
|
||||
<style type="text/css">
|
||||
.reach_limit{
|
||||
background: #a90c0c;
|
||||
color: white;
|
||||
padding: 4px 12px;
|
||||
font-family: 'Varela Round';
|
||||
letter-spacing: -.4px;
|
||||
cursor: default;
|
||||
display: inline-block;
|
||||
}
|
||||
</style>
|
||||
<% 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/file-type" %>
|
||||
<%= javascript_include_tag "lib/module-area" %>
|
||||
<%= javascript_include_tag "form" %>
|
||||
<% end %>
|
||||
<script type="text/javascript">
|
||||
function trigger_on_add_calendar(ele){
|
||||
if ($(ele).prop('checked')){
|
||||
$('.trigger_on_add_calendar').show()
|
||||
}else{
|
||||
$('.trigger_on_add_calendar').hide()
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<!-- Input Area -->
|
||||
<div class="input-area">
|
||||
|
||||
<!-- Module Tabs -->
|
||||
<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>
|
||||
<% if defined? Calendar %>
|
||||
<li><a href="#calendar" data-toggle="tab"><%= t('calendar.calendar') %></a></li>
|
||||
<% end %>
|
||||
<% if((!EventAnnSetting.first.only_manager_can_edit_status) || (EventAnnSetting.first.only_manager_can_edit_status && (@current_user.is_admin? || @current_user.is_manager?(@module_app))) ) %>
|
||||
<li><a href="#status" data-toggle="tab"><%= t(:status) %></a></li>
|
||||
<% end %>
|
||||
<li><a href="#tag" data-toggle="tab"><%= t(:tags) %></a></li>
|
||||
<li><a href="#imageupload" data-toggle="tab"><%= t('event_ann.image') %></a></li>
|
||||
<li><a href="#mail-group" data-toggle="tab"><%= t('event_ann.email_reminder')%></a></li>
|
||||
</ul>
|
||||
<!-- Module -->
|
||||
<div class="tab-content module-area">
|
||||
|
||||
<!-- Basic Module -->
|
||||
<div class="tab-pane fade in active" id="basic">
|
||||
|
||||
<!-- Category -->
|
||||
<div class="control-group">
|
||||
<label class="control-label muted"><%= t(:category) %></label>
|
||||
<div class="controls">
|
||||
<%= select_category(f, @module_app) %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Date Time Picker -->
|
||||
<div class="control-group">
|
||||
<label class="control-label muted"><%= t("event_ann.event_date") %></label>
|
||||
<div class="controls">
|
||||
<%= f.datetime_picker :eventdate, :no_label => true, :new_record => @bulletin_event.new_record?, :data=>{"picker-type" => "range", "range" => "event_date"} %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label muted"><%= t("event_ann.start_date") %></label>
|
||||
<div class="controls">
|
||||
<%= f.datetime_picker :postdate, :no_label => true, :new_record => @bulletin_event.new_record?, :data=>{"picker-type" => "range", "range" => "start"} %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label muted"><%= t("event_ann.end_date") %></label>
|
||||
<div class="controls">
|
||||
<%= f.datetime_picker :deadline, :no_label => true, :new_record => @bulletin_event.new_record?, :data=>{"picker-type" => "range", "range" => "end"} %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<%= f.label :is_external_link, t("event_ann.is_external_link"), :class => "control-label muted" %>
|
||||
<div class="controls">
|
||||
<%= f.check_box :is_external_link %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group" style="display: none;" id="external_link_box">
|
||||
<%= f.label :external_link, t("event_ann.external_link"), :class => "control-label muted" %>
|
||||
<div class="controls">
|
||||
<%= f.text_field :external_link %>
|
||||
<div class="hint"><%= t("event_ann.external_link_hint") %></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- display subtitle -->
|
||||
<div class="control-group">
|
||||
<%= f.label :display_subtitle, t("event_ann.display_subtitle"), :class => "control-label muted" %>
|
||||
<div class="controls">
|
||||
<%= f.check_box :display_subtitle %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- display img src -->
|
||||
<div class="control-group">
|
||||
<%= f.label :display_img, t("event_ann.display_img"), :class => "control-label muted" %>
|
||||
<div class="controls">
|
||||
<%= f.check_box :display_img %>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Calendar Module -->
|
||||
<% if defined? Calendar %>
|
||||
<div class="tab-pane fade" id="calendar">
|
||||
<div class="control-group">
|
||||
<label class="control-label muted"><%= t('event_ann.add_to_calendar') %></label>
|
||||
<div class="controls">
|
||||
<%= f.check_box :add_to_calendar,onchange: 'trigger_on_add_calendar(this)' %>
|
||||
</div>
|
||||
</div>
|
||||
<div class="trigger_on_add_calendar" <%= "style=display:none;" if !@bulletin_event.add_to_calendar %>>
|
||||
<div class="control-group">
|
||||
<label class="control-label muted"><%= t('calendar.calendar') %></label>
|
||||
<div class="controls">
|
||||
<%= f.select :calendar_type_id, @calendar_categories.collect{|t| [ t.title, t.id ]} %>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group" style="display: flex;flex-wrap: wrap;">
|
||||
<div style="display: flex;flex-direction: column;">
|
||||
<label class="control-label muted"><%= t("event_ann.event_date") %></label>
|
||||
<label class="control-label muted"><%= t('event_ann.blank_to_set') %></label>
|
||||
</div>
|
||||
<div class="controls" style="margin-left: 1.5em;">
|
||||
<%= f.datetime_picker :calendar_end_date, :new_record => @bulletin_event.new_record?, :no_label => true, :data=>{"picker-type" => "range", "range" => "end"} %>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group" style="display: flex;flex-wrap: wrap;">
|
||||
<div style="display: flex;flex-direction: column;">
|
||||
<label class="control-label muted"><%= t("event_ann.start_date") %></label>
|
||||
<label class="control-label muted"><%= t('event_ann.blank_to_set') %></label>
|
||||
</div>
|
||||
<div class="controls" style="margin-left: 1.5em;">
|
||||
<%= f.datetime_picker :calendar_start_date, :new_record => @bulletin_event.new_record?, :no_label => true, :data=>{"picker-type" => "range", "range" => "start"} %>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group" style="display: flex;flex-wrap: wrap;">
|
||||
<div style="display: flex;flex-direction: column;">
|
||||
<label class="control-label muted"><%= t("event_ann.end_date") %></label>
|
||||
<label class="control-label muted"><%= t('event_ann.blank_to_set') %></label>
|
||||
</div>
|
||||
<div class="controls" style="margin-left: 1.5em;">
|
||||
<%= f.datetime_picker :calendar_end_date, :new_record => @bulletin_event.new_record?, :no_label => true, :data=>{"picker-type" => "range", "range" => "end"} %>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label muted"><%= t('calendar.all_day') %></label>
|
||||
<div class="controls">
|
||||
<%= f.check_box :calendar_all_day %>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<%= f.hidden_field :event_id %>
|
||||
</div>
|
||||
<% end %>
|
||||
<!-- Status Module -->
|
||||
<% if((!EventAnnSetting.first.only_manager_can_edit_status) || (EventAnnSetting.first.only_manager_can_edit_status && (@current_user.is_admin? || @current_user.is_manager?(@module_app))) ) %>
|
||||
<div class="tab-pane fade" id="status">
|
||||
<!-- Status -->
|
||||
<div class="control-group">
|
||||
<label class="control-label muted"><%= t(:status) %></label>
|
||||
<div class="controls" data-toggle="buttons-checkbox">
|
||||
<% if !(@reach_limit.include?('is_top') && @bulletin_event.is_top != true) || current_user.is_admin? %>
|
||||
<label class="checkbox inline btn <%= 'active' if @bulletin_event.is_top? || (!@bulletin_event.top_end_date.nil? && @bulletin_event.top_end_date > Time.now) %>">
|
||||
<%= f.check_box :is_top %> <%= t(:top) %>
|
||||
</label>
|
||||
<% else %>
|
||||
<label class="reach_limit">
|
||||
<%= t(:top) %>
|
||||
</label>
|
||||
<% end %>
|
||||
<% if !(@reach_limit.include?('is_hot') && @bulletin_event.is_hot != true) || current_user.is_admin? %>
|
||||
<label class="checkbox inline btn <%= 'active' if @bulletin_event.is_hot? %>">
|
||||
<%= f.check_box :is_hot %> <%= t(:hot) %>
|
||||
</label>
|
||||
<% else %>
|
||||
<label class="reach_limit">
|
||||
<%= t(:hot) %>
|
||||
</label>
|
||||
<% end %>
|
||||
<label class="checkbox inline btn <%= 'active' if @bulletin_event.is_hidden? %>">
|
||||
<%= f.check_box :is_hidden %> <%= t(:hide) %>
|
||||
</label>
|
||||
</div>
|
||||
<div class="controls">
|
||||
<% if !@bulletin_event.is_top? && !EventAnnSetting.check_limit_for_user((@bulletin_event.new_record? ? current_user.id : @bulletin_event.create_user_id)) %>
|
||||
<span>Top limit has been reached. The bulletin_event wont be marked as top even if you click on it.</span>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group <%= @bulletin_event.is_top? || (!@bulletin_event.top_end_date.nil? && @bulletin_event.top_end_date > Time.now) ? "" : "hide" %>" data-for="is_top">
|
||||
<label for="" class="control-label muted">Top end time</label>
|
||||
<div class="controls">
|
||||
<%= f.datetime_picker :top_end_date, :no_label => true, :new_record => @bulletin_event.new_record? %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<!-- Tag Module -->
|
||||
<div class="tab-pane fade" id="tag">
|
||||
<div class="control-group">
|
||||
<label class="control-label muted"><%= t(:tags) %></label>
|
||||
<%= select_tags(f, @module_app) %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Images Module -->
|
||||
<div class="tab-pane fade" id="imageupload">
|
||||
|
||||
<!-- Images Upload -->
|
||||
<div class="control-group">
|
||||
<label class="control-label muted"><%= t(:image) %></label>
|
||||
<div class="controls">
|
||||
<div class="fileupload fileupload-new clearfix <%= 'fileupload-edit' if @bulletin_event.image.file %>" data-provides="fileupload">
|
||||
<div class="fileupload-new thumbnail pull-left">
|
||||
<% if @bulletin_event.image.file %>
|
||||
<%= image_tag @bulletin_event.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>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<% @site_in_use_locales.each do |locale| %>
|
||||
<%= f.fields_for :image_description_translations do |f| %>
|
||||
<div class="control-group">
|
||||
<label class="control-label muted" for="image_description_<%= locale.to_s %>"><%= t(:description) + " (#{t(locale.to_s)})" %></label>
|
||||
<div class="controls">
|
||||
<%= f.text_field locale, value: (@bulletin_event.image_description_translations[locale.to_s] rescue nil) %>
|
||||
</div>
|
||||
</div>
|
||||
<% end %>
|
||||
<% end %>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<!-- Mail Group Module -->
|
||||
<div class="tab-pane fade" id="mail-group">
|
||||
|
||||
<!-- Mail Group -->
|
||||
<div class="control-group">
|
||||
<label class="control-label muted"><%= t("event_ann.email_to") %></label>
|
||||
<div class="controls">
|
||||
|
||||
<label class="checkbox inline">
|
||||
<%= check_box_tag('bulletin_event[email_sent]', '1', (!@bulletin_event.email_sent.blank? ? true : false), :id=>'remind-check') %><%= t('event_ann.activate_email_reminder')%>
|
||||
</label>
|
||||
|
||||
<div class="content-box">
|
||||
<%= render partial: 'admin/member_selects/email_selection_box', locals: {field: 'bulletin_event[email_member_ids][]', email_members: @bulletin_event.email_members} %>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label muted"></label>
|
||||
<div class="controls">
|
||||
<div class="content-box">
|
||||
<span class="help-block"><%= "#{t("event_ann.other_mailaddress")}(#{t("event_ann.other_mailaddress_note")})"%> </span>
|
||||
<%= f.text_area :other_mailaddress, :class=>"span12", :cols=>"25", :rows=>"10" %>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="content-box">
|
||||
<div class="control-group">
|
||||
<label class="control-label muted"><%= t("event_ann.email_sentdate") %></label>
|
||||
<div class="controls">
|
||||
<%= f.datetime_picker :email_sentdate, :no_label => true %>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<% if (@bulletin_event.email.is_sent rescue false) %>
|
||||
<div class="content-box">
|
||||
<div class="control-group">
|
||||
<label class="control-label muted"><%= t("event_ann.resend_mail") %></label>
|
||||
<div class="controls">
|
||||
<input type="checkbox" name="resend_mail" value="true">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- Language Tabs -->
|
||||
<div class="nav-name"><strong><%= t(:language) %></strong></div>
|
||||
<ul class="nav nav-pills language-nav">
|
||||
<% @site_in_use_locales.each_with_index do |locale, i| %>
|
||||
<li class="<%= 'active' if i == 0 %>">
|
||||
<a data-toggle="tab" href=".<%= locale %>"><%= t(locale) %></a>
|
||||
</li>
|
||||
<% end %>
|
||||
</ul>
|
||||
|
||||
<!-- Language -->
|
||||
<div class="tab-content language-area">
|
||||
|
||||
<% @site_in_use_locales.each_with_index do |locale, i| %>
|
||||
|
||||
<div class="<%= locale %> tab-pane fade <%= ( i == 0 ) ? "in active" : '' %>">
|
||||
|
||||
<!-- Title-->
|
||||
<div class="control-group input-title">
|
||||
<label class="control-label muted"><%= t(:title) %></label>
|
||||
<div class="controls">
|
||||
<%= f.fields_for :title_translations do |f| %>
|
||||
<%= f.text_area locale, class: "ckeditor_reduce input-block-level", placeholder: t(:title), value: (@bulletin_event.title_translations[locale] rescue nil) %>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Sub Title -->
|
||||
<div class="control-group input-subtitle">
|
||||
<label class="control-label muted"><%= t(:subtitle) %></label>
|
||||
<div class="controls">
|
||||
<div class="textarea">
|
||||
<%= f.fields_for :subtitle_translations do |f| %>
|
||||
<%= f.text_area locale, rows: 2, class: "ckeditor input-block-level", value: (@bulletin_event.subtitle_translations[locale] rescue nil) %>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Others Info -->
|
||||
<div class="control-group input-speaker">
|
||||
<label class="control-label muted"><%= t("event_ann.speaker") %></label>
|
||||
<div class="controls">
|
||||
<div class="textarea">
|
||||
<%= f.fields_for :speaker_translations do |f| %>
|
||||
<%= f.text_area locale, class: "input-block-level", value: (@bulletin_event.speaker_translations[locale] rescue nil) %>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group input-host">
|
||||
<label class="control-label muted"><%= t("event_ann.host") %></label>
|
||||
<div class="controls">
|
||||
<div class="textarea">
|
||||
<%= f.fields_for :host_translations do |f| %>
|
||||
<%= f.text_area locale, class: "input-block-level", value: (@bulletin_event.host_translations[locale] rescue nil) %>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Content -->
|
||||
<div class="control-group input-content">
|
||||
<label class="control-label muted"><%= t(:content) %></label>
|
||||
<div class="controls">
|
||||
<div class="textarea">
|
||||
<%= f.fields_for :text_translations do |f| %>
|
||||
<%= f.cktext_area locale, rows: 5, class: "input-block-level", :value => (@bulletin_event.text_translations[locale] rescue nil) %>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group input-notes">
|
||||
<label class="control-label muted"><%= t("event_ann.notes") %></label>
|
||||
<div class="controls">
|
||||
<div class="textarea">
|
||||
<%= f.fields_for :notes_translations do |f| %>
|
||||
<%= f.text_area locale, rows: 2, class: "ckeditor input-block-level", value: (@bulletin_event.notes_translations[locale] rescue nil) %>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<% end %>
|
||||
|
||||
<!-- Link -->
|
||||
<div class="control-group">
|
||||
<label class="control-label muted"><%= t(:link) %></label>
|
||||
<div class="controls add-input">
|
||||
|
||||
<!-- Exist -->
|
||||
<% if @bulletin_event && !@bulletin_event.bulletin_event_links.blank? %>
|
||||
<div class="exist">
|
||||
<% @bulletin_event.bulletin_event_links.each_with_index do |bulletin_event_link, i| %>
|
||||
<%= f.fields_for :bulletin_event_links, bulletin_event_link do |f| %>
|
||||
<%= render :partial => 'form_link', :object => bulletin_event_link, :locals => {:f => f, :i => i} %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<hr>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<!-- Add -->
|
||||
<div class="add-target">
|
||||
</div>
|
||||
<p class="add-btn">
|
||||
<%= hidden_field_tag 'bulletin_event_link_field_count', @bulletin_event.bulletin_event_links.count %>
|
||||
<a id="add_link" class="trigger btn btn-small btn-primary"><i class="icons-plus"></i> <%= t(:add) %></a>
|
||||
</p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- File -->
|
||||
<div class="control-group">
|
||||
<label class="control-label muted"><%= t(:file_) %></label>
|
||||
<div class="controls">
|
||||
|
||||
<!-- Exist -->
|
||||
<% if @bulletin_event && !@bulletin_event.bulletin_event_files.blank? %>
|
||||
<div class="exist">
|
||||
<% @bulletin_event.bulletin_event_files.each_with_index do |bulletin_event_file, i| %>
|
||||
<%= f.fields_for :bulletin_event_files, bulletin_event_file do |f| %>
|
||||
<%= render :partial => 'form_file', :object => bulletin_event_file, :locals => {:f => f, :i => i} %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<hr>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<!-- Add -->
|
||||
<div class="add-target">
|
||||
</div>
|
||||
<p class="add-btn">
|
||||
<%= hidden_field_tag 'bulletin_event_file_field_count', @bulletin_event.bulletin_event_files.count %>
|
||||
<a id="add_file" class="trigger btn btn-small btn-primary"><i class="icons-plus"></i> <%= t(:add) %></a>
|
||||
</p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- Form Actions -->
|
||||
<div class="form-actions">
|
||||
<%= get_referer_url[:action] rescue "" %>
|
||||
<%= f.submit t('submit'), class: 'btn btn-primary' %>
|
||||
<input type="hidden" name="referer_url" value="<%= get_referer_url %>">
|
||||
<%= button_tag t("preview"), id: "button_for_preview", name: "commit", class: 'btn', type: :button %>
|
||||
<%= link_to t('cancel'), admin_event_anns_path, :class=>"btn" %>
|
||||
</div>
|
||||
|
||||
<span id='show_preview'>
|
||||
<div class="modal hide fade in banner-preview" id="">
|
||||
<div class="modal-header">
|
||||
<a class="close" data-dismiss="modal">×</a>
|
||||
<h3><%= t(:preview) %></h3>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<iframe id="preview-iframe" src=""></iframe>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<a href="#" class="btn" data-dismiss="modal"><%= t(:close) %></a>
|
||||
</div>
|
||||
</div>
|
||||
</span>
|
||||
<% if !@module_app.tags.empty? %>
|
||||
<script type="text/javascript">
|
||||
$("form.previewable").on("submit", function(){
|
||||
if(!$("input[name='bulletin_event[tags][]']").is(":checked")){
|
||||
if(!confirm("You have selected no tag, do you wish to continue?")){
|
||||
return false;
|
||||
}
|
||||
}
|
||||
})
|
||||
</script>
|
||||
<% end %>
|
||||
<% content_for :page_specific_javascript do %>
|
||||
<script>
|
||||
function Appendzero(obj)
|
||||
{
|
||||
if(obj<10) return "0" +""+ obj;
|
||||
else return obj;
|
||||
}
|
||||
|
||||
$(function() {
|
||||
if (location.pathname.substr(-3)=='new'){
|
||||
var getDate = new Date();
|
||||
var toDay = getDate.getFullYear()+"/"+ (Appendzero(getDate.getMonth()+1))+"/"+Appendzero(getDate.getDate())+" "+Appendzero(getDate.getHours())+":"+Appendzero(getDate.getMinutes());
|
||||
$('input[name="bulletin_event[postdate]"]').val(toDay);
|
||||
}
|
||||
|
||||
$("#main-wrap").after("");
|
||||
|
||||
$(document).on('click', '#add_link', function(){
|
||||
var new_id = $(this).prev().attr('value');
|
||||
var old_id = new RegExp("new_bulletin_event_links", "g");
|
||||
var on = $('.language-nav li.active').index();
|
||||
var le = $(this).parent('.add-btn').prev('.add-target').children('.start-line').length;
|
||||
$(this).prev().attr('value', parseInt(new_id) + 1);
|
||||
$(this).parent().siblings('.add-target').append(("<%= escape_javascript(add_attribute 'form_link', f, :bulletin_event_links) %>").replace(old_id, new_id));
|
||||
$(this).parent('.add-btn').prev('.add-target').children('.start-line').eq(le).children('.tab-content').children('.tab-pane').eq(on).addClass('in active').siblings().removeClass('in active');
|
||||
formTip();
|
||||
});
|
||||
$(document).on('click', '#add_file', function(){
|
||||
var new_id = $(this).prev().attr('value');
|
||||
var old_id = new RegExp("new_bulletin_event_files", "g");
|
||||
var on = $('.language-nav li.active').index();
|
||||
var le = $(this).parent('.add-btn').prev('.add-target').children('.start-line').length;
|
||||
$(this).prev().attr('value', parseInt(new_id) + 1);
|
||||
$(this).parent().siblings('.add-target').append(("<%= escape_javascript(add_attribute 'form_file', f, :bulletin_event_files) %>").replace(old_id, new_id));
|
||||
$(this).parent('.add-btn').prev('.add-target').children('.start-line').eq(le).children('.input-append').find('.tab-content').each(function() {
|
||||
$(this).children('.tab-pane').eq(on).addClass('in active').siblings().removeClass('in active');
|
||||
});
|
||||
formTip();
|
||||
});
|
||||
$(document).on('click', '.delete_link', function(){
|
||||
$(this).parents('.input-prepend').remove();
|
||||
});
|
||||
$(document).on('click', '.delete_file', function(){
|
||||
$(this).parents('.input-prepend').remove();
|
||||
});
|
||||
$(document).on('click', '.remove_existing_record', function(){
|
||||
if(confirm("<%= I18n.t(:sure?)%>")){
|
||||
$(this).children('.should_destroy').attr('value', 1);
|
||||
$(this).parents('.start-line').hide();
|
||||
}
|
||||
});
|
||||
|
||||
$('#remind-check').prop('checked') ? '':$('.content-box').addClass('hide')
|
||||
$('#remind-check').on('change', function() {
|
||||
$(this).prop('checked') ? $('.content-box').removeClass('hide'):$('.content-box').addClass('hide')
|
||||
})
|
||||
|
||||
$('#button_for_preview').click(function(){
|
||||
var method = $('.main-forms input[name="_method"]').val();
|
||||
$('.main-forms input[name="_method"]').val("post");
|
||||
|
||||
for ( instance in CKEDITOR.instances )
|
||||
CKEDITOR.instances[instance].updateElement();
|
||||
|
||||
var formData = new FormData( $('.main-forms')[0] );
|
||||
formData.append("preview_type", ( (method==undefined) ? "new" : "edit" ));
|
||||
formData.append("bulletin_id", '<%= @bulletin_event.id.to_s %>');
|
||||
|
||||
$.ajax({
|
||||
type: "post",
|
||||
url: '<%= admin_event_ann_preview_path %>',
|
||||
data : formData,
|
||||
processData: false,
|
||||
contentType: false
|
||||
}).done(function(data){
|
||||
if(window.location.protocol === "https:"){
|
||||
data = data.replace("http:","https:");
|
||||
}
|
||||
$('.modal-body iframe').attr('src',data);
|
||||
$('#show_preview .modal').modal();
|
||||
$('#show_preview .modal').height(function() {
|
||||
return $(window).height() * 0.7;
|
||||
});
|
||||
|
||||
var slug = data.split('/')[(data.split('/').length-1)];
|
||||
// $('#preview-iframe').on('load', function(){
|
||||
// $.get('/admin/event_ann/destroy_preview/'+slug,function(data){
|
||||
// });
|
||||
// });
|
||||
});
|
||||
$('.main-forms input[name="_method"]').val(method);
|
||||
return false;
|
||||
});
|
||||
|
||||
$("#bulletin_is_top").parent().on("click",function(){
|
||||
setTimeout(function(){
|
||||
if($("#bulletin_is_top").parent().hasClass("active")){
|
||||
$("div[data-for=is_top]").removeClass("hide");
|
||||
}else{
|
||||
$("div[data-for=is_top]").addClass("hide");
|
||||
$("div[data-for=is_top]").find("input[type=text]").val("");
|
||||
}
|
||||
},100)
|
||||
})
|
||||
|
||||
$("#bulletin_is_external_link").on("click",function(){
|
||||
if($(this).is(":checked")){
|
||||
$("#external_link_box").show();
|
||||
}else{
|
||||
$("#external_link_box").hide();
|
||||
}
|
||||
})
|
||||
|
||||
});
|
||||
</script>
|
||||
<% end %>
|
|
@ -0,0 +1,69 @@
|
|||
<% if form_file.new_record? %>
|
||||
<div class="fileupload fileupload-new start-line" data-provides="fileupload">
|
||||
<% else %>
|
||||
<div class="fileupload fileupload-exists start-line" data-provides="fileupload">
|
||||
<% if form_file.file.blank? %>
|
||||
<%= t(:no_file) %>
|
||||
<% else %>
|
||||
<%= link_to content_tag(:i) + form_file.file_identifier, form_file.file.url, {:class => 'file-link file-type', :target => '_blank', :title => form_file.file_identifier} %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<div class="input-prepend input-append">
|
||||
<label>
|
||||
<span class="add-on btn btn-file" title='<%= t(:file_) %>'>
|
||||
<i class="icons-paperclip"></i>
|
||||
<%= f.file_field :file %>
|
||||
</span>
|
||||
<div class="uneditable-input input-medium">
|
||||
<i class="icon-file fileupload-exists"></i>
|
||||
<span class="fileupload-preview"><%= (form_file.new_record? || form_file.file.blank?) ? t(:select_file) : t(:change_file) %></span>
|
||||
</div>
|
||||
</label>
|
||||
<span class="add-on icons-pencil" title='<%= t(:alternative) %>'></span>
|
||||
<span class="tab-content">
|
||||
<% @site_in_use_locales.each_with_index do |locale, i| %>
|
||||
<span class="tab-pane fade <%= ( i == 0 ) ? "in active" : '' %> <%= locale %>">
|
||||
<%= f.fields_for :title_translations do |f| %>
|
||||
<%= f.text_field locale, :class => "input-medium", placeholder: t(:alternative), :value => (form_file.title_translations[locale] rescue nil) %>
|
||||
<% end %>
|
||||
</span>
|
||||
<% end %>
|
||||
</span>
|
||||
<span class="add-on icons-pencil" title='<%= t(:description) %>'></span>
|
||||
<span class="tab-content">
|
||||
<% @site_in_use_locales.each_with_index do |locale, i| %>
|
||||
<span class="tab-pane fade <%= ( i == 0 ) ? "in active" : '' %> <%= locale %>">
|
||||
<%= f.fields_for :description_translations do |f| %>
|
||||
<%= f.text_field locale, :class => "input-medium", placeholder: t(:description), :value => (form_file.description_translations[locale] rescue nil) %>
|
||||
<% end %>
|
||||
</span>
|
||||
<% end %>
|
||||
</span>
|
||||
</span>
|
||||
<span class="add-on btn-group btn" title="<%= t('archive.show_lang') %>">
|
||||
<i class="icons-earth"></i> <span class="caret"></span>
|
||||
<ul class="dropdown-menu">
|
||||
<% @site_in_use_locales.each do |locale| %>
|
||||
<li>
|
||||
<label class="checkbox">
|
||||
<%= check_box_tag "event[bulletin_event_files_attributes][#{( form_file.new_record? ? 'new_bulletin_event_files' : "#{i}" )}][choose_lang][]", locale, form_file.choose_lang.include?(locale.to_s) %>
|
||||
<%= t(locale.to_s) %>
|
||||
</label>
|
||||
</li>
|
||||
<% end %>
|
||||
</ul>
|
||||
<%= hidden_field_tag 'event[bulletin_event_files_attributes][0][choose_lang][]', '' %>
|
||||
</span>
|
||||
<% if form_file.new_record? %>
|
||||
<span class="delete_file add-on btn" title="<%= t(:delete_) %>">
|
||||
<a class="icon-trash"></a>
|
||||
</span>
|
||||
<% else %>
|
||||
<span class="remove_existing_record add-on btn" title="<%= t(:remove) %>">
|
||||
<%= f.hidden_field :id %>
|
||||
<a class="icon-remove"></a>
|
||||
<%= f.hidden_field :_destroy, :value => nil, :class => 'should_destroy' %>
|
||||
</span>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
|
@ -0,0 +1,26 @@
|
|||
<div class="input-prepend input-append start-line">
|
||||
<span class="add-on icons-link" title="<%= t(:url) %>"></span>
|
||||
<%= f.text_field :url, class: "input-large", placeholder: t(:url) %>
|
||||
<span class="add-on icons-pencil" title="<%= t(:url_alt) %>"></span>
|
||||
<span class="tab-content">
|
||||
<% @site_in_use_locales.each_with_index do |locale, i| %>
|
||||
<span class="tab-pane fade <%= ( i == 0 ) ? "in active" : '' %> <%= locale %>">
|
||||
<%= f.fields_for :title_translations do |f| %>
|
||||
<%= f.text_field locale, :class => "input-large", placeholder: t(:url_alt), :value => (form_link.title_translations[locale] rescue nil) %>
|
||||
<% end %>
|
||||
</span>
|
||||
<% end %>
|
||||
</span>
|
||||
|
||||
<% if form_link.new_record? %>
|
||||
<span class="delete_link add-on btn" title="<%= t(:delete_) %>">
|
||||
<a class="icon-trash"></a>
|
||||
</span>
|
||||
<% else %>
|
||||
<span class="remove_existing_record add-on btn" title="<%= t(:remove) %>">
|
||||
<%= f.hidden_field :id %>
|
||||
<a class="icon-remove"></a>
|
||||
<%= f.hidden_field :_destroy, :value => nil, :class => 'should_destroy' %>
|
||||
</span>
|
||||
<% end %>
|
||||
</div>
|
|
@ -0,0 +1,94 @@
|
|||
<table class="table main-list">
|
||||
<thead>
|
||||
<tr class="sort-header">
|
||||
<% @table_fields.each do |f| %>
|
||||
<%= thead(f) %>
|
||||
<% end %>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<% @bulletin_events.each do |b| %>
|
||||
<tr>
|
||||
<td>
|
||||
<%= b.status_for_table %>
|
||||
</td>
|
||||
<td>
|
||||
<%= b.category.title rescue "" %>
|
||||
<% if (b.category.disable rescue false) %>
|
||||
<span class='label'><%= t(:disabled) %></span>
|
||||
<% end %>
|
||||
</td>
|
||||
<td>
|
||||
<% if b.expired? || (b.category.disable rescue false)%>
|
||||
<%= b.title.to_s.html_safe %>
|
||||
<% else %>
|
||||
<a href="<%= page_for_bulletin(b) %>" target="_blank"><%= b.title.to_s.html_safe %></a>
|
||||
<% end %>
|
||||
|
||||
<% if b.expired? %>
|
||||
<span class='label'><%= t(:expired) %></span>
|
||||
<% end %>
|
||||
|
||||
<% if b.reapproval %>
|
||||
<span class='label'><%= t("event_ann.reapproval") + " " + t(:pending) %></span>
|
||||
<% end %>
|
||||
<% if b.rejected %>
|
||||
<span class='label'><%= t(:rejected) %> : <%= b.rejection_reason rescue "" %></span>
|
||||
<% end %>
|
||||
<% if !b.approved? && !b.rejected %>
|
||||
<span class='label'><%= t(:pending) %></span>
|
||||
<% end %>
|
||||
<div class="quick-edit">
|
||||
<ul class="nav nav-pills">
|
||||
<li><a href="#" class="detail-row" onclick="$('#<%= "#{b.id.to_s}-detail" %>').slideToggle(300); return false;"><%= t(:detail) %></a></li>
|
||||
<% if can_edit_or_delete?(b) %>
|
||||
<li><a href="/admin/event_anns/<%=b.id.to_s%>/edit"><%= t(:edit) %></a></li>
|
||||
<li><a href="#" class="delete text-error" rel="/admin/event_anns/<%=b.id.to_s%>"><%= t(:delete_) %></a></li>
|
||||
<% end %>
|
||||
<% if ((!b.approved && !b.rejected && !b.reapproval) || (b.rejected && b.reapproval)) && user_can_approve?(b) %>
|
||||
<li><a href="<%= page_for_bulletin(b) %>" class="approval_button" data-id="<%= b.id.to_s %>" ><%= t("event_ann.approval_waiting") %></a></li>
|
||||
<% end %>
|
||||
</ul>
|
||||
</div>
|
||||
</td>
|
||||
<td><%= format_value b.postdate %></td>
|
||||
<td class="<%= b.expired? ? "expired" : "" %>"><%= format_value b.deadline %></td>
|
||||
<td class="<%= b.expired? ? "expired" : "" %>"><%= format_value b.eventdate %></td>
|
||||
<td><%= b.update_user.user_name rescue ""%></td>
|
||||
</tr>
|
||||
<tr class="footable-row-detail">
|
||||
<td class="footable-cell-detail" colspan="6">
|
||||
<div id="<%= "#{b.id.to_s}-detail" %>" class="footable-row-detail-inner" style="display: none;">
|
||||
<div>
|
||||
<strong><%= t(:view_count) %></strong> :
|
||||
<span class="label label-info"><%= b.view_count %></span>
|
||||
</div>
|
||||
<div>
|
||||
<strong><%= t(:tags) %></strong> :
|
||||
<% b.tags.each do |tag| %>
|
||||
<span class="label label-warning"><%= tag.name %></span>
|
||||
<% end %>
|
||||
</div>
|
||||
<div>
|
||||
<strong><%= t("event_ann.email_to") %></strong> :
|
||||
<% b.email_members.each do |member| %>
|
||||
<span class="label"><%= member.name %></span>
|
||||
<% end %>
|
||||
<% unless b.other_mailaddress.nil? %>
|
||||
<% b.other_mailaddress.split(',').each do |mailaddress| %>
|
||||
<span class="label"><%= mailaddress %></span>
|
||||
<% end %>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<% end %>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<%=
|
||||
content_tag :div, class: "bottomnav clearfix" do
|
||||
content_tag :div, paginate(@bulletin_events), class: "pagination pagination-centered"
|
||||
end
|
||||
%>
|
|
@ -0,0 +1,5 @@
|
|||
<%= form_for @bulletin_event, url: admin_event_ann_path(@bulletin_event), html: {class: "form-horizontal main-forms previewable"} do |f| %>
|
||||
<fieldset>
|
||||
<%= render :partial => 'form', locals: {f: f} %>
|
||||
</fieldset>
|
||||
<% end %>
|
|
@ -0,0 +1,150 @@
|
|||
# encoding: utf-8
|
||||
|
||||
wb = xlsx_package.workbook
|
||||
|
||||
wb.add_worksheet(name: "Annoucement") do |sheet|
|
||||
|
||||
heading = sheet.styles.add_style(:b => true, :locked => true)
|
||||
example = sheet.styles.add_style(:i => true)
|
||||
row = []
|
||||
row1 = []
|
||||
row2 = []
|
||||
|
||||
row << t("category")
|
||||
row1 << "select"
|
||||
t = ""
|
||||
@module_app.categories.asc(:created_at).each_with_index do |cat,i|
|
||||
t = t + "#{i}" + " -> " + cat.title + ", "
|
||||
end
|
||||
if @module_app.categories.count > 0
|
||||
t = t + " Example : 0"
|
||||
else
|
||||
t = "Leave this field blank"
|
||||
end
|
||||
row2 << t
|
||||
|
||||
row << t("tags")
|
||||
row1 << "select"
|
||||
t = ""
|
||||
@module_app.tags.asc(:created_at).each_with_index do |tag,i|
|
||||
t = t + "#{i}" + " -> " + tag.name + ", "
|
||||
end
|
||||
if @module_app.tags.count > 0
|
||||
t = t + " Example : 0,1,2"
|
||||
else
|
||||
t = "Leave this field blank"
|
||||
end
|
||||
row2 << t
|
||||
|
||||
row << t("event_ann.start_date")
|
||||
row1 << "date"
|
||||
row2 << "Format: YYYY/MM/DD, Example: 2015/12/10"
|
||||
|
||||
row << t("event_ann.end_date")
|
||||
row1 << "date"
|
||||
row2 << "Format: YYYY/MM/DD, Example: 2015/12/12"
|
||||
|
||||
row << t("event_ann.event_date")
|
||||
row1 << "date"
|
||||
row2 << "Format: YYYY/MM/DD, Example: 2015/12/10"
|
||||
|
||||
row << t("top")
|
||||
row1 << "boolean"
|
||||
row2 << "0 for false, 1 for true"
|
||||
|
||||
row << t("hot")
|
||||
row1 << "boolean"
|
||||
row2 << "0 for false, 1 for true"
|
||||
|
||||
row << t("hide")
|
||||
row1 << "boolean"
|
||||
row2 << "0 for false, 1 for true "
|
||||
|
||||
row << t("image")
|
||||
row1 << "url"
|
||||
row2 << "http://www.example.com/images/example.png"
|
||||
|
||||
row << t("image") + " " + t("description") + " - " + t("en")
|
||||
row1 << "textfield"
|
||||
row2 << ""
|
||||
row << t("image") + " " + t("description") + " - " + t("zh_tw")
|
||||
row1 << "textfield"
|
||||
row2 << ""
|
||||
|
||||
row << t("title") + " - " + t("en")
|
||||
row1 << "textfield"
|
||||
row2 << ""
|
||||
row << t("title") + " - " + t("zh_tw")
|
||||
row1 << "textfield"
|
||||
row2 << ""
|
||||
|
||||
row << t("subtitle") + " - " + t("en")
|
||||
row1 << "textarea"
|
||||
row2 << ""
|
||||
row << t("subtitle") + " - " + t("zh_tw")
|
||||
row1 << "textarea"
|
||||
row2 << ""
|
||||
|
||||
row << t("speaker") + " - " + t("en")
|
||||
row1 << "textarea"
|
||||
row2 << ""
|
||||
row << t("speaker") + " - " + t("zh_tw")
|
||||
row1 << "textarea"
|
||||
row2 << ""
|
||||
|
||||
row << t("host") + " - " + t("en")
|
||||
row1 << "textarea"
|
||||
row2 << ""
|
||||
row << t("host") + " - " + t("zh_tw")
|
||||
row1 << "textarea"
|
||||
row2 << ""
|
||||
|
||||
row << t("content") + " - " + t("en")
|
||||
row1 << "editor"
|
||||
row2 << ""
|
||||
row << t("content") + " - " + t("zh_tw")
|
||||
row1 << "editor"
|
||||
row2 << ""
|
||||
|
||||
row << t("notes") + " - " + t("en")
|
||||
row1 << "textarea"
|
||||
row2 << ""
|
||||
row << t("notes") + " - " + t("zh_tw")
|
||||
row1 << "textarea"
|
||||
row2 << ""
|
||||
|
||||
row << t("link")
|
||||
row1 << "textfield"
|
||||
row2 << "Seperate with ';'. Example: http://rulingcom.com; http://google.com"
|
||||
|
||||
row << t("link") + " " + t("url_alt") + " - " + t("en")
|
||||
row1 << "textfield"
|
||||
row2 << "Seperate with ';' with respective to the links in the link columns. Example : Rulingcom official site; Google search engine"
|
||||
row << t("link") + " " + t("url_alt") + " - " + t("zh_tw")
|
||||
row1 << "textfield"
|
||||
row2 << "Seperate with ';' with respective to the links in the link columns. Example : Rulingcom official site; Google search engine"
|
||||
|
||||
row << t("file_")
|
||||
row1 << "textfield"
|
||||
row2 << "Seperate with ';'. Example: http://www.example.com/images/example.png; http://www.example.com/images/example2.png"
|
||||
|
||||
row << t("file_") + " " + t("description") + " - " + t("en")
|
||||
row1 << "textfield"
|
||||
row2 << "Seperate with ';' with respective to the links in the link columns. Example : Great view; Nice potrait"
|
||||
row << t("file_") + " " + t("description") + " - " + t("zh_tw")
|
||||
row1 << "textfield"
|
||||
row2 << "Seperate with ';' with respective to the links in the link columns. Example : Great view; Nice potrait"
|
||||
|
||||
row << t("file_") + " " + t("alternative") + " - " + t("en")
|
||||
row1 << "textfield"
|
||||
row2 << "Seperate with ';' with respective to the links in the link columns. Example : example1; example2"
|
||||
row << t("file_") + " " + t("alternative") + " - " + t("zh_tw")
|
||||
row1 << "textfield"
|
||||
row2 << "Seperate with ';' with respective to the links in the link columns. Example : example1; example2"
|
||||
|
||||
|
||||
sheet.add_row row, :style => heading
|
||||
sheet.add_row row1
|
||||
sheet.add_row row2, :style => example
|
||||
|
||||
end
|
|
@ -0,0 +1,209 @@
|
|||
# encoding: utf-8
|
||||
|
||||
wb = xlsx_package.workbook
|
||||
|
||||
wb.add_worksheet(name: "Annoucement") do |sheet|
|
||||
|
||||
heading = sheet.styles.add_style(:b => true, :locked => true)
|
||||
example = sheet.styles.add_style(:i => true)
|
||||
row = []
|
||||
row1 = []
|
||||
row2 = []
|
||||
|
||||
row << t("category")
|
||||
row1 << "select"
|
||||
t = ""
|
||||
categories = @module_app.categories.asc(:created_at)
|
||||
categories.each_with_index do |cat,i|
|
||||
t = t + "#{i}" + " -> " + cat.title + ", "
|
||||
end
|
||||
if categories.count > 0
|
||||
t = t + " Example : 0"
|
||||
else
|
||||
t = "Leave this field blank"
|
||||
end
|
||||
row2 << t
|
||||
|
||||
row << t("tags")
|
||||
row1 << "select"
|
||||
t = ""
|
||||
tags = @module_app.tags.asc(:created_at)
|
||||
tags.each_with_index do |tag,i|
|
||||
t = t + "#{i}" + " -> " + tag.name + ", "
|
||||
end
|
||||
if tags.count > 0
|
||||
t = t + " Example : 0,1,2"
|
||||
else
|
||||
t = "Leave this field blank"
|
||||
end
|
||||
row2 << t
|
||||
|
||||
row << t("event_ann.start_date")
|
||||
row1 << "date"
|
||||
row2 << "Format: YYYY/MM/DD, Example: 2015/12/10"
|
||||
|
||||
row << t("event_ann.end_date")
|
||||
row1 << "date"
|
||||
row2 << "Format: YYYY/MM/DD, Example: 2015/12/12"
|
||||
|
||||
row << t("event_ann.event_date")
|
||||
row1 << "date"
|
||||
row2 << "Format: YYYY/MM/DD, Example: 2015/12/10"
|
||||
|
||||
row << t("top")
|
||||
row1 << "boolean"
|
||||
row2 << "0 for false, 1 for true"
|
||||
|
||||
row << t("hot")
|
||||
row1 << "boolean"
|
||||
row2 << "0 for false, 1 for true"
|
||||
|
||||
row << t("hide")
|
||||
row1 << "boolean"
|
||||
row2 << "0 for false, 1 for true "
|
||||
|
||||
row << t("image")
|
||||
row1 << "url"
|
||||
row2 << "http://www.example.com/images/example.png"
|
||||
|
||||
row << t("image") + " " + t("description") + " - " + t("en")
|
||||
row1 << "textfield"
|
||||
row2 << ""
|
||||
row << t("image") + " " + t("description") + " - " + t("zh_tw")
|
||||
row1 << "textfield"
|
||||
row2 << ""
|
||||
|
||||
row << t("title") + " - " + t("en")
|
||||
row1 << "textfield"
|
||||
row2 << ""
|
||||
row << t("title") + " - " + t("zh_tw")
|
||||
row1 << "textfield"
|
||||
row2 << ""
|
||||
|
||||
row << t("subtitle") + " - " + t("en")
|
||||
row1 << "textarea"
|
||||
row2 << ""
|
||||
row << t("subtitle") + " - " + t("zh_tw")
|
||||
row1 << "textarea"
|
||||
row2 << ""
|
||||
|
||||
row << t("speaker") + " - " + t("en")
|
||||
row1 << "textarea"
|
||||
row2 << ""
|
||||
row << t("speaker") + " - " + t("zh_tw")
|
||||
row1 << "textarea"
|
||||
row2 << ""
|
||||
|
||||
row << t("host") + " - " + t("en")
|
||||
row1 << "textarea"
|
||||
row2 << ""
|
||||
row << t("host") + " - " + t("zh_tw")
|
||||
row1 << "textarea"
|
||||
row2 << ""
|
||||
|
||||
row << t("content") + " - " + t("en")
|
||||
row1 << "editor"
|
||||
row2 << ""
|
||||
row << t("content") + " - " + t("zh_tw")
|
||||
row1 << "editor"
|
||||
row2 << ""
|
||||
|
||||
row << t("notes") + " - " + t("en")
|
||||
row1 << "textarea"
|
||||
row2 << ""
|
||||
row << t("notes") + " - " + t("zh_tw")
|
||||
row1 << "textarea"
|
||||
row2 << ""
|
||||
|
||||
row << t("link")
|
||||
row1 << "textfield"
|
||||
row2 << "Seperate with ';'. Example: http://rulingcom.com; http://google.com"
|
||||
|
||||
row << t("link") + " " + t("url_alt") + " - " + t("en")
|
||||
row1 << "textfield"
|
||||
row2 << "Seperate with ';' with respective to the links in the link columns. Example : Rulingcom official site; Google search engine"
|
||||
row << t("link") + " " + t("url_alt") + " - " + t("zh_tw")
|
||||
row1 << "textfield"
|
||||
row2 << "Seperate with ';' with respective to the links in the link columns. Example : Rulingcom official site; Google search engine"
|
||||
|
||||
row << t("file_")
|
||||
row1 << "textfield"
|
||||
row2 << "Seperate with ';'. Example: http://www.example.com/images/example.png; http://www.example.com/images/example2.png"
|
||||
|
||||
row << t("file_") + " " + t("description") + " - " + t("en")
|
||||
row1 << "textfield"
|
||||
row2 << "Seperate with ';' with respective to the links in the link columns. Example : Great view; Nice potrait"
|
||||
row << t("file_") + " " + t("description") + " - " + t("zh_tw")
|
||||
row1 << "textfield"
|
||||
row2 << "Seperate with ';' with respective to the links in the link columns. Example : Great view; Nice potrait"
|
||||
|
||||
row << t("file_") + " " + t("alternative") + " - " + t("en")
|
||||
row1 << "textfield"
|
||||
row2 << "Seperate with ';' with respective to the links in the link columns. Example : example1; example2"
|
||||
row << t("file_") + " " + t("alternative") + " - " + t("zh_tw")
|
||||
row1 << "textfield"
|
||||
row2 << "Seperate with ';' with respective to the links in the link columns. Example : example1; example2"
|
||||
|
||||
|
||||
sheet.add_row row, :style => heading
|
||||
sheet.add_row row1
|
||||
sheet.add_row row2, :style => example
|
||||
|
||||
@event_anns.each do |eanns|
|
||||
row = []
|
||||
row << categories.to_a.index(eanns.category)
|
||||
t = []
|
||||
eanns.tags.each do |tag|
|
||||
t << tags.to_a.index(tag)
|
||||
end
|
||||
row << t.join(",")
|
||||
row << (eanns.postdate.strftime("%Y/%m/%d") rescue "")
|
||||
row << (eanns.deadline.strftime("%Y/%m/%d") rescue "")
|
||||
row << (eanns.eventdate.strftime("%Y/%m/%d") rescue "")
|
||||
row << (eanns.is_top? ? 1 : 0)
|
||||
row << (eanns.is_hot? ? 1 : 0)
|
||||
row << (eanns.is_hidden? ? 1 : 0)
|
||||
row << ("http://" + request.host_with_port + eanns.image.url rescue "")
|
||||
row << eanns.image_description_translations["en"]
|
||||
row << eanns.image_description_translations["zh_tw"]
|
||||
row << eanns.title_translations["en"]
|
||||
row << eanns.title_translations["zh_tw"]
|
||||
row << eanns.subtitle_translations["en"]
|
||||
row << eanns.subtitle_translations["zh_tw"]
|
||||
row << eanns.speaker_translations["en"]
|
||||
row << eanns.speaker_translations["zh_tw"]
|
||||
row << eanns.host_translations["en"]
|
||||
row << eanns.host_translations["zh_tw"]
|
||||
row << eanns.text_translations["en"]
|
||||
row << eanns.text_translations["zh_tw"]
|
||||
row << eanns.notes_translations["en"]
|
||||
row << eanns.notes_translations["zh_tw"]
|
||||
|
||||
links = eanns.bulletin_event_links.asc(:created_at)
|
||||
t = links.collect{|l|l.url}
|
||||
row << t.join(";")
|
||||
t = links.collect{|l|l.title_translations["en"]}
|
||||
row << t.join(";")
|
||||
t = links.collect{|l|l.title_translations["zh_tw"]}
|
||||
row << t.join(";")
|
||||
|
||||
files = eanns.bulletin_event_files.asc(:created_at)
|
||||
t = files.collect{|f|("http://" + request.host_with_port + f.file.url rescue nil)}
|
||||
t.delete(nil)
|
||||
row << t.join(";")
|
||||
t = files.collect{|l|l.description_translations["en"]}
|
||||
row << t.join(";")
|
||||
t = files.collect{|l|l.description_translations["zh_tw"]}
|
||||
row << t.join(";")
|
||||
t = files.collect{|l|l.title_translations["en"]}
|
||||
row << t.join(";")
|
||||
t = files.collect{|l|l.title_translations["zh_tw"]}
|
||||
row << t.join(";")
|
||||
sheet.add_row row
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
end
|
|
@ -0,0 +1,124 @@
|
|||
<% content_for :page_specific_css do %>
|
||||
<%= stylesheet_link_tag("admin/tags") %>
|
||||
<% end %>
|
||||
<% content_for :page_specific_javascript do %>
|
||||
<%= javascript_include_tag "validator" %>
|
||||
<% end %>
|
||||
|
||||
<table class="table main-list">
|
||||
<thead>
|
||||
<tr class="sort-header">
|
||||
<% @table_feed_fields.each do |f| %>
|
||||
<%= thead(f) %>
|
||||
<% end %>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<%= render :partial => "feed", :collection => @feeds %>
|
||||
</tbody>
|
||||
</table>
|
||||
<% if current_user.is_admin? or current_user.is_manager?(@module_app) %>
|
||||
|
||||
<div class="bottomnav clearfix" style="left: 81px;">
|
||||
<div class="action pull-right">
|
||||
<a class="btn btn-primary new-feed" href="#">
|
||||
<i class="icon-plus"></i> <%= t(:new_) %>
|
||||
</a>
|
||||
</div>
|
||||
<div class="pagination pagination-centered"></div>
|
||||
</div>
|
||||
|
||||
<div id="newFeedModal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="newFeedModalLabel" aria-hidden="true">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
||||
<h3 id="newFeedModalLabel">Create New Feed</h3>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<%#= render :partial => "feed_form" %>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button class="btn btn-primary" id="save_new_feed">Save changes</button>
|
||||
</div>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
$(".new-feed").on("click",function(){
|
||||
var modal = $("#newFeedModal");
|
||||
modal.find("#newFeedModalLabel").text("Create New Feed");
|
||||
modal.modal("show");
|
||||
openFeedModal("new",null);
|
||||
})
|
||||
|
||||
var bindEditButtons = function(){
|
||||
$(".edit-feed").on("click",function(){
|
||||
var modal = $("#newFeedModal");
|
||||
modal.find("#newFeedModalLabel").text("Edit Feed");
|
||||
modal.modal("show");
|
||||
openFeedModal("edit",$(this).data("feed-id"));
|
||||
return false;
|
||||
})
|
||||
$(".delete-feed").on("click",function(){
|
||||
if(confirm("Are you sure?")){
|
||||
var el = $(this);
|
||||
$.ajax({
|
||||
url : el.attr("href"),
|
||||
type : "delete",
|
||||
dataType : "html"
|
||||
}).done(function(data){
|
||||
$("table.main-list tbody").html(data);
|
||||
bindEditButtons();
|
||||
})
|
||||
}
|
||||
return false;
|
||||
})
|
||||
}
|
||||
bindEditButtons();
|
||||
var openFeedModal = function(type,feed_id){
|
||||
$.ajax({
|
||||
url : "/admin/event_anns/feedform",
|
||||
type : "get",
|
||||
data : {"type" : type, "id" : feed_id},
|
||||
dataType : "html"
|
||||
}).done(function(form){
|
||||
$("#newFeedModal .modal-body").html(form);
|
||||
bindHandlers();
|
||||
})
|
||||
}
|
||||
|
||||
var bindHandlers = function(){
|
||||
$(".tag-checkbox").on("click",function(){
|
||||
if($(this).is(":checked")){
|
||||
$(this).parent().addClass("active");
|
||||
}else{
|
||||
$(this).parent().removeClass("active");
|
||||
}
|
||||
})
|
||||
|
||||
var fv = new FormValidator($("#newFeedModal form"));
|
||||
fv.form.on("submit",function(){
|
||||
$.ajax({
|
||||
url : fv.form.attr("action"),
|
||||
data : fv.form.serializeArray(),
|
||||
type : "post",
|
||||
dataType : "html"
|
||||
}).done(function(data){
|
||||
$("table.main-list tbody").html(data);
|
||||
bindEditButtons();
|
||||
$("#newFeedModal").modal("hide");
|
||||
fv.form.resetForm();
|
||||
fv.form.find("ul.tags-groups p.active").removeClass("active");
|
||||
})
|
||||
return false;
|
||||
})
|
||||
$("#save_new_feed").on("click",function(){
|
||||
if(fv.isFormValidated()){
|
||||
fv.form.submit();
|
||||
}else{
|
||||
return false;
|
||||
}
|
||||
})
|
||||
}
|
||||
</script>
|
||||
</br>
|
|
@ -0,0 +1,87 @@
|
|||
<% content_for :page_specific_javascript do %>
|
||||
<script type="text/javascript" src="/assets/validator.js"></script>
|
||||
<% end %>
|
||||
<form action="<%= admin_event_ann_importeanns_path %>" method="post" class="form-horizontal main-forms" id="import-eanns-xls" enctype="multipart/form-data">
|
||||
<h3 style="padding-left: 30px;"><%= t("event_ann.export_to_excel") %></h3>
|
||||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<a href="<%= admin_event_ann_export_excel_path(:format => "xlsx") %>"><%= t("event_ann.export_all_eanns") %></a>
|
||||
</div>
|
||||
</div>
|
||||
<h3 style="padding-left: 30px;"><%= t("event_ann.import_from_excel") %></h3>
|
||||
<%= hidden_field_tag :authenticity_token, form_authenticity_token %>
|
||||
<div class="input-area">
|
||||
<% if @module_app.categories.count > 0 %>
|
||||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<a href="<%= admin_event_ann_excel_format_path(:format => "xlsx") %>"><%= t("event_ann.download_example_sheet_here") %></a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label for="import-eanns" class="control-label muted"><%= t("upload") %></label>
|
||||
<div class="controls">
|
||||
<input type="file" id="import-eanns" name="import_file" data-fv-validation="required;mustbexls;" data-fv-messages="Cannot be empty; Must be an excel file.;" />
|
||||
<span class="help-block"><%= t("event_ann.please_create_tags_cats") %></span>
|
||||
</div>
|
||||
</div>
|
||||
<% else %>
|
||||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<h4><%= t("event_ann.create_atleast_one_cat") %></h4>
|
||||
</div>
|
||||
</div>
|
||||
<% end %>
|
||||
</div>
|
||||
<% if @module_app.categories.count > 0 %>
|
||||
<div class="form-actions">
|
||||
<input type="submit" value="<%= t("restful_actions.import") %>" class="btn btn-primary">
|
||||
</div>
|
||||
<% end %>
|
||||
</form>
|
||||
|
||||
|
||||
<!-- import from wp xml -->
|
||||
<form action="<%= admin_event_ann_import_from_wp_path %>" method="post" class="form-horizontal main-forms" id="import-eanns-wp-xml" enctype="multipart/form-data">
|
||||
<h3 style="padding-left: 30px;"><%= t("event_ann.import_from_wp_xml") %></h3>
|
||||
<%= hidden_field_tag :authenticity_token, form_authenticity_token %>
|
||||
<div class="input-area">
|
||||
<div class="control-group">
|
||||
<label for="import-eanns-wp-xml" class="control-label muted"><%= t("upload") %></label>
|
||||
<div class="controls">
|
||||
<input type="file" id="import-eanns-wp-xml" name="import_xml" data-fv-validation="required;mustbexml;" data-fv-messages="Cannot be empty; Must be an XML file.;" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-actions">
|
||||
<input type="submit" value="<%= t("restful_actions.import") %>" class="btn btn-primary">
|
||||
</div>
|
||||
</form>
|
||||
<!-- <form action="<%#= admin_event_ann_import_from_xml_path %>" method="post" class="form-horizontal main-forms" id="import-eanns-xml" enctype="multipart/form-data">
|
||||
<h3 style="padding-left: 30px;">Import from XML</h3>
|
||||
<%#= hidden_field_tag :authenticity_token, form_authenticity_token %>
|
||||
<div class="input-area">
|
||||
<div class="control-group">
|
||||
<label for="import-eanns" class="control-label muted">URL :</label>
|
||||
<div class="controls">
|
||||
<input type="text" id="import-eanns" name="import_xml" data-fv-validation="required;url;" data-fv-messages="Cannot be empty; Must be an URL.;" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-actions">
|
||||
<input type="submit" value="Import" class="btn btn-primary">
|
||||
</div>
|
||||
</form> -->
|
||||
<script type="text/javascript">
|
||||
var form = new FormValidator($("#import-eanns-xls"));
|
||||
form.validate_functions.mustbexls = function(val){
|
||||
var t = val.split("."),
|
||||
ext = t[t.length - 1];
|
||||
return (ext == "xls" || ext == "xlsx")
|
||||
}
|
||||
var form = new FormValidator($("#import-eanns-wp-xml"));
|
||||
form.validate_functions.mustbexml = function(val){
|
||||
var t = val.split("."),
|
||||
ext = t[t.length - 1];
|
||||
return (ext == "xml")
|
||||
}
|
||||
</script>
|
|
@ -0,0 +1,34 @@
|
|||
<%= render_filter @filter_fields, "index_table" %>
|
||||
<span id="index_table">
|
||||
<%= render 'index'%>
|
||||
</span>
|
||||
|
||||
<%= render 'layouts/delete_modal', delete_options: @delete_options %>
|
||||
|
||||
<% if EventAnnSetting.is_pro? && user_can_approve? %>
|
||||
<%= render :partial=> "approval_modal" %>
|
||||
|
||||
<script type="text/javascript">
|
||||
$(function(){
|
||||
var modal = $("#approvalModal");
|
||||
$(document).on("click", ".approval_button",function(){
|
||||
var url = $(this).attr("href");
|
||||
if(window.location.protocol === "https:"){
|
||||
url = url.replace("http:","https:");
|
||||
}
|
||||
modal.find("iframe").attr("src", url);
|
||||
modal.find("#object_id").val($(this).data("id"));
|
||||
modal.modal("show");
|
||||
return false;
|
||||
})
|
||||
|
||||
var params = getUrlVars();
|
||||
console.log(params["url"])
|
||||
if(typeof params["url"] != "undefined"){
|
||||
modal.find("iframe").attr("src", params["url"]);
|
||||
modal.find("#object_id").val(params["id"]);
|
||||
modal.modal("show");
|
||||
}
|
||||
})
|
||||
</script>
|
||||
<% end %>
|
|
@ -0,0 +1,5 @@
|
|||
<%= form_for @bulletin_event, url: admin_event_anns_path, html: {class: "form-horizontal main-forms previewable"} do |f| %>
|
||||
<fieldset>
|
||||
<%= render :partial => 'form', locals: {f: f} %>
|
||||
</fieldset>
|
||||
<% end %>
|
|
@ -0,0 +1,388 @@
|
|||
<%= stylesheet_link_tag "select2/select2" %>
|
||||
<%= javascript_include_tag 'validator' %>
|
||||
<%= javascript_include_tag "select2/select2.min" %>
|
||||
<% content_for :page_specific_css do %>
|
||||
<%= stylesheet_link_tag "lib/main-forms" %>
|
||||
<% end %>
|
||||
<style type="text/css">
|
||||
#notification{
|
||||
background-color: #ececec;
|
||||
font-size: 14px;
|
||||
left: 40%;
|
||||
padding: 10px;
|
||||
position: absolute;
|
||||
text-align: center;
|
||||
top: 40px;
|
||||
width: auto;
|
||||
z-index: 1200;
|
||||
display: none;
|
||||
}
|
||||
.badge-info{
|
||||
margin-left: 10px;
|
||||
}
|
||||
#approver-list{
|
||||
list-style: none;
|
||||
margin-left: 5px;
|
||||
}
|
||||
#approver-list li {
|
||||
border-bottom: 1px solid #efefef;
|
||||
margin-bottom: 10px;
|
||||
padding-bottom: 10px;
|
||||
}
|
||||
#approver-list .approver-avatar{
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
border-radius: 50px;
|
||||
margin-right: 20px;
|
||||
}
|
||||
#approver-list .approver-check{
|
||||
vertical-align: middle;
|
||||
margin-top: 25px;
|
||||
}
|
||||
#approver-list .approver-check input{
|
||||
margin-right: 5px;
|
||||
vertical-align: middle;
|
||||
}
|
||||
#approver-list .approver-check label{
|
||||
display: inline;
|
||||
vertical-align: middle;
|
||||
}
|
||||
#approver-list .approver-title{
|
||||
font-size: 14px;
|
||||
}
|
||||
.table{
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
.table-row,.role_limit_tr,.role_limit_add {
|
||||
width: 100%;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
margin-bottom: 0.5em;
|
||||
}
|
||||
.td{
|
||||
width: 30%;
|
||||
display: inline-flex;
|
||||
justify-content: center;
|
||||
}
|
||||
.table{
|
||||
border: #2d4cd0 0.1em solid;
|
||||
}
|
||||
.td-3{
|
||||
width: 100%;
|
||||
display: inline-flex;
|
||||
justify-content: center;
|
||||
}
|
||||
.td>*{
|
||||
max-width: 95%;
|
||||
}
|
||||
.td-delete{
|
||||
width: 10%;
|
||||
}
|
||||
</style>
|
||||
<%
|
||||
sub_managers = @module_app.sub_managers
|
||||
sub_managers.delete(nil)
|
||||
all_statuses = [[t('top'),'is_top'],[t('hot'),'is_hot']]
|
||||
tp1 = select_tag("event_ann_setting[event_anns_status_settings][-1][status]",options_for_select(all_statuses))
|
||||
tp2 = select_tag("event_ann_setting[event_anns_status_settings][-1][role_id]",options_for_select(Role.all.map{|r| [r.title,r.id]}))
|
||||
tp3 = number_field_tag("event_ann_setting[event_anns_status_settings][-1][top_limit]",nil, min: 0,required: true)
|
||||
tp4 = "<button type='button' onclick='delete_limit_role(this)'' class='btn'>#{t('delete_')}</button>"
|
||||
all_tp = "<div class='role_limit_tr'><div class='td'>#{tp1}</div><div class='td'>#{tp2}</div><div class='td'>#{tp3}</div><div class='td-delete'>#{tp4}</div></div>"
|
||||
%>
|
||||
<script type="text/javascript">
|
||||
function add_limit_role(){
|
||||
var role_limit_l = $('.role_limit_tr').length
|
||||
var role_limit_tp = '<%= all_tp.inspect %>'
|
||||
role_limit_tp = role_limit_tp.replace(/-1/g,role_limit_l)
|
||||
$('.role_limit_add').before($('<div/>').html(role_limit_tp).text().slice(1,-2))
|
||||
}
|
||||
function delete_limit_role(ele){
|
||||
var now_index = $(ele).parents('.role_limit_tr').index('.role_limit_tr')
|
||||
console.log(now_index)
|
||||
$(ele).parents('.role_limit_tr').remove()
|
||||
$('.role_limit_tr').each(function(i,v){
|
||||
if (i >= now_index){
|
||||
$(v).find('[name^="event_ann_setting[event_anns_status_settings]"]').each(function(i1,v1){
|
||||
console.log($(v1).attr('name'))
|
||||
$(v1).attr('name',$(v1).attr('name').replace(/\d+/g,i.toString()))
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
var approverList = $(".hidden-approver-list");
|
||||
$(".approver-check input").on("click",function(){
|
||||
var el = $(this);
|
||||
if(el.is(":checked")){
|
||||
var t = $("<input type='hidden'>");
|
||||
t.val(el.val());
|
||||
t.attr("name", "event_ann_setting[approvers][]");
|
||||
t.attr("id", "check_" + el.val());
|
||||
approverList.append(t);
|
||||
}else{
|
||||
approverList.find("#check_" + el.val()).remove();
|
||||
}
|
||||
})
|
||||
</script>
|
||||
<div id="notification"><%= t("event_ann.click_on_submit") %></div>
|
||||
<%= form_for @setting, url: (@setting.new_record? ? admin_event_ann_createsettings_path : admin_event_ann_updatesettings_path), html: {class: "form-horizontal main-forms"} do |f| %>
|
||||
<div class="input-area">
|
||||
<div class="control-group">
|
||||
<%= f.label :only_manager_can_edit_status, t("event_ann.only_manager_can_edit_status"), :class => "control-label muted" %>
|
||||
<div class="controls">
|
||||
<%= f.check_box :only_manager_can_edit_status %>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<%= f.label :is_display_edit_only, t("event_ann.is_display_edit_only"), :class => "control-label muted" %>
|
||||
<div class="controls">
|
||||
<%= f.check_box :is_display_edit_only %>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<%= f.label :top_limit, t("event_ann.top_limit"), :class => "control-label muted" %>
|
||||
<div class="controls">
|
||||
<%= f.number_field :top_limit, :min => "0" %>
|
||||
<span class="help-block"><%= t("event_ann.for_unlimited") %></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<div class="table">
|
||||
<div class="table-row">
|
||||
<div class="td">
|
||||
<%= t('status') %>
|
||||
</div>
|
||||
<div class="td">
|
||||
<%= t('role') %>
|
||||
</div>
|
||||
<div class="td">
|
||||
<%= t('event_ann.top_limit') %>
|
||||
</div>
|
||||
</div>
|
||||
<% (EventAnnSetting.first.event_anns_status_settings rescue []).each_with_index do |v,i| %>
|
||||
<div class="role_limit_tr">
|
||||
<%= hidden_field_tag("event_ann_setting[event_anns_status_settings][#{i}][_id]",v.id) %>
|
||||
<div class="td">
|
||||
<%= select_tag("event_ann_setting[event_anns_status_settings][#{i}][status]",options_for_select(all_statuses,:selected => v['status'])) %>
|
||||
</div>
|
||||
<div class="td">
|
||||
<%= select_tag("event_ann_setting[event_anns_status_settings][#{i}][role_id]",options_for_select(Role.all.map{|r| [r.title,r.id]},:selected => v['role_id'])) %>
|
||||
</div>
|
||||
<div class="td">
|
||||
<%= number_field_tag("event_ann_setting[event_anns_status_settings][#{i}][top_limit]",v['top_limit'], min: 0,required: true) %>
|
||||
</div>
|
||||
<div class="td-delete">
|
||||
<button type="button" onclick="delete_limit_role(this)" class="btn">
|
||||
<%= t('delete_') %>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<% end %>
|
||||
<div class="role_limit_add">
|
||||
<div class="td-3">
|
||||
<button type="button" onclick="add_limit_role()" class="btn">
|
||||
<%= t('add') %>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<% if EventAnnSetting.is_pro? %>
|
||||
<% if !sub_managers.blank? %>
|
||||
<div class="control-group">
|
||||
<%= f.label "Approver Setting", :class => "control-label muted" %>
|
||||
<div class="controls">
|
||||
<a href="#approverModal" role="button" class="btn" data-toggle="modal"><%= t("event_ann.approvers_list") %></a>
|
||||
<span class="badge badge-info"><%= @setting.approvers.count %></span>
|
||||
</div>
|
||||
</div>
|
||||
<% else %>
|
||||
<div class="control-group">
|
||||
<a href="/admin/authorizations/event_ann"><%= t("event_ann.click_set_sub_manager") %></a>
|
||||
</div>
|
||||
<% end %>
|
||||
<div class="control-group">
|
||||
<%= f.label "Send emails to", :class => "control-label muted" %>
|
||||
<div class="controls">
|
||||
<input type="checkbox" name="event_ann_setting[email_to][]" value="admins" <%= @setting.email_to.include?("admins") ? "checked=checked" : "" %>> <%= t("admin") %>
|
||||
<input type="checkbox" name="event_ann_setting[email_to][]" value="managers" <%= @setting.email_to.include?("managers") ? "checked=checked" : "" %>> <%= t("manager") %>
|
||||
<input type="checkbox" name="event_ann_setting[email_to][]" value="approvers" <%= @setting.email_to.include?("approvers") ? "checked=checked" : "" %>> <%= t("event_ann.approver") %>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="hidden-approver-list">
|
||||
<% sub_managers.each do |sm| %>
|
||||
<% if @setting.approvers.include?(sm.id.to_s) %>
|
||||
<input type="hidden" id="check_<%= sm.id.to_s %>" value="<%= sm.id.to_s %>" name="event_ann_setting[approvers][]">
|
||||
<% end %>
|
||||
<% end %>
|
||||
</div>
|
||||
<% end %>
|
||||
<div class="form-actions">
|
||||
<%= f.submit t('submit'), class: 'btn btn-primary' %>
|
||||
</div>
|
||||
<% end %>
|
||||
</div>
|
||||
<% if EventAnnSetting.is_pro? %>
|
||||
<div id="approverModal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="approverModalLabel" aria-hidden="true">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
||||
<h3 id="approverModalLabel"><%= t("sub_manager") %></h3>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<ul id="approver-list">
|
||||
<% sub_managers.each do |sm| %>
|
||||
<li>
|
||||
<%= image_tag sm.member_profile.avatar.thumb, :class => "approver-avatar" %>
|
||||
<span class="approver-title"><%= sm.name %></span>
|
||||
<span class="pull-right approver-check">
|
||||
<input id="checkbox_<%= sm.id %>" type="checkbox" value="<%= sm.id %>" <%= @setting.approvers.include?(sm.id.to_s) ? "checked=checked" : "" %>>
|
||||
<label for="checkbox_<%= sm.id %>"><%= t("event_ann.approver") %></label>
|
||||
</span>
|
||||
</li>
|
||||
<% end %>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button class="btn btn-primary" data-dismiss="modal" aria-hidden="true">Ok</button>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
$("#approverModal").on("hidden",function(){
|
||||
$("#notification").slideDown();
|
||||
$(".badge-info").text($(".hidden-approver-list input").length);
|
||||
})
|
||||
</script>
|
||||
<% end %>
|
||||
<%= fields_for :iframe do |f| %>
|
||||
<div class="form-horizontal input-area">
|
||||
<fieldset id="iframe_settings">
|
||||
<legend><%=t('event_ann.event_ann_setting_for_iframe')%></legend>
|
||||
<div class="control-group">
|
||||
<%= f.label :layout_type, t("event_ann.layout_type"), :class => "control-label muted" %>
|
||||
<div class="controls">
|
||||
<% @layout_types = get_layouts(@module_app.key) %>
|
||||
<% if @layout_types.first.kind_of?(Hash) %>
|
||||
<select name="iframe[layout_type]" id="page_layout" class="select2">
|
||||
<% @layout_types.each do |lt| %>
|
||||
<option value="<%= lt["filename"] %>" data-image="<%= lt["thumbnail"] %>"><%= (lt["name"].kind_of?(Hash) ? (lt["name"][I18n.locale.to_s] || lt["name"]['en']) : lt["name"]) %></option>
|
||||
<% end %>
|
||||
</select>
|
||||
<script type="text/javascript">
|
||||
$("select.select2").select2({
|
||||
formatResult: function(el){
|
||||
var $element = $(el.element),
|
||||
image = $element.data("image");
|
||||
return "<img class='thumbnail' src='" + image + "'/><span class='thumbnail-text'>" + el.text + "</span>";
|
||||
},
|
||||
minimumResultsForSearch: -1,
|
||||
width : 250
|
||||
});
|
||||
</script>
|
||||
<% else %>
|
||||
<%= f.select(:layout, @layout_types) %>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<%= f.label :tags, t(:tags), :class => "control-label muted" %>
|
||||
<div class="controls">
|
||||
<% @module_app.tags.each_with_index do |t,index| %>
|
||||
<label class="checkbox inline btn" for="<%="tags_#{index}"%>">
|
||||
<input id="<%="tags_#{index}"%>" name="iframe[tags][]" type="checkbox" value="<%=t.id%>" style="opacity: 0;">
|
||||
<%=t.name%>
|
||||
</label>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label muted" ><%=t(:categories)%></label>
|
||||
<div class="controls">
|
||||
<% @module_app.categories.each_with_index do |c,index| %>
|
||||
<label class="checkbox inline btn" for="<%="categories_#{index}"%>">
|
||||
<input id="<%="categories_#{index}"%>" name="iframe[categories][]" type="checkbox" value="<%=c.id%>" style="opacity: 0;">
|
||||
<%=c.title%>
|
||||
</label>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<%= f.label :authors, t('event_ann.table.author'), :class => "control-label muted" %>
|
||||
<div class="controls">
|
||||
<%= render partial: 'admin/members/generate_modal_select' , locals: { :@sorted_members => @sorted_members ,:member_form_id => "card-list-members",:member_field_name=>"iframe[member_ids][]" } %>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<%= f.label :show_page, t('event_ann.show_page'), :class => "control-label muted" %>
|
||||
<div class="controls">
|
||||
<%=f.check_box :show_page ,{:checked=>'checked'},'true','false'%>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<%= f.label :data_count, t(:data_count), :class => "control-label muted" %>
|
||||
<div class="controls">
|
||||
<%=f.number_field :data_count, {min: 0,:value=> 10} %>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<a class="btn btn-primary" title="<%= t("event_ann.url_generate") %>" id="url_generate"><%= t("event_ann.url_generate") %></a>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
<% end %>
|
||||
<script type="text/javascript">
|
||||
function getparams(id){
|
||||
var params_array = $("#"+id).serializeArray();
|
||||
var params = {};
|
||||
params_array.forEach(function(dict){
|
||||
if(params[dict.name] == undefined)
|
||||
if(dict.name.substr(dict.name.length-2,2) == "[]")
|
||||
params[dict.name] = [dict.value]
|
||||
else
|
||||
params[dict.name] = dict.value
|
||||
else
|
||||
if(dict.name.substr(dict.name.length-2,2) == "[]")
|
||||
params[dict.name].push(dict.value)
|
||||
else
|
||||
params[dict.name] = dict.value
|
||||
})
|
||||
return params;
|
||||
}
|
||||
$(document).ready(function(){
|
||||
$('label.checkbox input').click(function(){
|
||||
if($(this).parent().hasClass('active'))
|
||||
$(this).parent().removeClass('active');
|
||||
else
|
||||
$(this).parent().addClass('active');
|
||||
})
|
||||
$('#url_generate').off('click').on('click',function(){
|
||||
var params = getparams('iframe_settings');
|
||||
$.post("<%=admin_event_ann_generate_iframe_url_path%>",params).done(function(url){
|
||||
var real_url = '/eannc_url?url='+window.location.href.split('/')[0]+"//"+window.location.host+url;
|
||||
if($("#dialog-confirm").length == 0){
|
||||
$("#url_generate").before("<div id='dialog-confirm' title='<%="iframe "+t('event_ann.URL')%>'>"+
|
||||
"<div style='clear:both;'></div><div id='info_texts'>"+"<label style='float:left;margin-right: 0.2em; line-height: 2em;' for='iframe_url'><%="iframe "+t('event_ann.URL') %>:</label><input id= 'iframe_url' style='float:left;cursor:text;' type='text' readyonly value='"+real_url+"'><a class='btn btn-primary copy_text' style='color: white;'><%=t('event_ann.copy')%></a>"+"</div>"+
|
||||
"</div>");
|
||||
}
|
||||
$( "#dialog-confirm" ).dialog({
|
||||
resizable: true,
|
||||
minHeight: 100,
|
||||
maxHeight: 400,
|
||||
width: '80%',
|
||||
modal: true,
|
||||
buttons: {
|
||||
"<%= t(:close) %>": function(){$( this ).dialog( "close" );}
|
||||
}
|
||||
});
|
||||
$('.copy_text').off('click').on('click',function(){
|
||||
var copyText = document.getElementById("iframe_url");
|
||||
copyText.select();
|
||||
copyText.setSelectionRange(0, 99999);
|
||||
document.execCommand("copy");
|
||||
})
|
||||
});
|
||||
});
|
||||
})
|
||||
</script>
|
|
@ -0,0 +1 @@
|
|||
<%= @data["html"].html_safe %>
|
|
@ -0,0 +1,3 @@
|
|||
<h3>Hello <%= @data["name"] %>,</h3>
|
||||
<p><%= @data["submitter"] %> <%= t("event_ann.updated_annoucement") %>
|
||||
<a href="<%= @data['url'] %>" ><%= t("event_ann.click_here_to_see") %></a>
|
|
@ -0,0 +1,3 @@
|
|||
<h3>Hello <%= @data["name"] %>,</h3>
|
||||
<p><%= @data["rejector"] %> <%= t("event_ann.rejected_annoucement") %> : <%= @data["reason"].nil? || @data["reason"] == "" ? "" : "#{@data["reason"]}" %></p>
|
||||
<a href="<%= @data['url'] %>" ><%= t("event_ann.click_here_to_see") %></a>
|
|
@ -0,0 +1,18 @@
|
|||
xml.instruct! :xml, :version => "1.0"
|
||||
xml.rss :version => "2.0" do
|
||||
xml.channel do
|
||||
xml.title @bf.title
|
||||
xml.link "/xhr/event_anns/rssfeed/73999228.rss"
|
||||
|
||||
for event_ann in @event_anns
|
||||
xml.item do
|
||||
xml.title event_ann.title
|
||||
xml.description event_ann.subtitle
|
||||
xml.description event_ann.speaker
|
||||
xml.description event_ann.host
|
||||
xml.pubDate event_ann.created_at.to_s(:rfc822)
|
||||
xml.link page_for_bulletin(event_ann)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -0,0 +1,19 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
|
||||
</head>
|
||||
<body bgcolor="#FFFFFF">
|
||||
<div style="text-ident:20px"></div>
|
||||
|
||||
<%= t('event_ann.mail_hi') %> <br /><br />
|
||||
<%= t('event_ann.mail_url_view') %> <br /><br />
|
||||
<a href="<%= @data["url"] %>" target="_blank"> <%= @data["title"] %> </a> <br /><br />
|
||||
|
||||
<span style="color:#555">--<br />
|
||||
<%= t('event_ann.mail_source') %> :<a href="http://<%= @data["host"] %>" target="_blank"> <%= Site.first.title %> </a><br />
|
||||
<%= t('event_ann.mail_time') %> <%= DateTime.now %>
|
||||
</span>
|
||||
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,73 @@
|
|||
<% params = OrbitHelper.params
|
||||
page = Page.where(url:params['url']).first
|
||||
enable_search_flag = false
|
||||
if page.methods.include? 'select_option_items'.to_sym
|
||||
ModuleApp.all.select{|tmp| tmp.key.to_s=='event_ann'}.each do |modile_app|
|
||||
@show_option_items = modile_app.show_option_items rescue nil
|
||||
end
|
||||
page.select_option_items.each do |select_option_item|
|
||||
if !(@show_option_items.nil?) && select_option_item.field_name == @show_option_items.keys[1].to_s
|
||||
value = YAML.load(select_option_item.value)
|
||||
if value[I18n.locale] == t('event_ann.yes')
|
||||
enable_search_flag = true
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
%>
|
||||
<% if enable_search_flag %>
|
||||
<style type="text/css">
|
||||
#category_select_box, input.search_box, #category_select_box>option {
|
||||
background: none;
|
||||
color: #333;
|
||||
border-radius: 2px;
|
||||
font-size: 13px;
|
||||
border: 1px solid #656565;
|
||||
margin-right: 3px;
|
||||
font-weight: normal;
|
||||
margin-left: 3px;
|
||||
padding: 0 5px;
|
||||
}
|
||||
input.search_box[type='submit'] {
|
||||
background: #eee;
|
||||
padding: 0 10px;
|
||||
}
|
||||
|
||||
input.search_box[type='submit']:hover{
|
||||
background: #20d0bc;
|
||||
color: white;
|
||||
border: none;
|
||||
}
|
||||
input.search_box[type='submit']:active{
|
||||
background: #20d0bc;
|
||||
color: white;
|
||||
border: none;
|
||||
}
|
||||
</style>
|
||||
<form>
|
||||
<% cats = Array(page.categories)
|
||||
if cats.include? 'all'
|
||||
cats = ModuleApp.where(key: 'event_ann').first.categories
|
||||
else
|
||||
cats = cats.map{|v| Category.where(id: v).first}.compact
|
||||
end
|
||||
all_cat = [[t('event_ann.all'),'all']]
|
||||
%>
|
||||
<div class="search_widget" style="display: flex;flex-wrap: wrap;font-size: 1.1em;">
|
||||
<%= select_tag('category',options_for_select(all_cat.concat(cats.map{|v| [v.title,v.id.to_s]}),:selected => params['category'].to_s),:id=>"category_select_box",:prompt => t('event_ann.select_prompt')) %>
|
||||
<input class="search_box" type="text" name="keywords" value="<%= params['keywords'].to_s.gsub(/\"/,'') %>" placeholder="<%= t('event_ann.keywords') %>">
|
||||
<div style="display: flex;flex-wrap: wrap;">
|
||||
<div class="default_picker">
|
||||
<input class="search_box" type="text" name="stime" value="<%= params['stime'].to_s.gsub(/\"/,'') %>" placeholder="<%= t('event_ann.stime') %>" data-format="yyyy/mm/dd">
|
||||
</div>
|
||||
~
|
||||
<div class="default_picker">
|
||||
<input class="search_box" type="text" name="etime" value="<%= params['etime'].to_s.gsub(/\"/,'') %>" placeholder="<%= t('event_ann.etime') %>" data-format="yyyy/mm/dd">
|
||||
</div>
|
||||
</div>
|
||||
<input type="hidden" name="authenticity_token" value="<%= (0...46).map { ('a'..'z').to_a[rand(26)] }.join %>">
|
||||
<input class="search_box" type="submit" value="<%= t('event_ann.search') %>">
|
||||
</div>
|
||||
</form>
|
||||
<% end %>
|
||||
<%= render_view %>
|
|
@ -0,0 +1,54 @@
|
|||
<%
|
||||
require 'event_anns_helper'
|
||||
params = OrbitHelper.params
|
||||
page = Page.where(url:params['url']).first
|
||||
@show_back_and_next_flag = 0
|
||||
if page.methods.include? 'select_option_items'.to_sym
|
||||
ModuleApp.all.select{|tmp| tmp.key.to_s=='event_ann'}.each do |modile_app|
|
||||
@show_option_items = modile_app.show_option_items rescue nil
|
||||
end
|
||||
page.select_option_items.each do |select_option_item|
|
||||
if !(@show_option_items.nil?) && select_option_item.field_name == @show_option_items.keys.first.to_s
|
||||
value = YAML.load(select_option_item.value)
|
||||
tmp = value[:en]
|
||||
I18n.with_locale(:en) do
|
||||
if tmp == t('event_ann.not_show')
|
||||
@show_back_and_next_flag = 0
|
||||
elsif tmp == t('event_ann.show_top')
|
||||
@show_back_and_next_flag = 1
|
||||
elsif tmp == t('event_ann.show_bottom')
|
||||
@show_back_and_next_flag = 2
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
if @show_back_and_next_flag != 0
|
||||
uid = params['uid']
|
||||
sorted,total_pages = get_sorted_event_ann(0)
|
||||
now_index = sorted.to_enum.with_index.select{|v| v[0].uid==uid}[0][1] rescue nil
|
||||
if !now_index.nil?
|
||||
if now_index != 0
|
||||
prev_result = sorted[now_index-1]
|
||||
prev_url = params['url'] + '/' + prev_result.to_param
|
||||
prev_content = "<button href='#{prev_url}' title='#{t('event_ann.prev')}' class='prev btn btn-default pull-left col-sm-5 btn-sm'><b>#{t('event_ann.prev')}</b><p>#{prev_result['title'][I18n.locale]}</p></button>"
|
||||
end
|
||||
if now_index != sorted.length-1
|
||||
next_result = sorted[now_index+1]
|
||||
next_url = params['url'] + '/' + next_result.to_param
|
||||
next_content = "<button href='#{next_url}' title='#{t('event_ann.next')}' class='next btn btn-default pull-right col-sm-5 btn-sm'><b>#{t('event_ann.next')}</b><p>#{next_result['title'][I18n.locale]}</p></button>"
|
||||
end
|
||||
content = "<div class='see_more_boxTitle row justify-content-between'>#{prev_content}#{next_content}</div>".html_safe
|
||||
else
|
||||
content = ''
|
||||
end
|
||||
end
|
||||
%>
|
||||
|
||||
<% if @show_back_and_next_flag==1 %>
|
||||
<%= content %>
|
||||
<% end %>
|
||||
<%= render_view %>
|
||||
<% if @show_back_and_next_flag==2 %>
|
||||
<%= content %>
|
||||
<% end %>
|
|
@ -0,0 +1,15 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title><%= render_site_title %></title>
|
||||
<%= stylesheet_link_tag "//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.3.0/css/font-awesome.min.css"%>
|
||||
<%= stylesheet_link_tag "event/bootstrap/bootstrap.min.css"%>
|
||||
<%= stylesheet_link_tag "template/template"%>
|
||||
<%= javascript_include_tag "jquery.min"%>
|
||||
<%= javascript_include_tag "bootstrap.min"%>
|
||||
</head>
|
||||
<body>
|
||||
<% @target_action = "show_widget" %>
|
||||
<%=render_view_for_event_ann((!params[:layout_type].blank? ? params[:layout_type] : 'event_ann_index1'))%>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,18 @@
|
|||
#!/usr/bin/env ruby
|
||||
# This command will automatically be run when you run "rails" with Rails 4 gems installed from the root of your application.
|
||||
|
||||
ENGINE_ROOT = File.expand_path('../..', __FILE__)
|
||||
ENGINE_PATH = File.expand_path('../../lib/event_ann/engine', __FILE__)
|
||||
|
||||
# Set up gems listed in the Gemfile.
|
||||
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
|
||||
require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
|
||||
|
||||
# require 'rails/all'
|
||||
# require 'rails/engine/commands'
|
||||
require "action_controller/railtie"
|
||||
require "action_mailer/railtie"
|
||||
require "sprockets/railtie"
|
||||
require "rails/test_unit/railtie"
|
||||
require 'rails/engine/commands'
|
||||
require "mongoid/railtie"
|
|
@ -0,0 +1,9 @@
|
|||
require 'rufus-scheduler'
|
||||
|
||||
scheduler = Rufus::Scheduler.new
|
||||
|
||||
#return if defined?(Rails::Console) || Rails.env.test? || File.split($0).last == 'rake'
|
||||
|
||||
scheduler.cron '43 2 * * *' do
|
||||
system('bundle exec rake event:remove_preview_bulletins')
|
||||
end
|
|
@ -0,0 +1,137 @@
|
|||
en:
|
||||
restful_actions:
|
||||
feed: Feed
|
||||
import: Import
|
||||
event_ann:
|
||||
speaker: Speaker
|
||||
host: Host
|
||||
notes: Notes
|
||||
start_date: Start Date
|
||||
end_date: End Date
|
||||
event_date: Event Date
|
||||
add_to_calendar: Add to calendar
|
||||
blank_to_set: (blank to use event_ann setting)
|
||||
stime: start time
|
||||
etime: end time
|
||||
select_prompt: --select category--
|
||||
all: All
|
||||
keywords: Keywords
|
||||
enable_search: Enable search feature
|
||||
'yes': 'Yes'
|
||||
'no': 'No'
|
||||
image: Cover Image
|
||||
picture_showing_size: Picture Showing Size
|
||||
orignal_size: Original Size
|
||||
small_size: Small Size
|
||||
medium_size: Medium Size
|
||||
showing_back_and_next: Show back and next
|
||||
not_show: Not show
|
||||
show_top: Show at top
|
||||
show_bottom: Show at bottom
|
||||
prev: previous
|
||||
next: next
|
||||
table:
|
||||
title : Title
|
||||
date : Date
|
||||
status : Status
|
||||
sub_title: Sub Title
|
||||
speaker: speaker
|
||||
host: host
|
||||
category: Category
|
||||
author: Author
|
||||
link: Link
|
||||
file: File
|
||||
view_count: View Count
|
||||
department: Department
|
||||
add_new: Add New
|
||||
export_to_excel: Export to Excel
|
||||
export_all_eanns: Export all Event Ann
|
||||
import_from_excel: Import from Excel
|
||||
download_example_sheet_here: Download example sheet here
|
||||
please_create_tags_cats: Please create all the tags and categories before hand. Only excel file is allowed
|
||||
create_atleast_one_cat: Please create atleast one category before importing.
|
||||
import_from_wp_xml: Import from WordPress XML
|
||||
click_on_submit: Click on Submit to save the changes
|
||||
approvers_list: Approvers List
|
||||
click_set_sub_manager: Click here to set Sub Managers for this module
|
||||
approver: Approver
|
||||
top_limit: Top Limit
|
||||
for_unlimited: Put 0 for unlimited
|
||||
feed_name: Feed Name
|
||||
rssfeed: RSS Feed Link
|
||||
jsonfeed: JSON Feed Link
|
||||
feed_list: Feed List
|
||||
approve: Approve
|
||||
all_articles: All Articles
|
||||
settings: Settings
|
||||
import: Import / Export
|
||||
event_ann: EventAnn
|
||||
approval_setting: Approval Setting
|
||||
approve_bulletin_event_fail: Approval Fail
|
||||
approve_bulletin_event_success: Approve Successfully
|
||||
approval_waiting: Approval
|
||||
submitted_new_event_ann: "%{poster} submitted a new event ann waiting for your approval."
|
||||
click_here_to_see: Please click the link below to view the event ann.
|
||||
rejected_annoucement: has rejected your event ann, because
|
||||
updated_annoucement: "%{poster} updated the rejected event ann."
|
||||
event_ann_subject: New event ann waiting for approval
|
||||
approval_site: Site
|
||||
approval_mail_hi: Hello %{name},
|
||||
approval_event_ann_title: Event Ann Title
|
||||
bulletin_events: Bulletin Events
|
||||
categories: Categories
|
||||
create_bulletin_event_success: Create BulletinEvent Successfully
|
||||
create_bulletin_event_category_success: Create Category Successfully
|
||||
date: Event Ann Date
|
||||
default_widget:
|
||||
bulletin_event_category_with_title: BulletinEvent Category with Title
|
||||
postdate: Post Date
|
||||
subtitle: Subtitle
|
||||
title: Title
|
||||
editing_event_ann: Edit Event Ann
|
||||
editing_event_ann_category: Edit Category
|
||||
file: Attachment
|
||||
file_description: File Description
|
||||
file_name: File Name
|
||||
frontend:
|
||||
bulletin_events: Event Ann front-end
|
||||
search_result: Search result
|
||||
link_name: Link Name
|
||||
new_bulletin_event_category: New BulletinEvent Category
|
||||
picture: Cover Picture
|
||||
search: Search
|
||||
selected_file: Select File
|
||||
update_bulletin_event_category_success: Update Category Successfully
|
||||
url: URL
|
||||
widget:
|
||||
bulletin_eventsand_web_links: Differential Nav.
|
||||
index: Index
|
||||
search: Search
|
||||
more: More
|
||||
email_reminder: Email Reminder
|
||||
activate_email_reminder: Activate Email Reminder
|
||||
email_sentdate: Email Time
|
||||
email_to: Email To
|
||||
mail_subject: this is an event ann reminder from【%{site_title}】
|
||||
view_count: View Counts
|
||||
other_mailaddress: Other Email
|
||||
other_mailaddress_note: Divide different email accounts with ","
|
||||
mail_hi: Hi
|
||||
mail_url_view: This email is the reminder of an event ann, please click the link for the details
|
||||
mail_source: Source
|
||||
mail_time: Time
|
||||
image_upload_size_note: The following recommendations %{image_upload_size} upload size
|
||||
resend_mail: Re-send Email
|
||||
is_external_link: Enable External Link
|
||||
external_link: External Link
|
||||
external_link_hint: "Make sure URL starts with http://"
|
||||
display_subtitle: Display Subtitle in Content Page
|
||||
display_img: Display Cover Image in Content Page
|
||||
is_display_edit_only: Only display editable event ann
|
||||
only_manager_can_edit_status: Only manager can edit status of event ann
|
||||
layout_type: Layout type
|
||||
event_ann_setting_for_iframe: Event ann settings for iframe
|
||||
url_generate: Url Generate
|
||||
show_page: Show pagination
|
||||
URL: URL
|
||||
copy: Copy
|
|
@ -0,0 +1,140 @@
|
|||
zh_tw:
|
||||
restful_actions:
|
||||
feed: 供給
|
||||
import: 匯入
|
||||
event_ann:
|
||||
speaker: 演講者
|
||||
host: 主持人
|
||||
notes: 備註
|
||||
start_date: 公告日期
|
||||
end_date: 下架日期
|
||||
event_date: 事件日期
|
||||
add_to_calendar: 加入行事曆
|
||||
blank_to_set: (留白則使用公告設定)
|
||||
stime: 公告日期
|
||||
etime: 下架日期
|
||||
select_prompt: --選取類別--
|
||||
all: 全部
|
||||
keywords: 關鍵字
|
||||
enable_search: 開啟搜尋功能
|
||||
'yes': 是
|
||||
'no': 否
|
||||
image: 封面圖片
|
||||
picture_showing_size: 圖片顯示大小
|
||||
orignal_size: 原圖大小
|
||||
small_size: 小張縮圖
|
||||
medium_size: 中等縮圖
|
||||
showing_back_and_next: 顯示上下則
|
||||
not_show: 不顯示
|
||||
show_top: 顯示在最上面
|
||||
show_bottom: 顯示在最下面
|
||||
prev: 上一則
|
||||
next: 下一則
|
||||
table:
|
||||
title : 標題
|
||||
date : 張貼日期
|
||||
status : 標籤
|
||||
sub_title: 副標題
|
||||
speaker: 演講者
|
||||
host: 主持人
|
||||
category: 類別
|
||||
author: 張貼人
|
||||
link: 超連結
|
||||
file: 檔案下載
|
||||
view_count: 瀏覽人次
|
||||
department: 單位
|
||||
add_new: 新建
|
||||
import: 匯入
|
||||
export_to_excel: 匯出至Excel檔
|
||||
export_all_eanns: 匯出所有公告
|
||||
import_from_excel: 從Excel檔匯入
|
||||
download_example_sheet_here: 在此下載範例
|
||||
please_create_tags_cats: 甲、 請事先建立所有標籤及分類。 僅限Excel檔。
|
||||
create_atleast_one_cat: 匯入前, 請先建立至少一個類別
|
||||
import_from_wp_xml: 從WordPress XML檔匯入
|
||||
top_limit: 最高設限
|
||||
for_unlimited: 歸零不設限
|
||||
click_on_submit: 點"提交"儲存變更
|
||||
approvers_list: 審核人名單
|
||||
click_set_sub_manager: 點這邊來設定這個模組的副管理者
|
||||
approver: 審核人
|
||||
approve: 通過
|
||||
feed_name: Feed 標題
|
||||
settings: 設定
|
||||
import: 匯入 / 匯出
|
||||
rssfeed: RSS 供給連結
|
||||
jsonfeed: JSON 供給連結
|
||||
feed_list: 訂閱清單
|
||||
all_articles: 文章列表
|
||||
event_ann: 活動與演講公告
|
||||
approval_setting: 審核設定
|
||||
approve_bulletin_event_fail: 審核失敗
|
||||
approve_bulletin_event_success: 審核成功
|
||||
approval_waiting: 審核
|
||||
submitted_new_event_ann: 貴單位於全球資訊網有一則 %{poster} 張貼的最新消息待您審核發布,
|
||||
click_here_to_see: 請您點擊以下網址,前往審核
|
||||
rejected_annoucement: 未通過您的公告審核,原因為
|
||||
updated_annoucement: 貴單位於全球資訊網有一則 %{poster} 被拒絕的最新消息已重新編輯待您審核發布,
|
||||
event_ann_subject: 系統訊息 - 最新消息內容審核通知
|
||||
approval_mail_hi: 親愛的 %{name} 主管您好
|
||||
approval_site: 網址
|
||||
approval_event_ann_title: 消息標題
|
||||
bulletin_events: 活動與演講公告
|
||||
categories: 類別
|
||||
create_bulletin_event_success: 建立公告成功
|
||||
create_bulletin_event__category_success: 建立類別成功
|
||||
date: 起迄日期
|
||||
default_widget:
|
||||
bulletin_event_category_with_title: 公告類別及標題
|
||||
postdate: 張貼日期
|
||||
subtitle: 副標題
|
||||
title: 標題
|
||||
editing_event_ann: 編輯類別
|
||||
editing_event_ann_category: 編輯類別
|
||||
error:
|
||||
no_avilb_cate_for_posting: 沒有可以張貼的類別
|
||||
file: 附加檔案
|
||||
file_description: 檔案描述
|
||||
file_name: 檔案名稱
|
||||
frontend:
|
||||
bulletin_events: 公告前台
|
||||
search_result: 搜尋結果頁
|
||||
link_name: 連結名稱
|
||||
new_bulletin_event_category: 新增公告類別
|
||||
picture: 刊頭圖片
|
||||
search: 搜尋
|
||||
selected_file: 選擇檔案
|
||||
update_bulletin_event_category_success: 更新類別成功
|
||||
url: 連結位置
|
||||
widget:
|
||||
bulletin_events_and_web_links: 分眾頁籤
|
||||
index: 索引
|
||||
search: 搜尋
|
||||
more: 更多+
|
||||
email_reminder: 寄送提醒
|
||||
activate_email_reminder: 開啟寄送提醒
|
||||
email_sentdate: 寄送時間
|
||||
email_to: 寄送對象
|
||||
view_count: 瀏覽人次
|
||||
other_mailaddress: 其他Mail
|
||||
other_mailaddress_note: 輸入多組mail時,請用","逗號隔開
|
||||
mail_subject: 來自【%{site_title}】的公告事件提醒
|
||||
mail_hi: 您好
|
||||
mail_url_view: 此封信件為公告事件提醒,請點選以下連結詳細觀看
|
||||
mail_source: 來源
|
||||
mail_time: 時間
|
||||
image_upload_size_note: 建議檔案小於%{image_upload_size}
|
||||
resend_mail: 重新寄送提醒
|
||||
is_external_link: 連結外部網址
|
||||
external_link: 外部連結
|
||||
external_link_hint: "確定連結開頭為http://"
|
||||
display_subtitle: 內容頁顯示副標題
|
||||
display_img: 內容頁顯示封面圖片
|
||||
is_display_edit_only: 只顯示可更新的公告
|
||||
only_manager_can_edit_status: 只有管理者可更新公告狀態
|
||||
layout_type: 頁面樣式
|
||||
event_ann_setting_for_iframe: 公告iframe設定
|
||||
url_generate: 網址生成
|
||||
show_page: 顯示頁碼
|
||||
URL: 網址
|
||||
copy: 複製
|
|
@ -0,0 +1,41 @@
|
|||
Rails.application.routes.draw do
|
||||
|
||||
locales = Site.first.in_use_locales rescue I18n.available_locales
|
||||
|
||||
scope "(:locale)", locale: Regexp.new(locales.join("|")) do
|
||||
namespace :admin do
|
||||
post 'event_ann/preview', to: 'event_anns#preview'
|
||||
post 'event_ann/createfeed', to: 'event_anns#createfeed'
|
||||
post 'event_ann/importeanns', to: 'event_anns#importeanns'
|
||||
post 'event_ann/import_from_xml', to: 'event_anns#import_from_xml'
|
||||
get 'event_ann/excel_format', to: 'event_anns#excel_format'
|
||||
get 'event_ann/export_excel', to: 'event_anns#export_excel'
|
||||
patch 'event_ann/updatefeed', to: 'event_anns#updatefeed'
|
||||
delete 'event_ann/deletefeed', to: 'event_anns#deletefeed'
|
||||
get 'event_ann/destroy_preview/:slug_title-:uid', to: 'event_anns#destroy_preview'
|
||||
post 'event_ann/approve_bulletin', to: 'event_anns#approve_bulletin'
|
||||
get 'event_ann/feed', to: 'event_anns#feed'
|
||||
get 'event_ann/feedform', to: 'event_anns#feedform'
|
||||
get 'event_ann/settings', to: 'event_anns#settings'
|
||||
get 'event_ann/import', to: 'event_anns#import'
|
||||
post 'event_ann/createsettings', to: 'event_anns#createsettings'
|
||||
patch 'event_ann/updatesettings', to: 'event_anns#updatesettings'
|
||||
post 'event_ann/import_from_wp', to: 'event_anns#import_from_wp'
|
||||
post 'event_ann/generate_iframe_url' => 'event_anns#generate_iframe_url'
|
||||
resources :event_anns
|
||||
end
|
||||
|
||||
resources :event_anns do
|
||||
collection do
|
||||
get ':slug_title-:uid', to: 'event_anns#show', as: :display
|
||||
end
|
||||
end
|
||||
|
||||
get "/xhr/event_anns/feed/:uid" => "event_ann_feeds#feed"
|
||||
get "/xhr/event_anns/rssfeed/:uid" => "event_ann_feeds#rssfeed"
|
||||
get "/xhr/event_anns/feeds" => "event_ann_feeds#feeds"
|
||||
get '/xhr/event_anns/event_ann.json', to: 'bulletin_events#get_bulletins'
|
||||
get '/xhr/panel/event_anns/widget/sync_data' => 'event_anns#show_widget'
|
||||
end
|
||||
|
||||
end
|
|
@ -0,0 +1,22 @@
|
|||
# encoding: UTF-8
|
||||
$:.push File.expand_path("../lib", __FILE__)
|
||||
|
||||
# Maintain your gem's version:
|
||||
require "event_ann/version"
|
||||
|
||||
# Describe your gem and declare its dependencies:
|
||||
Gem::Specification.new do |s|
|
||||
s.name = "event_ann"
|
||||
s.version = EventAnn::VERSION
|
||||
s.authors = ["RulingDigital"]
|
||||
s.email = ["orbit@rulingcom.com"]
|
||||
s.homepage = "http://www.rulingcom.com"
|
||||
s.summary = "Event Ann for Orbit"
|
||||
s.description = "Event Ann for Orbit"
|
||||
s.license = "MIT"
|
||||
|
||||
s.files = Dir["{app,config,db,lib}/**/*", "MIT-LICENSE", "Rakefile", "README.rdoc"]
|
||||
s.test_files = Dir["test/**/*"]
|
||||
|
||||
s.add_dependency "rufus-scheduler", "~> 3.6.0"
|
||||
end
|
|
@ -0,0 +1,117 @@
|
|||
require "yaml"
|
||||
module EventAnn
|
||||
class Engine < ::Rails::Engine
|
||||
initializer "event_ann" do
|
||||
begin
|
||||
translate_data = Dir["#{EventAnn::Engine.root}/config/locales/*.yml"] .map{|yaml_file| YAML.load(File.read(yaml_file))}
|
||||
data = {}
|
||||
key1 = {}
|
||||
value1 = {}
|
||||
value2 = {}
|
||||
value3 = {}
|
||||
data_item = {}
|
||||
key_item1 = {}
|
||||
key_item2 = {}
|
||||
value_item1 = {}
|
||||
value_item2 = {}
|
||||
value_item3 = {}
|
||||
value2_item1 = {}
|
||||
value2_item2 = {}
|
||||
translate_data.each do |t_data|
|
||||
v = t_data.values
|
||||
k = t_data.keys[0]
|
||||
key1[k] = v[0]['event_ann']['picture_showing_size']
|
||||
value1[k] = v[0]['event_ann']['small_size']
|
||||
value2[k] = v[0]['event_ann']['medium_size']
|
||||
value3[k] = v[0]['event_ann']['orignal_size']
|
||||
key_item1[k] = v[0]['event_ann']['showing_back_and_next']
|
||||
key_item2[k] = v[0]['event_ann']['enable_search']
|
||||
value_item1[k] = v[0]['event_ann']['not_show']
|
||||
value_item2[k] = v[0]['event_ann']['show_bottom']
|
||||
value_item3[k] = v[0]['event_ann']['show_top']
|
||||
value2_item1[k] = v[0]['event_ann']['no']
|
||||
value2_item2[k] = v[0]['event_ann']['yes']
|
||||
end
|
||||
data[key1] = [value1,value2,value3]
|
||||
data_item[key_item1] = [value_item1,value_item2,value_item3]
|
||||
data_item[key_item2] = [value2_item1,value2_item2]
|
||||
require File.expand_path('../../../app/models/event_ann_cache', __FILE__)
|
||||
if defined? EventAnnsCache
|
||||
EventAnnsCache.destroy_all
|
||||
end
|
||||
rescue => e
|
||||
puts ['error in event_ann',e]
|
||||
end
|
||||
OrbitApp.registration "EventAnn", :type => "ModuleApp" do
|
||||
module_label "event_ann.event_ann"
|
||||
base_url File.expand_path File.dirname(__FILE__)
|
||||
widget_methods ["widget","random_event_ann_widget", "tag_cloud"]
|
||||
widget_settings [{"data_count"=>30}]
|
||||
taggable "BulletinEvent"
|
||||
categorizable
|
||||
authorizable
|
||||
frontend_enabled
|
||||
feeds_url "/xhr/event_anns/feeds"
|
||||
data_count 1..30
|
||||
begin
|
||||
show_options data
|
||||
show_option_items data_item
|
||||
rescue => e
|
||||
puts ['there_was_no_show_option_method',e]
|
||||
end
|
||||
side_bar do
|
||||
head_label_i18n 'event_ann.event_ann', icon_class: "icons-megaphone"
|
||||
available_for "users"
|
||||
active_for_controllers (['admin/event_anns'])
|
||||
head_link_path "admin_event_anns_path"
|
||||
|
||||
context_link 'event_ann.all_articles',
|
||||
:link_path=>"admin_event_anns_path" ,
|
||||
:priority=>1,
|
||||
:active_for_action=>{'admin/event_anns'=>'index'},
|
||||
:available_for => 'users'
|
||||
context_link 'new_',
|
||||
:link_path=>"new_admin_event_ann_path" ,
|
||||
:priority=>2,
|
||||
:active_for_action=>{'admin/event_anns'=>'new'},
|
||||
:available_for => 'sub_managers'
|
||||
context_link 'categories',
|
||||
:link_path=>"admin_module_app_categories_path" ,
|
||||
:link_arg=>"{:module_app_id=>ModuleApp.find_by(:key=>'event_ann').id}",
|
||||
:priority=>3,
|
||||
:active_for_action=>{'admin/event_anns'=>'categories'},
|
||||
:active_for_category => 'EventAnn',
|
||||
:available_for => 'managers'
|
||||
context_link 'tags',
|
||||
:link_path=>"admin_module_app_tags_path" ,
|
||||
:link_arg=>"{:module_app_id=>ModuleApp.find_by(:key=>'event_ann').id}",
|
||||
:priority=>4,
|
||||
:active_for_action=>{'admin/event_anns'=>'tags'},
|
||||
:active_for_tag => 'EventAnn',
|
||||
:available_for => 'managers'
|
||||
context_link 'event_ann.feed_list',
|
||||
:link_path=>"admin_event_ann_feed_path" ,
|
||||
:priority=>5,
|
||||
:active_for_action=>{'admin/event_anns'=>'feed'},
|
||||
:available_for => 'managers'
|
||||
context_link 'event_ann.import',
|
||||
:link_path=>"admin_event_ann_import_path" ,
|
||||
:priority=>6,
|
||||
:active_for_action=>{'admin/event_anns'=>'import'},
|
||||
:available_for => 'managers'
|
||||
context_link 'event_ann.settings',
|
||||
:link_path=>"admin_event_ann_settings_path" ,
|
||||
:priority=>6,
|
||||
:active_for_action=>{'admin/event_anns'=>'settings'},
|
||||
:available_for => 'managers'
|
||||
end
|
||||
|
||||
end
|
||||
# temp = YAML.load_file(File.join(Rails.root,"config","mongoid.yml"))
|
||||
# dbsettings = temp["production"]["sessions"]["default"]
|
||||
# s = Moped::Session.new(dbsettings["hosts"])
|
||||
# s.use dbsettings["database"]
|
||||
# s[:bulletin_events].indexes.create({expirable_created_at: 1},{ expireAfterSeconds: 180 })
|
||||
end
|
||||
end
|
||||
end
|
|
@ -0,0 +1,3 @@
|
|||
module EventAnn
|
||||
VERSION = "0.0.1"
|
||||
end
|
|
@ -0,0 +1,16 @@
|
|||
module EventBulletinModel
|
||||
module Cache
|
||||
require 'active_support/concern'
|
||||
extend ActiveSupport::Concern
|
||||
included do
|
||||
before_save :do_before_save
|
||||
end
|
||||
def do_before_save
|
||||
if self.class == SubPart
|
||||
EventAnnsCache.where(parent_id:self.id).destroy
|
||||
elsif self.class == BulletinEvent || (self.class == Page && self.module == "event_ann")
|
||||
EventAnnsCache.all.destroy
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -0,0 +1,4 @@
|
|||
require "event_ann/engine"
|
||||
module EventAnn
|
||||
|
||||
end
|
|
@ -0,0 +1,8 @@
|
|||
desc 'Remove duplicated bulletin_events (event_anns) created by preview'
|
||||
|
||||
namespace :bulletin_event do
|
||||
task :remove_preview_bulletins => [:environment] do
|
||||
bulletin_events = BulletinEvent.where(is_preview: true)
|
||||
bulletin_events.destroy_all
|
||||
end
|
||||
end
|
|
@ -0,0 +1,32 @@
|
|||
<div class="w-event_ann widget-event_ann-1">
|
||||
<h3 class="w-event_ann__widget-title">
|
||||
<span>{{widget-title}}</span>
|
||||
</h3>
|
||||
<ul class="w-event_ann__list" data-level="0" data-list="event_ann">
|
||||
<li class="w-event_ann__item">
|
||||
<div class="w-event_ann__img-wrap bullseye">
|
||||
<img class="w-event_ann__img" src="{{img_src}}" alt="{{img_description}}" title="{{img_description}}">
|
||||
</div>
|
||||
<div class="w-event_ann__meta">
|
||||
<span class="w-event_ann__status-wrap" data-list="statuses" data-level="1">
|
||||
<span class="w-event_annt_news__status label status {{status-class}}">{{status}}</span>
|
||||
</span>
|
||||
<span class="w-event_ann__postdate-wrap" date-format="%Y-%m-%d">
|
||||
<i class="fa fa-calendar-o"></i>
|
||||
<span class="w-event_ann__postdate">{{postdate}}</span>
|
||||
</span>
|
||||
<span class="w-event_ann__category-wrap">
|
||||
<i class="fa fa-tasks"></i>
|
||||
<span class="w-event_ann__category">{{category}}</span>
|
||||
</span>
|
||||
</div>
|
||||
<h4 class="w-event_ann__entry-title">
|
||||
<a class="w-event_ann__title" href="{{link_to_show}}">{{title}}</a>
|
||||
</h4>
|
||||
<p class="w-event_ann__subtitle">{{subtitle}}</p>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="w-event_ann__more-wrap clearfix">
|
||||
<a class="w-event_ann__more btn btn-primary pull-right" href="{{more_url}}"><%= (I18n.locale.to_s =="zh_tw") ? "更多最新消息" : "More NEWS" %></a>
|
||||
</div>
|
||||
</div>
|
|
@ -0,0 +1,22 @@
|
|||
<div class="w-event_ann widget-eevent_ann0">
|
||||
<h3 class="w-event_ann_widget-title">
|
||||
<span>{{widget-title}}</span>
|
||||
</h3>
|
||||
<ul class="w-event_ann_list" data-level="0" data-list="eevent_ann
|
||||
<li class="w-event_ann_item row">
|
||||
<h4 class="w-event_ann_entry-title col-sm-9">
|
||||
<span class="w-event_ann_status-wrap" data-list="statuses" data-level="1">
|
||||
<span class="w-event_ann_status label status {{status-class}}">{{status}}</span>
|
||||
</span>
|
||||
<a class="w-event_ann_title" href="{{link_to_show}}">{{title}}</a>
|
||||
</h4>
|
||||
<span class="w-event_ann_postdate-wrap col-sm-3" date-format="%Y-%m-%d">
|
||||
<i class="fa fa-calendar-o"></i>
|
||||
<span class="w-event_ann_postdate">{{postdate}}</span>
|
||||
</span>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="w-event_ann_more-wrap clearfix">
|
||||
<a class="w-event_ann_more btn btn-primary pull-right" href="{{more_url}}"><%= (I18n.locale.to_s =="zh_tw") ? "更多最新消息" : "More NEWS" %></a>
|
||||
</div>
|
||||
</div>
|
|
@ -0,0 +1,22 @@
|
|||
<div class="w-event_ann widget-event_ann-11">
|
||||
<h3 class="w-event_ann__widget-title">
|
||||
<span>{{widget-title}}</span>
|
||||
</h3>
|
||||
<ul class="w-event_ann__list" data-level="0" data-list="event_ann">
|
||||
<li class="w-event_ann__item row">
|
||||
<span class="w-event_ann__postdate-wrap col-sm-3" date-format="%Y-%m-%d">
|
||||
<i class="fa fa-calendar-o"></i>
|
||||
<span class="w-event_ann__postdate">{{postdate}}</span>
|
||||
</span>
|
||||
<h4 class="w-event_ann__entry-title col-sm-9">
|
||||
<span class="w-event_ann__status-wrap" data-list="statuses" data-level="1">
|
||||
<span class="w-event_ann__status label status {{status-class}}">{{status}}</span>
|
||||
</span>
|
||||
<a class="w-event_ann__title" href="{{link_to_show}}">{{title}}</a>
|
||||
</h4>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="w-event_ann__more-wrap clearfix">
|
||||
<a class="w-event_ann__more btn btn-primary pull-right" href="{{more_url}}"><%= (I18n.locale.to_s =="zh_tw") ? "更多最新消息" : "More NEWS" %></a>
|
||||
</div>
|
||||
</div>
|
|
@ -0,0 +1,27 @@
|
|||
<div class="w-event_ann widget-event_ann-12">
|
||||
<h3 class="w-event_ann__widget-title">
|
||||
<span>{{widget-title}}</span>
|
||||
</h3>
|
||||
<table class="w-event_ann__table table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="w-event_ann__th w-event_ann__th--title">{{title-head}}</th>
|
||||
<th class="w-event_ann__th w-event_ann__th--date">{{date-head}}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody data-level="0" data-list="event_ann">
|
||||
<tr>
|
||||
<td class="w-event_ann_content">
|
||||
<span class="w-event_ann__status-wrap" data-list="statuses" data-level="1">
|
||||
<span class="w-event_ann__status label status {{status-class}}">{{status}}</span>
|
||||
</span>
|
||||
<a class="w-event_ann__title" href="{{link_to_show}}">{{title}}</a>
|
||||
</td>
|
||||
<td class="w-event_ann__postdate" date-format="%Y-%m-%d">{{postdate}}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="w-event_ann__more-wrap clearfix">
|
||||
<a class="w-event_ann__more btn btn-primary pull-right" href="{{more_url}}"><%= (I18n.locale.to_s =="zh_tw") ? "更多最新消息" : "More NEWS" %></a>
|
||||
</div>
|
||||
</div>
|
|
@ -0,0 +1,27 @@
|
|||
<div class="w-event_ann widget-event_ann-13">
|
||||
<h3 class="w-event_ann__widget-title">
|
||||
<span>{{widget-title}}</span>
|
||||
</h3>
|
||||
<table class="w-event_ann__table table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="w-event_ann__th w-event_ann__th--date">{{date-head}}</th>
|
||||
<th class="w-event_ann__th w-event_ann__th--title">{{title-head}}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody data-level="0" data-list="event_ann">
|
||||
<tr>
|
||||
<td class="w-event_ann__postdate" date-format="%Y-%m-%d">{{postdate}}</td>
|
||||
<td class="w-event_ann_content">
|
||||
<span class="w-event_ann__status-wrap" data-list="statuses" data-level="1">
|
||||
<span class="w-event_ann__status label status {{status-class}}">{{status}}</span>
|
||||
</span>
|
||||
<a class="w-event_ann__title" href="{{link_to_show}}">{{title}}</a>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="w-event_ann__more-wrap clearfix">
|
||||
<a class="w-event_ann__more btn btn-primary pull-right" href="{{more_url}}"><%= (I18n.locale.to_s =="zh_tw") ? "更多最新消息" : "More NEWS" %></a>
|
||||
</div>
|
||||
</div>
|
|
@ -0,0 +1,29 @@
|
|||
<div class="w-event_ann widget-event_ann-14">
|
||||
<h3 class="w-event_ann__widget-title">
|
||||
<span>{{widget-title}}</span>
|
||||
</h3>
|
||||
<div class="w-event_ann__inner row">
|
||||
<div class="w-event_ann__img-wrap col-xs-4 bullseye">
|
||||
<img class="w-event_ann__img" src="{{main_picture}}" alt="{{main_picture_description}}" title="{{main_picture_description}}">
|
||||
</div>
|
||||
<ul class="w-event_ann__list col-xs-8" data-level="0" data-list="event_ann">
|
||||
<li class="w-event_ann__item">
|
||||
<div class="w-event_ann__content row">
|
||||
<h4 class="w-event_ann__entry-title col-xs-9">
|
||||
<span class="w-event_ann__status-wrap" data-list="statuses" data-level="1">
|
||||
<span class="w-event_ann__status label {{status-class}}">{{status}}</span>
|
||||
</span>
|
||||
<a class="w-event_ann__title" href="{{link_to_show}}">{{title}}</a>
|
||||
</h4>
|
||||
<span class="w-event_ann__postdate-wrap col-xs-3" date-format="%Y-%m-%d">
|
||||
<i class="fa fa-calendar-o"></i>
|
||||
<span class="w-event_ann__postdate">{{postdate}}</span>
|
||||
</span>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="w-event_ann__more-wrap clearfix">
|
||||
<a class="w-event_ann__more btn btn-primary pull-right" href="{{more_url}}"><%= (I18n.locale.to_s =="zh_tw") ? "更多最新消息" : "More NEWS" %></a>
|
||||
</div>
|
||||
</div>
|
|
@ -0,0 +1,131 @@
|
|||
<div class="w-event_ann widget-eevent_ann w-evevent_annidget-eveevent_ann style="position:relative;">
|
||||
<div class="w-event_ann_more-wrap clearfix">
|
||||
<h2 class="w-event_ann_widget-title">
|
||||
<span>{{widget-title}}</span>
|
||||
</h2>
|
||||
<a class="w-event_ann_more btn btn-primary pull-right" href="{{more_url}}"><%= (I18n.locale.to_s =="zh_tw") ? "更多最新消息" : "More NEWS" %></a>
|
||||
</div>
|
||||
<div style="position: absolute;top: 50%;bottom: 50%;width:100%;">
|
||||
<button class="btn-left" title = "<%= (I18n.locale.to_s =="zh_tw") ? "上一張" : "prev" %>" style="float: left;height: 2.5em; width: 2.5em;background: url(/assets/left-01.png) no-repeat;border: 0;background-size: contain;position: absolute;transition:.3s; left: 0.6%;"></button>
|
||||
<button class="btn-right" title = "<%= (I18n.locale.to_s =="zh_tw") ? "下一張" : "next" %>" style="float: right;;height: 2.5em; width: 2.5em;background: url(/assets/right-01.png) no-repeat;background-size: contain;border: 0;position: absolute;transition:.3s;right: 0.6%;"></button>
|
||||
</div>
|
||||
<ul class="w-event_ann_list row" data-level="0" data-list="eevent_ann
|
||||
<li class="w-event_ann_item col-md-4">
|
||||
<div class="w-event_ann_img-wrap bullseye">
|
||||
<img class="w-event_ann_img" src="{{img_src}}" alt="{{img_description}}" title="{{img_description}}">
|
||||
</div>
|
||||
<div class="w-event_ann_content-wrap">
|
||||
<div class="w-event_ann_meta">
|
||||
<span class="w-event_ann_status-wrap" data-list="statuses" data-level="1">
|
||||
<span class="w-event_ann_status label {{status-class}}">{{status}}</span>
|
||||
</span>
|
||||
<span class="w-event_ann_postdate-wrap" date-format="%Y-%m-%d">
|
||||
<i class="fa fa-calendar-o"></i>
|
||||
<span class="w-event_ann_postdate">{{postdate}}</span>
|
||||
</span>
|
||||
<span class="w-event_ann_category-wrap">
|
||||
<i class="fa fa-tasks"></i>
|
||||
<span class="w-event_ann_category">{{category}}</span>
|
||||
</span>
|
||||
</div>
|
||||
<h4 class="w-event_ann_entry-title">
|
||||
<a class="w-event_ann_title" href="{{link_to_show}}">{{title}}</a>
|
||||
</h4>
|
||||
<p class="w-event_ann_subtitle">{{subtitle}}</p>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<script src="//code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
|
||||
<script>
|
||||
function combineul(){
|
||||
for(var i=1;i<$('.widget-event_ann4 ul.w-eevent_annlist').length;i++)
|
||||
$('.widget-event_ann4 ul.w-eevent_annlist').eq(0).find('>li').eq(-1).after($('.widget-evevent_annul.w-eveevent_annst').eq(i).html());
|
||||
var ullength = $('.widget-event_ann4 ul.w-eevent_annlist').length;
|
||||
for(var i = 1;i < ullength;i++)
|
||||
$('.widget-event_ann4 ul.w-eevent_annlist').eq(-1).remove();
|
||||
};
|
||||
var lilength = $('.widget-event_ann4 li.w-eevent_annitem').length;
|
||||
var num;
|
||||
function reorganize(num){
|
||||
combineul();
|
||||
for(var i=1;i< Math.ceil(lilength/num);i++){
|
||||
$('.widget-event_ann4 ul.w-eevent_annlist').eq(-1).after('<ul class="w-evevent_annist row" data-level="0" data-list="eveevent_annul>')
|
||||
var lihtml="";
|
||||
//var liheight=new Array(num);
|
||||
if(i != (Math.ceil(lilength/num)-1)){
|
||||
for(var j=0;j<num;j++){
|
||||
lihtml += "<li class='w-event_ann_item col-md-4'>"+$('.widget-eevent_ann li.w-evevent_anntem').eq(i*num+j).html()+"</li>"
|
||||
//liheight[j] = $('.widget-event_ann4 li.w-eevent_annitem').eq(i*num+j).height()+20;//20=>margin-top+margin-bottom
|
||||
};
|
||||
}else{
|
||||
for(var j=0;j< lilength - num *(Math.ceil(lilength/num)-1) ;j++){
|
||||
lihtml += "<li class='w-event_ann_item col-md-4'>"+$('.widget-eevent_ann li.w-evevent_anntem').eq(i*num+j).html()+"</li>"
|
||||
//liheight[j] = $('.widget-event_ann4 li.w-eevent_annitem').eq(i*num+j).height()+20;//20=>margin-top+margin-bottom
|
||||
};
|
||||
};
|
||||
$('.widget-event_ann4 ul.w-eevent_annlist').eq(-1).html(lihtml);
|
||||
};
|
||||
if(Math.ceil(lilength/num) != 1 )
|
||||
for(var i=0;i< lilength -num ; i++ )
|
||||
$('.widget-event_ann4 ul.w-eevent_annlist').eq(0).find("li.w-evevent_anntem").eq(num).remove();
|
||||
for(var i=0;i< Math.ceil(lilength/num);i++)
|
||||
$('.widget-event_ann4 ul.w-eevent_annlist').eq(i).attr("index",i);
|
||||
$('.widget-event_ann4 ul.w-eevent_annlist').css("display","none");
|
||||
$('.widget-event_ann4 ul.w-eevent_annlist').eq(0).css("display","flex");
|
||||
$('.widget-event_ann4 ul.w-eevent_annlist').eq(0).addClass("active");
|
||||
$('.widget-event_ann4 ul.w-eevent_annlist').css('padding','0 1.125em');
|
||||
$('.widget-event_ann4 button').css('z-index','10');
|
||||
$('.widget-event_ann4 ul.w-eevent_annlist >li').css('width','calc('+100/num+'% - '+20/16+'em)'); //20px=>li的margin
|
||||
$('.widget-event_ann4 ul.w-eevent_annlist >li').css('float','left');
|
||||
};
|
||||
$(window).resize(function(){
|
||||
if($(window).width()>1024){
|
||||
reorganize(3);
|
||||
num=3;
|
||||
}else if($(window).width()>576){
|
||||
reorganize(2);
|
||||
num=2;
|
||||
}else{
|
||||
reorganize(1);
|
||||
num=1;
|
||||
}
|
||||
})
|
||||
$(document).ready(function(){
|
||||
if($(window).width()>1024){
|
||||
reorganize(3);
|
||||
num=3;
|
||||
}else if($(window).width()>576){
|
||||
reorganize(2);
|
||||
num=2;
|
||||
}else{
|
||||
reorganize(1);
|
||||
num=1;
|
||||
}
|
||||
var flag=false;
|
||||
$('.btn-left').click(function(){
|
||||
if(!flag){
|
||||
var currentul = Number($('.widget-event_ann4 ul.w-eevent_annlist.active').attr("index"));
|
||||
$('.widget-event_ann4 ul.w-eevent_annlist').css('display','none');
|
||||
if(currentul - 1 < 0)
|
||||
currentul += Math.ceil(lilength/num);
|
||||
$('.widget-event_ann4 ul.w-eevent_annlist').removeClass("active");
|
||||
$('.widget-event_ann4 ul.w-eevent_annlist').eq(currentul-1).addClass("active");
|
||||
flag=true;
|
||||
$('.widget-event_ann4 ul.w-eevent_annlist.active').eq(0).effect("slide", { direction: "left", mode: 'show', duration: 500},function(){flag=false;});
|
||||
};
|
||||
});
|
||||
$('.btn-right').click(function(){
|
||||
if(!flag){
|
||||
var currentul = Number($('.widget-event_ann4 ul.w-eevent_annlist.active').attr("index"));
|
||||
$('.widget-event_ann4 ul.w-eevent_annlist').css("display","none");
|
||||
if(currentul + 1 > Math.ceil(lilength/num) - 1)
|
||||
currentul -= Math.ceil(lilength/num);
|
||||
$('.widget-event_ann4 ul.w-eevent_annlist').removeClass("active");
|
||||
$('.widget-event_ann4 ul.w-eevent_annlist').eq(currentul+1).addClass("active");
|
||||
flag=true;
|
||||
$('.widget-event_ann4 ul.w-eevent_annlist.active').eq(0).effect("slide", { direction: "right", mode: 'show', duration: 500},function(){flag=false;});
|
||||
};
|
||||
});
|
||||
});
|
||||
</script>
|
|
@ -0,0 +1,34 @@
|
|||
<div class="w-event_ann widget-event_ann-2">
|
||||
<h3 class="w-event_ann__widget-title">
|
||||
<span>{{widget-title}}</span>
|
||||
</h3>
|
||||
<ul class="w-event_ann__list" data-level="0" data-list="event_ann">
|
||||
<li class="w-event_ann__item row">
|
||||
<div class="w-event_ann__img-wrap col-sm-4 bullseye">
|
||||
<img class="w-event_ann__img" src="{{img_src}}" alt="{{img_description}}" title="{{img_description}}">
|
||||
</div>
|
||||
<div class="w-event_ann__content-wrap col-sm-8">
|
||||
<div class="w-event_ann__meta">
|
||||
<span class="w-event_ann__status-wrap" data-list="statuses" data-level="1">
|
||||
<span class="w-event_ann__status label status {{status-class}}">{{status}}</span>
|
||||
</span>
|
||||
<span class="w-event_ann__postdate-wrap" date-format="%Y-%m-%d">
|
||||
<i class="fa fa-calendar-o"></i>
|
||||
<span class="w-event_ann__postdate">{{postdate}}</span>
|
||||
</span>
|
||||
<span class="w-event_ann__category-wrap">
|
||||
<i class="fa fa-tasks"></i>
|
||||
<span class="w-event_ann__category">{{category}}</span>
|
||||
</span>
|
||||
</div>
|
||||
<h4 class="w-event_ann__entry-title">
|
||||
<a class="w-event_ann__title" href="{{link_to_show}}">{{title}}</a>
|
||||
</h4>
|
||||
<p class="w-event_ann__subtitle">{{subtitle}}</p>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="w-event_ann__more-wrap clearfix">
|
||||
<a class="w-event_ann__more btn btn-primary pull-right" href="{{more_url}}"><%= (I18n.locale.to_s =="zh_tw") ? "更多最新消息" : "More NEWS" %></a>
|
||||
</div>
|
||||
</div>
|
|
@ -0,0 +1,87 @@
|
|||
<div class="w-event_ann widget-event_ann-4">
|
||||
<div class="w-event_ann__more-wrap clearfix">
|
||||
<h2 class="w-event_ann__widget-title">
|
||||
<span>{{widget-title}}</span>
|
||||
</h2>
|
||||
<a class="w-event_ann__more btn btn-primary pull-right" href="{{more_url}}"><%= (I18n.locale.to_s =="zh_tw") ? "更多最新消息" : "More NEWS" %></a>
|
||||
</div>
|
||||
<ul class="w-event_ann__list row" data-level="0" data-list="event_ann">
|
||||
<li class="w-event_ann__item col-md-4">
|
||||
<div class="w-event_ann__img-wrap bullseye">
|
||||
<img class="w-event_ann__img" src="{{img_src}}" alt="{{img_description}}" title="{{img_description}}">
|
||||
</div>
|
||||
<div class="w-event_ann__content-wrap">
|
||||
<div class="w-event_ann__meta">
|
||||
<span class="w-event_ann__status-wrap" data-list="statuses" data-level="1">
|
||||
<span class="w-event_ann__status label {{status-class}}">{{status}}</span>
|
||||
</span>
|
||||
<span class="w-event_ann__postdate-wrap" date-format="%Y-%m-%d">
|
||||
<i class="fa fa-calendar-o"></i>
|
||||
<span class="w-event_ann__postdate">{{postdate}}</span>
|
||||
</span>
|
||||
<span class="w-event_ann__category-wrap">
|
||||
<i class="fa fa-tasks"></i>
|
||||
<span class="w-event_ann__category">{{category}}</span>
|
||||
</span>
|
||||
</div>
|
||||
<h4 class="w-event_ann__entry-title">
|
||||
<a class="w-event_ann__title" href="{{link_to_show}}">{{title}}</a>
|
||||
</h4>
|
||||
<p class="w-event_ann__subtitle">{{subtitle}}</p>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<script>
|
||||
var lilength = $('.widget-event_ann-4 li.w-event_ann__item').length;
|
||||
function combineul(){
|
||||
for(var i=1;i<$('.widget-event_ann-4 ul.w-event_ann__list').length;i++)
|
||||
$('.widget-event_ann-4 ul.w-event_ann__list').eq(0).find('>li').eq(-1).after($('.widget-event_ann-4 ul.w-event_ann__list').eq(i).html());
|
||||
var ullength = $('.widget-event_ann-4 ul.w-event_ann__list').length;
|
||||
for(var i = 1;i < ullength;i++)
|
||||
$('.widget-event_ann-4 ul.w-event_ann__list').eq(-1).remove();
|
||||
};
|
||||
function reorganize(num){
|
||||
combineul();
|
||||
for(var i=1;i< Math.ceil(lilength/num);i++){
|
||||
$('.widget-event_ann-4 ul.w-event_ann__list').eq(-1).after('<ul class="w-event_ann__list row" data-level="0" data-list="event_ann"></ul>')
|
||||
var lihtml="";
|
||||
if(i != (Math.ceil(lilength/num)-1)){
|
||||
for(var j=0;j<num;j++)
|
||||
lihtml += "<li class='w-event_ann__item col-md-4'>"+$('.widget-event_ann-4 li.w-event_ann__item').eq(i*num+j).html()+"</li>"
|
||||
}else{
|
||||
for(var j=0;j< lilength - num *(Math.ceil(lilength/num)-1) ;j++)
|
||||
lihtml += "<li class='w-event_ann__item col-md-4'>"+$('.widget-event_ann-4 li.w-event_ann__item').eq(i*num+j).html()+"</li>"
|
||||
};
|
||||
$('.widget-event_ann-4 ul.w-event_ann__list').eq(-1).html(lihtml);
|
||||
};
|
||||
if(Math.ceil(lilength/num) != 1 )
|
||||
for(var i=0;i< lilength -num ; i++ )
|
||||
$('.widget-event_ann-4 ul.w-event_ann__list').eq(0).find("li.w-event_ann__item").eq(num).remove();
|
||||
$('.widget-event_ann-4 ul.w-event_ann__list >li').css('width','calc('+100/num+'% - '+20/16+'em)'); //20px=>li的margin
|
||||
};
|
||||
$(document).ready(function(){
|
||||
if($(window).width()>1024){
|
||||
reorganize(3);
|
||||
num=3;
|
||||
}else if($(window).width()>576){
|
||||
reorganize(2);
|
||||
num=2;
|
||||
}else{
|
||||
reorganize(1);
|
||||
num=1;
|
||||
}
|
||||
});
|
||||
$(window).resize(function(){
|
||||
if($(window).width()>1024){
|
||||
reorganize(3);
|
||||
num=3;
|
||||
}else if($(window).width()>576){
|
||||
reorganize(2);
|
||||
num=2;
|
||||
}else{
|
||||
reorganize(1);
|
||||
num=1;
|
||||
}
|
||||
})
|
||||
</script>
|
|
@ -0,0 +1,31 @@
|
|||
<div class="w-event_ann widget-event_ann-5">
|
||||
<h3 class="w-event_ann__widget-title">
|
||||
<span>{{widget-title}}</span>
|
||||
</h3>
|
||||
<ul class="w-event_ann__list row" data-level="0" data-list="event_ann">
|
||||
<li class="w-event_ann__item">
|
||||
<div class="w-event_ann__content-wrap">
|
||||
<div class="w-event_ann__meta">
|
||||
<span class="w-event_ann__postdate-wrap" date-format="%Y-%m-%d">
|
||||
<i class="fa fa-calendar-o"></i>
|
||||
<span class="w-event_ann__postdate">{{postdate}}</span>
|
||||
</span>
|
||||
<span class="w-event_ann__category-wrap">
|
||||
<i class="fa fa-tasks"></i>
|
||||
<span class="w-event_ann__category">{{category}}</span>
|
||||
</span>
|
||||
<span class="w-event_ann__status-wrap" data-list="statuses" data-level="1">
|
||||
<span class="w-event_ann__status label status {{status-class}}">{{status}}</span>
|
||||
</span>
|
||||
</div>
|
||||
<h4 class="w-event_ann__entry-title">
|
||||
<a class="w-event_ann__title" href="{{link_to_show}}">{{title}}</a>
|
||||
</h4>
|
||||
<p class="w-event_ann__subtitle">{{subtitle}}</p>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="w-event_ann__more-wrap clearfix">
|
||||
<a class="w-event_ann__more btn btn-primary pull-right" href="{{more_url}}"><%= (I18n.locale.to_s =="zh_tw") ? "更多最新消息" : "More NEWS" %></a>
|
||||
</div>
|
||||
</div>
|
|
@ -0,0 +1,26 @@
|
|||
<div class="w-event_ann widget-event_ann-6">
|
||||
<h3 class="w-event_ann__widget-title">
|
||||
<span>{{widget-title}}</span>
|
||||
</h3>
|
||||
<ul class="w-event_ann__list" data-level="0" data-list="event_ann">
|
||||
<li class="w-event_ann__item row">
|
||||
<span class="w-event_ann__category-wrap col-sm-2">
|
||||
<i class="fa fa-tasks"></i>
|
||||
<span class="w-event_ann__category">{{category}}</span>
|
||||
</span>
|
||||
<h4 class="w-event_ann__entry-title col-sm-8">
|
||||
<span class="w-event_ann__status-wrap" data-list="statuses" data-level="1">
|
||||
<span class="w-event_ann__status label status {{status-class}}">{{status}}</span>
|
||||
</span>
|
||||
<a class="w-event_ann__title" href="{{link_to_show}}">{{title}}</a>
|
||||
</h4>
|
||||
<span class="w-event_ann__postdate-wrap col-sm-2" date-format="%Y-%m-%d">
|
||||
<i class="fa fa-calendar-o"></i>
|
||||
<span class="w-event_ann__postdate">{{postdate}}</span>
|
||||
</span>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="w-event_ann__more-wrap clearfix">
|
||||
<a class="w-event_ann__more btn btn-primary pull-right" href="{{more_url}}"><%= (I18n.locale.to_s =="zh_tw") ? "更多最新消息" : "More NEWS" %></a>
|
||||
</div>
|
||||
</div>
|
|
@ -0,0 +1,26 @@
|
|||
<div class="w-event_ann widget-event_ann-7">
|
||||
<h3 class="w-event_ann__widget-title">
|
||||
<span>{{widget-title}}</span>
|
||||
</h3>
|
||||
<ul class="w-event_ann__list" data-level="0" data-list="event_ann">
|
||||
<li class="w-event_ann__item row">
|
||||
<span class="w-event_ann__postdate-wrap col-sm-2" date-format="%Y-%m-%d">
|
||||
<i class="fa fa-calendar-o"></i>
|
||||
<span class="w-event_ann__postdate">{{postdate}}</span>
|
||||
</span>
|
||||
<h4 class="w-event_ann__entry-title col-sm-8">
|
||||
<span class="w-event_ann__status-wrap" data-list="statuses" data-level="1">
|
||||
<span class="w-event_ann__status label status {{status-class}}">{{status}}</span>
|
||||
</span>
|
||||
<a class="w-event_ann__title" href="{{link_to_show}}">{{title}}</a>
|
||||
</h4>
|
||||
<span class="w-event_ann__category-wrap col-sm-2">
|
||||
<i class="fa fa-tasks"></i>
|
||||
<span class="w-event_ann__category">{{category}}</span>
|
||||
</span>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="w-event_ann__more-wrap clearfix">
|
||||
<a class="w-event_ann__more btn btn-primary pull-right" href="{{more_url}}"><%= (I18n.locale.to_s =="zh_tw") ? "更多最新消息" : "More NEWS" %></a>
|
||||
</div>
|
||||
</div>
|
|
@ -0,0 +1,29 @@
|
|||
<div class="w-event_ann widget-event_ann-8">
|
||||
<h3 class="w-event_ann__widget-title">
|
||||
<span>{{widget-title}}</span>
|
||||
</h3>
|
||||
<table class="w-event_ann__table table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="w-event_ann__th w-event_ann__th--category">{{category-head}}</th>
|
||||
<th class="w-event_ann__th w-event_ann__th--title">{{title-head}}</th>
|
||||
<th class="w-event_ann__th w-event_ann__th--date">{{date-head}}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody data-level="0" data-list="event_ann">
|
||||
<tr>
|
||||
<td class="w-event_ann__category">{{category}}</td>
|
||||
<td class="w-event_ann_content">
|
||||
<span class="w-event_ann__status-wrap" data-list="statuses" data-level="1">
|
||||
<span class="w-event_ann__status label status {{status-class}}">{{status}}</span>
|
||||
</span>
|
||||
<a class="w-event_ann__title" href="{{link_to_show}}">{{title}}</a>
|
||||
</td>
|
||||
<td class="w-event_ann__postdate" date-format="%Y-%m-%d">{{postdate}}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="w-event_ann__more-wrap clearfix">
|
||||
<a class="w-event_ann__more btn btn-primary pull-right" href="{{more_url}}"><%= (I18n.locale.to_s =="zh_tw") ? "更多最新消息" : "More NEWS" %></a>
|
||||
</div>
|
||||
</div>
|
|
@ -0,0 +1,29 @@
|
|||
<div class="w-event_ann widget-event_ann-9">
|
||||
<h3 class="w-event_ann__widget-title">
|
||||
<span>{{widget-title}}</span>
|
||||
</h3>
|
||||
<table class="w-event_ann__table table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="w-event_ann__th w-event_ann__th--date">{{date-head}}</th>
|
||||
<th class="w-event_ann__th w-event_ann__th--title">{{title-head}}</th>
|
||||
<th class="w-event_ann__th w-event_ann__th--category">{{category-head}}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody data-level="0" data-list="event_ann">
|
||||
<tr>
|
||||
<td class="w-event_ann__postdate" date-format="%Y-%m-%d">{{postdate}}</td>
|
||||
<td class="w-event_ann_content">
|
||||
<span class="w-event_ann__status-wrap" data-list="statuses" data-level="1">
|
||||
<span class="w-event_ann__status label status {{status-class}}">{{status}}</span>
|
||||
</span>
|
||||
<a class="w-event_ann__title" href="{{link_to_show}}">{{title}}</a>
|
||||
</td>
|
||||
<td class="w-event_ann__category">{{category}}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="w-event_ann__more-wrap clearfix">
|
||||
<a class="w-event_ann__more btn btn-primary pull-right" href="{{more_url}}"><%= (I18n.locale.to_s =="zh_tw") ? "更多最新消息" : "More NEWS" %></a>
|
||||
</div>
|
||||
</div>
|
|
@ -0,0 +1,34 @@
|
|||
<div class="w-event_ann widget-event_ann-3">
|
||||
<h3 class="w-event_ann__widget-title">
|
||||
<span>{{widget-title}}</span>
|
||||
</h3>
|
||||
<ul class="w-event_ann__list" data-level="0" data-list="event_ann">
|
||||
<li class="w-event_ann__item row">
|
||||
<div class="w-event_ann__content-wrap col-sm-8">
|
||||
<div class="w-event_ann__meta">
|
||||
<span class="w-event_ann__status-wrap" data-list="statuses" data-level="1">
|
||||
<span class="w-event_ann__status label status {{status-class}}">{{status}}</span>
|
||||
</span>
|
||||
<span class="w-event_ann__postdate-wrap" date-format="%Y-%m-%d">
|
||||
<i class="fa fa-calendar-o"></i>
|
||||
<span class="w-event_ann__postdate">{{postdate}}</span>
|
||||
</span>
|
||||
<span class="w-event_ann__category-wrap">
|
||||
<i class="fa fa-tasks"></i>
|
||||
<span class="w-event_ann__category">{{category}}</span>
|
||||
</span>
|
||||
</div>
|
||||
<h4 class="w-event_ann__entry-title">
|
||||
<a class="w-event_ann__title" href="{{link_to_show}}">{{title}}</a>
|
||||
</h4>
|
||||
<p class="w-event_ann__subtitle">{{subtitle}}</p>
|
||||
</div>
|
||||
<div class="w-event_ann__img-wrap col-sm-4 bullseye">
|
||||
<img class="w-event_ann__img" src="{{img_src}}" alt="{{img_description}}" title="{{img_description}}">
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="w-event_ann__more-wrap clearfix">
|
||||
<a class="w-event_ann__more btn btn-primary pull-right" href="{{more_url}}"><%= (I18n.locale.to_s =="zh_tw") ? "更多最新消息" : "More NEWS" %></a>
|
||||
</div>
|
||||
</div>
|
|
@ -0,0 +1,25 @@
|
|||
<div class="i-event_ann index-event_ann-1 {{display}}">
|
||||
<h1 class="i-event_ann__page-title">{{page-title}}</h1>
|
||||
<table class="i-event_ann__table table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="i-event_ann__th i-event_ann__th--category">{{category-head}}</th>
|
||||
<th class="i-event_ann__th i-event_ann__th--title">{{title-head}}</th>
|
||||
<th class="i-event_ann__th i-event_ann__th--date">{{date-head}}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody data-level="0" data-list="event_ann">
|
||||
<tr>
|
||||
<td class="i-event_ann__category">{{category}}</td>
|
||||
<td class="i-event_ann__content">
|
||||
<span class="i-event_ann__status-wrap" data-list="statuses" data-level="1">
|
||||
<span class="i-event_ann__status label status {{status-class}}">{{status}}</span>
|
||||
</span>
|
||||
<a class="i-event_ann__title" href="{{link_to_show}}">{{title}}</a>
|
||||
</td>
|
||||
<td class="i-event_ann__postdate"><span class="i-event_ann__postdate-content" date-format="%Y-%m-%d">{{postdate}}</span></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{{pagination_goes_here}}
|
|
@ -0,0 +1,22 @@
|
|||
<div class="i-event_ann index-event_ann-10">
|
||||
<h1 class="i-event_ann__page-title">{{page-title}}</h1>
|
||||
<ul class="i-event_ann__list" data-level="0" data-list="event_ann">
|
||||
<li class="i-event_ann__item row">
|
||||
<span class="i-event_ann__postdate-wrap col-sm-2" date-format="%Y-%m-%d">
|
||||
<i class="fa fa-calendar-o"></i>
|
||||
<span class="i-event_ann__postdate">{{postdate}}</span>
|
||||
</span>
|
||||
<h4 class="i-event_ann__entry-title col-sm-8">
|
||||
<span class="i-event_ann__status-wrap" data-list="statuses" data-level="1">
|
||||
<span class="i-event_ann__status label status {{status-class}}">{{status}}</span>
|
||||
</span>
|
||||
<a class="i-event_ann__title" href="{{link_to_show}}">{{title}}</a>
|
||||
</h4>
|
||||
<span class="i-event_ann__category-wrap col-sm-2">
|
||||
<i class="fa fa-tasks"></i>
|
||||
<span class="i-event_ann__category">{{category}}</span>
|
||||
</span>
|
||||
</li>
|
||||
</ul>>
|
||||
</div>
|
||||
{{pagination_goes_here}}
|
|
@ -0,0 +1,18 @@
|
|||
<div class="i-event_annindex-eevent_ann1">
|
||||
<h1 class="i-event_ann_page-title">{{page-title}}</h1>
|
||||
<ul class="i-event_ann_list" data-level="0" data-list="eevent_ann
|
||||
<li class="i-event_ann_item row">
|
||||
<h4 class="i-event_ann_entry-title col-sm-9">
|
||||
<span class="i-event_ann_status-wrap" data-list="statuses" data-level="1">
|
||||
<span class="i-event_ann_status label status {{status-class}}">{{status}}</span>
|
||||
</span>
|
||||
<a class="i-event_ann_title" href="{{link_to_show}}">{{title}}</a>
|
||||
</h4>
|
||||
<span class="i-event_ann_postdate-wrap col-sm-3" date-format="%Y-%m-%d">
|
||||
<i class="fa fa-calendar-o"></i>
|
||||
<span class="i-event_ann_postdate">{{postdate}}</span>
|
||||
</span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
{{pagination_goes_here}}
|
|
@ -0,0 +1,18 @@
|
|||
<div class="i-event_ann index-event_ann-12">
|
||||
<h1 class="i-event_ann__page-title">{{page-title}}</h1>
|
||||
<ul class="i-event_ann__list" data-level="0" data-list="event_ann">
|
||||
<li class="i-event_ann__item row">
|
||||
<span class="i-event_ann__postdate-wrap col-sm-3" date-format="%Y-%m-%d">
|
||||
<i class="fa fa-calendar-o"></i>
|
||||
<span class="i-event_ann__postdate">{{postdate}}</span>
|
||||
</span>
|
||||
<h4 class="i-event_ann__entry-title col-sm-9">
|
||||
<span class="i-event_ann__status-wrap" data-list="statuses" data-level="1">
|
||||
<span class="i-event_ann__status label status {{status-class}}">{{status}}</span>
|
||||
</span>
|
||||
<a class="i-event_ann__title" href="{{link_to_show}}">{{title}}</a>
|
||||
</h4>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
{{pagination_goes_here}}
|
|
@ -0,0 +1,23 @@
|
|||
<div class="i-event_ann index-event_ann-13 {{display}}">
|
||||
<h1 class="i-event_ann__page-title">{{page-title}}</h1>
|
||||
<table class="i-event_ann__table table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="i-event_ann__th i-event_ann__th--title">{{title-head}}</th>
|
||||
<th class="i-event_ann__th i-event_ann__th--date">{{date-head}}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody data-level="0" data-list="event_ann">
|
||||
<tr>
|
||||
<td class="i-event_ann__content">
|
||||
<span class="i-event_ann__status-wrap" data-list="statuses" data-level="1">
|
||||
<span class="i-event_ann__status label status {{status-class}}">{{status}}</span>
|
||||
</span>
|
||||
<a class="i-event_ann__title" href="{{link_to_show}}">{{title}}</a>
|
||||
</td>
|
||||
<td class="i-event_ann__postdate" date-format="%Y-%m-%d">{{postdate}}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{{pagination_goes_here}}
|
|
@ -0,0 +1,23 @@
|
|||
<div class="i-event_ann index-event_ann-14 {{display}}">
|
||||
<h1 class="i-event_ann__page-title">{{page-title}}</h1>
|
||||
<table class="i-event_ann__table table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="i-event_ann__th i-event_ann__th--date">{{date-head}}</th>
|
||||
<th class="i-event_ann__th i-event_ann__th--title">{{title-head}}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody data-level="0" data-list="event_ann">
|
||||
<tr>
|
||||
<td class="i-event_ann__postdate" date-format="%Y-%m-%d">{{postdate}}</td>
|
||||
<td class="i-event_ann__content">
|
||||
<span class="i-event_ann__status-wrap" data-list="statuses" data-level="1">
|
||||
<span class="i-event_ann__status label status {{status-class}}">{{status}}</span>
|
||||
</span>
|
||||
<a class="i-event_ann__title" href="{{link_to_show}}">{{title}}</a>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{{pagination_goes_here}}
|
|
@ -0,0 +1,25 @@
|
|||
<div class="i-event_ann index-event_ann-15 {{display}}">
|
||||
<h1 class="i-event_ann__page-title">{{page-title}}</h1>
|
||||
<table class="i-event_ann__table table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="i-event_ann__th i-event_ann__th--date">{{date-head}}</th>
|
||||
<th class="i-event_ann__th i-event_ann__th--title">{{title-head}}</th>
|
||||
<th class="i-event_ann__th i-event_ann__th--category">{{view-count-head}}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody data-level="0" data-list="event_ann">
|
||||
<tr>
|
||||
<td class="i-event_ann__postdate" date-format="%Y-%m-%d">{{postdate}}</td>
|
||||
<td class="i-event_ann__content">
|
||||
<span class="i-event_ann__status-wrap" data-list="statuses" data-level="1">
|
||||
<span class="i-event_ann__status label status {{status-class}}">{{status}}</span>
|
||||
</span>
|
||||
<a class="i-event_ann__title" href="{{link_to_show}}">{{title}}</a>
|
||||
</td>
|
||||
<td class="i-event_ann__view-count">{{view_count}}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{{pagination_goes_here}}
|
|
@ -0,0 +1,39 @@
|
|||
<div class="i-event_ann index-event_ann-16 {{display}}">
|
||||
<h1 class="i-event_ann__page-title">{{page-title}}</h1>
|
||||
<table class="i-event_ann__table table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="i-event_ann__th i-event_ann__th--date">{{date-head}}</th>
|
||||
<th class="i-event_ann__th i-event_ann__th--title">{{title-head}}</th>
|
||||
<th class="i-event_ann__th i-event_ann__th--title">{{link-head}}</th>
|
||||
<th class="i-event_ann__th i-event_ann__th--title">{{file-head}}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody data-level="0" data-list="event_ann">
|
||||
<tr>
|
||||
<td class="i-event_ann__postdate" date-format="%Y-%m-%d">{{postdate}}</td>
|
||||
<td class="i-event_ann__content">
|
||||
<span class="i-event_ann__status-wrap" data-list="statuses" data-level="1">
|
||||
<span class="i-event_ann__status label status {{status-class}}">{{status}}</span>
|
||||
</span>
|
||||
<a class="i-event_ann__title" href="{{link_to_show}}">{{title}}</a>
|
||||
</td>
|
||||
<td class="i-event_ann__links">
|
||||
<ul data-list="bulletin_event_links" data-level="1">
|
||||
<li>
|
||||
<a class="i-event_ann__title" href="{{link_url}}">{{link_title}}</a>
|
||||
</li>
|
||||
</ul>
|
||||
</td>
|
||||
<td class="i-event_ann__files">
|
||||
<ul data-list="bulletin_event_files" data-level="1">
|
||||
<li>
|
||||
<a class="i-event_ann__title" href="{{file_url}}">{{file_title}}</a>
|
||||
</li>
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{{pagination_goes_here}}
|
|
@ -0,0 +1,27 @@
|
|||
<div class="i-event_ann index-event_ann-1 {{display}}">
|
||||
<h1 class="i-event_ann__page-title">{{page-title}}</h1>
|
||||
<table class="i-event_ann__table table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="i-event_ann__th i-event_ann__th--category">{{category-head}}</th>
|
||||
<th class="i-event_ann__th i-event_ann__th--title">{{title-head}}</th>
|
||||
<th class="i-event_ann__th i-event_ann__th--date">{{date-head}}</th>
|
||||
<th class="i-event_ann__th i-event_ann__th--department">{{department-head}}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody data-level="0" data-list="event_ann">
|
||||
<tr>
|
||||
<td class="i-event_ann__category">{{category}}</td>
|
||||
<td class="i-event_ann__content">
|
||||
<span class="i-event_ann__status-wrap" data-list="statuses" data-level="1">
|
||||
<span class="i-event_ann__status label status {{status-class}}">{{status}}</span>
|
||||
</span>
|
||||
<a class="i-event_ann__title" href="{{link_to_show}}">{{title}}</a>
|
||||
</td>
|
||||
<td class="i-event_ann__postdate"><span class="i-event_ann__postdate-content" date-format="%Y-%m-%d">{{postdate}}</span></td>
|
||||
<td class="i-event_ann__department"><span class="i-event_ann__department-content">{{department}}</span></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{{pagination_goes_here}}
|
|
@ -0,0 +1,27 @@
|
|||
<div class="i-event_ann index-event_ann-2 {{display}}">
|
||||
<h1 class="i-event_ann__page-title">{{page-title}}</h1>
|
||||
<table class="i-event_ann__table table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="i-event_ann__th i-event_ann__th--category">{{category-head}}</th>
|
||||
<th class="i-event_ann__th i-event_ann__th--title">{{title-head}}</th>
|
||||
<th class="i-event_ann__th i-event_ann__th--date">{{date-head}}</th>
|
||||
<th class="i-event_ann__th i-event_ann__th--category">{{view-count-head}}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody data-level="0" data-list="event_ann">
|
||||
<tr>
|
||||
<td class="i-event_ann__category">{{category}}</td>
|
||||
<td class="i-event_ann__content">
|
||||
<span class="i-event_ann__status-wrap" data-list="statuses" data-level="1">
|
||||
<span class="i-event_ann__status label status {{status-class}}">{{status}}</span>
|
||||
</span>
|
||||
<a class="i-event_ann__title" href="{{link_to_show}}">{{title}}</a>
|
||||
</td>
|
||||
<td class="i-event_ann__postdate"><span class="i-event_ann__postdate-content" date-format="%Y-%m-%d">{{postdate}}</span></td>
|
||||
<td class="i-event_ann__view-count">{{view_count}}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{{pagination_goes_here}}
|
|
@ -0,0 +1,25 @@
|
|||
<div class="i-event_ann index-event_ann-3 {{display}}">
|
||||
<h1 class="i-event_ann__page-title">{{page-title}}</h1>
|
||||
<table class="i-event_ann__table table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="i-event_ann__th i-event_ann__th--date">{{date-head}}</th>
|
||||
<th class="i-event_ann__th i-event_ann__th--title">{{title-head}}</th>
|
||||
<th class="i-event_ann__th i-event_ann__th--category">{{category-head}}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody data-level="0" data-list="event_ann">
|
||||
<tr>
|
||||
<td class="i-event_ann__postdate"><span class="i-event_ann__postdate-content" date-format="%Y-%m-%d">{{postdate}}</span></td>
|
||||
<td class="i-event_ann__content">
|
||||
<span class="i-event_ann__status-wrap" data-list="statuses" data-level="1">
|
||||
<span class="i-event_ann__status label status {{status-class}}">{{status}}</span>
|
||||
</span>
|
||||
<a class="i-event_ann__title" href="{{link_to_show}}">{{title}}</a>
|
||||
</td>
|
||||
<td class="i-event_ann__category">{{category}}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{{pagination_goes_here}}
|
|
@ -0,0 +1,27 @@
|
|||
<div class="i-event_ann index-event_ann-4 {{display}}">
|
||||
<h1 class="i-event_ann__page-title">{{page-title}}</h1>
|
||||
<table class="i-event_ann__table table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="i-event_ann__th i-event_ann__th--date">{{date-head}}</th>
|
||||
<th class="i-event_ann__th i-event_ann__th--title">{{title-head}}</th>
|
||||
<th class="i-event_ann__th i-event_ann__th--category">{{category-head}}</th>
|
||||
<th class="i-event_ann__th i-event_ann__th--category">{{view-count-head}}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody data-level="0" data-list="event_ann">
|
||||
<tr>
|
||||
<td class="i-event_ann__postdate"><span class="i-event_ann__postdate-content" date-format="%Y-%m-%d">{{postdate}}</span></td>
|
||||
<td class="i-event_ann__content">
|
||||
<span class="i-event_ann__status-wrap" data-list="statuses" data-level="1">
|
||||
<span class="i-event_ann__status label status {{status-class}}">{{status}}</span>
|
||||
</span>
|
||||
<a class="i-event_ann__title" href="{{link_to_show}}">{{title}}</a>
|
||||
</td>
|
||||
<td class="i-event_ann__category">{{category}}</td>
|
||||
<td class="i-event_ann__view-count">{{view_count}}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{{pagination_goes_here}}
|
|
@ -0,0 +1,30 @@
|
|||
<div class="i-event_ann index-event_ann-5">
|
||||
<h1 class="i-event_ann__page-title">{{page-title}}</h1>
|
||||
<ul class="i-event_ann__list" data-level="0" data-list="event_ann">
|
||||
<li class="i-event_ann__item row">
|
||||
<div class="i-event_ann__img-wrap col-sm-4">
|
||||
<img class="i-event_ann__img" src="{{img_src}}" alt="{{img_description}}">
|
||||
</div>
|
||||
<div class="i-event_ann__content-wrap col-sm-8">
|
||||
<div class="i-event_ann__meta">
|
||||
<span class="i-event_ann__status-wrap" data-list="statuses" data-level="1">
|
||||
<span class="i-event_ann__status label status {{status-class}}">{{status}}</span>
|
||||
</span>
|
||||
<span class="i-event_ann__postdate-wrap" date-format="%Y-%m-%d">
|
||||
<i class="fa fa-calendar-o"></i>
|
||||
<span class="i-event_ann__postdate">{{postdate}}</span>
|
||||
</span>
|
||||
<span class="i-event_ann__category-wrap">
|
||||
<i class="fa fa-tasks"></i>
|
||||
<span class="i-event_ann__category">{{category}}</span>
|
||||
</span>
|
||||
</div>
|
||||
<h4 class="i-event_ann__entry-title">
|
||||
<a class="i-event_ann__title" href="{{link_to_show}}">{{title}}</a>
|
||||
</h4>
|
||||
<p class="i-event_ann__subtitle">{{subtitle}}</p>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
{{pagination_goes_here}}
|
|
@ -0,0 +1,30 @@
|
|||
<div class="i-event_ann index-event_ann-6">
|
||||
<h1 class="i-event_ann__page-title">{{page-title}}</h1>
|
||||
<ul class="i-event_ann__list" data-level="0" data-list="event_ann">
|
||||
<li class="i-event_ann__item row">
|
||||
<div class="i-event_ann__content-wrap col-sm-8">
|
||||
<div class="i-event_ann__meta">
|
||||
<span class="i-event_ann__status-wrap" data-list="statuses" data-level="1">
|
||||
<span class="i-event_ann__status label status {{status-class}}">{{status}}</span>
|
||||
</span>
|
||||
<span class="i-event_ann__postdate-wrap" date-format="%Y-%m-%d">
|
||||
<i class="fa fa-calendar-o"></i>
|
||||
<span class="i-event_ann__postdate">{{postdate}}</span>
|
||||
</span>
|
||||
<span class="i-event_ann__category-wrap">
|
||||
<i class="fa fa-tasks"></i>
|
||||
<span class="i-event_ann__category">{{category}}</span>
|
||||
</span>
|
||||
</div>
|
||||
<h4 class="i-event_ann__entry-title">
|
||||
<a class="i-event_ann__title" href="{{link_to_show}}">{{title}}</a>
|
||||
</h4>
|
||||
<p class="i-event_ann__subtitle">{{subtitle}}</p>
|
||||
</div>
|
||||
<div class="i-event_ann__img-wrap col-sm-4">
|
||||
<img class="i-event_ann__img" src="{{img_src}}" alt="{{img_description}}">
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
{{pagination_goes_here}}
|
|
@ -0,0 +1,83 @@
|
|||
<div class="i-event_ann index-event_ann-7">
|
||||
<h3 class="i-event_ann__page-title">{{page-title}}</h3>
|
||||
<ul class="i-event_ann__list row" data-level="0" data-list="event_ann">
|
||||
<li class="i-event_ann__item col-md-4">
|
||||
<div class="i-event_ann__img-wrap bullseye">
|
||||
<img class="i-event_ann__img" src="{{img_src}}" alt="{{img_description}}" title="{{img_description}}">
|
||||
</div>
|
||||
<div class="i-event_ann__content-wrap">
|
||||
<div class="i-event_ann__meta">
|
||||
<span class="i-event_ann__status-wrap" data-list="statuses" data-level="1">
|
||||
<span class="i-event_ann__status label {{status-class}}">{{status}}</span>
|
||||
</span>
|
||||
<span class="i-event_ann__postdate-wrap" date-format="%Y-%m-%d">
|
||||
<i class="fa fa-calendar-o"></i>
|
||||
<span class="i-event_ann__postdate">{{postdate}}</span>
|
||||
</span>
|
||||
<span class="i-event_ann__category-wrap">
|
||||
<i class="fa fa-tasks"></i>
|
||||
<span class="i-event_ann__category">{{category}}</span>
|
||||
</span>
|
||||
</div>
|
||||
<h4 class="i-event_ann__entry-title">
|
||||
<a class="i-event_ann__title" href="{{link_to_show}}">{{title}}</a>
|
||||
</h4>
|
||||
<p class="i-event_ann__subtitle">{{subtitle}}</p>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
{{pagination_goes_here}}
|
||||
<script>
|
||||
var lilength = $('.i-event_ann.index-event_ann-7 li.i-event_ann__item').length;
|
||||
function combineul(){
|
||||
for(var i=1;i<$('.i-event_ann.index-event_ann-7 ul.i-event_ann__list').length;i++)
|
||||
$('.i-event_ann.index-event_ann-7 ul.i-event_ann__list').eq(0).find('>li').eq(-1).after($('.i-event_ann.index-event_ann-7 ul.i-event_ann__list').eq(i).html());
|
||||
var ullength = $('.i-event_ann.index-event_ann-7 ul.i-event_ann__list').length;
|
||||
for(var i = 1;i < ullength;i++)
|
||||
$('.i-event_ann.index-event_ann-7 ul.i-event_ann__list').eq(-1).remove();
|
||||
};
|
||||
function reorganize(num){
|
||||
combineul();
|
||||
for(var i=1;i< Math.ceil(lilength/num);i++){
|
||||
$('.i-event_ann.index-event_ann-7 ul.i-event_ann__list').eq(-1).after('<ul class="i-event_ann__list row" data-level="0" data-list="event_ann"></ul>')
|
||||
var lihtml="";
|
||||
if(i != (Math.ceil(lilength/num)-1)){
|
||||
for(var j=0;j<num;j++)
|
||||
lihtml += "<li class='i-event_ann__item col-md-4'>"+$('.i-event_ann.index-event_ann-7 li.i-event_ann__item').eq(i*num+j).html()+"</li>"
|
||||
}else{
|
||||
for(var j=0;j< lilength - num *(Math.ceil(lilength/num)-1) ;j++)
|
||||
lihtml += "<li class='i-event_ann__item col-md-4'>"+$('.i-event_ann.index-event_ann-7 li.i-event_ann__item').eq(i*num+j).html()+"</li>"
|
||||
};
|
||||
$('.i-event_ann.index-event_ann-7 ul.i-event_ann__list').eq(-1).html(lihtml);
|
||||
};
|
||||
if(Math.ceil(lilength/num) != 1 )
|
||||
for(var i=0;i< lilength -num ; i++ )
|
||||
$('.i-event_ann.index-event_ann-7 ul.i-event_ann__list').eq(0).find("li.i-event_ann__item").eq(num).remove();
|
||||
$('.i-event_ann.index-event_ann-7 ul.i-event_ann__list >li').css('width','calc('+100/num+'% - '+20/16+'em)'); //20px=>li的margin
|
||||
};
|
||||
$(document).ready(function(){
|
||||
if($(window).width()>1024){
|
||||
reorganize(3);
|
||||
num=3;
|
||||
}else if($(window).width()>576){
|
||||
reorganize(2);
|
||||
num=2;
|
||||
}else{
|
||||
reorganize(1);
|
||||
num=1;
|
||||
}
|
||||
});
|
||||
$(window).resize(function(){
|
||||
if($(window).width()>1024){
|
||||
reorganize(3);
|
||||
num=3;
|
||||
}else if($(window).width()>576){
|
||||
reorganize(2);
|
||||
num=2;
|
||||
}else{
|
||||
reorganize(1);
|
||||
num=1;
|
||||
}
|
||||
})
|
||||
</script>
|
|
@ -0,0 +1,26 @@
|
|||
<div class="i-event_ann index-event_ann-8">
|
||||
<h1 class="i-event_ann__page-title">{{page-title}}</h1>
|
||||
<ul class="i-event_ann__list row" data-level="0" data-list="event_ann">
|
||||
<li class="i-event_ann__item">
|
||||
<div class="i-event_ann__content-wrap">
|
||||
<div class="i-event_ann__meta">
|
||||
<span class="i-event_ann__postdate-wrap" date-format="%Y-%m-%d">
|
||||
<i class="fa fa-calendar-o"></i>
|
||||
<span class="i-event_ann__postdate">{{postdate}}</span>
|
||||
</span>
|
||||
<span class="i-event_ann__category-wrap">
|
||||
<i class="fa fa-tasks"></i>
|
||||
<span class="i-event_ann__category">{{category}}</span>
|
||||
</span>
|
||||
<span class="i-event_ann__status-wrap" data-list="statuses" data-level="1">
|
||||
<span class="i-event_ann__status label status {{status-class}}">{{status}}</span>
|
||||
</span>
|
||||
</div>
|
||||
<h4 class="i-event_ann__entry-title">
|
||||
<a class="i-event_ann__title" href="{{link_to_show}}">{{title}}</a>
|
||||
</h4>
|
||||
<p class="i-event_ann__subtitle">{{subtitle}}</p>
|
||||
</div>
|
||||
</li>
|
||||
</div>
|
||||
{{pagination_goes_here}}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue