diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb index be7a2151f5..d0e182fa4b 100644 --- a/app/controllers/admin/users_controller.rb +++ b/app/controllers/admin/users_controller.rb @@ -87,6 +87,12 @@ def add_role redirect_back(fallback_location: admin_users_path, notice: "Role added!") end + def resend_invitation + user = User.find(params[:user_id]) + user.invite! + redirect_back(fallback_location: admin_users_path, notice: "#{user.name} reinvited!") + end + def remove_role RemoveRoleService.call(user_id: params[:user_id], role_id: params[:role_id]) redirect_back(fallback_location: admin_users_path, notice: "Role removed!") diff --git a/app/models/user.rb b/app/models/user.rb index afffdd4889..b032ae3ece 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -20,6 +20,7 @@ # last_sign_in_ip :inet # name :string # organization_admin :boolean +# pending_role_invites :text # provider :string # remember_created_at :datetime # reset_password_sent_at :datetime diff --git a/app/views/admin/users/_list.html.erb b/app/views/admin/users/_list.html.erb index b35f0b0753..c8c785751c 100644 --- a/app/views/admin/users/_list.html.erb +++ b/app/views/admin/users/_list.html.erb @@ -16,7 +16,10 @@ <%= user.display_name %> <%= user.email %> - <%= edit_button_to edit_admin_user_path(user) %> + <% if user.invitation_sent_at.present? %> + <%= invite_button_to(admin_user_resend_invitation_path(user), confirm: "Re-send an invitation to #{user.preferred_name}?", text: 'Re-send Invite') %> + <% end %> + <%= edit_button_to edit_admin_user_path(user), class: 'ml-2' %> <% end %> diff --git a/app/views/users/mailer/invitation_instructions.html.erb b/app/views/users/mailer/invitation_instructions.html.erb index 87c7f64cc8..3123bc0c16 100644 --- a/app/views/users/mailer/invitation_instructions.html.erb +++ b/app/views/users/mailer/invitation_instructions.html.erb @@ -371,7 +371,7 @@ - <% if @resource.invitation_due_at %> + <% if @resource.invitation_sent_at.present? && @resource.invitation_due_at %>

<%= t("devise.mailer.invitation_instructions.accept_until", due_date: l(@resource.invitation_due_at, format: :'devise.mailer.invitation_instructions.accept_until_format')) %>

<% end %>

If your invitation has an expired message, go <%= link_to "here", new_user_password_url %> and enter your email address to reset your password.

diff --git a/config/routes.rb b/config/routes.rb index eff4f66e7c..74bf981a79 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -65,6 +65,7 @@ def set_up_flipper resources :users do delete :remove_role post :add_role + post :resend_invitation get :resource_ids, on: :collection end resources :barcode_items diff --git a/db/schema.rb b/db/schema.rb index 2d0ae2276e..fbab5b8d6d 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -231,6 +231,21 @@ t.index ["user_id"], name: "index_deprecated_feedback_messages_on_user_id" end + create_table "diaper_drive_participants", id: :serial, force: :cascade do |t| + t.string "contact_name" + t.string "email" + t.string "phone" + t.string "comment" + t.integer "organization_id" + t.datetime "created_at", precision: nil, null: false + t.datetime "updated_at", precision: nil, null: false + t.string "address" + t.string "business_name" + t.float "latitude" + t.float "longitude" + t.index ["latitude", "longitude"], name: "index_diaper_drive_participants_on_latitude_and_longitude" + end + create_table "distributions", id: :serial, force: :cascade do |t| t.text "comment" t.datetime "created_at", precision: nil, null: false @@ -326,6 +341,16 @@ t.index ["partner_id"], name: "index_families_on_partner_id" end + create_table "feedback_messages", force: :cascade do |t| + t.bigint "user_id" + t.string "message" + t.string "path" + t.datetime "created_at", precision: nil, null: false + t.datetime "updated_at", precision: nil, null: false + t.boolean "resolved" + t.index ["user_id"], name: "index_feedback_messages_on_user_id" + end + create_table "flipper_features", force: :cascade do |t| t.string "key", null: false t.datetime "created_at", precision: nil, null: false @@ -475,6 +500,7 @@ t.string "zipcode" t.float "latitude" t.float "longitude" + t.integer "reminder_day" t.integer "deadline_day" t.text "invitation_text" t.integer "default_storage_location" @@ -492,10 +518,9 @@ t.boolean "hide_package_column_on_receipt", default: false t.boolean "signature_for_distribution_pdf", default: false t.boolean "receive_email_on_requests", default: false, null: false - t.boolean "bank_is_set_up", default: false, null: false t.boolean "include_in_kind_values_in_exported_files", default: false, null: false - t.integer "reminder_day" t.string "reminder_schedule_definition" + t.boolean "bank_is_set_up", default: false, null: false t.index ["latitude", "longitude"], name: "index_organizations_on_latitude_and_longitude" end @@ -512,12 +537,13 @@ t.datetime "created_at", null: false t.datetime "updated_at", null: false t.boolean "send_reminders", default: false, null: false - t.integer "deadline_day" t.integer "reminder_day" + t.integer "deadline_day" t.string "reminder_schedule_definition" t.index ["name", "organization_id"], name: "index_partner_groups_on_name_and_organization_id", unique: true t.index ["organization_id"], name: "index_partner_groups_on_organization_id" t.check_constraint "deadline_day <= 28", name: "deadline_day_of_month_check" + t.check_constraint "reminder_day <= 28", name: "reminder_day_of_month_check" end create_table "partner_profiles", force: :cascade do |t| diff --git a/spec/requests/admin/users_requests_spec.rb b/spec/requests/admin/users_requests_spec.rb index 21190b4cc4..347f0a2be6 100644 --- a/spec/requests/admin/users_requests_spec.rb +++ b/spec/requests/admin/users_requests_spec.rb @@ -239,6 +239,24 @@ end end + describe 'POST #resend_invitation' do + let!(:admin_user) { create(:super_admin, name: "Admin User") } + let!(:user) { create(:user, name: "User") } + + before do + sign_in(admin_user) + end + + it 're-sends the invitation email' do + expect_any_instance_of(User).to receive(:invite!).and_return(true) + + post admin_user_resend_invitation_path(user_id: user.id) + + expect(response).to redirect_to(admin_users_path) + expect(flash[:notice]).to eq("User reinvited!") + end + end + context "When logged in as an organization_admin" do before do sign_in organization_admin