fullstack-cms 0.2.4 → 0.2.5

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/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.4
1
+ 0.2.5
@@ -1,16 +1,20 @@
1
1
  module MenusHelper
2
2
 
3
- def find_or_create_menu(uid)
4
- Menu.find_or_create_by_uid(uid, :name => "#{uid}".gsub("-", "_").humanize)
3
+ def find_or_create_menu(uid, locale = nil)
4
+ if locale
5
+ Menu.find_or_create_by_uid_and_locale(uid, locale.to_s, :name => "#{uid}".gsub("-", "_").humanize)
6
+ else
7
+ Menu.find_or_create_by_uid(uid, :name => "#{uid}".gsub("-", "_").humanize)
8
+ end
5
9
  end
6
10
 
7
- def nav_items_for(uid)
8
- menu = find_or_create_menu(uid)
11
+ def nav_items_for(uid, locale = nil)
12
+ menu = find_or_create_menu(uid, locale)
9
13
  html = ""
10
14
 
11
15
  menu.links.each do |link|
12
16
  unless block_given?
13
- html << nav_item(link.label, link_url(link))
17
+ html << nav_item(link.label, link_url(link), :rel => link.nofollow ? "nofollow" : nil)
14
18
  else
15
19
  html << yield(link)
16
20
  end
@@ -25,25 +29,7 @@ module MenusHelper
25
29
 
26
30
 
27
31
  def link_url(link)
28
- url = link.url
29
- if url.blank?
30
- "#"
31
-
32
- elsif url.starts_with?("content://")
33
- klass_name, id = url.gsub("content://", "").split("#")
34
- klass = klass_name.constantize
35
- resource = klass.find(id)
36
- if resource
37
- page_path_for(resource)
38
- else
39
- "#"
40
- end
41
-
42
- else
43
- url
44
-
45
- end
46
-
32
+ link.url.present? ? CGI::escape(link.url) : (link.linked ? page_path_for(link.linked) : "#")
47
33
  end
48
34
 
49
35
 
@@ -23,7 +23,7 @@ module PagesHelper
23
23
  end
24
24
 
25
25
  def page_path_for(resource_or_page)
26
- page = resource_or_page.is_a?(Page) ? resource_or_page : Page.find_by_resource_type(resource_or_page.class.name.underscore)
26
+ page = resource_or_page.is_a?(Page) ? resource_or_page : page_by_resource(resource_or_page)
27
27
  path = page.try(:path)
28
28
  if path.blank?
29
29
  "#not-found"
@@ -50,4 +50,18 @@ module PagesHelper
50
50
  request.path == "/"
51
51
  end
52
52
 
53
+
54
+ private
55
+ def page_by_resource(resource)
56
+ resource_type = resource.class.name.underscore
57
+
58
+ if Fullstack::Cms.config.localize
59
+ locale = resource.respond_to?(:locale) ? resource.send(:locale) : I18n.locale.to_s
60
+ Page.find_by_resource_type_and_locale(resource_type, locale)
61
+
62
+ else
63
+ Page.find_by_resource_type(resource_type)
64
+ end
65
+ end
66
+
53
67
  end
@@ -1,6 +1,6 @@
1
1
  class Linkable
2
2
 
3
- AJAX_COMBOBOX_MIN = 5
3
+ AJAX_COMBOBOX_MIN = 100
4
4
 
5
5
  class << self
6
6
 
data/app/models/menu.rb CHANGED
@@ -1,9 +1,9 @@
1
1
  class Menu < ActiveRecord::Base
2
-
3
- field :uid, :string
4
- field :name, :string
2
+ include Uid
3
+ include Localized if Fullstack::Cms.config.localize
5
4
 
6
- attr_accessible :uid, :name, :links_attributes
5
+ field :name, :string
6
+
7
7
  has_many :links, :as => :link_owner, :dependent => :delete_all, :order=>'position ASC'
8
8
  accepts_nested_attributes_for :links, :allow_destroy => true
9
9
 
@@ -11,7 +11,6 @@ class Menu < ActiveRecord::Base
11
11
  validates_presence_of :uid
12
12
 
13
13
  timestamps
14
-
15
14
  end
16
15
 
17
16
 
data/app/models/page.rb CHANGED
@@ -1,20 +1,14 @@
1
1
  class Page < ActiveRecord::Base
2
2
  include Content
3
3
  include Nestable
4
+ include Localized if Fullstack::Cms.config.localize
5
+ include Uid
4
6
 
5
- if Fullstack::Cms.config.localize_pages
6
-
7
- include Localized
8
- index [:uid, :locale]
9
-
10
- end
11
-
12
- validates_presence_of :uid, :name
7
+ validates_presence_of :name
13
8
 
14
9
  field :name
15
10
  field :uid
16
11
  field :scope
17
- index :uid, :unique => true
18
12
 
19
13
  field :path
20
14
  field :resource_type
@@ -48,7 +48,11 @@ module Pageable
48
48
  module ClassMethods
49
49
  def page(name, path, options = {}, &block)
50
50
 
51
- page_definition_options = options.clone
51
+ # =================
52
+ # = Parse options =
53
+ # =================
54
+
55
+ localize = options.delete(:localize) == false ? false : Fullstack::Cms.config.localize
52
56
 
53
57
  this_controller_name = "#{self.name.underscore}".gsub("_controller", "")
54
58
  uid = "#{this_controller_name}##{name}"
@@ -66,37 +70,32 @@ module Pageable
66
70
  i18n_scope = "pages.#{self.name.underscore.split('/').last}##{name}"
67
71
  title = options.delete(:title) || I18n.t("#{i18n_scope}.title", :default => "#{name}".humanize)
68
72
 
73
+ # ======================
74
+ # = Create page record =
75
+ # ======================
76
+
69
77
  if Page.table_exists?
70
-
71
- page = unless Fullstack::Cms.config.localize_pages
72
- Page.find_or_create_by_uid(uid, :title => title, :name => name)
78
+ if localize
79
+ I18n.available_locales.each do |locale|
80
+ _page!(uid, _localize_path(path, locale), name, title, parent_uid, resource_type, locale.to_s)
81
+ end
73
82
  else
74
- Page.find_or_create_by_uid_and_locale(uid, I18n.locale || Fullstack::Cms.config.default_locale, :title => title, :name => name)
75
- end
76
-
77
- if parent_uid
78
- parent = unless Fullstack::Cms.config.localize_pages
79
- Page.find_by_uid(parent_uid)
80
- else
81
- Page.find_by_uid_and_locale(parent_uid, I18n.locale || Fullstack::Cms.config.default_locale)
82
- end
83
-
84
- page.move_to_child_of(parent) unless page.parent == parent
85
- end
86
-
87
- if resource_type
88
- page.update_attribute(:resource_type, resource_type) unless page.resource_type == resource_type
83
+ _page!(uid, path, name, title, parent_uid, resource_type)
89
84
  end
90
-
91
- if page.path != path
92
- page.update_attribute(:path, path)
85
+ end
86
+
87
+ # ===================
88
+ # = Map page routes =
89
+ # ===================
90
+
91
+ if localize
92
+ I18n.available_locales.each do |locale|
93
+ map(name, _localize_path(path, locale), options.reverse_merge({:locale => locale.to_s, :as => "#{name}_#{locale}"}), &block)
93
94
  end
94
-
95
+ else
96
+ map(name, path, options, &block)
95
97
  end
96
98
 
97
- map(name, path, options = {}, &block)
98
- @pages ||= ActiveSupport::HashWithIndifferentAccess.new
99
- @pages[name] = page
100
99
  end
101
100
 
102
101
  def page_names
@@ -107,6 +106,58 @@ module Pageable
107
106
  @pages ||= ActiveSupport::HashWithIndifferentAccess.new
108
107
  end
109
108
 
109
+
110
+ private
111
+
112
+ def _localize_path(path, locale)
113
+ path_segments = path.split("/")
114
+
115
+ path_segments.reject!(&:blank?)
116
+ path_segments.map! {|s|
117
+ if s =~ /^:/
118
+ s
119
+ else
120
+ I18n.t(s, :scope => "routing", :default => s, :locale => locale)
121
+ end
122
+ }
123
+
124
+ path_segments.unshift(locale.to_s)
125
+ "/" + path_segments.join("/")
126
+ end
127
+
128
+
129
+ def _page!(uid, path, name, title, parent_uid, resource_type, locale = nil)
130
+ # puts "_page!(#{[uid, path, name, title, parent_uid, resource_type, locale].map(&:inspect).join(",")})"
131
+
132
+ _page = if locale.nil?
133
+ Page.find_or_create_by_uid(uid, :title => title, :name => name)
134
+ else
135
+ Page.find_or_create_by_uid_and_locale(uid, locale.to_s, :title => title, :name => name)
136
+ end
137
+
138
+ if parent_uid
139
+ parent = if locale.nil?
140
+ Page.find_by_uid(parent_uid)
141
+ else
142
+ Page.find_by_uid_and_locale(parent_uid, locale.to_s)
143
+ end
144
+
145
+ _page.move_to_child_of(parent) unless _page.parent == parent
146
+ end
147
+
148
+ if resource_type
149
+ _page.update_attribute(:resource_type, resource_type) unless _page.resource_type == resource_type
150
+ end
151
+
152
+ if _page.path != path
153
+ _page.update_attribute(:path, path)
154
+ end
155
+
156
+ @pages ||= ActiveSupport::HashWithIndifferentAccess.new
157
+ @pages[name] = _page
158
+
159
+ end
160
+
110
161
  end
111
162
 
112
163
  def load_current_page
data/app/models/uid.rb ADDED
@@ -0,0 +1,22 @@
1
+ module Uid
2
+ extend ActiveSupport::Concern
3
+
4
+ included do
5
+
6
+ field :uid, :string
7
+ validates_presence_of :uid
8
+
9
+ unless Fullstack::Cms.config.localize
10
+
11
+ index :uid, :unique => true
12
+ scope :uid, lambda {|uid| where(:uid => uid).first}
13
+
14
+ else
15
+
16
+ index [:uid, :locale], :unique => true
17
+ scope :uid, lambda {|uid| where(:uid => uid, :locale => (I18n.locale || Fullstack::Cms::config.default_locale).to_s).first}
18
+
19
+ end
20
+ end
21
+
22
+ end
@@ -6,8 +6,4 @@ $("#<%= @target %>").find("select[data-remote]").each ->
6
6
  data
7
7
  <% else %>
8
8
  $("select:not([data-remote]):not(.datetime-selector)").chosen()
9
- <% end %>
10
-
11
- # localize messages and labels
12
- # get rid of the black screen after window closing
13
- # double add problem
9
+ <% end %>
@@ -22,7 +22,7 @@
22
22
  <div class="linked-id-field-placeholder" id="linked_id_field_placeholder_<%= @linked_id_field_placeholder_uid = 1 + (@linked_id_field_placeholder_uid || 0)
23
23
  %>" data-current-id="<%= f.object.linked_id %>" data-current-type="<%= f.object.linked_type %>">
24
24
  </div>
25
- <%= f.input :url, :label => false, :input_html => {:style => "display: none", :class => "linked-url-field"} %>
25
+ <%= f.input :url, :label => false, :input_html => {:style => ("display: none" if f.object.persisted?), :class => "linked-url-field"} %>
26
26
  <% end %>
27
27
 
28
28
 
@@ -65,9 +65,11 @@
65
65
  $(".linked-fields").each ->
66
66
  linked_fields = $(@)
67
67
  update_linked_fields(linked_fields)
68
- linked_fields.find(".linked-type-field").live "change", ->
69
- update_linked_fields(linked_fields)
70
-
68
+
69
+ $(".linked-type-field").live "change", ->
70
+ update_linked_fields($(@).closest(".linked-fields"))
71
+
72
+
71
73
  <% end %>
72
74
  <% end %>
73
75
  <% end -%>
@@ -1,7 +1,17 @@
1
- <ul class="nav">
2
- <% Page.roots.each do |root| %>
3
- <% Page.each_with_level(root.self_and_descendants) do |page, level| %>
4
- <%= nav_item page.name, edit_admin_page_path(page), :icon => (page.root? ? "home" : "file"), :style => "line-height: 36px; padding-left:#{20 * level}px" %>
1
+ <%= tabs do |t| %>
2
+ <% I18n.available_locales.each do |locale| %>
3
+ <%= t.pane t("locale_names.#{locale}", :default => "#{locale}".humanize) do %>
4
+
5
+
6
+ <ul class="nav">
7
+ <% Page.where(:locale => "#{locale}").roots.each do |root| %>
8
+ <% Page.each_with_level(root.self_and_descendants) do |page, level| %>
9
+ <%= nav_item page.name, edit_admin_page_path(page), :icon => (page.root? ? "home" : "file"), :style => "line-height: 36px; padding-left:#{20 * level}px" %>
10
+ <% end %>
11
+ <% end %>
12
+ </ul>
13
+
14
+
15
+ <% end %>
5
16
  <% end %>
6
17
  <% end %>
7
- </ul>
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "fullstack-cms"
8
- s.version = "0.2.4"
8
+ s.version = "0.2.5"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["mcasimir"]
12
- s.date = "2012-09-01"
12
+ s.date = "2012-09-03"
13
13
  s.description = "CMS system built on fullstack"
14
14
  s.email = "maurizio.cas@gmail.com"
15
15
  s.extra_rdoc_files = [
@@ -51,6 +51,7 @@ Gem::Specification.new do |s|
51
51
  "app/models/text.rb",
52
52
  "app/models/text_page_part.rb",
53
53
  "app/models/text_with_title_page_part.rb",
54
+ "app/models/uid.rb",
54
55
  "app/views/admin/base/_fields.html.erb",
55
56
  "app/views/admin/base/_form.html.erb",
56
57
  "app/views/admin/base/_simple_form.html.erb",
@@ -7,7 +7,8 @@ module Fullstack
7
7
  @config ||= OpenStruct.new
8
8
  @config.resources ||= []
9
9
  @config.linkables ||= []
10
- @config.localize_pages = @config.localize_pages.nil? ? true : @config.localize_pages
10
+ @config.localize = @config.localize.nil? ? true : @config.localize
11
+ @config.localize_routes = @config.localize_routes.nil? ? true : @config.localize_routes
11
12
  @config.default_locale ||= "#{I18n.default_locale}" || "en"
12
13
  @config
13
14
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fullstack-cms
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.2.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-09-01 00:00:00.000000000 Z
12
+ date: 2012-09-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: fullstack-admin
@@ -245,6 +245,7 @@ files:
245
245
  - app/models/text.rb
246
246
  - app/models/text_page_part.rb
247
247
  - app/models/text_with_title_page_part.rb
248
+ - app/models/uid.rb
248
249
  - app/views/admin/base/_fields.html.erb
249
250
  - app/views/admin/base/_form.html.erb
250
251
  - app/views/admin/base/_simple_form.html.erb
@@ -329,7 +330,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
329
330
  version: '0'
330
331
  segments:
331
332
  - 0
332
- hash: -3826717670645353415
333
+ hash: 293567694538273846
333
334
  required_rubygems_version: !ruby/object:Gem::Requirement
334
335
  none: false
335
336
  requirements: