finish the first version of patch_file
This commit is contained in:
commit
a2d46ca121
398 files changed
+12910
No files matched your search
@@ -0,0 +1,821 @@
|
||||
class Admin::MembersController < OrbitMemberController
|
||||
before_action :show_member_profile, only: [:show, :edit, :update, :edit_passwd, :edit_privilege]
|
||||
before_action :check_password_reset
|
||||
|
||||
helper MemberHelper
|
||||
helper OrbitBackendHelper
|
||||
|
||||
require 'spreadsheet'
|
||||
require 'rubyXL'
|
||||
|
||||
def index
|
||||
@roles = Role.excludes(disabled: true)
|
||||
@member_tags = MemberTag.all
|
||||
page_num = params[:page] || 1
|
||||
param_temp = request.fullpath.split("?")
|
||||
@edit_params = (param_temp.count > 1 ? "?" + param_temp.last : "") rescue ""
|
||||
|
||||
@filter = params[:filter]
|
||||
@mq = params[:mq]
|
||||
@new_filter = params[:new_filter]
|
||||
|
||||
if @filter && params[:clear]
|
||||
@filter.delete(params[:type])
|
||||
elsif @filter && @new_filter
|
||||
if @filter.has_key?(@new_filter[:type]) && @filter[@new_filter[:type]].include?(@new_filter[:id].to_s)
|
||||
@filter[@new_filter[:type]].delete(@new_filter[:id].to_s)
|
||||
elsif @filter.has_key?(@new_filter[:type])
|
||||
@filter[@new_filter[:type]] << @new_filter[:id].to_s
|
||||
else
|
||||
@filter.merge!({@new_filter[:type] => [@new_filter[:id].to_s]})
|
||||
end
|
||||
elsif @new_filter
|
||||
@filter = {@new_filter[:type] => [@new_filter[:id].to_s]}
|
||||
end
|
||||
|
||||
render_401 and return if current_user.nil? || !current_user.is_approved?
|
||||
|
||||
if @filter.blank? and @mq.blank?
|
||||
|
||||
render case params[:at]
|
||||
when 'summary'
|
||||
@members = MemberProfile.all.page(page_num).per(12).desc("_id")
|
||||
"index_summary"
|
||||
when 'thumbnail'
|
||||
@members = MemberProfile.all.page(page_num).per(36).desc("_id")
|
||||
"index_thumbnail"
|
||||
else
|
||||
@members = MemberProfile.all.page(page_num).per(10).desc("_id")
|
||||
"index"
|
||||
end
|
||||
|
||||
elsif @filter.blank? and !@mq.blank?
|
||||
|
||||
render case params[:at]
|
||||
when 'summary'
|
||||
@members=MemberProfile.all.any_of({:user_id => /#{@mq}/i}, {:first_name => /#{@mq}/i}, {:last_name => /#{@mq}/i}, {:email => /#{@mq}/i}, {:office_tel => /#{@mq}/i}).desc("_id")
|
||||
"index_summary"
|
||||
when 'thumbnail'
|
||||
@members=MemberProfile.all.any_of({:user_id => /#{@mq}/i}, {:first_name => /#{@mq}/i}, {:last_name => /#{@mq}/i}, {:email => /#{@mq}/i}, {:office_tel => /#{@mq}/i}).desc("_id")
|
||||
"index_thumbnail"
|
||||
else
|
||||
@members=MemberProfile.all.any_of({:user_id => /#{@mq}/i}, {:first_name => /#{@mq}/i}, {:last_name => /#{@mq}/i}, {:email => /#{@mq}/i}, {:office_tel => /#{@mq}/i}).desc("_id")
|
||||
"index"
|
||||
end
|
||||
|
||||
elsif !@filter.blank? and @mq.blank?
|
||||
|
||||
render case params[:at]
|
||||
when 'summary'
|
||||
case (@new_filter["type"] rescue @filter.keys.first)
|
||||
when "role"
|
||||
@members=MemberProfile.all.any_in(:role_ids=>@filter['role']).page(page_num).per(12).desc("_id")
|
||||
"index_summary"
|
||||
when "tag"
|
||||
@members=MemberProfile.all.any_in(:member_tag_ids=>@filter['tag']).page(page_num).per(12).desc("_id")
|
||||
"index_summary"
|
||||
end
|
||||
when 'thumbnail'
|
||||
case (@new_filter["type"] rescue @filter.keys.first)
|
||||
when "role"
|
||||
@members=MemberProfile.all.any_in(:role_ids=>@filter['role']).page(page_num).per(36).desc("_id")
|
||||
"index_thumbnail"
|
||||
when "tag"
|
||||
@members=MemberProfile.all.any_in(:member_tag_ids=>@filter['tag']).page(page_num).per(36).desc("_id")
|
||||
"index_thumbnail"
|
||||
end
|
||||
else
|
||||
case (@new_filter["type"] rescue @filter.keys.first)
|
||||
when "role"
|
||||
@members=MemberProfile.all.any_in(:role_ids=>@filter['role']).page(page_num).per(10).desc("_id")
|
||||
"index"
|
||||
when "tag"
|
||||
@members=MemberProfile.all.any_in(:member_tag_ids=>@filter['tag']).page(page_num).per(10).desc("_id")
|
||||
"index"
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
def show
|
||||
@custom_fields = @member.member_profile_field_values rescue []
|
||||
if current_site.personal_plugins_sort.blank?
|
||||
@plugins = OrbitApp::Plugin::Registration.all rescue nil
|
||||
else
|
||||
plugin_list = OrbitApp::Plugin::Registration.all.collect{|p| p.module_app_name}
|
||||
plugin_list = current_site.personal_plugins_sort | plugin_list
|
||||
@plugins = OrbitApp::Plugin::Registration.sort_by_array(plugin_list) rescue nil
|
||||
end
|
||||
# @ppname = Array.new
|
||||
# @plugins.each do |aa|
|
||||
# @ppname << [aa.sort_number.to_i, [aa.name, aa.app_name, aa.intro_app_name, aa.front_partial_path]]
|
||||
# end
|
||||
@plugin_shows = @plugins.collect {|v| {"name"=>v.name,"app_name"=>v.app_name,"intro_app_name"=>v.intro_app_name,"front_partial_path"=>v.front_partial_path, "count" => (v.app_name.classify.constantize.where(:member_profile_id => @member.id).count rescue 0)} }
|
||||
if(!params[:show_plugin_profile].nil?)
|
||||
@right_partial = OrbitApp::Plugin::Registration.find_by_app_name(params[:show_plugin_profile]).profile_partial_path rescue 'plugin_summary'
|
||||
@plugin_app_name = OrbitApp::Plugin::Registration.find_by_app_name(params[:show_plugin_profile]).name rescue nil
|
||||
else
|
||||
@right_partial = "new_profile_partial"
|
||||
@plugin_app_name = ''
|
||||
end
|
||||
|
||||
get_info_and_roles
|
||||
render_401 and return if current_user.nil? || (@member.id.to_s != current_user.member_profile.id.to_s && !current_user.is_approved?)
|
||||
end
|
||||
|
||||
|
||||
def make_alpha_from_numbers(number)
|
||||
|
||||
@numeric = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
||||
|
||||
if number < @numeric.size
|
||||
@a = @numeric[number]
|
||||
else
|
||||
@dev_by = (number/@numeric.size).floor
|
||||
@a = "#{make_alpha_from_numbers(@dev_by-1)}#{make_alpha_from_numbers(number-(@dev_by*@numeric.size))}";
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def import_data_check(file)
|
||||
|
||||
profile_data_row = ["email","sid","office_tel","sex","birthday"]
|
||||
profile_lang_data_row = ["first_name","last_name","address","autobiography"]
|
||||
|
||||
@field_type = {'text_field' => 'typeA', 'select' => 'typeB', 'date' => 'typeC', 'text_area' => 'typeD', 'radio_button' => 'typeE', 'checkbox' => 'typeE', 'address' => ''}
|
||||
|
||||
@date_type = {'format1' => '%Y/%m/%d %H:%M', 'format2' => '%Y/%m/%d', 'format3' => '%Y/%m', 'format4' => '%Y'}
|
||||
|
||||
@error_msg = Array.new
|
||||
|
||||
workbook = RubyXL::Parser.parse(file.tempfile)
|
||||
sheet = workbook['Member'].extract_data
|
||||
sheet.each_with_index do |row,index|
|
||||
if index == 0
|
||||
@field_data = row
|
||||
end
|
||||
if index > 2
|
||||
|
||||
@user_id = row[@field_data.index('user_id')]
|
||||
if !@user_id.blank?
|
||||
check_id = User.where(:user_name => @user_id).first
|
||||
@error_msg << "#{make_alpha_from_numbers(@field_data.index('user_id'))}#{index+1}欄位帳號已存在。" if !check_id.blank?
|
||||
@error_msg << "#{make_alpha_from_numbers(@field_data.index('user_id'))}#{index+1}欄位格式不符。" if @user_id.size < 3
|
||||
end
|
||||
|
||||
@password = row[@field_data.index('password')]
|
||||
if !@password.blank? and !@user_id.blank?
|
||||
@error_msg << "#{make_alpha_from_numbers(@field_data.index('password'))}#{index+1}欄位格式不符。" if @password.size < 8
|
||||
elsif @password.blank? and !@user_id.blank?
|
||||
@error_msg << "#{make_alpha_from_numbers(@field_data.index('password'))}#{index+1}欄位格式不符。"
|
||||
end
|
||||
|
||||
@error_msg << "#{make_alpha_from_numbers(@field_data.index('birthday'))}#{index+1}欄位日期格式不符。" if row[@field_data.index("birthday")].class.to_s != 'DateTime' and !row[@field_data.index('birthday')].blank?
|
||||
|
||||
|
||||
|
||||
@infos = MemberInfo.all
|
||||
@infos.each do |info|
|
||||
info.member_profile_fields.each do |member_profile_field|
|
||||
|
||||
|
||||
|
||||
if member_profile_field.markup == 'select' or member_profile_field.markup == 'radio_button'
|
||||
|
||||
@option_list = member_profile_field[@field_type[member_profile_field.markup]]['option_list'].collect{|p| p[0]}
|
||||
|
||||
@rowname = "#{info.key}-#{member_profile_field.key}"
|
||||
@error_msg << "#{make_alpha_from_numbers(@field_data.index(@rowname))}#{index+1}欄位格式不符。" if !@option_list.include?("#{row[@field_data.index(@rowname)]}") and !row[@field_data.index(@rowname)].blank?
|
||||
|
||||
elsif member_profile_field.markup == 'checkbox'
|
||||
|
||||
@rowname = "#{info.key}-#{member_profile_field.key}"
|
||||
@error_msg << "#{make_alpha_from_numbers(@field_data.index(@rowname))}#{index+1}欄位格式不符。" if row[@field_data.index(@rowname)].to_s.split(',').last == row[@field_data.index(@rowname)] and !row[@field_data.index(@rowname)].blank?
|
||||
|
||||
elsif member_profile_field.markup == 'date'
|
||||
@rowname = "#{info.key}-#{member_profile_field.key}"
|
||||
@error_msg << "#{make_alpha_from_numbers(@field_data.index(@rowname))}#{index+1}欄位日期格式不符。" if row[@field_data.index(@rowname)].class.to_s != 'DateTime' and !row[@field_data.index(@rowname)].blank?
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
@roles = Role.all
|
||||
@roles.each do |role|
|
||||
|
||||
role_statuses = RoleStatus.where(role_id: role.id, :disable=> false)
|
||||
if !role_statuses.blank?
|
||||
@rowname = "#{role.key}-status"
|
||||
if !@field_data.index(@rowname).blank?
|
||||
@error_msg << "#{make_alpha_from_numbers(@field_data.index(@rowname))}#{index+1}欄位格式不符。" if row[@field_data.index(@rowname)].to_s.split(',').last == row[@field_data.index(@rowname)] and !row[@field_data.index(@rowname)].blank?
|
||||
end
|
||||
end
|
||||
|
||||
role.attribute_fields.asc(:created_at).each do |attribute_field|
|
||||
|
||||
|
||||
if attribute_field.markup == 'select' or attribute_field.markup == 'radio_button'
|
||||
|
||||
@option_list = attribute_field[@field_type[attribute_field.markup]]['option_list'].collect{|p| p[0]}
|
||||
|
||||
@rowname = "#{role.key}-#{attribute_field.key}"
|
||||
if !@field_data.index(@rowname).blank?
|
||||
@error_msg << "#{make_alpha_from_numbers(@field_data.index(@rowname))}#{index+1}欄位格式不符。" if !@option_list.include?("#{row[@field_data.index(@rowname)]}") and !row[@field_data.index(@rowname)].blank?
|
||||
end
|
||||
|
||||
elsif attribute_field.markup == 'checkbox'
|
||||
@rowname = "#{role.key}-#{attribute_field.key}"
|
||||
if !@field_data.index(@rowname).blank?
|
||||
@error_msg << "#{make_alpha_from_numbers(@field_data.index(@rowname))}#{index+1}欄位格式不符。" if row[@field_data.index(@rowname)].to_s.split(',').last == row[@field_data.index(@rowname)] and !row[@field_data.index(@rowname)].blank?
|
||||
end
|
||||
elsif attribute_field.markup == 'date'
|
||||
@rowname = "#{role.key}-#{attribute_field.key}"
|
||||
if !@field_data.index(@rowname).blank?
|
||||
@error_msg << "#{make_alpha_from_numbers(@field_data.index(@rowname))}#{index+1}欄位日期格式不符。" if row[@field_data.index(@rowname)].class.to_s != 'DateTime' and !row[@field_data.index(@rowname)].blank?
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
def import_members
|
||||
|
||||
if !params[:file].blank?
|
||||
|
||||
import_data_check(params[:file])
|
||||
|
||||
if @error_msg.blank?
|
||||
|
||||
profile_data_row = ["email","sid","office_tel","sex","birthday"]
|
||||
profile_lang_data_row = ["first_name","last_name","address","autobiography"]
|
||||
|
||||
@field_type = {'text_field' => 'typeA', 'select' => 'typeB', 'date' => 'typeC', 'text_area' => 'typeD', 'radio_button' => 'typeE', 'checkbox' => 'typeE', 'address' => ''}
|
||||
|
||||
@date_type = {'format1' => '%Y/%m/%d %H:%M', 'format2' => '%Y/%m/%d', 'format3' => '%Y/%m', 'format4' => '%Y'}
|
||||
|
||||
workbook = RubyXL::Parser.parse(params[:file].tempfile)
|
||||
sheet = workbook['Member'].extract_data
|
||||
sheet.each_with_index do |row,index|
|
||||
if index == 0
|
||||
@field_data = row
|
||||
end
|
||||
if index > 2
|
||||
if !row[0].blank? and !row[1].blank?
|
||||
|
||||
@member_profile = MemberProfile.new
|
||||
|
||||
@site_in_use_locales.each_with_index do |locale, i|
|
||||
|
||||
@member_profile.first_name_translations = @member_profile.first_name_translations.merge!( "#{locale}" => row[@field_data.index("first_name(#{locale})")]) if !row[@field_data.index("first_name(#{locale})")].blank?
|
||||
@member_profile.last_name_translations = @member_profile.last_name_translations.merge!( "#{locale}" => row[@field_data.index("last_name(#{locale})")]) if !row[@field_data.index("last_name(#{locale})")].blank?
|
||||
@member_profile.address_translations = @member_profile.address_translations.merge!( "#{locale}" => row[@field_data.index("address(#{locale})")]) if !row[@field_data.index("address(#{locale})")].blank?
|
||||
@member_profile.autobiography_translations = @member_profile.autobiography_translations.merge!( "#{locale}" => row[@field_data.index("autobiography(#{locale})")]) if !row[@field_data.index("autobiography(#{locale})")].blank?
|
||||
|
||||
end
|
||||
|
||||
@member_profile.email = row[@field_data.index("email")]
|
||||
@member_profile.sid = row[@field_data.index("sid")]
|
||||
@member_profile.office_tel = row[@field_data.index("office_tel")]
|
||||
@member_profile.sex = ( row[@field_data.index("sex")] == 'male' or row[@field_data.index("sex")] == 'female' ) ? row[@field_data.index("sex")] : 'unknown'
|
||||
@member_profile.birthday = row[@field_data.index("birthday")].class.to_s == 'DateTime' ? row[@field_data.index("birthday")] : ''
|
||||
|
||||
@member_profile.save
|
||||
|
||||
@infos = MemberInfo.all
|
||||
@infos.each do |info|
|
||||
info.member_profile_fields.each do |member_profile_field|
|
||||
|
||||
value = member_profile_field.member_profile_field_values.build
|
||||
value.member_profile_id = @member_profile.id
|
||||
|
||||
if member_profile_field.markup == 'text_field' or member_profile_field.markup == 'text_area'
|
||||
if member_profile_field[@field_type[member_profile_field.markup]]['cross_lang'] == 'true'
|
||||
@rowname = "#{info.key}-#{member_profile_field.key}"
|
||||
value["val"] = row[@field_data.index(@rowname)] if !row[@field_data.index(@rowname)].blank?
|
||||
else
|
||||
@site_in_use_locales.each_with_index do |locale, i|
|
||||
@rowname = "#{info.key}-#{member_profile_field.key}(#{locale})"
|
||||
value["#{locale}"] = row[@field_data.index(@rowname)] if !row[@field_data.index(@rowname)].blank?
|
||||
end
|
||||
end
|
||||
elsif member_profile_field.markup == 'checkbox'
|
||||
@rowname = "#{info.key}-#{member_profile_field.key}"
|
||||
value["val"] = row[@field_data.index(@rowname)].to_s.split(',') if !row[@field_data.index(@rowname)].blank?
|
||||
elsif member_profile_field.markup == 'date'
|
||||
@rowname = "#{info.key}-#{member_profile_field.key}"
|
||||
value["val"] = row[@field_data.index(@rowname)].class.to_s == 'DateTime' ? row[@field_data.index(@rowname)].to_datetime.strftime(@date_type[member_profile_field['typeC']['format']]) : ''
|
||||
elsif member_profile_field.markup == 'address'
|
||||
@site_in_use_locales.each_with_index do |locale, i|
|
||||
@rowname = "#{info.key}-#{member_profile_field.key}(#{locale})"
|
||||
value["#{locale}"] = row[@field_data.index(@rowname)] if !row[@field_data.index(@rowname)].blank?
|
||||
end
|
||||
else
|
||||
@rowname = "#{info.key}-#{member_profile_field.key}"
|
||||
value["val"] = "#{row[@field_data.index(@rowname)]}"
|
||||
end
|
||||
|
||||
value.save
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
@role_status_data = []
|
||||
@roles = Role.all
|
||||
@roles.each do |role|
|
||||
|
||||
role_statuses = RoleStatus.where(role_id: role.id, :disable=> false).asc(:_id)
|
||||
if !role_statuses.blank?
|
||||
@rowname = "#{role.key}-status"
|
||||
|
||||
if !@field_data.index(@rowname).blank?
|
||||
if !row[@field_data.index(@rowname)].blank?
|
||||
@status_value = row[@field_data.index(@rowname)].to_s.split(',')
|
||||
role_statuses.each do |role_status|
|
||||
if @status_value.include?(role_status.key)
|
||||
@role_status_data << role_status.id
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
@role_add_value = 0
|
||||
|
||||
role.attribute_fields.asc(:created_at).each do |attribute_field|
|
||||
|
||||
value = attribute_field.attribute_values.build
|
||||
value.member_profile_id = @member_profile.id
|
||||
|
||||
if attribute_field.markup == 'text_field' or attribute_field.markup == 'text_area'
|
||||
if attribute_field[@field_type[attribute_field.markup]]['cross_lang'] == 'true'
|
||||
@rowname = "#{role.key}-#{attribute_field.key}"
|
||||
if !@field_data.index(@rowname).blank?
|
||||
if !row[@field_data.index(@rowname)].blank?
|
||||
value["val"] = row[@field_data.index(@rowname)]
|
||||
@role_add_value = @role_add_value + 1
|
||||
end
|
||||
end
|
||||
else
|
||||
@site_in_use_locales.each_with_index do |locale, i|
|
||||
@rowname = "#{role.key}-#{attribute_field.key}(#{locale})"
|
||||
if !@field_data.index(@rowname).blank?
|
||||
if !row[@field_data.index(@rowname)].blank?
|
||||
value["#{locale}"] = row[@field_data.index(@rowname)]
|
||||
@role_add_value = @role_add_value + 1
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
elsif attribute_field.markup == 'checkbox'
|
||||
@rowname = "#{role.key}-#{attribute_field.key}"
|
||||
if !@field_data.index(@rowname).blank?
|
||||
if !row[@field_data.index(@rowname)].blank?
|
||||
value["val"] = row[@field_data.index(@rowname)].to_s.split(',')
|
||||
@role_add_value = @role_add_value + 1
|
||||
end
|
||||
end
|
||||
elsif attribute_field.markup == 'date'
|
||||
@rowname = "#{role.key}-#{attribute_field.key}"
|
||||
if !@field_data.index(@rowname).blank?
|
||||
value["val"] = row[@field_data.index(@rowname)].class.to_s == 'DateTime' ? row[@field_data.index(@rowname)].to_datetime.strftime(@date_type[attribute_field['typeC']['format']]) : ''
|
||||
end
|
||||
elsif attribute_field.markup == 'address'
|
||||
@site_in_use_locales.each_with_index do |locale, i|
|
||||
@rowname = "#{role.key}-#{attribute_field.key}(#{locale})"
|
||||
if !@field_data.index(@rowname).blank?
|
||||
if !row[@field_data.index(@rowname)].blank?
|
||||
value["#{locale}"] = row[@field_data.index(@rowname)]
|
||||
@role_add_value = @role_add_value + 1
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
@rowname = "#{role.key}-#{attribute_field.key}"
|
||||
if !@field_data.index(@rowname).blank?
|
||||
if !row[@field_data.index(@rowname)].blank?
|
||||
value["val"] = "#{row[@field_data.index(@rowname)]}"
|
||||
@role_add_value = @role_add_value + 1
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
value.save
|
||||
|
||||
end
|
||||
|
||||
if @role_add_value > 0
|
||||
role.member_profiles << @member_profile
|
||||
role.save
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
if !@role_status_data.blank?
|
||||
@member_profile.role_status_ids = @role_status_data
|
||||
@member_profile.save
|
||||
end
|
||||
|
||||
@user = User.new(
|
||||
user_name: row[@field_data.index("user_id")],
|
||||
password: row[@field_data.index("password")],
|
||||
member_profile_id: @member_profile.id,
|
||||
approved: true
|
||||
)
|
||||
@user.save
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
redirect_to admin_members_path
|
||||
|
||||
else
|
||||
|
||||
render 'import_error_msg'
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
def download_export
|
||||
|
||||
@users = User.all
|
||||
@member_role = params[:member_role].blank? ? Role.all.asc(:_id) : params[:member_role]
|
||||
@member_roles = @member_role.collect{|a| a[0]}
|
||||
respond_to do |format|
|
||||
format.xlsx {
|
||||
response.headers['Content-Disposition'] = 'attachment; filename="member_import_data.xlsx"'
|
||||
}
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
def new
|
||||
if has_access?
|
||||
@member = MemberProfile.new
|
||||
get_info_and_roles
|
||||
@user = User.new
|
||||
@form_index = 0
|
||||
else
|
||||
render_401
|
||||
end
|
||||
end
|
||||
|
||||
def edit
|
||||
param_temp = request.fullpath.split("?")
|
||||
@edit_params = (param_temp.count > 1 ? "?" + param_temp.last : "") rescue ""
|
||||
if has_access?
|
||||
@form_index = 0
|
||||
get_info_and_roles
|
||||
if @member.user.present?
|
||||
@user = @member.user
|
||||
else
|
||||
@user = User.new(member_profile_id: @member.id)
|
||||
end
|
||||
else
|
||||
render_401
|
||||
end
|
||||
end
|
||||
|
||||
def create
|
||||
@member = MemberProfile.new(member_profile_params)
|
||||
if @member.save
|
||||
if user_params["user_name"] != ""
|
||||
@user = User.new(user_params) rescue nil
|
||||
@user.member_profile = @member
|
||||
if !@user.save
|
||||
@member.destroy
|
||||
get_info_and_roles
|
||||
@form_index = 0
|
||||
render 'new' and return
|
||||
end
|
||||
end
|
||||
mpfv_params = member_profile_field_values_params
|
||||
if !mpfv_params.nil?
|
||||
mpfv_params.each_with_index do |m,i|
|
||||
@custom_field_value = @member.member_profile_field_values.build(value: m.second["value"], member_profile_field_id: m.second["member_profile_field_id"])
|
||||
@custom_field_value.save
|
||||
end
|
||||
end
|
||||
rfv_params = role_field_values_params
|
||||
if !rfv_params.nil?
|
||||
rfv_params.each_with_index do |r,i|
|
||||
field_value = r.last[:id].present?
|
||||
@custom_field_value = AttributeValue.put_field_values(@member, r.last, r.last[:attribute_field_id], field_value)
|
||||
end
|
||||
end
|
||||
|
||||
redirect_to admin_members_path
|
||||
else
|
||||
render 'new'
|
||||
end
|
||||
end
|
||||
|
||||
def update
|
||||
param_temp = request.fullpath.split("?")
|
||||
@edit_params = (param_temp.count > 1 ? "?" + param_temp.last : "") rescue ""
|
||||
respond_to do |format|
|
||||
if @member.user.present?
|
||||
@user = @member.user
|
||||
@user.update(user_params)
|
||||
else
|
||||
if user_params["user_name"] != ""
|
||||
@user = User.new(user_params) rescue nil
|
||||
@user.member_profile = @member
|
||||
@user.save
|
||||
else
|
||||
@user = User.new(user_params) rescue nil
|
||||
end
|
||||
end
|
||||
if @member.update_attributes(member_profile_params)
|
||||
if params[:edit_type]!="edit_privilege" and (params[:member_profile].nil? or params[:member_profile][:role_status_ids].nil?)
|
||||
@member.update_attributes(role_status_ids: [])
|
||||
end
|
||||
mpfv_params = member_profile_field_values_params
|
||||
if !mpfv_params.nil?
|
||||
mpfv_params.each_with_index do |m,i|
|
||||
field_value = m.last[:id].present?
|
||||
@custom_field_value = MemberProfileFieldValue.put_field_values(@member, m.last, m.last[:id], field_value)
|
||||
end
|
||||
# elsif !params[:member_profile_field_value].nil?
|
||||
# params[:member_profile_field_value].each_with_index do |m,i|
|
||||
# field_value = m.last[:id].present?
|
||||
# @custom_field_value = MemberProfileFieldValue.put_field_values(@member, m.last, nil, field_value)
|
||||
# end
|
||||
end
|
||||
rfv_params = role_field_values_params
|
||||
if !rfv_params.nil?
|
||||
rfv_params.each_with_index do |r,i|
|
||||
field_value = r.last[:id].present?
|
||||
@custom_field_value = AttributeValue.put_field_values(@member, r.last, r.last[:id], field_value)
|
||||
end
|
||||
end
|
||||
if params[:edit_type]=="edit_privilege"
|
||||
@member.user.update_attributes(workgroup_id: params[:workgroup_id])
|
||||
end
|
||||
|
||||
|
||||
format.html { redirect_to admin_members_path() + @edit_params, notice: 'Successfully Updated the User' }
|
||||
format.json { head :no_content }
|
||||
else
|
||||
get_info_and_roles
|
||||
@form_index = 0
|
||||
format.html { render action: "edit_passwd"} if params[:edit_type] == "edit_passwd"
|
||||
format.html { render action: 'edit' }
|
||||
format.json { render json: @member.errors, status: :unprocessable_entity }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def destroy
|
||||
if params[:id].eql?(current_user.id.to_s)
|
||||
flash[:error] = t(:cant_delete_self)
|
||||
else
|
||||
@member_profile = MemberProfile.find(params[:id])
|
||||
@member_profile.user.delete if @member_profile.user.present?
|
||||
@member_profile.destroy
|
||||
@member_profile.roles.clear
|
||||
@member_profile.role_statuses.clear
|
||||
end
|
||||
|
||||
respond_to do |format|
|
||||
format.js
|
||||
end
|
||||
end
|
||||
|
||||
def unapproved_members
|
||||
@member_query = Sanitize.clean(params[:member_query])
|
||||
page_num = params[:page] || 1
|
||||
if !@member_query.blank?
|
||||
members = MemberProfile.all.any_of({:user_id => /#{@member_query}/i}, {:first_name => /#{@member_query}/i}, {:last_name => /#{@member_query}/i}, {:email => /#{@member_query}/i})
|
||||
@members = members.collect do |member|
|
||||
if !member.user.approved
|
||||
member.user
|
||||
end
|
||||
end
|
||||
else
|
||||
@members = User.unapproved.page(page_num).per(12)
|
||||
end
|
||||
end
|
||||
|
||||
def accept_member
|
||||
user = User.find(params[:member_id])
|
||||
user.approved = true
|
||||
user.save
|
||||
redirect_to admin_members_unapproved_members_path
|
||||
end
|
||||
|
||||
def edit_passwd
|
||||
if has_access?
|
||||
@user = @member.user
|
||||
else
|
||||
render_401
|
||||
end
|
||||
end
|
||||
|
||||
def edit_privilege
|
||||
@edit_params = "?" + request.fullpath.split("?").last rescue ""
|
||||
if current_user.is_admin?
|
||||
@user = @member.user
|
||||
@workgroup = Workgroup.find_by(key: 'admin')
|
||||
else
|
||||
render_401
|
||||
end
|
||||
end
|
||||
|
||||
def edit_order_card
|
||||
@members = MemberProfile.order('created_at DESC')
|
||||
@type = 'card'
|
||||
render 'edit_order'
|
||||
end
|
||||
|
||||
def edit_order_list
|
||||
@members = MemberProfile.order(:position=>'asc',:created_at=>'desc')
|
||||
@type = 'list'
|
||||
render 'edit_order'
|
||||
end
|
||||
|
||||
def update_order_card
|
||||
@error = false
|
||||
if params[:users].present?
|
||||
to_go = params[:users][:position].to_i
|
||||
member_at_position = MemberProfile.find_by(position: to_go + 1)
|
||||
member = MemberProfile.find(params[:users][:id])
|
||||
if member_at_position
|
||||
if member.position > member_at_position.position
|
||||
member.move_above(member_at_position)
|
||||
else
|
||||
member.move_below(member_at_position)
|
||||
end
|
||||
end
|
||||
end
|
||||
render nothing: true, status: 200
|
||||
end
|
||||
|
||||
def update_order_list
|
||||
if params[:position].present?
|
||||
params[:position].each do |id, position|
|
||||
profile = MemberProfile.find(id)
|
||||
profile.position = position.to_i
|
||||
profile.save(:validate => false)
|
||||
end
|
||||
end
|
||||
# @error = []
|
||||
# if params[:users].present?
|
||||
# params[:users].values.sort.each do |pair|
|
||||
# to_go = pair[0].to_i
|
||||
|
||||
# if to_go > 0
|
||||
# member_at_position = MemberProfile.where(position: to_go).first
|
||||
# member = MemberProfile.find(pair[1])
|
||||
# if member_at_position && !(member_at_position == member)
|
||||
# if member.position > member_at_position.position
|
||||
# member.move_above(member_at_position)
|
||||
# else
|
||||
# member.move_below(member_at_position)
|
||||
# end
|
||||
# elsif to_go > MemberProfile.count
|
||||
# member.move_to_bottom
|
||||
# end
|
||||
# end
|
||||
# end
|
||||
# end
|
||||
# @members = MemberProfile.asc(:position)
|
||||
render :nothing=>true
|
||||
end
|
||||
|
||||
def save_autobiography
|
||||
content = params[:content]
|
||||
member = MemberProfile.find(params["member-id"]) rescue nil
|
||||
if !member.nil?
|
||||
member.autobiography = content
|
||||
member.save
|
||||
end
|
||||
render :json => {"success" => true}.to_json
|
||||
end
|
||||
|
||||
def new_tag
|
||||
membertag = MemberTag.new(member_tag_params)
|
||||
membertag.created_by = current_user.id
|
||||
membertag.save
|
||||
render :json => {"success" => true, "title" => membertag.title, "id" => membertag.id.to_s}.to_json
|
||||
end
|
||||
|
||||
def setting_account
|
||||
if params[:member_id].blank?
|
||||
redirect_to action: :index
|
||||
else
|
||||
@user = MemberProfile.find(params[:member_id])
|
||||
if current_user.id != @user.id
|
||||
redirect_to action: :index
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def get_role_fields
|
||||
role = Role.find(params[:id])
|
||||
statuses = role.role_statuses.map{|status| {'key'=>status.key, 'title'=>status.title}}.select{|s| s['key']='part_time'}
|
||||
render :json=>{"statuses"=>statuses}
|
||||
end
|
||||
|
||||
def set_privacy
|
||||
id = params[:id]
|
||||
status = params[:status]
|
||||
if current_user.is_admin?
|
||||
member = MemberProfile.find(params[:memberid])
|
||||
else
|
||||
member = current_user.member_profile
|
||||
end
|
||||
old = member.get_privacy_type_for_field(id)
|
||||
case status
|
||||
when "locked"
|
||||
member.locked_privacy << id
|
||||
when "logged_in"
|
||||
member.logged_in_privacy << id
|
||||
when "public"
|
||||
member.public_privacy << id
|
||||
end
|
||||
case old
|
||||
when "locked"
|
||||
member.locked_privacy.delete(id)
|
||||
when "logged_in"
|
||||
member.logged_in_privacy.delete(id)
|
||||
when "public"
|
||||
member.public_privacy.delete(id)
|
||||
end
|
||||
member.save
|
||||
render :json => {"success" => true}.to_json
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
# Use callbacks to share common setup or constraints between actions.
|
||||
def set_member_profile
|
||||
@member = MemberProfile.find(params[:id])
|
||||
end
|
||||
|
||||
def show_member_profile
|
||||
path = request.path.split('/')
|
||||
if path.last.include? '-'
|
||||
uid = path[-1].split("-").last
|
||||
uid = uid.split("?").first
|
||||
else
|
||||
uid = path[-2].split("-").last
|
||||
uid = uid.split("?").first
|
||||
end
|
||||
@member = MemberProfile.find_by(uid: uid)
|
||||
end
|
||||
|
||||
# Never trust parameters from the scary internet, only allow the white list through.
|
||||
def member_profile_params
|
||||
params.require(:member_profile).permit! rescue nil
|
||||
end
|
||||
|
||||
def role_field_values_params
|
||||
params.require(:role_field_values).permit! rescue nil
|
||||
end
|
||||
|
||||
def member_profile_field_values_params
|
||||
params.require(:member_profile_field_values).permit! rescue nil
|
||||
end
|
||||
|
||||
def user_params
|
||||
params.require(:user).permit! rescue nil
|
||||
end
|
||||
|
||||
def member_tag_params
|
||||
params.require(:member_tag).permit!
|
||||
end
|
||||
|
||||
|
||||
protected
|
||||
|
||||
def get_info_and_roles
|
||||
if current_user.is_admin?
|
||||
@roles = Role.excludes(disabled: true).asc(:key)
|
||||
else
|
||||
@roles = current_user.member_profile.roles
|
||||
end
|
||||
@infos = MemberProfileField.excludes(disabled: true)
|
||||
end
|
||||
|
||||
def set_attribute
|
||||
@class = 'users'
|
||||
end
|
||||
|
||||
end
|
||||
@@ -0,0 +1,505 @@
|
||||
<head>
|
||||
<%= stylesheet_link_tag "lib/wrap-nav"%>
|
||||
<%= stylesheet_link_tag "lib/main-forms"%>
|
||||
<%= stylesheet_link_tag "lib/fileupload"%>
|
||||
<%= stylesheet_link_tag "lib/togglebox"%>
|
||||
|
||||
<%= javascript_include_tag 'lib/bootstrap-fileupload' %>
|
||||
<%= javascript_include_tag 'lib/site_set' %>
|
||||
</head>
|
||||
|
||||
|
||||
<%= form_for @site, :url => admin_site_path(@site.id), :html => {:class => "form-horizontal main-forms"} do |f| %>
|
||||
|
||||
<fieldset>
|
||||
|
||||
<!-- Input Area -->
|
||||
<div class="input-area">
|
||||
<div class="nav-name"><strong><%= t('preferences.classification') %></strong></div>
|
||||
<ul class="nav nav-pills language-nav">
|
||||
<% if current_user.user_name == "rulingcom" || current_user.beta_tester %>
|
||||
<li>
|
||||
<a href="#sidebar-nav" data-toggle="tab"><%= t('preferences.sidebar_nav') %></a>
|
||||
</li>
|
||||
<% end %>
|
||||
<li class="active">
|
||||
<a href="#system-email" data-toggle="tab"><%= t('preferences.system_email') %></a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#openness" data-toggle="tab"><%= t('preferences.openness') %></a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#language-set" data-toggle="tab"><%= t('preferences.language') %></a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#orbitBar-them" data-toggle="tab"><%= t('preferences.orbitbar_theme') %></a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#google-oauth" data-toggle="tab">Google OAuth</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#social-sharer" data-toggle="tab">Social Share</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#sign-up" data-toggle="tab">Sign Up</a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<div class="tab-content">
|
||||
|
||||
<!-- Sidebar Nav -->
|
||||
<% if current_user.user_name == "rulingcom" || current_user.beta_tester %>
|
||||
<div id="sidebar-nav" class="tab-pane fade in active">
|
||||
<div class="control-group">
|
||||
<label class="control-label muted"><%= t("preferences.nav_enabled") %></label>
|
||||
<div class="controls">
|
||||
<input type="checkbox" class="toggle-check set-sidebar-state" data-disabled="true">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<!-- System Email -->
|
||||
<%= f.fields_for :site_settings, @site['site_settings'] do |f| %>
|
||||
|
||||
<div id="system-email" class="tab-pane fade in active">
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label muted"><%= t 'mail.service_email' %></label>
|
||||
<div class="controls">
|
||||
<%= f.text_field :service_email, :value => (@site['site_settings']['service_email'] rescue nil), :class=>"input-large", :placeholder=>"Administrator Mail" %>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label muted"><%= t 'mail.reply_email' %></label>
|
||||
<div class="controls">
|
||||
<%= f.text_field :reply_email, :value => (@site['site_settings']['reply_email'] rescue nil), :class=>"input-large", :placeholder=>"Reply Mail" %>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label muted"><%= t 'mail.address' %></label>
|
||||
<div class="controls">
|
||||
<%= f.text_field :address, :value => (@site['site_settings']['address'] rescue nil), :class=>"input-large", :placeholder=>"Email Address" %>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label muted"><%= t 'mail.domain' %></label>
|
||||
<div class="controls">
|
||||
<%= f.text_field :domain, :value => (@site['site_settings']['domain'] rescue nil), :class=>"input-large", :placeholder=>"Domain" %>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label muted"><%= t 'mail.authentication' %></label>
|
||||
<div class="controls">
|
||||
<%= f.text_field :authentication, :value => (@site['site_settings']['authentication'] rescue nil), :class=>"input-large", :placeholder =>"Authentication" %>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label muted"><%= t 'mail.user_name' %></label>
|
||||
<div class="controls">
|
||||
<%= f.text_field :user_name, :value => (@site['site_settings']['user_name'] rescue nil), :class=>"input-large", :placeholder=>"User Name" %>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label muted"><%= t 'mail.password' %></label>
|
||||
<div class="controls">
|
||||
<%= f.password_field :password, :value => (@site['site_settings']['password'] rescue nil), :class=>"input-large", :placeholder=>"Password" %>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label muted"><%= t 'mail.port' %></label>
|
||||
<div class="controls">
|
||||
<%= f.text_field :port, :value => (@site['site_settings']['port'] rescue nil),:placeholder=>"Port", :class=>"input-mini" %>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label muted"><%= t 'mail.tls' %></label>
|
||||
<div class="controls">
|
||||
<%= f.check_box :tls, :checked => (@site['site_settings']['tls'].eql?('1') rescue false),:class=>"toggle-check", :data=> { disabled: true } %>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label muted"><%= t 'mail.enable_starttls_auto' %></label>
|
||||
<div class="controls">
|
||||
<%= f.check_box 'enable_starttls_auto', :checked => (@site['site_settings']['enable_starttls_auto'].eql?('1') rescue false), :class=>"toggle-check", :data=> { disabled: true } %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
|
||||
<!-- Openness -->
|
||||
<div id="openness" class="tab-pane fade">
|
||||
<div class="control-group">
|
||||
<label class="control-label muted"><%= I18n.t('site.frontend_open')%></label>
|
||||
<div class="controls">
|
||||
<%= f.check_box :frontend_open , :class=>"toggle-check", :data=> { disabled: true } %>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label muted"><%= I18n.t('site.backend_openness_on') %></label>
|
||||
<div class="controls">
|
||||
<%= f.check_box :backend_openness_on , :class=>"toggle-check", :data=> { disabled: true } %>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group hide">
|
||||
<label class="control-label muted"><%= I18n.t('site.disable_personal_desktop')%></label>
|
||||
<div class="controls">
|
||||
<%= f.check_box :desktop_closed , :class=>"toggle-check", :data=> { disabled: true } %>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Language -->
|
||||
<div id="language-set" class="tab-pane fade">
|
||||
<!-- <div class="control-group">
|
||||
<label class="control-label muted">Enable User Language Detection</label>
|
||||
<div class="controls">
|
||||
<input type="checkbox" class="toggle-check" data-disabled="true">
|
||||
</div>
|
||||
</div> -->
|
||||
<!-- Terms of Use -->
|
||||
<div class="control-group">
|
||||
<label class="control-label muted"><%= t('preferences.lang_detection') %>
|
||||
</label>
|
||||
<div class="controls">
|
||||
<%= f.check_box :enable_language_detection, :class => "toggle-check reset_default_locale", data: {disabled: true} %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label muted"><%= t('preferences.enable_zh_cn') %>
|
||||
</label>
|
||||
<div class="controls">
|
||||
<%= f.check_box :enable_zh_cn, :class => "toggle-check", data: {disabled: true} %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label muted"><%= t('preferences.lang_enabled') %></label>
|
||||
<div class="controls">
|
||||
<% I18n.available_locales.each do |valid_locale| %>
|
||||
<%= check_box_tag "site[in_use_locales][#{valid_locale}]", valid_locale, @site.in_use_locales.include?(valid_locale), :class=>"toggle-check in_use_locales", :data => { :title => "#{t(valid_locale.to_s)}", disabled: true }, "data-deploy"=>"inline" %>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label muted"><%= t('preferences.lang_default') %></label>
|
||||
<div class="controls">
|
||||
<% I18n.available_locales.each do |locale| %>
|
||||
<%= radio_button_tag "site[default_locale]", locale, @locale == locale ,:class=>"toggle-check", :data => { :title => "#{t(locale.to_s)}" }, "data-deploy"=>"inline", :checked => (@site.default_locale.eql?("#{locale}")) %>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label muted"><%= t('preferences.redirect_index') %>
|
||||
</label>
|
||||
<div class="controls">
|
||||
<%= f.check_box :enable_redirect_index, :class => "toggle-check reset_default_locale", data: {disabled: true} %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label muted"><%= t('preferences.enable_language_options') %>
|
||||
</label>
|
||||
<div class="controls">
|
||||
<%= f.check_box :enable_language_options, :class => "toggle-check", data: {disabled: true} %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- OrbitBar Them -->
|
||||
<div id="orbitBar-them" class="tab-pane fade">
|
||||
<div class="control-group">
|
||||
<label class="control-label muted">OrbitBar Logo <%= t('preferences.icon') %></label>
|
||||
<div class="controls">
|
||||
<!-- if this page editing please add class "fileupload-edit" -->
|
||||
<div class="fileupload fileupload-new clearfix" data-provides="fileupload">
|
||||
<div class="fileupload-new thumbnail pull-left" style="background:black;">
|
||||
<% if @site.default_image.file.present? %>
|
||||
<%= image_tag( @site.default_image, :size=>"120x120") rescue ''%>
|
||||
<% else %>
|
||||
<%= image_tag "orbit-logo.png",:class => "pull-left upload-picture"%>
|
||||
<% end %>
|
||||
</div>
|
||||
<div class="fileupload-preview fileupload-exists thumbnail pull-left"></div>
|
||||
<% if @site.default_image.file.present?%>
|
||||
<span class="btn btn-file">
|
||||
<%= f.file_field :default_image, :id => "input-upload", :class => 'fileupload-new', :onchange => "document.getElementById('fu').innerHTML = this.form.fu.value = this.value;" %><%= t('preferences.change') %>
|
||||
</span>
|
||||
<%= f.check_box :remove_default_image %>
|
||||
<%= t(:remove) %> OrbitBar Logo
|
||||
<%else%>
|
||||
<span class="btn btn-file">
|
||||
<%= f.file_field :default_image, :id => "input-upload", :class => 'fileupload-new', :onchange => "document.getElementById('fu').innerHTML = this.form.fu.value = this.value;" %><%= t('preferences.select_image') %>
|
||||
</span>
|
||||
<%end%>
|
||||
<a href="#" class="btn fileupload-exists" data-dismiss="fileupload"><%= t(:cancel) %></a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label class="control-label muted">Orbit <%= t('preferences.favicon') %></label>
|
||||
<div class="controls">
|
||||
<!-- if this page editing please add class "fileupload-edit" -->
|
||||
<div class="fileupload fileupload-new clearfix" data-provides="fileupload">
|
||||
<div class="fileupload-new thumbnail pull-left">
|
||||
<% if @site.favicon.file.present? %>
|
||||
<%= image_tag( @site.favicon, :size=>"120x120") rescue ''%>
|
||||
<% else %>
|
||||
<%= image_tag "favicon.ico", :class => "pull-left upload-picture"%>
|
||||
<% end %>
|
||||
</div>
|
||||
<div class="fileupload-preview fileupload-exists thumbnail pull-left"></div>
|
||||
<% if @site.favicon.file.present?%>
|
||||
<span class="btn btn-file">
|
||||
<%= f.file_field :favicon, :id => "input-upload", :class => 'fileupload-new', :onchange => "document.getElementById('fu').innerHTML = this.form.fu.value = this.value;" %><%= t('preferences.change') %>
|
||||
</span>
|
||||
<%= f.check_box :remove_favicon %>
|
||||
<%= t(:remove) %> <%= t('preferences.favicon') %>
|
||||
<%else%>
|
||||
<span class="btn btn-file">
|
||||
<%= f.file_field :favicon, :id => "input-upload", :class => 'fileupload-new', :onchange => "document.getElementById('fu').innerHTML = this.form.fu.value = this.value;" %><%= t('preferences.select_image') %>
|
||||
</span>
|
||||
<%end%>
|
||||
|
||||
<a href="#" class="btn fileupload-exists" data-dismiss="fileupload"><%= t(:cancel) %></a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label muted">Orbit <%= t('preferences.site_logo') %>(second image or the only one image)</label>
|
||||
<div class="controls">
|
||||
<!-- if this page editing please add class "fileupload-edit" -->
|
||||
<div class="fileupload fileupload-new clearfix" data-provides="fileupload">
|
||||
<div class="fileupload-new thumbnail pull-left">
|
||||
<% if @site.site_logo.file.present? %>
|
||||
<%= image_tag( @site.site_logo, :size=>"120x120") rescue ''%>
|
||||
<% else %>
|
||||
<%= image_tag "site-logo.png", :class => "pull-left upload-picture"%>
|
||||
<% end %>
|
||||
</div>
|
||||
<div class="fileupload-preview fileupload-exists thumbnail pull-left"></div>
|
||||
<% if @site.site_logo.file.present?%>
|
||||
<span class="btn btn-file">
|
||||
<%= f.file_field :site_logo, :id => "input-upload", :class => 'fileupload-new', :onchange => "document.getElementById('fu').innerHTML = this.form.fu.value = this.value;" %><%= t('preferences.change') %>
|
||||
</span>
|
||||
<%= f.check_box :remove_site_logo %>
|
||||
<%= t(:remove) %> <%= t('preferences.site_logo') %>
|
||||
<%else%>
|
||||
<span class="btn btn-file">
|
||||
<%= f.file_field :site_logo, :id => "input-upload", :class => 'fileupload-new', :onchange => "document.getElementById('fu').innerHTML = this.form.fu.value = this.value;" %><%= t('preferences.select_image') %>
|
||||
</span>
|
||||
<%end%>
|
||||
|
||||
<a href="#" class="btn fileupload-exists" data-dismiss="fileupload"><%= t(:cancel) %></a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label muted">Orbit <%= t('preferences.site_logo_1') %></label>
|
||||
<div class="controls">
|
||||
<!-- if this page editing please add class "fileupload-edit" -->
|
||||
<div class="fileupload fileupload-new clearfix" data-provides="fileupload">
|
||||
<div class="fileupload-new thumbnail pull-left">
|
||||
<% if @site.site_logo_1.file.present? %>
|
||||
<%= image_tag( @site.site_logo_1, :size=>"120x120") rescue ''%>
|
||||
<% else %>
|
||||
<%= image_tag "site-logo.png", :class => "pull-left upload-picture"%>
|
||||
<% end %>
|
||||
</div>
|
||||
<div class="fileupload-preview fileupload-exists thumbnail pull-left"></div>
|
||||
<% if @site.site_logo_1.file.present?%>
|
||||
<span class="btn btn-file">
|
||||
<%= f.file_field :site_logo_1, :id => "input-upload", :class => 'fileupload-new', :onchange => "document.getElementById('fu').innerHTML = this.form.fu.value = this.value;" %><%= t('preferences.change') %>
|
||||
</span>
|
||||
<%= f.check_box :remove_site_logo_1 %>
|
||||
<%= t(:remove) %> <%= t('preferences.site_logo_1') %>
|
||||
<%else%>
|
||||
<span class="btn btn-file">
|
||||
<%= f.file_field :site_logo_1, :id => "input-upload", :class => 'fileupload-new', :onchange => "document.getElementById('fu').innerHTML = this.form.fu.value = this.value;" %><%= t('preferences.select_image') %>
|
||||
</span>
|
||||
<%end%>
|
||||
|
||||
<a href="#" class="btn fileupload-exists" data-dismiss="fileupload"><%= t(:cancel) %></a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group"><label class="control-label muted">home_link(for site logo)</label><div class="controls"><%= f.text_field :home_link %></div></div>
|
||||
<div class="control-group"><label class="control-label muted">home_link_1(for site logo 1)</label><div class="controls"><%= f.text_field :home_link_1 %></div></div>
|
||||
<% @site_in_use_locales.each do |locale| %>
|
||||
<%= f.fields_for :site_title do |f| %>
|
||||
<div class="control-group">
|
||||
<label class="control-label muted">Site title (for site logo) (<%= t(locale) %>)</label>
|
||||
<div class="controls">
|
||||
<%= f.text_field locale, :value => (@site.site_title[locale.to_s] rescue nil), :placeholder=>"site_title" %>
|
||||
</div>
|
||||
</div>
|
||||
<% end %>
|
||||
<%= f.fields_for :site_title_1 do |f| %>
|
||||
<div class="control-group">
|
||||
<label class="control-label muted">Site title 1 (for site logo 1) (<%= t(locale) %>)</label>
|
||||
<div class="controls">
|
||||
<%= f.text_field locale, :value => (@site.site_title_1[locale.to_s] rescue nil), :placeholder=>"site_title_1" %>
|
||||
</div>
|
||||
</div>
|
||||
<% end %>
|
||||
<% end %>
|
||||
</div>
|
||||
<% @site_in_use_locales.each do |locale| %>
|
||||
<%= f.fields_for :mobile_orbit_bar_title_translations do |f| %>
|
||||
<div class="control-group">
|
||||
<label class="control-label muted">Orbit bar title (<%= t(locale) %>)</label>
|
||||
<div class="controls">
|
||||
<%= f.text_field locale, :value => (@site.mobile_orbit_bar_title_translations[locale.to_s] rescue nil), :placeholder=>"Orbit bar title" %>
|
||||
</div>
|
||||
</div>
|
||||
<% end %>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="google-oauth" class="tab-pane fade">
|
||||
<div class="control-group">
|
||||
<label class="control-label muted">Enable Google OAuth</label>
|
||||
<div class="controls">
|
||||
<%= f.check_box :google_oauth_enabled %>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label muted">Google client id</label>
|
||||
<div class="controls">
|
||||
<%= f.text_field :google_client_id, :value => (@site['google_client_id'] rescue nil), :class=>"input-large google-oauth-fields", :placeholder=>"Google client id", :disabled => !@site[:google_oauth_enabled] %>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label muted">Google client secret</label>
|
||||
<div class="controls">
|
||||
<%= f.text_field :google_client_secret, :value => (@site['google_client_secret'] rescue nil), :class=>"input-large google-oauth-fields", :placeholder=>"Google client secret", :disabled => !@site[:google_oauth_enabled] %>
|
||||
</div>
|
||||
</div>
|
||||
<div class="alert alert-info">Please restart the website after modifying these settings. Click on the restart button and refresh the page in sometime. <a class="btn btn-small btn-primary" id="restart_server">Restart server</a></div>
|
||||
</div>
|
||||
<div id="social-sharer" class="tab-pane fade">
|
||||
<div class="control-group">
|
||||
<label class="control-label muted">Enable Social Share</label>
|
||||
<div class="controls">
|
||||
<input type="checkbox" value="facebook" name="site[every_page_sharer][]" <%= @site.every_page_sharer.include?("facebook") ? "checked=checked" : "" %> > Facebook
|
||||
<input type="checkbox" value="twitter" name="site[every_page_sharer][]" <%= @site.every_page_sharer.include?("twitter") ? "checked=checked" : "" %> > Twitter
|
||||
<input type="checkbox" value="google" name="site[every_page_sharer][]" <%= @site.every_page_sharer.include?("google") ? "checked=checked" : "" %> >
|
||||
Google
|
||||
<input type="checkbox" value="printer" name="site[every_page_sharer][]" <%= @site.every_page_sharer.include?("printer") ? "checked=checked" : "" %> >
|
||||
Printer
|
||||
<input type="hidden" value="disable" name="site[every_page_sharer][]">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- sign up -->
|
||||
<div id="sign-up" class="tab-pane fade">
|
||||
<div class="control-group">
|
||||
<label class="control-label muted"><%= I18n.t('site.roles_for_sign_up')%></label>
|
||||
<div class="controls">
|
||||
<% Role.where(:disabled => false).each do |r| %>
|
||||
<input type="checkbox" value="<%= r.id.to_s %>" name="site[sign_up_roles][]" <%= @site.sign_up_roles.include?(r.id.to_s) ? "checked=checked" : "" %> > <%= r.title %><br />
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<!-- Form Actions -->
|
||||
<div class="form-actions" style="background: none;">
|
||||
<%= f.submit t("submit"), :class => "btn btn-primary" %>
|
||||
<%= f.submit t("cancel"), :class => "btn ", :type => 'reset' %>
|
||||
</div>
|
||||
|
||||
</fieldset>
|
||||
<%end%>
|
||||
|
||||
<% content_for :page_specific_javascript do %>
|
||||
<%end%>
|
||||
<script type="text/javascript">
|
||||
|
||||
$(".language-nav li a").click(function(){window.location.hash = $(this).attr("href")});
|
||||
|
||||
$(document).ready(function(){
|
||||
var language_detection = $("#site_enable_language_detection");
|
||||
var default_locale = $( "input[name='site[default_locale]']" );
|
||||
|
||||
$(language_detection).click(function(){
|
||||
if ( !$(this).parent().hasClass("disable") ){
|
||||
// Disable default language if language detection enbaled
|
||||
$.each($(default_locale),function(){
|
||||
if ( !$(this).parent().hasClass("disable") ){
|
||||
$(this).parent().toggleClass('disable');
|
||||
$(this).toggleClass('disable');
|
||||
}
|
||||
$(language_detection).val(1);
|
||||
});
|
||||
}else{
|
||||
// Enable a default language when language detection is disabled
|
||||
$(default_locale).first().click();
|
||||
}
|
||||
});
|
||||
|
||||
// Disable language detection if default language enbaled
|
||||
$.each($(default_locale),function(){
|
||||
$(this).change(function(){
|
||||
if(!$(language_detection).parent().hasClass("disable")) {
|
||||
$(language_detection).parent().toggleClass('disable');
|
||||
$(language_detection).val(0);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
var locales = <%= @site.in_use_locales.to_json.html_safe %>;
|
||||
|
||||
$(document).ready(function(){
|
||||
$( ".in_use_locales" ).each( function(){
|
||||
$( this ).parent( "div.togglebox" ).addClass( "disabled" );
|
||||
var val = $( this ).val();
|
||||
if( locales.filter(function(a){ return a == val }).length == 1){
|
||||
$( this ).parent( "div.togglebox" ).removeClass( "disabled" );
|
||||
}
|
||||
})
|
||||
});
|
||||
|
||||
delete locales;
|
||||
|
||||
$(function() {
|
||||
$('a[data-toggle="tab"]').on('click', function (e) {
|
||||
var tab = $(this).attr('href');
|
||||
localStorage.setItem('lastTab', tab);
|
||||
});
|
||||
|
||||
//go to the latest tab, if it exists:
|
||||
var lastTab = localStorage.getItem('lastTab');
|
||||
if (lastTab) {
|
||||
$('a[href='+lastTab+']').click();
|
||||
}
|
||||
});
|
||||
|
||||
$("#site_google_oauth_enabled").on("click",function(){
|
||||
if($(this).is(":checked")){
|
||||
$(".google-oauth-fields").removeAttr("disabled");
|
||||
}else{
|
||||
$(".google-oauth-fields").attr("disabled","disabled");
|
||||
}
|
||||
})
|
||||
$("#restart_server").on("click",function(){
|
||||
$.ajax({
|
||||
url : "<%= admin_site_restart_server_path(@site) %>",
|
||||
type : "get"
|
||||
})
|
||||
return false;
|
||||
})
|
||||
</script>
|
||||
@@ -0,0 +1,646 @@
|
||||
# encoding: utf-8
|
||||
require "json"
|
||||
module ApplicationHelper
|
||||
def render_widget(widget)
|
||||
file = File.join(Rails.root, "app", "templates", "#{@key}", "modules/#{widget}")
|
||||
render :partial => file
|
||||
end
|
||||
|
||||
def render_partial(partial)
|
||||
file = File.join(Rails.root, "app", "templates", "#{@key}", "partial/_#{partial}.html.erb")
|
||||
render :file => file
|
||||
end
|
||||
|
||||
def link_to_show(module_name)
|
||||
"/module/#{module_name}/show"
|
||||
end
|
||||
|
||||
def render_header
|
||||
site = current_site
|
||||
header_file = File.join(Rails.root, "app", "templates", "#{@key}", "/home/header.html.erb")
|
||||
header_file_html = render :file => header_file
|
||||
header = Nokogiri::HTML(header_file_html, nil, "UTF-8")
|
||||
site_logo = header.css("img[src='{{logo_url}}']")[0]
|
||||
if !site_logo.nil?
|
||||
site_logo.remove if site.site_logo.url.nil?
|
||||
end
|
||||
sub_menu_html = site.sub_menu
|
||||
html = header.to_s
|
||||
t = site.title rescue ""
|
||||
html = html.gsub("{{site_name}}",(site.display_title_in_frontend ? t : ""))
|
||||
html = html.gsub("%7B%7Blogo_url%7D%7D",((site.site_logo.url.nil? ? "/assets/default-site-logo.png" : site.site_logo.url) rescue "/assets/default-site-logo.pngs"))
|
||||
html = html.gsub("%7B%7Blogo_url_1%7D%7D",((site.site_logo_1.url.nil? ? "/assets/default-site-logo.png" : site.site_logo_1.url) rescue "/assets/default-site-logo.pngs"))
|
||||
html = html.gsub("%7B%7Bhome_link%7D%7D",((site.home_link.strip.empty? ? "/" : site.home_link) rescue "/"))
|
||||
html = html.gsub("%7B%7Bhome_link_1%7D%7D",((site.home_link_1.strip.empty? ? "/" : site.home_link_1) rescue "/"))
|
||||
html = html.gsub("{{site_title}}",((site.site_title[I18n.locale.to_s].strip.empty? ? "home_page" : site.site_title[I18n.locale.to_s]) rescue "home_page"))
|
||||
html = html.gsub("{{site_title_1}}",((site.site_title_1[I18n.locale.to_s].strip.empty? ? "home_page" : site.site_title_1[I18n.locale.to_s]) rescue "home_page"))
|
||||
if site.sitemap_menu_in_header
|
||||
sitemap = Page.find_by_key(:sitemap).name rescue "Sitemap"
|
||||
sub_menu_html = sub_menu_html + "<a href='/#{I18n.locale.to_s}#{site.site_map_link}'>#{sitemap}</a>"
|
||||
end
|
||||
sub_menu_html = sub_menu_html.nil? ? "" : sub_menu_html
|
||||
html = html.gsub("{{header-data}}",sub_menu_html)
|
||||
html.html_safe
|
||||
end
|
||||
|
||||
def render_site_title
|
||||
site = current_site
|
||||
title = site.title rescue ""
|
||||
if site.title_always_on
|
||||
if !params[:slug].nil?
|
||||
temp_title = params[:slug].sub("-#{params[:uid]}","")
|
||||
temp_title = temp_title.gsub("-"," ")
|
||||
title = "#{temp_title} | #{title}"
|
||||
elsif params[:target_action] == "index"
|
||||
temp_title = Page.find_by(:page_id => params[:page_id]).name
|
||||
title = "#{temp_title} | #{title}"
|
||||
end
|
||||
end
|
||||
title
|
||||
end
|
||||
|
||||
def render_every_page_sharer
|
||||
site = current_site
|
||||
html = "<div class='box-social-share no-print'>"
|
||||
site.every_page_sharer.each do |share|
|
||||
case share
|
||||
when "facebook"
|
||||
html = html + "<div class='fb-share-button' data-type='button'></div>"
|
||||
when "twitter"
|
||||
html = html + "<div class='tw-share-button'><a href='https://twitter.com/share' class='twitter-share-button' data-dnt='true' data-count='none'>Tweet</a></div>"
|
||||
when "google"
|
||||
html = html + "<div class='g-plus' data-action='share' data-annotation='bubble' ></div>"
|
||||
when "printer"
|
||||
html = html + "<div class='print-button'><a href='#' title='print' onclick='window.print();return false;'><i class='fa fa-print'></i><span class='print-txt'>#{t(:print_this_page)}</span></div>"
|
||||
end
|
||||
end
|
||||
html = html + "</div>"
|
||||
html.html_safe
|
||||
end
|
||||
|
||||
def render_google_analytics
|
||||
html = current_site.google_analytics rescue ""
|
||||
metas = current_site.meta_tags.split("\r\n") rescue []
|
||||
metas.each do |meta|
|
||||
m = meta.split(" ::: ")
|
||||
html = html + "<meta name='#{m.first}' content='#{m.last}'>"
|
||||
end
|
||||
html.html_safe rescue ""
|
||||
end
|
||||
|
||||
def render_footer
|
||||
site = current_site
|
||||
footer_file = File.join('../templates', "#{@key}", "/home/footer.html.erb")
|
||||
footer_file_html = render :file => footer_file
|
||||
footer = Nokogiri::HTML(footer_file_html, nil, "UTF-8")
|
||||
html = footer.to_s
|
||||
site_footer = site.footer
|
||||
if site.enable_terms_of_use
|
||||
site_footer = site_footer + "<a href='/#{I18n.locale.to_s}#{site.terms_of_use_link}'>Terms of use</a>"
|
||||
end
|
||||
site_footer = site_footer.nil? ? "" : site_footer
|
||||
html = html.gsub("{{footer-data}}",site_footer)
|
||||
counter = Page.root.view_count.to_s rescue ""
|
||||
counter = t(:visitors_count) + " : " + counter
|
||||
html = html.gsub("{{site-counter}}",counter)
|
||||
|
||||
if site.enable_last_update
|
||||
updated_at = get_last_updated.first.updated_at.to_s rescue ""
|
||||
updated_at = t(:last_updated_at) + " : <span class='last-updated-date' date-format='%Y-%m-%d %H:%M'>" + updated_at + "</span>" if updated_at != ""
|
||||
html = html.gsub("{{last-updated}}",updated_at)
|
||||
else
|
||||
html = html.gsub("{{last-updated}}","")
|
||||
end
|
||||
|
||||
html.html_safe
|
||||
end
|
||||
|
||||
def get_last_updated
|
||||
apps = ['bulletin', 'page_context', 'web_link']
|
||||
a = {}
|
||||
apps.each do |module_app|
|
||||
module_app_class = module_app.classify.constantize rescue nil
|
||||
if !module_app_class.nil?
|
||||
objects = module_app_class.order_by([:updated_at, :desc]).limit(1)
|
||||
objects.each do |object|
|
||||
a.merge!(object => object.updated_at) unless (object.archived rescue nil)
|
||||
end
|
||||
end
|
||||
end
|
||||
sorted_objects = a.sort {|a,b| b[1]<=>a[1]}
|
||||
return sorted_objects.first
|
||||
end
|
||||
|
||||
def render_social_share
|
||||
site = current_site
|
||||
share_file = File.join('../templates', "#{@key}", "/home/socialshare.html.erb")
|
||||
share_file_html = render :file => share_file
|
||||
sharer = Nokogiri::HTML(share_file_html, nil, "UTF-8")
|
||||
html = sharer.to_s
|
||||
site_sharer = site.social_share
|
||||
site_sharer = site_sharer.nil? ? "" : site_sharer
|
||||
html = html.gsub("{{social-share-data}}",site_sharer)
|
||||
html.html_safe
|
||||
end
|
||||
|
||||
def render_orbit_bar
|
||||
if is_mobile_layout_active
|
||||
orbit_bar_file = File.join('../views', "orbit_bar", 'index_mobile.html.erb')
|
||||
else
|
||||
orbit_bar_file = File.join('../views', "orbit_bar", 'index.html.erb')
|
||||
end
|
||||
orbit_bar_file_html = render :file => orbit_bar_file
|
||||
orbit_bar_file_html.html_safe
|
||||
end
|
||||
|
||||
def render_menu
|
||||
# menu_html = Rails.cache.fetch(['main_menu',request.original_fullpath, I18n.locale], race_condition_ttl: 2.seconds) do
|
||||
# json_file = File.read(File.join(Rails.root, 'public', "menu.json"))
|
||||
# @items = JSON.parse(json_file)
|
||||
if $mobile.blank?
|
||||
@pages = Page.root.sorted_published_child_pages
|
||||
else
|
||||
@pages = Page.root.sorted_published_child_pages_for_mobile
|
||||
end
|
||||
|
||||
def create_json(pages)
|
||||
item = {}
|
||||
pages.each do |page|
|
||||
next if !page.user_can_access?(current_user)
|
||||
if page.child_page.size > 0
|
||||
if page.page_type == "page"
|
||||
if $mobile.blank?
|
||||
item["#{page.page_id}"] = {"name" => page.name, "url"=> "/#{locale.to_s}" + page.url, "children"=>create_json(page.sorted_published_child_pages), "target" => "_self"}
|
||||
else
|
||||
item["#{page.page_id}"] = {"name" => page.name, "url"=> "/#{locale.to_s}" + page.url, "children"=>create_json(page.sorted_published_child_pages_for_mobile), "target" => "_self"}
|
||||
end
|
||||
elsif page.page_type == "link"
|
||||
target = get_target(page.external_url)
|
||||
if $mobile.blank?
|
||||
item["#{page.page_id}"] = {"name" => page.name, "url"=> page.external_url, "children"=>create_json(page.sorted_published_child_pages), "target" => target}
|
||||
else
|
||||
item["#{page.page_id}"] = {"name" => page.name, "url"=> page.external_url, "children"=>create_json(page.sorted_published_child_pages_for_mobile), "target" => target}
|
||||
end
|
||||
end
|
||||
else
|
||||
if page.page_type == "page"
|
||||
item["#{page.page_id}"] = {"name" => page.name, "url"=> "/#{locale.to_s}" + page.url, "target" => "_self"}
|
||||
elsif page.page_type == "link"
|
||||
item["#{page.page_id}"] = {"name" => page.name, "url"=> page.external_url, "target" => get_target(page.external_url)}
|
||||
end
|
||||
end
|
||||
end
|
||||
item
|
||||
end
|
||||
@items = create_json(@pages)
|
||||
menu_file = File.open(File.join(Rails.root, 'app', 'templates', "#{@key}", "/home/menu.html.erb"))
|
||||
doc = Nokogiri::HTML(menu_file, nil, "UTF-8")
|
||||
menu_file.close
|
||||
|
||||
temp = []
|
||||
@menus = []
|
||||
@menus_items = []
|
||||
|
||||
temp << doc.css("*[data-menu-level='0']")
|
||||
temp << doc.css("*[data-menu-level='1']")
|
||||
temp << doc.css("*[data-menu-level='2']")
|
||||
|
||||
|
||||
temp[0] = temp[0].to_s.gsub(temp[1].to_s,"{{level}}")
|
||||
temp[1] = temp[1].to_s.gsub(temp[2].to_s,"{{level}}")
|
||||
temp[2] = temp[2].to_s
|
||||
|
||||
|
||||
temp.each_with_index do |menu,i|
|
||||
t = Nokogiri::HTML(menu, nil, "UTF-8")
|
||||
a = t.css("*[data-menu-link='true']")
|
||||
a[0]["href"] = "href_here"
|
||||
a[0]["target"] = "target_here"
|
||||
li = t.css("*[data-menu-level='#{i}'] > *")
|
||||
@menus_items << li.to_html
|
||||
ul = t.css("*[data-menu-level='#{i}']")
|
||||
ul[0].inner_html = "{{here}}"
|
||||
@menus << ul[0].to_html
|
||||
end
|
||||
|
||||
def create_menu(items,level)
|
||||
html = ""
|
||||
items.each do |key,item|
|
||||
li = @menus_items[level].gsub("href_here",(item["url"] || ""))
|
||||
li = li.gsub("{{link_name}}",(item["name"] || ""))
|
||||
li = li.gsub("target_here",(item["target"] || ""))
|
||||
li = request.original_fullpath == item['url'] ? li.gsub("{{active}}","active") : li.gsub("{{active}}","")
|
||||
|
||||
if item["children"] && !item["children"].empty?
|
||||
li = li.gsub("{{level}}",create_menu(item["children"],level + 1))
|
||||
else
|
||||
li = li.gsub("{{level}}","")
|
||||
end
|
||||
html = html + li
|
||||
end
|
||||
html = @menus[level].gsub("{{here}}",html)
|
||||
html = html.gsub("{{class_level}}",level.to_s)
|
||||
html
|
||||
end
|
||||
h = create_menu(@items,0)
|
||||
h.html_safe
|
||||
# end
|
||||
|
||||
# menu_html
|
||||
end
|
||||
|
||||
def render_view(overridehtml=nil)
|
||||
|
||||
def render_link_to_edit(html, url_to_edit)
|
||||
if html.scan("{{link_to_edit}}").length == 0
|
||||
html = url_to_edit.blank? ? html : html + "<p class='admin-edit text-right'><a class='btn btn-primary' href='#{url_to_edit}'><i class='icon-edit'></i> #{t(:edit)}</a></p>"
|
||||
else
|
||||
html = url_to_edit.blank? ? html.gsub("{{link_to_edit}}","") : html.gsub("{{link_to_edit}}","<p class='admin-edit text-right'><a class='btn btn-primary' href='#{url_to_edit}'><i class='icon-edit'></i> #{t(:edit)}</a></p>")
|
||||
end
|
||||
return html
|
||||
end
|
||||
|
||||
def parsing_repeats_again(elements,d,level)
|
||||
newhtml = []
|
||||
oldhtml = []
|
||||
elements.each do |el|
|
||||
html_to_render = ""
|
||||
data_name = el.attr("data-list")
|
||||
wrap_elements = el.css("*[data-list][data-level='#{level}']")
|
||||
if d[data_name]
|
||||
d[data_name].each_with_index do |item,i|
|
||||
element = el.inner_html
|
||||
if wrap_elements.count > 0
|
||||
htmls = parsing_repeats_again(wrap_elements,d[data_name][i], level + 1)
|
||||
htmls[0].each_with_index do |html,i|
|
||||
element = element.gsub(html,htmls[1][i])
|
||||
end
|
||||
end
|
||||
item.each do |key,value|
|
||||
if !value.kind_of?(Array)
|
||||
value = value.nil? ? "" : value
|
||||
element = element.gsub("{{#{key}}}",value.to_s.html_safe)
|
||||
element = element.gsub("%7B%7B#{key}%7D%7D",value.to_s.html_safe)
|
||||
element = render_link_to_edit(element, value) if key.eql?("url_to_edit")
|
||||
end
|
||||
end
|
||||
html_to_render = html_to_render + element
|
||||
end
|
||||
temp = el.to_s
|
||||
oldhtml << temp
|
||||
temp = temp.gsub(el.inner_html, html_to_render)
|
||||
newhtml << temp
|
||||
end
|
||||
end
|
||||
[oldhtml,newhtml]
|
||||
end
|
||||
|
||||
|
||||
if params[:target_action] == "index"
|
||||
filename = overridehtml.nil? ? params[:layout_type] : overridehtml
|
||||
f = File.join(Rails.root, 'app', 'templates', "#{@key}", 'modules', params[:target_controller].singularize, "#{filename}.html.erb")
|
||||
if !File.exists?f
|
||||
f = File.join(Rails.root, 'app', 'templates', "#{@key}", 'modules', params[:target_controller].singularize, "index.html.erb")
|
||||
if !File.exists?f
|
||||
return "<div class='well'>Maybe the administrator has changed the theme, please select the index page design again from the page settings.</div>".html_safe
|
||||
end
|
||||
end
|
||||
file = File.open(f)
|
||||
doc = Nokogiri::HTML(file, nil, "UTF-8")
|
||||
file.close
|
||||
controller = "#{params[:target_controller].capitalize}_controller".classify.constantize.new
|
||||
begin
|
||||
data = controller.send("#{params[:target_action]}")# rescue nil
|
||||
rescue Exception => e
|
||||
write_debug_file(e,params[:target_controller],params[:target_action]) if Site::DEBUG
|
||||
end
|
||||
if !data.nil?
|
||||
wrap_elements = doc.css("*[data-list][data-level='0']")
|
||||
htmls = parsing_repeats_again(wrap_elements,data,1)
|
||||
html = doc.to_s
|
||||
htmls[0].each_with_index do |h,i|
|
||||
html = html.gsub(h,htmls[1][i])
|
||||
end
|
||||
extras = data["extras"] || {}
|
||||
extras["page-title"] = Page.find_by(:page_id => params[:page_id]).name rescue "" if !extras["page-title"]
|
||||
extras.each do |key,value|
|
||||
value = value.nil? ? "" : value
|
||||
html = html.gsub("{{#{key}}}",value.to_s.html_safe)
|
||||
html = html.gsub("%7B%7B#{key}%7D%7D",value.to_s.html_safe)
|
||||
end
|
||||
total_pages = data['total_pages'].to_i rescue 1
|
||||
if total_pages > 1
|
||||
html = html.gsub("{{pagination_goes_here}}",create_pagination(total_pages))
|
||||
else
|
||||
html = html.gsub("{{pagination_goes_here}}","");
|
||||
end
|
||||
html.html_safe
|
||||
else
|
||||
return "<div class='well'>No content to show.</div>".html_safe
|
||||
end
|
||||
else
|
||||
filename = overridehtml.nil? ? params[:target_action] : overridehtml
|
||||
f = File.join(Rails.root, 'app', 'templates', "#{@key}", 'modules', params[:target_controller].singularize, "#{filename}.html.erb")
|
||||
if File.exists?f
|
||||
file = File.open(f)
|
||||
doc = Nokogiri::HTML(file, nil, "UTF-8")
|
||||
file.close
|
||||
controller = "#{params[:target_controller].capitalize}_controller".classify.constantize.new
|
||||
begin
|
||||
data = controller.send("#{params[:target_action]}")# rescue nil
|
||||
rescue Exception => e
|
||||
write_debug_file(e,params[:target_controller],params[:target_action]) if Site::DEBUG
|
||||
end
|
||||
if data.nil?
|
||||
return "<div class='well'> No content to show. </div>".html_safe
|
||||
end
|
||||
|
||||
if data.blank? || data.empty?
|
||||
file = File.open("#{Rails.root}/app/views/errors/404.html")
|
||||
doc = Nokogiri::HTML(file, nil, "UTF-8")
|
||||
file.close
|
||||
doc.to_html.html_safe
|
||||
else
|
||||
unless data['impressionist'].blank?
|
||||
Thread.new do
|
||||
impression = data['impressionist'].impressions.create
|
||||
impression.user_id = request.session['user_id']
|
||||
impression.controller_name = params[:target_controller]
|
||||
impression.action_name = params[:target_action]
|
||||
impression.ip_address = request.remote_ip
|
||||
impression.session_hash = request.session.id
|
||||
impression.request_hash = @impressionist_hash
|
||||
impression.referrer = request.referrer
|
||||
impression.save
|
||||
end
|
||||
data['impressionist'].inc(view_count: 1)
|
||||
data["data"]["view_count"] = data["impressionist"].view_count if data["data"].present?
|
||||
end
|
||||
wrap_elements = doc.css("*[data-list][data-level='0']")
|
||||
if wrap_elements.count == 0
|
||||
wrap_element_html = doc.to_s
|
||||
el = wrap_element_html
|
||||
data.each do |key,value|
|
||||
next if key.eql? 'impressionist'
|
||||
value = value.nil? ? "" : value
|
||||
el = el.gsub("{{#{key}}}",value.to_s.html_safe)
|
||||
el = el.gsub("%7B%7B#{key}%7D%7D",value.to_s.html_safe)
|
||||
end
|
||||
el.html_safe
|
||||
else
|
||||
keys = data.keys
|
||||
not_array_key = nil
|
||||
data.keys.each do |key|
|
||||
not_array_key = key if data["#{key}"].kind_of?(Hash)
|
||||
end
|
||||
htmls = parsing_repeats_again(wrap_elements,data,1)
|
||||
html = doc.to_s
|
||||
htmls[0].each_with_index do |h,i|
|
||||
html = html.gsub(h,htmls[1][i])
|
||||
end
|
||||
extras = data["#{not_array_key}"] || {}
|
||||
extras.each do |key,value|
|
||||
next if key.eql? 'impressionist'
|
||||
value = value.nil? ? "" : value
|
||||
html = html.gsub("{{#{key}}}",value.to_s)
|
||||
html = html.gsub("%7B%7B#{key}%7D%7D",value.to_s)
|
||||
end
|
||||
html = render_link_to_edit(html, data["url_to_edit"]) if !data["url_to_edit"].nil?
|
||||
total_pages = data['total_pages'].to_i rescue 1
|
||||
if total_pages > 1
|
||||
html = html.gsub("{{pagination_goes_here}}",create_pagination(total_pages))
|
||||
else
|
||||
html = html.gsub("{{pagination_goes_here}}","");
|
||||
end
|
||||
html.html_safe
|
||||
end
|
||||
end
|
||||
else
|
||||
return "<div class='well'>There is a problem with the design. We will try to fix it as soon as possible. Sorry for the inconvenience!! :(</div>".html_safe
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def action_data(overrideaction=nil)
|
||||
overrideaction = overrideaction.nil? ? params[:target_action] : overrideaction
|
||||
controller = "#{params[:target_controller].capitalize}_controller".classify.constantize.new
|
||||
begin
|
||||
data = controller.send("#{overrideaction}")# rescue nil
|
||||
rescue Exception => e
|
||||
write_debug_file(e,params[:target_controller],overrideaction) if Site::DEBUG
|
||||
end
|
||||
data
|
||||
end
|
||||
|
||||
def active_for_controllers(*controller_names)
|
||||
(controller_names.include?(controller.controller_name) || controller_names.include?(request.fullpath)) ? 'active' : nil
|
||||
end
|
||||
|
||||
def visible_for_controllers(*controller_names)
|
||||
(controller_names.include?(controller.controller_name) || controller_names.include?(request.fullpath)) ? '' : 'hide'
|
||||
end
|
||||
|
||||
def active_for_action(controller_name, action_name)
|
||||
((controller.controller_name.eql?(controller_name) || request.fullpath.eql?(controller_name)) && controller.action_name.eql?(action_name)) ? 'active' : nil
|
||||
end
|
||||
|
||||
def link_back(custom_class=nil, params="")
|
||||
case custom_class
|
||||
when nil
|
||||
link_to t('back'), get_go_back + params, :class => 'nav'
|
||||
else
|
||||
link_to t('back'), get_go_back + params, :class => custom_class
|
||||
end
|
||||
end
|
||||
|
||||
def switch_language(loc)
|
||||
url = request.original_fullpath
|
||||
|
||||
locale = url.include?("zh_cn") ? :zh_cn : I18n.locale
|
||||
|
||||
url = url.gsub("/#{locale.to_s}/","/#{loc.to_s}/")
|
||||
url = url.gsub("locale=#{locale.to_s}","locale=#{loc.to_s}") if url == request.original_fullpath
|
||||
url = url + "#{url.include?("?") ? "&" : "?"}locale=#{loc.to_s}" if url == request.original_fullpath and (!url.include?('/'+locale.to_s) or !url.include?(locale.to_s+'='))
|
||||
url
|
||||
end
|
||||
|
||||
# Clean the link back
|
||||
def get_go_back
|
||||
begin
|
||||
if request.url.include?('locale=')
|
||||
session[:last_page]
|
||||
else
|
||||
session[:last_page] = remove_locale(request.referer)
|
||||
end
|
||||
rescue
|
||||
"/#{params[:controller]}"
|
||||
end
|
||||
end
|
||||
|
||||
def show_avatar(user)
|
||||
image_tag(user.avatar.thumb.url)
|
||||
end
|
||||
|
||||
def render_sitemap
|
||||
items = action_data
|
||||
def node(items, level)
|
||||
class_name = nil
|
||||
case level
|
||||
when 0
|
||||
class_name = "sitemap-list level-1"
|
||||
when 1
|
||||
class_name = "sitemap-list level-2"
|
||||
when 2
|
||||
class_name = "sitemap-list level-3"
|
||||
end
|
||||
html = "<ul class='#{class_name}'>"
|
||||
items.each do |key,item|
|
||||
if item["children"] && !item["children"].empty?
|
||||
url = item["url"]
|
||||
target = item["target"]
|
||||
html = html + "<li><a href='#{url}' target='#{target}'>#{key}</a>"
|
||||
html = html + node(item["children"],level + 1)
|
||||
html = html + "</li>"
|
||||
else
|
||||
target = item["target"]
|
||||
url = item["url"]
|
||||
html = html + "<li><a href='#{url}' target='#{target}'>#{key}</a></li>"
|
||||
end
|
||||
end
|
||||
html = html + "</ul>"
|
||||
html
|
||||
end
|
||||
html = node(items,0)
|
||||
html.html_safe
|
||||
end
|
||||
|
||||
def show_attribute_value(value)
|
||||
if value.kind_of? Hash
|
||||
result = []
|
||||
value.each{|t| result.push(t.last)}
|
||||
result.join ","
|
||||
else
|
||||
value
|
||||
end
|
||||
end
|
||||
|
||||
def create_pagination(total_pages)
|
||||
file = File.join(Rails.root, 'app', 'templates', "#{@key}", 'home', "pagination.html.erb")
|
||||
html = ""
|
||||
if File.exists?file
|
||||
file = File.open(file)
|
||||
doc = Nokogiri::HTML(file, nil, "UTF-8")
|
||||
file.close
|
||||
querystring = request.GET rescue {}
|
||||
querystring.delete("page_no")
|
||||
paginationobj = doc.css("*[data-pagination='true']").first
|
||||
in_html = first = last = nextpage = prevpage = paginationobj.inner_html
|
||||
f_html = ""
|
||||
current_page_number = OrbitHelper.page_number
|
||||
if current_page_number > 1
|
||||
first = first.gsub("%7B%7Bpagination_link%7D%7D","?page_no=1&#{querystring.to_query}")
|
||||
first = first.gsub("{{page_number}}",t(:pagination_first))
|
||||
first = first.gsub("{{pagination_active}}","")
|
||||
f_html = f_html + first
|
||||
end
|
||||
start_number = current_page_number - 2
|
||||
end_number = current_page_number + 2
|
||||
if end_number > total_pages
|
||||
end_number = total_pages
|
||||
start_number = total_pages - 4
|
||||
end
|
||||
if start_number < 1
|
||||
start_number = 1
|
||||
end_number = 5
|
||||
end
|
||||
end_number = end_number > total_pages ? total_pages : end_number
|
||||
(start_number..end_number).each do |i|
|
||||
h = in_html
|
||||
h = h.gsub("%7B%7Bpagination_link%7D%7D","?page_no=#{i.to_s}&#{querystring.to_query}")
|
||||
h = h.gsub("{{page_number}}",i.to_s)
|
||||
h = h.gsub("{{pagination_active}}",(i == current_page_number ? "active" : ""))
|
||||
f_html = f_html + h
|
||||
end
|
||||
if current_page_number > 1
|
||||
prevpage = prevpage.gsub("%7B%7Bpagination_link%7D%7D","?page_no=#{current_page_number - 1}&#{querystring.to_query}")
|
||||
prevpage = prevpage.gsub("{{page_number}}",(I18n.locale == :zh_tw) ? "上一頁" : "Prevpage")
|
||||
prevpage = prevpage.gsub("{{pagination_active}}","")
|
||||
f_html = f_html + prevpage
|
||||
end
|
||||
|
||||
if current_page_number < total_pages
|
||||
nextpage = nextpage.gsub("%7B%7Bpagination_link%7D%7D","?page_no=#{current_page_number + 1}&#{querystring.to_query}")
|
||||
nextpage = nextpage.gsub("{{page_number}}",(I18n.locale == :zh_tw) ? "下一頁" : "Nextpage")
|
||||
nextpage = nextpage.gsub("{{pagination_active}}","")
|
||||
f_html = f_html + nextpage
|
||||
|
||||
last = last.gsub("%7B%7Bpagination_link%7D%7D","?page_no=#{total_pages}&#{querystring.to_query}")
|
||||
last = last.gsub("{{page_number}}",t(:pagination_last))
|
||||
last = last.gsub("{{pagination_active}}","")
|
||||
f_html = f_html + last
|
||||
end
|
||||
paginationobj.inner_html = f_html
|
||||
html = paginationobj.to_s
|
||||
end
|
||||
html
|
||||
end
|
||||
|
||||
def get_target(link)
|
||||
target = "_blank"
|
||||
if !link.nil? && link.starts_with?("http")
|
||||
link = link.split("?").first
|
||||
temp_url = URI.parse(link)
|
||||
if temp_url.host.nil?
|
||||
target = "_self"
|
||||
end
|
||||
elsif !link.nil? && !link.starts_with?("http")
|
||||
target = "_self"
|
||||
end
|
||||
target
|
||||
end
|
||||
|
||||
def write_debug_file(e,controller_name,action_name)
|
||||
url_dir_name = request.fullpath.split("?")[0]
|
||||
url_dir_name = URI.decode(url_dir_name)
|
||||
url_dir_name = (url_dir_name == "/" ? "home" : url_dir_name.sub("/","").gsub("/","_").gsub("-","_").gsub(" ","_"))
|
||||
directory_name = "tmp/debug/#{url_dir_name}"
|
||||
FileUtils.mkdir_p(directory_name) unless File.exists?(directory_name)
|
||||
fn = "#{directory_name}/#{controller_name}_#{action_name}.html"
|
||||
error_trace_spans = ""
|
||||
e.backtrace.each do |bt|
|
||||
error_trace_spans = error_trace_spans + "<span>#{bt}</span><br />"
|
||||
end
|
||||
con = "#{controller_name.capitalize}_controller".classify.constantize
|
||||
File.open(fn, "w"){ |file|
|
||||
file.puts "<html>
|
||||
<head>
|
||||
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'>
|
||||
<meta charset=UTF-8'>
|
||||
<title>Debug result</title>
|
||||
</head>
|
||||
<body>
|
||||
<h3>Error Message</h3>
|
||||
<div class='error-message'>
|
||||
<h2><i>#{e.message}</i></h2>
|
||||
</div>
|
||||
<h3>Request Details</h3>
|
||||
<div class='request-details'>
|
||||
<span>Url : <b>#{URI.decode(request.url)}</b></span><br />
|
||||
<span>Controller : <b>#{con.to_s}</b> </span><br />
|
||||
<span>Action : <b>#{action_name.capitalize}</b> </span>
|
||||
</div>
|
||||
<h3>Error Trace</h3>
|
||||
<div class='error-trace'>
|
||||
#{error_trace_spans}
|
||||
</div>
|
||||
<h3>Params</h3>
|
||||
<div class='params'>
|
||||
#{OrbitHelper.params}
|
||||
</div>
|
||||
</body>
|
||||
</html>"
|
||||
|
||||
}
|
||||
end
|
||||
|
||||
end
|
||||
@@ -0,0 +1,61 @@
|
||||
/**
|
||||
* @license Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
|
||||
* For licensing, see LICENSE.html or http://ckeditor.com/license
|
||||
*/
|
||||
|
||||
|
||||
CKEDITOR.editorConfig = function( config ) {
|
||||
config.uiColor = '#e6e6e6';
|
||||
config.defaultLanguage = "en";
|
||||
if(typeof currentLocaleForCKEDITOR != "undefined"){
|
||||
config.language = currentLocaleForCKEDITOR;
|
||||
}else{
|
||||
config.language = '<%= (I18n.locale.to_s == "zh_tw" || I18n.locale.to_s == "zh_cn" ? "zh" : I18n.locale.to_s) %>';
|
||||
}
|
||||
config.height = 400;
|
||||
config.resize_minHeight = 400;
|
||||
config.toolbarCanCollapse = true;
|
||||
config.allowedContent = true;
|
||||
config.pasteFromWordRemoveFontStyles=false;
|
||||
config.pasteFromWordRemoveStyles=false;
|
||||
config.plugins = 'dialogui,dialog,about,a11yhelp,dialogadvtab,basicstyles,blockquote,clipboard,button,panelbutton,panel,floatpanel,colorbutton,colordialog,templates,menu,contextmenu,resize,toolbar,elementspath,enterkey,entities,popup,filebrowser,find,image,fakeobjects,floatingspace,listblock,richcombo,font,format,horizontalrule,htmlwriter,iframe,wysiwygarea,indent,indentblock,indentlist,justify,menubutton,link,list,liststyle,magicline,maximize,newpage,pastetext,pastefromword,removeformat,selectall,showblocks,showborders,sourcearea,specialchar,scayt,stylescombo,tab,table,tabletools,undo,wsc,youtube,codemirror';
|
||||
|
||||
config.toolbarGroups = [
|
||||
{ name: 'document', groups: [ 'mode', 'document', 'doctools' ] },
|
||||
{ name: 'clipboard', groups: [ 'clipboard', 'undo' ] },
|
||||
{ name: 'editing', groups: [ 'find', 'selection', 'spellchecker' ] },
|
||||
{ name: 'links' },
|
||||
{ name: 'insert' },
|
||||
{ name: 'forms' },
|
||||
{ name: 'tools' },
|
||||
{ name: 'others' },
|
||||
{ name: 'basicstyles', groups: [ 'basicstyles', 'cleanup' ] },
|
||||
{ name: 'paragraph', groups: [ 'list', 'indent', 'blocks', 'align' ] },
|
||||
{ name: 'styles' },
|
||||
{ name: 'colors' },
|
||||
{ name: 'about' }
|
||||
];
|
||||
|
||||
config.skin = 'moono';
|
||||
|
||||
config.filebrowserBrowseUrl = "<%= Rails.application.routes.url_helpers.admin_assets_path %>";
|
||||
config.filebrowserImageBrowseUrl = "<%= Rails.application.routes.url_helpers.admin_assets_path %>";
|
||||
|
||||
//Font Config
|
||||
config.font_names = 'Arial;Calibri;Comic Sans MS;Courier New;Georgia;Helvetica;Lucida Sans Unicode;Tahoma;Times New Roman;Trebuchet MS;Verdana;微軟正黑體;標楷體;新細明體';
|
||||
|
||||
config.fontSize_sizes = '0.5em;0.563em;0.625em;0.688em;0.750em;0.813em;0.875em;0.938em;1em;1.063em;1.125em;1.250em;1.313em;1.375em;1.438em;1.5em;1.75em;2.25em;3em;4.5em;';
|
||||
|
||||
config.enterMode = CKEDITOR.ENTER_BR;
|
||||
config.shiftEnterMode = CKEDITOR.ENTER_BR;
|
||||
config.templates_files = [ '/assets/ckeditor/orbit_templates.js' ];
|
||||
};
|
||||
|
||||
CKEDITOR.on('instanceReady',function(){
|
||||
$('.cke_button').tooltip({
|
||||
position: {
|
||||
my: "center bottom-4",
|
||||
at: "center top"
|
||||
}
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,212 @@
|
||||
class MemberProfile < ApplicationController
|
||||
include Mongoid::Document
|
||||
include Mongoid::Timestamps
|
||||
include Mongoid::Attributes::Dynamic
|
||||
include Mongoid::Tree
|
||||
include Mongoid::Tree::Ordering
|
||||
|
||||
include OrbitModel::Status
|
||||
include MemberSlug
|
||||
|
||||
field :first_name, type: String, localize: true
|
||||
field :last_name, type: String, localize: true
|
||||
field :sex
|
||||
field :sid
|
||||
field :office_tel
|
||||
field :birthday, type: Date
|
||||
field :address, type: String, localize: true
|
||||
field :personal_website
|
||||
field :fax, type: String, localize: true
|
||||
field :mobile_no, type: String, localize: true
|
||||
field :autobiography, type: String, localize: true
|
||||
field :email, type: String
|
||||
field :position, type: Integer
|
||||
field :rss2_id
|
||||
field :public_privacy, type: Array, default: []
|
||||
field :logged_in_privacy, type: Array, default: []
|
||||
field :locked_privacy, type: Array, default: []
|
||||
|
||||
VALID_EMAIL_FORMAT = /\A[^@\s]+@([^@.\s]+\.)+[^@.\s]+\z/
|
||||
validates :email, uniqueness: true, format: { with: VALID_EMAIL_FORMAT }, if: :email_present?
|
||||
validates :position, uniqueness: true
|
||||
|
||||
has_one :user
|
||||
has_and_belongs_to_many :roles
|
||||
has_and_belongs_to_many :role_statuses
|
||||
has_and_belongs_to_many :member_tags
|
||||
|
||||
has_many :member_profile_field_values
|
||||
accepts_nested_attributes_for :member_profile_field_values, allow_destroy: true
|
||||
|
||||
has_many :attribute_values
|
||||
accepts_nested_attributes_for :attribute_values, allow_destroy: true
|
||||
|
||||
has_many :personal_plugin_intros
|
||||
|
||||
scope :can_display, ->{where(is_hidden: false).order_by([:is_top,:desc],[:created_at,:desc])}
|
||||
before_save :assign_default_position, :if => :assign_default_position?
|
||||
|
||||
before_destroy :delete_personal_plugin_data
|
||||
|
||||
mount_uploader :avatar, AvatarUploader
|
||||
# paginates_per 10
|
||||
|
||||
def get_avatar
|
||||
avatar = (self.avatar.thumb.url == "thumb_person.png" ? "/assets/thumb_person.png" : self.avatar.thumb.url rescue "/assets/thumb_person.png")
|
||||
avatar
|
||||
end
|
||||
|
||||
def name
|
||||
if self.first_name != "" || self.last_name != ""
|
||||
I18n.locale.eql?(:zh_tw) ? "#{self.last_name} #{self.first_name}" : "#{self.first_name} #{self.last_name}"
|
||||
else
|
||||
@locale = I18n.locale
|
||||
@site_in_use_locales = current_site.in_use_locales
|
||||
@name = ""
|
||||
@site_in_use_locales.each_with_index do |locale,i|
|
||||
I18n.locale = locale
|
||||
@name = (I18n.locale.eql?(:zh_tw) ? "#{self.last_name} #{self.first_name}" : "#{self.first_name} #{self.last_name}")
|
||||
@name = @name.gsub(' ','').strip
|
||||
break if @name !=""
|
||||
end
|
||||
I18n.locale = @locale
|
||||
return @name
|
||||
end
|
||||
end
|
||||
|
||||
def get_privacy_type_for_field(id)
|
||||
status = nil
|
||||
if self.public_privacy.include?(id)
|
||||
status = "public"
|
||||
elsif self.logged_in_privacy.include?(id)
|
||||
status = "logged_in"
|
||||
elsif self.locked_privacy.include?(id)
|
||||
status = "locked"
|
||||
else
|
||||
status = "public"
|
||||
end
|
||||
status
|
||||
end
|
||||
|
||||
def name_translations
|
||||
{
|
||||
"en" => "#{self.first_name_translations["en"]} #{self.last_name_translations["zh_tw"]}",
|
||||
"zh_tw" => "#{self.last_name_translations["zh_tw"]} #{self.first_name_translations["zh_tw"]}"
|
||||
}
|
||||
end
|
||||
|
||||
def disable_role=(var)
|
||||
var[:id].each do |id,val|
|
||||
if (val=="true")
|
||||
self.role_ids.reject!{|t| t.to_s == id}
|
||||
elsif(val=="false")
|
||||
self.role_ids += Array(id)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def new_attribute_values=(fields,attribute_type=nil)
|
||||
fields.each do |key,field|
|
||||
if attribute_type.eql?("role")
|
||||
self.attribute_values.build(field)
|
||||
else
|
||||
self.member_profile_field_values.build(field)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def get_attribute_value(attribute_field,attribute_type=nil)
|
||||
if attribute_type.eql?("role")
|
||||
AttributeValue.find_by(attribute_field_id: attribute_field.id, member_profile_id: self.id)
|
||||
else
|
||||
MemberProfileFieldValue.find_by(member_profile_field_id: attribute_field.id, member_profile_id: self.id)
|
||||
end
|
||||
end
|
||||
|
||||
def get_attribute_values(attribute_type=nil)
|
||||
if attribute_type.eql?("role")
|
||||
@attribute_values = self.attribute_values rescue nil
|
||||
else
|
||||
@attribute_values = self.member_profile_field_values rescue nil
|
||||
end
|
||||
end
|
||||
|
||||
def get_value_from_field_id(field_id,attribute_type=nil)
|
||||
if attribute_type.eql?("role")
|
||||
values = get_attribute_values(attribute_type)
|
||||
value = values.detect {|value| value.attribute_field_id == field_id} rescue nil
|
||||
value ? value : nil
|
||||
else
|
||||
values = get_attribute_values
|
||||
value = values.detect {|value| value.member_profile_field_id == field_id} rescue nil
|
||||
value ? value : nil
|
||||
end
|
||||
end
|
||||
|
||||
def self.get_member_list_attribute_field(field_key, attribute_type=nil)
|
||||
if attribute_type.eql?("role")
|
||||
AttributeField.find_by(key: field_key)
|
||||
else
|
||||
MemberProfileField.find_by(key: field_key)
|
||||
end
|
||||
end
|
||||
|
||||
def self.get_member_list_attribute_value(member_profile_id,field_id,attribute_type=nil)
|
||||
if attribute_type.eql?("role")
|
||||
AttributeValue.find_by(member_profile_id: member_profile_id, attribute_field_id: field_id)
|
||||
else
|
||||
MemberProfileFieldValue.find_by(member_profile_id: member_profile_id, member_profile_field_id: field_id)
|
||||
end
|
||||
end
|
||||
|
||||
def self.get_role_member_data_by_sort(field_key, role_status_id)
|
||||
a = Array.new
|
||||
attribute_field_data = get_member_list_attribute_field(field_key,"role")
|
||||
self.where(role_status_ids: role_status_id).desc(:_id).collect{|t| a << [ get_member_list_attribute_value(t.id,attribute_field_data.id)['val'].to_i, t ] }
|
||||
member_data = a.sort
|
||||
member_data_tmp = member_data.collect {|v| v[1] }
|
||||
end
|
||||
|
||||
def get_attribute_data(field)
|
||||
if field["key"] == "member_tags"
|
||||
params = OrbitHelper.params
|
||||
data = self.send(field["key"]).collect{|tag| "<span class='label label-info'><a title='#{tag.title}' style='color:#fff;' href='/#{I18n.locale.to_s}#{params["url"]}/?tag=#{tag.id.to_s}'>#{tag.title}</a></span> "}.join("")
|
||||
else
|
||||
data = self.send(field["key"]) rescue ""
|
||||
end
|
||||
data = (data =~ /\A#{URI::regexp(['http', 'https'])}\z/) ? "<a href='#{data}' target='blank'>#{data}</a>" : data
|
||||
data = (data =~ /\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b/i) ? "<a href='mailto:#{data}' title='#{data}'>#{data}</a>" : data
|
||||
field_data = data.blank? ? {"key" => field["key"],"title" => I18n.t("users."+field["key"]), "value" => " "} : {"key" => field["key"],"title" => I18n.t("users."+field["key"]), "value" =>data}
|
||||
field_data
|
||||
end
|
||||
|
||||
def get_image_for_show
|
||||
if self.avatar.present?
|
||||
image = self.avatar.thumb.url
|
||||
else
|
||||
image = "http://placehold.it/100x100"
|
||||
end
|
||||
|
||||
image_fields = {"img_src" => image}
|
||||
end
|
||||
|
||||
def delete_personal_plugin_data
|
||||
OrbitApp::Plugin::Registration.all.each do |plugin|
|
||||
class_name = plugin.app_name.constantize
|
||||
plugin_data = class_name.where(member_profile_id: self.id)
|
||||
plugin_data.delete
|
||||
end
|
||||
end
|
||||
|
||||
def assign_default_position?
|
||||
self.position.nil? || self.parent_id_changed?
|
||||
end
|
||||
|
||||
def email_present?
|
||||
self.email.present?
|
||||
end
|
||||
|
||||
def get_role_statuses(role_id)
|
||||
RoleStatus.where(role_id: role_id).any_of(member_profile_ids: self.id)
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,737 @@
|
||||
# pass the layout=false for not rendering the layouts and also can specify the methods to in the backend controller.
|
||||
# data-layout-content="arrayname" in layouts can be used to render data in the array
|
||||
require 'zhconv'
|
||||
require "uri"
|
||||
class PagesController < ApplicationController
|
||||
before_action :get_key
|
||||
layout :get_layout
|
||||
include PagesHelper
|
||||
before_filter :check_frontend_open, :only => [:home,:show]
|
||||
before_filter :check_authorization, :except => [:home,:show]
|
||||
before_filter :set_edit_mode
|
||||
prepend_view_path "app/templates"
|
||||
|
||||
def index
|
||||
@pages = Page.all
|
||||
# render json: @pages
|
||||
end
|
||||
|
||||
def edit_view
|
||||
@manifest = @key
|
||||
@dataApi = "edit"
|
||||
view = get_view
|
||||
if File.exists?(view)
|
||||
render view
|
||||
end
|
||||
end
|
||||
|
||||
def home
|
||||
@manifest = @key
|
||||
page = Page.root
|
||||
Thread.new do
|
||||
impressionist(page)
|
||||
end
|
||||
page.inc(view_count: 1)
|
||||
params[:is_frontend_view] = "true"
|
||||
OrbitHelper.set_params params,current_user
|
||||
OrbitHelper.set_site_locale locale
|
||||
OrbitHelper.set_request_object request
|
||||
OrbitHelper.render_meta_tags []
|
||||
render :html => render_final_page("home",page,true).html_safe
|
||||
end
|
||||
|
||||
def show
|
||||
display_type = ""
|
||||
path = request.path.split('/')
|
||||
params[:is_frontend_view] = "true"
|
||||
if path.size <= 2
|
||||
redirect_to root_path
|
||||
else
|
||||
if path.last.include? '-'
|
||||
params[:page_id] = path[-2]
|
||||
s = CGI.unescape(path[-1])
|
||||
s.encode!('UTF-8')
|
||||
params[:slug] = s
|
||||
uid = path[-1].split("-").last
|
||||
uid = uid.split("?").first
|
||||
if uid.include?(".")
|
||||
render :file => "#{Rails.root}/app/views/errors/404.html", :layout => false, :status => :not_found
|
||||
return
|
||||
end
|
||||
params[:uid] = uid
|
||||
params[:target_action] = params[:method] || "show"
|
||||
display_type = "show"
|
||||
else
|
||||
params[:page_id] = path[-1]
|
||||
params[:slug] = nil
|
||||
params[:uid] = nil
|
||||
params[:target_action] = params[:method] || "index"
|
||||
display_type = "index"
|
||||
OrbitHelper.set_page_number params[:page_no].to_i || 1
|
||||
end
|
||||
page = Page.find_by_param(params[:page_id])
|
||||
if !page.nil?
|
||||
if !page.user_can_access?(current_user)
|
||||
render :file => "#{Rails.root}/app/views/errors/403.html", :layout => false, :status => 403
|
||||
return
|
||||
end
|
||||
if !page.enabled_for_mobile && !$mobile.blank?
|
||||
render :file => "#{Rails.root}/app/views/errors/404.html", :layout => false, :status => :not_found
|
||||
return
|
||||
end
|
||||
if page.enabled_for.include? I18n.locale.to_s
|
||||
if page.page_type == "link"
|
||||
begin
|
||||
refer_url = URI.parse(page.external_url).to_s
|
||||
rescue URI::InvalidURIError
|
||||
refer_url = root_url
|
||||
end
|
||||
redirect_to refer_url
|
||||
return
|
||||
end
|
||||
module_app = page.module.downcase.pluralize
|
||||
params[:target_controller] = "#{module_app}"
|
||||
if display_type == "index"
|
||||
params[:layout_type] = params[:method] || page.layout || "index"
|
||||
end
|
||||
params[:url] = page.url
|
||||
categories = []
|
||||
if page.module == "member"
|
||||
if page.categories.first == "all"
|
||||
categories = ["all"]
|
||||
else
|
||||
page.categories.each do |c|
|
||||
category = Role.find(c) rescue nil
|
||||
if !category.nil? && !category.disabled
|
||||
categories << c
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
page.categories.each do |c|
|
||||
category = Category.find(c) rescue nil
|
||||
if !category.nil? && !category.disable
|
||||
categories << c
|
||||
end
|
||||
end
|
||||
categories = ["all"] if categories.blank?
|
||||
end
|
||||
@manifest = @key
|
||||
OrbitHelper.set_params params,current_user
|
||||
OrbitHelper.set_request_object request
|
||||
OrbitHelper.set_site_locale locale
|
||||
OrbitHelper.set_this_module_app module_app.singularize
|
||||
OrbitHelper.set_page_categories categories || ["all"]
|
||||
OrbitHelper.set_page_tags page.tags || []
|
||||
OrbitHelper.set_page_role_status page.role_status || []
|
||||
OrbitHelper.set_member_sort_position page.member_sort_position
|
||||
OrbitHelper.set_page_data_count page.data_count
|
||||
if params[:layout].kind_of?(String)
|
||||
layout = to_bool(params[:layout])
|
||||
else
|
||||
layout = true
|
||||
end
|
||||
|
||||
Thread.new do
|
||||
impressionist(page)
|
||||
end
|
||||
page.inc(view_count: 1)
|
||||
render :html => render_final_page("#{module_app}/#{params[:target_action]}",page,layout).html_safe
|
||||
else
|
||||
if Site.first.enable_redirect_index
|
||||
redirect_to root_url
|
||||
else
|
||||
render :file => "#{Rails.root}/app/views/errors/411.html", :layout => false, :status => :not_found
|
||||
end
|
||||
end
|
||||
else
|
||||
render :file => "#{Rails.root}/app/views/errors/404.html", :layout => false, :status => :not_found
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def update_child_pages_url(page)
|
||||
page.child_page.each do |cp|
|
||||
if !cp.child_page.blank?
|
||||
update_child_pages_url(cp)
|
||||
else
|
||||
cp.url = page.url + "/#{cp.page_id}"
|
||||
cp.save
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def update_item_position
|
||||
@page = Page.find(params[:id])
|
||||
new_parent_page = Page.find(params[:parent_id])
|
||||
old_parent_page_id = @page.parent_page_id
|
||||
@page.parent_page_id = new_parent_page.id
|
||||
if new_parent_page.id != old_parent_page_id
|
||||
url = (new_parent_page.url == "/" ? "" : new_parent_page.url)
|
||||
@page.url = url + "/#{@page.page_id}"
|
||||
if !@page.child_page.blank?
|
||||
update_child_pages_url(@page)
|
||||
end
|
||||
end
|
||||
@page.save
|
||||
params["children_ids"].each_with_index do |child,i|
|
||||
page = Page.find(child)
|
||||
page.number = i
|
||||
page.save
|
||||
end
|
||||
|
||||
if new_parent_page.id != old_parent_page_id
|
||||
old_parent_page = Page.find(old_parent_page_id)
|
||||
|
||||
# old_parent_page.child_page.each_with_index do |page,i|
|
||||
# page.number = i
|
||||
# page.save
|
||||
# end
|
||||
params["parent_children_ids"] = params["parent_children_ids"] || []
|
||||
params["parent_children_ids"].each_with_index do |child, i|
|
||||
page = Page.find(child)
|
||||
page.number = i
|
||||
page.save
|
||||
end
|
||||
end
|
||||
render :json => {"success"=>true}.to_json
|
||||
end
|
||||
|
||||
def preview
|
||||
render render_final_page
|
||||
end
|
||||
|
||||
def destroy
|
||||
page = Page.find(params[:id])
|
||||
# @parent_pages = page.parent_pages_without_root
|
||||
@pageid = page.id.to_s
|
||||
page.destroy
|
||||
respond_to do |format|
|
||||
format.js
|
||||
end
|
||||
end
|
||||
|
||||
def import_widgets
|
||||
page = Page.find(params[:id]) rescue nil
|
||||
page.page_parts.destroy_all
|
||||
if !page.nil?
|
||||
page.parent_page.page_parts.each do |pp|
|
||||
new_pp = pp.clone
|
||||
new_pp.page_id = page.id
|
||||
pp.sub_parts.each do |sp|
|
||||
new_sp = sp.clone
|
||||
new_pp.sub_parts << new_sp
|
||||
end
|
||||
new_pp.save
|
||||
page.page_parts << new_pp
|
||||
end
|
||||
page.save
|
||||
end
|
||||
render :json => {"success" => true}.to_json
|
||||
end
|
||||
|
||||
def get_member_attributes
|
||||
@page_id = params[:page_id]
|
||||
@type = params[:type]
|
||||
@selected_attribs = []
|
||||
if @type == "index"
|
||||
@selected_attribs = Page.find(@page_id).custom_array_field
|
||||
@selected_attribs = [
|
||||
{"key"=>"name", "type"=>"profile","sort_order"=>2,"link_to_show"=>true, "human_readable" => I18n.t("users.name")},
|
||||
{"key"=>"email", "type"=>"profile", "human_readable" => I18n.t("users.email")},
|
||||
{"key"=>"office_tel", "type"=>"profile", "human_readable" => I18n.t("users.office_tel")}
|
||||
] if @selected_attribs.blank?
|
||||
elsif @type == "show"
|
||||
@selected_attribs = Page.find(@page_id).custom_array_field_for_show
|
||||
if @selected_attribs.blank?
|
||||
@selected_attribs = [
|
||||
{"key"=>"name", "type"=>"profile","sort_order"=>2,"link_to_show"=>true, "human_readable" => I18n.t("users.name")},
|
||||
{"key"=>"email", "type"=>"profile", "human_readable" => I18n.t("users.email")},
|
||||
{"key"=>"office_tel", "type"=>"profile", "human_readable" => I18n.t("users.office_tel")}
|
||||
]
|
||||
infos = MemberInfo.order('created_at DESC')
|
||||
infos.each do |info|
|
||||
info.member_profile_fields.each do |member_profile_field|
|
||||
@selected_attribs << {"id"=> member_profile_field.id.to_s, "key"=> member_profile_field.key, "type"=>"custom"} if !member_profile_field.to_show.blank?
|
||||
end
|
||||
end
|
||||
Role.where(:disabled => false).each do |role|
|
||||
role.attribute_fields.each do |attribute_field|
|
||||
@selected_attribs << {"id"=> attribute_field.id.to_s, "key"=> attribute_field.key, "type"=>"role", "role_key" => role.key}# if !attribute_field.to_show.blank?
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
personal_attribs = [
|
||||
{"key" => "first_name", "human_readable" => I18n.t("users.first_name")},
|
||||
{"key" => "last_name", "human_readable" => I18n.t("users.last_name")},
|
||||
{"key" => "name", "human_readable" => I18n.t("users.name")},
|
||||
{"key" => "sex", "human_readable" => I18n.t("users.sex")},
|
||||
{"key" => "office_tel", "human_readable" => I18n.t("users.office_tel")},
|
||||
{"key" => "mobile_no", "human_readable" => I18n.t("users.mobile_no")},
|
||||
{"key" => "fax", "human_readable" => I18n.t("users.fax")},
|
||||
{"key" => "member_tags", "human_readable" => I18n.t("users.member_tags")},
|
||||
{"key" => "birthday", "human_readable" => I18n.t("users.birthday")},
|
||||
{"key" => "address", "human_readable" => I18n.t("users.address")},
|
||||
{"key" => "personal_website", "human_readable" => I18n.t("users.personal_website")},
|
||||
{"key" => "autobiography", "human_readable" => I18n.t("users.autobiography")},
|
||||
{"key" => "email", "human_readable" => I18n.t("users.email")}
|
||||
]
|
||||
|
||||
custom_attribs = MemberProfileField.all.asc(:created_at).collect do |mpf|
|
||||
{"key" => mpf.key, "human_readable" => mpf.title, "id" => mpf.id.to_s}
|
||||
end
|
||||
|
||||
role_attribs = []
|
||||
ra = AttributeField.all.asc(:created_at).group_by(&:role)
|
||||
keys = ra.keys
|
||||
keys.each do |r|
|
||||
next if r.nil?
|
||||
t = {"role" => r.title, "role_key" => r.key, "attributes" => []}
|
||||
ra[r].each do |af|
|
||||
t["attributes"] << {"key" => af.key, "human_readable" => af.title, "id" => af.id.to_s}
|
||||
end
|
||||
role_attribs << t
|
||||
end
|
||||
|
||||
@attribs = {
|
||||
"profile" => personal_attribs,
|
||||
"custom" => custom_attribs,
|
||||
"role" => role_attribs,
|
||||
"types" =>[
|
||||
{"key" => "profile", "human_readable" => "Profile"},
|
||||
{"key" => "custom", "human_readable" => "Custom"},
|
||||
{"key" => "role", "human_readable" => "Role"}
|
||||
]
|
||||
}
|
||||
render :partial => "member_frontend_field"
|
||||
end
|
||||
|
||||
def save_member_frontend_fields
|
||||
fields = params["fields"]
|
||||
array = []
|
||||
fields.each do |field|
|
||||
array << field.last
|
||||
end
|
||||
page = Page.find(params[:page_id])
|
||||
if params[:type] == "index"
|
||||
page.custom_array_field = array
|
||||
elsif params[:type] == "show"
|
||||
page.custom_array_field_for_show = array
|
||||
end
|
||||
page.save
|
||||
render :json => {"success" => true}.to_json
|
||||
end
|
||||
|
||||
def get_categories
|
||||
module_app = ModuleApp.find_by_key(params[:module]);
|
||||
if module_app.key.eql?("member")
|
||||
roles = Role.order_by(:_id=>'ASC').all.collect do |role|
|
||||
{
|
||||
"title" => role.title,
|
||||
"id" => role.id.to_s,
|
||||
"status" => RoleStatus.where(:role=>role).collect do |status|
|
||||
{
|
||||
"title" => status.title,
|
||||
"id" => status.id.to_s
|
||||
}
|
||||
end
|
||||
}
|
||||
end
|
||||
else
|
||||
if !module_app.key.eql?("page_content")
|
||||
categories = module_app.categories.enabled.collect do |cat|
|
||||
{
|
||||
"title" => cat.title,
|
||||
"id" => cat.id.to_s
|
||||
}
|
||||
end
|
||||
tags = module_app.tags.collect do |t|
|
||||
{
|
||||
"name" => t.name,
|
||||
"id" => t.id.to_s
|
||||
}
|
||||
end
|
||||
else
|
||||
categories = []
|
||||
tags = []
|
||||
end
|
||||
end
|
||||
|
||||
roles = roles.nil? ? [] : roles
|
||||
categories = categories.nil? ? [] : categories
|
||||
tags = tags.nil? ? [] : tags
|
||||
|
||||
if module_app.data_count.nil?
|
||||
render :json => {"categories" => categories, "tags" => tags,"roles" => roles,"layouts" => (get_layouts module_app.key),"data_count" => {"present"=>false}, "locale" => I18n.locale.to_s}.to_json
|
||||
else
|
||||
render :json => {"categories" => categories, "tags" => tags,"roles" => roles,"layouts" => (get_layouts module_app.key),"data_count" => {"present"=>true,"start"=>module_app.data_count.begin, "end" => module_app.data_count.end}, "locale" => I18n.locale.to_s}.to_json
|
||||
end
|
||||
end
|
||||
|
||||
def new
|
||||
@page = Page.new(
|
||||
:enabled_for_mobile=>true,
|
||||
:menu_enabled_for=>["en", "zh_tw"],
|
||||
:enabled_for=>["en", "zh_tw"],
|
||||
:enabled_for_sitemap=>["en", "zh_tw"]
|
||||
)
|
||||
@pages = Page.where(:page_id.ne => "" , :page_id.exists => true)
|
||||
@modules = ModuleApp.all.frontend_enabled.order_by(:key=>'asc')
|
||||
@al = [[t("access_level_none"),"none"], [t("access_level_users"),"users"]]
|
||||
Role.all.each do |role|
|
||||
@al << [role.title, role.id]
|
||||
end
|
||||
end
|
||||
|
||||
def edit
|
||||
@page = Page.find(params[:id])
|
||||
if params[:type] == "page"
|
||||
@pages = Page.where(:page_id.ne => "" , :page_id.exists => true)
|
||||
@modules = ModuleApp.all.frontend_enabled
|
||||
@module_app = ModuleApp.find_by_key(@page.module) rescue nil
|
||||
@categories = @module_app.categories.enabled rescue []
|
||||
if @module_app.key.eql?("page_content")
|
||||
@categories = []
|
||||
end
|
||||
@tags = @module_app.tags rescue []
|
||||
if @module_app.key.eql?("member")
|
||||
@roles = Role.order_by(:_id=>'ASC').all.collect do |role|
|
||||
{
|
||||
"title" => role.title,
|
||||
"id" => role.id.to_s,
|
||||
"status" => RoleStatus.where(:role=>role)
|
||||
}
|
||||
end
|
||||
else
|
||||
@roles = []
|
||||
end
|
||||
@layout_types = get_layouts @module_app.key
|
||||
end
|
||||
@al = [[t("access_level_none"),"none"], [t("access_level_users"),"users"]]
|
||||
Role.all.each do |role|
|
||||
@al << [role.title, role.id]
|
||||
end
|
||||
end
|
||||
|
||||
def update
|
||||
@page = Page.find(params[:id])
|
||||
@page.update_attributes(page_update_params)
|
||||
@page.save
|
||||
# @parent_pages = @page.parent_pages_without_root
|
||||
respond_to do |format|
|
||||
format.js
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
def create
|
||||
params['page']['page_id'] = params['page']['page_id'].gsub('-','_')
|
||||
@page = Page.new(page_params)
|
||||
@page.save!
|
||||
# @parent_pages = @page.parent_pages_without_root
|
||||
respond_to do |format|
|
||||
format.js
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def get_layouts(module_app)
|
||||
layout_types = []
|
||||
f = File.join("#{Rails.root}/app/templates/#{@key}/modules/#{module_app}/info.json")
|
||||
if File.exists?f
|
||||
info = File.read(f)
|
||||
hash = JSON.parse(info) rescue {}
|
||||
frontends = hash["frontend"] || []
|
||||
frontends.each do |frontend|
|
||||
frontend["thumbnail"] = "/assets/#{module_app}/thumbs/#{frontend["thumbnail"]}"
|
||||
layout_types << frontend
|
||||
end
|
||||
end
|
||||
if layout_types.empty?
|
||||
Dir.glob("#{Rails.root}/app/templates/#{@key}/modules/#{module_app}/*").each do |w|
|
||||
next if File.ftype(w).eql?("directory")
|
||||
w = File.basename(w, ".*")
|
||||
w = File.basename(w, ".*")
|
||||
if w[0,1] != "_" && w[0,1] != "s" && w != "info"
|
||||
layout_types << w
|
||||
end
|
||||
end
|
||||
end
|
||||
layout_types
|
||||
end
|
||||
|
||||
def render_final_page(original_view=get_view,page,layout)
|
||||
final_html_for_render = ""
|
||||
OrbitHelper.set_css_to_render_to_empty
|
||||
if layout
|
||||
parts = $mobile.blank? ? (page.page_parts rescue []) : (page.mobile_page_parts rescue [])
|
||||
|
||||
@part_partials = {}
|
||||
parts.each do |part|
|
||||
subparts = part.sub_parts.asc(:created_at)
|
||||
partials = []
|
||||
subparts.each do |subpart|
|
||||
if subpart.kind == "module_widget"
|
||||
|
||||
OrbitHelper.set_current_widget subpart
|
||||
OrbitHelper.set_widget_data_count subpart.data_count
|
||||
OrbitHelper.set_widget_module_app subpart.module
|
||||
OrbitHelper.set_widget_item_url subpart
|
||||
OrbitHelper.render_meta_tags []
|
||||
OrbitHelper.set_widget_title subpart.title
|
||||
OrbitHelper.set_widget_categories subpart.categories || ["all"]
|
||||
OrbitHelper.set_widget_tags subpart.tags || ["all"]
|
||||
custom_value = subpart.custom_string_field || subpart.custom_array_field rescue nil
|
||||
if !custom_value.nil?
|
||||
OrbitHelper.set_widget_custom_value custom_value
|
||||
end
|
||||
if @editmode
|
||||
partials << "<div class='editmode-ps' title='#{subpart.module}'> " + render_widget_for_frontend(subpart.module,subpart.widget_method,subpart.widget_type,subpart.id.to_s) + "<a href='/page_parts/edit_sub_part?page_id=#{page.id.to_s}&part_id=#{part.id.to_s}&sub_part_id=#{subpart.id.to_s}#{(!$mobile.blank? ? '&mobile_view=1' : '')}'> </a></div>"
|
||||
else
|
||||
# widget_html = Rails.cache.fetch("subpart_#{subpart.module}_#{subpart.id.to_s}_"+I18n.locale.to_s,{ race_condition_ttl: 2, expires_in: 5.minutes}) do
|
||||
# render_widget_for_frontend(subpart.module,subpart.widget_method,subpart.widget_type,subpart.id.to_s)
|
||||
# end
|
||||
widget_html = render_widget_for_frontend(subpart.module,subpart.widget_method,subpart.widget_type,subpart.id.to_s)
|
||||
partials << widget_html
|
||||
end
|
||||
elsif subpart.kind == "text"
|
||||
if @editmode
|
||||
partials << "<div class='editmode-ps' title='text'> " + subpart.content + "<a href='/page_parts/edit_sub_part?page_id=#{part.page_id.to_s}&part_id=#{part.id.to_s}&sub_part_id=#{subpart.id.to_s}#{(!$mobile.blank? ? '&mobile_view=1' : '')}'> </a></div>"
|
||||
else
|
||||
# change from px to em start
|
||||
if subpart.content.include? "px"
|
||||
@arrofindex = Array.new
|
||||
@indexOfpx = subpart.content.index('px')
|
||||
@arrofindex.push @indexOfpx
|
||||
while @indexOfpx.nil? == false
|
||||
@indexOfpx = subpart.content.index('px',@indexOfpx+1)
|
||||
break if @indexOfpx.nil? == true
|
||||
@arrofindex.push @indexOfpx
|
||||
end
|
||||
@arrofchangeString = Array.new
|
||||
@arrofnewString = Array.new
|
||||
@arrofindex.each do |indexPX|
|
||||
for i in (0...indexPX).to_a.reverse
|
||||
next if subpart.content[i] == " "
|
||||
@isnum = Float(subpart.content[i]) rescue nil
|
||||
break if @isnum.nil? == true || subpart.content[i] == ":"
|
||||
end
|
||||
if i != indexPX - 1
|
||||
@arrofchangeString.push subpart.content[(i+1)..(indexPX+1)]
|
||||
@arrofnewString.push ((subpart.content[(i+1)...(indexPX)].to_i / 16.0).to_s + "em")
|
||||
end
|
||||
end
|
||||
@arrofchangeString.each_with_index do |changeString,i|
|
||||
subpart.content = subpart.content.sub(changeString,@arrofnewString[i])
|
||||
end
|
||||
end
|
||||
# change from px to em end
|
||||
partials << subpart.content
|
||||
end
|
||||
end
|
||||
end
|
||||
@part_partials["data-pp='#{part.part_id}'"] = partials
|
||||
end
|
||||
|
||||
@file = nil
|
||||
@layout_html = nil
|
||||
if original_view == "home"
|
||||
@file = File.join("#{@key}", "/home/index.html.erb")
|
||||
else
|
||||
@file = File.join("#{@key}", "/home/page.html.erb")
|
||||
end
|
||||
@layout_html = render_to_string(@file , :formats => :html)
|
||||
doc = Nokogiri::HTML(@layout_html, nil, "UTF-8")
|
||||
head = doc.css("head")
|
||||
@part_partials.each do |key, partial|
|
||||
html_string = ""
|
||||
partial.each do |p|
|
||||
if !p.nil?
|
||||
html_string = html_string + p
|
||||
end
|
||||
end
|
||||
pp = doc.css("*[#{key}]")
|
||||
if !pp.blank?
|
||||
pp = pp[0]
|
||||
pp.inner_html = html_string
|
||||
end
|
||||
end
|
||||
|
||||
if @editmode
|
||||
pps = doc.css("*[data-pp]")
|
||||
pps.each do |pp|
|
||||
number = pp.attributes["data-pp"].value
|
||||
if pp.inner_html.strip == ""
|
||||
pp.inner_html = "<a href='/page_parts/new?part=#{number}&page_id=#{page.id.to_s}#{(!$mobile.blank? ? '&mobile_view=1' : '')}'> </a>"
|
||||
else
|
||||
inner_html = pp.inner_html
|
||||
pp.inner_html = inner_html + "<a href='/page_parts/#{number}/edit?page_id=#{page.id.to_s}#{(!$mobile.blank? ? '&mobile_view=1' : '')}'> </a>"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if original_view != "home"
|
||||
viewarea = doc.css("*[data-content='true']")[0]
|
||||
viewarea.inner_html = render_to_string(original_view) rescue "<div></div>"
|
||||
# change from px to em start
|
||||
if viewarea.inner_html.include? "px"
|
||||
@arrofindex = Array.new
|
||||
@indexOfpx = viewarea.inner_html.index('px')
|
||||
@arrofindex.push @indexOfpx
|
||||
while @indexOfpx.nil? == false
|
||||
@indexOfpx = viewarea.inner_html.index('px',@indexOfpx+1)
|
||||
break if @indexOfpx.nil? == true
|
||||
@arrofindex.push @indexOfpx
|
||||
end
|
||||
@arrofchangeString = Array.new
|
||||
@arrofnewString = Array.new
|
||||
@arrofindex.each do |indexPX|
|
||||
for i in (0...indexPX).to_a.reverse
|
||||
next if viewarea.inner_html[i] == " "
|
||||
@isnum = Float(viewarea.inner_html[i]) rescue nil
|
||||
break if @isnum.nil? == true || viewarea.inner_html[i] == ":"
|
||||
end
|
||||
if i != indexPX - 1
|
||||
@arrofchangeString.push viewarea.inner_html[(i+1)..(indexPX+1)]
|
||||
@arrofnewString.push ((viewarea.inner_html[(i+1)...(indexPX)].to_i / 16.0).to_s + "em")
|
||||
end
|
||||
end
|
||||
@arrofchangeString.each_with_index do |changeString,i|
|
||||
viewarea.inner_html = viewarea.inner_html.sub(changeString,@arrofnewString[i])
|
||||
end
|
||||
end
|
||||
# change from px to em end
|
||||
head[0].inner_html = OrbitHelper.meta_tags_html + head.inner_html
|
||||
end
|
||||
head[0].inner_html = head.inner_html + OrbitHelper.get_css_to_render_in_head
|
||||
link = doc.css("link")[0]
|
||||
link.attributes["href"].value = current_site.favicon.url.nil? ? "/assets/favicon.ico" : current_site.favicon.url
|
||||
final_html_for_render = doc.to_html
|
||||
|
||||
else
|
||||
final_html_for_render = render_to_string(original_view) rescue "<div></div>"
|
||||
end
|
||||
final_html_for_render = change_to_language(final_html_for_render)
|
||||
if @editmode
|
||||
session[:mobile] = $temp_mobile
|
||||
end
|
||||
format_date(final_html_for_render,(original_view == "home" ? "home" : page.module)) rescue final_html_for_render
|
||||
end
|
||||
|
||||
def format_date(html,module_key)
|
||||
doc = Nokogiri::HTML(html, nil, "UTF-8")
|
||||
doc.css("body").first.set_attribute("data-module",module_key) rescue nil
|
||||
dates = doc.css("*[date-format]")
|
||||
if dates.blank?
|
||||
return doc.to_html
|
||||
else
|
||||
dates.each do |d|
|
||||
format = d.attributes["date-format"].value
|
||||
date = DateTime.parse(d.inner_text)
|
||||
d.inner_html = d.inner_html.gsub(d.inner_text.strip, " " + date.strftime(format))
|
||||
end
|
||||
return doc.to_html
|
||||
end
|
||||
end
|
||||
|
||||
def get_widget_path(widget)
|
||||
file = File.join('../templates', "#{@key}", "modules/#{widget}")
|
||||
end
|
||||
|
||||
def get_view
|
||||
page = Page.find(params[:id]) rescue Page.root
|
||||
if page == Page.root
|
||||
@view = File.join(Rails.root, 'app', 'templates', "#{@key}", "home/index.html.erb")
|
||||
else
|
||||
module_name = page.module.downcase.singularize
|
||||
@view = File.join(Rails.root, 'app', 'templates', "#{@key}", "modules/#{module_name}/index.html.erb")
|
||||
end
|
||||
end
|
||||
|
||||
def page_params
|
||||
page = Page.find(params[:page][:parent_page])
|
||||
page.url = page.url == "/" ? "" : page.url
|
||||
@url = page.url + "/#{params[:page][:page_id]}"
|
||||
valid_locales = current_site.valid_locales rescue []
|
||||
p = params.require(:page).permit(:number, :page_type, :page_id, :module, :access_level, :layout, :parent_page, :data_count, :enabled_for_mobile, :member_sort_position, enabled_for_sitemap: [], enabled_for: [], menu_enabled_for: [], categories: [], tags: [], role_status: [], name_translations: valid_locales ,external_url_translations: valid_locales)
|
||||
p["url"] = @url
|
||||
if p["external_url_translations"]
|
||||
current_site.in_use_locales.each do |loc|
|
||||
p["external_url_translations"][loc.to_s] = p["external_url_translations"][loc.to_s].sub("http://" + request.host_with_port,"") if p["external_url_translations"][loc.to_s].present?
|
||||
end
|
||||
end
|
||||
p
|
||||
end
|
||||
|
||||
def page_update_params
|
||||
valid_locales = current_site.valid_locales rescue []
|
||||
p = params.require(:page).permit(:number, :page_type, :page_id, :module, :access_level, :layout, :parent_page, :data_count, :custom_string_field, :enabled_for_mobile, :member_sort_position, enabled_for_sitemap: [], enabled_for: [],menu_enabled_for: [], categories: [], tags: [], role_status: [], name_translations: valid_locales, external_url_translations: valid_locales)
|
||||
p["role_status"] = p["role_status"] || []
|
||||
p["categories"] = p["categories"] || []
|
||||
p["tags"] = p["tags"] || []
|
||||
p["enabled_for"] = p["enabled_for"] || []
|
||||
p["menu_enabled_for"] = p["menu_enabled_for"] || []
|
||||
p["enabled_for_sitemap"] = p["enabled_for_sitemap"] || []
|
||||
p["enabled_for_mobile"] = p["enabled_for_mobile"] || 0
|
||||
if p["external_url_translations"]
|
||||
current_site.in_use_locales.each do |loc|
|
||||
p["external_url_translations"][loc.to_s] = p["external_url_translations"][loc.to_s].sub("http://" + request.host_with_port,"") if p["external_url_translations"][loc.to_s].present?
|
||||
end
|
||||
end
|
||||
p
|
||||
end
|
||||
|
||||
def get_layout
|
||||
if request[:action] == "edit_view"
|
||||
page = Page.find(params[:id])
|
||||
if page.page_id == "" || page.page_id == nil
|
||||
false
|
||||
else
|
||||
File.join("../../templates", "#{@key}", "/home/page.html.erb")
|
||||
end
|
||||
# elsif request[:action] == "show" || request[:action] == "moduleShow"
|
||||
# File.join("../../templates", "themes", "#{@key}", '/home/page.html.erb')
|
||||
else
|
||||
false
|
||||
end
|
||||
end
|
||||
def to_bool(str)
|
||||
return true if str == "true"
|
||||
return false if str == "false"
|
||||
end
|
||||
|
||||
def check_frontend_open
|
||||
if !current_site.frontend_open && current_user.blank?
|
||||
redirect_to '/admin/dashboards'
|
||||
end
|
||||
end
|
||||
|
||||
def check_authorization
|
||||
if current_user.blank? or !current_user.is_admin?
|
||||
redirect_to '/admin/dashboards'
|
||||
end
|
||||
end
|
||||
|
||||
def set_edit_mode
|
||||
@dataApi = "frontend"
|
||||
@editmode = false
|
||||
if !current_user.nil? and current_user.is_admin?
|
||||
if params[:editmode] == "on"
|
||||
@editmode = true
|
||||
@dataApi = "edit"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def change_to_language(final_html)
|
||||
if session[:zh_cn]
|
||||
final_html = ZhConv.convert("zh-cn", final_html,false)
|
||||
final_html.gsub!('/zh_tw/','/zh_cn/')
|
||||
final_html.sub!('<a accesskey="t" href="'+request.path+'">繁体中文</a>','<a accesskey="t" href="'+(request.path.sub('/zh_cn/','/zh_tw/'))+'">繁体中文</a>')
|
||||
end
|
||||
final_html
|
||||
end
|
||||
|
||||
end
|
||||
@@ -0,0 +1,74 @@
|
||||
class Site
|
||||
include Mongoid::Document
|
||||
include Mongoid::Timestamps
|
||||
include Slug
|
||||
|
||||
DEBUG = false
|
||||
|
||||
field :title, as: :slug_title, type: String, localize: true
|
||||
field :school, type: String
|
||||
field :department, type: String
|
||||
field :address, type: String
|
||||
field :footer, localize: true
|
||||
field :social_share, type: String
|
||||
field :sub_menu, localize: true
|
||||
field :site_type
|
||||
field :site_map_link, type: String, :default => "/sitemap"
|
||||
field :terms_of_use_link, type: String
|
||||
field :google_analytics, type: String
|
||||
field :in_use_locales, :type => Array
|
||||
field :valid_locales, :type => Array
|
||||
field :site_active, :type => Boolean
|
||||
field :frontend_open, :type => Boolean, :default => true
|
||||
field :backend_openness_on, :type => Boolean, :default => false
|
||||
field :mobile_api_openness_on, :type => Boolean, :default => false
|
||||
field :desktop_closed, :type => Boolean, :default => false
|
||||
field :enable_language_detection, :type => Boolean, :default => false
|
||||
field :enable_redirect_index, :type => Boolean, :default => true
|
||||
field :enable_zh_cn, :type => Boolean, :default => true
|
||||
field :enable_language_options, :type => Boolean, :default => true
|
||||
field :default_locale, :default => "zh_tw"
|
||||
field :mobile_on, :type => Boolean, :default => false
|
||||
field :announcement_category, :type => Array, :default=>[]
|
||||
field :mobile_bar_color, :type => Array, :default=>[]
|
||||
field :phone_number, :type => Array,:default=>[]
|
||||
field :title_always_on, :type => Boolean, :default => false
|
||||
field :display_title_in_frontend, :type => Boolean, :default => true
|
||||
field :sitemap_menu_in_header, :type => Boolean, :default => false
|
||||
field :enable_terms_of_use, :type => Boolean, :default => false
|
||||
field :search,:type => Hash
|
||||
field :site_settings
|
||||
field :template, type: String
|
||||
field :store_token
|
||||
field :enable_last_update, type: Boolean, :default => false
|
||||
field :personal_plugins_sort, type: Array, :default => []
|
||||
field :sign_up_roles, type: Array, :default => []
|
||||
|
||||
field :mobile_orbit_bar_title, localize: true
|
||||
field :google_oauth_enabled, :type => Boolean, :default => false
|
||||
field :google_client_id
|
||||
field :google_client_secret
|
||||
field :meta_tags
|
||||
field :every_page_sharer, type: Array, :default => ["facebook","twitter","google","printer"]
|
||||
|
||||
field :sync_enabled, type: Boolean, :default => false
|
||||
field :sync_rake_task
|
||||
|
||||
field :month_traffic_cache
|
||||
field :home_link, :type => String, :default=>"/"
|
||||
field :home_link_1, :type => String, :default=>"/"
|
||||
field :site_title, :type => Hash, :default=>{:zh_tw=>"主頁",:en=>"home_page"}
|
||||
field :site_title_1, :type => Hash, :default=>{:zh_tw=>"主頁",:en=>"home_page"}
|
||||
mount_uploader :default_image, ImageUploader
|
||||
mount_uploader :site_logo, ImageUploader
|
||||
mount_uploader :site_logo_1, ImageUploader
|
||||
mount_uploader :favicon, ImageUploader
|
||||
mount_uploader :mobile_icon, ImageUploader
|
||||
|
||||
def register_site(url,university,department,email,country)
|
||||
api_key = STORE_CONFIG[:store_settings]["api_key"]
|
||||
self.generate_site_token
|
||||
store = Store.new(self.id.to_s,self.site_token,api_key)
|
||||
store.post_client(self.id.to_s,self.site_token,self.title,url,university,department,email,country)
|
||||
end
|
||||
end
|
||||
Reference in new issue
Block a user