first attempt to refactor the content types
This commit is contained in:
parent
e500a1985b
commit
592a110fe5
@ -34,8 +34,8 @@ class Locomotive.Views.ApplicationView extends Backbone.View
|
|||||||
timer = null
|
timer = null
|
||||||
link = $(@)
|
link = $(@)
|
||||||
(popup = link.find('.popup')).removeClass('popup').addClass('submenu-popup').css(
|
(popup = link.find('.popup')).removeClass('popup').addClass('submenu-popup').css(
|
||||||
top: link.offset().top + link.height() - 2
|
top: link.offset().top + link.height() - 2
|
||||||
left: link.offset().left - parseInt(popup.css('padding-left'))
|
left: link.offset().left - parseInt(popup.css('padding-left'))
|
||||||
).bind('show', ->
|
).bind('show', ->
|
||||||
link.find('a').addClass('hover') & popup.show()
|
link.find('a').addClass('hover') & popup.show()
|
||||||
).bind('hide', ->
|
).bind('hide', ->
|
||||||
|
@ -1,89 +1,89 @@
|
|||||||
module Locomotive::ContentTypesHelper
|
module Locomotive::ContentTypesHelper
|
||||||
|
|
||||||
MAX_DISPLAYED_CONTENTS = 4
|
# MAX_DISPLAYED_CONTENTS = 4
|
||||||
|
#
|
||||||
def fetch_content_types
|
# def fetch_content_types
|
||||||
return @content_types if @content_types
|
# return @content_types if @content_types
|
||||||
|
#
|
||||||
@content_types = current_site.content_types.ordered.
|
# @content_types = current_site.content_types.ordered.
|
||||||
limit(:contents => Locomotive.config.lastest_items_nb).
|
# limit(:contents => Locomotive.config.lastest_items_nb).
|
||||||
only(:site_id, :name, :slug, :highlighted_field_name, :contents_custom_fields_version, :order_by, :serialized_item_template, :raw_item_template).to_a
|
# only(:site_id, :name, :slug, :highlighted_field_name, :contents_custom_fields_version, :order_by, :serialized_item_template, :raw_item_template).to_a
|
||||||
|
#
|
||||||
if @content_type && @content_type.persisted? && @content_types.index(@content_type) >= MAX_DISPLAYED_CONTENTS
|
# if @content_type && @content_type.persisted? && @content_types.index(@content_type) >= MAX_DISPLAYED_CONTENTS
|
||||||
@content_types.delete(@content_type)
|
# @content_types.delete(@content_type)
|
||||||
@content_types.insert(0, @content_type)
|
# @content_types.insert(0, @content_type)
|
||||||
end
|
# end
|
||||||
|
#
|
||||||
# be sure, we've got the custom klass up-to-date, otherwise it will fail miserably
|
# # be sure, we've got the custom klass up-to-date, otherwise it will fail miserably
|
||||||
@content_types.each do |content_type|
|
# @content_types.each do |content_type|
|
||||||
if content_type.content_klass_out_of_date?
|
# if content_type.content_klass_out_of_date?
|
||||||
content_type.reload
|
# content_type.reload
|
||||||
content_type.invalidate_content_klass
|
# content_type.invalidate_content_klass
|
||||||
end
|
# end
|
||||||
end
|
# end
|
||||||
|
#
|
||||||
@content_types
|
# @content_types
|
||||||
end
|
# end
|
||||||
|
#
|
||||||
def each_content_type_menu_item(which = :first, &block)
|
# def each_content_type_menu_item(which = :first, &block)
|
||||||
types = fetch_content_types
|
# types = fetch_content_types
|
||||||
sliced = []
|
# sliced = []
|
||||||
|
#
|
||||||
if which == :first
|
# if which == :first
|
||||||
sliced = types[0..MAX_DISPLAYED_CONTENTS - 1]
|
# sliced = types[0..MAX_DISPLAYED_CONTENTS - 1]
|
||||||
elsif types.size > MAX_DISPLAYED_CONTENTS
|
# elsif types.size > MAX_DISPLAYED_CONTENTS
|
||||||
sliced = types[MAX_DISPLAYED_CONTENTS, types.size - MAX_DISPLAYED_CONTENTS]
|
# sliced = types[MAX_DISPLAYED_CONTENTS, types.size - MAX_DISPLAYED_CONTENTS]
|
||||||
end
|
# end
|
||||||
|
#
|
||||||
return [] if sliced.empty?
|
# return [] if sliced.empty?
|
||||||
|
#
|
||||||
sliced.each do |content_type|
|
# sliced.each do |content_type|
|
||||||
next if content_type.new_record?
|
# next if content_type.new_record?
|
||||||
item_on = (content_type.slug == @content_type.slug) rescue nil
|
# item_on = (content_type.slug == @content_type.slug) rescue nil
|
||||||
|
#
|
||||||
label = truncate(content_type.name, :length => 15)
|
# label = truncate(content_type.name, :length => 15)
|
||||||
url = contents_url(content_type.slug)
|
# url = contents_url(content_type.slug)
|
||||||
css = @content_type && content_type.slug == @content_type.slug ? 'on' : ''
|
# css = @content_type && content_type.slug == @content_type.slug ? 'on' : ''
|
||||||
|
#
|
||||||
html = submenu_entry(label, url, :i18n => false, :css => css) do
|
# html = submenu_entry(label, url, :i18n => false, :css => css) do
|
||||||
yield(content_type)
|
# yield(content_type)
|
||||||
end
|
# end
|
||||||
|
#
|
||||||
haml_concat(html)
|
# haml_concat(html)
|
||||||
end
|
# end
|
||||||
end
|
# end
|
||||||
|
#
|
||||||
def other_content_types(&block)
|
# def other_content_types(&block)
|
||||||
types = fetch_content_types
|
# types = fetch_content_types
|
||||||
|
#
|
||||||
if types.size > MAX_DISPLAYED_CONTENTS
|
# if types.size > MAX_DISPLAYED_CONTENTS
|
||||||
sliced = types[MAX_DISPLAYED_CONTENTS, types.size - MAX_DISPLAYED_CONTENTS]
|
# sliced = types[MAX_DISPLAYED_CONTENTS, types.size - MAX_DISPLAYED_CONTENTS]
|
||||||
|
#
|
||||||
html = submenu_entry('...', '#', :i18n => false) do
|
# html = submenu_entry('...', '#', :i18n => false) do
|
||||||
yield(sliced)
|
# yield(sliced)
|
||||||
end
|
# end
|
||||||
|
#
|
||||||
haml_concat(html)
|
# haml_concat(html)
|
||||||
end
|
# end
|
||||||
end
|
# end
|
||||||
|
#
|
||||||
def content_label_for(content)
|
# def content_label_for(content)
|
||||||
if content._parent.raw_item_template.blank?
|
# if content._parent.raw_item_template.blank?
|
||||||
content._label # default one
|
# content._label # default one
|
||||||
else
|
# else
|
||||||
assigns = {
|
# assigns = {
|
||||||
'site' => current_site,
|
# 'site' => current_site,
|
||||||
'content' => content.to_liquid
|
# 'content' => content.to_liquid
|
||||||
}
|
# }
|
||||||
|
#
|
||||||
registers = {
|
# registers = {
|
||||||
:controller => self,
|
# :controller => self,
|
||||||
:site => current_site,
|
# :site => current_site,
|
||||||
:current_locomotive_account => current_locomotive_account
|
# :current_locomotive_account => current_locomotive_account
|
||||||
}
|
# }
|
||||||
|
#
|
||||||
preserve(content._parent.item_template.render(::Liquid::Context.new({}, assigns, registers)))
|
# preserve(content._parent.item_template.render(::Liquid::Context.new({}, assigns, registers)))
|
||||||
end
|
# end
|
||||||
end
|
# end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
@ -17,7 +17,7 @@ module Locomotive
|
|||||||
mount_uploader :source, ContentAssetUploader, :mount_on => :source_filename
|
mount_uploader :source, ContentAssetUploader, :mount_on => :source_filename
|
||||||
|
|
||||||
## associations ##
|
## associations ##
|
||||||
referenced_in :site, :class_name => 'Locomotive::Site'
|
belongs_to :site, :class_name => 'Locomotive::Site'
|
||||||
|
|
||||||
## validations ##
|
## validations ##
|
||||||
validates_presence_of :source
|
validates_presence_of :source
|
||||||
|
@ -9,38 +9,43 @@ module Locomotive
|
|||||||
include Extensions::Shared::Seo
|
include Extensions::Shared::Seo
|
||||||
|
|
||||||
## fields (dynamic fields) ##
|
## fields (dynamic fields) ##
|
||||||
|
field :_highlighted_field
|
||||||
field :_slug
|
field :_slug
|
||||||
field :_position_in_list, :type => Integer, :default => 0
|
field :_position_in_list, :type => Integer, :default => 0
|
||||||
field :_visible, :type => Boolean, :default => true
|
field :_visible, :type => Boolean, :default => true
|
||||||
|
|
||||||
## validations ##
|
## validations ##
|
||||||
validate :require_highlighted_field
|
validate :require_highlighted_field
|
||||||
validate :validate_uniqueness_of_slug
|
# validate :validate_uniqueness_of_slug
|
||||||
validates_presence_of :_slug
|
validates_uniqueness_of :_slug, :scope => [:content_type_id]
|
||||||
|
validates_presence_of :_slug
|
||||||
|
|
||||||
## associations ##
|
## associations ##
|
||||||
embedded_in :content_type, :class_name => 'Locomotive::ContentType', :inverse_of => :contents
|
belongs_to :site
|
||||||
|
belongs_to :content_type, :class_name => 'Locomotive::ContentType', :inverse_of => :contents
|
||||||
|
# embedded_in :content_type, :class_name => 'Locomotive::ContentType', :inverse_of => :contents
|
||||||
|
|
||||||
## callbacks ##
|
## callbacks ##
|
||||||
before_validation :set_slug
|
before_validation :set_slug
|
||||||
before_save :set_visibility
|
before_save :set_visibility
|
||||||
before_create :add_to_list_bottom
|
before_create :add_to_list_bottom
|
||||||
after_create :send_notifications
|
after_create :send_notifications
|
||||||
|
|
||||||
## named scopes ##
|
## named scopes ##
|
||||||
|
scope :visible, :where => { :_visible => true }
|
||||||
scope :latest_updated, :order_by => :updated_at.desc, :limit => Locomotive.config.lastest_items_nb
|
scope :latest_updated, :order_by => :updated_at.desc, :limit => Locomotive.config.lastest_items_nb
|
||||||
|
|
||||||
## methods ##
|
## methods ##
|
||||||
|
|
||||||
delegate :site, :to => :content_type
|
# delegate :site, :to => :content_type
|
||||||
|
|
||||||
alias :visible? :_visible?
|
alias :visible? :_visible?
|
||||||
alias :_permalink :_slug
|
alias :_permalink :_slug
|
||||||
alias :_permalink= :_slug=
|
alias :_permalink= :_slug=
|
||||||
|
|
||||||
def site_id # needed by the uploader of custom fields
|
# def site_id # needed by the uploader of custom fields
|
||||||
self.content_type.site_id
|
# self.content_type.site_id
|
||||||
end
|
# end
|
||||||
|
|
||||||
def highlighted_field_value
|
def highlighted_field_value
|
||||||
self.send(self.content_type.highlighted_field_name)
|
self.send(self.content_type.highlighted_field_name)
|
||||||
@ -52,25 +57,25 @@ module Locomotive
|
|||||||
self._visible || self._visible.nil?
|
self._visible || self._visible.nil?
|
||||||
end
|
end
|
||||||
|
|
||||||
def next
|
def next # TODO
|
||||||
content_type.contents.where(:_position_in_list => _position_in_list + 1).first()
|
# content_type.contents.where(:_position_in_list => _position_in_list + 1).first()
|
||||||
end
|
end
|
||||||
|
|
||||||
def previous
|
def previous # TODO
|
||||||
content_type.contents.where(:_position_in_list => _position_in_list - 1).first()
|
# content_type.contents.where(:_position_in_list => _position_in_list - 1).first()
|
||||||
end
|
end
|
||||||
|
|
||||||
def errors_to_hash
|
# def errors_to_hash # TODO
|
||||||
Hash.new.replace(self.errors)
|
# Hash.new.replace(self.errors)
|
||||||
end
|
# end
|
||||||
|
|
||||||
def reload_parent!
|
# def reload_parent! # TODO
|
||||||
self.class.reload_parent!
|
# self.class.reload_parent!
|
||||||
end
|
# end
|
||||||
|
#
|
||||||
def self.reload_parent!
|
# def self.reload_parent! # TODO
|
||||||
self._parent = self._parent.reload
|
# self._parent = self._parent.reload
|
||||||
end
|
# end
|
||||||
|
|
||||||
def to_liquid
|
def to_liquid
|
||||||
Locomotive::Liquid::Drops::Content.new(self)
|
Locomotive::Liquid::Drops::Content.new(self)
|
||||||
@ -84,8 +89,14 @@ module Locomotive
|
|||||||
end
|
end
|
||||||
|
|
||||||
def set_visibility
|
def set_visibility
|
||||||
field = self.content_type.contents_custom_fields.detect { |f| %w{visible active}.include?(f._alias) }
|
%w(visible active).map(&:to_sym).each do |_alias|
|
||||||
self._visible = self.send(field._name) rescue true
|
if self.methods.include?(_alias)
|
||||||
|
self._visible = self.send(_alias)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
# field = self.content_type.contents_custom_fields.detect { |f| %w{visible active}.include?(f._alias) }
|
||||||
|
# self._visible = self.send(field._name) rescue true
|
||||||
end
|
end
|
||||||
|
|
||||||
def add_to_list_bottom
|
def add_to_list_bottom
|
||||||
@ -99,11 +110,11 @@ module Locomotive
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def validate_uniqueness_of_slug
|
# def validate_uniqueness_of_slug
|
||||||
if self._parent.contents.any? { |c| c._id != self._id && c._slug == self._slug }
|
# if self._parent.contents.any? { |c| c._id != self._id && c._slug == self._slug }
|
||||||
self.errors.add(:_slug, :taken)
|
# self.errors.add(:_slug, :taken)
|
||||||
end
|
# end
|
||||||
end
|
# end
|
||||||
|
|
||||||
def highlighted_field_alias
|
def highlighted_field_alias
|
||||||
self.content_type.highlighted_field._alias.to_sym
|
self.content_type.highlighted_field._alias.to_sym
|
||||||
|
@ -18,12 +18,13 @@ module Locomotive
|
|||||||
field :api_accounts, :type => Array
|
field :api_accounts, :type => Array
|
||||||
|
|
||||||
## associations ##
|
## associations ##
|
||||||
referenced_in :site, :class_name => 'Locomotive::Site'
|
belongs_to :site, :class_name => 'Locomotive::Site'
|
||||||
embeds_many :contents, :class_name => 'Locomotive::ContentInstance', :validate => false do
|
has_many :contents
|
||||||
def visible
|
# embeds_many :contents, :class_name => 'Locomotive::ContentInstance', :validate => false do
|
||||||
@target.find_all { |c| c.visible? }
|
# def visible
|
||||||
end
|
# @target.find_all { |c| c.visible? }
|
||||||
end
|
# end
|
||||||
|
# end
|
||||||
|
|
||||||
## named scopes ##
|
## named scopes ##
|
||||||
scope :ordered, :order_by => :updated_at.desc
|
scope :ordered, :order_by => :updated_at.desc
|
||||||
@ -135,13 +136,13 @@ module Locomotive
|
|||||||
self.slug.permalink! if self.slug.present?
|
self.slug.permalink! if self.slug.present?
|
||||||
end
|
end
|
||||||
|
|
||||||
def remove_uploaded_files # callbacks are not called on each content so we do it manually
|
# def remove_uploaded_files # callbacks are not called on each content so we do it manually
|
||||||
self.contents.each do |content|
|
# self.contents.each do |content|
|
||||||
self.contents_custom_fields.each do |field|
|
# self.contents_custom_fields.each do |field|
|
||||||
content.send(:"remove_#{field._name}!") if field.kind == 'file'
|
# content.send(:"remove_#{field._name}!") if field.kind == 'file'
|
||||||
end
|
# end
|
||||||
end
|
# end
|
||||||
end
|
# end
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
4
doc/TODO
4
doc/TODO
@ -31,7 +31,7 @@ x edit my site
|
|||||||
x upload many files at once
|
x upload many files at once
|
||||||
x import/export
|
x import/export
|
||||||
x export
|
x export
|
||||||
- site picker
|
x site picker
|
||||||
- content types
|
- content types
|
||||||
- change in main menu
|
- change in main menu
|
||||||
- manage custom_fields
|
- manage custom_fields
|
||||||
@ -42,7 +42,7 @@ x edit my site
|
|||||||
- list
|
- list
|
||||||
- crud
|
- crud
|
||||||
|
|
||||||
- disallow to click twice on the submit form button
|
- disallow to click twice on the submit form button (spinner ?)
|
||||||
- message to notify people if their browser is too old
|
- message to notify people if their browser is too old
|
||||||
- install a site by default at the first installation (without asking)
|
- install a site by default at the first installation (without asking)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user