Compare commits

..
Author SHA1 Message Date
iCross 11e9f5d7cd Fix announcement versioning
Conflicts:

	Gemfile
2013-06-26 21:50:03 +08:00
iCross 2eaa44c279 announcement module: versioning 2013-06-08 01:52:49 +08:00
iCross fe7393b9e2 Merge branch 'lukas/picked_archive' into development 2013-06-07 22:44:26 +08:00
iCross f12e5b8768 archive module: add sort to frontend module
Conflicts:

	vendor/built_in_modules/archive/app/controllers/panel/archive/front_end/archive_files_controller.rb
	vendor/built_in_modules/archive/app/views/panel/archive/front_end/archive_files/index.html.erb
2013-06-07 22:43:15 +08:00
iCross 57e1ef7bae Merge branch 'lukas/picked_ques' into development 2013-06-07 18:48:06 +08:00
iCross 642d0ed239 survey module: ensure the commit 2013-06-07 18:47:20 +08:00
chris 0904978292 Remove non resolved conflict 2013-06-07 13:02:47 +08:00
iCross ddd9a9668e Merge branch 'lukas/picked_archive' into development 2013-06-06 23:12:30 +08:00
iCross a468b69013 archive module: fix old data caused error 2013-06-06 23:11:24 +08:00
iCross b6c8a88b73 Merge branch 'lukas/picked_archive' into development 2013-06-06 22:27:08 +08:00
iCross 5b7ac1a22b archive module: add sort feature to achive files 2013-06-06 22:20:27 +08:00
Matt K. Fu d5109c837c Merge branch 'lukas/picked_ques' into development 2013-06-06 19:59:30 +08:00
iCross c63ac751ea archive module: sort for backend/frontend. move get_sorted_and_filtered from orbit_backend_controller.rb to application_controller.rb 2013-06-06 19:20:21 +08:00
iCross 8c1e65994a Merge branch 'clean_development' into lukas/picked_ques 2013-06-06 19:08:59 +08:00
iCross f9a148c901 survey module: move down/up i18n
Conflicts:

	vendor/built_in_modules/survey/app/views/panel/survey/back_end/surveys/_form_survey_question.html.erb
2013-06-06 18:46:52 +08:00
iCross 5ea0c5bd5c survey module: result chart display only other
Conflicts:

	config/environments/production.rb
2013-06-06 18:45:29 +08:00
iCross d2f131d160 survey module: update css
Conflicts:

	app/assets/stylesheets/questionnaire.css
2013-06-06 18:43:28 +08:00
iCross 8d71c377f2 fix datepicker helper hidden field value 2013-06-06 18:42:26 +08:00
iCross ec173c4ce1 fix 2013-06-06 18:42:12 +08:00
iCross ba7d6558ee fix 2013-06-06 18:42:00 +08:00
iCross 88c57e0b0c fix 2013-06-06 18:41:48 +08:00
iCross d4962d20b3 fix 2013-06-06 18:41:36 +08:00
iCross 21bf3a0ccd standalone css and icon 2013-06-06 18:41:27 +08:00
iCross cf0d7cfc64 new export csv table
Conflicts:

	vendor/built_in_modules/survey/app/controllers/panel/survey/back_end/surveys_controller.rb
2013-06-06 18:40:28 +08:00
iCross 15347f25dc fix 2013-06-06 18:38:59 +08:00
iCross 443d1c4fbe csv stats & required start 2013-06-06 18:38:47 +08:00
iCross 7ba0977e16 stuff
Conflicts:

	vendor/built_in_modules/survey/app/views/panel/survey/front_end/surveys/show.html.erb
2013-06-06 18:38:22 +08:00
iCross 531cee70d2 fix 2013-06-06 18:31:28 +08:00
Lukas b659c7021d bug fix and add feature 2013-06-06 18:31:09 +08:00
Lukas 515185d87c ques: fix submit 2013-06-06 18:30:54 +08:00
Lukas adc15951bb questionnaire stuff
Conflicts:

	vendor/built_in_modules/announcement/app/controllers/panel/announcement/front_end/bulletins_controller.rb
	vendor/built_in_modules/announcement/app/views/panel/announcement/front_end/bulletins/index.html.erb
2013-06-06 18:29:58 +08:00
Lukas 32c259ac9e survey: remain stuff 2013-06-06 18:27:05 +08:00
Lukas 51640423a7 survey module initial 2013-06-06 18:26:41 +08:00
Matt K. Fu dd206437d8 apply tags and cates for fronted. from now app developer can use param category_id and tag_id freely. 2013-06-06 17:39:36 +08:00
Matt K. Fu 7729161123 fix for passing args. code in complete,fronted controller need to take care params,too. backend parser need to catch up. 2013-06-06 17:38:17 +08:00
Matthew K. Fu JuYuan f2706ff2c1 make default widget work with params[tag_id] params[category_id] 2013-06-06 17:36:30 +08:00
Matthew K. Fu JuYuan 5c94200b77 fix argument passing problem for more link and tag cloud, incomplete code. 2013-06-06 17:21:27 +08:00
Matt K. Fu 6b8b749b0f fix chris tag cloud 2013-06-06 17:18:42 +08:00
chris 253cca06cc New widget for tag cloud 2013-06-06 17:17:45 +08:00
Matt K. Fu 30824d1620 add search to archive 2013-06-05 18:03:09 +08:00
Matt K. Fu 704db56925 fix bulletin data having 8 hours difference. 2013-06-05 18:01:57 +08:00
Matt K. Fu 06fd305bf9 default widget show search 2013-06-05 13:00:21 +08:00
Matt K. Fu c0f1614cb9 fix uploading error due to user action decoder can not handle uploading file 2013-05-30 10:17:28 +08:00
Matt K. Fu 3e0b7d81ae clean 403 404 500 2013-05-27 16:46:49 +08:00
Matt K. Fu 2806dd35a9 spen's fix for user 2013-05-23 14:03:18 +08:00
Matt K. Fu 54a35b30be fix design index bug when start start from blank DB.
add delay impressionist.
add several i18n vars
2013-05-23 12:07:43 +08:00
Matt K. Fu 37aa950028 user action 2013-05-23 11:55:57 +08:00
Matt K. Fu 3d0a1cef56 1.fix for syntax error.
2.Making production console works.
3.Making blank site member no errors.
2013-05-22 16:25:12 +08:00
Spen 4a5256bf4f ntu dropdown fix member staff css 2013-05-14 14:19:56 +08:00
Spen 5b368235e8 ntu dropdown fix list sort 2013-05-14 14:19:55 +08:00
Spen b8da40b4ae ntu_dropdown_fix 2013-05-14 14:19:55 +08:00
Matt K. Fu 287e77836d fix css compiling error 2013-05-14 14:19:20 +08:00
Matt K. Fu 3e6c2b1ec2 fix member error with blank database 2013-05-14 11:48:13 +08:00
Matt K. Fu f2247aab32 ray's css fix 2013-05-14 11:27:15 +08:00
Matt K. Fu ef2c732d2e make blank site working better 2013-05-14 11:26:35 +08:00
Matt K. Fu 1096db79b6 blank site now can be start from rake site:build 2013-05-14 10:32:53 +08:00
Matt K. Fu 88d55989de change logger 2013-05-14 10:29:11 +08:00
chris c2331695cd Set order of page context to match the order of structure
Add some params to keep the sorting
2013-05-07 11:15:30 +08:00
chris 127ab3845c Changes for queries 2013-05-03 12:12:19 +08:00
chris aefd62da2a Add tagged_ids to taggable 2013-05-03 12:12:19 +08:00
chris 167a71272a queries need to be rethink 2013-05-03 12:12:19 +08:00
Matt K. Fu caf0426bd4 bulletin search 2013-05-01 12:16:28 +08:00
Matt K. Fu 7d077a92a5 system preference 2013-04-29 15:23:15 +08:00
235 changed files with 4269 additions and 2863 deletions

No files matched your search

+4 -1
View File
@@ -50,7 +50,7 @@ gem 'tinymce-rails'
gem 'therubyracer' if RUBY_PLATFORM.downcase.include?("linux")
gem 'libv8', '~> 3.11.8' if RUBY_PLATFORM.downcase.include?("linux")
gem 'mongoid-encryptor', :require => 'mongoid/encryptor'
gem 'rb-readline' if RUBY_PLATFORM.downcase.include?("linux")
gem 'rb-readline','~> 0.4.2' if RUBY_PLATFORM.downcase.include?("linux")
gem "impressionist", :git => 'git://github.com/charlotte-ruby/impressionist.git'
@@ -63,6 +63,9 @@ gem 'chinese_pinyin', '0.4.1'
gem 'rmmseg-cpp-huacnlee', '0.2.9'
gem 'redis-namespace'
gem 'redis-search'
gem 'syslog-logger'
gem "recaptcha", :require => "recaptcha/rails"
gem 'mongoid-versioning'
# Gems used only for assets and not required
# in production environments by default.
+2
View File
@@ -319,6 +319,7 @@ GEM
nokogiri
sunspot (= 1.3.3)
sunspot_solr (1.3.3)
syslog-logger (1.6.8)
terminal-table (1.4.5)
thor (0.17.0)
tilt (1.3.3)
@@ -402,6 +403,7 @@ DEPENDENCIES
sunspot-rails-tester
sunspot_mongo
sunspot_solr
syslog-logger
tinymce-rails
uglifier
watchr
Binary file not shown.

After

Width:  |  Height:  |  Size: 524 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 738 B

+1 -1
View File
@@ -1,6 +1,6 @@
orbitDesktop.prototype.themefolder = "desktop_themes";
orbitDesktopAPI.prototype.notifyImgPath = "/assets/";
alert("<%= @desktop.inspect %>")
// alert("<%= @desktop.inspect %>")
var od = new orbitDesktop("#ajax_container");
+1 -57
View File
@@ -55,7 +55,7 @@ $(document).ready(function(){
}
return false;
});
getEvent(selet);
function resetText() {
$events.find('li').find($mon).html('');
$events.find('li').find($day).html('');
@@ -63,60 +63,4 @@ $(document).ready(function(){
$events.find('li').find($link_text).attr('href', '');
$events.find('li').find($time).html('');
}
function getEvent(selet){
$.ajax({
type: "GET",
url: "/static/nccu_calendar.xml",
dataType: "xml",
timeout: 1000,
error: function(xml){
$events.find('.links_next').addClass('disabled')
$events.find('.error_mag').show();
$events.find('ul').hide();
$events.find('.error_mag').html("讀取錯誤");
},
success: function(xml) {
xmlLength = $(xml).find('entry').length;
$(xml).find('entry').slice(selet, selet+objLength).each(function(i){
title_text = $(this).find('title').text()
link_text = $(this).find('link').attr('href')
summary_text = $(this).find('summary').text()
indexA = summary_text.indexOf("-");
indexB = summary_text.indexOf(" ");
indexC = summary_text.indexOf("/");
//清除前後空白字元
summary_text = jQuery.trim(summary_text);
//篩選標題
title_text = title_text.slice(0, 16)
if (summary_text.length == 31) {
startDate_text = summary_text.slice(0, indexA);
startMon_text = startDate_text.slice((indexC+1), (indexC+3));
startDay_text = startDate_text.slice(7);
endDate_text = summary_text.slice((indexA+1), indexB);
time_text = summary_text.slice((indexB+1));
} else {
startDate_text = summary_text.slice(0, indexB);
startMon_text = startDate_text.slice((indexC+1), (indexC+3));
startDay_text = startDate_text.slice(7);
endDate_text = '';
time_text = summary_text.slice((indexB+1));
}
if(startMon_text.slice(0, 1) == '0'){
startMon_text = month[startMon_text.slice(1)-1];
} else {
startMon_text = month[startMon_text-1];
}
$events.find('li').eq(i).find($mon).html(startMon_text);
$events.find('li').eq(i).find($day).html(startDay_text);
$events.find('li').eq(i).find($link_text).html(title_text+"…");
$events.find('li').eq(i).find($link_text).attr('href', link_text);
$events.find('li').eq(i).find($time).html('時間:'+time_text);
//console.log();
/*$('<li></li>')
.html('<div class="event_date"><span class="mon">'+startMon_text+'</span><span class="day">'+startDay_text+'</div>')
.appendTo('.events ul');*/
});//close each(
}
}); //close $.ajax(
}
});
+56
View File
@@ -0,0 +1,56 @@
<%#= encoding: utf-8 %>
$(document).ready(function(){
$(document).on('click', '.survey_question_item a.remove_existing_record_question', function(){
if(confirm("<%= I18n.t(:sure?)%>")){
$(this).next('.should_destroy').val(1);
$(".survey_question_item#" + $(this).prev().attr('value')).hide();
}
});
$(document).on('click', '.survey_question_option_item a.remove_existing_record_option', function(){
if(confirm("<%= I18n.t(:sure?)%>")){
$(this).next('.should_destroy').val(1);
$(".survey_question_option_item#" + $(this).prev().attr('value')).hide();
}
});
$(document).on('click', '.survey_question_radiogroup_item a.remove_existing_record_radiogroup', function(){
if(confirm("<%= I18n.t(:sure?)%>")){
$(this).next('.should_destroy').val(1);
$(".survey_question_radiogroup_item#" + $(this).prev().attr('value')).hide();
}
});
$('.survey_question_item .type-selector').live('change', function(){
$item = $(this).parents('.survey_question_item');
$item.find('.type-specify').hide();
$item.find('.type-specify.type-' + $(this).val()).show();
$item.find('.type-specify.hide-type-' + $(this).val()).hide();
});
$('.survey_question_item .type-selector').trigger('change');
$('.survey_question_item .add_survey_question_option a.add').live('click', function(){
var new_id = $(this).prev().attr('value');
var old_id = new RegExp("new_survey_question_options", "g");
$(this).prev().attr('value', parseInt(new_id) + 1);
$_new = $($(this).next().html().replace(old_id, new_id));
$(this).parents('.survey_question_options_wrapper').find('tbody').append($_new);
$_new.find('a.delete_option').on('click', function(){
$(this).parents('.survey_question_option_item').remove();
});
});
$('.survey_question_item .add_survey_question_radiogroup a.add').live('click', function(){
var new_id = $(this).prev().attr('value');
var old_id = new RegExp("new_survey_question_radiogroups", "g");
$(this).prev().attr('value', parseInt(new_id) + 1);
$_new = $($(this).next().html().replace(old_id, new_id));
$(this).parents('.survey_question_radiogroups_wrapper').find('tbody').append($_new);
$_new.find('a.delete_radiogroup').on('click', function(){
$(this).parents('.survey_question_radiogroup_item').remove();
});
});
});
@@ -149,7 +149,7 @@ Version: 3.3.1 Timestamp: Wed Feb 20 09:57:22 PST 2013
margin-top: 4px; }
.select2-search input.select2-active {
background: white image-url("select2-spinner.gif") no-repeat 100%; }
background: white url("select2/spinner.gif") no-repeat 100%; }
.select2-container-active .select2-choice,
.select2-container-active .select2-choices {
@@ -261,7 +261,7 @@ disabled look for disabled choices in the results dropdown
display: none; }
.select2-more-results.select2-active {
background: #f4f4f4 image-url("select2-spinner.gif") no-repeat 100%; }
background: #f4f4f4 url("select2/spinner.gif") no-repeat 100%; }
.select2-more-results {
background: #f4f4f4;
@@ -323,7 +323,7 @@ disabled look for disabled choices in the results dropdown
background: transparent !important; }
.select2-container-multi .select2-choices .select2-search-field input.select2-active {
background: white image-url("select2-spinner.gif") no-repeat 100% !important; }
background: white url("select2/spinner.gif") no-repeat 100% !important; }
.select2-default {
color: #999999 !important; }
@@ -404,4 +404,4 @@ disabled look for disabled choices in the results dropdown
background-size: 60px 40px !important; }
.select2-search input {
background-position: 100% -21px !important; } }
background-position: 100% -21px !important; } }
+4 -1
View File
@@ -12,6 +12,9 @@
.main-list {
margin-bottom: 0;
}
#filter .main-list, #filter + .main-list {
table-layout: fixed;
}
.main-wrap>.main-list thead th {
background-color: transparent;
border-right: medium none;
@@ -36,7 +39,7 @@
}
.main-list tbody .quick-edit .nav {
position: absolute;
width: 350px;
width: 440px;
left: -8px;
}
.main-list tbody .quick-edit .nav .dropdown-menu {
+150
View File
@@ -0,0 +1,150 @@
.o-question {
font-size: 15px;
}
.o-question input[type=checkbox], .o-question input[type=radio] {
margin: 0;
}
.o-question textarea {
resize: vertical;
}
.o-question-topic {
font-size: 2em;
line-height: normal;
margin: 0;
padding: 0.5em 0;
}
.o-question-description {
font-size: 0.9em;
line-height: 1.5em;
}
.o-question-list {
clear: both;
margin: 40px 0;
padding: 0;
font-weight: bold;
}
.o-question-list > li {
margin: 0 0 0 40px;
padding: 16px 0;
border-top: solid 1px #eee;
position: relative;
}
.o-question-list > li .required-star {
position: absolute;
left: -42px;
padding-top: 4px;
}
.o-question-list > li:first-child {
border: 0;
}
.o-question-title {
font-weight: bold;
font-size: 1.2em;
line-height: 1.5em;
margin-bottom: 16px;
}
.o-question-title + .o-question-description {
font-weight: normal;
background-color: #f6f6f6;
padding: 16px;
position: relative;
margin-top: 20px;
width: 90%;
}
.o-question-title + .o-question-description:before {
display: block;
content: "";
border-left: 12px solid transparent;
border-right: 12px solid transparent;
border-bottom: 12px solid #f6f6f6;
position: absolute;
top: -12px;
left: 16px;
}
.o-question-title + input[type=text],
.o-question-title + textarea,
.o-question-title + select,
.o-question-description + input[type=text],
.o-question-description + textarea,
.o-question-description + select {
display: block;
}
.o-question-title + input[type=text], .o-question-title + textarea {
border: solid 1px #ccc;
padding: 6px;
margin: 20px 0;
line-height: 24px;
}
.o-question-title + input[type=text] {
width: 40%;
}
.o-question-title + textarea {
width: 70%;
}
.o-question-group {
margin: 20px 0;
padding: 0;
}
.o-question-option {
font-weight: normal;
}
.o-question-group.view-list {
list-style: none;
}
.o-question-group.view-list .o-question-option {}
.o-question-group.view-list > li {
margin-top: 8px;
}
.o-question-group.view-list > li:first-child {
margin: 0;
}
.o-question-group.view-list > li > * {
display: inline-block;
margin: 0;
padding: 0;
vertical-align: middle;
}
.o-question-group.view-list > li input + .o-question-option {
margin: 0 0 0 12px;
}
.o-question-group.view-dropdown {
height: 24px;
line-height: 24px;
}
.o-question-group.view-grid {
border-collapse: collapse;
max-width: 90%;
min-width: 50%;
width: auto;
}
.o-question-group.view-grid th, .o-question-group.view-grid td {
padding: 6px;
}
.o-question-group.view-grid thead th {
text-align: center;
}
.o-question-group.view-grid tbody th {}
.o-question-group.view-grid tbody .odd .o-question-title, .o-question-group.view-grid tbody .odd td {
background-color: #f6f6f6;
}
.o-question-group.view-grid .o-question-title {
font-size: 1em;
}
.o-question-group.view-grid tbody .odd .o-question-title {
background-color: transparent;
}
.o-question-group.view-grid tbody .odd td {}
.o-question-group.view-grid tbody tr:hover td {
background-color: #aaa;
}
.o-question-group.view-grid tbody td {
vertical-align: middle;
text-align: center;
}
.o-question-group.view-grid tbody td input {
vertical-align: baseline;
}
.o-question-action {
padding: 20px;
background-color: #f6f6f6;
}
+52
View File
@@ -0,0 +1,52 @@
@import url(http://fonts.googleapis.com/css?family=Open+Sans:400,700);
body {
margin: 0;
padding: 50px 0;
background-color: #eee;
font-family: 'Open Sans', sans-serif;
}
.wrapper {
background: #FFFFFF none;
box-shadow: 0 0 50px rgba(0, 0, 0, 0.1);
margin: 0 auto;
overflow: hidden;
width: 980px;
}
.wrapper > h1 {
margin: 0;
padding: 20px;
font-family: 'Open Sans', sans-serif;
font-weight: bold;
}
section {
border-top: dashed 3px #eee;
padding: 40px;
overflow: hidden;
}
section:first-child {
border: 0;
padding-top: 0;
}
section > h2 {
font-size: 13px;
font-weight: bold;
border: solid 1px #ddd;
background-color: #2676C0;
color: #fff;
display: inline-block;
padding: 0 16px;
box-shadow: 0 1px 1px #fff, 0 2px 6px rgba(0,0,0,0.1);
}
.side {
float: right;
width: 189px;
padding-left: 20px;
border-left: solid 1px #eee;
}
.main {
float: left;
width: 710px;
padding-right: 20px;
}
+5 -5
View File
@@ -11,7 +11,7 @@ class Admin::AssetsController < OrbitBackendController
def new
@asset = Asset.new
@asset_categories = AssetCategory.all
@tags = AssetTag.all
@tags = get_tags
respond_to do |format|
format.html {}
format.js { render 'js/show_pop_up', :locals => {:partial => 'admin/assets/new'} }
@@ -21,7 +21,7 @@ class Admin::AssetsController < OrbitBackendController
def edit
@asset = Asset.find(params[:id])
@asset_categories = AssetCategory.all
@tags = AssetTag.all
@tags = get_tags
respond_to do |format|
format.html {}
format.js { render 'js/show_pop_up', :locals => {:partial => 'admin/assets/edit'} }
@@ -46,7 +46,7 @@ class Admin::AssetsController < OrbitBackendController
else
flash[:error] = t('create.fail')
@asset_categories = AssetCategory.all
@tags = AssetTag.all
@tags = get_tags
respond_to do |format|
format.js {
if params[:uploader]
@@ -69,7 +69,7 @@ class Admin::AssetsController < OrbitBackendController
else
flash[:error] = t('update.fail')
@asset_categories = AssetCategory.all
@tags = AssetTag.all
@tags = get_tags
respond_to do |format|
format.html { render :action => :edit }
format.js { render 'js/reload_pop_up', :locals => {:value => @asset, :values => nil, :partial => 'admin/assets/edit', :locals => {:is_html => false}} }
@@ -96,7 +96,7 @@ class Admin::AssetsController < OrbitBackendController
def file_upload
@asset = Asset.new
@asset_categories = AssetCategory.all
@tags = AssetTag.all
@tags = get_tags
render :layout => false
end
+10 -1
View File
@@ -22,6 +22,11 @@ class Admin::PagePartsController < OrbitBackendController
@part = PagePart.find(params[:id])
@r_tag = @part.public_r_tag.blank? ? LIST[:public_r_tags][0] : @part.public_r_tag
@tag_objects = @r_tag.classify.constantize.all rescue nil
if @r_tag.eql?('tag_cloud')
@tag_objects = ModuleApp.where(has_tag: true)
else
@tag_objects = @r_tag.classify.constantize.all rescue nil
end
@module_apps = ModuleApp.for_widget_select
@categories = nil
@@ -119,7 +124,11 @@ class Admin::PagePartsController < OrbitBackendController
def reload_r_tag_options
@part = PagePart.find params[:id]
@r_tag = params[:type]
@tag_objects = @r_tag.classify.constantize.all rescue nil
if params[:type].eql?('tag_cloud')
@tag_objects = ModuleApp.where(has_tag: true)
else
@tag_objects = @r_tag.classify.constantize.all rescue nil
end
respond_to do |format|
format.js {}
end
@@ -0,0 +1,6 @@
class Admin::UserActionsController < OrbitBackendController
def index
@user_actions = UserAction.all
end
end
+190 -21
View File
@@ -3,8 +3,8 @@ class ApplicationController < ActionController::Base
include ParserFrontEnd, ParserBackEnd, ApplicationHelper
include OrbitApp::ErrorHandlers::PageErrorHandler
include OrbitApp::ErrorHandlers::ObjectAuthErrorHandler
include OrbitApp::ErrorHandlers::ModuleAppErrorHandler
include OrbitApp::ErrorHandlers::ObjectAuthErrorHandler
include OrbitApp::ErrorHandlers::ModuleAppErrorHandler
rescue_from ObjectAuthError, :with => :render_object_auth_error
rescue_from ModuleAppError, :with => :render_module_app_error
@@ -29,15 +29,16 @@ class ApplicationController < ActionController::Base
def set_current_user
User.current = current_or_guest_user
UserActionRecoder.perform(current_or_guest_user,params.to_s)
end
def front_end_available(module_app_title='')
app_controller = ModuleApp.first(conditions: {:key => module_app_title} )
unless app_controller.enable_frontend?
unless app_controller.enable_frontend?
render :nothing => true
end
end
def get_all_app_engines
ary = ["vender/plugins/new_blog"]
app_engines = ary.collect{|t|
@@ -50,23 +51,23 @@ class ApplicationController < ActionController::Base
def flaten_controller
ary=[]
Find.find(File.join(Rails.root , 'vendor/plugins/')) { |name|
Find.find(File.join(Rails.root , 'vendor/plugins/')) { |name|
require_dependency(name) if /_controller\.rb$/ =~ name
ary << name
}
ary
end
# Find the parent for the given item
def find_parent_item
@parent_item = Item.first(:conditions => { :id => BSON::ObjectId(params[:parent_id]) }) rescue nil
end
def auth_failed_in_backend
#redirect_to admin_dashboards_url
#redirect_to admin_dashboards_url
redirect_to root_path
end
def for_admin_only
if is_admin?
true
@@ -75,7 +76,7 @@ class ApplicationController < ActionController::Base
auth_failed_in_backend
end
end
def for_app_manager
if is_manager?
true
@@ -84,7 +85,7 @@ class ApplicationController < ActionController::Base
auth_failed_in_backend
end
end
def for_app_sub_manager
if (@module_app.sub_managing_users.include?(current_or_guest_user) || is_manager?)
true
@@ -107,9 +108,9 @@ class ApplicationController < ActionController::Base
flash[:error] = t("access.denied.object")
auth_failed_in_backend unless (obj.get_object_auth_by_title(title).auth_users.include?(current_or_guest_user) || is_manager? || is_admin? )
end
# Render the page
def render_page(args=nil)
def render_page(args={})
if @item
respond_to do |format|
format.html { render :text => parse_page_content(@item,args), :layout => 'page_layout' }
@@ -131,9 +132,9 @@ class ApplicationController < ActionController::Base
@orig_url = "http://#{request.host_with_port}/#{@item.path}?id=#{@object.id}"
render 'shared/render_share', :layout => false
end
protected
# Set I18n.locale
def set_locale
# update session if passed
@@ -147,24 +148,24 @@ class ApplicationController < ActionController::Base
else
browser_locale = request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first rescue nil
condition = @site_in_use_locales.include?(browser_locale)
end
end
session[:locale] = condition ? (browser_locale || session[:locale]) : I18n.default_locale.to_s
I18n.locale = session[:locale].to_sym
end
# Set the site variables
def set_site
# set site if exist or create site
@site = Site.first || Site.create({:valid_locales => [], :in_use_locales => []})
@site = Site.first || Site.create({:valid_locales => VALID_LOCALES, :in_use_locales => VALID_LOCALES})
session[:site] = @site.id
@site_in_use_locales = site_locales_default_head(@site.in_use_locales)
@site_valid_locales = site_locales_default_head(@site.valid_locales)
end
def set_current_item
session[:current_page] = params[:id] || @item.id rescue nil
end
def decrypt_data(encrypted_data, encrypted_key, encrypted_iv)
site = Site.find(session[:site])
if encrypted_data
@@ -180,7 +181,7 @@ class ApplicationController < ActionController::Base
''
end
end
def get_homepage
Page.root
end
@@ -228,6 +229,174 @@ class ApplicationController < ActionController::Base
redirect_to ret
end
def get_sorted_and_filtered(object_class, query = nil, objects = nil)
objects ||= get_objects(object_class, query)
object_class = object_class.classify.constantize
if !params[:sort].blank?
options = params[:sort_options]
options = [options] if !options.class.eql?(Array)
options.each do |option|
if object_class.fields.include?(option)
if object_class.fields[option].type.to_s.eql?('Object') && !object_class.relations[option].nil?
objects = get_objects_from_referenced_objects(object_class.fields[option].options[:class_name].constantize, objects, option)
else
(objects = objects.order_by(option, params[:direction])) rescue nil
end
elsif object_class.relations.include?(option)
case object_class.relations[option].macro
when :references_one
a = Array.new
objects.each { |object| a << [get_string_value_from_object(object), object] }
sorted = params[:direction].eql?('asc') ? a.sort : a.sort.reverse!
objects = sorted.collect {|x| x[1] }
when :references_many, :references_and_referenced_in_many
objects = get_objects_from_self(object_class, objects, option)
when :referenced_in
objects = get_objects_from_referenced_objects(object_class.relations[option].class_name.constantize, objects, "#{option}_id")
end
elsif option.eql?('tags')
tag_array = @module_app.tags.inject([]){ |result, value|
result << [value.name, value]
}
params[:direction].eql?('asc') ? tag_array.sort : tag_array.sort.reverse!
sorted_objects = Array.new
tag_array.each do |x|
taggings = x[1].taggings
taggings.each {|tagging| sorted_objects << tagging.taggable }
end
# debugger
sorted_objects.flatten!
sorted_objects.uniq!
objects = get_with_nil(objects, option, sorted_objects)
end
end
end
if @filter
@filter.each do |key, value|
case key
when 'status'
a = Array.new
objects.each do |object|
value.each do |v|
a << object if object[v]
end
end
objects = a.uniq
when 'categories'
a = Array.new
objects.each do |object|
a << object if (value.include?(object.send("#{object.class.to_s.underscore}_category").id.to_s) rescue nil)
end
objects = a.uniq
when 'tags'
a = Array.new
objects.each do |object|
object.tags.each do |tag|
a << object if value.include?(tag.id.to_s)
end
end
objects = a.uniq
end if value.size > 0
end
end
Kaminari.paginate_array(filter_authorized_objects(objects)).page(params[:page]).per(10)
end
def get_viewable(object_class, query=nil)
objects = get_objects(object_class,query).order_by(:created_at, :desc)
Kaminari.paginate_array(objects).page(params[:page]).per(10)
end
def get_objects(object_class, query=nil)
object_class = object_class.classify.constantize
# debugger
# a=1
if query
if object_class.include?(Mongoid::Sortable)
objects = object_class.default_sort(params[:sort]).where(query)
else
objects = object_class.where(query)
end
else
if object_class.include?(Mongoid::Sortable)
objects = object_class.default_sort(params[:sort]).all
else
objects = object_class.all
end
end
objects
end
def get_objects_from_referenced_objects(object_class, objects, option)
referer_ids = objects.distinct(option)
referenced_objects = object_class.find(referer_ids) rescue nil
if referenced_objects
a = Array.new
referenced_objects.to_a.each { |referer| a << [get_string_value_from_object(referer), referer.id] }
sorted = params[:direction].eql?('asc') ? a.sort : a.sort.reverse!
sorted_objects = sorted.collect {|x| objects.where(option => x[1]).entries }
sorted_objects.flatten!
sorted_objects.uniq!
get_with_nil(objects, option, sorted_objects)
else
objects
end
end
def get_objects_from_self(object_class, objects, option)
referenced_class = object_class.relations[option].class_name.constantize
referenced_objects = referenced_class.all rescue nil
if referenced_objects
reverse_relation = nil
referenced_class.relations.each { |relation| reverse_relation = relation[1].name.to_s if relation[1].class_name.eql?(object_class.to_s) }
a = Array.new
referenced_objects.each { |referenced_object| a << [get_string_value_from_object(referenced_object), referenced_object] }
a.compact!
sorted = params[:direction].eql?('asc') ? a.sort : a.sort.reverse!
sorted_objects = Array.new
sorted.each {|x| sorted_objects << x[1].send(reverse_relation) }
sorted_objects.flatten!
sorted_objects.uniq!
get_with_nil(objects, option, sorted_objects)
else
objects
end
end
def get_string_value_from_object(object)
s = object.name_translations[I18n.locale.to_s] unless s rescue nil
s = object.title_translations[I18n.locale.to_s] unless s rescue nil
s = object.name unless s rescue nil
s = object.title unless s rescue nil
s.downcase rescue ''
end
def get_with_nil(objects, option, sorted_objects)
tmp = Array.new
objects.each { |object| tmp << [get_string_value_from_object(object), object] if (object.send(option).blank? || (object.send(option).size == 0 rescue nil)) }
sorted = params[:direction].eql?('asc') ? tmp.sort : tmp.sort.reverse!
sorted_tmp = sorted.collect {|a| a[1] }
a = params[:direction].eql?('asc') ? (sorted_tmp + sorted_objects) : (sorted_objects + sorted_tmp)
a.flatten
end
def filter_authorized_objects(objects)
if(!is_admin? || !is_manager?)
objects.delete_if{ |object|
if object.is_pending == true
if check_permission(:manager)
object.create_user_id != current_user.id
else
!object.send("#{object.class.to_s.underscore}_category").authed_users('fact_check').include?(current_user) rescue false
end
else
false
end
}
end
objects
end
private
+24 -19
View File
@@ -12,34 +12,34 @@ class DefaultWidgetController< OrbitWidgetController
def query_for_default_widget
ori_class_name = @default_widget["query"].split('.')[0]
@ori_class_name = @default_widget["query"].split('.')[0]
result = nil
result_objects = nil
if !params["tag_id"].blank?
@tags = Tag.find(params["tag_id"]) rescue nil
result_ids = nil
result_ids = @tags.collect{|tag| tag.send(ori_class_name.downcase.pluralize).entries.collect{|t| t.id}}
if params["category_id"].blank? #has tag no cate
#nothing
result = @ori_class_name.constantize.where(:tagged_ids.in => params["tag_id"])
else #has tag and cate
# result_ids = @tags.collect{|tag| tag.send(ori_class_name.downcase.pluralize).where(:#{get_category_field_name(ori_class_name)}.in=>params["category_id"]).available_for_lang(I18n.locale).can_display.collect{|t| t.id}}.flatten
result_ids << eval("#{ori_class_name}.where(:#{get_category_field_name(ori_class_name)}.in=>params['category_id']).entries.collect{|t| t.id}")
result_ids.flatten!
result = eval("#{@ori_class_name}.where(:#{get_category_field_name(@ori_class_name)}.in=>params['category_id'], :tagged_ids.in => params['tag_id'])")
end
result = eval("#{ori_class_name}.where(:id=>result_ids)")
elsif params["category_id"].blank? #no tag no cate
result = eval(@default_widget["query"])
else #no tag has cate
result = eval("#{ori_class_name}.where(:#{get_category_field_name(ori_class_name)}.in=>params['category_id'])")
result = eval("#{@ori_class_name}.where(:#{get_category_field_name(@ori_class_name)}.in=>params['category_id'])")
end
date_now = Time.now
result.available_for_lang(I18n.locale).can_display.desc(:is_top, :postdate)
end
def search_result
@search = query_for_default_widget.solr_search do
fulltext params[:search_query]
end
search_result = @search.results.collect{|result| result.id}
@items = eval(@ori_class_name).all.available_for_lang(I18n.locale).can_display.any_in(_id:search_result)
end
def default_widget
@search = params["search_query"].blank? ? false : true
if !params[:id].blank?
clicked_field_name = params["clicked_field_name"].to_sym
redirect_to eval("#{@page_part.module_app.widget_fields_link_method[clicked_field_name][:method]}('#{params[:id]}', {inner: #{params[:inner] || true}})")
@@ -64,8 +64,13 @@ class DefaultWidgetController< OrbitWidgetController
@fields = @page_part.widget_field
@data_limit = @page_part.widget_data_count.is_a?(Fixnum) ? @page_part.widget_data_count : (@page_part.widget_data_count.to_i rescue 3)
end
if @paginate
@data = query_for_default_widget.includes(@widget_image_field).page(params[:page_main]).per(@data_limit)
if @paginate || @search
if @search
@data = search_result.page(params[:page_main]).per(@data_limit) rescue []
else #regular listing
@data = query_for_default_widget.includes(@widget_image_field).page(params[:page_main]).per(@data_limit)
end
# @data = query_for_default_widget.limit(@data_limit).includes(@widget_image_field)
else
@data = query_for_default_widget.includes(@widget_image_field).limit(@data_limit)
@@ -85,9 +90,9 @@ class DefaultWidgetController< OrbitWidgetController
end
end
def get_category_field_name(ori_class_name)
ori_class_name = ori_class_name.constantize
ori_class_name.fields.each_key do |key|
def get_category_field_name()
@ori_class_name = @ori_class_name.constantize
@ori_class_name.fields.each_key do |key|
return key if key.include?('category_id')
end
nil
+5
View File
@@ -38,6 +38,11 @@ class FrontController < ApplicationController
@ad_images = AdImage.all
end
def show_tag_cloud
module_app = ModuleApp.find(params[:id]) rescue nil
@tags = module_app.sorted_tags_for_cloud
end
private
def menu_level(page, current_page, current, menu)
+5 -167
View File
@@ -4,9 +4,9 @@ class OrbitBackendController < ApplicationController
include OrbitTag::Tagging
include AdminHelper
include ApplicationHelper
layout 'new_admin'
def setup_vars
@app_title ||= controller_path.split('/')[1].singularize
@module_app ||= ModuleApp.first(conditions: {:key => @app_title} )
@@ -24,177 +24,15 @@ class OrbitBackendController < ApplicationController
def force_order_for_user
setup_vars
set_current_user
set_current_user
authenticate_user!
check_user_can_use
end
def check_user_can_use
def check_user_can_use
unless check_permission
#redirect_to polymorphic_path(['panel',@app_title,'back_end','public'])
redirect_to root_url
end
end
def get_sorted_and_filtered(object_class, query=nil)
objects = get_objects(object_class, query)
object_class = object_class.classify.constantize
if !params[:sort].blank?
options = params[:sort_options]
options = [options] if !options.class.eql?(Array)
options.each do |option|
if object_class.fields.include?(option)
if object_class.fields[option].type.to_s.eql?('Object') && !object_class.relations[option].nil?
objects = get_objects_from_referenced_objects(object_class.fields[option].options[:class_name].constantize, objects, option)
else
(objects = objects.order_by(option, params[:direction])) rescue nil
end
elsif object_class.relations.include?(option)
case object_class.relations[option].macro
when :references_one
a = Array.new
objects.each { |object| a << [get_string_value_from_object(object), object] }
sorted = params[:direction].eql?('asc') ? a.sort : a.sort.reverse!
objects = sorted.collect {|x| x[1] }
when :references_many, :references_and_referenced_in_many
objects = get_objects_from_self(object_class, objects, option)
when :referenced_in
objects = get_objects_from_referenced_objects(object_class.relations[option].class_name.constantize, objects, "#{option}_id")
end
elsif option.eql?('tags')
tag_array = @module_app.tags.inject([]){ |result, value|
result << [value.name, value]
}
params[:direction].eql?('asc') ? tag_array.sort : tag_array.sort.reverse!
sorted_objects = Array.new
tag_array.each do |x|
taggings = x[1].taggings
taggings.each {|tagging| sorted_objects << tagging.taggable }
end
# debugger
sorted_objects.flatten!
sorted_objects.uniq!
objects = get_with_nil(objects, option, sorted_objects)
end
end
end
if @filter
@filter.each do |key, value|
case key
when 'status'
a = Array.new
objects.each do |object|
value.each do |v|
a << object if object[v]
end
end
objects = a.uniq
when 'categories'
a = Array.new
objects.each do |object|
a << object if (value.include?(object.send("#{object.class.to_s.underscore}_category").id.to_s) rescue nil)
end
objects = a.uniq
when 'tags'
a = Array.new
objects.each do |object|
object.tags.each do |tag|
a << object if value.include?(tag.id.to_s)
end
end
objects = a.uniq
end if value.size > 0
end
end
Kaminari.paginate_array(filter_authorized_objects(objects)).page(params[:page]).per(10)
end
def get_string_value_from_object(object)
s = object.name_translations[I18n.locale.to_s] unless s rescue nil
s = object.title_translations[I18n.locale.to_s] unless s rescue nil
s = object.name unless s rescue nil
s = object.title unless s rescue nil
s.downcase rescue ''
end
def get_objects_from_referenced_objects(object_class, objects, option)
referer_ids = objects.distinct(option)
referenced_objects = object_class.find(referer_ids) rescue nil
if referenced_objects
a = Array.new
referenced_objects.to_a.each { |referer| a << [get_string_value_from_object(referer), referer.id] }
sorted = params[:direction].eql?('asc') ? a.sort : a.sort.reverse!
sorted_objects = sorted.collect {|x| objects.where(option => x[1]).entries }
sorted_objects.flatten!
sorted_objects.uniq!
get_with_nil(objects, option, sorted_objects)
else
objects
end
end
def get_objects_from_self(object_class, objects, option)
referenced_class = object_class.relations[option].class_name.constantize
referenced_objects = referenced_class.all rescue nil
if referenced_objects
reverse_relation = nil
referenced_class.relations.each { |relation| reverse_relation = relation[1].name.to_s if relation[1].class_name.eql?(object_class.to_s) }
a = Array.new
referenced_objects.each { |referenced_object| a << [get_string_value_from_object(referenced_object), referenced_object] }
a.compact!
sorted = params[:direction].eql?('asc') ? a.sort : a.sort.reverse!
sorted_objects = Array.new
sorted.each {|x| sorted_objects << x[1].send(reverse_relation) }
sorted_objects.flatten!
sorted_objects.uniq!
get_with_nil(objects, option, sorted_objects)
else
objects
end
end
def get_with_nil(objects, option, sorted_objects)
tmp = Array.new
objects.each { |object| tmp << [get_string_value_from_object(object), object] if (object.send(option).blank? || (object.send(option).size == 0 rescue nil)) }
sorted = params[:direction].eql?('asc') ? tmp.sort : tmp.sort.reverse!
sorted_tmp = sorted.collect {|a| a[1] }
a = params[:direction].eql?('asc') ? (sorted_tmp + sorted_objects) : (sorted_objects + sorted_tmp)
a.flatten
end
def get_viewable(object_class, query=nil)
objects = get_objects(object_class,query).order_by(:created_at, :desc)
Kaminari.paginate_array(objects).page(params[:page]).per(10)
end
def get_objects(object_class, query=nil)
object_class = object_class.classify.constantize
# debugger
# a=1
if query
objects = object_class.where(query)
else
objects = object_class.all
end
objects
end
def filter_authorized_objects(objects)
if(!is_admin? || !is_manager?)
objects.delete_if{ |object|
if object.is_pending == true
if check_permission(:manager)
object.create_user_id != current_user.id
else
!object.send("#{object.class.to_s.underscore}_category").authed_users('fact_check').include?(current_user) rescue false
end
else
false
end
}
end
objects
end
end
end
@@ -1,4 +1,9 @@
class OrbitWidgetController< OrbitFrontendComponentController
include FrontEndArrayParamsHelper
before_filter {get_tags_and_cates(params)}
def get_tags_and_cates(params)
params = tags_and_cates(params)
end
end
+24 -7
View File
@@ -5,7 +5,7 @@ class PagesController < ApplicationController
# caches_page :index
def check_frontend_open
if Me.frontend_closed
if Me.frontend_closed and current_user.nil? #Need to be change
redirect_to '/admin/dashboards'
end
end
@@ -14,10 +14,11 @@ class PagesController < ApplicationController
@item = Page.find_by_name('home')
if @item
impressionist(@item)
delayed_impressionist(@item)
render_page
else
render :text => t(:need_home)
redirect_to '/admin/dashboards',:notice=>t(:need_home)
# render :text => t(:need_home)
end
end
@@ -25,13 +26,13 @@ class PagesController < ApplicationController
#begin
@item = Item.first(:conditions => {:path => params[:page_name]})
if @item && @item.is_published && (@item.enabled_for.nil? ? true : @item.enabled_for.include?(I18n.locale.to_s))
impressionist(@item)
delayed_impressionist(@item)
case @item.class.to_s
when 'Page'
if params[:clicked_field_name]
render_page({"clicked_field_name"=>params["clicked_field_name"]}) unless save_from_no_lang_for_page
else
render_page unless save_from_no_lang_for_page
render_page(params) unless save_from_no_lang_for_page
end
when 'Link'
redirect_to(@item[:url]) unless save_from_no_lang_for_page
@@ -44,12 +45,28 @@ class PagesController < ApplicationController
#end
end
def convert_array_param(key,array)
array.collect{|t| "#{key}[]=#{t}"}.join("&")
end
def index_from_link
url = "/#{@item.path}"
options = ''
options << "#{options.blank? ? '?' : '&'}page_main=#{params[:page_main]}" unless params[:page_main].blank?
options << "#{options.blank? ? '?' : '&'}category_id=#{params[:category_id]}" unless params[:category_id].blank?
options << "#{options.blank? ? '?' : '&'}tag_id=#{params[:tag_id]}" unless params[:tag_id].blank?
if params[:category_id].is_a? Array
options << "#{options.blank? ? '?' : '&'}#{convert_array_param('category_id',params[:category_id])}" unless params[:category_id].blank?
elsif params[:category_id].is_a? String
options << "#{options.blank? ? '?' : '&'}category_id=#{params[:category_id]}" unless params[:category_id].blank?
end
if params[:tag_id].is_a? Array
options << "#{options.blank? ? '?' : '&'}#{convert_array_param('tag_id',params[:tag_id])}" unless params[:tag_id].blank?
elsif params[:category_id].is_a? String
options << "#{options.blank? ? '?' : '&'}tag_id=#{params[:tag_id]}" unless params[:tag_id].blank?
end
options << "#{options.blank? ? '?' : '&'}search_query=#{params[:search_query]}" unless params[:search_query].blank?
options << "#{options.blank? ? '?' : '&'}name=#{params[:name]}" unless params[:name].blank?
uri = URI::escape(url + options)
+40 -21
View File
@@ -1,9 +1,20 @@
module ApplicationHelper
FLASH_NOTICE_KEYS = [:error, :notice, :warning]
def current_path(param_hash)
request.referer.include?('?') ? [request.referer,param_hash.to_param].join('&') : [request.referer,param_hash.to_param].join('?')
end
def delayed_impressionist(object)
# Resque.enqueue_at(1.minute.from_now,DelayedImpressionist,object)
end
def check_user_role_enable(attribute_fields)
@user.attribute_values.collect{|t| attribute_fields.include?(t.attribute_field) }.include?(true) rescue false
end
def show_attribute_value(value)
if value.kind_of? Hash
result = []
@@ -18,7 +29,7 @@ module ApplicationHelper
u = nil
User.without_callback(:create, :before, :initialize_desktop) do
u = User.create(:name => "guest", :email => "guest_#{Time.now.to_i}#{rand(99)}@example.com")
end
end
u.admin = false
u.save(:validate => false)
u
@@ -46,24 +57,24 @@ module ApplicationHelper
def flash_messages
return unless messages = flash.keys.select{|k| FLASH_NOTICE_KEYS.include?(k)}
formatted_messages = messages.map do |type|
formatted_messages = messages.map do |type|
content_tag :div, :class => type.to_s do
message_for_item(flash[type], flash["#{type}_item".to_sym])
end
end
raw(formatted_messages.join)
end
def link_back(custom_class=nil)
case custom_class
when nil
link_to t('back'), get_go_back, :class => 'nav'
link_to t('back'), get_go_back, :class => 'nav'
else
link_to t('back'), get_go_back, :class => custom_class
link_to t('back'), get_go_back, :class => custom_class
end
end
# Clean the link back
def get_go_back
begin
@@ -104,28 +115,28 @@ module ApplicationHelper
message % item
end
end
def add_attribute(partial, f, attribute)
new_object = f.object.send(attribute).build
fields = f.fields_for(attribute, new_object, :child_index => "new_#{attribute}") do |f|
render :partial => partial, :object => new_object, :locals => {:f => f}
end
end
def active_for_ob_auths_object(object_class,field = :object_auth_id)
unless active_for_action("object_auths_new_interface","setting").nil?
ob_auth = ObjectAuth.find params[field]
ob_auth.obj_authable_type == object_class.to_s ? 'active' : nil
end
end
def active_for_ob_auth(ob_auth_title,field = :object_auth_id)
unless active_for_action("module_apps_new_interface","setting").nil?
oa_auth = ObjectAuth.find params[field]
oa_auth.title == ob_auth_title ? 'active' : nil
end
end
def active_for_app_auth(app_title ='', opt={:controller_name => 'module_apps_new_interface',:action_name=>'setting',:field => :module_app_id})
unless active_for_action(opt[:controller_name],opt[:action_name]).nil?
app = ModuleApp.find params[opt[:field]]
@@ -134,7 +145,7 @@ module ApplicationHelper
nil
end
end
def active_for_controllers(*controller_names)
(controller_names.include?(controller.controller_name) || controller_names.include?(request.fullpath)) ? 'active' : nil
end
@@ -142,11 +153,11 @@ module ApplicationHelper
def visible_for_controllers(*controller_names)
(controller_names.include?(controller.controller_name) || controller_names.include?(request.fullpath)) ? '' : 'hide'
end
def active_for_action(controller_name, action_name)
((controller.controller_name.eql?(controller_name) || request.fullpath.eql?(controller_name)) && controller.action_name.eql?(action_name)) ? 'active' : nil
end
def page_metas(page)
tmp_meta = {}
metas = ''
@@ -175,11 +186,11 @@ module ApplicationHelper
res << page_title
end
res << "</title>\n"
end
end
def page_stylesheets(page, edit=nil)
stylesheets = ''
unless edit
unless edit
stylesheets << "<link href='/assets/bootstrap-orbit.css' rel='stylesheet' type='text/css' />\n"
stylesheets << "<link href='/assets/style.css' rel='stylesheet' type='text/css' />\n"
stylesheets << "<link href='/assets/icons.css' rel='stylesheet' type='text/css' />\n"
@@ -188,9 +199,9 @@ module ApplicationHelper
stylesheets << "<link href='/assets/bootstrap.css' rel='stylesheet' type='text/css' />\n"
stylesheets << "<link href='/assets/font-awesome.css' rel='stylesheet' type='text/css' />\n"
stylesheets << "<link href='/assets/orbit-bar.css' rel='stylesheet' type='text/css' />\n"
stylesheets << "<link href='/assets/social-share-button.css' rel='stylesheet' type='text/css' />\n"
stylesheets << "<link href='#{asset_path 'banner_nav.css'}' rel='stylesheet' type='text/css' />\n"
stylesheets << "<link href='#{asset_path 'default_widget.css'}' rel='stylesheet' type='text/css' />\n"
stylesheets << "<link href='/assets/social-share-button.css' rel='stylesheet' type='text/css' />\n"
stylesheets << "<link href='#{asset_path 'banner_nav.css'}' rel='stylesheet' type='text/css' />\n"
stylesheets << "<link href='#{asset_path 'default_widget.css'}' rel='stylesheet' type='text/css' />\n"
stylesheets << "<link href='#{page.design.css_default.file.url}' rel='stylesheet' type='text/css' />\n" if page.design.css_default
theme = page.design.themes.detect{ |d| d.id == page.theme_id }
stylesheets << "<link href='#{theme.file.url}' rel='stylesheet' type='text/css' />\n" if theme
@@ -224,9 +235,9 @@ module ApplicationHelper
end
def at_least_module_manager
is_manager? || is_admin?
is_manager? || is_admin?
end
def dislpay_view_count(object)
"#{t(:view_count)}: #{object.view_count}"
end
@@ -292,4 +303,12 @@ module ApplicationHelper
"http://#{request.host}:2#{site_number}00"
end
def sortable(column, title = nil, options = {})
options[:remote] ||= true
title ||= column.titleize
css_class = column.to_s == params[:sort] ? "current #{params[:direction]}" : 'asc'
direction = column.to_s == params[:sort] && params[:direction] == 'asc' ? 'desc' : 'asc'
link_to title, params.merge({direction: direction, sort: column, sort_options: column}), {:class => "#{css_class} sortable", :remote => options[:remote]}
end
end
+2 -2
View File
@@ -8,7 +8,7 @@ module OrbitFormHelper
options[:icon_date] ||= 'icons-calendar'
options[:icon_clear] ||= 'icons-cross-3'
options[:input_class] ||= 'input-large'
options[:value] ||= options[:object][method] if options[:object] && options[:object][method]
options[:value] ||= options[:object].send(method) if options[:object] && options[:object][method]
case options[:picker_type]
when 'date'
content_tag :div, :id => options[:id], :class => options[:class] do
@@ -22,7 +22,7 @@ module OrbitFormHelper
options[:label] ||= I18n.t('datetime_picker.separated.label')
content_tag :div, :id => options[:id], :class => "separated_picker #{options[:class]}" do
concat label_tag options[:label] unless options[:no_label]
concat hidden_field(object_name, method)
concat hidden_field(object_name, method, :value => options[:value])
concat separated_picker(object_name, method, options)
end
else
+1 -1
View File
@@ -11,7 +11,7 @@ class BackupServer
%x[rm #{archive_db_list_path}]
%x[ls #{Rails.root}/tmp/#{dbname}* | du -h --max-depth=1 --block-size=1M |sort -h >> #{archive_db_list_path}]
OrbitJobLogger.info "DB backup done Path:#{dbdirectory}"
OrbitLogger.info "DB backup done Path:#{dbdirectory}"
end
end
+1 -1
View File
@@ -8,7 +8,7 @@ class DashboardCounter < Resque::Plugins::RestrictionJob
site.dashboard_counter[:visitors_this_month] = obj.display_visitors_this_month
site.dashboard_counter[:visitors_this_year] = obj.display_visitors_this_year
site.save
OrbitJobLogger.info "DashboardCounter done #{site.dashboard_counter.to_s}"
OrbitLogger.info "DashboardCounter done #{site.dashboard_counter.to_s}"
end
+7
View File
@@ -0,0 +1,7 @@
class DelayedImpressionist
@queue = :low
def self.perform(object)
impressionist(object)
true
end
end
+1 -1
View File
@@ -5,6 +5,6 @@ class UpdateTagCloud
Tag.all.each do |tag|
tag.update_attribute(:cloud_view_count, tag.impressionist_count(:created_at.gte => 14.days.ago, :created_at.lte => Time.now))
end
OrbitJobLogger.info "UpdateTagCloud Done"
OrbitLogger.info "UpdateTagCloud Done"
end
end
+8
View File
@@ -0,0 +1,8 @@
class UserActionRecoder
@queue = :low
def self.perform(user,params)
UserAction.create!(:user=>user,:params=>params,:page=>"#{params['controller']}##{params['action']}")
true
end
end
+4 -7
View File
@@ -2,6 +2,8 @@ class Asset
include Mongoid::Document
include Mongoid::Timestamps
include OrbitTag::Taggable
taggable
mount_uploader :data, FileAssetUploader
@@ -16,19 +18,14 @@ class Asset
belongs_to :asset_category
belongs_to :assetable, polymorphic: true
has_and_belongs_to_many :tags, :class_name => "AssetTag"
# has_and_belongs_to_many :tags, :class_name => "AssetTag"
before_save :clean_tags
def sorted_tags
#tags.order_by(I18n.locale, :asc)
tags
end
protected
def clean_tags
self.tag_ids.delete('')
self.tagged_ids.delete('')
end
end
+13 -1
View File
@@ -26,7 +26,7 @@ class Item
after_save :rebuild_children_path, :if => "path_changed?"
def enabled_for_lang(lang)
enabled_for.include?(lang)
enabled_for.include?(lang) rescue false
end
def self.find_by_name(item_name)
@@ -64,6 +64,10 @@ class Item
true
end
end
def self.structure_ordered_items
self.get_children(Item.root, [])
end
protected
@@ -87,5 +91,13 @@ class Item
def validates_presence_of_parent_id?
true
end
def self.get_children(item, tree)
tree << item
item.children.each do |child|
self.get_children(child, tree)
end
tree
end
end
+23
View File
@@ -19,6 +19,7 @@ class ModuleApp
self[:get_widget_style] = reg.get_widgets
self[:using_default_widget] = !reg.get_default_widget.blank?
self[:widgets] = reg.get_widgets
self[:has_tag] = reg.get_has_tags
end
@@ -135,5 +136,27 @@ class ModuleApp
def self.find_by_key(key)
self.where(key: key)[0] rescue nil
end
def sorted_tags_for_cloud
temp_tags = {}
self.tags.each{ |tag|
temp_tags.merge!({tag => Tag.get_impressionist(tag)})
}
if !temp_tags.blank?
sorted_tags = temp_tags.sort{|a,b| a[1]<=>b[1]}.reverse
sorted_tags[0][1] = :hot1
offset = (sorted_tags.size - 1) / 3
i = 1
class_i = 2
sorted_tags[1..-1].collect!{ |x|
x[1] = "hot#{class_i}"
i == offset ? i = 1 : i += 1 if class_i < 4
class_i += 1 if i == offset && class_i < 4
}
sorted_tags
else
[]
end
end
end
+34
View File
@@ -0,0 +1,34 @@
module Mongoid
module Sortable
extend ActiveSupport::Concern
included do
field :sort_number, type: Integer
after_initialize :set_sort_number
end
module ClassMethods
def default_sort(sorted = true)
if !sorted
asc(:sort_number)
else
asc
end
end
end
private
def set_sort_number
if self.new? && self.sort_number.nil?
last_record = self.class.desc(:sort_number).first
if last_record.sort_number
self.sort_number = (last_record.sort_number + 10) / 10 * 10
else
self.sort_number = 10
end
end
end
end
end
+21 -21
View File
@@ -19,27 +19,27 @@ class Tag
#field :cloud_amper,:type: Integer,:default=> 0
def self.sorted_for_cloud
tags = {}
self.all.each{ |tag|
tags.merge!({tag => self.get_impressionist(tag)})
}
if !tags.blank?
sorted_tags = tags.sort{|a,b| a[1]<=>b[1]}.reverse
sorted_tags[0][1] = :hot1
offset = (sorted_tags.size - 1) / 3
i = 1
class_i = 2
sorted_tags[1..-1].collect!{ |x|
x[1] = "hot#{class_i}"
i == offset ? i = 1 : i += 1 if class_i < 4
class_i += 1 if i == offset && class_i < 4
}
sorted_tags
else
[]
end
end
# def self.sorted_for_cloud
# tags = {}
# self.all.each{ |tag|
# tags.merge!({tag => self.get_impressionist(tag)})
# }
# if !tags.blank?
# sorted_tags = tags.sort{|a,b| a[1]<=>b[1]}.reverse
# sorted_tags[0][1] = :hot1
# offset = (sorted_tags.size - 1) / 3
# i = 1
# class_i = 2
# sorted_tags[1..-1].collect!{ |x|
# x[1] = "hot#{class_i}"
# i == offset ? i = 1 : i += 1 if class_i < 4
# class_i += 1 if i == offset && class_i < 4
# }
# sorted_tags
# else
# []
# end
# end
protected
+8
View File
@@ -6,4 +6,12 @@ class Tagging
belongs_to :tag
belongs_to :taggable, polymorphic: true
before_destroy :update_taggable_tag_ids
private
def update_taggable_tag_ids
self.taggable.remove_id(self.tag.id)
end
end
+10 -1
View File
@@ -31,6 +31,8 @@ class User
# has_many :papers, :autosave => true, :dependent => :destroy
has_and_belongs_to_many :sub_role_tags
has_many :user_actions, :dependent => :destroy
# has_and_belongs_to_many :statuses
has_and_belongs_to_many :roles
has_and_belongs_to_many :sub_roles
@@ -181,7 +183,14 @@ class User
def self.get_member_list_attribute_value(user_id,role_type,field_key)
@attribute = ::Attribute.where(:key => role_type).first
@AttributeField = ::AttributeField.where(:key => field_key, :attribute_id => @attribute.id).first
return ::AttributeValue.where(attribute_field_id: @AttributeField.id, :user_id => user_id).first[I18n.locale.to_s]
return ::AttributeValue.where(attribute_field_id: @AttributeField.id, :user_id => user_id).first
end
def self.get_role_member_data_by_sort(role_status_id)
a = Array.new
where(:role_status_ids=>role_status_id).desc(:_id).collect{|t| a << [ get_member_list_attribute_value(t.id,"staff","job_title")['val'].to_i, t ] }
member_data = a.sort
member_data_tmp = member_data.collect {|v| v[1] }
end
def create_dept_cache
+10
View File
@@ -0,0 +1,10 @@
class UserAction
include Mongoid::Document
include Mongoid::Timestamps
belongs_to :user
field :params,:type => Hash
field :page
end
+1
View File
@@ -9,4 +9,5 @@
<div class="form-actions form-fixed pagination-right">
<%= link_to content_tag(:i, nil, :class => 'icon-plus icon-white') + t(:add), new_admin_design_path, :class => 'btn btn-primary pull-right' %>
<%= link_to content_tag(:i, nil, :class => 'icon-plus icon-white') + t(:upload), upload_package_admin_designs_path, :class => 'btn btn-primary pull-right' %>
</div>
@@ -1,7 +1,8 @@
<% content_for :side_bar do %>
<%= render 'admin/sites/side_bar' %>
<%= render :partial => 'layouts/side_bar', :locals => {:link_name => t('site.settings'), :link_url => admin_site_site_info_path(@site), :side_bar_content => 'admin/sites/side_bar'} %>
<% end %>
<div class="main2">
<%= form_tag '',:multipart => true,:action=>"post" do |f| %>
@@ -9,7 +9,7 @@
<div class="tab-content">
<div class="tab-pane active in" id="summary">
<h2><%= I18n.t("site.system_preference_.summary.disk_space") %>:</h2>
<%= content_tag :p,@site.disk_space %>
<%= content_tag :p,@site.disk_space.gsub(/\n/,"<br />").html_safe if @site.disk_space %>
<h2><%= I18n.t("site.system_preference_.summary.code_update_at") %>: </h2>
<% @site.system_package_info.each do |index,value| %>
<h2><%= index.titleize %> <%= I18n.t("site.system_preference_.summary.version") %>:</h2>
@@ -20,7 +20,7 @@
<div class="tab-pane" id="commits">
<% if @git_commit_list_file %>
<% @git_commit_list_file.lines do |line|%>
<%= (line + "<br/>").html_safe %>
<%= line %><br/>
<% end%>
<% else %>
<div class="well"><%= I18n.t("site.system_preference_.summary.no_data") %></div>
@@ -29,7 +29,7 @@
<div class="tab-pane" id="backups">
<%if @db_backup_list_file %>
<% @db_backup_list_file.lines do |line|%>
<%=(line + "<br/>").html_safe %>
<%=line %><br/>
<% end %>
<% else %>
<div class="well"><%= I18n.t("site.system_preference_.summary.no_data") %></div>
@@ -38,7 +38,7 @@
<div class="tab-pane" id="resque_logs">
<%if @db_backup_list_file %>
<% @resque_logs_file.lines do |line|%>
<%=(line + "<br/>").html_safe %>
<%=line %><br/>
<% end if @resque_logs_file%>
<%else %>
<div class="well"><%= I18n.t("site.system_preference_.summary.no_data") %></div>
@@ -0,0 +1,16 @@
<table class="table">
<tr>
<th><%= I18n.t 'user_action.time' %></th>
<th><%= I18n.t 'user_action.name' %></th>
<th><%= I18n.t 'user_action.page' %></th>
</tr>
<% @user_actions.each do |user_action| %>
<tr>
<td><%= user_action.created_at %></td>
<td><%= user_action.user.name %></td>
<td><%= user_action.page %></td>
</tr>
<% end %>
</table>
@@ -6,7 +6,7 @@
<%= content_tag :li, link_to((t(:member_authorization) + content_tag(:i, nil, :class => 'icon-chevron-right')).html_safe, '#'), :class => active_for_action('users_new_interfacexx', 'index') if (is_admin? rescue nil) %>
<%= content_tag :li, link_to((t(:member_registration) + content_tag(:i, nil, :class => 'icon-chevron-right')).html_safe, '#'), :class => active_for_action('users_new_interfacexx', 'index') if (is_admin? rescue nil) %>
<%= content_tag :li, link_to((t(:member_role) + content_tag(:i, nil, :class => 'icon-chevron-right')).html_safe,admin_roles_path ), :class => active_for_action('users_new_interfacexx', 'index') if (is_admin? rescue nil) %>
<%= content_tag :li, link_to((t(:member_info) + content_tag(:i, nil, :class => 'icon-chevron-right')).html_safe, edit_admin_info_path(Info.first.id.to_s)), :class => active_for_action('users_new_interfacexx', 'index') if (is_admin? rescue nil) %>
<%= content_tag :li, link_to((t(:member_info) + content_tag(:i, nil, :class => 'icon-chevron-right')).html_safe, edit_admin_info_path(Info.first.id.to_s)), :class => active_for_action('users_new_interfacexx', 'index') if (is_admin? rescue nil) and Info.first %>
<% end -%>
<% end -%>
@@ -1,5 +1,7 @@
<%= render :partial => 'shared/search_header',:locals=>{:items=>@data} %>
<%= render @partial %>
<% if @paginate %>
<% if @paginate and !@data.blank? %>
<%= paginate @data, :param_name => :page_main, :params => {:same_page_id => @page_id} %>
<% elsif @page_part.module_app %>
<%= @page_part.module_app.get_registration.default_widget_setting.link_to_more_tag(request,params) %>
+10
View File
@@ -0,0 +1,10 @@
<% unless @tags.blank? %>
<div class="tag_cloud">
<h3 class="h3"><%= t(:tag_cloud) %></h3>
<div class="cloud">
<% @tags.each do |tag| %>
<%= link_to tag[0].name, current_path({:tag_id => tag[0].id, :category_id => params[:category_id]}), :class => "#{tag[1]} #{tag[0].id.to_s.eql?(params[:tag_id]) ? 'active' : nil} " %>
<% end %>
</div>
</div>
<% end %>
+6 -18
View File
@@ -2,24 +2,16 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>R4</title>
<link rel="shortcut icon" href="/favicon.ico">
<title><%= @title || APP_CONFIG['orbit'] %></title>
<link rel="shortcut icon" href="<%= asset_path "ncculogo.ico" %>">
<%= yield :page_specific_link %>
<%= stylesheet_link_tag "application" %>
<%= javascript_include_tag "application" %>
<%= stylesheet_link_tag "new_admin" %>
<%= javascript_include_tag "new_admin" %>
<%= csrf_meta_tag %>
</head>
<body>
<body class="folded">
<%= render 'layouts/orbit_bar' %>
<div id="container">
<ul class="hmenu">
<%= render 'devise/menu/registration_items' %>
<%= render 'devise/menu/login_items' %>
</ul>
<div id="header">
<h1>RulingSite</h1>
</div>
<div class="content">
<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>
@@ -27,10 +19,6 @@
<div class="secondary"><%= yield :secondary %></div>
<div class="tertiary"><%= yield :tertiary %></div>
</div>
<div id="footer">
<p>Rulingcom</p>
</div>
</div>
<%= yield :page_specific_javascript %>
</body>
+31
View File
@@ -0,0 +1,31 @@
<!DOCTYPE HTML>
<html class="<%= I18n.locale.to_s %>">
<head>
<meta charset="utf-8">
<%= page_title(@item).html_safe %>
<link rel="shortcut icon" href="<%= asset_path "ncculogo.ico" %>">
<%= page_metas(@item).html_safe %>
<!--[if lt IE 9]>
<%= javascript_include_tag "html5" %>
<![endif]-->
<%= page_stylesheets(@item).html_safe %>
<link href='/assets/standalone.css' rel='stylesheet' type='text/css' />
<%= yield :page_stylesheets %>
<%= page_javascripts(@item).html_safe %>
<%= csrf_meta_tag %>
</head>
<body>
<div class="wrapper">
<%= yield %>
</div>
<% if flash[:error] %>
<div class="modal alert alert-error hide" id="myModal">
<p type="button" class="close" data-dismiss="modal">×</p>
<%= "<strong>#{flash[:error]}</strong><br/>".html_safe%>
</div>
<script>
$('#myModal').modal('show')
</script>
<% end -%>
</body>
</html>
+6
View File
@@ -0,0 +1,6 @@
<% if items.blank? and !params[:search_query].blank? %>
<%=render :partial => 'shared/search_not_found' %>
<% elsif !params[:search_query].blank? %>
<%= t("search.result_get",:search_word => params[:search_query],:item_num=>items.count) unless (items.count == 30) %>
<%= t("search.too_many",:search_word => params[:search_query],:exceed_num=>items.count) if (items.count ==30) %>
<% end %>
+1 -1
View File
@@ -6,4 +6,4 @@ YAML::ENGINE.yamler = 'syck'
# Initialize the rails application
Orbit::Application.initialize!
Me = Site.first
OrbitJobLogger = OrbitJobLog.new
OrbitLogger = Logger::Syslog.new
+14
View File
@@ -19,6 +19,7 @@ Orbit::Application.configure do
# Generate digests for assets URLs
config.assets.digest = true
config.logger = Logger::Syslog.new
# Defaults to Rails.root.join("public/assets")
# config.assets.manifest = YOUR_PATH
@@ -58,4 +59,17 @@ Orbit::Application.configure do
# Send deprecation notices to registered listeners
config.active_support.deprecation = :notify
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
:enable_starttls_auto => true,
:address => "smtp.gmail.com",
:port => '587',
:domain => "smtp.gmail.com",
:authentication => "plain",
:user_name => "redmine@rulingcom.com",
:password => "rulingredmine"
}
end
@@ -7,7 +7,7 @@ module OrbitSystemPreference
DefaultDiskSpaceLimit = 3 #in GB
module SystemPackage
MongodbVersion = "mongod --version"
NginxVersion = "nginx -V"
NginxVersion = "nginx -V 2>&1"
SystemVersion = "uname -a"
end
end
+1
View File
@@ -43,6 +43,7 @@ public_r_tags:
- sub_menu
- sitemap
- breadcrumb
- tag_cloud
page_part_kinds:
- text
+5
View File
@@ -461,9 +461,14 @@ en:
success_: Successfully updated
update_: Update
update_at: Update at
upload: Upload
url: URL
use_status: Use Statue
user: User
user_action:
time: Time
name: Account
page: Access Page and Action
users:
admin_change_password: You cannot change your own password here!
avatar: Profile Picture
+1 -1
View File
@@ -10,4 +10,4 @@ zh_tw:
language: 語言
location: 地理位置
location_description: '<h3>本大學</h3>302新竹縣竹北市嘉豐南路二段101號'
page: 頁面
page: 頁面
+11 -5
View File
@@ -133,7 +133,7 @@ zh_tw:
date:
calendar: 紀年法
format: 格式
minguo_calendar:
minguo_calendar:
after: 民國
before: 民前
first_year: 民國元年
@@ -200,7 +200,7 @@ zh_tw:
errors:
at_least_one: 至少擁有一個值
field: 欄位
file:
file:
size: 檔案大小
type: 檔案類型
upload: F上傳檔案
@@ -344,7 +344,7 @@ zh_tw:
registered: 已註冊
rejected: 拒絕
rejected_reason: 拒絕原因:'
rejected_reason_empty: "拒絕核准, 沒有參考資訊"
rejected_reason_empty: "拒絕核准, 沒有參考資訊"
related_links: 相關連結
role: 身份
role_field: 身份欄位
@@ -396,7 +396,7 @@ zh_tw:
tab_backups: 備份記錄
tab_commits: 程式版本
tab_summary: 總覽
tab_logs: 登錄檔
tab_logs: 排程工作日誌
summary:
code_update_at: 程式更新紀錄
disk_space: 硬碟空間
@@ -462,9 +462,14 @@ zh_tw:
success_: 使用者已更新成功
update_: 更新
update_at: 最後更新時間
upload: 上傳
url: 網址
use_status: 使用狀態
user: 使用者
user_action:
time: 時間
name: 使用帳號
page: 頁面
users:
admin_change_password: 您不能在此處修改自己的密碼!
avatar: 大頭貼照
@@ -479,7 +484,7 @@ zh_tw:
female: 女性
unknown: 未知
last_name: 姓氏
office_tel: 辦公室電話
office_tel: 辦公室電話
office_tel_note: 將公開於網頁
sid: 編號
sid_note: 教職員工編號或學生學號
@@ -498,3 +503,4 @@ zh_tw:
visitors_this_year: 今年造訪人次
visitors_today: 今日造訪人次
yes_: "是"
sort_number: 排序數
+1 -1
View File
@@ -8,7 +8,7 @@ defaults: &defaults
development:
<<: *defaults
database: test_site
database: production_7
test:
<<: *defaults
database: test_site
+1 -1
View File
@@ -25,7 +25,7 @@ num_workers.times do |num|
end
w.env = {"QUEUE"=>queue, "RAILS_ENV"=>rails_env}
w.start = "HOME=#{user_home} QUEUE=* RAILS_ENV=#{rails_env}" rake -f #{rails_root}/Rakefile resque:work
w.start = "HOME=#{user_home} QUEUE=* RAILS_ENV=#{rails_env} rake -f #{rails_root}/Rakefile resque:work"
w.uid = (rails_env == 'production' )? "root" : development_uid
w.gid = (rails_env == 'production' )? "root" : development_gid
+1 -1
View File
@@ -10,7 +10,7 @@ development_gid = ''
w.group = 'resque'
w.interval = 30.seconds
w.env = {"QUEUE"=>"critical,high,low", "RAILS_ENV"=>rails_env}
w.start = "HOME= #{user_home} QUEUE=* RAILS_ENV=#{rails_env}" rake -f #{rails_root}/Rakefile resque:scheduler
w.start = "HOME= #{user_home} QUEUE=* RAILS_ENV=#{rails_env} rake -f #{rails_root}/Rakefile resque:scheduler"
w.uid = (rails_env == 'production' )? "root" : development_uid
w.gid = (rails_env == 'production' )? "root" : development_gid
+6 -3
View File
@@ -1,6 +1,8 @@
Orbit::Application.routes.draw do
# get "robots.txt" => 'robots#index'
devise_for :users do
match "/users_passwd" => "desktop/registrations#update", :as => :users_passwd, :via => :put
end
@@ -18,6 +20,7 @@ Orbit::Application.routes.draw do
# routes for admin
namespace :admin do
match 'user_actions' => 'user_actions#index'
match 'system_preference' => "sites#show_system_preference",:as=>"system_preference"
mount Resque::Server.new, :at => "/resque"
resources :assets do
@@ -259,7 +262,7 @@ Orbit::Application.routes.draw do
end
end
controller_paths :front, %w[show_breadcrumb show_banner show_footer show_menu show_page_sub_menu show_site_sub_menu show_sitemap]
controller_paths :front, %w[show_breadcrumb show_banner show_footer show_menu show_page_sub_menu show_site_sub_menu show_sitemap show_tag_cloud]
# controller_paths :mobile, %w[index announcement announcement_content dialog_contact dialog_copyright dialog_language map page page_content]
# scope 'app' do
@@ -285,11 +288,11 @@ Orbit::Application.routes.draw do
match '/panel/:app_name/front_end/:app_action/:id(/:controller_action)' => 'pages#show_from_link', :constraints => lambda { |request|
!request.query_string.include?("inner=true")
!request.query_string.include?("inner=true") && !request.query_string.include?("standalone=true")
}
match '/panel/:app_name/front_end/:app_action' => 'pages#index_from_link', :constraints => lambda { |request|
!request.query_string.include?("inner=true")
!request.query_string.include?("inner=true") && !request.query_string.include?("standalone=true")
}
match '/share/:model/:id' => 'application#render_share'
+1
View File
@@ -4,6 +4,7 @@ require "orbit_app/helper/renderer"
require "orbit_app/helper/side_bar_renderer"
require "orbit_app/helper/context_link_renderer"
require "orbit_app/helper/default_widget_tag_helper"
require "orbit_app/helper/front_end_array_params_helper"
require "orbit_app/module/side_bar"
require "orbit_app/module/widget"
require "orbit_app/module/front_end"
@@ -4,9 +4,20 @@ module DefaultWidgetTagHelper
def link_to_more_tag(req,params)
@request = req
@params =params
params.delete :inner
@params = params
params_str ="?"
params.each do |index,param|
if param.is_a?(Array) and !param.blank?
params_str << param.collect{|t| "#{index}[]=#{t}"}.join("&")
params.delete index
end
end
params_str = params_str + (params_str.eql?("?") ? params.to_param : "&#{params.to_param}" )
content_tag :div,:class=> 'more' do
link_to I18n.t(@more_link[:label_i18n]),eval(@more_link[:path_method])
link_to I18n.t(@more_link[:label_i18n]),[eval("#{@more_link[:path_method]}"),params_str].join()
end
end
end
@@ -0,0 +1,20 @@
module FrontEndArrayParamsHelper
#Deal with multi tags and cates that could be sat at both from setting or passed by views like tag cloud.
#Take Tag as example: Those tags which be sat at setting will be pass as params 'tag_ext',and the rest will be pass as 'tag'
#But when the showing process goes to fronend or default widget itself the controller will need to know what data it should use exactly.
#That's why we need tags_and_cates
def tags_and_cates(params)
params["category_id"] = params["category_id"].collect{|t| t.gsub(/\"|\[|\]/,'').split(",").each(&:strip!)}.flatten if params["category_id"].is_a? Array
params["tag_id"] = params["tag_id"].collect{|t| t.gsub(/\"|\[|\]/,'').split(",").each(&:strip!)}.flatten if params["tag_id"].is_a? Array
params["category_id"] = [ params["base_category_id"],params["category_id"]].flatten.reject(&:nil?).reject(&:empty?)
params.delete :base_category_id
params["tag_id"] = [ params["base_tag_id"],params["tag_id"]].flatten.reject(&:nil?).reject(&:empty?)
params.delete :base_tag_id
return params
end
end
+10 -1
View File
@@ -28,7 +28,7 @@ module OrbitApp
end
class DataSheet
attr_reader :name,:key,:base_path,:module_label,:data_count
attr_reader :name,:key,:base_path,:module_label,:data_count, :has_tag
def initialize(name, &block)
@name = name
@@ -37,6 +37,7 @@ module OrbitApp
@front_end_app_pages = nil
@module_label = 'rulingcom.errors.init.module_app_noname'
@data_count = 1..15 # as default
@has_tag = nil
block.arity < 1 ? instance_eval(&block) : block.call(self) if block_given?
setup_module_app
end
@@ -144,6 +145,14 @@ module OrbitApp
define_method(field){|var| instance_variable_set( "@" + field, var)}
end
def taggable
@has_tag = true
end
def get_has_tags
@has_tag.nil? ? false : true
end
end # of class DataSheet
end
-32
View File
@@ -1,32 +0,0 @@
class OrbitJobLog < Logger
FORMAT = "%m/%d/%Y %H:%M%p: "
def initialize
case Rails.env
when 'production'
# Logger::Syslog.new("orbit_routine", Syslog::LOG_LOCAL5)
super(Orbit::Application.config.root.to_s+'/log/orbit_job.log','daily')
when 'development'
super(Orbit::Application.config.root.to_s+'/log/orbit_job.dev.log','daily')
end
end
def debug(msg)
super(Time.now.strftime()+msg)
end
def info(msg)
super(Time.now.strftime(FORMAT)+msg)
end
def warn(msg)
super(Time.now.strftime(FORMAT)+msg)
end
def error(msg)
super(Time.now.strftime(FORMAT)+msg)
end
def fatal(msg)
super(Time.now.strftime(FORMAT)+msg)
end
end
+23 -13
View File
@@ -13,17 +13,35 @@ module OrbitTag
def init_tag
class_eval do
field :tags_to_destroy, type: Array, default: []
field :tagged_ids, type: Array, default: []
has_many :taggings, as: :taggable, autosave: true, dependent: :destroy
accepts_nested_attributes_for :taggings, allow_destroy: true
after_save :remove_taggings, unless: Proc.new{self.tags_to_destroy.blank?}
def remove_id(id)
self.class.without_callback(:save, :after, :remove_taggings) do
self.update_attribute(:tagged_ids, self.tagged_ids - [id.to_s])
end
end
def sorted_tags
if tags.blank?
[]
else
tag_array = tags.inject([]){ |result, value|
result << [value.name, value]
}
tag_array.sort.map{|x| x[1] }
end
end
def tags
self.taggings.blank? ? [] : self.taggings.map{|t| t.tag}
self.taggings.blank? ? [] : self.taggings.map{|t| t.tag}.compact
end
def tags=(tag_ids)
tag_ids = [tag_ids].flatten
ids = [tag_ids].flatten
tag_ids.delete('')
ids = self.taggings.blank? ? [] : self.taggings.map{|t| t.tag.id}
tag_ids.each do |tag_id|
@@ -40,17 +58,9 @@ module OrbitTag
def tag_ids=(ids)
self.tags = ids
end
def sorted_tags
if tags.blank?
[]
else
tag_array = tags.inject([]){ |result, value|
result << [value.name, value]
}
tag_array.sort.map{|x| x[1] }
end
ids = [ids].flatten
ids.delete('')
self.tagged_ids = ids
end
private
+26 -1
View File
@@ -1,5 +1,6 @@
module ParserCommon
include ActionView::Helpers::TagHelper
include ActionView::Helpers::TagHelper
# include ActionView::Helpers::UrlHelper
def menu_level(page, current_page, current, menu, edit = false)
res = ''
@@ -170,6 +171,30 @@ module ParserCommon
end
end
# tag_cloud
def parse_tag_clouds_edit(body = nil, page = nil, edit=nil)
body.css('tag_cloud').each do |tag_cloud|
module_app = ModuleApp.find(tag_cloud["id"]) rescue nil
res = ''
if module_app
res << "<div class='tag_cloud'>"
res << "<h3 class='h3'>#{t(:tag_cloud)}</h3>"
res << "<div class='cloud'>"
module_app.sorted_tags_for_cloud.each do |tag|
# res << link_to(tag[0].name, ('/' + {:tag_id => tag[0].id, :category_id => params[:category_id]}.to_param), :class => "#{tag[1]} #{tag[0].id.to_s.eql?(params[:tag_id]) ? 'active' : nil} ")
res << "<span class='#{tag[1]} #{tag[0].id.to_s.eql?(params[:tag_id]) ? 'active' : nil}'>"
res << tag[0].name
res << "</span>"
end
res << "</div>"
res << "</div>"
end
fragment = Nokogiri::HTML::DocumentFragment.new(body, res)
tag_cloud.swap(fragment)
end
end
# page_footer
def parse_footer_edit(body, page)
page_footer = body.css('.page_footer').first
+22 -10
View File
@@ -18,9 +18,12 @@ module ParserFrontEnd
i18n
end
def parse_page_content(page,args=nil)
tag = params[:tag_id].blank? ? page[:tag] : params[:tag_id]
category = params[:category_id].blank? ? page[:category] : params[:category_id]
def parse_page_content(page,args={})
args["category_id"] = args["category_id"].gsub(/\"|\[|\]/,'').split(",").each(&:strip!) if !args["category_id"].blank? and args["category_id"].is_a?(String)
args["tag_id"] = args["tag_id"].gsub(/\"|\[|\]/,'').split(",").each(&:strip!) if !args["tag_id"].blank? and args["tag_id"].is_a? String
# tag = params[:tag_id].blank? ? page[:tag] : params[:tag_id]
# category = params[:category_id].blank? ? page[:category] : params[:category_id]
body = Nokogiri::HTML(page.content)
body.css('orbit_front').each do |front|
if front['value']
@@ -29,9 +32,12 @@ module ParserFrontEnd
ret = ''
part = PagePart.find(front['part_id']) if front['part_id']
ret << eval("\"#{front['path']}\"") rescue ''
args.each do |index,arg|
ret << (ret.include?("?") ? "&#{index}=#{arg}": "?#{index}=#{arg}" )
if index=="tag_id" || index=="category_id"
ret << (ret.include?("?") ? "&#{index}[]=#{arg}": "?#{index}[]=#{arg}" )
else
ret << (ret.include?("?") ? "&#{index}=#{arg}": "?#{index}=#{arg}" )
end
end if args
fragment = Nokogiri::HTML::DocumentFragment.new(body, "<div class='dymanic_load widget' path='#{ret}'></div>")
end
@@ -124,8 +130,8 @@ module ParserFrontEnd
url = "/panel/#{page.module_app.key}/front_end/#{page.app_frontend_url}\#{(\"/\" + params[:id]) if params[:id] && !params[:id].eql?(page.id.to_s)}\#{(\"/\" + params[:controller_action]) if params[:controller_action] && params[:id]}?inner=true"
end
categories_str=category.collect{|t| "category_id[]=#{t}"}.join('&')
tags_str=tag.collect{|t| "tag_id[]=#{t}"}.join('&')
categories_str=category.collect{|t| "base_category_id[]=#{t}"}.join('&')
tags_str=tag.collect{|t| "base_tag_id[]=#{t}"}.join('&')
categories_str = "&#{categories_str}" unless categories_str.blank?
tags_str = "&#{tags_str}" unless tags_str.blank?
@@ -147,12 +153,13 @@ module ParserFrontEnd
"/panel/\#{part.module_app.key}/widget/\#{part.widget_path}?inner=true"
end
categories_str=part[:category].collect{|t| "category_id[]=#{t}"}.join('&')
tags_str=part[:tag].collect{|t| "tag_id[]=#{t}"}.join('&')
categories_str=part[:category].collect{|t| "base_category_id[]=#{t}"}.join('&')
tags_str=part[:tag].collect{|t| "base_tag_id[]=#{t}"}.join('&')
categories_str = "&#{categories_str}" unless categories_str.blank?
tags_str = "&#{tags_str}" unless tags_str.blank?
options = "&part_id=\#{part.id}#{categories_str}#{tags_str}&page=\#{params[:page]}&search_query=\#{params[:search_query]}&clicked_field_name=\#{params[:clicked_field_name]}&part_title=\#{Rack::Utils.escape(part_title).gsub(\"\+\", \"\%20\") rescue nil}&item_type=page_part"
options = "&part_id=\#{part.id}#{categories_str}#{tags_str}&page=\#{params[:page]}&search_query=\#{params[:search_query]}&clicked_field_name=\#{params[:clicked_field_name]}&part_title=\#{Rack::Utils.escape(part_title).gsub(\"\+\", \"\%20\") rescue nil}&item_type=page_part&tag_id=\#{params[:tag_id]}&category_id=\#{params[:category_id]}"
ret << "<orbit_front path='#{url + options}' part_id=#{part.id} class='dymanic_load widget'></orbit_front>"
when 'public_r_tag'
@@ -210,4 +217,9 @@ module ParserFrontEnd
def generate_breadcrumbs(*args)
"<div class='dymanic_load' path='#{front_show_breadcrumb_path(args[1])}'></div>"
end
# tag_cloud
def generate_tag_clouds(*args)
"<div class='dymanic_load' path='#{front_show_tag_cloud_path(args[0])}'></div>"
end
end
+25 -3
View File
@@ -3,12 +3,34 @@
namespace :site do
task :build => :environment do
Site.destroy_all
Purchase.destroy_all
Site.create( :school => 'RulingDigital University', :department => 'Computer Science', :valid_locales => [ 'en', 'zh_tw' ], :in_use_locales => [ 'zh_tw', 'en' ])
User.create!(:email=>'chris@rulingcom.com',:admin=>true,:user_id=>'chris',:password=>'password')
`mongo #{Mongoid.config.database.name} --eval "db.fs.chunks.ensureIndex({files_id: 1, n: 1})"`
puts "Congres you can now login within url"
puts 'Please upload design package (/admin/designs/upload_package ) and run rake site:necessary_data'
I18nVariable.create!( :document_class => 'language', :key => 'en', :en => 'English', :zh_tw => '英文' )
I18nVariable.create!( :document_class => 'language', :key => 'zh_tw', :en => 'Chinese', :zh_tw => '中文' )
Info.create!(key: "profile", built_in: true, disabled: false, title: {"zh_tw"=>"基本欄位", "en"=>"Basic Info"}, to_search: false)
end
task :necessary_data => :environment do
site = Site.first
site.title = 'RulingOrbit Demo Site'
site.save
# home_trans = I18nVariable.create!( :document_class => 'Home', :key => 'home', :en => 'Homepage', :zh_tw => '首頁')
design = Design.first
site = Site.first
site.design = design
site.save
theme = design.themes.first
home = Page.new( :design_id => design.id, :name => 'home', :is_published => true, :theme_id => theme.id )
home.title_translations = {"zh_tw"=>"首頁", "en"=>"Home"}
home.save
end
end
+28 -1
View File
@@ -1 +1,28 @@
403 FORIBDDEN
<!DOCTYPE HTML>
<html lang="en-US">
<head>
<meta charset="UTF-8">
<title></title>
<link rel="stylesheet" type="text/css" href="stylesheets/error-pages.css" media="all"/>
</head>
<body>
<style type="text/css">
body {
margin: 0;
padding: 40px 0 0 0;
background-color: #F3F3F3;
}
</style>
<!-- Error Pages Start Here -->
<div id="error-page">
<div class="card">
<div class="figure code-403"></div>
<div class="message">
<h1>We're Sorry</h1>
<p>You are not authorized to view this page</p>
</div>
</div>
</div>
<!-- Error Pages End Here -->
</body>
</html>
+24 -22
View File
@@ -1,26 +1,28 @@
<!DOCTYPE html>
<html>
<!DOCTYPE HTML>
<html lang="en-US">
<head>
<title>The page you were looking for doesn't exist (404)</title>
<style type="text/css">
body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
div.dialog {
width: 25em;
padding: 0 4em;
margin: 4em auto 0 auto;
border: 1px solid #ccc;
border-right-color: #999;
border-bottom-color: #999;
}
h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
</style>
<meta charset="UTF-8">
<title></title>
<link rel="stylesheet" type="text/css" href="stylesheets/error-pages.css" media="all"/>
</head>
<body>
<!-- This file lives in public/404.html -->
<div class="dialog">
<h1>The page you were looking for doesn't exist.</h1>
<p>You may have mistyped the address or the page may have moved.</p>
</div>
<style type="text/css">
body {
margin: 0;
padding: 40px 0 0 0;
background-color: #F3F3F3;
}
</style>
<!-- Error Pages Start Here -->
<div id="error-page">
<div class="card">
<div class="figure code-404"></div>
<div class="message">
<h1>We're Sorry</h1>
<p>The page you were looking for doesn’t exist.</p>
</div>
</div>
</div>
<!-- Error Pages End Here -->
</body>
</html>
</html>
+24 -22
View File
@@ -1,26 +1,28 @@
<!DOCTYPE html>
<html>
<!DOCTYPE HTML>
<html lang="en-US">
<head>
<title>We're sorry, but something went wrong (500)</title>
<style type="text/css">
body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
div.dialog {
width: 25em;
padding: 0 4em;
margin: 4em auto 0 auto;
border: 1px solid #ccc;
border-right-color: #999;
border-bottom-color: #999;
}
h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
</style>
<meta charset="UTF-8">
<title></title>
<link rel="stylesheet" type="text/css" href="stylesheets/error-pages.css" media="all"/>
</head>
<body>
<!-- This file lives in public/500.html -->
<div class="dialog">
<h1>We're sorry, but something went wrong.</h1>
<p>We've been notified about this issue and we'll take a look at it shortly.</p>
</div>
<style type="text/css">
body {
margin: 0;
padding: 40px 0 0 0;
background-color: #F3F3F3;
}
</style>
<!-- Error Pages Start Here -->
<div id="error-page">
<div class="card">
<div class="figure code-500"></div>
<div class="message">
<h1>We're Sorry</h1>
<p>We’ve been notified about this issue and we’ll take a look at it shortly.</p>
</div>
</div>
</div>
<!-- Error Pages End Here -->
</body>
</html>
</html>
Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

+41
View File
@@ -0,0 +1,41 @@
@import url(http://fonts.googleapis.com/css?family=Roboto+Condensed);
#error-page {
width: 820px;
margin: 160px auto 0 auto;
}
#error-page .card {
overflow: hidden;
}
#error-page .figure {
width: 460px;
height: 260px;
float: left;
}
#error-page .figure.code-403 { background: url(../img/403.png) center bottom no-repeat; }
#error-page .figure.code-404 { background: url(../img/404.png) center bottom no-repeat; }
#error-page .figure.code-500 { background: url(../img/500.png) center bottom no-repeat; }
#error-page .message {
float: right;
width: 330px;
margin: 60px 0 0 0;
padding: 16px 0;
border: solid 3px #D8D8D8;
border-left: 0;
border-right: 0;
text-align: center;
}
#error-page .message > * {
margin: 0;
}
#error-page .message h1 {
color: #333;
font-size: 52px;
font-family: 'Roboto Condensed', sans-serif;
}
#error-page .message p {
color: #999;
font-size: 15px;
font-family: sans-serif;
padding: 16px 0;
}
-31
View File
@@ -1,31 +0,0 @@
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<!-- The content of this page will be statically included into the top
of the admin page. Uncomment this as an example to see there the content
will show up.
<hr>
<i>This line will appear before the first table</i>
<tr>
<td colspan="2">
This row will be appended to the end of the first table
</td>
</tr>
<hr>
-->
-36
View File
@@ -1,36 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<!-- If this file is found in the config directory, it will only be
loaded once at startup. If it is found in Solr's data
directory, it will be re-loaded every commit.
-->
<elevate>
<query text="foo bar">
<doc id="1" />
<doc id="2" />
<doc id="3" />
</query>
<query text="ipod">
<doc id="MA147LL/A" /> <!-- put the actual ipod at the top -->
<doc id="IW-02" exclude="true" /> <!-- exclude this cable -->
</query>
</elevate>
-246
View File
@@ -1,246 +0,0 @@
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Syntax:
# "source" => "target"
# "source".length() > 0 (source cannot be empty.)
# "target".length() >= 0 (target can be empty.)
# example:
# "À" => "A"
# "\u00C0" => "A"
# "\u00C0" => "\u0041"
# "ß" => "ss"
# "\t" => " "
# "\n" => ""
# À => A
"\u00C0" => "A"
# Á => A
"\u00C1" => "A"
# Â => A
"\u00C2" => "A"
# Ã => A
"\u00C3" => "A"
# Ä => A
"\u00C4" => "A"
# Å => A
"\u00C5" => "A"
# Æ => AE
"\u00C6" => "AE"
# Ç => C
"\u00C7" => "C"
# È => E
"\u00C8" => "E"
# É => E
"\u00C9" => "E"
# Ê => E
"\u00CA" => "E"
# Ë => E
"\u00CB" => "E"
# Ì => I
"\u00CC" => "I"
# Í => I
"\u00CD" => "I"
# Î => I
"\u00CE" => "I"
# Ï => I
"\u00CF" => "I"
# IJ => IJ
"\u0132" => "IJ"
# Ð => D
"\u00D0" => "D"
# Ñ => N
"\u00D1" => "N"
# Ò => O
"\u00D2" => "O"
# Ó => O
"\u00D3" => "O"
# Ô => O
"\u00D4" => "O"
# Õ => O
"\u00D5" => "O"
# Ö => O
"\u00D6" => "O"
# Ø => O
"\u00D8" => "O"
# Œ => OE
"\u0152" => "OE"
# Þ
"\u00DE" => "TH"
# Ù => U
"\u00D9" => "U"
# Ú => U
"\u00DA" => "U"
# Û => U
"\u00DB" => "U"
# Ü => U
"\u00DC" => "U"
# Ý => Y
"\u00DD" => "Y"
# Ÿ => Y
"\u0178" => "Y"
# à => a
"\u00E0" => "a"
# á => a
"\u00E1" => "a"
# â => a
"\u00E2" => "a"
# ã => a
"\u00E3" => "a"
# ä => a
"\u00E4" => "a"
# å => a
"\u00E5" => "a"
# æ => ae
"\u00E6" => "ae"
# ç => c
"\u00E7" => "c"
# è => e
"\u00E8" => "e"
# é => e
"\u00E9" => "e"
# ê => e
"\u00EA" => "e"
# ë => e
"\u00EB" => "e"
# ì => i
"\u00EC" => "i"
# í => i
"\u00ED" => "i"
# î => i
"\u00EE" => "i"
# ï => i
"\u00EF" => "i"
# ij => ij
"\u0133" => "ij"
# ð => d
"\u00F0" => "d"
# ñ => n
"\u00F1" => "n"
# ò => o
"\u00F2" => "o"
# ó => o
"\u00F3" => "o"
# ô => o
"\u00F4" => "o"
# õ => o
"\u00F5" => "o"
# ö => o
"\u00F6" => "o"
# ø => o
"\u00F8" => "o"
# œ => oe
"\u0153" => "oe"
# ß => ss
"\u00DF" => "ss"
# þ => th
"\u00FE" => "th"
# ù => u
"\u00F9" => "u"
# ú => u
"\u00FA" => "u"
# û => u
"\u00FB" => "u"
# ü => u
"\u00FC" => "u"
# ý => y
"\u00FD" => "y"
# ÿ => y
"\u00FF" => "y"
# ff => ff
"\uFB00" => "ff"
# fi => fi
"\uFB01" => "fi"
# fl => fl
"\uFB02" => "fl"
# ffi => ffi
"\uFB03" => "ffi"
# ffl => ffl
"\uFB04" => "ffl"
# ſt => ft
"\uFB05" => "ft"
# st => st
"\uFB06" => "st"
-21
View File
@@ -1,21 +0,0 @@
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#-----------------------------------------------------------------------
# Use a protected word file to protect against the stemmer reducing two
# unrelated words to the same base word.
# Some non-words that normally won't be encountered,
# just to test that they won't be stemmed.
dontstems
zwhacky
-238
View File
@@ -1,238 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<!--
This is the Solr schema file. This file should be named "schema.xml" and
should be in the conf directory under the solr home
(i.e. ./solr/conf/schema.xml by default)
or located where the classloader for the Solr webapp can find it.
This example schema is the recommended starting point for users.
It should be kept correct and concise, usable out-of-the-box.
For more information, on how to customize this file, please see
http://wiki.apache.org/solr/SchemaXml
PERFORMANCE NOTE: this schema includes many optional features and should not
be used for benchmarking. To improve performance one could
- set stored="false" for all fields possible (esp large fields) when you
only need to search on the field but don't need to return the original
value.
- set indexed="false" if you don't need to search on the field, but only
return the field as a result of searching on other indexed fields.
- remove all unneeded copyField statements
- for best index size and searching performance, set "index" to false
for all general text fields, use copyField to copy them to the
catchall "text" field, and use that for searching.
- For maximum indexing performance, use the StreamingUpdateSolrServer
java client.
- Remember to run the JVM in server mode, and use a higher logging level
that avoids logging every request
-->
<schema name="sunspot" version="1.0">
<types>
<!-- field type definitions. The "name" attribute is
just a label to be used by field definitions. The "class"
attribute and any other attributes determine the real
behavior of the fieldType.
Class names starting with "solr" refer to java classes in the
org.apache.solr.analysis package.
-->
<!-- *** This fieldType is used by Sunspot! *** -->
<fieldType name="string" class="solr.StrField" omitNorms="true"/>
<!-- *** This fieldType is used by Sunspot! *** -->
<fieldType name="tdouble" class="solr.TrieDoubleField" omitNorms="true"/>
<!-- *** This fieldType is used by Sunspot! *** -->
<fieldType name="rand" class="solr.RandomSortField" omitNorms="true"/>
<!-- *** This fieldType is used by Sunspot! *** -->
<fieldType name="text" class="solr.TextField" omitNorms="false">
<analyzer>
<tokenizer class="solr.CJKTokenizerFactory"/>
<filter class="solr.StandardFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
<!-- *** This fieldType is used by Sunspot! *** -->
<fieldType name="boolean" class="solr.BoolField" omitNorms="true"/>
<!-- *** This fieldType is used by Sunspot! *** -->
<fieldType name="date" class="solr.DateField" omitNorms="true"/>
<!-- *** This fieldType is used by Sunspot! *** -->
<fieldType name="sdouble" class="solr.SortableDoubleField" omitNorms="true"/>
<!-- *** This fieldType is used by Sunspot! *** -->
<fieldType name="sfloat" class="solr.SortableFloatField" omitNorms="true"/>
<!-- *** This fieldType is used by Sunspot! *** -->
<fieldType name="sint" class="solr.SortableIntField" omitNorms="true"/>
<!-- *** This fieldType is used by Sunspot! *** -->
<fieldType name="slong" class="solr.SortableLongField" omitNorms="true"/>
<!-- *** This fieldType is used by Sunspot! *** -->
<fieldType name="tint" class="solr.TrieIntField" omitNorms="true"/>
<!-- *** This fieldType is used by Sunspot! *** -->
<fieldType name="tfloat" class="solr.TrieFloatField" omitNorms="true"/>
<!-- *** This fieldType is used by Sunspot! *** -->
<fieldType name="tdate" class="solr.TrieDateField" omitNorms="true"/>
</types>
<fields>
<!-- Valid attributes for fields:
name: mandatory - the name for the field
type: mandatory - the name of a previously defined type from the
<types> section
indexed: true if this field should be indexed (searchable or sortable)
stored: true if this field should be retrievable
compressed: [false] if this field should be stored using gzip compression
(this will only apply if the field type is compressable; among
the standard field types, only TextField and StrField are)
multiValued: true if this field may contain multiple values per document
omitNorms: (expert) set to true to omit the norms associated with
this field (this disables length normalization and index-time
boosting for the field, and saves some memory). Only full-text
fields or fields that need an index-time boost need norms.
termVectors: [false] set to true to store the term vector for a
given field.
When using MoreLikeThis, fields used for similarity should be
stored for best performance.
termPositions: Store position information with the term vector.
This will increase storage costs.
termOffsets: Store offset information with the term vector. This
will increase storage costs.
default: a value that should be used if no value is specified
when adding a document.
-->
<!-- *** This field is used by Sunspot! *** -->
<field name="id" stored="true" type="string" multiValued="false" indexed="true"/>
<!-- *** This field is used by Sunspot! *** -->
<field name="type" stored="false" type="string" multiValued="true" indexed="true"/>
<!-- *** This field is used by Sunspot! *** -->
<field name="class_name" stored="false" type="string" multiValued="false" indexed="true"/>
<!-- *** This field is used by Sunspot! *** -->
<field name="text" stored="false" type="string" multiValued="true" indexed="true"/>
<!-- *** This field is used by Sunspot! *** -->
<field name="lat" stored="true" type="tdouble" multiValued="false" indexed="true"/>
<!-- *** This field is used by Sunspot! *** -->
<field name="lng" stored="true" type="tdouble" multiValued="false" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="random_*" stored="false" type="rand" multiValued="false" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="_local*" stored="false" type="tdouble" multiValued="false" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_text" stored="false" type="text" multiValued="true" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_texts" stored="true" type="text" multiValued="true" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_b" stored="false" type="boolean" multiValued="false" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_bm" stored="false" type="boolean" multiValued="true" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_bs" stored="true" type="boolean" multiValued="false" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_bms" stored="true" type="boolean" multiValued="true" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_d" stored="false" type="date" multiValued="false" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_dm" stored="false" type="date" multiValued="true" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_ds" stored="true" type="date" multiValued="false" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_dms" stored="true" type="date" multiValued="true" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_e" stored="false" type="sdouble" multiValued="false" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_em" stored="false" type="sdouble" multiValued="true" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_es" stored="true" type="sdouble" multiValued="false" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_ems" stored="true" type="sdouble" multiValued="true" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_f" stored="false" type="sfloat" multiValued="false" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_fm" stored="false" type="sfloat" multiValued="true" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_fs" stored="true" type="sfloat" multiValued="false" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_fms" stored="true" type="sfloat" multiValued="true" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_i" stored="false" type="sint" multiValued="false" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_im" stored="false" type="sint" multiValued="true" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_is" stored="true" type="sint" multiValued="false" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_ims" stored="true" type="sint" multiValued="true" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_l" stored="false" type="slong" multiValued="false" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_lm" stored="false" type="slong" multiValued="true" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_ls" stored="true" type="slong" multiValued="false" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_lms" stored="true" type="slong" multiValued="true" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_s" stored="false" type="string" multiValued="false" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_sm" stored="false" type="string" multiValued="true" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_ss" stored="true" type="string" multiValued="false" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_sms" stored="true" type="string" multiValued="true" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_it" stored="false" type="tint" multiValued="false" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_itm" stored="false" type="tint" multiValued="true" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_its" stored="true" type="tint" multiValued="false" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_itms" stored="true" type="tint" multiValued="true" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_ft" stored="false" type="tfloat" multiValued="false" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_ftm" stored="false" type="tfloat" multiValued="true" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_fts" stored="true" type="tfloat" multiValued="false" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_ftms" stored="true" type="tfloat" multiValued="true" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_dt" stored="false" type="tdate" multiValued="false" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_dtm" stored="false" type="tdate" multiValued="true" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_dts" stored="true" type="tdate" multiValued="false" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_dtms" stored="true" type="tdate" multiValued="true" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_textv" stored="false" termVectors="true" type="text" multiValued="true" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_textsv" stored="true" termVectors="true" type="text" multiValued="true" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_et" stored="false" termVectors="true" type="tdouble" multiValued="false" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_etm" stored="false" termVectors="true" type="tdouble" multiValued="true" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_ets" stored="true" termVectors="true" type="tdouble" multiValued="false" indexed="true"/>
<!-- *** This dynamicField is used by Sunspot! *** -->
<dynamicField name="*_etms" stored="true" termVectors="true" type="tdouble" multiValued="true" indexed="true"/>
</fields>
<!-- Field to use to determine and enforce document uniqueness.
Unless this field is marked with required="false", it will be a required field
-->
<uniqueKey>id</uniqueKey>
<!-- field for the QueryParser to use when an explicit fieldname is absent -->
<defaultSearchField>text</defaultSearchField>
<!-- SolrQueryParser configuration: defaultOperator="AND|OR" -->
<solrQueryParser defaultOperator="AND"/>
<!-- copyField commands copy one field to another at the time a document
is added to the index. It's used either to index the same field differently,
or to add multiple fields to the same field for easier/faster searching. -->
</schema>
-24
View File
@@ -1,24 +0,0 @@
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
user=
solr_hostname=localhost
solr_port=8983
rsyncd_port=18983
data_dir=
webapp_name=solr
master_host=
master_data_dir=
master_status_dir=
-934
View File
@@ -1,934 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<!--
For more details about configurations options that may appear in this
file, see http://wiki.apache.org/solr/SolrConfigXml.
Specifically, the Solr Config can support XInclude, which may make it easier to manage
the configuration. See https://issues.apache.org/jira/browse/SOLR-1167
-->
<config>
<!-- Set this to 'false' if you want solr to continue working after it has
encountered an severe configuration error. In a production environment,
you may want solr to keep working even if one handler is mis-configured.
You may also set this to false using by setting the system property:
-Dsolr.abortOnConfigurationError=false
-->
<abortOnConfigurationError>${solr.abortOnConfigurationError:true}</abortOnConfigurationError>
<!-- lib directives can be used to instruct Solr to load an Jars identified
and use them to resolve any "plugins" specified in your solrconfig.xml or
schema.xml (ie: Analyzers, Request Handlers, etc...).
All directories and paths are resolved relative the instanceDir.
If a "./lib" directory exists in your instanceDir, all files found in it
are included as if you had used the following syntax...
<lib dir="./lib" />
-->
<!-- A dir option by itself adds any files found in the directory to the
classpath, this is useful for including all jars in a directory.
-->
<lib dir="../../contrib/extraction/lib"/>
<!-- When a regex is specified in addition to a directory, only the files in that
directory which completely match the regex (anchored on both ends)
will be included.
-->
<lib dir="../../dist/" regex="apache-solr-cell-\d.*\.jar"/>
<lib dir="../../dist/" regex="apache-solr-clustering-\d.*\.jar"/>
<!-- If a dir option (with or without a regex) is used and nothing is found
that matches, it will be ignored
-->
<lib dir="../../contrib/clustering/lib/downloads/"/>
<lib dir="../../contrib/clustering/lib/"/>
<lib dir="/total/crap/dir/ignored"/>
<!-- an exact path can be used to specify a specific file. This will cause
a serious error to be logged if it can't be loaded.
<lib path="../a-jar-that-does-not-exist.jar" />
-->
<!-- Used to specify an alternate directory to hold all index data
other than the default ./data under the Solr home.
If replication is in use, this should match the replication configuration. -->
<dataDir>${solr.data.dir:./solr/data}</dataDir>
<!-- WARNING: this <indexDefaults> section only provides defaults for index writers
in general. See also the <mainIndex> section after that when changing parameters
for Solr's main Lucene index. -->
<indexDefaults>
<!-- Values here affect all index writers and act as a default unless overridden. -->
<useCompoundFile>false</useCompoundFile>
<mergeFactor>10</mergeFactor>
<!-- If both ramBufferSizeMB and maxBufferedDocs is set, then Lucene will flush
based on whichever limit is hit first. -->
<!--<maxBufferedDocs>1000</maxBufferedDocs>-->
<!-- Sets the amount of RAM that may be used by Lucene indexing
for buffering added documents and deletions before they are
flushed to the Directory. -->
<ramBufferSizeMB>32</ramBufferSizeMB>
<!-- <maxMergeDocs>2147483647</maxMergeDocs> -->
<maxFieldLength>10000</maxFieldLength>
<writeLockTimeout>1000</writeLockTimeout>
<commitLockTimeout>10000</commitLockTimeout>
<!--
Expert: Turn on Lucene's auto commit capability. This causes intermediate
segment flushes to write a new lucene index descriptor, enabling it to be
opened by an external IndexReader. This can greatly slow down indexing
speed. NOTE: Despite the name, this value does not have any relation to
Solr's autoCommit functionality
-->
<!--<luceneAutoCommit>false</luceneAutoCommit>-->
<!--
Expert: The Merge Policy in Lucene controls how merging is handled by
Lucene. The default in 2.3 is the LogByteSizeMergePolicy, previous
versions used LogDocMergePolicy.
LogByteSizeMergePolicy chooses segments to merge based on their size. The
Lucene 2.2 default, LogDocMergePolicy chose when to merge based on number
of documents
Other implementations of MergePolicy must have a no-argument constructor
-->
<!--<mergePolicy class="org.apache.lucene.index.LogByteSizeMergePolicy"/>-->
<!--
Expert:
The Merge Scheduler in Lucene controls how merges are performed. The
ConcurrentMergeScheduler (Lucene 2.3 default) can perform merges in the
background using separate threads. The SerialMergeScheduler (Lucene 2.2
default) does not.
-->
<!--<mergeScheduler class="org.apache.lucene.index.ConcurrentMergeScheduler"/>-->
<!--
This option specifies which Lucene LockFactory implementation to use.
single = SingleInstanceLockFactory - suggested for a read-only index
or when there is no possibility of another process trying
to modify the index.
native = NativeFSLockFactory - uses OS native file locking
simple = SimpleFSLockFactory - uses a plain file for locking
(For backwards compatibility with Solr 1.2, 'simple' is the default
if not specified.)
-->
<lockType>native</lockType>
<!--
Expert:
Controls how often Lucene loads terms into memory -->
<!--<termIndexInterval>256</termIndexInterval>-->
</indexDefaults>
<mainIndex>
<!-- options specific to the main on-disk lucene index -->
<useCompoundFile>false</useCompoundFile>
<ramBufferSizeMB>32</ramBufferSizeMB>
<mergeFactor>10</mergeFactor>
<!-- Deprecated -->
<!--<maxBufferedDocs>1000</maxBufferedDocs>-->
<!--<maxMergeDocs>2147483647</maxMergeDocs>-->
<!-- inherit from indexDefaults <maxFieldLength>10000</maxFieldLength> -->
<!-- If true, unlock any held write or commit locks on startup.
This defeats the locking mechanism that allows multiple
processes to safely access a lucene index, and should be
used with care.
This is not needed if lock type is 'none' or 'single'
-->
<unlockOnStartup>false</unlockOnStartup>
<!-- If true, IndexReaders will be reopened (often more efficient) instead
of closed and then opened. -->
<reopenReaders>true</reopenReaders>
<!--
Expert:
Controls how often Lucene loads terms into memory. Default is 128 and is likely good for most everyone. -->
<!--<termIndexInterval>256</termIndexInterval>-->
<!--
Custom deletion policies can specified here. The class must
implement org.apache.lucene.index.IndexDeletionPolicy.
http://lucene.apache.org/java/2_3_2/api/org/apache/lucene/index/IndexDeletionPolicy.html
The standard Solr IndexDeletionPolicy implementation supports deleting
index commit points on number of commits, age of commit point and
optimized status.
The latest commit point should always be preserved regardless
of the criteria.
-->
<deletionPolicy class="solr.SolrDeletionPolicy">
<!-- The number of commit points to be kept -->
<str name="maxCommitsToKeep">1</str>
<!-- The number of optimized commit points to be kept -->
<str name="maxOptimizedCommitsToKeep">0</str>
<!--
Delete all commit points once they have reached the given age.
Supports DateMathParser syntax e.g.
<str name="maxCommitAge">30MINUTES</str>
<str name="maxCommitAge">1DAY</str>
-->
</deletionPolicy>
<!-- To aid in advanced debugging, you may turn on IndexWriter debug logging.
Setting to true will set the file that the underlying Lucene IndexWriter
will write its debug infostream to. -->
<infoStream file="INFOSTREAM.txt">false</infoStream>
</mainIndex>
<!-- Enables JMX if and only if an existing MBeanServer is found, use this
if you want to configure JMX through JVM parameters. Remove this to disable
exposing Solr configuration and statistics to JMX.
If you want to connect to a particular server, specify the agentId
e.g. <jmx agentId="myAgent" />
If you want to start a new MBeanServer, specify the serviceUrl
e.g <jmx serviceUrl="service:jmx:rmi:///jndi/rmi://localhost:9999/solr"/>
For more details see http://wiki.apache.org/solr/SolrJmx
-->
<jmx/>
<!-- the default high-performance update handler -->
<updateHandler class="solr.DirectUpdateHandler2">
<!-- A prefix of "solr." for class names is an alias that
causes solr to search appropriate packages, including
org.apache.solr.(search|update|request|core|analysis)
-->
<!-- Perform a <commit/> automatically under certain conditions:
maxDocs - number of updates since last commit is greater than this
maxTime - oldest uncommited update (in ms) is this long ago
Instead of enabling autoCommit, consider using "commitWithin"
when adding documents. http://wiki.apache.org/solr/UpdateXmlMessages
<autoCommit>
<maxDocs>10000</maxDocs>
<maxTime>1000</maxTime>
</autoCommit>
-->
<!-- The RunExecutableListener executes an external command from a
hook such as postCommit or postOptimize.
exe - the name of the executable to run
dir - dir to use as the current working directory. default="."
wait - the calling thread waits until the executable returns. default="true"
args - the arguments to pass to the program. default=nothing
env - environment variables to set. default=nothing
-->
<!-- A postCommit event is fired after every commit or optimize command
<listener event="postCommit" class="solr.RunExecutableListener">
<str name="exe">solr/bin/snapshooter</str>
<str name="dir">.</str>
<bool name="wait">true</bool>
<arr name="args"> <str>arg1</str> <str>arg2</str> </arr>
<arr name="env"> <str>MYVAR=val1</str> </arr>
</listener>
-->
<!-- A postOptimize event is fired only after every optimize command
<listener event="postOptimize" class="solr.RunExecutableListener">
<str name="exe">snapshooter</str>
<str name="dir">solr/bin</str>
<bool name="wait">true</bool>
</listener>
-->
</updateHandler>
<!-- Use the following format to specify a custom IndexReaderFactory - allows for alternate
IndexReader implementations.
** Experimental Feature **
Please note - Using a custom IndexReaderFactory may prevent certain other features
from working. The API to IndexReaderFactory may change without warning or may even
be removed from future releases if the problems cannot be resolved.
** Features that may not work with custom IndexReaderFactory **
The ReplicationHandler assumes a disk-resident index. Using a custom
IndexReader implementation may cause incompatibility with ReplicationHandler and
may cause replication to not work correctly. See SOLR-1366 for details.
<indexReaderFactory name="IndexReaderFactory" class="package.class">
Parameters as required by the implementation
</indexReaderFactory >
-->
<!-- To set the termInfosIndexDivisor, do this: -->
<!--<indexReaderFactory name="IndexReaderFactory" class="org.apache.solr.core.StandardIndexReaderFactory">
<int name="termInfosIndexDivisor">12</int>
</indexReaderFactory >-->
<query>
<!-- Maximum number of clauses in a boolean query... in the past, this affected
range or prefix queries that expanded to big boolean queries - built in Solr
query parsers no longer create queries with this limitation.
An exception is thrown if exceeded. -->
<maxBooleanClauses>1024</maxBooleanClauses>
<!-- There are two implementations of cache available for Solr,
LRUCache, based on a synchronized LinkedHashMap, and
FastLRUCache, based on a ConcurrentHashMap. FastLRUCache has faster gets
and slower puts in single threaded operation and thus is generally faster
than LRUCache when the hit ratio of the cache is high (> 75%), and may be
faster under other scenarios on multi-cpu systems. -->
<!-- Cache used by SolrIndexSearcher for filters (DocSets),
unordered sets of *all* documents that match a query.
When a new searcher is opened, its caches may be prepopulated
or "autowarmed" using data from caches in the old searcher.
autowarmCount is the number of items to prepopulate. For LRUCache,
the autowarmed items will be the most recently accessed items.
Parameters:
class - the SolrCache implementation LRUCache or FastLRUCache
size - the maximum number of entries in the cache
initialSize - the initial capacity (number of entries) of
the cache. (seel java.util.HashMap)
autowarmCount - the number of entries to prepopulate from
and old cache.
-->
<filterCache class="solr.FastLRUCache" size="512" initialSize="512" autowarmCount="0"/>
<!-- Cache used to hold field values that are quickly accessible
by document id. The fieldValueCache is created by default
even if not configured here.
<fieldValueCache
class="solr.FastLRUCache"
size="512"
autowarmCount="128"
showItems="32"
/>
-->
<!-- queryResultCache caches results of searches - ordered lists of
document ids (DocList) based on a query, a sort, and the range
of documents requested. -->
<queryResultCache class="solr.LRUCache" size="512" initialSize="512" autowarmCount="0"/>
<!-- documentCache caches Lucene Document objects (the stored fields for each document).
Since Lucene internal document ids are transient, this cache will not be autowarmed. -->
<documentCache class="solr.LRUCache" size="512" initialSize="512" autowarmCount="0"/>
<!-- If true, stored fields that are not requested will be loaded lazily.
This can result in a significant speed improvement if the usual case is to
not load all stored fields, especially if the skipped fields are large
compressed text fields.
-->
<enableLazyFieldLoading>true</enableLazyFieldLoading>
<!-- Example of a generic cache. These caches may be accessed by name
through SolrIndexSearcher.getCache(),cacheLookup(), and cacheInsert().
The purpose is to enable easy caching of user/application level data.
The regenerator argument should be specified as an implementation
of solr.search.CacheRegenerator if autowarming is desired. -->
<!--
<cache name="myUserCache"
class="solr.LRUCache"
size="4096"
initialSize="1024"
autowarmCount="1024"
regenerator="org.mycompany.mypackage.MyRegenerator"
/>
-->
<!-- An optimization that attempts to use a filter to satisfy a search.
If the requested sort does not include score, then the filterCache
will be checked for a filter matching the query. If found, the filter
will be used as the source of document ids, and then the sort will be
applied to that.
<useFilterForSortedQuery>true</useFilterForSortedQuery>
-->
<!-- An optimization for use with the queryResultCache. When a search
is requested, a superset of the requested number of document ids
are collected. For example, if a search for a particular query
requests matching documents 10 through 19, and queryWindowSize is 50,
then documents 0 through 49 will be collected and cached. Any further
requests in that range can be satisfied via the cache. -->
<queryResultWindowSize>20</queryResultWindowSize>
<!-- Maximum number of documents to cache for any entry in the
queryResultCache. -->
<queryResultMaxDocsCached>200</queryResultMaxDocsCached>
<!-- a newSearcher event is fired whenever a new searcher is being prepared
and there is a current searcher handling requests (aka registered).
It can be used to prime certain caches to prevent long request times for
certain requests.
-->
<!-- QuerySenderListener takes an array of NamedList and executes a
local query request for each NamedList in sequence. -->
<listener event="newSearcher" class="solr.QuerySenderListener">
<arr name="queries">
<!--
<lst> <str name="q">solr</str> <str name="start">0</str> <str name="rows">10</str> </lst>
<lst> <str name="q">rocks</str> <str name="start">0</str> <str name="rows">10</str> </lst>
<lst><str name="q">static newSearcher warming query from solrconfig.xml</str></lst>
-->
</arr>
</listener>
<!-- a firstSearcher event is fired whenever a new searcher is being
prepared but there is no current registered searcher to handle
requests or to gain autowarming data from. -->
<listener event="firstSearcher" class="solr.QuerySenderListener">
<arr name="queries">
<lst>
<str name="q">solr rocks</str>
<str name="start">0</str>
<str name="rows">10</str>
</lst>
<lst>
<str name="q">static firstSearcher warming query from solrconfig.xml</str>
</lst>
</arr>
</listener>
<!-- If a search request comes in and there is no current registered searcher,
then immediately register the still warming searcher and use it. If
"false" then all requests will block until the first searcher is done
warming. -->
<useColdSearcher>false</useColdSearcher>
<!-- Maximum number of searchers that may be warming in the background
concurrently. An error is returned if this limit is exceeded. Recommend
1-2 for read-only slaves, higher for masters w/o cache warming. -->
<maxWarmingSearchers>2</maxWarmingSearchers>
</query>
<!--
Let the dispatch filter handler /select?qt=XXX
handleSelect=true will use consistent error handling for /select and /update
handleSelect=false will use solr1.1 style error formatting
-->
<requestDispatcher handleSelect="true">
<!--Make sure your system has some authentication before enabling remote streaming! -->
<requestParsers enableRemoteStreaming="true" multipartUploadLimitInKB="2048000"/>
<!-- Set HTTP caching related parameters (for proxy caches and clients).
To get the behaviour of Solr 1.2 (ie: no caching related headers)
use the never304="true" option and do not specify a value for
<cacheControl>
-->
<!-- <httpCaching never304="true"> -->
<httpCaching lastModifiedFrom="openTime" etagSeed="Solr">
<!-- lastModFrom="openTime" is the default, the Last-Modified value
(and validation against If-Modified-Since requests) will all be
relative to when the current Searcher was opened.
You can change it to lastModFrom="dirLastMod" if you want the
value to exactly corrispond to when the physical index was last
modified.
etagSeed="..." is an option you can change to force the ETag
header (and validation against If-None-Match requests) to be
differnet even if the index has not changed (ie: when making
significant changes to your config file)
lastModifiedFrom and etagSeed are both ignored if you use the
never304="true" option.
-->
<!-- If you include a <cacheControl> directive, it will be used to
generate a Cache-Control header, as well as an Expires header
if the value contains "max-age="
By default, no Cache-Control header is generated.
You can use the <cacheControl> option even if you have set
never304="true"
-->
<!-- <cacheControl>max-age=30, public</cacheControl> -->
</httpCaching>
</requestDispatcher>
<!-- requestHandler plugins... incoming queries will be dispatched to the
correct handler based on the path or the qt (query type) param.
Names starting with a '/' are accessed with the a path equal to the
registered name. Names without a leading '/' are accessed with:
http://host/app/select?qt=name
If no qt is defined, the requestHandler that declares default="true"
will be used.
-->
<requestHandler name="standard" class="solr.SearchHandler" default="true">
<!-- default values for query parameters -->
<lst name="defaults">
<str name="echoParams">explicit</str>
<!--
<int name="rows">10</int>
<str name="fl">*</str>
<str name="version">2.1</str>
-->
</lst>
</requestHandler>
<!-- Please refer to http://wiki.apache.org/solr/SolrReplication for details on configuring replication -->
<!-- remove the <lst name="master"> section if this is just a slave -->
<!-- remove the <lst name="slave"> section if this is just a master -->
<!--
<requestHandler name="/replication" class="solr.ReplicationHandler" >
<lst name="master">
<str name="replicateAfter">commit</str>
<str name="replicateAfter">startup</str>
<str name="confFiles">schema.xml,stopwords.txt</str>
</lst>
<lst name="slave">
<str name="masterUrl">http://localhost:8983/solr/replication</str>
<str name="pollInterval">00:00:60</str>
</lst>
</requestHandler>-->
<!-- DisMaxRequestHandler allows easy searching across multiple fields
for simple user-entered phrases. It's implementation is now
just the standard SearchHandler with a default query type
of "dismax".
see http://wiki.apache.org/solr/DisMaxRequestHandler
-->
<requestHandler name="dismax" class="solr.SearchHandler">
<lst name="defaults">
<str name="defType">dismax</str>
<str name="echoParams">explicit</str>
<float name="tie">0.01</float>
<str name="qf">
text^0.5 features^1.0 name^1.2 sku^1.5 id^10.0 manu^1.1 cat^1.4
</str>
<str name="pf">
text^0.2 features^1.1 name^1.5 manu^1.4 manu_exact^1.9
</str>
<str name="bf">
popularity^0.5 recip(price,1,1000,1000)^0.3
</str>
<str name="fl">
id,name,price,score
</str>
<str name="mm">
2&lt;-1 5&lt;-2 6&lt;90%
</str>
<int name="ps">100</int>
<str name="q.alt">*:*</str>
<!-- example highlighter config, enable per-query with hl=true -->
<str name="hl.fl">text features name</str>
<!-- for this field, we want no fragmenting, just highlighting -->
<str name="f.name.hl.fragsize">0</str>
<!-- instructs Solr to return the field itself if no query terms are
found -->
<str name="f.name.hl.alternateField">name</str>
<str name="f.text.hl.fragmenter">regex</str>
<!-- defined below -->
</lst>
</requestHandler>
<!-- Note how you can register the same handler multiple times with
different names (and different init parameters)
-->
<requestHandler name="partitioned" class="solr.SearchHandler">
<lst name="defaults">
<str name="defType">dismax</str>
<str name="echoParams">explicit</str>
<str name="qf">text^0.5 features^1.0 name^1.2 sku^1.5 id^10.0</str>
<str name="mm">2&lt;-1 5&lt;-2 6&lt;90%</str>
<!-- This is an example of using Date Math to specify a constantly
moving date range in a config...
-->
<str name="bq">incubationdate_dt:[* TO NOW/DAY-1MONTH]^2.2</str>
</lst>
<!-- In addition to defaults, "appends" params can be specified
to identify values which should be appended to the list of
multi-val params from the query (or the existing "defaults").
In this example, the param "fq=instock:true" will be appended to
any query time fq params the user may specify, as a mechanism for
partitioning the index, independent of any user selected filtering
that may also be desired (perhaps as a result of faceted searching).
NOTE: there is *absolutely* nothing a client can do to prevent these
"appends" values from being used, so don't use this mechanism
unless you are sure you always want it.
-->
<lst name="appends">
<str name="fq">inStock:true</str>
</lst>
<!-- "invariants" are a way of letting the Solr maintainer lock down
the options available to Solr clients. Any params values
specified here are used regardless of what values may be specified
in either the query, the "defaults", or the "appends" params.
In this example, the facet.field and facet.query params are fixed,
limiting the facets clients can use. Faceting is not turned on by
default - but if the client does specify facet=true in the request,
these are the only facets they will be able to see counts for;
regardless of what other facet.field or facet.query params they
may specify.
NOTE: there is *absolutely* nothing a client can do to prevent these
"invariants" values from being used, so don't use this mechanism
unless you are sure you always want it.
-->
<lst name="invariants">
<str name="facet.field">cat</str>
<str name="facet.field">manu_exact</str>
<str name="facet.query">price:[* TO 500]</str>
<str name="facet.query">price:[500 TO *]</str>
</lst>
</requestHandler>
<!--
Search components are registered to SolrCore and used by Search Handlers
By default, the following components are avaliable:
<searchComponent name="query" class="org.apache.solr.handler.component.QueryComponent" />
<searchComponent name="facet" class="org.apache.solr.handler.component.FacetComponent" />
<searchComponent name="mlt" class="org.apache.solr.handler.component.MoreLikeThisComponent" />
<searchComponent name="highlight" class="org.apache.solr.handler.component.HighlightComponent" />
<searchComponent name="stats" class="org.apache.solr.handler.component.StatsComponent" />
<searchComponent name="debug" class="org.apache.solr.handler.component.DebugComponent" />
Default configuration in a requestHandler would look like:
<arr name="components">
<str>query</str>
<str>facet</str>
<str>mlt</str>
<str>highlight</str>
<str>stats</str>
<str>debug</str>
</arr>
If you register a searchComponent to one of the standard names, that will be used instead.
To insert components before or after the 'standard' components, use:
<arr name="first-components">
<str>myFirstComponentName</str>
</arr>
<arr name="last-components">
<str>myLastComponentName</str>
</arr>
-->
<!-- The spell check component can return a list of alternative spelling
suggestions. -->
<searchComponent name="spellcheck" class="solr.SpellCheckComponent">
<str name="queryAnalyzerFieldType">textSpell</str>
<lst name="spellchecker">
<str name="name">default</str>
<str name="field">name</str>
<str name="spellcheckIndexDir">./spellchecker</str>
</lst>
<!-- a spellchecker that uses a different distance measure
<lst name="spellchecker">
<str name="name">jarowinkler</str>
<str name="field">spell</str>
<str name="distanceMeasure">org.apache.lucene.search.spell.JaroWinklerDistance</str>
<str name="spellcheckIndexDir">./spellchecker2</str>
</lst>
-->
<!-- a file based spell checker
<lst name="spellchecker">
<str name="classname">solr.FileBasedSpellChecker</str>
<str name="name">file</str>
<str name="sourceLocation">spellings.txt</str>
<str name="characterEncoding">UTF-8</str>
<str name="spellcheckIndexDir">./spellcheckerFile</str>
</lst>
-->
</searchComponent>
<!-- A request handler utilizing the spellcheck component.
#############################################################################
NOTE: This is purely as an example. The whole purpose of the
SpellCheckComponent is to hook it into the request handler that handles (i.e.
the standard or dismax SearchHandler) queries such that a separate request is
not needed to get suggestions.
IN OTHER WORDS, THERE IS REALLY GOOD CHANCE THE SETUP BELOW IS NOT WHAT YOU
WANT FOR YOUR PRODUCTION SYSTEM!
#############################################################################
-->
<requestHandler name="/spell" class="solr.SearchHandler" lazy="true">
<lst name="defaults">
<!-- omp = Only More Popular -->
<str name="spellcheck.onlyMorePopular">false</str>
<!-- exr = Extended Results -->
<str name="spellcheck.extendedResults">false</str>
<!-- The number of suggestions to return -->
<str name="spellcheck.count">1</str>
</lst>
<arr name="last-components">
<str>spellcheck</str>
</arr>
</requestHandler>
<searchComponent name="tvComponent" class="org.apache.solr.handler.component.TermVectorComponent"/>
<!-- A Req Handler for working with the tvComponent. This is purely as an example.
You will likely want to add the component to your already specified request handlers. -->
<requestHandler name="tvrh" class="org.apache.solr.handler.component.SearchHandler">
<lst name="defaults">
<bool name="tv">true</bool>
</lst>
<arr name="last-components">
<str>tvComponent</str>
</arr>
</requestHandler>
<!-- Clustering Component
http://wiki.apache.org/solr/ClusteringComponent
This relies on third party jars which are not included in the release.
To use this component (and the "/clustering" handler)
Those jars will need to be downloaded, and you'll need to set the
solr.cluster.enabled system property when running solr...
java -Dsolr.clustering.enabled=true -jar start.jar
-->
<searchComponent name="clusteringComponent" enable="${solr.clustering.enabled:false}" class="org.apache.solr.handler.clustering.ClusteringComponent">
<!-- Declare an engine -->
<lst name="engine">
<!-- The name, only one can be named "default" -->
<str name="name">default</str>
<!--
Class name of Carrot2 clustering algorithm. Currently available algorithms are:
* org.carrot2.clustering.lingo.LingoClusteringAlgorithm
* org.carrot2.clustering.stc.STCClusteringAlgorithm
See http://project.carrot2.org/algorithms.html for the algorithm's characteristics.
-->
<str name="carrot.algorithm">org.carrot2.clustering.lingo.LingoClusteringAlgorithm</str>
<!--
Overriding values for Carrot2 default algorithm attributes. For a description
of all available attributes, see: http://download.carrot2.org/stable/manual/#chapter.components.
Use attribute key as name attribute of str elements below. These can be further
overridden for individual requests by specifying attribute key as request
parameter name and attribute value as parameter value.
-->
<str name="LingoClusteringAlgorithm.desiredClusterCountBase">20</str>
</lst>
<lst name="engine">
<str name="name">stc</str>
<str name="carrot.algorithm">org.carrot2.clustering.stc.STCClusteringAlgorithm</str>
</lst>
</searchComponent>
<requestHandler name="/clustering" enable="${solr.clustering.enabled:false}" class="solr.SearchHandler">
<lst name="defaults">
<bool name="clustering">true</bool>
<str name="clustering.engine">default</str>
<bool name="clustering.results">true</bool>
<!-- The title field -->
<str name="carrot.title">name</str>
<str name="carrot.url">id</str>
<!-- The field to cluster on -->
<str name="carrot.snippet">features</str>
<!-- produce summaries -->
<bool name="carrot.produceSummary">true</bool>
<!-- the maximum number of labels per cluster -->
<!--<int name="carrot.numDescriptions">5</int>-->
<!-- produce sub clusters -->
<bool name="carrot.outputSubClusters">false</bool>
</lst>
<arr name="last-components">
<str>clusteringComponent</str>
</arr>
</requestHandler>
<!-- Solr Cell: http://wiki.apache.org/solr/ExtractingRequestHandler -->
<requestHandler name="/update/extract" class="org.apache.solr.handler.extraction.ExtractingRequestHandler" startup="lazy">
<lst name="defaults">
<!-- All the main content goes into "text"... if you need to return
the extracted text or do highlighting, use a stored field. -->
<str name="fmap.content">text</str>
<str name="lowernames">true</str>
<str name="uprefix">ignored_</str>
<!-- capture link hrefs but ignore div attributes -->
<str name="captureAttr">true</str>
<str name="fmap.a">links</str>
<str name="fmap.div">ignored_</str>
</lst>
</requestHandler>
<!-- A component to return terms and document frequency of those terms.
This component does not yet support distributed search. -->
<searchComponent name="termsComponent" class="org.apache.solr.handler.component.TermsComponent"/>
<requestHandler name="/terms" class="org.apache.solr.handler.component.SearchHandler">
<lst name="defaults">
<bool name="terms">true</bool>
</lst>
<arr name="components">
<str>termsComponent</str>
</arr>
</requestHandler>
<!-- a search component that enables you to configure the top results for
a given query regardless of the normal lucene scoring.-->
<searchComponent name="elevator" class="solr.QueryElevationComponent">
<!-- pick a fieldType to analyze queries -->
<str name="queryFieldType">string</str>
<str name="config-file">elevate.xml</str>
</searchComponent>
<!-- a request handler utilizing the elevator component -->
<requestHandler name="/elevate" class="solr.SearchHandler" startup="lazy">
<lst name="defaults">
<str name="echoParams">explicit</str>
</lst>
<arr name="last-components">
<str>elevator</str>
</arr>
</requestHandler>
<!-- Update request handler.
Note: Since solr1.1 requestHandlers requires a valid content type header if posted in
the body. For example, curl now requires: -H 'Content-type:text/xml; charset=utf-8'
The response format differs from solr1.1 formatting and returns a standard error code.
To enable solr1.1 behavior, remove the /update handler or change its path
-->
<requestHandler name="/update" class="solr.XmlUpdateRequestHandler"/>
<requestHandler name="/update/javabin" class="solr.BinaryUpdateRequestHandler"/>
<!--
Analysis request handler. Since Solr 1.3. Use to return how a document is analyzed. Useful
for debugging and as a token server for other types of applications.
This is deprecated in favor of the improved DocumentAnalysisRequestHandler and FieldAnalysisRequestHandler
<requestHandler name="/analysis" class="solr.AnalysisRequestHandler" />
-->
<!--
An analysis handler that provides a breakdown of the analysis process of provided docuemnts. This handler expects a
(single) content stream with the following format:
<docs>
<doc>
<field name="id">1</field>
<field name="name">The Name</field>
<field name="text">The Text Value</field>
<doc>
<doc>...</doc>
<doc>...</doc>
...
</docs>
Note: Each document must contain a field which serves as the unique key. This key is used in the returned
response to assoicate an analysis breakdown to the analyzed document.
Like the FieldAnalysisRequestHandler, this handler also supports query analysis by
sending either an "analysis.query" or "q" request paraemter that holds the query text to be analyized. It also
supports the "analysis.showmatch" parameter which when set to true, all field tokens that match the query
tokens will be marked as a "match".
-->
<requestHandler name="/analysis/document" class="solr.DocumentAnalysisRequestHandler"/>
<!--
RequestHandler that provides much the same functionality as analysis.jsp. Provides the ability
to specify multiple field types and field names in the same request and outputs index-time and
query-time analysis for each of them.
Request parameters are:
analysis.fieldname - The field name whose analyzers are to be used
analysis.fieldtype - The field type whose analyzers are to be used
analysis.fieldvalue - The text for index-time analysis
q (or analysis.q) - The text for query time analysis
analysis.showmatch (true|false) - When set to true and when query analysis is performed, the produced
tokens of the field value analysis will be marked as "matched" for every
token that is produces by the query analysis
-->
<requestHandler name="/analysis/field" class="solr.FieldAnalysisRequestHandler"/>
<!-- CSV update handler, loaded on demand -->
<requestHandler name="/update/csv" class="solr.CSVRequestHandler" startup="lazy"/>
<!--
Admin Handlers - This will register all the standard admin RequestHandlers. Adding
this single handler is equivalent to registering:
<requestHandler name="/admin/luke" class="org.apache.solr.handler.admin.LukeRequestHandler" />
<requestHandler name="/admin/system" class="org.apache.solr.handler.admin.SystemInfoHandler" />
<requestHandler name="/admin/plugins" class="org.apache.solr.handler.admin.PluginInfoHandler" />
<requestHandler name="/admin/threads" class="org.apache.solr.handler.admin.ThreadDumpHandler" />
<requestHandler name="/admin/properties" class="org.apache.solr.handler.admin.PropertiesRequestHandler" />
<requestHandler name="/admin/file" class="org.apache.solr.handler.admin.ShowFileRequestHandler" >
If you wish to hide files under ${solr.home}/conf, explicitly register the ShowFileRequestHandler using:
<requestHandler name="/admin/file" class="org.apache.solr.handler.admin.ShowFileRequestHandler" >
<lst name="invariants">
<str name="hidden">synonyms.txt</str>
<str name="hidden">anotherfile.txt</str>
</lst>
</requestHandler>
-->
<requestHandler name="/admin/" class="org.apache.solr.handler.admin.AdminHandlers"/>
<!-- ping/healthcheck -->
<requestHandler name="/admin/ping" class="PingRequestHandler">
<lst name="defaults">
<str name="qt">standard</str>
<str name="q">solrpingquery</str>
<str name="echoParams">all</str>
</lst>
</requestHandler>
<!-- Echo the request contents back to the client -->
<requestHandler name="/debug/dump" class="solr.DumpRequestHandler">
<lst name="defaults">
<str name="echoParams">explicit</str>
<!-- for all params (including the default etc) use: 'all' -->
<str name="echoHandler">true</str>
</lst>
</requestHandler>
<highlighting>
<!-- Configure the standard fragmenter -->
<!-- This could most likely be commented out in the "default" case -->
<fragmenter name="gap" class="org.apache.solr.highlight.GapFragmenter" default="true">
<lst name="defaults">
<int name="hl.fragsize">100</int>
</lst>
</fragmenter>
<!-- A regular-expression-based fragmenter (f.i., for sentence extraction) -->
<fragmenter name="regex" class="org.apache.solr.highlight.RegexFragmenter">
<lst name="defaults">
<!-- slightly smaller fragsizes work better because of slop -->
<int name="hl.fragsize">70</int>
<!-- allow 50% slop on fragment sizes -->
<float name="hl.regex.slop">0.5</float>
<!-- a basic sentence pattern -->
<str name="hl.regex.pattern">[-\w ,/\n\"']{20,200}</str>
</lst>
</fragmenter>
<!-- Configure the standard formatter -->
<formatter name="html" class="org.apache.solr.highlight.HtmlFormatter" default="true">
<lst name="defaults">
<str name="hl.simple.pre"><![CDATA[<em>]]></str>
<str name="hl.simple.post"><![CDATA[</em>]]></str>
</lst>
</formatter>
</highlighting>
<!-- An example dedup update processor that creates the "id" field on the fly
based on the hash code of some other fields. This example has overwriteDupes
set to false since we are using the id field as the signatureField and Solr
will maintain uniqueness based on that anyway.
You have to link the chain to an update handler above to use it ie:
<requestHandler name="/update "class="solr.XmlUpdateRequestHandler">
<lst name="defaults">
<str name="update.processor">dedupe</str>
</lst>
</requestHandler>
-->
<!--
<updateRequestProcessorChain name="dedupe">
<processor class="org.apache.solr.update.processor.SignatureUpdateProcessorFactory">
<bool name="enabled">true</bool>
<str name="signatureField">id</str>
<bool name="overwriteDupes">false</bool>
<str name="fields">name,features,cat</str>
<str name="signatureClass">org.apache.solr.update.processor.Lookup3Signature</str>
</processor>
<processor class="solr.LogUpdateProcessorFactory" />
<processor class="solr.RunUpdateProcessorFactory" />
</updateRequestProcessorChain>
-->
<!-- queryResponseWriter plugins... query responses will be written using the
writer specified by the 'wt' request parameter matching the name of a registered
writer.
The "default" writer is the default and will be used if 'wt' is not specified
in the request. XMLResponseWriter will be used if nothing is specified here.
The json, python, and ruby writers are also available by default.
<queryResponseWriter name="xml" class="org.apache.solr.request.XMLResponseWriter" default="true"/>
<queryResponseWriter name="json" class="org.apache.solr.request.JSONResponseWriter"/>
<queryResponseWriter name="python" class="org.apache.solr.request.PythonResponseWriter"/>
<queryResponseWriter name="ruby" class="org.apache.solr.request.RubyResponseWriter"/>
<queryResponseWriter name="php" class="org.apache.solr.request.PHPResponseWriter"/>
<queryResponseWriter name="phps" class="org.apache.solr.request.PHPSerializedResponseWriter"/>
<queryResponseWriter name="custom" class="com.example.MyResponseWriter"/>
-->
<!-- XSLT response writer transforms the XML output by any xslt file found
in Solr's conf/xslt directory. Changes to xslt files are checked for
every xsltCacheLifetimeSeconds.
-->
<queryResponseWriter name="xslt" class="org.apache.solr.request.XSLTResponseWriter">
<int name="xsltCacheLifetimeSeconds">5</int>
</queryResponseWriter>
<!-- example of registering a query parser
<queryParser name="lucene" class="org.apache.solr.search.LuceneQParserPlugin"/>
-->
<!-- example of registering a custom function parser
<valueSourceParser name="myfunc" class="com.mycompany.MyValueSourceParser" />
-->
<!-- config for the admin interface -->
<admin>
<defaultQuery>solr</defaultQuery>
<!-- configure a healthcheck file for servers behind a loadbalancer
<healthcheck type="file">server-enabled</healthcheck>
-->
</admin>
<requestHandler class="solr.MoreLikeThisHandler" name="/mlt">
<lst name="defaults">
<str name="mlt.mintf">1</str>
<str name="mlt.mindf">2</str>
</lst>
</requestHandler>
</config>
-2
View File
@@ -1,2 +0,0 @@
pizza
history
-58
View File
@@ -1,58 +0,0 @@
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#-----------------------------------------------------------------------
# a couple of test stopwords to test that the words are really being
# configured from this file:
stopworda
stopwordb
#Standard english stop words taken from Lucene's StopAnalyzer
a
an
and
are
as
at
be
but
by
for
if
in
into
is
it
no
not
of
on
or
s
such
t
that
the
their
then
there
these
they
this
to
was
will
with
-31
View File
@@ -1,31 +0,0 @@
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#-----------------------------------------------------------------------
#some test synonym mappings unlikely to appear in real input text
aaa => aaaa
bbb => bbbb1 bbbb2
ccc => cccc1,cccc2
a\=>a => b\=>b
a\,a => b\,b
fooaaa,baraaa,bazaaa
# Some synonym groups specific to this example
GB,gib,gigabyte,gigabytes
MB,mib,megabyte,megabytes
Television, Televisions, TV, TVs
#notice we use "gib" instead of "GiB" so any WordDelimiterFilter coming
#after us won't split it into two words.
# Synonym mappings can be used for spelling correction too
pixima => pixma
@@ -0,0 +1,12 @@
class Panel::Announcement::BackEnd::BulletinVersionsController < OrbitBackendController
include OrbitControllerLib::DivisionForDisable
def index
@bulletin = Bulletin.find(params[:bulletin_id])
end
def show
@bulletin = Bulletin.find(params[:bulletin_id])
@version = @bulletin.versions.where(version: params[:id]).first
end
end
@@ -1,8 +0,0 @@
class Panel::Announcement::BackEnd::TagsController < Admin::TagsController
def initialize
super
@app_title = 'announcement'
end
end
@@ -13,6 +13,18 @@ class Panel::Announcement::FrontEnd::BulletinsController < OrbitWidgetController
render :index
end
def search_result
@search = Bulletin.solr_search do
fulltext params[:search_query]
with(:frontend_search,true)
with(:available_lang).any_of([I18n.locale.to_s])
end
search_result = @search.results.collect{|result| result.id}
@bulletins = Bulletin.all.available_for_lang(I18n.locale).can_display.any_in(_id:search_result).page( params[:page_main]).per(@page_num)
end
def index
@item = Page.find(params[:page_id]) rescue nil
if @item
@@ -23,7 +35,6 @@ class Panel::Announcement::FrontEnd::BulletinsController < OrbitWidgetController
end
@frontend_style = @item.frontend_style
end
@item = Page.find(params[:page_id]) rescue nil
if !params[:search_query].blank?
# search_cond = {:is_checked=>true,:is_hidden=>false,:is_pending => false}
@@ -39,21 +50,17 @@ class Panel::Announcement::FrontEnd::BulletinsController < OrbitWidgetController
else
date_now = Time.now
if !params[:category_id].blank? && !params[:tag_id].blank?
@tag = AnnouncementTag.find(params[:tag_id]) rescue nil
@tag = AnnouncementTag.where(key: params[:tag_id])[0] unless @tag
@bulletins = @tag.bulletins.available_for_lang(I18n.locale).can_display.where(:bulletin_category_id => params[:category_id]).any_of( {deadline: nil,:postdate.lte => date_now} , {:deadline.gte => date_now,:postdate.lte => date_now} ).desc( :is_top, :postdate).page( params[:page_main]).per(@page_num)
@bulletins = Bulletin.available_for_lang(I18n.locale).can_display.where(:bulletin_category_id => params[:category_id], :tagged_ids => params[:tag_id]).any_of( {deadline: nil,:postdate.lte => date_now} , {:deadline.gte => date_now,:postdate.lte => date_now} ).desc( :is_top, :postdate).page( params[:page_main]).per(@page_num)
@current_category = BulletinCategory.from_id(params[:category_id]) rescue nil
elsif !params[:category_id].blank?
@bulletins = Bulletin.all.available_for_lang(I18n.locale).can_display.where(:bulletin_category_id => params[:category_id]).any_of( {deadline: nil,:postdate.lte => date_now} , {:deadline.gte => date_now,:postdate.lte => date_now} ).desc( :is_top, :postdate).page( params[:page_main]).per(@page_num)
@current_category = BulletinCategory.from_id(params[:category_id]) rescue nil
elsif !params[:tag_id].blank?
@tag = AnnouncementTag.find(params[:tag_id]) rescue nil
@tag = AnnouncementTag.where(key: params[:tag_id])[0] unless @tag
@bulletins = @tag.bulletins.available_for_lang(I18n.locale).can_display.any_of( {deadline: nil,:postdate.lte => date_now} , {:deadline.gte => date_now,:postdate.lte => date_now} ).desc( :is_top, :postdate).page( params[:page_main]).per(@page_num)
@bulletins = Bulletin.available_for_lang(I18n.locale).can_display.where(:tagged_ids => params[:tag_id]).any_of( {deadline: nil,:postdate.lte => date_now} , {:deadline.gte => date_now,:postdate.lte => date_now} ).desc( :is_top, :postdate).page( params[:page_main]).per(@page_num)
else
@bulletins = Bulletin.all.available_for_lang(I18n.locale).can_display.any_of( {deadline: nil,:postdate.lte => date_now} , {:deadline.gte => date_now,:postdate.lte => date_now} ).desc( :is_top, :postdate).page( params[:page_main]).per(@page_num)
end
impressionist(@tag) if @tag
delayed_impressionist(@tag) if @tag
end
end
@@ -66,7 +73,7 @@ class Panel::Announcement::FrontEnd::BulletinsController < OrbitWidgetController
@bulletin = Bulletin.all.can_display.where(_id: params[:id]).first
if @bulletin and !@bulletin.disable? and !@bulletin.is_rejected
if @bulletin.enabled_for_lang(I18n.locale.to_s)
impressionist(@bulletin)
delayed_impressionist(@bulletin)
get_categorys
else
render :text => "<div class='alert alert-error'>#{t('sys.can_not_display_due_to_no_context')}</div>".html_safe
@@ -34,9 +34,7 @@ class Panel::Announcement::Widget::BulletinsController < OrbitWidgetController
@bulletins = Bulletin.available_for_lang(I18n.locale).can_display.where(:bulletin_category_id => @category_id).any_of( {deadline: nil,:postdate.lte => date_now} , {:deadline.gte => date_now,:postdate.lte => date_now} ).desc( :is_top, :postdate).page( params[:page] ).per(@page_num)
@current_category = BulletinCategory.from_id(@category_id) rescue nil
elsif !params[:tag_id].blank?
@tag = AnnouncementTag.find(params[:tag_id]) rescue nil
@tag = AnnouncementTag.where(key: params[:tag_id])[0] unless @tag
@bulletins = @tag.bulletins.available_for_lang(I18n.locale).can_display.any_of( {deadline: nil,:postdate.lte => date_now} , {:deadline.gte => date_now,:postdate.lte => date_now} ).desc( :is_top, :postdate).page( params[:page] ).per(@page_num)
@bulletins = Bulletin.available_for_lang(I18n.locale).can_display.where(:tagged_ids => params[:tag_id]).any_of( {deadline: nil,:postdate.lte => date_now} , {:deadline.gte => date_now,:postdate.lte => date_now} ).desc( :is_top, :postdate).page( params[:page] ).per(@page_num)
else
@bulletins = Bulletin.available_for_lang(I18n.locale).can_display.any_of( {deadline: nil,:postdate.lte => date_now} , {:deadline.gte => date_now,:postdate.lte => date_now} ).desc( :is_top, :postdate).page( params[:page] ).per(@page_num)
end
@@ -59,11 +57,9 @@ class Panel::Announcement::Widget::BulletinsController < OrbitWidgetController
@bulletins = Bulletin.all.available_for_lang(I18n.locale).can_display.where(:bulletin_category_id => params[:category_id]).any_of( {deadline: nil,:postdate.lte => date_now} , {:deadline.gte => date_now,:postdate.lte => date_now} ).desc( :is_top, :postdate).page( params[:page]).per(@page_num )
@current_category = BulletinCategory.from_id(params[:category_id]) rescue nil
elsif !params[:tag_id].blank?
@tag = AnnouncementTag.find(params[:tag_id]) rescue nil
@tag = AnnouncementTag.where(key: params[:tag_id])[0] unless @tag
@bulletins = @tag.bulletins.available_for_lang(I18n.locale).can_display.any_of( {deadline: nil,:postdate.lte => date_now} , {:deadline.gte => date_now,:postdate.lte => date_now} ).desc( :is_top, :postdate).page( params[:page]).per(@page_num )
@bulletins = Bulletin.available_for_lang(I18n.locale).can_display.where(:tagged_ids => params[:tag_id]).any_of( {deadline: nil,:postdate.lte => date_now} , {:deadline.gte => date_now,:postdate.lte => date_now} ).desc( :is_top, :postdate).page( params[:page] ).per(@page_num)
else
@bulletins = Bulletin.all.available_for_lang(I18n.locale).can_display.any_of( {deadline: nil,:postdate.lte => date_now} , {:deadline.gte => date_now,:postdate.lte => date_now} ).desc( :is_top, :postdate).page( params[:page]).per(@page_num )
@bulletins = Bulletin.available_for_lang(I18n.locale).can_display.any_of( {deadline: nil,:postdate.lte => date_now} , {:deadline.gte => date_now,:postdate.lte => date_now} ).desc( :is_top, :postdate).page( params[:page]).per(@page_num )
end
get_categorys
@@ -71,13 +67,13 @@ class Panel::Announcement::Widget::BulletinsController < OrbitWidgetController
end
def reload_bulletins
@selected_tag = AnnouncementTag.find(params[:tag_id])
@bulletins = @selected_tag.get_visible_bulletins(:postdate).available_for_lang(I18n.locale).can_display.page(params[:page]).per(5) rescue nil
@selected_tag = Tag.find(params[:tag_id])
@bulletins = Bulletin.available_for_lang(I18n.locale).can_display.where(:tagged_ids => params[:tag_id]).where(:is_hidden => false).any_of( {deadline: nil,:postdate.lte => date_now} , {:deadline.gte => date_now,:postdate.lte => date_now} ).desc(:is_top, sort).page(params[:page]).per(5) rescue nil
end
def reload_web_links
@selected_tag = AnnouncementTag.find(params[:tag_id])
@web_links = WebResourceTag.first(:conditions => {:en => @selected_tag[:en]}).get_visible_links(:created_at).available_for_lang(I18n.locale).page(params[:page]).per(5) rescue nil
@selected_tag = Tag.find(params[:tag_id])
@web_links = WebLink.where(:name => @selected_tag.name).where(:is_hidden => false).desc(:is_top, sort).available_for_lang(I18n.locale).page(params[:page]).per(5) rescue nil
end
def bulletins_side_bar
@@ -86,7 +82,7 @@ class Panel::Announcement::Widget::BulletinsController < OrbitWidgetController
end
def bulletins_search_block
@part = PagePart.find params[:part_id]
end
protected
@@ -6,6 +6,7 @@ class Bulletin
include Mongoid::MultiParameterAttributes
include Sunspot::Mongo
include Impressionist::Impressionable
include Mongoid::Versioning
BelongsToCategory = :bulletin_category
include OrbitCoreLib::BelongsToCategoryMayDisable
@@ -108,7 +109,7 @@ class Bulletin
end
def enabled_for_lang(lang)
eval("self.available_for_#{lang}")
eval("self.available_for_#{lang}") rescue false
end
def publish_month
@@ -199,12 +200,6 @@ class Bulletin
return nil
end
# def sorted_tags
# #tags.order_by(I18n.locale, :asc)
# tags
# end
def to_preview
preview_object = Preview.new(:expired_at=>DateTime.now+30.minutes,:preview_at_link=>"panel_announcement_front_end_bulletin_path",:object_class_type=>"Bulletin")
@@ -0,0 +1,25 @@
<table class="table main-list">
<thead>
<tr>
<th class="span7 select"><%= t(:name) %></th>
<th class="span1-2"><%= t(:version) %></th>
<th class="span1-2"><%= t(:update_at) %></th>
<th class="span1-2"><%= t(:last_modified) %></th>
</tr>
</thead>
<tbody>
<% @bulletin.versions.reverse.each do |version| %>
<tr class="with_action">
<td>
<%= version.title %>
<div class="quick-edit">
<%= link_to '顯示', panel_announcement_back_end_bulletin_bulletin_version_path(@bulletin, version.version) %>
</div>
</td>
<td><%= version.version %></td>
<td><%= display_date(version.updated_at) %></td>
<td><%= User.from_id(version.update_user_id).name rescue ''%></td>
</tr>
<% end %>
</tbody>
</table>
@@ -0,0 +1,33 @@
<ul>
<li>
<b><%= t(:name) %></b>
<%= @version.title %>
</li>
<li>
<b><%= t(:subtitle) %></b>
<%= @version.subtitle %>
</li>
<li>
<b><%= t(:text) %></b>
<%= simple_format @version.text %>
</li>
<li>
<b><%= t(:deadline) %></b>
<%= display_date(@version.deadline) if @version.deadline %>
</li>
<li>
<b><%= t(:postdate) %></b>
<%= display_date(@version.postdate) if @version.postdate %>
</li>
<li>
<b><%= t(:posted_by) %></b>
<%= User.find(@version.create_user_id).name %>
</li>
<li>
<b><%= t(:last_modified) %></b>
<%= display_date(@version.updated_at) %>
</li>
</ul>
<%= link_back %>
@@ -61,6 +61,7 @@
</ul>
</div>
</td>
<td><%= link_to bulletin.version, panel_announcement_back_end_bulletin_bulletin_versions_path(bulletin) %></td>
<td><%= display_date_time(bulletin.postdate) %></td>
<td><%= (bulletin.deadline) ? display_date_time(bulletin.deadline ): t(:no_deadline) %></td>
<td>
@@ -7,6 +7,7 @@
<th class="span1-2"></th>
<th class="span1-2"></th>
<th class="span1-2"></th>
<th class="span1-2"></th>
<th class="span1-3"></th>
</tr>
</thead>
@@ -2,6 +2,7 @@
['status', ['is_top', 'is_hot', 'is_hidden', 'is_pending', 'is_checked', 'is_rejected'], 'span1-2', :status],
['category', 'bulletin_category', 'span1-2', :category],
['title', 'title','span7', :title],
['version', 'version', 'span1-2', :version],
['start_date', 'postdate', 'span1-2', :start_date],
['end_date', 'deadline', 'span1-2', :end_date],
['tags', 'tags', 'span1-2', :tags],
@@ -4,269 +4,21 @@
<h1 class="h1"><%= @page.title rescue nil %></h1>
<% if !@item.frontend_field.blank? %>
<% if @frontend_style == '1' %>
<div class="news news1">
<table class="newstb" border="0" cellpadding="0" cellspacing="0" >
<thead>
<tr>
<% @item.frontend_field.each do |ff| %>
<th><span class="<%= ff[1] %>"><%= t("announcement.bulletin.#{ff[0]}") if !ff[0].blank? %></span></th>
<% end %>
</tr>
</thead>
<% @bulletins.each do |post| %>
<tr class="<%= cycle('odd', '')%>">
<% @item.frontend_field.each do |ff| %>
<td>
<span class="<%= ff[1] %>">
<% if ff[1] == 'title' %>
<%= link_to post.send("#{ff[0]}"), panel_announcement_front_end_bulletin_path(post, :category_id => post.send("#{post.class.to_s.underscore}_category_id")) %>
<% elsif ff[1] == 'date' %>
<%= display_date(post.send(ff[0])) %>
<% elsif ff[1] == 'category' %>
<%= post.send(ff[0]).title rescue nil %>
<% elsif ff[1] == 'img' %>
<div class="img app-pic"><%= image_tag(post.send(wf[0]).url) %></div>
<% elsif ff[1] == 'text' %>
<%#= post.send("#{ff[0]}[#{I18n.locale}]").html_safe %>
<%= post.send("#{ff[0]}").html_safe %>
<% elsif ff[1] == 'status' %>
<% if post.is_top? %>
<span class="top"><%= t(:top) %></span>
<% end %>
<% if post.is_hot? %>
<span class="hot"><%= t(:hot) %></span>
<% end %>
<% elsif ff[1] == 'link' %>
<% elsif ff[1] == 'file' %>
<% elsif ff[1] == 'tag' %>
<% elsif ff[1] == 'viewcount' %>
<%= dislpay_view_count(post) %>
<% elsif ff[1] == 'poster' %>
<%= User.from_id(post.update_user_id).name rescue ''%>
<% end %>
</span>
</td>
<% end %>
</tr>
<% end %>
</table>
</div>
<% elsif @frontend_style == '2' %>
<div class="news news2">
<ul class="newslist">
<% @bulletins.each do |post| %>
<li class="<%= cycle('odd', '')%>">
<div class="img app-pic"><%= image_tag(post.image.url) %></div>
<% @item.frontend_field.each do |ff| %>
<span class="<%= ff[1] %>">
<% if ff[1] == 'title' %>
<%= link_to post.title, panel_announcement_front_end_bulletin_path(post, :category_id => post.bulletin_category_id) %>
<% elsif ff[1] == 'date' %>
<%= display_date(post.send(ff[0])) %>
<% elsif ff[1] == 'category' %>
<%= post.send("#{post.class.to_s.underscore}_#{ff[0]}").title rescue nil %>
<% elsif ff[1] == 'text' %>
<%#= post.send("#{ff[0]}[#{I18n.locale}]").html_safe %>
<%= post.send("#{ff[0]}").html_safe %>
<% elsif ff[1] == 'status' %>
<% if post.is_top? %>
<span class="top"><%= t(:top) %></span>
<% end %>
<% if post.is_hot? %>
<span class="hot"><%= t(:hot) %></span>
<% end %>
<% elsif ff[1] == 'link' %>
<% elsif ff[1] == 'file' %>
<% elsif ff[1] == 'tag' %>
<% elsif ff[1] == 'viewcount' %>
<%= dislpay_view_count(post) %>
<% elsif ff[1] == 'poster' %>
<%= User.from_id(post.update_user_id).name rescue ''%>
<% end %>
</span>
<% end %>
</li>
<% end %>
</ul>
</div>
<% elsif @frontend_style == '3' %>
<div class="news news3">
<ul class="newslist">
<% @bulletins.each do |post| %>
<li class="<%= cycle('odd', '')%>">
<div class="img app-pic"><%= image_tag(post.image.url) %></div>
<div class="wrap">
<% @item.frontend_field.each do |ff| %>
<span class="<%= ff[1] %>">
<% if ff[1] == 'title' %>
<%= link_to post.send("#{ff[0]}"), panel_announcement_front_end_bulletin_path(post, :category_id => post.send("#{post.class.to_s.underscore}_category_id")) %>
<% elsif ff[1] == 'date' %>
<%= display_date(post.send(ff[0])) %>
<% elsif ff[1] == 'category' %>
<%= post.send("#{post.class.to_s.underscore}_#{ff[0]}").title rescue nil %>
<% elsif ff[1] == 'text' %>
<%#= post.send("#{ff[0]}[#{I18n.locale}]").html_safe %>
<%= post.send("#{ff[0]}").html_safe %>
<% elsif ff[1] == 'status' %>
<% if post.is_top? %>
<span class="top"><%= t(:top) %></span>
<% end %>
<% if post.is_hot? %>
<span class="hot"><%= t(:hot) %></span>
<% end %>
<% elsif ff[1] == 'link' %>
<% elsif ff[1] == 'file' %>
<% elsif ff[1] == 'tag' %>
<% elsif ff[1] == 'viewcount' %>
<%= dislpay_view_count(post) %>
<% elsif ff[1] == 'poster' %>
<%= User.from_id(post.update_user_id).name rescue ''%>
<% end %>
</span>
<% end %>
</div>
</li>
<% end %>
</ul>
</div>
<% elsif @frontend_style == '4' %>
<div class="news news4">
<ul class="newslist">
<% @bulletins.each do |post| %>
<li class="<%= cycle('odd', '')%>">
<div class="img app-pic"><%= image_tag(post.image.url) %></div>
<div class="wrap">
<% @item.frontend_field.each do |ff| %>
<span class="<%= ff[1] %>">
<% if ff[1] == 'title' %>
<%= link_to post.send("#{ff[0]}"), panel_announcement_front_end_bulletin_path(post, :category_id => post.send("#{post.class.to_s.underscore}_category_id")) %>
<% elsif ff[1] == 'date' %>
<%= display_date(post.send(ff[0])) %>
<% elsif ff[1] == 'category' %>
<%= post.send("#{post.class.to_s.underscore}_#{ff[0]}").title rescue nil %>
<% elsif ff[1] == 'text' %>
<%#= post.send("#{ff[0]}[#{I18n.locale}]").html_safe %>
<%= post.send("#{ff[0]}").html_safe %>
<% elsif ff[1] == 'status' %>
<% if post.is_top? %>
<span class="top"><%= t(:top) %></span>
<% end %>
<% if post.is_hot? %>
<span class="hot"><%= t(:hot) %></span>
<% end %>
<% elsif ff[1] == 'link' %>
<% elsif ff[1] == 'file' %>
<% elsif ff[1] == 'tag' %>
<% elsif ff[1] == 'viewcount' %>
<%= dislpay_view_count(post) %>
<% elsif ff[1] == 'poster' %>
<%= User.from_id(post.update_user_id).name rescue ''%>
<% end %>
</span>
<% end %>
</div>
</li>
<% end %>
</ul>
</div>
<% elsif @frontend_style == '5' %>
<div class="news news5">
<div class="img app-pic"><%= image_tag(@bulletins.first.image.url) %></div>
<ul class="newslist">
<% @bulletins.each do |post| %>
<li class="<%= cycle('odd', '')%>">
<% @item.frontend_field.each do |ff| %>
<span class="<%= ff[1] %>">
<% if ff[1] == 'title' %>
<%= link_to post.send("#{ff[0]}"), panel_announcement_front_end_bulletin_path(post, :category_id => post.send("#{post.class.to_s.underscore}_category_id")) %>
<% elsif ff[1] == 'date' %>
<%= display_date(post.send(ff[0])) %>
<% elsif ff[1] == 'category' %>
<%= post.send("#{post.class.to_s.underscore}_#{ff[0]}").title rescue nil %>
<% elsif ff[1] == 'text' %>
<%#= post.send("#{ff[0]}[#{I18n.locale}]").html_safe %>
<%= post.send("#{ff[0]}").html_safe %>
<% elsif ff[1] == 'status' %>
<% if post.is_top? %>
<span class="top"><%= t(:top) %></span>
<% end %>
<% if post.is_hot? %>
<span class="hot"><%= t(:hot) %></span>
<% end %>
<% elsif ff[1] == 'link' %>
<% elsif ff[1] == 'file' %>
<% elsif ff[1] == 'tag' %>
<% elsif ff[1] == 'viewcount' %>
<%= dislpay_view_count(post) %>
<% elsif ff[1] == 'poster' %>
<%= User.from_id(post.update_user_id).name rescue ''%>
<% end %>
</span>
<% end %>
</li>
<% end %>
</ul>
</div>
<table class="table table-bordered">
<tr>
<%= content_tag (:th) do %>
<%= t(:category) %>
<% end if (!params[:search_query].blank? or params[:category_id].blank?)-%>
<th><%= t(:title) %></th>
<th><%= t(:postdate) %></th>
</tr>
<% if !params[:name].blank?%>
<%= t("search.unit_get",:unit_name => params[:name],:item_num=>@bulletins.count) %>
<% end %>
<% if @bulletins.blank? and !params[:search_query].blank? %>
<%=render :partial => 'shared/search_not_found' %>
<% elsif !params[:search_query].blank? %>
<%= t("search.result_get",:search_word => params[:search_query],:item_num=>@bulletins.count) unless (@bulletins.count == 30) %>
<%= t("search.too_many",:search_word => params[:search_query],:exceed_num=>@bulletins.count) if (@bulletins.count ==30) %>
<% end %>
<% @bulletins.each do |post| %>
<tr class=<%= cycle('odd', '') %>>
<%= content_tag(:th) do%>
<td><%= (post.bulletin_category.title rescue nil ) %></td>
<% end if(!params[:search_query].blank? or params[:category_id].blank?) %>
<td><%= link_to post.title, panel_announcement_front_end_bulletin_path(post, :category_id => post.bulletin_category_id) %>
<%#= link_to post.title, panel_announcement_back_end_bulletin_path(post) %>
</td>
<td class="date"><%= display_date_time(post.postdate) %></td>
</tr>
<% end %>
</table>
<% end %>
<% else %>
<table class="table table-bordered">
<tr>
<th><%= t('announcement.bulletin.category') %></th>
<%= t('announcement.bulletin.category') %>
<% end if (!params[:search_query].blank? or params[:category_id].blank?)-%>
<th><%= t('announcement.bulletin.title') %></th>
<th><%= t('announcement.bulletin.postdate') %></th>
</tr>
<% if !params[:name].blank?%>
<%= t("search.unit_get",:unit_name => params[:name],:item_num=>@bulletins.count) %>
<% end %>
<%= render :partial => 'shared/search_header',:locals=>{:items=>@bulletins} %>
<% @bulletins.each do |post| %>
<tr>
<td><%= post.bulletin_category.title rescue nil %></td>
@@ -279,8 +31,5 @@
<% end %>
</table>
<% end %>
<%= paginate @bulletins, :param_name => :page_main, :params => {:inner => 'false'} %>
<%= paginate( @bulletins, :param_name => :page_main, :params => {:inner => 'false'} ) rescue nil%>
@@ -0,0 +1,36 @@
<% # encoding: utf-8 %>
<%= flash_messages %>
<h1 class="h1"><%= @page.title rescue nil %></h1>
<table class="table table-bordered">
<tr>
<%= content_tag (:th) do %>
<%= t('announcement.bulletin.category') %>
<% end if (!params[:search_query].blank? or params[:category_id].blank?)-%>
<th><%= t('announcement.bulletin.title') %></th>
<th><%= t('announcement.bulletin.postdate') %></th>
</tr>
<% if !params[:name].blank?%>
<%= t("search.unit_get",:unit_name => params[:name],:item_num=>@bulletins.count) %>
<% end %>
<%= render :partial => 'shared/search_header',:locals=>{:items=>@bulletins} %>
<% @bulletins.each do |post| %>
<tr>
<td><%= post.bulletin_category.title rescue nil %></td>
<td><%= link_to post.title, panel_announcement_front_end_bulletin_path(post, :category_id => post.bulletin_category_id) %>
<%#= link_to post.title, panel_announcement_back_end_bulletin_path(post) %>
</td>
<td><%= display_date_time(post.postdate) %></td>
</tr>
<% end %>
</table>
@@ -16,7 +16,7 @@
<div class="news_prev">prev</div>
<div class="news_next">next</div>
<ul class="news_list">
<% tag.bulletins.each do |post| %>
<% Bulletin.where(:tagged_ids => tag).each do |post| %>
<li><%= link_to post.title, panel_announcement_front_end_bulletin_path(post) %></li>
<% end %>
</ul>
@@ -1,8 +1,8 @@
<%= form_tag panel_announcement_front_end_bulletins_path, method: :get do %>
<%= form_tag panel_announcement_front_end_announcement_search_path, method: :get do %>
<%= hidden_field_tag :category_id, params[:category_id] %>
<%= hidden_field_tag :tag_id, params[:tag_id] %>
<p>
<%= text_field_tag :search_query, params[:search_query],{:value => (params[:search_query].blank?? '' : params[:search_query]),:placeholder => t("announcement.search") }%>
<%= submit_tag "Search", name: nil %>
<%= submit_tag t("search_"), name: nil %>
</p>
<% end %>
+3 -1
View File
@@ -25,6 +25,7 @@ en:
file_name: File Name
frontend:
bulletins: Announcement front-end
search_result: Search result
link_name: Link Name
new_bulletin_category: New Bulletin Category
picture: Cover Picture
@@ -34,4 +35,5 @@ en:
url: URL
widget:
bulletins_and_web_links: Bulletins and Web Resources
index: Index
index: Index
search: Search
@@ -25,6 +25,7 @@ zh_tw:
file_name: 檔案名稱
frontend:
bulletins: 公告前台
search_result: 搜尋結果頁
link_name: 連結名稱
new_bulletin_category: 新增公告類別
picture: 刊頭圖片
@@ -34,4 +35,5 @@ zh_tw:
url: 連結位置
widget:
bulletins_and_web_links: 索引
index: 索引
index: 索引
search: 搜尋
+3
View File
@@ -23,6 +23,8 @@ Rails.application.routes.draw do
end
match "file_quick_add/:bulletin_id" => "bulletins#file_quick_add" ,:as => :file_quick_add
match "file_quick_edit/:bulletin_id" => "bulletins#file_quick_edit" ,:as => :file_quick_edit
resources :bulletin_versions
end
resources :bulletin_categorys do
@@ -46,6 +48,7 @@ Rails.application.routes.draw do
end
namespace :front_end do
match "index_by_unit" => "bulletins#index_bulletins_by_unit",:as => :index_bulletins_by_unit
match "search_result" => "bulletins#search_result",:as=>:announcement_search
resources :bulletins # do
# match "preview" => "bulletins#preview_content",:as => :get_preview_content
# end
+11
View File
@@ -12,6 +12,10 @@ module Announcement
update_info 'some update_info'
front_end do
app_page 'search_result' do
frontend_i18n "announcement.frontend.search_result"
end
app_page 'bulletins' do
frontend_i18n "announcement.frontend.bulletins"
style ["1","2","3"]
@@ -21,6 +25,8 @@ module Announcement
category ["BulletinCategory"]
data_count 3..10
taggable
widgets do
default_widget do
query 'Bulletin.any_of( {deadline: nil,:postdate.lte => Time.now} , {:deadline.gte => Time.now,:postdate.lte => Time.now} )'
@@ -39,6 +45,11 @@ module Announcement
widget_i18n "announcement.widget.index"
style ["1","2"]
end
customize_widget "bulletins_search_block" do
widget_i18n "announcement.widget.search"
end
# item "index","announcement.widget.index",:default_template=>true,:fields=>["title","category","postdate"]
# item "bulletins_and_web_links","announcement.widget.bulletins_and_web_links"
end
Loaded 100 of 235 files, more files were not shown because too many files have changed in this diff. Show more