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