1# frozen_string_literal: true
2
3module QA
4  module Page
5    module Project
6      class Show < Page::Base
7        include Layout::Flash
8        include Page::Component::ClonePanel
9        include Page::Component::Breadcrumbs
10        include Page::Project::SubMenus::Settings
11        include Page::File::Shared::CommitMessage
12        prepend Mobile::Page::Project::Show if Runtime::Env.mobile_layout?
13
14        view 'app/assets/javascripts/repository/components/preview/index.vue' do
15          element :blob_viewer_content
16        end
17
18        view 'app/assets/javascripts/repository/components/table/row.vue' do
19          element :file_name_link
20        end
21
22        view 'app/assets/javascripts/repository/components/table/index.vue' do
23          element :file_tree_table
24        end
25
26        view 'app/views/layouts/header/_new_dropdown.html.haml' do
27          element :new_menu_toggle
28        end
29
30        view 'app/helpers/nav/new_dropdown_helper.rb' do
31          element :new_issue_link
32        end
33
34        view 'app/views/projects/_last_push.html.haml' do
35          element :create_merge_request
36        end
37
38        view 'app/views/projects/_home_panel.html.haml' do
39          element :forked_from_link
40          element :project_name_content
41          element :project_id_content
42        end
43
44        view 'app/views/projects/_files.html.haml' do
45          element :tree_holder, '.tree-holder' # rubocop:disable QA/ElementWithPattern
46        end
47
48        view 'app/views/projects/buttons/_fork.html.haml' do
49          element :fork_label, "%span= s_('ProjectOverview|Fork')" # rubocop:disable QA/ElementWithPattern
50          element :fork_link, "link_to new_project_fork_path(@project)" # rubocop:disable QA/ElementWithPattern
51        end
52
53        view 'app/views/projects/empty.html.haml' do
54          element :quick_actions
55        end
56
57        view 'app/assets/javascripts/repository/components/breadcrumbs.vue' do
58          element :add_to_tree
59          element :new_file_option
60        end
61
62        view 'app/assets/javascripts/vue_shared/components/web_ide_link.vue' do
63          element :web_ide_button
64        end
65
66        view 'app/views/shared/_ref_switcher.html.haml' do
67          element :branches_select
68          element :branches_dropdown
69        end
70
71        view 'app/views/projects/blob/viewers/_loading.html.haml' do
72          element :spinner
73        end
74
75        view 'app/views/projects/buttons/_download.html.haml' do
76          element :download_source_code_button
77        end
78
79        def wait_for_viewers_to_load
80          has_no_element?(:spinner, wait: QA::Support::Repeater::DEFAULT_MAX_WAIT_TIME)
81        end
82
83        def create_first_new_file!
84          within_element(:quick_actions) do
85            click_link_with_text 'New file'
86          end
87        end
88
89        def create_new_file!
90          click_element :add_to_tree
91          click_element :new_file_option
92        end
93
94        def fork_project
95          click_on 'Fork'
96        end
97
98        def forked_from?(parent_project_name)
99          has_element?(:forked_from_link, text: parent_project_name)
100        end
101
102        def click_file(filename)
103          within_element(:file_tree_table) do
104            click_element(:file_name_link, text: filename)
105          end
106        end
107
108        def click_commit(commit_msg)
109          wait_for_requests
110
111          within_element(:file_tree_table) do
112            click_on commit_msg
113          end
114        end
115
116        def go_to_new_issue
117          click_element(:new_menu_toggle)
118          click_element(:new_issue_link)
119        end
120
121        def has_file?(name)
122          within_element(:file_tree_table) do
123            has_element?(:file_name_link, text: name)
124          end
125        end
126
127        def has_no_file?(name)
128          within_element(:file_tree_table) do
129            has_no_element?(:file_name_link, text: name)
130          end
131        end
132
133        def has_name?(name)
134          has_element?(:project_name_content, text: name)
135        end
136
137        def has_readme_content?(text)
138          has_element?(:blob_viewer_content, text: text)
139        end
140
141        def new_merge_request
142          wait_until(reload: true) do
143            has_css?(element_selector_css(:create_merge_request))
144          end
145
146          click_element :create_merge_request
147        end
148
149        def open_web_ide!
150          click_element(:web_ide_button)
151        end
152
153        def open_web_ide_via_shortcut
154          page.driver.send_keys('.')
155        end
156
157        def has_edit_fork_button?
158          has_element?(:web_ide_button, text: 'Edit fork in Web IDE')
159        end
160
161        def project_name
162          find_element(:project_name_content).text
163        end
164
165        def project_id
166          find_element(:project_id_content).text.delete('Project ID: ')
167        end
168
169        def switch_to_branch(branch_name)
170          find_element(:branches_select).click
171
172          within_element(:branches_dropdown) do
173            click_on branch_name
174          end
175        end
176
177        def wait_for_import
178          wait_until(reload: true) do
179            has_css?('.tree-holder')
180          end
181        end
182      end
183    end
184  end
185end
186
187QA::Page::Project::Show.prepend_mod_with('Page::Project::Show', namespace: QA)
188