diff --git a/app/assets/javascripts/lib/member/role-forms.js b/app/assets/javascripts/lib/member/role-forms.js index ea8d932..455cd6d 100644 --- a/app/assets/javascripts/lib/member/role-forms.js +++ b/app/assets/javascripts/lib/member/role-forms.js @@ -96,7 +96,7 @@ function inputAppendLength() { // Role Attribute Template Data function setData(l, type, ol) { - var fields = $('#info').length ? "member_profile_field" : $('#sub_role').length ? "sub_role[attribute_fields]" : "role[attribute_fields]", + var fields = $('#info').length ? "info[attribute_fields]" : $('#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]"], diff --git a/app/controllers/admin/member_infos_controller.rb b/app/controllers/admin/member_infos_controller.rb index 38c6666..c468ca4 100644 --- a/app/controllers/admin/member_infos_controller.rb +++ b/app/controllers/admin/member_infos_controller.rb @@ -5,12 +5,13 @@ class Admin::MemberInfosController < OrbitMemberController helper Admin::AttributeValuesViewHelper def index - @attributes = MemberProfileField.order('created_at DESC') + @attributes = MemberInfo.order('created_at DESC') @roles = Role.excludes('disabled' => true) end def new - @attribute = MemberProfileField.new + @attribute = MemberInfo.new + render layout: false end def show @@ -20,14 +21,30 @@ class Admin::MemberInfosController < OrbitMemberController end def create - @attribute = MemberProfileField.new(member_info_params) + @attribute = MemberInfo.new(info_params) @attribute.save redirect_to action: :index end def update - @attribute.update_params(member_info_params) + if info_params[:attribute_fields].present? + info_params[:attribute_fields].each do |a| + field_status = a.last[:id].present? + @attribute_field = MemberProfileField.add_attribute_field(@attribute, a.last, a.last[:id], field_status) + end + flash.now[:notice] = "Updated Fields" + respond_to do |format| + format.js { render 'admin/member_infos/add_attribute_field' } + end + else + @attribute.update_attributes(info_params) + @attribute.member_profile_fields.each{|t| t.destroy if t["to_delete"] == true} + respond_to do |format| + format.html { redirect_to(admin_member_infos_path) } + format.js { render 'admin/member_infos/toggle_enable' } + end + end end def destroy @@ -38,12 +55,11 @@ class Admin::MemberInfosController < OrbitMemberController private # Use callbacks to share common setup or constraints between actions. def set_member_info - @attribute = MemberProfileField.find(params[:id]) + @attribute = MemberInfo.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! + def info_params + params.require(:info).permit! end protected diff --git a/app/controllers/admin/members_controller.rb b/app/controllers/admin/members_controller.rb index c4bcf79..c07e189 100644 --- a/app/controllers/admin/members_controller.rb +++ b/app/controllers/admin/members_controller.rb @@ -114,9 +114,9 @@ class Admin::MembersController < OrbitMemberController if @member.save @user.member_profile_id = @member.id - if !params[:member_profile_field_value].nil? - params[:member_profile_field_value].each_with_index do |m,i| - @custom_field_value = @member.member_profile_field_values.new(value: m.second["value"], member_profile_field_id: m.second["member_profile_field_id"]) + if !params[:member_profile_field_values].nil? + params[:member_profile_field_values].each_with_index do |m,i| + @custom_field_value = @member.member_profile_field_values.build(value: m.second["value"], member_profile_field_id: m.second["member_profile_field_id"]) @custom_field_value.save end end @@ -130,7 +130,7 @@ class Admin::MembersController < OrbitMemberController def update respond_to do |format| - if @member.update(member_profile_params) + if @member.update_attributes(member_profile_params) if @member.user.present? @member.user.update(user_params) else @@ -138,6 +138,18 @@ class Admin::MembersController < OrbitMemberController @user.save @user.update_attributes(member_profile_id: @member.id) end + if !params[:member_profile_field_values].nil? + params[:member_profile_field_values].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 + format.html { redirect_to admin_members_path, notice: 'Successfully Updated the User' } format.json { head :no_content } diff --git a/app/helpers/attribute_fields_helper.rb b/app/helpers/attribute_fields_helper.rb index 0fc4f03..fa7ca09 100644 --- a/app/helpers/attribute_fields_helper.rb +++ b/app/helpers/attribute_fields_helper.rb @@ -49,7 +49,7 @@ module AttributeFieldsHelper def render_checkbox @prefiled_value ||=[] control_group_wrapper do - a = self[:option_list].collect do |key,value| + a = self.typeE[: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 @@ -132,22 +132,22 @@ module AttributeFieldsHelper end - def render_radio_button - @prefiled_value ||=[] + def render_radio_button + @prefiled_value ||=[] control_group_wrapper do - self[:option_list].collect do |key,value| + self.typeE[: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 + 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 "" + control_group_wrapper{select_tag( get_field_name_base,options_for_select(self.typeB["option_list"].collect{|p| [p[1][I18n.locale.to_s],p[0]]},@prefiled_value),@markup_options)} rescue "" end - def render_text_area + 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}]" : "" @@ -422,7 +422,7 @@ protected def get_basic_field_name_base if @new_attribute - "member_profile_field_value[#{@index}]" + "member_profile_field_values[#{@index}]" else "member_profile_field_values[#{@index}]" end diff --git a/app/models/member_info.rb b/app/models/member_info.rb new file mode 100644 index 0000000..03ab8ff --- /dev/null +++ b/app/models/member_info.rb @@ -0,0 +1,28 @@ +class MemberInfo + include Mongoid::Document + include Mongoid::Timestamps + + field :key, type: String + field :built_in, type: Boolean, default: false + field :disabled, type: Boolean, default: false + field :title, localize: true + + field :to_search, type: Boolean, default: false + field :to_show, type: Boolean, default: true + + has_many :member_profile_fields, autosave: true, dependent: :destroy + accepts_nested_attributes_for :member_profile_fields, allow_destroy: true + + + def is_built_in? + self.built_in + end + + def is_disabled? + self.disabled + end + + def get_enabled_attribute_fields + self.member_profile_fields.excludes('disabled' => true) + end +end diff --git a/app/models/member_profile.rb b/app/models/member_profile.rb index 7ae2b7c..4f313c9 100644 --- a/app/models/member_profile.rb +++ b/app/models/member_profile.rb @@ -10,7 +10,7 @@ class MemberProfile field :sid field :office_tel field :birthday, type: DateTime - field :address + field :address, type: String, localize: true field :personal_website field :autobiography, type: String, localize: true field :email, type: String @@ -22,7 +22,6 @@ class MemberProfile has_one :user has_and_belongs_to_many :roles - has_many :role_field_values has_and_belongs_to_many :role_statuses has_many :member_profile_field_values diff --git a/app/models/member_profile_field.rb b/app/models/member_profile_field.rb index bbbb236..8f71bbb 100644 --- a/app/models/member_profile_field.rb +++ b/app/models/member_profile_field.rb @@ -1,9 +1,11 @@ class MemberProfileField include Mongoid::Document include Mongoid::Timestamps + include Mongoid::Attributes::Dynamic include ::AttributeFieldsHelper field :key, type: String + field :af_count field :title, type: String, localize: true field :markup, default: "text_field" field :option_list, type: Hash,default: {} @@ -21,6 +23,7 @@ class MemberProfileField field :typeD, type: Hash, default: {cross_lang: false} field :typeE, type: Hash, default: {} + belongs_to :member_info has_many :member_profile_field_values def markup_value @@ -35,9 +38,17 @@ class MemberProfileField get_data["cross_lang"] == "true" ? false : true end - + def self_defined_markup_options? + (self.member_info.method(self[:key].pluralize.to_sym) && self.member_info.method(self[:key].pluralize+"_for_"+markup)) rescue false + end + def option_list - if self[:option_list].nil? || (self[:option_list].empty?) + if self_defined_markup_options? + #Class need to have corresponding field and value agent + # Ex: For "status" the class must have field called "statuses" for the relation and "statuses_for_select" for the select function + method = self.attribute.role.method(self[:key].pluralize+"_for_"+markup) + return (method.call rescue {}) + elsif self[:option_list].nil? || (self[:option_list].empty?) return {} else return self[:option_list] @@ -58,7 +69,7 @@ class MemberProfileField end def role - self.attribute.role + self.member_info end def panel @@ -88,8 +99,37 @@ class MemberProfileField self.disabled end + def self.add_attribute_field(member_info,attribute_param, attribute_field_id=nil,field_status) + if field_status.eql?(true) + @attribute_field_counter = member_info.member_profile_fields.count rescue nil + @attribute_field = self.find(attribute_field_id) rescue nil + @attribute_field.update(attribute_param) + @attribute_field.save + @attribute_field[:af_count] = @attribute_field_counter + else + @attribute_field_counter = member_info.member_profile_fields.count rescue nil + @attribute_field = member_info.member_profile_fields.build(attribute_param) rescue nil + @attribute_field.save + @attribute_field[:af_count] = @attribute_field_counter + end + return @attribute_field + end + + protected + def check_option_list + self[:option_list] = self[panel]["option_list"] rescue nil + end + + def add_more_convert(opt) + + end + + def cross_lang_convert(opt) + + end + def check_cross_lang_convert(var,field) if self[field]["cross_lang"] != var["cross_lang"] case var["cross_lang"] diff --git a/app/models/member_profile_field_value.rb b/app/models/member_profile_field_value.rb index 205ad9a..d98d0cb 100644 --- a/app/models/member_profile_field_value.rb +++ b/app/models/member_profile_field_value.rb @@ -109,6 +109,17 @@ class MemberProfileFieldValue # Date.new(data["(1i)"].to_i,data["(2i)"].to_i,data["(3i)"].to_i) rescue nil end + def self.put_field_values(member, field_value_param, field_value_id=nil,field_value_status) + if field_value_status.eql?(true) + @attribute_field_value = self.find(field_value_id) rescue nil + @attribute_field_value.update(field_value_param) + @attribute_field_value.save + else + @attribute_field_value = member.member_profile_field_values.build(field_value_param) rescue nil + @attribute_field_value.save + end + return @attribute_field_value + end protected diff --git a/app/views/admin/member_infos/_form.html.erb b/app/views/admin/member_infos/_form.html.erb new file mode 100644 index 0000000..dccadb8 --- /dev/null +++ b/app/views/admin/member_infos/_form.html.erb @@ -0,0 +1,9 @@ +<%= label_tag "key","key", :class=>"muted" %> +<%= f.text_field :key, :value => @attribute.key,:class=>"input-large", placeholder: t(:key) %> + +<%= f.fields_for :title_translations do |f| %> + <% current_site.in_use_locales.each do |locale| %> + <%= label_tag "name-#{locale}", "#{t(:name)} (#{t(locale.to_s)})" %> + <%= f.text_field locale, :class => 'input-large', :value => (@attribute.title_translations[locale] rescue ''), placeholder: t(:name) %> + <% end %> +<% 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..7da2f37 --- /dev/null +++ b/app/views/admin/member_infos/_index.html.erb @@ -0,0 +1,14 @@ +
| <%= t('key') %> | +<%= t('title') %> | +<%= t('title') %> | +
|---|