alchemy_cms 2.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.travis.yml +1 -1
- data/app/controllers/admin/clipboard_controller.rb +2 -2
- data/app/controllers/admin/elements_controller.rb +37 -25
- data/app/controllers/admin/trash_controller.rb +2 -0
- data/app/helpers/admin/elements_helper.rb +16 -23
- data/app/helpers/alchemy_helper.rb +15 -0
- data/app/models/cell.rb +4 -8
- data/app/models/element.rb +16 -11
- data/app/models/page.rb +24 -26
- data/app/views/admin/elements/_element.html.erb +1 -1
- data/app/views/admin/elements/_new_element_form.html.erb +1 -1
- data/app/views/admin/elements/create.js.erb +7 -3
- data/app/views/admin/elements/destroy.js.erb +1 -1
- data/app/views/admin/elements/fold.js.erb +6 -4
- data/app/views/admin/elements/index.html.erb +2 -2
- data/app/views/admin/elements/trash.js.erb +1 -1
- data/app/views/admin/elements/update.js.erb +2 -2
- data/app/views/admin/trash/index.html.erb +1 -3
- data/assets/javascripts/alchemy.js +14 -3
- data/lib/alchemy/page_layout.rb +0 -3
- data/lib/alchemy/version.rb +1 -1
- data/lib/rails/templates/alchemy.rb +1 -1
- data/locale/de/alchemy.po +5 -5
- data/spec/helpers/elements_helper_spec.rb +1 -1
- data/spec/models/page_spec.rb +22 -1
- metadata +2 -2
    
        data/.travis.yml
    CHANGED
    
    
| @@ -16,7 +16,7 @@ class Admin::ClipboardController < AlchemyController | |
| 16 16 | 
             
                @clipboard = get_clipboard(params[:remarkable_type].tableize)
         | 
| 17 17 | 
             
                @item = params[:remarkable_type].classify.constantize.find(params[:remarkable_id])
         | 
| 18 18 | 
             
                unless @clipboard.include?(params[:remarkable_id])
         | 
| 19 | 
            -
                  @clipboard.push(params[:remarkable_id])
         | 
| 19 | 
            +
                  @clipboard.push({:id => params[:remarkable_id], :action => params[:remove] ? 'cut' : 'copy'})
         | 
| 20 20 | 
             
                end
         | 
| 21 21 | 
             
                respond_to do |format|
         | 
| 22 22 | 
             
                  format.js
         | 
| @@ -28,7 +28,7 @@ class Admin::ClipboardController < AlchemyController | |
| 28 28 | 
             
              def remove
         | 
| 29 29 | 
             
                @clipboard = get_clipboard(params[:remarkable_type].tableize)
         | 
| 30 30 | 
             
                @item = params[:remarkable_type].classify.constantize.find(params[:remarkable_id])
         | 
| 31 | 
            -
                @clipboard. | 
| 31 | 
            +
                @clipboard.delete_if { |i| i[:id] == params[:remarkable_id] }
         | 
| 32 32 | 
             
                respond_to do |format|
         | 
| 33 33 | 
             
                  format.js
         | 
| 34 34 | 
             
                end
         | 
| @@ -10,7 +10,7 @@ class Admin::ElementsController < AlchemyController | |
| 10 10 | 
             
                @page = Page.find(params[:page_id], :include => {:elements => :contents})
         | 
| 11 11 | 
             
                @cells = @page.cells
         | 
| 12 12 | 
             
                if @cells.blank?
         | 
| 13 | 
            -
                  @elements = @page.elements
         | 
| 13 | 
            +
                  @elements = @page.elements.not_trashed
         | 
| 14 14 | 
             
                else
         | 
| 15 15 | 
             
                  @elements = @page.elements_grouped_by_cells
         | 
| 16 16 | 
             
                end
         | 
| @@ -37,28 +37,20 @@ class Admin::ElementsController < AlchemyController | |
| 37 37 | 
             
              end
         | 
| 38 38 |  | 
| 39 39 | 
             
              # Creates a element as discribed in config/alchemy/elements.yml on page via AJAX.
         | 
| 40 | 
            -
              # If a Ferret::FileNotFoundError raises we catch it and rebuilding the index.
         | 
| 41 40 | 
             
              def create
         | 
| 42 | 
            -
             | 
| 43 | 
            -
             | 
| 44 | 
            -
             | 
| 45 | 
            -
             | 
| 46 | 
            -
             | 
| 47 | 
            -
             | 
| 48 | 
            -
             | 
| 49 | 
            -
             | 
| 50 | 
            -
             | 
| 51 | 
            -
             | 
| 52 | 
            -
             | 
| 53 | 
            -
             | 
| 54 | 
            -
                 | 
| 55 | 
            -
                # if page has cells, put element in cell
         | 
| 56 | 
            -
                if @page.has_cells?
         | 
| 57 | 
            -
                  if cell_definition
         | 
| 58 | 
            -
                    @cell = @page.cells.find_or_create_by_name(cell_definition['name'])
         | 
| 59 | 
            -
                  end
         | 
| 60 | 
            -
                  @element.cell = @cell
         | 
| 61 | 
            -
                end
         | 
| 41 | 
            +
            		@page = Page.find(params[:element][:page_id])
         | 
| 42 | 
            +
            		@paste_from_clipboard = !params[:paste_from_clipboard].blank?
         | 
| 43 | 
            +
            		if @paste_from_clipboard
         | 
| 44 | 
            +
            			source_element = Element.find(element_from_clipboard[:id])
         | 
| 45 | 
            +
            			@element = Element.copy(source_element, {:page_id => @page.id})
         | 
| 46 | 
            +
            			if element_from_clipboard[:action] == 'cut'
         | 
| 47 | 
            +
            				source_element.destroy
         | 
| 48 | 
            +
            				@clipboard.delete_if { |i| i[:id].to_i == source_element.id }
         | 
| 49 | 
            +
            			end
         | 
| 50 | 
            +
            		else
         | 
| 51 | 
            +
            			@element = Element.new_from_scratch(params[:element])
         | 
| 52 | 
            +
            		end
         | 
| 53 | 
            +
                put_element_in_cell if @page.can_have_cells?
         | 
| 62 54 | 
             
                @element.page = @page
         | 
| 63 55 | 
             
                if @element.save
         | 
| 64 56 | 
             
                  render :action => :create
         | 
| @@ -113,11 +105,12 @@ class Admin::ElementsController < AlchemyController | |
| 113 105 | 
             
              end
         | 
| 114 106 |  | 
| 115 107 | 
             
              def order
         | 
| 116 | 
            -
                page = Page.find(params[:page_id])
         | 
| 117 108 | 
             
                params[:element_ids].each do |element_id|
         | 
| 118 109 | 
             
                  element = Element.find(element_id)
         | 
| 119 110 | 
             
                  if element.trashed?
         | 
| 120 | 
            -
             | 
| 111 | 
            +
            				element.page_id = params[:page_id]
         | 
| 112 | 
            +
            				element.cell_id = params[:cell_id] if params[:cell_id]
         | 
| 113 | 
            +
            				element.position = 1
         | 
| 121 114 | 
             
                  end
         | 
| 122 115 | 
             
                  element.move_to_bottom
         | 
| 123 116 | 
             
                end
         | 
| @@ -129,9 +122,28 @@ class Admin::ElementsController < AlchemyController | |
| 129 122 | 
             
                @element = Element.find(params[:id])
         | 
| 130 123 | 
             
                @page = @element.page
         | 
| 131 124 | 
             
                @element.folded = !@element.folded
         | 
| 132 | 
            -
             | 
| 125 | 
            +
            		@element.save
         | 
| 133 126 | 
             
              rescue Exception => e
         | 
| 134 127 | 
             
                exception_handler(e)
         | 
| 135 128 | 
             
              end
         | 
| 136 129 |  | 
| 130 | 
            +
            private
         | 
| 131 | 
            +
             | 
| 132 | 
            +
            	def put_element_in_cell
         | 
| 133 | 
            +
            		element_with_cell_name = @paste_from_clipboard ? params[:paste_from_clipboard] : params[:element][:name]
         | 
| 134 | 
            +
            		cell_definition = Cell.definition_for(element_with_cell_name.split('#').last) if !element_with_cell_name.blank?
         | 
| 135 | 
            +
            		if cell_definition
         | 
| 136 | 
            +
            			@cell = @page.cells.find_or_create_by_name(cell_definition['name'])
         | 
| 137 | 
            +
            			@element.cell = @cell
         | 
| 138 | 
            +
            			return true
         | 
| 139 | 
            +
            		else
         | 
| 140 | 
            +
            			return false
         | 
| 141 | 
            +
            		end
         | 
| 142 | 
            +
            	end
         | 
| 143 | 
            +
             | 
| 144 | 
            +
            	def element_from_clipboard
         | 
| 145 | 
            +
            		@clipboard = get_clipboard(:elements)
         | 
| 146 | 
            +
            		@clipboard.detect { |i| i[:id].to_i == params[:paste_from_clipboard].to_i }
         | 
| 147 | 
            +
            	end
         | 
| 148 | 
            +
             | 
| 137 149 | 
             
            end
         | 
| @@ -10,6 +10,8 @@ class Admin::TrashController < AlchemyController | |
| 10 10 | 
             
                @elements = Element.trashed
         | 
| 11 11 | 
             
                @page = Page.find_by_id(params[:page_id])
         | 
| 12 12 | 
             
                @allowed_elements = Element.all_for_page(@page)
         | 
| 13 | 
            +
            		@draggable_trash_items = {}
         | 
| 14 | 
            +
            		@elements.each { |e| @draggable_trash_items["element_#{e.id}"] = e.belonging_cellnames(@page) }
         | 
| 13 15 | 
             
                render :layout => false
         | 
| 14 16 | 
             
              rescue Exception => e
         | 
| 15 17 | 
             
                exception_handler(e)
         | 
| @@ -56,21 +56,6 @@ module Admin::ElementsHelper | |
| 56 56 | 
             
                )
         | 
| 57 57 | 
             
              end
         | 
| 58 58 |  | 
| 59 | 
            -
            	def clipboard_select_tag(items, html_options = {})
         | 
| 60 | 
            -
                options = [[_('Please choose'), ""]]
         | 
| 61 | 
            -
                items.each do |item|
         | 
| 62 | 
            -
                  options << [item.class.to_s == 'Element' ? item.display_name_with_preview_text : item.name, item.id]
         | 
| 63 | 
            -
                end
         | 
| 64 | 
            -
                select_tag(
         | 
| 65 | 
            -
                  'paste_from_clipboard',
         | 
| 66 | 
            -
                  @page.has_cells? ? grouped_elements_for_select(items, :id) : options_for_select(options),
         | 
| 67 | 
            -
                  {
         | 
| 68 | 
            -
                    :class => html_options[:class] || 'very_long',
         | 
| 69 | 
            -
                    :style => html_options[:style]
         | 
| 70 | 
            -
                  }
         | 
| 71 | 
            -
                )
         | 
| 72 | 
            -
              end
         | 
| 73 | 
            -
              
         | 
| 74 59 | 
             
              # Returns all elements that could be placed on that page because of the pages layout.
         | 
| 75 60 | 
             
              # The elements are returned as an array to be used in alchemy_selectbox form builder.
         | 
| 76 61 | 
             
              def elements_for_select(elements)
         | 
| @@ -92,23 +77,31 @@ module Admin::ElementsHelper | |
| 92 77 | 
             
                  celled_elements += cell_elements
         | 
| 93 78 | 
             
                  optgroup_label = Cell.translated_label_for(cell['name'])
         | 
| 94 79 | 
             
                  options[optgroup_label] = cell_elements.map do |e|
         | 
| 95 | 
            -
            				 | 
| 96 | 
            -
            					I18n.t("alchemy.element_names.#{e['name']}", :default => e['name'].capitalize),
         | 
| 97 | 
            -
            					(e.class.name == 'Element' ? e.send(object_method).to_s : e[object_method]) + "##{cell['name']}"
         | 
| 98 | 
            -
            				]
         | 
| 80 | 
            +
            				element_array_for_options(e, object_method, cell)
         | 
| 99 81 | 
             
            			end
         | 
| 100 82 | 
             
                end
         | 
| 101 83 | 
             
                other_elements = elements - celled_elements
         | 
| 102 84 | 
             
                unless other_elements.blank?
         | 
| 103 85 | 
             
                  optgroup_label = _('other Elements')
         | 
| 104 86 | 
             
                  options[optgroup_label] = other_elements.map do |e|
         | 
| 105 | 
            -
            				 | 
| 106 | 
            -
            					I18n.t("alchemy.element_names.#{e['name']}", :default => e['name'].capitalize),
         | 
| 107 | 
            -
            					e.class.name == 'Element' ? e.send(object_method) : e[object_method]
         | 
| 108 | 
            -
            				]
         | 
| 87 | 
            +
            				element_array_for_options(e, object_method)
         | 
| 109 88 | 
             
            			end
         | 
| 110 89 | 
             
                end
         | 
| 111 90 | 
             
                return grouped_options_for_select(options)
         | 
| 112 91 | 
             
              end
         | 
| 113 92 |  | 
| 93 | 
            +
            	def element_array_for_options(e, object_method, cell = nil)
         | 
| 94 | 
            +
            		if e.class.name == 'Element'
         | 
| 95 | 
            +
            			[
         | 
| 96 | 
            +
            				e.display_name_with_preview_text,
         | 
| 97 | 
            +
            				e.send(object_method).to_s + (cell ? "##{cell['name']}" : "")
         | 
| 98 | 
            +
            			]
         | 
| 99 | 
            +
            		else
         | 
| 100 | 
            +
            			[
         | 
| 101 | 
            +
            				I18n.t("alchemy.element_names.#{e['name']}", :default => e['name'].capitalize),
         | 
| 102 | 
            +
            				e[object_method] + (cell ? "##{cell['name']}" : "")
         | 
| 103 | 
            +
            			]
         | 
| 104 | 
            +
            		end
         | 
| 105 | 
            +
            	end
         | 
| 106 | 
            +
             | 
| 114 107 | 
             
            end
         | 
| @@ -339,4 +339,19 @@ module AlchemyHelper | |
| 339 339 | 
             
                end
         | 
| 340 340 | 
             
              end
         | 
| 341 341 |  | 
| 342 | 
            +
            	def clipboard_select_tag(items, html_options = {})
         | 
| 343 | 
            +
                options = [[_('Please choose'), ""]]
         | 
| 344 | 
            +
                items.each do |item|
         | 
| 345 | 
            +
                  options << [item.class.to_s == 'Element' ? item.display_name_with_preview_text : item.name, item.id]
         | 
| 346 | 
            +
                end
         | 
| 347 | 
            +
                select_tag(
         | 
| 348 | 
            +
                  'paste_from_clipboard',
         | 
| 349 | 
            +
                  !@page.new_record? && @page.can_have_cells? ? grouped_elements_for_select(items, :id) : options_for_select(options),
         | 
| 350 | 
            +
                  {
         | 
| 351 | 
            +
                    :class => html_options[:class] || 'very_long',
         | 
| 352 | 
            +
                    :style => html_options[:style]
         | 
| 353 | 
            +
                  }
         | 
| 354 | 
            +
                )
         | 
| 355 | 
            +
              end
         | 
| 356 | 
            +
             | 
| 342 357 | 
             
            end
         | 
    
        data/app/models/cell.rb
    CHANGED
    
    | @@ -37,19 +37,15 @@ class Cell < ActiveRecord::Base | |
| 37 37 | 
             
                Element.all_definitions_for(element_names.uniq)
         | 
| 38 38 | 
             
              end
         | 
| 39 39 |  | 
| 40 | 
            -
              def self.definition_for_element(element_name)
         | 
| 41 | 
            -
                definitions_for_element(element_name).first
         | 
| 42 | 
            -
              end
         | 
| 43 | 
            -
              
         | 
| 44 40 | 
             
              def self.definitions_for_element(element_name)
         | 
| 45 41 | 
             
                return [] if definitions.blank?
         | 
| 46 42 | 
             
                definitions.select { |d| d['elements'].include?(element_name) }
         | 
| 47 43 | 
             
              end
         | 
| 48 44 |  | 
| 49 | 
            -
              def self. | 
| 50 | 
            -
                 | 
| 51 | 
            -
                return nil if  | 
| 52 | 
            -
                 | 
| 45 | 
            +
              def self.names_for_element(element_name)
         | 
| 46 | 
            +
                definitions = definitions_for_element(element_name)
         | 
| 47 | 
            +
                return nil if definitions.blank?
         | 
| 48 | 
            +
                definitions.collect { |d| d['name'] }
         | 
| 53 49 | 
             
              end
         | 
| 54 50 |  | 
| 55 51 | 
             
              def name_for_label
         | 
    
        data/app/models/element.rb
    CHANGED
    
    | @@ -17,6 +17,7 @@ class Element < ActiveRecord::Base | |
| 17 17 |  | 
| 18 18 | 
             
              # TODO: add a trashed column to elements table
         | 
| 19 19 | 
             
              scope :trashed, where(:page_id => nil).order('updated_at DESC')
         | 
| 20 | 
            +
              scope :not_trashed, where('`elements`.`page_id` IS NOT NULL')
         | 
| 20 21 | 
             
              scope :published, where(:public => true)
         | 
| 21 22 | 
             
              scope :named, lambda { |names| where(arel_table[:name].in(names)) }
         | 
| 22 23 | 
             
              scope :excluded, lambda { |names| where(arel_table[:name].not_in(names)) }
         | 
| @@ -52,11 +53,15 @@ class Element < ActiveRecord::Base | |
| 52 53 |  | 
| 53 54 | 
             
              # nullifies the page_id aka. trashs it.
         | 
| 54 55 | 
             
              def trash
         | 
| 55 | 
            -
             | 
| 56 | 
            -
             | 
| 57 | 
            -
             | 
| 58 | 
            -
             | 
| 59 | 
            -
             | 
| 56 | 
            +
            		self.attributes = {
         | 
| 57 | 
            +
            			:page_id => nil,
         | 
| 58 | 
            +
            			:cell_id => nil,
         | 
| 59 | 
            +
            			:folded => true,
         | 
| 60 | 
            +
            			:public => false
         | 
| 61 | 
            +
            		}
         | 
| 62 | 
            +
            		# If we validate the element, it will not get trashed if another element with same postion is already trashed.
         | 
| 63 | 
            +
            		# And we cannot remove the position, because it will not be reordered in the list if its position is nil.
         | 
| 64 | 
            +
            		self.remove_from_list
         | 
| 60 65 | 
             
              end
         | 
| 61 66 |  | 
| 62 67 | 
             
              def trashed?
         | 
| @@ -286,7 +291,7 @@ class Element < ActiveRecord::Base | |
| 286 291 |  | 
| 287 292 | 
             
              def self.all_from_clipboard(clipboard)
         | 
| 288 293 | 
             
                return [] if clipboard.nil?
         | 
| 289 | 
            -
                self.find_all_by_id(clipboard)
         | 
| 294 | 
            +
                self.find_all_by_id(clipboard.collect { |i| i[:id] })
         | 
| 290 295 | 
             
              end
         | 
| 291 296 |  | 
| 292 297 | 
             
              def self.all_from_clipboard_for_page(clipboard, page)
         | 
| @@ -399,12 +404,12 @@ class Element < ActiveRecord::Base | |
| 399 404 | 
             
              alias_method :richtext_contents, :rtf_contents
         | 
| 400 405 |  | 
| 401 406 | 
             
              # The name of the cell the element could be placed in.
         | 
| 402 | 
            -
              def  | 
| 403 | 
            -
                 | 
| 404 | 
            -
                if  | 
| 405 | 
            -
                  return 'for_other_elements' | 
| 407 | 
            +
              def belonging_cellnames(page)
         | 
| 408 | 
            +
                cellnames = Cell.names_for_element(name)
         | 
| 409 | 
            +
                if cellnames.blank? || !page.has_cells?
         | 
| 410 | 
            +
                  return ['for_other_elements']
         | 
| 406 411 | 
             
                else
         | 
| 407 | 
            -
                  return  | 
| 412 | 
            +
                  return cellnames
         | 
| 408 413 | 
             
                end
         | 
| 409 414 | 
             
              end
         | 
| 410 415 |  | 
    
        data/app/models/page.rb
    CHANGED
    
    | @@ -111,8 +111,8 @@ class Page < ActiveRecord::Base | |
| 111 111 |  | 
| 112 112 | 
             
              def elements_grouped_by_cells
         | 
| 113 113 | 
             
                group = ActiveSupport::OrderedHash.new
         | 
| 114 | 
            -
                cells.each { |cell| group[cell] = cell.elements }
         | 
| 115 | 
            -
                group[Cell.new({:name => 'for_other_elements'})] = elements. | 
| 114 | 
            +
                cells.each { |cell| group[cell] = cell.elements.not_trashed }
         | 
| 115 | 
            +
                group[Cell.new({:name => 'for_other_elements'})] = elements.not_trashed.where(:cell_id => nil)
         | 
| 116 116 | 
             
                return group
         | 
| 117 117 | 
             
              end
         | 
| 118 118 |  | 
| @@ -302,17 +302,18 @@ class Page < ActiveRecord::Base | |
| 302 302 | 
             
                end
         | 
| 303 303 | 
             
              end
         | 
| 304 304 |  | 
| 305 | 
            -
             | 
| 306 | 
            -
             | 
| 307 | 
            -
             | 
| 308 | 
            -
             | 
| 309 | 
            -
             | 
| 310 | 
            -
             | 
| 311 | 
            -
             | 
| 312 | 
            -
             | 
| 313 | 
            -
             | 
| 314 | 
            -
             | 
| 315 | 
            -
             | 
| 305 | 
            +
            	# Returns the self#page_layout description from config/alchemy/page_layouts.yml file.
         | 
| 306 | 
            +
            	def layout_description
         | 
| 307 | 
            +
            		description = Alchemy::PageLayout.get(self.page_layout)
         | 
| 308 | 
            +
            		if self.root?
         | 
| 309 | 
            +
            			return {}
         | 
| 310 | 
            +
            		elsif description.nil?
         | 
| 311 | 
            +
            			raise "Description could not be found for page layout named #{self.page_layout}. Please check page_layouts.yml file."
         | 
| 312 | 
            +
            		else
         | 
| 313 | 
            +
            			description
         | 
| 314 | 
            +
            		end
         | 
| 315 | 
            +
            	end
         | 
| 316 | 
            +
            	alias_method :definition, :layout_description
         | 
| 316 317 |  | 
| 317 318 | 
             
              # Returns translated name of the pages page_layout value.
         | 
| 318 319 | 
             
              # Page layout names are defined inside the config/alchemy/page_layouts.yml file.
         | 
| @@ -338,16 +339,12 @@ class Page < ActiveRecord::Base | |
| 338 339 | 
             
              end
         | 
| 339 340 |  | 
| 340 341 | 
             
              def contains_feed?
         | 
| 341 | 
            -
                 | 
| 342 | 
            -
                return false if desc.blank?
         | 
| 343 | 
            -
                desc["feed"]
         | 
| 342 | 
            +
                definition["feed"]
         | 
| 344 343 | 
             
              end
         | 
| 345 344 |  | 
| 346 345 | 
             
              # Returns true or false if the pages layout_description for config/alchemy/page_layouts.yml contains redirects_to_external: true
         | 
| 347 346 | 
             
              def redirects_to_external?
         | 
| 348 | 
            -
                 | 
| 349 | 
            -
                return false if desc.blank?
         | 
| 350 | 
            -
                desc["redirects_to_external"]
         | 
| 347 | 
            +
                definition["redirects_to_external"]
         | 
| 351 348 | 
             
              end
         | 
| 352 349 |  | 
| 353 350 | 
             
              # Returns an array of all pages currently locked by user
         | 
| @@ -432,7 +429,7 @@ class Page < ActiveRecord::Base | |
| 432 429 |  | 
| 433 430 | 
             
              def self.all_from_clipboard(clipboard)
         | 
| 434 431 | 
             
                return [] if clipboard.blank?
         | 
| 435 | 
            -
                self.find_all_by_id(clipboard)
         | 
| 432 | 
            +
                self.find_all_by_id(clipboard.collect { |i| i[:id] })
         | 
| 436 433 | 
             
              end
         | 
| 437 434 |  | 
| 438 435 | 
             
              def self.all_from_clipboard_for_select(clipboard, language_id, layoutpage = false)
         | 
| @@ -459,11 +456,13 @@ class Page < ActiveRecord::Base | |
| 459 456 | 
             
              end
         | 
| 460 457 |  | 
| 461 458 | 
             
              # Returns true or false if the page has a page_layout that has cells.
         | 
| 462 | 
            -
              def  | 
| 463 | 
            -
                 | 
| 464 | 
            -
                return false if pagelayout.blank?
         | 
| 465 | 
            -
                !pagelayout['cells'].blank?
         | 
| 459 | 
            +
              def can_have_cells?
         | 
| 460 | 
            +
                !definition['cells'].blank?
         | 
| 466 461 | 
             
              end
         | 
| 462 | 
            +
             | 
| 463 | 
            +
            	def has_cells?
         | 
| 464 | 
            +
            		cells.any?
         | 
| 465 | 
            +
            	end
         | 
| 467 466 |  | 
| 468 467 | 
             
              def self.link_target_options
         | 
| 469 468 | 
             
                options = [
         | 
| @@ -522,7 +521,6 @@ private | |
| 522 521 | 
             
              # Looks in the layout_descripion, if there are elements to autogenerate.
         | 
| 523 522 | 
             
              # If so, it generates them.
         | 
| 524 523 | 
             
              def autogenerate_elements
         | 
| 525 | 
            -
                return true if self.layout_description.blank?
         | 
| 526 524 | 
             
                elements = self.layout_description["autogenerate"]
         | 
| 527 525 | 
             
                unless (elements.blank?)
         | 
| 528 526 | 
             
                  elements.each do |element|
         | 
| @@ -538,7 +536,7 @@ private | |
| 538 536 | 
             
              end
         | 
| 539 537 |  | 
| 540 538 | 
             
              def create_cells
         | 
| 541 | 
            -
                return  | 
| 539 | 
            +
                return false if !can_have_cells?
         | 
| 542 540 | 
             
                definition['cells'].each do |cellname|
         | 
| 543 541 | 
             
                  cells.create({:name => cellname})
         | 
| 544 542 | 
             
                end
         | 
| @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            <div class="element_editor<%= element.folded ? ' folded' : '' %> <%= defined?(draggable) && !draggable ? 'not-draggable' : 'draggable'  %>" id="element_<%= element.id %>">
         | 
| 1 | 
            +
            <div class="element_editor<%= element.folded ? ' folded' : '' %> <%= defined?(draggable) && !draggable ? 'not-draggable' : 'draggable'  %>" id="element_<%= element.id %>" data-element-id="<%= element.id %>">
         | 
| 2 2 | 
             
              <%= render :partial => "admin/elements/element_head", :locals => {:element => element} %>
         | 
| 3 3 | 
             
              <%- if !element.folded? -%>
         | 
| 4 4 | 
             
                <%= form_for(
         | 
| @@ -12,7 +12,7 @@ | |
| 12 12 | 
             
                <span style="margin-right: 16px"><%= _("element_of_type") %>:</span>
         | 
| 13 13 | 
             
                <%= form.select(
         | 
| 14 14 | 
             
                  'name',
         | 
| 15 | 
            -
                  @page. | 
| 15 | 
            +
                  @page.can_have_cells? ? grouped_elements_for_select(@elements) : elements_for_select(@elements),
         | 
| 16 16 | 
             
                  {:prompt => _('select_element')},
         | 
| 17 17 | 
             
                  {:class => 'very_long'}
         | 
| 18 18 | 
             
                ) -%>
         | 
| @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            (function($) {
         | 
| 2 2 |  | 
| 3 | 
            -
              <%- if @page. | 
| 3 | 
            +
              <%- if @page.can_have_cells? -%>
         | 
| 4 4 | 
             
              Alchemy.selectOrCreateCellTab('<%= @cell.nil? ? "for_other_elements" : @cell.name -%>', '<%= @cell.nil? ? _("other Elements") : @cell.name_for_label -%>');
         | 
| 5 5 | 
             
              <%- end -%>
         | 
| 6 6 | 
             
              $('#cell_<%= @cell.nil? ? "for_other_elements" : @cell.name -%>').append('<%= escape_javascript render(:partial => "element", :object => @element, :locals => {:draggable => true}) -%>');
         | 
| @@ -12,9 +12,13 @@ | |
| 12 12 | 
             
              <%- end -%>
         | 
| 13 13 | 
             
              Alchemy.PreviewWindow.refresh();
         | 
| 14 14 | 
             
              Alchemy.ElementEditorSelector.init();
         | 
| 15 | 
            -
              $(' | 
| 15 | 
            +
              $('.element_editor[data-element-id="<%= @element.id -%>"]').trigger('Alchemy.SelectElementEditor');
         | 
| 16 16 | 
             
              Alchemy.ElementDirtyObserver('#element_<%= @element.id -%>');
         | 
| 17 17 | 
             
              Alchemy.SelectBox('#element_<%= @element.id -%> select');
         | 
| 18 18 | 
             
              Alchemy.ButtonObserver('#element_<%= @element.id -%> button.button');
         | 
| 19 | 
            -
             | 
| 19 | 
            +
             | 
| 20 | 
            +
              <%- if @clipboard.blank? -%>
         | 
| 21 | 
            +
            	$('#clipboard_button .icon.clipboard').removeClass('full');
         | 
| 22 | 
            +
            	<%- end -%>
         | 
| 23 | 
            +
             | 
| 20 24 | 
             
            })(jQuery);
         | 
| @@ -6,10 +6,12 @@ | |
| 6 6 |  | 
| 7 7 | 
             
              <%- else -%>
         | 
| 8 8 |  | 
| 9 | 
            -
              $(' | 
| 10 | 
            -
              $('#element_area').sortable('refresh');
         | 
| 9 | 
            +
              $('.element_editor[data-element-id="<%= @element.id -%>"]').replaceWith('<%= escape_javascript render(:partial => "element", :object => @element) -%>');
         | 
| 10 | 
            +
              $('#element_area .sortable_cell').sortable('refresh');
         | 
| 11 11 | 
             
              Alchemy.ElementEditorSelector.bindEvent('#element_<%= @element.id -%>');
         | 
| 12 | 
            -
             | 
| 12 | 
            +
             | 
| 13 | 
            +
              $('.element_editor[data-element-id="<%= @element.id -%>"]');
         | 
| 14 | 
            +
             | 
| 13 15 | 
             
              <%- if @element.folded -%>
         | 
| 14 16 |  | 
| 15 17 | 
             
                <%- @element.rtf_contents.each do |content| -%>
         | 
| @@ -22,7 +24,7 @@ | |
| 22 24 |  | 
| 23 25 | 
             
              <%- else -%>
         | 
| 24 26 |  | 
| 25 | 
            -
                $(' | 
| 27 | 
            +
                $('.element_editor[data-element-id="<%= @element.id -%>"]').trigger('Alchemy.SelectElementEditor');
         | 
| 26 28 | 
             
                Alchemy.SelectBox('#element_<%= @element.id -%> select');
         | 
| 27 29 |  | 
| 28 30 | 
             
                <%- @element.rtf_contents.each do |content| -%>
         | 
| @@ -11,13 +11,13 @@ | |
| 11 11 | 
             
                  <%- end -%>
         | 
| 12 12 | 
             
                </ul>
         | 
| 13 13 | 
             
                <%- @elements.each do |cell, elements| -%>
         | 
| 14 | 
            -
                <div id="cell_<%= cell.name %>" class="sortable_cell">
         | 
| 14 | 
            +
                <div id="cell_<%= cell.name %>" class="sortable_cell <%= cell.name %>_cell" data-cell-id="<%= cell.id %>">
         | 
| 15 15 | 
             
                	<%= render :partial => 'element', :collection => elements, :locals => {:draggable => true} %>
         | 
| 16 16 | 
             
                </div>
         | 
| 17 17 | 
             
                <%- end -%>
         | 
| 18 18 | 
             
              </div>
         | 
| 19 19 | 
             
              <%- else -%>
         | 
| 20 | 
            -
              <div class="sortable_cell" id="cell_for_other_elements">
         | 
| 20 | 
            +
              <div class="sortable_cell for_other_elements_cell" id="cell_for_other_elements">
         | 
| 21 21 | 
             
                <%= render :partial => @elements, :locals => {:draggable => true} %>
         | 
| 22 22 | 
             
              </div>
         | 
| 23 23 | 
             
              <%- end -%>
         | 
| @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            (function($) {
         | 
| 2 2 |  | 
| 3 | 
            -
              $(" | 
| 3 | 
            +
              $('.element_editor[data-element-id="<%= @element.id -%>"]').remove();
         | 
| 4 4 | 
             
              Alchemy.growl('<%= _("Element trashed") -%>');
         | 
| 5 5 | 
             
              $('#element_area').sortable('refresh');
         | 
| 6 6 | 
             
              Alchemy.refreshTrashWindow(<%= @page_id -%>);
         | 
| @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            (function($) {
         | 
| 2 2 | 
             
              $('div#element_<%= @element.id -%> div.element_handle span.icon').removeClass('element_<%= @element.public? ? "draft" : "public" -%>').addClass('element_<%= @element.public? ? "public" : "draft" -%>');
         | 
| 3 | 
            -
              $(' | 
| 4 | 
            -
              $(' | 
| 3 | 
            +
              $('.element_editor[data-element-id="<%= @element.id -%>"] .element_heading .preview_text_element_name').text('<%= @element.display_name -%>');
         | 
| 4 | 
            +
              $('.element_editor[data-element-id="<%= @element.id -%>"] .element_heading .preview_text_quote').text('<%= escape_javascript(@element.preview_text) -%>');
         | 
| 5 5 | 
             
              $('div.content_editor').removeClass('validation_failed');
         | 
| 6 6 | 
             
              $("#element_<%= @element.id -%>_errors").hide();
         | 
| 7 7 | 
             
              Alchemy.setElementSaved('#element_<%= @element.id -%>');
         | 
| @@ -19,7 +19,5 @@ | |
| 19 19 | 
             
            	<%- end -%>
         | 
| 20 20 | 
             
            </div>
         | 
| 21 21 | 
             
            <script type="text/javascript" charset="utf-8">
         | 
| 22 | 
            -
            	 | 
| 23 | 
            -
            	<%- @elements.each { |e| cells_items["element_#{e.id}"] = e.belonging_cellname };  -%>
         | 
| 24 | 
            -
            	Alchemy.DraggableTrashItems(<%= cells_items.to_json.html_safe %>);
         | 
| 22 | 
            +
            	Alchemy.DraggableTrashItems(<%= @draggable_trash_items.to_json.html_safe %>);
         | 
| 25 23 | 
             
            </script>
         | 
| @@ -549,8 +549,10 @@ if (typeof(Alchemy) === 'undefined') { | |
| 549 549 | 
             
            				tolerance: 'pointer',
         | 
| 550 550 | 
             
            				update: function(event, ui) {
         | 
| 551 551 | 
             
            					var ids = $.map($(event.target).children(), function(child) {
         | 
| 552 | 
            -
            						return child. | 
| 552 | 
            +
            						return $(child).attr('data-element-id');
         | 
| 553 553 | 
             
            					});
         | 
| 554 | 
            +
            					var params_string = '';
         | 
| 555 | 
            +
            					var cell_id = $(event.target).attr('data-cell-id');
         | 
| 554 556 | 
             
            					// Is the trash window open?
         | 
| 555 557 | 
             
            					if ($('#alchemyTrashWindow').length > 0) {
         | 
| 556 558 | 
             
            						// updating the trash icon
         | 
| @@ -560,10 +562,14 @@ if (typeof(Alchemy) === 'undefined') { | |
| 560 562 | 
             
            						}
         | 
| 561 563 | 
             
            					}
         | 
| 562 564 | 
             
            					$(event.target).css("cursor", "progress");
         | 
| 565 | 
            +
            					params_string = "page_id=" + page_id + "&authenticity_token=" + encodeURIComponent(form_token) + "&" + $.param({element_ids: ids});
         | 
| 566 | 
            +
            					if (cell_id) {
         | 
| 567 | 
            +
            						params_string += "&cell_id=" + cell_id;
         | 
| 568 | 
            +
            					}
         | 
| 563 569 | 
             
            					$.ajax({
         | 
| 564 570 | 
             
            						url: '/admin/elements/order',
         | 
| 565 571 | 
             
            						type: 'POST',
         | 
| 566 | 
            -
            						data:  | 
| 572 | 
            +
            						data: params_string,
         | 
| 567 573 | 
             
            						complete: function () {
         | 
| 568 574 | 
             
            							$(event.target).css("cursor", "auto");
         | 
| 569 575 | 
             
            							Alchemy.refreshTrashWindow(page_id);
         | 
| @@ -788,10 +794,15 @@ if (typeof(Alchemy) === 'undefined') { | |
| 788 794 |  | 
| 789 795 | 
             
            		DraggableTrashItems: function (items_n_cells) {
         | 
| 790 796 | 
             
            			$("#trash_items div.draggable").each(function () {
         | 
| 797 | 
            +
            				var cell_classes = '';
         | 
| 798 | 
            +
            				var cell_names = items_n_cells[this.id];
         | 
| 799 | 
            +
            				$.each(cell_names, function (i) {
         | 
| 800 | 
            +
            					cell_classes += '.' + this + '_cell' + ', ';
         | 
| 801 | 
            +
            				});
         | 
| 791 802 | 
             
            				$(this).draggable({
         | 
| 792 803 | 
             
            					helper: 'clone',
         | 
| 793 804 | 
             
            					iframeFix: 'iframe#alchemyPreviewWindow',
         | 
| 794 | 
            -
            					connectToSortable:  | 
| 805 | 
            +
            					connectToSortable: cell_classes,
         | 
| 795 806 | 
             
            					start: function(event, ui) { 
         | 
| 796 807 | 
             
            						$(this).hide().addClass('dragged');
         | 
| 797 808 | 
             
            						ui.helper.css({width: '300px'});
         | 
    
        data/lib/alchemy/page_layout.rb
    CHANGED
    
    | @@ -30,9 +30,6 @@ module Alchemy | |
| 30 30 | 
             
                # Returns the page_layout description found by name in page_layouts.yml
         | 
| 31 31 | 
             
                def self.get(name = "")
         | 
| 32 32 | 
             
                  self.get_layouts.detect{ |a| a["name"].downcase == name.downcase }
         | 
| 33 | 
            -
                rescue Exception => e
         | 
| 34 | 
            -
                  Rails.logger.error("++++++ ERROR\n#{e}")
         | 
| 35 | 
            -
                  return nil
         | 
| 36 33 | 
             
                end
         | 
| 37 34 |  | 
| 38 35 | 
             
                # Returns page layouts ready for Rails' select form helper.
         | 
    
        data/lib/alchemy/version.rb
    CHANGED
    
    
    
        data/locale/de/alchemy.po
    CHANGED
    
    | @@ -71,7 +71,7 @@ msgstr "Seite wählen" | |
| 71 71 |  | 
| 72 72 | 
             
            #: app/controllers/admin/trash_controller.rb:15
         | 
| 73 73 | 
             
            msgid "Cleared trash"
         | 
| 74 | 
            -
            msgstr "Der Papierkorb wurde  | 
| 74 | 
            +
            msgstr "Der Papierkorb wurde geleert"
         | 
| 75 75 |  | 
| 76 76 | 
             
            #: app/views/admin/pictures/_picture.html.erb:35
         | 
| 77 77 | 
             
            msgid "Click to rename"
         | 
| @@ -106,11 +106,11 @@ msgstr "Bild löschen" | |
| 106 106 |  | 
| 107 107 | 
             
            #: app/views/admin/clipboard/index.html.erb:15
         | 
| 108 108 | 
             
            msgid "Do you really want to clear the clipboard?"
         | 
| 109 | 
            -
            msgstr "Wollen Sie die Zwischenablage wirklich  | 
| 109 | 
            +
            msgstr "Wollen Sie die Zwischenablage wirklich leeren?"
         | 
| 110 110 |  | 
| 111 111 | 
             
            #: app/views/admin/trash/index.html.erb:16
         | 
| 112 112 | 
             
            msgid "Do you really want to clear the trash?"
         | 
| 113 | 
            -
            msgstr "Wollen Sie den Papierkorb wirklich  | 
| 113 | 
            +
            msgstr "Wollen Sie den Papierkorb wirklich leeren?"
         | 
| 114 114 |  | 
| 115 115 | 
             
            #: app/views/essences/_essence_text_editor.html.erb:50
         | 
| 116 116 | 
             
            msgid "Do you really want to delete this content?"
         | 
| @@ -932,11 +932,11 @@ msgstr "Bitte wählen Sie eine Datei zum Verlinken aus." | |
| 932 932 |  | 
| 933 933 | 
             
            #: app/views/admin/clipboard/index.html.erb:15
         | 
| 934 934 | 
             
            msgid "clear clipboard"
         | 
| 935 | 
            -
            msgstr "Zwischenablage  | 
| 935 | 
            +
            msgstr "Zwischenablage leeren"
         | 
| 936 936 |  | 
| 937 937 | 
             
            #: app/views/admin/trash/index.html.erb:16
         | 
| 938 938 | 
             
            msgid "clear trash"
         | 
| 939 | 
            -
            msgstr "Papierkorb  | 
| 939 | 
            +
            msgstr "Papierkorb leeren"
         | 
| 940 940 |  | 
| 941 941 | 
             
            #: app/helpers/alchemy_helper.rb:790
         | 
| 942 942 | 
             
            #: app/views/admin/partials/_remote_search_form.html.erb:30
         | 
| @@ -23,7 +23,7 @@ describe ElementsHelper do | |
| 23 23 | 
             
            	  helper.element_dom_id(@element).should == "#{@element.name}_#{@element.id}"
         | 
| 24 24 | 
             
            	end
         | 
| 25 25 |  | 
| 26 | 
            -
            	it "should render elements for a cell" | 
| 26 | 
            +
            	it "should render elements for a cell" do
         | 
| 27 27 | 
             
            		cell = Factory(:cell)
         | 
| 28 28 | 
             
            		Factory(:element, :cell_id => cell.id)
         | 
| 29 29 | 
             
            		helper.stub(:configuration).and_return(true)
         | 
    
        data/spec/models/page_spec.rb
    CHANGED
    
    | @@ -7,7 +7,28 @@ describe Page do | |
| 7 7 | 
             
            	before(:each) do
         | 
| 8 8 | 
             
            		@rootpage = Page.rootpage
         | 
| 9 9 | 
             
            		@language = Language.get_default
         | 
| 10 | 
            -
            		@language_root = Factory(:page, :parent_id => @rootpage.id, :language => @language, :language_root => true)
         | 
| 10 | 
            +
            		@language_root = Factory(:page, :parent_id => @rootpage.id, :language => @language, :language_root => true, :page_layout => 'intro')
         | 
| 11 | 
            +
            	end
         | 
| 12 | 
            +
            	
         | 
| 13 | 
            +
            	describe ".layout_description" do
         | 
| 14 | 
            +
            		
         | 
| 15 | 
            +
            		context "for a language root page" do
         | 
| 16 | 
            +
            			
         | 
| 17 | 
            +
            			it "should return the page layout description as hash" do
         | 
| 18 | 
            +
            				@language_root.layout_description['name'].should == 'intro'
         | 
| 19 | 
            +
            			end
         | 
| 20 | 
            +
            			
         | 
| 21 | 
            +
            			it "should return an empty hash for root page" do
         | 
| 22 | 
            +
            				@rootpage.layout_description.should == {}
         | 
| 23 | 
            +
            			end
         | 
| 24 | 
            +
            			
         | 
| 25 | 
            +
            		end
         | 
| 26 | 
            +
            		
         | 
| 27 | 
            +
            		it "should raise Exception if the page_layout could not be found in the definition file" do
         | 
| 28 | 
            +
            			@page = mock(:page, :page_layout => 'foo')
         | 
| 29 | 
            +
            			expect { @page.layout_description }.to raise_error
         | 
| 30 | 
            +
            		end
         | 
| 31 | 
            +
            		
         | 
| 11 32 | 
             
            	end
         | 
| 12 33 |  | 
| 13 34 | 
             
            	it "should contain one rootpage" do
         | 
    
        metadata
    CHANGED
    
    | @@ -2,7 +2,7 @@ | |
| 2 2 | 
             
            name: alchemy_cms
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version 
         | 
| 4 4 | 
             
              prerelease: 
         | 
| 5 | 
            -
              version:  | 
| 5 | 
            +
              version: 2.0.1
         | 
| 6 6 | 
             
            platform: ruby
         | 
| 7 7 | 
             
            authors: 
         | 
| 8 8 | 
             
            - Thomas von Deyen
         | 
| @@ -12,7 +12,7 @@ autorequire: | |
| 12 12 | 
             
            bindir: bin
         | 
| 13 13 | 
             
            cert_chain: []
         | 
| 14 14 |  | 
| 15 | 
            -
            date: 2011-11- | 
| 15 | 
            +
            date: 2011-11-03 00:00:00 Z
         | 
| 16 16 | 
             
            dependencies: 
         | 
| 17 17 | 
             
            - !ruby/object:Gem::Dependency 
         | 
| 18 18 | 
             
              name: rails
         |