This commit is contained in:
parent
dc8748896d
commit
45fee1b752
3 changed files with 389 additions and 9 deletions
|
@ -1097,11 +1097,11 @@ class Table extends App.Controller
|
||||||
id: object.organization_id
|
id: object.organization_id
|
||||||
value
|
value
|
||||||
callbackCheckbox = (id, checked, e) =>
|
callbackCheckbox = (id, checked, e) =>
|
||||||
if @$('table').find('input[name="bulk"]:checked').length == 0
|
if @shouldShowBulkForm()
|
||||||
@bulkForm.hide()
|
|
||||||
else
|
|
||||||
@bulkForm.render()
|
@bulkForm.render()
|
||||||
@bulkForm.show()
|
@bulkForm.show()
|
||||||
|
else
|
||||||
|
@bulkForm.hide()
|
||||||
|
|
||||||
if @lastChecked && e.shiftKey
|
if @lastChecked && e.shiftKey
|
||||||
# check items in a row
|
# check items in a row
|
||||||
|
@ -1191,11 +1191,11 @@ class Table extends App.Controller
|
||||||
|
|
||||||
# show/hide bulk action
|
# show/hide bulk action
|
||||||
@$('.table-overview').delegate('input[name="bulk"], input[name="bulk_all"]', 'change', (e) =>
|
@$('.table-overview').delegate('input[name="bulk"], input[name="bulk_all"]', 'change', (e) =>
|
||||||
if @$('.table-overview').find('input[name="bulk"]:checked').length == 0
|
if @shouldShowBulkForm()
|
||||||
|
@bulkForm.show()
|
||||||
|
else
|
||||||
@bulkForm.hide()
|
@bulkForm.hide()
|
||||||
@bulkForm.reset()
|
@bulkForm.reset()
|
||||||
else
|
|
||||||
@bulkForm.show()
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# deselect bulk_all if one item is uncheck observ
|
# deselect bulk_all if one item is uncheck observ
|
||||||
|
@ -1215,6 +1215,17 @@ class Table extends App.Controller
|
||||||
bulkAll.prop('indeterminate', true)
|
bulkAll.prop('indeterminate', true)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
shouldShowBulkForm: =>
|
||||||
|
items = @$('table').find('input[name="bulk"]:checked')
|
||||||
|
return false if items.length == 0
|
||||||
|
|
||||||
|
ticket_ids = _.map(items, (el) -> $(el).val() )
|
||||||
|
ticket_group_ids = _.map(App.Ticket.findAll(ticket_ids), (ticket) -> ticket.group_id)
|
||||||
|
ticket_group_ids = _.uniq(ticket_group_ids)
|
||||||
|
user_permissions = App.Session.get('group_ids')
|
||||||
|
group_permissions = ticket_group_ids.map (id) -> user_permissions[id]
|
||||||
|
_.every(group_permissions, (list) -> 'full' in list || 'change' in list)
|
||||||
|
|
||||||
viewmode: (e) =>
|
viewmode: (e) =>
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
@view_mode = $(e.target).data('mode')
|
@view_mode = $(e.target).data('mode')
|
||||||
|
|
|
@ -468,4 +468,184 @@ class AgentTicketOverviewLevel0Test < TestCase
|
||||||
# cleanup
|
# cleanup
|
||||||
tasks_close_all()
|
tasks_close_all()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# verify fix for issue #2026 - Bulk action should not be shown if user has no change permissions
|
||||||
|
def test_no_bulk_action_when_missing_change_permission
|
||||||
|
@browser = browser_instance
|
||||||
|
login(
|
||||||
|
username: 'master@example.com',
|
||||||
|
password: 'test',
|
||||||
|
url: browser_url,
|
||||||
|
)
|
||||||
|
tasks_close_all()
|
||||||
|
|
||||||
|
# create new group
|
||||||
|
group_create(
|
||||||
|
data: {
|
||||||
|
name: 'some group2',
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
click(
|
||||||
|
css: 'a[href="#manage"]',
|
||||||
|
)
|
||||||
|
click(
|
||||||
|
css: '.content.active a[href="#manage/groups"]',
|
||||||
|
)
|
||||||
|
|
||||||
|
user_edit(
|
||||||
|
data: {
|
||||||
|
login: 'master@example.com',
|
||||||
|
permissions: { 1 => ['full'],
|
||||||
|
2 => ['full'],
|
||||||
|
3 => ['full'], }
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
user_create(
|
||||||
|
data: {
|
||||||
|
firstname: 'Tester',
|
||||||
|
lastname: 'Agent 2',
|
||||||
|
email: 'agent2@example.com',
|
||||||
|
password: 'test',
|
||||||
|
role: 'Agent',
|
||||||
|
permissions: { 1 => %w[read create overview],
|
||||||
|
2 => ['full'],
|
||||||
|
3 => ['full'], }
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
# create new tickets
|
||||||
|
can_change_ticket = ticket_create(
|
||||||
|
data: {
|
||||||
|
customer: 'nico',
|
||||||
|
group: 'some group2',
|
||||||
|
title: 'overview test #5',
|
||||||
|
body: 'overview test #5',
|
||||||
|
}
|
||||||
|
)
|
||||||
|
cannot_change_ticket = ticket_create(
|
||||||
|
data: {
|
||||||
|
customer: 'nico',
|
||||||
|
group: 'Users',
|
||||||
|
title: 'overview test #6',
|
||||||
|
body: 'overview test #6',
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
logout() # logout as master@example.com then login as agent2@example.com
|
||||||
|
login(
|
||||||
|
username: 'agent2@example.com',
|
||||||
|
password: 'test',
|
||||||
|
url: browser_url,
|
||||||
|
)
|
||||||
|
tasks_close_all()
|
||||||
|
|
||||||
|
# open Overview menu tab
|
||||||
|
click(
|
||||||
|
css: '.js-menu .js-overviewsMenuItem',
|
||||||
|
)
|
||||||
|
|
||||||
|
# enable full overviews
|
||||||
|
execute(
|
||||||
|
js: '$(".content.active .sidebar").css("display", "block")',
|
||||||
|
)
|
||||||
|
|
||||||
|
# click Unassigned & Open tab
|
||||||
|
click(
|
||||||
|
css: '.content.active [href="#ticket/view/all_unassigned"]',
|
||||||
|
)
|
||||||
|
|
||||||
|
watch_for(
|
||||||
|
css: '.content.active',
|
||||||
|
value: 'overview test #6',
|
||||||
|
timeout: 8,
|
||||||
|
)
|
||||||
|
|
||||||
|
# first select the ticket that we have change rights to
|
||||||
|
check(
|
||||||
|
css: '.content.active table tr td input[value="' + can_change_ticket[:id] + '"]',
|
||||||
|
)
|
||||||
|
|
||||||
|
# check that the bulk action form appears
|
||||||
|
exists(
|
||||||
|
displayed: true,
|
||||||
|
css: '.content.active .bulkAction',
|
||||||
|
)
|
||||||
|
|
||||||
|
# then select the ticket that we do not have change rights to
|
||||||
|
scroll_to(
|
||||||
|
position: 'top',
|
||||||
|
css: '.content.active table tr td input[value="' + cannot_change_ticket[:id] + '"] + .icon-checkbox.icon-unchecked',
|
||||||
|
)
|
||||||
|
check(
|
||||||
|
css: '.content.active table tr td input[value="' + cannot_change_ticket[:id] + '"]',
|
||||||
|
)
|
||||||
|
|
||||||
|
# check that the bulk action form disappears
|
||||||
|
exists(
|
||||||
|
displayed: false,
|
||||||
|
css: '.content.active .bulkAction',
|
||||||
|
)
|
||||||
|
|
||||||
|
# de-select the ticket that we do not have change rights to
|
||||||
|
uncheck(
|
||||||
|
css: '.content.active table tr td input[value="' + cannot_change_ticket[:id] + '"]',
|
||||||
|
fast: true,
|
||||||
|
)
|
||||||
|
|
||||||
|
# check that the bulk action form appears again
|
||||||
|
exists(
|
||||||
|
displayed: true,
|
||||||
|
css: '.content.active .bulkAction',
|
||||||
|
)
|
||||||
|
|
||||||
|
# de-select the ticket that we have change rights to
|
||||||
|
uncheck(
|
||||||
|
css: '.content.active table tr td input[value="' + can_change_ticket[:id] + '"]',
|
||||||
|
fast: true,
|
||||||
|
)
|
||||||
|
|
||||||
|
# check that the bulk action form disappears again
|
||||||
|
exists(
|
||||||
|
displayed: false,
|
||||||
|
css: '.content.active .bulkAction',
|
||||||
|
)
|
||||||
|
|
||||||
|
# cleanup
|
||||||
|
tasks_close_all()
|
||||||
|
logout() # logout as agent2@example.com and then login as master@example.com to clean up tickets
|
||||||
|
login(
|
||||||
|
username: 'master@example.com',
|
||||||
|
password: 'test',
|
||||||
|
url: browser_url,
|
||||||
|
)
|
||||||
|
tasks_close_all()
|
||||||
|
|
||||||
|
# open ticket by search
|
||||||
|
ticket_open_by_search(
|
||||||
|
number: cannot_change_ticket[:number],
|
||||||
|
)
|
||||||
|
sleep 1
|
||||||
|
|
||||||
|
# close ticket
|
||||||
|
ticket_update(
|
||||||
|
data: {
|
||||||
|
state: 'closed',
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
# open ticket by search
|
||||||
|
ticket_open_by_search(
|
||||||
|
number: can_change_ticket[:number],
|
||||||
|
)
|
||||||
|
sleep 1
|
||||||
|
|
||||||
|
# close ticket
|
||||||
|
ticket_update(
|
||||||
|
data: {
|
||||||
|
state: 'closed',
|
||||||
|
}
|
||||||
|
)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -2829,6 +2829,22 @@ wait untill text in selector disabppears
|
||||||
lastname: 'Manage Lastname' + random,
|
lastname: 'Manage Lastname' + random,
|
||||||
email: user_email,
|
email: user_email,
|
||||||
password: 'some-pass',
|
password: 'some-pass',
|
||||||
|
role: 'Admin', # optional, choose among [Admin, Agent, Customer]
|
||||||
|
# defaults to Customer if not provided
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
user_create(
|
||||||
|
browser: browser2,
|
||||||
|
data: {
|
||||||
|
#login: 'some login' + random,
|
||||||
|
firstname: 'Manage Firstname' + random,
|
||||||
|
lastname: 'Manage Lastname' + random,
|
||||||
|
email: user_email,
|
||||||
|
password: 'some-pass',
|
||||||
|
role: 'Agent', # when the role is Agent an array of permissions for each group is optionally accepted
|
||||||
|
permissions: { 1 => %w[read create overview],
|
||||||
|
2 => ['full'], }
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -2901,11 +2917,46 @@ wait untill text in selector disabppears
|
||||||
retry if retries < 3
|
retry if retries < 3
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
check(
|
|
||||||
|
if data[:role]
|
||||||
|
if data[:role] == 'Admin'
|
||||||
|
check(
|
||||||
|
browser: instance,
|
||||||
|
css: '.modal input[name=role_ids][value=1]',
|
||||||
|
)
|
||||||
|
elsif data[:role] == 'Customer'
|
||||||
|
check(
|
||||||
|
browser: instance,
|
||||||
|
css: '.modal input[name=role_ids][value=3]',
|
||||||
|
)
|
||||||
|
elsif data[:role] == 'Agent'
|
||||||
|
check(
|
||||||
|
browser: instance,
|
||||||
|
css: '.modal input[name=role_ids][value=2]',
|
||||||
|
)
|
||||||
|
data[:permissions].each do |key, value|
|
||||||
|
value.each do |permission|
|
||||||
|
check(
|
||||||
|
browser: instance,
|
||||||
|
css: ".modal input[name=\"group_ids::#{key}\"][value=\"#{permission}\"]",
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
raise "Unknown :role \"#{data[:role]}\" in user_create()"
|
||||||
|
end
|
||||||
|
else
|
||||||
|
check(
|
||||||
|
browser: instance,
|
||||||
|
css: '.modal input[name=role_ids][value=3]',
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
click(
|
||||||
browser: instance,
|
browser: instance,
|
||||||
css: '.modal input[name=role_ids][value=3]',
|
css: '.modal .js-submit',
|
||||||
)
|
)
|
||||||
instance.find_elements(css: '.modal button.js-submit')[0].click
|
|
||||||
modal_disappear(
|
modal_disappear(
|
||||||
browser: instance,
|
browser: instance,
|
||||||
timeout: 10,
|
timeout: 10,
|
||||||
|
@ -2939,6 +2990,144 @@ wait untill text in selector disabppears
|
||||||
assert(true, 'user created')
|
assert(true, 'user created')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
=begin
|
||||||
|
|
||||||
|
user_edit(
|
||||||
|
browser: browser2,
|
||||||
|
data: {
|
||||||
|
login: 'some login' + random,
|
||||||
|
firstname: 'Manage Firstname' + random,
|
||||||
|
lastname: 'Manage Lastname' + random,
|
||||||
|
email: user_email,
|
||||||
|
password: 'some-pass',
|
||||||
|
role: 'Agent', # when the role is Agent an array of permissions for each group is optionally accepted
|
||||||
|
permissions: { 1 => %w[read create overview],
|
||||||
|
2 => ['full'], }
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
=end
|
||||||
|
|
||||||
|
def user_edit(params = {})
|
||||||
|
switch_window_focus(params)
|
||||||
|
log('user_edit', params)
|
||||||
|
|
||||||
|
instance = params[:browser] || @browser
|
||||||
|
data = params[:data]
|
||||||
|
|
||||||
|
click(
|
||||||
|
browser: instance,
|
||||||
|
css: 'a[href="#manage"]',
|
||||||
|
mute_log: true,
|
||||||
|
)
|
||||||
|
click(
|
||||||
|
browser: instance,
|
||||||
|
css: '.content.active a[href="#manage/users"]',
|
||||||
|
mute_log: true,
|
||||||
|
)
|
||||||
|
instance.find_elements(css: '.content.active .user-list td:first-child').each do |element|
|
||||||
|
next if element.text.strip != data[:login]
|
||||||
|
element.click
|
||||||
|
break
|
||||||
|
end
|
||||||
|
modal_ready(browser: instance)
|
||||||
|
if data[:firstname]
|
||||||
|
element = instance.find_elements(css: '.modal input[name=firstname]')[0]
|
||||||
|
element.clear
|
||||||
|
element.send_keys(data[:firstname])
|
||||||
|
end
|
||||||
|
if data[:lastname]
|
||||||
|
element = instance.find_elements(css: '.modal input[name=lastname]')[0]
|
||||||
|
element.clear
|
||||||
|
element.send_keys(data[:lastname])
|
||||||
|
end
|
||||||
|
if data[:email]
|
||||||
|
element = instance.find_elements(css: '.modal input[name=email]')[0]
|
||||||
|
element.clear
|
||||||
|
element.send_keys(data[:email])
|
||||||
|
end
|
||||||
|
if data[:password]
|
||||||
|
element = instance.find_elements(css: '.modal input[name=password]')[0]
|
||||||
|
element.clear
|
||||||
|
element.send_keys(data[:password])
|
||||||
|
element = instance.find_elements(css: '.modal input[name=password_confirm]')[0]
|
||||||
|
element.clear
|
||||||
|
element.send_keys(data[:password])
|
||||||
|
end
|
||||||
|
if data[:phone]
|
||||||
|
element = instance.find_elements(css: '.modal input[name=phone]')[0]
|
||||||
|
element.clear
|
||||||
|
element.send_keys(data[:phone])
|
||||||
|
end
|
||||||
|
if data[:active].present?
|
||||||
|
select(css: 'select[name="active"]', value: data[:active] ? 'active' : 'inactive' )
|
||||||
|
end
|
||||||
|
|
||||||
|
if data[:organization]
|
||||||
|
element = instance.find_elements(css: '.modal input.searchableSelect-main')[0]
|
||||||
|
element.clear
|
||||||
|
element.send_keys(data[:organization])
|
||||||
|
|
||||||
|
begin
|
||||||
|
retries ||= 0
|
||||||
|
target = nil
|
||||||
|
until target
|
||||||
|
sleep 0.5
|
||||||
|
target = instance.find_elements(css: ".modal li[title='#{data[:organization]}']")[0]
|
||||||
|
end
|
||||||
|
target.click()
|
||||||
|
rescue Selenium::WebDriver::Error::StaleElementReferenceError
|
||||||
|
sleep retries
|
||||||
|
retries += 1
|
||||||
|
retry if retries < 3
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if data[:role]
|
||||||
|
if data[:role] == 'Admin'
|
||||||
|
check(
|
||||||
|
browser: instance,
|
||||||
|
css: '.modal input[name=role_ids][value=1]',
|
||||||
|
)
|
||||||
|
elsif data[:role] == 'Customer'
|
||||||
|
check(
|
||||||
|
browser: instance,
|
||||||
|
css: '.modal input[name=role_ids][value=3]',
|
||||||
|
)
|
||||||
|
elsif data[:role] == 'Agent'
|
||||||
|
check(
|
||||||
|
browser: instance,
|
||||||
|
css: '.modal input[name=role_ids][value=2]',
|
||||||
|
)
|
||||||
|
else
|
||||||
|
raise "Unknown :role \"#{data[:role]}\" in user_create()"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if data[:permissions].present?
|
||||||
|
data[:permissions].each do |key, value|
|
||||||
|
value.each do |permission|
|
||||||
|
check(
|
||||||
|
browser: instance,
|
||||||
|
css: ".modal input[name=\"group_ids::#{key}\"][value=\"#{permission}\"]",
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
click(
|
||||||
|
browser: instance,
|
||||||
|
css: '.modal .js-submit',
|
||||||
|
)
|
||||||
|
|
||||||
|
modal_disappear(
|
||||||
|
browser: instance,
|
||||||
|
timeout: 10,
|
||||||
|
)
|
||||||
|
|
||||||
|
assert(true, 'user updated')
|
||||||
|
end
|
||||||
|
|
||||||
=begin
|
=begin
|
||||||
|
|
||||||
organization_create(
|
organization_create(
|
||||||
|
|
Loading…
Reference in a new issue