From 53e0340063936976a9a6dddb557f60b87f7ec843 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Thu, 12 Jun 2025 15:55:28 +0200 Subject: [PATCH] Re-add video dialog removed in Angular --- .../welcome_dialog_component.html.erb | 33 ++++++++++++++++ .../welcome_dialog_component.rb | 38 +++++++++++++++++++ .../enterprise_tokens_controller.rb | 30 ++++++++++----- .../augur_load_trial_service.rb | 21 +++++----- config/locales/en.yml | 2 + config/static_links.yml | 2 + .../admin/enterprise/enterprise_trial_spec.rb | 35 +++++------------ 7 files changed, 115 insertions(+), 46 deletions(-) create mode 100644 app/components/enterprise_trials/welcome_dialog_component.html.erb create mode 100644 app/components/enterprise_trials/welcome_dialog_component.rb diff --git a/app/components/enterprise_trials/welcome_dialog_component.html.erb b/app/components/enterprise_trials/welcome_dialog_component.html.erb new file mode 100644 index 00000000000..0e7cb47f152 --- /dev/null +++ b/app/components/enterprise_trials/welcome_dialog_component.html.erb @@ -0,0 +1,33 @@ +<%= + render( + Primer::Alpha::Dialog.new( + id: "enterprise-trial-welcome-dialog", + data: { + "application-target": "dynamic", + controller: "auto-show-dialog" + }, + title: I18n.t("ee.trial.welcome_title"), + size: :large + ) + ) do |dialog| + dialog.with_header(variant: :large) + dialog.with_body do + flex_layout do |flex| + flex.with_row do + render(Primer::Beta::Text.new(color: :subtle)) { I18n.t("ee.trial.welcome_description") } + end + flex.with_row(mt: 2) do + content_tag :div, class: "onboarding--video iframe-target-wrapper" do + content_tag(:iframe, + "", + frameborder: "0", + height: "400", + width: "100%", + src: OpenProject::Static::Links.links[:enterprise_welcome_video][:href], + allowfullscreen: true) + end + end + end + end + end +%> diff --git a/app/components/enterprise_trials/welcome_dialog_component.rb b/app/components/enterprise_trials/welcome_dialog_component.rb new file mode 100644 index 00000000000..23a9fb1ac3a --- /dev/null +++ b/app/components/enterprise_trials/welcome_dialog_component.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module EnterpriseTrials + class WelcomeDialogComponent < ApplicationComponent + include ApplicationHelper + include OpenProject::FormTagHelper + include OpTurbo::Streamable + include OpPrimer::ComponentHelpers + end +end diff --git a/app/controllers/enterprise_tokens_controller.rb b/app/controllers/enterprise_tokens_controller.rb index bfd2ba15a3e..98049054ced 100644 --- a/app/controllers/enterprise_tokens_controller.rb +++ b/app/controllers/enterprise_tokens_controller.rb @@ -30,6 +30,7 @@ class EnterpriseTokensController < ApplicationController include OpTurbo::DialogStreamHelper include OpTurbo::ComponentStream + include OpModalFlashable layout "admin" menu_item :enterprise @@ -117,23 +118,34 @@ class EnterpriseTokensController < ApplicationController end def check_trial_status + token_saved_flash @trial_key = Token::EnterpriseTrialKey.find_by(user_id: User.system.id) return if @trial_key.nil? @trial_status = EnterpriseTrials::AugurLoadTrialService.new(@trial_key).call case @trial_status.result + when EnterpriseTrials::AugurLoadTrialService::STATUS_TOKEN_SAVED + token_saved_flash when EnterpriseTrials::AugurLoadTrialService::STATUS_WAITING_CONFIRMATION - flash.now[:warning] = { - message: @trial_status.message, - action_button_arguments: { - tag: :a, - href: request_resend_enterprise_trial_path, - data: { turbo_method: :post } - }, - action_button_content: I18n.t("ee.trial.resend_action") - } + set_waiting_for_confirmation_flash else @trial_status.apply_flash_message!(flash) end end + + def token_saved_flash + flash_op_modal(component: EnterpriseTrials::WelcomeDialogComponent) + end + + def set_waiting_for_confirmation_flash + flash.now[:warning] = { + message: @trial_status.message, + action_button_arguments: { + tag: :a, + href: request_resend_enterprise_trial_path, + data: { turbo_method: :post } + }, + action_button_content: I18n.t("ee.trial.resend_action") + } + end end diff --git a/app/services/enterprise_trials/augur_load_trial_service.rb b/app/services/enterprise_trials/augur_load_trial_service.rb index 3c73000d6f5..f866c03fc21 100644 --- a/app/services/enterprise_trials/augur_load_trial_service.rb +++ b/app/services/enterprise_trials/augur_load_trial_service.rb @@ -31,6 +31,7 @@ module EnterpriseTrials class AugurLoadTrialService STATUS_WAITING_CONFIRMATION = :awaiting_confirmation + STATUS_TOKEN_SAVED = :token_saved def initialize(trial_key) @trial_key = trial_key @@ -64,19 +65,17 @@ module EnterpriseTrials end def handle_successful_trial(trial_json) - if trial_json["token"] - token = EnterpriseToken.new(encoded_token: trial_json["token"]) - if token.save - @trial_key.destroy - return ServiceResult.success(result: token, message: I18n.t("ee.trial.successfully_saved")) - else - return ServiceResult.failure(result: token, - message_type: :info, - message: I18n.t("ee.trial.successfully_saved")) - end + if trial_json["token"].nil? + return ServiceResult.success(result: nil, message: I18n.t("ee.trial.already_retrieved")) end - ServiceResult.success(result: nil, message: I18n.t("ee.trial.already_retrieved")) + token = EnterpriseToken.new(encoded_token: trial_json["token"]) + if token.save + @trial_key.destroy + ServiceResult.success(result: STATUS_TOKEN_SAVED, message: I18n.t("ee.trial.successfully_saved")) + else + ServiceResult.failure(result: token) + end end def augur_host diff --git a/config/locales/en.yml b/config/locales/en.yml index 83b1d1b4bc2..5e43e473002 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -2195,6 +2195,8 @@ en: successfully_saved: "Your trial enterprise token has been successfully retrieved." start_over: "Start over trial request" resend_action: "Resend confirmation email" + welcome_title: "Quick feature overview" + welcome_description: "Get a quick overview of project management and team collaboration with OpenProject Enterprise edition." confirmation_info: > We sent you an email on %{date} to %{email}. Please check your inbox and click the confirmation link provided to start your 14 days trial. diff --git a/config/static_links.yml b/config/static_links.yml index 01fd2380fdb..9c9c3558843 100644 --- a/config/static_links.yml +++ b/config/static_links.yml @@ -121,6 +121,8 @@ webinar_videos: href: https://www.youtube.com/watch?v=un6zCm8_FT4 get_started_videos: href: https://www.youtube.com/playlist?list=PLGzJ4gG7hPb8WWOWmeXqlfMfhdXReu-RJ +enterprise_welcome_video: + href: https://www.youtube.com/embed/zLMSydhFSkw?autoplay=1' openproject_docs: href: https://www.openproject.org/docs/ contact_us: diff --git a/spec/features/admin/enterprise/enterprise_trial_spec.rb b/spec/features/admin/enterprise/enterprise_trial_spec.rb index 816fb556f8c..04214afa095 100644 --- a/spec/features/admin/enterprise/enterprise_trial_spec.rb +++ b/spec/features/admin/enterprise/enterprise_trial_spec.rb @@ -33,6 +33,8 @@ require "spec_helper" RSpec.describe "Enterprise trial management", :js, :webmock do + include Redmine::I18n + let(:admin) { create(:admin) } let(:trial_id) { "1b6486b4-5a30-4042-8714-99d7c8e6b637" } @@ -178,9 +180,11 @@ RSpec.describe "Enterprise trial management", end it "does not send a request when an internal validation fails" do + click_link_or_button("Start free trial") fill_in "Company", with: "Foo Corp." - click_link_or_button("Continue") + # No stubbed request with webmock -> No allowed requests + click_link_or_button("Continue") page.within("#enterprise-trial-dialog") do expect(page).to have_text("First name can't be blank.") @@ -231,7 +235,7 @@ RSpec.describe "Enterprise trial management", context "with a waiting request pending" do before do stub_request(:post, "https://start.openproject-edge.com:443/public/v1/trials") - .to_return(status: 200, headers: { "Content-Type" => "application/json" }, body: created_body.to_json) + .to_return(status: 202, headers: { "Content-Type" => "application/json" }, body: created_body.to_json) stub_request(:get, "https://start.openproject-edge.com:443/public/v1/trials/#{trial_id}") .to_return(status: 422, headers: { "Content-Type" => "application/json" }, body: waiting_body.to_json) @@ -246,22 +250,14 @@ RSpec.describe "Enterprise trial management", end it "can get the trial if reloading the page" do - # We need to go to another page to stop the request cycle - visit info_admin_index_path - # Stub with successful body # Stub the proxy to a successful return # which marks the user has confirmed the mail link stub_request(:get, "https://start.openproject-edge.com:443/public/v1/trials/#{trial_id}") .to_return(status: 200, headers: { "Content-Type" => "application/json" }, body: confirmed_body.to_json) - # Stub the details URL to still return 403 - stub_request(:get, "https://start.openproject-edge.com:443/public/v1/trials/#{trial_id}/details") - .to_return(status: 403) - visit enterprise_tokens_path - expect_and_dismiss_flash(message: "Successful update.") expect(page).to have_text("Enterprise Plan (Token Version 1)") expect(page).to have_text("OpenProject Test") expect(page).to have_text("5") @@ -270,27 +266,14 @@ RSpec.describe "Enterprise trial management", end it "can confirm that trial regularly" do - find_test_selector("op-ee-trial-waiting-resend-link", text: "Resend").click - expect(page).to have_css(".op-toast", text: "Email has been resent.", wait: 20) - - expect(page).to have_text "foo@foocorp.example" - expect(page).to have_text "email sent - waiting for confirmation" - + expect(page).to have_text "We sent you an email on #{format_date(Date.current)} to foo@foocorp.example" # Stub the proxy to a successful return # which marks the user has confirmed the mail link stub_request(:get, "https://start.openproject-edge.com:443/public/v1/trials/#{trial_id}") - .to_return(status: 200, headers: { "Content-Type" => "application/json" }, body: confirmed_body.to_json) + .to_return(status: 202, headers: { "Content-Type" => "application/json" }, body: confirmed_body.to_json) - # Wait until the next request - expect(page).to have_test_selector "op-ee-trial-waiting-status--confirmed", text: "confirmed", wait: 20 + click_link_or_button("Resend confirmation email") - # advance to video - click_on "Continue" - - # advance to close - click_on "Continue" - - expect_and_dismiss_flash(message: "Successful update.") expect(page).to have_text("Enterprise Plan (Token Version 1)") expect(page).to have_text("OpenProject Test") expect(page).to have_text("5")