X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/44d97727200a7efecd115cd01fb520f371ebfe3b..97f3db9cb084efce35ef6a24c25d14308785a49a:/apps/workbench/app/controllers/projects_controller.rb diff --git a/apps/workbench/app/controllers/projects_controller.rb b/apps/workbench/app/controllers/projects_controller.rb index 323f2a189a..3122316801 100644 --- a/apps/workbench/app/controllers/projects_controller.rb +++ b/apps/workbench/app/controllers/projects_controller.rb @@ -127,8 +127,23 @@ class ProjectsController < ApplicationController if item.owner_uuid == @object.uuid # Object is owned by this project. Remove it from the project by # changing owner to the current user. - item.update_attributes owner_uuid: current_user.uuid - @removed_uuids << item.uuid + begin + item.update_attributes owner_uuid: current_user.uuid + @removed_uuids << item.uuid + rescue ArvadosApiClient::ApiErrorResponseException => e + if e.message.include? 'collection_owner_uuid_name_unique' + rename_to = item.name + ' removed from ' + + (@object.name ? @object.name : @object.uuid) + + ' at ' + Time.now.to_s + updates = {} + updates[:name] = rename_to + updates[:owner_uuid] = current_user.uuid + item.update_attributes updates + @removed_uuids << item.uuid + else + raise + end + end end end end @@ -177,7 +192,7 @@ class ProjectsController < ApplicationController limit: @limit, include_linked: true, filters: (@filters - kind_filters + [['uuid', 'is_a', type]]), - offset: @offset) + ) objects.each do |object| @name_link_for[object.andand.uuid] = objects.links_for(object, 'name').first end @@ -190,11 +205,34 @@ class ProjectsController < ApplicationController @next_page_filters = @filters.reject do |attr,op,val| attr == 'created_at' and op == nextpage_operator end + + # We are using created_at time slightly greater/lower than the last object created_at (see next block comment). + # This would mean that the server would now return the previous last item(s) with matching created_at again. + # Hence, we need to remove the previous last item (last_uuid) from results before displaying the rest of the + # results to prevent "infinite" infinite scrolling. + if params['last_uuid'] and @objects.any? + @objects.each do |obj| + @objects.delete obj if obj.uuid.eql?(params['last_uuid']) + end + end + if @objects.any? + last_created_at = @objects.last.created_at + + # In order to prevent losing item(s) that have the same created_at time as the current page last item, + # next page should look for objects with created_at time slightly greater/lower than the current last. + if nextpage_operator == '<' + last_created_at += 1 + else + last_created_at -= 1 + end + @next_page_filters += [['created_at', nextpage_operator, - @objects.last.created_at]] + last_created_at]] @next_page_href = url_for(partial: :contents_rows, + last_uuid: @objects.last.uuid, + limit: @limit, filters: @next_page_filters.to_json) else @next_page_href = nil @@ -205,7 +243,7 @@ class ProjectsController < ApplicationController include_linked: true, filters: @filters, offset: @offset) - @next_page_href = next_page_href(partial: :contents_rows) + @next_page_href = next_page_href(partial: :contents_rows, filters: @filters.to_json) end preload_links_for_objects(@objects.to_a)