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

This commit is contained in:
Harry Bomrah 2015-01-08 23:05:22 +08:00
commit da06328013
77 changed files with 660 additions and 440 deletions

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')
.not('[data-link=""]')
.not(".youtube")
.addClass('cursor')
.on("click",function(){
if( $(this).data('target') === '_blank' ) {
window.open($(this).data("link"), "_blank"); window.open($(this).data("link"), "_blank");
} else {
window.location.href = ($(this).data("link"));
}
}) })
}) })
}(jQuery)); }(jQuery));

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

@ -119,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

@ -75,6 +75,18 @@ class PagesController < ApplicationController
end end
params[:url] = page.url params[:url] = page.url
categories = [] categories = []
if page.module == "member"
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
page.categories.each do |c| page.categories.each do |c|
category = Category.find(c) rescue nil category = Category.find(c) rescue nil
if !category.nil? && !category.disable if !category.nil? && !category.disable
@ -82,6 +94,7 @@ class PagesController < ApplicationController
end end
end end
categories = ["all"] if categories.blank? categories = ["all"] if categories.blank?
end
@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

View File

@ -30,7 +30,10 @@ class StoreApiController < ApplicationController
response = {"success" => false} response = {"success" => false}
end end
render :json => response.to_json render :json => response.to_json
bundle_install if response["success"] if response["success"]
bundle_install
# give_permissions(params[:module_key])
end
end end
def uninstall_module def uninstall_module
@ -43,6 +46,10 @@ class StoreApiController < ApplicationController
render :json => {"success" => true}.to_json render :json => {"success" => true}.to_json
end end
def render_license_denied
render :layout => "back_end"
end
private private
def bundle_install def bundle_install
Bundler.with_clean_env { `cd #{Rails.root} && BUNDLE_GEMFILE=downloaded_extensions.rb bundle update && bundle` } Bundler.with_clean_env { `cd #{Rails.root} && BUNDLE_GEMFILE=downloaded_extensions.rb bundle update && bundle` }
@ -50,6 +57,12 @@ class StoreApiController < ApplicationController
sleep 5 sleep 5
end end
def restart_server_after_install
%x(kill -s USR2 `cat tmp/pids/unicorn.pid`)
sleep 5
end
def download_template(url,name) def download_template(url,name)
dir = File.join(Rails.root,"public","template_cache") dir = File.join(Rails.root,"public","template_cache")
destination = File.join(Rails.root,"app","templates","#{Site.first.template}","modules") destination = File.join(Rails.root,"app","templates","#{Site.first.template}","modules")

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
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) 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

@ -2,108 +2,104 @@
"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');
el[i].parentNode.insertBefore(caret, el[i]);
orbit.addClass(el[i], 'dropdown-menu');
}
}
} }
} }
function anncFix() { var plugin = {
var w$ = $('.w-announcement-4'); // RWD image resize script
if( w$.length ) { bullEye : function() {
annc.truncation(w$.find('.w-annc__subtitle'), 25); $(".bullseye").bullseye({
fadeEffect: false
});
} }
} }
// Necessary for Responsive images // Specific functions that will be running on homepage
function bullEye() { if( doc.body.getAttribute('data-module') === 'home' ) {
// $(".bullseye").bullseye({
// fadeEffect: false
// });
} }
// Adding class to submenu that has dropdown items // Functions that will be running on every page
function submenuFix () { orbit.sitemenuDropdown();
var item$ = $('.submenu__item.level-1'); plugin.bullEye();
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
if( $('body').attr('class') !== 'page-main' ) {
submenuFix();
}
dropdown();
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 {
// Member SHOW min-height: 200px;
.show-member { margin-bottom: 20px;
.show-title {
@extend .unity-title;
} }
.post-metadata { .index-member-item:nth-child(2n+1) {
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; clear: both;
float: none;
i {
position: absolute;
top: 7px;
left: 0;
} }
} .member-data-title-job-title:before,
&.metadata-tags { .member-data-title-name:before,
.tag { .member-data-title-email:before,
.member-data-title-office-tel:before{
content: "\f007";
font-family: "fontAwesome";
display: inline-block; display: inline-block;
margin-bottom: 4px; margin-right: 0.3125rem;
padding: 5px 8px; color: gray;
font-size: 0.8em; min-width: 15px;
color: $theme-gray; font-size: 0.75rem;
border: 1px solid $theme-gray-light; }
text-decoration: none; .member-data-title-job-title:before {
&:hover { content: "\f19d";
color: $theme-color-main; }
border-color: $theme-color-main; .member-data-title-email:before {
background-color: $theme-gray-lighter; content: "\f0e0";
}
.member-data-title-office-tel:before{
content: "\f098";
}
.member-profile-data-wrap {
overflow: hidden;
}
.member-pic {
border-radius: 0.25rem;
} }
} }
// Member show page
.show-member {
font-family: $main-font;
th,
td {
font-size: 0.8125rem;
} }
i { .member-plugins {
color: darken($theme-gray-light, 10%); margin-bottom: 20px;
}
}
}
.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 { a {
display: inline-block; font-size: 0.8125rem;
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

@ -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}}">
<a href="{{pagination_link}}">{{page_number}}</a>
</li>
</ul> </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}}"
data-link="{{link}}"
> >
<div class="w-ad-banner__slide {{class}}">
<img class="w-ad-banner__image" src="{{image_link}}"> <img class="w-ad-banner__image" src="{{image_link}}">
</div> </div>
</div> </div>
<ul class="w-ad-banner__pager"></ul>
</div> </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,21 +1,19 @@
<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">
@ -29,3 +27,21 @@
</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

@ -96,7 +96,9 @@
<script type="text/javascript"> <script type="text/javascript">
var lis = $("ul#card-list-submanagers li"); var lis = $("ul#card-list-submanagers li");
<% if !@objects.nil? %>
var app_categories = <%= @objects.collect{|c| {"id" => c.id.to_s, "disable" => c.disable}}.to_json.html_safe %>; var app_categories = <%= @objects.collect{|c| {"id" => c.id.to_s, "disable" => c.disable}}.to_json.html_safe %>;
<% end %>
</script> </script>

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

@ -2,7 +2,7 @@ gem 'announcement', git: 'http://gitlab.tp.rulingcom.com/saurabh/announcement-te
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

@ -612,6 +612,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
@ -29,6 +30,7 @@ Orbit::Application.routes.draw do
post "/store/confirmation" => "store_api#confirmation" post "/store/confirmation" => "store_api#confirmation"
post "/store/install_module" => "store_api#install_module" post "/store/install_module" => "store_api#install_module"
post "/store/uninstall_module" => "store_api#uninstall_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".
@ -196,6 +198,7 @@ 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

View File

@ -13,6 +13,7 @@ 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
if @belong_module_app.store_permission_granted
concat content_tag :h4, I18n.t(@head_label) concat content_tag :h4, I18n.t(@head_label)
concat (content_tag :ul, class: "nav nav-list" do concat (content_tag :ul, class: "nav nav-list" do
@context_links.sort_by {| obj | obj.priority}.map{ |link| @context_links.sort_by {| obj | obj.priority}.map{ |link|
@ -22,6 +23,7 @@ module SideBarRenderer
end end
end end
end end
end
def render_head(request, params, user,current_module_app, available_for) def render_head(request, params, user,current_module_app, available_for)
@belong_module_app = get_module_app @belong_module_app = get_module_app
@ -33,11 +35,19 @@ 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
if @belong_module_app.store_permission_granted
link_to Rails.application.routes.url_helpers.send(@head_link) do link_to Rails.application.routes.url_helpers.send(@head_link) do
content_tag :span do content_tag :span do
content_tag(:i, nil, class: @icon_class) content_tag(:i, nil, class: @icon_class)
end end
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
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?
if @module_app.store_permission_granted || params["controller"] == "admin/authorizations"
check_user_can_use 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