From 6a0ba3f6bc5b9ff9cdf112cb93aea30a8e1f8b3c Mon Sep 17 00:00:00 2001 From: Saurabh Bhatia Date: Mon, 26 May 2014 09:45:46 +0800 Subject: [PATCH] Member Module - User Signup Changed, Member Summary, Thumbnail --- .../images/availability-check-loader.gif | Bin 0 -> 1644 bytes app/assets/images/person.png | Bin 0 -> 6989 bytes app/assets/images/result.png | Bin 0 -> 524 bytes app/assets/images/social-share-button.png | Bin 0 -> 7549 bytes app/assets/images/thumb_person.png | Bin 0 -> 2036 bytes app/assets/images/write.png | Bin 0 -> 738 bytes .../javascripts/admin/member_infos.js.coffee | 3 + .../javascripts/lib/member/role-forms.js | 32 +- app/assets/javascripts/member.js.coffee | 3 + .../stylesheets/admin/member_infos.css.scss | 3 + app/assets/stylesheets/member.css.scss | 3 + .../admin/member_infos_controller.rb | 55 +++ app/controllers/admin/members_controller.rb | 59 ++- app/controllers/orbit_member_controller.rb | 7 +- app/controllers/users_controller.rb | 5 +- .../admin/attribute_values_view_helper.rb | 16 + app/helpers/admin/member_infos_helper.rb | 2 + app/helpers/attribute_fields_helper.rb | 463 ++++++++++++++++++ app/helpers/attribute_values_helper.rb | 109 +++++ app/helpers/member_helper.rb | 2 + app/helpers/orbit_form_helper.rb | 108 ++++ app/mailers/confirm_user_mailer.rb | 2 +- app/models/member_profile.rb | 10 + app/models/member_profile_field.rb | 115 +++++ app/models/member_profile_field_value.rb | 10 + app/models/user.rb | 7 +- .../admin/member_infos/_attributes.html.erb | 16 + app/views/admin/member_infos/edit.html.erb | 39 ++ app/views/admin/member_infos/index.html.erb | 19 + app/views/admin/member_infos/new.html.erb | 38 ++ .../admin/members/_member_basic.html.erb | 66 ++- .../members/_member_for_listing.html.erb | 16 +- .../members/_member_for_summary.html.erb | 30 ++ .../members/_member_for_thumbnail.html.erb | 22 + app/views/admin/members/_side_bar.html.erb | 14 +- .../admin/members/_user_basic_passwd.html.erb | 43 ++ app/views/admin/members/edit.html.erb | 6 +- .../admin/members/index_summary.html.erb | 48 ++ app/views/admin/members/index_summary.js.erb | 3 + .../admin/members/index_thumbnail.html.erb | 48 ++ .../admin/members/index_thumbnail.js.erb | 3 + app/views/admin/members/new.html.erb | 40 ++ app/views/js/_support_member_form_js.erb | 277 +++++++++++ app/views/member/new.html.erb | 2 + app/views/users/new.html.erb | 51 +- config/initializers/load_lists.rb | 2 + config/list.yml | 35 ++ config/locales/en.yml | 7 +- config/locales/zh_tw.yml | 4 + config/routes.rb | 10 +- .../admin/member_infos_controller_test.rb | 9 + test/controllers/member_controller_test.rb | 9 + test/fixtures/member_infos.yml | 11 + test/fixtures/member_profile_field_values.yml | 11 + test/fixtures/member_profile_fields.yml | 9 + .../helpers/admin/member_infos_helper_test.rb | 4 + test/helpers/member_helper_test.rb | 4 + test/models/member_info_test.rb | 7 + test/models/member_profile_field_test.rb | 7 + .../models/member_profile_field_value_test.rb | 7 + 60 files changed, 1821 insertions(+), 110 deletions(-) create mode 100644 app/assets/images/availability-check-loader.gif create mode 100644 app/assets/images/person.png create mode 100644 app/assets/images/result.png create mode 100644 app/assets/images/social-share-button.png create mode 100644 app/assets/images/thumb_person.png create mode 100644 app/assets/images/write.png create mode 100644 app/assets/javascripts/admin/member_infos.js.coffee create mode 100644 app/assets/javascripts/member.js.coffee create mode 100644 app/assets/stylesheets/admin/member_infos.css.scss create mode 100644 app/assets/stylesheets/member.css.scss create mode 100644 app/controllers/admin/member_infos_controller.rb create mode 100644 app/helpers/admin/attribute_values_view_helper.rb create mode 100644 app/helpers/admin/member_infos_helper.rb create mode 100644 app/helpers/attribute_fields_helper.rb create mode 100644 app/helpers/attribute_values_helper.rb create mode 100644 app/helpers/member_helper.rb create mode 100644 app/helpers/orbit_form_helper.rb create mode 100644 app/models/member_profile_field.rb create mode 100644 app/models/member_profile_field_value.rb create mode 100644 app/views/admin/member_infos/_attributes.html.erb create mode 100644 app/views/admin/member_infos/edit.html.erb create mode 100644 app/views/admin/member_infos/index.html.erb create mode 100644 app/views/admin/member_infos/new.html.erb create mode 100644 app/views/admin/members/_member_for_summary.html.erb create mode 100644 app/views/admin/members/_member_for_thumbnail.html.erb create mode 100644 app/views/admin/members/_user_basic_passwd.html.erb create mode 100644 app/views/admin/members/index_summary.html.erb create mode 100644 app/views/admin/members/index_summary.js.erb create mode 100644 app/views/admin/members/index_thumbnail.html.erb create mode 100644 app/views/admin/members/index_thumbnail.js.erb create mode 100644 app/views/admin/members/new.html.erb create mode 100644 app/views/js/_support_member_form_js.erb create mode 100644 app/views/member/new.html.erb create mode 100644 config/initializers/load_lists.rb create mode 100644 config/list.yml create mode 100644 test/controllers/admin/member_infos_controller_test.rb create mode 100644 test/controllers/member_controller_test.rb create mode 100644 test/fixtures/member_infos.yml create mode 100644 test/fixtures/member_profile_field_values.yml create mode 100644 test/fixtures/member_profile_fields.yml create mode 100644 test/helpers/admin/member_infos_helper_test.rb create mode 100644 test/helpers/member_helper_test.rb create mode 100644 test/models/member_info_test.rb create mode 100644 test/models/member_profile_field_test.rb create mode 100644 test/models/member_profile_field_value_test.rb diff --git a/app/assets/images/availability-check-loader.gif b/app/assets/images/availability-check-loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..49b6d85326305cebc519dd8eb1a8fbe108b6f282 GIT binary patch literal 1644 zcmbW%ZA?>V6bJCf+xxWl#rF2T7Vd3(OIL0SDyd2qmMx^-i?iiL%f_59xXDBWW3W@F z9U-%7VN5EhC@1<6Kf|A^YItz~<*mOJ)U?WuH>Z7&P&*jZMdRaITF6Qs?cIFWp{c<#%& zApreXzKGeo*+)cHV@r1k;t|ZZyu({}=)lMVm=~wIyMn=3cSF1)$I*fxyS0^h3Kpu! zq^~vGYsXMg7CzFU1Y}bQ-X$MHYpV$^dQ47ds!2TsdC9?(sH%rJf@!&+CJzvZ5S6#Ms(okvlxx11a=I+S=`_*P&o!FiMvw!w~IWEDra zKBHZ3>PQhzSQUjq0ys42FoBdZWLXi`>;aS@=p>6X9uM$>6*wh^bDh`F%e&o@w1s(J zMXr~el```mBbJkad7-VoNU+jlj_Q64Wq3FfIJn!(c^2Sj!BSfmf&Z~D6kgj|2fIB> zJmig4lN-Yvck5tJvAEa#VVI$fb!LhY4huZT*45F_+Q?v%n3`h2G#EoE(IFFdmZe2o zF+iLWFY_3Ej&*C9l0?cb)Fz(mR0l-8EQ=oxtKub)epg>mpwDMy;qkoGWCnum>#%yi zt2^iedN^D>_9;fy!J#47!bPojbsK=^vcGZSpr1nv7d>e>8v6P7bTyRgFpyS`Ah5zh z6oUJl#B`RJWXVum9tromV~kT~?26H7rmcWtC{C6UHpP1GoQAk$1<))HO-7T( zTo!~M^TQIxbgBpy=wij7RV+$4(}v2mjTZFccQD!UEU zZ4!>6m_5bFoWxLdzl~-sMjAZl$mc&lyY(f*|?|eVL80ZVmEO+_Q<|*89X&t6L{QR5aJMutN_Dt3OytaEoq#dJ$ z=kDM79eM-A0|=uiRsx4Hl1g*YtldR$F-T&FojsMJcsK&}Yn^u9YLp-mBlLS2w+$MN zjTqJr116&x#MY4)w5vus@e??s>4!4G0Nk9PuY-nObzW<7xq_85et;xGxVJVp-M6)8 zz0Rnv_oh;~B?_TcM4J<|7`9wqx=FEAu`uLnW!9xVaS^x^98 zovT0e4Hh6e^;+S)(2lt)@I0JMz+cNcz6K4=UwE@QV0#cn`)YHKclSK;lqhoKsm3gn zruBy9bZrKOA7>8?71Ff$ zqL2^-D}w=~glg-;u`5>sNh@g6p}fFreemje6|Gj0#J3kN=Kq3_c>W6T=G<-lul@zk Ce59oS literal 0 HcmV?d00001 diff --git a/app/assets/images/person.png b/app/assets/images/person.png new file mode 100644 index 0000000000000000000000000000000000000000..db1d7d2460f9f21a1b2350879baefb2c0b06f383 GIT binary patch literal 6989 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/result.png b/app/assets/images/result.png new file mode 100644 index 0000000000000000000000000000000000000000..ff6c475bdc37a4ec9f14312b7c86f4c1db095baf GIT binary patch literal 524 zcmV+n0`vWeP)X)>i_@& zVo5|nR5*>TR5@-0F$^OC_xbKVJE?szh0dAH1_82D3~WoHC5kd1j|blQjdM=h3IP8P zC<&y)2@nX-*Yt}-5V9!JVnE2e^FQ`p86^lLBUeF?AdBB{(+nMM=S$GS~ESy%o(~QmOWke&PxUnMGs0Le>oc literal 0 HcmV?d00001 diff --git a/app/assets/images/social-share-button.png b/app/assets/images/social-share-button.png new file mode 100644 index 0000000000000000000000000000000000000000..3507161c70537db2d5dc99583d1a4992f7d5ecbd GIT binary patch literal 7549 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/thumb_person.png b/app/assets/images/thumb_person.png new file mode 100644 index 0000000000000000000000000000000000000000..f0493974cc8e8e49e1048eef058ec50949e90a6c GIT binary patch literal 2036 zcmaJ?X;c&E8XiI*Hl=8)P}VpN;6lm9Dv{Vi2HIGXvI$%^3CR$0A(=6mNZ5|Fih$mN z6^gaca%E9KEGUJDmTMFQ4T}ZsIdauDqNuSVAW%3^dhW!Ey+1B@&dhw@_n!B8-t9Rv z#bLq^-y%DZ0RVW5{}B{{uVJQV4FP|fso+I?vB!dAu}CBp%M>YLAW(v&z#v~PlEM+N zNRqYZIvfB1=B~1+SS(f$$`K=ShREc@(8y674FCb}YfzCm9mc>ESSnL+X_FT((LkAm zON;RlummU%PLq9Kog@V1yN&M8lLH&CCJg&vraGScD0($Kf+4Cj1O<7K zzTg&tNGwyB3|n6!1Og6Up~6H8G0ca!G@OGWlSw#%Y!)lXlLz_uu)NspV9%gnRuB~8 z=NA&f^V=5a&0fJmh*&L$71#<^@)tIERjf%2aukmY!AjX)SQ4T{J<~NAJg`=aPh-y>B9|x(NEgnz=PU9qKFZ*-m{kIy$=9$&!RKFo=}d_)hM?kt-r9OT zx28zS9i!;Kpa1soUG(0Oj>l7u4=!eK`f{^}CaY$a2JM>)3M_>DG5-Q1X@Rs*$zMLc z@7eFa=VoTkKYH}YU@$B$#?=nnecpTEz=5i&s`Ka1BNkRisHM`pyyZ7;Kc3+qC009H zS#~8M?Qy~3-j##Z=w|nka~rHIovr)E#%k_N{I;|_xzE0}^6Rh3WU}N9tH5;aonsXh z;6Hd5THD*(Pn-x$)rrO8va&MK?xgT=(b?G0O_2)4cUJi%OG_|6JajapV`xZtvVX*2 z0Bz~lj9AT*`Fgt-H}!h*;?v}JG!h9h?|NcF!Ut|*ik<%1__$kel10Aj|l6 zZ;nw*jYavQm;u^UPY;nYH9Lznki-vlt+2W?0lRnQ)~yZkI{Xt+H!(akWF4&8rCVq)AG+k0BMT>h1f_5A(8iHS3JCa4Y$WXt_u#Q*x_Nken9yL35;1$0DA71$#;T>lUb}U>a|+!UHR*}yu7^PX)>i_@( zI7vi7R5*=&ls#)!K@f$XgDZ(?RIm>cNYuilv$8Y!0XBk_kU+3dD2(fCn$3F-ea+I@7;V(^S<2OIXmZ^nbF$X8o(1^1rP_vDc~0HY}fa1 zz#HHpKtG1^kY-nU`Bm^>80DgycMYzC7 z*hc80@w#B%Xc_!FwQc^3bppu76H=+rfb0MSA+QSp>lbhmaU8s0SeKbcET^1XRPLG} z>;b|9IOE}_(6nVR7Lw%!;1gyswQXBpuVU1*Qg#cN!N$Qv@DG>(7Qv*Pb5PlBMuFJ_ zw)e5^Igzz4w+u7FxTx7fZUA%j11UFoz$k_G;6qk`?NY+t1kF{g0OEFPauamJ zis~Hehwy1Cdn94lkUiIvGD6~`%~DX_H?9Mx_oH8E?ufU*60n_`+=O(hXmii-Sok~E z2aCzVl1<68?)7l!DJ~ZblXBDU=(loJkHA-vE?_Q!zX*OB&8mzNeV;}xjo~OpDd(nt zh5j@$&H-N$XE3Y4%aLJ#jduqR57UsMl^!799}KIr>;Lha+5mJ>vJ{BLFt(wS9hHs9 z9(p$RiA`$ySsrb{Ry8<*{Mfu61QMC*D%pz_7P?#c65RrT&s+~-2 z+dc 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