Merge branch 'master' into 3112-report-bug
[arvados.git] / apps / workbench / app / controllers / projects_controller.rb
index 3e7bfcc71dea4f5c5094ba7181eb38e1f9370d6f..0b14679e119a03afb2851a3a950868c3fc02a7b3 100644 (file)
@@ -86,7 +86,7 @@ class ProjectsController < ApplicationController
       uniq.
       each do |resource_class|
       resource_class.filter([['uuid','in',uuids_to_add]]).each do |dst|
-        if resource_class == Collection
+        if resource_class == Collection and not Collection.attribute_info.include?(:name)
           dst = Link.new(owner_uuid: target_uuid,
                          tail_uuid: target_uuid,
                          head_uuid: dst.uuid,
@@ -132,28 +132,38 @@ class ProjectsController < ApplicationController
     kind_filters = @filters.select do |attr,op,val|
       op == 'is_a' and val.is_a? Array and val.count > 1
     end
-    if /^created_at/ =~ @order[0] and kind_filters.count == 1
+    if /^created_at\b/ =~ @order[0] and kind_filters.count == 1
       # If filtering on multiple types and sorting by date: Get the
       # first page of each type, sort the entire set, truncate to one
       # page, and use the last item on this page as a filter for
       # retrieving the next page. Ideally the API would do this for
       # us, but it doesn't (yet).
+      nextpage_operator = /\bdesc$/i =~ @order[0] ? '<' : '>'
       @objects = []
+      @name_link_for = {}
       kind_filters.each do |attr,op,val|
         (val.is_a?(Array) ? val : [val]).each do |type|
-          @objects += @object.contents(order: @order,
-                                       limit: @limit,
-                                       include_linked: true,
-                                       filters: (@filters - kind_filters + [['uuid', 'is_a', type]]),
-                                       offset: @offset)
+          objects = @object.contents(order: @order,
+                                     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
+          @objects += objects
         end
       end
-      @objects = @objects.to_a.sort_by(&:created_at).reverse[0..@limit-1]
+      @objects = @objects.to_a.sort_by(&:created_at)
+      @objects.reverse! if nextpage_operator == '<'
+      @objects = @objects[0..@limit-1]
       @next_page_filters = @filters.reject do |attr,op,val|
-        attr == 'created_at' and op == '<'
+        attr == 'created_at' and op == nextpage_operator
       end
       if @objects.any?
-        @next_page_filters += [['created_at', '<', @objects.last.created_at]]
+        @next_page_filters += [['created_at',
+                                nextpage_operator,
+                                @objects.last.created_at]]
         @next_page_href = url_for(partial: :contents_rows,
                                   filters: @next_page_filters.to_json)
       else
@@ -167,6 +177,8 @@ class ProjectsController < ApplicationController
                                   offset: @offset)
       @next_page_href = next_page_href(partial: :contents_rows)
     end
+
+    preload_links_for_objects(@objects.to_a)
   end
 
   def show
@@ -223,9 +235,11 @@ class ProjectsController < ApplicationController
         name_links.each do |name_link|
           objects_and_names << [object, name_link]
         end
+      elsif @name_link_for.andand[object.uuid]
+        objects_and_names << [object, @name_link_for[object.uuid]]
       elsif object.respond_to? :name
         objects_and_names << [object, object]
-      else
+      elsif not Collection.attribute_info.include?(:name)
         objects_and_names << [object,
                                Link.new(owner_uuid: @object.uuid,
                                         tail_uuid: @object.uuid,