diff --git a/app/controllers/profiles_controller.rb b/app/controllers/profiles_controller.rb index bd9639e..bd39d82 100644 --- a/app/controllers/profiles_controller.rb +++ b/app/controllers/profiles_controller.rb @@ -12,7 +12,9 @@ class ProfilesController < ApplicationController # GET /profiles/new def new - @profile = Profile.new + kind = params[:kind] + kind = Profile.types.first unless Profile.types.include?(kind) + @profile = Profile.new kind: kind end # GET /profiles/1/edit @@ -26,7 +28,7 @@ class ProfilesController < ApplicationController @profile.member = current_member if @profile.save - redirect_to @profile, notice: "Successfully created Profile profile" + redirect_to member_path(current_member), notice: "Successfully created #{@profile.Kind} profile" else render :new, status: :unprocessable_entity end @@ -36,7 +38,7 @@ class ProfilesController < ApplicationController def update authorize @profile if @profile.update(profile_params) - redirect_to @profile, notice: "Profile Profile was updated." + redirect_to member_path(current_member), notice: "#{@profile.Kind} profile was updated." else render :edit, status: :unprocessable_entity end @@ -46,7 +48,7 @@ class ProfilesController < ApplicationController def destroy authorize @profile @profile.destroy - redirect_to profiles_url, notice: "Profile was successfully destroyed." + redirect_to member_path(current_member), notice: "#{@profile.Kind} profile was successfully destroyed." end private @@ -57,6 +59,6 @@ class ProfilesController < ApplicationController # Only allow a list of trusted parameters through. def profile_params - params.require(:profile).permit(:name, :bio, :picture) + params.require(:profile).permit(:name, :bio, :picture, :kind) end end diff --git a/app/models/member.rb b/app/models/member.rb index bb9e91f..9c892f2 100644 --- a/app/models/member.rb +++ b/app/models/member.rb @@ -7,7 +7,16 @@ class Member < ApplicationRecord mount_uploader :picture, PictureUploader has_many :entities - has_one :profile + has_many :profiles + + Profile.types.each do |kind| + define_method :kind do + Profile.where( member_id: self.id).where(kind: kind).first + end + end + def profile( kind ) + Profile.where( member_id: self.id).where(kind: kind).first + end def admin? email == "torsten@villataika.fi" diff --git a/app/models/profile.rb b/app/models/profile.rb index 64d64b9..85ee47c 100644 --- a/app/models/profile.rb +++ b/app/models/profile.rb @@ -8,4 +8,11 @@ class Profile < ApplicationRecord mount_uploader :picture, PictureUploader + def self.types + ["member" , "artist" , "teacher"] + end + + def Kind + self.kind.capitalize + end end diff --git a/app/policies/edit_own_policy.rb b/app/policies/edit_own_policy.rb new file mode 100644 index 0000000..6a5afad --- /dev/null +++ b/app/policies/edit_own_policy.rb @@ -0,0 +1,10 @@ +# allows to edit/detroy own data +# which can be viewed by anyone +class EditOwnPolicy < ApplicationPolicy + def edit? + (member == record.member) or member.admin? + end + alias :update? :edit? + alias :destroy? :edit? + +end diff --git a/app/policies/member_policy.rb b/app/policies/member_policy.rb new file mode 100644 index 0000000..0612a0e --- /dev/null +++ b/app/policies/member_policy.rb @@ -0,0 +1,6 @@ +class MemberPolicy < EditOwnPolicy + + + class Scope < Scope + end +end diff --git a/app/policies/profile_policy.rb b/app/policies/profile_policy.rb index fd30d3e..ecd1123 100644 --- a/app/policies/profile_policy.rb +++ b/app/policies/profile_policy.rb @@ -1,9 +1,4 @@ -class ProfilePolicy < ApplicationPolicy +class ProfilePolicy < EditOwnPolicy - def edit? - (member == record.member) or member.admin? - end - alias :update? :edit? - alias :destroy? :edit? end diff --git a/app/views/home/torsten/code/hubfeenix.fi b/app/views/home/torsten/code/hubfeenix.fi deleted file mode 100644 index e69de29..0000000 diff --git a/app/views/layouts/_member_menu.haml b/app/views/layouts/_member_menu.haml index 24bf8de..32e4f19 100644 --- a/app/views/layouts/_member_menu.haml +++ b/app/views/layouts/_member_menu.haml @@ -3,7 +3,7 @@ %a.block.rounded-lg.px-4.py-2.text-sm.text-gray-500.hover:bg-gray-50.hover:text-gray-700{:href => "/forum", :role => "menuitem"} Forum %a.block.rounded-lg.px-4.py-2.text-sm.text-gray-500.hover:bg-gray-50.hover:text-gray-700{:href => main_app.member_path(current_member), :role => "menuitem"} - Profile + Settings - unless Rails.env.production? - if current_member.admin? %a.block.rounded-lg.px-4.py-2.text-sm.text-gray-500.hover:bg-gray-50.hover:text-gray-700{:href => merged.pages_path(), :role => "menuitem"} diff --git a/app/views/members/show.html.haml b/app/views/members/show.html.haml index ff7a658..d53e98b 100644 --- a/app/views/members/show.html.haml +++ b/app/views/members/show.html.haml @@ -1,42 +1,41 @@ -.px-4.py-16.mx-auto.sm:max-w-xl.md:max-w-full.lg:max-w-screen-xl.md:px-24.lg:px-8.lg:py-20 - .flex.flex-col.max-w-screen-lg.overflow-hidden.bg-white.border.rounded.shadow-sm.lg:flex-row.sm:mx-auto - .relative{:class => "lg:w-1/2"} - -if @member.picture_url - = image_tag @member.picture_url, class: "object-cover w-full lg:absolute h-80 lg:h-full" - .flex.flex-col.justify-center.p-8.lg:p-16.lg:pl-10{:class => "lg:w-1/2"} - %div - %p.inline-block.px-3.py-px.mb-4.text-xs.font-semibold.tracking-wider.text-teal-900.uppercase.rounded-full.bg-teal-accent-400 - Role ? - %h5.mb-3.text-3xl.font-extrabold.leading-none.sm:text-4xl - = @member.name - .mb-8.text-gray-800 - .prose= markdown(@member.bio) - .flex.items-center - %a.inline-flex.items-center.font-semibold.transition-colors.duration-200.text-deep-purple-accent-400.hover:text-deep-purple-800{"aria-label" => "", :href => "/"} - Learn More - %svg.inline-block.w-3.ml-2{:fill => "currentColor", :viewbox => "0 0 12 12"} - %path{:d => "M9.707,5.293l-5-5A1,1,0,0,0,3.293,1.707L7.586,6,3.293,10.293a1,1,0,1,0,1.414,1.414l5-5A1,1,0,0,0,9.707,5.293Z"} +%section.mx-20 + .flex.justify-center + .px-4.py-4.md:py-10.lg:py-16.mx-5.md:mx-12.lg:mx-20.text-center + %h1.text-2xl.font-bold.tracking-tight.sm:text-4xl + Settings and profiles + %h4.text-xl.mt-4.md:text-2xl + Allowing you to create and edit various profiles + .mt-4.text-lg.pt-4 + You can have seperate profiles as teacher, artist, or coop member. + If you choose to create them they will be publicly listed. + Techers and Artists may then create events. --if @member == current_member or current_member.admin? +.grid.grid-cols-2.mx-20 + .first + - Profile.types.each do |kind| + .grid.grid-cols-2 + - if profile = @member.profile(kind) + %div + =profile.Kind + exists with name + =link_to profile.name , profile_path(profile) , class: "underline" + = link_to edit_profile_path(profile) do + %button.bg-cyan-200.mr-3.inline-block.rounded-lg.px-4.py-3.text-md.font-medium.border.border-gray-400 + Edit + =profile.Kind + -else + %div Create new #{kind.capitalize} profile as + = link_to new_profile_path(kind: kind) do + %button.bg-cyan-200.mr-3.inline-block.rounded-lg.px-4.py-3.text-md.font-medium.border.border-gray-400 + New + = kind.capitalize - .flex.justify-around - = link_to edit_member_path(@member) do - %button.bg-cyan-200.mr-3.inline-block.rounded-lg.px-4.py-3.text-md.font-medium.border.border-gray-400 - Edit - - if @member.profile - = link_to edit_profile_path(@member.profile) do - %button.bg-cyan-200.mr-3.inline-block.rounded-lg.px-4.py-3.text-md.font-medium.border.border-gray-400 - Edit profile profile - -else - = link_to new_profile_path do - %button.bg-cyan-200.mr-3.inline-block.rounded-lg.px-4.py-3.text-md.font-medium.border.border-gray-400 - Create profile profile - .grid.grid-cols-3.gap-4 - -@member.entities.each do |entity| - %div= entity.type - %div= entity.name - %div= entity.value - = form_tag( destroy_member_session_path , {method: :delete } ) do - %button.bg-cyan-200.mr-3.inline-block.rounded-lg.px-4.py-3.text-md.font-medium.border.border-gray-400{type: :submit} - Sign out +.grid.grid-cols-6.gap-4.mt-10.mx-10 + -@member.entities.each do |entity| + %div= entity.type + %div= entity.name + %div= entity.value += form_tag( destroy_member_session_path , {method: :delete } ) do + %button.mt-10.ml-10.bg-cyan-200.mr-3.inline-block.rounded-lg.px-4.py-3.text-md.font-medium.border.border-gray-400{type: :submit} + Sign out diff --git a/app/views/profiles/_form.html.haml b/app/views/profiles/_form.html.haml index fc67cb1..2926699 100644 --- a/app/views/profiles/_form.html.haml +++ b/app/views/profiles/_form.html.haml @@ -3,6 +3,7 @@ = f.input :name = f.input :bio + = f.input :kind, :as => :hidden = f.input :picture , as: :file , label: (@profile.picture.blank? ? "Add picture" : "Change picture (optional)") .flex.justify-between.mt-4 @@ -10,4 +11,4 @@ = f.submit 'Save' %button.bg-cyan-200{class: button_classes} - = link_to 'Cancel', profiles_path + = link_to 'Cancel', member_path(current_member) diff --git a/app/views/profiles/edit.html.haml b/app/views/profiles/edit.html.haml index 0e83c05..152f6d0 100644 --- a/app/views/profiles/edit.html.haml +++ b/app/views/profiles/edit.html.haml @@ -1,4 +1,7 @@ .flex.justify-center .column - .text-xl.m-4 Edit your profile profile + .text-xl.m-4 + Edit your + =@profile.Kind + profile = render 'form' diff --git a/app/views/profiles/new.html.haml b/app/views/profiles/new.html.haml index 5909f31..a1e3c7f 100644 --- a/app/views/profiles/new.html.haml +++ b/app/views/profiles/new.html.haml @@ -1,4 +1,7 @@ .flex.justify-center .column - .text-xl.m-4 Create your profile profile + .text-xl.m-4 + Create your + =@profile.kind.capitalize + profile = render 'form' diff --git a/app/views/profiles/show.html.haml b/app/views/profiles/show.html.haml index d0d1d0d..9efa0bb 100644 --- a/app/views/profiles/show.html.haml +++ b/app/views/profiles/show.html.haml @@ -1,5 +1,10 @@ .px-4.py-16.mx-auto.sm:max-w-xl.md:max-w-full.lg:max-w-screen-xl.md:px-24.lg:px-8.lg:py-20 - .flex.flex-col.max-w-screen-lg.overflow-hidden.bg-white.border.rounded.shadow-sm.lg:flex-row.sm:mx-auto + .flex.justify-center + .px-4.py-4.text-center + %h1text-2xl.font-bold.tracking-tight.sm:text-4xl + = @profile.Kind + profile + .flex.py-4.flex-col.max-w-screen-lg.overflow-hidden.bg-white.border.rounded.shadow-sm.lg:flex-row.sm:mx-auto .relative{:class => "lg:w-1/2"} -if @profile.picture_url = image_tag @profile.picture_url, class: "object-cover w-full lg:absolute h-80 lg:h-full" diff --git a/test/policies/member_policy_test.rb b/test/policies/member_policy_test.rb new file mode 100644 index 0000000..ce08445 --- /dev/null +++ b/test/policies/member_policy_test.rb @@ -0,0 +1,18 @@ +require 'test_helper' + +class MemberPolicyTest < ActiveSupport::TestCase + def test_scope + end + + def test_show + end + + def test_create + end + + def test_update + end + + def test_destroy + end +end