member email validation, member can be created without an email

This commit is contained in:
Saurabh Bhatia 2014-06-03 11:01:03 +08:00
parent b9975fa7d5
commit 5c4ba2b0d5
9 changed files with 278 additions and 37 deletions

View File

@ -1,5 +1,8 @@
class Admin::MembersController < OrbitMemberController class Admin::MembersController < OrbitMemberController
before_action :set_member_profile, only: [:show, :edit, :update] before_action :set_member_profile, only: [:show, :edit, :update]
helper MemberHelper
helper OrbitBackendHelper
def index def index
@roles = Role.excludes(disabled: true) @roles = Role.excludes(disabled: true)

View File

@ -16,12 +16,10 @@ module AttributeFieldsHelper
@markup_options = markup_options.merge(:disabled=>disable,:func=>"input_unit") @markup_options = markup_options.merge(:disabled=>disable,:func=>"input_unit")
@member = member @member = member
@attribute_value = @member.get_value_from_field_id(id) @attribute_value = @member.get_value_from_field_id(id)
@new_attribute = @attribute_value.nil? @new_attribute = @attribute_value.nil?
@attribute_value = @attribute_value || @member.member_profile_field_values.build(member_profile_field: id) @attribute_value = @attribute_value || @member.member_profile_field_values.build(member_profile_field: id)
@prefiled_value = @attribute_value.value rescue nil @prefiled_value = @attribute_value.value rescue nil
@panel_setting = self.get_data
return instance_eval("render_#{markup}") #rescue "" return instance_eval("render_#{markup}") #rescue ""
end end
end end
@ -37,14 +35,14 @@ module AttributeFieldsHelper
# result = text_area_tag(get_field_name_base + key_field, value,@markup_options.merge({:placeholder=>place_holder,:for=>key})) # 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})) 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 {} add_ext= @attribute_value.address_key[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_key][#{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_key][#{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_key][#{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_key][#{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_key][#{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}") result << hidden_field_tag(get_basic_field_name_base+"[address_key][#{key}][indicator]",add_ext["indicator"],:class=>"indicator_#{key}")
end end
end end
@ -58,7 +56,6 @@ module AttributeFieldsHelper
end end
def render_date def render_date
d = DateTime.now() d = DateTime.now()
if date_is_range? if date_is_range?

View File

@ -9,7 +9,7 @@ module AttributeValuesHelper
date = get_date date = get_date
end end
# case self.attribute_field["typeC"]["format"] # case self.member_profile_field["typeC"]["format"]
# when 'format1' # Y/M/D h:m # when 'format1' # Y/M/D h:m
# date.strftime("%Y/%m/%d %H:%M") # date.strftime("%Y/%m/%d %H:%M")
# when 'format2' # Y/M/D # when 'format2' # Y/M/D
@ -80,7 +80,7 @@ module AttributeValuesHelper
end end
@date = date.split('/') @date = date.split('/')
case self.attribute_field["typeC"]["format"] case self.member_profile_field["typeC"]["format"]
when 'format1' # Y/M/D h:m when 'format1' # Y/M/D h:m
"/#{@date[1]}/#{@date[2]}" "/#{@date[1]}/#{@date[2]}"
when 'format2' # Y/M/D when 'format2' # Y/M/D
@ -97,11 +97,11 @@ module AttributeValuesHelper
case I18n.locale case I18n.locale
when :zh_tw when :zh_tw
case case
when self.attribute_field["typeC"]["calendar"] == "west_calendar" when self.member_profile_field["typeC"]["calendar"] == "west_calendar"
show_west_calender(from_to) show_west_calender(from_to)
when self.attribute_field["typeC"]["calendar"] == "tw_calendar" when self.member_profile_field["typeC"]["calendar"] == "tw_calendar"
show_minguo_calendar(from_to) show_minguo_calendar(from_to)
end #case self.attribute_field["typeC"]["calendar"] end #case self.member_profile_field["typeC"]["calendar"]
when :en when :en
show_west_calender(from_to) show_west_calender(from_to)
end end

View File

@ -17,7 +17,7 @@ class MemberProfile
field :position, type: Integer field :position, type: Integer
VALID_EMAIL_FORMAT = /\A[^@\s]+@([^@.\s]+\.)+[^@.\s]+\z/ VALID_EMAIL_FORMAT = /\A[^@\s]+@([^@.\s]+\.)+[^@.\s]+\z/
validates :email, uniqueness: true, format: { with: VALID_EMAIL_FORMAT } validates :email, uniqueness: true, format: { with: VALID_EMAIL_FORMAT }, if: :email_present?
validates :position, uniqueness: true validates :position, uniqueness: true
has_one :user has_one :user
@ -48,18 +48,42 @@ class MemberProfile
end end
end end
def get_attribute_value(attribute_field)
attribute_values.find_by(attribute_field_id: attribute_field.id)
end
def get_attribute_values def get_attribute_values
@attribute_values ||= self.member_profile_field_values rescue nil @attribute_values ||= self.member_profile_field_values rescue nil
end end
def get_value_from_field_id(field_id) def get_value_from_field_id(field_id)
values = get_attribute_values values = get_attribute_values
value = values.detect {|value| value.attribute_field_id == field_id} rescue nil value = values.detect {|value| value.member_profile_field_id == field_id} rescue nil
value ? value : nil value ? value : nil
end end
def self.get_member_list_attribute_field(field_key)
MemberProfileField.find_by(key: field_key)
end
def self.get_member_list_attribute_value(member_profile_id,field_id)
MemberProfileFieldValue.find_by(member_profile_id: member_profile_id, member_profile_field_id: field_id)
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)
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 assign_default_position? def assign_default_position?
self.position.nil? || self.parent_id_changed? self.position.nil? || self.parent_id_changed?
end end
def email_present?
self.email.present?
end
end end

View File

@ -9,4 +9,150 @@ class MemberProfileFieldValue
belongs_to :member_profile_field belongs_to :member_profile_field
belongs_to :member_profile belongs_to :member_profile
before_save :check_key
before_save :data_proc
def value(index = nil)
site = Site.first
result = case self.member_profile_field.markup
when 'text_field','text_area'
if self.member_profile_field.add_more and (self.member_profile_field.markup == "text_field")
index.nil? ? self["val"] : self["val"][index]
# self.member_profile_field.get_data[:cross_lang] ? Hash[VALID_LOCALES.collect{|lang| [lang,self[lang.to_sym]]}] : self["val"] #if !self.member_profile_field.get_data[:cross_lang]
else
self.member_profile_field.get_data["cross_lang"] =="true" ? self["val"] : Hash[site.valid_locales.collect{|lang| [lang,self[lang.to_sym]]}]
end
when 'select','radio_button','address'
self["val"]
when 'date'
if !self["val"].blank? and !self["val"]['(1i)'].blank?
"#{self["val"]['(1i)']}/#{self["val"]['(2i)']}/#{self["val"]['(3i)']}"
else
self["val"]
end
when 'checkbox'
self["val"]
end #end of case self.member_profile_field.markup
end
def value=(value)
#save everything to temp_data waiting for futher process
self[:temp_data] = value
end
def get_value_by_locale(locale,add_more_index=nil)
case self.member_profile_field.markup
when "text_field"
case self.member_profile_field.add_more
when true
if self.member_profile_field.locale
add_more_index.nil? ? self.value.collect{|t| t[locale.to_s]}.join(",") : self.value(add_more_index)[locale]
else
add_more_index.nil? ? self.value.join(",") : self.value(add_more_index)
end
when false
self.member_profile_field.locale ? self[locale.to_s] : self.value
end
when "select"
markup_values = self.member_profile_field.self_defined_markup_options? ? self.member_profile_field.markup_value : self.member_profile_field.markup_value
markup_values[self.value][locale.to_s] rescue 'NoData'
when "text_area"
self.member_profile_field.locale ? self[locale.to_s] : self.value
when "date"
if self.member_profile_field.date_is_range?
get_date_by_format(:from) + ' ~ ' + get_date_by_format(:to)
# self.value["from"] + ' ~ ' + self.value["to"]
else
get_date_by_format
# self.value
end
when "address"
self.value[locale.to_s]
when "radio_button"
markup_values = self.member_profile_field.markup_value
markup_values[self.value][locale.to_s]
when "checkbox"
markup_values = self.member_profile_field.markup_value
self.value.collect{|key| markup_values[key][locale.to_s]}.join(",")
when "date_durnation"
self.value
else
self.member_profile_field.locale ? self[locale.to_s] : self.value
end
end
def get_date(item = nil)
case item
when :from
# data = self[:val]["from"]
data = self.value["from"]
when :to
# data = self[:val]["to"]
data = self.value["to"]
when nil
# data = self[:val]
data = self.value
end
# Date.new(data["(1i)"].to_i,data["(2i)"].to_i,data["(3i)"].to_i) rescue nil
end
protected
def unset_all_lang_values
VALID_LOCALES.each{|t| self.unset t}
end
def data_proc
unless self[:temp_data].nil?
case self.member_profile_field.markup
when "address"
self["val"] = self["temp_data"]
when 'text_field','text_area'
if self.member_profile_field.add_more
self["val"] = self["temp_data"]
else # if not add_more
if self.member_profile_field.can_muti_lang_input?
self[:temp_data].each do |key,val|
self[key] = val
end if(!self.member_profile_field.get_data[:cross_lang])
else
self["val"] = self[:temp_data]
end
end # of self.member_profile_field.add_more
when 'select','date','radio_button'
self["val"] = self[:temp_data]
when 'checkbox'
self["val"] = self[:temp_data].keys
end #end of case self.member_profile_field.markup
end # of self[:temp_data].nil?
self.unset('temp_data')
self.unset('temp')
end #of data_proc
def check_key
self.key = member_profile_field.key
end
def method_missing(*field)
if field.size < 1
self[field[0]]
else
self[(field[0].to_s.delete "=")] = field[1]
end
end
end end

View File

@ -1,16 +0,0 @@
<% @attributes.each do |attribute| %>
<tr>
<td><%= attribute.key %></td>
<td>
<%= attribute.title %>
<div class="quick-edit">
<ul class="nav nav-pills">
<%= content_tag(:li, link_to(t(:edit),edit_admin_member_info_path(attribute))) if current_user.is_admin? %>
<%= content_tag(:li, link_to(t(:delete_),admin_member_info_path(attribute, :at=>params[:at]), :confirm => t(:sure?), :method => :delete, :class=>"text-error", :remote => true)) if current_user.is_admin? %>
</ul>
</div>
</td>
<td><%= attribute.key %></td>
</tr>
<% end %>

View File

@ -13,7 +13,21 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<%= render :partial => "attributes",:collection=> @attributes%> <% @attributes.each do |attribute| %>
<tr>
<td><%= attribute.key %></td>
<td>
<%= attribute.title %>
<div class="quick-edit">
<ul class="nav nav-pills">
<%= content_tag(:li, link_to(t(:edit),edit_admin_member_info_path(attribute))) if current_user.is_admin? %>
<%= content_tag(:li, link_to(t(:delete_),admin_member_info_path(attribute, :at=>params[:at]), :confirm => t(:sure?), :method => :delete, :class=>"text-error", :remote => true)) if current_user.is_admin? %>
</ul>
</div>
</td>
<td><%= attribute.key %></td>
</tr>
<% end %>
</tbody> </tbody>
</table> </table>
</div> </div>

View File

@ -22,7 +22,7 @@
%> %>
<tr id="<%= dom_id member %>"> <tr id="<%= dom_id member %>">
<td class="<%= member_sex %>"></td> <td class="<%= member_sex %>"></td>
<td><%= link_to member.position, '#', class: 'edit_position', 'data-user-id' => member.id %></td> <td><%= link_to (member.position + 1), '#', class: 'edit_position', 'data-user-id' => member.id %></td>
<td><%= link_to member.name, admin_member_path(member) %></td> <td><%= link_to member.name, admin_member_path(member) %></td>
<td><%= member.email %></td> <td><%= member.email %></td>
</tr> </tr>

View File

@ -6,4 +6,77 @@
<%= info.block_helper(@member, @form_index)%> <%= info.block_helper(@member, @form_index)%>
<% @form_index = @form_index +1 %> <% @form_index = @form_index +1 %>
</div> </div>
</div> </div>
<% content_for :page_specific_javascript do -%>
<% ( params[:id].blank? ? @fname = 'new_attribute_values' : @fname = 'attribute_values' ) %>
<!-- Text -->
<script id="template-text" type="text/x-tmpl">
<div class="input-append">
<input type="text" id="${roleType+'_text_'+appendIndex}" name="${'user[<%= @fname %>]['+nameNumber+'][value][]'}" class="input-medium" placeholder="">
<a href="#" class="btn remove-input">
<i class="icon-trash"></i>
</a>
</div>
</script>
<!-- Text Language -->
<script id="template-text-language" type="text/x-tmpl">
<div class="input-append">
<div class="tab-content">
<% @site_valid_locales.collect do |locale| %>
<% active = (locale == @site_in_use_locales.first ? "active" : "") %>
<div class="tab-pane fade <%= active %> in" id="${roleType+'_text_language_<%= locale %>_'+appendIndex}">
<input type="text" name="${'user[<%= @fname %>]['+nameNumber+'][value][][<%= locale %>]'}" placeholder="<%= I18nVariable.from_locale(locale) %>" value="">
</div>
<% end %>
</div>
<div class="btn-group" data-toggle="buttons-radio">
<% @site_valid_locales.collect do |locale| %>
<% active = (locale == @site_in_use_locales.first ? "active" : "") %>
<a class="btn <%= active %>" href="${'#'+roleType+'_text_language_<%= locale %>_'+appendIndex}" data-toggle="tab"><%= I18nVariable.from_locale(locale) %></a>
<% end %>
<a href="#" class="btn remove-input"><i class="icon-trash"></i></a>
</div>
</div>
</script>
<!-- Address -->
<script id="template-address" type="text/x-tmpl">
<div class="input-append">
<div class="tab-content">
<div class="tab-pane fade active in" id="${roleType+'_address_en_'+appendIndex}">
<input type="text" name="${'user[new_attribute_values]['+nameNumber+'][value][en]'}" placeholder="Address" value="">
<input type="hidden" id="${roleType+'_street_address_en_'+appendIndex}" name="${'user[new_attribute_values]['+nameNumber+'][address_ext][en][street_address]'}" value="">
<input type="hidden" id="${roleType+'_cityarea_en_'+appendIndex}" name="${'user[new_attribute_values]['+nameNumber+'][address_ext][en][county]'}" value="">
<input type="hidden" id="${roleType+'_city_en_'+appendIndex}" name="${'user[new_attribute_values]['+nameNumber+'][address_ext][en][city]'}" value="">
<input type="hidden" id="${roleType+'_zip_en_'+appendIndex}" name="${'user[new_attribute_values]['+nameNumber+'][address_ext][en][zip]'}" value="">
<input type="hidden" id="${roleType+'_county_en_'+appendIndex}" name="${'user[new_attribute_values]['+nameNumber+'][address_ext][en][country]'}" value="">
<input type="hidden" id="${roleType+'_indicator_en_'+appendIndex}" name="${'user[new_attribute_values]['+nameNumber+'][address_ext][en][indicator]'}" value="">
</div>
<div class="tab-pane fade" id="${roleType+'_address_zh_tw_'+appendIndex}">
<input type="text" name="${'user[new_attribute_values]['+nameNumber+'][value][zh_tw]'}" placeholder="地址" value="">
<input type="hidden" id="${roleType+'_street_address_zh_tw_'+appendIndex}" name="${'user[new_attribute_values]['+nameNumber+'][address_ext][zh_tw][street_address]'}" value="">
<input type="hidden" id="${roleType+'_cityarea_zh_tw_'+appendIndex}" name="${'user[new_attribute_values]['+nameNumber+'][address_ext][zh_tw][county]'}" value="">
<input type="hidden" id="${roleType+'_city_zh_tw_'+appendIndex}" name="${'user[new_attribute_values]['+nameNumber+'][address_ext][zh_tw][city]'}" value="">
<input type="hidden" id="${roleType+'_zip_zh_tw_'+appendIndex}" name="${'user[new_attribute_values]['+nameNumber+'][address_ext][zh_tw][zip]'}" value="">
<input type="hidden" id="${roleType+'_county_zh_tw_'+appendIndex}" name="${'user[new_attribute_values]['+nameNumber+'][address_ext][zh_tw][country]'}" value="">
<input type="hidden" id="${roleType+'_indicator_zh_tw_'+appendIndex}" name="${'user[new_attribute_values]['+nameNumber+'][address_ext][zh_tw][indicator]'}" value="">
</div>
</div>
<div class="btn-group" data-toggle="buttons-radio">
<a class="btn active" href="${'#'+roleType+'_address_en_'+appendIndex}" data-toggle="tab">English</a>
<a class="btn" href="${'#'+roleType+'_address_zh_tw_'+appendIndex}" data-toggle="tab">Chinese</a>
<a class="btn" href="#address-field" role="button" data-toggle="modal"><i class="icon-edit"></i></a>
<a href="#" class="btn remove-input"><i class="icon-trash"></i></a>
</div>
</div>
</script>
<% end -%>