OpenProject is the leading open source project management software.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
openproject/app/controllers/my_projects_overviews_contr...

202 lines
6.5 KiB

#-- encoding: UTF-8
13 years ago
#-- copyright
# ChiliProject is a project management system.
#
# Copyright (C) 2010-2011 Finn GmbH
13 years ago
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# See LICENSE for more details.
13 years ago
#++
class MyProjectsOverviewsController < ApplicationController
menu_item :overview
unloadable
before_filter :find_project, :find_user, :find_my_project_overview
before_filter :find_page_blocks, :find_project_details
before_filter :find_attachments
before_filter :authorize
13 years ago
BLOCKS = { 'issuesassignedtome' => :label_assigned_to_me_issues,
'issuesreportedbyme' => :label_reported_issues,
'issueswatched' => :label_watched_issues,
'news' => :label_news_latest,
'calendar' => :label_calendar,
'documents' => :label_document_plural,
'timelog' => :label_spent_time,
'members' => :label_member_plural,
'issuetracking' => :label_issue_tracking,
'projectdetails' => :label_project_details,
'projectdescription' => :label_project_description,
'subprojects' => :label_subproject_plural
13 years ago
}
verify :xhr => true,
:only => [:add_block, :remove_block, :order_blocks]
def index
render
end
# User's page layout configuration
def page_layout
@block_options = []
BLOCKS.each {|k, v| @block_options << [l("my.blocks.#{v}", :default => [v, v.to_s.humanize]), k.dasherize]}
@block_options << [l(:label_custom_element), :custom_element]
end
def update_custom_element
block_name = params["block_name"]
block_title = params["block_title_#{block_name}"]
textile = params["textile_#{block_name}"]
if params["attachments"]
# Attach files and save them
attachments = Attachment.attach_files(@overview, params["attachments"])
unless attachments[:unsaved].blank?
flash[:error] = l(:warning_attachments_not_saved, attachments[:unsaved].size)
end
end
@overview.save_custom_element(block_name, block_title, textile)
redirect_to :back
13 years ago
end
# Add a block to user's page
# The block is added on top of the page
# params[:block] : id of the block to add
def add_block
block = params[:block].to_s.underscore
if (BLOCKS.keys.include? block)
# remove if already present in a group
%w(top left right hidden).each {|f| @overview.send(f).delete block }
# add it hidden
@overview.hidden.unshift block
@overview.save!
render(:partial => "block",
:locals => { :user => @user,
:project => @project,
:block_name => block})
elsif block == "custom_element"
@overview.hidden.unshift @overview.new_custom_element
@overview.save!
render(:partial => "block_textilizable",
:locals => { :user => @user,
:project => @project,
:block_title => l(:label_custom_element),
:block_name => @overview.hidden.first.first,
:textile => @overview.hidden.first.last})
else
render :nothing => true
end
13 years ago
end
# Remove a block to user's page
# params[:block] : id of the block to remove
def remove_block
block = param_to_block(params[:block])
13 years ago
%w(top left right hidden).each {|f| @overview.send(f).delete block }
@overview.save!
render :nothing => true
end
# Change blocks order on user's page
# params[:group] : group to order (top, left or right)
# params[:list-(top|left|right)] : array of block ids of the group
def order_blocks
group = params[:group]
if group.is_a?(String)
group_items = (params["list-#{group}"] || []).collect {|x| param_to_block(x) }
unless group_items.size < @overview.send(group).size
# We are adding or re-ordering, not removing
# Remove group blocks if they are presents in other groups
13 years ago
@overview.update_attributes('top' => (@overview.top - group_items),
'left' => (@overview.left - group_items),
'right' => (@overview.right - group_items),
'hidden' => (@overview.hidden - group_items))
@overview.update_attribute(group, group_items)
end
end
render :nothing => true
end
def param_to_block(param)
block = param.to_s.underscore
unless (BLOCKS.keys.include? block)
block = @overview.custom_elements.detect {|ary| ary.first == block}
end
block
end
def destroy_attachment
if @user.allowed_to?(:edit_project, @project)
begin
att = Attachment.find(params[:attachment_id].to_i)
@overview.attachments.delete(att)
@overview.save
rescue ActiveRecord::RecordNotFound
end
end
@attachments -= [att]
render :partial => 'page_layout_attachments'
end
private
13 years ago
def find_my_project_overview
@overview = MyProjectsOverview.find(:first, :conditions => "project_id = #{@project.id}")
13 years ago
# Auto-create missing overviews
@overview ||= MyProjectsOverview.create!(:project_id => @project.id)
13 years ago
end
def find_user
@user = User.current
end
def find_page_blocks
@blocks = {
'top' => @overview.top,
'left' => @overview.left,
'right' => @overview.right,
'hidden' => @overview.hidden
}
end
def find_project_details
@users_by_role = @project.users_by_role
@subprojects = @project.children.visible.all
@news = @project.news.find(:all, :limit => 5,
:include => [ :author, :project ],
:order => "#{News.table_name}.created_on DESC")
@trackers = @project.rolled_up_trackers
cond = @project.project_condition(Setting.display_subprojects_issues?)
@open_issues_by_tracker = Issue.visible.count(:group => :tracker,
:include => [:project, :status, :tracker],
:conditions => ["(#{cond}) AND #{IssueStatus.table_name}.is_closed=?", false])
@total_issues_by_tracker = Issue.visible.count(:group => :tracker,
:include => [:project, :status, :tracker],
:conditions => cond)
if User.current.allowed_to?(:view_time_entries, @project)
@total_hours = TimeEntry.visible.sum(:hours, :include => :project, :conditions => cond).to_f
end
end
def find_attachments
@attachments = @overview.attachments || []
end
def default_breadcrumb
l(:label_overview)
end
13 years ago
end