kanbanworkflowstimelinescrumrubyroadmapproject-planningproject-managementopenprojectangularissue-trackerifcgantt-chartganttbug-trackerboardsbcf
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.
186 lines
5.1 KiB
186 lines
5.1 KiB
#-- encoding: UTF-8
|
|
#-- copyright
|
|
# OpenProject My Project Page Plugin
|
|
#
|
|
# Copyright (C) 2011-2014 the OpenProject Foundation (OPF)
|
|
#
|
|
# This program is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU General Public License version 3.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
#
|
|
# See doc/COPYRIGHT.md for more details.
|
|
#++
|
|
|
|
class MyProjectsOverviewsController < ApplicationController
|
|
|
|
menu_item :overview
|
|
|
|
before_action :find_project
|
|
before_action :authorize
|
|
before_action :jump_to_project_menu_item, only: :index
|
|
|
|
verify xhr: true, only: [:update_custom_element, :render_attachments, :add_block]
|
|
|
|
def self.available_blocks
|
|
@available_blocks ||= OpenProject::MyProjectPage.plugin_blocks
|
|
end
|
|
|
|
def index
|
|
end
|
|
|
|
# User's page layout configuration
|
|
def page_layout
|
|
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?
|
|
render text: t(:warning_attachments_not_saved, attachments[:unsaved].size), status: 500
|
|
end
|
|
end
|
|
|
|
if overview.save_custom_element(block_name, block_title, textile)
|
|
render(partial: "block_textilizable",
|
|
locals: { project: project,
|
|
block_title: block_title,
|
|
block_name: block_name,
|
|
textile: textile })
|
|
else
|
|
render text: t(:error_textile_not_saved), status: 400
|
|
end
|
|
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]
|
|
if MyProjectsOverviewsController.available_blocks.keys.include? block
|
|
render partial: "block", locals: { block_name: block, editing: true }
|
|
elsif block == "custom_element"
|
|
render_new_custom_block
|
|
else
|
|
render nothing: true
|
|
end
|
|
end
|
|
|
|
##
|
|
# Handle saving the changes
|
|
def save_changes
|
|
# Save block states
|
|
save_blocks_from_params
|
|
|
|
if overview.save
|
|
flash[:notice] = I18n.t(:notice_successful_update)
|
|
redirect_to(action: :index)
|
|
else
|
|
flash[:error] = I18n.t(:error_saving_changes,
|
|
errors: overview.errors.full_messages.join(', '))
|
|
render :page_layout
|
|
end
|
|
end
|
|
|
|
def render_attachments
|
|
render partial: 'page_layout_attachments'
|
|
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
|
|
|
|
render partial: 'page_layout_attachments'
|
|
end
|
|
|
|
helper_method :project,
|
|
:user,
|
|
:overview
|
|
def project
|
|
@project
|
|
end
|
|
|
|
def user
|
|
current_user
|
|
end
|
|
|
|
def overview
|
|
@overview ||= MyProjectsOverview.find_or_create_by(project_id: project.id)
|
|
end
|
|
|
|
private
|
|
|
|
def render_new_custom_block
|
|
new_block = overview.new_custom_element
|
|
overview.hidden << new_block
|
|
if overview.save
|
|
render(partial: "block_textilizable",
|
|
locals: { project: project,
|
|
block_title: l(:label_custom_element),
|
|
new_block: true,
|
|
block_name: new_block.first,
|
|
textile: new_block.last })
|
|
else
|
|
render text: I18n.t(:error_saving_changes, errors: overview.errors.full_messages.join(', ')),
|
|
status: 500
|
|
end
|
|
end
|
|
|
|
##
|
|
# Given params of the form
|
|
# { top: 'block,block,block', ... }
|
|
# Save the actual block positions, filtering the list doing so.
|
|
def save_blocks_from_params
|
|
custom_elements = overview.custom_elements
|
|
|
|
%w(top left right hidden).each do |group|
|
|
active_blocks = param_to_blocks(params[group], custom_elements)
|
|
overview.send("#{group}=", active_blocks)
|
|
end
|
|
end
|
|
|
|
##
|
|
# Returns a list of valid blocks for the given group param
|
|
def param_to_blocks(block_str, custom_elements)
|
|
blocks = []
|
|
block_str.split(',').select do |name|
|
|
if MyProjectsOverviewsController.available_blocks.keys.include?(name)
|
|
blocks << name
|
|
else
|
|
custom = custom_elements.detect {|ary| ary.first == name }
|
|
blocks << custom unless custom.nil?
|
|
end
|
|
end
|
|
|
|
blocks
|
|
end
|
|
|
|
def default_breadcrumb
|
|
l(:label_overview)
|
|
end
|
|
|
|
def jump_to_project_menu_item
|
|
if params[:jump]
|
|
# try to redirect to the requested menu item
|
|
redirect_to_project_menu_item(project, params[:jump]) && return
|
|
end
|
|
end
|
|
end
|
|
|