diff --git a/app/seeders/standard.yml b/app/seeders/standard.yml index 5de2a12788ba..196db474cd1a 100644 --- a/app/seeders/standard.yml +++ b/app/seeders/standard.yml @@ -711,8 +711,6 @@ projects: t_text: | We are glad you joined! We suggest to try a few things to get started in OpenProject. - Discover the most important features with our [Guided Tour]({{opSetting:base_url}}/projects/your-scrum-project/backlogs?start_scrum_onboarding_tour=true). - _Try the following steps:_ 1. *Invite new members to your project*: → Go to [Members]({{opSetting:base_url}}/projects/your-scrum-project/members) in the project navigation. diff --git a/frontend/src/app/core/setup/globals/onboarding/helpers.ts b/frontend/src/app/core/setup/globals/onboarding/helpers.ts index c5fc9bb24bde..142ab5a15c99 100644 --- a/frontend/src/app/core/setup/globals/onboarding/helpers.ts +++ b/frontend/src/app/core/setup/globals/onboarding/helpers.ts @@ -3,7 +3,6 @@ export type OnboardingTourNames = 'prepareBacklogs'|'backlogs'|'taskboard'|'home export enum ProjectName { demo = 'demo', - scrum = 'scrum', } function matchingFilter(list:NodeListOf, filterFunction:(match:HTMLElement) => boolean):HTMLElement|null { diff --git a/frontend/src/app/core/setup/globals/onboarding/onboarding_tour.ts b/frontend/src/app/core/setup/globals/onboarding/onboarding_tour.ts index fea77d928a15..e76feaa5d928 100644 --- a/frontend/src/app/core/setup/globals/onboarding/onboarding_tour.ts +++ b/frontend/src/app/core/setup/globals/onboarding/onboarding_tour.ts @@ -8,11 +8,6 @@ import { import { boardTourSteps } from 'core-app/core/setup/globals/onboarding/tours/boards_tour'; import { menuTourSteps } from 'core-app/core/setup/globals/onboarding/tours/menu_tour'; import { homescreenOnboardingTourSteps } from 'core-app/core/setup/globals/onboarding/tours/homescreen_tour'; -import { - prepareScrumBacklogsTourSteps, - scrumBacklogsTourSteps, - scrumTaskBoardTourSteps, -} from 'core-app/core/setup/globals/onboarding/tours/backlogs_tour'; import { teamPlannerTourSteps } from 'core-app/core/setup/globals/onboarding/tours/team_planners_tour'; require('core-vendor/enjoyhint'); @@ -98,18 +93,6 @@ function mainTour(project:ProjectName = ProjectName.demo) { export function start(name:OnboardingTourNames, project?:ProjectName):void { switch (name) { - case 'prepareBacklogs': - initializeTour('prepareTaskBoardTour'); - startTour(prepareScrumBacklogsTourSteps()); - break; - case 'backlogs': - initializeTour('startTaskBoardTour'); - startTour(scrumBacklogsTourSteps()); - break; - case 'taskboard': - initializeTour('startMainTourFromBacklogs'); - startTour(scrumTaskBoardTourSteps()); - break; case 'homescreen': initializeTour('startProjectTour'); startTour(homescreenOnboardingTourSteps()); diff --git a/frontend/src/app/core/setup/globals/onboarding/onboarding_tour_trigger.ts b/frontend/src/app/core/setup/globals/onboarding/onboarding_tour_trigger.ts index 0219115967ec..cf7416183509 100644 --- a/frontend/src/app/core/setup/globals/onboarding/onboarding_tour_trigger.ts +++ b/frontend/src/app/core/setup/globals/onboarding/onboarding_tour_trigger.ts @@ -61,28 +61,8 @@ export function detectOnboardingTour():void { } // ------------------------------- Tutorial WP page ------------------------------- - if (currentTourPart === 'startMainTourFromBacklogs' || url.searchParams.get('start_onboarding_tour')) { - const projectName:ProjectName = currentTourPart === 'startMainTourFromBacklogs' ? ProjectName.scrum : ProjectName.demo; - void triggerTour('main', projectName); - } - - // ------------------------------- Prepare Backlogs page ------------------------------- - if (url.searchParams.get('start_scrum_onboarding_tour')) { - if (jQuery('.backlogs-menu-item').length > 0) { - void triggerTour('prepareBacklogs', ProjectName.scrum); - } else { - void triggerTour('taskboard', ProjectName.scrum); - } - } - - // ------------------------------- Tutorial Backlogs page ------------------------------- - if (currentTourPart === 'prepareTaskBoardTour') { - void triggerTour('backlogs', ProjectName.scrum); - } - - // ------------------------------- Tutorial Task Board page ------------------------------- - if (currentTourPart === 'startTaskBoardTour') { - void triggerTour('taskboard', ProjectName.scrum); + if (url.searchParams.get('start_onboarding_tour')) { + void triggerTour('main', ProjectName.demo); } } } diff --git a/frontend/src/app/core/setup/globals/onboarding/tours/backlogs_tour.ts b/frontend/src/app/core/setup/globals/onboarding/tours/backlogs_tour.ts deleted file mode 100644 index ba77d49fdfbb..000000000000 --- a/frontend/src/app/core/setup/globals/onboarding/tours/backlogs_tour.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { OnboardingStep } from 'core-app/core/setup/globals/onboarding/onboarding_tour'; - -export function prepareScrumBacklogsTourSteps():OnboardingStep[] { - return [ - { - 'next .backlogs-menu-item': I18n.t('js.onboarding.steps.backlogs.overview'), - showSkip: false, - nextButton: { text: I18n.t('js.onboarding.buttons.next') }, - containerClass: '-dark -hidden-arrow', - onNext() { - jQuery('.backlogs-menu-item')[0].click(); - }, - }, - ]; -} - -export function scrumBacklogsTourSteps():OnboardingStep[] { - return [ - { - 'next #content-wrapper': I18n.t('js.onboarding.steps.backlogs.sprints'), - showSkip: false, - nextButton: { text: I18n.t('js.onboarding.buttons.next') }, - containerClass: '-dark -hidden-arrow', - }, - { - event_type: 'next', - selector: '#sprint_backlogs_container .backlog .menu-trigger', - description: I18n.t('js.onboarding.steps.backlogs.task_board_arrow'), - showSkip: false, - nextButton: { text: I18n.t('js.onboarding.buttons.next') }, - onNext() { - jQuery('#sprint_backlogs_container .backlog .menu-trigger')[0].click(); - }, - }, - { - event_type: 'next', - selector: '#sprint_backlogs_container .backlog .backlog-menu .items', - description: I18n.t('js.onboarding.steps.backlogs.task_board_select'), - showSkip: false, - nextButton: { text: I18n.t('js.onboarding.buttons.next') }, - containerClass: '-dark', - onNext() { - jQuery('#sprint_backlogs_container .backlog .show_task_board')[0].click(); - }, - }, - ]; -} - -export function scrumTaskBoardTourSteps():OnboardingStep[] { - return [ - { - 'next #content-wrapper': I18n.t('js.onboarding.steps.backlogs.task_board'), - showSkip: false, - nextButton: { text: I18n.t('js.onboarding.buttons.next') }, - containerClass: '-dark -hidden-arrow', - condition: () => document.getElementsByClassName('backlogs-menu-item').length !== 0, - }, - { - 'next #main-menu-work-packages-wrapper': I18n.t('js.onboarding.steps.wp.toggler'), - showSkip: false, - nextButton: { text: I18n.t('js.onboarding.buttons.next') }, - onNext() { - jQuery('#main-menu-work-packages')[0].click(); - }, - }, - ]; -} diff --git a/modules/backlogs/spec/features/onboarding/backlogs_onboarding_tour_spec.rb b/modules/backlogs/spec/features/onboarding/backlogs_onboarding_tour_spec.rb deleted file mode 100644 index 72ca3b8ea5f8..000000000000 --- a/modules/backlogs/spec/features/onboarding/backlogs_onboarding_tour_spec.rb +++ /dev/null @@ -1,146 +0,0 @@ -#-- copyright -# OpenProject is an open source project management software. -# Copyright (C) 2012-2023 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. -#++ - -require 'spec_helper' - -RSpec.describe 'backlogs onboarding tour', js: true do - let(:next_button) { find('.enjoyhint_next_btn') } - let(:user) { create(:admin) } - let(:demo_project) do - create(:project, - name: 'Demo project', - identifier: 'demo-project', - public: true, - enabled_module_names: %w[work_package_tracking wiki]) - end - let(:project) do - create(:project, - name: 'Scrum project', - identifier: 'your-scrum-project', - public: true, - enabled_module_names: %w[work_package_tracking wiki backlogs]) - end - let(:sprint) { create(:version, project:, name: 'Sprint 1') } - let(:status) { create(:default_status) } - let(:priority) { create(:default_priority) } - - let(:impediment) do - build(:impediment, author: user, - version: sprint, - assigned_to: user, - project:, - type: type_task, - status:) - end - - let(:story_type) { create(:type_feature) } - let(:task_type) do - type = create(:type_task) - project.types << type - - type - end - - let!(:existing_story) do - create(:work_package, - type: story_type, - project:, - status:, - priority:, - position: 1, - story_points: 3, - version: sprint) - end - - before do - allow(Setting).to receive(:demo_projects_available).and_return(true) - allow(Setting).to receive(:plugin_openproject_backlogs).and_return('story_types' => [story_type.id.to_s], - 'task_type' => task_type.id.to_s) - end - - after do - # Clear session to avoid that the onboarding tour starts - page.execute_script("window.sessionStorage.clear();") - end - - context 'with a new user who is allowed to see the backlogs plugin' do - before do - login_as user - end - - it 'I see a part of the onboarding tour in the backlogs section' do - # Set the tour parameter so that we can start on the overview page - visit "/projects/#{project.identifier}?start_scrum_onboarding_tour=true" - expect(page).to have_text sanitize_string(I18n.t('js.onboarding.steps.backlogs.overview')), normalize_ws: true - - next_button.click - text = sanitize_string(I18n.t('js.onboarding.steps.backlogs.sprints')) - expect(page).to have_text Loofah.fragment(text).text(encode_special_chars: false), normalize_ws: true - - next_button.click - expect(page).to have_text sanitize_string(I18n.t('js.onboarding.steps.backlogs.task_board_arrow')), normalize_ws: true - - next_button.click - expect(page).to have_selector('.backlog .items', visible: true) - expect(page).to have_text sanitize_string(I18n.t('js.onboarding.steps.backlogs.task_board_select')), normalize_ws: true - - next_button.click - expect(page) - .to have_current_path backlogs_project_sprint_taskboard_path(project.identifier, sprint.id) - expect(page).to have_text sanitize_string(I18n.t('js.onboarding.steps.backlogs.task_board')), normalize_ws: true - - next_button.click - expect(page) - .to have_text sanitize_string(I18n.t('js.onboarding.steps.wp.toggler')), normalize_ws: true - - next_button.click - expect(page).to have_current_path project_work_packages_path(project.identifier) - end - end - - context 'with a new user who is not allowed to see the backlogs plugin' do - # necessary to be able to see public projects - let(:non_member_role) { create(:non_member, permissions: [:view_work_packages]) } - let(:non_member_user) { create(:user) } - - before do - non_member_role - login_as non_member_user - end - - it 'skips the backlogs tour and continues directly with the WP tour' do - # Set the tour parameter so that we can start on the overview page - visit "/projects/#{project.identifier}?start_scrum_onboarding_tour=true" - expect(page) - .to have_text sanitize_string(I18n.t('js.onboarding.steps.wp.toggler')), normalize_ws: true - - next_button.click - expect(page).to have_current_path project_work_packages_path(project.identifier) - end - end -end diff --git a/modules/boards/spec/features/onboarding/boards_onboarding_tour_spec.rb b/modules/boards/spec/features/onboarding/boards_onboarding_tour_spec.rb index 66c314a68b86..3d1784085b0c 100644 --- a/modules/boards/spec/features/onboarding/boards_onboarding_tour_spec.rb +++ b/modules/boards/spec/features/onboarding/boards_onboarding_tour_spec.rb @@ -55,20 +55,10 @@ public: true, enabled_module_names: %w[work_package_tracking wiki board_view]) end - let(:scrum_project) do - create(:project, - name: 'Scrum project', - identifier: 'your-scrum-project', - public: true, - enabled_module_names: %w[work_package_tracking wiki board_view]) - end let!(:wp_1) { create(:work_package, project: demo_project) } - let!(:wp_2) { create(:work_package, project: scrum_project) } let!(:demo_board_view) { create(:board_grid_with_query, project: demo_project, name: 'Kanban', query:) } let!(:demo_basic_board_view) { create(:board_grid_with_query, project: demo_project, name: 'Basic board', query:) } - let!(:scrum_board_view) { create(:board_grid_with_query, project: scrum_project, name: 'Kanban', query:) } - let!(:scrum_basic_board_view) { create(:board_grid_with_query, project: scrum_project, name: 'Task board', query:) } let(:query) { create(:query, user:, project: demo_project) } before do @@ -98,20 +88,6 @@ step_through_onboarding_main_menu_tour has_full_capabilities: true end - - it "I see the board onboarding tour in the scrum project" do - # Set sessionStorage value so that the tour knows that it is in the scum tour - page.execute_script("window.sessionStorage.setItem('openProject-onboardingTour', 'startMainTourFromBacklogs');") - - # Set the tour parameter so that we can start on the wp page - visit "/projects/#{scrum_project.identifier}/work_packages?start_onboarding_tour=true" - - step_through_onboarding_wp_tour scrum_project, wp_2 - - step_through_onboarding_board_tour - - step_through_onboarding_main_menu_tour has_full_capabilities: true - end end context 'without an EE token' do @@ -129,20 +105,6 @@ step_through_onboarding_main_menu_tour has_full_capabilities: true end - - it "I see the board onboarding tour in the scrum project" do - # Set sessionStorage value so that the tour knows that it is in the scum tour - page.execute_script("window.sessionStorage.setItem('openProject-onboardingTour', 'startMainTourFromBacklogs');") - - # Set the tour parameter so that we can start on the wp page - visit "/projects/#{scrum_project.identifier}/work_packages?start_onboarding_tour=true" - - step_through_onboarding_wp_tour scrum_project, wp_2 - - step_through_onboarding_board_tour with_ee_token: false - - step_through_onboarding_main_menu_tour has_full_capabilities: true - end end end end diff --git a/modules/team_planner/spec/features/onboarding/team_planner_onboarding_tour_spec.rb b/modules/team_planner/spec/features/onboarding/team_planner_onboarding_tour_spec.rb index 7fe8baec6a14..172796218173 100644 --- a/modules/team_planner/spec/features/onboarding/team_planner_onboarding_tour_spec.rb +++ b/modules/team_planner/spec/features/onboarding/team_planner_onboarding_tour_spec.rb @@ -41,13 +41,6 @@ public: true, enabled_module_names: %w[work_package_tracking wiki team_planner_view]) end - let(:scrum_project) do - create(:project, - name: 'Scrum project', - identifier: 'your-scrum-project', - public: true, - enabled_module_names: %w[work_package_tracking wiki]) - end let(:user) do create(:admin, @@ -63,14 +56,13 @@ start_date: Time.zone.today, due_date: Time.zone.today) end - let!(:wp2) { create(:work_package, project: scrum_project) } let(:query) { create(:query, user:, project: demo_project, public: true, name: 'Team planner') } let(:team_plan) do create(:view_team_planner, query:, assignees: [user], - projects: [demo_project, scrum_project]) + projects: [demo_project]) end before do @@ -97,17 +89,5 @@ step_through_onboarding_main_menu_tour has_full_capabilities: true end - - it "I do not see the team planner onboarding tour in the scrum project" do - # Set sessionStorage value so that the tour knows that it is in the scum tour - page.execute_script("window.sessionStorage.setItem('openProject-onboardingTour', 'startMainTourFromBacklogs');") - - # Set the tour parameter so that we can start on the wp page - visit "/projects/#{scrum_project.identifier}/work_packages?start_onboarding_tour=true" - - step_through_onboarding_wp_tour scrum_project, wp2 - - step_through_onboarding_main_menu_tour has_full_capabilities: true - end end end