Merge branch 'development' of gitlab.tp.rulingcom.com:saurabh/orbit4-5 into nccu

This commit is contained in:
Harry Bomrah 2015-01-07 16:13:19 +08:00
commit ceb110e030
82 changed files with 808 additions and 489 deletions

View File

@ -34,7 +34,7 @@ gem 'mongoid', github: "mongoid/mongoid"
gem "mini_magick", "3.5.0" gem "mini_magick", "3.5.0"
gem 'carrierwave' gem 'carrierwave'
gem 'carrierwave-mongoid', :require => 'carrierwave/mongoid' gem 'carrierwave-mongoid', :require => 'carrierwave/mongoid'
gem 'zip-zip'
gem 'kaminari' gem 'kaminari'
gem "impressionist" gem "impressionist"
gem "chartkick" gem "chartkick"

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

View File

@ -1,8 +1,16 @@
(function($) { (function($) {
$("document").ready(function(){ $("document").ready(function(){
// Get link data-attribute and make the banner clickable // Get link data-attribute and make the banner clickable
$('.w-ad-banner__slide').not('[data-link=""]').not(".youtube").addClass('cursor').on("click",function(){ $('.w-ad-banner__slide')
window.open($(this).data("link"),"_blank"); .not('[data-link=""]')
.not(".youtube")
.addClass('cursor')
.on("click",function(){
if( $(this).data('target') === '_blank' ) {
window.open($(this).data("link"), "_blank");
} else {
window.location.href = ($(this).data("link"));
}
}) })
}) })
}(jQuery)); }(jQuery));

View File

@ -25,6 +25,9 @@ var FormValidator = function(form){
nospace : function(value){ nospace : function(value){
return (/\s/.test(value) ? false : true); return (/\s/.test(value) ? false : true);
}, },
lowercase : function(value){
return (value == value.toLowerCase() ? true : false);
},
email : function(value){ email : function(value){
var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
return re.test(value); return re.test(value);
@ -40,35 +43,39 @@ var FormValidator = function(form){
var _attachSubmitHandler = function(){ var _attachSubmitHandler = function(){
fv.form.on("submit",function(){ fv.form.on("submit",function(){
failed_elements = []; return fv.isFormValidated();
$.each(elements_data,function(key,element){ })
var validators = element.validators, }
messages = element.messages,
el = fv.form.find("#" + key); this.isFormValidated = function(){
for(i = 0; i < validators.length; i++){ failed_elements = [];
var error_span = (fv.form.find("div[for=" + key + "]").length ? $("div[for=" + key + "]") : $("<div class='validator_error_class text-error' for='" + key + "'></div>")); $.each(elements_data,function(key,element){
if(typeof fv.validate_functions[validators[i]] == "function"){ var validators = element.validators,
if(!fv.validate_functions[validators[i]](el.val(),el)){ messages = element.messages,
error_span.text(messages[i]); el = fv.form.find("#" + key);
el.after(error_span); for(i = 0; i < validators.length; i++){
failed_elements.push(el); var error_span = (fv.form.find("div[for=" + key + "]").length ? $("div[for=" + key + "]") : $("<div class='validator_error_class text-error' for='" + key + "'></div>"));
break; if(typeof fv.validate_functions[validators[i]] == "function"){
}else{ if(!fv.validate_functions[validators[i]](el.val(),el)){
error_span.remove(); error_span.text(messages[i]);
} el.after(error_span);
failed_elements.push(el);
break;
}else{ }else{
console.info("Not validating for " + validators[i] + ". Skipping."); error_span.remove();
} }
}else{
console.info("Not validating for " + validators[i] + ". Skipping.");
} }
})
if(failed_elements.length){
var offset = failed_elements[0].offset().top - fv.form.offset().top + fv.form.scrollTop();
fv.form.parent().animate({scrollTop:offset-50}, '300', 'swing');
return false;
}else{
return true;
} }
}) })
if(failed_elements.length){
var offset = failed_elements[0].offset().top - fv.form.offset().top + fv.form.scrollTop();
fv.form.parent().animate({scrollTop:offset-50}, '300', 'swing');
return false;
}else{
return true;
}
} }
var _putFieldsValidatorAndMessage = function(){ var _putFieldsValidatorAndMessage = function(){

View File

@ -122,6 +122,20 @@ legend {
text-align: center; text-align: center;
list-style: none; list-style: none;
} }
#sidebar .sidebar-nav .license-denied {
cursor: not-allowed;
}
#sidebar .sidebar-nav .license-denied > span {
position: relative;
width: 60px;
}
#sidebar .sidebar-nav .license-denied > span:before {
position: absolute;
top: 10px;
left: 12px;
font-size: 3.1em;
color: rgba(205, 10, 10, 0.46);
}
#sidebar > h2.position { #sidebar > h2.position {
margin: 0; margin: 0;
width: 61px; width: 61px;
@ -188,6 +202,7 @@ legend {
} }
#sidebar .sidebar-nav > li a { #sidebar .sidebar-nav > li a {
display: block; display: block;
text-decoration: none;
} }
#sidebar .sidebar-nav > li i { #sidebar .sidebar-nav > li i {
font-size: 1.6em; font-size: 1.6em;

View File

@ -318,7 +318,7 @@ $orbit-bar-bgc-lighter: lighten($orbit-bar-bgc, 20%) !default;
display: none; display: none;
top: 0; top: 0;
margin: 0 2em; margin: 0 2em;
padding: 0.3em 0; padding: 0;
color: #FFF; color: #FFF;
font-size: 1.4em; font-size: 1.4em;
text-align: center; text-align: center;
@ -328,6 +328,9 @@ $orbit-bar-bgc-lighter: lighten($orbit-bar-bgc, 20%) !default;
a { a {
color: #FFF; color: #FFF;
} }
.page-main & {
padding: 0.3em 0;
}
} }
.orbit-bar-search-sign-language { .orbit-bar-search-sign-language {
float: right; float: right;
@ -339,6 +342,7 @@ $orbit-bar-bgc-lighter: lighten($orbit-bar-bgc, 20%) !default;
input[type="search"] { input[type="search"] {
color: $orbit-bar-bgc-lighter; color: $orbit-bar-bgc-lighter;
border: none; border: none;
margin-bottom: 0;
border-radius: 1.7em; border-radius: 1.7em;
line-height: 1.3em; line-height: 1.3em;
padding: 0.2em 0.8em; padding: 0.2em 0.8em;

View File

@ -3,7 +3,7 @@ class Admin::ModuleStoreController < OrbitAdminController
def index def index
@extensions = [] @extensions = []
@downloaded_extensions = get_downloaded_extension @downloaded_extensions = []
# if current_site.site_token? # if current_site.site_token?
# if current_site.store_confirmation # if current_site.store_confirmation
# @extensions = get_extensions # @extensions = get_extensions

View File

@ -106,7 +106,9 @@ class Admin::SitesController < OrbitAdminController
else else
result = "success" result = "success"
# Bundler.with_clean_env { `cd #{Rails.root} && bundle update` } # Bundler.with_clean_env { `cd #{Rails.root} && bundle update` }
Bundler.with_clean_env { `cd #{Rails.root} && BUNDLE_GEMFILE=built_in_extensions.rb bundle update && bundle` } Bundler.with_clean_env { `cd #{Rails.root} && BUNDLE_GEMFILE=built_in_extensions.rb bundle update && bundle` }
Bundler.with_clean_env { `cd #{Rails.root} && BUNDLE_GEMFILE=downloaded_extensions.rb bundle update && bundle` }
end end
render :text => result render :text => result
@ -117,6 +119,7 @@ class Admin::SitesController < OrbitAdminController
def bundle_install def bundle_install
Bundler.with_clean_env { `cd #{Rails.root} && BUNDLE_GEMFILE=built_in_extensions.rb bundle update && bundle` } Bundler.with_clean_env { `cd #{Rails.root} && BUNDLE_GEMFILE=built_in_extensions.rb bundle update && bundle` }
Bundler.with_clean_env { `cd #{Rails.root} && BUNDLE_GEMFILE=downloaded_extensions.rb bundle update && bundle` }
%x(kill -s USR2 `cat tmp/pids/unicorn.pid`) %x(kill -s USR2 `cat tmp/pids/unicorn.pid`)
sleep 5 sleep 5
render :nothing => true render :nothing => true

View File

@ -139,29 +139,44 @@ class MembersController < ApplicationController
plugins = OrbitApp::Plugin::Registration.all rescue nil plugins = OrbitApp::Plugin::Registration.all rescue nil
plugin_list = plugins.collect.with_index do |plugin, idx| plugin_list = plugins.collect.with_index do |plugin, idx|
intro = PersonalPluginIntro.find_by(member_profile_id: member.id, _type: "#{plugin.app_name}Intro") rescue nil intro = PersonalPluginIntro.find_by(member_profile_id: member.id, _type: "#{plugin.app_name}Intro") rescue nil
if intro.nil? or intro.complete_list if !intro.blank?
plugin_data = plugin.app_name.constantize.where(member_profile_id: member) rescue nil if !intro.complete_list.blank?
pd = plugin_data.collect do |p| plugin_data = plugin.app_name.constantize.where(member_profile_id: member) rescue nil
slug_title = ["JournalPaper","WritingConference"].include?(plugin.app_name) ? p.create_link : p.slug_title pd = plugin_data.collect do |p|
{ slug_title = ["JournalPaper","WritingConference"].include?(plugin.app_name) ? p.create_link : p.slug_title
"data_title" => slug_title, {
"link_to_show" => OrbitHelper.url_to_plugin_show(p.to_param,plugin.module_app_name.underscore) "data_title" => slug_title,
} "link_to_show" => OrbitHelper.url_to_plugin_show(p.to_param,plugin.module_app_name.underscore)
}
end
end end
elsif intro.brief_intro == true
pd = []
pd << {"data_title" => intro.text.html_safe}
end
{ if !intro.brief_intro.blank?
pdi = []
pdi << {"data_intro_title" => intro.text.html_safe}
end
if intro.complete_list.blank?
complete_display = "hide"
end
if intro.brief_intro.blank?
brief_display = "hide"
end
end
{
"plugin_data" => pd, "plugin_data" => pd,
"plugin_data_intro" => pdi,
"complete_display" => complete_display,
"brief_display" => brief_display,
"plugin_name" => plugin.module_app_name.underscore, "plugin_name" => plugin.module_app_name.underscore,
"plugin_title" => t('module_name.'+plugin.module_app_name.underscore), "plugin_title" => t('module_name.'+plugin.module_app_name.underscore),
"plugin_class" => idx==0 ? "active" : "" "plugin_class" => idx==0 ? "active" : ""
} }
end end
plugin_list = plugin_list.reject{|plugin| plugin['plugin_data'].blank?}
plugin_list = plugin_list.reject{|plugin| plugin['plugin_data'].blank? and plugin['plugin_data_intro'].blank?}
{ {
"plugins" => plugin_list, "plugins" => plugin_list,
"profile_data" => profile_data, "profile_data" => profile_data,
@ -175,7 +190,6 @@ class MembersController < ApplicationController
def member_data(member, fields_to_show) def member_data(member, fields_to_show)
profile_data = [] profile_data = []
fields_to_show.each do |field| fields_to_show.each do |field|
# debugger
case field['type'] case field['type']
when 'profile' when 'profile'
field_data = member.get_attribute_data(field) rescue {} field_data = member.get_attribute_data(field) rescue {}

View File

@ -11,7 +11,7 @@ class PagesController < ApplicationController
before_filter :set_edit_mode before_filter :set_edit_mode
def index def index
@pages = Page.all @pages = Page.all
# render json: @pages # render json: @pages
end end
@ -76,10 +76,14 @@ class PagesController < ApplicationController
params[:url] = page.url params[:url] = page.url
categories = [] categories = []
if page.module == "member" if page.module == "member"
page.categories.each do |c| if page.categories.first == "all"
category = Role.find(c) rescue nil categories = ["all"]
if !category.nil? && !category.disabled else
categories << c page.categories.each do |c|
category = Role.find(c) rescue nil
if !category.nil? && !category.disabled
categories << c
end
end end
end end
else else
@ -89,8 +93,8 @@ class PagesController < ApplicationController
categories << c categories << c
end end
end end
categories = ["all"] if categories.blank?
end end
categories = ["all"] if categories.blank?
@manifest = @key @manifest = @key
OrbitHelper.set_params params,current_user OrbitHelper.set_params params,current_user
OrbitHelper.set_site_locale locale OrbitHelper.set_site_locale locale
@ -186,30 +190,38 @@ class PagesController < ApplicationController
"id" => cat.id.to_s "id" => cat.id.to_s
} }
end end
tags = module_app.tags.collect do |t|
{
"name" => t.name,
"id" => t.id.to_s
}
end
else else
categories = [] categories = []
tags = []
end end
end end
roles = roles.nil? ? [] : roles roles = roles.nil? ? [] : roles
categories = categories.nil? ? [] : categories categories = categories.nil? ? [] : categories
tags = tags.nil? ? [] : tags
if module_app.data_count.nil? if module_app.data_count.nil?
render :json => {"categories" => categories, "tags" => module_app.tags,"roles" => roles,"layouts" => (get_layouts module_app.key),"data_count" => {"present"=>false}, "locale" => I18n.locale.to_s}.to_json render :json => {"categories" => categories, "tags" => tags,"roles" => roles,"layouts" => (get_layouts module_app.key),"data_count" => {"present"=>false}, "locale" => I18n.locale.to_s}.to_json
else else
render :json => {"categories" => categories, "tags" => module_app.tags,"roles" => roles,"layouts" => (get_layouts module_app.key),"data_count" => {"present"=>true,"start"=>module_app.data_count.begin, "end" => module_app.data_count.end}, "locale" => I18n.locale.to_s}.to_json render :json => {"categories" => categories, "tags" => tags,"roles" => roles,"layouts" => (get_layouts module_app.key),"data_count" => {"present"=>true,"start"=>module_app.data_count.begin, "end" => module_app.data_count.end}, "locale" => I18n.locale.to_s}.to_json
end end
end end
def new def new
@page = Page.new( @page = Page.new(
:enabled_for_mobile=>true, :enabled_for_mobile=>true,
:menu_enabled_for=>["en", "zh_tw"], :menu_enabled_for=>["en", "zh_tw"],
:enabled_for=>["en", "zh_tw"], :enabled_for=>["en", "zh_tw"],
:enabled_for_sitemap=>["en", "zh_tw"] :enabled_for_sitemap=>["en", "zh_tw"]
) )
@pages = Page.where(:page_id.ne => "" , :page_id.exists => true) @pages = Page.where(:page_id.ne => "" , :page_id.exists => true)
@modules = ModuleApp.all.frontend_enabled.order_by(:key=>'asc') @modules = ModuleApp.all.frontend_enabled.order_by(:key=>'asc')
end end
@ -260,7 +272,7 @@ class PagesController < ApplicationController
end end
end end
private private
def get_layouts(module_app) def get_layouts(module_app)
layout_types = [] layout_types = []
@ -432,6 +444,7 @@ class PagesController < ApplicationController
p = params.require(:page).permit(:number, :page_type, :page_id, :module, :layout, :parent_page, :data_count, :enabled_for_mobile, :member_sort_position, enabled_for_sitemap: [], enabled_for: [],menu_enabled_for: [], categories: [], tags: [], role_status: [], name_translations: valid_locales, external_url_translations: valid_locales) p = params.require(:page).permit(:number, :page_type, :page_id, :module, :layout, :parent_page, :data_count, :enabled_for_mobile, :member_sort_position, enabled_for_sitemap: [], enabled_for: [],menu_enabled_for: [], categories: [], tags: [], role_status: [], name_translations: valid_locales, external_url_translations: valid_locales)
p["role_status"] = p["role_status"] || [] p["role_status"] = p["role_status"] || []
p["categories"] = p["categories"] || [] p["categories"] = p["categories"] || []
p["tags"] = p["tags"] || []
p["enabled_for"] = p["enabled_for"] || [] p["enabled_for"] = p["enabled_for"] || []
p["menu_enabled_for"] = p["menu_enabled_for"] || [] p["menu_enabled_for"] = p["menu_enabled_for"] || []
p["enabled_for_sitemap"] = p["enabled_for_sitemap"] || [] p["enabled_for_sitemap"] = p["enabled_for_sitemap"] || []

View File

@ -1,3 +1,6 @@
require "net/http"
require 'open-uri'
require 'zip/zip'
class StoreApiController < ApplicationController class StoreApiController < ApplicationController
def confirmation def confirmation
site_token = params[:site_token] site_token = params[:site_token]
@ -11,4 +14,80 @@ class StoreApiController < ApplicationController
render :json => {"success" => false}.to_json render :json => {"success" => false}.to_json
end end
end end
def install_module
if current_site.store_token.nil?
response = {"success" => false}
elsif current_site.store_token == params[:site_token]
file = File.join(Rails.root,"downloaded_extensions.rb")
g = "gem '#{params[:module_key]}', git: '#{params[:git_path]}'"
File.open(file,"a+") { |f| f.puts(g) }
if !directory_exists?(File.join(Rails.root,"app","templates","#{Site.first.template}","modules","#{params[:module_key]}"))
download_template(params[:template],params[:template_filename])
end
response = {"success" => true}
else
response = {"success" => false}
end
render :json => response.to_json
if response["success"]
bundle_install
# give_permissions(params[:module_key])
end
end
def uninstall_module
file = File.join(Rails.root,"downloaded_extensions.rb")
data = File.read(file)
g = "gem '#{params[:module_key]}', git: '#{params[:git_path]}'\n"
data = data.gsub(g,"")
File.write(file,data)
bundle_install
render :json => {"success" => true}.to_json
end
def render_license_denied
render :layout => "back_end"
end
private
def bundle_install
Bundler.with_clean_env { `cd #{Rails.root} && BUNDLE_GEMFILE=downloaded_extensions.rb bundle update && bundle` }
%x(kill -s USR2 `cat tmp/pids/unicorn.pid`)
sleep 5
end
def restart_server_after_install
%x(kill -s USR2 `cat tmp/pids/unicorn.pid`)
sleep 5
end
def download_template(url,name)
dir = File.join(Rails.root,"public","template_cache")
destination = File.join(Rails.root,"app","templates","#{Site.first.template}","modules")
if !directory_exists?(dir)
Dir.mkdir dir
end
zipfile = File.join(Rails.root, "public" , "template_cache", name)
open(zipfile, 'wb') do |fo|
fo.print open(url).read
end
unzip_file(zipfile,destination)
end
def directory_exists?(directory)
File.directory?(directory)
end
def unzip_file (file, destination)
Zip::ZipFile.open(file) { |zip_file|
zip_file.each { |f|
f_path=File.join(destination, f.name)
FileUtils.mkdir_p(File.dirname(f_path))
zip_file.extract(f, f_path) unless File.exist?(f_path)
}
}
FileUtils.rm_rf(File.join(Rails.root,"public","template_cache"))
end
end end

View File

@ -64,6 +64,8 @@ module ApplicationHelper
end end
site_footer = site_footer.nil? ? "" : site_footer site_footer = site_footer.nil? ? "" : site_footer
html = html.gsub("{{footer-data}}",site_footer) html = html.gsub("{{footer-data}}",site_footer)
counter = Page.root.view_count.to_s rescue ""
html = html.gsub("{{site-counter}}",counter)
html.html_safe html.html_safe
end end

View File

@ -172,8 +172,15 @@ module OrbitBackendHelper
http = Net::HTTP.new(uri.host,uri.port) http = Net::HTTP.new(uri.host,uri.port)
request = Net::HTTP::Get.new("/site/permissions") request = Net::HTTP::Get.new("/site/permissions")
request.body = params_to_send.to_query request.body = params_to_send.to_query
response = http.request(request) response = http.request(request) rescue nil
data = JSON.parse(response.body) if response.nil?
data = {}
data["message"] = "Could not connect to the store."
data["error"] = "CONNECTION_REFUSED"
data["success"] = false
else
data = JSON.parse(response.body)
end
if !data["success"] if !data["success"]
case data["error"] case data["error"]
when "INVALID_SITE_TOKEN" when "INVALID_SITE_TOKEN"

View File

@ -14,6 +14,7 @@ class ModuleApp
field :widget_methods field :widget_methods
field :desktop_enabled, type: Boolean, default: false field :desktop_enabled, type: Boolean, default: false
field :widget_settings field :widget_settings
field :store_permission_granted, type: Boolean, default: false
has_many :categories, dependent: :destroy, :autosave => true has_many :categories, dependent: :destroy, :autosave => true
has_and_belongs_to_many :tags, dependent: :destroy, :autosave => true has_and_belongs_to_many :tags, dependent: :destroy, :autosave => true

View File

@ -1,3 +1,4 @@
class OrbitStore class OrbitStore
URL = "http://store.tp.rulingcom.com" URL = "http://store.tp.rulingcom.com"
MODULE_EXCEPTIONS = ["category","tag","authorization"]
end end

View File

@ -1,110 +1,106 @@
(function($) { (function($) {
"use strict" "use strict"
// Init functions
function init () { function init () {
// Announcement modules var doc = document;
var annc = {
truncation : function (el, maxLength) { var orbit = {
// Cross browser add class function
addClass : function(el, className) {
if( el.classList ) {
el.classList.add(className);
} else {
el.className += ' ' + className;
}
},
// Cross browser has class function
hasClass : function(el, cls) {
return (' ' + el.className + ' ').indexOf(' ' + cls + ' ') > -1;
},
// Add class name to the menu item when its children items are more than eight
addMegaDropdownClass : function(el, len) {
for( var i = 0; i < el.length; i++ ) {
if( el[i].children.length > len ) {
orbit.addClass(el[i].parentNode, 'mega-dropdown');
}
}
},
// Append caret to menu item if it has dropdown
addCaret : function() {
var list = doc.querySelectorAll('.page_menu.level_2');
for( var i = 0, len = list.length; i < len; i++ ) {
var node = doc.createElement('span');
node.className = 'caret';
list[i].parentNode.appendChild(node);
}
},
// Add link and cursor class name on element that has data-link attribute
addLinkOnADBanner : function(els) {
$.each(els, function(i) {
if ($(this).data('link') !== "" && !$(this).hasClass('youtube')) {
$(this).on('click', function() {
var target = $(this).data('target'),
link = $(this).data('link');
if (target === '_blank') {
window.open(link, target);
} else {
window.location.href = link;
}
}).addClass('cursor');
}
});
},
// Announcement text truncation
truncation : function (el, len) {
for( var i = 0; i < el.length; i ++ ) { for( var i = 0; i < el.length; i ++ ) {
if ( el[i].firstChild !== null ) { if ( el[i].firstChild !== null ) {
if( el[i].firstChild.length > maxLength ) { if( el[i].firstChild.length > len ) {
var newTitle = el[i].firstChild.nodeValue; var newStr = el[i].firstChild.nodeValue,
var newTitle = newTitle.substring(0, maxLength) + '...' newStr = newStr.substring(0, len) + '...'
el el
.eq(i) .eq(i)
.text(newTitle); .text(newStr);
} }
} }
} }
} },
} // Sitemenu dropdown
sitemenuDropdown : function() {
var el = doc.querySelectorAll('.sitemenu__list.level-2');
for( var i = 0, len = el.length; i < len; i++ ) {
if( el[i].hasChildNodes() ) {
var caret = doc.createElement('span');
caret.className = 'sitemenu___dropdown-toggle fa fa-caret-down';
caret.setAttribute('data-toggle', 'dropdown');
function anncFix() { el[i].parentNode.insertBefore(caret, el[i]);
var w$ = $('.w-announcement-4'); orbit.addClass(el[i], 'dropdown-menu');
if( w$.length ) {
annc.truncation(w$.find('.w-annc__subtitle'), 25);
}
}
// Necessary for Responsive images
function bullEye() {
// $(".bullseye").bullseye({
// fadeEffect: false
// });
}
// Adding class to submenu that has dropdown items
function submenuFix () {
var item$ = $('.submenu__item.level-1');
var itemLen = item$.length;
var list$ = item$.find('.submenu__list.level-2');
for( var i=0; i<itemLen; i++ ) {
if( list$.eq(i).find('li').length ) {
list$
.eq(i)
.addClass('dropdown');
}
}
}
// Main navigation dropdown
function dropdown () {
var navItemLevel1$ = $('.main-nav-item.level-1');
var dropdownMenu$ = $('.dropdown-menu.level-2');
// Adding class if nav item has dropdown
$(navItemLevel1$)
.has('.dropdown-menu')
.children('a')
.addClass('has-dropdown-menu');
// Hide all dropdowns when click on any HTML elements
$(document).on('click', function() {
$('.dropdown-menu.level-2')
.addClass('hide')
.removeClass('show');
})
// Hide all dropdown after page load
dropdownMenu$
.addClass('hide')
.removeClass('show');
$('.has-dropdown-menu').on('click', function () {
if( $(this).hasClass('has-dropdown-menu') ) {
if( $(this).next('.dropdown-menu').hasClass('show') ) {
dropdownMenu$.addClass('hide');
$(this)
.next('.dropdown-menu')
.removeClass('show')
.addClass('hide')
} else if ( $(this).next('.dropdown-menu').hasClass('hide') ) {
dropdownMenu$.addClass('hide');
dropdownMenu$.removeClass('show');
dropdownMenu$.addClass('hide');
$(this)
.next('.dropdown-menu')
.removeClass('hide')
.addClass('show')
} }
} }
}
return false;
})
} }
// Targeting internal page var plugin = {
if( $('body').attr('class') !== 'page-main' ) { // RWD image resize script
submenuFix(); bullEye : function() {
} $(".bullseye").bullseye({
dropdown(); fadeEffect: false
bullEye(); });
}
}
// Specific functions that will be running on homepage
if( doc.body.getAttribute('data-module') === 'home' ) {
}
// Functions that will be running on every page
orbit.sitemenuDropdown();
plugin.bullEye();
} }
$(document).ready(function($) { $(document).ready(function($) {
init(); init();
}); });

View File

@ -1,8 +0,0 @@
.admin-edit {
clear: both;
}
img {
max-width: 100%;
height: auto;
}

View File

@ -0,0 +1,26 @@
html {
font-size: 100%;
}
body {
font-family: $sub-font;
margin-top: 40px; // needed for Orbit bar
font-size: inherit;
}
a {}
a:hover, a:focus {
text-decoration: none;
}
a:focus {}
img {
max-width: 100%;
height: auto;
}
.admin-edit {
clear: both;
}

View File

@ -1,5 +1,8 @@
@charset "utf-8"; @charset "utf-8";
// Google fonts
@import url(http://fonts.googleapis.com/css?family=Roboto);
// Base Color // Base Color
$theme-gray: #495054; $theme-gray: #495054;
$theme-gray-light: #cecece; $theme-gray-light: #cecece;
@ -16,8 +19,8 @@ $theme-color-third: #ed4c43;
// Font stacks // Font stacks
$main-font: Arial, "微軟正黑體", "Helvetica Neue", Helvetica, sans-serif; $main-font: 'Roboto', "微軟正黑體", "Helvetica Neue", Helvetica, sans-serif;
$sub-font: Arial, "新細明體", "Helvetica Neue", Helvetica, sans-serif; $sub-font: 'Roboto', "新細明體", "Helvetica Neue", Helvetica, sans-serif;
// //

View File

@ -61,7 +61,7 @@
} }
// Widget-1 // Widget-1
.w-announcement-1 { .widget-announcement-1 {
.w-annc__img-wrap { .w-annc__img-wrap {
height: 200px; height: 200px;
margin: 0 0 1em 0; margin: 0 0 1em 0;
@ -74,7 +74,7 @@
} }
// Widget-2 // Widget-2
.w-announcement-2 { .widget-announcement-2 {
.w-annc__img-wrap { .w-annc__img-wrap {
height: 200px; height: 200px;
margin: 0 0 1em 0; margin: 0 0 1em 0;
@ -87,7 +87,7 @@
} }
// Widget-3 // Widget-3
.w-announcement-3 { .widget-announcement-3 {
.w-annc__img-wrap { .w-annc__img-wrap {
height: 200px; height: 200px;
margin: 0 0 1em 0; margin: 0 0 1em 0;
@ -100,7 +100,7 @@
} }
// Widget-4 // Widget-4
.w-announcement-4 { .widget-announcement-4 {
.w-annc__title { .w-annc__title {
font-family: $main-font; font-family: $main-font;
line-height: 1.3; line-height: 1.3;
@ -116,7 +116,7 @@
} }
// Widget-5 // Widget-5
.w-announcement-5 { .widget-announcement-5 {
.w-annc__title { .w-annc__title {
font-family: $main-font; font-family: $main-font;
line-height: 1.3; line-height: 1.3;
@ -130,7 +130,7 @@
} }
// Widget-6 // Widget-6
.w-announcement-6 { .widget-announcement-6 {
.w-annc__item { .w-annc__item {
margin-bottom: 0.8em; margin-bottom: 0.8em;
padding-bottom: 0.8em; padding-bottom: 0.8em;
@ -151,7 +151,7 @@
} }
// Widget-7 // Widget-7
.w-announcement-7 { .widget-announcement-7 {
.w-annc__item { .w-annc__item {
margin-bottom: 0.8em; margin-bottom: 0.8em;
padding-bottom: 0.8em; padding-bottom: 0.8em;
@ -173,7 +173,7 @@
// Widget-8 // Widget-8
// ## Table // ## Table
.w-announcement-8 { .widget-announcement-8 {
.w-annc__th { .w-annc__th {
color: #fff; color: #fff;
background: $theme-color-main; background: $theme-color-main;
@ -194,7 +194,7 @@
// Widget-9 // Widget-9
// ## Table // ## Table
.w-announcement-9 { .widget-announcement-9 {
.w-annc__th { .w-annc__th {
color: #fff; color: #fff;
background: $theme-color-main; background: $theme-color-main;
@ -214,7 +214,7 @@
} }
// Widget-10 // Widget-10
.w-announcement-10 { .widget-announcement-10 {
.w-annc__item { .w-annc__item {
margin-bottom: 0.8em; margin-bottom: 0.8em;
padding-bottom: 0.8em; padding-bottom: 0.8em;
@ -234,7 +234,7 @@
// Widget-11 // Widget-11
// ## Table // ## Table
.w-announcement-11 { .widget-announcement-11 {
.w-annc__th { .w-annc__th {
color: #fff; color: #fff;
background: $theme-color-main; background: $theme-color-main;
@ -254,7 +254,7 @@
} }
// Widget-12 // Widget-12
.w-announcement-12 { .widget-announcement-12 {
.w-annc__list { .w-annc__list {
padding: 0 15px; padding: 0 15px;
} }
@ -348,7 +348,7 @@
} }
// Index-1 // Index-1
.i-announcement-1 { .index-announcement-1 {
.i-annc__th { .i-annc__th {
color: #fff; color: #fff;
background: $theme-color-main; background: $theme-color-main;
@ -407,18 +407,7 @@
} }
.s-annc__tag-wrap { .s-annc__tag-wrap {
.s-annc__tag { .s-annc__tag {
display: inline-block; font-weight: normal;
margin-bottom: 4px;
padding: 5px 8px;
font-size: 0.8em;
color: $theme-gray;
border: 1px solid $theme-gray-light;
text-decoration: none;
&:hover {
color: $theme-color-main;
border-color: $theme-color-main;
background-color: $theme-gray-lighter;
}
} }
} }
} }
@ -430,6 +419,9 @@
padding-top: 1em; padding-top: 1em;
border-top: 1px dotted $theme-gray-light; border-top: 1px dotted $theme-gray-light;
} }
.s-annc__related-file {
margin-bottom: 15px;
}
.s-annc__related-file, .s-annc__related-file,
.s-annc__related-link { .s-annc__related-link {
padding-bottom: 6px; padding-bottom: 6px;
@ -440,22 +432,17 @@
color: darken($theme-gray-light, 10%); color: darken($theme-gray-light, 10%);
} }
a { a {
display: inline-block;
margin-bottom: 4px;
padding: 5px 8px;
font-size: 0.8em;
color: $theme-gray;
border: 1px solid $theme-gray-light;
text-decoration: none;
&:hover {
color: $theme-color-main;
border-color: $theme-color-main;
background-color: $theme-gray-lighter;
}
} }
} }
.s-annc__related-link-list, .s-annc__related-link-list,
.s-annc__related-file-list { .s-annc__related-file-list {
display: inline-block; display: inline-block;
} }
.s-annc__flie-title {
max-width: 9.375rem;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
} }

View File

@ -1,99 +1,64 @@
// Member INDEX // Member index page
.index-member { .index-member {
.index-title { .index-title {
@extend .unity-title; @extend .unity-title;
} }
&.index1 { th,
td {
font-size: 0.8125rem;
font-family: $main-font;
}
th[class^="member-data-title"] {
white-space: nowrap;
}
.index-member-item {
min-height: 200px;
margin-bottom: 20px;
}
.index-member-item:nth-child(2n+1) {
clear: both;
}
.member-data-title-job-title:before,
.member-data-title-name:before,
.member-data-title-email:before,
.member-data-title-office-tel:before{
content: "\f007";
font-family: "fontAwesome";
display: inline-block;
margin-right: 0.3125rem;
color: gray;
min-width: 15px;
font-size: 0.75rem;
}
.member-data-title-job-title:before {
content: "\f19d";
}
.member-data-title-email:before {
content: "\f0e0";
}
.member-data-title-office-tel:before{
content: "\f098";
}
.member-profile-data-wrap {
overflow: hidden;
}
.member-pic {
border-radius: 0.25rem;
} }
} }
// Member SHOW // Member show page
.show-member { .show-member {
.show-title { font-family: $main-font;
@extend .unity-title; th,
td {
font-size: 0.8125rem;
} }
.post-metadata { .member-plugins {
border-bottom: 1px solid $theme-gray-light; margin-bottom: 20px;
@include clearfix(); a {
li { font-size: 0.8125rem;
margin-right: 1em;
margin-bottom: 0.6em;
float: left;
&.metadata-tags {
position: relative;
margin-right: 0;
padding-left: 1.6em;
clear: both;
float: none;
i {
position: absolute;
top: 7px;
left: 0;
}
}
&.metadata-tags {
.tag {
display: inline-block;
margin-bottom: 4px;
padding: 5px 8px;
font-size: 0.8em;
color: $theme-gray;
border: 1px solid $theme-gray-light;
text-decoration: none;
&:hover {
color: $theme-color-main;
border-color: $theme-color-main;
background-color: $theme-gray-lighter;
}
}
}
i {
color: darken($theme-gray-light, 10%);
}
}
}
.post-section {
@include clearfix();
margin-bottom: 2em;
.post-pic {
img {
@include size(100%, auto);
}
}
}
.post-related {
padding-top: 1em;
border-top: 1px solid $theme-gray-light;
li {
padding-bottom: 3px;
padding-left: 1.6em;
& + li {
padding-top: 8px;
border-top: 1px dotted $theme-gray-light;
}
i {
margin: 8px 0 0 -1.6em;
float: left;
color: darken($theme-gray-light, 10%);
}
& > div {
display: inline-block;
}
a {
display: inline-block;
margin-bottom: 4px;
padding: 5px 8px;
font-size: 0.8em;
color: $theme-gray;
border: 1px solid $theme-gray-light;
text-decoration: none;
&:hover {
color: $theme-color-main;
border-color: $theme-color-main;
background-color: $theme-gray-lighter;
}
}
} }
} }
} }

View File

@ -1,5 +1,4 @@
// Base // Base
@import url("http://fonts.googleapis.com/css?family=Droid+Sans:400,700");
@import "bootstrap/mixins"; @import "bootstrap/mixins";
@import "bootstrap/variables"; @import "bootstrap/variables";
@import "base/mixins"; @import "base/mixins";
@ -7,7 +6,7 @@
@import "base/unity"; @import "base/unity";
@import "base/pagination"; @import "base/pagination";
@import "base/orbitbar-override"; @import "base/orbitbar-override";
@import "base/genernal"; @import "base/global";
// Layout // Layout
@import "layout/header"; @import "layout/header";
@ -29,11 +28,3 @@
// Widget // Widget
@import "widget/breadcrumb"; @import "widget/breadcrumb";
@import "widget/sitemenu"; @import "widget/sitemenu";
html {
font-size: 100%;
}
body {
margin-top: 40px; // needed for Orbit bar
font-size: inherit;
}

View File

@ -1,86 +1,52 @@
.submenu-wrap { .sitemenu-wrap {
@include clearfix();
padding: 10px 0; padding: 10px 0;
@include clearfix;
.submenu__title { .sitemenu__title {
display: none; display: none;
} }
.sitemenu__list {
.submenu__list {
list-style: none;
padding: 0;
margin: 0; margin: 0;
padding: 0;
list-style: none;
} }
.sitemenu__item.level-1 {
.submenu__item.level-1 { font-size: 0.8125rem;
position: relative; position: relative;
float: left; float: left;
margin-right: 1%; margin-right: 1%;
margin-bottom: 12px; margin-bottom: 12px;
} padding: 8px .8em;
.submenu__link.level-1 {
float: left;
padding-bottom: 8px; padding-bottom: 8px;
font-size: 13px;
font-size: 0.8125rem;
background: $theme-color-second;
color: #fff; color: #fff;
padding: 8px 0.8em; border-radius: .2em;
border-radius: 0.2em; background: $theme-color-second;
&:hover { &:hover {
background: darken($theme-color-second, 10%); background: darken($theme-color-second, 10%);
} }
} }
.sitemenu__link.level-1 {
.submenu__item:hover .dropdown { margin-right: .25rem;
display: block;
}
.touch .submenu__item .dropdown {
display: none !important;
}
// Submenu dropdown
.submenu__list.dropdown {
display: none;
padding: 20px 0 0 0;
position: absolute;
left: 0;
top: 80%;
border-radius: 2px;
z-index: 200;
}
.submenu__list .dropdown:before {
content: "";
border-style: solid;
border-width: 0px 7px 7px 7px;
border-color: transparent transparent $theme-color-main transparent;
position: absolute;
top: 15px;
left: 15px;
}
.submenu__item.level-2 {
display: block;
padding: 4px 8px;
background: $theme-color-main;
font-size: 0.8125rem;
}
.submenu__link.level-2 {
color: #fff; color: #fff;
white-space: nowrap;
} }
.sitemenu___dropdown-toggle {
.submenu__list.hidden--item { font-size: 0.75rem;
display: none; padding: 2px .3125rem;
cursor: pointer;
&:before { }
display: none; // sitemenu dropdown
.sitemenu__list.dropdown-menu {
min-width: 100%;
margin-top: 4px;
border: none;
border-radius: .2em;
background: $theme-color-main;
}
.sitemenu__link.level-2 {
color: #fff;
font-size: 0.8125rem;
padding: 4px 0.625rem;
&:hover {
background: lighten($theme-color-second, 5%);
} }
} }
} }

View File

@ -1,5 +1,6 @@
<footer class="layout-footer"> <footer class="layout-footer">
<div class="container layout-footer-inner"> <div class="container layout-footer-inner">
<div class="layout-footer-content">{{footer-data}}</div> <div class="layout-footer-content">{{footer-data}}</div>
<div>{{site-counter}}</div>
</div> </div>
</footer> </footer>

View File

@ -3,7 +3,7 @@
<head> <head>
<%= render_partial("head") %> <%= render_partial("head") %>
</head> </head>
<body class="page-main"> <body class="page-home">
<%= render_orbit_bar %> <%= render_orbit_bar %>
<%= render_header %> <%= render_header %>
<section class="layout-slide" data-pp="4"></section> <section class="layout-slide" data-pp="4"></section>

View File

@ -1,3 +1,5 @@
<ul class="pagination" data-pagination="true"> <ul class="pagination pagination-sm" data-pagination="true">
<li class="{{pagination_active}}"><a href="{{pagination_link}}">{{page_number}}</a></li> <li class="{{pagination_active}}">
</ul> <a href="{{pagination_link}}">{{page_number}}</a>
</li>
</ul>

View File

@ -1,4 +1,4 @@
<div class="w-ad-banner ad-banner-widget-1 container"> <div class="w-ad-banner ad-banner-widget-1">
<div class="w-ad-banner__wrap cycle-slideshow" <div class="w-ad-banner__wrap cycle-slideshow"
data-list="images" data-list="images"
data-level="0" data-level="0"
@ -21,3 +21,5 @@
<div class="w-ad-banner__caption"></div> <div class="w-ad-banner__caption"></div>
<ul class="w-ad-banner__pager"></ul> <ul class="w-ad-banner__pager"></ul>
</div> </div>

View File

@ -0,0 +1,18 @@
<div class="w-ad-banner ad-banner-widget-3">
<div class="w-ad-banner__wrap cycle-slideshow"
data-list="images"
data-level="0"
data-cycle-slides=".w-ad-banner__slide"
data-cycle-log="false"
data-overlay=".w-ad-banner__caption"
data-pager=".w-ad-banner__pager"
data-pager-template="<li><a href='#'></a></li>"
data-pager-active-class="active-slide"
data-cycle-youtube=true
data-cycle-youtube-autostart=false
>
{{html}}
</div>
<ul class="w-ad-banner__pager"></ul>
</div>

View File

@ -1,4 +1,4 @@
<div class="w-ad-banner ad-banner-widget-2 container"> <div class="w-ad-banner ad-banner-widget-2">
<div class="w-ad-banner__wrap cycle-slideshow" <div class="w-ad-banner__wrap cycle-slideshow"
data-list="images" data-list="images"
data-level="0" data-level="0"
@ -19,7 +19,6 @@
</div> </div>
<script type="text/javascript"> <script type="text/javascript">
$("document").ready(function(){ $("document").ready(function(){
// total_players = $("*[data-youtube-id]").length
$("*[data-youtube-id]").each(function(){ $("*[data-youtube-id]").each(function(){
var obj = $(this).find("embed"); var obj = $(this).find("embed");
obj.attr("id",$(this).data("youtube-id")); obj.attr("id",$(this).data("youtube-id"));

View File

@ -1,12 +1,19 @@
<div class="w-ad-banner ad-banner-widget-2 container"> <div class="w-ad-banner ad-banner-widget-3">
<div class="w-ad-banner__wrap cycle-slideshow" <div class="w-ad-banner__wrap cycle-slideshow"
data-list="images" data-list="images"
data-level="0" data-level="0"
data-cycle-slides=".w-ad-banner__slide" data-cycle-slides=".w-ad-banner__slide"
data-cycle-log="false" data-cycle-log="false"
data-pager=".w-ad-banner__pager"
data-pager-template="<li><a href='#'></a></li>"
data-pager-active-class="active-slide"
> >
<div class="w-ad-banner__slide {{class}}"> <div class="w-ad-banner__slide {{class}}"
data-link="{{link}}"
>
<img class="w-ad-banner__image" src="{{image_link}}"> <img class="w-ad-banner__image" src="{{image_link}}">
</div> </div>
</div> </div>
</div> <ul class="w-ad-banner__pager"></ul>
</div>

View File

@ -11,8 +11,8 @@
{ {
"filename" : "ad_banner_widget2_video", "filename" : "ad_banner_widget2_video",
"name" : { "name" : {
"zh_tw" : "2. 橫幅輪播 ( 圖片, 導航圖示 )", "zh_tw" : "2. 橫幅輪播 + Youtube影片 ( 圖片, Youtube影片, 導航圖示 )",
"en" : "2. Carousel ( image, navigation, video )" "en" : "2. Carousel ( image, Youtube video, navigation )"
}, },
"thumbnail" : "thumbnail-block.png" "thumbnail" : "thumbnail-block.png"
}, },
@ -20,9 +20,18 @@
"filename" : "ad_banner_widget3", "filename" : "ad_banner_widget3",
"name" : { "name" : {
"zh_tw" : "3. 廣告輪播 ( 圖片 )", "zh_tw" : "3. 廣告輪播 ( 圖片 )",
"en" : "2. AD banner ( image )" "en" : "3. AD banner ( image )"
},
"thumbnail" : "thumbnail-block.png"
},
{
"filename" : "ad_banner_widget4",
"name" : {
"zh_tw" : "4. 廣告輪播 ( 圖片 )",
"en" : "4. AD banner ( image )"
}, },
"thumbnail" : "thumbnail-block.png" "thumbnail" : "thumbnail-block.png"
} }
] ]
} }

View File

@ -1,4 +1,4 @@
<div class="w-annc w-announcement-1"> <div class="w-annc widget-announcement-1">
<h3 class="w-annc__widget-title"> <h3 class="w-annc__widget-title">
<span>{{widget-title}}</span> <span>{{widget-title}}</span>
</h3> </h3>

View File

@ -1,4 +1,4 @@
<div class="w-annc w-announcement-10"> <div class="w-annc widget-announcement-10">
<h3 class="w-annc__widget-title"> <h3 class="w-annc__widget-title">
<span>{{widget-title}}</span> <span>{{widget-title}}</span>
</h3> </h3>

View File

@ -1,4 +1,4 @@
<div class="w-annc w-announcement-11"> <div class="w-annc widget-announcement-11">
<h3 class="w-annc__widget-title"> <h3 class="w-annc__widget-title">
<span>{{widget-title}}</span> <span>{{widget-title}}</span>
</h3> </h3>

View File

@ -1,4 +1,4 @@
<div class="w-annc w-announcement-12"> <div class="w-annc widget-announcement-12">
<h3 class="w-annc__widget-title"> <h3 class="w-annc__widget-title">
<span>{{widget-title}}</span> <span>{{widget-title}}</span>
</h3> </h3>

View File

@ -1,4 +1,4 @@
<div class="w-annc w-announcement-2"> <div class="w-annc widget-announcement-2">
<h3 class="w-annc__widget-title"> <h3 class="w-annc__widget-title">
<span>{{widget-title}}</span> <span>{{widget-title}}</span>
</h3> </h3>

View File

@ -1,4 +1,4 @@
<div class="w-annc w-announcement-3"> <div class="w-annc widget-announcement-3">
<h3 class="w-annc__widget-title"> <h3 class="w-annc__widget-title">
<span>{{widget-title}}</span> <span>{{widget-title}}</span>
</h3> </h3>

View File

@ -1,4 +1,4 @@
<div class="w-annc w-announcement-4"> <div class="w-annc widget-announcement-4">
<h3 class="w-annc__widget-title"> <h3 class="w-annc__widget-title">
<span>{{widget-title}}</span> <span>{{widget-title}}</span>
</h3> </h3>

View File

@ -1,4 +1,4 @@
<div class="w-annc w-announcement-5"> <div class="w-annc widget-announcement-5">
<h3 class="w-annc__widget-title"> <h3 class="w-annc__widget-title">
<span>{{widget-title}}</span> <span>{{widget-title}}</span>
</h3> </h3>

View File

@ -1,4 +1,4 @@
<div class="w-annc w-announcement-6"> <div class="w-annc widget-announcement-6">
<h3 class="w-annc__widget-title"> <h3 class="w-annc__widget-title">
<span>{{widget-title}}</span> <span>{{widget-title}}</span>
</h3> </h3>

View File

@ -1,4 +1,4 @@
<div class="w-annc w-announcement-7"> <div class="w-annc widget-announcement-7">
<h3 class="w-annc__widget-title"> <h3 class="w-annc__widget-title">
<span>{{widget-title}}</span> <span>{{widget-title}}</span>
</h3> </h3>

View File

@ -1,4 +1,4 @@
<div class="w-annc w-announcement-8"> <div class="w-annc widget-announcement-8">
<h3 class="w-annc__widget-title"> <h3 class="w-annc__widget-title">
<span>{{widget-title}}</span> <span>{{widget-title}}</span>
</h3> </h3>

View File

@ -1,4 +1,4 @@
<div class="w-annc w-announcement-9"> <div class="w-annc widget-announcement-9">
<h3 class="w-annc__widget-title"> <h3 class="w-annc__widget-title">
<span>{{widget-title}}</span> <span>{{widget-title}}</span>
</h3> </h3>

View File

@ -1,4 +1,4 @@
<div class="i-annc i-announcement-1"> <div class="i-annc index-announcement-1">
<h3 class="i-annc__page-title">{{page-title}}</h3> <h3 class="i-annc__page-title">{{page-title}}</h3>
<table class="i-annc__table table table-striped"> <table class="i-annc__table table table-striped">
<thead> <thead>

View File

@ -1,4 +1,4 @@
<div class="i-annc i-announcement-2"> <div class="i-annc index-announcement-2">
<h3 class="i-annc__page-title">{{page-title}}</h3> <h3 class="i-annc__page-title">{{page-title}}</h3>
<ul class="i-annc__list" data-level="0" data-list="announcements"> <ul class="i-annc__list" data-level="0" data-list="announcements">
<li class="i-annc__item"> <li class="i-annc__item">

View File

@ -1,5 +1,5 @@
<article class="s-annc s-announcement"> <article class="s-annc show-announcement">
<h1 class="s-annc__show-title">{{title}}</h1> <h3 class="s-annc__show-title">{{title}}</h3>
<ul class="s-annc__meta-wrap list-unstyled"> <ul class="s-annc__meta-wrap list-unstyled">
<li class="s-annc__date-wrap s-annc__meta--item"> <li class="s-annc__date-wrap s-annc__meta--item">
@ -13,7 +13,7 @@
<li class="s-annc__tag-wrap s-annc__meta--item "> <li class="s-annc__tag-wrap s-annc__meta--item ">
<i class="fa fa-tags"></i> <i class="fa fa-tags"></i>
<span data-list="tags" data-level="0"> <span data-list="tags" data-level="0">
<a href="{{url}}"><span class="s-annc__tag">{{tag}}</span></a> <a href="{{url}}"><span class="s-annc__tag label label-default">{{tag}}</span></a>
</span> </span>
</li> </li>
</ul> </ul>
@ -26,14 +26,14 @@
<li class="s-annc__related-file"> <li class="s-annc__related-file">
<i class="fa fa-fw fa-paperclip"></i> <i class="fa fa-fw fa-paperclip"></i>
<div class="s-annc__related-file-list" data-list="bulletin_files" data-level="0"> <div class="s-annc__related-file-list" data-list="bulletin_files" data-level="0">
<a class="s-annc__flie-title" href="{{file_url}}">{{file_title}}</a> <a class="s-annc__flie-title btn btn-default btn-sm" href="{{file_url}}">{{file_title}}</a>
</div> </div>
</li> </li>
<li class="s-annc__related-link"> <li class="s-annc__related-link">
<i class="fa fa-fw fa-link"></i> <i class="fa fa-fw fa-link"></i>
<div class="s-annc__related-link-list" data-list="bulletin_links" data-level="0"> <div class="s-annc__related-link-list" data-list="bulletin_links" data-level="0">
<a href="{{link_url}}" target="_blank">{{link_title}}</a> <a class="s-annc__link-title btn btn-default btn-sm" href="{{link_url}}" target="_blank">{{link_title}}</a>
</div> </div>
</li> </li>
</ul> </ul>
@ -47,26 +47,23 @@
{{link_to_edit}} {{link_to_edit}}
<script> <script>
$(function() { (function($) {
// 當metadata-tags沒內容時將會隱藏 function hideEmptyEl(el, elParent) {
if(!$('.metadata-tags .tag').length) { if( el.length === 0) {
$('.metadata-tags').remove(); elParent.addClass('hide');
}
} }
// 當post-related沒內容時會隱藏 // Hiding parent element when children elements are not present
if($('.post-related').length) { // Tags
var element = ['.post-related-flises-list', '.post-related-links-list'], hideEmptyEl($('.s-annc__tag'), $('.s-annc__tag-wrap'));
n = 0;
$.each(element, function(index, val) { // Attachments
if(!$(val).text()) { hideEmptyEl($('.s-annc__flie-title'), $('.s-annc__related-file'));
$(val).closest('li').remove();
n += 1; // Links
} hideEmptyEl($('.s-annc__link-title'), $('.s-annc__related-link'));
if(n == element.length) {
$('.post-related').remove(); }(jQuery));
}
});
}
});
</script> </script>

View File

@ -1,4 +1,4 @@
<div class="w-archive archive-widget-1" module="archive" data-ps=""> <div class="w-archive widget-archive-1" module="archive" data-ps="">
<h3 class="w-archive__widget-title">{{widget-title}}</h3> <h3 class="w-archive__widget-title">{{widget-title}}</h3>
<ul class="w-archive__list level-1" data-list="categories" data-level="0"> <ul class="w-archive__list level-1" data-list="categories" data-level="0">
<li class="w-archive__item level-1"> <li class="w-archive__item level-1">

View File

@ -1,4 +1,4 @@
<div class="i-archive archive-index-1"> <div class="i-archive index-archive-1">
<h3 class="i-archive__page-title">{{page-title}}</h3> <h3 class="i-archive__page-title">{{page-title}}</h3>
<ul class="i-archive__list" data-list="categories" data-level="0"> <ul class="i-archive__list" data-list="categories" data-level="0">
<li class="i-archive__item"> <li class="i-archive__item">

View File

@ -6,6 +6,7 @@
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
<h4 class="panel-title"> <h4 class="panel-title">
<i class="fa fa-th-list"></i>
<a data-toggle="collapse" data-parent="#index-archive-group" href="#collapse" class="collapsed"> <a data-toggle="collapse" data-parent="#index-archive-group" href="#collapse" class="collapsed">
{{category-title}} {{category-title}}
</a> </a>

View File

@ -1,7 +1,7 @@
<div class="show-archive"> <div class="show-archive">
<h1 class="show-title"> <h3 class="show-title">
<span>{{title}}</span> <span>{{title}}</span>
</h1> </h3>
<div class="show-archive-body"> <div class="show-archive-body">
<dl class="dl-horizontal show-archive-item-group" data-list="archives" data-level="1"> <dl class="dl-horizontal show-archive-item-group" data-list="archives" data-level="1">
<dt class="show-archive-item-list"> <dt class="show-archive-item-list">

View File

@ -1,15 +1,15 @@
<div id="orbit_calendar"> <div id="orbit_calendar">
<div id='sec1' class="cal-fn"> <div id="sec1">
<div class="btn-toolbar" id="navigation"> <div class="btn-toolbar" id="navigation">
<div id="calendar-nav"> <div id="calendar-nav">
<button class="btn" id="today_btn">Today</button>
<div class="btn-group"> <div class="btn-group">
<button class="btn" id="prev_month_btn"> <button class="btn btn-default btn-sm" id="prev_month_btn">
<i class="icon-chevron-left"></i> <i class="icon-chevron-left"></i>
</button> </button>
<button class="btn" id="next_month_btn"> <button class="btn btn-default btn-sm" id="next_month_btn">
<i class="icon-chevron-right"></i> <i class="icon-chevron-right"></i>
</button> </button>
<button class="btn btn-default btn-sm" id="today_btn">Today</button>
</div> </div>
</div> </div>
</div> </div>
@ -17,12 +17,12 @@
</div> </div>
<div id='sec3' class="btn-toolbar"> <div id='sec3' class="btn-toolbar">
<div class="btn-group calendar_mode"> <div class="btn-group calendar_mode">
<button class="btn mode_switch" data-mode="agendaDay" >day</button> <button class="btn btn-default mode_switch btn-sm" data-mode="agendaDay" >day</button>
<button class="btn mode_switch" data-mode="agendaWeek" >week</button> <button class="btn btn-default mode_switch btn-sm" data-mode="agendaWeek" >week</button>
<button class="btn active mode_switch" data-mode="month" >month</button> <button class="btn btn-default active mode_switch btn-sm" data-mode="month" >month</button>
<button class="btn mode_switch" data-mode="agenda" >agenda</button> <button class="btn btn-default mode_switch btn-sm" data-mode="agenda" >agenda</button>
</div> </div>
<button id="refresh_btn" class="btn"> <button id="refresh_btn" class="btn btn-default btn-sm">
<i class="icons-cycle"></i> <i class="icons-cycle"></i>
</button> </button>
</div> </div>
@ -33,7 +33,7 @@
</div> </div>
</div> </div>
<div id="event_quick_view" class="modal" style="width: 300px; display:none; margin:0 0 0 0;"></div> <div id="event_quick_view" class="modal" style="width: 300px; display:none; margin:0 0 0 0;"></div>
<div id="calendar-loading">Loading...</div> <div id="calendar-loading"></div>
<script type="text/javascript"> <script type="text/javascript">
var calendar = new Calendar("#calendar","{{page_id}}"); var calendar = new Calendar("#calendar","{{page_id}}");

View File

@ -1,6 +1,6 @@
<article> <article>
<div class="post-title"> <div class="post-title">
<h1>{{question}}</h1> <h3>{{question}}</h3>
</div> </div>
<span data-list="tags" data-level="0"> <span data-list="tags" data-level="0">

View File

@ -1,4 +1,4 @@
<div class="widget-gallery widget1"> <div class="widget-gallery widget2">
<h3 class="widget-title"> <h3 class="widget-title">
<span>{{widget-title}}</span> <span>{{widget-title}}</span>
</h3> </h3>

View File

@ -1,4 +1,4 @@
<div class="widget-gallery widget2"> <div class="widget-gallery widget3">
<h3 class="widget-title"> <h3 class="widget-title">
<span>{{widget-title}}</span> <span>{{widget-title}}</span>
</h3> </h3>

View File

@ -0,0 +1,46 @@
{
"frontend": [
{
"filename" : "gallery_index1",
"name" : {
"zh_tw" : "1. 相本排版-1",
"en" : "1. Gallery-1"
},
"thumbnail" : "thumbnail-block-list.png"
},
{
"filename" : "gallery_index2",
"name" : {
"zh_tw" : "2. 相本排版-2",
"en" : "2. Gallery-2"
},
"thumbnail" : "thumbnail-block.png"
}
],
"widgets" : [
{
"filename" : "gallery_widget1",
"name" : {
"zh_tw" : "1. 相本排版-1",
"en" : "1. Gallery-1"
},
"thumbnail" : "thumbnail-block.png"
},
{
"filename" : "gallery_widget2",
"name" : {
"zh_tw" : "2. 相本排版-2",
"en" : "2. Gallery-2"
},
"thumbnail" : "thumbnail-block.png"
},
{
"filename" : "gallery_widget3",
"name" : {
"zh_tw" : "3. 相本排版-3",
"en" : "2. Gallery-3"
},
"thumbnail" : "thumbnail-block.png"
}
]
}

View File

@ -1,30 +1,30 @@
<div class="index-member index1"> <div class="index-member index1">
<div class="index-member-group" data-list="roles" data-level="0"> <div class="index-member-group" data-list="roles" data-level="0">
<div class="index-member-group-item"> <div class="index-member-group-item">
<div class="index-member-status" data-level="1" data-list="status-list"> <div class="index-member-status" data-level="1" data-list="status-list">
<h3 class="index-title"> <h3 class="index-title">
<span>{{status-title}}</span> <span>{{status-title}}</span>
</h3> </h3>
<div class="index-member-list row" data-level="2" data-list="members"> <div class="index-member-list row" data-level="2" data-list="members">
<div class="index-member-item clearfix col-sm-6 row" style="font-size: 12px; min-height:180px;"> <div class="index-member-item clearfix col-lg-6 row">
<div class="col-sm-4"> <div class="member-pic-wrap col-xs-4">
<a href="{{link_to_show}}"><img class="member-pic" src="{{image}}" alt="{{name}}" title="{{name}}" width="100%"></a> <a href="{{link_to_show}}">
<img class="member-pic" src="{{image}}" alt="{{name}}" title="{{name}}" width="100%">
</a>
</div> </div>
<div class="col-sm-8"> <div class="member-profile-data-wrap col-xs-8">
<table class="table table-condensed"> <table class="table">
<tbody data-list="profile_data" data-level="3"> <tbody data-list="profile_data" data-level="3">
<tr><th class="{{title_class}}" style="min-width:70px;">{{title}}</th><td class="{{value_class}}">{{value}}</td></tr> <tr>
<th class="{{title_class}}">{{title}}</th>
<td class="{{value_class}}">{{value}}</td>
</tr>
</tbody> </tbody>
</table> </table>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,30 +1,30 @@
<div class="index-member index1"> <div class="index-member index1">
<div class="index-member-group" data-list="roles" data-level="0"> <div class="index-member-group" data-list="roles" data-level="0">
<div class="index-member-group-item"> <div class="index-member-group-item">
<div class="index-member-status" data-level="1" data-list="status-list"> <div class="index-member-status" data-level="1" data-list="status-list">
<h3 class="index-title"> <h3 class="index-title">
<span>{{status-title}}</span> <span>{{status-title}}</span>
</h3> </h3>
<div class="index-member-list row" data-level="2" data-list="members"> <div class="index-member-list row" data-level="2" data-list="members">
<div class="index-member-item clearfix col-sm-6 row" style="font-size: 12px; min-height:180px;"> <div class="index-member-item clearfix col-lg-6 row">
<div class="col-sm-4"> <div class="member-pic-wrap col-xs-4">
<a href="{{link_to_show}}"><img class="member-pic" src="{{image}}" alt="{{name}}" title="{{name}}" width="100%"></a> <a href="{{link_to_show}}">
<img class="member-pic" src="{{image}}" alt="{{name}}" title="{{name}}" width="100%">
</a>
</div> </div>
<div class="col-sm-8"> <div class="member-profile-data-wrap col-xs-8">
<table class="table table-condensed"> <table class="table">
<tbody data-list="profile_data" data-level="3"> <tbody data-list="profile_data" data-level="3">
<tr><th class="{{title_class}}" style="min-width:70px;">{{title}}</th><td class="{{value_class}}">{{value}}</td></tr> <tr>
<th class="{{title_class}}">{{title}}</th>
<td class="{{value_class}}">{{value}}</td>
</tr>
</tbody> </tbody>
</table> </table>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -6,22 +6,25 @@
<span>{{status-title}}</span> <span>{{status-title}}</span>
</h3> </h3>
<div class="index-member-list row" data-level="2" data-list="members"> <div class="index-member-list row" data-level="2" data-list="members">
<div class="index-member-item clearfix col-sm-6 row" style="font-size: 12px; min-height:180px;"> <div class="index-member-item clearfix col-lg-6 row">
<div class="col-sm-4"> <div class="member-pic-wrap col-xs-4">
<a href="{{link_to_show}}"><img class="member-pic" src="{{image}}" alt="{{name}}" title="{{name}}" width="100%"></a> <a href="{{link_to_show}}">
<img class="member-pic" src="{{image}}" alt="{{name}}" title="{{name}}" width="100%">
</a>
</div> </div>
<div class="col-sm-8"> <div class="member-profile-data-wrap col-xs-8">
<table class="table table-condensed"> <table class="table">
<tbody data-list="profile_data" data-level="3"> <tbody data-list="profile_data" data-level="3">
<tr><th class="{{title_class}}" style="min-width:70px;">{{title}}</th><td class="{{value_class}}">{{value}}</td></tr> <tr>
<th class="{{title_class}}">{{title}}</th>
<td class="{{value_class}}">{{value}}</td>
</tr>
</tbody> </tbody>
</table> </table>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,28 +1,47 @@
<div class="show" module="member"> <div class="show-member" module="member">
<div class="row"> <div class="row">
<div class="member-pic col-md-3"> <div class="member-pic col-xs-3">
<img src="{{image}}" alt="{{name}}" title="{{name}}" width="100%"> <img src="{{image}}" alt="{{name}}" title="{{name}}" width="100%">
</div> </div>
<div class="member-data col-md-9"> <div class="member-data col-xs-9">
<table class="table table-striped"> <table class="table table-striped">
<div data-list="profile_data" data-level="0"> <div data-list="profile_data" data-level="0">
<tr><th class="{{title_class}}" width="30%">{{title}}</th><td class="{{value_class}}">{{value}}</td></tr> <tr><th class="{{title_class}}">{{title}}</th><td class="{{value_class}}">{{value}}</td></tr>
</div> </div>
</table> </table>
</div> </div>
</div> </div>
<br/> <ul class="member-plugins nav nav-pills" role="tablist" data-list="plugins" data-level="0">
<ul class="nav nav-pills" role="tablist" data-list="plugins" data-level="0">
<li class="{{plugin_class}}"><a href="#{{plugin_name}}" role="tab" data-toggle="tab">{{plugin_title}}</a></li> <li class="{{plugin_class}}"><a href="#{{plugin_name}}" role="tab" data-toggle="tab">{{plugin_title}}</a></li>
</ul> </ul>
<br/>
<div class="tab-content" data-list="plugins" data-level="0"> <div class="tab-content" data-list="plugins" data-level="0">
<div class="tab-pane {{plugin_class}}" id="{{plugin_name}}"> <div class="tab-pane {{plugin_class}}" id="{{plugin_name}}">
<table class="table table-hover table-striped"> <table class="table table-hover table-striped">
<tbody data-list="plugin_data_intro" data-level="1">
<tr class="{{brief_display}}"><td>{{data_intro_title}}</td></tr>
</tbody>
<tbody data-list="plugin_data" data-level="1"> <tbody data-list="plugin_data" data-level="1">
<tr><td><a href="{{link_to_show}}">{{data_title}}</a></td></tr> <tr><td class="{{complete_display}}"><a href="{{link_to_show}}">{{data_title}}</a></td></tr>
</tbody> </tbody>
</table> </table>
</div> </div>
</div> </div>
</div> </div>
<script>
(function() {
// Adding class on first element
function memberPlugins() {
var plugins = document.querySelector('.member-plugins');
if( plugins.children.length === 0 ) {
return;
}
if( plugins.querySelectorAll('.member-plugins .active').length === 0 ) {
var navs = plugins.querySelectorAll('.member-plugins > li'),
contents = plugins.nextElementSibling.children[0];
navs[0].className += ' ' + 'active';
contents.className += ' ' + 'active';
}
}
memberPlugins();
}())
</script>

View File

@ -1,11 +1,11 @@
<div class="submenu-wrap"> <div class="sitemenu-wrap">
<h3 class="submenu__title">{{widget_title}}</h3> <h3 class="sitemenu__title">{{widget_title}}</h3>
<ul data-list="pages" class="submenu__list level-1" data-level="0"> <ul data-list="pages" class="sitemenu__list level-1" data-level="0">
<li class="submenu__item level-1"> <li class="sitemenu__item level-1">
<a class="submenu__link level-1" href="{{url}}" target="{{target}}">{{page_name}}</a> <a class="sitemenu__link level-1" href="{{url}}" target="{{target}}">{{page_name}}</a>
<ul class="submenu__list level-2" data-list="children" data-level="1"> <ul class="sitemenu__list level-2" data-list="children" data-level="1">
<li class="submenu__item level-2"> <li class="sitemenu__item level-2">
<a class="submenu__link level-2" href="{{url}}" target="{{target}}">{{page_name}}</a> <a class="sitemenu__link level-2" href="{{url}}" target="{{target}}">{{page_name}}</a>
<ul data-list="children" data-level="2"> <ul data-list="children" data-level="2">
<li> <li>
<a href="{{url}}" target="{{target}}">{{page_name}}</a> <a href="{{url}}" target="{{target}}">{{page_name}}</a>

View File

@ -126,6 +126,8 @@
<div style="height: 55px;"> <div style="height: 55px;">
<% if @store_permissions["permission_granted"] %> <% if @store_permissions["permission_granted"] %>
<button id="update_btn" class="btn btn-primary pull-right" style="margin: 10px;"><i class="icon-inbox icon-white"></i> <%= t("update_manager_.system_update") %></button> <button id="update_btn" class="btn btn-primary pull-right" style="margin: 10px;"><i class="icon-inbox icon-white"></i> <%= t("update_manager_.system_update") %></button>
<button id="module_update_btn" class="btn btn-primary pull-right" style="margin-right: 10px;"><i class="icon-inbox icon-white"></i> <%= t("update_manager_.module_update") %></button>
<% else %> <% else %>
<a href="/<%= I18n.locale.to_s %>/admin/designs" class="pull-right">Please register here.</a> <a href="/<%= I18n.locale.to_s %>/admin/designs" class="pull-right">Please register here.</a>
<% end %> <% end %>
@ -171,6 +173,9 @@
</div> </div>
<div style="padding: 10px 0; height: 65px;"> <div style="padding: 10px 0; height: 65px;">
<button id="chech_update_btn" class="btn btn-small btn-inverse pull-right"><i class="icon-refresh icon-white"></i> <%= t("update_manager_.check_update") %></button> <button id="chech_update_btn" class="btn btn-small btn-inverse pull-right"><i class="icon-refresh icon-white"></i> <%= t("update_manager_.check_update") %></button>
<% if @store_permissions["permission_granted"] %>
<button id="module_update_btn" class="btn btn-primary btn-small pull-right" style="margin-right: 10px;"><i class="icon-inbox icon-white"></i> <%= t("update_manager_.module_update") %></button>
<% end %>
</div> </div>
</div> </div>
</div> </div>
@ -245,10 +250,27 @@
} }
} }
function check_module_updates(){
$("#progress_msg").html("<strong><%= t("update_manager_.updating_orbit") %></strong>");
$("#new_update_container").fadeOut(function(){
$("#update_done").fadeOut(function(){
$("#update_status").fadeIn(function(){
$("#update_progress").fadeIn();
$.get("<%= admin_site_bundle_install_path %>",function(result){
$("#update_progress").fadeOut(function(){$("#update_done").fadeIn();});
$("#update_status").fadeIn();
});
});
});
});
}
$(document).ready(function(){ $(document).ready(function(){
check_updates(); check_updates();
get_update_history(); get_update_history();
$("#module_update_btn").click(check_module_updates);
$("#chech_update_btn").click(check_updates); $("#chech_update_btn").click(check_updates);
$("#update_btn").click(function(){ $("#update_btn").click(function(){

View File

@ -0,0 +1,19 @@
<style>
#main-wrap {
height: 100vh;
background-image: url(/assets/license-denied.png);
background-repeat: no-repeat;
background-position: 50% 25%;
}
.license-denied-wrap {
width: 100%;
margin-top: 200px;
text-align: center;
}
.license-denied-wrap .license-denied {
}
</style>
<div class="license-denied-wrap">
<h3 class="license-denied">License Denied.</h3>
<p class="">Please contact <a href="http://www.rulingdigital.com">www.rulingdigital.com</a>.</p>
</div>

View File

@ -3,7 +3,7 @@ gem 'news', git: 'http://gitlab.tp.rulingcom.com/root/nccu-news.git'
gem 'ad_banner', git: 'http://gitlab.tp.rulingcom.com/saurabh/adbanner-test.git' gem 'ad_banner', git: 'http://gitlab.tp.rulingcom.com/saurabh/adbanner-test.git'
gem "archive", git: 'http://gitlab.tp.rulingcom.com/saurabh/archive.git' gem "archive", git: 'http://gitlab.tp.rulingcom.com/saurabh/archive.git'
gem 'gallery', git: 'http://gitlab.tp.rulingcom.com/saurabh/gallery.git' gem 'gallery', git: 'http://gitlab.tp.rulingcom.com/saurabh/gallery.git'
gem 'links', git: 'http://gitlab.tp.rulingcom.com/saurabh/links.git' gem 'web_resource', git: 'http://gitlab.tp.rulingcom.com/saurabh/links.git'
gem 'page_content', git: 'http://gitlab.tp.rulingcom.com/saurabh/pagecontent.git' gem 'page_content', git: 'http://gitlab.tp.rulingcom.com/saurabh/pagecontent.git'
gem 'faq', git: 'http://gitlab.tp.rulingcom.com/saurabh/faq.git' gem 'faq', git: 'http://gitlab.tp.rulingcom.com/saurabh/faq.git'
#Personal Plugins #Personal Plugins

View File

@ -5,6 +5,7 @@ require File.expand_path('../application', __FILE__)
Orbit::Application.initialize! Orbit::Application.initialize!
Orbit::Application.config.secret_key_base = 'acc6ffc5a7d360c9cf2a7bdb4ddf9a897942ec6767413a5c0324a0fa8b86197a96298288a66bd46d8770d8b6edf509aad65716961c2c364ce006b475e6cfd418' Orbit::Application.config.secret_key_base = 'acc6ffc5a7d360c9cf2a7bdb4ddf9a897942ec6767413a5c0324a0fa8b86197a96298288a66bd46d8770d8b6edf509aad65716961c2c364ce006b475e6cfd418'
OrbitApp.cleanup_modules OrbitApp.cleanup_modules
OrbitApp.check_module_permissions
if Site.count == 0 if Site.count == 0
site = Site.new site = Site.new

View File

@ -603,6 +603,7 @@ en:
check_update: Check Update check_update: Check Update
checking_update: Checking for Updates checking_update: Checking for Updates
system_update: Install Updates system_update: Install Updates
module_update: Module Updates
update_done: System is update to date update_done: System is update to date
update_faild: Update failed. Merge is require in the update. Please login to server and update manually. update_faild: Update failed. Merge is require in the update. Please login to server and update manually.
update_history: Update Histroy update_history: Update Histroy

View File

@ -613,6 +613,7 @@ zh_tw:
check_update: 檢查更新 check_update: 檢查更新
checking_update: 檢查更新中 checking_update: 檢查更新中
system_update: 安裝更新 system_update: 安裝更新
module_update: 模組更新
update_done: 系統已是最新版本 update_done: 系統已是最新版本
update_faild: 更新失敗. 更新需要合併程式碼. 請登入伺服器手動進行更新. update_faild: 更新失敗. 更新需要合併程式碼. 請登入伺服器手動進行更新.
update_history: 更新紀錄 update_history: 更新紀錄

View File

@ -16,6 +16,7 @@ Orbit::Application.routes.draw do
get "/page_parts/getwidgets" => "page_parts#getwidgets" get "/page_parts/getwidgets" => "page_parts#getwidgets"
get "/page_parts/info" => "page_parts#info" get "/page_parts/info" => "page_parts#info"
get "/page_parts/edit_sub_part" => "page_parts#edit_sub_part" get "/page_parts/edit_sub_part" => "page_parts#edit_sub_part"
get "/admin/license_denied" => "store_api#render_license_denied"
resources :pages resources :pages
resources :page_parts do resources :page_parts do
@ -27,6 +28,9 @@ Orbit::Application.routes.draw do
get "/module/:name" => "home#index" get "/module/:name" => "home#index"
get "/module/:name/show" => "home#show" get "/module/:name/show" => "home#show"
post "/store/confirmation" => "store_api#confirmation" post "/store/confirmation" => "store_api#confirmation"
post "/store/install_module" => "store_api#install_module"
post "/store/uninstall_module" => "store_api#uninstall_module"
post "/store/restart_srever_after_install" => "store_api#restart_server_after_install"
# The priority is based upon order of creation: first created -> highest priority. # The priority is based upon order of creation: first created -> highest priority.
# See how all your routes lay out with "rake routes". # See how all your routes lay out with "rake routes".
@ -93,7 +97,7 @@ Orbit::Application.routes.draw do
get "members/get_role_fields/:id" => "members#get_role_fields", :as => :get_role_fields get "members/get_role_fields/:id" => "members#get_role_fields", :as => :get_role_fields
get "members/import_members" => "members#import_members" get "members/import_members" => "members#import_members"
get "members/unapproved_members" => "members#unapproved_members" get "members/unapproved_members" => "members#unapproved_members"
resources :members do resources :members do
collection do collection do
@ -194,8 +198,9 @@ Orbit::Application.routes.draw do
get 'get_update_history' get 'get_update_history'
get 'check_updates' get 'check_updates'
get 'update_orbit' get 'update_orbit'
get 'bundle_install'
get 'restart_server' get 'restart_server'
get 'delete_mail_log' get 'delete_mail_log'
end end
resources :designs do resources :designs do

View File

@ -13,12 +13,14 @@ module SideBarRenderer
@app_available_for = af @app_available_for = af
if display? if display?
content_tag :div, class: "sub-nav-block #{@icon_class}" do content_tag :div, class: "sub-nav-block #{@icon_class}" do
concat content_tag :h4, I18n.t(@head_label) if @belong_module_app.store_permission_granted
concat (content_tag :ul, class: "nav nav-list" do concat content_tag :h4, I18n.t(@head_label)
@context_links.sort_by {| obj | obj.priority}.map{ |link| concat (content_tag :ul, class: "nav nav-list" do
link.render(request, params, @current_module_app, @current_user, @belong_module_app, link.get_active_action, link.available_for) @context_links.sort_by {| obj | obj.priority}.map{ |link|
}.join.html_safe link.render(request, params, @current_module_app, @current_user, @belong_module_app, link.get_active_action, link.available_for)
end) }.join.html_safe
end)
end
end end
end end
end end
@ -33,9 +35,17 @@ module SideBarRenderer
@app_available_for = available_for @app_available_for = available_for
if display? if display?
content_tag :li, class: (module_sidebar_active? ? 'active' : nil) do content_tag :li, class: (module_sidebar_active? ? 'active' : nil) do
link_to Rails.application.routes.url_helpers.send(@head_link) do if @belong_module_app.store_permission_granted
content_tag :span do link_to Rails.application.routes.url_helpers.send(@head_link) do
content_tag(:i, nil, class: @icon_class) content_tag :span do
content_tag(:i, nil, class: @icon_class)
end
end
else
link_to "/admin/license_denied", class: "license-denied" do
content_tag :span, class: "icons-blocked" do
content_tag(:i, nil, class: @icon_class)
end
end end
end end
end end

View File

@ -20,5 +20,53 @@ module OrbitApp
end end
end end
end end
def check_module_permissions
store_token = Site.first.store_token
module_apps = ModuleApp.all
exceptions = OrbitStore::MODULE_EXCEPTIONS
if !store_token.nil?
ids = []
module_index = {}
module_apps.each do |ma|
ids << ma.key
module_index[ma.key] = ma
end
params_to_send = {'store_token' => store_token, "apps" => ids}
uri = URI.parse(OrbitStore::URL)
http = Net::HTTP.new(uri.host,uri.port)
request = Net::HTTP::Post.new("/store/check_module_permissions")
request.body = params_to_send.to_query
response = http.request(request) rescue nil
if !response.nil?
data = JSON.parse(response.body)
if response.code == "200"
if data["success"]
permissions = data["permissions"]
permissions.each do |permission|
ma = module_index[permission["app"]]
ma.store_permission_granted = (exceptions.include?(ma.key) ? true : permission["granted"])
ma.save
end
else
module_apps.each do |ma|
ma.store_permission_granted = (exceptions.include?(ma.key) ? true : false)
ma.save
end
end
end
else
module_apps.each do |ma|
ma.store_permission_granted = (exceptions.include?(ma.key) ? true : false)
ma.save
end
end
else
module_apps.each do |ma|
ma.store_permission_granted = (exceptions.include?(ma.key) ? true : false)
ma.save
end
end
end
end end
end end

View File

@ -62,7 +62,11 @@ module OrbitCoreLib
return return
end end
if !@module_app.nil? if !@module_app.nil?
check_user_can_use if @module_app.store_permission_granted || params["controller"] == "admin/authorizations"
check_user_can_use
else
redirect_to admin_license_denied_path
end
else else
if current_user.nil? || !current_user.is_admin? if current_user.nil? || !current_user.is_admin?
if params["controller"] != "admin/assets" if params["controller"] != "admin/assets"

View File

@ -0,0 +1,24 @@
namespace :register_with_store do
task :register,[:arg] => :environment do |task,args|
modules = ModuleApp.all
ids = modules.collect{|ma| ma.key}
store_token = Site.first.store_token
module_apps = ModuleApp.all
exceptions = OrbitStore::MODULE_EXCEPTIONS
if !store_token.nil?
params_to_send = {'store_token' => store_token, "apps" => ids}
uri = URI.parse(OrbitStore::URL)
http = Net::HTTP.new(uri.host,uri.port)
request = Net::HTTP::Post.new("/store/register_old_sites_modules")
request.body = params_to_send.to_query
response = http.request(request) rescue nil
if response.nil?
puts "Cannot connect to store."
else
puts "All modules registered."
end
else
puts "Cannot register modules, site is not registered with store."
end
end
end