11870: minor updates
[arvados.git] / apps / workbench / app / controllers / repositories_controller.rb
1 class RepositoriesController < ApplicationController
2   before_filter :set_share_links, if: -> { defined? @object }
3
4   def index_pane_list
5     %w(repositories help)
6   end
7
8   def show_pane_list
9     if @user_is_manager
10       panes = super | %w(Sharing)
11       panes.insert(panes.length-1, panes.delete_at(panes.index('Advanced'))) if panes.index('Advanced')
12       panes
13     else
14       panes = super
15     end
16     panes.delete('Attributes') if !current_user.is_admin
17     panes
18   end
19
20   def show_tree
21     @commit = params[:commit]
22     @path = params[:path] || ''
23     @subtree = @object.ls_subtree @commit, @path.chomp('/')
24   end
25
26   def show_blob
27     @commit = params[:commit]
28     @path = params[:path]
29     @blobdata = @object.cat_file @commit, @path
30   end
31
32   def show_commit
33     @commit = params[:commit]
34   end
35
36   def all_repos
37     limit = params[:limit].andand.to_i || 100
38     offset = params[:offset].andand.to_i || 0
39     @filters = params[:filters] || []
40
41     if @filters.any?
42       owner_filter = @filters.select do |attr, op, val|
43         (attr == 'owner_uuid')
44       end
45     end
46
47     if !owner_filter.andand.any?
48       filters = @filters + [["owner_uuid", "=", current_user.uuid]]
49       my_repos = Repository.all.order("name ASC").limit(limit).offset(offset).filter(filters).results
50     else      # done fetching all owned repositories
51       my_repos = []
52     end
53
54     if !owner_filter.andand.any?  # if this is next page request, the first page was still fetching "own" repos
55       @filters = @filters.reject do |attr, op, val|
56         (attr == 'owner_uuid') or
57         (attr == 'name') or
58         (attr == 'uuid')
59       end
60     end
61
62     filters = @filters + [["owner_uuid", "!=", current_user.uuid]]
63     other_repos = Repository.all.order("name ASC").limit(limit).offset(offset).filter(filters).results
64
65     @objects = (my_repos + other_repos).first(limit)
66   end
67
68   def find_objects_for_index
69     return if !params[:partial]
70
71     all_repos
72
73     if @objects.any?
74       @next_page_filters = next_page_filters('>=')
75       @next_page_href = url_for(partial: :repositories_rows,
76                                 filters: @next_page_filters.to_json)
77     else
78       @next_page_href = nil
79     end
80   end
81
82   def next_page_href with_params={}
83     @next_page_href
84   end
85
86   def next_page_filters nextpage_operator
87     next_page_filters = @filters.reject do |attr, op, val|
88       (attr == 'owner_uuid') or
89       (attr == 'name' and op == nextpage_operator) or
90       (attr == 'uuid' and op == 'not in')
91     end
92
93     if @objects.any?
94       last_obj = @objects.last
95       next_page_filters += [['name', nextpage_operator, last_obj.name]]
96       next_page_filters += [['uuid', 'not in', [last_obj.uuid]]]
97       # if not-owned, it means we are done with owned repos and fetching other repos
98       next_page_filters += [['owner_uuid', '!=', last_obj.uuid]] if last_obj.owner_uuid != current_user.uuid
99     end
100
101     next_page_filters
102   end
103 end