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 'carrierwave'
gem 'carrierwave-mongoid', :require => 'carrierwave/mongoid'
gem 'zip-zip'
gem 'kaminari'
gem "impressionist"
gem "chartkick"

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

View File

@ -1,8 +1,16 @@
(function($) {
$("document").ready(function(){
$("document").ready(function(){
// Get link data-attribute and make the banner clickable
$('.w-ad-banner__slide').not('[data-link=""]').not(".youtube").addClass('cursor').on("click",function(){
window.open($(this).data("link"),"_blank");
$('.w-ad-banner__slide')
.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));

View File

@ -25,6 +25,9 @@ var FormValidator = function(form){
nospace : function(value){
return (/\s/.test(value) ? false : true);
},
lowercase : function(value){
return (value == value.toLowerCase() ? true : false);
},
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,}))$/;
return re.test(value);
@ -40,35 +43,39 @@ var FormValidator = function(form){
var _attachSubmitHandler = function(){
fv.form.on("submit",function(){
failed_elements = [];
$.each(elements_data,function(key,element){
var validators = element.validators,
messages = element.messages,
el = fv.form.find("#" + key);
for(i = 0; i < validators.length; i++){
var error_span = (fv.form.find("div[for=" + key + "]").length ? $("div[for=" + key + "]") : $("<div class='validator_error_class text-error' for='" + key + "'></div>"));
if(typeof fv.validate_functions[validators[i]] == "function"){
if(!fv.validate_functions[validators[i]](el.val(),el)){
error_span.text(messages[i]);
el.after(error_span);
failed_elements.push(el);
break;
}else{
error_span.remove();
}
return fv.isFormValidated();
})
}
this.isFormValidated = function(){
failed_elements = [];
$.each(elements_data,function(key,element){
var validators = element.validators,
messages = element.messages,
el = fv.form.find("#" + key);
for(i = 0; i < validators.length; i++){
var error_span = (fv.form.find("div[for=" + key + "]").length ? $("div[for=" + key + "]") : $("<div class='validator_error_class text-error' for='" + key + "'></div>"));
if(typeof fv.validate_functions[validators[i]] == "function"){
if(!fv.validate_functions[validators[i]](el.val(),el)){
error_span.text(messages[i]);
el.after(error_span);
failed_elements.push(el);
break;
}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(){

View File

@ -122,6 +122,20 @@ legend {
text-align: center;
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 {
margin: 0;
width: 61px;
@ -188,6 +202,7 @@ legend {
}
#sidebar .sidebar-nav > li a {
display: block;
text-decoration: none;
}
#sidebar .sidebar-nav > li i {
font-size: 1.6em;

View File

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

View File

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

View File

@ -106,7 +106,9 @@ class Admin::SitesController < OrbitAdminController
else
result = "success"
# 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
render :text => result
@ -117,6 +119,7 @@ class Admin::SitesController < OrbitAdminController
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=downloaded_extensions.rb bundle update && bundle` }
%x(kill -s USR2 `cat tmp/pids/unicorn.pid`)
sleep 5
render :nothing => true

View File

@ -139,29 +139,44 @@ class MembersController < ApplicationController
plugins = OrbitApp::Plugin::Registration.all rescue nil
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
if intro.nil? or intro.complete_list
plugin_data = plugin.app_name.constantize.where(member_profile_id: member) rescue nil
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)
}
if !intro.blank?
if !intro.complete_list.blank?
plugin_data = plugin.app_name.constantize.where(member_profile_id: member) rescue nil
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)
}
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_intro" => pdi,
"complete_display" => complete_display,
"brief_display" => brief_display,
"plugin_name" => plugin.module_app_name.underscore,
"plugin_title" => t('module_name.'+plugin.module_app_name.underscore),
"plugin_class" => idx==0 ? "active" : ""
}
}
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,
"profile_data" => profile_data,
@ -175,7 +190,6 @@ class MembersController < ApplicationController
def member_data(member, fields_to_show)
profile_data = []
fields_to_show.each do |field|
# debugger
case field['type']
when 'profile'
field_data = member.get_attribute_data(field) rescue {}

View File

@ -11,7 +11,7 @@ class PagesController < ApplicationController
before_filter :set_edit_mode
def index
@pages = Page.all
@pages = Page.all
# render json: @pages
end
@ -76,10 +76,14 @@ class PagesController < ApplicationController
params[:url] = page.url
categories = []
if page.module == "member"
page.categories.each do |c|
category = Role.find(c) rescue nil
if !category.nil? && !category.disabled
categories << c
if page.categories.first == "all"
categories = ["all"]
else
page.categories.each do |c|
category = Role.find(c) rescue nil
if !category.nil? && !category.disabled
categories << c
end
end
end
else
@ -89,8 +93,8 @@ class PagesController < ApplicationController
categories << c
end
end
categories = ["all"] if categories.blank?
end
categories = ["all"] if categories.blank?
@manifest = @key
OrbitHelper.set_params params,current_user
OrbitHelper.set_site_locale locale
@ -186,30 +190,38 @@ class PagesController < ApplicationController
"id" => cat.id.to_s
}
end
tags = module_app.tags.collect do |t|
{
"name" => t.name,
"id" => t.id.to_s
}
end
else
categories = []
tags = []
end
end
roles = roles.nil? ? [] : roles
categories = categories.nil? ? [] : categories
tags = tags.nil? ? [] : tags
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
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
def new
@page = Page.new(
@page = Page.new(
:enabled_for_mobile=>true,
:menu_enabled_for=>["en", "zh_tw"],
:enabled_for=>["en", "zh_tw"],
:enabled_for_sitemap=>["en", "zh_tw"]
)
@pages = Page.where(:page_id.ne => "" , :page_id.exists => true)
@modules = ModuleApp.all.frontend_enabled.order_by(:key=>'asc')
@pages = Page.where(:page_id.ne => "" , :page_id.exists => true)
@modules = ModuleApp.all.frontend_enabled.order_by(:key=>'asc')
end
@ -260,7 +272,7 @@ class PagesController < ApplicationController
end
end
private
private
def get_layouts(module_app)
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["role_status"] = p["role_status"] || []
p["categories"] = p["categories"] || []
p["tags"] = p["tags"] || []
p["enabled_for"] = p["enabled_for"] || []
p["menu_enabled_for"] = p["menu_enabled_for"] || []
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
def confirmation
site_token = params[:site_token]
@ -11,4 +14,80 @@ class StoreApiController < ApplicationController
render :json => {"success" => false}.to_json
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

View File

@ -64,6 +64,8 @@ module ApplicationHelper
end
site_footer = site_footer.nil? ? "" : 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
end

View File

@ -172,8 +172,15 @@ module OrbitBackendHelper
http = Net::HTTP.new(uri.host,uri.port)
request = Net::HTTP::Get.new("/site/permissions")
request.body = params_to_send.to_query
response = http.request(request)
data = JSON.parse(response.body)
response = http.request(request) rescue nil
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"]
case data["error"]
when "INVALID_SITE_TOKEN"

View File

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

View File

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

View File

@ -1,110 +1,106 @@
(function($) {
"use strict"
// Init functions
function init () {
// Announcement modules
var annc = {
truncation : function (el, maxLength) {
var doc = document;
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 ++ ) {
if ( el[i].firstChild !== null ) {
if( el[i].firstChild.length > maxLength ) {
var newTitle = el[i].firstChild.nodeValue;
var newTitle = newTitle.substring(0, maxLength) + '...'
if( el[i].firstChild.length > len ) {
var newStr = el[i].firstChild.nodeValue,
newStr = newStr.substring(0, len) + '...'
el
.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() {
var w$ = $('.w-announcement-4');
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')
el[i].parentNode.insertBefore(caret, el[i]);
orbit.addClass(el[i], 'dropdown-menu');
}
}
return false;
})
}
}
// Targeting internal page
if( $('body').attr('class') !== 'page-main' ) {
submenuFix();
}
dropdown();
bullEye();
var plugin = {
// RWD image resize script
bullEye : function() {
$(".bullseye").bullseye({
fadeEffect: false
});
}
}
// 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($) {
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";
// Google fonts
@import url(http://fonts.googleapis.com/css?family=Roboto);
// Base Color
$theme-gray: #495054;
$theme-gray-light: #cecece;
@ -16,8 +19,8 @@ $theme-color-third: #ed4c43;
// Font stacks
$main-font: Arial, "微軟正黑體", "Helvetica Neue", Helvetica, sans-serif;
$sub-font: Arial, "新細明體", "Helvetica Neue", Helvetica, sans-serif;
$main-font: 'Roboto', "微軟正黑體", "Helvetica Neue", Helvetica, sans-serif;
$sub-font: 'Roboto', "新細明體", "Helvetica Neue", Helvetica, sans-serif;
//

View File

@ -61,7 +61,7 @@
}
// Widget-1
.w-announcement-1 {
.widget-announcement-1 {
.w-annc__img-wrap {
height: 200px;
margin: 0 0 1em 0;
@ -74,7 +74,7 @@
}
// Widget-2
.w-announcement-2 {
.widget-announcement-2 {
.w-annc__img-wrap {
height: 200px;
margin: 0 0 1em 0;
@ -87,7 +87,7 @@
}
// Widget-3
.w-announcement-3 {
.widget-announcement-3 {
.w-annc__img-wrap {
height: 200px;
margin: 0 0 1em 0;
@ -100,7 +100,7 @@
}
// Widget-4
.w-announcement-4 {
.widget-announcement-4 {
.w-annc__title {
font-family: $main-font;
line-height: 1.3;
@ -116,7 +116,7 @@
}
// Widget-5
.w-announcement-5 {
.widget-announcement-5 {
.w-annc__title {
font-family: $main-font;
line-height: 1.3;
@ -130,7 +130,7 @@
}
// Widget-6
.w-announcement-6 {
.widget-announcement-6 {
.w-annc__item {
margin-bottom: 0.8em;
padding-bottom: 0.8em;
@ -151,7 +151,7 @@
}
// Widget-7
.w-announcement-7 {
.widget-announcement-7 {
.w-annc__item {
margin-bottom: 0.8em;
padding-bottom: 0.8em;
@ -173,7 +173,7 @@
// Widget-8
// ## Table
.w-announcement-8 {
.widget-announcement-8 {
.w-annc__th {
color: #fff;
background: $theme-color-main;
@ -194,7 +194,7 @@
// Widget-9
// ## Table
.w-announcement-9 {
.widget-announcement-9 {
.w-annc__th {
color: #fff;
background: $theme-color-main;
@ -214,7 +214,7 @@
}
// Widget-10
.w-announcement-10 {
.widget-announcement-10 {
.w-annc__item {
margin-bottom: 0.8em;
padding-bottom: 0.8em;
@ -234,7 +234,7 @@
// Widget-11
// ## Table
.w-announcement-11 {
.widget-announcement-11 {
.w-annc__th {
color: #fff;
background: $theme-color-main;
@ -254,7 +254,7 @@
}
// Widget-12
.w-announcement-12 {
.widget-announcement-12 {
.w-annc__list {
padding: 0 15px;
}
@ -348,7 +348,7 @@
}
// Index-1
.i-announcement-1 {
.index-announcement-1 {
.i-annc__th {
color: #fff;
background: $theme-color-main;
@ -407,18 +407,7 @@
}
.s-annc__tag-wrap {
.s-annc__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;
}
font-weight: normal;
}
}
}
@ -430,6 +419,9 @@
padding-top: 1em;
border-top: 1px dotted $theme-gray-light;
}
.s-annc__related-file {
margin-bottom: 15px;
}
.s-annc__related-file,
.s-annc__related-link {
padding-bottom: 6px;
@ -440,22 +432,17 @@
color: darken($theme-gray-light, 10%);
}
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-file-list {
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-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-title {
@extend .unity-title;
font-family: $main-font;
th,
td {
font-size: 0.8125rem;
}
.post-metadata {
border-bottom: 1px solid $theme-gray-light;
@include clearfix();
li {
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;
}
}
.member-plugins {
margin-bottom: 20px;
a {
font-size: 0.8125rem;
}
}
}

View File

@ -1,5 +1,4 @@
// Base
@import url("http://fonts.googleapis.com/css?family=Droid+Sans:400,700");
@import "bootstrap/mixins";
@import "bootstrap/variables";
@import "base/mixins";
@ -7,7 +6,7 @@
@import "base/unity";
@import "base/pagination";
@import "base/orbitbar-override";
@import "base/genernal";
@import "base/global";
// Layout
@import "layout/header";
@ -29,11 +28,3 @@
// Widget
@import "widget/breadcrumb";
@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 {
@include clearfix();
.sitemenu-wrap {
padding: 10px 0;
.submenu__title {
@include clearfix;
.sitemenu__title {
display: none;
}
.submenu__list {
list-style: none;
padding: 0;
.sitemenu__list {
margin: 0;
padding: 0;
list-style: none;
}
.submenu__item.level-1 {
.sitemenu__item.level-1 {
font-size: 0.8125rem;
position: relative;
float: left;
margin-right: 1%;
margin-bottom: 12px;
}
.submenu__link.level-1 {
float: left;
padding: 8px .8em;
padding-bottom: 8px;
font-size: 13px;
font-size: 0.8125rem;
background: $theme-color-second;
color: #fff;
padding: 8px 0.8em;
border-radius: 0.2em;
border-radius: .2em;
background: $theme-color-second;
&:hover {
background: darken($theme-color-second, 10%);
}
}
.submenu__item:hover .dropdown {
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 {
.sitemenu__link.level-1 {
margin-right: .25rem;
color: #fff;
white-space: nowrap;
}
.submenu__list.hidden--item {
display: none;
&:before {
display: none;
.sitemenu___dropdown-toggle {
font-size: 0.75rem;
padding: 2px .3125rem;
cursor: pointer;
}
// 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">
<div class="container layout-footer-inner">
<div class="layout-footer-content">{{footer-data}}</div>
<div>{{site-counter}}</div>
</div>
</footer>

View File

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

View File

@ -1,3 +1,5 @@
<ul class="pagination" data-pagination="true">
<li class="{{pagination_active}}"><a href="{{pagination_link}}">{{page_number}}</a></li>
</ul>
<ul class="pagination pagination-sm" data-pagination="true">
<li class="{{pagination_active}}">
<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"
data-list="images"
data-level="0"
@ -21,3 +21,5 @@
<div class="w-ad-banner__caption"></div>
<ul class="w-ad-banner__pager"></ul>
</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"
data-list="images"
data-level="0"
@ -19,7 +19,6 @@
</div>
<script type="text/javascript">
$("document").ready(function(){
// total_players = $("*[data-youtube-id]").length
$("*[data-youtube-id]").each(function(){
var obj = $(this).find("embed");
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"
data-list="images"
data-level="0"
data-cycle-slides=".w-ad-banner__slide"
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}}">
</div>
</div>
</div>
<ul class="w-ad-banner__pager"></ul>
</div>

View File

@ -11,8 +11,8 @@
{
"filename" : "ad_banner_widget2_video",
"name" : {
"zh_tw" : "2. 橫幅輪播 ( 圖片, 導航圖示 )",
"en" : "2. Carousel ( image, navigation, video )"
"zh_tw" : "2. 橫幅輪播 + Youtube影片 ( 圖片, Youtube影片, 導航圖示 )",
"en" : "2. Carousel ( image, Youtube video, navigation )"
},
"thumbnail" : "thumbnail-block.png"
},
@ -20,9 +20,18 @@
"filename" : "ad_banner_widget3",
"name" : {
"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"
}
]
}

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">
<span>{{widget-title}}</span>
</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">
<span>{{widget-title}}</span>
</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">
<span>{{widget-title}}</span>
</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">
<span>{{widget-title}}</span>
</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">
<span>{{widget-title}}</span>
</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">
<span>{{widget-title}}</span>
</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">
<span>{{widget-title}}</span>
</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">
<span>{{widget-title}}</span>
</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">
<span>{{widget-title}}</span>
</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">
<span>{{widget-title}}</span>
</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">
<span>{{widget-title}}</span>
</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">
<span>{{widget-title}}</span>
</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>
<table class="i-annc__table table table-striped">
<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>
<ul class="i-annc__list" data-level="0" data-list="announcements">
<li class="i-annc__item">

View File

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

View File

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

View File

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

View File

@ -1,15 +1,15 @@
<div id="orbit_calendar">
<div id='sec1' class="cal-fn">
<div id="sec1">
<div class="btn-toolbar" id="navigation">
<div id="calendar-nav">
<button class="btn" id="today_btn">Today</button>
<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>
</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>
</button>
<button class="btn btn-default btn-sm" id="today_btn">Today</button>
</div>
</div>
</div>
@ -17,12 +17,12 @@
</div>
<div id='sec3' class="btn-toolbar">
<div class="btn-group calendar_mode">
<button class="btn mode_switch" data-mode="agendaDay" >day</button>
<button class="btn mode_switch" data-mode="agendaWeek" >week</button>
<button class="btn active mode_switch" 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="agendaDay" >day</button>
<button class="btn btn-default mode_switch btn-sm" data-mode="agendaWeek" >week</button>
<button class="btn btn-default active mode_switch btn-sm" data-mode="month" >month</button>
<button class="btn btn-default mode_switch btn-sm" data-mode="agenda" >agenda</button>
</div>
<button id="refresh_btn" class="btn">
<button id="refresh_btn" class="btn btn-default btn-sm">
<i class="icons-cycle"></i>
</button>
</div>
@ -33,7 +33,7 @@
</div>
</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">
var calendar = new Calendar("#calendar","{{page_id}}");

View File

@ -1,6 +1,6 @@
<article>
<div class="post-title">
<h1>{{question}}</h1>
<h3>{{question}}</h3>
</div>
<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">
<span>{{widget-title}}</span>
</h3>

View File

@ -1,4 +1,4 @@
<div class="widget-gallery widget2">
<div class="widget-gallery widget3">
<h3 class="widget-title">
<span>{{widget-title}}</span>
</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-group" data-list="roles" data-level="0">
<div class="index-member-group-item">
<div class="index-member-status" data-level="1" data-list="status-list">
<h3 class="index-title">
<span>{{status-title}}</span>
</h3>
<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="col-sm-4">
<a href="{{link_to_show}}"><img class="member-pic" src="{{image}}" alt="{{name}}" title="{{name}}" width="100%"></a>
<div class="index-member-item clearfix col-lg-6 row">
<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>
</div>
<div class="col-sm-8">
<table class="table table-condensed">
<div class="member-profile-data-wrap col-xs-8">
<table class="table">
<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>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@ -1,30 +1,30 @@
<div class="index-member index1">
<div class="index-member-group" data-list="roles" data-level="0">
<div class="index-member-group-item">
<div class="index-member-status" data-level="1" data-list="status-list">
<h3 class="index-title">
<span>{{status-title}}</span>
</h3>
<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="col-sm-4">
<a href="{{link_to_show}}"><img class="member-pic" src="{{image}}" alt="{{name}}" title="{{name}}" width="100%"></a>
<div class="index-member-item clearfix col-lg-6 row">
<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>
</div>
<div class="col-sm-8">
<table class="table table-condensed">
<div class="member-profile-data-wrap col-xs-8">
<table class="table">
<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>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@ -6,22 +6,25 @@
<span>{{status-title}}</span>
</h3>
<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="col-sm-4">
<a href="{{link_to_show}}"><img class="member-pic" src="{{image}}" alt="{{name}}" title="{{name}}" width="100%"></a>
<div class="index-member-item clearfix col-lg-6 row">
<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>
</div>
<div class="col-sm-8">
<table class="table table-condensed">
<div class="member-profile-data-wrap col-xs-8">
<table class="table">
<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>
</table>
</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="member-pic col-md-3">
<div class="member-pic col-xs-3">
<img src="{{image}}" alt="{{name}}" title="{{name}}" width="100%">
</div>
<div class="member-data col-md-9">
<div class="member-data col-xs-9">
<table class="table table-striped">
<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>
</table>
</div>
</div>
<br/>
<ul class="nav nav-pills" role="tablist" data-list="plugins" data-level="0">
<ul class="member-plugins 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>
</ul>
<br/>
<div class="tab-content" data-list="plugins" data-level="0">
<div class="tab-pane {{plugin_class}}" id="{{plugin_name}}">
<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">
<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>
</table>
</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">
<h3 class="submenu__title">{{widget_title}}</h3>
<ul data-list="pages" class="submenu__list level-1" data-level="0">
<li class="submenu__item level-1">
<a class="submenu__link level-1" href="{{url}}" target="{{target}}">{{page_name}}</a>
<ul class="submenu__list level-2" data-list="children" data-level="1">
<li class="submenu__item level-2">
<a class="submenu__link level-2" href="{{url}}" target="{{target}}">{{page_name}}</a>
<div class="sitemenu-wrap">
<h3 class="sitemenu__title">{{widget_title}}</h3>
<ul data-list="pages" class="sitemenu__list level-1" data-level="0">
<li class="sitemenu__item level-1">
<a class="sitemenu__link level-1" href="{{url}}" target="{{target}}">{{page_name}}</a>
<ul class="sitemenu__list level-2" data-list="children" data-level="1">
<li class="sitemenu__item level-2">
<a class="sitemenu__link level-2" href="{{url}}" target="{{target}}">{{page_name}}</a>
<ul data-list="children" data-level="2">
<li>
<a href="{{url}}" target="{{target}}">{{page_name}}</a>

View File

@ -126,6 +126,8 @@
<div style="height: 55px;">
<% 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="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 %>
<a href="/<%= I18n.locale.to_s %>/admin/designs" class="pull-right">Please register here.</a>
<% end %>
@ -171,6 +173,9 @@
</div>
<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>
<% 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>
@ -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(){
check_updates();
get_update_history();
$("#module_update_btn").click(check_module_updates);
$("#chech_update_btn").click(check_updates);
$("#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 "archive", git: 'http://gitlab.tp.rulingcom.com/saurabh/archive.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 'faq', git: 'http://gitlab.tp.rulingcom.com/saurabh/faq.git'
#Personal Plugins

View File

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

View File

@ -603,6 +603,7 @@ en:
check_update: Check Update
checking_update: Checking for Updates
system_update: Install Updates
module_update: Module Updates
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_history: Update Histroy

View File

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

View File

@ -16,6 +16,7 @@ Orbit::Application.routes.draw do
get "/page_parts/getwidgets" => "page_parts#getwidgets"
get "/page_parts/info" => "page_parts#info"
get "/page_parts/edit_sub_part" => "page_parts#edit_sub_part"
get "/admin/license_denied" => "store_api#render_license_denied"
resources :pages
resources :page_parts do
@ -27,6 +28,9 @@ Orbit::Application.routes.draw do
get "/module/:name" => "home#index"
get "/module/:name/show" => "home#show"
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.
# 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/import_members" => "members#import_members"
get "members/unapproved_members" => "members#unapproved_members"
get "members/unapproved_members" => "members#unapproved_members"
resources :members do
collection do
@ -194,8 +198,9 @@ Orbit::Application.routes.draw do
get 'get_update_history'
get 'check_updates'
get 'update_orbit'
get 'bundle_install'
get 'restart_server'
get 'delete_mail_log'
get 'delete_mail_log'
end
resources :designs do

View File

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

View File

@ -20,5 +20,53 @@ module OrbitApp
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

View File

@ -62,7 +62,11 @@ module OrbitCoreLib
return
end
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
if current_user.nil? || !current_user.is_admin?
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