From 7ecda3c86067b9350e8321ab80af422a3cc84dcf Mon Sep 17 00:00:00 2001 From: northeastprince Date: Fri, 10 Nov 2023 08:28:00 -0500 Subject: [PATCH] User management --- app/assets/stylesheets/components/_user.scss | 4 ++ .../hackathons/subscriptions_controller.rb | 14 +++++++ .../admin/users/email_addresses_controller.rb | 6 +++ .../admin/users/names_controller.rb | 6 +++ app/controllers/admin/users_controller.rb | 34 ++++++++++++++++ app/controllers/concerns/user_scoped.rb | 13 +++++++ app/models/user/named.rb | 4 ++ app/views/admin/header/_nav.html.erb | 1 + app/views/admin/users/_snippet.html.erb | 6 +++ .../admin/users/email_addresses/edit.html.erb | 8 ++++ app/views/admin/users/index.html.erb | 7 ++++ app/views/admin/users/names/edit.html.erb | 8 ++++ app/views/admin/users/show.html.erb | 39 +++++++++++++++++++ config/routes.rb | 10 +++++ 14 files changed, 160 insertions(+) create mode 100644 app/assets/stylesheets/components/_user.scss create mode 100644 app/controllers/admin/hackathons/subscriptions_controller.rb create mode 100644 app/controllers/admin/users/email_addresses_controller.rb create mode 100644 app/controllers/admin/users/names_controller.rb create mode 100644 app/controllers/admin/users_controller.rb create mode 100644 app/controllers/concerns/user_scoped.rb create mode 100644 app/views/admin/users/_snippet.html.erb create mode 100644 app/views/admin/users/email_addresses/edit.html.erb create mode 100644 app/views/admin/users/index.html.erb create mode 100644 app/views/admin/users/names/edit.html.erb create mode 100644 app/views/admin/users/show.html.erb diff --git a/app/assets/stylesheets/components/_user.scss b/app/assets/stylesheets/components/_user.scss new file mode 100644 index 00000000..aa811e71 --- /dev/null +++ b/app/assets/stylesheets/components/_user.scss @@ -0,0 +1,4 @@ +.user-snippet__title { + margin: 0; + color: var(--red); +} diff --git a/app/controllers/admin/hackathons/subscriptions_controller.rb b/app/controllers/admin/hackathons/subscriptions_controller.rb new file mode 100644 index 00000000..46429301 --- /dev/null +++ b/app/controllers/admin/hackathons/subscriptions_controller.rb @@ -0,0 +1,14 @@ +class Admin::Hackathons::SubscriptionsController < Admin::BaseController + before_action :set_subscription + + def destroy + @subscription.unsubscribe + redirect_to admin_user_path(@subscription.subscriber) + end + + private + + def set_subscription + @subscription = Hackathon::Subscription.find(params[:id]) + end +end diff --git a/app/controllers/admin/users/email_addresses_controller.rb b/app/controllers/admin/users/email_addresses_controller.rb new file mode 100644 index 00000000..76cae50b --- /dev/null +++ b/app/controllers/admin/users/email_addresses_controller.rb @@ -0,0 +1,6 @@ +class Admin::Users::EmailAddressesController < Admin::BaseController + include UserScoped + + def edit + end +end diff --git a/app/controllers/admin/users/names_controller.rb b/app/controllers/admin/users/names_controller.rb new file mode 100644 index 00000000..366b1ea5 --- /dev/null +++ b/app/controllers/admin/users/names_controller.rb @@ -0,0 +1,6 @@ +class Admin::Users::NamesController < Admin::BaseController + include UserScoped + + def edit + end +end diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb new file mode 100644 index 00000000..95a0c0ff --- /dev/null +++ b/app/controllers/admin/users_controller.rb @@ -0,0 +1,34 @@ +class Admin::UsersController < Admin::BaseController + before_action :set_user, except: :index + + def index + @pagy, @users = pagy User.all.order(created_at: :desc) + end + + def show + end + + def update + if @user.update(user_params) + redirect_to admin_user_path(@user) + else + flash.now[:notice] = @user.errors.full_messages.to_sentence + + respond_to do |format| + format.turbo_stream { render turbo_stream: turbo_stream.replace("flash", partial: "shared/flash") } + + format.html { render :edit, status: :unprocessable_entity } + end + end + end + + private + + def set_user + @user = User.find(params[:id]) + end + + def user_params + params.require(:user).permit(:name, :email_address) + end +end diff --git a/app/controllers/concerns/user_scoped.rb b/app/controllers/concerns/user_scoped.rb new file mode 100644 index 00000000..30c06a9b --- /dev/null +++ b/app/controllers/concerns/user_scoped.rb @@ -0,0 +1,13 @@ +module UserScoped + extend ActiveSupport::Concern + + included do + before_action :set_user + end + + private + + def set_user + @user = User.find(params[:user_id]) + end +end diff --git a/app/models/user/named.rb b/app/models/user/named.rb index e26aaebc..5f5d4e68 100644 --- a/app/models/user/named.rb +++ b/app/models/user/named.rb @@ -5,6 +5,10 @@ module User::Named encrypts :name end + def display_name + name.presence || email_address + end + def first_name name&.split(" ")&.first end diff --git a/app/views/admin/header/_nav.html.erb b/app/views/admin/header/_nav.html.erb index 77cbbceb..737f0abd 100644 --- a/app/views/admin/header/_nav.html.erb +++ b/app/views/admin/header/_nav.html.erb @@ -1,4 +1,5 @@
<%= render "admin/header/nav/link", title: "Hackathons", link: admin_hackathons_path %> + <%= render "admin/header/nav/link", title: "Users", link: admin_users_path %> <%= render "admin/header/nav/link", title: "New Submission", link: new_hackathons_submission_path %>
diff --git a/app/views/admin/users/_snippet.html.erb b/app/views/admin/users/_snippet.html.erb new file mode 100644 index 00000000..040ab6bd --- /dev/null +++ b/app/views/admin/users/_snippet.html.erb @@ -0,0 +1,6 @@ +<%= link_to admin_user_path(user), style: "text-decoration: none;" do %> +
+

<%= user.display_name %>

+

<%= user.email_address %>

+
+<% end %> diff --git a/app/views/admin/users/email_addresses/edit.html.erb b/app/views/admin/users/email_addresses/edit.html.erb new file mode 100644 index 00000000..5174cfb3 --- /dev/null +++ b/app/views/admin/users/email_addresses/edit.html.erb @@ -0,0 +1,8 @@ + + <%= form_with model: @user, url: admin_user_path(@user), data: {controller: "form"} do |form| %> +

+ <%= form.text_field :email_address, required: true, data: + {action: "click@document->form#submitOnClickOutside keydown->form#submitOnEnter"} %> +

+ <% end %> +
diff --git a/app/views/admin/users/index.html.erb b/app/views/admin/users/index.html.erb new file mode 100644 index 00000000..17bfa75d --- /dev/null +++ b/app/views/admin/users/index.html.erb @@ -0,0 +1,7 @@ +<% page :narrow %> +<% @nav_active_item = admin_users_path %> +

Users

+ +<%= render partial: "snippet", collection: @users, as: :user %> + +<%== pagy_nav(@pagy) %> diff --git a/app/views/admin/users/names/edit.html.erb b/app/views/admin/users/names/edit.html.erb new file mode 100644 index 00000000..4c6c900e --- /dev/null +++ b/app/views/admin/users/names/edit.html.erb @@ -0,0 +1,8 @@ + + <%= form_with model: @user, url: admin_user_path(@user), data: {controller: "form"} do |form| %> +

+ <%= form.text_field :name, data: + {action: "click@document->form#submitOnClickOutside keydown->form#submitOnEnter"} %> +

+ <% end %> +
diff --git a/app/views/admin/users/show.html.erb b/app/views/admin/users/show.html.erb new file mode 100644 index 00000000..31373106 --- /dev/null +++ b/app/views/admin/users/show.html.erb @@ -0,0 +1,39 @@ +<% content_for :title, (@user.display_name) %> + +
+ +

+ 🪪 + <%= @user.display_name %> + <%= link_to "✏️", edit_admin_user_name_path(@user), class: "hidden-link text--small" %> +

+
+ + +

+ 📧 + <%= @user.email_address %> + <%= link_to "✏️", edit_admin_user_email_address_path(@user), class: "hidden-link text--small" %> +

+
+ + + <% if @user.subscriptions.active.any? %> +
+

Active Subscriptions

+
    + <% @user.subscriptions.active.each do |subscription| %> +
  • + <%= subscription.location %> + <%= link_to "⛔", admin_subscription_path(subscription), + style: "text-decoration: none;", "data-turbo-method": "delete", + "data-turbo-confirm": "Remove this subscription for #{subscription.location}?" %> +
  • + <% end %> +
+
+ <% end %> +
+ + <%= render "events/timeline", {eventable: @user} %> +
diff --git a/config/routes.rb b/config/routes.rb index 8ab11d68..b0229819 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -36,6 +36,16 @@ resource :name, :website, :times, :expected_attendees, only: :edit + + collection do + resources :subscriptions, only: :destroy + end + end + end + + resources :users, only: [:index, :show, :update] do + scope module: :users do + resource :name, :email_address, only: :edit end end end