Compare commits

...
Author SHA1 Message Date
Spen 4034fb20ee add archive frontend table class 2013-11-18 16:38:06 +08:00
Spen d1fd2b6984 fix app sub manager and ask verification code 2013-11-07 18:06:16 +08:00
Spen 8f25dc2871 fix ntu ga survey export 2013-11-04 10:00:54 +08:00
thomaschen 82988a2029 Fix front-end tag cloud search under category filters 2013-11-01 16:22:08 +08:00
thomaschen e5fccb33bf Fix tag cloud search under category filters 2013-11-01 15:38:49 +08:00
thomaschen d832f4c4b1 can read the spreadsheet each row.(need to think of a method to parse each row to figure)
Conflicts:

	Gemfile
	vendor/built_in_modules/survey/app/controllers/panel/survey/back_end/surveys_controller.rb
2013-10-25 18:36:32 +08:00
thomaschen 59af75e50a fix error 2013-10-25 18:21:17 +08:00
Bernie Chiu 67cd34ab27 Add oneline and multiline import 2013-10-25 18:21:17 +08:00
thomaschen 4a736cc92c error fix 2013-10-25 18:21:17 +08:00
Bernie Chiu 9b96f2eeb0 Merge
Conflicts:

	vendor/built_in_modules/survey/app/controllers/panel/survey/back_end/surveys_controller.rb
2013-10-25 18:21:07 +08:00
Bernie Chiu 74b89f1fac Allow update answers on radio groups
Conflicts:

	vendor/built_in_modules/survey/app/controllers/panel/survey/back_end/surveys_controller.rb
2013-10-25 18:09:55 +08:00
thomaschen 62e9acdbb8 fix error 2013-10-25 18:05:37 +08:00
thomaschen 4a897b68cf merge 2013-10-25 18:05:37 +08:00
Bernie Chiu d3fc6e5956 Add import on radiogroups on file change 2013-10-25 18:05:37 +08:00
Bernie Chiu 71acee200c Fix encoding issue and add import on title change 2013-10-25 18:05:37 +08:00
thomaschen 63156c7a95 remove unuse variable and comment 2013-10-25 18:05:37 +08:00
thomaschen 5156701094 import 'check' and 'select' question success 2013-10-25 18:05:37 +08:00
thomaschen 1266cd1384 fix import-csv column error 2013-10-25 18:05:37 +08:00
thomaschen f3f4dc842c import radio question success
Conflicts:

	Gemfile
	vendor/built_in_modules/survey/app/controllers/panel/survey/back_end/surveys_controller.rb
2013-10-25 17:56:49 +08:00
Spen 13144f62fb add ntu_ga survey init sorting 2013-10-18 18:17:05 +08:00
Bernie Chiu 6d951f8d9c Add correct department links 2013-10-18 16:20:13 +08:00
Bernie Chiu d0364c788b Fix locale error 2013-10-17 18:23:33 +08:00
Bernie Chiu e2ec8f134e Add routing and links for import 2013-10-17 18:23:17 +08:00
Bernie Chiu 83a8433e52 Fix survey title link redirection after deadline 2013-10-17 18:22:54 +08:00
thomaschen 8f65da0a04 fix js hide localsite error 2013-10-17 18:22:41 +08:00
thomaschen ad8bb72b07 fix uri parse problem 2013-10-17 18:22:11 +08:00
Manson Wang 06a8b9073e Merge branch '0913_ntu_ga_co' of github.com:Rulingcom/orbit into 0913_ntu_ga 2013-10-17 18:21:41 +08:00
Spen f9485c1f86 announcement init sorting fix
Conflicts:

	vendor/built_in_modules/announcement/init.rb
2013-10-11 18:00:39 +08:00
Bernie Chiu 627425b72e Add port to test 2013-10-08 17:51:40 +08:00
Bernie Chiu 9cb2a5b211 Update values to test servers 2013-10-08 17:41:22 +08:00
Bernie Chiu 75f5404b7a Modify value to test servers 2013-10-08 17:36:03 +08:00
Bernie Chiu bd3a922073 Add local test server 2013-10-08 16:06:36 +08:00
Bernie Chiu 9fbb2917b1 Widget title without link 2013-10-08 12:24:34 +08:00
Bernie Chiu bd6d94a143 Comment out JavaScript redirect workaround 2013-10-04 17:48:58 +08:00
Bernie Chiu 8684388ab9 Reverse 2013-10-04 17:47:26 +08:00
thomaschen 5e05f5d02b Merge branch '0913_ntu_ga_co' of https://github.com/Rulingcom/orbit into 0913_ntu_ga_co 2013-10-04 17:22:33 +08:00
thomaschen 6607f6b66e roll back 2013-10-04 17:22:02 +08:00
Bernie Chiu 63fab74a25 Post form without ajax 2013-10-04 15:57:14 +08:00
Bernie Chiu 48969b70b5 Modify thank_you route 2013-10-04 14:08:18 +08:00
Bernie Chiu 88c8ca68d0 Add ask fail message and success redirect fix 2013-10-01 16:09:43 +08:00
Bernie Chiu 3eeda5410c Fix bugs 2013-09-27 17:15:49 +08:00
thomaschen 660960f316 fix first reply error 2013-09-27 17:03:09 +08:00
Bernie Chiu 696134aa18 Fix ip direct 2013-09-27 16:40:34 +08:00
Bernie Chiu 2777b92589 Test ip direct 2013-09-27 16:30:36 +08:00
thomaschen 5432238816 merge 2013-09-27 15:07:19 +08:00
thomaschen 4e12c0bb5b (test)remote ip 2013-09-27 15:04:35 +08:00
Bernie Chiu d68f324ca3 Merge 2013-09-27 14:46:18 +08:00
thomaschen 50f5d12da3 fix status error 2013-09-27 14:35:25 +08:00
thomaschen d635c892cf fix dns error 2013-09-27 11:22:37 +08:00
Bernie Chiu 26bc837c76 Modify fail definition 2013-09-25 17:53:35 +08:00
Bernie Chiu 8247f077df Change status based on your requests sent 2013-09-25 17:46:32 +08:00
Bernie Chiu 70de1cea9d Modify syntax 2013-09-25 14:55:02 +08:00
Bernie Chiu 0f18cdfe8e Skip invalid options 2013-09-25 14:46:55 +08:00
thomaschen 0d1426cab8 add post request error checking and resend one more time 2013-09-23 12:46:59 +08:00
thomaschen b57b899dba fix naming error 2013-09-23 11:28:30 +08:00
Bernie Chiu 1305b9f1ef Rescue URI Error 2013-09-17 16:37:38 +08:00
Bernie Chiu 21009961ef Fix status bugs 2013-09-17 16:16:37 +08:00
Bernie Chiu 1edc134691 Add back mongoid yml 2013-09-17 12:07:41 +08:00
Bernie Chiu e89615a6f3 Fix naming error 2013-09-17 12:02:35 +08:00
thomaschen 0c29701f9b test 2013-09-16 15:07:50 +08:00
thomaschen 580be0b34b fix frontend ask_category error 2013-09-16 15:05:08 +08:00
Bernie Chiu c361a7a201 Fix check box selections appearance
Conflicts:
	vendor/built_in_modules/ask_new/app/controllers/panel/ask/back_end/ask_replies_controller.rb
2013-09-13 15:43:14 +08:00
thomaschen b7bf180df2 fix frontend ask_category error 2013-09-13 15:43:14 +08:00
Bernie Chiu 71dad22b04 Add dynamic checkboxes
Conflicts:
	vendor/built_in_modules/ask_new/app/views/panel/ask/back_end/ask_questions/edit.html.erb
2013-09-13 15:43:14 +08:00
thomaschen 883496ede1 add multi deliver request 2013-09-13 15:43:14 +08:00
Bernie Chiu 0a1ebf18e3 Add check box array 2013-09-13 15:43:13 +08:00
thomaschen 3f9cdec426 add option for dep_dns 2013-09-13 15:43:13 +08:00
thomaschen 24b9f4015b add checkboxes for 11 dep in edit view 2013-09-13 15:43:13 +08:00
thomaschen 1237a111ca add transfered_category if not exist. change transfered reply's status to 待處理(轉). showing request code if error. 2013-09-13 15:43:13 +08:00
Bernie Chiu 64e14d42e2 Allow ask_question transter 2013-09-13 15:43:13 +08:00
thomaschen cc7a4ffb6d add response(temp) 2013-09-13 15:43:13 +08:00
Bernie Chiu da40c2b669 Allow sending request and getting response 2013-09-13 15:43:13 +08:00
thomaschen bf5416095e add auth_request route and controller 2013-09-13 15:43:13 +08:00
Bernie Chiu 8cd27e26e2 Fixed untracked files
Conflicts:
	config/mongoid.yml
2013-09-13 15:43:13 +08:00
thomaschen d98d008806 add sending post request function 2013-09-13 15:43:13 +08:00
chris cd26b880fb Change the logo and favicon 2013-09-13 15:42:52 +08:00
chris 7c398ce4fe Changes for NTU General Affairs 2013-09-13 15:10:27 +08:00
chris d766eea9f4 Changes for NTU common
Conflicts:
	lib/tasks/migrate.rake

Conflicts:
	lib/tasks/migrate.rake

Conflicts:
	config/resque_schedule.yml
	lib/tasks/migrate.rake
2013-09-13 15:10:10 +08:00
chris d5dc3ef793 Fix for user and role relationship (from role and sub-role side) 2013-09-13 15:02:31 +08:00
Spen b3366b48a1 announcement add new widget bulletins_and_links 2013-09-13 13:39:39 +08:00
saurabhbhatia 36e7e3d3e8 Fixed Locale settings for location navigation 2013-09-13 12:44:13 +08:00
saurabhbhatia 06c2240d34 Categories working tested and added link to sidebar
Conflicts:
	Gemfile
	config/mongoid.yml
2013-09-13 12:43:42 +08:00
harrybomrah c4e8ed96a9 location category 2013-09-13 12:40:18 +08:00
chris 8ad015af7f Remove before filter in user.rb in addition to the previous fix (Fix for user and role relationship) 2013-09-13 11:56:57 +08:00
chris 1857ad428c Fix for user and role relationship
Conflicts:
	lib/tasks/migrate.rake
2013-09-12 15:35:53 +08:00
Matt K. Fu 134b639465 fix announcement language 2013-09-09 17:35:22 +08:00
Matt K. Fu 45136f915d fix news default widget shows un-checked bulletins. 2013-09-09 11:14:31 +08:00
Matt K. Fu 2c3924d92c fix kaminari 2013-09-04 16:38:52 +08:00
Matt K. Fu 41b562d3f7 fix zip by limit version number 2013-09-04 15:20:55 +08:00
Matt K. Fu 4074ac677d fix rake zip 2013-09-04 10:36:16 +08:00
Matthew K. Fu JuYuan e1c57c6843 fixed default widget for tags 2013-09-03 16:17:45 +08:00
Matthew K. Fu JuYuan 915ea066d6 fixing bulletin default widget 2013-09-02 17:24:28 +08:00
Matt K. Fu e7aa7ea1fa added sorting DSL 2013-09-02 16:33:50 +08:00
Matt K. Fu 1ccfd6e48c fix sorting for default widget 2013-08-30 16:52:46 +08:00
Matt K. Fu 23516277f3 fix default widget query 2013-08-30 10:15:18 +08:00
Matt K. Fu 87bc2852b3 fix variable 2013-08-29 18:08:33 +08:00
Matt K. Fu 27b86b078a fix counter for recording request. 2013-08-28 17:56:03 +08:00
Matt K. Fu 8f393e1079 fix template for solar error. gitingore 2013-08-28 10:37:19 +08:00
Matt K. Fu 353039dcd0 fix script 2013-08-27 18:37:09 +08:00
Matt K. Fu d8dd68b4df fixing setting template and site init scripts 2013-08-27 17:28:33 +08:00
Matt K. Fu aa8523c8cf fix counter eval 2013-08-27 16:07:58 +08:00
Matt K. Fu 69ef8fa747 fix dash broad counter 2013-08-27 15:59:17 +08:00
Matt K. Fu 473baa9b95 add backup job 2013-08-27 15:59:17 +08:00
Matt K. Fu 1592aaff89 add option to logrotate for conversional policy. 2013-08-27 15:59:17 +08:00
Matt K. Fu 030d994180 make rake task more easier for service team 2013-08-27 15:59:17 +08:00
Matt K. Fu a88ad35641 add log rotate into site build procedure. 2013-08-27 15:59:17 +08:00
Matthew K. Fu JuYuan a63193dc65 logrotate template 2013-08-27 15:59:16 +08:00
Matt K. Fu 452bddb587 let site builder can enter rescue's worker 2013-08-27 15:59:16 +08:00
Matt K. Fu 371485e420 add handily task for service team 2013-08-27 15:59:16 +08:00
Matt K. Fu 69b3625861 add production pid log folder in case sold error 2013-08-27 15:59:16 +08:00
Matt K. Fu 72d1427854 fix erb for pass argument and paths 2013-08-27 15:59:16 +08:00
Matthew K. Fu JuYuan 079b9145c3 move all *.god to *.erb so the God init won't go wrong 2013-08-27 15:59:16 +08:00
Matt K. Fu 3102a46219 remove useless setting for solar 2013-08-27 15:59:16 +08:00
Matt K. Fu 653a098ab6 fix solr setting 2013-08-27 15:59:16 +08:00
Matt K. Fu 426edea485 add god to watch solr service 2013-08-27 15:59:16 +08:00
Matt K. Fu 2e5b2555c6 from now on the rescue namespace will be decided by site object field: resque_namespace 2013-08-27 15:59:16 +08:00
Matt K. Fu 2593707d8c fix rescue scheduler space error 2013-08-27 15:59:15 +08:00
saurabhbhatia b20955579e Cleaned Up ask module for master 2013-08-27 14:29:59 +08:00
saurabhbhatia 1ebda22f0e Updated with loader
Conflicts:
	vendor/built_in_modules/ask/app/views/panel/ask/back_end/ask_acknowledgements/index.html.erb
	vendor/built_in_modules/ask/app/views/panel/ask/front_end/ask_questions/index.html.erb
2013-08-27 14:29:53 +08:00
saurabhbhatia c511aeb8de Removed logging statements 2013-08-27 14:29:47 +08:00
saurabhbhatia 26d3a89d30 Updated ask module with custom acknowledgement working 2013-08-27 14:29:39 +08:00
saurabhbhatia 91f80a0952 Deleted ask 2013-08-27 14:29:28 +08:00
saurabhbhatia f333fe9e21 Added custom acknowledgement to ask 2013-08-27 14:29:22 +08:00
saurabhbhatia 33f256bd16 Fix mailing redirect
Conflicts:
	vendor/built_in_modules/ask/init.rb
	vendor/built_in_modules/ask_new/app/controllers/panel/ask/front_end/ask_questions_controller.rb
	vendor/built_in_modules/ask_new/app/views/panel/ask/front_end/ask_questions/thank_you.html.erb
	vendor/built_in_modules/ask_new/config/routes.rb
2013-08-19 13:03:49 +08:00
saurabhbhatia fde9fd7ffe Deleted Unnecessary Old code in ask module and video 2013-08-15 12:12:38 +08:00
saurabhbhatia d977b83d06 Updated captcha, mailing function working 2013-08-15 11:50:28 +08:00
saurabhbhatia a1eae7543e Updated ask module with a new captcha plugin 2013-08-15 11:50:21 +08:00
saurabhbhatia 8d9bf62909 final mongoid fix 2013-07-31 14:22:40 +08:00
saurabhbhatia 2f480c31bf Fixed mongoid 2013-07-31 13:54:29 +08:00
saurabhbhatia 19d33f78bd Updated Video with frontend widget and backend widget working 2013-07-31 13:52:24 +08:00
saurabhbhatia 37c91664d3 Updated with video widget 2013-07-31 13:52:22 +08:00
saurabhbhatia eb853f773d Updated video cleaned up the ui 2013-07-31 13:52:19 +08:00
saurabhbhatia d701d9d6ad Updated videos module with widget initiation 2013-07-31 13:52:10 +08:00
saurabhbhatia 75eeec737c Video and Channel Fetching now working 2013-07-31 13:52:07 +08:00
saurabhbhatia 36c3635bbb add youtube videos module 2013-07-31 13:52:05 +08:00
chris fa1c731ad3 Remove registerable 2013-07-30 18:24:05 +08:00
harrybomrah 2c24e788b0 fixed frontend 2013-07-23 18:32:24 +08:00
chris 26a8be2f0f Fix bulletins_controller.rb missing 'end' 2013-07-19 19:52:44 +08:00
chris fa51d16879 Remove space causing error in rake 2013-07-19 19:23:25 +08:00
chris ceff21fd1f Fix migrate.rake 2013-07-19 19:15:45 +08:00
harrybomrah 1357124f6f backend theater for ie fixed 2013-07-19 18:40:19 +08:00
harrybomrah 8c3fb43bf5 theater view fixed in IE 2013-07-19 18:40:09 +08:00
chris 71e8b3c042 Change get_item
Add category and tags to default widget link to object
2013-07-19 18:39:13 +08:00
Spen b37643147f mail_cron add send_mail_now and mail cron log fix 2013-07-19 17:18:48 +08:00
Spen ec57cbff1c ntue mail cron & log filter fix 2013-07-19 17:18:34 +08:00
Spen 7d6df11873 email send cron & send logs for any apps 2013-07-19 17:01:54 +08:00
Matt K. Fu 8043573370 fix delay impressionist for tags and pages 2013-07-19 17:00:38 +08:00
chris f025c98ffa Fix sorted_tags_for_cloud: it's now using the cloud_view_count 2013-07-19 01:52:36 +08:00
chris 3a91c92bf7 Fix visitor count. Mapping the session and making sure they were unique using rails was way slower than doing it with a mongoid query 2013-07-19 01:20:51 +08:00
harrybomrah b1d8a87256 frontend gallery fix 2013-07-18 21:22:23 +08:00
chris c7ac4e2485 Set tinymce-rails version to 3.5.8.3 2013-07-18 20:53:05 +08:00
chris 3467868607 Fix missing tagged_ids in some taggable objects and add a rake task for it 2013-07-18 14:05:21 +08:00
Matt K. Fu ceac2b842c fix impression page counter 2013-07-18 12:04:37 +08:00
chris c763817ebf Fix web link front end index and widget index 2013-07-17 17:54:34 +08:00
chris 3c3bba514a Fix get_item and more link in front end 2013-07-17 11:36:20 +08:00
Spen 837dc3ea7b announcement init default_widget add a style & field 2013-07-17 11:31:38 +08:00
Matt K. Fu ea5d89e0e1 make announcement widget amount start from 1 2013-07-16 18:19:20 +08:00
Matt K. Fu aea15fa622 add class to default widget if row data is hot or top 2013-07-16 17:41:22 +08:00
Matthew K. Fu JuYuan c1316f72a0 remove new design button 2013-07-15 17:10:30 +08:00
Matthew K. Fu JuYuan d996b91b54 preview by default widget 2013-07-15 17:09:48 +08:00
396 changed files with 49405 additions and 600 deletions

No files matched your search

+5 -1
View File
@@ -4,6 +4,8 @@
.rvmrc .rvmrc
Gemfile.lock Gemfile.lock
Procfile
log/*
db/*.sqlite3 db/*.sqlite3
log/*.log log/*.log
@@ -14,7 +16,9 @@ public/uploads/**/*
solr/data solr/data
tmp/**/* tmp/**/*
uploads/**/* uploads/**/*
config/*.god
log/*.gz
tmp/restart.txt
*.swp *.swp
*.pid *.pid
*.lck *.lck
+10 -3
View File
@@ -14,7 +14,11 @@ gem 'execjs'
gem 'jquery-rails', '2.1.4' gem 'jquery-rails', '2.1.4'
gem 'jquery-ui-rails' gem 'jquery-ui-rails'
gem "select2-rails", '3.3.1' gem "select2-rails", '3.3.1'
gem 'kaminari', :git => 'git://github.com/amatsuda/kaminari.git' gem 'kaminari'
gem "acts_as_unvlogable"
gem 'youtube_it'
gem 'gotcha'
# gem "memcached", "~> 1.4.3" # gem "memcached", "~> 1.4.3"
# gem "memcache-client" # gem "memcache-client"
@@ -25,6 +29,9 @@ gem 'mongoid-tree', :require => 'mongoid/tree'
gem "mongo_session_store-rails3", '3.0.6' gem "mongo_session_store-rails3", '3.0.6'
gem 'nokogiri' gem 'nokogiri'
# import csv
gem 'roo'
gem 'fb_graph' gem 'fb_graph'
gem 'rack-gridfs' gem 'rack-gridfs'
gem 'radius' gem 'radius'
@@ -35,7 +42,7 @@ gem 'resque-scheduler' # job scheduling
gem 'resque-restriction' gem 'resque-restriction'
#gem 'rb-readline' #gem 'rb-readline'
# gem 'ruby-debug19' # gem 'ruby-debug19'
gem 'rubyzip' gem 'rubyzip','0.9.9'
gem 'sunspot_mongo' gem 'sunspot_mongo'
gem 'sunspot_solr' gem 'sunspot_solr'
@@ -46,7 +53,7 @@ gem 'sinatra'
gem 'sprockets' gem 'sprockets'
gem 'social-share-button' gem 'social-share-button'
gem 'tinymce-rails' gem 'tinymce-rails', '3.5.8.3'
gem 'therubyracer' if RUBY_PLATFORM.downcase.include?("linux") gem 'therubyracer' if RUBY_PLATFORM.downcase.include?("linux")
gem 'libv8', '~> 3.11.8' if RUBY_PLATFORM.downcase.include?("linux") gem 'libv8', '~> 3.11.8' if RUBY_PLATFORM.downcase.include?("linux")
gem 'mongoid-encryptor', :require => 'mongoid/encryptor' gem 'mongoid-encryptor', :require => 'mongoid/encryptor'
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 45 KiB

@@ -0,0 +1,23 @@
!function ($) {
$.fn.cardCheck = function(param) {
_defaultSettings = {
check: '',
};
_set = $.extend(_defaultSettings, param);
$card = $(this);
$check = _set.check;
$check.each(function(){
if($(this).attr('checked')) {
$(this).parent($card).addClass("active");
}
});
$card.on('click', function() {
$(this).toggleClass('active')
});
}
}(window.jQuery);
$(function(){
$('.checkbox-card > li').cardCheck({
check: $('.checkbox-card > li input[type="checkbox"]'),
});
});
@@ -0,0 +1,752 @@
/*! nanoScrollerJS - v0.7.2
* http://jamesflorentino.github.com/nanoScrollerJS/
* Copyright (c) 2013 James Florentino; Licensed MIT */
(function($, window, document) {
"use strict";
var BROWSER_IS_IE7, BROWSER_SCROLLBAR_WIDTH, DOMSCROLL, DOWN, DRAG, KEYDOWN, KEYUP, MOUSEDOWN, MOUSEMOVE, MOUSEUP, MOUSEWHEEL, NanoScroll, PANEDOWN, RESIZE, SCROLL, SCROLLBAR, TOUCHMOVE, UP, WHEEL, defaults, getBrowserScrollbarWidth;
defaults = {
/**
a classname for the pane element.
@property paneClass
@type String
@default 'pane'
*/
paneClass: 'pane',
/**
a classname for the slider element.
@property sliderClass
@type String
@default 'slider'
*/
sliderClass: 'slider',
/**
a classname for the content element.
@property contentClass
@type String
@default 'content'
*/
contentClass: 'content',
/**
a setting to enable native scrolling in iOS devices.
@property iOSNativeScrolling
@type Boolean
@default false
*/
iOSNativeScrolling: false,
/**
a setting to prevent the rest of the page being
scrolled when user scrolls the `.content` element.
@property preventPageScrolling
@type Boolean
@default false
*/
preventPageScrolling: false,
/**
a setting to disable binding to the resize event.
@property disableResize
@type Boolean
@default false
*/
disableResize: false,
/**
a setting to make the scrollbar always visible.
@property alwaysVisible
@type Boolean
@default false
*/
alwaysVisible: false,
/**
a default timeout for the `flash()` method.
@property flashDelay
@type Number
@default 1500
*/
flashDelay: 1500,
/**
a minimum height for the `.slider` element.
@property sliderMinHeight
@type Number
@default 20
*/
sliderMinHeight: 20,
/**
a maximum height for the `.slider` element.
@property sliderMaxHeight
@type Number
@default null
*/
sliderMaxHeight: null
};
/**
@property SCROLLBAR
@type String
@static
@final
@private
*/
SCROLLBAR = 'scrollbar';
/**
@property SCROLL
@type String
@static
@final
@private
*/
SCROLL = 'scroll';
/**
@property MOUSEDOWN
@type String
@final
@private
*/
MOUSEDOWN = 'mousedown';
/**
@property MOUSEMOVE
@type String
@static
@final
@private
*/
MOUSEMOVE = 'mousemove';
/**
@property MOUSEWHEEL
@type String
@final
@private
*/
MOUSEWHEEL = 'mousewheel';
/**
@property MOUSEUP
@type String
@static
@final
@private
*/
MOUSEUP = 'mouseup';
/**
@property RESIZE
@type String
@final
@private
*/
RESIZE = 'resize';
/**
@property DRAG
@type String
@static
@final
@private
*/
DRAG = 'drag';
/**
@property UP
@type String
@static
@final
@private
*/
UP = 'up';
/**
@property PANEDOWN
@type String
@static
@final
@private
*/
PANEDOWN = 'panedown';
/**
@property DOMSCROLL
@type String
@static
@final
@private
*/
DOMSCROLL = 'DOMMouseScroll';
/**
@property DOWN
@type String
@static
@final
@private
*/
DOWN = 'down';
/**
@property WHEEL
@type String
@static
@final
@private
*/
WHEEL = 'wheel';
/**
@property KEYDOWN
@type String
@static
@final
@private
*/
KEYDOWN = 'keydown';
/**
@property KEYUP
@type String
@static
@final
@private
*/
KEYUP = 'keyup';
/**
@property TOUCHMOVE
@type String
@static
@final
@private
*/
TOUCHMOVE = 'touchmove';
/**
@property BROWSER_IS_IE7
@type Boolean
@static
@final
@private
*/
BROWSER_IS_IE7 = window.navigator.appName === 'Microsoft Internet Explorer' && /msie 7./i.test(window.navigator.appVersion) && window.ActiveXObject;
/**
@property BROWSER_SCROLLBAR_WIDTH
@type Number
@static
@default null
@private
*/
BROWSER_SCROLLBAR_WIDTH = null;
/**
Returns browser's native scrollbar width
@method getBrowserScrollbarWidth
@return {Number} the scrollbar width in pixels
@static
@private
*/
getBrowserScrollbarWidth = function() {
var outer, outerStyle, scrollbarWidth;
outer = document.createElement('div');
outerStyle = outer.style;
outerStyle.position = 'absolute';
outerStyle.width = '100px';
outerStyle.height = '100px';
outerStyle.overflow = SCROLL;
outerStyle.top = '-9999px';
document.body.appendChild(outer);
scrollbarWidth = outer.offsetWidth - outer.clientWidth;
document.body.removeChild(outer);
return scrollbarWidth;
};
/**
@class NanoScroll
@param element {HTMLElement|Node} the main element
@param options {Object} nanoScroller's options
@constructor
*/
NanoScroll = (function() {
function NanoScroll(el, options) {
this.el = el;
this.options = options;
BROWSER_SCROLLBAR_WIDTH || (BROWSER_SCROLLBAR_WIDTH = getBrowserScrollbarWidth());
this.$el = $(this.el);
this.doc = $(document);
this.win = $(window);
this.$content = this.$el.children("." + options.contentClass);
this.$content.attr('tabindex', 0);
this.content = this.$content[0];
if (this.options.iOSNativeScrolling && (this.el.style.WebkitOverflowScrolling != null)) {
this.nativeScrolling();
} else {
this.generate();
}
this.createEvents();
this.addEvents();
this.reset();
}
/**
Prevents the rest of the page being scrolled
when user scrolls the `.content` element.
@method preventScrolling
@param event {Event}
@param direction {String} Scroll direction (up or down)
@private
*/
NanoScroll.prototype.preventScrolling = function(e, direction) {
if (!this.isActive) {
return;
}
if (e.type === DOMSCROLL) {
if (direction === DOWN && e.originalEvent.detail > 0 || direction === UP && e.originalEvent.detail < 0) {
e.preventDefault();
}
} else if (e.type === MOUSEWHEEL) {
if (!e.originalEvent || !e.originalEvent.wheelDelta) {
return;
}
if (direction === DOWN && e.originalEvent.wheelDelta < 0 || direction === UP && e.originalEvent.wheelDelta > 0) {
e.preventDefault();
}
}
};
/**
Enable iOS native scrolling
*/
NanoScroll.prototype.nativeScrolling = function() {
this.$content.css({
WebkitOverflowScrolling: 'touch'
});
this.iOSNativeScrolling = true;
this.isActive = true;
};
/**
Updates those nanoScroller properties that
are related to current scrollbar position.
@method updateScrollValues
@private
*/
NanoScroll.prototype.updateScrollValues = function() {
var content;
content = this.content;
this.maxScrollTop = content.scrollHeight - content.clientHeight;
this.contentScrollTop = content.scrollTop;
if (!this.iOSNativeScrolling) {
this.maxSliderTop = this.paneHeight - this.sliderHeight;
this.sliderTop = this.contentScrollTop * this.maxSliderTop / this.maxScrollTop;
}
};
/**
Creates event related methods
@method createEvents
@private
*/
NanoScroll.prototype.createEvents = function() {
var _this = this;
this.events = {
down: function(e) {
_this.isBeingDragged = true;
_this.offsetY = e.pageY - _this.slider.offset().top;
_this.pane.addClass('active');
_this.doc.bind(MOUSEMOVE, _this.events[DRAG]).bind(MOUSEUP, _this.events[UP]);
return false;
},
drag: function(e) {
_this.sliderY = e.pageY - _this.$el.offset().top - _this.offsetY;
_this.scroll();
_this.updateScrollValues();
if (_this.contentScrollTop >= _this.maxScrollTop) {
_this.$el.trigger('scrollend');
} else if (_this.contentScrollTop === 0) {
_this.$el.trigger('scrolltop');
}
return false;
},
up: function(e) {
_this.isBeingDragged = false;
_this.pane.removeClass('active');
_this.doc.unbind(MOUSEMOVE, _this.events[DRAG]).unbind(MOUSEUP, _this.events[UP]);
return false;
},
resize: function(e) {
_this.reset();
},
panedown: function(e) {
_this.sliderY = (e.offsetY || e.originalEvent.layerY) - (_this.sliderHeight * 0.5);
_this.scroll();
_this.events.down(e);
return false;
},
scroll: function(e) {
if (_this.isBeingDragged) {
return;
}
_this.updateScrollValues();
if (!_this.iOSNativeScrolling) {
_this.sliderY = _this.sliderTop;
_this.slider.css({
top: _this.sliderTop
});
}
if (e == null) {
return;
}
if (_this.contentScrollTop >= _this.maxScrollTop) {
if (_this.options.preventPageScrolling) {
_this.preventScrolling(e, DOWN);
}
_this.$el.trigger('scrollend');
} else if (_this.contentScrollTop === 0) {
if (_this.options.preventPageScrolling) {
_this.preventScrolling(e, UP);
}
_this.$el.trigger('scrolltop');
}
},
wheel: function(e) {
if (e == null) {
return;
}
_this.sliderY += -e.wheelDeltaY || -e.delta;
_this.scroll();
return false;
}
};
};
/**
Adds event listeners with jQuery.
@method addEvents
@private
*/
NanoScroll.prototype.addEvents = function() {
var events;
this.removeEvents();
events = this.events;
if (!this.options.disableResize) {
this.win.bind(RESIZE, events[RESIZE]);
}
if (!this.iOSNativeScrolling) {
this.slider.bind(MOUSEDOWN, events[DOWN]);
this.pane.bind(MOUSEDOWN, events[PANEDOWN]).bind("" + MOUSEWHEEL + " " + DOMSCROLL, events[WHEEL]);
}
this.$content.bind("" + SCROLL + " " + MOUSEWHEEL + " " + DOMSCROLL + " " + TOUCHMOVE, events[SCROLL]);
};
/**
Removes event listeners with jQuery.
@method removeEvents
@private
*/
NanoScroll.prototype.removeEvents = function() {
var events;
events = this.events;
this.win.unbind(RESIZE, events[RESIZE]);
if (!this.iOSNativeScrolling) {
this.slider.unbind();
this.pane.unbind();
}
this.$content.unbind("" + SCROLL + " " + MOUSEWHEEL + " " + DOMSCROLL + " " + TOUCHMOVE, events[SCROLL]);
};
/**
Generates nanoScroller's scrollbar and elements for it.
@method generate
@chainable
@private
*/
NanoScroll.prototype.generate = function() {
var contentClass, cssRule, options, paneClass, sliderClass;
options = this.options;
paneClass = options.paneClass, sliderClass = options.sliderClass, contentClass = options.contentClass;
if (!this.$el.find("" + paneClass).length && !this.$el.find("" + sliderClass).length) {
this.$el.append("<div class=\"" + paneClass + "\"><div class=\"" + sliderClass + "\" /></div>");
}
this.pane = this.$el.children("." + paneClass);
this.slider = this.pane.find("." + sliderClass);
if (BROWSER_SCROLLBAR_WIDTH) {
cssRule = this.$el.css('direction') === 'rtl' ? {
left: -BROWSER_SCROLLBAR_WIDTH
} : {
right: -BROWSER_SCROLLBAR_WIDTH
};
this.$el.addClass('has-scrollbar');
}
if (cssRule != null) {
this.$content.css(cssRule);
}
return this;
};
/**
@method restore
@private
*/
NanoScroll.prototype.restore = function() {
this.stopped = false;
this.pane.show();
this.addEvents();
};
/**
Resets nanoScroller's scrollbar.
@method reset
@chainable
@example
$(".nano").nanoScroller();
*/
NanoScroll.prototype.reset = function() {
var content, contentHeight, contentStyle, contentStyleOverflowY, paneBottom, paneHeight, paneOuterHeight, paneTop, sliderHeight;
if (this.iOSNativeScrolling) {
this.contentHeight = this.content.scrollHeight;
return;
}
if (!this.$el.find("." + this.options.paneClass).length) {
this.generate().stop();
}
if (this.stopped) {
this.restore();
}
content = this.content;
contentStyle = content.style;
contentStyleOverflowY = contentStyle.overflowY;
if (BROWSER_IS_IE7) {
this.$content.css({
height: this.$content.height()
});
}
contentHeight = content.scrollHeight + BROWSER_SCROLLBAR_WIDTH;
paneHeight = this.pane.outerHeight();
paneTop = parseInt(this.pane.css('top'), 10);
paneBottom = parseInt(this.pane.css('bottom'), 10);
paneOuterHeight = paneHeight + paneTop + paneBottom;
sliderHeight = Math.round(paneOuterHeight / contentHeight * paneOuterHeight);
if (sliderHeight < this.options.sliderMinHeight) {
sliderHeight = this.options.sliderMinHeight;
} else if ((this.options.sliderMaxHeight != null) && sliderHeight > this.options.sliderMaxHeight) {
sliderHeight = this.options.sliderMaxHeight;
}
if (contentStyleOverflowY === SCROLL && contentStyle.overflowX !== SCROLL) {
sliderHeight += BROWSER_SCROLLBAR_WIDTH;
}
this.maxSliderTop = paneOuterHeight - sliderHeight;
this.contentHeight = contentHeight;
this.paneHeight = paneHeight;
this.paneOuterHeight = paneOuterHeight;
this.sliderHeight = sliderHeight;
this.slider.height(sliderHeight);
this.events.scroll();
this.pane.show();
this.isActive = true;
if ((content.scrollHeight === content.clientHeight) || (this.pane.outerHeight(true) >= content.scrollHeight && contentStyleOverflowY !== SCROLL)) {
this.pane.hide();
this.isActive = false;
} else if (this.el.clientHeight === content.scrollHeight && contentStyleOverflowY === SCROLL) {
this.slider.hide();
} else {
this.slider.show();
}
this.pane.css({
opacity: (this.options.alwaysVisible ? 1 : ''),
visibility: (this.options.alwaysVisible ? 'visible' : '')
});
return this;
};
/**
@method scroll
@private
@example
$(".nano").nanoScroller({ scroll: 'top' });
*/
NanoScroll.prototype.scroll = function() {
if (!this.isActive) {
return;
}
this.sliderY = Math.max(0, this.sliderY);
this.sliderY = Math.min(this.maxSliderTop, this.sliderY);
this.$content.scrollTop((this.paneHeight - this.contentHeight + BROWSER_SCROLLBAR_WIDTH) * this.sliderY / this.maxSliderTop * -1);
if (!this.iOSNativeScrolling) {
this.slider.css({
top: this.sliderY
});
}
return this;
};
/**
Scroll at the bottom with an offset value
@method scrollBottom
@param offsetY {Number}
@chainable
@example
$(".nano").nanoScroller({ scrollBottom: value });
*/
NanoScroll.prototype.scrollBottom = function(offsetY) {
if (!this.isActive) {
return;
}
this.reset();
this.$content.scrollTop(this.contentHeight - this.$content.height() - offsetY).trigger(MOUSEWHEEL);
return this;
};
/**
Scroll at the top with an offset value
@method scrollTop
@param offsetY {Number}
@chainable
@example
$(".nano").nanoScroller({ scrollTop: value });
*/
NanoScroll.prototype.scrollTop = function(offsetY) {
if (!this.isActive) {
return;
}
this.reset();
this.$content.scrollTop(+offsetY).trigger(MOUSEWHEEL);
return this;
};
/**
Scroll to an element
@method scrollTo
@param node {Node} A node to scroll to.
@chainable
@example
$(".nano").nanoScroller({ scrollTo: $('#a_node') });
*/
NanoScroll.prototype.scrollTo = function(node) {
if (!this.isActive) {
return;
}
this.reset();
this.scrollTop($(node).get(0).offsetTop);
return this;
};
/**
To stop the operation.
This option will tell the plugin to disable all event bindings and hide the gadget scrollbar from the UI.
@method stop
@chainable
@example
$(".nano").nanoScroller({ stop: true });
*/
NanoScroll.prototype.stop = function() {
this.stopped = true;
this.removeEvents();
this.pane.hide();
return this;
};
/**
To flash the scrollbar gadget for an amount of time defined in plugin settings (defaults to 1,5s).
Useful if you want to show the user (e.g. on pageload) that there is more content waiting for him.
@method flash
@chainable
@example
$(".nano").nanoScroller({ flash: true });
*/
NanoScroll.prototype.flash = function() {
var _this = this;
if (!this.isActive) {
return;
}
this.reset();
this.pane.addClass('flashed');
setTimeout(function() {
_this.pane.removeClass('flashed');
}, this.options.flashDelay);
return this;
};
return NanoScroll;
})();
$.fn.nanoScroller = function(settings) {
return this.each(function() {
var options, scrollbar;
if (!(scrollbar = this.nanoscroller)) {
options = $.extend({}, defaults, settings);
this.nanoscroller = scrollbar = new NanoScroll(this, options);
}
if (settings && typeof settings === "object") {
$.extend(scrollbar.options, settings);
if (settings.scrollBottom) {
return scrollbar.scrollBottom(settings.scrollBottom);
}
if (settings.scrollTop) {
return scrollbar.scrollTop(settings.scrollTop);
}
if (settings.scrollTo) {
return scrollbar.scrollTo(settings.scrollTo);
}
if (settings.scroll === 'bottom') {
return scrollbar.scrollBottom(0);
}
if (settings.scroll === 'top') {
return scrollbar.scrollTop(0);
}
if (settings.scroll && settings.scroll instanceof $) {
return scrollbar.scrollTo(settings.scroll);
}
if (settings.stop) {
return scrollbar.stop();
}
if (settings.flash) {
return scrollbar.flash();
}
}
return scrollbar.reset();
});
};
})(jQuery, window, document);
@@ -0,0 +1,25 @@
$(document).ready(function() {
$(".select_user_modal").on('click', function(){
var ids = [];
var users = $(this).siblings('#selected_users').children('span.selected_user');
users.each(function(i) {
ids.push(users.eq(i).attr('user_id'));
});
$("#main-wrap").after("<span id='select_user'></span>");
$.ajax({
type: 'GET',
url: $(this).attr("rel"),
dataType: 'script',
data: {field: $(this).attr("field"), ids: ids},
success: function (msg) {
$("#select_user_modal").modal('show'); },
error: function(){
alert("ERROR");
}
});
return false;
});
$(document).on('click', ".remove_user", function(){
$(this).parent().remove();
});
});
+2 -2
View File
@@ -9,7 +9,7 @@ function load_tinymce() {
// Theme options // Theme options
theme_advanced_buttons1 : "bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,formatselect,fontselect,fontsizeselect", theme_advanced_buttons1 : "bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,formatselect,fontselect,fontsizeselect",
theme_advanced_buttons2 : "cut,copy,paste,pastetext,pasteword,|,bullist,numlist,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code,|,forecolor,backcolor", theme_advanced_buttons2 : "cut,copy,paste,pastetext,pasteword,|,bullist,numlist,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code,|,forecolor,backcolor",
theme_advanced_buttons3 : "tablecontrols,|,hr,removeformat,visualaid,|,sub,sup,|,fullscreen", theme_advanced_buttons3 : "tablecontrols,|,hr,removeformat,visualaid,|,sub,sup,|,fullscreen,|,template",
theme_advanced_toolbar_location : "top", theme_advanced_toolbar_location : "top",
theme_advanced_toolbar_align : "left", theme_advanced_toolbar_align : "left",
theme_advanced_statusbar_location : "bottom", theme_advanced_statusbar_location : "bottom",
@@ -20,7 +20,7 @@ function load_tinymce() {
skin_variant : "silver", skin_variant : "silver",
font_size_style_values : "xx-small,x-small,small,medium,large,x-large,xx-large", font_size_style_values : "xx-small,x-small,small,medium,large,x-large,xx-large",
// Drop lists for link/image/media/template dialogs // Drop lists for link/image/media/template dialogs
template_external_list_url : "js/template_list.js", template_external_list_url : "/tinymce/lists/template_list.js",
// external_link_list_url : "js/link_list.js", // external_link_list_url : "js/link_list.js",
// external_image_list_url : "js/image_list.js", // external_image_list_url : "js/image_list.js",
// media_external_list_url : "js/media_list.js" // media_external_list_url : "js/media_list.js"
+1
View File
@@ -5,3 +5,4 @@
*= require_self *= require_self
*= require social-share-button *= require social-share-button
*/ */
+230
View File
@@ -0,0 +1,230 @@
/* Member Filter */
#select_user #select_user_modal.modal {
width: 80%;
margin-left: -40%;
}
#select_user #select_user_modal .modal-body {
max-height: 425px;
}
#select_user #select_user_modal .modal-body form {
margin-bottom: 0px;
}
#select_user #select_user_modal .modal-body form fieldset {
min-height: 360px;
}
#select_user #select_user_modal .modal-body .radio.inline,
#select_user #select_user_modal .modal-body .checkbox.inline {
display: inline-block;
padding-top: 5px;
margin-bottom: 0;
vertical-align: middle;
min-width: 100px;
margin-left: 0;
}
#select_user #select_user_modal .modal-body .form-actions {
margin: 20px 0 0;
padding: 10px 0 0;
background-color: transparent;
text-align: right;
}
#select_user #select_user_modal .modal-body .tabs-left > .nano {
width: 160px;
min-height: 425px;
float: left;
}
#select_user #select_user_modal .modal-body .tabs-left > .nano .pane {
right: 6px;
}
#select_user #select_user_modal .modal-body .tabs-left > .nano > .content > .nav-tabs {
width: 140px;
float: left;
margin-bottom: 0;
margin-right: 0;
border-right: 1px solid #ddd;
border-bottom: none;
}
#select_user #select_user_modal .modal-body .tabs-left > .nano > .content > .nav-tabs > li {
float: none;
}
#select_user #select_user_modal .modal-body .tabs-left > .nano > .content > .nav-tabs > li > a {
min-width: 74px;
margin-right: 0;
margin-bottom: 3px;
}
#select_user #select_user_modal .modal-body .tabs-left > .nano > .content > .nav-tabs > li > a {
margin-right: -1px;
-webkit-border-radius: 4px 0 0 4px;
-moz-border-radius: 4px 0 0 4px;
border-radius: 4px 0 0 4px;
}
#select_user #select_user_modal .modal-body .tabs-left > .nano > .content > .nav-tabs > li > a:hover {
border-color: #eeeeee #dddddd #eeeeee #eeeeee;
}
#select_user #select_user_modal .modal-body .tabs-left > .nano > .content > .nav-tabs .active > a,
#select_user #select_user_modal .modal-body .tabs-left > .nano > .content > .nav-tabs .active > a:hover {
border-color: #ddd transparent #ddd #ddd;
*border-right-color: #ffffff;
}
#select_user #select_user_modal .member-filter-options {
float: left;
display: inline-block;
width: 175px;
min-height: 425px;
margin-right: 10px;
padding: 0 10px 0 0;
}
#select_user #select_user_modal .member-filter-options select {
width: 165px;
}
#select_user #select_user_modal .member-filter-options .btn {
display: block;
}
#select_user #select_user_modal .member-filter-result {
padding-left: 15px;
min-height: 360px;
width: auto;
}
/* Check Box Card */
.checkbox-card {
margin: 0;
}
.checkbox-card li {
position: relative;
list-style: none;
color: #FFFFFF;
width: 180px;
height: 40px;
margin: 0 10px 10px 0;
float: left;
display: inline-block;
background-color: #cccccc;
overflow: hidden;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
-webkit-transition: all .2s linear;
-moz-transition: all .2s linear;
-o-transition: all .2s linear;
transition: all .2s linear;
}
.checkbox-card li.mark {
width: 0;
height: 0;
padding: 0;
margin: 0;
-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
filter: alpha(opacity=0);
opacity: 0;
visibility: hidden;
}
.checkbox-card li:hover {
background-color: #0088cc;
}
.checkbox-card li:after {
content: "";
display: block;
clear: both;
height: 0;
visibility: hidden;
}
.checkbox-card li.active:before {
-webkit-text-size-adjust : none;
font-family: FontAwesome;
font-weight: normal;
font-style: normal;
color: #FFF;
text-decoration: inherit;
content: "\f00c";
position: absolute;
right: 0px;
top: 0px;
line-height: 14px;
text-indent: 10px;
font-size: 10px;
width: 0px;
height: 0px;
border-style: solid;
border-width: 0 22px 22px 0;
border-color: transparent #51a351 transparent transparent;
}
.checkbox-card li.active label {
}
.checkbox-card li label {
margin-bottom: 0px;
overflow: hidden;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
}
.checkbox-card li input {
opacity: 0;
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
margin: 0;
z-index: 10;
}
.checkbox-card li label span {
-webkit-text-size-adjust : none;
font-size: 10px;
display: block;
width: 130px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
color: #666666;
margin-top: -3px;
}
.checkbox-card li:hover label span,
.checkbox-card li:hover label span.user-name {
color: #FFFFFF;
}
.checkbox-card li label span.user-name {
font-size: 12px;
color: #363636;
padding: 2px 0 0;
margin-top: 0;
}
.checkbox-card li .user-pic {
float: left;
margin-right: 5px;
width: 40px;
height: 40px;
}
#selected_users .selected_user {
display: block;
margin-bottom: 5px;
}
#selected_users .selected_user .remove_user {
font-size: 15px;
}
/*
.promoter {
border-color: #CCCCCC;
border-style: solid;
border-width: 0 1px;
padding: 0 10px 5px 10px;
}
.promoter > div {
border-bottom: 1px solid #CCCCCC;
}
.promoter > div:after {
content: "";
clear: both;
display: block;
visibility: hidden;
}
.promoter > div > span {
display: block;
margin-left: 70px;
padding-bottom: 5px;
}
.promoter p {
width: 70px;
float: left;
text-align:right;
}*/
+3 -3
View File
@@ -55,9 +55,9 @@
width:100%; width:100%;
} }
#orbit-bar .orbit-logo .brand { #orbit-bar .orbit-logo .brand {
background:url(<%= asset_path 'orbit-bar.png' %>) no-repeat -162px -5px; background: url(<%= asset_path 'ga-logo.png' %>) no-repeat center center;
text-indent:-9999px; text-indent: -9999px;
padding:5px 20px 4px; padding: 5px 20px 4px;
} }
#orbit-bar .orbit-logo .brand:hover { #orbit-bar .orbit-logo .brand:hover {
background-color:#009ddc; background-color:#009ddc;
+3 -1
View File
@@ -1,5 +1,7 @@
/*style*/ /*style*/
* {
outline: none;
}
@font-face{ @font-face{
font-family: 'WebSymbolsRegular'; font-family: 'WebSymbolsRegular';
src: url(<%= asset_path 'websymbols-regular-webfont.eot' %>); src: url(<%= asset_path 'websymbols-regular-webfont.eot' %>);
@@ -0,0 +1,38 @@
class Admin::MailCronLogsController < OrbitBackendController
layout "new_admin"
before_filter :authenticate_user!
before_filter :is_admin?
def index
# @mail_cron_logs = MailCronLog.all.desc(:created_at).page(params[:page_main] ).per('20')
@mail_cron_logs = (params[:sort]) ? get_sorted_and_filtered("mail_cron_log") : get_viewable("mail_cron_log")
respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @mail_crons }
format.js
end
end
def destroy
@mail_cron_log = MailCronLog.find(params[:id])
@mail_cron_log.destroy
respond_to do |format|
format.html { redirect_to(admin_mail_cron_logs_url) }
# format.xml { head :ok }
format.js
end
end
def delete
if params[:ids]
mail_cron_logs = MailCronLog.any_in(:_id => params[:ids]).destroy_all
end
redirect_to admin_mail_cron_logs_url(:direction => params[:direction], :sort => params[:sort], :sort_options => params[:sort_options])
end
end
@@ -0,0 +1,126 @@
class Admin::MailCronsController < OrbitBackendController
layout "new_admin"
before_filter :authenticate_user!
before_filter :is_admin?
def index
# @mail_crons = MailCron.all.asc(:mail_sentdate).page(params[:page_main] ).per('20')
@mail_crons = (params[:sort]) ? get_sorted_and_filtered("mail_cron") : get_viewable("mail_cron")
respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @mail_crons }
format.js
end
end
def show
end
def new
@mail_cron = MailCron.new
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @mail_cron }
end
end
def create
@mail_cron = MailCron.new(params[:mail_cron])
@mail_cron.create_user_id = current_user.id
@mail_cron.update_user_id = current_user.id
respond_to do |format|
if @mail_cron.save
format.html { redirect_to(admin_mail_crons_url) }
format.xml { render :xml => @mail_cron, :status => :created, :location => @mail_cron }
else
format.html { render :action => "new" }
format.xml { render :xml => @mail_cron.errors, :status => :unprocessable_entity }
end
end
end
def edit
@mail_cron = MailCron.find(params[:id])
end
def update
@datas = MailCron.where(:mail_sentdate.lte => Time.now, :mail_sent => false)
@datas.each do |mail_data|
@mail_j = 0
@read_mails = Array.new
@mails = mail_data.mail_to.split(",")
@mails.each do |send_mail|
@read_mails << send_mail
@mail_j += 1
if 0 == @mail_j % 30
MailCronMailer.cron_mail( mail_data.id, @read_mails.join(',') ).deliver
@read_mails = Array.new
sleep 10
end
end
if !@read_mails.join(',').blank?
MailCronMailer.cron_mail( mail_data.id, @read_mails.join(',') ).deliver
@read_mails = Array.new
sleep 10
end
end
@mail_cron = MailCron.find(params[:id])
@mail_cron.update_user_id = current_user.id
respond_to do |format|
if @mail_cron.update_attributes(params[:mail_cron])
format.html { redirect_to(admin_mail_crons_url) }
format.js { render 'toggle_enable' }
format.xml { head :ok }
else
format.html { render :action => "edit" }
format.xml { render :xml => @mail_cron.errors, :status => :unprocessable_entity }
end
end
end
def destroy
@mail_cron = MailCron.find(params[:id])
@mail_cron.destroy
respond_to do |format|
format.html { redirect_to(admin_mail_crons_url) }
# format.xml { head :ok }
format.js
end
end
def delete
if params[:ids]
mail_crons = MailCron.any_in(:_id => params[:ids]).destroy_all
end
redirect_to admin_mail_crons_url(:direction => params[:direction], :sort => params[:sort], :sort_options => params[:sort_options])
end
protected
end
@@ -70,4 +70,30 @@ class Admin::MemberSelectsController < OrbitBackendController
end end
def select_members
selected_users = User.find(params[:ids]) rescue []
@field = params[:field]
roles = Role.all
@sorted_users = roles.inject({}) do |users, role|
users[role] = role.users.where(:email.not => /guest|rulingcom/) - selected_users
users
end
end
def set_roles
roles = Role.find(params[:role_ids]) rescue []
@field = params[:field]
@users = roles.inject([]) do |users, role|
users += role.users.where(:email.not => /guest|rulingcom/).entries
users
end
render 'admin/member_selects/update_selected_users'
end
def set_users
@users = User.find(params[:user_ids]) rescue []
@field = params[:field]
render 'admin/member_selects/update_selected_users'
end
end end
+15 -13
View File
@@ -11,23 +11,21 @@ class DefaultWidgetController< OrbitWidgetController
end end
def query_for_default_widget def query_for_default_widget
@ori_class_name = @default_widget["query"].split('.')[0]
@ori_class_name = @default_widget["query"].split('.')[0] @result = eval(@default_widget["query"])
result = nil
result_objects = nil
if !params["tag_id"].blank? if !params["tag_id"].blank?
if params["category_id"].blank? #has tag no cate if params["category_id"].blank? #has tag no cate
result = @ori_class_name.constantize.where(:tagged_ids.in => params["tag_id"]) @result.selector[:tagged_ids] = { "$in" => params['tag_id'] }
else #has tag and cate else #has tag and cate
result = eval("#{@ori_class_name}.where(:#{get_category_field_name}.in=>params['category_id'], :tagged_ids.in => params['tag_id'])") @result.selector[get_category_field_name] = { "$in" => params['category_id'].collect{|t| BSON::ObjectId(t)}}
@result.selector[:tagged_ids] = { "$in" => params['tag_id'] }
end end
elsif params["category_id"].blank? #no tag no cate elsif params["category_id"].blank? #no tag no cate
result = eval(@default_widget["query"])
else #no tag has cate else #no tag has cate
result = eval("#{@ori_class_name}.where(:#{get_category_field_name}.in=>params['category_id'])")
@result.selector[get_category_field_name] = { "$in" => params['category_id'].collect{|t| BSON::ObjectId(t)}}
end end
result.available_for_lang(I18n.locale).can_display.desc(:is_top, :postdate) eval("@result.#{@default_widget[:sorting_query]}")
end end
def search_result def search_result
@@ -40,9 +38,13 @@ class DefaultWidgetController< OrbitWidgetController
def default_widget def default_widget
@search = params["search_query"].blank? ? false : true @search = params["search_query"].blank? ? false : true
if !params[:id].blank? if !params[:id].blank? and !params["clicked_field_name"].blank?
clicked_field_name = params["clicked_field_name"].to_sym 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}})") redirect_to eval("#{@page_part.module_app.widget_fields_link_method[clicked_field_name][:method]}('#{params[:id]}', {inner: #{params[:inner] || true}})")
elsif !params[:id].blank? and params["preview"]
clicked_field_name = :title
@preview_pages = @page_part.module_app.widget_fields_link_method.find_all{|t| t[1].has_key?(:preview)}.collect{|t| t[0]}
redirect_to eval("#{@page_part.module_app.widget_fields_link_method[clicked_field_name][:method]}('#{params[:id]}', {preview: true,inner: #{params[:inner] || true},clicked_field_name: '#{@preview_pages.first.to_s}'})")
else else
@tag_class = nil @tag_class = nil
@default_widget = @page_part.module_app.get_default_widget @default_widget = @page_part.module_app.get_default_widget
@@ -91,9 +93,9 @@ class DefaultWidgetController< OrbitWidgetController
end end
def get_category_field_name def get_category_field_name
@ori_class_name = @ori_class_name.constantize @ori_class_name = @ori_class_name.constantize unless @ori_class_name.is_a? Class
@ori_class_name.fields.each_key do |key| @ori_class_name.fields.each_key do |key|
return key if key.include?('category_id') return key.to_s if key.include?('category_id')
end end
nil nil
end end
@@ -7,4 +7,10 @@ class OrbitFrontendComponentController< ApplicationController
@app_title = request.fullpath.split('/')[2] @app_title = request.fullpath.split('/')[2]
end end
def delay_impressionist(item)
user_id = current_user.nil? ? nil : current_user.id
Resque.enqueue(DelayedImpressionist,:request=>DelayImpressionistRequest.new(request),:obj=>item,:class=>item.class.to_s,:controller_name=>controller_name,:action_name=>action_name,:user=>user_id)
end
end end
+34 -30
View File
@@ -44,29 +44,13 @@ class PagesController < ApplicationController
# render :file => "#{Rails.root}/public/404.html", :status => :not_found # render :file => "#{Rails.root}/public/404.html", :status => :not_found
#end #end
end end
def convert_array_param(key,array)
array.collect{|t| "#{key}[]=#{t}"}.join("&")
end
def index_from_link def index_from_link
url = "/#{@item.path}" url = "/#{@item.path}"
options = '' options = ''
options << "#{options.blank? ? '?' : '&'}page_main=#{params[:page_main]}" unless params[:page_main].blank? options << "#{options.blank? ? '?' : '&'}page_main=#{params[:page_main]}" unless params[:page_main].blank?
options << "#{options.blank? ? '?' : '&'}#{convert_array_param('category_id', params[:category_id])}" unless params[:category_id].blank?
if params[:category_id].is_a? Array options << "#{options.blank? ? '?' : '&'}#{convert_array_param('tag_id', params[:tag_id])}" unless params[:tag_id].blank?
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? ? '?' : '&'}search_query=#{params[:search_query]}" unless params[:search_query].blank?
options << "#{options.blank? ? '?' : '&'}name=#{params[:name]}" unless params[:name].blank? options << "#{options.blank? ? '?' : '&'}name=#{params[:name]}" unless params[:name].blank?
uri = URI::escape(url + options) uri = URI::escape(url + options)
@@ -78,8 +62,8 @@ class PagesController < ApplicationController
url = "/#{@item.path}" url = "/#{@item.path}"
options = '' options = ''
options << "#{options.blank? ? '?' : '&'}id=#{params[:id]}" unless params[:id].blank? options << "#{options.blank? ? '?' : '&'}id=#{params[:id]}" unless params[:id].blank?
options << "#{options.blank? ? '?' : '&'}category_id=#{params[:category_id]}" unless params[:category_id].blank? options << "#{options.blank? ? '?' : '&'}#{convert_array_param('category_id', params[:category_id])}" unless params[:category_id].blank?
options << "#{options.blank? ? '?' : '&'}tag_id=#{params[:tag_id]}" unless params[:tag_id].blank? options << "#{options.blank? ? '?' : '&'}#{convert_array_param('tag_id', params[:tag_id])}" unless params[:tag_id].blank?
options << "#{options.blank? ? '?' : '&'}preview=#{params[:preview]}" unless params[:preview].blank? options << "#{options.blank? ? '?' : '&'}preview=#{params[:preview]}" unless params[:preview].blank?
options << "#{options.blank? ? '?' : '&'}controller_action=#{params[:controller_action]}" unless params[:controller_action].blank? options << "#{options.blank? ? '?' : '&'}controller_action=#{params[:controller_action]}" unless params[:controller_action].blank?
options << "#{options.blank? ? '?' : '&'}clicked_field_name=#{params[:clicked_field_name]}" unless params[:clicked_field_name].blank? options << "#{options.blank? ? '?' : '&'}clicked_field_name=#{params[:clicked_field_name]}" unless params[:clicked_field_name].blank?
@@ -98,23 +82,43 @@ class PagesController < ApplicationController
elsif params[:same_page_id] elsif params[:same_page_id]
@item = Item.find(params[:same_page_id]) @item = Item.find(params[:same_page_id])
else else
category_ids = params[:category_id].is_a?(Array) ? params[:category_id] : [params[:category_id]] category_ids = Array(params[:category_id]) unless params[:category_id].nil?
tag_ids = params[:tag_id].is_a?(Array) ? params[:tag_id] : [params[:tag_id]] tag_ids = Array(params[:tag_id]) unless params[:tag_id].nil?
module_app = ModuleApp.first(:conditions => {:key => params[:app_name]}) module_app = ModuleApp.first(:conditions => {:key => params[:app_name]})
default_query = { is_published: true, module_app_id: module_app.id, :app_frontend_url.in => [params[:app_action], 'default_widget'] }
specific_categories = { :category => category_ids }
in_categories = { :category.in => category_ids }
nil_categories = { :category.in => [nil, []] }
specific_tags = { :tag => tag_ids }
in_tags = { :tag.in => tag_ids }
nil_tags = { :tag.in => [nil, []] }
if !category_ids.blank? && !tag_ids.blank? if !category_ids.blank? && !tag_ids.blank?
@item = Item.first(:conditions => {:module_app_id => module_app.id, :app_frontend_url => params[:app_action], :category.in => category_ids, :tag.in => tag_ids}) @item = Item.where(default_query.merge(specific_categories).merge(specific_tags)).first
@item = Item.first(:conditions => {:module_app_id => module_app.id, :app_frontend_url => params[:app_action], :category.in => category_ids, :tag.in => [nil, []]}) unless @item @item = Item.where(default_query.merge(specific_categories).merge(in_tags)).first unless @item
@item = Item.where(default_query.merge(specific_categories).merge(nil_tags)).first unless @item
@item = Item.where(default_query.merge(specific_tags).merge(in_categories)).first unless @item
@item = Item.where(default_query.merge(specific_tags).merge(nil_categories)).first unless @item
@item = Item.where(default_query.merge(in_categories).merge(in_tags)).first unless @item
@item = Item.where(default_query.merge(in_categories).merge(nil_tags)).first unless @item
@item = Item.where(default_query.merge(in_tags).merge(nil_categories)).first unless @item
elsif !category_ids.blank? elsif !category_ids.blank?
@item = Item.where(module_app_id: module_app.id, app_frontend_url: params[:app_action], :category.in => category_ids).any_in(tag: [nil, []]).first @item = Item.where(default_query.merge(specific_categories).merge(nil_tags)).first
@item = Item.where(default_query.merge(specific_categories)).first unless @item
@item = Item.where(default_query.merge(in_categories).merge(nil_tags)).first unless @item
@item = Item.where(default_query.merge(in_categories)).first unless @item
elsif !tag_ids.blank? elsif !tag_ids.blank?
@item = Item.where(module_app_id: module_app.id, app_frontend_url: params[:app_action], :tag.in => tag_ids).any_in(category: [nil, []]).first @item = Item.where(default_query.merge(specific_tags).merge(nil_categories)).first
@item = Item.where(default_query.merge(specific_tags)).first unless @item
@item = Item.where(default_query.merge(in_tags).merge(nil_categories)).first unless @item
@item = Item.where(default_query.merge(in_tags)).first unless @item
end end
@item = Item.find(params[:orig_page]) unless @item || params[:orig_page].blank? @item = Item.find(params[:orig_page]) unless @item || params[:orig_page].blank?
@item = Item.where(module_app_id: module_app.id, app_frontend_url: params[:app_action]).all_of("tag" => {"$in" => [nil, []]},"category" => { "$in" => [nil, []]}).first unless @item @item = Item.where(default_query.merge(nil_categories).merge(nil_tags)).first unless @item
@item = Item.where(module_app_id: module_app.id, app_frontend_url: 'default_widget').first unless @item @item = Item.where(default_query).first unless @item
@item = Item.where(module_app_id: module_app.id, app_frontend_url: params[:app_action]).first unless @item
end end
raise PageError,'Missing Frontend Page' if @item.nil? raise PageError, 'Missing Frontend Page' if @item.nil?
end end
def save_from_no_lang_for_page def save_from_no_lang_for_page
+36
View File
@@ -0,0 +1,36 @@
class SamlLoginsController < ApplicationController
require "net/http"
require "uri"
require 'rexml/document'
include REXML
def index
if params[:wa] == "wsignoutcleanup1.0" #logout
redirect_to :root
else #login
@wresult = params[:wresult]
@wctx = params[:wctx]
@main_url = LIST[:sites][@wctx]['url']
@main_public_key = LIST[:sites][@wctx]['key']
@doc = REXML::Document.new @wresult
@main_public_key = "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzKawlFWAMzA/uV/kcewd\nmtj8PcqxosmnSh7ZzJ0DumG2ieeP9oDBicqbqIEaeJVvrRzYJD2a+u8x5KKMKB8J\nHbMUpCBFlIpkDMjU/oZVMcYT9pcH51QWNvCgHG7prVykSGFz1JRvjSP6cwuZKBFd\nFFneOViETqoMIO1DbRLXsGfPvMOJY9C1xDwv1dLv0Wbj7M9N6eNz06a50bu3I4gl\nMumxWnZUabXL3G62S/Si4NM7J2jOUnkEOxJWOhcAX/iiqS9T8AHu84um2+mLQpfB\nJJFFIWCIAtU78VnIN5JSWwjFU5TsiSyCFYpGXKxUFD25cFmt3SfG0gwmrFis5Pdn\nhwIDAQAB\n-----END PUBLIC KEY-----\n"
public_key = OpenSSL::PKey::RSA.new(@main_public_key)
encrypted_data = public_key.public_encrypt(@doc.elements["//saml:AttributeValue"].text)
redirect_to "http://#{@main_url}/user_login?" + { :wresult => encrypted_data }.to_param
end
end
end
+40
View File
@@ -0,0 +1,40 @@
# encoding: utf-8
class SessionsController < Devise::SessionsController
prepend_before_filter :require_no_authentication, :only => [ :new, :create ]
def create
@site = Site.first
private_key = OpenSSL::PKey::RSA.new(@site.private_key)
wresult = private_key.private_decrypt(request.params['wresult'])
@ids = wresult.split("@")
login_uid = @ids[0]
resource = User.first(conditions:{user_id: login_uid})
if !resource.blank?
resource_name = resource.class.to_s.downcase
sign_in(resource_name, resource)
session[:user_id_type] = "myntu"
redirect_to after_sign_in_path_for(resource)
else
flash[:error] = "很抱歉,您無此權限或帳號登入本站,請洽本站管理員<br />Sorry, you don't have the account or authority to login. Please contact the website administrator."
redirect_to :root
end
end
def destroy
@user_id_type = session[:user_id_type]
sign_out
if @user_id_type == "myntu"
redirect_to "https://adfs.ntu.edu.tw/adfs/ls/?wa=wsignout1.0&wreply=https://galogin.ntu.edu.tw"
else
redirect_to root_path
end
end
end
+26 -19
View File
@@ -1,5 +1,5 @@
module ApplicationHelper module ApplicationHelper
include OrbitApp::Module::VisitorCounter
FLASH_NOTICE_KEYS = [:error, :notice, :warning] FLASH_NOTICE_KEYS = [:error, :notice, :warning]
@@ -7,8 +7,9 @@ module ApplicationHelper
request.referer.include?('?') ? [request.referer,param_hash.to_param].join('&') : [request.referer,param_hash.to_param].join('?') request.referer.include?('?') ? [request.referer,param_hash.to_param].join('&') : [request.referer,param_hash.to_param].join('?')
end end
def delayed_impressionist(object) def delayed_impressionist(item)
# Resque.enqueue_at(1.minute.from_now,DelayedImpressionist,object) user_id = current_user.nil? ? nil : current_user.id
Resque.enqueue(DelayedImpressionist,:request=>DelayImpressionistRequest.new(request),:obj=>item,:class=>item.class.to_s,:controller_name=>controller_name,:action_name=>action_name,:user=>user_id)
end end
def check_user_role_enable(attribute_fields) def check_user_role_enable(attribute_fields)
@@ -242,25 +243,27 @@ module ApplicationHelper
"#{t(:view_count)}: #{object.view_count}" "#{t(:view_count)}: #{object.view_count}"
end end
def display_visitors(options={}) # def display_visitors(options={})
Impression.where(options).and(:referrer.ne => nil).distinct(:session_hash).count # # Impression.where(options).and(:referrer.ne => nil).distinct(:session_hash).count
end # impressions = Impression.where(options).and(:referrer.ne => nil)
# impressions.map{|i| i[:session_hash]}.uniq.count
# end
def display_visitors_today # def display_visitors_today
display_visitors(created_at: {'$gte' => Date.today.beginning_of_day, '$lte' => Date.today.end_of_day}) # display_visitors(created_at: {'$gte' => Date.today.beginning_of_day, '$lte' => Date.today.end_of_day})
end # end
def display_visitors_this_week # def display_visitors_this_week
display_visitors(created_at: {'$gte' => Date.today.beginning_of_week, '$lte' => Date.today.end_of_week}) # display_visitors(created_at: {'$gte' => Date.today.beginning_of_week, '$lte' => Date.today.end_of_week})
end # end
def display_visitors_this_month # def display_visitors_this_month
display_visitors(created_at: {'$gte' => Date.today.beginning_of_month, '$lte' => Date.today.end_of_month}) # display_visitors(created_at: {'$gte' => Date.today.beginning_of_month, '$lte' => Date.today.end_of_month})
end # end
def display_visitors_this_year # def display_visitors_this_year
display_visitors(created_at: {'$gte' => Date.today.beginning_of_year, '$lte' => Date.today.end_of_year}) # display_visitors(created_at: {'$gte' => Date.today.beginning_of_year, '$lte' => Date.today.end_of_year})
end # end
def display_date_time(object) def display_date_time(object)
object.strftime("%Y-%m-%d %H:%M") object.strftime("%Y-%m-%d %H:%M")
@@ -300,7 +303,7 @@ module ApplicationHelper
# NTU link # NTU link
def get_link(site_number) def get_link(site_number)
"http://#{request.host}:2#{site_number}00" "http://#{site_number}.#{request.domain(3)}"
end end
def sortable(column, title = nil, options = {}) def sortable(column, title = nil, options = {})
@@ -311,4 +314,8 @@ module ApplicationHelper
link_to title, params.merge({direction: direction, sort: column, sort_options: column}), {:class => "#{css_class} sortable", :remote => options[:remote]} link_to title, params.merge({direction: direction, sort: column, sort_options: column}), {:class => "#{css_class} sortable", :remote => options[:remote]}
end end
def convert_array_param(key, array)
Array(array).collect{|t| "#{key}[]=#{t}"}.join("&")
end
end end
+16
View File
@@ -3,6 +3,13 @@ module DefaultWidgetHelper
I18n.t("#{@page_part.module_app.key}.default_widget.#{field}") I18n.t("#{@page_part.module_app.key}.default_widget.#{field}")
end end
def get_top_hot_class(row_data)
class_attr = []
class_attr << 'data_is_hot' if( row_data.is_hot? rescue false )
class_attr << 'data_is_top' if( row_data.is_top? rescue false)
return class_attr.join(" ")
end
def link_to_field(row_data,field, switch, options=nil) def link_to_field(row_data,field, switch, options=nil)
method_ary = @page_part.module_app.widget_fields_link_method method_ary = @page_part.module_app.widget_fields_link_method
field = field.to_sym field = field.to_sym
@@ -77,4 +84,13 @@ module DefaultWidgetHelper
content_tag(:span,get_display(row_data,field_setting),:class=>field_setting[:class]) content_tag(:span,get_display(row_data,field_setting),:class=>field_setting[:class])
end end
end end
def get_row_category(row_data)
row_data.send("#{row_data.class.to_s.underscore}_category_id") rescue nil
end
def get_row_tags(row_data)
row_data.tagged_ids rescue nil
end
end end
+12 -4
View File
@@ -2,16 +2,24 @@ class BackupServer
@queue = :high @queue = :high
def self.perform() def self.perform()
#CronMail.time_check("Going to backup Orbit").deliver
dbhost = Mongoid.config.database.connection.primary.join ':' dbhost = Mongoid.config.database.connection.primary.join ':'
dbname = Mongoid.config.database.name dbname = Mongoid.config.database.name
archive_db_list_path = OrbitSystemPreference::ArchiveDbListPath archive_db_list_path = OrbitSystemPreference::ArchiveDbListPath
dbdirectory = "#{Rails.root}/tmp/#{dbname}-"+Time.now.strftime("%Y-%m-%d-%H-%M") dbdirectory = "#{Rails.root}/tmp/#{dbname}-"+Time.now.strftime("%Y-%m-%d-%H-%M")
%x[mongodump -h #{dbhost} -d #{dbname} -o #{dbdirectory} ] %x[mongodump -h #{dbhost} -d #{dbname} -o #{dbdirectory} ]
%x[rm #{archive_db_list_path}] Dir.foreach('tmp') do |item|
%x[ls #{Rails.root}/tmp/#{dbname}* | du -h --max-depth=1 --block-size=1M |sort -h >> #{archive_db_list_path}] date_str = item.to_s.gsub("#{dbname}-",'')
next if not date_str.match(/\d{4}-\d{2}-\d{2}-\d{2}-\d{2}/)
if Date.parse(date_str).to_time < Site.first.backup_keep_for_days.days.ago
OrbitLogger.info "Deleting #{date_str}"
%x[rm -rf tmp/#{item}]
end
end
%x[rm -f #{archive_db_list_path}]
%x[cd tmp ; ls -l |grep #{dbname} | awk '{print $8}'|xargs du -h --block-size=1M --max-depth=0 |sort -h >> #{archive_db_list_path}]
OrbitLogger.info "DB backup done Path:#{dbdirectory}" OrbitLogger.info "DB backup done Path:#{dbdirectory}"
end end
end end
+10 -25
View File
@@ -1,36 +1,21 @@
class DashboardCounter < Resque::Plugins::RestrictionJob class DashboardCounter < Resque::Plugins::RestrictionJob
extend OrbitApp::Module::VisitorCounterEval
@queue = :high @queue = :high
def self.perform(*args) def self.perform(*args)
site = Site.first site = Site.first
obj = new(*args) obj = new(*args)
site.dashboard_counter[:visitors_this_week] = obj.display_visitors_this_week site.visitor_counters[:total] = display_visitors
site.dashboard_counter[:visitors_this_month] = obj.display_visitors_this_month site.visitor_counters[:today] = display_visitors_today
site.dashboard_counter[:visitors_this_year] = obj.display_visitors_this_year site.visitor_counters[:this_week] = display_visitors_this_week
site.visitor_counters[:this_month] = display_visitors_this_month
site.visitor_counters[:this_year] = display_visitors_this_year
site.save site.save
OrbitLogger.info "DashboardCounter done #{site.dashboard_counter.to_s}" OrbitLogger.info "DashboardCounter done #{site.visitor_counters.to_s}"
end
#Notice this is mainly used at user dashbroad. however the code there is currentlly using realtime evaluation.
def display_visitors(options={}) #and the site model will need a field call dashboard_counter to complete this job.
impressions = Impression.where(options).and(:referrer.ne => nil)
impressions.map{|i| i[:session_hash]}.uniq.count
end
def display_visitors_today
display_visitors(created_at: {'$gte' => Date.today.beginning_of_day, '$lte' => Date.today.end_of_day})
end
def display_visitors_this_week
display_visitors(created_at: {'$gte' => Date.today.beginning_of_week, '$lte' => Date.today.end_of_week})
end
def display_visitors_this_month
display_visitors(created_at: {'$gte' => Date.today.beginning_of_month, '$lte' => Date.today.end_of_month})
end
def display_visitors_this_year
display_visitors(created_at: {'$gte' => Date.today.beginning_of_year, '$lte' => Date.today.end_of_year})
end end
end end
+50 -6
View File
@@ -1,7 +1,51 @@
class DelayedImpressionist class DelayedImpressionist
@queue = :low def self.before_filter(*args)
def self.perform(object) return
impressionist(object) end
true
end include ImpressionistController::InstanceMethods
@queue = :low
def initialize(request,controller_name,action_name,user,obj)
@controller_name = controller_name
@action_name = action_name
@user = User.find user unless user.nil?
@request = request
end
def self.perform(*args)
arg = args[0]
@request= DelayImpressionistRequest.new
@request.restore(arg["request"])
obj = eval("#{arg["class"]}.find '#{arg['obj']['_id']}'")
# imp = new(@request,arg["controller_name"],arg["action_name"],arg["user"],obj)
new_impression = obj.impressions.build(:user_id=>arg["user"],:controller_name=>arg["controller_name"],:action_name=>arg["action_name"],:ip_address=>@request.remote_ip,:referrer=>@request.referer)
@try = 1
loop do
result = new_impression.save rescue false
break if (result || @try >= 10)
@try = @try + 1
puts "trying:#{@try}"
end
new_impression.save
obj.update_attribute(:view_count,obj.impression_count)
end
private
def user
@user
end
def action_name
@action_name
end
def controller_name
@controller_name
end
def request
@request
end
end end
+42
View File
@@ -0,0 +1,42 @@
class EmailCron
@queue = :mail
def self.perform
@datas = MailCron.where(:mail_sentdate.lte => Time.now)
@datas.each do |mail_data|
@mail_j = 0
@read_mails = Array.new
@mails = mail_data.mail_to.split(",")
@mails.each do |send_mail|
@read_mails << send_mail
@mail_j += 1
if 0 == @mail_j % 30
MailCronMailer.cron_mail( mail_data.id, @read_mails.join(',') ).deliver
@read_mails = Array.new
sleep 10
end
end
if !@read_mails.join(',').blank?
MailCronMailer.cron_mail( mail_data.id, @read_mails.join(',') ).deliver
@read_mails = Array.new
sleep 10
end
end
end
end
+7
View File
@@ -0,0 +1,7 @@
class GetAnnouncementFromRss
@queue = :high
def self.perform()
%x(ruby "#{Rails.root}/lib/rss_ntu_job.rb")
end
end
+1 -1
View File
@@ -3,7 +3,7 @@ class UpdateTagCloud
def self.perform() def self.perform()
Tag.all.each do |tag| 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)) tag.update_attribute(:cloud_view_count, tag.get_impressionist)
end end
OrbitLogger.info "UpdateTagCloud Done" OrbitLogger.info "UpdateTagCloud Done"
end end
+81
View File
@@ -0,0 +1,81 @@
class MailCronMailer < ActionMailer::Base
default :from => "orbit_test@rulingcom.com"
def get_settings
@site = Site.first
@smtp_settings = {
:address => @site['site_settings']['address'],
:port => @site['site_settings']['port'],
:domain => @site['site_settings']['domain'],
:authentication => @site['site_settings']['authentication'],
# :user_name => @site['site_settings']['user_name'],
# :password => @site['site_settings']['password'],
:tls => (@site['site_settings']['tls'] == '0' ? false : true ) ,
:enable_starttls_auto => (@site['site_settings']['enable_starttls_auto'] == '0' ? false : true )
}
if !@site['site_settings']['user_name'].blank?
@smtp_settings[:user_name] = @site['site_settings']['user_name']
end
if !@site['site_settings']['password'].blank?
@smtp_settings[:password] = @site['site_settings']['password']
end
ActionMailer::Base.smtp_settings = @smtp_settings
end
def cron_mail( data_id, group_mail )
get_settings
@data = MailCron.find(data_id)
if @data
@user = User.find(@data.create_user_id)
if !@data.mail_cron_files.blank?
@data.mail_cron_files.each_with_index do |mail_cron_file, i|
file_type = File.extname(mail_cron_file.file.to_s)
file_content = Mongo::GridFileSystem.new(Mongoid.database).open(mail_cron_file.file.url.gsub("/gridfs/", "").force_encoding("UTF-8"), 'r')
attachments["#{mail_cron_file.title}#{file_type}"] = file_content.read
end
end
if !@data.mail_content["text"].blank?
mail( :from => @data.mail_from, :reply_to => @data.mail_reply_to, :bcc => group_mail, :subject => @data.mail_subject ) do |format|
format.html { render :text => @data.mail_content["text"] }
end
elsif !@data.mail_content["template"].blank?
mail( :from => @data.mail_from, :reply_to => @data.mail_reply_to, :bcc => group_mail, :subject => @data.mail_subject ) do |format|
format.html { render :template => @data.mail_content["template"], :collection => @data.mail_content }
end
end
@mail_cron_log = {
:mail_subject => @data.mail_subject,
:mail_to => group_mail,
:mail_user => @user.name,
:mailer_count => group_mail.split(",").size,
:mail_from_app => @data.mail_from_app
}
@mail_cron_log = MailCronLog.new(@mail_cron_log)
@mail_cron_log.save
@data.destroy
end
end
end
+70
View File
@@ -0,0 +1,70 @@
class MailCron
include Mongoid::Document
include Mongoid::Timestamps
field :mail_from_app
field :mail_from
field :mail_to
field :mail_reply_to
field :mail_subject
field :mail_content, :type => Hash
field :mail_sentdate , :type => DateTime
field :create_user_id
field :update_user_id
has_many :mail_cron_files, :autosave => true, :dependent => :destroy
accepts_nested_attributes_for :mail_cron_files, :allow_destroy => true
after_save :save_mail_cron_files
def save_mail_cron_files
self.mail_cron_files.each do |t|
if t.should_destroy
t.destroy
end
end
end
def self.send_mail_now(mail_cron_id)
mail_data = MailCron.find(mail_cron_id)
if !mail_data.blank?
@mail_j = 0
@read_mails = Array.new
@mails = mail_data.mail_to.split(",")
@mails.each do |send_mail|
@read_mails << send_mail
@mail_j += 1
if 0 == @mail_j % 30
MailCronMailer.cron_mail( mail_data.id, @read_mails.join(',') ).deliver
@read_mails = Array.new
sleep 10
end
end
if !@read_mails.join(',').blank?
MailCronMailer.cron_mail( mail_data.id, @read_mails.join(',') ).deliver
@read_mails = Array.new
sleep 10
end
end
end
end
+13
View File
@@ -0,0 +1,13 @@
class MailCronFile
include Mongoid::Document
include Mongoid::Timestamps
mount_uploader :file, AssetUploader
field :should_destroy, :type => Boolean
field :title
belongs_to :mail_cron
end
+14
View File
@@ -0,0 +1,14 @@
class MailCronLog
include Mongoid::Document
include Mongoid::Timestamps
field :mail_subject
field :mail_to
field :mail_user
field :mailer_count
field :mail_from_app
end
+1 -1
View File
@@ -140,7 +140,7 @@ class ModuleApp
def sorted_tags_for_cloud def sorted_tags_for_cloud
temp_tags = {} temp_tags = {}
self.tags.each{ |tag| self.tags.each{ |tag|
temp_tags.merge!({tag => Tag.get_impressionist(tag)}) temp_tags.merge!({tag => tag.cloud_view_count})
} }
if !temp_tags.blank? if !temp_tags.blank?
sorted_tags = temp_tags.sort{|a,b| a[1]<=>b[1]}.reverse sorted_tags = temp_tags.sort{|a,b| a[1]<=>b[1]}.reverse
+7 -2
View File
@@ -15,8 +15,13 @@ class ObjectAuth < PrototypeAuth
end end
def check_user_has_can_access_app def check_user_has_can_access_app
sub_managing_users = auth_obj.module_app.sub_managing_users rescue [] if auth_obj["_type"] == "PageContext"
module_app = auth_obj.module_app module_app = ModuleApp.where(:key=>'page_content').first
sub_managing_users = module_app.sub_managing_users rescue []
else
sub_managing_users = auth_obj.module_app.sub_managing_users rescue []
module_app = auth_obj.module_app
end
self.auth_users.each do |auth_user| self.auth_users.each do |auth_user|
if !sub_managing_users.include? auth_user && !auth_user.admin? if !sub_managing_users.include? auth_user && !auth_user.admin?
module_app.assign_sub_manager(auth_user,User.current) module_app.assign_sub_manager(auth_user,User.current)
+1 -1
View File
@@ -3,7 +3,7 @@ class Page < Item
include Impressionist::Impressionable include Impressionist::Impressionable
include ParserFrontEnd include ParserFrontEnd
is_impressionable :counter_cache => { :column_name => :view_count } is_impressionable #:counter_cache => { :column_name => :view_count }
field :content, localize: true field :content, localize: true
field :app_frontend_url field :app_frontend_url
+10
View File
@@ -55,6 +55,16 @@ class PrototypeAuth
if (self.send item).include? obj.id if (self.send item).include? obj.id
(self.send item).delete obj.id (self.send item).delete obj.id
self.save! self.save!
if auth_obj["_type"] == "PageContext"
module_app = ModuleApp.where(:key=>'page_content').first
else
module_app = auth_obj.module_app
end
module_app.remove_sub_manager(obj)
module_app.save
else else
false #should put error message for user not existed in list false #should put error message for user not existed in list
end end
+3 -1
View File
@@ -18,6 +18,7 @@ class Site
field :title_always_on, :type => Boolean, :default => false field :title_always_on, :type => Boolean, :default => false
field :dashbroad_allow_visitor, :type => Boolean, :default => false field :dashbroad_allow_visitor, :type => Boolean, :default => false
field :mail_settings, :type => Hash field :mail_settings, :type => Hash
field :visitor_counters,:type=> Hash,:default=>{:total=>0,:today=>0,:this_week=>0,:this_month=>0,:this_year=>0}
field :disk_space, :type => String field :disk_space, :type => String
field :system_package_info, :type => Hash,:default=>{} field :system_package_info, :type => Hash,:default=>{}
@@ -28,10 +29,11 @@ class Site
mount_uploader :default_image, ImageUploader mount_uploader :default_image, ImageUploader
field :search,:type => Hash field :search,:type => Hash
field :resque_namespace,:type => String, :default=>APP_CONFIG['orbit']
field :title, localize: true field :title, localize: true
field :footer, localize: true field :footer, localize: true
field :sub_menu, localize: true field :sub_menu, localize: true
field :backup_keep_for_days,:type=>Integer,:default=> APP_CONFIG['backup_keep_for_days']
field :mobile_on, :type => Boolean, :default => false field :mobile_on, :type => Boolean, :default => false
+1 -25
View File
@@ -8,7 +8,7 @@ class Tag
include Mongoid::Timestamps include Mongoid::Timestamps
include Impressionist::Impressionable include Impressionist::Impressionable
is_impressionable :counter_cache => { :column_name => :view_count } is_impressionable #:counter_cache => { :column_name => :view_count }
field :name, localize: true field :name, localize: true
field :view_count, :type => Integer, :default => 0 field :view_count, :type => Integer, :default => 0
@@ -17,30 +17,6 @@ class Tag
belongs_to :module_tag, polymorphic: true belongs_to :module_tag, polymorphic: true
has_many :taggings, dependent: :destroy has_many :taggings, dependent: :destroy
#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
protected protected
def self.get_impressionist(item_tag = self) def self.get_impressionist(item_tag = self)
+1 -1
View File
@@ -10,7 +10,7 @@ class Role < Attribute
field :title, localize: true field :title, localize: true
has_many :sub_roles, :autosave => true, :dependent => :destroy has_many :sub_roles, :autosave => true, :dependent => :destroy
has_many :users has_and_belongs_to_many :users
# has_many :statuses, :autosave => true, :dependent => :destroy # has_many :statuses, :autosave => true, :dependent => :destroy
# has_many :attribute_fields, :autosave => true, :dependent => :destroy # has_many :attribute_fields, :autosave => true, :dependent => :destroy
has_many :role_statuses, :autosave => true, :dependent => :destroy has_many :role_statuses, :autosave => true, :dependent => :destroy
+5 -10
View File
@@ -3,7 +3,7 @@ class User
include Mongoid::Document include Mongoid::Document
include Mongoid::Timestamps include Mongoid::Timestamps
devise :database_authenticatable, :recoverable, :rememberable, :trackable, :registerable, :validatable #, :timeoutable devise :database_authenticatable, :recoverable, :rememberable, :trackable, :validatable #, :timeoutable
mount_uploader :avatar, AvatarUploader mount_uploader :avatar, AvatarUploader
@@ -42,7 +42,6 @@ class User
before_create :initialize_desktop before_create :initialize_desktop
before_save :rebuild_status_record before_save :rebuild_status_record
before_save :save_roles
scope :remote_account, where(:nccu_id.ne => nil) scope :remote_account, where(:nccu_id.ne => nil)
scope :not_guest_user, all_of(:name.ne => "guest") scope :not_guest_user, all_of(:name.ne => "guest")
@@ -89,9 +88,9 @@ class User
var[:id].each do |id,val| var[:id].each do |id,val|
# binding.pry if id == '5052c5b22b5c49ab02000004' # binding.pry if id == '5052c5b22b5c49ab02000004'
if (val=="true") if (val=="true")
self.roles = self.roles.reject{|t| t.id.to_s==id} self.role_ids.reject!{|t| t.to_s == id}
elsif(val=="false") elsif(val=="false")
self.roles << Role.find(id) self.role_ids += Array(id)
end end
end end
end end
@@ -106,9 +105,9 @@ class User
# binding.pry if id == '5052c5b22b5c49ab02000004' # binding.pry if id == '5052c5b22b5c49ab02000004'
if ( self.roles.include?(@roid) == false or val=="true") if ( self.roles.include?(@roid) == false or val=="true")
self.sub_roles = self.sub_roles.reject{|t| t.id.to_s==id} self.sub_role_ids.reject!{|t| t.to_s == id}
elsif(val=="false") elsif(val=="false")
self.sub_roles << SubRole.find(id) self.sub_role_ids += Array(id)
end end
end end
@@ -273,10 +272,6 @@ class User
end end
protected protected
def save_roles
# self.roles = self.sub_roles.collect{|t| t.role}.uniq
self.roles = self.roles.uniq
end
def rebuild_status_record def rebuild_status_record
self.status_record = {} self.status_record = {}
-1
View File
@@ -8,6 +8,5 @@
</table> </table>
<div class="form-actions form-fixed pagination-right"> <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' %> <%= 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> </div>
@@ -0,0 +1,3 @@
<div class="filter-clear">
<%= link_to content_tag(:i, nil, :class => 'icons-cycle') + t(:clear), admin_mail_crons_path(:filter => @filter, :sort => params[:sort], :direction => params[:direction], :clear => true, :type => type), :class => "btn btn-small js_history" %>
</div>
@@ -0,0 +1,11 @@
<div id="filter" class="subnav">
<div class="filters">
<div id="sort_headers" class="table-label">
<%= render 'sort_headers' %>
</div>
</div>
</div>
<% content_for :page_specific_javascript do %>
<%= javascript_include_tag "sort_header" %>
<% end %>
@@ -0,0 +1,29 @@
<tr id="<%= dom_id mail_cron_log %>" class="with_action">
<td class="span1">
<% if is_manager? %>
<%= check_box_tag 'to_delete[]', mail_cron_log.id, false, :class => "checkbox_in_list" %>
<% end -%>
</td>
<td class="span1-2">
<%= mail_cron_log.mail_subject %>
<div class="quick-edit">
<ul class="nav nav-pills hide">
<%if at_least_module_manager %>
<li><%= link_to t(:delete_), admin_mail_cron_log_path(mail_cron_log), :confirm => t('sure?'), :method => :delete, :remote => true %></li>
<% end -%>
</ul>
</div>
</td>
<td class="span2">
<%= mail_cron_log.mail_to.gsub(/,/, "<br />").html_safe %>
</td>
<td class="span2">
<%= mail_cron_log.mail_user %>
</td>
<td class="span2">
<%= mail_cron_log.mail_from_app %>
</td>
<td class="span2">
<%= display_date_time(mail_cron_log.created_at) %>
</td>
</tr>
@@ -0,0 +1,6 @@
<%= render_sort_bar(true, delete_admin_mail_cron_logs_path(:direction => params[:direction], :sort => params[:sort], :sort_options => params[:sort_options]),
['subject', 'mail_subject','span2', :subject] ,
['mail_to', 'mail_to','span2', :mail_to] ,
['mail_user', 'mail_user','span2', :mail_user] ,
['mail_from_app', 'mail_from_app','span2', :mail_from_app] ,
['sentdate', 'created_at','span2', :sentdate] ).html_safe %>
@@ -0,0 +1 @@
$("#<%= dom_id @mail_cron_log %>").remove();
@@ -0,0 +1,28 @@
<% content_for :side_bar do %>
<%= render :partial => 'layouts/side_bar', :locals => {:link_name => t('site.settings'), :link_url => admin_site_site_info_path(@site), :icon => 'icons-cog', :side_bar_content => 'admin/sites/side_bar'} %>
<% end %>
<%= render 'filter' %>
<table class="table main-list">
<thead>
<tr>
<th class="span1"></th>
<th class="span2"></th>
<th class="span2"></th>
<th class="span2"></th>
<th class="span2"></th>
<th class="span2"></th>
</tr>
</thead>
<tbody id="tbody_mail_cron_logs" class="sort-holder">
<%= render :partial => "mail_cron_log",:collection=> @mail_cron_logs%>
</tbody>
</table>
<div class="form-actions form-fixed pagination-right">
<div id="web_link_pagination" class="paginationFixed">
<%= paginate @mail_cron_logs, :params => {:direction => params[:direction], :sort => params[:sort], :filter => @filter, :new_filter => nil} %>
</div>
</div>
@@ -0,0 +1,4 @@
$("#delete_all").attr("action", "<%= delete_admin_mail_cron_logs_path(:direction => params[:direction], :sort => params[:sort], :filter => @filter, :new_filter => nil, :sort_options => params[:sort_options]) %>");
$("#sort_headers").html("<%= j render 'sort_headers' %>");
$("#tbody_mail_cron_logs").html("<%= j render :partial => 'mail_cron_log', :collection => @mail_cron_logs %>");
$("#mail_cron_log_pagination").html("<%= j paginate @mail_cron_logs, :params => {:direction => params[:direction], :sort => params[:sort], :filter => @filter, :new_filter => nil} %>");
@@ -0,0 +1,3 @@
<div class="filter-clear">
<%= link_to content_tag(:i, nil, :class => 'icons-cycle') + t(:clear), admin_mail_crons_path(:filter => @filter, :sort => params[:sort], :direction => params[:direction], :clear => true, :type => type), :class => "btn btn-small js_history" %>
</div>
@@ -0,0 +1,11 @@
<div id="filter" class="subnav">
<div class="filters">
<div id="sort_headers" class="table-label">
<%= render 'sort_headers' %>
</div>
</div>
</div>
<% content_for :page_specific_javascript do %>
<%= javascript_include_tag "sort_header" %>
<% end %>
+122
View File
@@ -0,0 +1,122 @@
<div id= "poststuff">
<% # encoding: utf-8 %>
<%= f.error_messages %>
<!--Widget start-->
<div id="sub-wiget">
<div id="widget-date" class="widget-box widget-size-300">
<h3 class="widget-title"><i class="icons-calendar"></i><%= t(:date_) %></h3>
<div class="widget-content clear">
<div class="control-group">
<%= f.datetime_picker :mail_sentdate, :picker_type => 'separated', :label => t(:start) %>
</div>
</div>
</div>
</div>
<!--Wiget End-->
<!--Post Start-->
<div id="post-body">
<div id="post-body-content" class="clear">
<%= f.label :mail_subject ,t(:mail_subject)%>
<%= f.text_field :mail_subject %>
<%= f.label :mail_from ,t(:mail_from)%>
<%= f.text_field :mail_from %>
<%= f.label :mail_reply_to ,t(:mail_reply_to)%>
<%= f.text_field :mail_reply_to %>
<%= f.label :mail_to ,t(:mail_to)%>
<%= f.text_field :mail_to %>
<%= f.label :mail_content ,t(:mail_content)%>
<%= f.text_area :mail_content, :class=>"span12", :cols=>"25", :rows=>"10" %>
</div>
<div>
<div id='plugin_files' class="plugin_files_block">
<table class="table table-condensed">
<thead>
<tr>
<th>File</th>
<th>File Name</th>
<th class="span1"></th>
</tr>
</thead>
<tfoot>
<tr>
<td style="text-align:center" colspan="3">
<div id='add_plugin_file' class="info_input plugin_files_block">
<%= hidden_field_tag 'plugin_file_field_count', @mail_cron.mail_cron_files.count %>
<a class="add"><span class="btn btn-primary btn-small"><i class="icon-plus icon-white"></i> ADD/新增</span></a>
</div>
</td>
</tr>
</tfoot>
<tbody>
<% @mail_cron.mail_cron_files.each_with_index do |mail_cron_file, i| %>
<%= f.fields_for :mail_cron_files, mail_cron_file do |f| %>
<%= render :partial => 'form_file', :object => mail_cron_file, :locals => {:f => f, :i => i} %>
<% end %>
<% end %>
</tbody>
</table>
</div>
</div>
<!--Post End-->
</div>
<div class="form-actions">
<%= f.submit t('submit'), :class=>'btn btn-primary' %>
<%= link_to t('cancel'), get_go_back, :class=>"btn" %>
</div>
<% content_for :page_specific_javascript do %>
<%= javascript_include_tag "archive_plugin_form" %>
<script>
$('#add_plugin_file a.add').live('click', function(){
var new_id = $(this).prev().attr('value');
var old_id = new RegExp("new_add_plugin_files", "g");
$(this).prev().attr('value', parseInt(new_id) + 1);
$(this).parents('table').append(("<%= escape_javascript(add_attribute 'form_file', f, :mail_cron_files) %>").replace(old_id, new_id));
});
$('.add_plugin_files_block a.delete').live('click', function(){
$(this).parents('.list_item').remove();
});
$('.action a.remove_existing_record').live('click', function(){
$(this).next('.should_destroy').attr('value', 1);
$("tr#add_plugin_file_" + $(this).prev().attr('value')).hide();
});
</script>
<% end %>
</div>
@@ -0,0 +1,35 @@
<% # encoding: utf-8 %>
<tr id="<%= "plugin_file_#{form_file.id}" if !form_file.new_record? %>" class='list_item'>
<td>
<div class="control-group">
<div class="controls">
<%= f.file_field :file %>
<%= form_file.file.file ? ( link_to t(:view), form_file.file.url, {:class => 'btn', :target => '_blank', :title => t(:view)} ) : '' %>
</div>
</div>
</td>
<td>
<div class="tab-content">
<%= f.text_field :title %>
</div>
</td>
<td>
<span class="action">
<% if form_file.new_record? %>
<a class="delete"><i class="icon-remove"></i></a>
<% else %>
<%= f.hidden_field :id %>
<a class="remove_existing_record"><i class="icon-remove"></i></a>
<%= f.hidden_field :should_destroy, :value => nil, :class => 'should_destroy' %>
<% end %>
</span>
</td>
</tr>
@@ -0,0 +1,26 @@
<tr id="<%= dom_id mail_cron %>" class="with_action">
<td class="span1">
<% if is_manager? %>
<%= check_box_tag 'to_delete[]', mail_cron.id, false, :class => "checkbox_in_list" %>
<% end -%>
</td>
<td class="span1-2">
<%= mail_cron.mail_subject %>
<div class="quick-edit">
<ul class="nav nav-pills hide">
<%if at_least_module_manager %>
<li><%= link_to t(:delete_), admin_mail_cron_path(mail_cron), :confirm => t('sure?'), :method => :delete, :remote => true %></li>
<% end -%>
</ul>
</div>
</td>
<td class="span2">
<%= mail_cron.mail_to.gsub(/,/, "<br />").html_safe %>
</td>
<td class="span2">
<%= mail_cron.mail_from_app %>
</td>
<td class="span2">
<%= display_date_time(mail_cron.mail_sentdate) %>
</td>
</tr>
@@ -0,0 +1,5 @@
<%= render_sort_bar(true, delete_admin_mail_crons_path(:direction => params[:direction], :sort => params[:sort], :sort_options => params[:sort_options]),
['subject', 'mail_subject','span2', :mail_subject] ,
['mail_to', 'mail_to','span2', :mail_to] ,
['mail_from_app', 'mail_from_app','span2', :mail_from_app] ,
['sentdate', 'mail_sentdate','span2', :mail_sentdate] ).html_safe %>
@@ -0,0 +1 @@
$("#<%= dom_id @mail_cron %>").remove();
+9
View File
@@ -0,0 +1,9 @@
<% content_for :side_bar do %>
<%= render :partial => 'layouts/side_bar', :locals => {:link_name => t('site.settings'), :link_url => admin_site_site_info_path(@site), :icon => 'icons-cog', :side_bar_content => 'admin/sites/side_bar'} %>
<% end %>
<h1><%= t('mail_cron.editing_mail_cron') %></h1>
<%= form_for @mail_cron, :url => admin_mail_cron_path(@mail_cron), :html => {:class => 'clear'} do |f| %>
<%= render :partial => 'form', :locals => {:f => f} %>
<% end %>
+27
View File
@@ -0,0 +1,27 @@
<% content_for :side_bar do %>
<%= render :partial => 'layouts/side_bar', :locals => {:link_name => t('site.settings'), :link_url => admin_site_site_info_path(@site), :icon => 'icons-cog', :side_bar_content => 'admin/sites/side_bar'} %>
<% end %>
<%= render 'filter' %>
<table class="table main-list">
<thead>
<tr>
<th class="span1"></th>
<th class="span2"></th>
<th class="span2"></th>
<th class="span2"></th>
<th class="span2"></th>
</tr>
</thead>
<tbody id="tbody_mail_crons" class="sort-holder">
<%= render :partial => "mail_cron",:collection=> @mail_crons%>
</tbody>
</table>
<div class="form-actions form-fixed pagination-right">
<div id="web_link_pagination" class="paginationFixed">
<%= paginate @mail_crons, :params => {:direction => params[:direction], :sort => params[:sort], :filter => @filter, :new_filter => nil} %>
</div>
</div>
+4
View File
@@ -0,0 +1,4 @@
$("#delete_all").attr("action", "<%= delete_admin_mail_crons_path(:direction => params[:direction], :sort => params[:sort], :filter => @filter, :new_filter => nil, :sort_options => params[:sort_options]) %>");
$("#sort_headers").html("<%= j render 'sort_headers' %>");
$("#tbody_mail_crons").html("<%= j render :partial => 'mail_cron', :collection => @mail_crons %>");
$("#mail_cron_pagination").html("<%= j paginate @mail_crons, :params => {:direction => params[:direction], :sort => params[:sort], :filter => @filter, :new_filter => nil} %>");
+12
View File
@@ -0,0 +1,12 @@
<% content_for :side_bar do %>
<%= render :partial => 'layouts/side_bar', :locals => {:link_name => t('site.settings'), :link_url => admin_site_site_info_path(@site), :icon => 'icons-cog', :side_bar_content => 'admin/sites/side_bar'} %>
<% end %>
<div id="poststuff">
<h1><%= t('mail_cron.new_mail_cron') %></h1>
<%= form_for @mail_cron, :url => admin_mail_crons_path, :html => {:class => 'clear'} do |f| %>
<%= render :partial => 'form', :locals => {:f => f} %>
<% end %>
</div>
@@ -0,0 +1,86 @@
<div id="select_user_modal" class="modal hide fade">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h3><%= t('list.user') %></h3>
</div>
<div class="modal-body">
<div class="tabbable tabs-left">
<div class="nano">
<div class="content">
<ul class="nav nav-tabs">
<li class="active"><a href="#all" data-toggle="tab"><%= t('list.role') %></a></li>
<% @sorted_users.each_key do |role| %>
<li class=""><a href="#r_<%= role.id %>" data-toggle="tab"><%= role.title %></a></li>
<% end %>
</ul>
</div>
</div>
<div class="tab-content">
<div class="tab-pane fade in active" id="all">
<%= form_tag set_roles_admin_member_selects_path(field: @field), remote: true do %>
<fieldset>
<% @sorted_users.each_key do |role| %>
<label class="checkbox inline">
<%= check_box_tag 'role_ids[]', role.id , false %> <%= role.title %>
</label>
<% end %>
</fieldset>
<div class="form-actions">
<button type="button" class="btn" data-dismiss="modal"><%= t(:cancel) %></button>
<%= submit_tag t(:submit), class: "btn btn-primary" %>
</div>
<% end %>
</div>
<% @sorted_users.each do |role, users| %>
<div class="tab-pane fade" id="r_<%= role.id %>">
<%= form_tag set_users_admin_member_selects_path(field: @field), remote: true do %>
<fieldset class="clearfix">
<div class="member-filter-result nano">
<div class="content">
<ul class="checkbox-card clearfix">
<% users.each do |user| %>
<li>
<label>
<%= image_tag (user.avatar.file ? user.avatar : "menber-pic.png"), class: "user-pic" %>
<span class="user-name"><%= user.name %></span>
</label>
<%= check_box_tag 'user_ids[]', user.id , false %>
</li>
<% end %>
</ul>
</div>
</div>
<div class="form-actions condition">
<button type="button" class="btn" data-dismiss="modal"><%= t(:cancel) %></button>
<%= submit_tag t(:submit), class: "btn btn-primary" %>
</div>
</fieldset>
<% end %>
</div>
<% end %>
</div>
</div>
</div>
</div>
<script type="text/javascript">
$(document).ready(function() {
$(".modal").on("hidden", function () {
$("#select_user").remove();
$('#select_user_modal').on('shown', function() {
$(this).find('.nano').nanoScroller({ scrollTop: 0, iOSNativeScrolling: true });
$(this).find('.checkbox-card > li').cardCheck({
check: $(this).find('.checkbox-card > li input[type="checkbox"]'),
});
});
});
$('#select_user_modal').on('shown', function() {
$('#select_user_modal').off('shown')
$(this).find('.nano').nanoScroller({ scrollTop: 0, iOSNativeScrolling: true });
$(this).find('.checkbox-card > li').cardCheck({
check: $(this).find('.checkbox-card > li input[type="checkbox"]'),
});
});
});
</script>
@@ -0,0 +1,14 @@
<% unless users.blank? %>
<div class="promoter-block">
<p class="promoter-title"><%= t(:promoter) %>:</p>
<ul>
<% users.each do |user| %>
<li class="promoter">
<p>
<%= link_to user.name, "mailto:#{user.email}", class: "promoter-name" %> / <span class="promoter-phone"><%= user.office_tel %></span>
</p>
</li>
<% end %>
</ul>
</div>
<% end %>
@@ -0,0 +1,16 @@
<% content_for :page_specific_javascript do -%>
<%= javascript_include_tag "member-selection" %>
<%= javascript_include_tag "lib/jquery.nanoscroller" %>
<%= javascript_include_tag "lib/checkbox.card" %>
<% end -%>
<% content_for :page_specific_css do -%>
<%= stylesheet_link_tag "member_select" %>
<% end %>
<div>
<div id="selected_users">
<%= render partial: 'admin/member_selects/user', collection: users, locals: {field: field} %>
<%= hidden_field_tag field %>
</div>
<%= link_to t(:add), '#', class: 'btn btn-primary btn-small select_user_modal', rel: select_members_admin_member_selects_path, field: field %>
</div>
@@ -0,0 +1,5 @@
<span class="alert alert-info selected_user" user_id="<%= user.id %>">
<%= user.name %>
<%= hidden_field_tag field, user.id %>
<%= content_tag :span, '×', class: 'close remove_user' %>
</span>
@@ -0,0 +1,2 @@
$("#select_user").html("<%= j render partial: 'admin/member_selects/modal_select', locals: {field: 'bulletin[user_ids][]'} %>");
$("#select_user_modal").modal();
@@ -0,0 +1,2 @@
$("#selected_users").append("<%= j render partial: 'user', collection: @users, locals: {field: @field} %>");
$("#select_user_modal").modal('hide');
@@ -17,4 +17,4 @@
<%= render :partial=> "widget_ext_options" %> <%= render :partial=> "widget_ext_options" %>
</div> </div>
</div> </div>
<% end %> <% end %>
+2
View File
@@ -9,6 +9,8 @@
<%#= content_tag :li, link_to(t(:theme), admin_site_ui_theme_path(@site)), :class => active_for_action('sites', 'ui_theme') %> <%#= content_tag :li, link_to(t(:theme), admin_site_ui_theme_path(@site)), :class => active_for_action('sites', 'ui_theme') %>
<%= content_tag :li, link_to(t('sitemap'), admin_site_sitemap_path(@site)), :class => active_for_action('sites', 'sitemap') %> <%= content_tag :li, link_to(t('sitemap'), admin_site_sitemap_path(@site)), :class => active_for_action('sites', 'sitemap') %>
<%= content_tag :li, link_to(t('user_actions'), admin_user_actions_path), :class => active_for_action('user_actions', 'index') %> <%= content_tag :li, link_to(t('user_actions'), admin_user_actions_path), :class => active_for_action('user_actions', 'index') %>
<%= content_tag :li, link_to(t('mail.mail_cron'), admin_mail_crons_path), :class => active_for_action('mail_cron', 'index') %>
<%= content_tag :li, link_to(t('mail.mail_cron_log'), admin_mail_cron_logs_path), :class => active_for_action('mail_cron_log', 'index') %>
<% end -%> <% end -%>
<% end -%> <% end -%>
+16 -13
View File
@@ -1,19 +1,22 @@
<%= content_tag :div,:class=>@tag_class do%> <%= content_tag :div, class: @tag_class do %>
<div class="default_widget_type_A"> <div class="default_widget_type_A">
<table class="default_widget_tb" border="0" cellpadding="0" cellspacing="0" > <table class="default_widget_tb" border="0" cellpadding="0" cellspacing="0" >
<thead> <thead>
<tr>
<% @frontend_field_names.each_with_index do |field,index|%>
<%= content_tag(:th,content_tag(:span,get_field_header(field),:class=>@frontend_classes[index]))unless field.blank?%>
<% end %>
</tr>
</thead>
<% @data.each do |row_data| %>
<tr> <tr>
<% @frontend_field_names.each_with_index do |field,index|%> <% @frontend_field_names.each_with_index do |field, index| %>
<%= content_tag(:td,content_tag(:span,link_to_field(row_data,field, @frontend_sat_to_links[index], {orig_page: @page_id.to_s}),:class=>@frontend_classes[index]))unless field.blank?%> <%= content_tag(:th, content_tag(:span, get_field_header(field), class: @frontend_classes[index])) unless field.blank? %>
<% end %> <% end %>
</tr> </tr>
<% end %> </thead>
<tbody>
<% @data.each do |row_data| %>
<tr class="<%= get_top_hot_class(row_data) %>">
<% @frontend_field_names.each_with_index do |field, index|%>
<%= content_tag(:td, content_tag(:span, link_to_field(row_data, field, @frontend_sat_to_links[index], {orig_page: @page_id.to_s, category_id: get_row_category(row_data), tag_id: get_row_tags(row_data)}), class: @frontend_classes[index])) unless field.blank? %>
<% end %>
</tr>
<% end %>
</tbody>
</table> </table>
<% end %> </div>
<% end %>
+5 -5
View File
@@ -1,13 +1,13 @@
<%= content_tag :div,:class=>@tag_class do%> <%= content_tag :div, class: @tag_class do %>
<ul class="default_widget_list"> <ul class="default_widget_list">
<% @data.each do |row_data| %> <% @data.each do |row_data| %>
<%= content_tag(:li) do %> <%= content_tag(:li, class: get_top_hot_class(row_data)) do %>
<div class="img app-pic"> <div class="img app-pic">
<%= image_tag row_data.send(@widget_image_field)%> <%= image_tag row_data.send(@widget_image_field) %>
</div> </div>
<div class="wrap"> <div class="wrap">
<% @frontend_field_names.each_with_index do |field,index|%> <% @frontend_field_names.each_with_index do |field, index| %>
<%= content_tag(:span,link_to_field(row_data,field, @frontend_sat_to_links[index], {orig_page: @page_id.to_s}),:class=>@frontend_classes[index]) unless field.blank?%> <%= content_tag(:span, link_to_field(row_data,field, @frontend_sat_to_links[index], {orig_page: @page_id.to_s, category_id: get_row_category(row_data), tag_id: get_row_tags(row_data)}), class: @frontend_classes[index]) unless field.blank? %>
<% end %> <% end %>
</div> </div>
<% end %> <% end %>
+5 -5
View File
@@ -1,12 +1,12 @@
<%= content_tag :div,:class=>@tag_class do%> <%= content_tag :div, class: @tag_class do %>
<div class="img app-pic"> <div class="img app-pic">
<%= image_tag @data.first.send(@widget_image_field)%> <%= image_tag @data.first.send(@widget_image_field) %>
</div> </div>
<ul class="default_widget_list"> <ul class="default_widget_list">
<% @data.each do |row_data| %> <% @data.each do |row_data| %>
<%= content_tag(:li) do %> <%= content_tag(:li, class: get_top_hot_class(row_data)) do %>
<% @frontend_field_names.each_with_index do |field,index|%> <% @frontend_field_names.each_with_index do |field, index|%>
<%= content_tag(:span, link_to_field(row_data,field, @frontend_sat_to_links[index], {orig_page: @page_id.to_s}),:class=>@frontend_classes[index]) unless field.blank?%> <%= content_tag(:span, link_to_field(row_data, field, @frontend_sat_to_links[index], {orig_page: @page_id.to_s, category_id: get_row_category(row_data), tag_id: get_row_tags(row_data)}), class: @frontend_classes[index]) unless field.blank? %>
<% end %> <% end %>
<% end %> <% end %>
<% end %> <% end %>
+7 -2
View File
@@ -9,15 +9,20 @@
<%= content_tag :span, msg, :class => [key, "notice label label-warning"] %> <%= content_tag :span, msg, :class => [key, "notice label label-warning"] %>
<% end %> <% end %>
<p class="alert hide">You need to sign in or sign up before continuing.</p> <p class="alert hide">You need to sign in or sign up before continuing.</p>
<% @request_hosts = request.host_with_port.split(".") %>
<a href="https://adfs.ntu.edu.tw/adfs/ls/?wa=wsignin1.0&wtrealm=https://galogin.ntu.edu.tw/saml_login&wctx=<%= @request_hosts[0] %>" class="btn btn-primary" style="width: 310px;margin-top: 10px;">使用計中帳號登入</a>
<p style="margin: 40px 0 20px; position: relative; border-bottom: 1px solid #DDD;">
<span style="position: absolute; width: 140px; left: 50%; margin-left: -70px; font-size: 14px; top: -9px; background-color: #fff; text-align: center;">或使用本站帳號登入</span>
</p>
<div class="main"> <div class="main">
<div class="control-group clear"> <div class="control-group clear">
<%= f.label :user_id ,t("users.user_id")%> <%= f.label :user_id ,t("users.user_id")%>
<%= f.text_field :user_id, :placeholder => t("users.user_id"), :style => "width: 330px;" %> <%= f.text_field :user_id, :placeholder => t("users.user_id"), :style => "width: 326px;" %>
<span class="help-inline">Please correct the error</span> <span class="help-inline">Please correct the error</span>
</div> </div>
<div class="control-group clear"> <div class="control-group clear">
<%= f.label :password,t("password") %> <%= f.label :password,t("password") %>
<%= f.password_field :password, :placeholder => t(:dots), :style => "width: 330px;" %> <%= f.password_field :password, :placeholder => t(:dots), :style => "width: 326px;" %>
<span class="help-inline">Please correct the error</span> <span class="help-inline">Please correct the error</span>
<%= link_to t(:forgot_password), new_user_password_path, :class => 'pull-right forgot hide' %> <%= link_to t(:forgot_password), new_user_password_path, :class => 'pull-right forgot hide' %>
</div> </div>
+21 -13
View File
@@ -10,19 +10,10 @@
</div> </div>
<ul class="nav"> <ul class="nav">
<li><a href="<%= root_path %>" data-icons="&#xe022;"></a></li> <li><a href="<%= root_path %>" data-icons="&#xe022;"></a></li>
<li><a href="<%= desktop_path %>" data-icons="&#xe060;"></a></li> <!-- <li><a href="<%#= desktop_path %>" data-icons="&#xe060;"></a></li> -->
</ul> </ul>
<ul class="nav pull-right"> <ul class="nav pull-right">
<!--
<li class="dropdown">
<a class="dropdown-toggle" data-icons="&#xe02d;" href="#" data-toggle="dropdown"></a>
<ul class="dropdown-menu">
<% #t('ntu.site_names').each do |site| %>
<li><%#= link_to site[1], get_link(site[0]) %></li>
<%# end %>
</ul>
</li>
-->
<li class="search clear" title="<%= t :search_google %>"> <li class="search clear" title="<%= t :search_google %>">
<a class="orbit-bar-search" href="#" data-icons="&#xe024;"></a> <a class="orbit-bar-search" href="#" data-icons="&#xe024;"></a>
<form class="navbar-search" method="get" action="http://www.google.com/custom"> <form class="navbar-search" method="get" action="http://www.google.com/custom">
@@ -34,6 +25,17 @@
<input type='hidden' name='sitesearch' value='<%= @site.search["sitesearch"] rescue '' %>'> <input type='hidden' name='sitesearch' value='<%= @site.search["sitesearch"] rescue '' %>'>
<%= text_field_tag 'q','',{:class => "search-query span3",:placeholder=> t(:search_google) ,:disabled=> ((@site.search["sitesearch"] || @site.search["domains"] ).blank? rescue true)}%> <%= text_field_tag 'q','',{:class => "search-query span3",:placeholder=> t(:search_google) ,:disabled=> ((@site.search["sitesearch"] || @site.search["domains"] ).blank? rescue true)}%>
</form> </form>
<li class="dropdown language">
<a class="dropdown-toggle orbit-bar-language" data-icons="&#xe02d;" href="#" data-toggle="dropdown"></a>
<ul class="dropdown-menu language-menu">
<% t('ntu.site_names').each do |site| %>
<li><%= link_to site[1], get_link(site[0]) %></li>
<% end %>
</ul>
</li>
</li> </li>
<li class="dropdown language"> <li class="dropdown language">
<a class="dropdown-toggle orbit-bar-language" href="#" data-toggle="dropdown" data-icons="&#xe054;"></a> <a class="dropdown-toggle orbit-bar-language" href="#" data-toggle="dropdown" data-icons="&#xe054;"></a>
@@ -53,7 +55,7 @@
<ul class="dropdown-menu account-menu"> <ul class="dropdown-menu account-menu">
<!-- <li><%= link_to content_tag(:i, nil, :class => 'icons-tools') + ' ' + t(:account_setting), desktop_path+"#settings-account" %></li> --> <!-- <li><%= link_to content_tag(:i, nil, :class => 'icons-tools') + ' ' + t(:account_setting), desktop_path+"#settings-account" %></li> -->
<!-- <li><%= link_to content_tag(:i, nil, :class => 'icons-screen') + ' ' + t(:desktop), desktop_path %></li> --> <!-- <li><%= link_to content_tag(:i, nil, :class => 'icons-screen') + ' ' + t(:desktop), desktop_path %></li> -->
<li><%= link_to content_tag(:i, nil, :class => 'icons-logout') + ' ' + t(:logout), destroy_user_session_path %></li> <li><%= link_to content_tag(:i, nil, :class => 'icons-logout') + ' ' + t(:logout), user_logout_path %></li>
<li class="divider"></li> <li class="divider"></li>
<li> <li>
<a href="#"> <a href="#">
@@ -68,7 +70,13 @@
<a class="dropdown-toggle orbit-bar-member" href="#" data-icons="&#xe076;"></a> <a class="dropdown-toggle orbit-bar-member" href="#" data-icons="&#xe076;"></a>
<div class="dropdown-menu"> <div class="dropdown-menu">
<ul class="log"> <ul class="log">
<li class="title hide"></li> <li style="margin-top: 30px;">
<% @request_hosts = request.host_with_port.split(".") %>
<a class="btn btn-primary" href="https://adfs.ntu.edu.tw/adfs/ls/?wa=wsignin1.0&wtrealm=https://galogin.ntu.edu.tw/saml_login&wctx=<%= @request_hosts[0] %>" style="padding: 3px 0;color: #fff;">使用計中帳號登入</a>
</li>
<li class="divider" style="margin: 40px 0 0;">
<span style="width: 140px;left: 50%;margin-left: -70px;font-size: 14px;">或使用本站帳號登入</span>
</li>
<%= form_for :user, :url => user_session_path do |f| %> <%= form_for :user, :url => user_session_path do |f| %>
<li> <li>
+1 -1
View File
@@ -3,7 +3,7 @@
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><%= @title || APP_CONFIG['orbit'] %></title> <title><%= @title || APP_CONFIG['orbit'] %></title>
<link rel="shortcut icon" href="<%= asset_path "ncculogo.ico" %>"> <link rel="shortcut icon" href="<%= asset_path "favicon.ico" %>">
<%= yield :page_specific_link %> <%= yield :page_specific_link %>
<%= stylesheet_link_tag "new_admin" %> <%= stylesheet_link_tag "new_admin" %>
<%= javascript_include_tag "new_admin" %> <%= javascript_include_tag "new_admin" %>
+1 -1
View File
@@ -3,7 +3,7 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<title><%= @title || APP_CONFIG['orbit'] %></title> <title><%= @title || APP_CONFIG['orbit'] %></title>
<link rel="shortcut icon" href="<%= asset_path "ncculogo.ico" %>"> <link rel="shortcut icon" href="<%= asset_path "favicon.ico" %>">
<!--[if lt IE 9]> <!--[if lt IE 9]>
<%= javascript_include_tag "html5" %> <%= javascript_include_tag "html5" %>
<![endif]--> <![endif]-->
+14 -1
View File
@@ -1,9 +1,22 @@
<!DOCTYPE HTML> <!DOCTYPE HTML>
<html class="<%= I18n.locale.to_s %>"> <html class="<%= I18n.locale.to_s %>">
<head> <head>
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-36964512-1']);
_gaq.push(['_setDomainName', 'ga.ntu.edu.tw']);
_gaq.push(['_setAllowLinker', true]);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
<meta charset="utf-8"> <meta charset="utf-8">
<%= page_title(@item).html_safe %> <%= page_title(@item).html_safe %>
<link rel="shortcut icon" href="<%= asset_path "ncculogo.ico" %>"> <link rel="shortcut icon" href="<%= asset_path "favicon.ico" %>">
<%= page_metas(@item).html_safe %> <%= page_metas(@item).html_safe %>
<!--[if lt IE 9]> <!--[if lt IE 9]>
<%= javascript_include_tag "html5" %> <%= javascript_include_tag "html5" %>
+1 -1
View File
@@ -3,7 +3,7 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<%= page_title(@item).html_safe %> <%= page_title(@item).html_safe %>
<link rel="shortcut icon" href="<%= asset_path "ncculogo.ico" %>"> <link rel="shortcut icon" href="<%= asset_path "favicon.ico" %>">
<%= page_metas(@item).html_safe %> <%= page_metas(@item).html_safe %>
<!--[if lt IE 9]> <!--[if lt IE 9]>
<%= javascript_include_tag "html5" %> <%= javascript_include_tag "html5" %>
+3 -5
View File
@@ -3,9 +3,7 @@
<% end %> <% end %>
<ul> <ul>
<li>總機電話:<a href="tel:+886229393091">02-29393091</a></li> <li>總務處電話:<a href="tel:+886229393091">02-29393091</a></li>
<li>傳真:02-29379611</li> <li>總務處傳真:02-29379611</li>
<li>緊急重大事件通聯窗口:校內分機 66119、66110</li> <li>總務處單一窗口 李梅森專員:<a href="tel:+886233662233">02-33662233</a></li>
<li>總值日室:<a href="tel:+88229387132">02-29387132</a></li>
<li>駐警衛室:<a href="tel:+88229387129">02-29387129</a></li>
</ul> </ul>
+1 -1
View File
@@ -5,6 +5,6 @@
<div id='map_canvas'></div> <div id='map_canvas'></div>
<script type='text/javascript'> <script type='text/javascript'>
var $map_center = "24.987449, 121.576117" var $map_center = "25.015205, 121.535491"
var $map_zoom = 17 var $map_zoom = 17
</script> </script>
+1
View File
@@ -3,6 +3,7 @@ defaults: &defaults
store_ip: 'redmine.rulingcom.com:3001' store_ip: 'redmine.rulingcom.com:3001'
orbit: 'Orbit' orbit: 'Orbit'
ruling_digital: 'RulingDigital' ruling_digital: 'RulingDigital'
backup_keep_for_days: 30
development: development:
<<: *defaults <<: *defaults
+1 -1
View File
@@ -3,7 +3,7 @@ require 'resque_scheduler/server'
# require 'yaml' # require 'yaml'
Resque.redis = 'localhost:6379' Resque.redis = 'localhost:6379'
Resque.redis.namespace = "resque" Resque.redis.namespace = Site.first.resque_namespace rescue APP_CONFIG['orbit']
# If you want to be able to dynamically change the schedule, # If you want to be able to dynamically change the schedule,
# uncomment this line. A dynamic schedule can be updated via the # uncomment this line. A dynamic schedule can be updated via the
+3
View File
@@ -272,6 +272,8 @@ en:
setting: Mail settings setting: Mail settings
tls: TLS tls: TLS
user_name: User Name user_name: User Name
mail_cron: Scheduled Email
mail_cron_log: Email Log
manager: Manager manager: Manager
markup: Markup markup: Markup
markup_options: Markup options markup_options: Markup options
@@ -333,6 +335,7 @@ en:
posted_by: Posted by posted_by: Posted by
preview: Preview preview: Preview
profile: Profile profile: Profile
promoter: Promoter
publications: Publications publications: Publications
purchase: Purchase purchase: Purchase
quantity: Quantity quantity: Quantity
+1 -1
View File
@@ -9,5 +9,5 @@ en:
home: Home home: Home
language: Language language: Language
location: Location location: Location
location_description: '<h3>This University</h3>No.101,Sec. 2, Jiafeng S Road, Zhubei City, Hsinchu County 302, Taiwan' location_description: '<h3>OFFICE OF GENERAL AFFAIRS, NTU</h3>No. 1, Sec. 4, Roosevelt Road, Taipei, 10617 Taiwan (R.O.C)'
page: Page page: Page
+1 -1
View File
@@ -9,5 +9,5 @@ zh_tw:
home: 首頁 home: 首頁
language: 語言 language: 語言
location: 地理位置 location: 地理位置
location_description: '<h3>本大學</h3>302新竹縣竹北市嘉豐南路二段101號' location_description: '<h3>臺灣大學總務處 版權所有</h3>10617 臺北市大安區羅斯福路四段一號'
page: 頁面 page: 頁面
+17
View File
@@ -0,0 +1,17 @@
en:
ntu:
rss_origin: Back to NTU Announcements
site_names:
"www": "Dean of General Affairs"
"sec": "Office of the Dean and Secretariat"
"doc": "Documentation Division"
"general": "General Service Division"
"property": "Property Management Division"
"construction": "Construction and Maintenance Division"
"cashier": "Cashier Division"
"procurement": "Procurement Division"
"fss": "Facilities Service Division"
"police": "Campus Security"
"social": "General Affairs Division, College of Social Science"
"medicine": "General Service Division, College of Medicine"
+17
View File
@@ -0,0 +1,17 @@
zh_tw:
ntu:
rss_origin: 回臺大校園公佈欄
site_names:
"www": "總務處"
"sec": "總務長室暨總務處秘書室"
"doc": "文書組"
"general": "事務組"
"property": "保管組"
"construction": "營繕組"
"cashier": "出納組"
"procurement": "採購組"
"fss": "經營管理組"
"police": "駐警隊"
"social": "社科院總務分處"
"medicine": "醫學院總務分處"
+3
View File
@@ -272,6 +272,8 @@ zh_tw:
setting: 電子郵件設定 setting: 電子郵件設定
tls: 電子郵件TLS tls: 電子郵件TLS
user_name: 電子郵件帳號 user_name: 電子郵件帳號
mail_cron: 待寄Email
mail_cron_log: Email發送記錄
manager: 管理者 manager: 管理者
markup: 輸入模式 markup: 輸入模式
markup_options: 標註選項 markup_options: 標註選項
@@ -334,6 +336,7 @@ zh_tw:
posted_by: 張貼人 posted_by: 張貼人
preview: 預覽 preview: 預覽
profile: 基本資料 profile: 基本資料
promoter: 承辦人
publications: 著作 publications: 著作
purchase: 購買 purchase: 購買
quantity: 數量 quantity: 數量
+2 -3
View File
@@ -8,11 +8,10 @@ defaults: &defaults
development: development:
<<: *defaults <<: *defaults
database: demo_site_development database: test_site
test: test:
<<: *defaults <<: *defaults
database: test_site database: test_site
# set these environment variables on your prod server # set these environment variables on your prod server
production: production:
# host: <%= ENV['MONGOID_HOST'] %> # host: <%= ENV['MONGOID_HOST'] %>
@@ -21,4 +20,4 @@ production:
# password: <%= ENV['MONGOID_PASSWORD'] %> # password: <%= ENV['MONGOID_PASSWORD'] %>
# database: <%= ENV['MONGOID_DATABASE'] %> # database: <%= ENV['MONGOID_DATABASE'] %>
<<: *defaults <<: *defaults
database: demo_site_production database: production_8
+26 -2
View File
@@ -1,5 +1,17 @@
dashboard_counter_cache:
cron: 0 * * * * *
class: DashboardCounter
args:
description: DashboardCounterCache
backup_server:
cron: 0 0 2 * * *
class: BackupServer
args:
description: BackupServer and remove old backups
update_tag_cloud: update_tag_cloud:
cron: 0 0 [0,12] * * * cron: 0 30 2 * * *
class: UpdateTagCloud class: UpdateTagCloud
args: args:
description: UpdateTagCloud description: UpdateTagCloud
@@ -8,4 +20,16 @@ generate_system_summary:
cron: 0 0 12 * * * cron: 0 0 12 * * *
class: GenerateSystemSummary class: GenerateSystemSummary
args: args:
description: Generate the system status such as disk free space,package version list for showing at site tab description: Generate the system status such as disk free space,package version list for showing at site tab
email_cron:
cron: 0 0 [10,16,22] * * *
class: EmailCron
args:
description: EmailCron
get_announcement_from_rss:
cron: 0 0 [2,12] * * *
class: GetAnnouncementFromRss
args:
description: Loop through the announcement RSS until 24h ago
+25
View File
@@ -7,6 +7,13 @@ Orbit::Application.routes.draw do
match "/users_passwd" => "desktop/registrations#update", :as => :users_passwd, :via => :put match "/users_passwd" => "desktop/registrations#update", :as => :users_passwd, :via => :put
end end
devise_scope :user do
get 'user_login' => 'sessions#create'
match 'user_logout' => 'sessions#destroy'
end
match "saml_login" => 'saml_logins#index'
mount Resque::Server, :at => "/admin/resque" mount Resque::Server, :at => "/admin/resque"
mount Rack::GridFS::Endpoint.new(:db => Mongoid.database,:lookup=>:path), :at => "gridfs" mount Rack::GridFS::Endpoint.new(:db => Mongoid.database,:lookup=>:path), :at => "gridfs"
@@ -29,6 +36,19 @@ Orbit::Application.routes.draw do
get 'delete' get 'delete'
end end
end end
resources :mail_crons do
collection do
get 'delete'
end
end
resources :mail_cron_logs do
collection do
get 'delete'
end
end
resources :asset_categories resources :asset_categories
resources :asset_tags resources :asset_tags
resources :app_auths resources :app_auths
@@ -175,6 +195,11 @@ Orbit::Application.routes.draw do
resources :member_selects do resources :member_selects do
match 'member_select_search' => "member_selects#member_select_search" ,:as => :member_select_search,:via => "post" match 'member_select_search' => "member_selects#member_select_search" ,:as => :member_select_search,:via => "post"
match 'member_select_add' => "member_selects#member_select_add" ,:as => :member_select_add,:via => "post" match 'member_select_add' => "member_selects#member_select_add" ,:as => :member_select_add,:via => "post"
collection do
get 'select_members'
post 'set_roles'
post 'set_users'
end
end end
match 'module_store' => 'module_store#index' match 'module_store' => 'module_store#index'
+18
View File
@@ -0,0 +1,18 @@
class DelayImpressionistRequest
attr_accessor :session_options,:remote_ip,:referer,:user_agent
def initialize(request=nil)
if request
self.session_options=request.session_options
self.remote_ip=request.remote_ip
self.referer=request.referer
self.user_agent=request.user_agent
end
end
def restore(args)
args.each do |key,value|
self.send("#{key}=", value)
end
end
end
+144
View File
@@ -0,0 +1,144 @@
# encoding : utf-8
# Usage ===============
#
# ARGV[0] = folder path of xml files
# ARGV[1] = folder path of files
#
#======================
require 'mongo'
require 'nokogiri'
include Mongo
CSV_PATH = ARGV[0]
FILE_PATH = ARGV[1]
FIELDS = %w[title file createdate modifydate createuser modifyuser]
DB_BASE_NAME = "production"
TABLE = {
"0" => ["gaTaco", "ntuga"],
"1" => ["fdLai", "fdhome"],
"5" => ["prLin", "property01"],
"3" => ["gsTien", "ckh", "general01", "lynn"],
"10" => ["cmChen", "construction01", "allen", "enAmeliaxu", "energy"],
# "2" => ["caLin", "cashier01"],
"6" => ["pcAmyok", "purchasing01", "purchasing02"],
"7" => ["fmHsyu", "ntufss"],
"4" => ["soChang", "social01"],
"8" => ["meJune", "medicine01"],
"9" => ["plKoa", "police"]
}
which_site = {}
data = []
Dir.foreach(ARGV[0]) do |file|
if file =~ /\w\.\w/
doc = Nokogiri::XML(File.open(File.join(ARGV[0], file)))
doc.xpath("//row").each { |row|
xml_fields = row.children.map{ |row| [row.name, row.content] }
fields = FIELDS.inject([]) do |fields, field|
xml_fields.each do |xf|
if xf[0].include?(field)
fields << xf[1]
break
end
end
fields
end
data << fields + [File.basename(file, '.xml')]
}
data.each do |d|
title, file, c_time, m_time, creator, modifier, category = d
if file =~ /\w\.\w/
file = File.join(File.join(ARGV[1], file))
site = ""
TABLE.each do |key, value|
if value.include? modifier
site = key
break
elsif value.include? creator
site = key
break
end
end
site = "0" if site.empty?
if which_site[site]
if which_site[site][category]
which_site[site][category] += [[title, file, c_time, m_time]]
else
which_site[site][category] = [[title, file, c_time, m_time]]
end
else
which_site[site] = {category => [[title, file, c_time, m_time]]}
end
end
end
end
end
def save_category archive_file_category, in_category
category = {
title: {"zh_tw" => in_category, "en" => in_category},
key: "import_#{category}"
}
archive_file_category.save(category)
end
def save_file_multiples archive_file_multiples, grid ,archive_id,title, file, c_time, m_time
a_file = File.open(file) rescue nil
if a_file
filename = File.basename(file)
archive_file = {
file_title: {"zh_tw" => title, "en" => title },
choose_lang: ["zh_tw", "en"],
file: filename,
archive_file_id: archive_id,
created_at: c_time,
updated_at: m_time
}
a_file_id = archive_file_multiples.save(archive_file)
grid.put(a_file, filename: "assets/archive_file_multiple/file/#{a_file_id}/#{filename}")
end
end
def save_archive archive_files, category_id
archive = {
title: {"zh_tw" => " ", "en" => " "},
archive_file_category_id: category_id,
is_top: false,
is_hot: false,
is_hidden: false,
created_at: c_time,
updated_at: m_time
}
archive_files.save(archive)
end
which_site.each do |site, categories|
db = MongoClient.new("localhost", 27017).db("#{DB_BASE_NAME}_#{site}")
categories.each do |category, data|
archive_file_category = db.collection('archive_file_categories')
category_id = save_category archive_file_category, category
archive_files = db.collection('archive_files')
archive_id = save_archive archive_files, category_id
grid = Grid.new(db)
archive_file_multiples = db.collection('archive_file_multiples')
file_ids = []
data.each do |file|
save_file_multiples(archive_file_multiples, grid ,archive_id , *file)
end
end
end
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
Loaded 100 of 396 files, more files were not shown because too many files have changed in this diff. Show more