Commit 11461cf62d27825fd0449a5f86779e44a0b5b9fd
1 parent
f4d329de
Exists in
master
and in
22 other branches
r238@sede: terceiro | 2007-07-28 19:40:52 -0300
ActionItem0: adding code from flexible template to be reworked later git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@242 3f533792-8f58-4932-b0fe-aaf55b0a4547
Showing
2 changed files
with
408 additions
and
0 deletions
Show diff stats
vendor/plugins/design/lib/design/editor.rb
1 | module Design | 1 | module Design |
2 | 2 | ||
3 | # This module contains the functionality for e design editor. | 3 | # This module contains the functionality for e design editor. |
4 | + # | ||
5 | + # FIXME: this helper module is still deeply broken, with code just copied | ||
6 | + # from flexible_template | ||
4 | module Editor | 7 | module Editor |
8 | + | ||
9 | + #FIXME: move extraction of these values elsewhere | ||
10 | + def start | ||
11 | + @ft_config[:available_templates] = parse_path(Dir.glob("#{RAILS_ROOT}/public/templates/*"), 'templates/') | ||
12 | + @ft_config[:available_themes] = parse_path(Dir.glob("#{RAILS_ROOT}/public/themes/*"), 'themes/') | ||
13 | + @ft_config[:available_icon_themes] = parse_path(Dir.glob("#{RAILS_ROOT}/public/icons/*"), 'icons/') | ||
14 | + end | ||
15 | + | ||
16 | + def flexible_template_edit_template? | ||
17 | + @ft_config[:edit_mode] | ||
18 | + end | ||
19 | + | ||
20 | + # Set the default template to the profile | ||
21 | + def set_default_template | ||
22 | + set_template(@ft_config[:owner],params[:template_name]) if exist_template? params[:template_name] | ||
23 | + end | ||
24 | + | ||
25 | + # Set the default theme to the profile | ||
26 | + def set_default_theme | ||
27 | + set_theme(@ft_config[:owner],params[:theme_name]) if exist_theme? params[:theme_name] | ||
28 | + end | ||
29 | + | ||
30 | + # Set the default icons theme to the profile | ||
31 | + def set_default_icon_theme | ||
32 | + set_icon_theme(@ft_config[:owner],params[:icon_theme_name]) if exist_icon_theme? params[:icon_theme_name] | ||
33 | + end | ||
34 | + | ||
35 | + def flexible_template_set_sort_mode | ||
36 | + box = @ft_config[:owner].boxes.find(params[:box_id]) | ||
37 | + render :update do |page| | ||
38 | + page.replace_html "box_#{box.number}", edit_blocks(box) | ||
39 | + page.sortable "sort_#{box.number}", :url => {:action => 'flexible_template_sort_box', :box_number => box.number} | ||
40 | + end | ||
41 | + end | ||
42 | + | ||
43 | + def flexible_template_sort_box | ||
44 | + box_number = params[:box_number] | ||
45 | + pos = 0 | ||
46 | + params["sort_#{box_number}"].each do |block_id| | ||
47 | + pos = pos + 1 | ||
48 | + #TO this is a security fail we have to limit the researh only in valid blocks of owners | ||
49 | + b = Block.find(block_id) | ||
50 | + b.position = pos | ||
51 | + b.save | ||
52 | + end | ||
53 | + end | ||
54 | + | ||
55 | + # This method changes a block content to a different box place and | ||
56 | + # updates all boxes at the ends | ||
57 | + def flexible_template_change_box | ||
58 | + #TODO fix it i tried the source code comment but i have no success | ||
59 | + #b = @ft_config[:owner].blocks.detect{|b| b.id.to_s == params[:block].to_s } | ||
60 | + b = Block.find(params[:block]) | ||
61 | + b.box = @ft_config[:owner].boxes.find(params[:box_id]) | ||
62 | + b.save | ||
63 | + render :update do |page| | ||
64 | + @ft_config[:owner].boxes.each do |box| | ||
65 | + page.replace_html "box_#{box.number}", edit_blocks(box) | ||
66 | + end | ||
67 | + end | ||
68 | + end | ||
69 | + | ||
70 | + def flexible_template_new_block | ||
71 | + box = @ft_config[:owner].boxes.find(params[:box_id]) | ||
72 | + render :update do |page| | ||
73 | + page.replace_html "box_#{box.number}", new_block_form(box) | ||
74 | + end | ||
75 | + end | ||
76 | + | ||
77 | + def flexible_template_create_block | ||
78 | + block = Block.new(params[:block]) | ||
79 | + block.box = nil if !@ft_config[:boxes].include? block.box | ||
80 | + block.position = block.box.blocks.count + 1 if !block.box.nil? | ||
81 | + if block.save | ||
82 | + render :update do |page| | ||
83 | + page.replace_html "box_#{block.box.number}", edit_blocks(block.box) | ||
84 | + end | ||
85 | + else | ||
86 | + render :update do |page| | ||
87 | + page.replace_html "flexible_template_edit_mode", _('Block cannot be saved') | ||
88 | + end | ||
89 | + end | ||
90 | + end | ||
91 | + | ||
92 | + def flexible_template_destroy_block | ||
93 | + block = Block.find(params[:block_id]) | ||
94 | + box = block.box | ||
95 | + #TO check if the block is of the owner | ||
96 | + block.destroy | ||
97 | + render :update do |page| | ||
98 | + page.replace_html "box_#{box.number}", edit_blocks(box) | ||
99 | + end | ||
100 | + end | ||
101 | + | ||
102 | + private | ||
103 | + | ||
104 | + # Set to the owner the theme choosed | ||
105 | + def set_theme(object, theme_name) | ||
106 | + object.flexible_template_theme = theme_name | ||
107 | + object.save | ||
108 | + end | ||
109 | + | ||
110 | + # Set to the owner the icons theme choosed | ||
111 | + def set_icon_theme(object,icon_theme_name) | ||
112 | + object.flexible_template_icon_theme = icon_theme_name | ||
113 | + object.save | ||
114 | + end | ||
115 | + | ||
116 | + # Set to the owner the template choosed | ||
117 | + def set_template(object, template_name) | ||
118 | + object.flexible_template_template = template_name | ||
119 | + object.save | ||
120 | + end | ||
121 | + | ||
122 | + #Load a set of boxes belongs to a owner. We have to situations. | ||
123 | + # 1 - The owner has equal or more boxes that boxes defined in template. | ||
124 | + # The system limit the max number of boxes to the number permited in template | ||
125 | + # 2 - The owner there isn't enough box that defined in template | ||
126 | + # The system create the boxes needed to use the current template | ||
127 | + #If no chosen_template was selected the default template is set | ||
128 | + def ft_load_boxes | ||
129 | + n = boxes_by_template(@ft_config[:template]) | ||
130 | + boxes = @ft_config[:owner].boxes | ||
131 | + | ||
132 | + if boxes.length >= n | ||
133 | + boxes = boxes.first(n) | ||
134 | + else | ||
135 | + while boxes.length < n do | ||
136 | + b = Box.new | ||
137 | + b.owner = @ft_config[:owner] | ||
138 | + raise _('The box cannot be saved becaus of erros %s') % b.errors if !b.save | ||
139 | + boxes.push(b) | ||
140 | + end | ||
141 | + end | ||
142 | + boxes | ||
143 | + end | ||
144 | + | ||
145 | + # Return the number of boxes defined in template file. | ||
146 | + # If the template file didn't exist the default template is loaded | ||
147 | + def boxes_by_template(template) | ||
148 | + template_def_file = Dir.glob("#{RAILS_ROOT}/public/templates/#{template}/*.yml") | ||
149 | + | ||
150 | + if template_def_file.length != 1 | ||
151 | + flash[:notice] = _("The template %s is not a valid template. You don't have the %s.yml file or there are more than one yml file to define your template") % [template, template] | ||
152 | + return | ||
153 | + end | ||
154 | + | ||
155 | + f = YAML.load_file(template_def_file.to_s) | ||
156 | + number_of_boxes = f[template.to_s]["number_of_boxes"] | ||
157 | + flash[:notice] = _("The file #{@ft_config[:template]}.yml it's not a valid template filename") if number_of_boxes.nil? | ||
158 | + number_of_boxes | ||
159 | + end | ||
160 | + | ||
161 | + def exist_template? template | ||
162 | + @ft_config[:available_templates].include?(template) | ||
163 | + end | ||
164 | + | ||
165 | + def exist_theme? theme | ||
166 | + @ft_config[:available_themes].include?(theme) | ||
167 | + end | ||
168 | + | ||
169 | + def exist_icon_theme? icon_theme | ||
170 | + @ft_config[:available_icon_themes].include?(icon_theme) | ||
171 | + end | ||
172 | + | ||
173 | + def parse_path(files_path = [], remove_until = 'public') | ||
174 | + remove_until = remove_until.gsub(/\//, '\/') | ||
175 | + files_path.map{|f| f.gsub(/.*#{remove_until}/, '')} | ||
176 | + end | ||
177 | + | ||
5 | end | 178 | end |
6 | 179 | ||
7 | end | 180 | end |
vendor/plugins/design/lib/design/editor/helper.rb
@@ -3,6 +3,9 @@ module Design | @@ -3,6 +3,9 @@ module Design | ||
3 | module Editor | 3 | module Editor |
4 | 4 | ||
5 | # defines helper methods for controllers that use +design_editor+ | 5 | # defines helper methods for controllers that use +design_editor+ |
6 | + # | ||
7 | + # FIXME: this Helper module is still deeply broken, just copied code from | ||
8 | + # flexible_template | ||
6 | module Helper | 9 | module Helper |
7 | 10 | ||
8 | # draws the user interface for the design editor. | 11 | # draws the user interface for the design editor. |
@@ -37,6 +40,238 @@ module Design | @@ -37,6 +40,238 @@ module Design | ||
37 | content = content_tag(:div, content, :id => 'flexible_template_edit_mode') | 40 | content = content_tag(:div, content, :id => 'flexible_template_edit_mode') |
38 | end | 41 | end |
39 | 42 | ||
43 | + # Symbol dictionary used on select when we add or edit a block. This | ||
44 | + # method has the responsability of translate a Block class in a humam | ||
45 | + # name By default the class "MainBlock" has the human name "Main Block". | ||
46 | + # Other classes defined by user are not going to display in a human name | ||
47 | + # format until de method flexible_template_block_dict be redefined in a | ||
48 | + # controller by user | ||
49 | + # #TODO define the method | ||
50 | + # flexible_template_block_dict if not defined by helper | ||
51 | + # if !self.public_instance_methods.include? "flexible_template_block_dict" | ||
52 | + # define_method('flexible_template_block_dict') do |str| | ||
53 | + # { | ||
54 | + # 'MainBlock' => _("Main Block") | ||
55 | + # }[str] || str | ||
56 | + # end | ||
57 | + # end | ||
58 | + | ||
59 | + | ||
60 | + def flexible_template_block_helper_dict(str) | ||
61 | + { | ||
62 | + 'plain_content' => _('Plain Content') , | ||
63 | + 'list_content' => _('List Content') | ||
64 | + }[str] || str | ||
65 | + end | ||
66 | + | ||
67 | + | ||
68 | + private | ||
69 | + | ||
70 | + ################################################# | ||
71 | + # TEMPLATES METHODS RELATED | ||
72 | + ################################################# | ||
73 | + | ||
74 | + # Shows the blocks as defined in <tt>show_blocks</tt> adding the sortable and draggable elements. | ||
75 | + # In this case the layout can be manipulated | ||
76 | + def edit_blocks(box, main_content = "") | ||
77 | + blocks = box.blocks_sort_by_position | ||
78 | + [ | ||
79 | + content_tag( | ||
80 | + :ul,[ | ||
81 | + box.name, | ||
82 | + link_to_active_sort(box), | ||
83 | + link_to_add_block(box), | ||
84 | + blocks.map {|b| | ||
85 | + [content_tag( | ||
86 | + :li, | ||
87 | + b.name + link_to_destroy_block(b), | ||
88 | + :class =>"block_item_box_#{box.number}" , :id => "block_#{b.id}" | ||
89 | + ), | ||
90 | + draggable("block_#{b.id}")].join("\n") | ||
91 | + }.join("\n")].join("\n"), :id => "sort_#{box.number}" | ||
92 | + ), | ||
93 | + drag_drop_items(box)].join("\n") | ||
94 | + end | ||
95 | + | ||
96 | + def link_to_active_sort(box) | ||
97 | + link_to_remote(_('Sort'), | ||
98 | + {:update => "sort_#{box.number}", :url => {:action => 'flexible_template_set_sort_mode', :box_id => box.id }}, | ||
99 | + :class => 'sort_button') | ||
100 | + end | ||
101 | + | ||
102 | + def link_to_add_block(box) | ||
103 | + link_to_remote(_('Add Block'), | ||
104 | + {:update => "sort_#{box.number}", :url => {:action => 'flexible_template_new_block', :box_id => box.id }}, | ||
105 | + :class => 'add_block_button') | ||
106 | + end | ||
107 | + | ||
108 | + def link_to_destroy_block(block) | ||
109 | + link_to_remote(_('Remove'), | ||
110 | + {:update => "sort_#{block.box.number}", :url => {:action => 'flexible_template_destroy_block', :block_id => block.id }}, | ||
111 | + :class => 'destroy_block_button') | ||
112 | + end | ||
113 | + | ||
114 | + | ||
115 | + # Allows the biven box to have sortable elements | ||
116 | + def sortable_block(box_number) | ||
117 | + sortable_element "sort_#{box_number}", | ||
118 | + :url => {:action => 'flexible_template_sort_box', :box_number => box_number }, | ||
119 | + :complete => visual_effect(:highlight, "sort_#{box_number}") | ||
120 | + end | ||
121 | + | ||
122 | + # Allows an element item to be draggable | ||
123 | + def draggable(item) | ||
124 | + draggable_element(item, :ghosting => true, :revert => true) | ||
125 | + end | ||
126 | + | ||
127 | + # Allows an draggable element change between diferrents boxes | ||
128 | + def drag_drop_items(box) | ||
129 | + boxes = @ft_config[:boxes].reject{|b| b.id == box.id} | ||
130 | + | ||
131 | + boxes.map{ |b| | ||
132 | + drop_receiving_element("box_#{box.number}", | ||
133 | + :accept => "block_item_box_#{b.number}", | ||
134 | + :complete => "$('spinner').hide();", | ||
135 | + :before => "$('spinner').show();", | ||
136 | + :hoverclass => 'hover', | ||
137 | + :with => "'block=' + encodeURIComponent(element.id.split('_').last())", | ||
138 | + :url => {:action=>:flexible_template_change_box, :box_id => box.id}) | ||
139 | + }.to_s | ||
140 | + end | ||
141 | + | ||
142 | + | ||
143 | + # Generate a select option to choose one of the available templates. | ||
144 | + # The available templates are those in 'public/templates' | ||
145 | + def select_template | ||
146 | + available_templates = @ft_config[:available_templates] | ||
147 | + | ||
148 | + template_options = options_for_select(available_templates.map{|template| [template, template] }, @ft_config[:template]) | ||
149 | + [ select_tag('template_name', template_options ), | ||
150 | + change_template].join("\n") | ||
151 | + end | ||
152 | + | ||
153 | + # Generate a observer to reload a page when a template is selected | ||
154 | + def change_template | ||
155 | + observe_field( 'template_name', | ||
156 | + :url => {:action => 'set_default_template'}, | ||
157 | + :with =>"'template_name=' + escape(value) + '&object_id=' + escape(#{@ft_config[:owner].id})", | ||
158 | + :complete => "document.location.reload();" | ||
159 | + ) | ||
160 | + end | ||
161 | + | ||
162 | + def available_blocks | ||
163 | +#TOD O check if are valids blocks | ||
164 | + h = { | ||
165 | + 'MainBlock' => _("Main Block"), | ||
166 | + } | ||
167 | + h.merge!(controller.class::FLEXIBLE_TEMPLATE_AVAILABLE_BLOCKS) if controller.class.constants.include? "FLEXIBLE_TEMPLATE_AVAILABLE_BLOCKS" | ||
168 | + h | ||
169 | + end | ||
170 | + | ||
171 | + def block_helpers | ||
172 | +#TOD O check if are valids helpers | ||
173 | + h = { | ||
174 | + 'plain_content' => _("Plain Content"), | ||
175 | + 'list_content' => _("Simple List Content"), | ||
176 | + } | ||
177 | + h.merge!(controller.class::FLEXIBLE_TEMPLATE_BLOCK_HELPER) if controller.class.constants.include? "FLEXIBLE_TEMPLATE_BLOCK_HELPER" | ||
178 | + h | ||
179 | + end | ||
180 | + | ||
181 | + def new_block_form(box) | ||
182 | + type_block_options = options_for_select(available_blocks.collect{|k,v| [v,k] }) | ||
183 | + type_block_helper_options = options_for_select(block_helpers.collect{|k,v| [v,k] }) | ||
184 | + @block = Block.new | ||
185 | + @block.box = box | ||
186 | + | ||
187 | + _("Adding block on %s") % box.name + | ||
188 | + [ | ||
189 | + form_remote_tag(:url => {:action => 'flexible_template_create_block'}, :update => "sort_#{box.number}"), | ||
190 | + hidden_field('block', 'box_id'), | ||
191 | + content_tag( | ||
192 | + :p, | ||
193 | + [ | ||
194 | + content_tag( | ||
195 | + :label, _('Name:') | ||
196 | + ), | ||
197 | + text_field('block', 'name') | ||
198 | + ].join("\n") | ||
199 | + ), | ||
200 | + content_tag( | ||
201 | + :p, | ||
202 | + [ | ||
203 | + content_tag( | ||
204 | + :label, _('Title:') | ||
205 | + ), | ||
206 | + text_field('block', 'title') | ||
207 | + ].join("\n") | ||
208 | + ), | ||
209 | + content_tag( | ||
210 | + :p, | ||
211 | + [ | ||
212 | + content_tag( | ||
213 | + :label, _('Type:') | ||
214 | + ), | ||
215 | + select_tag('block[type]', type_block_options) | ||
216 | + ].join("\n") | ||
217 | + ), | ||
218 | + content_tag( | ||
219 | + :p, | ||
220 | + [ | ||
221 | + content_tag( | ||
222 | + :label, _('Visualization Mode:') | ||
223 | + ), | ||
224 | + select_tag('block[helper]', type_block_helper_options) | ||
225 | + ].join("\n") | ||
226 | + ), | ||
227 | + submit_tag( _('Submit')), | ||
228 | + end_form_tag | ||
229 | + ].join("\n") | ||
230 | + | ||
231 | + end | ||
232 | + | ||
233 | + # Generate a select option to choose one of the available themes. | ||
234 | + # The available themes are those in 'public/themes' | ||
235 | + def select_theme | ||
236 | + available_themes = @ft_config[:available_themes] | ||
237 | + theme_options = options_for_select(available_themes.map{|theme| [theme, theme] }, @ft_config[:theme]) | ||
238 | + [ select_tag('theme_name', theme_options ), | ||
239 | + change_theme].join("\n") | ||
240 | + end | ||
241 | + | ||
242 | + # Generate a observer to reload a page when a theme is selected | ||
243 | + def change_theme | ||
244 | + observe_field( 'theme_name', | ||
245 | + :url => {:action => 'set_default_theme'}, | ||
246 | + :with =>"'theme_name=' + escape(value) + '&object_id=' + escape(#{@ft_config[:owner].id})", | ||
247 | + :complete => "document.location.reload();" | ||
248 | + ) | ||
249 | + end | ||
250 | + | ||
251 | + | ||
252 | + ################################################# | ||
253 | + #ICONS THEMES RELATED | ||
254 | + ################################################# | ||
255 | + | ||
256 | + # Generate a select option to choose one of the available icons themes. | ||
257 | + # The available icons themes are those in 'public/icons' | ||
258 | + def select_icon_theme | ||
259 | + available_icon_themes = @ft_config[:available_icon_themes] | ||
260 | + icon_theme_options = options_for_select(available_icon_themes.map{|icon_theme| [icon_theme, icon_theme] }, @ft_config[:icon_theme]) | ||
261 | + [ select_tag('icon_theme_name', icon_theme_options ), | ||
262 | + change_icon_theme].join("\n") | ||
263 | + end | ||
264 | + | ||
265 | + # Generate a observer to reload a page when a icons theme is selected | ||
266 | + def change_icon_theme | ||
267 | + observe_field( 'icon_theme_name', | ||
268 | + :url => {:action => 'set_default_icon_theme'}, | ||
269 | + :with =>"'icon_theme_name=' + escape(value) + '&object_id=' + escape(#{@ft_config[:owner].id})", | ||
270 | + :complete => "document.location.reload();" | ||
271 | + ) | ||
272 | + end | ||
273 | + | ||
274 | + | ||
40 | end # END OF module Helper | 275 | end # END OF module Helper |
41 | 276 | ||
42 | end # END OF module Editor | 277 | end # END OF module Editor |