box_organizer_controller.rb
3.48 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
class BoxOrganizerController < ApplicationController
before_filter :login_required
def index
@available_blocks = available_blocks.uniq.sort_by(&:pretty_name)
end
def move_block
@block = params[:id] ? boxes_holder.blocks.find(params[:id].gsub(/^block-/, '')) : nil
target_position = nil
if (params[:target] =~ /before-block-([0-9]+)/)
block_before = boxes_holder.blocks.find($1)
target_position = block_before.position
@target_box = block_before.box
elsif params[:target] =~ /end-of-box-([0-9]+)/
@target_box = boxes_holder.boxes.find_by id: $1
end
@block = new_block(params[:type], @target_box) if @block.nil?
@source_box = @block.box
if (@source_box != @target_box)
@block.remove_from_list
@block.box = @target_box
end
if target_position.nil?
# insert in the end of the box
@block.insert_at(@target_box.blocks.size + 1)
@block.move_to_bottom
else
new_position = if @block.position and @block.position < target_position then target_position - 1 else target_position end
@block.insert_at new_position
end
@block.save!
@target_box.reload
unless request.xhr?
redirect_to :action => 'index'
end
end
def move_block_down
@block = boxes_holder.blocks.find(params[:id])
@block.move_lower
redirect_to :action => 'index'
end
def move_block_up
@block = boxes_holder.blocks.find(params[:id])
@block.move_higher
redirect_to :action => 'index'
end
def edit
@block = boxes_holder.blocks.find(params[:id])
render :action => 'edit', :layout => false
end
def search_autocomplete
if request.xhr? and params[:query]
search = params[:query]
path_list = if boxes_holder.is_a?(Environment) && boxes_holder.enabled?('use_portal_community') && boxes_holder.portal_community
boxes_holder.portal_community.articles.where("name ILIKE ? OR path ILIKE ?", "%#{search}%", "%#{search}%").limit(20).map { |content| "/{portal}/"+content.path }
elsif boxes_holder.is_a?(Profile)
boxes_holder.articles.where("name ILIKE ? OR path ILIKE ?", "%#{search}%", "%#{search}%").limit(20).map { |content| "/{profile}/"+content.path }
else
[]
end
render :json => path_list.to_json
else
redirect_to "/"
end
end
def save
@block = boxes_holder.blocks.find(params[:id])
return render_access_denied unless @block.editable?(user)
@block.update(params[:block])
redirect_to :action => 'index'
end
def boxes_editor?
true
end
def remove
@block = Block.find(params[:id])
if @block.destroy
redirect_to :action => 'index'
else
session[:notice] = _('Failed to remove block')
end
end
def clone_block
block = Block.find(params[:id])
block.duplicate
redirect_to :action => 'index'
end
def show_block_type_info
type = params[:type]
if type.blank? || !available_blocks.map(&:name).include?(type)
raise ArgumentError.new("Type %s is not allowed. Go away.".html_safe % type)
end
@block = type.constantize.new
@block.box = Box.new(:owner => boxes_holder)
render :action => 'show_block_type_info', :layout => false
end
protected :boxes_editor?
protected
def new_block(type, box)
if !available_blocks.map(&:name).include?(type)
raise ArgumentError.new("Type %s is not allowed. Go away.".html_safe % type)
end
block = type.constantize.new
box.blocks << block
block
end
end