You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
227 lines
9.8 KiB
227 lines
9.8 KiB
require 'spec_helper'
|
|
|
|
describe 'Work Package highlighting fields',
|
|
with_ee: %i[conditional_highlighting],
|
|
js: true do
|
|
let(:user) { FactoryBot.create :admin }
|
|
|
|
let(:project) { FactoryBot.create(:project) }
|
|
|
|
let(:status1) { FactoryBot.create :status, color: FactoryBot.create(:color, hexcode: '#FF0000') } # rgba(255, 0, 0, 1)
|
|
let(:status2) { FactoryBot.create :status, color: FactoryBot.create(:color, hexcode: '#F0F0F0') } # rgba(240, 240, 240, 1)
|
|
|
|
let(:priority1) { FactoryBot.create :issue_priority, color: FactoryBot.create(:color, hexcode: '#123456') } #rgba(18, 52, 86, 1)
|
|
let(:priority_no_color) { FactoryBot.create :issue_priority, color: nil }
|
|
|
|
let!(:wp_1) do
|
|
FactoryBot.create :work_package,
|
|
project: project,
|
|
status: status1,
|
|
subject: 'B',
|
|
due_date: (Date.today - 1.days),
|
|
priority: priority1
|
|
end
|
|
|
|
let!(:wp_2) do
|
|
FactoryBot.create :work_package,
|
|
project: project,
|
|
status: status2,
|
|
subject: 'A',
|
|
due_date: Date.today,
|
|
priority: priority_no_color
|
|
end
|
|
|
|
let(:wp_table) { Pages::WorkPackagesTable.new(project) }
|
|
let(:highlighting) { ::Components::WorkPackages::Highlighting.new }
|
|
let(:sort_by) { ::Components::WorkPackages::SortBy.new }
|
|
let(:query_title) { ::Components::WorkPackages::QueryTitle.new }
|
|
|
|
let!(:query) do
|
|
query = FactoryBot.build(:query, user: user, project: project)
|
|
query.column_names = %w[id subject status priority due_date]
|
|
query.highlighted_attributes = %i[status priority due_date]
|
|
query.highlighting_mode = :inline
|
|
|
|
query.save!
|
|
query
|
|
end
|
|
|
|
before do
|
|
|
|
# Ensure Rails and Capybara caches are cleared
|
|
Rails.cache.clear
|
|
Capybara.reset!
|
|
allow(EnterpriseToken).to receive(:show_banners?).and_return(false)
|
|
login_as(user)
|
|
wp_table.visit_query query
|
|
wp_table.expect_work_package_listed wp_1, wp_2
|
|
end
|
|
|
|
it 'provides highlighting through css classes' do
|
|
# Default inline highlight
|
|
wp1_row = wp_table.row(wp_1)
|
|
wp2_row = wp_table.row(wp_2)
|
|
|
|
## Status
|
|
expect(SelectorHelpers.get_pseudo_class_property(page,
|
|
wp1_row.find('[class^="__hl_inline_status_"]'),
|
|
':before',
|
|
"background-color")).to eq('rgb(255, 0, 0)')
|
|
expect(SelectorHelpers.get_pseudo_class_property(page,
|
|
wp2_row.find('[class^="__hl_inline_status_"]'),
|
|
':before',
|
|
"background-color")).to eq('rgb(240, 240, 240)')
|
|
|
|
## Priority
|
|
expect(SelectorHelpers.get_pseudo_class_property(page,
|
|
wp1_row.find('[class^="__hl_inline_priority_"]'),
|
|
':before',
|
|
"background-color")).to eq('rgb(18, 52, 86)')
|
|
expect(SelectorHelpers.get_pseudo_class_property(page,
|
|
wp2_row.find('[class^="__hl_inline_priority_"]'),
|
|
':before',
|
|
"background-color")).to eq('rgba(0, 0, 0, 0)')
|
|
|
|
## Overdue
|
|
expect(wp1_row).to have_selector('.__hl_date_overdue')
|
|
expect(wp2_row).to have_selector('.__hl_date_due_today')
|
|
|
|
# Highlight only one attribute
|
|
highlighting.switch_inline_attribute_highlight "Priority"
|
|
|
|
wp1_row = wp_table.row(wp_1)
|
|
wp2_row = wp_table.row(wp_2)
|
|
|
|
## Priority should have a dot
|
|
expect(SelectorHelpers.get_pseudo_class_property(page,
|
|
wp1_row.find('[class^="__hl_inline_priority_"]'),
|
|
':before',
|
|
"background-color")).to eq('rgb(18, 52, 86)')
|
|
expect(SelectorHelpers.get_pseudo_class_property(page,
|
|
wp2_row.find('[class^="__hl_inline_priority_"]'),
|
|
':before',
|
|
"background-color")).to eq('rgba(0, 0, 0, 0)')
|
|
|
|
## Status should not have a dot
|
|
expect(wp1_row).not_to have_selector('.status [class^="__hl_inline_"]')
|
|
|
|
# Highlight multiple attributes
|
|
highlighting.switch_inline_attribute_highlight "Priority", "Status"
|
|
wp1_row = wp_table.row(wp_1)
|
|
expect(SelectorHelpers.get_pseudo_class_property(page,
|
|
wp1_row.find('[class^="__hl_inline_priority_"]'),
|
|
':before',
|
|
"background-color")).to eq('rgb(18, 52, 86)')
|
|
expect(SelectorHelpers.get_pseudo_class_property(page,
|
|
wp1_row.find('[class^="__hl_inline_status_"]'),
|
|
':before',
|
|
"background-color")).to eq('rgb(255, 0, 0)')
|
|
|
|
# Highlight entire row by status
|
|
highlighting.switch_entire_row_highlight 'Status'
|
|
expect(page).to have_selector("#{wp_table.row_selector(wp_1)}.__hl_background_status_#{status1.id}")
|
|
expect(page).to have_selector("#{wp_table.row_selector(wp_2)}.__hl_background_status_#{status2.id}")
|
|
|
|
# Unselect all rows to ensure we get the correct background
|
|
find('body').send_keys [:control, 'd']
|
|
|
|
wp1_row = wp_table.row(wp_1)
|
|
wp2_row = wp_table.row(wp_2)
|
|
expect(wp1_row.native.css_value('background-color')).to eq('rgba(255, 0, 0, 1)')
|
|
expect(wp2_row.native.css_value('background-color')).to eq('rgba(240, 240, 240, 1)')
|
|
|
|
# Save query
|
|
wp_table.save
|
|
wp_table.expect_and_dismiss_notification message: 'Successful update.'
|
|
query.reload
|
|
expect(query.highlighting_mode).to eq(:status)
|
|
|
|
## This disables any inline styles
|
|
expect(page).to have_no_selector('[class*="__hl_inline_status"]')
|
|
expect(page).to have_no_selector('[class*="__hl_inline_priority"]')
|
|
expect(page).to have_no_selector('[class*="__hl_date"]')
|
|
|
|
# Highlight entire row by priority
|
|
highlighting.switch_entire_row_highlight 'Priority'
|
|
expect(page).to have_selector("#{wp_table.row_selector(wp_1)}.__hl_background_priority_#{priority1.id}")
|
|
expect(page).to have_selector("#{wp_table.row_selector(wp_2)}.__hl_background_priority_#{priority_no_color.id}")
|
|
|
|
# Remove selection from table row
|
|
find('body').send_keys [:control, 'd']
|
|
|
|
wp1_row = wp_table.row(wp_1)
|
|
wp2_row = wp_table.row(wp_2)
|
|
expect(wp1_row.native.css_value('background-color')).to eq('rgba(18, 52, 86, 1)')
|
|
expect(wp2_row.native.css_value('background-color')).to eq('rgba(0, 0, 0, 0)')
|
|
|
|
# Highlighting is kept even after a hard reload (Regression #30217)
|
|
page.driver.refresh
|
|
expect(page).to have_selector("#{wp_table.row_selector(wp_1)}.__hl_background_priority_#{priority1.id}")
|
|
expect(page).to have_selector("#{wp_table.row_selector(wp_2)}.__hl_background_priority_#{priority_no_color.id}")
|
|
expect(page).to have_no_selector('[class*="__hl_inline_status"]')
|
|
expect(page).to have_no_selector('[class*="__hl_inline_priority"]')
|
|
expect(page).to have_no_selector('[class*="__hl_date"]')
|
|
|
|
# Save query
|
|
wp_table.save
|
|
wp_table.expect_and_dismiss_notification message: 'Successful update.'
|
|
query.reload
|
|
expect(query.highlighting_mode).to eq(:priority)
|
|
|
|
## This disables any inline styles
|
|
expect(page).to have_no_selector('[class*="__hl_inline_status"]')
|
|
expect(page).to have_no_selector('[class*="__hl_inline_priority"]')
|
|
expect(page).to have_no_selector('[class*="__hl_date"]')
|
|
|
|
# No highlighting
|
|
highlighting.switch_highlighting_mode 'No highlighting'
|
|
expect(page).to have_no_selector('[class*="__hl_background"]')
|
|
expect(page).to have_no_selector('[class*="__hl_background_status"]')
|
|
expect(page).to have_no_selector('[class*="__hl_background_priority"]')
|
|
expect(page).to have_no_selector('[class*="__hl_date"]')
|
|
|
|
# Save query
|
|
wp_table.save
|
|
wp_table.expect_and_dismiss_notification message: 'Successful update.'
|
|
query.reload
|
|
expect(query.highlighting_mode).to eq(:none)
|
|
|
|
# Expect highlighted fields in single view even when table disabled
|
|
wp_table.open_full_screen_by_doubleclick wp_1
|
|
expect(page).to have_selector(".wp-status-button .__hl_background_status_#{status1.id}")
|
|
expect(page).to have_selector(".__hl_inline_priority_#{priority1.id}")
|
|
end
|
|
|
|
it 'correctly parses custom selected inline attributes' do
|
|
# Highlight only one attribute
|
|
highlighting.switch_inline_attribute_highlight "Priority"
|
|
|
|
# Regression test, resort table
|
|
sort_by.sort_via_header 'Subject'
|
|
wp_table.expect_work_package_order wp_2, wp_1
|
|
|
|
# Regression test, resort table
|
|
sort_by.sort_via_header 'Subject', descending: true
|
|
wp_table.expect_work_package_order wp_1, wp_2
|
|
end
|
|
|
|
it 'does not set query_props when switching in view (Regression #32118)' do
|
|
prio_wp1 = wp_table.edit_field(wp_1, :priority)
|
|
prio_wp1.update priority_no_color.name
|
|
prio_wp1.expect_state_text priority_no_color.name
|
|
|
|
wp_table.expect_and_dismiss_notification message: 'Successful update.'
|
|
wp_1.reload
|
|
expect(wp_1.priority).to eq priority_no_color
|
|
|
|
# We need to wait a bit for the query_props to load
|
|
# I don't have a better idea than waiting explicitly here
|
|
sleep 5
|
|
|
|
query_title.expect_not_changed
|
|
|
|
url = URI.parse(page.current_url).query
|
|
expect(url).to include("query_id=#{query.id}")
|
|
expect(url).not_to match(/query_props=.+/)
|
|
end
|
|
end
|
|
|