diff --git a/Gemfile b/Gemfile index a63c509..223395e 100644 --- a/Gemfile +++ b/Gemfile @@ -31,7 +31,8 @@ gem 'nokogiri' gem 'httparty' #database -gem 'mongoid', github: "mongoid/mongoid" +# gem 'mongoid', github: "mongoid/mongoid" +gem 'mongoid', '~> 4.0.2' #file uploading and carrierwave gem "mini_magick", "3.5.0" diff --git a/app/assets/images/default-site-logo.png b/app/assets/images/default-site-logo.png new file mode 100644 index 0000000..56bef4b Binary files /dev/null and b/app/assets/images/default-site-logo.png differ diff --git a/app/assets/javascripts/admin/store_manager.js b/app/assets/javascripts/admin/store_manager.js index 42a2292..c92a3b6 100644 --- a/app/assets/javascripts/admin/store_manager.js +++ b/app/assets/javascripts/admin/store_manager.js @@ -138,7 +138,7 @@ var StoreManager = function(section){ "url" : "/admin/store/check_credentials" }).done(function(status){ if(status.success == true){ - resendEmail(); + authorizeAllModules(); }else if(status.success == false){ waitForStoreResponseCount++; if(waitForStoreResponseCount > 5){ @@ -152,6 +152,22 @@ var StoreManager = function(section){ }).fail(showError); } + var authorizeAllModules = function(){ + loadingAreaStatus.text("Authorizing default modules."); + $.ajax({ + "type" : "post", + "dataType" : "json", + "url" : "/admin/store/authorize_default_modules" + }).done(function(status){ + if(status.success == true){ + resendEmail(); + }else if(status.success == false){ + loadingArea.find("img").hide(); + loadingAreaStatus.text(data.message); + } + }).fail(showError); + } + var resendEmail = function(){ loadingArea.find("img").show(); loadingAreaStatus.text("Sending verification email."); diff --git a/app/assets/javascripts/basic/orbit_js_1.0.1.js b/app/assets/javascripts/basic/orbit_js_1.0.1.js index c5925cd..69a026a 100644 --- a/app/assets/javascripts/basic/orbit_js_1.0.1.js +++ b/app/assets/javascripts/basic/orbit_js_1.0.1.js @@ -291,6 +291,7 @@ if($.support.touch) { $el.find('a').removeAttr('href'); }; $el.on(mouseenterEvent, function(e) { + $sidebar.addClass('on') $block.siblings().removeClass('show').end().eq($(this).index()).addClass('show'); $arrow.stop(true, false).animate({ top: ($(this).position().top+$(this).height()/2)-$arrowHeightFormat+$('.scroller').position().top, @@ -346,6 +347,7 @@ if($.support.touch) { $el.eq($blockIndex).hasClass('active') ? '':$el.eq($blockIndex).children('span').addClass('hover'); }, mouseleave: function() { + $sidebar.removeClass('on'); $block.removeClass('show'); if(!$sidebarState || !$el.hasClass('active')) { $blockList.css({'width': 0}); diff --git a/app/assets/javascripts/ckeditor/config.js.erb b/app/assets/javascripts/ckeditor/config.js.erb index 06c2ec9..79fd447 100644 --- a/app/assets/javascripts/ckeditor/config.js.erb +++ b/app/assets/javascripts/ckeditor/config.js.erb @@ -5,11 +5,14 @@ CKEDITOR.editorConfig = function( config ) { config.uiColor = '#e6e6e6'; - config.language = 'zh'; + config.defaultLanguage = "en"; + config.language = '<%= (I18n.locale.to_s == "zh_tw" || I18n.locale.to_s == "zh_cn" ? "zh" : I18n.locale.to_s) %>'; config.height = 400; config.resize_minHeight = 400; config.toolbarCanCollapse = true; config.allowedContent = true; + config.pasteFromWordRemoveFontStyles=false; + config.pasteFromWordRemoveStyles=false; config.plugins = 'dialogui,dialog,about,a11yhelp,dialogadvtab,basicstyles,blockquote,clipboard,button,panelbutton,panel,floatpanel,colorbutton,colordialog,templates,menu,contextmenu,resize,toolbar,elementspath,enterkey,entities,popup,filebrowser,find,image,fakeobjects,floatingspace,listblock,richcombo,font,format,horizontalrule,htmlwriter,iframe,wysiwygarea,indent,indentblock,indentlist,justify,menubutton,link,list,liststyle,magicline,maximize,newpage,pastetext,pastefromword,removeformat,selectall,showblocks,showborders,sourcearea,specialchar,scayt,stylescombo,tab,table,tabletools,undo,wsc,youtube,codemirror'; diff --git a/app/assets/javascripts/group.js b/app/assets/javascripts/group.js index 8cb3f76..f60bf95 100644 --- a/app/assets/javascripts/group.js +++ b/app/assets/javascripts/group.js @@ -7,47 +7,133 @@ var group = { // Detect and change the top position of the cycle navs cycleFix: function() { - if( doc.querySelectorAll( ".group-post-banner-image").length >= 1 ) { - var imgs = doc.querySelectorAll( ".group-post-banner-image" ), - cycleNav = doc.querySelectorAll( ".cycle-nav" ), - len = cycleNav.length, - i = -1; + if (doc.querySelectorAll(".group-show-post-banner-image").length >= 1) { + var imgs = doc.querySelectorAll(".group-show-post-banner-image"), + cycleNav = doc.querySelectorAll(".cycle-nav"), + len = cycleNav.length, + i = -1; - // Hide the navs when there's noly one slide - if( imgs.length <= 1 ) { - for( i = 0; i < len; i++ ) { - cycleNav[ i ].classList.add( "hide" ); - } - } - - } else if ( doc.querySelectorAll( ".group-post-banner-image").length === 0 && doc.querySelector( ".group-post-image-wrap" ) ) { - doc.querySelector( ".group-post-image-wrap").classList.add( "hide" ); - } + + // Hide the navs when there's noly one slide + if (imgs.length <= 1) { + for (i = 0; i < len; i++) { + cycleNav[i].classList.add("hide"); + } + } + + } else if (doc.querySelectorAll(".group-show-post-banner-image").length === 0 && doc.querySelector(".group-show-post-image-wrap")) { + doc.querySelector(".group-show-post-image-wrap").classList.add("hide"); + } }, // Create scroll effect (with css) - scrollEffect: function() { - if( doc.querySelector( ".group-page") ) { - var page = doc.querySelector( ".group-page" ), - wrap = doc.querySelector( ".group-page-banner-image-wrap" ), - scrollClass = "scroll"; + scrollEffect: function(el) { + var wrap = doc.querySelector(el), + scrollClass = "scroll"; - // Use pageYOffset to get the Y positoin and add scroll on it, the animation - // is done by css transition - window.addEventListener( "scroll", function() { - if( window.pageYOffset !== 0 ) { - page.classList.add( scrollClass ); - } else { - page.classList.remove( scrollClass ); + // Use pageYOffset to get the Y positoin and add scroll on it, the animation + // is done by css transition + if (el) { + window.addEventListener("scroll", function() { + if (window.pageYOffset > 0) { + wrap.classList.add(scrollClass); + } else { + wrap.classList.remove(scrollClass); + } + }, false); } - }, false); - } + }, + // Equal height for card + equalHeight: function(el) { + var bigbrother = -1, + $el = $(el); + + $el.each(function() { + bigbrother = bigbrother > $(this).height() ? bigbrother : $(this).height(); + }); + + $el.each(function() { + $(this).height(bigbrother); + }); + }, + // We want to place a dropdown in group-post-item, but link cannot be nested, hance this fix + makePostClick: function() { + var postLink = doc.querySelectorAll('.group-post-link'); + + if (postLink) { + Array.prototype.forEach.call(postLink, function(item) { + item.parentNode.classList.add('clickable'); + item.parentNode.addEventListener('click', function(e) { + window.location.href = item.href; + }); + }); + } + }, + // Bootstrap dropdown is too much of a hassle, using this instead + makeDropdown: function(container, toggle, dropdown, kls) { + var $container = $(container), + $toggle = $container.find(toggle), + $dropdown = $container.find(dropdown), + klass = 'open'; + + $container.on('click', '.toggle', function(e) { + if ($(this).hasClass(klass)) { + $(toggle).removeClass(klass); + $(dropdown).removeClass(klass); + } else { + $(toggle).removeClass(klass); + $(dropdown).removeClass(klass); + $(this) + .addClass(klass) + .next(dropdown) + .addClass(klass) + } + return false; + + }); + + $(document.body).on('click', function() { + $(toggle).removeClass(klass) + $(dropdown).removeClass(klass); + }); + }, + + // Third-party plugin settings + plugins: function() { + // WOWjs + if (typeof window.WOW !== 'undefined') { + new WOW().init(); + } } } // When DOM is completely loaded, execute these functions - document.addEventListener( "DOMContentLoaded", function( event ) { - group.cycleFix(); - group.scrollEffect(); + document.addEventListener("DOMContentLoaded", function(event) { + + if (doc.querySelector('.group-post')) { + group.scrollEffect('.group-post'); + group.makeDropdown('.group-post', '.group-post-dropdown-toggle', '.group-post-dropdown'); + } + + if (doc.querySelector('.group-card')) { + group.makeDropdown('.group-public', '.group-card-dropdown-toggle', '.group-card-dropdown'); + } + + if (doc.querySelector('.group-index')) { + group.makeDropdown('.group-index', '.group-card-dropdown-toggle', '.group-card-dropdown'); + } + + if (doc.querySelector('.group-show-post')) { + group.makeDropdown('.group-show-post', '.group-show-post-dropdown-toggle', '.group-show-post-dropdown'); + } + + if (doc.querySelector('.group-member')) { + group.scrollEffect('.group-member'); + } + + group.cycleFix(); + group.equalHeight('.group-card-inner'); + group.equalHeight('.group-admin-edit-image-item'); + group.plugins(); }); })(); diff --git a/app/assets/javascripts/validator.js b/app/assets/javascripts/validator.js index dc19069..1318246 100644 --- a/app/assets/javascripts/validator.js +++ b/app/assets/javascripts/validator.js @@ -33,6 +33,9 @@ var FormValidator = function(form){ return re.test(value); }, url : function(value){ + if(value == "#"){ + return true; + } var reg = new RegExp(/https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/); return reg.test(value); } diff --git a/app/assets/stylesheets/basic/global.css b/app/assets/stylesheets/basic/global.css index c22a181..9af000d 100644 --- a/app/assets/stylesheets/basic/global.css +++ b/app/assets/stylesheets/basic/global.css @@ -49,7 +49,7 @@ input:focus::-webkit-input-placeholder { color: transparent; } body { - background-color: #F3F3F3; + background-color: #f3f3f3; font-family: 'Chivo'; } body.modalBlur > nav, @@ -319,6 +319,18 @@ legend { background-color: rgba(0, 136, 204, .6); } +/* sidebar on */ +#sidebar.on ~ #main-wrap .fc-border-separate { + table-layout: fixed; +} + +#sidebar.on ~ #main-wrap .fc-view-month .fc-day-header { + width: auto !important; +} + +#sidebar.on ~ #main-wrap .fc-view-agendaWeek .fc-widget-header.fc-last { + width: 15px !important; +} /* Main Wrap */ #main-wrap { @@ -779,6 +791,15 @@ legend { display: block; } +.simple-date-picker input:first-child { + margin-right: 3px; +} + +.simple-date-picker select { + margin-right: 3px; +} + + /* IE go die */ :root #sidebar .sub-nav-block:before { display: block\9; diff --git a/app/assets/stylesheets/basic/orbit_bar.css.erb b/app/assets/stylesheets/basic/orbit_bar.css.erb index 7ce707a..aab9c6a 100644 --- a/app/assets/stylesheets/basic/orbit_bar.css.erb +++ b/app/assets/stylesheets/basic/orbit_bar.css.erb @@ -3,7 +3,7 @@ left: -10px; right: -10px; height: 40px; - z-index: 1041; + z-index: 1040; position: fixed; margin-bottom: 0; } @@ -16,7 +16,7 @@ background-repeat: no-repeat; background-image: url('<%= asset_path 'orbit-logo.svg' %>'); - /* For Suck IE */ + /* For IE */ background-image: url('<%= asset_path 'orbit-logo.png' %>'); } #orbit-bar.navbar .nav > li > a { @@ -318,9 +318,9 @@ } } -@media (max-width: 540px) { +@media (max-width: 640px) { #orbit-bar .orbit-bar-search-sign-language #search input[type="search"] { - width: 130px; + width: 100px; } } diff --git a/app/assets/stylesheets/group_admin.css.scss b/app/assets/stylesheets/group_admin.css.scss deleted file mode 100644 index 4beb145..0000000 --- a/app/assets/stylesheets/group_admin.css.scss +++ /dev/null @@ -1,107 +0,0 @@ -@charset "utf-8"; - -@import url(http://fonts.googleapis.com/css?family=Maven+Pro); - -@import url(http://fonts.googleapis.com/css?family=Roboto); - -// Font stacks -$main-font: "Maven Pro", "微軟正黑體" sans-serif; -$paragraph-font: "Roboto", "微軟正黑體", sans-serif; -$gray: #f3f3f3; -$dark-gray: #aaaaaa; -$light-gray: #cdcdcd; -$white: white; -$light-black: #353535; -$black: black; -$green: #4ad976; -$blue: #4171d5; -$red: #c71932; -$blue-green: #00acee; -$group-page-bar-color: #171717; - -// Transition units -$fast: 0.3s; -$normal: 0.6s; -$slow: 1s; - -// Border radius units -$general: 0.25rem; - -// General style -body { - background: $gray; - font-family: $main-font; -} - -// Override and resolve the conflict with main-form.css for that I need RWD support for this page -.main-forms fieldset .input-area .controls textarea { - max-width: none; -} - -// Override select2 styles, I need this evil power -#main-wrap { - .select2-container-multi { - margin-right: 0.9375rem; - min-width: 200px; - .select2-choices { - padding: 8px 0.5rem 6px; - border-radius: $general; - } - .select2-search-choice { - padding: 10px 1.75rem 10px 0.7rem; - border-color: lighten($light-gray, 5%); - background: $white; - > div { - &:before { - content: "\F007"; - font-family: FontAwesome; - display: inline-block; - font-size: 0.9375rem; - color: $blue; - margin: 0 0.5rem 0 0; - } - } - } - .select2-search-choice-close { - right: 15px; - left: auto; - &:before { - content: "\f057"; - font-family: FontAwesome; - position: absolute; - cursor: pointer; - left: 6px; - top: 6px; - font-size: 0.9375rem; - color: $dark-gray; - } - &:hover { - &:before { - color: $red; - } - } - } - } -} - -.wrap-inner { - .upload-status-notice { - position: fixed; - right: 1rem; - top: 4rem; - color: $white; - padding: 16px 1.375rem; - background-color: $blue; - border-radius: $general; - font-size: 0.8125rem; - box-shadow: 0px 0px 16px 3px rgba(0, 0, 0, 0.2); - -webkit-animation-duration: .3s; - animation-duration: .3s; - z-index: 3000; - } -} - -.img-avatar { - width: 50px; - height: 50px; -} \ No newline at end of file diff --git a/app/assets/stylesheets/group_show.css.scss b/app/assets/stylesheets/group_show.css.scss deleted file mode 100644 index dad398e..0000000 --- a/app/assets/stylesheets/group_show.css.scss +++ /dev/null @@ -1,765 +0,0 @@ -@charset "utf-8"; - -@import url(http://fonts.googleapis.com/css?family=Maven+Pro); - -@import url(http://fonts.googleapis.com/css?family=Roboto); - -// Font stacks - -$main-font: "Maven Pro", "微軟正黑體" sans-serif; -$paragraph-font: "Roboto", "微軟正黑體", sans-serif; -$gray: #f3f3f3; -$dark-gray: #aaaaaa; -$light-gray: #cdcdcd; -$white: white; -$light-black: #353535; -$black: black; -$green: #4ad976; -$blue: #4171d5; -$red: #c71932; -$blue-green: #00acee; -$group-page-bar-color: #171717; - -// Transition units -$fast: 0.3s; -$normal: 0.6s; -$slow: 1s; - -// Border radius units -$general: 0.25rem; - -// General style -body { - background: $gray; - font-family: $main-font; -} - -*, -*:before, -*:after { - box-sizing: border-box; -} - -h1, h2, h3, h4, h5, h6, label, legend { - font-family: $main-font; -} - -img { - width: 100%; - max-width: 100%; - height: auto; -} - -a { - text-decoration: none; -} - -a:hover, a:visited { - text-decoration: none; -} - -// General classes - -.screen-reader { - position: absolute; - top: -9999px; - left: -9999px; -} - -// Buttons -.button { - padding: 8px .75rem; - color: $black; - border: none; - border-radius: 15rem; - background: $gray; -} - -.button-default { - color: $blue; - background-color: transparent; - border: 2px solid $blue; - transition: $fast all; - &:hover { - color: $white; - background-color: $blue; - } -} - -.button-activated { - color: #fff; - background-color: $green; -} - -.button-primary { - color: $white; - background-color: $blue; - transition: $fast all; - &:hover { - color: $white; - background-color: darken($blue, 15%); - } -} - -// Button group -.button-group { - display: inline-block; - list-style: none; - > .button-group-common { - display: inline-block; - } - > .button:first-child { - border-radius: 15rem 0 0 15rem; - margin-right: -4px; - } - > .button:last-child { - border-radius: 0 15rem 15rem 0; - } - li { - color: $blue; - background-color: rgba($white, 0.2); - &:hover { - a { - color: $white; - } - } - } - > .active { - color: $white; - background-color: $blue; - a { - color: $white; - } - } -} - -// Tool Tip -.tool-tip-parent { - position: relative; - &:hover { - .tool-tip { - display: block; - } - } -} - -.tool-tip { - padding: 10px 0.75rem; - border-radius: .2rem; - color: $white; - background: rgba($black, 0.85); - position: absolute; - left: 0; - bottom: 100%; - z-index: 150; - display: none; - &:after { - border: 5px solid transparent; - border-top-color: rgba($black, 0.85); - content: ""; - position: absolute; - left: 10px; - bottom: -10px; - } - &.right { - left: auto; - right: 0; - &:after { - left: auto; - right: 10px; - } - } -} - -.topnav { - display: none; -} - -// breadcrumb -.breadcrumb { - padding-left: 0; - margin: 0; - background: none; - > li { - text-shadow: none; - font-size: 13px; - } -} - -// dropzone - -.dropzone-pool { - border: 2px dashed $blue; - margin-bottom: 16px; - font-family: $paragraph-font; - font-size: 0.9375rem; - color: $dark-gray; - margin-right: 1rem; - border-radius: $general; -} - -// overriding member css -#main-wrap {} - -// Group page -#main-wrap { - padding-top: 0; -} - -.group-page-banner-wrap { - height: 280px; - overflow: hidden; - position: fixed; - top: 0; - left: 0; - width: 100%; - transition: $fast all; - z-index: 500; - background: $black; -} - -.group-page-banner-image-wrap { - background-color: $black; - text-align: center; -} - -.group-page-view-switch { - position: absolute; - top: 4rem; - right: 2rem; -} - -.group-page-banner-image { - width: auto; - max-width: 100%; - height: auto; -} - -.group-page-bar { - padding: 0 2rem 20px 6rem; - text-align: center; - background: rgba($group-page-bar-color, 0.95); - width: 100%; - position: absolute; - left: 0; - bottom: 0; -} - -.group-page-view-switch-in-bar { - display: none; - .button { - padding: 3px .75rem; - } -} - -.group-page-title { - margin-bottom: 12px; - padding: 6px 0; - color: $white; - font-family: $main-font; - font-weight: normal; -} - -.group-page-section { - overflow: hidden; - max-width: 1150px; - margin: auto; - padding: 300px 2rem 30px; -} - -.gorup-page-info-wrap { - font-size: .9rem; - padding: 6px 1rem; - display: block; - float: right; - cursor: pointer; -} - -.group-page-description-wrap { - clear: both; -} - -.gorup-page-info-wrap { - margin-bottom: 10px; - text-align: right; -} - -.group-page-status-wrap { - font-size: .75rem; - float: right; - padding: 2px 0.5rem; - margin-bottom: 10px; -} - -.group-page-status-wrap.close-eye { - margin-left: 5px; - background: $red; -} - -.group-page-description-wrap { - margin-bottom: 15px; - padding: 16px 1.2rem 16px; - border-radius: .2rem; - box-shadow: inset 0 0 8px $dark-gray; -} - -.group-page-description { - clear: both; - text-align: justify; -} - -.group-page-post { - clear: both; - margin-bottom: 40px; - padding: 28px 1.5rem; - text-align: center; - border-radius: $general; - background: $white; - box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2); - transition: $normal box-shadow; -} - -.group-page-post-link { - text-decoration: none; - color: $black; -} - -.group-page-post:hover { - box-shadow: 0 1px 25px 0 rgba(0, 0, 0, 0.2); -} - -.group-page-post-link:hover { - text-decoration: none; - color: $black; -} - -.group-page-post-image-wrap { - display: inline-block; - margin-bottom: 12px; -} - -.group-page-post-image { - width: 100%; - max-width: 100%; - height: auto; - margin-top: 12px; - border: 2px solid $gray; - border-radius: $general; -} - -.group-page-post-content { - margin-bottom: .5rem; - color: $dark-gray; - overflow: hidden; -} - -.group-page-post-title { - font-size: 1.5rem; - font-weight: normal; - line-height: 1; - margin-bottom: 12px; - color: $light-black; - font-family: $paragraph-font; -} - -.group-page-post-sub-wrap { - display: inline-block; -} - -.group-page-post-meta-wrap { - color: $dark-gray; -} - -.group-page-post-author, -.group-page-post-sub-wrap { - margin-right: .5rem; -} - -.group-page-seen-by { - display: inline-block; -} - -.group-page-seen-by-lead { - font-style: normal; -} - -// scroll view - -.group-page.scroll { - padding-top: 7rem; - .group-page-banner-wrap { - height: 120px; - } - .group-page-title { - margin-bottom: 0; - font-size: 1.625rem; - line-height: 50px; - } - .group-page-new-post { - margin-top: 18px; - padding: 6px 10px; - } - .group-page-new-post { - display: inline-block; - vertical-align: top; - } - .group-page-view-switch { - position: static; - display: inline-block; - margin: 6px .5rem 0 0; - display: none; - } - .group-page-view-switch-in-bar { - display: inline-block; - margin-top: 18px; - .button { - padding: 4px .75rem; - } - } - .group-page-section { - padding-top: 60px; - } - .btn { - padding: 2px 5px; - } - -} - -.group-page li a { - text-decoration: none; -} - -.group-page-switch-btn { - color: $blue; - &:hover { - color: $white; - } -} - -// 400px -@media screen and (min-width: 25rem) { - .group-page-new-post { - margin: 0 0.625rem 16px; - float: none; - display: inline-block; - } - .group-page-view-switch-in-bar { - float: none; - margin: 0; - .button { - padding: 6px .75rem; - } - } -} - -// 600px - -@media screen and (min-width: 37.5rem) { - .group-page-post { - margin-bottom: 35px; - text-align: left; - } - .group-page-post-image-wrap { - float: left; - width: 12%; - min-width: 100px; - margin-right: 4%; - max-height: 140px; - overflow: hidden; - } - .group-page-post-content-wrap { - float: left; - width: 70%; - font-family: $paragraph-font; - } -} - -/* 760px */ - -@media screen and (min-width: 47.5rem) { - .group-page-post-content-wrap { - width: 70%; - } - .group-page-bar { - text-align: left; - } - .group-page-title { - display: inline-block; - margin: 0; - padding: 0; - line-height: 70px; - transition: .6s all; - } - .group-page-new-post { - float: right; - margin: 18px 0 0 0; - } - .group-page-view-switch-in-bar { - margin: 18px 8px 0 0; - float: right; - li { - padding: 8px .75rem; - } - } - .group-page-view-switch { - float: right; - } -} - -// 900px -@media screen and (min-width: 56.25rem) { - .group-page-post-content-wrap { - width: 80%; - } -} - -// Group post -.group-post { - padding: 50px 2rem 30px; - max-width: 1150px; - margin: auto; -} - -.group-post-meta { - margin-bottom: 15px; -} - -.group-post-title { - font-family: $main-font; - float: left; - width: 90%; - font-weight: normal; - line-height: 1; -} - -.group-post-avatar-wrap { - float: right; - padding: 0 0.375rem 0 0; -} - -.group-post-avatar-username-toggle { - display: block; -} - -.group-post-avatar { - width: 60px; - height: 60px; - border-radius: 50%; -} - -.group-post-username { - display: none; - top: 100%; - padding-bottom: 30px; - right: 0; - left: auto; - white-space: nowrap; - font-size: 0.75rem; - &:after { - border-top-color: transparent; - border-bottom-color: rgba(0, 0, 0, 0.85); - top: -10px; - left: auto; - right: 20px; - bottom: auto; - } -} - -.group-post-postdate { - display: inline-block; - clear: both; -} - -.group-post-image-wrap { - position: relative; - background: $black; - &:hover { - .cycle-nav { - opacity: 1; - } - .group-post-cycle-prev { - left: 2rem; - } - .group-post-cycle-next { - right: 2rem; - } - } -} - -.group-post-image-list { - margin: 0; - padding: 0; - list-style: none; -} - -.cycle-nav { - font-size: 1.2rem; - position: absolute; - top: 50%; - margin-top: -1.25rem; - line-height: 1.5rem; - color: $white; - z-index: 500; - width: 2.5rem; - height: 2.5rem; - cursor: pointer; - -webkit-transition: $normal all; - transition: $normal all; - text-align: center; - background-color: rgba($black, 0.8); - border-radius: 50%; - opacity: 0; - &:hover { - background-color: $blue; - } - .group-post-cycle-nav-icon { - line-height: 2.6rem; - } -} - -.group-post-cycle-prev { - left: 0; -} - -.group-post-cycle-next { - right: 0; -} - -.group-post-content { - font-family: $main-font; - font-size: .8125rem; - margin: 15px 0; -} - -.group-post-attachment-wrap { - float: left; - width: 80%; - margin: 10px 0 25px; -} - -.group-post-attachments { - a { - margin-bottom: 10px; - } -} - -.group-post-attachment-file-format { - margin-right: 8px; -} - -.group-post-seen-by { - float: right; - cursor: pointer; - &:hover { - .group-post-seen-by-names { - display: block; - white-space: nowrap; - } - } - .group-post-seen-by-name { - display: block; - color: #fff; - white-space: nowrap; - } -} - -.group-post-seen-by-lead { - margin-right: 4px; - font-style: normal; -} - -.group-post-seen-by-names { - display: none; -} - -.group-post-seen-by-count { - border-radius: 50%; - background: $gray; - display: inline-block; -} - -// Comment section -.comments { - clear: both; -} - -.comments .group-post-respond-comment { - width: 100%; - height: 60px; - padding: 0 1rem; - box-shadow: none; -} - -.group-post-respond-submit { - font-size: 0.75rem; -} - -.group-post-comment-list { - margin: 0; - padding: 0; - list-style: none; -} - -.group-post-comment-wrap { - overflow: hidden; - margin-bottom: 25px; - padding-bottom: 8px; - border-bottom: 1px solid lighten($light-gray, 12%); -} - -.group-post-no-comment { - font-size: 0.8125rem; -} - -.group-post-comment-avatar { - float: left; - width: 60px; - margin-right: 1rem; - img { - width: 60px; - height: 60px; - border-radius: 50%; - } -} - -.group-post-comment-author { - font-size: .9375rem; - float: left; -} - -.group-post-comment-time { - float: right; -} - -.group-post-comment-content { - clear: both; -} - -.group-post-comment-body { - float: left; - width: 80%; -} - -// 260px -@media screen and (min-width: 16.25rem) { - .group-post-attachments { - a { - display: inline-block; - text-overflow: ellipsis; - } - } - .group-post-attachments-file-name { - display: inline-block; - text-overflow: ellipsis; - overflow: hidden; - vertical-align: middle; - } -} - -@media screen and (min-width: 370px) { - .group-post-comment-body { - width: 60%; - } -} - -// group new \ No newline at end of file diff --git a/app/assets/stylesheets/lib/group/_group-category.scss b/app/assets/stylesheets/lib/group/_group-category.scss new file mode 100644 index 0000000..4784d3f --- /dev/null +++ b/app/assets/stylesheets/lib/group/_group-category.scss @@ -0,0 +1,110 @@ +@charset "utf-8"; +@import "group-variables"; + +// Group category page +.group-category { + margin-bottom: 16px; +} + +.group-category-tab { + .group-category-tab-nav { + font-size: 0.8125rem; + padding: 10px 12px; + } + + .active { + .group-category-tab-nav { + background-color: $blue; + + &:hover { + background-color: lighten($blue, 5%); + } + } + } +} + +.group-category-item { + float: left; + margin: 0 0.625rem 1rem 0; + background-color: $green; + + &:hover { + background-color: lighten($green, 5%); + } + + .group-category-tag-icon { + font-size: 1rem; + vertical-align: middle; + } + + a { + font-size: 0.8125rem; + font-family: $sub-font; + color: $white; + } +} + +.group-category-request { + .group-category-item { + background-color: darken($dark-gray, 25%); + } +} + +.group-category-tab-content { + border-top: 1px solid #ddd; + padding: 16px 0; + overflow: visible; +} + +.group-category-controls { + margin-left: 8px; + a { + padding: 2px 0.4rem; + color: $white; + display: inline-block; + border-radius: 50%; + } + .group-category-approve { + background-color: $green; + } + + .group-category-reject { + background-color: $red; + } +} + +.group-category-approve-tootip { + white-space: nowrap; +} + +.card-ownership { + border-top: 6px solid darken($gray, 7%); + + &:before { + border-top-left-radius: $general; + content: ""; + height: 6px; + width: 80%; + position: absolute; + left: 0; + top: -6px; + } +} + +.card-owner { + &:before { + background-color: lighten($blue, 10%); + } +} + +.card-public { + &:before { + background-color: lighten($green, 10%); + } +} + +.card-member { + &:before { + background-color: lighten($red, 20%); + } +} \ No newline at end of file diff --git a/app/assets/stylesheets/lib/group/_group-classes.scss b/app/assets/stylesheets/lib/group/_group-classes.scss new file mode 100644 index 0000000..1813deb --- /dev/null +++ b/app/assets/stylesheets/lib/group/_group-classes.scss @@ -0,0 +1,306 @@ +@charset "utf-8"; +@import "group-variables"; + + +// Genernal classes and modules +.screen-reader { + position: absolute; + top: -9999px; + left: -9999px; +} + +.img-reponsive { + max-width: 100%; + width: 100%; + height: auto; +} + +.wrapper { + margin: auto; + max-width: $boundary; +} + +.radius { + border-radius: $general; +} + +// Buttons +.button { + padding: 8px .75rem; + color: $black; + border: none; + border-radius: 15rem; + background: $gray; +} + +.button-default { + color: $blue; + background-color: transparent; + border: 2px solid $blue; + transition: $fast all; + + &:hover { + color: $white; + background-color: $blue; + } + + &.gray { + color: $dark-gray; + border: 2px solid $dark-gray; + &:hover { + color: $white; + background-color: $dark-gray; + } + } +} + +.button-activated { + color: #fff; + background-color: $green; +} + +.button-primary { + color: $white; + background-color: $blue; + transition: $fast all; + + &:hover { + color: $white; + background-color: darken($blue, 15%); + } +} + +.button-small { + padding: 4px 0.625rem; + font-size: 0.75rem; +} + +.button-large { + padding: 14px 1.3rem; +} + +// Button group +.button-group { + display: inline-block; + list-style: none; + + > .button-group-common { + display: inline-block; + } + + > .button:first-child { + border-radius: 15rem 0 0 15rem; + margin-right: -4px; + } + + > .button:last-child { + border-radius: 0 15rem 15rem 0; + } + + li { + color: $blue; + background-color: rgba($white, 0.2); + + &:hover { + a { + color: $white; + } + } + } + + > .active { + color: $white; + background-color: $blue; + + a { + color: $white; + } + } +} + +// Tool Tip +.tool-tip-parent { + position: relative; + + &:hover { + .tool-tip { + display: block; + } + } +} + +.tool-tip { + padding: 10px 0.75rem; + border-radius: .2rem; + color: $white; + background: rgba($black, 0.85); + position: absolute; + left: 0; + bottom: 100%; + z-index: 150; + display: none; + + &:after { + border: 5px solid transparent; + border-top-color: rgba($black, 0.85); + content: ""; + position: absolute; + left: 10px; + bottom: -10px; + } + + &.right { + left: auto; + right: 0; + + &:after { + left: auto; + right: 10px; + } + } + + &.bottom { + top: 100%; + bottom: auto; + + &:after { + top: -10px; + bottom: auto; + border-top-color: transparent; + border-bottom-color: rgba(0, 0, 0, 0.85); + } + } + + &.nowrap { + white-space: nowrap; + } +} + +.action { + position: relative; + + .toggle { + border: none; + border-left: 1px solid darken($gray, 6%); + border-bottom: 1px solid darken($gray, 6%); + background: none; + padding: 2px 8px; + transition: $fast all; + + &:hover, &.open { + border-color: $blue; + background: $blue; + + .caret { + border-top-color: $white; + } + } + } + + &:hover, &.open { + border-radius: $general; + background: $blue; + + .caret { + border-top-color: $white; + } + } + + .caret { + border-top-color: darken($gray, 30%); + vertical-align: middle; + } + + .action-dropdown { + display: none; + position: absolute; + right: 0; + top: 102%; + list-style: none; + margin: 0; + padding: 0; + background: $white; + border: 1px solid darken($gray, 6%); + border-radius: $general; + box-shadow: 0 1px 3px 0 rgba($black, 0.2); + + a { + display: block; + padding: 3px 12px; + white-space: nowrap; + + &:hover { + color: $white; + background-color: $blue; + } + } + + &.open { + display: block; + } + } +} + +.card { + border-radius: $general; + background: $white; + box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2); + transition: $normal box-shadow; + + &:hover { + box-shadow: 0 1px 25px 0 rgba(0, 0, 0, 0.2); + } +} + +// responsive grid +.square { + float: left; + position: relative; + width: 20%; + padding-bottom: 20%; + margin: 1%; + background-color: $white; + overflow: hidden; + .content { + position: absolute; + height: 90%; + width: 90%; + padding: 5%; + .rs { + width: auto; + height: auto; + max-height: 90%; + max-width: 100%; + } + } + .table { + display: table; + width: 100%; + height: 100%; + } + .table-cell { + display: table-cell; + vertical-align: middle; + } + +} + +// avatar +.admin-avatar { + width: 60px; + height: 60px; + max-width: none; + border-radius: $round; +} + +// breadcrumb +.breadcrumb { + padding-left: 0; + margin: 0; + background: none; + + > li { + text-shadow: none; + font-size: 13px; + } +} \ No newline at end of file diff --git a/app/assets/stylesheets/lib/group/_group-index.scss b/app/assets/stylesheets/lib/group/_group-index.scss new file mode 100644 index 0000000..b9d7dfa --- /dev/null +++ b/app/assets/stylesheets/lib/group/_group-index.scss @@ -0,0 +1,227 @@ +@charset "utf-8"; +@import "group-variables"; + +// Group index and public +#main-wrap .wrap-inner { + padding: 80px 20px 20px; +} + +.group-public, +.group-index { + margin: auto; + max-width: 1500px; +} + +.group-card { + list-style: none; + margin-bottom: 20px; +} + +.group-card-action { + position: absolute; + right: 12px; + top: 6px; + z-index: 200; + + .group-card-dropdown-toggle { + border: 1px solid darken($gray, 6%); + border-radius: $general; + + &:hover { + border-radius: $general; + } + } + .group-card-dropdown {} +} + +.group-card-inner { + padding: 2.6rem 0.8rem; + position: relative; + min-height: 280px; + + hr { + margin: 8px 0 10px 0; + } +} + +.group-avatar { + position: relative; + width: 100%; + height: 200px; + overflow: hidden; + background: $dark-gray; + z-index: 100; + + &:hover .action { + z-index: 600; + opacity: 1; + } + + img { + width: 100%; + height: auto; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 500; + margin: auto; + } + + .action { + opacity: 0; + background: rgba($blue, 0.9); + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + margin: auto; + } + + .edit { + color: $white; + font-size: 25px; + position: absolute; + top: 50%; + left: 45%; + transform: translate(-50%, -50%); + margin: auto; + } + + .trash { + color: $red; + font-size: 25px; + position: absolute; + top: 49%; + left: 60%; + transform: translate(-50%, -50%); + margin: auto; + } +} + +.group-info { + overflow: hidden; +} + +.group-mail { + color: $dark-gray; + font-family: $sub-font; +} + +.group-roles { + list-style: none; + margin: 0; + padding: 0; + font-family: $sub-font; + + .label { + font-family: $main-font; + text-transform: capitalize; + text-shadow: none; + } + + .label.private { + background-color: $red; + } + + .label.public { + background-color: #74c25d; + } +} + +.group-privacy { + color: $dark-gray; + margin-bottom: 8px; +} + +.group-description { + overflow: hidden; + max-height: 150px; +} + +.group-name { + margin-bottom: 4px; +} + +// 370px +@media screen and (min-width: 23.125rem) { + .group-index { + width: 90%; + } + + .group-card { + width: 100%; + } +} + +// 600px +@media screen and (min-width: 37.5rem) { + .group-index { + margin-top: 0; + width: 100%; + } + + .group-card { + float: left; + padding: 0 0.5rem; + width: 50%; + + &:nth-child(2n+1) { + clear: both; + padding-left: 0; + } + } +} + +// 900px +@media screen and (min-width: 56.25rem) { + .group-card { + width: 33.3%; + + &:nth-child(2n+1) { + clear: none; + padding-left: 0.5rem; + } + + &:nth-child(3n+1) { + clear: both; + padding-left: 0; + } + } +} + +// 1080px +@media screen and (min-width: 67.5rem) { + .group-card { + width: 25%; + + &:nth-child(3n+1) { + clear: none; + padding-left: 0.5rem; + } + + &:nth-child(4n+1) { + clear: both; + padding-left: 0; + } + } +} + +// 1400px +@media screen and (min-width: 87.5rem) { + .group-card { + width: 20%; + + &:nth-child(4n+1) { + clear: none; + padding-left: 0.5rem; + } + + &:nth-child(5n+1) { + clear: both; + padding-left: 0; + } + } +} \ No newline at end of file diff --git a/app/assets/stylesheets/lib/group/_group-members.scss b/app/assets/stylesheets/lib/group/_group-members.scss new file mode 100644 index 0000000..1cd9670 --- /dev/null +++ b/app/assets/stylesheets/lib/group/_group-members.scss @@ -0,0 +1,154 @@ +@import "group-variables"; + +// Group page +#main-wrap { + padding-top: 0; + .wrap-inner { + // padding: 0; + } +} + +.group-member-banner-wrap { + height: 280px; + overflow: hidden; + position: fixed; + top: 0; + left: 0; + width: 100%; + transition: $fast all; + z-index: 500; + background: lighten($black, 25%); +} + +.group-member-bar { + padding: 0 2rem 0 6rem; + background: rgba(25, 27, 29, 0.95); + width: 100%; + position: absolute; + left: 0; + bottom: 0; +} + +.group-member-page-title { + margin-bottom: 12px; + padding: 6px 0; + color: $white; + font-family: $main-font; + font-weight: normal; + max-width: 100%; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.group-member-dropdown { + margin: 12px 0; + > button { + padding: 8px 0.75rem; + } + .badge { + margin-left: 4px; + } +} + +.group-member-section { + overflow: hidden; + padding: 220px 2rem 30px; +} + +.group-member-list { + padding: 0; + margin: 0; +} + +.group-member-item { + list-style: none; + padding: 16px 1rem; + margin: 8px 0 12px 0; +} + +.group-member-photo-wrap { + display: inline-block; + vertical-align: top; + margin-right: 0.5rem; +} + +.group-member-meta-wrap { + display: inline-block; + vertical-align: top; + width: 50%; +} + +.group-member-name { + font-size: 0.8125rem; +} + +.group-member-photo { + width: 60px; + height: 60px; + border-radius: $round; +} + +// scroll view + +.group-member.scroll { + padding-top: 2rem; + padding-bottom: 9rem; + + .group-member-page-title { + margin-top: 0; + margin-bottom: 0; + font-size: 1.625rem; + line-height: 50px; + } + + .group-member-banner-wrap { + height: 120px; + } + + .group-member-page-title { + margin-bottom: 0; + font-size: 1.625rem; + line-height: 50px; + } + .group-member-section { + padding-top: 60px; + } +} + + +// 620 +@media screen and (min-width: 38.75rem) { + .group-member-item { + float: left; + margin-right: 1rem; + width: 45%; + } +} + +// 980px + +@media screen and (min-width: 61.25rem) { + .group-member-content-wrap { + width: 70%; + } + + .group-member-item { + width: 30%; + } + + .group-member-page-title { + display: inline-block; + margin: 0; + padding: 0; + line-height: 70px; + transition: .6s all; + } +} + +// 1400px +@media screen and (min-width: 87.5rem) { + .group-member-item { + width: 20%; + } + +} \ No newline at end of file diff --git a/app/assets/stylesheets/lib/group/_group-post.scss b/app/assets/stylesheets/lib/group/_group-post.scss new file mode 100644 index 0000000..b11a1da --- /dev/null +++ b/app/assets/stylesheets/lib/group/_group-post.scss @@ -0,0 +1,394 @@ +@charset "utf-8"; +@import "group-variables"; + +// Group page +#main-wrap { + padding-top: 0; +} + +.group-post-banner-wrap { + height: 280px; + overflow: hidden; + position: fixed; + top: 0; + left: 0; + width: 100%; + transition: $fast all; + z-index: 500; + background: lighten($black, 25%); +} + +.group-post-banner-image-wrap { + background-color: $black; + text-align: center; +} + +.group-post-view-switch { + position: absolute; + top: 4rem; + right: 2rem; +} + +.group-post-banner-image { + width: auto; + max-width: 100%; + height: auto; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + margin: auto; +} + +.group-post-bar { + padding: 0 2rem 0 6rem; + text-align: center; + background: rgba(25, 27, 29, 0.95); + width: 100%; + position: absolute; + left: 0; + bottom: 0; +} + +.group-post-view-switch-in-bar { + display: none; + + .button { + padding: 3px .75rem; + } +} + +.group-post-page-title { + margin-bottom: 12px; + padding: 6px 0; + color: $white; + font-family: $main-font; + font-weight: normal; + max-width: 100%; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} + +.group-post-section { + overflow: hidden; + padding: 300px 2rem 30px; +} + +.breadcrumb { + li { + overflow: hidden; + max-width: 150px; + display: inline-block; + vertical-align: middle; + text-overflow: ellipsis; + white-space: nowrap; + } +} + +.gorup-page-info-wrap { + font-size: .9rem; + padding: 6px 1rem; + display: block; + float: right; + cursor: pointer; +} + +.group-post-description-wrap { + clear: both; +} + +.gorup-page-info-wrap { + margin-bottom: 10px; + text-align: right; +} + +.group-post-status-wrap { + font-size: .75rem; + float: right; + padding: 2px 0.5rem; + margin-bottom: 10px; +} + +.group-post-status-wrap.close-eye { + margin-left: 5px; + background: $red; +} + +.group-post-description-wrap { + margin-bottom: 15px; + padding: 16px 1.2rem 16px; + border-radius: .2rem; + box-shadow: inset 0 0 8px $dark-gray; +} + +.group-post-description { + clear: both; + text-align: justify; +} + +.group-post-member-count, +.group-post-no-member { + background: $blue; + color: $white; + padding: 6px 0.625rem; + border-radius: $general; + &:hover { + background: darken($blue, 10%); + color: $white; + } +} + +.group-post-item { + position: relative; + clear: both; + margin-bottom: 40px; + padding: 28px 1.5rem; + text-align: center; + + &.clickable { + cursor: pointer; + } + + &:hover { + .group-post-title { + color: $blue; + } + } +} + +.group-post-actions { + position: absolute; + right: 0; + top: 0; +} + +.group-post-dropdown-toggle { + &:hover, &.open { + .caret { + } + } + + .caret { + } +} + +.group-post-dropdown { + a { + &:hover { + } + } + + &.open { + } +} + +.group-post-action-hint { + white-space: nowrap; +} + +.group-post-image-wrap { + display: inline-block; + margin-bottom: 12px; +} + +.group-post-image { + width: 100%; + max-width: 100%; + height: auto; + margin-top: 12px; + border: 2px solid $gray; + border-radius: $general; +} + +.group-post-content { + margin-bottom: .5rem; + color: $dark-gray; + overflow: hidden; +} + +.group-post-title { + font-size: 1.5rem; + font-weight: normal; + line-height: 1; + margin-bottom: 12px; + color: $light-black; + font-family: $paragraph-font; +} + +.group-post-sub-wrap { + display: inline-block; +} + +.group-post-meta-wrap { + color: $dark-gray; +} + +.group-post-author, +.group-post-sub-wrap { + margin-right: .5rem; +} + +.group-post-seen-by { + display: inline-block; +} + +.group-post-seen-by-lead { + font-style: normal; +} + +// scroll view + +.group-post.scroll { + padding-top: 7rem; + padding-bottom: 6rem; + + .group-post-banner-wrap { + height: 120px; + } + + .group-post-page-title { + margin-bottom: 0; + font-size: 1.625rem; + line-height: 50px; + } + + .group-post-new-post, + .group-post-join { + margin-top: 12px; + padding: 6px 10px; + } + + .group-post-new-post { + display: inline-block; + vertical-align: top; + } + + .group-post-view-switch { + position: static; + display: inline-block; + margin: 6px .5rem 0 0; + display: none; + } + + .group-post-view-switch-in-bar { + display: inline-block; + margin-top: 12px; + + .button { + padding: 4px .75rem; + } + } + + .group-post-section { + padding-top: 60px; + } + + .btn { + padding: 2px 5px; + } +} + +.group-post li a { + text-decoration: none; + text-align: left; +} + +.group-post-switch-btn { + color: $blue; + + &:hover { + color: $white; + } +} + +// 400px +@media screen and (min-width: 25rem) { + .group-post-new-post, + .group-post-join { + margin: 0 0.625rem 16px; + float: none; + display: inline-block; + } + + .group-post-view-switch-in-bar { + float: none; + margin: 0; + + .button { + padding: 6px .75rem; + } + } +} + +// 600px + +@media screen and (min-width: 37.5rem) { + .group-post-item { + margin-bottom: 35px; + text-align: left; + } + + .group-post-image-wrap { + float: left; + width: 12%; + min-width: 100px; + margin-right: 4%; + max-height: 140px; + overflow: hidden; + } + + .group-post-content-wrap { + float: left; + width: 70%; + font-family: $paragraph-font; + } +} + +/* 760px */ + +@media screen and (min-width: 47.5rem) { + .group-post-content-wrap { + width: 70%; + } + + .group-post-bar { + text-align: left; + } + + .group-post-page-title { + display: inline-block; + margin: 0; + padding: 0; + line-height: 70px; + transition: .6s all; + max-width: 80%; + } + + .group-post-new-post, + .group-post-join { + float: right; + margin: 18px 0 0 0; + } + + .group-post-view-switch-in-bar { + margin: 18px 8px 0 0; + float: right; + + li { + padding: 8px .75rem; + } + } + + .group-post-view-switch { + float: right; + } +} + +// 900px +@media screen and (min-width: 56.25rem) { + .group-post-content-wrap { + width: 80%; + } +} \ No newline at end of file diff --git a/app/assets/stylesheets/lib/group/_group-reset.scss b/app/assets/stylesheets/lib/group/_group-reset.scss new file mode 100644 index 0000000..ddc93aa --- /dev/null +++ b/app/assets/stylesheets/lib/group/_group-reset.scss @@ -0,0 +1,38 @@ +@charset "utf-8"; +@import "group-variables"; + +// General style +body { + background: $gray; + font-family: $main-font; +} + +.group-show-post-respond-comment, +ul, li, div, img { + box-sizing: border-box; +} + +h1, h2, h3, h4, h5, h6, label, legend { + font-family: $main-font; +} + +img { + max-width: 100%; + height: auto; +} + +a { + color: $blue; + text-decoration: none; + &:hover { + color: lighten($blue, 5%); + text-decoration: none; + } +} + +a, button { + &:focus { + outline: none; + } +} + diff --git a/app/assets/stylesheets/lib/group/_group-show-post.scss b/app/assets/stylesheets/lib/group/_group-show-post.scss new file mode 100644 index 0000000..7ab976c --- /dev/null +++ b/app/assets/stylesheets/lib/group/_group-show-post.scss @@ -0,0 +1,308 @@ +@charset "utf-8"; +@import "group-variables"; + +// Group show post +.group-show-post { + padding: 0 2rem 30px; +} + +.group-show-post-meta { + margin-bottom: 15px; +} + +.group-show-post-title { + font-family: $main-font; + float: left; + width: 90%; + font-weight: normal; + line-height: 1; +} + +.group-show-post-avatar-wrap { + float: right; + padding: 0 0.375rem 0 0; +} + +.group-show-post-avatar-username-toggle { + display: block; +} + +.group-show-post-avatar { + width: 60px; + height: 60px; + border-radius: 50%; +} + +.group-show-post-username { + display: none; + top: 100%; + padding-bottom: 30px; + right: 0; + left: auto; + white-space: nowrap; + font-size: 0.75rem; + &:after { + border-top-color: transparent; + border-bottom-color: rgba(0, 0, 0, 0.85); + top: -10px; + left: auto; + right: 20px; + bottom: auto; + } +} + +.group-show-post-postdate { + display: inline-block; + clear: both; +} + +.group-show-post-image-wrap { + position: relative; + background: $black; + overflow: hidden; + &:hover { + .cycle-nav { + opacity: 1; + } + .group-show-post-cycle-prev { + left: 2rem; + } + .group-show-post-cycle-next { + right: 2rem; + } + } +} + +.group-show-post-image-list { + margin: 0; + padding: 0; + list-style: none; +} + +.cycle-nav { + font-size: 1.2rem; + position: absolute; + top: 50%; + margin-top: -1.25rem; + line-height: 1.5rem; + color: $white; + z-index: 500; + width: 2.5rem; + height: 2.5rem; + cursor: pointer; + -webkit-transition: $fast all; + transition: $fast all; + text-align: center; + background-color: rgba($black, 0.8); + border-radius: 50%; + opacity: 0; + &:hover { + background-color: $blue; + } + .group-show-post-cycle-nav-icon { + line-height: 2.6rem; + } +} + +.group-show-post-cycle-prev { + left: 0; +} + +.group-show-post-cycle-next { + right: 0; +} + +.group-show-post-content { + font-family: $main-font; + font-size: .8125rem; + margin: 15px 0; +} + +.group-show-post-attachment-wrap { + float: left; + width: 80%; + margin: 10px 0 25px; + .group-show-post-attachment-file-format { + margin-right: 8px; + vertical-align: middle; + font-size: 1rem; + } +} + +.group-show-post-seen-by { + float: right; + cursor: pointer; + &:hover { + .group-show-post-seen-by-names { + display: block; + white-space: nowrap; + } + } + .group-show-post-seen-by-name { + display: block; + color: #fff; + white-space: nowrap; + } +} + +.group-show-post-seen-by-lead { + margin-right: 4px; + font-style: normal; +} + +.group-show-post-seen-by-names { + display: none; +} + +.group-show-post-seen-by-count { + border-radius: 50%; + background: $gray; + display: inline-block; +} + +// Comment section +.comments { + clear: both; + .group-show-post-respond-comment { + width: 100%; + height: 60px; + padding: 0 1rem; + box-shadow: none; + width: 100%; + } + .group-show-post-avatar { + display: none; + } + +} + +.group-show-post-actions { + position: absolute; + right: 0; + top: 0; +} + +.group-no-permission { + padding-left: 2rem; + background: $red; + color: $white; + padding: 10px 0.75rem; + border-radius: $general; + i { + margin-right: 8px; + } +} +.group-show-post-respond-wrap { + margin-bottom: 16px; +} +.group-show-post-respond-submit { + font-size: 0.875rem; +} + +.group-show-post-comment-list { + margin: 0; + padding: 0; + list-style: none; +} +.group-show-post-comment { + position: relative; + border-radius: 0; + box-shadow: none; + border-bottom: 2px solid $gray; + &:hover { + box-shadow: none; + } +} +.group-show-post-comment-wrap { + overflow: hidden; + padding: 16px 1.25rem; +} + +.group-show-post-no-comment { + font-size: 0.8125rem; +} + + +.group-show-post-comment-avatar { + float: left; + width: 60px; + margin-right: 1rem; + img { + width: 60px; + height: 60px; + border-radius: 50%; + } +} + +.group-show-post-comment-author { + font-size: .9375rem; + float: left; + margin-right: 0.5rem; +} + +.group-show-post-comment-time { + float: left; +} + +.group-show-post-comment-content { + clear: both; +} + +.group-show-post-comment-body { + float: left; + width: 60%; +} + +// 260px +@media screen and (min-width: 16.25rem) { + .group-show-post-attachments { + a { + display: inline-block; + text-overflow: ellipsis; + } + } + .group-show-post-attachments-file-name { + display: inline-block; + text-overflow: ellipsis; + overflow: hidden; + vertical-align: middle; + width: 80px; + white-space: nowrap; + } +} + +// 370px +@media screen and (min-width: 23.125rem) { + .group-show-post-comment-body { + width: 70%; + } +} + +// 800px +@media screen and (min-width: 50rem) { + .group-show-post-comment-body { + width: 85%; + } + .comments { + .group-show-post-avatar { + float: left; + width: 10%; + max-width: 60px; + min-width: 60px; + display: block; + } + .group-show-post-respond-comment { + float: left; + width: 89%; + margin-left: 1%; + } + + } +} + +// 960px +@media screen and (min-width: 60rem) { + .group-show-post-comment-body { + width: 90%; + } +} \ No newline at end of file diff --git a/app/assets/stylesheets/lib/group/_group-variables.scss b/app/assets/stylesheets/lib/group/_group-variables.scss new file mode 100644 index 0000000..223c52e --- /dev/null +++ b/app/assets/stylesheets/lib/group/_group-variables.scss @@ -0,0 +1,36 @@ +@charset "utf-8"; + +// Google fonts +@import url(http://fonts.googleapis.com/css?family=Maven+Pro); + +@import url(http://fonts.googleapis.com/css?family=Roboto); + +// Font stacks +$main-font: "Maven Pro", "微軟正黑體" sans-serif; +$sub-font: "Roboto", "微軟正黑體", sans-serif; +$paragraph-font: "Roboto", "微軟正黑體", sans-serif; + +// Colors +$gray: #f3f3f3; +$dark-gray: #aaaaaa; +$light-gray: #cdcdcd; +$white: white; +$light-black: #353535; +$black: black; +$green: #74c25d; +$blue: #4171d5; +$red: #dd5933; +$blue-green: #00acee; +$group-page-bar-color: #171717; + +// Transition units +$fast: 0.3s; +$normal: 0.6s; +$slow: 1s; + +// Border radius units +$general: 0.25rem; +$round: 50%; + +// Commonly use units +$boundary: 1150px; \ No newline at end of file diff --git a/app/assets/stylesheets/lib/group/group-admin.scss b/app/assets/stylesheets/lib/group/group-admin.scss new file mode 100644 index 0000000..976d9f1 --- /dev/null +++ b/app/assets/stylesheets/lib/group/group-admin.scss @@ -0,0 +1,270 @@ +@charset "utf-8"; + +@import "group-variables"; +@import "group-classes"; +@import "group-reset"; + +// General style +body { + background: $gray; + font-family: $main-font; +} + +// dropzone + +.dropzone-pool { + border: 2px dashed $blue; + margin-bottom: 16px; + font-family: $paragraph-font; + font-size: 0.9375rem; + color: $dark-gray; + margin-right: 1rem; + border-radius: $general; +} + +// Override and resolve the conflict with main-form.css for that I need RWD support for this page +.main-forms fieldset .input-area .controls textarea { + max-width: none; +} + +// Override Bootstrap modal +.modal.fade { + top: -65%; +} + +// Override select2 styles, I need this evil power +#main-wrap { + .select2-container-multi { + margin-right: 0.9375rem; + min-width: 200px; + + .select2-choices { + padding: 0; + border-radius: $general; + + .select2-search-field { + input { + padding: 10px 5px; + } + } + } + + .select2-search-choice { + padding: 10px 1.75rem 10px 0.7rem; + border-color: lighten($light-gray, 5%); + background: $white; + + > div { + &:before { + content: "\F007"; + font-family: FontAwesome; + display: inline-block; + font-size: 0.9375rem; + color: $blue; + margin: 0 0.5rem 0 0; + } + } + } + + .select2-search-choice-close { + right: 15px; + left: auto; + + &:before { + content: "\f057"; + font-family: FontAwesome; + position: absolute; + cursor: pointer; + left: 6px; + top: 6px; + font-size: 0.9375rem; + color: $dark-gray; + } + + &:hover { + &:before { + color: $red; + } + } + } + } +} + +.select2-result-label { + > span { + white-space: nowrap; + } +} + +.wrap-inner { + .upload-status-notice { + position: fixed; + right: 1rem; + top: 4rem; + color: $white; + padding: 16px 1.375rem; + background-color: $blue; + border-radius: $general; + font-size: 0.8125rem; + box-shadow: 0px 0px 16px 3px rgba(0, 0, 0, 0.2); + -webkit-animation-duration: .3s; + animation-duration: .3s; + z-index: 3000; + } +} + +.fileupload { + .thumbnail { + max-width: 60%; + height: auto; + } +} + +.img-avatar { + width: 50px; + height: 50px; +} + +// members page +.existing-phone-avatar { + vertical-align: top; + margin: 0 0.5rem 0.5rem 0; +} + +.existing-member-count { + width: 60px; + height: 60px; + display: inline-block; + box-sizing: border-box; + line-height: 40px; + text-align: center; + white-space: nowrap; + padding: 8px 0.45rem; + font-size: 0.8125rem; +} + +.group-edit-button { + box-sizing: border-box; + vertical-align: top; + line-height: 40px; + width: 60px; + height: 60px; + display: inline-block; + text-align: center; + font-size: 0.8125rem; +} + +.group-edit-avatar { + width: 60; +} + +.group-member-edit-table { + width: 100%; + + tr { + border-bottom: 1px solid $gray; + } + + td { + padding: 8px 0.75rem; + + &:first-child { + width: 60px; + } + } + + .make-admin-checkbox { + display: inline-block; + vertical-align: top; + margin-right: 0.3125rem; + } + + .group-member-permission { + display: inline-block; + vertical-align: text-top; + } +} + +.group-admin-edit-image-wrap { + margin: 0 24px 1rem 0; +} + +.group-admin-edit-image-item { + margin: 0 10px 16px 0; + padding: 16px 0.5rem; +} + +.group-admin-edit-image-container { + max-width: 100px; + margin: 0 1rem 16px 0; +} + +.group-admin-edit-checkbox-wrap { + color: $white; + font-size: 0.8125rem; + background: $blue; + padding: 2px 0.625rem; + border-radius: $general; + float: left; +} + +.group-admin-edit-image-checkbox { + display: inline-block; + vertical-align: top; +} + +.group-admin-edit-image-label { + display: inline-block; + vertical-align: text-top; + font-size: 0.75rem; +} + +.group-admin-edit-image-item-inner { + padding: 16px 0.625rem; + background: $white; + border-radius: $general; +} + +.group-admin-edit-file-wrap { + margin-bottom: 10px; +} + +.group-admin-edit-file-item { + padding: 10px 16px; + float: left; + margin: 0 8px 0.5rem 0; + font-size: 0.8125rem; + + .group-admin-edit-file-checkbox { + margin: 0; + } +} + +.group-admin-edit-filename { + margin-right: 0.3125rem; +} + +.group-admin-edit-file-delete { + padding-bottom: 4px; + border-bottom: 1px dotted $red; + vertical-align: top; +} + +@media screen and (min-width: 700px) { + .group-admin-edit-image-item { + float: left; + width: 45%; + } +} + +@media screen and (min-width: 960px) { + .group-admin-edit-image-item { + width: 30%; + } +} + +@media screen and (min-width: 1150px) { + .group-admin-edit-image-item { + width: 20%; + } +} \ No newline at end of file diff --git a/app/assets/stylesheets/lib/group/group-main.scss b/app/assets/stylesheets/lib/group/group-main.scss new file mode 100644 index 0000000..d956e68 --- /dev/null +++ b/app/assets/stylesheets/lib/group/group-main.scss @@ -0,0 +1,15 @@ +@charset "utf-8"; + +@import "group-variables"; +@import "group-classes"; +@import "group-reset"; +@import "group-index"; +@import "group-post"; +@import "group-show-post"; +@import "group-category"; +@import "group-members"; + + +.topnav { + display: none; +} diff --git a/app/assets/stylesheets/lib/orbit_bar/orbit-bar.scss.erb b/app/assets/stylesheets/lib/orbit_bar/orbit-bar.scss.erb index ad1e066..1634edf 100644 --- a/app/assets/stylesheets/lib/orbit_bar/orbit-bar.scss.erb +++ b/app/assets/stylesheets/lib/orbit_bar/orbit-bar.scss.erb @@ -66,7 +66,7 @@ $orbit-bar-bgc-lighter: lighten($orbit-bar-bgc, 20%) !default; left: 0; font-family: 'Chivo'; font-size: 16px; - z-index: 1060; + z-index: 1040; -webkit-box-sizing: initial; -moz-box-sizing: initial; box-sizing: initial; @@ -203,6 +203,7 @@ $orbit-bar-bgc-lighter: lighten($orbit-bar-bgc, 20%) !default; border-color: #e6e6e6 #e6e6e6 #bfbfbf; border-color: rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25); box-shadow: inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05); + color: #fff; &:hover { color: #fff; background-color: #d92b0e; @@ -310,24 +311,25 @@ $orbit-bar-bgc-lighter: lighten($orbit-bar-bgc, 20%) !default; } li { min-width: 100px; - padding: 0 0.8em; + padding: 0; &.divider { height: 1px; margin: 0.3em 0; background-color: lighten($orbit-bar-bgc, 60%); } &:hover, &.active { + color: #fff; background-color: #0095CF; a { color: #FFF; } } } - a { + a, .active { color: $orbit-bar-bgc-lighter; font-size: 0.8em; display: block; - padding: 0.5em 0; + padding: 0.5em 1.2em; white-space: nowrap; } } @@ -345,10 +347,6 @@ $orbit-bar-bgc-lighter: lighten($orbit-bar-bgc, 20%) !default; width: auto; height: 85%; } - // background-position: center; - // background-repeat: no-repeat; - // background-image: url('<%= asset_path 'orbit-logo.svg' %>'); - // background-image: url('<%= asset_path 'orbit-logo.png' %>')\9; & + ul { left: 0; } @@ -419,7 +417,7 @@ $orbit-bar-bgc-lighter: lighten($orbit-bar-bgc, 20%) !default; } } -@media (max-width: 479px) { +@media (max-width: 540px) { #orbit-bar { .login-window { width: 90%; diff --git a/app/controllers/admin/groups_controller.rb b/app/controllers/admin/groups_controller.rb index 3bec795..9f7fd6a 100644 --- a/app/controllers/admin/groups_controller.rb +++ b/app/controllers/admin/groups_controller.rb @@ -9,7 +9,15 @@ class Admin::GroupsController < OrbitGroupController end def categories - @categories = GroupCategory.all + old_categories = GroupCategory.where(:is_accepted.ne => false) + if old_categories.count > 0 + old_categories.each do |oc| + oc.is_accepted = true + oc.save + end + end + @admin_categories = GroupCategory.by_admin + @requested_categories = GroupCategory.is_requested end def newpost @@ -25,6 +33,20 @@ class Admin::GroupsController < OrbitGroupController redirect_to admin_group_path(@group) end + def updatepost + @post = GroupPost.find(params[:id]) + group = @post.group + @post.update_attributes(post_update_params) + @post.save + redirect_to admin_group_path(group) + end + + def deletepost + gp = GroupPost.find(params[:id]) + gp.destroy + render :json => {"success" => true}.to_json + end + def showpost render_401 and return if !user_can_read? if (current_user.id.to_s != @post.author.to_s) && (!@post.read_by.include?(current_user.id.to_s)) @@ -38,6 +60,12 @@ class Admin::GroupsController < OrbitGroupController } end + def editpost + render_401 and return if @post.author != current_user.id + @no_breadcrumb = true + @grouppost = @post + end + def show @no_breadcrumb = true @no_filter = true @@ -46,10 +74,41 @@ class Admin::GroupsController < OrbitGroupController end end + def members + render_401 and return if !user_can_read? + @group_members = [] + @group.users.each do |user| + mp = user.member_profile rescue nil + if !mp.nil? + avatar = (mp.avatar.thumb.url == "thumb_person.png" ? "/assets/thumb_person.png" : mp.avatar.thumb.url rescue "/assets/thumb_person.png") + @group_members << { + "id" => user.id.to_s, + "user_name" => (user.user_name rescue ""), + "avatar" => avatar, + "name" => (mp.name_translations rescue {"en" => "","zh_tw" => ""}), + "admin" => @group.admins.include?(user.id.to_s) + } + end + end + end + def create_category gc = GroupCategory.new(category_params) gc.save - @categories = GroupCategory.all + if !current_user.is_admin? + @requested_categories = GroupCategory.is_requested + render :partial => "group_requested_categories" + else + @admin_categories = GroupCategory.by_admin + render :partial => "group_categories" + end + end + + def update_category + gc = GroupCategory.find(params[:category_id]) + gc.update_attributes(category_params) + gc.save + @admin_categories = GroupCategory.by_admin render :partial => "group_categories" end @@ -81,9 +140,23 @@ class Admin::GroupsController < OrbitGroupController redirect_to admin_groups_path end + def update + @group = Group.find(params[:id]) + @group.update_attributes(group_update_params) + @group.save + redirect_to admin_groups_path + end + + def destroy + group = Group.find(params[:id]) + group.destroy + render :json => {"success" => true}.to_json + end + def new @group = Group.new - @categories = GroupCategory.all.collect{|gc| [gc.title,gc.id]} + @no_breadcrumb = true + @categories = GroupCategory.by_admin.collect{|gc| [gc.title,gc.id]} @members = [] MemberProfile.all.each do |mp| user = mp.user rescue nil @@ -99,6 +172,81 @@ class Admin::GroupsController < OrbitGroupController end end + def edit + render_401 and return if !is_user_group_admin? + @no_breadcrumb = true + @members = [] + MemberProfile.all.each do |mp| + user = mp.user rescue nil + if !user.nil? && user.id.to_s != current_user.id.to_s && user.user_name != "rulingcom" && !@group.users.include?(user) + avatar = (mp.avatar.thumb.url == "thumb_person.png" ? "/assets/thumb_person.png" : mp.avatar.thumb.url rescue "/assets/thumb_person.png") + @members << { + "id" => user.id.to_s, + "user_name" => (user.user_name rescue ""), + "avatar" => avatar, + "name" => (mp.name_translations rescue {"en" => "","zh_tw" => ""}) + } + end + end + @existing_members = [] + @group.users.each do |user| + mp = user.member_profile rescue nil + if !mp.nil? + avatar = (mp.avatar.thumb.url == "thumb_person.png" ? "/assets/thumb_person.png" : mp.avatar.thumb.url rescue "/assets/thumb_person.png") + @existing_members << { + "id" => user.id.to_s, + "user_name" => (user.user_name rescue ""), + "avatar" => avatar, + "name" => (mp.name_translations rescue {"en" => "","zh_tw" => ""}), + "admin" => @group.admins.include?(user.id.to_s) + } + end + end + end + + def get_existing_member_template + g = params[:group_id] + group = Group.find(g) + @existing_members = [] + group.users.each do |user| + mp = user.member_profile rescue nil + if !mp.nil? + avatar = (mp.avatar.thumb.url == "thumb_person.png" ? "/assets/thumb_person.png" : mp.avatar.thumb.url rescue "/assets/thumb_person.png") + @existing_members << { + "id" => user.id.to_s, + "user_name" => (user.user_name rescue ""), + "avatar" => avatar, + "name" => (mp.name_translations rescue {"en" => "","zh_tw" => ""}), + "admin" => group.admins.include?(user.id.to_s) + } + end + end + render :partial => "group_existing_member" + end + + def remove_user + group = Group.find(params[:group_id]) + user_id = params[:user_id] + user = User.find(user_id) + group.users.delete(user) + group.admins.delete(user.id.to_s) if group.admins.include?(user.id.to_s) + group.save + render :json => {"success" => true}.to_json + end + + def toggle_admin + group = Group.find(params[:group_id]) + user_id = params[:user_id] + user = User.find(user_id) + if params[:admin] == "true" + group.admins << user.id.to_s + else + group.admins.delete(user.id.to_s) + end + group.save + render :json => {"success" => true}.to_json + end + def new_comment gpc = GroupPostComment.new(comment_params) gpc.save @@ -108,7 +256,13 @@ class Admin::GroupsController < OrbitGroupController private def category_params - params.require(:category).permit! + p = params.require(:category).permit! + if p[:is_accepted].nil? + p[:is_accepted] = true + else + p[:is_accepted] = false + end + p end def comment_params @@ -137,6 +291,42 @@ class Admin::GroupsController < OrbitGroupController p end + def post_update_params + p = params.require(:group_post).permit! + p["author"] = current_user.id + params[:images_to_destroy].each do |img| + gpi = GroupPostImage.find(img) rescue nil + gpi.destroy if !gpi.nil? + end if !params[:images_to_destroy].nil? + + images = @post.group_post_images + + p[:group_post_images].each do |id| + gpi = GroupPostImage.find(id) rescue nil + if !gpi.nil? + images << gpi + end + end if !p[:group_post_images].nil? + + params[:files_to_destroy].each do |fil| + gpf = GroupPostFile.find(fil) rescue nil + gpf.destroy if !gpf.nil? + end if !params[:files_to_destroy].nil? + + files = @post.group_post_files + + p[:group_post_files].each do |id| + gpf = GroupPostFile.find(id) rescue nil + if !gpf.nil? + files << gpf + end + end if !p[:group_post_files].nil? + + p[:group_post_images] = images + p[:group_post_files] = files + p + end + def post_image_params params.require(:group_post_image).permit! end @@ -154,4 +344,16 @@ class Admin::GroupsController < OrbitGroupController p end -end \ No newline at end of file + def group_update_params + p = params.require(:group).permit! + p["user_ids"] = [] if p["user_ids"].nil? + p["user_ids"].concat(@group.users.collect{|u| u.id.to_s}) + p + end + +end + + + + + diff --git a/app/controllers/admin/members_controller.rb b/app/controllers/admin/members_controller.rb index f47d912..e090be5 100644 --- a/app/controllers/admin/members_controller.rb +++ b/app/controllers/admin/members_controller.rb @@ -468,12 +468,15 @@ class Admin::MembersController < OrbitMemberController def create @member = MemberProfile.new(member_profile_params) - if user_params["user_name"] != "" - @user = User.new(user_params) rescue nil - @user.member_profile = @member - @user.save - end if @member.save + if user_params["user_name"] != "" + @user = User.new(user_params) rescue nil + @user.member_profile = @member + if !@user.save + @member.destroy + render 'new' and return + end + end if !params[:member_profile_field_values].nil? params[:member_profile_field_values].each_with_index do |m,i| @custom_field_value = @member.member_profile_field_values.build(value: m.second["value"], member_profile_field_id: m.second["member_profile_field_id"]) diff --git a/app/controllers/admin/role_statuses_controller.rb b/app/controllers/admin/role_statuses_controller.rb index d18d00e..1c95e2b 100644 --- a/app/controllers/admin/role_statuses_controller.rb +++ b/app/controllers/admin/role_statuses_controller.rb @@ -42,8 +42,11 @@ class Admin::RoleStatusesController < OrbitMemberController end def toggle - @role_status.disable = @role_status.disable ? false : true - @role_status.save! + role_status = RoleStatus.find(params[:role_status_id]) rescue nil + if !role_status.nil? + role_status.disable = role_status.disable ? false : true + role_status.save! + end render action: :index end diff --git a/app/controllers/admin/store_controller.rb b/app/controllers/admin/store_controller.rb index 80632ba..a338073 100644 --- a/app/controllers/admin/store_controller.rb +++ b/app/controllers/admin/store_controller.rb @@ -35,6 +35,35 @@ class Admin::StoreController < OrbitAdminController response = http.request(request) data = JSON.parse(response.body) render :json => data.to_json + %x(kill -s USR2 `cat tmp/pids/unicorn.pid`) + sleep 5 + end + + def authorize_default_modules + modules = ModuleApp.all + ids = modules.collect{|ma| ma.key} + store_token = Site.first.store_token rescue nil + if !store_token.nil? + module_apps = ModuleApp.all + 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? + render :json => {"success" => false, "message" => "Could not connect to the store."}.to_json + else + data = JSON.parse(response.body) + if data["success"] + render :json => {"success" => true}.to_json + elsif !data["success"] + render :json => {"success" => false, "message" => data["message"]}.to_json + end + end + else + render :json => {"success" => false, "message" => "Cannot register modules, site is not registered with store."}.to_json + end end def check_permissions diff --git a/app/controllers/orbit_group_controller.rb b/app/controllers/orbit_group_controller.rb index 9a91144..9483801 100644 --- a/app/controllers/orbit_group_controller.rb +++ b/app/controllers/orbit_group_controller.rb @@ -4,13 +4,13 @@ class OrbitGroupController < ApplicationController def get_group case params[:action] - when "show" + when "show","edit" uid = params[:id].split("-").last @group = Group.find_by(:uid => uid) - when "newpost", "createpost" + when "newpost", "createpost", "members" uid = params[:group_id].split("-").last @group = Group.find_by(:uid => uid) - when "showpost" + when "showpost", "editpost" uid = params[:id].split("-").last @post = GroupPost.find_by(:uid => uid) @group = @post.group @@ -21,7 +21,7 @@ class OrbitGroupController < ApplicationController @access_right_level = "none" read_or_write = @group.permission rescue "read" case params[:action] - when "show", "showpost", "newpost" + when "show", "showpost", "newpost", "edit", "members", "editpost" is_member = @group.users.include?(current_user) if @group.admins.include?(current_user.id.to_s) @access_right_level = "admin" diff --git a/app/controllers/pages_controller.rb b/app/controllers/pages_controller.rb index 3b3f4bb..b2c5c98 100644 --- a/app/controllers/pages_controller.rb +++ b/app/controllers/pages_controller.rb @@ -31,14 +31,18 @@ class PagesController < ApplicationController impressionist(page) page.inc(view_count: 1) end + params[:is_frontend_view] = "true" OrbitHelper.set_params params,current_user OrbitHelper.set_site_locale locale + OrbitHelper.set_request_object request + OrbitHelper.render_meta_tags [] render :html => render_final_page("home",page,true).html_safe end def show display_type = "" path = request.path.split('/') + params[:is_frontend_view] = "true" if path.size <= 2 redirect_to root_path else @@ -100,6 +104,7 @@ class PagesController < ApplicationController end @manifest = @key OrbitHelper.set_params params,current_user + OrbitHelper.set_request_object request OrbitHelper.set_site_locale locale OrbitHelper.set_this_module_app module_app.singularize OrbitHelper.set_page_categories categories || ["all"] @@ -122,7 +127,7 @@ class PagesController < ApplicationController if Site.first.enable_redirect_index redirect_to root_url else - render :file => "#{Rails.root}/public/404.html", :layout => false, :status => :not_found + render :file => "#{Rails.root}/public/411.html", :layout => false, :status => :not_found end end else @@ -131,6 +136,17 @@ class PagesController < ApplicationController end end + def update_child_pages_url(page) + page.child_page.each do |cp| + if !cp.child_page.blank? + update_child_pages_url(cp) + else + cp.url = page.url + "/#{cp.page_id}" + cp.save + end + end + end + def update_item_position @page = Page.find(params[:id]) new_parent_page = Page.find(params[:parent_id]) @@ -139,6 +155,9 @@ class PagesController < ApplicationController if new_parent_page.id != old_parent_page_id url = (new_parent_page.url == "/" ? "" : new_parent_page.url) @page.url = url + "/#{@page.page_id}" + if !@page.child_page.blank? + update_child_pages_url(@page) + end end @page.save params["children_ids"].each_with_index do |child,i| @@ -198,11 +217,11 @@ class PagesController < ApplicationController {"key" => "email", "human_readable" => I18n.t("users.email")} ] - custom_attribs = MemberProfileField.all.collect do |mpf| + custom_attribs = MemberProfileField.all.asc(:created_at).collect do |mpf| {"key" => mpf.key, "human_readable" => mpf.title} end - role_attribs = AttributeField.all.collect do |af| + role_attribs = AttributeField.all.asc(:created_at).collect do |af| {"key" => af.key, "human_readable" => af.title} end @@ -380,6 +399,7 @@ class PagesController < ApplicationController OrbitHelper.set_widget_data_count subpart.data_count OrbitHelper.set_widget_module_app subpart.module OrbitHelper.set_widget_item_url subpart + OrbitHelper.render_meta_tags [] OrbitHelper.set_widget_title subpart.title OrbitHelper.set_widget_categories subpart.categories || ["all"] OrbitHelper.set_widget_tags subpart.tags || [] @@ -416,7 +436,8 @@ class PagesController < ApplicationController end @layout_html = render_to_string(@file) doc = Nokogiri::HTML(@layout_html, nil, "UTF-8") - + head = doc.css("head") + head[0].inner_html = head.inner_html + OrbitHelper.get_css_to_render_in_head @part_partials.each do |key, partial| html_string = "" partial.each do |p| @@ -447,6 +468,7 @@ class PagesController < ApplicationController if original_view != "home" viewarea = doc.css("*[data-content='true']")[0] viewarea.inner_html = render_to_string(original_view) rescue "
" + head[0].inner_html = OrbitHelper.meta_tags_html + head.inner_html end link = doc.css("link")[0] link.attributes["href"].value = current_site.favicon.url.nil? ? "/assets/favicon.ico" : current_site.favicon.url @@ -569,7 +591,7 @@ class PagesController < ApplicationController def change_to_language(final_html) if session[:zh_cn] - final_html = ZhConv.convert("zh-cn", final_html) + final_html = ZhConv.convert("zh-cn", final_html,false) final_html.gsub!('/zh_tw/','/zh_cn/') final_html.sub!('繁体中文','繁体中文') end diff --git a/app/controllers/store_api_controller.rb b/app/controllers/store_api_controller.rb index 4bd74e8..946ed02 100644 --- a/app/controllers/store_api_controller.rb +++ b/app/controllers/store_api_controller.rb @@ -50,6 +50,24 @@ class StoreApiController < ApplicationController render :layout => "back_end" end + + # this is for feed module. + def get_channel_lists + apps = ModuleApp.where(:feeds_url.ne => nil) + channels = [] + if apps.count > 0 + apps.each do |app| + channel = {} + channel["title"] = app.title + channel["key"] = app.key + channel["url"] = app.feeds_url + channel["app_icon"] = app.get_registration.get_side_bar.get_icon_class + channels << channel + end + end + render :json => {"channels" => channels}.to_json + end + private def bundle_install Bundler.with_clean_env { `cd #{Rails.root} && BUNDLE_GEMFILE=downloaded_extensions.rb bundle update && bundle` } diff --git a/app/helpers/admin/attribute_values_view_helper.rb b/app/helpers/admin/attribute_values_view_helper.rb index 9a724c9..a17f4f7 100644 --- a/app/helpers/admin/attribute_values_view_helper.rb +++ b/app/helpers/admin/attribute_values_view_helper.rb @@ -1,6 +1,5 @@ module Admin::AttributeValuesViewHelper OPT = [ - ["YYYY / MM / DD hh : mm","format1"], ["YYYY / MM / DD","format2"], ["YYYY / MM","format3"], ["YYYY","format4"] diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index eab9114..f8205f3 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -20,12 +20,16 @@ module ApplicationHelper header_file = File.join('../templates', "#{@key}", "/home/header.html.erb") header_file_html = render :file => header_file header = Nokogiri::HTML(header_file_html, nil, "UTF-8") + site_logo = header.css("img[src='{{logo_url}}']")[0] + site_logo.remove if site.site_logo.url.nil? sub_menu_html = site.sub_menu html = header.to_s - html = html.gsub("{{site_name}}",(site.title rescue "")) - html = html.gsub("%7B%7Blogo_url%7D%7D",(site.site_logo.url.nil? ? "/assets/site-logo.png" : site.site_logo.url)) + t = site.title rescue "" + html = html.gsub("{{site_name}}",(site.display_title_in_frontend ? t : "")) + html = html.gsub("%7B%7Blogo_url%7D%7D",(site.site_logo.url.nil? ? "/assets/default-site-logo.png" : site.site_logo.url)) if site.sitemap_menu_in_header - sub_menu_html = sub_menu_html + "Sitemap" + sitemap = Page.find_by_key(:sitemap).name rescue "Sitemap" + sub_menu_html = sub_menu_html + "#{sitemap}" end sub_menu_html = sub_menu_html.nil? ? "" : sub_menu_html html = html.gsub("{{header-data}}",sub_menu_html) @@ -65,6 +69,7 @@ module ApplicationHelper site_footer = site_footer.nil? ? "" : site_footer html = html.gsub("{{footer-data}}",site_footer) counter = Page.root.view_count.to_s rescue "" + counter = t(:visitors_count) + " : " + counter html = html.gsub("{{site-counter}}",counter) html.html_safe end diff --git a/app/helpers/attribute_fields_helper.rb b/app/helpers/attribute_fields_helper.rb index c472a26..637a2dc 100644 --- a/app/helpers/attribute_fields_helper.rb +++ b/app/helpers/attribute_fields_helper.rb @@ -20,7 +20,7 @@ module AttributeFieldsHelper @new_attribute = @attribute_value.nil? @attribute_value = @attribute_value || (attribute_type.eql?("role") ? @member.attribute_values.build(attribute_field_id: id) : @member.member_profile_field_values.build(member_profile_field: id)) @prefiled_value = @attribute_value.value rescue nil - return instance_eval("render_#{markup}") rescue "" + return instance_eval("render_#{markup}")# rescue "" end end @@ -101,14 +101,17 @@ module AttributeFieldsHelper # @prefiled_value = @attribute_value.get_date case self.typeC['format'] - when 'format1' - tmp = datetime_picker(get_field_name_base, (@prefiled_value ? @prefiled_value : d.strftime("%Y/%m/%d %H:%M")), 'yyyy/MM/dd hh:mm', true) - when 'format2' - tmp = datetime_picker(get_field_name_base, (@prefiled_value ? @prefiled_value : d.strftime("%Y/%m/%d")), 'yyyy/MM/dd') + # when 'format1' + # tmp = datetime_picker(get_field_name_base, (@prefiled_value ? @prefiled_value : d.strftime("%Y/%m/%d %H:%M")), 'yyyy/MM/dd hh:mm', true) + when 'format1','format2' + # tmp = datetime_picker(get_field_name_base, (@prefiled_value ? @prefiled_value : d.strftime("%Y/%m/%d")), 'yyyy/MM/dd') + tmp = very_simple_picker(get_field_name_base, (@prefiled_value ? @prefiled_value : d.strftime("%Y/%m/%d")), self.typeC['format']) when 'format3' - tmp = datetime_picker(get_field_name_base, (@prefiled_value ? @prefiled_value : d.strftime("%Y/%m")), 'yyyy/MM') + # tmp = datetime_picker(get_field_name_base, (@prefiled_value ? @prefiled_value : d.strftime("%Y/%m")), 'yyyy/MM') + tmp = very_simple_picker(get_field_name_base, (@prefiled_value ? @prefiled_value : d.strftime("%Y/%m")), self.typeC['format']) when 'format4' - tmp = datetime_picker(get_field_name_base, (@prefiled_value ? @prefiled_value : d.strftime("%Y")), 'yyyy') + # tmp = datetime_picker(get_field_name_base, (@prefiled_value ? @prefiled_value : d.strftime("%Y")), 'yyyy') + tmp = very_simple_picker(get_field_name_base, (@prefiled_value ? @prefiled_value : d.strftime("%Y")), self.typeC['format']) end control_group_wrapper{tmp} @@ -117,6 +120,28 @@ module AttributeFieldsHelper end end + def very_simple_picker(object_name, value, format) + id = object_name.gsub("[","_").gsub("]","") + values = value.split("/") rescue [] + html = "| {{th_category}} | -{{th_act_time_range}} | -{{th_title}} | -{{th_sign_up_time_range}} | -{{th_sign_up}} | -
|---|---|---|---|---|
| {{category}} | -{{act_start_date}} ~
- {{act_end_date}} |
- {{title}} | -{{sign_start_date}} ~
- {{sign_end_date}} |
- {{sign_up}} - | -
| {{th_category}} | +{{th_act_time_range}} | +{{th_title}} | +{{th_sign_up_time_range}} | +{{th_sign_up}} | +
| {{category}} | +{{act_start_date}} ~ {{act_end_date}} |
+ {{title}} | +{{sign_start_date}} ~ {{sign_end_date}} |
+ {{sign_up}} | +
{{subtitle}}
+{{subtitle}}
+-
+
+
+ Flag inappropriate
+
+
+ -
+
+
+ Delete this post
+
+
+
+<% I18n.available_locales.each do |locale|%> diff --git a/app/views/js/_support_member_form_js.erb b/app/views/js/_support_member_form_js.erb index d72b3f5..f070d53 100644 --- a/app/views/js/_support_member_form_js.erb +++ b/app/views/js/_support_member_form_js.erb @@ -222,7 +222,6 @@