summaryrefslogtreecommitdiffstats
path: root/lib/redmine/project_jump_box.rb
diff options
context:
space:
mode:
authorGo MAEDA <maeda@farend.jp>2019-05-20 22:26:30 +0000
committerGo MAEDA <maeda@farend.jp>2019-05-20 22:26:30 +0000
commit29403e710a8d0d83c81387f236082f209f3ba7ed (patch)
tree5e396ddcc22d5f7f93b75970340e0197a145f825 /lib/redmine/project_jump_box.rb
parentda78e654f13b9b13e1584bac91dae9631c12f63e (diff)
downloadredmine-29403e710a8d0d83c81387f236082f209f3ba7ed.tar.gz
redmine-29403e710a8d0d83c81387f236082f209f3ba7ed.zip
Adds favorites and recently used projects lists to project jump box (#31355).
Patch by Jens Krämer. git-svn-id: http://svn.redmine.org/redmine/trunk@18181 e93f8b46-1217-0410-a6f0-8f06a7374b81
Diffstat (limited to 'lib/redmine/project_jump_box.rb')
-rw-r--r--lib/redmine/project_jump_box.rb94
1 files changed, 94 insertions, 0 deletions
diff --git a/lib/redmine/project_jump_box.rb b/lib/redmine/project_jump_box.rb
new file mode 100644
index 000000000..5978dc19a
--- /dev/null
+++ b/lib/redmine/project_jump_box.rb
@@ -0,0 +1,94 @@
+module Redmine
+ class ProjectJumpBox
+ def initialize(user)
+ @user = user
+ @pref_project_ids = {}
+ end
+
+ def recent_projects_count
+ @user.pref.recently_used_projects
+ end
+
+ def recently_used_projects(query = nil)
+ project_ids = recently_used_project_ids
+ projects = Project.where(id: project_ids)
+ if query
+ projects = projects.like(query)
+ end
+ projects.
+ index_by(&:id).
+ values_at(*project_ids). # sort according to stored order
+ compact
+ end
+
+ def bookmarked_projects(query = nil)
+ projects = Project.where(id: bookmarked_project_ids).visible
+ if query
+ projects = projects.like(query)
+ end
+ projects.to_a
+ end
+
+ def project_used(project)
+ return if project.blank? || project.id.blank?
+
+ id_array = recently_used_project_ids
+ id_array.reject!{ |i| i == project.id }
+ # we dont want bookmarks in the recently used list:
+ id_array.unshift(project.id) unless bookmark?(project)
+ self.recently_used_project_ids = id_array[0, recent_projects_count]
+ end
+
+ def bookmark_project(project)
+ self.recently_used_project_ids = recently_used_project_ids.reject{|id| id == project.id}
+ self.bookmarked_project_ids = (bookmarked_project_ids << project.id)
+ end
+
+ def delete_project_bookmark(project)
+ self.bookmarked_project_ids = bookmarked_project_ids.reject do |id|
+ id == project.id
+ end
+ end
+
+ def bookmark?(project)
+ project && project.id && bookmarked_project_ids.include?(project.id)
+ end
+
+ private
+
+ def bookmarked_project_ids
+ pref_project_ids :bookmarked_project_ids
+ end
+
+ def bookmarked_project_ids=(new_ids)
+ set_pref_project_ids :bookmarked_project_ids, new_ids
+ end
+
+ def recently_used_project_ids
+ pref_project_ids(:recently_used_project_ids)[0,recent_projects_count]
+ end
+
+ def recently_used_project_ids=(new_ids)
+ set_pref_project_ids :recently_used_project_ids, new_ids
+ end
+
+ def pref_project_ids(key)
+ return [] unless @user.logged?
+
+ @pref_project_ids[key] ||= (@user.pref[key] || '').split(',').map(&:to_i)
+ end
+
+ def set_pref_project_ids(key, new_values)
+ return nil unless @user.logged?
+
+ old_value = @user.pref[key]
+ new_value = new_values.uniq.join(',')
+ if old_value != new_value
+ @user.pref[key] = new_value
+ @user.pref.save
+ end
+ @pref_project_ids.delete key
+ nil
+ end
+ end
+end