diff --git a/app/assets/images/availability-check-loader.gif b/app/assets/images/availability-check-loader.gif new file mode 100644 index 0000000..49b6d85 Binary files /dev/null and b/app/assets/images/availability-check-loader.gif differ diff --git a/app/assets/images/person.png b/app/assets/images/person.png new file mode 100644 index 0000000..db1d7d2 Binary files /dev/null and b/app/assets/images/person.png differ diff --git a/app/assets/images/result.png b/app/assets/images/result.png new file mode 100644 index 0000000..ff6c475 Binary files /dev/null and b/app/assets/images/result.png differ diff --git a/app/assets/images/social-share-button.png b/app/assets/images/social-share-button.png new file mode 100644 index 0000000..3507161 Binary files /dev/null and b/app/assets/images/social-share-button.png differ diff --git a/app/assets/images/thumb_person.png b/app/assets/images/thumb_person.png new file mode 100644 index 0000000..f049397 Binary files /dev/null and b/app/assets/images/thumb_person.png differ diff --git a/app/assets/images/write.png b/app/assets/images/write.png new file mode 100644 index 0000000..fb9ef0e Binary files /dev/null and b/app/assets/images/write.png differ diff --git a/app/assets/javascripts/admin/member_infos.js.coffee b/app/assets/javascripts/admin/member_infos.js.coffee new file mode 100644 index 0000000..24f83d1 --- /dev/null +++ b/app/assets/javascripts/admin/member_infos.js.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://coffeescript.org/ diff --git a/app/assets/javascripts/lib/member/role-forms.js b/app/assets/javascripts/lib/member/role-forms.js index 2de84cd..3bca336 100644 --- a/app/assets/javascripts/lib/member/role-forms.js +++ b/app/assets/javascripts/lib/member/role-forms.js @@ -96,23 +96,23 @@ function inputAppendLength() { // Role Attribute Template Data function setData(l, type, ol) { - var fields = $('#info').length ? "info[attribute_fields]" : $('#sub_role').length ? "sub_role[attribute_fields]" : "role[attribute_fields]", + var fields = $('#info').length ? "member_profile_field" : $('#sub_role').length ? "sub_role[attribute_fields]" : "role[attribute_fields]", data = { - _add_more: ["add_more_" +l, fields+"["+l+"]["+type+"][add_more]"], - _calendar: ["calendar_" +l, fields+"["+l+"]["+type+"][calendar]"], - _cross_lang: ["cross_lang_" +l, fields+"["+l+"]["+type+"][cross_lang]"], - _disabled: ["disabled_" +l, fields+"["+l+"][disabled]"], - _format: ["format_" +l, fields+"["+l+"]["+type+"][format]"], - _initial: ["initial_" +l, fields+"["+l+"]["+type+"][initial]"], - _is_range: ["is_range_" +l, fields+"["+l+"]["+type+"][is_range]"], - _key: ["key_" +l, fields+"["+l+"][key]"], - _markup: fields+"["+l+"][markup]", - _option_list: ["option_list_"+l+"_"+ol, fields+"["+l+"]["+type+"][option_list]["+ol+"]", "option_list_"+ol], - _placeholder: ["placeholder_" +l, fields+"["+l+"]["+type+"][placeholder]"], - _title_translations: ["title_translations_" +l, fields+"["+l+"][title_translations]"], - _to_delete: ["to_delete_" +l, fields+"["+l+"][to_delete]"], - _to_search: ["to_search_" +l, fields+"["+l+"][to_search]"], - _to_show: ["to_show_" +l, fields+"["+l+"][to_show]"], + _add_more: ["add_more_" +l, fields+"["+type+"][add_more]"], + _calendar: ["calendar_" +l, fields+"["+type+"][calendar]"], + _cross_lang: ["cross_lang_" +l, fields+"["+type+"][cross_lang]"], + _disabled: ["disabled_" +l, fields+"[disabled]"], + _format: ["format_" +l, fields+"["+type+"][format]"], + _initial: ["initial_" +l, fields+"["+type+"][initial]"], + _is_range: ["is_range_" +l, fields+"["+type+"][is_range]"], + _key: ["key_" +l, fields+"[key]"], + _markup: fields+"[markup]", + _option_list: ["option_list_"+l+"_"+ol, fields+"["+type+"][option_list]["+ol+"]", "option_list_"+ol], + _placeholder: ["placeholder_" +l, fields+"["+type+"][placeholder]"], + _title_translations: ["title_translations_" +l, fields+"[title_translations]"], + _to_delete: ["to_delete_" +l, fields+"[to_delete]"], + _to_search: ["to_search_" +l, fields+"[to_search]"], + _to_show: ["to_show_" +l, fields+"[to_show]"], }; return data; } diff --git a/app/assets/javascripts/member.js.coffee b/app/assets/javascripts/member.js.coffee new file mode 100644 index 0000000..24f83d1 --- /dev/null +++ b/app/assets/javascripts/member.js.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://coffeescript.org/ diff --git a/app/assets/stylesheets/admin/member_infos.css.scss b/app/assets/stylesheets/admin/member_infos.css.scss new file mode 100644 index 0000000..eec2a45 --- /dev/null +++ b/app/assets/stylesheets/admin/member_infos.css.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the admin/member_infos controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/member.css.scss b/app/assets/stylesheets/member.css.scss new file mode 100644 index 0000000..4444e19 --- /dev/null +++ b/app/assets/stylesheets/member.css.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the member controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/controllers/admin/member_infos_controller.rb b/app/controllers/admin/member_infos_controller.rb new file mode 100644 index 0000000..38c6666 --- /dev/null +++ b/app/controllers/admin/member_infos_controller.rb @@ -0,0 +1,55 @@ +class Admin::MemberInfosController < OrbitMemberController + + before_action :set_attribute + before_action :set_member_info, only: [:edit, :update, :show, :destroy] + helper Admin::AttributeValuesViewHelper + + def index + @attributes = MemberProfileField.order('created_at DESC') + @roles = Role.excludes('disabled' => true) + end + + def new + @attribute = MemberProfileField.new + end + + def show + end + + def edit + end + + def create + @attribute = MemberProfileField.new(member_info_params) + @attribute.save + + redirect_to action: :index + end + + def update + @attribute.update_params(member_info_params) + end + + def destroy + @attribute.destroy + redirect_to action: :index + end + +private + # Use callbacks to share common setup or constraints between actions. + def set_member_info + @attribute = MemberProfileField.find(params[:id]) + end + + # Never trust parameters from the scary internet, only allow the white list through. + def member_info_params + params.require(:member_profile_field).permit! + end + +protected + + def set_attribute + @attribute_type = 'info' + @class = 'infos' + end +end diff --git a/app/controllers/admin/members_controller.rb b/app/controllers/admin/members_controller.rb index 147fe8c..1481159 100644 --- a/app/controllers/admin/members_controller.rb +++ b/app/controllers/admin/members_controller.rb @@ -1,5 +1,5 @@ class Admin::MembersController < OrbitMemberController - before_action :set_member_profile, only: [:show, :edit, :update, :create] + before_action :set_member_profile, only: [:show, :edit, :update] def index @roles = Role.all @@ -27,13 +27,13 @@ class Admin::MembersController < OrbitMemberController render case params[:at] when 'summary' - @members=User.all.page(page_num).per(12).desc("_id") + @members=MemberProfile.all.page(page_num).per(12).desc("_id") "index_summary" when 'thumbnail' - @members=User.all.page(page_num).per(36).desc("_id") + @members=MemberProfile.all.page(page_num).per(36).desc("_id") "index_thumbnail" else - @members=User.all.page(page_num).per(10).desc("_id") + @members=MemberProfile.all.page(page_num).per(10).desc("_id") "index" end @@ -41,13 +41,13 @@ class Admin::MembersController < OrbitMemberController render case params[:at] when 'summary' - @members=User.all.any_of({:user_id => /#{@mq}/i}, {:first_name => /#{@mq}/i}, {:last_name => /#{@mq}/i}, {:email => /#{@mq}/i}, {:office_tel => /#{@mq}/i}).desc("_id") + @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=User.all.any_of({:user_id => /#{@mq}/i}, {:first_name => /#{@mq}/i}, {:last_name => /#{@mq}/i}, {:email => /#{@mq}/i}, {:office_tel => /#{@mq}/i}).desc("_id") + @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=User.all.any_of({:user_id => /#{@mq}/i}, {:first_name => /#{@mq}/i}, {:last_name => /#{@mq}/i}, {:email => /#{@mq}/i}, {:office_tel => /#{@mq}/i}).desc("_id") + @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 @@ -55,13 +55,13 @@ class Admin::MembersController < OrbitMemberController render case params[:at] when 'summary' - @members=User.all.any_in(:role_ids=>@filter['role']).page(page_num).per(12).desc("_id") + @members=MemberProfile.all.any_in(:role_ids=>@filter['role']).page(page_num).per(12).desc("_id") "index_summary" when 'thumbnail' - @members=User.all.any_in(:role_ids=>@filter['role']).page(page_num).per(36).desc("_id") + @members=MemberProfile.all.any_in(:role_ids=>@filter['role']).page(page_num).per(36).desc("_id") "index_thumbnail" else - @members=User.all.any_in(:role_ids=>@filter['role']).page(page_num).per(10).desc("_id") + @members=MemberProfile.all.any_in(:role_ids=>@filter['role']).page(page_num).per(10).desc("_id") "index" end @@ -73,17 +73,42 @@ class Admin::MembersController < OrbitMemberController end def new + @member = MemberProfile.new + get_info_and_roles + @user = User.new end def edit + if @member.user.present? + @user = @member.user + else + @user = User.new(member_profile_id: @member.id) + end end def create + @member = MemberProfile.new(member_profile_params) + @user = User.new(user_params) + + if @member.save + @user.member_profile_id = @member.id + @user.save + redirect_to admin_members_path + else + redirect_to new_admin_member_path + end end def update respond_to do |format| if @member.update(member_profile_params) + if @member.user.present? + @member.user.update(user_params) + else + @user = User.new(user_params) + @user.save + @user.update_attributes(member_profile_id: @member.id) + end format.html { redirect_to admin_members_path, notice: 'Successfully Updated the User' } format.json { head :no_content } @@ -98,9 +123,9 @@ class Admin::MembersController < OrbitMemberController if params[:id].eql?(current_user.id.to_s) flash[:error] = t(:cant_delete_self) else - @user = User.find(params[:id]) - @user.member_profile.delete - @user.delete + @member_profile = MemberProfile.find(params[:id]) + @member_profile.user.delete if @member_profile.user.present? + @member_profile.delete end render action: "index" @@ -118,9 +143,17 @@ class Admin::MembersController < OrbitMemberController params.require(:member_profile).permit! end + def user_params + params.require(:user).permit! + end + protected + def get_info_and_roles + @roles = Role.excludes('disabled' => true) + end + def set_attribute @class = 'users' end diff --git a/app/controllers/orbit_member_controller.rb b/app/controllers/orbit_member_controller.rb index 380d8bc..eee72d4 100644 --- a/app/controllers/orbit_member_controller.rb +++ b/app/controllers/orbit_member_controller.rb @@ -1,7 +1,6 @@ class OrbitMemberController < ApplicationController - include Authorize - include AdminHelper - include ApplicationHelper - + include OrbitBackendHelper + + before_action :authenticate_user layout "member" end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 2e7522e..4c37e7f 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -6,7 +6,10 @@ class UsersController < ApplicationController def create @user = User.new(user_params) + @member = MemberProfile.new(email: params[:email]) if @user.save + @member.save + @user.update_attributes(member_profile_id: @member.id) redirect_to root_url, :notice => "Signed Up Successfully, Please Check your email for confirmation!" @user.send_confirmation_email else @@ -32,6 +35,6 @@ class UsersController < ApplicationController # Never trust parameters from the scary internet, only allow the white list through. def user_params - params.require(:user).permit(:email, :password, :password_confirmation, :user_name) + params.require(:user).permit(:password, :password_confirmation, :user_name, :member_profile_id, :email) end end diff --git a/app/helpers/admin/attribute_values_view_helper.rb b/app/helpers/admin/attribute_values_view_helper.rb new file mode 100644 index 0000000..9a724c9 --- /dev/null +++ b/app/helpers/admin/attribute_values_view_helper.rb @@ -0,0 +1,16 @@ +module Admin::AttributeValuesViewHelper + OPT = [ + ["YYYY / MM / DD hh : mm","format1"], + ["YYYY / MM / DD","format2"], + ["YYYY / MM","format3"], + ["YYYY","format4"] + ] + def show_type_panel(attribute_field,type) + markup = attribute_field.markup + LIST[:markups][markup]["panel"] == type ? type : [type,'hide'].join(" ") + end + + def name_to_id(str) + str.gsub(/\]/,'').gsub(/\[/,"_") + end +end \ No newline at end of file diff --git a/app/helpers/admin/member_infos_helper.rb b/app/helpers/admin/member_infos_helper.rb new file mode 100644 index 0000000..1382853 --- /dev/null +++ b/app/helpers/admin/member_infos_helper.rb @@ -0,0 +1,2 @@ +module Admin::MemberInfosHelper +end diff --git a/app/helpers/attribute_fields_helper.rb b/app/helpers/attribute_fields_helper.rb new file mode 100644 index 0000000..8d2cbae --- /dev/null +++ b/app/helpers/attribute_fields_helper.rb @@ -0,0 +1,463 @@ +#encoding: utf-8 +module AttributeFieldsHelper + include ActionView::Helpers::FormTagHelper + include ActionView::Helpers::FormOptionsHelper + include ActionView::Helpers::DateHelper + include ActionView::Helpers::TagHelper + include ActionView::Helpers::RenderingHelper + include ActionView::Context + include OrbitBasis::RenderAnywhere + + include OrbitFormHelper + + def block_helper(user,index,disable = false) + unless self.disabled + @index = index + @markup_options = markup_options.merge(:disabled=>disable,:func=>"input_unit") + @user = user + @attribute_value = @user.get_value_from_field_id(id) + @new_attribute = @attribute_value.nil? + @attribute_value = @attribute_value || @user.attribute_values.build( attribute_field_id: id ) + @prefiled_value = @attribute_value.value + @panel_setting = self.get_data + return instance_eval("render_#{markup}") #rescue "" + + end + end + + def lang_tab(str,lang) + content_tag(:div,str,:class=>"tab-pane fade",:id=>(get_field_name_base+"tab_#{lang}")) + end + + def render_address + control_group_wrapper do |key,value| + value = (can_muti_lang_input? ? @prefiled_value[key] : @prefiled_value) rescue nil + key_field = can_muti_lang_input? ? "[#{key}]" : "" + place_holder= @panel_setting["placeholder"][key] rescue '' + # result = text_area_tag(get_field_name_base + key_field, value,@markup_options.merge({:placeholder=>place_holder,:for=>key})) + result = text_field_tag(get_field_name_base + key_field, value,@markup_options.merge({:placeholder=>place_holder,:for=>key})) + + add_ext= @attribute_value.address_ext[key] rescue {} + + result << hidden_field_tag(get_basic_field_name_base+"[address_ext][#{key}][county]",add_ext["county"],:class=>"county_#{key}") + result << hidden_field_tag(get_basic_field_name_base+"[address_ext][#{key}][street_address]",add_ext["street_address"],:class=>"street_address_#{key}") + result << hidden_field_tag(get_basic_field_name_base+"[address_ext][#{key}][city]",add_ext["city"],:class=>"city_#{key}") + result << hidden_field_tag(get_basic_field_name_base+"[address_ext][#{key}][zip]",add_ext["zip"],:class=>"zip_#{key}") + result << hidden_field_tag(get_basic_field_name_base+"[address_ext][#{key}][country]",add_ext["country"],:class=>"country_#{key}") + result << hidden_field_tag(get_basic_field_name_base+"[address_ext][#{key}][indicator]",add_ext["indicator"],:class=>"indicator_#{key}") + end + end + + def render_checkbox + @prefiled_value ||=[] + control_group_wrapper do + a = self[:option_list].collect do |key,value| + label_tag(key,check_box_tag(get_field_name_base+"[#{key}]", true , (@prefiled_value.include?(key) ? true : false), {})+value[I18n.locale.to_s],@markup_options.merge(:class=>"checkbox inline")) + end.join rescue "" + end + end + + def render_date + + d = DateTime.now() + + if date_is_range? + # fill_from = @attribute_value.get_date(:from) rescue nil + # fill_to = @attribute_value.get_date(:to) rescue nil + control_group_wrapper do + + case self.typeC['format'] + when 'format1' + fill_from = (@prefiled_value && @prefiled_value["from"] ) ? @prefiled_value["from"] : d.strftime("%Y/%m/%d %H:%M") + fill_to = (@prefiled_value && @prefiled_value["to"] ) ? @prefiled_value["to"] : d.strftime("%Y/%m/%d %H:%M") + buf = datetime_picker(get_field_name_base+'[from]', fill_from, 'yyyy/MM/dd hh:mm', true) + buf << ' ~ ' + buf << datetime_picker(get_field_name_base+'[to]', fill_to, 'yyyy/MM/dd hh:mm', true) + when 'format2' + fill_from = (@prefiled_value && @prefiled_value["from"] ) ? @prefiled_value["from"] : d.strftime("%Y/%m/%d") + fill_to = (@prefiled_value && @prefiled_value["to"] ) ? @prefiled_value["to"] : d.strftime("%Y/%m/%d") + buf = datetime_picker(get_field_name_base+'[from]', fill_from, 'yyyy/MM/dd') + buf << ' ~ ' + buf << datetime_picker(get_field_name_base+'[to]', fill_to, 'yyyy/MM/dd') + when 'format3' + fill_from = (@prefiled_value && @prefiled_value["from"] ) ? @prefiled_value["from"] : d.strftime("%Y/%m") + fill_to = (@prefiled_value && @prefiled_value["to"] ) ? @prefiled_value["to"] : d.strftime("%Y/%m/") + buf = datetime_picker(get_field_name_base+'[from]', fill_from, 'yyyy/MM') + buf << ' ~ ' + buf << datetime_picker(get_field_name_base+'[to]', fill_to, 'yyyy/MM') + when 'format4' + fill_from = (@prefiled_value && @prefiled_value["from"] ) ? @prefiled_value["from"] : d.strftime("%Y") + fill_to = (@prefiled_value && @prefiled_value["to"] ) ? @prefiled_value["to"] : d.strftime("%Y") + buf = datetime_picker(get_field_name_base+'[from]', fill_from, 'yyyy') + buf << ' ~ ' + buf << datetime_picker(get_field_name_base+'[to]', fill_to, 'yyyy') + end + + # buf = date_select(get_field_name_base+'[from]',nil,@markup_options.merge(:default=>fill_from),:class=>"input-small") + # buf << ' ~ ' + # buf << date_select(get_field_name_base+'[to]',nil,@markup_options.merge(:default=>fill_to),:class=>"input-small") + buf + end + else + # @prefiled_value = @attribute_value.get_date + # @prefiled_value = @attribute_value.get_date + + case self.typeC['format'] + when 'format1' + tmp = datetime_picker(get_field_name_base, (@prefiled_value ? @prefiled_value : d.strftime("%Y/%m/%d %H:%M")), 'yyyy/MM/dd hh:mm', true) + when 'format2' + tmp = datetime_picker(get_field_name_base, (@prefiled_value ? @prefiled_value : d.strftime("%Y/%m/%d")), 'yyyy/MM/dd') + when 'format3' + tmp = datetime_picker(get_field_name_base, (@prefiled_value ? @prefiled_value : d.strftime("%Y/%m")), 'yyyy/MM') + when 'format4' + tmp = datetime_picker(get_field_name_base, (@prefiled_value ? @prefiled_value : d.strftime("%Y")), 'yyyy') + end + + control_group_wrapper{tmp} + # control_group_wrapper{date_select(get_field_name_base,nil,@markup_options.merge(:default=>@prefiled_value),:class=>"input-small")} + + end + end + + def datetime_picker(object_name, value, format, time=false) + content_tag :div, :class => "input-append datetimepick", "data-date-format"=>format, "data-picktime"=>"#{time}" do + concat text_field_tag(object_name, value, :placeholder=>format) + concat (content_tag :span, :class => 'add-on clearDate' do + content_tag :i, nil, :class => 'icons-cross-3' + end) + concat (content_tag :span, :class => 'add-on iconbtn' do + content_tag :i, nil, 'data-time-icon' => 'icons-clock', 'data-date-icon' => 'icons-calendar', :class=>"icons-calendar" + end) + end + end + + def render_date_durnation #Need re-write low priority + + end + + def render_radio_button + @prefiled_value ||=[] + control_group_wrapper do + self[:option_list].collect do |key,value| + label_tag(key,radio_button_tag(get_field_name_base, key , (@prefiled_value.include?(key) ? true : false), {})+value[I18n.locale.to_s],@markup_options.merge(:class=>"radio inline")) + end.join + end + end + + def render_select + prompt = @panel_setting["initial"][I18n.locale.to_s] rescue nil + @markup_options.merge!(:prompt => prompt) unless prompt.nil? + control_group_wrapper{select_tag( get_field_name_base,options_for_select(self.option_list.collect{|p| [p[1][I18n.locale.to_s],p[0]]},@prefiled_value),@markup_options)} rescue "" + end + + def render_text_area + control_group_wrapper do |key,value| + value = can_muti_lang_input? ? @prefiled_value[key] : @prefiled_value + key = can_muti_lang_input? ? "[#{key}]" : "" + place_holder= @panel_setting["placeholder"][I18n.locale.to_s] rescue '' + text_area_tag(get_field_name_base + key, value,@markup_options.merge(:placeholder=>place_holder)) + end + end + + def render_text_field + a = control_group_wrapper do |key,value| + add_more_blank = can_add_more ? "[]" : "" + key_field = can_muti_lang_input? ? "[#{key}]" : "" + place_holder= @panel_setting["placeholder"][key] rescue '' + text_field_tag([get_field_name_base,add_more_blank,key_field].join, value,@markup_options.merge(:placeholder=>place_holder)) + end + end + + def date_is_range? + is_range = "false" + data = get_data + if !data.nil? + is_range = data['is_range'] if data.has_key? "is_range" + end + is_range == "true" + end + +protected + + def lang_panel_tabbable_wrapper(add_more_params,&block) + add_more_counter = '' + + if self.markup=='text_area' #or self.markup=='address' + + tmp1 = VALID_LOCALES.collect do |key| + value = @prefiled_value[key] rescue nil + # div_class_ary = ["tab-pane" ,"fade","#{get_pairing_tab_class({})}_#{key}"] + div_class_ary = ["tab-pane" ,"fade"] + + div_id = "#{get_pairing_tab_class({})}_#{key}" + + if can_add_more + add_more_value = add_more_params[0][:value] + add_more_counter = add_more_params[0][:counter] + value = add_more_value[key] rescue nil + div_class_ary << "add_more_item_#{add_more_counter}" + end + + div_class = div_class_ary.join(" ") + div_class << (key == I18n.locale.to_s ? " active in" : '') + content_tag(:div,yield(key,value), :id=>div_id,:class=>div_class) + end# of VALID_LOCALES.collect for tabed input + + + tmp2 = content_tag(:div,:class => 'btn-group', :data=>{:toggle=>"buttons-radio"}) do + buff2 = VALID_LOCALES.each.collect do |key| + # link_entry = self.add_more ? "#{add_more_tab(:tab_btn,loop_counter,key)}" : "#tab"+id.to_s+"_#{key}" + link_entry_ary = ["##{get_pairing_tab_class({})}","_#{key}"] + link_entry_ary << ".add_more_item_#{add_more_counter}" if can_add_more + link_entry = link_entry_ary.join + link_to(I18nVariable.from_locale(key),link_entry,:data=>{:toggle=>"tab"},:class=>"btn #{(key == I18n.locale.to_s ? "active" : nil)}",:for=>key) + end # of VALID_LOCALES.collect for tabs + + buff2 << link_to((content_tag :i,'',:class=>'icon-edit'),"##{get_pairing_tab_class({})}_m_window", :role=>"button",:class=>'btn',:data=>{:toggle=>"modal"}) if self.markup == 'address' + buff2 << link_to((content_tag :i,'',:class=>'icon-trash'),"#",:class=>"btn remove-input") if self.add_more + buff2.join.html_safe + end # of content ul + + + tmp = content_tag :div,:class=> "tab-content textarea-lang" do + tmp2 << tmp1.join('').html_safe + end + + else + + # tmp = content_tag :div,:class=> (add_more || self.markup=='address') ? "input-append" : "tab-content" do + tmp1 = + content_tag :div,:class=> "tab-content" do + + buff = VALID_LOCALES.collect do |key| + value = @prefiled_value[key] rescue nil + # div_class_ary = ["tab-pane" ,"fade","#{get_pairing_tab_class({})}_#{key}"] + div_class_ary = ["tab-pane" ,"fade"] + + div_id = "#{get_pairing_tab_class({})}_#{key}" + + + if can_add_more + add_more_value = add_more_params[0][:value] + add_more_counter = add_more_params[0][:counter] + value = add_more_value[key] rescue nil + div_class_ary << "add_more_item_#{add_more_counter}" + end + + div_class = div_class_ary.join(" ") + div_class << (key == I18n.locale.to_s ? " active in" : '') + content_tag(:div,yield(key,value), :id=>div_id,:class=>div_class) + end# of VALID_LOCALES.collect for tabed input + + buff.join('').html_safe + + end + + tmp2 = content_tag(:div,:class => 'btn-group', :data=>{:toggle=>"buttons-radio"}) do + buff2 = VALID_LOCALES.each.collect do |key| + # link_entry = self.add_more ? "#{add_more_tab(:tab_btn,loop_counter,key)}" : "#tab"+id.to_s+"_#{key}" + link_entry_ary = ["##{get_pairing_tab_class({})}","_#{key}"] + link_entry_ary << ".add_more_item_#{add_more_counter}" if can_add_more + link_entry = link_entry_ary.join + link_to(I18nVariable.from_locale(key),link_entry,:data=>{:toggle=>"tab"},:class=>"btn #{(key == I18n.locale.to_s ? "active" : nil)}",:for=>key) + end # of VALID_LOCALES.collect for tabs + + buff2 << link_to((content_tag :i,'',:class=>'icon-edit'),"#address-field", :role=>"button",:class=>'btn',:data=>{:toggle=>"modal"}) if self.markup == 'address' + buff2 << link_to((content_tag :i,'',:class=>'icon-trash'),"#",:class=>"btn remove-input") if self.add_more + buff2.join.html_safe + end # of content ul + + + + tmp = content_tag :div,:class=> "input-append" do + tmp1 << tmp2 + end + + # tmp << content_tag(:ul,:class=> 'nav nav-pills') do + # VALID_LOCALES.each.collect do |key| + # # link_entry = self.add_more ? "#{add_more_tab(:tab_btn,loop_counter,key)}" : "#tab"+id.to_s+"_#{key}" + # link_entry_ary = [".#{get_pairing_tab_class({})}",".#{key}"] + # link_entry_ary << ".add_more_item_#{add_more_counter}" if can_add_more + # link_entry = link_entry_ary.join + # content_tag(:li,link_to(I18nVariable.from_locale(key),link_entry,:data=>{:toggle=>"tab"}),:class=>(key == I18n.locale.to_s ? "active" : nil),:for=>key) + # end.join.html_safe # of VALID_LOCALES.collect for tabs + # end # of content ul + + end + + end + + + def controls_wrapper(*add_more_params,&block) + result = '' + add_more_counter = "" + + if can_add_more + add_more_counter = add_more_params[0][:counter] + add_more_value = add_more_params[0][:value] + end + + + + if can_muti_lang_input? + result << lang_panel_tabbable_wrapper(add_more_params,&block) + result << gen_modal_dialog if self.markup == "address" + + # result << add_more_unt if can_add_more + else #cross lang field + + case can_add_more + when true + value = add_more_params[0][:value] + result << content_tag(:div,:class=>"input-append"){yield(nil,value) + link_to((content_tag :i,'',:class=>'icon-trash'),"#",:class=>"btn remove-input") } + # result << add_more_unt + else + value = @prefiled_value + result << yield(nil,value) + end + + + end + + result.html_safe + + end # of def controls_wrapper(&block) + + def control_group_wrapper(&block) + div_class = can_muti_lang_input? ? "control-group" : "control-group" + # div_class = can_muti_lang_input? ? "control-group language-swich" : "control-group" + result ="" + + case self.markup + + when "text_field" + + if can_add_more + + multipleInputs = + content_tag(:div,:class=>"add-target") do + @attribute_value.add_more_counter.times.collect do |t| + controls_wrapper(:value=>(@prefiled_value[t] rescue nil),:counter=>t,&block) + end.join('').html_safe # of add_more fields + end + + + temp = label + content_tag(:div, multipleInputs + add_more_unt, :class=>'controls add-input') + + result = content_tag(:div,temp,:class=>div_class) + + # result = label + multipleInputs + add_more_unt + # result = label + 一堆的輸入框(要用 multipleInput editMore 包起來) + add_more btn + hidden_fields + else + temp = label + content_tag(:div, controls_wrapper(&block), :class=>'controls') + result = content_tag(:div,temp,:class=>div_class) + + end + + when "address" + + # address = content_tag :div,:class=>"multipleInput editMore" do + address = content_tag :div,:class=>"control-group" do + label + content_tag(:div, controls_wrapper(&block), :class=>'controls add-input') + end # of div multipleInput editMore + + result = address + + else + temp = label + content_tag(:div, controls_wrapper(&block), :class=>'controls') + result = content_tag(:div,temp,:class=>div_class) + + end + + result << end_block + result.html_safe + + end + + + def add_more_unt + temp_field_name = get_basic_field_name_base + '[temp]' + add_more = content_tag :p,:class=> 'add-btn' do + content = link_to (content_tag :i,I18n.t(:add),:class=>"icon-plus"),"#","data-roles"=>"role_a",:class=>"trigger #{can_muti_lang_input? ? 'textLengInput' : 'textInput' } btn btn-small btn-primary" + content << hidden_field_tag("#{temp_field_name}[count]",@attribute_value.add_more_counter ,:class=>"list_count") + content << hidden_field_tag("#{temp_field_name}[count]",get_basic_field_name_base,:class=>"field_name") + content + end # of div + # add_more = content_tag :div,:class=> 'controls' do + # content_tag :span,:class=> 'help-block' do + # content = link_to (content_tag :i,I18n.t(:add),:class=>"icon-plus-sign"),"#",:class=>'addinput' + # content << hidden_field_tag("#{temp_field_name}[count]",@attribute_value.add_more_counter ,:class=>"list_count") + # content << hidden_field_tag("#{temp_field_name}[count]",get_basic_field_name_base,:class=>"field_name") + # content + # end # of span + # end # of div + end + + def end_block + if @new_attribute + hidden_field_tag(get_basic_field_name_base+"[attribute_field_id]",id,:for=>"field_#{@index}") + else + hidden_field_tag(get_basic_field_name_base+"[id]",@attribute_value.id,:for=>"field_#{@index}") + end + end + + def add_more_tab(mode,counter,key) + case mode + when :input_field + get_pairing_tab_class(:suffix=>['','tab'+counter.to_s,key].join('-')) + when :tab_btn + ".#{get_pairing_tab_class(:suffix=>['','tab'+counter.to_s,key].join('-'))}" + end + end + + def get_pairing_tab_class(opts) + prefix = opts[:prefix] + suffix = opts[:suffix] + str = get_basic_field_name_base.gsub("[","_").gsub("]",'') + str = prefix.nil? ? str : prefix+ str + suffix.nil? ? str : str + suffix + end + + def get_basic_field_name_base + if @new_attribute + "user[new_attribute_values][#{@index}]" + else + "user[attribute_values][#{@index}]" + end + end + + def get_field_name_base + get_basic_field_name_base + "[value]" + end + + def label + label_tag(key,title,:class=>"control-label muted",:func => "field_label") + end + + def can_muti_lang_input? + if self.markup == "address" + return true + else + LIST[:markups][markup]["muti_lang_input_supprt"] and !(get_data["cross_lang"] == "true") + end + end + + def can_add_more + if self.markup == "address" + return false + else + add_more + end + end + + def gen_modal_dialog + render_anywhere("shared/attribute_field/address_modal_dialog",{ + :field_name=>title, + :html_id=>"address-field", + :btn_class => "#{get_pairing_tab_class({})}", + :field_name_basic => get_basic_field_name_base + } + ) + end + +end \ No newline at end of file diff --git a/app/helpers/attribute_values_helper.rb b/app/helpers/attribute_values_helper.rb new file mode 100644 index 0000000..c72a7b6 --- /dev/null +++ b/app/helpers/attribute_values_helper.rb @@ -0,0 +1,109 @@ +module AttributeValuesHelper + def show_west_calender(from_to=nil) + case from_to + when :to + date = get_date(:to) + when :from + date = get_date(:from) + when nil + date = get_date + end + + # case self.attribute_field["typeC"]["format"] + # when 'format1' # Y/M/D h:m + # date.strftime("%Y/%m/%d %H:%M") + # when 'format2' # Y/M/D + # date.strftime("%Y/%m/%d") + # when 'format3' # Y/M + # date.strftime("%Y/%m") + # when 'format4' # Y + # date.strftime("%Y") + # end # of case west cal format + end + + def show_minguo_calendar(from_to=nil) + get_minguo + + case from_to + when :to + date = get_date(:to) + when :from + date = get_date(:from) + when nil + date = get_date + end + + @date = date.split('/') + date_year = @date[0].to_i + + year_str = "" + unless date_year == 1912 + m_year = (date_year - 1912).abs.to_s + I18n.t("date.minguo_calendar.year") + year_str = minguo_format_year(m_year) + end + get_minguo_year(from_to) + minguo_m_y_d_time(from_to) + end + + def get_minguo_year(from_to=nil) + case from_to + when :to + date = get_date(:to) + when :from + date = get_date(:from) + when nil + date = get_date + end + + @date = date.split('/') + date_year = @date[0].to_i + + m_year = (date_year - 1911).abs + year_end = I18n.t("date.minguo_calendar.year") + case + when date_year <1912 + I18n.t("date.minguo_calendar.before") + (m_year+1).to_s + year_end + when date_year ==1912 + I18n.t("date.minguo_calendar.first_year") + when date_year >1912 + I18n.t("date.minguo_calendar.after")+ (m_year).to_s + year_end + end # of case tw_calendar year + end + + def minguo_m_y_d_time(from_to=nil) + case from_to + when :to + date = get_date(:to) + when :from + date = get_date(:from) + when nil + date = get_date + end + @date = date.split('/') + + case self.attribute_field["typeC"]["format"] + when 'format1' # Y/M/D h:m + "/#{@date[1]}/#{@date[2]}" + when 'format2' # Y/M/D + "/#{@date[1]}/#{@date[2]}" + when 'format3' # Y/M + + "/#{@date[1]}#{I18n.t("date.minguo_calendar.month")}"\ + when 'format4' # Y + '' + end # of case + end + + def get_date_by_format(from_to = nil) + case I18n.locale + when :zh_tw + case + when self.attribute_field["typeC"]["calendar"] == "west_calendar" + show_west_calender(from_to) + when self.attribute_field["typeC"]["calendar"] == "tw_calendar" + show_minguo_calendar(from_to) + end #case self.attribute_field["typeC"]["calendar"] + when :en + show_west_calender(from_to) + end + end +end \ No newline at end of file diff --git a/app/helpers/member_helper.rb b/app/helpers/member_helper.rb new file mode 100644 index 0000000..65965f5 --- /dev/null +++ b/app/helpers/member_helper.rb @@ -0,0 +1,2 @@ +module MemberHelper +end diff --git a/app/helpers/orbit_form_helper.rb b/app/helpers/orbit_form_helper.rb new file mode 100644 index 0000000..05ffc2e --- /dev/null +++ b/app/helpers/orbit_form_helper.rb @@ -0,0 +1,108 @@ +module OrbitFormHelper + def self.included(base) + ActionView::Helpers::FormBuilder.send(:include, Orbit::FormBuilder) + end + + def datetime_picker(object_name, method, options = {}) + options[:icon_time] ||= 'icons-clock' + options[:icon_date] ||= 'icons-calendar' + options[:icon_clear] ||= 'icons-cross-3' + options[:input_class] ||= 'input-large' + options[:value] ||= options[:object].send(method) if options[:object] && options[:object][method] + case options[:picker_type] + when 'date' + content_tag :div, :id => options[:id], :class => options[:class] do + date_picker(object_name, method, options) + end + when 'time' + content_tag :div, :id => options[:id], :class => options[:class] do + time_picker(object_name, method, options) + end + when 'separated' + options[:label] ||= I18n.t('datetime_picker.separated.label') + content_tag :div, :id => options[:id], :class => "separated_picker #{options[:class]}" do + concat label_tag options[:label] unless options[:no_label] + concat hidden_field(object_name, method, :value => options[:value]) + concat separated_picker(object_name, method, options) + end + else + content_tag :div, :id => options[:id], :class => options[:class] do + default_picker(object_name, method, options) + end + end + end + + def date_picker(object_name, method, options) + custom = {} + custom[:format] = options[:format] || 'yyyy/MM' + custom[:value] = format_value(options[:value], custom[:format]) if options[:value] + custom[:picker_class] = 'date_picker' + custom[:label] = options[:label] || I18n.t('datetime_picker.date.label') + custom[:placeholder] = options[:placeholder] || I18n.t('datetime_picker.date.placeholder') + picker(object_name, method, options.merge(custom)) + end + + def default_picker(object_name, method, options) + custom = {} + custom[:format] = options[:format] || 'yyyy/MM/dd hh:mm' + custom[:value] = format_value(options[:value], custom[:format]) if options[:value] + custom[:picker_class] = 'default_picker' + custom[:label] = options[:label] || I18n.t('datetime_picker.default.label') + custom[:placeholder] = options[:placeholder] || I18n.t('datetime_picker.default.placeholder') + picker(object_name, method, options.merge(custom)) + end + + def time_picker(object_name, method, options) + custom = {} + custom[:format] = options[:format] || 'hh:mm' + custom[:value] = format_value(options[:value], custom[:format]) if options[:value] + custom[:picker_class] = 'time_picker' + custom[:label] = options[:label] || I18n.t('datetime_picker.time.label') + custom[:placeholder] = options[:placeholder] || I18n.t('datetime_picker.time.placeholder') + picker(object_name, method, options.merge(custom)) + end + + def separated_picker(object_name, method, options) + custom = {} + custom[:no_label] = true + custom[:separated] = true + date_picker(nil, nil, options.merge(custom)) + time_picker(nil, nil, options.merge(custom)) + end + + + def single_picker(object_name, method, options) + content_tag :div, :id => options[:id], :class => options[:class] do + picker(object_name, method, options) + end + end + + def double_picker(object_name, method, options) + + end + + def picker(object_name, method, options) + content_tag :div, :class => "#{options[:picker_class]} input-append", :style => "#{(options[:picker_class].eql?('time_picker') && options[:value].blank? && options[:separated]) ? 'pointer-events:none' : nil}" do + concat label_tag options[:label] unless options[:no_label] + concat text_field object_name, method, :placeholder => options[:placeholder], :class => options[:input_class], 'data-format' => options[:format], :value => options[:value] + concat (content_tag :span, :class => 'add-on clearDate' do + content_tag :i, nil, :class => options[:icon_clear] + end) + concat (content_tag :span, :class => 'add-on iconbtn' do + content_tag :i, nil, 'data-time-icon' => options[:icon_time], 'data-date-icon' => options[:icon_date] + end) + end + end + + def format_value(value, format) + value.strftime(format.gsub('yyyy', '%Y').gsub('MM', '%m').gsub('dd', '%d').gsub('hh', '%H').gsub('mm', '%M')) + end + +end + +module Orbit::FormBuilder + # ActionPack's metaprogramming would have done this for us, if FormHelper#labeled_input + # had been defined at load. Instead we define it ourselves here. + def datetime_picker(method, options = {}) + @template.datetime_picker(@object_name, method, objectify_options(options)) + end +end \ No newline at end of file diff --git a/app/mailers/confirm_user_mailer.rb b/app/mailers/confirm_user_mailer.rb index 0c47f5c..b0d74e2 100644 --- a/app/mailers/confirm_user_mailer.rb +++ b/app/mailers/confirm_user_mailer.rb @@ -2,7 +2,7 @@ class ConfirmUserMailer < ActionMailer::Base default from: "noreply@rulingcom.com" def user_confirmation_email(user) - email = user.email + email = user.member_profile.email @confirmation_token = user.confirmation_token mail(:to => email, :subject => "User Confirmation instructions") end diff --git a/app/models/member_profile.rb b/app/models/member_profile.rb index eccc1a1..4dace42 100644 --- a/app/models/member_profile.rb +++ b/app/models/member_profile.rb @@ -1,10 +1,20 @@ class MemberProfile include Mongoid::Document + include Mongoid::Timestamps + field :first_name, type: String, localize: true field :last_name, type: String, localize: true field :gender field :sid field :office_tel + field :birthday, type: DateTime + field :address + field :personal_website + field :autobiography, type: String, localize: true + field :email, type: String + + VALID_EMAIL_FORMAT = /\A[^@\s]+@([^@.\s]+\.)+[^@.\s]+\z/ + validates :email, uniqueness: true, format: { with: VALID_EMAIL_FORMAT } has_one :user has_and_belongs_to_many :roles diff --git a/app/models/member_profile_field.rb b/app/models/member_profile_field.rb new file mode 100644 index 0000000..faf6996 --- /dev/null +++ b/app/models/member_profile_field.rb @@ -0,0 +1,115 @@ +class MemberProfileField + include Mongoid::Document + include Mongoid::Timestamps + include ::AttributeFieldsHelper + + field :key, type: String + field :title, type: String, localize: true + field :markup, default: "text_field" + field :option_list, type: Hash,default: {} + field :markup_options, type: Hash + field :built_in, type: Boolean, default: false + field :disabled, type: Boolean, default: false + field :to_delete, type: Boolean,default: false + + field :to_search, type: Boolean, default: false + field :to_show,type: Boolean,default: true + + field :typeA, type: Hash, default: {cross_lang: false} + field :typeB, type: Hash, default: {} + field :typeC, type: Hash, default: {calendar: "west_calendar", format: "format3"} + field :typeD, type: Hash, default: {cross_lang: false} + field :typeE, type: Hash, default: {} + + embeds_many :member_profile_field_values + + def markup_value + get_data["option_list"] + end + + def add_more + (get_data["add_more"] == "true" ? true : false) rescue false + end + + def locale + get_data["cross_lang"] == "true" ? false : true + end + + + def option_list + if self[:option_list].nil? || (self[:option_list].empty?) + return {} + else + return self[:option_list] + end + end + + def markup_options=(var) + self[:markup_options] = (eval(var) rescue {}) + end + + def markup_options + if self[:markup_options].nil? + return {} + else + Hash[self[:markup_options].map{|key,val|[key.to_sym,val]}] rescue {} + end + + end + + def role + self.attribute.role + end + + def panel + panel = LIST[:markups][self[:markup]]["panel"] + end + + def get_data + self[panel] + end + + def typeA=(var) + check_add_more_convert(var) + check_cross_lang_convert(var,"typeA") + self["typeA"] = var + end + + def typeD=(var) + check_cross_lang_convert(var,"typeD") + self["typeD"] = var + end + + def is_built_in? + self.built_in + end + + def is_disabled? + self.disabled + end + + protected + + def check_cross_lang_convert(var,field) + if self[field]["cross_lang"] != var["cross_lang"] + case var["cross_lang"] + when "true" #from no-add_more to add_more + cross_lang_convert(:to_cross_lang) + else #from add_more to no-add_more + cross_lang_convert(:to_no_cross_lang) + end # of case + end # of if + end + + def check_add_more_convert(var) + if self["typeA"]["add_more"] != var["add_more"] + case var["add_more"] + when "true" #from no-add_more to add_more + add_more_convert(:to_add_more) + else #from add_more to no-add_more + add_more_convert(:to_no_add_more) + end # of case + end # of if + end + +end diff --git a/app/models/member_profile_field_value.rb b/app/models/member_profile_field_value.rb new file mode 100644 index 0000000..ecae25c --- /dev/null +++ b/app/models/member_profile_field_value.rb @@ -0,0 +1,10 @@ +class MemberProfileFieldValue + include Mongoid::Document + include Mongoid::Timestamps + include AttributeValuesHelper + + field :key + field :address_key + + embedded_in :member_profile_field +end diff --git a/app/models/user.rb b/app/models/user.rb index 23e9910..ec297b2 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -5,7 +5,6 @@ class User include ActiveModel::SecurePassword field :user_name, type: String - field :email, type: String field :password_digest, type: String field :confirmation_token, type: String field :reset_token, type: String @@ -20,11 +19,11 @@ class User has_many :authorizations belongs_to :member_profile - VALID_EMAIL_FORMAT = /\A[^@\s]+@([^@.\s]+\.)+[^@.\s]+\z/ - validates :user_name, presence: true, uniqueness: true validates :password, presence: true, :on => :create, length: {:in => 8..20} - validates :email, presence: true, uniqueness: true, format: { with: VALID_EMAIL_FORMAT } + + #Add getter and setter for email virtual field + attr_accessor :email def generate_confirmation_token self.confirmation_token = SecureRandom.hex(5) diff --git a/app/views/admin/member_infos/_attributes.html.erb b/app/views/admin/member_infos/_attributes.html.erb new file mode 100644 index 0000000..0fd4043 --- /dev/null +++ b/app/views/admin/member_infos/_attributes.html.erb @@ -0,0 +1,16 @@ + + <% @attributes.each do |attribute| %> + + <%= attribute.key %> + + <%= attribute.title %> +
+ +
+ + <%= attribute.key %> + + <% end %> \ No newline at end of file diff --git a/app/views/admin/member_infos/edit.html.erb b/app/views/admin/member_infos/edit.html.erb new file mode 100644 index 0000000..df66b88 --- /dev/null +++ b/app/views/admin/member_infos/edit.html.erb @@ -0,0 +1,39 @@ +<% content_for :side_bar do %> + <%= render :partial => 'admin/members/side_bar' %> +<% end %> + +<% content_for :page_specific_css do -%> + <%= stylesheet_link_tag "lib/wrap-nav.css" %> + <%= stylesheet_link_tag "lib/pageslide.css" %> + <%= stylesheet_link_tag "lib/main-forms.css" %> + <%= stylesheet_link_tag "lib/togglebox.css" %> +<% end -%> + +<% content_for :page_specific_javascript do -%> + <%= javascript_include_tag "lib/jquery.tmpl.min.js" %> + <%= javascript_include_tag "lib/member/role-forms.js" %> +<% end -%> + +<%= form_for @attribute,:url => admin_member_info_path(@attribute) , :html => { :class=> "form-horizontal main-forms", :id=>'info' } do |f| %> +

Basic Info

+ +
+ +
+ +
+ +
+ + <%= hidden_field_tag 'id', params[:role_id] if !params[:role_id].blank? %> + <%= f.submit t(:submit),:class=>"btn btn-primary"%> + <%= link_to t('cancel'), get_go_back, :class=>"btn" %> +
+
+ +<% end %> + + +<% content_for :page_specific_javascript do -%> + <%= render 'js/support_member_form_js' %> +<% end -%> \ No newline at end of file diff --git a/app/views/admin/member_infos/index.html.erb b/app/views/admin/member_infos/index.html.erb new file mode 100644 index 0000000..6ea1cae --- /dev/null +++ b/app/views/admin/member_infos/index.html.erb @@ -0,0 +1,19 @@ +<% content_for :side_bar do %> + <%= render :partial => 'admin/members/side_bar' %> +<% end %> + + +
+ + + + + + + + + + <%= render :partial => "attributes",:collection=> @attributes%> + +
<%= t('key') %><%= t('title') %><%= t('type') %>
+
diff --git a/app/views/admin/member_infos/new.html.erb b/app/views/admin/member_infos/new.html.erb new file mode 100644 index 0000000..2b5787c --- /dev/null +++ b/app/views/admin/member_infos/new.html.erb @@ -0,0 +1,38 @@ +<% content_for :side_bar do %> + <%= render :partial => 'admin/members/side_bar' %> +<% end %> + +<% content_for :page_specific_css do -%> + <%= stylesheet_link_tag "lib/wrap-nav.css" %> + <%= stylesheet_link_tag "lib/pageslide.css" %> + <%= stylesheet_link_tag "lib/main-forms.css" %> + <%= stylesheet_link_tag "lib/togglebox.css" %> +<% end -%> + +<% content_for :page_specific_javascript do -%> + <%= javascript_include_tag "lib/jquery.tmpl.min.js" %> + <%= javascript_include_tag "lib/member/role-forms.js" %> +<% end -%> + +<%= form_for @attribute,:url => admin_member_infos_path(@attribute) , :html => { :class=> "form-horizontal main-forms", :id=>'info' } do |f| %> +

Basic Info

+ +
+ +
+ +
+ +
+ + <%= hidden_field_tag 'id', params[:role_id] if !params[:role_id].blank? %> + <%= f.submit t(:submit),:class=>"btn btn-primary"%> + <%= link_to t('cancel'), get_go_back, :class=>"btn" %> +
+
+ +<% end %> + +<% content_for :page_specific_javascript do -%> + <%= render 'js/support_member_form_js' %> +<% end -%> \ No newline at end of file diff --git a/app/views/admin/members/_member_basic.html.erb b/app/views/admin/members/_member_basic.html.erb index a9f30ad..57e630f 100644 --- a/app/views/admin/members/_member_basic.html.erb +++ b/app/views/admin/members/_member_basic.html.erb @@ -8,7 +8,7 @@
- <%= f.label t("users.avatar"),:class=>"control-label muted" %> +
@@ -37,7 +37,7 @@
- <%= f.label t("users.first_name"),{:class=>"control-label muted", :func=>"field_label"} %> +
@@ -63,7 +63,7 @@
- <%= f.label t("users.last_name"),{:class=>"control-label muted", :func=>"field_label"} %> +
@@ -87,9 +87,20 @@
+ +
+ +
+ <%= f.text_field :email, :class=>"input-medium", :id=>"account", :placeholder=>"#{t('users.email')}" %> +
+
+ +
- <%= f.label t("users.sid"),:class=>"control-label muted" %> +
<%= f.text_field :sid %> <%= t("users.sid_note")%> @@ -98,7 +109,7 @@
- <%= f.label t("users.office_tel"),:class=>"control-label muted" %> +
<%= f.text_field :office_tel %> <%= t("users.office_tel_note")%> @@ -107,7 +118,7 @@
- <%= f.label t("users.sex"),:class=>"control-label muted" %> +
+ +
+ +
+ <%= f.datetime_picker :birthday, :no_label => true %> +
+
+ + +
+ +
+ <%= f.text_area :address %> +
+
+ + + + + +
+ <% @site_in_use_locales.each_with_index do |locale, i| %> +
"> + +
+ +
+ <%= f.fields_for :autobiography_translations do |f| %> + <%= f.cktext_area locale, rows: 5, class: "input-block-level", :value => (@member.autobiography_translations[locale] rescue nil) %> + <% end %> +
+
+ +
+ <% end %> +
+
\ No newline at end of file diff --git a/app/views/admin/members/_member_for_listing.html.erb b/app/views/admin/members/_member_for_listing.html.erb index 93e0274..b5e1128 100644 --- a/app/views/admin/members/_member_for_listing.html.erb +++ b/app/views/admin/members/_member_for_listing.html.erb @@ -1,10 +1,10 @@ - <% if member_for_listing.member_profile.present?%> + <% if member_for_listing.present?%> <% - if member_for_listing.member_profile.gender == 'male' + if member_for_listing.gender == 'male' @member_gender = 'gender-man' - elsif member_for_listing.member_profile.gender == 'female' + elsif member_for_listing.gender == 'female' @member_gender = 'gender-woman' - elsif member_for_listing.member_profile.gender.nil? + elsif member_for_listing.gender.nil? @member_gender = 'gender-none' end %> @@ -12,17 +12,17 @@ - <% member_for_listing.member_profile.roles.each do |rf| %> + <% member_for_listing.roles.each do |rf| %> <% @roledata = Role.find(rf.id) %> <%= @roledata.title %> <% end %> - <%= link_to (member_for_listing.member_profile.name && member_for_listing.member_profile.name != member_for_listing.email ? member_for_listing.member_profile.name : member_for_listing.id),admin_member_path(member_for_listing.member_profile) %> + <%= link_to (member_for_listing.name && member_for_listing.name != (member_for_listing.email if member_for_listing.user.present?) ? member_for_listing.name : member_for_listing.user.id),admin_member_path(member_for_listing) %>
diff --git a/app/views/admin/members/_member_for_summary.html.erb b/app/views/admin/members/_member_for_summary.html.erb new file mode 100644 index 0000000..36f8ccf --- /dev/null +++ b/app/views/admin/members/_member_for_summary.html.erb @@ -0,0 +1,30 @@ +
  • +
    + <% + if member_for_summary.gender == 'male' + @member_sex = 'gender-man' + elsif member_for_summary.gender == 'female' + @member_sex = 'gender-woman' + elsif member_for_summary.gender.nil? + @member_sex = 'gender-none' + end + %> +

    +
    + <%= link_to(content_tag(:i, nil, :class => 'icon-edit'),edit_admin_member_path(member_for_summary),:class=>"edit" ) if current_user.is_admin?%> + <%= link_to(content_tag(:i, nil, :class => 'icon-key'),:class=>"key" ) if current_user.is_admin? and current_user.id != member_for_summary.id %> + <%= link_to(content_tag(:i, nil, :class => 'icon-trash'), admin_members_path(member_for_summary, :at=>params[:at]), :confirm => t(:sure?), :method => :delete, :class=>"trash", :remote => true) if current_user.is_admin? %> +
    + <%= image_tag(member_for_summary.avatar) %> +
    +
    +

    <%= link_to (member_for_summary.name && member_for_summary.name != member_for_summary.email ? member_for_summary.name : member_for_summary.user_id),admin_members_path(member_for_summary)%>

    +
    <%= member_for_summary.email%>
    +
    +
      + +
    +
    +
  • + + diff --git a/app/views/admin/members/_member_for_thumbnail.html.erb b/app/views/admin/members/_member_for_thumbnail.html.erb new file mode 100644 index 0000000..8bbad0b --- /dev/null +++ b/app/views/admin/members/_member_for_thumbnail.html.erb @@ -0,0 +1,22 @@ + <% + if member_for_thumbnail.gender == 'male' + @user_sex = 'gender-man' + elsif member_for_thumbnail.gender == 'female' + @user_sex = 'gender-woman' + elsif member_for_thumbnail.gender.nil? + @user_sex = 'gender-none' + end + %> +
  • +
    +
    + + <%= link_to(content_tag(:i, nil, :class => 'icon-edit'),edit_admin_member_path(member_for_thumbnail),:class=>"edit" ) if current_user.is_admin?%> + <%= link_to(content_tag(:i, nil, :class => 'icon-key'),:class=>"key" ) if current_user.is_admin? and current_user.id != member_for_thumbnail.id %> + <%= link_to(content_tag(:i, nil, :class => 'icon-trash'), admin_members_path(member_for_thumbnail, :at=>params[:at]), :confirm => t(:sure?), :method => :delete, :class=>"trash", :remote => true) if current_user.is_admin? %> + +
    + <%= image_tag(member_for_thumbnail.avatar) %> +
    +

    <%= link_to (member_for_thumbnail.name && member_for_thumbnail.name != member_for_thumbnail.email ? member_for_thumbnail.name : member_for_thumbnail.user_id),admin_members_path(member_for_thumbnail)%>

    +
  • \ No newline at end of file diff --git a/app/views/admin/members/_side_bar.html.erb b/app/views/admin/members/_side_bar.html.erb index 86388ae..8c5237e 100644 --- a/app/views/admin/members/_side_bar.html.erb +++ b/app/views/admin/members/_side_bar.html.erb @@ -6,7 +6,7 @@ +
    -
    - <%= f.email_field :email, :placeholder => t("users.email"), :id=>"user_email", :class=>"availibility" %> - - Not Available - Available -
    +
    + <%= email_field_tag :email, "", class: "availibility", id: "user_email", placeholder: t("users.email") %> + + Not Available + Available +
    @@ -55,40 +56,4 @@
    - - - \ No newline at end of file + \ No newline at end of file diff --git a/config/initializers/load_lists.rb b/config/initializers/load_lists.rb new file mode 100644 index 0000000..cf57726 --- /dev/null +++ b/config/initializers/load_lists.rb @@ -0,0 +1,2 @@ +data = File.open(File.join(Rails.root, 'config', 'list.yml')).read +LIST = YAML::load(ERB.new(data).result(binding)).symbolize_keys \ No newline at end of file diff --git a/config/list.yml b/config/list.yml new file mode 100644 index 0000000..abf05b9 --- /dev/null +++ b/config/list.yml @@ -0,0 +1,35 @@ +forbidden_item_names: + - admin + - panel + - appfront + +#NO_MULTI_TAG = ["select","date","radio_button","checkbox","date_durnation"] + +markups: + text_field: + muti_lang_input_supprt: true + ext_support: true + panel: typeA + select: + muti_lang_input_supprt: false + ext_support: false + panel: typeB + date: + muti_lang_input_supprt: false + ext_support: false + panel: typeC + text_area: + muti_lang_input_supprt: true + ext_support: false + panel: typeD + radio_button: + muti_lang_input_supprt: false + ext_support: false + panel: typeE + checkbox: + muti_lang_input_supprt: false + ext_support: false + panel: typeE + address: + muti_lang_input_supprt: true + ext_support: true diff --git a/config/locales/en.yml b/config/locales/en.yml index 6e7efc3..e18fead 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -319,7 +319,7 @@ en: me: Me member_: Member member_authorization: Authorizations - member_info: Profile Form + member_info: Member Attributes member_registration: Registration Approval member_role: Member Roles menu_enabled_for: Menu enabled for @@ -647,6 +647,11 @@ en: user_id_error: Someone already use that user account user_basic_id_form: Account Info. user_basic_data: Personal Profile + address: Address + personal_website: Personal Website + autobiography: Autobiography + birthday: Birthday + version: Version vertical: Vertical view: View diff --git a/config/locales/zh_tw.yml b/config/locales/zh_tw.yml index 04c0e4b..1117714 100644 --- a/config/locales/zh_tw.yml +++ b/config/locales/zh_tw.yml @@ -630,6 +630,10 @@ zh_tw: user_id_error: 該使用者帳號已被使用 user_basic_id_form: 帳號資料 user_basic_data: 個人資料 + address: 聯絡地址 + personal_website: 個人網址 + autobiography: 自我介紹 + birthday: 生日 version: 版本 vertical: 垂直的 view: 檢視 diff --git a/config/routes.rb b/config/routes.rb index ac8a5fd..1e0f679 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -39,6 +39,9 @@ Orbit::Application.routes.draw do locales = Site.first.in_use_locales rescue I18n.available_locales scope "(:locale)", locale: Regexp.new(locales.join("|")) do + + resources :member_profiles + resources :users do collection do get 'confirm_user' @@ -67,6 +70,8 @@ Orbit::Application.routes.draw do get 'role_field' post 'toggle' end + + resources :member_infos resources :module_apps do resources :categories do @@ -137,9 +142,7 @@ Orbit::Application.routes.draw do get 'update_orbit' get 'restart_server' end - - - + resources :designs do collection do get 'upload_package' @@ -153,7 +156,6 @@ Orbit::Application.routes.draw do end end get 'design_list' => 'designs#design_list' - get 'module_store' => 'module_store#index' end get ':page(/:page)(/:page)(/:page)', to: 'pages#show', constraints: KeywordConstraint.new diff --git a/test/controllers/admin/member_infos_controller_test.rb b/test/controllers/admin/member_infos_controller_test.rb new file mode 100644 index 0000000..f9b3033 --- /dev/null +++ b/test/controllers/admin/member_infos_controller_test.rb @@ -0,0 +1,9 @@ +require 'test_helper' + +class Admin::MemberInfosControllerTest < ActionController::TestCase + test "should get index" do + get :index + assert_response :success + end + +end diff --git a/test/controllers/member_controller_test.rb b/test/controllers/member_controller_test.rb new file mode 100644 index 0000000..04aacba --- /dev/null +++ b/test/controllers/member_controller_test.rb @@ -0,0 +1,9 @@ +require 'test_helper' + +class MemberControllerTest < ActionController::TestCase + test "should get new" do + get :new + assert_response :success + end + +end diff --git a/test/fixtures/member_infos.yml b/test/fixtures/member_infos.yml new file mode 100644 index 0000000..937a0c0 --- /dev/null +++ b/test/fixtures/member_infos.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +# This model initially had no columns defined. If you add columns to the +# model remove the '{}' from the fixture names and add the columns immediately +# below each fixture, per the syntax in the comments below +# +one: {} +# column: value +# +two: {} +# column: value diff --git a/test/fixtures/member_profile_field_values.yml b/test/fixtures/member_profile_field_values.yml new file mode 100644 index 0000000..937a0c0 --- /dev/null +++ b/test/fixtures/member_profile_field_values.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +# This model initially had no columns defined. If you add columns to the +# model remove the '{}' from the fixture names and add the columns immediately +# below each fixture, per the syntax in the comments below +# +one: {} +# column: value +# +two: {} +# column: value diff --git a/test/fixtures/member_profile_fields.yml b/test/fixtures/member_profile_fields.yml new file mode 100644 index 0000000..ddd653b --- /dev/null +++ b/test/fixtures/member_profile_fields.yml @@ -0,0 +1,9 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + key: MyString + title: MyString + +two: + key: MyString + title: MyString diff --git a/test/helpers/admin/member_infos_helper_test.rb b/test/helpers/admin/member_infos_helper_test.rb new file mode 100644 index 0000000..2f52bb9 --- /dev/null +++ b/test/helpers/admin/member_infos_helper_test.rb @@ -0,0 +1,4 @@ +require 'test_helper' + +class Admin::MemberInfosHelperTest < ActionView::TestCase +end diff --git a/test/helpers/member_helper_test.rb b/test/helpers/member_helper_test.rb new file mode 100644 index 0000000..f0c6a4e --- /dev/null +++ b/test/helpers/member_helper_test.rb @@ -0,0 +1,4 @@ +require 'test_helper' + +class MemberHelperTest < ActionView::TestCase +end diff --git a/test/models/member_info_test.rb b/test/models/member_info_test.rb new file mode 100644 index 0000000..a410b53 --- /dev/null +++ b/test/models/member_info_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class MemberInfoTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/models/member_profile_field_test.rb b/test/models/member_profile_field_test.rb new file mode 100644 index 0000000..e09b098 --- /dev/null +++ b/test/models/member_profile_field_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class MemberProfileFieldTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/models/member_profile_field_value_test.rb b/test/models/member_profile_field_value_test.rb new file mode 100644 index 0000000..ffeb0de --- /dev/null +++ b/test/models/member_profile_field_value_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class MemberProfileFieldValueTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end