From 40aa1adbfcaa6d9c869ef451359649350b7a6844 Mon Sep 17 00:00:00 2001 From: Saurabh Bhatia Date: Mon, 16 Jun 2014 14:20:51 +0800 Subject: [PATCH] Role Fields working --- .../javascripts/lib/member/role-forms.js | 32 ++-- app/controllers/admin/roles_controller.rb | 36 +++- app/models/attribute_field.rb | 156 +++++++++++++++++ app/models/attribute_value.rb | 161 ++++++++++++++++++ app/models/member_profile.rb | 1 + app/models/role.rb | 11 +- app/models/role_field.rb | 9 - .../admin/roles/_attribute_field.html.erb | 141 +++++++++++++++ app/views/admin/roles/_role.html.erb | 2 +- .../admin/roles/add_attribute_field.js.erb | 1 + app/views/admin/roles/role_field.html.erb | 41 +++++ .../_address_modal_dialog.html.erb | 71 ++++++++ .../attribute_field/_attribute_field.html.erb | 141 +++++++++++++++ .../attribute_field/_list_block.html.erb | 41 +++++ .../_placeholder_block.html.erb | 25 +++ config/routes.rb | 1 + test/fixtures/attribute_fields.yml | 7 + test/fixtures/attribute_values.yml | 7 + test/fixtures/role_field_values.yml | 7 + test/models/attribute_field_test.rb | 7 + test/models/attribute_value_test.rb | 7 + test/models/role_field_value_test.rb | 7 + 22 files changed, 878 insertions(+), 34 deletions(-) create mode 100644 app/models/attribute_field.rb create mode 100644 app/models/attribute_value.rb delete mode 100644 app/models/role_field.rb create mode 100644 app/views/admin/roles/_attribute_field.html.erb create mode 100644 app/views/admin/roles/add_attribute_field.js.erb create mode 100644 app/views/admin/roles/role_field.html.erb create mode 100644 app/views/shared/attribute_field/_address_modal_dialog.html.erb create mode 100644 app/views/shared/attribute_field/_attribute_field.html.erb create mode 100644 app/views/shared/attribute_field/_list_block.html.erb create mode 100644 app/views/shared/attribute_field/_placeholder_block.html.erb create mode 100644 test/fixtures/attribute_fields.yml create mode 100644 test/fixtures/attribute_values.yml create mode 100644 test/fixtures/role_field_values.yml create mode 100644 test/models/attribute_field_test.rb create mode 100644 test/models/attribute_value_test.rb create mode 100644 test/models/role_field_value_test.rb diff --git a/app/assets/javascripts/lib/member/role-forms.js b/app/assets/javascripts/lib/member/role-forms.js index 3bca336..ea8d932 100644 --- a/app/assets/javascripts/lib/member/role-forms.js +++ b/app/assets/javascripts/lib/member/role-forms.js @@ -98,21 +98,21 @@ function inputAppendLength() { function setData(l, type, ol) { var fields = $('#info').length ? "member_profile_field" : $('#sub_role').length ? "sub_role[attribute_fields]" : "role[attribute_fields]", data = { - _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]"], + _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]"], }; return data; } @@ -488,4 +488,4 @@ $(function() { }); }); } -}); +}); \ No newline at end of file diff --git a/app/controllers/admin/roles_controller.rb b/app/controllers/admin/roles_controller.rb index 3a432fa..a7bb2a6 100644 --- a/app/controllers/admin/roles_controller.rb +++ b/app/controllers/admin/roles_controller.rb @@ -1,5 +1,7 @@ class Admin::RolesController < OrbitMemberController before_action :set_role, only: [:show, :edit , :update, :destroy] + before_action :set_attribute, only: [:role_field] + helper Admin::AttributeValuesViewHelper def index @roles = Role.all.asc("_id").entries @@ -29,12 +31,25 @@ class Admin::RolesController < OrbitMemberController end def update - if @role.update_attributes(role_params) - @role.role_fields.each{|t| t.destroy if t["to_delete"] == true} - redirect_to admin_roles_url + if params[:role][:attribute_fields] + role_params[:attribute_fields].each do |a| + @field_name = 'role' + field_status = a.last[:id].present? + @attribute_field = AttributeField.add_attribute_field(@role, a.last, a.last[:id], field_status) + @attribute = @role + end + flash.now[:notice] = "Updated Fields" + respond_to do |format| + format.js { render 'add_attribute_field' } + end else - flash.now[:error] = t('update.error.category') - render action: :edit + if @role.update_attributes(role_params) + @role.attribute_fields.each{|t| t.destroy if t["to_delete"] == true} + redirect_to admin_roles_url + else + flash.now[:error] = t('update.error.category') + render action: :edit + end end end @@ -53,6 +68,10 @@ class Admin::RolesController < OrbitMemberController redirect_to action: :index end + def role_field + @field_name = 'role' + @attribute = Role.find(params[:role_id]) + end private # Use callbacks to share common setup or constraints between actions. @@ -65,4 +84,11 @@ class Admin::RolesController < OrbitMemberController params.require(:role).permit! end + protected + + def set_attribute + @attribute_type = 'role' + @class = 'roles' + end + end diff --git a/app/models/attribute_field.rb b/app/models/attribute_field.rb new file mode 100644 index 0000000..73a4fcc --- /dev/null +++ b/app/models/attribute_field.rb @@ -0,0 +1,156 @@ +class AttributeField + 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: {} + 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: {} + + belongs_to :role + has_many :attribute_values, autosave: true, dependent: :destroy + before_save :check_option_list + + 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 self_defined_markup_options? + (self.role.method(self[:key].pluralize.to_sym) && self.role.method(self[:key].pluralize+"_for_"+markup)) rescue false + end + + def option_list + 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.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] + 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 + + def self.add_attribute_field(role,role_param, attribute_field_id=nil,field_status) + @field_name = 'role' + if field_status.eql?(true) + @attribute_field_counter = role.attribute_fields.count rescue nil + @attribute_field = self.find(attribute_field_id) rescue nil + @attribute_field.update(role_param) + @attribute_field.save + @attribute_field[:af_count] = @attribute_field_counter + else + @attribute_field_counter = role.attribute_fields.count rescue nil + @attribute_field = role.attribute_fields.build(role_param) rescue nil + @attribute_field.save + @attribute_field[:af_count] = @attribute_field_counter + end + return @attribute_field + 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 + + def cross_lang_convert(opt) + + end + + def check_option_list + self[:option_list] = self[panel]["option_list"] rescue nil + end + + def add_more_convert(opt) + + end + +end \ No newline at end of file diff --git a/app/models/attribute_value.rb b/app/models/attribute_value.rb new file mode 100644 index 0000000..9d611b5 --- /dev/null +++ b/app/models/attribute_value.rb @@ -0,0 +1,161 @@ +class AttributeValue + include Mongoid::Document + include Mongoid::Timestamps + include Mongoid::Attributes::Dynamic + include AttributeValuesHelper + + field :key, type: String + + belongs_to :attribute_field + belongs_to :member_profile + + before_save :check_key + before_save :data_proc + + def add_more_counter + index_max = self["val"].count rescue 0 + index_max == 0 ? 1 : index_max + end + + def value(index = nil) + site = Site.first + result = case self.attribute_field.markup + when 'text_field','text_area' + if self.attribute_field.add_more and (self.attribute_field.markup == "text_field") + index.nil? ? self["val"] : self["val"][index] + else + self.attribute_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.attribute_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.attribute_field.markup + when "text_field" + case self.attribute_field.add_more + when true + if self.attribute_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.attribute_field.locale ? self[locale.to_s] : self.value + end + + when "select" + markup_values = self.attribute_field.self_defined_markup_options? ? self.attribute_field.markup_value : self.attribute_field.markup_value + markup_values[self.value][locale.to_s] rescue 'NoData' + + when "text_area" + self.attribute_field.locale ? self[locale.to_s] : self.value + + when "date" + if self.attribute_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.attribute_field.markup_value + markup_values[self.value][locale.to_s] + + when "checkbox" + markup_values = self.attribute_field.markup_value + self.value.collect{|key| markup_values[key][locale.to_s]}.join(",") + + when "date_durnation" + self.value + + else + self.attribute_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.attribute_field.markup + when "address" + self["val"] = self["temp_data"] + when 'text_field','text_area' + if self.attribute_field.add_more + self["val"] = self["temp_data"] + else # if not add_more + if self.attribute_field.can_muti_lang_input? + self[:temp_data].each do |key,val| + self[key] = val + end if(!self.attribute_field.get_data[:cross_lang]) + else + self["val"] = self[:temp_data] + end + end # of self.attribute_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.attribute_field.markup + end # of self[:temp_data].nil? + self.unset('temp_data') + self.unset('temp') + end #of data_proc + + def check_key + self.key = attribute_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 diff --git a/app/models/member_profile.rb b/app/models/member_profile.rb index da0a14b..7ae2b7c 100644 --- a/app/models/member_profile.rb +++ b/app/models/member_profile.rb @@ -22,6 +22,7 @@ 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/role.rb b/app/models/role.rb index bb207d8..95e1f1d 100644 --- a/app/models/role.rb +++ b/app/models/role.rb @@ -1,13 +1,18 @@ class Role include Mongoid::Document + include Mongoid::Attributes::Dynamic + field :key, type: String field :title, type: String, localize: true - field :built_in, type: Boolean, :default => false - field :disabled, :type => Boolean, :default => false + field :built_in, type: Boolean, default: false + field :disabled, type: Boolean, default: false has_and_belongs_to_many :member_profiles has_many :authorizations - embeds_many :role_fields + + has_many :attribute_fields + accepts_nested_attributes_for :attribute_fields + has_many :role_statuses def is_built_in? diff --git a/app/models/role_field.rb b/app/models/role_field.rb deleted file mode 100644 index f7e4e1b..0000000 --- a/app/models/role_field.rb +++ /dev/null @@ -1,9 +0,0 @@ -class RoleField - include Mongoid::Document - include Mongoid::Timestamps - - field :key, type: String - field :title, type: String, localize: true - - embedded_in :role -end diff --git a/app/views/admin/roles/_attribute_field.html.erb b/app/views/admin/roles/_attribute_field.html.erb new file mode 100644 index 0000000..acfd472 --- /dev/null +++ b/app/views/admin/roles/_attribute_field.html.erb @@ -0,0 +1,141 @@ +
+<% + attribute_field.af_count ? @af_counter = attribute_field_counter + attribute_field.af_count : @af_counter = attribute_field_counter +%> +
+
+
+ <%= hidden_field "#{@field_name}[attribute_fields][#{@af_counter}]","disabled",:value=>attribute_field.disabled,:class=>"toggle-check", :data=>{:deploy=>"right"} %> + +
+
+ <%= t(:delete_)%> + <%= hidden_field "#{@field_name}[attribute_fields][#{@af_counter}]","to_delete",:value=>false,:class=>"attribute_field_to_delete"%> + Reset +

Attributes <%= @af_counter + 1 %>

+
+
+
+ +
+ <%= text_field "#{@field_name}[attribute_fields][#{@af_counter}]","key",:value=>attribute_field.key, :data=>{:type=>"key"} %> +
+
+ + <%= render :partial=>"shared/attribute_field/placeholder_block",:locals=>{:values=>attribute_field.title_translations,:class_ext=>"pull-left",:label_ext=>t(:name),:field_name=>"#{@field_name}[attribute_fields][#{@af_counter}][title_translations]"}%> + +
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ +
+
+
+ +
+ + <%= content_tag :div,:class=>"field-type default fade in #{show_type_panel(attribute_field,"typeA")}" do%> +
+ +
+ + +
+
+ <%= render :partial=>"shared/attribute_field/placeholder_block",:locals=>{:values=>attribute_field["typeA"]["placeholder"],:field_name=>"#{@field_name}[attribute_fields][#{@af_counter}][typeA][placeholder]"}%> + <% end if show_type_panel(attribute_field,"typeA") != 'typeA hide' %> + + <%= content_tag :div,:class=>"field-type default fade in #{show_type_panel(attribute_field,"typeB")}" do %> + <%= render :partial=>"shared/attribute_field/placeholder_block",:locals=>{:label_ext=>t(:initial),:values=>attribute_field["typeB"]["initial"],:field_name=>"#{@field_name}[attribute_fields][#{@af_counter}][typeB][initial]"}%> + + <% if attribute_field.self_defined_markup_options?%> + <%= render :partial=>"shared/attribute_field/list_block",:locals=>{:values=>attribute_field["option_list"],:field_name=> "#{@field_name}[attribute_fields][#{@af_counter}][attribute][role][statuses]"} %> + <%else #normal list%> + <%= render :partial=>"shared/attribute_field/list_block",:locals=>{:values=>attribute_field["option_list"],:field_name=> "#{@field_name}[attribute_fields][#{@af_counter}][typeB][option_list]"} %> + <% end #of self_defined_markup_options?%> + + <% end if show_type_panel(attribute_field,"typeB") != 'typeB hide' %> + + <%= content_tag :div,:class=>"field-type default fade in #{show_type_panel(attribute_field,"typeC")}" do %> +
+ +
+ <%= select "#{@field_name}[attribute_fields][#{@af_counter}][typeC]","format",Admin::AttributeValuesViewHelper::OPT,:class=>"dataType",:selected=>attribute_field["typeC"]["format"] %> +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+ <% end if show_type_panel(attribute_field,"typeC") != 'typeC hide' %> + + <%= content_tag :div,:class=>"field-type default fade in #{show_type_panel(attribute_field,"typeD")}" do%> +
+ +
+ +
+
+ <%= render :partial=>"shared/attribute_field/placeholder_block",:locals=>{:field_name=>"#{@field_name}[attribute_fields][#{@af_counter}][typeD][placeholder]",:values=>attribute_field["typeD"]["placeholder"]} %> + <% end if show_type_panel(attribute_field,"typeD") != 'typeD hide' %> + + <%= content_tag :div,:class=>"field-type default fade in #{show_type_panel(attribute_field,"typeE")}" do%> + <%= render :partial=>"shared/attribute_field/list_block",:locals=>{:field_name=>"#{@field_name}[attribute_fields][#{@af_counter}][typeE][option_list]",:values=>attribute_field["option_list"]}%> + <% end if show_type_panel(attribute_field,"typeE") != 'typeE hide' %> + + <%= hidden_field "#{@field_name}[attribute_fields][#{@af_counter}]","id",:value=>attribute_field.id%> + +
\ No newline at end of file diff --git a/app/views/admin/roles/_role.html.erb b/app/views/admin/roles/_role.html.erb index 79c6db1..f68a945 100644 --- a/app/views/admin/roles/_role.html.erb +++ b/app/views/admin/roles/_role.html.erb @@ -5,7 +5,7 @@
diff --git a/app/views/admin/roles/add_attribute_field.js.erb b/app/views/admin/roles/add_attribute_field.js.erb new file mode 100644 index 0000000..906a382 --- /dev/null +++ b/app/views/admin/roles/add_attribute_field.js.erb @@ -0,0 +1 @@ +$('<%= j render :partial => 'attribute_field', :collection => [@attribute_field] %>').appendTo('#attribute_field_list').hide().fadeIn(); \ No newline at end of file diff --git a/app/views/admin/roles/role_field.html.erb b/app/views/admin/roles/role_field.html.erb new file mode 100644 index 0000000..d012ac6 --- /dev/null +++ b/app/views/admin/roles/role_field.html.erb @@ -0,0 +1,41 @@ +<% 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 => eval("admin_#{@attribute_type}_path(@attribute)") , :html => { :class=> "form-horizontal main-forms", remote: true } do |f| %> + <% if flash.now[:notice].present? %> + <%= flash.now[:notice]%> + <% end %> + +

<%= @attribute.title + t(:role)%>

+
+ +
+ <%= render partial: "attribute_field",collection: @attribute.attribute_fields.asc(:_id)%> +
+ +
+ + <%= 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/shared/attribute_field/_address_modal_dialog.html.erb b/app/views/shared/attribute_field/_address_modal_dialog.html.erb new file mode 100644 index 0000000..cb1612a --- /dev/null +++ b/app/views/shared/attribute_field/_address_modal_dialog.html.erb @@ -0,0 +1,71 @@ + \ No newline at end of file diff --git a/app/views/shared/attribute_field/_attribute_field.html.erb b/app/views/shared/attribute_field/_attribute_field.html.erb new file mode 100644 index 0000000..334e982 --- /dev/null +++ b/app/views/shared/attribute_field/_attribute_field.html.erb @@ -0,0 +1,141 @@ +
+<% + attribute_field.af_count ? @af_counter = attribute_field_counter + attribute_field.af_count : @af_counter = attribute_field_counter +%> +
+
+
+ <%= hidden_field "info[attribute_fields][#{@af_counter}]","disabled",:value=>attribute_field.disabled,:class=>"toggle-check", :data=>{:deploy=>"right"} %> + +
+
+ <%= t(:delete_)%> + <%= hidden_field "info[attribute_fields][#{@af_counter}]","to_delete",:value=>false,:class=>"attribute_field_to_delete"%> + Reset +

Attributes <%= @af_counter + 1 %>

+
+
+
+ +
+ <%= text_field "info[attribute_fields][#{@af_counter}]","key",:value=>attribute_field.key, :data=>{:type=>"key"} %> +
+
+ + <%= render :partial=>"shared/attribute_field/placeholder_block",:locals=>{:values=>attribute_field.title_translations,:class_ext=>"pull-left",:label_ext=>t(:name),:field_name=>"info[attribute_fields][#{@af_counter}][title_translations]"}%> + +
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ +
+
+
+ +
+ + <%= content_tag :div,:class=>"field-type default fade in #{show_type_panel(attribute_field,"typeA")}" do%> +
+ +
+ + +
+
+ <%= render :partial=>"shared/attribute_field/placeholder_block",:locals=>{:values=>attribute_field["typeA"]["placeholder"],:field_name=>"info[attribute_fields][#{@af_counter}][typeA][placeholder]"}%> + <% end if show_type_panel(attribute_field,"typeA") != 'typeA hide' %> + + <%= content_tag :div,:class=>"field-type default fade in #{show_type_panel(attribute_field,"typeB")}" do %> + <%= render :partial=>"shared/attribute_field/placeholder_block",:locals=>{:label_ext=>t(:initial),:values=>attribute_field["typeB"]["initial"],:field_name=>"info[attribute_fields][#{@af_counter}][typeB][initial]"}%> + + <% if attribute_field.self_defined_markup_options?%> + <%= render :partial=>"shared/attribute_field/list_block",:locals=>{:values=>attribute_field["option_list"],:field_name=> "info[attribute_fields][#{@af_counter}][attribute][role][statuses]"} %> + <%else #normal list%> + <%= render :partial=>"shared/attribute_field/list_block",:locals=>{:values=>attribute_field["option_list"],:field_name=> "info[attribute_fields][#{@af_counter}][typeB][option_list]"} %> + <% end #of self_defined_markup_options?%> + + <% end if show_type_panel(attribute_field,"typeB") != 'typeB hide' %> + + <%= content_tag :div,:class=>"field-type default fade in #{show_type_panel(attribute_field,"typeC")}" do %> +
+ +
+ <%= select "info[attribute_fields][#{@af_counter}][typeC]","format",Admin::AttributeValuesViewHelper::OPT,:class=>"dataType",:selected=>attribute_field["typeC"]["format"] %> +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+ <% end if show_type_panel(attribute_field,"typeC") != 'typeC hide' %> + + <%= content_tag :div,:class=>"field-type default fade in #{show_type_panel(attribute_field,"typeD")}" do%> +
+ +
+ +
+
+ <%= render :partial=>"shared/attribute_field/placeholder_block",:locals=>{:field_name=>"info[attribute_fields][#{@af_counter}][typeD][placeholder]",:values=>attribute_field["typeD"]["placeholder"]} %> + <% end if show_type_panel(attribute_field,"typeD") != 'typeD hide' %> + + <%= content_tag :div,:class=>"field-type default fade in #{show_type_panel(attribute_field,"typeE")}" do%> + <%= render :partial=>"shared/attribute_field/list_block",:locals=>{:field_name=>"info[attribute_fields][#{@af_counter}][typeE][option_list]",:values=>attribute_field["option_list"]}%> + <% end if show_type_panel(attribute_field,"typeE") != 'typeE hide' %> + + <%= hidden_field "info[attribute_fields][#{@af_counter}]","id",:value=>attribute_field.id%> + +
\ No newline at end of file diff --git a/app/views/shared/attribute_field/_list_block.html.erb b/app/views/shared/attribute_field/_list_block.html.erb new file mode 100644 index 0000000..f47b450 --- /dev/null +++ b/app/views/shared/attribute_field/_list_block.html.erb @@ -0,0 +1,41 @@ + <% temp_field_name = field_name.gsub /\[\D*\]$/,'[temp]'%> +
+ <%= hidden_field_tag "#{temp_field_name}[count]",((values.keys.collect{|t| t.to_i}.max rescue nil) || 0 ),:class=>"list_count"%> + <%= hidden_field_tag "#{temp_field_name}[name]",field_name,:class=>"field_name"%> + +
+
+ + <%if values.blank? %> + <%= content_tag :div,:class=>"input-append" do%> + <% @site_in_use_locales.each do |locale| %> + <% last = (locale == @site_in_use_locales.last ? true : false) %> + <% p_value = value[locale.to_s] rescue nil%> + <%= text_field("#{field_name}[0]", locale,:placeholder=>I18nVariable.from_locale(locale),:class=>"input-medium",:data=>{:type=>"option_lang_0_#{locale}"}) %> + <% if last %> + + <% end %> + <% end %> + <% end %> + <%else%> + <%values.each do |index,value|%> + + <%= content_tag :div,:class=>"input-append" do%> + <% @site_in_use_locales.each do |locale| %> + <% last = (locale == @site_in_use_locales.last ? true : false) %> + <% p_value = value[locale.to_s] rescue nil%> + <%= text_field("#{field_name}[#{index}]", locale,:value=>p_value,:placeholder=>I18nVariable.from_locale(locale),:class=>"input-medium", :data=>{:type=>"option_lang_#{index}_#{locale}"}) %> + <% if last %> + + <% end %> + <% end %> + <% end %> + + <% end %> + <% end %> + +
+ +

<%= t(:add) %>

+
+
\ No newline at end of file diff --git a/app/views/shared/attribute_field/_placeholder_block.html.erb b/app/views/shared/attribute_field/_placeholder_block.html.erb new file mode 100644 index 0000000..7cd2f70 --- /dev/null +++ b/app/views/shared/attribute_field/_placeholder_block.html.erb @@ -0,0 +1,25 @@ + <% values ||=[]%> + <%= content_tag :div,:class=>"control-group" do%> + +
+
+
+ <% @site_in_use_locales.each do |locale| %> + <% active = (locale == @site_in_use_locales.first ? "active in" : "'") %> + <%= content_tag :div,:class=>"tab-pane fade #{active}",:id=>"#{name_to_id(field_name)}_#{locale}" do%> + <% locale_value = values[locale.to_s] rescue nil%> + <%= text_field(field_name, locale,:value=>locale_value,:placeholder=>I18nVariable.from_locale(locale),:data=>{:type=>"lang_#{locale}"}) %> + <% end %> + <% end %> +
+ +
+ <% @site_in_use_locales.each do |locale| %> + <% active = (locale == @site_in_use_locales.first ? "active" : "") %> + <%= link_to I18nVariable.from_locale(locale),"##{name_to_id(field_name)}_#{locale}",:class=>"btn #{active}",:data=>{:toggle=>"tab"}%> + <% end %> +
+ +
+
+ <% end %> \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 5a0552b..9b7680e 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -100,6 +100,7 @@ Orbit::Application.routes.draw do resources :roles do get 'role_field' + get 'add_attribute_field' post 'toggle' end diff --git a/test/fixtures/attribute_fields.yml b/test/fixtures/attribute_fields.yml new file mode 100644 index 0000000..116e057 --- /dev/null +++ b/test/fixtures/attribute_fields.yml @@ -0,0 +1,7 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + key: MyString + +two: + key: MyString diff --git a/test/fixtures/attribute_values.yml b/test/fixtures/attribute_values.yml new file mode 100644 index 0000000..116e057 --- /dev/null +++ b/test/fixtures/attribute_values.yml @@ -0,0 +1,7 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + key: MyString + +two: + key: MyString diff --git a/test/fixtures/role_field_values.yml b/test/fixtures/role_field_values.yml new file mode 100644 index 0000000..116e057 --- /dev/null +++ b/test/fixtures/role_field_values.yml @@ -0,0 +1,7 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + key: MyString + +two: + key: MyString diff --git a/test/models/attribute_field_test.rb b/test/models/attribute_field_test.rb new file mode 100644 index 0000000..c51178c --- /dev/null +++ b/test/models/attribute_field_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class AttributeFieldTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/models/attribute_value_test.rb b/test/models/attribute_value_test.rb new file mode 100644 index 0000000..9526514 --- /dev/null +++ b/test/models/attribute_value_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class AttributeValueTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/models/role_field_value_test.rb b/test/models/role_field_value_test.rb new file mode 100644 index 0000000..01fc031 --- /dev/null +++ b/test/models/role_field_value_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class RoleFieldValueTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end